Revision: 1019
http://www.exim.org/viewvc/pcre2?view=rev&revision=1019
Author: ph10
Date: 2018-10-02 16:25:58 +0100 (Tue, 02 Oct 2018)
Log Message:
-----------
Basic "script run" implementation. Not yet complete, and not yet documented.
Modified Paths:
--------------
code/trunk/ChangeLog
code/trunk/Makefile.am
code/trunk/NON-AUTOTOOLS-BUILD
code/trunk/README
code/trunk/doc/html/NON-AUTOTOOLS-BUILD.txt
code/trunk/doc/html/README.txt
code/trunk/maint/GenerateUtt.py
code/trunk/maint/MultiStage2.py
code/trunk/maint/ucptest.c
code/trunk/perltest.sh
code/trunk/src/pcre2.h.in
code/trunk/src/pcre2_auto_possess.c
code/trunk/src/pcre2_compile.c
code/trunk/src/pcre2_dfa_match.c
code/trunk/src/pcre2_error.c
code/trunk/src/pcre2_internal.h
code/trunk/src/pcre2_match.c
code/trunk/src/pcre2_printint.c
code/trunk/src/pcre2_study.c
code/trunk/src/pcre2_tables.c
code/trunk/src/pcre2_ucd.c
code/trunk/src/pcre2_ucp.h
code/trunk/testdata/testinput12
code/trunk/testdata/testinput4
code/trunk/testdata/testinput5
code/trunk/testdata/testoutput12-16
code/trunk/testdata/testoutput12-32
code/trunk/testdata/testoutput4
code/trunk/testdata/testoutput5
Added Paths:
-----------
code/trunk/src/pcre2_script_run.c
Modified: code/trunk/ChangeLog
===================================================================
--- code/trunk/ChangeLog 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/ChangeLog 2018-10-02 15:25:58 UTC (rev 1019)
@@ -30,7 +30,11 @@
hexadecimal digit" bit was removed. The default tables in
src/pcre2_chartables.c.dist are updated.
+8. Implement the new Perl "script run" features (*script_run:...) and
+(*atomic_script_run:...) aka (*sr:...) and (*asr:...). At present, this is
+incomplete and not yet documented.
+
Version 10.32 10-September-2018
-------------------------------
Modified: code/trunk/Makefile.am
===================================================================
--- code/trunk/Makefile.am 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/Makefile.am 2018-10-02 15:25:58 UTC (rev 1019)
@@ -364,6 +364,7 @@
src/pcre2_newline.c \
src/pcre2_ord2utf.c \
src/pcre2_pattern_info.c \
+ src/pcre2_script_run.c \
src/pcre2_serialize.c \
src/pcre2_string_utils.c \
src/pcre2_study.c \
Modified: code/trunk/NON-AUTOTOOLS-BUILD
===================================================================
--- code/trunk/NON-AUTOTOOLS-BUILD 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/NON-AUTOTOOLS-BUILD 2018-10-02 15:25:58 UTC (rev 1019)
@@ -104,6 +104,7 @@
pcre2_newline.c
pcre2_ord2utf.c
pcre2_pattern_info.c
+ pcre2_script_run.c
pcre2_serialize.c
pcre2_string_utils.c
pcre2_study.c
Modified: code/trunk/README
===================================================================
--- code/trunk/README 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/README 2018-10-02 15:25:58 UTC (rev 1019)
@@ -788,6 +788,7 @@
src/pcre2_newline.c )
src/pcre2_ord2utf.c )
src/pcre2_pattern_info.c )
+ src/pcre2_script_run.c )
src/pcre2_serialize.c )
src/pcre2_string_utils.c )
src/pcre2_study.c )
Modified: code/trunk/doc/html/NON-AUTOTOOLS-BUILD.txt
===================================================================
--- code/trunk/doc/html/NON-AUTOTOOLS-BUILD.txt 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/doc/html/NON-AUTOTOOLS-BUILD.txt 2018-10-02 15:25:58 UTC (rev 1019)
@@ -104,6 +104,7 @@
pcre2_newline.c
pcre2_ord2utf.c
pcre2_pattern_info.c
+ pcre2_script_run.c
pcre2_serialize.c
pcre2_string_utils.c
pcre2_study.c
Modified: code/trunk/doc/html/README.txt
===================================================================
--- code/trunk/doc/html/README.txt 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/doc/html/README.txt 2018-10-02 15:25:58 UTC (rev 1019)
@@ -788,6 +788,7 @@
src/pcre2_newline.c )
src/pcre2_ord2utf.c )
src/pcre2_pattern_info.c )
+ src/pcre2_script_run.c )
src/pcre2_serialize.c )
src/pcre2_string_utils.c )
src/pcre2_study.c )
Modified: code/trunk/maint/GenerateUtt.py
===================================================================
--- code/trunk/maint/GenerateUtt.py 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/maint/GenerateUtt.py 2018-10-02 15:25:58 UTC (rev 1019)
@@ -25,8 +25,9 @@
# Added script names for Unicode 8.0.0, 19-June-2015.
# Added script names for Unicode 10.0.0, 02-July-2017.
# Added script names for Unicode 11.0.0, 03-July-2018.
+# Added 'Unknown' script, 01-October-2018.
-script_names = ['Arabic', 'Armenian', 'Bengali', 'Bopomofo', 'Braille', 'Buginese', 'Buhid', 'Canadian_Aboriginal', \
+script_names = ['Unknown', 'Arabic', 'Armenian', 'Bengali', 'Bopomofo', 'Braille', 'Buginese', 'Buhid', 'Canadian_Aboriginal', \
'Cherokee', 'Common', 'Coptic', 'Cypriot', 'Cyrillic', 'Deseret', 'Devanagari', 'Ethiopic', 'Georgian', \
'Glagolitic', 'Gothic', 'Greek', 'Gujarati', 'Gurmukhi', 'Han', 'Hangul', 'Hanunoo', 'Hebrew', 'Hiragana', \
'Inherited', 'Kannada', 'Katakana', 'Kharoshthi', 'Khmer', 'Lao', 'Latin', 'Limbu', 'Linear_B', 'Malayalam', \
Modified: code/trunk/maint/MultiStage2.py
===================================================================
--- code/trunk/maint/MultiStage2.py 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/maint/MultiStage2.py 2018-10-02 15:25:58 UTC (rev 1019)
@@ -143,6 +143,7 @@
# 03-July-2018: Updated for Unicode 11.0.0
# 07-July-2018: Added code to scan emoji-data.txt for the Extended
# Pictographic property.
+# 01-October-2018: Added the 'Unknown' script name
##############################################################################
@@ -300,7 +301,7 @@
slice_type, slice_size = get_type_size(record_slice)
size = (size + slice_size - 1) & -slice_size
- structure += '} ucd_record;\n*/\n\n'
+ structure += '} ucd_record;\n*/\n'
return size, structure
def test_record_size():
@@ -329,7 +330,7 @@
print((' {' + '%6d, ' * len(record[0]) + '}, /* %3d */') % (record[0] + (i,)))
print('};\n')
-script_names = ['Arabic', 'Armenian', 'Bengali', 'Bopomofo', 'Braille', 'Buginese', 'Buhid', 'Canadian_Aboriginal', \
+script_names = ['Unknown', 'Arabic', 'Armenian', 'Bengali', 'Bopomofo', 'Braille', 'Buginese', 'Buhid', 'Canadian_Aboriginal', \
'Cherokee', 'Common', 'Coptic', 'Cypriot', 'Cyrillic', 'Deseret', 'Devanagari', 'Ethiopic', 'Georgian', \
'Glagolitic', 'Gothic', 'Greek', 'Gujarati', 'Gurmukhi', 'Han', 'Hangul', 'Hanunoo', 'Hebrew', 'Hiragana', \
'Inherited', 'Kannada', 'Katakana', 'Kharoshthi', 'Khmer', 'Lao', 'Latin', 'Limbu', 'Linear_B', 'Malayalam', \
@@ -380,7 +381,7 @@
test_record_size()
unicode_version = ""
-script = read_table('Unicode.tables/Scripts.txt', make_get_names(script_names), script_names.index('Common'))
+script = read_table('Unicode.tables/Scripts.txt', make_get_names(script_names), script_names.index('Unknown'))
category = read_table('Unicode.tables/DerivedGeneralCategory.txt', make_get_names(category_names), category_names.index('Cn'))
break_props = read_table('Unicode.tables/GraphemeBreakProperty.txt', make_get_names(break_property_names), break_property_names.index('Other'))
other_case = read_table('Unicode.tables/CaseFolding.txt', get_other_case, 0)
@@ -553,11 +554,11 @@
print()
print("#if PCRE2_CODE_UNIT_WIDTH == 32")
print("const ucd_record PRIV(dummy_ucd_record)[] = {{")
-print(" ucp_Common, /* script */")
-print(" ucp_Cn, /* type unassigned */")
-print(" ucp_gbOther, /* grapheme break property */")
-print(" 0, /* case set */")
-print(" 0, /* other case */")
+print(" ucp_Unknown, /* script */")
+print(" ucp_Cn, /* type unassigned */")
+print(" ucp_gbOther, /* grapheme break property */")
+print(" 0, /* case set */")
+print(" 0, /* other case */")
print(" }};")
print("#endif")
print()
@@ -565,6 +566,9 @@
# --- Added by PH: output the table of caseless character sets ---
+print("/* This table contains lists of characters that are caseless sets of")
+print("more than one character. Each list is terminated by NOTACHAR. */\n")
+
print("const uint32_t PRIV(ucd_caseless_sets)[] = {")
print(" NOTACHAR,")
for s in sets:
@@ -577,10 +581,53 @@
# ------
-print("/* When #included in pcre2test, we don't need this large table. */")
+print("/* When #included in pcre2test, we don't need the table of digit")
+print("sets, nor the the large main UCD tables. */")
print()
print("#ifndef PCRE2_PCRE2TEST")
print()
+
+# --- Added by PH: read Scripts.txt again for the sets of 10 digits. ---
+
+digitsets = []
+file = open('Unicode.tables/Scripts.txt', 'r', encoding='utf-8')
+
+for line in file:
+ m = re.match(r'([0-9a-fA-F]+)\.\.([0-9a-fA-F]+)\s+;\s+\S+\s+#\s+Nd\s+', line)
+ if m is None:
+ continue
+ first = int(m.group(1),16)
+ last = int(m.group(2),16)
+ if ((last - first + 1) % 10) != 0:
+ print("ERROR: %04x..%04x does not contain a multiple of 10 characters" % (first, last),
+ file=sys.stderr)
+ while first < last:
+ digitsets.append(first + 9)
+ first += 10
+file.close()
+digitsets.sort()
+
+print("/* This table lists the code points for the '9' characters in each")
+print("set of decimal digits. It is used to ensure that all the digits in")
+print("a script run come from the same set. */")
+print()
+print("const uint32_t PRIV(ucd_digit_sets)[] = {")
+
+print(" %d, /* Number of subsequent values */" % len(digitsets), end='')
+count = 8
+for d in digitsets:
+ if count == 8:
+ print("\n ", end='')
+ count = 0
+ print(" 0x%05x," % d, end='')
+ count += 1
+print("\n};")
+print()
+
+# Output the main UCD tables.
+
+print("/* These are the main two-stage UCD tables. */\n")
+
print_records(records, record_size)
print_table(min_stage1, 'PRIV(ucd_stage1)')
print_table(min_stage2, 'PRIV(ucd_stage2)', min_block_size)
@@ -591,6 +638,10 @@
print()
print("#endif /* PCRE2_PCRE2TEST */")
+
+# This code was part of the original contribution, but is commented out as it
+# was never used. A two-stage table has sufficed.
+
"""
# Three-stage tables:
Modified: code/trunk/maint/ucptest.c
===================================================================
--- code/trunk/maint/ucptest.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/maint/ucptest.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -134,6 +134,7 @@
switch(script)
{
+ case ucp_Unknown: scriptname = US"Unknown"; break;
case ucp_Arabic: scriptname = US"Arabic"; break;
case ucp_Armenian: scriptname = US"Armenian"; break;
case ucp_Balinese: scriptname = US"Balinese"; break;
Modified: code/trunk/perltest.sh
===================================================================
--- code/trunk/perltest.sh 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/perltest.sh 2018-10-02 15:25:58 UTC (rev 1019)
@@ -1,8 +1,10 @@
#! /bin/sh
# Script for testing regular expressions with perl to check that PCRE2 handles
-# them the same. If the first argument to this script is "-w", Perl is also
-# called with "-w", which turns on its warning mode.
+# them the same. For testing with different versions of Perl, if the first
+# argument is -perl then the second is taken as the Perl command to use, and
+# both are then removed. If the next argument is "-w", Perl is called with
+# "-w", which turns on its warning mode.
#
# The Perl code has to have "use utf8" and "require Encode" at the start when
# running UTF-8 tests, but *not* for non-utf8 tests. (The "require" would
@@ -10,8 +12,8 @@
# the script will always run for these tests.)
#
# The desired effect is achieved by making this a shell script that passes the
-# Perl script to Perl through a pipe. If the first argument (possibly after
-# removing "-w") is "-utf8", a suitable prefix is set up.
+# Perl script to Perl through a pipe. If the next argument is "-utf8", a
+# suitable prefix is set up.
#
# The remaining arguments, if any, are passed to Perl. They are an input file
# and an output file. If there is one argument, the output is written to
@@ -23,6 +25,12 @@
perlarg=''
prefix=''
+if [ $# -gt 1 -a "$1" = "-perl" ] ; then
+ shift
+ perl=$1
+ shift
+fi
+
if [ $# -gt 0 -a "$1" = "-w" ] ; then
perlarg="-w"
shift
@@ -78,6 +86,7 @@
# The alpha assertions currently give warnings even when -w is not specified.
no warnings "experimental::alpha_assertions";
+no warnings "experimental::script_run";
# Function for turning a string into a string of printing chars.
Modified: code/trunk/src/pcre2.h.in
===================================================================
--- code/trunk/src/pcre2.h.in 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2.h.in 2018-10-02 15:25:58 UTC (rev 1019)
@@ -321,6 +321,7 @@
#define PCRE2_ERROR_SUPPORTED_ONLY_IN_UNICODE 193
#define PCRE2_ERROR_INVALID_HYPHEN_IN_OPTIONS 194
#define PCRE2_ERROR_ALPHA_ASSERTION_UNKNOWN 195
+#define PCRE2_ERROR_SCRIPT_RUN_NOT_AVAILABLE 196
/* "Expected" matching error codes: no match and partial match. */
Modified: code/trunk/src/pcre2_auto_possess.c
===================================================================
--- code/trunk/src/pcre2_auto_possess.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_auto_possess.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -604,6 +604,15 @@
case OP_SCBRAPOS:
if (cb->had_recurse) return FALSE;
break;
+
+ /* A script run might have to backtrack if the iterated item can match
+ characters from more than one script. So give up unless repeating an
+ explicit character. */
+
+ case OP_SCRIPT_RUN:
+ if (base_list[0] != OP_CHAR && base_list[0] != OP_CHARI)
+ return FALSE;
+ break;
/* Atomic sub-patterns and assertions can always auto-possessify their
last iterator. However, if the group was entered as a result of checking
@@ -614,7 +623,6 @@
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
case OP_ONCE:
-
return !entered_a_group;
}
Modified: code/trunk/src/pcre2_compile.c
===================================================================
--- code/trunk/src/pcre2_compile.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_compile.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -240,49 +240,57 @@
#define META_RANGE_LITERAL 0x801f0000u /* range defined literally */
#define META_RECURSE 0x80200000u /* Recursion */
#define META_RECURSE_BYNAME 0x80210000u /* (?&name) */
+#define META_SCRIPT_RUN 0x80220000u /* (*script_run:...) */
/* These must be kept together to make it easy to check that an assertion
is present where expected in a conditional group. */
-#define META_LOOKAHEAD 0x80220000u /* (?= */
-#define META_LOOKAHEADNOT 0x80230000u /* (?! */
-#define META_LOOKBEHIND 0x80240000u /* (?<= */
-#define META_LOOKBEHINDNOT 0x80250000u /* (?<! */
+#define META_LOOKAHEAD 0x80230000u /* (?= */
+#define META_LOOKAHEADNOT 0x80240000u /* (?! */
+#define META_LOOKBEHIND 0x80250000u /* (?<= */
+#define META_LOOKBEHINDNOT 0x80260000u /* (?<! */
/* These must be kept in this order, with consecutive values, and the _ARG
versions of COMMIT, PRUNE, SKIP, and THEN immediately after their non-argument
versions. */
-#define META_MARK 0x80260000u /* (*MARK) */
-#define META_ACCEPT 0x80270000u /* (*ACCEPT) */
-#define META_FAIL 0x80280000u /* (*FAIL) */
-#define META_COMMIT 0x80290000u /* These */
-#define META_COMMIT_ARG 0x802a0000u /* pairs */
-#define META_PRUNE 0x802b0000u /* must */
-#define META_PRUNE_ARG 0x802c0000u /* be */
-#define META_SKIP 0x802d0000u /* kept */
-#define META_SKIP_ARG 0x802e0000u /* in */
-#define META_THEN 0x802f0000u /* this */
-#define META_THEN_ARG 0x80300000u /* order */
+#define META_MARK 0x80270000u /* (*MARK) */
+#define META_ACCEPT 0x80280000u /* (*ACCEPT) */
+#define META_FAIL 0x80290000u /* (*FAIL) */
+#define META_COMMIT 0x802a0000u /* These */
+#define META_COMMIT_ARG 0x802b0000u /* pairs */
+#define META_PRUNE 0x802c0000u /* must */
+#define META_PRUNE_ARG 0x802d0000u /* be */
+#define META_SKIP 0x802e0000u /* kept */
+#define META_SKIP_ARG 0x802f0000u /* in */
+#define META_THEN 0x80300000u /* this */
+#define META_THEN_ARG 0x80310000u /* order */
/* These must be kept in groups of adjacent 3 values, and all together. */
-#define META_ASTERISK 0x80310000u /* * */
-#define META_ASTERISK_PLUS 0x80320000u /* *+ */
-#define META_ASTERISK_QUERY 0x80330000u /* *? */
-#define META_PLUS 0x80340000u /* + */
-#define META_PLUS_PLUS 0x80350000u /* ++ */
-#define META_PLUS_QUERY 0x80360000u /* +? */
-#define META_QUERY 0x80370000u /* ? */
-#define META_QUERY_PLUS 0x80380000u /* ?+ */
-#define META_QUERY_QUERY 0x80390000u /* ?? */
-#define META_MINMAX 0x803a0000u /* {n,m} repeat */
-#define META_MINMAX_PLUS 0x803b0000u /* {n,m}+ repeat */
-#define META_MINMAX_QUERY 0x803c0000u /* {n,m}? repeat */
+#define META_ASTERISK 0x80320000u /* * */
+#define META_ASTERISK_PLUS 0x80330000u /* *+ */
+#define META_ASTERISK_QUERY 0x80340000u /* *? */
+#define META_PLUS 0x80350000u /* + */
+#define META_PLUS_PLUS 0x80360000u /* ++ */
+#define META_PLUS_QUERY 0x80370000u /* +? */
+#define META_QUERY 0x80380000u /* ? */
+#define META_QUERY_PLUS 0x80390000u /* ?+ */
+#define META_QUERY_QUERY 0x803a0000u /* ?? */
+#define META_MINMAX 0x803b0000u /* {n,m} repeat */
+#define META_MINMAX_PLUS 0x803c0000u /* {n,m}+ repeat */
+#define META_MINMAX_QUERY 0x803d0000u /* {n,m}? repeat */
#define META_FIRST_QUANTIFIER META_ASTERISK
#define META_LAST_QUANTIFIER META_MINMAX_QUERY
+/* This is a special "meta code" that is used only to distinguish (*asr: from
+(*sr in the table of aphabetic assertions. It is never stored in the parsed
+pattern because (*asr: is turned into (*sr:(*atomic: at that stage. There is
+therefore no need for it to have a length entry, so use a high value. */
+
+#define META_ATOMIC_SCRIPT_RUN 0x8fff0000u
+
/* Table of extra lengths for each of the meta codes. Must be kept in step with
the definitions above. For some items these values are a basic length to which
a variable amount has to be added. */
@@ -322,6 +330,7 @@
0, /* META_RANGE_LITERAL */
SIZEOFFSET, /* META_RECURSE */
1+SIZEOFFSET, /* META_RECURSE_BYNAME */
+ 0, /* META_SCRIPT_RUN */
0, /* META_LOOKAHEAD */
0, /* META_LOOKAHEADNOT */
SIZEOFFSET, /* META_LOOKBEHIND */
@@ -638,19 +647,19 @@
STRING_atomic_script_run;
static const alasitem alasmeta[] = {
- { 3, META_LOOKAHEAD },
- { 3, META_LOOKBEHIND },
- { 3, META_LOOKAHEADNOT },
- { 3, META_LOOKBEHINDNOT },
- { 18, META_LOOKAHEAD },
- { 19, META_LOOKBEHIND },
- { 18, META_LOOKAHEADNOT },
- { 19, META_LOOKBEHINDNOT },
- { 6, META_ATOMIC },
- { 2, 0 }, /* sr = script run */
- { 3, 0 }, /* asr = atomic script run */
- { 10, 0 }, /* script run */
- { 17, 0 } /* atomic script run */
+ { 3, META_LOOKAHEAD },
+ { 3, META_LOOKBEHIND },
+ { 3, META_LOOKAHEADNOT },
+ { 3, META_LOOKBEHINDNOT },
+ { 18, META_LOOKAHEAD },
+ { 19, META_LOOKBEHIND },
+ { 18, META_LOOKAHEADNOT },
+ { 19, META_LOOKBEHINDNOT },
+ { 6, META_ATOMIC },
+ { 2, META_SCRIPT_RUN }, /* sr = script run */
+ { 3, META_ATOMIC_SCRIPT_RUN }, /* asr = atomic script run */
+ { 10, META_SCRIPT_RUN }, /* script run */
+ { 17, META_ATOMIC_SCRIPT_RUN } /* atomic script run */
};
static const int alascount = sizeof(alasmeta)/sizeof(alasitem);
@@ -772,7 +781,7 @@
ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, ERR70,
ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, ERR80,
ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERR88, ERR89, ERR90,
- ERR91, ERR92, ERR93, ERR94, ERR95 };
+ ERR91, ERR92, ERR93, ERR94, ERR95, ERR96 };
/* This is a table of start-of-pattern options such as (*UTF) and settings such
as (*LIMIT_MATCH=nnnn) and (*CRLF). For completeness and backward
@@ -1003,6 +1012,7 @@
case META_NOCAPTURE: fprintf(stderr, "META (?:"); break;
case META_LOOKAHEAD: fprintf(stderr, "META (?="); break;
case META_LOOKAHEADNOT: fprintf(stderr, "META (?!"); break;
+ case META_SCRIPT_RUN: fprintf(stderr, "META (*sr:"); break;
case META_KET: fprintf(stderr, "META )"); break;
case META_ALT: fprintf(stderr, "META | %d", meta_arg); break;
@@ -2210,15 +2220,15 @@
ERR60; /* Verb not recognized or malformed */
goto FAILED;
}
-
-/* A group name must not start with a digit. If either of the others start with
-a digit it just won't be recognized. */
-
+
+/* A group name must not start with a digit. If either of the others start with
+a digit it just won't be recognized. */
+
if (is_group && IS_DIGIT(*ptr))
{
*errorcodeptr = ERR44;
goto FAILED;
- }
+ }
*nameptr = ptr;
*offsetptr = (PCRE2_SIZE)(ptr - cb->start_pattern);
@@ -2345,6 +2355,7 @@
#define NSF_RESET 0x0001u
#define NSF_CONDASSERT 0x0002u
+#define NSF_ATOMICSR 0x0004u
/* Options that are changeable within the pattern must be tracked during
parsing. Some (e.g. PCRE2_EXTENDED) are implemented entirely during parsing,
@@ -2707,19 +2718,19 @@
case CHAR_C:
ok = expect_cond_assert == 2;
break;
-
+
case CHAR_EQUALS_SIGN:
case CHAR_EXCLAMATION_MARK:
break;
-
+
case CHAR_LESS_THAN_SIGN:
ok = ptr[2] == CHAR_EQUALS_SIGN || ptr[2] == CHAR_EXCLAMATION_MARK;
break;
-
+
default:
ok = FALSE;
}
- }
+ }
if (!ok)
{
@@ -3533,13 +3544,13 @@
/* Handle "alpha assertions" such as (*pla:...). Most of these are
synonyms for the historical symbolic assertions, but the script run ones
are new. They are distinguished by starting with a lower case letter.
- Checking both ends of the alphabet makes this work in all character
+ Checking both ends of the alphabet makes this work in all character
codes. */
else if (CHMAX_255(c) && (cb->ctypes[c] & ctype_lcletter) != 0)
{
uint32_t meta;
-
+
vn = alasnames;
if (!read_name(&ptr, ptrend, 0, &offset, &name, &namelen, &errorcode,
cb)) goto FAILED;
@@ -3550,7 +3561,7 @@
}
/* Scan the table of alpha assertion names */
-
+
for (i = 0; i < alascount; i++)
{
if (namelen == alasmeta[i].len &&
@@ -3564,42 +3575,72 @@
errorcode = ERR95; /* Alpha assertion not recognized */
goto FAILED;
}
-
- /* Check for expecting an assertion condition. If so, only lookaround
+
+ /* Check for expecting an assertion condition. If so, only lookaround
assertions are valid. */
-
+
meta = alasmeta[i].meta;
- if (prev_expect_cond_assert > 0 &&
+ if (prev_expect_cond_assert > 0 &&
(meta < META_LOOKAHEAD || meta > META_LOOKBEHINDNOT))
{
errorcode = ERR28; /* Assertion expected */
- goto FAILED;
- }
+ goto FAILED;
+ }
+ /* The lookaround alphabetic synonyms can be almost entirely handled by
+ jumping to the code that handles the traditional symbolic forms. */
+
switch(meta)
{
+ default:
+ errorcode = ERR89; /* Unknown code; should never occur because */
+ goto FAILED; /* the meta values come from a table above. */
+
case META_ATOMIC:
- goto ATOMIC_GROUP;
+ goto ATOMIC_GROUP;
case META_LOOKAHEAD:
goto POSITIVE_LOOK_AHEAD;
-
+
case META_LOOKAHEADNOT:
goto NEGATIVE_LOOK_AHEAD;
-
+
case META_LOOKBEHIND:
- case META_LOOKBEHINDNOT:
- *parsed_pattern++ = meta;
+ case META_LOOKBEHINDNOT:
+ *parsed_pattern++ = meta;
ptr--;
- goto LOOKBEHIND;
-
- /* FIXME: Script Run stuff ... */
-
-
-
+ goto POST_LOOKBEHIND;
-
- }
+ /* The script run facilities are handled here. Unicode support is
+ required (give an error if not, as this is a security issue). Always
+ record a META_SCRIPT_RUN item. Then, for the atomic version, insert
+ META_ATOMIC and remember that we need two META_KETs at the end. */
+
+ case META_SCRIPT_RUN:
+ case META_ATOMIC_SCRIPT_RUN:
+#ifdef SUPPORT_UNICODE
+ *parsed_pattern++ = META_SCRIPT_RUN;
+ nest_depth++;
+ ptr++;
+ if (meta == META_ATOMIC_SCRIPT_RUN)
+ {
+ *parsed_pattern++ = META_ATOMIC;
+ if (top_nest == NULL) top_nest = (nest_save *)(cb->start_workspace);
+ else if (++top_nest >= end_nests)
+ {
+ errorcode = ERR84;
+ goto FAILED;
+ }
+ top_nest->nest_depth = nest_depth;
+ top_nest->flags = NSF_ATOMICSR;
+ top_nest->options = options & PARSE_TRACKED_OPTIONS;
+ }
+ break;
+#else /* SUPPORT_UNICODE */
+ errorcode = ERR96;
+ goto FAILED;
+#endif
+ }
}
@@ -4262,8 +4303,8 @@
}
*parsed_pattern++ = (ptr[1] == CHAR_EQUALS_SIGN)?
META_LOOKBEHIND : META_LOOKBEHINDNOT;
-
- LOOKBEHIND: /* Come from (*plb: and (*nlb: */
+
+ POST_LOOKBEHIND: /* Come from (*plb: and (*nlb: */
*has_lookbehind = TRUE;
offset = (PCRE2_SIZE)(ptr - cb->start_pattern - 2);
PUTOFFSET(offset, parsed_pattern);
@@ -4425,6 +4466,14 @@
cb->bracount = top_nest->max_group;
if ((top_nest->flags & NSF_CONDASSERT) != 0)
okquantifier = FALSE;
+
+ if ((top_nest->flags & NSF_ATOMICSR) != 0)
+ {
+ *parsed_pattern++ = META_KET;
+ }
+
+
+
if (top_nest == (nest_save *)(cb->start_workspace)) top_nest = NULL;
else top_nest--;
}
@@ -6142,6 +6191,10 @@
bravalue = OP_ONCE;
goto GROUP_PROCESS_NOTE_EMPTY;
+ case META_SCRIPT_RUN:
+ bravalue = OP_SCRIPT_RUN;
+ goto GROUP_PROCESS_NOTE_EMPTY;
+
case META_NOCAPTURE:
bravalue = OP_BRA;
/* Fall through */
@@ -6777,6 +6830,7 @@
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_BRA:
case OP_CBRA:
case OP_COND:
@@ -6989,16 +7043,16 @@
}
/* If the maximum is unlimited, set a repeater in the final copy. For
- ONCE brackets, that's all we need to do. However, possessively repeated
- ONCE brackets can be converted into non-capturing brackets, as the
- behaviour of (?:xx)++ is the same as (?>xx)++ and this saves having to
- deal with possessive ONCEs specially.
+ SCRIPT_RUN and ONCE brackets, that's all we need to do. However,
+ possessively repeated ONCE brackets can be converted into non-capturing
+ brackets, as the behaviour of (?:xx)++ is the same as (?>xx)++ and this
+ saves having to deal with possessive ONCEs specially.
Otherwise, when we are doing the actual compile phase, check to see
whether this group is one that could match an empty string. If so,
convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so
that runtime checking can be done. [This check is also applied to ONCE
- groups at runtime, but in a different way.]
+ and SCRIPT_RUN groups at runtime, but in a different way.]
Then, if the quantifier was possessive and the bracket is not a
conditional, we convert the BRA code to the POS form, and the KET code to
@@ -7022,13 +7076,14 @@
if (*bracode == OP_ONCE && possessive_quantifier) *bracode = OP_BRA;
- /* For non-possessive ONCE brackets, all we need to do is to
- set the KET. */
+ /* For non-possessive ONCE and for SCRIPT_RUN brackets, all we need
+ to do is to set the KET. */
- if (*bracode == OP_ONCE) *ketcode = OP_KETRMAX + repeat_type;
+ if (*bracode == OP_ONCE || *bracode == OP_SCRIPT_RUN)
+ *ketcode = OP_KETRMAX + repeat_type;
- /* Handle non-ONCE brackets and possessive ONCEs (which have been
- converted to non-capturing above). */
+ /* Handle non-SCRIPT_RUN and non-ONCE brackets and possessive ONCEs
+ (which have been converted to non-capturing above). */
else
{
@@ -8385,6 +8440,7 @@
case OP_SCBRAPOS:
case OP_ASSERT:
case OP_ONCE:
+ case OP_SCRIPT_RUN:
d = find_firstassertedcu(scode, &dflags, inassert + ((op==OP_ASSERT)?1:0));
if (dflags < 0)
return 0;
Modified: code/trunk/src/pcre2_dfa_match.c
===================================================================
--- code/trunk/src/pcre2_dfa_match.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_dfa_match.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -173,6 +173,7 @@
0, /* Assert behind */
0, /* Assert behind not */
0, /* ONCE */
+ 0, /* SCRIPT_RUN */
0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */
0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */
0, 0, /* CREF, DNCREF */
@@ -247,6 +248,7 @@
0, /* Assert behind */
0, /* Assert behind not */
0, /* ONCE */
+ 0, /* SCRIPT_RUN */
0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */
0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */
0, 0, /* CREF, DNCREF */
Modified: code/trunk/src/pcre2_error.c
===================================================================
--- code/trunk/src/pcre2_error.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_error.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -183,6 +183,7 @@
"invalid hyphen in option setting\0"
/* 95 */
"(*alpha_assertion) not recognized\0"
+ "script runs require Unicode support, which this version of PCRE2 does not have\0"
;
/* Match-time and UTF error texts are in the same format. */
Modified: code/trunk/src/pcre2_internal.h
===================================================================
--- code/trunk/src/pcre2_internal.h 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_internal.h 2018-10-02 15:25:58 UTC (rev 1019)
@@ -1513,70 +1513,71 @@
OP_ASSERTBACK, /* 128 Positive lookbehind */
OP_ASSERTBACK_NOT, /* 129 Negative lookbehind */
- /* ONCE, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately after the
- assertions, with ONCE first, as there's a test for >= ONCE for a subpattern
- that isn't an assertion. The POS versions must immediately follow the non-POS
- versions in each case. */
+ /* ONCE, SCRIPT_RUN, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come
+ immediately after the assertions, with ONCE first, as there's a test for >=
+ ONCE for a subpattern that isn't an assertion. The POS versions must
+ immediately follow the non-POS versions in each case. */
OP_ONCE, /* 130 Atomic group, contains captures */
- OP_BRA, /* 131 Start of non-capturing bracket */
- OP_BRAPOS, /* 132 Ditto, with unlimited, possessive repeat */
- OP_CBRA, /* 133 Start of capturing bracket */
- OP_CBRAPOS, /* 134 Ditto, with unlimited, possessive repeat */
- OP_COND, /* 135 Conditional group */
+ OP_SCRIPT_RUN, /* 131 Non-capture, but check characters' scripts */
+ OP_BRA, /* 132 Start of non-capturing bracket */
+ OP_BRAPOS, /* 133 Ditto, with unlimited, possessive repeat */
+ OP_CBRA, /* 134 Start of capturing bracket */
+ OP_CBRAPOS, /* 135 Ditto, with unlimited, possessive repeat */
+ OP_COND, /* 136 Conditional group */
/* These five must follow the previous five, in the same order. There's a
check for >= SBRA to distinguish the two sets. */
- OP_SBRA, /* 136 Start of non-capturing bracket, check empty */
- OP_SBRAPOS, /* 137 Ditto, with unlimited, possessive repeat */
- OP_SCBRA, /* 138 Start of capturing bracket, check empty */
- OP_SCBRAPOS, /* 139 Ditto, with unlimited, possessive repeat */
- OP_SCOND, /* 140 Conditional group, check empty */
+ OP_SBRA, /* 137 Start of non-capturing bracket, check empty */
+ OP_SBRAPOS, /* 138 Ditto, with unlimited, possessive repeat */
+ OP_SCBRA, /* 139 Start of capturing bracket, check empty */
+ OP_SCBRAPOS, /* 140 Ditto, with unlimited, possessive repeat */
+ OP_SCOND, /* 141 Conditional group, check empty */
/* The next two pairs must (respectively) be kept together. */
- OP_CREF, /* 141 Used to hold a capture number as condition */
- OP_DNCREF, /* 142 Used to point to duplicate names as a condition */
- OP_RREF, /* 143 Used to hold a recursion number as condition */
- OP_DNRREF, /* 144 Used to point to duplicate names as a condition */
- OP_FALSE, /* 145 Always false (used by DEFINE and VERSION) */
- OP_TRUE, /* 146 Always true (used by VERSION) */
+ OP_CREF, /* 142 Used to hold a capture number as condition */
+ OP_DNCREF, /* 143 Used to point to duplicate names as a condition */
+ OP_RREF, /* 144 Used to hold a recursion number as condition */
+ OP_DNRREF, /* 145 Used to point to duplicate names as a condition */
+ OP_FALSE, /* 146 Always false (used by DEFINE and VERSION) */
+ OP_TRUE, /* 147 Always true (used by VERSION) */
- OP_BRAZERO, /* 147 These two must remain together and in this */
- OP_BRAMINZERO, /* 148 order. */
- OP_BRAPOSZERO, /* 149 */
+ OP_BRAZERO, /* 148 These two must remain together and in this */
+ OP_BRAMINZERO, /* 149 order. */
+ OP_BRAPOSZERO, /* 150 */
/* These are backtracking control verbs */
- OP_MARK, /* 150 always has an argument */
- OP_PRUNE, /* 151 */
- OP_PRUNE_ARG, /* 152 same, but with argument */
- OP_SKIP, /* 153 */
- OP_SKIP_ARG, /* 154 same, but with argument */
- OP_THEN, /* 155 */
- OP_THEN_ARG, /* 156 same, but with argument */
- OP_COMMIT, /* 157 */
- OP_COMMIT_ARG, /* 158 same, but with argument */
+ OP_MARK, /* 151 always has an argument */
+ OP_PRUNE, /* 152 */
+ OP_PRUNE_ARG, /* 153 same, but with argument */
+ OP_SKIP, /* 154 */
+ OP_SKIP_ARG, /* 155 same, but with argument */
+ OP_THEN, /* 156 */
+ OP_THEN_ARG, /* 157 same, but with argument */
+ OP_COMMIT, /* 158 */
+ OP_COMMIT_ARG, /* 159 same, but with argument */
/* These are forced failure and success verbs. FAIL and ACCEPT do accept an
argument, but these cases can be compiled as, for example, (*MARK:X)(*FAIL)
without the need for a special opcode. */
- OP_FAIL, /* 159 */
- OP_ACCEPT, /* 160 */
- OP_ASSERT_ACCEPT, /* 161 Used inside assertions */
- OP_CLOSE, /* 162 Used before OP_ACCEPT to close open captures */
+ OP_FAIL, /* 160 */
+ OP_ACCEPT, /* 161 */
+ OP_ASSERT_ACCEPT, /* 162 Used inside assertions */
+ OP_CLOSE, /* 163 Used before OP_ACCEPT to close open captures */
/* This is used to skip a subpattern with a {0} quantifier */
- OP_SKIPZERO, /* 163 */
+ OP_SKIPZERO, /* 164 */
/* This is used to identify a DEFINE group during compilation so that it can
be checked for having only one branch. It is changed to OP_FALSE before
compilation finishes. */
- OP_DEFINE, /* 164 */
+ OP_DEFINE, /* 165 */
/* This is not an opcode, but is used to check that tables indexed by opcode
are the correct length, in order to catch updating errors - there have been
@@ -1624,6 +1625,7 @@
"Alt", "Ket", "KetRmax", "KetRmin", "KetRpos", \
"Reverse", "Assert", "Assert not", "AssertB", "AssertB not", \
"Once", \
+ "Script run", \
"Bra", "BraPos", "CBra", "CBraPos", \
"Cond", \
"SBra", "SBraPos", "SCBra", "SCBraPos", \
@@ -1707,6 +1709,7 @@
1+LINK_SIZE, /* Assert behind */ \
1+LINK_SIZE, /* Assert behind not */ \
1+LINK_SIZE, /* ONCE */ \
+ 1+LINK_SIZE, /* SCRIPT_RUN */ \
1+LINK_SIZE, /* BRA */ \
1+LINK_SIZE, /* BRAPOS */ \
1+LINK_SIZE+IMM2_SIZE, /* CBRA */ \
@@ -1854,6 +1857,7 @@
#define _pcre2_hspace_list PCRE2_SUFFIX(_pcre2_hspace_list_)
#define _pcre2_vspace_list PCRE2_SUFFIX(_pcre2_vspace_list_)
#define _pcre2_ucd_caseless_sets PCRE2_SUFFIX(_pcre2_ucd_caseless_sets_)
+#define _pcre2_ucd_digit_sets PCRE2_SUFFIX(_pcre2_ucd_digit_sets_)
#define _pcre2_ucd_records PCRE2_SUFFIX(_pcre2_ucd_records_)
#define _pcre2_ucd_stage1 PCRE2_SUFFIX(_pcre2_ucd_stage1_)
#define _pcre2_ucd_stage2 PCRE2_SUFFIX(_pcre2_ucd_stage2_)
@@ -1875,6 +1879,7 @@
extern const uint32_t PRIV(hspace_list)[];
extern const uint32_t PRIV(vspace_list)[];
extern const uint32_t PRIV(ucd_caseless_sets)[];
+extern const uint32_t PRIV(ucd_digit_sets)[];
extern const ucd_record PRIV(ucd_records)[];
#if PCRE2_CODE_UNIT_WIDTH == 32
extern const ucd_record PRIV(dummy_ucd_record)[];
@@ -1922,6 +1927,7 @@
#define _pcre2_jit_get_target PCRE2_SUFFIX(_pcre2_jit_get_target_)
#define _pcre2_memctl_malloc PCRE2_SUFFIX(_pcre2_memctl_malloc_)
#define _pcre2_ord2utf PCRE2_SUFFIX(_pcre2_ord2utf_)
+#define _pcre2_script_run PCRE2_SUFFIX(_pcre2_script_run_)
#define _pcre2_strcmp PCRE2_SUFFIX(_pcre2_strcmp_)
#define _pcre2_strcmp_c8 PCRE2_SUFFIX(_pcre2_strcmp_c8_)
#define _pcre2_strcpy_c8 PCRE2_SUFFIX(_pcre2_strcpy_c8_)
@@ -1948,6 +1954,7 @@
const char * _pcre2_jit_get_target(void);
extern void * _pcre2_memctl_malloc(size_t, pcre2_memctl *);
extern unsigned int _pcre2_ord2utf(uint32_t, PCRE2_UCHAR *);
+extern BOOL _pcre2_script_run(PCRE2_SPTR, PCRE2_SPTR, BOOL);
extern int _pcre2_strcmp(PCRE2_SPTR, PCRE2_SPTR);
extern int _pcre2_strcmp_c8(PCRE2_SPTR, const char *);
extern PCRE2_SIZE _pcre2_strcpy_c8(PCRE2_UCHAR *, const char *);
Modified: code/trunk/src/pcre2_match.c
===================================================================
--- code/trunk/src/pcre2_match.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_match.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -5014,6 +5014,7 @@
must record a backtracking point and also set up a chained frame. */
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_SBRA:
Lframe_type = GF_NOCAPTURE | Fop;
@@ -5525,6 +5526,14 @@
case OP_ASSERT_NOT:
case OP_ASSERTBACK_NOT:
RRETURN(MATCH_MATCH);
+
+ /* At the end of a script run, apply the script-checking rules. This code
+ will never by exercised if Unicode support it not compiled, because in
+ that environment script runs cause an error at compile time. */
+
+ case OP_SCRIPT_RUN:
+ if (!PRIV(script_run)(P->eptr, Feptr, utf)) RRETURN(MATCH_NOMATCH);
+ break;
/* Whole-pattern recursion is coded as a recurse into group 0, so it
won't be picked up here. Instead, we catch it when the OP_END is reached.
Modified: code/trunk/src/pcre2_printint.c
===================================================================
--- code/trunk/src/pcre2_printint.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_printint.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -393,6 +393,7 @@
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_COND:
case OP_SCOND:
case OP_REVERSE:
Added: code/trunk/src/pcre2_script_run.c
===================================================================
--- code/trunk/src/pcre2_script_run.c (rev 0)
+++ code/trunk/src/pcre2_script_run.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -0,0 +1,228 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Original API code Copyright (c) 1997-2012 University of Cambridge
+ New API code Copyright (c) 2016-2018 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+/* This module contains the function for checking a script run. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+
+/*************************************************
+* Check script run *
+*************************************************/
+
+/* A script run is conceptually a sequence of characters all in the same
+Unicode script. However, it isn't quite that simple. There are special rules
+for scripts that are commonly used together, and also special rules for digits.
+This function implements the appropriate checks, which is possible only when
+PCRE2 is compiled with Unicode support. The function returns TRUE if there is
+no Unicode support; however, it should never be called in that circumstance
+because an error is given by pcre2_compile() if a script run is called for in a
+version of PCRE2 compiled without Unicode support.
+
+Arguments:
+ pgr point to the first character
+ endptr point after the last character
+ utf TRUE if in UTF mode
+
+Returns: TRUE if this is a valid script run
+*/
+
+#define SCRIPT_UNSET (-1)
+#define SCRIPT_HANPENDING (-2)
+#define SCRIPT_HANHIRAKATA (-3)
+#define SCRIPT_HANBOPOMOFO (-4)
+#define SCRIPT_HANHANGUL (-5)
+
+BOOL
+PRIV(script_run)(PCRE2_SPTR ptr, PCRE2_SPTR endptr, BOOL utf)
+{
+#ifdef SUPPORT_UNICODE
+int require_script = SCRIPT_UNSET;
+uint32_t require_digitset = 0;
+uint32_t c;
+
+#if PCRE2_CODE_UNIT_WIDTH == 32
+(void)utf; /* Avoid compiler warning */
+#endif
+
+/* Any string containing fewer than 2 characters is a valid script run. */
+
+if (ptr >= endptr) return TRUE;
+GETCHARINCTEST(c, ptr);
+if (ptr >= endptr) return TRUE;
+
+/* Scan strings of two or more characters, checking the Unicode characteristics
+of each code point. */
+
+for (;;)
+ {
+ const ucd_record *ucd = GET_UCD(c);
+ uint32_t script = ucd->script;
+
+ /* If the script is Unknown, the string is not a valid script run. Such
+ characters can only form script runs of length one. */
+
+ if (script == ucp_Unknown) return FALSE;
+
+ /* A character whose script is Inherited is always accepted, and plays no
+ further part. A character whose script is Common is always accepted, but must
+ still be tested for a digit below. Otherwise, the character must match the
+ script of the first non-Inherited, non-Common character encountered. For most
+ scripts, the test is for the same script. However, the Han Chinese script may
+ be used in conjunction with four other scripts in these combinations:
+
+ . Han with Hiragana and Katakana is allowed (for Japanese).
+
+ . Han with Bopomofo is allowed (for Taiwanese Mandarin).
+
+ . Han with Hangul is allowed (for Korean).
+
+ If the first significant character's script is one of the four, the required
+ script type is immediately known. However, if the first significant
+ character's script is Han, we have to keep checking for a non-Han character.
+ Hence the SCRIPT_HANPENDING state. */
+
+ if (script != ucp_Inherited)
+ {
+ if (script != ucp_Common) switch(require_script)
+ {
+ default:
+ if (script != (unsigned int)require_script) return FALSE;
+ break;
+
+ case SCRIPT_UNSET:
+ case SCRIPT_HANPENDING:
+ switch(script)
+ {
+ case ucp_Han:
+ require_script = SCRIPT_HANPENDING;
+ break;
+
+ case ucp_Hiragana:
+ case ucp_Katakana:
+ require_script = SCRIPT_HANHIRAKATA;
+ break;
+
+ case ucp_Bopomofo:
+ require_script = SCRIPT_HANBOPOMOFO;
+ break;
+
+ case ucp_Hangul:
+ require_script = SCRIPT_HANHANGUL;
+ break;
+
+ default:
+ if (require_script == SCRIPT_HANPENDING) return FALSE;
+ require_script = script;
+ break;
+ }
+ break;
+
+ case SCRIPT_HANHIRAKATA:
+ if (script != ucp_Han && script != ucp_Hiragana && script != ucp_Katakana)
+ return FALSE;
+ break;
+
+ case SCRIPT_HANBOPOMOFO:
+ if (script != ucp_Han && script != ucp_Bopomofo) return FALSE;
+ break;
+
+ case SCRIPT_HANHANGUL:
+ if (script != ucp_Han && script != ucp_Hangul) return FALSE;
+ break;
+ }
+
+ /* The character is in an acceptable script. We must now ensure that all
+ decimal digits in the string come from the same set. Some scripts (e.g.
+ Common, Arabic) have more than one set of decimal digits. This code does
+ not allow mixing sets, even within the same script. The vector called
+ PRIV(ucd_digit_sets)[] contains, in its first element, the number of
+ following elements, and then, in ascending order, the code points of the
+ '9' characters in every set of 10 digits. Each set is identified by the
+ offset in the vector of its '9' character. An initial check of the first
+ value picks up ASCII digits quickly. Otherwise, a binary chop is used. */
+
+ if (ucd->chartype == ucp_Nd)
+ {
+ uint32_t digitset;
+
+ if (c <= PRIV(ucd_digit_sets)[1]) digitset = 1; else
+ {
+ int mid;
+ int bot = 1;
+ int top = PRIV(ucd_digit_sets)[0];
+ for (;;)
+ {
+ if (top <= bot + 1) /* <= rather than == is paranoia */
+ {
+ digitset = top;
+ break;
+ }
+ mid = (top + bot) / 2;
+ if (c <= PRIV(ucd_digit_sets)[mid]) top = mid; else bot = mid;
+ }
+ }
+
+ /* A required value of 0 means "unset". */
+
+ if (require_digitset == 0) require_digitset = digitset;
+ else if (digitset != require_digitset) return FALSE;
+ } /* End digit handling */
+ } /* End checking non-Inherited character */
+
+ /* If we haven't yet got to the end, pick up the next character. */
+
+ if (ptr >= endptr) return TRUE;
+ GETCHARINCTEST(c, ptr);
+ } /* End checking loop */
+
+#else /* NOT SUPPORT_UNICODE */
+(void)ptr;
+(void)endptr;
+(void)utf;
+return TRUE;
+#endif /* SUPPORT_UNICODE */
+}
+
+/* End of pcre2_script_run.c */
Modified: code/trunk/src/pcre2_study.c
===================================================================
--- code/trunk/src/pcre2_study.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_study.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -171,6 +171,7 @@
/* Fall through */
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_SBRA:
case OP_BRAPOS:
case OP_SBRAPOS:
@@ -1075,6 +1076,7 @@
case OP_CBRAPOS:
case OP_SCBRAPOS:
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_ASSERT:
rc = set_start_bits(re, tcode, utf);
if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;
Modified: code/trunk/src/pcre2_tables.c
===================================================================
--- code/trunk/src/pcre2_tables.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_tables.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -417,6 +417,7 @@
#define STRING_Tifinagh0 STR_T STR_i STR_f STR_i STR_n STR_a STR_g STR_h "\0"
#define STRING_Tirhuta0 STR_T STR_i STR_r STR_h STR_u STR_t STR_a "\0"
#define STRING_Ugaritic0 STR_U STR_g STR_a STR_r STR_i STR_t STR_i STR_c "\0"
+#define STRING_Unknown0 STR_U STR_n STR_k STR_n STR_o STR_w STR_n "\0"
#define STRING_Vai0 STR_V STR_a STR_i "\0"
#define STRING_Warang_Citi0 STR_W STR_a STR_r STR_a STR_n STR_g STR_UNDERSCORE STR_C STR_i STR_t STR_i "\0"
#define STRING_Xan0 STR_X STR_a STR_n "\0"
@@ -611,6 +612,7 @@
STRING_Tifinagh0
STRING_Tirhuta0
STRING_Ugaritic0
+ STRING_Unknown0
STRING_Vai0
STRING_Warang_Citi0
STRING_Xan0
@@ -805,19 +807,20 @@
{ 1424, PT_SC, ucp_Tifinagh },
{ 1433, PT_SC, ucp_Tirhuta },
{ 1441, PT_SC, ucp_Ugaritic },
- { 1450, PT_SC, ucp_Vai },
- { 1454, PT_SC, ucp_Warang_Citi },
- { 1466, PT_ALNUM, 0 },
- { 1470, PT_PXSPACE, 0 },
- { 1474, PT_SPACE, 0 },
- { 1478, PT_UCNC, 0 },
- { 1482, PT_WORD, 0 },
- { 1486, PT_SC, ucp_Yi },
- { 1489, PT_GC, ucp_Z },
- { 1491, PT_SC, ucp_Zanabazar_Square },
- { 1508, PT_PC, ucp_Zl },
- { 1511, PT_PC, ucp_Zp },
- { 1514, PT_PC, ucp_Zs }
+ { 1450, PT_SC, ucp_Unknown },
+ { 1458, PT_SC, ucp_Vai },
+ { 1462, PT_SC, ucp_Warang_Citi },
+ { 1474, PT_ALNUM, 0 },
+ { 1478, PT_PXSPACE, 0 },
+ { 1482, PT_SPACE, 0 },
+ { 1486, PT_UCNC, 0 },
+ { 1490, PT_WORD, 0 },
+ { 1494, PT_SC, ucp_Yi },
+ { 1497, PT_GC, ucp_Z },
+ { 1499, PT_SC, ucp_Zanabazar_Square },
+ { 1516, PT_PC, ucp_Zl },
+ { 1519, PT_PC, ucp_Zp },
+ { 1522, PT_PC, ucp_Zs }
};
const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);
Modified: code/trunk/src/pcre2_ucd.c
===================================================================
--- code/trunk/src/pcre2_ucd.c 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_ucd.c 2018-10-02 15:25:58 UTC (rev 1019)
@@ -47,11 +47,11 @@
#if PCRE2_CODE_UNIT_WIDTH == 32
const ucd_record PRIV(dummy_ucd_record)[] = {{
- ucp_Common, /* script */
- ucp_Cn, /* type unassigned */
- ucp_gbOther, /* grapheme break property */
- 0, /* case set */
- 0, /* other case */
+ ucp_Unknown, /* script */
+ ucp_Cn, /* type unassigned */
+ ucp_gbOther, /* grapheme break property */
+ 0, /* case set */
+ 0, /* other case */
}};
#endif
@@ -68,6 +68,8 @@
} ucd_record;
*/
+/* This table contains lists of characters that are caseless sets of
+more than one character. Each list is terminated by NOTACHAR. */
const uint32_t PRIV(ucd_caseless_sets)[] = {
NOTACHAR,
@@ -100,865 +102,884 @@
0x1c88, 0xa64a, 0xa64b, NOTACHAR,
};
-/* When #included in pcre2test, we don't need this large table. */
+/* When #included in pcre2test, we don't need the table of digit
+sets, nor the the large main UCD tables. */
#ifndef PCRE2_PCRE2TEST
+/* This table lists the code points for the '9' characters in each
+set of decimal digits. It is used to ensure that all the digits in
+a script run come from the same set. */
+
+const uint32_t PRIV(ucd_digit_sets)[] = {
+ 61, /* Number of subsequent values */
+ 0x00039, 0x00669, 0x006f9, 0x007c9, 0x0096f, 0x009ef, 0x00a6f, 0x00aef,
+ 0x00b6f, 0x00bef, 0x00c6f, 0x00cef, 0x00d6f, 0x00def, 0x00e59, 0x00ed9,
+ 0x00f29, 0x01049, 0x01099, 0x017e9, 0x01819, 0x0194f, 0x019d9, 0x01a89,
+ 0x01a99, 0x01b59, 0x01bb9, 0x01c49, 0x01c59, 0x0a629, 0x0a8d9, 0x0a909,
+ 0x0a9d9, 0x0a9f9, 0x0aa59, 0x0abf9, 0x0ff19, 0x104a9, 0x10d39, 0x1106f,
+ 0x110f9, 0x1113f, 0x111d9, 0x112f9, 0x11459, 0x114d9, 0x11659, 0x116c9,
+ 0x11739, 0x118e9, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16b59, 0x1d7d7,
+ 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e959,
+};
+
+/* These are the main two-stage UCD tables. */
+
const ucd_record PRIV(ucd_records)[] = { /* 6832 bytes, record size 8 */
- { 9, 0, 2, 0, 0, }, /* 0 */
- { 9, 0, 1, 0, 0, }, /* 1 */
- { 9, 0, 0, 0, 0, }, /* 2 */
- { 9, 29, 12, 0, 0, }, /* 3 */
- { 9, 21, 12, 0, 0, }, /* 4 */
- { 9, 23, 12, 0, 0, }, /* 5 */
- { 9, 22, 12, 0, 0, }, /* 6 */
- { 9, 18, 12, 0, 0, }, /* 7 */
- { 9, 25, 12, 0, 0, }, /* 8 */
- { 9, 17, 12, 0, 0, }, /* 9 */
- { 9, 13, 12, 0, 0, }, /* 10 */
- { 33, 9, 12, 0, 32, }, /* 11 */
- { 33, 9, 12, 100, 32, }, /* 12 */
- { 33, 9, 12, 1, 32, }, /* 13 */
- { 9, 24, 12, 0, 0, }, /* 14 */
- { 9, 16, 12, 0, 0, }, /* 15 */
- { 33, 5, 12, 0, -32, }, /* 16 */
- { 33, 5, 12, 100, -32, }, /* 17 */
- { 33, 5, 12, 1, -32, }, /* 18 */
- { 9, 26, 12, 0, 0, }, /* 19 */
- { 9, 26, 14, 0, 0, }, /* 20 */
- { 33, 7, 12, 0, 0, }, /* 21 */
- { 9, 20, 12, 0, 0, }, /* 22 */
- { 9, 1, 2, 0, 0, }, /* 23 */
- { 9, 15, 12, 0, 0, }, /* 24 */
- { 9, 5, 12, 26, 775, }, /* 25 */
- { 9, 19, 12, 0, 0, }, /* 26 */
- { 33, 9, 12, 104, 32, }, /* 27 */
- { 33, 5, 12, 0, 7615, }, /* 28 */
- { 33, 5, 12, 104, -32, }, /* 29 */
- { 33, 5, 12, 0, 121, }, /* 30 */
- { 33, 9, 12, 0, 1, }, /* 31 */
- { 33, 5, 12, 0, -1, }, /* 32 */
- { 33, 9, 12, 0, 0, }, /* 33 */
- { 33, 5, 12, 0, 0, }, /* 34 */
- { 33, 9, 12, 0, -121, }, /* 35 */
- { 33, 5, 12, 1, -268, }, /* 36 */
- { 33, 5, 12, 0, 195, }, /* 37 */
- { 33, 9, 12, 0, 210, }, /* 38 */
- { 33, 9, 12, 0, 206, }, /* 39 */
- { 33, 9, 12, 0, 205, }, /* 40 */
- { 33, 9, 12, 0, 79, }, /* 41 */
- { 33, 9, 12, 0, 202, }, /* 42 */
- { 33, 9, 12, 0, 203, }, /* 43 */
- { 33, 9, 12, 0, 207, }, /* 44 */
- { 33, 5, 12, 0, 97, }, /* 45 */
- { 33, 9, 12, 0, 211, }, /* 46 */
- { 33, 9, 12, 0, 209, }, /* 47 */
- { 33, 5, 12, 0, 163, }, /* 48 */
- { 33, 9, 12, 0, 213, }, /* 49 */
- { 33, 5, 12, 0, 130, }, /* 50 */
- { 33, 9, 12, 0, 214, }, /* 51 */
- { 33, 9, 12, 0, 218, }, /* 52 */
- { 33, 9, 12, 0, 217, }, /* 53 */
- { 33, 9, 12, 0, 219, }, /* 54 */
- { 33, 5, 12, 0, 56, }, /* 55 */
- { 33, 9, 12, 5, 2, }, /* 56 */
- { 33, 8, 12, 5, 1, }, /* 57 */
- { 33, 5, 12, 5, -2, }, /* 58 */
- { 33, 9, 12, 9, 2, }, /* 59 */
- { 33, 8, 12, 9, 1, }, /* 60 */
- { 33, 5, 12, 9, -2, }, /* 61 */
- { 33, 9, 12, 13, 2, }, /* 62 */
- { 33, 8, 12, 13, 1, }, /* 63 */
- { 33, 5, 12, 13, -2, }, /* 64 */
- { 33, 5, 12, 0, -79, }, /* 65 */
- { 33, 9, 12, 17, 2, }, /* 66 */
- { 33, 8, 12, 17, 1, }, /* 67 */
- { 33, 5, 12, 17, -2, }, /* 68 */
- { 33, 9, 12, 0, -97, }, /* 69 */
- { 33, 9, 12, 0, -56, }, /* 70 */
- { 33, 9, 12, 0, -130, }, /* 71 */
- { 33, 9, 12, 0, 10795, }, /* 72 */
- { 33, 9, 12, 0, -163, }, /* 73 */
- { 33, 9, 12, 0, 10792, }, /* 74 */
- { 33, 5, 12, 0, 10815, }, /* 75 */
- { 33, 9, 12, 0, -195, }, /* 76 */
- { 33, 9, 12, 0, 69, }, /* 77 */
- { 33, 9, 12, 0, 71, }, /* 78 */
- { 33, 5, 12, 0, 10783, }, /* 79 */
- { 33, 5, 12, 0, 10780, }, /* 80 */
- { 33, 5, 12, 0, 10782, }, /* 81 */
- { 33, 5, 12, 0, -210, }, /* 82 */
- { 33, 5, 12, 0, -206, }, /* 83 */
- { 33, 5, 12, 0, -205, }, /* 84 */
- { 33, 5, 12, 0, -202, }, /* 85 */
- { 33, 5, 12, 0, -203, }, /* 86 */
- { 33, 5, 12, 0, 42319, }, /* 87 */
- { 33, 5, 12, 0, 42315, }, /* 88 */
- { 33, 5, 12, 0, -207, }, /* 89 */
- { 33, 5, 12, 0, 42280, }, /* 90 */
- { 33, 5, 12, 0, 42308, }, /* 91 */
- { 33, 5, 12, 0, -209, }, /* 92 */
- { 33, 5, 12, 0, -211, }, /* 93 */
- { 33, 5, 12, 0, 10743, }, /* 94 */
- { 33, 5, 12, 0, 42305, }, /* 95 */
- { 33, 5, 12, 0, 10749, }, /* 96 */
- { 33, 5, 12, 0, -213, }, /* 97 */
- { 33, 5, 12, 0, -214, }, /* 98 */
- { 33, 5, 12, 0, 10727, }, /* 99 */
- { 33, 5, 12, 0, -218, }, /* 100 */
- { 33, 5, 12, 0, 42282, }, /* 101 */
- { 33, 5, 12, 0, -69, }, /* 102 */
- { 33, 5, 12, 0, -217, }, /* 103 */
- { 33, 5, 12, 0, -71, }, /* 104 */
- { 33, 5, 12, 0, -219, }, /* 105 */
- { 33, 5, 12, 0, 42261, }, /* 106 */
- { 33, 5, 12, 0, 42258, }, /* 107 */
- { 33, 6, 12, 0, 0, }, /* 108 */
- { 9, 6, 12, 0, 0, }, /* 109 */
- { 3, 24, 12, 0, 0, }, /* 110 */
- { 27, 12, 3, 0, 0, }, /* 111 */
- { 27, 12, 3, 21, 116, }, /* 112 */
- { 19, 9, 12, 0, 1, }, /* 113 */
- { 19, 5, 12, 0, -1, }, /* 114 */
- { 19, 24, 12, 0, 0, }, /* 115 */
- { 9, 2, 12, 0, 0, }, /* 116 */
- { 19, 6, 12, 0, 0, }, /* 117 */
- { 19, 5, 12, 0, 130, }, /* 118 */
- { 19, 9, 12, 0, 116, }, /* 119 */
- { 19, 9, 12, 0, 38, }, /* 120 */
- { 19, 9, 12, 0, 37, }, /* 121 */
- { 19, 9, 12, 0, 64, }, /* 122 */
- { 19, 9, 12, 0, 63, }, /* 123 */
- { 19, 5, 12, 0, 0, }, /* 124 */
- { 19, 9, 12, 0, 32, }, /* 125 */
- { 19, 9, 12, 34, 32, }, /* 126 */
- { 19, 9, 12, 59, 32, }, /* 127 */
- { 19, 9, 12, 38, 32, }, /* 128 */
- { 19, 9, 12, 21, 32, }, /* 129 */
- { 19, 9, 12, 51, 32, }, /* 130 */
- { 19, 9, 12, 26, 32, }, /* 131 */
- { 19, 9, 12, 47, 32, }, /* 132 */
- { 19, 9, 12, 55, 32, }, /* 133 */
- { 19, 9, 12, 30, 32, }, /* 134 */
- { 19, 9, 12, 43, 32, }, /* 135 */
- { 19, 9, 12, 96, 32, }, /* 136 */
- { 19, 5, 12, 0, -38, }, /* 137 */
- { 19, 5, 12, 0, -37, }, /* 138 */
- { 19, 5, 12, 0, -32, }, /* 139 */
- { 19, 5, 12, 34, -32, }, /* 140 */
- { 19, 5, 12, 59, -32, }, /* 141 */
- { 19, 5, 12, 38, -32, }, /* 142 */
- { 19, 5, 12, 21, -116, }, /* 143 */
- { 19, 5, 12, 51, -32, }, /* 144 */
- { 19, 5, 12, 26, -775, }, /* 145 */
- { 19, 5, 12, 47, -32, }, /* 146 */
- { 19, 5, 12, 55, -32, }, /* 147 */
- { 19, 5, 12, 30, 1, }, /* 148 */
- { 19, 5, 12, 30, -32, }, /* 149 */
- { 19, 5, 12, 43, -32, }, /* 150 */
- { 19, 5, 12, 96, -32, }, /* 151 */
- { 19, 5, 12, 0, -64, }, /* 152 */
- { 19, 5, 12, 0, -63, }, /* 153 */
- { 19, 9, 12, 0, 8, }, /* 154 */
- { 19, 5, 12, 34, -30, }, /* 155 */
- { 19, 5, 12, 38, -25, }, /* 156 */
- { 19, 9, 12, 0, 0, }, /* 157 */
- { 19, 5, 12, 43, -15, }, /* 158 */
- { 19, 5, 12, 47, -22, }, /* 159 */
- { 19, 5, 12, 0, -8, }, /* 160 */
- { 10, 9, 12, 0, 1, }, /* 161 */
- { 10, 5, 12, 0, -1, }, /* 162 */
- { 19, 5, 12, 51, -54, }, /* 163 */
- { 19, 5, 12, 55, -48, }, /* 164 */
- { 19, 5, 12, 0, 7, }, /* 165 */
- { 19, 5, 12, 0, -116, }, /* 166 */
- { 19, 9, 12, 38, -60, }, /* 167 */
- { 19, 5, 12, 59, -64, }, /* 168 */
- { 19, 25, 12, 0, 0, }, /* 169 */
- { 19, 9, 12, 0, -7, }, /* 170 */
- { 19, 9, 12, 0, -130, }, /* 171 */
- { 12, 9, 12, 0, 80, }, /* 172 */
- { 12, 9, 12, 0, 32, }, /* 173 */
- { 12, 9, 12, 63, 32, }, /* 174 */
- { 12, 9, 12, 67, 32, }, /* 175 */
- { 12, 9, 12, 71, 32, }, /* 176 */
- { 12, 9, 12, 75, 32, }, /* 177 */
- { 12, 9, 12, 79, 32, }, /* 178 */
- { 12, 9, 12, 84, 32, }, /* 179 */
- { 12, 5, 12, 0, -32, }, /* 180 */
- { 12, 5, 12, 63, -32, }, /* 181 */
- { 12, 5, 12, 67, -32, }, /* 182 */
- { 12, 5, 12, 71, -32, }, /* 183 */
- { 12, 5, 12, 75, -32, }, /* 184 */
- { 12, 5, 12, 79, -32, }, /* 185 */
- { 12, 5, 12, 84, -32, }, /* 186 */
- { 12, 5, 12, 0, -80, }, /* 187 */
- { 12, 9, 12, 0, 1, }, /* 188 */
- { 12, 5, 12, 0, -1, }, /* 189 */
- { 12, 9, 12, 88, 1, }, /* 190 */
- { 12, 5, 12, 88, -1, }, /* 191 */
- { 12, 26, 12, 0, 0, }, /* 192 */
- { 12, 12, 3, 0, 0, }, /* 193 */
- { 12, 11, 3, 0, 0, }, /* 194 */
- { 12, 9, 12, 0, 15, }, /* 195 */
- { 12, 5, 12, 0, -15, }, /* 196 */
- { 1, 9, 12, 0, 48, }, /* 197 */
- { 1, 6, 12, 0, 0, }, /* 198 */
- { 1, 21, 12, 0, 0, }, /* 199 */
- { 1, 5, 12, 0, 0, }, /* 200 */
- { 1, 5, 12, 0, -48, }, /* 201 */
- { 1, 17, 12, 0, 0, }, /* 202 */
- { 1, 26, 12, 0, 0, }, /* 203 */
- { 1, 23, 12, 0, 0, }, /* 204 */
- { 25, 12, 3, 0, 0, }, /* 205 */
- { 25, 17, 12, 0, 0, }, /* 206 */
- { 25, 21, 12, 0, 0, }, /* 207 */
- { 25, 7, 12, 0, 0, }, /* 208 */
- { 0, 1, 4, 0, 0, }, /* 209 */
- { 9, 1, 4, 0, 0, }, /* 210 */
- { 0, 25, 12, 0, 0, }, /* 211 */
- { 0, 21, 12, 0, 0, }, /* 212 */
- { 0, 23, 12, 0, 0, }, /* 213 */
- { 0, 26, 12, 0, 0, }, /* 214 */
- { 0, 12, 3, 0, 0, }, /* 215 */
- { 0, 1, 2, 0, 0, }, /* 216 */
- { 0, 7, 12, 0, 0, }, /* 217 */
- { 0, 13, 12, 0, 0, }, /* 218 */
- { 0, 6, 12, 0, 0, }, /* 219 */
- { 49, 21, 12, 0, 0, }, /* 220 */
- { 49, 1, 4, 0, 0, }, /* 221 */
- { 49, 7, 12, 0, 0, }, /* 222 */
- { 49, 12, 3, 0, 0, }, /* 223 */
- { 55, 7, 12, 0, 0, }, /* 224 */
- { 55, 12, 3, 0, 0, }, /* 225 */
- { 63, 13, 12, 0, 0, }, /* 226 */
- { 63, 7, 12, 0, 0, }, /* 227 */
- { 63, 12, 3, 0, 0, }, /* 228 */
- { 63, 6, 12, 0, 0, }, /* 229 */
- { 63, 26, 12, 0, 0, }, /* 230 */
- { 63, 21, 12, 0, 0, }, /* 231 */
- { 63, 23, 12, 0, 0, }, /* 232 */
- { 89, 7, 12, 0, 0, }, /* 233 */
- { 89, 12, 3, 0, 0, }, /* 234 */
- { 89, 6, 12, 0, 0, }, /* 235 */
- { 89, 21, 12, 0, 0, }, /* 236 */
- { 94, 7, 12, 0, 0, }, /* 237 */
- { 94, 12, 3, 0, 0, }, /* 238 */
- { 94, 21, 12, 0, 0, }, /* 239 */
- { 14, 12, 3, 0, 0, }, /* 240 */
- { 14, 10, 5, 0, 0, }, /* 241 */
- { 14, 7, 12, 0, 0, }, /* 242 */
- { 14, 13, 12, 0, 0, }, /* 243 */
- { 14, 21, 12, 0, 0, }, /* 244 */
- { 14, 6, 12, 0, 0, }, /* 245 */
- { 2, 7, 12, 0, 0, }, /* 246 */
- { 2, 12, 3, 0, 0, }, /* 247 */
- { 2, 10, 5, 0, 0, }, /* 248 */
- { 2, 10, 3, 0, 0, }, /* 249 */
- { 2, 13, 12, 0, 0, }, /* 250 */
- { 2, 23, 12, 0, 0, }, /* 251 */
- { 2, 15, 12, 0, 0, }, /* 252 */
- { 2, 26, 12, 0, 0, }, /* 253 */
- { 2, 21, 12, 0, 0, }, /* 254 */
- { 21, 12, 3, 0, 0, }, /* 255 */
- { 21, 10, 5, 0, 0, }, /* 256 */
- { 21, 7, 12, 0, 0, }, /* 257 */
- { 21, 13, 12, 0, 0, }, /* 258 */
- { 21, 21, 12, 0, 0, }, /* 259 */
- { 20, 12, 3, 0, 0, }, /* 260 */
- { 20, 10, 5, 0, 0, }, /* 261 */
- { 20, 7, 12, 0, 0, }, /* 262 */
- { 20, 13, 12, 0, 0, }, /* 263 */
- { 20, 21, 12, 0, 0, }, /* 264 */
- { 20, 23, 12, 0, 0, }, /* 265 */
- { 43, 12, 3, 0, 0, }, /* 266 */
- { 43, 10, 5, 0, 0, }, /* 267 */
- { 43, 7, 12, 0, 0, }, /* 268 */
- { 43, 10, 3, 0, 0, }, /* 269 */
- { 43, 13, 12, 0, 0, }, /* 270 */
- { 43, 26, 12, 0, 0, }, /* 271 */
- { 43, 15, 12, 0, 0, }, /* 272 */
- { 53, 12, 3, 0, 0, }, /* 273 */
- { 53, 7, 12, 0, 0, }, /* 274 */
- { 53, 10, 3, 0, 0, }, /* 275 */
- { 53, 10, 5, 0, 0, }, /* 276 */
- { 53, 13, 12, 0, 0, }, /* 277 */
- { 53, 15, 12, 0, 0, }, /* 278 */
- { 53, 26, 12, 0, 0, }, /* 279 */
- { 53, 23, 12, 0, 0, }, /* 280 */
- { 54, 12, 3, 0, 0, }, /* 281 */
- { 54, 10, 5, 0, 0, }, /* 282 */
- { 54, 7, 12, 0, 0, }, /* 283 */
- { 54, 13, 12, 0, 0, }, /* 284 */
- { 54, 15, 12, 0, 0, }, /* 285 */
- { 54, 26, 12, 0, 0, }, /* 286 */
- { 28, 7, 12, 0, 0, }, /* 287 */
- { 28, 12, 3, 0, 0, }, /* 288 */
- { 28, 10, 5, 0, 0, }, /* 289 */
- { 28, 21, 12, 0, 0, }, /* 290 */
- { 28, 10, 3, 0, 0, }, /* 291 */
- { 28, 13, 12, 0, 0, }, /* 292 */
- { 36, 12, 3, 0, 0, }, /* 293 */
- { 36, 10, 5, 0, 0, }, /* 294 */
- { 36, 7, 12, 0, 0, }, /* 295 */
- { 36, 10, 3, 0, 0, }, /* 296 */
- { 36, 7, 4, 0, 0, }, /* 297 */
- { 36, 26, 12, 0, 0, }, /* 298 */
- { 36, 15, 12, 0, 0, }, /* 299 */
- { 36, 13, 12, 0, 0, }, /* 300 */
- { 47, 10, 5, 0, 0, }, /* 301 */
- { 47, 7, 12, 0, 0, }, /* 302 */
- { 47, 12, 3, 0, 0, }, /* 303 */
- { 47, 10, 3, 0, 0, }, /* 304 */
- { 47, 13, 12, 0, 0, }, /* 305 */
- { 47, 21, 12, 0, 0, }, /* 306 */
- { 56, 7, 12, 0, 0, }, /* 307 */
- { 56, 12, 3, 0, 0, }, /* 308 */
- { 56, 7, 5, 0, 0, }, /* 309 */
- { 56, 6, 12, 0, 0, }, /* 310 */
- { 56, 21, 12, 0, 0, }, /* 311 */
- { 56, 13, 12, 0, 0, }, /* 312 */
- { 32, 7, 12, 0, 0, }, /* 313 */
- { 32, 12, 3, 0, 0, }, /* 314 */
- { 32, 7, 5, 0, 0, }, /* 315 */
- { 32, 6, 12, 0, 0, }, /* 316 */
- { 32, 13, 12, 0, 0, }, /* 317 */
- { 57, 7, 12, 0, 0, }, /* 318 */
- { 57, 26, 12, 0, 0, }, /* 319 */
- { 57, 21, 12, 0, 0, }, /* 320 */
- { 57, 12, 3, 0, 0, }, /* 321 */
- { 57, 13, 12, 0, 0, }, /* 322 */
- { 57, 15, 12, 0, 0, }, /* 323 */
- { 57, 22, 12, 0, 0, }, /* 324 */
- { 57, 18, 12, 0, 0, }, /* 325 */
- { 57, 10, 5, 0, 0, }, /* 326 */
- { 38, 7, 12, 0, 0, }, /* 327 */
- { 38, 10, 12, 0, 0, }, /* 328 */
- { 38, 12, 3, 0, 0, }, /* 329 */
- { 38, 10, 5, 0, 0, }, /* 330 */
- { 38, 13, 12, 0, 0, }, /* 331 */
- { 38, 21, 12, 0, 0, }, /* 332 */
- { 38, 26, 12, 0, 0, }, /* 333 */
- { 16, 9, 12, 0, 7264, }, /* 334 */
- { 16, 5, 12, 0, 3008, }, /* 335 */
- { 16, 6, 12, 0, 0, }, /* 336 */
- { 23, 7, 6, 0, 0, }, /* 337 */
- { 23, 7, 7, 0, 0, }, /* 338 */
- { 23, 7, 8, 0, 0, }, /* 339 */
- { 15, 7, 12, 0, 0, }, /* 340 */
- { 15, 12, 3, 0, 0, }, /* 341 */
- { 15, 21, 12, 0, 0, }, /* 342 */
- { 15, 15, 12, 0, 0, }, /* 343 */
- { 15, 26, 12, 0, 0, }, /* 344 */
- { 8, 9, 12, 0, 38864, }, /* 345 */
- { 8, 9, 12, 0, 8, }, /* 346 */
- { 8, 5, 12, 0, -8, }, /* 347 */
- { 7, 17, 12, 0, 0, }, /* 348 */
- { 7, 7, 12, 0, 0, }, /* 349 */
- { 7, 21, 12, 0, 0, }, /* 350 */
- { 40, 29, 12, 0, 0, }, /* 351 */
- { 40, 7, 12, 0, 0, }, /* 352 */
- { 40, 22, 12, 0, 0, }, /* 353 */
- { 40, 18, 12, 0, 0, }, /* 354 */
- { 45, 7, 12, 0, 0, }, /* 355 */
- { 45, 14, 12, 0, 0, }, /* 356 */
- { 50, 7, 12, 0, 0, }, /* 357 */
- { 50, 12, 3, 0, 0, }, /* 358 */
- { 24, 7, 12, 0, 0, }, /* 359 */
- { 24, 12, 3, 0, 0, }, /* 360 */
- { 6, 7, 12, 0, 0, }, /* 361 */
- { 6, 12, 3, 0, 0, }, /* 362 */
- { 51, 7, 12, 0, 0, }, /* 363 */
- { 51, 12, 3, 0, 0, }, /* 364 */
- { 31, 7, 12, 0, 0, }, /* 365 */
- { 31, 12, 3, 0, 0, }, /* 366 */
- { 31, 10, 5, 0, 0, }, /* 367 */
- { 31, 21, 12, 0, 0, }, /* 368 */
- { 31, 6, 12, 0, 0, }, /* 369 */
- { 31, 23, 12, 0, 0, }, /* 370 */
- { 31, 13, 12, 0, 0, }, /* 371 */
- { 31, 15, 12, 0, 0, }, /* 372 */
- { 37, 21, 12, 0, 0, }, /* 373 */
- { 37, 17, 12, 0, 0, }, /* 374 */
- { 37, 12, 3, 0, 0, }, /* 375 */
- { 37, 1, 2, 0, 0, }, /* 376 */
- { 37, 13, 12, 0, 0, }, /* 377 */
- { 37, 7, 12, 0, 0, }, /* 378 */
- { 37, 6, 12, 0, 0, }, /* 379 */
- { 34, 7, 12, 0, 0, }, /* 380 */
- { 34, 12, 3, 0, 0, }, /* 381 */
- { 34, 10, 5, 0, 0, }, /* 382 */
- { 34, 26, 12, 0, 0, }, /* 383 */
- { 34, 21, 12, 0, 0, }, /* 384 */
- { 34, 13, 12, 0, 0, }, /* 385 */
- { 52, 7, 12, 0, 0, }, /* 386 */
- { 39, 7, 12, 0, 0, }, /* 387 */
- { 39, 13, 12, 0, 0, }, /* 388 */
- { 39, 15, 12, 0, 0, }, /* 389 */
- { 39, 26, 12, 0, 0, }, /* 390 */
- { 31, 26, 12, 0, 0, }, /* 391 */
- { 5, 7, 12, 0, 0, }, /* 392 */
- { 5, 12, 3, 0, 0, }, /* 393 */
- { 5, 10, 5, 0, 0, }, /* 394 */
- { 5, 21, 12, 0, 0, }, /* 395 */
- { 90, 7, 12, 0, 0, }, /* 396 */
- { 90, 10, 5, 0, 0, }, /* 397 */
- { 90, 12, 3, 0, 0, }, /* 398 */
- { 90, 10, 12, 0, 0, }, /* 399 */
- { 90, 13, 12, 0, 0, }, /* 400 */
- { 90, 21, 12, 0, 0, }, /* 401 */
- { 90, 6, 12, 0, 0, }, /* 402 */
- { 27, 11, 3, 0, 0, }, /* 403 */
- { 61, 12, 3, 0, 0, }, /* 404 */
- { 61, 10, 5, 0, 0, }, /* 405 */
- { 61, 7, 12, 0, 0, }, /* 406 */
- { 61, 13, 12, 0, 0, }, /* 407 */
- { 61, 21, 12, 0, 0, }, /* 408 */
- { 61, 26, 12, 0, 0, }, /* 409 */
- { 75, 12, 3, 0, 0, }, /* 410 */
- { 75, 10, 5, 0, 0, }, /* 411 */
- { 75, 7, 12, 0, 0, }, /* 412 */
- { 75, 13, 12, 0, 0, }, /* 413 */
- { 92, 7, 12, 0, 0, }, /* 414 */
- { 92, 12, 3, 0, 0, }, /* 415 */
- { 92, 10, 5, 0, 0, }, /* 416 */
- { 92, 21, 12, 0, 0, }, /* 417 */
- { 69, 7, 12, 0, 0, }, /* 418 */
- { 69, 10, 5, 0, 0, }, /* 419 */
- { 69, 12, 3, 0, 0, }, /* 420 */
- { 69, 21, 12, 0, 0, }, /* 421 */
- { 69, 13, 12, 0, 0, }, /* 422 */
- { 72, 13, 12, 0, 0, }, /* 423 */
- { 72, 7, 12, 0, 0, }, /* 424 */
- { 72, 6, 12, 0, 0, }, /* 425 */
- { 72, 21, 12, 0, 0, }, /* 426 */
- { 12, 5, 12, 63, -6222, }, /* 427 */
- { 12, 5, 12, 67, -6221, }, /* 428 */
- { 12, 5, 12, 71, -6212, }, /* 429 */
- { 12, 5, 12, 75, -6210, }, /* 430 */
- { 12, 5, 12, 79, -6210, }, /* 431 */
- { 12, 5, 12, 79, -6211, }, /* 432 */
- { 12, 5, 12, 84, -6204, }, /* 433 */
- { 12, 5, 12, 88, -6180, }, /* 434 */
- { 12, 5, 12, 108, 35267, }, /* 435 */
- { 16, 9, 12, 0, -3008, }, /* 436 */
- { 75, 21, 12, 0, 0, }, /* 437 */
- { 9, 10, 5, 0, 0, }, /* 438 */
- { 9, 7, 12, 0, 0, }, /* 439 */
- { 12, 5, 12, 0, 0, }, /* 440 */
- { 12, 6, 12, 0, 0, }, /* 441 */
- { 33, 5, 12, 0, 35332, }, /* 442 */
- { 33, 5, 12, 0, 3814, }, /* 443 */
- { 33, 9, 12, 92, 1, }, /* 444 */
- { 33, 5, 12, 92, -1, }, /* 445 */
- { 33, 5, 12, 92, -58, }, /* 446 */
- { 33, 9, 12, 0, -7615, }, /* 447 */
- { 19, 5, 12, 0, 8, }, /* 448 */
- { 19, 9, 12, 0, -8, }, /* 449 */
- { 19, 5, 12, 0, 74, }, /* 450 */
- { 19, 5, 12, 0, 86, }, /* 451 */
- { 19, 5, 12, 0, 100, }, /* 452 */
- { 19, 5, 12, 0, 128, }, /* 453 */
- { 19, 5, 12, 0, 112, }, /* 454 */
- { 19, 5, 12, 0, 126, }, /* 455 */
- { 19, 8, 12, 0, -8, }, /* 456 */
- { 19, 5, 12, 0, 9, }, /* 457 */
- { 19, 9, 12, 0, -74, }, /* 458 */
- { 19, 8, 12, 0, -9, }, /* 459 */
- { 19, 5, 12, 21, -7173, }, /* 460 */
- { 19, 9, 12, 0, -86, }, /* 461 */
- { 19, 9, 12, 0, -100, }, /* 462 */
- { 19, 9, 12, 0, -112, }, /* 463 */
- { 19, 9, 12, 0, -128, }, /* 464 */
- { 19, 9, 12, 0, -126, }, /* 465 */
- { 27, 1, 3, 0, 0, }, /* 466 */
- { 27, 1, 13, 0, 0, }, /* 467 */
- { 9, 27, 2, 0, 0, }, /* 468 */
- { 9, 28, 2, 0, 0, }, /* 469 */
- { 9, 21, 14, 0, 0, }, /* 470 */
- { 9, 2, 2, 0, 0, }, /* 471 */
- { 9, 9, 12, 0, 0, }, /* 472 */
- { 9, 5, 12, 0, 0, }, /* 473 */
- { 19, 9, 12, 96, -7517, }, /* 474 */
- { 33, 9, 12, 100, -8383, }, /* 475 */
- { 33, 9, 12, 104, -8262, }, /* 476 */
- { 33, 9, 12, 0, 28, }, /* 477 */
- { 9, 5, 14, 0, 0, }, /* 478 */
- { 33, 5, 12, 0, -28, }, /* 479 */
- { 33, 14, 12, 0, 16, }, /* 480 */
- { 33, 14, 12, 0, -16, }, /* 481 */
- { 33, 14, 12, 0, 0, }, /* 482 */
- { 9, 25, 14, 0, 0, }, /* 483 */
- { 9, 26, 12, 0, 26, }, /* 484 */
- { 9, 26, 14, 0, 26, }, /* 485 */
- { 9, 26, 12, 0, -26, }, /* 486 */
- { 4, 26, 12, 0, 0, }, /* 487 */
- { 17, 9, 12, 0, 48, }, /* 488 */
- { 17, 5, 12, 0, -48, }, /* 489 */
- { 33, 9, 12, 0, -10743, }, /* 490 */
- { 33, 9, 12, 0, -3814, }, /* 491 */
- { 33, 9, 12, 0, -10727, }, /* 492 */
- { 33, 5, 12, 0, -10795, }, /* 493 */
- { 33, 5, 12, 0, -10792, }, /* 494 */
- { 33, 9, 12, 0, -10780, }, /* 495 */
- { 33, 9, 12, 0, -10749, }, /* 496 */
- { 33, 9, 12, 0, -10783, }, /* 497 */
- { 33, 9, 12, 0, -10782, }, /* 498 */
- { 33, 9, 12, 0, -10815, }, /* 499 */
- { 10, 5, 12, 0, 0, }, /* 500 */
- { 10, 26, 12, 0, 0, }, /* 501 */
- { 10, 12, 3, 0, 0, }, /* 502 */
- { 10, 21, 12, 0, 0, }, /* 503 */
- { 10, 15, 12, 0, 0, }, /* 504 */
- { 16, 5, 12, 0, -7264, }, /* 505 */
- { 58, 7, 12, 0, 0, }, /* 506 */
- { 58, 6, 12, 0, 0, }, /* 507 */
- { 58, 21, 12, 0, 0, }, /* 508 */
- { 58, 12, 3, 0, 0, }, /* 509 */
- { 22, 26, 12, 0, 0, }, /* 510 */
- { 22, 6, 12, 0, 0, }, /* 511 */
- { 22, 14, 12, 0, 0, }, /* 512 */
- { 23, 10, 3, 0, 0, }, /* 513 */
- { 9, 17, 14, 0, 0, }, /* 514 */
- { 26, 7, 12, 0, 0, }, /* 515 */
- { 26, 6, 12, 0, 0, }, /* 516 */
- { 29, 7, 12, 0, 0, }, /* 517 */
- { 29, 6, 12, 0, 0, }, /* 518 */
- { 3, 7, 12, 0, 0, }, /* 519 */
- { 23, 7, 12, 0, 0, }, /* 520 */
- { 23, 26, 12, 0, 0, }, /* 521 */
- { 29, 26, 12, 0, 0, }, /* 522 */
- { 22, 7, 12, 0, 0, }, /* 523 */
- { 60, 7, 12, 0, 0, }, /* 524 */
- { 60, 6, 12, 0, 0, }, /* 525 */
- { 60, 26, 12, 0, 0, }, /* 526 */
- { 85, 7, 12, 0, 0, }, /* 527 */
- { 85, 6, 12, 0, 0, }, /* 528 */
- { 85, 21, 12, 0, 0, }, /* 529 */
- { 76, 7, 12, 0, 0, }, /* 530 */
- { 76, 6, 12, 0, 0, }, /* 531 */
- { 76, 21, 12, 0, 0, }, /* 532 */
- { 76, 13, 12, 0, 0, }, /* 533 */
- { 12, 9, 12, 108, 1, }, /* 534 */
- { 12, 5, 12, 108, -35267, }, /* 535 */
- { 12, 7, 12, 0, 0, }, /* 536 */
- { 12, 21, 12, 0, 0, }, /* 537 */
- { 78, 7, 12, 0, 0, }, /* 538 */
- { 78, 14, 12, 0, 0, }, /* 539 */
- { 78, 12, 3, 0, 0, }, /* 540 */
- { 78, 21, 12, 0, 0, }, /* 541 */
- { 33, 9, 12, 0, -35332, }, /* 542 */
- { 33, 9, 12, 0, -42280, }, /* 543 */
- { 33, 9, 12, 0, -42308, }, /* 544 */
- { 33, 9, 12, 0, -42319, }, /* 545 */
- { 33, 9, 12, 0, -42315, }, /* 546 */
- { 33, 9, 12, 0, -42305, }, /* 547 */
- { 33, 9, 12, 0, -42258, }, /* 548 */
- { 33, 9, 12, 0, -42282, }, /* 549 */
- { 33, 9, 12, 0, -42261, }, /* 550 */
- { 33, 9, 12, 0, 928, }, /* 551 */
- { 48, 7, 12, 0, 0, }, /* 552 */
- { 48, 12, 3, 0, 0, }, /* 553 */
- { 48, 10, 5, 0, 0, }, /* 554 */
- { 48, 26, 12, 0, 0, }, /* 555 */
- { 64, 7, 12, 0, 0, }, /* 556 */
- { 64, 21, 12, 0, 0, }, /* 557 */
- { 74, 10, 5, 0, 0, }, /* 558 */
- { 74, 7, 12, 0, 0, }, /* 559 */
- { 74, 12, 3, 0, 0, }, /* 560 */
- { 74, 21, 12, 0, 0, }, /* 561 */
- { 74, 13, 12, 0, 0, }, /* 562 */
- { 68, 13, 12, 0, 0, }, /* 563 */
- { 68, 7, 12, 0, 0, }, /* 564 */
- { 68, 12, 3, 0, 0, }, /* 565 */
- { 68, 21, 12, 0, 0, }, /* 566 */
- { 73, 7, 12, 0, 0, }, /* 567 */
- { 73, 12, 3, 0, 0, }, /* 568 */
- { 73, 10, 5, 0, 0, }, /* 569 */
- { 73, 21, 12, 0, 0, }, /* 570 */
- { 83, 12, 3, 0, 0, }, /* 571 */
- { 83, 10, 5, 0, 0, }, /* 572 */
- { 83, 7, 12, 0, 0, }, /* 573 */
- { 83, 21, 12, 0, 0, }, /* 574 */
- { 83, 13, 12, 0, 0, }, /* 575 */
- { 38, 6, 12, 0, 0, }, /* 576 */
- { 67, 7, 12, 0, 0, }, /* 577 */
- { 67, 12, 3, 0, 0, }, /* 578 */
- { 67, 10, 5, 0, 0, }, /* 579 */
- { 67, 13, 12, 0, 0, }, /* 580 */
- { 67, 21, 12, 0, 0, }, /* 581 */
- { 91, 7, 12, 0, 0, }, /* 582 */
- { 91, 12, 3, 0, 0, }, /* 583 */
- { 91, 6, 12, 0, 0, }, /* 584 */
- { 91, 21, 12, 0, 0, }, /* 585 */
- { 86, 7, 12, 0, 0, }, /* 586 */
- { 86, 10, 5, 0, 0, }, /* 587 */
- { 86, 12, 3, 0, 0, }, /* 588 */
- { 86, 21, 12, 0, 0, }, /* 589 */
- { 86, 6, 12, 0, 0, }, /* 590 */
- { 33, 5, 12, 0, -928, }, /* 591 */
- { 8, 5, 12, 0, -38864, }, /* 592 */
- { 86, 13, 12, 0, 0, }, /* 593 */
- { 23, 7, 9, 0, 0, }, /* 594 */
- { 23, 7, 10, 0, 0, }, /* 595 */
- { 9, 4, 2, 0, 0, }, /* 596 */
- { 9, 3, 12, 0, 0, }, /* 597 */
- { 25, 25, 12, 0, 0, }, /* 598 */
- { 0, 24, 12, 0, 0, }, /* 599 */
- { 9, 6, 3, 0, 0, }, /* 600 */
- { 35, 7, 12, 0, 0, }, /* 601 */
- { 19, 14, 12, 0, 0, }, /* 602 */
- { 19, 15, 12, 0, 0, }, /* 603 */
- { 19, 26, 12, 0, 0, }, /* 604 */
- { 70, 7, 12, 0, 0, }, /* 605 */
- { 66, 7, 12, 0, 0, }, /* 606 */
- { 41, 7, 12, 0, 0, }, /* 607 */
- { 41, 15, 12, 0, 0, }, /* 608 */
- { 18, 7, 12, 0, 0, }, /* 609 */
- { 18, 14, 12, 0, 0, }, /* 610 */
- { 117, 7, 12, 0, 0, }, /* 611 */
- { 117, 12, 3, 0, 0, }, /* 612 */
- { 59, 7, 12, 0, 0, }, /* 613 */
- { 59, 21, 12, 0, 0, }, /* 614 */
- { 42, 7, 12, 0, 0, }, /* 615 */
- { 42, 21, 12, 0, 0, }, /* 616 */
- { 42, 14, 12, 0, 0, }, /* 617 */
- { 13, 9, 12, 0, 40, }, /* 618 */
- { 13, 5, 12, 0, -40, }, /* 619 */
- { 46, 7, 12, 0, 0, }, /* 620 */
- { 44, 7, 12, 0, 0, }, /* 621 */
- { 44, 13, 12, 0, 0, }, /* 622 */
- { 135, 9, 12, 0, 40, }, /* 623 */
- { 135, 5, 12, 0, -40, }, /* 624 */
- { 105, 7, 12, 0, 0, }, /* 625 */
- { 103, 7, 12, 0, 0, }, /* 626 */
- { 103, 21, 12, 0, 0, }, /* 627 */
- { 109, 7, 12, 0, 0, }, /* 628 */
- { 11, 7, 12, 0, 0, }, /* 629 */
- { 80, 7, 12, 0, 0, }, /* 630 */
- { 80, 21, 12, 0, 0, }, /* 631 */
- { 80, 15, 12, 0, 0, }, /* 632 */
- { 119, 7, 12, 0, 0, }, /* 633 */
- { 119, 26, 12, 0, 0, }, /* 634 */
- { 119, 15, 12, 0, 0, }, /* 635 */
- { 115, 7, 12, 0, 0, }, /* 636 */
- { 115, 15, 12, 0, 0, }, /* 637 */
- { 127, 7, 12, 0, 0, }, /* 638 */
- { 127, 15, 12, 0, 0, }, /* 639 */
- { 65, 7, 12, 0, 0, }, /* 640 */
- { 65, 15, 12, 0, 0, }, /* 641 */
- { 65, 21, 12, 0, 0, }, /* 642 */
- { 71, 7, 12, 0, 0, }, /* 643 */
- { 71, 21, 12, 0, 0, }, /* 644 */
- { 97, 7, 12, 0, 0, }, /* 645 */
- { 96, 7, 12, 0, 0, }, /* 646 */
- { 96, 15, 12, 0, 0, }, /* 647 */
- { 30, 7, 12, 0, 0, }, /* 648 */
- { 30, 12, 3, 0, 0, }, /* 649 */
- { 30, 15, 12, 0, 0, }, /* 650 */
- { 30, 21, 12, 0, 0, }, /* 651 */
- { 87, 7, 12, 0, 0, }, /* 652 */
- { 87, 15, 12, 0, 0, }, /* 653 */
- { 87, 21, 12, 0, 0, }, /* 654 */
- { 116, 7, 12, 0, 0, }, /* 655 */
- { 116, 15, 12, 0, 0, }, /* 656 */
- { 111, 7, 12, 0, 0, }, /* 657 */
- { 111, 26, 12, 0, 0, }, /* 658 */
- { 111, 12, 3, 0, 0, }, /* 659 */
- { 111, 15, 12, 0, 0, }, /* 660 */
- { 111, 21, 12, 0, 0, }, /* 661 */
- { 77, 7, 12, 0, 0, }, /* 662 */
- { 77, 21, 12, 0, 0, }, /* 663 */
- { 82, 7, 12, 0, 0, }, /* 664 */
- { 82, 15, 12, 0, 0, }, /* 665 */
- { 81, 7, 12, 0, 0, }, /* 666 */
- { 81, 15, 12, 0, 0, }, /* 667 */
- { 120, 7, 12, 0, 0, }, /* 668 */
- { 120, 21, 12, 0, 0, }, /* 669 */
- { 120, 15, 12, 0, 0, }, /* 670 */
- { 88, 7, 12, 0, 0, }, /* 671 */
- { 129, 9, 12, 0, 64, }, /* 672 */
- { 129, 5, 12, 0, -64, }, /* 673 */
- { 129, 15, 12, 0, 0, }, /* 674 */
- { 143, 7, 12, 0, 0, }, /* 675 */
- { 143, 12, 3, 0, 0, }, /* 676 */
- { 143, 13, 12, 0, 0, }, /* 677 */
- { 0, 15, 12, 0, 0, }, /* 678 */
- { 146, 7, 12, 0, 0, }, /* 679 */
- { 146, 15, 12, 0, 0, }, /* 680 */
- { 147, 7, 12, 0, 0, }, /* 681 */
- { 147, 12, 3, 0, 0, }, /* 682 */
- { 147, 15, 12, 0, 0, }, /* 683 */
- { 147, 21, 12, 0, 0, }, /* 684 */
- { 93, 10, 5, 0, 0, }, /* 685 */
- { 93, 12, 3, 0, 0, }, /* 686 */
- { 93, 7, 12, 0, 0, }, /* 687 */
- { 93, 21, 12, 0, 0, }, /* 688 */
- { 93, 15, 12, 0, 0, }, /* 689 */
- { 93, 13, 12, 0, 0, }, /* 690 */
- { 84, 12, 3, 0, 0, }, /* 691 */
- { 84, 10, 5, 0, 0, }, /* 692 */
- { 84, 7, 12, 0, 0, }, /* 693 */
- { 84, 21, 12, 0, 0, }, /* 694 */
- { 84, 1, 4, 0, 0, }, /* 695 */
- { 100, 7, 12, 0, 0, }, /* 696 */
- { 100, 13, 12, 0, 0, }, /* 697 */
- { 95, 12, 3, 0, 0, }, /* 698 */
- { 95, 7, 12, 0, 0, }, /* 699 */
- { 95, 10, 5, 0, 0, }, /* 700 */
- { 95, 13, 12, 0, 0, }, /* 701 */
- { 95, 21, 12, 0, 0, }, /* 702 */
- { 110, 7, 12, 0, 0, }, /* 703 */
- { 110, 12, 3, 0, 0, }, /* 704 */
- { 110, 21, 12, 0, 0, }, /* 705 */
- { 99, 12, 3, 0, 0, }, /* 706 */
- { 99, 10, 5, 0, 0, }, /* 707 */
- { 99, 7, 12, 0, 0, }, /* 708 */
- { 99, 7, 4, 0, 0, }, /* 709 */
- { 99, 21, 12, 0, 0, }, /* 710 */
- { 99, 13, 12, 0, 0, }, /* 711 */
- { 47, 15, 12, 0, 0, }, /* 712 */
- { 107, 7, 12, 0, 0, }, /* 713 */
- { 107, 10, 5, 0, 0, }, /* 714 */
- { 107, 12, 3, 0, 0, }, /* 715 */
- { 107, 21, 12, 0, 0, }, /* 716 */
- { 128, 7, 12, 0, 0, }, /* 717 */
- { 128, 21, 12, 0, 0, }, /* 718 */
- { 108, 7, 12, 0, 0, }, /* 719 */
- { 108, 12, 3, 0, 0, }, /* 720 */
- { 108, 10, 5, 0, 0, }, /* 721 */
- { 108, 13, 12, 0, 0, }, /* 722 */
- { 106, 12, 3, 0, 0, }, /* 723 */
- { 106, 10, 5, 0, 0, }, /* 724 */
- { 106, 7, 12, 0, 0, }, /* 725 */
- { 106, 10, 3, 0, 0, }, /* 726 */
- { 134, 7, 12, 0, 0, }, /* 727 */
- { 134, 10, 5, 0, 0, }, /* 728 */
- { 134, 12, 3, 0, 0, }, /* 729 */
- { 134, 21, 12, 0, 0, }, /* 730 */
- { 134, 13, 12, 0, 0, }, /* 731 */
- { 123, 7, 12, 0, 0, }, /* 732 */
- { 123, 10, 3, 0, 0, }, /* 733 */
- { 123, 10, 5, 0, 0, }, /* 734 */
- { 123, 12, 3, 0, 0, }, /* 735 */
- { 123, 21, 12, 0, 0, }, /* 736 */
- { 123, 13, 12, 0, 0, }, /* 737 */
- { 122, 7, 12, 0, 0, }, /* 738 */
- { 122, 10, 3, 0, 0, }, /* 739 */
- { 122, 10, 5, 0, 0, }, /* 740 */
- { 122, 12, 3, 0, 0, }, /* 741 */
- { 122, 21, 12, 0, 0, }, /* 742 */
- { 113, 7, 12, 0, 0, }, /* 743 */
- { 113, 10, 5, 0, 0, }, /* 744 */
- { 113, 12, 3, 0, 0, }, /* 745 */
- { 113, 21, 12, 0, 0, }, /* 746 */
- { 113, 13, 12, 0, 0, }, /* 747 */
- { 101, 7, 12, 0, 0, }, /* 748 */
- { 101, 12, 3, 0, 0, }, /* 749 */
- { 101, 10, 5, 0, 0, }, /* 750 */
- { 101, 13, 12, 0, 0, }, /* 751 */
- { 125, 7, 12, 0, 0, }, /* 752 */
- { 125, 12, 3, 0, 0, }, /* 753 */
- { 125, 10, 5, 0, 0, }, /* 754 */
- { 125, 13, 12, 0, 0, }, /* 755 */
- { 125, 15, 12, 0, 0, }, /* 756 */
- { 125, 21, 12, 0, 0, }, /* 757 */
- { 125, 26, 12, 0, 0, }, /* 758 */
- { 141, 7, 12, 0, 0, }, /* 759 */
- { 141, 10, 5, 0, 0, }, /* 760 */
- { 141, 12, 3, 0, 0, }, /* 761 */
- { 141, 21, 12, 0, 0, }, /* 762 */
- { 124, 9, 12, 0, 32, }, /* 763 */
- { 124, 5, 12, 0, -32, }, /* 764 */
- { 124, 13, 12, 0, 0, }, /* 765 */
- { 124, 15, 12, 0, 0, }, /* 766 */
- { 124, 7, 12, 0, 0, }, /* 767 */
- { 140, 7, 12, 0, 0, }, /* 768 */
- { 140, 12, 3, 0, 0, }, /* 769 */
- { 140, 10, 5, 0, 0, }, /* 770 */
- { 140, 7, 4, 0, 0, }, /* 771 */
- { 140, 21, 12, 0, 0, }, /* 772 */
- { 139, 7, 12, 0, 0, }, /* 773 */
- { 139, 12, 3, 0, 0, }, /* 774 */
- { 139, 10, 5, 0, 0, }, /* 775 */
- { 139, 7, 4, 0, 0, }, /* 776 */
- { 139, 21, 12, 0, 0, }, /* 777 */
- { 121, 7, 12, 0, 0, }, /* 778 */
- { 132, 7, 12, 0, 0, }, /* 779 */
- { 132, 10, 5, 0, 0, }, /* 780 */
- { 132, 12, 3, 0, 0, }, /* 781 */
- { 132, 21, 12, 0, 0, }, /* 782 */
- { 132, 13, 12, 0, 0, }, /* 783 */
- { 132, 15, 12, 0, 0, }, /* 784 */
- { 133, 21, 12, 0, 0, }, /* 785 */
- { 133, 7, 12, 0, 0, }, /* 786 */
- { 133, 12, 3, 0, 0, }, /* 787 */
- { 133, 10, 5, 0, 0, }, /* 788 */
- { 137, 7, 12, 0, 0, }, /* 789 */
- { 137, 12, 3, 0, 0, }, /* 790 */
- { 137, 7, 4, 0, 0, }, /* 791 */
- { 137, 13, 12, 0, 0, }, /* 792 */
- { 142, 7, 12, 0, 0, }, /* 793 */
- { 142, 10, 5, 0, 0, }, /* 794 */
- { 142, 12, 3, 0, 0, }, /* 795 */
- { 142, 13, 12, 0, 0, }, /* 796 */
- { 144, 7, 12, 0, 0, }, /* 797 */
- { 144, 12, 3, 0, 0, }, /* 798 */
- { 144, 10, 5, 0, 0, }, /* 799 */
- { 144, 21, 12, 0, 0, }, /* 800 */
- { 62, 7, 12, 0, 0, }, /* 801 */
- { 62, 14, 12, 0, 0, }, /* 802 */
- { 62, 21, 12, 0, 0, }, /* 803 */
- { 79, 7, 12, 0, 0, }, /* 804 */
- { 126, 7, 12, 0, 0, }, /* 805 */
- { 114, 7, 12, 0, 0, }, /* 806 */
- { 114, 13, 12, 0, 0, }, /* 807 */
- { 114, 21, 12, 0, 0, }, /* 808 */
- { 102, 7, 12, 0, 0, }, /* 809 */
- { 102, 12, 3, 0, 0, }, /* 810 */
- { 102, 21, 12, 0, 0, }, /* 811 */
- { 118, 7, 12, 0, 0, }, /* 812 */
- { 118, 12, 3, 0, 0, }, /* 813 */
- { 118, 21, 12, 0, 0, }, /* 814 */
- { 118, 26, 12, 0, 0, }, /* 815 */
- { 118, 6, 12, 0, 0, }, /* 816 */
- { 118, 13, 12, 0, 0, }, /* 817 */
- { 118, 15, 12, 0, 0, }, /* 818 */
- { 145, 9, 12, 0, 32, }, /* 819 */
- { 145, 5, 12, 0, -32, }, /* 820 */
- { 145, 15, 12, 0, 0, }, /* 821 */
- { 145, 21, 12, 0, 0, }, /* 822 */
- { 98, 7, 12, 0, 0, }, /* 823 */
- { 98, 10, 5, 0, 0, }, /* 824 */
- { 98, 12, 3, 0, 0, }, /* 825 */
- { 98, 6, 12, 0, 0, }, /* 826 */
- { 136, 6, 12, 0, 0, }, /* 827 */
- { 138, 6, 12, 0, 0, }, /* 828 */
- { 136, 7, 12, 0, 0, }, /* 829 */
- { 138, 7, 12, 0, 0, }, /* 830 */
- { 104, 7, 12, 0, 0, }, /* 831 */
- { 104, 26, 12, 0, 0, }, /* 832 */
- { 104, 12, 3, 0, 0, }, /* 833 */
- { 104, 21, 12, 0, 0, }, /* 834 */
- { 9, 10, 3, 0, 0, }, /* 835 */
- { 19, 12, 3, 0, 0, }, /* 836 */
- { 130, 26, 12, 0, 0, }, /* 837 */
- { 130, 12, 3, 0, 0, }, /* 838 */
- { 130, 21, 12, 0, 0, }, /* 839 */
- { 17, 12, 3, 0, 0, }, /* 840 */
- { 112, 7, 12, 0, 0, }, /* 841 */
- { 112, 15, 12, 0, 0, }, /* 842 */
- { 112, 12, 3, 0, 0, }, /* 843 */
- { 131, 9, 12, 0, 34, }, /* 844 */
- { 131, 5, 12, 0, -34, }, /* 845 */
- { 131, 12, 3, 0, 0, }, /* 846 */
- { 131, 13, 12, 0, 0, }, /* 847 */
- { 131, 21, 12, 0, 0, }, /* 848 */
- { 9, 2, 14, 0, 0, }, /* 849 */
- { 9, 26, 11, 0, 0, }, /* 850 */
- { 26, 26, 12, 0, 0, }, /* 851 */
- { 9, 24, 3, 0, 0, }, /* 852 */
- { 9, 1, 3, 0, 0, }, /* 853 */
+ { 10, 0, 2, 0, 0, }, /* 0 */
+ { 10, 0, 1, 0, 0, }, /* 1 */
+ { 10, 0, 0, 0, 0, }, /* 2 */
+ { 10, 29, 12, 0, 0, }, /* 3 */
+ { 10, 21, 12, 0, 0, }, /* 4 */
+ { 10, 23, 12, 0, 0, }, /* 5 */
+ { 10, 22, 12, 0, 0, }, /* 6 */
+ { 10, 18, 12, 0, 0, }, /* 7 */
+ { 10, 25, 12, 0, 0, }, /* 8 */
+ { 10, 17, 12, 0, 0, }, /* 9 */
+ { 10, 13, 12, 0, 0, }, /* 10 */
+ { 34, 9, 12, 0, 32, }, /* 11 */
+ { 34, 9, 12, 100, 32, }, /* 12 */
+ { 34, 9, 12, 1, 32, }, /* 13 */
+ { 10, 24, 12, 0, 0, }, /* 14 */
+ { 10, 16, 12, 0, 0, }, /* 15 */
+ { 34, 5, 12, 0, -32, }, /* 16 */
+ { 34, 5, 12, 100, -32, }, /* 17 */
+ { 34, 5, 12, 1, -32, }, /* 18 */
+ { 10, 26, 12, 0, 0, }, /* 19 */
+ { 10, 26, 14, 0, 0, }, /* 20 */
+ { 34, 7, 12, 0, 0, }, /* 21 */
+ { 10, 20, 12, 0, 0, }, /* 22 */
+ { 10, 1, 2, 0, 0, }, /* 23 */
+ { 10, 15, 12, 0, 0, }, /* 24 */
+ { 10, 5, 12, 26, 775, }, /* 25 */
+ { 10, 19, 12, 0, 0, }, /* 26 */
+ { 34, 9, 12, 104, 32, }, /* 27 */
+ { 34, 5, 12, 0, 7615, }, /* 28 */
+ { 34, 5, 12, 104, -32, }, /* 29 */
+ { 34, 5, 12, 0, 121, }, /* 30 */
+ { 34, 9, 12, 0, 1, }, /* 31 */
+ { 34, 5, 12, 0, -1, }, /* 32 */
+ { 34, 9, 12, 0, 0, }, /* 33 */
+ { 34, 5, 12, 0, 0, }, /* 34 */
+ { 34, 9, 12, 0, -121, }, /* 35 */
+ { 34, 5, 12, 1, -268, }, /* 36 */
+ { 34, 5, 12, 0, 195, }, /* 37 */
+ { 34, 9, 12, 0, 210, }, /* 38 */
+ { 34, 9, 12, 0, 206, }, /* 39 */
+ { 34, 9, 12, 0, 205, }, /* 40 */
+ { 34, 9, 12, 0, 79, }, /* 41 */
+ { 34, 9, 12, 0, 202, }, /* 42 */
+ { 34, 9, 12, 0, 203, }, /* 43 */
+ { 34, 9, 12, 0, 207, }, /* 44 */
+ { 34, 5, 12, 0, 97, }, /* 45 */
+ { 34, 9, 12, 0, 211, }, /* 46 */
+ { 34, 9, 12, 0, 209, }, /* 47 */
+ { 34, 5, 12, 0, 163, }, /* 48 */
+ { 34, 9, 12, 0, 213, }, /* 49 */
+ { 34, 5, 12, 0, 130, }, /* 50 */
+ { 34, 9, 12, 0, 214, }, /* 51 */
+ { 34, 9, 12, 0, 218, }, /* 52 */
+ { 34, 9, 12, 0, 217, }, /* 53 */
+ { 34, 9, 12, 0, 219, }, /* 54 */
+ { 34, 5, 12, 0, 56, }, /* 55 */
+ { 34, 9, 12, 5, 2, }, /* 56 */
+ { 34, 8, 12, 5, 1, }, /* 57 */
+ { 34, 5, 12, 5, -2, }, /* 58 */
+ { 34, 9, 12, 9, 2, }, /* 59 */
+ { 34, 8, 12, 9, 1, }, /* 60 */
+ { 34, 5, 12, 9, -2, }, /* 61 */
+ { 34, 9, 12, 13, 2, }, /* 62 */
+ { 34, 8, 12, 13, 1, }, /* 63 */
+ { 34, 5, 12, 13, -2, }, /* 64 */
+ { 34, 5, 12, 0, -79, }, /* 65 */
+ { 34, 9, 12, 17, 2, }, /* 66 */
+ { 34, 8, 12, 17, 1, }, /* 67 */
+ { 34, 5, 12, 17, -2, }, /* 68 */
+ { 34, 9, 12, 0, -97, }, /* 69 */
+ { 34, 9, 12, 0, -56, }, /* 70 */
+ { 34, 9, 12, 0, -130, }, /* 71 */
+ { 34, 9, 12, 0, 10795, }, /* 72 */
+ { 34, 9, 12, 0, -163, }, /* 73 */
+ { 34, 9, 12, 0, 10792, }, /* 74 */
+ { 34, 5, 12, 0, 10815, }, /* 75 */
+ { 34, 9, 12, 0, -195, }, /* 76 */
+ { 34, 9, 12, 0, 69, }, /* 77 */
+ { 34, 9, 12, 0, 71, }, /* 78 */
+ { 34, 5, 12, 0, 10783, }, /* 79 */
+ { 34, 5, 12, 0, 10780, }, /* 80 */
+ { 34, 5, 12, 0, 10782, }, /* 81 */
+ { 34, 5, 12, 0, -210, }, /* 82 */
+ { 34, 5, 12, 0, -206, }, /* 83 */
+ { 34, 5, 12, 0, -205, }, /* 84 */
+ { 34, 5, 12, 0, -202, }, /* 85 */
+ { 34, 5, 12, 0, -203, }, /* 86 */
+ { 34, 5, 12, 0, 42319, }, /* 87 */
+ { 34, 5, 12, 0, 42315, }, /* 88 */
+ { 34, 5, 12, 0, -207, }, /* 89 */
+ { 34, 5, 12, 0, 42280, }, /* 90 */
+ { 34, 5, 12, 0, 42308, }, /* 91 */
+ { 34, 5, 12, 0, -209, }, /* 92 */
+ { 34, 5, 12, 0, -211, }, /* 93 */
+ { 34, 5, 12, 0, 10743, }, /* 94 */
+ { 34, 5, 12, 0, 42305, }, /* 95 */
+ { 34, 5, 12, 0, 10749, }, /* 96 */
+ { 34, 5, 12, 0, -213, }, /* 97 */
+ { 34, 5, 12, 0, -214, }, /* 98 */
+ { 34, 5, 12, 0, 10727, }, /* 99 */
+ { 34, 5, 12, 0, -218, }, /* 100 */
+ { 34, 5, 12, 0, 42282, }, /* 101 */
+ { 34, 5, 12, 0, -69, }, /* 102 */
+ { 34, 5, 12, 0, -217, }, /* 103 */
+ { 34, 5, 12, 0, -71, }, /* 104 */
+ { 34, 5, 12, 0, -219, }, /* 105 */
+ { 34, 5, 12, 0, 42261, }, /* 106 */
+ { 34, 5, 12, 0, 42258, }, /* 107 */
+ { 34, 6, 12, 0, 0, }, /* 108 */
+ { 10, 6, 12, 0, 0, }, /* 109 */
+ { 4, 24, 12, 0, 0, }, /* 110 */
+ { 28, 12, 3, 0, 0, }, /* 111 */
+ { 28, 12, 3, 21, 116, }, /* 112 */
+ { 20, 9, 12, 0, 1, }, /* 113 */
+ { 20, 5, 12, 0, -1, }, /* 114 */
+ { 20, 24, 12, 0, 0, }, /* 115 */
+ { 0, 2, 12, 0, 0, }, /* 116 */
+ { 20, 6, 12, 0, 0, }, /* 117 */
+ { 20, 5, 12, 0, 130, }, /* 118 */
+ { 20, 9, 12, 0, 116, }, /* 119 */
+ { 20, 9, 12, 0, 38, }, /* 120 */
+ { 20, 9, 12, 0, 37, }, /* 121 */
+ { 20, 9, 12, 0, 64, }, /* 122 */
+ { 20, 9, 12, 0, 63, }, /* 123 */
+ { 20, 5, 12, 0, 0, }, /* 124 */
+ { 20, 9, 12, 0, 32, }, /* 125 */
+ { 20, 9, 12, 34, 32, }, /* 126 */
+ { 20, 9, 12, 59, 32, }, /* 127 */
+ { 20, 9, 12, 38, 32, }, /* 128 */
+ { 20, 9, 12, 21, 32, }, /* 129 */
+ { 20, 9, 12, 51, 32, }, /* 130 */
+ { 20, 9, 12, 26, 32, }, /* 131 */
+ { 20, 9, 12, 47, 32, }, /* 132 */
+ { 20, 9, 12, 55, 32, }, /* 133 */
+ { 20, 9, 12, 30, 32, }, /* 134 */
+ { 20, 9, 12, 43, 32, }, /* 135 */
+ { 20, 9, 12, 96, 32, }, /* 136 */
+ { 20, 5, 12, 0, -38, }, /* 137 */
+ { 20, 5, 12, 0, -37, }, /* 138 */
+ { 20, 5, 12, 0, -32, }, /* 139 */
+ { 20, 5, 12, 34, -32, }, /* 140 */
+ { 20, 5, 12, 59, -32, }, /* 141 */
+ { 20, 5, 12, 38, -32, }, /* 142 */
+ { 20, 5, 12, 21, -116, }, /* 143 */
+ { 20, 5, 12, 51, -32, }, /* 144 */
+ { 20, 5, 12, 26, -775, }, /* 145 */
+ { 20, 5, 12, 47, -32, }, /* 146 */
+ { 20, 5, 12, 55, -32, }, /* 147 */
+ { 20, 5, 12, 30, 1, }, /* 148 */
+ { 20, 5, 12, 30, -32, }, /* 149 */
+ { 20, 5, 12, 43, -32, }, /* 150 */
+ { 20, 5, 12, 96, -32, }, /* 151 */
+ { 20, 5, 12, 0, -64, }, /* 152 */
+ { 20, 5, 12, 0, -63, }, /* 153 */
+ { 20, 9, 12, 0, 8, }, /* 154 */
+ { 20, 5, 12, 34, -30, }, /* 155 */
+ { 20, 5, 12, 38, -25, }, /* 156 */
+ { 20, 9, 12, 0, 0, }, /* 157 */
+ { 20, 5, 12, 43, -15, }, /* 158 */
+ { 20, 5, 12, 47, -22, }, /* 159 */
+ { 20, 5, 12, 0, -8, }, /* 160 */
+ { 11, 9, 12, 0, 1, }, /* 161 */
+ { 11, 5, 12, 0, -1, }, /* 162 */
+ { 20, 5, 12, 51, -54, }, /* 163 */
+ { 20, 5, 12, 55, -48, }, /* 164 */
+ { 20, 5, 12, 0, 7, }, /* 165 */
+ { 20, 5, 12, 0, -116, }, /* 166 */
+ { 20, 9, 12, 38, -60, }, /* 167 */
+ { 20, 5, 12, 59, -64, }, /* 168 */
+ { 20, 25, 12, 0, 0, }, /* 169 */
+ { 20, 9, 12, 0, -7, }, /* 170 */
+ { 20, 9, 12, 0, -130, }, /* 171 */
+ { 13, 9, 12, 0, 80, }, /* 172 */
+ { 13, 9, 12, 0, 32, }, /* 173 */
+ { 13, 9, 12, 63, 32, }, /* 174 */
+ { 13, 9, 12, 67, 32, }, /* 175 */
+ { 13, 9, 12, 71, 32, }, /* 176 */
+ { 13, 9, 12, 75, 32, }, /* 177 */
+ { 13, 9, 12, 79, 32, }, /* 178 */
+ { 13, 9, 12, 84, 32, }, /* 179 */
+ { 13, 5, 12, 0, -32, }, /* 180 */
+ { 13, 5, 12, 63, -32, }, /* 181 */
+ { 13, 5, 12, 67, -32, }, /* 182 */
+ { 13, 5, 12, 71, -32, }, /* 183 */
+ { 13, 5, 12, 75, -32, }, /* 184 */
+ { 13, 5, 12, 79, -32, }, /* 185 */
+ { 13, 5, 12, 84, -32, }, /* 186 */
+ { 13, 5, 12, 0, -80, }, /* 187 */
+ { 13, 9, 12, 0, 1, }, /* 188 */
+ { 13, 5, 12, 0, -1, }, /* 189 */
+ { 13, 9, 12, 88, 1, }, /* 190 */
+ { 13, 5, 12, 88, -1, }, /* 191 */
+ { 13, 26, 12, 0, 0, }, /* 192 */
+ { 13, 12, 3, 0, 0, }, /* 193 */
+ { 13, 11, 3, 0, 0, }, /* 194 */
+ { 13, 9, 12, 0, 15, }, /* 195 */
+ { 13, 5, 12, 0, -15, }, /* 196 */
+ { 2, 9, 12, 0, 48, }, /* 197 */
+ { 2, 6, 12, 0, 0, }, /* 198 */
+ { 2, 21, 12, 0, 0, }, /* 199 */
+ { 2, 5, 12, 0, 0, }, /* 200 */
+ { 2, 5, 12, 0, -48, }, /* 201 */
+ { 2, 17, 12, 0, 0, }, /* 202 */
+ { 2, 26, 12, 0, 0, }, /* 203 */
+ { 2, 23, 12, 0, 0, }, /* 204 */
+ { 26, 12, 3, 0, 0, }, /* 205 */
+ { 26, 17, 12, 0, 0, }, /* 206 */
+ { 26, 21, 12, 0, 0, }, /* 207 */
+ { 26, 7, 12, 0, 0, }, /* 208 */
+ { 1, 1, 4, 0, 0, }, /* 209 */
+ { 10, 1, 4, 0, 0, }, /* 210 */
+ { 1, 25, 12, 0, 0, }, /* 211 */
+ { 1, 21, 12, 0, 0, }, /* 212 */
+ { 1, 23, 12, 0, 0, }, /* 213 */
+ { 1, 26, 12, 0, 0, }, /* 214 */
+ { 1, 12, 3, 0, 0, }, /* 215 */
+ { 1, 1, 2, 0, 0, }, /* 216 */
+ { 1, 7, 12, 0, 0, }, /* 217 */
+ { 1, 13, 12, 0, 0, }, /* 218 */
+ { 1, 6, 12, 0, 0, }, /* 219 */
+ { 50, 21, 12, 0, 0, }, /* 220 */
+ { 50, 1, 4, 0, 0, }, /* 221 */
+ { 50, 7, 12, 0, 0, }, /* 222 */
+ { 50, 12, 3, 0, 0, }, /* 223 */
+ { 56, 7, 12, 0, 0, }, /* 224 */
+ { 56, 12, 3, 0, 0, }, /* 225 */
+ { 64, 13, 12, 0, 0, }, /* 226 */
+ { 64, 7, 12, 0, 0, }, /* 227 */
+ { 64, 12, 3, 0, 0, }, /* 228 */
+ { 64, 6, 12, 0, 0, }, /* 229 */
+ { 64, 26, 12, 0, 0, }, /* 230 */
+ { 64, 21, 12, 0, 0, }, /* 231 */
+ { 64, 23, 12, 0, 0, }, /* 232 */
+ { 90, 7, 12, 0, 0, }, /* 233 */
+ { 90, 12, 3, 0, 0, }, /* 234 */
+ { 90, 6, 12, 0, 0, }, /* 235 */
+ { 90, 21, 12, 0, 0, }, /* 236 */
+ { 95, 7, 12, 0, 0, }, /* 237 */
+ { 95, 12, 3, 0, 0, }, /* 238 */
+ { 95, 21, 12, 0, 0, }, /* 239 */
+ { 15, 12, 3, 0, 0, }, /* 240 */
+ { 15, 10, 5, 0, 0, }, /* 241 */
+ { 15, 7, 12, 0, 0, }, /* 242 */
+ { 15, 13, 12, 0, 0, }, /* 243 */
+ { 15, 21, 12, 0, 0, }, /* 244 */
+ { 15, 6, 12, 0, 0, }, /* 245 */
+ { 3, 7, 12, 0, 0, }, /* 246 */
+ { 3, 12, 3, 0, 0, }, /* 247 */
+ { 3, 10, 5, 0, 0, }, /* 248 */
+ { 3, 10, 3, 0, 0, }, /* 249 */
+ { 3, 13, 12, 0, 0, }, /* 250 */
+ { 3, 23, 12, 0, 0, }, /* 251 */
+ { 3, 15, 12, 0, 0, }, /* 252 */
+ { 3, 26, 12, 0, 0, }, /* 253 */
+ { 3, 21, 12, 0, 0, }, /* 254 */
+ { 22, 12, 3, 0, 0, }, /* 255 */
+ { 22, 10, 5, 0, 0, }, /* 256 */
+ { 22, 7, 12, 0, 0, }, /* 257 */
+ { 22, 13, 12, 0, 0, }, /* 258 */
+ { 22, 21, 12, 0, 0, }, /* 259 */
+ { 21, 12, 3, 0, 0, }, /* 260 */
+ { 21, 10, 5, 0, 0, }, /* 261 */
+ { 21, 7, 12, 0, 0, }, /* 262 */
+ { 21, 13, 12, 0, 0, }, /* 263 */
+ { 21, 21, 12, 0, 0, }, /* 264 */
+ { 21, 23, 12, 0, 0, }, /* 265 */
+ { 44, 12, 3, 0, 0, }, /* 266 */
+ { 44, 10, 5, 0, 0, }, /* 267 */
+ { 44, 7, 12, 0, 0, }, /* 268 */
+ { 44, 10, 3, 0, 0, }, /* 269 */
+ { 44, 13, 12, 0, 0, }, /* 270 */
+ { 44, 26, 12, 0, 0, }, /* 271 */
+ { 44, 15, 12, 0, 0, }, /* 272 */
+ { 54, 12, 3, 0, 0, }, /* 273 */
+ { 54, 7, 12, 0, 0, }, /* 274 */
+ { 54, 10, 3, 0, 0, }, /* 275 */
+ { 54, 10, 5, 0, 0, }, /* 276 */
+ { 54, 13, 12, 0, 0, }, /* 277 */
+ { 54, 15, 12, 0, 0, }, /* 278 */
+ { 54, 26, 12, 0, 0, }, /* 279 */
+ { 54, 23, 12, 0, 0, }, /* 280 */
+ { 55, 12, 3, 0, 0, }, /* 281 */
+ { 55, 10, 5, 0, 0, }, /* 282 */
+ { 55, 7, 12, 0, 0, }, /* 283 */
+ { 55, 13, 12, 0, 0, }, /* 284 */
+ { 55, 15, 12, 0, 0, }, /* 285 */
+ { 55, 26, 12, 0, 0, }, /* 286 */
+ { 29, 7, 12, 0, 0, }, /* 287 */
+ { 29, 12, 3, 0, 0, }, /* 288 */
+ { 29, 10, 5, 0, 0, }, /* 289 */
+ { 29, 21, 12, 0, 0, }, /* 290 */
+ { 29, 10, 3, 0, 0, }, /* 291 */
+ { 29, 13, 12, 0, 0, }, /* 292 */
+ { 37, 12, 3, 0, 0, }, /* 293 */
+ { 37, 10, 5, 0, 0, }, /* 294 */
+ { 37, 7, 12, 0, 0, }, /* 295 */
+ { 37, 10, 3, 0, 0, }, /* 296 */
+ { 37, 7, 4, 0, 0, }, /* 297 */
+ { 37, 26, 12, 0, 0, }, /* 298 */
+ { 37, 15, 12, 0, 0, }, /* 299 */
+ { 37, 13, 12, 0, 0, }, /* 300 */
+ { 48, 10, 5, 0, 0, }, /* 301 */
+ { 48, 7, 12, 0, 0, }, /* 302 */
+ { 48, 12, 3, 0, 0, }, /* 303 */
+ { 48, 10, 3, 0, 0, }, /* 304 */
+ { 48, 13, 12, 0, 0, }, /* 305 */
+ { 48, 21, 12, 0, 0, }, /* 306 */
+ { 57, 7, 12, 0, 0, }, /* 307 */
+ { 57, 12, 3, 0, 0, }, /* 308 */
+ { 57, 7, 5, 0, 0, }, /* 309 */
+ { 57, 6, 12, 0, 0, }, /* 310 */
+ { 57, 21, 12, 0, 0, }, /* 311 */
+ { 57, 13, 12, 0, 0, }, /* 312 */
+ { 33, 7, 12, 0, 0, }, /* 313 */
+ { 33, 12, 3, 0, 0, }, /* 314 */
+ { 33, 7, 5, 0, 0, }, /* 315 */
+ { 33, 6, 12, 0, 0, }, /* 316 */
+ { 33, 13, 12, 0, 0, }, /* 317 */
+ { 58, 7, 12, 0, 0, }, /* 318 */
+ { 58, 26, 12, 0, 0, }, /* 319 */
+ { 58, 21, 12, 0, 0, }, /* 320 */
+ { 58, 12, 3, 0, 0, }, /* 321 */
+ { 58, 13, 12, 0, 0, }, /* 322 */
+ { 58, 15, 12, 0, 0, }, /* 323 */
+ { 58, 22, 12, 0, 0, }, /* 324 */
+ { 58, 18, 12, 0, 0, }, /* 325 */
+ { 58, 10, 5, 0, 0, }, /* 326 */
+ { 39, 7, 12, 0, 0, }, /* 327 */
+ { 39, 10, 12, 0, 0, }, /* 328 */
+ { 39, 12, 3, 0, 0, }, /* 329 */
+ { 39, 10, 5, 0, 0, }, /* 330 */
+ { 39, 13, 12, 0, 0, }, /* 331 */
+ { 39, 21, 12, 0, 0, }, /* 332 */
+ { 39, 26, 12, 0, 0, }, /* 333 */
+ { 17, 9, 12, 0, 7264, }, /* 334 */
+ { 17, 5, 12, 0, 3008, }, /* 335 */
+ { 17, 6, 12, 0, 0, }, /* 336 */
+ { 24, 7, 6, 0, 0, }, /* 337 */
+ { 24, 7, 7, 0, 0, }, /* 338 */
+ { 24, 7, 8, 0, 0, }, /* 339 */
+ { 16, 7, 12, 0, 0, }, /* 340 */
+ { 16, 12, 3, 0, 0, }, /* 341 */
+ { 16, 21, 12, 0, 0, }, /* 342 */
+ { 16, 15, 12, 0, 0, }, /* 343 */
+ { 16, 26, 12, 0, 0, }, /* 344 */
+ { 9, 9, 12, 0, 38864, }, /* 345 */
+ { 9, 9, 12, 0, 8, }, /* 346 */
+ { 9, 5, 12, 0, -8, }, /* 347 */
+ { 8, 17, 12, 0, 0, }, /* 348 */
+ { 8, 7, 12, 0, 0, }, /* 349 */
+ { 8, 21, 12, 0, 0, }, /* 350 */
+ { 41, 29, 12, 0, 0, }, /* 351 */
+ { 41, 7, 12, 0, 0, }, /* 352 */
+ { 41, 22, 12, 0, 0, }, /* 353 */
+ { 41, 18, 12, 0, 0, }, /* 354 */
+ { 46, 7, 12, 0, 0, }, /* 355 */
+ { 46, 14, 12, 0, 0, }, /* 356 */
+ { 51, 7, 12, 0, 0, }, /* 357 */
+ { 51, 12, 3, 0, 0, }, /* 358 */
+ { 25, 7, 12, 0, 0, }, /* 359 */
+ { 25, 12, 3, 0, 0, }, /* 360 */
+ { 7, 7, 12, 0, 0, }, /* 361 */
+ { 7, 12, 3, 0, 0, }, /* 362 */
+ { 52, 7, 12, 0, 0, }, /* 363 */
+ { 52, 12, 3, 0, 0, }, /* 364 */
+ { 32, 7, 12, 0, 0, }, /* 365 */
+ { 32, 12, 3, 0, 0, }, /* 366 */
+ { 32, 10, 5, 0, 0, }, /* 367 */
+ { 32, 21, 12, 0, 0, }, /* 368 */
+ { 32, 6, 12, 0, 0, }, /* 369 */
+ { 32, 23, 12, 0, 0, }, /* 370 */
+ { 32, 13, 12, 0, 0, }, /* 371 */
+ { 32, 15, 12, 0, 0, }, /* 372 */
+ { 38, 21, 12, 0, 0, }, /* 373 */
+ { 38, 17, 12, 0, 0, }, /* 374 */
+ { 38, 12, 3, 0, 0, }, /* 375 */
+ { 38, 1, 2, 0, 0, }, /* 376 */
+ { 38, 13, 12, 0, 0, }, /* 377 */
+ { 38, 7, 12, 0, 0, }, /* 378 */
+ { 38, 6, 12, 0, 0, }, /* 379 */
+ { 35, 7, 12, 0, 0, }, /* 380 */
+ { 35, 12, 3, 0, 0, }, /* 381 */
+ { 35, 10, 5, 0, 0, }, /* 382 */
+ { 35, 26, 12, 0, 0, }, /* 383 */
+ { 35, 21, 12, 0, 0, }, /* 384 */
+ { 35, 13, 12, 0, 0, }, /* 385 */
+ { 53, 7, 12, 0, 0, }, /* 386 */
+ { 40, 7, 12, 0, 0, }, /* 387 */
+ { 40, 13, 12, 0, 0, }, /* 388 */
+ { 40, 15, 12, 0, 0, }, /* 389 */
+ { 40, 26, 12, 0, 0, }, /* 390 */
+ { 32, 26, 12, 0, 0, }, /* 391 */
+ { 6, 7, 12, 0, 0, }, /* 392 */
+ { 6, 12, 3, 0, 0, }, /* 393 */
+ { 6, 10, 5, 0, 0, }, /* 394 */
+ { 6, 21, 12, 0, 0, }, /* 395 */
+ { 91, 7, 12, 0, 0, }, /* 396 */
+ { 91, 10, 5, 0, 0, }, /* 397 */
+ { 91, 12, 3, 0, 0, }, /* 398 */
+ { 91, 10, 12, 0, 0, }, /* 399 */
+ { 91, 13, 12, 0, 0, }, /* 400 */
+ { 91, 21, 12, 0, 0, }, /* 401 */
+ { 91, 6, 12, 0, 0, }, /* 402 */
+ { 28, 11, 3, 0, 0, }, /* 403 */
+ { 62, 12, 3, 0, 0, }, /* 404 */
+ { 62, 10, 5, 0, 0, }, /* 405 */
+ { 62, 7, 12, 0, 0, }, /* 406 */
+ { 62, 13, 12, 0, 0, }, /* 407 */
+ { 62, 21, 12, 0, 0, }, /* 408 */
+ { 62, 26, 12, 0, 0, }, /* 409 */
+ { 76, 12, 3, 0, 0, }, /* 410 */
+ { 76, 10, 5, 0, 0, }, /* 411 */
+ { 76, 7, 12, 0, 0, }, /* 412 */
+ { 76, 13, 12, 0, 0, }, /* 413 */
+ { 93, 7, 12, 0, 0, }, /* 414 */
+ { 93, 12, 3, 0, 0, }, /* 415 */
+ { 93, 10, 5, 0, 0, }, /* 416 */
+ { 93, 21, 12, 0, 0, }, /* 417 */
+ { 70, 7, 12, 0, 0, }, /* 418 */
+ { 70, 10, 5, 0, 0, }, /* 419 */
+ { 70, 12, 3, 0, 0, }, /* 420 */
+ { 70, 21, 12, 0, 0, }, /* 421 */
+ { 70, 13, 12, 0, 0, }, /* 422 */
+ { 73, 13, 12, 0, 0, }, /* 423 */
+ { 73, 7, 12, 0, 0, }, /* 424 */
+ { 73, 6, 12, 0, 0, }, /* 425 */
+ { 73, 21, 12, 0, 0, }, /* 426 */
+ { 13, 5, 12, 63, -6222, }, /* 427 */
+ { 13, 5, 12, 67, -6221, }, /* 428 */
+ { 13, 5, 12, 71, -6212, }, /* 429 */
+ { 13, 5, 12, 75, -6210, }, /* 430 */
+ { 13, 5, 12, 79, -6210, }, /* 431 */
+ { 13, 5, 12, 79, -6211, }, /* 432 */
+ { 13, 5, 12, 84, -6204, }, /* 433 */
+ { 13, 5, 12, 88, -6180, }, /* 434 */
+ { 13, 5, 12, 108, 35267, }, /* 435 */
+ { 17, 9, 12, 0, -3008, }, /* 436 */
+ { 76, 21, 12, 0, 0, }, /* 437 */
+ { 10, 10, 5, 0, 0, }, /* 438 */
+ { 10, 7, 12, 0, 0, }, /* 439 */
+ { 13, 5, 12, 0, 0, }, /* 440 */
+ { 13, 6, 12, 0, 0, }, /* 441 */
+ { 34, 5, 12, 0, 35332, }, /* 442 */
+ { 34, 5, 12, 0, 3814, }, /* 443 */
+ { 34, 9, 12, 92, 1, }, /* 444 */
+ { 34, 5, 12, 92, -1, }, /* 445 */
+ { 34, 5, 12, 92, -58, }, /* 446 */
+ { 34, 9, 12, 0, -7615, }, /* 447 */
+ { 20, 5, 12, 0, 8, }, /* 448 */
+ { 20, 9, 12, 0, -8, }, /* 449 */
+ { 20, 5, 12, 0, 74, }, /* 450 */
+ { 20, 5, 12, 0, 86, }, /* 451 */
+ { 20, 5, 12, 0, 100, }, /* 452 */
+ { 20, 5, 12, 0, 128, }, /* 453 */
+ { 20, 5, 12, 0, 112, }, /* 454 */
+ { 20, 5, 12, 0, 126, }, /* 455 */
+ { 20, 8, 12, 0, -8, }, /* 456 */
+ { 20, 5, 12, 0, 9, }, /* 457 */
+ { 20, 9, 12, 0, -74, }, /* 458 */
+ { 20, 8, 12, 0, -9, }, /* 459 */
+ { 20, 5, 12, 21, -7173, }, /* 460 */
+ { 20, 9, 12, 0, -86, }, /* 461 */
+ { 20, 9, 12, 0, -100, }, /* 462 */
+ { 20, 9, 12, 0, -112, }, /* 463 */
+ { 20, 9, 12, 0, -128, }, /* 464 */
+ { 20, 9, 12, 0, -126, }, /* 465 */
+ { 28, 1, 3, 0, 0, }, /* 466 */
+ { 28, 1, 13, 0, 0, }, /* 467 */
+ { 10, 27, 2, 0, 0, }, /* 468 */
+ { 10, 28, 2, 0, 0, }, /* 469 */
+ { 10, 21, 14, 0, 0, }, /* 470 */
+ { 0, 2, 2, 0, 0, }, /* 471 */
+ { 10, 9, 12, 0, 0, }, /* 472 */
+ { 10, 5, 12, 0, 0, }, /* 473 */
+ { 20, 9, 12, 96, -7517, }, /* 474 */
+ { 34, 9, 12, 100, -8383, }, /* 475 */
+ { 34, 9, 12, 104, -8262, }, /* 476 */
+ { 34, 9, 12, 0, 28, }, /* 477 */
+ { 10, 5, 14, 0, 0, }, /* 478 */
+ { 34, 5, 12, 0, -28, }, /* 479 */
+ { 34, 14, 12, 0, 16, }, /* 480 */
+ { 34, 14, 12, 0, -16, }, /* 481 */
+ { 34, 14, 12, 0, 0, }, /* 482 */
+ { 10, 25, 14, 0, 0, }, /* 483 */
+ { 10, 26, 12, 0, 26, }, /* 484 */
+ { 10, 26, 14, 0, 26, }, /* 485 */
+ { 10, 26, 12, 0, -26, }, /* 486 */
+ { 5, 26, 12, 0, 0, }, /* 487 */
+ { 18, 9, 12, 0, 48, }, /* 488 */
+ { 18, 5, 12, 0, -48, }, /* 489 */
+ { 34, 9, 12, 0, -10743, }, /* 490 */
+ { 34, 9, 12, 0, -3814, }, /* 491 */
+ { 34, 9, 12, 0, -10727, }, /* 492 */
+ { 34, 5, 12, 0, -10795, }, /* 493 */
+ { 34, 5, 12, 0, -10792, }, /* 494 */
+ { 34, 9, 12, 0, -10780, }, /* 495 */
+ { 34, 9, 12, 0, -10749, }, /* 496 */
+ { 34, 9, 12, 0, -10783, }, /* 497 */
+ { 34, 9, 12, 0, -10782, }, /* 498 */
+ { 34, 9, 12, 0, -10815, }, /* 499 */
+ { 11, 5, 12, 0, 0, }, /* 500 */
+ { 11, 26, 12, 0, 0, }, /* 501 */
+ { 11, 12, 3, 0, 0, }, /* 502 */
+ { 11, 21, 12, 0, 0, }, /* 503 */
+ { 11, 15, 12, 0, 0, }, /* 504 */
+ { 17, 5, 12, 0, -7264, }, /* 505 */
+ { 59, 7, 12, 0, 0, }, /* 506 */
+ { 59, 6, 12, 0, 0, }, /* 507 */
+ { 59, 21, 12, 0, 0, }, /* 508 */
+ { 59, 12, 3, 0, 0, }, /* 509 */
+ { 23, 26, 12, 0, 0, }, /* 510 */
+ { 23, 6, 12, 0, 0, }, /* 511 */
+ { 23, 14, 12, 0, 0, }, /* 512 */
+ { 24, 10, 3, 0, 0, }, /* 513 */
+ { 10, 17, 14, 0, 0, }, /* 514 */
+ { 27, 7, 12, 0, 0, }, /* 515 */
+ { 27, 6, 12, 0, 0, }, /* 516 */
+ { 30, 7, 12, 0, 0, }, /* 517 */
+ { 30, 6, 12, 0, 0, }, /* 518 */
+ { 4, 7, 12, 0, 0, }, /* 519 */
+ { 24, 7, 12, 0, 0, }, /* 520 */
+ { 24, 26, 12, 0, 0, }, /* 521 */
+ { 30, 26, 12, 0, 0, }, /* 522 */
+ { 23, 7, 12, 0, 0, }, /* 523 */
+ { 61, 7, 12, 0, 0, }, /* 524 */
+ { 61, 6, 12, 0, 0, }, /* 525 */
+ { 61, 26, 12, 0, 0, }, /* 526 */
+ { 86, 7, 12, 0, 0, }, /* 527 */
+ { 86, 6, 12, 0, 0, }, /* 528 */
+ { 86, 21, 12, 0, 0, }, /* 529 */
+ { 77, 7, 12, 0, 0, }, /* 530 */
+ { 77, 6, 12, 0, 0, }, /* 531 */
+ { 77, 21, 12, 0, 0, }, /* 532 */
+ { 77, 13, 12, 0, 0, }, /* 533 */
+ { 13, 9, 12, 108, 1, }, /* 534 */
+ { 13, 5, 12, 108, -35267, }, /* 535 */
+ { 13, 7, 12, 0, 0, }, /* 536 */
+ { 13, 21, 12, 0, 0, }, /* 537 */
+ { 79, 7, 12, 0, 0, }, /* 538 */
+ { 79, 14, 12, 0, 0, }, /* 539 */
+ { 79, 12, 3, 0, 0, }, /* 540 */
+ { 79, 21, 12, 0, 0, }, /* 541 */
+ { 34, 9, 12, 0, -35332, }, /* 542 */
+ { 34, 9, 12, 0, -42280, }, /* 543 */
+ { 34, 9, 12, 0, -42308, }, /* 544 */
+ { 34, 9, 12, 0, -42319, }, /* 545 */
+ { 34, 9, 12, 0, -42315, }, /* 546 */
+ { 34, 9, 12, 0, -42305, }, /* 547 */
+ { 34, 9, 12, 0, -42258, }, /* 548 */
+ { 34, 9, 12, 0, -42282, }, /* 549 */
+ { 34, 9, 12, 0, -42261, }, /* 550 */
+ { 34, 9, 12, 0, 928, }, /* 551 */
+ { 49, 7, 12, 0, 0, }, /* 552 */
+ { 49, 12, 3, 0, 0, }, /* 553 */
+ { 49, 10, 5, 0, 0, }, /* 554 */
+ { 49, 26, 12, 0, 0, }, /* 555 */
+ { 65, 7, 12, 0, 0, }, /* 556 */
+ { 65, 21, 12, 0, 0, }, /* 557 */
+ { 75, 10, 5, 0, 0, }, /* 558 */
+ { 75, 7, 12, 0, 0, }, /* 559 */
+ { 75, 12, 3, 0, 0, }, /* 560 */
+ { 75, 21, 12, 0, 0, }, /* 561 */
+ { 75, 13, 12, 0, 0, }, /* 562 */
+ { 69, 13, 12, 0, 0, }, /* 563 */
+ { 69, 7, 12, 0, 0, }, /* 564 */
+ { 69, 12, 3, 0, 0, }, /* 565 */
+ { 69, 21, 12, 0, 0, }, /* 566 */
+ { 74, 7, 12, 0, 0, }, /* 567 */
+ { 74, 12, 3, 0, 0, }, /* 568 */
+ { 74, 10, 5, 0, 0, }, /* 569 */
+ { 74, 21, 12, 0, 0, }, /* 570 */
+ { 84, 12, 3, 0, 0, }, /* 571 */
+ { 84, 10, 5, 0, 0, }, /* 572 */
+ { 84, 7, 12, 0, 0, }, /* 573 */
+ { 84, 21, 12, 0, 0, }, /* 574 */
+ { 84, 13, 12, 0, 0, }, /* 575 */
+ { 39, 6, 12, 0, 0, }, /* 576 */
+ { 68, 7, 12, 0, 0, }, /* 577 */
+ { 68, 12, 3, 0, 0, }, /* 578 */
+ { 68, 10, 5, 0, 0, }, /* 579 */
+ { 68, 13, 12, 0, 0, }, /* 580 */
+ { 68, 21, 12, 0, 0, }, /* 581 */
+ { 92, 7, 12, 0, 0, }, /* 582 */
+ { 92, 12, 3, 0, 0, }, /* 583 */
+ { 92, 6, 12, 0, 0, }, /* 584 */
+ { 92, 21, 12, 0, 0, }, /* 585 */
+ { 87, 7, 12, 0, 0, }, /* 586 */
+ { 87, 10, 5, 0, 0, }, /* 587 */
+ { 87, 12, 3, 0, 0, }, /* 588 */
+ { 87, 21, 12, 0, 0, }, /* 589 */
+ { 87, 6, 12, 0, 0, }, /* 590 */
+ { 34, 5, 12, 0, -928, }, /* 591 */
+ { 9, 5, 12, 0, -38864, }, /* 592 */
+ { 87, 13, 12, 0, 0, }, /* 593 */
+ { 24, 7, 9, 0, 0, }, /* 594 */
+ { 24, 7, 10, 0, 0, }, /* 595 */
+ { 0, 4, 2, 0, 0, }, /* 596 */
+ { 0, 3, 12, 0, 0, }, /* 597 */
+ { 26, 25, 12, 0, 0, }, /* 598 */
+ { 1, 24, 12, 0, 0, }, /* 599 */
+ { 10, 6, 3, 0, 0, }, /* 600 */
+ { 36, 7, 12, 0, 0, }, /* 601 */
+ { 20, 14, 12, 0, 0, }, /* 602 */
+ { 20, 15, 12, 0, 0, }, /* 603 */
+ { 20, 26, 12, 0, 0, }, /* 604 */
+ { 71, 7, 12, 0, 0, }, /* 605 */
+ { 67, 7, 12, 0, 0, }, /* 606 */
+ { 42, 7, 12, 0, 0, }, /* 607 */
+ { 42, 15, 12, 0, 0, }, /* 608 */
+ { 19, 7, 12, 0, 0, }, /* 609 */
+ { 19, 14, 12, 0, 0, }, /* 610 */
+ { 118, 7, 12, 0, 0, }, /* 611 */
+ { 118, 12, 3, 0, 0, }, /* 612 */
+ { 60, 7, 12, 0, 0, }, /* 613 */
+ { 60, 21, 12, 0, 0, }, /* 614 */
+ { 43, 7, 12, 0, 0, }, /* 615 */
+ { 43, 21, 12, 0, 0, }, /* 616 */
+ { 43, 14, 12, 0, 0, }, /* 617 */
+ { 14, 9, 12, 0, 40, }, /* 618 */
+ { 14, 5, 12, 0, -40, }, /* 619 */
+ { 47, 7, 12, 0, 0, }, /* 620 */
+ { 45, 7, 12, 0, 0, }, /* 621 */
+ { 45, 13, 12, 0, 0, }, /* 622 */
+ { 136, 9, 12, 0, 40, }, /* 623 */
+ { 136, 5, 12, 0, -40, }, /* 624 */
+ { 106, 7, 12, 0, 0, }, /* 625 */
+ { 104, 7, 12, 0, 0, }, /* 626 */
+ { 104, 21, 12, 0, 0, }, /* 627 */
+ { 110, 7, 12, 0, 0, }, /* 628 */
+ { 12, 7, 12, 0, 0, }, /* 629 */
+ { 81, 7, 12, 0, 0, }, /* 630 */
+ { 81, 21, 12, 0, 0, }, /* 631 */
+ { 81, 15, 12, 0, 0, }, /* 632 */
+ { 120, 7, 12, 0, 0, }, /* 633 */
+ { 120, 26, 12, 0, 0, }, /* 634 */
+ { 120, 15, 12, 0, 0, }, /* 635 */
+ { 116, 7, 12, 0, 0, }, /* 636 */
+ { 116, 15, 12, 0, 0, }, /* 637 */
+ { 128, 7, 12, 0, 0, }, /* 638 */
+ { 128, 15, 12, 0, 0, }, /* 639 */
+ { 66, 7, 12, 0, 0, }, /* 640 */
+ { 66, 15, 12, 0, 0, }, /* 641 */
+ { 66, 21, 12, 0, 0, }, /* 642 */
+ { 72, 7, 12, 0, 0, }, /* 643 */
+ { 72, 21, 12, 0, 0, }, /* 644 */
+ { 98, 7, 12, 0, 0, }, /* 645 */
+ { 97, 7, 12, 0, 0, }, /* 646 */
+ { 97, 15, 12, 0, 0, }, /* 647 */
+ { 31, 7, 12, 0, 0, }, /* 648 */
+ { 31, 12, 3, 0, 0, }, /* 649 */
+ { 31, 15, 12, 0, 0, }, /* 650 */
+ { 31, 21, 12, 0, 0, }, /* 651 */
+ { 88, 7, 12, 0, 0, }, /* 652 */
+ { 88, 15, 12, 0, 0, }, /* 653 */
+ { 88, 21, 12, 0, 0, }, /* 654 */
+ { 117, 7, 12, 0, 0, }, /* 655 */
+ { 117, 15, 12, 0, 0, }, /* 656 */
+ { 112, 7, 12, 0, 0, }, /* 657 */
+ { 112, 26, 12, 0, 0, }, /* 658 */
+ { 112, 12, 3, 0, 0, }, /* 659 */
+ { 112, 15, 12, 0, 0, }, /* 660 */
+ { 112, 21, 12, 0, 0, }, /* 661 */
+ { 78, 7, 12, 0, 0, }, /* 662 */
+ { 78, 21, 12, 0, 0, }, /* 663 */
+ { 83, 7, 12, 0, 0, }, /* 664 */
+ { 83, 15, 12, 0, 0, }, /* 665 */
+ { 82, 7, 12, 0, 0, }, /* 666 */
+ { 82, 15, 12, 0, 0, }, /* 667 */
+ { 121, 7, 12, 0, 0, }, /* 668 */
+ { 121, 21, 12, 0, 0, }, /* 669 */
+ { 121, 15, 12, 0, 0, }, /* 670 */
+ { 89, 7, 12, 0, 0, }, /* 671 */
+ { 130, 9, 12, 0, 64, }, /* 672 */
+ { 130, 5, 12, 0, -64, }, /* 673 */
+ { 130, 15, 12, 0, 0, }, /* 674 */
+ { 144, 7, 12, 0, 0, }, /* 675 */
+ { 144, 12, 3, 0, 0, }, /* 676 */
+ { 144, 13, 12, 0, 0, }, /* 677 */
+ { 1, 15, 12, 0, 0, }, /* 678 */
+ { 147, 7, 12, 0, 0, }, /* 679 */
+ { 147, 15, 12, 0, 0, }, /* 680 */
+ { 148, 7, 12, 0, 0, }, /* 681 */
+ { 148, 12, 3, 0, 0, }, /* 682 */
+ { 148, 15, 12, 0, 0, }, /* 683 */
+ { 148, 21, 12, 0, 0, }, /* 684 */
+ { 94, 10, 5, 0, 0, }, /* 685 */
+ { 94, 12, 3, 0, 0, }, /* 686 */
+ { 94, 7, 12, 0, 0, }, /* 687 */
+ { 94, 21, 12, 0, 0, }, /* 688 */
+ { 94, 15, 12, 0, 0, }, /* 689 */
+ { 94, 13, 12, 0, 0, }, /* 690 */
+ { 85, 12, 3, 0, 0, }, /* 691 */
+ { 85, 10, 5, 0, 0, }, /* 692 */
+ { 85, 7, 12, 0, 0, }, /* 693 */
+ { 85, 21, 12, 0, 0, }, /* 694 */
+ { 85, 1, 4, 0, 0, }, /* 695 */
+ { 101, 7, 12, 0, 0, }, /* 696 */
+ { 101, 13, 12, 0, 0, }, /* 697 */
+ { 96, 12, 3, 0, 0, }, /* 698 */
+ { 96, 7, 12, 0, 0, }, /* 699 */
+ { 96, 10, 5, 0, 0, }, /* 700 */
+ { 96, 13, 12, 0, 0, }, /* 701 */
+ { 96, 21, 12, 0, 0, }, /* 702 */
+ { 111, 7, 12, 0, 0, }, /* 703 */
+ { 111, 12, 3, 0, 0, }, /* 704 */
+ { 111, 21, 12, 0, 0, }, /* 705 */
+ { 100, 12, 3, 0, 0, }, /* 706 */
+ { 100, 10, 5, 0, 0, }, /* 707 */
+ { 100, 7, 12, 0, 0, }, /* 708 */
+ { 100, 7, 4, 0, 0, }, /* 709 */
+ { 100, 21, 12, 0, 0, }, /* 710 */
+ { 100, 13, 12, 0, 0, }, /* 711 */
+ { 48, 15, 12, 0, 0, }, /* 712 */
+ { 108, 7, 12, 0, 0, }, /* 713 */
+ { 108, 10, 5, 0, 0, }, /* 714 */
+ { 108, 12, 3, 0, 0, }, /* 715 */
+ { 108, 21, 12, 0, 0, }, /* 716 */
+ { 129, 7, 12, 0, 0, }, /* 717 */
+ { 129, 21, 12, 0, 0, }, /* 718 */
+ { 109, 7, 12, 0, 0, }, /* 719 */
+ { 109, 12, 3, 0, 0, }, /* 720 */
+ { 109, 10, 5, 0, 0, }, /* 721 */
+ { 109, 13, 12, 0, 0, }, /* 722 */
+ { 107, 12, 3, 0, 0, }, /* 723 */
+ { 107, 10, 5, 0, 0, }, /* 724 */
+ { 107, 7, 12, 0, 0, }, /* 725 */
+ { 107, 10, 3, 0, 0, }, /* 726 */
+ { 135, 7, 12, 0, 0, }, /* 727 */
+ { 135, 10, 5, 0, 0, }, /* 728 */
+ { 135, 12, 3, 0, 0, }, /* 729 */
+ { 135, 21, 12, 0, 0, }, /* 730 */
+ { 135, 13, 12, 0, 0, }, /* 731 */
+ { 124, 7, 12, 0, 0, }, /* 732 */
+ { 124, 10, 3, 0, 0, }, /* 733 */
+ { 124, 10, 5, 0, 0, }, /* 734 */
+ { 124, 12, 3, 0, 0, }, /* 735 */
+ { 124, 21, 12, 0, 0, }, /* 736 */
+ { 124, 13, 12, 0, 0, }, /* 737 */
+ { 123, 7, 12, 0, 0, }, /* 738 */
+ { 123, 10, 3, 0, 0, }, /* 739 */
+ { 123, 10, 5, 0, 0, }, /* 740 */
+ { 123, 12, 3, 0, 0, }, /* 741 */
+ { 123, 21, 12, 0, 0, }, /* 742 */
+ { 114, 7, 12, 0, 0, }, /* 743 */
+ { 114, 10, 5, 0, 0, }, /* 744 */
+ { 114, 12, 3, 0, 0, }, /* 745 */
+ { 114, 21, 12, 0, 0, }, /* 746 */
+ { 114, 13, 12, 0, 0, }, /* 747 */
+ { 102, 7, 12, 0, 0, }, /* 748 */
+ { 102, 12, 3, 0, 0, }, /* 749 */
+ { 102, 10, 5, 0, 0, }, /* 750 */
+ { 102, 13, 12, 0, 0, }, /* 751 */
+ { 126, 7, 12, 0, 0, }, /* 752 */
+ { 126, 12, 3, 0, 0, }, /* 753 */
+ { 126, 10, 5, 0, 0, }, /* 754 */
+ { 126, 13, 12, 0, 0, }, /* 755 */
+ { 126, 15, 12, 0, 0, }, /* 756 */
+ { 126, 21, 12, 0, 0, }, /* 757 */
+ { 126, 26, 12, 0, 0, }, /* 758 */
+ { 142, 7, 12, 0, 0, }, /* 759 */
+ { 142, 10, 5, 0, 0, }, /* 760 */
+ { 142, 12, 3, 0, 0, }, /* 761 */
+ { 142, 21, 12, 0, 0, }, /* 762 */
+ { 125, 9, 12, 0, 32, }, /* 763 */
+ { 125, 5, 12, 0, -32, }, /* 764 */
+ { 125, 13, 12, 0, 0, }, /* 765 */
+ { 125, 15, 12, 0, 0, }, /* 766 */
+ { 125, 7, 12, 0, 0, }, /* 767 */
+ { 141, 7, 12, 0, 0, }, /* 768 */
+ { 141, 12, 3, 0, 0, }, /* 769 */
+ { 141, 10, 5, 0, 0, }, /* 770 */
+ { 141, 7, 4, 0, 0, }, /* 771 */
+ { 141, 21, 12, 0, 0, }, /* 772 */
+ { 140, 7, 12, 0, 0, }, /* 773 */
+ { 140, 12, 3, 0, 0, }, /* 774 */
+ { 140, 10, 5, 0, 0, }, /* 775 */
+ { 140, 7, 4, 0, 0, }, /* 776 */
+ { 140, 21, 12, 0, 0, }, /* 777 */
+ { 122, 7, 12, 0, 0, }, /* 778 */
+ { 133, 7, 12, 0, 0, }, /* 779 */
+ { 133, 10, 5, 0, 0, }, /* 780 */
+ { 133, 12, 3, 0, 0, }, /* 781 */
+ { 133, 21, 12, 0, 0, }, /* 782 */
+ { 133, 13, 12, 0, 0, }, /* 783 */
+ { 133, 15, 12, 0, 0, }, /* 784 */
+ { 134, 21, 12, 0, 0, }, /* 785 */
+ { 134, 7, 12, 0, 0, }, /* 786 */
+ { 134, 12, 3, 0, 0, }, /* 787 */
+ { 134, 10, 5, 0, 0, }, /* 788 */
+ { 138, 7, 12, 0, 0, }, /* 789 */
+ { 138, 12, 3, 0, 0, }, /* 790 */
+ { 138, 7, 4, 0, 0, }, /* 791 */
+ { 138, 13, 12, 0, 0, }, /* 792 */
+ { 143, 7, 12, 0, 0, }, /* 793 */
+ { 143, 10, 5, 0, 0, }, /* 794 */
+ { 143, 12, 3, 0, 0, }, /* 795 */
+ { 143, 13, 12, 0, 0, }, /* 796 */
+ { 145, 7, 12, 0, 0, }, /* 797 */
+ { 145, 12, 3, 0, 0, }, /* 798 */
+ { 145, 10, 5, 0, 0, }, /* 799 */
+ { 145, 21, 12, 0, 0, }, /* 800 */
+ { 63, 7, 12, 0, 0, }, /* 801 */
+ { 63, 14, 12, 0, 0, }, /* 802 */
+ { 63, 21, 12, 0, 0, }, /* 803 */
+ { 80, 7, 12, 0, 0, }, /* 804 */
+ { 127, 7, 12, 0, 0, }, /* 805 */
+ { 115, 7, 12, 0, 0, }, /* 806 */
+ { 115, 13, 12, 0, 0, }, /* 807 */
+ { 115, 21, 12, 0, 0, }, /* 808 */
+ { 103, 7, 12, 0, 0, }, /* 809 */
+ { 103, 12, 3, 0, 0, }, /* 810 */
+ { 103, 21, 12, 0, 0, }, /* 811 */
+ { 119, 7, 12, 0, 0, }, /* 812 */
+ { 119, 12, 3, 0, 0, }, /* 813 */
+ { 119, 21, 12, 0, 0, }, /* 814 */
+ { 119, 26, 12, 0, 0, }, /* 815 */
+ { 119, 6, 12, 0, 0, }, /* 816 */
+ { 119, 13, 12, 0, 0, }, /* 817 */
+ { 119, 15, 12, 0, 0, }, /* 818 */
+ { 146, 9, 12, 0, 32, }, /* 819 */
+ { 146, 5, 12, 0, -32, }, /* 820 */
+ { 146, 15, 12, 0, 0, }, /* 821 */
+ { 146, 21, 12, 0, 0, }, /* 822 */
+ { 99, 7, 12, 0, 0, }, /* 823 */
+ { 99, 10, 5, 0, 0, }, /* 824 */
+ { 99, 12, 3, 0, 0, }, /* 825 */
+ { 99, 6, 12, 0, 0, }, /* 826 */
+ { 137, 6, 12, 0, 0, }, /* 827 */
+ { 139, 6, 12, 0, 0, }, /* 828 */
+ { 137, 7, 12, 0, 0, }, /* 829 */
+ { 139, 7, 12, 0, 0, }, /* 830 */
+ { 105, 7, 12, 0, 0, }, /* 831 */
+ { 105, 26, 12, 0, 0, }, /* 832 */
+ { 105, 12, 3, 0, 0, }, /* 833 */
+ { 105, 21, 12, 0, 0, }, /* 834 */
+ { 10, 10, 3, 0, 0, }, /* 835 */
+ { 20, 12, 3, 0, 0, }, /* 836 */
+ { 131, 26, 12, 0, 0, }, /* 837 */
+ { 131, 12, 3, 0, 0, }, /* 838 */
+ { 131, 21, 12, 0, 0, }, /* 839 */
+ { 18, 12, 3, 0, 0, }, /* 840 */
+ { 113, 7, 12, 0, 0, }, /* 841 */
+ { 113, 15, 12, 0, 0, }, /* 842 */
+ { 113, 12, 3, 0, 0, }, /* 843 */
+ { 132, 9, 12, 0, 34, }, /* 844 */
+ { 132, 5, 12, 0, -34, }, /* 845 */
+ { 132, 12, 3, 0, 0, }, /* 846 */
+ { 132, 13, 12, 0, 0, }, /* 847 */
+ { 132, 21, 12, 0, 0, }, /* 848 */
+ { 0, 2, 14, 0, 0, }, /* 849 */
+ { 10, 26, 11, 0, 0, }, /* 850 */
+ { 27, 26, 12, 0, 0, }, /* 851 */
+ { 10, 24, 3, 0, 0, }, /* 852 */
+ { 10, 1, 3, 0, 0, }, /* 853 */
};
const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
Modified: code/trunk/src/pcre2_ucp.h
===================================================================
--- code/trunk/src/pcre2_ucp.h 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/src/pcre2_ucp.h 2018-10-02 15:25:58 UTC (rev 1019)
@@ -124,6 +124,7 @@
/* These are the script identifications. */
enum {
+ ucp_Unknown,
ucp_Arabic,
ucp_Armenian,
ucp_Bengali,
Modified: code/trunk/testdata/testinput12
===================================================================
--- code/trunk/testdata/testinput12 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/testdata/testinput12 2018-10-02 15:25:58 UTC (rev 1019)
@@ -386,5 +386,16 @@
/(?<=abc)(|def)/g,utf,replace=<$0>,substitute_callout
123abcáyzabcdef789abcሴqr
+
+# A few script run tests in non-UTF mode (but they need Unicode support)
+/^(*script_run:.{4})/
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+
+/^(*sr:.*)/utf,allow_surrogate_escapes
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ \x{d800}\x{dfff} Surrogates (Unknown) \=no_utf_check
+
# End of testinput12
Modified: code/trunk/testdata/testinput4
===================================================================
--- code/trunk/testdata/testinput4 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/testdata/testinput4 2018-10-02 15:25:58 UTC (rev 1019)
@@ -2317,5 +2317,96 @@
/[^\x{100}-\x{ffff}]*[\x80-\xff]/i,utf
\x{99}\x{99}\x{99}
+
+# Script run tests
+/^(*script_run:.{4})/utf
+ abcd Latin x4
+ \x{2e80}\x{2fa1d}\x{3041}\x{30a1} Han Han Hiragana Katakana
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+ \x{2e80}\x{3105}\x{2e80}\x{3105} Han Bopomofo Han Bopomofo
+ \x{02ea}\x{2e80}\x{2e80}\x{3105} Bopomofo-Sk Han Han Bopomofo
+ \x{3105}\x{2e80}\x{2e80}\x{3105} Bopomofo Han Han Bopomofo
+ \x{0300}cd! Inherited Latin Latin Common
+ \x{0391}12\x{03a9} Greek Common-digits Greek
+ \x{0400}12\x{fe2f} Cyrillic Common-digits Cyrillic
+ \x{0531}12\x{fb17} Armenian Common-digits Armenian
+ \x{0591}12\x{fb4f} Hebrew Common-digits Hebrew
+ \x{0600}12\x{1eef1} Arabic Common-digits Arabic
+ \x{0600}\x{0660}\x{0669}\x{1eef1} Arabic Arabic-digits Arabic
+ \x{0700}12\x{086a} Syriac Common-digits Syriac
+ \x{1200}12\x{ab2e} Ethiopic Common-digits Ethiopic
+ \x{1680}12\x{169c} Ogham Common-digits Ogham
+ \x{3041}12\x{3041} Hiragana Common-digits Hiragana
+ \x{0980}\x{09e6}\x{09e7}\x{0993} Bengali Bengali-digits Bengali
+ !cde Common Latin Latin Latin
+ A..B Latin Common Common Latin
+ 0abc Ascii-digit Latin Latin Latin
+ 1\x{0700}\x{0700}\x{0700} Ascii-digit Syriac x 3
+ \x{1A80}\x{1A80}\x{1a40}\x{1a41} Tai Tham Hora digits, letters
+\= Expect no match
+ a\x{370}bcd Latin Greek Latin Latin
+ \x{1100}\x{02ea}\x{02ea}\x{02ea} Hangul Bopomofo x3
+ \x{02ea}\x{02ea}\x{02ea}\x{1100} Bopomofo x3 Hangul
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+ \x{0391}\x{09e6}\x{09e7}\x{03a9} Greek Bengali digits Greek
+ \x{0600}7\x{0669}\x{1eef1} Arabic ascii-digit Arabic-digit Arabic
+ \x{0600}\x{0669}7\x{1eef1} Arabic Arabic-digit ascii-digit Arabic
+ A5\x{ff19}B Latin Common-ascii/notascii-digits Latin
+ \x{0300}cd\x{0391} Inherited Latin Latin Greek
+ !cd\x{0391} Common Latin Latin Greek
+ \x{1A80}\x{1A90}\x{1a40}\x{1a41} Tai Tham Hora digit, Tham digit, letters
+ A\x{1d7ce}\x{1d7ff}B Common fancy-common-2-sets-digits Common
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(*sr:.{4}|..)/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(*atomic_script_run:.{4}|..)/utf
+\= Expect no match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(*asr:.*)/utf
+\= Expect no match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(?>(*sr:.*))/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(*sr:.*)/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ \x{10fffd}\x{10fffd}\x{10fffd} Private use (Unknown)
+
+/^(*sr:\x{2e80}*)/utf
+ \x{2e80}\x{2e80}\x{3105} Han Han Bopomofo
+
+/^(*sr:\x{2e80}*)\x{2e80}/utf
+ \x{2e80}\x{2e80}\x{3105} Han Han Bopomofo
+
+/^(*sr:.*)Test/utf
+ Test script run on an empty string
+
+/^(*sr:(.{2})){2}/utf
+ \x{0600}7\x{0669}\x{1eef1} Arabic ascii-digit Arabic-digit Arabic
+ \x{1A80}\x{1A80}\x{1a40}\x{1a41} Tai Tham Hora digits, letters
+ \x{1A80}\x{1a40}\x{1A90}\x{1a41} Tai Tham Hora digit, letter, Tham digit, letter
+\= Expect no match
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+
+# Test loop breaking for empty string match
+
+/^(*sr:A|)*BCD/utf
+ AABCD
+ ABCD
+ BCD
+
+# The use of (*ACCEPT) breaks script run checking
+
+/^(*sr:.*(*ACCEPT)ZZ)/utf
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+
+# -------
+
# End of testinput4
Modified: code/trunk/testdata/testinput5
===================================================================
--- code/trunk/testdata/testinput5 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/testdata/testinput5 2018-10-02 15:25:58 UTC (rev 1019)
@@ -2109,5 +2109,28 @@
/(*: AB
C)abc/x,utf,mark,alt_verbnames
abc
+
+# Script run tests: auto-possessification
+/^(*sr:.*)/B,utf
+ paypаl.com A classic example of why script run checks are a good thing
+
+/^(*sr:\x{2e80}*)/B,utf
+
+/^(*sr:\x{2e80}*)\x{2e80}/B,utf
+
+# Some script run patterns are broken in Perl 5.28.0. These can be moved into
+# test 4 when a mended version of Perl is released.
+
+/^(*sr:.{4})/utf
+ \x{0980}12\x{0993} Bengali Common-digits Bengali
+ \x{0780}12\x{07b1} Thaana Common-digits Thaana
+ \x{0e01}12\x{0e5b} Thai Common-digits Thai
+ \x{1780}12\x{19ff} Khmer Common-digits Khmer
+ \x{0904}12\x{0939} Devanagari Common-digits Devanagari
+ A\x{ff10}\x{ff19}B Latin Common-notascii-digits Latin
+ A\x{1d7ce}\x{1d7cf}B Latin fancy-common-digits Latin
+
+# -------
+
# End of testinput5
Modified: code/trunk/testdata/testoutput12-16
===================================================================
--- code/trunk/testdata/testoutput12-16 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/testdata/testoutput12-16 2018-10-02 15:25:58 UTC (rev 1019)
@@ -1480,5 +1480,20 @@
Old 12 15 New 16 21
Old 21 21 New 27 29
4: 123abc<>\x{e1}yzabc<><def>789abc<>\x{1234}qr
+
+# A few script run tests in non-UTF mode (but they need Unicode support)
+/^(*script_run:.{4})/
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ 0: \x{3041}\x{30a1}\x{3007}\x{3007}
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ 0: \x{30a1}\x{3041}\x{3007}\x{3007}
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+ 0: \x{1100}\x{2e80}\x{2e80}\x{1101}
+
+/^(*sr:.*)/utf,allow_surrogate_escapes
+Failed: error 191 at offset 0: PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES is not allowed in UTF-16 mode
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ \x{d800}\x{dfff} Surrogates (Unknown) \=no_utf_check
+
# End of testinput12
Modified: code/trunk/testdata/testoutput12-32
===================================================================
--- code/trunk/testdata/testoutput12-32 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/testdata/testoutput12-32 2018-10-02 15:25:58 UTC (rev 1019)
@@ -1477,5 +1477,21 @@
Old 12 15 New 16 21
Old 21 21 New 27 29
4: 123abc<>\x{e1}yzabc<><def>789abc<>\x{1234}qr
+
+# A few script run tests in non-UTF mode (but they need Unicode support)
+/^(*script_run:.{4})/
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ 0: \x{3041}\x{30a1}\x{3007}\x{3007}
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ 0: \x{30a1}\x{3041}\x{3007}\x{3007}
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+ 0: \x{1100}\x{2e80}\x{2e80}\x{1101}
+
+/^(*sr:.*)/utf,allow_surrogate_escapes
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ 0: \x{2e80}\x{3105}\x{2e80}
+ \x{d800}\x{dfff} Surrogates (Unknown) \=no_utf_check
+ 0: \x{d800}
+
# End of testinput12
Modified: code/trunk/testdata/testoutput4
===================================================================
--- code/trunk/testdata/testoutput4 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/testdata/testoutput4 2018-10-02 15:25:58 UTC (rev 1019)
@@ -3741,5 +3741,154 @@
/[^\x{100}-\x{ffff}]*[\x80-\xff]/i,utf
\x{99}\x{99}\x{99}
0: \x{99}\x{99}\x{99}
+
+# Script run tests
+/^(*script_run:.{4})/utf
+ abcd Latin x4
+ 0: abcd
+ \x{2e80}\x{2fa1d}\x{3041}\x{30a1} Han Han Hiragana Katakana
+ 0: \x{2e80}\x{2fa1d}\x{3041}\x{30a1}
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ 0: \x{3041}\x{30a1}\x{3007}\x{3007}
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ 0: \x{30a1}\x{3041}\x{3007}\x{3007}
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+ 0: \x{1100}\x{2e80}\x{2e80}\x{1101}
+ \x{2e80}\x{3105}\x{2e80}\x{3105} Han Bopomofo Han Bopomofo
+ 0: \x{2e80}\x{3105}\x{2e80}\x{3105}
+ \x{02ea}\x{2e80}\x{2e80}\x{3105} Bopomofo-Sk Han Han Bopomofo
+ 0: \x{2ea}\x{2e80}\x{2e80}\x{3105}
+ \x{3105}\x{2e80}\x{2e80}\x{3105} Bopomofo Han Han Bopomofo
+ 0: \x{3105}\x{2e80}\x{2e80}\x{3105}
+ \x{0300}cd! Inherited Latin Latin Common
+ 0: \x{300}cd!
+ \x{0391}12\x{03a9} Greek Common-digits Greek
+ 0: \x{391}12\x{3a9}
+ \x{0400}12\x{fe2f} Cyrillic Common-digits Cyrillic
+ 0: \x{400}12\x{fe2f}
+ \x{0531}12\x{fb17} Armenian Common-digits Armenian
+ 0: \x{531}12\x{fb17}
+ \x{0591}12\x{fb4f} Hebrew Common-digits Hebrew
+ 0: \x{591}12\x{fb4f}
+ \x{0600}12\x{1eef1} Arabic Common-digits Arabic
+ 0: \x{600}12\x{1eef1}
+ \x{0600}\x{0660}\x{0669}\x{1eef1} Arabic Arabic-digits Arabic
+ 0: \x{600}\x{660}\x{669}\x{1eef1}
+ \x{0700}12\x{086a} Syriac Common-digits Syriac
+ 0: \x{700}12\x{86a}
+ \x{1200}12\x{ab2e} Ethiopic Common-digits Ethiopic
+ 0: \x{1200}12\x{ab2e}
+ \x{1680}12\x{169c} Ogham Common-digits Ogham
+ 0: \x{1680}12\x{169c}
+ \x{3041}12\x{3041} Hiragana Common-digits Hiragana
+ 0: \x{3041}12\x{3041}
+ \x{0980}\x{09e6}\x{09e7}\x{0993} Bengali Bengali-digits Bengali
+ 0: \x{980}\x{9e6}\x{9e7}\x{993}
+ !cde Common Latin Latin Latin
+ 0: !cde
+ A..B Latin Common Common Latin
+ 0: A..B
+ 0abc Ascii-digit Latin Latin Latin
+ 0: 0abc
+ 1\x{0700}\x{0700}\x{0700} Ascii-digit Syriac x 3
+ 0: 1\x{700}\x{700}\x{700}
+ \x{1A80}\x{1A80}\x{1a40}\x{1a41} Tai Tham Hora digits, letters
+ 0: \x{1a80}\x{1a80}\x{1a40}\x{1a41}
+\= Expect no match
+ a\x{370}bcd Latin Greek Latin Latin
+No match
+ \x{1100}\x{02ea}\x{02ea}\x{02ea} Hangul Bopomofo x3
+No match
+ \x{02ea}\x{02ea}\x{02ea}\x{1100} Bopomofo x3 Hangul
+No match
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+No match
+ \x{0391}\x{09e6}\x{09e7}\x{03a9} Greek Bengali digits Greek
+No match
+ \x{0600}7\x{0669}\x{1eef1} Arabic ascii-digit Arabic-digit Arabic
+No match
+ \x{0600}\x{0669}7\x{1eef1} Arabic Arabic-digit ascii-digit Arabic
+No match
+ A5\x{ff19}B Latin Common-ascii/notascii-digits Latin
+No match
+ \x{0300}cd\x{0391} Inherited Latin Latin Greek
+No match
+ !cd\x{0391} Common Latin Latin Greek
+No match
+ \x{1A80}\x{1A90}\x{1a40}\x{1a41} Tai Tham Hora digit, Tham digit, letters
+No match
+ A\x{1d7ce}\x{1d7ff}B Common fancy-common-2-sets-digits Common
+No match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+No match
+
+/^(*sr:.{4}|..)/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ 0: \x{2e80}\x{3105}
+
+/^(*atomic_script_run:.{4}|..)/utf
+\= Expect no match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+No match
+
+/^(*asr:.*)/utf
+\= Expect no match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+No match
+
+/^(?>(*sr:.*))/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ 0: \x{2e80}\x{3105}\x{2e80}
+
+/^(*sr:.*)/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ 0: \x{2e80}\x{3105}\x{2e80}
+ \x{10fffd}\x{10fffd}\x{10fffd} Private use (Unknown)
+ 0: \x{10fffd}
+
+/^(*sr:\x{2e80}*)/utf
+ \x{2e80}\x{2e80}\x{3105} Han Han Bopomofo
+ 0: \x{2e80}\x{2e80}
+
+/^(*sr:\x{2e80}*)\x{2e80}/utf
+ \x{2e80}\x{2e80}\x{3105} Han Han Bopomofo
+ 0: \x{2e80}\x{2e80}
+
+/^(*sr:.*)Test/utf
+ Test script run on an empty string
+ 0: Test
+
+/^(*sr:(.{2})){2}/utf
+ \x{0600}7\x{0669}\x{1eef1} Arabic ascii-digit Arabic-digit Arabic
+ 0: \x{600}7\x{669}\x{1eef1}
+ 1: \x{669}\x{1eef1}
+ \x{1A80}\x{1A80}\x{1a40}\x{1a41} Tai Tham Hora digits, letters
+ 0: \x{1a80}\x{1a80}\x{1a40}\x{1a41}
+ 1: \x{1a40}\x{1a41}
+ \x{1A80}\x{1a40}\x{1A90}\x{1a41} Tai Tham Hora digit, letter, Tham digit, letter
+ 0: \x{1a80}\x{1a40}\x{1a90}\x{1a41}
+ 1: \x{1a90}\x{1a41}
+\= Expect no match
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+No match
+
+# Test loop breaking for empty string match
+
+/^(*sr:A|)*BCD/utf
+ AABCD
+ 0: AABCD
+ ABCD
+ 0: ABCD
+ BCD
+ 0: BCD
+
+# The use of (*ACCEPT) breaks script run checking
+
+/^(*sr:.*(*ACCEPT)ZZ)/utf
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+ 0: \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+
+# -------
+
# End of testinput4
Modified: code/trunk/testdata/testoutput5
===================================================================
--- code/trunk/testdata/testoutput5 2018-09-24 16:23:53 UTC (rev 1018)
+++ code/trunk/testdata/testoutput5 2018-10-02 15:25:58 UTC (rev 1019)
@@ -4778,5 +4778,64 @@
abc
0: abc
MK: ABC
+
+# Script run tests: auto-possessification
+/^(*sr:.*)/B,utf
+------------------------------------------------------------------
+ Bra
+ ^
+ Script run
+ Any*
+ Ket
+ Ket
+ End
+------------------------------------------------------------------
+ paypаl.com A classic example of why script run checks are a good thing
+ 0: payp
+
+/^(*sr:\x{2e80}*)/B,utf
+------------------------------------------------------------------
+ Bra
+ ^
+ Script run
+ \x{2e80}*+
+ Ket
+ Ket
+ End
+------------------------------------------------------------------
+
+/^(*sr:\x{2e80}*)\x{2e80}/B,utf
+------------------------------------------------------------------
+ Bra
+ ^
+ Script run
+ \x{2e80}*
+ Ket
+ \x{2e80}
+ Ket
+ End
+------------------------------------------------------------------
+
+# Some script run patterns are broken in Perl 5.28.0. These can be moved into
+# test 4 when a mended version of Perl is released.
+
+/^(*sr:.{4})/utf
+ \x{0980}12\x{0993} Bengali Common-digits Bengali
+ 0: \x{980}12\x{993}
+ \x{0780}12\x{07b1} Thaana Common-digits Thaana
+ 0: \x{780}12\x{7b1}
+ \x{0e01}12\x{0e5b} Thai Common-digits Thai
+ 0: \x{e01}12\x{e5b}
+ \x{1780}12\x{19ff} Khmer Common-digits Khmer
+ 0: \x{1780}12\x{19ff}
+ \x{0904}12\x{0939} Devanagari Common-digits Devanagari
+ 0: \x{904}12\x{939}
+ A\x{ff10}\x{ff19}B Latin Common-notascii-digits Latin
+ 0: A\x{ff10}\x{ff19}B
+ A\x{1d7ce}\x{1d7cf}B Latin fancy-common-digits Latin
+ 0: A\x{1d7ce}\x{1d7cf}B
+
+# -------
+
# End of testinput5