speed up unicode normalization quick check

Started by John Naylorover 5 years ago30 messages
#1John Naylor
john.naylor@2ndquadrant.com
3 attachment(s)

Hi,

Attached is a patch to use perfect hashing to speed up Unicode
normalization quick check.

0001 changes the set of multipliers attempted when generating the hash
function. The set in HEAD works for the current set of NFC codepoints,
but not for the other types. Also, the updated multipliers now all
compile to shift-and-add on most platform/compiler combinations
available on godbolt.org (earlier experiments found in [1]/messages/by-id/CACPNZCuVTiLhxAzXp9uCeHGUyHMa59h6_pmP+_W-SzXG0UyY9w@mail.gmail.com). The
existing keyword lists are fine with the new set, and don't seem to be
very picky in general. As a test, it also successfully finds a
function for the OS "words" file, the "D" sets of codepoints, and for
sets of the first n built-in OIDs, where n > 5.

0002 builds on top of the existing normprops infrastructure to use a
hash function for NFC quick check. Below are typical numbers in a
non-assert build:

select count(*) from (select md5(i::text) as t from
generate_series(1,100000) as i) s where t is nfc normalized;

HEAD 411ms 413ms 409ms
patch 296ms 297ms 299ms

The addition of "const" was to silence a compiler warning. Also, I
changed the formatting of the output file slightly to match pgindent.

0003 uses hashing for NFKC and removes binary search. This is split
out for readability. I gather NFKC is a less common use case, so this
could technically be left out. Since this set is larger, the
performance gains are a bit larger as well, at the cost of 19kB of
binary space:

HEAD 439ms 440ms 442ms
patch 299ms 301ms 301ms

I'll add this to the July commitfest.

[1]: /messages/by-id/CACPNZCuVTiLhxAzXp9uCeHGUyHMa59h6_pmP+_W-SzXG0UyY9w@mail.gmail.com

--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

v1-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patchapplication/octet-stream; name=v1-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patchDownload
From 195ad16c62e680b4bb3835991a7b7bd6ddbf7afc Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Tue, 12 May 2020 17:45:49 +0800
Subject: [PATCH v1 1/3] Tweak the set of candidate multipliers for generating
 perfect hash functions

The previous set of multipliers were inadequate for large sets of short
keys. A future commit will have that as a use case, so increase the
maximum size of multipliers attempted.

Also make sure all multipliers compile to shift-and-add instructions
on most platforms. On x86-64 this was confirmed as far back as gcc 4.1
and clang 3.8.
---
 src/tools/PerfectHash.pm | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index 74fb1f2ef6..d6841589a3 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -81,13 +81,13 @@ sub generate_hash_function
 	# to calculate via shift-and-add, so don't change them without care.
 	# (Commonly, random seeds are tried, but we want reproducible results
 	# from this program so we don't do that.)
-	my $hash_mult1 = 31;
+	my $hash_mult1 = 257;
 	my $hash_mult2;
 	my $hash_seed1;
 	my $hash_seed2;
 	my @subresult;
   FIND_PARAMS:
-	foreach (127, 257, 521, 1033, 2053)
+	foreach (17, 31, 127, 8191)
 	{
 		$hash_mult2 = $_;    # "foreach $hash_mult2" doesn't work
 		for ($hash_seed1 = 0; $hash_seed1 < 10; $hash_seed1++)
-- 
2.22.0

v1-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patchapplication/octet-stream; name=v1-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patchDownload
From 8aea5020dc2bb472876cab6c468908b6c45e854d Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Fri, 15 May 2020 11:13:15 +0800
Subject: [PATCH v1 2/3] Use perfect hashing for NFC Unicode normalization
 quick check

This makes the normalization check nearly 40% faster, while only adding 5kB
to the binary size. The hash lookup reuses the existing array of bitfields
used for binary search to get the quick check property and is generated as
part of make update-unicode. Since the hash function is part of the
repository, format it like pgindent would.

NFKC quick check still uses binary search.
---
 .../generate-unicode_normprops_table.pl       |  38 +-
 src/common/unicode_norm.c                     |  36 +-
 src/include/common/unicode_normprops_table.h  | 344 ++++++++++++++++++
 src/tools/PerfectHash.pm                      |   2 +-
 4 files changed, 412 insertions(+), 8 deletions(-)

diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index e8e5097c09..7f00cb0ae4 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -9,6 +9,10 @@
 use strict;
 use warnings;
 
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
 my %data;
 
 print
@@ -17,6 +21,8 @@ print
 print <<EOS;
 #include "common/unicode_norm.h"
 
+typedef int (*qc_hash_func) (const void *key);
+
 /*
  * We use a bit field here to save space.
  */
@@ -24,7 +30,14 @@ typedef struct
 {
 	unsigned int codepoint:21;
 	signed int	quickcheck:4;	/* really UnicodeNormalizationQC */
-}			pg_unicode_normprops;
+} pg_unicode_normprops;
+
+typedef struct
+{
+	const pg_unicode_normprops *normprops;
+	qc_hash_func hash;
+	int			num_normprops;
+} unicode_norm_info;
 EOS
 
 foreach my $line (<ARGV>)
@@ -66,6 +79,7 @@ foreach my $prop (sort keys %data)
 	  "static const pg_unicode_normprops UnicodeNormProps_${prop}[] = {\n";
 
 	my %subdata = %{ $data{$prop} };
+	my @cp_packed;
 	foreach my $cp (sort { $a <=> $b } keys %subdata)
 	{
 		my $qc;
@@ -82,7 +96,29 @@ foreach my $prop (sort keys %data)
 			die;
 		}
 		printf "\t{0x%04X, %s},\n", $cp, $qc;
+
+		# Save the bytes as a string in network order.
+		push @cp_packed, pack('N', $cp);
 	}
 
 	print "};\n";
+
+	# Emit the definition of the hash function.
+
+	# To save space, skip building the function for the larger "C" form.
+	next if $prop eq "NFKC_QC";
+
+	my $funcname = $prop . '_hash_func';
+
+	my $f = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
+		fixed_key_length => 4);
+	print "\nstatic $f\n";
+
+	# Emit the struct that wraps the hash lookup info into one variable.
+	printf "static const unicode_norm_info ";
+	printf "UnicodeNormInfo_%s = {\n", $prop;
+	printf "\tUnicodeNormProps_%s,\n", $prop;
+	printf "\t%s,\n",                  $funcname;
+	printf "\t%d\n",                   scalar @cp_packed;
+	printf "};\n";
 }
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index ab5ce59345..1714837e64 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -476,6 +476,34 @@ qc_compare(const void *p1, const void *p2)
 	return (v1 - v2);
 }
 
+static const pg_unicode_normprops *
+qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
+{
+	int			h;
+	uint32		hashkey;
+
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = htonl(ch);
+	h = norminfo->hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= norminfo->num_normprops)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (ch != norminfo->normprops[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &norminfo->normprops[h];
+}
+
 /*
  * Look up the normalization quick check character property
  */
@@ -483,18 +511,14 @@ static UnicodeNormalizationQC
 qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
 {
 	pg_unicode_normprops key;
-	pg_unicode_normprops *found = NULL;
+	const pg_unicode_normprops *found = NULL;
 
 	key.codepoint = ch;
 
 	switch (form)
 	{
 		case UNICODE_NFC:
-			found = bsearch(&key,
-							UnicodeNormProps_NFC_QC,
-							lengthof(UnicodeNormProps_NFC_QC),
-							sizeof(pg_unicode_normprops),
-							qc_compare);
+			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
 			break;
 		case UNICODE_NFKC:
 			found = bsearch(&key,
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 93a2e55b75..4e8d2c46d6 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -2,6 +2,8 @@
 
 #include "common/unicode_norm.h"
 
+typedef int (*qc_hash_func) (const void *key);
+
 /*
  * We use a bit field here to save space.
  */
@@ -11,6 +13,13 @@ typedef struct
 	signed int	quickcheck:4;	/* really UnicodeNormalizationQC */
 } pg_unicode_normprops;
 
+typedef struct
+{
+	const pg_unicode_normprops *normprops;
+	qc_hash_func hash;
+	int			num_normprops;
+} unicode_norm_info;
+
 static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
 	{0x0300, UNICODE_NORM_QC_MAYBE},
 	{0x0301, UNICODE_NORM_QC_MAYBE},
@@ -1245,6 +1254,341 @@ static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
 	{0x2FA1D, UNICODE_NORM_QC_NO},
 };
 
+static int
+NFC_QC_hash_func(const void *key)
+{
+	static const int16 h[2463] = {
+		0, -2717, 0, 221, 1293, 223, 1295, 225,
+		226, 241, 0, 229, 230, 231, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		-386, 0, 0, 0, 0, 0, 0, 0,
+		-163, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		-246, -175, 1260, 0, 0, 0, -174, -173,
+		0, -172, 0, 0, 0, 0, 0, 0,
+		1049, 0, 300, 301, 1071, 0, 1071, 0,
+		1071, 1071, 1057, 0, 0, 0, 0, 1061,
+		0, -1053, 1664, 0, 2956, 0, 0, -13,
+		0, 0, 0, 0, 2156, 0, 0, 0,
+		0, 0, 0, 0, 71, 0, 1082, 0,
+		1083, 1083, 0, 1084, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 359, 360, 361,
+		-1091, 363, -762, -130, -129, -128, -127, -126,
+		137, -124, -708, -707, -706, -120, -185, -705,
+		-117, -184, -1307, -114, -113, -112, -111, 0,
+		386, 387, 388, 389, -90, 391, 171, 172,
+		394, -94, -183, 397, 398, 399, -98, -225,
+		402, -1019, -636, -1019, -225, 407, 408, 409,
+		410, 411, 674, 413, -171, -170, -169, 417,
+		352, -168, 420, 353, -770, 423, 424, 425,
+		426, 427, 428, 32767, 239, 239, 239, 239,
+		239, 239, 239, 239, 239, 239, 239, 239,
+		239, 239, 32767, 32767, 237, 32767, 236, 32767,
+		32767, 234, 234, 234, 234, 617, 234, 234,
+		234, -2483, 234, -1430, 1526, -1430, 1527, 47,
+		48, 471, 230, 32767, 32767, 32767, 227, 227,
+		227, 227, 227, 227, 227, 227, 227, 227,
+		227, 227, 227, 227, 227, 227, 227, 227,
+		-159, 227, 227, 227, 227, 227, 227, 227,
+		64, 227, 227, 227, 227, 227, 227, 227,
+		227, 227, 227, 227, 227, 227, 227, 227,
+		227, 227, 227, 227, 227, 227, 227, 227,
+		-19, 52, 1487, 227, 227, 227, 53, 54,
+		227, 55, 227, 227, 227, 227, 227, 227,
+		1276, 227, -989, 32767, 1296, 225, 1296, 225,
+		1296, 1296, 1282, 225, 225, 225, 225, 1286,
+		225, -828, 1889, 225, 3181, 225, 225, 212,
+		225, 225, 225, 225, 2381, 225, 225, 225,
+		225, 225, 225, 225, 296, 225, 1307, 225,
+		1308, 1308, 225, 1309, 225, 225, 225, 225,
+		225, 225, 225, 225, 225, 225, 225, 225,
+		225, 225, 225, 225, 225, 584, 585, 586,
+		-866, 588, -537, 95, 96, 97, 98, 99,
+		362, 101, -483, -482, -481, 105, 40, -480,
+		108, 41, -1082, 111, 112, 113, 114, 225,
+		611, 612, 613, 614, 135, 616, 396, 397,
+		619, 131, 42, 622, 623, 624, 127, 0,
+		627, -794, -411, -794, 0, 632, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		-272, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+		32767, 32767, -166, -165, 32767, 32767, 32767, 32767,
+		-164, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 397, 32767, 396, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 386,
+		0, 386, 386, 386, 386, 386, 386, 386,
+		223, 386, 386, 386, 32767, 385, 385, 385,
+		385, 385, 32767, 384, 32767, 383, 383, 32767,
+		382, 382, 32767, 381, 381, 381, 381, 381,
+		135, 206, 1641, 381, 32767, 32767, 32767, 32767,
+		32767, 32767, -160, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 1148, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		32767, 32767, 32767, 0, 0, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, -257, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -910, -910, 32767, 32767,
+		0, 32767, 0, 32767, 0, 32767, 0, 32767,
+		147, 32767, 0, 32767, 0, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 143, 32767, 144, 32767, 145,
+		32767, 146, 32767, 0, 32767, 148, 32767, 149,
+		32767, 32767, 32767, -160, 32767, 32767, 32767, 32767,
+		32767, 32767, 15, 32767, 32767, 0, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		145, 32767, 144, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0, -148, 32767, 32767, 32767, 32767,
+		32767, 32767, 2009, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0, 32767, 32767, 135, -918, 32767,
+		151, 32767, 32767, 0, 1, 2, 3, 4,
+		133, 5, 6, 7, 8, 9, 10, 11,
+		32767, 32767, -1248, 32767, 13, 154, 188, 188,
+		32767, 32767, 32767, 32767, 32767, 155, 16, 32767,
+		32767, 32767, 32767, 32767, 32767, -1853, -1054, 18,
+		-1052, -1051, -1036, 22, 32767, 157, 32767, 28,
+		23, 1077, 673, 25, -2930, 0, 32767, 32767,
+		32767, 32767, 32767, 27, 32767, 155, 32767, 154,
+		32767, 32767, -62, 28, -42, 30, -1051, 32,
+		-1050, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 34,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 129, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 672, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 0, 32767,
+		32767, 32767, 32767, 32767, -156, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -155, 32767, 32767,
+		32767, 0, 0, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		73, 32767, 32767, 32767, 32767, 74, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 675,
+		32767, 32767, 32767, 32767, 32767, 75, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 165, 32767, 32767, 32767, 166, 167,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 170, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 689, 690, 691, 692, 693, 694, 695,
+		696, 697, 698, 699, 700, 701, 702, 703,
+		704, 705, 706, 707, 708, 709, 710, 711,
+		712, 713, 714, 715, 716, 717, 718, 719,
+		720, 721, 722, -304, -303, -302, -301, -300,
+		-299, -298, -297, 930, -295, -294, -293, -292,
+		-291, -290, -289, -288, -287, -286, -285, -284,
+		-283, -282, -281, -280, -279, -278, -277, -276,
+		-275, 753, 754, 755, 646, 757, -712, -1765,
+		952, -712, 2244, -712, 2245, 765, 766, 767,
+		768, 125, 770, 771, 772, 773, 774, 775,
+		603, 777, 778, 779, 780, 781, 782, 783,
+		784, 2011, 786, 787, 788, 789, 790, 791,
+		792, 793, 794, 795, 796, 797, 798, 799,
+		800, 801, 802, 803, 804, 805, 806, 603,
+		603, 809, 603, 811, 603, 603, 814, 815,
+		816, 817, 435, 819, 820, 821, 3539, 823,
+		603, -468, 603, -468, 603, 603, 589, 831,
+		603, 603, 603, 835, 836, 837, 838, 839,
+		840, 841, 842, 843, 844, 845, 846, 847,
+		848, 849, 850, 851, 852, 1239, 854, 855,
+		856, 857, 858, 859, 860, 1024, 862, 863,
+		864, 865, 866, 867, 868, 869, 870, 871,
+		872, 873, 874, 875, 876, 877, 878, 879,
+		880, 881, 882, 883, 884, 1131, 1061, -373,
+		888, 889, 890, 1065, 1065, 893, 1066, 895,
+		896, 897, 898, 899, 900, -148, 902, 603,
+		603, -166, 906, -164, 908, -162, -161, -146,
+		912, 913, 914, 915, -145, 917, 1971, -745,
+		920, -2035, 922, 923, 937, 925, 926, 927,
+		928, -1227, 930, 931, 932, 933, 934, 935,
+		936, 866, 938, -143, 940, -142, -141, 943,
+		-140, 32767, 945, 946, 947, 948, 949, 950,
+		951, 952, 953, 954, 955, 956, 957, 958,
+		959, 960, 961, -65, -64, -63, -62, -61,
+		-60, -59, -58, 1169, -56, -55, -54, -53,
+		-52, -51, -50, -49, -48, -47, -46, -45,
+		-44, -43, -42, -41, -40, -39, -38, -37,
+		-36, 992, 993, 994, 885, 996, -473, -1526,
+		1191, -473, 2483, -473, 2484, 1004, 1005, 1006,
+		1007, 364, 1009, 1010, 1011, 1012, 1013, 1014,
+		842, 1016, 1017, 1018, 1019, 1020, 1021, 1022,
+		1023, 2250, 1025, 1026, 1027, 1028, 1029, 1030,
+		1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038,
+		1039, 1040, 1041, 1042, 1043, 1044, 1045, 842,
+		842, 1048, 842, 1050, 842, 842, 1053, 1054,
+		1055, 1056, 674, 1058, 1059, 1060, 3778, 1062,
+		842, -229, 842, -229, 842, 842, 828, 1070,
+		842, 842, 842, 1074, 1075, 1076, 1077, 1078,
+		1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086,
+		1087, 1088, 1089, 1090, 1091, 1478, 1093, 1094,
+		1095, 1096, 1097, 1098, 1099, 1263, 1101, 1102,
+		1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110,
+		1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118,
+		1119, 1120, 1121, 1122, 1123, 1370, 1300, -134,
+		1127, 1128, 1129, 1304, 1304, 1132, 1305, 1134,
+		1135, 1136, 1137, 1138, 1139, 91, 1141, 842,
+		842, 73, 1145, 75, 1147, 77, 78, 93,
+		1151, 1152, 1153, 1154, 94, 1156, 2210, -506,
+		1159, -1796, 1161, 1162, 1176, 1164, 1165, 1166,
+		1167, -988, 1169, 1170, 1171, 1172, 1173, 1174,
+		1175, 1105, 1177, 96, 1179, 97, 98, 1182,
+		99, 1184, 1185, 1186, 1187, 1188, 1189, 1190,
+		1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198,
+		1199, 1200, 0, 174, 175, 176, 177, 178,
+		179, 180, 181, 1408, 183, 184, 185, 186,
+		187, 188, 189, 190, 191, 192, 193, 194,
+		195, 196, 197, 198, 199, 200, 201, 202,
+		203, 0, 0, 206, 0, 208, 0, 0,
+		211, 212, 213, 214, -168, 216, 217, 218,
+		2936, 220, 0, -1071, 0, -1071, 0, 0,
+		-14, 228, 0, 0, 0, 232, 233, 234,
+		235, 236, 237, 238, 239, 240, 241, 242,
+		243, 244, 245, 246, 247, 248, 249, 636,
+		251, 252, 253, 254, 255, 256, 257, 421,
+		259, 260, 261, 262, 263, 264, 265, 266,
+		267, 268, 269, 270, 271, 272, 273, 274,
+		275, 276, 277, 278, 279, 280, 281, 528,
+		458, -976, 285, 286, 287, 462, 462, 290,
+		463, 292, 293, 294, 295, 296, 297, -751,
+		299, 0, 0, -769, 303, -767, 305, -765,
+		-764, -749, 309, 310, 311, 312, -748, 314,
+		1368, -1348, 317, -2638, 319, 320, 334, 322,
+		323, 324, 325, -1830, 327, 328, 329, 330,
+		331, 332, 333, 263, 335, -746, 337, -745,
+		-744, 340, -743, 342, 343, 344, 345, 346,
+		347, 348, 349, 350, 351, 352, 353, 354,
+		355, 356, 357, 358, 0, 0, 0, 1453,
+		0, 1126, 495, 495, 495, 495, 495, 233,
+		495, 1080, 1080, 1080, 495, 561, 1082, 495,
+		563, 1687, 495, 495, 495, 495, 385, 0,
+		0, 0, 0, 480, 0, 221, 221, 0,
+		489, 579, 0, 0, 0, 498, 626, 0,
+		1422, 1040, 1424, 631, 0, 0, 0, 0,
+		0, -262, 0, 585, 585, 585, 0, 66,
+		587, 0, 68, 1192, 0, 0, 0, 0,
+		0, 0, 32767, 32767, 32767, 32767, 669, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 670,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 142, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 115, 116, 117, 118, 119, 120,
+		121, 122, 123, 124, 125, 126, 127, 128,
+		129, 130, 131, 132, 133, 134, 135, 136,
+		137, 138, 139, 140, 141, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 1027, 1027, 1027,
+		1027, 1027, 1027, 1027, 1027, -199, 1027, 1027,
+		1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+		1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+		1027, 1027, 1027, 0, 0, 0, 110, 0,
+		1470, 2524, -192, 1473, -1482, 1475, -1481, 0,
+		0, 0, 0, 644, 0, 0, 0, 0,
+		0, 0, 173, 0, 0, 0, 0, 0,
+		0, 0, 0, -1226, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 204, 205, 0, 207, 0, 209, 210,
+		0, 0, 0, 0, 383, 0, 0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 0;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 17 + c;
+	}
+	return h[a % 2463] + h[b % 2463];
+}
+
+static const unicode_norm_info UnicodeNormInfo_NFC_QC = {
+	UnicodeNormProps_NFC_QC,
+	NFC_QC_hash_func,
+	1231
+};
+
 static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
 	{0x00A0, UNICODE_NORM_QC_NO},
 	{0x00A8, UNICODE_NORM_QC_NO},
diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index d6841589a3..26efa7ad70 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -124,7 +124,7 @@ sub generate_hash_function
 	$f .= sprintf "\tstatic const %s h[%d] = {\n", $elemtype, $nhash;
 	for (my $i = 0; $i < $nhash; $i++)
 	{
-		$f .= sprintf "%s%6d,%s",
+		$f .= sprintf "%s%d,%s",
 		  ($i % 8 == 0 ? "\t\t" : " "),
 		  $hashtab[$i],
 		  ($i % 8 == 7 ? "\n" : "");
-- 
2.22.0

v1-0003-Use-perfect-hashing-for-NFKC-Unicode-normalizatio.patchapplication/octet-stream; name=v1-0003-Use-perfect-hashing-for-NFKC-Unicode-normalizatio.patchDownload
From 6a49f7c7db8405ad64d382ecbe7f6a570e8da684 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Fri, 15 May 2020 11:17:08 +0800
Subject: [PATCH v1 3/3] Use perfect hashing for NFKC Unicode normalization
 quick check

This is about 45% faster than binary search, at the cost of 19kB of binary
space. Also remove the ability to use binary search for quick check.
---
 .../generate-unicode_normprops_table.pl       |    3 -
 src/common/unicode_norm.c                     |   20 +-
 src/include/common/unicode_normprops_table.h  | 1257 +++++++++++++++++
 3 files changed, 1258 insertions(+), 22 deletions(-)

diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index 7f00cb0ae4..e0a201b6d1 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -105,9 +105,6 @@ foreach my $prop (sort keys %data)
 
 	# Emit the definition of the hash function.
 
-	# To save space, skip building the function for the larger "C" form.
-	next if $prop eq "NFKC_QC";
-
 	my $funcname = $prop . '_hash_func';
 
 	my $f = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 1714837e64..5d951fc2e0 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -465,17 +465,6 @@ get_canonical_class(pg_wchar ch)
 		return entry->comb_class;
 }
 
-static int
-qc_compare(const void *p1, const void *p2)
-{
-	uint32		v1,
-				v2;
-
-	v1 = ((const pg_unicode_normprops *) p1)->codepoint;
-	v2 = ((const pg_unicode_normprops *) p2)->codepoint;
-	return (v1 - v2);
-}
-
 static const pg_unicode_normprops *
 qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
 {
@@ -510,22 +499,15 @@ qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
 static UnicodeNormalizationQC
 qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
 {
-	pg_unicode_normprops key;
 	const pg_unicode_normprops *found = NULL;
 
-	key.codepoint = ch;
-
 	switch (form)
 	{
 		case UNICODE_NFC:
 			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
 			break;
 		case UNICODE_NFKC:
-			found = bsearch(&key,
-							UnicodeNormProps_NFKC_QC,
-							lengthof(UnicodeNormProps_NFKC_QC),
-							sizeof(pg_unicode_normprops),
-							qc_compare);
+			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFKC_QC);
 			break;
 		default:
 			Assert(false);
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 4e8d2c46d6..bd2894855a 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -6509,3 +6509,1260 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
 	{0x2FA1C, UNICODE_NORM_QC_NO},
 	{0x2FA1D, UNICODE_NORM_QC_NO},
 };
+
+static int
+NFKC_QC_hash_func(const void *key)
+{
+	static const int16 h[9837] = {
+		-2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+		-2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+		-2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+		-2472, -2472, -2472, -2472, -2472, 32767, 32767, 32767,
+		-2475, -2475, -2475, -2475, -2475, -2475, -2475, -2475,
+		-2475, -2475, -2475, -2475, -2475, -2475, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 865, 865, 865, 865, 865, 865, 865,
+		865, 865, 865, 865, -2255, 32767, -5207, 32767,
+		-5207, 860, 860, 860, 860, 860, 860, 860,
+		860, 860, 4250, 861, 861, 861, 3339, 3339,
+		3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+		3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+		32767, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+		3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+		3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+		3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+		3338, 9, 10, 32767, 11, 12, 0, 32767,
+		0, 2913, 2914, 2915, 2916, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2917, 32767, 2918, -100,
+		2919, 2920, 2921, 840, 840, 840, 2922, 0,
+		0, 0, 0, 0, 2206, 0, 2923, 0,
+		2924, 2925, 2926, 0, 0, 0, -2590, 0,
+		0, 0, 0, 0, 0, 0, 2934, 0,
+		2474, 2931, 2932, 0, 0, 0, 0, 0,
+		14, 805, 0, 0, 2933, 0, 2934, 0,
+		2935, 2936, 0, 0, 0, 16, 17, 0,
+		0, 0, 0, 0, 0, 0, 0, 18,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, -790, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, -1675, 0, 0, 19, 0, -1679,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, -1694,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 20, 21, 22, 23, 24, 25,
+		26, 27, 28, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 29, 30, 31, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 724, 2668, 724, 4350, -2633, -2633,
+		2533, 2534, 2535, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 2518, 2519, 2520, 1431, 45, 46,
+		32767, 32767, 47, 48, 49, 50, 51, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -3011, 53, -1125, -3010, -3010,
+		32767, -3334, -1123, -3011, 60, 61, 62, 63,
+		32767, 32767, 64, 32767, 65, 32767, 66, 67,
+		32767, 32767, 32767, 32767, 32767, 32767, 2268, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 69, 70,
+		71, 72, 73, 74, 32767, 32767, 32767, 32767,
+		75, 76, 32767, 77, 281, 32767, 32767, 32767,
+		32767, 32767, 32767, 811, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 1341, 1342, 1343, 1344, 1345,
+		1346, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 86,
+		32767, 32767, 32767, 32767, 32767, 4550, 32767, 32767,
+		32767, 1135, 32767, 32767, 32767, 32767, 32767, 1130,
+		3016, 32767, 3017, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 677, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 2858, 2859, 651, 2861, -438,
+		2863, 2864, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -5305, -5305, -5305, 32767, -5306,
+		-5306, 32767, 32767, 32767, 2871, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 3022, 3023, 680, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, -272, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4308, 4309, 4310,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4311, 4312, 4313,
+		4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321,
+		4322, 4323, 4324, 4325, 4326, 4307, 4307, 4307,
+		4307, 4307, 4307, 4307, 4307, 4307, 4336, 4337,
+		4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345,
+		4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353,
+		4354, 32767, 32767, 32767, 32767, 4355, 4356, 4357,
+		4358, 4359, 4360, 4361, 4362, 4363, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4364, 4365, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 2202, 0, 0, 0, 59, 0,
+		0, 35, 0, 0, 0, 3549, 0, 0,
+		0, 0, 0, 3394, 0, 0, 3399, 0,
+		0, 0, 0, 0, 0, 0, 0, 2012,
+		0, 0, 0, 0, 87, 2022, 0, 7490,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		2255, 0, 2256, 2256, 2256, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 32767, 0, 0,
+		0, 0, 0, 0, -1759, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 4767, 0, 0, 4772,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 32767, 5977, 0,
+		892, 32767, 0, 32767, 32767, 0, 0, 32767,
+		32767, 2344, 4834, 4835, 4836, 32767, 0, 4840,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 32767, 0, 32767, 0, 0, 0,
+		0, 0, 0, 0, 32767, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		32767, 32767, 0, 32767, 0, 0, 0, 32767,
+		32767, 32767, 32767, 3261, 3262, 32767, 3007, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 106, 107, 108, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 109, 110, 111, 112, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0, 0, -2344,
+		-2344, 0, 32767, 0, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -1642, 1469, -1641, 1469, -1640, 1469,
+		1469, 1457, 1469, 1469, 1469, -4254, -4254, -4254,
+		-4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+		-4254, -4254, -4254, -4254, -4254, -4254, -3359, -4254,
+		-4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+		-4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+		-4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+		-4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+		-4254, -4254, -4254, -4254, -4254, -4254, -4254, -4103,
+		-1478, 0, -4254, -4254, -4254, -4254, -4254, -4254,
+		-4254, -4254, -4254, -2433, -4254, -4254, -4254, -3658,
+		-4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+		-4254, -4254, 0, -4253, -4253, -4253, -4253, -4253,
+		-4253, -4253, -4253, -4253, -678, -677, -676, -675,
+		-674, -673, -672, -4253, 314, -4253, -4253, -4253,
+		-4253, -4253, -4253, -4253, -4253, -4253, -4253, -4253,
+		-4253, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 1464, 1465, 1466, 1467,
+		1468, 1469, 0, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		0, 0, 0, 0, 32767, 32767, 32767, 32767,
+		32767, 0, 32767, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 827, 828, 829, -2469, -2469, -260, 0,
+		0, 32767, 0, 32767, 0, 0, 32767, 0,
+		0, 32767, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		3575, 3576, 3577, 3578, 3579, 3580, 3581, 0,
+		4567, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 2201, 4411, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, -3338, 0, 0, 0,
+		0, 0, 0, 0, -3337, 0, -3336, 0,
+		0, 0, 0, -3335, 0, 0, -3334, -3333,
+		-3332, -3331, 0, 0, -3330, 0, 0, 32767,
+		0, 0, 13, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 3073,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		-2556, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		3074, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2355, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -488, -488, -488, -302, -3067, -3067,
+		-3067, -3067, -488, -488, -488, -488, 2999, -488,
+		2999, -488, -488, -488, -3067, -3067, -3067, -488,
+		-488, -3067, -3067, -3067, -488, -488, -488, 2463,
+		-488, -488, -488, -301, 2465, -488, 2466, 2467,
+		-3600, -493, -3599, -488, -3598, -488, -3597, -488,
+		-488, -500, -488, -488, -488, -488, -488, 2470,
+		2471, 2472, -488, -488, -254, -488, -488, -488,
+		-488, -488, -104, -488, -488, -488, -102, -101,
+		-100, -99, -98, -97, -96, -95, -94, -93,
+		-92, -488, -488, -488, -488, -488, -488, -488,
+		-488, -488, -2194, -2194, -2194, -2194, -2194, -2194,
+		-2194, -2194, -2194, -2194, 5211, 3269, 5213, 3269,
+		6895, -88, -88, 5078, 5079, 5080, 1773, -92,
+		-92, 1773, 1773, 1773, 1773, 1773, 1773, 5072,
+		5073, 2865, 5075, 1776, 5077, 5078, 1778, 1778,
+		6942, 6943, 1778, 1778, 1778, 5086, 6952, 6953,
+		5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096,
+		4007, 5098, 2333, 2334, 2335, 2336, 2337, -3066,
+		-3066, -3066, 2341, -3066, -3066, 2344, 2345, 2346,
+		5114, 317, 2349, 848, 849, 850, 2353, 852,
+		853, 854, 855, 856, 857, 858, 859, 860,
+		861, 692, 692, 692, 692, 692, 692, 692,
+		692, 692, 692, 692, 692, 692, 692, 692,
+		692, 692, 692, 692, 692, 692, 692, 692,
+		692, 692, 692, 692, 692, 692, 692, 692,
+		692, 692, 692, 692, 692, 692, 692, 692,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 3093, 3094, 3095, 3096, 3097, 3098, 3099,
+		3100, 3101, 3102, 901, 3104, 3105, 3106, 3048,
+		3108, 3109, 3075, 3111, 3112, 3113, -435, 3115,
+		3116, 3117, 3118, 3119, -274, 3121, 3122, -276,
+		3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131,
+		1120, 3133, 3134, 3135, 3136, 3050, 1116, 3139,
+		-4350, 3141, 3142, 3143, 3144, 3145, 3146, 3147,
+		3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155,
+		3156, 902, 3158, 903, 904, 905, 3162, 3163,
+		3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171,
+		3172, 3173, 3174, 3175, 3176, 3177, 32767, 3178,
+		3179, 3180, 3181, 3182, 3183, 4943, 3185, 3186,
+		3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194,
+		3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202,
+		3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210,
+		3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218,
+		3219, 3220, 3221, 3222, 3223, -1543, 3225, 3226,
+		-1545, 3228, 3229, 3230, 3231, 3232, 3233, 3234,
+		3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242,
+		3243, 3244, 3245, 3246, 3247, 3248, -1251, -2728,
+		3250, 32767, 32767, 3251, 906, 907, 3252, 3253,
+		32767, 32767, 910, -1579, -1579, -1579, 32767, 3258,
+		-1581, 3260, 3261, 3262, 3263, 3264, 3265, 3266,
+		3267, 3268, 3269, 32767, 3270, 32767, 3271, 3272,
+		3273, 3274, 3275, 3276, 3277, 32767, 3278, 3279,
+		3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287,
+		3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295,
+		3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303,
+		3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311,
+		3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319,
+		3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327,
+		3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335,
+		3336, 32767, 3337, 3338, 3339, 3340, 3341, 3342,
+		0, 3343, 3344, 3345, 3346, 32767, 32767, 3347,
+		3348, 3349, 3350, 3351, 3352, 3353, 3354, 32767,
+		3355, 3356, 3357, 3358, 3359, 3360, 3361, 32767,
+		3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369,
+		3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377,
+		3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385,
+		3386, 3387, 3388, 3389, 0, 3390, 3391, 3392,
+		915, 916, 917, 918, 919, 920, 921, 922,
+		923, 924, 925, 926, 927, 928, 929, 930,
+		931, 932, 933, 934, 935, 936, 937, 938,
+		939, 940, 941, 942, 943, 944, 945, 946,
+		947, 948, 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, 3449, 3450,
+		3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458,
+		3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466,
+		3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474,
+		3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482,
+		3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490,
+		3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498,
+		3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506,
+		3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514,
+		3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522,
+		3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530,
+		3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538,
+		3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546,
+		3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554,
+		3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562,
+		3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570,
+		3571, 3572, 3573, 3574, 3575, 3576, 3577, 6056,
+		6057, 6058, 32767, 3581, 3582, 3583, 3584, 3585,
+		4157, 4158, 4159, 3589, 4162, -4510, -1558, -1557,
+		-1556, -1742, -4507, -1553, -4506, -4506, 1562, -1544,
+		1563, -1547, 1564, -1545, 1565, -1543, -1542, -1529,
+		-1540, -1539, -1538, -1537, -1536, -4493, -4493, -4493,
+		-1532, -1531, -1764, -1529, 3622, -1528, -1527, -1526,
+		-1909, -1524, -1523, -1522, -1907, -1907, -1907, -1907,
+		-1907, -1907, -1907, -1907, -1907, -1907, -1907, -1510,
+		-1509, 1071, 1072, 1073, 1074, 1075, 1076, 1077,
+		1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085,
+		1086, 1087, 1088, 1089, 1090, 3663, 3664, 3665,
+		3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673,
+		3674, 1095, 1096, 1097, 1098, 1099, 1100, 1101,
+		3682, 1103, 3684, 1105, 3686, 3687, 3688, 1109,
+		1110, 1111, 3692, 1113, 1114, 1115, 1116, 1117,
+		1118, 1119, 3700, 1121, 3702, 3703, 3704, 1125,
+		1126, 1127, -1809, -1809, -1809, -1809, -1809, -1809,
+		3720, 3721, 3722, 3717, 3718, 3719, 3720, 1140,
+		1141, 1142, 1143, -1802, 1145, 1146, 1147, 1148,
+		3730, -1797, 3732, 1152, 3734, 3735, 1155, 1156,
+		3738, 3739, 3740, 3741, 3742, 3743, -1785, -1785,
+		-1785, -1779, -1324, 1168, 1169, 1170, 1171, 1172,
+		3752, 3753, 1175, 1176, 1177, 992, 3758, 3759,
+		3760, 3761, 1183, 1184, 1185, 1186, -2300, 1188,
+		-2298, 1190, 1191, 1192, 3772, 3773, 3774, 1196,
+		1197, 3777, 3778, 3779, 1201, 1202, 1203, -1747,
+		1205, 1206, 1207, 1021, -1744, 1210, -1743, -1743,
+		4325, 1219, 4326, 1216, 4327, 1218, 4328, 1220,
+		1221, 1234, 1223, 1224, 1225, 1226, 1227, -1730,
+		-1730, -1730, 1231, 1232, 999, 1234, 1235, 1236,
+		1237, 1238, 855, 1240, 1241, 1242, 857, 857,
+		857, 857, 857, 857, 857, 857, 857, 857,
+		857, 1254, 1255, 1256, 1257, 1258, 1259, 1260,
+		1261, 1262, 2969, 2970, 2971, 2972, 2973, 2974,
+		2975, 2976, 2977, 2978, -4426, -2483, -4426, -2481,
+		-6106, 878, 879, -4286, -4286, -4286, -978, 888,
+		889, -975, -974, -973, -972, -971, -970, -4268,
+		-4268, -2059, -4268, -968, -4268, -4268, -967, -966,
+		-6129, -6129, -963, -962, -961, -4268, -6133, -6133,
+		-4268, -4268, -4268, -4268, -4268, -4268, -4268, -4268,
+		-3178, -4268, -1502, -1502, -1502, -1502, -1502, 3902,
+		3903, 3904, -1502, 3906, 3907, -1502, -1502, -1502,
+		-4269, 529, -1502, 0, 0, 0, -1502, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 170, 171, 172, 173, 174, 175, 176,
+		177, 178, 179, 180, 181, 182, 183, 184,
+		185, 186, 187, 188, 189, 190, 191, 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, -3194, 221, 222, 223, 224,
+		-1657, 226, 227, -1657, 229, 230, -1655, 555,
+		-1655, 234, 235, 236, 732, 238, 239, 240,
+		241, 242, 243, -1655, 245, 246, 247, 248,
+		-1655, 250, -1655, 252, -1655, -1655, -1655, -1655,
+		-1655, -1655, 259, -1655, -1655, -1655, -1655, 264,
+		-1655, 266, -1655, 268, -1655, -3620, 271, 272,
+		-1655, 274, 275, -1655, 277, -1655, -1655, 280,
+		-1655, 282, 5746, 5747, 5748, 5749, -1655, 288,
+		-1655, 290, -3335, 3649, 3650, -1515, -1515, -1515,
+		1793, 3659, 3660, 1796, 1797, 1798, 1799, 1800,
+		1801, -1497, -1497, 712, -1497, 1803, -1497, -1497,
+		1804, 1805, -3358, -3358, 1808, 1809, 1810, -1497,
+		-3362, -3362, -1497, -1497, -1497, -1497, -1497, -1497,
+		-1497, -1497, -407, -1497, -1497, -1497, -1497, -1497,
+		-1497, 3667, 3668, -1497, -1497, -1497, 1811, 3677,
+		3678, 32767, 1814, 32767, 1815, 32767, 32767, 1816,
+		1817, 32767, 32767, 32767, 1818, 1819, 1820, 1821,
+		-3342, -3342, 1824, 1825, 1826, 1827, 1828, 1829,
+		1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837,
+		1838, 1839, 1840, 1841, 1842, 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, 1871, 1872, 1873, 1874, 1875, 1876, -1537,
+		1878, 1879, 1880, 1881, 0, 1883, 1884, 0,
+		529, 0, 0, 2210, 0, 1889, 1890, 1891,
+		2387, 1893, 1894, 1895, 1896, 1897, 1898, 0,
+		1900, 1901, 1902, 1903, 0, 1905, 0, 1907,
+		0, 0, 0, 0, 0, 0, 1914, 0,
+		0, 0, 0, 1919, 0, 1921, 0, 1923,
+		0, -1965, 1926, 1927, 0, 1929, 1930, 0,
+		1932, 0, 0, 1935, 0, 1937, 7401, 7402,
+		7403, 7404, 0, 1943, 0, 1945, 1946, 0,
+		1948, 0, 0, 1951, 1952, 1953, 1954, 0,
+		1956, 1957, 1958, 1959, 1960, 1961, 1962, 0,
+		1964, 1965, 1966, 1967, 0, 1969, 1970, 1971,
+		1972, 0, 1974, 0, 1976, 1977, 1978, 1979,
+		1980, 1981, 1982, 1983, 1984, 1985, 0, 1987,
+		1988, 1989, 1990, 1991, 566, 566, 566, 5141,
+		5142, 566, 566, 566, 566, 566, 566, 566,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 8673, 5722, 5722, 5722, 0, 8676,
+		5723, 8677, 8678, 2611, 5718, 2612, 5723, 2613,
+		5723, 2614, 5723, 5723, 5711, 5723, 5723, 5723,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 895, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 151, 2776, 4254, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 1821, 0,
+		0, 0, 596, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -2856, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -2901, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -1025, 32767, 32767, 32767,
+		32767, -2910, 32767, 32767, 32767, 32767, 157, 32767,
+		32767, 32767, 32767, 158, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		2359, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 160, 32767, 161, 162, 163, 164,
+		165, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		898, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 1428, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 1254, 32767, 32767, 32767,
+		32767, 1250, 32767, 32767, 32767, 32767, 1246, 32767,
+		32767, 32767, 32767, 1243, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1231, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 1842, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		3177, 1235, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4323,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 174, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 1830, -112, 1832, -112, 3514, -3469,
+		-3469, 1697, 1698, 1699, -1608, -3473, -3473, -1608,
+		-1608, -1608, -1608, -1608, -1608, 1691, 1692, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, -1623, -1623, -1623, 3541, 3542, -1623, -1623,
+		-1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623,
+		-1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623,
+		-1623, -1623, -1623, -1623, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -766, 2253, 2254, 2255, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1531, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0, 0, 32767, 0, 0, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -173, -173, -173, -173, -173,
+		-173, -173, -173, -173, -173, -173, -173, 3241,
+		-173, -173, -173, -173, 1709, -173, -173, 1712,
+		-173, -173, 1713, -496, 1715, -173, -173, -173,
+		-668, -173, -173, -173, -173, -173, -173, 1726,
+		-173, -173, -173, -173, 1731, -173, 1733, -173,
+		1735, 1736, 1737, 1738, 1739, 1740, -173, 1742,
+		1743, 1744, 1745, -173, 1747, -173, 1749, -173,
+		1751, 3717, -173, -173, 1755, -173, -173, 1758,
+		-173, 1760, 1761, -173, 1763, -173, -5636, -5636,
+		-5636, -5636, 1769, -173, 1771, -173, 3453, -3530,
+		-3530, 1636, 1637, 1638, -1669, -3534, -3534, -1669,
+		-1669, -1669, -1669, -1669, -1669, 1630, 1631, -577,
+		1633, -1666, 1635, 1636, -1664, -1664, 3500, 3501,
+		-1664, -1664, -1664, 1644, 3510, 3511, 1647, 1648,
+		1649, 1650, 1651, 1652, 1653, 1654, 565, 1656,
+		1657, 1658, 1659, 1660, 1661, -3502, -3502, 1664,
+		1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672,
+		1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680,
+		1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688,
+		1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696,
+		1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704,
+		1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712,
+		1713, 1714, 1715, 1716, -1697, 1718, 1719, 1720,
+		1721, -160, 1723, 1724, -160, 1726, 1727, -158,
+		2052, -158, 1731, 1732, 1733, 2229, 1735, 1736,
+		1737, 1738, 1739, 1740, -158, 1742, 1743, 1744,
+		1745, -158, 1747, -158, 1749, -158, -158, -158,
+		-158, -158, -158, 1756, -158, -158, -158, -158,
+		1761, -158, 1763, -158, 1765, -158, -2123, 1768,
+		1769, -158, 1771, 1772, -158, 1774, -158, -158,
+		1777, -158, 1779, 7243, 7244, 7245, 7246, -158,
+		1785, -158, 1787, -1838, 5146, 5147, -18, -18,
+		-18, 3290, 5156, 5157, 3293, 3294, 3295, 3296,
+		3297, 3298, 0, 0, 2209, 0, 3300, 0,
+		0, 3301, 3302, -1861, -1861, 3305, 3306, 3307,
+		0, -1865, -1865, 0, 0, 0, 0, 0,
+		0, 0, 0, 1090, 0, 0, 0, 0,
+		0, 0, 5164, 5165, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 3414, 0, 0, 0, 0, 1882, 0,
+		0, 1885, 0, 0, 1886, -323, 1888, 0,
+		0, 0, -495, 0, 0, 0, 0, 0,
+		0, 1899, 0, 0, 0, 0, 1904, 0,
+		1906, 0, 1908, 1909, 1910, 1911, 1912, 1913,
+		0, 1915, 1916, 1917, 1918, 0, 1920, 0,
+		1922, 0, 1924, 3890, 0, 0, 1928, 0,
+		0, 1931, 0, 1933, 1934, 0, 1936, 0,
+		-5463, -5463, -5463, -5463, 1942, 0, 1944, 0,
+		0, 1947, 0, 1949, 1950, 0, 0, 0,
+		0, 1955, 0, 0, 0, 0, 0, 0,
+		0, 1963, 0, 0, 0, 0, 1968, 0,
+		0, 0, 0, 1973, 0, 1975, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		1986, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 527, 527, 527, 527, 0,
+		528, 528, 528, 528, 528, 528, 528, 528,
+		528, 528, 528, 1998, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1999, 2000, 2001, 2002, 2003, 32767, 32767, 32767,
+		32767, 32767, 2004, 32767, 2005, 2006, 2007, 2008,
+		2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016,
+		2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024,
+		2025, 2026, 1200, 1200, 32767, 4498, 4499, 2291,
+		2032, 2033, 32767, 2034, 32767, 2035, 2036, 32767,
+		2037, 2038, 32767, 2039, 2040, 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, -1506, -1506, -1506, -1506, -1506, -1506, -1506,
+		2076, -2490, 2078, 2079, 2080, 2081, 2082, 2083,
+		2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091,
+		2092, 2093, 2094, 2095, -105, -2314, 2098, 2099,
+		2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107,
+		2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115,
+		2116, 2117, 2118, 2119, 2120, 5459, 2122, 2123,
+		2124, 2125, 2126, 2127, 2128, 5466, 2130, 5467,
+		2132, 2133, 2134, 2135, 5471, 2137, 2138, 5473,
+		5473, 5473, 5473, 2143, 2144, 5475, 2146, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154,
+		2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162,
+		2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170,
+		2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178,
+		2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186,
+		2187, 2188, 2189, 2190, 2191, 32767, -726, 2293,
+		-725, -725, -725, 1357, 1358, 1359, -722, 2201,
+		2202, 2203, 2204, 2205, 0, 2207, -715, 2209,
+		-714, -714, -714, 2213, 2214, 2215, 4806, 2217,
+		2218, 2219, 2220, 2221, 2222, 2223, -710, 2225,
+		-248, -704, -704, 2229, 2230, 2231, 2232, 2233,
+		2220, 1430, 2236, 2237, -695, 2239, -694, 2241,
+		-693, -693, 2244, 2245, 2246, 2231, 2231, 2249,
+		2250, 2251, 2252, 2253, 2254, 2255, 2256, 2239,
+		2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265,
+		2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273,
+		2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281,
+		2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289,
+		2290, 2291, 2292, 2293, 3084, 2295, 2296, 2297,
+		2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305,
+		2306, 2307, 3983, 2309, 2310, 2292, 2312, 3992,
+		2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321,
+		2322, 2323, 2324, 2325, 2326, 2327, 2328, 4023,
+		2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337,
+		2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345,
+		2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353,
+		2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361,
+		2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369,
+		2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377,
+		2378, 2379, 2360, 2360, 2360, 2360, 2360, 2360,
+		2360, 2360, 2360, 2389, 2390, 2391, 2392, 2393,
+		2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401,
+		2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409,
+		2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417,
+		2418, 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, 32767, 2448,
+		2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456,
+		2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464,
+		2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472,
+		2473, 2474, 2475, 2476, 2477, 2478, 2479, 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,
+		2505, 2506, 2507, 2508, 2509, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 2510,
+		2511, 2512, 2513, 3266, 3266, 3266, 3266, 2518,
+		3267, 3267, 3267, 2522, 3268, 3268, 3268, 3268,
+		3268, 3268, 3268, 6682, 3268, 3268, 3268, 2534,
+		5151, 3269, 2537, 2538, 3271, 3271, 5157, 2948,
+		5159, 2544, 2545, 3273, 2778, 3273, 2549, 3274,
+		2551, 3275, 2553, 5175, 2555, 3277, 3277, 3277,
+		5181, 2560, 5184, 3278, 5186, 2564, 5189, 5190,
+		5191, 5192, 3279, 5194, 5195, 2572, 5198, 32767,
+		32767, 3278, 5200, 3278, 2577, 2578, 2579, 2580,
+		5210, 3282, 3282, 5213, 3282, 2586, 2587, 2588,
+		2589, 2590, 2591, -2175, -2175, -2175, 5230, 3288,
+		5232, 3288, 6914, -69, -69, 5097, 5098, 5099,
+		1792, -73, -73, 1792, 1792, 1792, 1792, 1792,
+		1792, 5091, 5092, 2884, 5094, 1795, 5096, 5097,
+		1797, 1797, 6961, 6962, 1797, 1797, 1797, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 2578, 2578, 2578, 2578, 2578,
+		2578, 872, 872, 872, 872, 872, 872, 872,
+		872, 872, 872, 8277, 6335, 8279, 6335, 9961,
+		2978, 2978, 8144, 8145, 8146, 4839, 2974, 2974,
+		4839, 4839, 4839, 4839, 4839, 4839, 8138, 8139,
+		5931, 8141, 4842, 8143, 8144, 4844, 4844, 10008,
+		10009, 4844, 4844, 4844, 8152, 10018, 10019, 8155,
+		8156, 8157, 8158, 8159, 8160, 8161, 8162, 7073,
+		8164, 5399, 5400, 5401, 5402, 5403, 0, 0,
+		0, 5407, 0, 0, 5410, 5411, 5412, 8180,
+		3383, 5415, 3914, 3915, 3916, 5419, 3918, 3919,
+		3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927,
+		3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+		3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+		3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+		3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+		3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+		3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+		3758, 3758, 7172, 3758, 3758, 3758, 3758, 5640,
+		3758, 3758, 5643, 3758, 3758, 5644, 3435, 5646,
+		3758, 3758, 3758, 3263, 3758, 3758, 3758, 3758,
+		3758, 3758, 5657, 3758, 3758, 3758, 3758, 5662,
+		3758, 5664, 3758, 5666, 5667, 5668, 5669, 5670,
+		5671, 3758, 5673, 5674, 5675, 5676, 3758, 5678,
+		3758, 5680, 3758, 5682, 7648, 3758, 3758, 5686,
+		3758, 3758, 5689, 3758, 5691, 5692, 3758, -1707,
+		-1707, -1707, -1707, -1707, -1707, 5698, 3756, 5700,
+		3756, 7382, 399, 399, 5565, 5566, 5567, 2260,
+		395, 395, 2260, 2260, 2260, 2260, 2260, 2260,
+		5559, 5560, 3352, 5562, 2263, 5564, 5565, 2265,
+		2265, 7429, 7430, 2265, 2265, 2265, 5573, 7439,
+		7440, 5576, 5577, 5578, 5579, 5580, 5581, 5582,
+		5583, 4494, 5585, 2820, 2821, 2822, 2823, 2824,
+		-2579, -2579, -2579, 2828, -2579, -2579, 2831, 2832,
+		2833, 5601, 804, 2836, 1335, 1336, 1337, 2840,
+		1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346,
+		1347, 1348, 1179, 1179, 1179, 1179, 1179, 1179,
+		1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+		1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+		1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+		1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+		1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+		1179, 1179, 1179, 1179, 4593, 1179, 1179, 1179,
+		1179, 3061, 1179, 1179, 3064, 1179, 1179, 3065,
+		856, 3067, 1179, 1179, 1179, 684, 1179, 1179,
+		1179, 1179, 1179, 1179, 3078, 1179, 1179, 1179,
+		1179, 3083, 1179, 3085, 1179, 3087, 3088, 3089,
+		3090, 3091, 3092, 1179, 3094, 3095, 3096, 3097,
+		1179, 3099, 1179, 3101, 1179, 3103, 5069, 1179,
+		1179, 3107, 1179, 1179, 3110, 1179, 3112, 3113,
+		1179, 3115, 1179, -4284, -4284, -4284, -4284, 3121,
+		1179, 3123, 1179, 4805, -2178, -2178, 2988, 2989,
+		2990, -317, -2182, -2182, -317, -317, -317, -317,
+		-317, -317, 2982, 2983, 775, 2985, -314, 2987,
+		2988, -312, -312, 4852, 4853, -312, -312, -312,
+		2996, 4862, 4863, 2999, 3000, 3001, 3002, 3003,
+		3004, 3005, 3006, 1917, 3008, 3009, 3010, 3011,
+		3012, 3013, -2150, -2150, 3016, 3017, 3018, 3019,
+		3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027,
+		3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035,
+		32767, 32767, 32767, 3036, 3037, 3038, 3039, 3040,
+		3041, 32767, 32767, 3042, 3043, 3044, 3045, 3046,
+		3047, 32767, 32767, 3048, 3049, 3050, 3051, 3052,
+		3053, 32767, 32767, 3054, 3055, 3056, 32767, 32767,
+		32767, -357, 3058, 3059, 3060, 3061, 1180, 3063,
+		0, 1179, 3065, 3066, 1181, 3391, 1181, 3070,
+		0, 0, 0, 0, 32767, 0, 0, 32767,
+		0, 32767, 0, 0, -4973, 32767, 32767, -7368,
+		-2202, -2201, -2200, -5507, -7372, -7372, -5507, -5507,
+		-5507, 32767, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 32767, 0, 0, 32767, 0,
+		-203, -2234, -732, -732, -732, -2234, -732, -732,
+		-2763, -1261, -1261, -1261, -2763, -1261, -1261, -1261,
+		-1261, -1261, -1261, -1261, -1261, -1261, -1261, -1091,
+		-1090, -1089, -1088, -1087, 32767, 32767, -1086, -1085,
+		-1084, -1083, -1082, -1081, -1080, -1079, -1078, -1077,
+		-1076, -1075, 32767, -1074, -1073, -1072, -1071, -1070,
+		-1069, -1068, -1067, -1066, -1065, -1064, -1063, -1062,
+		-1061, -1060, -1059, -1058, -1057, -1056, 32767, -1055,
+		-1054, -1053, -1052, 0, 32767, 32767, 32767, -1051,
+		-1050, -4463, 32767, -1048, 32767, -1047, -2928, -1045,
+		-1044, -2928, -1042, -1041, -2926, -716, -2926, -1037,
+		-1036, -1035, -539, -1033, -1032, -1031, -1030, -1029,
+		-1028, -2926, -1026, -1025, -1024, -1023, -2926, -1021,
+		-2926, -1019, -2926, -2926, -2926, -2926, -2926, -2926,
+		-1012, -2926, -2926, -2926, -2926, -1007, -2926, -1005,
+		-2926, -1003, -2926, -4891, -1000, -999, -2926, -997,
+		-996, -2926, -994, -2926, -2926, -991, 4475, 4476,
+		4477, 4478, 4479, 4480, -2924, -981, -2924, -979,
+		-4604, 2380, 2381, -2784, -2784, -2784, 524, 2390,
+		2391, 527, 528, 529, 530, 531, 532, -2766,
+		-2766, -557, -2766, 534, -2766, -2766, 535, 536,
+		-4627, -4627, 539, 540, 541, -2766, -4631, -4631,
+		-2766, -2766, -2766, -2766, -2766, -2766, -2766, -2766,
+		-1676, -2766, 0, 0, 0, 0, 0, 5404,
+		5405, 5406, 0, 5408, 5409, 0, 0, 0,
+		-2767, 2031, 0, 1502, 1502, 1502, 0, 1502,
+		1502, 1502, 1502, 1502, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 224, 225, 226, 32767, 227, 228, 229,
+		230, 231, 232, 233, 234, 235, 236, 67,
+		32767, 66, 66, 66, 66, 66, 66, 66,
+		66, 66, 66, 66, 66, 66, 66, 66,
+		66, 66, 66, 32767, 65, 65, 65, 65,
+		65, 65, 65, 65, 65, 65, 65, 65,
+		65, 65, 65, 65, 65, 65, 65, 65,
+		65, 65, 65, 65, 65, 65, 65, 65,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -271, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1940, 18, 1942, 3908, 18, 18, 1946, 18,
+		18, 1949, 18, 1951, 1952, 18, 1954, 18,
+		-5445, -5445, -5445, -5445, 1960, 18, 1962, 18,
+		3644, -3339, -3339, 1827, 1828, 1829, -1478, -3343,
+		-3343, -1478, -1478, -1478, -1478, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+		0, 32767, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 1340, 1341,
+		1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349,
+		-2064, 1351, 1352, 1353, 1354, 32767, 1355, 1356,
+		32767, 0, 32767, 32767, 1679, 32767, 1357, 1358,
+		1359, 1855, 1361, 1362, 1363, 1364, 1365, 1366,
+		32767, 1367, 1368, 1369, 1370, 32767, 1371, 32767,
+		1372, 32767, 32767, 32767, 32767, 32767, 32767, 1373,
+		32767, 32767, 32767, 32767, 1374, 32767, 1375, 32767,
+		1376, 32767, -2513, 1378, 1379, 32767, 1380, 1381,
+		32767, 1382, 32767, 32767, 1383, 32767, 1384, 32767,
+		6848, 32767, 6849, 32767, 1387, 32767, 1388, 1389,
+		32767, 1390, 32767, 32767, 1391, 1392, 1393, 1394,
+		32767, 1395, 1396, 1397, 1398, 1399, 1400, 1401,
+		32767, 1402, 1403, 1404, 1405, 32767, 1406, 1407,
+		1408, 1409, 32767, 1410, 32767, 1411, 1412, 1413,
+		1414, 1415, 1416, 1417, 1418, 1419, 1420, 32767,
+		1421, 1422, 1423, 1424, 1425, 0, 0, 0,
+		4575, 4576, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, -571, -571,
+		-571, 0, -572, 8101, 5150, 5150, 5150, 5337,
+		8103, 5150, 8104, 8105, 2038, 5145, 2039, 5150,
+		2040, 5150, 2041, 5150, 5150, 5138, 5150, 5150,
+		5150, 5150, 5150, 8108, 8109, 8110, 5150, 5150,
+		5384, 5150, 0, 5151, 5151, 5151, 5535, 5151,
+		5151, 5151, 5537, 5538, 5539, 5540, 5541, 5542,
+		5543, 5544, 5545, 5546, 5547, 5151, 5151, 2572,
+		2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572,
+		2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572,
+		2572, 2572, 2572, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 2580,
+		2580, 2580, 2580, 2580, 2580, 2580, 0, 2580,
+		0, 2580, 0, 0, 0, 2580, 2580, 2580,
+		0, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+		0, 2580, 0, 0, 0, 2580, 2580, 2580,
+		5517, 5518, 5519, 5520, 5521, 5522, -6, -6,
+		-6, 0, 0, 0, 0, 2581, 2581, 2581,
+		2581, 5527, 2581, 2581, 2581, 2581, 0, 5528,
+		0, 2581, 0, 0, 2581, 2581, 0, 0,
+		0, 0, 0, 0, 5529, 5530, 5531, 32767,
+		32767, 2579, 2579, 2579, 2579, 2579, 0, 0,
+		2579, 2579, 2579, 2765, 0, 0, 0, 0,
+		2579, 2579, 2579, 2579, 6066, 2579, 6066, 2579,
+		2579, 2579, 0, 0, 0, 2579, 2579, 0,
+		0, 0, 2579, 2579, 2579, 5530, 2579, 2579,
+		2579, 2766, 5532, 2579, 5533, 5534, -533, 2574,
+		-532, 2579, -531, 2579, -530, 2579, 2579, 2567,
+		2579, 2579, 2579, 2579, 2579, 5537, 5538, 5539,
+		2579, 2579, 2813, 2579, 2579, 2579, 2579, 2579,
+		2963, 2579, 2579, 2579, 2965, 2966, 2967, 2968,
+		2969, 2970, 2971, 2972, 2973, 2974, 2975, 2579,
+		2579, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 32767, 32767, 32767,
+		32767, 32767, 331, 32767, 332, -2580, -2580, -2580,
+		-2580, 0, 0, 0, 0, 0, 0, 0,
+		-2580, 0, -2580, 0, -2580, -2580, -2580, 0,
+		0, 0, -2580, 0, 0, 0, 0, 0,
+		0, 0, -2580, 0, -2580, -2580, -2580, 0,
+		0, 0, 2937, 2938, 2939, 2940, 2941, 2942,
+		-2586, -2586, -2586, -2580, -2125, -2581, -2581, 0,
+		0, 0, 0, 2946, 0, 0, 0, 0,
+		-2581, 2947, -2581, 0, -2581, -2581, 0, 0,
+		-2581, -2581, -2581, -2581, -2581, -2581, 2948, 2949,
+		2950, 2945, 2491, 0, 0, 0, 0, 0,
+		-2579, -2579, 0, 0, 0, 186, -2579, -2579,
+		-2579, -2579, 0, 0, 0, 0, 3487, 0,
+		3487, 0, 0, 0, -2579, -2579, -2579, 0,
+		0, -2579, -2579, -2579, 0, 0, 0, 2951,
+		0, 0, 0, 187, 2953, 0, 2954, 2955,
+		-3112, -5, -3111, 0, -3110, 0, -3109, 0,
+		0, -12, 0, 0, 0, 0, 0, 2958,
+		2959, 2960, 0, 0, 234, 0, 0, 0,
+		0, 0, 384, 0, 0, 0, 386, 387,
+		388, 389, 390, 391, 392, 393, 394, 395,
+		396, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, -1706, -1706, -1706, 0, 0, 0,
+		0, 385, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 397,
+		398, 399, 400, 401, 402, 403, 404, 405,
+		2112, 2113, 2114, 409, 410, 411, 412, 32767,
+		413, 414, 415, 416, 417, 418, 419, 420,
+		421, 422, 423, 424, 425, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		-1688, 32767, 32767, 32767, 32767, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+		0, -752, -751, -750, -749, 0, -748, -747,
+		-746, 0, -745, -744, -743, -742, -741, -740,
+		-739, -4152, -737, -736, -735, 0, -2616, -733,
+		0, 0, -732, -731, -2616, -406, -2616, 0,
+		0, -727, -231, -725, 0, -724, 0, -723,
+		0, -2621, 0, -721, -720, -719, -2622, 0,
+		-2623, -716, -2623, 0, -2624, -2624, -2624, -2624,
+		-710, -2624, -2624, 0, -2625, -706, -2625, -704,
+		-2625, -702, 0, 0, 0, 0, -2629, -700,
+		-699, -2629, -697, 0, 0, 0, 0, 0,
+		0, 4767, 4768, 4769, -2635, -692, -2635, -690,
+		-4315, 2669, 2670, -2495, -2495, -2495, 813, 2679,
+		2680, 816, 817, 818, 819, 820, 821, -2477,
+		-2477, -268, -2477, 823, -2477, -2477, 824, 825,
+		-4338, -4338, 828, 829, 830, -2477, -4342, -4342,
+		-2477, -2477, -2477, -2477, -2477, -2477, -2477, -2477,
+		-1387, 0, 0, 32767, 32767, 0, 0, 0,
+		0, 0, -2486, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 1756, 1757, 1758,
+		1759, -5645, -3702, -5645, -3700, -7325, -341, -340,
+		-5505, -5505, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 532, 533,
+		32767, 534, 535, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -781, 1084, 1084, 1084, 1084,
+		1084, 1084, 4383, 4384, 2176, 4386, 1087, 4388,
+		4389, 1089, 1089, 6253, 6254, 1089, 1089, 1089,
+		4397, 6263, 6264, 4400, 4401, 4402, 4403, 4404,
+		4405, 4406, 4407, 3318, 4409, 4410, 4411, 4412,
+		4413, 4414, -749, -749, 4417, 4418, 4419, 4420,
+		4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428,
+		4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436,
+		4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444,
+		4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452,
+		4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460,
+		4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468,
+		4469, 1056, 4471, 4472, 4473, 4474, 2593, 4476,
+		4477, 2593, 4479, 4480, 2595, 4805, 2595, 4484,
+		4485, 4486, 4982, 4488, 4489, 4490, 4491, 4492,
+		4493, 2595, 4495, 4496, 4497, 4498, 2595, 4500,
+		2595, 4502, 2595, 2595, 2595, 2595, 2595, 2595,
+		4509, 2595, 2595, 2595, 2595, 4514, 2595, 4516,
+		2595, 4518, 2595, 630, 4521, 4522, 2595, 4524,
+		4525, 2595, 4527, 2595, 2595, 4530, 2595, 4532,
+		9996, 9997, 9998, 9999, 2595, 4538, 2595, 4540,
+		4541, 2595, 4543, 2595, 2595, 4546, 4547, 4548,
+		4549, 2595, 4551, 4552, 4553, 4554, 4555, 4556,
+		4557, 2595, 4559, 4560, 4561, 4562, 2595, 4564,
+		4565, 4566, 4567, 2595, 4569, 2595, 4571, 4572,
+		4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580,
+		2595, 4582, 4583, 4584, 4585, 4586, 4587, 4588,
+		4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596,
+		4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604,
+		4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612,
+		4613, 4614, 4615, 4089, 4090, 4091, 4092, 4620,
+		4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100,
+		4101, 4102, 4103, 4104, 2765, 2765, 2765, 2765,
+		2765, 2765, 2765, 2765, 2765, 2765, 6179, 2765,
+		2765, 2765, 2765, 4647, 2765, 2765, 4650, 4122,
+		4652, 4653, 2444, 4655, 2767, 2767, 2767, 2272,
+		2767, 2767, 2767, 2767, 2767, 2767, 4666, 2767,
+		2767, 2767, 2767, 4671, 2767, 4673, 2767, 4675,
+		4676, 4677, 4678, 4679, 4680, 2767, 4682, 4683,
+		4684, 4685, 2767, 4687, 2767, 4689, 2767, 4691,
+		6657, 2767, 2767, 4695, 2767, 2767, 4698, 2767,
+		4700, 4701, 2767, 4703, 2767, -2696, -2696, -2696,
+		-2696, 4709, 2767, 4711, 2767, 2767, 4714, 2767,
+		4716, 4717, 2767, 2767, 2767, 2767, 4722, 2767,
+		2767, 2767, 2767, 2767, 2767, 2767, 4730, 2767,
+		2767, 2767, 2767, 4735, 2767, 2767, 2767, 2767,
+		4740, 2767, 4742, 2767, 2767, 2767, 2767, 2767,
+		2767, 2767, 2767, 2767, 2767, 4753, 2767, 2767,
+		2767, 2767, 2767, 4193, 4194, 4195, -379, -379,
+		4198, 4199, 4200, 4201, 4202, 4203, 4204, 4771,
+		4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779,
+		4780, -3892, -940, -939, -938, 4785, -3890, -936,
+		-3889, -3889, 2179, -927, 2180, -930, 2181, -928,
+		2182, -926, -925, -912, -923, -922, -921, 4803,
+		4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811,
+		4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819,
+		3925, 4821, 4822, 4823, 4824, 4825, 4826, 4827,
+		4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835,
+		4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843,
+		4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851,
+		4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859,
+		4860, 4710, 2086, 609, 4864, 4865, 4866, 4867,
+		4868, 4869, 4870, 4871, 4872, 3052, 4874, 4875,
+		4876, 4281, 4878, 4879, 4880, 4881, 4882, 4883,
+		4884, 4885, 4886, 4887, 634, 4888, 4889, 4890,
+		4891, 4892, 4893, 4894, 4895, 4896, 1322, 1322,
+		1322, 1322, 1322, 1322, 1322, 4904, 338, 4906,
+		4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914,
+		4915, 4916, 4917, 665, 666, 667, 668, 669,
+		670, 671, 672, 673, 674, 675, 676, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		0, 0, 0, 0, 0, 32767, 0, 0,
+		0, 0, 32767, 32767, 0, 0, 0, 0,
+		0, 0, 0, 0, 32767, 0, 0, 0,
+		0, 0, 0, 0, 32767, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 32767, 0, 0, 0, 2478, 32767, 2477,
+		2477, 2477, 2477, 2477, 32767, 2476, 32767, 32767,
+		32767, 2473, 2473, 2473, 2473, 2473, 2473, 2473,
+		32767, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+		2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+		2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+		2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+		2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+		2472, 2472, 2472, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, -2478, -2478, -2478, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0, 0, 0, 0,
+		0, 0, 0, 0, 0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 9837] + h[b % 9837];
+}
+
+static const unicode_norm_info UnicodeNormInfo_NFKC_QC = {
+	UnicodeNormProps_NFKC_QC,
+	NFKC_QC_hash_func,
+	4918
+};
-- 
2.22.0

#2Mark Dilger
mark.dilger@enterprisedb.com
In reply to: John Naylor (#1)
Re: speed up unicode normalization quick check

On May 21, 2020, at 12:12 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:

Hi,

Attached is a patch to use perfect hashing to speed up Unicode
normalization quick check.

0001 changes the set of multipliers attempted when generating the hash
function. The set in HEAD works for the current set of NFC codepoints,
but not for the other types. Also, the updated multipliers now all
compile to shift-and-add on most platform/compiler combinations
available on godbolt.org (earlier experiments found in [1]). The
existing keyword lists are fine with the new set, and don't seem to be
very picky in general. As a test, it also successfully finds a
function for the OS "words" file, the "D" sets of codepoints, and for
sets of the first n built-in OIDs, where n > 5.

Prior to this patch, src/tools/gen_keywordlist.pl is the only script that uses PerfectHash. Your patch adds a second. I'm not convinced that modifying the PerfectHash code directly each time a new caller needs different multipliers is the right way to go. Could you instead make them arguments such that gen_keywordlist.pl, generate-unicode_combining_table.pl, and future callers can pass in the numbers they want? Or is there some advantage to having it this way?


Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#3John Naylor
john.naylor@2ndquadrant.com
In reply to: Mark Dilger (#2)
Re: speed up unicode normalization quick check

On Fri, May 29, 2020 at 5:59 AM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:

On May 21, 2020, at 12:12 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:

very picky in general. As a test, it also successfully finds a
function for the OS "words" file, the "D" sets of codepoints, and for
sets of the first n built-in OIDs, where n > 5.

Prior to this patch, src/tools/gen_keywordlist.pl is the only script that uses PerfectHash. Your patch adds a second. I'm not convinced that modifying the PerfectHash code directly each time a new caller needs different multipliers is the right way to go.

Calling it "each time" with a sample size of two is a bit of a
stretch. The first implementation made a reasonable attempt to suit
future uses and I simply made it a bit more robust. In the text quoted
above you can see I tested some scenarios beyond the current use
cases, with key set sizes as low as 6 and as high as 250k.

Could you instead make them arguments such that gen_keywordlist.pl, generate-unicode_combining_table.pl, and future callers can pass in the numbers they want? Or is there some advantage to having it this way?

That is an implementation detail that callers have no business knowing about.

--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#4Mark Dilger
mark.dilger@enterprisedb.com
In reply to: John Naylor (#3)
Re: speed up unicode normalization quick check

On May 28, 2020, at 8:54 PM, John Naylor <john.naylor@2ndquadrant.com> wrote:

On Fri, May 29, 2020 at 5:59 AM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:

On May 21, 2020, at 12:12 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:

very picky in general. As a test, it also successfully finds a
function for the OS "words" file, the "D" sets of codepoints, and for
sets of the first n built-in OIDs, where n > 5.

Prior to this patch, src/tools/gen_keywordlist.pl is the only script that uses PerfectHash. Your patch adds a second. I'm not convinced that modifying the PerfectHash code directly each time a new caller needs different multipliers is the right way to go.

I forgot in my first round of code review to mention, "thanks for the patch". I generally like what you are doing here, and am trying to review it so it gets committed.

Calling it "each time" with a sample size of two is a bit of a
stretch. The first implementation made a reasonable attempt to suit
future uses and I simply made it a bit more robust. In the text quoted
above you can see I tested some scenarios beyond the current use
cases, with key set sizes as low as 6 and as high as 250k.

I don't really have an objection to what you did in the patch. I'm not going to lose any sleep if it gets committed this way.

The reason I gave this feedback is that I saved the *kwlist_d.h files generated before applying the patch, and compared them with the same files generated after applying the patch, and noticed a very slight degradation. Most of the files changed without any expansion, but the largest of them, src/common/kwlist_d.h, changed from

static const int16 h[901]

to

static const int16 h[902]

suggesting that even with your reworking of the parameters for PerfectHash, you weren't able to find a single set of numbers that worked for the two datasets quite as well as different sets of numbers each tailored for a particular data set. I started to imagine that if we wanted to use PerfectHash for yet more stuff, the problem of finding numbers that worked across all N data sets (even if N is only 3 or 4) might be harder still. That's all I was referring to. 901 -> 902 is such a small expansion that it might not be worth worrying about.


Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#5John Naylor
john.naylor@2ndquadrant.com
In reply to: Mark Dilger (#4)
Re: speed up unicode normalization quick check

On Sat, May 30, 2020 at 12:13 AM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:

I forgot in my first round of code review to mention, "thanks for the patch". I generally like what you are doing here, and am trying to review it so it gets committed.

And I forgot to say thanks for taking a look!

The reason I gave this feedback is that I saved the *kwlist_d.h files generated before applying the patch, and compared them with the same files generated after applying the patch, and noticed a very slight degradation. Most of the files changed without any expansion, but the largest of them, src/common/kwlist_d.h, changed from

static const int16 h[901]

to

static const int16 h[902]

Interesting, I hadn't noticed. With 450 keywords, we need at least 901
elements in the table. Since 901 is divisible by the new hash
multiplier 17, this gets triggered:

# However, it would be very bad if $nverts were exactly equal to either
# $hash_mult1 or $hash_mult2: effectively, that hash function would be
# sensitive to only the last byte of each key. Cases where $nverts is a
# multiple of either multiplier likewise lose information. (But $nverts
# can't actually divide them, if they've been intelligently chosen as
# primes.) We can avoid such problems by adjusting the table size.
while ($nverts % $hash_mult1 == 0
|| $nverts % $hash_mult2 == 0)
{
$nverts++;
}

This is harmless, and will go away next time we add a keyword.

--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#6John Naylor
john.naylor@2ndquadrant.com
In reply to: John Naylor (#5)
3 attachment(s)
Re: speed up unicode normalization quick check

Attached is version 4, which excludes the output file from pgindent,
to match recent commit 74d4608f5. Since it won't be indented again, I
also tweaked the generator script to match pgindent for the typedef,
since we don't want to lose what pgindent has fixed already. This last
part isn't new to v4, but I thought I'd highlight it anyway.

--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

v4-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patchapplication/x-patch; name=v4-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patchDownload
From de9d213855ea4fdc56cd0602d63f5f704283940d Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Tue, 12 May 2020 17:45:49 +0800
Subject: [PATCH v4 1/3] Tweak the set of candidate multipliers for generating
 perfect hash functions

The previous set of multipliers were inadequate for large sets of short
keys. A future commit will have that as a use case, so increase the
maximum size of multipliers attempted. Experimentation shows that the
existing callers are still happy with the smallest pair of multipliers.

Also make sure all multipliers compile to shift-and-add instructions
on most platforms. On x86-64 this was confirmed as far back as gcc 4.1
and clang 3.8.
---
 src/tools/PerfectHash.pm | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index 74fb1f2ef6..d6841589a3 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -81,13 +81,13 @@ sub generate_hash_function
 	# to calculate via shift-and-add, so don't change them without care.
 	# (Commonly, random seeds are tried, but we want reproducible results
 	# from this program so we don't do that.)
-	my $hash_mult1 = 31;
+	my $hash_mult1 = 257;
 	my $hash_mult2;
 	my $hash_seed1;
 	my $hash_seed2;
 	my @subresult;
   FIND_PARAMS:
-	foreach (127, 257, 521, 1033, 2053)
+	foreach (17, 31, 127, 8191)
 	{
 		$hash_mult2 = $_;    # "foreach $hash_mult2" doesn't work
 		for ($hash_seed1 = 0; $hash_seed1 < 10; $hash_seed1++)
-- 
2.22.0

v4-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patchapplication/x-patch; name=v4-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patchDownload
From 7e98ecd444b35416050cc3952804ddd995ff7fd6 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Thu, 17 Sep 2020 22:59:34 -0400
Subject: [PATCH v4 2/3] Use perfect hashing for NFC Unicode normalization
 quick check

This makes the normalization check about 30% faster, while only adding 5kB
to the binary size. The hash lookup reuses the existing array of bitfields
used for binary search to get the quick check property and is generated as
part of make update-unicode.

NFKC quick check still uses binary search, simply to make the patch smaller.
---
 .../generate-unicode_normprops_table.pl       |  38 +-
 src/common/unicode_norm.c                     |  36 +-
 src/include/common/unicode_normprops_table.h  | 344 ++++++++++++++++++
 src/tools/pgindent/exclude_file_patterns      |   6 +-
 4 files changed, 415 insertions(+), 9 deletions(-)

diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index e8e5097c09..7f00cb0ae4 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -9,6 +9,10 @@
 use strict;
 use warnings;
 
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
 my %data;
 
 print
@@ -17,6 +21,8 @@ print
 print <<EOS;
 #include "common/unicode_norm.h"
 
+typedef int (*qc_hash_func) (const void *key);
+
 /*
  * We use a bit field here to save space.
  */
@@ -24,7 +30,14 @@ typedef struct
 {
 	unsigned int codepoint:21;
 	signed int	quickcheck:4;	/* really UnicodeNormalizationQC */
-}			pg_unicode_normprops;
+} pg_unicode_normprops;
+
+typedef struct
+{
+	const pg_unicode_normprops *normprops;
+	qc_hash_func hash;
+	int			num_normprops;
+} unicode_norm_info;
 EOS
 
 foreach my $line (<ARGV>)
@@ -66,6 +79,7 @@ foreach my $prop (sort keys %data)
 	  "static const pg_unicode_normprops UnicodeNormProps_${prop}[] = {\n";
 
 	my %subdata = %{ $data{$prop} };
+	my @cp_packed;
 	foreach my $cp (sort { $a <=> $b } keys %subdata)
 	{
 		my $qc;
@@ -82,7 +96,29 @@ foreach my $prop (sort keys %data)
 			die;
 		}
 		printf "\t{0x%04X, %s},\n", $cp, $qc;
+
+		# Save the bytes as a string in network order.
+		push @cp_packed, pack('N', $cp);
 	}
 
 	print "};\n";
+
+	# Emit the definition of the hash function.
+
+	# To save space, skip building the function for the larger "C" form.
+	next if $prop eq "NFKC_QC";
+
+	my $funcname = $prop . '_hash_func';
+
+	my $f = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
+		fixed_key_length => 4);
+	print "\nstatic $f\n";
+
+	# Emit the struct that wraps the hash lookup info into one variable.
+	printf "static const unicode_norm_info ";
+	printf "UnicodeNormInfo_%s = {\n", $prop;
+	printf "\tUnicodeNormProps_%s,\n", $prop;
+	printf "\t%s,\n",                  $funcname;
+	printf "\t%d\n",                   scalar @cp_packed;
+	printf "};\n";
 }
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index ab5ce59345..1714837e64 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -476,6 +476,34 @@ qc_compare(const void *p1, const void *p2)
 	return (v1 - v2);
 }
 
+static const pg_unicode_normprops *
+qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
+{
+	int			h;
+	uint32		hashkey;
+
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = htonl(ch);
+	h = norminfo->hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= norminfo->num_normprops)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (ch != norminfo->normprops[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &norminfo->normprops[h];
+}
+
 /*
  * Look up the normalization quick check character property
  */
@@ -483,18 +511,14 @@ static UnicodeNormalizationQC
 qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
 {
 	pg_unicode_normprops key;
-	pg_unicode_normprops *found = NULL;
+	const pg_unicode_normprops *found = NULL;
 
 	key.codepoint = ch;
 
 	switch (form)
 	{
 		case UNICODE_NFC:
-			found = bsearch(&key,
-							UnicodeNormProps_NFC_QC,
-							lengthof(UnicodeNormProps_NFC_QC),
-							sizeof(pg_unicode_normprops),
-							qc_compare);
+			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
 			break;
 		case UNICODE_NFKC:
 			found = bsearch(&key,
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 93a2e55b75..5e1e382af5 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -2,6 +2,8 @@
 
 #include "common/unicode_norm.h"
 
+typedef int (*qc_hash_func) (const void *key);
+
 /*
  * We use a bit field here to save space.
  */
@@ -11,6 +13,13 @@ typedef struct
 	signed int	quickcheck:4;	/* really UnicodeNormalizationQC */
 } pg_unicode_normprops;
 
+typedef struct
+{
+	const pg_unicode_normprops *normprops;
+	qc_hash_func hash;
+	int			num_normprops;
+} unicode_norm_info;
+
 static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
 	{0x0300, UNICODE_NORM_QC_MAYBE},
 	{0x0301, UNICODE_NORM_QC_MAYBE},
@@ -1245,6 +1254,341 @@ static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
 	{0x2FA1D, UNICODE_NORM_QC_NO},
 };
 
+static int
+NFC_QC_hash_func(const void *key)
+{
+	static const int16 h[2463] = {
+		     0,  -2717,      0,    221,   1293,    223,   1295,    225,
+		   226,    241,      0,    229,    230,    231,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  -386,      0,      0,      0,      0,      0,      0,      0,
+		  -163,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  -246,   -175,   1260,      0,      0,      0,   -174,   -173,
+		     0,   -172,      0,      0,      0,      0,      0,      0,
+		  1049,      0,    300,    301,   1071,      0,   1071,      0,
+		  1071,   1071,   1057,      0,      0,      0,      0,   1061,
+		     0,  -1053,   1664,      0,   2956,      0,      0,    -13,
+		     0,      0,      0,      0,   2156,      0,      0,      0,
+		     0,      0,      0,      0,     71,      0,   1082,      0,
+		  1083,   1083,      0,   1084,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,    359,    360,    361,
+		 -1091,    363,   -762,   -130,   -129,   -128,   -127,   -126,
+		   137,   -124,   -708,   -707,   -706,   -120,   -185,   -705,
+		  -117,   -184,  -1307,   -114,   -113,   -112,   -111,      0,
+		   386,    387,    388,    389,    -90,    391,    171,    172,
+		   394,    -94,   -183,    397,    398,    399,    -98,   -225,
+		   402,  -1019,   -636,  -1019,   -225,    407,    408,    409,
+		   410,    411,    674,    413,   -171,   -170,   -169,    417,
+		   352,   -168,    420,    353,   -770,    423,    424,    425,
+		   426,    427,    428,  32767,    239,    239,    239,    239,
+		   239,    239,    239,    239,    239,    239,    239,    239,
+		   239,    239,  32767,  32767,    237,  32767,    236,  32767,
+		 32767,    234,    234,    234,    234,    617,    234,    234,
+		   234,  -2483,    234,  -1430,   1526,  -1430,   1527,     47,
+		    48,    471,    230,  32767,  32767,  32767,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		  -159,    227,    227,    227,    227,    227,    227,    227,
+		    64,    227,    227,    227,    227,    227,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		   -19,     52,   1487,    227,    227,    227,     53,     54,
+		   227,     55,    227,    227,    227,    227,    227,    227,
+		  1276,    227,   -989,  32767,   1296,    225,   1296,    225,
+		  1296,   1296,   1282,    225,    225,    225,    225,   1286,
+		   225,   -828,   1889,    225,   3181,    225,    225,    212,
+		   225,    225,    225,    225,   2381,    225,    225,    225,
+		   225,    225,    225,    225,    296,    225,   1307,    225,
+		  1308,   1308,    225,   1309,    225,    225,    225,    225,
+		   225,    225,    225,    225,    225,    225,    225,    225,
+		   225,    225,    225,    225,    225,    584,    585,    586,
+		  -866,    588,   -537,     95,     96,     97,     98,     99,
+		   362,    101,   -483,   -482,   -481,    105,     40,   -480,
+		   108,     41,  -1082,    111,    112,    113,    114,    225,
+		   611,    612,    613,    614,    135,    616,    396,    397,
+		   619,    131,     42,    622,    623,    624,    127,      0,
+		   627,   -794,   -411,   -794,      0,    632,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  -272,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,   -166,   -165,  32767,  32767,  32767,  32767,
+		  -164,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    397,  32767,    396,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    386,
+		     0,    386,    386,    386,    386,    386,    386,    386,
+		   223,    386,    386,    386,  32767,    385,    385,    385,
+		   385,    385,  32767,    384,  32767,    383,    383,  32767,
+		   382,    382,  32767,    381,    381,    381,    381,    381,
+		   135,    206,   1641,    381,  32767,  32767,  32767,  32767,
+		 32767,  32767,   -160,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   1148,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		 32767,  32767,  32767,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   -257,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   -910,   -910,  32767,  32767,
+		     0,  32767,      0,  32767,      0,  32767,      0,  32767,
+		   147,  32767,      0,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    143,  32767,    144,  32767,    145,
+		 32767,    146,  32767,      0,  32767,    148,  32767,    149,
+		 32767,  32767,  32767,   -160,  32767,  32767,  32767,  32767,
+		 32767,  32767,     15,  32767,  32767,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   145,  32767,    144,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,   -148,  32767,  32767,  32767,  32767,
+		 32767,  32767,   2009,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,    135,   -918,  32767,
+		   151,  32767,  32767,      0,      1,      2,      3,      4,
+		   133,      5,      6,      7,      8,      9,     10,     11,
+		 32767,  32767,  -1248,  32767,     13,    154,    188,    188,
+		 32767,  32767,  32767,  32767,  32767,    155,     16,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -1853,  -1054,     18,
+		 -1052,  -1051,  -1036,     22,  32767,    157,  32767,     28,
+		    23,   1077,    673,     25,  -2930,      0,  32767,  32767,
+		 32767,  32767,  32767,     27,  32767,    155,  32767,    154,
+		 32767,  32767,    -62,     28,    -42,     30,  -1051,     32,
+		 -1050,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,     34,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    129,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    672,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,      0,  32767,
+		 32767,  32767,  32767,  32767,   -156,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -155,  32767,  32767,
+		 32767,      0,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		    73,  32767,  32767,  32767,  32767,     74,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    675,
+		 32767,  32767,  32767,  32767,  32767,     75,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    165,  32767,  32767,  32767,    166,    167,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    170,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    689,    690,    691,    692,    693,    694,    695,
+		   696,    697,    698,    699,    700,    701,    702,    703,
+		   704,    705,    706,    707,    708,    709,    710,    711,
+		   712,    713,    714,    715,    716,    717,    718,    719,
+		   720,    721,    722,   -304,   -303,   -302,   -301,   -300,
+		  -299,   -298,   -297,    930,   -295,   -294,   -293,   -292,
+		  -291,   -290,   -289,   -288,   -287,   -286,   -285,   -284,
+		  -283,   -282,   -281,   -280,   -279,   -278,   -277,   -276,
+		  -275,    753,    754,    755,    646,    757,   -712,  -1765,
+		   952,   -712,   2244,   -712,   2245,    765,    766,    767,
+		   768,    125,    770,    771,    772,    773,    774,    775,
+		   603,    777,    778,    779,    780,    781,    782,    783,
+		   784,   2011,    786,    787,    788,    789,    790,    791,
+		   792,    793,    794,    795,    796,    797,    798,    799,
+		   800,    801,    802,    803,    804,    805,    806,    603,
+		   603,    809,    603,    811,    603,    603,    814,    815,
+		   816,    817,    435,    819,    820,    821,   3539,    823,
+		   603,   -468,    603,   -468,    603,    603,    589,    831,
+		   603,    603,    603,    835,    836,    837,    838,    839,
+		   840,    841,    842,    843,    844,    845,    846,    847,
+		   848,    849,    850,    851,    852,   1239,    854,    855,
+		   856,    857,    858,    859,    860,   1024,    862,    863,
+		   864,    865,    866,    867,    868,    869,    870,    871,
+		   872,    873,    874,    875,    876,    877,    878,    879,
+		   880,    881,    882,    883,    884,   1131,   1061,   -373,
+		   888,    889,    890,   1065,   1065,    893,   1066,    895,
+		   896,    897,    898,    899,    900,   -148,    902,    603,
+		   603,   -166,    906,   -164,    908,   -162,   -161,   -146,
+		   912,    913,    914,    915,   -145,    917,   1971,   -745,
+		   920,  -2035,    922,    923,    937,    925,    926,    927,
+		   928,  -1227,    930,    931,    932,    933,    934,    935,
+		   936,    866,    938,   -143,    940,   -142,   -141,    943,
+		  -140,  32767,    945,    946,    947,    948,    949,    950,
+		   951,    952,    953,    954,    955,    956,    957,    958,
+		   959,    960,    961,    -65,    -64,    -63,    -62,    -61,
+		   -60,    -59,    -58,   1169,    -56,    -55,    -54,    -53,
+		   -52,    -51,    -50,    -49,    -48,    -47,    -46,    -45,
+		   -44,    -43,    -42,    -41,    -40,    -39,    -38,    -37,
+		   -36,    992,    993,    994,    885,    996,   -473,  -1526,
+		  1191,   -473,   2483,   -473,   2484,   1004,   1005,   1006,
+		  1007,    364,   1009,   1010,   1011,   1012,   1013,   1014,
+		   842,   1016,   1017,   1018,   1019,   1020,   1021,   1022,
+		  1023,   2250,   1025,   1026,   1027,   1028,   1029,   1030,
+		  1031,   1032,   1033,   1034,   1035,   1036,   1037,   1038,
+		  1039,   1040,   1041,   1042,   1043,   1044,   1045,    842,
+		   842,   1048,    842,   1050,    842,    842,   1053,   1054,
+		  1055,   1056,    674,   1058,   1059,   1060,   3778,   1062,
+		   842,   -229,    842,   -229,    842,    842,    828,   1070,
+		   842,    842,    842,   1074,   1075,   1076,   1077,   1078,
+		  1079,   1080,   1081,   1082,   1083,   1084,   1085,   1086,
+		  1087,   1088,   1089,   1090,   1091,   1478,   1093,   1094,
+		  1095,   1096,   1097,   1098,   1099,   1263,   1101,   1102,
+		  1103,   1104,   1105,   1106,   1107,   1108,   1109,   1110,
+		  1111,   1112,   1113,   1114,   1115,   1116,   1117,   1118,
+		  1119,   1120,   1121,   1122,   1123,   1370,   1300,   -134,
+		  1127,   1128,   1129,   1304,   1304,   1132,   1305,   1134,
+		  1135,   1136,   1137,   1138,   1139,     91,   1141,    842,
+		   842,     73,   1145,     75,   1147,     77,     78,     93,
+		  1151,   1152,   1153,   1154,     94,   1156,   2210,   -506,
+		  1159,  -1796,   1161,   1162,   1176,   1164,   1165,   1166,
+		  1167,   -988,   1169,   1170,   1171,   1172,   1173,   1174,
+		  1175,   1105,   1177,     96,   1179,     97,     98,   1182,
+		    99,   1184,   1185,   1186,   1187,   1188,   1189,   1190,
+		  1191,   1192,   1193,   1194,   1195,   1196,   1197,   1198,
+		  1199,   1200,      0,    174,    175,    176,    177,    178,
+		   179,    180,    181,   1408,    183,    184,    185,    186,
+		   187,    188,    189,    190,    191,    192,    193,    194,
+		   195,    196,    197,    198,    199,    200,    201,    202,
+		   203,      0,      0,    206,      0,    208,      0,      0,
+		   211,    212,    213,    214,   -168,    216,    217,    218,
+		  2936,    220,      0,  -1071,      0,  -1071,      0,      0,
+		   -14,    228,      0,      0,      0,    232,    233,    234,
+		   235,    236,    237,    238,    239,    240,    241,    242,
+		   243,    244,    245,    246,    247,    248,    249,    636,
+		   251,    252,    253,    254,    255,    256,    257,    421,
+		   259,    260,    261,    262,    263,    264,    265,    266,
+		   267,    268,    269,    270,    271,    272,    273,    274,
+		   275,    276,    277,    278,    279,    280,    281,    528,
+		   458,   -976,    285,    286,    287,    462,    462,    290,
+		   463,    292,    293,    294,    295,    296,    297,   -751,
+		   299,      0,      0,   -769,    303,   -767,    305,   -765,
+		  -764,   -749,    309,    310,    311,    312,   -748,    314,
+		  1368,  -1348,    317,  -2638,    319,    320,    334,    322,
+		   323,    324,    325,  -1830,    327,    328,    329,    330,
+		   331,    332,    333,    263,    335,   -746,    337,   -745,
+		  -744,    340,   -743,    342,    343,    344,    345,    346,
+		   347,    348,    349,    350,    351,    352,    353,    354,
+		   355,    356,    357,    358,      0,      0,      0,   1453,
+		     0,   1126,    495,    495,    495,    495,    495,    233,
+		   495,   1080,   1080,   1080,    495,    561,   1082,    495,
+		   563,   1687,    495,    495,    495,    495,    385,      0,
+		     0,      0,      0,    480,      0,    221,    221,      0,
+		   489,    579,      0,      0,      0,    498,    626,      0,
+		  1422,   1040,   1424,    631,      0,      0,      0,      0,
+		     0,   -262,      0,    585,    585,    585,      0,     66,
+		   587,      0,     68,   1192,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,    669,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    670,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    142,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    115,    116,    117,    118,    119,    120,
+		   121,    122,    123,    124,    125,    126,    127,    128,
+		   129,    130,    131,    132,    133,    134,    135,    136,
+		   137,    138,    139,    140,    141,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   1027,   1027,   1027,
+		  1027,   1027,   1027,   1027,   1027,   -199,   1027,   1027,
+		  1027,   1027,   1027,   1027,   1027,   1027,   1027,   1027,
+		  1027,   1027,   1027,   1027,   1027,   1027,   1027,   1027,
+		  1027,   1027,   1027,      0,      0,      0,    110,      0,
+		  1470,   2524,   -192,   1473,  -1482,   1475,  -1481,      0,
+		     0,      0,      0,    644,      0,      0,      0,      0,
+		     0,      0,    173,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -1226,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    204,    205,      0,    207,      0,    209,    210,
+		     0,      0,      0,      0,    383,      0,      0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 0;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 17 + c;
+	}
+	return h[a % 2463] + h[b % 2463];
+}
+
+static const unicode_norm_info UnicodeNormInfo_NFC_QC = {
+	UnicodeNormProps_NFC_QC,
+	NFC_QC_hash_func,
+	1231
+};
+
 static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
 	{0x00A0, UNICODE_NORM_QC_NO},
 	{0x00A8, UNICODE_NORM_QC_NO},
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index b2e9d8f654..7022aa7c80 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -10,9 +10,11 @@ src/include/jit/llvmjit\.h$
 # This confuses pgindent, and it's a derived file anyway.
 src/backend/utils/fmgrtab\.c$
 #
-# kwlist_d files are made by gen_keywordlist.pl.  While we could insist that
-# they match pgindent style, they'd look worse not better, so exclude them.
+# Exclude files with hash functions generated via PerfectHash.pm.
+# While we could insist that they match pgindent style, they'd look
+# worse not better, so exclude them.
 kwlist_d\.h$
+src/include/common/unicode_normprops_table\.h$
 #
 # Exclude ecpg test files to avoid breaking the ecpg regression tests
 # (but include files at the top level of the ecpg/test/ directory).
-- 
2.22.0

v4-0003-Use-perfect-hashing-for-NKFC-Unicode-normalizatio.patchapplication/x-patch; name=v4-0003-Use-perfect-hashing-for-NKFC-Unicode-normalizatio.patchDownload
From 36eda71568c5bc032d9eb5eb6ba6489b6225990d Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Thu, 17 Sep 2020 22:14:58 -0400
Subject: [PATCH v4 3/3] Use perfect hashing for NKFC Unicode normalization
 quick check

This is about 50% faster than binary search. Also remove the ability to
use binary search for quick check.
---
 .../generate-unicode_normprops_table.pl       |    3 -
 src/common/unicode_norm.c                     |   20 +-
 src/include/common/unicode_normprops_table.h  | 1257 +++++++++++++++++
 3 files changed, 1258 insertions(+), 22 deletions(-)

diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index 7f00cb0ae4..e0a201b6d1 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -105,9 +105,6 @@ foreach my $prop (sort keys %data)
 
 	# Emit the definition of the hash function.
 
-	# To save space, skip building the function for the larger "C" form.
-	next if $prop eq "NFKC_QC";
-
 	my $funcname = $prop . '_hash_func';
 
 	my $f = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 1714837e64..5d951fc2e0 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -465,17 +465,6 @@ get_canonical_class(pg_wchar ch)
 		return entry->comb_class;
 }
 
-static int
-qc_compare(const void *p1, const void *p2)
-{
-	uint32		v1,
-				v2;
-
-	v1 = ((const pg_unicode_normprops *) p1)->codepoint;
-	v2 = ((const pg_unicode_normprops *) p2)->codepoint;
-	return (v1 - v2);
-}
-
 static const pg_unicode_normprops *
 qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
 {
@@ -510,22 +499,15 @@ qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
 static UnicodeNormalizationQC
 qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
 {
-	pg_unicode_normprops key;
 	const pg_unicode_normprops *found = NULL;
 
-	key.codepoint = ch;
-
 	switch (form)
 	{
 		case UNICODE_NFC:
 			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
 			break;
 		case UNICODE_NFKC:
-			found = bsearch(&key,
-							UnicodeNormProps_NFKC_QC,
-							lengthof(UnicodeNormProps_NFKC_QC),
-							sizeof(pg_unicode_normprops),
-							qc_compare);
+			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFKC_QC);
 			break;
 		default:
 			Assert(false);
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 5e1e382af5..bac3cc5cdb 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -6509,3 +6509,1260 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
 	{0x2FA1C, UNICODE_NORM_QC_NO},
 	{0x2FA1D, UNICODE_NORM_QC_NO},
 };
+
+static int
+NFKC_QC_hash_func(const void *key)
+{
+	static const int16 h[9837] = {
+		 -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,
+		 -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,
+		 -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,
+		 -2472,  -2472,  -2472,  -2472,  -2472,  32767,  32767,  32767,
+		 -2475,  -2475,  -2475,  -2475,  -2475,  -2475,  -2475,  -2475,
+		 -2475,  -2475,  -2475,  -2475,  -2475,  -2475,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    865,    865,    865,    865,    865,    865,    865,
+		   865,    865,    865,    865,  -2255,  32767,  -5207,  32767,
+		 -5207,    860,    860,    860,    860,    860,    860,    860,
+		   860,    860,   4250,    861,    861,    861,   3339,   3339,
+		  3339,   3339,   3339,   3339,   3339,   3339,   3339,   3339,
+		  3339,   3339,   3339,   3339,   3339,   3339,   3339,   3339,
+		 32767,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,      9,     10,  32767,     11,     12,      0,  32767,
+		     0,   2913,   2914,   2915,   2916,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2917,  32767,   2918,   -100,
+		  2919,   2920,   2921,    840,    840,    840,   2922,      0,
+		     0,      0,      0,      0,   2206,      0,   2923,      0,
+		  2924,   2925,   2926,      0,      0,      0,  -2590,      0,
+		     0,      0,      0,      0,      0,      0,   2934,      0,
+		  2474,   2931,   2932,      0,      0,      0,      0,      0,
+		    14,    805,      0,      0,   2933,      0,   2934,      0,
+		  2935,   2936,      0,      0,      0,     16,     17,      0,
+		     0,      0,      0,      0,      0,      0,      0,     18,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   -790,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  -1675,      0,      0,     19,      0,  -1679,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,  -1694,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,     20,     21,     22,     23,     24,     25,
+		    26,     27,     28,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,     29,     30,     31,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    724,   2668,    724,   4350,  -2633,  -2633,
+		  2533,   2534,   2535,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   2518,   2519,   2520,   1431,     45,     46,
+		 32767,  32767,     47,     48,     49,     50,     51,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -3011,     53,  -1125,  -3010,  -3010,
+		 32767,  -3334,  -1123,  -3011,     60,     61,     62,     63,
+		 32767,  32767,     64,  32767,     65,  32767,     66,     67,
+		 32767,  32767,  32767,  32767,  32767,  32767,   2268,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,     69,     70,
+		    71,     72,     73,     74,  32767,  32767,  32767,  32767,
+		    75,     76,  32767,     77,    281,  32767,  32767,  32767,
+		 32767,  32767,  32767,    811,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   1341,   1342,   1343,   1344,   1345,
+		  1346,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,     86,
+		 32767,  32767,  32767,  32767,  32767,   4550,  32767,  32767,
+		 32767,   1135,  32767,  32767,  32767,  32767,  32767,   1130,
+		  3016,  32767,   3017,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    677,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   2858,   2859,    651,   2861,   -438,
+		  2863,   2864,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -5305,  -5305,  -5305,  32767,  -5306,
+		 -5306,  32767,  32767,  32767,   2871,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   3022,   3023,    680,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   -272,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4308,   4309,   4310,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4311,   4312,   4313,
+		  4314,   4315,   4316,   4317,   4318,   4319,   4320,   4321,
+		  4322,   4323,   4324,   4325,   4326,   4307,   4307,   4307,
+		  4307,   4307,   4307,   4307,   4307,   4307,   4336,   4337,
+		  4338,   4339,   4340,   4341,   4342,   4343,   4344,   4345,
+		  4346,   4347,   4348,   4349,   4350,   4351,   4352,   4353,
+		  4354,  32767,  32767,  32767,  32767,   4355,   4356,   4357,
+		  4358,   4359,   4360,   4361,   4362,   4363,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4364,   4365,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   2202,      0,      0,      0,     59,      0,
+		     0,     35,      0,      0,      0,   3549,      0,      0,
+		     0,      0,      0,   3394,      0,      0,   3399,      0,
+		     0,      0,      0,      0,      0,      0,      0,   2012,
+		     0,      0,      0,      0,     87,   2022,      0,   7490,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  2255,      0,   2256,   2256,   2256,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,  -1759,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   4767,      0,      0,   4772,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,   5977,      0,
+		   892,  32767,      0,  32767,  32767,      0,      0,  32767,
+		 32767,   2344,   4834,   4835,   4836,  32767,      0,   4840,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  32767,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		 32767,  32767,      0,  32767,      0,      0,      0,  32767,
+		 32767,  32767,  32767,   3261,   3262,  32767,   3007,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    106,    107,    108,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    109,    110,    111,    112,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,  -2344,
+		 -2344,      0,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -1642,   1469,  -1641,   1469,  -1640,   1469,
+		  1469,   1457,   1469,   1469,   1469,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -3359,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4103,
+		 -1478,      0,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -2433,  -4254,  -4254,  -4254,  -3658,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,      0,  -4253,  -4253,  -4253,  -4253,  -4253,
+		 -4253,  -4253,  -4253,  -4253,   -678,   -677,   -676,   -675,
+		  -674,   -673,   -672,  -4253,    314,  -4253,  -4253,  -4253,
+		 -4253,  -4253,  -4253,  -4253,  -4253,  -4253,  -4253,  -4253,
+		 -4253,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1464,   1465,   1466,   1467,
+		  1468,   1469,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,      0,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    827,    828,    829,  -2469,  -2469,   -260,      0,
+		     0,  32767,      0,  32767,      0,      0,  32767,      0,
+		     0,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  3575,   3576,   3577,   3578,   3579,   3580,   3581,      0,
+		  4567,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,   2201,   4411,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  -3338,      0,      0,      0,
+		     0,      0,      0,      0,  -3337,      0,  -3336,      0,
+		     0,      0,      0,  -3335,      0,      0,  -3334,  -3333,
+		 -3332,  -3331,      0,      0,  -3330,      0,      0,  32767,
+		     0,      0,     13,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   3073,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -2556,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  3074,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2355,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   -488,   -488,   -488,   -302,  -3067,  -3067,
+		 -3067,  -3067,   -488,   -488,   -488,   -488,   2999,   -488,
+		  2999,   -488,   -488,   -488,  -3067,  -3067,  -3067,   -488,
+		  -488,  -3067,  -3067,  -3067,   -488,   -488,   -488,   2463,
+		  -488,   -488,   -488,   -301,   2465,   -488,   2466,   2467,
+		 -3600,   -493,  -3599,   -488,  -3598,   -488,  -3597,   -488,
+		  -488,   -500,   -488,   -488,   -488,   -488,   -488,   2470,
+		  2471,   2472,   -488,   -488,   -254,   -488,   -488,   -488,
+		  -488,   -488,   -104,   -488,   -488,   -488,   -102,   -101,
+		  -100,    -99,    -98,    -97,    -96,    -95,    -94,    -93,
+		   -92,   -488,   -488,   -488,   -488,   -488,   -488,   -488,
+		  -488,   -488,  -2194,  -2194,  -2194,  -2194,  -2194,  -2194,
+		 -2194,  -2194,  -2194,  -2194,   5211,   3269,   5213,   3269,
+		  6895,    -88,    -88,   5078,   5079,   5080,   1773,    -92,
+		   -92,   1773,   1773,   1773,   1773,   1773,   1773,   5072,
+		  5073,   2865,   5075,   1776,   5077,   5078,   1778,   1778,
+		  6942,   6943,   1778,   1778,   1778,   5086,   6952,   6953,
+		  5089,   5090,   5091,   5092,   5093,   5094,   5095,   5096,
+		  4007,   5098,   2333,   2334,   2335,   2336,   2337,  -3066,
+		 -3066,  -3066,   2341,  -3066,  -3066,   2344,   2345,   2346,
+		  5114,    317,   2349,    848,    849,    850,   2353,    852,
+		   853,    854,    855,    856,    857,    858,    859,    860,
+		   861,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   3093,   3094,   3095,   3096,   3097,   3098,   3099,
+		  3100,   3101,   3102,    901,   3104,   3105,   3106,   3048,
+		  3108,   3109,   3075,   3111,   3112,   3113,   -435,   3115,
+		  3116,   3117,   3118,   3119,   -274,   3121,   3122,   -276,
+		  3124,   3125,   3126,   3127,   3128,   3129,   3130,   3131,
+		  1120,   3133,   3134,   3135,   3136,   3050,   1116,   3139,
+		 -4350,   3141,   3142,   3143,   3144,   3145,   3146,   3147,
+		  3148,   3149,   3150,   3151,   3152,   3153,   3154,   3155,
+		  3156,    902,   3158,    903,    904,    905,   3162,   3163,
+		  3164,   3165,   3166,   3167,   3168,   3169,   3170,   3171,
+		  3172,   3173,   3174,   3175,   3176,   3177,  32767,   3178,
+		  3179,   3180,   3181,   3182,   3183,   4943,   3185,   3186,
+		  3187,   3188,   3189,   3190,   3191,   3192,   3193,   3194,
+		  3195,   3196,   3197,   3198,   3199,   3200,   3201,   3202,
+		  3203,   3204,   3205,   3206,   3207,   3208,   3209,   3210,
+		  3211,   3212,   3213,   3214,   3215,   3216,   3217,   3218,
+		  3219,   3220,   3221,   3222,   3223,  -1543,   3225,   3226,
+		 -1545,   3228,   3229,   3230,   3231,   3232,   3233,   3234,
+		  3235,   3236,   3237,   3238,   3239,   3240,   3241,   3242,
+		  3243,   3244,   3245,   3246,   3247,   3248,  -1251,  -2728,
+		  3250,  32767,  32767,   3251,    906,    907,   3252,   3253,
+		 32767,  32767,    910,  -1579,  -1579,  -1579,  32767,   3258,
+		 -1581,   3260,   3261,   3262,   3263,   3264,   3265,   3266,
+		  3267,   3268,   3269,  32767,   3270,  32767,   3271,   3272,
+		  3273,   3274,   3275,   3276,   3277,  32767,   3278,   3279,
+		  3280,   3281,   3282,   3283,   3284,   3285,   3286,   3287,
+		  3288,   3289,   3290,   3291,   3292,   3293,   3294,   3295,
+		  3296,   3297,   3298,   3299,   3300,   3301,   3302,   3303,
+		  3304,   3305,   3306,   3307,   3308,   3309,   3310,   3311,
+		  3312,   3313,   3314,   3315,   3316,   3317,   3318,   3319,
+		  3320,   3321,   3322,   3323,   3324,   3325,   3326,   3327,
+		  3328,   3329,   3330,   3331,   3332,   3333,   3334,   3335,
+		  3336,  32767,   3337,   3338,   3339,   3340,   3341,   3342,
+		     0,   3343,   3344,   3345,   3346,  32767,  32767,   3347,
+		  3348,   3349,   3350,   3351,   3352,   3353,   3354,  32767,
+		  3355,   3356,   3357,   3358,   3359,   3360,   3361,  32767,
+		  3362,   3363,   3364,   3365,   3366,   3367,   3368,   3369,
+		  3370,   3371,   3372,   3373,   3374,   3375,   3376,   3377,
+		  3378,   3379,   3380,   3381,   3382,   3383,   3384,   3385,
+		  3386,   3387,   3388,   3389,      0,   3390,   3391,   3392,
+		   915,    916,    917,    918,    919,    920,    921,    922,
+		   923,    924,    925,    926,    927,    928,    929,    930,
+		   931,    932,    933,    934,    935,    936,    937,    938,
+		   939,    940,    941,    942,    943,    944,    945,    946,
+		   947,    948,    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,   3449,   3450,
+		  3451,   3452,   3453,   3454,   3455,   3456,   3457,   3458,
+		  3459,   3460,   3461,   3462,   3463,   3464,   3465,   3466,
+		  3467,   3468,   3469,   3470,   3471,   3472,   3473,   3474,
+		  3475,   3476,   3477,   3478,   3479,   3480,   3481,   3482,
+		  3483,   3484,   3485,   3486,   3487,   3488,   3489,   3490,
+		  3491,   3492,   3493,   3494,   3495,   3496,   3497,   3498,
+		  3499,   3500,   3501,   3502,   3503,   3504,   3505,   3506,
+		  3507,   3508,   3509,   3510,   3511,   3512,   3513,   3514,
+		  3515,   3516,   3517,   3518,   3519,   3520,   3521,   3522,
+		  3523,   3524,   3525,   3526,   3527,   3528,   3529,   3530,
+		  3531,   3532,   3533,   3534,   3535,   3536,   3537,   3538,
+		  3539,   3540,   3541,   3542,   3543,   3544,   3545,   3546,
+		  3547,   3548,   3549,   3550,   3551,   3552,   3553,   3554,
+		  3555,   3556,   3557,   3558,   3559,   3560,   3561,   3562,
+		  3563,   3564,   3565,   3566,   3567,   3568,   3569,   3570,
+		  3571,   3572,   3573,   3574,   3575,   3576,   3577,   6056,
+		  6057,   6058,  32767,   3581,   3582,   3583,   3584,   3585,
+		  4157,   4158,   4159,   3589,   4162,  -4510,  -1558,  -1557,
+		 -1556,  -1742,  -4507,  -1553,  -4506,  -4506,   1562,  -1544,
+		  1563,  -1547,   1564,  -1545,   1565,  -1543,  -1542,  -1529,
+		 -1540,  -1539,  -1538,  -1537,  -1536,  -4493,  -4493,  -4493,
+		 -1532,  -1531,  -1764,  -1529,   3622,  -1528,  -1527,  -1526,
+		 -1909,  -1524,  -1523,  -1522,  -1907,  -1907,  -1907,  -1907,
+		 -1907,  -1907,  -1907,  -1907,  -1907,  -1907,  -1907,  -1510,
+		 -1509,   1071,   1072,   1073,   1074,   1075,   1076,   1077,
+		  1078,   1079,   1080,   1081,   1082,   1083,   1084,   1085,
+		  1086,   1087,   1088,   1089,   1090,   3663,   3664,   3665,
+		  3666,   3667,   3668,   3669,   3670,   3671,   3672,   3673,
+		  3674,   1095,   1096,   1097,   1098,   1099,   1100,   1101,
+		  3682,   1103,   3684,   1105,   3686,   3687,   3688,   1109,
+		  1110,   1111,   3692,   1113,   1114,   1115,   1116,   1117,
+		  1118,   1119,   3700,   1121,   3702,   3703,   3704,   1125,
+		  1126,   1127,  -1809,  -1809,  -1809,  -1809,  -1809,  -1809,
+		  3720,   3721,   3722,   3717,   3718,   3719,   3720,   1140,
+		  1141,   1142,   1143,  -1802,   1145,   1146,   1147,   1148,
+		  3730,  -1797,   3732,   1152,   3734,   3735,   1155,   1156,
+		  3738,   3739,   3740,   3741,   3742,   3743,  -1785,  -1785,
+		 -1785,  -1779,  -1324,   1168,   1169,   1170,   1171,   1172,
+		  3752,   3753,   1175,   1176,   1177,    992,   3758,   3759,
+		  3760,   3761,   1183,   1184,   1185,   1186,  -2300,   1188,
+		 -2298,   1190,   1191,   1192,   3772,   3773,   3774,   1196,
+		  1197,   3777,   3778,   3779,   1201,   1202,   1203,  -1747,
+		  1205,   1206,   1207,   1021,  -1744,   1210,  -1743,  -1743,
+		  4325,   1219,   4326,   1216,   4327,   1218,   4328,   1220,
+		  1221,   1234,   1223,   1224,   1225,   1226,   1227,  -1730,
+		 -1730,  -1730,   1231,   1232,    999,   1234,   1235,   1236,
+		  1237,   1238,    855,   1240,   1241,   1242,    857,    857,
+		   857,    857,    857,    857,    857,    857,    857,    857,
+		   857,   1254,   1255,   1256,   1257,   1258,   1259,   1260,
+		  1261,   1262,   2969,   2970,   2971,   2972,   2973,   2974,
+		  2975,   2976,   2977,   2978,  -4426,  -2483,  -4426,  -2481,
+		 -6106,    878,    879,  -4286,  -4286,  -4286,   -978,    888,
+		   889,   -975,   -974,   -973,   -972,   -971,   -970,  -4268,
+		 -4268,  -2059,  -4268,   -968,  -4268,  -4268,   -967,   -966,
+		 -6129,  -6129,   -963,   -962,   -961,  -4268,  -6133,  -6133,
+		 -4268,  -4268,  -4268,  -4268,  -4268,  -4268,  -4268,  -4268,
+		 -3178,  -4268,  -1502,  -1502,  -1502,  -1502,  -1502,   3902,
+		  3903,   3904,  -1502,   3906,   3907,  -1502,  -1502,  -1502,
+		 -4269,    529,  -1502,      0,      0,      0,  -1502,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    170,    171,    172,    173,    174,    175,    176,
+		   177,    178,    179,    180,    181,    182,    183,    184,
+		   185,    186,    187,    188,    189,    190,    191,    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,  -3194,    221,    222,    223,    224,
+		 -1657,    226,    227,  -1657,    229,    230,  -1655,    555,
+		 -1655,    234,    235,    236,    732,    238,    239,    240,
+		   241,    242,    243,  -1655,    245,    246,    247,    248,
+		 -1655,    250,  -1655,    252,  -1655,  -1655,  -1655,  -1655,
+		 -1655,  -1655,    259,  -1655,  -1655,  -1655,  -1655,    264,
+		 -1655,    266,  -1655,    268,  -1655,  -3620,    271,    272,
+		 -1655,    274,    275,  -1655,    277,  -1655,  -1655,    280,
+		 -1655,    282,   5746,   5747,   5748,   5749,  -1655,    288,
+		 -1655,    290,  -3335,   3649,   3650,  -1515,  -1515,  -1515,
+		  1793,   3659,   3660,   1796,   1797,   1798,   1799,   1800,
+		  1801,  -1497,  -1497,    712,  -1497,   1803,  -1497,  -1497,
+		  1804,   1805,  -3358,  -3358,   1808,   1809,   1810,  -1497,
+		 -3362,  -3362,  -1497,  -1497,  -1497,  -1497,  -1497,  -1497,
+		 -1497,  -1497,   -407,  -1497,  -1497,  -1497,  -1497,  -1497,
+		 -1497,   3667,   3668,  -1497,  -1497,  -1497,   1811,   3677,
+		  3678,  32767,   1814,  32767,   1815,  32767,  32767,   1816,
+		  1817,  32767,  32767,  32767,   1818,   1819,   1820,   1821,
+		 -3342,  -3342,   1824,   1825,   1826,   1827,   1828,   1829,
+		  1830,   1831,   1832,   1833,   1834,   1835,   1836,   1837,
+		  1838,   1839,   1840,   1841,   1842,   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,   1871,   1872,   1873,   1874,   1875,   1876,  -1537,
+		  1878,   1879,   1880,   1881,      0,   1883,   1884,      0,
+		   529,      0,      0,   2210,      0,   1889,   1890,   1891,
+		  2387,   1893,   1894,   1895,   1896,   1897,   1898,      0,
+		  1900,   1901,   1902,   1903,      0,   1905,      0,   1907,
+		     0,      0,      0,      0,      0,      0,   1914,      0,
+		     0,      0,      0,   1919,      0,   1921,      0,   1923,
+		     0,  -1965,   1926,   1927,      0,   1929,   1930,      0,
+		  1932,      0,      0,   1935,      0,   1937,   7401,   7402,
+		  7403,   7404,      0,   1943,      0,   1945,   1946,      0,
+		  1948,      0,      0,   1951,   1952,   1953,   1954,      0,
+		  1956,   1957,   1958,   1959,   1960,   1961,   1962,      0,
+		  1964,   1965,   1966,   1967,      0,   1969,   1970,   1971,
+		  1972,      0,   1974,      0,   1976,   1977,   1978,   1979,
+		  1980,   1981,   1982,   1983,   1984,   1985,      0,   1987,
+		  1988,   1989,   1990,   1991,    566,    566,    566,   5141,
+		  5142,    566,    566,    566,    566,    566,    566,    566,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   8673,   5722,   5722,   5722,      0,   8676,
+		  5723,   8677,   8678,   2611,   5718,   2612,   5723,   2613,
+		  5723,   2614,   5723,   5723,   5711,   5723,   5723,   5723,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    895,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,    151,   2776,   4254,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   1821,      0,
+		     0,      0,    596,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -2856,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -2901,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -1025,  32767,  32767,  32767,
+		 32767,  -2910,  32767,  32767,  32767,  32767,    157,  32767,
+		 32767,  32767,  32767,    158,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  2359,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    160,  32767,    161,    162,    163,    164,
+		   165,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   898,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1428,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1254,  32767,  32767,  32767,
+		 32767,   1250,  32767,  32767,  32767,  32767,   1246,  32767,
+		 32767,  32767,  32767,   1243,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1231,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   1842,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  3177,   1235,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4323,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    174,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1830,   -112,   1832,   -112,   3514,  -3469,
+		 -3469,   1697,   1698,   1699,  -1608,  -3473,  -3473,  -1608,
+		 -1608,  -1608,  -1608,  -1608,  -1608,   1691,   1692,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  -1623,  -1623,  -1623,   3541,   3542,  -1623,  -1623,
+		 -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,
+		 -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,
+		 -1623,  -1623,  -1623,  -1623,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -766,   2253,   2254,   2255,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1531,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,  32767,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -173,   -173,   -173,   -173,   -173,
+		  -173,   -173,   -173,   -173,   -173,   -173,   -173,   3241,
+		  -173,   -173,   -173,   -173,   1709,   -173,   -173,   1712,
+		  -173,   -173,   1713,   -496,   1715,   -173,   -173,   -173,
+		  -668,   -173,   -173,   -173,   -173,   -173,   -173,   1726,
+		  -173,   -173,   -173,   -173,   1731,   -173,   1733,   -173,
+		  1735,   1736,   1737,   1738,   1739,   1740,   -173,   1742,
+		  1743,   1744,   1745,   -173,   1747,   -173,   1749,   -173,
+		  1751,   3717,   -173,   -173,   1755,   -173,   -173,   1758,
+		  -173,   1760,   1761,   -173,   1763,   -173,  -5636,  -5636,
+		 -5636,  -5636,   1769,   -173,   1771,   -173,   3453,  -3530,
+		 -3530,   1636,   1637,   1638,  -1669,  -3534,  -3534,  -1669,
+		 -1669,  -1669,  -1669,  -1669,  -1669,   1630,   1631,   -577,
+		  1633,  -1666,   1635,   1636,  -1664,  -1664,   3500,   3501,
+		 -1664,  -1664,  -1664,   1644,   3510,   3511,   1647,   1648,
+		  1649,   1650,   1651,   1652,   1653,   1654,    565,   1656,
+		  1657,   1658,   1659,   1660,   1661,  -3502,  -3502,   1664,
+		  1665,   1666,   1667,   1668,   1669,   1670,   1671,   1672,
+		  1673,   1674,   1675,   1676,   1677,   1678,   1679,   1680,
+		  1681,   1682,   1683,   1684,   1685,   1686,   1687,   1688,
+		  1689,   1690,   1691,   1692,   1693,   1694,   1695,   1696,
+		  1697,   1698,   1699,   1700,   1701,   1702,   1703,   1704,
+		  1705,   1706,   1707,   1708,   1709,   1710,   1711,   1712,
+		  1713,   1714,   1715,   1716,  -1697,   1718,   1719,   1720,
+		  1721,   -160,   1723,   1724,   -160,   1726,   1727,   -158,
+		  2052,   -158,   1731,   1732,   1733,   2229,   1735,   1736,
+		  1737,   1738,   1739,   1740,   -158,   1742,   1743,   1744,
+		  1745,   -158,   1747,   -158,   1749,   -158,   -158,   -158,
+		  -158,   -158,   -158,   1756,   -158,   -158,   -158,   -158,
+		  1761,   -158,   1763,   -158,   1765,   -158,  -2123,   1768,
+		  1769,   -158,   1771,   1772,   -158,   1774,   -158,   -158,
+		  1777,   -158,   1779,   7243,   7244,   7245,   7246,   -158,
+		  1785,   -158,   1787,  -1838,   5146,   5147,    -18,    -18,
+		   -18,   3290,   5156,   5157,   3293,   3294,   3295,   3296,
+		  3297,   3298,      0,      0,   2209,      0,   3300,      0,
+		     0,   3301,   3302,  -1861,  -1861,   3305,   3306,   3307,
+		     0,  -1865,  -1865,      0,      0,      0,      0,      0,
+		     0,      0,      0,   1090,      0,      0,      0,      0,
+		     0,      0,   5164,   5165,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,   3414,      0,      0,      0,      0,   1882,      0,
+		     0,   1885,      0,      0,   1886,   -323,   1888,      0,
+		     0,      0,   -495,      0,      0,      0,      0,      0,
+		     0,   1899,      0,      0,      0,      0,   1904,      0,
+		  1906,      0,   1908,   1909,   1910,   1911,   1912,   1913,
+		     0,   1915,   1916,   1917,   1918,      0,   1920,      0,
+		  1922,      0,   1924,   3890,      0,      0,   1928,      0,
+		     0,   1931,      0,   1933,   1934,      0,   1936,      0,
+		 -5463,  -5463,  -5463,  -5463,   1942,      0,   1944,      0,
+		     0,   1947,      0,   1949,   1950,      0,      0,      0,
+		     0,   1955,      0,      0,      0,      0,      0,      0,
+		     0,   1963,      0,      0,      0,      0,   1968,      0,
+		     0,      0,      0,   1973,      0,   1975,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  1986,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,    527,    527,    527,    527,      0,
+		   528,    528,    528,    528,    528,    528,    528,    528,
+		   528,    528,    528,   1998,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1999,   2000,   2001,   2002,   2003,  32767,  32767,  32767,
+		 32767,  32767,   2004,  32767,   2005,   2006,   2007,   2008,
+		  2009,   2010,   2011,   2012,   2013,   2014,   2015,   2016,
+		  2017,   2018,   2019,   2020,   2021,   2022,   2023,   2024,
+		  2025,   2026,   1200,   1200,  32767,   4498,   4499,   2291,
+		  2032,   2033,  32767,   2034,  32767,   2035,   2036,  32767,
+		  2037,   2038,  32767,   2039,   2040,   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,  -1506,  -1506,  -1506,  -1506,  -1506,  -1506,  -1506,
+		  2076,  -2490,   2078,   2079,   2080,   2081,   2082,   2083,
+		  2084,   2085,   2086,   2087,   2088,   2089,   2090,   2091,
+		  2092,   2093,   2094,   2095,   -105,  -2314,   2098,   2099,
+		  2100,   2101,   2102,   2103,   2104,   2105,   2106,   2107,
+		  2108,   2109,   2110,   2111,   2112,   2113,   2114,   2115,
+		  2116,   2117,   2118,   2119,   2120,   5459,   2122,   2123,
+		  2124,   2125,   2126,   2127,   2128,   5466,   2130,   5467,
+		  2132,   2133,   2134,   2135,   5471,   2137,   2138,   5473,
+		  5473,   5473,   5473,   2143,   2144,   5475,   2146,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  2147,   2148,   2149,   2150,   2151,   2152,   2153,   2154,
+		  2155,   2156,   2157,   2158,   2159,   2160,   2161,   2162,
+		  2163,   2164,   2165,   2166,   2167,   2168,   2169,   2170,
+		  2171,   2172,   2173,   2174,   2175,   2176,   2177,   2178,
+		  2179,   2180,   2181,   2182,   2183,   2184,   2185,   2186,
+		  2187,   2188,   2189,   2190,   2191,  32767,   -726,   2293,
+		  -725,   -725,   -725,   1357,   1358,   1359,   -722,   2201,
+		  2202,   2203,   2204,   2205,      0,   2207,   -715,   2209,
+		  -714,   -714,   -714,   2213,   2214,   2215,   4806,   2217,
+		  2218,   2219,   2220,   2221,   2222,   2223,   -710,   2225,
+		  -248,   -704,   -704,   2229,   2230,   2231,   2232,   2233,
+		  2220,   1430,   2236,   2237,   -695,   2239,   -694,   2241,
+		  -693,   -693,   2244,   2245,   2246,   2231,   2231,   2249,
+		  2250,   2251,   2252,   2253,   2254,   2255,   2256,   2239,
+		  2258,   2259,   2260,   2261,   2262,   2263,   2264,   2265,
+		  2266,   2267,   2268,   2269,   2270,   2271,   2272,   2273,
+		  2274,   2275,   2276,   2277,   2278,   2279,   2280,   2281,
+		  2282,   2283,   2284,   2285,   2286,   2287,   2288,   2289,
+		  2290,   2291,   2292,   2293,   3084,   2295,   2296,   2297,
+		  2298,   2299,   2300,   2301,   2302,   2303,   2304,   2305,
+		  2306,   2307,   3983,   2309,   2310,   2292,   2312,   3992,
+		  2314,   2315,   2316,   2317,   2318,   2319,   2320,   2321,
+		  2322,   2323,   2324,   2325,   2326,   2327,   2328,   4023,
+		  2330,   2331,   2332,   2333,   2334,   2335,   2336,   2337,
+		  2338,   2339,   2340,   2341,   2342,   2343,   2344,   2345,
+		  2346,   2347,   2348,   2349,   2350,   2351,   2352,   2353,
+		  2354,   2355,   2356,   2357,   2358,   2359,   2360,   2361,
+		  2362,   2363,   2364,   2365,   2366,   2367,   2368,   2369,
+		  2370,   2371,   2372,   2373,   2374,   2375,   2376,   2377,
+		  2378,   2379,   2360,   2360,   2360,   2360,   2360,   2360,
+		  2360,   2360,   2360,   2389,   2390,   2391,   2392,   2393,
+		  2394,   2395,   2396,   2397,   2398,   2399,   2400,   2401,
+		  2402,   2403,   2404,   2405,   2406,   2407,   2408,   2409,
+		  2410,   2411,   2412,   2413,   2414,   2415,   2416,   2417,
+		  2418,   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,  32767,   2448,
+		  2449,   2450,   2451,   2452,   2453,   2454,   2455,   2456,
+		  2457,   2458,   2459,   2460,   2461,   2462,   2463,   2464,
+		  2465,   2466,   2467,   2468,   2469,   2470,   2471,   2472,
+		  2473,   2474,   2475,   2476,   2477,   2478,   2479,   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,
+		  2505,   2506,   2507,   2508,   2509,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   2510,
+		  2511,   2512,   2513,   3266,   3266,   3266,   3266,   2518,
+		  3267,   3267,   3267,   2522,   3268,   3268,   3268,   3268,
+		  3268,   3268,   3268,   6682,   3268,   3268,   3268,   2534,
+		  5151,   3269,   2537,   2538,   3271,   3271,   5157,   2948,
+		  5159,   2544,   2545,   3273,   2778,   3273,   2549,   3274,
+		  2551,   3275,   2553,   5175,   2555,   3277,   3277,   3277,
+		  5181,   2560,   5184,   3278,   5186,   2564,   5189,   5190,
+		  5191,   5192,   3279,   5194,   5195,   2572,   5198,  32767,
+		 32767,   3278,   5200,   3278,   2577,   2578,   2579,   2580,
+		  5210,   3282,   3282,   5213,   3282,   2586,   2587,   2588,
+		  2589,   2590,   2591,  -2175,  -2175,  -2175,   5230,   3288,
+		  5232,   3288,   6914,    -69,    -69,   5097,   5098,   5099,
+		  1792,    -73,    -73,   1792,   1792,   1792,   1792,   1792,
+		  1792,   5091,   5092,   2884,   5094,   1795,   5096,   5097,
+		  1797,   1797,   6961,   6962,   1797,   1797,   1797,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   2578,   2578,   2578,   2578,   2578,
+		  2578,    872,    872,    872,    872,    872,    872,    872,
+		   872,    872,    872,   8277,   6335,   8279,   6335,   9961,
+		  2978,   2978,   8144,   8145,   8146,   4839,   2974,   2974,
+		  4839,   4839,   4839,   4839,   4839,   4839,   8138,   8139,
+		  5931,   8141,   4842,   8143,   8144,   4844,   4844,  10008,
+		 10009,   4844,   4844,   4844,   8152,  10018,  10019,   8155,
+		  8156,   8157,   8158,   8159,   8160,   8161,   8162,   7073,
+		  8164,   5399,   5400,   5401,   5402,   5403,      0,      0,
+		     0,   5407,      0,      0,   5410,   5411,   5412,   8180,
+		  3383,   5415,   3914,   3915,   3916,   5419,   3918,   3919,
+		  3920,   3921,   3922,   3923,   3924,   3925,   3926,   3927,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   7172,   3758,   3758,   3758,   3758,   5640,
+		  3758,   3758,   5643,   3758,   3758,   5644,   3435,   5646,
+		  3758,   3758,   3758,   3263,   3758,   3758,   3758,   3758,
+		  3758,   3758,   5657,   3758,   3758,   3758,   3758,   5662,
+		  3758,   5664,   3758,   5666,   5667,   5668,   5669,   5670,
+		  5671,   3758,   5673,   5674,   5675,   5676,   3758,   5678,
+		  3758,   5680,   3758,   5682,   7648,   3758,   3758,   5686,
+		  3758,   3758,   5689,   3758,   5691,   5692,   3758,  -1707,
+		 -1707,  -1707,  -1707,  -1707,  -1707,   5698,   3756,   5700,
+		  3756,   7382,    399,    399,   5565,   5566,   5567,   2260,
+		   395,    395,   2260,   2260,   2260,   2260,   2260,   2260,
+		  5559,   5560,   3352,   5562,   2263,   5564,   5565,   2265,
+		  2265,   7429,   7430,   2265,   2265,   2265,   5573,   7439,
+		  7440,   5576,   5577,   5578,   5579,   5580,   5581,   5582,
+		  5583,   4494,   5585,   2820,   2821,   2822,   2823,   2824,
+		 -2579,  -2579,  -2579,   2828,  -2579,  -2579,   2831,   2832,
+		  2833,   5601,    804,   2836,   1335,   1336,   1337,   2840,
+		  1339,   1340,   1341,   1342,   1343,   1344,   1345,   1346,
+		  1347,   1348,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   4593,   1179,   1179,   1179,
+		  1179,   3061,   1179,   1179,   3064,   1179,   1179,   3065,
+		   856,   3067,   1179,   1179,   1179,    684,   1179,   1179,
+		  1179,   1179,   1179,   1179,   3078,   1179,   1179,   1179,
+		  1179,   3083,   1179,   3085,   1179,   3087,   3088,   3089,
+		  3090,   3091,   3092,   1179,   3094,   3095,   3096,   3097,
+		  1179,   3099,   1179,   3101,   1179,   3103,   5069,   1179,
+		  1179,   3107,   1179,   1179,   3110,   1179,   3112,   3113,
+		  1179,   3115,   1179,  -4284,  -4284,  -4284,  -4284,   3121,
+		  1179,   3123,   1179,   4805,  -2178,  -2178,   2988,   2989,
+		  2990,   -317,  -2182,  -2182,   -317,   -317,   -317,   -317,
+		  -317,   -317,   2982,   2983,    775,   2985,   -314,   2987,
+		  2988,   -312,   -312,   4852,   4853,   -312,   -312,   -312,
+		  2996,   4862,   4863,   2999,   3000,   3001,   3002,   3003,
+		  3004,   3005,   3006,   1917,   3008,   3009,   3010,   3011,
+		  3012,   3013,  -2150,  -2150,   3016,   3017,   3018,   3019,
+		  3020,   3021,   3022,   3023,   3024,   3025,   3026,   3027,
+		  3028,   3029,   3030,   3031,   3032,   3033,   3034,   3035,
+		 32767,  32767,  32767,   3036,   3037,   3038,   3039,   3040,
+		  3041,  32767,  32767,   3042,   3043,   3044,   3045,   3046,
+		  3047,  32767,  32767,   3048,   3049,   3050,   3051,   3052,
+		  3053,  32767,  32767,   3054,   3055,   3056,  32767,  32767,
+		 32767,   -357,   3058,   3059,   3060,   3061,   1180,   3063,
+		     0,   1179,   3065,   3066,   1181,   3391,   1181,   3070,
+		     0,      0,      0,      0,  32767,      0,      0,  32767,
+		     0,  32767,      0,      0,  -4973,  32767,  32767,  -7368,
+		 -2202,  -2201,  -2200,  -5507,  -7372,  -7372,  -5507,  -5507,
+		 -5507,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,      0,      0,  32767,      0,
+		  -203,  -2234,   -732,   -732,   -732,  -2234,   -732,   -732,
+		 -2763,  -1261,  -1261,  -1261,  -2763,  -1261,  -1261,  -1261,
+		 -1261,  -1261,  -1261,  -1261,  -1261,  -1261,  -1261,  -1091,
+		 -1090,  -1089,  -1088,  -1087,  32767,  32767,  -1086,  -1085,
+		 -1084,  -1083,  -1082,  -1081,  -1080,  -1079,  -1078,  -1077,
+		 -1076,  -1075,  32767,  -1074,  -1073,  -1072,  -1071,  -1070,
+		 -1069,  -1068,  -1067,  -1066,  -1065,  -1064,  -1063,  -1062,
+		 -1061,  -1060,  -1059,  -1058,  -1057,  -1056,  32767,  -1055,
+		 -1054,  -1053,  -1052,      0,  32767,  32767,  32767,  -1051,
+		 -1050,  -4463,  32767,  -1048,  32767,  -1047,  -2928,  -1045,
+		 -1044,  -2928,  -1042,  -1041,  -2926,   -716,  -2926,  -1037,
+		 -1036,  -1035,   -539,  -1033,  -1032,  -1031,  -1030,  -1029,
+		 -1028,  -2926,  -1026,  -1025,  -1024,  -1023,  -2926,  -1021,
+		 -2926,  -1019,  -2926,  -2926,  -2926,  -2926,  -2926,  -2926,
+		 -1012,  -2926,  -2926,  -2926,  -2926,  -1007,  -2926,  -1005,
+		 -2926,  -1003,  -2926,  -4891,  -1000,   -999,  -2926,   -997,
+		  -996,  -2926,   -994,  -2926,  -2926,   -991,   4475,   4476,
+		  4477,   4478,   4479,   4480,  -2924,   -981,  -2924,   -979,
+		 -4604,   2380,   2381,  -2784,  -2784,  -2784,    524,   2390,
+		  2391,    527,    528,    529,    530,    531,    532,  -2766,
+		 -2766,   -557,  -2766,    534,  -2766,  -2766,    535,    536,
+		 -4627,  -4627,    539,    540,    541,  -2766,  -4631,  -4631,
+		 -2766,  -2766,  -2766,  -2766,  -2766,  -2766,  -2766,  -2766,
+		 -1676,  -2766,      0,      0,      0,      0,      0,   5404,
+		  5405,   5406,      0,   5408,   5409,      0,      0,      0,
+		 -2767,   2031,      0,   1502,   1502,   1502,      0,   1502,
+		  1502,   1502,   1502,   1502,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    224,    225,    226,  32767,    227,    228,    229,
+		   230,    231,    232,    233,    234,    235,    236,     67,
+		 32767,     66,     66,     66,     66,     66,     66,     66,
+		    66,     66,     66,     66,     66,     66,     66,     66,
+		    66,     66,     66,  32767,     65,     65,     65,     65,
+		    65,     65,     65,     65,     65,     65,     65,     65,
+		    65,     65,     65,     65,     65,     65,     65,     65,
+		    65,     65,     65,     65,     65,     65,     65,     65,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -271,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1940,     18,   1942,   3908,     18,     18,   1946,     18,
+		    18,   1949,     18,   1951,   1952,     18,   1954,     18,
+		 -5445,  -5445,  -5445,  -5445,   1960,     18,   1962,     18,
+		  3644,  -3339,  -3339,   1827,   1828,   1829,  -1478,  -3343,
+		 -3343,  -1478,  -1478,  -1478,  -1478,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   1340,   1341,
+		  1342,   1343,   1344,   1345,   1346,   1347,   1348,   1349,
+		 -2064,   1351,   1352,   1353,   1354,  32767,   1355,   1356,
+		 32767,      0,  32767,  32767,   1679,  32767,   1357,   1358,
+		  1359,   1855,   1361,   1362,   1363,   1364,   1365,   1366,
+		 32767,   1367,   1368,   1369,   1370,  32767,   1371,  32767,
+		  1372,  32767,  32767,  32767,  32767,  32767,  32767,   1373,
+		 32767,  32767,  32767,  32767,   1374,  32767,   1375,  32767,
+		  1376,  32767,  -2513,   1378,   1379,  32767,   1380,   1381,
+		 32767,   1382,  32767,  32767,   1383,  32767,   1384,  32767,
+		  6848,  32767,   6849,  32767,   1387,  32767,   1388,   1389,
+		 32767,   1390,  32767,  32767,   1391,   1392,   1393,   1394,
+		 32767,   1395,   1396,   1397,   1398,   1399,   1400,   1401,
+		 32767,   1402,   1403,   1404,   1405,  32767,   1406,   1407,
+		  1408,   1409,  32767,   1410,  32767,   1411,   1412,   1413,
+		  1414,   1415,   1416,   1417,   1418,   1419,   1420,  32767,
+		  1421,   1422,   1423,   1424,   1425,      0,      0,      0,
+		  4575,   4576,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   -571,   -571,
+		  -571,      0,   -572,   8101,   5150,   5150,   5150,   5337,
+		  8103,   5150,   8104,   8105,   2038,   5145,   2039,   5150,
+		  2040,   5150,   2041,   5150,   5150,   5138,   5150,   5150,
+		  5150,   5150,   5150,   8108,   8109,   8110,   5150,   5150,
+		  5384,   5150,      0,   5151,   5151,   5151,   5535,   5151,
+		  5151,   5151,   5537,   5538,   5539,   5540,   5541,   5542,
+		  5543,   5544,   5545,   5546,   5547,   5151,   5151,   2572,
+		  2572,   2572,   2572,   2572,   2572,   2572,   2572,   2572,
+		  2572,   2572,   2572,   2572,   2572,   2572,   2572,   2572,
+		  2572,   2572,   2572,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   2580,
+		  2580,   2580,   2580,   2580,   2580,   2580,      0,   2580,
+		     0,   2580,      0,      0,      0,   2580,   2580,   2580,
+		     0,   2580,   2580,   2580,   2580,   2580,   2580,   2580,
+		     0,   2580,      0,      0,      0,   2580,   2580,   2580,
+		  5517,   5518,   5519,   5520,   5521,   5522,     -6,     -6,
+		    -6,      0,      0,      0,      0,   2581,   2581,   2581,
+		  2581,   5527,   2581,   2581,   2581,   2581,      0,   5528,
+		     0,   2581,      0,      0,   2581,   2581,      0,      0,
+		     0,      0,      0,      0,   5529,   5530,   5531,  32767,
+		 32767,   2579,   2579,   2579,   2579,   2579,      0,      0,
+		  2579,   2579,   2579,   2765,      0,      0,      0,      0,
+		  2579,   2579,   2579,   2579,   6066,   2579,   6066,   2579,
+		  2579,   2579,      0,      0,      0,   2579,   2579,      0,
+		     0,      0,   2579,   2579,   2579,   5530,   2579,   2579,
+		  2579,   2766,   5532,   2579,   5533,   5534,   -533,   2574,
+		  -532,   2579,   -531,   2579,   -530,   2579,   2579,   2567,
+		  2579,   2579,   2579,   2579,   2579,   5537,   5538,   5539,
+		  2579,   2579,   2813,   2579,   2579,   2579,   2579,   2579,
+		  2963,   2579,   2579,   2579,   2965,   2966,   2967,   2968,
+		  2969,   2970,   2971,   2972,   2973,   2974,   2975,   2579,
+		  2579,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,    331,  32767,    332,  -2580,  -2580,  -2580,
+		 -2580,      0,      0,      0,      0,      0,      0,      0,
+		 -2580,      0,  -2580,      0,  -2580,  -2580,  -2580,      0,
+		     0,      0,  -2580,      0,      0,      0,      0,      0,
+		     0,      0,  -2580,      0,  -2580,  -2580,  -2580,      0,
+		     0,      0,   2937,   2938,   2939,   2940,   2941,   2942,
+		 -2586,  -2586,  -2586,  -2580,  -2125,  -2581,  -2581,      0,
+		     0,      0,      0,   2946,      0,      0,      0,      0,
+		 -2581,   2947,  -2581,      0,  -2581,  -2581,      0,      0,
+		 -2581,  -2581,  -2581,  -2581,  -2581,  -2581,   2948,   2949,
+		  2950,   2945,   2491,      0,      0,      0,      0,      0,
+		 -2579,  -2579,      0,      0,      0,    186,  -2579,  -2579,
+		 -2579,  -2579,      0,      0,      0,      0,   3487,      0,
+		  3487,      0,      0,      0,  -2579,  -2579,  -2579,      0,
+		     0,  -2579,  -2579,  -2579,      0,      0,      0,   2951,
+		     0,      0,      0,    187,   2953,      0,   2954,   2955,
+		 -3112,     -5,  -3111,      0,  -3110,      0,  -3109,      0,
+		     0,    -12,      0,      0,      0,      0,      0,   2958,
+		  2959,   2960,      0,      0,    234,      0,      0,      0,
+		     0,      0,    384,      0,      0,      0,    386,    387,
+		   388,    389,    390,    391,    392,    393,    394,    395,
+		   396,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  -1706,  -1706,  -1706,      0,      0,      0,
+		     0,    385,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,    397,
+		   398,    399,    400,    401,    402,    403,    404,    405,
+		  2112,   2113,   2114,    409,    410,    411,    412,  32767,
+		   413,    414,    415,    416,    417,    418,    419,    420,
+		   421,    422,    423,    424,    425,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -1688,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,   -752,   -751,   -750,   -749,      0,   -748,   -747,
+		  -746,      0,   -745,   -744,   -743,   -742,   -741,   -740,
+		  -739,  -4152,   -737,   -736,   -735,      0,  -2616,   -733,
+		     0,      0,   -732,   -731,  -2616,   -406,  -2616,      0,
+		     0,   -727,   -231,   -725,      0,   -724,      0,   -723,
+		     0,  -2621,      0,   -721,   -720,   -719,  -2622,      0,
+		 -2623,   -716,  -2623,      0,  -2624,  -2624,  -2624,  -2624,
+		  -710,  -2624,  -2624,      0,  -2625,   -706,  -2625,   -704,
+		 -2625,   -702,      0,      0,      0,      0,  -2629,   -700,
+		  -699,  -2629,   -697,      0,      0,      0,      0,      0,
+		     0,   4767,   4768,   4769,  -2635,   -692,  -2635,   -690,
+		 -4315,   2669,   2670,  -2495,  -2495,  -2495,    813,   2679,
+		  2680,    816,    817,    818,    819,    820,    821,  -2477,
+		 -2477,   -268,  -2477,    823,  -2477,  -2477,    824,    825,
+		 -4338,  -4338,    828,    829,    830,  -2477,  -4342,  -4342,
+		 -2477,  -2477,  -2477,  -2477,  -2477,  -2477,  -2477,  -2477,
+		 -1387,      0,      0,  32767,  32767,      0,      0,      0,
+		     0,      0,  -2486,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1756,   1757,   1758,
+		  1759,  -5645,  -3702,  -5645,  -3700,  -7325,   -341,   -340,
+		 -5505,  -5505,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,    532,    533,
+		 32767,    534,    535,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -781,   1084,   1084,   1084,   1084,
+		  1084,   1084,   4383,   4384,   2176,   4386,   1087,   4388,
+		  4389,   1089,   1089,   6253,   6254,   1089,   1089,   1089,
+		  4397,   6263,   6264,   4400,   4401,   4402,   4403,   4404,
+		  4405,   4406,   4407,   3318,   4409,   4410,   4411,   4412,
+		  4413,   4414,   -749,   -749,   4417,   4418,   4419,   4420,
+		  4421,   4422,   4423,   4424,   4425,   4426,   4427,   4428,
+		  4429,   4430,   4431,   4432,   4433,   4434,   4435,   4436,
+		  4437,   4438,   4439,   4440,   4441,   4442,   4443,   4444,
+		  4445,   4446,   4447,   4448,   4449,   4450,   4451,   4452,
+		  4453,   4454,   4455,   4456,   4457,   4458,   4459,   4460,
+		  4461,   4462,   4463,   4464,   4465,   4466,   4467,   4468,
+		  4469,   1056,   4471,   4472,   4473,   4474,   2593,   4476,
+		  4477,   2593,   4479,   4480,   2595,   4805,   2595,   4484,
+		  4485,   4486,   4982,   4488,   4489,   4490,   4491,   4492,
+		  4493,   2595,   4495,   4496,   4497,   4498,   2595,   4500,
+		  2595,   4502,   2595,   2595,   2595,   2595,   2595,   2595,
+		  4509,   2595,   2595,   2595,   2595,   4514,   2595,   4516,
+		  2595,   4518,   2595,    630,   4521,   4522,   2595,   4524,
+		  4525,   2595,   4527,   2595,   2595,   4530,   2595,   4532,
+		  9996,   9997,   9998,   9999,   2595,   4538,   2595,   4540,
+		  4541,   2595,   4543,   2595,   2595,   4546,   4547,   4548,
+		  4549,   2595,   4551,   4552,   4553,   4554,   4555,   4556,
+		  4557,   2595,   4559,   4560,   4561,   4562,   2595,   4564,
+		  4565,   4566,   4567,   2595,   4569,   2595,   4571,   4572,
+		  4573,   4574,   4575,   4576,   4577,   4578,   4579,   4580,
+		  2595,   4582,   4583,   4584,   4585,   4586,   4587,   4588,
+		  4589,   4590,   4591,   4592,   4593,   4594,   4595,   4596,
+		  4597,   4598,   4599,   4600,   4601,   4602,   4603,   4604,
+		  4605,   4606,   4607,   4608,   4609,   4610,   4611,   4612,
+		  4613,   4614,   4615,   4089,   4090,   4091,   4092,   4620,
+		  4093,   4094,   4095,   4096,   4097,   4098,   4099,   4100,
+		  4101,   4102,   4103,   4104,   2765,   2765,   2765,   2765,
+		  2765,   2765,   2765,   2765,   2765,   2765,   6179,   2765,
+		  2765,   2765,   2765,   4647,   2765,   2765,   4650,   4122,
+		  4652,   4653,   2444,   4655,   2767,   2767,   2767,   2272,
+		  2767,   2767,   2767,   2767,   2767,   2767,   4666,   2767,
+		  2767,   2767,   2767,   4671,   2767,   4673,   2767,   4675,
+		  4676,   4677,   4678,   4679,   4680,   2767,   4682,   4683,
+		  4684,   4685,   2767,   4687,   2767,   4689,   2767,   4691,
+		  6657,   2767,   2767,   4695,   2767,   2767,   4698,   2767,
+		  4700,   4701,   2767,   4703,   2767,  -2696,  -2696,  -2696,
+		 -2696,   4709,   2767,   4711,   2767,   2767,   4714,   2767,
+		  4716,   4717,   2767,   2767,   2767,   2767,   4722,   2767,
+		  2767,   2767,   2767,   2767,   2767,   2767,   4730,   2767,
+		  2767,   2767,   2767,   4735,   2767,   2767,   2767,   2767,
+		  4740,   2767,   4742,   2767,   2767,   2767,   2767,   2767,
+		  2767,   2767,   2767,   2767,   2767,   4753,   2767,   2767,
+		  2767,   2767,   2767,   4193,   4194,   4195,   -379,   -379,
+		  4198,   4199,   4200,   4201,   4202,   4203,   4204,   4771,
+		  4772,   4773,   4774,   4775,   4776,   4777,   4778,   4779,
+		  4780,  -3892,   -940,   -939,   -938,   4785,  -3890,   -936,
+		 -3889,  -3889,   2179,   -927,   2180,   -930,   2181,   -928,
+		  2182,   -926,   -925,   -912,   -923,   -922,   -921,   4803,
+		  4804,   4805,   4806,   4807,   4808,   4809,   4810,   4811,
+		  4812,   4813,   4814,   4815,   4816,   4817,   4818,   4819,
+		  3925,   4821,   4822,   4823,   4824,   4825,   4826,   4827,
+		  4828,   4829,   4830,   4831,   4832,   4833,   4834,   4835,
+		  4836,   4837,   4838,   4839,   4840,   4841,   4842,   4843,
+		  4844,   4845,   4846,   4847,   4848,   4849,   4850,   4851,
+		  4852,   4853,   4854,   4855,   4856,   4857,   4858,   4859,
+		  4860,   4710,   2086,    609,   4864,   4865,   4866,   4867,
+		  4868,   4869,   4870,   4871,   4872,   3052,   4874,   4875,
+		  4876,   4281,   4878,   4879,   4880,   4881,   4882,   4883,
+		  4884,   4885,   4886,   4887,    634,   4888,   4889,   4890,
+		  4891,   4892,   4893,   4894,   4895,   4896,   1322,   1322,
+		  1322,   1322,   1322,   1322,   1322,   4904,    338,   4906,
+		  4907,   4908,   4909,   4910,   4911,   4912,   4913,   4914,
+		  4915,   4916,   4917,    665,    666,    667,    668,    669,
+		   670,    671,    672,    673,    674,    675,    676,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,  32767,      0,      0,      0,   2478,  32767,   2477,
+		  2477,   2477,   2477,   2477,  32767,   2476,  32767,  32767,
+		 32767,   2473,   2473,   2473,   2473,   2473,   2473,   2473,
+		 32767,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  -2478,  -2478,  -2478,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 9837] + h[b % 9837];
+}
+
+static const unicode_norm_info UnicodeNormInfo_NFKC_QC = {
+	UnicodeNormProps_NFKC_QC,
+	NFKC_QC_hash_func,
+	4918
+};
-- 
2.22.0

#7Mark Dilger
mark.dilger@enterprisedb.com
In reply to: John Naylor (#6)
1 attachment(s)
Re: speed up unicode normalization quick check

On Sep 18, 2020, at 9:41 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:

Attached is version 4, which excludes the output file from pgindent,
to match recent commit 74d4608f5. Since it won't be indented again, I
also tweaked the generator script to match pgindent for the typedef,
since we don't want to lose what pgindent has fixed already. This last
part isn't new to v4, but I thought I'd highlight it anyway.

0001 looks ok to me. The change is quite minor. I reviewed it by comparing the assembly generated for perfect hash functions before and after applying the patch.

For 0001, the assembly code generated from the perfect hash functions in src/common/keywords.s and src/pl/plpgsql/src/pl_scanner.s do not appear to differ in any performance significant way. The assembly code generated in src/interfaces/ecpg/preproc/ecpg_keywords.s and src/interfaces/ecpg/preproc/c_keywords.s change enough that I wouldn't try to compare them just by visual inspection.

Compiled using -g -O2

Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

I'm attaching the diffs of the old and new assembly files, if anyone cares to look.

Attachments:

assember.diffsapplication/octet-stream; name=assember.diffs; x-unix-mode=0644Download
diff --git a/src/common/keywords.s b/src/common/keywords.s
index 1cb88f7220..ee628f3ea0 100644
--- a/src/common/keywords.s
+++ b/src/common/keywords.s
@@ -47,7 +47,7 @@ Ltmp3:
 	##DEBUG_VALUE: ScanKeywords_hash_func:keylen <- $rsi
 	##DEBUG_VALUE: ScanKeywords_hash_func:key <- $rdi
 	.loc	5 0 15                  ## ./kwlist_d.h:0:15
-	movl	$381, %esi              ## imm = 0x17D
+	movl	$51, %esi
 Ltmp4:
                                         ## implicit-def: $eax
                                         ## implicit-def: $ecx
@@ -94,17 +94,17 @@ Ltmp8:
 	##DEBUG_VALUE: c <- $r10d
 	.loc	5 1058 9 is_stmt 1      ## ./kwlist_d.h:1058:9
 	movl	%eax, %edx
-	shll	$5, %edx
-	subl	%eax, %edx
-	.loc	5 1058 14 is_stmt 0     ## ./kwlist_d.h:1058:14
+	shll	$8, %edx
+	addl	%eax, %edx
+	.loc	5 1058 15 is_stmt 0     ## ./kwlist_d.h:1058:15
 	addl	%r10d, %edx
 Ltmp9:
 	##DEBUG_VALUE: ScanKeywords_hash_func:a <- $edx
 	.loc	5 1059 9 is_stmt 1      ## ./kwlist_d.h:1059:9
 	movl	%ecx, %esi
-	shll	$7, %esi
-	subl	%ecx, %esi
-	.loc	5 1059 15 is_stmt 0     ## ./kwlist_d.h:1059:15
+	shll	$4, %esi
+	addl	%ecx, %esi
+	.loc	5 1059 14 is_stmt 0     ## ./kwlist_d.h:1059:14
 	addl	%r10d, %esi
 	.loc	5 1056 21 is_stmt 1     ## ./kwlist_d.h:1056:21
 	movzbl	1(%rdi), %r10d
@@ -121,17 +121,17 @@ Ltmp12:
 	##DEBUG_VALUE: c <- $r10d
 	.loc	5 1058 9 is_stmt 1      ## ./kwlist_d.h:1058:9
 	movl	%edx, %eax
-	shll	$5, %eax
-	subl	%edx, %eax
-	.loc	5 1058 14 is_stmt 0     ## ./kwlist_d.h:1058:14
+	shll	$8, %eax
+	addl	%edx, %eax
+	.loc	5 1058 15 is_stmt 0     ## ./kwlist_d.h:1058:15
 	addl	%r10d, %eax
 Ltmp13:
 	##DEBUG_VALUE: ScanKeywords_hash_func:a <- $eax
 	.loc	5 1059 9 is_stmt 1      ## ./kwlist_d.h:1059:9
 	movl	%esi, %ecx
-	shll	$7, %ecx
-	subl	%esi, %ecx
-	.loc	5 1059 15 is_stmt 0     ## ./kwlist_d.h:1059:15
+	shll	$4, %ecx
+	addl	%esi, %ecx
+	.loc	5 1059 14 is_stmt 0     ## ./kwlist_d.h:1059:14
 	addl	%r10d, %ecx
 Ltmp14:
 	##DEBUG_VALUE: ScanKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
@@ -145,11 +145,11 @@ Ltmp15:
 	##DEBUG_VALUE: ScanKeywords_hash_func:a <- $eax
 	##DEBUG_VALUE: ScanKeywords_hash_func:k <- $rdi
 	movl	%eax, %edx
-	shll	$5, %edx
-	subl	%eax, %edx
+	shll	$8, %edx
+	addl	%eax, %edx
 	movl	%ecx, %esi
-	shll	$7, %esi
-	subl	%ecx, %esi
+	shll	$4, %esi
+	addl	%ecx, %esi
 	##DEBUG_VALUE: ScanKeywords_hash_func:k <- $rdi
 Ltmp16:
 	##DEBUG_VALUE: ScanKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] $rdi
@@ -164,17 +164,17 @@ LBB0_8:
 	orl	$32, %eax
 Ltmp18:
 	##DEBUG_VALUE: c <- $eax
-	.loc	5 1059 15 is_stmt 1     ## ./kwlist_d.h:1059:15
+	.loc	5 1059 14 is_stmt 1     ## ./kwlist_d.h:1059:14
 	addl	%eax, %esi
 Ltmp19:
 	##DEBUG_VALUE: ScanKeywords_hash_func:b <- $esi
-	.loc	5 1058 14               ## ./kwlist_d.h:1058:14
+	.loc	5 1058 15               ## ./kwlist_d.h:1058:15
 	addl	%eax, %edx
 Ltmp20:
 	##DEBUG_VALUE: ScanKeywords_hash_func:a <- $edx
 	movl	%edx, %eax
 Ltmp21:
-	.loc	5 1059 15               ## ./kwlist_d.h:1059:15
+	.loc	5 1059 14               ## ./kwlist_d.h:1059:14
 	movl	%esi, %ecx
 Ltmp22:
 	##DEBUG_VALUE: ScanKeywords_hash_func:b <- $ecx
@@ -182,15 +182,16 @@ LBB0_9:
 	##DEBUG_VALUE: ScanKeywords_hash_func:k <- $rdi
 	.loc	5 1061 13               ## ./kwlist_d.h:1061:13
 	movl	%eax, %edx
-	movl	$2440647343, %esi       ## imm = 0x917952AF
-	imulq	%rsi, %rdx
-	shrq	$41, %rdx
-	imull	$901, %edx, %edx        ## imm = 0x385
+	shrl	%edx
+	imulq	$1218970763, %rdx, %rdx ## imm = 0x48A8048B
+	shrq	$39, %rdx
+	imull	$902, %edx, %edx        ## imm = 0x386
 	subl	%edx, %eax
 	movl	%ecx, %edx
-	imulq	%rsi, %rdx
-	shrq	$41, %rdx
-	imull	$901, %edx, %edx        ## imm = 0x385
+	shrl	%edx
+	imulq	$1218970763, %rdx, %rdx ## imm = 0x48A8048B
+	shrq	$39, %rdx
+	imull	$902, %edx, %edx        ## imm = 0x386
 	subl	%edx, %ecx
 Ltmp23:
 LBB0_10:
@@ -685,907 +686,908 @@ _ScanKeywordCategories:
 
 	.p2align	4               ## @ScanKeywords_hash_func.h
 _ScanKeywords_hash_func.h:
-	.short	65364                   ## 0xff54
+	.short	181                     ## 0xb5
 	.short	32767                   ## 0x7fff
+	.short	65447                   ## 0xffa7
+	.short	220                     ## 0xdc
+	.short	357                     ## 0x165
+	.short	0                       ## 0x0
+	.short	146                     ## 0x92
+	.short	0                       ## 0x0
+	.short	28                      ## 0x1c
+	.short	65351                   ## 0xff47
 	.short	32767                   ## 0x7fff
+	.short	284                     ## 0x11c
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	56                      ## 0x38
-	.short	362                     ## 0x16a
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	90                      ## 0x5a
-	.short	65285                   ## 0xff05
-	.short	332                     ## 0x14c
 	.short	32767                   ## 0x7fff
-	.short	66                      ## 0x42
-	.short	298                     ## 0x12a
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	88                      ## 0x58
-	.short	27                      ## 0x1b
-	.short	22                      ## 0x16
-	.short	65411                   ## 0xff83
-	.short	317                     ## 0x13d
+	.short	65067                   ## 0xfe2b
+	.short	65441                   ## 0xffa1
 	.short	0                       ## 0x0
+	.short	328                     ## 0x148
+	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	65501                   ## 0xffdd
 	.short	0                       ## 0x0
+	.short	168                     ## 0xa8
+	.short	32767                   ## 0x7fff
+	.short	65390                   ## 0xff6e
+	.short	65346                   ## 0xff42
+	.short	26                      ## 0x1a
+	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	0                       ## 0x0
+	.short	335                     ## 0x14f
+	.short	65424                   ## 0xff90
+	.short	237                     ## 0xed
+	.short	54                      ## 0x36
+	.short	170                     ## 0xaa
 	.short	32767                   ## 0x7fff
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	52                      ## 0x34
+	.short	0                       ## 0x0
+	.short	192                     ## 0xc0
 	.short	32767                   ## 0x7fff
-	.short	275                     ## 0x113
+	.short	180                     ## 0xb4
+	.short	401                     ## 0x191
+	.short	152                     ## 0x98
+	.short	169                     ## 0xa9
+	.short	269                     ## 0x10d
 	.short	32767                   ## 0x7fff
-	.short	65259                   ## 0xfeeb
+	.short	138                     ## 0x8a
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	316                     ## 0x13c
-	.short	177                     ## 0xb1
+	.short	35                      ## 0x23
+	.short	217                     ## 0xd9
+	.short	288                     ## 0x120
 	.short	32767                   ## 0x7fff
+	.short	31                      ## 0x1f
 	.short	0                       ## 0x0
-	.short	398                     ## 0x18e
-	.short	58                      ## 0x3a
-	.short	272                     ## 0x110
-	.short	65448                   ## 0xffa8
+	.short	45                      ## 0x2d
 	.short	0                       ## 0x0
-	.short	65389                   ## 0xff6d
-	.short	242                     ## 0xf2
-	.short	143                     ## 0x8f
-	.short	401                     ## 0x191
+	.short	65415                   ## 0xff87
+	.short	33                      ## 0x21
 	.short	0                       ## 0x0
-	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	293                     ## 0x125
-	.short	355                     ## 0x163
+	.short	65111                   ## 0xfe57
 	.short	0                       ## 0x0
+	.short	247                     ## 0xf7
+	.short	406                     ## 0x196
+	.short	145                     ## 0x91
+	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	303                     ## 0x12f
+	.short	65463                   ## 0xffb7
+	.short	32767                   ## 0x7fff
+	.short	32767                   ## 0x7fff
+	.short	65                      ## 0x41
+	.short	867                     ## 0x363
+	.short	32767                   ## 0x7fff
+	.short	32767                   ## 0x7fff
+	.short	95                      ## 0x5f
+	.short	32767                   ## 0x7fff
+	.short	32767                   ## 0x7fff
+	.short	32767                   ## 0x7fff
+	.short	324                     ## 0x144
+	.short	223                     ## 0xdf
+	.short	198                     ## 0xc6
+	.short	33                      ## 0x21
+	.short	65278                   ## 0xfefe
 	.short	32767                   ## 0x7fff
-	.short	225                     ## 0xe1
-	.short	580                     ## 0x244
 	.short	0                       ## 0x0
-	.short	378                     ## 0x17a
+	.short	158                     ## 0x9e
+	.short	360                     ## 0x168
 	.short	0                       ## 0x0
+	.short	32                      ## 0x20
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	65511                   ## 0xffe7
-	.short	65224                   ## 0xfec8
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	65326                   ## 0xff2e
 	.short	0                       ## 0x0
+	.short	20                      ## 0x14
 	.short	32767                   ## 0x7fff
-	.short	65517                   ## 0xffed
 	.short	32767                   ## 0x7fff
-	.short	91                      ## 0x5b
-	.short	307                     ## 0x133
-	.short	354                     ## 0x162
+	.short	374                     ## 0x176
+	.short	65430                   ## 0xff96
 	.short	32767                   ## 0x7fff
+	.short	196                     ## 0xc4
 	.short	32767                   ## 0x7fff
-	.short	65518                   ## 0xffee
-	.short	36                      ## 0x24
+	.short	359                     ## 0x167
+	.short	64782                   ## 0xfd0e
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	402                     ## 0x192
-	.short	292                     ## 0x124
-	.short	165                     ## 0xa5
-	.short	274                     ## 0x112
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	10                      ## 0xa
-	.short	65516                   ## 0xffec
+	.short	279                     ## 0x117
+	.short	32767                   ## 0x7fff
+	.short	65450                   ## 0xffaa
+	.short	65449                   ## 0xffa9
+	.short	240                     ## 0xf0
 	.short	32767                   ## 0x7fff
-	.short	294                     ## 0x126
+	.short	270                     ## 0x10e
+	.short	38                      ## 0x26
+	.short	498                     ## 0x1f2
+	.short	187                     ## 0xbb
+	.short	436                     ## 0x1b4
 	.short	32767                   ## 0x7fff
-	.short	64914                   ## 0xfd92
-	.short	326                     ## 0x146
 	.short	32767                   ## 0x7fff
-	.short	65408                   ## 0xff80
-	.short	0                       ## 0x0
-	.short	33                      ## 0x21
+	.short	26                      ## 0x1a
+	.short	324                     ## 0x144
 	.short	32767                   ## 0x7fff
+	.short	422                     ## 0x1a6
 	.short	32767                   ## 0x7fff
-	.short	325                     ## 0x145
 	.short	32767                   ## 0x7fff
-	.short	276                     ## 0x114
-	.short	343                     ## 0x157
+	.short	513                     ## 0x201
+	.short	135                     ## 0x87
+	.short	64998                   ## 0xfde6
+	.short	368                     ## 0x170
+	.short	121                     ## 0x79
+	.short	10                      ## 0xa
+	.short	32767                   ## 0x7fff
+	.short	47                      ## 0x2f
+	.short	378                     ## 0x17a
+	.short	395                     ## 0x18b
+	.short	0                       ## 0x0
+	.short	65506                   ## 0xffe2
+	.short	139                     ## 0x8b
+	.short	162                     ## 0xa2
+	.short	32767                   ## 0x7fff
+	.short	6                       ## 0x6
+	.short	55                      ## 0x37
+	.short	447                     ## 0x1bf
 	.short	32767                   ## 0x7fff
-	.short	96                      ## 0x60
-	.short	173                     ## 0xad
 	.short	32767                   ## 0x7fff
+	.short	616                     ## 0x268
+	.short	41                      ## 0x29
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	320                     ## 0x140
-	.short	65408                   ## 0xff80
 	.short	32767                   ## 0x7fff
-	.short	357                     ## 0x165
-	.short	24                      ## 0x18
-	.short	65527                   ## 0xfff7
-	.short	427                     ## 0x1ab
 	.short	32767                   ## 0x7fff
+	.short	386                     ## 0x182
+	.short	154                     ## 0x9a
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
+	.short	65389                   ## 0xff6d
 	.short	32767                   ## 0x7fff
+	.short	175                     ## 0xaf
+	.short	360                     ## 0x168
 	.short	0                       ## 0x0
-	.short	0                       ## 0x0
+	.short	65272                   ## 0xfef8
+	.short	154                     ## 0x9a
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	405                     ## 0x195
 	.short	32767                   ## 0x7fff
-	.short	125                     ## 0x7d
+	.short	421                     ## 0x1a5
+	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	65467                   ## 0xffbb
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	65496                   ## 0xffd8
+	.short	65341                   ## 0xff3d
+	.short	394                     ## 0x18a
+	.short	356                     ## 0x164
+	.short	32767                   ## 0x7fff
+	.short	64746                   ## 0xfcea
+	.short	306                     ## 0x132
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	80                      ## 0x50
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
+	.short	358                     ## 0x166
+	.short	65428                   ## 0xff94
 	.short	0                       ## 0x0
-	.short	95                      ## 0x5f
-	.short	65390                   ## 0xff6e
+	.short	566                     ## 0x236
+	.short	309                     ## 0x135
+	.short	340                     ## 0x154
+	.short	32767                   ## 0x7fff
+	.short	32767                   ## 0x7fff
+	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
+	.short	874                     ## 0x36a
+	.short	64815                   ## 0xfd2f
+	.short	541                     ## 0x21d
 	.short	32767                   ## 0x7fff
-	.short	26                      ## 0x1a
-	.short	165                     ## 0xa5
 	.short	32767                   ## 0x7fff
-	.short	41                      ## 0x29
 	.short	32767                   ## 0x7fff
-	.short	418                     ## 0x1a2
+	.short	127                     ## 0x7f
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	40                      ## 0x28
+	.short	342                     ## 0x156
+	.short	65348                   ## 0xff44
+	.short	58                      ## 0x3a
+	.short	0                       ## 0x0
+	.short	271                     ## 0x10f
+	.short	93                      ## 0x5d
+	.short	0                       ## 0x0
+	.short	148                     ## 0x94
+	.short	249                     ## 0xf9
 	.short	32767                   ## 0x7fff
-	.short	147                     ## 0x93
+	.short	212                     ## 0xd4
+	.short	0                       ## 0x0
+	.short	268                     ## 0x10c
+	.short	291                     ## 0x123
 	.short	32767                   ## 0x7fff
+	.short	65504                   ## 0xffe0
 	.short	32767                   ## 0x7fff
+	.short	407                     ## 0x197
 	.short	32767                   ## 0x7fff
-	.short	91                      ## 0x5b
-	.short	110                     ## 0x6e
-	.short	9                       ## 0x9
-	.short	305                     ## 0x131
-	.short	65196                   ## 0xfeac
 	.short	32767                   ## 0x7fff
-	.short	103                     ## 0x67
+	.short	65206                   ## 0xfeb6
+	.short	65134                   ## 0xfe6e
+	.short	65457                   ## 0xffb1
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	329                     ## 0x149
+	.short	308                     ## 0x134
+	.short	0                       ## 0x0
+	.short	0                       ## 0x0
+	.short	65430                   ## 0xff96
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	310                     ## 0x136
 	.short	32767                   ## 0x7fff
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	147                     ## 0x93
-	.short	65274                   ## 0xfefa
-	.short	422                     ## 0x1a6
-	.short	393                     ## 0x189
-	.short	382                     ## 0x17e
-	.short	136                     ## 0x88
 	.short	32767                   ## 0x7fff
-	.short	177                     ## 0xb1
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
+	.short	57                      ## 0x39
 	.short	32767                   ## 0x7fff
-	.short	102                     ## 0x66
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	83                      ## 0x53
-	.short	141                     ## 0x8d
-	.short	28                      ## 0x1c
-	.short	167                     ## 0xa7
-	.short	65115                   ## 0xfe5b
 	.short	32767                   ## 0x7fff
-	.short	38                      ## 0x26
-	.short	111                     ## 0x6f
+	.short	123                     ## 0x7b
+	.short	64874                   ## 0xfd6a
+	.short	32767                   ## 0x7fff
+	.short	377                     ## 0x179
+	.short	81                      ## 0x51
 	.short	0                       ## 0x0
-	.short	479                     ## 0x1df
+	.short	144                     ## 0x90
 	.short	32767                   ## 0x7fff
+	.short	77                      ## 0x4d
+	.short	65324                   ## 0xff2c
+	.short	79                      ## 0x4f
+	.short	383                     ## 0x17f
+	.short	0                       ## 0x0
+	.short	65367                   ## 0xff57
+	.short	508                     ## 0x1fc
+	.short	250                     ## 0xfa
 	.short	32767                   ## 0x7fff
-	.short	29                      ## 0x1d
-	.short	439                     ## 0x1b7
 	.short	32767                   ## 0x7fff
-	.short	427                     ## 0x1ab
-	.short	65530                   ## 0xfffa
-	.short	182                     ## 0xb6
+	.short	45                      ## 0x2d
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	74                      ## 0x4a
+	.short	65338                   ## 0xff3a
 	.short	32767                   ## 0x7fff
-	.short	360                     ## 0x168
-	.short	236                     ## 0xec
 	.short	32767                   ## 0x7fff
+	.short	271                     ## 0x10f
 	.short	32767                   ## 0x7fff
-	.short	327                     ## 0x147
-	.short	65473                   ## 0xffc1
-	.short	162                     ## 0xa2
-	.short	154                     ## 0x9a
-	.short	184                     ## 0xb8
-	.short	90                      ## 0x5a
-	.short	263                     ## 0x107
-	.short	115                     ## 0x73
-	.short	127                     ## 0x7f
-	.short	539                     ## 0x21b
-	.short	347                     ## 0x15b
-	.short	65464                   ## 0xffb8
+	.short	134                     ## 0x86
+	.short	291                     ## 0x123
+	.short	276                     ## 0x114
+	.short	64881                   ## 0xfd71
+	.short	0                       ## 0x0
+	.short	146                     ## 0x92
 	.short	32767                   ## 0x7fff
-	.short	65377                   ## 0xff61
 	.short	32767                   ## 0x7fff
-	.short	65287                   ## 0xff07
-	.short	152                     ## 0x98
+	.short	116                     ## 0x74
 	.short	32767                   ## 0x7fff
-	.short	357                     ## 0x165
-	.short	404                     ## 0x194
-	.short	65426                   ## 0xff92
 	.short	32767                   ## 0x7fff
-	.short	404                     ## 0x194
-	.short	345                     ## 0x159
 	.short	32767                   ## 0x7fff
-	.short	80                      ## 0x50
-	.short	352                     ## 0x160
-	.short	422                     ## 0x1a6
-	.short	61                      ## 0x3d
+	.short	375                     ## 0x177
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	65256                   ## 0xfee8
 	.short	32767                   ## 0x7fff
-	.short	243                     ## 0xf3
-	.short	126                     ## 0x7e
-	.short	117                     ## 0x75
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
+	.short	288                     ## 0x120
+	.short	348                     ## 0x15c
 	.short	32767                   ## 0x7fff
-	.short	208                     ## 0xd0
+	.short	163                     ## 0xa3
+	.short	65523                   ## 0xfff3
+	.short	794                     ## 0x31a
+	.short	440                     ## 0x1b8
+	.short	221                     ## 0xdd
 	.short	32767                   ## 0x7fff
+	.short	281                     ## 0x119
+	.short	51                      ## 0x33
 	.short	32767                   ## 0x7fff
-	.short	65516                   ## 0xffec
-	.short	430                     ## 0x1ae
-	.short	65341                   ## 0xff3d
+	.short	223                     ## 0xdf
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	118                     ## 0x76
-	.short	65474                   ## 0xffc2
+	.short	65248                   ## 0xfee0
+	.short	65378                   ## 0xff62
+	.short	65130                   ## 0xfe6a
+	.short	32767                   ## 0x7fff
+	.short	0                       ## 0x0
+	.short	310                     ## 0x136
+	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	98                      ## 0x62
-	.short	136                     ## 0x88
 	.short	0                       ## 0x0
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	261                     ## 0x105
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
+	.short	222                     ## 0xde
+	.short	321                     ## 0x141
+	.short	221                     ## 0xdd
 	.short	32767                   ## 0x7fff
-	.short	230                     ## 0xe6
-	.short	37                      ## 0x25
-	.short	750                     ## 0x2ee
-	.short	154                     ## 0x9a
+	.short	284                     ## 0x11c
+	.short	200                     ## 0xc8
 	.short	32767                   ## 0x7fff
-	.short	65450                   ## 0xffaa
-	.short	87                      ## 0x57
+	.short	65212                   ## 0xfebc
+	.short	234                     ## 0xea
+	.short	202                     ## 0xca
 	.short	32767                   ## 0x7fff
-	.short	6                       ## 0x6
-	.short	61                      ## 0x3d
+	.short	343                     ## 0x157
 	.short	32767                   ## 0x7fff
-	.short	205                     ## 0xcd
+	.short	0                       ## 0x0
+	.short	65447                   ## 0xffa7
+	.short	32767                   ## 0x7fff
+	.short	10                      ## 0xa
 	.short	32767                   ## 0x7fff
-	.short	517                     ## 0x205
-	.short	107                     ## 0x6b
-	.short	66                      ## 0x42
-	.short	304                     ## 0x130
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
+	.short	65510                   ## 0xffe6
+	.short	261                     ## 0x105
+	.short	65291                   ## 0xff0b
 	.short	32767                   ## 0x7fff
+	.short	296                     ## 0x128
 	.short	32767                   ## 0x7fff
-	.short	333                     ## 0x14d
 	.short	32767                   ## 0x7fff
-	.short	357                     ## 0x165
-	.short	239                     ## 0xef
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	437                     ## 0x1b5
-	.short	65510                   ## 0xffe6
 	.short	32767                   ## 0x7fff
-	.short	210                     ## 0xd2
+	.short	42                      ## 0x2a
+	.short	49                      ## 0x31
+	.short	65023                   ## 0xfdff
+	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	20                      ## 0x14
-	.short	369                     ## 0x171
-	.short	10                      ## 0xa
+	.short	0                       ## 0x0
+	.short	129                     ## 0x81
+	.short	406                     ## 0x196
+	.short	13                      ## 0xd
+	.short	181                     ## 0xb5
+	.short	65497                   ## 0xffd9
+	.short	167                     ## 0xa7
+	.short	646                     ## 0x286
+	.short	256                     ## 0x100
 	.short	32767                   ## 0x7fff
-	.short	65458                   ## 0xffb2
-	.short	616                     ## 0x268
-	.short	70                      ## 0x46
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	86                      ## 0x56
 	.short	32767                   ## 0x7fff
+	.short	544                     ## 0x220
 	.short	0                       ## 0x0
+	.short	4                       ## 0x4
 	.short	32767                   ## 0x7fff
-	.short	14                      ## 0xe
-	.short	60                      ## 0x3c
-	.short	32                      ## 0x20
 	.short	32767                   ## 0x7fff
-	.short	373                     ## 0x175
-	.short	32767                   ## 0x7fff
-	.short	65318                   ## 0xff26
-	.short	320                     ## 0x140
+	.short	280                     ## 0x118
+	.short	65494                   ## 0xffd6
+	.short	65034                   ## 0xfe0a
+	.short	6                       ## 0x6
+	.short	347                     ## 0x15b
 	.short	32767                   ## 0x7fff
 	.short	268                     ## 0x10c
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	425                     ## 0x1a9
-	.short	65469                   ## 0xffbd
+	.short	336                     ## 0x150
+	.short	64                      ## 0x40
+	.short	32767                   ## 0x7fff
+	.short	65515                   ## 0xffeb
+	.short	60                      ## 0x3c
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	252                     ## 0xfc
-	.short	32767                   ## 0x7fff
-	.short	65443                   ## 0xffa3
-	.short	193                     ## 0xc1
-	.short	65174                   ## 0xfe96
-	.short	65396                   ## 0xff74
-	.short	32767                   ## 0x7fff
-	.short	65208                   ## 0xfeb8
-	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	319                     ## 0x13f
-	.short	336                     ## 0x150
+	.short	65521                   ## 0xfff1
 	.short	32767                   ## 0x7fff
-	.short	121                     ## 0x79
+	.short	398                     ## 0x18e
+	.short	113                     ## 0x71
 	.short	0                       ## 0x0
-	.short	32767                   ## 0x7fff
-	.short	207                     ## 0xcf
-	.short	32767                   ## 0x7fff
-	.short	481                     ## 0x1e1
-	.short	65360                   ## 0xff50
-	.short	276                     ## 0x114
-	.short	47                      ## 0x2f
-	.short	235                     ## 0xeb
-	.short	32767                   ## 0x7fff
+	.short	145                     ## 0x91
 	.short	0                       ## 0x0
-	.short	221                     ## 0xdd
-	.short	32767                   ## 0x7fff
-	.short	228                     ## 0xe4
-	.short	32767                   ## 0x7fff
-	.short	84                      ## 0x54
-	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	55                      ## 0x37
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	65521                   ## 0xfff1
+	.short	0                       ## 0x0
+	.short	432                     ## 0x1b0
 	.short	32767                   ## 0x7fff
+	.short	370                     ## 0x172
 	.short	32767                   ## 0x7fff
-	.short	290                     ## 0x122
+	.short	0                       ## 0x0
+	.short	393                     ## 0x189
+	.short	74                      ## 0x4a
 	.short	32767                   ## 0x7fff
+	.short	312                     ## 0x138
 	.short	32767                   ## 0x7fff
-	.short	84                      ## 0x54
-	.short	65366                   ## 0xff56
-	.short	82                      ## 0x52
-	.short	246                     ## 0xf6
-	.short	65493                   ## 0xffd5
-	.short	201                     ## 0xc9
-	.short	155                     ## 0x9b
-	.short	65529                   ## 0xfff9
-	.short	299                     ## 0x12b
+	.short	184                     ## 0xb8
+	.short	65180                   ## 0xfe9c
+	.short	77                      ## 0x4d
+	.short	260                     ## 0x104
+	.short	154                     ## 0x9a
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
+	.short	328                     ## 0x148
 	.short	32767                   ## 0x7fff
-	.short	241                     ## 0xf1
 	.short	32767                   ## 0x7fff
-	.short	65118                   ## 0xfe5e
+	.short	66                      ## 0x42
 	.short	32767                   ## 0x7fff
+	.short	302                     ## 0x12e
+	.short	65140                   ## 0xfe74
+	.short	65214                   ## 0xfebe
+	.short	65521                   ## 0xfff1
+	.short	79                      ## 0x4f
+	.short	101                     ## 0x65
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	65233                   ## 0xfed1
+	.short	65473                   ## 0xffc1
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	65496                   ## 0xffd8
-	.short	308                     ## 0x134
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	178                     ## 0xb2
-	.short	65469                   ## 0xffbd
-	.short	32767                   ## 0x7fff
-	.short	273                     ## 0x111
-	.short	32767                   ## 0x7fff
+	.short	281                     ## 0x119
 	.short	0                       ## 0x0
+	.short	394                     ## 0x18a
+	.short	369                     ## 0x171
 	.short	32767                   ## 0x7fff
-	.short	69                      ## 0x45
-	.short	387                     ## 0x183
-	.short	32767                   ## 0x7fff
-	.short	341                     ## 0x155
+	.short	65401                   ## 0xff79
 	.short	0                       ## 0x0
 	.short	0                       ## 0x0
-	.short	65517                   ## 0xffed
-	.short	324                     ## 0x144
-	.short	65448                   ## 0xffa8
-	.short	166                     ## 0xa6
-	.short	32767                   ## 0x7fff
-	.short	6                       ## 0x6
-	.short	20                      ## 0x14
-	.short	32767                   ## 0x7fff
-	.short	17                      ## 0x11
-	.short	22                      ## 0x16
-	.short	359                     ## 0x167
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	172                     ## 0xac
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	206                     ## 0xce
-	.short	88                      ## 0x58
+	.short	65312                   ## 0xff20
+	.short	719                     ## 0x2cf
+	.short	246                     ## 0xf6
+	.short	3                       ## 0x3
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	35                      ## 0x23
-	.short	0                       ## 0x0
-	.short	275                     ## 0x113
-	.short	114                     ## 0x72
-	.short	339                     ## 0x153
+	.short	68                      ## 0x44
+	.short	243                     ## 0xf3
+	.short	64731                   ## 0xfcdb
+	.short	99                      ## 0x63
+	.short	65499                   ## 0xffdb
 	.short	32767                   ## 0x7fff
+	.short	30                      ## 0x1e
+	.short	681                     ## 0x2a9
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	395                     ## 0x18b
 	.short	32767                   ## 0x7fff
-	.short	524                     ## 0x20c
-	.short	0                       ## 0x0
-	.short	65484                   ## 0xffcc
-	.short	191                     ## 0xbf
-	.short	65421                   ## 0xff8d
-	.short	9                       ## 0x9
-	.short	200                     ## 0xc8
-	.short	102                     ## 0x66
-	.short	0                       ## 0x0
+	.short	210                     ## 0xd2
 	.short	32767                   ## 0x7fff
-	.short	3                       ## 0x3
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
-	.short	65248                   ## 0xfee0
-	.short	0                       ## 0x0
-	.short	65404                   ## 0xff7c
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
+	.short	809                     ## 0x329
 	.short	32767                   ## 0x7fff
-	.short	300                     ## 0x12c
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
-	.short	212                     ## 0xd4
 	.short	32767                   ## 0x7fff
-	.short	260                     ## 0x104
+	.short	103                     ## 0x67
+	.short	65243                   ## 0xfedb
 	.short	32767                   ## 0x7fff
-	.short	65257                   ## 0xfee9
-	.short	104                     ## 0x68
-	.short	506                     ## 0x1fa
-	.short	0                       ## 0x0
-	.short	640                     ## 0x280
-	.short	38                      ## 0x26
-	.short	268                     ## 0x10c
+	.short	389                     ## 0x185
+	.short	47                      ## 0x2f
+	.short	322                     ## 0x142
+	.short	403                     ## 0x193
+	.short	344                     ## 0x158
+	.short	248                     ## 0xf8
+	.short	65317                   ## 0xff25
+	.short	8                       ## 0x8
 	.short	32767                   ## 0x7fff
-	.short	131                     ## 0x83
+	.short	104                     ## 0x68
 	.short	32767                   ## 0x7fff
+	.short	305                     ## 0x131
+	.short	275                     ## 0x113
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	176                     ## 0xb0
+	.short	202                     ## 0xca
+	.short	732                     ## 0x2dc
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	18                      ## 0x12
-	.short	100                     ## 0x64
-	.short	44                      ## 0x2c
-	.short	67                      ## 0x43
-	.short	270                     ## 0x10e
-	.short	245                     ## 0xf5
-	.short	283                     ## 0x11b
-	.short	224                     ## 0xe0
-	.short	65470                   ## 0xffbe
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	205                     ## 0xcd
 	.short	32767                   ## 0x7fff
-	.short	65469                   ## 0xffbd
 	.short	32767                   ## 0x7fff
-	.short	389                     ## 0x185
+	.short	79                      ## 0x4f
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	125                     ## 0x7d
-	.short	354                     ## 0x162
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	65515                   ## 0xffeb
-	.short	124                     ## 0x7c
-	.short	0                       ## 0x0
-	.short	204                     ## 0xcc
+	.short	65478                   ## 0xffc6
+	.short	274                     ## 0x112
+	.short	65388                   ## 0xff6c
+	.short	268                     ## 0x10c
 	.short	32767                   ## 0x7fff
+	.short	3                       ## 0x3
 	.short	0                       ## 0x0
-	.short	99                      ## 0x63
 	.short	32767                   ## 0x7fff
-	.short	267                     ## 0x10b
-	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
+	.short	286                     ## 0x11e
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	231                     ## 0xe7
 	.short	32767                   ## 0x7fff
-	.short	65407                   ## 0xff7f
-	.short	65423                   ## 0xff8f
-	.short	108                     ## 0x6c
-	.short	23                      ## 0x17
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
+	.short	290                     ## 0x122
+	.short	319                     ## 0x13f
 	.short	32767                   ## 0x7fff
+	.short	219                     ## 0xdb
+	.short	230                     ## 0xe6
+	.short	65444                   ## 0xffa4
+	.short	150                     ## 0x96
+	.short	371                     ## 0x173
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
+	.short	112                     ## 0x70
 	.short	32767                   ## 0x7fff
-	.short	269                     ## 0x10d
+	.short	1181                    ## 0x49d
 	.short	32767                   ## 0x7fff
+	.short	118                     ## 0x76
 	.short	32767                   ## 0x7fff
-	.short	65403                   ## 0xff7b
+	.short	57                      ## 0x39
+	.short	128                     ## 0x80
 	.short	32767                   ## 0x7fff
-	.short	65152                   ## 0xfe80
+	.short	15                      ## 0xf
+	.short	478                     ## 0x1de
+	.short	65473                   ## 0xffc1
+	.short	65382                   ## 0xff66
+	.short	325                     ## 0x145
+	.short	402                     ## 0x192
+	.short	550                     ## 0x226
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	65204                   ## 0xfeb4
+	.short	0                       ## 0x0
+	.short	64931                   ## 0xfda3
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
+	.short	208                     ## 0xd0
 	.short	32767                   ## 0x7fff
+	.short	84                      ## 0x54
+	.short	46                      ## 0x2e
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	322                     ## 0x142
-	.short	424                     ## 0x1a8
-	.short	117                     ## 0x75
-	.short	65507                   ## 0xffe3
+	.short	670                     ## 0x29e
+	.short	96                      ## 0x60
 	.short	32767                   ## 0x7fff
+	.short	118                     ## 0x76
+	.short	445                     ## 0x1bd
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	145                     ## 0x91
 	.short	0                       ## 0x0
+	.short	150                     ## 0x96
 	.short	0                       ## 0x0
-	.short	323                     ## 0x143
-	.short	119                     ## 0x77
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	392                     ## 0x188
-	.short	65372                   ## 0xff5c
-	.short	65393                   ## 0xff71
-	.short	65511                   ## 0xffe7
-	.short	65430                   ## 0xff96
 	.short	0                       ## 0x0
-	.short	97                      ## 0x61
+	.short	65482                   ## 0xffca
 	.short	32767                   ## 0x7fff
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	235                     ## 0xeb
+	.short	535                     ## 0x217
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
+	.short	309                     ## 0x135
 	.short	32767                   ## 0x7fff
-	.short	411                     ## 0x19b
-	.short	363                     ## 0x16b
 	.short	32767                   ## 0x7fff
-	.short	31                      ## 0x1f
+	.short	65254                   ## 0xfee6
 	.short	32767                   ## 0x7fff
-	.short	443                     ## 0x1bb
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	76                      ## 0x4c
-	.short	29                      ## 0x1d
+	.short	24                      ## 0x18
+	.short	40                      ## 0x28
 	.short	32767                   ## 0x7fff
-	.short	323                     ## 0x143
 	.short	32767                   ## 0x7fff
-	.short	142                     ## 0x8e
+	.short	109                     ## 0x6d
+	.short	588                     ## 0x24c
+	.short	78                      ## 0x4e
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	244                     ## 0xf4
-	.short	0                       ## 0x0
+	.short	25                      ## 0x19
 	.short	32767                   ## 0x7fff
-	.short	28                      ## 0x1c
+	.short	152                     ## 0x98
+	.short	65103                   ## 0xfe4f
+	.short	290                     ## 0x122
+	.short	65355                   ## 0xff4b
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	377                     ## 0x179
-	.short	65528                   ## 0xfff8
-	.short	65491                   ## 0xffd3
 	.short	32767                   ## 0x7fff
-	.short	37                      ## 0x25
-	.short	0                       ## 0x0
-	.short	350                     ## 0x15e
-	.short	0                       ## 0x0
+	.short	2                       ## 0x2
+	.short	187                     ## 0xbb
+	.short	349                     ## 0x15d
+	.short	21                      ## 0x15
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	38                      ## 0x26
+	.short	353                     ## 0x161
+	.short	0                       ## 0x0
+	.short	411                     ## 0x19b
 	.short	416                     ## 0x1a0
+	.short	65415                   ## 0xff87
 	.short	32767                   ## 0x7fff
-	.short	265                     ## 0x109
-	.short	65458                   ## 0xffb2
-	.short	65228                   ## 0xfecc
-	.short	65485                   ## 0xffcd
-	.short	705                     ## 0x2c1
+	.short	329                     ## 0x149
+	.short	422                     ## 0x1a6
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	66                      ## 0x42
-	.short	0                       ## 0x0
+	.short	350                     ## 0x15e
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	289                     ## 0x121
 	.short	32767                   ## 0x7fff
-	.short	81                      ## 0x51
-	.short	65286                   ## 0xff06
+	.short	354                     ## 0x162
+	.short	23                      ## 0x17
 	.short	32767                   ## 0x7fff
-	.short	1                       ## 0x1
-	.short	421                     ## 0x1a5
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
+	.short	178                     ## 0xb2
 	.short	32767                   ## 0x7fff
-	.short	401                     ## 0x191
-	.short	198                     ## 0xc6
+	.short	65265                   ## 0xfef1
+	.short	65374                   ## 0xff5e
+	.short	141                     ## 0x8d
 	.short	32767                   ## 0x7fff
-	.short	256                     ## 0x100
-	.short	290                     ## 0x122
-	.short	210                     ## 0xd2
+	.short	0                       ## 0x0
+	.short	0                       ## 0x0
+	.short	32767                   ## 0x7fff
+	.short	351                     ## 0x15f
+	.short	313                     ## 0x139
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	8                       ## 0x8
+	.short	304                     ## 0x130
 	.short	0                       ## 0x0
-	.short	444                     ## 0x1bc
-	.short	211                     ## 0xd3
-	.short	65437                   ## 0xff9d
-	.short	220                     ## 0xdc
-	.short	64                      ## 0x40
+	.short	41                      ## 0x29
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	65480                   ## 0xffc8
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	190                     ## 0xbe
-	.short	19                      ## 0x13
-	.short	0                       ## 0x0
-	.short	216                     ## 0xd8
 	.short	32767                   ## 0x7fff
-	.short	262                     ## 0x106
 	.short	32767                   ## 0x7fff
-	.short	404                     ## 0x194
-	.short	562                     ## 0x232
-	.short	65314                   ## 0xff22
 	.short	0                       ## 0x0
+	.short	923                     ## 0x39b
+	.short	65252                   ## 0xfee4
+	.short	245                     ## 0xf5
+	.short	387                     ## 0x183
+	.short	212                     ## 0xd4
 	.short	0                       ## 0x0
-	.short	65374                   ## 0xff5e
 	.short	32767                   ## 0x7fff
-	.short	192                     ## 0xc0
-	.short	65                      ## 0x41
-	.short	32767                   ## 0x7fff
-	.short	150                     ## 0x96
-	.short	191                     ## 0xbf
 	.short	0                       ## 0x0
-	.short	218                     ## 0xda
-	.short	267                     ## 0x10b
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	399                     ## 0x18f
-	.short	189                     ## 0xbd
-	.short	356                     ## 0x164
-	.short	532                     ## 0x214
+	.short	65489                   ## 0xffd1
 	.short	0                       ## 0x0
+	.short	520                     ## 0x208
+	.short	65532                   ## 0xfffc
+	.short	104                     ## 0x68
+	.short	522                     ## 0x20a
+	.short	32767                   ## 0x7fff
+	.short	65423                   ## 0xff8f
+	.short	88                      ## 0x58
+	.short	73                      ## 0x49
 	.short	32767                   ## 0x7fff
-	.short	429                     ## 0x1ad
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	54                      ## 0x36
-	.short	279                     ## 0x117
-	.short	151                     ## 0x97
-	.short	0                       ## 0x0
-	.short	353                     ## 0x161
-	.short	394                     ## 0x18a
-	.short	176                     ## 0xb0
-	.short	215                     ## 0xd7
 	.short	32767                   ## 0x7fff
-	.short	15                      ## 0xf
-	.short	153                     ## 0x99
-	.short	137                     ## 0x89
-	.short	92                      ## 0x5c
-	.short	420                     ## 0x1a4
-	.short	47                      ## 0x2f
-	.short	253                     ## 0xfd
 	.short	0                       ## 0x0
-	.short	298                     ## 0x12a
-	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	234                     ## 0xea
-	.short	164                     ## 0xa4
-	.short	241                     ## 0xf1
+	.short	189                     ## 0xbd
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	409                     ## 0x199
-	.short	0                       ## 0x0
+	.short	65241                   ## 0xfed9
+	.short	65516                   ## 0xffec
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	70                      ## 0x46
 	.short	32767                   ## 0x7fff
+	.short	131                     ## 0x83
 	.short	32767                   ## 0x7fff
+	.short	273                     ## 0x111
+	.short	63                      ## 0x3f
+	.short	65399                   ## 0xff77
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
+	.short	65512                   ## 0xffe8
+	.short	90                      ## 0x5a
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	65398                   ## 0xff76
-	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	65490                   ## 0xffd2
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	97                      ## 0x61
+	.short	65340                   ## 0xff3c
+	.short	365                     ## 0x16d
+	.short	313                     ## 0x139
+	.short	368                     ## 0x170
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	65410                   ## 0xff82
+	.short	31                      ## 0x1f
+	.short	332                     ## 0x14c
+	.short	412                     ## 0x19c
+	.short	670                     ## 0x29e
+	.short	391                     ## 0x187
 	.short	32767                   ## 0x7fff
-	.short	169                     ## 0xa9
-	.short	322                     ## 0x142
-	.short	392                     ## 0x188
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
+	.short	368                     ## 0x170
 	.short	32767                   ## 0x7fff
+	.short	136                     ## 0x88
+	.short	0                       ## 0x0
+	.short	426                     ## 0x1aa
+	.short	116                     ## 0x74
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	282                     ## 0x11a
-	.short	296                     ## 0x128
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	403                     ## 0x193
+	.short	5                       ## 0x5
+	.short	313                     ## 0x139
+	.short	109                     ## 0x6d
 	.short	32767                   ## 0x7fff
-	.short	65512                   ## 0xffe8
+	.short	259                     ## 0x103
 	.short	32767                   ## 0x7fff
+	.short	206                     ## 0xce
+	.short	177                     ## 0xb1
+	.short	449                     ## 0x1c1
+	.short	445                     ## 0x1bd
+	.short	65081                   ## 0xfe39
 	.short	65502                   ## 0xffde
+	.short	177                     ## 0xb1
 	.short	32767                   ## 0x7fff
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
+	.short	0                       ## 0x0
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	418                     ## 0x1a2
+	.short	0                       ## 0x0
+	.short	0                       ## 0x0
+	.short	0                       ## 0x0
+	.short	64948                   ## 0xfdb4
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	97                      ## 0x61
-	.short	238                     ## 0xee
+	.short	30                      ## 0x1e
 	.short	32767                   ## 0x7fff
-	.short	144                     ## 0x90
-	.short	428                     ## 0x1ac
+	.short	65481                   ## 0xffc9
+	.short	332                     ## 0x14c
+	.short	32767                   ## 0x7fff
+	.short	0                       ## 0x0
+	.short	65462                   ## 0xffb6
 	.short	32767                   ## 0x7fff
-	.short	2                       ## 0x2
 	.short	32767                   ## 0x7fff
+	.short	65411                   ## 0xff83
 	.short	32767                   ## 0x7fff
+	.short	146                     ## 0x92
 	.short	32767                   ## 0x7fff
-	.short	194                     ## 0xc2
-	.short	65354                   ## 0xff4a
-	.short	12                      ## 0xc
 	.short	32767                   ## 0x7fff
-	.short	391                     ## 0x187
+	.short	252                     ## 0xfc
 	.short	32767                   ## 0x7fff
-	.short	880                     ## 0x370
 	.short	32767                   ## 0x7fff
+	.short	431                     ## 0x1af
+	.short	893                     ## 0x37d
+	.short	178                     ## 0xb2
+	.short	65524                   ## 0xfff4
 	.short	32767                   ## 0x7fff
-	.short	50                      ## 0x32
-	.short	331                     ## 0x14b
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
-	.short	358                     ## 0x166
-	.short	20                      ## 0x14
+	.short	142                     ## 0x8e
+	.short	299                     ## 0x12b
+	.short	207                     ## 0xcf
+	.short	25                      ## 0x19
+	.short	238                     ## 0xee
+	.short	65077                   ## 0xfe35
+	.short	148                     ## 0x94
 	.short	32767                   ## 0x7fff
+	.short	193                     ## 0xc1
 	.short	32767                   ## 0x7fff
-	.short	222                     ## 0xde
-	.short	317                     ## 0x13d
+	.short	11                      ## 0xb
+	.short	0                       ## 0x0
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	125                     ## 0x7d
+	.short	0                       ## 0x0
+	.short	407                     ## 0x197
+	.short	383                     ## 0x17f
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
+	.short	0                       ## 0x0
+	.short	330                     ## 0x14a
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	284                     ## 0x11c
+	.short	65492                   ## 0xffd4
 	.short	32767                   ## 0x7fff
+	.short	320                     ## 0x140
+	.short	32767                   ## 0x7fff
+	.short	277                     ## 0x115
 	.short	32767                   ## 0x7fff
-	.short	197                     ## 0xc5
-	.short	0                       ## 0x0
-	.short	63                      ## 0x3f
 	.short	32767                   ## 0x7fff
+	.short	174                     ## 0xae
+	.short	65325                   ## 0xff2d
 	.short	0                       ## 0x0
-	.short	188                     ## 0xbc
 	.short	32767                   ## 0x7fff
+	.short	0                       ## 0x0
+	.short	0                       ## 0x0
+	.short	65197                   ## 0xfead
+	.short	417                     ## 0x1a1
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	147                     ## 0x93
-	.short	190                     ## 0xbe
-	.short	344                     ## 0x158
 	.short	32767                   ## 0x7fff
-	.short	65494                   ## 0xffd6
+	.short	65407                   ## 0xff7f
+	.short	87                      ## 0x57
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	187                     ## 0xbb
+	.short	312                     ## 0x138
+	.short	42                      ## 0x2a
 	.short	32767                   ## 0x7fff
+	.short	65077                   ## 0xfe35
 	.short	32767                   ## 0x7fff
-	.short	350                     ## 0x15e
 	.short	32767                   ## 0x7fff
+	.short	297                     ## 0x129
+	.short	65451                   ## 0xffab
+	.short	82                      ## 0x52
+	.short	124                     ## 0x7c
+	.short	840                     ## 0x348
+	.short	236                     ## 0xec
+	.short	139                     ## 0x8b
 	.short	0                       ## 0x0
-	.short	0                       ## 0x0
-	.short	127                     ## 0x7f
 	.short	32767                   ## 0x7fff
+	.short	26                      ## 0x1a
 	.short	32767                   ## 0x7fff
-	.short	161                     ## 0xa1
+	.short	390                     ## 0x186
 	.short	32767                   ## 0x7fff
+	.short	143                     ## 0x8f
+	.short	93                      ## 0x5d
+	.short	115                     ## 0x73
+	.short	0                       ## 0x0
 	.short	0                       ## 0x0
 	.short	0                       ## 0x0
-	.short	382                     ## 0x17e
 	.short	32767                   ## 0x7fff
+	.short	65                      ## 0x41
+	.short	0                       ## 0x0
+	.short	84                      ## 0x54
+	.short	65402                   ## 0xff7a
 	.short	32767                   ## 0x7fff
-	.short	316                     ## 0x13c
-	.short	130                     ## 0x82
 	.short	32767                   ## 0x7fff
-	.short	379                     ## 0x17b
 	.short	32767                   ## 0x7fff
-	.short	383                     ## 0x17f
-	.short	368                     ## 0x170
-	.short	93                      ## 0x5d
-	.short	65341                   ## 0xff3d
-	.short	0                       ## 0x0
-	.short	233                     ## 0xe9
-	.short	73                      ## 0x49
 	.short	32767                   ## 0x7fff
-	.short	100                     ## 0x64
 	.short	32767                   ## 0x7fff
-	.short	338                     ## 0x152
-	.short	90                      ## 0x5a
 	.short	32767                   ## 0x7fff
-	.short	258                     ## 0x102
+	.short	103                     ## 0x67
+	.short	32767                   ## 0x7fff
+	.short	188                     ## 0xbc
+	.short	342                     ## 0x156
+	.short	72                      ## 0x48
+	.short	699                     ## 0x2bb
+	.short	102                     ## 0x66
+	.short	399                     ## 0x18f
+	.short	151                     ## 0x97
 	.short	32767                   ## 0x7fff
+	.short	626                     ## 0x272
+	.short	109                     ## 0x6d
+	.short	0                       ## 0x0
+	.short	65338                   ## 0xff3a
 	.short	32767                   ## 0x7fff
-	.short	235                     ## 0xeb
-	.short	175                     ## 0xaf
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	65527                   ## 0xfff7
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
+	.short	2                       ## 0x2
+	.short	19                      ## 0x13
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	111                     ## 0x6f
-	.short	417                     ## 0x1a1
-	.short	330                     ## 0x14a
+	.short	195                     ## 0xc3
 	.short	0                       ## 0x0
+	.short	73                      ## 0x49
 	.short	0                       ## 0x0
-	.short	225                     ## 0xe1
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	64                      ## 0x40
+	.short	44                      ## 0x2c
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	16                      ## 0x10
-	.short	113                     ## 0x71
-	.short	29                      ## 0x1d
-	.short	0                       ## 0x0
+	.short	64                      ## 0x40
+	.short	87                      ## 0x57
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	43                      ## 0x2b
-	.short	0                       ## 0x0
-	.short	365                     ## 0x16d
-	.short	65495                   ## 0xffd7
-	.short	65252                   ## 0xfee4
-	.short	0                       ## 0x0
-	.short	0                       ## 0x0
 	.short	0                       ## 0x0
-	.short	61                      ## 0x3d
-	.short	314                     ## 0x13a
-	.short	255                     ## 0xff
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	145                     ## 0x91
-	.short	32767                   ## 0x7fff
-	.short	65091                   ## 0xfe43
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	154                     ## 0x9a
 
 	.section	__DWARF,__debug_str,regular,debug
 Linfo_string:
@@ -2317,7 +2319,7 @@ Ldebug_info_start0:
 	.long	567                     ## DW_AT_type
 	.byte	15                      ## Abbrev [15] 0x22f:0x7 DW_TAG_subrange_type
 	.long	327                     ## DW_AT_type
-	.short	901                     ## DW_AT_count
+	.short	902                     ## DW_AT_count
 	.byte	0                       ## End Of Children Mark
 	.byte	3                       ## Abbrev [3] 0x237:0x5 DW_TAG_const_type
 	.long	572                     ## DW_AT_type
diff --git a/src/interfaces/ecpg/preproc/c_keywords.s b/src/interfaces/ecpg/preproc/c_keywords.s
index 2bf3f117c6..3ade6bbf8d 100644
--- a/src/interfaces/ecpg/preproc/c_keywords.s
+++ b/src/interfaces/ecpg/preproc/c_keywords.s
@@ -44,19 +44,22 @@ Ltmp3:
 	cmpq	$8, %rax
 Ltmp4:
 	.loc	6 47 6 is_stmt 0        ## c_keywords.c:47:6
-	ja	LBB0_14
+	ja	LBB0_13
 Ltmp5:
 ## %bb.1:
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
 	##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
-	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- 1
-	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- 2
+	.loc	6 0 6                   ## c_keywords.c:0:6
+	xorl	%esi, %esi
+Ltmp6:
+	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- 0
+	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- 0
 	.loc	5 100 2 is_stmt 1       ## ./c_kwlist_d.h:100:2
 	testq	%rax, %rax
 	je	LBB0_2
-Ltmp6:
+Ltmp7:
 ## %bb.3:
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
 	##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
@@ -66,237 +69,229 @@ Ltmp6:
 	leaq	-1(%rax), %rcx
 	movl	%eax, %r8d
 	andl	$3, %r8d
-	cmpq	$3, %rcx
-	jae	LBB0_5
-Ltmp7:
-## %bb.4:
-	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
-	##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
-	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
-	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
-	.loc	5 0 15                  ## ./c_kwlist_d.h:0:15
-	movl	$1, %esi
-	movl	$2, %edx
+	movl	$0, %ebx
 	movq	%r15, %r10
-	jmp	LBB0_7
+	cmpq	$3, %rcx
+	jb	LBB0_6
 Ltmp8:
-LBB0_2:
-	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
-	##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
-	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
-	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
-	movl	$2, %ebx
-	movl	$1, %edi
-	jmp	LBB0_11
-Ltmp9:
-LBB0_5:
+## %bb.4:
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
 	##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
-	.loc	5 100 15                ## ./c_kwlist_d.h:100:15
 	movq	%r8, %r9
 	subq	%rax, %r9
-	movl	$1, %esi
-	movl	$2, %edx
+	xorl	%esi, %esi
+	xorl	%ebx, %ebx
 	movq	%r15, %r10
-Ltmp10:
+Ltmp9:
 	.p2align	4, 0x90
-LBB0_6:                                 ## =>This Inner Loop Header: Depth=1
+LBB0_5:                                 ## =>This Inner Loop Header: Depth=1
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
 	##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- undef
-	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $esi
-	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edx
+	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ebx
+	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $esi
 	##DEBUG_VALUE: ScanCKeywords_hash_func:k <- $r10
 	##DEBUG_VALUE: c <- undef
 	.loc	5 102 21 is_stmt 1      ## ./c_kwlist_d.h:102:21
-	movzbl	(%r10), %ecx
+	movzbl	(%r10), %eax
+Ltmp10:
 	.loc	5 104 9                 ## ./c_kwlist_d.h:104:9
-	movl	%esi, %ebx
-	shll	$5, %ebx
-	subl	%esi, %ebx
-	.loc	5 104 14 is_stmt 0      ## ./c_kwlist_d.h:104:14
-	addl	%ecx, %ebx
+	movl	%ebx, %ecx
+	shll	$8, %ecx
+	addl	%ebx, %ecx
+	.loc	5 104 15 is_stmt 0      ## ./c_kwlist_d.h:104:15
+	addl	%eax, %ecx
 Ltmp11:
-	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ebx
+	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ecx
 	.loc	5 105 9 is_stmt 1       ## ./c_kwlist_d.h:105:9
-	movl	%edx, %esi
-	shll	$7, %esi
-	subl	%edx, %esi
-	.loc	5 105 15 is_stmt 0      ## ./c_kwlist_d.h:105:15
-	addl	%ecx, %esi
+	movl	%esi, %ebx
+	shll	$4, %ebx
+	addl	%esi, %ebx
+	.loc	5 105 14 is_stmt 0      ## ./c_kwlist_d.h:105:14
+	addl	%eax, %ebx
 Ltmp12:
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 1, DW_OP_minus, DW_OP_stack_value] undef
-	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $esi
+	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $ebx
 	.loc	5 102 21 is_stmt 1      ## ./c_kwlist_d.h:102:21
-	movzbl	1(%r10), %ecx
+	movzbl	1(%r10), %eax
 	##DEBUG_VALUE: c <- undef
 	.loc	5 104 9                 ## ./c_kwlist_d.h:104:9
-	movl	%ebx, %edx
-	shll	$5, %edx
-	subl	%ebx, %edx
-	.loc	5 104 14 is_stmt 0      ## ./c_kwlist_d.h:104:14
-	addl	%ecx, %edx
+	movl	%ecx, %esi
+	shll	$8, %esi
+	addl	%ecx, %esi
+	.loc	5 104 15 is_stmt 0      ## ./c_kwlist_d.h:104:15
+	addl	%eax, %esi
 Ltmp13:
-	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $edx
+	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $esi
 	.loc	5 105 9 is_stmt 1       ## ./c_kwlist_d.h:105:9
-	movl	%esi, %ebx
-	shll	$7, %ebx
-	subl	%esi, %ebx
-	.loc	5 105 15 is_stmt 0      ## ./c_kwlist_d.h:105:15
-	addl	%ecx, %ebx
+	movl	%ebx, %ecx
+	shll	$4, %ecx
+	addl	%ebx, %ecx
+	.loc	5 105 14 is_stmt 0      ## ./c_kwlist_d.h:105:14
+	addl	%eax, %ecx
 Ltmp14:
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
-	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $ebx
+	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $ecx
 	.loc	5 102 21 is_stmt 1      ## ./c_kwlist_d.h:102:21
-	movzbl	2(%r10), %ecx
+	movzbl	2(%r10), %eax
 	##DEBUG_VALUE: c <- undef
 	.loc	5 104 9                 ## ./c_kwlist_d.h:104:9
-	movl	%edx, %edi
-	shll	$5, %edi
-	subl	%edx, %edi
-	.loc	5 104 14 is_stmt 0      ## ./c_kwlist_d.h:104:14
-	addl	%ecx, %edi
+	movl	%esi, %edi
+	shll	$8, %edi
+	addl	%esi, %edi
+	.loc	5 104 15 is_stmt 0      ## ./c_kwlist_d.h:104:15
+	addl	%eax, %edi
 Ltmp15:
 	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $edi
 	.loc	5 105 9 is_stmt 1       ## ./c_kwlist_d.h:105:9
-	movl	%ebx, %eax
-Ltmp16:
-	shll	$7, %eax
-	subl	%ebx, %eax
-	.loc	5 105 15 is_stmt 0      ## ./c_kwlist_d.h:105:15
-	addl	%ecx, %eax
+	movl	%ecx, %edx
+	shll	$4, %edx
+	addl	%ecx, %edx
+	.loc	5 105 14 is_stmt 0      ## ./c_kwlist_d.h:105:14
+	addl	%eax, %edx
 	.loc	5 102 21 is_stmt 1      ## ./c_kwlist_d.h:102:21
-	movzbl	3(%r10), %ecx
-Ltmp17:
+	movzbl	3(%r10), %eax
+Ltmp16:
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 3, DW_OP_minus, DW_OP_stack_value] undef
-	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $eax
+	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edx
 	.loc	5 102 23 is_stmt 0      ## ./c_kwlist_d.h:102:23
 	addq	$4, %r10
-Ltmp18:
+Ltmp17:
 	##DEBUG_VALUE: c <- undef
 	##DEBUG_VALUE: ScanCKeywords_hash_func:k <- $r10
 	.loc	5 104 9 is_stmt 1       ## ./c_kwlist_d.h:104:9
-	movl	%edi, %esi
-	shll	$5, %esi
-	subl	%edi, %esi
-	.loc	5 104 14 is_stmt 0      ## ./c_kwlist_d.h:104:14
-	addl	%ecx, %esi
-Ltmp19:
-	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $esi
+	movl	%edi, %ebx
+	shll	$8, %ebx
+	addl	%edi, %ebx
+	.loc	5 104 15 is_stmt 0      ## ./c_kwlist_d.h:104:15
+	addl	%eax, %ebx
+Ltmp18:
+	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ebx
 	.loc	5 105 9 is_stmt 1       ## ./c_kwlist_d.h:105:9
-	movl	%eax, %edx
-	shll	$7, %edx
-	subl	%eax, %edx
-	.loc	5 105 15 is_stmt 0      ## ./c_kwlist_d.h:105:15
-	addl	%ecx, %edx
-Ltmp20:
+	movl	%edx, %esi
+	shll	$4, %esi
+	addl	%edx, %esi
+	.loc	5 105 14 is_stmt 0      ## ./c_kwlist_d.h:105:14
+	addl	%eax, %esi
+Ltmp19:
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 4, DW_OP_minus, DW_OP_stack_value] undef
-	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edx
+	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $esi
 	.loc	5 100 2 is_stmt 1       ## ./c_kwlist_d.h:100:2
 	addq	$4, %r9
-	jne	LBB0_6
-Ltmp21:
-LBB0_7:
+	jne	LBB0_5
+Ltmp20:
+LBB0_6:
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
-	.loc	5 104 14                ## ./c_kwlist_d.h:104:14
+	.loc	5 104 15                ## ./c_kwlist_d.h:104:15
+	movl	%ebx, %eax
+	.loc	5 105 14                ## ./c_kwlist_d.h:105:14
 	movl	%esi, %edi
-	.loc	5 105 15                ## ./c_kwlist_d.h:105:15
-	movl	%edx, %ebx
-Ltmp22:
+Ltmp21:
 	.loc	5 100 2                 ## ./c_kwlist_d.h:100:2
 	testq	%r8, %r8
-	je	LBB0_10
-Ltmp23:
-## %bb.8:
+	je	LBB0_9
+Ltmp22:
+## %bb.7:
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
 	.loc	5 0 2 is_stmt 0         ## ./c_kwlist_d.h:0:2
 	xorl	%ecx, %ecx
-Ltmp24:
+Ltmp23:
 	.p2align	4, 0x90
-LBB0_9:                                 ## =>This Inner Loop Header: Depth=1
+LBB0_8:                                 ## =>This Inner Loop Header: Depth=1
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- undef
-	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $esi
-	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edx
+	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ebx
+	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $esi
 	##DEBUG_VALUE: ScanCKeywords_hash_func:k <- undef
 	##DEBUG_VALUE: c <- undef
 	.loc	5 102 21 is_stmt 1      ## ./c_kwlist_d.h:102:21
-	movzbl	(%r10,%rcx), %eax
+	movzbl	(%r10,%rcx), %edx
 	.loc	5 104 9                 ## ./c_kwlist_d.h:104:9
+	movl	%ebx, %eax
+	shll	$8, %eax
+	addl	%ebx, %eax
+	.loc	5 104 15 is_stmt 0      ## ./c_kwlist_d.h:104:15
+	addl	%edx, %eax
+Ltmp24:
+	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $eax
+	.loc	5 105 9 is_stmt 1       ## ./c_kwlist_d.h:105:9
 	movl	%esi, %edi
-	shll	$5, %edi
-	subl	%esi, %edi
-	.loc	5 104 14 is_stmt 0      ## ./c_kwlist_d.h:104:14
-	addl	%eax, %edi
+	shll	$4, %edi
+	addl	%esi, %edi
+	.loc	5 105 14 is_stmt 0      ## ./c_kwlist_d.h:105:14
+	addl	%edx, %edi
 Ltmp25:
-	##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $edi
-	.loc	5 105 9 is_stmt 1       ## ./c_kwlist_d.h:105:9
-	movl	%edx, %ebx
-	shll	$7, %ebx
-	subl	%edx, %ebx
-	.loc	5 105 15 is_stmt 0      ## ./c_kwlist_d.h:105:15
-	addl	%eax, %ebx
-Ltmp26:
 	##DEBUG_VALUE: ScanCKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
 	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 1, DW_OP_minus, DW_OP_stack_value] undef
-	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $ebx
+	##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edi
 	.loc	5 100 2 is_stmt 1       ## ./c_kwlist_d.h:100:2
 	incq	%rcx
-	movl	%ebx, %edx
 	movl	%edi, %esi
+	movl	%eax, %ebx
 	cmpq	%rcx, %r8
-	jne	LBB0_9
-Ltmp27:
-LBB0_10:
+	jne	LBB0_8
+Ltmp26:
+LBB0_9:
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
 	.loc	5 107 13                ## ./c_kwlist_d.h:107:13
-	movl	%edi, %eax
-	imulq	$891408307, %rax, %rax  ## imm = 0x3521CFB3
-	shrq	$32, %rax
+	movl	%eax, %ecx
+	imulq	$891408307, %rcx, %rcx  ## imm = 0x3521CFB3
+	shrq	$32, %rcx
+	movl	%eax, %edx
+	subl	%ecx, %edx
+	shrl	%edx
+	addl	%ecx, %edx
+	shrl	$5, %edx
+	imull	$53, %edx, %ecx
+	subl	%ecx, %eax
 	movl	%edi, %ecx
-	subl	%eax, %ecx
-	shrl	%ecx
-	addl	%eax, %ecx
-	shrl	$5, %ecx
-	imull	$53, %ecx, %eax
-	subl	%eax, %edi
-	movl	%ebx, %eax
-	imulq	$891408307, %rax, %rax  ## imm = 0x3521CFB3
-	shrq	$32, %rax
-	movl	%ebx, %ecx
-	subl	%eax, %ecx
-	shrl	%ecx
-	addl	%eax, %ecx
-	shrl	$5, %ecx
-	imull	$53, %ecx, %eax
-	subl	%eax, %ebx
+	imulq	$891408307, %rcx, %rcx  ## imm = 0x3521CFB3
+	shrq	$32, %rcx
+	movl	%edi, %edx
+	subl	%ecx, %edx
+	shrl	%edx
+	addl	%ecx, %edx
+	shrl	$5, %edx
+	imull	$53, %edx, %ecx
+	subl	%ecx, %edi
+	jmp	LBB0_10
+Ltmp27:
+LBB0_2:
+	##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
+	##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
+	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
+	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
+	.loc	5 0 13 is_stmt 0        ## ./c_kwlist_d.h:0:13
+	xorl	%eax, %eax
 Ltmp28:
-LBB0_11:
+	xorl	%edi, %edi
+Ltmp29:
+LBB0_10:
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
-	.loc	5 107 9 is_stmt 0       ## ./c_kwlist_d.h:107:9
-	leaq	_ScanCKeywords_hash_func.h(%rip), %rax
-	movsbq	(%rdi,%rax), %rcx
+	.loc	5 107 9                 ## ./c_kwlist_d.h:107:9
+	leaq	_ScanCKeywords_hash_func.h(%rip), %rcx
+	movsbq	(%rax,%rcx), %rax
 	.loc	5 107 21                ## ./c_kwlist_d.h:107:21
-	movsbq	(%rbx,%rax), %rbx
+	movsbq	(%rdi,%rcx), %rbx
 	.loc	5 107 19                ## ./c_kwlist_d.h:107:19
-	addq	%rcx, %rbx
-Ltmp29:
+	addq	%rax, %rbx
+Ltmp30:
 	##DEBUG_VALUE: ScanCKeywordLookup:h <- $ebx
 	##DEBUG_VALUE: GetScanKeyword:n <- $ebx
 	.loc	6 57 12 is_stmt 1       ## c_keywords.c:57:12
 	cmpl	$25, %ebx
-	ja	LBB0_14
-Ltmp30:
-## %bb.12:
+	ja	LBB0_13
+Ltmp31:
+## %bb.11:
 	##DEBUG_VALUE: GetScanKeyword:n <- $ebx
 	##DEBUG_VALUE: ScanCKeywordLookup:h <- $ebx
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
@@ -306,26 +301,26 @@ Ltmp30:
 	.loc	1 41 29 is_stmt 0       ## ../../../../src/include/common/kwlookup.h:41:29
 	leaq	_ScanCKeywords_kw_string(%rip), %rdi
 	addq	%rax, %rdi
-Ltmp31:
+Ltmp32:
 	##DEBUG_VALUE: ScanCKeywordLookup:kw <- $rdi
 	.loc	6 62 6 is_stmt 1        ## c_keywords.c:62:6
 	movq	%r15, %rsi
 	callq	_strcmp
-Ltmp32:
+Ltmp33:
 	.loc	6 62 22 is_stmt 0       ## c_keywords.c:62:22
 	testl	%eax, %eax
-Ltmp33:
-	.loc	6 62 6                  ## c_keywords.c:62:6
-	jne	LBB0_14
 Ltmp34:
-## %bb.13:
+	.loc	6 62 6                  ## c_keywords.c:62:6
+	jne	LBB0_13
+Ltmp35:
+## %bb.12:
 	##DEBUG_VALUE: ScanCKeywordLookup:h <- $ebx
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	.loc	6 63 10 is_stmt 1       ## c_keywords.c:63:10
 	leaq	_ScanCKeywordTokens(%rip), %rax
 	movzwl	(%rax,%rbx,2), %r14d
-Ltmp35:
-LBB0_14:
+Ltmp36:
+LBB0_13:
 	##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
 	.loc	6 66 1                  ## c_keywords.c:66:1
 	movl	%r14d, %eax
@@ -333,10 +328,10 @@ LBB0_14:
 	popq	%rbx
 	popq	%r14
 	popq	%r15
-Ltmp36:
+Ltmp37:
 	popq	%rbp
 	retq
-Ltmp37:
+Ltmp38:
 Lfunc_end0:
 	.cfi_endproc
                                         ## -- End function
@@ -405,7 +400,7 @@ _ScanCKeywords_kw_offsets:
 
 	.p2align	4               ## @ScanCKeywords_hash_func.h
 _ScanCKeywords_hash_func.h:
-	.ascii	"\030\016\000\n\023\002\013\003\006\177\177\177\177\002\000\177\000\t\177\177\177\177\021\177\000\001\005\000\000\364\025\r\177\177\000\177\177\000\177\007\177\020\002\000\n\000\000\003\000\004\000\022\024"
+	.asciz	"\373\000\177\367\000\177\177\003\177\017\177\177\177\177\013\020\001\000\006\020\t\005\177\000\177\024\030\373\005\022\005\022\002\177\177\177\024\177\357\000\177\002\177\006\177\366\f\023\000\000\000\177"
 
 	.section	__DWARF,__debug_str,regular,debug
 Linfo_string:
@@ -438,10 +433,10 @@ Linfo_string:
 	.asciz	"ScanCKeywords_hash_func" ## string offset=418
 	.asciz	"key"                   ## string offset=442
 	.asciz	"keylen"                ## string offset=446
-	.asciz	"a"                     ## string offset=453
+	.asciz	"b"                     ## string offset=453
 	.asciz	"uint32"                ## string offset=455
 	.asciz	"unsigned int"          ## string offset=462
-	.asciz	"b"                     ## string offset=475
+	.asciz	"a"                     ## string offset=475
 	.asciz	"k"                     ## string offset=477
 	.asciz	"c"                     ## string offset=479
 	.asciz	"GetScanKeyword"        ## string offset=481
@@ -462,7 +457,7 @@ Ldebug_loc0:
 	.byte	85                      ## DW_OP_reg5
 .set Lset2, Ltmp1-Lfunc_begin0
 	.quad	Lset2
-.set Lset3, Ltmp36-Lfunc_begin0
+.set Lset3, Ltmp37-Lfunc_begin0
 	.quad	Lset3
 	.short	1                       ## Loc expr size
 	.byte	95                      ## DW_OP_reg15
@@ -477,7 +472,7 @@ Ldebug_loc1:
 	.byte	85                      ## DW_OP_reg5
 .set Lset6, Ltmp1-Lfunc_begin0
 	.quad	Lset6
-.set Lset7, Ltmp30-Lfunc_begin0
+.set Lset7, Ltmp31-Lfunc_begin0
 	.quad	Lset7
 	.short	1                       ## Loc expr size
 	.byte	95                      ## DW_OP_reg15
@@ -486,157 +481,169 @@ Ldebug_loc1:
 Ldebug_loc2:
 .set Lset8, Ltmp2-Lfunc_begin0
 	.quad	Lset8
-.set Lset9, Ltmp16-Lfunc_begin0
+.set Lset9, Ltmp10-Lfunc_begin0
 	.quad	Lset9
 	.short	1                       ## Loc expr size
 	.byte	80                      ## DW_OP_reg0
-	.quad	0
-	.quad	0
-Ldebug_loc3:
-.set Lset10, Ltmp2-Lfunc_begin0
+.set Lset10, Ltmp27-Lfunc_begin0
 	.quad	Lset10
-.set Lset11, Ltmp10-Lfunc_begin0
+.set Lset11, Ltmp28-Lfunc_begin0
 	.quad	Lset11
 	.short	1                       ## Loc expr size
 	.byte	80                      ## DW_OP_reg0
 	.quad	0
 	.quad	0
-Ldebug_loc4:
-.set Lset12, Ltmp5-Lfunc_begin0
+Ldebug_loc3:
+.set Lset12, Ltmp2-Lfunc_begin0
 	.quad	Lset12
-.set Lset13, Ltmp10-Lfunc_begin0
+.set Lset13, Ltmp9-Lfunc_begin0
 	.quad	Lset13
-	.short	2                       ## Loc expr size
-	.byte	49                      ## DW_OP_lit1
-	.byte	159                     ## DW_OP_stack_value
-.set Lset14, Ltmp10-Lfunc_begin0
+	.short	1                       ## Loc expr size
+	.byte	80                      ## DW_OP_reg0
+.set Lset14, Ltmp27-Lfunc_begin0
 	.quad	Lset14
-.set Lset15, Ltmp11-Lfunc_begin0
+.set Lset15, Ltmp28-Lfunc_begin0
 	.quad	Lset15
 	.short	1                       ## Loc expr size
-	.byte	84                      ## super-register DW_OP_reg4
-.set Lset16, Ltmp11-Lfunc_begin0
+	.byte	80                      ## DW_OP_reg0
+	.quad	0
+	.quad	0
+Ldebug_loc4:
+.set Lset16, Ltmp6-Lfunc_begin0
 	.quad	Lset16
-.set Lset17, Ltmp13-Lfunc_begin0
+.set Lset17, Ltmp9-Lfunc_begin0
 	.quad	Lset17
-	.short	1                       ## Loc expr size
-	.byte	83                      ## super-register DW_OP_reg3
-.set Lset18, Ltmp13-Lfunc_begin0
+	.short	2                       ## Loc expr size
+	.byte	48                      ## DW_OP_lit0
+	.byte	159                     ## DW_OP_stack_value
+.set Lset18, Ltmp9-Lfunc_begin0
 	.quad	Lset18
-.set Lset19, Ltmp15-Lfunc_begin0
+.set Lset19, Ltmp12-Lfunc_begin0
 	.quad	Lset19
 	.short	1                       ## Loc expr size
-	.byte	81                      ## super-register DW_OP_reg1
-.set Lset20, Ltmp15-Lfunc_begin0
+	.byte	84                      ## super-register DW_OP_reg4
+.set Lset20, Ltmp12-Lfunc_begin0
 	.quad	Lset20
-.set Lset21, Ltmp19-Lfunc_begin0
+.set Lset21, Ltmp14-Lfunc_begin0
 	.quad	Lset21
 	.short	1                       ## Loc expr size
-	.byte	85                      ## super-register DW_OP_reg5
-.set Lset22, Ltmp19-Lfunc_begin0
+	.byte	83                      ## super-register DW_OP_reg3
+.set Lset22, Ltmp14-Lfunc_begin0
 	.quad	Lset22
-.set Lset23, Ltmp21-Lfunc_begin0
+.set Lset23, Ltmp16-Lfunc_begin0
 	.quad	Lset23
 	.short	1                       ## Loc expr size
-	.byte	84                      ## super-register DW_OP_reg4
-.set Lset24, Ltmp24-Lfunc_begin0
+	.byte	82                      ## super-register DW_OP_reg2
+.set Lset24, Ltmp16-Lfunc_begin0
 	.quad	Lset24
-.set Lset25, Ltmp25-Lfunc_begin0
+.set Lset25, Ltmp19-Lfunc_begin0
 	.quad	Lset25
 	.short	1                       ## Loc expr size
-	.byte	84                      ## super-register DW_OP_reg4
-.set Lset26, Ltmp25-Lfunc_begin0
+	.byte	81                      ## super-register DW_OP_reg1
+.set Lset26, Ltmp19-Lfunc_begin0
 	.quad	Lset26
-.set Lset27, Ltmp27-Lfunc_begin0
+.set Lset27, Ltmp20-Lfunc_begin0
 	.quad	Lset27
 	.short	1                       ## Loc expr size
-	.byte	85                      ## super-register DW_OP_reg5
-	.quad	0
-	.quad	0
-Ldebug_loc5:
-.set Lset28, Ltmp5-Lfunc_begin0
+	.byte	84                      ## super-register DW_OP_reg4
+.set Lset28, Ltmp23-Lfunc_begin0
 	.quad	Lset28
-.set Lset29, Ltmp10-Lfunc_begin0
+.set Lset29, Ltmp25-Lfunc_begin0
 	.quad	Lset29
-	.short	2                       ## Loc expr size
-	.byte	50                      ## DW_OP_lit2
-	.byte	159                     ## DW_OP_stack_value
-.set Lset30, Ltmp10-Lfunc_begin0
+	.short	1                       ## Loc expr size
+	.byte	84                      ## super-register DW_OP_reg4
+.set Lset30, Ltmp25-Lfunc_begin0
 	.quad	Lset30
-.set Lset31, Ltmp12-Lfunc_begin0
+.set Lset31, Ltmp26-Lfunc_begin0
 	.quad	Lset31
 	.short	1                       ## Loc expr size
-	.byte	81                      ## super-register DW_OP_reg1
-.set Lset32, Ltmp12-Lfunc_begin0
+	.byte	85                      ## super-register DW_OP_reg5
+	.quad	0
+	.quad	0
+Ldebug_loc5:
+.set Lset32, Ltmp6-Lfunc_begin0
 	.quad	Lset32
-.set Lset33, Ltmp14-Lfunc_begin0
+.set Lset33, Ltmp9-Lfunc_begin0
 	.quad	Lset33
-	.short	1                       ## Loc expr size
-	.byte	84                      ## super-register DW_OP_reg4
-.set Lset34, Ltmp14-Lfunc_begin0
+	.short	2                       ## Loc expr size
+	.byte	48                      ## DW_OP_lit0
+	.byte	159                     ## DW_OP_stack_value
+.set Lset34, Ltmp9-Lfunc_begin0
 	.quad	Lset34
-.set Lset35, Ltmp17-Lfunc_begin0
+.set Lset35, Ltmp11-Lfunc_begin0
 	.quad	Lset35
 	.short	1                       ## Loc expr size
 	.byte	83                      ## super-register DW_OP_reg3
-.set Lset36, Ltmp17-Lfunc_begin0
+.set Lset36, Ltmp11-Lfunc_begin0
 	.quad	Lset36
-.set Lset37, Ltmp20-Lfunc_begin0
+.set Lset37, Ltmp13-Lfunc_begin0
 	.quad	Lset37
 	.short	1                       ## Loc expr size
-	.byte	80                      ## super-register DW_OP_reg0
-.set Lset38, Ltmp20-Lfunc_begin0
+	.byte	82                      ## super-register DW_OP_reg2
+.set Lset38, Ltmp13-Lfunc_begin0
 	.quad	Lset38
-.set Lset39, Ltmp21-Lfunc_begin0
+.set Lset39, Ltmp15-Lfunc_begin0
 	.quad	Lset39
 	.short	1                       ## Loc expr size
-	.byte	81                      ## super-register DW_OP_reg1
-.set Lset40, Ltmp24-Lfunc_begin0
+	.byte	84                      ## super-register DW_OP_reg4
+.set Lset40, Ltmp15-Lfunc_begin0
 	.quad	Lset40
-.set Lset41, Ltmp26-Lfunc_begin0
+.set Lset41, Ltmp18-Lfunc_begin0
 	.quad	Lset41
 	.short	1                       ## Loc expr size
-	.byte	81                      ## super-register DW_OP_reg1
-.set Lset42, Ltmp26-Lfunc_begin0
+	.byte	85                      ## super-register DW_OP_reg5
+.set Lset42, Ltmp18-Lfunc_begin0
 	.quad	Lset42
-.set Lset43, Ltmp27-Lfunc_begin0
+.set Lset43, Ltmp20-Lfunc_begin0
 	.quad	Lset43
 	.short	1                       ## Loc expr size
 	.byte	83                      ## super-register DW_OP_reg3
+.set Lset44, Ltmp23-Lfunc_begin0
+	.quad	Lset44
+.set Lset45, Ltmp24-Lfunc_begin0
+	.quad	Lset45
+	.short	1                       ## Loc expr size
+	.byte	83                      ## super-register DW_OP_reg3
+.set Lset46, Ltmp24-Lfunc_begin0
+	.quad	Lset46
+.set Lset47, Ltmp26-Lfunc_begin0
+	.quad	Lset47
+	.short	1                       ## Loc expr size
+	.byte	80                      ## super-register DW_OP_reg0
 	.quad	0
 	.quad	0
 Ldebug_loc6:
-.set Lset44, Ltmp10-Lfunc_begin0
-	.quad	Lset44
-.set Lset45, Ltmp21-Lfunc_begin0
-	.quad	Lset45
+.set Lset48, Ltmp9-Lfunc_begin0
+	.quad	Lset48
+.set Lset49, Ltmp20-Lfunc_begin0
+	.quad	Lset49
 	.short	1                       ## Loc expr size
 	.byte	90                      ## DW_OP_reg10
 	.quad	0
 	.quad	0
 Ldebug_loc7:
-.set Lset46, Ltmp29-Lfunc_begin0
-	.quad	Lset46
-.set Lset47, Ltmp35-Lfunc_begin0
-	.quad	Lset47
+.set Lset50, Ltmp30-Lfunc_begin0
+	.quad	Lset50
+.set Lset51, Ltmp36-Lfunc_begin0
+	.quad	Lset51
 	.short	1                       ## Loc expr size
 	.byte	83                      ## super-register DW_OP_reg3
 	.quad	0
 	.quad	0
 Ldebug_loc8:
-.set Lset48, Ltmp29-Lfunc_begin0
-	.quad	Lset48
-.set Lset49, Ltmp34-Lfunc_begin0
-	.quad	Lset49
+.set Lset52, Ltmp30-Lfunc_begin0
+	.quad	Lset52
+.set Lset53, Ltmp35-Lfunc_begin0
+	.quad	Lset53
 	.short	1                       ## Loc expr size
 	.byte	83                      ## super-register DW_OP_reg3
 	.quad	0
 	.quad	0
 Ldebug_loc9:
-.set Lset50, Ltmp31-Lfunc_begin0
-	.quad	Lset50
-.set Lset51, Ltmp32-Lfunc_begin0
-	.quad	Lset51
+.set Lset54, Ltmp32-Lfunc_begin0
+	.quad	Lset54
+.set Lset55, Ltmp33-Lfunc_begin0
+	.quad	Lset55
 	.short	1                       ## Loc expr size
 	.byte	85                      ## DW_OP_reg5
 	.quad	0
@@ -984,25 +991,25 @@ Lsection_abbrev:
 	.section	__DWARF,__debug_info,regular,debug
 Lsection_info:
 Lcu_begin0:
-.set Lset52, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit
-	.long	Lset52
+.set Lset56, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit
+	.long	Lset56
 Ldebug_info_start0:
 	.short	4                       ## DWARF version number
-.set Lset53, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section
-	.long	Lset53
+.set Lset57, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section
+	.long	Lset57
 	.byte	8                       ## Address Size (in bytes)
 	.byte	1                       ## Abbrev [1] 0xb:0x2ed DW_TAG_compile_unit
 	.long	0                       ## DW_AT_producer
 	.short	12                      ## DW_AT_language
 	.long	48                      ## DW_AT_name
-.set Lset54, Lline_table_start0-Lsection_line ## DW_AT_stmt_list
-	.long	Lset54
+.set Lset58, Lline_table_start0-Lsection_line ## DW_AT_stmt_list
+	.long	Lset58
 	.long	61                      ## DW_AT_comp_dir
                                         ## DW_AT_GNU_pubnames
                                         ## DW_AT_APPLE_optimized
 	.quad	Lfunc_begin0            ## DW_AT_low_pc
-.set Lset55, Lfunc_end0-Lfunc_begin0    ## DW_AT_high_pc
-	.long	Lset55
+.set Lset59, Lfunc_end0-Lfunc_begin0    ## DW_AT_high_pc
+	.long	Lset59
 	.byte	2                       ## Abbrev [2] 0x2a:0xb DW_TAG_variable
 	.long	125                     ## DW_AT_name
 	.long	53                      ## DW_AT_type
@@ -1204,12 +1211,12 @@ Ldebug_info_start0:
 	.byte	20                      ## Abbrev [20] 0x1ce:0xb DW_TAG_variable
 	.long	453                     ## DW_AT_name
 	.byte	5                       ## DW_AT_decl_file
-	.byte	97                      ## DW_AT_decl_line
+	.byte	98                      ## DW_AT_decl_line
 	.long	509                     ## DW_AT_type
 	.byte	20                      ## Abbrev [20] 0x1d9:0xb DW_TAG_variable
 	.long	475                     ## DW_AT_name
 	.byte	5                       ## DW_AT_decl_file
-	.byte	98                      ## DW_AT_decl_line
+	.byte	97                      ## DW_AT_decl_line
 	.long	509                     ## DW_AT_type
 	.byte	20                      ## Abbrev [20] 0x1e4:0xb DW_TAG_variable
 	.long	477                     ## DW_AT_name
@@ -1256,8 +1263,8 @@ Ldebug_info_start0:
 	.long	53                      ## DW_AT_type
 	.byte	22                      ## Abbrev [22] 0x238:0xbf DW_TAG_subprogram
 	.quad	Lfunc_begin0            ## DW_AT_low_pc
-.set Lset56, Lfunc_end0-Lfunc_begin0    ## DW_AT_high_pc
-	.long	Lset56
+.set Lset60, Lfunc_end0-Lfunc_begin0    ## DW_AT_high_pc
+	.long	Lset60
 	.byte	1                       ## DW_AT_frame_base
 	.byte	86
                                         ## DW_AT_call_all_calls
@@ -1269,77 +1276,77 @@ Ldebug_info_start0:
                                         ## DW_AT_external
                                         ## DW_AT_APPLE_optimized
 	.byte	23                      ## Abbrev [23] 0x251:0xf DW_TAG_formal_parameter
-.set Lset57, Ldebug_loc0-Lsection_debug_loc ## DW_AT_location
-	.long	Lset57
+.set Lset61, Ldebug_loc0-Lsection_debug_loc ## DW_AT_location
+	.long	Lset61
 	.long	526                     ## DW_AT_name
 	.byte	6                       ## DW_AT_decl_file
 	.byte	36                      ## DW_AT_decl_line
 	.long	138                     ## DW_AT_type
 	.byte	24                      ## Abbrev [24] 0x260:0xf DW_TAG_variable
-.set Lset58, Ldebug_loc2-Lsection_debug_loc ## DW_AT_location
-	.long	Lset58
+.set Lset62, Ldebug_loc2-Lsection_debug_loc ## DW_AT_location
+	.long	Lset62
 	.long	530                     ## DW_AT_name
 	.byte	6                       ## DW_AT_decl_file
 	.byte	38                      ## DW_AT_decl_line
 	.long	229                     ## DW_AT_type
 	.byte	24                      ## Abbrev [24] 0x26f:0xf DW_TAG_variable
-.set Lset59, Ldebug_loc7-Lsection_debug_loc ## DW_AT_location
-	.long	Lset59
+.set Lset63, Ldebug_loc7-Lsection_debug_loc ## DW_AT_location
+	.long	Lset63
 	.long	366                     ## DW_AT_name
 	.byte	6                       ## DW_AT_decl_file
 	.byte	39                      ## DW_AT_decl_line
 	.long	216                     ## DW_AT_type
 	.byte	24                      ## Abbrev [24] 0x27e:0xf DW_TAG_variable
-.set Lset60, Ldebug_loc9-Lsection_debug_loc ## DW_AT_location
-	.long	Lset60
+.set Lset64, Ldebug_loc9-Lsection_debug_loc ## DW_AT_location
+	.long	Lset64
 	.long	534                     ## DW_AT_name
 	.byte	6                       ## DW_AT_decl_file
 	.byte	40                      ## DW_AT_decl_line
 	.long	138                     ## DW_AT_type
 	.byte	25                      ## Abbrev [25] 0x28d:0x4c DW_TAG_inlined_subroutine
 	.long	428                     ## DW_AT_abstract_origin
-	.quad	Ltmp5                   ## DW_AT_low_pc
-.set Lset61, Ltmp29-Ltmp5               ## DW_AT_high_pc
-	.long	Lset61
+	.quad	Ltmp6                   ## DW_AT_low_pc
+.set Lset65, Ltmp30-Ltmp6               ## DW_AT_high_pc
+	.long	Lset65
 	.byte	6                       ## DW_AT_call_file
 	.byte	54                      ## DW_AT_call_line
 	.byte	26                      ## Abbrev [26] 0x2a0:0x9 DW_TAG_formal_parameter
-.set Lset62, Ldebug_loc1-Lsection_debug_loc ## DW_AT_location
-	.long	Lset62
+.set Lset66, Ldebug_loc1-Lsection_debug_loc ## DW_AT_location
+	.long	Lset66
 	.long	440                     ## DW_AT_abstract_origin
 	.byte	26                      ## Abbrev [26] 0x2a9:0x9 DW_TAG_formal_parameter
-.set Lset63, Ldebug_loc3-Lsection_debug_loc ## DW_AT_location
-	.long	Lset63
+.set Lset67, Ldebug_loc3-Lsection_debug_loc ## DW_AT_location
+	.long	Lset67
 	.long	451                     ## DW_AT_abstract_origin
 	.byte	27                      ## Abbrev [27] 0x2b2:0x9 DW_TAG_variable
-.set Lset64, Ldebug_loc4-Lsection_debug_loc ## DW_AT_location
-	.long	Lset64
+.set Lset68, Ldebug_loc4-Lsection_debug_loc ## DW_AT_location
+	.long	Lset68
 	.long	462                     ## DW_AT_abstract_origin
 	.byte	27                      ## Abbrev [27] 0x2bb:0x9 DW_TAG_variable
-.set Lset65, Ldebug_loc5-Lsection_debug_loc ## DW_AT_location
-	.long	Lset65
+.set Lset69, Ldebug_loc5-Lsection_debug_loc ## DW_AT_location
+	.long	Lset69
 	.long	473                     ## DW_AT_abstract_origin
 	.byte	27                      ## Abbrev [27] 0x2c4:0x9 DW_TAG_variable
-.set Lset66, Ldebug_loc6-Lsection_debug_loc ## DW_AT_location
-	.long	Lset66
+.set Lset70, Ldebug_loc6-Lsection_debug_loc ## DW_AT_location
+	.long	Lset70
 	.long	484                     ## DW_AT_abstract_origin
 	.byte	28                      ## Abbrev [28] 0x2cd:0xb DW_TAG_lexical_block
-.set Lset67, Ldebug_ranges0-Ldebug_range ## DW_AT_ranges
-	.long	Lset67
+.set Lset71, Ldebug_ranges0-Ldebug_range ## DW_AT_ranges
+	.long	Lset71
 	.byte	29                      ## Abbrev [29] 0x2d2:0x5 DW_TAG_variable
 	.long	496                     ## DW_AT_abstract_origin
 	.byte	0                       ## End Of Children Mark
 	.byte	0                       ## End Of Children Mark
 	.byte	25                      ## Abbrev [25] 0x2d9:0x1d DW_TAG_inlined_subroutine
 	.long	528                     ## DW_AT_abstract_origin
-	.quad	Ltmp30                  ## DW_AT_low_pc
-.set Lset68, Ltmp31-Ltmp30              ## DW_AT_high_pc
-	.long	Lset68
+	.quad	Ltmp31                  ## DW_AT_low_pc
+.set Lset72, Ltmp32-Ltmp31              ## DW_AT_high_pc
+	.long	Lset72
 	.byte	6                       ## DW_AT_call_file
 	.byte	60                      ## DW_AT_call_line
 	.byte	26                      ## Abbrev [26] 0x2ec:0x9 DW_TAG_formal_parameter
-.set Lset69, Ldebug_loc8-Lsection_debug_loc ## DW_AT_location
-	.long	Lset69
+.set Lset73, Ldebug_loc8-Lsection_debug_loc ## DW_AT_location
+	.long	Lset73
 	.long	540                     ## DW_AT_abstract_origin
 	.byte	0                       ## End Of Children Mark
 	.byte	0                       ## End Of Children Mark
@@ -1348,18 +1355,18 @@ Ldebug_info_end0:
 	.section	__DWARF,__debug_ranges,regular,debug
 Ldebug_range:
 Ldebug_ranges0:
-.set Lset70, Ltmp10-Lfunc_begin0
-	.quad	Lset70
-.set Lset71, Ltmp20-Lfunc_begin0
-	.quad	Lset71
-.set Lset72, Ltmp21-Lfunc_begin0
-	.quad	Lset72
-.set Lset73, Ltmp22-Lfunc_begin0
-	.quad	Lset73
-.set Lset74, Ltmp24-Lfunc_begin0
+.set Lset74, Ltmp9-Lfunc_begin0
 	.quad	Lset74
-.set Lset75, Ltmp26-Lfunc_begin0
+.set Lset75, Ltmp19-Lfunc_begin0
 	.quad	Lset75
+.set Lset76, Ltmp20-Lfunc_begin0
+	.quad	Lset76
+.set Lset77, Ltmp21-Lfunc_begin0
+	.quad	Lset77
+.set Lset78, Ltmp23-Lfunc_begin0
+	.quad	Lset78
+.set Lset79, Ltmp25-Lfunc_begin0
+	.quad	Lset79
 	.quad	0
 	.quad	0
 	.section	__DWARF,__debug_macinfo,regular,debug
@@ -1391,20 +1398,20 @@ Lnames_begin:
 	.long	-1268970906             ## Hash in Bucket 4
 	.long	-263601009              ## Hash in Bucket 4
 	.long	1073557084              ## Hash in Bucket 5
-.set Lset76, LNames6-Lnames_begin       ## Offset in Bucket 2
-	.long	Lset76
-.set Lset77, LNames3-Lnames_begin       ## Offset in Bucket 2
-	.long	Lset77
-.set Lset78, LNames2-Lnames_begin       ## Offset in Bucket 3
-	.long	Lset78
-.set Lset79, LNames5-Lnames_begin       ## Offset in Bucket 4
-	.long	Lset79
-.set Lset80, LNames0-Lnames_begin       ## Offset in Bucket 4
+.set Lset80, LNames6-Lnames_begin       ## Offset in Bucket 2
 	.long	Lset80
-.set Lset81, LNames4-Lnames_begin       ## Offset in Bucket 4
+.set Lset81, LNames3-Lnames_begin       ## Offset in Bucket 2
 	.long	Lset81
-.set Lset82, LNames1-Lnames_begin       ## Offset in Bucket 5
+.set Lset82, LNames2-Lnames_begin       ## Offset in Bucket 3
 	.long	Lset82
+.set Lset83, LNames5-Lnames_begin       ## Offset in Bucket 4
+	.long	Lset83
+.set Lset84, LNames0-Lnames_begin       ## Offset in Bucket 4
+	.long	Lset84
+.set Lset85, LNames4-Lnames_begin       ## Offset in Bucket 4
+	.long	Lset85
+.set Lset86, LNames1-Lnames_begin       ## Offset in Bucket 5
+	.long	Lset86
 LNames6:
 	.long	418                     ## ScanCKeywords_hash_func
 	.long	1                       ## Num DIEs
@@ -1512,36 +1519,36 @@ Ltypes_begin:
 	.long	2090147939              ## Hash in Bucket 14
 	.long	-851394017              ## Hash in Bucket 14
 	.long	-104093792              ## Hash in Bucket 14
-.set Lset83, Ltypes3-Ltypes_begin       ## Offset in Bucket 1
-	.long	Lset83
-.set Lset84, Ltypes11-Ltypes_begin      ## Offset in Bucket 2
-	.long	Lset84
-.set Lset85, Ltypes1-Ltypes_begin       ## Offset in Bucket 3
-	.long	Lset85
-.set Lset86, Ltypes6-Ltypes_begin       ## Offset in Bucket 3
-	.long	Lset86
-.set Lset87, Ltypes0-Ltypes_begin       ## Offset in Bucket 4
+.set Lset87, Ltypes3-Ltypes_begin       ## Offset in Bucket 1
 	.long	Lset87
-.set Lset88, Ltypes4-Ltypes_begin       ## Offset in Bucket 5
+.set Lset88, Ltypes11-Ltypes_begin      ## Offset in Bucket 2
 	.long	Lset88
-.set Lset89, Ltypes8-Ltypes_begin       ## Offset in Bucket 7
+.set Lset89, Ltypes1-Ltypes_begin       ## Offset in Bucket 3
 	.long	Lset89
-.set Lset90, Ltypes5-Ltypes_begin       ## Offset in Bucket 8
+.set Lset90, Ltypes6-Ltypes_begin       ## Offset in Bucket 3
 	.long	Lset90
-.set Lset91, Ltypes7-Ltypes_begin       ## Offset in Bucket 9
+.set Lset91, Ltypes0-Ltypes_begin       ## Offset in Bucket 4
 	.long	Lset91
-.set Lset92, Ltypes9-Ltypes_begin       ## Offset in Bucket 11
+.set Lset92, Ltypes4-Ltypes_begin       ## Offset in Bucket 5
 	.long	Lset92
-.set Lset93, Ltypes2-Ltypes_begin       ## Offset in Bucket 12
+.set Lset93, Ltypes8-Ltypes_begin       ## Offset in Bucket 7
 	.long	Lset93
-.set Lset94, Ltypes10-Ltypes_begin      ## Offset in Bucket 13
+.set Lset94, Ltypes5-Ltypes_begin       ## Offset in Bucket 8
 	.long	Lset94
-.set Lset95, Ltypes14-Ltypes_begin      ## Offset in Bucket 14
+.set Lset95, Ltypes7-Ltypes_begin       ## Offset in Bucket 9
 	.long	Lset95
-.set Lset96, Ltypes12-Ltypes_begin      ## Offset in Bucket 14
+.set Lset96, Ltypes9-Ltypes_begin       ## Offset in Bucket 11
 	.long	Lset96
-.set Lset97, Ltypes13-Ltypes_begin      ## Offset in Bucket 14
+.set Lset97, Ltypes2-Ltypes_begin       ## Offset in Bucket 12
 	.long	Lset97
+.set Lset98, Ltypes10-Ltypes_begin      ## Offset in Bucket 13
+	.long	Lset98
+.set Lset99, Ltypes14-Ltypes_begin      ## Offset in Bucket 14
+	.long	Lset99
+.set Lset100, Ltypes12-Ltypes_begin     ## Offset in Bucket 14
+	.long	Lset100
+.set Lset101, Ltypes13-Ltypes_begin     ## Offset in Bucket 14
+	.long	Lset101
 Ltypes3:
 	.long	181                     ## uint16
 	.long	1                       ## Num DIEs
@@ -1651,12 +1658,12 @@ Ltypes13:
 	.byte	0
 	.long	0
 	.section	__DWARF,__debug_gnu_pubn,regular,debug
-.set Lset98, LpubNames_end0-LpubNames_begin0 ## Length of Public Names Info
-	.long	Lset98
+.set Lset102, LpubNames_end0-LpubNames_begin0 ## Length of Public Names Info
+	.long	Lset102
 LpubNames_begin0:
 	.short	2                       ## DWARF Version
-.set Lset99, Lcu_begin0-Lsection_info   ## Offset of Compilation Unit Info
-	.long	Lset99
+.set Lset103, Lcu_begin0-Lsection_info  ## Offset of Compilation Unit Info
+	.long	Lset103
 	.long	760                     ## Compilation Unit Length
 	.long	42                      ## DIE offset
 	.byte	160                     ## Attributes: VARIABLE, STATIC
@@ -1685,12 +1692,12 @@ LpubNames_begin0:
 	.long	0                       ## End Mark
 LpubNames_end0:
 	.section	__DWARF,__debug_gnu_pubt,regular,debug
-.set Lset100, LpubTypes_end0-LpubTypes_begin0 ## Length of Public Types Info
-	.long	Lset100
+.set Lset104, LpubTypes_end0-LpubTypes_begin0 ## Length of Public Types Info
+	.long	Lset104
 LpubTypes_begin0:
 	.short	2                       ## DWARF Version
-.set Lset101, Lcu_begin0-Lsection_info  ## Offset of Compilation Unit Info
-	.long	Lset101
+.set Lset105, Lcu_begin0-Lsection_info  ## Offset of Compilation Unit Info
+	.long	Lset105
 	.long	760                     ## Compilation Unit Length
 	.long	371                     ## DIE offset
 	.byte	144                     ## Attributes: TYPE, STATIC
diff --git a/src/interfaces/ecpg/preproc/ecpg_keywords.s b/src/interfaces/ecpg/preproc/ecpg_keywords.s
index e99fd57052..94c098d190 100644
--- a/src/interfaces/ecpg/preproc/ecpg_keywords.s
+++ b/src/interfaces/ecpg/preproc/ecpg_keywords.s
@@ -111,7 +111,7 @@ Ltmp15:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
 	xorl	%edx, %edx
 Ltmp16:
-	##DEBUG_VALUE: ScanECPGKeywords_hash_func:b <- 3
+	##DEBUG_VALUE: ScanECPGKeywords_hash_func:b <- 1
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- 0
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:keylen <- $rsi
@@ -135,7 +135,7 @@ Ltmp18:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:keylen <- $rsi
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:key <- $rdi
 	.loc	5 0 15                  ## ./ecpg_kwlist_d.h:0:15
-	movl	$381, %esi              ## imm = 0x17D
+	movl	$17, %esi
 Ltmp19:
                                         ## implicit-def: $eax
                                         ## implicit-def: $ecx
@@ -151,7 +151,7 @@ LBB1_1:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:keylen <- $rsi
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:key <- $rdi
 	.loc	5 0 2                   ## ./ecpg_kwlist_d.h:0:2
-	movl	$3, %ecx
+	movl	$1, %ecx
 	xorl	%eax, %eax
 	jmp	LBB1_10
 Ltmp21:
@@ -163,7 +163,7 @@ LBB1_4:
 	movq	%r8, %r9
 	subq	%rsi, %r9
 	xorl	%eax, %eax
-	movl	$3, %ecx
+	movl	$1, %ecx
 Ltmp22:
 	.p2align	4, 0x90
 LBB1_5:                                 ## =>This Inner Loop Header: Depth=1
@@ -182,17 +182,17 @@ Ltmp23:
 	##DEBUG_VALUE: c <- $r10d
 	.loc	5 138 9 is_stmt 1       ## ./ecpg_kwlist_d.h:138:9
 	movl	%eax, %edx
-	shll	$5, %edx
-	subl	%eax, %edx
-	.loc	5 138 14 is_stmt 0      ## ./ecpg_kwlist_d.h:138:14
+	shll	$8, %edx
+	addl	%eax, %edx
+	.loc	5 138 15 is_stmt 0      ## ./ecpg_kwlist_d.h:138:15
 	addl	%r10d, %edx
 Ltmp24:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- $edx
 	.loc	5 139 9 is_stmt 1       ## ./ecpg_kwlist_d.h:139:9
 	movl	%ecx, %esi
-	shll	$7, %esi
-	subl	%ecx, %esi
-	.loc	5 139 15 is_stmt 0      ## ./ecpg_kwlist_d.h:139:15
+	shll	$4, %esi
+	addl	%ecx, %esi
+	.loc	5 139 14 is_stmt 0      ## ./ecpg_kwlist_d.h:139:14
 	addl	%r10d, %esi
 	.loc	5 136 21 is_stmt 1      ## ./ecpg_kwlist_d.h:136:21
 	movzbl	1(%rdi), %r10d
@@ -209,17 +209,17 @@ Ltmp27:
 	##DEBUG_VALUE: c <- $r10d
 	.loc	5 138 9 is_stmt 1       ## ./ecpg_kwlist_d.h:138:9
 	movl	%edx, %eax
-	shll	$5, %eax
-	subl	%edx, %eax
-	.loc	5 138 14 is_stmt 0      ## ./ecpg_kwlist_d.h:138:14
+	shll	$8, %eax
+	addl	%edx, %eax
+	.loc	5 138 15 is_stmt 0      ## ./ecpg_kwlist_d.h:138:15
 	addl	%r10d, %eax
 Ltmp28:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- $eax
 	.loc	5 139 9 is_stmt 1       ## ./ecpg_kwlist_d.h:139:9
 	movl	%esi, %ecx
-	shll	$7, %ecx
-	subl	%esi, %ecx
-	.loc	5 139 15 is_stmt 0      ## ./ecpg_kwlist_d.h:139:15
+	shll	$4, %ecx
+	addl	%esi, %ecx
+	.loc	5 139 14 is_stmt 0      ## ./ecpg_kwlist_d.h:139:14
 	addl	%r10d, %ecx
 Ltmp29:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
@@ -233,11 +233,11 @@ Ltmp30:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- $eax
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
 	movl	%eax, %edx
-	shll	$5, %edx
-	subl	%eax, %edx
+	shll	$8, %edx
+	addl	%eax, %edx
 	movl	%ecx, %esi
-	shll	$7, %esi
-	subl	%ecx, %esi
+	shll	$4, %esi
+	addl	%ecx, %esi
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
 Ltmp31:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] $rdi
@@ -252,17 +252,17 @@ LBB1_8:
 	orl	$32, %eax
 Ltmp33:
 	##DEBUG_VALUE: c <- $eax
-	.loc	5 139 15 is_stmt 1      ## ./ecpg_kwlist_d.h:139:15
+	.loc	5 139 14 is_stmt 1      ## ./ecpg_kwlist_d.h:139:14
 	addl	%eax, %esi
 Ltmp34:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:b <- $esi
-	.loc	5 138 14                ## ./ecpg_kwlist_d.h:138:14
+	.loc	5 138 15                ## ./ecpg_kwlist_d.h:138:15
 	addl	%eax, %edx
 Ltmp35:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- $edx
 	movl	%edx, %eax
 Ltmp36:
-	.loc	5 139 15                ## ./ecpg_kwlist_d.h:139:15
+	.loc	5 139 14                ## ./ecpg_kwlist_d.h:139:14
 	movl	%esi, %ecx
 Ltmp37:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:b <- $ecx
@@ -284,9 +284,9 @@ LBB1_10:
 	##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
 	.loc	5 141 9 is_stmt 0       ## ./ecpg_kwlist_d.h:141:9
 	leaq	_ScanECPGKeywords_hash_func.h(%rip), %rdx
-	movswl	(%rdx,%rax,2), %esi
+	movsbl	(%rax,%rdx), %esi
 	.loc	5 141 21                ## ./ecpg_kwlist_d.h:141:21
-	movswl	(%rdx,%rcx,2), %eax
+	movsbl	(%rcx,%rdx), %eax
 	.loc	5 141 19                ## ./ecpg_kwlist_d.h:141:19
 	addl	%esi, %eax
 	.loc	5 141 2                 ## ./ecpg_kwlist_d.h:141:2
@@ -400,89 +400,7 @@ _ScanECPGKeywords_kw_offsets:
 
 	.p2align	4               ## @ScanECPGKeywords_hash_func.h
 _ScanECPGKeywords_hash_func.h:
-	.short	0                       ## 0x0
-	.short	26                      ## 0x1a
-	.short	65521                   ## 0xfff1
-	.short	29                      ## 0x1d
-	.short	8                       ## 0x8
-	.short	35                      ## 0x23
-	.short	65530                   ## 0xfffa
-	.short	32767                   ## 0x7fff
-	.short	11                      ## 0xb
-	.short	20                      ## 0x14
-	.short	0                       ## 0x0
-	.short	25                      ## 0x19
-	.short	4                       ## 0x4
-	.short	32767                   ## 0x7fff
-	.short	27                      ## 0x1b
-	.short	0                       ## 0x0
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	32767                   ## 0x7fff
-	.short	6                       ## 0x6
-	.short	32767                   ## 0x7fff
-	.short	65449                   ## 0xffa9
-	.short	43                      ## 0x2b
-	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	32767                   ## 0x7fff
-	.short	12                      ## 0xc
-	.short	32767                   ## 0x7fff
-	.short	7                       ## 0x7
-	.short	0                       ## 0x0
-	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	30                      ## 0x1e
-	.short	38                      ## 0x26
-	.short	23                      ## 0x17
-	.short	65468                   ## 0xffbc
-	.short	0                       ## 0x0
-	.short	32767                   ## 0x7fff
-	.short	9                       ## 0x9
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	16                      ## 0x10
-	.short	65518                   ## 0xffee
-	.short	65529                   ## 0xfff9
-	.short	32767                   ## 0x7fff
-	.short	19                      ## 0x13
-	.short	0                       ## 0x0
-	.short	68                      ## 0x44
-	.short	0                       ## 0x0
-	.short	96                      ## 0x60
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	14                      ## 0xe
-	.short	0                       ## 0x0
-	.short	65518                   ## 0xffee
-	.short	32767                   ## 0x7fff
-	.short	65523                   ## 0xfff3
-	.short	32767                   ## 0x7fff
-	.short	32                      ## 0x20
-	.short	0                       ## 0x0
-	.short	29                      ## 0x1d
-	.short	65530                   ## 0xfffa
-	.short	78                      ## 0x4e
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	39                      ## 0x27
-	.short	18                      ## 0x12
-	.short	65495                   ## 0xffd7
-	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	40                      ## 0x28
-	.short	65473                   ## 0xffc1
-	.short	22                      ## 0x16
-	.short	31                      ## 0x1f
-	.short	0                       ## 0x0
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
+	.ascii	"\366\374\177\000 \033\177\366\177%\344\177\003\037\177\357\177\177\375\177\177\000\017\177\177\"\177\177\177\030)\003\"\350\177\177\000\177\177\177\020\000!\177\177\177\016\177\177\022\000\177\177\374\354\025\000\000\036\005\000\177\027\006\177\362\177\1776\000\372\000\000\376$\f\000\364)\b\023\177\013"
 
 	.section	__DWARF,__debug_str,regular,debug
 Linfo_string:
@@ -508,22 +426,22 @@ Linfo_string:
 	.asciz	"__ARRAY_SIZE_TYPE__"   ## string offset=330
 	.asciz	"ScanECPGKeywords_kw_offsets" ## string offset=350
 	.asciz	"h"                     ## string offset=378
-	.asciz	"int16"                 ## string offset=380
-	.asciz	"short"                 ## string offset=386
-	.asciz	"ECPGScanKeywordTokens" ## string offset=392
-	.asciz	"unsigned char"         ## string offset=414
-	.asciz	"ScanECPGKeywordLookup" ## string offset=428
-	.asciz	"ScanECPGKeywords_hash_func" ## string offset=450
-	.asciz	"text"                  ## string offset=477
-	.asciz	"kwnum"                 ## string offset=482
-	.asciz	"key"                   ## string offset=488
-	.asciz	"keylen"                ## string offset=492
-	.asciz	"k"                     ## string offset=499
-	.asciz	"b"                     ## string offset=501
-	.asciz	"uint32"                ## string offset=503
-	.asciz	"unsigned int"          ## string offset=510
-	.asciz	"a"                     ## string offset=523
-	.asciz	"c"                     ## string offset=525
+	.asciz	"int8"                  ## string offset=380
+	.asciz	"signed char"           ## string offset=385
+	.asciz	"ECPGScanKeywordTokens" ## string offset=397
+	.asciz	"unsigned char"         ## string offset=419
+	.asciz	"ScanECPGKeywordLookup" ## string offset=433
+	.asciz	"ScanECPGKeywords_hash_func" ## string offset=455
+	.asciz	"text"                  ## string offset=482
+	.asciz	"kwnum"                 ## string offset=487
+	.asciz	"key"                   ## string offset=493
+	.asciz	"keylen"                ## string offset=497
+	.asciz	"k"                     ## string offset=504
+	.asciz	"b"                     ## string offset=506
+	.asciz	"uint32"                ## string offset=508
+	.asciz	"unsigned int"          ## string offset=515
+	.asciz	"a"                     ## string offset=528
+	.asciz	"c"                     ## string offset=530
 	.section	__DWARF,__debug_loc,regular,debug
 Lsection_debug_loc:
 Ldebug_loc0:
@@ -635,7 +553,7 @@ Ldebug_loc5:
 .set Lset29, Ltmp22-Lfunc_begin0
 	.quad	Lset29
 	.short	2                       ## Loc expr size
-	.byte	51                      ## DW_OP_lit3
+	.byte	49                      ## DW_OP_lit1
 	.byte	159                     ## DW_OP_stack_value
 .set Lset30, Ltmp22-Lfunc_begin0
 	.quad	Lset30
@@ -1153,7 +1071,7 @@ Ldebug_info_start0:
 	.byte	1                       ## DW_AT_frame_base
 	.byte	86
                                         ## DW_AT_call_all_calls
-	.long	450                     ## DW_AT_name
+	.long	455                     ## DW_AT_name
 	.byte	5                       ## DW_AT_decl_file
 	.byte	114                     ## DW_AT_decl_line
                                         ## DW_AT_prototyped
@@ -1170,35 +1088,35 @@ Ldebug_info_start0:
 	.byte	18                      ## Abbrev [18] 0x184:0xf DW_TAG_formal_parameter
 .set Lset59, Ldebug_loc2-Lsection_debug_loc ## DW_AT_location
 	.long	Lset59
-	.long	488                     ## DW_AT_name
+	.long	493                     ## DW_AT_name
 	.byte	5                       ## DW_AT_decl_file
 	.byte	114                     ## DW_AT_decl_line
 	.long	233                     ## DW_AT_type
 	.byte	18                      ## Abbrev [18] 0x193:0xf DW_TAG_formal_parameter
 .set Lset60, Ldebug_loc3-Lsection_debug_loc ## DW_AT_location
 	.long	Lset60
-	.long	492                     ## DW_AT_name
+	.long	497                     ## DW_AT_name
 	.byte	5                       ## DW_AT_decl_file
 	.byte	114                     ## DW_AT_decl_line
 	.long	239                     ## DW_AT_type
 	.byte	19                      ## Abbrev [19] 0x1a2:0xf DW_TAG_variable
 .set Lset61, Ldebug_loc4-Lsection_debug_loc ## DW_AT_location
 	.long	Lset61
-	.long	499                     ## DW_AT_name
+	.long	504                     ## DW_AT_name
 	.byte	5                       ## DW_AT_decl_file
 	.byte	130                     ## DW_AT_decl_line
 	.long	542                     ## DW_AT_type
 	.byte	19                      ## Abbrev [19] 0x1b1:0xf DW_TAG_variable
 .set Lset62, Ldebug_loc5-Lsection_debug_loc ## DW_AT_location
 	.long	Lset62
-	.long	501                     ## DW_AT_name
+	.long	506                     ## DW_AT_name
 	.byte	5                       ## DW_AT_decl_file
 	.byte	132                     ## DW_AT_decl_line
 	.long	615                     ## DW_AT_type
 	.byte	19                      ## Abbrev [19] 0x1c0:0xf DW_TAG_variable
 .set Lset63, Ldebug_loc6-Lsection_debug_loc ## DW_AT_location
 	.long	Lset63
-	.long	523                     ## DW_AT_name
+	.long	528                     ## DW_AT_name
 	.byte	5                       ## DW_AT_decl_file
 	.byte	131                     ## DW_AT_decl_line
 	.long	615                     ## DW_AT_type
@@ -1208,7 +1126,7 @@ Ldebug_info_start0:
 	.byte	19                      ## Abbrev [19] 0x1d4:0xf DW_TAG_variable
 .set Lset65, Ldebug_loc7-Lsection_debug_loc ## DW_AT_location
 	.long	Lset65
-	.long	525                     ## DW_AT_name
+	.long	530                     ## DW_AT_name
 	.byte	5                       ## DW_AT_decl_file
 	.byte	136                     ## DW_AT_decl_line
 	.long	552                     ## DW_AT_type
@@ -1226,13 +1144,13 @@ Ldebug_info_start0:
 	.long	514                     ## DW_AT_type
 	.long	380                     ## DW_AT_name
 	.byte	2                       ## DW_AT_decl_file
-	.short	361                     ## DW_AT_decl_line
+	.short	360                     ## DW_AT_decl_line
 	.byte	8                       ## Abbrev [8] 0x202:0x7 DW_TAG_base_type
-	.long	386                     ## DW_AT_name
-	.byte	5                       ## DW_AT_encoding
-	.byte	2                       ## DW_AT_byte_size
+	.long	385                     ## DW_AT_name
+	.byte	6                       ## DW_AT_encoding
+	.byte	1                       ## DW_AT_byte_size
 	.byte	2                       ## Abbrev [2] 0x209:0x15 DW_TAG_variable
-	.long	392                     ## DW_AT_name
+	.long	397                     ## DW_AT_name
 	.long	330                     ## DW_AT_type
 	.byte	6                       ## DW_AT_decl_file
 	.byte	24                      ## DW_AT_decl_line
@@ -1244,7 +1162,7 @@ Ldebug_info_start0:
 	.byte	3                       ## Abbrev [3] 0x223:0x5 DW_TAG_const_type
 	.long	552                     ## DW_AT_type
 	.byte	8                       ## Abbrev [8] 0x228:0x7 DW_TAG_base_type
-	.long	414                     ## DW_AT_name
+	.long	419                     ## DW_AT_name
 	.byte	8                       ## DW_AT_encoding
 	.byte	1                       ## DW_AT_byte_size
 	.byte	21                      ## Abbrev [21] 0x22f:0x38 DW_TAG_subprogram
@@ -1254,7 +1172,7 @@ Ldebug_info_start0:
 	.byte	1                       ## DW_AT_frame_base
 	.byte	86
                                         ## DW_AT_call_all_calls
-	.long	428                     ## DW_AT_name
+	.long	433                     ## DW_AT_name
 	.byte	6                       ## DW_AT_decl_file
 	.byte	39                      ## DW_AT_decl_line
                                         ## DW_AT_prototyped
@@ -1264,25 +1182,25 @@ Ldebug_info_start0:
 	.byte	18                      ## Abbrev [18] 0x248:0xf DW_TAG_formal_parameter
 .set Lset67, Ldebug_loc0-Lsection_debug_loc ## DW_AT_location
 	.long	Lset67
-	.long	477                     ## DW_AT_name
+	.long	482                     ## DW_AT_name
 	.byte	6                       ## DW_AT_decl_file
 	.byte	39                      ## DW_AT_decl_line
 	.long	148                     ## DW_AT_type
 	.byte	19                      ## Abbrev [19] 0x257:0xf DW_TAG_variable
 .set Lset68, Ldebug_loc1-Lsection_debug_loc ## DW_AT_location
 	.long	Lset68
-	.long	482                     ## DW_AT_name
+	.long	487                     ## DW_AT_name
 	.byte	6                       ## DW_AT_decl_file
 	.byte	41                      ## DW_AT_decl_line
 	.long	226                     ## DW_AT_type
 	.byte	0                       ## End Of Children Mark
 	.byte	9                       ## Abbrev [9] 0x267:0xc DW_TAG_typedef
 	.long	627                     ## DW_AT_type
-	.long	503                     ## DW_AT_name
+	.long	508                     ## DW_AT_name
 	.byte	2                       ## DW_AT_decl_file
 	.short	374                     ## DW_AT_decl_line
 	.byte	8                       ## Abbrev [8] 0x273:0x7 DW_TAG_base_type
-	.long	510                     ## DW_AT_name
+	.long	515                     ## DW_AT_name
 	.byte	7                       ## DW_AT_encoding
 	.byte	4                       ## DW_AT_byte_size
 	.byte	0                       ## End Of Children Mark
@@ -1349,7 +1267,7 @@ LNames2:
 	.long	309
 	.long	0
 LNames6:
-	.long	392                     ## ECPGScanKeywordTokens
+	.long	397                     ## ECPGScanKeywordTokens
 	.long	1                       ## Num DIEs
 	.long	521
 	.long	0
@@ -1369,12 +1287,12 @@ LNames3:
 	.long	367
 	.long	0
 LNames1:
-	.long	428                     ## ScanECPGKeywordLookup
+	.long	433                     ## ScanECPGKeywordLookup
 	.long	1                       ## Num DIEs
 	.long	559
 	.long	0
 LNames4:
-	.long	450                     ## ScanECPGKeywords_hash_func
+	.long	455                     ## ScanECPGKeywords_hash_func
 	.long	1                       ## Num DIEs
 	.long	342
 	.long	0
@@ -1433,46 +1351,46 @@ Ltypes_begin:
 	.long	-1                      ## Bucket 10
 	.long	9                       ## Bucket 11
 	.long	10                      ## Bucket 12
-	.long	-1                      ## Bucket 13
-	.long	11                      ## Bucket 14
+	.long	11                      ## Bucket 13
+	.long	12                      ## Bucket 14
 	.long	544532716               ## Hash in Bucket 1
 	.long	-80380739               ## Hash in Bucket 2
 	.long	544532778               ## Hash in Bucket 3
 	.long	878862258               ## Hash in Bucket 3
-	.long	274395349               ## Hash in Bucket 4
+	.long	2090370664              ## Hash in Bucket 4
 	.long	-1304652851             ## Hash in Bucket 5
 	.long	-282664779              ## Hash in Bucket 7
 	.long	193495088               ## Hash in Bucket 8
 	.long	466678419               ## Hash in Bucket 9
 	.long	-594775205              ## Hash in Bucket 11
 	.long	-1943928469             ## Hash in Bucket 12
-	.long	262754999               ## Hash in Bucket 14
+	.long	691577533               ## Hash in Bucket 13
 	.long	2090147939              ## Hash in Bucket 14
 	.long	-851394017              ## Hash in Bucket 14
 	.long	-104093792              ## Hash in Bucket 14
-.set Lset80, Ltypes2-Ltypes_begin       ## Offset in Bucket 1
+.set Lset80, Ltypes3-Ltypes_begin       ## Offset in Bucket 1
 	.long	Lset80
 .set Lset81, Ltypes11-Ltypes_begin      ## Offset in Bucket 2
 	.long	Lset81
-.set Lset82, Ltypes0-Ltypes_begin       ## Offset in Bucket 3
+.set Lset82, Ltypes1-Ltypes_begin       ## Offset in Bucket 3
 	.long	Lset82
-.set Lset83, Ltypes5-Ltypes_begin       ## Offset in Bucket 3
+.set Lset83, Ltypes6-Ltypes_begin       ## Offset in Bucket 3
 	.long	Lset83
-.set Lset84, Ltypes8-Ltypes_begin       ## Offset in Bucket 4
+.set Lset84, Ltypes0-Ltypes_begin       ## Offset in Bucket 4
 	.long	Lset84
-.set Lset85, Ltypes3-Ltypes_begin       ## Offset in Bucket 5
+.set Lset85, Ltypes4-Ltypes_begin       ## Offset in Bucket 5
 	.long	Lset85
-.set Lset86, Ltypes7-Ltypes_begin       ## Offset in Bucket 7
+.set Lset86, Ltypes8-Ltypes_begin       ## Offset in Bucket 7
 	.long	Lset86
-.set Lset87, Ltypes4-Ltypes_begin       ## Offset in Bucket 8
+.set Lset87, Ltypes5-Ltypes_begin       ## Offset in Bucket 8
 	.long	Lset87
-.set Lset88, Ltypes6-Ltypes_begin       ## Offset in Bucket 9
+.set Lset88, Ltypes7-Ltypes_begin       ## Offset in Bucket 9
 	.long	Lset88
-.set Lset89, Ltypes10-Ltypes_begin      ## Offset in Bucket 11
+.set Lset89, Ltypes9-Ltypes_begin       ## Offset in Bucket 11
 	.long	Lset89
-.set Lset90, Ltypes1-Ltypes_begin       ## Offset in Bucket 12
+.set Lset90, Ltypes2-Ltypes_begin       ## Offset in Bucket 12
 	.long	Lset90
-.set Lset91, Ltypes9-Ltypes_begin       ## Offset in Bucket 14
+.set Lset91, Ltypes10-Ltypes_begin      ## Offset in Bucket 13
 	.long	Lset91
 .set Lset92, Ltypes14-Ltypes_begin      ## Offset in Bucket 14
 	.long	Lset92
@@ -1480,7 +1398,7 @@ Ltypes_begin:
 	.long	Lset93
 .set Lset94, Ltypes13-Ltypes_begin      ## Offset in Bucket 14
 	.long	Lset94
-Ltypes2:
+Ltypes3:
 	.long	187                     ## uint16
 	.long	1                       ## Num DIEs
 	.long	175
@@ -1494,63 +1412,63 @@ Ltypes11:
 	.short	36
 	.byte	0
 	.long	0
-Ltypes0:
-	.long	503                     ## uint32
+Ltypes1:
+	.long	508                     ## uint32
 	.long	1                       ## Num DIEs
 	.long	615
 	.short	22
 	.byte	0
 	.long	0
-Ltypes5:
+Ltypes6:
 	.long	194                     ## unsigned short
 	.long	1                       ## Num DIEs
 	.long	187
 	.short	36
 	.byte	0
 	.long	0
-Ltypes8:
-	.long	386                     ## short
+Ltypes0:
+	.long	380                     ## int8
 	.long	1                       ## Num DIEs
-	.long	514
-	.short	36
+	.long	502
+	.short	22
 	.byte	0
 	.long	0
-Ltypes3:
-	.long	510                     ## unsigned int
+Ltypes4:
+	.long	515                     ## unsigned int
 	.long	1                       ## Num DIEs
 	.long	627
 	.short	36
 	.byte	0
 	.long	0
-Ltypes7:
+Ltypes8:
 	.long	245                     ## __darwin_size_t
 	.long	1                       ## Num DIEs
 	.long	250
 	.short	22
 	.byte	0
 	.long	0
-Ltypes4:
+Ltypes5:
 	.long	234                     ## int
 	.long	1                       ## Num DIEs
 	.long	226
 	.short	36
 	.byte	0
 	.long	0
-Ltypes6:
+Ltypes7:
 	.long	238                     ## size_t
 	.long	1                       ## Num DIEs
 	.long	239
 	.short	22
 	.byte	0
 	.long	0
-Ltypes10:
+Ltypes9:
 	.long	330                     ## __ARRAY_SIZE_TYPE__
 	.long	1                       ## Num DIEs
 	.long	302
 	.short	36
 	.byte	0
 	.long	0
-Ltypes1:
+Ltypes2:
 	.long	145                     ## ScanKeywordList
 	.long	2                       ## Num DIEs
 	.long	68
@@ -1560,11 +1478,11 @@ Ltypes1:
 	.short	19
 	.byte	0
 	.long	0
-Ltypes9:
-	.long	380                     ## int16
+Ltypes10:
+	.long	385                     ## signed char
 	.long	1                       ## Num DIEs
-	.long	502
-	.short	22
+	.long	514
+	.short	36
 	.byte	0
 	.long	0
 Ltypes14:
@@ -1582,7 +1500,7 @@ Ltypes12:
 	.byte	0
 	.long	0
 Ltypes13:
-	.long	414                     ## unsigned char
+	.long	419                     ## unsigned char
 	.long	1                       ## Num DIEs
 	.long	552
 	.short	36
@@ -1627,6 +1545,9 @@ LpubTypes_begin0:
 .set Lset98, Lcu_begin0-Lsection_info   ## Offset of Compilation Unit Info
 	.long	Lset98
 	.long	635                     ## Compilation Unit Length
+	.long	502                     ## DIE offset
+	.byte	144                     ## Attributes: TYPE, STATIC
+	.asciz	"int8"                  ## External Name
 	.long	615                     ## DIE offset
 	.byte	144                     ## Attributes: TYPE, STATIC
 	.asciz	"uint32"                ## External Name
@@ -1651,15 +1572,12 @@ LpubTypes_begin0:
 	.long	250                     ## DIE offset
 	.byte	144                     ## Attributes: TYPE, STATIC
 	.asciz	"__darwin_size_t"       ## External Name
-	.long	514                     ## DIE offset
-	.byte	144                     ## Attributes: TYPE, STATIC
-	.asciz	"short"                 ## External Name
-	.long	502                     ## DIE offset
-	.byte	144                     ## Attributes: TYPE, STATIC
-	.asciz	"int16"                 ## External Name
 	.long	261                     ## DIE offset
 	.byte	144                     ## Attributes: TYPE, STATIC
 	.asciz	"long unsigned int"     ## External Name
+	.long	514                     ## DIE offset
+	.byte	144                     ## Attributes: TYPE, STATIC
+	.asciz	"signed char"           ## External Name
 	.long	194                     ## DIE offset
 	.byte	144                     ## Attributes: TYPE, STATIC
 	.asciz	"ScanKeywordHashFunc"   ## External Name
diff --git a/src/pl/plpgsql/src/pl_scanner.s b/src/pl/plpgsql/src/pl_scanner.s
index 8095fd18ec..323d282743 100644
--- a/src/pl/plpgsql/src/pl_scanner.s
+++ b/src/pl/plpgsql/src/pl_scanner.s
@@ -1736,7 +1736,7 @@ Ltmp211:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- $rdi
 	xorl	%edx, %edx
 Ltmp212:
-	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:b <- 1
+	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:b <- 3
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- 0
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- $rdi
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:keylen <- $rsi
@@ -1760,7 +1760,7 @@ Ltmp214:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:keylen <- $rsi
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:key <- $rdi
 	.loc	8 0 15                  ## ./pl_unreserved_kwlist_d.h:0:15
-	movl	$127, %esi
+	movl	$51, %esi
 Ltmp215:
                                         ## implicit-def: $eax
                                         ## implicit-def: $ecx
@@ -1776,7 +1776,7 @@ LBB13_1:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:keylen <- $rsi
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:key <- $rdi
 	.loc	8 0 2                   ## ./pl_unreserved_kwlist_d.h:0:2
-	movl	$1, %ecx
+	movl	$3, %ecx
 	xorl	%eax, %eax
 	jmp	LBB13_10
 Ltmp217:
@@ -1788,7 +1788,7 @@ LBB13_4:
 	movq	%r8, %r9
 	subq	%rsi, %r9
 	xorl	%eax, %eax
-	movl	$1, %ecx
+	movl	$3, %ecx
 Ltmp218:
 	.p2align	4, 0x90
 LBB13_5:                                ## =>This Inner Loop Header: Depth=1
@@ -1807,17 +1807,17 @@ Ltmp219:
 	##DEBUG_VALUE: c <- $r10d
 	.loc	8 232 9 is_stmt 1       ## ./pl_unreserved_kwlist_d.h:232:9
 	movl	%eax, %edx
-	shll	$5, %edx
-	subl	%eax, %edx
-	.loc	8 232 14 is_stmt 0      ## ./pl_unreserved_kwlist_d.h:232:14
+	shll	$8, %edx
+	addl	%eax, %edx
+	.loc	8 232 15 is_stmt 0      ## ./pl_unreserved_kwlist_d.h:232:15
 	addl	%r10d, %edx
 Ltmp220:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- $edx
 	.loc	8 233 9 is_stmt 1       ## ./pl_unreserved_kwlist_d.h:233:9
 	movl	%ecx, %esi
-	shll	$7, %esi
-	subl	%ecx, %esi
-	.loc	8 233 15 is_stmt 0      ## ./pl_unreserved_kwlist_d.h:233:15
+	shll	$4, %esi
+	addl	%ecx, %esi
+	.loc	8 233 14 is_stmt 0      ## ./pl_unreserved_kwlist_d.h:233:14
 	addl	%r10d, %esi
 	.loc	8 230 21 is_stmt 1      ## ./pl_unreserved_kwlist_d.h:230:21
 	movzbl	1(%rdi), %r10d
@@ -1834,17 +1834,17 @@ Ltmp223:
 	##DEBUG_VALUE: c <- $r10d
 	.loc	8 232 9 is_stmt 1       ## ./pl_unreserved_kwlist_d.h:232:9
 	movl	%edx, %eax
-	shll	$5, %eax
-	subl	%edx, %eax
-	.loc	8 232 14 is_stmt 0      ## ./pl_unreserved_kwlist_d.h:232:14
+	shll	$8, %eax
+	addl	%edx, %eax
+	.loc	8 232 15 is_stmt 0      ## ./pl_unreserved_kwlist_d.h:232:15
 	addl	%r10d, %eax
 Ltmp224:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- $eax
 	.loc	8 233 9 is_stmt 1       ## ./pl_unreserved_kwlist_d.h:233:9
 	movl	%esi, %ecx
-	shll	$7, %ecx
-	subl	%esi, %ecx
-	.loc	8 233 15 is_stmt 0      ## ./pl_unreserved_kwlist_d.h:233:15
+	shll	$4, %ecx
+	addl	%esi, %ecx
+	.loc	8 233 14 is_stmt 0      ## ./pl_unreserved_kwlist_d.h:233:14
 	addl	%r10d, %ecx
 Ltmp225:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
@@ -1858,11 +1858,11 @@ Ltmp226:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- $eax
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- $rdi
 	movl	%eax, %edx
-	shll	$5, %edx
-	subl	%eax, %edx
+	shll	$8, %edx
+	addl	%eax, %edx
 	movl	%ecx, %esi
-	shll	$7, %esi
-	subl	%ecx, %esi
+	shll	$4, %esi
+	addl	%ecx, %esi
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- $rdi
 Ltmp227:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] $rdi
@@ -1877,17 +1877,17 @@ LBB13_8:
 	orl	$32, %eax
 Ltmp229:
 	##DEBUG_VALUE: c <- $eax
-	.loc	8 233 15 is_stmt 1      ## ./pl_unreserved_kwlist_d.h:233:15
+	.loc	8 233 14 is_stmt 1      ## ./pl_unreserved_kwlist_d.h:233:14
 	addl	%eax, %esi
 Ltmp230:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:b <- $esi
-	.loc	8 232 14                ## ./pl_unreserved_kwlist_d.h:232:14
+	.loc	8 232 15                ## ./pl_unreserved_kwlist_d.h:232:15
 	addl	%eax, %edx
 Ltmp231:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- $edx
 	movl	%edx, %eax
 Ltmp232:
-	.loc	8 233 15                ## ./pl_unreserved_kwlist_d.h:233:15
+	.loc	8 233 14                ## ./pl_unreserved_kwlist_d.h:233:14
 	movl	%esi, %ecx
 Ltmp233:
 	##DEBUG_VALUE: UnreservedPLKeywords_hash_func:b <- $ecx
@@ -1938,7 +1938,7 @@ Ltmp236:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- $rdi
 	xorl	%edx, %edx
 Ltmp237:
-	##DEBUG_VALUE: ReservedPLKeywords_hash_func:b <- 1
+	##DEBUG_VALUE: ReservedPLKeywords_hash_func:b <- 9
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- 0
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- $rdi
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:keylen <- $rsi
@@ -1962,7 +1962,7 @@ Ltmp239:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:keylen <- $rsi
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:key <- $rdi
 	.loc	58 0 15                 ## ./pl_reserved_kwlist_d.h:0:15
-	movl	$127, %esi
+	movl	$153, %esi
 Ltmp240:
                                         ## implicit-def: $eax
                                         ## implicit-def: $ecx
@@ -1978,7 +1978,7 @@ LBB14_1:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:keylen <- $rsi
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:key <- $rdi
 	.loc	58 0 2                  ## ./pl_reserved_kwlist_d.h:0:2
-	movl	$1, %ecx
+	movl	$9, %ecx
 	xorl	%eax, %eax
 	jmp	LBB14_10
 Ltmp242:
@@ -1990,7 +1990,7 @@ LBB14_4:
 	movq	%r8, %r9
 	subq	%rsi, %r9
 	xorl	%eax, %eax
-	movl	$1, %ecx
+	movl	$9, %ecx
 Ltmp243:
 	.p2align	4, 0x90
 LBB14_5:                                ## =>This Inner Loop Header: Depth=1
@@ -2009,17 +2009,17 @@ Ltmp244:
 	##DEBUG_VALUE: c <- $r10d
 	.loc	58 100 9 is_stmt 1      ## ./pl_reserved_kwlist_d.h:100:9
 	movl	%eax, %edx
-	shll	$5, %edx
-	subl	%eax, %edx
-	.loc	58 100 14 is_stmt 0     ## ./pl_reserved_kwlist_d.h:100:14
+	shll	$8, %edx
+	addl	%eax, %edx
+	.loc	58 100 15 is_stmt 0     ## ./pl_reserved_kwlist_d.h:100:15
 	addl	%r10d, %edx
 Ltmp245:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- $edx
 	.loc	58 101 9 is_stmt 1      ## ./pl_reserved_kwlist_d.h:101:9
 	movl	%ecx, %esi
-	shll	$7, %esi
-	subl	%ecx, %esi
-	.loc	58 101 15 is_stmt 0     ## ./pl_reserved_kwlist_d.h:101:15
+	shll	$4, %esi
+	addl	%ecx, %esi
+	.loc	58 101 14 is_stmt 0     ## ./pl_reserved_kwlist_d.h:101:14
 	addl	%r10d, %esi
 	.loc	58 98 21 is_stmt 1      ## ./pl_reserved_kwlist_d.h:98:21
 	movzbl	1(%rdi), %r10d
@@ -2036,17 +2036,17 @@ Ltmp248:
 	##DEBUG_VALUE: c <- $r10d
 	.loc	58 100 9 is_stmt 1      ## ./pl_reserved_kwlist_d.h:100:9
 	movl	%edx, %eax
-	shll	$5, %eax
-	subl	%edx, %eax
-	.loc	58 100 14 is_stmt 0     ## ./pl_reserved_kwlist_d.h:100:14
+	shll	$8, %eax
+	addl	%edx, %eax
+	.loc	58 100 15 is_stmt 0     ## ./pl_reserved_kwlist_d.h:100:15
 	addl	%r10d, %eax
 Ltmp249:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- $eax
 	.loc	58 101 9 is_stmt 1      ## ./pl_reserved_kwlist_d.h:101:9
 	movl	%esi, %ecx
-	shll	$7, %ecx
-	subl	%esi, %ecx
-	.loc	58 101 15 is_stmt 0     ## ./pl_reserved_kwlist_d.h:101:15
+	shll	$4, %ecx
+	addl	%esi, %ecx
+	.loc	58 101 14 is_stmt 0     ## ./pl_reserved_kwlist_d.h:101:14
 	addl	%r10d, %ecx
 Ltmp250:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
@@ -2060,11 +2060,11 @@ Ltmp251:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- $eax
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- $rdi
 	movl	%eax, %edx
-	shll	$5, %edx
-	subl	%eax, %edx
+	shll	$8, %edx
+	addl	%eax, %edx
 	movl	%ecx, %esi
-	shll	$7, %esi
-	subl	%ecx, %esi
+	shll	$4, %esi
+	addl	%ecx, %esi
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- $rdi
 Ltmp252:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] $rdi
@@ -2079,17 +2079,17 @@ LBB14_8:
 	orl	$32, %eax
 Ltmp254:
 	##DEBUG_VALUE: c <- $eax
-	.loc	58 101 15 is_stmt 1     ## ./pl_reserved_kwlist_d.h:101:15
+	.loc	58 101 14 is_stmt 1     ## ./pl_reserved_kwlist_d.h:101:14
 	addl	%eax, %esi
 Ltmp255:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:b <- $esi
-	.loc	58 100 14               ## ./pl_reserved_kwlist_d.h:100:14
+	.loc	58 100 15               ## ./pl_reserved_kwlist_d.h:100:15
 	addl	%eax, %edx
 Ltmp256:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- $edx
 	movl	%edx, %eax
 Ltmp257:
-	.loc	58 101 15               ## ./pl_reserved_kwlist_d.h:101:15
+	.loc	58 101 14               ## ./pl_reserved_kwlist_d.h:101:14
 	movl	%esi, %ecx
 Ltmp258:
 	##DEBUG_VALUE: ReservedPLKeywords_hash_func:b <- $ecx
@@ -2780,173 +2780,173 @@ _UnreservedPLKeywords_kw_offsets:
 
 	.p2align	4               ## @UnreservedPLKeywords_hash_func.h
 _UnreservedPLKeywords_hash_func.h:
-	.short	10                      ## 0xa
 	.short	32767                   ## 0x7fff
+	.short	43                      ## 0x2b
 	.short	32767                   ## 0x7fff
-	.short	57                      ## 0x39
+	.short	0                       ## 0x0
+	.short	74                      ## 0x4a
+	.short	40                      ## 0x28
+	.short	7                       ## 0x7
 	.short	32767                   ## 0x7fff
-	.short	62                      ## 0x3e
-	.short	21                      ## 0x15
 	.short	32767                   ## 0x7fff
-	.short	54                      ## 0x36
 	.short	18                      ## 0x12
 	.short	32767                   ## 0x7fff
-	.short	58                      ## 0x3a
-	.short	59                      ## 0x3b
-	.short	65482                   ## 0xffca
-	.short	47                      ## 0x2f
+	.short	14                      ## 0xe
+	.short	42                      ## 0x2a
+	.short	3                       ## 0x3
+	.short	33                      ## 0x21
+	.short	65524                   ## 0xfff4
 	.short	0                       ## 0x0
-	.short	65514                   ## 0xffea
-	.short	65472                   ## 0xffc0
+	.short	35                      ## 0x23
+	.short	0                       ## 0x0
+	.short	65525                   ## 0xfff5
+	.short	16                      ## 0x10
 	.short	32767                   ## 0x7fff
-	.short	65514                   ## 0xffea
-	.short	33                      ## 0x21
-	.short	44                      ## 0x2c
-	.short	65531                   ## 0xfffb
+	.short	21                      ## 0x15
+	.short	0                       ## 0x0
+	.short	39                      ## 0x27
+	.short	65519                   ## 0xffef
 	.short	32767                   ## 0x7fff
+	.short	65515                   ## 0xffeb
+	.short	18                      ## 0x12
+	.short	28                      ## 0x1c
+	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	43                      ## 0x2b
-	.short	57                      ## 0x39
-	.short	102                     ## 0x66
 	.short	32767                   ## 0x7fff
-	.short	65471                   ## 0xffbf
-	.short	7                       ## 0x7
 	.short	32767                   ## 0x7fff
-	.short	13                      ## 0xd
 	.short	32767                   ## 0x7fff
-	.short	65508                   ## 0xffe4
 	.short	14                      ## 0xe
+	.short	53                      ## 0x35
+	.short	65533                   ## 0xfffd
+	.short	27                      ## 0x1b
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	82                      ## 0x52
+	.short	65527                   ## 0xfff7
+	.short	32767                   ## 0x7fff
+	.short	65503                   ## 0xffdf
 	.short	32767                   ## 0x7fff
+	.short	32767                   ## 0x7fff
+	.short	81                      ## 0x51
 	.short	0                       ## 0x0
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	8                       ## 0x8
-	.short	65493                   ## 0xffd5
-	.short	0                       ## 0x0
-	.short	19                      ## 0x13
-	.short	8                       ## 0x8
-	.short	75                      ## 0x4b
-	.short	65478                   ## 0xffc6
+	.short	7                       ## 0x7
+	.short	63                      ## 0x3f
 	.short	32767                   ## 0x7fff
+	.short	45                      ## 0x2d
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
-	.short	22                      ## 0x16
-	.short	29                      ## 0x1d
+	.short	49                      ## 0x31
+	.short	83                      ## 0x53
+	.short	65458                   ## 0xffb2
 	.short	32767                   ## 0x7fff
-	.short	65486                   ## 0xffce
-	.short	6                       ## 0x6
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	30                      ## 0x1e
+	.short	34                      ## 0x22
 	.short	32767                   ## 0x7fff
+	.short	65497                   ## 0xffd9
 	.short	32767                   ## 0x7fff
-	.short	29                      ## 0x1d
-	.short	0                       ## 0x0
-	.short	104                     ## 0x68
-	.short	32767                   ## 0x7fff
+	.short	43                      ## 0x2b
+	.short	160                     ## 0xa0
+	.short	45                      ## 0x2d
 	.short	32767                   ## 0x7fff
-	.short	26                      ## 0x1a
 	.short	0                       ## 0x0
+	.short	49                      ## 0x31
+	.short	65513                   ## 0xffe9
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	65527                   ## 0xfff7
-	.short	2                       ## 0x2
+	.short	20                      ## 0x14
+	.short	9                       ## 0x9
+	.short	21                      ## 0x15
+	.short	11                      ## 0xb
+	.short	76                      ## 0x4c
 	.short	32767                   ## 0x7fff
-	.short	50                      ## 0x32
-	.short	39                      ## 0x27
-	.short	38                      ## 0x26
-	.short	39                      ## 0x27
-	.short	80                      ## 0x50
+	.short	53                      ## 0x35
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	8                       ## 0x8
 	.short	32767                   ## 0x7fff
-	.short	65469                   ## 0xffbd
-	.short	89                      ## 0x59
 	.short	32767                   ## 0x7fff
-	.short	65496                   ## 0xffd8
-	.short	64                      ## 0x40
+	.short	0                       ## 0x0
+	.short	35                      ## 0x23
+	.short	11                      ## 0xb
+	.short	65533                   ## 0xfffd
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	26                      ## 0x1a
-	.short	10                      ## 0xa
-	.short	27                      ## 0x1b
+	.short	17                      ## 0x11
+	.short	41                      ## 0x29
+	.short	65495                   ## 0xffd7
+	.short	32767                   ## 0x7fff
+	.short	36                      ## 0x24
 	.short	32767                   ## 0x7fff
 	.short	19                      ## 0x13
 	.short	51                      ## 0x33
-	.short	65523                   ## 0xfff3
-	.short	26                      ## 0x1a
+	.short	65519                   ## 0xffef
+	.short	65495                   ## 0xffd7
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	84                      ## 0x54
-	.short	23                      ## 0x17
-	.short	0                       ## 0x0
-	.short	66                      ## 0x42
-	.short	12                      ## 0xc
-	.short	65531                   ## 0xfffb
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
 	.short	50                      ## 0x32
-	.short	141                     ## 0x8d
-	.short	72                      ## 0x48
-	.short	45                      ## 0x2d
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
+	.short	65499                   ## 0xffdb
+	.short	56                      ## 0x38
 	.short	0                       ## 0x0
-	.short	65514                   ## 0xffea
+	.short	2                       ## 0x2
+	.short	65470                   ## 0xffbe
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	65502                   ## 0xffde
 	.short	0                       ## 0x0
-	.short	19                      ## 0x13
-	.short	65531                   ## 0xfffb
+	.short	65513                   ## 0xffe9
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	37                      ## 0x25
-	.short	13                      ## 0xd
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
+	.short	16                      ## 0x10
 	.short	32767                   ## 0x7fff
+	.short	65526                   ## 0xfff6
 	.short	32767                   ## 0x7fff
-	.short	65468                   ## 0xffbc
-	.short	65532                   ## 0xfffc
 	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	78                      ## 0x4e
+	.short	0                       ## 0x0
+	.short	0                       ## 0x0
+	.short	7                       ## 0x7
+	.short	0                       ## 0x0
+	.short	71                      ## 0x47
+	.short	0                       ## 0x0
+	.short	65528                   ## 0xfff8
+	.short	71                      ## 0x47
+	.short	65527                   ## 0xfff7
+	.short	46                      ## 0x2e
+	.short	77                      ## 0x4d
+	.short	114                     ## 0x72
+	.short	0                       ## 0x0
+	.short	32                      ## 0x20
+	.short	0                       ## 0x0
+	.short	70                      ## 0x46
+	.short	0                       ## 0x0
+	.short	31                      ## 0x1f
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
-	.short	0                       ## 0x0
-	.short	85                      ## 0x55
+	.short	50                      ## 0x32
 	.short	32767                   ## 0x7fff
 	.short	32767                   ## 0x7fff
+	.short	62                      ## 0x3e
 	.short	32767                   ## 0x7fff
-	.short	65443                   ## 0xffa3
 	.short	32767                   ## 0x7fff
 	.short	0                       ## 0x0
 	.short	0                       ## 0x0
+	.short	48                      ## 0x30
 	.short	32767                   ## 0x7fff
-	.short	74                      ## 0x4a
-	.short	5                       ## 0x5
+	.short	65518                   ## 0xffee
 	.short	32767                   ## 0x7fff
+	.short	29                      ## 0x1d
 	.short	32767                   ## 0x7fff
-	.short	71                      ## 0x47
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
+	.short	81                      ## 0x51
+	.short	0                       ## 0x0
 	.short	0                       ## 0x0
 	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	32767                   ## 0x7fff
-	.short	46                      ## 0x2e
-	.short	70                      ## 0x46
+	.short	20                      ## 0x14
 
 .zerofill __DATA,__bss,_pushback_token,16,4 ## @pushback_token
 .zerofill __DATA,__bss,_pushback_auxdata,160,4 ## @pushback_auxdata
@@ -3000,7 +3000,7 @@ _ReservedPLKeywords_kw_offsets:
 
 	.p2align	4               ## @ReservedPLKeywords_hash_func.h
 _ReservedPLKeywords_hash_func.h:
-	.ascii	"\376\177\007\177\000\177\177\177\022\005\177\033\177\000\177\177\000' \026\n\177\023\346\177\365\000\f\177\177\377\034\024\000\027\177\000\016\370\177\177\177\r\005\177\351\001\000\177"
+	.asciz	"\177\000\017\177\t\177\177\177\362\027\177\000\177\b\371\177\000\177\177\004\005\177\177\026\n\372\177\354\177\376\373\177\001\026\372\016\000\000\177\r\000\377\177\177\025\027\007\f"
 
 	.file	59 "/Users/mark.dilger/review/uninorm.4/src/pl/plpgsql/src" "../../../../src/include/lib/stringinfo.h"
 	.section	__DWARF,__debug_str,regular,debug
@@ -5574,7 +5574,7 @@ Ldebug_loc47:
 .set Lset205, Ltmp218-Lfunc_begin0
 	.quad	Lset205
 	.short	2                       ## Loc expr size
-	.byte	49                      ## DW_OP_lit1
+	.byte	51                      ## DW_OP_lit3
 	.byte	159                     ## DW_OP_stack_value
 .set Lset206, Ltmp218-Lfunc_begin0
 	.quad	Lset206
@@ -5724,7 +5724,7 @@ Ldebug_loc53:
 .set Lset247, Ltmp243-Lfunc_begin0
 	.quad	Lset247
 	.short	2                       ## Loc expr size
-	.byte	49                      ## DW_OP_lit1
+	.byte	57                      ## DW_OP_lit9
 	.byte	159                     ## DW_OP_stack_value
 .set Lset248, Ltmp243-Lfunc_begin0
 	.quad	Lset248
#8Mark Dilger
mark.dilger@enterprisedb.com
In reply to: John Naylor (#6)
Re: speed up unicode normalization quick check

On Sep 18, 2020, at 9:41 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:

Attached is version 4, which excludes the output file from pgindent,
to match recent commit 74d4608f5. Since it won't be indented again, I
also tweaked the generator script to match pgindent for the typedef,
since we don't want to lose what pgindent has fixed already. This last
part isn't new to v4, but I thought I'd highlight it anyway.

--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
<v4-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patch><v4-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patch><v4-0003-Use-perfect-hashing-for-NKFC-Unicode-normalizatio.patch>

0002 and 0003 look good to me. I like the way you cleaned up a bit with the unicode_norm_props struct, which makes the code a bit more tidy, and on my compiler under -O2 it does not generate any extra runtime dereferences, as the compiler can see through the struct just fine. My only concern would be if some other compilers might not see through the struct, resulting in a runtime performance cost? I wouldn't even ask, except that qc_hash_lookup is called in a fairly tight loop.

To clarify, the following changes to the generated code which remove the struct and corresponding dereferences (not intended as a patch submission) cause zero bytes of change in the compiled output for me on mac/clang, which is good, and generate inconsequential changes on linux/gcc, which is also good, but I wonder if that is true for all compilers. In your commit message for 0001 you mentioned testing on a multiplicity of compilers. Did you do that for 0002 and 0003 as well?

diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 1714837e64..976b96e332 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -476,8 +476,11 @@ qc_compare(const void *p1, const void *p2)
        return (v1 - v2);
 }
-static const pg_unicode_normprops *
-qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
+static inline const pg_unicode_normprops *
+qc_hash_lookup(pg_wchar ch,
+                          const pg_unicode_normprops *normprops,
+                          qc_hash_func hash,
+                          int num_normprops)
 {
        int                     h;
        uint32          hashkey;
@@ -487,21 +490,21 @@ qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
         * in network order.
         */
        hashkey = htonl(ch);
-       h = norminfo->hash(&hashkey);
+       h = hash(&hashkey);
        /* An out-of-range result implies no match */
-       if (h < 0 || h >= norminfo->num_normprops)
+       if (h < 0 || h >= num_normprops)
                return NULL;
        /*
         * Since it's a perfect hash, we need only match to the specific codepoint
         * it identifies.
         */
-       if (ch != norminfo->normprops[h].codepoint)
+       if (ch != normprops[h].codepoint)
                return NULL;
        /* Success! */
-       return &norminfo->normprops[h];
+       return &normprops[h];
 }
 /*
@@ -518,7 +521,10 @@ qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
        switch (form)
        {
                case UNICODE_NFC:
-                       found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
+                       found = qc_hash_lookup(ch,
+                                                                  UnicodeNormProps_NFC_QC,
+                                                                  NFC_QC_hash_func,
+                                                                  NFC_QC_num_normprops);
                        break;
                case UNICODE_NFKC:
                        found = bsearch(&key,
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 5e1e382af5..38300cfa12 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -13,13 +13,6 @@ typedef struct
        signed int      quickcheck:4;   /* really UnicodeNormalizationQC */
 } pg_unicode_normprops;
-typedef struct
-{
-       const pg_unicode_normprops *normprops;
-       qc_hash_func hash;
-       int                     num_normprops;
-} unicode_norm_info;
-
 static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
        {0x0300, UNICODE_NORM_QC_MAYBE},
        {0x0301, UNICODE_NORM_QC_MAYBE},
@@ -1583,12 +1576,6 @@ NFC_QC_hash_func(const void *key)
        return h[a % 2463] + h[b % 2463];
 }

-static const unicode_norm_info UnicodeNormInfo_NFC_QC = {
- UnicodeNormProps_NFC_QC,
- NFC_QC_hash_func,
- 1231
-};
-
static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
{0x00A0, UNICODE_NORM_QC_NO},
{0x00A8, UNICODE_NORM_QC_NO},

--
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#9John Naylor
john.naylor@2ndquadrant.com
In reply to: Mark Dilger (#8)
Re: speed up unicode normalization quick check

On Sat, Sep 19, 2020 at 1:46 PM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:

0002 and 0003 look good to me. I like the way you cleaned up a bit with the unicode_norm_props struct, which makes the code a bit more tidy, and on my compiler under -O2 it does not generate any extra runtime dereferences, as the compiler can see through the struct just fine. My only concern would be if some other compilers might not see through the struct, resulting in a runtime performance cost? I wouldn't even ask, except that qc_hash_lookup is called in a fairly tight loop.

(I assume you mean unicode_norm_info) Yeah, that usage was copied from
the keyword list code. I believe it was done for the convenience of
the callers. That is worth something, and so is consistency. That
said, I'd be curious if there is a measurable impact for some
platforms.

In your commit message for 0001 you mentioned testing on a multiplicity of compilers. Did you do that for 0002 and 0003 as well?

For that, I was simply using godbolt.org to test compiling the
multiplications down to shift-and-adds. Very widespread, I only
remember MSVC as not doing it. I'm not sure a few extra cycles would
have been noticeable here, but it can't hurt to have that guarantee.

--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#10Mark Dilger
mark.dilger@enterprisedb.com
In reply to: John Naylor (#9)
Re: speed up unicode normalization quick check

On Sep 19, 2020, at 3:58 PM, John Naylor <john.naylor@2ndquadrant.com> wrote:

On Sat, Sep 19, 2020 at 1:46 PM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:

0002 and 0003 look good to me. I like the way you cleaned up a bit with the unicode_norm_props struct, which makes the code a bit more tidy, and on my compiler under -O2 it does not generate any extra runtime dereferences, as the compiler can see through the struct just fine. My only concern would be if some other compilers might not see through the struct, resulting in a runtime performance cost? I wouldn't even ask, except that qc_hash_lookup is called in a fairly tight loop.

(I assume you mean unicode_norm_info) Yeah, that usage was copied from
the keyword list code. I believe it was done for the convenience of
the callers. That is worth something, and so is consistency. That
said, I'd be curious if there is a measurable impact for some
platforms.

Right, unicode_norm_info. I'm not sure the convenience of the callers matters here, since the usage is restricted to just one file, but I also don't have a problem with the code as you have it.

In your commit message for 0001 you mentioned testing on a multiplicity of compilers. Did you do that for 0002 and 0003 as well?

For that, I was simply using godbolt.org to test compiling the
multiplications down to shift-and-adds. Very widespread, I only
remember MSVC as not doing it. I'm not sure a few extra cycles would
have been noticeable here, but it can't hurt to have that guarantee.

I am marking this ready for committer. I didn't object to the whitespace weirdness in your patch (about which `git apply` grumbles) since you seem to have done that intentionally. I have no further comments on the performance issue, since I don't have any other platforms at hand to test it on. Whichever committer picks this up can decide if the issue matters to them enough to punt it back for further performance testing.


Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#11Michael Paquier
michael@paquier.xyz
In reply to: Mark Dilger (#10)
Re: speed up unicode normalization quick check

On Sat, Sep 19, 2020 at 04:09:27PM -0700, Mark Dilger wrote:

I am marking this ready for committer. I didn't object to the
whitespace weirdness in your patch (about which `git apply`
grumbles) since you seem to have done that intentionally. I have no
further comments on the performance issue, since I don't have any
other platforms at hand to test it on. Whichever committer picks
this up can decide if the issue matters to them enough to punt it
back for further performance testing.

About 0001, the new set of multipliers looks fine to me. Even if this
adds an extra item from 901 to 902 because this can be divided by 17
in kwlist_d.h, I also don't think that this is really much bothering
and. As mentioned, this impacts none of the other tables that are much
smaller in size, on top of coming back to normal once a new keyword
will be added. Being able to generate perfect hash functions for much
larger sets is a nice property to have. While on it, I also looked at
the assembly code with gcc -O2 for keywords.c & co and I have not
spotted any huge difference. So I'd like to apply this first if there
are no objections.

I have tested 0002 and 0003, that had better be merged together at the
end, and I can see performance improvements with MSVC and gcc similar
to what is being reported upthread, with 20~30% gains for simple
data sample using IS NFC/NFKC. That's cool.

Including unicode_normprops_table.h in what gets ignored with pgindent
is also fine at the end, even with the changes to make the output of
the structures generated more in-line with what pgindent generates.
One tiny comment I have is that I would have added an extra comment in
the unicode header generated to document the set of structures
generated for the perfect hash, but that's easy enough to add.
--
Michael

#12Michael Paquier
michael@paquier.xyz
In reply to: Michael Paquier (#11)
1 attachment(s)
Re: speed up unicode normalization quick check

On Wed, Oct 07, 2020 at 03:18:44PM +0900, Michael Paquier wrote:

About 0001, the new set of multipliers looks fine to me. Even if this
adds an extra item from 901 to 902 because this can be divided by 17
in kwlist_d.h, I also don't think that this is really much bothering
and. As mentioned, this impacts none of the other tables that are much
smaller in size, on top of coming back to normal once a new keyword
will be added. Being able to generate perfect hash functions for much
larger sets is a nice property to have. While on it, I also looked at
the assembly code with gcc -O2 for keywords.c & co and I have not
spotted any huge difference. So I'd like to apply this first if there
are no objections.

I looked at this one again today, and applied it. I looked at what
MSVC compiler was able to do in terms of optimizations with
shift-and-add for multipliers, and it is by far not as good as gcc or
clang, applying imul for basically all the primes we could use for the
perfect hash generation.

I have tested 0002 and 0003, that had better be merged together at the
end, and I can see performance improvements with MSVC and gcc similar
to what is being reported upthread, with 20~30% gains for simple
data sample using IS NFC/NFKC. That's cool.

For these two, I have merged both together and did some adjustments as
per the attached. Not many tweaks, mainly some more comments for the
unicode header files as the number of structures generated gets
higher. FWIW, with the addition of the two hash tables,
libpgcommon_srv.a grows from 1032600B to 1089240B, which looks like a
small price to pay for the ~30% performance gains with the quick
checks.
--
Michael

Attachments:

uni-norm-hash-v5.patchtext/x-diff; charset=us-asciiDownload
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 93a2e55b75..efee19a3dc 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -3,7 +3,8 @@
 #include "common/unicode_norm.h"
 
 /*
- * We use a bit field here to save space.
+ * Normalization quick check entry for codepoint.  We use a bit field
+ * here to save space.
  */
 typedef struct
 {
@@ -11,6 +12,17 @@ typedef struct
 	signed int	quickcheck:4;	/* really UnicodeNormalizationQC */
 } pg_unicode_normprops;
 
+/* Typedef for hash function on quick check table */
+typedef int (*qc_hash_func) (const void *key);
+
+/* Information for quick check lookup with perfect hash function */
+typedef struct
+{
+	const pg_unicode_normprops *normprops;
+	qc_hash_func	hash;
+	int		num_normprops;
+} unicode_norm_info;
+
 static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
 	{0x0300, UNICODE_NORM_QC_MAYBE},
 	{0x0301, UNICODE_NORM_QC_MAYBE},
@@ -1245,6 +1257,343 @@ static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
 	{0x2FA1D, UNICODE_NORM_QC_NO},
 };
 
+/* Perfect hash function for NFC_QC */
+static int
+NFC_QC_hash_func(const void *key)
+{
+	static const int16 h[2463] = {
+		     0,  -2717,      0,    221,   1293,    223,   1295,    225,
+		   226,    241,      0,    229,    230,    231,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  -386,      0,      0,      0,      0,      0,      0,      0,
+		  -163,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  -246,   -175,   1260,      0,      0,      0,   -174,   -173,
+		     0,   -172,      0,      0,      0,      0,      0,      0,
+		  1049,      0,    300,    301,   1071,      0,   1071,      0,
+		  1071,   1071,   1057,      0,      0,      0,      0,   1061,
+		     0,  -1053,   1664,      0,   2956,      0,      0,    -13,
+		     0,      0,      0,      0,   2156,      0,      0,      0,
+		     0,      0,      0,      0,     71,      0,   1082,      0,
+		  1083,   1083,      0,   1084,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,    359,    360,    361,
+		 -1091,    363,   -762,   -130,   -129,   -128,   -127,   -126,
+		   137,   -124,   -708,   -707,   -706,   -120,   -185,   -705,
+		  -117,   -184,  -1307,   -114,   -113,   -112,   -111,      0,
+		   386,    387,    388,    389,    -90,    391,    171,    172,
+		   394,    -94,   -183,    397,    398,    399,    -98,   -225,
+		   402,  -1019,   -636,  -1019,   -225,    407,    408,    409,
+		   410,    411,    674,    413,   -171,   -170,   -169,    417,
+		   352,   -168,    420,    353,   -770,    423,    424,    425,
+		   426,    427,    428,  32767,    239,    239,    239,    239,
+		   239,    239,    239,    239,    239,    239,    239,    239,
+		   239,    239,  32767,  32767,    237,  32767,    236,  32767,
+		 32767,    234,    234,    234,    234,    617,    234,    234,
+		   234,  -2483,    234,  -1430,   1526,  -1430,   1527,     47,
+		    48,    471,    230,  32767,  32767,  32767,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		  -159,    227,    227,    227,    227,    227,    227,    227,
+		    64,    227,    227,    227,    227,    227,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		   -19,     52,   1487,    227,    227,    227,     53,     54,
+		   227,     55,    227,    227,    227,    227,    227,    227,
+		  1276,    227,   -989,  32767,   1296,    225,   1296,    225,
+		  1296,   1296,   1282,    225,    225,    225,    225,   1286,
+		   225,   -828,   1889,    225,   3181,    225,    225,    212,
+		   225,    225,    225,    225,   2381,    225,    225,    225,
+		   225,    225,    225,    225,    296,    225,   1307,    225,
+		  1308,   1308,    225,   1309,    225,    225,    225,    225,
+		   225,    225,    225,    225,    225,    225,    225,    225,
+		   225,    225,    225,    225,    225,    584,    585,    586,
+		  -866,    588,   -537,     95,     96,     97,     98,     99,
+		   362,    101,   -483,   -482,   -481,    105,     40,   -480,
+		   108,     41,  -1082,    111,    112,    113,    114,    225,
+		   611,    612,    613,    614,    135,    616,    396,    397,
+		   619,    131,     42,    622,    623,    624,    127,      0,
+		   627,   -794,   -411,   -794,      0,    632,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  -272,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,   -166,   -165,  32767,  32767,  32767,  32767,
+		  -164,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    397,  32767,    396,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    386,
+		     0,    386,    386,    386,    386,    386,    386,    386,
+		   223,    386,    386,    386,  32767,    385,    385,    385,
+		   385,    385,  32767,    384,  32767,    383,    383,  32767,
+		   382,    382,  32767,    381,    381,    381,    381,    381,
+		   135,    206,   1641,    381,  32767,  32767,  32767,  32767,
+		 32767,  32767,   -160,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   1148,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		 32767,  32767,  32767,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   -257,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   -910,   -910,  32767,  32767,
+		     0,  32767,      0,  32767,      0,  32767,      0,  32767,
+		   147,  32767,      0,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    143,  32767,    144,  32767,    145,
+		 32767,    146,  32767,      0,  32767,    148,  32767,    149,
+		 32767,  32767,  32767,   -160,  32767,  32767,  32767,  32767,
+		 32767,  32767,     15,  32767,  32767,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   145,  32767,    144,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,   -148,  32767,  32767,  32767,  32767,
+		 32767,  32767,   2009,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,    135,   -918,  32767,
+		   151,  32767,  32767,      0,      1,      2,      3,      4,
+		   133,      5,      6,      7,      8,      9,     10,     11,
+		 32767,  32767,  -1248,  32767,     13,    154,    188,    188,
+		 32767,  32767,  32767,  32767,  32767,    155,     16,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -1853,  -1054,     18,
+		 -1052,  -1051,  -1036,     22,  32767,    157,  32767,     28,
+		    23,   1077,    673,     25,  -2930,      0,  32767,  32767,
+		 32767,  32767,  32767,     27,  32767,    155,  32767,    154,
+		 32767,  32767,    -62,     28,    -42,     30,  -1051,     32,
+		 -1050,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,     34,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    129,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    672,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,      0,  32767,
+		 32767,  32767,  32767,  32767,   -156,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -155,  32767,  32767,
+		 32767,      0,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		    73,  32767,  32767,  32767,  32767,     74,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    675,
+		 32767,  32767,  32767,  32767,  32767,     75,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    165,  32767,  32767,  32767,    166,    167,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    170,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    689,    690,    691,    692,    693,    694,    695,
+		   696,    697,    698,    699,    700,    701,    702,    703,
+		   704,    705,    706,    707,    708,    709,    710,    711,
+		   712,    713,    714,    715,    716,    717,    718,    719,
+		   720,    721,    722,   -304,   -303,   -302,   -301,   -300,
+		  -299,   -298,   -297,    930,   -295,   -294,   -293,   -292,
+		  -291,   -290,   -289,   -288,   -287,   -286,   -285,   -284,
+		  -283,   -282,   -281,   -280,   -279,   -278,   -277,   -276,
+		  -275,    753,    754,    755,    646,    757,   -712,  -1765,
+		   952,   -712,   2244,   -712,   2245,    765,    766,    767,
+		   768,    125,    770,    771,    772,    773,    774,    775,
+		   603,    777,    778,    779,    780,    781,    782,    783,
+		   784,   2011,    786,    787,    788,    789,    790,    791,
+		   792,    793,    794,    795,    796,    797,    798,    799,
+		   800,    801,    802,    803,    804,    805,    806,    603,
+		   603,    809,    603,    811,    603,    603,    814,    815,
+		   816,    817,    435,    819,    820,    821,   3539,    823,
+		   603,   -468,    603,   -468,    603,    603,    589,    831,
+		   603,    603,    603,    835,    836,    837,    838,    839,
+		   840,    841,    842,    843,    844,    845,    846,    847,
+		   848,    849,    850,    851,    852,   1239,    854,    855,
+		   856,    857,    858,    859,    860,   1024,    862,    863,
+		   864,    865,    866,    867,    868,    869,    870,    871,
+		   872,    873,    874,    875,    876,    877,    878,    879,
+		   880,    881,    882,    883,    884,   1131,   1061,   -373,
+		   888,    889,    890,   1065,   1065,    893,   1066,    895,
+		   896,    897,    898,    899,    900,   -148,    902,    603,
+		   603,   -166,    906,   -164,    908,   -162,   -161,   -146,
+		   912,    913,    914,    915,   -145,    917,   1971,   -745,
+		   920,  -2035,    922,    923,    937,    925,    926,    927,
+		   928,  -1227,    930,    931,    932,    933,    934,    935,
+		   936,    866,    938,   -143,    940,   -142,   -141,    943,
+		  -140,  32767,    945,    946,    947,    948,    949,    950,
+		   951,    952,    953,    954,    955,    956,    957,    958,
+		   959,    960,    961,    -65,    -64,    -63,    -62,    -61,
+		   -60,    -59,    -58,   1169,    -56,    -55,    -54,    -53,
+		   -52,    -51,    -50,    -49,    -48,    -47,    -46,    -45,
+		   -44,    -43,    -42,    -41,    -40,    -39,    -38,    -37,
+		   -36,    992,    993,    994,    885,    996,   -473,  -1526,
+		  1191,   -473,   2483,   -473,   2484,   1004,   1005,   1006,
+		  1007,    364,   1009,   1010,   1011,   1012,   1013,   1014,
+		   842,   1016,   1017,   1018,   1019,   1020,   1021,   1022,
+		  1023,   2250,   1025,   1026,   1027,   1028,   1029,   1030,
+		  1031,   1032,   1033,   1034,   1035,   1036,   1037,   1038,
+		  1039,   1040,   1041,   1042,   1043,   1044,   1045,    842,
+		   842,   1048,    842,   1050,    842,    842,   1053,   1054,
+		  1055,   1056,    674,   1058,   1059,   1060,   3778,   1062,
+		   842,   -229,    842,   -229,    842,    842,    828,   1070,
+		   842,    842,    842,   1074,   1075,   1076,   1077,   1078,
+		  1079,   1080,   1081,   1082,   1083,   1084,   1085,   1086,
+		  1087,   1088,   1089,   1090,   1091,   1478,   1093,   1094,
+		  1095,   1096,   1097,   1098,   1099,   1263,   1101,   1102,
+		  1103,   1104,   1105,   1106,   1107,   1108,   1109,   1110,
+		  1111,   1112,   1113,   1114,   1115,   1116,   1117,   1118,
+		  1119,   1120,   1121,   1122,   1123,   1370,   1300,   -134,
+		  1127,   1128,   1129,   1304,   1304,   1132,   1305,   1134,
+		  1135,   1136,   1137,   1138,   1139,     91,   1141,    842,
+		   842,     73,   1145,     75,   1147,     77,     78,     93,
+		  1151,   1152,   1153,   1154,     94,   1156,   2210,   -506,
+		  1159,  -1796,   1161,   1162,   1176,   1164,   1165,   1166,
+		  1167,   -988,   1169,   1170,   1171,   1172,   1173,   1174,
+		  1175,   1105,   1177,     96,   1179,     97,     98,   1182,
+		    99,   1184,   1185,   1186,   1187,   1188,   1189,   1190,
+		  1191,   1192,   1193,   1194,   1195,   1196,   1197,   1198,
+		  1199,   1200,      0,    174,    175,    176,    177,    178,
+		   179,    180,    181,   1408,    183,    184,    185,    186,
+		   187,    188,    189,    190,    191,    192,    193,    194,
+		   195,    196,    197,    198,    199,    200,    201,    202,
+		   203,      0,      0,    206,      0,    208,      0,      0,
+		   211,    212,    213,    214,   -168,    216,    217,    218,
+		  2936,    220,      0,  -1071,      0,  -1071,      0,      0,
+		   -14,    228,      0,      0,      0,    232,    233,    234,
+		   235,    236,    237,    238,    239,    240,    241,    242,
+		   243,    244,    245,    246,    247,    248,    249,    636,
+		   251,    252,    253,    254,    255,    256,    257,    421,
+		   259,    260,    261,    262,    263,    264,    265,    266,
+		   267,    268,    269,    270,    271,    272,    273,    274,
+		   275,    276,    277,    278,    279,    280,    281,    528,
+		   458,   -976,    285,    286,    287,    462,    462,    290,
+		   463,    292,    293,    294,    295,    296,    297,   -751,
+		   299,      0,      0,   -769,    303,   -767,    305,   -765,
+		  -764,   -749,    309,    310,    311,    312,   -748,    314,
+		  1368,  -1348,    317,  -2638,    319,    320,    334,    322,
+		   323,    324,    325,  -1830,    327,    328,    329,    330,
+		   331,    332,    333,    263,    335,   -746,    337,   -745,
+		  -744,    340,   -743,    342,    343,    344,    345,    346,
+		   347,    348,    349,    350,    351,    352,    353,    354,
+		   355,    356,    357,    358,      0,      0,      0,   1453,
+		     0,   1126,    495,    495,    495,    495,    495,    233,
+		   495,   1080,   1080,   1080,    495,    561,   1082,    495,
+		   563,   1687,    495,    495,    495,    495,    385,      0,
+		     0,      0,      0,    480,      0,    221,    221,      0,
+		   489,    579,      0,      0,      0,    498,    626,      0,
+		  1422,   1040,   1424,    631,      0,      0,      0,      0,
+		     0,   -262,      0,    585,    585,    585,      0,     66,
+		   587,      0,     68,   1192,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,    669,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    670,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    142,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    115,    116,    117,    118,    119,    120,
+		   121,    122,    123,    124,    125,    126,    127,    128,
+		   129,    130,    131,    132,    133,    134,    135,    136,
+		   137,    138,    139,    140,    141,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   1027,   1027,   1027,
+		  1027,   1027,   1027,   1027,   1027,   -199,   1027,   1027,
+		  1027,   1027,   1027,   1027,   1027,   1027,   1027,   1027,
+		  1027,   1027,   1027,   1027,   1027,   1027,   1027,   1027,
+		  1027,   1027,   1027,      0,      0,      0,    110,      0,
+		  1470,   2524,   -192,   1473,  -1482,   1475,  -1481,      0,
+		     0,      0,      0,    644,      0,      0,      0,      0,
+		     0,      0,    173,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -1226,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    204,    205,      0,    207,      0,    209,    210,
+		     0,      0,      0,      0,    383,      0,      0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 0;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 17 + c;
+	}
+	return h[a % 2463] + h[b % 2463];
+}
+
+/* Hash lookup information for NFC_QC */
+static const unicode_norm_info UnicodeNormInfo_NFC_QC = {
+	UnicodeNormProps_NFC_QC,
+	NFC_QC_hash_func,
+	1231
+};
+
 static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
 	{0x00A0, UNICODE_NORM_QC_NO},
 	{0x00A8, UNICODE_NORM_QC_NO},
@@ -6165,3 +6514,1262 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
 	{0x2FA1C, UNICODE_NORM_QC_NO},
 	{0x2FA1D, UNICODE_NORM_QC_NO},
 };
+
+/* Perfect hash function for NFKC_QC */
+static int
+NFKC_QC_hash_func(const void *key)
+{
+	static const int16 h[9837] = {
+		 -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,
+		 -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,
+		 -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,
+		 -2472,  -2472,  -2472,  -2472,  -2472,  32767,  32767,  32767,
+		 -2475,  -2475,  -2475,  -2475,  -2475,  -2475,  -2475,  -2475,
+		 -2475,  -2475,  -2475,  -2475,  -2475,  -2475,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    865,    865,    865,    865,    865,    865,    865,
+		   865,    865,    865,    865,  -2255,  32767,  -5207,  32767,
+		 -5207,    860,    860,    860,    860,    860,    860,    860,
+		   860,    860,   4250,    861,    861,    861,   3339,   3339,
+		  3339,   3339,   3339,   3339,   3339,   3339,   3339,   3339,
+		  3339,   3339,   3339,   3339,   3339,   3339,   3339,   3339,
+		 32767,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,      9,     10,  32767,     11,     12,      0,  32767,
+		     0,   2913,   2914,   2915,   2916,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2917,  32767,   2918,   -100,
+		  2919,   2920,   2921,    840,    840,    840,   2922,      0,
+		     0,      0,      0,      0,   2206,      0,   2923,      0,
+		  2924,   2925,   2926,      0,      0,      0,  -2590,      0,
+		     0,      0,      0,      0,      0,      0,   2934,      0,
+		  2474,   2931,   2932,      0,      0,      0,      0,      0,
+		    14,    805,      0,      0,   2933,      0,   2934,      0,
+		  2935,   2936,      0,      0,      0,     16,     17,      0,
+		     0,      0,      0,      0,      0,      0,      0,     18,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   -790,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  -1675,      0,      0,     19,      0,  -1679,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,  -1694,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,     20,     21,     22,     23,     24,     25,
+		    26,     27,     28,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,     29,     30,     31,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    724,   2668,    724,   4350,  -2633,  -2633,
+		  2533,   2534,   2535,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   2518,   2519,   2520,   1431,     45,     46,
+		 32767,  32767,     47,     48,     49,     50,     51,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -3011,     53,  -1125,  -3010,  -3010,
+		 32767,  -3334,  -1123,  -3011,     60,     61,     62,     63,
+		 32767,  32767,     64,  32767,     65,  32767,     66,     67,
+		 32767,  32767,  32767,  32767,  32767,  32767,   2268,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,     69,     70,
+		    71,     72,     73,     74,  32767,  32767,  32767,  32767,
+		    75,     76,  32767,     77,    281,  32767,  32767,  32767,
+		 32767,  32767,  32767,    811,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   1341,   1342,   1343,   1344,   1345,
+		  1346,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,     86,
+		 32767,  32767,  32767,  32767,  32767,   4550,  32767,  32767,
+		 32767,   1135,  32767,  32767,  32767,  32767,  32767,   1130,
+		  3016,  32767,   3017,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    677,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   2858,   2859,    651,   2861,   -438,
+		  2863,   2864,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -5305,  -5305,  -5305,  32767,  -5306,
+		 -5306,  32767,  32767,  32767,   2871,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   3022,   3023,    680,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   -272,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4308,   4309,   4310,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4311,   4312,   4313,
+		  4314,   4315,   4316,   4317,   4318,   4319,   4320,   4321,
+		  4322,   4323,   4324,   4325,   4326,   4307,   4307,   4307,
+		  4307,   4307,   4307,   4307,   4307,   4307,   4336,   4337,
+		  4338,   4339,   4340,   4341,   4342,   4343,   4344,   4345,
+		  4346,   4347,   4348,   4349,   4350,   4351,   4352,   4353,
+		  4354,  32767,  32767,  32767,  32767,   4355,   4356,   4357,
+		  4358,   4359,   4360,   4361,   4362,   4363,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4364,   4365,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   2202,      0,      0,      0,     59,      0,
+		     0,     35,      0,      0,      0,   3549,      0,      0,
+		     0,      0,      0,   3394,      0,      0,   3399,      0,
+		     0,      0,      0,      0,      0,      0,      0,   2012,
+		     0,      0,      0,      0,     87,   2022,      0,   7490,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  2255,      0,   2256,   2256,   2256,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,  -1759,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   4767,      0,      0,   4772,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,   5977,      0,
+		   892,  32767,      0,  32767,  32767,      0,      0,  32767,
+		 32767,   2344,   4834,   4835,   4836,  32767,      0,   4840,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  32767,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		 32767,  32767,      0,  32767,      0,      0,      0,  32767,
+		 32767,  32767,  32767,   3261,   3262,  32767,   3007,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    106,    107,    108,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    109,    110,    111,    112,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,  -2344,
+		 -2344,      0,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -1642,   1469,  -1641,   1469,  -1640,   1469,
+		  1469,   1457,   1469,   1469,   1469,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -3359,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4103,
+		 -1478,      0,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -2433,  -4254,  -4254,  -4254,  -3658,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,      0,  -4253,  -4253,  -4253,  -4253,  -4253,
+		 -4253,  -4253,  -4253,  -4253,   -678,   -677,   -676,   -675,
+		  -674,   -673,   -672,  -4253,    314,  -4253,  -4253,  -4253,
+		 -4253,  -4253,  -4253,  -4253,  -4253,  -4253,  -4253,  -4253,
+		 -4253,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1464,   1465,   1466,   1467,
+		  1468,   1469,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,      0,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    827,    828,    829,  -2469,  -2469,   -260,      0,
+		     0,  32767,      0,  32767,      0,      0,  32767,      0,
+		     0,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  3575,   3576,   3577,   3578,   3579,   3580,   3581,      0,
+		  4567,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,   2201,   4411,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  -3338,      0,      0,      0,
+		     0,      0,      0,      0,  -3337,      0,  -3336,      0,
+		     0,      0,      0,  -3335,      0,      0,  -3334,  -3333,
+		 -3332,  -3331,      0,      0,  -3330,      0,      0,  32767,
+		     0,      0,     13,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   3073,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -2556,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  3074,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2355,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   -488,   -488,   -488,   -302,  -3067,  -3067,
+		 -3067,  -3067,   -488,   -488,   -488,   -488,   2999,   -488,
+		  2999,   -488,   -488,   -488,  -3067,  -3067,  -3067,   -488,
+		  -488,  -3067,  -3067,  -3067,   -488,   -488,   -488,   2463,
+		  -488,   -488,   -488,   -301,   2465,   -488,   2466,   2467,
+		 -3600,   -493,  -3599,   -488,  -3598,   -488,  -3597,   -488,
+		  -488,   -500,   -488,   -488,   -488,   -488,   -488,   2470,
+		  2471,   2472,   -488,   -488,   -254,   -488,   -488,   -488,
+		  -488,   -488,   -104,   -488,   -488,   -488,   -102,   -101,
+		  -100,    -99,    -98,    -97,    -96,    -95,    -94,    -93,
+		   -92,   -488,   -488,   -488,   -488,   -488,   -488,   -488,
+		  -488,   -488,  -2194,  -2194,  -2194,  -2194,  -2194,  -2194,
+		 -2194,  -2194,  -2194,  -2194,   5211,   3269,   5213,   3269,
+		  6895,    -88,    -88,   5078,   5079,   5080,   1773,    -92,
+		   -92,   1773,   1773,   1773,   1773,   1773,   1773,   5072,
+		  5073,   2865,   5075,   1776,   5077,   5078,   1778,   1778,
+		  6942,   6943,   1778,   1778,   1778,   5086,   6952,   6953,
+		  5089,   5090,   5091,   5092,   5093,   5094,   5095,   5096,
+		  4007,   5098,   2333,   2334,   2335,   2336,   2337,  -3066,
+		 -3066,  -3066,   2341,  -3066,  -3066,   2344,   2345,   2346,
+		  5114,    317,   2349,    848,    849,    850,   2353,    852,
+		   853,    854,    855,    856,    857,    858,    859,    860,
+		   861,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   3093,   3094,   3095,   3096,   3097,   3098,   3099,
+		  3100,   3101,   3102,    901,   3104,   3105,   3106,   3048,
+		  3108,   3109,   3075,   3111,   3112,   3113,   -435,   3115,
+		  3116,   3117,   3118,   3119,   -274,   3121,   3122,   -276,
+		  3124,   3125,   3126,   3127,   3128,   3129,   3130,   3131,
+		  1120,   3133,   3134,   3135,   3136,   3050,   1116,   3139,
+		 -4350,   3141,   3142,   3143,   3144,   3145,   3146,   3147,
+		  3148,   3149,   3150,   3151,   3152,   3153,   3154,   3155,
+		  3156,    902,   3158,    903,    904,    905,   3162,   3163,
+		  3164,   3165,   3166,   3167,   3168,   3169,   3170,   3171,
+		  3172,   3173,   3174,   3175,   3176,   3177,  32767,   3178,
+		  3179,   3180,   3181,   3182,   3183,   4943,   3185,   3186,
+		  3187,   3188,   3189,   3190,   3191,   3192,   3193,   3194,
+		  3195,   3196,   3197,   3198,   3199,   3200,   3201,   3202,
+		  3203,   3204,   3205,   3206,   3207,   3208,   3209,   3210,
+		  3211,   3212,   3213,   3214,   3215,   3216,   3217,   3218,
+		  3219,   3220,   3221,   3222,   3223,  -1543,   3225,   3226,
+		 -1545,   3228,   3229,   3230,   3231,   3232,   3233,   3234,
+		  3235,   3236,   3237,   3238,   3239,   3240,   3241,   3242,
+		  3243,   3244,   3245,   3246,   3247,   3248,  -1251,  -2728,
+		  3250,  32767,  32767,   3251,    906,    907,   3252,   3253,
+		 32767,  32767,    910,  -1579,  -1579,  -1579,  32767,   3258,
+		 -1581,   3260,   3261,   3262,   3263,   3264,   3265,   3266,
+		  3267,   3268,   3269,  32767,   3270,  32767,   3271,   3272,
+		  3273,   3274,   3275,   3276,   3277,  32767,   3278,   3279,
+		  3280,   3281,   3282,   3283,   3284,   3285,   3286,   3287,
+		  3288,   3289,   3290,   3291,   3292,   3293,   3294,   3295,
+		  3296,   3297,   3298,   3299,   3300,   3301,   3302,   3303,
+		  3304,   3305,   3306,   3307,   3308,   3309,   3310,   3311,
+		  3312,   3313,   3314,   3315,   3316,   3317,   3318,   3319,
+		  3320,   3321,   3322,   3323,   3324,   3325,   3326,   3327,
+		  3328,   3329,   3330,   3331,   3332,   3333,   3334,   3335,
+		  3336,  32767,   3337,   3338,   3339,   3340,   3341,   3342,
+		     0,   3343,   3344,   3345,   3346,  32767,  32767,   3347,
+		  3348,   3349,   3350,   3351,   3352,   3353,   3354,  32767,
+		  3355,   3356,   3357,   3358,   3359,   3360,   3361,  32767,
+		  3362,   3363,   3364,   3365,   3366,   3367,   3368,   3369,
+		  3370,   3371,   3372,   3373,   3374,   3375,   3376,   3377,
+		  3378,   3379,   3380,   3381,   3382,   3383,   3384,   3385,
+		  3386,   3387,   3388,   3389,      0,   3390,   3391,   3392,
+		   915,    916,    917,    918,    919,    920,    921,    922,
+		   923,    924,    925,    926,    927,    928,    929,    930,
+		   931,    932,    933,    934,    935,    936,    937,    938,
+		   939,    940,    941,    942,    943,    944,    945,    946,
+		   947,    948,    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,   3449,   3450,
+		  3451,   3452,   3453,   3454,   3455,   3456,   3457,   3458,
+		  3459,   3460,   3461,   3462,   3463,   3464,   3465,   3466,
+		  3467,   3468,   3469,   3470,   3471,   3472,   3473,   3474,
+		  3475,   3476,   3477,   3478,   3479,   3480,   3481,   3482,
+		  3483,   3484,   3485,   3486,   3487,   3488,   3489,   3490,
+		  3491,   3492,   3493,   3494,   3495,   3496,   3497,   3498,
+		  3499,   3500,   3501,   3502,   3503,   3504,   3505,   3506,
+		  3507,   3508,   3509,   3510,   3511,   3512,   3513,   3514,
+		  3515,   3516,   3517,   3518,   3519,   3520,   3521,   3522,
+		  3523,   3524,   3525,   3526,   3527,   3528,   3529,   3530,
+		  3531,   3532,   3533,   3534,   3535,   3536,   3537,   3538,
+		  3539,   3540,   3541,   3542,   3543,   3544,   3545,   3546,
+		  3547,   3548,   3549,   3550,   3551,   3552,   3553,   3554,
+		  3555,   3556,   3557,   3558,   3559,   3560,   3561,   3562,
+		  3563,   3564,   3565,   3566,   3567,   3568,   3569,   3570,
+		  3571,   3572,   3573,   3574,   3575,   3576,   3577,   6056,
+		  6057,   6058,  32767,   3581,   3582,   3583,   3584,   3585,
+		  4157,   4158,   4159,   3589,   4162,  -4510,  -1558,  -1557,
+		 -1556,  -1742,  -4507,  -1553,  -4506,  -4506,   1562,  -1544,
+		  1563,  -1547,   1564,  -1545,   1565,  -1543,  -1542,  -1529,
+		 -1540,  -1539,  -1538,  -1537,  -1536,  -4493,  -4493,  -4493,
+		 -1532,  -1531,  -1764,  -1529,   3622,  -1528,  -1527,  -1526,
+		 -1909,  -1524,  -1523,  -1522,  -1907,  -1907,  -1907,  -1907,
+		 -1907,  -1907,  -1907,  -1907,  -1907,  -1907,  -1907,  -1510,
+		 -1509,   1071,   1072,   1073,   1074,   1075,   1076,   1077,
+		  1078,   1079,   1080,   1081,   1082,   1083,   1084,   1085,
+		  1086,   1087,   1088,   1089,   1090,   3663,   3664,   3665,
+		  3666,   3667,   3668,   3669,   3670,   3671,   3672,   3673,
+		  3674,   1095,   1096,   1097,   1098,   1099,   1100,   1101,
+		  3682,   1103,   3684,   1105,   3686,   3687,   3688,   1109,
+		  1110,   1111,   3692,   1113,   1114,   1115,   1116,   1117,
+		  1118,   1119,   3700,   1121,   3702,   3703,   3704,   1125,
+		  1126,   1127,  -1809,  -1809,  -1809,  -1809,  -1809,  -1809,
+		  3720,   3721,   3722,   3717,   3718,   3719,   3720,   1140,
+		  1141,   1142,   1143,  -1802,   1145,   1146,   1147,   1148,
+		  3730,  -1797,   3732,   1152,   3734,   3735,   1155,   1156,
+		  3738,   3739,   3740,   3741,   3742,   3743,  -1785,  -1785,
+		 -1785,  -1779,  -1324,   1168,   1169,   1170,   1171,   1172,
+		  3752,   3753,   1175,   1176,   1177,    992,   3758,   3759,
+		  3760,   3761,   1183,   1184,   1185,   1186,  -2300,   1188,
+		 -2298,   1190,   1191,   1192,   3772,   3773,   3774,   1196,
+		  1197,   3777,   3778,   3779,   1201,   1202,   1203,  -1747,
+		  1205,   1206,   1207,   1021,  -1744,   1210,  -1743,  -1743,
+		  4325,   1219,   4326,   1216,   4327,   1218,   4328,   1220,
+		  1221,   1234,   1223,   1224,   1225,   1226,   1227,  -1730,
+		 -1730,  -1730,   1231,   1232,    999,   1234,   1235,   1236,
+		  1237,   1238,    855,   1240,   1241,   1242,    857,    857,
+		   857,    857,    857,    857,    857,    857,    857,    857,
+		   857,   1254,   1255,   1256,   1257,   1258,   1259,   1260,
+		  1261,   1262,   2969,   2970,   2971,   2972,   2973,   2974,
+		  2975,   2976,   2977,   2978,  -4426,  -2483,  -4426,  -2481,
+		 -6106,    878,    879,  -4286,  -4286,  -4286,   -978,    888,
+		   889,   -975,   -974,   -973,   -972,   -971,   -970,  -4268,
+		 -4268,  -2059,  -4268,   -968,  -4268,  -4268,   -967,   -966,
+		 -6129,  -6129,   -963,   -962,   -961,  -4268,  -6133,  -6133,
+		 -4268,  -4268,  -4268,  -4268,  -4268,  -4268,  -4268,  -4268,
+		 -3178,  -4268,  -1502,  -1502,  -1502,  -1502,  -1502,   3902,
+		  3903,   3904,  -1502,   3906,   3907,  -1502,  -1502,  -1502,
+		 -4269,    529,  -1502,      0,      0,      0,  -1502,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    170,    171,    172,    173,    174,    175,    176,
+		   177,    178,    179,    180,    181,    182,    183,    184,
+		   185,    186,    187,    188,    189,    190,    191,    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,  -3194,    221,    222,    223,    224,
+		 -1657,    226,    227,  -1657,    229,    230,  -1655,    555,
+		 -1655,    234,    235,    236,    732,    238,    239,    240,
+		   241,    242,    243,  -1655,    245,    246,    247,    248,
+		 -1655,    250,  -1655,    252,  -1655,  -1655,  -1655,  -1655,
+		 -1655,  -1655,    259,  -1655,  -1655,  -1655,  -1655,    264,
+		 -1655,    266,  -1655,    268,  -1655,  -3620,    271,    272,
+		 -1655,    274,    275,  -1655,    277,  -1655,  -1655,    280,
+		 -1655,    282,   5746,   5747,   5748,   5749,  -1655,    288,
+		 -1655,    290,  -3335,   3649,   3650,  -1515,  -1515,  -1515,
+		  1793,   3659,   3660,   1796,   1797,   1798,   1799,   1800,
+		  1801,  -1497,  -1497,    712,  -1497,   1803,  -1497,  -1497,
+		  1804,   1805,  -3358,  -3358,   1808,   1809,   1810,  -1497,
+		 -3362,  -3362,  -1497,  -1497,  -1497,  -1497,  -1497,  -1497,
+		 -1497,  -1497,   -407,  -1497,  -1497,  -1497,  -1497,  -1497,
+		 -1497,   3667,   3668,  -1497,  -1497,  -1497,   1811,   3677,
+		  3678,  32767,   1814,  32767,   1815,  32767,  32767,   1816,
+		  1817,  32767,  32767,  32767,   1818,   1819,   1820,   1821,
+		 -3342,  -3342,   1824,   1825,   1826,   1827,   1828,   1829,
+		  1830,   1831,   1832,   1833,   1834,   1835,   1836,   1837,
+		  1838,   1839,   1840,   1841,   1842,   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,   1871,   1872,   1873,   1874,   1875,   1876,  -1537,
+		  1878,   1879,   1880,   1881,      0,   1883,   1884,      0,
+		   529,      0,      0,   2210,      0,   1889,   1890,   1891,
+		  2387,   1893,   1894,   1895,   1896,   1897,   1898,      0,
+		  1900,   1901,   1902,   1903,      0,   1905,      0,   1907,
+		     0,      0,      0,      0,      0,      0,   1914,      0,
+		     0,      0,      0,   1919,      0,   1921,      0,   1923,
+		     0,  -1965,   1926,   1927,      0,   1929,   1930,      0,
+		  1932,      0,      0,   1935,      0,   1937,   7401,   7402,
+		  7403,   7404,      0,   1943,      0,   1945,   1946,      0,
+		  1948,      0,      0,   1951,   1952,   1953,   1954,      0,
+		  1956,   1957,   1958,   1959,   1960,   1961,   1962,      0,
+		  1964,   1965,   1966,   1967,      0,   1969,   1970,   1971,
+		  1972,      0,   1974,      0,   1976,   1977,   1978,   1979,
+		  1980,   1981,   1982,   1983,   1984,   1985,      0,   1987,
+		  1988,   1989,   1990,   1991,    566,    566,    566,   5141,
+		  5142,    566,    566,    566,    566,    566,    566,    566,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   8673,   5722,   5722,   5722,      0,   8676,
+		  5723,   8677,   8678,   2611,   5718,   2612,   5723,   2613,
+		  5723,   2614,   5723,   5723,   5711,   5723,   5723,   5723,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    895,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,    151,   2776,   4254,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   1821,      0,
+		     0,      0,    596,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -2856,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -2901,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -1025,  32767,  32767,  32767,
+		 32767,  -2910,  32767,  32767,  32767,  32767,    157,  32767,
+		 32767,  32767,  32767,    158,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  2359,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    160,  32767,    161,    162,    163,    164,
+		   165,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   898,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1428,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1254,  32767,  32767,  32767,
+		 32767,   1250,  32767,  32767,  32767,  32767,   1246,  32767,
+		 32767,  32767,  32767,   1243,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1231,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   1842,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  3177,   1235,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4323,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    174,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1830,   -112,   1832,   -112,   3514,  -3469,
+		 -3469,   1697,   1698,   1699,  -1608,  -3473,  -3473,  -1608,
+		 -1608,  -1608,  -1608,  -1608,  -1608,   1691,   1692,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  -1623,  -1623,  -1623,   3541,   3542,  -1623,  -1623,
+		 -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,
+		 -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,
+		 -1623,  -1623,  -1623,  -1623,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -766,   2253,   2254,   2255,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1531,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,  32767,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -173,   -173,   -173,   -173,   -173,
+		  -173,   -173,   -173,   -173,   -173,   -173,   -173,   3241,
+		  -173,   -173,   -173,   -173,   1709,   -173,   -173,   1712,
+		  -173,   -173,   1713,   -496,   1715,   -173,   -173,   -173,
+		  -668,   -173,   -173,   -173,   -173,   -173,   -173,   1726,
+		  -173,   -173,   -173,   -173,   1731,   -173,   1733,   -173,
+		  1735,   1736,   1737,   1738,   1739,   1740,   -173,   1742,
+		  1743,   1744,   1745,   -173,   1747,   -173,   1749,   -173,
+		  1751,   3717,   -173,   -173,   1755,   -173,   -173,   1758,
+		  -173,   1760,   1761,   -173,   1763,   -173,  -5636,  -5636,
+		 -5636,  -5636,   1769,   -173,   1771,   -173,   3453,  -3530,
+		 -3530,   1636,   1637,   1638,  -1669,  -3534,  -3534,  -1669,
+		 -1669,  -1669,  -1669,  -1669,  -1669,   1630,   1631,   -577,
+		  1633,  -1666,   1635,   1636,  -1664,  -1664,   3500,   3501,
+		 -1664,  -1664,  -1664,   1644,   3510,   3511,   1647,   1648,
+		  1649,   1650,   1651,   1652,   1653,   1654,    565,   1656,
+		  1657,   1658,   1659,   1660,   1661,  -3502,  -3502,   1664,
+		  1665,   1666,   1667,   1668,   1669,   1670,   1671,   1672,
+		  1673,   1674,   1675,   1676,   1677,   1678,   1679,   1680,
+		  1681,   1682,   1683,   1684,   1685,   1686,   1687,   1688,
+		  1689,   1690,   1691,   1692,   1693,   1694,   1695,   1696,
+		  1697,   1698,   1699,   1700,   1701,   1702,   1703,   1704,
+		  1705,   1706,   1707,   1708,   1709,   1710,   1711,   1712,
+		  1713,   1714,   1715,   1716,  -1697,   1718,   1719,   1720,
+		  1721,   -160,   1723,   1724,   -160,   1726,   1727,   -158,
+		  2052,   -158,   1731,   1732,   1733,   2229,   1735,   1736,
+		  1737,   1738,   1739,   1740,   -158,   1742,   1743,   1744,
+		  1745,   -158,   1747,   -158,   1749,   -158,   -158,   -158,
+		  -158,   -158,   -158,   1756,   -158,   -158,   -158,   -158,
+		  1761,   -158,   1763,   -158,   1765,   -158,  -2123,   1768,
+		  1769,   -158,   1771,   1772,   -158,   1774,   -158,   -158,
+		  1777,   -158,   1779,   7243,   7244,   7245,   7246,   -158,
+		  1785,   -158,   1787,  -1838,   5146,   5147,    -18,    -18,
+		   -18,   3290,   5156,   5157,   3293,   3294,   3295,   3296,
+		  3297,   3298,      0,      0,   2209,      0,   3300,      0,
+		     0,   3301,   3302,  -1861,  -1861,   3305,   3306,   3307,
+		     0,  -1865,  -1865,      0,      0,      0,      0,      0,
+		     0,      0,      0,   1090,      0,      0,      0,      0,
+		     0,      0,   5164,   5165,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,   3414,      0,      0,      0,      0,   1882,      0,
+		     0,   1885,      0,      0,   1886,   -323,   1888,      0,
+		     0,      0,   -495,      0,      0,      0,      0,      0,
+		     0,   1899,      0,      0,      0,      0,   1904,      0,
+		  1906,      0,   1908,   1909,   1910,   1911,   1912,   1913,
+		     0,   1915,   1916,   1917,   1918,      0,   1920,      0,
+		  1922,      0,   1924,   3890,      0,      0,   1928,      0,
+		     0,   1931,      0,   1933,   1934,      0,   1936,      0,
+		 -5463,  -5463,  -5463,  -5463,   1942,      0,   1944,      0,
+		     0,   1947,      0,   1949,   1950,      0,      0,      0,
+		     0,   1955,      0,      0,      0,      0,      0,      0,
+		     0,   1963,      0,      0,      0,      0,   1968,      0,
+		     0,      0,      0,   1973,      0,   1975,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  1986,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,    527,    527,    527,    527,      0,
+		   528,    528,    528,    528,    528,    528,    528,    528,
+		   528,    528,    528,   1998,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1999,   2000,   2001,   2002,   2003,  32767,  32767,  32767,
+		 32767,  32767,   2004,  32767,   2005,   2006,   2007,   2008,
+		  2009,   2010,   2011,   2012,   2013,   2014,   2015,   2016,
+		  2017,   2018,   2019,   2020,   2021,   2022,   2023,   2024,
+		  2025,   2026,   1200,   1200,  32767,   4498,   4499,   2291,
+		  2032,   2033,  32767,   2034,  32767,   2035,   2036,  32767,
+		  2037,   2038,  32767,   2039,   2040,   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,  -1506,  -1506,  -1506,  -1506,  -1506,  -1506,  -1506,
+		  2076,  -2490,   2078,   2079,   2080,   2081,   2082,   2083,
+		  2084,   2085,   2086,   2087,   2088,   2089,   2090,   2091,
+		  2092,   2093,   2094,   2095,   -105,  -2314,   2098,   2099,
+		  2100,   2101,   2102,   2103,   2104,   2105,   2106,   2107,
+		  2108,   2109,   2110,   2111,   2112,   2113,   2114,   2115,
+		  2116,   2117,   2118,   2119,   2120,   5459,   2122,   2123,
+		  2124,   2125,   2126,   2127,   2128,   5466,   2130,   5467,
+		  2132,   2133,   2134,   2135,   5471,   2137,   2138,   5473,
+		  5473,   5473,   5473,   2143,   2144,   5475,   2146,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  2147,   2148,   2149,   2150,   2151,   2152,   2153,   2154,
+		  2155,   2156,   2157,   2158,   2159,   2160,   2161,   2162,
+		  2163,   2164,   2165,   2166,   2167,   2168,   2169,   2170,
+		  2171,   2172,   2173,   2174,   2175,   2176,   2177,   2178,
+		  2179,   2180,   2181,   2182,   2183,   2184,   2185,   2186,
+		  2187,   2188,   2189,   2190,   2191,  32767,   -726,   2293,
+		  -725,   -725,   -725,   1357,   1358,   1359,   -722,   2201,
+		  2202,   2203,   2204,   2205,      0,   2207,   -715,   2209,
+		  -714,   -714,   -714,   2213,   2214,   2215,   4806,   2217,
+		  2218,   2219,   2220,   2221,   2222,   2223,   -710,   2225,
+		  -248,   -704,   -704,   2229,   2230,   2231,   2232,   2233,
+		  2220,   1430,   2236,   2237,   -695,   2239,   -694,   2241,
+		  -693,   -693,   2244,   2245,   2246,   2231,   2231,   2249,
+		  2250,   2251,   2252,   2253,   2254,   2255,   2256,   2239,
+		  2258,   2259,   2260,   2261,   2262,   2263,   2264,   2265,
+		  2266,   2267,   2268,   2269,   2270,   2271,   2272,   2273,
+		  2274,   2275,   2276,   2277,   2278,   2279,   2280,   2281,
+		  2282,   2283,   2284,   2285,   2286,   2287,   2288,   2289,
+		  2290,   2291,   2292,   2293,   3084,   2295,   2296,   2297,
+		  2298,   2299,   2300,   2301,   2302,   2303,   2304,   2305,
+		  2306,   2307,   3983,   2309,   2310,   2292,   2312,   3992,
+		  2314,   2315,   2316,   2317,   2318,   2319,   2320,   2321,
+		  2322,   2323,   2324,   2325,   2326,   2327,   2328,   4023,
+		  2330,   2331,   2332,   2333,   2334,   2335,   2336,   2337,
+		  2338,   2339,   2340,   2341,   2342,   2343,   2344,   2345,
+		  2346,   2347,   2348,   2349,   2350,   2351,   2352,   2353,
+		  2354,   2355,   2356,   2357,   2358,   2359,   2360,   2361,
+		  2362,   2363,   2364,   2365,   2366,   2367,   2368,   2369,
+		  2370,   2371,   2372,   2373,   2374,   2375,   2376,   2377,
+		  2378,   2379,   2360,   2360,   2360,   2360,   2360,   2360,
+		  2360,   2360,   2360,   2389,   2390,   2391,   2392,   2393,
+		  2394,   2395,   2396,   2397,   2398,   2399,   2400,   2401,
+		  2402,   2403,   2404,   2405,   2406,   2407,   2408,   2409,
+		  2410,   2411,   2412,   2413,   2414,   2415,   2416,   2417,
+		  2418,   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,  32767,   2448,
+		  2449,   2450,   2451,   2452,   2453,   2454,   2455,   2456,
+		  2457,   2458,   2459,   2460,   2461,   2462,   2463,   2464,
+		  2465,   2466,   2467,   2468,   2469,   2470,   2471,   2472,
+		  2473,   2474,   2475,   2476,   2477,   2478,   2479,   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,
+		  2505,   2506,   2507,   2508,   2509,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   2510,
+		  2511,   2512,   2513,   3266,   3266,   3266,   3266,   2518,
+		  3267,   3267,   3267,   2522,   3268,   3268,   3268,   3268,
+		  3268,   3268,   3268,   6682,   3268,   3268,   3268,   2534,
+		  5151,   3269,   2537,   2538,   3271,   3271,   5157,   2948,
+		  5159,   2544,   2545,   3273,   2778,   3273,   2549,   3274,
+		  2551,   3275,   2553,   5175,   2555,   3277,   3277,   3277,
+		  5181,   2560,   5184,   3278,   5186,   2564,   5189,   5190,
+		  5191,   5192,   3279,   5194,   5195,   2572,   5198,  32767,
+		 32767,   3278,   5200,   3278,   2577,   2578,   2579,   2580,
+		  5210,   3282,   3282,   5213,   3282,   2586,   2587,   2588,
+		  2589,   2590,   2591,  -2175,  -2175,  -2175,   5230,   3288,
+		  5232,   3288,   6914,    -69,    -69,   5097,   5098,   5099,
+		  1792,    -73,    -73,   1792,   1792,   1792,   1792,   1792,
+		  1792,   5091,   5092,   2884,   5094,   1795,   5096,   5097,
+		  1797,   1797,   6961,   6962,   1797,   1797,   1797,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   2578,   2578,   2578,   2578,   2578,
+		  2578,    872,    872,    872,    872,    872,    872,    872,
+		   872,    872,    872,   8277,   6335,   8279,   6335,   9961,
+		  2978,   2978,   8144,   8145,   8146,   4839,   2974,   2974,
+		  4839,   4839,   4839,   4839,   4839,   4839,   8138,   8139,
+		  5931,   8141,   4842,   8143,   8144,   4844,   4844,  10008,
+		 10009,   4844,   4844,   4844,   8152,  10018,  10019,   8155,
+		  8156,   8157,   8158,   8159,   8160,   8161,   8162,   7073,
+		  8164,   5399,   5400,   5401,   5402,   5403,      0,      0,
+		     0,   5407,      0,      0,   5410,   5411,   5412,   8180,
+		  3383,   5415,   3914,   3915,   3916,   5419,   3918,   3919,
+		  3920,   3921,   3922,   3923,   3924,   3925,   3926,   3927,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   7172,   3758,   3758,   3758,   3758,   5640,
+		  3758,   3758,   5643,   3758,   3758,   5644,   3435,   5646,
+		  3758,   3758,   3758,   3263,   3758,   3758,   3758,   3758,
+		  3758,   3758,   5657,   3758,   3758,   3758,   3758,   5662,
+		  3758,   5664,   3758,   5666,   5667,   5668,   5669,   5670,
+		  5671,   3758,   5673,   5674,   5675,   5676,   3758,   5678,
+		  3758,   5680,   3758,   5682,   7648,   3758,   3758,   5686,
+		  3758,   3758,   5689,   3758,   5691,   5692,   3758,  -1707,
+		 -1707,  -1707,  -1707,  -1707,  -1707,   5698,   3756,   5700,
+		  3756,   7382,    399,    399,   5565,   5566,   5567,   2260,
+		   395,    395,   2260,   2260,   2260,   2260,   2260,   2260,
+		  5559,   5560,   3352,   5562,   2263,   5564,   5565,   2265,
+		  2265,   7429,   7430,   2265,   2265,   2265,   5573,   7439,
+		  7440,   5576,   5577,   5578,   5579,   5580,   5581,   5582,
+		  5583,   4494,   5585,   2820,   2821,   2822,   2823,   2824,
+		 -2579,  -2579,  -2579,   2828,  -2579,  -2579,   2831,   2832,
+		  2833,   5601,    804,   2836,   1335,   1336,   1337,   2840,
+		  1339,   1340,   1341,   1342,   1343,   1344,   1345,   1346,
+		  1347,   1348,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   4593,   1179,   1179,   1179,
+		  1179,   3061,   1179,   1179,   3064,   1179,   1179,   3065,
+		   856,   3067,   1179,   1179,   1179,    684,   1179,   1179,
+		  1179,   1179,   1179,   1179,   3078,   1179,   1179,   1179,
+		  1179,   3083,   1179,   3085,   1179,   3087,   3088,   3089,
+		  3090,   3091,   3092,   1179,   3094,   3095,   3096,   3097,
+		  1179,   3099,   1179,   3101,   1179,   3103,   5069,   1179,
+		  1179,   3107,   1179,   1179,   3110,   1179,   3112,   3113,
+		  1179,   3115,   1179,  -4284,  -4284,  -4284,  -4284,   3121,
+		  1179,   3123,   1179,   4805,  -2178,  -2178,   2988,   2989,
+		  2990,   -317,  -2182,  -2182,   -317,   -317,   -317,   -317,
+		  -317,   -317,   2982,   2983,    775,   2985,   -314,   2987,
+		  2988,   -312,   -312,   4852,   4853,   -312,   -312,   -312,
+		  2996,   4862,   4863,   2999,   3000,   3001,   3002,   3003,
+		  3004,   3005,   3006,   1917,   3008,   3009,   3010,   3011,
+		  3012,   3013,  -2150,  -2150,   3016,   3017,   3018,   3019,
+		  3020,   3021,   3022,   3023,   3024,   3025,   3026,   3027,
+		  3028,   3029,   3030,   3031,   3032,   3033,   3034,   3035,
+		 32767,  32767,  32767,   3036,   3037,   3038,   3039,   3040,
+		  3041,  32767,  32767,   3042,   3043,   3044,   3045,   3046,
+		  3047,  32767,  32767,   3048,   3049,   3050,   3051,   3052,
+		  3053,  32767,  32767,   3054,   3055,   3056,  32767,  32767,
+		 32767,   -357,   3058,   3059,   3060,   3061,   1180,   3063,
+		     0,   1179,   3065,   3066,   1181,   3391,   1181,   3070,
+		     0,      0,      0,      0,  32767,      0,      0,  32767,
+		     0,  32767,      0,      0,  -4973,  32767,  32767,  -7368,
+		 -2202,  -2201,  -2200,  -5507,  -7372,  -7372,  -5507,  -5507,
+		 -5507,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,      0,      0,  32767,      0,
+		  -203,  -2234,   -732,   -732,   -732,  -2234,   -732,   -732,
+		 -2763,  -1261,  -1261,  -1261,  -2763,  -1261,  -1261,  -1261,
+		 -1261,  -1261,  -1261,  -1261,  -1261,  -1261,  -1261,  -1091,
+		 -1090,  -1089,  -1088,  -1087,  32767,  32767,  -1086,  -1085,
+		 -1084,  -1083,  -1082,  -1081,  -1080,  -1079,  -1078,  -1077,
+		 -1076,  -1075,  32767,  -1074,  -1073,  -1072,  -1071,  -1070,
+		 -1069,  -1068,  -1067,  -1066,  -1065,  -1064,  -1063,  -1062,
+		 -1061,  -1060,  -1059,  -1058,  -1057,  -1056,  32767,  -1055,
+		 -1054,  -1053,  -1052,      0,  32767,  32767,  32767,  -1051,
+		 -1050,  -4463,  32767,  -1048,  32767,  -1047,  -2928,  -1045,
+		 -1044,  -2928,  -1042,  -1041,  -2926,   -716,  -2926,  -1037,
+		 -1036,  -1035,   -539,  -1033,  -1032,  -1031,  -1030,  -1029,
+		 -1028,  -2926,  -1026,  -1025,  -1024,  -1023,  -2926,  -1021,
+		 -2926,  -1019,  -2926,  -2926,  -2926,  -2926,  -2926,  -2926,
+		 -1012,  -2926,  -2926,  -2926,  -2926,  -1007,  -2926,  -1005,
+		 -2926,  -1003,  -2926,  -4891,  -1000,   -999,  -2926,   -997,
+		  -996,  -2926,   -994,  -2926,  -2926,   -991,   4475,   4476,
+		  4477,   4478,   4479,   4480,  -2924,   -981,  -2924,   -979,
+		 -4604,   2380,   2381,  -2784,  -2784,  -2784,    524,   2390,
+		  2391,    527,    528,    529,    530,    531,    532,  -2766,
+		 -2766,   -557,  -2766,    534,  -2766,  -2766,    535,    536,
+		 -4627,  -4627,    539,    540,    541,  -2766,  -4631,  -4631,
+		 -2766,  -2766,  -2766,  -2766,  -2766,  -2766,  -2766,  -2766,
+		 -1676,  -2766,      0,      0,      0,      0,      0,   5404,
+		  5405,   5406,      0,   5408,   5409,      0,      0,      0,
+		 -2767,   2031,      0,   1502,   1502,   1502,      0,   1502,
+		  1502,   1502,   1502,   1502,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    224,    225,    226,  32767,    227,    228,    229,
+		   230,    231,    232,    233,    234,    235,    236,     67,
+		 32767,     66,     66,     66,     66,     66,     66,     66,
+		    66,     66,     66,     66,     66,     66,     66,     66,
+		    66,     66,     66,  32767,     65,     65,     65,     65,
+		    65,     65,     65,     65,     65,     65,     65,     65,
+		    65,     65,     65,     65,     65,     65,     65,     65,
+		    65,     65,     65,     65,     65,     65,     65,     65,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -271,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1940,     18,   1942,   3908,     18,     18,   1946,     18,
+		    18,   1949,     18,   1951,   1952,     18,   1954,     18,
+		 -5445,  -5445,  -5445,  -5445,   1960,     18,   1962,     18,
+		  3644,  -3339,  -3339,   1827,   1828,   1829,  -1478,  -3343,
+		 -3343,  -1478,  -1478,  -1478,  -1478,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   1340,   1341,
+		  1342,   1343,   1344,   1345,   1346,   1347,   1348,   1349,
+		 -2064,   1351,   1352,   1353,   1354,  32767,   1355,   1356,
+		 32767,      0,  32767,  32767,   1679,  32767,   1357,   1358,
+		  1359,   1855,   1361,   1362,   1363,   1364,   1365,   1366,
+		 32767,   1367,   1368,   1369,   1370,  32767,   1371,  32767,
+		  1372,  32767,  32767,  32767,  32767,  32767,  32767,   1373,
+		 32767,  32767,  32767,  32767,   1374,  32767,   1375,  32767,
+		  1376,  32767,  -2513,   1378,   1379,  32767,   1380,   1381,
+		 32767,   1382,  32767,  32767,   1383,  32767,   1384,  32767,
+		  6848,  32767,   6849,  32767,   1387,  32767,   1388,   1389,
+		 32767,   1390,  32767,  32767,   1391,   1392,   1393,   1394,
+		 32767,   1395,   1396,   1397,   1398,   1399,   1400,   1401,
+		 32767,   1402,   1403,   1404,   1405,  32767,   1406,   1407,
+		  1408,   1409,  32767,   1410,  32767,   1411,   1412,   1413,
+		  1414,   1415,   1416,   1417,   1418,   1419,   1420,  32767,
+		  1421,   1422,   1423,   1424,   1425,      0,      0,      0,
+		  4575,   4576,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   -571,   -571,
+		  -571,      0,   -572,   8101,   5150,   5150,   5150,   5337,
+		  8103,   5150,   8104,   8105,   2038,   5145,   2039,   5150,
+		  2040,   5150,   2041,   5150,   5150,   5138,   5150,   5150,
+		  5150,   5150,   5150,   8108,   8109,   8110,   5150,   5150,
+		  5384,   5150,      0,   5151,   5151,   5151,   5535,   5151,
+		  5151,   5151,   5537,   5538,   5539,   5540,   5541,   5542,
+		  5543,   5544,   5545,   5546,   5547,   5151,   5151,   2572,
+		  2572,   2572,   2572,   2572,   2572,   2572,   2572,   2572,
+		  2572,   2572,   2572,   2572,   2572,   2572,   2572,   2572,
+		  2572,   2572,   2572,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   2580,
+		  2580,   2580,   2580,   2580,   2580,   2580,      0,   2580,
+		     0,   2580,      0,      0,      0,   2580,   2580,   2580,
+		     0,   2580,   2580,   2580,   2580,   2580,   2580,   2580,
+		     0,   2580,      0,      0,      0,   2580,   2580,   2580,
+		  5517,   5518,   5519,   5520,   5521,   5522,     -6,     -6,
+		    -6,      0,      0,      0,      0,   2581,   2581,   2581,
+		  2581,   5527,   2581,   2581,   2581,   2581,      0,   5528,
+		     0,   2581,      0,      0,   2581,   2581,      0,      0,
+		     0,      0,      0,      0,   5529,   5530,   5531,  32767,
+		 32767,   2579,   2579,   2579,   2579,   2579,      0,      0,
+		  2579,   2579,   2579,   2765,      0,      0,      0,      0,
+		  2579,   2579,   2579,   2579,   6066,   2579,   6066,   2579,
+		  2579,   2579,      0,      0,      0,   2579,   2579,      0,
+		     0,      0,   2579,   2579,   2579,   5530,   2579,   2579,
+		  2579,   2766,   5532,   2579,   5533,   5534,   -533,   2574,
+		  -532,   2579,   -531,   2579,   -530,   2579,   2579,   2567,
+		  2579,   2579,   2579,   2579,   2579,   5537,   5538,   5539,
+		  2579,   2579,   2813,   2579,   2579,   2579,   2579,   2579,
+		  2963,   2579,   2579,   2579,   2965,   2966,   2967,   2968,
+		  2969,   2970,   2971,   2972,   2973,   2974,   2975,   2579,
+		  2579,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,    331,  32767,    332,  -2580,  -2580,  -2580,
+		 -2580,      0,      0,      0,      0,      0,      0,      0,
+		 -2580,      0,  -2580,      0,  -2580,  -2580,  -2580,      0,
+		     0,      0,  -2580,      0,      0,      0,      0,      0,
+		     0,      0,  -2580,      0,  -2580,  -2580,  -2580,      0,
+		     0,      0,   2937,   2938,   2939,   2940,   2941,   2942,
+		 -2586,  -2586,  -2586,  -2580,  -2125,  -2581,  -2581,      0,
+		     0,      0,      0,   2946,      0,      0,      0,      0,
+		 -2581,   2947,  -2581,      0,  -2581,  -2581,      0,      0,
+		 -2581,  -2581,  -2581,  -2581,  -2581,  -2581,   2948,   2949,
+		  2950,   2945,   2491,      0,      0,      0,      0,      0,
+		 -2579,  -2579,      0,      0,      0,    186,  -2579,  -2579,
+		 -2579,  -2579,      0,      0,      0,      0,   3487,      0,
+		  3487,      0,      0,      0,  -2579,  -2579,  -2579,      0,
+		     0,  -2579,  -2579,  -2579,      0,      0,      0,   2951,
+		     0,      0,      0,    187,   2953,      0,   2954,   2955,
+		 -3112,     -5,  -3111,      0,  -3110,      0,  -3109,      0,
+		     0,    -12,      0,      0,      0,      0,      0,   2958,
+		  2959,   2960,      0,      0,    234,      0,      0,      0,
+		     0,      0,    384,      0,      0,      0,    386,    387,
+		   388,    389,    390,    391,    392,    393,    394,    395,
+		   396,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  -1706,  -1706,  -1706,      0,      0,      0,
+		     0,    385,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,    397,
+		   398,    399,    400,    401,    402,    403,    404,    405,
+		  2112,   2113,   2114,    409,    410,    411,    412,  32767,
+		   413,    414,    415,    416,    417,    418,    419,    420,
+		   421,    422,    423,    424,    425,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -1688,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,   -752,   -751,   -750,   -749,      0,   -748,   -747,
+		  -746,      0,   -745,   -744,   -743,   -742,   -741,   -740,
+		  -739,  -4152,   -737,   -736,   -735,      0,  -2616,   -733,
+		     0,      0,   -732,   -731,  -2616,   -406,  -2616,      0,
+		     0,   -727,   -231,   -725,      0,   -724,      0,   -723,
+		     0,  -2621,      0,   -721,   -720,   -719,  -2622,      0,
+		 -2623,   -716,  -2623,      0,  -2624,  -2624,  -2624,  -2624,
+		  -710,  -2624,  -2624,      0,  -2625,   -706,  -2625,   -704,
+		 -2625,   -702,      0,      0,      0,      0,  -2629,   -700,
+		  -699,  -2629,   -697,      0,      0,      0,      0,      0,
+		     0,   4767,   4768,   4769,  -2635,   -692,  -2635,   -690,
+		 -4315,   2669,   2670,  -2495,  -2495,  -2495,    813,   2679,
+		  2680,    816,    817,    818,    819,    820,    821,  -2477,
+		 -2477,   -268,  -2477,    823,  -2477,  -2477,    824,    825,
+		 -4338,  -4338,    828,    829,    830,  -2477,  -4342,  -4342,
+		 -2477,  -2477,  -2477,  -2477,  -2477,  -2477,  -2477,  -2477,
+		 -1387,      0,      0,  32767,  32767,      0,      0,      0,
+		     0,      0,  -2486,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1756,   1757,   1758,
+		  1759,  -5645,  -3702,  -5645,  -3700,  -7325,   -341,   -340,
+		 -5505,  -5505,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,    532,    533,
+		 32767,    534,    535,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -781,   1084,   1084,   1084,   1084,
+		  1084,   1084,   4383,   4384,   2176,   4386,   1087,   4388,
+		  4389,   1089,   1089,   6253,   6254,   1089,   1089,   1089,
+		  4397,   6263,   6264,   4400,   4401,   4402,   4403,   4404,
+		  4405,   4406,   4407,   3318,   4409,   4410,   4411,   4412,
+		  4413,   4414,   -749,   -749,   4417,   4418,   4419,   4420,
+		  4421,   4422,   4423,   4424,   4425,   4426,   4427,   4428,
+		  4429,   4430,   4431,   4432,   4433,   4434,   4435,   4436,
+		  4437,   4438,   4439,   4440,   4441,   4442,   4443,   4444,
+		  4445,   4446,   4447,   4448,   4449,   4450,   4451,   4452,
+		  4453,   4454,   4455,   4456,   4457,   4458,   4459,   4460,
+		  4461,   4462,   4463,   4464,   4465,   4466,   4467,   4468,
+		  4469,   1056,   4471,   4472,   4473,   4474,   2593,   4476,
+		  4477,   2593,   4479,   4480,   2595,   4805,   2595,   4484,
+		  4485,   4486,   4982,   4488,   4489,   4490,   4491,   4492,
+		  4493,   2595,   4495,   4496,   4497,   4498,   2595,   4500,
+		  2595,   4502,   2595,   2595,   2595,   2595,   2595,   2595,
+		  4509,   2595,   2595,   2595,   2595,   4514,   2595,   4516,
+		  2595,   4518,   2595,    630,   4521,   4522,   2595,   4524,
+		  4525,   2595,   4527,   2595,   2595,   4530,   2595,   4532,
+		  9996,   9997,   9998,   9999,   2595,   4538,   2595,   4540,
+		  4541,   2595,   4543,   2595,   2595,   4546,   4547,   4548,
+		  4549,   2595,   4551,   4552,   4553,   4554,   4555,   4556,
+		  4557,   2595,   4559,   4560,   4561,   4562,   2595,   4564,
+		  4565,   4566,   4567,   2595,   4569,   2595,   4571,   4572,
+		  4573,   4574,   4575,   4576,   4577,   4578,   4579,   4580,
+		  2595,   4582,   4583,   4584,   4585,   4586,   4587,   4588,
+		  4589,   4590,   4591,   4592,   4593,   4594,   4595,   4596,
+		  4597,   4598,   4599,   4600,   4601,   4602,   4603,   4604,
+		  4605,   4606,   4607,   4608,   4609,   4610,   4611,   4612,
+		  4613,   4614,   4615,   4089,   4090,   4091,   4092,   4620,
+		  4093,   4094,   4095,   4096,   4097,   4098,   4099,   4100,
+		  4101,   4102,   4103,   4104,   2765,   2765,   2765,   2765,
+		  2765,   2765,   2765,   2765,   2765,   2765,   6179,   2765,
+		  2765,   2765,   2765,   4647,   2765,   2765,   4650,   4122,
+		  4652,   4653,   2444,   4655,   2767,   2767,   2767,   2272,
+		  2767,   2767,   2767,   2767,   2767,   2767,   4666,   2767,
+		  2767,   2767,   2767,   4671,   2767,   4673,   2767,   4675,
+		  4676,   4677,   4678,   4679,   4680,   2767,   4682,   4683,
+		  4684,   4685,   2767,   4687,   2767,   4689,   2767,   4691,
+		  6657,   2767,   2767,   4695,   2767,   2767,   4698,   2767,
+		  4700,   4701,   2767,   4703,   2767,  -2696,  -2696,  -2696,
+		 -2696,   4709,   2767,   4711,   2767,   2767,   4714,   2767,
+		  4716,   4717,   2767,   2767,   2767,   2767,   4722,   2767,
+		  2767,   2767,   2767,   2767,   2767,   2767,   4730,   2767,
+		  2767,   2767,   2767,   4735,   2767,   2767,   2767,   2767,
+		  4740,   2767,   4742,   2767,   2767,   2767,   2767,   2767,
+		  2767,   2767,   2767,   2767,   2767,   4753,   2767,   2767,
+		  2767,   2767,   2767,   4193,   4194,   4195,   -379,   -379,
+		  4198,   4199,   4200,   4201,   4202,   4203,   4204,   4771,
+		  4772,   4773,   4774,   4775,   4776,   4777,   4778,   4779,
+		  4780,  -3892,   -940,   -939,   -938,   4785,  -3890,   -936,
+		 -3889,  -3889,   2179,   -927,   2180,   -930,   2181,   -928,
+		  2182,   -926,   -925,   -912,   -923,   -922,   -921,   4803,
+		  4804,   4805,   4806,   4807,   4808,   4809,   4810,   4811,
+		  4812,   4813,   4814,   4815,   4816,   4817,   4818,   4819,
+		  3925,   4821,   4822,   4823,   4824,   4825,   4826,   4827,
+		  4828,   4829,   4830,   4831,   4832,   4833,   4834,   4835,
+		  4836,   4837,   4838,   4839,   4840,   4841,   4842,   4843,
+		  4844,   4845,   4846,   4847,   4848,   4849,   4850,   4851,
+		  4852,   4853,   4854,   4855,   4856,   4857,   4858,   4859,
+		  4860,   4710,   2086,    609,   4864,   4865,   4866,   4867,
+		  4868,   4869,   4870,   4871,   4872,   3052,   4874,   4875,
+		  4876,   4281,   4878,   4879,   4880,   4881,   4882,   4883,
+		  4884,   4885,   4886,   4887,    634,   4888,   4889,   4890,
+		  4891,   4892,   4893,   4894,   4895,   4896,   1322,   1322,
+		  1322,   1322,   1322,   1322,   1322,   4904,    338,   4906,
+		  4907,   4908,   4909,   4910,   4911,   4912,   4913,   4914,
+		  4915,   4916,   4917,    665,    666,    667,    668,    669,
+		   670,    671,    672,    673,    674,    675,    676,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,  32767,      0,      0,      0,   2478,  32767,   2477,
+		  2477,   2477,   2477,   2477,  32767,   2476,  32767,  32767,
+		 32767,   2473,   2473,   2473,   2473,   2473,   2473,   2473,
+		 32767,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  -2478,  -2478,  -2478,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 9837] + h[b % 9837];
+}
+
+/* Hash lookup information for NFKC_QC */
+static const unicode_norm_info UnicodeNormInfo_NFKC_QC = {
+	UnicodeNormProps_NFKC_QC,
+	NFKC_QC_hash_func,
+	4918
+};
diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index e8e5097c09..2da2824830 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -9,6 +9,10 @@
 use strict;
 use warnings;
 
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
 my %data;
 
 print
@@ -18,13 +22,25 @@ print <<EOS;
 #include "common/unicode_norm.h"
 
 /*
- * We use a bit field here to save space.
+ * Normalization quick check entry for codepoint.  We use a bit field
+ * here to save space.
  */
 typedef struct
 {
 	unsigned int codepoint:21;
 	signed int	quickcheck:4;	/* really UnicodeNormalizationQC */
-}			pg_unicode_normprops;
+} pg_unicode_normprops;
+
+/* Typedef for hash function on quick check table */
+typedef int (*qc_hash_func) (const void *key);
+
+/* Information for quick check lookup with perfect hash function */
+typedef struct
+{
+	const pg_unicode_normprops *normprops;
+	qc_hash_func	hash;
+	int		num_normprops;
+} unicode_norm_info;
 EOS
 
 foreach my $line (<ARGV>)
@@ -66,6 +82,7 @@ foreach my $prop (sort keys %data)
 	  "static const pg_unicode_normprops UnicodeNormProps_${prop}[] = {\n";
 
 	my %subdata = %{ $data{$prop} };
+	my @cp_packed;
 	foreach my $cp (sort { $a <=> $b } keys %subdata)
 	{
 		my $qc;
@@ -82,7 +99,27 @@ foreach my $prop (sort keys %data)
 			die;
 		}
 		printf "\t{0x%04X, %s},\n", $cp, $qc;
+
+		# Save the bytes as a string in network order.
+		push @cp_packed, pack('N', $cp);
 	}
 
 	print "};\n";
+
+	# Emit the definition of the perfect hash function.
+	my $funcname = $prop . '_hash_func';
+	my $f        = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
+		fixed_key_length => 4);
+	printf "\n/* Perfect hash function for %s */", $prop;
+	print "\nstatic $f\n";
+
+	# Emit the structure that wraps the hash lookup information into
+	# one variable.
+	printf "/* Hash lookup information for %s */", $prop;
+	printf "\nstatic const unicode_norm_info ";
+	printf "UnicodeNormInfo_%s = {\n", $prop;
+	printf "\tUnicodeNormProps_%s,\n", $prop;
+	printf "\t%s,\n",                  $funcname;
+	printf "\t%d\n",                   scalar @cp_packed;
+	printf "};\n";
 }
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index ab5ce59345..5d951fc2e0 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -465,15 +465,32 @@ get_canonical_class(pg_wchar ch)
 		return entry->comb_class;
 }
 
-static int
-qc_compare(const void *p1, const void *p2)
+static const pg_unicode_normprops *
+qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
 {
-	uint32		v1,
-				v2;
+	int			h;
+	uint32		hashkey;
 
-	v1 = ((const pg_unicode_normprops *) p1)->codepoint;
-	v2 = ((const pg_unicode_normprops *) p2)->codepoint;
-	return (v1 - v2);
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = htonl(ch);
+	h = norminfo->hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= norminfo->num_normprops)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (ch != norminfo->normprops[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &norminfo->normprops[h];
 }
 
 /*
@@ -482,26 +499,15 @@ qc_compare(const void *p1, const void *p2)
 static UnicodeNormalizationQC
 qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
 {
-	pg_unicode_normprops key;
-	pg_unicode_normprops *found = NULL;
-
-	key.codepoint = ch;
+	const pg_unicode_normprops *found = NULL;
 
 	switch (form)
 	{
 		case UNICODE_NFC:
-			found = bsearch(&key,
-							UnicodeNormProps_NFC_QC,
-							lengthof(UnicodeNormProps_NFC_QC),
-							sizeof(pg_unicode_normprops),
-							qc_compare);
+			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
 			break;
 		case UNICODE_NFKC:
-			found = bsearch(&key,
-							UnicodeNormProps_NFKC_QC,
-							lengthof(UnicodeNormProps_NFKC_QC),
-							sizeof(pg_unicode_normprops),
-							qc_compare);
+			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFKC_QC);
 			break;
 		default:
 			Assert(false);
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index bfe103f195..e629c18be2 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -18,6 +18,10 @@ src/backend/utils/fmgrprotos\.h$
 # they match pgindent style, they'd look worse not better, so exclude them.
 kwlist_d\.h$
 #
+# This uses hash functions generated by PerfectHash.pm, whose format looks
+# worse with pgindent.
+src/include/common/unicode_normprops_table\.h$
+#
 # Exclude ecpg test files to avoid breaking the ecpg regression tests
 # (but include files at the top level of the ecpg/test/ directory).
 src/interfaces/ecpg/test/.*/
#13John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#12)
Re: speed up unicode normalization quick check

On Thu, Oct 8, 2020 at 2:48 AM Michael Paquier <michael@paquier.xyz> wrote:

On Wed, Oct 07, 2020 at 03:18:44PM +0900, Michael Paquier wrote:
I looked at this one again today, and applied it. I looked at what
MSVC compiler was able to do in terms of optimizationswith
shift-and-add for multipliers, and it is by far not as good as gcc or
clang, applying imul for basically all the primes we could use for the
perfect hash generation.

Thanks for picking this up! As I recall, godbolt.org also showed MSVC
unable to do this optimization.

I have tested 0002 and 0003, that had better be merged together at the
end, and I can see performance improvements with MSVC and gcc similar
to what is being reported upthread, with 20~30% gains for simple
data sample using IS NFC/NFKC. That's cool.

For these two, I have merged both together and did some adjustments as
per the attached. Not many tweaks, mainly some more comments for the
unicode header files as the number of structures generated gets
higher.

Looks fine overall, but one minor nit: I'm curious why you made a separate
section in the pgindent exclusions. The style in that file seems to be one
comment per category.

--
John Naylor

#14Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#13)
Re: speed up unicode normalization quick check

On Thu, Oct 08, 2020 at 04:52:18AM -0400, John Naylor wrote:

Looks fine overall, but one minor nit: I'm curious why you made a separate
section in the pgindent exclusions. The style in that file seems to be one
comment per category.

Both parts indeed use PerfectHash.pm, but are generated by different
scripts so that looked better as separate items.
--
Michael

#15John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#14)
Re: speed up unicode normalization quick check

On Thu, Oct 8, 2020 at 8:29 AM Michael Paquier <michael@paquier.xyz> wrote:

On Thu, Oct 08, 2020 at 04:52:18AM -0400, John Naylor wrote:

Looks fine overall, but one minor nit: I'm curious why you made a

separate

section in the pgindent exclusions. The style in that file seems to be

one

comment per category.

Both parts indeed use PerfectHash.pm, but are generated by different
scripts so that looked better as separate items.

Okay, thanks.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#16Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#15)
Re: speed up unicode normalization quick check

On Thu, Oct 08, 2020 at 06:22:39PM -0400, John Naylor wrote:

Okay, thanks.

And applied. I did some more micro benchmarking with the quick
checks, and the numbers are cool, close to what you mentioned for the
quick checks of both NFC and NFKC.

Just wondering about something in the same area, did you look at the
decomposition table?
--
Michael

#17Masahiko Sawada
masahiko.sawada@2ndquadrant.com
In reply to: Michael Paquier (#16)
Re: speed up unicode normalization quick check

On Sun, 11 Oct 2020 at 19:27, Michael Paquier <michael@paquier.xyz> wrote:

On Thu, Oct 08, 2020 at 06:22:39PM -0400, John Naylor wrote:

Okay, thanks.

And applied.

The following warning recently started to be shown in my
environment(FreeBSD clang 8.0.1). Maybe it is relevant with this
commit:

unicode_norm.c:478:12: warning: implicit declaration of function
'htonl' is invalid in C99 [-Wimplicit-function-declaration]
hashkey = htonl(ch);
^
1 warning generated.

Regards,

--
Masahiko Sawada http://www.2ndQuadrant.com/

PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#18Michael Paquier
michael@paquier.xyz
In reply to: Masahiko Sawada (#17)
1 attachment(s)
Re: speed up unicode normalization quick check

On Mon, Oct 12, 2020 at 02:43:06PM +0900, Masahiko Sawada wrote:

The following warning recently started to be shown in my
environment(FreeBSD clang 8.0.1). Maybe it is relevant with this
commit:

unicode_norm.c:478:12: warning: implicit declaration of function
'htonl' is invalid in C99 [-Wimplicit-function-declaration]
hashkey = htonl(ch);
^

Thanks, it is of course relevant to this commit. None of the
BSD animals complain here. So, while it would be tempting to have an
extra include with arpa/inet.h, I think that it would be better to
just use pg_hton32() in pg_bswap.h, as per the attached. Does that
take care of your problem?
--
Michael

Attachments:

htonl-warning.patchtext/x-diff; charset=us-asciiDownload
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 626645ac87..4bb6a0f587 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -23,6 +23,7 @@
 #ifndef FRONTEND
 #include "common/unicode_normprops_table.h"
 #endif
+#include "port/pg_bswap.h"
 
 #ifndef FRONTEND
 #define ALLOC(size) palloc(size)
@@ -475,7 +476,7 @@ qc_hash_lookup(pg_wchar ch, const pg_unicode_norminfo *norminfo)
 	 * Compute the hash function. The hash key is the codepoint with the bytes
 	 * in network order.
 	 */
-	hashkey = htonl(ch);
+	hashkey = pg_hton32(ch);
 	h = norminfo->hash(&hashkey);
 
 	/* An out-of-range result implies no match */
#19Masahiko Sawada
masahiko.sawada@2ndquadrant.com
In reply to: Michael Paquier (#18)
Re: speed up unicode normalization quick check

On Mon, 12 Oct 2020 at 15:27, Michael Paquier <michael@paquier.xyz> wrote:

On Mon, Oct 12, 2020 at 02:43:06PM +0900, Masahiko Sawada wrote:

The following warning recently started to be shown in my
environment(FreeBSD clang 8.0.1). Maybe it is relevant with this
commit:

unicode_norm.c:478:12: warning: implicit declaration of function
'htonl' is invalid in C99 [-Wimplicit-function-declaration]
hashkey = htonl(ch);
^

Thanks, it is of course relevant to this commit. None of the
BSD animals complain here. So, while it would be tempting to have an
extra include with arpa/inet.h, I think that it would be better to
just use pg_hton32() in pg_bswap.h, as per the attached. Does that
take care of your problem?

Thank you for the patch!

Yes, this patch resolves the problem.

Regards,

--
Masahiko Sawada http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#20John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#16)
1 attachment(s)
Re: speed up unicode normalization quick check

On Sun, Oct 11, 2020 at 6:27 AM Michael Paquier <michael@paquier.xyz> wrote:

And applied. I did some more micro benchmarking with the quick
checks, and the numbers are cool, close to what you mentioned for the
quick checks of both NFC and NFKC.

Thanks for confirming.

Just wondering about something in the same area, did you look at the
decomposition table?

Hmm, I hadn't actually, but now that you mention it, that looks worth
optimizing that as well, since there are multiple callers that search that
table -- thanks for the reminder. The attached patch was easy to whip up,
being similar to the quick check (doesn't include the pg_hton32 fix). I'll
do some performance testing soon. Note that a 25kB increase in size could
be present in frontend binaries as well in this case. While looking at
decomposition, I noticed that recomposition does a linear search through
all 6600+ entries, although it seems only about 800 are valid for that.
That could be optimized as well now, since with hashing we have more
flexibility in the ordering and can put the recomp-valid entries in front.
I'm not yet sure if it's worth the additional complexity. I'll take a look
and start a new thread.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Attachments:

v1-decomp-hash.patchapplication/octet-stream; name=v1-decomp-hash.patchDownload
 src/common/unicode/generate-unicode_norm_table.pl |   37 +
 src/common/unicode_norm.c                         |   56 +-
 src/include/common/unicode_norm_table.h           | 1692 +++++++++++++++++++++
 3 files changed, 1761 insertions(+), 24 deletions(-)

diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 7ce15e1a03..b589fd9e4e 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -10,9 +10,14 @@
 use strict;
 use warnings;
 
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
 my $output_file = "unicode_norm_table.h";
 
 my $FH;
+my @code_packed;
 
 # Read list of codes that should be excluded from re-composition.
 my @composition_exclusion_codes = ();
@@ -59,6 +64,9 @@ while (my $line = <$FH>)
 	my %char_entry = (code => $code, class => $class, decomp => $decomp);
 	push(@characters, \%char_entry);
 	$character_hash{$code} = \%char_entry;
+
+	# Save the code point bytes as a string in network order.
+	push @code_packed, pack('N', hex($code));
 }
 close $FH;
 
@@ -96,6 +104,17 @@ typedef struct
 								 * decomposition itself if DECOMP_INLINE */
 } pg_unicode_decomposition;
 
+/* Typedef for hash function on quick check table */
+typedef int (*decomp_hash_func) (const void *key);
+
+/* Information for decomposition lookup with perfect hash function */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	decomp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
 #define DECOMP_NO_COMPOSE	0x80	/* don't use for re-composition */
 #define DECOMP_INLINE		0x40	/* decomposition is stored inline in
 									 * dec_index */
@@ -222,6 +241,24 @@ foreach my $char (@characters)
 }
 print $OUTPUT "\n};\n\n";
 
+# Emit the definition of the perfect hash function.
+my $funcname = 'DecompMain_hash_func';
+my $f        = PerfectHash::generate_hash_function(\@code_packed, $funcname,
+	fixed_key_length => 4);
+print $OUTPUT "/* Perfect hash function for decomposition */\n";
+print $OUTPUT "static $f\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+printf $OUTPUT "/* Hash lookup information for decomposition */\n";
+printf $OUTPUT "static const pg_unicode_decompinfo ";
+printf $OUTPUT "UnicodeDecompInfo = {\n";
+printf $OUTPUT "\tUnicodeDecompMain,\n";
+printf $OUTPUT "\t%s,\n",                  $funcname;
+printf $OUTPUT "\t%d\n",                   scalar @code_packed;
+printf $OUTPUT "};\n\n";
+
+
 # Print the array of decomposed codes.
 print $OUTPUT <<HEADER;
 /* codepoints array  */
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 626645ac87..25b0980cae 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -43,29 +43,37 @@
 #define NCOUNT		VCOUNT * TCOUNT
 #define SCOUNT		LCOUNT * NCOUNT
 
-/* comparison routine for bsearch() of decomposition lookup table. */
-static int
-conv_compare(const void *p1, const void *p2)
-{
-	uint32		v1,
-				v2;
-
-	v1 = *(const uint32 *) p1;
-	v2 = ((const pg_unicode_decomposition *) p2)->codepoint;
-	return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
-}
 
 /*
  * Get the entry corresponding to code in the decomposition lookup table.
  */
-static pg_unicode_decomposition *
+static const pg_unicode_decomposition *
 get_code_entry(pg_wchar code)
 {
-	return bsearch(&(code),
-				   UnicodeDecompMain,
-				   lengthof(UnicodeDecompMain),
-				   sizeof(pg_unicode_decomposition),
-				   conv_compare);
+	int			h;
+	uint32		hashkey;
+	pg_unicode_decompinfo decompinfo = UnicodeDecompInfo;
+
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = htonl(code);
+	h = decompinfo.hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= decompinfo.num_decomps)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (code != decompinfo.decomps[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &decompinfo.decomps[h];
 }
 
 /*
@@ -76,7 +84,7 @@ get_code_entry(pg_wchar code)
  * is only valid until next call to this function!
  */
 static const pg_wchar *
-get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
+get_code_decomposition(const pg_unicode_decomposition *entry, int *dec_size)
 {
 	static pg_wchar x;
 
@@ -103,7 +111,7 @@ get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
 static int
 get_decomposed_size(pg_wchar code, bool compat)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			size = 0;
 	int			i;
 	const uint32 *decomp;
@@ -230,7 +238,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 static void
 decompose_code(pg_wchar code, bool compat, pg_wchar **result, int *current)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			i;
 	const uint32 *decomp;
 	int			dec_size;
@@ -357,8 +365,8 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 		pg_wchar	prev = decomp_chars[count - 1];
 		pg_wchar	next = decomp_chars[count];
 		pg_wchar	tmp;
-		pg_unicode_decomposition *prevEntry = get_code_entry(prev);
-		pg_unicode_decomposition *nextEntry = get_code_entry(next);
+		const pg_unicode_decomposition *prevEntry = get_code_entry(prev);
+		const pg_unicode_decomposition *nextEntry = get_code_entry(next);
 
 		/*
 		 * If no entries are found, the character used is either an Hangul
@@ -416,7 +424,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 	for (count = 1; count < decomp_size; count++)
 	{
 		pg_wchar	ch = decomp_chars[count];
-		pg_unicode_decomposition *ch_entry = get_code_entry(ch);
+		const pg_unicode_decomposition *ch_entry = get_code_entry(ch);
 		int			ch_class = (ch_entry == NULL) ? 0 : ch_entry->comb_class;
 		pg_wchar	composite;
 
@@ -457,7 +465,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 static uint8
 get_canonical_class(pg_wchar ch)
 {
-	pg_unicode_decomposition *entry = get_code_entry(ch);
+	const pg_unicode_decomposition *entry = get_code_entry(ch);
 
 	if (!entry)
 		return 0;
diff --git a/src/include/common/unicode_norm_table.h b/src/include/common/unicode_norm_table.h
index 96d43b893c..0fc0db2016 100644
--- a/src/include/common/unicode_norm_table.h
+++ b/src/include/common/unicode_norm_table.h
@@ -25,6 +25,17 @@ typedef struct
 								 * decomposition itself if DECOMP_INLINE */
 } pg_unicode_decomposition;
 
+/* Typedef for hash function on quick check table */
+typedef int (*decomp_hash_func) (const void *key);
+
+/* Information for decomposition lookup with perfect hash function */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	decomp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
 #define DECOMP_NO_COMPOSE	0x80	/* don't use for re-composition */
 #define DECOMP_INLINE		0x40	/* decomposition is stored inline in
 									 * dec_index */
@@ -6645,6 +6656,1687 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 
 };
 
+/* Perfect hash function for decomposition */
+static int
+DecompMain_hash_func(const void *key)
+{
+	static const int16 h[13209] = {
+		     0,   1515,   4744,   4745,      0,      0,      0,      0,
+		     0,      0,      0,      0,   3890,   3890,      0,      0,
+		  3891,   3891,  -2046,   2800,   3890,   3890,   3890,  -4396,
+		  4361,   4362,  -4441,  -4441,  -4396,   1773,   1773,   1773,
+		  4372,   4373,  -4438,  -4438,  -4393,  -4393,   2619,     17,
+		 -4347,  -4393,  -4393,  -4393,  -4393,  -4393,   2619,   2619,
+		  1560,   4346,   4347,   4348,   1917,   1873,   1874,   1875,
+		 -7856,   4358,  17619,   2622,   2622,   2622,   6357,   6358,
+		  6359,   6360,   6361,   6362,   6363,   2622,  -4390,  -4390,
+		  4414,  -5356,  -5356,   4374,   4375,  -5356,  -5356,  -6335,
+		 -3020,   2511,  -5356,  -5356,  -3583,  -3583,  -3583,  -3583,
+		  -995,      0,      0,  -9799,  -9754,   2874,   2875,   2876,
+		  2877,   2878,  -9830,  -3591,  -9756,  -9756,  -2744,  -5346,
+		 -9710,  -9756,    342,  -5346,  -9756,  -5346,  -2743,   -449,
+		   348,   2894,   2895,  -2853,   2897,   2898,   2899,   2900,
+		  2901,   2902,   2903,   2904,   2905,   2906,   2907,   2908,
+		  2909,   2910,   2911,   2912,   2913,   2914,   2915,   2916,
+		  2917,   2918,   2919,   2920,   2921,   2922,   2923,   2924,
+		  2925,   2926,   2927,   2928,   2929,   2930,   2931,   2932,
+		  2933,   2934,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -8721,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     1,  32767,     48,  32767,  32767,  32767,  32767,     49,
+		 32767,  32767,  -8687,  -8687,  -6255,  -6210,  32767,  32767,
+		 -8689,  -8689, -21949,  32767, -18635, -15320, -15320,  32767,
+		-12006,  -8691,  -8691,  -8691,  -8691,  -8691,  32767,     66,
+		 -8737,  -8737,  -8692,  -8692,  -8692,  -8692,     73,     74,
+		 32767,  -8738,  -8693,  -8693,  -8693,  -8693,  -8693,  32767,
+		 32767,  -8695,  -8695,  -8695,  -8695,  -8695,  32767,  32767,
+		    40,     41,  -2390,  -2434,     44,     45,  32767,     46,
+		 13307,   9993,   9994,   6680,   6681,   3367,   3368,     54,
+		     0,     55,     56,     57,  -8699,  -8699,    105,  32767,
+		 32767,     61,     62,     63,  -8701,  -8701,  32767,    111,
+		 32767,     67,     68,     69,     70,   1890,   3687,  -1272,
+		  3690,     75,     76,     77,     78,     79,     80,     81,
+		    82,  32767,  32767,     83,     84,     85,     86,     87,
+		    88,     89,     90,     91,     92,     93,     94,     95,
+		    96,     97,     98,     99,    100,    101,    102,  32767,
+		 32767,    103,    104,    105,    106,    107,    108,    109,
+		 -8660,  -8660,  32767,  -8661,  -8661,  -8661,  -8661,  -8661,
+		 -8661,  32767,     73,     74,     75,     76,  -2355,  -2399,
+		    79,     80,  32767,  32767,  13341,  10027,  10028,   6714,
+		  6715,   3401,   3402,  32767,  32767,     88,     89,     90,
+		 -8666,  -8666,    138,  32767,  32767,     94,     95,     96,
+		 -8668,  -8668,    144,    145,    101,  -2553,  -2553,  -2553,
+		 -2553,  -4983,  -2553,  -2553,    154,  -2553,    156,  32767,
+		 32767,   6114,    158,  -3153,  -3152,  -3151, -12891,  -6888,
+		  -931,  -3149,    166,  -3148,  -4728,    169,  -3147,  -3146,
+		 -3145,  -3144,  -3143,  -3142,  -3141,  -2543,  -3139,  -3138,
+		   180,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   3314,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,   3660,   3661,   2131,   2132,   2133,   2134,   2135,
+		  2136,   2137,   2138,   2139,   2140,   2141,   2142,   2143,
+		  2144,   2145,  -5472,  -5472,  -3612,  -3612,  -3612,  -3612,
+		 -3612,   2652,  -3612,  -3612,  -3612,  -3612,  -3612,  -3612,
+		 -3612,  -3612,   3693,  -3613,  -7015,  -7015,   1742,   1743,
+		 -7060,  -7060,  -7015,   -846,   -846,   -846,   1753,   1754,
+		 -7057,  -7057,  -7012,  -7012,      0,  -2602,  -6966,  -7012,
+		 -7012,  -7012,  -7012,  -7012,      0,      0,   1725,   1726,
+		  1727,   1728,   -703,   -747,   -746,      0,   1735,   1736,
+		 14997,      0,      0,      0,   3735,   3736,   3737,   3738,
+		  3739,   3740,   3741,      0,  -7012,  -7012,   1792,   1793,
+		  1749,   1750,   1751,  -7980,  -7980,  -8959,  -5644,   -113,
+		 -7980,   -113,  -2382,  -6116,  -6116,  -6116,  -6116,  -6116,
+		 -6116,  -6116,  -2374,   4639,   4640,  -4163,   5608,   5609,
+		 -4120,  -4120,   5612,   5613,   6593,   3279,  -2251,   5617,
+		  5618,   3846,   3847,   3848,   3849,   1262,   1262,  10066,
+		 10067,  10023,   3855,   3856,   3857,   1259,   1259,  10071,
+		  3861,  10027,  10028,   3017,   5620,   9985,  10032,    -65,
+		  5624,  10035,   5626,   3024,    731,    -65,   1298,  12530,
+		  3727,   3727,   3772,   3772,   3772,  13504,  13505,  14485,
+		 11171,   5641,  13509,   5643,   7913,  11648,  11649,  11650,
+		 11651,  11652,  11653,  11654,   7913,    901,    901,   9705,
+		   -65,    -65,   9665,   9666,    -65,    -65,  -1044,   2271,
+		  7802,    -65,    -65,   1708,   1708,   1708,   1708,   4296,
+		  4297,  -4506,  -4506,  -4461,   1708,   1708,   1708,   4307,
+		  4308,  -4503,   1708,  -4457,  -4457,   2555,    -47,  -4411,
+		 -4457,   5641,    -47,  -4457,    -47,   2556,   4850,   5647,
+		  4285,  -6946,   1858,   1859,   1815,   1816,   1817,  -7914,
+		 -7914,  -8893,  -5578,    -47,  -7914,    -47,  -2316,  -6050,
+		 -6050,  -6050,  -6050,  -6050,  -6050,  -6050,  -2308,   4705,
+		  4706,  -4097,   5674,   5675,  -4054,  -4054,   5678,   5679,
+		  6659,   3345,  -2185,   5683,   5684,   3912,   3913,   3914,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -3083,  -3083,    232,    287,    233,    233,
+		   233,   8990,   8991,  32767,  32767,   3668,  32767,   3667,
+		  3667,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    208,    208,    208,    208,    208,    208,
+		 32767,  32767,    206,    206,    206,    206,    206,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    304,    305,  -1274,    307,    308,
+		   309,   6753,  -1374,  10488,   4486,  -1470,   4488,    316,
+		  4489,  -5607,   4490,   4491,   4492,    322,    760,    324,
+		   325,    326,    166,    763,    329,  -2553,    765,    332,
+		   333,    334,    335,    772,    337,   6310,    339,    340,
+		   341,    342,    343,    344,    345,    346,  -2542,  -2542,
+		 -2542,    350,    351,    352,    353,    354,    355,    356,
+		   357,    358,    359,    360,    361,    362,  -6008,    364,
+		   365,    366,    367,    368,    369,    370,    254,    372,
+		   373,    374,    375,    376,    377,    378,    379,    380,
+		   381,    382,  32767,    383,    384,  -3606,  -3605,  -3604,
+		 -3603,    389,  -3600,  -3599,  -3598,   2340,  -1238,  -3595,
+		 -3594,  -3593,   4694,  -4062,  -4062,   4742,   4743,   4699,
+		 -1469,  -1468,  -1467,  -4065,  -4065,   4747,  -1463,   4703,
+		  4704,  -2307,    296,  32767,      0,  32767,  32767,   4708,
+		 -1376,  -1376,  -1376,  32767,  32767,  -1246,    506,    506,
+		     0,  -1559,  32767,  32767,  32767,  32767,  32767,    305,
+		   419,    308,   2578,   6313,   6314,    424,  32767,  -6030,
+		 32767,    426,    427,    428,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,  32767,      0,
+		 32767,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,  32767,    429,  -5407,    431,
+		 -5406,    433,  -3601,    435,  32767,  -3751,  32767,  32767,
+		 32767,  32767,  -3755,  32767,  32767,  32767,  32767,      0,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    436, -11425,  -5422,
+		   535,  -5422,    535,  -5422,   4675,  -5421,  -5421,  -5421,
+		 -5421,  -5421,   4681,      0,      0,      0,   4682,   4683,
+		  4684,   4685,   4686,   4687,      0,      0,  32767,  32767,
+		     0,      0,  -5684,      0,   4688,   4689,   4690,   4691,
+		  4692,   4693,   4694,   4695,  -1257,  -1257,   4696,  -5441,
+		 -5441,   4699,   4700,   4701,  -5443,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    454,      0,  32767,    456,
+		 32767,  32767,      0,    457,  32767,  32767,  32767,      0,
+		   458,    459,    460,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,   4703,   4704,   4705,   4706,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   4655,   4656,   4657,   4658,
+		  4659,   4712,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    462,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    463,    464,  32767,    465,
+		 32767,  32767,  32767,    466,  32767,  32767,  32767,  32767,
+		   467,    468,    469,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   3011,   3011,   3011,
+		  3011,   3011,   3011,   3011,  32767,  32767,  32767,  32767,
+		 32767,  32767,    470,    471,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    472,
+		   473,    474,    475,    476,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   4713,   4714,   4715,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    477,    478,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    479,    480,    481,    482,
+		 32767,  32767,    483,    484,  32767,  32767,    485,    486,
+		   487,    488,    489,    490,  32767,  32767,    491,    492,
+		   493,    494,    495,    496,  32767,  32767,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,    665,   -255,    667,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,    693,    694,    695,    696,
+		   697,    698,    699,    700,    701,    702,    703,    704,
+		   705,    706,    707,    708,    709,    710,    711,    712,
+		  7183,    714,  -1580,    716,   2547,    718,   7194,    720,
+		  2553,    722,    723,   7204,    725,    726,    727,    728,
+		   729,    730,    731,    732,    733,    734,    735,    736,
+		     0,      0,   8114,   8159,    745,  -1535,    747,    748,
+		  8161,  -5019,  -5019,  -5019,  -5019,   1938,      0,      0,
+		     0,      0,      0,      0,    767,    768,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,  32767,  32767,  32767,  32767,  32767,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -2875,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -4271,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  32767,  -2885,  32767,  -2886,  -2886,
+		 32767,  -2887,  -2887,  32767,  -2888,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,    563,    564,
+		   565,    566,    567,    568,    569,    570,    571,    572,
+		   573,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   574,    575,    576,    577,    578,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   -294,   -294,   -294,  -3047,    583,    584,    585,
+		 -4462,  -4418,  -4418,  -4418,  -4418,  -4418,  -4462,  -4462,
+		 -4462,    595,    596,    597,    598,    599,  32767,  32767,
+		 32767,  32767,  -4471,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   4716,   4717,   4718,   4719,
+		  4720,   4721,   4722,   4723,   4724,   4725,   4726,   4727,
+		  4728,   4729,   4730,   4731,   4732,   4733,   4734,   4735,
+		  3826,   4737,   4738,   4739,   4740,   4741,   4742,   3832,
+		  4744,   3833,   3120,   3121,   3835,   3835,   3124,   3836,
+		  3836,   4753,   4754,   4755,   4756,   4757,   4758,   4759,
+		  4760,   4761,   4762,   4763,   4764,   4765,   4766,   4767,
+		  4768,   4769,   4770,   4771,   4772,   4773,   4774,   4775,
+		  4776,   4777,   4778,   4779,   4780,   4781,   6619,   6620,
+		  6621,  11272,   6623,   6624,   4788,   4789,   4790,   3874,
+		  4761,   3874,   4794,   3874,   4796,   4797,   4798,   3874,
+		  4800,  32767,      0,   4802,   4803,   4804,   4805,   4806,
+		  4807,   4808,   4809,   4810,   4811,   4812,   4813,   4814,
+		  4815,   4816,   4817,   4818,   4819,   4820,   4821,   4822,
+		  4823,   4824,   4825,   4826,   4827,   4828,  11299,   4830,
+		  2536,   4832,   6663,   4834,  11310,   4836,   6669,   4838,
+		  4839,  11320,   4841,   4842,   4843,   4844,   4845,   4846,
+		  4847,   4848,   4849,   4850,   4851,   4852,   1188,   4854,
+		  4855,   4856,   4857,   2577,   4859,   4860,  12273,   -907,
+		  -907,   -907,   -907,   -907,   -907,   4868,   4869,   4870,
+		  4871,  32767,   4872,   4873,  32767,  32767,   4874,  32767,
+		   627,   4875,   4876,  32767,  32767,   4877,   4878,   4879,
+		  6722,  32767,   4881,   4882,   4883,   6730,   6731,   7446,
+		  6733,   4888,   7449,   7449,   4891,   4892,  32767,   4893,
+		 32767,   4894,   4895,   4896,   4897,   4898,   4899,   3512,
+		  3513,   3514,   3515,   3516,   4904,   3518,   3519,   3520,
+		  3521,   3522,   3523,   3524,   3525,   3526,   3527,   3528,
+		  3529,   3530,   3531,   3532,   3533,   3534,   3535,   3536,
+		  3537,   3538,   4926,   6797,   4928,   6800,   4930,   4931,
+		  4932,   4933,   4934,   4935,   6813,   4937,   4938,   6816,
+		  6817,   4941,   4942,   4943,      0,   4945,   6821,      0,
+		     0,   4949,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,   -127,   -127,   -127,
+		  7285,   -127,   -127,      0,   -128,   -128,   -128,   -128,
+		     0,  32767,   -130,   4971,   -129,   5613,   5614,   5615,
+		  4976,   5618,  32767,   5619,   5620,   5621,   4981,   5624,
+		  4983,   4984,  32767,   5630,   5631,  -1986,  -1986,   -126,
+		  -126,   5078,   4992,   5037,   5038,   5039,   5040,   5041,
+		  5086,   5087,   5088,   5089,  -2322,   5091,   5092,   5093,
+		  5094,   5095,   5096,   5097,   5098,   5099,   5100,      0,
+		  5101,   -640,   -640,   -640,      0,   -641,   -641,   -641,
+		  -641,   -641,      0,   -642,      0,      0,  32767,   -645,
+		  -645,   6973,   6974,   5115,   5116,    -87,      0,    -44,
+		   -44,    -44,    -44,    -44,    -88,    -88,    -88,    -88,
+		  7324,    -88,    -88,    -88,    -88,    -88,    -88,    -88,
+		   -88,    -88,    -88,    -88,    -88,   5654,   5655,   5656,
+		  5657,   5658,   5659,   5660,   5661,   5662,   5663,   5664,
+		  5665,   5666,   5667,   5668,   5669,  -1948,  -1948,    -88,
+		   -88,   5116,   5117,   5074,   5075,   5076,   5077,   5078,
+		  5123,   5124,   5125,   5126,  -2285,   5128,   5129,   5130,
+		  5131,   5132,   5133,   5134,   5135,   5136,   5137,   5138,
+		  5139,   -602,   -602,   -602,   -602,   -602,   -602,   -602,
+		  -602,   -602,   -602,   -602,   -602,   -602,   -602,   -602,
+		  -602,   7016,   7017,   5158,   5159,    -44,    -44,      0,
+		     0,      0,      0,      0,    -44,    -44,    -44,    -44,
+		  7368,    -44,    -44,    -44,    -44,    -44,    -44,    -44,
+		   -44,    -44,    -44,    -44,    -44,   5698,   5699,   5700,
+		  5701,   5702,   5703,   5704,   5705,   5706,   5707,   5708,
+		  5709,   5710,   5711,   5712,   5713,  -1904,  -1904,    -44,
+		   -44,   5160,   5161,   5118,   5119,   5120,   5121,   5122,
+		  5167,   5168,   5169,   5170,  -2241,   5172,   5173,   5174,
+		  5175,   5176,   5177,   5178,   5179,   5180,   5181,   5182,
+		  5183,   -558,   -558,   -558,   -558,   -558,   -558,   -558,
+		  -558,   -558,   -558,   -558,   -558,   -558,   -558,   -558,
+		  -558,   7060,   7061,   5202,   5203,      0,      0,     44,
+		    44,     44,     44,     44,      0,      0,      0,      0,
+		  7412,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   5742,   5743,   5744,
+		  5745,   5746,   5747,   5748,   5749,   5750,   5751,   5752,
+		  5753,   5754,   5755,   5756,   5757,  -1860,  -1860,      0,
+		     0,      0,      0,      0,   6264,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,  -3402,
+		 -3402,   5355,   5356,  -3447,  -3447,  -3402,  -3402,  -3402,
+		 -3402,   5363,   5364,  -3447,  -3447,  -3402,  -3402,  -3402,
+		 -3358,  -3358,  -3404,  -3404,  -3404,  -3404,  -3404,  -3404,
+		 -3404,   5331,   5332,   5333,   5334,   2903,   2859,   5337,
+		  5338,   5339,   5340,  18601,  15287,  15288,  11974,  11975,
+		  8661,   8662,   5348,   5349,   5350,   5351,   5352,  -3404,
+		 -3404,   5400,   5401,   5357,   5358,   5359,   5360,  -3404,
+		 -3404,   5408,   5409,   5365,   5366,   5367,   5324,   5325,
+		  5372,   5373,   5374,   5375,   5376,   5377,   5378,  -3356,
+		 -3356,  -3356,  -3356,   -924,   -879,  -3356,  -3356,  -3356,
+		 -3356, -16616, -13301, -13301,  -9986,  -9986,  -6671,  -6671,
+		 -3356,  -3356,  -3356,  -3356,  -3356,   5401,   5402,  -3401,
+		 -3401,  -3356,  -3356,  -3356,  -3356,   5409,   5410,  -3401,
+		 -3401,  -3356,  -3356,  -3356,  -3312,  -3312,  -3358,  -3358,
+		 -3358,  -3358,  -3358,  -3358,  -3358,   5377,   5378,   5379,
+		  5380,   2949,   2905,   5383,   5384,   5385,   5386,  18647,
+		 15333,  15334,  12020,  12021,   8707,   8708,   5394,   5395,
+		  5396,   5397,   5398,  -3358,  -3358,   5446,   5447,   5403,
+		  5404,   5405,   5406,  -3358,  -3358,   5454,   5455,   5411,
+		  5412,   5413,   5414,   5415,   5416,   5417,   5418,   5419,
+		  5420,   5421,   5422,  -3312,  -3312,  -3312,  -3312,   -880,
+		  -835,  -3312,  -3312,  -3312,  -3312, -16572, -13257, -13257,
+		 -9942,  -9942,  -6627,  -6627,  -3312,  -3312,  -3312,  -3312,
+		 -3312,   5445,   5446,  -3357,  -3357,  -3312,  -3312,  -3312,
+		 -3312,   5453,   5454,  -3357,  -3357,  -3312,  -3312,  -3312,
+		 -3312,  -3312,  -3312,  -3312,  -3312,  -3312,  -3312,  -3312,
+		 -3312,   5423,   5424,   5425,   5426,   2995,   2951,   5429,
+		  5430,   5431,   5432,  18693,  15379,  15380,  12066,  12067,
+		  8753,   8754,   5440,   5441,   5442,   5443,   5444,  -3312,
+		 -3312,   5492,   5493,   5449,   5450,   5451,   5452,  -3312,
+		 -3312,   5500,   5501,   5457,   2803,   2803,   2803,   2803,
+		   373,   2803,   2803,   5510,   2803,   5512,  11470,   5514,
+		 11472,   5516,   2205,   2206,   2207,  -7533,  -1530,   4427,
+		  2209,   5524,   2210,    630,   5527,   2211,   2212,   2213,
+		  2214,   2215,   2216,   2217,   2815,   2219,   2220,   5538,
+		  2221,   5540,   2222,   5542,   5543,   2223,  -3312,  -3312,
+		 -3312,   5548,   5549,  -3312,  -3312,   2803,   2803,   2803,
+		  5555,   5556,   5557,   2803,   2803,   2803,   2803,   2803,
+		  2803,   2803,   2803,   2803,   2803,   2803,   2803,   2803,
+		  9050,   9051,   2803,   2803,   2803,   2803,   2803,   2803,
+		  2803,   2803,   2803,   2803,   2803,   2803,   4318,   7547,
+		  7548,   2803,   2803,   2803,   2803,   2803,   2803,   2803,
+		  2803,   6693,   6693,   2803,   2803,   6694,   6694,    757,
+		  5603,   6693,   6693,   6693,  -1593,   7164,   7165,  -1638,
+		 -1638,  -1593,   4576,   4576,   4576,   7175,   7176,  -1635,
+		 -1635,  -1590,  -1590,   5422,   2820,  -1544,  -1590,  -1590,
+		 -1590,  -1590,  -1590,   5422,   5422,   4363,   7149,   7150,
+		  7151,   4720,   4676,   4677,   4678,  -5053,   7161,  20422,
+		  5425,   5425,   5425,   9160,   9161,   9162,   9163,   9164,
+		  9165,   9166,   5425,  -1587,  -1587,   7217,  -2553,  -2553,
+		  7177,   7178,  -2553,  32767,  32767,   -219,   5312,  -2555,
+		 -2555,   -782,   -782,   -782,   -782,   1806,   2801,   2801,
+		 -6998,  -6953,   5675,   5676,   5677,   5678,   5679,  -7029,
+		  -790,  -6955,  -6955,     57,  -2545,  -6909,  -6955,   3143,
+		 -2545,  -6955,  -2545,     58,   2352,   3149,   5695,   5696,
+		   -52,   5698,   5699,   5700,   5701,   5702,   5703,   5704,
+		  5705,   5706,   5707,   5708,   5709,   5710,   5711,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -1838,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   6927,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -973,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,   4567,   4568,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -437,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -448,  32767,  32767,   -450,   -450,
+		  -450,      0,  32767,  32767,  32767,  -2166,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,      0,  32767,   -464,
+		  -464,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -514,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  5757,   5758,   5759,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -4186,  -4186, -12097,  -4186,  32767,
+		 -4187,  -4187,  -8787,  32767,      0,      0,   5952,      0,
+		     0,  -4183,  -4183,  -4183,      0,  -2386,  -4182,    778,
+		 -4183,  -5935,  32767,  32767,  -4690,  -6249,  -4184,  -4184,
+		 -4184,  32767,  32767,  -4186,  -4186,    -77,  32767,    -77,
+		 32767,  -4188,      0,  -4189,  32767,      0,      0,      0,
+		     0,  32767,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -5937,  -2358,      0,      0,      0,
+		 -8286,    471,    472,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1747,  32767,  -2126,  32767,  32767,   1748,
+		  1749,   1750,   1751,   1752,   1753,   8224,   1755,   -539,
+		  1757,    781,  32767,  32767,  32767,  -1991,  -2035,  32767,
+		 32767,    782,  -3784,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    837,  32767,  32767,  32767,  32767,  32767,  -4008,
+		 -4008,  -4008,   2949,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,   -797,   1806,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   4605,   4606,
+		 32767,  32767,      0,    455,  32767,      0,  32767,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -4244,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   784,  32767,  32767,   2950,   2951,  32767,  32767,  32767,
+		 32767,  32767,  32767,    786,    787,  32767,   1252,   1253,
+		 32767,    790,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,  32767,      0,  32767,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -200,   -200,   -200,
+		  -200,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -5932,  -5932,  32767,  32767,   2952,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -5387,
+		 -5387,  -5387,  -5387,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,      0,  32767,  32767,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,    497,    498,    499,    500,
+		   501,    502,    503,    504,    505,    506,    507,    508,
+		 32767,  32767,   -156,    765,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -861,
+		 32767,   6106,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2953,   2954,  32767,    797,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   2955,  32767,  32767,  32767,  -8929,
+		 32767,  -8885,  -8885,  -8885,  32767,  32767,  32767,  32767,
+		 32767,  32767,   -749,   7119,   7120,  32767,  32767,  32767,
+		 32767,   2760,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  -1181,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -5587,      0,   7596,
+		  7597,      0,      0,      0,      0,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   -714,      0,
+		     0,   -713,   -712,      0,   -711,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   1859,
+		     0,   3247,  32767,  32767,      0,   3247,      0,   3248,
+		     0,   3249,      0,   3250,      0,   3251,      0,   3252,
+		   808,   3252,      0,   3253,      0,   3254,      0,      0,
+		  3256,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,  32767,  32767,  32767,  32767,      0,      0,   6824,
+		 32767,      0,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  4207,   4208,      0,      0,      0,      0,      0,   1896,
+		     0,      0,   1898,   1898,   1898,   1898,      0,      0,
+		     0,   1901,   1901,      0,      0,      0,      0,      0,
+		     0,  -1319,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   7618,   7619,   7620,
+		     3,      3,   1863,   1863,   7067,   7068,   7025,   7026,
+		  7027,   7028,   7029,   7074,   7075,   7076,   7077,   -334,
+		  7079,   7080,   7081,   7082,   7083,   7084,   7085,   7086,
+		  7087,   7088,   7089,   7090,   1349,   1349,   1349,   1349,
+		  1349,   1349,   1349,   1349,   1349,   1349,   1349,   1349,
+		  1349,   1349,   1349,   1349,   8967,   8968,   7109,   7110,
+		  1907,   1907,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   2976,   2977,   2978,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,    820,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    821,
+		  2381,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   2005,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    823,  32767,    824,  32767,
+		   825,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    826,  32767,  32767,  32767,  32767,  32767,
+		 32767,   4575,   4576,   4577,   4578,   4579,   4580,   4581,
+		  4582,   4583,   4584,   4585,  32767,  32767,    829,  32767,
+		 32767,  32767,  32767,    830,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  6253,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  6253,  -3848,    834,    835,    836,  -3845,  -3845,  -3845,
+		 -3845,  -3845,  -3845,    843,    844,  -4280,  32767,    845,
+		   846,   6531,    848,  -3839,  32767,  -3840,  -3840,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   1946,  32767,
+		 32767,  32767,  -3849,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    853,  32767,  32767,  32767,
+		 32767,    854,  32767,  32767,  32767,  32767,    855,  32767,
+		 32767,  32767,  32767,    856,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   857,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -3799,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   8266,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,    859,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    860,
+		 32767,    861,  -5065,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  10746,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4526,
+		 32767,   4573,   4574,   4575,  32767,  32767,  -2436,  -1376,
+		 32767,  32767,  32767,  32767,  32767,  -1689,  -1689,   4349,
+		 -4171,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   4588,  32767,
+		  4589,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4590,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4591,   4592,  32767,
+		 32767,  32767,  32767,  32767,  32767,   2933,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    864,  32767,  32767,  32767,
+		     0,  32767,      0,  32767,  32767,  -2977,    335,    335,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2992,   2993,   2994,   2995,
+		 32767,  32767,  32767,   4596,   2550,  32767,  32767,  32767,
+		 -1188,   4769,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  4600,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   2997,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4601,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   2013,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767, -11287,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -4664,  32767,  32767,  -4711,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -4718,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4049,
+		 32767,  32767,  32767,   4050,   4051,   4052,  17313,  32767,
+		 32767,  32767,  10684,   7370,   7371,   4057,   4058,   4059,
+		  4060,   4061,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   4603,   8793,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1283,   4897,   4898,   4899,  12175,   4901,   4902,  32767,
+		  4903,   4904,   4905,   4906,   4907,  10276,  -1469,   1282,
+		  1282,   1282,   1282,   1282,   1282,   1282,   1282,   1282,
+		  1282,  32767,  32767,   4920,   4921,   4063,  -2051,  -2050,
+		  4925,   4926,  32767,   7332,   7333,  32767,   7334,   7335,
+		  7336,   7337,   5045,  32767,  32767,  32767,  -2049,  -2048,
+		 32767,  -8294,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   1132,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  20166,  16852,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   6908,   6909,   6910,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		 -4510,  -4510,  -4510,  -4510,  -4510,  -4510,  -4510,      0,
+		     0,      0,      0,      0,      0,  -1831,  -1831,  -1831,
+		-15091, -11776, -11776,  -8461,      0,      0,      0,  -1834,
+		 -1834,  -1834,  -1834,  -1834,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -1819,  -3615,   1345,  -3616,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,   8770,   8771,
+		  8772,   8773,   8774,   8775,   8776,   8777,   8778,   8779,
+		    45,     45,     45,     45,   2477,   2522,     45,     45,
+		    45,     45, -13215,  -9900,  -9900,  -6585,  -6585,  -3270,
+		 -3270,     45,     45,     45,     45,     45,   8802,   8803,
+		     0,      0,     45,     45,     45,     45,   8810,   8811,
+		     0,      0,     45,   2700,   2701,   2702,   2703,   5134,
+		  2705,   2706,      0,   2708,      0,  -5957,      0,  -5957,
+		     0,   3312,   3312,   3312,  13053,   7051,   1095,   3314,
+		     0,   3315,   4896,      0,   3317,   3317,   3317,   3317,
+		  3317,   3317,   3317,   2720,   3317,   3317,      0,   3318,
+		     0,   3319,      0,      0,   3321,   8857,   8858,   8859,
+		     0,      0,   8862,   8863,   2749,   2750,   2751,      0,
+		     0,      0,   2755,   2756,   2757,   2758,   2759,   2760,
+		  2761,   2762,   2763,   2764,   2765,   2766,   2767,  -3479,
+		 -3479,   2770,   2771,   2772,   2773,   2774,   2775,   2776,
+		  2777,   2778,   2779,   2780,   2781,   1267,  -1961,  -1961,
+		  2785,   2786,   2787,   2788,   2789,   2790,   2791,   2792,
+		 -1097,  -1096,   2795,   2796,  -1094,  -1093,   4845,      0,
+		 -1089,  -1088,  -1087,   7200,  -1556,  -1556,   7248,   7249,
+		  7205,   1037,   1038,   1039,  -1559,  -1559,   7253,   7254,
+		  7210,   7211,    200,   2803,   7168,   7215,   7216,   7217,
+		  7218,   7219,    208,    209,   1269,  -1516,  -1516,  -1516,
+		   916,    961,    961,    961,  10693,  -1520, -14780,    218,
+		   219,    220,  -3514,  -3514,  -3514,  -3514,  -3514,  -3514,
+		 -3514,    228,   7241,   7242,  -1561,   8210,   8211,  -1518,
+		 -1518,   8214,   8215,   9195,   5881,    351,   8219,   8220,
+		  6448,   6449,   6450,   6451,   3864,   2870,   2871,  12671,
+		 12627,      0,      0,      0,      0,      0,  12709,   6471,
+		 12637,  12638,   5627,   8230,  12595,  12642,   2545,   8234,
+		 12645,   8236,   5634,   3341,   2545,      0,      0,   5749,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,      0,      0,  11602,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,   1466,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,   5760,      0,      0,      0,      0,      0,  32767,
+		     0,  32767,      0,      0,  32767,      0,      0,  32767,
+		     0,   3507,   3508,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  1644,   1645,   1646,   1647,  -5764,   1649,   1650,   1651,
+		  1652,   1653,   1654,   1655,   1656,   1657,   1658,   1659,
+		  1660,  -4081,  -4081,  -4081,  -4081,  -4081,  -4081,  -4081,
+		 -4081,  -4081,  -4081,  -4081,  -4081,  -4081,  -4081,  -4081,
+		 -4081,   3537,   3538,   1679,   3582,   3583,   3584,  -3482,
+		 -3482,  -3482,  -3482,  -3482,  -3526,  -3526,  -3526,  -3526,
+		  3886,  -3526,  -3526,  -3526,  -3526,   3599,   3600,   3601,
+		  3602,   3603,   3604,   3605,   3606,   3607,   3608,   3609,
+		  3610,   3611,   3612,   3613,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		 -7275,      0,      0,  -7234,      0,      0,      0,      0,
+		     0,  -5368,   6378,   3628,   3629,   3630,   3631,   3632,
+		  3633,   3634,   3635,   3636,   3637,   3638,   3639,      0,
+		     0,    859,   6974,   6974,      0,      0,   3647,  -2405,
+		 -2405,   3650,  -2405,  -2405,  -2405,  -2405,   -112,  -2405,
+		 -3201,   3658,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,   5280,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  4637,   4638,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   4014,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    802,  32767,  32767,
+		 32767,  32767,    803,  -1055,    805,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   4639,  32767,
+		 32767,  32767,    806,  -2445,      0,  -2443,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    810,  32767,  32767,
+		 32767,  32767,    811,    812,    813,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -6211,  -6211,  -6211,  -6211,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -6271,  -6271,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    935,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767, -10300,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,      0,  32767,  32767,   4640,   4641,  32767,
+		 32767,  32767,  32767,  32767,   4624,  32767,  32767,  32767,
+		 -4233,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1859,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    872,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -4568,  -1253,  32767,
+		 -3590,  32767,  32767,  32767,  -1820,  -1820,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    873,    874,    875,   3629,      0,      0,
+		     0,   5048,   5005,   5006,   5007,   5008,   5009,   5054,
+		  5055,   5056,      0,      0,      0,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4118,
+		 32767,  32767,  32767,  32767,  -4122,  -4122,  -4122,  -4122,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4193,
+		 32767,  -4194,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -4209,  32767,  32767,  -4211,  -4211,  -4211,
+		 -4211,  -4211,  -4211,  -4211,  32767,  32767,  -4213, -10683,
+		 -4213,  -1918,  -4213,  -6043,  32767,  32767,  -4215,  -6047,
+		 32767,  -4216, -10696,  -4216,  -4216,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4646,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    876,    877,      0,  32767,      0,  32767,      0,
+		 32767,      0,  32767,      0,  32767,  32767,  32767,      0,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1844,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  -2899,      0,  32767,
+		     0,  32767,      0,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,    836,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,      0,      0,      0,    879,
+		   880,    881,    882,    883,    884,    885,    886,      0,
+		     0,    887,      0,    920,      0,    922,    923,    924,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   5431,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,   3639,    889,    890,    891,    892,    893,
+		   894,    895,    896,    897,    898,    899,    900,  -2739,
+		   927,  -1881,   4234,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -459,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -458,
+		  -457,    904,  32767,    905,  32767,    906,  32767,    907,
+		 32767,    908,  32767,  32767,  32767,    909,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,    910,
+		     0,      0,      0,      0,      0,      0,    911,      0,
+		   912,   1626,   1626,    913,    914,   1626,    915,    916,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  -1837,  -1837,  -1837,
+		 -6487,  -1837,  -1837,      0,      0,      0,    917,     31,
+		   919,      0,    921,      0,      0,      0,    925,      0,
+		 32767,   4801,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  -6470,      0,   2295,
+		     0,  -1830,      0,  -6475,      0,  -1832,      0,      0,
+		 -6480,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   3665,      0,      0,
+		     0,      0,   2281,      0,      0,  -7412,   5769,   5770,
+		  5771,   5772,   5773,   5774,      0,      0,      0,      0,
+		 32767,      0,      0,  32767,  32767,      0,  32767,  32767,
+		     0,      0,  32767,  32767,      0,      0,      0,  -1842,
+		 32767,      0,      0,      0,  -1846,  -1846,  -2560,  -1846,
+		     0,  -2560,  -2559,      0,      0,  32767,      0,  32767,
+		     0,      0,      0,      0,      0,      0,   1388,      0,
+		  1387,   1387,   1387,      0,   1387,   1387,   1387,   1387,
+		  1387,   1387,   1387,   1387,   1387,   1387,   1387,   1387,
+		  1387,   1387,   1387,   1387,   1387,   1387,   1387,   1387,
+		  1387,      0,  -1870,      0,  -1871,      0,      0,      0,
+		     0,      0,      0,  -1877,      0,      0,  -1877,  -1877,
+		     0,      0,      0,   4944,      0,  -1875,   4947,   4948,
+		     0,   4950,   4951,   4952,   4953,   4954,   4955,   4956,
+		  4957,   4958,   4959,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		 32767,  32767,      0,      0,      0,      0,  32767,  32767,
+		 32767,      0,      0,    931,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4650,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   5375,
+		  5376,   5377,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  13180,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -4011,    933,  -4011,  32767,
+		   935,    936,  -4012,    938,    939,    940,    941,    942,
+		   943,    944,    945,    946,    947,  32767,   1075,   1076,
+		  1077,  -6334,   1079,   1080,    954,  32767,  32767,  32767,
+		 32767,    955,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -4659,  32767,  32767,  32767,  -4662,  -4662,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    959,    960,    961,  32767,    962,    963,    964,
+		   965,    966,    967,    968,    969,    970,    971,    972,
+		 32767,    973,    974,    975,    976,    977,    978,    979,
+		   980,    981,    982,    983,    984,    985,    986,    987,
+		   988,    989,    990,  32767,    991,    992,    993,    994,
+		   995,    996,    997,    998,    999,   1000,   1001,   1002,
+		  1003,   1004,   1005,   1006,   1007,   1008,   1009,   1010,
+		  1011,   1012,   1013,   1014,   1015,   1016,   1017,   -362,
+		  -362,  32767,  32767,  32767,  32767,   -410,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1019,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   164,   1021,  -3551,  -3551,   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,
+		  1052,   1053,   1054,   1055,   1056,   1057,   1058,   1059,
+		  1060,   1061,   1062,   1063,   1064,   1065,   1066,   1067,
+		  1068,   1069,   1070,   1071,   1072,   1073,   1074,   1075,
+		  1076,   1077,   1078,   1079,   1080,   1081,   1082,   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,  32767,
+		  1115,   1116,   1117,   1118,   1119,  32767,   1120,   1121,
+		  1122,   1123,   1124,   1125,   1126,   1127,   1128,   1129,
+		  1130,   1131,      0,   1133,   1134,   1135,   1136,   1137,
+		  1138,   1139,   1140,   1141,   1142,   1143,   1144,   1145,
+		  1146,   1147,   1148,   1149,   1150,   1151,   1152,   1153,
+		  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,   1187,   1188,   1189,   1190,   1191,   1192,   1193,
+		  1194,   1195,   1196,   1197,   1198,   1199,   1200,   1201,
+		  1202,   1203,   1204,   1205,   1206,   1207,   1208,   1209,
+		-18956, -15641,   1212,   1213,   1214,   1215,   1216,   1217,
+		  1218,   1219,   1220,   1221,   1222,   1223,   1224,   1225,
+		 -5682,  -5682,  -5682,   1229,   1230,   1231,   1232,   1233,
+		  1234,   1235,   1236,   1237,   1238,   1239,   5750,   5751,
+		  5752,   5753,   5754,   5755,   5756,   1247,   1248,   1249,
+		  1250,   1251,   1252,   3084,   3085,   3086,  16347,  13033,
+		 13034,   9720,   1260,   1261,   1262,   3097,   3098,   3099,
+		  3100,   3101,   1268,   1269,   1270,   1271,   1272,   1273,
+		  1274,   1275,  32767,  32767,  32767,  32767,   1276,   1277,
+		  1278,   1279,   1280,   1281,   1282,   1283,   1284,   1285,
+		  1286,   1287,   1288,   1289,   1290,   1291,   1292,   1293,
+		  1294,   1295,   1296,   1297,   1298,   1299,   1300,   1301,
+		  1302,   1303,   1304,   1305,   1306,   1307,   1308,   1309,
+		  1310,   1311,   1312,   1313,   1314,   1315,   1316,   1317,
+		  1318,   1319,   1320,   1321,   1322,   1323,   1324,   1325,
+		  1326,   1327,   1328,   1329,   1330,   1331,   1332,   1333,
+		  1334,   1335,   1336,   1337,   1338,   1339,   1340,   1341,
+		  1342,   3162,   4959,      0,   4962,   1347,   1348,   1349,
+		  1350,   1351,   1352,   1353,   1354,   1355,   1356,   1357,
+		  1358,   1359,   1360,   1361,   1362,   1363,   1364,   1365,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   7481,
+		  7482,   7483,   7484,   5053,   5009,   7487,   7488,   7489,
+		  7490,  20751,  17437,  17438,  14124,  14125,  10811,  10812,
+		  7498,   7499,   7500,   7501,   7502,  32767,  32767,   7548,
+		  7549,   7505,   7506,   7507,   7508,  32767,  32767,   7554,
+		  7555,   7511,   4857,   4857,   4857,   4857,   2427,   4857,
+		  4857,   7564,   4857,   7566,  13524,   7568,  13526,   7570,
+		  4259,   4260,   4261,  -5479,    524,   6481,   4263,   7578,
+		  4264,   2684,   1421,  -7842,  -4527,  -4527,  -1212,  -1212,
+		 -1212,  -1212,  -1212,   7545,   7546,      0,      0,  -1214,
+		 -1214,  -1214,  -1214,   7551,   7552,  32767,   1610,  -1216,
+		  1439,   1440,   1441,   1442,   3873,   1444,   1445,  32767,
+		  1446,  32767,  -7220,  32767,  -7221,      0,   2047,   2047,
+		  2047,  11788,   5786,   -170,   2049,  -1265,   2050,   3631,
+		 -1265,   2052,   2052,   2052,   2052,   2052,   2052,   2052,
+		  1455,   2052,   2052,  -1265,   2053,  -1265,   2054,  -1265,
+		 -1265,   2056,   7592,   7593,   7594,  32767,  32767,   7595,
+		  7596,   1482,   1483,   1484,  -1267,  -1267,  -1267,   1488,
+		  1489,   1490,   1491,   1492,   1493,   1494,   1495,   1496,
+		  1497,   1498,   1499,   1500,  -4746,  -4746,   1503,   1504,
+		  1505,   1506,   1507,   1508,   1509,   1510,   1511,   1512,
+		  1513,   1514,      0,  -3228,  -3228,   1518,   1519,   1520,
+		  1521,   1522,   1523,   1524,   1525,  -2364,  -2363,   1528,
+		  1529,  -2361,  -2360,   3578,      0,  -2357,  -2356,  -2355,
+		  5932,  -2824,  -2824,   5980,   5981,   5937,   -231,   -230,
+		  -229,  -2827,  -2827,   5985,   -225,   5941,   5942,  -1069,
+		  1534,   5899,   5946,   5947,   5948,   5949,   5950,  -1061,
+		 -1060,      0,  -2785,      0,   -355,   -355,   -310,   -310,
+		  -310,   9422,  -2791,  32767,  -1054,  -1053,  -1052,  -4786,
+		 -4786,  -4786,  -4786,  -4786,  -4786,  -4786,  -1044,   5969,
+		  5970,  -2833,   6938,   6939,  -2790,  -2790,   6942,      0,
+		 32767,   4607,   -923,   6945,  32767,   5173,   5174,   5175,
+		  5176,   2589,   1595,   1596,  11396,  11352,  32767,  32767,
+		  6126,   2812,   2813,   2814,   2815,   2816,  -5940,  -5940,
+		  1607,   1608,   2823,  32767,  32767,   1516,      0,  -8581,
+		     0,      0,    728,   1525,    163, -11068,      0,  -2262,
+		 -2306,  -2305,  32767,  32767,      0,      0,   1580,      0,
+		     0,      0,  -6443,   1685, -10176,  -4173,   1784,  -4173,
+		     0,  -4172,   5925,  -4171,  -4171,  -4171,      0,   -437,
+		     0,      0,      0,    161,   -435,      0,   2883,   -434,
+		     0,      0,      0,      0,   -436,      0,  -5972,      0,
+		     0,      0,      0,      0,      0,      0,      0,   2889,
+		  2890,   2891,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   6371,
+		     0,      0,      0,      0,      0,      0,      0,    117,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,      0,      0,   3991,   3991,
+		  3991,   3991,      0,   3990,   3990,   3990,  -1947,   1632,
+		  3990,   3990,   3990,  -4296,   4461,   4462,  -4341,  -4341,
+		 -4296,   1873,   1873,   1873,   4472,   4473,  -4338,   1873,
+		 -4292,  -4292,   2720,    118,  -4246,  -4292,  -4292,    117,
+		 -4293,  -4293,   2719,   2719,   1660,   4446,   1662,   2018,
+		  2019,   1975,   1976,   1977,  -7754,  -7754,  -8733,  -5418,
+		   113,      0,    112,  -2157,  -5891,  -5891,      0,  -5892,
+		  6455,  -5893,      0,      0,      0,  32767,  32767,  32767,
+		  5826,  32767,  32767,  32767,  32767,   6806,  32767,  -2039,
+		 32767,   5829,  32767,   5830,   5831,   5832,  32767,   5833,
+		  5834,  32767,   5835,  32767,  32767,  -3520,      0,   5837,
+		     0,   5838,      0,   4035,      0,   5840,  32767,  10251,
+		   154,   1671,  10253,   1673,   1674,    947,    151,   1514,
+		 12746,   1679,   3942,   3987,   3987,   3987,  13719,  13720,
+		 14700,    103,   5855,  13723,   5857,   8127,      0,  11862,
+		  5860,    -96,   5862,   1690,   5863,  -4233,   5864,   5865,
+		  5866,   5867,   5868,   5869,   5870,   5871,   5872,   5873,
+		 32767,   5874,   5875,   5876,   5877,   5878,   5879,   5880,
+		  5881,   5882,   5883,  13795,   5885,   5886,   5887,   5888,
+		 10489,   5890,   1703,   1704,  -4247,   1706,   1707,   5891,
+		  5892,   5893,   1711,   4098,   5895,   5896,   5897,   7650,
+		 32767,   5899,   6406,   7966,   5902,   5903,   5904,   5905,
+		  5906,   5907,   5908,   1800,   5910,   1801,   5912,   5913,
+		  5914,   5915,  32767,   1727,   1728,   1729,   1730,  32767,
+		  1731,   1732,   1733,  32767,   1734,   1735,   1736,   1737,
+		  1738,   1739,   1740,  32767,   1741,   1742,   1743,   1744,
+		  1745,   1746,  32767,  32767,  32767,  32767,   1747,   1748,
+		  1749,   1750,   1751,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1752,   1753,   1754,   1755,   1756,   1757,   1758,
+		  1759,   1760,   1761,   1762,   1763,   1764,   1765,   1766,
+		  1767,   1768,   1769,   1770,   1771,   1772,   1773,   1774,
+		  1775,   1776,   1777,   1778,   1779,   1780,   1781,   1782,
+		  1783,   1784,   1785,   1786,   1787,   1788,   1789,   1790,
+		  1791,   7729,   4151,   1794,   1795,   1796,  10083,   1327,
+		  1327,  10131,  10132,  10088,   3920,   3921,   3922,   1324,
+		  1324,  10136,   3926,  10092,  10093,   3082,   5685,  10050,
+		 10097,      0,   5689,  10100,   5691,   3089,    796,      0,
+		  1363,  12595,   3792,   3792,   3837,   3837,   3837,  13569,
+		 13570,  14550,  11236,   5706,  13574,   5708,   7978,  11713,
+		 11714,  11715,  11716,  11717,  11718,  11719,   7978,    966,
+		   966,   9770,      0,      0,   9730,   9731,      0,      0,
+		  -979,   2336,   7867,      0,      0,  32767,      0,      0,
+		     0,  32767,      0,      0,  32767,      0,  32767,  32767,
+		  9356,  32767,      0,  32767,      0,  32767,   1804,   2602,
+		     0,  -4364,  -4410,   5688,      0,  -4410,      0,   2603,
+		  4897,   5694,   4332,  -6899,   1905,   1906,   1862,   1863,
+		  1864,  -7867,  -7867,  -8846,  -5531,      0,  -7867,      0,
+		 -2269,  -6003,  -6003,      0,   5957,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  -7911,      0,
+		     0,      0,      0,  -4600,      0,      0,   4156,  32767,
+		 32767,      0,      0,      0,      0,      0,   1796,      0,
+		     0,      0,  -1752,      0,      0,   -506,  -2065,      0,
+		     0,      0,      0,      0,      0,      0,   4109,      0,
+		  4110,      0,      0,      0,      0,      0,   4111,  17372,
+		     0,  14058,  10744,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -4650,      0,      0,   4161,  32767,
+		 32767,   4117,  32767,   4118,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -7946,  32767,  -4632,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4642,
+		 -4642,   4123,   4124,  -4687,      0,      0,  -4644,  -4644,
+		     0,      0,  -4646,  -4646,  32767,  32767,  32767,  32767,
+		 32767,  32767,   4084,   4085,  32767,  32767,   1609,   4087,
+		 32767,  32767,   4088,  17349,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  10092,   4136,
+		 10094,   4138,  10096,      0,  10097,  10098,  10099,  10100,
+		 10101,      0,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,  32767,      0,  10138,  10139,
+		     0,      0,      0,  10145,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -1425,   8316,   2314,  -3642,  32767,      0,
+		 32767,  32767,  32767,  32767,  -1426,  -1426,  -1426,  -1426,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,     52,     52,     52,     52,     52,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1849,   1850,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   100,    101,    102,    103,    104,    105,    106,    107,
+		   108,  -5633,  -5633,  -5633,  -5633,  -5633,  -5633,  -5633,
+		 -5633,  -5633,  -5633,  -5633,  -5633,  -5633,  -5633,  -5633,
+		 -5633,   1985,   1986,    127,   2030,   2031,   2032,  -5034,
+		 32767,  32767,  32767,  32767,  32767,      0,  32767,  32767,
+		 32767,   5916,   5917,   5918,   5919,   5920,   5921,   5922,
+		  5923,   5924,   8824,   5926,  32767,  32767,      0,  32767,
+		     0,   5927,   5928,   5929,   5930,   5931,   5932,   5933,
+		  5934,   5935,   5936,   5937,   5938,   5939,   5940,   5105,
+		  5942,   5943,   5944,   5945,   5946,   5947,   5948,   5949,
+		  5950,   5951,   5952,   5953,   5954,   5955,   5956,   5957,
+		 32767,   5958,   5959,   5960,   5082,   5082,   5082,   5082,
+		  5082,   5082,   5082,   5082,   5969,   5970,   5084,   5972,
+		  5053,   5974,   5053,   5053,   5053,   5978,   5979,   5980,
+		  5981,   5982,   5983,   5984,   5985,   5986,   5987,   5988,
+		  5989,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2552,  32767,  32767,  32767,
+		 32767,  32767,  32767,   5990,   5991,   5992,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   5993,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   6936,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1851,   1852,   1853,   1854,
+		  1855,   1856,   1857,   1858,   1859,   1860,   1861,   1862,
+		  1863,   1864,   1200,   2121,   1200,   1868,   1869,   1870,
+		  1871,   1872,   1873,   1874,   1875,   1876,   1877,   1878,
+		  1879,   1880,   1188,   1188,   1188,   1188,   1188,   1188,
+		  1188,   1188,   1188,   1188,   1188,   1188,   1188,   1188,
+		  1188,   1188,   1188,   1188,   1188,   1188,  -5282,   1188,
+		  3483,   1188,   -642,   1188,  -5287,   1188,   -644,   1188,
+		  1188,  -5292,   1188,   1188,   1188,   1188,   1188,   1188,
+		  1188,   1188,   1188,   1188,   1188,   1188,   1925,   1926,
+		 -6187,  -6231,   1184,   3465,   1184,   1184,  -6228,   6953,
+		  6954,   6955,   6956,      0,   1939,   1940,   1941,   1942,
+		  1943,   1944,   1178,   1178,   1947,   1948,   1949,   1950,
+		  1951,   1952,   1953,   1954,   1955,   1956,   1957,   1958,
+		  1959,   1960,   1961,   1962,   1963,   1964,   1965,   1966,
+		  1967,   1968,   1969,   1970,   1971,   1972,   1973,   1974,
+		  1975,   1976,   1977,   1978,   1979,   1980,   1981,   1982,
+		  1983,   1984,   1985,   1986,   1987,   1988,   1989,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    709,    666,    667,    668,  32767,    669,
+		   714,    715,    716,    717,  -6694,    719,    720,    721,
+		 32767,    722,    723,    724,  32767,    725,    726,    727,
+		   728,  -5013,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   6052,      0,      0,   6055,
+		     0,      0,      0,      0,   2293,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1244,   1245,   1246,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4660,
+		 -4660,  -4660,  -4660,   4097,   4098,  -4705,  -4705,  -4660,
+		 -4660,  -4660,  -4660,   4105,   4106,  -4705,  32767,  -4661,
+		 -4661,  -4661,  -4617,  -4617,  -4663,  -4663,  -4663,  -4663,
+		 -4663,  -4663,  -4663,   4072,   4073,   4074,   4075,   1644,
+		  1600,   4078,   4079,   4080,   4081,  17342,  14028,  14029,
+		 10715,  10716,   7402,   7403,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		 32767,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   1380,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    856,      0,   4573,
+		  4574,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  5204,   5161,   5162,   5163,   5164,   5165,   5210,   5211,
+		  5212,   5213,  -2198,   5215,   5216,   5217,   5218,   5219,
+		  5220,   5221,   5222,   5223,   5224,   5225,   5226,   -515,
+		  -515,   -515,   -515,   -515,   -515,   -515,   -515,   -515,
+		  -515,   -515,   -515,   -515,   -515,   -515,   -515,   7103,
+		  7104,   5245,   5246,   5247,   5248,   5249,  -1014,   5251,
+		  5252,   5253,   5254,   5255,   5256,   5257,   5258,   5259,
+		  5260,   8663,   8664,    -92,    -92,   8712,   8713,   8669,
+		  8670,   8671,   8672,    -92,    -92,   8720,   8721,   8677,
+		  8678,   8679,   8636,   8637,   8684,   8685,   8686,   8687,
+		  8688,   8689,   8690,    -44,    -44,    -44,    -44,   2388,
+		  2433,    -44,    -44,    -44,    -44, -13304,  -9989,  -9989,
+		 -6674,  -6674,  -3359,  -3359,    -44,    -44,    -44,    -44,
+		   -44,   8713,   8714,    -89,    -89,    -44,    -44,    -44,
+		   -44,   8721,   8722,    -89,    -89,    -44,    -44,    -44,
+		     0,      0,    -46,    -46,    -46,    -46,    -46,    -46,
+		   -46,   8689,   8690,   8691,   8692,   6261,   6217,   8695,
+		  8696,   8697,   8698,  21959,  18645,  18646,  15332,  15333,
+		 12019,  12020,   8706,   8707,   8708,   8709,   8710,    -46,
+		   -46,   8758,   8759,   8715,   8716,   8717,   8718,    -46,
+		   -46,   8766,   8767,   8723,   8724,   8725,   8726,   8727,
+		  8728,   8729,   8730,   8731,   8732,   8733,   8734,      0,
+		     0,      0,      0,   2432,   2477,      0,      0,      0,
+		     0, -13260,  -9945,  -9945,  -6630,  -6630,  -3315,  -3315,
+		     0,      0,      0,      0,      0,   8757,   8758,    -45,
+		   -45,      0,      0,      0,      0,   8765,   8766,    -45,
+		   -45,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   8735,   8736,   8737,
+		  8738,   6307,   6263,   8741,   8742,   8743,   8744,  22005,
+		 18691,  18692,  15378,  15379,  12065,  12066,   8752,   8753,
+		  8754,   8755,   8756,      0,      0,   8804,   8805,   8761,
+		  8762,   8763,   8764,      0,      0,   8812,   8813,   8769,
+		  6115,   6115,   6115,   6115,   3685,   6115,   6115,   8822,
+		  6115,   8824,  14782,   8826,  14784,   8828,   5517,   5518,
+		  5519,  -4221,   1782,   7739,   5521,   8836,   5522,   3942,
+		  8839,   5523,   5524,   5525,   5526,   5527,   5528,   5529,
+		  6127,   5531,   5532,   8850,   5533,   8852,   5534,   8854,
+		  8855,   5535,      0,      0,      0,   8860,   8861,      0,
+		     0,      0,  13252,   9939,   9939,   6626,   6626,   3313,
+		  3313,      0,      0,      0,  -9269,  -3312,      0,      0,
+		     0,   9741,  32767,  32767,      0,  32767,      0,  32767,
+		 32767,      0,      0,      0,      0,      0,      0,      0,
+		  -597,      0,      0,  32767,      0,  32767,      0,  32767,
+		 32767,      0,      0,  32767,  32767,  32767,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  -1387,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -1773,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  -4161,   1581,   1582,  32767,  32767,   1990,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1539,  32767,  32767,   6150,   6151,   6152,    411,
+		   411,    411,    411,    411,    411,    411,    411,    411,
+		   411,    411,    411,    411,    411,    411,    411,   8029,
+		  8030,   6171,   6172,    969,    969,   1013,   1013,   1013,
+		  1013,   1013,    969,    969,    969,    969,   8381,    969,
+		   969,    969,    969,    969,    969,    969,    969,    969,
+		   969,    969,    969,   6711,   6712,   6713,   6714,   6715,
+		  6716,   6717,   6718,   6719,   6720,   6721,   6722,   6723,
+		  6724,   6725,   6726,   -891,   -891,    969,    969,   6173,
+		  6174,   6131,   6132,   6133,   6134,   6135,   6180,   6181,
+		  6182,   6183,  -1228,   6185,   6186,   6187,   6188,   6189,
+		  6190,   6191,   6192,   6193,   6194,   6195,   6196,    455,
+		   455,    455,    455,    455,    455,    455,    455,    455,
+		   455,    455,    455,    455,    455,    455,    455,   8073,
+		  8074,   6215,   6216,   1013,   1013,   1057,   1057,   1057,
+		  1057,   1057,   1013,   1013,   1013,   1013,   8425,   1013,
+		  1013,   1013,   1013,   1013,   1013,   1013,   1013,   1013,
+		  1013,   1013,   1013,   6755,   6756,   6757,   6758,   6759,
+		  6760,   6761,   6762,   6763,   6764,   6765,   6766,   6767,
+		  6768,   6769,   6770,   -847,   -847,   1013,   1013,   6217,
+		  6218,   6175,   6176,   6177,   6178,   6179,   6224,   6225,
+		  6226,   6227,  -1184,   6229,   6230,   6231,   6232,   6233,
+		  6234,   6235,   6236,   6237,   6238,   6239,   6240,    499,
+		   499,    499,    499,    499,    499,    499,    499,    499,
+		   499,    499,    499,    499,    499,    499,    499,   8117,
+		  8118,   6259,   6260,   6261,   6262,   6263,      0,   6265,
+		  6266,   6267,   6268,   6269,   6270,   6271,   6272,   6273,
+		  6274,   9677,   9678,    922,    922,   9726,   9727,   9683,
+		  9684,   9685,   9686,    922,    922,   9734,   9735,   9691,
+		  9692,   9693,   9650,   9651,   9698,   9699,   9700,   9701,
+		  9702,   9703,   9704,    970,    970,    970,    970,   3402,
+		  3447,    970,    970,    970,    970, -12290,  -8975,  -8975,
+		 -5660,  -5660,  -2345,  -2345,  -2345,  -2345,  -2345,   6412,
+		  6413,  -2390,  -2390,  -2345,  -2345,  -2345,  -2345,   6420,
+		  6421,  -2390,  -2390,  -2345,  -2345,  -2345,  -2301,  -2301,
+		 -2347,  -2347,  -2347,  -2347,  -2347,  -2347,  -2347,   6388,
+		  6389,   6390,   6391,   3960,   3916,   6394,   6395,   6396,
+		  6397,  19658,  16344,  16345,  13031,  13032,   9718,   9719,
+		  6405,   6406,   6407,   6408,   6409,  -2347,  -2347,   6457,
+		  6458,   6414,   6415,   6416,   6417,  -2347,  -2347,   6465,
+		  6466,   6422,   6423,   6424,   6381,   6382,   6429,   6430,
+		  6431,   6432,   6433,   6434,   6435,  -2299,  -2299,  -2299,
+		 -2299,    133,    178,  -2299,  -2299,  -2299,  -2299, -15559,
+		-12244, -12244,  -8929,  -8929,  -5614,  -5614,  -2299,  -2299,
+		 -2299,  -2299,  -2299,   6458,   6459,  -2344,  -2344,  -2299,
+		 -2299,  -2299,  -2299,   6466,   6467,  -2344,  -2344,  -2299,
+		 -2299,  -2299,  -2299,  -2299,  -2299,  -2299,  -2299,  -2299,
+		 -2299,  -2299,  -2299,   6436,   6437,   6438,   6439,   4008,
+		  3964,   6442,   6443,   6444,   6445,  19706,  16392,  16393,
+		 13079,  13080,   9766,   9767,   6453,   6454,   6455,   6456,
+		  6457,  -2299,  -2299,   6505,   6506,   6462,   6463,   6464,
+		  6465,  -2299,  -2299,   6513,   6514,   6470,   6471,   6472,
+		  6473,   6474,   6475,   6476,   6477,   6478,   6479,   6480,
+		  6481,  -2253,  -2253,  -2253,  -2253,    179,    224,  -2253,
+		 -2253,  -2253,  -2253, -15513, -12198, -12198,  -8883,  -8883,
+		 -5568,  -5568,  -2253,  -2253,  -2253,  -2253,  -2253,   6504,
+		  6505,  -2298,  -2298,  -2253,  -2253,  -2253,  -2253,   6512,
+		  6513,  -2298,  -2298,  -2253,    402,    403,    404,    405,
+		  2836,    407,    408,  -2298,    410,  -2298,  -8255,  -2298,
+		 -8255,  -2298,   1014,   1014,   1014,  10755,   4753,  -1203,
+		  1016,  -2298,   1017,   2598,  -2298,   1019,   1019,   1019,
+		  1019,   1019,   1019,   1019,    422,   1019,   1019,  -2298,
+		  1020,  -2298,   1021,  -2298,  -2298,   1023,   6559,   6560,
+		  6561,  -2298,  -2298,   6564,   6565,   6566,  -6685,  -3371,
+		 -3370,    -56,    -55,   3259,   3260,   3261,  12531,   6575,
+		  3264,   3265,   3266,  -6474,   -471,   5486,   3268,   6583,
+		  3269,   1689,   6586,   3270,   3271,   3272,   3273,   3274,
+		  3275,   3276,   3874,   3278,   3279,   6597,   3280,   6599,
+		  3281,   6601,   6602,   3282,   3283,  32767,  32767,  32767,
+		  3284,   3285,   3286,   3287,   3288,   3289,   3290,   3291,
+		  3292,   3293,   3294,   3295,   3296,   3297,   3298,   3299,
+		  3300,   3301,   3302,   3303,   3304,   3305,   3306,   3307,
+		  3308,   3309,   3310,   3311,   3312,   3313,   3314,   3315,
+		  3316,   3317,   3318,   3319,   3320,   3321,   3322,   3323,
+		  3324,   3325,   3326,   3327,   3328,   3329,   3330,   3331,
+		  3332,   3333,   3334,   3335,   3336,   3337,   3338,   3339,
+		  3340,   3341,   3342,   3343,   3344,   3345,   3346,   3347,
+		  3348,   3349,   3350,   3351,  32767,  32767,   3352,   3353,
+		  3354,   3355,   3356,   3357,   3358,   3359,   3360,   3361,
+		  3362,   3363,   3364,   3365,   3366,   3367,   3368,   3369,
+		  3370,   3371,   3372,   3373,   3374,   3375,   3376,   3377,
+		  3378,   3379,   3380,   3381,   3382,   3383,   3384,   3385,
+		  3386,   3387,   3388,   3389,   3390,   3391,   3392,   3393,
+		  3394,   3395,   3396,   3397,   3398,   3399,   3400,   3401,
+		  3402,   3403,   3404,   3405,   3406,   3407,   4795,   3409,
+		  3410,   3411,   3412,   3413,   3414,   3415,   3416,   3417,
+		  3418,   3419,   3420,   3421,   3422,   3423,   3424,   3425,
+		  3426,   3427,   3428,   3429,   3430,   3431,   3432,   3433,
+		  3434,   3435,   3436,   3437,   3438,   3439,   3440,   3441,
+		  3442,   3443,   3444,   3445,   3446,   3447,   3448,   3449,
+		  3450,   3451,   3452,   3453,   3454,   3455,   3456,   3457,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   3458,
+		  3459,   3460,   3461,   3462,  -8139,   3464,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   3465,   3466,   2001,   3468,   3469,  32767,
+		 32767,  32767,  32767,  32767,   3470,   3471,   3472,   3473,
+		  3474,   3475,   3476,   3477,   3478,   3479,   3480,   3481,
+		  3482,   3483,   3484,   3485,   3486,   3487,   3488,   3489,
+		  3490,   3491,   3492,   3493,   3494,   3495,  32767,   3496,
+		  3497,   3498,   3499,   3500,  32767,   3501,  32767,   3502,
+		  3503,  32767,   3504,   3505,  32767,   3506,      0,      0,
+		  3509,   3510,   3511,   3512,   3513,   3514,   3515,   3516,
+		  3517,   3518,   3519,   3520,   3521,   3522,   3523,   3524,
+		  3525,   3526,   3527,   3528,   3529,   3530,   3531,   3532,
+		  3533,   3534,   3535,   3536,   3537,   3538,   3539,   3540,
+		  3541,   3542,   3543,   3544,   3545,   1902,   1902,   1902,
+		  1902,   9314,   1902,   1902,   1902,   1902,   1902,   1902,
+		  1902,   1902,   1902,   1902,   1902,   1902,   7644,   7645,
+		  7646,   7647,   7648,   7649,   7650,   7651,   7652,   7653,
+		  7654,   7655,   7656,   7657,   7658,   7659,     42,     42,
+		  1902,      0,      0,      0,   7067,   7068,   7069,   7070,
+		  7071,   7116,   7117,   7118,   7119,   -292,   7121,   7122,
+		  7123,   7124,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   3614,   3615,   3616,  10892,   3618,   3619,
+		 10854,   3621,   3622,   3623,   3624,   3625,   8994,  -2751,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   3640,   3641,   2783,  -3331,
+		 -3330,   3645,   3646,      0,   6053,   6054,      0,   6056,
+		  6057,   6058,   6059,   3767,   6061,   6858,      0,      0,
+		  3659,      0,      0,   1531,   1531,   1531,   1531,   1531,
+		  1531,   1531,   1531,   1531,   1531,   1531,   1531,   1531,
+		  1531,   1531,   9149,   9150,   7291,   7292,   7293,   7294,
+		  7295,   1032,   7297,   7298,   7299,   7300,   7301,   7302,
+		  7303,   7304,      0,   7307,  10710,  10711,   1955,   1955,
+		 10759,  10760,  10716,   4548,   4549,   4550,   1952,   1952,
+		 10764,  10765,  10721,  10722,   3711,   6314,  10679,  10726,
+		 10727,  10728,  10729,  10730,   3719,   3720,   1996,   1996,
+		  1996,   1996,   4428,   4473,   4473,   3728,   1994,   1994,
+		-11266,   3732,   3733,   3734,      0,      0,      0,      0,
+		     0,      0,      0,   3742,  10755,  10756,   1953,   1953,
+		  1998,   1998,   1998,  11730,  11731,  12711,   9397,   3867,
+		 11735,   3869,   6139,   9874,   9875,   9876,   9877,   9878,
+		  9879,   9880,   6139,   -873,   -873,   7931,  -1839,  -1839,
+		  7891,   7892,  -1839,  -1839,  -2818,    497,   6028,  -1839,
+		 -1839,    -66,    -66,    -66,    -66,   2522,   2523,  -6280,
+		 -6280,  -6235,    -66,    -66,    -66,   2533,   2534,  -6277,
+		   -66,  -6231,  -6231,    781,  -1821,  -6185,  -6231,   3867,
+		 -1821,  -6231,  -1821,    782,   3076,   3873,   2511,  -8720,
+		    84,     85,     41,     42,     43,  -9688,  -9688, -10667,
+		 -7352,  -1821,  -9688,  -1821,  -4090,  -7824,  -7824,  -7824,
+		 -7824,  -7824,  -7824,  -7824,  -4082,   2931,   2932,  -5871,
+		  3900,   3901,  -5828,  -5828,   3904,   3905,   4885,   1571,
+		 -3959,   3909,   3910,   2138,   2139,   2140,   2141,   -446,
+		  -446,   8358,   8359,   8315,   2147,   2148,   2149,   -449,
+		  -449,   8363,   2153,   8319,   8320,   1309,   3912,   8277,
+		  8324,  -1773,   3916,   8327,   3918,   1316,   -977,  -1773,
+		  -410,  10822,   2019,   2019,   2064,   2064,   2064,  11796,
+		 11797,  12777,   9463,   3933,  11801,   3935,   6205,   9940,
+		  9941,   9942,   9943,   9944,   9945,   9946,   6205,   -807,
+		  -807,   7997,  -1773,  -1773,   7957,   7958,  -1773,  -1773,
+		 -2752,    563,   6094,  -1773,  -1773,      0,      0,      0,
+		     0,   2588,   2589,  -6214,  -6214,  -6169,      0,      0,
+		     0,   2599,   2600,  -6211,      0,  -6165,  -6165,    847,
+		 -1755,  -6119,  -6165,   3933,  -1755,  -6165,  -1755,    848,
+		  3142,   3939,   2577,  -8654,    150,    151,    107,    108,
+		   109,  -9622,  -9622, -10601,  -7286,  -1755,  -9622,  -1755,
+		 -4024,  -7758,  -7758,  -7758,  -7758,  -7758,  -7758,  -7758,
+		 -4016,   2997,   2998,  -5805,   3966,   3967,  -5762,  -5762,
+		  3970,   3971,   4951,   1637,  -3893,   3975,   3976,   2204,
+		  2205,   2206,   2207,   -380,   -380,   8424,   8425,   8381,
+		  2213,   2214,   2215,   -383,   -383,   8429,   2219,   8385,
+		  8386,   1375,   3978,   8343,   8390,  -1707,   3982,   8393,
+		  3984,   1382,   -911,  -1707,   -344,  10888,   2085,   2085,
+		  2130,   2130,   2130,  11862,  11863,  12843,   9529,   3999,
+		 11867,   4001,   6271,  10006,  10007,   4005,  -1951,   4007,
+		  4008,   4009,   4010,   4011,   4012,   4013,   4014,   4015,
+		  4016,   4017,   4018,   4019,   4020,   4021,   4022,   4023,
+		  4024,   4025,   4026,   4027,   4028,   4029,   4030,   4031,
+		 11943,   4033,   4034,   4035,   4036,   8637,   4038,   4039,
+		  -116,  32767,  32767,   4041,   4042,   4043,   4044,   4045,
+		  2250,   4047,   4048,   4049,   5802,   4051,   4052,   4559,
+		  6119,   4055,   4056,   4057,   4058,   4059,   4060,   4061,
+		   -47,   4063,    -46,   4065,   4066,   4067,   4068,   4069,
+		   -41, -13301,   4072,  -9985,  -6670,   4075,   4076,   4077,
+		  4078,   4079,   4080,   4081,   4082,   4083,   4084,   4085,
+		  4086,   4087,   4088,   4089,   4090,   8741,   4092,   4093,
+		   -67,  32767,  32767,  32767,  32767,  32767,   2257,  32767,
+		  2258,   2259,   2260,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2261,  32767,   2262,  32767,
+		  2263,  32767,   2264,  32767,   2265,  32767,   2266,  32767,
+		  2267,   8737,   8738,    -26,    -26,   8786,   4100,   4101,
+		  8746,   8747,   4104,   4105,   8752,   8753,  32767,   2274,
+		 32767,   2275,  32767,  32767,  32767,  32767,  32767,  32767,
+		  2276,   2277,  32767,   2278,   2279,  32767,   2280,      0,
+		 32767,   2282,   9695,   4109,  -3486,  -3486,   4112,   4113,
+		  4114,   4115,   4116,   4117,  32767,  32767,  32767,  32767,
+		 32767,  32767,   4118,   4119,   4120,   4121,   4122,   4123,
+		  4124,   4125,   4126,   4127,   4128,   4129,   4130,   4131,
+		  4132,   4133,   4134,   4849,   4136,   4137,   4851,   4851,
+		  4140,   4852,   4142,   4143,   4144,   4145,   4146,   4147,
+		  4148,   4149,   4150,   4151,   2293,   4153,    907,  32767,
+		  2295,   4155,    909,   4157,    910,   4159,    911,   4161,
+		   912,   4163,    913,   4165,    914,  32767,    915,   4168,
+		   916,   4170,    917,   4172,   4173,    918,   4175,   4176,
+		  4177,   4178,   4179,   4180,   4181,   4182,   4183,   4184,
+		  4185,   2309,   4186,   4187,   4188,   4189,   2312,   2313,
+		 32767,   2314,   4190,   4191,  -2632,   2317,   4193,  32767,
+		  4194,   4195,   4196,   4197,   4198,   4199,   4200,   4201,
+		  4202,   4203,   4204,   4205,   4206,      0,      0,   4209,
+		  4210,   4211,   4212,   4213,   2318,   4215,   4216,   2319,
+		  2320,   2321,   2322,   4221,   4222,   4223,   2323,   2324,
+		  4226,   4227,   4228,   4229,   4230,   4231,   5551,   4233,
+		  4234,   4235,   4236,   4237,   4238,   4239,   4240,   4241,
+		  4242,   4243,   4244,   4245,   4246,   4247,   4248,   4249,
+		  4250,   4251,   4252,   4253,   4254,   4255,   4256,   4257,
+		  4258,   4259,   4260,   4261,   4262,   4263,   4264,   4265,
+		  4266,   4267,   4268,   4269,   4270,   4271,   4272,   4273,
+		  4274,   4275,  -3342,  -3342,  -3342,   4276,   4277,   2418,
+		  2419,  -2784,  -2784,  -2740,  -2740,  -2740,  -2740,  -2740,
+		 -2784,  -2784,  -2784,  -2784,   4628,  -2784,  -2784,  -2784,
+		 -2784,  -2784,  -2784,  -2784,  -2784,  -2784,  -2784,  -2784,
+		 -2784,   2958,   2959,   2960,   2961,   2962,   2963,   2964,
+		  2965,   2966,   2967,   2968,   2969,   2970,   2971,   2972,
+		  2973,  -4644,  -4644,  -2784,  -2784,   2420,   2421,   2378,
+		  2379,   2380,   2381,   2382,   2427,   2428,   2429,   2430,
+		 -4981,   2432,   2433,   2434,   2435,   2436,   2437,   2438,
+		  2439,   2440,   2441,   2442,   2443,  -3298,  -3298,  -3298,
+		 -3298,  -3298,  -3298,  -3298,  -3298,  -3298,  -3298,  -3298,
+		 -3298,  -3298,  -3298,  -3298,  -3298,   4320,   4321,   2462,
+		  4365,   4366,   4367,  -2699,  -2699,  -2699,  -2699,  -2699,
+		 -2743,  -2743,  -2743,  -2743,   4669,  -2743,  -2743,  -2743,
+		 -2743,   4382,   4383,   4384,   4385,   4386,   4387,   4388,
+		  4389,   4390,   4391,   4392,   4393,   4394,   4395,   4396,
+		  4397,   4398,   4399,   4400,   4401,   4402,   4403,   4404,
+		  4405,   4406,   4407,   4408,   4409,   4410,   4411,   4412,
+		  4413,   4414,   4415,   4416,   4417,   4418,   4419,   4420,
+		  4421,   4422,   4423,   4424,   4425,   4426,   4427,   4428,
+		  4429,    816,    816,    816,  -6459,    816,    816,  -6418,
+		   816,    816,    816,    816,    816,  -4552,   7194,   4444,
+		  4445,   4446,   4447,   4448,   4449,   4450,   4451,   4452,
+		  4453,   4454,   4455,    816,    816,   1675,   7790,   7790,
+		   816,    816,   4463,  -1589,  -1589,   4466,  -1589,  -1589,
+		 -1589,  -1589,    704,  -1589,  -2385,   4474,   4475,    817,
+		  4477,   4478,   2948,   2949,   2950,   2951,   2952,   2953,
+		  2954,   2955,   2956,   2957,   2958,   2959,   2960,   2961,
+		  2962,  -4655,  -4655,  -2795,  -2795,  -2795,  -2795,  -2795,
+		  3469,  -2795,  -2795,  -2795,  -2795,  -2795,  -2795,  -2795,
+		 -2795,   4510,  -2796,  -6198,  -6198,   2559,   2560,  -6243,
+		 -6243,  -6198,  -6198,  -6198,  -6198,   2567,   2568,  -6243,
+		 -6243,  -6198,  -6198,  -6198,  -6154,  -6154,  -6200,  -6200,
+		 -6200,  -6200,  -6200,  -6200,  -6200,   2535,   2536,   2537,
+		  2538,    107,     63,   2541,   2542,   2543,   2544,  15805,
+		 12491,  12492,  32767,   4540,   4541,   4542,   4543,   4544,
+		  4545,   4546,   2548,  -6208,  -6208,   2596,   2597,   2553,
+		  2554,   2555,   2556,  -6208,  -6208,   2604,   2605,   2561,
+		  2562,   2563,   2520,   2521,   2568,   2569,   2570,   2571,
+		  2572,   2573,   2574,  -6160,  -6160,  -6160,  -6160,  -3728,
+		 -3683,  -6160,  -6160,  -6160,  -6160, -19420, -16105, -16105,
+		-12790, -12790,  -9475,  -9475,  -6160,  -6160,  -6160,  -6160,
+		 -6160,  32767,   2597,  -6206,  -6206,  -6161,  -6161,  -6161,
+		 -6161,   2604,   2605,  -6206,  -6206,  -6161,  -6161,  -6161,
+		 -6161,  -6161,  -6161,  -6161,  -6161,  -6161,  -6161,  -6161,
+		 -6161,   2574,   2575,   2576,   2577,    146,    102,   2580,
+		  2581,   2582,   2583,  15844,  12530,  12531,   9217,   9218,
+		  5904,   5905,   2591,   2592,   2593,   2594,   2595,  -6161,
+		 -6161,   2643,   2644,   2600,   2601,   2602,   2603,  -6161,
+		 -6161,   2651,   2652,   2608,   2609,   2610,   2611,   2612,
+		  2613,   2614,   2615,   2616,   2617,   2618,   2619,  -6115,
+		 -6115,  -6115,  -6115,  -3683,  -3638,  -6115,  -6115,  -6115,
+		 -6115, -19375, -16060, -16060, -12745, -12745,  -9430,  -9430,
+		 -6115,  -6115,  -6115,  -6115,  -6115,   2642,   2643,  -6160,
+		 -6160,  -6115,  -6115,  -6115,  -6115,   2650,   2651,  -6160,
+		 -6160,  -6115,  -3460,  -3459,  -3458,  -3457,  -1026,  -3455,
+		 -3454,  -6160,  -3452,  -6160, -12117,  -6160, -12117,  -6160,
+		 -2848,  -2848,  -2848,   6893,    891,  -5065,  -2846,  -6160,
+		 -2845,  -1264,      0,   9264,   5950,   5951,   2637,   2638,
+		  2639,   2640,   2641,  -6115,  -6115,   2689,   2690,   2646,
+		  2647,   2648,   2649,  -6115,  -6115,   2697,   2698,   2654,
+		     0,      0,      0,      0,  -2430,      0,      0,   2707,
+		     0,   2709,   8667,   2711,   8669,   2713,   -598,   -597,
+		  -596, -10336,  -4333,   1624,   -594,   2721,   -593,  -2173,
+		  2724,   -592,   -591,   -590,   -589,   -588,   -587,   -586,
+		    12,   -584,   -583,   2735,   -582,   2737,   -581,   2739,
+		  2740,   -580,  -6115,  -6115,  -6115,   2745,   2746,  -6115,
+		 -6115,      0,      0,      0,   2752,   2753,   2754,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   6247,   6248,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 13209] + h[b % 13209];
+}
+
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo = {
+	UnicodeDecompMain,
+	DecompMain_hash_func,
+	6604
+};
+
 /* codepoints array  */
 static const uint32 UnicodeDecomp_codepoints[5092] =
 {
#21Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#20)
Re: speed up unicode normalization quick check

On Mon, Oct 12, 2020 at 05:46:16AM -0400, John Naylor wrote:

Hmm, I hadn't actually, but now that you mention it, that looks worth
optimizing that as well, since there are multiple callers that search that
table -- thanks for the reminder. The attached patch was easy to whip up,
being similar to the quick check (doesn't include the pg_hton32 fix). I'll
do some performance testing soon. Note that a 25kB increase in size could
be present in frontend binaries as well in this case. While looking at
decomposition, I noticed that recomposition does a linear search through
all 6600+ entries, although it seems only about 800 are valid for that.
That could be optimized as well now, since with hashing we have more
flexibility in the ordering and can put the recomp-valid entries in front.
I'm not yet sure if it's worth the additional complexity. I'll take a look
and start a new thread.

Starting a new thread for this topic sounds like a good idea to me,
with a separate performance analysis. Thanks!
--
Michael

#22Michael Paquier
michael@paquier.xyz
In reply to: Masahiko Sawada (#19)
Re: speed up unicode normalization quick check

On Mon, Oct 12, 2020 at 03:39:51PM +0900, Masahiko Sawada wrote:

Yes, this patch resolves the problem.

Okay, applied then.
--
Michael

#23Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Michael Paquier (#22)
Re: speed up unicode normalization quick check

On 2020-10-12 13:36, Michael Paquier wrote:

On Mon, Oct 12, 2020 at 03:39:51PM +0900, Masahiko Sawada wrote:

Yes, this patch resolves the problem.

Okay, applied then.

Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output of

git show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6f

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#24Michael Paquier
michael@paquier.xyz
In reply to: Peter Eisentraut (#23)
Re: speed up unicode normalization quick check

On Mon, Oct 19, 2020 at 08:15:56AM +0200, Peter Eisentraut wrote:

On 2020-10-12 13:36, Michael Paquier wrote:

On Mon, Oct 12, 2020 at 03:39:51PM +0900, Masahiko Sawada wrote:

Yes, this patch resolves the problem.

Okay, applied then.

Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output of

git show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6f

Hmm. Giving up on the left space padding would make the table harder
to read because the elements would not be aligned anymore across
multiple lines, and I'd rather keep 8 elements per lines as we do now.
This is generated by this part in PerfectHash.pm, where we apply a
at most 7 spaces of padding to all the members, except the first one
of a line that uses 6 spaces at most with two tabs:
for (my $i = 0; $i < $nhash; $i++)
{
$f .= sprintf "%s%6d,%s",
($i % 8 == 0 ? "\t\t" : " "),
$hashtab[$i],
($i % 8 == 7 ? "\n" : "");
}
Could we consider this stuff as a special case in .gitattributes
instead?
--
Michael

#25John Naylor
john.naylor@enterprisedb.com
In reply to: Peter Eisentraut (#23)
Re: speed up unicode normalization quick check

On Mon, Oct 19, 2020 at 2:16 AM Peter Eisentraut <
peter.eisentraut@2ndquadrant.com> wrote:

On 2020-10-12 13:36, Michael Paquier wrote:

On Mon, Oct 12, 2020 at 03:39:51PM +0900, Masahiko Sawada wrote:

Yes, this patch resolves the problem.

Okay, applied then.

Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output of

git show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6f

My git manual says:

"By default, trailing
whitespaces (including lines that consist solely of
whitespaces) and a space character that is immediately
followed by a tab character inside the initial indent of the
line are considered whitespace errors."

The above would mean we should have errors for every function whose
parameters are lined with the opening paren, so I don't see why it would
fire in this case. Is the manual backwards?

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#26Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Naylor (#25)
Re: speed up unicode normalization quick check

John Naylor <john.naylor@enterprisedb.com> writes:

On Mon, Oct 19, 2020 at 2:16 AM Peter Eisentraut <
peter.eisentraut@2ndquadrant.com> wrote:

Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output of
git show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6f

My git manual says:
...
The above would mean we should have errors for every function whose
parameters are lined with the opening paren, so I don't see why it would
fire in this case. Is the manual backwards?

Probably not, but our whitespace rules are not git's default.
See .gitattributes at the top level of a git checkout.

regards, tom lane

#27John Naylor
john.naylor@enterprisedb.com
In reply to: Tom Lane (#26)
1 attachment(s)
Re: speed up unicode normalization quick check

On Mon, Oct 19, 2020 at 10:38 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

John Naylor <john.naylor@enterprisedb.com> writes:

On Mon, Oct 19, 2020 at 2:16 AM Peter Eisentraut <
peter.eisentraut@2ndquadrant.com> wrote:

Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output of
git show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6f

My git manual says:
...
The above would mean we should have errors for every function whose
parameters are lined with the opening paren, so I don't see why it would
fire in this case. Is the manual backwards?

Probably not, but our whitespace rules are not git's default.
See .gitattributes at the top level of a git checkout

I see, I should have looked for that when Michael mentioned it. We could
left-justify instead, as in the attached. If it were up to me, though, I'd
just format it like pgindent expects, even if not nice looking. It's just a
bunch of numbers.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Attachments:

fix-whitespace-hash-func.patchapplication/octet-stream; name=fix-whitespace-hash-func.patchDownload
diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index d6841589a3..fbfac79163 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -121,13 +121,12 @@ sub generate_hash_function
 	{
 		$f .= sprintf "%s(const void *key, size_t keylen)\n{\n", $funcname;
 	}
-	$f .= sprintf "\tstatic const %s h[%d] = {\n", $elemtype, $nhash;
+	$f .= sprintf "\tstatic const %s h[%d] = {\n\t\t", $elemtype, $nhash;
 	for (my $i = 0; $i < $nhash; $i++)
 	{
-		$f .= sprintf "%s%6d,%s",
-		  ($i % 8 == 0 ? "\t\t" : " "),
+		$f .= sprintf "%d,%s",
 		  $hashtab[$i],
-		  ($i % 8 == 7 ? "\n" : "");
+		  ($i == $nhash-1 ? "" : $i % 8 == 7 ? "\n\t\t" : ' ' x (6 - length($hashtab[$i])));
 	}
 	$f .= sprintf "\n" if ($nhash % 8 != 0);
 	$f .= sprintf "\t};\n\n";
#28Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#27)
1 attachment(s)
Re: speed up unicode normalization quick check

On Mon, Oct 19, 2020 at 12:12:00PM -0400, John Naylor wrote:

I see, I should have looked for that when Michael mentioned it. We could
left-justify instead, as in the attached. If it were up to me, though, I'd
just format it like pgindent expects, even if not nice looking. It's just a
bunch of numbers.

The aligned numbers have the advantage to make the checks of the code
generated easier, for the contents and the format produced. So using
a right padding as you are suggesting here rather than a new exception
in .gitattributes sounds fine to me. I simplified things a bit as the
attached, getting rid of the last comma while on it. Does that look
fine to you?
--
Michael

Attachments:

fix-whitespace-hash-func-v2.patchtext/x-diff; charset=us-asciiDownload
diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index d6841589a3..964f79b71a 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -121,13 +121,16 @@ sub generate_hash_function
 	{
 		$f .= sprintf "%s(const void *key, size_t keylen)\n{\n", $funcname;
 	}
-	$f .= sprintf "\tstatic const %s h[%d] = {\n", $elemtype, $nhash;
+	$f .= sprintf "\tstatic const %s h[%d] = {\n\t\t", $elemtype, $nhash;
 	for (my $i = 0; $i < $nhash; $i++)
 	{
-		$f .= sprintf "%s%6d,%s",
-		  ($i % 8 == 0 ? "\t\t" : " "),
-		  $hashtab[$i],
-		  ($i % 8 == 7 ? "\n" : "");
+		# Hash element.
+		$f .= sprintf "%d", $hashtab[$i];
+		next if ($i == $nhash - 1);
+
+		# Optional indentation and newline, with eight items per line.
+		$f .= sprintf ",%s",
+		  ($i % 8 == 7 ? "\n\t\t" : ' ' x (6 - length($hashtab[$i])));
 	}
 	$f .= sprintf "\n" if ($nhash % 8 != 0);
 	$f .= sprintf "\t};\n\n";
#29John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#28)
Re: speed up unicode normalization quick check

On Mon, Oct 19, 2020 at 9:49 PM Michael Paquier <michael@paquier.xyz> wrote:

The aligned numbers have the advantage to make the checks of the code
generated easier, for the contents and the format produced. So using
a right padding as you are suggesting here rather than a new exception
in .gitattributes sounds fine to me. I simplified things a bit as the
attached, getting rid of the last comma while on it. Does that look
fine to you?

This is cleaner, so I'm good with this.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#30Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#29)
Re: speed up unicode normalization quick check

On Tue, Oct 20, 2020 at 05:33:43AM -0400, John Naylor wrote:

This is cleaner, so I'm good with this.

Thanks. Applied this way, then.
--
Michael