From ef2fd0e5b5e29ee267fa77f24bc3f779f5a69c9f Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 24 Nov 2021 14:35:43 +0100 Subject: [PATCH 01/50] fix [-Wstrict-prototypes] buid warnings --- Zend/zend_cpuinfo.c | 2 +- Zend/zend_cpuinfo.h | 2 +- Zend/zend_exceptions.c | 2 +- Zend/zend_object_handlers.c | 2 +- ext/hash/murmur/endianness.h | 2 +- ext/spl/spl_dllist.c | 2 +- sapi/cli/php_cli_server.c | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Zend/zend_cpuinfo.c b/Zend/zend_cpuinfo.c index bd4dcf298f748..57889bb3f4ce3 100644 --- a/Zend/zend_cpuinfo.c +++ b/Zend/zend_cpuinfo.c @@ -106,7 +106,7 @@ static bool is_avx_supported() { return 1; } #else -static bool is_avx_supported() { +static bool is_avx_supported(void) { return 0; } #endif diff --git a/Zend/zend_cpuinfo.h b/Zend/zend_cpuinfo.h index 79d6a13235e07..fcaf33d5e721c 100644 --- a/Zend/zend_cpuinfo.h +++ b/Zend/zend_cpuinfo.h @@ -215,7 +215,7 @@ static inline int zend_cpu_supports_pclmul() { return __builtin_cpu_supports("pclmul"); } #else -static inline int zend_cpu_supports_pclmul() { +static inline int zend_cpu_supports_pclmul(void) { return zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ); } #endif diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index da4b664981f19..7138713510120 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -154,7 +154,7 @@ void zend_exception_restore(void) /* {{{ */ } /* }}} */ -static zend_always_inline bool is_handle_exception_set() { +static zend_always_inline bool is_handle_exception_set(void) { zend_execute_data *execute_data = EG(current_execute_data); return !execute_data->func || !ZEND_USER_CODE(execute_data->func->common.type) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 5382ac721110c..3b0cfab1778d4 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -727,7 +727,7 @@ ZEND_API zval *zend_std_read_property(zend_object *zobj, zend_string *name, int } /* }}} */ -static zend_always_inline bool property_uses_strict_types() { +static zend_always_inline bool property_uses_strict_types(void) { zend_execute_data *execute_data = EG(current_execute_data); return execute_data && execute_data->func diff --git a/ext/hash/murmur/endianness.h b/ext/hash/murmur/endianness.h index 3dbb2e6a3d797..cbad6dc72fb10 100644 --- a/ext/hash/murmur/endianness.h +++ b/ext/hash/murmur/endianness.h @@ -2,7 +2,7 @@ static const union { uint8_t u8[2]; uint16_t u16; } EndianMix = {{ 1, 0 }}; -FORCE_INLINE int IsBigEndian() +FORCE_INLINE int IsBigEndian(void) { // Constant-folded by the compiler. return EndianMix.u16 != 1; diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index f83d43446e684..f398d93d77643 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -104,7 +104,7 @@ static inline spl_dllist_object *spl_dllist_from_obj(zend_object *obj) /* {{{ */ #define Z_SPLDLLIST_P(zv) spl_dllist_from_obj(Z_OBJ_P((zv))) -static spl_ptr_llist *spl_ptr_llist_init() /* {{{ */ +static spl_ptr_llist *spl_ptr_llist_init(void) /* {{{ */ { spl_ptr_llist *llist = emalloc(sizeof(spl_ptr_llist)); diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index d3bd532d0d17b..5798a72d6c160 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -2371,7 +2371,7 @@ static char *php_cli_server_parse_addr(const char *addr, int *pport) { return pestrndup(addr, end - addr, 1); } -static void php_cli_server_startup_workers() { +static void php_cli_server_startup_workers(void) { char *workers = getenv("PHP_CLI_SERVER_WORKERS"); if (!workers) { return; From be271f277eb5a9a3fc35f20bffb85b0d4957f4a6 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 24 Nov 2021 15:18:31 +0100 Subject: [PATCH 02/50] Fix bug #81652 We need to check not only for defs but also for uses of the variable. --- NEWS | 1 + Zend/tests/bug81652.phpt | 22 ++++++++++++++++++++++ ext/opcache/Optimizer/dfa_pass.c | 24 +++++++++++------------- 3 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 Zend/tests/bug81652.phpt diff --git a/NEWS b/NEWS index 545529f5689f0..8af82b544a8bb 100644 --- a/NEWS +++ b/NEWS @@ -49,6 +49,7 @@ PHP NEWS - Opcache: . Fixed bug #81512 (Unexpected behavior with arrays and JIT). (Dmitry) + . Fixed bug #81652 (The value of error_reporting() gets overridden). (Nikita) - PCRE: . Fixed bug #81424 (PCRE2 10.35 JIT performance regression). (cmb) diff --git a/Zend/tests/bug81652.phpt b/Zend/tests/bug81652.phpt new file mode 100644 index 0000000000000..d0fa78b23e1a7 --- /dev/null +++ b/Zend/tests/bug81652.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #81652: The value of error_reporting() gets overridden +--FILE-- +a = true ? @random_int(0, 100) : false; + } +} + +var_dump(error_reporting()); +$c = new Foo(); +$c->bar(); +var_dump(error_reporting()); + +?> +--EXPECT-- +int(32767) +int(32767) diff --git a/ext/opcache/Optimizer/dfa_pass.c b/ext/opcache/Optimizer/dfa_pass.c index aff91f554f29c..7a03c8ba02a56 100644 --- a/ext/opcache/Optimizer/dfa_pass.c +++ b/ext/opcache/Optimizer/dfa_pass.c @@ -360,19 +360,17 @@ static zend_bool opline_supports_assign_contraction( return 1; } -static bool variable_redefined_in_range(zend_ssa *ssa, int var, int start, int end) +static bool variable_defined_or_used_in_range(zend_ssa *ssa, int var, int start, int end) { while (start < end) { - if (ssa->ops[start].op1_def >= 0 - && ssa->vars[ssa->ops[start].op1_def].var == var) { - return 1; - } - if (ssa->ops[start].op2_def >= 0 - && ssa->vars[ssa->ops[start].op2_def].var == var) { - return 1; - } - if (ssa->ops[start].result_def >= 0 - && ssa->vars[ssa->ops[start].result_def].var == var) { + const zend_ssa_op *ssa_op = &ssa->ops[start]; + if ((ssa_op->op1_def >= 0 && ssa->vars[ssa_op->op1_def].var == var) || + (ssa_op->op2_def >= 0 && ssa->vars[ssa_op->op2_def].var == var) || + (ssa_op->result_def >= 0 && ssa->vars[ssa_op->result_def].var == var) || + (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].var == var) || + (ssa_op->op2_use >= 0 && ssa->vars[ssa_op->op2_use].var == var) || + (ssa_op->result_use >= 0 && ssa->vars[ssa_op->result_use].var == var) + ) { return 1; } start++; @@ -1310,7 +1308,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx && opline_supports_assign_contraction( ssa, &op_array->opcodes[ssa->vars[src_var].definition], src_var, opline->result.var) - && !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->result.var), + && !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->result.var), ssa->vars[src_var].definition+1, op_1) ) { @@ -1467,7 +1465,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx && opline_supports_assign_contraction( ssa, &op_array->opcodes[ssa->vars[src_var].definition], src_var, opline->op1.var) - && !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var), + && !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var), ssa->vars[src_var].definition+1, op_1) ) { From 9237055141365b47aeccb95244d9cc9c7402112e Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Wed, 24 Nov 2021 13:12:52 +0100 Subject: [PATCH 03/50] "Export" relevant GD macros For parity with non Windows systems, we should `AC_DEFINE` these macros so that they are defined in config.w32.h instead of directly passed to the compiler. This allows extensions which have ext/gd as dependency to check for these macros. E.g. ext/ps does this[1], and fails to build on Windows, because `HAVE_GD_BUNDLED` isn't defined. [1] Closes GH-7680. --- ext/gd/config.w32 | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/ext/gd/config.w32 b/ext/gd/config.w32 index 541d5f51e0e2b..0a5569df9eef8 100644 --- a/ext/gd/config.w32 +++ b/ext/gd/config.w32 @@ -25,7 +25,8 @@ if (PHP_GD != "no") { if ((CHECK_LIB("libwebp_a.lib", "gd", PHP_GD) || CHECK_LIB("libwebp.lib", "gd", PHP_GD)) && CHECK_HEADER_ADD_INCLUDE("decode.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp") && CHECK_HEADER_ADD_INCLUDE("encode.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp")) { - ADD_FLAG("CFLAGS_GD", "/D HAVE_LIBWEBP /D HAVE_GD_WEBP"); + AC_DEFINE("HAVE_LIBWEBP", 1, "WebP support"); + AC_DEFINE("HAVE_GD_WEBP", 1, "WebP support"); } else { WARNING("libwebp not enabled; libraries and headers not found"); } @@ -42,10 +43,20 @@ if (PHP_GD != "no") { gd_filter.c gd_pixelate.c gd_rotate.c gd_color_match.c gd_webp.c \ gd_crop.c gd_interpolation.c gd_matrix.c gd_bmp.c gd_tga.c", "gd"); AC_DEFINE('HAVE_LIBGD', 1, 'GD support'); + AC_DEFINE('HAVE_GD_BUNDLED', 1, "Bundled GD"); + AC_DEFINE('HAVE_GD_PNG', 1, "PNG support"); + AC_DEFINE('HAVE_GD_BMP', 1, "BMP support"); + AC_DEFINE('HAVE_GD_TGA', 1, "TGA support"); + AC_DEFINE('HAVE_LIBPNG', 1, "PNG support"); + AC_DEFINE('HAVE_LIBJPEG', 1, "JPEG support"); + AC_DEFINE('HAVE_GD_JPG', 1, "JPEG support"); + AC_DEFINE('HAVE_XPM', 1, "XPM support"); + AC_DEFINE('HAVE_GD_XPM', 1, "XPM support"); + AC_DEFINE('HAVE_LIBFREETYPE', 1, "Freetype support"); + AC_DEFINE('HAVE_GD_FREETYPE', 1, "Freetype support"); ADD_FLAG("CFLAGS_GD", " \ /D PHP_GD_EXPORTS=1 \ /D HAVE_GD_DYNAMIC_CTX_EX=1 \ -/D HAVE_GD_BUNDLED=1 \ /D HAVE_GD_GD2 \ /D HAVE_GD_GIF_READ=1 \ /D HAVE_GD_GIF_CREATE=1 \ @@ -54,24 +65,14 @@ if (PHP_GD != "no") { /D HAVE_GD_IMAGESETTILE=1 \ /D HAVE_GD_FONTCACHESHUTDOWN=1 \ /D HAVE_GD_FONTMUTEX=1 \ -/D HAVE_LIBFREETYPE=1 \ -/D HAVE_GD_JPG \ -/D HAVE_GD_PNG \ /D HAVE_GD_STRINGFTEX=1 \ /D HAVE_GD_STRINGTTF=1 \ /D HAVE_GD_WBMP \ /D HAVE_GD_XBM \ -/D HAVE_GD_XPM \ -/D HAVE_GD_FREETYPE=1 \ -/D HAVE_GD_BMP \ -/D HAVE_GD_TGA \ /D HAVE_LIBGD13=1 \ /D HAVE_LIBGD15=1 \ /D HAVE_LIBGD20=1 \ /D HAVE_LIBGD204=1 \ -/D HAVE_LIBJPEG \ -/D HAVE_LIBPNG \ -/D HAVE_XPM \ /D HAVE_COLORCLOSESTHWB \ /D HAVE_GD_GET_INTERPOLATION \ /D USE_GD_IOCTX \ From 72f8dbb31295e4e5633a9033c6d91a45d102c485 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 24 Nov 2021 20:43:30 +0300 Subject: [PATCH 04/50] Fixed bug #81634 (ZEND_ENABLE_STATIC_TSRMLS_CACHE produces extensionswith the STATIC_TLS flag) --- TSRM/TSRM.h | 8 ++++++-- Zend/zend.c | 2 +- Zend/zend.h | 4 ++++ build/php.m4 | 2 +- win32/build/confutils.js | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h index 188ed29f0bc5e..941d502226687 100644 --- a/TSRM/TSRM.h +++ b/TSRM/TSRM.h @@ -167,8 +167,10 @@ TSRM_API const char *tsrm_api_name(void); #define TSRMG_BULK_STATIC(id, type) ((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)]) #define TSRMG_FAST_STATIC(offset, type, element) (TSRMG_FAST_BULK_STATIC(offset, type)->element) #define TSRMG_FAST_BULK_STATIC(offset, type) ((type) (((char*) TSRMLS_CACHE)+(offset))) -#define TSRMLS_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR; -#define TSRMLS_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR = NULL; +#define TSRMLS_MAIN_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR; +#define TSRMLS_MAIN_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR = NULL; +#define TSRMLS_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE; +#define TSRMLS_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE = NULL; #define TSRMLS_CACHE_UPDATE() TSRMLS_CACHE = tsrm_get_ls_cache() #define TSRMLS_CACHE _tsrm_ls_cache @@ -182,6 +184,8 @@ TSRM_API const char *tsrm_api_name(void); #define tsrm_env_unlock() #define TSRMG_STATIC(id, type, element) +#define TSRMLS_MAIN_CACHE_EXTERN() +#define TSRMLS_MAIN_CACHE_DEFINE() #define TSRMLS_CACHE_EXTERN() #define TSRMLS_CACHE_DEFINE() #define TSRMLS_CACHE_UPDATE() diff --git a/Zend/zend.c b/Zend/zend.c index b5339c4f87afa..6951465d1f956 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -50,7 +50,7 @@ static HashTable *global_class_table = NULL; static HashTable *global_constants_table = NULL; static HashTable *global_auto_globals_table = NULL; static HashTable *global_persistent_list = NULL; -ZEND_TSRMLS_CACHE_DEFINE() +TSRMLS_MAIN_CACHE_DEFINE() # define GLOBAL_FUNCTION_TABLE global_function_table # define GLOBAL_CLASS_TABLE global_class_table # define GLOBAL_CONSTANTS_TABLE global_constants_table diff --git a/Zend/zend.h b/Zend/zend.h index eeacc91eb0a9f..db7d075d505ec 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -69,7 +69,11 @@ #define ZEND_TSRMLS_CACHE #endif +#ifndef ZEND_COMPILE_DL_EXT +TSRMLS_MAIN_CACHE_EXTERN() +#else ZEND_TSRMLS_CACHE_EXTERN() +#endif struct _zend_serialize_data; struct _zend_unserialize_data; diff --git a/build/php.m4 b/build/php.m4 index 3af2b8b72d476..4f64f669eb970 100644 --- a/build/php.m4 +++ b/build/php.m4 @@ -935,7 +935,7 @@ dnl ---------------------------------------------- Static module if test "$3" = "shared" || test "$3" = "yes"; then dnl ---------------------------------------------- Shared module [PHP_]translit($1,a-z_-,A-Z__)[_SHARED]=yes - PHP_ADD_SOURCES_X($ext_dir,$2,$ac_extra,shared_objects_$1,yes) + PHP_ADD_SOURCES_X($ext_dir,$2,$ac_extra -DZEND_COMPILE_DL_EXT=1,shared_objects_$1,yes) PHP_SHARED_MODULE($1,shared_objects_$1, $ext_builddir, $6, $7) AC_DEFINE_UNQUOTED([COMPILE_DL_]translit($1,a-z_-,A-Z__), 1, Whether to build $1 as dynamic module) fi diff --git a/win32/build/confutils.js b/win32/build/confutils.js index 01c76b0e1e886..1a2dfe43b4ca3 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -1432,7 +1432,7 @@ function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir) if (shared) { STDOUT.WriteLine("Enabling extension " + extname_for_printing + " [shared]"); - cflags = "/D COMPILE_DL_" + EXT + " /D " + EXT + "_EXPORTS=1 " + cflags; + cflags = "/D ZEND_COMPILE_DL_EXT=1 /D COMPILE_DL_" + EXT + " /D " + EXT + "_EXPORTS=1 " + cflags; ADD_FLAG("CFLAGS_PHP", "/D COMPILE_DL_" + EXT); } else { STDOUT.WriteLine("Enabling extension " + extname_for_printing); From e713890d369499ab896e926b099fca244980cf0e Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 24 Nov 2021 16:01:56 +0100 Subject: [PATCH 05/50] fix gdImagePngCtxEx call with system libgd --- ext/gd/gd.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 81da12668204d..06ee959437935 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -4191,7 +4191,11 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, (*func_p)(im, ctx, (int) quality); break; case PHP_GDIMG_TYPE_PNG: - (*func_p)(im, ctx, (int) quality, (int) basefilter); +#ifdef HAVE_GD_BUNDLED + gdImagePngCtxEx(im, ctx, (int) quality, (int) basefilter); +#else + gdImagePngCtxEx(im, ctx, (int) quality); +#endif break; case PHP_GDIMG_TYPE_GIF: (*func_p)(im, ctx); From d573054ebe6d20508d891ad388c2753bda48cd17 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Thu, 25 Nov 2021 09:56:03 +0200 Subject: [PATCH 06/50] Enable encoding detection for Polish text Previously, some accented letters commonly used to write Polish text were counted as 'rare' codepoints. Treat them as 'common' instead. Thanks to Alec for pointing this out. --- ext/mbstring/common_codepoints.txt | 5 +++++ ext/mbstring/rare_cp_bitvec.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ext/mbstring/common_codepoints.txt b/ext/mbstring/common_codepoints.txt index 5a84782256052..aa775a11b2626 100644 --- a/ext/mbstring/common_codepoints.txt +++ b/ext/mbstring/common_codepoints.txt @@ -3,6 +3,11 @@ 0x0020 0x007E # ASCII 0x00A1 0x00AC # Pound sign, Yen sign, copyright sign... 0x00AE 0x00FF # Accented Latin characters +0x0104 0x0107 # Polish +0x0118 0x0119 # Polish +0x0141 0x0144 # Polish +0x015A 0x015B # Polish +0x0179 0x017C # Polish 0x0300 0x030A # Diacritical marks 0x0370 0x0377 # Greek 0x037A 0x037F # Greek diff --git a/ext/mbstring/rare_cp_bitvec.h b/ext/mbstring/rare_cp_bitvec.h index be4aa74faa6f0..cf9a679f8d14d 100644 --- a/ext/mbstring/rare_cp_bitvec.h +++ b/ext/mbstring/rare_cp_bitvec.h @@ -11,7 +11,7 @@ static uint32_t rare_codepoint_bitvec[] = { 0xffffd9ff, 0x00000000, 0x00000000, 0x80000000, 0xffffffff, 0x00002001, 0x00000000, 0x00000000, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xfcffff0f, 0xffffffff, 0xf3ffffe1, 0xe1ffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffff800, 0xffffffff, 0xffffffff, 0x0300ffff, 0x0000280f, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, From f6621037a0129938380e50dcefa7a1176c055f0a Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 25 Nov 2021 10:14:30 +0100 Subject: [PATCH 07/50] add missing cond. --- ext/gd/gd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 06ee959437935..bed7e53ac53a3 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -4190,6 +4190,7 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, } (*func_p)(im, ctx, (int) quality); break; +#ifdef HAVE_GD_PNG case PHP_GDIMG_TYPE_PNG: #ifdef HAVE_GD_BUNDLED gdImagePngCtxEx(im, ctx, (int) quality, (int) basefilter); @@ -4197,6 +4198,7 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, gdImagePngCtxEx(im, ctx, (int) quality); #endif break; +#endif case PHP_GDIMG_TYPE_GIF: (*func_p)(im, ctx); break; From f302430c721c8f8004ef97c9c051b2327ed069f4 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 25 Nov 2021 13:33:26 +0300 Subject: [PATCH 08/50] Fixed incorrect DCE for ADD_ARRAY_ELEMENT instruction DCE might remove INIT_ARRAY instruction but then keep the related ADD_ARRAY_ELEMENT, becuse its both operands need to be freed. Fixes oss-fuzz #41309 --- ext/opcache/Optimizer/dce.c | 7 ++++++- ext/opcache/tests/opt/dce_011.phpt | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 ext/opcache/tests/opt/dce_011.phpt diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c index e02ff48e48c71..2cbeab4ce6cf4 100644 --- a/ext/opcache/Optimizer/dce.c +++ b/ext/opcache/Optimizer/dce.c @@ -111,7 +111,6 @@ static inline zend_bool may_have_side_effects( case ZEND_ROPE_INIT: case ZEND_ROPE_ADD: case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: case ZEND_SPACESHIP: case ZEND_STRLEN: case ZEND_COUNT: @@ -128,6 +127,12 @@ static inline zend_bool may_have_side_effects( case ZEND_ARRAY_KEY_EXISTS: /* No side effects */ return 0; + case ZEND_ADD_ARRAY_ELEMENT: + /* TODO: We can't free two vars. Keep instruction alive. "$b"]; */ + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && (opline->op2_type & (IS_VAR|IS_TMP_VAR))) { + return 1; + } + return 0; case ZEND_ROPE_END: /* TODO: Rope dce optimization, see #76446 */ return 1; diff --git a/ext/opcache/tests/opt/dce_011.phpt b/ext/opcache/tests/opt/dce_011.phpt new file mode 100644 index 0000000000000..da06d48a3ce53 --- /dev/null +++ b/ext/opcache/tests/opt/dce_011.phpt @@ -0,0 +1,12 @@ +--TEST-- +Incorrect DCE of ADD_ARRAY_ELEMENT +--FILE-- + "$b"]; +?> +DONE +--EXPECTF-- +Warning: Undefined variable $a in %sdce_011.php on line 2 + +Warning: Undefined variable $b in %sdce_011.php on line 2 +DONE From 3c53a9fd736df3ba39e95b402a73edb5bc2cdd85 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 25 Nov 2021 13:51:56 +0300 Subject: [PATCH 09/50] Fixed incorrect refcountion inference for BW_NOT BW_NOT for emtpy string returns empty string Fixes oss-fuzz #41280 --- ext/opcache/Optimizer/zend_inference.c | 2 +- ext/opcache/tests/jit/bw_not_001.phpt | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 ext/opcache/tests/jit/bw_not_001.phpt diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index d4873aaa13ef6..65b13507e88e5 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2402,7 +2402,7 @@ static zend_always_inline int _zend_update_type_info( case ZEND_BW_NOT: tmp = 0; if (t1 & MAY_BE_STRING) { - tmp |= MAY_BE_STRING | MAY_BE_RC1; + tmp |= MAY_BE_STRING | MAY_BE_RC1 | MAY_BE_RCN; } if (t1 & (MAY_BE_ANY-MAY_BE_STRING)) { tmp |= MAY_BE_LONG; diff --git a/ext/opcache/tests/jit/bw_not_001.phpt b/ext/opcache/tests/jit/bw_not_001.phpt new file mode 100644 index 0000000000000..a36ab8bf41af7 --- /dev/null +++ b/ext/opcache/tests/jit/bw_not_001.phpt @@ -0,0 +1,20 @@ +--TEST-- +JIT BW_NOT: 001 Incorrect refcounting inference +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.protect_memory=1 +--FILE-- + +DONE +--EXPECTF-- +Warning: Undefined variable $x in %sbw_not_001.php on line 2 + +Warning: Undefined variable $x in %sbw_not_001.php on line 2 + +Warning: Undefined array key "" in %sbw_not_001.php on line 2 +DONE \ No newline at end of file From f9518c3850982aca41fac22b87a1e11096eb1643 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 25 Nov 2021 15:14:04 +0300 Subject: [PATCH 10/50] Fixed incorrect narrowing to double Fixes oss-fuzz #41223 --- ext/opcache/Optimizer/zend_inference.c | 2 +- ext/opcache/tests/jit/assign_047.phpt | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 ext/opcache/tests/jit/assign_047.phpt diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 65b13507e88e5..926e3186ef852 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -3918,7 +3918,7 @@ static zend_bool can_convert_to_double( for (phi = var->phi_use_chain; phi; phi = zend_ssa_next_use_phi(ssa, var_num, phi)) { /* Check that narrowing can actually be useful */ type = ssa->var_info[phi->ssa_var].type; - if ((type & MAY_BE_ANY) & ~(MAY_BE_LONG|MAY_BE_DOUBLE)) { + if (type & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_DOUBLE))) { return 0; } diff --git a/ext/opcache/tests/jit/assign_047.phpt b/ext/opcache/tests/jit/assign_047.phpt new file mode 100644 index 0000000000000..302d465fdab62 --- /dev/null +++ b/ext/opcache/tests/jit/assign_047.phpt @@ -0,0 +1,25 @@ +--TEST-- +JIT ASSIGN: incorrect narrowing to double +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.protect_memory=1 +--FILE-- +0]; + for($i=0;$i<10;$i++){ + +$a; + $a=$x->x; + $a=7; + } +} +test() +?> +DONE +--EXPECTF-- +Warning: Undefined variable $a in %sassign_047.php on line 5 +DONE + From f566cba0bb6bd53b1d44d5097e68201412b00f7a Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 25 Nov 2021 13:16:26 +0100 Subject: [PATCH 11/50] fix [-Wstrict-prototypes] build warnings in ext/gd --- ext/gd/config.m4 | 2 -- ext/gd/gd.c | 58 ++++++++++++++++++++++++------------------------ 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/ext/gd/config.m4 b/ext/gd/config.m4 index b3f7880ded279..0a175d11d52e7 100644 --- a/ext/gd/config.m4 +++ b/ext/gd/config.m4 @@ -158,8 +158,6 @@ dnl if test "$PHP_GD" != "no"; then if test "$PHP_EXTERNAL_GD" = "no"; then - dnl Disable strict prototypes as GD takes advantages of variadic function signatures for function pointers. - GD_CFLAGS="-Wno-strict-prototypes" extra_sources="libgd/gd.c libgd/gd_gd.c libgd/gd_gd2.c libgd/gd_io.c libgd/gd_io_dp.c \ libgd/gd_io_file.c libgd/gd_ss.c libgd/gd_io_ss.c libgd/gd_webp.c libgd/gd_avif.c \ libgd/gd_png.c libgd/gd_jpeg.c libgd/gdxpm.c libgd/gdfontt.c libgd/gdfonts.c \ diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 166e82b4321c9..ebd3c6c9c3d01 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -140,16 +140,16 @@ static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS); static void php_image_filter_scatter(INTERNAL_FUNCTION_PARAMETERS); /* End Section filters declarations */ -static gdImagePtr _php_image_create_from_string(zend_string *Data, char *tn, gdImagePtr (*ioctx_func_p)()); -static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)()); -static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()); +static gdImagePtr _php_image_create_from_string(zend_string *Data, char *tn, gdImagePtr (*ioctx_func_p)(gdIOCtxPtr)); +static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(FILE *), gdImagePtr (*ioctx_func_p)(gdIOCtxPtr)); +static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn); static gdIOCtx *create_stream_context_from_zval(zval *to_zval); static gdIOCtx *create_stream_context(php_stream *stream, int close_stream); static gdIOCtx *create_output_context(void); static int _php_image_type(zend_string *data); /* output streaming (formerly gd_ctx.c) */ -static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()); +static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn); /********************************************************* * @@ -291,7 +291,7 @@ static zend_function *php_gd_font_object_get_constructor(zend_object *object) return NULL; } -static void php_gd_font_minit_helper() +static void php_gd_font_minit_helper(void) { gd_font_ce = register_class_GdFont(); gd_font_ce->create_object = php_gd_font_object_create; @@ -1524,7 +1524,7 @@ static int _php_image_type(zend_string *data) /* }}} */ /* {{{ _php_image_create_from_string */ -gdImagePtr _php_image_create_from_string(zend_string *data, char *tn, gdImagePtr (*ioctx_func_p)()) +gdImagePtr _php_image_create_from_string(zend_string *data, char *tn, gdImagePtr (*ioctx_func_p)(gdIOCtxPtr)) { gdImagePtr im; gdIOCtx *io_ctx; @@ -1629,7 +1629,7 @@ PHP_FUNCTION(imagecreatefromstring) /* }}} */ /* {{{ _php_image_create_from */ -static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)()) +static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(FILE *), gdImagePtr (*ioctx_func_p)(gdIOCtxPtr)) { char *file; size_t file_len; @@ -1673,7 +1673,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, if (FAILURE == php_stream_cast(stream, PHP_STREAM_AS_STDIO, (void**)&fp, REPORT_ERRORS)) { goto out_err; } - } else if (ioctx_func_p) { + } else if (ioctx_func_p || image_type == PHP_GDIMG_TYPE_GD2PART) { /* we can create an io context */ gdIOCtx* io_ctx; zend_string *buff; @@ -1697,7 +1697,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, } if (image_type == PHP_GDIMG_TYPE_GD2PART) { - im = (*ioctx_func_p)(io_ctx, srcx, srcy, width, height); + im = gdImageCreateFromGd2PartCtx(io_ctx, srcx, srcy, width, height); } else { im = (*ioctx_func_p)(io_ctx); } @@ -1715,7 +1715,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, if (!im && fp) { switch (image_type) { case PHP_GDIMG_TYPE_GD2PART: - im = (*func_p)(fp, srcx, srcy, width, height); + im = gdImageCreateFromGd2Part(fp, srcx, srcy, width, height); break; #ifdef HAVE_GD_XPM case PHP_GDIMG_TYPE_XPM: @@ -1807,7 +1807,7 @@ PHP_FUNCTION(imagecreatefromavif) /* {{{ Create a new image from XPM file or URL */ PHP_FUNCTION(imagecreatefromxpm) { - _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_XPM, "XPM", gdImageCreateFromXpm, NULL); + _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_XPM, "XPM", NULL, NULL); } /* }}} */ #endif @@ -1836,7 +1836,7 @@ PHP_FUNCTION(imagecreatefromgd2) /* {{{ Create a new image from a given part of GD2 file or URL */ PHP_FUNCTION(imagecreatefromgd2part) { - _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2PART, "GD2", gdImageCreateFromGd2Part, gdImageCreateFromGd2PartCtx); + _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2PART, "GD2", NULL, NULL); } /* }}} */ @@ -1859,7 +1859,7 @@ PHP_FUNCTION(imagecreatefromtga) #endif /* {{{ _php_image_output */ -static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()) +static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn) { zval *imgind; char *file = NULL; @@ -1906,13 +1906,13 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char switch (image_type) { case PHP_GDIMG_TYPE_GD: - (*func_p)(im, fp); + gdImageGd(im, fp); break; case PHP_GDIMG_TYPE_GD2: if (q == -1) { q = 128; } - (*func_p)(im, fp, q, t); + gdImageGd2(im, fp, q, t); break; EMPTY_SWITCH_DEFAULT_CASE() } @@ -1932,13 +1932,13 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char switch (image_type) { case PHP_GDIMG_TYPE_GD: - (*func_p)(im, tmp); + gdImageGd(im, tmp); break; case PHP_GDIMG_TYPE_GD2: if (q == -1) { q = 128; } - (*func_p)(im, tmp, q, t); + gdImageGd2(im, tmp, q, t); break; EMPTY_SWITCH_DEFAULT_CASE() } @@ -2008,7 +2008,7 @@ PHP_FUNCTION(imagexbm) /* {{{ Output GIF image to browser or file */ PHP_FUNCTION(imagegif) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GIF, "GIF", gdImageGifCtx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GIF, "GIF"); } /* }}} */ @@ -2016,7 +2016,7 @@ PHP_FUNCTION(imagegif) /* {{{ Output PNG image to browser or file */ PHP_FUNCTION(imagepng) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG, "PNG", gdImagePngCtxEx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG, "PNG"); } /* }}} */ #endif /* HAVE_GD_PNG */ @@ -2025,7 +2025,7 @@ PHP_FUNCTION(imagepng) /* {{{ Output WEBP image to browser or file */ PHP_FUNCTION(imagewebp) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WEBP, "WEBP", gdImageWebpCtx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WEBP, "WEBP"); } /* }}} */ #endif /* HAVE_GD_WEBP */ @@ -2034,7 +2034,7 @@ PHP_FUNCTION(imagewebp) /* {{{ Output AVIF image to browser or file */ PHP_FUNCTION(imageavif) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_AVIF, "AVIF", gdImageAvifCtx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_AVIF, "AVIF"); } /* }}} */ #endif /* HAVE_GD_AVIF */ @@ -2043,7 +2043,7 @@ PHP_FUNCTION(imageavif) /* {{{ Output JPEG image to browser or file */ PHP_FUNCTION(imagejpeg) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG, "JPEG", gdImageJpegCtx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG, "JPEG"); } /* }}} */ #endif /* HAVE_GD_JPG */ @@ -2095,14 +2095,14 @@ PHP_FUNCTION(imagewbmp) /* {{{ Output GD image to browser or file */ PHP_FUNCTION(imagegd) { - _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD, "GD", gdImageGd); + _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD, "GD"); } /* }}} */ /* {{{ Output GD2 image to browser or file */ PHP_FUNCTION(imagegd2) { - _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2, "GD2", gdImageGd2); + _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2, "GD2"); } /* }}} */ @@ -4220,7 +4220,7 @@ static gdIOCtx *create_output_context() { return ctx; } -static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()) +static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn) { zval *imgind; zend_long quality = -1, basefilter = -1, speed = -1; @@ -4259,19 +4259,19 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, switch (image_type) { case PHP_GDIMG_TYPE_JPG: - (*func_p)(im, ctx, (int) quality); + gdImageJpegCtx(im, ctx, (int) quality); break; case PHP_GDIMG_TYPE_WEBP: if (quality == -1) { quality = 80; } - (*func_p)(im, ctx, (int) quality); + gdImageWebpCtx(im, ctx, (int) quality); break; case PHP_GDIMG_TYPE_AVIF: if (speed == -1) { speed = 6; } - (*func_p)(im, ctx, (int) quality, (int) speed); + gdImageAvifCtx(im, ctx, (int) quality, (int) speed); break; #ifdef HAVE_GD_PNG case PHP_GDIMG_TYPE_PNG: @@ -4283,7 +4283,7 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, break; #endif case PHP_GDIMG_TYPE_GIF: - (*func_p)(im, ctx); + gdImageGifCtx(im, ctx); break; EMPTY_SWITCH_DEFAULT_CASE() } From 54f1f8cf2adab7ab7a773afdcaa54b42da5a9d2d Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 25 Nov 2021 13:20:27 +0100 Subject: [PATCH 12/50] add missing conditions --- ext/gd/gd.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ext/gd/gd.c b/ext/gd/gd.c index ebd3c6c9c3d01..0dbcf2de4bfe8 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -4258,21 +4258,27 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, } switch (image_type) { +#ifdef HAVE_GD_JPG case PHP_GDIMG_TYPE_JPG: gdImageJpegCtx(im, ctx, (int) quality); break; +#endif +#ifdef HAVE_GD_WEBP case PHP_GDIMG_TYPE_WEBP: if (quality == -1) { quality = 80; } gdImageWebpCtx(im, ctx, (int) quality); break; +#endif +#ifdef HAVE_GD_AVIF case PHP_GDIMG_TYPE_AVIF: if (speed == -1) { speed = 6; } gdImageAvifCtx(im, ctx, (int) quality, (int) speed); break; +#endif #ifdef HAVE_GD_PNG case PHP_GDIMG_TYPE_PNG: #ifdef HAVE_GD_BUNDLED From a40f3ef9d609e081383937c2ad2fe4482abc8434 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Thu, 25 Nov 2021 18:24:52 +0100 Subject: [PATCH 13/50] [ci skip] PHP 8.1.0 ships today --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 2eee1ea26d780..a4bab511d8441 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 8.1.0 +?? ??? ????, PHP 8.1.1 + + +25 Nov 2021, PHP 8.1.0 - Core: . Fixed bug #81607 (CE_CACHE allocation with concurrent access). (Nikita, From 179030d167937b8ae5957839c655e37482143469 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Wed, 24 Nov 2021 17:03:50 +0100 Subject: [PATCH 14/50] Fix #81649: imap_(un)delete accept sequences, not single numbers As such, the parameter name `$message_num` is utmost misleading; it should be `$message_nums` as for other functions. Closes GH-7686. --- NEWS | 4 ++++ ext/imap/php_imap.stub.php | 4 ++-- ext/imap/php_imap_arginfo.h | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 8af82b544a8bb..ba7db2896383f 100644 --- a/NEWS +++ b/NEWS @@ -19,6 +19,10 @@ PHP NEWS - GD: . Fixed bug #71316 (libpng warning from imagecreatefromstring). (cmb) +- IMAP: + . Fixed bug #81649 (imap_(un)delete accept sequences, not single numbers). + (cmb) + - OpenSSL: . Fixed bug #75725 (./configure: detecting RAND_egd). (Dilyan Palauzov) diff --git a/ext/imap/php_imap.stub.php b/ext/imap/php_imap.stub.php index d8b01988dfbe2..c49760777f836 100644 --- a/ext/imap/php_imap.stub.php +++ b/ext/imap/php_imap.stub.php @@ -81,12 +81,12 @@ function imap_expunge($imap): bool {} /** * @param resource $imap */ -function imap_delete($imap, string $message_num, int $flags = 0): bool {} +function imap_delete($imap, string $message_nums, int $flags = 0): bool {} /** * @param resource $imap */ -function imap_undelete($imap, string $message_num, int $flags = 0): bool {} +function imap_undelete($imap, string $message_nums, int $flags = 0): bool {} /** @param resource $imap */ function imap_check($imap): stdClass|false {} diff --git a/ext/imap/php_imap_arginfo.h b/ext/imap/php_imap_arginfo.h index 027baa2d32275..96c320911950f 100644 --- a/ext/imap/php_imap_arginfo.h +++ b/ext/imap/php_imap_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: d6d158112a802d867646b8f85402b8762599180b */ + * Stub hash: ec8020febecb370ef2e5f19f00cd092ecb198f8c */ ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_open, 0, 0, 3) ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0) @@ -107,7 +107,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_delete, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, imap) - ZEND_ARG_TYPE_INFO(0, message_num, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, message_nums, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_END_ARG_INFO() From 6008a75f393ddc9a170fc1e6a9ec8a1556ea12cf Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 23 Nov 2021 19:17:57 +0100 Subject: [PATCH 15/50] Update to PCRE2 10.39 We also apply an respective upstream fix[1]. [1] Closes GH-7678. --- NEWS | 3 + ext/pcre/pcre2lib/pcre2.h | 12 +- ext/pcre/pcre2lib/pcre2_compile.c | 34 +- ext/pcre/pcre2lib/pcre2_dfa_match.c | 69 +- ext/pcre/pcre2lib/pcre2_error.c | 3 +- ext/pcre/pcre2lib/pcre2_jit_compile.c | 32 +- ext/pcre/pcre2lib/pcre2_jit_simd_inc.h | 21 +- ext/pcre/pcre2lib/pcre2_match.c | 73 +- ext/pcre/pcre2lib/pcre2_tables.c | 347 +- ext/pcre/pcre2lib/pcre2_ucd.c | 6068 +++++++++-------- ext/pcre/pcre2lib/pcre2_ucp.h | 8 +- ext/pcre/pcre2lib/sljit/sljitConfigInternal.h | 12 + ext/pcre/pcre2lib/sljit/sljitLir.c | 25 +- ext/pcre/pcre2lib/sljit/sljitLir.h | 76 +- ext/pcre/pcre2lib/sljit/sljitNativeARM_32.c | 23 +- ext/pcre/pcre2lib/sljit/sljitNativeARM_64.c | 21 +- .../pcre2lib/sljit/sljitNativeARM_T2_32.c | 21 +- ext/pcre/pcre2lib/sljit/sljitNativeMIPS_32.c | 2 +- ext/pcre/pcre2lib/sljit/sljitNativeMIPS_64.c | 2 +- .../pcre2lib/sljit/sljitNativeMIPS_common.c | 16 +- ext/pcre/pcre2lib/sljit/sljitNativePPC_32.c | 26 +- ext/pcre/pcre2lib/sljit/sljitNativePPC_64.c | 32 +- .../pcre2lib/sljit/sljitNativePPC_common.c | 93 +- ext/pcre/pcre2lib/sljit/sljitNativeS390X.c | 1737 +++-- ext/pcre/pcre2lib/sljit/sljitNativeSPARC_32.c | 3 + .../pcre2lib/sljit/sljitNativeSPARC_common.c | 18 +- .../pcre2lib/sljit/sljitNativeX86_common.c | 2 - 27 files changed, 4633 insertions(+), 4146 deletions(-) diff --git a/NEWS b/NEWS index 3a9390f139ce7..08115cb4ab90c 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,9 @@ PHP NEWS . Fixed bug #81649 (imap_(un)delete accept sequences, not single numbers). (cmb) +- PCRE: + . Update bundled PCRE2 to 10.39 (cmb) + 25 Nov 2021, PHP 8.1.0 - Core: diff --git a/ext/pcre/pcre2lib/pcre2.h b/ext/pcre/pcre2lib/pcre2.h index 7ab6b39aeb68e..90a97d9cb7a62 100644 --- a/ext/pcre/pcre2lib/pcre2.h +++ b/ext/pcre/pcre2lib/pcre2.h @@ -5,7 +5,7 @@ /* This is the public header file for the PCRE library, second API, to be #included by applications that call PCRE2 functions. - Copyright (c) 2016-2020 University of Cambridge + Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE. /* The current PCRE version information. */ #define PCRE2_MAJOR 10 -#define PCRE2_MINOR 37 +#define PCRE2_MINOR 39 #define PCRE2_PRERELEASE -#define PCRE2_DATE 2021-05-26 +#define PCRE2_DATE 2021-10-29 /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE2, the appropriate @@ -84,8 +84,8 @@ set, we ensure here that it has no effect. */ /* Have to include limits.h, stdlib.h, and inttypes.h to ensure that size_t and uint8_t, UCHAR_MAX, etc are defined. Some systems that do have inttypes.h do not have stdint.h, which is why we use inttypes.h, which according to the C -standard is a superset of stdint.h. If none of these headers are available, -the relevant values must be provided by some other means. */ +standard is a superset of stdint.h. If inttypes.h is not available the build +will break and the relevant values must be provided by some other means. */ #include #include @@ -152,6 +152,7 @@ D is inspected during pcre2_dfa_match() execution #define PCRE2_EXTRA_MATCH_LINE 0x00000008u /* C */ #define PCRE2_EXTRA_ESCAPED_CR_IS_LF 0x00000010u /* C */ #define PCRE2_EXTRA_ALT_BSUX 0x00000020u /* C */ +#define PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK 0x00000040u /* C */ /* These are for pcre2_jit_compile(). */ @@ -311,6 +312,7 @@ pcre2_pattern_convert(). */ #define PCRE2_ERROR_SCRIPT_RUN_NOT_AVAILABLE 196 #define PCRE2_ERROR_TOO_MANY_CAPTURES 197 #define PCRE2_ERROR_CONDITION_ATOMIC_ASSERTION_EXPECTED 198 +#define PCRE2_ERROR_BACKSLASH_K_IN_LOOKAROUND 199 /* "Expected" matching error codes: no match and partial match. */ diff --git a/ext/pcre/pcre2lib/pcre2_compile.c b/ext/pcre/pcre2lib/pcre2_compile.c index da449ae9ed85a..383159be7637e 100644 --- a/ext/pcre/pcre2lib/pcre2_compile.c +++ b/ext/pcre/pcre2lib/pcre2_compile.c @@ -7,7 +7,7 @@ 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-2020 University of Cambridge + New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -137,7 +137,7 @@ static BOOL static int check_lookbehinds(uint32_t *, uint32_t **, parsed_recurse_check *, - compile_block *); + compile_block *, int *); /************************************************* @@ -782,12 +782,15 @@ are allowed. */ #define PUBLIC_COMPILE_EXTRA_OPTIONS \ (PUBLIC_LITERAL_COMPILE_EXTRA_OPTIONS| \ PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES|PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL| \ - PCRE2_EXTRA_ESCAPED_CR_IS_LF|PCRE2_EXTRA_ALT_BSUX) + PCRE2_EXTRA_ESCAPED_CR_IS_LF|PCRE2_EXTRA_ALT_BSUX| \ + PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK) /* Compile time error code numbers. They are given names so that they can more easily be tracked. When a new number is added, the tables called eint1 and eint2 in pcre2posix.c may need to be updated, and a new error text must be -added to compile_error_texts in pcre2_error.c. */ +added to compile_error_texts in pcre2_error.c. Also, the error codes in +pcre2.h.in must be updated - their values are exactly 100 greater than these +values. */ enum { ERR0 = COMPILE_ERROR_BASE, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10, @@ -799,7 +802,7 @@ enum { ERR0 = COMPILE_ERROR_BASE, 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, ERR96, ERR97, ERR98 }; + ERR91, ERR92, ERR93, ERR94, ERR95, ERR96, ERR97, ERR98, ERR99 }; /* 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 @@ -7799,6 +7802,16 @@ for (;; pptr++) } #endif + /* \K is forbidden in lookarounds since 10.38 because that's what Perl has + done. However, there's an option, in case anyone was relying on it. */ + + if (cb->assert_depth > 0 && meta_arg == ESC_K && + (cb->cx->extra_options & PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK) == 0) + { + *errorcodeptr = ERR99; + return 0; + } + /* For the rest (including \X when Unicode is supported - if not it's faulted at parse time), the OP value is the escape value when PCRE2_UCP is not set; if it is set, these escapes do not show up here because they are @@ -9148,7 +9161,7 @@ for (;; pptr++) case META_LOOKAHEAD: case META_LOOKAHEADNOT: case META_LOOKAHEAD_NA: - *errcodeptr = check_lookbehinds(pptr + 1, &pptr, recurses, cb); + *errcodeptr = check_lookbehinds(pptr + 1, &pptr, recurses, cb, lcptr); if (*errcodeptr != 0) return -1; /* Ignore any qualifiers that follow a lookahead assertion. */ @@ -9488,16 +9501,16 @@ Arguments retptr if not NULL, return the ket pointer here recurses chain of recurse_check to catch mutual recursion cb points to the compile block + lcptr points to loop counter Returns: 0 on success, or an errorcode (cb->erroroffset will be set) */ static int check_lookbehinds(uint32_t *pptr, uint32_t **retptr, - parsed_recurse_check *recurses, compile_block *cb) + parsed_recurse_check *recurses, compile_block *cb, int *lcptr) { int errorcode = 0; -int loopcount = 0; int nestlevel = 0; cb->erroroffset = PCRE2_UNSET; @@ -9623,7 +9636,7 @@ for (; *pptr != META_END; pptr++) case META_LOOKBEHIND: case META_LOOKBEHINDNOT: case META_LOOKBEHIND_NA: - if (!set_lookbehind_lengths(&pptr, &errorcode, &loopcount, recurses, cb)) + if (!set_lookbehind_lengths(&pptr, &errorcode, lcptr, recurses, cb)) return errorcode; break; } @@ -10078,7 +10091,8 @@ lengths. */ if (has_lookbehind) { - errorcode = check_lookbehinds(cb.parsed_pattern, NULL, NULL, &cb); + int loopcount = 0; + errorcode = check_lookbehinds(cb.parsed_pattern, NULL, NULL, &cb, &loopcount); if (errorcode != 0) goto HAD_CB_ERROR; } diff --git a/ext/pcre/pcre2lib/pcre2_dfa_match.c b/ext/pcre/pcre2lib/pcre2_dfa_match.c index 625695b7cb0ed..060dc7669a1c2 100644 --- a/ext/pcre/pcre2lib/pcre2_dfa_match.c +++ b/ext/pcre/pcre2lib/pcre2_dfa_match.c @@ -7,7 +7,7 @@ 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-2020 University of Cambridge + New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -3256,8 +3256,8 @@ BOOL has_first_cu = FALSE; BOOL has_req_cu = FALSE; #if PCRE2_CODE_UNIT_WIDTH == 8 -BOOL memchr_not_found_first_cu = FALSE; -BOOL memchr_not_found_first_cu2 = FALSE; +PCRE2_SPTR memchr_found_first_cu = NULL; +PCRE2_SPTR memchr_found_first_cu2 = NULL; #endif PCRE2_UCHAR first_cu = 0; @@ -3648,13 +3648,7 @@ for (;;) } } - /* Not anchored. Advance to a unique first code unit if there is one. In - 8-bit mode, the use of memchr() gives a big speed up, even though we have - to call it twice in caseless mode, in order to find the earliest occurrence - of the character in either of its cases. If a call to memchr() that - searches the rest of the subject fails to find one case, remember that in - order not to keep on repeating the search. This can make a huge difference - when the strings are very long and only one case is present. */ + /* Not anchored. Advance to a unique first code unit if there is one. */ else { @@ -3662,43 +3656,68 @@ for (;;) { if (first_cu != first_cu2) /* Caseless */ { + /* In 16-bit and 32_bit modes we have to do our own search, so can + look for both cases at once. */ + #if PCRE2_CODE_UNIT_WIDTH != 8 PCRE2_UCHAR smc; while (start_match < end_subject && (smc = UCHAR21TEST(start_match)) != first_cu && - smc != first_cu2) + smc != first_cu2) start_match++; +#else + /* In 8-bit mode, the use of memchr() gives a big speed up, even + though we have to call it twice in order to find the earliest + occurrence of the code unit in either of its cases. Caching is used + to remember the positions of previously found code units. This can + make a huge difference when the strings are very long and only one + case is actually present. */ -#else /* 8-bit code units */ PCRE2_SPTR pp1 = NULL; PCRE2_SPTR pp2 = NULL; - PCRE2_SIZE cu2size = end_subject - start_match; + PCRE2_SIZE searchlength = end_subject - start_match; - if (!memchr_not_found_first_cu) + /* If we haven't got a previously found position for first_cu, or if + the current starting position is later, we need to do a search. If + the code unit is not found, set it to the end. */ + + if (memchr_found_first_cu == NULL || + start_match > memchr_found_first_cu) { - pp1 = memchr(start_match, first_cu, end_subject - start_match); - if (pp1 == NULL) memchr_not_found_first_cu = TRUE; - else cu2size = pp1 - start_match; + pp1 = memchr(start_match, first_cu, searchlength); + memchr_found_first_cu = (pp1 == NULL)? end_subject : pp1; } - /* If pp1 is not NULL, we have arranged to search only as far as pp1, - to see if the other case is earlier, so we can set "not found" only - when both searches have returned NULL. */ + /* If the start is before a previously found position, use the + previous position, or NULL if a previous search failed. */ + + else pp1 = (memchr_found_first_cu == end_subject)? NULL : + memchr_found_first_cu; - if (!memchr_not_found_first_cu2) + /* Do the same thing for the other case. */ + + if (memchr_found_first_cu2 == NULL || + start_match > memchr_found_first_cu2) { - pp2 = memchr(start_match, first_cu2, cu2size); - memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL); + pp2 = memchr(start_match, first_cu2, searchlength); + memchr_found_first_cu2 = (pp2 == NULL)? end_subject : pp2; } + else pp2 = (memchr_found_first_cu2 == end_subject)? NULL : + memchr_found_first_cu2; + + /* Set the start to the end of the subject if neither case was found. + Otherwise, use the earlier found point. */ + if (pp1 == NULL) start_match = (pp2 == NULL)? end_subject : pp2; else start_match = (pp2 == NULL || pp1 < pp2)? pp1 : pp2; -#endif + +#endif /* 8-bit handling */ } - /* The caseful case */ + /* The caseful case is much simpler. */ else { diff --git a/ext/pcre/pcre2lib/pcre2_error.c b/ext/pcre/pcre2lib/pcre2_error.c index c61648cb7f466..3dee63d0dbe8b 100644 --- a/ext/pcre/pcre2lib/pcre2_error.c +++ b/ext/pcre/pcre2lib/pcre2_error.c @@ -7,7 +7,7 @@ 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-2019 University of Cambridge + New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -186,6 +186,7 @@ static const unsigned char compile_error_texts[] = "script runs require Unicode support, which this version of PCRE2 does not have\0" "too many capturing groups (maximum 65535)\0" "atomic assertion expected after (?( or (?(?C)\0" + "\\K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)\0" ; /* Match-time and UTF error texts are in the same format. */ diff --git a/ext/pcre/pcre2lib/pcre2_jit_compile.c b/ext/pcre/pcre2lib/pcre2_jit_compile.c index 8dd723a437e98..227714e577019 100644 --- a/ext/pcre/pcre2lib/pcre2_jit_compile.c +++ b/ext/pcre/pcre2lib/pcre2_jit_compile.c @@ -1621,7 +1621,7 @@ if (end[-(1 + LINK_SIZE)] != OP_KET || PRIVATE_DATA(begin) != 0) /* /(?:AB){4,6}/ is currently converted to /(?:AB){3}(?AB){1,3}/ * Skip the check of the second part. */ -if (PRIVATE_DATA(end - LINK_SIZE) == 0) +if (PRIVATE_DATA(end - LINK_SIZE) != 0) return TRUE; next = end; @@ -4202,9 +4202,6 @@ TMP2 is not used. Otherwise TMP2 must contain the start of the subject buffer, and it is destroyed. Does not modify STR_PTR for invalid character sequences. */ DEFINE_COMPILER; -SLJIT_UNUSED_ARG(backtracks); -SLJIT_UNUSED_ARG(must_be_valid); - #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 struct sljit_jump *jump; #endif @@ -4278,6 +4275,10 @@ if (common->invalid_utf && !must_be_valid) } #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ #endif /* SUPPORT_UNICODE */ + +SLJIT_UNUSED_ARG(backtracks); +SLJIT_UNUSED_ARG(must_be_valid); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); } @@ -8140,7 +8141,7 @@ switch(type) } else OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); if (!common->endonly) compile_simple_assertion_matchingpath(common, OP_EODN, cc, backtracks); @@ -8160,7 +8161,7 @@ switch(type) } else OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); check_partial(common, FALSE); jump[0] = JUMP(SLJIT_JUMP); JUMPHERE(jump[1]); @@ -8200,14 +8201,14 @@ switch(type) OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0)); OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); } else { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin)); add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0)); OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); } return cc; @@ -8226,7 +8227,7 @@ switch(type) jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP2, 0); OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); } - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); jump[0] = JUMP(SLJIT_JUMP); JUMPHERE(jump[1]); @@ -9580,11 +9581,11 @@ free_stack(common, callout_arg_size); /* Check return value. */ OP2(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); -add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER32)); +add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER)); if (common->abort_label == NULL) - add_jump(compiler, &common->abort, JUMP(SLJIT_NOT_EQUAL32) /* SIG_LESS */); + add_jump(compiler, &common->abort, JUMP(SLJIT_NOT_EQUAL) /* SIG_LESS */); else - JUMPTO(SLJIT_NOT_EQUAL32 /* SIG_LESS */, common->abort_label); + JUMPTO(SLJIT_NOT_EQUAL /* SIG_LESS */, common->abort_label); return cc + callout_length; } @@ -14131,6 +14132,10 @@ PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION pcre2_jit_compile(pcre2_code *code, uint32_t options) { pcre2_real_code *re = (pcre2_real_code *)code; +#ifdef SUPPORT_JIT +executable_functions *functions; +static int executable_allocator_is_working = 0; +#endif if (code == NULL) return PCRE2_ERROR_NULL; @@ -14165,8 +14170,7 @@ actions are needed: */ #ifdef SUPPORT_JIT -executable_functions *functions = (executable_functions *)re->executable_jit; -static int executable_allocator_is_working = 0; +functions = (executable_functions *)re->executable_jit; #endif if ((options & PCRE2_JIT_INVALID_UTF) != 0) diff --git a/ext/pcre/pcre2lib/pcre2_jit_simd_inc.h b/ext/pcre/pcre2lib/pcre2_jit_simd_inc.h index 5fd97b15bd4ec..aa029cce38fc3 100644 --- a/ext/pcre/pcre2lib/pcre2_jit_simd_inc.h +++ b/ext/pcre/pcre2lib/pcre2_jit_simd_inc.h @@ -1356,8 +1356,6 @@ else sljit_emit_op_custom(compiler, instruction, 6); } -/* TODO: use sljit_set_current_flags */ - /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp1_reg_ind << 4) | data_ind); instruction[1] = 7; @@ -1403,7 +1401,8 @@ else sljit_emit_op_custom(compiler, instruction, 6); } -/* TODO: use sljit_set_current_flags */ +sljit_set_current_flags(compiler, SLJIT_SET_OVERFLOW); +JUMPTO(SLJIT_OVERFLOW, start); /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp1_reg_ind << 4) | data_ind); @@ -1411,8 +1410,6 @@ instruction[1] = 7; instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); sljit_emit_op_custom(compiler, instruction, 6); -CMPTO(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 16, start); - OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); JUMPHERE(quit); @@ -1549,8 +1546,6 @@ else sljit_emit_op_custom(compiler, instruction, 6); } -/* TODO: use sljit_set_current_flags */ - /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp3_reg_ind << 4) | data_ind); instruction[1] = 7; @@ -1594,7 +1589,8 @@ else sljit_emit_op_custom(compiler, instruction, 6); } -/* TODO: use sljit_set_current_flags */ +sljit_set_current_flags(compiler, SLJIT_SET_OVERFLOW); +JUMPTO(SLJIT_OVERFLOW, start); /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp3_reg_ind << 4) | data_ind); @@ -1602,8 +1598,6 @@ instruction[1] = 7; instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); sljit_emit_op_custom(compiler, instruction, 6); -CMPTO(SLJIT_GREATER_EQUAL, TMP3, 0, SLJIT_IMM, 16, start); - OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP3, 0); JUMPHERE(quit); @@ -1778,8 +1772,6 @@ instruction[1] = (sljit_u16)((zero_ind << 12) | (1 << 4)); instruction[2] = (sljit_u16)((0xe << 8) | 0x81); sljit_emit_op_custom(compiler, instruction, 6); -/* TODO: use sljit_set_current_flags */ - /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp1_reg_ind << 4) | data1_ind); instruction[1] = 7; @@ -1819,7 +1811,8 @@ instruction[1] = (sljit_u16)((zero_ind << 12) | (1 << 4)); instruction[2] = (sljit_u16)((0xe << 8) | 0x81); sljit_emit_op_custom(compiler, instruction, 6); -/* TODO: use sljit_set_current_flags */ +sljit_set_current_flags(compiler, SLJIT_SET_OVERFLOW); +JUMPTO(SLJIT_OVERFLOW, start); /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp2_reg_ind << 4) | data1_ind); @@ -1827,8 +1820,6 @@ instruction[1] = 7; instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); sljit_emit_op_custom(compiler, instruction, 6); -CMPTO(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 16, start); - OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); JUMPHERE(quit); diff --git a/ext/pcre/pcre2lib/pcre2_match.c b/ext/pcre/pcre2lib/pcre2_match.c index ed60517131b38..f28cdbb47a515 100644 --- a/ext/pcre/pcre2lib/pcre2_match.c +++ b/ext/pcre/pcre2lib/pcre2_match.c @@ -7,7 +7,7 @@ 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) 2015-2020 University of Cambridge + New API code Copyright (c) 2015-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -6117,8 +6117,8 @@ BOOL has_req_cu = FALSE; BOOL startline; #if PCRE2_CODE_UNIT_WIDTH == 8 -BOOL memchr_not_found_first_cu; -BOOL memchr_not_found_first_cu2; +PCRE2_SPTR memchr_found_first_cu; +PCRE2_SPTR memchr_found_first_cu2; #endif PCRE2_UCHAR first_cu = 0; @@ -6712,8 +6712,8 @@ start_partial = match_partial = NULL; mb->hitend = FALSE; #if PCRE2_CODE_UNIT_WIDTH == 8 -memchr_not_found_first_cu = FALSE; -memchr_not_found_first_cu2 = FALSE; +memchr_found_first_cu = NULL; +memchr_found_first_cu2 = NULL; #endif for(;;) @@ -6782,13 +6782,7 @@ for(;;) } } - /* Not anchored. Advance to a unique first code unit if there is one. In - 8-bit mode, the use of memchr() gives a big speed up, even though we have - to call it twice in caseless mode, in order to find the earliest occurrence - of the character in either of its cases. If a call to memchr() that - searches the rest of the subject fails to find one case, remember that in - order not to keep on repeating the search. This can make a huge difference - when the strings are very long and only one case is present. */ + /* Not anchored. Advance to a unique first code unit if there is one. */ else { @@ -6796,43 +6790,68 @@ for(;;) { if (first_cu != first_cu2) /* Caseless */ { + /* In 16-bit and 32_bit modes we have to do our own search, so can + look for both cases at once. */ + #if PCRE2_CODE_UNIT_WIDTH != 8 PCRE2_UCHAR smc; while (start_match < end_subject && (smc = UCHAR21TEST(start_match)) != first_cu && - smc != first_cu2) + smc != first_cu2) start_match++; +#else + /* In 8-bit mode, the use of memchr() gives a big speed up, even + though we have to call it twice in order to find the earliest + occurrence of the code unit in either of its cases. Caching is used + to remember the positions of previously found code units. This can + make a huge difference when the strings are very long and only one + case is actually present. */ -#else /* 8-bit code units */ PCRE2_SPTR pp1 = NULL; PCRE2_SPTR pp2 = NULL; - PCRE2_SIZE cu2size = end_subject - start_match; + PCRE2_SIZE searchlength = end_subject - start_match; - if (!memchr_not_found_first_cu) + /* If we haven't got a previously found position for first_cu, or if + the current starting position is later, we need to do a search. If + the code unit is not found, set it to the end. */ + + if (memchr_found_first_cu == NULL || + start_match > memchr_found_first_cu) { - pp1 = memchr(start_match, first_cu, end_subject - start_match); - if (pp1 == NULL) memchr_not_found_first_cu = TRUE; - else cu2size = pp1 - start_match; + pp1 = memchr(start_match, first_cu, searchlength); + memchr_found_first_cu = (pp1 == NULL)? end_subject : pp1; } - /* If pp1 is not NULL, we have arranged to search only as far as pp1, - to see if the other case is earlier, so we can set "not found" only - when both searches have returned NULL. */ + /* If the start is before a previously found position, use the + previous position, or NULL if a previous search failed. */ + + else pp1 = (memchr_found_first_cu == end_subject)? NULL : + memchr_found_first_cu; - if (!memchr_not_found_first_cu2) + /* Do the same thing for the other case. */ + + if (memchr_found_first_cu2 == NULL || + start_match > memchr_found_first_cu2) { - pp2 = memchr(start_match, first_cu2, cu2size); - memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL); + pp2 = memchr(start_match, first_cu2, searchlength); + memchr_found_first_cu2 = (pp2 == NULL)? end_subject : pp2; } + else pp2 = (memchr_found_first_cu2 == end_subject)? NULL : + memchr_found_first_cu2; + + /* Set the start to the end of the subject if neither case was found. + Otherwise, use the earlier found point. */ + if (pp1 == NULL) start_match = (pp2 == NULL)? end_subject : pp2; else start_match = (pp2 == NULL || pp1 < pp2)? pp1 : pp2; -#endif + +#endif /* 8-bit handling */ } - /* The caseful case */ + /* The caseful case is much simpler. */ else { diff --git a/ext/pcre/pcre2lib/pcre2_tables.c b/ext/pcre/pcre2lib/pcre2_tables.c index b10de45efbf97..c164e976e0f34 100644 --- a/ext/pcre/pcre2lib/pcre2_tables.c +++ b/ext/pcre/pcre2lib/pcre2_tables.c @@ -273,6 +273,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Cs0 STR_C STR_s "\0" #define STRING_Cuneiform0 STR_C STR_u STR_n STR_e STR_i STR_f STR_o STR_r STR_m "\0" #define STRING_Cypriot0 STR_C STR_y STR_p STR_r STR_i STR_o STR_t "\0" +#define STRING_Cypro_Minoan0 STR_C STR_y STR_p STR_r STR_o STR_UNDERSCORE STR_M STR_i STR_n STR_o STR_a STR_n "\0" #define STRING_Cyrillic0 STR_C STR_y STR_r STR_i STR_l STR_l STR_i STR_c "\0" #define STRING_Deseret0 STR_D STR_e STR_s STR_e STR_r STR_e STR_t "\0" #define STRING_Devanagari0 STR_D STR_e STR_v STR_a STR_n STR_a STR_g STR_a STR_r STR_i "\0" @@ -371,6 +372,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Old_Sogdian0 STR_O STR_l STR_d STR_UNDERSCORE STR_S STR_o STR_g STR_d STR_i STR_a STR_n "\0" #define STRING_Old_South_Arabian0 STR_O STR_l STR_d STR_UNDERSCORE STR_S STR_o STR_u STR_t STR_h STR_UNDERSCORE STR_A STR_r STR_a STR_b STR_i STR_a STR_n "\0" #define STRING_Old_Turkic0 STR_O STR_l STR_d STR_UNDERSCORE STR_T STR_u STR_r STR_k STR_i STR_c "\0" +#define STRING_Old_Uyghur0 STR_O STR_l STR_d STR_UNDERSCORE STR_U STR_y STR_g STR_h STR_u STR_r "\0" #define STRING_Oriya0 STR_O STR_r STR_i STR_y STR_a "\0" #define STRING_Osage0 STR_O STR_s STR_a STR_g STR_e "\0" #define STRING_Osmanya0 STR_O STR_s STR_m STR_a STR_n STR_y STR_a "\0" @@ -415,6 +417,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Tai_Viet0 STR_T STR_a STR_i STR_UNDERSCORE STR_V STR_i STR_e STR_t "\0" #define STRING_Takri0 STR_T STR_a STR_k STR_r STR_i "\0" #define STRING_Tamil0 STR_T STR_a STR_m STR_i STR_l "\0" +#define STRING_Tangsa0 STR_T STR_a STR_n STR_g STR_s STR_a "\0" #define STRING_Tangut0 STR_T STR_a STR_n STR_g STR_u STR_t "\0" #define STRING_Telugu0 STR_T STR_e STR_l STR_u STR_g STR_u "\0" #define STRING_Thaana0 STR_T STR_h STR_a STR_a STR_n STR_a "\0" @@ -422,9 +425,11 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Tibetan0 STR_T STR_i STR_b STR_e STR_t STR_a STR_n "\0" #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_Toto0 STR_T STR_o STR_t STR_o "\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_Vithkuqi0 STR_V STR_i STR_t STR_h STR_k STR_u STR_q STR_i "\0" #define STRING_Wancho0 STR_W STR_a STR_n STR_c STR_h STR_o "\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" @@ -476,6 +481,7 @@ const char PRIV(utt_names)[] = STRING_Cs0 STRING_Cuneiform0 STRING_Cypriot0 + STRING_Cypro_Minoan0 STRING_Cyrillic0 STRING_Deseret0 STRING_Devanagari0 @@ -574,6 +580,7 @@ const char PRIV(utt_names)[] = STRING_Old_Sogdian0 STRING_Old_South_Arabian0 STRING_Old_Turkic0 + STRING_Old_Uyghur0 STRING_Oriya0 STRING_Osage0 STRING_Osmanya0 @@ -618,6 +625,7 @@ const char PRIV(utt_names)[] = STRING_Tai_Viet0 STRING_Takri0 STRING_Tamil0 + STRING_Tangsa0 STRING_Tangut0 STRING_Telugu0 STRING_Thaana0 @@ -625,9 +633,11 @@ const char PRIV(utt_names)[] = STRING_Tibetan0 STRING_Tifinagh0 STRING_Tirhuta0 + STRING_Toto0 STRING_Ugaritic0 STRING_Unknown0 STRING_Vai0 + STRING_Vithkuqi0 STRING_Wancho0 STRING_Warang_Citi0 STRING_Xan0 @@ -679,172 +689,177 @@ const ucp_type_table PRIV(utt)[] = { { 255, PT_PC, ucp_Cs }, { 258, PT_SC, ucp_Cuneiform }, { 268, PT_SC, ucp_Cypriot }, - { 276, PT_SC, ucp_Cyrillic }, - { 285, PT_SC, ucp_Deseret }, - { 293, PT_SC, ucp_Devanagari }, - { 304, PT_SC, ucp_Dives_Akuru }, - { 316, PT_SC, ucp_Dogra }, - { 322, PT_SC, ucp_Duployan }, - { 331, PT_SC, ucp_Egyptian_Hieroglyphs }, - { 352, PT_SC, ucp_Elbasan }, - { 360, PT_SC, ucp_Elymaic }, - { 368, PT_SC, ucp_Ethiopic }, - { 377, PT_SC, ucp_Georgian }, - { 386, PT_SC, ucp_Glagolitic }, - { 397, PT_SC, ucp_Gothic }, - { 404, PT_SC, ucp_Grantha }, - { 412, PT_SC, ucp_Greek }, - { 418, PT_SC, ucp_Gujarati }, - { 427, PT_SC, ucp_Gunjala_Gondi }, - { 441, PT_SC, ucp_Gurmukhi }, - { 450, PT_SC, ucp_Han }, - { 454, PT_SC, ucp_Hangul }, - { 461, PT_SC, ucp_Hanifi_Rohingya }, - { 477, PT_SC, ucp_Hanunoo }, - { 485, PT_SC, ucp_Hatran }, - { 492, PT_SC, ucp_Hebrew }, - { 499, PT_SC, ucp_Hiragana }, - { 508, PT_SC, ucp_Imperial_Aramaic }, - { 525, PT_SC, ucp_Inherited }, - { 535, PT_SC, ucp_Inscriptional_Pahlavi }, - { 557, PT_SC, ucp_Inscriptional_Parthian }, - { 580, PT_SC, ucp_Javanese }, - { 589, PT_SC, ucp_Kaithi }, - { 596, PT_SC, ucp_Kannada }, - { 604, PT_SC, ucp_Katakana }, - { 613, PT_SC, ucp_Kayah_Li }, - { 622, PT_SC, ucp_Kharoshthi }, - { 633, PT_SC, ucp_Khitan_Small_Script }, - { 653, PT_SC, ucp_Khmer }, - { 659, PT_SC, ucp_Khojki }, - { 666, PT_SC, ucp_Khudawadi }, - { 676, PT_GC, ucp_L }, - { 678, PT_LAMP, 0 }, - { 681, PT_SC, ucp_Lao }, - { 685, PT_SC, ucp_Latin }, - { 691, PT_SC, ucp_Lepcha }, - { 698, PT_SC, ucp_Limbu }, - { 704, PT_SC, ucp_Linear_A }, - { 713, PT_SC, ucp_Linear_B }, - { 722, PT_SC, ucp_Lisu }, - { 727, PT_PC, ucp_Ll }, - { 730, PT_PC, ucp_Lm }, - { 733, PT_PC, ucp_Lo }, - { 736, PT_PC, ucp_Lt }, - { 739, PT_PC, ucp_Lu }, - { 742, PT_SC, ucp_Lycian }, - { 749, PT_SC, ucp_Lydian }, - { 756, PT_GC, ucp_M }, - { 758, PT_SC, ucp_Mahajani }, - { 767, PT_SC, ucp_Makasar }, - { 775, PT_SC, ucp_Malayalam }, - { 785, PT_SC, ucp_Mandaic }, - { 793, PT_SC, ucp_Manichaean }, - { 804, PT_SC, ucp_Marchen }, - { 812, PT_SC, ucp_Masaram_Gondi }, - { 826, PT_PC, ucp_Mc }, - { 829, PT_PC, ucp_Me }, - { 832, PT_SC, ucp_Medefaidrin }, - { 844, PT_SC, ucp_Meetei_Mayek }, - { 857, PT_SC, ucp_Mende_Kikakui }, - { 871, PT_SC, ucp_Meroitic_Cursive }, - { 888, PT_SC, ucp_Meroitic_Hieroglyphs }, - { 909, PT_SC, ucp_Miao }, - { 914, PT_PC, ucp_Mn }, - { 917, PT_SC, ucp_Modi }, - { 922, PT_SC, ucp_Mongolian }, - { 932, PT_SC, ucp_Mro }, - { 936, PT_SC, ucp_Multani }, - { 944, PT_SC, ucp_Myanmar }, - { 952, PT_GC, ucp_N }, - { 954, PT_SC, ucp_Nabataean }, - { 964, PT_SC, ucp_Nandinagari }, - { 976, PT_PC, ucp_Nd }, - { 979, PT_SC, ucp_New_Tai_Lue }, - { 991, PT_SC, ucp_Newa }, - { 996, PT_SC, ucp_Nko }, - { 1000, PT_PC, ucp_Nl }, - { 1003, PT_PC, ucp_No }, - { 1006, PT_SC, ucp_Nushu }, - { 1012, PT_SC, ucp_Nyiakeng_Puachue_Hmong }, - { 1035, PT_SC, ucp_Ogham }, - { 1041, PT_SC, ucp_Ol_Chiki }, - { 1050, PT_SC, ucp_Old_Hungarian }, - { 1064, PT_SC, ucp_Old_Italic }, - { 1075, PT_SC, ucp_Old_North_Arabian }, - { 1093, PT_SC, ucp_Old_Permic }, - { 1104, PT_SC, ucp_Old_Persian }, - { 1116, PT_SC, ucp_Old_Sogdian }, - { 1128, PT_SC, ucp_Old_South_Arabian }, - { 1146, PT_SC, ucp_Old_Turkic }, - { 1157, PT_SC, ucp_Oriya }, - { 1163, PT_SC, ucp_Osage }, - { 1169, PT_SC, ucp_Osmanya }, - { 1177, PT_GC, ucp_P }, - { 1179, PT_SC, ucp_Pahawh_Hmong }, - { 1192, PT_SC, ucp_Palmyrene }, - { 1202, PT_SC, ucp_Pau_Cin_Hau }, - { 1214, PT_PC, ucp_Pc }, - { 1217, PT_PC, ucp_Pd }, - { 1220, PT_PC, ucp_Pe }, - { 1223, PT_PC, ucp_Pf }, - { 1226, PT_SC, ucp_Phags_Pa }, - { 1235, PT_SC, ucp_Phoenician }, - { 1246, PT_PC, ucp_Pi }, - { 1249, PT_PC, ucp_Po }, - { 1252, PT_PC, ucp_Ps }, - { 1255, PT_SC, ucp_Psalter_Pahlavi }, - { 1271, PT_SC, ucp_Rejang }, - { 1278, PT_SC, ucp_Runic }, - { 1284, PT_GC, ucp_S }, - { 1286, PT_SC, ucp_Samaritan }, - { 1296, PT_SC, ucp_Saurashtra }, - { 1307, PT_PC, ucp_Sc }, - { 1310, PT_SC, ucp_Sharada }, - { 1318, PT_SC, ucp_Shavian }, - { 1326, PT_SC, ucp_Siddham }, - { 1334, PT_SC, ucp_SignWriting }, - { 1346, PT_SC, ucp_Sinhala }, - { 1354, PT_PC, ucp_Sk }, - { 1357, PT_PC, ucp_Sm }, - { 1360, PT_PC, ucp_So }, - { 1363, PT_SC, ucp_Sogdian }, - { 1371, PT_SC, ucp_Sora_Sompeng }, - { 1384, PT_SC, ucp_Soyombo }, - { 1392, PT_SC, ucp_Sundanese }, - { 1402, PT_SC, ucp_Syloti_Nagri }, - { 1415, PT_SC, ucp_Syriac }, - { 1422, PT_SC, ucp_Tagalog }, - { 1430, PT_SC, ucp_Tagbanwa }, - { 1439, PT_SC, ucp_Tai_Le }, - { 1446, PT_SC, ucp_Tai_Tham }, - { 1455, PT_SC, ucp_Tai_Viet }, - { 1464, PT_SC, ucp_Takri }, - { 1470, PT_SC, ucp_Tamil }, - { 1476, PT_SC, ucp_Tangut }, - { 1483, PT_SC, ucp_Telugu }, - { 1490, PT_SC, ucp_Thaana }, - { 1497, PT_SC, ucp_Thai }, - { 1502, PT_SC, ucp_Tibetan }, - { 1510, PT_SC, ucp_Tifinagh }, - { 1519, PT_SC, ucp_Tirhuta }, - { 1527, PT_SC, ucp_Ugaritic }, - { 1536, PT_SC, ucp_Unknown }, - { 1544, PT_SC, ucp_Vai }, - { 1548, PT_SC, ucp_Wancho }, - { 1555, PT_SC, ucp_Warang_Citi }, - { 1567, PT_ALNUM, 0 }, - { 1571, PT_PXSPACE, 0 }, - { 1575, PT_SPACE, 0 }, - { 1579, PT_UCNC, 0 }, - { 1583, PT_WORD, 0 }, - { 1587, PT_SC, ucp_Yezidi }, - { 1594, PT_SC, ucp_Yi }, - { 1597, PT_GC, ucp_Z }, - { 1599, PT_SC, ucp_Zanabazar_Square }, - { 1616, PT_PC, ucp_Zl }, - { 1619, PT_PC, ucp_Zp }, - { 1622, PT_PC, ucp_Zs } + { 276, PT_SC, ucp_Cypro_Minoan }, + { 289, PT_SC, ucp_Cyrillic }, + { 298, PT_SC, ucp_Deseret }, + { 306, PT_SC, ucp_Devanagari }, + { 317, PT_SC, ucp_Dives_Akuru }, + { 329, PT_SC, ucp_Dogra }, + { 335, PT_SC, ucp_Duployan }, + { 344, PT_SC, ucp_Egyptian_Hieroglyphs }, + { 365, PT_SC, ucp_Elbasan }, + { 373, PT_SC, ucp_Elymaic }, + { 381, PT_SC, ucp_Ethiopic }, + { 390, PT_SC, ucp_Georgian }, + { 399, PT_SC, ucp_Glagolitic }, + { 410, PT_SC, ucp_Gothic }, + { 417, PT_SC, ucp_Grantha }, + { 425, PT_SC, ucp_Greek }, + { 431, PT_SC, ucp_Gujarati }, + { 440, PT_SC, ucp_Gunjala_Gondi }, + { 454, PT_SC, ucp_Gurmukhi }, + { 463, PT_SC, ucp_Han }, + { 467, PT_SC, ucp_Hangul }, + { 474, PT_SC, ucp_Hanifi_Rohingya }, + { 490, PT_SC, ucp_Hanunoo }, + { 498, PT_SC, ucp_Hatran }, + { 505, PT_SC, ucp_Hebrew }, + { 512, PT_SC, ucp_Hiragana }, + { 521, PT_SC, ucp_Imperial_Aramaic }, + { 538, PT_SC, ucp_Inherited }, + { 548, PT_SC, ucp_Inscriptional_Pahlavi }, + { 570, PT_SC, ucp_Inscriptional_Parthian }, + { 593, PT_SC, ucp_Javanese }, + { 602, PT_SC, ucp_Kaithi }, + { 609, PT_SC, ucp_Kannada }, + { 617, PT_SC, ucp_Katakana }, + { 626, PT_SC, ucp_Kayah_Li }, + { 635, PT_SC, ucp_Kharoshthi }, + { 646, PT_SC, ucp_Khitan_Small_Script }, + { 666, PT_SC, ucp_Khmer }, + { 672, PT_SC, ucp_Khojki }, + { 679, PT_SC, ucp_Khudawadi }, + { 689, PT_GC, ucp_L }, + { 691, PT_LAMP, 0 }, + { 694, PT_SC, ucp_Lao }, + { 698, PT_SC, ucp_Latin }, + { 704, PT_SC, ucp_Lepcha }, + { 711, PT_SC, ucp_Limbu }, + { 717, PT_SC, ucp_Linear_A }, + { 726, PT_SC, ucp_Linear_B }, + { 735, PT_SC, ucp_Lisu }, + { 740, PT_PC, ucp_Ll }, + { 743, PT_PC, ucp_Lm }, + { 746, PT_PC, ucp_Lo }, + { 749, PT_PC, ucp_Lt }, + { 752, PT_PC, ucp_Lu }, + { 755, PT_SC, ucp_Lycian }, + { 762, PT_SC, ucp_Lydian }, + { 769, PT_GC, ucp_M }, + { 771, PT_SC, ucp_Mahajani }, + { 780, PT_SC, ucp_Makasar }, + { 788, PT_SC, ucp_Malayalam }, + { 798, PT_SC, ucp_Mandaic }, + { 806, PT_SC, ucp_Manichaean }, + { 817, PT_SC, ucp_Marchen }, + { 825, PT_SC, ucp_Masaram_Gondi }, + { 839, PT_PC, ucp_Mc }, + { 842, PT_PC, ucp_Me }, + { 845, PT_SC, ucp_Medefaidrin }, + { 857, PT_SC, ucp_Meetei_Mayek }, + { 870, PT_SC, ucp_Mende_Kikakui }, + { 884, PT_SC, ucp_Meroitic_Cursive }, + { 901, PT_SC, ucp_Meroitic_Hieroglyphs }, + { 922, PT_SC, ucp_Miao }, + { 927, PT_PC, ucp_Mn }, + { 930, PT_SC, ucp_Modi }, + { 935, PT_SC, ucp_Mongolian }, + { 945, PT_SC, ucp_Mro }, + { 949, PT_SC, ucp_Multani }, + { 957, PT_SC, ucp_Myanmar }, + { 965, PT_GC, ucp_N }, + { 967, PT_SC, ucp_Nabataean }, + { 977, PT_SC, ucp_Nandinagari }, + { 989, PT_PC, ucp_Nd }, + { 992, PT_SC, ucp_New_Tai_Lue }, + { 1004, PT_SC, ucp_Newa }, + { 1009, PT_SC, ucp_Nko }, + { 1013, PT_PC, ucp_Nl }, + { 1016, PT_PC, ucp_No }, + { 1019, PT_SC, ucp_Nushu }, + { 1025, PT_SC, ucp_Nyiakeng_Puachue_Hmong }, + { 1048, PT_SC, ucp_Ogham }, + { 1054, PT_SC, ucp_Ol_Chiki }, + { 1063, PT_SC, ucp_Old_Hungarian }, + { 1077, PT_SC, ucp_Old_Italic }, + { 1088, PT_SC, ucp_Old_North_Arabian }, + { 1106, PT_SC, ucp_Old_Permic }, + { 1117, PT_SC, ucp_Old_Persian }, + { 1129, PT_SC, ucp_Old_Sogdian }, + { 1141, PT_SC, ucp_Old_South_Arabian }, + { 1159, PT_SC, ucp_Old_Turkic }, + { 1170, PT_SC, ucp_Old_Uyghur }, + { 1181, PT_SC, ucp_Oriya }, + { 1187, PT_SC, ucp_Osage }, + { 1193, PT_SC, ucp_Osmanya }, + { 1201, PT_GC, ucp_P }, + { 1203, PT_SC, ucp_Pahawh_Hmong }, + { 1216, PT_SC, ucp_Palmyrene }, + { 1226, PT_SC, ucp_Pau_Cin_Hau }, + { 1238, PT_PC, ucp_Pc }, + { 1241, PT_PC, ucp_Pd }, + { 1244, PT_PC, ucp_Pe }, + { 1247, PT_PC, ucp_Pf }, + { 1250, PT_SC, ucp_Phags_Pa }, + { 1259, PT_SC, ucp_Phoenician }, + { 1270, PT_PC, ucp_Pi }, + { 1273, PT_PC, ucp_Po }, + { 1276, PT_PC, ucp_Ps }, + { 1279, PT_SC, ucp_Psalter_Pahlavi }, + { 1295, PT_SC, ucp_Rejang }, + { 1302, PT_SC, ucp_Runic }, + { 1308, PT_GC, ucp_S }, + { 1310, PT_SC, ucp_Samaritan }, + { 1320, PT_SC, ucp_Saurashtra }, + { 1331, PT_PC, ucp_Sc }, + { 1334, PT_SC, ucp_Sharada }, + { 1342, PT_SC, ucp_Shavian }, + { 1350, PT_SC, ucp_Siddham }, + { 1358, PT_SC, ucp_SignWriting }, + { 1370, PT_SC, ucp_Sinhala }, + { 1378, PT_PC, ucp_Sk }, + { 1381, PT_PC, ucp_Sm }, + { 1384, PT_PC, ucp_So }, + { 1387, PT_SC, ucp_Sogdian }, + { 1395, PT_SC, ucp_Sora_Sompeng }, + { 1408, PT_SC, ucp_Soyombo }, + { 1416, PT_SC, ucp_Sundanese }, + { 1426, PT_SC, ucp_Syloti_Nagri }, + { 1439, PT_SC, ucp_Syriac }, + { 1446, PT_SC, ucp_Tagalog }, + { 1454, PT_SC, ucp_Tagbanwa }, + { 1463, PT_SC, ucp_Tai_Le }, + { 1470, PT_SC, ucp_Tai_Tham }, + { 1479, PT_SC, ucp_Tai_Viet }, + { 1488, PT_SC, ucp_Takri }, + { 1494, PT_SC, ucp_Tamil }, + { 1500, PT_SC, ucp_Tangsa }, + { 1507, PT_SC, ucp_Tangut }, + { 1514, PT_SC, ucp_Telugu }, + { 1521, PT_SC, ucp_Thaana }, + { 1528, PT_SC, ucp_Thai }, + { 1533, PT_SC, ucp_Tibetan }, + { 1541, PT_SC, ucp_Tifinagh }, + { 1550, PT_SC, ucp_Tirhuta }, + { 1558, PT_SC, ucp_Toto }, + { 1563, PT_SC, ucp_Ugaritic }, + { 1572, PT_SC, ucp_Unknown }, + { 1580, PT_SC, ucp_Vai }, + { 1584, PT_SC, ucp_Vithkuqi }, + { 1593, PT_SC, ucp_Wancho }, + { 1600, PT_SC, ucp_Warang_Citi }, + { 1612, PT_ALNUM, 0 }, + { 1616, PT_PXSPACE, 0 }, + { 1620, PT_SPACE, 0 }, + { 1624, PT_UCNC, 0 }, + { 1628, PT_WORD, 0 }, + { 1632, PT_SC, ucp_Yezidi }, + { 1639, PT_SC, ucp_Yi }, + { 1642, PT_GC, ucp_Z }, + { 1644, PT_SC, ucp_Zanabazar_Square }, + { 1661, PT_PC, ucp_Zl }, + { 1664, PT_PC, ucp_Zp }, + { 1667, PT_PC, ucp_Zs } }; const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table); diff --git a/ext/pcre/pcre2lib/pcre2_ucd.c b/ext/pcre/pcre2lib/pcre2_ucd.c index 46e23ff06b29f..0b8ac75bd4df1 100644 --- a/ext/pcre/pcre2lib/pcre2_ucd.c +++ b/ext/pcre/pcre2lib/pcre2_ucd.c @@ -20,7 +20,7 @@ needed. */ /* Unicode character database. */ /* This file was autogenerated by the MultiStage2.py script. */ -/* Total size: 101044 bytes, block size: 128. */ +/* Total size: 102844 bytes, block size: 128. */ /* The tables herein are needed only when UCP support is built, and in PCRE2 that happens automatically with UTF support. @@ -39,7 +39,7 @@ const uint16_t PRIV(ucd_stage2)[] = {0}; const uint32_t PRIV(ucd_caseless_sets)[] = {0}; #else -const char *PRIV(unicode_version) = "13.0.0"; +const char *PRIV(unicode_version) = "14.0.0"; /* If the 32-bit library is run in non-32-bit mode, character values greater than 0x10ffff may be encountered. For these we set up a @@ -116,16 +116,16 @@ 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)[] = { - 65, /* Number of subsequent values */ + 66, /* 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, 0x11959, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16b59, - 0x1d7d7, 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9, 0x1e959, - 0x1fbf9, + 0x11739, 0x118e9, 0x11959, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16ac9, + 0x16b59, 0x1d7d7, 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9, + 0x1e959, 0x1fbf9, }; /* This vector is a list of lists of scripts for the Script Extension @@ -135,55 +135,59 @@ const uint8_t PRIV(ucd_script_sets)[] = { /* 0 */ 0, /* 1 */ 1, 11, 0, /* 4 */ 1, 144, 0, - /* 7 */ 1, 50, 0, - /* 10 */ 1, 56, 0, - /* 13 */ 3, 15, 0, - /* 16 */ 4, 23, 0, - /* 19 */ 6, 84, 0, - /* 22 */ 12, 36, 0, - /* 25 */ 13, 18, 0, - /* 28 */ 13, 34, 0, - /* 31 */ 13, 118, 0, - /* 34 */ 13, 50, 0, - /* 37 */ 15, 107, 0, - /* 40 */ 15, 150, 0, - /* 43 */ 15, 100, 0, - /* 46 */ 15, 54, 0, - /* 49 */ 17, 34, 0, - /* 52 */ 107, 54, 0, - /* 55 */ 21, 108, 0, - /* 58 */ 22, 129, 0, - /* 61 */ 23, 34, 0, - /* 64 */ 27, 30, 0, - /* 67 */ 29, 150, 0, - /* 70 */ 34, 38, 0, - /* 73 */ 38, 65, 0, - /* 76 */ 1, 50, 56, 0, - /* 80 */ 1, 56, 156, 0, - /* 84 */ 3, 96, 49, 0, - /* 88 */ 96, 39, 53, 0, - /* 92 */ 12, 110, 36, 0, - /* 96 */ 15, 107, 29, 0, - /* 100 */ 15, 107, 34, 0, - /* 104 */ 23, 27, 30, 0, - /* 108 */ 69, 34, 39, 0, - /* 112 */ 3, 15, 107, 29, 0, - /* 117 */ 7, 25, 52, 51, 0, - /* 122 */ 15, 142, 85, 111, 0, - /* 127 */ 1, 144, 50, 56, 156, 0, - /* 133 */ 4, 24, 23, 27, 30, 0, - /* 139 */ 4, 24, 23, 27, 30, 61, 0, - /* 146 */ 15, 29, 37, 44, 54, 55, 0, - /* 153 */ 132, 1, 95, 112, 121, 144, 148, 50, 0, - /* 162 */ 3, 15, 107, 29, 150, 44, 55, 124, 0, - /* 171 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0, - /* 183 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0, - /* 196 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0, - /* 210 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 150, 109, 102, 124, 0, - /* 224 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 150, 109, 102, 124, 0, - /* 239 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, - /* 260 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 35, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, - /* 282 */ + /* 7 */ 1, 64, 0, + /* 10 */ 1, 50, 0, + /* 13 */ 1, 56, 0, + /* 16 */ 3, 15, 0, + /* 19 */ 4, 23, 0, + /* 22 */ 6, 84, 0, + /* 25 */ 12, 36, 0, + /* 28 */ 13, 18, 0, + /* 31 */ 13, 34, 0, + /* 34 */ 13, 118, 0, + /* 37 */ 13, 50, 0, + /* 40 */ 15, 107, 0, + /* 43 */ 15, 150, 0, + /* 46 */ 15, 100, 0, + /* 49 */ 15, 54, 0, + /* 52 */ 17, 34, 0, + /* 55 */ 107, 54, 0, + /* 58 */ 21, 108, 0, + /* 61 */ 22, 129, 0, + /* 64 */ 23, 34, 0, + /* 67 */ 27, 30, 0, + /* 70 */ 29, 150, 0, + /* 73 */ 34, 38, 0, + /* 76 */ 112, 158, 0, + /* 79 */ 38, 65, 0, + /* 82 */ 1, 50, 56, 0, + /* 86 */ 1, 56, 156, 0, + /* 90 */ 3, 96, 49, 0, + /* 94 */ 96, 39, 53, 0, + /* 98 */ 157, 12, 36, 0, + /* 102 */ 12, 110, 36, 0, + /* 106 */ 15, 107, 29, 0, + /* 110 */ 15, 107, 34, 0, + /* 114 */ 23, 27, 30, 0, + /* 118 */ 69, 34, 39, 0, + /* 122 */ 3, 15, 107, 29, 0, + /* 127 */ 7, 25, 52, 51, 0, + /* 132 */ 15, 142, 85, 111, 0, + /* 137 */ 4, 24, 23, 27, 30, 0, + /* 143 */ 1, 64, 144, 50, 56, 156, 0, + /* 150 */ 4, 24, 23, 27, 30, 61, 0, + /* 157 */ 15, 29, 37, 44, 54, 55, 0, + /* 164 */ 132, 1, 64, 144, 50, 56, 156, 0, + /* 172 */ 3, 15, 107, 29, 150, 44, 55, 124, 0, + /* 181 */ 132, 1, 95, 112, 158, 121, 144, 148, 50, 0, + /* 191 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0, + /* 203 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0, + /* 216 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0, + /* 230 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 150, 109, 102, 124, 0, + /* 244 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 150, 109, 102, 124, 0, + /* 259 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, + /* 280 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 35, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, + /* 302 */ }; /* These are the main two-stage UCD tables. The fields in each record are: @@ -192,7 +196,7 @@ offset to multichar other cases or zero (8 bits), offset to other case or zero (32 bits, signed), script extension (16 bits, signed), and a dummy 16-bit field to make the whole thing a multiple of 4 bytes. */ -const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */ +const ucd_record PRIV(ucd_records)[] = { /* 11964 bytes, record size 12 */ { 10, 0, 2, 0, 0, 10, 256, }, /* 0 */ { 10, 0, 2, 0, 0, 10, 0, }, /* 1 */ { 10, 0, 1, 0, 0, 10, 0, }, /* 2 */ @@ -390,9 +394,9 @@ const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */ { 13, 9, 12, 88, 1, 13, 0, }, /* 194 */ { 13, 5, 12, 88, -1, 13, 0, }, /* 195 */ { 13, 26, 12, 0, 0, 13, 0, }, /* 196 */ - { 13, 12, 3, 0, 0, -31, 0, }, /* 197 */ - { 13, 12, 3, 0, 0, -25, 0, }, /* 198 */ - { 28, 12, 3, 0, 0, -28, 0, }, /* 199 */ + { 13, 12, 3, 0, 0, -34, 0, }, /* 197 */ + { 13, 12, 3, 0, 0, -28, 0, }, /* 198 */ + { 28, 12, 3, 0, 0, -31, 0, }, /* 199 */ { 13, 11, 3, 0, 0, 13, 0, }, /* 200 */ { 13, 9, 12, 0, 15, 13, 0, }, /* 201 */ { 13, 5, 12, 0, -15, 13, 0, }, /* 202 */ @@ -413,761 +417,783 @@ const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */ { 1, 25, 12, 0, 0, 1, 0, }, /* 217 */ { 1, 21, 12, 0, 0, 1, 0, }, /* 218 */ { 1, 23, 12, 0, 0, 1, 0, }, /* 219 */ - { 10, 21, 12, 0, 0, -127, 0, }, /* 220 */ + { 10, 21, 12, 0, 0, -143, 0, }, /* 220 */ { 1, 26, 12, 0, 0, 1, 0, }, /* 221 */ { 1, 12, 3, 0, 0, 1, 0, }, /* 222 */ - { 1, 1, 2, 0, 0, -76, 0, }, /* 223 */ - { 1, 7, 12, 0, 0, 1, 0, }, /* 224 */ - { 10, 6, 12, 0, 0, -153, 0, }, /* 225 */ - { 28, 12, 3, 0, 0, -7, 0, }, /* 226 */ - { 1, 13, 12, 0, 0, -80, 0, }, /* 227 */ - { 1, 21, 12, 0, 0, -4, 0, }, /* 228 */ - { 1, 6, 12, 0, 0, 1, 0, }, /* 229 */ - { 1, 13, 12, 0, 0, 1, 0, }, /* 230 */ - { 50, 21, 12, 0, 0, 50, 0, }, /* 231 */ - { 50, 1, 4, 0, 0, 50, 0, }, /* 232 */ - { 50, 7, 12, 0, 0, 50, 0, }, /* 233 */ - { 50, 12, 3, 0, 0, 50, 0, }, /* 234 */ - { 56, 7, 12, 0, 0, 56, 0, }, /* 235 */ - { 56, 12, 3, 0, 0, 56, 0, }, /* 236 */ - { 64, 13, 12, 0, 0, 64, 0, }, /* 237 */ - { 64, 7, 12, 0, 0, 64, 0, }, /* 238 */ - { 64, 12, 3, 0, 0, 64, 0, }, /* 239 */ - { 64, 6, 12, 0, 0, 64, 0, }, /* 240 */ - { 64, 26, 12, 0, 0, 64, 0, }, /* 241 */ - { 64, 21, 12, 0, 0, 64, 0, }, /* 242 */ - { 64, 23, 12, 0, 0, 64, 0, }, /* 243 */ - { 90, 7, 12, 0, 0, 90, 0, }, /* 244 */ - { 90, 12, 3, 0, 0, 90, 0, }, /* 245 */ - { 90, 6, 12, 0, 0, 90, 0, }, /* 246 */ - { 90, 21, 12, 0, 0, 90, 0, }, /* 247 */ - { 95, 7, 12, 0, 0, 95, 0, }, /* 248 */ - { 95, 12, 3, 0, 0, 95, 0, }, /* 249 */ - { 95, 21, 12, 0, 0, 95, 0, }, /* 250 */ - { 15, 12, 3, 0, 0, 15, 0, }, /* 251 */ - { 15, 10, 5, 0, 0, 15, 0, }, /* 252 */ - { 15, 7, 12, 0, 0, 15, 0, }, /* 253 */ - { 28, 12, 3, 0, 0, -196, 0, }, /* 254 */ - { 28, 12, 3, 0, 0, -183, 0, }, /* 255 */ - { 10, 21, 12, 0, 0, -239, 0, }, /* 256 */ - { 10, 21, 12, 0, 0, -260, 0, }, /* 257 */ - { 15, 13, 12, 0, 0, -122, 0, }, /* 258 */ - { 15, 21, 12, 0, 0, 15, 0, }, /* 259 */ - { 15, 6, 12, 0, 0, 15, 0, }, /* 260 */ - { 3, 7, 12, 0, 0, 3, 0, }, /* 261 */ - { 3, 12, 3, 0, 0, 3, 0, }, /* 262 */ - { 3, 10, 5, 0, 0, 3, 0, }, /* 263 */ - { 3, 10, 3, 0, 0, 3, 0, }, /* 264 */ - { 3, 13, 12, 0, 0, -84, 0, }, /* 265 */ - { 3, 23, 12, 0, 0, 3, 0, }, /* 266 */ - { 3, 15, 12, 0, 0, 3, 0, }, /* 267 */ - { 3, 26, 12, 0, 0, 3, 0, }, /* 268 */ - { 3, 21, 12, 0, 0, 3, 0, }, /* 269 */ - { 22, 12, 3, 0, 0, 22, 0, }, /* 270 */ - { 22, 10, 5, 0, 0, 22, 0, }, /* 271 */ - { 22, 7, 12, 0, 0, 22, 0, }, /* 272 */ - { 22, 13, 12, 0, 0, -58, 0, }, /* 273 */ - { 22, 21, 12, 0, 0, 22, 0, }, /* 274 */ - { 21, 12, 3, 0, 0, 21, 0, }, /* 275 */ - { 21, 10, 5, 0, 0, 21, 0, }, /* 276 */ - { 21, 7, 12, 0, 0, 21, 0, }, /* 277 */ - { 21, 13, 12, 0, 0, -55, 0, }, /* 278 */ - { 21, 21, 12, 0, 0, 21, 0, }, /* 279 */ - { 21, 23, 12, 0, 0, 21, 0, }, /* 280 */ - { 44, 12, 3, 0, 0, 44, 0, }, /* 281 */ - { 44, 10, 5, 0, 0, 44, 0, }, /* 282 */ - { 44, 7, 12, 0, 0, 44, 0, }, /* 283 */ - { 44, 10, 3, 0, 0, 44, 0, }, /* 284 */ - { 44, 13, 12, 0, 0, 44, 0, }, /* 285 */ - { 44, 26, 12, 0, 0, 44, 0, }, /* 286 */ - { 44, 15, 12, 0, 0, 44, 0, }, /* 287 */ - { 54, 12, 3, 0, 0, 54, 0, }, /* 288 */ - { 54, 7, 12, 0, 0, 54, 0, }, /* 289 */ - { 54, 10, 3, 0, 0, 54, 0, }, /* 290 */ - { 54, 10, 5, 0, 0, 54, 0, }, /* 291 */ - { 54, 13, 12, 0, 0, -52, 0, }, /* 292 */ - { 54, 15, 12, 0, 0, -52, 0, }, /* 293 */ - { 54, 26, 12, 0, 0, -52, 0, }, /* 294 */ - { 54, 26, 12, 0, 0, 54, 0, }, /* 295 */ - { 54, 23, 12, 0, 0, 54, 0, }, /* 296 */ - { 55, 12, 3, 0, 0, 55, 0, }, /* 297 */ - { 55, 10, 5, 0, 0, 55, 0, }, /* 298 */ - { 55, 7, 12, 0, 0, 55, 0, }, /* 299 */ - { 55, 13, 12, 0, 0, 55, 0, }, /* 300 */ - { 55, 21, 12, 0, 0, 55, 0, }, /* 301 */ - { 55, 15, 12, 0, 0, 55, 0, }, /* 302 */ - { 55, 26, 12, 0, 0, 55, 0, }, /* 303 */ - { 29, 7, 12, 0, 0, 29, 0, }, /* 304 */ - { 29, 12, 3, 0, 0, 29, 0, }, /* 305 */ - { 29, 10, 5, 0, 0, 29, 0, }, /* 306 */ - { 29, 21, 12, 0, 0, 29, 0, }, /* 307 */ - { 29, 10, 3, 0, 0, 29, 0, }, /* 308 */ - { 29, 13, 12, 0, 0, -67, 0, }, /* 309 */ - { 37, 12, 3, 0, 0, 37, 0, }, /* 310 */ - { 37, 10, 5, 0, 0, 37, 0, }, /* 311 */ - { 37, 7, 12, 0, 0, 37, 0, }, /* 312 */ - { 37, 10, 3, 0, 0, 37, 0, }, /* 313 */ - { 37, 7, 4, 0, 0, 37, 0, }, /* 314 */ - { 37, 26, 12, 0, 0, 37, 0, }, /* 315 */ - { 37, 15, 12, 0, 0, 37, 0, }, /* 316 */ - { 37, 13, 12, 0, 0, 37, 0, }, /* 317 */ - { 48, 12, 3, 0, 0, 48, 0, }, /* 318 */ - { 48, 10, 5, 0, 0, 48, 0, }, /* 319 */ - { 48, 7, 12, 0, 0, 48, 0, }, /* 320 */ - { 48, 10, 3, 0, 0, 48, 0, }, /* 321 */ - { 48, 13, 12, 0, 0, 48, 0, }, /* 322 */ - { 48, 21, 12, 0, 0, 48, 0, }, /* 323 */ - { 57, 7, 12, 0, 0, 57, 0, }, /* 324 */ - { 57, 12, 3, 0, 0, 57, 0, }, /* 325 */ - { 57, 7, 5, 0, 0, 57, 0, }, /* 326 */ - { 57, 6, 12, 0, 0, 57, 0, }, /* 327 */ - { 57, 21, 12, 0, 0, 57, 0, }, /* 328 */ - { 57, 13, 12, 0, 0, 57, 0, }, /* 329 */ - { 33, 7, 12, 0, 0, 33, 0, }, /* 330 */ - { 33, 12, 3, 0, 0, 33, 0, }, /* 331 */ - { 33, 7, 5, 0, 0, 33, 0, }, /* 332 */ - { 33, 6, 12, 0, 0, 33, 0, }, /* 333 */ - { 33, 13, 12, 0, 0, 33, 0, }, /* 334 */ - { 58, 7, 12, 0, 0, 58, 0, }, /* 335 */ - { 58, 26, 12, 0, 0, 58, 0, }, /* 336 */ - { 58, 21, 12, 0, 0, 58, 0, }, /* 337 */ - { 58, 12, 3, 0, 0, 58, 0, }, /* 338 */ - { 58, 13, 12, 0, 0, 58, 0, }, /* 339 */ - { 58, 15, 12, 0, 0, 58, 0, }, /* 340 */ - { 58, 22, 12, 0, 0, 58, 0, }, /* 341 */ - { 58, 18, 12, 0, 0, 58, 0, }, /* 342 */ - { 58, 10, 5, 0, 0, 58, 0, }, /* 343 */ - { 39, 7, 12, 0, 0, 39, 0, }, /* 344 */ - { 39, 10, 12, 0, 0, 39, 0, }, /* 345 */ - { 39, 12, 3, 0, 0, 39, 0, }, /* 346 */ - { 39, 10, 5, 0, 0, 39, 0, }, /* 347 */ - { 39, 13, 12, 0, 0, -88, 0, }, /* 348 */ - { 39, 21, 12, 0, 0, 39, 0, }, /* 349 */ - { 39, 13, 12, 0, 0, 39, 0, }, /* 350 */ - { 39, 26, 12, 0, 0, 39, 0, }, /* 351 */ - { 17, 9, 12, 0, 7264, 17, 0, }, /* 352 */ - { 17, 5, 12, 0, 3008, 17, 0, }, /* 353 */ - { 10, 21, 12, 0, 0, -49, 0, }, /* 354 */ - { 17, 6, 12, 0, 0, 17, 0, }, /* 355 */ - { 24, 7, 6, 0, 0, 24, 0, }, /* 356 */ - { 24, 7, 7, 0, 0, 24, 0, }, /* 357 */ - { 24, 7, 8, 0, 0, 24, 0, }, /* 358 */ - { 16, 7, 12, 0, 0, 16, 0, }, /* 359 */ - { 16, 12, 3, 0, 0, 16, 0, }, /* 360 */ - { 16, 21, 12, 0, 0, 16, 0, }, /* 361 */ - { 16, 15, 12, 0, 0, 16, 0, }, /* 362 */ - { 16, 26, 12, 0, 0, 16, 0, }, /* 363 */ - { 9, 9, 12, 0, 38864, 9, 0, }, /* 364 */ - { 9, 9, 12, 0, 8, 9, 0, }, /* 365 */ - { 9, 5, 12, 0, -8, 9, 0, }, /* 366 */ - { 8, 17, 12, 0, 0, 8, 0, }, /* 367 */ - { 8, 7, 12, 0, 0, 8, 0, }, /* 368 */ - { 8, 26, 12, 0, 0, 8, 0, }, /* 369 */ - { 8, 21, 12, 0, 0, 8, 0, }, /* 370 */ - { 41, 29, 12, 0, 0, 41, 0, }, /* 371 */ - { 41, 7, 12, 0, 0, 41, 0, }, /* 372 */ - { 41, 22, 12, 0, 0, 41, 0, }, /* 373 */ - { 41, 18, 12, 0, 0, 41, 0, }, /* 374 */ - { 46, 7, 12, 0, 0, 46, 0, }, /* 375 */ - { 46, 14, 12, 0, 0, 46, 0, }, /* 376 */ - { 51, 7, 12, 0, 0, 51, 0, }, /* 377 */ - { 51, 12, 3, 0, 0, 51, 0, }, /* 378 */ - { 25, 7, 12, 0, 0, 25, 0, }, /* 379 */ - { 25, 12, 3, 0, 0, 25, 0, }, /* 380 */ - { 10, 21, 12, 0, 0, -117, 0, }, /* 381 */ - { 7, 7, 12, 0, 0, 7, 0, }, /* 382 */ - { 7, 12, 3, 0, 0, 7, 0, }, /* 383 */ - { 52, 7, 12, 0, 0, 52, 0, }, /* 384 */ - { 52, 12, 3, 0, 0, 52, 0, }, /* 385 */ - { 32, 7, 12, 0, 0, 32, 0, }, /* 386 */ - { 32, 12, 3, 0, 0, 32, 0, }, /* 387 */ - { 32, 10, 5, 0, 0, 32, 0, }, /* 388 */ - { 32, 21, 12, 0, 0, 32, 0, }, /* 389 */ - { 32, 6, 12, 0, 0, 32, 0, }, /* 390 */ - { 32, 23, 12, 0, 0, 32, 0, }, /* 391 */ - { 32, 13, 12, 0, 0, 32, 0, }, /* 392 */ - { 32, 15, 12, 0, 0, 32, 0, }, /* 393 */ - { 38, 21, 12, 0, 0, 38, 0, }, /* 394 */ - { 10, 21, 12, 0, 0, -73, 0, }, /* 395 */ - { 38, 17, 12, 0, 0, 38, 0, }, /* 396 */ - { 38, 12, 3, 0, 0, 38, 0, }, /* 397 */ - { 38, 1, 2, 0, 0, 38, 0, }, /* 398 */ - { 38, 13, 12, 0, 0, 38, 0, }, /* 399 */ - { 38, 7, 12, 0, 0, 38, 0, }, /* 400 */ - { 38, 6, 12, 0, 0, 38, 0, }, /* 401 */ - { 35, 7, 12, 0, 0, 35, 0, }, /* 402 */ - { 35, 12, 3, 0, 0, 35, 0, }, /* 403 */ - { 35, 10, 5, 0, 0, 35, 0, }, /* 404 */ - { 35, 26, 12, 0, 0, 35, 0, }, /* 405 */ - { 35, 21, 12, 0, 0, 35, 0, }, /* 406 */ - { 35, 13, 12, 0, 0, 35, 0, }, /* 407 */ - { 53, 7, 12, 0, 0, 53, 0, }, /* 408 */ - { 40, 7, 12, 0, 0, 40, 0, }, /* 409 */ - { 40, 13, 12, 0, 0, 40, 0, }, /* 410 */ - { 40, 15, 12, 0, 0, 40, 0, }, /* 411 */ - { 40, 26, 12, 0, 0, 40, 0, }, /* 412 */ - { 32, 26, 12, 0, 0, 32, 0, }, /* 413 */ - { 6, 7, 12, 0, 0, 6, 0, }, /* 414 */ - { 6, 12, 3, 0, 0, 6, 0, }, /* 415 */ - { 6, 10, 5, 0, 0, 6, 0, }, /* 416 */ - { 6, 21, 12, 0, 0, 6, 0, }, /* 417 */ - { 91, 7, 12, 0, 0, 91, 0, }, /* 418 */ - { 91, 10, 5, 0, 0, 91, 0, }, /* 419 */ - { 91, 12, 3, 0, 0, 91, 0, }, /* 420 */ - { 91, 10, 12, 0, 0, 91, 0, }, /* 421 */ - { 91, 13, 12, 0, 0, 91, 0, }, /* 422 */ - { 91, 21, 12, 0, 0, 91, 0, }, /* 423 */ - { 91, 6, 12, 0, 0, 91, 0, }, /* 424 */ - { 28, 11, 3, 0, 0, 28, 0, }, /* 425 */ - { 62, 12, 3, 0, 0, 62, 0, }, /* 426 */ - { 62, 10, 5, 0, 0, 62, 0, }, /* 427 */ - { 62, 7, 12, 0, 0, 62, 0, }, /* 428 */ - { 62, 10, 3, 0, 0, 62, 0, }, /* 429 */ - { 62, 13, 12, 0, 0, 62, 0, }, /* 430 */ - { 62, 21, 12, 0, 0, 62, 0, }, /* 431 */ - { 62, 26, 12, 0, 0, 62, 0, }, /* 432 */ - { 76, 12, 3, 0, 0, 76, 0, }, /* 433 */ - { 76, 10, 5, 0, 0, 76, 0, }, /* 434 */ - { 76, 7, 12, 0, 0, 76, 0, }, /* 435 */ - { 76, 13, 12, 0, 0, 76, 0, }, /* 436 */ - { 93, 7, 12, 0, 0, 93, 0, }, /* 437 */ - { 93, 12, 3, 0, 0, 93, 0, }, /* 438 */ - { 93, 10, 5, 0, 0, 93, 0, }, /* 439 */ - { 93, 21, 12, 0, 0, 93, 0, }, /* 440 */ - { 70, 7, 12, 0, 0, 70, 0, }, /* 441 */ - { 70, 10, 5, 0, 0, 70, 0, }, /* 442 */ - { 70, 12, 3, 0, 0, 70, 0, }, /* 443 */ - { 70, 21, 12, 0, 0, 70, 0, }, /* 444 */ - { 70, 13, 12, 0, 0, 70, 0, }, /* 445 */ - { 73, 13, 12, 0, 0, 73, 0, }, /* 446 */ - { 73, 7, 12, 0, 0, 73, 0, }, /* 447 */ - { 73, 6, 12, 0, 0, 73, 0, }, /* 448 */ - { 73, 21, 12, 0, 0, 73, 0, }, /* 449 */ - { 13, 5, 12, 63, -6222, 13, 0, }, /* 450 */ - { 13, 5, 12, 67, -6221, 13, 0, }, /* 451 */ - { 13, 5, 12, 71, -6212, 13, 0, }, /* 452 */ - { 13, 5, 12, 75, -6210, 13, 0, }, /* 453 */ - { 13, 5, 12, 79, -6210, 13, 0, }, /* 454 */ - { 13, 5, 12, 79, -6211, 13, 0, }, /* 455 */ - { 13, 5, 12, 84, -6204, 13, 0, }, /* 456 */ - { 13, 5, 12, 88, -6180, 13, 0, }, /* 457 */ - { 13, 5, 12, 108, 35267, 13, 0, }, /* 458 */ - { 17, 9, 12, 0, -3008, 17, 0, }, /* 459 */ - { 76, 21, 12, 0, 0, 76, 0, }, /* 460 */ - { 28, 12, 3, 0, 0, -112, 0, }, /* 461 */ - { 28, 12, 3, 0, 0, 15, 0, }, /* 462 */ - { 10, 21, 12, 0, 0, -37, 0, }, /* 463 */ - { 28, 12, 3, 0, 0, -13, 0, }, /* 464 */ - { 28, 12, 3, 0, 0, -43, 0, }, /* 465 */ - { 28, 12, 3, 0, 0, -146, 0, }, /* 466 */ - { 10, 10, 5, 0, 0, -13, 0, }, /* 467 */ - { 10, 7, 12, 0, 0, -40, 0, }, /* 468 */ - { 10, 7, 12, 0, 0, -13, 0, }, /* 469 */ - { 10, 7, 12, 0, 0, 15, 0, }, /* 470 */ - { 10, 7, 12, 0, 0, -162, 0, }, /* 471 */ - { 10, 7, 12, 0, 0, -37, 0, }, /* 472 */ - { 28, 12, 3, 0, 0, -96, 0, }, /* 473 */ - { 10, 10, 5, 0, 0, 3, 0, }, /* 474 */ - { 28, 12, 3, 0, 0, -37, 0, }, /* 475 */ - { 10, 7, 12, 0, 0, 150, 0, }, /* 476 */ - { 13, 5, 12, 0, 0, 13, 0, }, /* 477 */ - { 13, 6, 12, 0, 0, 13, 0, }, /* 478 */ - { 34, 5, 12, 0, 35332, 34, 0, }, /* 479 */ - { 34, 5, 12, 0, 3814, 34, 0, }, /* 480 */ - { 34, 5, 12, 0, 35384, 34, 0, }, /* 481 */ - { 28, 12, 3, 0, 0, -34, 0, }, /* 482 */ - { 34, 9, 12, 92, 1, 34, 0, }, /* 483 */ - { 34, 5, 12, 92, -1, 34, 0, }, /* 484 */ - { 34, 5, 12, 92, -58, 34, 0, }, /* 485 */ - { 34, 9, 12, 0, -7615, 34, 0, }, /* 486 */ - { 20, 5, 12, 0, 8, 20, 0, }, /* 487 */ - { 20, 9, 12, 0, -8, 20, 0, }, /* 488 */ - { 20, 5, 12, 0, 74, 20, 0, }, /* 489 */ - { 20, 5, 12, 0, 86, 20, 0, }, /* 490 */ - { 20, 5, 12, 0, 100, 20, 0, }, /* 491 */ - { 20, 5, 12, 0, 128, 20, 0, }, /* 492 */ - { 20, 5, 12, 0, 112, 20, 0, }, /* 493 */ - { 20, 5, 12, 0, 126, 20, 0, }, /* 494 */ - { 20, 8, 12, 0, -8, 20, 0, }, /* 495 */ - { 20, 5, 12, 0, 9, 20, 0, }, /* 496 */ - { 20, 9, 12, 0, -74, 20, 0, }, /* 497 */ - { 20, 8, 12, 0, -9, 20, 0, }, /* 498 */ - { 20, 5, 12, 21, -7173, 20, 0, }, /* 499 */ - { 20, 9, 12, 0, -86, 20, 0, }, /* 500 */ - { 20, 9, 12, 0, -100, 20, 0, }, /* 501 */ - { 20, 9, 12, 0, -112, 20, 0, }, /* 502 */ - { 20, 9, 12, 0, -128, 20, 0, }, /* 503 */ - { 20, 9, 12, 0, -126, 20, 0, }, /* 504 */ - { 28, 1, 3, 0, 0, 28, 0, }, /* 505 */ - { 28, 1, 13, 0, 0, 28, 0, }, /* 506 */ - { 10, 27, 2, 0, 0, 10, 0, }, /* 507 */ - { 10, 28, 2, 0, 0, 10, 0, }, /* 508 */ - { 10, 29, 12, 0, 0, -70, 0, }, /* 509 */ - { 10, 21, 14, 0, 0, 10, 0, }, /* 510 */ - { 0, 2, 2, 0, 0, 0, 0, }, /* 511 */ - { 28, 12, 3, 0, 0, -100, 0, }, /* 512 */ - { 10, 9, 12, 0, 0, 10, 0, }, /* 513 */ - { 10, 5, 12, 0, 0, 10, 0, }, /* 514 */ - { 20, 9, 12, 96, -7517, 20, 0, }, /* 515 */ - { 34, 9, 12, 100, -8383, 34, 0, }, /* 516 */ - { 34, 9, 12, 104, -8262, 34, 0, }, /* 517 */ - { 34, 9, 12, 0, 28, 34, 0, }, /* 518 */ - { 10, 7, 12, 0, 0, 10, 0, }, /* 519 */ - { 10, 5, 14, 0, 0, 10, 0, }, /* 520 */ - { 34, 5, 12, 0, -28, 34, 0, }, /* 521 */ - { 34, 14, 12, 0, 16, 34, 0, }, /* 522 */ - { 34, 14, 12, 0, -16, 34, 0, }, /* 523 */ - { 34, 14, 12, 0, 0, 34, 0, }, /* 524 */ - { 10, 25, 14, 0, 0, 10, 0, }, /* 525 */ - { 10, 26, 12, 0, 26, 10, 0, }, /* 526 */ - { 10, 26, 14, 0, 26, 10, 0, }, /* 527 */ - { 10, 26, 12, 0, -26, 10, 0, }, /* 528 */ - { 5, 26, 12, 0, 0, 5, 0, }, /* 529 */ - { 18, 9, 12, 0, 48, 18, 0, }, /* 530 */ - { 18, 5, 12, 0, -48, 18, 0, }, /* 531 */ - { 34, 9, 12, 0, -10743, 34, 0, }, /* 532 */ - { 34, 9, 12, 0, -3814, 34, 0, }, /* 533 */ - { 34, 9, 12, 0, -10727, 34, 0, }, /* 534 */ - { 34, 5, 12, 0, -10795, 34, 0, }, /* 535 */ - { 34, 5, 12, 0, -10792, 34, 0, }, /* 536 */ - { 34, 9, 12, 0, -10780, 34, 0, }, /* 537 */ - { 34, 9, 12, 0, -10749, 34, 0, }, /* 538 */ - { 34, 9, 12, 0, -10783, 34, 0, }, /* 539 */ - { 34, 9, 12, 0, -10782, 34, 0, }, /* 540 */ - { 34, 9, 12, 0, -10815, 34, 0, }, /* 541 */ - { 11, 5, 12, 0, 0, 11, 0, }, /* 542 */ - { 11, 26, 12, 0, 0, 11, 0, }, /* 543 */ - { 11, 12, 3, 0, 0, 11, 0, }, /* 544 */ - { 11, 21, 12, 0, 0, 11, 0, }, /* 545 */ - { 11, 15, 12, 0, 0, 11, 0, }, /* 546 */ - { 17, 5, 12, 0, -7264, 17, 0, }, /* 547 */ - { 59, 7, 12, 0, 0, 59, 0, }, /* 548 */ - { 59, 6, 12, 0, 0, 59, 0, }, /* 549 */ - { 59, 21, 12, 0, 0, 59, 0, }, /* 550 */ - { 59, 12, 3, 0, 0, 59, 0, }, /* 551 */ - { 13, 12, 3, 0, 0, 13, 0, }, /* 552 */ - { 10, 21, 12, 0, 0, -25, 0, }, /* 553 */ - { 23, 26, 12, 0, 0, 23, 0, }, /* 554 */ - { 10, 21, 12, 0, 0, -139, 0, }, /* 555 */ - { 10, 21, 12, 0, 0, -133, 0, }, /* 556 */ - { 23, 6, 12, 0, 0, 23, 0, }, /* 557 */ - { 10, 7, 12, 0, 0, 23, 0, }, /* 558 */ - { 23, 14, 12, 0, 0, 23, 0, }, /* 559 */ - { 10, 22, 12, 0, 0, -139, 0, }, /* 560 */ - { 10, 18, 12, 0, 0, -139, 0, }, /* 561 */ - { 10, 26, 12, 0, 0, -133, 0, }, /* 562 */ - { 10, 17, 12, 0, 0, -133, 0, }, /* 563 */ - { 10, 22, 12, 0, 0, -133, 0, }, /* 564 */ - { 10, 18, 12, 0, 0, -133, 0, }, /* 565 */ - { 28, 12, 3, 0, 0, -16, 0, }, /* 566 */ - { 24, 10, 3, 0, 0, 24, 0, }, /* 567 */ - { 10, 17, 14, 0, 0, -133, 0, }, /* 568 */ - { 10, 6, 12, 0, 0, -64, 0, }, /* 569 */ - { 10, 7, 12, 0, 0, -104, 0, }, /* 570 */ - { 10, 21, 14, 0, 0, -104, 0, }, /* 571 */ - { 10, 26, 12, 0, 0, 23, 0, }, /* 572 */ - { 27, 7, 12, 0, 0, 27, 0, }, /* 573 */ - { 28, 12, 3, 0, 0, -64, 0, }, /* 574 */ - { 10, 24, 12, 0, 0, -64, 0, }, /* 575 */ - { 27, 6, 12, 0, 0, 27, 0, }, /* 576 */ - { 10, 17, 12, 0, 0, -64, 0, }, /* 577 */ - { 30, 7, 12, 0, 0, 30, 0, }, /* 578 */ - { 30, 6, 12, 0, 0, 30, 0, }, /* 579 */ - { 4, 7, 12, 0, 0, 4, 0, }, /* 580 */ - { 24, 7, 12, 0, 0, 24, 0, }, /* 581 */ - { 10, 15, 12, 0, 0, 23, 0, }, /* 582 */ - { 24, 26, 12, 0, 0, 24, 0, }, /* 583 */ - { 10, 26, 14, 0, 0, 23, 0, }, /* 584 */ - { 30, 26, 12, 0, 0, 30, 0, }, /* 585 */ - { 23, 7, 12, 0, 0, 23, 0, }, /* 586 */ - { 61, 7, 12, 0, 0, 61, 0, }, /* 587 */ - { 61, 6, 12, 0, 0, 61, 0, }, /* 588 */ - { 61, 26, 12, 0, 0, 61, 0, }, /* 589 */ - { 86, 7, 12, 0, 0, 86, 0, }, /* 590 */ - { 86, 6, 12, 0, 0, 86, 0, }, /* 591 */ - { 86, 21, 12, 0, 0, 86, 0, }, /* 592 */ - { 77, 7, 12, 0, 0, 77, 0, }, /* 593 */ - { 77, 6, 12, 0, 0, 77, 0, }, /* 594 */ - { 77, 21, 12, 0, 0, 77, 0, }, /* 595 */ - { 77, 13, 12, 0, 0, 77, 0, }, /* 596 */ - { 13, 9, 12, 108, 1, 13, 0, }, /* 597 */ - { 13, 5, 12, 108, -35267, 13, 0, }, /* 598 */ - { 13, 7, 12, 0, 0, 13, 0, }, /* 599 */ - { 13, 21, 12, 0, 0, 13, 0, }, /* 600 */ - { 79, 7, 12, 0, 0, 79, 0, }, /* 601 */ - { 79, 14, 12, 0, 0, 79, 0, }, /* 602 */ - { 79, 12, 3, 0, 0, 79, 0, }, /* 603 */ - { 79, 21, 12, 0, 0, 79, 0, }, /* 604 */ - { 10, 24, 12, 0, 0, -61, 0, }, /* 605 */ - { 34, 9, 12, 0, -35332, 34, 0, }, /* 606 */ - { 34, 9, 12, 0, -42280, 34, 0, }, /* 607 */ - { 34, 5, 12, 0, 48, 34, 0, }, /* 608 */ - { 34, 9, 12, 0, -42308, 34, 0, }, /* 609 */ - { 34, 9, 12, 0, -42319, 34, 0, }, /* 610 */ - { 34, 9, 12, 0, -42315, 34, 0, }, /* 611 */ - { 34, 9, 12, 0, -42305, 34, 0, }, /* 612 */ - { 34, 9, 12, 0, -42258, 34, 0, }, /* 613 */ - { 34, 9, 12, 0, -42282, 34, 0, }, /* 614 */ - { 34, 9, 12, 0, -42261, 34, 0, }, /* 615 */ - { 34, 9, 12, 0, 928, 34, 0, }, /* 616 */ - { 34, 9, 12, 0, -48, 34, 0, }, /* 617 */ - { 34, 9, 12, 0, -42307, 34, 0, }, /* 618 */ - { 34, 9, 12, 0, -35384, 34, 0, }, /* 619 */ - { 49, 7, 12, 0, 0, 49, 0, }, /* 620 */ - { 49, 12, 3, 0, 0, 49, 0, }, /* 621 */ - { 49, 10, 5, 0, 0, 49, 0, }, /* 622 */ - { 49, 26, 12, 0, 0, 49, 0, }, /* 623 */ - { 10, 15, 12, 0, 0, -224, 0, }, /* 624 */ - { 10, 15, 12, 0, 0, -210, 0, }, /* 625 */ - { 10, 26, 12, 0, 0, -171, 0, }, /* 626 */ - { 10, 23, 12, 0, 0, -171, 0, }, /* 627 */ - { 65, 7, 12, 0, 0, 65, 0, }, /* 628 */ - { 65, 21, 12, 0, 0, 65, 0, }, /* 629 */ - { 75, 10, 5, 0, 0, 75, 0, }, /* 630 */ - { 75, 7, 12, 0, 0, 75, 0, }, /* 631 */ - { 75, 12, 3, 0, 0, 75, 0, }, /* 632 */ - { 75, 21, 12, 0, 0, 75, 0, }, /* 633 */ - { 75, 13, 12, 0, 0, 75, 0, }, /* 634 */ - { 15, 12, 3, 0, 0, -13, 0, }, /* 635 */ - { 15, 7, 12, 0, 0, -46, 0, }, /* 636 */ - { 69, 13, 12, 0, 0, 69, 0, }, /* 637 */ - { 69, 7, 12, 0, 0, 69, 0, }, /* 638 */ - { 69, 12, 3, 0, 0, 69, 0, }, /* 639 */ - { 10, 21, 12, 0, 0, -108, 0, }, /* 640 */ - { 69, 21, 12, 0, 0, 69, 0, }, /* 641 */ - { 74, 7, 12, 0, 0, 74, 0, }, /* 642 */ - { 74, 12, 3, 0, 0, 74, 0, }, /* 643 */ - { 74, 10, 5, 0, 0, 74, 0, }, /* 644 */ - { 74, 21, 12, 0, 0, 74, 0, }, /* 645 */ - { 84, 12, 3, 0, 0, 84, 0, }, /* 646 */ - { 84, 10, 5, 0, 0, 84, 0, }, /* 647 */ - { 84, 7, 12, 0, 0, 84, 0, }, /* 648 */ - { 84, 21, 12, 0, 0, 84, 0, }, /* 649 */ - { 10, 6, 12, 0, 0, -19, 0, }, /* 650 */ - { 84, 13, 12, 0, 0, 84, 0, }, /* 651 */ - { 39, 6, 12, 0, 0, 39, 0, }, /* 652 */ - { 68, 7, 12, 0, 0, 68, 0, }, /* 653 */ - { 68, 12, 3, 0, 0, 68, 0, }, /* 654 */ - { 68, 10, 5, 0, 0, 68, 0, }, /* 655 */ - { 68, 13, 12, 0, 0, 68, 0, }, /* 656 */ - { 68, 21, 12, 0, 0, 68, 0, }, /* 657 */ - { 92, 7, 12, 0, 0, 92, 0, }, /* 658 */ - { 92, 12, 3, 0, 0, 92, 0, }, /* 659 */ - { 92, 6, 12, 0, 0, 92, 0, }, /* 660 */ - { 92, 21, 12, 0, 0, 92, 0, }, /* 661 */ - { 87, 7, 12, 0, 0, 87, 0, }, /* 662 */ - { 87, 10, 5, 0, 0, 87, 0, }, /* 663 */ - { 87, 12, 3, 0, 0, 87, 0, }, /* 664 */ - { 87, 21, 12, 0, 0, 87, 0, }, /* 665 */ - { 87, 6, 12, 0, 0, 87, 0, }, /* 666 */ - { 34, 5, 12, 0, -928, 34, 0, }, /* 667 */ - { 9, 5, 12, 0, -38864, 9, 0, }, /* 668 */ - { 87, 13, 12, 0, 0, 87, 0, }, /* 669 */ - { 24, 7, 9, 0, 0, 24, 0, }, /* 670 */ - { 24, 7, 10, 0, 0, 24, 0, }, /* 671 */ - { 0, 4, 12, 0, 0, 0, 0, }, /* 672 */ - { 0, 3, 12, 0, 0, 0, 0, }, /* 673 */ - { 26, 25, 12, 0, 0, 26, 0, }, /* 674 */ - { 1, 24, 12, 0, 0, 1, 0, }, /* 675 */ - { 1, 7, 12, 0, 0, -10, 0, }, /* 676 */ - { 1, 26, 12, 0, 0, -10, 0, }, /* 677 */ - { 10, 6, 3, 0, 0, -64, 0, }, /* 678 */ - { 36, 7, 12, 0, 0, 36, 0, }, /* 679 */ - { 10, 21, 12, 0, 0, -22, 0, }, /* 680 */ - { 10, 15, 12, 0, 0, -92, 0, }, /* 681 */ - { 10, 26, 12, 0, 0, -22, 0, }, /* 682 */ - { 20, 14, 12, 0, 0, 20, 0, }, /* 683 */ - { 20, 15, 12, 0, 0, 20, 0, }, /* 684 */ - { 20, 26, 12, 0, 0, 20, 0, }, /* 685 */ - { 71, 7, 12, 0, 0, 71, 0, }, /* 686 */ - { 67, 7, 12, 0, 0, 67, 0, }, /* 687 */ - { 28, 12, 3, 0, 0, -1, 0, }, /* 688 */ - { 10, 15, 12, 0, 0, -1, 0, }, /* 689 */ - { 42, 7, 12, 0, 0, 42, 0, }, /* 690 */ - { 42, 15, 12, 0, 0, 42, 0, }, /* 691 */ - { 19, 7, 12, 0, 0, 19, 0, }, /* 692 */ - { 19, 14, 12, 0, 0, 19, 0, }, /* 693 */ - { 118, 7, 12, 0, 0, 118, 0, }, /* 694 */ - { 118, 12, 3, 0, 0, 118, 0, }, /* 695 */ - { 60, 7, 12, 0, 0, 60, 0, }, /* 696 */ - { 60, 21, 12, 0, 0, 60, 0, }, /* 697 */ - { 43, 7, 12, 0, 0, 43, 0, }, /* 698 */ - { 43, 21, 12, 0, 0, 43, 0, }, /* 699 */ - { 43, 14, 12, 0, 0, 43, 0, }, /* 700 */ - { 14, 9, 12, 0, 40, 14, 0, }, /* 701 */ - { 14, 5, 12, 0, -40, 14, 0, }, /* 702 */ - { 47, 7, 12, 0, 0, 47, 0, }, /* 703 */ - { 45, 7, 12, 0, 0, 45, 0, }, /* 704 */ - { 45, 13, 12, 0, 0, 45, 0, }, /* 705 */ - { 136, 9, 12, 0, 40, 136, 0, }, /* 706 */ - { 136, 5, 12, 0, -40, 136, 0, }, /* 707 */ - { 106, 7, 12, 0, 0, 106, 0, }, /* 708 */ - { 104, 7, 12, 0, 0, 104, 0, }, /* 709 */ - { 104, 21, 12, 0, 0, 104, 0, }, /* 710 */ - { 110, 7, 12, 0, 0, 110, 0, }, /* 711 */ - { 12, 7, 12, 0, 0, 12, 0, }, /* 712 */ - { 81, 7, 12, 0, 0, 81, 0, }, /* 713 */ - { 81, 21, 12, 0, 0, 81, 0, }, /* 714 */ - { 81, 15, 12, 0, 0, 81, 0, }, /* 715 */ - { 120, 7, 12, 0, 0, 120, 0, }, /* 716 */ - { 120, 26, 12, 0, 0, 120, 0, }, /* 717 */ - { 120, 15, 12, 0, 0, 120, 0, }, /* 718 */ - { 116, 7, 12, 0, 0, 116, 0, }, /* 719 */ - { 116, 15, 12, 0, 0, 116, 0, }, /* 720 */ - { 128, 7, 12, 0, 0, 128, 0, }, /* 721 */ - { 128, 15, 12, 0, 0, 128, 0, }, /* 722 */ - { 66, 7, 12, 0, 0, 66, 0, }, /* 723 */ - { 66, 15, 12, 0, 0, 66, 0, }, /* 724 */ - { 66, 21, 12, 0, 0, 66, 0, }, /* 725 */ - { 72, 7, 12, 0, 0, 72, 0, }, /* 726 */ - { 72, 21, 12, 0, 0, 72, 0, }, /* 727 */ - { 98, 7, 12, 0, 0, 98, 0, }, /* 728 */ - { 97, 7, 12, 0, 0, 97, 0, }, /* 729 */ - { 97, 15, 12, 0, 0, 97, 0, }, /* 730 */ - { 31, 7, 12, 0, 0, 31, 0, }, /* 731 */ - { 31, 12, 3, 0, 0, 31, 0, }, /* 732 */ - { 31, 15, 12, 0, 0, 31, 0, }, /* 733 */ - { 31, 21, 12, 0, 0, 31, 0, }, /* 734 */ - { 88, 7, 12, 0, 0, 88, 0, }, /* 735 */ - { 88, 15, 12, 0, 0, 88, 0, }, /* 736 */ - { 88, 21, 12, 0, 0, 88, 0, }, /* 737 */ - { 117, 7, 12, 0, 0, 117, 0, }, /* 738 */ - { 117, 15, 12, 0, 0, 117, 0, }, /* 739 */ - { 112, 7, 12, 0, 0, 112, 0, }, /* 740 */ - { 112, 26, 12, 0, 0, 112, 0, }, /* 741 */ - { 112, 12, 3, 0, 0, 112, 0, }, /* 742 */ - { 112, 15, 12, 0, 0, 112, 0, }, /* 743 */ - { 112, 21, 12, 0, 0, 112, 0, }, /* 744 */ - { 78, 7, 12, 0, 0, 78, 0, }, /* 745 */ - { 78, 21, 12, 0, 0, 78, 0, }, /* 746 */ - { 83, 7, 12, 0, 0, 83, 0, }, /* 747 */ - { 83, 15, 12, 0, 0, 83, 0, }, /* 748 */ - { 82, 7, 12, 0, 0, 82, 0, }, /* 749 */ - { 82, 15, 12, 0, 0, 82, 0, }, /* 750 */ - { 121, 7, 12, 0, 0, 121, 0, }, /* 751 */ - { 121, 21, 12, 0, 0, 121, 0, }, /* 752 */ - { 121, 15, 12, 0, 0, 121, 0, }, /* 753 */ - { 89, 7, 12, 0, 0, 89, 0, }, /* 754 */ - { 130, 9, 12, 0, 64, 130, 0, }, /* 755 */ - { 130, 5, 12, 0, -64, 130, 0, }, /* 756 */ - { 130, 15, 12, 0, 0, 130, 0, }, /* 757 */ - { 144, 7, 12, 0, 0, 144, 0, }, /* 758 */ - { 144, 12, 3, 0, 0, 144, 0, }, /* 759 */ - { 144, 13, 12, 0, 0, 144, 0, }, /* 760 */ - { 1, 15, 12, 0, 0, 1, 0, }, /* 761 */ - { 156, 7, 12, 0, 0, 156, 0, }, /* 762 */ - { 156, 12, 3, 0, 0, 156, 0, }, /* 763 */ - { 156, 17, 12, 0, 0, 156, 0, }, /* 764 */ - { 147, 7, 12, 0, 0, 147, 0, }, /* 765 */ - { 147, 15, 12, 0, 0, 147, 0, }, /* 766 */ - { 148, 7, 12, 0, 0, 148, 0, }, /* 767 */ - { 148, 12, 3, 0, 0, 148, 0, }, /* 768 */ - { 148, 15, 12, 0, 0, 148, 0, }, /* 769 */ - { 148, 21, 12, 0, 0, 148, 0, }, /* 770 */ - { 153, 7, 12, 0, 0, 153, 0, }, /* 771 */ - { 153, 15, 12, 0, 0, 153, 0, }, /* 772 */ - { 149, 7, 12, 0, 0, 149, 0, }, /* 773 */ - { 94, 10, 5, 0, 0, 94, 0, }, /* 774 */ - { 94, 12, 3, 0, 0, 94, 0, }, /* 775 */ - { 94, 7, 12, 0, 0, 94, 0, }, /* 776 */ - { 94, 21, 12, 0, 0, 94, 0, }, /* 777 */ - { 94, 15, 12, 0, 0, 94, 0, }, /* 778 */ - { 94, 13, 12, 0, 0, 94, 0, }, /* 779 */ - { 85, 12, 3, 0, 0, 85, 0, }, /* 780 */ - { 85, 10, 5, 0, 0, 85, 0, }, /* 781 */ - { 85, 7, 12, 0, 0, 85, 0, }, /* 782 */ - { 85, 21, 12, 0, 0, 85, 0, }, /* 783 */ - { 85, 1, 4, 0, 0, 85, 0, }, /* 784 */ - { 101, 7, 12, 0, 0, 101, 0, }, /* 785 */ - { 101, 13, 12, 0, 0, 101, 0, }, /* 786 */ - { 96, 12, 3, 0, 0, 96, 0, }, /* 787 */ - { 96, 7, 12, 0, 0, 96, 0, }, /* 788 */ - { 96, 10, 5, 0, 0, 96, 0, }, /* 789 */ - { 96, 13, 12, 0, 0, 96, 0, }, /* 790 */ - { 96, 21, 12, 0, 0, 96, 0, }, /* 791 */ - { 111, 7, 12, 0, 0, 111, 0, }, /* 792 */ - { 111, 12, 3, 0, 0, 111, 0, }, /* 793 */ - { 111, 21, 12, 0, 0, 111, 0, }, /* 794 */ - { 100, 12, 3, 0, 0, 100, 0, }, /* 795 */ - { 100, 10, 5, 0, 0, 100, 0, }, /* 796 */ - { 100, 7, 12, 0, 0, 100, 0, }, /* 797 */ - { 100, 7, 4, 0, 0, 100, 0, }, /* 798 */ - { 100, 21, 12, 0, 0, 100, 0, }, /* 799 */ - { 100, 13, 12, 0, 0, 100, 0, }, /* 800 */ - { 48, 15, 12, 0, 0, 48, 0, }, /* 801 */ - { 108, 7, 12, 0, 0, 108, 0, }, /* 802 */ - { 108, 10, 5, 0, 0, 108, 0, }, /* 803 */ - { 108, 12, 3, 0, 0, 108, 0, }, /* 804 */ - { 108, 21, 12, 0, 0, 108, 0, }, /* 805 */ - { 129, 7, 12, 0, 0, 129, 0, }, /* 806 */ - { 129, 21, 12, 0, 0, 129, 0, }, /* 807 */ - { 109, 7, 12, 0, 0, 109, 0, }, /* 808 */ - { 109, 12, 3, 0, 0, 109, 0, }, /* 809 */ - { 109, 10, 5, 0, 0, 109, 0, }, /* 810 */ - { 109, 13, 12, 0, 0, 109, 0, }, /* 811 */ - { 107, 12, 3, 0, 0, 107, 0, }, /* 812 */ - { 107, 12, 3, 0, 0, -52, 0, }, /* 813 */ - { 107, 10, 5, 0, 0, 107, 0, }, /* 814 */ - { 107, 10, 5, 0, 0, -52, 0, }, /* 815 */ - { 107, 7, 12, 0, 0, 107, 0, }, /* 816 */ - { 28, 12, 3, 0, 0, -52, 0, }, /* 817 */ - { 107, 10, 3, 0, 0, 107, 0, }, /* 818 */ - { 135, 7, 12, 0, 0, 135, 0, }, /* 819 */ - { 135, 10, 5, 0, 0, 135, 0, }, /* 820 */ - { 135, 12, 3, 0, 0, 135, 0, }, /* 821 */ - { 135, 21, 12, 0, 0, 135, 0, }, /* 822 */ - { 135, 13, 12, 0, 0, 135, 0, }, /* 823 */ - { 124, 7, 12, 0, 0, 124, 0, }, /* 824 */ - { 124, 10, 3, 0, 0, 124, 0, }, /* 825 */ - { 124, 10, 5, 0, 0, 124, 0, }, /* 826 */ - { 124, 12, 3, 0, 0, 124, 0, }, /* 827 */ - { 124, 21, 12, 0, 0, 124, 0, }, /* 828 */ - { 124, 13, 12, 0, 0, 124, 0, }, /* 829 */ - { 123, 7, 12, 0, 0, 123, 0, }, /* 830 */ - { 123, 10, 3, 0, 0, 123, 0, }, /* 831 */ - { 123, 10, 5, 0, 0, 123, 0, }, /* 832 */ - { 123, 12, 3, 0, 0, 123, 0, }, /* 833 */ - { 123, 21, 12, 0, 0, 123, 0, }, /* 834 */ - { 114, 7, 12, 0, 0, 114, 0, }, /* 835 */ - { 114, 10, 5, 0, 0, 114, 0, }, /* 836 */ - { 114, 12, 3, 0, 0, 114, 0, }, /* 837 */ - { 114, 21, 12, 0, 0, 114, 0, }, /* 838 */ - { 114, 13, 12, 0, 0, 114, 0, }, /* 839 */ - { 102, 7, 12, 0, 0, 102, 0, }, /* 840 */ - { 102, 12, 3, 0, 0, 102, 0, }, /* 841 */ - { 102, 10, 5, 0, 0, 102, 0, }, /* 842 */ - { 102, 13, 12, 0, 0, 102, 0, }, /* 843 */ - { 126, 7, 12, 0, 0, 126, 0, }, /* 844 */ - { 126, 12, 3, 0, 0, 126, 0, }, /* 845 */ - { 126, 10, 5, 0, 0, 126, 0, }, /* 846 */ - { 126, 13, 12, 0, 0, 126, 0, }, /* 847 */ - { 126, 15, 12, 0, 0, 126, 0, }, /* 848 */ - { 126, 21, 12, 0, 0, 126, 0, }, /* 849 */ - { 126, 26, 12, 0, 0, 126, 0, }, /* 850 */ - { 142, 7, 12, 0, 0, 142, 0, }, /* 851 */ - { 142, 10, 5, 0, 0, 142, 0, }, /* 852 */ - { 142, 12, 3, 0, 0, 142, 0, }, /* 853 */ - { 142, 21, 12, 0, 0, 142, 0, }, /* 854 */ - { 125, 9, 12, 0, 32, 125, 0, }, /* 855 */ - { 125, 5, 12, 0, -32, 125, 0, }, /* 856 */ - { 125, 13, 12, 0, 0, 125, 0, }, /* 857 */ - { 125, 15, 12, 0, 0, 125, 0, }, /* 858 */ - { 125, 7, 12, 0, 0, 125, 0, }, /* 859 */ - { 154, 7, 12, 0, 0, 154, 0, }, /* 860 */ - { 154, 10, 3, 0, 0, 154, 0, }, /* 861 */ - { 154, 10, 5, 0, 0, 154, 0, }, /* 862 */ - { 154, 12, 3, 0, 0, 154, 0, }, /* 863 */ - { 154, 7, 4, 0, 0, 154, 0, }, /* 864 */ - { 154, 21, 12, 0, 0, 154, 0, }, /* 865 */ - { 154, 13, 12, 0, 0, 154, 0, }, /* 866 */ - { 150, 7, 12, 0, 0, 150, 0, }, /* 867 */ - { 150, 10, 5, 0, 0, 150, 0, }, /* 868 */ - { 150, 12, 3, 0, 0, 150, 0, }, /* 869 */ - { 150, 21, 12, 0, 0, 150, 0, }, /* 870 */ - { 141, 7, 12, 0, 0, 141, 0, }, /* 871 */ - { 141, 12, 3, 0, 0, 141, 0, }, /* 872 */ - { 141, 10, 5, 0, 0, 141, 0, }, /* 873 */ - { 141, 7, 4, 0, 0, 141, 0, }, /* 874 */ - { 141, 21, 12, 0, 0, 141, 0, }, /* 875 */ - { 140, 7, 12, 0, 0, 140, 0, }, /* 876 */ - { 140, 12, 3, 0, 0, 140, 0, }, /* 877 */ - { 140, 10, 5, 0, 0, 140, 0, }, /* 878 */ - { 140, 7, 4, 0, 0, 140, 0, }, /* 879 */ - { 140, 21, 12, 0, 0, 140, 0, }, /* 880 */ - { 122, 7, 12, 0, 0, 122, 0, }, /* 881 */ - { 133, 7, 12, 0, 0, 133, 0, }, /* 882 */ - { 133, 10, 5, 0, 0, 133, 0, }, /* 883 */ - { 133, 12, 3, 0, 0, 133, 0, }, /* 884 */ - { 133, 21, 12, 0, 0, 133, 0, }, /* 885 */ - { 133, 13, 12, 0, 0, 133, 0, }, /* 886 */ - { 133, 15, 12, 0, 0, 133, 0, }, /* 887 */ - { 134, 21, 12, 0, 0, 134, 0, }, /* 888 */ - { 134, 7, 12, 0, 0, 134, 0, }, /* 889 */ - { 134, 12, 3, 0, 0, 134, 0, }, /* 890 */ - { 134, 10, 5, 0, 0, 134, 0, }, /* 891 */ - { 138, 7, 12, 0, 0, 138, 0, }, /* 892 */ - { 138, 12, 3, 0, 0, 138, 0, }, /* 893 */ - { 138, 7, 4, 0, 0, 138, 0, }, /* 894 */ - { 138, 13, 12, 0, 0, 138, 0, }, /* 895 */ - { 143, 7, 12, 0, 0, 143, 0, }, /* 896 */ - { 143, 10, 5, 0, 0, 143, 0, }, /* 897 */ - { 143, 12, 3, 0, 0, 143, 0, }, /* 898 */ - { 143, 13, 12, 0, 0, 143, 0, }, /* 899 */ - { 145, 7, 12, 0, 0, 145, 0, }, /* 900 */ - { 145, 12, 3, 0, 0, 145, 0, }, /* 901 */ - { 145, 10, 5, 0, 0, 145, 0, }, /* 902 */ - { 145, 21, 12, 0, 0, 145, 0, }, /* 903 */ - { 54, 15, 12, 0, 0, 54, 0, }, /* 904 */ - { 54, 21, 12, 0, 0, 54, 0, }, /* 905 */ - { 63, 7, 12, 0, 0, 63, 0, }, /* 906 */ - { 63, 14, 12, 0, 0, 63, 0, }, /* 907 */ - { 63, 21, 12, 0, 0, 63, 0, }, /* 908 */ - { 80, 7, 12, 0, 0, 80, 0, }, /* 909 */ - { 80, 1, 2, 0, 0, 80, 0, }, /* 910 */ - { 127, 7, 12, 0, 0, 127, 0, }, /* 911 */ - { 115, 7, 12, 0, 0, 115, 0, }, /* 912 */ - { 115, 13, 12, 0, 0, 115, 0, }, /* 913 */ - { 115, 21, 12, 0, 0, 115, 0, }, /* 914 */ - { 103, 7, 12, 0, 0, 103, 0, }, /* 915 */ - { 103, 12, 3, 0, 0, 103, 0, }, /* 916 */ - { 103, 21, 12, 0, 0, 103, 0, }, /* 917 */ - { 119, 7, 12, 0, 0, 119, 0, }, /* 918 */ - { 119, 12, 3, 0, 0, 119, 0, }, /* 919 */ - { 119, 21, 12, 0, 0, 119, 0, }, /* 920 */ - { 119, 26, 12, 0, 0, 119, 0, }, /* 921 */ - { 119, 6, 12, 0, 0, 119, 0, }, /* 922 */ - { 119, 13, 12, 0, 0, 119, 0, }, /* 923 */ - { 119, 15, 12, 0, 0, 119, 0, }, /* 924 */ - { 146, 9, 12, 0, 32, 146, 0, }, /* 925 */ - { 146, 5, 12, 0, -32, 146, 0, }, /* 926 */ - { 146, 15, 12, 0, 0, 146, 0, }, /* 927 */ - { 146, 21, 12, 0, 0, 146, 0, }, /* 928 */ - { 99, 7, 12, 0, 0, 99, 0, }, /* 929 */ - { 99, 12, 3, 0, 0, 99, 0, }, /* 930 */ - { 99, 10, 5, 0, 0, 99, 0, }, /* 931 */ - { 99, 6, 12, 0, 0, 99, 0, }, /* 932 */ - { 137, 6, 12, 0, 0, 137, 0, }, /* 933 */ - { 139, 6, 12, 0, 0, 139, 0, }, /* 934 */ - { 155, 12, 3, 0, 0, 155, 0, }, /* 935 */ - { 23, 10, 5, 0, 0, 23, 0, }, /* 936 */ - { 137, 7, 12, 0, 0, 137, 0, }, /* 937 */ - { 155, 7, 12, 0, 0, 155, 0, }, /* 938 */ - { 139, 7, 12, 0, 0, 139, 0, }, /* 939 */ - { 105, 7, 12, 0, 0, 105, 0, }, /* 940 */ - { 105, 26, 12, 0, 0, 105, 0, }, /* 941 */ - { 105, 12, 3, 0, 0, 105, 0, }, /* 942 */ - { 105, 21, 12, 0, 0, 105, 0, }, /* 943 */ - { 10, 1, 2, 0, 0, 105, 0, }, /* 944 */ - { 10, 10, 3, 0, 0, 10, 0, }, /* 945 */ - { 10, 10, 5, 0, 0, 10, 0, }, /* 946 */ - { 20, 12, 3, 0, 0, 20, 0, }, /* 947 */ - { 131, 26, 12, 0, 0, 131, 0, }, /* 948 */ - { 131, 12, 3, 0, 0, 131, 0, }, /* 949 */ - { 131, 21, 12, 0, 0, 131, 0, }, /* 950 */ - { 18, 12, 3, 0, 0, 18, 0, }, /* 951 */ - { 151, 7, 12, 0, 0, 151, 0, }, /* 952 */ - { 151, 12, 3, 0, 0, 151, 0, }, /* 953 */ - { 151, 6, 12, 0, 0, 151, 0, }, /* 954 */ - { 151, 13, 12, 0, 0, 151, 0, }, /* 955 */ - { 151, 26, 12, 0, 0, 151, 0, }, /* 956 */ - { 152, 7, 12, 0, 0, 152, 0, }, /* 957 */ - { 152, 12, 3, 0, 0, 152, 0, }, /* 958 */ - { 152, 13, 12, 0, 0, 152, 0, }, /* 959 */ - { 152, 23, 12, 0, 0, 152, 0, }, /* 960 */ - { 113, 7, 12, 0, 0, 113, 0, }, /* 961 */ - { 113, 15, 12, 0, 0, 113, 0, }, /* 962 */ - { 113, 12, 3, 0, 0, 113, 0, }, /* 963 */ - { 132, 9, 12, 0, 34, 132, 0, }, /* 964 */ - { 132, 5, 12, 0, -34, 132, 0, }, /* 965 */ - { 132, 12, 3, 0, 0, 132, 0, }, /* 966 */ - { 132, 6, 12, 0, 0, 132, 0, }, /* 967 */ - { 132, 13, 12, 0, 0, 132, 0, }, /* 968 */ - { 132, 21, 12, 0, 0, 132, 0, }, /* 969 */ - { 0, 2, 14, 0, 0, 0, 0, }, /* 970 */ - { 10, 26, 11, 0, 0, 10, 0, }, /* 971 */ - { 27, 26, 12, 0, 0, 27, 0, }, /* 972 */ - { 10, 24, 3, 0, 0, 10, 0, }, /* 973 */ - { 10, 1, 3, 0, 0, 10, 0, }, /* 974 */ + { 1, 1, 2, 0, 0, -82, 0, }, /* 223 */ + { 10, 21, 12, 0, 0, -164, 0, }, /* 224 */ + { 1, 7, 12, 0, 0, 1, 0, }, /* 225 */ + { 10, 6, 12, 0, 0, -181, 0, }, /* 226 */ + { 28, 12, 3, 0, 0, -10, 0, }, /* 227 */ + { 1, 13, 12, 0, 0, -86, 0, }, /* 228 */ + { 1, 21, 12, 0, 0, -4, 0, }, /* 229 */ + { 1, 6, 12, 0, 0, 1, 0, }, /* 230 */ + { 1, 13, 12, 0, 0, 1, 0, }, /* 231 */ + { 50, 21, 12, 0, 0, 50, 0, }, /* 232 */ + { 50, 1, 4, 0, 0, 50, 0, }, /* 233 */ + { 50, 7, 12, 0, 0, 50, 0, }, /* 234 */ + { 50, 12, 3, 0, 0, 50, 0, }, /* 235 */ + { 56, 7, 12, 0, 0, 56, 0, }, /* 236 */ + { 56, 12, 3, 0, 0, 56, 0, }, /* 237 */ + { 64, 13, 12, 0, 0, 64, 0, }, /* 238 */ + { 64, 7, 12, 0, 0, 64, 0, }, /* 239 */ + { 64, 12, 3, 0, 0, 64, 0, }, /* 240 */ + { 64, 6, 12, 0, 0, 64, 0, }, /* 241 */ + { 64, 26, 12, 0, 0, 64, 0, }, /* 242 */ + { 64, 21, 12, 0, 0, 64, 0, }, /* 243 */ + { 64, 23, 12, 0, 0, 64, 0, }, /* 244 */ + { 90, 7, 12, 0, 0, 90, 0, }, /* 245 */ + { 90, 12, 3, 0, 0, 90, 0, }, /* 246 */ + { 90, 6, 12, 0, 0, 90, 0, }, /* 247 */ + { 90, 21, 12, 0, 0, 90, 0, }, /* 248 */ + { 95, 7, 12, 0, 0, 95, 0, }, /* 249 */ + { 95, 12, 3, 0, 0, 95, 0, }, /* 250 */ + { 95, 21, 12, 0, 0, 95, 0, }, /* 251 */ + { 1, 24, 12, 0, 0, 1, 0, }, /* 252 */ + { 15, 12, 3, 0, 0, 15, 0, }, /* 253 */ + { 15, 10, 5, 0, 0, 15, 0, }, /* 254 */ + { 15, 7, 12, 0, 0, 15, 0, }, /* 255 */ + { 28, 12, 3, 0, 0, -216, 0, }, /* 256 */ + { 28, 12, 3, 0, 0, -203, 0, }, /* 257 */ + { 10, 21, 12, 0, 0, -259, 0, }, /* 258 */ + { 10, 21, 12, 0, 0, -280, 0, }, /* 259 */ + { 15, 13, 12, 0, 0, -132, 0, }, /* 260 */ + { 15, 21, 12, 0, 0, 15, 0, }, /* 261 */ + { 15, 6, 12, 0, 0, 15, 0, }, /* 262 */ + { 3, 7, 12, 0, 0, 3, 0, }, /* 263 */ + { 3, 12, 3, 0, 0, 3, 0, }, /* 264 */ + { 3, 10, 5, 0, 0, 3, 0, }, /* 265 */ + { 3, 10, 3, 0, 0, 3, 0, }, /* 266 */ + { 3, 13, 12, 0, 0, -90, 0, }, /* 267 */ + { 3, 23, 12, 0, 0, 3, 0, }, /* 268 */ + { 3, 15, 12, 0, 0, 3, 0, }, /* 269 */ + { 3, 26, 12, 0, 0, 3, 0, }, /* 270 */ + { 3, 21, 12, 0, 0, 3, 0, }, /* 271 */ + { 22, 12, 3, 0, 0, 22, 0, }, /* 272 */ + { 22, 10, 5, 0, 0, 22, 0, }, /* 273 */ + { 22, 7, 12, 0, 0, 22, 0, }, /* 274 */ + { 22, 13, 12, 0, 0, -61, 0, }, /* 275 */ + { 22, 21, 12, 0, 0, 22, 0, }, /* 276 */ + { 21, 12, 3, 0, 0, 21, 0, }, /* 277 */ + { 21, 10, 5, 0, 0, 21, 0, }, /* 278 */ + { 21, 7, 12, 0, 0, 21, 0, }, /* 279 */ + { 21, 13, 12, 0, 0, -58, 0, }, /* 280 */ + { 21, 21, 12, 0, 0, 21, 0, }, /* 281 */ + { 21, 23, 12, 0, 0, 21, 0, }, /* 282 */ + { 44, 12, 3, 0, 0, 44, 0, }, /* 283 */ + { 44, 10, 5, 0, 0, 44, 0, }, /* 284 */ + { 44, 7, 12, 0, 0, 44, 0, }, /* 285 */ + { 44, 10, 3, 0, 0, 44, 0, }, /* 286 */ + { 44, 13, 12, 0, 0, 44, 0, }, /* 287 */ + { 44, 26, 12, 0, 0, 44, 0, }, /* 288 */ + { 44, 15, 12, 0, 0, 44, 0, }, /* 289 */ + { 54, 12, 3, 0, 0, 54, 0, }, /* 290 */ + { 54, 7, 12, 0, 0, 54, 0, }, /* 291 */ + { 54, 10, 3, 0, 0, 54, 0, }, /* 292 */ + { 54, 10, 5, 0, 0, 54, 0, }, /* 293 */ + { 54, 13, 12, 0, 0, -55, 0, }, /* 294 */ + { 54, 15, 12, 0, 0, -55, 0, }, /* 295 */ + { 54, 26, 12, 0, 0, -55, 0, }, /* 296 */ + { 54, 26, 12, 0, 0, 54, 0, }, /* 297 */ + { 54, 23, 12, 0, 0, 54, 0, }, /* 298 */ + { 55, 12, 3, 0, 0, 55, 0, }, /* 299 */ + { 55, 10, 5, 0, 0, 55, 0, }, /* 300 */ + { 55, 7, 12, 0, 0, 55, 0, }, /* 301 */ + { 55, 13, 12, 0, 0, 55, 0, }, /* 302 */ + { 55, 21, 12, 0, 0, 55, 0, }, /* 303 */ + { 55, 15, 12, 0, 0, 55, 0, }, /* 304 */ + { 55, 26, 12, 0, 0, 55, 0, }, /* 305 */ + { 29, 7, 12, 0, 0, 29, 0, }, /* 306 */ + { 29, 12, 3, 0, 0, 29, 0, }, /* 307 */ + { 29, 10, 5, 0, 0, 29, 0, }, /* 308 */ + { 29, 21, 12, 0, 0, 29, 0, }, /* 309 */ + { 29, 10, 3, 0, 0, 29, 0, }, /* 310 */ + { 29, 13, 12, 0, 0, -70, 0, }, /* 311 */ + { 37, 12, 3, 0, 0, 37, 0, }, /* 312 */ + { 37, 10, 5, 0, 0, 37, 0, }, /* 313 */ + { 37, 7, 12, 0, 0, 37, 0, }, /* 314 */ + { 37, 10, 3, 0, 0, 37, 0, }, /* 315 */ + { 37, 7, 4, 0, 0, 37, 0, }, /* 316 */ + { 37, 26, 12, 0, 0, 37, 0, }, /* 317 */ + { 37, 15, 12, 0, 0, 37, 0, }, /* 318 */ + { 37, 13, 12, 0, 0, 37, 0, }, /* 319 */ + { 48, 12, 3, 0, 0, 48, 0, }, /* 320 */ + { 48, 10, 5, 0, 0, 48, 0, }, /* 321 */ + { 48, 7, 12, 0, 0, 48, 0, }, /* 322 */ + { 48, 10, 3, 0, 0, 48, 0, }, /* 323 */ + { 48, 13, 12, 0, 0, 48, 0, }, /* 324 */ + { 48, 21, 12, 0, 0, 48, 0, }, /* 325 */ + { 57, 7, 12, 0, 0, 57, 0, }, /* 326 */ + { 57, 12, 3, 0, 0, 57, 0, }, /* 327 */ + { 57, 7, 5, 0, 0, 57, 0, }, /* 328 */ + { 57, 6, 12, 0, 0, 57, 0, }, /* 329 */ + { 57, 21, 12, 0, 0, 57, 0, }, /* 330 */ + { 57, 13, 12, 0, 0, 57, 0, }, /* 331 */ + { 33, 7, 12, 0, 0, 33, 0, }, /* 332 */ + { 33, 12, 3, 0, 0, 33, 0, }, /* 333 */ + { 33, 7, 5, 0, 0, 33, 0, }, /* 334 */ + { 33, 6, 12, 0, 0, 33, 0, }, /* 335 */ + { 33, 13, 12, 0, 0, 33, 0, }, /* 336 */ + { 58, 7, 12, 0, 0, 58, 0, }, /* 337 */ + { 58, 26, 12, 0, 0, 58, 0, }, /* 338 */ + { 58, 21, 12, 0, 0, 58, 0, }, /* 339 */ + { 58, 12, 3, 0, 0, 58, 0, }, /* 340 */ + { 58, 13, 12, 0, 0, 58, 0, }, /* 341 */ + { 58, 15, 12, 0, 0, 58, 0, }, /* 342 */ + { 58, 22, 12, 0, 0, 58, 0, }, /* 343 */ + { 58, 18, 12, 0, 0, 58, 0, }, /* 344 */ + { 58, 10, 5, 0, 0, 58, 0, }, /* 345 */ + { 39, 7, 12, 0, 0, 39, 0, }, /* 346 */ + { 39, 10, 12, 0, 0, 39, 0, }, /* 347 */ + { 39, 12, 3, 0, 0, 39, 0, }, /* 348 */ + { 39, 10, 5, 0, 0, 39, 0, }, /* 349 */ + { 39, 13, 12, 0, 0, -94, 0, }, /* 350 */ + { 39, 21, 12, 0, 0, 39, 0, }, /* 351 */ + { 39, 13, 12, 0, 0, 39, 0, }, /* 352 */ + { 39, 26, 12, 0, 0, 39, 0, }, /* 353 */ + { 17, 9, 12, 0, 7264, 17, 0, }, /* 354 */ + { 17, 5, 12, 0, 3008, 17, 0, }, /* 355 */ + { 10, 21, 12, 0, 0, -52, 0, }, /* 356 */ + { 17, 6, 12, 0, 0, 17, 0, }, /* 357 */ + { 24, 7, 6, 0, 0, 24, 0, }, /* 358 */ + { 24, 7, 7, 0, 0, 24, 0, }, /* 359 */ + { 24, 7, 8, 0, 0, 24, 0, }, /* 360 */ + { 16, 7, 12, 0, 0, 16, 0, }, /* 361 */ + { 16, 12, 3, 0, 0, 16, 0, }, /* 362 */ + { 16, 21, 12, 0, 0, 16, 0, }, /* 363 */ + { 16, 15, 12, 0, 0, 16, 0, }, /* 364 */ + { 16, 26, 12, 0, 0, 16, 0, }, /* 365 */ + { 9, 9, 12, 0, 38864, 9, 0, }, /* 366 */ + { 9, 9, 12, 0, 8, 9, 0, }, /* 367 */ + { 9, 5, 12, 0, -8, 9, 0, }, /* 368 */ + { 8, 17, 12, 0, 0, 8, 0, }, /* 369 */ + { 8, 7, 12, 0, 0, 8, 0, }, /* 370 */ + { 8, 26, 12, 0, 0, 8, 0, }, /* 371 */ + { 8, 21, 12, 0, 0, 8, 0, }, /* 372 */ + { 41, 29, 12, 0, 0, 41, 0, }, /* 373 */ + { 41, 7, 12, 0, 0, 41, 0, }, /* 374 */ + { 41, 22, 12, 0, 0, 41, 0, }, /* 375 */ + { 41, 18, 12, 0, 0, 41, 0, }, /* 376 */ + { 46, 7, 12, 0, 0, 46, 0, }, /* 377 */ + { 46, 14, 12, 0, 0, 46, 0, }, /* 378 */ + { 51, 7, 12, 0, 0, 51, 0, }, /* 379 */ + { 51, 12, 3, 0, 0, 51, 0, }, /* 380 */ + { 51, 10, 5, 0, 0, 51, 0, }, /* 381 */ + { 25, 7, 12, 0, 0, 25, 0, }, /* 382 */ + { 25, 12, 3, 0, 0, 25, 0, }, /* 383 */ + { 25, 10, 5, 0, 0, 25, 0, }, /* 384 */ + { 10, 21, 12, 0, 0, -127, 0, }, /* 385 */ + { 7, 7, 12, 0, 0, 7, 0, }, /* 386 */ + { 7, 12, 3, 0, 0, 7, 0, }, /* 387 */ + { 52, 7, 12, 0, 0, 52, 0, }, /* 388 */ + { 52, 12, 3, 0, 0, 52, 0, }, /* 389 */ + { 32, 7, 12, 0, 0, 32, 0, }, /* 390 */ + { 32, 12, 3, 0, 0, 32, 0, }, /* 391 */ + { 32, 10, 5, 0, 0, 32, 0, }, /* 392 */ + { 32, 21, 12, 0, 0, 32, 0, }, /* 393 */ + { 32, 6, 12, 0, 0, 32, 0, }, /* 394 */ + { 32, 23, 12, 0, 0, 32, 0, }, /* 395 */ + { 32, 13, 12, 0, 0, 32, 0, }, /* 396 */ + { 32, 15, 12, 0, 0, 32, 0, }, /* 397 */ + { 38, 21, 12, 0, 0, 38, 0, }, /* 398 */ + { 10, 21, 12, 0, 0, -79, 0, }, /* 399 */ + { 38, 17, 12, 0, 0, 38, 0, }, /* 400 */ + { 38, 12, 3, 0, 0, 38, 0, }, /* 401 */ + { 38, 1, 2, 0, 0, 38, 0, }, /* 402 */ + { 38, 13, 12, 0, 0, 38, 0, }, /* 403 */ + { 38, 7, 12, 0, 0, 38, 0, }, /* 404 */ + { 38, 6, 12, 0, 0, 38, 0, }, /* 405 */ + { 35, 7, 12, 0, 0, 35, 0, }, /* 406 */ + { 35, 12, 3, 0, 0, 35, 0, }, /* 407 */ + { 35, 10, 5, 0, 0, 35, 0, }, /* 408 */ + { 35, 26, 12, 0, 0, 35, 0, }, /* 409 */ + { 35, 21, 12, 0, 0, 35, 0, }, /* 410 */ + { 35, 13, 12, 0, 0, 35, 0, }, /* 411 */ + { 53, 7, 12, 0, 0, 53, 0, }, /* 412 */ + { 40, 7, 12, 0, 0, 40, 0, }, /* 413 */ + { 40, 13, 12, 0, 0, 40, 0, }, /* 414 */ + { 40, 15, 12, 0, 0, 40, 0, }, /* 415 */ + { 40, 26, 12, 0, 0, 40, 0, }, /* 416 */ + { 32, 26, 12, 0, 0, 32, 0, }, /* 417 */ + { 6, 7, 12, 0, 0, 6, 0, }, /* 418 */ + { 6, 12, 3, 0, 0, 6, 0, }, /* 419 */ + { 6, 10, 5, 0, 0, 6, 0, }, /* 420 */ + { 6, 21, 12, 0, 0, 6, 0, }, /* 421 */ + { 91, 7, 12, 0, 0, 91, 0, }, /* 422 */ + { 91, 10, 5, 0, 0, 91, 0, }, /* 423 */ + { 91, 12, 3, 0, 0, 91, 0, }, /* 424 */ + { 91, 10, 12, 0, 0, 91, 0, }, /* 425 */ + { 91, 13, 12, 0, 0, 91, 0, }, /* 426 */ + { 91, 21, 12, 0, 0, 91, 0, }, /* 427 */ + { 91, 6, 12, 0, 0, 91, 0, }, /* 428 */ + { 28, 11, 3, 0, 0, 28, 0, }, /* 429 */ + { 62, 12, 3, 0, 0, 62, 0, }, /* 430 */ + { 62, 10, 5, 0, 0, 62, 0, }, /* 431 */ + { 62, 7, 12, 0, 0, 62, 0, }, /* 432 */ + { 62, 10, 3, 0, 0, 62, 0, }, /* 433 */ + { 62, 13, 12, 0, 0, 62, 0, }, /* 434 */ + { 62, 21, 12, 0, 0, 62, 0, }, /* 435 */ + { 62, 26, 12, 0, 0, 62, 0, }, /* 436 */ + { 76, 12, 3, 0, 0, 76, 0, }, /* 437 */ + { 76, 10, 5, 0, 0, 76, 0, }, /* 438 */ + { 76, 7, 12, 0, 0, 76, 0, }, /* 439 */ + { 76, 13, 12, 0, 0, 76, 0, }, /* 440 */ + { 93, 7, 12, 0, 0, 93, 0, }, /* 441 */ + { 93, 12, 3, 0, 0, 93, 0, }, /* 442 */ + { 93, 10, 5, 0, 0, 93, 0, }, /* 443 */ + { 93, 21, 12, 0, 0, 93, 0, }, /* 444 */ + { 70, 7, 12, 0, 0, 70, 0, }, /* 445 */ + { 70, 10, 5, 0, 0, 70, 0, }, /* 446 */ + { 70, 12, 3, 0, 0, 70, 0, }, /* 447 */ + { 70, 21, 12, 0, 0, 70, 0, }, /* 448 */ + { 70, 13, 12, 0, 0, 70, 0, }, /* 449 */ + { 73, 13, 12, 0, 0, 73, 0, }, /* 450 */ + { 73, 7, 12, 0, 0, 73, 0, }, /* 451 */ + { 73, 6, 12, 0, 0, 73, 0, }, /* 452 */ + { 73, 21, 12, 0, 0, 73, 0, }, /* 453 */ + { 13, 5, 12, 63, -6222, 13, 0, }, /* 454 */ + { 13, 5, 12, 67, -6221, 13, 0, }, /* 455 */ + { 13, 5, 12, 71, -6212, 13, 0, }, /* 456 */ + { 13, 5, 12, 75, -6210, 13, 0, }, /* 457 */ + { 13, 5, 12, 79, -6210, 13, 0, }, /* 458 */ + { 13, 5, 12, 79, -6211, 13, 0, }, /* 459 */ + { 13, 5, 12, 84, -6204, 13, 0, }, /* 460 */ + { 13, 5, 12, 88, -6180, 13, 0, }, /* 461 */ + { 13, 5, 12, 108, 35267, 13, 0, }, /* 462 */ + { 17, 9, 12, 0, -3008, 17, 0, }, /* 463 */ + { 76, 21, 12, 0, 0, 76, 0, }, /* 464 */ + { 28, 12, 3, 0, 0, -122, 0, }, /* 465 */ + { 28, 12, 3, 0, 0, 15, 0, }, /* 466 */ + { 10, 21, 12, 0, 0, -40, 0, }, /* 467 */ + { 28, 12, 3, 0, 0, -16, 0, }, /* 468 */ + { 28, 12, 3, 0, 0, -46, 0, }, /* 469 */ + { 28, 12, 3, 0, 0, -157, 0, }, /* 470 */ + { 10, 10, 5, 0, 0, -16, 0, }, /* 471 */ + { 10, 7, 12, 0, 0, -43, 0, }, /* 472 */ + { 10, 7, 12, 0, 0, -16, 0, }, /* 473 */ + { 10, 7, 12, 0, 0, 15, 0, }, /* 474 */ + { 10, 7, 12, 0, 0, -172, 0, }, /* 475 */ + { 10, 7, 12, 0, 0, -40, 0, }, /* 476 */ + { 28, 12, 3, 0, 0, -106, 0, }, /* 477 */ + { 10, 10, 5, 0, 0, 3, 0, }, /* 478 */ + { 28, 12, 3, 0, 0, -40, 0, }, /* 479 */ + { 10, 7, 12, 0, 0, 150, 0, }, /* 480 */ + { 13, 5, 12, 0, 0, 13, 0, }, /* 481 */ + { 13, 6, 12, 0, 0, 13, 0, }, /* 482 */ + { 34, 5, 12, 0, 35332, 34, 0, }, /* 483 */ + { 34, 5, 12, 0, 3814, 34, 0, }, /* 484 */ + { 34, 5, 12, 0, 35384, 34, 0, }, /* 485 */ + { 28, 12, 3, 0, 0, -37, 0, }, /* 486 */ + { 28, 12, 3, 0, 0, 50, 0, }, /* 487 */ + { 34, 9, 12, 92, 1, 34, 0, }, /* 488 */ + { 34, 5, 12, 92, -1, 34, 0, }, /* 489 */ + { 34, 5, 12, 92, -58, 34, 0, }, /* 490 */ + { 34, 9, 12, 0, -7615, 34, 0, }, /* 491 */ + { 20, 5, 12, 0, 8, 20, 0, }, /* 492 */ + { 20, 9, 12, 0, -8, 20, 0, }, /* 493 */ + { 20, 5, 12, 0, 74, 20, 0, }, /* 494 */ + { 20, 5, 12, 0, 86, 20, 0, }, /* 495 */ + { 20, 5, 12, 0, 100, 20, 0, }, /* 496 */ + { 20, 5, 12, 0, 128, 20, 0, }, /* 497 */ + { 20, 5, 12, 0, 112, 20, 0, }, /* 498 */ + { 20, 5, 12, 0, 126, 20, 0, }, /* 499 */ + { 20, 8, 12, 0, -8, 20, 0, }, /* 500 */ + { 20, 5, 12, 0, 9, 20, 0, }, /* 501 */ + { 20, 9, 12, 0, -74, 20, 0, }, /* 502 */ + { 20, 8, 12, 0, -9, 20, 0, }, /* 503 */ + { 20, 5, 12, 21, -7173, 20, 0, }, /* 504 */ + { 20, 9, 12, 0, -86, 20, 0, }, /* 505 */ + { 20, 9, 12, 0, -100, 20, 0, }, /* 506 */ + { 20, 9, 12, 0, -112, 20, 0, }, /* 507 */ + { 20, 9, 12, 0, -128, 20, 0, }, /* 508 */ + { 20, 9, 12, 0, -126, 20, 0, }, /* 509 */ + { 28, 1, 3, 0, 0, 28, 0, }, /* 510 */ + { 28, 1, 13, 0, 0, 28, 0, }, /* 511 */ + { 10, 27, 2, 0, 0, 10, 0, }, /* 512 */ + { 10, 28, 2, 0, 0, 10, 0, }, /* 513 */ + { 10, 29, 12, 0, 0, -73, 0, }, /* 514 */ + { 10, 21, 14, 0, 0, 10, 0, }, /* 515 */ + { 0, 2, 2, 0, 0, 0, 0, }, /* 516 */ + { 28, 12, 3, 0, 0, -110, 0, }, /* 517 */ + { 10, 9, 12, 0, 0, 10, 0, }, /* 518 */ + { 10, 5, 12, 0, 0, 10, 0, }, /* 519 */ + { 20, 9, 12, 96, -7517, 20, 0, }, /* 520 */ + { 34, 9, 12, 100, -8383, 34, 0, }, /* 521 */ + { 34, 9, 12, 104, -8262, 34, 0, }, /* 522 */ + { 34, 9, 12, 0, 28, 34, 0, }, /* 523 */ + { 10, 7, 12, 0, 0, 10, 0, }, /* 524 */ + { 10, 5, 14, 0, 0, 10, 0, }, /* 525 */ + { 34, 5, 12, 0, -28, 34, 0, }, /* 526 */ + { 34, 14, 12, 0, 16, 34, 0, }, /* 527 */ + { 34, 14, 12, 0, -16, 34, 0, }, /* 528 */ + { 34, 14, 12, 0, 0, 34, 0, }, /* 529 */ + { 10, 25, 14, 0, 0, 10, 0, }, /* 530 */ + { 10, 26, 12, 0, 26, 10, 0, }, /* 531 */ + { 10, 26, 14, 0, 26, 10, 0, }, /* 532 */ + { 10, 26, 12, 0, -26, 10, 0, }, /* 533 */ + { 5, 26, 12, 0, 0, 5, 0, }, /* 534 */ + { 18, 9, 12, 0, 48, 18, 0, }, /* 535 */ + { 18, 5, 12, 0, -48, 18, 0, }, /* 536 */ + { 34, 9, 12, 0, -10743, 34, 0, }, /* 537 */ + { 34, 9, 12, 0, -3814, 34, 0, }, /* 538 */ + { 34, 9, 12, 0, -10727, 34, 0, }, /* 539 */ + { 34, 5, 12, 0, -10795, 34, 0, }, /* 540 */ + { 34, 5, 12, 0, -10792, 34, 0, }, /* 541 */ + { 34, 9, 12, 0, -10780, 34, 0, }, /* 542 */ + { 34, 9, 12, 0, -10749, 34, 0, }, /* 543 */ + { 34, 9, 12, 0, -10783, 34, 0, }, /* 544 */ + { 34, 9, 12, 0, -10782, 34, 0, }, /* 545 */ + { 34, 9, 12, 0, -10815, 34, 0, }, /* 546 */ + { 11, 5, 12, 0, 0, 11, 0, }, /* 547 */ + { 11, 26, 12, 0, 0, 11, 0, }, /* 548 */ + { 11, 12, 3, 0, 0, 11, 0, }, /* 549 */ + { 11, 21, 12, 0, 0, 11, 0, }, /* 550 */ + { 11, 15, 12, 0, 0, 11, 0, }, /* 551 */ + { 17, 5, 12, 0, -7264, 17, 0, }, /* 552 */ + { 59, 7, 12, 0, 0, 59, 0, }, /* 553 */ + { 59, 6, 12, 0, 0, 59, 0, }, /* 554 */ + { 59, 21, 12, 0, 0, 59, 0, }, /* 555 */ + { 59, 12, 3, 0, 0, 59, 0, }, /* 556 */ + { 13, 12, 3, 0, 0, 13, 0, }, /* 557 */ + { 10, 21, 12, 0, 0, -28, 0, }, /* 558 */ + { 23, 26, 12, 0, 0, 23, 0, }, /* 559 */ + { 10, 21, 12, 0, 0, -150, 0, }, /* 560 */ + { 10, 21, 12, 0, 0, -137, 0, }, /* 561 */ + { 23, 6, 12, 0, 0, 23, 0, }, /* 562 */ + { 10, 7, 12, 0, 0, 23, 0, }, /* 563 */ + { 23, 14, 12, 0, 0, 23, 0, }, /* 564 */ + { 10, 22, 12, 0, 0, -150, 0, }, /* 565 */ + { 10, 18, 12, 0, 0, -150, 0, }, /* 566 */ + { 10, 26, 12, 0, 0, -137, 0, }, /* 567 */ + { 10, 17, 12, 0, 0, -137, 0, }, /* 568 */ + { 10, 22, 12, 0, 0, -137, 0, }, /* 569 */ + { 10, 18, 12, 0, 0, -137, 0, }, /* 570 */ + { 28, 12, 3, 0, 0, -19, 0, }, /* 571 */ + { 24, 10, 3, 0, 0, 24, 0, }, /* 572 */ + { 10, 17, 14, 0, 0, -137, 0, }, /* 573 */ + { 10, 6, 12, 0, 0, -67, 0, }, /* 574 */ + { 10, 7, 12, 0, 0, -114, 0, }, /* 575 */ + { 10, 21, 14, 0, 0, -114, 0, }, /* 576 */ + { 10, 26, 12, 0, 0, 23, 0, }, /* 577 */ + { 27, 7, 12, 0, 0, 27, 0, }, /* 578 */ + { 28, 12, 3, 0, 0, -67, 0, }, /* 579 */ + { 10, 24, 12, 0, 0, -67, 0, }, /* 580 */ + { 27, 6, 12, 0, 0, 27, 0, }, /* 581 */ + { 10, 17, 12, 0, 0, -67, 0, }, /* 582 */ + { 30, 7, 12, 0, 0, 30, 0, }, /* 583 */ + { 30, 6, 12, 0, 0, 30, 0, }, /* 584 */ + { 4, 7, 12, 0, 0, 4, 0, }, /* 585 */ + { 24, 7, 12, 0, 0, 24, 0, }, /* 586 */ + { 10, 15, 12, 0, 0, 23, 0, }, /* 587 */ + { 24, 26, 12, 0, 0, 24, 0, }, /* 588 */ + { 10, 26, 14, 0, 0, 23, 0, }, /* 589 */ + { 30, 26, 12, 0, 0, 30, 0, }, /* 590 */ + { 23, 7, 12, 0, 0, 23, 0, }, /* 591 */ + { 61, 7, 12, 0, 0, 61, 0, }, /* 592 */ + { 61, 6, 12, 0, 0, 61, 0, }, /* 593 */ + { 61, 26, 12, 0, 0, 61, 0, }, /* 594 */ + { 86, 7, 12, 0, 0, 86, 0, }, /* 595 */ + { 86, 6, 12, 0, 0, 86, 0, }, /* 596 */ + { 86, 21, 12, 0, 0, 86, 0, }, /* 597 */ + { 77, 7, 12, 0, 0, 77, 0, }, /* 598 */ + { 77, 6, 12, 0, 0, 77, 0, }, /* 599 */ + { 77, 21, 12, 0, 0, 77, 0, }, /* 600 */ + { 77, 13, 12, 0, 0, 77, 0, }, /* 601 */ + { 13, 9, 12, 108, 1, 13, 0, }, /* 602 */ + { 13, 5, 12, 108, -35267, 13, 0, }, /* 603 */ + { 13, 7, 12, 0, 0, 13, 0, }, /* 604 */ + { 13, 21, 12, 0, 0, 13, 0, }, /* 605 */ + { 79, 7, 12, 0, 0, 79, 0, }, /* 606 */ + { 79, 14, 12, 0, 0, 79, 0, }, /* 607 */ + { 79, 12, 3, 0, 0, 79, 0, }, /* 608 */ + { 79, 21, 12, 0, 0, 79, 0, }, /* 609 */ + { 10, 24, 12, 0, 0, -64, 0, }, /* 610 */ + { 34, 9, 12, 0, -35332, 34, 0, }, /* 611 */ + { 34, 9, 12, 0, -42280, 34, 0, }, /* 612 */ + { 34, 5, 12, 0, 48, 34, 0, }, /* 613 */ + { 34, 9, 12, 0, -42308, 34, 0, }, /* 614 */ + { 34, 9, 12, 0, -42319, 34, 0, }, /* 615 */ + { 34, 9, 12, 0, -42315, 34, 0, }, /* 616 */ + { 34, 9, 12, 0, -42305, 34, 0, }, /* 617 */ + { 34, 9, 12, 0, -42258, 34, 0, }, /* 618 */ + { 34, 9, 12, 0, -42282, 34, 0, }, /* 619 */ + { 34, 9, 12, 0, -42261, 34, 0, }, /* 620 */ + { 34, 9, 12, 0, 928, 34, 0, }, /* 621 */ + { 34, 9, 12, 0, -48, 34, 0, }, /* 622 */ + { 34, 9, 12, 0, -42307, 34, 0, }, /* 623 */ + { 34, 9, 12, 0, -35384, 34, 0, }, /* 624 */ + { 49, 7, 12, 0, 0, 49, 0, }, /* 625 */ + { 49, 12, 3, 0, 0, 49, 0, }, /* 626 */ + { 49, 10, 5, 0, 0, 49, 0, }, /* 627 */ + { 49, 26, 12, 0, 0, 49, 0, }, /* 628 */ + { 10, 15, 12, 0, 0, -244, 0, }, /* 629 */ + { 10, 15, 12, 0, 0, -230, 0, }, /* 630 */ + { 10, 26, 12, 0, 0, -191, 0, }, /* 631 */ + { 10, 23, 12, 0, 0, -191, 0, }, /* 632 */ + { 65, 7, 12, 0, 0, 65, 0, }, /* 633 */ + { 65, 21, 12, 0, 0, 65, 0, }, /* 634 */ + { 75, 10, 5, 0, 0, 75, 0, }, /* 635 */ + { 75, 7, 12, 0, 0, 75, 0, }, /* 636 */ + { 75, 12, 3, 0, 0, 75, 0, }, /* 637 */ + { 75, 21, 12, 0, 0, 75, 0, }, /* 638 */ + { 75, 13, 12, 0, 0, 75, 0, }, /* 639 */ + { 15, 12, 3, 0, 0, -16, 0, }, /* 640 */ + { 15, 7, 12, 0, 0, -49, 0, }, /* 641 */ + { 69, 13, 12, 0, 0, 69, 0, }, /* 642 */ + { 69, 7, 12, 0, 0, 69, 0, }, /* 643 */ + { 69, 12, 3, 0, 0, 69, 0, }, /* 644 */ + { 10, 21, 12, 0, 0, -118, 0, }, /* 645 */ + { 69, 21, 12, 0, 0, 69, 0, }, /* 646 */ + { 74, 7, 12, 0, 0, 74, 0, }, /* 647 */ + { 74, 12, 3, 0, 0, 74, 0, }, /* 648 */ + { 74, 10, 5, 0, 0, 74, 0, }, /* 649 */ + { 74, 21, 12, 0, 0, 74, 0, }, /* 650 */ + { 84, 12, 3, 0, 0, 84, 0, }, /* 651 */ + { 84, 10, 5, 0, 0, 84, 0, }, /* 652 */ + { 84, 7, 12, 0, 0, 84, 0, }, /* 653 */ + { 84, 21, 12, 0, 0, 84, 0, }, /* 654 */ + { 10, 6, 12, 0, 0, -22, 0, }, /* 655 */ + { 84, 13, 12, 0, 0, 84, 0, }, /* 656 */ + { 39, 6, 12, 0, 0, 39, 0, }, /* 657 */ + { 68, 7, 12, 0, 0, 68, 0, }, /* 658 */ + { 68, 12, 3, 0, 0, 68, 0, }, /* 659 */ + { 68, 10, 5, 0, 0, 68, 0, }, /* 660 */ + { 68, 13, 12, 0, 0, 68, 0, }, /* 661 */ + { 68, 21, 12, 0, 0, 68, 0, }, /* 662 */ + { 92, 7, 12, 0, 0, 92, 0, }, /* 663 */ + { 92, 12, 3, 0, 0, 92, 0, }, /* 664 */ + { 92, 6, 12, 0, 0, 92, 0, }, /* 665 */ + { 92, 21, 12, 0, 0, 92, 0, }, /* 666 */ + { 87, 7, 12, 0, 0, 87, 0, }, /* 667 */ + { 87, 10, 5, 0, 0, 87, 0, }, /* 668 */ + { 87, 12, 3, 0, 0, 87, 0, }, /* 669 */ + { 87, 21, 12, 0, 0, 87, 0, }, /* 670 */ + { 87, 6, 12, 0, 0, 87, 0, }, /* 671 */ + { 34, 5, 12, 0, -928, 34, 0, }, /* 672 */ + { 9, 5, 12, 0, -38864, 9, 0, }, /* 673 */ + { 87, 13, 12, 0, 0, 87, 0, }, /* 674 */ + { 24, 7, 9, 0, 0, 24, 0, }, /* 675 */ + { 24, 7, 10, 0, 0, 24, 0, }, /* 676 */ + { 0, 4, 12, 0, 0, 0, 0, }, /* 677 */ + { 0, 3, 12, 0, 0, 0, 0, }, /* 678 */ + { 26, 25, 12, 0, 0, 26, 0, }, /* 679 */ + { 10, 18, 12, 0, 0, -7, 0, }, /* 680 */ + { 10, 22, 12, 0, 0, -7, 0, }, /* 681 */ + { 1, 7, 12, 0, 0, -13, 0, }, /* 682 */ + { 1, 26, 12, 0, 0, -13, 0, }, /* 683 */ + { 10, 6, 3, 0, 0, -67, 0, }, /* 684 */ + { 36, 7, 12, 0, 0, 36, 0, }, /* 685 */ + { 10, 21, 12, 0, 0, -98, 0, }, /* 686 */ + { 10, 21, 12, 0, 0, -25, 0, }, /* 687 */ + { 10, 15, 12, 0, 0, -102, 0, }, /* 688 */ + { 10, 26, 12, 0, 0, -25, 0, }, /* 689 */ + { 20, 14, 12, 0, 0, 20, 0, }, /* 690 */ + { 20, 15, 12, 0, 0, 20, 0, }, /* 691 */ + { 20, 26, 12, 0, 0, 20, 0, }, /* 692 */ + { 71, 7, 12, 0, 0, 71, 0, }, /* 693 */ + { 67, 7, 12, 0, 0, 67, 0, }, /* 694 */ + { 28, 12, 3, 0, 0, -1, 0, }, /* 695 */ + { 10, 15, 12, 0, 0, -1, 0, }, /* 696 */ + { 42, 7, 12, 0, 0, 42, 0, }, /* 697 */ + { 42, 15, 12, 0, 0, 42, 0, }, /* 698 */ + { 19, 7, 12, 0, 0, 19, 0, }, /* 699 */ + { 19, 14, 12, 0, 0, 19, 0, }, /* 700 */ + { 118, 7, 12, 0, 0, 118, 0, }, /* 701 */ + { 118, 12, 3, 0, 0, 118, 0, }, /* 702 */ + { 60, 7, 12, 0, 0, 60, 0, }, /* 703 */ + { 60, 21, 12, 0, 0, 60, 0, }, /* 704 */ + { 43, 7, 12, 0, 0, 43, 0, }, /* 705 */ + { 43, 21, 12, 0, 0, 43, 0, }, /* 706 */ + { 43, 14, 12, 0, 0, 43, 0, }, /* 707 */ + { 14, 9, 12, 0, 40, 14, 0, }, /* 708 */ + { 14, 5, 12, 0, -40, 14, 0, }, /* 709 */ + { 47, 7, 12, 0, 0, 47, 0, }, /* 710 */ + { 45, 7, 12, 0, 0, 45, 0, }, /* 711 */ + { 45, 13, 12, 0, 0, 45, 0, }, /* 712 */ + { 136, 9, 12, 0, 40, 136, 0, }, /* 713 */ + { 136, 5, 12, 0, -40, 136, 0, }, /* 714 */ + { 106, 7, 12, 0, 0, 106, 0, }, /* 715 */ + { 104, 7, 12, 0, 0, 104, 0, }, /* 716 */ + { 104, 21, 12, 0, 0, 104, 0, }, /* 717 */ + { 161, 9, 12, 0, 39, 161, 0, }, /* 718 */ + { 161, 5, 12, 0, -39, 161, 0, }, /* 719 */ + { 110, 7, 12, 0, 0, 110, 0, }, /* 720 */ + { 12, 7, 12, 0, 0, 12, 0, }, /* 721 */ + { 81, 7, 12, 0, 0, 81, 0, }, /* 722 */ + { 81, 21, 12, 0, 0, 81, 0, }, /* 723 */ + { 81, 15, 12, 0, 0, 81, 0, }, /* 724 */ + { 120, 7, 12, 0, 0, 120, 0, }, /* 725 */ + { 120, 26, 12, 0, 0, 120, 0, }, /* 726 */ + { 120, 15, 12, 0, 0, 120, 0, }, /* 727 */ + { 116, 7, 12, 0, 0, 116, 0, }, /* 728 */ + { 116, 15, 12, 0, 0, 116, 0, }, /* 729 */ + { 128, 7, 12, 0, 0, 128, 0, }, /* 730 */ + { 128, 15, 12, 0, 0, 128, 0, }, /* 731 */ + { 66, 7, 12, 0, 0, 66, 0, }, /* 732 */ + { 66, 15, 12, 0, 0, 66, 0, }, /* 733 */ + { 66, 21, 12, 0, 0, 66, 0, }, /* 734 */ + { 72, 7, 12, 0, 0, 72, 0, }, /* 735 */ + { 72, 21, 12, 0, 0, 72, 0, }, /* 736 */ + { 98, 7, 12, 0, 0, 98, 0, }, /* 737 */ + { 97, 7, 12, 0, 0, 97, 0, }, /* 738 */ + { 97, 15, 12, 0, 0, 97, 0, }, /* 739 */ + { 31, 7, 12, 0, 0, 31, 0, }, /* 740 */ + { 31, 12, 3, 0, 0, 31, 0, }, /* 741 */ + { 31, 15, 12, 0, 0, 31, 0, }, /* 742 */ + { 31, 21, 12, 0, 0, 31, 0, }, /* 743 */ + { 88, 7, 12, 0, 0, 88, 0, }, /* 744 */ + { 88, 15, 12, 0, 0, 88, 0, }, /* 745 */ + { 88, 21, 12, 0, 0, 88, 0, }, /* 746 */ + { 117, 7, 12, 0, 0, 117, 0, }, /* 747 */ + { 117, 15, 12, 0, 0, 117, 0, }, /* 748 */ + { 112, 7, 12, 0, 0, 112, 0, }, /* 749 */ + { 112, 26, 12, 0, 0, 112, 0, }, /* 750 */ + { 112, 12, 3, 0, 0, 112, 0, }, /* 751 */ + { 112, 15, 12, 0, 0, 112, 0, }, /* 752 */ + { 112, 21, 12, 0, 0, 112, 0, }, /* 753 */ + { 112, 21, 12, 0, 0, -76, 0, }, /* 754 */ + { 78, 7, 12, 0, 0, 78, 0, }, /* 755 */ + { 78, 21, 12, 0, 0, 78, 0, }, /* 756 */ + { 83, 7, 12, 0, 0, 83, 0, }, /* 757 */ + { 83, 15, 12, 0, 0, 83, 0, }, /* 758 */ + { 82, 7, 12, 0, 0, 82, 0, }, /* 759 */ + { 82, 15, 12, 0, 0, 82, 0, }, /* 760 */ + { 121, 7, 12, 0, 0, 121, 0, }, /* 761 */ + { 121, 21, 12, 0, 0, 121, 0, }, /* 762 */ + { 121, 15, 12, 0, 0, 121, 0, }, /* 763 */ + { 89, 7, 12, 0, 0, 89, 0, }, /* 764 */ + { 130, 9, 12, 0, 64, 130, 0, }, /* 765 */ + { 130, 5, 12, 0, -64, 130, 0, }, /* 766 */ + { 130, 15, 12, 0, 0, 130, 0, }, /* 767 */ + { 144, 7, 12, 0, 0, 144, 0, }, /* 768 */ + { 144, 12, 3, 0, 0, 144, 0, }, /* 769 */ + { 144, 13, 12, 0, 0, 144, 0, }, /* 770 */ + { 1, 15, 12, 0, 0, 1, 0, }, /* 771 */ + { 156, 7, 12, 0, 0, 156, 0, }, /* 772 */ + { 156, 12, 3, 0, 0, 156, 0, }, /* 773 */ + { 156, 17, 12, 0, 0, 156, 0, }, /* 774 */ + { 147, 7, 12, 0, 0, 147, 0, }, /* 775 */ + { 147, 15, 12, 0, 0, 147, 0, }, /* 776 */ + { 148, 7, 12, 0, 0, 148, 0, }, /* 777 */ + { 148, 12, 3, 0, 0, 148, 0, }, /* 778 */ + { 148, 15, 12, 0, 0, 148, 0, }, /* 779 */ + { 148, 21, 12, 0, 0, 148, 0, }, /* 780 */ + { 158, 7, 12, 0, 0, 158, 0, }, /* 781 */ + { 158, 12, 3, 0, 0, 158, 0, }, /* 782 */ + { 158, 21, 12, 0, 0, 158, 0, }, /* 783 */ + { 153, 7, 12, 0, 0, 153, 0, }, /* 784 */ + { 153, 15, 12, 0, 0, 153, 0, }, /* 785 */ + { 149, 7, 12, 0, 0, 149, 0, }, /* 786 */ + { 94, 10, 5, 0, 0, 94, 0, }, /* 787 */ + { 94, 12, 3, 0, 0, 94, 0, }, /* 788 */ + { 94, 7, 12, 0, 0, 94, 0, }, /* 789 */ + { 94, 21, 12, 0, 0, 94, 0, }, /* 790 */ + { 94, 15, 12, 0, 0, 94, 0, }, /* 791 */ + { 94, 13, 12, 0, 0, 94, 0, }, /* 792 */ + { 85, 12, 3, 0, 0, 85, 0, }, /* 793 */ + { 85, 10, 5, 0, 0, 85, 0, }, /* 794 */ + { 85, 7, 12, 0, 0, 85, 0, }, /* 795 */ + { 85, 21, 12, 0, 0, 85, 0, }, /* 796 */ + { 85, 1, 4, 0, 0, 85, 0, }, /* 797 */ + { 101, 7, 12, 0, 0, 101, 0, }, /* 798 */ + { 101, 13, 12, 0, 0, 101, 0, }, /* 799 */ + { 96, 12, 3, 0, 0, 96, 0, }, /* 800 */ + { 96, 7, 12, 0, 0, 96, 0, }, /* 801 */ + { 96, 10, 5, 0, 0, 96, 0, }, /* 802 */ + { 96, 13, 12, 0, 0, 96, 0, }, /* 803 */ + { 96, 21, 12, 0, 0, 96, 0, }, /* 804 */ + { 111, 7, 12, 0, 0, 111, 0, }, /* 805 */ + { 111, 12, 3, 0, 0, 111, 0, }, /* 806 */ + { 111, 21, 12, 0, 0, 111, 0, }, /* 807 */ + { 100, 12, 3, 0, 0, 100, 0, }, /* 808 */ + { 100, 10, 5, 0, 0, 100, 0, }, /* 809 */ + { 100, 7, 12, 0, 0, 100, 0, }, /* 810 */ + { 100, 7, 4, 0, 0, 100, 0, }, /* 811 */ + { 100, 21, 12, 0, 0, 100, 0, }, /* 812 */ + { 100, 13, 12, 0, 0, 100, 0, }, /* 813 */ + { 48, 15, 12, 0, 0, 48, 0, }, /* 814 */ + { 108, 7, 12, 0, 0, 108, 0, }, /* 815 */ + { 108, 10, 5, 0, 0, 108, 0, }, /* 816 */ + { 108, 12, 3, 0, 0, 108, 0, }, /* 817 */ + { 108, 21, 12, 0, 0, 108, 0, }, /* 818 */ + { 129, 7, 12, 0, 0, 129, 0, }, /* 819 */ + { 129, 21, 12, 0, 0, 129, 0, }, /* 820 */ + { 109, 7, 12, 0, 0, 109, 0, }, /* 821 */ + { 109, 12, 3, 0, 0, 109, 0, }, /* 822 */ + { 109, 10, 5, 0, 0, 109, 0, }, /* 823 */ + { 109, 13, 12, 0, 0, 109, 0, }, /* 824 */ + { 107, 12, 3, 0, 0, 107, 0, }, /* 825 */ + { 107, 12, 3, 0, 0, -55, 0, }, /* 826 */ + { 107, 10, 5, 0, 0, 107, 0, }, /* 827 */ + { 107, 10, 5, 0, 0, -55, 0, }, /* 828 */ + { 107, 7, 12, 0, 0, 107, 0, }, /* 829 */ + { 28, 12, 3, 0, 0, -55, 0, }, /* 830 */ + { 107, 10, 3, 0, 0, 107, 0, }, /* 831 */ + { 135, 7, 12, 0, 0, 135, 0, }, /* 832 */ + { 135, 10, 5, 0, 0, 135, 0, }, /* 833 */ + { 135, 12, 3, 0, 0, 135, 0, }, /* 834 */ + { 135, 21, 12, 0, 0, 135, 0, }, /* 835 */ + { 135, 13, 12, 0, 0, 135, 0, }, /* 836 */ + { 124, 7, 12, 0, 0, 124, 0, }, /* 837 */ + { 124, 10, 3, 0, 0, 124, 0, }, /* 838 */ + { 124, 10, 5, 0, 0, 124, 0, }, /* 839 */ + { 124, 12, 3, 0, 0, 124, 0, }, /* 840 */ + { 124, 21, 12, 0, 0, 124, 0, }, /* 841 */ + { 124, 13, 12, 0, 0, 124, 0, }, /* 842 */ + { 123, 7, 12, 0, 0, 123, 0, }, /* 843 */ + { 123, 10, 3, 0, 0, 123, 0, }, /* 844 */ + { 123, 10, 5, 0, 0, 123, 0, }, /* 845 */ + { 123, 12, 3, 0, 0, 123, 0, }, /* 846 */ + { 123, 21, 12, 0, 0, 123, 0, }, /* 847 */ + { 114, 7, 12, 0, 0, 114, 0, }, /* 848 */ + { 114, 10, 5, 0, 0, 114, 0, }, /* 849 */ + { 114, 12, 3, 0, 0, 114, 0, }, /* 850 */ + { 114, 21, 12, 0, 0, 114, 0, }, /* 851 */ + { 114, 13, 12, 0, 0, 114, 0, }, /* 852 */ + { 102, 7, 12, 0, 0, 102, 0, }, /* 853 */ + { 102, 12, 3, 0, 0, 102, 0, }, /* 854 */ + { 102, 10, 5, 0, 0, 102, 0, }, /* 855 */ + { 102, 21, 12, 0, 0, 102, 0, }, /* 856 */ + { 102, 13, 12, 0, 0, 102, 0, }, /* 857 */ + { 126, 7, 12, 0, 0, 126, 0, }, /* 858 */ + { 126, 12, 3, 0, 0, 126, 0, }, /* 859 */ + { 126, 10, 12, 0, 0, 126, 0, }, /* 860 */ + { 126, 10, 5, 0, 0, 126, 0, }, /* 861 */ + { 126, 13, 12, 0, 0, 126, 0, }, /* 862 */ + { 126, 15, 12, 0, 0, 126, 0, }, /* 863 */ + { 126, 21, 12, 0, 0, 126, 0, }, /* 864 */ + { 126, 26, 12, 0, 0, 126, 0, }, /* 865 */ + { 142, 7, 12, 0, 0, 142, 0, }, /* 866 */ + { 142, 10, 5, 0, 0, 142, 0, }, /* 867 */ + { 142, 12, 3, 0, 0, 142, 0, }, /* 868 */ + { 142, 21, 12, 0, 0, 142, 0, }, /* 869 */ + { 125, 9, 12, 0, 32, 125, 0, }, /* 870 */ + { 125, 5, 12, 0, -32, 125, 0, }, /* 871 */ + { 125, 13, 12, 0, 0, 125, 0, }, /* 872 */ + { 125, 15, 12, 0, 0, 125, 0, }, /* 873 */ + { 125, 7, 12, 0, 0, 125, 0, }, /* 874 */ + { 154, 7, 12, 0, 0, 154, 0, }, /* 875 */ + { 154, 10, 3, 0, 0, 154, 0, }, /* 876 */ + { 154, 10, 5, 0, 0, 154, 0, }, /* 877 */ + { 154, 12, 3, 0, 0, 154, 0, }, /* 878 */ + { 154, 7, 4, 0, 0, 154, 0, }, /* 879 */ + { 154, 21, 12, 0, 0, 154, 0, }, /* 880 */ + { 154, 13, 12, 0, 0, 154, 0, }, /* 881 */ + { 150, 7, 12, 0, 0, 150, 0, }, /* 882 */ + { 150, 10, 5, 0, 0, 150, 0, }, /* 883 */ + { 150, 12, 3, 0, 0, 150, 0, }, /* 884 */ + { 150, 21, 12, 0, 0, 150, 0, }, /* 885 */ + { 141, 7, 12, 0, 0, 141, 0, }, /* 886 */ + { 141, 12, 3, 0, 0, 141, 0, }, /* 887 */ + { 141, 10, 5, 0, 0, 141, 0, }, /* 888 */ + { 141, 7, 4, 0, 0, 141, 0, }, /* 889 */ + { 141, 21, 12, 0, 0, 141, 0, }, /* 890 */ + { 140, 7, 12, 0, 0, 140, 0, }, /* 891 */ + { 140, 12, 3, 0, 0, 140, 0, }, /* 892 */ + { 140, 10, 5, 0, 0, 140, 0, }, /* 893 */ + { 140, 7, 4, 0, 0, 140, 0, }, /* 894 */ + { 140, 21, 12, 0, 0, 140, 0, }, /* 895 */ + { 122, 7, 12, 0, 0, 122, 0, }, /* 896 */ + { 133, 7, 12, 0, 0, 133, 0, }, /* 897 */ + { 133, 10, 5, 0, 0, 133, 0, }, /* 898 */ + { 133, 12, 3, 0, 0, 133, 0, }, /* 899 */ + { 133, 21, 12, 0, 0, 133, 0, }, /* 900 */ + { 133, 13, 12, 0, 0, 133, 0, }, /* 901 */ + { 133, 15, 12, 0, 0, 133, 0, }, /* 902 */ + { 134, 21, 12, 0, 0, 134, 0, }, /* 903 */ + { 134, 7, 12, 0, 0, 134, 0, }, /* 904 */ + { 134, 12, 3, 0, 0, 134, 0, }, /* 905 */ + { 134, 10, 5, 0, 0, 134, 0, }, /* 906 */ + { 138, 7, 12, 0, 0, 138, 0, }, /* 907 */ + { 138, 12, 3, 0, 0, 138, 0, }, /* 908 */ + { 138, 7, 4, 0, 0, 138, 0, }, /* 909 */ + { 138, 13, 12, 0, 0, 138, 0, }, /* 910 */ + { 143, 7, 12, 0, 0, 143, 0, }, /* 911 */ + { 143, 10, 5, 0, 0, 143, 0, }, /* 912 */ + { 143, 12, 3, 0, 0, 143, 0, }, /* 913 */ + { 143, 13, 12, 0, 0, 143, 0, }, /* 914 */ + { 145, 7, 12, 0, 0, 145, 0, }, /* 915 */ + { 145, 12, 3, 0, 0, 145, 0, }, /* 916 */ + { 145, 10, 5, 0, 0, 145, 0, }, /* 917 */ + { 145, 21, 12, 0, 0, 145, 0, }, /* 918 */ + { 54, 15, 12, 0, 0, 54, 0, }, /* 919 */ + { 54, 21, 12, 0, 0, 54, 0, }, /* 920 */ + { 63, 7, 12, 0, 0, 63, 0, }, /* 921 */ + { 63, 14, 12, 0, 0, 63, 0, }, /* 922 */ + { 63, 21, 12, 0, 0, 63, 0, }, /* 923 */ + { 157, 7, 12, 0, 0, 157, 0, }, /* 924 */ + { 157, 21, 12, 0, 0, 157, 0, }, /* 925 */ + { 80, 7, 12, 0, 0, 80, 0, }, /* 926 */ + { 80, 1, 2, 0, 0, 80, 0, }, /* 927 */ + { 127, 7, 12, 0, 0, 127, 0, }, /* 928 */ + { 115, 7, 12, 0, 0, 115, 0, }, /* 929 */ + { 115, 13, 12, 0, 0, 115, 0, }, /* 930 */ + { 115, 21, 12, 0, 0, 115, 0, }, /* 931 */ + { 159, 7, 12, 0, 0, 159, 0, }, /* 932 */ + { 159, 13, 12, 0, 0, 159, 0, }, /* 933 */ + { 103, 7, 12, 0, 0, 103, 0, }, /* 934 */ + { 103, 12, 3, 0, 0, 103, 0, }, /* 935 */ + { 103, 21, 12, 0, 0, 103, 0, }, /* 936 */ + { 119, 7, 12, 0, 0, 119, 0, }, /* 937 */ + { 119, 12, 3, 0, 0, 119, 0, }, /* 938 */ + { 119, 21, 12, 0, 0, 119, 0, }, /* 939 */ + { 119, 26, 12, 0, 0, 119, 0, }, /* 940 */ + { 119, 6, 12, 0, 0, 119, 0, }, /* 941 */ + { 119, 13, 12, 0, 0, 119, 0, }, /* 942 */ + { 119, 15, 12, 0, 0, 119, 0, }, /* 943 */ + { 146, 9, 12, 0, 32, 146, 0, }, /* 944 */ + { 146, 5, 12, 0, -32, 146, 0, }, /* 945 */ + { 146, 15, 12, 0, 0, 146, 0, }, /* 946 */ + { 146, 21, 12, 0, 0, 146, 0, }, /* 947 */ + { 99, 7, 12, 0, 0, 99, 0, }, /* 948 */ + { 99, 12, 3, 0, 0, 99, 0, }, /* 949 */ + { 99, 10, 5, 0, 0, 99, 0, }, /* 950 */ + { 99, 6, 12, 0, 0, 99, 0, }, /* 951 */ + { 137, 6, 12, 0, 0, 137, 0, }, /* 952 */ + { 139, 6, 12, 0, 0, 139, 0, }, /* 953 */ + { 23, 21, 12, 0, 0, 23, 0, }, /* 954 */ + { 155, 12, 3, 0, 0, 155, 0, }, /* 955 */ + { 23, 10, 5, 0, 0, 23, 0, }, /* 956 */ + { 137, 7, 12, 0, 0, 137, 0, }, /* 957 */ + { 155, 7, 12, 0, 0, 155, 0, }, /* 958 */ + { 139, 7, 12, 0, 0, 139, 0, }, /* 959 */ + { 105, 7, 12, 0, 0, 105, 0, }, /* 960 */ + { 105, 26, 12, 0, 0, 105, 0, }, /* 961 */ + { 105, 12, 3, 0, 0, 105, 0, }, /* 962 */ + { 105, 21, 12, 0, 0, 105, 0, }, /* 963 */ + { 10, 1, 2, 0, 0, 105, 0, }, /* 964 */ + { 10, 10, 3, 0, 0, 10, 0, }, /* 965 */ + { 10, 10, 5, 0, 0, 10, 0, }, /* 966 */ + { 20, 12, 3, 0, 0, 20, 0, }, /* 967 */ + { 131, 26, 12, 0, 0, 131, 0, }, /* 968 */ + { 131, 12, 3, 0, 0, 131, 0, }, /* 969 */ + { 131, 21, 12, 0, 0, 131, 0, }, /* 970 */ + { 18, 12, 3, 0, 0, 18, 0, }, /* 971 */ + { 151, 7, 12, 0, 0, 151, 0, }, /* 972 */ + { 151, 12, 3, 0, 0, 151, 0, }, /* 973 */ + { 151, 6, 12, 0, 0, 151, 0, }, /* 974 */ + { 151, 13, 12, 0, 0, 151, 0, }, /* 975 */ + { 151, 26, 12, 0, 0, 151, 0, }, /* 976 */ + { 160, 7, 12, 0, 0, 160, 0, }, /* 977 */ + { 160, 12, 3, 0, 0, 160, 0, }, /* 978 */ + { 152, 7, 12, 0, 0, 152, 0, }, /* 979 */ + { 152, 12, 3, 0, 0, 152, 0, }, /* 980 */ + { 152, 13, 12, 0, 0, 152, 0, }, /* 981 */ + { 152, 23, 12, 0, 0, 152, 0, }, /* 982 */ + { 113, 7, 12, 0, 0, 113, 0, }, /* 983 */ + { 113, 15, 12, 0, 0, 113, 0, }, /* 984 */ + { 113, 12, 3, 0, 0, 113, 0, }, /* 985 */ + { 132, 9, 12, 0, 34, 132, 0, }, /* 986 */ + { 132, 5, 12, 0, -34, 132, 0, }, /* 987 */ + { 132, 12, 3, 0, 0, 132, 0, }, /* 988 */ + { 132, 6, 12, 0, 0, 132, 0, }, /* 989 */ + { 132, 13, 12, 0, 0, 132, 0, }, /* 990 */ + { 132, 21, 12, 0, 0, 132, 0, }, /* 991 */ + { 0, 2, 14, 0, 0, 0, 0, }, /* 992 */ + { 10, 26, 11, 0, 0, 10, 0, }, /* 993 */ + { 27, 26, 12, 0, 0, 27, 0, }, /* 994 */ + { 10, 24, 3, 0, 0, 10, 0, }, /* 995 */ + { 10, 1, 3, 0, 0, 10, 0, }, /* 996 */ }; const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ @@ -1190,51 +1216,51 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+9000 */ - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,100, /* U+9800 */ -101,102,102,102,102,102,102,102,102,103,104,104,105,106,107,108, /* U+A000 */ -109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,117, /* U+A800 */ -118,119,120,121,122,123,117,118,119,120,121,122,123,117,118,119, /* U+B000 */ -120,121,122,123,117,118,119,120,121,122,123,117,118,119,120,121, /* U+B800 */ -122,123,117,118,119,120,121,122,123,117,118,119,120,121,122,123, /* U+C000 */ -117,118,119,120,121,122,123,117,118,119,120,121,122,123,117,118, /* U+C800 */ -119,120,121,122,123,117,118,119,120,121,122,123,117,118,119,124, /* U+D000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+D800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+E000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+E800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F000 */ -126,126, 98, 98,127,128,129,130,131,131,132,133,134,135,136,137, /* U+F800 */ -138,139,140,141,142,143,144,145,146,147,148,142,149,149,150,142, /* U+10000 */ -151,152,153,154,155,156,157,158,159,160,161,142,162,163,164,165, /* U+10800 */ -166,167,168,169,170,171,172,142,173,174,142,175,176,177,178,142, /* U+11000 */ -179,180,181,182,183,184,142,142,185,186,187,188,142,189,142,190, /* U+11800 */ -191,191,191,191,191,191,191,192,193,191,194,142,142,142,142,142, /* U+12000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+12800 */ -195,195,195,195,195,195,195,195,196,142,142,142,142,142,142,142, /* U+13000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+13800 */ -142,142,142,142,142,142,142,142,197,197,197,197,198,142,142,142, /* U+14000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+14800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+16000 */ -199,199,199,199,200,201,202,203,142,142,142,142,204,205,206,207, /* U+16800 */ -208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208, /* U+17000 */ -208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208, /* U+17800 */ -208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,209, /* U+18000 */ -208,208,208,208,208,208,210,210,210,211,212,142,142,142,142,142, /* U+18800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A800 */ -213,214,215,216,216,217,142,142,142,142,142,142,142,142,142,142, /* U+1B000 */ -142,142,142,142,142,142,142,142,218,219,142,142,142,142,142,142, /* U+1B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C800 */ - 71,220,221,222,223,224,225,142,226,227,228,229,230,231,232,233, /* U+1D000 */ -234,234,234,234,235,236,142,142,142,142,142,142,142,142,142,142, /* U+1D800 */ -237,142,238,142,142,239,142,142,142,142,142,142,142,142,142,142, /* U+1E000 */ -240,241,242,142,142,142,142,142,243,244,245,142,246,247,142,142, /* U+1E800 */ -248,249,250,251,252,253,254,255,254,254,256,254,257,258,259,260, /* U+1F000 */ -261,262,263,264,265,266, 71,267,253,253,253,253,253,253,253,268, /* U+1F800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+9800 */ +100,101,101,101,101,101,101,101,101,102,103,103,104,105,106,107, /* U+A000 */ +108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,116, /* U+A800 */ +117,118,119,120,121,122,116,117,118,119,120,121,122,116,117,118, /* U+B000 */ +119,120,121,122,116,117,118,119,120,121,122,116,117,118,119,120, /* U+B800 */ +121,122,116,117,118,119,120,121,122,116,117,118,119,120,121,122, /* U+C000 */ +116,117,118,119,120,121,122,116,117,118,119,120,121,122,116,117, /* U+C800 */ +118,119,120,121,122,116,117,118,119,120,121,122,116,117,118,123, /* U+D000 */ +124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124, /* U+D800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+E000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+E800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F000 */ +125,125, 98, 98,126,127,128,129,130,130,131,132,133,134,135,136, /* U+F800 */ +137,138,139,140,141,142,143,144,145,146,147,148,149,149,150,151, /* U+10000 */ +152,153,154,155,156,157,158,159,160,161,162,141,163,164,165,166, /* U+10800 */ +167,168,169,170,171,172,173,141,174,175,141,176,177,178,179,141, /* U+11000 */ +180,181,182,183,184,185,141,141,186,187,188,189,141,190,141,191, /* U+11800 */ +192,192,192,192,192,192,192,193,194,192,195,141,141,141,141,141, /* U+12000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,196, /* U+12800 */ +197,197,197,197,197,197,197,197,198,141,141,141,141,141,141,141, /* U+13000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+13800 */ +141,141,141,141,141,141,141,141,199,199,199,199,200,141,141,141, /* U+14000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+14800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+15000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+15800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+16000 */ +201,201,201,201,202,203,204,205,141,141,141,141,206,207,208,209, /* U+16800 */ +210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210, /* U+17000 */ +210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210, /* U+17800 */ +210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,211, /* U+18000 */ +210,210,210,210,210,210,212,212,212,213,214,141,141,141,141,141, /* U+18800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+19000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+19800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,215, /* U+1A800 */ +216,217,218,219,219,220,141,141,141,141,141,141,141,141,141,141, /* U+1B000 */ +141,141,141,141,141,141,141,141,221,222,141,141,141,141,141,141, /* U+1B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,223,224, /* U+1C800 */ + 71,225,226,227,228,229,230,141,231,232,233,234,235,236,237,238, /* U+1D000 */ +239,239,239,239,240,241,141,141,141,141,141,141,141,141,242,141, /* U+1D800 */ +243,141,244,141,141,245,141,141,141,141,141,141,141,141,141,246, /* U+1E000 */ +247,248,249,141,141,141,141,141,250,251,252,141,253,254,141,141, /* U+1E800 */ +255,256,257,258,259,260,261,262,261,261,263,261,264,265,266,267, /* U+1F000 */ +268,269,270,261,271,272, 71,273,260,260,260,260,260,260,260,274, /* U+1F800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21000 */ @@ -1255,469 +1281,469 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29800 */ - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,269, 98, 98, /* U+2A000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,275, 98, 98, /* U+2A000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2A800 */ - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,270, 98, /* U+2B000 */ -271, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,276, 98, /* U+2B000 */ +277, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2C000 */ - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,272, 98, 98, /* U+2C800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,278, 98, 98, /* U+2C800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2E000 */ - 98, 98, 98, 98, 98, 98, 98,273,142,142,142,142,142,142,142,142, /* U+2E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+2F000 */ - 98, 98, 98, 98,274,142,142,142,142,142,142,142,142,142,142,142, /* U+2F800 */ + 98, 98, 98, 98, 98, 98, 98,279,141,141,141,141,141,141,141,141, /* U+2E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+2F000 */ + 98, 98, 98, 98,280,141,141,141,141,141,141,141,141,141,141,141, /* U+2F800 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30000 */ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30800 */ - 98, 98, 98, 98, 98, 98,275,142,142,142,142,142,142,142,142,142, /* U+31000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+31800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+33000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+33800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+34000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+34800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+35000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+35800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+36000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+36800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+37000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+37800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+38000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+38800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+39000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+39800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+40000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+40800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+41000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+41800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+42000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+42800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+43000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+43800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+44000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+44800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+45000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+45800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+46000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+46800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+47000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+47800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+48000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+48800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+49000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+49800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+50000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+50800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+51000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+51800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+52000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+52800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+53000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+53800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+54000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+54800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+55000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+55800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+56000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+56800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+57000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+57800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+58000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+58800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+59000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+59800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+60000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+60800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+61000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+61800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+62000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+62800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+63000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+63800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+64000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+64800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+65000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+65800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+66000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+66800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+67000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+67800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+68000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+68800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+69000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+69800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+70000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+70800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+71000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+71800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+72000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+72800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+73000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+73800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+74000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+74800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+75000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+75800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+76000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+76800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+77000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+77800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+78000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+78800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+79000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+79800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+80000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+80800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+81000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+81800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+82000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+82800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+83000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+83800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+84000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+84800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+85000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+85800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+86000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+86800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+87000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+87800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+88000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+88800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+89000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+89800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+90000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+90800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+91000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+91800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+92000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+92800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+93000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+93800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+94000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+94800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+95000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+95800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+96000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+96800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+97000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+97800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+98000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+98800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+99000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+99800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9A000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9A800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9B000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9B800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9C000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9C800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9D000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9D800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9E000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9E800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9F000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9F800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A0000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AD000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AD800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AF800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B0000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BD000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BD800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BF800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C0000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CD000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CD800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CF800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D0000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DD000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DD800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF800 */ -276,277,278,279,277,277,277,277,277,277,277,277,277,277,277,277, /* U+E0000 */ -277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277, /* U+E0800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E3000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E3800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E4000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E4800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E5000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E5800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E6000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E6800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E7000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E7800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E8000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E8800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E9000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E9800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EA000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EA800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EB000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EB800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EC000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EC800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+ED000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+ED800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EE000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EE800 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EF000 */ -142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EF800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F0000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F0800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F1000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F1800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F2000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F2800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F3000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F3800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F4000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F4800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F5000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F5800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F6000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F6800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F7000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F7800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F8000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F8800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F9000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F9800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FA000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FA800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FB000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FB800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FC000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FC800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FD000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FD800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FF000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,280, /* U+FF800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+102000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+102800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+103000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+103800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+104000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+104800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+105000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+105800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+106000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+106800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+107000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+107800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+108000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+108800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+109000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+109800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10A000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10A800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10B000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10B800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10C000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10C800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10D000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10D800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E800 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10F000 */ -126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,280, /* U+10F800 */ + 98, 98, 98, 98, 98, 98,281,141,141,141,141,141,141,141,141,141, /* U+31000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+31800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+32000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+32800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+33000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+33800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+34000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+34800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+35000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+35800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+36000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+36800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+37000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+37800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+38000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+38800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+39000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+39800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+40000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+40800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+41000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+41800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+42000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+42800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+43000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+43800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+44000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+44800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+45000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+45800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+46000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+46800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+47000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+47800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+48000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+48800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+49000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+49800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+50000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+50800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+51000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+51800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+52000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+52800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+53000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+53800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+54000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+54800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+55000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+55800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+56000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+56800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+57000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+57800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+58000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+58800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+59000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+59800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+60000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+60800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+61000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+61800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+62000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+62800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+63000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+63800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+64000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+64800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+65000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+65800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+66000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+66800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+67000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+67800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+68000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+68800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+69000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+69800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+70000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+70800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+71000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+71800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+72000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+72800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+73000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+73800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+74000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+74800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+75000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+75800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+76000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+76800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+77000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+77800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+78000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+78800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+79000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+79800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+80000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+80800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+81000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+81800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+82000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+82800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+83000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+83800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+84000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+84800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+85000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+85800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+86000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+86800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+87000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+87800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+88000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+88800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+89000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+89800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+90000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+90800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+91000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+91800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+92000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+92800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+93000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+93800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+94000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+94800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+95000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+95800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+96000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+96800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+97000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+97800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+98000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+98800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+99000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+99800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9A000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9A800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9B000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9B800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9C000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9C800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9D000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9D800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9E000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9E800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9F000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9F800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A0000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AD000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AD800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AF800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B0000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BD000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BD800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BF800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C0000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CD000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CD800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CF800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D0000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DD000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DD800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DF800 */ +282,283,284,285,283,283,283,283,283,283,283,283,283,283,283,283, /* U+E0000 */ +283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283, /* U+E0800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E1000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E1800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E2000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E2800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E3000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E3800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E4000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E4800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E5000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E5800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E6000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E6800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E7000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E7800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E8000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E8800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E9000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E9800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EA000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EA800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EB000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EB800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EC000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EC800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+ED000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+ED800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EE000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EE800 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EF000 */ +141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EF800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F0000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F0800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F1000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F1800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F2000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F2800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F3000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F3800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F4000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F4800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F5000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F5800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F6000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F6800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F7000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F7800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F8000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F8800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F9000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F9800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FA000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FA800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FB000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FB800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FC000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FC800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FD000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FD800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FE000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FE800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FF000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,286, /* U+FF800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+100000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+100800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+101000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+101800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+102000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+102800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+103000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+103800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+104000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+104800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+105000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+105800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+106000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+106800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+107000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+107800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+108000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+108800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+109000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+109800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10A000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10A800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10B000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10B800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10C000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10C800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10D000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10D800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10E000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10E800 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10F000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,286, /* U+10F800 */ }; -const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ +const uint16_t PRIV(ucd_stage2)[] = { /* 73472 bytes, block = 128 */ /* block 0 */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1840,463 +1866,463 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ /* block 12 */ 215,215,215,215,215,216,217,217,217,218,218,219,220,218,221,221, -222,222,222,222,222,222,222,222,222,222,222,220,223,120,218,220, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -225,224,224,224,224,224,224,224,224,224,224,226,226,226,226,226, -226,226,226,226,226,226,222,222,222,222,222,222,222,222,222,222, -227,227,227,227,227,227,227,227,227,227,218,218,218,218,224,224, -226,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +222,222,222,222,222,222,222,222,222,222,222,220,223,218,218,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +226,225,225,225,225,225,225,225,225,225,225,227,227,227,227,227, +227,227,227,227,227,227,222,222,222,222,222,222,222,222,222,222, +228,228,228,228,228,228,228,228,228,228,218,218,218,218,225,225, +227,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 13 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,228,224,222,222,222,222,222,222,222,216,221,222, -222,222,222,222,222,229,229,222,222,221,222,222,222,222,224,224, -230,230,230,230,230,230,230,230,230,230,224,224,224,221,221,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,229,225,222,222,222,222,222,222,222,216,221,222, +222,222,222,222,222,230,230,222,222,221,222,222,222,222,225,225, +231,231,231,231,231,231,231,231,231,231,225,225,225,221,221,225, /* block 14 */ -231,231,231,231,231,231,231,231,231,231,231,231,231,231,120,232, -233,234,233,233,233,233,233,233,233,233,233,233,233,233,233,233, -233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233, +232,232,232,232,232,232,232,232,232,232,232,232,232,232,120,233, +234,235,234,234,234,234,234,234,234,234,234,234,234,234,234,234, 234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234, -234,234,234,234,234,234,234,234,234,234,234,120,120,233,233,233, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, +235,235,235,235,235,235,235,235,235,235,235,120,120,234,234,234, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 15 */ -235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, -235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, -235,235,235,235,235,235,236,236,236,236,236,236,236,236,236,236, -236,235,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -237,237,237,237,237,237,237,237,237,237,238,238,238,238,238,238, -238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238, -238,238,238,238,238,238,238,238,238,238,238,239,239,239,239,239, -239,239,239,239,240,240,241,242,242,242,240,120,120,239,243,243, +236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236, +236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236, +236,236,236,236,236,236,237,237,237,237,237,237,237,237,237,237, +237,236,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +238,238,238,238,238,238,238,238,238,238,239,239,239,239,239,239, +239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239, +239,239,239,239,239,239,239,239,239,239,239,240,240,240,240,240, +240,240,240,240,241,241,242,243,243,243,241,120,120,240,244,244, /* block 16 */ -244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244, -244,244,244,244,244,244,245,245,245,245,246,245,245,245,245,245, -245,245,245,245,246,245,245,245,246,245,245,245,245,245,120,120, -247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,120, -248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248, -248,248,248,248,248,248,248,248,248,249,249,249,120,120,250,120, -233,233,233,233,233,233,233,233,233,233,233,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245, +245,245,245,245,245,245,246,246,246,246,247,246,246,246,246,246, +246,246,246,246,247,246,246,246,247,246,246,246,246,246,120,120, +248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,120, +249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249, +249,249,249,249,249,249,249,249,249,250,250,250,120,120,251,120, +234,234,234,234,234,234,234,234,234,234,234,120,120,120,120,120, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 17 */ -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,120,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,120,120,120,120,120,120,120,120, -120,120,120,222,222,222,222,222,222,222,222,222,222,222,222,222, +225,225,225,225,225,225,225,225,252,225,225,225,225,225,225,120, +215,215,120,120,120,120,120,120,222,222,222,222,222,222,222,222, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,230,222,222,222,222,222,222, +222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222, 222,222,216,222,222,222,222,222,222,222,222,222,222,222,222,222, 222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222, /* block 18 */ -251,251,251,252,253,253,253,253,253,253,253,253,253,253,253,253, -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, -253,253,253,253,253,253,253,253,253,253,251,252,251,253,252,252, -252,251,251,251,251,251,251,251,251,252,252,252,252,251,252,252, -253,254,255,113,113,251,251,251,253,253,253,253,253,253,253,253, -253,253,251,251,256,257,258,258,258,258,258,258,258,258,258,258, -259,260,253,253,253,253,253,253,253,253,253,253,253,253,253,253, +253,253,253,254,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,253,254,253,255,254,254, +254,253,253,253,253,253,253,253,253,254,254,254,254,253,254,254, +255,256,257,113,113,253,253,253,255,255,255,255,255,255,255,255, +255,255,253,253,258,259,260,260,260,260,260,260,260,260,260,260, +261,262,255,255,255,255,255,255,255,255,255,255,255,255,255,255, /* block 19 */ -261,262,263,263,120,261,261,261,261,261,261,261,261,120,120,261, -261,120,120,261,261,261,261,261,261,261,261,261,261,261,261,261, -261,261,261,261,261,261,261,261,261,120,261,261,261,261,261,261, -261,120,261,120,120,120,261,261,261,261,120,120,262,261,264,263, -263,262,262,262,262,120,120,263,263,120,120,263,263,262,261,120, -120,120,120,120,120,120,120,264,120,120,120,120,261,261,120,261, -261,261,262,262,120,120,265,265,265,265,265,265,265,265,265,265, -261,261,266,266,267,267,267,267,267,267,268,266,261,269,262,120, +263,264,265,265,120,263,263,263,263,263,263,263,263,120,120,263, +263,120,120,263,263,263,263,263,263,263,263,263,263,263,263,263, +263,263,263,263,263,263,263,263,263,120,263,263,263,263,263,263, +263,120,263,120,120,120,263,263,263,263,120,120,264,263,266,265, +265,264,264,264,264,120,120,265,265,120,120,265,265,264,263,120, +120,120,120,120,120,120,120,266,120,120,120,120,263,263,120,263, +263,263,264,264,120,120,267,267,267,267,267,267,267,267,267,267, +263,263,268,268,269,269,269,269,269,269,270,268,263,271,264,120, /* block 20 */ -120,270,270,271,120,272,272,272,272,272,272,120,120,120,120,272, -272,120,120,272,272,272,272,272,272,272,272,272,272,272,272,272, -272,272,272,272,272,272,272,272,272,120,272,272,272,272,272,272, -272,120,272,272,120,272,272,120,272,272,120,120,270,120,271,271, -271,270,270,120,120,120,120,270,270,120,120,270,270,270,120,120, -120,270,120,120,120,120,120,120,120,272,272,272,272,120,272,120, -120,120,120,120,120,120,273,273,273,273,273,273,273,273,273,273, -270,270,272,272,272,270,274,120,120,120,120,120,120,120,120,120, +120,272,272,273,120,274,274,274,274,274,274,120,120,120,120,274, +274,120,120,274,274,274,274,274,274,274,274,274,274,274,274,274, +274,274,274,274,274,274,274,274,274,120,274,274,274,274,274,274, +274,120,274,274,120,274,274,120,274,274,120,120,272,120,273,273, +273,272,272,120,120,120,120,272,272,120,120,272,272,272,120,120, +120,272,120,120,120,120,120,120,120,274,274,274,274,120,274,120, +120,120,120,120,120,120,275,275,275,275,275,275,275,275,275,275, +272,272,274,274,274,272,276,120,120,120,120,120,120,120,120,120, /* block 21 */ -120,275,275,276,120,277,277,277,277,277,277,277,277,277,120,277, -277,277,120,277,277,277,277,277,277,277,277,277,277,277,277,277, -277,277,277,277,277,277,277,277,277,120,277,277,277,277,277,277, -277,120,277,277,120,277,277,277,277,277,120,120,275,277,276,276, -276,275,275,275,275,275,120,275,275,276,120,276,276,275,120,120, -277,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -277,277,275,275,120,120,278,278,278,278,278,278,278,278,278,278, -279,280,120,120,120,120,120,120,120,277,275,275,275,275,275,275, +120,277,277,278,120,279,279,279,279,279,279,279,279,279,120,279, +279,279,120,279,279,279,279,279,279,279,279,279,279,279,279,279, +279,279,279,279,279,279,279,279,279,120,279,279,279,279,279,279, +279,120,279,279,120,279,279,279,279,279,120,120,277,279,278,278, +278,277,277,277,277,277,120,277,277,278,120,278,278,277,120,120, +279,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +279,279,277,277,120,120,280,280,280,280,280,280,280,280,280,280, +281,282,120,120,120,120,120,120,120,279,277,277,277,277,277,277, /* block 22 */ -120,281,282,282,120,283,283,283,283,283,283,283,283,120,120,283, -283,120,120,283,283,283,283,283,283,283,283,283,283,283,283,283, -283,283,283,283,283,283,283,283,283,120,283,283,283,283,283,283, -283,120,283,283,120,283,283,283,283,283,120,120,281,283,284,281, -282,281,281,281,281,120,120,282,282,120,120,282,282,281,120,120, -120,120,120,120,120,281,281,284,120,120,120,120,283,283,120,283, -283,283,281,281,120,120,285,285,285,285,285,285,285,285,285,285, -286,283,287,287,287,287,287,287,120,120,120,120,120,120,120,120, +120,283,284,284,120,285,285,285,285,285,285,285,285,120,120,285, +285,120,120,285,285,285,285,285,285,285,285,285,285,285,285,285, +285,285,285,285,285,285,285,285,285,120,285,285,285,285,285,285, +285,120,285,285,120,285,285,285,285,285,120,120,283,285,286,283, +284,283,283,283,283,120,120,284,284,120,120,284,284,283,120,120, +120,120,120,120,120,283,283,286,120,120,120,120,285,285,120,285, +285,285,283,283,120,120,287,287,287,287,287,287,287,287,287,287, +288,285,289,289,289,289,289,289,120,120,120,120,120,120,120,120, /* block 23 */ -120,120,288,289,120,289,289,289,289,289,289,120,120,120,289,289, -289,120,289,289,289,289,120,120,120,289,289,120,289,120,289,289, -120,120,120,289,289,120,120,120,289,289,289,120,120,120,289,289, -289,289,289,289,289,289,289,289,289,289,120,120,120,120,290,291, -288,291,291,120,120,120,291,291,291,120,291,291,291,288,120,120, -289,120,120,120,120,120,120,290,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,292,292,292,292,292,292,292,292,292,292, -293,293,293,294,295,295,295,295,295,296,295,120,120,120,120,120, +120,120,290,291,120,291,291,291,291,291,291,120,120,120,291,291, +291,120,291,291,291,291,120,120,120,291,291,120,291,120,291,291, +120,120,120,291,291,120,120,120,291,291,291,120,120,120,291,291, +291,291,291,291,291,291,291,291,291,291,120,120,120,120,292,293, +290,293,293,120,120,120,293,293,293,120,293,293,293,290,120,120, +291,120,120,120,120,120,120,292,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,294,294,294,294,294,294,294,294,294,294, +295,295,295,296,297,297,297,297,297,298,297,120,120,120,120,120, /* block 24 */ -297,298,298,298,297,299,299,299,299,299,299,299,299,120,299,299, -299,120,299,299,299,299,299,299,299,299,299,299,299,299,299,299, -299,299,299,299,299,299,299,299,299,120,299,299,299,299,299,299, -299,299,299,299,299,299,299,299,299,299,120,120,120,299,297,297, -297,298,298,298,298,120,297,297,297,120,297,297,297,297,120,120, -120,120,120,120,120,297,297,120,299,299,299,120,120,120,120,120, -299,299,297,297,120,120,300,300,300,300,300,300,300,300,300,300, -120,120,120,120,120,120,120,301,302,302,302,302,302,302,302,303, +299,300,300,300,299,301,301,301,301,301,301,301,301,120,301,301, +301,120,301,301,301,301,301,301,301,301,301,301,301,301,301,301, +301,301,301,301,301,301,301,301,301,120,301,301,301,301,301,301, +301,301,301,301,301,301,301,301,301,301,120,120,299,301,299,299, +299,300,300,300,300,120,299,299,299,120,299,299,299,299,120,120, +120,120,120,120,120,299,299,120,301,301,301,120,120,301,120,120, +301,301,299,299,120,120,302,302,302,302,302,302,302,302,302,302, +120,120,120,120,120,120,120,303,304,304,304,304,304,304,304,305, /* block 25 */ -304,305,306,306,307,304,304,304,304,304,304,304,304,120,304,304, -304,120,304,304,304,304,304,304,304,304,304,304,304,304,304,304, -304,304,304,304,304,304,304,304,304,120,304,304,304,304,304,304, -304,304,304,304,120,304,304,304,304,304,120,120,305,304,306,305, -306,306,308,306,306,120,305,306,306,120,306,306,305,305,120,120, -120,120,120,120,120,308,308,120,120,120,120,120,120,120,304,120, -304,304,305,305,120,120,309,309,309,309,309,309,309,309,309,309, -120,304,304,120,120,120,120,120,120,120,120,120,120,120,120,120, +306,307,308,308,309,306,306,306,306,306,306,306,306,120,306,306, +306,120,306,306,306,306,306,306,306,306,306,306,306,306,306,306, +306,306,306,306,306,306,306,306,306,120,306,306,306,306,306,306, +306,306,306,306,120,306,306,306,306,306,120,120,307,306,308,307, +308,308,310,308,308,120,307,308,308,120,308,308,307,307,120,120, +120,120,120,120,120,310,310,120,120,120,120,120,120,306,306,120, +306,306,307,307,120,120,311,311,311,311,311,311,311,311,311,311, +120,306,306,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 26 */ -310,310,311,311,312,312,312,312,312,312,312,312,312,120,312,312, -312,120,312,312,312,312,312,312,312,312,312,312,312,312,312,312, -312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312, -312,312,312,312,312,312,312,312,312,312,312,310,310,312,313,311, -311,310,310,310,310,120,311,311,311,120,311,311,311,310,314,315, -120,120,120,120,312,312,312,313,316,316,316,316,316,316,316,312, -312,312,310,310,120,120,317,317,317,317,317,317,317,317,317,317, -316,316,316,316,316,316,316,316,316,315,312,312,312,312,312,312, +312,312,313,313,314,314,314,314,314,314,314,314,314,120,314,314, +314,120,314,314,314,314,314,314,314,314,314,314,314,314,314,314, +314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314, +314,314,314,314,314,314,314,314,314,314,314,312,312,314,315,313, +313,312,312,312,312,120,313,313,313,120,313,313,313,312,316,317, +120,120,120,120,314,314,314,315,318,318,318,318,318,318,318,314, +314,314,312,312,120,120,319,319,319,319,319,319,319,319,319,319, +318,318,318,318,318,318,318,318,318,317,314,314,314,314,314,314, /* block 27 */ -120,318,319,319,120,320,320,320,320,320,320,320,320,320,320,320, -320,320,320,320,320,320,320,120,120,120,320,320,320,320,320,320, -320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320, -320,320,120,320,320,320,320,320,320,320,320,320,120,320,120,120, -320,320,320,320,320,320,320,120,120,120,318,120,120,120,120,321, -319,319,318,318,318,120,318,120,319,319,319,319,319,319,319,321, -120,120,120,120,120,120,322,322,322,322,322,322,322,322,322,322, -120,120,319,319,323,120,120,120,120,120,120,120,120,120,120,120, +120,320,321,321,120,322,322,322,322,322,322,322,322,322,322,322, +322,322,322,322,322,322,322,120,120,120,322,322,322,322,322,322, +322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322, +322,322,120,322,322,322,322,322,322,322,322,322,120,322,120,120, +322,322,322,322,322,322,322,120,120,120,320,120,120,120,120,323, +321,321,320,320,320,120,320,120,321,321,321,321,321,321,321,323, +120,120,120,120,120,120,324,324,324,324,324,324,324,324,324,324, +120,120,321,321,325,120,120,120,120,120,120,120,120,120,120,120, /* block 28 */ -120,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324, -324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324, -324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324, -324,325,324,326,325,325,325,325,325,325,325,120,120,120,120, 6, -324,324,324,324,324,324,327,325,325,325,325,325,325,325,325,328, -329,329,329,329,329,329,329,329,329,329,328,328,120,120,120,120, +120,326,326,326,326,326,326,326,326,326,326,326,326,326,326,326, +326,326,326,326,326,326,326,326,326,326,326,326,326,326,326,326, +326,326,326,326,326,326,326,326,326,326,326,326,326,326,326,326, +326,327,326,328,327,327,327,327,327,327,327,120,120,120,120, 6, +326,326,326,326,326,326,329,327,327,327,327,327,327,327,327,330, +331,331,331,331,331,331,331,331,331,331,330,330,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 29 */ -120,330,330,120,330,120,330,330,330,330,330,120,330,330,330,330, -330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330, -330,330,330,330,120,330,120,330,330,330,330,330,330,330,330,330, -330,331,330,332,331,331,331,331,331,331,331,331,331,330,120,120, -330,330,330,330,330,120,333,120,331,331,331,331,331,331,120,120, -334,334,334,334,334,334,334,334,334,334,120,120,330,330,330,330, +120,332,332,120,332,120,332,332,332,332,332,120,332,332,332,332, +332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332, +332,332,332,332,120,332,120,332,332,332,332,332,332,332,332,332, +332,333,332,334,333,333,333,333,333,333,333,333,333,332,120,120, +332,332,332,332,332,120,335,120,333,333,333,333,333,333,120,120, +336,336,336,336,336,336,336,336,336,336,120,120,332,332,332,332, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 30 */ -335,336,336,336,337,337,337,337,337,337,337,337,337,337,337,337, -337,337,337,336,337,336,336,336,338,338,336,336,336,336,336,336, -339,339,339,339,339,339,339,339,339,339,340,340,340,340,340,340, -340,340,340,340,336,338,336,338,336,338,341,342,341,342,343,343, -335,335,335,335,335,335,335,335,120,335,335,335,335,335,335,335, -335,335,335,335,335,335,335,335,335,335,335,335,335,335,335,335, -335,335,335,335,335,335,335,335,335,335,335,335,335,120,120,120, -120,338,338,338,338,338,338,338,338,338,338,338,338,338,338,343, +337,338,338,338,339,339,339,339,339,339,339,339,339,339,339,339, +339,339,339,338,339,338,338,338,340,340,338,338,338,338,338,338, +341,341,341,341,341,341,341,341,341,341,342,342,342,342,342,342, +342,342,342,342,338,340,338,340,338,340,343,344,343,344,345,345, +337,337,337,337,337,337,337,337,120,337,337,337,337,337,337,337, +337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, +337,337,337,337,337,337,337,337,337,337,337,337,337,120,120,120, +120,340,340,340,340,340,340,340,340,340,340,340,340,340,340,345, /* block 31 */ -338,338,338,338,338,337,338,338,335,335,335,335,335,338,338,338, -338,338,338,338,338,338,338,338,120,338,338,338,338,338,338,338, -338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338, -338,338,338,338,338,338,338,338,338,338,338,338,338,120,336,336, -336,336,336,336,336,336,338,336,336,336,336,336,336,120,336,336, -337,337,337,337,337, 20, 20, 20, 20,337,337,120,120,120,120,120, +340,340,340,340,340,339,340,340,337,337,337,337,337,340,340,340, +340,340,340,340,340,340,340,340,120,340,340,340,340,340,340,340, +340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, +340,340,340,340,340,340,340,340,340,340,340,340,340,120,338,338, +338,338,338,338,338,338,340,338,338,338,338,338,338,120,338,338, +339,339,339,339,339, 20, 20, 20, 20,339,339,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 32 */ -344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344, -344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344, -344,344,344,344,344,344,344,344,344,344,344,345,345,346,346,346, -346,347,346,346,346,346,346,346,345,346,346,347,347,346,346,344, -348,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349, -344,344,344,344,344,344,347,347,346,346,344,344,344,344,346,346, -346,344,345,345,345,344,344,345,345,345,345,345,345,345,344,344, -344,346,346,346,346,344,344,344,344,344,344,344,344,344,344,344, +346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,346, +346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,346, +346,346,346,346,346,346,346,346,346,346,346,347,347,348,348,348, +348,349,348,348,348,348,348,348,347,348,348,349,349,348,348,346, +350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351, +346,346,346,346,346,346,349,349,348,348,346,346,346,346,348,348, +348,346,347,347,347,346,346,347,347,347,347,347,347,347,346,346, +346,348,348,348,348,346,346,346,346,346,346,346,346,346,346,346, /* block 33 */ -344,344,346,345,347,346,346,345,345,345,345,345,345,346,344,345, -350,350,350,350,350,350,350,350,350,350,345,345,345,346,351,351, -352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352, -352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352, -352,352,352,352,352,352,120,352,120,120,120,120,120,352,120,120, -353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353, -353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353, -353,353,353,353,353,353,353,353,353,353,353,354,355,353,353,353, +346,346,348,347,349,348,348,347,347,347,347,347,347,348,346,347, +352,352,352,352,352,352,352,352,352,352,347,347,347,348,353,353, +354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354, +354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354, +354,354,354,354,354,354,120,354,120,120,120,120,120,354,120,120, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,356,357,355,355,355, /* block 34 */ -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, - -/* block 35 */ -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, -357,357,357,357,357,357,357,357,358,358,358,358,358,358,358,358, 358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, 358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, 358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, 358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, 358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, - -/* block 36 */ -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, 359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, 359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,120,359,359,359,359,120,120, -359,359,359,359,359,359,359,120,359,120,359,359,359,359,120,120, + +/* block 35 */ 359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, 359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, + +/* block 36 */ +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,120,361,361,361,361,120,120, +361,361,361,361,361,361,361,120,361,120,361,361,361,361,120,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, /* block 37 */ -359,359,359,359,359,359,359,359,359,120,359,359,359,359,120,120, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,120, -359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +361,361,361,361,361,361,361,361,361,120,361,361,361,361,120,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,120,361,361,361,361,120,120,361,361,361,361,361,361,361,120, +361,120,361,361,361,361,120,120,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, /* block 38 */ -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,359,359,359,359,120,120,360,360,360, -361,361,361,361,361,361,361,361,361,362,362,362,362,362,362,362, -362,362,362,362,362,362,362,362,362,362,362,362,362,120,120,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,120,361,361,361,361,120,120,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,120,120,362,362,362, +363,363,363,363,363,363,363,363,363,364,364,364,364,364,364,364, +364,364,364,364,364,364,364,364,364,364,364,364,364,120,120,120, /* block 39 */ -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -363,363,363,363,363,363,363,363,363,363,120,120,120,120,120,120, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, -365,365,365,365,365,365,120,120,366,366,366,366,366,366,120,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +365,365,365,365,365,365,365,365,365,365,120,120,120,120,120,120, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366, +367,367,367,367,367,367,120,120,368,368,368,368,368,368,120,120, /* block 40 */ -367,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, +369,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, /* block 41 */ -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, /* block 42 */ -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,369,370,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,371,372,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, /* block 43 */ -371,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372, -372,372,372,372,372,372,372,372,372,372,372,373,374,120,120,120, -375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375, -375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375, -375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375, -375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375, -375,375,375,375,375,375,375,375,375,375,375, 5, 5, 5,376,376, -376,375,375,375,375,375,375,375,375,120,120,120,120,120,120,120, +373,374,374,374,374,374,374,374,374,374,374,374,374,374,374,374, +374,374,374,374,374,374,374,374,374,374,374,375,376,120,120,120, +377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377, +377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377, +377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377, +377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377, +377,377,377,377,377,377,377,377,377,377,377, 5, 5, 5,378,378, +378,377,377,377,377,377,377,377,377,120,120,120,120,120,120,120, /* block 44 */ -377,377,377,377,377,377,377,377,377,377,377,377,377,120,377,377, -377,377,378,378,378,120,120,120,120,120,120,120,120,120,120,120, 379,379,379,379,379,379,379,379,379,379,379,379,379,379,379,379, -379,379,380,380,380,381,381,120,120,120,120,120,120,120,120,120, +379,379,380,380,380,381,120,120,120,120,120,120,120,120,120,379, 382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,382, -382,382,383,383,120,120,120,120,120,120,120,120,120,120,120,120, -384,384,384,384,384,384,384,384,384,384,384,384,384,120,384,384, -384,120,385,385,120,120,120,120,120,120,120,120,120,120,120,120, +382,382,383,383,384,385,385,120,120,120,120,120,120,120,120,120, +386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386, +386,386,387,387,120,120,120,120,120,120,120,120,120,120,120,120, +388,388,388,388,388,388,388,388,388,388,388,388,388,120,388,388, +388,120,389,389,120,120,120,120,120,120,120,120,120,120,120,120, /* block 45 */ -386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386, -386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386, -386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386, -386,386,386,386,387,387,388,387,387,387,387,387,387,387,388,388, -388,388,388,388,388,388,387,388,388,387,387,387,387,387,387,387, -387,387,387,387,389,389,389,390,389,389,389,391,386,387,120,120, -392,392,392,392,392,392,392,392,392,392,120,120,120,120,120,120, -393,393,393,393,393,393,393,393,393,393,120,120,120,120,120,120, +390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390, +390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390, +390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390, +390,390,390,390,391,391,392,391,391,391,391,391,391,391,392,392, +392,392,392,392,392,392,391,392,392,391,391,391,391,391,391,391, +391,391,391,391,393,393,393,394,393,393,393,395,390,391,120,120, +396,396,396,396,396,396,396,396,396,396,120,120,120,120,120,120, +397,397,397,397,397,397,397,397,397,397,120,120,120,120,120,120, /* block 46 */ -394,394,395,395,394,395,396,394,394,394,394,397,397,397,398,120, -399,399,399,399,399,399,399,399,399,399,120,120,120,120,120,120, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,401,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,120,120,120,120,120,120,120, +398,398,399,399,398,399,400,398,398,398,398,401,401,401,402,401, +403,403,403,403,403,403,403,403,403,403,120,120,120,120,120,120, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,405,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,120,120,120,120,120,120,120, /* block 47 */ -400,400,400,400,400,397,397,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, -400,400,400,400,400,400,400,400,400,397,400,120,120,120,120,120, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368, -368,368,368,368,368,368,120,120,120,120,120,120,120,120,120,120, +404,404,404,404,404,401,401,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404, +404,404,404,404,404,404,404,404,404,401,404,120,120,120,120,120, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,120,120,120,120,120,120,120,120,120,120, /* block 48 */ -402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,402, -402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,120, -403,403,403,404,404,404,404,403,403,404,404,404,120,120,120,120, -404,404,403,404,404,404,404,404,404,403,403,403,120,120,120,120, -405,120,120,120,406,406,407,407,407,407,407,407,407,407,407,407, -408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408, -408,408,408,408,408,408,408,408,408,408,408,408,408,408,120,120, -408,408,408,408,408,120,120,120,120,120,120,120,120,120,120,120, +406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,406, +406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,120, +407,407,407,408,408,408,408,407,407,408,408,408,120,120,120,120, +408,408,407,408,408,408,408,408,408,407,407,407,120,120,120,120, +409,120,120,120,410,410,411,411,411,411,411,411,411,411,411,411, +412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412, +412,412,412,412,412,412,412,412,412,412,412,412,412,412,120,120, +412,412,412,412,412,120,120,120,120,120,120,120,120,120,120,120, /* block 49 */ -409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409, -409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409, -409,409,409,409,409,409,409,409,409,409,409,409,120,120,120,120, -409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409, -409,409,409,409,409,409,409,409,409,409,120,120,120,120,120,120, -410,410,410,410,410,410,410,410,410,410,411,120,120,120,412,412, 413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413, 413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413, +413,413,413,413,413,413,413,413,413,413,413,413,120,120,120,120, +413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413, +413,413,413,413,413,413,413,413,413,413,120,120,120,120,120,120, +414,414,414,414,414,414,414,414,414,414,415,120,120,120,416,416, +417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417, +417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417, /* block 50 */ -414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414, -414,414,414,414,414,414,414,415,415,416,416,415,120,120,417,417, -418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418, -418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418, 418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418, -418,418,418,418,418,419,420,419,420,420,420,420,420,420,420,120, -420,421,420,421,421,420,420,420,420,420,420,420,420,419,419,419, -419,419,419,420,420,420,420,420,420,420,420,420,420,120,120,420, +418,418,418,418,418,418,418,419,419,420,420,419,120,120,421,421, +422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422, +422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422, +422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422, +422,422,422,422,422,423,424,423,424,424,424,424,424,424,424,120, +424,425,424,425,425,424,424,424,424,424,424,424,424,423,423,423, +423,423,423,424,424,424,424,424,424,424,424,424,424,120,120,424, /* block 51 */ -422,422,422,422,422,422,422,422,422,422,120,120,120,120,120,120, -422,422,422,422,422,422,422,422,422,422,120,120,120,120,120,120, -423,423,423,423,423,423,423,424,423,423,423,423,423,423,120,120, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,425,113, -113,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +426,426,426,426,426,426,426,426,426,426,120,120,120,120,120,120, +426,426,426,426,426,426,426,426,426,426,120,120,120,120,120,120, +427,427,427,427,427,427,427,428,427,427,427,427,427,427,120,120, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,429,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 52 */ -426,426,426,426,427,428,428,428,428,428,428,428,428,428,428,428, -428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428, -428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428, -428,428,428,428,426,429,426,426,426,426,426,427,426,427,427,427, -427,427,426,427,427,428,428,428,428,428,428,428,120,120,120,120, -430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431, -431,432,432,432,432,432,432,432,432,432,432,426,426,426,426,426, -426,426,426,426,432,432,432,432,432,432,432,432,432,120,120,120, +430,430,430,430,431,432,432,432,432,432,432,432,432,432,432,432, +432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,432, +432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,432, +432,432,432,432,430,433,430,430,430,430,430,431,430,431,431,431, +431,431,430,431,431,432,432,432,432,432,432,432,432,120,120,120, +434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435, +435,436,436,436,436,436,436,436,436,436,436,430,430,430,430,430, +430,430,430,430,436,436,436,436,436,436,436,436,436,435,435,120, /* block 53 */ -433,433,434,435,435,435,435,435,435,435,435,435,435,435,435,435, -435,435,435,435,435,435,435,435,435,435,435,435,435,435,435,435, -435,434,433,433,433,433,434,434,433,433,434,433,433,433,435,435, -436,436,436,436,436,436,436,436,436,436,435,435,435,435,435,435, -437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437, -437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437, -437,437,437,437,437,437,438,439,438,438,439,439,439,438,439,438, -438,438,439,439,120,120,120,120,120,120,120,120,440,440,440,440, - -/* block 54 */ +437,437,438,439,439,439,439,439,439,439,439,439,439,439,439,439, +439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439, +439,438,437,437,437,437,438,438,437,437,438,437,437,437,439,439, +440,440,440,440,440,440,440,440,440,440,439,439,439,439,439,439, 441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441, 441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441, -441,441,441,441,442,442,442,442,442,442,442,442,443,443,443,443, -443,443,443,443,442,442,443,443,120,120,120,444,444,444,444,444, -445,445,445,445,445,445,445,445,445,445,120,120,120,441,441,441, -446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447, -447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447, -447,447,447,447,447,447,447,447,448,448,448,448,448,448,449,449, +441,441,441,441,441,441,442,443,442,442,443,443,443,442,443,442, +442,442,443,443,120,120,120,120,120,120,120,120,444,444,444,444, + +/* block 54 */ +445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445, +445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445, +445,445,445,445,446,446,446,446,446,446,446,446,447,447,447,447, +447,447,447,447,446,446,447,447,120,120,120,448,448,448,448,448, +449,449,449,449,449,449,449,449,449,449,120,120,120,445,445,445, +450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451, +451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,451, +451,451,451,451,451,451,451,451,452,452,452,452,452,452,453,453, /* block 55 */ -450,451,452,453,454,455,456,457,458,120,120,120,120,120,120,120, -459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,459, -459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,459, -459,459,459,459,459,459,459,459,459,459,459,120,120,459,459,459, -460,460,460,460,460,460,460,460,120,120,120,120,120,120,120,120, -461,462,461,463,462,464,464,465,464,465,466,462,465,465,462,462, -465,467,462,462,462,462,462,462,462,468,469,470,470,464,470,470, -470,470,471,472,473,469,469,474,475,475,476,120,120,120,120,120, +454,455,456,457,458,459,460,461,462,120,120,120,120,120,120,120, +463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463, +463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463, +463,463,463,463,463,463,463,463,463,463,463,120,120,463,463,463, +464,464,464,464,464,464,464,464,120,120,120,120,120,120,120,120, +465,466,465,467,466,468,468,469,468,469,470,466,469,469,466,466, +469,471,466,466,466,466,466,466,466,472,473,474,474,468,474,474, +474,474,475,476,477,473,473,478,479,479,480,120,120,120,120,120, /* block 56 */ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35,128,128,128,128,128,477,110,110,110,110, + 35, 35, 35, 35, 35, 35,128,128,128,128,128,481,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,121,121,121, 121,121,110,110,110,110,121,121,121,121,121, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35,478,479, 35, 35, 35,480, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35,482,483, 35, 35, 35,484, 35, 35, /* block 57 */ - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,481, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,485, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,121, 114,114,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -113,113,113,113,113,113,113,113,482,113,120,113,113,113,113,113, +113,113,113,113,113,113,113,113,486,113,487,113,113,113,113,113, /* block 58 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, @@ -2305,12 +2331,12 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, -483,484, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, +488,489, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, /* block 59 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, - 32, 33, 32, 33, 32, 33, 35, 35, 35, 35, 35,485, 35, 35,486, 35, + 32, 33, 32, 33, 32, 33, 35, 35, 35, 35, 35,490, 35, 35,491, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, @@ -2319,33 +2345,33 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, /* block 60 */ -487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, -487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120, -487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, -487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, -487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120, -128,487,128,487,128,487,128,487,120,488,120,488,120,488,120,488, -487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, -489,489,490,490,490,490,491,491,492,492,493,493,494,494,120,120, +492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493, +492,492,492,492,492,492,120,120,493,493,493,493,493,493,120,120, +492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493, +492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493, +492,492,492,492,492,492,120,120,493,493,493,493,493,493,120,120, +128,492,128,492,128,492,128,492,120,493,120,493,120,493,120,493, +492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493, +494,494,495,495,495,495,496,496,497,497,498,498,499,499,120,120, /* block 61 */ -487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495, -487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495, -487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495, -487,487,128,496,128,120,128,128,488,488,497,497,498,119,499,119, -119,119,128,496,128,120,128,128,500,500,500,500,498,119,119,119, -487,487,128,128,120,120,128,128,488,488,501,501,120,119,119,119, -487,487,128,128,128,169,128,128,488,488,502,502,174,119,119,119, -120,120,128,496,128,120,128,128,503,503,504,504,498,119,119,120, +492,492,492,492,492,492,492,492,500,500,500,500,500,500,500,500, +492,492,492,492,492,492,492,492,500,500,500,500,500,500,500,500, +492,492,492,492,492,492,492,492,500,500,500,500,500,500,500,500, +492,492,128,501,128,120,128,128,493,493,502,502,503,119,504,119, +119,119,128,501,128,120,128,128,505,505,505,505,503,119,119,119, +492,492,128,128,120,120,128,128,493,493,506,506,120,119,119,119, +492,492,128,128,128,169,128,128,493,493,507,507,174,119,119,119, +120,120,128,501,128,120,128,128,508,508,509,509,503,119,119,120, /* block 62 */ - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,505,506, 24, 24, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,510,511, 24, 24, 10, 10, 10, 10, 10, 10, 5, 5, 23, 27, 7, 23, 23, 27, 7, 23, - 5, 5, 5, 5, 5, 5, 5, 5,507,508, 24, 24, 24, 24, 24,509, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,510, 5, 5, 16, - 16, 5, 5, 5, 9, 7, 8, 5, 5,510, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5,512,513, 24, 24, 24, 24, 24,514, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,515, 5, 5, 16, + 16, 5, 5, 5, 9, 7, 8, 5, 5,515, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, - 24, 24, 24, 24, 24,511, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24,516, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25,110,120,120, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,110, /* block 63 */ @@ -2353,24 +2379,24 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 110,110,110,110,110,110,110,110,110,110,110,110,110,120,120,120, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -113,113,113,113,113,113,113,113,113,113,113,113,113,425,425,425, -425,113,425,425,425,113,113,113,113,113,113,113,113,113,113,113, -512,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + 6,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +113,113,113,113,113,113,113,113,113,113,113,113,113,429,429,429, +429,113,429,429,429,113,113,113,113,113,113,113,113,113,113,113, +517,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 64 */ - 20, 20,513, 20, 20, 20, 20,513, 20, 20,514,513,513,513,514,514, -513,513,513,514, 20,513, 20, 20, 9,513,513,513,513,513, 20, 20, - 20, 20, 21, 20,513, 20,515, 20,513, 20,516,517,513,513, 20,514, -513,513,518,513,514,519,519,519,519,520, 20, 20,514,514,513,513, - 9, 9, 9, 9, 9,513,514,514,514,514, 20, 9, 20, 20,521, 20, + 20, 20,518, 20, 20, 20, 20,518, 20, 20,519,518,518,518,519,519, +518,518,518,519, 20,518, 20, 20, 9,518,518,518,518,518, 20, 20, + 20, 20, 21, 20,518, 20,520, 20,518, 20,521,522,518,518, 20,519, +518,518,523,518,519,524,524,524,524,525, 20, 20,519,519,518,518, + 9, 9, 9, 9, 9,518,519,519,519,519, 20, 9, 20, 20,526, 20, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, +527,527,527,527,527,527,527,527,527,527,527,527,527,527,527,527, +528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528, /* block 65 */ -524,524,524, 32, 33,524,524,524,524, 25, 20, 20,120,120,120,120, - 9, 9, 9, 9,525, 21, 21, 21, 21, 21, 9, 9, 20, 20, 20, 20, +529,529,529, 32, 33,529,529,529,529, 25, 20, 20,120,120,120,120, + 9, 9, 9, 9,530, 21, 21, 21, 21, 21, 9, 9, 20, 20, 20, 20, 9, 20, 20, 9, 20, 20, 9, 20, 20, 21, 21, 20, 20, 20, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, @@ -2422,10 +2448,10 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20,526,526,526,526,526,526,526,526,526,526, -526,526,527,526,526,526,526,526,526,526,526,526,526,526,526,526, -528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528, -528,528,528,528,528,528,528,528,528,528, 25, 25, 25, 25, 25, 25, + 20, 20, 20, 20, 20, 20,531,531,531,531,531,531,531,531,531,531, +531,531,532,531,531,531,531,531,531,531,531,531,531,531,531,531, +533,533,533,533,533,533,533,533,533,533,533,533,533,533,533,533, +533,533,533,533,533,533,533,533,533,533, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, /* block 71 */ @@ -2446,7 +2472,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,525,525,525,525, 9, + 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,530,530,530,530, 9, /* block 73 */ 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -2455,7 +2481,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,525, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,530, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* block 74 */ @@ -2489,20 +2515,20 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* block 77 */ -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, -529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, +534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534, /* block 78 */ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,525,525, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,530,530, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -2539,14 +2565,14 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, /* block 82 */ -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,120, -531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531, -531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531, -531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,120, - 32, 33,532,533,534,535,536, 32, 33, 32, 33, 32, 33,537,538,539, -540, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,110,110,541,541, +535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,535, +535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,535, +535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,535, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, + 32, 33,537,538,539,540,541, 32, 33, 32, 33, 32, 33,542,543,544, +545, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,110,110,546,546, /* block 83 */ 165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, @@ -2555,138 +2581,138 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, 165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, 165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, -165,166,165,166,542,543,543,543,543,543,543,165,166,165,166,544, -544,544,165,166,120,120,120,120,120,545,545,545,545,546,545,545, +165,166,165,166,547,548,548,548,548,548,548,165,166,165,166,549, +549,549,165,166,120,120,120,120,120,550,550,550,550,551,550,550, /* block 84 */ -547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547, -547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547, -547,547,547,547,547,547,120,547,120,120,120,120,120,547,120,120, -548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, -548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, -548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, -548,548,548,548,548,548,548,548,120,120,120,120,120,120,120,549, -550,120,120,120,120,120,120,120,120,120,120,120,120,120,120,551, - -/* block 85 */ -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,359,359,359,359,359,120,120,120,120,120,120,120,120,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, 552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, 552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, +552,552,552,552,552,552,120,552,120,120,120,120,120,552,120,120, +553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553, +553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553, +553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553, +553,553,553,553,553,553,553,553,120,120,120,120,120,120,120,554, +555,120,120,120,120,120,120,120,120,120,120,120,120,120,120,556, + +/* block 85 */ +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,120,120,120,120,120,120,120,120,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, +557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557, +557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557, /* block 86 */ 5, 5, 23, 27, 23, 27, 5, 5, 5, 23, 27, 5, 23, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 10, 5, 23, 27, 5, 5, 23, 27, 7, 8, 7, 8, 7, 8, 7, 8, 5, 5, 5, 5, 5,111, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 5, 5, 5, 5, - 10, 5, 7,553, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 20, 20, 5,120,120,120,120,120,120,120,120,120,120,120,120,120, + 10, 5, 7,558, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 20, 20, 5, 5, 5, 7, 8, 7, 8, 7, 8, 7, 8, 10,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 87 */ -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,120,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,120,120,120,120,120,120,120,120,120,120,120,120, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,120,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,120,120,120,120,120,120,120,120,120,120,120,120, /* block 88 */ -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, /* block 89 */ -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, -554,554,554,554,554,554,120,120,120,120,120,120,120,120,120,120, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, +559,559,559,559,559,559,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120, /* block 90 */ - 4,555,555,556, 20,557,558,559,560,561,560,561,560,561,560,561, -560,561, 20,562,560,561,560,561,560,561,560,561,563,564,565,565, - 20,559,559,559,559,559,559,559,559,559,566,566,566,566,567,567, -568,569,569,569,569,569, 20,562,559,559,559,557,570,571,572,572, -120,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, - -/* block 91 */ -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,120,120,574,574,575,575,576,576,573, -577,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, + 4,560,560,561, 20,562,563,564,565,566,565,566,565,566,565,566, +565,566, 20,567,565,566,565,566,565,566,565,566,568,569,570,570, + 20,564,564,564,564,564,564,564,564,564,571,571,571,571,572,572, +573,574,574,574,574,574, 20,567,564,564,564,562,575,576,577,577, +120,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, 578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, 578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, 578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, + +/* block 91 */ 578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, -578,578,578,578,578,578,578,578,578,578,578,555,569,579,579,578, +578,578,578,578,578,578,578,120,120,579,579,580,580,581,581,578, +582,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,560,574,584,584,583, /* block 92 */ -120,120,120,120,120,580,580,580,580,580,580,580,580,580,580,580, -580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, -580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, -120,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, +120,120,120,120,120,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +120,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, /* block 93 */ -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120, -572,572,582,582,582,582,572,572,572,572,572,572,572,572,572,572, -580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, -580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572,572,572,572,120,120,120,120,120,120,120,120,120,120,120,120, -578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,120, +577,577,587,587,587,587,577,577,577,577,577,577,577,577,577,577, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,120,120,120,120,120,120,120,120,120,120,120,120, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, /* block 94 */ -583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, -583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,120, -582,582,582,582,582,582,582,582,582,582,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572,572,572,572,572,572,572,572, 25, 25, 25, 25, 25, 25, 25, 25, +588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,588, +588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,120, +587,587,587,587,587,587,587,587,587,587,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, -583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, 20, +588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,588, +588,588,588,588,588,588,588,588,588,588,588,588,588,588,588, 20, /* block 95 */ -582,582,582,582,582,582,582,582,582,582,572,572,572,572,572,572, -572,572,572,572,572,572,572,584,572,584,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -572,572,572,572,572,572,572,572,572,572,572,572, 20, 20, 20, 20, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,572, +587,587,587,587,587,587,587,587,587,587,577,577,577,577,577,577, +577,577,577,577,577,577,577,589,577,589,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +577,577,577,577,577,577,577,577,577,577,577,577, 20, 20, 20, 20, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,577, /* block 96 */ -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,585,585,585,585,585,572,572,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,572,572,572,572,572, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,577,577,577,577,577, /* block 97 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -2695,450 +2721,440 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, 20, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, 20, /* block 98 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, /* block 99 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, /* block 100 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,120, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,593,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, /* block 101 */ -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,588,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, /* block 102 */ -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +592,592,592,592,592,592,592,592,592,592,592,592,592,120,120,120, +594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594, +594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594, +594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594, +594,594,594,594,594,594,594,120,120,120,120,120,120,120,120,120, +595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, +595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, +595,595,595,595,595,595,595,595,596,596,596,596,596,596,597,597, /* block 103 */ -587,587,587,587,587,587,587,587,587,587,587,587,587,120,120,120, -589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589, -589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589, -589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589, -589,589,589,589,589,589,589,120,120,120,120,120,120,120,120,120, -590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, -590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, -590,590,590,590,590,590,590,590,591,591,591,591,591,591,592,592, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, /* block 104 */ -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, - -/* block 105 */ -593,593,593,593,593,593,593,593,593,593,593,593,594,595,595,595, -593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -596,596,596,596,596,596,596,596,596,596,593,593,120,120,120,120, +598,598,598,598,598,598,598,598,598,598,598,598,599,600,600,600, +598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598, +601,601,601,601,601,601,601,601,601,601,598,598,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -192,193,192,193,192,193,192,193,192,193,597,598,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,602,603,192,193,192,193, 192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, -192,193,192,193,192,193,192,193,192,193,192,193,192,193,599,198, -200,200,200,600,552,552,552,552,552,552,552,552,552,552,600,478, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,604,198, +200,200,200,605,557,557,557,557,557,557,557,557,557,557,605,482, -/* block 106 */ +/* block 105 */ 192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, -192,193,192,193,192,193,192,193,192,193,192,193,478,478,552,552, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,602,602,602,602,602,602,602,602,602,602, -603,603,604,604,604,604,604,604,120,120,120,120,120,120,120,120, +192,193,192,193,192,193,192,193,192,193,192,193,482,482,557,557, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,607,607,607,607,607,607,607,607,607,607, +608,608,609,609,609,609,609,609,120,120,120,120,120,120,120,120, -/* block 107 */ -605,605,605,605,605,605,605,605, 15, 15, 15, 15, 15, 15, 15, 15, +/* block 106 */ +610,610,610,610,610,610,610,610, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111, 15, 15, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 35, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, -110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,606, 32, 33, +110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,611, 32, 33, -/* block 108 */ - 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,607, 35, 22, - 32, 33, 32, 33,608, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, - 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,609,610,611,612,609, 35, -613,614,615,616, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, -120,120, 32, 33,617,618,619, 32, 33, 32, 33,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +/* block 107 */ + 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,612, 35, 22, + 32, 33, 32, 33,613, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,614,615,616,617,614, 35, +618,619,620,621, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33,622,623,624, 32, 33, 32, 33,120,120,120,120,120, + 32, 33,120, 35,120, 35, 32, 33, 32, 33,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120, 32, 33, 22,110,110, 35, 22, 22, 22, 22, 22, +120,120,110,110,110, 32, 33, 22,110,110, 35, 22, 22, 22, 22, 22, + +/* block 108 */ +625,625,626,625,625,625,626,625,625,625,625,626,625,625,625,625, +625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625, +625,625,625,627,627,626,626,627,628,628,628,628,626,120,120,120, +629,629,629,630,630,630,631,631,632,631,120,120,120,120,120,120, +633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633, +633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633, +633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633, +633,633,633,633,634,634,634,634,120,120,120,120,120,120,120,120, /* block 109 */ -620,620,621,620,620,620,621,620,620,620,620,621,620,620,620,620, -620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, -620,620,620,622,622,621,621,622,623,623,623,623,621,120,120,120, -624,624,624,625,625,625,626,626,627,626,120,120,120,120,120,120, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,629,629,629,629,120,120,120,120,120,120,120,120, +635,635,636,636,636,636,636,636,636,636,636,636,636,636,636,636, +636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636, +636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636, +636,636,636,636,635,635,635,635,635,635,635,635,635,635,635,635, +635,635,635,635,637,637,120,120,120,120,120,120,120,120,638,638, +639,639,639,639,639,639,639,639,639,639,120,120,120,120,120,120, +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, +253,640,255,641,255,255,255,255,261,261,261,255,261,255,255,253, /* block 110 */ -630,630,631,631,631,631,631,631,631,631,631,631,631,631,631,631, -631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631, -631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631, -631,631,631,631,630,630,630,630,630,630,630,630,630,630,630,630, -630,630,630,630,632,632,120,120,120,120,120,120,120,120,633,633, -634,634,634,634,634,634,634,634,634,634,120,120,120,120,120,120, -251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251, -251,635,253,636,253,253,253,253,259,259,259,253,259,253,253,251, +642,642,642,642,642,642,642,642,642,642,643,643,643,643,643,643, +643,643,643,643,643,643,643,643,643,643,643,643,643,643,643,643, +643,643,643,643,643,643,644,644,644,644,644,644,644,644,645,646, +647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647, +647,647,647,647,647,647,647,648,648,648,648,648,648,648,648,648, +648,648,649,649,120,120,120,120,120,120,120,120,120,120,120,650, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,120,120,120, /* block 111 */ -637,637,637,637,637,637,637,637,637,637,638,638,638,638,638,638, -638,638,638,638,638,638,638,638,638,638,638,638,638,638,638,638, -638,638,638,638,638,638,639,639,639,639,639,639,639,639,640,641, -642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,642, -642,642,642,642,642,642,642,643,643,643,643,643,643,643,643,643, -643,643,644,644,120,120,120,120,120,120,120,120,120,120,120,645, -356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, -356,356,356,356,356,356,356,356,356,356,356,356,356,120,120,120, - -/* block 112 */ -646,646,646,647,648,648,648,648,648,648,648,648,648,648,648,648, -648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648, -648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648, -648,648,648,646,647,647,646,646,646,646,647,647,646,646,647,647, -647,649,649,649,649,649,649,649,649,649,649,649,649,649,120,650, -651,651,651,651,651,651,651,651,651,651,120,120,120,120,649,649, -344,344,344,344,344,346,652,344,344,344,344,344,344,344,344,344, -350,350,350,350,350,350,350,350,350,350,344,344,344,344,344,120, - -/* block 113 */ +651,651,651,652,653,653,653,653,653,653,653,653,653,653,653,653, 653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653, 653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653, -653,653,653,653,653,653,653,653,653,654,654,654,654,654,654,655, -655,654,654,655,655,654,654,120,120,120,120,120,120,120,120,120, -653,653,653,654,653,653,653,653,653,653,653,653,654,655,120,120, -656,656,656,656,656,656,656,656,656,656,120,120,657,657,657,657, -344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344, -652,344,344,344,344,344,344,351,351,351,344,345,346,345,344,344, +653,653,653,651,652,652,651,651,651,651,652,652,651,651,652,652, +652,654,654,654,654,654,654,654,654,654,654,654,654,654,120,655, +656,656,656,656,656,656,656,656,656,656,120,120,120,120,654,654, +346,346,346,346,346,348,657,346,346,346,346,346,346,346,346,346, +352,352,352,352,352,352,352,352,352,352,346,346,346,346,346,120, -/* block 114 */ -658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +/* block 112 */ 658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, 658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, -659,658,659,659,659,658,658,659,659,658,658,658,658,658,659,659, -658,659,658,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,658,658,660,661,661, -662,662,662,662,662,662,662,662,662,662,662,663,664,664,663,663, -665,665,662,666,666,663,664,120,120,120,120,120,120,120,120,120, +658,658,658,658,658,658,658,658,658,659,659,659,659,659,659,660, +660,659,659,660,660,659,659,120,120,120,120,120,120,120,120,120, +658,658,658,659,658,658,658,658,658,658,658,658,659,660,120,120, +661,661,661,661,661,661,661,661,661,661,120,120,662,662,662,662, +346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,346, +657,346,346,346,346,346,346,353,353,353,346,347,348,347,346,346, -/* block 115 */ -120,359,359,359,359,359,359,120,120,359,359,359,359,359,359,120, -120,359,359,359,359,359,359,120,120,120,120,120,120,120,120,120, -359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120, +/* block 113 */ +663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663, +663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663, +663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663, +664,663,664,664,664,663,663,664,664,663,663,663,663,663,664,664, +663,664,663,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,663,663,665,666,666, +667,667,667,667,667,667,667,667,667,667,667,668,669,669,668,668, +670,670,667,671,671,668,669,120,120,120,120,120,120,120,120,120, + +/* block 114 */ +120,361,361,361,361,361,361,120,120,361,361,361,361,361,361,120, +120,361,361,361,361,361,361,120,120,120,120,120,120,120,120,120, +361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35,667, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110, + 35, 35, 35,672, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110, 35, 35, 35, 35, 35,128, 35, 35, 35,110, 15, 15,120,120,120,120, -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, + +/* block 115 */ +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667, +667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667, +667,667,667,668,668,669,668,668,669,668,668,670,668,669,120,120, +674,674,674,674,674,674,674,674,674,674,120,120,120,120,120,120, /* block 116 */ -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, -662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662, -662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662, -662,662,662,663,663,664,663,663,664,663,663,665,663,664,120,120, -669,669,669,669,669,669,669,669,669,669,120,120,120,120,120,120, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, /* block 117 */ -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, /* block 118 */ -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, /* block 119 */ -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, /* block 120 */ -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, /* block 121 */ -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, /* block 122 */ -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, /* block 123 */ -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,120,120,120,120,120,120,120,120,120,120,120,120, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,120,120,120,120,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,120,120,120,120, /* block 124 */ -671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,120,120,120,120,120,120,120,120,120,120,120,120, -357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, -357,357,357,357,357,357,357,120,120,120,120,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, -358,358,358,358,358,358,358,358,358,358,358,358,120,120,120,120, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, +677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677, /* block 125 */ -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, /* block 126 */ -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, /* block 127 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, - -/* block 128 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,120,120,120,120,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 129 */ +/* block 128 */ 35, 35, 35, 35, 35, 35, 35,120,120,120,120,120,120,120,120,120, 120,120,120,206,206,206,206,206,120,120,120,120,120,214,211,214, -214,214,214,214,214,214,214,214,214,674,214,214,214,214,214,214, +214,214,214,214,214,214,214,214,214,679,214,214,214,214,214,214, 214,214,214,214,214,214,214,120,214,214,214,214,214,120,214,120, 214,214,120,214,214,120,214,214,214,214,214,214,214,214,214,214, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, + +/* block 129 */ +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,252,252,252,252,252,252,252,252,252,252,252,252,252,252, +252,252,252,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 130 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,675,675,675,675,675,675,675,675,675,675,675,675,675,675, -675,675,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 131 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,680,681, +221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 132 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224, 8, 7, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, - -/* block 133 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -120,120,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,120,120,120,120,120,120,120,120, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +120,120,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,120,120,120,120,120,120,120,221, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -224,224,676,224,224,224,224,224,224,224,224,224,219,677,120,120, +225,225,682,225,225,225,225,225,225,225,225,225,219,683,221,221, -/* block 134 */ +/* block 133 */ 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 5, 5, 5, 5, 5, 5, 5, 7, 8, 5,120,120,120,120,120,120, -113,113,113,113,113,113,113,113,113,113,113,113,113,113,552,552, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,557,557, 5, 10, 10, 16, 16, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, - 8, 7, 8, 7, 8,556,556, 7, 8, 5, 5, 5, 5, 16, 16, 16, + 8, 7, 8, 7, 8,561,561, 7, 8, 5, 5, 5, 5, 16, 16, 16, 5, 5, 5,120, 5, 5, 5, 5, 10, 7, 8, 7, 8, 7, 8, 5, 5, 5, 9, 10, 9, 9, 9,120, 5, 6, 5, 5,120,120,120,120, -224,224,224,224,224,120,224,224,224,224,224,224,224,224,224,224, +225,225,225,225,225,120,225,225,225,225,225,225,225,225,225,225, -/* block 135 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,120,120, 24, +/* block 134 */ +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,120,120, 24, -/* block 136 */ +/* block 135 */ 120, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 9, 9, 9, 5, 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 5, 8, 15, 16, 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 9, 8, 9, 7, - 8,555,560,561,555,555,578,578,578,578,578,578,578,578,578,578, -569,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, + 8,560,565,566,560,560,583,583,583,583,583,583,583,583,583,583, +574,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, -/* block 137 */ -578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, -578,578,578,578,578,578,578,578,578,578,578,578,578,578,678,678, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120, -120,120,581,581,581,581,581,581,120,120,581,581,581,581,581,581, -120,120,581,581,581,581,581,581,120,120,581,581,581,120,120,120, +/* block 136 */ +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,684,684, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,120, +120,120,586,586,586,586,586,586,120,120,586,586,586,586,586,586, +120,120,586,586,586,586,586,586,120,120,586,586,586,120,120,120, 6, 6, 9, 15, 20, 6, 6,120, 20, 9, 9, 9, 9, 20, 20,120, -511,511,511,511,511,511,511,511,511, 24, 24, 24, 20, 20,120,120, +516,516,516,516,516,516,516,516,516, 24, 24, 24, 20, 20,120,120, -/* block 138 */ -679,679,679,679,679,679,679,679,679,679,679,679,120,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,120,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,120,679,679,120,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,120,120, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,120,120, +/* block 137 */ +685,685,685,685,685,685,685,685,685,685,685,685,120,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,120,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,120,685,685,120,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,120,120, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +/* block 138 */ +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,120,120,120,120,120, + /* block 139 */ -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,120,120,120,120,120, +686,686,687,120,120,120,120,688,688,688,688,688,688,688,688,688, +688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688, +688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688, +688,688,688,688,120,120,120,689,689,689,689,689,689,689,689,689, +690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, +690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, +690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, +690,690,690,690,690,691,691,691,691,692,692,692,692,692,692,692, /* block 140 */ -680,680,680,120,120,120,120,681,681,681,681,681,681,681,681,681, -681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681, -681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681, -681,681,681,681,120,120,120,682,682,682,682,682,682,682,682,682, -683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683, -683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683, -683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683, -683,683,683,683,683,684,684,684,684,685,685,685,685,685,685,685, - -/* block 141 */ -685,685,685,685,685,685,685,685,685,685,684,684,685,685,685,120, +692,692,692,692,692,692,692,692,692,692,691,691,692,692,692,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120, -685,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +692,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,120,120, -/* block 142 */ +/* block 141 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -3148,499 +3164,519 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 143 */ -686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686, -686,686,686,686,686,686,686,686,686,686,686,686,686,120,120,120, -687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, -687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, -687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, -687,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -688,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689, -689,689,689,689,689,689,689,689,689,689,689,689,120,120,120,120, - -/* block 144 */ -690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, -690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, -691,691,691,691,120,120,120,120,120,120,120,120,120,690,690,690, -692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, -692,693,692,692,692,692,692,692,692,692,693,120,120,120,120,120, +/* block 142 */ +693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693, +693,693,693,693,693,693,693,693,693,693,693,693,693,120,120,120, 694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, 694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, -694,694,694,694,694,694,695,695,695,695,695,120,120,120,120,120, - -/* block 145 */ -696,696,696,696,696,696,696,696,696,696,696,696,696,696,696,696, -696,696,696,696,696,696,696,696,696,696,696,696,696,696,120,697, -698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698, -698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698, -698,698,698,698,120,120,120,120,698,698,698,698,698,698,698,698, -699,700,700,700,700,700,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, +694,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +695,696,696,696,696,696,696,696,696,696,696,696,696,696,696,696, +696,696,696,696,696,696,696,696,696,696,696,696,120,120,120,120, -/* block 146 */ +/* block 143 */ +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +698,698,698,698,120,120,120,120,120,120,120,120,120,697,697,697, +699,699,699,699,699,699,699,699,699,699,699,699,699,699,699,699, +699,700,699,699,699,699,699,699,699,699,700,120,120,120,120,120, 701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701, 701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701, -701,701,701,701,701,701,701,701,702,702,702,702,702,702,702,702, -702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702, -702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702, -703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, -703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, -703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, +701,701,701,701,701,701,702,702,702,702,702,120,120,120,120,120, -/* block 147 */ -704,704,704,704,704,704,704,704,704,704,704,704,704,704,704,704, -704,704,704,704,704,704,704,704,704,704,704,704,704,704,120,120, -705,705,705,705,705,705,705,705,705,705,120,120,120,120,120,120, -706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706, -706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706, -706,706,706,706,120,120,120,120,707,707,707,707,707,707,707,707, -707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707, -707,707,707,707,707,707,707,707,707,707,707,707,120,120,120,120, +/* block 144 */ +703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, +703,703,703,703,703,703,703,703,703,703,703,703,703,703,120,704, +705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, +705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, +705,705,705,705,120,120,120,120,705,705,705,705,705,705,705,705, +706,707,707,707,707,707,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 148 */ +/* block 145 */ 708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708, 708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708, -708,708,708,708,708,708,708,708,120,120,120,120,120,120,120,120, -709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709, +708,708,708,708,708,708,708,708,709,709,709,709,709,709,709,709, 709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709, 709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709, -709,709,709,709,120,120,120,120,120,120,120,120,120,120,120,710, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 149 */ -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, -/* block 150 */ -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,711,120,120,120,120,120,120,120,120,120, +/* block 146 */ 711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, -711,711,711,711,711,711,120,120,120,120,120,120,120,120,120,120, -711,711,711,711,711,711,711,711,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 151 */ -712,712,712,712,712,712,120,120,712,120,712,712,712,712,712,712, -712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712, -712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712, -712,712,712,712,712,712,120,712,712,120,120,120,712,120,120,712, +711,711,711,711,711,711,711,711,711,711,711,711,711,711,120,120, +712,712,712,712,712,712,712,712,712,712,120,120,120,120,120,120, 713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713, -713,713,713,713,713,713,120,714,715,715,715,715,715,715,715,715, -716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, -716,716,716,716,716,716,716,717,717,718,718,718,718,718,718,718, +713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713, +713,713,713,713,120,120,120,120,714,714,714,714,714,714,714,714, +714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714, +714,714,714,714,714,714,714,714,714,714,714,714,120,120,120,120, -/* block 152 */ -719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719, -719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,120, -120,120,120,120,120,120,120,720,720,720,720,720,720,720,720,720, +/* block 147 */ +715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715, +715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715, +715,715,715,715,715,715,715,715,120,120,120,120,120,120,120,120, +716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, +716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, +716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, +716,716,716,716,120,120,120,120,120,120,120,120,120,120,120,717, +718,718,718,718,718,718,718,718,718,718,718,120,718,718,718,718, + +/* block 148 */ +718,718,718,718,718,718,718,718,718,718,718,120,718,718,718,718, +718,718,718,120,718,718,120,719,719,719,719,719,719,719,719,719, +719,719,120,719,719,719,719,719,719,719,719,719,719,719,719,719, +719,719,120,719,719,719,719,719,719,719,120,719,719,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721, -721,721,721,120,721,721,120,120,120,120,120,722,722,722,722,722, -/* block 153 */ -723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723, -723,723,723,723,723,723,724,724,724,724,724,724,120,120,120,725, -726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726, -726,726,726,726,726,726,726,726,726,726,120,120,120,120,120,727, +/* block 149 */ +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, + +/* block 150 */ +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,720,120,120,120,120,120,120,120,120,120, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,720,720,720,120,120,120,120,120,120,120,120,120,120, +720,720,720,720,720,720,720,720,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 151 */ +110,110,110,110,110,110,120,110,110,110,110,110,110,110,110,110, +110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, +110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, +110,120,110,110,110,110,110,110,110,110,110,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 154 */ -728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728, +/* block 152 */ +721,721,721,721,721,721,120,120,721,120,721,721,721,721,721,721, +721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721, +721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721, +721,721,721,721,721,721,120,721,721,120,120,120,721,120,120,721, +722,722,722,722,722,722,722,722,722,722,722,722,722,722,722,722, +722,722,722,722,722,722,120,723,724,724,724,724,724,724,724,724, +725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725, +725,725,725,725,725,725,725,726,726,727,727,727,727,727,727,727, + +/* block 153 */ 728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728, -729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729, -729,729,729,729,729,729,729,729,120,120,120,120,730,730,729,729, -730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730, -120,120,730,730,730,730,730,730,730,730,730,730,730,730,730,730, -730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730, +728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,120, +120,120,120,120,120,120,120,729,729,729,729,729,729,729,729,729, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730, +730,730,730,120,730,730,120,120,120,120,120,731,731,731,731,731, -/* block 155 */ -731,732,732,732,120,732,732,120,120,120,120,120,732,732,732,732, -731,731,731,731,120,731,731,731,120,731,731,731,731,731,731,731, -731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731, -731,731,731,731,731,731,120,120,732,732,732,120,120,120,120,732, -733,733,733,733,733,733,733,733,733,120,120,120,120,120,120,120, -734,734,734,734,734,734,734,734,734,120,120,120,120,120,120,120, +/* block 154 */ +732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732, +732,732,732,732,732,732,733,733,733,733,733,733,120,120,120,734, 735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,735, -735,735,735,735,735,735,735,735,735,735,735,735,735,736,736,737, - -/* block 156 */ -738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738, -738,738,738,738,738,738,738,738,738,738,738,738,738,739,739,739, +735,735,735,735,735,735,735,735,735,735,120,120,120,120,120,736, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -740,740,740,740,740,740,740,740,741,740,740,740,740,740,740,740, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 155 */ +737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737, +737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737, +738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738, +738,738,738,738,738,738,738,738,120,120,120,120,739,739,738,738, +739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739, +120,120,739,739,739,739,739,739,739,739,739,739,739,739,739,739, +739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739, +739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739, + +/* block 156 */ +740,741,741,741,120,741,741,120,120,120,120,120,741,741,741,741, +740,740,740,740,120,740,740,740,120,740,740,740,740,740,740,740, 740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740, -740,740,740,740,740,742,742,120,120,120,120,743,743,743,743,743, -744,744,744,744,744,744,744,120,120,120,120,120,120,120,120,120, +740,740,740,740,740,740,120,120,741,741,741,120,120,120,120,741, +742,742,742,742,742,742,742,742,742,120,120,120,120,120,120,120, +743,743,743,743,743,743,743,743,743,120,120,120,120,120,120,120, +744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744, +744,744,744,744,744,744,744,744,744,744,744,744,744,745,745,746, /* block 157 */ -745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745, -745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745, -745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745, -745,745,745,745,745,745,120,120,120,746,746,746,746,746,746,746, 747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747, -747,747,747,747,747,747,120,120,748,748,748,748,748,748,748,748, +747,747,747,747,747,747,747,747,747,747,747,747,747,748,748,748, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +749,749,749,749,749,749,749,749,750,749,749,749,749,749,749,749, 749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749, -749,749,749,120,120,120,120,120,750,750,750,750,750,750,750,750, +749,749,749,749,749,751,751,120,120,120,120,752,752,752,752,752, +753,753,754,753,753,753,753,120,120,120,120,120,120,120,120,120, /* block 158 */ -751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,751, -751,751,120,120,120,120,120,120,120,752,752,752,752,120,120,120, -120,120,120,120,120,120,120,120,120,753,753,753,753,753,753,753, +755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, +755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, +755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, +755,755,755,755,755,755,120,120,120,756,756,756,756,756,756,756, +757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757, +757,757,757,757,757,757,120,120,758,758,758,758,758,758,758,758, +759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759, +759,759,759,120,120,120,120,120,760,760,760,760,760,760,760,760, + +/* block 159 */ +761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761, +761,761,120,120,120,120,120,120,120,762,762,762,762,120,120,120, +120,120,120,120,120,120,120,120,120,763,763,763,763,763,763,763, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 159 */ -754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, -754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, -754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, -754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, -754,754,754,754,754,754,754,754,754,120,120,120,120,120,120,120, +/* block 160 */ +764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, +764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, +764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, +764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, +764,764,764,764,764,764,764,764,764,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 160 */ -755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, -755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, -755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, -755,755,755,120,120,120,120,120,120,120,120,120,120,120,120,120, -756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756, -756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756, -756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756, -756,756,756,120,120,120,120,120,120,120,757,757,757,757,757,757, - /* block 161 */ -758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,758, -758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,758, -758,758,758,758,759,759,759,759,120,120,120,120,120,120,120,120, -760,760,760,760,760,760,760,760,760,760,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765, +765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765, +765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765, +765,765,765,120,120,120,120,120,120,120,120,120,120,120,120,120, +766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766, +766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766, +766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766, +766,766,766,120,120,120,120,120,120,120,767,767,767,767,767,767, /* block 162 */ +768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768, +768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768, +768,768,768,768,769,769,769,769,120,120,120,120,120,120,120,120, +770,770,770,770,770,770,770,770,770,770,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761, -761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,120, /* block 163 */ -762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762, -762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762, -762,762,762,762,762,762,762,762,762,762,120,763,763,764,120,120, -762,762,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771, +771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,120, /* block 164 */ -765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765, -765,765,765,765,765,765,765,765,765,765,765,765,765,766,766,766, -766,766,766,766,766,766,766,765,120,120,120,120,120,120,120,120, -767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767, -767,767,767,767,767,767,768,768,768,768,768,768,768,768,768,768, -768,769,769,769,769,770,770,770,770,770,120,120,120,120,120,120, +772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772, +772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772, +772,772,772,772,772,772,772,772,772,772,120,773,773,774,120,120, +772,772,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 165 */ +775,775,775,775,775,775,775,775,775,775,775,775,775,775,775,775, +775,775,775,775,775,775,775,775,775,775,775,775,775,776,776,776, +776,776,776,776,776,776,776,775,120,120,120,120,120,120,120,120, +777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,777, +777,777,777,777,777,777,778,778,778,778,778,778,778,778,778,778, +778,779,779,779,779,780,780,780,780,780,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +781,781,781,781,781,781,781,781,781,781,781,781,781,781,781,781, + +/* block 166 */ +781,781,782,782,782,782,783,783,783,783,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771, -771,771,771,771,771,772,772,772,772,772,772,772,120,120,120,120, +784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,784, +784,784,784,784,784,785,785,785,785,785,785,785,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,773, -773,773,773,773,773,773,773,120,120,120,120,120,120,120,120,120, - -/* block 166 */ -774,775,774,776,776,776,776,776,776,776,776,776,776,776,776,776, -776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776, -776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776, -776,776,776,776,776,776,776,776,775,775,775,775,775,775,775,775, -775,775,775,775,775,775,775,777,777,777,777,777,777,777,120,120, -120,120,778,778,778,778,778,778,778,778,778,778,778,778,778,778, -778,778,778,778,778,778,779,779,779,779,779,779,779,779,779,779, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,775, +786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786, +786,786,786,786,786,786,786,120,120,120,120,120,120,120,120,120, /* block 167 */ -780,780,781,782,782,782,782,782,782,782,782,782,782,782,782,782, -782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782, -782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782, -781,781,781,780,780,780,780,781,781,780,780,783,783,784,783,783, -783,783,120,120,120,120,120,120,120,120,120,120,120,784,120,120, -785,785,785,785,785,785,785,785,785,785,785,785,785,785,785,785, -785,785,785,785,785,785,785,785,785,120,120,120,120,120,120,120, -786,786,786,786,786,786,786,786,786,786,120,120,120,120,120,120, +787,788,787,789,789,789,789,789,789,789,789,789,789,789,789,789, +789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789, +789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789, +789,789,789,789,789,789,789,789,788,788,788,788,788,788,788,788, +788,788,788,788,788,788,788,790,790,790,790,790,790,790,120,120, +120,120,791,791,791,791,791,791,791,791,791,791,791,791,791,791, +791,791,791,791,791,791,792,792,792,792,792,792,792,792,792,792, +788,789,789,788,788,789,120,120,120,120,120,120,120,120,120,788, /* block 168 */ -787,787,787,788,788,788,788,788,788,788,788,788,788,788,788,788, -788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788, -788,788,788,788,788,788,788,787,787,787,787,787,789,787,787,787, -787,787,787,787,787,120,790,790,790,790,790,790,790,790,790,790, -791,791,791,791,788,789,789,788,120,120,120,120,120,120,120,120, -792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,792, -792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,792, -792,792,792,793,794,794,792,120,120,120,120,120,120,120,120,120, +793,793,794,795,795,795,795,795,795,795,795,795,795,795,795,795, +795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,795, +795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,795, +794,794,794,793,793,793,793,794,794,793,793,796,796,797,796,796, +796,796,793,120,120,120,120,120,120,120,120,120,120,797,120,120, +798,798,798,798,798,798,798,798,798,798,798,798,798,798,798,798, +798,798,798,798,798,798,798,798,798,120,120,120,120,120,120,120, +799,799,799,799,799,799,799,799,799,799,120,120,120,120,120,120, /* block 169 */ -795,795,796,797,797,797,797,797,797,797,797,797,797,797,797,797, -797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,797, -797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,797, -797,797,797,796,796,796,795,795,795,795,795,795,795,795,795,796, -796,797,798,798,797,799,799,799,799,795,795,795,795,799,796,795, -800,800,800,800,800,800,800,800,800,800,797,799,797,799,799,799, -120,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,120,120,120,120,120,120,120,120,120,120,120, +800,800,800,801,801,801,801,801,801,801,801,801,801,801,801,801, +801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, +801,801,801,801,801,801,801,800,800,800,800,800,802,800,800,800, +800,800,800,800,800,120,803,803,803,803,803,803,803,803,803,803, +804,804,804,804,801,802,802,801,120,120,120,120,120,120,120,120, +805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, +805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, +805,805,805,806,807,807,805,120,120,120,120,120,120,120,120,120, /* block 170 */ -802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,120,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,802,802,802,802,802,802,802,802,802,802,803,803,803,804, -804,804,803,803,804,803,804,804,805,805,805,805,805,805,804,120, +808,808,809,810,810,810,810,810,810,810,810,810,810,810,810,810, +810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810, +810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810, +810,810,810,809,809,809,808,808,808,808,808,808,808,808,808,809, +809,810,811,811,810,812,812,812,812,808,808,808,808,812,809,808, +813,813,813,813,813,813,813,813,813,813,810,812,810,812,812,812, +120,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814, +814,814,814,814,814,120,120,120,120,120,120,120,120,120,120,120, + +/* block 171 */ +815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815, +815,815,120,815,815,815,815,815,815,815,815,815,815,815,815,815, +815,815,815,815,815,815,815,815,815,815,815,815,816,816,816,817, +817,817,816,816,817,816,817,817,818,818,818,818,818,818,817,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 171 */ -806,806,806,806,806,806,806,120,806,120,806,806,806,806,120,806, -806,806,806,806,806,806,806,806,806,806,806,806,806,806,120,806, -806,806,806,806,806,806,806,806,806,807,120,120,120,120,120,120, -808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,808, -808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,808, -808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,809, -810,810,810,809,809,809,809,809,809,809,809,120,120,120,120,120, -811,811,811,811,811,811,811,811,811,811,120,120,120,120,120,120, - /* block 172 */ -812,813,814,815,120,816,816,816,816,816,816,816,816,120,120,816, -816,120,120,816,816,816,816,816,816,816,816,816,816,816,816,816, -816,816,816,816,816,816,816,816,816,120,816,816,816,816,816,816, -816,120,816,816,120,816,816,816,816,816,120,817,813,816,818,814, -812,814,814,814,814,120,120,814,814,120,120,814,814,814,120,120, -816,120,120,120,120,120,120,818,120,120,120,120,120,816,816,816, -816,816,814,814,120,120,812,812,812,812,812,812,812,120,120,120, -812,812,812,812,812,120,120,120,120,120,120,120,120,120,120,120, +819,819,819,819,819,819,819,120,819,120,819,819,819,819,120,819, +819,819,819,819,819,819,819,819,819,819,819,819,819,819,120,819, +819,819,819,819,819,819,819,819,819,820,120,120,120,120,120,120, +821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,821, +821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,821, +821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,822, +823,823,823,822,822,822,822,822,822,822,822,120,120,120,120,120, +824,824,824,824,824,824,824,824,824,824,120,120,120,120,120,120, /* block 173 */ -819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819, -819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819, -819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819, -819,819,819,819,819,820,820,820,821,821,821,821,821,821,821,821, -820,820,821,821,821,820,821,819,819,819,819,822,822,822,822,822, -823,823,823,823,823,823,823,823,823,823,822,822,120,822,821,819, -819,819,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +825,826,827,828,120,829,829,829,829,829,829,829,829,120,120,829, +829,120,120,829,829,829,829,829,829,829,829,829,829,829,829,829, +829,829,829,829,829,829,829,829,829,120,829,829,829,829,829,829, +829,120,829,829,120,829,829,829,829,829,120,830,826,829,831,827, +825,827,827,827,827,120,120,827,827,120,120,827,827,827,120,120, +829,120,120,120,120,120,120,831,120,120,120,120,120,829,829,829, +829,829,827,827,120,120,825,825,825,825,825,825,825,120,120,120, +825,825,825,825,825,120,120,120,120,120,120,120,120,120,120,120, /* block 174 */ -824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824, -824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824, -824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824, -825,826,826,827,827,827,827,827,827,826,827,826,826,825,826,827, -827,826,827,827,824,824,828,824,120,120,120,120,120,120,120,120, -829,829,829,829,829,829,829,829,829,829,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832, +832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832, +832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832, +832,832,832,832,832,833,833,833,834,834,834,834,834,834,834,834, +833,833,834,834,834,833,834,832,832,832,832,835,835,835,835,835, +836,836,836,836,836,836,836,836,836,836,835,835,120,835,834,832, +832,832,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 175 */ -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,831, -832,832,833,833,833,833,120,120,832,832,832,832,833,833,832,833, -833,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834, -834,834,834,834,834,834,834,834,830,830,830,830,833,833,120,120, +837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, +837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, +837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, +838,839,839,840,840,840,840,840,840,839,840,839,839,838,839,840, +840,839,840,840,837,837,841,837,120,120,120,120,120,120,120,120, +842,842,842,842,842,842,842,842,842,842,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 176 */ -835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835, -835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835, -835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835, -836,836,836,837,837,837,837,837,837,837,837,836,836,837,836,837, -837,838,838,838,835,120,120,120,120,120,120,120,120,120,120,120, -839,839,839,839,839,839,839,839,839,839,120,120,120,120,120,120, -394,394,394,394,394,394,394,394,394,394,394,394,394,120,120,120, +843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,843, +843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,843, +843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,844, +845,845,846,846,846,846,120,120,845,845,845,845,846,846,845,846, +846,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847, +847,847,847,847,847,847,847,847,843,843,843,843,846,846,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 177 */ -840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840, -840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840, -840,840,840,840,840,840,840,840,840,840,840,841,842,841,842,842, -841,841,841,841,841,841,842,841,840,120,120,120,120,120,120,120, -843,843,843,843,843,843,843,843,843,843,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,848, +848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,848, +848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,848, +849,849,849,850,850,850,850,850,850,850,850,849,849,850,849,850, +850,851,851,851,848,120,120,120,120,120,120,120,120,120,120,120, +852,852,852,852,852,852,852,852,852,852,120,120,120,120,120,120, +398,398,398,398,398,398,398,398,398,398,398,398,398,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 178 */ -844,844,844,844,844,844,844,844,844,844,844,844,844,844,844,844, -844,844,844,844,844,844,844,844,844,844,844,120,120,845,845,845, -846,846,845,845,845,845,846,845,845,845,845,845,120,120,120,120, -847,847,847,847,847,847,847,847,847,847,848,848,849,849,849,850, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, +853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, +853,853,853,853,853,853,853,853,853,853,853,854,855,854,855,855, +854,854,854,854,854,854,855,854,853,856,120,120,120,120,120,120, +857,857,857,857,857,857,857,857,857,857,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 179 */ -851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851, -851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851, -851,851,851,851,851,851,851,851,851,851,851,851,852,852,852,853, -853,853,853,853,853,853,853,853,852,853,853,854,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858, +858,858,858,858,858,858,858,858,858,858,858,120,120,859,859,859, +860,860,859,859,859,859,861,859,859,859,859,859,120,120,120,120, +862,862,862,862,862,862,862,862,862,862,863,863,864,864,864,865, +858,858,858,858,858,858,858,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 180 */ +866,866,866,866,866,866,866,866,866,866,866,866,866,866,866,866, +866,866,866,866,866,866,866,866,866,866,866,866,866,866,866,866, +866,866,866,866,866,866,866,866,866,866,866,866,867,867,867,868, +868,868,868,868,868,868,868,868,867,868,868,869,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,855, -855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,855, -856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,856, -856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,856, -857,857,857,857,857,857,857,857,857,857,858,858,858,858,858,858, -858,858,858,120,120,120,120,120,120,120,120,120,120,120,120,859, /* block 181 */ -860,860,860,860,860,860,860,120,120,860,120,120,860,860,860,860, -860,860,860,860,120,860,860,120,860,860,860,860,860,860,860,860, -860,860,860,860,860,860,860,860,860,860,860,860,860,860,860,860, -861,862,862,862,862,862,120,862,862,120,120,863,863,862,863,864, -862,864,862,863,865,865,865,120,120,120,120,120,120,120,120,120, -866,866,866,866,866,866,866,866,866,866,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +870,870,870,870,870,870,870,870,870,870,870,870,870,870,870,870, +870,870,870,870,870,870,870,870,870,870,870,870,870,870,870,870, +871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871, +871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871, +872,872,872,872,872,872,872,872,872,872,873,873,873,873,873,873, +873,873,873,120,120,120,120,120,120,120,120,120,120,120,120,874, /* block 182 */ +875,875,875,875,875,875,875,120,120,875,120,120,875,875,875,875, +875,875,875,875,120,875,875,120,875,875,875,875,875,875,875,875, +875,875,875,875,875,875,875,875,875,875,875,875,875,875,875,875, +876,877,877,877,877,877,120,877,877,120,120,878,878,877,878,879, +877,879,877,878,880,880,880,120,120,120,120,120,120,120,120,120, +881,881,881,881,881,881,881,881,881,881,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -867,867,867,867,867,867,867,867,120,120,867,867,867,867,867,867, -867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867, -867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867, -867,868,868,868,869,869,869,869,120,120,869,869,868,868,868,868, -869,867,870,867,868,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 183 */ -871,872,872,872,872,872,872,872,872,872,872,871,871,871,871,871, -871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871, -871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871, -871,871,871,872,872,872,872,872,872,873,874,872,872,872,872,875, -875,875,875,875,875,875,875,872,120,120,120,120,120,120,120,120, -876,877,877,877,877,877,877,878,878,877,877,877,876,876,876,876, -876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, -876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +882,882,882,882,882,882,882,882,120,120,882,882,882,882,882,882, +882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882, +882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882, +882,883,883,883,884,884,884,884,120,120,884,884,883,883,883,883, +884,882,885,882,883,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 184 */ -876,876,876,876,879,879,879,879,879,879,877,877,877,877,877,877, -877,877,877,877,877,877,877,878,877,877,880,880,880,876,880,880, -880,880,880,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881, -881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881, -881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881, -881,881,881,881,881,881,881,881,881,120,120,120,120,120,120,120, +886,887,887,887,887,887,887,887,887,887,887,886,886,886,886,886, +886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886, +886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886, +886,886,886,887,887,887,887,887,887,888,889,887,887,887,887,890, +890,890,890,890,890,890,890,887,120,120,120,120,120,120,120,120, +891,892,892,892,892,892,892,893,893,892,892,892,891,891,891,891, +891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891, +891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891, /* block 185 */ -882,882,882,882,882,882,882,882,882,120,882,882,882,882,882,882, -882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882, -882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,883, -884,884,884,884,884,884,884,120,884,884,884,884,884,884,883,884, -882,885,885,885,885,885,120,120,120,120,120,120,120,120,120,120, -886,886,886,886,886,886,886,886,886,886,887,887,887,887,887,887, -887,887,887,887,887,887,887,887,887,887,887,887,887,120,120,120, -888,888,889,889,889,889,889,889,889,889,889,889,889,889,889,889, +891,891,891,891,894,894,894,894,894,894,892,892,892,892,892,892, +892,892,892,892,892,892,892,893,892,892,895,895,895,891,895,895, +895,895,895,120,120,120,120,120,120,120,120,120,120,120,120,120, +370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, +896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, +896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, +896,896,896,896,896,896,896,896,896,120,120,120,120,120,120,120, /* block 186 */ -889,889,889,889,889,889,889,889,889,889,889,889,889,889,889,889, -120,120,890,890,890,890,890,890,890,890,890,890,890,890,890,890, -890,890,890,890,890,890,890,890,120,891,890,890,890,890,890,890, -890,891,890,890,891,890,890,120,120,120,120,120,120,120,120,120, +897,897,897,897,897,897,897,897,897,120,897,897,897,897,897,897, +897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, +897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,898, +899,899,899,899,899,899,899,120,899,899,899,899,899,899,898,899, +897,900,900,900,900,900,120,120,120,120,120,120,120,120,120,120, +901,901,901,901,901,901,901,901,901,901,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,120,120,120, +903,903,904,904,904,904,904,904,904,904,904,904,904,904,904,904, + +/* block 187 */ +904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,904, +120,120,905,905,905,905,905,905,905,905,905,905,905,905,905,905, +905,905,905,905,905,905,905,905,120,906,905,905,905,905,905,905, +905,906,905,905,906,905,905,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 187 */ -892,892,892,892,892,892,892,120,892,892,120,892,892,892,892,892, -892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892, -892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892, -892,893,893,893,893,893,893,120,120,120,893,120,893,893,120,893, -893,893,893,893,893,893,894,893,120,120,120,120,120,120,120,120, -895,895,895,895,895,895,895,895,895,895,120,120,120,120,120,120, -896,896,896,896,896,896,120,896,896,120,896,896,896,896,896,896, -896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, - /* block 188 */ -896,896,896,896,896,896,896,896,896,896,897,897,897,897,897,120, -898,898,120,897,897,898,897,898,896,120,120,120,120,120,120,120, -899,899,899,899,899,899,899,899,899,899,120,120,120,120,120,120, +907,907,907,907,907,907,907,120,907,907,120,907,907,907,907,907, +907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, +907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, +907,908,908,908,908,908,908,120,120,120,908,120,908,908,120,908, +908,908,908,908,908,908,909,908,120,120,120,120,120,120,120,120, +910,910,910,910,910,910,910,910,910,910,120,120,120,120,120,120, +911,911,911,911,911,911,120,911,911,120,911,911,911,911,911,911, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, + +/* block 189 */ +911,911,911,911,911,911,911,911,911,911,912,912,912,912,912,120, +913,913,120,912,912,913,912,913,911,120,120,120,120,120,120,120, +914,914,914,914,914,914,914,914,914,914,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 189 */ +/* block 190 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -900,900,900,900,900,900,900,900,900,900,900,900,900,900,900,900, -900,900,900,901,901,902,902,903,903,120,120,120,120,120,120,120, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,916,916,917,917,918,918,120,120,120,120,120,120,120, -/* block 190 */ +/* block 191 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -590,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,904, -293,293,904,293,904,295,295,295,295,295,295,295,295,296,296,296, -296,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295, -295,295,120,120,120,120,120,120,120,120,120,120,120,120,120,905, - -/* block 191 */ -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, +595,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919, +295,295,919,295,919,297,297,297,297,297,297,297,297,298,298,298, +298,297,297,297,297,297,297,297,297,297,297,297,297,297,297,297, +297,297,120,120,120,120,120,120,120,120,120,120,120,120,120,920, /* block 192 */ -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,120,120,120,120,120,120, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, + +/* block 193 */ +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -3648,108 +3684,118 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 193 */ -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907, -907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,120, -908,908,908,908,908,120,120,120,120,120,120,120,120,120,120,120, - /* block 194 */ -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906, -906,906,906,906,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,120, +923,923,923,923,923,120,120,120,120,120,120,120,120,120,120,120, /* block 195 */ -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, - -/* block 196 */ -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909, -909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,120, -910,910,910,910,910,910,910,910,910,120,120,120,120,120,120,120, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921, +921,921,921,921,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 196 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, +924,925,925,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 197 */ -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, /* block 198 */ -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, -911,911,911,911,911,911,911,120,120,120,120,120,120,120,120,120, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,120, +927,927,927,927,927,927,927,927,927,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 199 */ -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, /* block 200 */ -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,120,120,120,120,120,120,120, -912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912, -912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,120, -913,913,913,913,913,913,913,913,913,913,120,120,120,120,914,914, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 201 */ -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928, +928,928,928,928,928,928,928,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, -915,915,915,915,915,915,915,915,915,915,915,915,915,915,120,120, -916,916,916,916,916,917,120,120,120,120,120,120,120,120,120,120, + +/* block 201 */ +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, /* block 202 */ -918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, -918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, -918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, -919,919,919,919,919,919,919,920,920,920,920,920,921,921,921,921, -922,922,922,922,920,921,120,120,120,120,120,120,120,120,120,120, -923,923,923,923,923,923,923,923,923,923,120,924,924,924,924,924, -924,924,120,918,918,918,918,918,918,918,918,918,918,918,918,918, -918,918,918,918,918,918,918,918,120,120,120,120,120,918,918,918, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,606,606,606,606,606,606,120,120,120,120,120,120,120, +929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, +929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,120, +930,930,930,930,930,930,930,930,930,930,120,120,120,120,931,931, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, /* block 203 */ -918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,120, +933,933,933,933,933,933,933,933,933,933,120,120,120,120,120,120, +934,934,934,934,934,934,934,934,934,934,934,934,934,934,934,934, +934,934,934,934,934,934,934,934,934,934,934,934,934,934,120,120, +935,935,935,935,935,936,120,120,120,120,120,120,120,120,120,120, + +/* block 204 */ +937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, +937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, +937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, +938,938,938,938,938,938,938,939,939,939,939,939,940,940,940,940, +941,941,941,941,939,940,120,120,120,120,120,120,120,120,120,120, +942,942,942,942,942,942,942,942,942,942,120,943,943,943,943,943, +943,943,120,937,937,937,937,937,937,937,937,937,937,937,937,937, +937,937,937,937,937,937,937,937,120,120,120,120,120,937,937,937, + +/* block 205 */ +937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -3758,19 +3804,19 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 204 */ +/* block 206 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925, -925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925, -926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, -926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926, +944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944, +944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, -/* block 205 */ -927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927, -927,927,927,927,927,927,927,928,928,928,928,120,120,120,120,120, +/* block 207 */ +946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946, +946,946,946,946,946,946,946,947,947,947,947,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -3778,68 +3824,68 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 206 */ -929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, -929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, -929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, -929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, -929,929,929,929,929,929,929,929,929,929,929,120,120,120,120,930, -929,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931, -931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931, -931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931, +/* block 208 */ +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,948,948,948,948,948,948,948,948,948,120,120,120,120,949, +948,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950, +950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950, +950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950, -/* block 207 */ -931,931,931,931,931,931,931,931,120,120,120,120,120,120,120,930, -930,930,930,932,932,932,932,932,932,932,932,932,932,932,932,932, +/* block 209 */ +950,950,950,950,950,950,950,950,120,120,120,120,120,120,120,949, +949,949,949,951,951,951,951,951,951,951,951,951,951,951,951,951, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -933,934, 5,111,935,120,120,120,120,120,120,120,120,120,120,120, -936,936,120,120,120,120,120,120,120,120,120,120,120,120,120,120, - -/* block 208 */ -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, - -/* block 209 */ -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937, -937,937,937,937,937,937,937,937,120,120,120,120,120,120,120,120, +952,953,954,562,955,120,120,120,120,120,120,120,120,120,120,120, +956,956,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 210 */ -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, /* block 211 */ -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938, -938,938,938,938,938,938,120,120,120,120,120,120,120,120,120,120, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, +957,957,957,957,957,957,957,957,120,120,120,120,120,120,120,120, + +/* block 212 */ +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, + +/* block 213 */ +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 212 */ -937,937,937,937,937,937,937,937,937,120,120,120,120,120,120,120, +/* block 214 */ +957,957,957,957,957,957,957,957,957,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -3848,77 +3894,107 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 213 */ -578,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, - -/* block 214 */ -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, - /* block 215 */ -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -573,573,573,120,120,120,120,120,120,120,120,120,120,120,120,120, -120,120,120,120,578,578,578,578,120,120,120,120,120,120,120,120, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +584,584,584,584,120,584,584,584,584,584,584,584,120,584,584,120, /* block 216 */ -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, +583,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, /* block 217 */ -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939, -939,939,939,939,939,939,939,939,939,939,939,939,120,120,120,120, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, /* block 218 */ -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940, -940,940,940,940,940,940,940,940,940,940,940,120,120,120,120,120, -940,940,940,940,940,940,940,940,940,940,940,940,940,120,120,120, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +583,583,583,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +578,578,578,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,583,583,583,583,120,120,120,120,120,120,120,120, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, /* block 219 */ -940,940,940,940,940,940,940,940,940,120,120,120,120,120,120,120, -940,940,940,940,940,940,940,940,940,940,120,120,941,942,942,943, -944,944,944,944,120,120,120,120,120,120,120,120,120,120,120,120, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, + +/* block 220 */ +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959, +959,959,959,959,959,959,959,959,959,959,959,959,120,120,120,120, + +/* block 221 */ +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960, +960,960,960,960,960,960,960,960,960,960,960,120,120,120,120,120, +960,960,960,960,960,960,960,960,960,960,960,960,960,120,120,120, + +/* block 222 */ +960,960,960,960,960,960,960,960,960,120,120,120,120,120,120,120, +960,960,960,960,960,960,960,960,960,960,120,120,961,962,962,963, +964,964,964,964,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 220 */ +/* block 223 */ +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,120,120, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,120,120,120,120,120,120,120,120,120, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + +/* block 224 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 225 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -3928,37 +4004,37 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120, -/* block 221 */ +/* block 226 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20,945,946,113,113,113, 20, 20, 20,946,945,945, -945,945,945, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113, + 20, 20, 20, 20, 20,965,966,113,113,113, 20, 20, 20,966,965,965, +965,965,965, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113, -/* block 222 */ +/* block 227 */ 113,113,113, 20, 20,113,113,113,113,113,113,113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,113,113,113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 223 */ -685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, -685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, -685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, -685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, -685,685,947,947,947,685,120,120,120,120,120,120,120,120,120,120, +/* block 228 */ +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,967,967,967,692,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 224 */ +/* block 229 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -3968,187 +4044,207 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 225 */ +/* block 230 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120, -582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582, -582,582, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120, -/* block 226 */ -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514, -514,514,514,514,514,120,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, +/* block 231 */ +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,519,519, +519,519,519,519,519,120,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, -/* block 227 */ -513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,513,120,513,513, -120,120,513,120,120,513,513,120,120,513,513,513,513,120,513,513, -513,513,513,513,513,513,514,514,514,514,120,514,120,514,514,514, -514,514,514,514,120,514,514,514,514,514,514,514,514,514,514,514, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +/* block 232 */ +518,518,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,518,120,518,518, +120,120,518,120,120,518,518,120,120,518,518,518,518,120,518,518, +518,518,518,518,518,518,519,519,519,519,120,519,120,519,519,519, +519,519,519,519,120,519,519,519,519,519,519,519,519,519,519,519, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, -/* block 228 */ -514,514,514,514,513,513,120,513,513,513,513,120,120,513,513,513, -513,513,513,513,513,120,513,513,513,513,513,513,513,120,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,513,513,120,513,513,513,513,120, -513,513,513,513,513,120,513,120,120,120,513,513,513,513,513,513, -513,120,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, +/* block 233 */ +519,519,519,519,518,518,120,518,518,518,518,120,120,518,518,518, +518,518,518,518,518,120,518,518,518,518,518,518,518,120,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,518,518,120,518,518,518,518,120, +518,518,518,518,518,120,518,120,120,120,518,518,518,518,518,518, +518,120,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, -/* block 229 */ -513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +/* block 234 */ +518,518,518,518,518,518,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, -/* block 230 */ -514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, +/* block 235 */ +519,519,519,519,519,519,519,519,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, -/* block 231 */ -513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,120,120,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513, 9,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514, 9,514,514,514,514, -514,514,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513, 9,514,514,514,514, +/* block 236 */ +518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,120,120,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518, 9,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519, 9,519,519,519,519, +519,519,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518, 9,519,519,519,519, -/* block 232 */ -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514, 9,514,514,514,514,514,514,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513, 9,514,514,514,514,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, 9, -514,514,514,514,514,514,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, 9, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +/* block 237 */ +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519, 9,519,519,519,519,519,519,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518, 9,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, 9, +519,519,519,519,519,519,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, 9, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, -/* block 233 */ -514,514,514,514,514,514,514,514,514, 9,514,514,514,514,514,514, -513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, -513,513,513,513,513,513,513,513,513, 9,514,514,514,514,514,514, -514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, -514,514,514, 9,514,514,514,514,514,514,513,514,120,120, 11, 11, +/* block 238 */ +519,519,519,519,519,519,519,519,519, 9,519,519,519,519,519,519, +518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, +518,518,518,518,518,518,518,518,518, 9,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519, 9,519,519,519,519,519,519,518,519,120,120, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, -/* block 234 */ -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, -948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +/* block 239 */ +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, +968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968, -/* block 235 */ -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,948,948,948,948,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, -949,949,949,949,949,949,949,949,949,949,949,949,949,948,948,948, -948,948,948,948,948,949,948,948,948,948,948,948,948,948,948,948, +/* block 240 */ +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,968,968,968,968,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, +969,969,969,969,969,969,969,969,969,969,969,969,969,968,968,968, +968,968,968,968,968,969,968,968,968,968,968,968,968,968,968,968, -/* block 236 */ -948,948,948,948,949,948,948,950,950,950,950,950,120,120,120,120, -120,120,120,120,120,120,120,120,120,120,120,949,949,949,949,949, -120,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, +/* block 241 */ +968,968,968,968,969,968,968,970,970,970,970,970,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,969,969,969,969,969, +120,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 237 */ -951,951,951,951,951,951,951,120,951,951,951,951,951,951,951,951, -951,951,951,951,951,951,951,951,951,120,120,951,951,951,951,951, -951,951,120,951,951,120,951,951,951,951,951,120,120,120,120,120, +/* block 242 */ + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 22, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 238 */ -952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952, -952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952, -952,952,952,952,952,952,952,952,952,952,952,952,952,120,120,120, -953,953,953,953,953,953,953,954,954,954,954,954,954,954,120,120, -955,955,955,955,955,955,955,955,955,955,120,120,120,120,952,956, +/* block 243 */ +971,971,971,971,971,971,971,120,971,971,971,971,971,971,971,971, +971,971,971,971,971,971,971,971,971,120,120,971,971,971,971,971, +971,971,120,971,971,120,971,971,971,971,971,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 239 */ +/* block 244 */ +972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972, +972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972, +972,972,972,972,972,972,972,972,972,972,972,972,972,120,120,120, +973,973,973,973,973,973,973,974,974,974,974,974,974,974,120,120, +975,975,975,975,975,975,975,975,975,975,120,120,120,120,972,976, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 245 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977, +977,977,977,977,977,977,977,977,977,977,977,977,977,977,978,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979, +979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979, +979,979,979,979,979,979,979,979,979,979,979,979,980,980,980,980, +981,981,981,981,981,981,981,981,981,981,120,120,120,120,120,982, + +/* block 246 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, -957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957, -957,957,957,957,957,957,957,957,957,957,957,957,958,958,958,958, -959,959,959,959,959,959,959,959,959,959,120,120,120,120,120,960, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +361,361,361,361,361,361,361,120,361,361,361,361,120,361,361,120, +361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,120, -/* block 240 */ -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, +/* block 247 */ +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, -/* block 241 */ -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, -961,961,961,961,961,120,120,962,962,962,962,962,962,962,962,962, -963,963,963,963,963,963,963,120,120,120,120,120,120,120,120,120, +/* block 248 */ +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983, +983,983,983,983,983,120,120,984,984,984,984,984,984,984,984,984, +985,985,985,985,985,985,985,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 242 */ -964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964, -964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964, -964,964,965,965,965,965,965,965,965,965,965,965,965,965,965,965, -965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965, -965,965,965,965,966,966,966,966,966,966,966,967,120,120,120,120, -968,968,968,968,968,968,968,968,968,968,120,120,120,120,969,969, +/* block 249 */ +986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986, +986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986, +986,986,987,987,987,987,987,987,987,987,987,987,987,987,987,987, +987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987, +987,987,987,987,988,988,988,988,988,988,988,989,120,120,120,120, +990,990,990,990,990,990,990,990,990,990,120,120,120,120,991,991, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 243 */ +/* block 250 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -4158,7 +4254,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -/* block 244 */ +/* block 251 */ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25, @@ -4168,7 +4264,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 245 */ +/* block 252 */ 120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, @@ -4178,47 +4274,47 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 246 */ -224,224,224,224,120,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -120,224,224,120,224,120,120,224,120,224,224,224,224,224,224,224, -224,224,224,120,224,224,224,224,120,224,120,224,120,120,120,120, -120,120,224,120,120,120,120,224,120,224,120,224,120,224,224,224, -120,224,224,120,224,120,120,224,120,224,120,224,120,224,120,224, -120,224,224,120,224,120,120,224,224,224,224,120,224,224,224,224, -224,224,224,120,224,224,224,224,120,224,224,224,224,120,224,120, +/* block 253 */ +225,225,225,225,120,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +120,225,225,120,225,120,120,225,120,225,225,225,225,225,225,225, +225,225,225,120,225,225,225,225,120,225,120,225,120,120,120,120, +120,120,225,120,120,120,120,225,120,225,120,225,120,225,225,225, +120,225,225,120,225,120,120,225,120,225,120,225,120,225,120,225, +120,225,225,120,225,120,120,225,225,225,225,120,225,225,225,225, +225,225,225,120,225,225,225,225,120,225,225,225,225,120,225,120, -/* block 247 */ -224,224,224,224,224,224,224,224,224,224,120,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,120,120,120,120, -120,224,224,224,120,224,224,224,224,224,120,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,120,120,120,120, +/* block 254 */ +225,225,225,225,225,225,225,225,225,225,120,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120, +120,225,225,225,120,225,225,225,225,225,120,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 217,217,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 248 */ +/* block 255 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -/* block 249 */ +/* block 256 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970, -970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992, +992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, +992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, +992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970, + 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992, -/* block 250 */ +/* block 257 */ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, @@ -4228,37 +4324,37 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, -/* block 251 */ +/* block 258 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,971,971,971,971,971,971,971,971,971,971, -971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,993,993,993,993,993,993,993,993,993,993, +993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993, -/* block 252 */ -972, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970, +/* block 259 */ +994, 21, 21,992,992,992,992,992,992,992,992,992,992,992,992,992, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, - 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,970,970,970,970, - 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970, -584,584,970,970,970,970,970,970,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, + 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,992,992,992,992, + 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,992, +589,589,992,992,992,992,992,992,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, -/* block 253 */ -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, +/* block 260 */ +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, -/* block 254 */ +/* block 261 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4268,7 +4364,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -/* block 255 */ +/* block 262 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4276,9 +4372,9 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,973,973,973,973,973, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,995,995,995,995,995, -/* block 256 */ +/* block 263 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4288,7 +4384,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -/* block 257 */ +/* block 264 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4298,17 +4394,17 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -/* block 258 */ +/* block 265 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970, + 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992, -/* block 259 */ +/* block 266 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -4316,39 +4412,39 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20,970,970,970,970,970,970,970,970,970,970,970,970, + 20, 20, 20, 20,992,992,992,992,992,992,992,992,992,992,992,992, -/* block 260 */ +/* block 267 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 21, 21, 21, 21,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, + 20, 20, 20, 20, 20, 21, 21, 21, 21,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992, + 21,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, -/* block 261 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970, +/* block 268 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,970, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970, + 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,992,992, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -/* block 262 */ - 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,970, +/* block 269 */ + 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,992,992, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970, - 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992, + 21, 21,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, -/* block 263 */ +/* block 270 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4356,39 +4452,29 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21,970, 21, 21, 21, 21, 21, 21, - -/* block 264 */ - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -/* block 265 */ +/* block 271 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970, - 21, 21, 21, 21, 21,970,970,970, 21, 21, 21,970,970,970,970,970, + 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992, + 21, 21, 21, 21, 21,992,992,992, 21, 21, 21, 21, 21,992,992,992, -/* block 266 */ - 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970, +/* block 272 */ + 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970, - 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970, - 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992, + 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992, + 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992, -/* block 267 */ +/* block 273 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -4398,69 +4484,69 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,120,120,120,120,120,120, -/* block 268 */ -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970, -970,970,970,970,970,970,970,970,970,970,970,970,970,970,120,120, +/* block 274 */ +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992, +992,992,992,992,992,992,992,992,992,992,992,992,992,992,120,120, -/* block 269 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120, +/* block 275 */ +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 270 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,120,120,120,120,120,120,120,120,120,120,120, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +/* block 276 */ +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,120,120,120,120,120,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, -/* block 271 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +/* block 277 */ +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, -/* block 272 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +/* block 278 */ +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, -/* block 273 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +/* block 279 */ +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 274 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120, +/* block 280 */ +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, @@ -4468,37 +4554,37 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 275 */ -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,120,120,120,120,120, +/* block 281 */ +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, +591,591,591,591,591,591,591,591,591,591,591,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 276 */ -511, 24,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, -974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974, +/* block 282 */ +516, 24,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, +996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996, -/* block 277 */ -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +/* block 283 */ +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, -/* block 278 */ +/* block 284 */ 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, @@ -4508,7 +4594,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -/* block 279 */ +/* block 285 */ 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, @@ -4516,17 +4602,17 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */ 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, -511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, - -/* block 280 */ -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,120,120, +516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, + +/* block 286 */ +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,120,120, }; diff --git a/ext/pcre/pcre2lib/pcre2_ucp.h b/ext/pcre/pcre2lib/pcre2_ucp.h index 9538062c710c7..d84f269e8777a 100644 --- a/ext/pcre/pcre2lib/pcre2_ucp.h +++ b/ext/pcre/pcre2lib/pcre2_ucp.h @@ -291,7 +291,13 @@ enum { ucp_Chorasmian, ucp_Dives_Akuru, ucp_Khitan_Small_Script, - ucp_Yezidi + ucp_Yezidi, + /* New for Unicode 14.0.0 */ + ucp_Cypro_Minoan, + ucp_Old_Uyghur, + ucp_Tangsa, + ucp_Toto, + ucp_Vithkuqi }; #endif /* PCRE2_UCP_H_IDEMPOTENT_GUARD */ diff --git a/ext/pcre/pcre2lib/sljit/sljitConfigInternal.h b/ext/pcre/pcre2lib/sljit/sljitConfigInternal.h index ff36e5b7c6250..7bb9990a5965d 100644 --- a/ext/pcre/pcre2lib/sljit/sljitConfigInternal.h +++ b/ext/pcre/pcre2lib/sljit/sljitConfigInternal.h @@ -761,6 +761,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \ (SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS) +/********************************/ +/* CPU status flags management. */ +/********************************/ + +#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \ + || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + || (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \ + || (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC) \ + || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) +#define SLJIT_HAS_STATUS_FLAGS_STATE 1 +#endif + /*************************************/ /* Debug and verbose related macros. */ /*************************************/ diff --git a/ext/pcre/pcre2lib/sljit/sljitLir.c b/ext/pcre/pcre2lib/sljit/sljitLir.c index d817c90b3a3c4..a24a99ab87ee5 100644 --- a/ext/pcre/pcre2lib/sljit/sljitLir.c +++ b/ext/pcre/pcre2lib/sljit/sljitLir.c @@ -532,13 +532,21 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_la put_label->label = label; } +#define SLJIT_CURRENT_FLAGS_ALL \ + (SLJIT_CURRENT_FLAGS_I32_OP | SLJIT_CURRENT_FLAGS_ADD_SUB | SLJIT_CURRENT_FLAGS_COMPARE) + SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags) { SLJIT_UNUSED_ARG(compiler); SLJIT_UNUSED_ARG(current_flags); +#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE) + compiler->status_flags_state = current_flags; +#endif + #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) - if ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_I32_OP | SLJIT_SET_Z)) == 0) { + compiler->last_flags = 0; + if ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_SET_Z | SLJIT_CURRENT_FLAGS_ALL)) == 0) { compiler->last_flags = GET_FLAG_TYPE(current_flags) | (current_flags & (SLJIT_I32_OP | SLJIT_SET_Z)); } #endif @@ -968,7 +976,7 @@ static const char* fop2_names[] = { }; #define JUMP_POSTFIX(type) \ - ((type & 0xff) <= SLJIT_MUL_NOT_OVERFLOW ? ((type & SLJIT_I32_OP) ? "32" : "") \ + ((type & 0xff) <= SLJIT_NOT_OVERFLOW ? ((type & SLJIT_I32_OP) ? "32" : "") \ : ((type & 0xff) <= SLJIT_ORDERED_F64 ? ((type & SLJIT_F32_OP) ? ".f32" : ".f64") : "")) static char* jump_names[] = { @@ -978,7 +986,6 @@ static char* jump_names[] = { (char*)"sig_less", (char*)"sig_greater_equal", (char*)"sig_greater", (char*)"sig_less_equal", (char*)"overflow", (char*)"not_overflow", - (char*)"mul_overflow", (char*)"mul_not_overflow", (char*)"carry", (char*)"", (char*)"equal", (char*)"not_equal", (char*)"less", (char*)"greater_equal", @@ -1278,7 +1285,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler case SLJIT_MUL: CHECK_ARGUMENT(!(op & SLJIT_SET_Z)); CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) - || GET_FLAG_TYPE(op) == SLJIT_MUL_OVERFLOW); + || GET_FLAG_TYPE(op) == SLJIT_OVERFLOW); break; case SLJIT_ADD: CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) @@ -1601,9 +1608,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_jump(struct sljit_compile CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); else CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff) - || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW) - || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW)); - CHECK_ARGUMENT((type & SLJIT_I32_OP) == (compiler->last_flags & SLJIT_I32_OP)); + || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)); } #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) @@ -1818,8 +1823,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct sljit_com CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); else CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff) - || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW) - || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW)); + || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)); FUNCTION_CHECK_DST(dst, dstw, 0); @@ -1858,8 +1862,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmov(struct sljit_compile CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); else CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff) - || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW) - || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW)); + || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { diff --git a/ext/pcre/pcre2lib/sljit/sljitLir.h b/ext/pcre/pcre2lib/sljit/sljitLir.h index 93d28046751ea..0eb62fc21b68d 100644 --- a/ext/pcre/pcre2lib/sljit/sljitLir.h +++ b/ext/pcre/pcre2lib/sljit/sljitLir.h @@ -412,6 +412,10 @@ struct sljit_compiler { /* Executable size for statistical purposes. */ sljit_uw executable_size; +#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE) + sljit_s32 status_flags_state; +#endif + #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) sljit_s32 args; sljit_s32 locals_offset; @@ -460,7 +464,7 @@ struct sljit_compiler { #if (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) /* Need to allocate register save area to make calls. */ - sljit_s32 have_save_area; + sljit_s32 mode; #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) @@ -996,7 +1000,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile #define SLJIT_SUBC (SLJIT_OP2_BASE + 3) #define SLJIT_SUBC32 (SLJIT_SUBC | SLJIT_I32_OP) /* Note: integer mul - Flags: MUL_OVERFLOW */ + Flags: OVERFLOW */ #define SLJIT_MUL (SLJIT_OP2_BASE + 4) #define SLJIT_MUL32 (SLJIT_MUL | SLJIT_I32_OP) /* Flags: Z */ @@ -1141,89 +1145,69 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi /* Integer comparison types. */ #define SLJIT_EQUAL 0 -#define SLJIT_EQUAL32 (SLJIT_EQUAL | SLJIT_I32_OP) -#define SLJIT_ZERO 0 -#define SLJIT_ZERO32 (SLJIT_ZERO | SLJIT_I32_OP) +#define SLJIT_ZERO SLJIT_EQUAL #define SLJIT_NOT_EQUAL 1 -#define SLJIT_NOT_EQUAL32 (SLJIT_NOT_EQUAL | SLJIT_I32_OP) -#define SLJIT_NOT_ZERO 1 -#define SLJIT_NOT_ZERO32 (SLJIT_NOT_ZERO | SLJIT_I32_OP) +#define SLJIT_NOT_ZERO SLJIT_NOT_EQUAL #define SLJIT_LESS 2 -#define SLJIT_LESS32 (SLJIT_LESS | SLJIT_I32_OP) #define SLJIT_SET_LESS SLJIT_SET(SLJIT_LESS) #define SLJIT_GREATER_EQUAL 3 -#define SLJIT_GREATER_EQUAL32 (SLJIT_GREATER_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_GREATER_EQUAL SLJIT_SET(SLJIT_GREATER_EQUAL) #define SLJIT_GREATER 4 -#define SLJIT_GREATER32 (SLJIT_GREATER | SLJIT_I32_OP) #define SLJIT_SET_GREATER SLJIT_SET(SLJIT_GREATER) #define SLJIT_LESS_EQUAL 5 -#define SLJIT_LESS_EQUAL32 (SLJIT_LESS_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_LESS_EQUAL SLJIT_SET(SLJIT_LESS_EQUAL) #define SLJIT_SIG_LESS 6 -#define SLJIT_SIG_LESS32 (SLJIT_SIG_LESS | SLJIT_I32_OP) #define SLJIT_SET_SIG_LESS SLJIT_SET(SLJIT_SIG_LESS) #define SLJIT_SIG_GREATER_EQUAL 7 -#define SLJIT_SIG_GREATER_EQUAL32 (SLJIT_SIG_GREATER_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_SIG_GREATER_EQUAL SLJIT_SET(SLJIT_SIG_GREATER_EQUAL) #define SLJIT_SIG_GREATER 8 -#define SLJIT_SIG_GREATER32 (SLJIT_SIG_GREATER | SLJIT_I32_OP) #define SLJIT_SET_SIG_GREATER SLJIT_SET(SLJIT_SIG_GREATER) #define SLJIT_SIG_LESS_EQUAL 9 -#define SLJIT_SIG_LESS_EQUAL32 (SLJIT_SIG_LESS_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_SIG_LESS_EQUAL SLJIT_SET(SLJIT_SIG_LESS_EQUAL) #define SLJIT_OVERFLOW 10 -#define SLJIT_OVERFLOW32 (SLJIT_OVERFLOW | SLJIT_I32_OP) #define SLJIT_SET_OVERFLOW SLJIT_SET(SLJIT_OVERFLOW) #define SLJIT_NOT_OVERFLOW 11 -#define SLJIT_NOT_OVERFLOW32 (SLJIT_NOT_OVERFLOW | SLJIT_I32_OP) - -#define SLJIT_MUL_OVERFLOW 12 -#define SLJIT_MUL_OVERFLOW32 (SLJIT_MUL_OVERFLOW | SLJIT_I32_OP) -#define SLJIT_SET_MUL_OVERFLOW SLJIT_SET(SLJIT_MUL_OVERFLOW) -#define SLJIT_MUL_NOT_OVERFLOW 13 -#define SLJIT_MUL_NOT_OVERFLOW32 (SLJIT_MUL_NOT_OVERFLOW | SLJIT_I32_OP) /* There is no SLJIT_CARRY or SLJIT_NOT_CARRY. */ -#define SLJIT_SET_CARRY SLJIT_SET(14) +#define SLJIT_SET_CARRY SLJIT_SET(12) /* Floating point comparison types. */ -#define SLJIT_EQUAL_F64 16 +#define SLJIT_EQUAL_F64 14 #define SLJIT_EQUAL_F32 (SLJIT_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_EQUAL_F SLJIT_SET(SLJIT_EQUAL_F64) -#define SLJIT_NOT_EQUAL_F64 17 +#define SLJIT_NOT_EQUAL_F64 15 #define SLJIT_NOT_EQUAL_F32 (SLJIT_NOT_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_NOT_EQUAL_F SLJIT_SET(SLJIT_NOT_EQUAL_F64) -#define SLJIT_LESS_F64 18 +#define SLJIT_LESS_F64 16 #define SLJIT_LESS_F32 (SLJIT_LESS_F64 | SLJIT_F32_OP) #define SLJIT_SET_LESS_F SLJIT_SET(SLJIT_LESS_F64) -#define SLJIT_GREATER_EQUAL_F64 19 +#define SLJIT_GREATER_EQUAL_F64 17 #define SLJIT_GREATER_EQUAL_F32 (SLJIT_GREATER_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_GREATER_EQUAL_F SLJIT_SET(SLJIT_GREATER_EQUAL_F64) -#define SLJIT_GREATER_F64 20 +#define SLJIT_GREATER_F64 18 #define SLJIT_GREATER_F32 (SLJIT_GREATER_F64 | SLJIT_F32_OP) #define SLJIT_SET_GREATER_F SLJIT_SET(SLJIT_GREATER_F64) -#define SLJIT_LESS_EQUAL_F64 21 +#define SLJIT_LESS_EQUAL_F64 19 #define SLJIT_LESS_EQUAL_F32 (SLJIT_LESS_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_LESS_EQUAL_F SLJIT_SET(SLJIT_LESS_EQUAL_F64) -#define SLJIT_UNORDERED_F64 22 +#define SLJIT_UNORDERED_F64 20 #define SLJIT_UNORDERED_F32 (SLJIT_UNORDERED_F64 | SLJIT_F32_OP) #define SLJIT_SET_UNORDERED_F SLJIT_SET(SLJIT_UNORDERED_F64) -#define SLJIT_ORDERED_F64 23 +#define SLJIT_ORDERED_F64 21 #define SLJIT_ORDERED_F32 (SLJIT_ORDERED_F64 | SLJIT_F32_OP) #define SLJIT_SET_ORDERED_F SLJIT_SET(SLJIT_ORDERED_F64) /* Unconditional jump types. */ -#define SLJIT_JUMP 24 +#define SLJIT_JUMP 22 /* Fast calling method. See sljit_emit_fast_enter / SLJIT_FAST_RETURN. */ -#define SLJIT_FAST_CALL 25 +#define SLJIT_FAST_CALL 23 /* Called function must be declared with the SLJIT_FUNC attribute. */ -#define SLJIT_CALL 26 +#define SLJIT_CALL 24 /* Called function must be declared with cdecl attribute. This is the default attribute for C functions. */ -#define SLJIT_CALL_CDECL 27 +#define SLJIT_CALL_CDECL 25 /* The target can be changed during runtime (see: sljit_set_jump_addr). */ #define SLJIT_REWRITABLE_JUMP 0x1000 @@ -1534,8 +1518,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, void *instruction, sljit_s32 size); -/* Define the currently available CPU status flags. It is usually used after an - sljit_emit_op_custom call to define which flags are set. */ +/* Flags were set by a 32 bit operation. */ +#define SLJIT_CURRENT_FLAGS_I32_OP SLJIT_I32_OP + +/* Flags were set by an ADD, ADDC, SUB, SUBC, or NEG operation. */ +#define SLJIT_CURRENT_FLAGS_ADD_SUB 0x01 + +/* Flags were set by a SUB with unused destination. + Must be combined with SLJIT_CURRENT_FLAGS_ADD_SUB. */ +#define SLJIT_CURRENT_FLAGS_COMPARE 0x02 + +/* Define the currently available CPU status flags. It is usually used after + an sljit_emit_label or sljit_emit_op_custom operations to define which CPU + status flags are available. + + The current_flags must be a valid combination of SLJIT_SET_* and + SLJIT_CURRENT_FLAGS_* constants. */ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags); diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeARM_32.c b/ext/pcre/pcre2lib/sljit/sljitNativeARM_32.c index ae8479f0314d9..74cf55fcd28c4 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeARM_32.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeARM_32.c @@ -1197,6 +1197,8 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_ADD: SLJIT_ASSERT(!(flags & INV_IMM)); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; + if ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED)) return push_inst(compiler, CMN | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); return push_inst(compiler, ADD | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); @@ -1207,6 +1209,8 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_SUB: SLJIT_ASSERT(!(flags & INV_IMM)); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; + if ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED)) return push_inst(compiler, CMP | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); return push_inst(compiler, (!(flags & ARGS_SWAPPED) ? SUB : RSB) | (flags & SET_FLAGS) @@ -1220,6 +1224,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_MUL: SLJIT_ASSERT(!(flags & INV_IMM)); SLJIT_ASSERT(!(src2 & SRC2_IMM)); + compiler->status_flags_state = 0; if (!HAS_FLAGS(op)) return push_inst(compiler, MUL | (reg_map[dst] << 16) | (reg_map[src2] << 8) | reg_map[src1]); @@ -2153,16 +2158,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler * /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(sljit_s32 type) +static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: - case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_EQUAL_F64: return 0x00000000; case SLJIT_NOT_EQUAL: - case SLJIT_MUL_OVERFLOW: case SLJIT_NOT_EQUAL_F64: return 0x10000000; @@ -2195,10 +2198,16 @@ static sljit_uw get_cc(sljit_s32 type) return 0xd0000000; case SLJIT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x10000000; + case SLJIT_UNORDERED_F64: return 0x60000000; case SLJIT_NOT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x00000000; + case SLJIT_ORDERED_F64: return 0x70000000; @@ -2242,7 +2251,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (type >= SLJIT_FAST_CALL) PTR_FAIL_IF(prepare_blx(compiler)); PTR_FAIL_IF(push_inst_with_unique_literal(compiler, ((EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, - type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0)) & ~COND_MASK) | get_cc(type), 0)); + type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0)) & ~COND_MASK) | get_cc(compiler, type), 0)); if (jump->flags & SLJIT_REWRITABLE_JUMP) { jump->addr = compiler->size; @@ -2260,7 +2269,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (type >= SLJIT_FAST_CALL) jump->flags |= IS_BL; PTR_FAIL_IF(emit_imm(compiler, TMP_REG1, 0)); - PTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(type))); + PTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(compiler, type))); jump->addr = compiler->size; #endif return jump; @@ -2589,7 +2598,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co ADJUST_LOCAL_OFFSET(dst, dstw); op = GET_OPCODE(op); - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); dst_reg = FAST_IS_REG(dst) ? dst : TMP_REG1; if (op < SLJIT_ADD) { @@ -2629,7 +2638,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil dst_reg &= ~SLJIT_I32_OP; - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { tmp = get_imm(srcw); diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeARM_64.c b/ext/pcre/pcre2lib/sljit/sljitNativeARM_64.c index 52267e7df75ca..3f0f5fcc30b15 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeARM_64.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeARM_64.c @@ -644,6 +644,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s imm = -imm; /* Fall through. */ case SLJIT_ADD: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (imm == 0) { CHECK_FLAGS(1 << 29); return push_inst(compiler, ((op == SLJIT_ADD ? ADDI : SUBI) ^ inv_bits) | RD(dst) | RN(reg)); @@ -781,6 +782,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s break; /* Set flags. */ case SLJIT_NEG: SLJIT_ASSERT(arg1 == TMP_REG1); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (flags & SET_FLAGS) inv_bits |= 1 << 29; return push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(TMP_ZERO) | RM(arg2)); @@ -789,17 +791,20 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s return push_inst(compiler, (CLZ ^ inv_bits) | RD(dst) | RN(arg2)); case SLJIT_ADD: CHECK_FLAGS(1 << 29); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, (ADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_ADDC: CHECK_FLAGS(1 << 29); return push_inst(compiler, (ADC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_SUB: CHECK_FLAGS(1 << 29); + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_SUBC: CHECK_FLAGS(1 << 29); return push_inst(compiler, (SBC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_MUL: + compiler->status_flags_state = 0; if (!(flags & SET_FLAGS)) return push_inst(compiler, (MADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO)); if (flags & INT_OP) { @@ -1600,16 +1605,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler * /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(sljit_s32 type) +static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: - case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_EQUAL_F64: return 0x1; case SLJIT_NOT_EQUAL: - case SLJIT_MUL_OVERFLOW: case SLJIT_NOT_EQUAL_F64: return 0x0; @@ -1642,10 +1645,16 @@ static sljit_uw get_cc(sljit_s32 type) return 0xc; case SLJIT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x0; + case SLJIT_UNORDERED_F64: return 0x7; case SLJIT_NOT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x1; + case SLJIT_ORDERED_F64: return 0x6; @@ -1685,7 +1694,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (type < SLJIT_JUMP) { jump->flags |= IS_COND; - PTR_FAIL_IF(push_inst(compiler, B_CC | (6 << 5) | get_cc(type))); + PTR_FAIL_IF(push_inst(compiler, B_CC | (6 << 5) | get_cc(compiler, type))); } else if (type >= SLJIT_FAST_CALL) jump->flags |= IS_BL; @@ -1799,7 +1808,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); ADJUST_LOCAL_OFFSET(dst, dstw); - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; if (GET_OPCODE(op) < SLJIT_ADD) { @@ -1854,7 +1863,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil srcw = 0; } - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); dst_reg &= ~SLJIT_I32_OP; return push_inst(compiler, (CSEL ^ inv_bits) | (cc << 12) | RD(dst_reg) | RN(dst_reg) | RM(src)); diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeARM_T2_32.c b/ext/pcre/pcre2lib/sljit/sljitNativeARM_T2_32.c index 4624882f424ad..e35dbe99b3a6e 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeARM_T2_32.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeARM_T2_32.c @@ -610,6 +610,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s Although some clever things could be done here, "NOT IMM" does not worth the efforts. */ break; case SLJIT_ADD: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; nimm = -(sljit_sw)imm; if (IS_2_LO_REGS(reg, dst)) { if (imm <= 0x7) @@ -643,6 +644,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s break; case SLJIT_SUB: /* SUB operation can be replaced by ADD because of the negative carry flag. */ + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (flags & ARG1_IMM) { if (imm == 0 && IS_2_LO_REGS(reg, dst)) return push_inst16(compiler, RSBSI | RD3(dst) | RN3(reg)); @@ -801,6 +803,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s FAIL_IF(push_inst32(compiler, CLZ | RN4(arg2) | RD4(dst) | RM4(arg2))); return SLJIT_SUCCESS; case SLJIT_ADD: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (IS_3_LO_REGS(dst, arg1, arg2)) return push_inst16(compiler, ADDS | RD3(dst) | RN3(arg1) | RM3(arg2)); if (dst == arg1 && !(flags & SET_FLAGS)) @@ -811,6 +814,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s return push_inst16(compiler, ADCS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, ADC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_SUB: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (flags & UNUSED_RETURN) { if (IS_2_LO_REGS(arg1, arg2)) return push_inst16(compiler, CMP | RD3(arg1) | RN3(arg2)); @@ -824,6 +828,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s return push_inst16(compiler, SBCS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, SBC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_MUL: + compiler->status_flags_state = 0; if (!(flags & SET_FLAGS)) return push_inst32(compiler, MUL | RD4(dst) | RN4(arg1) | RM4(arg2)); SLJIT_ASSERT(dst != TMP_REG2); @@ -1760,16 +1765,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler * /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(sljit_s32 type) +static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: - case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_EQUAL_F64: return 0x0; case SLJIT_NOT_EQUAL: - case SLJIT_MUL_OVERFLOW: case SLJIT_NOT_EQUAL_F64: return 0x1; @@ -1802,10 +1805,16 @@ static sljit_uw get_cc(sljit_s32 type) return 0xd; case SLJIT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x1; + case SLJIT_UNORDERED_F64: return 0x6; case SLJIT_NOT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return 0x0; + case SLJIT_ORDERED_F64: return 0x7; @@ -1847,7 +1856,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile PTR_FAIL_IF(emit_imm32_const(compiler, TMP_REG1, 0)); if (type < SLJIT_JUMP) { jump->flags |= IS_COND; - cc = get_cc(type); + cc = get_cc(compiler, type); jump->flags |= cc << 8; PTR_FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); } @@ -2177,7 +2186,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co ADJUST_LOCAL_OFFSET(dst, dstw); op = GET_OPCODE(op); - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; if (op < SLJIT_ADD) { @@ -2229,7 +2238,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil dst_reg &= ~SLJIT_I32_OP; - cc = get_cc(type & 0xff); + cc = get_cc(compiler, type & 0xff); if (!(src & SLJIT_IMM)) { FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_32.c b/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_32.c index f887ee13117b2..a90345f1f8062 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_32.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_32.c @@ -367,7 +367,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_MUL: SLJIT_ASSERT(!(flags & SRC2_IMM)); - if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) { + if (GET_FLAG_TYPE(op) != SLJIT_OVERFLOW) { #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst)); #else /* SLJIT_MIPS_REV < 1 */ diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_64.c b/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_64.c index 5ab9b7d06b2ba..1f22e49ed9847 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_64.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_64.c @@ -458,7 +458,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_MUL: SLJIT_ASSERT(!(flags & SRC2_IMM)); - if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) { + if (GET_FLAG_TYPE(op) != SLJIT_OVERFLOW) { #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6) return push_inst(compiler, SELECT_OP(DMUL, MUL) | S(src1) | T(src2) | D(dst), DR(dst)); #elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_common.c b/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_common.c index ecf4dac4c86d4..fd747695a72ba 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_common.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeMIPS_common.c @@ -1377,6 +1377,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); case SLJIT_NEG: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), flags | IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw); case SLJIT_CLZ: @@ -1424,13 +1425,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile switch (GET_OPCODE(op)) { case SLJIT_ADD: case SLJIT_ADDC: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_SUB: case SLJIT_SUBC: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_MUL: + compiler->status_flags_state = 0; return emit_op(compiler, op, flags | CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_AND: @@ -1860,7 +1864,6 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile case SLJIT_SIG_LESS: case SLJIT_SIG_GREATER: case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: BR_Z(OTHER_FLAG); break; case SLJIT_GREATER_EQUAL: @@ -1868,7 +1871,6 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile case SLJIT_SIG_GREATER_EQUAL: case SLJIT_SIG_LESS_EQUAL: case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: BR_NZ(OTHER_FLAG); break; case SLJIT_NOT_EQUAL_F64: @@ -2127,8 +2129,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co FAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(dst_ar) | IMM(1), dst_ar)); src_ar = dst_ar; break; - case SLJIT_MUL_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: + case SLJIT_OVERFLOW: + case SLJIT_NOT_OVERFLOW: + if (compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB) { + src_ar = OTHER_FLAG; + break; + } FAIL_IF(push_inst(compiler, SLTIU | SA(OTHER_FLAG) | TA(dst_ar) | IMM(1), dst_ar)); src_ar = dst_ar; type ^= 0x1; /* Flip type bit for the XORI below. */ @@ -2219,7 +2225,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil case SLJIT_SIG_LESS: case SLJIT_SIG_GREATER: case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: ins = MOVN | TA(OTHER_FLAG); break; case SLJIT_GREATER_EQUAL: @@ -2227,7 +2232,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil case SLJIT_SIG_GREATER_EQUAL: case SLJIT_SIG_LESS_EQUAL: case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: ins = MOVZ | TA(OTHER_FLAG); break; case SLJIT_EQUAL_F64: diff --git a/ext/pcre/pcre2lib/sljit/sljitNativePPC_32.c b/ext/pcre/pcre2lib/sljit/sljitNativePPC_32.c index 7d9ec5338f72d..6ddb5508ec0b1 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativePPC_32.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativePPC_32.c @@ -119,9 +119,10 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl SLJIT_ASSERT(src2 == TMP_REG2); return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm); } + SLJIT_ASSERT(!(flags & ALT_FORM4)); if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2)); - if (flags & ALT_FORM4) + if (flags & ALT_FORM5) return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)); return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2)); @@ -143,24 +144,29 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl } if (flags & ALT_FORM2) { + if (flags & ALT_FORM3) { + FAIL_IF(push_inst(compiler, CMPI | CRD(0) | A(src1) | compiler->imm)); + if (!(flags & ALT_FORM4)) + return SLJIT_SUCCESS; + return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff)); + } + FAIL_IF(push_inst(compiler, CMP | CRD(0) | A(src1) | B(src2))); + if (!(flags & ALT_FORM4)) + return SLJIT_SUCCESS; + return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); + } + + if (flags & ALT_FORM3) { /* Setting XER SO is not enough, CR SO is also needed. */ return push_inst(compiler, SUBF | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1)); } - if (flags & ALT_FORM3) { + if (flags & ALT_FORM4) { /* Flags does not set: BIN_IMM_EXTS unnecessary. */ SLJIT_ASSERT(src2 == TMP_REG2); return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm); } - if (flags & ALT_FORM4) { - if (flags & ALT_FORM5) { - SLJIT_ASSERT(src2 == TMP_REG2); - return push_inst(compiler, CMPI | CRD(0) | A(src1) | compiler->imm); - } - return push_inst(compiler, CMP | CRD(0) | A(src1) | B(src2)); - } - if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); if (flags & ALT_FORM5) diff --git a/ext/pcre/pcre2lib/sljit/sljitNativePPC_64.c b/ext/pcre/pcre2lib/sljit/sljitNativePPC_64.c index 92147d2a5d77c..cbdf2dd8a2b14 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativePPC_64.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativePPC_64.c @@ -252,10 +252,17 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl BIN_IMM_EXTS(); return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm); } + if (flags & ALT_FORM4) { + if (flags & ALT_FORM5) + FAIL_IF(push_inst(compiler, ADDI | D(dst) | A(src1) | compiler->imm)); + else + FAIL_IF(push_inst(compiler, ADD | D(dst) | A(src1) | B(src2))); + return push_inst(compiler, CMPI | A(dst) | 0); + } if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2)); BIN_EXTS(); - if (flags & ALT_FORM4) + if (flags & ALT_FORM5) return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)); return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2)); @@ -278,6 +285,19 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl } if (flags & ALT_FORM2) { + if (flags & ALT_FORM3) { + FAIL_IF(push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm)); + if (!(flags & ALT_FORM4)) + return SLJIT_SUCCESS; + return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff)); + } + FAIL_IF(push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2))); + if (!(flags & ALT_FORM4)) + return SLJIT_SUCCESS; + return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); + } + + if (flags & ALT_FORM3) { if (flags & ALT_SIGN_EXT) { FAIL_IF(push_inst(compiler, RLDI(TMP_REG1, src1, 32, 31, 1))); src1 = TMP_REG1; @@ -291,20 +311,12 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl return SLJIT_SUCCESS; } - if (flags & ALT_FORM3) { + if (flags & ALT_FORM4) { /* Flags does not set: BIN_IMM_EXTS unnecessary. */ SLJIT_ASSERT(src2 == TMP_REG2); return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm); } - if (flags & ALT_FORM4) { - if (flags & ALT_FORM5) { - SLJIT_ASSERT(src2 == TMP_REG2); - return push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm); - } - return push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2)); - } - if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); BIN_EXTS(); diff --git a/ext/pcre/pcre2lib/sljit/sljitNativePPC_common.c b/ext/pcre/pcre2lib/sljit/sljitNativePPC_common.c index d84562ce095ef..2174dbb07b2f3 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativePPC_common.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativePPC_common.c @@ -1324,6 +1324,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile ((src) & SLJIT_IMM) #endif +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define TEST_ADD_FORM1(op) \ + (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \ + || (op & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_I32_OP | SLJIT_SET_Z | SLJIT_SET_CARRY)) +#define TEST_SUB_FORM2(op) \ + ((GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) \ + || (op & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_I32_OP | SLJIT_SET_Z)) +#define TEST_SUB_FORM3(op) \ + (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \ + || (op & (SLJIT_I32_OP | SLJIT_SET_Z)) == (SLJIT_I32_OP | SLJIT_SET_Z)) +#else +#define TEST_ADD_FORM1(op) \ + (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) +#define TEST_SUB_FORM2(op) \ + (GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) +#define TEST_SUB_FORM3(op) \ + (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) +#endif + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, @@ -1362,7 +1381,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile switch (GET_OPCODE(op)) { case SLJIT_ADD: - if (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) + if (TEST_ADD_FORM1(op)) return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w); if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) { @@ -1392,6 +1411,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src2, src2w, TMP_REG2, 0); } } + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if ((op & (SLJIT_I32_OP | SLJIT_SET_Z)) == (SLJIT_I32_OP | SLJIT_SET_Z)) { + if (TEST_SL_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_SL_IMM(src1, src1w)) { + compiler->imm = src1w & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src2, src2w, TMP_REG2, 0); + } + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w); + } +#endif if (HAS_FLAGS(op)) { if (TEST_SL_IMM(src2, src2w)) { compiler->imm = src2w & 0xffff; @@ -1402,7 +1435,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0); } } - return emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM4 : 0), dst, dstw, src1, src1w, src2, src2w); + return emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w); case SLJIT_ADDC: return emit_op(compiler, SLJIT_ADDC, flags, dst, dstw, src1, src1w, src2, src2w); @@ -1424,18 +1457,36 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM3, dst, dstw, src1, src1w, src2, src2w); } - if (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) + if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) { + if (TEST_SL_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); + } return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2, dst, dstw, src1, src1w, src2, src2w); + } - if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) { - if (TEST_SL_IMM(src2, -src2w)) { - compiler->imm = (-src2w) & 0xffff; - return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0); - } - if (TEST_SL_IMM(src1, src1w)) { - compiler->imm = src1w & 0xffff; - return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0); + if (TEST_SUB_FORM2(op)) { + if ((src2 & SLJIT_IMM) && src2w >= -SIMM_MAX && src2w <= SIMM_MAX) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM3 | ALT_FORM4, dst, dstw, src1, src1w, TMP_REG2, 0); } + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w); + } + + if (TEST_SUB_FORM3(op)) + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src1, src1w, src2, src2w); + + if (TEST_SL_IMM(src2, -src2w)) { + compiler->imm = (-src2w) & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | (!HAS_FLAGS(op) ? ALT_FORM2 : ALT_FORM3), dst, dstw, src1, src1w, TMP_REG2, 0); + } + + if (TEST_SL_IMM(src1, src1w) && !(op & SLJIT_SET_Z)) { + compiler->imm = src1w & 0xffff; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4, dst, dstw, src2, src2w, TMP_REG2, 0); + } + + if (!HAS_FLAGS(op)) { if (TEST_SH_IMM(src2, -src2w)) { compiler->imm = ((-src2w) >> 16) & 0xffff; return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); @@ -1447,18 +1498,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile } } - if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) != GET_FLAG_TYPE(SLJIT_SET_CARRY)) { - if (TEST_SL_IMM(src2, src2w)) { - compiler->imm = src2w & 0xffff; - return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src1, src1w, TMP_REG2, 0); - } - return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w); - } - - if (TEST_SL_IMM(src2, -src2w)) { - compiler->imm = (-src2w) & 0xffff; - return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); - } /* We know ALT_SIGN_EXT is set if it is an SLJIT_I32_OP on 64 bit systems. */ return emit_op(compiler, SLJIT_SUB, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w); @@ -1536,6 +1575,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return SLJIT_SUCCESS; } +#undef TEST_ADD_FORM1 +#undef TEST_SUB_FORM2 +#undef TEST_SUB_FORM3 + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) { @@ -1941,11 +1984,9 @@ static sljit_ins get_bo_bi_flags(sljit_s32 type) return (4 << 21) | ((4 + 1) << 16); case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: return (12 << 21) | (3 << 16); case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: return (4 << 21) | (3 << 16); case SLJIT_EQUAL_F64: @@ -2143,12 +2184,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co break; case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: cr_bit = 3; break; case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: cr_bit = 3; invert = 1; break; diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeS390X.c b/ext/pcre/pcre2lib/sljit/sljitNativeS390X.c index 3d007fe8a11f1..716491ec72de5 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeS390X.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeS390X.c @@ -45,7 +45,7 @@ typedef sljit_uw sljit_ins; static const sljit_ins sljit_ins_const = (sljit_ins)1 << 48; static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = { - 14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1 + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1 }; /* there are also a[2-15] available, but they are slower to access and @@ -120,8 +120,7 @@ struct sljit_s390x_const { /* Convert SLJIT register to hardware register. */ static SLJIT_INLINE sljit_gpr gpr(sljit_s32 r) { - SLJIT_ASSERT(r != SLJIT_UNUSED); - SLJIT_ASSERT(r < (sljit_s32)(sizeof(reg_map) / sizeof(reg_map[0]))); + SLJIT_ASSERT(r >= 0 && r < (sljit_s32)(sizeof(reg_map) / sizeof(reg_map[0]))); return reg_map[r]; } @@ -172,51 +171,93 @@ static sljit_s32 encode_inst(void **ptr, sljit_ins ins) return SLJIT_SUCCESS; } +#define SLJIT_ADD_SUB_NO_COMPARE(status_flags_state) \ + (((status_flags_state) & (SLJIT_CURRENT_FLAGS_ADD_SUB | SLJIT_CURRENT_FLAGS_COMPARE)) == SLJIT_CURRENT_FLAGS_ADD_SUB) + /* Map the given type to a 4-bit condition code mask. */ -static SLJIT_INLINE sljit_u8 get_cc(sljit_s32 type) { - const sljit_u8 eq = 1 << 3; /* equal {,to zero} */ - const sljit_u8 lt = 1 << 2; /* less than {,zero} */ - const sljit_u8 gt = 1 << 1; /* greater than {,zero} */ - const sljit_u8 ov = 1 << 0; /* {overflow,NaN} */ +static SLJIT_INLINE sljit_u8 get_cc(struct sljit_compiler *compiler, sljit_s32 type) { + const sljit_u8 cc0 = 1 << 3; /* equal {,to zero} */ + const sljit_u8 cc1 = 1 << 2; /* less than {,zero} */ + const sljit_u8 cc2 = 1 << 1; /* greater than {,zero} */ + const sljit_u8 cc3 = 1 << 0; /* {overflow,NaN} */ switch (type) { case SLJIT_EQUAL: + if (SLJIT_ADD_SUB_NO_COMPARE(compiler->status_flags_state)) { + sljit_s32 type = GET_FLAG_TYPE(compiler->status_flags_state); + if (type >= SLJIT_SIG_LESS && type <= SLJIT_SIG_LESS_EQUAL) + return cc0; + if (type == SLJIT_OVERFLOW) + return (cc0 | cc3); + return (cc0 | cc2); + } + case SLJIT_EQUAL_F64: - return eq; + return cc0; case SLJIT_NOT_EQUAL: + if (SLJIT_ADD_SUB_NO_COMPARE(compiler->status_flags_state)) { + sljit_s32 type = GET_FLAG_TYPE(compiler->status_flags_state); + if (type >= SLJIT_SIG_LESS && type <= SLJIT_SIG_LESS_EQUAL) + return (cc1 | cc2 | cc3); + if (type == SLJIT_OVERFLOW) + return (cc1 | cc2); + return (cc1 | cc3); + } + case SLJIT_NOT_EQUAL_F64: - return ~eq; + return (cc1 | cc2 | cc3); case SLJIT_LESS: + return cc1; + + case SLJIT_GREATER_EQUAL: + return (cc0 | cc2 | cc3); + + case SLJIT_GREATER: + if (compiler->status_flags_state & SLJIT_CURRENT_FLAGS_COMPARE) + return cc2; + return cc3; + + case SLJIT_LESS_EQUAL: + if (compiler->status_flags_state & SLJIT_CURRENT_FLAGS_COMPARE) + return (cc0 | cc1); + return (cc0 | cc1 | cc2); + case SLJIT_SIG_LESS: case SLJIT_LESS_F64: - return lt; + return cc1; - case SLJIT_LESS_EQUAL: case SLJIT_SIG_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64: - return (lt | eq); + return (cc0 | cc1); - case SLJIT_GREATER: case SLJIT_SIG_GREATER: - case SLJIT_GREATER_F64: - return gt; + /* Overflow is considered greater, see SLJIT_SUB. */ + return cc2 | cc3; - case SLJIT_GREATER_EQUAL: case SLJIT_SIG_GREATER_EQUAL: - case SLJIT_GREATER_EQUAL_F64: - return (gt | eq); + return (cc0 | cc2 | cc3); case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: + if (compiler->status_flags_state & SLJIT_SET_Z) + return (cc2 | cc3); + case SLJIT_UNORDERED_F64: - return ov; + return cc3; case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: + if (compiler->status_flags_state & SLJIT_SET_Z) + return (cc0 | cc1); + case SLJIT_ORDERED_F64: - return ~ov; + return (cc0 | cc1 | cc2); + + case SLJIT_GREATER_F64: + return cc2; + + case SLJIT_GREATER_EQUAL_F64: + return (cc0 | cc2); } SLJIT_UNREACHABLE(); @@ -346,19 +387,20 @@ HAVE_FACILITY(have_misc2, MISCELLANEOUS_INSTRUCTION_EXTENSIONS_2_FACILITY) #define is_u32(d) (0 <= (d) && (d) <= 0xffffffffL) #define CHECK_SIGNED(v, bitlen) \ - ((v) == (((v) << (sizeof(v) * 8 - bitlen)) >> (sizeof(v) * 8 - bitlen))) + ((v) >= -(1 << ((bitlen) - 1)) && (v) < (1 << ((bitlen) - 1))) +#define is_s8(d) CHECK_SIGNED((d), 8) #define is_s16(d) CHECK_SIGNED((d), 16) #define is_s20(d) CHECK_SIGNED((d), 20) -#define is_s32(d) CHECK_SIGNED((d), 32) +#define is_s32(d) ((d) == (sljit_s32)(d)) -static SLJIT_INLINE sljit_uw disp_s20(sljit_s32 d) +static SLJIT_INLINE sljit_ins disp_s20(sljit_s32 d) { + SLJIT_ASSERT(is_s20(d)); + sljit_uw dh = (d >> 12) & 0xff; sljit_uw dl = (d << 8) & 0xfff00; - - SLJIT_ASSERT(is_s20(d)); - return dh | dl; + return (dh | dl) << 8; } /* TODO(carenas): variadic macro is not strictly needed */ @@ -372,12 +414,6 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src) \ return (pattern) | ((dst & 0xf) << 4) | (src & 0xf); \ } -/* ADD */ -SLJIT_S390X_RR(ar, 0x1a00) - -/* ADD LOGICAL */ -SLJIT_S390X_RR(alr, 0x1e00) - /* AND */ SLJIT_S390X_RR(nr, 0x1400) @@ -387,12 +423,6 @@ SLJIT_S390X_RR(basr, 0x0d00) /* BRANCH ON CONDITION */ SLJIT_S390X_RR(bcr, 0x0700) /* TODO(mundaym): type for mask? */ -/* COMPARE */ -SLJIT_S390X_RR(cr, 0x1900) - -/* COMPARE LOGICAL */ -SLJIT_S390X_RR(clr, 0x1500) - /* DIVIDE */ SLJIT_S390X_RR(dr, 0x1d00) @@ -408,12 +438,6 @@ SLJIT_S390X_RR(lcr, 0x1300) /* OR */ SLJIT_S390X_RR(or, 0x1600) -/* SUBTRACT */ -SLJIT_S390X_RR(sr, 0x1b00) - -/* SUBTRACT LOGICAL */ -SLJIT_S390X_RR(slr, 0x1f00) - #undef SLJIT_S390X_RR /* RRE form instructions */ @@ -423,25 +447,9 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src) \ return (pattern) | ((dst & 0xf) << 4) | (src & 0xf); \ } -/* ADD */ -SLJIT_S390X_RRE(agr, 0xb9080000) - -/* ADD LOGICAL */ -SLJIT_S390X_RRE(algr, 0xb90a0000) - -/* ADD LOGICAL WITH CARRY */ -SLJIT_S390X_RRE(alcr, 0xb9980000) -SLJIT_S390X_RRE(alcgr, 0xb9880000) - /* AND */ SLJIT_S390X_RRE(ngr, 0xb9800000) -/* COMPARE */ -SLJIT_S390X_RRE(cgr, 0xb9200000) - -/* COMPARE LOGICAL */ -SLJIT_S390X_RRE(clgr, 0xb9210000) - /* DIVIDE LOGICAL */ SLJIT_S390X_RRE(dlr, 0xb9970000) SLJIT_S390X_RRE(dlgr, 0xb9870000) @@ -482,8 +490,6 @@ SLJIT_S390X_RRE(llghr, 0xb9850000) SLJIT_S390X_RRE(mlgr, 0xb9860000) /* MULTIPLY SINGLE */ -SLJIT_S390X_RRE(msr, 0xb2520000) -SLJIT_S390X_RRE(msgr, 0xb90c0000) SLJIT_S390X_RRE(msgfr, 0xb91c0000) /* OR */ @@ -492,13 +498,6 @@ SLJIT_S390X_RRE(ogr, 0xb9810000) /* SUBTRACT */ SLJIT_S390X_RRE(sgr, 0xb9090000) -/* SUBTRACT LOGICAL */ -SLJIT_S390X_RRE(slgr, 0xb90b0000) - -/* SUBTRACT LOGICAL WITH BORROW */ -SLJIT_S390X_RRE(slbr, 0xb9990000) -SLJIT_S390X_RRE(slbgr, 0xb9890000) - #undef SLJIT_S390X_RRE /* RI-a form instructions */ @@ -509,13 +508,8 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, imm_type imm) \ } /* ADD HALFWORD IMMEDIATE */ -SLJIT_S390X_RIA(ahi, 0xa70a0000, sljit_s16) SLJIT_S390X_RIA(aghi, 0xa70b0000, sljit_s16) -/* COMPARE HALFWORD IMMEDIATE */ -SLJIT_S390X_RIA(chi, 0xa70e0000, sljit_s16) -SLJIT_S390X_RIA(cghi, 0xa70f0000, sljit_s16) - /* LOAD HALFWORD IMMEDIATE */ SLJIT_S390X_RIA(lhi, 0xa7080000, sljit_s16) SLJIT_S390X_RIA(lghi, 0xa7090000, sljit_s16) @@ -533,9 +527,6 @@ SLJIT_S390X_RIA(mghi, 0xa70d0000, sljit_s16) /* OR IMMEDIATE */ SLJIT_S390X_RIA(oilh, 0xa50a0000, sljit_u16) -/* TEST UNDER MASK */ -SLJIT_S390X_RIA(tmlh, 0xa7000000, sljit_u16) - #undef SLJIT_S390X_RIA /* RIL-a form instructions (requires extended immediate facility) */ @@ -547,30 +538,13 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, imm_type imm) \ } /* ADD IMMEDIATE */ -SLJIT_S390X_RILA(afi, 0xc20900000000, sljit_s32) SLJIT_S390X_RILA(agfi, 0xc20800000000, sljit_s32) /* ADD IMMEDIATE HIGH */ SLJIT_S390X_RILA(aih, 0xcc0800000000, sljit_s32) /* TODO(mundaym): high-word facility? */ -/* ADD LOGICAL IMMEDIATE */ -SLJIT_S390X_RILA(alfi, 0xc20b00000000, sljit_u32) -SLJIT_S390X_RILA(algfi, 0xc20a00000000, sljit_u32) - /* AND IMMEDIATE */ SLJIT_S390X_RILA(nihf, 0xc00a00000000, sljit_u32) -SLJIT_S390X_RILA(nilf, 0xc00b00000000, sljit_u32) - -/* COMPARE IMMEDIATE */ -SLJIT_S390X_RILA(cfi, 0xc20d00000000, sljit_s32) -SLJIT_S390X_RILA(cgfi, 0xc20c00000000, sljit_s32) - -/* COMPARE IMMEDIATE HIGH */ -SLJIT_S390X_RILA(cih, 0xcc0d00000000, sljit_s32) /* TODO(mundaym): high-word facility? */ - -/* COMPARE LOGICAL IMMEDIATE */ -SLJIT_S390X_RILA(clfi, 0xc20f00000000, sljit_u32) -SLJIT_S390X_RILA(clgfi, 0xc20e00000000, sljit_u32) /* EXCLUSIVE OR IMMEDIATE */ SLJIT_S390X_RILA(xilf, 0xc00700000000, sljit_u32) @@ -586,8 +560,8 @@ SLJIT_S390X_RILA(lgfi, 0xc00100000000, sljit_s32) SLJIT_S390X_RILA(llihf, 0xc00e00000000, sljit_u32) SLJIT_S390X_RILA(llilf, 0xc00f00000000, sljit_u32) -/* OR IMMEDIATE */ -SLJIT_S390X_RILA(oilf, 0xc00d00000000, sljit_u32) +/* SUBTRACT LOGICAL IMMEDIATE */ +SLJIT_S390X_RILA(slfi, 0xc20500000000, sljit_u32) #undef SLJIT_S390X_RILA @@ -606,18 +580,6 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr r, sljit_u16 d, sljit_gpr x, sljit_gpr b return (pattern) | ri | xi | bi | di; \ } -/* ADD */ -SLJIT_S390X_RXA(a, 0x5a000000) - -/* ADD LOGICAL */ -SLJIT_S390X_RXA(al, 0x5e000000) - -/* AND */ -SLJIT_S390X_RXA(n, 0x54000000) - -/* EXCLUSIVE OR */ -SLJIT_S390X_RXA(x, 0x57000000) - /* LOAD */ SLJIT_S390X_RXA(l, 0x58000000) @@ -630,9 +592,6 @@ SLJIT_S390X_RXA(lh, 0x48000000) /* MULTIPLY SINGLE */ SLJIT_S390X_RXA(ms, 0x71000000) -/* OR */ -SLJIT_S390X_RXA(o, 0x56000000) - /* STORE */ SLJIT_S390X_RXA(st, 0x50000000) @@ -642,12 +601,6 @@ SLJIT_S390X_RXA(stc, 0x42000000) /* STORE HALFWORD */ SLJIT_S390X_RXA(sth, 0x40000000) -/* SUBTRACT */ -SLJIT_S390X_RXA(s, 0x5b000000) - -/* SUBTRACT LOGICAL */ -SLJIT_S390X_RXA(sl, 0x5f000000) - #undef SLJIT_S390X_RXA /* RXY-a instructions */ @@ -660,31 +613,11 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b ri = (sljit_ins)(r & 0xf) << 36; \ xi = (sljit_ins)(x & 0xf) << 32; \ bi = (sljit_ins)(b & 0xf) << 28; \ - di = (sljit_ins)disp_s20(d) << 8; \ + di = disp_s20(d); \ \ return (pattern) | ri | xi | bi | di; \ } -/* ADD */ -SLJIT_S390X_RXYA(ay, 0xe3000000005a, have_ldisp()) -SLJIT_S390X_RXYA(ag, 0xe30000000008, 1) - -/* ADD LOGICAL */ -SLJIT_S390X_RXYA(aly, 0xe3000000005e, have_ldisp()) -SLJIT_S390X_RXYA(alg, 0xe3000000000a, 1) - -/* ADD LOGICAL WITH CARRY */ -SLJIT_S390X_RXYA(alc, 0xe30000000098, 1) -SLJIT_S390X_RXYA(alcg, 0xe30000000088, 1) - -/* AND */ -SLJIT_S390X_RXYA(ny, 0xe30000000054, have_ldisp()) -SLJIT_S390X_RXYA(ng, 0xe30000000080, 1) - -/* EXCLUSIVE OR */ -SLJIT_S390X_RXYA(xy, 0xe30000000057, have_ldisp()) -SLJIT_S390X_RXYA(xg, 0xe30000000082, 1) - /* LOAD */ SLJIT_S390X_RXYA(ly, 0xe30000000058, have_ldisp()) SLJIT_S390X_RXYA(lg, 0xe30000000004, 1) @@ -713,10 +646,6 @@ SLJIT_S390X_RXYA(llgh, 0xe30000000091, 1) SLJIT_S390X_RXYA(msy, 0xe30000000051, have_ldisp()) SLJIT_S390X_RXYA(msg, 0xe3000000000c, 1) -/* OR */ -SLJIT_S390X_RXYA(oy, 0xe30000000056, have_ldisp()) -SLJIT_S390X_RXYA(og, 0xe30000000081, 1) - /* STORE */ SLJIT_S390X_RXYA(sty, 0xe30000000050, have_ldisp()) SLJIT_S390X_RXYA(stg, 0xe30000000024, 1) @@ -727,41 +656,8 @@ SLJIT_S390X_RXYA(stcy, 0xe30000000072, have_ldisp()) /* STORE HALFWORD */ SLJIT_S390X_RXYA(sthy, 0xe30000000070, have_ldisp()) -/* SUBTRACT */ -SLJIT_S390X_RXYA(sy, 0xe3000000005b, have_ldisp()) -SLJIT_S390X_RXYA(sg, 0xe30000000009, 1) - -/* SUBTRACT LOGICAL */ -SLJIT_S390X_RXYA(sly, 0xe3000000005f, have_ldisp()) -SLJIT_S390X_RXYA(slg, 0xe3000000000b, 1) - -/* SUBTRACT LOGICAL WITH BORROW */ -SLJIT_S390X_RXYA(slb, 0xe30000000099, 1) -SLJIT_S390X_RXYA(slbg, 0xe30000000089, 1) - #undef SLJIT_S390X_RXYA -/* RS-a instructions */ -#define SLJIT_S390X_RSA(name, pattern) \ -SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, sljit_sw d, sljit_gpr b) \ -{ \ - sljit_ins r1 = (sljit_ins)(reg & 0xf) << 20; \ - sljit_ins b2 = (sljit_ins)(b & 0xf) << 12; \ - sljit_ins d2 = (sljit_ins)(d & 0xfff); \ - return (pattern) | r1 | b2 | d2; \ -} - -/* SHIFT LEFT SINGLE LOGICAL */ -SLJIT_S390X_RSA(sll, 0x89000000) - -/* SHIFT RIGHT SINGLE */ -SLJIT_S390X_RSA(sra, 0x8a000000) - -/* SHIFT RIGHT SINGLE LOGICAL */ -SLJIT_S390X_RSA(srl, 0x88000000) - -#undef SLJIT_S390X_RSA - /* RSY-a instructions */ #define SLJIT_S390X_RSYA(name, pattern, cond) \ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_sw d, sljit_gpr b) \ @@ -772,7 +668,7 @@ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_sw d, sljit_gp r1 = (sljit_ins)(dst & 0xf) << 36; \ r3 = (sljit_ins)(src & 0xf) << 32; \ b2 = (sljit_ins)(b & 0xf) << 28; \ - d2 = (sljit_ins)disp_s20(d) << 8; \ + d2 = disp_s20(d); \ \ return (pattern) | r1 | r3 | b2 | d2; \ } @@ -786,9 +682,6 @@ SLJIT_S390X_RSYA(sllg, 0xeb000000000d, 1) /* SHIFT RIGHT SINGLE */ SLJIT_S390X_RSYA(srag, 0xeb000000000a, 1) -/* SHIFT RIGHT SINGLE LOGICAL */ -SLJIT_S390X_RSYA(srlg, 0xeb000000000c, 1) - /* STORE MULTIPLE */ SLJIT_S390X_RSYA(stmg, 0xeb0000000024, 1) @@ -831,26 +724,6 @@ SLJIT_S390X_RIEF(risbhg, 0xec000000005d) #undef SLJIT_S390X_RIEF -/* RRF-a instructions */ -#define SLJIT_S390X_RRFA(name, pattern, cond) \ -SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src1, sljit_gpr src2) \ -{ \ - sljit_ins r1, r2, r3; \ -\ - SLJIT_ASSERT(cond); \ - r1 = (sljit_ins)(dst & 0xf) << 4; \ - r2 = (sljit_ins)(src1 & 0xf); \ - r3 = (sljit_ins)(src2 & 0xf) << 12; \ -\ - return (pattern) | r3 | r1 | r2; \ -} - -/* MULTIPLY */ -SLJIT_S390X_RRFA(msrkc, 0xb9fd0000, have_misc2()) -SLJIT_S390X_RRFA(msgrkc, 0xb9ed0000, have_misc2()) - -#undef SLJIT_S390X_RRFA - /* RRF-c instructions (require load/store-on-condition 1 facility) */ #define SLJIT_S390X_RRFC(name, pattern) \ SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_uw mask) \ @@ -919,6 +792,13 @@ SLJIT_S390X_INSTRUCTION(br, sljit_gpr target) return 0x07f0 | target; } +SLJIT_S390X_INSTRUCTION(brc, sljit_uw mask, sljit_sw target) +{ + sljit_ins m1 = (sljit_ins)(mask & 0xf) << 20; + sljit_ins ri2 = (sljit_ins)target & 0xffff; + return 0xa7040000L | m1 | ri2; +} + SLJIT_S390X_INSTRUCTION(brcl, sljit_uw mask, sljit_sw target) { sljit_ins m1 = (sljit_ins)(mask & 0xf) << 36; @@ -940,6 +820,12 @@ SLJIT_S390X_INSTRUCTION(ipm, sljit_gpr dst) return 0xb2220000 | ((sljit_ins)(dst & 0xf) << 4); } +/* SET PROGRAM MASK */ +SLJIT_S390X_INSTRUCTION(spm, sljit_gpr dst) +{ + return 0x0400 | ((sljit_ins)(dst & 0xf) << 4); +} + /* ROTATE THEN INSERT SELECTED BITS HIGH (ZERO) */ SLJIT_S390X_INSTRUCTION(risbhgz, sljit_gpr dst, sljit_gpr src, sljit_u8 start, sljit_u8 end, sljit_u8 rot) { @@ -948,30 +834,20 @@ SLJIT_S390X_INSTRUCTION(risbhgz, sljit_gpr dst, sljit_gpr src, sljit_u8 start, s #undef SLJIT_S390X_INSTRUCTION -/* load condition code as needed to match type */ -static sljit_s32 push_load_cc(struct sljit_compiler *compiler, sljit_s32 type) +static sljit_s32 update_zero_overflow(struct sljit_compiler *compiler, sljit_s32 op, sljit_gpr dst_r) { - type &= ~SLJIT_I32_OP; - switch (type) { - case SLJIT_ZERO: - case SLJIT_NOT_ZERO: - return push_inst(compiler, cih(flag_r, 0)); - break; - default: - return push_inst(compiler, tmlh(flag_r, 0x3000)); - break; - } - return SLJIT_SUCCESS; -} - -static sljit_s32 push_store_zero_flag(struct sljit_compiler *compiler, sljit_s32 op, sljit_gpr source) -{ - /* insert low 32-bits into high 32-bits of flag register */ - FAIL_IF(push_inst(compiler, risbhgz(flag_r, source, 0, 31, 32))); - if (!(op & SLJIT_I32_OP)) { - /* OR high 32-bits with high 32-bits of flag register */ - return push_inst(compiler, rosbg(flag_r, source, 0, 31, 0)); - } + /* Condition codes: bits 18 and 19. + Transformation: + 0 (zero and no overflow) : unchanged + 1 (non-zero and no overflow) : unchanged + 2 (zero and overflow) : decreased by 1 + 3 (non-zero and overflow) : decreased by 1 if non-zero */ + FAIL_IF(push_inst(compiler, brc(0xc, 2 + 2 + ((op & SLJIT_I32_OP) ? 1 : 2) + 2 + 3 + 1))); + FAIL_IF(push_inst(compiler, ipm(flag_r))); + FAIL_IF(push_inst(compiler, (op & SLJIT_I32_OP) ? or(dst_r, dst_r) : ogr(dst_r, dst_r))); + FAIL_IF(push_inst(compiler, brc(0x8, 2 + 3))); + FAIL_IF(push_inst(compiler, slfi(flag_r, 0x10000000))); + FAIL_IF(push_inst(compiler, spm(flag_r))); return SLJIT_SUCCESS; } @@ -1088,18 +964,19 @@ static sljit_s32 make_addr_bx(struct sljit_compiler *compiler, #define WHEN(cond, r, i1, i2, addr) \ (cond) ? EVAL(i1, r, addr) : EVAL(i2, r, addr) +/* May clobber tmp1. */ static sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst, sljit_s32 src, sljit_sw srcw, - sljit_gpr tmp /* clobbered */, sljit_s32 is_32bit) + sljit_s32 is_32bit) { struct addr addr; sljit_ins ins; SLJIT_ASSERT(src & SLJIT_MEM); if (have_ldisp() || !is_32bit) - FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp)); + FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp1)); else - FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp)); + FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp1)); if (is_32bit) ins = WHEN(is_u12(addr.offset), dst, l, ly, addr); @@ -1109,18 +986,19 @@ static sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst, return push_inst(compiler, ins); } +/* May clobber tmp1. */ static sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src, sljit_s32 dst, sljit_sw dstw, - sljit_gpr tmp /* clobbered */, sljit_s32 is_32bit) + sljit_s32 is_32bit) { struct addr addr; sljit_ins ins; SLJIT_ASSERT(dst & SLJIT_MEM); if (have_ldisp() || !is_32bit) - FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp)); + FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp1)); else - FAIL_IF(make_addr_bx(compiler, &addr, dst, dstw, tmp)); + FAIL_IF(make_addr_bx(compiler, &addr, dst, dstw, tmp1)); if (is_32bit) ins = WHEN(is_u12(addr.offset), src, st, sty, addr); @@ -1132,6 +1010,358 @@ static sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src, #undef WHEN +static sljit_s32 emit_move(struct sljit_compiler *compiler, + sljit_gpr dst_r, + sljit_s32 src, sljit_sw srcw) +{ + SLJIT_ASSERT(!SLOW_IS_REG(src) || dst_r != gpr(src & REG_MASK)); + + if (src & SLJIT_IMM) + return push_load_imm_inst(compiler, dst_r, srcw); + + if (src & SLJIT_MEM) + return load_word(compiler, dst_r, src, srcw, (compiler->mode & SLJIT_I32_OP) != 0); + + sljit_gpr src_r = gpr(src & REG_MASK); + return push_inst(compiler, (compiler->mode & SLJIT_I32_OP) ? lr(dst_r, src_r) : lgr(dst_r, src_r)); +} + +static sljit_s32 emit_rr(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_gpr dst_r = tmp0; + sljit_gpr src_r = tmp1; + sljit_s32 needs_move = 1; + + if (SLOW_IS_REG(dst)) { + dst_r = gpr(dst & REG_MASK); + + if (dst == src1) + needs_move = 0; + else if (dst == src2) { + dst_r = tmp0; + needs_move = 2; + } + } + + if (needs_move) + FAIL_IF(emit_move(compiler, dst_r, src1, src1w)); + + if (FAST_IS_REG(src2)) + src_r = gpr(src2 & REG_MASK); + else + FAIL_IF(emit_move(compiler, tmp1, src2, src2w)); + + FAIL_IF(push_inst(compiler, ins | (dst_r << 4) | src_r)); + + if (needs_move != 2) + return SLJIT_SUCCESS; + + dst_r = gpr(dst & REG_MASK); + return push_inst(compiler, (compiler->mode & SLJIT_I32_OP) ? lr(dst_r, tmp0) : lgr(dst_r, tmp0)); +} + +static sljit_s32 emit_rrf(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + sljit_gpr src1_r = tmp0; + sljit_gpr src2_r = tmp1; + + if (FAST_IS_REG(src1)) + src1_r = gpr(src1 & REG_MASK); + else + FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); + + if (FAST_IS_REG(src2)) + src2_r = gpr(src2 & REG_MASK); + else + FAIL_IF(emit_move(compiler, tmp1, src2, src2w)); + + return push_inst(compiler, ins | (dst_r << 4) | src1_r | (src2_r << 12)); +} + +typedef enum { + RI_A, + RIL_A, +} emit_ril_type; + +static sljit_s32 emit_ri(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_sw src2w, + emit_ril_type type) +{ + sljit_gpr dst_r = tmp0; + sljit_s32 needs_move = 1; + + if (SLOW_IS_REG(dst)) { + dst_r = gpr(dst & REG_MASK); + + if (dst == src1) + needs_move = 0; + } + + if (needs_move) + FAIL_IF(emit_move(compiler, dst_r, src1, src1w)); + + if (type == RIL_A) + return push_inst(compiler, ins | (dst_r << 36) | (src2w & 0xffffffff)); + return push_inst(compiler, ins | (dst_r << 20) | (src2w & 0xffff)); +} + +static sljit_s32 emit_rie_d(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_sw src2w) +{ + sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + sljit_gpr src_r = tmp0; + + if (!SLOW_IS_REG(src1)) + FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); + else + src_r = gpr(src1 & REG_MASK); + + return push_inst(compiler, ins | (dst_r << 36) | (src_r << 32) | (src2w & 0xffff) << 16); +} + +typedef enum { + RX_A, + RXY_A, +} emit_rx_type; + +static sljit_s32 emit_rx(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w, + emit_rx_type type) +{ + sljit_gpr dst_r = tmp0; + sljit_s32 needs_move = 1; + sljit_gpr base, index; + + SLJIT_ASSERT(src2 & SLJIT_MEM); + + if (SLOW_IS_REG(dst)) { + dst_r = gpr(dst); + + if (dst == src1) + needs_move = 0; + else if (dst == (src2 & REG_MASK) || (dst == OFFS_REG(src2))) { + dst_r = tmp0; + needs_move = 2; + } + } + + if (needs_move) + FAIL_IF(emit_move(compiler, dst_r, src1, src1w)); + + base = gpr(src2 & REG_MASK); + index = tmp0; + + if (src2 & OFFS_REG_MASK) { + index = gpr(OFFS_REG(src2)); + + if (src2w != 0) { + FAIL_IF(push_inst(compiler, sllg(tmp1, index, src2w & 0x3, 0))); + src2w = 0; + index = tmp1; + } + } else if ((type == RX_A && !is_u12(src2w)) || (type == RXY_A && !is_s20(src2w))) { + FAIL_IF(push_load_imm_inst(compiler, tmp1, src2w)); + + if (src2 & REG_MASK) + index = tmp1; + else + base = tmp1; + src2w = 0; + } + + if (type == RX_A) + ins |= (dst_r << 20) | (index << 16) | (base << 12) | src2w; + else + ins |= (dst_r << 36) | (index << 32) | (base << 28) | disp_s20(src2w); + + FAIL_IF(push_inst(compiler, ins)); + + if (needs_move != 2) + return SLJIT_SUCCESS; + + dst_r = gpr(dst); + return push_inst(compiler, (compiler->mode & SLJIT_I32_OP) ? lr(dst_r, tmp0) : lgr(dst_r, tmp0)); +} + +static sljit_s32 emit_siy(struct sljit_compiler *compiler, sljit_ins ins, + sljit_s32 dst, sljit_sw dstw, + sljit_sw srcw) +{ + SLJIT_ASSERT(dst & SLJIT_MEM); + + sljit_gpr dst_r = tmp1; + + if (dst & OFFS_REG_MASK) { + sljit_gpr index = tmp1; + + if ((dstw & 0x3) == 0) + index = gpr(OFFS_REG(dst)); + else + FAIL_IF(push_inst(compiler, sllg(tmp1, index, dstw & 0x3, 0))); + + FAIL_IF(push_inst(compiler, la(tmp1, 0, dst_r, index))); + dstw = 0; + } + else if (!is_s20(dstw)) { + FAIL_IF(push_load_imm_inst(compiler, tmp1, dstw)); + + if (dst & REG_MASK) + FAIL_IF(push_inst(compiler, la(tmp1, 0, dst_r, tmp1))); + + dstw = 0; + } + else + dst_r = gpr(dst & REG_MASK); + + return push_inst(compiler, ins | ((srcw & 0xff) << 32) | (dst_r << 28) | disp_s20(dstw)); +} + +struct ins_forms { + sljit_ins op_r; + sljit_ins op_gr; + sljit_ins op_rk; + sljit_ins op_grk; + sljit_ins op; + sljit_ins op_y; + sljit_ins op_g; +}; + +static sljit_s32 emit_commutative(struct sljit_compiler *compiler, const struct ins_forms *forms, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 mode = compiler->mode; + sljit_ins ins, ins_k; + + if ((src1 | src2) & SLJIT_MEM) { + sljit_ins ins12, ins20; + + if (mode & SLJIT_I32_OP) { + ins12 = forms->op; + ins20 = forms->op_y; + } + else { + ins12 = 0; + ins20 = forms->op_g; + } + + if (ins12 && ins20) { + /* Extra instructions needed for address computation can be executed independently. */ + if ((src2 & SLJIT_MEM) && (!(src1 & SLJIT_MEM) + || ((src1 & OFFS_REG_MASK) ? (src1w & 0x3) == 0 : is_s20(src1w)))) { + if ((src2 & OFFS_REG_MASK) || is_u12(src2w) || !is_s20(src2w)) + return emit_rx(compiler, ins12, dst, src1, src1w, src2, src2w, RX_A); + + return emit_rx(compiler, ins20, dst, src1, src1w, src2, src2w, RXY_A); + } + + if (src1 & SLJIT_MEM) { + if ((src1 & OFFS_REG_MASK) || is_u12(src1w) || !is_s20(src1w)) + return emit_rx(compiler, ins12, dst, src2, src2w, src1, src1w, RX_A); + + return emit_rx(compiler, ins20, dst, src2, src2w, src1, src1w, RXY_A); + } + } + else if (ins12 || ins20) { + emit_rx_type rx_type; + + if (ins12) { + rx_type = RX_A; + ins = ins12; + } + else { + rx_type = RXY_A; + ins = ins20; + } + + if ((src2 & SLJIT_MEM) && (!(src1 & SLJIT_MEM) + || ((src1 & OFFS_REG_MASK) ? (src1w & 0x3) == 0 : (rx_type == RX_A ? is_u12(src1w) : is_s20(src1w))))) + return emit_rx(compiler, ins, dst, src1, src1w, src2, src2w, rx_type); + + if (src1 & SLJIT_MEM) + return emit_rx(compiler, ins, dst, src2, src2w, src1, src1w, rx_type); + } + } + + if (mode & SLJIT_I32_OP) { + ins = forms->op_r; + ins_k = forms->op_rk; + } + else { + ins = forms->op_gr; + ins_k = forms->op_grk; + } + + SLJIT_ASSERT(ins != 0 || ins_k != 0); + + if (ins && SLOW_IS_REG(dst)) { + if (dst == src1) + return emit_rr(compiler, ins, dst, src1, src1w, src2, src2w); + + if (dst == src2) + return emit_rr(compiler, ins, dst, src2, src2w, src1, src1w); + } + + if (ins_k == 0) + return emit_rr(compiler, ins, dst, src1, src1w, src2, src2w); + + return emit_rrf(compiler, ins_k, dst, src1, src1w, src2, src2w); +} + +static sljit_s32 emit_non_commutative(struct sljit_compiler *compiler, const struct ins_forms *forms, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 mode = compiler->mode; + sljit_ins ins; + + if (src2 & SLJIT_MEM) { + sljit_ins ins12, ins20; + + if (mode & SLJIT_I32_OP) { + ins12 = forms->op; + ins20 = forms->op_y; + } + else { + ins12 = 0; + ins20 = forms->op_g; + } + + if (ins12 && ins20) { + if ((src2 & OFFS_REG_MASK) || is_u12(src2w) || !is_s20(src2w)) + return emit_rx(compiler, ins12, dst, src1, src1w, src2, src2w, RX_A); + + return emit_rx(compiler, ins20, dst, src1, src1w, src2, src2w, RXY_A); + } + else if (ins12) + return emit_rx(compiler, ins12, dst, src1, src1w, src2, src2w, RX_A); + else if (ins20) + return emit_rx(compiler, ins20, dst, src1, src1w, src2, src2w, RXY_A); + } + + ins = (mode & SLJIT_I32_OP) ? forms->op_rk : forms->op_grk; + + if (ins == 0 || (SLOW_IS_REG(dst) && dst == src1)) + return emit_rr(compiler, (mode & SLJIT_I32_OP) ? forms->op_r : forms->op_gr, dst, src1, src1w, src2, src2w); + + return emit_rrf(compiler, ins, dst, src1, src1w, src2, src2w); +} + SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) { struct sljit_label *label; @@ -1560,6 +1790,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile /* TODO(carenas): implement prefetch? */ return SLJIT_SUCCESS; } + if (opcode >= SLJIT_MOV && opcode <= SLJIT_MOV_P) { /* LOAD REGISTER */ if (FAST_IS_REG(dst) && FAST_IS_REG(src)) { @@ -1610,11 +1841,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile SLJIT_UNREACHABLE(); } FAIL_IF(push_inst(compiler, ins)); - if (HAS_FLAGS(op)) { - /* only handle zero flag */ - SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK)); - return push_store_zero_flag(compiler, op, dst_r); - } return SLJIT_SUCCESS; } /* LOAD IMMEDIATE */ @@ -1691,11 +1917,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile SLJIT_UNREACHABLE(); } FAIL_IF(push_inst(compiler, ins)); - if (HAS_FLAGS(op)) { - /* only handle zero flag */ - SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK)); - return push_store_zero_flag(compiler, op, reg); - } return SLJIT_SUCCESS; } /* STORE and STORE IMMEDIATE */ @@ -1724,11 +1945,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile case SLJIT_MOV_P: case SLJIT_MOV: FAIL_IF(push_inst(compiler, LEVAL(stg))); - if (HAS_FLAGS(op)) { - /* only handle zero flag */ - SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK)); - return push_store_zero_flag(compiler, op, reg); - } return SLJIT_SUCCESS; default: SLJIT_UNREACHABLE(); @@ -1768,11 +1984,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1)); FAIL_IF(push_inst(compiler, EVAL(stg, tmp0, mem))); - if (HAS_FLAGS(op)) { - /* only handle zero flag */ - SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK)); - return push_store_zero_flag(compiler, op, tmp0); - } return SLJIT_SUCCESS; default: SLJIT_UNREACHABLE(); @@ -1786,7 +1997,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile dst_r = SLOW_IS_REG(dst) ? gpr(REG_MASK & dst) : tmp0; src_r = FAST_IS_REG(src) ? gpr(REG_MASK & src) : tmp0; if (src & SLJIT_MEM) - FAIL_IF(load_word(compiler, src_r, src, srcw, tmp1, src & SLJIT_I32_OP)); + FAIL_IF(load_word(compiler, src_r, src, srcw, src & SLJIT_I32_OP)); + + compiler->status_flags_state = op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z); /* TODO(mundaym): optimize loads and stores */ switch (opcode | (op & SLJIT_I32_OP)) { @@ -1811,9 +2024,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile } break; case SLJIT_NEG: + compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_ADD_SUB; FAIL_IF(push_inst(compiler, lcgr(dst_r, src_r))); break; case SLJIT_NEG32: + compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_ADD_SUB; FAIL_IF(push_inst(compiler, lcr(dst_r, src_r))); break; case SLJIT_CLZ: @@ -1840,17 +2055,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile SLJIT_UNREACHABLE(); } - /* write condition code to emulated flag register */ - if (op & VARIABLE_FLAG_MASK) - FAIL_IF(push_inst(compiler, ipm(flag_r))); - - /* write zero flag to emulated flag register */ - if (op & SLJIT_SET_Z) - FAIL_IF(push_store_zero_flag(compiler, op, dst_r)); + if ((op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW)) + FAIL_IF(update_zero_overflow(compiler, op, dst_r)); /* TODO(carenas): doesn't need FAIL_IF */ if ((dst != SLJIT_UNUSED) && (dst & SLJIT_MEM)) - FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP)); + FAIL_IF(store_word(compiler, dst_r, dst, dstw, op & SLJIT_I32_OP)); return SLJIT_SUCCESS; } @@ -1888,530 +2098,554 @@ static SLJIT_INLINE int sets_signed_flag(sljit_s32 op) return 0; } -/* Report whether we have an instruction for: - op dst src imm - where dst and src are separate registers. */ -static int have_op_3_imm(sljit_s32 op, sljit_sw imm) { - return 0; /* TODO(mundaym): implement */ -} - -/* Report whether we have an instruction for: - op reg imm - where reg is both a source and the destination. */ -static int have_op_2_imm(sljit_s32 op, sljit_sw imm) { - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - case SLJIT_ADD32: - case SLJIT_ADD: - if (!HAS_FLAGS(op) || sets_signed_flag(op)) - return have_eimm() ? is_s32(imm) : is_s16(imm); +static const struct ins_forms add_forms = { + 0x1a00, /* ar */ + 0xb9080000, /* agr */ + 0xb9f80000, /* ark */ + 0xb9e80000, /* agrk */ + 0x5a000000, /* a */ + 0xe3000000005a, /* ay */ + 0xe30000000008, /* ag */ +}; - return have_eimm() && is_u32(imm); - case SLJIT_MUL32: - case SLJIT_MUL: - /* TODO(mundaym): general extension check */ - /* for ms{,g}fi */ - if (op & VARIABLE_FLAG_MASK) - return 0; - - return have_genext() && is_s16(imm); - case SLJIT_OR32: - case SLJIT_XOR32: - case SLJIT_AND32: - /* only use if have extended immediate facility */ - /* this ensures flags are set correctly */ - return have_eimm(); - case SLJIT_AND: - case SLJIT_OR: - case SLJIT_XOR: - /* TODO(mundaym): make this more flexible */ - /* avoid using immediate variations, flags */ - /* won't be set correctly */ - return 0; - case SLJIT_ADDC32: - case SLJIT_ADDC: - /* no ADD LOGICAL WITH CARRY IMMEDIATE */ - return 0; - case SLJIT_SUB: - case SLJIT_SUB32: - case SLJIT_SUBC: - case SLJIT_SUBC32: - /* no SUBTRACT IMMEDIATE */ - /* TODO(mundaym): SUBTRACT LOGICAL IMMEDIATE */ - return 0; - } - return 0; -} +static const struct ins_forms logical_add_forms = { + 0x1e00, /* alr */ + 0xb90a0000, /* algr */ + 0xb9fa0000, /* alrk */ + 0xb9ea0000, /* algrk */ + 0x5e000000, /* al */ + 0xe3000000005e, /* aly */ + 0xe3000000000a, /* alg */ +}; -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, +static sljit_s32 sljit_emit_add(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w) { - CHECK_ERROR(); - CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); - ADJUST_LOCAL_OFFSET(dst, dstw); - ADJUST_LOCAL_OFFSET(src1, src1w); - ADJUST_LOCAL_OFFSET(src2, src2w); - - if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) - return SLJIT_SUCCESS; - - sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + int sets_overflow = (op & VARIABLE_FLAG_MASK) == SLJIT_SET_OVERFLOW; + int sets_zero_overflow = (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW); + const struct ins_forms *forms; + sljit_ins ins; - if (is_commutative(op)) { - #define SWAP_ARGS \ - do { \ - sljit_s32 t = src1; \ - sljit_sw tw = src1w; \ - src1 = src2; \ - src1w = src2w; \ - src2 = t; \ - src2w = tw; \ - } while(0); - - /* prefer immediate in src2 */ - if (src1 & SLJIT_IMM) { - SWAP_ARGS + if (src2 & SLJIT_IMM) { + if (!sets_zero_overflow && is_s8(src2w) && (src1 & SLJIT_MEM) && (dst == src1 && dstw == src1w)) { + if (sets_overflow) + ins = (op & SLJIT_I32_OP) ? 0xeb000000006a /* asi */ : 0xeb000000007a /* agsi */; + else + ins = (op & SLJIT_I32_OP) ? 0xeb000000006e /* alsi */ : 0xeb000000007e /* algsi */; + return emit_siy(compiler, ins, dst, dstw, src2w); } - /* prefer to have src1 use same register as dst */ - if (FAST_IS_REG(src2) && gpr(src2 & REG_MASK) == dst_r) { - SWAP_ARGS + if (is_s16(src2w)) { + if (sets_overflow) + ins = (op & SLJIT_I32_OP) ? 0xec00000000d8 /* ahik */ : 0xec00000000d9 /* aghik */; + else + ins = (op & SLJIT_I32_OP) ? 0xec00000000da /* alhsik */ : 0xec00000000db /* alghsik */; + FAIL_IF(emit_rie_d(compiler, ins, dst, src1, src1w, src2w)); + goto done; } - /* prefer memory argument in src2 */ - if (FAST_IS_REG(src2) && (src1 & SLJIT_MEM)) { - SWAP_ARGS + if (!sets_overflow) { + if ((op & SLJIT_I32_OP) || is_u32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20b00000000 /* alfi */ : 0xc20a00000000 /* algfi */; + FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A)); + goto done; + } + if (is_u32(-src2w)) { + FAIL_IF(emit_ri(compiler, 0xc20400000000 /* slgfi */, dst, src1, src1w, -src2w, RIL_A)); + goto done; + } + } + else if ((op & SLJIT_I32_OP) || is_s32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20900000000 /* afi */ : 0xc20800000000 /* agfi */; + FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A)); + goto done; } - #undef SWAP_ARGS } - /* src1 must be in a register */ - sljit_gpr src1_r = FAST_IS_REG(src1) ? gpr(src1 & REG_MASK) : tmp0; - if (src1 & SLJIT_IMM) - FAIL_IF(push_load_imm_inst(compiler, src1_r, src1w)); - - if (src1 & SLJIT_MEM) - FAIL_IF(load_word(compiler, src1_r, src1, src1w, tmp1, op & SLJIT_I32_OP)); - - /* emit comparison before subtract */ - if (GET_OPCODE(op) == SLJIT_SUB && (op & VARIABLE_FLAG_MASK)) { - sljit_sw cmp = 0; - switch (GET_FLAG_TYPE(op)) { - case SLJIT_LESS: - case SLJIT_LESS_EQUAL: - case SLJIT_GREATER: - case SLJIT_GREATER_EQUAL: - cmp = 1; /* unsigned */ - break; - case SLJIT_EQUAL: - case SLJIT_SIG_LESS: - case SLJIT_SIG_LESS_EQUAL: - case SLJIT_SIG_GREATER: - case SLJIT_SIG_GREATER_EQUAL: - cmp = -1; /* signed */ - break; - } - if (cmp) { - /* clear flags - no need to generate now */ - op &= ~VARIABLE_FLAG_MASK; - sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1; - if (src2 & SLJIT_IMM) { - #define LEVAL(i) i(src1_r, src2w) - if (cmp > 0 && is_u32(src2w)) { - /* unsigned */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, clfi, clgfi))); - } - else if (cmp < 0 && is_s16(src2w)) { - /* signed */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, chi, cghi))); - } - else if (cmp < 0 && is_s32(src2w)) { - /* signed */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, cfi, cgfi))); - } - #undef LEVAL - #define LEVAL(i) i(src1_r, src2_r) - else { - FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w)); - if (cmp > 0) { - /* unsigned */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, clr, clgr))); - } - if (cmp < 0) { - /* signed */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, cr, cgr))); - } + forms = sets_overflow ? &add_forms : &logical_add_forms; + FAIL_IF(emit_commutative(compiler, forms, dst, dstw, src1, src1w, src2, src2w)); + +done: + if (sets_zero_overflow) + FAIL_IF(update_zero_overflow(compiler, op, SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0)); + + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); + + return SLJIT_SUCCESS; +} + +static const struct ins_forms sub_forms = { + 0x1b00, /* sr */ + 0xb9090000, /* sgr */ + 0xb9f90000, /* srk */ + 0xb9e90000, /* sgrk */ + 0x5b000000, /* s */ + 0xe3000000005b, /* sy */ + 0xe30000000009, /* sg */ +}; + +static const struct ins_forms logical_sub_forms = { + 0x1f00, /* slr */ + 0xb90b0000, /* slgr */ + 0xb9fb0000, /* slrk */ + 0xb9eb0000, /* slgrk */ + 0x5f000000, /* sl */ + 0xe3000000005f, /* sly */ + 0xe3000000000b, /* slg */ +}; + +static sljit_s32 sljit_emit_sub(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + int sets_signed = sets_signed_flag(op); + int sets_zero_overflow = (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW); + const struct ins_forms *forms; + sljit_ins ins; + + if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) { + int compare_signed = GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS; + + compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_COMPARE; + + if (src2 & SLJIT_IMM) { + if (compare_signed || ((op & VARIABLE_FLAG_MASK) == 0 && is_s32(src2w))) + { + if ((op & SLJIT_I32_OP) || is_s32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20d00000000 /* cfi */ : 0xc20c00000000 /* cgfi */; + return emit_ri(compiler, ins, src1, src1, src1w, src2w, RIL_A); } } else { - if (src2 & SLJIT_MEM) { - /* TODO(mundaym): comparisons with memory */ - /* load src2 into register */ - FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP)); + if ((op & SLJIT_I32_OP) || is_u32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20f00000000 /* clfi */ : 0xc20e00000000 /* clgfi */; + return emit_ri(compiler, ins, src1, src1, src1w, src2w, RIL_A); } - if (cmp > 0) { - /* unsigned */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, clr, clgr))); - } - if (cmp < 0) { - /* signed */ - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, cr, cgr))); - } - #undef LEVAL + if (is_s16(src2w)) + return emit_rie_d(compiler, 0xec00000000db /* alghsik */, SLJIT_UNUSED, src1, src1w, src2w); } - FAIL_IF(push_inst(compiler, ipm(flag_r))); } - } + else if (src2 & SLJIT_MEM) { + if ((op & SLJIT_I32_OP) && ((src2 & OFFS_REG_MASK) || is_u12(src2w))) { + ins = compare_signed ? 0x59000000 /* c */ : 0x55000000 /* cl */; + return emit_rx(compiler, ins, src1, src1, src1w, src2, src2w, RX_A); + } - if (!HAS_FLAGS(op) && dst == SLJIT_UNUSED) - return SLJIT_SUCCESS; + if (compare_signed) + ins = (op & SLJIT_I32_OP) ? 0xe30000000059 /* cy */ : 0xe30000000020 /* cg */; + else + ins = (op & SLJIT_I32_OP) ? 0xe30000000055 /* cly */ : 0xe30000000021 /* clg */; + return emit_rx(compiler, ins, src1, src1, src1w, src2, src2w, RXY_A); + } - /* need to specify signed or logical operation */ - int signed_flags = sets_signed_flag(op); + if (compare_signed) + ins = (op & SLJIT_I32_OP) ? 0x1900 /* cr */ : 0xb9200000 /* cgr */; + else + ins = (op & SLJIT_I32_OP) ? 0x1500 /* clr */ : 0xb9210000 /* clgr */; + return emit_rr(compiler, ins, src1, src1, src1w, src2, src2w); + } - if (is_shift(op)) { - /* handle shifts first, they have more constraints than other operations */ - sljit_sw d = 0; - sljit_gpr b = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : r0; - if (src2 & SLJIT_IMM) - d = src2w & ((op & SLJIT_I32_OP) ? 31 : 63); + if (src2 & SLJIT_IMM) { + sljit_sw neg_src2w = -src2w; - if (src2 & SLJIT_MEM) { - /* shift amount (b) cannot be in r0 (i.e. tmp0) */ - FAIL_IF(load_word(compiler, tmp1, src2, src2w, tmp1, op & SLJIT_I32_OP)); - b = tmp1; - } - /* src1 and dst share the same register in the base 32-bit ISA */ - /* TODO(mundaym): not needed when distinct-operand facility is available */ - int workaround_alias = op & SLJIT_I32_OP && src1_r != dst_r; - if (workaround_alias) { - /* put src1 into tmp0 so we can overwrite it */ - FAIL_IF(push_inst(compiler, lr(tmp0, src1_r))); - src1_r = tmp0; - } - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - case SLJIT_SHL: - FAIL_IF(push_inst(compiler, sllg(dst_r, src1_r, d, b))); - break; - case SLJIT_SHL32: - FAIL_IF(push_inst(compiler, sll(src1_r, d, b))); - break; - case SLJIT_LSHR: - FAIL_IF(push_inst(compiler, srlg(dst_r, src1_r, d, b))); - break; - case SLJIT_LSHR32: - FAIL_IF(push_inst(compiler, srl(src1_r, d, b))); - break; - case SLJIT_ASHR: - FAIL_IF(push_inst(compiler, srag(dst_r, src1_r, d, b))); - break; - case SLJIT_ASHR32: - FAIL_IF(push_inst(compiler, sra(src1_r, d, b))); - break; - default: - SLJIT_UNREACHABLE(); + if (sets_signed || neg_src2w != 0 || (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == 0) { + if (!sets_zero_overflow && is_s8(neg_src2w) && (src1 & SLJIT_MEM) && (dst == src1 && dstw == src1w)) { + if (sets_signed) + ins = (op & SLJIT_I32_OP) ? 0xeb000000006a /* asi */ : 0xeb000000007a /* agsi */; + else + ins = (op & SLJIT_I32_OP) ? 0xeb000000006e /* alsi */ : 0xeb000000007e /* algsi */; + return emit_siy(compiler, ins, dst, dstw, neg_src2w); + } + + if (is_s16(neg_src2w)) { + if (sets_signed) + ins = (op & SLJIT_I32_OP) ? 0xec00000000d8 /* ahik */ : 0xec00000000d9 /* aghik */; + else + ins = (op & SLJIT_I32_OP) ? 0xec00000000da /* alhsik */ : 0xec00000000db /* alghsik */; + FAIL_IF(emit_rie_d(compiler, ins, dst, src1, src1w, neg_src2w)); + goto done; + } } - if (workaround_alias && dst_r != src1_r) - FAIL_IF(push_inst(compiler, lr(dst_r, src1_r))); - } - else if ((GET_OPCODE(op) == SLJIT_MUL) && HAS_FLAGS(op)) { - /* multiply instructions do not generally set flags so we need to manually */ - /* detect overflow conditions */ - /* TODO(mundaym): 64-bit overflow */ - SLJIT_ASSERT(GET_FLAG_TYPE(op) == SLJIT_MUL_OVERFLOW || - GET_FLAG_TYPE(op) == SLJIT_MUL_NOT_OVERFLOW); - sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1; - if (src2 & SLJIT_IMM) { - /* load src2 into register */ - FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w)); + if (!sets_signed) { + if ((op & SLJIT_I32_OP) || is_u32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20500000000 /* slfi */ : 0xc20400000000 /* slgfi */; + FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A)); + goto done; + } + if (is_u32(neg_src2w)) { + FAIL_IF(emit_ri(compiler, 0xc20a00000000 /* algfi */, dst, src1, src1w, neg_src2w, RIL_A)); + goto done; + } } - if (src2 & SLJIT_MEM) { - /* load src2 into register */ - FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP)); + else if ((op & SLJIT_I32_OP) || is_s32(neg_src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20900000000 /* afi */ : 0xc20800000000 /* agfi */; + FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, neg_src2w, RIL_A)); + goto done; } - if (have_misc2()) { - #define LEVAL(i) i(dst_r, src1_r, src2_r) - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, msrkc, msgrkc))); - #undef LEVAL + } + + forms = sets_signed ? &sub_forms : &logical_sub_forms; + FAIL_IF(emit_non_commutative(compiler, forms, dst, dstw, src1, src1w, src2, src2w)); + +done: + if (sets_signed) { + sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + + if ((op & VARIABLE_FLAG_MASK) != SLJIT_SET_OVERFLOW) { + /* In case of overflow, the sign bit of the two source operands must be different, and + - the first operand is greater if the sign bit of the result is set + - the first operand is less if the sign bit of the result is not set + The -result operation sets the corrent sign, because the result cannot be zero. + The overflow is considered greater, since the result must be equal to INT_MIN so its sign bit is set. */ + FAIL_IF(push_inst(compiler, brc(0xe, 2 + 2))); + FAIL_IF(push_inst(compiler, (op & SLJIT_I32_OP) ? lcr(tmp1, dst_r) : lcgr(tmp1, dst_r))); } - else if (op & SLJIT_I32_OP) { - op &= ~VARIABLE_FLAG_MASK; - FAIL_IF(push_inst(compiler, lgfr(tmp0, src1_r))); - FAIL_IF(push_inst(compiler, msgfr(tmp0, src2_r))); - if (dst_r != tmp0) { - FAIL_IF(push_inst(compiler, lr(dst_r, tmp0))); - } - FAIL_IF(push_inst(compiler, aih(tmp0, 1))); - FAIL_IF(push_inst(compiler, nihf(tmp0, ~1U))); - FAIL_IF(push_inst(compiler, ipm(flag_r))); - FAIL_IF(push_inst(compiler, oilh(flag_r, 0x2000))); + else if (op & SLJIT_SET_Z) + FAIL_IF(update_zero_overflow(compiler, op, dst_r)); + } + + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); + + return SLJIT_SUCCESS; +} + +static const struct ins_forms multiply_forms = { + 0xb2520000, /* msr */ + 0xb90c0000, /* msgr */ + 0xb9fd0000, /* msrkc */ + 0xb9ed0000, /* msgrkc */ + 0x71000000, /* ms */ + 0xe30000000051, /* msy */ + 0xe3000000000c, /* msg */ +}; + +static const struct ins_forms multiply_overflow_forms = { + 0, + 0, + 0xb9fd0000, /* msrkc */ + 0xb9ed0000, /* msgrkc */ + 0, + 0xe30000000053, /* msc */ + 0xe30000000083, /* msgc */ +}; + +static sljit_s32 sljit_emit_multiply(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_ins ins; + + if (HAS_FLAGS(op)) { + /* if have_misc2 fails, this operation should be emulated. 32 bit emulation: + FAIL_IF(push_inst(compiler, lgfr(tmp0, src1_r))); + FAIL_IF(push_inst(compiler, msgfr(tmp0, src2_r))); + if (dst_r != tmp0) { + FAIL_IF(push_inst(compiler, lr(dst_r, tmp0))); } - else - return SLJIT_ERR_UNSUPPORTED; + FAIL_IF(push_inst(compiler, aih(tmp0, 1))); + FAIL_IF(push_inst(compiler, nihf(tmp0, ~1U))); + FAIL_IF(push_inst(compiler, ipm(flag_r))); + FAIL_IF(push_inst(compiler, oilh(flag_r, 0x2000))); */ + return emit_commutative(compiler, &multiply_overflow_forms, dst, dstw, src1, src1w, src2, src2w); } - else if ((GET_OPCODE(op) == SLJIT_SUB) && (op & SLJIT_SET_Z) && !signed_flags) { - /* subtract logical instructions do not set the right flags unfortunately */ - /* instead, negate src2 and issue an add logical */ - /* TODO(mundaym): distinct operand facility where needed */ - if (src1_r != dst_r && src1_r != tmp0) { - #define LEVAL(i) i(tmp0, src1_r) - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, lr, lgr))); - src1_r = tmp0; - #undef LEVAL - } - sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1; - if (src2 & SLJIT_IMM) { - /* load src2 into register */ - FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w)); + + if (src2 & SLJIT_IMM) { + if (is_s16(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xa70c0000 /* mhi */ : 0xa70d0000 /* mghi */; + return emit_ri(compiler, ins, dst, src1, src1w, src2w, RI_A); } - if (src2 & SLJIT_MEM) { - /* load src2 into register */ - FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP)); + + if (is_s32(src2w)) { + ins = (op & SLJIT_I32_OP) ? 0xc20100000000 /* msfi */ : 0xc20000000000 /* msgfi */; + return emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A); } - if (op & SLJIT_I32_OP) { - FAIL_IF(push_inst(compiler, lcr(tmp1, src2_r))); - FAIL_IF(push_inst(compiler, alr(src1_r, tmp1))); - if (src1_r != dst_r) - FAIL_IF(push_inst(compiler, lr(dst_r, src1_r))); + } + + return emit_commutative(compiler, &multiply_forms, dst, dstw, src1, src1w, src2, src2w); +} + +static sljit_s32 sljit_emit_bitwise_imm(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_uw imm, sljit_s32 count16) +{ + sljit_s32 mode = compiler->mode; + sljit_gpr dst_r = tmp0; + sljit_s32 needs_move = 1; + + if (SLOW_IS_REG(dst)) { + dst_r = gpr(dst & REG_MASK); + if (dst == src1) + needs_move = 0; + } + + if (needs_move) + FAIL_IF(emit_move(compiler, dst_r, src1, src1w)); + + if (type == SLJIT_AND) { + if (!(mode & SLJIT_I32_OP)) + FAIL_IF(push_inst(compiler, 0xc00a00000000 /* nihf */ | (dst_r << 36) | (imm >> 32))); + return push_inst(compiler, 0xc00b00000000 /* nilf */ | (dst_r << 36) | (imm & 0xffffffff)); + } + else if (type == SLJIT_OR) { + if (count16 >= 3) { + FAIL_IF(push_inst(compiler, 0xc00c00000000 /* oihf */ | (dst_r << 36) | (imm >> 32))); + return push_inst(compiler, 0xc00d00000000 /* oilf */ | (dst_r << 36) | (imm & 0xffffffff)); } - else { - FAIL_IF(push_inst(compiler, lcgr(tmp1, src2_r))); - FAIL_IF(push_inst(compiler, algr(src1_r, tmp1))); - if (src1_r != dst_r) - FAIL_IF(push_inst(compiler, lgr(dst_r, src1_r))); + + if (count16 >= 2) { + if ((imm & 0x00000000ffffffffull) == 0) + return push_inst(compiler, 0xc00c00000000 /* oihf */ | (dst_r << 36) | (imm >> 32)); + if ((imm & 0xffffffff00000000ull) == 0) + return push_inst(compiler, 0xc00d00000000 /* oilf */ | (dst_r << 36) | (imm & 0xffffffff)); } + + if ((imm & 0xffff000000000000ull) != 0) + FAIL_IF(push_inst(compiler, 0xa5080000 /* oihh */ | (dst_r << 20) | (imm >> 48))); + if ((imm & 0x0000ffff00000000ull) != 0) + FAIL_IF(push_inst(compiler, 0xa5090000 /* oihl */ | (dst_r << 20) | ((imm >> 32) & 0xffff))); + if ((imm & 0x00000000ffff0000ull) != 0) + FAIL_IF(push_inst(compiler, 0xa50a0000 /* oilh */ | (dst_r << 20) | ((imm >> 16) & 0xffff))); + if ((imm & 0x000000000000ffffull) != 0 || imm == 0) + return push_inst(compiler, 0xa50b0000 /* oill */ | (dst_r << 20) | (imm & 0xffff)); + return SLJIT_SUCCESS; } - else if ((src2 & SLJIT_IMM) && (src1_r == dst_r) && have_op_2_imm(op, src2w)) { - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - #define LEVAL(i) i(dst_r, src2w) - case SLJIT_ADD: - if (!HAS_FLAGS(op) || signed_flags) { - FAIL_IF(push_inst(compiler, - WHEN2(is_s16(src2w), aghi, agfi))); - } - else - FAIL_IF(push_inst(compiler, LEVAL(algfi))); - break; - case SLJIT_ADD32: - if (!HAS_FLAGS(op) || signed_flags) - FAIL_IF(push_inst(compiler, - WHEN2(is_s16(src2w), ahi, afi))); + if ((imm & 0xffffffff00000000ull) != 0) + FAIL_IF(push_inst(compiler, 0xc00600000000 /* xihf */ | (dst_r << 36) | (imm >> 32))); + if ((imm & 0x00000000ffffffffull) != 0 || imm == 0) + return push_inst(compiler, 0xc00700000000 /* xilf */ | (dst_r << 36) | (imm & 0xffffffff)); + return SLJIT_SUCCESS; +} + +static const struct ins_forms bitwise_and_forms = { + 0x1400, /* nr */ + 0xb9800000, /* ngr */ + 0xb9f40000, /* nrk */ + 0xb9e40000, /* ngrk */ + 0x54000000, /* n */ + 0xe30000000054, /* ny */ + 0xe30000000080, /* ng */ +}; + +static const struct ins_forms bitwise_or_forms = { + 0x1600, /* or */ + 0xb9810000, /* ogr */ + 0xb9f60000, /* ork */ + 0xb9e60000, /* ogrk */ + 0x56000000, /* o */ + 0xe30000000056, /* oy */ + 0xe30000000081, /* og */ +}; + +static const struct ins_forms bitwise_xor_forms = { + 0x1700, /* xr */ + 0xb9820000, /* xgr */ + 0xb9f70000, /* xrk */ + 0xb9e70000, /* xgrk */ + 0x57000000, /* x */ + 0xe30000000057, /* xy */ + 0xe30000000082, /* xg */ +}; + +static sljit_s32 sljit_emit_bitwise(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 type = GET_OPCODE(op); + const struct ins_forms *forms; + + if ((src2 & SLJIT_IMM) && (!(op & SLJIT_SET_Z) || (type == SLJIT_AND && dst == SLJIT_UNUSED))) { + sljit_s32 count16 = 0; + sljit_uw imm = (sljit_uw)src2w; + + if (op & SLJIT_I32_OP) + imm &= 0xffffffffull; + + if ((imm & 0x000000000000ffffull) != 0 || imm == 0) + count16++; + if ((imm & 0x00000000ffff0000ull) != 0) + count16++; + if ((imm & 0x0000ffff00000000ull) != 0) + count16++; + if ((imm & 0xffff000000000000ull) != 0) + count16++; + + if (type == SLJIT_AND && dst == SLJIT_UNUSED && count16 == 1) { + sljit_gpr src_r = tmp0; + + if (FAST_IS_REG(src1)) + src_r = gpr(src1 & REG_MASK); else - FAIL_IF(push_inst(compiler, LEVAL(alfi))); - - break; - #undef LEVAL /* TODO(carenas): move down and refactor? */ - case SLJIT_MUL: - FAIL_IF(push_inst(compiler, mhi(dst_r, src2w))); - break; - case SLJIT_MUL32: - FAIL_IF(push_inst(compiler, mghi(dst_r, src2w))); - break; - case SLJIT_OR32: - FAIL_IF(push_inst(compiler, oilf(dst_r, src2w))); - break; - case SLJIT_XOR32: - FAIL_IF(push_inst(compiler, xilf(dst_r, src2w))); - break; - case SLJIT_AND32: - FAIL_IF(push_inst(compiler, nilf(dst_r, src2w))); - break; - default: - SLJIT_UNREACHABLE(); + FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); + + if ((imm & 0x000000000000ffffull) != 0 || imm == 0) + return push_inst(compiler, 0xa7010000 | (src_r << 20) | imm); + if ((imm & 0x00000000ffff0000ull) != 0) + return push_inst(compiler, 0xa7000000 | (src_r << 20) | (imm >> 16)); + if ((imm & 0x0000ffff00000000ull) != 0) + return push_inst(compiler, 0xa7030000 | (src_r << 20) | (imm >> 32)); + return push_inst(compiler, 0xa7020000 | (src_r << 20) | (imm >> 48)); } + + if (!(op & SLJIT_SET_Z)) + return sljit_emit_bitwise_imm(compiler, type, dst, dstw, src1, src1w, imm, count16); } - else if ((src2 & SLJIT_IMM) && have_op_3_imm(op, src2w)) { - abort(); /* TODO(mundaym): implement */ + + if (type == SLJIT_AND) + forms = &bitwise_and_forms; + else if (type == SLJIT_OR) + forms = &bitwise_or_forms; + else + forms = &bitwise_xor_forms; + + return emit_commutative(compiler, forms, dst, dstw, src1, src1w, src2, src2w); +} + +static sljit_s32 sljit_emit_shift(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 type = GET_OPCODE(op); + sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + sljit_gpr src_r = tmp0; + sljit_gpr base_r = tmp0; + sljit_ins imm = 0; + sljit_ins ins; + + if (FAST_IS_REG(src1)) + src_r = gpr(src1 & REG_MASK); + else + FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); + + if (src2 & SLJIT_IMM) + imm = src2w & ((op & SLJIT_I32_OP) ? 0x1f : 0x3f); + else if (FAST_IS_REG(src2)) + base_r = gpr(src2 & REG_MASK); + else { + FAIL_IF(emit_move(compiler, tmp1, src2, src2w)); + base_r = tmp1; } - else if ((src2 & SLJIT_MEM) && (dst_r == src1_r)) { - /* most 32-bit instructions can only handle 12-bit immediate offsets */ - int need_u12 = !have_ldisp() && - (op & SLJIT_I32_OP) && - (GET_OPCODE(op) != SLJIT_ADDC) && - (GET_OPCODE(op) != SLJIT_SUBC); - struct addr mem; - if (need_u12) - FAIL_IF(make_addr_bx(compiler, &mem, src2, src2w, tmp1)); + + if ((op & SLJIT_I32_OP) && dst_r == src_r) { + if (type == SLJIT_SHL) + ins = 0x89000000 /* sll */; + else if (type == SLJIT_LSHR) + ins = 0x88000000 /* srl */; else - FAIL_IF(make_addr_bxy(compiler, &mem, src2, src2w, tmp1)); - - int can_u12 = is_u12(mem.offset) ? 1 : 0; - sljit_ins ins = 0; - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - /* 64-bit ops */ - #define LEVAL(i) EVAL(i, dst_r, mem) - case SLJIT_ADD: - ins = WHEN2(signed_flags, ag, alg); - break; - case SLJIT_SUB: - ins = WHEN2(signed_flags, sg, slg); - break; - case SLJIT_ADDC: - ins = LEVAL(alcg); - break; - case SLJIT_SUBC: - ins = LEVAL(slbg); - break; - case SLJIT_MUL: - ins = LEVAL(msg); - break; - case SLJIT_OR: - ins = LEVAL(og); - break; - case SLJIT_XOR: - ins = LEVAL(xg); - break; - case SLJIT_AND: - ins = LEVAL(ng); - break; - /* 32-bit ops */ - case SLJIT_ADD32: - if (signed_flags) - ins = WHEN2(can_u12, a, ay); - else - ins = WHEN2(can_u12, al, aly); - break; - case SLJIT_SUB32: - if (signed_flags) - ins = WHEN2(can_u12, s, sy); - else - ins = WHEN2(can_u12, sl, sly); - break; - case SLJIT_ADDC32: - ins = LEVAL(alc); - break; - case SLJIT_SUBC32: - ins = LEVAL(slb); - break; - case SLJIT_MUL32: - ins = WHEN2(can_u12, ms, msy); - break; - case SLJIT_OR32: - ins = WHEN2(can_u12, o, oy); - break; - case SLJIT_XOR32: - ins = WHEN2(can_u12, x, xy); - break; - case SLJIT_AND32: - ins = WHEN2(can_u12, n, ny); - break; - #undef LEVAL - default: - SLJIT_UNREACHABLE(); - } - FAIL_IF(push_inst(compiler, ins)); + ins = 0x8a000000 /* sra */; + + FAIL_IF(push_inst(compiler, ins | (dst_r << 20) | (base_r << 12) | imm)); } else { - sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1; - if (src2 & SLJIT_IMM) { - /* load src2 into register */ - FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w)); - } - if (src2 & SLJIT_MEM) { - /* load src2 into register */ - FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP)); - } - /* TODO(mundaym): distinct operand facility where needed */ - #define LEVAL(i) i(tmp0, src1_r) - if (src1_r != dst_r && src1_r != tmp0) { - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, lr, lgr))); - src1_r = tmp0; - } - #undef LEVAL - sljit_ins ins = 0; - switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) { - #define LEVAL(i) i(src1_r, src2_r) - /* 64-bit ops */ - case SLJIT_ADD: - ins = WHEN2(signed_flags, agr, algr); - break; - case SLJIT_SUB: - ins = WHEN2(signed_flags, sgr, slgr); - break; - case SLJIT_ADDC: - ins = LEVAL(alcgr); - break; - case SLJIT_SUBC: - ins = LEVAL(slbgr); - break; - case SLJIT_MUL: - ins = LEVAL(msgr); - break; - case SLJIT_AND: - ins = LEVAL(ngr); - break; - case SLJIT_OR: - ins = LEVAL(ogr); - break; - case SLJIT_XOR: - ins = LEVAL(xgr); - break; - /* 32-bit ops */ - case SLJIT_ADD32: - ins = WHEN2(signed_flags, ar, alr); - break; - case SLJIT_SUB32: - ins = WHEN2(signed_flags, sr, slr); - break; - case SLJIT_ADDC32: - ins = LEVAL(alcr); - break; - case SLJIT_SUBC32: - ins = LEVAL(slbr); - break; - case SLJIT_MUL32: - ins = LEVAL(msr); - break; - case SLJIT_AND32: - ins = LEVAL(nr); - break; - case SLJIT_OR32: - ins = LEVAL(or); - break; - case SLJIT_XOR32: - ins = LEVAL(xr); - break; - #undef LEVAL - default: - SLJIT_UNREACHABLE(); - } - FAIL_IF(push_inst(compiler, ins)); - #define LEVAL(i) i(dst_r, src1_r) - if (src1_r != dst_r) - FAIL_IF(push_inst(compiler, - WHEN2(op & SLJIT_I32_OP, lr, lgr))); - #undef LEVAL + if (type == SLJIT_SHL) + ins = (op & SLJIT_I32_OP) ? 0xeb00000000df /* sllk */ : 0xeb000000000d /* sllg */; + else if (type == SLJIT_LSHR) + ins = (op & SLJIT_I32_OP) ? 0xeb00000000de /* srlk */ : 0xeb000000000c /* srlg */; + else + ins = (op & SLJIT_I32_OP) ? 0xeb00000000dc /* srak */ : 0xeb000000000a /* srag */; + + FAIL_IF(push_inst(compiler, ins | (dst_r << 36) | (src_r << 32) | (base_r << 28) | (imm << 16))); } - /* write condition code to emulated flag register */ - if (op & VARIABLE_FLAG_MASK) - FAIL_IF(push_inst(compiler, ipm(flag_r))); + if ((op & SLJIT_SET_Z) && type != SLJIT_ASHR) + return push_inst(compiler, (op & SLJIT_I32_OP) ? or(dst_r, dst_r) : ogr(dst_r, dst_r)); + + return SLJIT_SUCCESS; +} + +static const struct ins_forms addc_forms = { + 0xb9980000, /* alcr */ + 0xb9880000, /* alcgr */ + 0, + 0, + 0, + 0xe30000000098, /* alc */ + 0xe30000000088, /* alcg */ +}; + +static const struct ins_forms subc_forms = { + 0xb9990000, /* slbr */ + 0xb9890000, /* slbgr */ + 0, + 0, + 0, + 0xe30000000099, /* slb */ + 0xe30000000089, /* slbg */ +}; + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) + return SLJIT_SUCCESS; - /* write zero flag to emulated flag register */ - if (op & SLJIT_SET_Z) - FAIL_IF(push_store_zero_flag(compiler, op, dst_r)); + compiler->mode = op & SLJIT_I32_OP; + compiler->status_flags_state = op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z); + + if (GET_OPCODE(op) >= SLJIT_ADD || GET_OPCODE(op) <= SLJIT_SUBC) + compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_ADD_SUB; + + if (is_commutative(op) && (src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM)) { + src1 ^= src2; + src2 ^= src1; + src1 ^= src2; + + src1w ^= src2w; + src2w ^= src1w; + src1w ^= src2w; + } - /* finally write the result to memory if required */ - if (dst & SLJIT_MEM) { - SLJIT_ASSERT(dst_r != tmp1); - /* TODO(carenas): s/FAIL_IF/ return */ - FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP)); + switch (GET_OPCODE(op)) { + case SLJIT_ADD: + return sljit_emit_add(compiler, op, dst, dstw, src1, src1w, src2, src2w); + case SLJIT_ADDC: + FAIL_IF(emit_commutative(compiler, &addc_forms, dst, dstw, src1, src1w, src2, src2w)); + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); + return SLJIT_SUCCESS; + case SLJIT_SUB: + return sljit_emit_sub(compiler, op, dst, dstw, src1, src1w, src2, src2w); + case SLJIT_SUBC: + FAIL_IF(emit_non_commutative(compiler, &subc_forms, dst, dstw, src1, src1w, src2, src2w)); + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); + return SLJIT_SUCCESS; + case SLJIT_MUL: + FAIL_IF(sljit_emit_multiply(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + break; + case SLJIT_AND: + case SLJIT_OR: + case SLJIT_XOR: + FAIL_IF(sljit_emit_bitwise(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + break; + case SLJIT_SHL: + case SLJIT_LSHR: + case SLJIT_ASHR: + FAIL_IF(sljit_emit_shift(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + break; } + if (dst & SLJIT_MEM) + return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP); return SLJIT_SUCCESS; } @@ -2429,7 +2663,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src( case SLJIT_FAST_RETURN: src_r = FAST_IS_REG(src) ? gpr(src) : tmp1; if (src & SLJIT_MEM) - FAIL_IF(load_word(compiler, tmp1, src, srcw, tmp1, 0)); + FAIL_IF(load_word(compiler, tmp1, src, srcw, 0)); return push_inst(compiler, br(src_r)); case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN: @@ -2508,7 +2742,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler * return push_inst(compiler, lgr(gpr(dst), fast_link_r)); /* memory */ - return store_word(compiler, fast_link_r, dst, dstw, tmp1, 0); + return store_word(compiler, fast_link_r, dst, dstw, 0); } /* --------------------------------------------------------------------- */ @@ -2533,15 +2767,11 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) { - sljit_u8 mask = ((type & 0xff) < SLJIT_JUMP) ? get_cc(type & 0xff) : 0xf; + sljit_u8 mask = ((type & 0xff) < SLJIT_JUMP) ? get_cc(compiler, type & 0xff) : 0xf; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_emit_jump(compiler, type)); - /* reload condition code */ - if (mask != 0xf) - PTR_FAIL_IF(push_load_cc(compiler, type & 0xff)); - /* record jump */ struct sljit_jump *jump = (struct sljit_jump *) ensure_abuf(compiler, sizeof(struct sljit_jump)); @@ -2586,7 +2816,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi FAIL_IF(push_load_imm_inst(compiler, src_r, srcw)); } else if (src & SLJIT_MEM) - FAIL_IF(load_word(compiler, src_r, src, srcw, tmp1, 0 /* 64-bit */)); + FAIL_IF(load_word(compiler, src_r, src, srcw, 0 /* 64-bit */)); /* emit jump instruction */ if (type >= SLJIT_FAST_CALL) @@ -2614,7 +2844,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co sljit_s32 dst, sljit_sw dstw, sljit_s32 type) { - sljit_u8 mask = get_cc(type & 0xff); + sljit_u8 mask = get_cc(compiler, type & 0xff); CHECK_ERROR(); CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); @@ -2625,9 +2855,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co case SLJIT_AND: case SLJIT_OR: case SLJIT_XOR: + compiler->status_flags_state = op & SLJIT_SET_Z; + /* dst is also source operand */ if (dst & SLJIT_MEM) - FAIL_IF(load_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP)); + FAIL_IF(load_word(compiler, dst_r, dst, dstw, op & SLJIT_I32_OP)); break; case SLJIT_MOV: @@ -2639,9 +2871,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co SLJIT_UNREACHABLE(); } - if (mask != 0xf) - FAIL_IF(push_load_cc(compiler, type & 0xff)); - /* TODO(mundaym): fold into cmov helper function? */ #define LEVAL(i) i(loc_r, 1, mask) if (have_lscond2()) { @@ -2672,14 +2901,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co #undef LEVAL } - /* set zero flag if needed */ - if (op & SLJIT_SET_Z) - FAIL_IF(push_store_zero_flag(compiler, op, dst_r)); - /* store result to memory if required */ - /* TODO(carenas): s/FAIL_IF/ return */ if (dst & SLJIT_MEM) - FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP)); + return store_word(compiler, dst_r, dst, dstw, op & SLJIT_I32_OP); return SLJIT_SUCCESS; } @@ -2688,16 +2912,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil sljit_s32 dst_reg, sljit_s32 src, sljit_sw srcw) { - sljit_u8 mask = get_cc(type & 0xff); + sljit_u8 mask = get_cc(compiler, type & 0xff); sljit_gpr dst_r = gpr(dst_reg & ~SLJIT_I32_OP); sljit_gpr src_r = FAST_IS_REG(src) ? gpr(src) : tmp0; CHECK_ERROR(); CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); - if (mask != 0xf) - FAIL_IF(push_load_cc(compiler, type & 0xff)); - if (src & SLJIT_IMM) { /* TODO(mundaym): fast path with lscond2 */ FAIL_IF(push_load_imm_inst(compiler, src_r, srcw)); @@ -2751,7 +2972,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi } if (dst & SLJIT_MEM) - PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, 0 /* always 64-bit */)); + PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, 0 /* always 64-bit */)); return (struct sljit_const*)const_; } @@ -2798,7 +3019,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label *sljit_emit_put_label( } if (dst & SLJIT_MEM) - PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, 0)); + PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, 0)); return put_label; } diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeSPARC_32.c b/ext/pcre/pcre2lib/sljit/sljitNativeSPARC_32.c index e5167f02baaa9..28886405afc0d 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeSPARC_32.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeSPARC_32.c @@ -93,18 +93,21 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl return push_inst(compiler, ADD | D(dst) | S1(dst) | IMM(1), UNMOVABLE_INS); case SLJIT_ADD: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, ADD | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_ADDC: return push_inst(compiler, ADDC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_SUB: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, SUB | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_SUBC: return push_inst(compiler, SUBC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_MUL: + compiler->status_flags_state = 0; FAIL_IF(push_inst(compiler, SMUL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); if (!(flags & SET_FLAGS)) return SLJIT_SUCCESS; diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeSPARC_common.c b/ext/pcre/pcre2lib/sljit/sljitNativeSPARC_common.c index 544d80d0287de..e833f09d7a5a8 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeSPARC_common.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeSPARC_common.c @@ -1275,16 +1275,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi return label; } -static sljit_ins get_cc(sljit_s32 type) +static sljit_ins get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: - case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_NOT_EQUAL_F64: /* Unordered. */ return DA(0x1); case SLJIT_NOT_EQUAL: - case SLJIT_MUL_OVERFLOW: case SLJIT_EQUAL_F64: return DA(0x9); @@ -1317,10 +1315,16 @@ static sljit_ins get_cc(sljit_s32 type) return DA(0x2); case SLJIT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return DA(0x9); + case SLJIT_UNORDERED_F64: return DA(0x7); case SLJIT_NOT_OVERFLOW: + if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB)) + return DA(0x1); + case SLJIT_ORDERED_F64: return DA(0xf); @@ -1347,7 +1351,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & ICC_IS_SET)) jump->flags |= IS_MOVABLE; #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) - PTR_FAIL_IF(push_inst(compiler, BICC | get_cc(type ^ 1) | 5, UNMOVABLE_INS)); + PTR_FAIL_IF(push_inst(compiler, BICC | get_cc(compiler, type ^ 1) | 5, UNMOVABLE_INS)); #else #error "Implementation required" #endif @@ -1357,7 +1361,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & FCC_IS_SET)) jump->flags |= IS_MOVABLE; #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) - PTR_FAIL_IF(push_inst(compiler, FBFCC | get_cc(type ^ 1) | 5, UNMOVABLE_INS)); + PTR_FAIL_IF(push_inst(compiler, FBFCC | get_cc(compiler, type ^ 1) | 5, UNMOVABLE_INS)); #else #error "Implementation required" #endif @@ -1474,9 +1478,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co type &= 0xff; if (type < SLJIT_EQUAL_F64) - FAIL_IF(push_inst(compiler, BICC | get_cc(type) | 3, UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, BICC | get_cc(compiler, type) | 3, UNMOVABLE_INS)); else - FAIL_IF(push_inst(compiler, FBFCC | get_cc(type) | 3, UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, FBFCC | get_cc(compiler, type) | 3, UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(1), UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(0), UNMOVABLE_INS)); diff --git a/ext/pcre/pcre2lib/sljit/sljitNativeX86_common.c b/ext/pcre/pcre2lib/sljit/sljitNativeX86_common.c index ddcc5ebf7671b..515d98aefd1db 100644 --- a/ext/pcre/pcre2lib/sljit/sljitNativeX86_common.c +++ b/ext/pcre/pcre2lib/sljit/sljitNativeX86_common.c @@ -411,11 +411,9 @@ static sljit_u8 get_jump_code(sljit_s32 type) return 0x8e /* jle */; case SLJIT_OVERFLOW: - case SLJIT_MUL_OVERFLOW: return 0x80 /* jo */; case SLJIT_NOT_OVERFLOW: - case SLJIT_MUL_NOT_OVERFLOW: return 0x81 /* jno */; case SLJIT_UNORDERED_F64: From 49f44e7ffc1864b915762cded7800cbfca3b92d6 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 25 Nov 2021 22:21:44 +0300 Subject: [PATCH 16/50] JIT: Fixed use-after-free caused by shift by negative number Fixes oss-fuzz #41192 --- ext/opcache/jit/zend_jit_x86.dasc | 21 ++++++++++++ ext/opcache/tests/jit/shift_right_004.phpt | 40 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 ext/opcache/tests/jit/shift_right_004.phpt diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 122eb298e7e13..f71a3022a32bf 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -3906,6 +3906,15 @@ static int zend_jit_load_var(dasm_State **Dst, uint32_t info, int var, zend_reg return zend_jit_load_reg(Dst, src, dst, info); } +static int zend_jit_invalidate_var_if_necessary(dasm_State **Dst, zend_uchar op_type, zend_jit_addr addr, znode_op op) +{ + if ((op_type & (IS_TMP_VAR|IS_VAR)) && Z_MODE(addr) == IS_REG && !Z_LOAD(addr) && !Z_STORE(addr)) { + zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, op.var); + | SET_ZVAL_TYPE_INFO dst, IS_UNDEF + } + return 1; +} + static int zend_jit_update_regs(dasm_State **Dst, uint32_t var, zend_jit_addr src, zend_jit_addr dst, uint32_t info) { if (!zend_jit_same_addr(src, dst)) { @@ -5024,6 +5033,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst, if (EXPECTED(op2_lval > 0)) { | xor Ra(result_reg), Ra(result_reg) } else { + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); | SET_EX_OPLINE opline, r0 | jmp ->negative_shift } @@ -5047,6 +5058,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst, | cmp r1, 0 | mov Ra(result_reg), 0 | jg >1 + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); | SET_EX_OPLINE opline, r0 | jmp ->negative_shift |.code @@ -5064,6 +5077,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst, if (EXPECTED(op2_lval > 0)) { | sar Ra(result_reg), (SIZEOF_ZEND_LONG * 8) - 1 } else { + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); | SET_EX_OPLINE opline, r0 | jmp ->negative_shift } @@ -5084,6 +5099,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst, | cmp r1, 0 | mov r1, (SIZEOF_ZEND_LONG * 8) - 1 | jg >1 + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); | SET_EX_OPLINE opline, r0 | jmp ->negative_shift |.code @@ -5096,6 +5113,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst, zend_long op2_lval = Z_LVAL_P(Z_ZV(op2_addr)); if (op2_lval == 0) { + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); | SET_EX_OPLINE opline, r0 | jmp ->mod_by_zero } else if (zend_long_is_power_of_two(op2_lval) && op1_range && op1_range->min >= 0) { @@ -5135,6 +5154,8 @@ static int zend_jit_long_math_helper(dasm_State **Dst, | jz >1 |.cold_code |1: + zend_jit_invalidate_var_if_necessary(Dst, op1_type, op1_addr, op1); + zend_jit_invalidate_var_if_necessary(Dst, op2_type, op2_addr, op2); | SET_EX_OPLINE opline, r0 | jmp ->mod_by_zero |.code diff --git a/ext/opcache/tests/jit/shift_right_004.phpt b/ext/opcache/tests/jit/shift_right_004.phpt new file mode 100644 index 0000000000000..7a59c19dfb228 --- /dev/null +++ b/ext/opcache/tests/jit/shift_right_004.phpt @@ -0,0 +1,40 @@ +--TEST-- +JIT Shift Right: 004 +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.protect_memory=1 +--FILE-- +> 4 - $j++; + if ($j > 14) break; + } +} +test(); +?> +--EXPECTF-- +Warning: Undefined variable $a in %sshift_right_004.php on line 8 + +Warning: Undefined variable $a in %sshift_right_004.php on line 8 + +Warning: Undefined variable $c in %sshift_right_004.php on line 7 + +Warning: Undefined array key 0 in %sshift_right_004.php on line 7 + +Warning: A non-numeric value encountered in %sshift_right_004.php on line 7 + +Warning: A non-numeric value encountered in %sshift_right_004.php on line 7 + +Fatal error: Uncaught ArithmeticError: Bit shift by negative number in %sshift_right_004.php:8 +Stack trace: +#0 %sshift_right_004.php(12): test() +#1 {main} + thrown in %sshift_right_004.php on line 8 From 442304485e641b1d9be04082231888d994580809 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 25 Nov 2021 22:40:26 +0300 Subject: [PATCH 17/50] Fixed test (added 8.1 deprecation) --- ext/opcache/tests/jit/shift_right_004.phpt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/opcache/tests/jit/shift_right_004.phpt b/ext/opcache/tests/jit/shift_right_004.phpt index 7a59c19dfb228..8b1c8069984f6 100644 --- a/ext/opcache/tests/jit/shift_right_004.phpt +++ b/ext/opcache/tests/jit/shift_right_004.phpt @@ -29,6 +29,8 @@ Warning: Undefined variable $c in %sshift_right_004.php on line 7 Warning: Undefined array key 0 in %sshift_right_004.php on line 7 +Deprecated: Implicit conversion from float %f to int loses precision in %sshift_right_004.php on line 8 + Warning: A non-numeric value encountered in %sshift_right_004.php on line 7 Warning: A non-numeric value encountered in %sshift_right_004.php on line 7 From c2d6d837cab244b6e2520593685a4bd3f6661ee5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 26 Nov 2021 09:44:07 +0100 Subject: [PATCH 18/50] Disable enchant on azure i386 The i386 libenchant library no longer installs without conflicts, so drop i386 testing for this extension. --- azure/i386/apt.yml | 2 -- azure/i386/job.yml | 1 - 2 files changed, 3 deletions(-) diff --git a/azure/i386/apt.yml b/azure/i386/apt.yml index 9ae39443755d8..e9aa38681209f 100644 --- a/azure/i386/apt.yml +++ b/azure/i386/apt.yml @@ -15,14 +15,12 @@ steps: re2c \ locales \ language-pack-de \ - libglib2.0-dev:i386 \ libssl-dev:i386 \ zlib1g-dev:i386 \ libxml2-dev:i386 \ libgmp-dev:i386 \ libicu-dev:i386 \ libtidy-dev:i386 \ - libenchant-dev:i386 \ libaspell-dev:i386 \ libpspell-dev:i386 \ libsasl2-dev:i386 \ diff --git a/azure/i386/job.yml b/azure/i386/job.yml index 4ca8296605500..6f2e43a016f5b 100644 --- a/azure/i386/job.yml +++ b/azure/i386/job.yml @@ -56,7 +56,6 @@ jobs: --enable-calendar \ --enable-ftp \ --with-pspell=/usr \ - --with-enchant=/usr \ --with-kerberos \ --enable-sysvmsg \ --with-ffi \ From 1a2c608053060f01a74e458fe68d1473be67c4df Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Thu, 25 Nov 2021 11:55:41 +0200 Subject: [PATCH 19/50] Add unit tests for mb_detect_encoding on Polish text --- ext/mbstring/tests/mb_detect_encoding.phpt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ext/mbstring/tests/mb_detect_encoding.phpt b/ext/mbstring/tests/mb_detect_encoding.phpt index f2be2a617dbcb..ce67dc87e7078 100644 --- a/ext/mbstring/tests/mb_detect_encoding.phpt +++ b/ext/mbstring/tests/mb_detect_encoding.phpt @@ -12,25 +12,24 @@ $sjis = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg=='); $jis = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg=='); // EUC-JP string $euc_jp = "\xC6\xFC\xCB\xDC\xB8\xEC\xA5\xC6\xA5\xAD\xA5\xB9\xA5\xC8\xA4\xC7\xA4\xB9\xA1\xA301234\xA3\xB5\xA3\xB6\xA3\xB7\xA3\xB8\xA3\xB9\xA1\xA3"; +// UTF-8 +$polish1 = "Zażółć gęślą jaźń."; +$polish2 = "Wół poszedł spać bardzo wcześnie. A to zdanie bez ogonka."; echo "== BASIC TEST ==\n"; print("SJIS: " . mb_detect_encoding($sjis, 'SJIS') . "\n"); - print("JIS: " . mb_detect_encoding($jis, 'JIS') . "\n"); - print("EUC-JP: " . mb_detect_encoding($euc_jp, 'UTF-8,EUC-JP,JIS') . "\n"); - print("EUC-JP: " . mb_detect_encoding($euc_jp, 'JIS,EUC-JP') . "\n"); +print("UTF-8: " . mb_detect_encoding($polish1, 'UTF-8,UTF-16,ISO-8859-1') . "\n"); +print("UTF-8: " . mb_detect_encoding($polish2, 'UTF-8,UTF-16,ISO-8859-1') . "\n"); echo "== ARRAY ENCODING LIST ==\n"; $a = ['UTF-8', 'EUC-JP', 'SJIS', 'JIS']; - print("JIS: " . mb_detect_encoding($jis, $a) . "\n"); - print("EUC-JP: " . mb_detect_encoding($euc_jp, $a) . "\n"); - print("SJIS: " . mb_detect_encoding($sjis, $a) . "\n"); $test = "CHARSET=windows-1252:Do\xeb;John"; @@ -226,6 +225,8 @@ $deEncodings = [ ]; test($deStrings, $deEncodings); +test([$polish1, $polish2], ['UTF-32BE', 'UTF-32LE', 'UTF-16BE', 'UTF-16LE', 'UTF-8', 'ISO-8859-2']); + echo "Done!\n"; ?> @@ -235,6 +236,8 @@ SJIS: SJIS JIS: JIS EUC-JP: EUC-JP EUC-JP: EUC-JP +UTF-8: UTF-8 +UTF-8: UTF-8 == ARRAY ENCODING LIST == JIS: JIS EUC-JP: EUC-JP From ac96db67673882c6a07cc99a8e0968d1586eed9a Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Sat, 27 Nov 2021 11:06:14 +0100 Subject: [PATCH 20/50] Preparing for 8.1.1 --- Zend/zend.h | 2 +- configure.ac | 2 +- main/php_version.h | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Zend/zend.h b/Zend/zend.h index db7d075d505ec..b4cabb7ae7601 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -20,7 +20,7 @@ #ifndef ZEND_H #define ZEND_H -#define ZEND_VERSION "4.1.0-dev" +#define ZEND_VERSION "4.1.1-dev" #define ZEND_ENGINE_3 diff --git a/configure.ac b/configure.ac index 9410f9a6ab789..e6270a7523533 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ dnl Basic autoconf initialization, generation of config.nice. dnl ---------------------------------------------------------------------------- AC_PREREQ([2.68]) -AC_INIT([PHP],[8.1.0-dev],[https://bugs.php.net],[php],[https://www.php.net]) +AC_INIT([PHP],[8.1.1-dev],[https://bugs.php.net],[php],[https://www.php.net]) AC_CONFIG_SRCDIR([main/php_version.h]) AC_CONFIG_AUX_DIR([build]) AC_PRESERVE_HELP_ORDER diff --git a/main/php_version.h b/main/php_version.h index 66d4367856e5a..44f483c823bf6 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.ac to change version number */ #define PHP_MAJOR_VERSION 8 #define PHP_MINOR_VERSION 1 -#define PHP_RELEASE_VERSION 0 +#define PHP_RELEASE_VERSION 1 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "8.1.0-dev" -#define PHP_VERSION_ID 80100 +#define PHP_VERSION "8.1.1-dev" +#define PHP_VERSION_ID 80101 From 22756f56b28a88c6f120fb26fe590795ab93b1ce Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Sat, 27 Nov 2021 12:54:14 +0100 Subject: [PATCH 21/50] Sorting and standardize NEWS entries --- NEWS | 484 +++++++++++++++++++++++------------------------------------ 1 file changed, 187 insertions(+), 297 deletions(-) diff --git a/NEWS b/NEWS index 08115cb4ab90c..512ae1c4bc2e0 100644 --- a/NEWS +++ b/NEWS @@ -7,78 +7,25 @@ PHP NEWS (cmb) - PCRE: - . Update bundled PCRE2 to 10.39 (cmb) + . Update bundled PCRE2 to 10.39. (cmb) 25 Nov 2021, PHP 8.1.0 -- Core: - . Fixed bug #81607 (CE_CACHE allocation with concurrent access). (Nikita, - Dmitry) - -- FPM: - . Fixed bug #81513 (Future possibility for heap overflow in FPM zlog). - (Jakub Zelenka) - -- Reflection: - . Fixed bug #81611 (ArgumentCountError when getting default value from - ReflectionParameter with new). (Cameron Porter) - . Fixed bug #81630 (PHP 8.1: ReflectionClass->getTraitAliases() crashes with - Internal error). (Nikita) - -- XML: - . Fixed bug #79971 (special character is breaking the path in xml function). - (CVE-2021-21707) (cmb) +- CLI: + . Fixed bug #81496 (Server logs incorrect request method). (lauri) -11 Nov 2021, PHP 8.1.0RC6 +- COM: + . Dispatch using LANG_NEUTRAL instead of LOCALE_SYSTEM_DEFAULT. (Dmitry + Maksimov) - Core: + . Fixed bug #81607 (CE_CACHE allocation with concurrent access). (Nikita, + Dmitry) . Fixed bug #81507 (Fiber does not compile on AIX). (Clément Chigot) . Fixed bug #78647 (SEGFAULT in zend_do_perform_implementation_check). (Nikita) - -- Date: - . Fixed bug #81458 (Regression Incorrect difference after timezone change). - (Derick) - -- GD: - . Fixed bug #71316 (libpng warning from imagecreatefromstring). (cmb) - -- Standard: - . Fixed bug #81441 (gethostbyaddr('::1') returns ip instead of name after - calling some other method). (Nikita) - -28 Oct 2021, PHP 8.1.0RC5 - -- Core: . Fixed bug #81518 (Header injection via default_mimetype / default_charset). (cmb) - -- Date: - . Fixed bug #81500 (Interval serialization regression since 7.3.14 / 7.4.2). - (cmb) - -- DBA: - . Fixed bug #81588 (TokyoCabinet driver leaks memory). (girgias) - -- FPM: - . Fixed bug #81026 (PHP-FPM oob R/W in root process leading to privilege - escalation) (CVE-2021-21703). (Jakub Zelenka) - -- JSON: - . Fixed bug #81532 (Change of $depth behaviour in json_encode() on PHP 8.1). - (Nikita) - -- MBString: - . Fixed bug #76167 (mbstring may use pointer from some previous request). - (cmb, cataphract) - . Fixed bug #81390 (mb_detect_encoding() regression). (alexdowad) - -14 Oct 2021, PHP 8.1.0RC4 - -- CLI: - . Fixed bug #81496 (Server logs incorrect request method). (lauri) - -- Core: . Fixed bug #75941 (Fix compile failure on Solaris with clang). (Jaromír Doleček) . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) @@ -86,95 +33,7 @@ PHP NEWS (Nikita) . Fixed Bug #81520 (TEST_PHP_CGI_EXECUTABLE badly set in run-tests.php). (Remi) - -- Date: - . Fixed bug #81504 (Incorrect timezone transition details for POSIX data). - (Derick) - -- PCRE: - . Fixed bug #81424 (PCRE2 10.35 JIT performance regression). (cmb) - -- PgSQL: - . Fixed bug #81509 (pg_end_copy still expects a resource). (Matteo) - -- OpenSSL: - . Fixed bug #81502 ($tag argument of openssl_decrypt() should accept - null/empty string). (Nikita) - -- Standard: - . Fixed bug #81491 (Incorrectly using libsodium for argon2 hashing). - (Dan Pock) - . Fixed bug #66588 (SplFileObject::fgetcsv incorrectly returns a row on - premature EOF). (Aliaksandr Bystry) - -- Streams: - . Fixed bug #81475 (stream_isatty emits warning with attached stream wrapper). - (cmb) - -- Zip: - . Fixed bug #81490 (ZipArchive::extractTo() may leak memory). (cmb, Remi) - . Fixed bug #77978 (Dirname ending in colon unzips to wrong dir). (cmb) - -30 Sep 2021, PHP 8.1.0RC3 - -- Filter: - . Fixed bug #61700 (FILTER_FLAG_IPV6/FILTER_FLAG_NO_PRIV|RES_RANGE failing). - (cmb, Nikita) - -- Reflection: - . Fixed bug #81457 (Enum: ReflectionMethod->getDeclaringClass() return a - ReflectionClass). (Nikita) - . Fixed bug #81474 (Make ReflectionEnum and related class non-final). (Nikita) - -- SPL: - . Fixed bug #80663 (Recursive SplFixedArray::setSize() may cause double-free). - (cmb, Nikita, Tyson Andre) - . Fixed bug #81477 (LimitIterator + SplFileObject regression in 8.0.1). (cmb) - -- XML: - . Fixed bug #70962 (XML_OPTION_SKIP_WHITE strips embedded whitespace). - (Aliaksandr Bystry, cmb) - -- Zip: - . Fixed bug #81420 (ZipArchive::extractTo extracts outside of destination). - (CVE-2021-21706) (cmb) - -16 Sep 2021, PHP 8.1.0RC2 - -- DOM: - . Fixed bug #81433 (DOMElement::setIdAttribute() called twice may remove ID). - (Viktor Volkov) - -- FFI: - . Fixed bug #79576 ("TYPE *" shows unhelpful message when type is not - defined). (Dmitry) - -- Shmop: - . Fixed bug #81407 (shmop_open won't attach and causes php to crash). (cmb) - -- Opcache: - . Fixed bug #81409 (Incorrect JIT code for ADD with a reference to array). - (Dmitry) - -- Zip: - . Fixed bug #80833 (ZipArchive::getStream doesn't use setPassword). (Remi) - -02 Sep 2021, PHP 8.1.0RC1 - -- Core: . Fixed bug #81377 (unset() of $GLOBALS sub-key yields warning). (Nikita) - -- COM: - . Dispatch using LANG_NEUTRAL instead of LOCALE_SYSTEM_DEFAULT. (Dmitry - Maksimov) - -- Date: - . Fixed bug #80998 (Missing second with inverted interval). (Derick) - . Speed up finding timezone offset information. (Derick) - -19 Aug 2021, PHP 8.1.0beta3 - -- Core: . Fixed bug #81342 (New ampersand token parsing depends on new line after it). (Nikita) . Fixed bug #81280 (Unicode characters in cli.prompt causes segfault). @@ -183,125 +42,12 @@ PHP NEWS line number with traits). (Nikita) . Fixed bug #78919 (CLI server: insufficient cleanup if request startup fails). (cataphract, cmb) - -- Date: - . Fixed bug #79580 (date_create_from_format misses leap year). (Derick) - . Fixed bug #80963 (DateTimeZone::getTransitions() truncated). (Derick) - . Fixed bug #80974 (Wrong diff between 2 dates in different timezones). - (Derick) - . Fixed bug #80998 (Missing second with inverted interval). (Derick) - . Fixed bug #81097 (DateTimeZone silently falls back to UTC when providing an - offset with seconds). (Derick) - . Fixed bug #81106 (Regression in 8.1: add() now truncate ->f). (Derick) - . Fixed bug #81273 (Date interval calculation not correct). (Derick) - -- Mbstring: - . Fixed bug #81349 (mb_detect_encoding misdetcts ASCII in some cases). - (Nikita) - -- PDO PgSQL: - . Fixed bug #81343 (pdo_pgsql: Inconsitent boolean conversion after calling - closeCursor()). (Philip Hofstetter) - -- Phar: - . Use SHA256 by default for signature. (remi) - . Add support for OpenSSL_SHA256 and OpenSSL_SHA512 signature. (remi) - -- SNMP: - . Implement SHA256 and SHA512 for security protocol. (remi) - -- Standard: - . Fixed bug #81142 (PHP 7.3+ memory leak when unserialize() is used on an - associative array). (Nikita) - -05 Aug 2021, PHP 8.1.0beta2 - -- Core: . Fixed bug #81303 (match error message improvements). (krakjoe) - -- Mbstring: - . Fixed bug #81298 (mb_detect_encoding() segfaults when 7bit encoding is - specified). (Nikita) - -- MySQLnd: - . Fixed bug #63327 (Crash (Bus Error) in mysqlnd due to wrong alignment). - (Nikita) - -- Opcache: - . Fixed Bug #81255 (Memory leak in PHPUnit with functional JIT) - . Fixed Bug #80959 (infinite loop in building cfg during JIT compilation) - (Nikita, Dmitry) - -- Reflection: - . Fixed bug #80821 (ReflectionProperty::getDefaultValue() returns current - value for statics). (Nikita) - . Fixed bug #80564 (ReflectionProperty::__toString() renders current value, - not default value). (Nikita) - -- SimpleXML: - . Fixed bug #81325 (Segfault in zif_simplexml_import_dom). (remi) - -22 Jul 2021, PHP 8.1.0beta1 - -- Core: - . Fixed bug #81238 (Fiber support missing for Solaris Sparc). (trowski) - . Fixed bug #81237 (Comparison of fake closures doesn't work). (krakjoe) - -- Opcache: - . Fixed bug #81225 (Wrong result with pow operator with JIT enabled). - (Dmitry) - . Fixed bug #81249 (Intermittent property assignment failure with JIT - enabled). (Dmitry) - . Fixed bug #81256 (Assertion `zv != ((void *)0)' failed for "preload" with - JIT). (Dmitry) - -- Reflection: - . Fixed bug #80097 (ReflectionAttribute is not a Reflector). (beberlei) - -- Standard: - . Fixed bug #81111 (Serialization is unexpectedly allowed on anonymous classes - with __serialize()). (Nikita) - -08 Jul 2021, PHP 8.1.0alpha3 - -- Core: + . Fixed bug #81238 (Fiber support missing for Solaris Sparc). (trowski) + . Fixed bug #81237 (Comparison of fake closures doesn't work). (krakjoe) . Fixed bug #81202 (powerpc64 build fails on fibers). (krakjoe) . Fixed bug #80072 (Cyclic unserialize in TMPVAR operand may leak). (Nikita) - -- Curl: - . Fixed bug #81085 (Support CURLOPT_SSLCERT_BLOB for cert strings). - (camporter) - -- Reflection: - . Fixed bug #81200 (no way to determine if Closure is static). (krakjoe) - -24 Jun 2021, PHP 8.1.0alpha2 - -- Core: . Fixed bug #81163 (__sleep allowed to return non-array). (krakjoe) - -- Opcache: - . Fixed bug #81133 (building opcache with phpize fails). (krakjoe) - . Fixed bug #81136 (opcache header not installed). (krakjoe) - -- PDO OCI: - . Fixed bug #77120 (Support 'success with info' at connection). - (Sergei Morozov) - -- phpdbg: - . Fixed bug #81135 (unknown help topic causes assertion failure). (krakjoe) - -- SPL: - . Fixed bug #81112 (Special json_encode behavior for SplFixedArray). (Nikita) - . Fixed bug #80945 ("Notice: Undefined index" on unset() ArrayObject - non-existing key). (Nikita) - -- Standard: - . Fixed bug #81137 (hrtime breaks build on OSX before Sierra). (krakjoe) - -10 Jun 2021, PHP 8.1.0alpha1 - -- Core: . Fixed inclusion order for phpize builds on Windows. (cmb) . Added missing hashtable insertion APIs for arr/obj/ref. (Sara) . Fixed bug #75474 (function scope static variables are not bound to a unique @@ -312,49 +58,85 @@ PHP NEWS (Björn Tantau) . Fixed bug #81076 (incorrect debug info on Closures with implicit binds). (krakjoe) - - - Standard: - . Fixed bug #77627 (method_exists on Closure::__invoke inconsistency). - (krakjoe) + +- Curl: + . Fixed bug #81085 (Support CURLOPT_SSLCERT_BLOB for cert strings). + (camporter) - Date: - . Fixed bug #52480 (Incorrect difference using DateInterval) (Derick) - . Fixed bug #62326 (date_diff() function returns false result) (Derick) - . Fixed bug #64992 (dst not handled past 2038) (Derick) - . Fixed bug #65003 (Wrong date diff) (Derick) - . Fixed bug #66545 (DateTime. diff returns negative values) (Derick) + . Fixed bug #81458 (Regression Incorrect difference after timezone change). + (Derick) + . Fixed bug #81500 (Interval serialization regression since 7.3.14 / 7.4.2). + (cmb) + . Fixed bug #81504 (Incorrect timezone transition details for POSIX data). + (Derick) + . Fixed bug #80998 (Missing second with inverted interval). (Derick) + . Speed up finding timezone offset information. (Derick) + . Fixed bug #79580 (date_create_from_format misses leap year). (Derick) + . Fixed bug #80963 (DateTimeZone::getTransitions() truncated). (Derick) + . Fixed bug #80974 (Wrong diff between 2 dates in different timezones). + (Derick) + . Fixed bug #80998 (Missing second with inverted interval). (Derick) + . Fixed bug #81097 (DateTimeZone silently falls back to UTC when providing an + offset with seconds). (Derick) + . Fixed bug #81106 (Regression in 8.1: add() now truncate ->f). (Derick) + . Fixed bug #81273 (Date interval calculation not correct). (Derick) + . Fixed bug #52480 (Incorrect difference using DateInterval). (Derick) + . Fixed bug #62326 (date_diff() function returns false result). (Derick) + . Fixed bug #64992 (dst not handled past 2038). (Derick) + . Fixed bug #65003 (Wrong date diff). (Derick) + . Fixed bug #66545 (DateTime. diff returns negative values). (Derick) . Fixed bug #68503 (date_diff on two dates with timezone set localised - returns wrong results) (Derick) - . Fixed bug #69806 (Incorrect date from timestamp) (Derick) - . Fixed bug #71700 (Extra day on diff between begin and end of march 2016) + returns wrong results). (Derick) + . Fixed bug #69806 (Incorrect date from timestamp). (Derick) + . Fixed bug #71700 (Extra day on diff between begin and end of march 2016). (Derick) - . Fixed bug #71826 (DateTime::diff confuse on timezone 'Asia/Tokyo') (Derick) + . Fixed bug #71826 (DateTime::diff confuse on timezone 'Asia/Tokyo'). (Derick) . Fixed bug #73460 (Datetime add not realising it already applied DST - change) (Derick) + change). (Derick) . Fixed bug #74173 (DateTimeImmutable::getTimestamp() triggers DST switch in - incorrect time) (Derick) - . Fixed bug #74274 (Handling DST transitions correctly) (Derick) - . Fixed bug #74524 (Date diff is bad calculated, in same time zone) (Derick) + incorrect time). (Derick) + . Fixed bug #74274 (Handling DST transitions correctly). (Derick) + . Fixed bug #74524 (Date diff is bad calculated, in same time zone). (Derick) . Fixed bug #75167 (DateTime::add does only care about backward DST - transition, not forward) (Derick) + transition, not forward). (Derick) . Fixed bug #76032 (DateTime->diff having issues with leap days for - timezones ahead of UTC) (Derick) - . Fixed bug #76374 (Date difference varies according day time) (Derick) + timezones ahead of UTC). (Derick) + . Fixed bug #76374 (Date difference varies according day time). (Derick) . Fixed bug #77571 (DateTime's diff DateInterval incorrect in timezones from - UTC+01:00 to UTC+12:00 (Derick) - . Fixed bug #78452 (diff makes wrong in hour for Asia/Tehran) (Derick) + UTC+01:00 to UTC+12:00). (Derick) + . Fixed bug #78452 (diff makes wrong in hour for Asia/Tehran). (Derick) . Fixed bug #79452 (DateTime::diff() generates months differently between - time zones) (Derick) + time zones). (Derick) . Fixed bug #79698 (timelib mishandles future timestamps (triggered by 'zic - -b slim')) (Derick) - . Fixed bug #79716 (Invalid date time created (with day "00")) (Derick) - . Fixed bug #80610 (DateTime calculate wrong with DateInterval) (Derick) + -b slim')). (Derick) + . Fixed bug #79716 (Invalid date time created (with day "00")). (Derick) + . Fixed bug #80610 (DateTime calculate wrong with DateInterval). (Derick) . Fixed bug #80664 (DateTime objects behave incorrectly around DST - transition) (Derick) + transition). (Derick) . Fixed bug #80913 (DateTime(Immutable)::sub around DST yield incorrect - time) (Derick) + time). (Derick) + +- DBA: + . Fixed bug #81588 (TokyoCabinet driver leaks memory). (girgias) + +- DOM: + . Fixed bug #81433 (DOMElement::setIdAttribute() called twice may remove ID). + (Viktor Volkov) + +- FFI: + . Fixed bug #79576 ("TYPE *" shows unhelpful message when type is not + defined). (Dmitry) + +- Filter: + . Fixed bug #61700 (FILTER_FLAG_IPV6/FILTER_FLAG_NO_PRIV|RES_RANGE failing). + (cmb, Nikita) - FPM: + . Fixed bug #81513 (Future possibility for heap overflow in FPM zlog). + (Jakub Zelenka) + . Fixed bug #81026 (PHP-FPM oob R/W in root process leading to privilege + escalation) (CVE-2021-21703). (Jakub Zelenka) . Added openmetrics status format. (Cees-Jan Kiewiet) . Enable process renaming on macOS. (devnexen) . Added pm.max_spawn_rate option to configure max spawn child processes rate. @@ -365,17 +147,31 @@ PHP NEWS . Convert resource to object \FTP\Connection. (Sara) - GD: + . Fixed bug #71316 (libpng warning from imagecreatefromstring). (cmb) . Convert resource to object \GdFont. (Sara) - hash: . Implemented FR #68109 (Add MurmurHash V3). (Anatol, Michael) . Implemented FR #73385 (Add xxHash support). (Anatol) +- JSON: + . Fixed bug #81532 (Change of $depth behaviour in json_encode() on PHP 8.1). + (Nikita) + - LDAP: . Convert resource to object \LDAP\Connection. (Máté) . Convert resource to object \LDAP\Result. (Máté) . Convert resource to object \LDAP\ResultEntry. (Máté) +- MBString: + . Fixed bug #76167 (mbstring may use pointer from some previous request). + (cmb, cataphract) + . Fixed bug #81390 (mb_detect_encoding() regression). (alexdowad) + . Fixed bug #81349 (mb_detect_encoding misdetcts ASCII in some cases). + (Nikita) + . Fixed bug #81298 (mb_detect_encoding() segfaults when 7bit encoding is + specified). (Nikita) + - MySQLi: . Fixed bug #70372 (Emulate mysqli_fetch_all() for libmysqlclient). (Nikita) . Fixed bug #80330 (Replace language in APIs and source code/docs). @@ -384,34 +180,68 @@ PHP NEWS (including libmysql)). (Darek Ślusarczyk) - MySQLnd: + . Fixed bug #63327 (Crash (Bus Error) in mysqlnd due to wrong alignment). + (Nikita) . Fixed bug #80761 (PDO uses too much memory). (Nikita) -- OPcache: +- Opcache: + . Fixed bug #81409 (Incorrect JIT code for ADD with a reference to array). + (Dmitry) + . Fixed Bug #81255 (Memory leak in PHPUnit with functional JIT). + . Fixed Bug #80959 (infinite loop in building cfg during JIT compilation). + (Nikita, Dmitry) + . Fixed bug #81225 (Wrong result with pow operator with JIT enabled). + (Dmitry) + . Fixed bug #81249 (Intermittent property assignment failure with JIT + enabled). (Dmitry) + . Fixed bug #81256 (Assertion `zv != ((void *)0)' failed for "preload" with + JIT). (Dmitry) + . Fixed bug #81133 (building opcache with phpize fails). (krakjoe) + . Fixed bug #81136 (opcache header not installed). (krakjoe) . Added inheritance cache. (Dmitry) - OpenSSL: + . Fixed bug #81502 ($tag argument of openssl_decrypt() should accept + null/empty string). (Nikita) . Bump minimal OpenSSL version to 1.0.2. (Jakub Zelenka) - PCRE: + . Fixed bug #81424 (PCRE2 10.35 JIT performance regression). (cmb) . Bundled PCRE2 is 10.37. - PDO: . Fixed bug #40913 (PDO_MYSQL: PDO::PARAM_LOB does not bind to a stream for fetching a BLOB). (Nikita) -. PDO MySQL: +- PDO MySQL: . Fixed bug #80908 (PDO::lastInsertId() return wrong). (matt) . Fixed bug #81037 (PDO discards error message text from prepared statement). (Kamil Tekiela) -. PDO ODBC: +- PDO OCI: + . Fixed bug #77120 (Support 'success with info' at connection). + (Sergei Morozov) + +- PDO ODBC: . Implement PDO_ATTR_SERVER_VERSION and PDO_ATTR_SERVER_INFO for PDO::getAttribute(). (Calvin Buckley) -. PDO SQLite: +- PDO PgSQL: + . Fixed bug #81343 (pdo_pgsql: Inconsitent boolean conversion after calling + closeCursor()). (Philip Hofstetter) + +- PDO SQLite: . Fixed bug #38334 (Proper data-type support for PDO_SQLITE). (Nikita) +- Phar: + . Use SHA256 by default for signature. (remi) + . Add support for OpenSSL_SHA256 and OpenSSL_SHA512 signature. (remi) + +- phpdbg: + . Fixed bug #81135 (unknown help topic causes assertion failure). (krakjoe) + - PgSQL: + . Fixed bug #81509 (pg_end_copy still expects a resource). (Matteo) . Convert resource to object \PgSql\Connection. (Máté) . Convert resource to object \PgSql\Result. (Máté) . Convert resource to object \PgSql\Lob. (Máté) @@ -424,7 +254,29 @@ PHP NEWS . Fixed bug #72998 (invalid read in readline completion). (krakjoe) - Reflection: - . Implement ReflectionFunctionAbstract::getClosureUsedVariables (krakjoe) + . Fixed bug #81611 (ArgumentCountError when getting default value from + ReflectionParameter with new). (Cameron Porter) + . Fixed bug #81630 (PHP 8.1: ReflectionClass->getTraitAliases() crashes with + Internal error). (Nikita) + . Fixed bug #81457 (Enum: ReflectionMethod->getDeclaringClass() return a + ReflectionClass). (Nikita) + . Fixed bug #81474 (Make ReflectionEnum and related class non-final). (Nikita) + . Fixed bug #80821 (ReflectionProperty::getDefaultValue() returns current + value for statics). (Nikita) + . Fixed bug #80564 (ReflectionProperty::__toString() renders current value, + not default value). (Nikita) + . Fixed bug #80097 (ReflectionAttribute is not a Reflector). (beberlei) + . Fixed bug #81200 (no way to determine if Closure is static). (krakjoe) + . Implement ReflectionFunctionAbstract::getClosureUsedVariables. (krakjoe) + +- Shmop: + . Fixed bug #81407 (shmop_open won't attach and causes php to crash). (cmb) + +- SimpleXML: + . Fixed bug #81325 (Segfault in zif_simplexml_import_dom). (remi) + +- SNMP: + . Implement SHA256 and SHA512 for security protocol. (remi) - Sodium: . Added the XChaCha20 stream cipher functions. (P.I.E. Security Team) @@ -432,7 +284,45 @@ PHP NEWS (P.I.E. Security Team) - SPL: + . Fixed bug #66588 (SplFileObject::fgetcsv incorrectly returns a row on + premature EOF). (Aliaksandr Bystry) + . Fixed bug #80663 (Recursive SplFixedArray::setSize() may cause double-free). + (cmb, Nikita, Tyson Andre) + . Fixed bug #81477 (LimitIterator + SplFileObject regression in 8.0.1). (cmb) + . Fixed bug #81112 (Special json_encode behavior for SplFixedArray). (Nikita) + . Fixed bug #80945 ("Notice: Undefined index" on unset() ArrayObject + non-existing key). (Nikita) . Fixed bug #80724 (FilesystemIterator::FOLLOW_SYMLINKS remove KEY_AS_FILE from bitmask). (Cameron Porter) +- Standard: + . Fixed bug #81441 (gethostbyaddr('::1') returns ip instead of name after + calling some other method). (Nikita) + . Fixed bug #81491 (Incorrectly using libsodium for argon2 hashing). + (Dan Pock) + . Fixed bug #81142 (PHP 7.3+ memory leak when unserialize() is used on an + associative array). (Nikita) + . Fixed bug #81111 (Serialization is unexpectedly allowed on anonymous classes + with __serialize()). (Nikita) + . Fixed bug #81137 (hrtime breaks build on OSX before Sierra). (krakjoe) + . Fixed bug #77627 (method_exists on Closure::__invoke inconsistency). + (krakjoe) + +- Streams: + . Fixed bug #81475 (stream_isatty emits warning with attached stream wrapper). + (cmb) + +- XML: + . Fixed bug #79971 (special character is breaking the path in xml function) + (CVE-2021-21707). (cmb) + . Fixed bug #70962 (XML_OPTION_SKIP_WHITE strips embedded whitespace). + (Aliaksandr Bystry, cmb) + +- Zip: + . Fixed bug #81490 (ZipArchive::extractTo() may leak memory). (cmb, Remi) + . Fixed bug #77978 (Dirname ending in colon unzips to wrong dir). (cmb) + . Fixed bug #81420 (ZipArchive::extractTo extracts outside of destination) + (CVE-2021-21706). (cmb) + . Fixed bug #80833 (ZipArchive::getStream doesn't use setPassword). (Remi) + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> From 4e3192dd3c8c03d06f13d85ee97a1f071092a9d6 Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Sat, 27 Nov 2021 12:59:28 +0100 Subject: [PATCH 22/50] Fixed misplaced PgSQL NEWS entry --- NEWS | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 512ae1c4bc2e0..0307f7ca73c45 100644 --- a/NEWS +++ b/NEWS @@ -233,6 +233,12 @@ PHP NEWS - PDO SQLite: . Fixed bug #38334 (Proper data-type support for PDO_SQLITE). (Nikita) +- PgSQL: + . Fixed bug #81509 (pg_end_copy still expects a resource). (Matteo) + . Convert resource to object \PgSql\Connection. (Máté) + . Convert resource to object \PgSql\Result. (Máté) + . Convert resource to object \PgSql\Lob. (Máté) + - Phar: . Use SHA256 by default for signature. (remi) . Add support for OpenSSL_SHA256 and OpenSSL_SHA512 signature. (remi) @@ -240,12 +246,6 @@ PHP NEWS - phpdbg: . Fixed bug #81135 (unknown help topic causes assertion failure). (krakjoe) -- PgSQL: - . Fixed bug #81509 (pg_end_copy still expects a resource). (Matteo) - . Convert resource to object \PgSql\Connection. (Máté) - . Convert resource to object \PgSql\Result. (Máté) - . Convert resource to object \PgSql\Lob. (Máté) - - PSpell: . Convert resource to object \PSpell\Dictionary. (Sara) . Convert resource to object \PSpell\Config. (Sara) From c459625df046643dce95df2c1344a6d1f9eff7ff Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Sat, 27 Nov 2021 13:00:00 +0100 Subject: [PATCH 23/50] Removed placeholder from NEWS --- NEWS | 2 -- 1 file changed, 2 deletions(-) diff --git a/NEWS b/NEWS index 0307f7ca73c45..3e3f96411f8f9 100644 --- a/NEWS +++ b/NEWS @@ -324,5 +324,3 @@ PHP NEWS . Fixed bug #81420 (ZipArchive::extractTo extracts outside of destination) (CVE-2021-21706). (cmb) . Fixed bug #80833 (ZipArchive::getStream doesn't use setPassword). (Remi) - -<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> From 7f7f91536f23c665e8b9a4beb7340c3fea473b42 Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Sat, 27 Nov 2021 13:05:02 +0100 Subject: [PATCH 24/50] Placing core changes before anything else --- NEWS | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 3e3f96411f8f9..c0d1d6042d581 100644 --- a/NEWS +++ b/NEWS @@ -11,13 +11,6 @@ PHP NEWS 25 Nov 2021, PHP 8.1.0 -- CLI: - . Fixed bug #81496 (Server logs incorrect request method). (lauri) - -- COM: - . Dispatch using LANG_NEUTRAL instead of LOCALE_SYSTEM_DEFAULT. (Dmitry - Maksimov) - - Core: . Fixed bug #81607 (CE_CACHE allocation with concurrent access). (Nikita, Dmitry) @@ -59,6 +52,13 @@ PHP NEWS . Fixed bug #81076 (incorrect debug info on Closures with implicit binds). (krakjoe) +- CLI: + . Fixed bug #81496 (Server logs incorrect request method). (lauri) + +- COM: + . Dispatch using LANG_NEUTRAL instead of LOCALE_SYSTEM_DEFAULT. (Dmitry + Maksimov) + - Curl: . Fixed bug #81085 (Support CURLOPT_SSLCERT_BLOB for cert strings). (camporter) From 75546bdef20c459b068ea837c3e5c89abee692a3 Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Sat, 27 Nov 2021 13:13:26 +0100 Subject: [PATCH 25/50] Standardize: Fixed Bug -> Fixed bug --- NEWS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index c0d1d6042d581..0871c9301a549 100644 --- a/NEWS +++ b/NEWS @@ -24,7 +24,7 @@ PHP NEWS . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) . Fixed bug #81514 (Using Enum as key in WeakMap triggers GC + SegFault). (Nikita) - . Fixed Bug #81520 (TEST_PHP_CGI_EXECUTABLE badly set in run-tests.php). + . Fixed bug #81520 (TEST_PHP_CGI_EXECUTABLE badly set in run-tests.php). (Remi) . Fixed bug #81377 (unset() of $GLOBALS sub-key yields warning). (Nikita) . Fixed bug #81342 (New ampersand token parsing depends on new line after it). @@ -187,8 +187,8 @@ PHP NEWS - Opcache: . Fixed bug #81409 (Incorrect JIT code for ADD with a reference to array). (Dmitry) - . Fixed Bug #81255 (Memory leak in PHPUnit with functional JIT). - . Fixed Bug #80959 (infinite loop in building cfg during JIT compilation). + . Fixed bug #81255 (Memory leak in PHPUnit with functional JIT). + . Fixed bug #80959 (infinite loop in building cfg during JIT compilation). (Nikita, Dmitry) . Fixed bug #81225 (Wrong result with pow operator with JIT enabled). (Dmitry) From 99d130acbcaf83e545a3bead6b13a5eb49811fbf Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Sat, 27 Nov 2021 13:18:59 +0100 Subject: [PATCH 26/50] Reordering non bug entries --- NEWS | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 0871c9301a549..063fca4ccd9b8 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,10 @@ PHP NEWS 25 Nov 2021, PHP 8.1.0 - Core: + . Fixed inclusion order for phpize builds on Windows. (cmb) + . Added missing hashtable insertion APIs for arr/obj/ref. (Sara) + . Implemented FR #77372 (Relative file path is removed from uploaded file). + (Björn Tantau) . Fixed bug #81607 (CE_CACHE allocation with concurrent access). (Nikita, Dmitry) . Fixed bug #81507 (Fiber does not compile on AIX). (Clément Chigot) @@ -41,14 +45,10 @@ PHP NEWS . Fixed bug #81202 (powerpc64 build fails on fibers). (krakjoe) . Fixed bug #80072 (Cyclic unserialize in TMPVAR operand may leak). (Nikita) . Fixed bug #81163 (__sleep allowed to return non-array). (krakjoe) - . Fixed inclusion order for phpize builds on Windows. (cmb) - . Added missing hashtable insertion APIs for arr/obj/ref. (Sara) . Fixed bug #75474 (function scope static variables are not bound to a unique function). (Nikita) . Fixed bug #53826 (__callStatic fired in base class through a parent call if the method is private). (Nikita) - . Implemented FR #77372 (Relative file path is removed from uploaded file). - (Björn Tantau) . Fixed bug #81076 (incorrect debug info on Closures with implicit binds). (krakjoe) From 81513e6285a4e9eb1fae9aaf6e299660a390455f Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sat, 27 Nov 2021 22:37:43 +0000 Subject: [PATCH 27/50] Add skip for FPM process idle flaky test --- sapi/fpm/tests/proc-idle-timeout.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/sapi/fpm/tests/proc-idle-timeout.phpt b/sapi/fpm/tests/proc-idle-timeout.phpt index 9f6d4377b8ce4..2c49a19b1de70 100644 --- a/sapi/fpm/tests/proc-idle-timeout.phpt +++ b/sapi/fpm/tests/proc-idle-timeout.phpt @@ -4,6 +4,7 @@ FPM: Process manager config pm.process_idle_timeout --FILE-- Date: Mon, 29 Nov 2021 15:51:54 +0300 Subject: [PATCH 28/50] Disable type narrowing optimization when we contruct SSA for JIT This also revets incorrect fix introduced in f9518c3850982aca41fac22b87a1e11096eb1643 --- ext/opcache/Optimizer/zend_inference.c | 8 +++++--- ext/opcache/Optimizer/zend_optimizer.h | 2 ++ ext/opcache/jit/zend_jit.c | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 926e3186ef852..bbecc87ca5cf6 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -3918,7 +3918,7 @@ static zend_bool can_convert_to_double( for (phi = var->phi_use_chain; phi; phi = zend_ssa_next_use_phi(ssa, var_num, phi)) { /* Check that narrowing can actually be useful */ type = ssa->var_info[phi->ssa_var].type; - if (type & ((MAY_BE_ANY|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_DOUBLE))) { + if ((type & MAY_BE_ANY) & ~(MAY_BE_LONG|MAY_BE_DOUBLE)) { return 0; } @@ -4240,8 +4240,10 @@ static int zend_infer_types(const zend_op_array *op_array, const zend_script *sc return FAILURE; } - /* Narrowing integer initialization to doubles */ - zend_type_narrowing(op_array, script, ssa, optimization_level); + if (optimization_level & ZEND_OPTIMIZER_NARROW_TO_DOUBLE) { + /* Narrowing integer initialization to doubles */ + zend_type_narrowing(op_array, script, ssa, optimization_level); + } if (ZEND_FUNC_INFO(op_array)) { zend_func_return_info(op_array, script, 1, 0, &ZEND_FUNC_INFO(op_array)->return_info); diff --git a/ext/opcache/Optimizer/zend_optimizer.h b/ext/opcache/Optimizer/zend_optimizer.h index 04528d33e27f5..53f050d3f08f9 100644 --- a/ext/opcache/Optimizer/zend_optimizer.h +++ b/ext/opcache/Optimizer/zend_optimizer.h @@ -44,6 +44,8 @@ #define ZEND_OPTIMIZER_IGNORE_OVERLOADING (1<<16) /* (unsafe) Ignore possibility of operator overloading */ +#define ZEND_OPTIMIZER_NARROW_TO_DOUBLE (1<<17) /* try to narrow long constant assignments to double */ + #define ZEND_OPTIMIZER_ALL_PASSES 0x7FFFFFFF #define DEFAULT_OPTIMIZATION_LEVEL "0x7FFEBFFF" diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index a2d3e5caeb3f1..fe556b0546f7e 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -773,7 +773,8 @@ static int zend_jit_op_array_analyze2(const zend_op_array *op_array, zend_script && op_array->last_try_catch == 0 && !(op_array->fn_flags & ZEND_ACC_GENERATOR) && !(ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS)) { - if (zend_ssa_inference(&CG(arena), op_array, script, ssa, optimization_level) != SUCCESS) { + if (zend_ssa_inference(&CG(arena), op_array, script, ssa, + optimization_level & ~ZEND_OPTIMIZER_NARROW_TO_DOUBLE) != SUCCESS) { return FAILURE; } } From 31749aac62a59fb215018ccb8099e1547182cdfc Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Fri, 26 Nov 2021 13:44:36 +0100 Subject: [PATCH 29/50] Fix #81659: stream_get_contents() may unnecessarily overallocate Since we're going to read from the current stream position anyway, the `max_len` should be the size of the file minus the current position (still catering to potentially filtered streams). We must, however, make sure to cater to the file position being beyond the actual file size. While we're at, we also fix the step size in the comment, which is 8K. A further optimization could be done for unfiltered streams, thus saving that step size, but 8K might not be worth it. Closes GH-7693. --- NEWS | 2 ++ ext/standard/tests/streams/bug81659.phpt | 24 ++++++++++++++++++++++++ main/streams/streams.c | 4 ++-- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 ext/standard/tests/streams/bug81659.phpt diff --git a/NEWS b/NEWS index f17112179cf4f..0b46c1ad5c7a5 100644 --- a/NEWS +++ b/NEWS @@ -19,6 +19,8 @@ PHP NEWS - Standard: . Fixed bug #81618 (dns_get_record fails on FreeBSD for missing type). (fsbruva) + . Fixed bug #81659 (stream_get_contents() may unnecessarily overallocate). + (cmb) 18 Nov 2021, PHP 7.4.26 diff --git a/ext/standard/tests/streams/bug81659.phpt b/ext/standard/tests/streams/bug81659.phpt new file mode 100644 index 0000000000000..62e0cbad181ee --- /dev/null +++ b/ext/standard/tests/streams/bug81659.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #81659 (stream_get_contents() may unnecessarily overallocate) +--FILE-- + +--CLEAN-- + +--EXPECT-- +int(1024) +bool(true) diff --git a/main/streams/streams.c b/main/streams/streams.c index d2ee3371c9eb6..a320a90b5252e 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1502,9 +1502,9 @@ PHPAPI zend_string *_php_stream_copy_to_mem(php_stream *src, size_t maxlen, int * result may be inaccurate, as the filter may inflate or deflate the * number of bytes that we can read. In order to avoid an upsize followed * by a downsize of the buffer, overestimate by the step size (which is - * 2K). */ + * 8K). */ if (php_stream_stat(src, &ssbuf) == 0 && ssbuf.sb.st_size > 0) { - max_len = ssbuf.sb.st_size + step; + max_len = MAX(ssbuf.sb.st_size - src->position, 0) + step; } else { max_len = step; } From 8f4cfe04eb4f16db0dcd180ebb8bae2e081ef40d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 29 Nov 2021 18:37:49 +0300 Subject: [PATCH 30/50] JIT: Fix named arguments handling Fixes oss-fuzz #41486 --- ext/opcache/tests/jit/send_val_002.phpt | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 ext/opcache/tests/jit/send_val_002.phpt diff --git a/ext/opcache/tests/jit/send_val_002.phpt b/ext/opcache/tests/jit/send_val_002.phpt new file mode 100644 index 0000000000000..6268af8f736c3 --- /dev/null +++ b/ext/opcache/tests/jit/send_val_002.phpt @@ -0,0 +1,23 @@ +--TEST-- +JIT SEND_VAL: 002 named arg +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + +--EXPECTF-- +Warning: Undefined variable $x in %ssend_val_002.php on line 3 + +Fatal error: Uncaught ArgumentCountError: var_dump() expects at least 1 argument, 0 given in %ssend_val_002.php:3 +Stack trace: +#0 %ssend_val_002.php(3): var_dump(x: 0) +#1 %ssend_val_002.php(5): o() +#2 {main} + thrown in %ssend_val_002.php on line 3 From d95541511416f4b8b1818b4aefd90ba5dfb04f02 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 29 Nov 2021 18:39:50 +0300 Subject: [PATCH 31/50] JIT: Fix named arguments handling Fixes oss-fuzz #41486 --- ext/opcache/jit/zend_jit.c | 4 ++++ ext/opcache/jit/zend_jit_x86.dasc | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index fe556b0546f7e..c4d2fdc4ce2a1 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -2392,6 +2392,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op && (i + 1) <= end && (opline+1)->opcode == ZEND_SEND_VAL && (opline+1)->op1_type == IS_TMP_VAR + && (opline+1)->op2_type != IS_CONST && (opline+1)->op1.var == opline->result.var) { i++; res_use_info = -1; @@ -2446,6 +2447,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op && (i + 1) <= end && (opline+1)->opcode == ZEND_SEND_VAL && (opline+1)->op1_type == IS_TMP_VAR + && (opline+1)->op2_type != IS_CONST && (opline+1)->op1.var == opline->result.var) { i++; res_use_info = -1; @@ -2504,6 +2506,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op && (i + 1) <= end && (opline+1)->opcode == ZEND_SEND_VAL && (opline+1)->op1_type == IS_TMP_VAR + && (opline+1)->op2_type != IS_CONST && (opline+1)->op1.var == opline->result.var) { i++; res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_RX, (opline+1)->result.var); @@ -2727,6 +2730,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op && (i + 1) <= end && (opline+1)->opcode == ZEND_SEND_VAL && (opline+1)->op1_type == IS_TMP_VAR + && (opline+1)->op2_type != IS_CONST && (opline+1)->op1.var == opline->result.var && (!(op1_info & MAY_HAVE_DTOR) || !(op1_info & MAY_BE_RC1))) { i++; diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index f71a3022a32bf..c7113893c0ac5 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -15520,10 +15520,11 @@ static zend_bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zen uint32_t op1_info, op2_info; switch (opline->opcode) { - case ZEND_QM_ASSIGN: case ZEND_SEND_VAR: case ZEND_SEND_VAL: case ZEND_SEND_VAL_EX: + return (opline->op2_type != IS_CONST); + case ZEND_QM_ASSIGN: case ZEND_IS_SMALLER: case ZEND_IS_SMALLER_OR_EQUAL: case ZEND_IS_EQUAL: @@ -15717,6 +15718,9 @@ static zend_regset zend_jit_get_scratch_regset(const zend_op *opline, const zend /* break missing intentionally */ case ZEND_SEND_VAL: case ZEND_SEND_VAL_EX: + if (opline->op2_type == IS_CONST) { + break; + } if (ssa_op->op1_use == current_var) { regset = ZEND_REGSET(ZREG_R0); break; @@ -15733,6 +15737,9 @@ static zend_regset zend_jit_get_scratch_regset(const zend_op *opline, const zend } break; case ZEND_SEND_VAR: + if (opline->op2_type == IS_CONST) { + break; + } if (ssa_op->op1_use == current_var || ssa_op->op1_def == current_var) { regset = ZEND_REGSET_EMPTY; From 712fc54e856d3d8e80a7d074a2733bc6b3a27e90 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Mon, 29 Nov 2021 15:48:41 +0100 Subject: [PATCH 32/50] Fix #74604: Out of bounds in php_pcre_replace_impl Trying to allocate a `zend_string` with a length only slighty smaller than `SIZE_MAX` causes an integer overflow; we make sure that this doesn't happen by catering to the maximal overhead of a `zend_string`. Closes GH-7597. --- NEWS | 3 +++ Zend/zend_string.h | 3 ++- ext/pcre/php_pcre.c | 6 +++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 0b46c1ad5c7a5..cfe36d9281173 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,9 @@ PHP NEWS - OpenSSL: . Fixed bug #75725 (./configure: detecting RAND_egd). (Dilyan Palauzov) +- PCRE: + . Fixed bug #74604 (Out of bounds in php_pcre_replace_impl). (cmb, Dmitry) + - Standard: . Fixed bug #81618 (dns_get_record fails on FreeBSD for missing type). (fsbruva) diff --git a/Zend/zend_string.h b/Zend/zend_string.h index d90d2e06d38ff..ff6ada34ccabf 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -75,7 +75,8 @@ END_EXTERN_C() #define _ZSTR_STRUCT_SIZE(len) (_ZSTR_HEADER_SIZE + len + 1) -#define ZSTR_MAX_LEN (SIZE_MAX - ZEND_MM_ALIGNED_SIZE(_ZSTR_HEADER_SIZE + 1)) +#define ZSTR_MAX_OVERHEAD (ZEND_MM_ALIGNED_SIZE(_ZSTR_HEADER_SIZE + 1)) +#define ZSTR_MAX_LEN (SIZE_MAX - ZSTR_MAX_OVERHEAD) #define ZSTR_ALLOCA_ALLOC(str, _len, use_heap) do { \ (str) = (zend_string *)do_alloca(ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_STRUCT_SIZE(_len), 8), (use_heap)); \ diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 9d01b328228d0..a93b35c4f33ad 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -1725,7 +1725,7 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, zend_string *su } if (new_len >= alloc_len) { - alloc_len = zend_safe_address_guarded(2, new_len, 0); + alloc_len = zend_safe_address_guarded(2, new_len, ZSTR_MAX_OVERHEAD) - ZSTR_MAX_OVERHEAD; if (result == NULL) { result = zend_string_alloc(alloc_len, 0); } else { @@ -1961,9 +1961,9 @@ static zend_string *php_pcre_replace_func_impl(pcre_cache_entry *pce, zend_strin pcre2_get_mark(match_data), flags); ZEND_ASSERT(eval_result); - new_len = zend_safe_address_guarded(1, ZSTR_LEN(eval_result), new_len); + new_len = zend_safe_address_guarded(1, ZSTR_LEN(eval_result) + ZSTR_MAX_OVERHEAD, new_len) -ZSTR_MAX_OVERHEAD; if (new_len >= alloc_len) { - alloc_len = zend_safe_address_guarded(2, new_len, 0); + alloc_len = zend_safe_address_guarded(2, new_len, ZSTR_MAX_OVERHEAD) - ZSTR_MAX_OVERHEAD; if (result == NULL) { result = zend_string_alloc(alloc_len, 0); } else { From aff115547ff7b261cf258763ba28b6fe8ce95c18 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 29 Nov 2021 21:44:00 +0300 Subject: [PATCH 33/50] JIT: Fix exception handling when next array element is already occupied Fixes oss-fuzz #41408 --- ext/opcache/Optimizer/dce.c | 7 ++++++- ext/opcache/Optimizer/sccp.c | 6 ++++++ ext/opcache/Optimizer/zend_inference.c | 3 ++- ext/opcache/tests/jit/array_elem_002.phpt | 18 ++++++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 ext/opcache/tests/jit/array_elem_002.phpt diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c index 2cbeab4ce6cf4..f0f67055dfa7e 100644 --- a/ext/opcache/Optimizer/dce.c +++ b/ext/opcache/Optimizer/dce.c @@ -491,6 +491,10 @@ static inline zend_bool may_break_varargs(const zend_op_array *op_array, const z return 0; } +static inline zend_bool may_throw_dce_exception(const zend_op *opline) { + return opline->opcode == ZEND_ADD_ARRAY_ELEMENT && opline->op2_type == IS_UNUSED; +} + int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reorder_dtor_effects) { int i; zend_ssa_phi *phi; @@ -557,7 +561,8 @@ int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reor add_operands_to_worklists(&ctx, &op_array->opcodes[op_data], &ssa->ops[op_data], ssa, 0); } } else if (may_have_side_effects(op_array, ssa, &op_array->opcodes[i], &ssa->ops[i], ctx.reorder_dtor_effects) - || zend_may_throw(&op_array->opcodes[i], &ssa->ops[i], op_array, ssa) + || (zend_may_throw(&op_array->opcodes[i], &ssa->ops[i], op_array, ssa) + && !may_throw_dce_exception(&op_array->opcodes[i])) || (has_varargs && may_break_varargs(op_array, ssa, &ssa->ops[i]))) { if (op_array->opcodes[i].opcode == ZEND_NEW && op_array->opcodes[i+1].opcode == ZEND_DO_FCALL diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 8c68099ec301a..7792311637632 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -2316,6 +2316,12 @@ static int try_remove_definition(sccp_ctx *ctx, int var_num, zend_ssa_var *var, return 0; } break; + case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: + if (opline->op2_type == IS_UNUSED) { + return 0; + } + /* break missing intentionally */ default: if (zend_may_throw(opline, ssa_op, op_array, ssa)) { return 0; diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index bbecc87ca5cf6..e14c95309528f 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -4628,8 +4628,9 @@ int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const ze case ZEND_ROPE_END: return t2 & (MAY_BE_ARRAY|MAY_BE_OBJECT); case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: return (opline->op2_type != IS_UNUSED) && (t2 & (MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); + case ZEND_ADD_ARRAY_ELEMENT: + return (opline->op2_type == IS_UNUSED) || (t2 & (MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)); case ZEND_STRLEN: return (t1 & MAY_BE_ANY) != MAY_BE_STRING; case ZEND_COUNT: diff --git a/ext/opcache/tests/jit/array_elem_002.phpt b/ext/opcache/tests/jit/array_elem_002.phpt new file mode 100644 index 0000000000000..c4f6c5b2dd8e9 --- /dev/null +++ b/ext/opcache/tests/jit/array_elem_002.phpt @@ -0,0 +1,18 @@ +--TEST-- +Occupied next element +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + 'a', $string_float => 'b', 'c', 'd']; +?> +--EXPECTF-- +Fatal error: Uncaught Error: Cannot add element to the array as the next element is already occupied in %sarray_elem_002.php:4 +Stack trace: +#0 {main} + thrown in %sarray_elem_002.php on line 4 From 86430e8e010661884346d91ce624abfb36ccd20d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 29 Nov 2021 23:32:52 +0300 Subject: [PATCH 34/50] Fixed type inference (it's safe to ignore reference counting narrowing) --- ext/opcache/Optimizer/zend_inference.c | 5 + ext/opcache/tests/opt/inference_001.phpt | 163 +++++++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100644 ext/opcache/tests/opt/inference_001.phpt diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index e14c95309528f..52f4123192bc3 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -1860,6 +1860,11 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) { } \ if (ssa_var_info[__var].type != __type) { \ if (ssa_var_info[__var].type & ~__type) { \ + if ((ssa_var_info[__var].type & ~__type & \ + ~(MAY_BE_RC1|MAY_BE_RCN)) == 0) { \ + ssa_var_info[__var].type |= __type; \ + break; \ + } \ emit_type_narrowing_warning(op_array, ssa, __var); \ return FAILURE; \ } \ diff --git a/ext/opcache/tests/opt/inference_001.phpt b/ext/opcache/tests/opt/inference_001.phpt new file mode 100644 index 0000000000000..2c7389573462f --- /dev/null +++ b/ext/opcache/tests/opt/inference_001.phpt @@ -0,0 +1,163 @@ +--TEST-- +Type inference 001: Invalid type narrowing warning +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--FILE-- +$e; + $i += $a; + $j++; + $e; + $a == $Z + $a .= $i+= $a; + $j++; + $e; + $a == $Z + $j++; + $e; + $a == $Z + $a = $a + $b = $i += $a; + $obj = new stdClass; + $obj->prop1 = set_error_handler(function () { + $$GLOBALS['a'] = null; + }); + $obj->$a .= $i += $a; + $obj = new stdClass; + $obj->prop1 = $j++; + $e; + $a == $Z + $a = $a + $j++; + $e; + $a == $Z + $a = $a + $b = $aa = $a; + } +} +test(); +?> +DONE +--EXPECTF-- +Warning: Undefined variable $a in %sinference_001.php on line 6 + +Warning: Undefined variable $obj in %sinference_001.php on line 7 + +Warning: Undefined variable $e in %sinference_001.php on line 7 + +Warning: Attempt to read property "" on null in %sinference_001.php on line 7 + +Warning: Undefined variable $Z in %sinference_001.php on line 11 + +Warning: Undefined variable $Z in %sinference_001.php on line 14 + +Warning: Undefined variable $Z in %sinference_001.php on line 16 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Fatal error: Uncaught TypeError: Unsupported operand types: null + string in %sinference_001.php:11 +Stack trace: +#0 %sinference_001.php(30): test() +#1 {main} + thrown in %sinference_001.php on line 11 From 3c3626a903a70608c78e2d74405d1ebc827f6849 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 30 Nov 2021 09:44:36 +0300 Subject: [PATCH 35/50] Restore line, removed by mistake in b9141223899674a46ced28cb9fdd211bd70c2c0f --- ext/opcache/jit/zend_jit_arm64.dasc | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index 8857e984ce8ab..5fd01d941b17f 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -14845,6 +14845,7 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa uint32_t op1_info, op2_info; switch (opline->opcode) { + case ZEND_SEND_VAR: case ZEND_SEND_VAL: case ZEND_SEND_VAL_EX: return (opline->op2_type != IS_CONST); From 6e1fe969623809b113c1d9c1be69bb14087a2c28 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 30 Nov 2021 11:40:18 +0300 Subject: [PATCH 36/50] JIT: Fix uninitialized result of ASSIGN_DIM[_OP] after clobbering array by user error handler Fixes oss-fuzz #41208 --- ext/opcache/jit/zend_jit_helpers.c | 28 ++++++++++++++++++----- ext/opcache/tests/jit/assign_dim_005.phpt | 22 ++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 ext/opcache/tests/jit/assign_dim_005.phpt diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index dafb648ea60e3..a7a8d6706f0e0 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -673,6 +673,8 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di zend_ulong hval; zend_string *offset_key; zval *retval; + zend_execute_data *execute_data; + const zend_op *opline; if (Z_TYPE_P(dim) == IS_REFERENCE) { dim = Z_REFVAL_P(dim); @@ -686,9 +688,15 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di offset_key = Z_STR_P(dim); goto str_index; case IS_UNDEF: - if (!zend_jit_undefined_op_helper_write(ht, EG(current_execute_data)->opline->op2.var)) { - if (EG(exception)) { - undef_result_after_exception(); + execute_data = EG(current_execute_data); + opline = EX(opline); + if (!zend_jit_undefined_op_helper_write(ht, opline->op2.var)) { + if (opline->result_type & (IS_VAR | IS_TMP_VAR)) { + if (EG(exception)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } else { + ZVAL_NULL(EX_VAR(opline->result.var)); + } } return NULL; } @@ -760,6 +768,8 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_w_helper(zend_array *ht, zval *dim zend_ulong hval; zend_string *offset_key; zval *retval; + zend_execute_data *execute_data; + const zend_op *opline; if (Z_TYPE_P(dim) == IS_REFERENCE) { dim = Z_REFVAL_P(dim); @@ -773,9 +783,15 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_w_helper(zend_array *ht, zval *dim offset_key = Z_STR_P(dim); goto str_index; case IS_UNDEF: - if (!zend_jit_undefined_op_helper_write(ht, EG(current_execute_data)->opline->op2.var)) { - if (EG(exception)) { - undef_result_after_exception(); + execute_data = EG(current_execute_data); + opline = EX(opline); + if (!zend_jit_undefined_op_helper_write(ht, opline->op2.var)) { + if (opline->result_type & (IS_VAR | IS_TMP_VAR)) { + if (EG(exception)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } else { + ZVAL_NULL(EX_VAR(opline->result.var)); + } } return NULL; } diff --git a/ext/opcache/tests/jit/assign_dim_005.phpt b/ext/opcache/tests/jit/assign_dim_005.phpt new file mode 100644 index 0000000000000..2056ba0554333 --- /dev/null +++ b/ext/opcache/tests/jit/assign_dim_005.phpt @@ -0,0 +1,22 @@ +--TEST-- +JIT ASSIGN_DIM: 005 +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + +--EXPECT-- +Error: Undefined variable $c +Error: Undefined variable $c +NULL From c1036194d6fad51c129b45cf3f85bf0bbbef5670 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 30 Nov 2021 12:58:54 +0300 Subject: [PATCH 37/50] JIT: Fix incorrect reference counting inference Fixes oss-fuzz #40747 --- ext/opcache/Optimizer/zend_inference.c | 3 +++ ext/opcache/tests/jit/assign_op_007.phpt | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 ext/opcache/tests/jit/assign_op_007.phpt diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 52f4123192bc3..f7e28643f448a 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2591,6 +2591,9 @@ static zend_always_inline int _zend_update_type_info( } else if (opline->opcode == ZEND_ASSIGN_STATIC_PROP) { /* Nothing to do */ } else { + if (opline->opcode == ZEND_ASSIGN_OP && ssa_op->result_def >= 0 && (tmp & MAY_BE_RC1)) { + tmp |= MAY_BE_RCN; + } UPDATE_SSA_TYPE(tmp, ssa_op->op1_def); } if (ssa_op->result_def >= 0) { diff --git a/ext/opcache/tests/jit/assign_op_007.phpt b/ext/opcache/tests/jit/assign_op_007.phpt new file mode 100644 index 0000000000000..b6b3e23c02111 --- /dev/null +++ b/ext/opcache/tests/jit/assign_op_007.phpt @@ -0,0 +1,22 @@ +--TEST-- +JIT ASSIGN_OP: 007 Arrays merging with return value +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + +DONE +--EXPECTF-- +Warning: Undefined array key "b" in %sassign_op_007.php on line 6 +DONE From df434f056f187e63c0c59d61403b05d2bf387d4c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 30 Nov 2021 16:07:38 +0300 Subject: [PATCH 38/50] Fix crash after indirect modification of string by user error handler Fixes oss-fuzz #39346 --- Zend/tests/str_offset_005.phpt | 12 ++++++++++++ Zend/zend_execute.c | 27 ++++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/str_offset_005.phpt diff --git a/Zend/tests/str_offset_005.phpt b/Zend/tests/str_offset_005.phpt new file mode 100644 index 0000000000000..6d70f82a78212 --- /dev/null +++ b/Zend/tests/str_offset_005.phpt @@ -0,0 +1,12 @@ +--TEST-- +string offset 005 indirect string modification by error handler +--FILE-- + +--EXPECT-- +string(1) "a" +int(8) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 79c0e6133c69f..7a3462a5aa12c 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2361,6 +2361,7 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z } } if (!is_list && EXPECTED(Z_TYPE_P(container) == IS_STRING)) { + zend_string *str = Z_STR_P(container); zend_long offset; try_string_offset: @@ -2386,13 +2387,33 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z return; } case IS_UNDEF: + /* The string may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(str); + } ZVAL_UNDEFINED_OP2(); + if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE) && GC_DELREF(str) == 0) { + zend_string_release_ex(str, 0); + ZVAL_NULL(result); + return; + } case IS_DOUBLE: case IS_NULL: case IS_FALSE: case IS_TRUE: if (type != BP_VAR_IS) { + /* The string may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(str); + } zend_error(E_WARNING, "String offset cast occurred"); + if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE) && GC_DELREF(str) == 0) { + zend_string_release_ex(str, 0); + ZVAL_NULL(result); + return; + } } break; case IS_REFERENCE: @@ -2410,7 +2431,7 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z } out: - if (UNEXPECTED(Z_STRLEN_P(container) < ((offset < 0) ? -(size_t)offset : ((size_t)offset + 1)))) { + if (UNEXPECTED(ZSTR_LEN(str) < ((offset < 0) ? -(size_t)offset : ((size_t)offset + 1)))) { if (type != BP_VAR_IS) { zend_error(E_WARNING, "Uninitialized string offset " ZEND_LONG_FMT, offset); ZVAL_EMPTY_STRING(result); @@ -2422,8 +2443,8 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z zend_long real_offset; real_offset = (UNEXPECTED(offset < 0)) /* Handle negative offset */ - ? (zend_long)Z_STRLEN_P(container) + offset : offset; - c = (zend_uchar)Z_STRVAL_P(container)[real_offset]; + ? (zend_long)ZSTR_LEN(str) + offset : offset; + c = (zend_uchar)ZSTR_VAL(str)[real_offset]; ZVAL_CHAR(result, c); } From e7b31f57ec56a9e1fda834e54266def7bcdaf5c0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 30 Nov 2021 20:36:52 +0300 Subject: [PATCH 39/50] JIT: Fix incorrect code produced for BOOL_NOT and [double, undef] operand Fixes oss-fuzz #41531 --- ext/opcache/jit/zend_jit_x86.dasc | 3 ++- ext/opcache/tests/jit/bool_not_002.phpt | 30 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 ext/opcache/tests/jit/bool_not_002.phpt diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index c7113893c0ac5..55ba4d4990e73 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -8651,7 +8651,7 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_ } } else if (false_label != (uint32_t)-1) { | jmp =>false_label - } else if (op1_info & MAY_BE_LONG) { + } else if ((op1_info & MAY_BE_LONG) || (op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) { | jmp >9 } } @@ -8698,6 +8698,7 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_ } if ((op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) { + |2: if (CAN_USE_AVX()) { | vxorps xmm0, xmm0, xmm0 } else { diff --git a/ext/opcache/tests/jit/bool_not_002.phpt b/ext/opcache/tests/jit/bool_not_002.phpt new file mode 100644 index 0000000000000..aa6660f2bd897 --- /dev/null +++ b/ext/opcache/tests/jit/bool_not_002.phpt @@ -0,0 +1,30 @@ +--TEST-- +JIT BOOL_NOT: 002 Incorrect function JIT for MAY_BE_DOUBLE|MAY_BE_UNDEF +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.protect_memory=1 +--FILE-- +> 4 - $j++; + if ($j > 14) break; + } +} +test(); +?> +--EXPECTF-- +Warning: Undefined variable $a in %sbool_not_002.php on line 6 + +Warning: Undefined variable $a in %sbool_not_002.php on line 6 + +Fatal error: Uncaught ArithmeticError: Bit shift by negative number in %sbool_not_002.php:6 +Stack trace: +#0 %sbool_not_002.php(10): test() +#1 {main} + thrown in %sbool_not_002.php on line 6 From f533744c92e91304462da7a47824310bd89a1fd9 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Tue, 30 Nov 2021 18:40:42 +0000 Subject: [PATCH 40/50] Prepare for 7.4.28 --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index cfe36d9281173..b4d1e4b0378ec 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 7.4.27 +?? ??? ????, PHP 7.4.28 + + +16 Dec 2021, PHP 7.4.27 - Core: . Fixed bug #81626 (Error on use static:: in __сallStatic() wrapped to From b594a95a2f692b86aa06da46f79e6674cf402b0c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 30 Nov 2021 23:33:34 +0300 Subject: [PATCH 41/50] Fixed crash in ZEND_ASSIGN_DIM_OP because of array cloberring by user error handler Fixes oss-fuzz #36214 --- Zend/zend_execute.c | 29 +++++++++++++++- ext/opcache/jit/zend_jit_helpers.c | 53 +++++++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index fe21cf6811b58..4d02a0a174b18 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2214,10 +2214,37 @@ static zend_never_inline zend_uchar slow_index_convert(HashTable *ht, const zval value->str = ZSTR_EMPTY_ALLOC(); return IS_STRING; case IS_DOUBLE: - value->lval = zend_dval_to_lval_safe(Z_DVAL_P(dim)); + value->lval = zend_dval_to_lval(Z_DVAL_P(dim)); + if (!zend_is_long_compatible(Z_DVAL_P(dim), value->lval)) { + /* The array may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + zend_incompatible_double_to_long_error(Z_DVAL_P(dim)); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + return IS_NULL; + } + if (EG(exception)) { + return IS_NULL; + } + } return IS_LONG; case IS_RESOURCE: + /* The array may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } zend_use_resource_as_offset(dim); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + return IS_NULL; + } + if (EG(exception)) { + return IS_NULL; + } value->lval = Z_RES_HANDLE_P(dim); return IS_LONG; case IS_FALSE: diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index 3e0af15537be6..c0a22b03fbbb0 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -602,10 +602,61 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di offset_key = ZSTR_EMPTY_ALLOC(); goto str_index; case IS_DOUBLE: - hval = zend_dval_to_lval_safe(Z_DVAL_P(dim)); + hval = zend_dval_to_lval(Z_DVAL_P(dim)); + if (!zend_is_long_compatible(Z_DVAL_P(dim), hval)) { + /* The array may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + execute_data = EG(current_execute_data); + opline = EX(opline); + zend_incompatible_double_to_long_error(Z_DVAL_P(dim)); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + if (opline->result_type & (IS_VAR | IS_TMP_VAR)) { + if (EG(exception)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } else { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } + return NULL; + } + if (EG(exception)) { + if (opline->result_type & (IS_VAR | IS_TMP_VAR)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } + return NULL; + } + } goto num_index; case IS_RESOURCE: + /* The array may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + execute_data = EG(current_execute_data); + opline = EX(opline); zend_use_resource_as_offset(dim); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + if (opline->result_type & (IS_VAR | IS_TMP_VAR)) { + if (EG(exception)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } else { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } + return NULL; + } + if (EG(exception)) { + if (opline->result_type & (IS_VAR | IS_TMP_VAR)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } + return NULL; + } hval = Z_RES_HANDLE_P(dim); goto num_index; case IS_FALSE: From c3766c08f415bf4acc015c2c7fd3ed6969f15f08 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 1 Dec 2021 18:03:08 +0300 Subject: [PATCH 42/50] Fix SCDF cleanup of unused basic block, kept only because of FREE of a loop var Fixes oss-fuzz #41516 --- Zend/Optimizer/scdf.c | 11 +++++++---- Zend/Optimizer/zend_ssa.c | 13 +++++++++++-- Zend/Optimizer/zend_ssa.h | 1 + Zend/tests/match/match_scdf_cleanup.phpt | 11 +++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 Zend/tests/match/match_scdf_cleanup.phpt diff --git a/Zend/Optimizer/scdf.c b/Zend/Optimizer/scdf.c index 0e0a66c108624..72cb2da0483ea 100644 --- a/Zend/Optimizer/scdf.c +++ b/Zend/Optimizer/scdf.c @@ -224,10 +224,11 @@ static uint32_t cleanup_loop_var_free_block(scdf_ctx *scdf, zend_basic_block *bl zend_ssa *ssa = scdf->ssa; const zend_op_array *op_array = scdf->op_array; const zend_cfg *cfg = &ssa->cfg; + int block_num = block - cfg->blocks; uint32_t removed_ops = 0; /* Removes phi nodes */ - for (zend_ssa_phi *phi = ssa->blocks[block - cfg->blocks].phis; phi; phi = phi->next) { + for (zend_ssa_phi *phi = ssa->blocks[block_num].phis; phi; phi = phi->next) { zend_ssa_remove_uses_of_var(ssa, phi->ssa_var); zend_ssa_remove_phi(ssa, phi); } @@ -235,7 +236,8 @@ static uint32_t cleanup_loop_var_free_block(scdf_ctx *scdf, zend_basic_block *bl for (uint32_t i = block->start; i < block->start + block->len; i++) { zend_op *opline = &op_array->opcodes[i]; zend_ssa_op *ssa_op = &scdf->ssa->ops[i]; - if (is_live_loop_var_free(scdf, opline, ssa_op)) { + if (opline->opcode == ZEND_NOP + || is_live_loop_var_free(scdf, opline, ssa_op)) { continue; } @@ -243,10 +245,11 @@ static uint32_t cleanup_loop_var_free_block(scdf_ctx *scdf, zend_basic_block *bl * in the block. */ zend_ssa_remove_defs_of_instr(ssa, ssa_op); zend_ssa_remove_instr(ssa, opline, ssa_op); + removed_ops++; } - /* This block has no predecessors anymore. */ - block->predecessors_count = 0; + zend_ssa_remove_block_from_cfg(ssa, block_num); + return removed_ops; } diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index d173f20d33050..cd0e179cd89d4 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -1448,9 +1448,8 @@ void zend_ssa_remove_block(zend_op_array *op_array, zend_ssa *ssa, int i) /* {{{ { zend_basic_block *block = &ssa->cfg.blocks[i]; zend_ssa_block *ssa_block = &ssa->blocks[i]; - int *predecessors; zend_ssa_phi *phi; - int j, s; + int j; block->flags &= ~ZEND_BB_REACHABLE; @@ -1470,6 +1469,16 @@ void zend_ssa_remove_block(zend_op_array *op_array, zend_ssa *ssa, int i) /* {{{ zend_ssa_remove_instr(ssa, &op_array->opcodes[j], &ssa->ops[j]); } + zend_ssa_remove_block_from_cfg(ssa, i); +} +/* }}} */ + +void zend_ssa_remove_block_from_cfg(zend_ssa *ssa, int i) /* {{{ */ +{ + zend_basic_block *block = &ssa->cfg.blocks[i]; + int *predecessors; + int j, s; + for (s = 0; s < block->successors_count; s++) { zend_ssa_remove_predecessor(ssa, i, block->successors[s]); } diff --git a/Zend/Optimizer/zend_ssa.h b/Zend/Optimizer/zend_ssa.h index 1fef8ddee9625..8ff2343dc40a9 100644 --- a/Zend/Optimizer/zend_ssa.h +++ b/Zend/Optimizer/zend_ssa.h @@ -157,6 +157,7 @@ void zend_ssa_remove_phi(zend_ssa *ssa, zend_ssa_phi *phi); void zend_ssa_remove_uses_of_var(zend_ssa *ssa, int var_num); void zend_ssa_remove_block(zend_op_array *op_array, zend_ssa *ssa, int b); void zend_ssa_rename_var_uses(zend_ssa *ssa, int old_var, int new_var, bool update_types); +void zend_ssa_remove_block_from_cfg(zend_ssa *ssa, int b); static zend_always_inline void _zend_ssa_remove_def(zend_ssa_var *var) { diff --git a/Zend/tests/match/match_scdf_cleanup.phpt b/Zend/tests/match/match_scdf_cleanup.phpt new file mode 100644 index 0000000000000..784802ac31e2c --- /dev/null +++ b/Zend/tests/match/match_scdf_cleanup.phpt @@ -0,0 +1,11 @@ +--TEST-- +Cleanup of basic block kept only because of FREE loop var +--FILE-- +X}); +?> +--EXPECTF-- +Fatal error: Uncaught Error: Undefined constant "X" in %smatch_scdf_cleanup.php:2 +Stack trace: +#0 {main} + thrown in %smatch_scdf_cleanup.php on line 2 From 9f6ab786102bf9847bb6ac1f31f4359f3d473e35 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 1 Dec 2021 22:43:19 +0300 Subject: [PATCH 43/50] Use proper functions --- Zend/zend_execute.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 7a3462a5aa12c..49ac80272900e 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2394,7 +2394,7 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z } ZVAL_UNDEFINED_OP2(); if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE) && GC_DELREF(str) == 0) { - zend_string_release_ex(str, 0); + zend_string_efree(str); ZVAL_NULL(result); return; } @@ -2410,7 +2410,7 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z } zend_error(E_WARNING, "String offset cast occurred"); if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE) && GC_DELREF(str) == 0) { - zend_string_release_ex(str, 0); + zend_string_efree(str); ZVAL_NULL(result); return; } From 09547c64c28f81957d986b9c6b995b28d1098db6 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 2 Dec 2021 00:24:05 +0300 Subject: [PATCH 44/50] Fix clobering of operand by error handler in assignment to string offset In some cases new code requires two reallocations insead of one. Fixes oss-fuzz #31716, #36196, #39739 and #40002 --- Zend/tests/str_offset_006.phpt | 16 ++++ Zend/tests/str_offset_007.phpt | 16 ++++ Zend/zend_execute.c | 159 ++++++++++++++++++++++----------- Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 48 +++++----- Zend/zend_vm_gen.php | 14 ++- 6 files changed, 176 insertions(+), 81 deletions(-) create mode 100644 Zend/tests/str_offset_006.phpt create mode 100644 Zend/tests/str_offset_007.phpt diff --git a/Zend/tests/str_offset_006.phpt b/Zend/tests/str_offset_006.phpt new file mode 100644 index 0000000000000..3cdf91656bd27 --- /dev/null +++ b/Zend/tests/str_offset_006.phpt @@ -0,0 +1,16 @@ +--TEST-- +string offset 006 indirect string modification by error handler +--FILE-- + +--EXPECT-- +Err: Undefined variable $y +Err: Undefined variable $y +Err: String offset cast occurred +NULL diff --git a/Zend/tests/str_offset_007.phpt b/Zend/tests/str_offset_007.phpt new file mode 100644 index 0000000000000..3998ac401f637 --- /dev/null +++ b/Zend/tests/str_offset_007.phpt @@ -0,0 +1,16 @@ +--TEST-- +string offset 007 indirect string modification by error handler +--FILE-- + +--EXPECT-- +Err: Undefined variable $d +Err: String offset cast occurred +string(0) "" diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 49ac80272900e..280c5aa50762e 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1368,44 +1368,40 @@ static zend_never_inline zend_long zend_check_string_offset(zval *dim, int type zend_long offset; try_again: - if (UNEXPECTED(Z_TYPE_P(dim) != IS_LONG)) { - switch(Z_TYPE_P(dim)) { - case IS_STRING: - { - bool trailing_data = false; - /* For BC reasons we allow errors so that we can warn on leading numeric string */ - if (IS_LONG == is_numeric_string_ex(Z_STRVAL_P(dim), Z_STRLEN_P(dim), &offset, NULL, - /* allow errors */ true, NULL, &trailing_data)) { - if (UNEXPECTED(trailing_data) && type != BP_VAR_UNSET) { - zend_error(E_WARNING, "Illegal string offset \"%s\"", Z_STRVAL_P(dim)); - } - return offset; + switch(Z_TYPE_P(dim)) { + case IS_LONG: + return Z_LVAL_P(dim); + case IS_STRING: + { + bool trailing_data = false; + /* For BC reasons we allow errors so that we can warn on leading numeric string */ + if (IS_LONG == is_numeric_string_ex(Z_STRVAL_P(dim), Z_STRLEN_P(dim), &offset, NULL, + /* allow errors */ true, NULL, &trailing_data)) { + if (UNEXPECTED(trailing_data) && type != BP_VAR_UNSET) { + zend_error(E_WARNING, "Illegal string offset \"%s\"", Z_STRVAL_P(dim)); } - zend_illegal_string_offset(dim); - return 0; + return offset; } - case IS_UNDEF: - ZVAL_UNDEFINED_OP2(); - case IS_DOUBLE: - case IS_NULL: - case IS_FALSE: - case IS_TRUE: - zend_error(E_WARNING, "String offset cast occurred"); - break; - case IS_REFERENCE: - dim = Z_REFVAL_P(dim); - goto try_again; - default: - zend_illegal_string_offset(dim); - return 0; + zend_illegal_string_offset(dim); + return 0; } - - offset = zval_get_long_func(dim); - } else { - offset = Z_LVAL_P(dim); + case IS_UNDEF: + ZVAL_UNDEFINED_OP2(); + case IS_DOUBLE: + case IS_NULL: + case IS_FALSE: + case IS_TRUE: + zend_error(E_WARNING, "String offset cast occurred"); + break; + case IS_REFERENCE: + dim = Z_REFVAL_P(dim); + goto try_again; + default: + zend_illegal_string_offset(dim); + return 0; } - return offset; + return zval_get_long_func(dim); } static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D) @@ -1535,17 +1531,43 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zend_uchar c; size_t string_len; zend_long offset; + zend_string *s; - offset = zend_check_string_offset(dim, BP_VAR_W EXECUTE_DATA_CC); - /* Illegal offset assignment */ - if (UNEXPECTED(EG(exception) != NULL)) { - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + /* separate string */ + if (Z_REFCOUNTED_P(str) && Z_REFCOUNT_P(str) == 1) { + s = Z_STR_P(str); + } else { + s = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0); + ZSTR_H(s) = ZSTR_H(Z_STR_P(str)); + ZVAL_NEW_STR(str, s); + } + + if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) { + offset = Z_LVAL_P(dim); + } else { + /* The string may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(s); + } + offset = zend_check_string_offset(dim, BP_VAR_W EXECUTE_DATA_CC); + if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE) && GC_DELREF(s) == 0) { + zend_string_efree(s); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + return; + } + /* Illegal offset assignment */ + if (UNEXPECTED(EG(exception) != NULL)) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } + return; } - return; } - if (offset < -(zend_long)Z_STRLEN_P(str)) { + if (UNEXPECTED(offset < -(zend_long)ZSTR_LEN(s))) { /* Error on negative offset */ zend_error(E_WARNING, "Illegal string offset " ZEND_LONG_FMT, offset); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -1554,9 +1576,28 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, return; } - if (Z_TYPE_P(value) != IS_STRING) { + if (offset < 0) { /* Handle negative offset */ + offset += (zend_long)ZSTR_LEN(s); + } + + if (UNEXPECTED(Z_TYPE_P(value) != IS_STRING)) { + /* The string may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(s); + } + if (UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + } /* Convert to string, just the time to pick the 1st byte */ zend_string *tmp = zval_try_get_string_func(value); + if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE) && GC_DELREF(s) == 0) { + zend_string_efree(s); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + return; + } if (UNEXPECTED(!tmp)) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_UNDEF(EX_VAR(opline->result.var)); @@ -1572,7 +1613,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, c = (zend_uchar)Z_STRVAL_P(value)[0]; } - if (string_len != 1) { + if (UNEXPECTED(string_len != 1)) { if (string_len == 0) { /* Error on empty input string */ zend_throw_error(NULL, "Cannot assign an empty string to a string offset"); @@ -1582,24 +1623,34 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, return; } + /* The string may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(s); + } zend_error(E_WARNING, "Only the first byte will be assigned to the string offset"); + if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE) && GC_DELREF(s) == 0) { + zend_string_efree(s); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + return; + } + /* Illegal offset assignment */ + if (UNEXPECTED(EG(exception) != NULL)) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } + return; + } } - if (offset < 0) { /* Handle negative offset */ - offset += (zend_long)Z_STRLEN_P(str); - } - - if ((size_t)offset >= Z_STRLEN_P(str)) { + if ((size_t)offset >= ZSTR_LEN(s)) { /* Extend string if needed */ - zend_long old_len = Z_STRLEN_P(str); - ZVAL_NEW_STR(str, zend_string_extend(Z_STR_P(str), (size_t)offset + 1, 0)); + zend_long old_len = ZSTR_LEN(s); + ZVAL_NEW_STR(str, zend_string_extend(s, (size_t)offset + 1, 0)); memset(Z_STRVAL_P(str) + old_len, ' ', offset - old_len); Z_STRVAL_P(str)[offset+1] = 0; - } else if (!Z_REFCOUNTED_P(str)) { - ZVAL_NEW_STR(str, zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0)); - } else if (Z_REFCOUNT_P(str) > 1) { - Z_DELREF_P(str); - ZVAL_NEW_STR(str, zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0)); } else { zend_string_forget_hash_val(Z_STR_P(str)); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 9b517a1a876ff..c13fc7baa7344 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2590,8 +2590,8 @@ ZEND_VM_C_LABEL(try_assign_dim_array): FREE_OP_DATA(); UNDEF_RESULT(); } else { - dim = GET_OP2_ZVAL_PTR(BP_VAR_R); - value = GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R); + dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R); + value = GET_OP_DATA_ZVAL_PTR_UNDEF(BP_VAR_R); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); FREE_OP_DATA(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 1c2cbd008a1a1..9aea2d2b4998f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23476,7 +23476,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D UNDEF_RESULT(); } else { dim = RT_CONSTANT(opline, opline->op2); - value = _get_zval_ptr_var_deref((opline+1)->op1.var EXECUTE_DATA_CC); + value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } @@ -23588,7 +23588,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D UNDEF_RESULT(); } else { dim = RT_CONSTANT(opline, opline->op2); - value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); } @@ -25988,7 +25988,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ UNDEF_RESULT(); } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); - value = _get_zval_ptr_var_deref((opline+1)->op1.var EXECUTE_DATA_CC); + value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } @@ -26100,7 +26100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ UNDEF_RESULT(); } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); - value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); } @@ -27356,7 +27356,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ UNDEF_RESULT(); } else { dim = NULL; - value = _get_zval_ptr_var_deref((opline+1)->op1.var EXECUTE_DATA_CC); + value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } @@ -27468,7 +27468,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ UNDEF_RESULT(); } else { dim = NULL; - value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); } @@ -29656,7 +29656,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA UNDEF_RESULT(); } else { - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + dim = EX_VAR(opline->op2.var); value = RT_CONSTANT((opline+1), (opline+1)->op1); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); @@ -29769,7 +29769,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); UNDEF_RESULT(); } else { - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + dim = EX_VAR(opline->op2.var); value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -29882,8 +29882,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); UNDEF_RESULT(); } else { - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - value = _get_zval_ptr_var_deref((opline+1)->op1.var EXECUTE_DATA_CC); + dim = EX_VAR(opline->op2.var); + value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } @@ -29994,8 +29994,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA UNDEF_RESULT(); } else { - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + dim = EX_VAR(opline->op2.var); + value = EX_VAR((opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); } @@ -40734,7 +40734,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA UNDEF_RESULT(); } else { dim = RT_CONSTANT(opline, opline->op2); - value = _get_zval_ptr_var_deref((opline+1)->op1.var EXECUTE_DATA_CC); + value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } @@ -40846,7 +40846,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA UNDEF_RESULT(); } else { dim = RT_CONSTANT(opline, opline->op2); - value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); } @@ -44320,7 +44320,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D UNDEF_RESULT(); } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); - value = _get_zval_ptr_var_deref((opline+1)->op1.var EXECUTE_DATA_CC); + value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } @@ -44432,7 +44432,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D UNDEF_RESULT(); } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); - value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); } @@ -46134,7 +46134,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D UNDEF_RESULT(); } else { dim = NULL; - value = _get_zval_ptr_var_deref((opline+1)->op1.var EXECUTE_DATA_CC); + value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } @@ -46246,7 +46246,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D UNDEF_RESULT(); } else { dim = NULL; - value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); } @@ -49102,7 +49102,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ UNDEF_RESULT(); } else { - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + dim = EX_VAR(opline->op2.var); value = RT_CONSTANT((opline+1), (opline+1)->op1); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); @@ -49215,7 +49215,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); UNDEF_RESULT(); } else { - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + dim = EX_VAR(opline->op2.var); value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -49328,8 +49328,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); UNDEF_RESULT(); } else { - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - value = _get_zval_ptr_var_deref((opline+1)->op1.var EXECUTE_DATA_CC); + dim = EX_VAR(opline->op2.var); + value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); } @@ -49440,8 +49440,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ UNDEF_RESULT(); } else { - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + dim = EX_VAR(opline->op2.var); + value = EX_VAR((opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC); } diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index a8bcf96ef2d61..98415a7cd01ca 100755 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -516,6 +516,17 @@ "TMPVARCV" => "???", ); +$op_data_get_zval_ptr_undef = array( + "ANY" => "get_op_data_zval_ptr_undef((opline+1)->op1_type, (opline+1)->op1)", + "TMP" => "_get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC)", + "VAR" => "_get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC)", + "CONST" => "RT_CONSTANT((opline+1), (opline+1)->op1)", + "UNUSED" => "NULL", + "CV" => "EX_VAR((opline+1)->op1.var)", + "TMPVAR" => "_get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC)", + "TMPVARCV" => "EX_VAR((opline+1)->op1.var)", +); + $op_data_get_zval_ptr_deref = array( "ANY" => "get_op_data_zval_ptr_deref_r((opline+1)->op1_type, (opline+1)->op1)", "TMP" => "_get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC)", @@ -719,7 +730,7 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null) $op1_free_unfetched, $op2_free_unfetched, $op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var, $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix, - $op_data_type, $op_data_get_zval_ptr, + $op_data_type, $op_data_get_zval_ptr, $op_data_get_zval_ptr_undef, $op_data_get_zval_ptr_deref, $op_data_get_zval_ptr_ptr, $op_data_free_op, $op_data_free_op_var_ptr, $op_data_free_unfetched; @@ -763,6 +774,7 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null) "/^#(\s*)elif\s+0\s*&&.*[^\\\\]$/m" => "#\\1elif 0", "/OP_DATA_TYPE/" => $op_data_type[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], "/GET_OP_DATA_ZVAL_PTR\(([^)]*)\)/" => $op_data_get_zval_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], + "/GET_OP_DATA_ZVAL_PTR_UNDEF\(([^)]*)\)/" => $op_data_get_zval_ptr_undef[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], "/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/" => $op_data_get_zval_ptr_deref[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], "/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/" => $op_data_get_zval_ptr_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], "/FREE_OP_DATA\(\)/" => $op_data_free_op[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], From 4595a57e99f06e95b1882523315054d6c18c9aed Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 2 Dec 2021 01:20:17 +0300 Subject: [PATCH 45/50] Fix clobering of operand by error handler in assignment to string offset (optimization and JIT support) --- Zend/zend_execute.c | 22 +++---- ext/opcache/jit/zend_jit_helpers.c | 99 +++++++++++++++++++++++------- 2 files changed, 87 insertions(+), 34 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 280c5aa50762e..c49791e907003 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1547,11 +1547,9 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } else { /* The string may be destroyed while throwing the notice. * Temporarily increase the refcount to detect this situation. */ - if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE)) { - GC_ADDREF(s); - } + GC_ADDREF(s); offset = zend_check_string_offset(dim, BP_VAR_W EXECUTE_DATA_CC); - if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE) && GC_DELREF(s) == 0) { + if (GC_DELREF(s) == 0) { zend_string_efree(s); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -1581,17 +1579,17 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } if (UNEXPECTED(Z_TYPE_P(value) != IS_STRING)) { + zend_string *tmp; + /* The string may be destroyed while throwing the notice. * Temporarily increase the refcount to detect this situation. */ - if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE)) { - GC_ADDREF(s); - } + GC_ADDREF(s); if (UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); } /* Convert to string, just the time to pick the 1st byte */ - zend_string *tmp = zval_try_get_string_func(value); - if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE) && GC_DELREF(s) == 0) { + tmp = zval_try_get_string_func(value); + if (GC_DELREF(s) == 0) { zend_string_efree(s); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -1625,11 +1623,9 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, /* The string may be destroyed while throwing the notice. * Temporarily increase the refcount to detect this situation. */ - if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE)) { - GC_ADDREF(s); - } + GC_ADDREF(s); zend_error(E_WARNING, "Only the first byte will be assigned to the string offset"); - if (!(GC_FLAGS(s) & IS_ARRAY_IMMUTABLE) && GC_DELREF(s) == 0) { + if (GC_DELREF(s) == 0) { zend_string_efree(s); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index a7a8d6706f0e0..d7988ff41241e 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -1125,13 +1125,32 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(void) static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zval *value, zval *result) { - zend_string *old_str; zend_uchar c; size_t string_len; zend_long offset; + zend_string *s; + + /* separate string */ + if (Z_REFCOUNTED_P(str) && Z_REFCOUNT_P(str) == 1) { + s = Z_STR_P(str); + } else { + s = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0); + ZSTR_H(s) = ZSTR_H(Z_STR_P(str)); + ZVAL_NEW_STR(str, s); + } if (UNEXPECTED(Z_TYPE_P(dim) != IS_LONG)) { + /* The string may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + GC_ADDREF(s); offset = zend_check_string_offset(dim/*, BP_VAR_W*/); + if (GC_DELREF(s) == 0) { + zend_string_efree(s); + if (result) { + ZVAL_NULL(result); + } + return; + } if (UNEXPECTED(EG(exception) != NULL)) { if (UNEXPECTED(result)) { ZVAL_UNDEF(result); @@ -1141,7 +1160,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } else { offset = Z_LVAL_P(dim); } - if (offset < -(zend_long)Z_STRLEN_P(str)) { + if (offset < -(zend_long)ZSTR_LEN(s)) { /* Error on negative offset */ zend_error(E_WARNING, "Illegal string offset " ZEND_LONG_FMT, offset); if (result) { @@ -1151,8 +1170,35 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } if (Z_TYPE_P(value) != IS_STRING) { + zend_string *tmp; + + /* The string may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + GC_ADDREF(s); + + if (UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + const zend_op *op_data = EG(current_execute_data)->opline + 1; + ZEND_ASSERT(op_data->opcode == ZEND_OP_DATA && op_data->op1_type == IS_CV); + zend_jit_undefined_op_helper(op_data->op1.var); + value = &EG(uninitialized_zval); + } + /* Convert to string, just the time to pick the 1st byte */ - zend_string *tmp = zval_try_get_string_func(value); + tmp = zval_try_get_string_func(value); + + if (GC_DELREF(s) == 0) { + zend_string_efree(s); + if (result) { + ZVAL_NULL(result); + } + return; + } + if (UNEXPECTED(!tmp)) { + if (result) { + ZVAL_UNDEF(result); + } + return; + } if (UNEXPECTED(!tmp)) { if (result) { @@ -1180,27 +1226,37 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, return; } + /* The string may be destroyed while throwing the notice. + * Temporarily increase the refcount to detect this situation. */ + GC_ADDREF(s); zend_error(E_WARNING, "Only the first byte will be assigned to the string offset"); + if (GC_DELREF(s) == 0) { + zend_string_efree(s); + if (result) { + ZVAL_NULL(result); + } + return; + } + /* Illegal offset assignment */ + if (UNEXPECTED(EG(exception) != NULL)) { + if (result) { + ZVAL_UNDEF(result); + } + return; + } } if (offset < 0) { /* Handle negative offset */ - offset += (zend_long)Z_STRLEN_P(str); + offset += (zend_long)ZSTR_LEN(s); } - if ((size_t)offset >= Z_STRLEN_P(str)) { + if ((size_t)offset >= ZSTR_LEN(s)) { /* Extend string if needed */ - zend_long old_len = Z_STRLEN_P(str); - Z_STR_P(str) = zend_string_extend(Z_STR_P(str), offset + 1, 0); - Z_TYPE_INFO_P(str) = IS_STRING_EX; + zend_long old_len = ZSTR_LEN(s); + ZVAL_NEW_STR(str, zend_string_extend(s, (size_t)offset + 1, 0)); memset(Z_STRVAL_P(str) + old_len, ' ', offset - old_len); Z_STRVAL_P(str)[offset+1] = 0; - } else if (!Z_REFCOUNTED_P(str)) { - old_str = Z_STR_P(str); - Z_STR_P(str) = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0); - Z_TYPE_INFO_P(str) = IS_STRING_EX; - zend_string_release(old_str); } else { - SEPARATE_STRING(str); zend_string_forget_hash_val(Z_STR_P(str)); } @@ -1283,6 +1339,11 @@ static void ZEND_FASTCALL zend_jit_fetch_dim_obj_rw_helper(zval *object_ptr, zva static void ZEND_FASTCALL zend_jit_assign_dim_helper(zval *object_ptr, zval *dim, zval *value, zval *result) { + if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING) && EXPECTED(dim != NULL)) { + zend_assign_to_string_offset(object_ptr, dim, value, result); + return; + } + if (dim && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) { const zend_op *opline = EG(current_execute_data)->opline; zend_jit_undefined_op_helper(opline->op2.var); @@ -1307,13 +1368,9 @@ static void ZEND_FASTCALL zend_jit_assign_dim_helper(zval *object_ptr, zval *dim } } } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { - if (!dim) { - zend_throw_error(NULL, "[] operator not supported for strings"); - if (result) { - ZVAL_UNDEF(result); - } - } else { - zend_assign_to_string_offset(object_ptr, dim, value, result); + zend_throw_error(NULL, "[] operator not supported for strings"); + if (result) { + ZVAL_UNDEF(result); } } else { zend_throw_error(NULL, "Cannot use a scalar value as an array"); From 999c6f2c5d272bd52f5d7f57da384939c4b79e2a Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Thu, 2 Dec 2021 05:09:07 +0000 Subject: [PATCH 46/50] Bump for 8.0.15 --- NEWS | 5 ++++- Zend/zend.h | 2 +- configure.ac | 2 +- main/php_version.h | 6 +++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 560ac396d6c9a..502dadd166dd1 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? 2021, PHP 8.0.14 +?? ??? 2022, PHP 8.0.15 + + +16 Dec 2021, PHP 8.0.14 - Core: . Fixed bug #81582 (Stringable not implicitly declared if __toString() came diff --git a/Zend/zend.h b/Zend/zend.h index a4cc27e4755d3..862d708727055 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -20,7 +20,7 @@ #ifndef ZEND_H #define ZEND_H -#define ZEND_VERSION "4.0.14-dev" +#define ZEND_VERSION "4.0.15-dev" #define ZEND_ENGINE_3 diff --git a/configure.ac b/configure.ac index 82ca139158395..3e5ebce3126be 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ dnl Basic autoconf initialization, generation of config.nice. dnl ---------------------------------------------------------------------------- AC_PREREQ([2.68]) -AC_INIT([PHP],[8.0.14-dev],[https://bugs.php.net],[php],[https://www.php.net]) +AC_INIT([PHP],[8.0.15-dev],[https://bugs.php.net],[php],[https://www.php.net]) AC_CONFIG_SRCDIR([main/php_version.h]) AC_CONFIG_AUX_DIR([build]) AC_PRESERVE_HELP_ORDER diff --git a/main/php_version.h b/main/php_version.h index 9544638a2fdb6..cc8245315270f 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.ac to change version number */ #define PHP_MAJOR_VERSION 8 #define PHP_MINOR_VERSION 0 -#define PHP_RELEASE_VERSION 14 +#define PHP_RELEASE_VERSION 15 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "8.0.14-dev" -#define PHP_VERSION_ID 80014 +#define PHP_VERSION "8.0.15-dev" +#define PHP_VERSION_ID 80015 From df16da36972c8e186cfe22433d5d0f278e6d7454 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 2 Dec 2021 10:32:45 +0300 Subject: [PATCH 47/50] Fixed ext/bz2/tests/005.phpt test failure introduesed by 09547c64c28f81957d986b9c6b995b28d1098db6 --- Zend/zend_execute.c | 3 +++ ext/opcache/jit/zend_jit_helpers.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c49791e907003..859adcf324421 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1539,6 +1539,9 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } else { s = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0); ZSTR_H(s) = ZSTR_H(Z_STR_P(str)); + if (Z_REFCOUNTED_P(str)) { + zend_string_release_ex(Z_STR_P(str), 0); + } ZVAL_NEW_STR(str, s); } diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index d7988ff41241e..be26a60aaa599 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -1136,6 +1136,9 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } else { s = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0); ZSTR_H(s) = ZSTR_H(Z_STR_P(str)); + if (Z_REFCOUNTED_P(str)) { + zend_string_release_ex(Z_STR_P(str), 0); + } ZVAL_NEW_STR(str, s); } From 37ac707cac2bb6efc68f91f35b50e870d2f3294a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 2 Dec 2021 11:18:08 +0300 Subject: [PATCH 48/50] Add missing zend_string_release_ex(tmp, 0) and cleanup - use GC_DELREF() instead of zend_string_release_ex() - add expectations for exceptional cases - replace IS_ARRAY_IMMUTABLE by IS_STR_INTERNED --- Zend/zend_execute.c | 19 +++++++++++-------- ext/opcache/jit/zend_jit_helpers.c | 11 +++++++---- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 859adcf324421..db04a2d22d4cf 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1540,7 +1540,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, s = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0); ZSTR_H(s) = ZSTR_H(Z_STR_P(str)); if (Z_REFCOUNTED_P(str)) { - zend_string_release_ex(Z_STR_P(str), 0); + GC_DELREF(Z_STR_P(str)); } ZVAL_NEW_STR(str, s); } @@ -1552,7 +1552,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, * Temporarily increase the refcount to detect this situation. */ GC_ADDREF(s); offset = zend_check_string_offset(dim, BP_VAR_W EXECUTE_DATA_CC); - if (GC_DELREF(s) == 0) { + if (UNEXPECTED(GC_DELREF(s) == 0)) { zend_string_efree(s); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -1592,8 +1592,11 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } /* Convert to string, just the time to pick the 1st byte */ tmp = zval_try_get_string_func(value); - if (GC_DELREF(s) == 0) { + if (UNEXPECTED(GC_DELREF(s) == 0)) { zend_string_efree(s); + if (tmp) { + zend_string_release_ex(tmp, 0); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -1628,7 +1631,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, * Temporarily increase the refcount to detect this situation. */ GC_ADDREF(s); zend_error(E_WARNING, "Only the first byte will be assigned to the string offset"); - if (GC_DELREF(s) == 0) { + if (UNEXPECTED(GC_DELREF(s) == 0)) { zend_string_efree(s); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -2439,11 +2442,11 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z case IS_UNDEF: /* The string may be destroyed while throwing the notice. * Temporarily increase the refcount to detect this situation. */ - if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE)) { + if (!(GC_FLAGS(str) & IS_STR_INTERNED)) { GC_ADDREF(str); } ZVAL_UNDEFINED_OP2(); - if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE) && GC_DELREF(str) == 0) { + if (!(GC_FLAGS(str) & IS_STR_INTERNED) && UNEXPECTED(GC_DELREF(str) == 0)) { zend_string_efree(str); ZVAL_NULL(result); return; @@ -2455,11 +2458,11 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z if (type != BP_VAR_IS) { /* The string may be destroyed while throwing the notice. * Temporarily increase the refcount to detect this situation. */ - if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE)) { + if (!(GC_FLAGS(str) & IS_STR_INTERNED)) { GC_ADDREF(str); } zend_error(E_WARNING, "String offset cast occurred"); - if (!(GC_FLAGS(str) & IS_ARRAY_IMMUTABLE) && GC_DELREF(str) == 0) { + if (!(GC_FLAGS(str) & IS_STR_INTERNED) && UNEXPECTED(GC_DELREF(str) == 0)) { zend_string_efree(str); ZVAL_NULL(result); return; diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index be26a60aaa599..3d7163d370678 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -1137,7 +1137,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, s = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0); ZSTR_H(s) = ZSTR_H(Z_STR_P(str)); if (Z_REFCOUNTED_P(str)) { - zend_string_release_ex(Z_STR_P(str), 0); + GC_DELREF(Z_STR_P(str)); } ZVAL_NEW_STR(str, s); } @@ -1147,7 +1147,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, * Temporarily increase the refcount to detect this situation. */ GC_ADDREF(s); offset = zend_check_string_offset(dim/*, BP_VAR_W*/); - if (GC_DELREF(s) == 0) { + if (UNEXPECTED(GC_DELREF(s) == 0)) { zend_string_efree(s); if (result) { ZVAL_NULL(result); @@ -1189,8 +1189,11 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, /* Convert to string, just the time to pick the 1st byte */ tmp = zval_try_get_string_func(value); - if (GC_DELREF(s) == 0) { + if (UNEXPECTED(GC_DELREF(s) == 0)) { zend_string_efree(s); + if (tmp) { + zend_string_release_ex(tmp, 0); + } if (result) { ZVAL_NULL(result); } @@ -1233,7 +1236,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, * Temporarily increase the refcount to detect this situation. */ GC_ADDREF(s); zend_error(E_WARNING, "Only the first byte will be assigned to the string offset"); - if (GC_DELREF(s) == 0) { + if (UNEXPECTED(GC_DELREF(s) == 0)) { zend_string_efree(s); if (result) { ZVAL_NULL(result); From a2b84b1e663775a00b10bd6a355df545affd1894 Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Thu, 2 Dec 2021 10:11:11 +0100 Subject: [PATCH 49/50] Update NEWS for PHP 8.1.1 --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 17e01da2f80fa..51bb68a681e7d 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 8.1.1 +02 Dec 2021, PHP 8.1.1 - IMAP: . Fixed bug #81649 (imap_(un)delete accept sequences, not single numbers). From e2a082c4a94bc62dfc1d2119d4ce3301632bdfdb Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Wed, 15 Dec 2021 02:54:57 +0100 Subject: [PATCH 50/50] Preparing for 8.1.1 --- NEWS | 2 +- Zend/zend.h | 2 +- configure.ac | 2 +- main/php_version.h | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 51bb68a681e7d..fd76127786ddc 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -02 Dec 2021, PHP 8.1.1 +16 Dec 2021, PHP 8.1.1 - IMAP: . Fixed bug #81649 (imap_(un)delete accept sequences, not single numbers). diff --git a/Zend/zend.h b/Zend/zend.h index b4cabb7ae7601..c455f16c354dc 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -20,7 +20,7 @@ #ifndef ZEND_H #define ZEND_H -#define ZEND_VERSION "4.1.1-dev" +#define ZEND_VERSION "4.1.1" #define ZEND_ENGINE_3 diff --git a/configure.ac b/configure.ac index e6270a7523533..6a0ea3b5534c4 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ dnl Basic autoconf initialization, generation of config.nice. dnl ---------------------------------------------------------------------------- AC_PREREQ([2.68]) -AC_INIT([PHP],[8.1.1-dev],[https://bugs.php.net],[php],[https://www.php.net]) +AC_INIT([PHP],[8.1.1],[https://bugs.php.net],[php],[https://www.php.net]) AC_CONFIG_SRCDIR([main/php_version.h]) AC_CONFIG_AUX_DIR([build]) AC_PRESERVE_HELP_ORDER diff --git a/main/php_version.h b/main/php_version.h index 44f483c823bf6..cc56cad368e46 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -3,6 +3,6 @@ #define PHP_MAJOR_VERSION 8 #define PHP_MINOR_VERSION 1 #define PHP_RELEASE_VERSION 1 -#define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "8.1.1-dev" +#define PHP_EXTRA_VERSION "" +#define PHP_VERSION "8.1.1" #define PHP_VERSION_ID 80101