From webhook-mailer at python.org Wed May 1 03:48:50 2019 From: webhook-mailer at python.org (Chris Withers) Date: Wed, 01 May 2019 07:48:50 -0000 Subject: [Python-checkins] remove jython support from unittest.mock (GH#13033) Message-ID: https://github.com/python/cpython/commit/49e27f0afb02ce7b98ed5a4387238850117f4c7e commit: 49e27f0afb02ce7b98ed5a4387238850117f4c7e branch: master author: Chris Withers committer: GitHub date: 2019-05-01T08:48:44+01:00 summary: remove jython support from unittest.mock (GH#13033) files: M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py M Lib/unittest/test/testmock/testpatch.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 997af7172566..721e91f8cbcb 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -36,13 +36,6 @@ _builtins = {name for name in dir(builtins) if not name.startswith('_')} -BaseExceptions = (BaseException,) -if 'java' in sys.platform: - # jython - import java - BaseExceptions = (BaseException, java.lang.Throwable) - - FILTER_DIR = True # Workaround for issue #12370 @@ -57,8 +50,8 @@ def _is_instance_mock(obj): def _is_exception(obj): return ( - isinstance(obj, BaseExceptions) or - isinstance(obj, type) and issubclass(obj, BaseExceptions) + isinstance(obj, BaseException) or + isinstance(obj, type) and issubclass(obj, BaseException) ) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 0e7e4a1d8c93..9bef51abd87f 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -184,21 +184,6 @@ def f(): mock.side_effect = ValueError('Bazinga!') self.assertRaisesRegex(ValueError, 'Bazinga!', mock) - @unittest.skipUnless('java' in sys.platform, - 'This test only applies to Jython') - def test_java_exception_side_effect(self): - import java - mock = Mock(side_effect=java.lang.RuntimeException("Boom!")) - - # can't use assertRaises with java exceptions - try: - mock(1, 2, fish=3) - except java.lang.RuntimeException: - pass - else: - self.fail('java exception not raised') - mock.assert_called_with(1,2, fish=3) - def test_reset_mock(self): parent = Mock() diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index 51c66fec67fc..e5abd9bda489 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -1312,7 +1312,6 @@ def test(f, foo): def test_patch_multiple_create_mocks_different_order(self): - # bug revealed by Jython! original_f = Foo.f original_g = Foo.g From webhook-mailer at python.org Wed May 1 08:00:11 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 01 May 2019 12:00:11 -0000 Subject: [Python-checkins] bpo-30458: Disable https related urllib tests on a build without ssl (GH-13032) Message-ID: https://github.com/python/cpython/commit/2fc936ed24cf04ed32f6015a8aa78c8ea40da66b commit: 2fc936ed24cf04ed32f6015a8aa78c8ea40da66b branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-01T04:59:48-07:00 summary: bpo-30458: Disable https related urllib tests on a build without ssl (GH-13032) These tests require an SSL enabled build. Skip these tests when python is built without SSL to fix test failures. https://bugs.python.org/issue30458 files: M Lib/test/test_urllib.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index e87c85b92876..c5b23f935b27 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -329,6 +329,7 @@ def test_willclose(self): finally: self.unfakehttp() + @unittest.skipUnless(ssl, "ssl module required") def test_url_with_control_char_rejected(self): for char_no in list(range(0, 0x21)) + [0x7f]: char = chr(char_no) @@ -354,6 +355,7 @@ def test_url_with_control_char_rejected(self): finally: self.unfakehttp() + @unittest.skipUnless(ssl, "ssl module required") def test_url_with_newline_header_injection_rejected(self): self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") host = "localhost:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123" From webhook-mailer at python.org Wed May 1 09:23:03 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 01 May 2019 13:23:03 -0000 Subject: [Python-checkins] bpo-36763: Add _PyCoreConfig_SetString() (GH-13035) Message-ID: https://github.com/python/cpython/commit/1a9f0d8efded4bf37c864ed572beff28c43c7c77 commit: 1a9f0d8efded4bf37c864ed572beff28c43c7c77 branch: master author: Victor Stinner committer: GitHub date: 2019-05-01T15:22:52+02:00 summary: bpo-36763: Add _PyCoreConfig_SetString() (GH-13035) Add 3 new config methods: * _PyCoreConfig_SetString() * _PyCoreConfig_SetWideString() * _PyCoreConfig_SetWideStringFromString() Changes: * _PyCoreConfig_Copy() returns _PyInitError. * Add CONFIG_GET_ENV_DUP(). files: M Include/internal/pycore_coreconfig.h M Python/coreconfig.c M Python/pylifecycle.c diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index b1d02eef4513..8af310d2b0ce 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -102,16 +102,24 @@ PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(_PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); -PyAPI_FUNC(int) _PyCoreConfig_Copy( +PyAPI_FUNC(_PyInitError) _PyCoreConfig_Copy( _PyCoreConfig *config, const _PyCoreConfig *config2); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetString( + char **config_str, + const char *str); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideString( + wchar_t **config_str, + const wchar_t *str); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideStringFromString( + wchar_t **config_str, + const char *str); PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPathConfig(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPathConfig( const _PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config, _PyRuntimeState *runtime); - PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPyArgv( _PyCoreConfig *config, const _PyArgv *args); diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 4bfe745ce449..7f388cbcdd0e 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -520,34 +520,111 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) } -int +/* Copy str into *config_str (duplicate the string) */ +_PyInitError +_PyCoreConfig_SetString(char **config_str, const char *str) +{ + char *str2; + if (str != NULL) { + str2 = _PyMem_RawStrdup(str); + if (str2 == NULL) { + return _Py_INIT_NO_MEMORY(); + } + } + else { + str2 = NULL; + } + PyMem_RawFree(*config_str); + *config_str = str2; + return _Py_INIT_OK(); +} + + +/* Copy str into *config_str (duplicate the string) */ +_PyInitError +_PyCoreConfig_SetWideString(wchar_t **config_str, const wchar_t *str) +{ + wchar_t *str2; + if (str != NULL) { + str2 = _PyMem_RawWcsdup(str); + if (str2 == NULL) { + return _Py_INIT_NO_MEMORY(); + } + } + else { + str2 = NULL; + } + PyMem_RawFree(*config_str); + *config_str = str2; + return _Py_INIT_OK(); +} + + +/* Decode str using Py_DecodeLocale() and set the result into *config_str */ +static _PyInitError +_PyCoreConfig_SetWideStringFromStringErr(wchar_t **config_str, const char *str, + const char *decode_err_msg) +{ + wchar_t *str2; + if (str != NULL) { + size_t len; + str2 = Py_DecodeLocale(str, &len); + if (str2 == NULL) { + if (len == (size_t)-2) { + return _Py_INIT_ERR(decode_err_msg); + } + else { + return _Py_INIT_NO_MEMORY(); + } + } + } + else { + str2 = NULL; + } + PyMem_RawFree(*config_str); + *config_str = str2; + return _Py_INIT_OK(); +} + + +_PyInitError +_PyCoreConfig_SetWideStringFromString(wchar_t **config_str, const char *str) +{ + return _PyCoreConfig_SetWideStringFromStringErr( + config_str, str, "cannot decode string"); +} + + +#define CONFIG_DECODE_LOCALE(config_str, str, NAME) \ + _PyCoreConfig_SetWideStringFromStringErr(config_str, str, \ + "cannot decode " NAME) + + +_PyInitError _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) { + _PyInitError err; _PyCoreConfig_Clear(config); #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR #define COPY_STR_ATTR(ATTR) \ do { \ - if (config2->ATTR != NULL) { \ - config->ATTR = _PyMem_RawStrdup(config2->ATTR); \ - if (config->ATTR == NULL) { \ - return -1; \ - } \ + err = _PyCoreConfig_SetString(&config->ATTR, config2->ATTR); \ + if (_Py_INIT_FAILED(err)) { \ + return err; \ } \ } while (0) #define COPY_WSTR_ATTR(ATTR) \ do { \ - if (config2->ATTR != NULL) { \ - config->ATTR = _PyMem_RawWcsdup(config2->ATTR); \ - if (config->ATTR == NULL) { \ - return -1; \ - } \ + err = _PyCoreConfig_SetWideString(&config->ATTR, config2->ATTR); \ + if (_Py_INIT_FAILED(err)) { \ + return err; \ } \ } while (0) #define COPY_WSTRLIST(LIST) \ do { \ if (_PyWstrList_Copy(&config->LIST, &config2->LIST) < 0 ) { \ - return -1; \ + return _Py_INIT_NO_MEMORY(); \ } \ } while (0) @@ -617,7 +694,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) #undef COPY_STR_ATTR #undef COPY_WSTR_ATTR #undef COPY_WSTRLIST - return 0; + return _Py_INIT_OK(); } @@ -746,54 +823,44 @@ _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) /* Get a copy of the environment variable as wchar_t*. Return 0 on success, but *dest can be NULL. Return -1 on memory allocation failure. Return -2 on decoding error. */ -static int +static _PyInitError _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, wchar_t **dest, - wchar_t *wname, char *name) + wchar_t *wname, char *name, + const char *decode_err_msg) { + assert(*dest == NULL); assert(config->use_environment >= 0); if (!config->use_environment) { *dest = NULL; - return 0; + return _Py_INIT_OK(); } #ifdef MS_WINDOWS const wchar_t *var = _wgetenv(wname); if (!var || var[0] == '\0') { *dest = NULL; - return 0; - } - - wchar_t *copy = _PyMem_RawWcsdup(var); - if (copy == NULL) { - return -1; + return _Py_INIT_OK(); } - *dest = copy; + return _PyCoreConfig_SetWideString(dest, var); #else const char *var = getenv(name); if (!var || var[0] == '\0') { *dest = NULL; - return 0; + return _Py_INIT_OK(); } - size_t len; - wchar_t *wvar = Py_DecodeLocale(var, &len); - if (!wvar) { - if (len == (size_t)-2) { - return -2; - } - else { - return -1; - } - } - *dest = wvar; + return _PyCoreConfig_SetWideStringFromStringErr(dest, var, decode_err_msg); #endif - return 0; } +#define CONFIG_GET_ENV_DUP(CONFIG, DEST, WNAME, NAME) \ + _PyCoreConfig_GetEnvDup(CONFIG, DEST, WNAME, NAME, "cannot decode " NAME) + + static void _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) { @@ -876,6 +943,7 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) static _PyInitError config_init_program_name(_PyCoreConfig *config) { + _PyInitError err; assert(config->program_name == NULL); /* If Py_SetProgramName() was called, use its value */ @@ -900,13 +968,11 @@ config_init_program_name(_PyCoreConfig *config) script. */ const char *p = _PyCoreConfig_GetEnv(config, "PYTHONEXECUTABLE"); if (p != NULL) { - size_t len; - wchar_t* program_name = Py_DecodeLocale(p, &len); - if (program_name == NULL) { - return DECODE_LOCALE_ERR("PYTHONEXECUTABLE environment " - "variable", (Py_ssize_t)len); + err = CONFIG_DECODE_LOCALE(&config->program_name, p, + "PYTHONEXECUTABLE environment variable"); + if (_Py_INIT_FAILED(err)) { + return err; } - config->program_name = program_name; return _Py_INIT_OK(); } #ifdef WITH_NEXT_FRAMEWORK @@ -916,13 +982,11 @@ config_init_program_name(_PyCoreConfig *config) /* Used by Mac/Tools/pythonw.c to forward * the argv0 of the stub executable */ - size_t len; - wchar_t* program_name = Py_DecodeLocale(pyvenv_launcher, &len); - if (program_name == NULL) { - return DECODE_LOCALE_ERR("__PYVENV_LAUNCHER__ environment " - "variable", (Py_ssize_t)len); + err = CONFIG_DECODE_LOCALE(&config->program_name, pyvenv_launcher, + "__PYVENV_LAUNCHER__ environment variable"); + if (_Py_INIT_FAILED(err)) { + return err; } - config->program_name = program_name; return _Py_INIT_OK(); } } @@ -931,9 +995,10 @@ config_init_program_name(_PyCoreConfig *config) /* Use argv[0] by default, if available */ if (config->program != NULL) { - config->program_name = _PyMem_RawWcsdup(config->program); - if (config->program_name == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetWideString(&config->program_name, + config->program); + if (_Py_INIT_FAILED(err)) { + return err; } return _Py_INIT_OK(); } @@ -944,9 +1009,9 @@ config_init_program_name(_PyCoreConfig *config) #else const wchar_t *default_program_name = L"python3"; #endif - config->program_name = _PyMem_RawWcsdup(default_program_name); - if (config->program_name == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetWideString(&config->program_name, default_program_name); + if (_Py_INIT_FAILED(err)) { + return err; } return _Py_INIT_OK(); } @@ -959,13 +1024,13 @@ config_init_executable(_PyCoreConfig *config) /* If Py_SetProgramFullPath() was called, use its value */ const wchar_t *program_full_path = _Py_path_config.program_full_path; if (program_full_path != NULL) { - config->executable = _PyMem_RawWcsdup(program_full_path); - if (config->executable == NULL) { - return _Py_INIT_NO_MEMORY(); + _PyInitError err = _PyCoreConfig_SetWideString(&config->executable, + program_full_path); + if (_Py_INIT_FAILED(err)) { + return err; } return _Py_INIT_OK(); } - return _Py_INIT_OK(); } @@ -985,20 +1050,15 @@ config_init_home(_PyCoreConfig *config) /* If Py_SetPythonHome() was called, use its value */ wchar_t *home = _Py_path_config.home; if (home) { - config->home = _PyMem_RawWcsdup(home); - if (config->home == NULL) { - return _Py_INIT_NO_MEMORY(); + _PyInitError err = _PyCoreConfig_SetWideString(&config->home, home); + if (_Py_INIT_FAILED(err)) { + return err; } return _Py_INIT_OK(); } - int res = _PyCoreConfig_GetEnvDup(config, &home, - L"PYTHONHOME", "PYTHONHOME"); - if (res < 0) { - return DECODE_LOCALE_ERR("PYTHONHOME", res); - } - config->home = home; - return _Py_INIT_OK(); + return CONFIG_GET_ENV_DUP(config, &config->home, + L"PYTHONHOME", "PYTHONHOME"); } @@ -1055,6 +1115,7 @@ config_wstr_to_int(const wchar_t *wstr, int *result) static _PyInitError config_read_env_vars(_PyCoreConfig *config) { + _PyInitError err; int use_env = config->use_environment; /* Get environment variables */ @@ -1094,17 +1155,15 @@ config_read_env_vars(_PyCoreConfig *config) } if (config->module_search_path_env == NULL) { - wchar_t *path; - int res = _PyCoreConfig_GetEnvDup(config, &path, - L"PYTHONPATH", "PYTHONPATH"); - if (res < 0) { - return DECODE_LOCALE_ERR("PYTHONPATH", res); + err = CONFIG_GET_ENV_DUP(config, &config->module_search_path_env, + L"PYTHONPATH", "PYTHONPATH"); + if (_Py_INIT_FAILED(err)) { + return err; } - config->module_search_path_env = path; } if (config->use_hash_seed < 0) { - _PyInitError err = config_init_hash_seed(config); + err = config_init_hash_seed(config); if (_Py_INIT_FAILED(err)) { return err; } @@ -1174,24 +1233,16 @@ config_init_pycache_prefix(_PyCoreConfig *config) } } else { - // -X pycache_prefix= can cancel the env var + // PYTHONPYCACHEPREFIX env var ignored + // if "-X pycache_prefix=" option is used config->pycache_prefix = NULL; } + return _Py_INIT_OK(); } - else { - wchar_t *env; - int res = _PyCoreConfig_GetEnvDup(config, &env, - L"PYTHONPYCACHEPREFIX", - "PYTHONPYCACHEPREFIX"); - if (res < 0) { - return DECODE_LOCALE_ERR("PYTHONPYCACHEPREFIX", res); - } - if (env) { - config->pycache_prefix = env; - } - } - return _Py_INIT_OK(); + return CONFIG_GET_ENV_DUP(config, &config->pycache_prefix, + L"PYTHONPYCACHEPREFIX", + "PYTHONPYCACHEPREFIX"); } @@ -1270,11 +1321,9 @@ config_get_locale_encoding(char **locale_encoding) "nl_langinfo(CODESET) failed"); } #endif - *locale_encoding = _PyMem_RawStrdup(encoding); - if (*locale_encoding == NULL) { - return _Py_INIT_NO_MEMORY(); - } - return _Py_INIT_OK(); + + assert(*locale_encoding == NULL); + return _PyCoreConfig_SetString(locale_encoding, encoding); } @@ -1282,19 +1331,23 @@ static _PyInitError config_init_stdio_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) { + _PyInitError err; + /* If Py_SetStandardStreamEncoding() have been called, use these parameters. */ if (config->stdio_encoding == NULL && _Py_StandardStreamEncoding != NULL) { - config->stdio_encoding = _PyMem_RawStrdup(_Py_StandardStreamEncoding); - if (config->stdio_encoding == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetString(&config->stdio_encoding, + _Py_StandardStreamEncoding); + if (_Py_INIT_FAILED(err)) { + return err; } } if (config->stdio_errors == NULL && _Py_StandardStreamErrors != NULL) { - config->stdio_errors = _PyMem_RawStrdup(_Py_StandardStreamErrors); - if (config->stdio_errors == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetString(&config->stdio_errors, + _Py_StandardStreamErrors); + if (_Py_INIT_FAILED(err)) { + return err; } } @@ -1305,27 +1358,30 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* PYTHONIOENCODING environment variable */ const char *opt = _PyCoreConfig_GetEnv(config, "PYTHONIOENCODING"); if (opt) { - char *pythonioencoding = _PyMem_RawStrdup(opt); - if (pythonioencoding == NULL) { - return _Py_INIT_NO_MEMORY(); + /* _PyCoreConfig_SetString() requires dest to be initialized to NULL */ + char *pythonioencoding = NULL; + err = _PyCoreConfig_SetString(&pythonioencoding, opt); + if (_Py_INIT_FAILED(err)) { + return err; } - char *err = strchr(pythonioencoding, ':'); - if (err) { - *err = '\0'; - err++; - if (!err[0]) { - err = NULL; + char *errors = strchr(pythonioencoding, ':'); + if (errors) { + *errors = '\0'; + errors++; + if (!errors[0]) { + errors = NULL; } } /* Does PYTHONIOENCODING contain an encoding? */ if (pythonioencoding[0]) { if (config->stdio_encoding == NULL) { - config->stdio_encoding = _PyMem_RawStrdup(pythonioencoding); - if (config->stdio_encoding == NULL) { + err = _PyCoreConfig_SetString(&config->stdio_encoding, + pythonioencoding); + if (_Py_INIT_FAILED(err)) { PyMem_RawFree(pythonioencoding); - return _Py_INIT_NO_MEMORY(); + return err; } } @@ -1333,16 +1389,16 @@ config_init_stdio_encoding(_PyCoreConfig *config, use "strict" error handler by default. PYTHONIOENCODING=latin1 behaves as PYTHONIOENCODING=latin1:strict. */ - if (!err) { - err = "strict"; + if (!errors) { + errors = "strict"; } } - if (config->stdio_errors == NULL && err != NULL) { - config->stdio_errors = _PyMem_RawStrdup(err); - if (config->stdio_errors == NULL) { + if (config->stdio_errors == NULL && errors != NULL) { + err = _PyCoreConfig_SetString(&config->stdio_errors, errors); + if (_Py_INIT_FAILED(err)) { PyMem_RawFree(pythonioencoding); - return _Py_INIT_NO_MEMORY(); + return err; } } @@ -1352,31 +1408,35 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* UTF-8 Mode uses UTF-8/surrogateescape */ if (preconfig->utf8_mode) { if (config->stdio_encoding == NULL) { - config->stdio_encoding = _PyMem_RawStrdup("utf-8"); - if (config->stdio_encoding == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetString(&config->stdio_encoding, + "utf-8"); + if (_Py_INIT_FAILED(err)) { + return err; } } if (config->stdio_errors == NULL) { - config->stdio_errors = _PyMem_RawStrdup("surrogateescape"); - if (config->stdio_errors == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetString(&config->stdio_errors, + "surrogateescape"); + if (_Py_INIT_FAILED(err)) { + return err; } } } /* Choose the default error handler based on the current locale. */ if (config->stdio_encoding == NULL) { - _PyInitError err = config_get_locale_encoding(&config->stdio_encoding); + err = config_get_locale_encoding(&config->stdio_encoding); if (_Py_INIT_FAILED(err)) { return err; } } if (config->stdio_errors == NULL) { const char *errors = config_get_stdio_errors(config); - config->stdio_errors = _PyMem_RawStrdup(errors); - if (config->stdio_errors == NULL) { - return _Py_INIT_NO_MEMORY(); + assert(errors != NULL); + + err = _PyCoreConfig_SetString(&config->stdio_errors, errors); + if (_Py_INIT_FAILED(err)) { + return err; } } @@ -1387,19 +1447,23 @@ config_init_stdio_encoding(_PyCoreConfig *config, static _PyInitError config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) { + _PyInitError err; + #ifdef MS_WINDOWS if (preconfig->legacy_windows_fs_encoding) { /* Legacy Windows filesystem encoding: mbcs/replace */ if (config->filesystem_encoding == NULL) { - config->filesystem_encoding = _PyMem_RawStrdup("mbcs"); - if (config->filesystem_encoding == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetString(&config->filesystem_encoding, + "mbcs"); + if (_Py_INIT_FAILED(err)) { + return err; } } if (config->filesystem_errors == NULL) { - config->filesystem_errors = _PyMem_RawStrdup("replace"); - if (config->filesystem_errors == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetString(&config->filesystem_errors, + "replace"); + if (_Py_INIT_FAILED(err)) { + return err; } } } @@ -1409,51 +1473,54 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) Note: UTF-8 Mode takes the same code path and the Legacy Windows FS encoding has the priortiy over UTF-8 Mode. */ if (config->filesystem_encoding == NULL) { - config->filesystem_encoding = _PyMem_RawStrdup("utf-8"); - if (config->filesystem_encoding == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetString(&config->filesystem_encoding, + "utf-8"); + if (_Py_INIT_FAILED(err)) { + return err; } } if (config->filesystem_errors == NULL) { - config->filesystem_errors = _PyMem_RawStrdup("surrogatepass"); - if (config->filesystem_errors == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetString(&config->filesystem_errors, + "surrogatepass"); + if (_Py_INIT_FAILED(err)) { + return err; } } #else if (config->filesystem_encoding == NULL) { if (preconfig->utf8_mode) { /* UTF-8 Mode use: utf-8/surrogateescape */ - config->filesystem_encoding = _PyMem_RawStrdup("utf-8"); + err = _PyCoreConfig_SetString(&config->filesystem_encoding, + "utf-8"); /* errors defaults to surrogateescape above */ } else if (_Py_GetForceASCII()) { - config->filesystem_encoding = _PyMem_RawStrdup("ascii"); + err = _PyCoreConfig_SetString(&config->filesystem_encoding, + "ascii"); } else { /* macOS and Android use UTF-8, other platforms use the locale encoding. */ #if defined(__APPLE__) || defined(__ANDROID__) - config->filesystem_encoding = _PyMem_RawStrdup("utf-8"); + err = _PyCoreConfig_SetString(&config->filesystem_encoding, + "utf-8"); #else - _PyInitError err = config_get_locale_encoding(&config->filesystem_encoding); - if (_Py_INIT_FAILED(err)) { - return err; - } + err = config_get_locale_encoding(&config->filesystem_encoding); #endif } - if (config->filesystem_encoding == NULL) { - return _Py_INIT_NO_MEMORY(); + if (_Py_INIT_FAILED(err)) { + return err; } } if (config->filesystem_errors == NULL) { /* by default, use the "surrogateescape" error handler */ - config->filesystem_errors = _PyMem_RawStrdup("surrogateescape"); - if (config->filesystem_errors == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_SetString(&config->filesystem_errors, + "surrogateescape"); + if (_Py_INIT_FAILED(err)) { + return err; } } #endif @@ -1828,13 +1895,16 @@ config_parse_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline, static _PyInitError config_init_env_warnoptions(const _PyCoreConfig *config, _PyWstrList *warnoptions) { - wchar_t *env; - int res = _PyCoreConfig_GetEnvDup(config, &env, - L"PYTHONWARNINGS", "PYTHONWARNINGS"); - if (res < 0) { - return DECODE_LOCALE_ERR("PYTHONWARNINGS", res); + _PyInitError err; + /* CONFIG_GET_ENV_DUP requires dest to be initialized to NULL */ + wchar_t *env = NULL; + err = CONFIG_GET_ENV_DUP(config, &env, + L"PYTHONWARNINGS", "PYTHONWARNINGS"); + if (_Py_INIT_FAILED(err)) { + return err; } + /* env var is not set or is empty */ if (env == NULL) { return _Py_INIT_OK(); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index c874a509aa55..afa683b7e841 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -472,6 +472,7 @@ _Py_Initialize_ReconfigureCore(_PyRuntimeState *runtime, PyInterpreterState **interp_p, const _PyCoreConfig *core_config) { + _PyInitError err; PyThreadState *tstate = _PyThreadState_GET(); if (!tstate) { return _Py_INIT_ERR("failed to read thread state"); @@ -485,13 +486,14 @@ _Py_Initialize_ReconfigureCore(_PyRuntimeState *runtime, _PyCoreConfig_Write(core_config, runtime); - if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_Copy(&interp->core_config, core_config); + if (_Py_INIT_FAILED(err)) { + return err; } core_config = &interp->core_config; if (core_config->_install_importlib) { - _PyInitError err = _PyCoreConfig_SetPathConfig(core_config); + err = _PyCoreConfig_SetPathConfig(core_config); if (_Py_INIT_FAILED(err)) { return err; } @@ -545,8 +547,9 @@ pycore_create_interpreter(_PyRuntimeState *runtime, } *interp_p = interp; - if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) { - return _Py_INIT_NO_MEMORY(); + _PyInitError err = _PyCoreConfig_Copy(&interp->core_config, core_config); + if (_Py_INIT_FAILED(err)) { + return err; } core_config = &interp->core_config; @@ -804,8 +807,9 @@ pyinit_coreconfig(_PyRuntimeState *runtime, _PyInitError err; if (src_config) { - if (_PyCoreConfig_Copy(config, src_config) < 0) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_Copy(config, src_config); + if (_Py_INIT_FAILED(err)) { + return err; } } @@ -1433,8 +1437,9 @@ new_interpreter(PyThreadState **tstate_p) core_config = &main_interp->core_config; } - if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) { - return _Py_INIT_NO_MEMORY(); + err = _PyCoreConfig_Copy(&interp->core_config, core_config); + if (_Py_INIT_FAILED(err)) { + return err; } core_config = &interp->core_config; From webhook-mailer at python.org Wed May 1 11:00:34 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 01 May 2019 15:00:34 -0000 Subject: [Python-checkins] bpo-36742: Fixes handling of pre-normalization characters in urlsplit() (GH-13017) Message-ID: https://github.com/python/cpython/commit/98a4dcefbbc3bce5ab07e7c0830a183157250259 commit: 98a4dcefbbc3bce5ab07e7c0830a183157250259 branch: 2.7 author: Steve Dower committer: GitHub date: 2019-05-01T15:00:27Z summary: bpo-36742: Fixes handling of pre-normalization characters in urlsplit() (GH-13017) files: A Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst M Lib/test/test_urlparse.py M Lib/urlparse.py diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 1830d0b28688..6fd1071bf7cd 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -641,6 +641,12 @@ def test_urlsplit_normalization(self): self.assertIn(u'\u2100', denorm_chars) self.assertIn(u'\uFF03', denorm_chars) + # bpo-36742: Verify port separators are ignored when they + # existed prior to decomposition + urlparse.urlsplit(u'http://\u30d5\u309a:80') + with self.assertRaises(ValueError): + urlparse.urlsplit(u'http://\u30d5\u309a\ufe1380') + for scheme in [u"http", u"https", u"ftp"]: for c in denorm_chars: url = u"{}://netloc{}false.netloc/path".format(scheme, c) diff --git a/Lib/urlparse.py b/Lib/urlparse.py index 54eda08651ab..f08e0fe58432 100644 --- a/Lib/urlparse.py +++ b/Lib/urlparse.py @@ -171,13 +171,16 @@ def _checknetloc(netloc): # looking for characters like \u2100 that expand to 'a/c' # IDNA uses NFKC equivalence, so normalize for this check import unicodedata - netloc2 = unicodedata.normalize('NFKC', netloc) - if netloc == netloc2: + n = netloc.rpartition('@')[2] # ignore anything to the left of '@' + n = n.replace(':', '') # ignore characters already included + n = n.replace('#', '') # but not the surrounding text + n = n.replace('?', '') + netloc2 = unicodedata.normalize('NFKC', n) + if n == netloc2: return - _, _, netloc = netloc.rpartition('@') # anything to the left of '@' is okay for c in '/?#@:': if c in netloc2: - raise ValueError("netloc '" + netloc2 + "' contains invalid " + + raise ValueError("netloc '" + netloc + "' contains invalid " + "characters under NFKC normalization") def urlsplit(url, scheme='', allow_fragments=True): diff --git a/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst b/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst new file mode 100644 index 000000000000..d729ed2f3cd5 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst @@ -0,0 +1 @@ +Fixes mishandling of pre-normalization characters in urlsplit(). From webhook-mailer at python.org Wed May 1 11:12:50 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Wed, 01 May 2019 15:12:50 -0000 Subject: [Python-checkins] MNT: set stacklevel in the getfullargspec deprecation warning to 2 (GH-13029) Message-ID: https://github.com/python/cpython/commit/18029d80bde1743da6900600633f0fa54d7c1044 commit: 18029d80bde1743da6900600633f0fa54d7c1044 branch: master author: Thomas A Caswell committer: Pablo Galindo date: 2019-05-01T11:12:34-04:00 summary: MNT: set stacklevel in the getfullargspec deprecation warning to 2 (GH-13029) This is consistent with the rest of the `warnings.warn` usage in the inspect.py module and aids identifying code that needs to be fixed. This warning came in via d5d2b4546939b98244708e5bb0cfccd55b99d244 files: M Lib/inspect.py diff --git a/Lib/inspect.py b/Lib/inspect.py index fffca22357a9..c460309bb5a1 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1112,7 +1112,7 @@ def getfullargspec(func): """ warnings.warn("Use inspect.signature() instead of inspect.getfullargspec()", - DeprecationWarning) + DeprecationWarning, stacklevel=2) try: # Re: `skip_bound_arg=False` # From webhook-mailer at python.org Wed May 1 13:32:23 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Wed, 01 May 2019 17:32:23 -0000 Subject: [Python-checkins] bpo-27682: Handle client connection terminations in wsgiref (GH-9713) Message-ID: https://github.com/python/cpython/commit/3d37ea25dc97e4cb024045581979570835deb13c commit: 3d37ea25dc97e4cb024045581979570835deb13c branch: master author: Petter Strandmark committer: Berker Peksag date: 2019-05-01T20:32:15+03:00 summary: bpo-27682: Handle client connection terminations in wsgiref (GH-9713) files: A Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst M Lib/test/test_wsgiref.py M Lib/wsgiref/handlers.py diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index 737dfed3a51e..46f88a94434b 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -788,6 +788,24 @@ def flush(self): b"Hello, world!", written) + def testClientConnectionTerminations(self): + environ = {"SERVER_PROTOCOL": "HTTP/1.0"} + for exception in ( + ConnectionAbortedError, + BrokenPipeError, + ConnectionResetError, + ): + with self.subTest(exception=exception): + class AbortingWriter: + def write(self, b): + raise exception + + stderr = StringIO() + h = SimpleHandler(BytesIO(), AbortingWriter(), stderr, environ) + h.run(hello_app) + + self.assertFalse(stderr.getvalue()) + if __name__ == "__main__": unittest.main() diff --git a/Lib/wsgiref/handlers.py b/Lib/wsgiref/handlers.py index 28ed9b7a6d03..834073d50091 100644 --- a/Lib/wsgiref/handlers.py +++ b/Lib/wsgiref/handlers.py @@ -136,6 +136,10 @@ def run(self, application): self.setup_environ() self.result = application(self.environ, self.start_response) self.finish_response() + except (ConnectionAbortedError, BrokenPipeError, ConnectionResetError): + # We expect the client to close the connection abruptly from time + # to time. + return except: try: self.handle_error() diff --git a/Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst b/Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst new file mode 100644 index 000000000000..7b63c05ed2be --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst @@ -0,0 +1,2 @@ +:class:`wsgiref.handlers.BaseHandler` now handles abrupt client connection +terminations gracefully. Patch by Petter Strandmark. From webhook-mailer at python.org Wed May 1 13:52:47 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Wed, 01 May 2019 17:52:47 -0000 Subject: [Python-checkins] bpo-27682: Handle client connection terminations in wsgiref (GH-9713) Message-ID: https://github.com/python/cpython/commit/47ffc1a9f6fab1c17cdcc325d4af066317369ed7 commit: 47ffc1a9f6fab1c17cdcc325d4af066317369ed7 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Berker Peksag date: 2019-05-01T20:52:40+03:00 summary: bpo-27682: Handle client connection terminations in wsgiref (GH-9713) (cherry picked from commit 3d37ea25dc97e4cb024045581979570835deb13c) Co-authored-by: Petter Strandmark files: A Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst M Lib/test/test_wsgiref.py M Lib/wsgiref/handlers.py diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index 8422b308d795..5502ece576f4 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -780,6 +780,24 @@ def flush(self): b"Hello, world!", written) + def testClientConnectionTerminations(self): + environ = {"SERVER_PROTOCOL": "HTTP/1.0"} + for exception in ( + ConnectionAbortedError, + BrokenPipeError, + ConnectionResetError, + ): + with self.subTest(exception=exception): + class AbortingWriter: + def write(self, b): + raise exception + + stderr = StringIO() + h = SimpleHandler(BytesIO(), AbortingWriter(), stderr, environ) + h.run(hello_app) + + self.assertFalse(stderr.getvalue()) + if __name__ == "__main__": unittest.main() diff --git a/Lib/wsgiref/handlers.py b/Lib/wsgiref/handlers.py index f4300b831a44..f04cef9b9d06 100644 --- a/Lib/wsgiref/handlers.py +++ b/Lib/wsgiref/handlers.py @@ -136,6 +136,10 @@ def run(self, application): self.setup_environ() self.result = application(self.environ, self.start_response) self.finish_response() + except (ConnectionAbortedError, BrokenPipeError, ConnectionResetError): + # We expect the client to close the connection abruptly from time + # to time. + return except: try: self.handle_error() diff --git a/Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst b/Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst new file mode 100644 index 000000000000..7b63c05ed2be --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst @@ -0,0 +1,2 @@ +:class:`wsgiref.handlers.BaseHandler` now handles abrupt client connection +terminations gracefully. Patch by Petter Strandmark. From webhook-mailer at python.org Wed May 1 15:21:01 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Wed, 01 May 2019 19:21:01 -0000 Subject: [Python-checkins] bpo-36673: Implement comment/PI parsing support for the TreeBuilder in ElementTree. (#12883) Message-ID: https://github.com/python/cpython/commit/43851a202cabce1e6be699e7177735c778b6697e commit: 43851a202cabce1e6be699e7177735c778b6697e branch: master author: Stefan Behnel committer: GitHub date: 2019-05-01T21:20:38+02:00 summary: bpo-36673: Implement comment/PI parsing support for the TreeBuilder in ElementTree. (#12883) * bpo-36673: Implement comment/PI parsing support for the TreeBuilder in ElementTree. * bpo-36673: Rewrite the comment/PI factory handling for the TreeBuilder in "_elementtree" to make it use the same factories as the ElementTree module, and to make it explicit when the comments/PIs are inserted into the tree and when they are not (which is the default). files: A Misc/NEWS.d/next/Library/2019-04-20-09-50-32.bpo-36673.XF4Egb.rst M Doc/library/xml.etree.elementtree.rst M Lib/test/test_xml_etree.py M Lib/xml/etree/ElementTree.py M Modules/_elementtree.c M Modules/clinic/_elementtree.c.h diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 9e2c295867ca..c9e04c2fc8fc 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -523,8 +523,9 @@ Functions Parses an XML section into an element tree incrementally, and reports what's going on to the user. *source* is a filename or :term:`file object` containing XML data. *events* is a sequence of events to report back. The - supported events are the strings ``"start"``, ``"end"``, ``"start-ns"`` and - ``"end-ns"`` (the "ns" events are used to get detailed namespace + supported events are the strings ``"start"``, ``"end"``, ``"comment"``, + ``"pi"``, ``"start-ns"`` and ``"end-ns"`` + (the "ns" events are used to get detailed namespace information). If *events* is omitted, only ``"end"`` events are reported. *parser* is an optional parser instance. If not given, the standard :class:`XMLParser` parser is used. *parser* must be a subclass of @@ -549,6 +550,10 @@ Functions .. deprecated:: 3.4 The *parser* argument. + .. versionchanged:: 3.8 + The ``comment`` and ``pi`` events were added. + + .. function:: parse(source, parser=None) Parses an XML section into an element tree. *source* is a filename or file @@ -1021,14 +1026,24 @@ TreeBuilder Objects ^^^^^^^^^^^^^^^^^^^ -.. class:: TreeBuilder(element_factory=None) +.. class:: TreeBuilder(element_factory=None, *, comment_factory=None, \ + pi_factory=None, insert_comments=False, insert_pis=False) Generic element structure builder. This builder converts a sequence of - start, data, and end method calls to a well-formed element structure. You - can use this class to build an element structure using a custom XML parser, - or a parser for some other XML-like format. *element_factory*, when given, - must be a callable accepting two positional arguments: a tag and - a dict of attributes. It is expected to return a new element instance. + start, data, end, comment and pi method calls to a well-formed element + structure. You can use this class to build an element structure using + a custom XML parser, or a parser for some other XML-like format. + + *element_factory*, when given, must be a callable accepting two positional + arguments: a tag and a dict of attributes. It is expected to return a new + element instance. + + The *comment_factory* and *pi_factory* functions, when given, should behave + like the :func:`Comment` and :func:`ProcessingInstruction` functions to + create comments and processing instructions. When not given, the default + factories will be used. When *insert_comments* and/or *insert_pis* is true, + comments/pis will be inserted into the tree if they appear within the root + element (but not outside of it). .. method:: close() @@ -1054,6 +1069,22 @@ TreeBuilder Objects containing element attributes. Returns the opened element. + .. method:: comment(text) + + Creates a comment with the given *text*. If ``insert_comments`` is true, + this will also add it to the tree. + + .. versionadded:: 3.8 + + + .. method:: pi(target, text) + + Creates a comment with the given *target* name and *text*. If + ``insert_pis`` is true, this will also add it to the tree. + + .. versionadded:: 3.8 + + In addition, a custom :class:`TreeBuilder` object can provide the following method: @@ -1150,9 +1181,9 @@ XMLPullParser Objects callback target, :class:`XMLPullParser` collects an internal list of parsing events and lets the user read from it. *events* is a sequence of events to report back. The supported events are the strings ``"start"``, ``"end"``, - ``"start-ns"`` and ``"end-ns"`` (the "ns" events are used to get detailed - namespace information). If *events* is omitted, only ``"end"`` events are - reported. + ``"comment"``, ``"pi"``, ``"start-ns"`` and ``"end-ns"`` (the "ns" events + are used to get detailed namespace information). If *events* is omitted, + only ``"end"`` events are reported. .. method:: feed(data) @@ -1171,7 +1202,13 @@ XMLPullParser Objects data fed to the parser. The iterator yields ``(event, elem)`` pairs, where *event* is a string representing the type of event (e.g. ``"end"``) and *elem* is the - encountered :class:`Element` object. + encountered :class:`Element` object, or other context value as follows. + + * ``start``, ``end``: the current Element. + * ``comment``, ``pi``: the current comment / processing instruction + * ``start-ns``: a tuple ``(prefix, uri)`` naming the declared namespace + mapping. + * ``end-ns``: :const:`None` (this may change in a future version) Events provided in a previous call to :meth:`read_events` will not be yielded again. Events are consumed from the internal queue only when @@ -1191,6 +1228,10 @@ XMLPullParser Objects .. versionadded:: 3.4 + .. versionchanged:: 3.8 + The ``comment`` and ``pi`` events were added. + + Exceptions ^^^^^^^^^^ diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index e0d2cb7b9952..8a228b8ccd62 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1194,6 +1194,12 @@ def _feed(self, parser, data, chunk_size=None): for i in range(0, len(data), chunk_size): parser.feed(data[i:i+chunk_size]) + def assert_events(self, parser, expected): + self.assertEqual( + [(event, (elem.tag, elem.text)) + for event, elem in parser.read_events()], + expected) + def assert_event_tags(self, parser, expected): events = parser.read_events() self.assertEqual([(action, elem.tag) for action, elem in events], @@ -1276,8 +1282,10 @@ def test_events(self): self.assert_event_tags(parser, []) parser = ET.XMLPullParser(events=('start', 'end')) - self._feed(parser, "\n") - self.assert_event_tags(parser, []) + self._feed(parser, "\n") + self.assert_events(parser, []) + + parser = ET.XMLPullParser(events=('start', 'end')) self._feed(parser, "\n") self.assert_event_tags(parser, [('start', 'root')]) self._feed(parser, "text") self.assertIsNone(parser.close()) + def test_events_comment(self): + parser = ET.XMLPullParser(events=('start', 'comment', 'end')) + self._feed(parser, "\n") + self.assert_events(parser, [('comment', (ET.Comment, ' text here '))]) + self._feed(parser, "\n") + self.assert_events(parser, [('comment', (ET.Comment, ' more text here '))]) + self._feed(parser, "text") + self.assert_event_tags(parser, [('start', 'root-tag')]) + self._feed(parser, "\n") + self.assert_events(parser, [('comment', (ET.Comment, ' inner comment'))]) + self._feed(parser, "\n") + self.assert_event_tags(parser, [('end', 'root-tag')]) + self._feed(parser, "\n") + self.assert_events(parser, [('comment', (ET.Comment, ' outer comment '))]) + + parser = ET.XMLPullParser(events=('comment',)) + self._feed(parser, "\n") + self.assert_events(parser, [('comment', (ET.Comment, ' text here '))]) + + def test_events_pi(self): + parser = ET.XMLPullParser(events=('start', 'pi', 'end')) + self._feed(parser, "\n") + self.assert_events(parser, [('pi', (ET.PI, 'pitarget'))]) + parser = ET.XMLPullParser(events=('pi',)) + self._feed(parser, "\n") + self.assert_events(parser, [('pi', (ET.PI, 'pitarget some text '))]) + def test_events_sequence(self): # Test that events can be some sequence that's not just a tuple or list eventset = {'end', 'start'} @@ -1333,7 +1368,6 @@ def __next__(self): self._feed(parser, "bar") self.assert_event_tags(parser, [('start', 'foo'), ('end', 'foo')]) - def test_unknown_event(self): with self.assertRaises(ValueError): ET.XMLPullParser(events=('start', 'end', 'bogus')) @@ -2741,6 +2775,33 @@ class DummyBuilder(BaseDummyBuilder): parser.feed(self.sample1) self.assertIsNone(parser.close()) + def test_treebuilder_comment(self): + b = ET.TreeBuilder() + self.assertEqual(b.comment('ctext').tag, ET.Comment) + self.assertEqual(b.comment('ctext').text, 'ctext') + + b = ET.TreeBuilder(comment_factory=ET.Comment) + self.assertEqual(b.comment('ctext').tag, ET.Comment) + self.assertEqual(b.comment('ctext').text, 'ctext') + + b = ET.TreeBuilder(comment_factory=len) + self.assertEqual(b.comment('ctext'), len('ctext')) + + def test_treebuilder_pi(self): + b = ET.TreeBuilder() + self.assertEqual(b.pi('target', None).tag, ET.PI) + self.assertEqual(b.pi('target', None).text, 'target') + + b = ET.TreeBuilder(pi_factory=ET.PI) + self.assertEqual(b.pi('target').tag, ET.PI) + self.assertEqual(b.pi('target').text, "target") + self.assertEqual(b.pi('pitarget', ' text ').tag, ET.PI) + self.assertEqual(b.pi('pitarget', ' text ').text, "pitarget text ") + + b = ET.TreeBuilder(pi_factory=lambda target, text: (len(target), text)) + self.assertEqual(b.pi('target'), (len('target'), None)) + self.assertEqual(b.pi('pitarget', ' text '), (len('pitarget'), ' text ')) + def test_treebuilder_elementfactory_none(self): parser = ET.XMLParser(target=ET.TreeBuilder(element_factory=None)) parser.feed(self.sample1) @@ -2761,6 +2822,21 @@ def foobar(self, x): e = parser.close() self._check_sample1_element(e) + def test_subclass_comment_pi(self): + class MyTreeBuilder(ET.TreeBuilder): + def foobar(self, x): + return x * 2 + + tb = MyTreeBuilder(comment_factory=ET.Comment, pi_factory=ET.PI) + self.assertEqual(tb.foobar(10), 20) + + parser = ET.XMLParser(target=tb) + parser.feed(self.sample1) + parser.feed('') + + e = parser.close() + self._check_sample1_element(e) + def test_element_factory(self): lst = [] def myfactory(tag, attrib): @@ -3418,6 +3494,12 @@ def test_main(module=None): # Copy the path cache (should be empty) path_cache = ElementPath._cache ElementPath._cache = path_cache.copy() + # Align the Comment/PI factories. + if hasattr(ET, '_set_factories'): + old_factories = ET._set_factories(ET.Comment, ET.PI) + else: + old_factories = None + try: support.run_unittest(*test_classes) finally: @@ -3426,6 +3508,8 @@ def test_main(module=None): nsmap.clear() nsmap.update(nsmap_copy) ElementPath._cache = path_cache + if old_factories is not None: + ET._set_factories(*old_factories) # don't interfere with subsequent tests ET = pyET = None diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index c9e2f3683502..c6400480f5b4 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -1374,12 +1374,30 @@ class TreeBuilder: *element_factory* is an optional element factory which is called to create new Element instances, as necessary. + *comment_factory* is a factory to create comments to be used instead of + the standard factory. If *insert_comments* is false (the default), + comments will not be inserted into the tree. + + *pi_factory* is a factory to create processing instructions to be used + instead of the standard factory. If *insert_pis* is false (the default), + processing instructions will not be inserted into the tree. """ - def __init__(self, element_factory=None): + def __init__(self, element_factory=None, *, + comment_factory=None, pi_factory=None, + insert_comments=False, insert_pis=False): self._data = [] # data collector self._elem = [] # element stack self._last = None # last element + self._root = None # root element self._tail = None # true if we're after an end tag + if comment_factory is None: + comment_factory = Comment + self._comment_factory = comment_factory + self.insert_comments = insert_comments + if pi_factory is None: + pi_factory = ProcessingInstruction + self._pi_factory = pi_factory + self.insert_pis = insert_pis if element_factory is None: element_factory = Element self._factory = element_factory @@ -1387,8 +1405,8 @@ def __init__(self, element_factory=None): def close(self): """Flush builder buffers and return toplevel document Element.""" assert len(self._elem) == 0, "missing end tags" - assert self._last is not None, "missing toplevel element" - return self._last + assert self._root is not None, "missing toplevel element" + return self._root def _flush(self): if self._data: @@ -1417,6 +1435,8 @@ def start(self, tag, attrs): self._last = elem = self._factory(tag, attrs) if self._elem: self._elem[-1].append(elem) + elif self._root is None: + self._root = elem self._elem.append(elem) self._tail = 0 return elem @@ -1435,6 +1455,33 @@ def end(self, tag): self._tail = 1 return self._last + def comment(self, text): + """Create a comment using the comment_factory. + + *text* is the text of the comment. + """ + return self._handle_single( + self._comment_factory, self.insert_comments, text) + + def pi(self, target, text=None): + """Create a processing instruction using the pi_factory. + + *target* is the target name of the processing instruction. + *text* is the data of the processing instruction, or ''. + """ + return self._handle_single( + self._pi_factory, self.insert_pis, target, text) + + def _handle_single(self, factory, insert, *args): + elem = factory(*args) + if insert: + self._flush() + self._last = elem + if self._elem: + self._elem[-1].append(elem) + self._tail = 1 + return elem + # also see ElementTree and TreeBuilder class XMLParser: @@ -1519,6 +1566,15 @@ def handler(prefix, uri, event=event_name, append=append): def handler(prefix, event=event_name, append=append): append((event, None)) parser.EndNamespaceDeclHandler = handler + elif event_name == 'comment': + def handler(text, event=event_name, append=append, self=self): + append((event, self.target.comment(text))) + parser.CommentHandler = handler + elif event_name == 'pi': + def handler(pi_target, data, event=event_name, append=append, + self=self): + append((event, self.target.pi(pi_target, data))) + parser.ProcessingInstructionHandler = handler else: raise ValueError("unknown event %r" % event_name) @@ -1640,7 +1696,10 @@ def close(self): # (see tests) _Element_Py = Element - # Element, SubElement, ParseError, TreeBuilder, XMLParser + # Element, SubElement, ParseError, TreeBuilder, XMLParser, _set_factories from _elementtree import * + from _elementtree import _set_factories except ImportError: pass +else: + _set_factories(Comment, ProcessingInstruction) diff --git a/Misc/NEWS.d/next/Library/2019-04-20-09-50-32.bpo-36673.XF4Egb.rst b/Misc/NEWS.d/next/Library/2019-04-20-09-50-32.bpo-36673.XF4Egb.rst new file mode 100644 index 000000000000..76bf914e22b1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-20-09-50-32.bpo-36673.XF4Egb.rst @@ -0,0 +1,3 @@ +The TreeBuilder and XMLPullParser in xml.etree.ElementTree gained support +for parsing comments and processing instructions. +Patch by Stefan Behnel. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 1e58cd05b512..5481c6167871 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -92,6 +92,8 @@ typedef struct { PyObject *parseerror_obj; PyObject *deepcopy_obj; PyObject *elementpath_obj; + PyObject *comment_factory; + PyObject *pi_factory; } elementtreestate; static struct PyModuleDef elementtreemodule; @@ -114,6 +116,8 @@ elementtree_clear(PyObject *m) Py_CLEAR(st->parseerror_obj); Py_CLEAR(st->deepcopy_obj); Py_CLEAR(st->elementpath_obj); + Py_CLEAR(st->comment_factory); + Py_CLEAR(st->pi_factory); return 0; } @@ -124,6 +128,8 @@ elementtree_traverse(PyObject *m, visitproc visit, void *arg) Py_VISIT(st->parseerror_obj); Py_VISIT(st->deepcopy_obj); Py_VISIT(st->elementpath_obj); + Py_VISIT(st->comment_factory); + Py_VISIT(st->pi_factory); return 0; } @@ -2385,6 +2391,8 @@ typedef struct { Py_ssize_t index; /* current stack size (0 means empty) */ PyObject *element_factory; + PyObject *comment_factory; + PyObject *pi_factory; /* element tracing */ PyObject *events_append; /* the append method of the list of events, or NULL */ @@ -2392,6 +2400,11 @@ typedef struct { PyObject *end_event_obj; PyObject *start_ns_event_obj; PyObject *end_ns_event_obj; + PyObject *comment_event_obj; + PyObject *pi_event_obj; + + char insert_comments; + char insert_pis; } TreeBuilderObject; #define TreeBuilder_CheckExact(op) (Py_TYPE(op) == &TreeBuilder_Type) @@ -2413,6 +2426,8 @@ treebuilder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) t->data = NULL; t->element_factory = NULL; + t->comment_factory = NULL; + t->pi_factory = NULL; t->stack = PyList_New(20); if (!t->stack) { Py_DECREF(t->this); @@ -2425,6 +2440,8 @@ treebuilder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) t->events_append = NULL; t->start_event_obj = t->end_event_obj = NULL; t->start_ns_event_obj = t->end_ns_event_obj = NULL; + t->comment_event_obj = t->pi_event_obj = NULL; + t->insert_comments = t->insert_pis = 0; } return (PyObject *)t; } @@ -2433,17 +2450,53 @@ treebuilder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) _elementtree.TreeBuilder.__init__ element_factory: object = NULL + * + comment_factory: object = NULL + pi_factory: object = NULL + insert_comments: bool = False + insert_pis: bool = False [clinic start generated code]*/ static int _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self, - PyObject *element_factory) -/*[clinic end generated code: output=91cfa7558970ee96 input=1b424eeefc35249c]*/ + PyObject *element_factory, + PyObject *comment_factory, + PyObject *pi_factory, + int insert_comments, int insert_pis) +/*[clinic end generated code: output=8571d4dcadfdf952 input=1f967b5c245e0a71]*/ { - if (element_factory) { + if (element_factory && element_factory != Py_None) { Py_INCREF(element_factory); Py_XSETREF(self->element_factory, element_factory); + } else { + Py_CLEAR(self->element_factory); + } + + if (!comment_factory || comment_factory == Py_None) { + elementtreestate *st = ET_STATE_GLOBAL; + comment_factory = st->comment_factory; + } + if (comment_factory) { + Py_INCREF(comment_factory); + Py_XSETREF(self->comment_factory, comment_factory); + self->insert_comments = insert_comments; + } else { + Py_CLEAR(self->comment_factory); + self->insert_comments = 0; + } + + if (!pi_factory || pi_factory == Py_None) { + elementtreestate *st = ET_STATE_GLOBAL; + pi_factory = st->pi_factory; + } + if (pi_factory) { + Py_INCREF(pi_factory); + Py_XSETREF(self->pi_factory, pi_factory); + self->insert_pis = insert_pis; + } else { + Py_CLEAR(self->pi_factory); + self->insert_pis = 0; } return 0; @@ -2452,6 +2505,8 @@ _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self, static int treebuilder_gc_traverse(TreeBuilderObject *self, visitproc visit, void *arg) { + Py_VISIT(self->pi_event_obj); + Py_VISIT(self->comment_event_obj); Py_VISIT(self->end_ns_event_obj); Py_VISIT(self->start_ns_event_obj); Py_VISIT(self->end_event_obj); @@ -2462,6 +2517,8 @@ treebuilder_gc_traverse(TreeBuilderObject *self, visitproc visit, void *arg) Py_VISIT(self->last); Py_VISIT(self->data); Py_VISIT(self->stack); + Py_VISIT(self->pi_factory); + Py_VISIT(self->comment_factory); Py_VISIT(self->element_factory); return 0; } @@ -2469,6 +2526,8 @@ treebuilder_gc_traverse(TreeBuilderObject *self, visitproc visit, void *arg) static int treebuilder_gc_clear(TreeBuilderObject *self) { + Py_CLEAR(self->pi_event_obj); + Py_CLEAR(self->comment_event_obj); Py_CLEAR(self->end_ns_event_obj); Py_CLEAR(self->start_ns_event_obj); Py_CLEAR(self->end_event_obj); @@ -2478,6 +2537,8 @@ treebuilder_gc_clear(TreeBuilderObject *self) Py_CLEAR(self->data); Py_CLEAR(self->last); Py_CLEAR(self->this); + Py_CLEAR(self->pi_factory); + Py_CLEAR(self->comment_factory); Py_CLEAR(self->element_factory); Py_CLEAR(self->root); return 0; @@ -2494,6 +2555,57 @@ treebuilder_dealloc(TreeBuilderObject *self) /* -------------------------------------------------------------------- */ /* helpers for handling of arbitrary element-like objects */ +/*[clinic input] +_elementtree._set_factories + + comment_factory: object + pi_factory: object + / + +Change the factories used to create comments and processing instructions. + +For internal use only. +[clinic start generated code]*/ + +static PyObject * +_elementtree__set_factories_impl(PyObject *module, PyObject *comment_factory, + PyObject *pi_factory) +/*[clinic end generated code: output=813b408adee26535 input=99d17627aea7fb3b]*/ +{ + elementtreestate *st = ET_STATE_GLOBAL; + PyObject *old; + + if (!PyCallable_Check(comment_factory) && comment_factory != Py_None) { + PyErr_Format(PyExc_TypeError, "Comment factory must be callable, not %.100s", + Py_TYPE(comment_factory)->tp_name); + return NULL; + } + if (!PyCallable_Check(pi_factory) && pi_factory != Py_None) { + PyErr_Format(PyExc_TypeError, "PI factory must be callable, not %.100s", + Py_TYPE(pi_factory)->tp_name); + return NULL; + } + + old = PyTuple_Pack(2, + st->comment_factory ? st->comment_factory : Py_None, + st->pi_factory ? st->pi_factory : Py_None); + + if (comment_factory == Py_None) { + Py_CLEAR(st->comment_factory); + } else { + Py_INCREF(comment_factory); + Py_XSETREF(st->comment_factory, comment_factory); + } + if (pi_factory == Py_None) { + Py_CLEAR(st->pi_factory); + } else { + Py_INCREF(pi_factory); + Py_XSETREF(st->pi_factory, pi_factory); + } + + return old; +} + static int treebuilder_set_element_text_or_tail(PyObject *element, PyObject **data, PyObject **dest, _Py_Identifier *name) @@ -2569,7 +2681,7 @@ treebuilder_append_event(TreeBuilderObject *self, PyObject *action, PyObject *event = PyTuple_Pack(2, action, node); if (event == NULL) return -1; - res = PyObject_CallFunctionObjArgs(self->events_append, event, NULL); + res = _PyObject_FastCall(self->events_append, &event, 1); Py_DECREF(event); if (res == NULL) return -1; @@ -2593,7 +2705,7 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, return NULL; } - if (!self->element_factory || self->element_factory == Py_None) { + if (!self->element_factory) { node = create_new_element(tag, attrib); } else if (attrib == Py_None) { attrib = PyDict_New(); @@ -2721,6 +2833,84 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) return (PyObject*) self->last; } +LOCAL(PyObject*) +treebuilder_handle_comment(TreeBuilderObject* self, PyObject* text) +{ + PyObject* comment = NULL; + PyObject* this; + + if (treebuilder_flush_data(self) < 0) { + return NULL; + } + + if (self->comment_factory) { + comment = _PyObject_FastCall(self->comment_factory, &text, 1); + if (!comment) + return NULL; + + this = self->this; + if (self->insert_comments && this != Py_None) { + if (treebuilder_add_subelement(this, comment) < 0) + goto error; + } + } else { + Py_INCREF(text); + comment = text; + } + + if (self->events_append && self->comment_event_obj) { + if (treebuilder_append_event(self, self->comment_event_obj, comment) < 0) + goto error; + } + + return comment; + + error: + Py_DECREF(comment); + return NULL; +} + +LOCAL(PyObject*) +treebuilder_handle_pi(TreeBuilderObject* self, PyObject* target, PyObject* text) +{ + PyObject* pi = NULL; + PyObject* this; + PyObject* stack[2] = {target, text}; + + if (treebuilder_flush_data(self) < 0) { + return NULL; + } + + if (self->pi_factory) { + pi = _PyObject_FastCall(self->pi_factory, stack, 2); + if (!pi) { + return NULL; + } + + this = self->this; + if (self->insert_pis && this != Py_None) { + if (treebuilder_add_subelement(this, pi) < 0) + goto error; + } + } else { + pi = PyTuple_Pack(2, target, text); + if (!pi) { + return NULL; + } + } + + if (self->events_append && self->pi_event_obj) { + if (treebuilder_append_event(self, self->pi_event_obj, pi) < 0) + goto error; + } + + return pi; + + error: + Py_DECREF(pi); + return NULL; +} + /* -------------------------------------------------------------------- */ /* methods (in alphabetical order) */ @@ -2754,6 +2944,38 @@ _elementtree_TreeBuilder_end(TreeBuilderObject *self, PyObject *tag) return treebuilder_handle_end(self, tag); } +/*[clinic input] +_elementtree.TreeBuilder.comment + + text: object + / + +[clinic start generated code]*/ + +static PyObject * +_elementtree_TreeBuilder_comment(TreeBuilderObject *self, PyObject *text) +/*[clinic end generated code: output=22835be41deeaa27 input=47e7ebc48ed01dfa]*/ +{ + return treebuilder_handle_comment(self, text); +} + +/*[clinic input] +_elementtree.TreeBuilder.pi + + target: object + text: object = None + / + +[clinic start generated code]*/ + +static PyObject * +_elementtree_TreeBuilder_pi_impl(TreeBuilderObject *self, PyObject *target, + PyObject *text) +/*[clinic end generated code: output=21eb95ec9d04d1d9 input=349342bd79c35570]*/ +{ + return treebuilder_handle_pi(self, target, text); +} + LOCAL(PyObject*) treebuilder_done(TreeBuilderObject* self) { @@ -2925,7 +3147,7 @@ expat_set_error(enum XML_Error error_code, Py_ssize_t line, Py_ssize_t column, if (errmsg == NULL) return; - error = PyObject_CallFunctionObjArgs(st->parseerror_obj, errmsg, NULL); + error = _PyObject_FastCall(st->parseerror_obj, &errmsg, 1); Py_DECREF(errmsg); if (!error) return; @@ -2988,7 +3210,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in, (TreeBuilderObject*) self->target, value ); else if (self->handle_data) - res = PyObject_CallFunctionObjArgs(self->handle_data, value, NULL); + res = _PyObject_FastCall(self->handle_data, &value, 1); else res = NULL; Py_XDECREF(res); @@ -3099,7 +3321,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in, /* shortcut */ res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); else if (self->handle_data) - res = PyObject_CallFunctionObjArgs(self->handle_data, data, NULL); + res = _PyObject_FastCall(self->handle_data, &data, 1); else res = NULL; @@ -3126,7 +3348,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) else if (self->handle_end) { tag = makeuniversal(self, tag_in); if (tag) { - res = PyObject_CallFunctionObjArgs(self->handle_end, tag, NULL); + res = _PyObject_FastCall(self->handle_end, &tag, 1); Py_DECREF(tag); } } @@ -3176,21 +3398,31 @@ expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) static void expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) { - PyObject* comment; - PyObject* res; + PyObject* comment = NULL; + PyObject* res = NULL; if (PyErr_Occurred()) return; - if (self->handle_comment) { + if (TreeBuilder_CheckExact(self->target)) { + /* shortcut */ + TreeBuilderObject *target = (TreeBuilderObject*) self->target; + comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict"); - if (comment) { - res = PyObject_CallFunctionObjArgs(self->handle_comment, - comment, NULL); - Py_XDECREF(res); - Py_DECREF(comment); - } + if (!comment) + return; /* parser will look for errors */ + + res = treebuilder_handle_comment(target, comment); + } else if (self->handle_comment) { + comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict"); + if (!comment) + return; + + res = _PyObject_FastCall(self->handle_comment, &comment, 1); } + + Py_XDECREF(res); + Py_DECREF(comment); } static void @@ -3258,27 +3490,51 @@ static void expat_pi_handler(XMLParserObject* self, const XML_Char* target_in, const XML_Char* data_in) { - PyObject* target; + PyObject* pi_target = NULL; PyObject* data; PyObject* res; + PyObject* stack[2]; if (PyErr_Occurred()) return; - if (self->handle_pi) { - target = PyUnicode_DecodeUTF8(target_in, strlen(target_in), "strict"); - data = PyUnicode_DecodeUTF8(data_in, strlen(data_in), "strict"); - if (target && data) { - res = PyObject_CallFunctionObjArgs(self->handle_pi, - target, data, NULL); + if (TreeBuilder_CheckExact(self->target)) { + /* shortcut */ + TreeBuilderObject *target = (TreeBuilderObject*) self->target; + + if (target->events_append && target->pi_event_obj) { + pi_target = PyUnicode_DecodeUTF8(target_in, strlen(target_in), "strict"); + if (!pi_target) + goto error; + data = PyUnicode_DecodeUTF8(data_in, strlen(data_in), "strict"); + if (!data) + goto error; + res = treebuilder_handle_pi(target, pi_target, data); Py_XDECREF(res); Py_DECREF(data); - Py_DECREF(target); - } else { - Py_XDECREF(data); - Py_XDECREF(target); + Py_DECREF(pi_target); } + } else if (self->handle_pi) { + pi_target = PyUnicode_DecodeUTF8(target_in, strlen(target_in), "strict"); + if (!pi_target) + goto error; + data = PyUnicode_DecodeUTF8(data_in, strlen(data_in), "strict"); + if (!data) + goto error; + + stack[0] = pi_target; + stack[1] = data; + res = _PyObject_FastCall(self->handle_pi, stack, 2); + Py_XDECREF(res); + Py_DECREF(data); + Py_DECREF(pi_target); } + + return; + + error: + Py_XDECREF(pi_target); + return; } /* -------------------------------------------------------------------- */ @@ -3695,6 +3951,8 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self, Py_CLEAR(target->end_event_obj); Py_CLEAR(target->start_ns_event_obj); Py_CLEAR(target->end_ns_event_obj); + Py_CLEAR(target->comment_event_obj); + Py_CLEAR(target->pi_event_obj); if (events_to_report == Py_None) { /* default is "end" only */ @@ -3740,6 +3998,18 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self, (XML_StartNamespaceDeclHandler) expat_start_ns_handler, (XML_EndNamespaceDeclHandler) expat_end_ns_handler ); + } else if (strcmp(event_name, "comment") == 0) { + Py_XSETREF(target->comment_event_obj, event_name_obj); + EXPAT(SetCommentHandler)( + self->parser, + (XML_CommentHandler) expat_comment_handler + ); + } else if (strcmp(event_name, "pi") == 0) { + Py_XSETREF(target->pi_event_obj, event_name_obj); + EXPAT(SetProcessingInstructionHandler)( + self->parser, + (XML_ProcessingInstructionHandler) expat_pi_handler + ); } else { Py_DECREF(event_name_obj); Py_DECREF(events_seq); @@ -3882,6 +4152,8 @@ static PyMethodDef treebuilder_methods[] = { _ELEMENTTREE_TREEBUILDER_DATA_METHODDEF _ELEMENTTREE_TREEBUILDER_START_METHODDEF _ELEMENTTREE_TREEBUILDER_END_METHODDEF + _ELEMENTTREE_TREEBUILDER_COMMENT_METHODDEF + _ELEMENTTREE_TREEBUILDER_PI_METHODDEF _ELEMENTTREE_TREEBUILDER_CLOSE_METHODDEF {NULL, NULL} }; @@ -3983,6 +4255,7 @@ static PyTypeObject XMLParser_Type = { static PyMethodDef _functions[] = { {"SubElement", (PyCFunction)(void(*)(void)) subelement, METH_VARARGS | METH_KEYWORDS}, + _ELEMENTTREE__SET_FACTORIES_METHODDEF {NULL, NULL} }; diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index d239c802583c..0f55480140b3 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -635,19 +635,26 @@ _elementtree_Element_set(ElementObject *self, PyObject *const *args, Py_ssize_t static int _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self, - PyObject *element_factory); + PyObject *element_factory, + PyObject *comment_factory, + PyObject *pi_factory, + int insert_comments, int insert_pis); static int _elementtree_TreeBuilder___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; - static const char * const _keywords[] = {"element_factory", NULL}; + static const char * const _keywords[] = {"element_factory", "comment_factory", "pi_factory", "insert_comments", "insert_pis", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "TreeBuilder", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[5]; PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *element_factory = NULL; + PyObject *comment_factory = NULL; + PyObject *pi_factory = NULL; + int insert_comments = 0; + int insert_pis = 0; fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); if (!fastargs) { @@ -656,9 +663,76 @@ _elementtree_TreeBuilder___init__(PyObject *self, PyObject *args, PyObject *kwar if (!noptargs) { goto skip_optional_pos; } - element_factory = fastargs[0]; + if (fastargs[0]) { + element_factory = fastargs[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _elementtree_TreeBuilder___init___impl((TreeBuilderObject *)self, element_factory); + if (!noptargs) { + goto skip_optional_kwonly; + } + if (fastargs[1]) { + comment_factory = fastargs[1]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[2]) { + pi_factory = fastargs[2]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[3]) { + insert_comments = PyObject_IsTrue(fastargs[3]); + if (insert_comments < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + insert_pis = PyObject_IsTrue(fastargs[4]); + if (insert_pis < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _elementtree_TreeBuilder___init___impl((TreeBuilderObject *)self, element_factory, comment_factory, pi_factory, insert_comments, insert_pis); + +exit: + return return_value; +} + +PyDoc_STRVAR(_elementtree__set_factories__doc__, +"_set_factories($module, comment_factory, pi_factory, /)\n" +"--\n" +"\n" +"Change the factories used to create comments and processing instructions.\n" +"\n" +"For internal use only."); + +#define _ELEMENTTREE__SET_FACTORIES_METHODDEF \ + {"_set_factories", (PyCFunction)(void(*)(void))_elementtree__set_factories, METH_FASTCALL, _elementtree__set_factories__doc__}, + +static PyObject * +_elementtree__set_factories_impl(PyObject *module, PyObject *comment_factory, + PyObject *pi_factory); + +static PyObject * +_elementtree__set_factories(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *comment_factory; + PyObject *pi_factory; + + if (!_PyArg_CheckPositional("_set_factories", nargs, 2, 2)) { + goto exit; + } + comment_factory = args[0]; + pi_factory = args[1]; + return_value = _elementtree__set_factories_impl(module, comment_factory, pi_factory); exit: return return_value; @@ -680,6 +754,48 @@ PyDoc_STRVAR(_elementtree_TreeBuilder_end__doc__, #define _ELEMENTTREE_TREEBUILDER_END_METHODDEF \ {"end", (PyCFunction)_elementtree_TreeBuilder_end, METH_O, _elementtree_TreeBuilder_end__doc__}, +PyDoc_STRVAR(_elementtree_TreeBuilder_comment__doc__, +"comment($self, text, /)\n" +"--\n" +"\n"); + +#define _ELEMENTTREE_TREEBUILDER_COMMENT_METHODDEF \ + {"comment", (PyCFunction)_elementtree_TreeBuilder_comment, METH_O, _elementtree_TreeBuilder_comment__doc__}, + +PyDoc_STRVAR(_elementtree_TreeBuilder_pi__doc__, +"pi($self, target, text=None, /)\n" +"--\n" +"\n"); + +#define _ELEMENTTREE_TREEBUILDER_PI_METHODDEF \ + {"pi", (PyCFunction)(void(*)(void))_elementtree_TreeBuilder_pi, METH_FASTCALL, _elementtree_TreeBuilder_pi__doc__}, + +static PyObject * +_elementtree_TreeBuilder_pi_impl(TreeBuilderObject *self, PyObject *target, + PyObject *text); + +static PyObject * +_elementtree_TreeBuilder_pi(TreeBuilderObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *target; + PyObject *text = Py_None; + + if (!_PyArg_CheckPositional("pi", nargs, 1, 2)) { + goto exit; + } + target = args[0]; + if (nargs < 2) { + goto skip_optional; + } + text = args[1]; +skip_optional: + return_value = _elementtree_TreeBuilder_pi_impl(self, target, text); + +exit: + return return_value; +} + PyDoc_STRVAR(_elementtree_TreeBuilder_close__doc__, "close($self, /)\n" "--\n" @@ -853,4 +969,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=440b5d90a4b86590 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=386a68425d072b5c input=a9049054013a1b77]*/ From webhook-mailer at python.org Wed May 1 15:50:01 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Wed, 01 May 2019 19:50:01 -0000 Subject: [Python-checkins] bpo-36676: Namespace prefix aware parsing support for the ET.XMLParser target (GH-12885) Message-ID: https://github.com/python/cpython/commit/dde3eebdaa8d2c51971ca704d53af7cbcda8bb34 commit: dde3eebdaa8d2c51971ca704d53af7cbcda8bb34 branch: master author: Stefan Behnel committer: GitHub date: 2019-05-01T21:49:58+02:00 summary: bpo-36676: Namespace prefix aware parsing support for the ET.XMLParser target (GH-12885) * bpo-36676: Implement namespace prefix aware parsing support for the XMLParser target in ElementTree. files: A Misc/NEWS.d/next/Library/2019-04-20-13-10-34.bpo-36676.XF4Egb.rst M Doc/library/xml.etree.elementtree.rst M Lib/test/test_xml_etree.py M Lib/xml/etree/ElementTree.py M Modules/_elementtree.c diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index c9e04c2fc8fc..66090af00fa1 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -1086,7 +1086,7 @@ TreeBuilder Objects In addition, a custom :class:`TreeBuilder` object can provide the - following method: + following methods: .. method:: doctype(name, pubid, system) @@ -1096,6 +1096,23 @@ TreeBuilder Objects .. versionadded:: 3.2 + .. method:: start_ns(prefix, uri) + + Is called whenever the parser encounters a new namespace declaration, + before the ``start()`` callback for the opening element that defines it. + *prefix* is ``''`` for the default namespace and the declared + namespace prefix name otherwise. *uri* is the namespace URI. + + .. versionadded:: 3.8 + + .. method:: end_ns(prefix) + + Is called after the ``end()`` callback of an element that declared + a namespace prefix mapping, with the name of the *prefix* that went + out of scope. + + .. versionadded:: 3.8 + .. _elementtree-xmlparser-objects: @@ -1131,7 +1148,8 @@ XMLParser Objects :meth:`XMLParser.feed` calls *target*\'s ``start(tag, attrs_dict)`` method for each opening tag, its ``end(tag)`` method for each closing tag, and data - is processed by method ``data(data)``. :meth:`XMLParser.close` calls + is processed by method ``data(data)``. For further supported callback + methods, see the :class:`TreeBuilder` class. :meth:`XMLParser.close` calls *target*\'s method ``close()``. :class:`XMLParser` can be used not only for building a tree structure. This is an example of counting the maximum depth of an XML file:: diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 8a228b8ccd62..0abc42a173d9 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -14,12 +14,13 @@ import operator import pickle import sys +import textwrap import types import unittest import warnings import weakref -from itertools import product +from itertools import product, islice from test import support from test.support import TESTFN, findfile, import_fresh_module, gc_collect, swap_attr @@ -694,12 +695,17 @@ def pi(self, target, data): self.append(("pi", target, data)) def comment(self, data): self.append(("comment", data)) + def start_ns(self, prefix, uri): + self.append(("start-ns", prefix, uri)) + def end_ns(self, prefix): + self.append(("end-ns", prefix)) builder = Builder() parser = ET.XMLParser(target=builder) parser.feed(data) self.assertEqual(builder, [ ('pi', 'pi', 'data'), ('comment', ' comment '), + ('start-ns', '', 'namespace'), ('start', '{namespace}root'), ('start', '{namespace}element'), ('end', '{namespace}element'), @@ -708,8 +714,30 @@ def comment(self, data): ('start', '{namespace}empty-element'), ('end', '{namespace}empty-element'), ('end', '{namespace}root'), + ('end-ns', ''), ]) + def test_custom_builder_only_end_ns(self): + class Builder(list): + def end_ns(self, prefix): + self.append(("end-ns", prefix)) + + builder = Builder() + parser = ET.XMLParser(target=builder) + parser.feed(textwrap.dedent("""\ + + + + text + texttail + + + """)) + self.assertEqual(builder, [ + ('end-ns', 'a'), + ('end-ns', 'p'), + ('end-ns', ''), + ]) # Element.getchildren() and ElementTree.getiterator() are deprecated. @checkwarnings(("This method will be removed in future versions. " @@ -1194,14 +1222,19 @@ def _feed(self, parser, data, chunk_size=None): for i in range(0, len(data), chunk_size): parser.feed(data[i:i+chunk_size]) - def assert_events(self, parser, expected): + def assert_events(self, parser, expected, max_events=None): self.assertEqual( [(event, (elem.tag, elem.text)) - for event, elem in parser.read_events()], + for event, elem in islice(parser.read_events(), max_events)], expected) - def assert_event_tags(self, parser, expected): - events = parser.read_events() + def assert_event_tuples(self, parser, expected, max_events=None): + self.assertEqual( + list(islice(parser.read_events(), max_events)), + expected) + + def assert_event_tags(self, parser, expected, max_events=None): + events = islice(parser.read_events(), max_events) self.assertEqual([(action, elem.tag) for action, elem in events], expected) @@ -1276,6 +1309,56 @@ def test_ns_events(self): self.assertEqual(list(parser.read_events()), [('end-ns', None)]) self.assertIsNone(parser.close()) + def test_ns_events_start(self): + parser = ET.XMLPullParser(events=('start-ns', 'start', 'end')) + self._feed(parser, "\n") + self.assert_event_tuples(parser, [ + ('start-ns', ('', 'abc')), + ('start-ns', ('p', 'xyz')), + ], max_events=2) + self.assert_event_tags(parser, [ + ('start', '{abc}tag'), + ], max_events=1) + + self._feed(parser, "\n") + self.assert_event_tags(parser, [ + ('start', '{abc}child'), + ('end', '{abc}child'), + ]) + + self._feed(parser, "\n") + parser.close() + self.assert_event_tags(parser, [ + ('end', '{abc}tag'), + ]) + + def test_ns_events_start_end(self): + parser = ET.XMLPullParser(events=('start-ns', 'start', 'end', 'end-ns')) + self._feed(parser, "\n") + self.assert_event_tuples(parser, [ + ('start-ns', ('', 'abc')), + ('start-ns', ('p', 'xyz')), + ], max_events=2) + self.assert_event_tags(parser, [ + ('start', '{abc}tag'), + ], max_events=1) + + self._feed(parser, "\n") + self.assert_event_tags(parser, [ + ('start', '{abc}child'), + ('end', '{abc}child'), + ]) + + self._feed(parser, "\n") + parser.close() + self.assert_event_tags(parser, [ + ('end', '{abc}tag'), + ], max_events=1) + self.assert_event_tuples(parser, [ + ('end-ns', None), + ('end-ns', None), + ]) + def test_events(self): parser = ET.XMLPullParser(events=()) self._feed(parser, "\n") diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index c6400480f5b4..5b26ac72fd1a 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -1518,6 +1518,10 @@ def __init__(self, *, target=None, encoding=None): parser.StartElementHandler = self._start if hasattr(target, 'end'): parser.EndElementHandler = self._end + if hasattr(target, 'start_ns'): + parser.StartNamespaceDeclHandler = self._start_ns + if hasattr(target, 'end_ns'): + parser.EndNamespaceDeclHandler = self._end_ns if hasattr(target, 'data'): parser.CharacterDataHandler = target.data # miscellaneous callbacks @@ -1559,12 +1563,24 @@ def handler(tag, event=event_name, append=append, append((event, end(tag))) parser.EndElementHandler = handler elif event_name == "start-ns": - def handler(prefix, uri, event=event_name, append=append): - append((event, (prefix or "", uri or ""))) + # TreeBuilder does not implement .start_ns() + if hasattr(self.target, "start_ns"): + def handler(prefix, uri, event=event_name, append=append, + start_ns=self._start_ns): + append((event, start_ns(prefix, uri))) + else: + def handler(prefix, uri, event=event_name, append=append): + append((event, (prefix or '', uri or ''))) parser.StartNamespaceDeclHandler = handler elif event_name == "end-ns": - def handler(prefix, event=event_name, append=append): - append((event, None)) + # TreeBuilder does not implement .end_ns() + if hasattr(self.target, "end_ns"): + def handler(prefix, event=event_name, append=append, + end_ns=self._end_ns): + append((event, end_ns(prefix))) + else: + def handler(prefix, event=event_name, append=append): + append((event, None)) parser.EndNamespaceDeclHandler = handler elif event_name == 'comment': def handler(text, event=event_name, append=append, self=self): @@ -1595,6 +1611,12 @@ def _fixname(self, key): self._names[key] = name return name + def _start_ns(self, prefix, uri): + return self.target.start_ns(prefix or '', uri or '') + + def _end_ns(self, prefix): + return self.target.end_ns(prefix or '') + def _start(self, tag, attr_list): # Handler for expat's StartElementHandler. Since ordered_attributes # is set, the attributes are reported as a list of alternating diff --git a/Misc/NEWS.d/next/Library/2019-04-20-13-10-34.bpo-36676.XF4Egb.rst b/Misc/NEWS.d/next/Library/2019-04-20-13-10-34.bpo-36676.XF4Egb.rst new file mode 100644 index 000000000000..e0bede81eec1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-20-13-10-34.bpo-36676.XF4Egb.rst @@ -0,0 +1,3 @@ +The XMLParser() in xml.etree.ElementTree provides namespace prefix context to the +parser target if it defines the callback methods "start_ns()" and/or "end_ns()". +Patch by Stefan Behnel. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 5481c6167871..b69e3a45fe30 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2911,6 +2911,39 @@ treebuilder_handle_pi(TreeBuilderObject* self, PyObject* target, PyObject* text) return NULL; } +LOCAL(PyObject*) +treebuilder_handle_start_ns(TreeBuilderObject* self, PyObject* prefix, PyObject* uri) +{ + PyObject* parcel; + + if (self->events_append && self->start_ns_event_obj) { + parcel = PyTuple_Pack(2, prefix, uri); + if (!parcel) { + return NULL; + } + + if (treebuilder_append_event(self, self->start_ns_event_obj, parcel) < 0) { + Py_DECREF(parcel); + return NULL; + } + Py_DECREF(parcel); + } + + Py_RETURN_NONE; +} + +LOCAL(PyObject*) +treebuilder_handle_end_ns(TreeBuilderObject* self, PyObject* prefix) +{ + if (self->events_append && self->end_ns_event_obj) { + if (treebuilder_append_event(self, self->end_ns_event_obj, prefix) < 0) { + return NULL; + } + } + + Py_RETURN_NONE; +} + /* -------------------------------------------------------------------- */ /* methods (in alphabetical order) */ @@ -3046,6 +3079,8 @@ typedef struct { PyObject *names; + PyObject *handle_start_ns; + PyObject *handle_end_ns; PyObject *handle_start; PyObject *handle_data; PyObject *handle_end; @@ -3357,42 +3392,89 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) } static void -expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix, - const XML_Char *uri) +expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix_in, + const XML_Char *uri_in) { - TreeBuilderObject *target = (TreeBuilderObject*) self->target; - PyObject *parcel; + PyObject* res = NULL; + PyObject* uri; + PyObject* prefix; + PyObject* stack[2]; if (PyErr_Occurred()) return; - if (!target->events_append || !target->start_ns_event_obj) - return; + if (!uri_in) + uri_in = ""; + if (!prefix_in) + prefix_in = ""; - if (!uri) - uri = ""; - if (!prefix) - prefix = ""; + if (TreeBuilder_CheckExact(self->target)) { + /* shortcut - TreeBuilder does not actually implement .start_ns() */ + TreeBuilderObject *target = (TreeBuilderObject*) self->target; - parcel = Py_BuildValue("ss", prefix, uri); - if (!parcel) - return; - treebuilder_append_event(target, target->start_ns_event_obj, parcel); - Py_DECREF(parcel); + if (target->events_append && target->start_ns_event_obj) { + prefix = PyUnicode_DecodeUTF8(prefix_in, strlen(prefix_in), "strict"); + if (!prefix) + return; + uri = PyUnicode_DecodeUTF8(uri_in, strlen(uri_in), "strict"); + if (!uri) { + Py_DECREF(prefix); + return; + } + + res = treebuilder_handle_start_ns(target, prefix, uri); + Py_DECREF(uri); + Py_DECREF(prefix); + } + } else if (self->handle_start_ns) { + prefix = PyUnicode_DecodeUTF8(prefix_in, strlen(prefix_in), "strict"); + if (!prefix) + return; + uri = PyUnicode_DecodeUTF8(uri_in, strlen(uri_in), "strict"); + if (!uri) { + Py_DECREF(prefix); + return; + } + + stack[0] = prefix; + stack[1] = uri; + res = _PyObject_FastCall(self->handle_start_ns, stack, 2); + Py_DECREF(uri); + Py_DECREF(prefix); + } + + Py_XDECREF(res); } static void expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) { - TreeBuilderObject *target = (TreeBuilderObject*) self->target; + PyObject *res = NULL; + PyObject* prefix; if (PyErr_Occurred()) return; - if (!target->events_append) - return; + if (!prefix_in) + prefix_in = ""; + + if (TreeBuilder_CheckExact(self->target)) { + /* shortcut - TreeBuilder does not actually implement .end_ns() */ + TreeBuilderObject *target = (TreeBuilderObject*) self->target; + + if (target->events_append && target->end_ns_event_obj) { + res = treebuilder_handle_end_ns(target, Py_None); + } + } else if (self->handle_end_ns) { + prefix = PyUnicode_DecodeUTF8(prefix_in, strlen(prefix_in), "strict"); + if (!prefix) + return; + + res = _PyObject_FastCall(self->handle_end_ns, &prefix, 1); + Py_DECREF(prefix); + } - treebuilder_append_event(target, target->end_ns_event_obj, Py_None); + Py_XDECREF(res); } static void @@ -3546,6 +3628,7 @@ xmlparser_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (self) { self->parser = NULL; self->target = self->entity = self->names = NULL; + self->handle_start_ns = self->handle_end_ns = NULL; self->handle_start = self->handle_data = self->handle_end = NULL; self->handle_comment = self->handle_pi = self->handle_close = NULL; self->handle_doctype = NULL; @@ -3614,6 +3697,14 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target, } self->target = target; + self->handle_start_ns = PyObject_GetAttrString(target, "start_ns"); + if (ignore_attribute_error(self->handle_start_ns)) { + return -1; + } + self->handle_end_ns = PyObject_GetAttrString(target, "end_ns"); + if (ignore_attribute_error(self->handle_end_ns)) { + return -1; + } self->handle_start = PyObject_GetAttrString(target, "start"); if (ignore_attribute_error(self->handle_start)) { return -1; @@ -3645,6 +3736,12 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target, /* configure parser */ EXPAT(SetUserData)(self->parser, self); + if (self->handle_start_ns || self->handle_end_ns) + EXPAT(SetNamespaceDeclHandler)( + self->parser, + (XML_StartNamespaceDeclHandler) expat_start_ns_handler, + (XML_EndNamespaceDeclHandler) expat_end_ns_handler + ); EXPAT(SetElementHandler)( self->parser, (XML_StartElementHandler) expat_start_handler, @@ -3689,6 +3786,9 @@ xmlparser_gc_traverse(XMLParserObject *self, visitproc visit, void *arg) Py_VISIT(self->handle_end); Py_VISIT(self->handle_data); Py_VISIT(self->handle_start); + Py_VISIT(self->handle_start_ns); + Py_VISIT(self->handle_end_ns); + Py_VISIT(self->handle_doctype); Py_VISIT(self->target); Py_VISIT(self->entity); @@ -3712,6 +3812,8 @@ xmlparser_gc_clear(XMLParserObject *self) Py_CLEAR(self->handle_end); Py_CLEAR(self->handle_data); Py_CLEAR(self->handle_start); + Py_CLEAR(self->handle_start_ns); + Py_CLEAR(self->handle_end_ns); Py_CLEAR(self->handle_doctype); Py_CLEAR(self->target); From webhook-mailer at python.org Wed May 1 16:08:24 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Wed, 01 May 2019 20:08:24 -0000 Subject: [Python-checkins] Namespace packages _bootstrap.ModuleSpec.loader attributes are no longer None (#10376) Message-ID: https://github.com/python/cpython/commit/ee88af3f4f7493df4ecf52faf429e63351bbcd5c commit: ee88af3f4f7493df4ecf52faf429e63351bbcd5c branch: master author: G?ry Ogam committer: Barry Warsaw date: 2019-05-01T13:08:17-07:00 summary: Namespace packages _bootstrap.ModuleSpec.loader attributes are no longer None (#10376) Namespace packages _bootstrap.ModuleSpec.loader attributes are no longer `None` _after_ calling the importlib._bootstrap._init_module_attrs function. See: * https://stackoverflow.com/questions/52869541/namespace-package-spec-loader-and-loader-attributes-not-set-to-none * https://bugs.python.org/issue35181 files: M Doc/reference/import.rst diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 88290c88bb35..0228bfb7e984 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -345,12 +345,11 @@ of what happens during the loading portion of import:: _init_module_attrs(spec, module) if spec.loader is None: - if spec.submodule_search_locations is not None: - # namespace package - sys.modules[spec.name] = module - else: - # unsupported - raise ImportError + # unsupported + raise ImportError + if spec.origin is None and spec.submodule_search_locations is not None: + # namespace package + sys.modules[spec.name] = module elif not hasattr(spec.loader, 'exec_module'): module = spec.loader.load_module(spec.name) # Set __loader__ and __package__ if missing. From webhook-mailer at python.org Wed May 1 16:34:21 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Wed, 01 May 2019 20:34:21 -0000 Subject: [Python-checkins] bpo-13611: C14N 2.0 implementation for ElementTree (GH-12966) Message-ID: https://github.com/python/cpython/commit/e1d5dd645d5f59867cb0ad63179110f310cbca89 commit: e1d5dd645d5f59867cb0ad63179110f310cbca89 branch: master author: Stefan Behnel committer: GitHub date: 2019-05-01T22:34:13+02:00 summary: bpo-13611: C14N 2.0 implementation for ElementTree (GH-12966) * Implement C14N 2.0 as a new canonicalize() function in ElementTree. Missing features: - prefix renaming in XPath expressions (tag and attribute text is supported) - preservation of original prefixes given redundant namespace declarations files: A Lib/test/xmltestdata/c14n-20/c14nComment.xml A Lib/test/xmltestdata/c14n-20/c14nDefault.xml A Lib/test/xmltestdata/c14n-20/c14nPrefix.xml A Lib/test/xmltestdata/c14n-20/c14nPrefixQname.xml A Lib/test/xmltestdata/c14n-20/c14nPrefixQnameXpathElem.xml A Lib/test/xmltestdata/c14n-20/c14nQname.xml A Lib/test/xmltestdata/c14n-20/c14nQnameElem.xml A Lib/test/xmltestdata/c14n-20/c14nQnameXpathElem.xml A Lib/test/xmltestdata/c14n-20/c14nTrim.xml A Lib/test/xmltestdata/c14n-20/doc.dtd A Lib/test/xmltestdata/c14n-20/doc.xsl A Lib/test/xmltestdata/c14n-20/inC14N1.xml A Lib/test/xmltestdata/c14n-20/inC14N2.xml A Lib/test/xmltestdata/c14n-20/inC14N3.xml A Lib/test/xmltestdata/c14n-20/inC14N4.xml A Lib/test/xmltestdata/c14n-20/inC14N5.xml A Lib/test/xmltestdata/c14n-20/inC14N6.xml A Lib/test/xmltestdata/c14n-20/inNsContent.xml A Lib/test/xmltestdata/c14n-20/inNsDefault.xml A Lib/test/xmltestdata/c14n-20/inNsPushdown.xml A Lib/test/xmltestdata/c14n-20/inNsRedecl.xml A Lib/test/xmltestdata/c14n-20/inNsSort.xml A Lib/test/xmltestdata/c14n-20/inNsSuperfluous.xml A Lib/test/xmltestdata/c14n-20/inNsXml.xml A Lib/test/xmltestdata/c14n-20/out_inC14N1_c14nComment.xml A Lib/test/xmltestdata/c14n-20/out_inC14N1_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inC14N2_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inC14N2_c14nTrim.xml A Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nPrefix.xml A Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nTrim.xml A Lib/test/xmltestdata/c14n-20/out_inC14N4_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inC14N4_c14nTrim.xml A Lib/test/xmltestdata/c14n-20/out_inC14N5_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inC14N5_c14nTrim.xml A Lib/test/xmltestdata/c14n-20/out_inC14N6_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nPrefixQnameXpathElem.xml A Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameElem.xml A Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameXpathElem.xml A Lib/test/xmltestdata/c14n-20/out_inNsDefault_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inNsDefault_c14nPrefix.xml A Lib/test/xmltestdata/c14n-20/out_inNsPushdown_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inNsPushdown_c14nPrefix.xml A Lib/test/xmltestdata/c14n-20/out_inNsRedecl_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inNsRedecl_c14nPrefix.xml A Lib/test/xmltestdata/c14n-20/out_inNsSort_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inNsSort_c14nPrefix.xml A Lib/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nPrefix.xml A Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nDefault.xml A Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefix.xml A Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefixQname.xml A Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nQname.xml A Lib/test/xmltestdata/c14n-20/world.txt A Misc/NEWS.d/next/Library/2019-04-26-10-10-34.bpo-13611.XEF4bg.rst M Doc/library/xml.etree.elementtree.rst M Doc/whatsnew/3.8.rst M Lib/test/test_xml_etree.py M Lib/xml/etree/ElementTree.py diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 66090af00fa1..ef74d0c852cd 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -465,6 +465,53 @@ Reference Functions ^^^^^^^^^ +.. function:: canonicalize(xml_data=None, *, out=None, from_file=None, **options) + + `C14N 2.0 `_ transformation function. + + Canonicalization is a way to normalise XML output in a way that allows + byte-by-byte comparisons and digital signatures. It reduced the freedom + that XML serializers have and instead generates a more constrained XML + representation. The main restrictions regard the placement of namespace + declarations, the ordering of attributes, and ignorable whitespace. + + This function takes an XML data string (*xml_data*) or a file path or + file-like object (*from_file*) as input, converts it to the canonical + form, and writes it out using the *out* file(-like) object, if provided, + or returns it as a text string if not. The output file receives text, + not bytes. It should therefore be opened in text mode with ``utf-8`` + encoding. + + Typical uses:: + + xml_data = "..." + print(canonicalize(xml_data)) + + with open("c14n_output.xml", mode='w', encoding='utf-8') as out_file: + canonicalize(xml_data, out=out_file) + + with open("c14n_output.xml", mode='w', encoding='utf-8') as out_file: + canonicalize(from_file="inputfile.xml", out=out_file) + + The configuration *options* are as follows: + + - *with_comments*: set to true to include comments (default: false) + - *strip_text*: set to true to strip whitespace before and after text content + (default: false) + - *rewrite_prefixes*: set to true to replace namespace prefixes by "n{number}" + (default: false) + - *qname_aware_tags*: a set of qname aware tag names in which prefixes + should be replaced in text content (default: empty) + - *qname_aware_attrs*: a set of qname aware attribute names in which prefixes + should be replaced in text content (default: empty) + - *exclude_attrs*: a set of attribute names that should not be serialised + - *exclude_tags*: a set of tag names that should not be serialised + + In the option list above, "a set" refers to any collection or iterable of + strings, no ordering is expected. + + .. versionadded:: 3.8 + .. function:: Comment(text=None) @@ -1114,6 +1161,19 @@ TreeBuilder Objects .. versionadded:: 3.8 +.. class:: C14NWriterTarget(write, *, \ + with_comments=False, strip_text=False, rewrite_prefixes=False, \ + qname_aware_tags=None, qname_aware_attrs=None, \ + exclude_attrs=None, exclude_tags=None) + + A `C14N 2.0 `_ writer. Arguments are the + same as for the :func:`canonicalize` function. This class does not build a + tree but translates the callback events directly into a serialised form + using the *write* function. + + .. versionadded:: 3.8 + + .. _elementtree-xmlparser-objects: XMLParser Objects diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index bbc55ddd6341..37570bcad526 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -525,6 +525,10 @@ xml external entities by default. (Contributed by Christian Heimes in :issue:`17239`.) +* The :mod:`xml.etree.ElementTree` module provides a new function + :func:`?xml.etree.ElementTree.canonicalize()` that implements C14N 2.0. + (Contributed by Stefan Behnel in :issue:`13611`.) + Optimizations ============= diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 0abc42a173d9..a59a11f025da 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -12,6 +12,7 @@ import itertools import locale import operator +import os import pickle import sys import textwrap @@ -20,6 +21,7 @@ import warnings import weakref +from functools import partial from itertools import product, islice from test import support from test.support import TESTFN, findfile, import_fresh_module, gc_collect, swap_attr @@ -3527,6 +3529,231 @@ def test_correct_import_pyET(self): self.assertIsInstance(pyET.Element.__init__, types.FunctionType) self.assertIsInstance(pyET.XMLParser.__init__, types.FunctionType) + +# -------------------------------------------------------------------- + +def c14n_roundtrip(xml, **options): + return pyET.canonicalize(xml, **options) + + +class C14NTest(unittest.TestCase): + maxDiff = None + + # + # simple roundtrip tests (from c14n.py) + + def test_simple_roundtrip(self): + # Basics + self.assertEqual(c14n_roundtrip(""), '') + self.assertEqual(c14n_roundtrip(""), # FIXME + '') + self.assertEqual(c14n_roundtrip(""), + '') + self.assertEqual(c14n_roundtrip(""), + '') + self.assertEqual(c14n_roundtrip(""), + '') + + # C14N spec + self.assertEqual(c14n_roundtrip("Hello, world!"), + 'Hello, world!') + self.assertEqual(c14n_roundtrip("2"), + '2') + self.assertEqual(c14n_roundtrip('"0" && value<"10" ?"valid":"error"]]>'), + 'value>"0" && value<"10" ?"valid":"error"') + self.assertEqual(c14n_roundtrip('''valid'''), + 'valid') + self.assertEqual(c14n_roundtrip(""), + '') + self.assertEqual(c14n_roundtrip(""), + '') + self.assertEqual(c14n_roundtrip(""), + '') + + # fragments from PJ's tests + #self.assertEqual(c14n_roundtrip(""), + #'') + + def test_c14n_exclusion(self): + xml = textwrap.dedent("""\ + + + abtext + + btext + + dtext + + + """) + self.assertEqual( + c14n_roundtrip(xml, strip_text=True), + '' + 'abtext' + 'btext' + 'dtext' + '') + self.assertEqual( + c14n_roundtrip(xml, strip_text=True, exclude_attrs=['{http://example.com/x}attr']), + '' + 'abtext' + 'btext' + 'dtext' + '') + self.assertEqual( + c14n_roundtrip(xml, strip_text=True, exclude_tags=['{http://example.com/x}d']), + '' + 'abtext' + 'btext' + '' + '') + self.assertEqual( + c14n_roundtrip(xml, strip_text=True, exclude_attrs=['{http://example.com/x}attr'], + exclude_tags=['{http://example.com/x}d']), + '' + 'abtext' + 'btext' + '' + '') + self.assertEqual( + c14n_roundtrip(xml, strip_text=True, exclude_tags=['a', 'b']), + '' + 'dtext' + '') + self.assertEqual( + c14n_roundtrip(xml, exclude_tags=['a', 'b']), + '\n' + ' \n' + ' \n' + ' \n' + ' dtext\n' + ' \n' + '') + self.assertEqual( + c14n_roundtrip(xml, strip_text=True, exclude_tags=['{http://example.com/x}d', 'b']), + '' + '' + '' + '') + self.assertEqual( + c14n_roundtrip(xml, exclude_tags=['{http://example.com/x}d', 'b']), + '\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + '') + + # + # basic method=c14n tests from the c14n 2.0 specification. uses + # test files under xmltestdata/c14n-20. + + # note that this uses generated C14N versions of the standard ET.write + # output, not roundtripped C14N (see above). + + def test_xml_c14n2(self): + datadir = findfile("c14n-20", subdir="xmltestdata") + full_path = partial(os.path.join, datadir) + + files = [filename[:-4] for filename in sorted(os.listdir(datadir)) + if filename.endswith('.xml')] + input_files = [ + filename for filename in files + if filename.startswith('in') + ] + configs = { + filename: { + # sequential + option.tag.split('}')[-1]: ((option.text or '').strip(), option) + for option in ET.parse(full_path(filename) + ".xml").getroot() + } + for filename in files + if filename.startswith('c14n') + } + + tests = { + input_file: [ + (filename, configs[filename.rsplit('_', 1)[-1]]) + for filename in files + if filename.startswith(f'out_{input_file}_') + and filename.rsplit('_', 1)[-1] in configs + ] + for input_file in input_files + } + + # Make sure we found all test cases. + self.assertEqual(30, len([ + output_file for output_files in tests.values() + for output_file in output_files])) + + def get_option(config, option_name, default=None): + return config.get(option_name, (default, ()))[0] + + for input_file, output_files in tests.items(): + for output_file, config in output_files: + keep_comments = get_option( + config, 'IgnoreComments') == 'true' # no, it's right :) + strip_text = get_option( + config, 'TrimTextNodes') == 'true' + rewrite_prefixes = get_option( + config, 'PrefixRewrite') == 'sequential' + if 'QNameAware' in config: + qattrs = [ + f"{{{el.get('NS')}}}{el.get('Name')}" + for el in config['QNameAware'][1].findall( + '{http://www.w3.org/2010/xml-c14n2}QualifiedAttr') + ] + qtags = [ + f"{{{el.get('NS')}}}{el.get('Name')}" + for el in config['QNameAware'][1].findall( + '{http://www.w3.org/2010/xml-c14n2}Element') + ] + else: + qtags = qattrs = None + + # Build subtest description from config. + config_descr = ','.join( + f"{name}={value or ','.join(c.tag.split('}')[-1] for c in children)}" + for name, (value, children) in sorted(config.items()) + ) + + with self.subTest(f"{output_file}({config_descr})"): + if input_file == 'inNsRedecl' and not rewrite_prefixes: + self.skipTest( + f"Redeclared namespace handling is not supported in {output_file}") + if input_file == 'inNsSuperfluous' and not rewrite_prefixes: + self.skipTest( + f"Redeclared namespace handling is not supported in {output_file}") + if 'QNameAware' in config and config['QNameAware'][1].find( + '{http://www.w3.org/2010/xml-c14n2}XPathElement') is not None: + self.skipTest( + f"QName rewriting in XPath text is not supported in {output_file}") + + f = full_path(input_file + ".xml") + if input_file == 'inC14N5': + # Hack: avoid setting up external entity resolution in the parser. + with open(full_path('world.txt'), 'rb') as entity_file: + with open(f, 'rb') as f: + f = io.BytesIO(f.read().replace(b'&ent2;', entity_file.read())) + + text = ET.canonicalize( + from_file=f, + with_comments=keep_comments, + strip_text=strip_text, + rewrite_prefixes=rewrite_prefixes, + qname_aware_tags=qtags, qname_aware_attrs=qattrs) + + with open(full_path(output_file + ".xml"), 'r', encoding='utf8') as f: + expected = f.read() + if input_file == 'inC14N3': + # FIXME: cET resolves default attributes but ET does not! + expected = expected.replace(' attr="default"', '') + text = text.replace(' attr="default"', '') + self.assertEqual(expected, text) + # -------------------------------------------------------------------- @@ -3559,6 +3786,8 @@ def test_main(module=None): XMLParserTest, XMLPullParserTest, BugsTest, + KeywordArgsTest, + C14NTest, ] # These tests will only run for the pure-Python version that doesn't import diff --git a/Lib/test/xmltestdata/c14n-20/c14nComment.xml b/Lib/test/xmltestdata/c14n-20/c14nComment.xml new file mode 100644 index 000000000000..e95aa302d04f --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/c14nComment.xml @@ -0,0 +1,4 @@ + + true + + diff --git a/Lib/test/xmltestdata/c14n-20/c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/c14nDefault.xml new file mode 100644 index 000000000000..c1364142cc59 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/c14nDefault.xml @@ -0,0 +1,3 @@ + + + diff --git a/Lib/test/xmltestdata/c14n-20/c14nPrefix.xml b/Lib/test/xmltestdata/c14n-20/c14nPrefix.xml new file mode 100644 index 000000000000..fb233b42b133 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/c14nPrefix.xml @@ -0,0 +1,4 @@ + + sequential + + diff --git a/Lib/test/xmltestdata/c14n-20/c14nPrefixQname.xml b/Lib/test/xmltestdata/c14n-20/c14nPrefixQname.xml new file mode 100644 index 000000000000..23188eedbc24 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/c14nPrefixQname.xml @@ -0,0 +1,7 @@ + + sequential + + + + + diff --git a/Lib/test/xmltestdata/c14n-20/c14nPrefixQnameXpathElem.xml b/Lib/test/xmltestdata/c14n-20/c14nPrefixQnameXpathElem.xml new file mode 100644 index 000000000000..626fc48f410f --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/c14nPrefixQnameXpathElem.xml @@ -0,0 +1,8 @@ + + sequential + + + + + + diff --git a/Lib/test/xmltestdata/c14n-20/c14nQname.xml b/Lib/test/xmltestdata/c14n-20/c14nQname.xml new file mode 100644 index 000000000000..919e5903f5ce --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/c14nQname.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Lib/test/xmltestdata/c14n-20/c14nQnameElem.xml b/Lib/test/xmltestdata/c14n-20/c14nQnameElem.xml new file mode 100644 index 000000000000..0321f8061952 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/c14nQnameElem.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Lib/test/xmltestdata/c14n-20/c14nQnameXpathElem.xml b/Lib/test/xmltestdata/c14n-20/c14nQnameXpathElem.xml new file mode 100644 index 000000000000..c4890bc8b01d --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/c14nQnameXpathElem.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Lib/test/xmltestdata/c14n-20/c14nTrim.xml b/Lib/test/xmltestdata/c14n-20/c14nTrim.xml new file mode 100644 index 000000000000..ccb9cf65db72 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/c14nTrim.xml @@ -0,0 +1,4 @@ + + true + + diff --git a/Lib/test/xmltestdata/c14n-20/doc.dtd b/Lib/test/xmltestdata/c14n-20/doc.dtd new file mode 100644 index 000000000000..5c5d544a0df8 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/doc.dtd @@ -0,0 +1,6 @@ + + + + + + diff --git a/Lib/test/xmltestdata/c14n-20/doc.xsl b/Lib/test/xmltestdata/c14n-20/doc.xsl new file mode 100644 index 000000000000..a3f2348cc2f2 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/doc.xsl @@ -0,0 +1,5 @@ + + + diff --git a/Lib/test/xmltestdata/c14n-20/inC14N1.xml b/Lib/test/xmltestdata/c14n-20/inC14N1.xml new file mode 100644 index 000000000000..ed450c7341d3 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inC14N1.xml @@ -0,0 +1,14 @@ + + + + + + +Hello, world! + + + + + + diff --git a/Lib/test/xmltestdata/c14n-20/inC14N2.xml b/Lib/test/xmltestdata/c14n-20/inC14N2.xml new file mode 100644 index 000000000000..74eeea147c37 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inC14N2.xml @@ -0,0 +1,11 @@ + + + A B + + A + + B + A B + C + + diff --git a/Lib/test/xmltestdata/c14n-20/inC14N3.xml b/Lib/test/xmltestdata/c14n-20/inC14N3.xml new file mode 100644 index 000000000000..fea78213f1ae --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inC14N3.xml @@ -0,0 +1,18 @@ +]> + + + + + + + + + + + + + + diff --git a/Lib/test/xmltestdata/c14n-20/inC14N4.xml b/Lib/test/xmltestdata/c14n-20/inC14N4.xml new file mode 100644 index 000000000000..909a847435b8 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inC14N4.xml @@ -0,0 +1,13 @@ + + +]> + + First line Second line + 2 + "0" && value<"10" ?"valid":"error"]]> + valid + + + + diff --git a/Lib/test/xmltestdata/c14n-20/inC14N5.xml b/Lib/test/xmltestdata/c14n-20/inC14N5.xml new file mode 100644 index 000000000000..501161bad518 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inC14N5.xml @@ -0,0 +1,12 @@ + + + + + +]> + + &ent1;, &ent2;! + + + diff --git a/Lib/test/xmltestdata/c14n-20/inC14N6.xml b/Lib/test/xmltestdata/c14n-20/inC14N6.xml new file mode 100644 index 000000000000..31e207186725 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inC14N6.xml @@ -0,0 +1,2 @@ + +© diff --git a/Lib/test/xmltestdata/c14n-20/inNsContent.xml b/Lib/test/xmltestdata/c14n-20/inNsContent.xml new file mode 100644 index 000000000000..b9924660ba6d --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inNsContent.xml @@ -0,0 +1,4 @@ + + xsd:string + /soap-env:body/child::b:foo[@att1 != "c:val" and @att2 != 'xsd:string'] + diff --git a/Lib/test/xmltestdata/c14n-20/inNsDefault.xml b/Lib/test/xmltestdata/c14n-20/inNsDefault.xml new file mode 100644 index 000000000000..3e0d323bad27 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inNsDefault.xml @@ -0,0 +1,3 @@ + + + diff --git a/Lib/test/xmltestdata/c14n-20/inNsPushdown.xml b/Lib/test/xmltestdata/c14n-20/inNsPushdown.xml new file mode 100644 index 000000000000..daa67d83f159 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inNsPushdown.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Lib/test/xmltestdata/c14n-20/inNsRedecl.xml b/Lib/test/xmltestdata/c14n-20/inNsRedecl.xml new file mode 100644 index 000000000000..10bd97beda3b --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inNsRedecl.xml @@ -0,0 +1,3 @@ + + + diff --git a/Lib/test/xmltestdata/c14n-20/inNsSort.xml b/Lib/test/xmltestdata/c14n-20/inNsSort.xml new file mode 100644 index 000000000000..8e9fc01c647b --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inNsSort.xml @@ -0,0 +1,4 @@ + + + + diff --git a/Lib/test/xmltestdata/c14n-20/inNsSuperfluous.xml b/Lib/test/xmltestdata/c14n-20/inNsSuperfluous.xml new file mode 100644 index 000000000000..f77720f7b0b0 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inNsSuperfluous.xml @@ -0,0 +1,4 @@ + + + + diff --git a/Lib/test/xmltestdata/c14n-20/inNsXml.xml b/Lib/test/xmltestdata/c14n-20/inNsXml.xml new file mode 100644 index 000000000000..7520cf3fb9eb --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/inNsXml.xml @@ -0,0 +1,3 @@ + + data + diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N1_c14nComment.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N1_c14nComment.xml new file mode 100644 index 000000000000..d98d16840c6b --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N1_c14nComment.xml @@ -0,0 +1,6 @@ + +Hello, world! + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N1_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N1_c14nDefault.xml new file mode 100644 index 000000000000..af9a9770578e --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N1_c14nDefault.xml @@ -0,0 +1,4 @@ + +Hello, world! + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N2_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N2_c14nDefault.xml new file mode 100644 index 000000000000..2afa15ccb363 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N2_c14nDefault.xml @@ -0,0 +1,11 @@ + + + A B + + A + + B + A B + C + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N2_c14nTrim.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N2_c14nTrim.xml new file mode 100644 index 000000000000..7a1dc32946bc --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N2_c14nTrim.xml @@ -0,0 +1 @@ +A BABA BC \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nDefault.xml new file mode 100644 index 000000000000..662e108aa8a1 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nDefault.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nPrefix.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nPrefix.xml new file mode 100644 index 000000000000..041e1ec8ebe5 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nPrefix.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nTrim.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nTrim.xml new file mode 100644 index 000000000000..4f35ad9662df --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N3_c14nTrim.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N4_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N4_c14nDefault.xml new file mode 100644 index 000000000000..243d0e61f2e9 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N4_c14nDefault.xml @@ -0,0 +1,10 @@ + + First line +Second line + 2 + value>"0" && value<"10" ?"valid":"error" + valid + + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N4_c14nTrim.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N4_c14nTrim.xml new file mode 100644 index 000000000000..24d83ba8ab00 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N4_c14nTrim.xml @@ -0,0 +1,2 @@ +First line +Second line2value>"0" && value<"10" ?"valid":"error"valid \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N5_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N5_c14nDefault.xml new file mode 100644 index 000000000000..c232e740aee4 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N5_c14nDefault.xml @@ -0,0 +1,3 @@ + + Hello, world! + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N5_c14nTrim.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N5_c14nTrim.xml new file mode 100644 index 000000000000..3fa84b1e9860 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N5_c14nTrim.xml @@ -0,0 +1 @@ +Hello, world! \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inC14N6_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inC14N6_c14nDefault.xml new file mode 100644 index 000000000000..0be38f98cb13 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inC14N6_c14nDefault.xml @@ -0,0 +1 @@ +? \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nDefault.xml new file mode 100644 index 000000000000..62d7e004a440 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nDefault.xml @@ -0,0 +1,4 @@ + + xsd:string + /soap-env:body/child::b:foo[@att1 != "c:val" and @att2 != 'xsd:string'] + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nPrefixQnameXpathElem.xml b/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nPrefixQnameXpathElem.xml new file mode 100644 index 000000000000..20e1c2e9d6df --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nPrefixQnameXpathElem.xml @@ -0,0 +1,4 @@ + + n1:string + /n3:body/child::n2:foo[@att1 != "c:val" and @att2 != 'xsd:string'] + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameElem.xml b/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameElem.xml new file mode 100644 index 000000000000..db8680daa033 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameElem.xml @@ -0,0 +1,4 @@ + + xsd:string + /soap-env:body/child::b:foo[@att1 != "c:val" and @att2 != 'xsd:string'] + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameXpathElem.xml b/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameXpathElem.xml new file mode 100644 index 000000000000..df3b21579fac --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameXpathElem.xml @@ -0,0 +1,4 @@ + + xsd:string + /soap-env:body/child::b:foo[@att1 != "c:val" and @att2 != 'xsd:string'] + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsDefault_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inNsDefault_c14nDefault.xml new file mode 100644 index 000000000000..674b076dd6d9 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsDefault_c14nDefault.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsDefault_c14nPrefix.xml b/Lib/test/xmltestdata/c14n-20/out_inNsDefault_c14nPrefix.xml new file mode 100644 index 000000000000..83edaae91e74 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsDefault_c14nPrefix.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsPushdown_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inNsPushdown_c14nDefault.xml new file mode 100644 index 000000000000..fa4f21b5d0af --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsPushdown_c14nDefault.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsPushdown_c14nPrefix.xml b/Lib/test/xmltestdata/c14n-20/out_inNsPushdown_c14nPrefix.xml new file mode 100644 index 000000000000..6d579200c9dc --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsPushdown_c14nPrefix.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsRedecl_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inNsRedecl_c14nDefault.xml new file mode 100644 index 000000000000..ba37f925103c --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsRedecl_c14nDefault.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsRedecl_c14nPrefix.xml b/Lib/test/xmltestdata/c14n-20/out_inNsRedecl_c14nPrefix.xml new file mode 100644 index 000000000000..af3bb2d6f062 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsRedecl_c14nPrefix.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsSort_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inNsSort_c14nDefault.xml new file mode 100644 index 000000000000..8a92c5c61c2c --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsSort_c14nDefault.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsSort_c14nPrefix.xml b/Lib/test/xmltestdata/c14n-20/out_inNsSort_c14nPrefix.xml new file mode 100644 index 000000000000..8d44c84fe5d3 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsSort_c14nPrefix.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nDefault.xml new file mode 100644 index 000000000000..6bb862d763d7 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nDefault.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nPrefix.xml b/Lib/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nPrefix.xml new file mode 100644 index 000000000000..700a16d42a77 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nPrefix.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nDefault.xml b/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nDefault.xml new file mode 100644 index 000000000000..1689f3bf423d --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nDefault.xml @@ -0,0 +1,3 @@ + + data + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefix.xml b/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefix.xml new file mode 100644 index 000000000000..38508a47f6b9 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefix.xml @@ -0,0 +1,3 @@ + + data + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefixQname.xml b/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefixQname.xml new file mode 100644 index 000000000000..867980f82bfa --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefixQname.xml @@ -0,0 +1,3 @@ + + data + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nQname.xml b/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nQname.xml new file mode 100644 index 000000000000..0300f9d562db --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/out_inNsXml_c14nQname.xml @@ -0,0 +1,3 @@ + + data + \ No newline at end of file diff --git a/Lib/test/xmltestdata/c14n-20/world.txt b/Lib/test/xmltestdata/c14n-20/world.txt new file mode 100644 index 000000000000..04fea06420ca --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/world.txt @@ -0,0 +1 @@ +world \ No newline at end of file diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index 5b26ac72fd1a..645e999a0be6 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -87,6 +87,7 @@ "XML", "XMLID", "XMLParser", "XMLPullParser", "register_namespace", + "canonicalize", "C14NWriterTarget", ] VERSION = "1.3.0" @@ -1711,6 +1712,336 @@ def close(self): del self.target, self._target +# -------------------------------------------------------------------- +# C14N 2.0 + +def canonicalize(xml_data=None, *, out=None, from_file=None, **options): + """Convert XML to its C14N 2.0 serialised form. + + If *out* is provided, it must be a file or file-like object that receives + the serialised canonical XML output (text, not bytes) through its ``.write()`` + method. To write to a file, open it in text mode with encoding "utf-8". + If *out* is not provided, this function returns the output as text string. + + Either *xml_data* (an XML string) or *from_file* (a file path or + file-like object) must be provided as input. + + The configuration options are the same as for the ``C14NWriterTarget``. + """ + if xml_data is None and from_file is None: + raise ValueError("Either 'xml_data' or 'from_file' must be provided as input") + sio = None + if out is None: + sio = out = io.StringIO() + + parser = XMLParser(target=C14NWriterTarget(out.write, **options)) + + if xml_data is not None: + parser.feed(xml_data) + parser.close() + elif from_file is not None: + parse(from_file, parser=parser) + + return sio.getvalue() if sio is not None else None + + +_looks_like_prefix_name = re.compile(r'^\w+:\w+$', re.UNICODE).match + + +class C14NWriterTarget: + """ + Canonicalization writer target for the XMLParser. + + Serialises parse events to XML C14N 2.0. + + The *write* function is used for writing out the resulting data stream + as text (not bytes). To write to a file, open it in text mode with encoding + "utf-8" and pass its ``.write`` method. + + Configuration options: + + - *with_comments*: set to true to include comments + - *strip_text*: set to true to strip whitespace before and after text content + - *rewrite_prefixes*: set to true to replace namespace prefixes by "n{number}" + - *qname_aware_tags*: a set of qname aware tag names in which prefixes + should be replaced in text content + - *qname_aware_attrs*: a set of qname aware attribute names in which prefixes + should be replaced in text content + - *exclude_attrs*: a set of attribute names that should not be serialised + - *exclude_tags*: a set of tag names that should not be serialised + """ + def __init__(self, write, *, + with_comments=False, strip_text=False, rewrite_prefixes=False, + qname_aware_tags=None, qname_aware_attrs=None, + exclude_attrs=None, exclude_tags=None): + self._write = write + self._data = [] + self._with_comments = with_comments + self._strip_text = strip_text + self._exclude_attrs = set(exclude_attrs) if exclude_attrs else None + self._exclude_tags = set(exclude_tags) if exclude_tags else None + + self._rewrite_prefixes = rewrite_prefixes + if qname_aware_tags: + self._qname_aware_tags = set(qname_aware_tags) + else: + self._qname_aware_tags = None + if qname_aware_attrs: + self._find_qname_aware_attrs = set(qname_aware_attrs).intersection + else: + self._find_qname_aware_attrs = None + + # Stack with globally and newly declared namespaces as (uri, prefix) pairs. + self._declared_ns_stack = [[ + ("http://www.w3.org/XML/1998/namespace", "xml"), + ]] + # Stack with user declared namespace prefixes as (uri, prefix) pairs. + self._ns_stack = [] + if not rewrite_prefixes: + self._ns_stack.append(list(_namespace_map.items())) + self._ns_stack.append([]) + self._prefix_map = {} + self._preserve_space = [False] + self._pending_start = None + self._root_seen = False + self._root_done = False + self._ignored_depth = 0 + + def _iter_namespaces(self, ns_stack, _reversed=reversed): + for namespaces in _reversed(ns_stack): + if namespaces: # almost no element declares new namespaces + yield from namespaces + + def _resolve_prefix_name(self, prefixed_name): + prefix, name = prefixed_name.split(':', 1) + for uri, p in self._iter_namespaces(self._ns_stack): + if p == prefix: + return f'{{{uri}}}{name}' + raise ValueError(f'Prefix {prefix} of QName "{prefixed_name}" is not declared in scope') + + def _qname(self, qname, uri=None): + if uri is None: + uri, tag = qname[1:].rsplit('}', 1) if qname[:1] == '{' else ('', qname) + else: + tag = qname + + prefixes_seen = set() + for u, prefix in self._iter_namespaces(self._declared_ns_stack): + if u == uri and prefix not in prefixes_seen: + return f'{prefix}:{tag}' if prefix else tag, tag, uri + prefixes_seen.add(prefix) + + # Not declared yet => add new declaration. + if self._rewrite_prefixes: + if uri in self._prefix_map: + prefix = self._prefix_map[uri] + else: + prefix = self._prefix_map[uri] = f'n{len(self._prefix_map)}' + self._declared_ns_stack[-1].append((uri, prefix)) + return f'{prefix}:{tag}', tag, uri + + if not uri and '' not in prefixes_seen: + # No default namespace declared => no prefix needed. + return tag, tag, uri + + for u, prefix in self._iter_namespaces(self._ns_stack): + if u == uri: + self._declared_ns_stack[-1].append((uri, prefix)) + return f'{prefix}:{tag}' if prefix else tag, tag, uri + + raise ValueError(f'Namespace "{uri}" is not declared in scope') + + def data(self, data): + if not self._ignored_depth: + self._data.append(data) + + def _flush(self, _join_text=''.join): + data = _join_text(self._data) + del self._data[:] + if self._strip_text and not self._preserve_space[-1]: + data = data.strip() + if self._pending_start is not None: + args, self._pending_start = self._pending_start, None + qname_text = data if data and _looks_like_prefix_name(data) else None + self._start(*args, qname_text) + if qname_text is not None: + return + if data and self._root_seen: + self._write(_escape_cdata_c14n(data)) + + def start_ns(self, prefix, uri): + if self._ignored_depth: + return + # we may have to resolve qnames in text content + if self._data: + self._flush() + self._ns_stack[-1].append((uri, prefix)) + + def start(self, tag, attrs): + if self._exclude_tags is not None and ( + self._ignored_depth or tag in self._exclude_tags): + self._ignored_depth += 1 + return + if self._data: + self._flush() + + new_namespaces = [] + self._declared_ns_stack.append(new_namespaces) + + if self._qname_aware_tags is not None and tag in self._qname_aware_tags: + # Need to parse text first to see if it requires a prefix declaration. + self._pending_start = (tag, attrs, new_namespaces) + return + self._start(tag, attrs, new_namespaces) + + def _start(self, tag, attrs, new_namespaces, qname_text=None): + if self._exclude_attrs is not None and attrs: + attrs = {k: v for k, v in attrs.items() if k not in self._exclude_attrs} + + qnames = {tag, *attrs} + resolved_names = {} + + # Resolve prefixes in attribute and tag text. + if qname_text is not None: + qname = resolved_names[qname_text] = self._resolve_prefix_name(qname_text) + qnames.add(qname) + if self._find_qname_aware_attrs is not None and attrs: + qattrs = self._find_qname_aware_attrs(attrs) + if qattrs: + for attr_name in qattrs: + value = attrs[attr_name] + if _looks_like_prefix_name(value): + qname = resolved_names[value] = self._resolve_prefix_name(value) + qnames.add(qname) + else: + qattrs = None + else: + qattrs = None + + # Assign prefixes in lexicographical order of used URIs. + parse_qname = self._qname + parsed_qnames = {n: parse_qname(n) for n in sorted( + qnames, key=lambda n: n.split('}', 1))} + + # Write namespace declarations in prefix order ... + if new_namespaces: + attr_list = [ + ('xmlns:' + prefix if prefix else 'xmlns', uri) + for uri, prefix in new_namespaces + ] + attr_list.sort() + else: + # almost always empty + attr_list = [] + + # ... followed by attributes in URI+name order + if attrs: + for k, v in sorted(attrs.items()): + if qattrs is not None and k in qattrs and v in resolved_names: + v = parsed_qnames[resolved_names[v]][0] + attr_qname, attr_name, uri = parsed_qnames[k] + # No prefix for attributes in default ('') namespace. + attr_list.append((attr_qname if uri else attr_name, v)) + + # Honour xml:space attributes. + space_behaviour = attrs.get('{http://www.w3.org/XML/1998/namespace}space') + self._preserve_space.append( + space_behaviour == 'preserve' if space_behaviour + else self._preserve_space[-1]) + + # Write the tag. + write = self._write + write('<' + parsed_qnames[tag][0]) + if attr_list: + write(''.join([f' {k}="{_escape_attrib_c14n(v)}"' for k, v in attr_list])) + write('>') + + # Write the resolved qname text content. + if qname_text is not None: + write(_escape_cdata_c14n(parsed_qnames[resolved_names[qname_text]][0])) + + self._root_seen = True + self._ns_stack.append([]) + + def end(self, tag): + if self._ignored_depth: + self._ignored_depth -= 1 + return + if self._data: + self._flush() + self._write(f'') + self._preserve_space.pop() + self._root_done = len(self._preserve_space) == 1 + self._declared_ns_stack.pop() + self._ns_stack.pop() + + def comment(self, text): + if not self._with_comments: + return + if self._ignored_depth: + return + if self._root_done: + self._write('\n') + elif self._root_seen and self._data: + self._flush() + self._write(f'') + if not self._root_seen: + self._write('\n') + + def pi(self, target, data): + if self._ignored_depth: + return + if self._root_done: + self._write('\n') + elif self._root_seen and self._data: + self._flush() + self._write( + f'' if data else f'') + if not self._root_seen: + self._write('\n') + + +def _escape_cdata_c14n(text): + # escape character data + try: + # it's worth avoiding do-nothing calls for strings that are + # shorter than 500 character, or so. assume that's, by far, + # the most common case in most applications. + if '&' in text: + text = text.replace('&', '&') + if '<' in text: + text = text.replace('<', '<') + if '>' in text: + text = text.replace('>', '>') + if '\r' in text: + text = text.replace('\r', ' ') + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + + +def _escape_attrib_c14n(text): + # escape attribute value + try: + if '&' in text: + text = text.replace('&', '&') + if '<' in text: + text = text.replace('<', '<') + if '"' in text: + text = text.replace('"', '"') + if '\t' in text: + text = text.replace('\t', ' ') + if '\n' in text: + text = text.replace('\n', ' ') + if '\r' in text: + text = text.replace('\r', ' ') + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + + +# -------------------------------------------------------------------- + # Import the C accelerators try: # Element is going to be shadowed by the C implementation. We need to keep diff --git a/Misc/NEWS.d/next/Library/2019-04-26-10-10-34.bpo-13611.XEF4bg.rst b/Misc/NEWS.d/next/Library/2019-04-26-10-10-34.bpo-13611.XEF4bg.rst new file mode 100644 index 000000000000..d01decb9617a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-26-10-10-34.bpo-13611.XEF4bg.rst @@ -0,0 +1,2 @@ +The xml.etree.ElementTree packages gained support for C14N 2.0 serialisation. +Patch by Stefan Behnel. From webhook-mailer at python.org Wed May 1 16:39:27 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Wed, 01 May 2019 20:39:27 -0000 Subject: [Python-checkins] bpo-30458: Use InvalidURL instead of ValueError. (GH-13044) Message-ID: https://github.com/python/cpython/commit/b7378d77289c911ca6a0c0afaf513879002df7d5 commit: b7378d77289c911ca6a0c0afaf513879002df7d5 branch: master author: Gregory P. Smith committer: GitHub date: 2019-05-01T16:39:21-04:00 summary: bpo-30458: Use InvalidURL instead of ValueError. (GH-13044) Use http.client.InvalidURL instead of ValueError as the new error case's exception. files: A Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst D Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-36276.51E-DA.rst M Lib/http/client.py M Lib/test/test_urllib.py diff --git a/Lib/http/client.py b/Lib/http/client.py index 99d6a68cf428..f71a062d2b57 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -1091,7 +1091,7 @@ def putrequest(self, method, url, skip_host=False, url = '/' # Prevent CVE-2019-9740. if match := _contains_disallowed_url_pchar_re.search(url): - raise ValueError(f"URL can't contain control characters. {url!r} " + raise InvalidURL(f"URL can't contain control characters. {url!r} " f"(found at least {match.group()!r})") request = '%s %s %s' % (method, url, self._http_vsn_str) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index c5b23f935b27..7214492eca9d 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -343,11 +343,12 @@ def test_url_with_control_char_rejected(self): # calls urllib.parse.quote() on the URL which makes all of the # above attempts at injection within the url _path_ safe. escaped_char_repr = repr(char).replace('\\', r'\\') + InvalidURL = http.client.InvalidURL with self.assertRaisesRegex( - ValueError, f"contain control.*{escaped_char_repr}"): + InvalidURL, f"contain control.*{escaped_char_repr}"): urllib.request.urlopen(f"http:{schemeless_url}") with self.assertRaisesRegex( - ValueError, f"contain control.*{escaped_char_repr}"): + InvalidURL, f"contain control.*{escaped_char_repr}"): urllib.request.urlopen(f"https:{schemeless_url}") # This code path quotes the URL so there is no injection. resp = urlopen(f"http:{schemeless_url}") @@ -367,10 +368,11 @@ def test_url_with_newline_header_injection_rejected(self): # urlopen uses FancyURLOpener which goes via a codepath that # calls urllib.parse.quote() on the URL which makes all of the # above attempts at injection within the url _path_ safe. + InvalidURL = http.client.InvalidURL with self.assertRaisesRegex( - ValueError, r"contain control.*\\r.*(found at least . .)"): + InvalidURL, r"contain control.*\\r.*(found at least . .)"): urllib.request.urlopen(f"http:{schemeless_url}") - with self.assertRaisesRegex(ValueError, r"contain control.*\\n"): + with self.assertRaisesRegex(InvalidURL, r"contain control.*\\n"): urllib.request.urlopen(f"https:{schemeless_url}") # This code path quotes the URL so there is no injection. resp = urlopen(f"http:{schemeless_url}") diff --git a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-36276.51E-DA.rst b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst similarity index 75% rename from Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-36276.51E-DA.rst rename to Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst index 4fed4d545040..ed8027fb4d64 100644 --- a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-36276.51E-DA.rst +++ b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst @@ -1 +1 @@ -Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause a ValueError to be raised. \ No newline at end of file +Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause an http.client.InvalidURL exception to be raised. From webhook-mailer at python.org Wed May 1 18:04:27 2019 From: webhook-mailer at python.org (Chris Withers) Date: Wed, 01 May 2019 22:04:27 -0000 Subject: [Python-checkins] Mock 100% coverage (GH-13045) Message-ID: https://github.com/python/cpython/commit/adbf178e49113b2de0042e86a1228560475a65c5 commit: adbf178e49113b2de0042e86a1228560475a65c5 branch: master author: Chris Withers committer: GitHub date: 2019-05-01T23:04:04+01:00 summary: Mock 100% coverage (GH-13045) This was achieved by: * moving many pass statements in tests onto their own lines, so they pass line coverage and can match an easy ignore pattern if branch coverage is added later. * removing code that cannot be reached. * removing long-disabled tests. * removing unused code. * adding tests for uncovered code It turned out that removing `if __name__ == '__main__'` blocks that run unittest.main() at the bottom of test files was surprisingly contentious, so they remain and can be filtered out with an appropriate .coveragerc. files: M Lib/unittest/mock.py M Lib/unittest/test/testmock/support.py M Lib/unittest/test/testmock/testcallable.py M Lib/unittest/test/testmock/testhelpers.py M Lib/unittest/test/testmock/testmagicmethods.py M Lib/unittest/test/testmock/testmock.py M Lib/unittest/test/testmock/testpatch.py M Lib/unittest/test/testmock/testsealable.py M Lib/unittest/test/testmock/testwith.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 721e91f8cbcb..351aba5d44d7 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -63,10 +63,7 @@ def _get_signature_object(func, as_instance, eat_self): """ if isinstance(func, type) and not as_instance: # If it's a type and should be modelled as a type, use __init__. - try: - func = func.__init__ - except AttributeError: - return None + func = func.__init__ # Skip the `self` argument in __init__ eat_self = True elif not isinstance(func, FunctionTypes): @@ -147,8 +144,6 @@ def _set_signature(mock, original, instance=False): # creates a function with signature (*args, **kwargs) that delegates to a # mock. It still does signature checking by calling a lambda with the same # signature as the original. - if not _callable(original): - return skipfirst = isinstance(original, type) result = _get_signature_object(original, instance, skipfirst) @@ -175,10 +170,6 @@ def checksig(*args, **kwargs): def _setup_func(funcopy, mock, sig): funcopy.mock = mock - # can't use isinstance with mocks - if not _is_instance_mock(mock): - return - def assert_called_with(*args, **kwargs): return mock.assert_called_with(*args, **kwargs) def assert_called(*args, **kwargs): @@ -263,12 +254,6 @@ def __reduce__(self): _deleted = sentinel.DELETED -def _copy(value): - if type(value) in (dict, list, tuple, set): - return type(value)(value) - return value - - _allowed_names = { 'return_value', '_mock_return_value', 'side_effect', '_mock_side_effect', '_mock_parent', '_mock_new_parent', @@ -351,8 +336,6 @@ def _check_and_set_parent(parent, value, name, new_name): class _MockIter(object): def __init__(self, obj): self.obj = iter(obj) - def __iter__(self): - return self def __next__(self): return next(self.obj) @@ -452,7 +435,7 @@ def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False, if isinstance(spec, type): _spec_class = spec else: - _spec_class = _get_class(spec) + _spec_class = type(spec) res = _get_signature_object(spec, _spec_as_instance, _eat_self) _spec_signature = res and res[1] @@ -624,7 +607,7 @@ def _extract_mock_name(self): dot = '.' if _name_list == ['()']: dot = '' - seen = set() + while _parent is not None: last = _parent @@ -635,11 +618,6 @@ def _extract_mock_name(self): _parent = _parent._mock_new_parent - # use ids here so as not to call __hash__ on the mocks - if id(_parent) in seen: - break - seen.add(id(_parent)) - _name_list = list(reversed(_name_list)) _first = last._mock_name or 'mock' if len(_name_list) > 1: @@ -753,8 +731,6 @@ def _format_mock_failure_message(self, args, kwargs): message = 'expected call not found.\nExpected: %s\nActual: %s' expected_string = self._format_mock_call_signature(args, kwargs) call_args = self.call_args - if len(call_args) == 3: - call_args = call_args[1:] actual_string = self._format_mock_call_signature(*call_args) return message % (expected_string, actual_string) @@ -992,8 +968,6 @@ def _mock_call(_mock_self, *args, **kwargs): self.call_args = _call self.call_args_list.append(_call) - seen = set() - # initial stuff for method_calls: do_method_calls = self._mock_parent is not None method_call_name = self._mock_name @@ -1029,13 +1003,6 @@ def _mock_call(_mock_self, *args, **kwargs): # follow the parental chain: _new_parent = _new_parent._mock_new_parent - # check we're not in an infinite loop: - # ( use ids here so as not to call __hash__ on the mocks) - _new_parent_id = id(_new_parent) - if _new_parent_id in seen: - break - seen.add(_new_parent_id) - effect = self.side_effect if effect is not None: if _is_exception(effect): @@ -1858,12 +1825,7 @@ def _set_return_value(mock, method, name): return_calulator = _calculate_return_value.get(name) if return_calulator is not None: - try: - return_value = return_calulator(mock) - except AttributeError: - # XXXX why do we return AttributeError here? - # set it as a side_effect instead? - return_value = AttributeError(name) + return_value = return_calulator(mock) method.return_value = return_value return @@ -1943,10 +1905,6 @@ def __init__(self, name, parent): self.name = name self.parent = parent - def __call__(self, *args, **kwargs): - m = self.create_mock() - return m(*args, **kwargs) - def create_mock(self): entry = self.name parent = self.parent @@ -2330,19 +2288,10 @@ def _must_skip(spec, entry, is_type): else: return False - # shouldn't get here unless function is a dynamically provided attribute - # XXXX untested behaviour + # function is a dynamically provided attribute return is_type -def _get_class(obj): - try: - return obj.__class__ - except AttributeError: - # it is possible for objects to have no __class__ - return type(obj) - - class _SpecState(object): def __init__(self, spec, spec_set=False, parent=None, diff --git a/Lib/unittest/test/testmock/support.py b/Lib/unittest/test/testmock/support.py index f146be244e9c..49986d65dc47 100644 --- a/Lib/unittest/test/testmock/support.py +++ b/Lib/unittest/test/testmock/support.py @@ -9,8 +9,7 @@ def is_instance(obj, klass): class SomeClass(object): class_attribute = None - def wibble(self): - pass + def wibble(self): pass class X(object): diff --git a/Lib/unittest/test/testmock/testcallable.py b/Lib/unittest/test/testmock/testcallable.py index 34474c4c816e..5eadc0070494 100644 --- a/Lib/unittest/test/testmock/testcallable.py +++ b/Lib/unittest/test/testmock/testcallable.py @@ -98,8 +98,7 @@ def test_patch_spec_set_instance(self): def test_patch_spec_callable_class(self): class CallableX(X): - def __call__(self): - pass + def __call__(self): pass class Sub(CallableX): pass diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py index e321976aeb9f..301bca430c13 100644 --- a/Lib/unittest/test/testmock/testhelpers.py +++ b/Lib/unittest/test/testmock/testhelpers.py @@ -12,12 +12,9 @@ from functools import partial class SomeClass(object): - def one(self, a, b): - pass - def two(self): - pass - def three(self, a=None): - pass + def one(self, a, b): pass + def two(self): pass + def three(self, a=None): pass @@ -48,12 +45,9 @@ def test_any_and_datetime(self): def test_any_mock_calls_comparison_order(self): mock = Mock() - d = datetime.now() class Foo(object): - def __eq__(self, other): - return False - def __ne__(self, other): - return True + def __eq__(self, other): pass + def __ne__(self, other): pass for d in datetime.now(), Foo(): mock.reset_mock() @@ -378,8 +372,7 @@ def test_basic(self): def test_create_autospec_return_value(self): - def f(): - pass + def f(): pass mock = create_autospec(f, return_value='foo') self.assertEqual(mock(), 'foo') @@ -399,8 +392,7 @@ def test_autospec_reset_mock(self): def test_mocking_unbound_methods(self): class Foo(object): - def foo(self, foo): - pass + def foo(self, foo): pass p = patch.object(Foo, 'foo') mock_foo = p.start() Foo().foo(1) @@ -408,24 +400,6 @@ def foo(self, foo): mock_foo.assert_called_with(1) - def test_create_autospec_unbound_methods(self): - # see mock issue 128 - # this is expected to fail until the issue is fixed - return - class Foo(object): - def foo(self): - pass - - klass = create_autospec(Foo) - instance = klass() - self.assertRaises(TypeError, instance.foo, 1) - - # Note: no type checking on the "self" parameter - klass.foo(1) - klass.foo.assert_called_with(1) - self.assertRaises(TypeError, klass.foo) - - def test_create_autospec_keyword_arguments(self): class Foo(object): a = 3 @@ -434,8 +408,7 @@ class Foo(object): def test_create_autospec_keyword_only_arguments(self): - def foo(a, *, b=None): - pass + def foo(a, *, b=None): pass m = create_autospec(foo) m(1) @@ -448,8 +421,7 @@ def foo(a, *, b=None): def test_function_as_instance_attribute(self): obj = SomeClass() - def f(a): - pass + def f(a): pass obj.f = f mock = create_autospec(obj) @@ -485,13 +457,57 @@ class Sub(SomeClass): self._check_someclass_mock(mock) + def test_spec_has_descriptor_returning_function(self): + + class CrazyDescriptor(object): + + def __get__(self, obj, type_): + if obj is None: + return lambda x: None + + class MyClass(object): + + some_attr = CrazyDescriptor() + + mock = create_autospec(MyClass) + mock.some_attr(1) + with self.assertRaises(TypeError): + mock.some_attr() + with self.assertRaises(TypeError): + mock.some_attr(1, 2) + + + def test_spec_has_function_not_in_bases(self): + + class CrazyClass(object): + + def __dir__(self): + return super(CrazyClass, self).__dir__()+['crazy'] + + def __getattr__(self, item): + if item == 'crazy': + return lambda x: x + raise AttributeError(item) + + inst = CrazyClass() + with self.assertRaises(AttributeError): + inst.other + self.assertEqual(inst.crazy(42), 42) + + mock = create_autospec(inst) + mock.crazy(42) + with self.assertRaises(TypeError): + mock.crazy() + with self.assertRaises(TypeError): + mock.crazy(1, 2) + + def test_builtin_functions_types(self): # we could replace builtin functions / methods with a function # with *args / **kwargs signature. Using the builtin method type # as a spec seems to work fairly well though. class BuiltinSubclass(list): - def bar(self, arg): - pass + def bar(self, arg): pass sorted = sorted attr = {} @@ -565,17 +581,13 @@ class Sub(SomeClass): def test_descriptors(self): class Foo(object): @classmethod - def f(cls, a, b): - pass + def f(cls, a, b): pass @staticmethod - def g(a, b): - pass + def g(a, b): pass - class Bar(Foo): - pass + class Bar(Foo): pass - class Baz(SomeClass, Bar): - pass + class Baz(SomeClass, Bar): pass for spec in (Foo, Foo(), Bar, Bar(), Baz, Baz()): mock = create_autospec(spec) @@ -588,8 +600,7 @@ class Baz(SomeClass, Bar): def test_recursive(self): class A(object): - def a(self): - pass + def a(self): pass foo = 'foo bar baz' bar = foo @@ -611,11 +622,9 @@ def a(self): def test_spec_inheritance_for_classes(self): class Foo(object): - def a(self, x): - pass + def a(self, x): pass class Bar(object): - def f(self, y): - pass + def f(self, y): pass class_mock = create_autospec(Foo) @@ -695,8 +704,7 @@ def test_builtins(self): def test_function(self): - def f(a, b): - pass + def f(a, b): pass mock = create_autospec(f) self.assertRaises(TypeError, mock) @@ -726,9 +734,10 @@ class RaiserClass(object): def existing(a, b): return a + b + self.assertEqual(RaiserClass.existing(1, 2), 3) s = create_autospec(RaiserClass) self.assertRaises(TypeError, lambda x: s.existing(1, 2, 3)) - s.existing(1, 2) + self.assertEqual(s.existing(1, 2), s.existing.return_value) self.assertRaises(AttributeError, lambda: s.nonexisting) # check we can fetch the raiser attribute and it has no spec @@ -738,8 +747,7 @@ def existing(a, b): def test_signature_class(self): class Foo(object): - def __init__(self, a, b=3): - pass + def __init__(self, a, b=3): pass mock = create_autospec(Foo) @@ -765,10 +773,8 @@ class Foo(object): def test_signature_callable(self): class Callable(object): - def __init__(self, x, y): - pass - def __call__(self, a): - pass + def __init__(self, x, y): pass + def __call__(self, a): pass mock = create_autospec(Callable) mock(1, 2) @@ -824,8 +830,7 @@ class Foo(object): def test_autospec_functions_with_self_in_odd_place(self): class Foo(object): - def f(a, self): - pass + def f(a, self): pass a = create_autospec(Foo) a.f(10) @@ -842,12 +847,9 @@ def __init__(self, value): self.value = value def __get__(self, obj, cls=None): - if obj is None: - return self - return self.value + return self - def __set__(self, obj, value): - pass + def __set__(self, obj, value): pass class MyProperty(property): pass @@ -856,12 +858,10 @@ class Foo(object): __slots__ = ['slot'] @property - def prop(self): - return 3 + def prop(self): pass @MyProperty - def subprop(self): - return 4 + def subprop(self): pass desc = Descriptor(42) @@ -913,8 +913,7 @@ def __getattr__(self, attribute): def test_spec_inspect_signature(self): - def myfunc(x, y): - pass + def myfunc(x, y): pass mock = create_autospec(myfunc) mock(1, 2) @@ -930,6 +929,7 @@ def test_spec_inspect_signature_annotations(self): def foo(a: int, b: int=10, *, c:int) -> int: return a + b + c + self.assertEqual(foo(1, 2 , c=3), 6) mock = create_autospec(foo) mock(1, 2, c=3) mock(1, c=3) @@ -940,6 +940,42 @@ def foo(a: int, b: int=10, *, c:int) -> int: self.assertRaises(TypeError, mock, 1, 2, 3, c=4) + def test_spec_function_no_name(self): + func = lambda: 'nope' + mock = create_autospec(func) + self.assertEqual(mock.__name__, 'funcopy') + + + def test_spec_function_assert_has_calls(self): + def f(a): pass + mock = create_autospec(f) + mock(1) + mock.assert_has_calls([call(1)]) + with self.assertRaises(AssertionError): + mock.assert_has_calls([call(2)]) + + + def test_spec_function_assert_any_call(self): + def f(a): pass + mock = create_autospec(f) + mock(1) + mock.assert_any_call(1) + with self.assertRaises(AssertionError): + mock.assert_any_call(2) + + + def test_spec_function_reset_mock(self): + def f(a): pass + rv = Mock() + mock = create_autospec(f, return_value=rv) + mock(1)(2) + self.assertEqual(mock.mock_calls, [call(1)]) + self.assertEqual(rv.mock_calls, [call(2)]) + mock.reset_mock() + self.assertEqual(mock.mock_calls, []) + self.assertEqual(rv.mock_calls, []) + + class TestCallList(unittest.TestCase): def test_args_list_contains_call_list(self): @@ -1019,16 +1055,14 @@ def test_type(self): def test_call_magic_method(self): class Callable: - def __call__(self): - pass + def __call__(self): pass instance = Callable() self.assertTrue(_callable(instance)) def test_staticmethod(self): class WithStaticMethod: @staticmethod - def staticfunc(): - pass + def staticfunc(): pass self.assertTrue(_callable(WithStaticMethod.staticfunc)) def test_non_callable_staticmethod(self): @@ -1039,8 +1073,7 @@ class BadStaticMethod: def test_classmethod(self): class WithClassMethod: @classmethod - def classfunc(cls): - pass + def classfunc(cls): pass self.assertTrue(_callable(WithClassMethod.classfunc)) def test_non_callable_classmethod(self): diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py index 69dfe60f7eae..130a3397ba0d 100644 --- a/Lib/unittest/test/testmock/testmagicmethods.py +++ b/Lib/unittest/test/testmock/testmagicmethods.py @@ -305,8 +305,7 @@ def test_magic_methods_fspath(self): def test_magic_methods_and_spec(self): class Iterable(object): - def __iter__(self): - pass + def __iter__(self): pass mock = Mock(spec=Iterable) self.assertRaises(AttributeError, lambda: mock.__iter__) @@ -330,8 +329,7 @@ def set_int(): def test_magic_methods_and_spec_set(self): class Iterable(object): - def __iter__(self): - pass + def __iter__(self): pass mock = Mock(spec_set=Iterable) self.assertRaises(AttributeError, lambda: mock.__iter__) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 9bef51abd87f..5f917dd20f1d 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -28,16 +28,13 @@ def next(self): class Something(object): - def meth(self, a, b, c, d=None): - pass + def meth(self, a, b, c, d=None): pass @classmethod - def cmeth(cls, a, b, c, d=None): - pass + def cmeth(cls, a, b, c, d=None): pass @staticmethod - def smeth(a, b, c, d=None): - pass + def smeth(a, b, c, d=None): pass class MockTest(unittest.TestCase): @@ -83,6 +80,21 @@ def test_return_value_in_constructor(self): "return value in constructor not honoured") + def test_change_return_value_via_delegate(self): + def f(): pass + mock = create_autospec(f) + mock.mock.return_value = 1 + self.assertEqual(mock(), 1) + + + def test_change_side_effect_via_delegate(self): + def f(): pass + mock = create_autospec(f) + mock.mock.side_effect = TypeError() + with self.assertRaises(TypeError): + mock() + + def test_repr(self): mock = Mock(name='foo') self.assertIn('foo', repr(mock)) @@ -161,8 +173,7 @@ def test_autospec_side_effect(self): results = [1, 2, 3] def effect(): return results.pop() - def f(): - pass + def f(): pass mock = create_autospec(f) mock.side_effect = [1, 2, 3] @@ -177,8 +188,7 @@ def f(): def test_autospec_side_effect_exception(self): # Test for issue 23661 - def f(): - pass + def f(): pass mock = create_autospec(f) mock.side_effect = ValueError('Bazinga!') @@ -340,8 +350,7 @@ def test_assert_called_with_any(self): def test_assert_called_with_function_spec(self): - def f(a, b, c, d=None): - pass + def f(a, b, c, d=None): pass mock = Mock(spec=f) @@ -409,8 +418,7 @@ def test_assert_called_once_with_call_list(self): def test_assert_called_once_with_function_spec(self): - def f(a, b, c, d=None): - pass + def f(a, b, c, d=None): pass mock = Mock(spec=f) @@ -514,8 +522,7 @@ def test_from_spec(self): class Something(object): x = 3 __something__ = None - def y(self): - pass + def y(self): pass def test_attributes(mock): # should work @@ -601,8 +608,7 @@ def method(self): def test_customize_wrapped_object_with_side_effect_iterable(self): class Real(object): - def method(self): - raise NotImplementedError() + def method(self): pass real = Real() mock = Mock(wraps=real) @@ -615,8 +621,7 @@ def method(self): def test_customize_wrapped_object_with_side_effect_exception(self): class Real(object): - def method(self): - raise NotImplementedError() + def method(self): pass real = Real() mock = Mock(wraps=real) @@ -627,9 +632,7 @@ def method(self): def test_customize_wrapped_object_with_side_effect_function(self): class Real(object): - def method(self): - raise NotImplementedError() - + def method(self): pass def side_effect(): return sentinel.VALUE @@ -642,8 +645,7 @@ def side_effect(): def test_customize_wrapped_object_with_return_value(self): class Real(object): - def method(self): - raise NotImplementedError() + def method(self): pass real = Real() mock = Mock(wraps=real) @@ -655,8 +657,7 @@ def method(self): def test_customize_wrapped_object_with_return_value_and_side_effect(self): # side_effect should always take precedence over return_value. class Real(object): - def method(self): - raise NotImplementedError() + def method(self): pass real = Real() mock = Mock(wraps=real) @@ -671,8 +672,7 @@ def method(self): def test_customize_wrapped_object_with_return_value_and_side_effect2(self): # side_effect can return DEFAULT to default to return_value class Real(object): - def method(self): - raise NotImplementedError() + def method(self): pass real = Real() mock = Mock(wraps=real) @@ -684,8 +684,7 @@ def method(self): def test_customize_wrapped_object_with_return_value_and_side_effect_default(self): class Real(object): - def method(self): - raise NotImplementedError() + def method(self): pass real = Real() mock = Mock(wraps=real) @@ -764,6 +763,26 @@ class X(object): self.assertIsInstance(mock, X) + def test_spec_class_no_object_base(self): + class X: + pass + + mock = Mock(spec=X) + self.assertIsInstance(mock, X) + + mock = Mock(spec=X()) + self.assertIsInstance(mock, X) + + self.assertIs(mock.__class__, X) + self.assertEqual(Mock().__class__.__name__, 'Mock') + + mock = Mock(spec_set=X) + self.assertIsInstance(mock, X) + + mock = Mock(spec_set=X()) + self.assertIsInstance(mock, X) + + def test_setting_attribute_with_spec_set(self): class X(object): y = 3 @@ -902,15 +921,9 @@ def test_configure_mock(self): def assertRaisesWithMsg(self, exception, message, func, *args, **kwargs): # needed because assertRaisesRegex doesn't work easily with newlines - try: + with self.assertRaises(exception) as context: func(*args, **kwargs) - except: - instance = sys.exc_info()[1] - self.assertIsInstance(instance, exception) - else: - self.fail('Exception %r not raised' % (exception,)) - - msg = str(instance) + msg = str(context.exception) self.assertEqual(msg, message) @@ -1099,6 +1112,18 @@ def test_mock_call_repr(self): self.assertEqual(repr(m.mock_calls[2]), 'call.foo().bar().baz.bob()') + def test_mock_call_repr_loop(self): + m = Mock() + m.foo = m + repr(m.foo()) + self.assertRegex(repr(m.foo()), r"") + + + def test_mock_calls_contains(self): + m = Mock() + self.assertFalse([call()] in m.mock_calls) + + def test_subclassing(self): class Subclass(Mock): pass @@ -1312,8 +1337,7 @@ def test_assert_has_calls(self): def test_assert_has_calls_with_function_spec(self): - def f(a, b, c, d=None): - pass + def f(a, b, c, d=None): pass mock = Mock(spec=f) @@ -1371,8 +1395,7 @@ def test_assert_any_call(self): def test_assert_any_call_with_function_spec(self): - def f(a, b, c, d=None): - pass + def f(a, b, c, d=None): pass mock = Mock(spec=f) @@ -1391,8 +1414,7 @@ def f(a, b, c, d=None): def test_mock_calls_create_autospec(self): - def f(a, b): - pass + def f(a, b): pass obj = Iter() obj.f = f @@ -1417,12 +1439,10 @@ def test_create_autospec_with_name(self): def test_create_autospec_classmethod_and_staticmethod(self): class TestClass: @classmethod - def class_method(cls): - pass + def class_method(cls): pass @staticmethod - def static_method(): - pass + def static_method(): pass for method in ('class_method', 'static_method'): with self.subTest(method=method): mock_method = mock.create_autospec(getattr(TestClass, method)) @@ -1848,8 +1868,7 @@ def test_parent_attribute_of_call(self): def test_parent_propagation_with_create_autospec(self): - def foo(a, b): - pass + def foo(a, b): pass mock = Mock() mock.child = create_autospec(foo) @@ -1878,11 +1897,12 @@ def test_isinstance_under_settrace(self): with patch.dict('sys.modules'): del sys.modules['unittest.mock'] - def trace(frame, event, arg): + # This trace will stop coverage being measured ;-) + def trace(frame, event, arg): # pragma: no cover return trace + self.addCleanup(sys.settrace, sys.gettrace()) sys.settrace(trace) - self.addCleanup(sys.settrace, None) from unittest.mock import ( Mock, MagicMock, NonCallableMock, NonCallableMagicMock diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index e5abd9bda489..3295c5b2420e 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -43,31 +43,24 @@ def __delattr__(self, name): class Foo(object): - def __init__(self, a): - pass - def f(self, a): - pass - def g(self): - pass + def __init__(self, a): pass + def f(self, a): pass + def g(self): pass foo = 'bar' @staticmethod - def static_method(): - return 24 + def static_method(): pass @classmethod - def class_method(cls): - return 42 + def class_method(cls): pass class Bar(object): - def a(self): - pass + def a(self): pass foo_name = '%s.Foo' % __name__ -def function(a, b=Foo): - pass +def function(a, b=Foo): pass class Container(object): @@ -370,31 +363,19 @@ def test(): def test_patch_wont_create_by_default(self): - try: + with self.assertRaises(AttributeError): @patch('%s.frooble' % builtin_string, sentinel.Frooble) - def test(): - self.assertEqual(frooble, sentinel.Frooble) + def test(): pass test() - except AttributeError: - pass - else: - self.fail('Patching non existent attributes should fail') - self.assertRaises(NameError, lambda: frooble) def test_patchobject_wont_create_by_default(self): - try: + with self.assertRaises(AttributeError): @patch.object(SomeClass, 'ord', sentinel.Frooble) - def test(): - self.fail('Patching non existent attributes should fail') - + def test(): pass test() - except AttributeError: - pass - else: - self.fail('Patching non existent attributes should fail') self.assertFalse(hasattr(SomeClass, 'ord')) @@ -484,6 +465,9 @@ class Something(object): attribute = sentinel.Original class Foo(object): + + test_class_attr = 'whatever' + def test_method(other_self, mock_something): self.assertEqual(PTModule.something, mock_something, "unpatched") @@ -642,8 +626,7 @@ def test_name_preserved(self): @patch('%s.SomeClass' % __name__, object(), autospec=True) @patch.object(SomeClass, object()) @patch.dict(foo) - def some_name(): - pass + def some_name(): pass self.assertEqual(some_name.__name__, 'some_name') @@ -654,12 +637,9 @@ def test_patch_with_exception(self): @patch.dict(foo, {'a': 'b'}) def test(): raise NameError('Konrad') - try: + + with self.assertRaises(NameError): test() - except NameError: - pass - else: - self.fail('NameError not raised by test') self.assertEqual(foo, {}) @@ -689,49 +669,6 @@ def test(): support.target = original - def test_patch_descriptor(self): - # would be some effort to fix this - we could special case the - # builtin descriptors: classmethod, property, staticmethod - return - class Nothing(object): - foo = None - - class Something(object): - foo = {} - - @patch.object(Nothing, 'foo', 2) - @classmethod - def klass(cls): - self.assertIs(cls, Something) - - @patch.object(Nothing, 'foo', 2) - @staticmethod - def static(arg): - return arg - - @patch.dict(foo) - @classmethod - def klass_dict(cls): - self.assertIs(cls, Something) - - @patch.dict(foo) - @staticmethod - def static_dict(arg): - return arg - - # these will raise exceptions if patching descriptors is broken - self.assertEqual(Something.static('f00'), 'f00') - Something.klass() - self.assertEqual(Something.static_dict('f00'), 'f00') - Something.klass_dict() - - something = Something() - self.assertEqual(something.static('f00'), 'f00') - something.klass() - self.assertEqual(something.static_dict('f00'), 'f00') - something.klass_dict() - - def test_patch_spec_set(self): @patch('%s.SomeClass' % __name__, spec=SomeClass, spec_set=True) def test(MockClass): @@ -931,17 +868,13 @@ def test_patch_dict_keyword_args(self): def test_autospec(self): class Boo(object): - def __init__(self, a): - pass - def f(self, a): - pass - def g(self): - pass + def __init__(self, a): pass + def f(self, a): pass + def g(self): pass foo = 'bar' class Bar(object): - def a(self): - pass + def a(self): pass def _test(mock): mock(1) @@ -1488,20 +1421,17 @@ def test_nested_patch_failure(self): @patch.object(Foo, 'g', 1) @patch.object(Foo, 'missing', 1) @patch.object(Foo, 'f', 1) - def thing1(): - pass + def thing1(): pass @patch.object(Foo, 'missing', 1) @patch.object(Foo, 'g', 1) @patch.object(Foo, 'f', 1) - def thing2(): - pass + def thing2(): pass @patch.object(Foo, 'g', 1) @patch.object(Foo, 'f', 1) @patch.object(Foo, 'missing', 1) - def thing3(): - pass + def thing3(): pass for func in thing1, thing2, thing3: self.assertRaises(AttributeError, func) @@ -1520,20 +1450,17 @@ def crasher(): @patch.object(Foo, 'g', 1) @patch.object(Foo, 'foo', new_callable=crasher) @patch.object(Foo, 'f', 1) - def thing1(): - pass + def thing1(): pass @patch.object(Foo, 'foo', new_callable=crasher) @patch.object(Foo, 'g', 1) @patch.object(Foo, 'f', 1) - def thing2(): - pass + def thing2(): pass @patch.object(Foo, 'g', 1) @patch.object(Foo, 'f', 1) @patch.object(Foo, 'foo', new_callable=crasher) - def thing3(): - pass + def thing3(): pass for func in thing1, thing2, thing3: self.assertRaises(NameError, func) @@ -1559,8 +1486,7 @@ def test_patch_multiple_failure(self): patcher.additional_patchers = additionals @patcher - def func(): - pass + def func(): pass self.assertRaises(AttributeError, func) self.assertEqual(Foo.f, original_f) @@ -1588,8 +1514,7 @@ def crasher(): patcher.additional_patchers = additionals @patcher - def func(): - pass + def func(): pass self.assertRaises(NameError, func) self.assertEqual(Foo.f, original_f) @@ -1898,5 +1823,36 @@ def foo(*a, x=0): self.assertEqual(foo(), 1) self.assertEqual(foo(), 0) + def test_dotted_but_module_not_loaded(self): + # This exercises the AttributeError branch of _dot_lookup. + + # make sure it's there + import unittest.test.testmock.support + # now make sure it's not: + with patch.dict('sys.modules'): + del sys.modules['unittest.test.testmock.support'] + del sys.modules['unittest.test.testmock'] + del sys.modules['unittest.test'] + del sys.modules['unittest'] + + # now make sure we can patch based on a dotted path: + @patch('unittest.test.testmock.support.X') + def test(mock): + pass + test() + + + def test_invalid_target(self): + with self.assertRaises(TypeError): + patch('') + + + def test_cant_set_kwargs_when_passing_a_mock(self): + @patch('unittest.test.testmock.support.X', new=object(), x=1) + def test(): pass + with self.assertRaises(TypeError): + test() + + if __name__ == '__main__': unittest.main() diff --git a/Lib/unittest/test/testmock/testsealable.py b/Lib/unittest/test/testmock/testsealable.py index 0e72b32411c6..59f52338d411 100644 --- a/Lib/unittest/test/testmock/testsealable.py +++ b/Lib/unittest/test/testmock/testsealable.py @@ -3,15 +3,10 @@ class SampleObject: - def __init__(self): - self.attr_sample1 = 1 - self.attr_sample2 = 1 - def method_sample1(self): - pass + def method_sample1(self): pass - def method_sample2(self): - pass + def method_sample2(self): pass class TestSealable(unittest.TestCase): diff --git a/Lib/unittest/test/testmock/testwith.py b/Lib/unittest/test/testmock/testwith.py index ec4e540dcfd9..37100b8c1834 100644 --- a/Lib/unittest/test/testmock/testwith.py +++ b/Lib/unittest/test/testmock/testwith.py @@ -10,6 +10,8 @@ something_else = sentinel.SomethingElse +class SampleException(Exception): pass + class WithTest(unittest.TestCase): @@ -20,14 +22,10 @@ def test_with_statement(self): def test_with_statement_exception(self): - try: + with self.assertRaises(SampleException): with patch('%s.something' % __name__, sentinel.Something2): self.assertEqual(something, sentinel.Something2, "unpatched") - raise Exception('pow') - except Exception: - pass - else: - self.fail("patch swallowed exception") + raise SampleException() self.assertEqual(something, sentinel.Something) @@ -128,8 +126,7 @@ def test_dict_context_manager(self): def test_double_patch_instance_method(self): class C: - def f(self): - pass + def f(self): pass c = C() From webhook-mailer at python.org Wed May 1 20:48:17 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Thu, 02 May 2019 00:48:17 -0000 Subject: [Python-checkins] Move dangling bullet points into named subsections (GH-13046) Message-ID: https://github.com/python/cpython/commit/482b6b565af896cda0c78e5e266d11666c822d91 commit: 482b6b565af896cda0c78e5e266d11666c822d91 branch: master author: Raymond Hettinger committer: GitHub date: 2019-05-01T17:48:13-07:00 summary: Move dangling bullet points into named subsections (GH-13046) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 37570bcad526..30ee14c3610f 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -216,17 +216,6 @@ New Modules Improved Modules ================ -* The :meth:`_asdict()` method for :func:`collections.namedtuple` now returns - a :class:`dict` instead of a :class:`collections.OrderedDict`. This works because - regular dicts have guaranteed ordering in since Python 3.7. If the extra - features of :class:`OrderedDict` are required, the suggested remediation is - to cast the result to the desired type: ``OrderedDict(nt._asdict())``. - (Contributed by Raymond Hettinger in :issue:`35864`.) - -* The :mod:`unicodedata` module has been upgraded to use the `Unicode 12.0.0 - `_ - release. - asyncio ------- @@ -234,6 +223,17 @@ asyncio On Windows, the default event loop is now :class:`~asyncio.ProactorEventLoop`. +collections +----------- + +The :meth:`_asdict()` method for :func:`collections.namedtuple` now returns +a :class:`dict` instead of a :class:`collections.OrderedDict`. This works because +regular dicts have guaranteed ordering in since Python 3.7. If the extra +features of :class:`OrderedDict` are required, the suggested remediation is +to cast the result to the desired type: ``OrderedDict(nt._asdict())``. +(Contributed by Raymond Hettinger in :issue:`35864`.) + + ctypes ------ @@ -490,10 +490,15 @@ Added new clock :data:`~time.CLOCK_UPTIME_RAW` for macOS 10.12. unicodedata ----------- +* The :mod:`unicodedata` module has been upgraded to use the `Unicode 12.0.0 + `_ + release. + * New function :func:`~unicodedata.is_normalized` can be used to verify a string is in a specific normal form. (Contributed by Max Belanger and David Euresti in :issue:`32285`). + unittest -------- From webhook-mailer at python.org Wed May 1 20:49:16 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Thu, 02 May 2019 00:49:16 -0000 Subject: [Python-checkins] bpo-36018: Update example to show mean and stdev (GH-13047) Message-ID: https://github.com/python/cpython/commit/671d782f8dc52942dc8c48a513bf24ff8465b112 commit: 671d782f8dc52942dc8c48a513bf24ff8465b112 branch: master author: Raymond Hettinger committer: GitHub date: 2019-05-01T17:49:12-07:00 summary: bpo-36018: Update example to show mean and stdev (GH-13047) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 30ee14c3610f..c958fc36d667 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -424,8 +424,10 @@ and manipulating normal distributions of a random variable. :: >>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14]) - >>> temperature_feb - NormalDist(mu=6.0, sigma=6.356099432828281) + >>> temperature_feb.mean + 6.0 + >>> temperature_feb.stdev + 6.356099432828281 >>> temperature_feb.cdf(3) # Chance of being under 3 degrees 0.3184678262814532 @@ -433,8 +435,8 @@ and manipulating normal distributions of a random variable. >>> temperature_feb.pdf(7) / temperature_feb.pdf(10) 1.2039930378537762 - >>> el_nino = NormalDist(4, 2.5) - >>> temperature_feb += el_nino # Add in a climate effect + >>> el_ni?o = NormalDist(4, 2.5) + >>> temperature_feb += el_ni?o # Add in a climate effect >>> temperature_feb NormalDist(mu=10.0, sigma=6.830080526611674) From webhook-mailer at python.org Wed May 1 22:49:56 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 02:49:56 -0000 Subject: [Python-checkins] Change bisect to bisect_cmd in docstring (#13040) Message-ID: https://github.com/python/cpython/commit/11e4a941e9c6225776a986b05230a1963e83f4fb commit: 11e4a941e9c6225776a986b05230a1963e83f4fb branch: master author: Xtreak committer: Victor Stinner date: 2019-05-01T22:49:49-04:00 summary: Change bisect to bisect_cmd in docstring (#13040) files: M Lib/test/bisect_cmd.py diff --git a/Lib/test/bisect_cmd.py b/Lib/test/bisect_cmd.py index 968537e0f801..cb06480e7c91 100755 --- a/Lib/test/bisect_cmd.py +++ b/Lib/test/bisect_cmd.py @@ -4,17 +4,17 @@ Find the test_os test method which alters the environment: - ./python -m test.bisect --fail-env-changed test_os + ./python -m test.bisect_cmd --fail-env-changed test_os Find a reference leak in "test_os", write the list of failing tests into the "bisect" file: - ./python -m test.bisect -o bisect -R 3:3 test_os + ./python -m test.bisect_cmd -o bisect -R 3:3 test_os Load an existing list of tests from a file using -i option: ./python -m test --list-cases -m FileTests test_os > tests - ./python -m test.bisect -i tests test_os + ./python -m test.bisect_cmd -i tests test_os """ import argparse From webhook-mailer at python.org Wed May 1 23:01:44 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 02 May 2019 03:01:44 -0000 Subject: [Python-checkins] Change bisect to bisect_cmd in docstring (GH-13040) Message-ID: https://github.com/python/cpython/commit/74852b9794f65e8f605373b5b2ccbb6ec660d3d6 commit: 74852b9794f65e8f605373b5b2ccbb6ec660d3d6 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-01T20:01:41-07:00 summary: Change bisect to bisect_cmd in docstring (GH-13040) (cherry picked from commit 11e4a941e9c6225776a986b05230a1963e83f4fb) Co-authored-by: Xtreak files: M Lib/test/bisect_cmd.py diff --git a/Lib/test/bisect_cmd.py b/Lib/test/bisect_cmd.py index 1bf32ef06dd9..5028ed214fc9 100755 --- a/Lib/test/bisect_cmd.py +++ b/Lib/test/bisect_cmd.py @@ -4,17 +4,17 @@ Find the test_os test method which alters the environment: - ./python -m test.bisect --fail-env-changed test_os + ./python -m test.bisect_cmd --fail-env-changed test_os Find a reference leak in "test_os", write the list of failing tests into the "bisect" file: - ./python -m test.bisect -o bisect -R 3:3 test_os + ./python -m test.bisect_cmd -o bisect -R 3:3 test_os Load an existing list of tests from a file using -i option: ./python -m test --list-cases -m FileTests test_os > tests - ./python -m test.bisect -i tests test_os + ./python -m test.bisect_cmd -i tests test_os """ from __future__ import print_function From webhook-mailer at python.org Wed May 1 23:10:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 02 May 2019 03:10:16 -0000 Subject: [Python-checkins] Change bisect to bisect_cmd in docstring (GH-13040) Message-ID: https://github.com/python/cpython/commit/0ff08b061b2075ba258672409764face21321412 commit: 0ff08b061b2075ba258672409764face21321412 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-01T20:10:12-07:00 summary: Change bisect to bisect_cmd in docstring (GH-13040) (cherry picked from commit 11e4a941e9c6225776a986b05230a1963e83f4fb) Co-authored-by: Xtreak files: M Lib/test/bisect_cmd.py diff --git a/Lib/test/bisect_cmd.py b/Lib/test/bisect_cmd.py index 968537e0f801..cb06480e7c91 100755 --- a/Lib/test/bisect_cmd.py +++ b/Lib/test/bisect_cmd.py @@ -4,17 +4,17 @@ Find the test_os test method which alters the environment: - ./python -m test.bisect --fail-env-changed test_os + ./python -m test.bisect_cmd --fail-env-changed test_os Find a reference leak in "test_os", write the list of failing tests into the "bisect" file: - ./python -m test.bisect -o bisect -R 3:3 test_os + ./python -m test.bisect_cmd -o bisect -R 3:3 test_os Load an existing list of tests from a file using -i option: ./python -m test --list-cases -m FileTests test_os > tests - ./python -m test.bisect -i tests test_os + ./python -m test.bisect_cmd -i tests test_os """ import argparse From webhook-mailer at python.org Wed May 1 23:52:02 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 03:52:02 -0000 Subject: [Python-checkins] bpo-36763: Make _PyCoreConfig.check_hash_pycs_mode public (GH-13052) Message-ID: https://github.com/python/cpython/commit/cb9fbd35885a8921b9df99e801df4f82e3ba336b commit: cb9fbd35885a8921b9df99e801df4f82e3ba336b branch: master author: Victor Stinner committer: GitHub date: 2019-05-01T23:51:56-04:00 summary: bpo-36763: Make _PyCoreConfig.check_hash_pycs_mode public (GH-13052) _PyCoreConfig: Rename _check_hash_pycs_mode field to check_hash_pycs_mode (make it public) and change its type from "const char*" to "wchar_t*". files: M Include/cpython/coreconfig.h M Lib/test/test_embed.py M Programs/_testembed.c M Python/coreconfig.c M Python/import.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 5743bf5d0fa4..99388e635c75 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -363,7 +363,7 @@ typedef struct { Needed by freeze_importlib. */ int _install_importlib; - /* Value of the --check-hash-based-pycs configure option. Valid values: + /* Value of the --check-hash-based-pycs command line option: - "default" means the 'check_source' flag in hash-based pycs determines invalidation @@ -372,11 +372,10 @@ typedef struct { - "never" causes the interpreter to always assume hash-based pycs are valid - Set by the --check-hash-based-pycs command line option. The default value is "default". See PEP 552 "Deterministic pycs" for more details. */ - const char *_check_hash_pycs_mode; + wchar_t *check_hash_pycs_mode; /* If greater than 0, suppress _PyPathConfig_Calculate() warnings. @@ -418,7 +417,7 @@ typedef struct { .user_site_directory = -1, \ .buffered_stdio = -1, \ ._install_importlib = 1, \ - ._check_hash_pycs_mode = "default", \ + .check_hash_pycs_mode = NULL, \ ._frozen = -1, \ ._init_main = 1} /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index cd6027205a92..fb0051957aad 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -346,7 +346,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'run_filename': None, '_install_importlib': 1, - '_check_hash_pycs_mode': 'default', + 'check_hash_pycs_mode': 'default', '_frozen': 0, '_init_main': 1, } @@ -577,7 +577,7 @@ def test_init_from_config(self): 'user_site_directory': 0, 'faulthandler': 1, - '_check_hash_pycs_mode': 'always', + 'check_hash_pycs_mode': 'always', '_frozen': 1, } self.check_config("init_from_config", config, preconfig) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3fc8e6d8c6b2..6e764e3b6cce 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -495,7 +495,7 @@ static int test_init_from_config(void) Py_NoUserSiteDirectory = 0; config.user_site_directory = 0; - config._check_hash_pycs_mode = "always"; + config.check_hash_pycs_mode = L"always"; Py_FrozenFlag = 0; config._frozen = 1; diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 7f388cbcdd0e..1cb4b52e600e 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -516,6 +516,7 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) CLEAR(config->run_command); CLEAR(config->run_module); CLEAR(config->run_filename); + CLEAR(config->check_hash_pycs_mode); #undef CLEAR } @@ -686,7 +687,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_WSTR_ATTR(run_command); COPY_WSTR_ATTR(run_module); COPY_WSTR_ATTR(run_filename); - COPY_ATTR(_check_hash_pycs_mode); + COPY_WSTR_ATTR(check_hash_pycs_mode); COPY_ATTR(_frozen); COPY_ATTR(_init_main); @@ -792,7 +793,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_WSTR(run_module); SET_ITEM_WSTR(run_filename); SET_ITEM_INT(_install_importlib); - SET_ITEM_STR(_check_hash_pycs_mode); + SET_ITEM_WSTR(check_hash_pycs_mode); SET_ITEM_INT(_frozen); SET_ITEM_INT(_init_main); @@ -1711,6 +1712,7 @@ static _PyInitError config_parse_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline, _PyWstrList *warnoptions) { + _PyInitError err; const _PyWstrList *argv = &precmdline->argv; int print_version = 0; @@ -1757,12 +1759,15 @@ config_parse_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline, case 0: // Handle long option. assert(longindex == 0); // Only one long option now. - if (!wcscmp(_PyOS_optarg, L"always")) { - config->_check_hash_pycs_mode = "always"; - } else if (!wcscmp(_PyOS_optarg, L"never")) { - config->_check_hash_pycs_mode = "never"; - } else if (!wcscmp(_PyOS_optarg, L"default")) { - config->_check_hash_pycs_mode = "default"; + if (wcscmp(_PyOS_optarg, L"always") == 0 + || wcscmp(_PyOS_optarg, L"never") == 0 + || wcscmp(_PyOS_optarg, L"default") == 0) + { + err = _PyCoreConfig_SetWideString(&config->check_hash_pycs_mode, + _PyOS_optarg); + if (_Py_INIT_FAILED(err)) { + return err; + } } else { fprintf(stderr, "--check-hash-based-pycs must be one of " "'default', 'always', or 'never'\n"); @@ -2131,6 +2136,13 @@ config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) goto done; } + if (config->check_hash_pycs_mode == NULL) { + err = _PyCoreConfig_SetWideString(&config->check_hash_pycs_mode, L"default"); + if (_Py_INIT_FAILED(err)) { + goto done; + } + } + err = _Py_INIT_OK(); done: @@ -2254,7 +2266,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config) #ifdef MS_WINDOWS assert(config->legacy_windows_stdio >= 0); #endif - assert(config->_check_hash_pycs_mode != NULL); + assert(config->check_hash_pycs_mode != NULL); assert(config->_install_importlib >= 0); assert(config->_frozen >= 0); diff --git a/Python/import.c b/Python/import.c index 3b2090b963dd..b03bc98773ae 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2305,7 +2305,7 @@ PyInit__imp(void) if (d == NULL) goto failure; _PyCoreConfig *config = &_PyInterpreterState_Get()->core_config; - PyObject *pyc_mode = PyUnicode_FromString(config->_check_hash_pycs_mode); + PyObject *pyc_mode = PyUnicode_FromWideChar(config->check_hash_pycs_mode, -1); if (pyc_mode == NULL) { goto failure; } From webhook-mailer at python.org Thu May 2 04:18:02 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Thu, 02 May 2019 08:18:02 -0000 Subject: [Python-checkins] regarding to grammar and spell check (#13020) Message-ID: https://github.com/python/cpython/commit/5f2b3b036744d8a397e9c3c32186b9fdb8cf106a commit: 5f2b3b036744d8a397e9c3c32186b9fdb8cf106a branch: master author: Hossein Pourbozorg committer: Andrew Svetlov date: 2019-05-02T04:17:55-04:00 summary: regarding to grammar and spell check (#13020) files: M README.rst diff --git a/README.rst b/README.rst index 65cca826dd2d..0f0c32b7cf50 100644 --- a/README.rst +++ b/README.rst @@ -70,7 +70,7 @@ to find out more. On macOS and Cygwin, the executable is called ``python.exe``; elsewhere it's just ``python``. If you are running on macOS with the latest updates installed, make sure to install -openSSL or some other SSL software along with Homebrew or another package manager. +OpenSSL or some other SSL software along with Homebrew or another package manager. If issues persist, see https://devguide.python.org/setup/#macos-and-os-x for more information. @@ -92,7 +92,7 @@ For example:: make test (This will fail if you *also* built at the top-level directory. You should do -a ``make clean`` at the toplevel first.) +a ``make clean`` at the top-level first.) To get an optimized build of Python, ``configure --enable-optimizations`` before you run ``make``. This sets the default make targets up to enable @@ -146,7 +146,7 @@ detailed change log, read `Misc/NEWS accounting of changes can only be gleaned from the `commit history `_. -If you want to install multiple versions of Python see the section below +If you want to install multiple versions of Python, see the section below entitled "Installing multiple versions". From webhook-mailer at python.org Thu May 2 04:21:04 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 02 May 2019 08:21:04 -0000 Subject: [Python-checkins] Fix tiny tiny typo in 3.8 what's new (GH-13049) Message-ID: https://github.com/python/cpython/commit/05222914403c1e2a656c753fbcd20f844af9dd69 commit: 05222914403c1e2a656c753fbcd20f844af9dd69 branch: master author: Daniel Porteous committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-02T01:20:58-07:00 summary: Fix tiny tiny typo in 3.8 what's new (GH-13049) I feel silly even making such a tiny typo fix, but I couldn't help but notice it. files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index c958fc36d667..82be92786ab0 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -227,8 +227,8 @@ collections ----------- The :meth:`_asdict()` method for :func:`collections.namedtuple` now returns -a :class:`dict` instead of a :class:`collections.OrderedDict`. This works because -regular dicts have guaranteed ordering in since Python 3.7. If the extra +a :class:`dict` instead of a :class:`collections.OrderedDict`. This works because +regular dicts have guaranteed ordering since Python 3.7. If the extra features of :class:`OrderedDict` are required, the suggested remediation is to cast the result to the desired type: ``OrderedDict(nt._asdict())``. (Contributed by Raymond Hettinger in :issue:`35864`.) From webhook-mailer at python.org Thu May 2 04:35:16 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Thu, 02 May 2019 08:35:16 -0000 Subject: [Python-checkins] bpo-13611: Include C14N 2.0 test data in installation (GH-13053) Message-ID: https://github.com/python/cpython/commit/0d5864fa07ab4f03188c690a5eb07bdd1fd1cb9c commit: 0d5864fa07ab4f03188c690a5eb07bdd1fd1cb9c branch: master author: Stefan Behnel committer: GitHub date: 2019-05-02T10:35:02+02:00 summary: bpo-13611: Include C14N 2.0 test data in installation (GH-13053) * Include C14N 2.0 test data in installation. * Add README file to the C14N test data directory to reference the original source and licensing conditions. files: A Lib/test/xmltestdata/c14n-20/README M Makefile.pre.in diff --git a/Lib/test/xmltestdata/c14n-20/README b/Lib/test/xmltestdata/c14n-20/README new file mode 100644 index 000000000000..06e637045420 --- /dev/null +++ b/Lib/test/xmltestdata/c14n-20/README @@ -0,0 +1,14 @@ +C14N 2.0 test files +=================== + +This directory contains files from the draft note document listing +test cases for the W3C C14N 2.0 specification: +https://www.w3.org/TR/xml-c14n2-testcases/ + +Direct source: +https://www.w3.org/TR/xml-c14n2-testcases/files/ + +Copied and distributed under these terms: + +Copyright ? 2013 W3C? (MIT, ERCIM, Keio, Beihang), +http://www.w3.org/Consortium/Legal/2015/doc-license diff --git a/Makefile.pre.in b/Makefile.pre.in index 619e3fb3645e..75eb66be3c01 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1296,7 +1296,8 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ tkinter/test/test_ttk site-packages test \ test/audiodata \ test/capath test/data \ - test/cjkencodings test/decimaltestdata test/xmltestdata \ + test/cjkencodings test/decimaltestdata \ + test/xmltestdata test/xmltestdata/c14n-20 \ test/dtracedata \ test/eintrdata \ test/imghdrdata \ From webhook-mailer at python.org Thu May 2 11:04:05 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 02 May 2019 15:04:05 -0000 Subject: [Python-checkins] bpo-14546: Fix the argument handling in Tools/scripts/lll.py (GH-13026) Message-ID: https://github.com/python/cpython/commit/c4e78b116f9a4299f3b3bfbbd18ef49782bb1143 commit: c4e78b116f9a4299f3b3bfbbd18ef49782bb1143 branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-05-02T18:03:43+03:00 summary: bpo-14546: Fix the argument handling in Tools/scripts/lll.py (GH-13026) files: A Lib/test/test_tools/test_lll.py A Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst M Tools/scripts/lll.py diff --git a/Lib/test/test_tools/test_lll.py b/Lib/test/test_tools/test_lll.py new file mode 100644 index 000000000000..a8f6d5f1f43c --- /dev/null +++ b/Lib/test/test_tools/test_lll.py @@ -0,0 +1,38 @@ +"""Tests for the lll script in the Tools/script directory.""" + +import os +import tempfile +from test import support +from test.test_tools import skip_if_missing, import_tool +import unittest + +skip_if_missing() + + +class lllTests(unittest.TestCase): + + def setUp(self): + self.lll = import_tool('lll') + + def test_lll_multiple_dirs(self): + with tempfile.TemporaryDirectory() as dir1, \ + tempfile.TemporaryDirectory() as dir2: + fn1 = os.path.join(dir1, 'foo1') + fn2 = os.path.join(dir2, 'foo2') + for fn, dir in (fn1, dir1), (fn2, dir2): + open(fn, 'w').close() + os.symlink(fn, os.path.join(dir, 'symlink')) + + with support.captured_stdout() as output: + self.lll.main([dir1, dir2]) + self.assertEqual(output.getvalue(), + f'{dir1}:\n' + f'symlink -> {fn1}\n' + f'\n' + f'{dir2}:\n' + f'symlink -> {fn2}\n' + ) + + +if __name__ == '__main__': + unittest.main() diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst b/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst new file mode 100644 index 000000000000..b8659b886af8 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst @@ -0,0 +1 @@ +Fix the argument handling in Tools/scripts/lll.py. diff --git a/Tools/scripts/lll.py b/Tools/scripts/lll.py index aa4e55091e59..1b48eac8aad8 100755 --- a/Tools/scripts/lll.py +++ b/Tools/scripts/lll.py @@ -13,8 +13,7 @@ def lll(dirname): full = os.path.join(dirname, name) if os.path.islink(full): print(name, '->', os.readlink(full)) -def main(): - args = sys.argv[1:] +def main(args): if not args: args = [os.curdir] first = 1 for arg in args: @@ -22,7 +21,7 @@ def main(): if not first: print() first = 0 print(arg + ':') - lll(arg) + lll(arg) if __name__ == '__main__': - main() + main(sys.argv[1:]) From webhook-mailer at python.org Thu May 2 11:29:01 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 15:29:01 -0000 Subject: [Python-checkins] bpo-36775: Add _Py_FORCE_UTF8_FS_ENCODING macro (GH-13056) Message-ID: https://github.com/python/cpython/commit/e251095a3f4778102f554cecffcfd837f4d1db6c commit: e251095a3f4778102f554cecffcfd837f4d1db6c branch: master author: Victor Stinner committer: GitHub date: 2019-05-02T11:28:57-04:00 summary: bpo-36775: Add _Py_FORCE_UTF8_FS_ENCODING macro (GH-13056) Add _Py_FORCE_UTF8_LOCALE and _Py_FORCE_UTF8_FS_ENCODING macros to avoid factorize "#if defined(__ANDROID__) || defined(__VXWORKS__)" and "#if defined(__APPLE__)". Cleanup also config_init_fs_encoding(). files: M Include/pyport.h M Objects/unicodeobject.c M Python/coreconfig.c M Python/fileutils.c M Python/pylifecycle.c diff --git a/Include/pyport.h b/Include/pyport.h index 568ab8f757d2..97fb5e59f9e5 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -819,4 +819,14 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; # error "Py_TRACE_REFS ABI is not compatible with release and debug ABI" #endif +#if defined(__ANDROID__) || defined(__VXWORKS__) + /* Ignore the locale encoding: force UTF-8 */ +# define _Py_FORCE_UTF8_LOCALE +#endif + +#if defined(_Py_FORCE_UTF8_LOCALE) || defined(__APPLE__) + /* Use UTF-8 as filesystem encoding */ +# define _Py_FORCE_UTF8_FS_ENCODING +#endif + #endif /* Py_PYPORT_H */ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index f6e68c94df55..9991362a3330 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3506,7 +3506,7 @@ PyUnicode_EncodeFSDefault(PyObject *unicode) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); const _PyCoreConfig *config = &interp->core_config; -#if defined(__APPLE__) +#ifdef _Py_FORCE_UTF8_FS_ENCODING return _PyUnicode_AsUTF8String(unicode, config->filesystem_errors); #else /* Bootstrap check: if the filesystem codec is implemented in Python, we @@ -3730,7 +3730,7 @@ PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); const _PyCoreConfig *config = &interp->core_config; -#if defined(__APPLE__) +#ifdef _Py_FORCE_UTF8_FS_ENCODING return PyUnicode_DecodeUTF8Stateful(s, size, config->filesystem_errors, NULL); #else /* Bootstrap check: if the filesystem codec is implemented in Python, we diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 1cb4b52e600e..c40c1f859ec2 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1313,7 +1313,7 @@ config_get_locale_encoding(char **locale_encoding) #ifdef MS_WINDOWS char encoding[20]; PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); -#elif defined(__ANDROID__) || defined(__VXWORKS__) +#elif defined(_Py_FORCE_UTF8_LOCALE) const char *encoding = "UTF-8"; #else const char *encoding = nl_langinfo(CODESET); @@ -1450,66 +1450,40 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) { _PyInitError err; -#ifdef MS_WINDOWS - if (preconfig->legacy_windows_fs_encoding) { - /* Legacy Windows filesystem encoding: mbcs/replace */ - if (config->filesystem_encoding == NULL) { - err = _PyCoreConfig_SetString(&config->filesystem_encoding, - "mbcs"); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - if (config->filesystem_errors == NULL) { - err = _PyCoreConfig_SetString(&config->filesystem_errors, - "replace"); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - } - - /* Windows defaults to utf-8/surrogatepass (PEP 529). - - Note: UTF-8 Mode takes the same code path and the Legacy Windows FS - encoding has the priortiy over UTF-8 Mode. */ if (config->filesystem_encoding == NULL) { +#ifdef _Py_FORCE_UTF8_FS_ENCODING err = _PyCoreConfig_SetString(&config->filesystem_encoding, "utf-8"); - if (_Py_INIT_FAILED(err)) { - return err; - } - } +#else - if (config->filesystem_errors == NULL) { - err = _PyCoreConfig_SetString(&config->filesystem_errors, - "surrogatepass"); - if (_Py_INIT_FAILED(err)) { - return err; +#ifdef MS_WINDOWS + if (preconfig->legacy_windows_fs_encoding) { + /* Legacy Windows filesystem encoding: mbcs/replace */ + err = _PyCoreConfig_SetString(&config->filesystem_encoding, + "mbcs"); } - } -#else - if (config->filesystem_encoding == NULL) { + else +#endif if (preconfig->utf8_mode) { - /* UTF-8 Mode use: utf-8/surrogateescape */ err = _PyCoreConfig_SetString(&config->filesystem_encoding, "utf-8"); - /* errors defaults to surrogateescape above */ } +#ifndef MS_WINDOWS else if (_Py_GetForceASCII()) { err = _PyCoreConfig_SetString(&config->filesystem_encoding, "ascii"); } +#endif else { - /* macOS and Android use UTF-8, - other platforms use the locale encoding. */ -#if defined(__APPLE__) || defined(__ANDROID__) +#ifdef MS_WINDOWS + /* Windows defaults to utf-8/surrogatepass (PEP 529). */ err = _PyCoreConfig_SetString(&config->filesystem_encoding, "utf-8"); #else err = config_get_locale_encoding(&config->filesystem_encoding); #endif } +#endif /* !_Py_FORCE_UTF8_FS_ENCODING */ if (_Py_INIT_FAILED(err)) { return err; @@ -1517,14 +1491,22 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) } if (config->filesystem_errors == NULL) { - /* by default, use the "surrogateescape" error handler */ - err = _PyCoreConfig_SetString(&config->filesystem_errors, - "surrogateescape"); + const char *errors; +#ifdef MS_WINDOWS + if (preconfig->legacy_windows_fs_encoding) { + errors = "replace"; + } + else { + errors = "surrogatepass"; + } +#else + errors = "surrogateescape"; +#endif + err = _PyCoreConfig_SetString(&config->filesystem_errors, errors); if (_Py_INIT_FAILED(err)) { return err; } } -#endif return _Py_INIT_OK(); } diff --git a/Python/fileutils.c b/Python/fileutils.c index b933874193b4..dfad48edb81a 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -85,7 +85,7 @@ _Py_device_encoding(int fd) Py_RETURN_NONE; } -#if !defined(__APPLE__) && !defined(__ANDROID__) && !defined(MS_WINDOWS) +#if !defined(_Py_FORCE_UTF8_FS_ENCODING) && !defined(MS_WINDOWS) #define USE_FORCE_ASCII @@ -309,7 +309,7 @@ _Py_ResetForceASCII(void) { /* nothing to do */ } -#endif /* !defined(__APPLE__) && !defined(__ANDROID__) && !defined(MS_WINDOWS) */ +#endif /* !defined(_Py_FORCE_UTF8_FS_ENCODING) && !defined(MS_WINDOWS) */ #if !defined(HAVE_MBRTOWC) || defined(USE_FORCE_ASCII) @@ -536,7 +536,7 @@ _Py_DecodeLocaleEx(const char* arg, wchar_t **wstr, size_t *wlen, int current_locale, _Py_error_handler errors) { if (current_locale) { -#if defined(__ANDROID__) || defined(__VXWORKS__) +#ifdef _Py_FORCE_UTF8_LOCALE return _Py_DecodeUTF8Ex(arg, strlen(arg), wstr, wlen, reason, errors); #else @@ -544,7 +544,7 @@ _Py_DecodeLocaleEx(const char* arg, wchar_t **wstr, size_t *wlen, #endif } -#if defined(__APPLE__) || defined(__ANDROID__) || defined(__VXWORKS__) +#ifdef _Py_FORCE_UTF8_FS_ENCODING return _Py_DecodeUTF8Ex(arg, strlen(arg), wstr, wlen, reason, errors); #else @@ -569,7 +569,7 @@ _Py_DecodeLocaleEx(const char* arg, wchar_t **wstr, size_t *wlen, #endif return decode_current_locale(arg, wstr, wlen, reason, errors); -#endif /* __APPLE__ or __ANDROID__ or __VXWORKS__ */ +#endif /* !_Py_FORCE_UTF8_FS_ENCODING */ } @@ -727,7 +727,7 @@ encode_locale_ex(const wchar_t *text, char **str, size_t *error_pos, int raw_malloc, int current_locale, _Py_error_handler errors) { if (current_locale) { -#ifdef __ANDROID__ +#ifdef _Py_FORCE_UTF8_LOCALE return _Py_EncodeUTF8Ex(text, str, error_pos, reason, raw_malloc, errors); #else @@ -736,7 +736,7 @@ encode_locale_ex(const wchar_t *text, char **str, size_t *error_pos, #endif } -#if defined(__APPLE__) || defined(__ANDROID__) +#ifdef _Py_FORCE_UTF8_FS_ENCODING return _Py_EncodeUTF8Ex(text, str, error_pos, reason, raw_malloc, errors); #else @@ -762,7 +762,7 @@ encode_locale_ex(const wchar_t *text, char **str, size_t *error_pos, return encode_current_locale(text, str, error_pos, reason, raw_malloc, errors); -#endif /* __APPLE__ or __ANDROID__ */ +#endif /* _Py_FORCE_UTF8_FS_ENCODING */ } static char* diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index afa683b7e841..40eeebdd1a7f 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -366,8 +366,7 @@ _Py_CoerceLegacyLocale(int warn) const char *new_locale = setlocale(LC_CTYPE, target->locale_name); if (new_locale != NULL) { -#if !defined(__APPLE__) && !defined(__ANDROID__) && \ -defined(HAVE_LANGINFO_H) && defined(CODESET) +#if !defined(_Py_FORCE_UTF8_LOCALE) && defined(HAVE_LANGINFO_H) && defined(CODESET) /* Also ensure that nl_langinfo works in this locale */ char *codeset = nl_langinfo(CODESET); if (!codeset || *codeset == '\0') { From webhook-mailer at python.org Thu May 2 11:54:26 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 15:54:26 -0000 Subject: [Python-checkins] bpo-36775: Add _PyUnicode_InitEncodings() (GH-13057) Message-ID: https://github.com/python/cpython/commit/43fc3bb7cf0278735eb0010d7b3043775a120cb5 commit: 43fc3bb7cf0278735eb0010d7b3043775a120cb5 branch: master author: Victor Stinner committer: GitHub date: 2019-05-02T11:54:20-04:00 summary: bpo-36775: Add _PyUnicode_InitEncodings() (GH-13057) Move get_codec_name() and initfsencoding() from pylifecycle.c to unicodeobject.c. Rename also "init" functions in pylifecycle.c. files: M Include/internal/pycore_pylifecycle.h M Objects/unicodeobject.c M Python/pylifecycle.c diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index f5da1431d94c..a2383d476ee9 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -16,10 +16,11 @@ PyAPI_DATA(int) _Py_UnhandledKeyboardInterrupt; PyAPI_FUNC(int) _Py_UnixMain(int argc, char **argv); -PyAPI_FUNC(int) _Py_SetFileSystemEncoding( +extern int _Py_SetFileSystemEncoding( const char *encoding, const char *errors); -PyAPI_FUNC(void) _Py_ClearFileSystemEncoding(void); +extern void _Py_ClearFileSystemEncoding(void); +extern _PyInitError _PyUnicode_InitEncodings(PyInterpreterState *interp); PyAPI_FUNC(void) _Py_ClearStandardStreamEncoding(void); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 9991362a3330..5b6b241cb62b 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -42,6 +42,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "Python.h" #include "pycore_fileutils.h" #include "pycore_object.h" +#include "pycore_pylifecycle.h" #include "pycore_pystate.h" #include "ucnhash.h" #include "bytes_methods.h" @@ -15574,6 +15575,102 @@ PyUnicode_AsUnicodeCopy(PyObject *unicode) } +static char* +get_codec_name(const char *encoding) +{ + PyObject *codec, *name_obj = NULL; + + codec = _PyCodec_Lookup(encoding); + if (!codec) + goto error; + + name_obj = PyObject_GetAttrString(codec, "name"); + Py_CLEAR(codec); + if (!name_obj) { + goto error; + } + + const char *name_utf8 = PyUnicode_AsUTF8(name_obj); + if (name_utf8 == NULL) { + goto error; + } + + char *name = _PyMem_RawStrdup(name_utf8); + Py_DECREF(name_obj); + if (name == NULL) { + PyErr_NoMemory(); + return NULL; + } + return name; + +error: + Py_XDECREF(codec); + Py_XDECREF(name_obj); + return NULL; +} + + +static _PyInitError +init_stdio_encoding(PyInterpreterState *interp) +{ + _PyCoreConfig *config = &interp->core_config; + + char *codec_name = get_codec_name(config->stdio_encoding); + if (codec_name == NULL) { + return _Py_INIT_ERR("failed to get the Python codec name " + "of the stdio encoding"); + } + PyMem_RawFree(config->stdio_encoding); + config->stdio_encoding = codec_name; + return _Py_INIT_OK(); +} + + +static _PyInitError +init_fs_encoding(PyInterpreterState *interp) +{ + _PyCoreConfig *config = &interp->core_config; + + char *encoding = get_codec_name(config->filesystem_encoding); + if (encoding == NULL) { + /* Such error can only occurs in critical situations: no more + memory, import a module of the standard library failed, etc. */ + return _Py_INIT_ERR("failed to get the Python codec " + "of the filesystem encoding"); + } + + /* Update the filesystem encoding to the normalized Python codec name. + For example, replace "ANSI_X3.4-1968" (locale encoding) with "ascii" + (Python codec name). */ + PyMem_RawFree(config->filesystem_encoding); + config->filesystem_encoding = encoding; + + /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors + global configuration variables. */ + if (_Py_SetFileSystemEncoding(config->filesystem_encoding, + config->filesystem_errors) < 0) { + return _Py_INIT_NO_MEMORY(); + } + + /* PyUnicode can now use the Python codec rather than C implementation + for the filesystem encoding */ + interp->fscodec_initialized = 1; + return _Py_INIT_OK(); +} + + +_PyInitError +_PyUnicode_InitEncodings(PyInterpreterState *interp) +{ + _PyInitError err = init_fs_encoding(interp); + if (_Py_INIT_FAILED(err)) { + return err; + } + + return init_stdio_encoding(interp); +} + + void _PyUnicode_Fini(void) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 40eeebdd1a7f..01ef027b9d86 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -59,10 +59,9 @@ extern grammar _PyParser_Grammar; /* From graminit.c */ /* Forward */ static _PyInitError add_main_module(PyInterpreterState *interp); -static _PyInitError initfsencoding(PyInterpreterState *interp); -static _PyInitError initsite(void); +static _PyInitError init_import_size(void); static _PyInitError init_sys_streams(PyInterpreterState *interp); -static _PyInitError initsigs(void); +static _PyInitError init_signals(void); static void call_py_exitfuncs(PyInterpreterState *); static void wait_for_thread_shutdown(void); static void call_ll_exitfuncs(_PyRuntimeState *runtime); @@ -144,42 +143,8 @@ Py_IsInitialized(void) */ -static char* -get_codec_name(const char *encoding) -{ - const char *name_utf8; - char *name_str; - PyObject *codec, *name = NULL; - - codec = _PyCodec_Lookup(encoding); - if (!codec) - goto error; - - name = _PyObject_GetAttrId(codec, &PyId_name); - Py_CLEAR(codec); - if (!name) - goto error; - - name_utf8 = PyUnicode_AsUTF8(name); - if (name_utf8 == NULL) - goto error; - name_str = _PyMem_RawStrdup(name_utf8); - Py_DECREF(name); - if (name_str == NULL) { - PyErr_NoMemory(); - return NULL; - } - return name_str; - -error: - Py_XDECREF(codec); - Py_XDECREF(name); - return NULL; -} - - static _PyInitError -initimport(PyInterpreterState *interp, PyObject *sysmod) +init_importlib(PyInterpreterState *interp, PyObject *sysmod) { PyObject *importlib; PyObject *impmod; @@ -229,7 +194,7 @@ initimport(PyInterpreterState *interp, PyObject *sysmod) } static _PyInitError -initexternalimport(PyInterpreterState *interp) +init_importlib_external(PyInterpreterState *interp) { PyObject *value; value = PyObject_CallMethod(interp->importlib, @@ -661,7 +626,7 @@ pycore_init_import_warnings(PyInterpreterState *interp, PyObject *sysmod) /* This call sets up builtin and frozen import support */ if (interp->core_config._install_importlib) { - err = initimport(interp, sysmod); + err = init_importlib(interp, sysmod); if (_Py_INIT_FAILED(err)) { return err; } @@ -940,7 +905,7 @@ _Py_InitializeMainInterpreter(_PyRuntimeState *runtime, return _Py_INIT_ERR("can't finish initializing sys"); } - _PyInitError err = initexternalimport(interp); + _PyInitError err = init_importlib_external(interp); if (_Py_INIT_FAILED(err)) { return err; } @@ -951,13 +916,13 @@ _Py_InitializeMainInterpreter(_PyRuntimeState *runtime, return err; } - err = initfsencoding(interp); + err = _PyUnicode_InitEncodings(interp); if (_Py_INIT_FAILED(err)) { return err; } if (core_config->install_signal_handlers) { - err = initsigs(); /* Signal handling stuff, including initintr() */ + err = init_signals(); if (_Py_INIT_FAILED(err)) { return err; } @@ -992,7 +957,7 @@ _Py_InitializeMainInterpreter(_PyRuntimeState *runtime, runtime->initialized = 1; if (core_config->site_import) { - err = initsite(); /* Module site */ + err = init_import_size(); /* Module site */ if (_Py_INIT_FAILED(err)) { return err; } @@ -1497,17 +1462,17 @@ new_interpreter(PyThreadState **tstate_p) return err; } - err = initimport(interp, sysmod); + err = init_importlib(interp, sysmod); if (_Py_INIT_FAILED(err)) { return err; } - err = initexternalimport(interp); + err = init_importlib_external(interp); if (_Py_INIT_FAILED(err)) { return err; } - err = initfsencoding(interp); + err = _PyUnicode_InitEncodings(interp); if (_Py_INIT_FAILED(err)) { return err; } @@ -1523,7 +1488,7 @@ new_interpreter(PyThreadState **tstate_p) } if (core_config->site_import) { - err = initsite(); + err = init_import_size(); if (_Py_INIT_FAILED(err)) { return err; } @@ -1649,42 +1614,10 @@ add_main_module(PyInterpreterState *interp) return _Py_INIT_OK(); } -static _PyInitError -initfsencoding(PyInterpreterState *interp) -{ - _PyCoreConfig *config = &interp->core_config; - - char *encoding = get_codec_name(config->filesystem_encoding); - if (encoding == NULL) { - /* Such error can only occurs in critical situations: no more - memory, import a module of the standard library failed, etc. */ - return _Py_INIT_ERR("failed to get the Python codec " - "of the filesystem encoding"); - } - - /* Update the filesystem encoding to the normalized Python codec name. - For example, replace "ANSI_X3.4-1968" (locale encoding) with "ascii" - (Python codec name). */ - PyMem_RawFree(config->filesystem_encoding); - config->filesystem_encoding = encoding; - - /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors - global configuration variables. */ - if (_Py_SetFileSystemEncoding(config->filesystem_encoding, - config->filesystem_errors) < 0) { - return _Py_INIT_NO_MEMORY(); - } - - /* PyUnicode can now use the Python codec rather than C implementation - for the filesystem encoding */ - interp->fscodec_initialized = 1; - return _Py_INIT_OK(); -} - /* Import the site module (not into __main__ though) */ static _PyInitError -initsite(void) +init_import_size(void) { PyObject *m; m = PyImport_ImportModule("site"); @@ -1880,14 +1813,6 @@ init_sys_streams(PyInterpreterState *interp) } #endif - char *codec_name = get_codec_name(config->stdio_encoding); - if (codec_name == NULL) { - return _Py_INIT_ERR("failed to get the Python codec name " - "of the stdio encoding"); - } - PyMem_RawFree(config->stdio_encoding); - config->stdio_encoding = codec_name; - /* Hack to avoid a nasty recursion issue when Python is invoked in verbose mode: pre-import the Latin-1 and UTF-8 codecs */ if ((m = PyImport_ImportModule("encodings.utf_8")) == NULL) { @@ -2287,7 +2212,7 @@ Py_Exit(int sts) } static _PyInitError -initsigs(void) +init_signals(void) { #ifdef SIGPIPE PyOS_setsig(SIGPIPE, SIG_IGN); From webhook-mailer at python.org Thu May 2 12:00:39 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 02 May 2019 16:00:39 -0000 Subject: [Python-checkins] bpo-9194: Fix the bounds checking in winreg.c's fixupMultiSZ() (GH-12687) (GH-12910) Message-ID: https://github.com/python/cpython/commit/dadc34784444950c389c120fb16f44e5a29cc43f commit: dadc34784444950c389c120fb16f44e5a29cc43f branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-05-02T12:00:33-04:00 summary: bpo-9194: Fix the bounds checking in winreg.c's fixupMultiSZ() (GH-12687) (GH-12910) (cherry picked from commit 56ed86490cb8221c874d432461d77702437f63e5) Co-authored-by: Zackery Spytz files: M PC/winreg.c diff --git a/PC/winreg.c b/PC/winreg.c index 3fde04d746b5..5739cf43335a 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -520,7 +520,7 @@ fixupMultiSZ(wchar_t **str, wchar_t *data, int len) Q = data + len; for (P = data, i = 0; P < Q && *P != '\0'; P++, i++) { str[i] = P; - for(; *P != '\0'; P++) + for (; P < Q && *P != '\0'; P++) ; } } From webhook-mailer at python.org Thu May 2 12:02:40 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 02 May 2019 16:02:40 -0000 Subject: [Python-checkins] bpo-36742: Fixes handling of pre-normalization characters in urlsplit() (GH-13017) (GH-13024) Message-ID: https://github.com/python/cpython/commit/e5f9f4adb95233c66578e6f7ea176687af2f78ca commit: e5f9f4adb95233c66578e6f7ea176687af2f78ca branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-05-02T12:02:35-04:00 summary: bpo-36742: Fixes handling of pre-normalization characters in urlsplit() (GH-13017) (GH-13024) (cherry picked from commit d537ab0ff9767ef024f26246899728f0116b1ec3) Co-authored-by: Steve Dower files: A Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index e6638aee2244..c26235449461 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1001,6 +1001,12 @@ def test_urlsplit_normalization(self): self.assertIn('\u2100', denorm_chars) self.assertIn('\uFF03', denorm_chars) + # bpo-36742: Verify port separators are ignored when they + # existed prior to decomposition + urllib.parse.urlsplit('http://\u30d5\u309a:80') + with self.assertRaises(ValueError): + urllib.parse.urlsplit('http://\u30d5\u309a\ufe1380') + for scheme in ["http", "https", "ftp"]: for c in denorm_chars: url = "{}://netloc{}false.netloc/path".format(scheme, c) diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 7b06f4d71d67..791b457bfb8a 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -397,13 +397,16 @@ def _checknetloc(netloc): # looking for characters like \u2100 that expand to 'a/c' # IDNA uses NFKC equivalence, so normalize for this check import unicodedata - netloc2 = unicodedata.normalize('NFKC', netloc) - if netloc == netloc2: + n = netloc.rpartition('@')[2] # ignore anything to the left of '@' + n = n.replace(':', '') # ignore characters already included + n = n.replace('#', '') # but not the surrounding text + n = n.replace('?', '') + netloc2 = unicodedata.normalize('NFKC', n) + if n == netloc2: return - _, _, netloc = netloc.rpartition('@') # anything to the left of '@' is okay for c in '/?#@:': if c in netloc2: - raise ValueError("netloc '" + netloc2 + "' contains invalid " + + raise ValueError("netloc '" + netloc + "' contains invalid " + "characters under NFKC normalization") def urlsplit(url, scheme='', allow_fragments=True): diff --git a/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst b/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst new file mode 100644 index 000000000000..d729ed2f3cd5 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst @@ -0,0 +1 @@ +Fixes mishandling of pre-normalization characters in urlsplit(). From webhook-mailer at python.org Thu May 2 13:02:48 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 02 May 2019 17:02:48 -0000 Subject: [Python-checkins] [3.7] bpo-35726: Prevented QueueHandler formatting from affecting other handlers (GH-11537) (GH-12716) Message-ID: https://github.com/python/cpython/commit/386b6f07a9703746590a5f29281b93c931c0e6d3 commit: 386b6f07a9703746590a5f29281b93c931c0e6d3 branch: 3.7 author: Xtreak committer: Ned Deily date: 2019-05-02T13:02:42-04:00 summary: [3.7] bpo-35726: Prevented QueueHandler formatting from affecting other handlers (GH-11537) (GH-12716) QueueHandler.prepare() now makes a copy of the record before modifying and enqueueing it, to avoid affecting other handlers in the chain. (cherry picked from commit da6424e96ada72c15c91bddb0a411acf7119e10a) Co-authored-by: Manjusaka files: A Misc/NEWS.d/next/Library/2019-01-13-01-33-00.bpo-35726.dasdas.rst M Lib/logging/handlers.py diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index e213e438c31a..3727bf0677cd 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -27,6 +27,7 @@ from stat import ST_DEV, ST_INO, ST_MTIME import queue import threading +import copy # # Some constants... @@ -1377,6 +1378,8 @@ def prepare(self, record): # exc_info and exc_text attributes, as they are no longer # needed and, if not None, will typically not be pickleable. msg = self.format(record) + # bpo-35726: make copy of record to avoid affecting other handlers in the chain. + record = copy.copy(record) record.message = msg record.msg = msg record.args = None diff --git a/Misc/NEWS.d/next/Library/2019-01-13-01-33-00.bpo-35726.dasdas.rst b/Misc/NEWS.d/next/Library/2019-01-13-01-33-00.bpo-35726.dasdas.rst new file mode 100644 index 000000000000..f47cdc128e85 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-13-01-33-00.bpo-35726.dasdas.rst @@ -0,0 +1 @@ +QueueHandler.prepare() now makes a copy of the record before modifying and enqueueing it, to avoid affecting other handlers in the chain. From webhook-mailer at python.org Thu May 2 13:24:06 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 02 May 2019 17:24:06 -0000 Subject: [Python-checkins] bpo-35726: Add test for QueueHandler with multiple handlers (GH-11659) (GH-13061) Message-ID: https://github.com/python/cpython/commit/3f8f64ebf3ab05038ed0b5a4adc83d0a5e9fbb82 commit: 3f8f64ebf3ab05038ed0b5a4adc83d0a5e9fbb82 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-05-02T13:24:01-04:00 summary: bpo-35726: Add test for QueueHandler with multiple handlers (GH-11659) (GH-13061) (cherry picked from commit 2dad96013ca24abdc5ba5a369ea42d70ff02487a) Co-authored-by: Xtreak files: M Lib/test/test_logging.py diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 3b671ce2ab37..6c5cb81377b3 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3361,6 +3361,19 @@ def test_queue_listener_with_StreamHandler(self): listener.stop() self.assertEqual(self.stream.getvalue().strip().count('Traceback'), 1) + @unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'), + 'logging.handlers.QueueListener required for this test') + def test_queue_listener_with_multiple_handlers(self): + # Test that queue handler format doesn't affect other handler formats (bpo-35726). + self.que_hdlr.setFormatter(self.root_formatter) + self.que_logger.addHandler(self.root_hdlr) + + listener = logging.handlers.QueueListener(self.queue, self.que_hdlr) + listener.start() + self.que_logger.error("error") + listener.stop() + self.assertEqual(self.stream.getvalue().strip(), "que -> ERROR: error") + if hasattr(logging.handlers, 'QueueListener'): import multiprocessing from unittest.mock import patch From webhook-mailer at python.org Thu May 2 14:21:12 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Thu, 02 May 2019 18:21:12 -0000 Subject: [Python-checkins] Fix typo: quaatile to quantile (GH=13001) Message-ID: https://github.com/python/cpython/commit/874ad1b3b4bfc782a5762c1f18234ba56b853caf commit: 874ad1b3b4bfc782a5762c1f18234ba56b853caf branch: master author: Xtreak committer: Raymond Hettinger date: 2019-05-02T14:20:58-04:00 summary: Fix typo: quaatile to quantile (GH=13001) files: M Lib/test/test_statistics.py diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 903ee8f343cb..1922de5df4b0 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2192,7 +2192,7 @@ def f(x): def test_specific_cases_inclusive(self): # Match results computed by hand and cross-checked # against the PERCENTILE.INC function in MS Excel - # and against the quaatile() function in SciPy. + # and against the quantile() function in SciPy. quantiles = statistics.quantiles data = [100, 200, 400, 800] random.shuffle(data) From webhook-mailer at python.org Thu May 2 14:46:33 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 18:46:33 -0000 Subject: [Python-checkins] bpo-36763: Add _PyCoreConfig._config_version (GH-13065) Message-ID: https://github.com/python/cpython/commit/373893ce51b0eaf0dec901e36a3e4217fbed3e32 commit: 373893ce51b0eaf0dec901e36a3e4217fbed3e32 branch: master author: Victor Stinner committer: GitHub date: 2019-05-02T14:46:29-04:00 summary: bpo-36763: Add _PyCoreConfig._config_version (GH-13065) Add private _config_version field to _PyPreConfig and _PyCoreConfig to prepare future ABI compatibility. files: M Include/cpython/coreconfig.h diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 99388e635c75..1aab5e4f0e62 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -65,7 +65,12 @@ typedef struct { /* --- _PyPreConfig ----------------------------------------------- */ +#define _Py_CONFIG_VERSION 1 + typedef struct { + int _config_version; /* Internal configuration version, + used for ABI compatibility */ + /* If greater than 0, enable isolated mode: sys.path contains neither the script's directory nor the user's site-packages directory. @@ -132,6 +137,7 @@ typedef struct { #define _PyPreConfig_INIT \ (_PyPreConfig){ \ _PyPreConfig_WINDOWS_INIT \ + ._config_version = _Py_CONFIG_VERSION, \ .isolated = -1, \ .use_environment = -1, \ .dev_mode = -1, \ @@ -141,9 +147,12 @@ typedef struct { /* --- _PyCoreConfig ---------------------------------------------- */ typedef struct { - int isolated; - int use_environment; - int dev_mode; + int _config_version; /* Internal configuration version, + used for ABI compatibility */ + + int isolated; /* Isolated mode? see _PyPreConfig.isolated */ + int use_environment; /* Use environment variables? see _PyPreConfig.use_environment */ + int dev_mode; /* Development mode? See _PyPreConfig.dev_mode */ /* Install signal handlers? Yes by default. */ int install_signal_handlers; @@ -397,6 +406,7 @@ typedef struct { #define _PyCoreConfig_INIT \ (_PyCoreConfig){ \ _PyCoreConfig_WINDOWS_INIT \ + ._config_version = _Py_CONFIG_VERSION, \ .isolated = -1, \ .use_environment = -1, \ .dev_mode = -1, \ From webhook-mailer at python.org Thu May 2 14:55:04 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 18:55:04 -0000 Subject: [Python-checkins] bpo-36776: Add @support.skip_unless_symlink to test_lll.py (GH-13058) Message-ID: https://github.com/python/cpython/commit/6ae2bbbdfcb8969d1d362b17c2fbd5a684fa4f9d commit: 6ae2bbbdfcb8969d1d362b17c2fbd5a684fa4f9d branch: master author: Zackery Spytz committer: Victor Stinner date: 2019-05-02T14:54:59-04:00 summary: bpo-36776: Add @support.skip_unless_symlink to test_lll.py (GH-13058) files: M Lib/test/test_tools/test_lll.py diff --git a/Lib/test/test_tools/test_lll.py b/Lib/test/test_tools/test_lll.py index a8f6d5f1f43c..f3fbe961eee5 100644 --- a/Lib/test/test_tools/test_lll.py +++ b/Lib/test/test_tools/test_lll.py @@ -14,6 +14,7 @@ class lllTests(unittest.TestCase): def setUp(self): self.lll = import_tool('lll') + @support.skip_unless_symlink def test_lll_multiple_dirs(self): with tempfile.TemporaryDirectory() as dir1, \ tempfile.TemporaryDirectory() as dir2: From webhook-mailer at python.org Thu May 2 14:56:34 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 18:56:34 -0000 Subject: [Python-checkins] bpo-36775: _PyCoreConfig only uses wchar_t* (GH-13062) Message-ID: https://github.com/python/cpython/commit/709d23dee69e700b87d5a4cb59e149d0e1af7993 commit: 709d23dee69e700b87d5a4cb59e149d0e1af7993 branch: master author: Victor Stinner committer: GitHub date: 2019-05-02T14:56:30-04:00 summary: bpo-36775: _PyCoreConfig only uses wchar_t* (GH-13062) _PyCoreConfig: Change filesystem_encoding, filesystem_errors, stdio_encoding and stdio_errors fields type from char* to wchar_t*. Changes: * PyInterpreterState: replace fscodec_initialized (int) with fs_codec structure. * Add get_error_handler_wide() and unicode_encode_utf8() helper functions. * Add error_handler parameter to unicode_encode_locale() and unicode_decode_locale(). * Remove _PyCoreConfig_SetString(). * Rename _PyCoreConfig_SetWideString() to _PyCoreConfig_SetString(). * Rename _PyCoreConfig_SetWideStringFromString() to _PyCoreConfig_DecodeLocale(). files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Include/internal/pycore_pylifecycle.h M Include/internal/pycore_pystate.h M Objects/stringlib/codecs.h M Objects/unicodeobject.c M Programs/_testembed.c M Python/coreconfig.c M Python/preconfig.c M Python/pylifecycle.c M Python/sysmodule.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 1aab5e4f0e62..5672080b784f 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -207,8 +207,8 @@ typedef struct { See Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors. */ - char *filesystem_encoding; - char *filesystem_errors; + wchar_t *filesystem_encoding; + wchar_t *filesystem_errors; wchar_t *pycache_prefix; /* PYTHONPYCACHEPREFIX, -X pycache_prefix=PATH */ wchar_t *program_name; /* Program name, see also Py_GetProgramName() */ @@ -334,13 +334,13 @@ typedef struct { Value set from PYTHONIOENCODING environment variable and Py_SetStandardStreamEncoding() function. See also 'stdio_errors' attribute. */ - char *stdio_encoding; + wchar_t *stdio_encoding; /* Error handler of sys.stdin and sys.stdout. Value set from PYTHONIOENCODING environment variable and Py_SetStandardStreamEncoding() function. See also 'stdio_encoding' attribute. */ - char *stdio_errors; + wchar_t *stdio_errors; #ifdef MS_WINDOWS /* If greater than zero, use io.FileIO instead of WindowsConsoleIO for sys diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 8af310d2b0ce..d48904e482a4 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -106,12 +106,9 @@ PyAPI_FUNC(_PyInitError) _PyCoreConfig_Copy( _PyCoreConfig *config, const _PyCoreConfig *config2); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetString( - char **config_str, - const char *str); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideString( wchar_t **config_str, const wchar_t *str); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideStringFromString( +PyAPI_FUNC(_PyInitError) _PyCoreConfig_DecodeLocale( wchar_t **config_str, const char *str); PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPathConfig(_PyCoreConfig *config); diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index a2383d476ee9..321cc5d27889 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -21,6 +21,9 @@ extern int _Py_SetFileSystemEncoding( const char *errors); extern void _Py_ClearFileSystemEncoding(void); extern _PyInitError _PyUnicode_InitEncodings(PyInterpreterState *interp); +#ifdef MS_WINDOWS +extern int _PyUnicode_EnableLegacyWindowsFSEncoding(void); +#endif PyAPI_FUNC(void) _Py_ClearStandardStreamEncoding(void); diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 2c24f679dc02..67bcd147e282 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -56,7 +56,14 @@ struct _is { PyObject *codec_search_cache; PyObject *codec_error_registry; int codecs_initialized; - int fscodec_initialized; + + /* fs_codec.encoding is initialized to NULL. + Later, it is set to a non-NULL string by _PyUnicode_InitEncodings(). */ + struct { + char *encoding; /* Filesystem encoding (encoded to UTF-8) */ + char *errors; /* Filesystem errors (encoded to UTF-8) */ + _Py_error_handler error_handler; + } fs_codec; _PyCoreConfig core_config; #ifdef HAVE_DLOPEN diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h index 0abb4c8abb92..8645bc26cff8 100644 --- a/Objects/stringlib/codecs.h +++ b/Objects/stringlib/codecs.h @@ -260,6 +260,7 @@ Py_LOCAL_INLINE(PyObject *) STRINGLIB(utf8_encoder)(PyObject *unicode, STRINGLIB_CHAR *data, Py_ssize_t size, + _Py_error_handler error_handler, const char *errors) { Py_ssize_t i; /* index into data of next input character */ @@ -268,7 +269,6 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, PyObject *error_handler_obj = NULL; PyObject *exc = NULL; PyObject *rep = NULL; - _Py_error_handler error_handler = _Py_ERROR_UNKNOWN; #endif #if STRINGLIB_SIZEOF_CHAR == 1 const Py_ssize_t max_char_size = 2; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 5b6b241cb62b..4d86519e8637 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -40,6 +40,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_coreconfig.h" #include "pycore_fileutils.h" #include "pycore_object.h" #include "pycore_pylifecycle.h" @@ -264,6 +265,13 @@ unicode_fill(enum PyUnicode_Kind kind, void *data, Py_UCS4 value, /* Forward declaration */ static inline int _PyUnicodeWriter_WriteCharInline(_PyUnicodeWriter *writer, Py_UCS4 ch); +static PyObject * +unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, + const char *errors); +static PyObject * +unicode_decode_utf8(const char *s, Py_ssize_t size, + _Py_error_handler error_handler, const char *errors, + Py_ssize_t *consumed); /* List of static strings. */ static _Py_Identifier *static_strings = NULL; @@ -388,6 +396,35 @@ _Py_GetErrorHandler(const char *errors) return _Py_ERROR_OTHER; } + +static _Py_error_handler +get_error_handler_wide(const wchar_t *errors) +{ + if (errors == NULL || wcscmp(errors, L"strict") == 0) { + return _Py_ERROR_STRICT; + } + if (wcscmp(errors, L"surrogateescape") == 0) { + return _Py_ERROR_SURROGATEESCAPE; + } + if (wcscmp(errors, L"replace") == 0) { + return _Py_ERROR_REPLACE; + } + if (wcscmp(errors, L"ignore") == 0) { + return _Py_ERROR_IGNORE; + } + if (wcscmp(errors, L"backslashreplace") == 0) { + return _Py_ERROR_BACKSLASHREPLACE; + } + if (wcscmp(errors, L"surrogatepass") == 0) { + return _Py_ERROR_SURROGATEPASS; + } + if (wcscmp(errors, L"xmlcharrefreplace") == 0) { + return _Py_ERROR_XMLCHARREFREPLACE; + } + return _Py_ERROR_OTHER; +} + + /* The max unicode value is always 0x10FFFF while using the PEP-393 API. This function is kept for backward compatibility with the old API. */ Py_UNICODE @@ -3445,11 +3482,9 @@ PyUnicode_AsEncodedObject(PyObject *unicode, static PyObject * -unicode_encode_locale(PyObject *unicode, const char *errors, +unicode_encode_locale(PyObject *unicode, _Py_error_handler error_handler, int current_locale) { - _Py_error_handler error_handler = _Py_GetErrorHandler(errors); - Py_ssize_t wlen; wchar_t *wstr = PyUnicode_AsWideCharString(unicode, &wlen); if (wstr == NULL) { @@ -3499,30 +3534,44 @@ unicode_encode_locale(PyObject *unicode, const char *errors, PyObject * PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) { - return unicode_encode_locale(unicode, errors, 1); + _Py_error_handler error_handler = _Py_GetErrorHandler(errors); + return unicode_encode_locale(unicode, error_handler, 1); } PyObject * PyUnicode_EncodeFSDefault(PyObject *unicode) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const _PyCoreConfig *config = &interp->core_config; #ifdef _Py_FORCE_UTF8_FS_ENCODING - return _PyUnicode_AsUTF8String(unicode, config->filesystem_errors); + if (interp->fs_codec.encoding) { + return unicode_encode_utf8(unicode, + interp->fs_codec.error_handler, + interp->fs_codec.errors); + } + else { + const _PyCoreConfig *config = &interp->core_config; + _Py_error_handler errors; + errors = get_error_handler_wide(config->filesystem_errors); + assert(errors != _Py_ERROR_UNKNOWN); + return unicode_encode_utf8(unicode, errors, NULL); + } #else /* Bootstrap check: if the filesystem codec is implemented in Python, we cannot use it to encode and decode filenames before it is loaded. Load the Python codec requires to encode at least its own filename. Use the C implementation of the locale codec until the codec registry is initialized and the Python codec is loaded. See initfsencoding(). */ - if (interp->fscodec_initialized) { + if (interp->fs_codec.encoding) { return PyUnicode_AsEncodedString(unicode, - config->filesystem_encoding, - config->filesystem_errors); + interp->fs_codec.encoding, + interp->fs_codec.errors); } else { - return unicode_encode_locale(unicode, - config->filesystem_errors, 0); + const _PyCoreConfig *config = &interp->core_config; + _Py_error_handler errors; + errors = get_error_handler_wide(config->filesystem_errors); + assert(errors != _Py_ERROR_UNKNOWN); + return unicode_encode_locale(unicode, errors, 0); } #endif } @@ -3663,11 +3712,9 @@ PyUnicode_AsEncodedUnicode(PyObject *unicode, } static PyObject* -unicode_decode_locale(const char *str, Py_ssize_t len, const char *errors, - int current_locale) +unicode_decode_locale(const char *str, Py_ssize_t len, + _Py_error_handler errors, int current_locale) { - _Py_error_handler error_handler = _Py_GetErrorHandler(errors); - if (str[len] != '\0' || (size_t)len != strlen(str)) { PyErr_SetString(PyExc_ValueError, "embedded null byte"); return NULL; @@ -3677,7 +3724,7 @@ unicode_decode_locale(const char *str, Py_ssize_t len, const char *errors, size_t wlen; const char *reason; int res = _Py_DecodeLocaleEx(str, &wstr, &wlen, &reason, - current_locale, error_handler); + current_locale, errors); if (res != 0) { if (res == -2) { PyObject *exc; @@ -3709,14 +3756,16 @@ PyObject* PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len, const char *errors) { - return unicode_decode_locale(str, len, errors, 1); + _Py_error_handler error_handler = _Py_GetErrorHandler(errors); + return unicode_decode_locale(str, len, error_handler, 1); } PyObject* PyUnicode_DecodeLocale(const char *str, const char *errors) { Py_ssize_t size = (Py_ssize_t)strlen(str); - return unicode_decode_locale(str, size, errors, 1); + _Py_error_handler error_handler = _Py_GetErrorHandler(errors); + return unicode_decode_locale(str, size, error_handler, 1); } @@ -3730,23 +3779,36 @@ PyObject* PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const _PyCoreConfig *config = &interp->core_config; #ifdef _Py_FORCE_UTF8_FS_ENCODING - return PyUnicode_DecodeUTF8Stateful(s, size, config->filesystem_errors, NULL); + if (interp->fs_codec.encoding) { + return unicode_decode_utf8(s, size, + interp->fs_codec.error_handler, + interp->fs_codec.errors, + NULL); + } + else { + const _PyCoreConfig *config = &interp->core_config; + _Py_error_handler errors; + errors = get_error_handler_wide(config->filesystem_errors); + assert(errors != _Py_ERROR_UNKNOWN); + return unicode_decode_utf8(s, size, errors, NULL, NULL); + } #else /* Bootstrap check: if the filesystem codec is implemented in Python, we cannot use it to encode and decode filenames before it is loaded. Load the Python codec requires to encode at least its own filename. Use the C implementation of the locale codec until the codec registry is initialized and the Python codec is loaded. See initfsencoding(). */ - if (interp->fscodec_initialized) { + if (interp->fs_codec.encoding) { return PyUnicode_Decode(s, size, - config->filesystem_encoding, - config->filesystem_errors); + interp->fs_codec.encoding, + interp->fs_codec.errors); } else { - return unicode_decode_locale(s, size, - config->filesystem_errors, 0); + const _PyCoreConfig *config = &interp->core_config; + _Py_error_handler errors; + errors = get_error_handler_wide(config->filesystem_errors); + return unicode_decode_locale(s, size, errors, 0); } #endif } @@ -4810,11 +4872,10 @@ ascii_decode(const char *start, const char *end, Py_UCS1 *dest) return p - start; } -PyObject * -PyUnicode_DecodeUTF8Stateful(const char *s, - Py_ssize_t size, - const char *errors, - Py_ssize_t *consumed) +static PyObject * +unicode_decode_utf8(const char *s, Py_ssize_t size, + _Py_error_handler error_handler, const char *errors, + Py_ssize_t *consumed) { _PyUnicodeWriter writer; const char *starts = s; @@ -4825,7 +4886,6 @@ PyUnicode_DecodeUTF8Stateful(const char *s, const char *errmsg = ""; PyObject *error_handler_obj = NULL; PyObject *exc = NULL; - _Py_error_handler error_handler = _Py_ERROR_UNKNOWN; if (size == 0) { if (consumed) @@ -4948,6 +5008,16 @@ PyUnicode_DecodeUTF8Stateful(const char *s, } +PyObject * +PyUnicode_DecodeUTF8Stateful(const char *s, + Py_ssize_t size, + const char *errors, + Py_ssize_t *consumed) +{ + return unicode_decode_utf8(s, size, _Py_ERROR_UNKNOWN, errors, consumed); +} + + /* UTF-8 decoder: use surrogateescape error handler if 'surrogateescape' is non-zero, use strict error handler otherwise. @@ -5231,8 +5301,9 @@ _Py_EncodeUTF8Ex(const wchar_t *text, char **str, size_t *error_pos, maximum possible needed (4 result bytes per Unicode character), and return the excess memory at the end. */ -PyObject * -_PyUnicode_AsUTF8String(PyObject *unicode, const char *errors) +static PyObject * +unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, + const char *errors) { enum PyUnicode_Kind kind; void *data; @@ -5260,14 +5331,21 @@ _PyUnicode_AsUTF8String(PyObject *unicode, const char *errors) case PyUnicode_1BYTE_KIND: /* the string cannot be ASCII, or PyUnicode_UTF8() would be set */ assert(!PyUnicode_IS_ASCII(unicode)); - return ucs1lib_utf8_encoder(unicode, data, size, errors); + return ucs1lib_utf8_encoder(unicode, data, size, error_handler, errors); case PyUnicode_2BYTE_KIND: - return ucs2lib_utf8_encoder(unicode, data, size, errors); + return ucs2lib_utf8_encoder(unicode, data, size, error_handler, errors); case PyUnicode_4BYTE_KIND: - return ucs4lib_utf8_encoder(unicode, data, size, errors); + return ucs4lib_utf8_encoder(unicode, data, size, error_handler, errors); } } +PyObject * +_PyUnicode_AsUTF8String(PyObject *unicode, const char *errors) +{ + return unicode_encode_utf8(unicode, _Py_ERROR_UNKNOWN, errors); +} + + PyObject * PyUnicode_EncodeUTF8(const Py_UNICODE *s, Py_ssize_t size, @@ -15575,12 +15653,35 @@ PyUnicode_AsUnicodeCopy(PyObject *unicode) } -static char* -get_codec_name(const char *encoding) +static int +encode_wstr_utf8(wchar_t *wstr, char **str, const char *name) { - PyObject *codec, *name_obj = NULL; + int res; + res = _Py_EncodeUTF8Ex(wstr, str, NULL, NULL, 1, _Py_ERROR_STRICT); + if (res == -2) { + PyErr_Format(PyExc_RuntimeWarning, "cannot decode %s", name); + return -1; + } + if (res < 0) { + PyErr_NoMemory(); + return -1; + } + return 0; +} + + +static int +config_get_codec_name(wchar_t **config_encoding) +{ + char *encoding; + if (encode_wstr_utf8(*config_encoding, &encoding, "stdio_encoding") < 0) { + return -1; + } + + PyObject *name_obj = NULL; + PyObject *codec = _PyCodec_Lookup(encoding); + PyMem_RawFree(encoding); - codec = _PyCodec_Lookup(encoding); if (!codec) goto error; @@ -15590,71 +15691,107 @@ get_codec_name(const char *encoding) goto error; } - const char *name_utf8 = PyUnicode_AsUTF8(name_obj); - if (name_utf8 == NULL) { + wchar_t *wname = PyUnicode_AsWideCharString(name_obj, NULL); + Py_DECREF(name_obj); + if (wname == NULL) { goto error; } - char *name = _PyMem_RawStrdup(name_utf8); - Py_DECREF(name_obj); - if (name == NULL) { + wchar_t *raw_wname = _PyMem_RawWcsdup(wname); + if (raw_wname == NULL) { + PyMem_Free(wname); PyErr_NoMemory(); - return NULL; + goto error; } - return name; + + PyMem_RawFree(*config_encoding); + *config_encoding = raw_wname; + + PyMem_Free(wname); + return 0; error: Py_XDECREF(codec); Py_XDECREF(name_obj); - return NULL; + return -1; } static _PyInitError init_stdio_encoding(PyInterpreterState *interp) { + /* Update the stdio encoding to the normalized Python codec name. */ _PyCoreConfig *config = &interp->core_config; - - char *codec_name = get_codec_name(config->stdio_encoding); - if (codec_name == NULL) { + if (config_get_codec_name(&config->stdio_encoding) < 0) { return _Py_INIT_ERR("failed to get the Python codec name " "of the stdio encoding"); } - PyMem_RawFree(config->stdio_encoding); - config->stdio_encoding = codec_name; return _Py_INIT_OK(); } -static _PyInitError -init_fs_encoding(PyInterpreterState *interp) +static int +init_fs_codec(PyInterpreterState *interp) { _PyCoreConfig *config = &interp->core_config; - char *encoding = get_codec_name(config->filesystem_encoding); - if (encoding == NULL) { - /* Such error can only occurs in critical situations: no more - memory, import a module of the standard library failed, etc. */ - return _Py_INIT_ERR("failed to get the Python codec " - "of the filesystem encoding"); + _Py_error_handler error_handler; + error_handler = get_error_handler_wide(config->filesystem_errors); + if (error_handler == _Py_ERROR_UNKNOWN) { + PyErr_SetString(PyExc_RuntimeError, "unknow filesystem error handler"); + return -1; } - /* Update the filesystem encoding to the normalized Python codec name. - For example, replace "ANSI_X3.4-1968" (locale encoding) with "ascii" - (Python codec name). */ - PyMem_RawFree(config->filesystem_encoding); - config->filesystem_encoding = encoding; + char *encoding, *errors; + if (encode_wstr_utf8(config->filesystem_encoding, + &encoding, + "filesystem_encoding") < 0) { + return -1; + } + + if (encode_wstr_utf8(config->filesystem_errors, + &errors, + "filesystem_errors") < 0) { + PyMem_RawFree(encoding); + return -1; + } + + PyMem_RawFree(interp->fs_codec.encoding); + interp->fs_codec.encoding = encoding; + PyMem_RawFree(interp->fs_codec.errors); + interp->fs_codec.errors = errors; + interp->fs_codec.error_handler = error_handler; + + /* At this point, PyUnicode_EncodeFSDefault() and + PyUnicode_DecodeFSDefault() can now use the Python codec rather than + the C implementation of the filesystem encoding. */ /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors global configuration variables. */ - if (_Py_SetFileSystemEncoding(config->filesystem_encoding, - config->filesystem_errors) < 0) { - return _Py_INIT_NO_MEMORY(); + if (_Py_SetFileSystemEncoding(interp->fs_codec.encoding, + interp->fs_codec.errors) < 0) { + PyErr_NoMemory(); + return -1; + } + return 0; +} + + +static _PyInitError +init_fs_encoding(PyInterpreterState *interp) +{ + /* Update the filesystem encoding to the normalized Python codec name. + For example, replace "ANSI_X3.4-1968" (locale encoding) with "ascii" + (Python codec name). */ + _PyCoreConfig *config = &interp->core_config; + if (config_get_codec_name(&config->filesystem_encoding) < 0) { + return _Py_INIT_ERR("failed to get the Python codec " + "of the filesystem encoding"); } - /* PyUnicode can now use the Python codec rather than C implementation - for the filesystem encoding */ - interp->fscodec_initialized = 1; + if (init_fs_codec(interp) < 0) { + return _Py_INIT_ERR("cannot initialize filesystem codec"); + } return _Py_INIT_OK(); } @@ -15671,6 +15808,33 @@ _PyUnicode_InitEncodings(PyInterpreterState *interp) } +#ifdef MS_WINDOWS +int +_PyUnicode_EnableLegacyWindowsFSEncoding(void) +{ + PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + _PyCoreConfig *config = &interp->core_config; + + /* Set the filesystem encoding to mbcs/replace (PEP 529) */ + wchar_t *encoding = _PyMem_RawWcsdup(L"mbcs"); + wchar_t *errors = _PyMem_RawWcsdup(L"replace"); + if (encoding == NULL || errors == NULL) { + PyMem_RawFree(encoding); + PyMem_RawFree(errors); + PyErr_NoMemory(); + return -1; + } + + PyMem_RawFree(config->filesystem_encoding); + config->filesystem_encoding = encoding; + PyMem_RawFree(config->filesystem_errors); + config->filesystem_errors = errors; + + return init_fs_codec(interp); +} +#endif + + void _PyUnicode_Fini(void) { @@ -15694,6 +15858,12 @@ _PyUnicode_Fini(void) } _PyUnicode_ClearStaticStrings(); (void)PyUnicode_ClearFreeList(); + + PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyMem_RawFree(interp->fs_codec.encoding); + interp->fs_codec.encoding = NULL; + PyMem_RawFree(interp->fs_codec.errors); + interp->fs_codec.errors = NULL; } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 6e764e3b6cce..2cadf82cb17f 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -488,8 +488,8 @@ static int test_init_from_config(void) Force it to 0 through the config. */ config.legacy_windows_stdio = 0; #endif - config.stdio_encoding = "iso8859-1"; - config.stdio_errors = "replace"; + config.stdio_encoding = L"iso8859-1"; + config.stdio_errors = L"replace"; putenv("PYTHONNOUSERSITE="); Py_NoUserSiteDirectory = 0; diff --git a/Python/coreconfig.c b/Python/coreconfig.c index c40c1f859ec2..15643be3765a 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -523,27 +523,7 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) /* Copy str into *config_str (duplicate the string) */ _PyInitError -_PyCoreConfig_SetString(char **config_str, const char *str) -{ - char *str2; - if (str != NULL) { - str2 = _PyMem_RawStrdup(str); - if (str2 == NULL) { - return _Py_INIT_NO_MEMORY(); - } - } - else { - str2 = NULL; - } - PyMem_RawFree(*config_str); - *config_str = str2; - return _Py_INIT_OK(); -} - - -/* Copy str into *config_str (duplicate the string) */ -_PyInitError -_PyCoreConfig_SetWideString(wchar_t **config_str, const wchar_t *str) +_PyCoreConfig_SetString(wchar_t **config_str, const wchar_t *str) { wchar_t *str2; if (str != NULL) { @@ -563,8 +543,8 @@ _PyCoreConfig_SetWideString(wchar_t **config_str, const wchar_t *str) /* Decode str using Py_DecodeLocale() and set the result into *config_str */ static _PyInitError -_PyCoreConfig_SetWideStringFromStringErr(wchar_t **config_str, const char *str, - const char *decode_err_msg) +_PyCoreConfig_DecodeLocaleErr(wchar_t **config_str, const char *str, + const char *decode_err_msg) { wchar_t *str2; if (str != NULL) { @@ -588,19 +568,17 @@ _PyCoreConfig_SetWideStringFromStringErr(wchar_t **config_str, const char *str, } +#define CONFIG_DECODE_LOCALE(config_str, str, NAME) \ + _PyCoreConfig_DecodeLocaleErr(config_str, str, "cannot decode " NAME) + + _PyInitError -_PyCoreConfig_SetWideStringFromString(wchar_t **config_str, const char *str) +_PyCoreConfig_DecodeLocale(wchar_t **config_str, const char *str) { - return _PyCoreConfig_SetWideStringFromStringErr( - config_str, str, "cannot decode string"); + return CONFIG_DECODE_LOCALE(config_str, str, "string"); } -#define CONFIG_DECODE_LOCALE(config_str, str, NAME) \ - _PyCoreConfig_SetWideStringFromStringErr(config_str, str, \ - "cannot decode " NAME) - - _PyInitError _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) { @@ -608,16 +586,9 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) _PyCoreConfig_Clear(config); #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR -#define COPY_STR_ATTR(ATTR) \ - do { \ - err = _PyCoreConfig_SetString(&config->ATTR, config2->ATTR); \ - if (_Py_INIT_FAILED(err)) { \ - return err; \ - } \ - } while (0) #define COPY_WSTR_ATTR(ATTR) \ do { \ - err = _PyCoreConfig_SetWideString(&config->ATTR, config2->ATTR); \ + err = _PyCoreConfig_SetString(&config->ATTR, config2->ATTR); \ if (_Py_INIT_FAILED(err)) { \ return err; \ } \ @@ -676,10 +647,10 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_ATTR(quiet); COPY_ATTR(user_site_directory); COPY_ATTR(buffered_stdio); - COPY_STR_ATTR(filesystem_encoding); - COPY_STR_ATTR(filesystem_errors); - COPY_STR_ATTR(stdio_encoding); - COPY_STR_ATTR(stdio_errors); + COPY_WSTR_ATTR(filesystem_encoding); + COPY_WSTR_ATTR(filesystem_errors); + COPY_WSTR_ATTR(stdio_encoding); + COPY_WSTR_ATTR(stdio_errors); #ifdef MS_WINDOWS COPY_ATTR(legacy_windows_stdio); #endif @@ -692,7 +663,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_ATTR(_init_main); #undef COPY_ATTR -#undef COPY_STR_ATTR #undef COPY_WSTR_ATTR #undef COPY_WSTRLIST return _Py_INIT_OK(); @@ -721,16 +691,10 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) goto fail; \ } \ } while (0) -#define FROM_STRING(STR) \ - ((STR != NULL) ? \ - PyUnicode_FromString(STR) \ - : (Py_INCREF(Py_None), Py_None)) #define SET_ITEM_INT(ATTR) \ SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR)) #define SET_ITEM_UINT(ATTR) \ SET_ITEM(#ATTR, PyLong_FromUnsignedLong(config->ATTR)) -#define SET_ITEM_STR(ATTR) \ - SET_ITEM(#ATTR, FROM_STRING(config->ATTR)) #define FROM_WSTRING(STR) \ ((STR != NULL) ? \ PyUnicode_FromWideChar(STR, -1) \ @@ -753,8 +717,8 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_INT(show_alloc_count); SET_ITEM_INT(dump_refs); SET_ITEM_INT(malloc_stats); - SET_ITEM_STR(filesystem_encoding); - SET_ITEM_STR(filesystem_errors); + SET_ITEM_WSTR(filesystem_encoding); + SET_ITEM_WSTR(filesystem_errors); SET_ITEM_WSTR(pycache_prefix); SET_ITEM_WSTR(program_name); SET_ITEM_WSTRLIST(argv); @@ -783,8 +747,8 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_INT(quiet); SET_ITEM_INT(user_site_directory); SET_ITEM_INT(buffered_stdio); - SET_ITEM_STR(stdio_encoding); - SET_ITEM_STR(stdio_errors); + SET_ITEM_WSTR(stdio_encoding); + SET_ITEM_WSTR(stdio_errors); #ifdef MS_WINDOWS SET_ITEM_INT(legacy_windows_stdio); #endif @@ -803,12 +767,10 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) Py_DECREF(dict); return NULL; -#undef FROM_STRING #undef FROM_WSTRING #undef SET_ITEM #undef SET_ITEM_INT #undef SET_ITEM_UINT -#undef SET_ITEM_STR #undef SET_ITEM_WSTR #undef SET_ITEM_WSTRLIST } @@ -845,7 +807,7 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, return _Py_INIT_OK(); } - return _PyCoreConfig_SetWideString(dest, var); + return _PyCoreConfig_SetString(dest, var); #else const char *var = getenv(name); if (!var || var[0] == '\0') { @@ -853,7 +815,7 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, return _Py_INIT_OK(); } - return _PyCoreConfig_SetWideStringFromStringErr(dest, var, decode_err_msg); + return _PyCoreConfig_DecodeLocaleErr(dest, var, decode_err_msg); #endif } @@ -996,8 +958,7 @@ config_init_program_name(_PyCoreConfig *config) /* Use argv[0] by default, if available */ if (config->program != NULL) { - err = _PyCoreConfig_SetWideString(&config->program_name, - config->program); + err = _PyCoreConfig_SetString(&config->program_name, config->program); if (_Py_INIT_FAILED(err)) { return err; } @@ -1010,7 +971,7 @@ config_init_program_name(_PyCoreConfig *config) #else const wchar_t *default_program_name = L"python3"; #endif - err = _PyCoreConfig_SetWideString(&config->program_name, default_program_name); + err = _PyCoreConfig_SetString(&config->program_name, default_program_name); if (_Py_INIT_FAILED(err)) { return err; } @@ -1025,8 +986,8 @@ config_init_executable(_PyCoreConfig *config) /* If Py_SetProgramFullPath() was called, use its value */ const wchar_t *program_full_path = _Py_path_config.program_full_path; if (program_full_path != NULL) { - _PyInitError err = _PyCoreConfig_SetWideString(&config->executable, - program_full_path); + _PyInitError err = _PyCoreConfig_SetString(&config->executable, + program_full_path); if (_Py_INIT_FAILED(err)) { return err; } @@ -1051,7 +1012,7 @@ config_init_home(_PyCoreConfig *config) /* If Py_SetPythonHome() was called, use its value */ wchar_t *home = _Py_path_config.home; if (home) { - _PyInitError err = _PyCoreConfig_SetWideString(&config->home, home); + _PyInitError err = _PyCoreConfig_SetString(&config->home, home); if (_Py_INIT_FAILED(err)) { return err; } @@ -1280,7 +1241,7 @@ config_read_complex_options(_PyCoreConfig *config) } -static const char * +static const wchar_t * config_get_stdio_errors(const _PyCoreConfig *config) { #ifndef MS_WINDOWS @@ -1288,43 +1249,44 @@ config_get_stdio_errors(const _PyCoreConfig *config) if (loc != NULL) { /* surrogateescape is the default in the legacy C and POSIX locales */ if (strcmp(loc, "C") == 0 || strcmp(loc, "POSIX") == 0) { - return "surrogateescape"; + return L"surrogateescape"; } #ifdef PY_COERCE_C_LOCALE /* surrogateescape is the default in locale coercion target locales */ if (_Py_IsLocaleCoercionTarget(loc)) { - return "surrogateescape"; + return L"surrogateescape"; } #endif } - return "strict"; + return L"strict"; #else /* On Windows, always use surrogateescape by default */ - return "surrogateescape"; + return L"surrogateescape"; #endif } static _PyInitError -config_get_locale_encoding(char **locale_encoding) +config_get_locale_encoding(wchar_t **locale_encoding) { #ifdef MS_WINDOWS char encoding[20]; PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); + return _PyCoreConfig_DecodeLocale(locale_encoding, encoding); #elif defined(_Py_FORCE_UTF8_LOCALE) - const char *encoding = "UTF-8"; + return _PyCoreConfig_SetString(locale_encoding, L"utf-8"); #else const char *encoding = nl_langinfo(CODESET); if (!encoding || encoding[0] == '\0') { return _Py_INIT_ERR("failed to get the locale encoding: " "nl_langinfo(CODESET) failed"); } + /* nl_langinfo(CODESET) is decoded by Py_DecodeLocale() */ + return CONFIG_DECODE_LOCALE(locale_encoding, encoding, + "nl_langinfo(CODESET)"); #endif - - assert(*locale_encoding == NULL); - return _PyCoreConfig_SetString(locale_encoding, encoding); } @@ -1337,16 +1299,18 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* If Py_SetStandardStreamEncoding() have been called, use these parameters. */ if (config->stdio_encoding == NULL && _Py_StandardStreamEncoding != NULL) { - err = _PyCoreConfig_SetString(&config->stdio_encoding, - _Py_StandardStreamEncoding); + err = CONFIG_DECODE_LOCALE(&config->stdio_encoding, + _Py_StandardStreamEncoding, + "_Py_StandardStreamEncoding"); if (_Py_INIT_FAILED(err)) { return err; } } if (config->stdio_errors == NULL && _Py_StandardStreamErrors != NULL) { - err = _PyCoreConfig_SetString(&config->stdio_errors, - _Py_StandardStreamErrors); + err = CONFIG_DECODE_LOCALE(&config->stdio_errors, + _Py_StandardStreamErrors, + "_Py_StandardStreamErrors"); if (_Py_INIT_FAILED(err)) { return err; } @@ -1359,11 +1323,9 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* PYTHONIOENCODING environment variable */ const char *opt = _PyCoreConfig_GetEnv(config, "PYTHONIOENCODING"); if (opt) { - /* _PyCoreConfig_SetString() requires dest to be initialized to NULL */ - char *pythonioencoding = NULL; - err = _PyCoreConfig_SetString(&pythonioencoding, opt); - if (_Py_INIT_FAILED(err)) { - return err; + char *pythonioencoding = _PyMem_RawStrdup(opt); + if (pythonioencoding == NULL) { + return _Py_INIT_NO_MEMORY(); } char *errors = strchr(pythonioencoding, ':'); @@ -1378,8 +1340,9 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* Does PYTHONIOENCODING contain an encoding? */ if (pythonioencoding[0]) { if (config->stdio_encoding == NULL) { - err = _PyCoreConfig_SetString(&config->stdio_encoding, - pythonioencoding); + err = CONFIG_DECODE_LOCALE(&config->stdio_encoding, + pythonioencoding, + "PYTHONIOENCODING environment variable"); if (_Py_INIT_FAILED(err)) { PyMem_RawFree(pythonioencoding); return err; @@ -1396,7 +1359,9 @@ config_init_stdio_encoding(_PyCoreConfig *config, } if (config->stdio_errors == NULL && errors != NULL) { - err = _PyCoreConfig_SetString(&config->stdio_errors, errors); + err = CONFIG_DECODE_LOCALE(&config->stdio_errors, + errors, + "PYTHONIOENCODING environment variable"); if (_Py_INIT_FAILED(err)) { PyMem_RawFree(pythonioencoding); return err; @@ -1409,15 +1374,14 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* UTF-8 Mode uses UTF-8/surrogateescape */ if (preconfig->utf8_mode) { if (config->stdio_encoding == NULL) { - err = _PyCoreConfig_SetString(&config->stdio_encoding, - "utf-8"); + err = _PyCoreConfig_SetString(&config->stdio_encoding, L"utf-8"); if (_Py_INIT_FAILED(err)) { return err; } } if (config->stdio_errors == NULL) { err = _PyCoreConfig_SetString(&config->stdio_errors, - "surrogateescape"); + L"surrogateescape"); if (_Py_INIT_FAILED(err)) { return err; } @@ -1432,7 +1396,7 @@ config_init_stdio_encoding(_PyCoreConfig *config, } } if (config->stdio_errors == NULL) { - const char *errors = config_get_stdio_errors(config); + const wchar_t *errors = config_get_stdio_errors(config); assert(errors != NULL); err = _PyCoreConfig_SetString(&config->stdio_errors, errors); @@ -1452,33 +1416,32 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) if (config->filesystem_encoding == NULL) { #ifdef _Py_FORCE_UTF8_FS_ENCODING - err = _PyCoreConfig_SetString(&config->filesystem_encoding, - "utf-8"); + err = _PyCoreConfig_SetString(&config->filesystem_encoding, L"utf-8"); #else #ifdef MS_WINDOWS if (preconfig->legacy_windows_fs_encoding) { /* Legacy Windows filesystem encoding: mbcs/replace */ err = _PyCoreConfig_SetString(&config->filesystem_encoding, - "mbcs"); + L"mbcs"); } else #endif if (preconfig->utf8_mode) { err = _PyCoreConfig_SetString(&config->filesystem_encoding, - "utf-8"); + L"utf-8"); } #ifndef MS_WINDOWS else if (_Py_GetForceASCII()) { err = _PyCoreConfig_SetString(&config->filesystem_encoding, - "ascii"); + L"ascii"); } #endif else { #ifdef MS_WINDOWS /* Windows defaults to utf-8/surrogatepass (PEP 529). */ err = _PyCoreConfig_SetString(&config->filesystem_encoding, - "utf-8"); + L"utf-8"); #else err = config_get_locale_encoding(&config->filesystem_encoding); #endif @@ -1491,16 +1454,16 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) } if (config->filesystem_errors == NULL) { - const char *errors; + const wchar_t *errors; #ifdef MS_WINDOWS if (preconfig->legacy_windows_fs_encoding) { - errors = "replace"; + errors = L"replace"; } else { - errors = "surrogatepass"; + errors = L"surrogatepass"; } #else - errors = "surrogateescape"; + errors = L"surrogateescape"; #endif err = _PyCoreConfig_SetString(&config->filesystem_errors, errors); if (_Py_INIT_FAILED(err)) { @@ -1745,8 +1708,8 @@ config_parse_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline, || wcscmp(_PyOS_optarg, L"never") == 0 || wcscmp(_PyOS_optarg, L"default") == 0) { - err = _PyCoreConfig_SetWideString(&config->check_hash_pycs_mode, - _PyOS_optarg); + err = _PyCoreConfig_SetString(&config->check_hash_pycs_mode, + _PyOS_optarg); if (_Py_INIT_FAILED(err)) { return err; } @@ -2119,7 +2082,7 @@ config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) } if (config->check_hash_pycs_mode == NULL) { - err = _PyCoreConfig_SetWideString(&config->check_hash_pycs_mode, L"default"); + err = _PyCoreConfig_SetString(&config->check_hash_pycs_mode, L"default"); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/preconfig.c b/Python/preconfig.c index 108cbc666061..48b9e8383aae 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -14,7 +14,10 @@ /* --- File system encoding/errors -------------------------------- */ /* The filesystem encoding is chosen by config_init_fs_encoding(), - see also initfsencoding(). */ + see also initfsencoding(). + + Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors + are encoded to UTF-8. */ const char *Py_FileSystemDefaultEncoding = NULL; int Py_HasFileSystemDefaultEncoding = 0; const char *Py_FileSystemDefaultEncodeErrors = NULL; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 01ef027b9d86..2a633cf1cf92 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1668,7 +1668,7 @@ is_valid_fd(int fd) static PyObject* create_stdio(const _PyCoreConfig *config, PyObject* io, int fd, int write_mode, const char* name, - const char* encoding, const char* errors) + const wchar_t* encoding, const wchar_t* errors) { PyObject *buf = NULL, *stream = NULL, *text = NULL, *raw = NULL, *res; const char* mode; @@ -1718,7 +1718,7 @@ create_stdio(const _PyCoreConfig *config, PyObject* io, #ifdef MS_WINDOWS /* Windows console IO is always UTF-8 encoded */ if (PyWindowsConsoleIO_Check(raw)) - encoding = "utf-8"; + encoding = L"utf-8"; #endif text = PyUnicode_FromString(name); @@ -1754,10 +1754,25 @@ create_stdio(const _PyCoreConfig *config, PyObject* io, newline = "\n"; #endif - stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssOO", - buf, encoding, errors, + PyObject *encoding_str = PyUnicode_FromWideChar(encoding, -1); + if (encoding_str == NULL) { + Py_CLEAR(buf); + goto error; + } + + PyObject *errors_str = PyUnicode_FromWideChar(errors, -1); + if (errors_str == NULL) { + Py_CLEAR(buf); + Py_CLEAR(encoding_str); + goto error; + } + + stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OOOsOO", + buf, encoding_str, errors_str, newline, line_buffering, write_through); Py_CLEAR(buf); + Py_CLEAR(encoding_str); + Py_CLEAR(errors_str); if (stream == NULL) goto error; @@ -1874,7 +1889,7 @@ init_sys_streams(PyInterpreterState *interp) fd = fileno(stderr); std = create_stdio(config, iomod, fd, 1, "", config->stdio_encoding, - "backslashreplace"); + L"backslashreplace"); if (std == NULL) goto error; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 0f7af2c69da5..fbdeb9b5565c 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -424,7 +424,7 @@ sys_getfilesystemencoding_impl(PyObject *module) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); const _PyCoreConfig *config = &interp->core_config; - return PyUnicode_FromString(config->filesystem_encoding); + return PyUnicode_FromWideChar(config->filesystem_encoding, -1); } /*[clinic input] @@ -439,7 +439,7 @@ sys_getfilesystemencodeerrors_impl(PyObject *module) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); const _PyCoreConfig *config = &interp->core_config; - return PyUnicode_FromString(config->filesystem_errors); + return PyUnicode_FromWideChar(config->filesystem_errors, -1); } /*[clinic input] @@ -1211,30 +1211,9 @@ static PyObject * sys__enablelegacywindowsfsencoding_impl(PyObject *module) /*[clinic end generated code: output=f5c3855b45e24fe9 input=2bfa931a20704492]*/ { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - _PyCoreConfig *config = &interp->core_config; - - /* Set the filesystem encoding to mbcs/replace (PEP 529) */ - char *encoding = _PyMem_RawStrdup("mbcs"); - char *errors = _PyMem_RawStrdup("replace"); - if (encoding == NULL || errors == NULL) { - PyMem_Free(encoding); - PyMem_Free(errors); - PyErr_NoMemory(); - return NULL; - } - - PyMem_RawFree(config->filesystem_encoding); - config->filesystem_encoding = encoding; - PyMem_RawFree(config->filesystem_errors); - config->filesystem_errors = errors; - - if (_Py_SetFileSystemEncoding(config->filesystem_encoding, - config->filesystem_errors) < 0) { - PyErr_NoMemory(); + if (_PyUnicode_EnableLegacyWindowsFSEncoding() < 0) { return NULL; } - Py_RETURN_NONE; } From webhook-mailer at python.org Thu May 2 15:25:38 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 19:25:38 -0000 Subject: [Python-checkins] bpo-36763: _PyCoreConfig_SetPyArgv() preinitializes Python (GH-13037) Message-ID: https://github.com/python/cpython/commit/70005ac0fddd8585725b92acd1bc2b8e7b81999c commit: 70005ac0fddd8585725b92acd1bc2b8e7b81999c branch: master author: Victor Stinner committer: GitHub date: 2019-05-02T15:25:34-04:00 summary: bpo-36763: _PyCoreConfig_SetPyArgv() preinitializes Python (GH-13037) _PyCoreConfig_SetPyArgv() and _PyCoreConfig_SetWideString() now pre-initialize Python if needed to ensure that the locale encoding is properly configured. * Add _Py_PreInitializeFromPyArgv() internal function. * Add 'args' parameter to _Py_PreInitializeFromCoreConfig() files: M Include/internal/pycore_pylifecycle.h M Modules/main.c M Python/coreconfig.c M Python/pylifecycle.c diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 321cc5d27889..adb1f5d90a59 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -8,7 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_pystate.h" /* _PyRuntimeState */ +#include "pycore_coreconfig.h" /* _PyArgv */ +#include "pycore_pystate.h" /* _PyRuntimeState */ /* True if the main interpreter thread exited due to an unhandled * KeyboardInterrupt exception, suggesting the user pressed ^C. */ @@ -90,8 +91,12 @@ extern void _PyGILState_Fini(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyGC_DumpShutdownStats(_PyRuntimeState *runtime); +PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPyArgv( + const _PyPreConfig *src_config, + const _PyArgv *args); PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromCoreConfig( - const _PyCoreConfig *coreconfig); + const _PyCoreConfig *coreconfig, + const _PyArgv *args); #ifdef __cplusplus } diff --git a/Modules/main.c b/Modules/main.c index 575683cd7f88..e117ef29e54d 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -57,14 +57,7 @@ pymain_init(const _PyArgv *args) environment variables (PYTHONUTF8 and PYTHONCOERCECLOCALE) */ preconfig.coerce_c_locale = -1; preconfig.utf8_mode = -1; - if (args->use_bytes_argv) { - err = _Py_PreInitializeFromArgs(&preconfig, - args->argc, args->bytes_argv); - } - else { - err = _Py_PreInitializeFromWideArgs(&preconfig, - args->argc, args->wchar_argv); - } + err = _Py_PreInitializeFromPyArgv(&preconfig, args); if (_Py_INIT_FAILED(err)) { return err; } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 15643be3765a..52026949e202 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -541,11 +541,15 @@ _PyCoreConfig_SetString(wchar_t **config_str, const wchar_t *str) } -/* Decode str using Py_DecodeLocale() and set the result into *config_str */ static _PyInitError _PyCoreConfig_DecodeLocaleErr(wchar_t **config_str, const char *str, const char *decode_err_msg) { + _PyInitError err = _Py_PreInitialize(NULL); + if (_Py_INIT_FAILED(err)) { + return err; + } + wchar_t *str2; if (str != NULL) { size_t len; @@ -572,6 +576,9 @@ _PyCoreConfig_DecodeLocaleErr(wchar_t **config_str, const char *str, _PyCoreConfig_DecodeLocaleErr(config_str, str, "cannot decode " NAME) +/* Decode str using Py_DecodeLocale() and set the result into *config_str. + Pre-initialize Python if needed to ensure that encodings are properly + configured. */ _PyInitError _PyCoreConfig_DecodeLocale(wchar_t **config_str, const char *str) { @@ -2100,10 +2107,30 @@ config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) _PyInitError _PyCoreConfig_SetPyArgv(_PyCoreConfig *config, const _PyArgv *args) { + if (args->use_bytes_argv) { + _PyInitError err; + + err = _PyRuntime_Initialize(); + if (_Py_INIT_FAILED(err)) { + return err; + } + _PyRuntimeState *runtime = &_PyRuntime; + + /* do nothing if Python is already pre-initialized: + _PyCoreConfig_Write() will update _PyRuntime.preconfig later */ + if (!runtime->pre_initialized) { + err = _Py_PreInitializeFromCoreConfig(config, args); + if (_Py_INIT_FAILED(err)) { + return err; + } + } + } return _PyArgv_AsWstrList(args, &config->argv); } +/* Set config.argv: decode argv using Py_DecodeLocale(). Pre-initialize Python + if needed to ensure that encodings are properly configured. */ _PyInitError _PyCoreConfig_SetArgv(_PyCoreConfig *config, int argc, char **argv) { @@ -2138,7 +2165,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config) { _PyInitError err; - err = _Py_PreInitializeFromCoreConfig(config); + err = _Py_PreInitializeFromCoreConfig(config, NULL); if (_Py_INIT_FAILED(err)) { return err; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 2a633cf1cf92..2ba43b99cf3a 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -683,8 +683,8 @@ _Py_InitializeCore_impl(_PyRuntimeState *runtime, } -static _PyInitError -preinit(const _PyPreConfig *src_config, const _PyArgv *args) +_PyInitError +_Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args) { _PyInitError err; @@ -726,11 +726,12 @@ preinit(const _PyPreConfig *src_config, const _PyArgv *args) return err; } + _PyInitError _Py_PreInitializeFromArgs(const _PyPreConfig *src_config, int argc, char **argv) { _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv}; - return preinit(src_config, &args); + return _Py_PreInitializeFromPyArgv(src_config, &args); } @@ -738,24 +739,26 @@ _PyInitError _Py_PreInitializeFromWideArgs(const _PyPreConfig *src_config, int argc, wchar_t **argv) { _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv}; - return preinit(src_config, &args); + return _Py_PreInitializeFromPyArgv(src_config, &args); } _PyInitError _Py_PreInitialize(const _PyPreConfig *src_config) { - return preinit(src_config, NULL); + return _Py_PreInitializeFromPyArgv(src_config, NULL); } _PyInitError -_Py_PreInitializeFromCoreConfig(const _PyCoreConfig *coreconfig) +_Py_PreInitializeFromCoreConfig(const _PyCoreConfig *coreconfig, + const _PyArgv *args) { - assert(coreconfig != NULL); _PyPreConfig config = _PyPreConfig_INIT; - _PyCoreConfig_GetCoreConfig(&config, coreconfig); - return _Py_PreInitialize(&config); + if (coreconfig != NULL) { + _PyCoreConfig_GetCoreConfig(&config, coreconfig); + } + return _Py_PreInitializeFromPyArgv(&config, args); /* No need to clear config: _PyCoreConfig_GetCoreConfig() doesn't allocate memory */ } @@ -823,12 +826,7 @@ _Py_InitializeCore(_PyRuntimeState *runtime, { _PyInitError err; - if (src_config) { - err = _Py_PreInitializeFromCoreConfig(src_config); - } - else { - err = _Py_PreInitialize(NULL); - } + err = _Py_PreInitializeFromCoreConfig(src_config, args); if (_Py_INIT_FAILED(err)) { return err; } From webhook-mailer at python.org Thu May 2 15:29:11 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 19:29:11 -0000 Subject: [Python-checkins] [3.7] bpo-14546: Fix the argument handling in Tools/scripts/lll.py (GH-13026) (GH-13060) Message-ID: https://github.com/python/cpython/commit/e85ba1e69288e3fce400ed4cdbefab58934b5904 commit: e85ba1e69288e3fce400ed4cdbefab58934b5904 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-05-02T15:29:06-04:00 summary: [3.7] bpo-14546: Fix the argument handling in Tools/scripts/lll.py (GH-13026) (GH-13060) (cherry picked from commit c4e78b116f9a4299f3b3bfbbd18ef49782bb1143) Co-authored-by: Zackery Spytz files: A Lib/test/test_tools/test_lll.py A Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst M Tools/scripts/lll.py diff --git a/Lib/test/test_tools/test_lll.py b/Lib/test/test_tools/test_lll.py new file mode 100644 index 000000000000..f3fbe961eee5 --- /dev/null +++ b/Lib/test/test_tools/test_lll.py @@ -0,0 +1,39 @@ +"""Tests for the lll script in the Tools/script directory.""" + +import os +import tempfile +from test import support +from test.test_tools import skip_if_missing, import_tool +import unittest + +skip_if_missing() + + +class lllTests(unittest.TestCase): + + def setUp(self): + self.lll = import_tool('lll') + + @support.skip_unless_symlink + def test_lll_multiple_dirs(self): + with tempfile.TemporaryDirectory() as dir1, \ + tempfile.TemporaryDirectory() as dir2: + fn1 = os.path.join(dir1, 'foo1') + fn2 = os.path.join(dir2, 'foo2') + for fn, dir in (fn1, dir1), (fn2, dir2): + open(fn, 'w').close() + os.symlink(fn, os.path.join(dir, 'symlink')) + + with support.captured_stdout() as output: + self.lll.main([dir1, dir2]) + self.assertEqual(output.getvalue(), + f'{dir1}:\n' + f'symlink -> {fn1}\n' + f'\n' + f'{dir2}:\n' + f'symlink -> {fn2}\n' + ) + + +if __name__ == '__main__': + unittest.main() diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst b/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst new file mode 100644 index 000000000000..b8659b886af8 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst @@ -0,0 +1 @@ +Fix the argument handling in Tools/scripts/lll.py. diff --git a/Tools/scripts/lll.py b/Tools/scripts/lll.py index aa4e55091e59..1b48eac8aad8 100755 --- a/Tools/scripts/lll.py +++ b/Tools/scripts/lll.py @@ -13,8 +13,7 @@ def lll(dirname): full = os.path.join(dirname, name) if os.path.islink(full): print(name, '->', os.readlink(full)) -def main(): - args = sys.argv[1:] +def main(args): if not args: args = [os.curdir] first = 1 for arg in args: @@ -22,7 +21,7 @@ def main(): if not first: print() first = 0 print(arg + ':') - lll(arg) + lll(arg) if __name__ == '__main__': - main() + main(sys.argv[1:]) From webhook-mailer at python.org Thu May 2 15:29:25 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 19:29:25 -0000 Subject: [Python-checkins] [2.7] bpo-14546: Fix the argument handling in Tools/scripts/lll.py (GH-13026) (GH-13063) Message-ID: https://github.com/python/cpython/commit/7c2c01f02a1821298a62dd16ecc3a12da663e14b commit: 7c2c01f02a1821298a62dd16ecc3a12da663e14b branch: 2.7 author: Zackery Spytz committer: Victor Stinner date: 2019-05-02T15:29:21-04:00 summary: [2.7] bpo-14546: Fix the argument handling in Tools/scripts/lll.py (GH-13026) (GH-13063) (cherry picked from commit c4e78b116f9a4299f3b3bfbbd18ef49782bb1143) files: A Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst M Lib/test/test_tools.py M Tools/scripts/lll.py diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools.py index 51e4fd61c77a..39116b3a79d5 100644 --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools.py @@ -445,6 +445,33 @@ def run_script(self, input="", args=("-",), substfile="xx yy\n"): return output.getvalue() +class LllTests(unittest.TestCase): + + script = os.path.join(scriptsdir, 'lll.py') + + @unittest.skipUnless(hasattr(os, 'symlink'), 'Requires symlink support') + def test_lll_multiple_dirs(self): + dir1 = tempfile.mkdtemp() + dir2 = tempfile.mkdtemp() + self.addCleanup(test_support.rmtree, dir1) + self.addCleanup(test_support.rmtree, dir2) + fn1 = os.path.join(dir1, 'foo1') + fn2 = os.path.join(dir2, 'foo2') + for fn, dir in (fn1, dir1), (fn2, dir2): + open(fn, 'w').close() + os.symlink(fn, os.path.join(dir, 'symlink')) + + rc, out, err = assert_python_ok(self.script, dir1, dir2) + self.assertEqual(out, + '{dir1}:\n' + 'symlink -> {fn1}\n' + '\n' + '{dir2}:\n' + 'symlink -> {fn2}\n' + .format(dir1=dir1, fn1=fn1, dir2=dir2, fn2=fn2) + ) + + def test_main(): test_support.run_unittest(*[obj for obj in globals().values() if isinstance(obj, type)]) diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst b/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst new file mode 100644 index 000000000000..b8659b886af8 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst @@ -0,0 +1 @@ +Fix the argument handling in Tools/scripts/lll.py. diff --git a/Tools/scripts/lll.py b/Tools/scripts/lll.py index 9902d9d394b2..c6de245ab4e4 100755 --- a/Tools/scripts/lll.py +++ b/Tools/scripts/lll.py @@ -13,8 +13,7 @@ def lll(dirname): full = os.path.join(dirname, name) if os.path.islink(full): print name, '->', os.readlink(full) -def main(): - args = sys.argv[1:] +def main(args): if not args: args = [os.curdir] first = 1 for arg in args: @@ -22,7 +21,7 @@ def main(): if not first: print first = 0 print arg + ':' - lll(arg) + lll(arg) if __name__ == '__main__': - main() + main(sys.argv[1:]) From webhook-mailer at python.org Thu May 2 15:30:25 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 02 May 2019 19:30:25 -0000 Subject: [Python-checkins] bpo-36763: Remove _PyCoreConfig._init_main (GH-13066) Message-ID: https://github.com/python/cpython/commit/4631da1242fc96002a3c0462a87d087e567368aa commit: 4631da1242fc96002a3c0462a87d087e567368aa branch: master author: Victor Stinner committer: GitHub date: 2019-05-02T15:30:21-04:00 summary: bpo-36763: Remove _PyCoreConfig._init_main (GH-13066) files: M Include/cpython/coreconfig.h M Lib/test/test_embed.py M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/coreconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 5672080b784f..47a6baa1118f 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -391,9 +391,6 @@ typedef struct { If set to -1 (default), inherit Py_FrozenFlag value. */ int _frozen; - /* If non-zero, use "main" Python initialization */ - int _init_main; - } _PyCoreConfig; #ifdef MS_WINDOWS @@ -428,8 +425,7 @@ typedef struct { .buffered_stdio = -1, \ ._install_importlib = 1, \ .check_hash_pycs_mode = NULL, \ - ._frozen = -1, \ - ._init_main = 1} + ._frozen = -1} /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ #ifdef __cplusplus diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index fb0051957aad..fdf5793789df 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -348,7 +348,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_install_importlib': 1, 'check_hash_pycs_mode': 'default', '_frozen': 0, - '_init_main': 1, } if MS_WINDOWS: DEFAULT_PRE_CONFIG.update({ @@ -443,7 +442,10 @@ def get_expected_config(self, expected, env): raise Exception(f"failed to get the default config: " f"stdout={proc.stdout!r} stderr={proc.stderr!r}") stdout = proc.stdout.decode('utf-8') - config = json.loads(stdout) + try: + config = json.loads(stdout) + except json.JSONDecodeError: + self.fail(f"fail to decode stdout: {stdout!r}") for key, value in expected.items(): if value is self.GET_DEFAULT_CONFIG: @@ -496,7 +498,10 @@ def check_config(self, testname, expected_config, expected_preconfig): out, err = self.run_embedded_interpreter(testname, env=env) # Ignore err - config = json.loads(out) + try: + config = json.loads(out) + except json.JSONDecodeError: + self.fail(f"fail to decode stdout: {out!r}") expected_preconfig = dict(self.DEFAULT_PRE_CONFIG, **expected_preconfig) expected_config = self.get_expected_config(expected_config, env) @@ -533,7 +538,6 @@ def test_init_global_config(self): 'filesystem_encoding': 'utf-8', 'filesystem_errors': self.UTF8_MODE_ERRORS, 'user_site_directory': 0, - '_frozen': 1, } self.check_config("init_global_config", config, preconfig) @@ -578,7 +582,6 @@ def test_init_from_config(self): 'faulthandler': 1, 'check_hash_pycs_mode': 'always', - '_frozen': 1, } self.check_config("init_from_config", config, preconfig) diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 6f77e86a9e66..0818012d8c5a 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -84,7 +84,6 @@ main(int argc, char *argv[]) /* Don't install importlib, since it could execute outdated bytecode. */ config._install_importlib = 0; config._frozen = 1; - config._init_main = 0; _PyInitError err = _Py_InitializeFromConfig(&config); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 2cadf82cb17f..b12594799bfc 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -354,8 +354,6 @@ static int test_init_global_config(void) putenv("PYTHONUNBUFFERED="); Py_UnbufferedStdioFlag = 1; - Py_FrozenFlag = 1; - /* FIXME: test Py_LegacyWindowsFSEncodingFlag */ /* FIXME: test Py_LegacyWindowsStdioFlag */ @@ -497,9 +495,6 @@ static int test_init_from_config(void) config.check_hash_pycs_mode = L"always"; - Py_FrozenFlag = 0; - config._frozen = 1; - err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 52026949e202..ac01712127ac 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -667,7 +667,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_WSTR_ATTR(run_filename); COPY_WSTR_ATTR(check_hash_pycs_mode); COPY_ATTR(_frozen); - COPY_ATTR(_init_main); #undef COPY_ATTR #undef COPY_WSTR_ATTR @@ -766,7 +765,6 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_INT(_install_importlib); SET_ITEM_WSTR(check_hash_pycs_mode); SET_ITEM_INT(_frozen); - SET_ITEM_INT(_init_main); return dict; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 2ba43b99cf3a..bd4d1d92662a 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -988,7 +988,7 @@ init_python(const _PyCoreConfig *config, const _PyArgv *args) } config = &interp->core_config; - if (config->_init_main) { + if (!config->_frozen) { err = _Py_InitializeMainInterpreter(runtime, interp); if (_Py_INIT_FAILED(err)) { return err; From webhook-mailer at python.org Thu May 2 15:34:06 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Thu, 02 May 2019 19:34:06 -0000 Subject: [Python-checkins] [3.7] bpo-34162: Fix idlelib/NEWS.text for 3.7.4 (#13067) Message-ID: https://github.com/python/cpython/commit/304ca211c4912f040151e518d9d66fd2d625c5e9 commit: 304ca211c4912f040151e518d9d66fd2d625c5e9 branch: 3.7 author: Terry Jan Reedy committer: GitHub date: 2019-05-02T15:34:01-04:00 summary: [3.7] bpo-34162: Fix idlelib/NEWS.text for 3.7.4 (#13067) files: M Lib/idlelib/NEWS.txt diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 6340e19bb80b..3f0480e0acab 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -1,5 +1,5 @@ -What's New in IDLE 3.7.3 -Released on 2019-??-?? +What's New in IDLE 3.7.4 +Released on 2019-06-24? ====================================== @@ -19,6 +19,11 @@ This param was only used twice and changed the return type. bpo-23216: IDLE: Add docstrings to search modules. + +What's New in IDLE 3.7.3 +Released on 2019-03-25 +====================================== + bpo-36176: Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux dark themes (and slightly darken calltip background). @@ -74,7 +79,7 @@ Add some internal references within the IDLE doc. What's New in IDLE 3.7.2 -Released on 2018-12-21? +Released on 2018-12-24 ====================================== bpo-34864: When starting IDLE on MacOS, warn if the system setting @@ -117,7 +122,7 @@ The main change is the elimination of chapter-section numbers. What's New in IDLE 3.7.1 -Released on 2018-07-31? +Released on 2018-10-20 ====================================== bpo-1529353: Output over N lines (50 by default) is squeezed down to a button. From webhook-mailer at python.org Thu May 2 16:11:10 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Thu, 02 May 2019 20:11:10 -0000 Subject: [Python-checkins] Add correct license for C14N test suite to license docs. (GH-13055) Message-ID: https://github.com/python/cpython/commit/45e92fc02d57a7219f4f4922179929f19b3d1c28 commit: 45e92fc02d57a7219f4f4922179929f19b3d1c28 branch: master author: Stefan Behnel committer: GitHub date: 2019-05-02T22:11:04+02:00 summary: Add correct license for C14N test suite to license docs. (GH-13055) files: M Doc/license.rst M Lib/test/xmltestdata/c14n-20/README diff --git a/Doc/license.rst b/Doc/license.rst index a315b6f8134d..d3733f53a116 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -913,3 +913,40 @@ library unless the build is configured ``--with-system-libmpdec``:: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +W3C C14N test suite +------------------- + +The C14N 2.0 test suite in the :mod:`test` package +(``Lib/test/xmltestdata/c14n-20/``) was retrieved from the W3C website at +https://www.w3.org/TR/xml-c14n2-testcases/ and is distributed under the +3-clause BSD license: + + Copyright (c) 2013 W3C(R) (MIT, ERCIM, Keio, Beihang), + All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of works must retain the original copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the original copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the W3C nor the names of its contributors may be + used to endorse or promote products derived from this work without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Lib/test/xmltestdata/c14n-20/README b/Lib/test/xmltestdata/c14n-20/README index 06e637045420..45e75b9bd98e 100644 --- a/Lib/test/xmltestdata/c14n-20/README +++ b/Lib/test/xmltestdata/c14n-20/README @@ -9,6 +9,32 @@ Direct source: https://www.w3.org/TR/xml-c14n2-testcases/files/ Copied and distributed under these terms: +https://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html Copyright ? 2013 W3C? (MIT, ERCIM, Keio, Beihang), -http://www.w3.org/Consortium/Legal/2015/doc-license +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of works must retain the original copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the original copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the W3C nor the names of its contributors may be + used to endorse or promote products derived from this work without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From webhook-mailer at python.org Fri May 3 08:22:43 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 03 May 2019 12:22:43 -0000 Subject: [Python-checkins] bpo:34848 : Correct an incorrect docstring for range().index method (GH-9877) Message-ID: https://github.com/python/cpython/commit/22c526394b2ef51b985873ddbfbcc32c16411919 commit: 22c526394b2ef51b985873ddbfbcc32c16411919 branch: master author: Srinivas Reddy Thatiparthy (?????????? ?????? ?????????) committer: Victor Stinner date: 2019-05-03T08:22:11-04:00 summary: bpo:34848 : Correct an incorrect docstring for range().index method (GH-9877) files: M Objects/rangeobject.c diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 4b8e5ed4cfd4..ac868f6951c2 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -645,7 +645,7 @@ PyDoc_STRVAR(count_doc, "rangeobject.count(value) -> integer -- return number of occurrences of value"); PyDoc_STRVAR(index_doc, -"rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n" +"rangeobject.index(value) -> integer -- return index of value.\n" "Raise ValueError if the value is not present."); static PyMethodDef range_methods[] = { From webhook-mailer at python.org Fri May 3 08:39:22 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 May 2019 12:39:22 -0000 Subject: [Python-checkins] bpo:34848 : Correct an incorrect docstring for range().index method (GH-9877) Message-ID: https://github.com/python/cpython/commit/128e2262a8ffc7b94e44455cc1ba2e0f74316461 commit: 128e2262a8ffc7b94e44455cc1ba2e0f74316461 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-03T05:39:17-07:00 summary: bpo:34848 : Correct an incorrect docstring for range().index method (GH-9877) (cherry picked from commit 22c526394b2ef51b985873ddbfbcc32c16411919) Co-authored-by: Srinivas Reddy Thatiparthy (?????????? ?????? ?????????) files: M Objects/rangeobject.c diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 037be870e36a..157ab8194764 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -645,7 +645,7 @@ PyDoc_STRVAR(count_doc, "rangeobject.count(value) -> integer -- return number of occurrences of value"); PyDoc_STRVAR(index_doc, -"rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n" +"rangeobject.index(value) -> integer -- return index of value.\n" "Raise ValueError if the value is not present."); static PyMethodDef range_methods[] = { From webhook-mailer at python.org Fri May 3 10:59:25 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 May 2019 14:59:25 -0000 Subject: [Python-checkins] Don't use the LHS/RHS acronym in Simple statements (GH-12996) Message-ID: https://github.com/python/cpython/commit/5861cddf76215b8390d48069a35d30a5c3ec92c1 commit: 5861cddf76215b8390d48069a35d30a5c3ec92c1 branch: master author: Andre Delfino committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-03T07:59:05-07:00 summary: Don't use the LHS/RHS acronym in Simple statements (GH-12996) Prefer the full wording instead, as it is more meaningful for someone not familiar with the terms. Also, LFS/RHS is not used anywhere else in the documentation, while left/right-hand side mentions are common. files: M Doc/reference/simple_stmts.rst diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 207057cbc124..af7c0caff627 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -169,12 +169,12 @@ Assignment of an object to a single target is recursively defined as follows. .. _attr-target-note: Note: If the object is a class instance and the attribute reference occurs on - both sides of the assignment operator, the RHS expression, ``a.x`` can access + both sides of the assignment operator, the right-hand side expression, ``a.x`` can access either an instance attribute or (if no instance attribute exists) a class - attribute. The LHS target ``a.x`` is always set as an instance attribute, + attribute. The left-hand side target ``a.x`` is always set as an instance attribute, creating it if necessary. Thus, the two occurrences of ``a.x`` do not - necessarily refer to the same attribute: if the RHS expression refers to a - class attribute, the LHS creates a new instance attribute as the target of the + necessarily refer to the same attribute: if the right-hand side expression refers to a + class attribute, the left-hand side creates a new instance attribute as the target of the assignment:: class Cls: From webhook-mailer at python.org Fri May 3 11:08:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 May 2019 15:08:16 -0000 Subject: [Python-checkins] Improve grammar on async context managers and shorten text (GH-12379) Message-ID: https://github.com/python/cpython/commit/a8a79cacca4a03e2e682bf10108c80f502791755 commit: a8a79cacca4a03e2e682bf10108c80f502791755 branch: master author: Andre Delfino committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-03T08:08:10-07:00 summary: Improve grammar on async context managers and shorten text (GH-12379) files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 1683d25db924..bad611e81c3e 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2680,13 +2680,13 @@ Asynchronous context managers can be used in an :keyword:`async with` statement. .. method:: object.__aenter__(self) - This method is semantically similar to the :meth:`__enter__`, with only - difference that it must return an *awaitable*. + Semantically similar to :meth:`__enter__`, the only + difference being that it must return an *awaitable*. .. method:: object.__aexit__(self, exc_type, exc_value, traceback) - This method is semantically similar to the :meth:`__exit__`, with only - difference that it must return an *awaitable*. + Semantically similar to :meth:`__exit__`, the only + difference being that it must return an *awaitable*. An example of an asynchronous context manager class:: From webhook-mailer at python.org Fri May 3 11:09:21 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 May 2019 15:09:21 -0000 Subject: [Python-checkins] bpo-36341: Fix tests calling bind() on AF_UNIX sockets (GH-12399) Message-ID: https://github.com/python/cpython/commit/4461d704e23a13dfbe78ea3020e4cbeff4b68dc2 commit: 4461d704e23a13dfbe78ea3020e4cbeff4b68dc2 branch: master author: xdegaye committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-03T08:09:17-07:00 summary: bpo-36341: Fix tests calling bind() on AF_UNIX sockets (GH-12399) Those tests may fail with PermissionError. https://bugs.python.org/issue36341 files: A Misc/NEWS.d/next/Tests/2019-03-18-10-47-45.bpo-36341.UXlY0P.rst M Lib/test/test_asyncio/test_server.py M Lib/test/test_socket.py M Lib/test/test_stat.py diff --git a/Lib/test/test_asyncio/test_server.py b/Lib/test/test_asyncio/test_server.py index 6de058a1e9bf..ab7f3debbc15 100644 --- a/Lib/test/test_asyncio/test_server.py +++ b/Lib/test/test_asyncio/test_server.py @@ -73,7 +73,7 @@ class SelectorStartServerTests(BaseStartServer, unittest.TestCase): def new_loop(self): return asyncio.SelectorEventLoop() - @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'no Unix sockets') + @support.skip_unless_bind_unix_socket def test_start_unix_server_1(self): HELLO_MSG = b'1' * 1024 * 5 + b'\n' started = threading.Event() diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 815f9adce677..0094cecb79cc 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1796,8 +1796,13 @@ def test_socket_fileno(self): self.addCleanup(shutil.rmtree, tmpdir) s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.addCleanup(s.close) - s.bind(os.path.join(tmpdir, 'socket')) - self._test_socket_fileno(s, socket.AF_UNIX, socket.SOCK_STREAM) + try: + s.bind(os.path.join(tmpdir, 'socket')) + except PermissionError: + pass + else: + self._test_socket_fileno(s, socket.AF_UNIX, + socket.SOCK_STREAM) def test_socket_fileno_rejects_float(self): with self.assertRaisesRegex(TypeError, "integer argument expected"): diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py index 38ff2bcf8a6b..17443bed0738 100644 --- a/Lib/test/test_stat.py +++ b/Lib/test/test_stat.py @@ -2,7 +2,8 @@ import os import socket import sys -from test.support import TESTFN, import_fresh_module +from test.support import (TESTFN, import_fresh_module, + skip_unless_bind_unix_socket) c_stat = import_fresh_module('stat', fresh=['_stat']) py_stat = import_fresh_module('stat', blocked=['_stat']) @@ -192,7 +193,7 @@ def test_devices(self): self.assertS_IS("BLK", st_mode) break - @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'requires unix socket') + @skip_unless_bind_unix_socket def test_socket(self): with socket.socket(socket.AF_UNIX) as s: s.bind(TESTFN) diff --git a/Misc/NEWS.d/next/Tests/2019-03-18-10-47-45.bpo-36341.UXlY0P.rst b/Misc/NEWS.d/next/Tests/2019-03-18-10-47-45.bpo-36341.UXlY0P.rst new file mode 100644 index 000000000000..b76447d6cf97 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-18-10-47-45.bpo-36341.UXlY0P.rst @@ -0,0 +1,2 @@ +Fix tests that may fail with PermissionError upon calling bind() on AF_UNIX +sockets. From webhook-mailer at python.org Fri May 3 11:18:07 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 May 2019 15:18:07 -0000 Subject: [Python-checkins] bpo-36613: call remove_done_callback if exception (GH-12800) Message-ID: https://github.com/python/cpython/commit/c1964e9e2177eabe821f3e4243be8b99e0d2d542 commit: c1964e9e2177eabe821f3e4243be8b99e0d2d542 branch: master author: gescheit committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-03T08:18:02-07:00 summary: bpo-36613: call remove_done_callback if exception (GH-12800) Call remove_done_callback() in finally block. https://bugs.python.org/issue36613 files: A Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst M Lib/asyncio/tasks.py diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index d8508376d92a..007a459857d2 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -495,10 +495,11 @@ def _on_completion(f): finally: if timeout_handle is not None: timeout_handle.cancel() + for f in fs: + f.remove_done_callback(_on_completion) done, pending = set(), set() for f in fs: - f.remove_done_callback(_on_completion) if f.done(): done.add(f) else: diff --git a/Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst b/Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst new file mode 100644 index 000000000000..8828dccad69c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst @@ -0,0 +1 @@ +Fix :mod:`asyncio` wait() not removing callback if exception \ No newline at end of file From webhook-mailer at python.org Fri May 3 11:25:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 May 2019 15:25:43 -0000 Subject: [Python-checkins] Fixed typo (GH-11522) Message-ID: https://github.com/python/cpython/commit/ceb842e155f5fa0109fa88d52da3d1f5e73490ad commit: ceb842e155f5fa0109fa88d52da3d1f5e73490ad branch: master author: Alexander Vasin committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-03T08:25:36-07:00 summary: Fixed typo (GH-11522) Given example does not run, loop variable is missing. Secondly, this is bad example how to handle shutdown signal, because it would cause `RuntimeError: Event loop stopped before Future completed.` Perhaps it would be better to cancel all tasks instead of closing loop directly? Did not create issue, because question is quite simple. files: M Doc/library/asyncio-eventloop.rst diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index bf7c93a86fd0..e2b312453921 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -1601,7 +1601,7 @@ using the :meth:`loop.add_signal_handler` method:: import os import signal - def ask_exit(signame): + def ask_exit(signame, loop): print("got signal %s: exit" % signame) loop.stop() @@ -1611,7 +1611,7 @@ using the :meth:`loop.add_signal_handler` method:: for signame in {'SIGINT', 'SIGTERM'}: loop.add_signal_handler( getattr(signal, signame), - functools.partial(ask_exit, signame)) + functools.partial(ask_exit, signame, loop)) await asyncio.sleep(3600) From webhook-mailer at python.org Fri May 3 11:35:31 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Fri, 03 May 2019 15:35:31 -0000 Subject: [Python-checkins] bpo-24638: Improve the error message in asyncio.ensure_future() (#12848) Message-ID: https://github.com/python/cpython/commit/4737b923df6fbdb9e2bf3fdccea2112270556e0a commit: 4737b923df6fbdb9e2bf3fdccea2112270556e0a branch: master author: Zackery Spytz committer: Andrew Svetlov date: 2019-05-03T11:35:25-04:00 summary: bpo-24638: Improve the error message in asyncio.ensure_future() (#12848) files: M Lib/asyncio/tasks.py M Lib/test/test_asyncio/test_tasks.py diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 007a459857d2..b007b74344ed 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -628,7 +628,8 @@ def ensure_future(coro_or_future, *, loop=None): return task elif futures.isfuture(coro_or_future): if loop is not None and loop is not futures._get_loop(coro_or_future): - raise ValueError('loop argument must agree with Future') + raise ValueError('The future belongs to a different loop than ' + 'the one specified as the loop argument') return coro_or_future elif inspect.isawaitable(coro_or_future): return ensure_future(_wrap_awaitable(coro_or_future), loop=loop) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 1cdff528def4..c4f6d703549c 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -236,6 +236,15 @@ def test_ensure_future_neither(self): with self.assertRaises(TypeError): asyncio.ensure_future('ok') + def test_ensure_future_error_msg(self): + loop = asyncio.new_event_loop() + f = self.new_future(self.loop) + with self.assertRaisesRegex(ValueError, 'The future belongs to a ' + 'different loop than the one specified as ' + 'the loop argument'): + asyncio.ensure_future(f, loop=loop) + loop.close() + def test_get_stack(self): T = None From webhook-mailer at python.org Fri May 3 11:35:55 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 May 2019 15:35:55 -0000 Subject: [Python-checkins] bpo-36613: call remove_done_callback if exception (GH-12800) Message-ID: https://github.com/python/cpython/commit/769ac7e7b809dfc60abd0d7e6f020c6ffe06a6c0 commit: 769ac7e7b809dfc60abd0d7e6f020c6ffe06a6c0 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-03T08:35:52-07:00 summary: bpo-36613: call remove_done_callback if exception (GH-12800) Call remove_done_callback() in finally block. https://bugs.python.org/issue36613 (cherry picked from commit c1964e9e2177eabe821f3e4243be8b99e0d2d542) Co-authored-by: gescheit files: A Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst M Lib/asyncio/tasks.py diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 416c346be2ec..2af4f32a51a4 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -457,10 +457,11 @@ def _on_completion(f): finally: if timeout_handle is not None: timeout_handle.cancel() + for f in fs: + f.remove_done_callback(_on_completion) done, pending = set(), set() for f in fs: - f.remove_done_callback(_on_completion) if f.done(): done.add(f) else: diff --git a/Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst b/Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst new file mode 100644 index 000000000000..8828dccad69c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst @@ -0,0 +1 @@ +Fix :mod:`asyncio` wait() not removing callback if exception \ No newline at end of file From webhook-mailer at python.org Fri May 3 12:53:29 2019 From: webhook-mailer at python.org (=?utf-8?q?=C3=89ric?= Araujo) Date: Fri, 03 May 2019 16:53:29 -0000 Subject: [Python-checkins] bpo-33882: mention breakpoint() in debugger-related FAQ (GH-7759) Message-ID: https://github.com/python/cpython/commit/cf48e55f7f7718482fa712552f0cbc0aea1c826f commit: cf48e55f7f7718482fa712552f0cbc0aea1c826f branch: master author: Andre Delfino committer: ?ric Araujo date: 2019-05-03T12:53:21-04:00 summary: bpo-33882: mention breakpoint() in debugger-related FAQ (GH-7759) files: M Doc/faq/programming.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 31614189a62d..f14e8cc824ef 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -16,6 +16,9 @@ Is there a source code level debugger with breakpoints, single-stepping, etc.? Yes. +Several debuggers for Python are described below, and the built-in function +:func:`breakpoint` allows you to drop into any of them. + The pdb module is a simple but adequate console-mode debugger for Python. It is part of the standard Python library, and is :mod:`documented in the Library Reference Manual `. You can also write your own debugger by using the code From webhook-mailer at python.org Fri May 3 14:58:22 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Fri, 03 May 2019 18:58:22 -0000 Subject: [Python-checkins] bpo-28238: Implement "{*}tag" and "{ns}*" wildcard tag selection support for ElementPath, and extend the surrounding tests and docs. (GH-12997) Message-ID: https://github.com/python/cpython/commit/47541689ccea79dfcb055c6be5800b13fcb6bdd2 commit: 47541689ccea79dfcb055c6be5800b13fcb6bdd2 branch: master author: Stefan Behnel committer: GitHub date: 2019-05-03T20:58:16+02:00 summary: bpo-28238: Implement "{*}tag" and "{ns}*" wildcard tag selection support for ElementPath, and extend the surrounding tests and docs. (GH-12997) files: A Misc/NEWS.d/next/Library/2019-04-28-15-01-29.bpo-28238.gdk38f.rst M Doc/library/xml.etree.elementtree.rst M Doc/whatsnew/3.8.rst M Lib/test/test_xml_etree.py M Lib/xml/etree/ElementPath.py M Modules/_elementtree.c diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index ef74d0c852cd..c4667315793e 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -399,6 +399,12 @@ module. We'll be using the ``countrydata`` XML document from the # All 'neighbor' nodes that are the second child of their parent root.findall(".//neighbor[2]") +For XML with namespaces, use the usual qualified ``{namespace}tag`` notation:: + + # All dublin-core "title" tags in the document + root.findall(".//{http://purl.org/dc/elements/1.1/}title") + + Supported XPath syntax ^^^^^^^^^^^^^^^^^^^^^^ @@ -411,9 +417,16 @@ Supported XPath syntax | | For example, ``spam`` selects all child elements | | | named ``spam``, and ``spam/egg`` selects all | | | grandchildren named ``egg`` in all children named | -| | ``spam``. | +| | ``spam``. ``{namespace}*`` selects all tags in the | +| | given namespace, ``{*}spam`` selects tags named | +| | ``spam`` in any (or no) namespace, and ``{}*`` | +| | only selects tags that are not in a namespace. | +| | | +| | .. versionchanged:: 3.8 | +| | Support for star-wildcards was added. | +-----------------------+------------------------------------------------------+ -| ``*`` | Selects all child elements. For example, ``*/egg`` | +| ``*`` | Selects all child elements, including comments and | +| | processing instructions. For example, ``*/egg`` | | | selects all grandchildren named ``egg``. | +-----------------------+------------------------------------------------------+ | ``.`` | Selects the current node. This is mostly useful | diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 82be92786ab0..764bd00544d9 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -532,6 +532,11 @@ xml external entities by default. (Contributed by Christian Heimes in :issue:`17239`.) +* The ``.find*()`` methods in the :mod:`xml.etree.ElementTree` module + support wildcard searches like ``{*}tag`` which ignores the namespace + and ``{namespace}*`` which returns all tags in the given namespace. + (Contributed by Stefan Behnel in :issue:`28238`.) + * The :mod:`xml.etree.ElementTree` module provides a new function :func:`?xml.etree.ElementTree.canonicalize()` that implements C14N 2.0. (Contributed by Stefan Behnel in :issue:`13611`.) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index a59a11f025da..ca6862cae44a 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1137,16 +1137,21 @@ def test_doctype_public(self): def test_xpath_tokenizer(self): # Test the XPath tokenizer. from xml.etree import ElementPath - def check(p, expected): + def check(p, expected, namespaces=None): self.assertEqual([op or tag - for op, tag in ElementPath.xpath_tokenizer(p)], + for op, tag in ElementPath.xpath_tokenizer(p, namespaces)], expected) # tests from the xml specification check("*", ['*']) + check("{ns}*", ['{ns}*']) + check("{}*", ['{}*']) + check("{*}tag", ['{*}tag']) + check("{*}*", ['{*}*']) check("text()", ['text', '()']) check("@name", ['@', 'name']) check("@*", ['@', '*']) + check("@{ns}attr", ['@', '{ns}attr']) check("para[1]", ['para', '[', '1', ']']) check("para[last()]", ['para', '[', 'last', '()', ']']) check("*/para", ['*', '/', 'para']) @@ -1158,6 +1163,7 @@ def check(p, expected): check("//olist/item", ['//', 'olist', '/', 'item']) check(".", ['.']) check(".//para", ['.', '//', 'para']) + check(".//{*}tag", ['.', '//', '{*}tag']) check("..", ['..']) check("../@lang", ['..', '/', '@', 'lang']) check("chapter[title]", ['chapter', '[', 'title', ']']) @@ -1168,6 +1174,8 @@ def check(p, expected): check("{http://spam}egg", ['{http://spam}egg']) check("./spam.egg", ['.', '/', 'spam.egg']) check(".//{http://spam}egg", ['.', '//', '{http://spam}egg']) + check("./xsd:type", ['.', '/', '{http://www.w3.org/2001/XMLSchema}type'], + {'xsd': 'http://www.w3.org/2001/XMLSchema'}) def test_processinginstruction(self): # Test ProcessingInstruction directly @@ -2669,6 +2677,50 @@ def test_findall_different_nsmaps(self): self.assertEqual(len(root.findall(".//xx:b", namespaces=nsmap)), 2) self.assertEqual(len(root.findall(".//b", namespaces=nsmap)), 1) + def test_findall_wildcard(self): + root = ET.XML(''' + + + + + ''') + root.append(ET.Comment('test')) + + self.assertEqual(summarize_list(root.findall("{*}b")), + ['{X}b', 'b', '{Y}b']) + self.assertEqual(summarize_list(root.findall("{*}c")), + ['c']) + self.assertEqual(summarize_list(root.findall("{X}*")), + ['{X}b']) + self.assertEqual(summarize_list(root.findall("{Y}*")), + ['{Y}b']) + self.assertEqual(summarize_list(root.findall("{}*")), + ['b', 'c']) + self.assertEqual(summarize_list(root.findall("{}b")), # only for consistency + ['b']) + self.assertEqual(summarize_list(root.findall("{}b")), + summarize_list(root.findall("b"))) + self.assertEqual(summarize_list(root.findall("{*}*")), + ['{X}b', 'b', 'c', '{Y}b']) + # This is an unfortunate difference, but that's how find('*') works. + self.assertEqual(summarize_list(root.findall("{*}*") + [root[-1]]), + summarize_list(root.findall("*"))) + + self.assertEqual(summarize_list(root.findall(".//{*}b")), + ['{X}b', 'b', '{X}b', 'b', '{Y}b']) + self.assertEqual(summarize_list(root.findall(".//{*}c")), + ['c', 'c']) + self.assertEqual(summarize_list(root.findall(".//{X}*")), + ['{X}b', '{X}b']) + self.assertEqual(summarize_list(root.findall(".//{Y}*")), + ['{Y}b']) + self.assertEqual(summarize_list(root.findall(".//{}*")), + ['c', 'b', 'c', 'b']) + self.assertEqual(summarize_list(root.findall(".//{}b")), # only for consistency + ['b', 'b']) + self.assertEqual(summarize_list(root.findall(".//{}b")), + summarize_list(root.findall(".//b"))) + def test_bad_find(self): e = ET.XML(SAMPLE_XML) with self.assertRaisesRegex(SyntaxError, 'cannot use absolute path'): diff --git a/Lib/xml/etree/ElementPath.py b/Lib/xml/etree/ElementPath.py index b670d58f3f01..cfe72f2f9d42 100644 --- a/Lib/xml/etree/ElementPath.py +++ b/Lib/xml/etree/ElementPath.py @@ -99,13 +99,70 @@ def get_parent_map(context): parent_map[e] = p return parent_map + + +def _is_wildcard_tag(tag): + return tag[:3] == '{*}' or tag[-2:] == '}*' + + +def _prepare_tag(tag): + _isinstance, _str = isinstance, str + if tag == '{*}*': + # Same as '*', but no comments or processing instructions. + # It can be a surprise that '*' includes those, but there is no + # justification for '{*}*' doing the same. + def select(context, result): + for elem in result: + if _isinstance(elem.tag, _str): + yield elem + elif tag == '{}*': + # Any tag that is not in a namespace. + def select(context, result): + for elem in result: + el_tag = elem.tag + if _isinstance(el_tag, _str) and el_tag[0] != '{': + yield elem + elif tag[:3] == '{*}': + # The tag in any (or no) namespace. + suffix = tag[2:] # '}name' + no_ns = slice(-len(suffix), None) + tag = tag[3:] + def select(context, result): + for elem in result: + el_tag = elem.tag + if el_tag == tag or _isinstance(el_tag, _str) and el_tag[no_ns] == suffix: + yield elem + elif tag[-2:] == '}*': + # Any tag in the given namespace. + ns = tag[:-1] + ns_only = slice(None, len(ns)) + def select(context, result): + for elem in result: + el_tag = elem.tag + if _isinstance(el_tag, _str) and el_tag[ns_only] == ns: + yield elem + else: + raise RuntimeError(f"internal parser error, got {tag}") + return select + + def prepare_child(next, token): tag = token[1] - def select(context, result): - for elem in result: - for e in elem: - if e.tag == tag: - yield e + if _is_wildcard_tag(tag): + select_tag = _prepare_tag(tag) + def select(context, result): + def select_child(result): + for elem in result: + yield from elem + return select_tag(context, select_child(result)) + else: + if tag[:2] == '{}': + tag = tag[2:] # '{}tag' == 'tag' + def select(context, result): + for elem in result: + for e in elem: + if e.tag == tag: + yield e return select def prepare_star(next, token): @@ -130,11 +187,24 @@ def prepare_descendant(next, token): tag = token[1] else: raise SyntaxError("invalid descendant") - def select(context, result): - for elem in result: - for e in elem.iter(tag): - if e is not elem: - yield e + + if _is_wildcard_tag(tag): + select_tag = _prepare_tag(tag) + def select(context, result): + def select_child(result): + for elem in result: + for e in elem.iter(): + if e is not elem: + yield e + return select_tag(context, select_child(result)) + else: + if tag[:2] == '{}': + tag = tag[2:] # '{}tag' == 'tag' + def select(context, result): + for elem in result: + for e in elem.iter(tag): + if e is not elem: + yield e return select def prepare_parent(next, token): diff --git a/Misc/NEWS.d/next/Library/2019-04-28-15-01-29.bpo-28238.gdk38f.rst b/Misc/NEWS.d/next/Library/2019-04-28-15-01-29.bpo-28238.gdk38f.rst new file mode 100644 index 000000000000..62003a3d26e6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-28-15-01-29.bpo-28238.gdk38f.rst @@ -0,0 +1,3 @@ +The ``.find*()`` methods of xml.etree.ElementTree can now search for +wildcards like ``{*}tag`` and ``{ns}*`` that match a tag in any namespace +or all tags in a namespace. Patch by Stefan Behnel. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index b69e3a45fe30..1e58ddbfe19a 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1149,6 +1149,13 @@ checkpath(PyObject* tag) const Py_ssize_t len = PyUnicode_GET_LENGTH(tag); void *data = PyUnicode_DATA(tag); unsigned int kind = PyUnicode_KIND(tag); + if (len >= 3 && PyUnicode_READ(kind, data, 0) == '{' && ( + PyUnicode_READ(kind, data, 1) == '}' || ( + PyUnicode_READ(kind, data, 1) == '*' && + PyUnicode_READ(kind, data, 2) == '}'))) { + /* wildcard: '{}tag' or '{*}tag' */ + return 1; + } for (i = 0; i < len; i++) { Py_UCS4 ch = PyUnicode_READ(kind, data, i); if (ch == '{') @@ -1162,7 +1169,13 @@ checkpath(PyObject* tag) } if (PyBytes_Check(tag)) { char *p = PyBytes_AS_STRING(tag); - for (i = 0; i < PyBytes_GET_SIZE(tag); i++) { + const Py_ssize_t len = PyBytes_GET_SIZE(tag); + if (len >= 3 && p[0] == '{' && ( + p[1] == '}' || p[1] == '*' && p[2] == '}')) { + /* wildcard: '{}tag' or '{*}tag' */ + return 1; + } + for (i = 0; i < len; i++) { if (p[i] == '{') check = 0; else if (p[i] == '}') From webhook-mailer at python.org Fri May 3 19:30:59 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Fri, 03 May 2019 23:30:59 -0000 Subject: [Python-checkins] Suppress clang warning (GH-12384) Message-ID: https://github.com/python/cpython/commit/f0900199d53df97bd792ac5a1678f8c477f117bb commit: f0900199d53df97bd792ac5a1678f8c477f117bb branch: master author: R?mi Lapeyre committer: Inada Naoki date: 2019-05-04T08:30:53+09:00 summary: Suppress clang warning (GH-12384) files: M Modules/posixmodule.c diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 56ec3ee5a0ee..221f7101b213 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1259,7 +1259,8 @@ _Py_Sigset_Converter(PyObject *obj, void *addr) long signum; int overflow; - if (sigemptyset(mask)) { + // The extra parens suppress the unreachable-code warning with clang on MacOS + if (sigemptyset(mask) < (0)) { /* Probably only if mask == NULL. */ PyErr_SetFromErrno(PyExc_OSError); return 0; From webhook-mailer at python.org Sat May 4 11:27:14 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Sat, 04 May 2019 15:27:14 -0000 Subject: [Python-checkins] bpo-26978: Implement pathlib.Path.link_to (Using os.link) (GH-12990) Message-ID: https://github.com/python/cpython/commit/6b5b013bcc22a27d6231c2796882e44ddb42be67 commit: 6b5b013bcc22a27d6231c2796882e44ddb42be67 branch: master author: Joannah Nanjekye <33177550+nanjekyejoannah at users.noreply.github.com> committer: Antoine Pitrou date: 2019-05-04T17:27:10+02:00 summary: bpo-26978: Implement pathlib.Path.link_to (Using os.link) (GH-12990) files: A Misc/NEWS.d/next/Library/2019-04-28-01-52-39.bpo-26978.Lpm-SI.rst M Doc/library/pathlib.rst M Doc/whatsnew/3.8.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 450e8ff378a3..7a4a20dc6118 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1054,6 +1054,13 @@ call fails (for example because the path doesn't exist). use :func:`Path.rmdir` instead. +.. method:: Path.link_to(target) + + Create a hard link pointing to a path named *target*. + + .. versionchanged:: 3.8 + + .. method:: Path.write_bytes(data) Open the file pointed to in bytes mode, write *data* to it, and close the diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 764bd00544d9..64ef6e184060 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -369,6 +369,10 @@ pathlib contain characters unrepresentable at the OS level. (Contributed by Serhiy Storchaka in :issue:`33721`.) +Added :meth:`pathlib.Path.link_to()` which creates a hard link pointing +to a path. +(Contributed by Joannah Nanjekye in :issue:`26978`) + socket ------ diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 911b774b5649..1ba98b19e833 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -411,6 +411,8 @@ def lchmod(self, pathobj, mode): unlink = os.unlink + link_to = os.link + rmdir = os.rmdir rename = os.rename @@ -1303,6 +1305,14 @@ def lstat(self): self._raise_closed() return self._accessor.lstat(self) + def link_to(self, target): + """ + Create a hard link pointing to a path named target. + """ + if self._closed: + self._raise_closed() + self._accessor.link_to(self, target) + def rename(self, target): """ Rename this path to the given path. diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index f8325eb93275..990207b9c4e4 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1643,6 +1643,25 @@ def test_rmdir(self): self.assertFileNotFound(p.stat) self.assertFileNotFound(p.unlink) + def test_link_to(self): + P = self.cls(BASE) + p = P / 'fileA' + size = p.stat().st_size + # linking to another path. + q = P / 'dirA' / 'fileAA' + try: + p.link_to(q) + except PermissionError as e: + self.skipTest('os.link(): %s' % e) + self.assertEqual(q.stat().st_size, size) + self.assertEqual(os.path.samefile(p, q), True) + self.assertTrue(p.stat) + # Linking to a str of a relative path. + r = rel_join('fileAAA') + q.link_to(r) + self.assertEqual(os.stat(r).st_size, size) + self.assertTrue(q.stat) + def test_rename(self): P = self.cls(BASE) p = P / 'fileA' diff --git a/Misc/NEWS.d/next/Library/2019-04-28-01-52-39.bpo-26978.Lpm-SI.rst b/Misc/NEWS.d/next/Library/2019-04-28-01-52-39.bpo-26978.Lpm-SI.rst new file mode 100644 index 000000000000..0b14920ad45a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-28-01-52-39.bpo-26978.Lpm-SI.rst @@ -0,0 +1,2 @@ +`pathlib.path.link_to()` is now implemented. It creates a hard link pointing +to a path. From webhook-mailer at python.org Sat May 4 11:48:08 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 04 May 2019 15:48:08 -0000 Subject: [Python-checkins] bpo-36475: Make PyThread_exit_thread with _Py_NO_RETURN (GH-13068) Message-ID: https://github.com/python/cpython/commit/c664b342a47e4b4650706d07e3e40a295e3a4407 commit: c664b342a47e4b4650706d07e3e40a295e3a4407 branch: master author: Victor Stinner committer: GitHub date: 2019-05-04T11:48:05-04:00 summary: bpo-36475: Make PyThread_exit_thread with _Py_NO_RETURN (GH-13068) files: M Include/pyerrors.h M Include/pyport.h M Include/pythread.h M Python/ceval.c M Python/thread_nt.h M Python/thread_pthread.h diff --git a/Include/pyerrors.h b/Include/pyerrors.h index 5c6751868df4..94af3cb3420e 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -21,17 +21,6 @@ PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **); PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *); #endif -#if defined(__clang__) || \ - (defined(__GNUC__) && \ - ((__GNUC__ >= 3) || \ - (__GNUC__ == 2) && (__GNUC_MINOR__ >= 5))) -# define _Py_NO_RETURN __attribute__((__noreturn__)) -#elif defined(_MSC_VER) -# define _Py_NO_RETURN __declspec(noreturn) -#else -# define _Py_NO_RETURN -#endif - /* Defined in Python/pylifecycle.c */ PyAPI_FUNC(void) _Py_NO_RETURN Py_FatalError(const char *message); diff --git a/Include/pyport.h b/Include/pyport.h index 97fb5e59f9e5..ab88a9ac5c52 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -829,4 +829,18 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; # define _Py_FORCE_UTF8_FS_ENCODING #endif +/* Mark a function which cannot return. Example: + + PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); */ +#if defined(__clang__) || \ + (defined(__GNUC__) && \ + ((__GNUC__ >= 3) || \ + (__GNUC__ == 2) && (__GNUC_MINOR__ >= 5))) +# define _Py_NO_RETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +# define _Py_NO_RETURN __declspec(noreturn) +#else +# define _Py_NO_RETURN +#endif + #endif /* Py_PYPORT_H */ diff --git a/Include/pythread.h b/Include/pythread.h index eb61033b2d90..bc1d92cd1ff1 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -23,7 +23,7 @@ typedef enum PyLockStatus { PyAPI_FUNC(void) PyThread_init_thread(void); PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); -PyAPI_FUNC(void) PyThread_exit_thread(void); +PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); diff --git a/Python/ceval.c b/Python/ceval.c index 8ae273e0820d..e616a3f53989 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -211,7 +211,6 @@ exit_thread_if_finalizing(PyThreadState *tstate) if (_Py_IsFinalizing() && !_Py_CURRENTLY_FINALIZING(tstate)) { drop_gil(tstate); PyThread_exit_thread(); - Py_UNREACHABLE(); } } diff --git a/Python/thread_nt.h b/Python/thread_nt.h index fdb192b7d77a..5e00c3511460 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -227,7 +227,7 @@ PyThread_get_thread_ident(void) return GetCurrentThreadId(); } -void +void _Py_NO_RETURN PyThread_exit_thread(void) { dprintf(("%lu: PyThread_exit_thread called\n", PyThread_get_thread_ident())); diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 25f58d9446d8..1f4f36d52d55 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -302,7 +302,7 @@ PyThread_get_thread_ident(void) return (unsigned long) threadid; } -void +void _Py_NO_RETURN PyThread_exit_thread(void) { dprintf(("PyThread_exit_thread called\n")); From webhook-mailer at python.org Sat May 4 17:54:39 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 04 May 2019 21:54:39 -0000 Subject: [Python-checkins] bpo-36166: Change to rst datamodel file. (GH-13089) Message-ID: https://github.com/python/cpython/commit/5e98f05e55d13981c7c92fb14b9c013e4227c3c1 commit: 5e98f05e55d13981c7c92fb14b9c013e4227c3c1 branch: master author: Catherine Alvarado committer: Cheryl Sabella date: 2019-05-04T17:54:35-04:00 summary: bpo-36166: Change to rst datamodel file. (GH-13089) files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index bad611e81c3e..9fc9f3a3848a 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1311,9 +1311,9 @@ Basic customization Called by the :func:`format` built-in function, and by extension, evaluation of :ref:`formatted string literals ` and the :meth:`str.format` method, to produce a "formatted" - string representation of an object. The ``format_spec`` argument is + string representation of an object. The *format_spec* argument is a string that contains a description of the formatting options desired. - The interpretation of the ``format_spec`` argument is up to the type + The interpretation of the *format_spec* argument is up to the type implementing :meth:`__format__`, however most classes will either delegate formatting to one of the built-in types, or use a similar formatting option syntax. From webhook-mailer at python.org Sat May 4 17:55:33 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 04 May 2019 21:55:33 -0000 Subject: [Python-checkins] bpo-36189: Fixing typo in tutorial introduction (GH-13090) Message-ID: https://github.com/python/cpython/commit/98a1e06c47f655c7601b130cf8d549de9f08369e commit: 98a1e06c47f655c7601b130cf8d549de9f08369e branch: master author: Jonatan committer: Cheryl Sabella date: 2019-05-04T17:55:29-04:00 summary: bpo-36189: Fixing typo in tutorial introduction (GH-13090) files: M Doc/tutorial/introduction.rst diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 3e0c99558ed7..a4dbd6351b77 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -383,7 +383,7 @@ items of different types, but usually the items all have the same type. :: >>> squares [1, 4, 9, 16, 25] -Like strings (and all other built-in :term:`sequence` type), lists can be +Like strings (and all other built-in :term:`sequence` types), lists can be indexed and sliced:: >>> squares[0] # indexing returns the item From webhook-mailer at python.org Sat May 4 23:21:31 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sun, 05 May 2019 03:21:31 -0000 Subject: [Python-checkins] bpo-36166: Change to rst datamodel file. (GH-13089) (#13094) Message-ID: https://github.com/python/cpython/commit/37125ff6e2f988a14b46525b7df24d2997bee836 commit: 37125ff6e2f988a14b46525b7df24d2997bee836 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Cheryl Sabella date: 2019-05-04T23:21:28-04:00 summary: bpo-36166: Change to rst datamodel file. (GH-13089) (#13094) (cherry picked from commit 5e98f05e55d13981c7c92fb14b9c013e4227c3c1) Co-authored-by: Catherine Alvarado files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 61a1bf425e53..962ec7e6c719 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1315,9 +1315,9 @@ Basic customization Called by the :func:`format` built-in function, and by extension, evaluation of :ref:`formatted string literals ` and the :meth:`str.format` method, to produce a "formatted" - string representation of an object. The ``format_spec`` argument is + string representation of an object. The *format_spec* argument is a string that contains a description of the formatting options desired. - The interpretation of the ``format_spec`` argument is up to the type + The interpretation of the *format_spec* argument is up to the type implementing :meth:`__format__`, however most classes will either delegate formatting to one of the built-in types, or use a similar formatting option syntax. From webhook-mailer at python.org Sat May 4 23:22:37 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sun, 05 May 2019 03:22:37 -0000 Subject: [Python-checkins] bpo-36189: Fixing typo in tutorial introduction (GH-13093) Message-ID: https://github.com/python/cpython/commit/2b5ffc02c00b16ede6555391c6965746c8fe554b commit: 2b5ffc02c00b16ede6555391c6965746c8fe554b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Cheryl Sabella date: 2019-05-04T23:22:34-04:00 summary: bpo-36189: Fixing typo in tutorial introduction (GH-13093) (cherry picked from commit 98a1e06c47f655c7601b130cf8d549de9f08369e) Co-authored-by: Jonatan files: M Doc/tutorial/introduction.rst diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 3e0c99558ed7..a4dbd6351b77 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -383,7 +383,7 @@ items of different types, but usually the items all have the same type. :: >>> squares [1, 4, 9, 16, 25] -Like strings (and all other built-in :term:`sequence` type), lists can be +Like strings (and all other built-in :term:`sequence` types), lists can be indexed and sliced:: >>> squares[0] # indexing returns the item From webhook-mailer at python.org Sun May 5 05:06:46 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sun, 05 May 2019 09:06:46 -0000 Subject: [Python-checkins] simplify StartupImportTests (GH-13096) Message-ID: https://github.com/python/cpython/commit/c4d92c8ada7ecfc479ebb1dd4a819c9202155970 commit: c4d92c8ada7ecfc479ebb1dd4a819c9202155970 branch: master author: Inada Naoki committer: GitHub date: 2019-05-05T18:06:30+09:00 summary: simplify StartupImportTests (GH-13096) _osx_support and copyreg are not imported from site on macOS for now. files: M Lib/test/test_site.py diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 8643da0540f3..41c422991950 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -526,15 +526,15 @@ def test_startup_imports(self): # http://bugs.python.org/issue19205 re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'} - # _osx_support uses the re module in many placs - if sys.platform != 'darwin': - self.assertFalse(modules.intersection(re_mods), stderr) + self.assertFalse(modules.intersection(re_mods), stderr) + # http://bugs.python.org/issue9548 self.assertNotIn('locale', modules, stderr) - if sys.platform != 'darwin': - # http://bugs.python.org/issue19209 - self.assertNotIn('copyreg', modules, stderr) - # http://bugs.python.org/issue19218> + + # http://bugs.python.org/issue19209 + self.assertNotIn('copyreg', modules, stderr) + + # http://bugs.python.org/issue19218 collection_mods = {'_collections', 'collections', 'functools', 'heapq', 'itertools', 'keyword', 'operator', 'reprlib', 'types', 'weakref' From webhook-mailer at python.org Sun May 5 05:25:25 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 May 2019 09:25:25 -0000 Subject: [Python-checkins] simplify StartupImportTests (GH-13096) Message-ID: https://github.com/python/cpython/commit/905ce9eeb1d1f4e8a1e914c3ec61767490d40ec6 commit: 905ce9eeb1d1f4e8a1e914c3ec61767490d40ec6 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-05T02:25:16-07:00 summary: simplify StartupImportTests (GH-13096) _osx_support and copyreg are not imported from site on macOS for now. (cherry picked from commit c4d92c8ada7ecfc479ebb1dd4a819c9202155970) Co-authored-by: Inada Naoki files: M Lib/test/test_site.py diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 655a12ddd165..568f81da40f3 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -518,15 +518,15 @@ def test_startup_imports(self): # http://bugs.python.org/issue19205 re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'} - # _osx_support uses the re module in many placs - if sys.platform != 'darwin': - self.assertFalse(modules.intersection(re_mods), stderr) + self.assertFalse(modules.intersection(re_mods), stderr) + # http://bugs.python.org/issue9548 self.assertNotIn('locale', modules, stderr) - if sys.platform != 'darwin': - # http://bugs.python.org/issue19209 - self.assertNotIn('copyreg', modules, stderr) - # http://bugs.python.org/issue19218> + + # http://bugs.python.org/issue19209 + self.assertNotIn('copyreg', modules, stderr) + + # http://bugs.python.org/issue19218 collection_mods = {'_collections', 'collections', 'functools', 'heapq', 'itertools', 'keyword', 'operator', 'reprlib', 'types', 'weakref' From webhook-mailer at python.org Sun May 5 07:14:50 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 May 2019 11:14:50 -0000 Subject: [Python-checkins] bpo-33530: Implement Happy Eyeballs in asyncio, v2 (GH-7237) Message-ID: https://github.com/python/cpython/commit/88f07a804a0adc0b6ee87687b59d8416113c7331 commit: 88f07a804a0adc0b6ee87687b59d8416113c7331 branch: master author: twisteroid ambassador committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-05T04:14:35-07:00 summary: bpo-33530: Implement Happy Eyeballs in asyncio, v2 (GH-7237) Added two keyword arguments, `delay` and `interleave`, to `BaseEventLoop.create_connection`. Happy eyeballs is activated if `delay` is specified. We now have documentation for the new arguments. `staggered_race()` is in its own module, but not exported to the main asyncio package. https://bugs.python.org/issue33530 files: A Lib/asyncio/staggered.py A Misc/NEWS.d/next/Library/2018-05-29-18-34-53.bpo-33530._4Q_bi.rst M Doc/library/asyncio-eventloop.rst M Lib/asyncio/base_events.py M Lib/asyncio/events.py diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index e2b312453921..06f673be7902 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -397,9 +397,27 @@ Opening network connections If given, these should all be integers from the corresponding :mod:`socket` module constants. + * *happy_eyeballs_delay*, if given, enables Happy Eyeballs for this + connection. It should + be a floating-point number representing the amount of time in seconds + to wait for a connection attempt to complete, before starting the next + attempt in parallel. This is the "Connection Attempt Delay" as defined + in :rfc:`8305`. A sensible default value recommended by the RFC is ``0.25`` + (250 milliseconds). + + * *interleave* controls address reordering when a host name resolves to + multiple IP addresses. + If ``0`` or unspecified, no reordering is done, and addresses are + tried in the order returned by :meth:`getaddrinfo`. If a positive integer + is specified, the addresses are interleaved by address family, and the + given integer is interpreted as "First Address Family Count" as defined + in :rfc:`8305`. The default is ``0`` if *happy_eyeballs_delay* is not + specified, and ``1`` if it is. + * *sock*, if given, should be an existing, already connected :class:`socket.socket` object to be used by the transport. - If *sock* is given, none of *host*, *port*, *family*, *proto*, *flags* + If *sock* is given, none of *host*, *port*, *family*, *proto*, *flags*, + *happy_eyeballs_delay*, *interleave* and *local_addr* should be specified. * *local_addr*, if given, is a ``(local_host, local_port)`` tuple used @@ -410,6 +428,10 @@ Opening network connections to wait for the TLS handshake to complete before aborting the connection. ``60.0`` seconds if ``None`` (default). + .. versionadded:: 3.8 + + The *happy_eyeballs_delay* and *interleave* parameters. + .. versionadded:: 3.7 The *ssl_handshake_timeout* parameter. diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 9b4b846131de..c58906f8b489 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -16,6 +16,7 @@ import collections import collections.abc import concurrent.futures +import functools import heapq import itertools import os @@ -41,6 +42,7 @@ from . import futures from . import protocols from . import sslproto +from . import staggered from . import tasks from . import transports from .log import logger @@ -159,6 +161,28 @@ def _ipaddr_info(host, port, family, type, proto): return None +def _interleave_addrinfos(addrinfos, first_address_family_count=1): + """Interleave list of addrinfo tuples by family.""" + # Group addresses by family + addrinfos_by_family = collections.OrderedDict() + for addr in addrinfos: + family = addr[0] + if family not in addrinfos_by_family: + addrinfos_by_family[family] = [] + addrinfos_by_family[family].append(addr) + addrinfos_lists = list(addrinfos_by_family.values()) + + reordered = [] + if first_address_family_count > 1: + reordered.extend(addrinfos_lists[0][:first_address_family_count - 1]) + del addrinfos_lists[0][:first_address_family_count - 1] + reordered.extend( + a for a in itertools.chain.from_iterable( + itertools.zip_longest(*addrinfos_lists) + ) if a is not None) + return reordered + + def _run_until_complete_cb(fut): if not fut.cancelled(): exc = fut.exception() @@ -871,12 +895,49 @@ def _check_sendfile_params(self, sock, file, offset, count): "offset must be a non-negative integer (got {!r})".format( offset)) + async def _connect_sock(self, exceptions, addr_info, local_addr_infos=None): + """Create, bind and connect one socket.""" + my_exceptions = [] + exceptions.append(my_exceptions) + family, type_, proto, _, address = addr_info + sock = None + try: + sock = socket.socket(family=family, type=type_, proto=proto) + sock.setblocking(False) + if local_addr_infos is not None: + for _, _, _, _, laddr in local_addr_infos: + try: + sock.bind(laddr) + break + except OSError as exc: + msg = ( + f'error while attempting to bind on ' + f'address {laddr!r}: ' + f'{exc.strerror.lower()}' + ) + exc = OSError(exc.errno, msg) + my_exceptions.append(exc) + else: # all bind attempts failed + raise my_exceptions.pop() + await self.sock_connect(sock, address) + return sock + except OSError as exc: + my_exceptions.append(exc) + if sock is not None: + sock.close() + raise + except: + if sock is not None: + sock.close() + raise + async def create_connection( self, protocol_factory, host=None, port=None, *, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None, - ssl_handshake_timeout=None): + ssl_handshake_timeout=None, + happy_eyeballs_delay=None, interleave=None): """Connect to a TCP server. Create a streaming transport connection to a given Internet host and @@ -911,6 +972,10 @@ def _check_sendfile_params(self, sock, file, offset, count): raise ValueError( 'ssl_handshake_timeout is only meaningful with ssl') + if happy_eyeballs_delay is not None and interleave is None: + # If using happy eyeballs, default to interleave addresses by family + interleave = 1 + if host is not None or port is not None: if sock is not None: raise ValueError( @@ -929,43 +994,31 @@ def _check_sendfile_params(self, sock, file, offset, count): flags=flags, loop=self) if not laddr_infos: raise OSError('getaddrinfo() returned empty list') + else: + laddr_infos = None + + if interleave: + infos = _interleave_addrinfos(infos, interleave) exceptions = [] - for family, type, proto, cname, address in infos: - try: - sock = socket.socket(family=family, type=type, proto=proto) - sock.setblocking(False) - if local_addr is not None: - for _, _, _, _, laddr in laddr_infos: - try: - sock.bind(laddr) - break - except OSError as exc: - msg = ( - f'error while attempting to bind on ' - f'address {laddr!r}: ' - f'{exc.strerror.lower()}' - ) - exc = OSError(exc.errno, msg) - exceptions.append(exc) - else: - sock.close() - sock = None - continue - if self._debug: - logger.debug("connect %r to %r", sock, address) - await self.sock_connect(sock, address) - except OSError as exc: - if sock is not None: - sock.close() - exceptions.append(exc) - except: - if sock is not None: - sock.close() - raise - else: - break - else: + if happy_eyeballs_delay is None: + # not using happy eyeballs + for addrinfo in infos: + try: + sock = await self._connect_sock( + exceptions, addrinfo, laddr_infos) + break + except OSError: + continue + else: # using happy eyeballs + sock, _, _ = await staggered.staggered_race( + (functools.partial(self._connect_sock, + exceptions, addrinfo, laddr_infos) + for addrinfo in infos), + happy_eyeballs_delay, loop=self) + + if sock is None: + exceptions = [exc for sub in exceptions for exc in sub] if len(exceptions) == 1: raise exceptions[0] else: diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 163b868afeee..9a923514db09 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -298,7 +298,8 @@ def set_default_executor(self, executor): *, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None, - ssl_handshake_timeout=None): + ssl_handshake_timeout=None, + happy_eyeballs_delay=None, interleave=None): raise NotImplementedError async def create_server( diff --git a/Lib/asyncio/staggered.py b/Lib/asyncio/staggered.py new file mode 100644 index 000000000000..feec681b4371 --- /dev/null +++ b/Lib/asyncio/staggered.py @@ -0,0 +1,147 @@ +"""Support for running coroutines in parallel with staggered start times.""" + +__all__ = 'staggered_race', + +import contextlib +import typing + +from . import events +from . import futures +from . import locks +from . import tasks + + +async def staggered_race( + coro_fns: typing.Iterable[typing.Callable[[], typing.Awaitable]], + delay: typing.Optional[float], + *, + loop: events.AbstractEventLoop = None, +) -> typing.Tuple[ + typing.Any, + typing.Optional[int], + typing.List[typing.Optional[Exception]] +]: + """Run coroutines with staggered start times and take the first to finish. + + This method takes an iterable of coroutine functions. The first one is + started immediately. From then on, whenever the immediately preceding one + fails (raises an exception), or when *delay* seconds has passed, the next + coroutine is started. This continues until one of the coroutines complete + successfully, in which case all others are cancelled, or until all + coroutines fail. + + The coroutines provided should be well-behaved in the following way: + + * They should only ``return`` if completed successfully. + + * They should always raise an exception if they did not complete + successfully. In particular, if they handle cancellation, they should + probably reraise, like this:: + + try: + # do work + except asyncio.CancelledError: + # undo partially completed work + raise + + Args: + coro_fns: an iterable of coroutine functions, i.e. callables that + return a coroutine object when called. Use ``functools.partial`` or + lambdas to pass arguments. + + delay: amount of time, in seconds, between starting coroutines. If + ``None``, the coroutines will run sequentially. + + loop: the event loop to use. + + Returns: + tuple *(winner_result, winner_index, exceptions)* where + + - *winner_result*: the result of the winning coroutine, or ``None`` + if no coroutines won. + + - *winner_index*: the index of the winning coroutine in + ``coro_fns``, or ``None`` if no coroutines won. If the winning + coroutine may return None on success, *winner_index* can be used + to definitively determine whether any coroutine won. + + - *exceptions*: list of exceptions returned by the coroutines. + ``len(exceptions)`` is equal to the number of coroutines actually + started, and the order is the same as in ``coro_fns``. The winning + coroutine's entry is ``None``. + + """ + # TODO: when we have aiter() and anext(), allow async iterables in coro_fns. + loop = loop or events.get_running_loop() + enum_coro_fns = enumerate(coro_fns) + winner_result = None + winner_index = None + exceptions = [] + running_tasks = [] + + async def run_one_coro( + previous_failed: typing.Optional[locks.Event]) -> None: + # Wait for the previous task to finish, or for delay seconds + if previous_failed is not None: + with contextlib.suppress(futures.TimeoutError): + # Use asyncio.wait_for() instead of asyncio.wait() here, so + # that if we get cancelled at this point, Event.wait() is also + # cancelled, otherwise there will be a "Task destroyed but it is + # pending" later. + await tasks.wait_for(previous_failed.wait(), delay) + # Get the next coroutine to run + try: + this_index, coro_fn = next(enum_coro_fns) + except StopIteration: + return + # Start task that will run the next coroutine + this_failed = locks.Event() + next_task = loop.create_task(run_one_coro(this_failed)) + running_tasks.append(next_task) + assert len(running_tasks) == this_index + 2 + # Prepare place to put this coroutine's exceptions if not won + exceptions.append(None) + assert len(exceptions) == this_index + 1 + + try: + result = await coro_fn() + except Exception as e: + exceptions[this_index] = e + this_failed.set() # Kickstart the next coroutine + else: + # Store winner's results + nonlocal winner_index, winner_result + assert winner_index is None + winner_index = this_index + winner_result = result + # Cancel all other tasks. We take care to not cancel the current + # task as well. If we do so, then since there is no `await` after + # here and CancelledError are usually thrown at one, we will + # encounter a curious corner case where the current task will end + # up as done() == True, cancelled() == False, exception() == + # asyncio.CancelledError. This behavior is specified in + # https://bugs.python.org/issue30048 + for i, t in enumerate(running_tasks): + if i != this_index: + t.cancel() + + first_task = loop.create_task(run_one_coro(None)) + running_tasks.append(first_task) + try: + # Wait for a growing list of tasks to all finish: poor man's version of + # curio's TaskGroup or trio's nursery + done_count = 0 + while done_count != len(running_tasks): + done, _ = await tasks.wait(running_tasks) + done_count = len(done) + # If run_one_coro raises an unhandled exception, it's probably a + # programming error, and I want to see it. + if __debug__: + for d in done: + if d.done() and not d.cancelled() and d.exception(): + raise d.exception() + return winner_result, winner_index, exceptions + finally: + # Make sure no tasks are left running if we leave this function + for t in running_tasks: + t.cancel() diff --git a/Misc/NEWS.d/next/Library/2018-05-29-18-34-53.bpo-33530._4Q_bi.rst b/Misc/NEWS.d/next/Library/2018-05-29-18-34-53.bpo-33530._4Q_bi.rst new file mode 100644 index 000000000000..747219b1bfb8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-05-29-18-34-53.bpo-33530._4Q_bi.rst @@ -0,0 +1,3 @@ +Implemented Happy Eyeballs in `asyncio.create_connection()`. Added two new +arguments, *happy_eyeballs_delay* and *interleave*, +to specify Happy Eyeballs behavior. From webhook-mailer at python.org Sun May 5 07:26:28 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 05 May 2019 11:26:28 -0000 Subject: [Python-checkins] bpo-36791: Safer detection of integer overflow in sum(). (GH-13080) Message-ID: https://github.com/python/cpython/commit/29500737d45cbca9604d9ce845fb2acc3f531401 commit: 29500737d45cbca9604d9ce845fb2acc3f531401 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-05-05T14:26:23+03:00 summary: bpo-36791: Safer detection of integer overflow in sum(). (GH-13080) files: M Python/bltinmodule.c diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 7a2b259cbd89..047cca057b41 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2375,9 +2375,11 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) } if (PyLong_CheckExact(item)) { long b = PyLong_AsLongAndOverflow(item, &overflow); - long x = i_result + b; - if (overflow == 0 && ((x^i_result) >= 0 || (x^b) >= 0)) { - i_result = x; + if (overflow == 0 && + (i_result >= 0 ? (b <= LONG_MAX - i_result) + : (b >= LONG_MIN - i_result))) + { + i_result += b; Py_DECREF(item); continue; } From webhook-mailer at python.org Mon May 6 08:39:27 2019 From: webhook-mailer at python.org (larryhastings) Date: Mon, 06 May 2019 12:39:27 -0000 Subject: [Python-checkins] bpo-16024: Doc cleanup regarding path_fd, dir_fd, follow_symlinks (GH-5505) Message-ID: https://github.com/python/cpython/commit/e152169da95b52fa41931572bc90857253c4a5dd commit: e152169da95b52fa41931572bc90857253c4a5dd branch: master author: Cheryl Sabella committer: larryhastings date: 2019-05-06T08:39:13-04:00 summary: bpo-16024: Doc cleanup regarding path_fd, dir_fd, follow_symlinks (GH-5505) files: M Doc/library/os.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index f3b5d964ac58..e77a8fed377a 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1453,16 +1453,19 @@ features: .. _path_fd: * **specifying a file descriptor:** - For some functions, the *path* argument can be not only a string giving a path - name, but also a file descriptor. The function will then operate on the file - referred to by the descriptor. (For POSIX systems, Python will call the - ``f...`` version of the function.) - - You can check whether or not *path* can be specified as a file descriptor on - your platform using :data:`os.supports_fd`. If it is unavailable, using it - will raise a :exc:`NotImplementedError`. + Normally the *path* argument provided to functions in the :mod:`os` module + must be a string specifying a file path. However, some functions now + alternatively accept an open file descriptor for their *path* argument. + The function will then operate on the file referred to by the descriptor. + (For POSIX systems, Python will call the variant of the function prefixed + with ``f`` (e.g. call ``fchdir`` instead of ``chdir``).) + + You can check whether or not *path* can be specified as a file descriptor + for a particular function on your platform using :data:`os.supports_fd`. + If this functionality is unavailable, using it will raise a + :exc:`NotImplementedError`. - If the function also supports *dir_fd* or *follow_symlinks* arguments, it is + If the function also supports *dir_fd* or *follow_symlinks* arguments, it's an error to specify one of those when supplying *path* as a file descriptor. .. _dir_fd: @@ -1471,23 +1474,24 @@ features: should be a file descriptor referring to a directory, and the path to operate on should be relative; path will then be relative to that directory. If the path is absolute, *dir_fd* is ignored. (For POSIX systems, Python will call - the ``...at`` or ``f...at`` version of the function.) + the variant of the function with an ``at`` suffix and possibly prefixed with + ``f`` (e.g. call ``faccessat`` instead of ``access``). - You can check whether or not *dir_fd* is supported on your platform using - :data:`os.supports_dir_fd`. If it is unavailable, using it will raise a - :exc:`NotImplementedError`. + You can check whether or not *dir_fd* is supported for a particular function + on your platform using :data:`os.supports_dir_fd`. If it's unavailable, + using it will raise a :exc:`NotImplementedError`. .. _follow_symlinks: * **not following symlinks:** If *follow_symlinks* is ``False``, and the last element of the path to operate on is a symbolic link, - the function will operate on the symbolic link itself instead of the file the - link points to. (For POSIX systems, Python will call the ``l...`` version of - the function.) + the function will operate on the symbolic link itself rather than the file + pointed to by the link. (For POSIX systems, Python will call the ``l...`` + variant of the function.) - You can check whether or not *follow_symlinks* is supported on your platform - using :data:`os.supports_follow_symlinks`. If it is unavailable, using it - will raise a :exc:`NotImplementedError`. + You can check whether or not *follow_symlinks* is supported for a particular + function on your platform using :data:`os.supports_follow_symlinks`. + If it's unavailable, using it will raise a :exc:`NotImplementedError`. @@ -1662,7 +1666,7 @@ features: .. availability:: Unix. .. versionadded:: 3.3 - Added support for specifying an open file descriptor for *path*, + Added support for specifying *path* as an open file descriptor, and the *dir_fd* and *follow_symlinks* arguments. .. versionchanged:: 3.6 @@ -1781,7 +1785,7 @@ features: The *path* parameter became optional. .. versionadded:: 3.3 - Added support for specifying an open file descriptor for *path*. + Added support for specifying *path* as an open file descriptor. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -2593,7 +2597,7 @@ features: The :const:`ST_RDONLY` and :const:`ST_NOSUID` constants were added. .. versionadded:: 3.3 - Added support for specifying an open file descriptor for *path*. + Added support for specifying *path* as an open file descriptor. .. versionchanged:: 3.4 The :const:`ST_NODEV`, :const:`ST_NOEXEC`, :const:`ST_SYNCHRONOUS`, @@ -2610,59 +2614,61 @@ features: .. data:: supports_dir_fd - A :class:`~collections.abc.Set` object indicating which functions in the - :mod:`os` module permit use of their *dir_fd* parameter. Different platforms - provide different functionality, and an option that might work on one might - be unsupported on another. For consistency's sakes, functions that support - *dir_fd* always allow specifying the parameter, but will raise an exception - if the functionality is not actually available. - - To check whether a particular function permits use of its *dir_fd* - parameter, use the ``in`` operator on ``supports_dir_fd``. As an example, - this expression determines whether the *dir_fd* parameter of :func:`os.stat` - is locally available:: + A :class:`set` object indicating which functions in the :mod:`os` + module accept an open file descriptor for their *dir_fd* parameter. + Different platforms provide different features, and the underlying + functionality Python uses to implement the *dir_fd* parameter is not + available on all platforms Python supports. For consistency's sake, + functions that may support *dir_fd* always allow specifying the + parameter, but will throw an exception if the functionality is used + when it's not locally available. (Specifying ``None`` for *dir_fd* + is always supported on all platforms.) + + To check whether a particular function accepts an open file descriptor + for its *dir_fd* parameter, use the ``in`` operator on ``supports_dir_fd``. + As an example, this expression evaluates to ``True`` if :func:`os.stat` + accepts open file descriptors for *dir_fd* on the local platform:: os.stat in os.supports_dir_fd - Currently *dir_fd* parameters only work on Unix platforms; none of them work - on Windows. + Currently *dir_fd* parameters only work on Unix platforms; + none of them work on Windows. .. versionadded:: 3.3 .. data:: supports_effective_ids - A :class:`~collections.abc.Set` object indicating which functions in the - :mod:`os` module permit use of the *effective_ids* parameter for - :func:`os.access`. If the local platform supports it, the collection will - contain :func:`os.access`, otherwise it will be empty. + A :class:`set` object indicating whether :func:`os.access` permits + specifying ``True`` for its *effective_ids* parameter on the local platform. + (Specifying ``False`` for *effective_ids* is always supported on all + platforms.) If the local platform supports it, the collection will contain + :func:`os.access`; otherwise it will be empty. - To check whether you can use the *effective_ids* parameter for - :func:`os.access`, use the ``in`` operator on ``supports_effective_ids``, - like so:: + This expression evaluates to ``True`` if :func:`os.access` supports + ``effective_ids=True`` on the local platform:: os.access in os.supports_effective_ids - Currently *effective_ids* only works on Unix platforms; it does not work on - Windows. + Currently *effective_ids* is only supported on Unix platforms; + it does not work on Windows. .. versionadded:: 3.3 .. data:: supports_fd - A :class:`~collections.abc.Set` object indicating which functions in the + A :class:`set` object indicating which functions in the :mod:`os` module permit specifying their *path* parameter as an open file - descriptor. Different platforms provide different functionality, and an - option that might work on one might be unsupported on another. For - consistency's sakes, functions that support *fd* always allow specifying - the parameter, but will raise an exception if the functionality is not - actually available. + descriptor on the local platform. Different platforms provide different + features, and the underlying functionality Python uses to accept open file + descriptors as *path* arguments is not available on all platforms Python + supports. - To check whether a particular function permits specifying an open file + To determine whether a particular function permits specifying an open file descriptor for its *path* parameter, use the ``in`` operator on - ``supports_fd``. As an example, this expression determines whether - :func:`os.chdir` accepts open file descriptors when called on your local + ``supports_fd``. As an example, this expression evaluates to ``True`` if + :func:`os.chdir` accepts open file descriptors for *path* on your local platform:: os.chdir in os.supports_fd @@ -2672,17 +2678,21 @@ features: .. data:: supports_follow_symlinks - A :class:`~collections.abc.Set` object indicating which functions in the - :mod:`os` module permit use of their *follow_symlinks* parameter. Different - platforms provide different functionality, and an option that might work on - one might be unsupported on another. For consistency's sakes, functions that - support *follow_symlinks* always allow specifying the parameter, but will - raise an exception if the functionality is not actually available. - - To check whether a particular function permits use of its *follow_symlinks* - parameter, use the ``in`` operator on ``supports_follow_symlinks``. As an - example, this expression determines whether the *follow_symlinks* parameter - of :func:`os.stat` is locally available:: + A :class:`set` object indicating which functions in the :mod:`os` module + accept ``False`` for their *follow_symlinks* parameter on the local platform. + Different platforms provide different features, and the underlying + functionality Python uses to implement *follow_symlinks* is not available + on all platforms Python supports. For consistency's sake, functions that + may support *follow_symlinks* always allow specifying the parameter, but + will throw an exception if the functionality is used when it's not locally + available. (Specifying ``True`` for *follow_symlinks* is always supported + on all platforms.) + + To check whether a particular function accepts ``False`` for its + *follow_symlinks* parameter, use the ``in`` operator on + ``supports_follow_symlinks``. As an example, this expression evaluates + to ``True`` if you may specify ``follow_symlinks=False`` when calling + :func:`os.stat` on the local platform:: os.stat in os.supports_follow_symlinks @@ -2801,7 +2811,7 @@ features: following symlinks `. .. versionadded:: 3.3 - Added support for specifying an open file descriptor for *path*, + Added support for specifying *path* as an open file descriptor, and the *dir_fd*, *follow_symlinks*, and *ns* parameters. .. versionchanged:: 3.6 @@ -3162,7 +3172,7 @@ to be ignored. .. availability:: Unix, Windows. .. versionadded:: 3.3 - Added support for specifying an open file descriptor for *path* + Added support for specifying *path* as an open file descriptor for :func:`execve`. .. versionchanged:: 3.6 From webhook-mailer at python.org Mon May 6 11:28:54 2019 From: webhook-mailer at python.org (Dino Viehland) Date: Mon, 06 May 2019 15:28:54 -0000 Subject: [Python-checkins] Only count number of members once (#12691) Message-ID: https://github.com/python/cpython/commit/8b1271b12fdbb1ac01217d929d8b112119e3f53b commit: 8b1271b12fdbb1ac01217d929d8b112119e3f53b branch: master author: Eddie Elizondo committer: Dino Viehland date: 2019-05-06T08:28:50-07:00 summary: Only count number of members once (#12691) files: M Objects/typeobject.c diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 37df4d23e4c1..eeaae1f9f789 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2895,6 +2895,7 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) nmembers = 0; for (slot = spec->slots; slot->slot; slot++) { if (slot->slot == Py_tp_members) { + nmembers = 0; for (memb = slot->pfunc; memb->name != NULL; memb++) { nmembers++; } From webhook-mailer at python.org Mon May 6 11:36:39 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Mon, 06 May 2019 15:36:39 -0000 Subject: [Python-checkins] bpo-36811: Fix a C compiler warning in _elementtree.c. (GH-13109) Message-ID: https://github.com/python/cpython/commit/6b95149eccac540a911a5ada03fcb7d623a0de37 commit: 6b95149eccac540a911a5ada03fcb7d623a0de37 branch: master author: Stefan Behnel committer: GitHub date: 2019-05-06T17:36:35+02:00 summary: bpo-36811: Fix a C compiler warning in _elementtree.c. (GH-13109) files: M Modules/_elementtree.c diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 1e58ddbfe19a..e9a0ea21b292 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1171,7 +1171,7 @@ checkpath(PyObject* tag) char *p = PyBytes_AS_STRING(tag); const Py_ssize_t len = PyBytes_GET_SIZE(tag); if (len >= 3 && p[0] == '{' && ( - p[1] == '}' || p[1] == '*' && p[2] == '}')) { + p[1] == '}' || (p[1] == '*' && p[2] == '}'))) { /* wildcard: '{}tag' or '{*}tag' */ return 1; } From webhook-mailer at python.org Mon May 6 11:39:09 2019 From: webhook-mailer at python.org (Dino Viehland) Date: Mon, 06 May 2019 15:39:09 -0000 Subject: [Python-checkins] Doc/c-api/exceptions.rst: fix grammar (#12091) Message-ID: https://github.com/python/cpython/commit/cec01849f142ea96731b4725975b89d3af757656 commit: cec01849f142ea96731b4725975b89d3af757656 branch: master author: Daniel Hahler committer: Dino Viehland date: 2019-05-06T08:39:05-07:00 summary: Doc/c-api/exceptions.rst: fix grammar (#12091) * Doc/c-api/exceptions.rst: fix grammar skip issue skip news * Use ", in that case" Co-Authored-By: blueyed files: M Doc/c-api/exceptions.rst diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 8c5f66cbef72..13f0aff1cf99 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -53,8 +53,8 @@ Printing and clearing .. c:function:: void PyErr_PrintEx(int set_sys_last_vars) Print a standard traceback to ``sys.stderr`` and clear the error indicator. - **Unless** the error is a ``SystemExit``. In that case the no traceback - is printed and Python process will exit with the error code specified by + **Unless** the error is a ``SystemExit``, in that case no traceback is + printed and the Python process will exit with the error code specified by the ``SystemExit`` instance. Call this function **only** when the error indicator is set. Otherwise it From webhook-mailer at python.org Mon May 6 12:01:22 2019 From: webhook-mailer at python.org (Dino Viehland) Date: Mon, 06 May 2019 16:01:22 -0000 Subject: [Python-checkins] Update wsgiref.rst (#10488) Message-ID: https://github.com/python/cpython/commit/f7b494c4d473c99ade2c8ab4e63005552f168f2b commit: f7b494c4d473c99ade2c8ab4e63005552f168f2b branch: master author: Andre Delfino committer: Dino Viehland date: 2019-05-06T09:01:17-07:00 summary: Update wsgiref.rst (#10488) files: M Doc/library/wsgiref.rst diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst index ec5136742fa2..6edd0714b9df 100644 --- a/Doc/library/wsgiref.rst +++ b/Doc/library/wsgiref.rst @@ -767,7 +767,7 @@ This is a working "Hello World" WSGI application:: # use a function (note that you're not limited to a function, you can # use a class for example). The first argument passed to the function # is a dictionary containing CGI-style environment variables and the - # second variable is the callable object (see PEP 333). + # second variable is the callable object. def hello_world_app(environ, start_response): status = '200 OK' # HTTP Status headers = [('Content-type', 'text/plain; charset=utf-8')] # HTTP Headers From webhook-mailer at python.org Mon May 6 12:32:49 2019 From: webhook-mailer at python.org (Guido van Rossum) Date: Mon, 06 May 2019 16:32:49 -0000 Subject: [Python-checkins] bpo-36798: Updating f-string docs for := use case (GH-13107) Message-ID: https://github.com/python/cpython/commit/ae2c32f32b61f3b141ba4b0b1ad71781d2f9a1a1 commit: ae2c32f32b61f3b141ba4b0b1ad71781d2f9a1a1 branch: master author: Logan Jones committer: Guido van Rossum date: 2019-05-06T11:32:44-05:00 summary: bpo-36798: Updating f-string docs for := use case (GH-13107) files: M Doc/reference/lexical_analysis.rst diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index fb04ccc839aa..13adc1a2e433 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -680,11 +680,12 @@ with a closing curly bracket ``'}'``. Expressions in formatted string literals are treated like regular Python expressions surrounded by parentheses, with a few exceptions. -An empty expression is not allowed, and a :keyword:`lambda` expression -must be surrounded by explicit parentheses. Replacement expressions -can contain line breaks (e.g. in triple-quoted strings), but they -cannot contain comments. Each expression is evaluated in the context -where the formatted string literal appears, in order from left to right. +An empty expression is not allowed, and both :keyword:`lambda` and +assignment expressions ``:=`` must be surrounded by explicit parentheses. +Replacement expressions can contain line breaks (e.g. in triple-quoted +strings), but they cannot contain comments. Each expression is evaluated +in the context where the formatted string literal appears, in order from +left to right. If a conversion is specified, the result of evaluating the expression is converted before formatting. Conversion ``'!s'`` calls :func:`str` on From webhook-mailer at python.org Mon May 6 12:56:59 2019 From: webhook-mailer at python.org (Brett Cannon) Date: Mon, 06 May 2019 16:56:59 -0000 Subject: [Python-checkins] bpo-36594: Fix incorrect use of %p in format strings (GH-12769) Message-ID: https://github.com/python/cpython/commit/1a2252ed39bc1b71cdaa935d7726d82909af93ab commit: 1a2252ed39bc1b71cdaa935d7726d82909af93ab branch: master author: Zackery Spytz committer: Brett Cannon <54418+brettcannon at users.noreply.github.com> date: 2019-05-06T12:56:50-04:00 summary: bpo-36594: Fix incorrect use of %p in format strings (GH-12769) In addition, fix some other minor violations of C99. files: A Misc/NEWS.d/next/Core and Builtins/2019-04-10-18-12-11.bpo-36594.fbnJAc.rst M Modules/_ctypes/_ctypes_test.c M Modules/_ctypes/callproc.c M Modules/_xxsubinterpretersmodule.c M Modules/hashtable.c M Objects/object.c M Objects/obmalloc.c M Objects/unicodeobject.c M Programs/_freeze_importlib.c M Python/sysmodule.c M Python/thread_pthread.h diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-10-18-12-11.bpo-36594.fbnJAc.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-10-18-12-11.bpo-36594.fbnJAc.rst new file mode 100644 index 000000000000..7ca5dd998d98 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-10-18-12-11.bpo-36594.fbnJAc.rst @@ -0,0 +1,2 @@ +Fix incorrect use of ``%p`` in format strings. +Patch by Zackery Spytz. diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index f8420580ffa8..bae4976a08d3 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -87,7 +87,7 @@ EXPORT(void)testfunc_array(int values[4]) EXPORT(long double)testfunc_Ddd(double a, double b) { long double result = (long double)(a * b); - printf("testfunc_Ddd(%p, %p)\n", &a, &b); + printf("testfunc_Ddd(%p, %p)\n", (void *)&a, (void *)&b); printf("testfunc_Ddd(%g, %g)\n", a, b); return result; } @@ -95,7 +95,7 @@ EXPORT(long double)testfunc_Ddd(double a, double b) EXPORT(long double)testfunc_DDD(long double a, long double b) { long double result = a * b; - printf("testfunc_DDD(%p, %p)\n", &a, &b); + printf("testfunc_DDD(%p, %p)\n", (void *)&a, (void *)&b); printf("testfunc_DDD(%Lg, %Lg)\n", a, b); return result; } @@ -103,7 +103,7 @@ EXPORT(long double)testfunc_DDD(long double a, long double b) EXPORT(int)testfunc_iii(int a, int b) { int result = a * b; - printf("testfunc_iii(%p, %p)\n", &a, &b); + printf("testfunc_iii(%p, %p)\n", (void *)&a, (void *)&b); return result; } @@ -361,7 +361,7 @@ static void _xxx_init(void *(*Xalloc)(int), void (*Xfree)(void *)) { void *ptr; - printf("_xxx_init got %p %p\n", Xalloc, Xfree); + printf("_xxx_init got %p %p\n", (void *)Xalloc, (void *)Xfree); printf("calling\n"); ptr = Xalloc(32); Xfree(ptr); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 1ad842eb3d40..a8ba84be4a76 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -531,11 +531,11 @@ PyCArg_repr(PyCArgObject *self) default: if (is_literal_char((unsigned char)self->tag)) { sprintf(buffer, "", - (unsigned char)self->tag, self); + (unsigned char)self->tag, (void *)self); } else { sprintf(buffer, "", - (unsigned char)self->tag, self); + (unsigned char)self->tag, (void *)self); } break; } diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 1cf43b7ac76e..0d8e5f3127d5 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -1250,7 +1250,7 @@ _channel_finish_closing(struct _channel *chan) { // Do the things that would have been done in _channels_close(). ref->chan = NULL; _channel_free(chan); -}; +} /* "high"-level channel-related functions */ diff --git a/Modules/hashtable.c b/Modules/hashtable.c index e6f8daf79664..4a36a1e71cdd 100644 --- a/Modules/hashtable.c +++ b/Modules/hashtable.c @@ -240,7 +240,7 @@ _Py_hashtable_print_stats(_Py_hashtable_t *ht) } printf("hash table %p: entries=%" PY_FORMAT_SIZE_T "u/%" PY_FORMAT_SIZE_T "u (%.0f%%), ", - ht, ht->entries, ht->num_buckets, load * 100.0); + (void *)ht, ht->entries, ht->num_buckets, load * 100.0); if (nchains) printf("avg_chain_len=%.1f, ", (double)total_chain_len / nchains); printf("max_chain_len=%" PY_FORMAT_SIZE_T "u, %" PY_FORMAT_SIZE_T "u KiB\n", diff --git a/Objects/object.c b/Objects/object.c index 589bf365e870..732f9ccefa87 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -385,7 +385,7 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) universally available */ Py_BEGIN_ALLOW_THREADS fprintf(fp, "", - (long)op->ob_refcnt, op); + (long)op->ob_refcnt, (void *)op); Py_END_ALLOW_THREADS } else { @@ -499,7 +499,7 @@ _PyObject_Dump(PyObject* op) "address : %p\n", Py_TYPE(op)==NULL ? "NULL" : Py_TYPE(op)->tp_name, (long)op->ob_refcnt, - op); + (void *)op); fflush(stderr); } @@ -1894,7 +1894,7 @@ _Py_PrintReferences(FILE *fp) PyObject *op; fprintf(fp, "Remaining objects:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) { - fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", op, op->ob_refcnt); + fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", (void *)op, op->ob_refcnt); if (PyObject_Print(op, fp, 0) != 0) PyErr_Clear(); putc('\n', fp); @@ -1910,7 +1910,7 @@ _Py_PrintReferenceAddresses(FILE *fp) PyObject *op; fprintf(fp, "Remaining object addresses:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) - fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", op, + fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", (void *)op, op->ob_refcnt, Py_TYPE(op)->tp_name); } @@ -2167,7 +2167,7 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, fprintf(stderr, "\n"); } else if (_PyObject_IsFreed((PyObject *)Py_TYPE(obj))) { - fprintf(stderr, "\n", Py_TYPE(obj)); + fprintf(stderr, "\n", (void *)Py_TYPE(obj)); } else { /* Diplay the traceback where the object has been allocated. diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 3ee143549d21..7cfd28965967 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -2354,7 +2354,7 @@ _PyObject_DebugDumpAddress(const void *p) } tail = q + nbytes; - fprintf(stderr, " The %d pad bytes at tail=%p are ", SST, tail); + fprintf(stderr, " The %d pad bytes at tail=%p are ", SST, (void *)tail); ok = 1; for (i = 0; i < SST; ++i) { if (tail[i] != FORBIDDENBYTE) { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 4d86519e8637..eaba5836cb1c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1251,7 +1251,7 @@ void *_PyUnicode_compact_data(void *unicode_raw) { } void *_PyUnicode_data(void *unicode_raw) { PyObject *unicode = _PyObject_CAST(unicode_raw); - printf("obj %p\n", unicode); + printf("obj %p\n", (void*)unicode); printf("compact %d\n", PyUnicode_IS_COMPACT(unicode)); printf("compact ascii %d\n", PyUnicode_IS_COMPACT_ASCII(unicode)); printf("ascii op %p\n", ((void*)((PyASCIIObject*)(unicode) + 1))); @@ -1282,14 +1282,14 @@ _PyUnicode_Dump(PyObject *op) if (ascii->wstr == data) printf("shared "); - printf("wstr=%p", ascii->wstr); + printf("wstr=%p", (void *)ascii->wstr); if (!(ascii->state.ascii == 1 && ascii->state.compact == 1)) { printf(" (%" PY_FORMAT_SIZE_T "u), ", compact->wstr_length); if (!ascii->state.compact && compact->utf8 == unicode->data.any) printf("shared "); printf("utf8=%p (%" PY_FORMAT_SIZE_T "u)", - compact->utf8, compact->utf8_length); + (void *)compact->utf8, compact->utf8_length); } printf(", data=%p\n", data); } diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 0818012d8c5a..4b2ed70de97c 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -127,7 +127,7 @@ main(int argc, char *argv[]) size_t i, end = Py_MIN(n + 16, data_size); fprintf(outfile, " "); for (i = n; i < end; i++) { - fprintf(outfile, "%d,", (unsigned int) data[i]); + fprintf(outfile, "%u,", (unsigned int) data[i]); } fprintf(outfile, "\n"); } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index fbdeb9b5565c..1290164edbf6 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1750,7 +1750,7 @@ _alloc_preinit_entry(const wchar_t *value) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); return node; -}; +} static int _append_preinit_entry(_Py_PreInitEntry *optionlist, const wchar_t *value) @@ -1772,7 +1772,7 @@ _append_preinit_entry(_Py_PreInitEntry *optionlist, const wchar_t *value) last_entry->next = new_entry; } return 0; -}; +} static void _clear_preinit_entries(_Py_PreInitEntry *optionlist) @@ -1789,7 +1789,7 @@ _clear_preinit_entries(_Py_PreInitEntry *optionlist) current = next; } PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); -}; +} static void _clear_all_preinit_options(void) @@ -1820,7 +1820,7 @@ _PySys_ReadPreInitOptions(void) _clear_all_preinit_options(); return 0; -}; +} static PyObject * get_warnoptions(void) diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 1f4f36d52d55..4c106d9959c1 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -339,7 +339,7 @@ PyThread_allocate_lock(void) } } - dprintf(("PyThread_allocate_lock() -> %p\n", lock)); + dprintf(("PyThread_allocate_lock() -> %p\n", (void *)lock)); return (PyThread_type_lock)lock; } @@ -521,7 +521,7 @@ PyThread_allocate_lock(void) } } - dprintf(("PyThread_allocate_lock() -> %p\n", lock)); + dprintf(("PyThread_allocate_lock() -> %p\n", (void *)lock)); return (PyThread_type_lock) lock; } From webhook-mailer at python.org Mon May 6 13:44:54 2019 From: webhook-mailer at python.org (Brett Cannon) Date: Mon, 06 May 2019 17:44:54 -0000 Subject: [Python-checkins] Unroll import-team in CODEOWNERS (#13118) Message-ID: https://github.com/python/cpython/commit/678bb9d1b51d46801d10f8e35585a369aca1c593 commit: 678bb9d1b51d46801d10f8e35585a369aca1c593 branch: master author: Brett Cannon <54418+brettcannon at users.noreply.github.com> committer: GitHub date: 2019-05-06T13:44:49-04:00 summary: Unroll import-team in CODEOWNERS (#13118) files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9b7a4032fb43..fae513843566 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -26,8 +26,8 @@ Objects/dict* @methane # Ignoring importlib.h so as to not get flagged on # all pull requests that change the emitted # bytecode. -**/*import*.c @python/import-team -**/*import*.py @python/import-team +**/*import*.c @brettcannon @encukou @ericsnowcurrently @ncoghlan @warsaw +**/*import*.py @brettcannon @encukou @ericsnowcurrently @ncoghlan @warsaw # SSL From webhook-mailer at python.org Mon May 6 14:32:45 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Mon, 06 May 2019 18:32:45 -0000 Subject: [Python-checkins] bpo-30668: add missing word in license.rst (GH-13115) Message-ID: https://github.com/python/cpython/commit/4920c093da8a3061faea62d62f2ddf0c5c443360 commit: 4920c093da8a3061faea62d62f2ddf0c5c443360 branch: master author: Patrick M?hlbauer committer: St?phane Wirtel date: 2019-05-06T14:32:42-04:00 summary: bpo-30668: add missing word in license.rst (GH-13115) files: M Doc/license.rst diff --git a/Doc/license.rst b/Doc/license.rst index d3733f53a116..bf2e4c522ce1 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -561,7 +561,7 @@ SipHash24 --------- The file :file:`Python/pyhash.c` contains Marek Majkowski' implementation of -Dan Bernstein's SipHash24 algorithm. The contains the following note:: +Dan Bernstein's SipHash24 algorithm. It contains the following note:: Copyright (c) 2013 Marek Majkowski From webhook-mailer at python.org Mon May 6 14:48:24 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 May 2019 18:48:24 -0000 Subject: [Python-checkins] Clarify the download unit in the download section (GH-13122) Message-ID: https://github.com/python/cpython/commit/e9b49d1b4eec21f2da838db3360f6458cf648c36 commit: e9b49d1b4eec21f2da838db3360f6458cf648c36 branch: master author: St?phane Wirtel committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-06T11:48:17-07:00 summary: Clarify the download unit in the download section (GH-13122) files: M Doc/tools/templates/download.html diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index 1a99b18bbb26..d9364d6ced72 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -12,8 +12,7 @@

Download Python {{ release }} Documentation

{% if last_updated %}

Last updated on: {{ last_updated }}.

{% endif %}

To download an archive containing all the documents for this version of -Python in one of various formats, follow one of links in this table. The numbers -in the table are the size of the download files in megabytes.

+Python in one of various formats, follow one of links in this table.

From webhook-mailer at python.org Mon May 6 14:51:20 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Mon, 06 May 2019 18:51:20 -0000 Subject: [Python-checkins] bpo-36275: enhance documentation for venv.create() (GH-13114) Message-ID: https://github.com/python/cpython/commit/3921b1cc34c2fc8b8b480c19a95ec306de710fdd commit: 3921b1cc34c2fc8b8b480c19a95ec306de710fdd branch: master author: Sebastian Koslowski committer: Cheryl Sabella date: 2019-05-06T14:51:09-04:00 summary: bpo-36275: enhance documentation for venv.create() (GH-13114) files: M Doc/library/venv.rst diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 412808ad4486..4f083a3181e7 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -234,14 +234,19 @@ creation according to their needs, the :class:`EnvBuilder` class. There is also a module-level convenience function: .. function:: create(env_dir, system_site_packages=False, clear=False, \ - symlinks=False, with_pip=False) + symlinks=False, with_pip=False, prompt=None) Create an :class:`EnvBuilder` with the given keyword arguments, and call its :meth:`~EnvBuilder.create` method with the *env_dir* argument. + .. versionadded:: 3.3 + .. versionchanged:: 3.4 Added the ``with_pip`` parameter + .. versionchanged:: 3.6 + Added the ``prompt`` parameter + An example of extending ``EnvBuilder`` -------------------------------------- From webhook-mailer at python.org Mon May 6 14:57:27 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Mon, 06 May 2019 18:57:27 -0000 Subject: [Python-checkins] bpo-36766: Typos in docs and code comments (GH-13116) Message-ID: https://github.com/python/cpython/commit/964663089547ca110199e23867b46b07ff4be88c commit: 964663089547ca110199e23867b46b07ff4be88c branch: master author: penguindustin committer: St?phane Wirtel date: 2019-05-06T14:57:17-04:00 summary: bpo-36766: Typos in docs and code comments (GH-13116) files: M Doc/library/email.generator.rst M Doc/library/pyclbr.rst M Lib/idlelib/configdialog.py M Lib/idlelib/help.html M Lib/idlelib/help.py M Lib/idlelib/idle_test/test_config.py M Lib/lib2to3/pgen2/tokenize.py M Lib/multiprocessing/resource_sharer.py M Lib/pathlib.py M Lib/platform.py M Lib/pstats.py M Lib/test/datetimetester.py M Lib/test/pickletester.py M Lib/test/support/__init__.py M Lib/test/test_dataclasses.py M Lib/test/test_importlib/test_lazy.py M Lib/test/test_random.py M Lib/test/test_ssl.py M Lib/test/test_tools/test_i18n.py M Lib/tokenize.py M Lib/turtle.py M Objects/object.c diff --git a/Doc/library/email.generator.rst b/Doc/library/email.generator.rst index fc535a3e4399f..c09ae8cbc6041 100644 --- a/Doc/library/email.generator.rst +++ b/Doc/library/email.generator.rst @@ -188,7 +188,7 @@ to be using :class:`BytesGenerator`, and not :class:`Generator`. (This is required because strings cannot represent non-ASCII bytes.) Convert any bytes with the high bit set as needed using an ASCII-compatible :mailheader:`Content-Transfer-Encoding`. That is, - transform parts with non-ASCII :mailheader:`Cotnent-Transfer-Encoding` + transform parts with non-ASCII :mailheader:`Content-Transfer-Encoding` (:mailheader:`Content-Transfer-Encoding: 8bit`) to an ASCII compatible :mailheader:`Content-Transfer-Encoding`, and encode RFC-invalid non-ASCII bytes in headers using the MIME ``unknown-8bit`` character set, thus diff --git a/Doc/library/pyclbr.rst b/Doc/library/pyclbr.rst index a70c8df6a7b11..b80a2faed9b42 100644 --- a/Doc/library/pyclbr.rst +++ b/Doc/library/pyclbr.rst @@ -44,7 +44,7 @@ modules. .. versionadded:: 3.7 Descriptors for nested definitions. They are accessed through the - new children attibute. Each has a new parent attribute. + new children attribute. Each has a new parent attribute. The descriptors returned by these functions are instances of Function and Class classes. Users are not expected to create instances diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 31520a3b0d1e3..4aaec1321f7d6 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -2225,7 +2225,7 @@ def detach(self): 'General': ''' General: -AutoComplete: Popupwait is milleseconds to wait after key char, without +AutoComplete: Popupwait is milliseconds to wait after key char, without cursor movement, before popping up completion box. Key char is '.' after identifier or a '/' (or '\\' on Windows) within a string. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 7e743e6d8137b..ba44331e87b22 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -721,7 +721,7 @@

Developing tkinter applicationsroot = tk.Tk() in standard Python and nothing appears. Enter the same in IDLE and a tk window appears. In standard Python, one must also enter root.update() to see the window. IDLE does the equivalent in the -background, about 20 times a second, which is about every 50 milleseconds. +background, about 20 times a second, which is about every 50 milliseconds. Next enter b = tk.Button(root, text='button'); b.pack(). Again, nothing visibly changes in standard Python until one enters root.update().

Most tkinter programs run root.mainloop(), which usually does not diff --git a/Lib/idlelib/help.py b/Lib/idlelib/help.py index 0603ede822bad..652444a7f1493 100644 --- a/Lib/idlelib/help.py +++ b/Lib/idlelib/help.py @@ -2,7 +2,7 @@ Contents are subject to revision at any time, without notice. -Help => About IDLE: diplay About Idle dialog +Help => About IDLE: display About Idle dialog diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py index 7e2c1fd2958ce..255210df7d960 100644 --- a/Lib/idlelib/idle_test/test_config.py +++ b/Lib/idlelib/idle_test/test_config.py @@ -521,7 +521,7 @@ def test_get_current_keyset(self): def test_get_keyset(self): conf = self.mock_config() - # Conflic with key set, should be disable to '' + # Conflict with key set, should be disable to '' conf.defaultCfg['extensions'].add_section('Foobar') conf.defaultCfg['extensions'].add_section('Foobar_cfgBindings') conf.defaultCfg['extensions'].set('Foobar', 'enable', 'True') diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py index c07b34f7c6452..279d322971da9 100644 --- a/Lib/lib2to3/pgen2/tokenize.py +++ b/Lib/lib2to3/pgen2/tokenize.py @@ -321,7 +321,7 @@ def untokenize(iterable): Round-trip invariant for full input: Untokenized source will match input source exactly - Round-trip invariant for limited intput: + Round-trip invariant for limited input: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) diff --git a/Lib/multiprocessing/resource_sharer.py b/Lib/multiprocessing/resource_sharer.py index 730b2aa17bdf0..8d5c9900f69fe 100644 --- a/Lib/multiprocessing/resource_sharer.py +++ b/Lib/multiprocessing/resource_sharer.py @@ -59,7 +59,7 @@ def detach(self): class _ResourceSharer(object): - '''Manager for resouces using background thread.''' + '''Manager for resources using background thread.''' def __init__(self): self._key = 0 self._cache = {} diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 1ba98b19e8334..952cd94921e4b 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -34,7 +34,7 @@ # Internals # -# EBADF - guard agains macOS `stat` throwing EBADF +# EBADF - guard against macOS `stat` throwing EBADF _IGNORED_ERROS = (ENOENT, ENOTDIR, EBADF) _IGNORED_WINERRORS = ( diff --git a/Lib/platform.py b/Lib/platform.py index 9f7bd95980a15..6fbb7b08c598e 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -72,7 +72,7 @@ # type information # 0.4.0 - added win32_ver() and modified the platform() output for WinXX # 0.3.4 - fixed a bug in _follow_symlinks() -# 0.3.3 - fixed popen() and "file" command invokation bugs +# 0.3.3 - fixed popen() and "file" command invocation bugs # 0.3.2 - added architecture() API and support for it in platform() # 0.3.1 - fixed syscmd_ver() RE to support Windows NT # 0.3.0 - added system alias support diff --git a/Lib/pstats.py b/Lib/pstats.py index ded5ae59f7da2..b7649ebc6f1c6 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -509,7 +509,7 @@ def func_std_string(func_name): # match what old profile produced return "%s:%d(%s)" % func_name #************************************************************************** -# The following functions combine statists for pairs functions. +# The following functions combine statistics for pairs functions. # The bulk of the processing involves correctly handling "call" lists, # such as callers and callees. #************************************************************************** diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 9fe32ebc5b395..af0047fafd877 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -3483,7 +3483,7 @@ def utcoffset(self, t): self.assertEqual(got, expected) # However, if they're different members, uctoffset is not ignored. - # Note that a time can't actually have an operand-depedent offset, + # Note that a time can't actually have an operand-dependent offset, # though (and time.utcoffset() passes None to tzinfo.utcoffset()), # so skip this test for time. if cls is not time: diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index 8f687c49e6904..bb8e6ce0964fc 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -2222,7 +2222,7 @@ def remove_frames(pickled, keep_frame=None): frame_size = self.FRAME_SIZE_TARGET num_frames = 20 - # Large byte objects (dict values) intermitted with small objects + # Large byte objects (dict values) intermittent with small objects # (dict keys) obj = {i: bytes([i]) * frame_size for i in range(num_frames)} diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index dc96318b38f7b..9e60d960ab12f 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -1006,7 +1006,7 @@ def temp_dir(path=None, quiet=False): yield path finally: # In case the process forks, let only the parent remove the - # directory. The child has a diffent process id. (bpo-30028) + # directory. The child has a different process id. (bpo-30028) if dir_created and pid == os.getpid(): rmtree(path) diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index d320a969876e3..867210688f573 100755 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -1458,7 +1458,7 @@ class C: } ) - # Make sure that the returned dicts are actuall OrderedDicts. + # Make sure that the returned dicts are actually OrderedDicts. self.assertIs(type(d), OrderedDict) self.assertIs(type(d['y'][1]), OrderedDict) diff --git a/Lib/test/test_importlib/test_lazy.py b/Lib/test/test_importlib/test_lazy.py index ffd8dc6cb0411..28608e95d060f 100644 --- a/Lib/test/test_importlib/test_lazy.py +++ b/Lib/test/test_importlib/test_lazy.py @@ -56,7 +56,7 @@ class LazyLoaderTests(unittest.TestCase): def test_init(self): with self.assertRaises(TypeError): - # Classes that dono't define exec_module() trigger TypeError. + # Classes that don't define exec_module() trigger TypeError. util.LazyLoader(object) def new_module(self, source_code=None): diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index e818a7b28d433..ff1ddcaf14074 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -719,7 +719,7 @@ def test_choices_algorithms(self): c = self.gen.choices(range(n), cum_weights=range(1, n+1), k=10000) self.assertEqual(a, c) - # Amerian Roulette + # American Roulette population = ['Red', 'Black', 'Green'] weights = [18, 18, 2] cum_weights = [18, 36, 38] diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 4444e945952fc..5b53b8250f68a 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -4332,7 +4332,7 @@ def test_pha_optional_nocert(self): self.assertEqual(s.recv(1024), b'FALSE\n') s.write(b'PHA') self.assertEqual(s.recv(1024), b'OK\n') - # optional doens't fail when client does not have a cert + # optional doesn't fail when client does not have a cert s.write(b'HASCERT') self.assertEqual(s.recv(1024), b'FALSE\n') diff --git a/Lib/test/test_tools/test_i18n.py b/Lib/test/test_tools/test_i18n.py index 8b2b90d6142bb..42e20f8f7716d 100644 --- a/Lib/test/test_tools/test_i18n.py +++ b/Lib/test/test_tools/test_i18n.py @@ -211,7 +211,7 @@ def foo3(bar: 'func'=lambda x: x) -> {1: 2}: self.assertIn('doc3', msgids) def test_classdocstring_early_colon(self): - """ Test docstring extraction for a class with colons occuring within + """ Test docstring extraction for a class with colons occurring within the parentheses. """ msgids = self.extract_docstrings_from_str(dedent('''\ diff --git a/Lib/tokenize.py b/Lib/tokenize.py index cf1ecc99a9443..0f9d5dd554d53 100644 --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -82,7 +82,7 @@ def maybe(*choices): return group(*choices) + '?' # Return the empty string, plus all of the valid string prefixes. def _all_string_prefixes(): # The valid string prefixes. Only contain the lower case versions, - # and don't contain any permuations (include 'fr', but not + # and don't contain any permutations (include 'fr', but not # 'rf'). The various permutations will be generated. _valid_string_prefixes = ['b', 'r', 'u', 'f', 'br', 'fr'] # if we add binary f-strings, add: ['fb', 'fbr'] diff --git a/Lib/turtle.py b/Lib/turtle.py index 47a94f2a4702f..044d91cf6d837 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -1568,7 +1568,7 @@ def degrees(self, fullcircle=360.0): fullcircle - a number Set angle measurement units, i. e. set number - of 'degrees' for a full circle. Dafault value is + of 'degrees' for a full circle. Default value is 360 degrees. Example (for a Turtle instance named turtle): diff --git a/Objects/object.c b/Objects/object.c index 732f9ccefa877..cb727943cb342 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2170,7 +2170,7 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, fprintf(stderr, "\n", (void *)Py_TYPE(obj)); } else { - /* Diplay the traceback where the object has been allocated. + /* Display the traceback where the object has been allocated. Do it before dumping repr(obj), since repr() is more likely to crash than dumping the traceback. */ void *ptr; From webhook-mailer at python.org Mon May 6 15:08:14 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 May 2019 19:08:14 -0000 Subject: [Python-checkins] bpo-30668: add missing word in license.rst (GH-13115) Message-ID: https://github.com/python/cpython/commit/8777915adeb6c884bcab262a33da3daddd2b2120 commit: 8777915adeb6c884bcab262a33da3daddd2b2120 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-06T12:08:10-07:00 summary: bpo-30668: add missing word in license.rst (GH-13115) (cherry picked from commit 4920c093da8a3061faea62d62f2ddf0c5c443360) Co-authored-by: Patrick M?hlbauer files: M Doc/license.rst diff --git a/Doc/license.rst b/Doc/license.rst index a315b6f8134d..ac0e2b30bbbf 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -561,7 +561,7 @@ SipHash24 --------- The file :file:`Python/pyhash.c` contains Marek Majkowski' implementation of -Dan Bernstein's SipHash24 algorithm. The contains the following note:: +Dan Bernstein's SipHash24 algorithm. It contains the following note:: Copyright (c) 2013 Marek Majkowski From webhook-mailer at python.org Mon May 6 15:26:11 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 May 2019 19:26:11 -0000 Subject: [Python-checkins] bpo-36275: enhance documentation for venv.create() (GH-13114) Message-ID: https://github.com/python/cpython/commit/9a03c773285fda707fc4ce9a69347b83afeeb49f commit: 9a03c773285fda707fc4ce9a69347b83afeeb49f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-06T12:25:59-07:00 summary: bpo-36275: enhance documentation for venv.create() (GH-13114) (cherry picked from commit 3921b1cc34c2fc8b8b480c19a95ec306de710fdd) Co-authored-by: Sebastian Koslowski files: M Doc/library/venv.rst diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index fefc522b45d16..d61df484f9e7e 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -239,14 +239,19 @@ creation according to their needs, the :class:`EnvBuilder` class. There is also a module-level convenience function: .. function:: create(env_dir, system_site_packages=False, clear=False, \ - symlinks=False, with_pip=False) + symlinks=False, with_pip=False, prompt=None) Create an :class:`EnvBuilder` with the given keyword arguments, and call its :meth:`~EnvBuilder.create` method with the *env_dir* argument. + .. versionadded:: 3.3 + .. versionchanged:: 3.4 Added the ``with_pip`` parameter + .. versionchanged:: 3.6 + Added the ``prompt`` parameter + An example of extending ``EnvBuilder`` -------------------------------------- From webhook-mailer at python.org Mon May 6 15:29:44 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 06 May 2019 19:29:44 -0000 Subject: [Python-checkins] bpo-36793: Remove unneeded __str__ definitions. (GH-13081) Message-ID: https://github.com/python/cpython/commit/96aeaec64738b730c719562125070a52ed570210 commit: 96aeaec64738b730c719562125070a52ed570210 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-05-06T22:29:40+03:00 summary: bpo-36793: Remove unneeded __str__ definitions. (GH-13081) Classes that define __str__ the same as __repr__ can just inherit it from object. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-04-16-15-33.bpo-36793.Izog4Z.rst M Doc/whatsnew/3.8.rst M Lib/_pydecimal.py M Lib/asyncore.py M Lib/doctest.py M Lib/email/charset.py M Lib/http/client.py M Lib/json/encoder.py M Lib/logging/__init__.py M Lib/sre_constants.py M Lib/subprocess.py M Lib/xmlrpc/client.py M Modules/_decimal/_decimal.c M Modules/_json.c M Objects/boolobject.c M Objects/complexobject.c M Objects/floatobject.c M Objects/longobject.c diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 64ef6e184060..d6388f8faaba 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -811,6 +811,13 @@ Changes in Python behavior raised when getting the attribute from the type dictionary are no longer ignored. (Contributed by Serhiy Storchaka in :issue:`35459`.) +* Removed ``__str__`` implementations from builtin types :class:`bool`, + :class:`int`, :class:`float`, :class:`complex` and few classes from + the standard library. They now inherit ``__str__()`` from :class:`object`. + As result, defining the ``__repr__()`` method in the subclass of these + classes will affect they string representation. + (Contributed by Serhiy Storchaka in :issue:`36793`.) + * On AIX, :attr:`sys.platform` doesn't contain the major version anymore. It is always ``'aix'``, instead of ``'aix3'`` .. ``'aix7'``. Since older Python versions include the version number, it is recommended to diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py index 44ea5b41b2a1..c14d8ca86a11 100644 --- a/Lib/_pydecimal.py +++ b/Lib/_pydecimal.py @@ -5631,8 +5631,6 @@ def __init__(self, value=None): def __repr__(self): return "(%r, %r, %r)" % (self.sign, self.int, self.exp) - __str__ = __repr__ - def _normalize(op1, op2, prec = 0): diff --git a/Lib/asyncore.py b/Lib/asyncore.py index 828f4d4fe789..0e92be3ad191 100644 --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -262,8 +262,6 @@ def __repr__(self): status.append(repr(self.addr)) return '<%s at %#x>' % (' '.join(status), id(self)) - __str__ = __repr__ - def add_channel(self, map=None): #self.log_info('adding channel %s' % self) if map is None: diff --git a/Lib/doctest.py b/Lib/doctest.py index 79d91a040c2e..bf4889f59e0d 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -2300,7 +2300,7 @@ def __repr__(self): name = self._dt_test.name.split('.') return "%s (%s)" % (name[-1], '.'.join(name[:-1])) - __str__ = __repr__ + __str__ = object.__str__ def shortDescription(self): return "Doctest: " + self._dt_test.name @@ -2399,7 +2399,6 @@ def id(self): def __repr__(self): return self._dt_test.filename - __str__ = __repr__ def format_failure(self, err): return ('Failed doctest test for %s\n File "%s", line 0\n\n%s' diff --git a/Lib/email/charset.py b/Lib/email/charset.py index ee564040c68f..d3d759ad9115 100644 --- a/Lib/email/charset.py +++ b/Lib/email/charset.py @@ -241,11 +241,9 @@ def __init__(self, input_charset=DEFAULT_CHARSET): self.output_codec = CODEC_MAP.get(self.output_charset, self.output_charset) - def __str__(self): + def __repr__(self): return self.input_charset.lower() - __repr__ = __str__ - def __eq__(self, other): return str(self) == str(other).lower() diff --git a/Lib/http/client.py b/Lib/http/client.py index f71a062d2b57..82908ebe3afd 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -1419,8 +1419,7 @@ def __repr__(self): e = '' return '%s(%i bytes read%s)' % (self.__class__.__name__, len(self.partial), e) - def __str__(self): - return repr(self) + __str__ = object.__str__ class ImproperConnectionState(HTTPException): pass diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index 2d7b8989c711..c8c78b9c2376 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -268,7 +268,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, list=list, str=str, tuple=tuple, - _intstr=int.__str__, + _intstr=int.__repr__, ): if _indent is not None and not isinstance(_indent, str): @@ -307,7 +307,7 @@ def _iterencode_list(lst, _current_indent_level): elif value is False: yield buf + 'false' elif isinstance(value, int): - # Subclasses of int/float may override __str__, but we still + # Subclasses of int/float may override __repr__, but we still # want to encode them as integers/floats in JSON. One example # within the standard library is IntEnum. yield buf + _intstr(value) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 7355396541a3..e093982a0cdf 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -364,12 +364,10 @@ def __init__(self, name, level, pathname, lineno, else: self.process = None - def __str__(self): + def __repr__(self): return ''%(self.name, self.levelno, self.pathname, self.lineno, self.msg) - __repr__ = __str__ - def getMessage(self): """ Return the message for this LogRecord. diff --git a/Lib/sre_constants.py b/Lib/sre_constants.py index 13deb00bc81c..8e613cb3fa5d 100644 --- a/Lib/sre_constants.py +++ b/Lib/sre_constants.py @@ -59,11 +59,9 @@ def __new__(cls, value, name): self.name = name return self - def __str__(self): + def __repr__(self): return self.name - __repr__ = __str__ - MAXREPEAT = _NamedIntConstant(MAXREPEAT, 'MAXREPEAT') def _makecodes(names): diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 0496b447e8ea..6cc9eb322e28 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -203,7 +203,6 @@ def __repr__(self): return "%s(%d)" % (self.__class__.__name__, int(self)) __del__ = Close - __str__ = __repr__ else: # When select or poll has indicated that the file is writable, # we can write up to _PIPE_BUF bytes without risk of blocking. diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py index a0e923a20322..b9875745000f 100644 --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -186,8 +186,7 @@ def escape(s): class Error(Exception): """Base class for client errors.""" - def __str__(self): - return repr(self) + __str__ = object.__str__ ## # Indicates an HTTP-level protocol error. This is raised by the HTTP @@ -869,8 +868,6 @@ def __init__(self, server): def __repr__(self): return "<%s at %#x>" % (self.__class__.__name__, id(self)) - __str__ = __repr__ - def __getattr__(self, name): return _MultiCallMethod(self.__call_list, name) @@ -1468,8 +1465,6 @@ def __repr__(self): (self.__class__.__name__, self.__host, self.__handler) ) - __str__ = __repr__ - def __getattr__(self, name): # magic method dispatcher return _Method(self.__request, name) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-04-16-15-33.bpo-36793.Izog4Z.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-04-16-15-33.bpo-36793.Izog4Z.rst new file mode 100644 index 000000000000..6c79f97dacac --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-04-16-15-33.bpo-36793.Izog4Z.rst @@ -0,0 +1,3 @@ +Removed ``__str__`` implementations from builtin types :class:`bool`, +:class:`int`, :class:`float`, :class:`complex` and few classes from the +standard library. They now inherit ``__str__()`` from :class:`object`. diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 51aed2c67dc6..d977b14f5b0c 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -5390,7 +5390,7 @@ static PyTypeObject PyDecContext_Type = 0, /* tp_as_mapping */ (hashfunc) 0, /* tp_hash */ 0, /* tp_call */ - (reprfunc) context_repr, /* tp_str */ + 0, /* tp_str */ (getattrofunc) context_getattr, /* tp_getattro */ (setattrofunc) context_setattr, /* tp_setattro */ (PyBufferProcs *) 0, /* tp_as_buffer */ diff --git a/Modules/_json.c b/Modules/_json.c index 2d7c1bf1e1c7..4faa9cc22edf 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1482,7 +1482,7 @@ encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc, return _steal_accumulate(acc, encoded); } else if (PyLong_Check(obj)) { - PyObject *encoded = PyLong_Type.tp_str(obj); + PyObject *encoded = PyLong_Type.tp_repr(obj); if (encoded == NULL) return -1; return _steal_accumulate(acc, encoded); @@ -1646,7 +1646,7 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, goto bail; } else if (PyLong_Check(key)) { - kstr = PyLong_Type.tp_str(key); + kstr = PyLong_Type.tp_repr(key); if (kstr == NULL) { goto bail; } diff --git a/Objects/boolobject.c b/Objects/boolobject.c index b92fafe620c1..508ea61f1800 100644 --- a/Objects/boolobject.c +++ b/Objects/boolobject.c @@ -147,7 +147,7 @@ PyTypeObject PyBool_Type = { 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ - bool_repr, /* tp_str */ + 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 6e3d47b62d19..cae2bf11dc9b 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -1129,7 +1129,7 @@ PyTypeObject PyComplex_Type = { 0, /* tp_as_mapping */ (hashfunc)complex_hash, /* tp_hash */ 0, /* tp_call */ - (reprfunc)complex_repr, /* tp_str */ + 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ diff --git a/Objects/floatobject.c b/Objects/floatobject.c index b952df880722..adb9b80c2713 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1923,7 +1923,7 @@ PyTypeObject PyFloat_Type = { 0, /* tp_as_mapping */ (hashfunc)float_hash, /* tp_hash */ 0, /* tp_call */ - (reprfunc)float_repr, /* tp_str */ + 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ diff --git a/Objects/longobject.c b/Objects/longobject.c index da697a784faa..9fb1fb02c276 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5592,7 +5592,7 @@ PyTypeObject PyLong_Type = { 0, /* tp_as_mapping */ (hashfunc)long_hash, /* tp_hash */ 0, /* tp_call */ - long_to_decimal_string, /* tp_str */ + 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ From webhook-mailer at python.org Mon May 6 15:32:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 May 2019 19:32:56 -0000 Subject: [Python-checkins] [3.7] Clarify the download unit in the download section (GH-13122) (GH-13130) Message-ID: https://github.com/python/cpython/commit/88a2074e3badaed186b3c54e8690c69b9e80c6ce commit: 88a2074e3badaed186b3c54e8690c69b9e80c6ce branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-06T12:32:52-07:00 summary: [3.7] Clarify the download unit in the download section (GH-13122) (GH-13130) (cherry picked from commit e9b49d1b4eec21f2da838db3360f6458cf648c36) Co-authored-by: St?phane Wirtel files: M Doc/tools/templates/download.html diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index 1a99b18bbb26..d9364d6ced72 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -12,8 +12,7 @@

Download Python {{ release }} Documentation

{% if last_updated %}

Last updated on: {{ last_updated }}.

{% endif %}

To download an archive containing all the documents for this version of -Python in one of various formats, follow one of links in this table. The numbers -in the table are the size of the download files in megabytes.

+Python in one of various formats, follow one of links in this table.

FormatPacked as .zipPacked as .tar.bz2
From webhook-mailer at python.org Mon May 6 15:40:31 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 06 May 2019 19:40:31 -0000 Subject: [Python-checkins] bpo-36542: Allow to overwrite the signature for Python functions. (GH-12705) Message-ID: https://github.com/python/cpython/commit/d53cf99dca4605ace4b81b1e585616b3e1b74fa6 commit: d53cf99dca4605ace4b81b1e585616b3e1b74fa6 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-05-06T22:40:27+03:00 summary: bpo-36542: Allow to overwrite the signature for Python functions. (GH-12705) files: A Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst M Lib/bdb.py M Lib/cProfile.py M Lib/collections/__init__.py M Lib/concurrent/futures/_base.py M Lib/concurrent/futures/process.py M Lib/concurrent/futures/thread.py M Lib/contextlib.py M Lib/curses/__init__.py M Lib/functools.py M Lib/inspect.py M Lib/multiprocessing/managers.py M Lib/profile.py M Lib/test/test_inspect.py M Lib/trace.py M Lib/unittest/case.py M Lib/weakref.py diff --git a/Lib/bdb.py b/Lib/bdb.py index 54aa98437450..69174364c46a 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -649,6 +649,7 @@ def runcall(*args, **kwds): self.quitting = True sys.settrace(None) return res + runcall.__text_signature__ = '($self, func, /, *args, **kwds)' def set_trace(): diff --git a/Lib/cProfile.py b/Lib/cProfile.py index 2e449cc576ce..369d02e22e24 100755 --- a/Lib/cProfile.py +++ b/Lib/cProfile.py @@ -124,6 +124,7 @@ def runcall(*args, **kw): return func(*args, **kw) finally: self.disable() + runcall.__text_signature__ = '($self, func, /, *args, **kw)' def __enter__(self): self.enable() diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 9657c1cf83bc..e6cafb320fab 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1018,6 +1018,8 @@ def __init__(*args, **kwargs): self.update(dict) if kwargs: self.update(kwargs) + __init__.__text_signature__ = '($self, dict=None, /, **kwargs)' + def __len__(self): return len(self.data) def __getitem__(self, key): if key in self.data: diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index ea16eef841c5..8f155f0ea82b 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -567,6 +567,7 @@ def submit(*args, **kwargs): 'got %d' % (len(args)-1)) raise NotImplementedError() + submit.__text_signature__ = '($self, fn, /, *args, **kwargs)' def map(self, fn, *iterables, timeout=None, chunksize=1): """Returns an iterator equivalent to map(fn, iter). diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index e6ce278b5d44..21bf4a447f08 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -630,6 +630,7 @@ def submit(*args, **kwargs): self._start_queue_management_thread() return f + submit.__text_signature__ = _base.Executor.submit.__text_signature__ submit.__doc__ = _base.Executor.submit.__doc__ def map(self, fn, *iterables, timeout=None, chunksize=1): diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 0a61e3a9ac1b..2af31a106dd9 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -174,6 +174,7 @@ def submit(*args, **kwargs): self._work_queue.put(w) self._adjust_thread_count() return f + submit.__text_signature__ = _base.Executor.submit.__text_signature__ submit.__doc__ = _base.Executor.submit.__doc__ def _adjust_thread_count(self): diff --git a/Lib/contextlib.py b/Lib/contextlib.py index ae498a2b6ef5..de989a001c6d 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -454,6 +454,7 @@ def callback(*args, **kwds): _exit_wrapper.__wrapped__ = callback self._push_exit_callback(_exit_wrapper) return callback # Allow use as a decorator + callback.__text_signature__ = '($self, callback, /, *args, **kwds)' def _push_cm_exit(self, cm, cm_exit): """Helper to correctly register callbacks to __exit__ methods.""" @@ -615,6 +616,7 @@ def push_async_callback(*args, **kwds): _exit_wrapper.__wrapped__ = callback self._push_exit_callback(_exit_wrapper, False) return callback # Allow use as a decorator + push_async_callback.__text_signature__ = '($self, callback, /, *args, **kwds)' async def aclose(self): """Immediately unwind the context stack.""" diff --git a/Lib/curses/__init__.py b/Lib/curses/__init__.py index 44a198428820..24ff3ca93a89 100644 --- a/Lib/curses/__init__.py +++ b/Lib/curses/__init__.py @@ -110,3 +110,4 @@ def wrapper(*args, **kwds): echo() nocbreak() endwin() +wrapper.__text_signature__ = '(func, /, *args, **kwds)' diff --git a/Lib/functools.py b/Lib/functools.py index 1f1874db9b4c..28d9f6f75fdb 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -388,6 +388,7 @@ def __init__(*args, **keywords): self.func = func self.args = args self.keywords = keywords + __init__.__text_signature__ = '($self, func, /, *args, **keywords)' def __repr__(self): args = ", ".join(map(repr, self.args)) diff --git a/Lib/inspect.py b/Lib/inspect.py index c460309bb5a1..6c3027987b30 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -2121,7 +2121,7 @@ def _signature_from_builtin(cls, func, skip_bound_arg=True): return _signature_fromstr(cls, func, s, skip_bound_arg) -def _signature_from_function(cls, func): +def _signature_from_function(cls, func, skip_bound_arg=True): """Private helper: constructs Signature for the given python function.""" is_duck_function = False @@ -2133,6 +2133,10 @@ def _signature_from_function(cls, func): # of pure function: raise TypeError('{!r} is not a Python function'.format(func)) + s = getattr(func, "__text_signature__", None) + if s: + return _signature_fromstr(cls, func, s, skip_bound_arg) + Parameter = cls._parameter_cls # Parameter information. @@ -2301,7 +2305,8 @@ def _signature_from_callable(obj, *, if isfunction(obj) or _signature_is_functionlike(obj): # If it's a pure Python function, or an object that is duck type # of a Python function (Cython functions, for instance), then: - return _signature_from_function(sigcls, obj) + return _signature_from_function(sigcls, obj, + skip_bound_arg=skip_bound_arg) if _signature_is_builtin(obj): return _signature_from_builtin(sigcls, obj, diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 80c3ddb9154a..22abd47fb1f2 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -419,6 +419,7 @@ def create(*args, **kwds): self.incref(c, ident) return ident, tuple(exposed) + create.__text_signature__ = '($self, c, typeid, /, *args, **kwds)' def get_methods(self, c, token): ''' @@ -1309,6 +1310,7 @@ def create(*args, **kwargs): if hasattr(self.registry[typeid][-1], "_shared_memory_proxy"): kwargs['shared_memory_context'] = self.shared_memory_context return Server.create(*args, **kwargs) + create.__text_signature__ = '($self, c, typeid, /, *args, **kwargs)' def shutdown(self, c): "Call unlink() on all tracked shared memory, terminate the Server." diff --git a/Lib/profile.py b/Lib/profile.py index 9a865d3f6f6e..1346297c04a5 100755 --- a/Lib/profile.py +++ b/Lib/profile.py @@ -447,6 +447,7 @@ def runcall(*args, **kw): return func(*args, **kw) finally: sys.setprofile(None) + runcall.__text_signature__ = '($self, func, /, *args, **kw)' #****************************************************************** diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 3c825b00e5e4..c54cdb23c242 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -3782,6 +3782,17 @@ def test_builtins_have_signatures(self): with self.subTest(builtin=name): self.assertIsNone(obj.__text_signature__) + def test_python_function_override_signature(self): + def func(*args, **kwargs): + pass + func.__text_signature__ = '($self, a, b=1, *args, c, d=2, **kwargs)' + sig = inspect.signature(func) + self.assertIsNotNone(sig) + self.assertEqual(str(sig), '(self, /, a, b=1, *args, c, d=2, **kwargs)') + func.__text_signature__ = '($self, a, b=1, /, *args, c, d=2, **kwargs)' + sig = inspect.signature(func) + self.assertEqual(str(sig), '(self, a, b=1, /, *args, c, d=2, **kwargs)') + class NTimesUnwrappable: def __init__(self, n): diff --git a/Lib/trace.py b/Lib/trace.py index fd40fbae8505..63008a134a8a 100755 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -476,6 +476,7 @@ def runfunc(*args, **kw): if not self.donothing: sys.settrace(None) return result + runfunc.__text_signature__ = '($self, func, /, *args, **kw)' def file_module_function_of(self, frame): code = frame.f_code diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 8ff2546fc207..8e01c3dc7bbd 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -102,6 +102,7 @@ def addModuleCleanup(*args, **kwargs): args = tuple(args) _module_cleanups.append((function, args, kwargs)) +addModuleCleanup.__text_signature__ = '(function, /, *args, **kwargs)' def doModuleCleanups(): @@ -498,8 +499,8 @@ def addCleanup(*args, **kwargs): args = tuple(args) self._cleanups.append((function, args, kwargs)) + addCleanup.__text_signature__ = '($self, function, /, *args, **kwargs)' - @classmethod def addClassCleanup(*args, **kwargs): """Same as addCleanup, except the cleanup items are called even if setUpClass fails (unlike tearDownClass).""" @@ -514,6 +515,8 @@ def addClassCleanup(*args, **kwargs): args = tuple(args) cls._class_cleanups.append((function, args, kwargs)) + addClassCleanup.__text_signature__ = '($cls, function, /, *args, **kwargs)' + addClassCleanup = classmethod(addClassCleanup) def setUp(self): "Hook method for setting up the test fixture before exercising it." diff --git a/Lib/weakref.py b/Lib/weakref.py index 285c70792e0b..1eeb7b0a0b44 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -569,6 +569,7 @@ def __init__(*args, **kwargs): info.index = next(self._index_iter) self._registry[self] = info finalize._dirty = True + __init__.__text_signature__ = '($self, obj, func, /, *args, **kwargs)' def __call__(self, _=None): """If alive then mark as dead and return func(*args, **kwargs); diff --git a/Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst b/Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst new file mode 100644 index 000000000000..8374776e61eb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst @@ -0,0 +1,2 @@ +The signature of Python functions can now be overridden by specifying the +``__text_signature__`` attribute. From webhook-mailer at python.org Mon May 6 16:28:18 2019 From: webhook-mailer at python.org (Lisa Roach) Date: Mon, 06 May 2019 20:28:18 -0000 Subject: [Python-checkins] Fix rst formatting for several links in ssl documentation (GH-13133) Message-ID: https://github.com/python/cpython/commit/7b3a028c357dcc76b5aff7297e7c8052f897afb5 commit: 7b3a028c357dcc76b5aff7297e7c8052f897afb5 branch: master author: Toshio Kuratomi committer: Lisa Roach date: 2019-05-06T13:28:14-07:00 summary: Fix rst formatting for several links in ssl documentation (GH-13133) files: M Doc/library/ssl.rst diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 6a441983f888..20f572444716 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -665,7 +665,7 @@ Constants .. data:: PROTOCOL_SSLv23 - Alias for data:`PROTOCOL_TLS`. + Alias for :data:`PROTOCOL_TLS`. .. deprecated:: 3.6 @@ -1821,7 +1821,7 @@ to speed up repeated connections from the same clients. .. attribute:: SSLContext.sslsocket_class - The return type of :meth:`SSLContext.wrap_sockets`, defaults to + The return type of :meth:`SSLContext.wrap_socket`, defaults to :class:`SSLSocket`. The attribute can be overridden on instance of class in order to return a custom subclass of :class:`SSLSocket`. @@ -1831,7 +1831,7 @@ to speed up repeated connections from the same clients. server_hostname=None, session=None) Wrap the BIO objects *incoming* and *outgoing* and return an instance of - attr:`SSLContext.sslobject_class` (default :class:`SSLObject`). The SSL + :attr:`SSLContext.sslobject_class` (default :class:`SSLObject`). The SSL routines will read input data from the incoming BIO and write data to the outgoing BIO. From webhook-mailer at python.org Mon May 6 16:55:33 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 May 2019 20:55:33 -0000 Subject: [Python-checkins] [3.7] bpo-36766: Typos in docs and code comments (GH-13116). (GH-13136) Message-ID: https://github.com/python/cpython/commit/b2d29bfa5be5a0794c7c69078c43953967fcacf4 commit: b2d29bfa5be5a0794c7c69078c43953967fcacf4 branch: 3.7 author: penguindustin committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-06T13:55:19-07:00 summary: [3.7] bpo-36766: Typos in docs and code comments (GH-13116). (GH-13136) (cherry picked from commit 964663089547ca110199e23867b46b07ff4be88c) Co-authored-by: penguindustin https://bugs.python.org/issue36766 files: M Doc/library/email.generator.rst M Doc/library/pyclbr.rst M Lib/idlelib/configdialog.py M Lib/idlelib/help.html M Lib/idlelib/help.py M Lib/idlelib/idle_test/test_config.py M Lib/lib2to3/pgen2/tokenize.py M Lib/multiprocessing/resource_sharer.py M Lib/pathlib.py M Lib/platform.py M Lib/pstats.py M Lib/test/datetimetester.py M Lib/test/pickletester.py M Lib/test/support/__init__.py M Lib/test/test_dataclasses.py M Lib/test/test_importlib/test_lazy.py M Lib/test/test_random.py M Lib/test/test_ssl.py M Lib/test/test_tools/test_i18n.py M Lib/tokenize.py M Lib/turtle.py diff --git a/Doc/library/email.generator.rst b/Doc/library/email.generator.rst index 2575a5130070..c825aa1af0d3 100644 --- a/Doc/library/email.generator.rst +++ b/Doc/library/email.generator.rst @@ -184,7 +184,7 @@ to be using :class:`BytesGenerator`, and not :class:`Generator`. (This is required because strings cannot represent non-ASCII bytes.) Convert any bytes with the high bit set as needed using an ASCII-compatible :mailheader:`Content-Transfer-Encoding`. That is, - transform parts with non-ASCII :mailheader:`Cotnent-Transfer-Encoding` + transform parts with non-ASCII :mailheader:`Content-Transfer-Encoding` (:mailheader:`Content-Transfer-Encoding: 8bit`) to an ASCII compatible :mailheader:`Content-Transfer-Encoding`, and encode RFC-invalid non-ASCII bytes in headers using the MIME ``unknown-8bit`` character set, thus diff --git a/Doc/library/pyclbr.rst b/Doc/library/pyclbr.rst index a70c8df6a7b1..b80a2faed9b4 100644 --- a/Doc/library/pyclbr.rst +++ b/Doc/library/pyclbr.rst @@ -44,7 +44,7 @@ modules. .. versionadded:: 3.7 Descriptors for nested definitions. They are accessed through the - new children attibute. Each has a new parent attribute. + new children attribute. Each has a new parent attribute. The descriptors returned by these functions are instances of Function and Class classes. Users are not expected to create instances diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 31520a3b0d1e..4aaec1321f7d 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -2225,7 +2225,7 @@ def detach(self): 'General': ''' General: -AutoComplete: Popupwait is milleseconds to wait after key char, without +AutoComplete: Popupwait is milliseconds to wait after key char, without cursor movement, before popping up completion box. Key char is '.' after identifier or a '/' (or '\\' on Windows) within a string. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 7e743e6d8137..ba44331e87b2 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -721,7 +721,7 @@

Developing tkinter applicationsroot = tk.Tk() in standard Python and nothing appears. Enter the same in IDLE and a tk window appears. In standard Python, one must also enter root.update() to see the window. IDLE does the equivalent in the -background, about 20 times a second, which is about every 50 milleseconds. +background, about 20 times a second, which is about every 50 milliseconds. Next enter b = tk.Button(root, text='button'); b.pack(). Again, nothing visibly changes in standard Python until one enters root.update().

Most tkinter programs run root.mainloop(), which usually does not diff --git a/Lib/idlelib/help.py b/Lib/idlelib/help.py index 0603ede822ba..652444a7f149 100644 --- a/Lib/idlelib/help.py +++ b/Lib/idlelib/help.py @@ -2,7 +2,7 @@ Contents are subject to revision at any time, without notice. -Help => About IDLE: diplay About Idle dialog +Help => About IDLE: display About Idle dialog diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py index 7e2c1fd2958c..255210df7d96 100644 --- a/Lib/idlelib/idle_test/test_config.py +++ b/Lib/idlelib/idle_test/test_config.py @@ -521,7 +521,7 @@ def test_get_current_keyset(self): def test_get_keyset(self): conf = self.mock_config() - # Conflic with key set, should be disable to '' + # Conflict with key set, should be disable to '' conf.defaultCfg['extensions'].add_section('Foobar') conf.defaultCfg['extensions'].add_section('Foobar_cfgBindings') conf.defaultCfg['extensions'].set('Foobar', 'enable', 'True') diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py index c07b34f7c645..279d322971da 100644 --- a/Lib/lib2to3/pgen2/tokenize.py +++ b/Lib/lib2to3/pgen2/tokenize.py @@ -321,7 +321,7 @@ def untokenize(iterable): Round-trip invariant for full input: Untokenized source will match input source exactly - Round-trip invariant for limited intput: + Round-trip invariant for limited input: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) diff --git a/Lib/multiprocessing/resource_sharer.py b/Lib/multiprocessing/resource_sharer.py index 6d99da102ffc..c8f18ea9aecc 100644 --- a/Lib/multiprocessing/resource_sharer.py +++ b/Lib/multiprocessing/resource_sharer.py @@ -59,7 +59,7 @@ def detach(self): class _ResourceSharer(object): - '''Manager for resouces using background thread.''' + '''Manager for resources using background thread.''' def __init__(self): self._key = 0 self._cache = {} diff --git a/Lib/pathlib.py b/Lib/pathlib.py index dd6a83f715f8..e6e718166283 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -34,7 +34,7 @@ # Internals # -# EBADF - guard agains macOS `stat` throwing EBADF +# EBADF - guard against macOS `stat` throwing EBADF _IGNORED_ERROS = (ENOENT, ENOTDIR, EBADF) _IGNORED_WINERRORS = ( diff --git a/Lib/platform.py b/Lib/platform.py index 8ed2807df109..6ab06b58321e 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -72,7 +72,7 @@ # type information # 0.4.0 - added win32_ver() and modified the platform() output for WinXX # 0.3.4 - fixed a bug in _follow_symlinks() -# 0.3.3 - fixed popen() and "file" command invokation bugs +# 0.3.3 - fixed popen() and "file" command invocation bugs # 0.3.2 - added architecture() API and support for it in platform() # 0.3.1 - fixed syscmd_ver() RE to support Windows NT # 0.3.0 - added system alias support diff --git a/Lib/pstats.py b/Lib/pstats.py index ded5ae59f7da..b7649ebc6f1c 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -509,7 +509,7 @@ def func_std_string(func_name): # match what old profile produced return "%s:%d(%s)" % func_name #************************************************************************** -# The following functions combine statists for pairs functions. +# The following functions combine statistics for pairs functions. # The bulk of the processing involves correctly handling "call" lists, # such as callers and callees. #************************************************************************** diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index d729c7efd52f..b9bf49476f16 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -3344,7 +3344,7 @@ def utcoffset(self, t): self.assertEqual(got, expected) # However, if they're different members, uctoffset is not ignored. - # Note that a time can't actually have an operand-depedent offset, + # Note that a time can't actually have an operand-dependent offset, # though (and time.utcoffset() passes None to tzinfo.utcoffset()), # so skip this test for time. if cls is not time: diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index 293393fe3713..5540d0015ed9 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -2223,7 +2223,7 @@ def remove_frames(pickled, keep_frame=None): frame_size = self.FRAME_SIZE_TARGET num_frames = 20 - # Large byte objects (dict values) intermitted with small objects + # Large byte objects (dict values) intermittent with small objects # (dict keys) obj = {i: bytes([i]) * frame_size for i in range(num_frames)} diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index a7be4982e001..87bfa9f54627 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -987,7 +987,7 @@ def temp_dir(path=None, quiet=False): yield path finally: # In case the process forks, let only the parent remove the - # directory. The child has a diffent process id. (bpo-30028) + # directory. The child has a different process id. (bpo-30028) if dir_created and pid == os.getpid(): rmtree(path) diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 9c83459f09e7..a2c7ceea9da2 100755 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -1458,7 +1458,7 @@ class C: } ) - # Make sure that the returned dicts are actuall OrderedDicts. + # Make sure that the returned dicts are actually OrderedDicts. self.assertIs(type(d), OrderedDict) self.assertIs(type(d['y'][1]), OrderedDict) diff --git a/Lib/test/test_importlib/test_lazy.py b/Lib/test/test_importlib/test_lazy.py index ffd8dc6cb041..28608e95d060 100644 --- a/Lib/test/test_importlib/test_lazy.py +++ b/Lib/test/test_importlib/test_lazy.py @@ -56,7 +56,7 @@ class LazyLoaderTests(unittest.TestCase): def test_init(self): with self.assertRaises(TypeError): - # Classes that dono't define exec_module() trigger TypeError. + # Classes that don't define exec_module() trigger TypeError. util.LazyLoader(object) def new_module(self, source_code=None): diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index cbf3e41b94a2..f0822cddec86 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -707,7 +707,7 @@ def test_choices_algorithms(self): c = self.gen.choices(range(n), cum_weights=range(1, n+1), k=10000) self.assertEqual(a, c) - # Amerian Roulette + # American Roulette population = ['Red', 'Black', 'Green'] weights = [18, 18, 2] cum_weights = [18, 36, 38] diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 8eab447415f7..422d6f2f445a 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -4365,7 +4365,7 @@ def test_pha_optional_nocert(self): self.assertEqual(s.recv(1024), b'FALSE\n') s.write(b'PHA') self.assertEqual(s.recv(1024), b'OK\n') - # optional doens't fail when client does not have a cert + # optional doesn't fail when client does not have a cert s.write(b'HASCERT') self.assertEqual(s.recv(1024), b'FALSE\n') diff --git a/Lib/test/test_tools/test_i18n.py b/Lib/test/test_tools/test_i18n.py index 8b2b90d6142b..42e20f8f7716 100644 --- a/Lib/test/test_tools/test_i18n.py +++ b/Lib/test/test_tools/test_i18n.py @@ -211,7 +211,7 @@ def foo3(bar: 'func'=lambda x: x) -> {1: 2}: self.assertIn('doc3', msgids) def test_classdocstring_early_colon(self): - """ Test docstring extraction for a class with colons occuring within + """ Test docstring extraction for a class with colons occurring within the parentheses. """ msgids = self.extract_docstrings_from_str(dedent('''\ diff --git a/Lib/tokenize.py b/Lib/tokenize.py index 0eccc9b08d44..8305bf9a4c68 100644 --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -131,7 +131,7 @@ def maybe(*choices): return group(*choices) + '?' # Return the empty string, plus all of the valid string prefixes. def _all_string_prefixes(): # The valid string prefixes. Only contain the lower case versions, - # and don't contain any permuations (include 'fr', but not + # and don't contain any permutations (include 'fr', but not # 'rf'). The various permutations will be generated. _valid_string_prefixes = ['b', 'r', 'u', 'f', 'br', 'fr'] # if we add binary f-strings, add: ['fb', 'fbr'] diff --git a/Lib/turtle.py b/Lib/turtle.py index 47a94f2a4702..044d91cf6d83 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -1568,7 +1568,7 @@ def degrees(self, fullcircle=360.0): fullcircle - a number Set angle measurement units, i. e. set number - of 'degrees' for a full circle. Dafault value is + of 'degrees' for a full circle. Default value is 360 degrees. Example (for a Turtle instance named turtle): From webhook-mailer at python.org Mon May 6 17:54:30 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Mon, 06 May 2019 21:54:30 -0000 Subject: [Python-checkins] bpo-35925: Skip SSL tests that fail due to weak external certs. (GH-13124) Message-ID: https://github.com/python/cpython/commit/2cc0223f43a1ffd59c887a73e2b0ce5202f3be90 commit: 2cc0223f43a1ffd59c887a73e2b0ce5202f3be90 branch: master author: Gregory P. Smith committer: GitHub date: 2019-05-06T17:54:06-04:00 summary: bpo-35925: Skip SSL tests that fail due to weak external certs. (GH-13124) Modern Linux distros such as Debian Buster have default OpenSSL system configurations that reject connections to servers with weak certificates by default. This causes our test suite run with external networking resources enabled to skip these tests when they encounter such a failure. Fixing the network servers is a separate issue. files: A Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst M Lib/test/test_httplib.py M Lib/test/test_nntplib.py diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 65914616c7b5..968cbd86a1e4 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -4,6 +4,7 @@ import itertools import os import array +import re import socket import threading @@ -1619,14 +1620,30 @@ def test_networked_good_cert(self): # We feed the server's cert as a validating cert import ssl support.requires('network') - with support.transient_internet('self-signed.pythontest.net'): + selfsigned_pythontestdotnet = 'self-signed.pythontest.net' + with support.transient_internet(selfsigned_pythontestdotnet): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) self.assertEqual(context.verify_mode, ssl.CERT_REQUIRED) self.assertEqual(context.check_hostname, True) context.load_verify_locations(CERT_selfsigned_pythontestdotnet) - h = client.HTTPSConnection('self-signed.pythontest.net', 443, context=context) - h.request('GET', '/') - resp = h.getresponse() + try: + h = client.HTTPSConnection(selfsigned_pythontestdotnet, 443, + context=context) + h.request('GET', '/') + resp = h.getresponse() + except ssl.SSLError as ssl_err: + ssl_err_str = str(ssl_err) + # In the error message of [SSL: CERTIFICATE_VERIFY_FAILED] on + # modern Linux distros (Debian Buster, etc) default OpenSSL + # configurations it'll fail saying "key too weak" until we + # address https://bugs.python.org/issue36816 to use a proper + # key size on self-signed.pythontest.net. + if re.search(r'(?i)key.too.weak', ssl_err_str): + raise unittest.SkipTest( + f'Got {ssl_err_str} trying to connect ' + f'to {selfsigned_pythontestdotnet}. ' + 'See https://bugs.python.org/issue36816.') + raise server_string = resp.getheader('server') resp.close() h.close() diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index 8c1032b986bf..618b403bfb5b 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -6,6 +6,7 @@ import functools import contextlib import os.path +import re import threading from test import support @@ -21,6 +22,13 @@ TIMEOUT = 30 certfile = os.path.join(os.path.dirname(__file__), 'keycert3.pem') +if ssl is not None: + SSLError = ssl.SSLError +else: + class SSLError(Exception): + """Non-existent exception class when we lack SSL support.""" + reason = "This will never be raised." + # TODO: # - test the `file` arg to more commands # - test error conditions @@ -261,14 +269,21 @@ def is_connected(): return False return True - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: - self.assertTrue(is_connected()) - self.assertTrue(server.help()) - self.assertFalse(is_connected()) - - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: - server.quit() - self.assertFalse(is_connected()) + try: + with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + self.assertTrue(is_connected()) + self.assertTrue(server.help()) + self.assertFalse(is_connected()) + + with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + server.quit() + self.assertFalse(is_connected()) + except SSLError as ssl_err: + # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" + if re.search(r'(?i)KEY.TOO.SMALL', ssl_err.reason): + raise unittest.SkipTest(f"Got {ssl_err} connecting " + f"to {self.NNTP_HOST!r}") + raise NetworkedNNTPTestsMixin.wrap_methods() @@ -294,6 +309,12 @@ def setUpClass(cls): try: cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) + except SSLError as ssl_err: + # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" + if re.search(r'(?i)KEY.TOO.SMALL', ssl_err.reason): + raise unittest.SkipTest(f"{cls} got {ssl_err} connecting " + f"to {cls.NNTP_HOST!r}") + raise except EOF_ERRORS: raise unittest.SkipTest(f"{cls} got EOF error on connecting " f"to {cls.NNTP_HOST!r}") diff --git a/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst new file mode 100644 index 000000000000..ad8cc8fc61a0 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst @@ -0,0 +1 @@ +Skip httplib and nntplib networking tests when they would otherwise fail due to a modern OS or distro with a default OpenSSL policy of rejecting connections to servers with weak certificates. From webhook-mailer at python.org Mon May 6 22:52:20 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Tue, 07 May 2019 02:52:20 -0000 Subject: [Python-checkins] Forbid creating of stream objects outside of asyncio (#13101) Message-ID: https://github.com/python/cpython/commit/ad4ed872415d00fcdfaa52a08108ec752b115000 commit: ad4ed872415d00fcdfaa52a08108ec752b115000 branch: master author: Andrew Svetlov committer: GitHub date: 2019-05-06T22:52:11-04:00 summary: Forbid creating of stream objects outside of asyncio (#13101) files: A Misc/NEWS.d/next/Library/2019-05-05-16-14-38.bpo-36806.rAzF-x.rst M Lib/asyncio/streams.py M Lib/asyncio/subprocess.py M Lib/test/test_asyncio/test_streams.py M Lib/test/test_asyncio/test_subprocess.py diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 33fc303a6ffc..c9b1f32813d4 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -4,6 +4,7 @@ import socket import sys +import warnings import weakref if hasattr(socket, 'AF_UNIX'): @@ -42,11 +43,14 @@ """ if loop is None: loop = events.get_event_loop() - reader = StreamReader(limit=limit, loop=loop) - protocol = StreamReaderProtocol(reader, loop=loop) + reader = StreamReader(limit=limit, loop=loop, + _asyncio_internal=True) + protocol = StreamReaderProtocol(reader, loop=loop, + _asyncio_internal=True) transport, _ = await loop.create_connection( lambda: protocol, host, port, **kwds) - writer = StreamWriter(transport, protocol, reader, loop) + writer = StreamWriter(transport, protocol, reader, loop, + _asyncio_internal=True) return reader, writer @@ -77,9 +81,11 @@ loop = events.get_event_loop() def factory(): - reader = StreamReader(limit=limit, loop=loop) + reader = StreamReader(limit=limit, loop=loop, + _asyncio_internal=True) protocol = StreamReaderProtocol(reader, client_connected_cb, - loop=loop) + loop=loop, + _asyncio_internal=True) return protocol return await loop.create_server(factory, host, port, **kwds) @@ -93,11 +99,14 @@ def factory(): """Similar to `open_connection` but works with UNIX Domain Sockets.""" if loop is None: loop = events.get_event_loop() - reader = StreamReader(limit=limit, loop=loop) - protocol = StreamReaderProtocol(reader, loop=loop) + reader = StreamReader(limit=limit, loop=loop, + _asyncio_internal=True) + protocol = StreamReaderProtocol(reader, loop=loop, + _asyncio_internal=True) transport, _ = await loop.create_unix_connection( lambda: protocol, path, **kwds) - writer = StreamWriter(transport, protocol, reader, loop) + writer = StreamWriter(transport, protocol, reader, loop, + _asyncio_internal=True) return reader, writer async def start_unix_server(client_connected_cb, path=None, *, @@ -107,9 +116,11 @@ def factory(): loop = events.get_event_loop() def factory(): - reader = StreamReader(limit=limit, loop=loop) + reader = StreamReader(limit=limit, loop=loop, + _asyncio_internal=True) protocol = StreamReaderProtocol(reader, client_connected_cb, - loop=loop) + loop=loop, + _asyncio_internal=True) return protocol return await loop.create_unix_server(factory, path, **kwds) @@ -125,11 +136,20 @@ class FlowControlMixin(protocols.Protocol): StreamWriter.drain() must wait for _drain_helper() coroutine. """ - def __init__(self, loop=None): + def __init__(self, loop=None, *, _asyncio_internal=False): if loop is None: self._loop = events.get_event_loop() else: self._loop = loop + if not _asyncio_internal: + # NOTE: + # Avoid inheritance from FlowControlMixin + # Copy-paste the code to your project + # if you need flow control helpers + warnings.warn(f"{self.__class__} should be instaniated " + "by asyncio internals only, " + "please avoid its creation from user code", + DeprecationWarning) self._paused = False self._drain_waiter = None self._connection_lost = False @@ -191,8 +211,9 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): _source_traceback = None - def __init__(self, stream_reader, client_connected_cb=None, loop=None): - super().__init__(loop=loop) + def __init__(self, stream_reader, client_connected_cb=None, loop=None, + *, _asyncio_internal=False): + super().__init__(loop=loop, _asyncio_internal=_asyncio_internal) if stream_reader is not None: self._stream_reader_wr = weakref.ref(stream_reader, self._on_reader_gc) @@ -253,7 +274,8 @@ def connection_made(self, transport): if self._client_connected_cb is not None: self._stream_writer = StreamWriter(transport, self, reader, - self._loop) + self._loop, + _asyncio_internal=True) res = self._client_connected_cb(reader, self._stream_writer) if coroutines.iscoroutine(res): @@ -311,7 +333,13 @@ class StreamWriter: directly. """ - def __init__(self, transport, protocol, reader, loop): + def __init__(self, transport, protocol, reader, loop, + *, _asyncio_internal=False): + if not _asyncio_internal: + warnings.warn(f"{self.__class__} should be instaniated " + "by asyncio internals only, " + "please avoid its creation from user code", + DeprecationWarning) self._transport = transport self._protocol = protocol # drain() expects that the reader has an exception() method @@ -388,7 +416,14 @@ class StreamReader: _source_traceback = None - def __init__(self, limit=_DEFAULT_LIMIT, loop=None): + def __init__(self, limit=_DEFAULT_LIMIT, loop=None, + *, _asyncio_internal=False): + if not _asyncio_internal: + warnings.warn(f"{self.__class__} should be instaniated " + "by asyncio internals only, " + "please avoid its creation from user code", + DeprecationWarning) + # The line length limit is a security feature; # it also doubles as half the buffer limit. diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index 90fc00de8339..fa58e1e85862 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -1,6 +1,7 @@ __all__ = 'create_subprocess_exec', 'create_subprocess_shell' import subprocess +import warnings from . import events from . import protocols @@ -18,8 +19,8 @@ class SubprocessStreamProtocol(streams.FlowControlMixin, protocols.SubprocessProtocol): """Like StreamReaderProtocol, but for a subprocess.""" - def __init__(self, limit, loop): - super().__init__(loop=loop) + def __init__(self, limit, loop, *, _asyncio_internal=False): + super().__init__(loop=loop, _asyncio_internal=_asyncio_internal) self._limit = limit self.stdin = self.stdout = self.stderr = None self._transport = None @@ -42,14 +43,16 @@ def connection_made(self, transport): stdout_transport = transport.get_pipe_transport(1) if stdout_transport is not None: self.stdout = streams.StreamReader(limit=self._limit, - loop=self._loop) + loop=self._loop, + _asyncio_internal=True) self.stdout.set_transport(stdout_transport) self._pipe_fds.append(1) stderr_transport = transport.get_pipe_transport(2) if stderr_transport is not None: self.stderr = streams.StreamReader(limit=self._limit, - loop=self._loop) + loop=self._loop, + _asyncio_internal=True) self.stderr.set_transport(stderr_transport) self._pipe_fds.append(2) @@ -58,7 +61,8 @@ def connection_made(self, transport): self.stdin = streams.StreamWriter(stdin_transport, protocol=self, reader=None, - loop=self._loop) + loop=self._loop, + _asyncio_internal=True) def pipe_data_received(self, fd, data): if fd == 1: @@ -104,7 +108,13 @@ def _maybe_close_transport(self): class Process: - def __init__(self, transport, protocol, loop): + def __init__(self, transport, protocol, loop, *, _asyncio_internal=False): + if not _asyncio_internal: + warnings.warn(f"{self.__class__} should be instaniated " + "by asyncio internals only, " + "please avoid its creation from user code", + DeprecationWarning) + self._transport = transport self._protocol = protocol self._loop = loop @@ -195,12 +205,13 @@ def kill(self): if loop is None: loop = events.get_event_loop() protocol_factory = lambda: SubprocessStreamProtocol(limit=limit, - loop=loop) + loop=loop, + _asyncio_internal=True) transport, protocol = await loop.subprocess_shell( protocol_factory, cmd, stdin=stdin, stdout=stdout, stderr=stderr, **kwds) - return Process(transport, protocol, loop) + return Process(transport, protocol, loop, _asyncio_internal=True) async def create_subprocess_exec(program, *args, stdin=None, stdout=None, @@ -209,10 +220,11 @@ def kill(self): if loop is None: loop = events.get_event_loop() protocol_factory = lambda: SubprocessStreamProtocol(limit=limit, - loop=loop) + loop=loop, + _asyncio_internal=True) transport, protocol = await loop.subprocess_exec( protocol_factory, program, *args, stdin=stdin, stdout=stdout, stderr=stderr, **kwds) - return Process(transport, protocol, loop) + return Process(transport, protocol, loop, _asyncio_internal=True) diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 630f91dbf478..c1cc9d7fa0e9 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -42,7 +42,7 @@ def tearDown(self): @mock.patch('asyncio.streams.events') def test_ctor_global_loop(self, m_events): - stream = asyncio.StreamReader() + stream = asyncio.StreamReader(_asyncio_internal=True) self.assertIs(stream._loop, m_events.get_event_loop.return_value) def _basetest_open_connection(self, open_connection_fut): @@ -135,20 +135,23 @@ def test_open_unix_connection_error(self): self._basetest_open_connection_error(conn_fut) def test_feed_empty_data(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'') self.assertEqual(b'', stream._buffer) def test_feed_nonempty_data(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA) self.assertEqual(self.DATA, stream._buffer) def test_read_zero(self): # Read zero bytes. - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA) data = self.loop.run_until_complete(stream.read(0)) @@ -157,7 +160,8 @@ def test_read_zero(self): def test_read(self): # Read bytes. - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) read_task = asyncio.Task(stream.read(30), loop=self.loop) def cb(): @@ -170,7 +174,8 @@ def cb(): def test_read_line_breaks(self): # Read bytes without line breaks. - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'line1') stream.feed_data(b'line2') @@ -181,7 +186,8 @@ def test_read_line_breaks(self): def test_read_eof(self): # Read bytes, stop at eof. - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) read_task = asyncio.Task(stream.read(1024), loop=self.loop) def cb(): @@ -194,7 +200,8 @@ def cb(): def test_read_until_eof(self): # Read all bytes until eof. - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) read_task = asyncio.Task(stream.read(-1), loop=self.loop) def cb(): @@ -209,7 +216,8 @@ def cb(): self.assertEqual(b'', stream._buffer) def test_read_exception(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'line\n') data = self.loop.run_until_complete(stream.read(2)) @@ -221,13 +229,16 @@ def test_read_exception(self): def test_invalid_limit(self): with self.assertRaisesRegex(ValueError, 'imit'): - asyncio.StreamReader(limit=0, loop=self.loop) + asyncio.StreamReader(limit=0, loop=self.loop, + _asyncio_internal=True) with self.assertRaisesRegex(ValueError, 'imit'): - asyncio.StreamReader(limit=-1, loop=self.loop) + asyncio.StreamReader(limit=-1, loop=self.loop, + _asyncio_internal=True) def test_read_limit(self): - stream = asyncio.StreamReader(limit=3, loop=self.loop) + stream = asyncio.StreamReader(limit=3, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'chunk') data = self.loop.run_until_complete(stream.read(5)) self.assertEqual(b'chunk', data) @@ -236,7 +247,8 @@ def test_read_limit(self): def test_readline(self): # Read one line. 'readline' will need to wait for the data # to come from 'cb' - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'chunk1 ') read_task = asyncio.Task(stream.readline(), loop=self.loop) @@ -254,7 +266,8 @@ def test_readline_limit_with_existing_data(self): # Read one line. The data is in StreamReader's buffer # before the event loop is run. - stream = asyncio.StreamReader(limit=3, loop=self.loop) + stream = asyncio.StreamReader(limit=3, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'li') stream.feed_data(b'ne1\nline2\n') @@ -263,7 +276,8 @@ def test_readline_limit_with_existing_data(self): # The buffer should contain the remaining data after exception self.assertEqual(b'line2\n', stream._buffer) - stream = asyncio.StreamReader(limit=3, loop=self.loop) + stream = asyncio.StreamReader(limit=3, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'li') stream.feed_data(b'ne1') stream.feed_data(b'li') @@ -278,7 +292,8 @@ def test_readline_limit_with_existing_data(self): self.assertEqual(b'', stream._buffer) def test_at_eof(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) self.assertFalse(stream.at_eof()) stream.feed_data(b'some data\n') @@ -296,7 +311,8 @@ def test_readline_limit(self): # Read one line. StreamReaders are fed with data after # their 'readline' methods are called. - stream = asyncio.StreamReader(limit=7, loop=self.loop) + stream = asyncio.StreamReader(limit=7, loop=self.loop, + _asyncio_internal=True) def cb(): stream.feed_data(b'chunk1') stream.feed_data(b'chunk2') @@ -310,7 +326,8 @@ def cb(): # a ValueError it should be empty. self.assertEqual(b'', stream._buffer) - stream = asyncio.StreamReader(limit=7, loop=self.loop) + stream = asyncio.StreamReader(limit=7, loop=self.loop, + _asyncio_internal=True) def cb(): stream.feed_data(b'chunk1') stream.feed_data(b'chunk2\n') @@ -323,7 +340,8 @@ def cb(): self.assertEqual(b'chunk3\n', stream._buffer) # check strictness of the limit - stream = asyncio.StreamReader(limit=7, loop=self.loop) + stream = asyncio.StreamReader(limit=7, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'1234567\n') line = self.loop.run_until_complete(stream.readline()) self.assertEqual(b'1234567\n', line) @@ -342,7 +360,8 @@ def cb(): def test_readline_nolimit_nowait(self): # All needed data for the first 'readline' call will be # in the buffer. - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA[:6]) stream.feed_data(self.DATA[6:]) @@ -352,7 +371,8 @@ def test_readline_nolimit_nowait(self): self.assertEqual(b'line2\nline3\n', stream._buffer) def test_readline_eof(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'some data') stream.feed_eof() @@ -360,14 +380,16 @@ def test_readline_eof(self): self.assertEqual(b'some data', line) def test_readline_empty_eof(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_eof() line = self.loop.run_until_complete(stream.readline()) self.assertEqual(b'', line) def test_readline_read_byte_count(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA) self.loop.run_until_complete(stream.readline()) @@ -378,7 +400,8 @@ def test_readline_read_byte_count(self): self.assertEqual(b'ine3\n', stream._buffer) def test_readline_exception(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'line\n') data = self.loop.run_until_complete(stream.readline()) @@ -390,12 +413,14 @@ def test_readline_exception(self): self.assertEqual(b'', stream._buffer) def test_readuntil_separator(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) with self.assertRaisesRegex(ValueError, 'Separator should be'): self.loop.run_until_complete(stream.readuntil(separator=b'')) def test_readuntil_multi_chunks(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'lineAAA') data = self.loop.run_until_complete(stream.readuntil(separator=b'AAA')) @@ -413,7 +438,8 @@ def test_readuntil_multi_chunks(self): self.assertEqual(b'xxx', stream._buffer) def test_readuntil_multi_chunks_1(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'QWEaa') stream.feed_data(b'XYaa') @@ -448,7 +474,8 @@ def test_readuntil_multi_chunks_1(self): self.assertEqual(b'', stream._buffer) def test_readuntil_eof(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'some dataAA') stream.feed_eof() @@ -459,7 +486,8 @@ def test_readuntil_eof(self): self.assertEqual(b'', stream._buffer) def test_readuntil_limit_found_sep(self): - stream = asyncio.StreamReader(loop=self.loop, limit=3) + stream = asyncio.StreamReader(loop=self.loop, limit=3, + _asyncio_internal=True) stream.feed_data(b'some dataAA') with self.assertRaisesRegex(asyncio.LimitOverrunError, @@ -477,7 +505,8 @@ def test_readuntil_limit_found_sep(self): def test_readexactly_zero_or_less(self): # Read exact number of bytes (zero or less). - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA) data = self.loop.run_until_complete(stream.readexactly(0)) @@ -490,7 +519,8 @@ def test_readexactly_zero_or_less(self): def test_readexactly(self): # Read exact number of bytes. - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) n = 2 * len(self.DATA) read_task = asyncio.Task(stream.readexactly(n), loop=self.loop) @@ -506,7 +536,8 @@ def cb(): self.assertEqual(self.DATA, stream._buffer) def test_readexactly_limit(self): - stream = asyncio.StreamReader(limit=3, loop=self.loop) + stream = asyncio.StreamReader(limit=3, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'chunk') data = self.loop.run_until_complete(stream.readexactly(5)) self.assertEqual(b'chunk', data) @@ -514,7 +545,8 @@ def test_readexactly_limit(self): def test_readexactly_eof(self): # Read exact number of bytes (eof). - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) n = 2 * len(self.DATA) read_task = asyncio.Task(stream.readexactly(n), loop=self.loop) @@ -532,7 +564,8 @@ def cb(): self.assertEqual(b'', stream._buffer) def test_readexactly_exception(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'line\n') data = self.loop.run_until_complete(stream.readexactly(2)) @@ -543,7 +576,8 @@ def test_readexactly_exception(self): ValueError, self.loop.run_until_complete, stream.readexactly(2)) def test_exception(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) self.assertIsNone(stream.exception()) exc = ValueError() @@ -551,7 +585,8 @@ def test_exception(self): self.assertIs(stream.exception(), exc) def test_exception_waiter(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) @asyncio.coroutine def set_err(): @@ -565,7 +600,8 @@ def set_err(): self.assertRaises(ValueError, t1.result) def test_exception_cancel(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) t = asyncio.Task(stream.readline(), loop=self.loop) test_utils.run_briefly(self.loop) @@ -742,8 +778,10 @@ def test_read_all_from_pipe_reader(self): args = [sys.executable, '-c', code, str(wfd)] pipe = open(rfd, 'rb', 0) - reader = asyncio.StreamReader(loop=self.loop, limit=1) - protocol = asyncio.StreamReaderProtocol(reader, loop=self.loop) + reader = asyncio.StreamReader(loop=self.loop, limit=1, + _asyncio_internal=True) + protocol = asyncio.StreamReaderProtocol(reader, loop=self.loop, + _asyncio_internal=True) transport, _ = self.loop.run_until_complete( self.loop.connect_read_pipe(lambda: protocol, pipe)) @@ -769,7 +807,7 @@ def test_streamreader_constructor(self): # asyncio issue #184: Ensure that StreamReaderProtocol constructor # retrieves the current loop if the loop parameter is not set - reader = asyncio.StreamReader() + reader = asyncio.StreamReader(_asyncio_internal=True) self.assertIs(reader._loop, self.loop) def test_streamreaderprotocol_constructor(self): @@ -779,7 +817,7 @@ def test_streamreaderprotocol_constructor(self): # asyncio issue #184: Ensure that StreamReaderProtocol constructor # retrieves the current loop if the loop parameter is not set reader = mock.Mock() - protocol = asyncio.StreamReaderProtocol(reader) + protocol = asyncio.StreamReaderProtocol(reader, _asyncio_internal=True) self.assertIs(protocol._loop, self.loop) def test_drain_raises(self): @@ -824,32 +862,38 @@ def server(): thread.join() def test___repr__(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) self.assertEqual("", repr(stream)) def test___repr__nondefault_limit(self): - stream = asyncio.StreamReader(loop=self.loop, limit=123) + stream = asyncio.StreamReader(loop=self.loop, limit=123, + _asyncio_internal=True) self.assertEqual("", repr(stream)) def test___repr__eof(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_eof() self.assertEqual("", repr(stream)) def test___repr__data(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'data') self.assertEqual("", repr(stream)) def test___repr__exception(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) exc = RuntimeError() stream.set_exception(exc) self.assertEqual("", repr(stream)) def test___repr__waiter(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream._waiter = asyncio.Future(loop=self.loop) self.assertRegex( repr(stream), @@ -860,7 +904,8 @@ def test___repr__waiter(self): self.assertEqual("", repr(stream)) def test___repr__transport(self): - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) stream._transport = mock.Mock() stream._transport.__repr__ = mock.Mock() stream._transport.__repr__.return_value = "" @@ -947,8 +992,10 @@ def test_del_stream_before_connection_made(self): self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: - rd = asyncio.StreamReader(loop=self.loop) - pr = asyncio.StreamReaderProtocol(rd, loop=self.loop) + rd = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) + pr = asyncio.StreamReaderProtocol(rd, loop=self.loop, + _asyncio_internal=True) del rd gc.collect() tr, _ = self.loop.run_until_complete( @@ -1005,6 +1052,25 @@ def test_eof_feed_when_closing_writer(self): self.assertEqual(messages, []) + def test_stream_reader_create_warning(self): + with self.assertWarns(DeprecationWarning): + asyncio.StreamReader(loop=self.loop) + + def test_stream_reader_protocol_create_warning(self): + reader = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) + with self.assertWarns(DeprecationWarning): + asyncio.StreamReaderProtocol(reader, loop=self.loop) + + def test_stream_writer_create_warning(self): + reader = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) + proto = asyncio.StreamReaderProtocol(reader, loop=self.loop, + _asyncio_internal=True) + with self.assertWarns(DeprecationWarning): + asyncio.StreamWriter('transport', proto, reader, self.loop) + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index a5bdb8eca517..3908aabf5a13 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -510,6 +510,18 @@ def test_read_stdout_after_process_exit(self): self.loop.run_until_complete(execute()) + def test_subprocess_protocol_create_warning(self): + with self.assertWarns(DeprecationWarning): + subprocess.SubprocessStreamProtocol(limit=10, loop=self.loop) + + def test_process_create_warning(self): + proto = subprocess.SubprocessStreamProtocol(limit=10, loop=self.loop, + _asyncio_internal=True) + transp = mock.Mock() + + with self.assertWarns(DeprecationWarning): + subprocess.Process(transp, proto, loop=self.loop) + if sys.platform != 'win32': # Unix diff --git a/Misc/NEWS.d/next/Library/2019-05-05-16-14-38.bpo-36806.rAzF-x.rst b/Misc/NEWS.d/next/Library/2019-05-05-16-14-38.bpo-36806.rAzF-x.rst new file mode 100644 index 000000000000..7e3ff6cf0e14 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-05-16-14-38.bpo-36806.rAzF-x.rst @@ -0,0 +1,2 @@ +Forbid creation of asyncio stream objects like StreamReader, StreamWriter, +Process, and their protocols outside of asyncio package. From webhook-mailer at python.org Mon May 6 23:51:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 03:51:32 -0000 Subject: [Python-checkins] bpo-35925: Skip SSL tests that fail due to weak external certs. (GH-13124) Message-ID: https://github.com/python/cpython/commit/ffa29b5aca1aaeae46af2582c401ef0ed20d4153 commit: ffa29b5aca1aaeae46af2582c401ef0ed20d4153 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-06T20:51:25-07:00 summary: bpo-35925: Skip SSL tests that fail due to weak external certs. (GH-13124) Modern Linux distros such as Debian Buster have default OpenSSL system configurations that reject connections to servers with weak certificates by default. This causes our test suite run with external networking resources enabled to skip these tests when they encounter such a failure. Fixing the network servers is a separate issue. (cherry picked from commit 2cc0223f43a1ffd59c887a73e2b0ce5202f3be90) Co-authored-by: Gregory P. Smith files: A Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst M Lib/test/test_httplib.py M Lib/test/test_nntplib.py diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 4755f8b4b9de..49263a8a3a0d 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -4,6 +4,7 @@ import itertools import os import array +import re import socket import threading @@ -1622,14 +1623,30 @@ def test_networked_good_cert(self): # We feed the server's cert as a validating cert import ssl support.requires('network') - with support.transient_internet('self-signed.pythontest.net'): + selfsigned_pythontestdotnet = 'self-signed.pythontest.net' + with support.transient_internet(selfsigned_pythontestdotnet): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) self.assertEqual(context.verify_mode, ssl.CERT_REQUIRED) self.assertEqual(context.check_hostname, True) context.load_verify_locations(CERT_selfsigned_pythontestdotnet) - h = client.HTTPSConnection('self-signed.pythontest.net', 443, context=context) - h.request('GET', '/') - resp = h.getresponse() + try: + h = client.HTTPSConnection(selfsigned_pythontestdotnet, 443, + context=context) + h.request('GET', '/') + resp = h.getresponse() + except ssl.SSLError as ssl_err: + ssl_err_str = str(ssl_err) + # In the error message of [SSL: CERTIFICATE_VERIFY_FAILED] on + # modern Linux distros (Debian Buster, etc) default OpenSSL + # configurations it'll fail saying "key too weak" until we + # address https://bugs.python.org/issue36816 to use a proper + # key size on self-signed.pythontest.net. + if re.search(r'(?i)key.too.weak', ssl_err_str): + raise unittest.SkipTest( + f'Got {ssl_err_str} trying to connect ' + f'to {selfsigned_pythontestdotnet}. ' + 'See https://bugs.python.org/issue36816.') + raise server_string = resp.getheader('server') resp.close() h.close() diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index 8c1032b986bf..618b403bfb5b 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -6,6 +6,7 @@ import functools import contextlib import os.path +import re import threading from test import support @@ -21,6 +22,13 @@ TIMEOUT = 30 certfile = os.path.join(os.path.dirname(__file__), 'keycert3.pem') +if ssl is not None: + SSLError = ssl.SSLError +else: + class SSLError(Exception): + """Non-existent exception class when we lack SSL support.""" + reason = "This will never be raised." + # TODO: # - test the `file` arg to more commands # - test error conditions @@ -261,14 +269,21 @@ def is_connected(): return False return True - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: - self.assertTrue(is_connected()) - self.assertTrue(server.help()) - self.assertFalse(is_connected()) - - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: - server.quit() - self.assertFalse(is_connected()) + try: + with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + self.assertTrue(is_connected()) + self.assertTrue(server.help()) + self.assertFalse(is_connected()) + + with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + server.quit() + self.assertFalse(is_connected()) + except SSLError as ssl_err: + # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" + if re.search(r'(?i)KEY.TOO.SMALL', ssl_err.reason): + raise unittest.SkipTest(f"Got {ssl_err} connecting " + f"to {self.NNTP_HOST!r}") + raise NetworkedNNTPTestsMixin.wrap_methods() @@ -294,6 +309,12 @@ def setUpClass(cls): try: cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) + except SSLError as ssl_err: + # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" + if re.search(r'(?i)KEY.TOO.SMALL', ssl_err.reason): + raise unittest.SkipTest(f"{cls} got {ssl_err} connecting " + f"to {cls.NNTP_HOST!r}") + raise except EOF_ERRORS: raise unittest.SkipTest(f"{cls} got EOF error on connecting " f"to {cls.NNTP_HOST!r}") diff --git a/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst new file mode 100644 index 000000000000..ad8cc8fc61a0 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst @@ -0,0 +1 @@ +Skip httplib and nntplib networking tests when they would otherwise fail due to a modern OS or distro with a default OpenSSL policy of rejecting connections to servers with weak certificates. From webhook-mailer at python.org Tue May 7 06:48:52 2019 From: webhook-mailer at python.org (Chris Withers) Date: Tue, 07 May 2019 10:48:52 -0000 Subject: [Python-checkins] bpo-31855: unittest.mock.mock_open() results now respects the argument of read([size]) (GH-11521) Message-ID: https://github.com/python/cpython/commit/11a8832c98b3db78727312154dd1d3ba76d639ec commit: 11a8832c98b3db78727312154dd1d3ba76d639ec branch: master author: R?mi Lapeyre committer: Chris Withers date: 2019-05-07T11:48:36+01:00 summary: bpo-31855: unittest.mock.mock_open() results now respects the argument of read([size]) (GH-11521) unittest.mock.mock_open() results now respects the argument of read([size]) Co-Authored-By: remilapeyre files: A Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testwith.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 351aba5d44d7..1e8057d5f5bb 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -25,6 +25,7 @@ __version__ = '1.0' +import io import inspect import pprint import sys @@ -2318,25 +2319,12 @@ def __init__(self, spec, spec_set=False, parent=None, file_spec = None -def _iterate_read_data(read_data): - # Helper for mock_open: - # Retrieve lines from read_data via a generator so that separate calls to - # readline, read, and readlines are properly interleaved - sep = b'\n' if isinstance(read_data, bytes) else '\n' - data_as_list = [l + sep for l in read_data.split(sep)] - - if data_as_list[-1] == sep: - # If the last line ended in a newline, the list comprehension will have an - # extra entry that's just a newline. Remove this. - data_as_list = data_as_list[:-1] - else: - # If there wasn't an extra newline by itself, then the file being - # emulated doesn't have a newline to end the last line remove the - # newline that our naive format() added - data_as_list[-1] = data_as_list[-1][:-1] - for line in data_as_list: - yield line +def _to_stream(read_data): + if isinstance(read_data, bytes): + return io.BytesIO(read_data) + else: + return io.StringIO(read_data) def mock_open(mock=None, read_data=''): @@ -2351,20 +2339,23 @@ def mock_open(mock=None, read_data=''): `read_data` is a string for the `read`, `readline` and `readlines` of the file handle to return. This is an empty string by default. """ + _read_data = _to_stream(read_data) + _state = [_read_data, None] + def _readlines_side_effect(*args, **kwargs): if handle.readlines.return_value is not None: return handle.readlines.return_value - return list(_state[0]) + return _state[0].readlines(*args, **kwargs) def _read_side_effect(*args, **kwargs): if handle.read.return_value is not None: return handle.read.return_value - return type(read_data)().join(_state[0]) + return _state[0].read(*args, **kwargs) - def _readline_side_effect(): + def _readline_side_effect(*args, **kwargs): yield from _iter_side_effect() while True: - yield type(read_data)() + yield _state[0].readline(*args, **kwargs) def _iter_side_effect(): if handle.readline.return_value is not None: @@ -2384,8 +2375,6 @@ def _iter_side_effect(): handle = MagicMock(spec=file_spec) handle.__enter__.return_value = handle - _state = [_iterate_read_data(read_data), None] - handle.write.return_value = None handle.read.return_value = None handle.readline.return_value = None @@ -2398,7 +2387,7 @@ def _iter_side_effect(): handle.__iter__.side_effect = _iter_side_effect def reset_data(*args, **kwargs): - _state[0] = _iterate_read_data(read_data) + _state[0] = _to_stream(read_data) if handle.readline.side_effect == _state[1]: # Only reset the side effect if the user hasn't overridden it. _state[1] = _readline_side_effect() diff --git a/Lib/unittest/test/testmock/testwith.py b/Lib/unittest/test/testmock/testwith.py index 37100b8c1834..5172c222d97a 100644 --- a/Lib/unittest/test/testmock/testwith.py +++ b/Lib/unittest/test/testmock/testwith.py @@ -283,7 +283,12 @@ def test_mock_open_read_with_argument(self): # for mocks returned by mock_open some_data = 'foo\nbar\nbaz' mock = mock_open(read_data=some_data) - self.assertEqual(mock().read(10), some_data) + self.assertEqual(mock().read(10), some_data[:10]) + self.assertEqual(mock().read(10), some_data[:10]) + + f = mock() + self.assertEqual(f.read(10), some_data[:10]) + self.assertEqual(f.read(10), some_data[10:]) def test_interleaved_reads(self): diff --git a/Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst b/Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst new file mode 100644 index 000000000000..0da9c4997e1a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst @@ -0,0 +1,2 @@ +:func:`unittest.mock.mock_open` results now respects the argument of read([size]). +Patch contributed by R?mi Lapeyre. From webhook-mailer at python.org Tue May 7 08:35:04 2019 From: webhook-mailer at python.org (Chris Withers) Date: Tue, 07 May 2019 12:35:04 -0000 Subject: [Python-checkins] bpo-31855: unittest.mock.mock_open() results now respects the argument of read([size]) (GH-11521) (#13152) Message-ID: https://github.com/python/cpython/commit/a6516f89aa0f416c7514ac364bb48ac7d1455487 commit: a6516f89aa0f416c7514ac364bb48ac7d1455487 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Chris Withers date: 2019-05-07T13:34:48+01:00 summary: bpo-31855: unittest.mock.mock_open() results now respects the argument of read([size]) (GH-11521) (#13152) unittest.mock.mock_open() results now respects the argument of read([size]) Co-Authored-By: remilapeyre (cherry picked from commit 11a8832c98b3db78727312154dd1d3ba76d639ec) Co-authored-by: R?mi Lapeyre files: A Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testwith.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index db99585c33d2..f71f1a6fbed4 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -25,6 +25,7 @@ __version__ = '1.0' +import io import inspect import pprint import sys @@ -2331,25 +2332,12 @@ def __init__(self, spec, spec_set=False, parent=None, file_spec = None -def _iterate_read_data(read_data): - # Helper for mock_open: - # Retrieve lines from read_data via a generator so that separate calls to - # readline, read, and readlines are properly interleaved - sep = b'\n' if isinstance(read_data, bytes) else '\n' - data_as_list = [l + sep for l in read_data.split(sep)] - - if data_as_list[-1] == sep: - # If the last line ended in a newline, the list comprehension will have an - # extra entry that's just a newline. Remove this. - data_as_list = data_as_list[:-1] - else: - # If there wasn't an extra newline by itself, then the file being - # emulated doesn't have a newline to end the last line remove the - # newline that our naive format() added - data_as_list[-1] = data_as_list[-1][:-1] - for line in data_as_list: - yield line +def _to_stream(read_data): + if isinstance(read_data, bytes): + return io.BytesIO(read_data) + else: + return io.StringIO(read_data) def mock_open(mock=None, read_data=''): @@ -2364,20 +2352,23 @@ def mock_open(mock=None, read_data=''): `read_data` is a string for the `read`, `readline` and `readlines` of the file handle to return. This is an empty string by default. """ + _read_data = _to_stream(read_data) + _state = [_read_data, None] + def _readlines_side_effect(*args, **kwargs): if handle.readlines.return_value is not None: return handle.readlines.return_value - return list(_state[0]) + return _state[0].readlines(*args, **kwargs) def _read_side_effect(*args, **kwargs): if handle.read.return_value is not None: return handle.read.return_value - return type(read_data)().join(_state[0]) + return _state[0].read(*args, **kwargs) - def _readline_side_effect(): + def _readline_side_effect(*args, **kwargs): yield from _iter_side_effect() while True: - yield type(read_data)() + yield _state[0].readline(*args, **kwargs) def _iter_side_effect(): if handle.readline.return_value is not None: @@ -2397,8 +2388,6 @@ def _iter_side_effect(): handle = MagicMock(spec=file_spec) handle.__enter__.return_value = handle - _state = [_iterate_read_data(read_data), None] - handle.write.return_value = None handle.read.return_value = None handle.readline.return_value = None @@ -2411,7 +2400,7 @@ def _iter_side_effect(): handle.__iter__.side_effect = _iter_side_effect def reset_data(*args, **kwargs): - _state[0] = _iterate_read_data(read_data) + _state[0] = _to_stream(read_data) if handle.readline.side_effect == _state[1]: # Only reset the side effect if the user hasn't overridden it. _state[1] = _readline_side_effect() diff --git a/Lib/unittest/test/testmock/testwith.py b/Lib/unittest/test/testmock/testwith.py index ec4e540dcfd9..0fa42e18eca6 100644 --- a/Lib/unittest/test/testmock/testwith.py +++ b/Lib/unittest/test/testmock/testwith.py @@ -286,7 +286,12 @@ def test_mock_open_read_with_argument(self): # for mocks returned by mock_open some_data = 'foo\nbar\nbaz' mock = mock_open(read_data=some_data) - self.assertEqual(mock().read(10), some_data) + self.assertEqual(mock().read(10), some_data[:10]) + self.assertEqual(mock().read(10), some_data[:10]) + + f = mock() + self.assertEqual(f.read(10), some_data[:10]) + self.assertEqual(f.read(10), some_data[10:]) def test_interleaved_reads(self): diff --git a/Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst b/Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst new file mode 100644 index 000000000000..0da9c4997e1a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst @@ -0,0 +1,2 @@ +:func:`unittest.mock.mock_open` results now respects the argument of read([size]). +Patch contributed by R?mi Lapeyre. From webhook-mailer at python.org Tue May 7 10:57:07 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Tue, 07 May 2019 14:57:07 -0000 Subject: [Python-checkins] Python 3.8.0a4 Message-ID: https://github.com/python/cpython/commit/c1004b85464579771db3b50f5b150449275bbbd0 commit: c1004b85464579771db3b50f5b150449275bbbd0 branch: master author: ?ukasz Langa committer: ?ukasz Langa date: 2019-05-06T20:30:25+02:00 summary: Python 3.8.0a4 files: A Misc/NEWS.d/3.8.0a4.rst D Misc/NEWS.d/next/Build/2019-04-02-09-25-23.bpo-36503.0xzfkQ.rst D Misc/NEWS.d/next/Build/2019-04-02-17-01-23.bpo-36508.SN5Y6N.rst D Misc/NEWS.d/next/Build/2019-04-06-18-53-03.bpo-36544.hJr2_a.rst D Misc/NEWS.d/next/Build/2019-04-09-17-31-47.bpo-36577.34kuUW.rst D Misc/NEWS.d/next/Build/2019-04-09-18-19-43.bpo-36465.-w6vx6.rst D Misc/NEWS.d/next/Build/2019-04-11-18-50-58.bpo-36605.gk5czf.rst D Misc/NEWS.d/next/Build/2019-04-12-19-49-10.bpo-36618.gcI9iq.rst D Misc/NEWS.d/next/Build/2019-04-15-15-01-29.bpo-31904.38fdkg.rst D Misc/NEWS.d/next/Build/2019-04-16-13-58-52.bpo-36635.JKlzkf.rst D Misc/NEWS.d/next/Build/2019-04-24-02-29-15.bpo-36707.8ZNB67.rst D Misc/NEWS.d/next/Build/2019-04-25-01-51-52.bpo-21536.ACQkiC.rst D Misc/NEWS.d/next/Build/2019-04-29-09-57-20.bpo-36747.1YEyu-.rst D Misc/NEWS.d/next/C API/2019-01-23-12-38-11.bpo-35810.wpbWeb.rst D Misc/NEWS.d/next/C API/2019-02-19-08-23-42.bpo-36025.tnwylQ.rst D Misc/NEWS.d/next/C API/2019-03-27-15-58-23.bpo-36443.tAfZR9.rst D Misc/NEWS.d/next/C API/2019-04-11-12-20-35.bpo-36389.P9QFoP.rst D Misc/NEWS.d/next/C API/2019-04-16-21-18-19.bpo-36641.pz-DIR.rst D Misc/NEWS.d/next/C API/2019-05-01-00-42-08.bpo-36763.vghb86.rst D Misc/NEWS.d/next/Core and Builtins/2018-12-08-03-40-43.bpo-18372.DT1nR0.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-36143.fnKoKo.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-25-13-45-19.bpo-36440.gkvzhi.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-27-23-53-00.bpo-36452.xhK2lT.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-29-18-47-50.bpo-20844.ge-7SM.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-02-04-10-32.bpo-36504.k_V8Bm.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-02-20-02-22.bpo-36475.CjRps3.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-06-20-59-19.bpo-36540.SzVUfC.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-11-14-36-55.bpo-36588.wejLoC.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-12-12-32-39.bpo-36611.zbo9WQ.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-12-15-49-15.bpo-20180.KUqVk7.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-13-02-08-44.bpo-36623.HR_xhB.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-56-12.bpo-32849.aeSg-D.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-25-21-02-40.bpo-36722.8NApVM.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-29-23-30-21.bpo-36751.3NCRbm.rst D Misc/NEWS.d/next/Documentation/2018-02-22-15-48-16.bpo-32913.f3utho.rst D Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst D Misc/NEWS.d/next/Documentation/2018-12-25-12-56-57.bpo-35581.aA7r6T.rst D Misc/NEWS.d/next/Documentation/2019-02-24-03-15-10.bpo-33043.8knWTS.rst D Misc/NEWS.d/next/Documentation/2019-03-08-15-39-47.bpo-36157.nF1pP1.rst D Misc/NEWS.d/next/Documentation/2019-03-23-09-25-12.bpo-36345.L704Zv.rst D Misc/NEWS.d/next/Documentation/2019-03-26-14-58-34.bpo-36345.r2stx3.rst D Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst D Misc/NEWS.d/next/Documentation/2019-04-04-19-11-47.bpo-36523.sG1Tr4.rst D Misc/NEWS.d/next/Documentation/2019-04-14-19-46-21.bpo-30840.R-JFzw.rst D Misc/NEWS.d/next/Documentation/2019-04-15-12-02-45.bpo-36625.x3LMCF.rst D Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst D Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst D Misc/NEWS.d/next/Library/2018-04-06-11-06-23.bpo-31310.eq9ky0.rst D Misc/NEWS.d/next/Library/2018-04-11-11-41-52.bpo-33291.-xLGf8.rst D Misc/NEWS.d/next/Library/2018-05-29-18-34-53.bpo-33530._4Q_bi.rst D Misc/NEWS.d/next/Library/2018-07-18-11-25-34.bpo-34139.tKbmW7.rst D Misc/NEWS.d/next/Library/2018-07-30-12-00-15.bpo-31658._bx7a_.rst D Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst D Misc/NEWS.d/next/Library/2018-10-27-11-54-12.bpo-35082.HDj1nr.rst D Misc/NEWS.d/next/Library/2018-11-07-23-44-25.bpo-25451.re_8db.rst D Misc/NEWS.d/next/Library/2018-12-05-09-55-05.bpo-35416.XALKZG.rst D Misc/NEWS.d/next/Library/2019-01-18-23-10-10.bpo-23078.l4dFoj.rst D Misc/NEWS.d/next/Library/2019-02-07-20-25-39.bpo-35934.QmfNmY.rst D Misc/NEWS.d/next/Library/2019-02-13-18-56-22.bpo-17396.oKRkrD.rst D Misc/NEWS.d/next/Library/2019-02-13-18-56-27.bpo-35376.UFhYLj.rst D Misc/NEWS.d/next/Library/2019-02-16-22-19-32.bpo-35936.Ay5WtD.rst D Misc/NEWS.d/next/Library/2019-02-17-12-55-51.bpo-36004.hCt_KK.rst D Misc/NEWS.d/next/Library/2019-03-07-20-02-18.bpo-36227.i2Z1XR.rst D Misc/NEWS.d/next/Library/2019-03-13-16-48-42.bpo-31904.9sjd38.rst D Misc/NEWS.d/next/Library/2019-03-18-16-16-55.bpo-36348.E0w_US.rst D Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst D Misc/NEWS.d/next/Library/2019-03-22-13-47-52.bpo-36326.WCnEI5.rst D Misc/NEWS.d/next/Library/2019-03-23-17-16-15.bpo-36407.LG3aC4.rst D Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst D Misc/NEWS.d/next/Library/2019-03-27-02-09-22.bpo-36385.we2F45.rst D Misc/NEWS.d/next/Library/2019-03-28-21-17-08.bpo-30427.lxzvbw.rst D Misc/NEWS.d/next/Library/2019-03-31-01-18-52.bpo-27181.LVUWcc.rst D Misc/NEWS.d/next/Library/2019-03-31-10-21-54.bpo-36492.f7vyUs.rst D Misc/NEWS.d/next/Library/2019-04-03-20-46-47.bpo-36522.g5x3By.rst D Misc/NEWS.d/next/Library/2019-04-05-21-29-53.bpo-36050.x9DRKE.rst D Misc/NEWS.d/next/Library/2019-04-06-14-23-00.bpo-36546.YXjbyY.rst D Misc/NEWS.d/next/Library/2019-04-06-20-25-25.bpo-36232.SClmhb.rst D Misc/NEWS.d/next/Library/2019-04-08-14-41-22.bpo-34373.lEAl_-.rst D Misc/NEWS.d/next/Library/2019-04-09-04-08-46.bpo-17561.hOhVnh.rst D Misc/NEWS.d/next/Library/2019-04-09-12-02-35.bpo-36559.LbDRrw.rst D Misc/NEWS.d/next/Library/2019-04-09-14-46-28.bpo-33461.SYJM-E.rst D Misc/NEWS.d/next/Library/2019-04-09-22-40-52.bpo-36575.Vg_p92.rst D Misc/NEWS.d/next/Library/2019-04-11-16-09-42.bpo-18748.QW7upB.rst D Misc/NEWS.d/next/Library/2019-04-11-22-11-24.bpo-36598.hfzDUl.rst D Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst D Misc/NEWS.d/next/Library/2019-04-13-23-42-33.bpo-30485.JHhjJS.rst D Misc/NEWS.d/next/Library/2019-04-15-12-22-09.bpo-25430.7_8kqc.rst D Misc/NEWS.d/next/Library/2019-04-16-17-50-39.bpo-35755.Fg4EXb.rst D Misc/NEWS.d/next/Library/2019-04-18-16-10-29.bpo-28552.MW1TLt.rst D Misc/NEWS.d/next/Library/2019-04-19-15-29-55.bpo-36650._EVdrz.rst D Misc/NEWS.d/next/Library/2019-04-20-09-50-32.bpo-36673.XF4Egb.rst D Misc/NEWS.d/next/Library/2019-04-20-13-10-34.bpo-36676.XF4Egb.rst D Misc/NEWS.d/next/Library/2019-04-24-17-08-45.bpo-36669.X4g0fu.rst D Misc/NEWS.d/next/Library/2019-04-26-10-10-34.bpo-13611.XEF4bg.rst D Misc/NEWS.d/next/Library/2019-04-26-17-14-20.bpo-36734.p2MaiN.rst D Misc/NEWS.d/next/Library/2019-04-27-21-09-33.bpo-1613500.Ogp4P0.rst D Misc/NEWS.d/next/Library/2019-04-28-01-52-39.bpo-26978.Lpm-SI.rst D Misc/NEWS.d/next/Library/2019-04-28-15-01-29.bpo-28238.gdk38f.rst D Misc/NEWS.d/next/Library/2019-04-29-11-47-06.bpo-35952.3uNuyo.rst D Misc/NEWS.d/next/Security/2019-01-17-10-03-48.bpo-35755.GmllIs.rst D Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst D Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst D Misc/NEWS.d/next/Tests/2019-03-18-10-47-45.bpo-36341.UXlY0P.rst D Misc/NEWS.d/next/Tests/2019-03-19-17-39-25.bpo-31904.QxhhRx.rst D Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst D Misc/NEWS.d/next/Tests/2019-04-01-16-06-36.bpo-31904.peaceF.rst D Misc/NEWS.d/next/Tests/2019-04-08-09-24-36.bpo-31904.ab03ea.rst D Misc/NEWS.d/next/Tests/2019-04-08-19-01-21.bpo-36565.2bxgtU.rst D Misc/NEWS.d/next/Tests/2019-04-09-14-08-02.bpo-36560._ejeOr.rst D Misc/NEWS.d/next/Tests/2019-04-12-12-44-42.bpo-36611.UtorXL.rst D Misc/NEWS.d/next/Tests/2019-04-15-11-57-39.bpo-36629.ySnaL3.rst D Misc/NEWS.d/next/Tests/2019-04-15-16-55-49.bpo-36635.__FTq9.rst D Misc/NEWS.d/next/Tests/2019-04-21-17-53-50.bpo-32424.Q4rBmn.rst D Misc/NEWS.d/next/Tests/2019-04-21-17-55-18.bpo-32424.yDy49h.rst D Misc/NEWS.d/next/Tests/2019-04-23-17-48-11.bpo-36454.0q4lQz.rst D Misc/NEWS.d/next/Tests/2019-04-26-04-12-29.bpo-36725.B8-ghi.rst D Misc/NEWS.d/next/Tests/2019-04-26-09-02-49.bpo-36719.ys2uqH.rst D Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst D Misc/NEWS.d/next/Windows/2017-10-04-12-40-45.bpo-31512.YQeBt2.rst D Misc/NEWS.d/next/Windows/2018-07-20-13-09-19.bpo-34060.v-z87j.rst D Misc/NEWS.d/next/Windows/2019-02-11-14-53-17.bpo-35947.9vI4hP.rst D Misc/NEWS.d/next/Windows/2019-03-05-18-09-43.bpo-29515.vwUTv0.rst D Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst D Misc/NEWS.d/next/Windows/2019-03-18-11-44-49.bpo-36085.mLfxfc.rst D Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst D Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst D Misc/NEWS.d/next/Windows/2019-04-02-10-11-18.bpo-36509.DdaM67.rst D Misc/NEWS.d/next/Windows/2019-04-10-04-35-31.bpo-34144._KzB5z.rst D Misc/NEWS.d/next/Windows/2019-04-17-11-39-24.bpo-36649.arbzIo.rst D Misc/NEWS.d/next/Windows/2019-04-22-16-59-20.bpo-35920.VSfGOI.rst D Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 497dda046ae9..c0a1a6fb0d8b 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 8 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 3 +#define PY_RELEASE_SERIAL 4 /* Version as a string */ -#define PY_VERSION "3.8.0a3+" +#define PY_VERSION "3.8.0a4" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 3e11f54fd78a..875d6e890347 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Mon Mar 25 20:32:23 2019 +# Autogenerated by Sphinx on Mon May 6 20:27:55 2019 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -162,20 +162,21 @@ '\n' ' Note: If the object is a class instance and the attribute ' 'reference\n' - ' occurs on both sides of the assignment operator, the RHS ' - 'expression,\n' - ' "a.x" can access either an instance attribute or (if no ' - 'instance\n' - ' attribute exists) a class attribute. The LHS target "a.x" ' - 'is always\n' - ' set as an instance attribute, creating it if necessary. ' - 'Thus, the\n' - ' two occurrences of "a.x" do not necessarily refer to the ' - 'same\n' - ' attribute: if the RHS expression refers to a class ' - 'attribute, the\n' - ' LHS creates a new instance attribute as the target of the\n' - ' assignment:\n' + ' occurs on both sides of the assignment operator, the ' + 'right-hand side\n' + ' expression, "a.x" can access either an instance attribute or ' + '(if no\n' + ' instance attribute exists) a class attribute. The left-hand ' + 'side\n' + ' target "a.x" is always set as an instance attribute, ' + 'creating it if\n' + ' necessary. Thus, the two occurrences of "a.x" do not ' + 'necessarily\n' + ' refer to the same attribute: if the right-hand side ' + 'expression\n' + ' refers to a class attribute, the left-hand side creates a ' + 'new\n' + ' instance attribute as the target of the assignment:\n' '\n' ' class Cls:\n' ' x = 3 # class variable\n' @@ -3302,11 +3303,11 @@ '"str.format()"\n' ' method, to produce a ?formatted? string representation ' 'of an\n' - ' object. The "format_spec" argument is a string that ' + ' object. The *format_spec* argument is a string that ' 'contains a\n' ' description of the formatting options desired. The ' 'interpretation\n' - ' of the "format_spec" argument is up to the type ' + ' of the *format_spec* argument is up to the type ' 'implementing\n' ' "__format__()", however most classes will either ' 'delegate\n' @@ -6189,8 +6190,8 @@ 'end up importing "pkg.mod". If you execute "from ..subpkg2 import ' 'mod"\n' 'from within "pkg.subpkg1" you will import "pkg.subpkg2.mod". The\n' - 'specification for relative imports is contained within **PEP ' - '328**.\n' + 'specification for relative imports is contained in the Package\n' + 'Relative Imports section.\n' '\n' '"importlib.import_module()" is provided to support applications ' 'that\n' @@ -8002,11 +8003,11 @@ '"str.format()"\n' ' method, to produce a ?formatted? string representation of ' 'an\n' - ' object. The "format_spec" argument is a string that ' + ' object. The *format_spec* argument is a string that ' 'contains a\n' ' description of the formatting options desired. The ' 'interpretation\n' - ' of the "format_spec" argument is up to the type ' + ' of the *format_spec* argument is up to the type ' 'implementing\n' ' "__format__()", however most classes will either ' 'delegate\n' @@ -8768,15 +8769,15 @@ 'When a class definition is executed, the following steps ' 'occur:\n' '\n' - '* MRO entries are resolved\n' + '* MRO entries are resolved;\n' '\n' - '* the appropriate metaclass is determined\n' + '* the appropriate metaclass is determined;\n' '\n' - '* the class namespace is prepared\n' + '* the class namespace is prepared;\n' '\n' - '* the class body is executed\n' + '* the class body is executed;\n' '\n' - '* the class object is created\n' + '* the class object is created.\n' '\n' '\n' 'Resolving MRO entries\n' @@ -8806,16 +8807,16 @@ '\n' '* if no bases and no explicit metaclass are given, then ' '"type()" is\n' - ' used\n' + ' used;\n' '\n' '* if an explicit metaclass is given and it is *not* an ' 'instance of\n' - ' "type()", then it is used directly as the metaclass\n' + ' "type()", then it is used directly as the metaclass;\n' '\n' '* if an instance of "type()" is given as the explicit ' 'metaclass, or\n' ' bases are defined, then the most derived metaclass is ' - 'used\n' + 'used.\n' '\n' 'The most derived metaclass is selected from the explicitly ' 'specified\n' @@ -8931,7 +8932,7 @@ 'with the\n' ' class being defined and the assigned name of that ' 'particular\n' - ' descriptor; and\n' + ' descriptor;\n' '\n' '* finally, the "__init_subclass__()" hook is called on the ' 'immediate\n' @@ -9030,7 +9031,7 @@ '\n' 'One can implement the generic class syntax as specified by ' '**PEP 484**\n' - '(for example "List[int]") by defining a special method\n' + '(for example "List[int]") by defining a special method:\n' '\n' 'classmethod object.__class_getitem__(cls, key)\n' '\n' @@ -9672,6 +9673,14 @@ 'capitalized\n' ' and the rest lowercased.\n' '\n' + ' Changed in version 3.8: The first character is now put ' + 'into\n' + ' titlecase rather than uppercase. This means that ' + 'characters like\n' + ' digraphs will only have their first letter capitalized, ' + 'instead of\n' + ' the full character.\n' + '\n' 'str.casefold()\n' '\n' ' Return a casefolded copy of the string. Casefolded ' @@ -10416,9 +10425,7 @@ ' >>> def titlecase(s):\n' ' ... return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n' ' ... lambda mo: ' - 'mo.group(0)[0].upper() +\n' - ' ... ' - 'mo.group(0)[1:].lower(),\n' + 'mo.group(0).capitalize(),\n' ' ... s)\n' ' ...\n' ' >>> titlecase("they\'re bill\'s friends.")\n' @@ -11286,17 +11293,17 @@ '| |\n' ' | | unavailable; not inherited by ' '| |\n' - ' | | subclasses ' + ' | | subclasses. ' '| |\n' ' ' '+---------------------------+---------------------------------+-------------+\n' - ' | "__name__" | The function?s name ' + ' | "__name__" | The function?s name. ' '| Writable |\n' ' ' '+---------------------------+---------------------------------+-------------+\n' - ' | "__qualname__" | The function?s *qualified name* ' + ' | "__qualname__" | The function?s *qualified ' '| Writable |\n' - ' | | New in version 3.3. ' + ' | | name*. New in version 3.3. ' '| |\n' ' ' '+---------------------------+---------------------------------+-------------+\n' @@ -11316,7 +11323,7 @@ '| |\n' ' | | or "None" if no arguments have ' '| |\n' - ' | | a default value ' + ' | | a default value. ' '| |\n' ' ' '+---------------------------+---------------------------------+-------------+\n' @@ -12172,7 +12179,13 @@ '\n' ' "fromkeys()" is a class method that returns a new ' 'dictionary.\n' - ' *value* defaults to "None".\n' + ' *value* defaults to "None". All of the values refer ' + 'to just a\n' + ' single instance, so it generally doesn?t make sense ' + 'for *value*\n' + ' to be a mutable object such as an empty list. To get ' + 'distinct\n' + ' values, use a dict comprehension instead.\n' '\n' ' get(key[, default])\n' '\n' diff --git a/Misc/NEWS.d/3.8.0a4.rst b/Misc/NEWS.d/3.8.0a4.rst new file mode 100644 index 000000000000..76bb4970ff85 --- /dev/null +++ b/Misc/NEWS.d/3.8.0a4.rst @@ -0,0 +1,1421 @@ +.. bpo: 36742 +.. date: 2019-04-29-15-34-59 +.. nonce: QCUY0i +.. release date: 2019-05-06 +.. section: Security + +Fixes mishandling of pre-normalization characters in urlsplit(). + +.. + +.. bpo: 30458 +.. date: 2019-04-10-08-53-30 +.. nonce: 51E-DA +.. section: Security + +Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or +control characters through into the underlying http client request. Such +potentially malicious header injection URLs now cause an +http.client.InvalidURL exception to be raised. + +.. + +.. bpo: 35755 +.. date: 2019-01-17-10-03-48 +.. nonce: GmllIs +.. section: Security + +:func:`shutil.which` now uses ``os.confstr("CS_PATH")`` if available and if +the :envvar:`PATH` environment variable is not set. Remove also the current +directory from :data:`posixpath.defpath`. On Unix, :func:`shutil.which` and +the :mod:`subprocess` module no longer search the executable in the current +directory if the :envvar:`PATH` environment variable is not set. + +.. + +.. bpo: 36751 +.. date: 2019-04-29-23-30-21 +.. nonce: 3NCRbm +.. section: Core and Builtins + +The :func:`~inspect.getfullargspec` function in the :mod:`inspect` module is +deprecated in favor of the :func:`inspect.signature` API. Contributed by +Pablo Galindo. + +.. + +.. bpo: 36722 +.. date: 2019-04-25-21-02-40 +.. nonce: 8NApVM +.. section: Core and Builtins + +In debug build, import now also looks for C extensions compiled in release +mode and for C extensions compiled in the stable ABI. + +.. + +.. bpo: 32849 +.. date: 2019-04-16-11-56-12 +.. nonce: aeSg-D +.. section: Core and Builtins + +Fix Python Initialization code on FreeBSD to detect properly when stdin file +descriptor (fd 0) is invalid. + +.. + +.. bpo: 36623 +.. date: 2019-04-13-02-08-44 +.. nonce: HR_xhB +.. section: Core and Builtins + +Remove parser headers and related function declarations that lack +implementations after the removal of pgen. + +.. + +.. bpo: 20180 +.. date: 2019-04-12-15-49-15 +.. nonce: KUqVk7 +.. section: Core and Builtins + +``dict.pop()`` is now up to 33% faster thanks to Argument Clinic. Patch by +Inada Naoki. + +.. + +.. bpo: 36611 +.. date: 2019-04-12-12-32-39 +.. nonce: zbo9WQ +.. section: Core and Builtins + +Debug memory allocators: disable serialno field by default from debug hooks +on Python memory allocators to reduce the memory footprint by 5%. Enable +:mod:`tracemalloc` to get the traceback where a memory block has been +allocated when a fatal memory error is logged to decide where to put a +breakpoint. Compile Python with ``PYMEM_DEBUG_SERIALNO`` defined to get back +the field. + +.. + +.. bpo: 36588 +.. date: 2019-04-11-14-36-55 +.. nonce: wejLoC +.. section: Core and Builtins + +On AIX, :attr:`sys.platform` doesn't contain the major version anymore. +Always return ``'aix'``, instead of ``'aix3'`` .. ``'aix7'``. Since older +Python versions include the version number, it is recommended to always use +``sys.platform.startswith('aix')``. Contributed by M. Felt. + +.. + +.. bpo: 36549 +.. date: 2019-04-11-12-41-31 +.. nonce: QSp8of +.. section: Core and Builtins + +Change str.capitalize to use titlecase for the first character instead of +uppercase. + +.. + +.. bpo: 36540 +.. date: 2019-04-06-20-59-19 +.. nonce: SzVUfC +.. section: Core and Builtins + +Implement :pep:`570` (Python positional-only parameters). Patch by Pablo +Galindo. + +.. + +.. bpo: 36475 +.. date: 2019-04-02-20-02-22 +.. nonce: CjRps3 +.. section: Core and Builtins + +:c:func:`PyEval_AcquireLock` and :c:func:`PyEval_AcquireThread` now +terminate the current thread if called while the interpreter is finalizing, +making them consistent with :c:func:`PyEval_RestoreThread`, +:c:func:`Py_END_ALLOW_THREADS`, and :c:func:`PyGILState_Ensure`. + +.. + +.. bpo: 36504 +.. date: 2019-04-02-04-10-32 +.. nonce: k_V8Bm +.. section: Core and Builtins + +Fix signed integer overflow in _ctypes.c's ``PyCArrayType_new()``. + +.. + +.. bpo: 20844 +.. date: 2019-03-29-18-47-50 +.. nonce: ge-7SM +.. section: Core and Builtins + +Fix running script with encoding cookie and LF line ending may fail on +Windows. + +.. + +.. bpo: 24214 +.. date: 2019-03-28-15-22-45 +.. nonce: tZ6lYU +.. section: Core and Builtins + +Fixed support of the surrogatepass error handler in the UTF-8 incremental +decoder. + +.. + +.. bpo: 36452 +.. date: 2019-03-27-23-53-00 +.. nonce: xhK2lT +.. section: Core and Builtins + +Changing ``dict`` keys during iteration of the dict itself, ``keys()``, +``values()``, or ``items()`` will now be detected in certain corner cases +where keys are deleted/added so that the number of keys isn't changed. A +`RuntimeError` will be raised after ``len(dict)`` iterations. Contributed by +Thomas Perl. + +.. + +.. bpo: 36459 +.. date: 2019-03-27-22-35-16 +.. nonce: UAvkKp +.. section: Core and Builtins + +Fix a possible double ``PyMem_FREE()`` due to tokenizer.c's ``tok_nextc()``. + +.. + +.. bpo: 36433 +.. date: 2019-03-26-17-23-02 +.. nonce: -8XzZf +.. section: Core and Builtins + +Fixed TypeError message in classmethoddescr_call. + +.. + +.. bpo: 36430 +.. date: 2019-03-25-23-37-26 +.. nonce: sd9xxQ +.. section: Core and Builtins + +Fix a possible reference leak in :func:`itertools.count`. + +.. + +.. bpo: 36440 +.. date: 2019-03-25-13-45-19 +.. nonce: gkvzhi +.. section: Core and Builtins + +Include node names in ``ParserError`` messages, instead of numeric IDs. +Patch by A. Skrobov. + +.. + +.. bpo: 36143 +.. date: 2019-03-20-00-37-24 +.. nonce: fnKoKo +.. section: Core and Builtins + +Regenerate :mod:`keyword` from the Grammar and Tokens file using pgen. Patch +by Pablo Galindo. + +.. + +.. bpo: 18372 +.. date: 2018-12-08-03-40-43 +.. nonce: DT1nR0 +.. section: Core and Builtins + +Add missing :c:func:`PyObject_GC_Track` calls in the :mod:`pickle` module. +Patch by Zackery Spytz. + +.. + +.. bpo: 35952 +.. date: 2019-04-29-11-47-06 +.. nonce: 3uNuyo +.. section: Library + +Fix pythoninfo when the compiler is missing. + +.. + +.. bpo: 28238 +.. date: 2019-04-28-15-01-29 +.. nonce: gdk38f +.. section: Library + +The ``.find*()`` methods of xml.etree.ElementTree can now search for +wildcards like ``{*}tag`` and ``{ns}*`` that match a tag in any namespace or +all tags in a namespace. Patch by Stefan Behnel. + +.. + +.. bpo: 26978 +.. date: 2019-04-28-01-52-39 +.. nonce: Lpm-SI +.. section: Library + +`pathlib.path.link_to()` is now implemented. It creates a hard link pointing +to a path. + +.. + +.. bpo: 1613500 +.. date: 2019-04-27-21-09-33 +.. nonce: Ogp4P0 +.. section: Library + +:class:`fileinput.FileInput` now uses the input file mode to correctly set +the output file mode (previously it was hardcoded to ``'w'``) when +``inplace=True`` is passed to its constructor. + +.. + +.. bpo: 36734 +.. date: 2019-04-26-17-14-20 +.. nonce: p2MaiN +.. section: Library + +Fix compilation of ``faulthandler.c`` on HP-UX. Initialize ``stack_t +current_stack`` to zero using ``memset()``. + +.. + +.. bpo: 13611 +.. date: 2019-04-26-10-10-34 +.. nonce: XEF4bg +.. section: Library + +The xml.etree.ElementTree packages gained support for C14N 2.0 +serialisation. Patch by Stefan Behnel. + +.. + +.. bpo: 36669 +.. date: 2019-04-24-17-08-45 +.. nonce: X4g0fu +.. section: Library + +Add missing matrix multiplication operator support to weakref.proxy. + +.. + +.. bpo: 36676 +.. date: 2019-04-20-13-10-34 +.. nonce: XF4Egb +.. section: Library + +The XMLParser() in xml.etree.ElementTree provides namespace prefix context +to the parser target if it defines the callback methods "start_ns()" and/or +"end_ns()". Patch by Stefan Behnel. + +.. + +.. bpo: 36673 +.. date: 2019-04-20-09-50-32 +.. nonce: XF4Egb +.. section: Library + +The TreeBuilder and XMLPullParser in xml.etree.ElementTree gained support +for parsing comments and processing instructions. Patch by Stefan Behnel. + +.. + +.. bpo: 36650 +.. date: 2019-04-19-15-29-55 +.. nonce: _EVdrz +.. section: Library + +The C version of functools.lru_cache() was treating calls with an empty +``**kwargs`` dictionary as being distinct from calls with no keywords at +all. This did not result in an incorrect answer, but it did trigger an +unexpected cache miss. + +.. + +.. bpo: 28552 +.. date: 2019-04-18-16-10-29 +.. nonce: MW1TLt +.. section: Library + +Fix :mod:`distutils.sysconfig` if :data:`sys.executable` is ``None`` or an +empty string: use :func:`os.getcwd` to initialize ``project_base``. Fix +also the distutils build command: don't use :data:`sys.executable` if it is +``None`` or an empty string. + +.. + +.. bpo: 35755 +.. date: 2019-04-16-17-50-39 +.. nonce: Fg4EXb +.. section: Library + +:func:`shutil.which` and :func:`distutils.spawn.find_executable` now use +``os.confstr("CS_PATH")`` if available instead of :data:`os.defpath`, if the +``PATH`` environment variable is not set. Moreover, don't use +``os.confstr("CS_PATH")`` nor :data:`os.defpath` if the ``PATH`` environment +variable is set to an empty string. + +.. + +.. bpo: 25430 +.. date: 2019-04-15-12-22-09 +.. nonce: 7_8kqc +.. section: Library + +improve performance of ``IPNetwork.__contains__()`` + +.. + +.. bpo: 30485 +.. date: 2019-04-13-23-42-33 +.. nonce: JHhjJS +.. section: Library + +Path expressions in xml.etree.ElementTree can now avoid explicit namespace +prefixes for tags (or the "{namespace}tag" notation) by passing a default +namespace with an empty string prefix. + +.. + +.. bpo: 36613 +.. date: 2019-04-12-13-52-15 +.. nonce: hqT1qn +.. section: Library + +Fix :mod:`asyncio` wait() not removing callback if exception + +.. + +.. bpo: 36598 +.. date: 2019-04-11-22-11-24 +.. nonce: hfzDUl +.. section: Library + +Fix ``isinstance`` check for Mock objects with spec when the code is +executed under tracing. Patch by Karthikeyan Singaravelan. + +.. + +.. bpo: 18748 +.. date: 2019-04-11-16-09-42 +.. nonce: QW7upB +.. section: Library + +In development mode (:option:`-X` ``dev``) and in debug build, the +:class:`io.IOBase` destructor now logs ``close()`` exceptions. These +exceptions are silent by default in release mode. + +.. + +.. bpo: 36575 +.. date: 2019-04-09-22-40-52 +.. nonce: Vg_p92 +.. section: Library + +The ``_lsprof`` module now uses internal timer same to +``time.perf_counter()`` by default. ``gettimeofday(2)`` was used on Unix. +New timer has better resolution on most Unix platforms and timings are no +longer impacted by system clock updates since ``perf_counter()`` is +monotonic. Patch by Inada Naoki. + +.. + +.. bpo: 33461 +.. date: 2019-04-09-14-46-28 +.. nonce: SYJM-E +.. section: Library + +``json.loads`` now emits ``DeprecationWarning`` when ``encoding`` option is +specified. Patch by Matthias Bussonnier. + +.. + +.. bpo: 36559 +.. date: 2019-04-09-12-02-35 +.. nonce: LbDRrw +.. section: Library + +The random module now prefers the lean internal _sha512 module over hashlib +for seed(version=2) to optimize import time. + +.. + +.. bpo: 17561 +.. date: 2019-04-09-04-08-46 +.. nonce: hOhVnh +.. section: Library + +Set backlog=None as the default for socket.create_server. + +.. + +.. bpo: 34373 +.. date: 2019-04-08-14-41-22 +.. nonce: lEAl_- +.. section: Library + +Fix :func:`time.mktime` error handling on AIX for year before 1970. + +.. + +.. bpo: 36232 +.. date: 2019-04-06-20-25-25 +.. nonce: SClmhb +.. section: Library + +Improve error message when trying to open existing DBM database that +actually doesn't exist. Patch by Marco Rougeth. + +.. + +.. bpo: 36546 +.. date: 2019-04-06-14-23-00 +.. nonce: YXjbyY +.. section: Library + +Add statistics.quantiles() + +.. + +.. bpo: 36050 +.. date: 2019-04-05-21-29-53 +.. nonce: x9DRKE +.. section: Library + +Optimized ``http.client.HTTPResponse.read()`` for large response. Patch by +Inada Naoki. + +.. + +.. bpo: 36522 +.. date: 2019-04-03-20-46-47 +.. nonce: g5x3By +.. section: Library + +If *debuglevel* is set to >0 in :mod:`http.client`, print all values for +headers with multiple values for the same header name. Patch by Matt +Houglum. + +.. + +.. bpo: 36492 +.. date: 2019-03-31-10-21-54 +.. nonce: f7vyUs +.. section: Library + +Deprecated passing required arguments like *func* as keyword arguments in +functions which should accept arbitrary keyword arguments and pass them to +other function. Arbitrary keyword arguments (even with names "self" and +"func") can now be passed to these functions if the required arguments are +passed as positional arguments. + +.. + +.. bpo: 27181 +.. date: 2019-03-31-01-18-52 +.. nonce: LVUWcc +.. section: Library + +Add statistics.geometric_mean(). + +.. + +.. bpo: 30427 +.. date: 2019-03-28-21-17-08 +.. nonce: lxzvbw +.. section: Library + +``os.path.normcase()`` relies on ``os.fspath()`` to check the type of its +argument. Redundant checks have been removed from its +``posixpath.normcase()`` and ``ntpath.normcase()`` implementations. Patch by +Wolfgang Maier. + +.. + +.. bpo: 36385 +.. date: 2019-03-27-02-09-22 +.. nonce: we2F45 +.. section: Library + +Stop rejecting IPv4 octets for being ambiguously octal. Leading zeros are +ignored, and no longer are assumed to specify octal octets. Octets are +always decimal numbers. Octets must still be no more than three digits, +including leading zeroes. + +.. + +.. bpo: 36434 +.. date: 2019-03-26-14-20-59 +.. nonce: PTdidw +.. section: Library + +Errors during writing to a ZIP file no longer prevent to properly close it. + +.. + +.. bpo: 36407 +.. date: 2019-03-23-17-16-15 +.. nonce: LG3aC4 +.. section: Library + +Fixed wrong indentation writing for CDATA section in xml.dom.minidom. Patch +by Vladimir Surjaninov. + +.. + +.. bpo: 36326 +.. date: 2019-03-22-13-47-52 +.. nonce: WCnEI5 +.. section: Library + +inspect.getdoc() can now find docstrings for member objects when __slots__ +is a dictionary. + +.. + +.. bpo: 36366 +.. date: 2019-03-20-15-13-18 +.. nonce: n0eav_ +.. section: Library + +Calling ``stop()`` on an unstarted or stopped :func:`unittest.mock.patch` +object will now return `None` instead of raising :exc:`RuntimeError`, making +the method idempotent. Patch by Karthikeyan Singaravelan. + +.. + +.. bpo: 36348 +.. date: 2019-03-18-16-16-55 +.. nonce: E0w_US +.. section: Library + +The :meth:`imap.IMAP4.logout` method no longer ignores silently arbitrary +exceptions. + +.. + +.. bpo: 31904 +.. date: 2019-03-13-16-48-42 +.. nonce: 9sjd38 +.. section: Library + +Add time module support and fix test_time faiures for VxWorks. + +.. + +.. bpo: 36227 +.. date: 2019-03-07-20-02-18 +.. nonce: i2Z1XR +.. section: Library + +Added support for keyword arguments `default_namespace` and +`xml_declaration` in functions ElementTree.tostring() and +ElementTree.tostringlist(). + +.. + +.. bpo: 36004 +.. date: 2019-02-17-12-55-51 +.. nonce: hCt_KK +.. section: Library + +Added new alternate constructors :meth:`datetime.date.fromisocalendar` and +:meth:`datetime.datetime.fromisocalendar`, which construct date objects from +ISO year, week number and weekday; these are the inverse of each class's +``isocalendar`` method. Patch by Paul Ganssle. + +.. + +.. bpo: 35936 +.. date: 2019-02-16-22-19-32 +.. nonce: Ay5WtD +.. section: Library + +:mod:`modulefinder` no longer depends on the deprecated :mod:`imp` module, +and the initializer for :class:`modulefinder.ModuleFinder` now has immutable +default arguments. Patch by Brandt Bucher. + +.. + +.. bpo: 35376 +.. date: 2019-02-13-18-56-27 +.. nonce: UFhYLj +.. section: Library + +:mod:`modulefinder` correctly handles modules that have the same name as a +bad package. Patch by Brandt Bucher. + +.. + +.. bpo: 17396 +.. date: 2019-02-13-18-56-22 +.. nonce: oKRkrD +.. section: Library + +:mod:`modulefinder` no longer crashes when encountering syntax errors in +followed imports. Patch by Brandt Bucher. + +.. + +.. bpo: 35934 +.. date: 2019-02-07-20-25-39 +.. nonce: QmfNmY +.. section: Library + +Added :meth:`~socket.create_server()` and +:meth:`~socket.has_dualstack_ipv6()` convenience functions to automate the +necessary tasks usually involved when creating a server socket, including +accepting both IPv4 and IPv6 connections on the same socket. (Contributed +by Giampaolo Rodola in :issue:`17561`.) + +.. + +.. bpo: 23078 +.. date: 2019-01-18-23-10-10 +.. nonce: l4dFoj +.. section: Library + +Add support for :func:`classmethod` and :func:`staticmethod` to +:func:`unittest.mock.create_autospec`. Initial patch by Felipe Ochoa. + +.. + +.. bpo: 35416 +.. date: 2018-12-05-09-55-05 +.. nonce: XALKZG +.. section: Library + +Fix potential resource warnings in distutils. Patch by Micka?l Schoentgen. + +.. + +.. bpo: 25451 +.. date: 2018-11-07-23-44-25 +.. nonce: re_8db +.. section: Library + +Add transparency methods to :class:`tkinter.PhotoImage`. Patch by Zackery +Spytz. + +.. + +.. bpo: 35082 +.. date: 2018-10-27-11-54-12 +.. nonce: HDj1nr +.. section: Library + +Don't return deleted attributes when calling dir on a +:class:`unittest.mock.Mock`. + +.. + +.. bpo: 34547 +.. date: 2018-10-05-16-01-00 +.. nonce: abbaa +.. section: Library + +:class:`wsgiref.handlers.BaseHandler` now handles abrupt client connection +terminations gracefully. Patch by Petter Strandmark. + +.. + +.. bpo: 31658 +.. date: 2018-07-30-12-00-15 +.. nonce: _bx7a_ +.. section: Library + +:func:`xml.sax.parse` now supports :term:`path-like `. +Patch by Micka?l Schoentgen. + +.. + +.. bpo: 34139 +.. date: 2018-07-18-11-25-34 +.. nonce: tKbmW7 +.. section: Library + +Remove stale unix datagram socket before binding + +.. + +.. bpo: 33530 +.. date: 2018-05-29-18-34-53 +.. nonce: _4Q_bi +.. section: Library + +Implemented Happy Eyeballs in `asyncio.create_connection()`. Added two new +arguments, *happy_eyeballs_delay* and *interleave*, to specify Happy +Eyeballs behavior. + +.. + +.. bpo: 33291 +.. date: 2018-04-11-11-41-52 +.. nonce: -xLGf8 +.. section: Library + +Do not raise AttributeError when calling the inspect functions +isgeneratorfunction, iscoroutinefunction, isasyncgenfunction on a method +created from an arbitrary callable. Instead, return False. + +.. + +.. bpo: 31310 +.. date: 2018-04-06-11-06-23 +.. nonce: eq9ky0 +.. section: Library + +Fix the multiprocessing.semaphore_tracker so it is reused by child processes + +.. + +.. bpo: 31292 +.. date: 2017-08-30-20-27-00 +.. nonce: dKIaZb +.. section: Library + +Fix ``setup.py check --restructuredtext`` for files containing ``include`` +directives. + +.. + +.. bpo: 36625 +.. date: 2019-04-15-12-02-45 +.. nonce: x3LMCF +.. section: Documentation + +Remove obsolete comments from docstrings in fractions.Fraction + +.. + +.. bpo: 30840 +.. date: 2019-04-14-19-46-21 +.. nonce: R-JFzw +.. section: Documentation + +Document relative imports + +.. + +.. bpo: 36523 +.. date: 2019-04-04-19-11-47 +.. nonce: sG1Tr4 +.. section: Documentation + +Add docstring for io.IOBase.writelines(). + +.. + +.. bpo: 36425 +.. date: 2019-03-27-22-46-00 +.. nonce: kG9gx1 +.. section: Documentation + +New documentation translation: `Simplified Chinese +`_. + +.. + +.. bpo: 36345 +.. date: 2019-03-26-14-58-34 +.. nonce: r2stx3 +.. section: Documentation + +Avoid the duplication of code from ``Tools/scripts/serve.py`` in using the +:rst:dir:`literalinclude` directive for the basic wsgiref-based web server +in the documentation of :mod:`wsgiref`. Contributed by St?phane Wirtel. + +.. + +.. bpo: 36345 +.. date: 2019-03-23-09-25-12 +.. nonce: L704Zv +.. section: Documentation + +Using the code of the ``Tools/scripts/serve.py`` script as an example in the +:mod:`wsgiref` documentation. Contributed by St?phane Wirtel. + +.. + +.. bpo: 36157 +.. date: 2019-03-08-15-39-47 +.. nonce: nF1pP1 +.. section: Documentation + +Added Documention for PyInterpreterState_Main(). + +.. + +.. bpo: 33043 +.. date: 2019-02-24-03-15-10 +.. nonce: 8knWTS +.. section: Documentation + +Updates the docs.python.org page with the addition of a 'Contributing to +Docs' link at the end of the page (between 'Reporting Bugs' and 'About +Documentation'). Updates the 'Found a Bug' page with additional links and +information in the Documentation Bugs section. + +.. + +.. bpo: 35581 +.. date: 2018-12-25-12-56-57 +.. nonce: aA7r6T +.. section: Documentation + + at typing.type_check_only now allows type stubs to mark functions and classes +not available during runtime. + +.. + +.. bpo: 33832 +.. date: 2018-06-15-15-57-37 +.. nonce: xBFhKw +.. section: Documentation + +Add glossary entry for 'magic method'. + +.. + +.. bpo: 32913 +.. date: 2018-02-22-15-48-16 +.. nonce: f3utho +.. section: Documentation + +Added re.Match.groupdict example to regex HOWTO. + +.. + +.. bpo: 36719 +.. date: 2019-04-26-09-02-49 +.. nonce: ys2uqH +.. section: Tests + +regrtest now always detects uncollectable objects. Previously, the check was +only enabled by ``--findleaks``. The check now also works with +``-jN/--multiprocess N``. ``--findleaks`` becomes a deprecated alias to +``--fail-env-changed``. + +.. + +.. bpo: 36725 +.. date: 2019-04-26-04-12-29 +.. nonce: B8-ghi +.. section: Tests + +When using mulitprocessing mode (-jN), regrtest now better reports errors if +a worker process fails, and it exits immediately on a worker thread failure +or when interrupted. + +.. + +.. bpo: 36454 +.. date: 2019-04-23-17-48-11 +.. nonce: 0q4lQz +.. section: Tests + +Change test_time.test_monotonic() to test only the lower bound of elapsed +time after a sleep command rather than the upper bound. This prevents +unnecessary test failures on slow buildbots. Patch by Victor Stinner. + +.. + +.. bpo: 32424 +.. date: 2019-04-21-17-55-18 +.. nonce: yDy49h +.. section: Tests + +Improve test coverage for xml.etree.ElementTree. Patch by Gordon P. Hemsley. + +.. + +.. bpo: 32424 +.. date: 2019-04-21-17-53-50 +.. nonce: Q4rBmn +.. section: Tests + +Fix typo in test_cyclic_gc() test for xml.etree.ElementTree. Patch by Gordon +P. Hemsley. + +.. + +.. bpo: 36635 +.. date: 2019-04-15-16-55-49 +.. nonce: __FTq9 +.. section: Tests + +Add a new :mod:`_testinternalcapi` module to test the internal C API. + +.. + +.. bpo: 36629 +.. date: 2019-04-15-11-57-39 +.. nonce: ySnaL3 +.. section: Tests + +Fix ``test_imap4_host_default_value()`` of ``test_imaplib``: catch also +:data:`errno.ENETUNREACH` error. + +.. + +.. bpo: 36611 +.. date: 2019-04-12-12-44-42 +.. nonce: UtorXL +.. section: Tests + +Fix ``test_sys.test_getallocatedblocks()`` when :mod:`tracemalloc` is +enabled. + +.. + +.. bpo: 36560 +.. date: 2019-04-09-14-08-02 +.. nonce: _ejeOr +.. section: Tests + +Fix reference leak hunting in regrtest: compute also deltas (of reference +count, allocated memory blocks, file descriptor count) during warmup, to +ensure that everything is initialized before starting to hunt reference +leaks. + +.. + +.. bpo: 36565 +.. date: 2019-04-08-19-01-21 +.. nonce: 2bxgtU +.. section: Tests + +Fix reference hunting (``python3 -m test -R 3:3``) when Python has no +built-in abc module. + +.. + +.. bpo: 31904 +.. date: 2019-04-08-09-24-36 +.. nonce: ab03ea +.. section: Tests + +Port test_resource to VxWorks: skip tests cases setting RLIMIT_FSIZE and +RLIMIT_CPU. + +.. + +.. bpo: 31904 +.. date: 2019-04-01-16-06-36 +.. nonce: peaceF +.. section: Tests + +Fix test_tabnanny on VxWorks: adjust ENOENT error message. + +.. + +.. bpo: 36436 +.. date: 2019-03-26-13-49-21 +.. nonce: yAtN0V +.. section: Tests + +Fix ``_testcapi.pymem_buffer_overflow()``: handle memory allocation failure. + +.. + +.. bpo: 31904 +.. date: 2019-03-19-17-39-25 +.. nonce: QxhhRx +.. section: Tests + +Fix test_utf8_mode on VxWorks: Python always use UTF-8 on VxWorks. + +.. + +.. bpo: 36341 +.. date: 2019-03-18-10-47-45 +.. nonce: UXlY0P +.. section: Tests + +Fix tests that may fail with PermissionError upon calling bind() on AF_UNIX +sockets. + +.. + +.. bpo: 36747 +.. date: 2019-04-29-09-57-20 +.. nonce: 1YEyu- +.. section: Build + +Remove the stale scriptsinstall Makefile target. + +.. + +.. bpo: 21536 +.. date: 2019-04-25-01-51-52 +.. nonce: ACQkiC +.. section: Build + +On Unix, C extensions are no longer linked to libpython except on Android. + +It is now possible for a statically linked Python to load a C extension +built using a shared library Python. + +When Python is embedded, ``libpython`` must not be loaded with +``RTLD_LOCAL``, but ``RTLD_GLOBAL`` instead. Previously, using +``RTLD_LOCAL``, it was already not possible to load C extensions which were +not linked to ``libpython``, such as C extensions of the standard library +built by the ``*shared*`` section of ``Modules/Setup``. + +distutils, python-config and python-config.py have been modified. + +.. + +.. bpo: 36707 +.. date: 2019-04-24-02-29-15 +.. nonce: 8ZNB67 +.. section: Build + +``./configure --with-pymalloc`` no longer adds the ``m`` flag to SOABI +(sys.implementation.cache_tag). Enabling or disabling pymalloc has no impact +on the ABI. + +.. + +.. bpo: 36635 +.. date: 2019-04-16-13-58-52 +.. nonce: JKlzkf +.. section: Build + +Change ``PyAPI_FUNC(type)``, ``PyAPI_DATA(type)`` and ``PyMODINIT_FUNC`` +macros of ``pyport.h`` when ``Py_BUILD_CORE_MODULE`` is defined. The +``Py_BUILD_CORE_MODULE`` define must be now be used to build a C extension +as a dynamic library accessing Python internals: export the PyInit_xxx() +function in DLL exports on Windows. + +.. + +.. bpo: 31904 +.. date: 2019-04-15-15-01-29 +.. nonce: 38fdkg +.. section: Build + +Don't build the ``_crypt`` extension on VxWorks. + +.. + +.. bpo: 36618 +.. date: 2019-04-12-19-49-10 +.. nonce: gcI9iq +.. section: Build + +Add ``-fmax-type-align=8`` to CFLAGS when clang compiler is detected. The +pymalloc memory allocator aligns memory on 8 bytes. On x86-64, clang expects +alignment on 16 bytes by default and so uses MOVAPS instruction which can +lead to segmentation fault. Instruct clang that Python is limited to +alignemnt on 8 bytes to use MOVUPS instruction instead: slower but don't +trigger a SIGSEGV if the memory is not aligned on 16 bytes. Sadly, the flag +must be added to ``CFLAGS`` and not just ``CFLAGS_NODIST``, since third +party C extensions can have the same issue. + +.. + +.. bpo: 36605 +.. date: 2019-04-11-18-50-58 +.. nonce: gk5czf +.. section: Build + +``make tags`` and ``make TAGS`` now also parse ``Modules/_io/*.c`` and +``Modules/_io/*.h``. + +.. + +.. bpo: 36465 +.. date: 2019-04-09-18-19-43 +.. nonce: -w6vx6 +.. section: Build + +Release builds and debug builds are now ABI compatible: defining the +``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` macro, which +introduces the only ABI incompatibility. The ``Py_TRACE_REFS`` macro, which +adds the :func:`sys.getobjects` function and the :envvar:`PYTHONDUMPREFS` +environment variable, can be set using the new ``./configure +--with-trace-refs`` build option. + +.. + +.. bpo: 36577 +.. date: 2019-04-09-17-31-47 +.. nonce: 34kuUW +.. section: Build + +setup.py now correctly reports missing OpenSSL headers and libraries again. + +.. + +.. bpo: 36544 +.. date: 2019-04-06-18-53-03 +.. nonce: hJr2_a +.. section: Build + +Fix regression introduced in bpo-36146 refactoring setup.py + +.. + +.. bpo: 36508 +.. date: 2019-04-02-17-01-23 +.. nonce: SN5Y6N +.. section: Build + +``python-config --ldflags`` no longer includes flags of the +``LINKFORSHARED`` variable. The ``LINKFORSHARED`` variable must only be used +to build executables. + +.. + +.. bpo: 36503 +.. date: 2019-04-02-09-25-23 +.. nonce: 0xzfkQ +.. section: Build + +Remove references to "aix3" and "aix4". Patch by M. Felt. + +.. + +.. bpo: 35920 +.. date: 2019-04-22-16-59-20 +.. nonce: VSfGOI +.. section: Windows + +Added platform.win32_edition() and platform.win32_is_iot(). Added support +for cross-compiling packages for Windows ARM32. Skip tests that are not +expected to work on Windows IoT Core ARM32. + +.. + +.. bpo: 36649 +.. date: 2019-04-17-11-39-24 +.. nonce: arbzIo +.. section: Windows + +Remove trailing spaces for registry keys when installed via the Store. + +.. + +.. bpo: 34144 +.. date: 2019-04-10-04-35-31 +.. nonce: _KzB5z +.. section: Windows + +Fixed activate.bat to correctly update codepage when chcp.com returns dots +in output. Patch by Lorenz Mende. + +.. + +.. bpo: 36509 +.. date: 2019-04-02-10-11-18 +.. nonce: DdaM67 +.. section: Windows + +Added preset-iot layout for Windows IoT ARM containers. This layout doesn't +contain UI components like tkinter or IDLE. It also doesn't contain files to +support on-target builds since Windows ARM32 builds must be cross-compiled +when using MSVC. + +.. + +.. bpo: 35941 +.. date: 2019-03-28-03-51-16 +.. nonce: UnlAEE +.. section: Windows + +enum_certificates function of the ssl module now returns certificates from +all available certificate stores inside windows in a query instead of +returning only certificates from the system wide certificate store. This +includes certificates from these certificate stores: local machine, local +machine enterprise, local machine group policy, current user, current user +group policy, services, users. ssl.enum_crls() function is changed in the +same way to return all certificate revocation lists inside the windows +certificate revocation list stores. + +.. + +.. bpo: 36441 +.. date: 2019-03-26-11-46-15 +.. nonce: lYjGF1 +.. section: Windows + +Fixes creating a venv when debug binaries are installed. + +.. + +.. bpo: 36085 +.. date: 2019-03-18-11-44-49 +.. nonce: mLfxfc +.. section: Windows + +Enable better DLL resolution on Windows by using safe DLL search paths and +adding :func:`os.add_dll_directory`. + +.. + +.. bpo: 36010 +.. date: 2019-03-16-10-24-58 +.. nonce: dttWfp +.. section: Windows + +Add the venv standard library module to the nuget distribution for Windows. + +.. + +.. bpo: 29515 +.. date: 2019-03-05-18-09-43 +.. nonce: vwUTv0 +.. section: Windows + +Add the following socket module constants on Windows: IPPROTO_AH IPPROTO_CBT +IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP +IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGMP +IPPROTO_IGP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_ND +IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING +IPPROTO_SCTP IPPROTO_ST + +.. + +.. bpo: 35947 +.. date: 2019-02-11-14-53-17 +.. nonce: 9vI4hP +.. section: Windows + +Added current version of libffi to cpython-source-deps. Change _ctypes to +use current version of libffi on Windows. + +.. + +.. bpo: 34060 +.. date: 2018-07-20-13-09-19 +.. nonce: v-z87j +.. section: Windows + +Report system load when running test suite on Windows. Patch by Ammar Askar. +Based on prior work by Jeremy Kloth. + +.. + +.. bpo: 31512 +.. date: 2017-10-04-12-40-45 +.. nonce: YQeBt2 +.. section: Windows + +With the Windows 10 Creators Update, non-elevated users can now create +symlinks as long as the computer has Developer Mode enabled. + +.. + +.. bpo: 34602 +.. date: 2019-04-29-10-54-14 +.. nonce: Lrl2zU +.. section: macOS + +Avoid failures setting macOS stack resource limit with resource.setrlimit. +This reverts an earlier fix for bpo-18075 which forced a non-default stack +size when building the interpreter executable on macOS. + +.. + +.. bpo: 36429 +.. date: 2019-03-26-00-09-50 +.. nonce: w-jL2e +.. section: IDLE + +Fix starting IDLE with pyshell. Add idlelib.pyshell alias at top; remove +pyshell alias at bottom. Remove obsolete __name__=='__main__' command. + +.. + +.. bpo: 14546 +.. date: 2019-04-30-14-30-29 +.. nonce: r38Y-6 +.. section: Tools/Demos + +Fix the argument handling in Tools/scripts/lll.py. + +.. + +.. bpo: 36763 +.. date: 2019-05-01-00-42-08 +.. nonce: vghb86 +.. section: C API + +Fix memory leak in :c:func:`Py_SetStandardStreamEncoding`: release memory if +the function is called twice. + +.. + +.. bpo: 36641 +.. date: 2019-04-16-21-18-19 +.. nonce: pz-DIR +.. section: C API + +:c:macro:`PyDoc_VAR(name)` and :c:macro:`PyDoc_STRVAR(name,str)` now create +``static const char name[]`` instead of ``static char name[]``. Patch by +Inada Naoki. + +.. + +.. bpo: 36389 +.. date: 2019-04-11-12-20-35 +.. nonce: P9QFoP +.. section: C API + +Change the value of ``CLEANBYTE``, ``DEADDYTE`` and ``FORBIDDENBYTE`` +internal constants used by debug hooks on Python memory allocators +(:c:func:`PyMem_SetupDebugHooks` function). Byte patterns ``0xCB``, ``0xDB`` +and ``0xFB`` have been replaced with ``0xCD``, ``0xDD`` and ``0xFD`` to use +the same values than Windows CRT debug ``malloc()`` and ``free()``. + +.. + +.. bpo: 36443 +.. date: 2019-03-27-15-58-23 +.. nonce: tAfZR9 +.. section: C API + +Since Python 3.7.0, calling :c:func:`Py_DecodeLocale` before +:c:func:`Py_Initialize` produces mojibake if the ``LC_CTYPE`` locale is +coerced and/or if the UTF-8 Mode is enabled by the user configuration. The +LC_CTYPE coercion and UTF-8 Mode are now disabled by default to fix the +mojibake issue. They must now be enabled explicitly (opt-in) using the new +:c:func:`_Py_PreInitialize` API with ``_PyPreConfig``. + +.. + +.. bpo: 36025 +.. date: 2019-02-19-08-23-42 +.. nonce: tnwylQ +.. section: C API + +Fixed an accidental change to the datetime C API where the arguments to the +:c:func:`PyDate_FromTimestamp` function were incorrectly interpreted as a +single timestamp rather than an arguments tuple, which causes existing code +to start raising :exc:`TypeError`. The backwards-incompatible change was +only present in alpha releases of Python 3.8. Patch by Paul Ganssle. + +.. + +.. bpo: 35810 +.. date: 2019-01-23-12-38-11 +.. nonce: wpbWeb +.. section: C API + +Modify ``PyObject_Init`` to correctly increase the refcount of heap- +allocated Type objects. Also fix the refcounts of the heap-allocated types +that were either doing this manually or not decreasing the type's refcount +in tp_dealloc diff --git a/Misc/NEWS.d/next/Build/2019-04-02-09-25-23.bpo-36503.0xzfkQ.rst b/Misc/NEWS.d/next/Build/2019-04-02-09-25-23.bpo-36503.0xzfkQ.rst deleted file mode 100644 index 764c397f8f8d..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-02-09-25-23.bpo-36503.0xzfkQ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove references to "aix3" and "aix4". -Patch by M. Felt. diff --git a/Misc/NEWS.d/next/Build/2019-04-02-17-01-23.bpo-36508.SN5Y6N.rst b/Misc/NEWS.d/next/Build/2019-04-02-17-01-23.bpo-36508.SN5Y6N.rst deleted file mode 100644 index 62f80840a044..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-02-17-01-23.bpo-36508.SN5Y6N.rst +++ /dev/null @@ -1,3 +0,0 @@ -``python-config --ldflags`` no longer includes flags of the -``LINKFORSHARED`` variable. The ``LINKFORSHARED`` variable must only be used -to build executables. diff --git a/Misc/NEWS.d/next/Build/2019-04-06-18-53-03.bpo-36544.hJr2_a.rst b/Misc/NEWS.d/next/Build/2019-04-06-18-53-03.bpo-36544.hJr2_a.rst deleted file mode 100644 index 71f5c21847b6..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-06-18-53-03.bpo-36544.hJr2_a.rst +++ /dev/null @@ -1 +0,0 @@ -Fix regression introduced in bpo-36146 refactoring setup.py diff --git a/Misc/NEWS.d/next/Build/2019-04-09-17-31-47.bpo-36577.34kuUW.rst b/Misc/NEWS.d/next/Build/2019-04-09-17-31-47.bpo-36577.34kuUW.rst deleted file mode 100644 index 58c015127309..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-09-17-31-47.bpo-36577.34kuUW.rst +++ /dev/null @@ -1 +0,0 @@ -setup.py now correctly reports missing OpenSSL headers and libraries again. diff --git a/Misc/NEWS.d/next/Build/2019-04-09-18-19-43.bpo-36465.-w6vx6.rst b/Misc/NEWS.d/next/Build/2019-04-09-18-19-43.bpo-36465.-w6vx6.rst deleted file mode 100644 index 8969d3c4df18..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-09-18-19-43.bpo-36465.-w6vx6.rst +++ /dev/null @@ -1,6 +0,0 @@ -Release builds and debug builds are now ABI compatible: defining the -``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` macro, which -introduces the only ABI incompatibility. The ``Py_TRACE_REFS`` macro, which -adds the :func:`sys.getobjects` function and the :envvar:`PYTHONDUMPREFS` -environment variable, can be set using the new ``./configure --with-trace-refs`` -build option. diff --git a/Misc/NEWS.d/next/Build/2019-04-11-18-50-58.bpo-36605.gk5czf.rst b/Misc/NEWS.d/next/Build/2019-04-11-18-50-58.bpo-36605.gk5czf.rst deleted file mode 100644 index 4a558fa94d6f..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-11-18-50-58.bpo-36605.gk5czf.rst +++ /dev/null @@ -1,2 +0,0 @@ -``make tags`` and ``make TAGS`` now also parse ``Modules/_io/*.c`` and -``Modules/_io/*.h``. diff --git a/Misc/NEWS.d/next/Build/2019-04-12-19-49-10.bpo-36618.gcI9iq.rst b/Misc/NEWS.d/next/Build/2019-04-12-19-49-10.bpo-36618.gcI9iq.rst deleted file mode 100644 index 4408227b326c..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-12-19-49-10.bpo-36618.gcI9iq.rst +++ /dev/null @@ -1,8 +0,0 @@ -Add ``-fmax-type-align=8`` to CFLAGS when clang compiler is detected. The -pymalloc memory allocator aligns memory on 8 bytes. On x86-64, clang expects -alignment on 16 bytes by default and so uses MOVAPS instruction which can -lead to segmentation fault. Instruct clang that Python is limited to -alignemnt on 8 bytes to use MOVUPS instruction instead: slower but don't -trigger a SIGSEGV if the memory is not aligned on 16 bytes. Sadly, the flag -must be added to ``CFLAGS`` and not just ``CFLAGS_NODIST``, since third party C -extensions can have the same issue. diff --git a/Misc/NEWS.d/next/Build/2019-04-15-15-01-29.bpo-31904.38fdkg.rst b/Misc/NEWS.d/next/Build/2019-04-15-15-01-29.bpo-31904.38fdkg.rst deleted file mode 100644 index c82636ed7b5b..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-15-15-01-29.bpo-31904.38fdkg.rst +++ /dev/null @@ -1 +0,0 @@ -Don't build the ``_crypt`` extension on VxWorks. diff --git a/Misc/NEWS.d/next/Build/2019-04-16-13-58-52.bpo-36635.JKlzkf.rst b/Misc/NEWS.d/next/Build/2019-04-16-13-58-52.bpo-36635.JKlzkf.rst deleted file mode 100644 index 6d346d22b807..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-16-13-58-52.bpo-36635.JKlzkf.rst +++ /dev/null @@ -1,5 +0,0 @@ -Change ``PyAPI_FUNC(type)``, ``PyAPI_DATA(type)`` and ``PyMODINIT_FUNC`` -macros of ``pyport.h`` when ``Py_BUILD_CORE_MODULE`` is defined. The -``Py_BUILD_CORE_MODULE`` define must be now be used to build a C extension -as a dynamic library accessing Python internals: export the PyInit_xxx() -function in DLL exports on Windows. diff --git a/Misc/NEWS.d/next/Build/2019-04-24-02-29-15.bpo-36707.8ZNB67.rst b/Misc/NEWS.d/next/Build/2019-04-24-02-29-15.bpo-36707.8ZNB67.rst deleted file mode 100644 index 77bd4d73b2a2..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-24-02-29-15.bpo-36707.8ZNB67.rst +++ /dev/null @@ -1,3 +0,0 @@ -``./configure --with-pymalloc`` no longer adds the ``m`` flag to SOABI -(sys.implementation.cache_tag). Enabling or disabling pymalloc has no impact -on the ABI. diff --git a/Misc/NEWS.d/next/Build/2019-04-25-01-51-52.bpo-21536.ACQkiC.rst b/Misc/NEWS.d/next/Build/2019-04-25-01-51-52.bpo-21536.ACQkiC.rst deleted file mode 100644 index 59efab83265f..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-25-01-51-52.bpo-21536.ACQkiC.rst +++ /dev/null @@ -1,12 +0,0 @@ -On Unix, C extensions are no longer linked to libpython except on Android. - -It is now possible for a statically linked Python to load a C extension built -using a shared library Python. - -When Python is embedded, ``libpython`` must not be loaded with ``RTLD_LOCAL``, -but ``RTLD_GLOBAL`` instead. Previously, using ``RTLD_LOCAL``, it was already -not possible to load C extensions which were not linked to ``libpython``, such -as C extensions of the standard library built by the ``*shared*`` section of -``Modules/Setup``. - -distutils, python-config and python-config.py have been modified. diff --git a/Misc/NEWS.d/next/Build/2019-04-29-09-57-20.bpo-36747.1YEyu-.rst b/Misc/NEWS.d/next/Build/2019-04-29-09-57-20.bpo-36747.1YEyu-.rst deleted file mode 100644 index dd5a00801a93..000000000000 --- a/Misc/NEWS.d/next/Build/2019-04-29-09-57-20.bpo-36747.1YEyu-.rst +++ /dev/null @@ -1 +0,0 @@ -Remove the stale scriptsinstall Makefile target. diff --git a/Misc/NEWS.d/next/C API/2019-01-23-12-38-11.bpo-35810.wpbWeb.rst b/Misc/NEWS.d/next/C API/2019-01-23-12-38-11.bpo-35810.wpbWeb.rst deleted file mode 100644 index 47d25a5924c7..000000000000 --- a/Misc/NEWS.d/next/C API/2019-01-23-12-38-11.bpo-35810.wpbWeb.rst +++ /dev/null @@ -1,4 +0,0 @@ -Modify ``PyObject_Init`` to correctly increase the refcount of heap- -allocated Type objects. Also fix the refcounts of the heap-allocated types -that were either doing this manually or not decreasing the type's refcount -in tp_dealloc diff --git a/Misc/NEWS.d/next/C API/2019-02-19-08-23-42.bpo-36025.tnwylQ.rst b/Misc/NEWS.d/next/C API/2019-02-19-08-23-42.bpo-36025.tnwylQ.rst deleted file mode 100644 index b00a33d109c2..000000000000 --- a/Misc/NEWS.d/next/C API/2019-02-19-08-23-42.bpo-36025.tnwylQ.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fixed an accidental change to the datetime C API where the arguments to the -:c:func:`PyDate_FromTimestamp` function were incorrectly interpreted as a -single timestamp rather than an arguments tuple, which causes existing code to -start raising :exc:`TypeError`. The backwards-incompatible change was only -present in alpha releases of Python 3.8. Patch by Paul Ganssle. diff --git a/Misc/NEWS.d/next/C API/2019-03-27-15-58-23.bpo-36443.tAfZR9.rst b/Misc/NEWS.d/next/C API/2019-03-27-15-58-23.bpo-36443.tAfZR9.rst deleted file mode 100644 index 3d98c318d401..000000000000 --- a/Misc/NEWS.d/next/C API/2019-03-27-15-58-23.bpo-36443.tAfZR9.rst +++ /dev/null @@ -1,6 +0,0 @@ -Since Python 3.7.0, calling :c:func:`Py_DecodeLocale` before -:c:func:`Py_Initialize` produces mojibake if the ``LC_CTYPE`` locale is coerced -and/or if the UTF-8 Mode is enabled by the user configuration. The LC_CTYPE -coercion and UTF-8 Mode are now disabled by default to fix the mojibake issue. -They must now be enabled explicitly (opt-in) using the new -:c:func:`_Py_PreInitialize` API with ``_PyPreConfig``. diff --git a/Misc/NEWS.d/next/C API/2019-04-11-12-20-35.bpo-36389.P9QFoP.rst b/Misc/NEWS.d/next/C API/2019-04-11-12-20-35.bpo-36389.P9QFoP.rst deleted file mode 100644 index f2b507a9c230..000000000000 --- a/Misc/NEWS.d/next/C API/2019-04-11-12-20-35.bpo-36389.P9QFoP.rst +++ /dev/null @@ -1,5 +0,0 @@ -Change the value of ``CLEANBYTE``, ``DEADDYTE`` and ``FORBIDDENBYTE`` internal -constants used by debug hooks on Python memory allocators -(:c:func:`PyMem_SetupDebugHooks` function). Byte patterns ``0xCB``, ``0xDB`` -and ``0xFB`` have been replaced with ``0xCD``, ``0xDD`` and ``0xFD`` to use the -same values than Windows CRT debug ``malloc()`` and ``free()``. diff --git a/Misc/NEWS.d/next/C API/2019-04-16-21-18-19.bpo-36641.pz-DIR.rst b/Misc/NEWS.d/next/C API/2019-04-16-21-18-19.bpo-36641.pz-DIR.rst deleted file mode 100644 index f92af63029be..000000000000 --- a/Misc/NEWS.d/next/C API/2019-04-16-21-18-19.bpo-36641.pz-DIR.rst +++ /dev/null @@ -1,2 +0,0 @@ -:c:macro:`PyDoc_VAR(name)` and :c:macro:`PyDoc_STRVAR(name,str)` now create -``static const char name[]`` instead of ``static char name[]``. Patch by Inada Naoki. diff --git a/Misc/NEWS.d/next/C API/2019-05-01-00-42-08.bpo-36763.vghb86.rst b/Misc/NEWS.d/next/C API/2019-05-01-00-42-08.bpo-36763.vghb86.rst deleted file mode 100644 index 1c34920827fc..000000000000 --- a/Misc/NEWS.d/next/C API/2019-05-01-00-42-08.bpo-36763.vghb86.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix memory leak in :c:func:`Py_SetStandardStreamEncoding`: release memory if -the function is called twice. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-08-03-40-43.bpo-18372.DT1nR0.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-08-03-40-43.bpo-18372.DT1nR0.rst deleted file mode 100644 index d8205b8d32d0..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-08-03-40-43.bpo-18372.DT1nR0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add missing :c:func:`PyObject_GC_Track` calls in the :mod:`pickle` module. -Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-36143.fnKoKo.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-36143.fnKoKo.rst deleted file mode 100644 index 10d6c4962734..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-36143.fnKoKo.rst +++ /dev/null @@ -1,2 +0,0 @@ -Regenerate :mod:`keyword` from the Grammar and Tokens file using pgen. Patch -by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-25-13-45-19.bpo-36440.gkvzhi.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-25-13-45-19.bpo-36440.gkvzhi.rst deleted file mode 100644 index 372b1f771009..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-25-13-45-19.bpo-36440.gkvzhi.rst +++ /dev/null @@ -1,2 +0,0 @@ -Include node names in ``ParserError`` messages, instead of numeric IDs. -Patch by A. Skrobov. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst deleted file mode 100644 index a65ee096efc4..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a possible reference leak in :func:`itertools.count`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst deleted file mode 100644 index 6d1bd288bda1..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed TypeError message in classmethoddescr_call. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst deleted file mode 100644 index 6c234a6a76d9..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a possible double ``PyMem_FREE()`` due to tokenizer.c's ``tok_nextc()``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-27-23-53-00.bpo-36452.xhK2lT.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-23-53-00.bpo-36452.xhK2lT.rst deleted file mode 100644 index 26d85682f882..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-27-23-53-00.bpo-36452.xhK2lT.rst +++ /dev/null @@ -1,5 +0,0 @@ -Changing ``dict`` keys during iteration of the dict itself, ``keys()``, -``values()``, or ``items()`` will now be detected in certain corner cases where -keys are deleted/added so that the number of keys isn't changed. -A `RuntimeError` will be raised after ``len(dict)`` iterations. -Contributed by Thomas Perl. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst deleted file mode 100644 index abb27591f78a..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed support of the surrogatepass error handler in the UTF-8 incremental -decoder. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-29-18-47-50.bpo-20844.ge-7SM.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-29-18-47-50.bpo-20844.ge-7SM.rst deleted file mode 100644 index 22a400ae7c8f..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-29-18-47-50.bpo-20844.ge-7SM.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix running script with encoding cookie and LF line ending -may fail on Windows. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-02-04-10-32.bpo-36504.k_V8Bm.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-02-04-10-32.bpo-36504.k_V8Bm.rst deleted file mode 100644 index 8ac209d4a789..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-02-04-10-32.bpo-36504.k_V8Bm.rst +++ /dev/null @@ -1 +0,0 @@ -Fix signed integer overflow in _ctypes.c's ``PyCArrayType_new()``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-02-20-02-22.bpo-36475.CjRps3.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-02-20-02-22.bpo-36475.CjRps3.rst deleted file mode 100644 index 6f0975107fa2..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-02-20-02-22.bpo-36475.CjRps3.rst +++ /dev/null @@ -1,4 +0,0 @@ -:c:func:`PyEval_AcquireLock` and :c:func:`PyEval_AcquireThread` now -terminate the current thread if called while the interpreter is -finalizing, making them consistent with :c:func:`PyEval_RestoreThread`, -:c:func:`Py_END_ALLOW_THREADS`, and :c:func:`PyGILState_Ensure`. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-06-20-59-19.bpo-36540.SzVUfC.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-06-20-59-19.bpo-36540.SzVUfC.rst deleted file mode 100644 index 359e8bfe0d16..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-06-20-59-19.bpo-36540.SzVUfC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Implement :pep:`570` (Python positional-only parameters). Patch by Pablo -Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst deleted file mode 100644 index 9c6834cb3f90..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst +++ /dev/null @@ -1,2 +0,0 @@ -Change str.capitalize to use titlecase for the first character instead of -uppercase. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-11-14-36-55.bpo-36588.wejLoC.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-11-14-36-55.bpo-36588.wejLoC.rst deleted file mode 100644 index 77d2fa4e299b..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-11-14-36-55.bpo-36588.wejLoC.rst +++ /dev/null @@ -1,5 +0,0 @@ -On AIX, :attr:`sys.platform` doesn't contain the major version anymore. -Always return ``'aix'``, instead of ``'aix3'`` .. ``'aix7'``. Since -older Python versions include the version number, it is recommended to -always use ``sys.platform.startswith('aix')``. -Contributed by M. Felt. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-12-12-32-39.bpo-36611.zbo9WQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-12-12-32-39.bpo-36611.zbo9WQ.rst deleted file mode 100644 index f55a9efc5d38..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-12-12-32-39.bpo-36611.zbo9WQ.rst +++ /dev/null @@ -1,5 +0,0 @@ -Debug memory allocators: disable serialno field by default from debug hooks on -Python memory allocators to reduce the memory footprint by 5%. Enable -:mod:`tracemalloc` to get the traceback where a memory block has been allocated -when a fatal memory error is logged to decide where to put a breakpoint. -Compile Python with ``PYMEM_DEBUG_SERIALNO`` defined to get back the field. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-12-15-49-15.bpo-20180.KUqVk7.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-12-15-49-15.bpo-20180.KUqVk7.rst deleted file mode 100644 index 8c9067081aa1..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-12-15-49-15.bpo-20180.KUqVk7.rst +++ /dev/null @@ -1,2 +0,0 @@ -``dict.pop()`` is now up to 33% faster thanks to Argument Clinic. Patch by -Inada Naoki. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-13-02-08-44.bpo-36623.HR_xhB.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-13-02-08-44.bpo-36623.HR_xhB.rst deleted file mode 100644 index cc90973e2964..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-13-02-08-44.bpo-36623.HR_xhB.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove parser headers and related function declarations that lack -implementations after the removal of pgen. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-56-12.bpo-32849.aeSg-D.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-56-12.bpo-32849.aeSg-D.rst deleted file mode 100644 index 6a9a85c4b134..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-56-12.bpo-32849.aeSg-D.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix Python Initialization code on FreeBSD to detect properly when stdin file -descriptor (fd 0) is invalid. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-25-21-02-40.bpo-36722.8NApVM.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-25-21-02-40.bpo-36722.8NApVM.rst deleted file mode 100644 index 210a7e052592..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-25-21-02-40.bpo-36722.8NApVM.rst +++ /dev/null @@ -1,2 +0,0 @@ -In debug build, import now also looks for C extensions compiled in release -mode and for C extensions compiled in the stable ABI. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-29-23-30-21.bpo-36751.3NCRbm.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-29-23-30-21.bpo-36751.3NCRbm.rst deleted file mode 100644 index 5b16aaa0b0c3..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-29-23-30-21.bpo-36751.3NCRbm.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :func:`~inspect.getfullargspec` function in the :mod:`inspect` module is -deprecated in favor of the :func:`inspect.signature` API. Contributed by -Pablo Galindo. diff --git a/Misc/NEWS.d/next/Documentation/2018-02-22-15-48-16.bpo-32913.f3utho.rst b/Misc/NEWS.d/next/Documentation/2018-02-22-15-48-16.bpo-32913.f3utho.rst deleted file mode 100644 index caa9590abbaf..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-02-22-15-48-16.bpo-32913.f3utho.rst +++ /dev/null @@ -1 +0,0 @@ -Added re.Match.groupdict example to regex HOWTO. diff --git a/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst b/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst deleted file mode 100644 index 3d1c63acca3b..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst +++ /dev/null @@ -1 +0,0 @@ -Add glossary entry for 'magic method'. diff --git a/Misc/NEWS.d/next/Documentation/2018-12-25-12-56-57.bpo-35581.aA7r6T.rst b/Misc/NEWS.d/next/Documentation/2018-12-25-12-56-57.bpo-35581.aA7r6T.rst deleted file mode 100644 index 2fad3003e3b6..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-12-25-12-56-57.bpo-35581.aA7r6T.rst +++ /dev/null @@ -1 +0,0 @@ - at typing.type_check_only now allows type stubs to mark functions and classes not available during runtime. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2019-02-24-03-15-10.bpo-33043.8knWTS.rst b/Misc/NEWS.d/next/Documentation/2019-02-24-03-15-10.bpo-33043.8knWTS.rst deleted file mode 100644 index 124aa5e027ab..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-02-24-03-15-10.bpo-33043.8knWTS.rst +++ /dev/null @@ -1 +0,0 @@ -Updates the docs.python.org page with the addition of a 'Contributing to Docs' link at the end of the page (between 'Reporting Bugs' and 'About Documentation'). Updates the 'Found a Bug' page with additional links and information in the Documentation Bugs section. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2019-03-08-15-39-47.bpo-36157.nF1pP1.rst b/Misc/NEWS.d/next/Documentation/2019-03-08-15-39-47.bpo-36157.nF1pP1.rst deleted file mode 100644 index ff0293e8407f..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-03-08-15-39-47.bpo-36157.nF1pP1.rst +++ /dev/null @@ -1 +0,0 @@ -Added Documention for PyInterpreterState_Main(). \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2019-03-23-09-25-12.bpo-36345.L704Zv.rst b/Misc/NEWS.d/next/Documentation/2019-03-23-09-25-12.bpo-36345.L704Zv.rst deleted file mode 100644 index c6206a74ab29..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-03-23-09-25-12.bpo-36345.L704Zv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Using the code of the ``Tools/scripts/serve.py`` script as an example in the -:mod:`wsgiref` documentation. Contributed by St?phane Wirtel. diff --git a/Misc/NEWS.d/next/Documentation/2019-03-26-14-58-34.bpo-36345.r2stx3.rst b/Misc/NEWS.d/next/Documentation/2019-03-26-14-58-34.bpo-36345.r2stx3.rst deleted file mode 100644 index bbecc947cafa..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-03-26-14-58-34.bpo-36345.r2stx3.rst +++ /dev/null @@ -1,3 +0,0 @@ -Avoid the duplication of code from ``Tools/scripts/serve.py`` in using the -:rst:dir:`literalinclude` directive for the basic wsgiref-based web server in the -documentation of :mod:`wsgiref`. Contributed by St?phane Wirtel. diff --git a/Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst b/Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst deleted file mode 100644 index 12bd833a88b5..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst +++ /dev/null @@ -1,2 +0,0 @@ -New documentation translation: `Simplified Chinese -`_. diff --git a/Misc/NEWS.d/next/Documentation/2019-04-04-19-11-47.bpo-36523.sG1Tr4.rst b/Misc/NEWS.d/next/Documentation/2019-04-04-19-11-47.bpo-36523.sG1Tr4.rst deleted file mode 100644 index 9355f607d760..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-04-04-19-11-47.bpo-36523.sG1Tr4.rst +++ /dev/null @@ -1 +0,0 @@ -Add docstring for io.IOBase.writelines(). diff --git a/Misc/NEWS.d/next/Documentation/2019-04-14-19-46-21.bpo-30840.R-JFzw.rst b/Misc/NEWS.d/next/Documentation/2019-04-14-19-46-21.bpo-30840.R-JFzw.rst deleted file mode 100644 index 210f54f2593e..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-04-14-19-46-21.bpo-30840.R-JFzw.rst +++ /dev/null @@ -1 +0,0 @@ -Document relative imports \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2019-04-15-12-02-45.bpo-36625.x3LMCF.rst b/Misc/NEWS.d/next/Documentation/2019-04-15-12-02-45.bpo-36625.x3LMCF.rst deleted file mode 100644 index af1a15733249..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-04-15-12-02-45.bpo-36625.x3LMCF.rst +++ /dev/null @@ -1 +0,0 @@ -Remove obsolete comments from docstrings in fractions.Fraction diff --git a/Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst b/Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst deleted file mode 100644 index 1d6bb1a587b5..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix starting IDLE with pyshell. Add idlelib.pyshell alias at top; remove -pyshell alias at bottom. Remove obsolete __name__=='__main__' command. diff --git a/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst b/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst deleted file mode 100644 index b62eee3c5ee4..000000000000 --- a/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``setup.py check --restructuredtext`` for -files containing ``include`` directives. diff --git a/Misc/NEWS.d/next/Library/2018-04-06-11-06-23.bpo-31310.eq9ky0.rst b/Misc/NEWS.d/next/Library/2018-04-06-11-06-23.bpo-31310.eq9ky0.rst deleted file mode 100644 index 32ebf4efb74b..000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-06-11-06-23.bpo-31310.eq9ky0.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the multiprocessing.semaphore_tracker so it is reused by child processes diff --git a/Misc/NEWS.d/next/Library/2018-04-11-11-41-52.bpo-33291.-xLGf8.rst b/Misc/NEWS.d/next/Library/2018-04-11-11-41-52.bpo-33291.-xLGf8.rst deleted file mode 100644 index 1ffb9ddccbb0..000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-11-11-41-52.bpo-33291.-xLGf8.rst +++ /dev/null @@ -1,3 +0,0 @@ -Do not raise AttributeError when calling the inspect functions -isgeneratorfunction, iscoroutinefunction, isasyncgenfunction on a method -created from an arbitrary callable. Instead, return False. diff --git a/Misc/NEWS.d/next/Library/2018-05-29-18-34-53.bpo-33530._4Q_bi.rst b/Misc/NEWS.d/next/Library/2018-05-29-18-34-53.bpo-33530._4Q_bi.rst deleted file mode 100644 index 747219b1bfb8..000000000000 --- a/Misc/NEWS.d/next/Library/2018-05-29-18-34-53.bpo-33530._4Q_bi.rst +++ /dev/null @@ -1,3 +0,0 @@ -Implemented Happy Eyeballs in `asyncio.create_connection()`. Added two new -arguments, *happy_eyeballs_delay* and *interleave*, -to specify Happy Eyeballs behavior. diff --git a/Misc/NEWS.d/next/Library/2018-07-18-11-25-34.bpo-34139.tKbmW7.rst b/Misc/NEWS.d/next/Library/2018-07-18-11-25-34.bpo-34139.tKbmW7.rst deleted file mode 100644 index 44284a72ad8a..000000000000 --- a/Misc/NEWS.d/next/Library/2018-07-18-11-25-34.bpo-34139.tKbmW7.rst +++ /dev/null @@ -1 +0,0 @@ -Remove stale unix datagram socket before binding diff --git a/Misc/NEWS.d/next/Library/2018-07-30-12-00-15.bpo-31658._bx7a_.rst b/Misc/NEWS.d/next/Library/2018-07-30-12-00-15.bpo-31658._bx7a_.rst deleted file mode 100644 index 8b35060fd737..000000000000 --- a/Misc/NEWS.d/next/Library/2018-07-30-12-00-15.bpo-31658._bx7a_.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`xml.sax.parse` now supports :term:`path-like `. -Patch by Micka?l Schoentgen. diff --git a/Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst b/Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst deleted file mode 100644 index 7b63c05ed2be..000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-05-16-01-00.bpo-34547.abbaa.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`wsgiref.handlers.BaseHandler` now handles abrupt client connection -terminations gracefully. Patch by Petter Strandmark. diff --git a/Misc/NEWS.d/next/Library/2018-10-27-11-54-12.bpo-35082.HDj1nr.rst b/Misc/NEWS.d/next/Library/2018-10-27-11-54-12.bpo-35082.HDj1nr.rst deleted file mode 100644 index 45a0729506e3..000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-27-11-54-12.bpo-35082.HDj1nr.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't return deleted attributes when calling dir on a -:class:`unittest.mock.Mock`. diff --git a/Misc/NEWS.d/next/Library/2018-11-07-23-44-25.bpo-25451.re_8db.rst b/Misc/NEWS.d/next/Library/2018-11-07-23-44-25.bpo-25451.re_8db.rst deleted file mode 100644 index e0a9ea0c1fbd..000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-07-23-44-25.bpo-25451.re_8db.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add transparency methods to :class:`tkinter.PhotoImage`. Patch by Zackery -Spytz. diff --git a/Misc/NEWS.d/next/Library/2018-12-05-09-55-05.bpo-35416.XALKZG.rst b/Misc/NEWS.d/next/Library/2018-12-05-09-55-05.bpo-35416.XALKZG.rst deleted file mode 100644 index 66603bcd31ad..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-05-09-55-05.bpo-35416.XALKZG.rst +++ /dev/null @@ -1 +0,0 @@ -Fix potential resource warnings in distutils. Patch by Micka?l Schoentgen. diff --git a/Misc/NEWS.d/next/Library/2019-01-18-23-10-10.bpo-23078.l4dFoj.rst b/Misc/NEWS.d/next/Library/2019-01-18-23-10-10.bpo-23078.l4dFoj.rst deleted file mode 100644 index 975cc9c0454c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-18-23-10-10.bpo-23078.l4dFoj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add support for :func:`classmethod` and :func:`staticmethod` to -:func:`unittest.mock.create_autospec`. Initial patch by Felipe Ochoa. diff --git a/Misc/NEWS.d/next/Library/2019-02-07-20-25-39.bpo-35934.QmfNmY.rst b/Misc/NEWS.d/next/Library/2019-02-07-20-25-39.bpo-35934.QmfNmY.rst deleted file mode 100644 index 0601ac915fc8..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-07-20-25-39.bpo-35934.QmfNmY.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added :meth:`~socket.create_server()` and :meth:`~socket.has_dualstack_ipv6()` -convenience functions to automate the necessary tasks usually involved when -creating a server socket, including accepting both IPv4 and IPv6 connections -on the same socket. (Contributed by Giampaolo Rodola in :issue:`17561`.) diff --git a/Misc/NEWS.d/next/Library/2019-02-13-18-56-22.bpo-17396.oKRkrD.rst b/Misc/NEWS.d/next/Library/2019-02-13-18-56-22.bpo-17396.oKRkrD.rst deleted file mode 100644 index 50596cf9e43f..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-13-18-56-22.bpo-17396.oKRkrD.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`modulefinder` no longer crashes when encountering syntax errors in followed imports. -Patch by Brandt Bucher. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-02-13-18-56-27.bpo-35376.UFhYLj.rst b/Misc/NEWS.d/next/Library/2019-02-13-18-56-27.bpo-35376.UFhYLj.rst deleted file mode 100644 index a9bf8c9a636c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-13-18-56-27.bpo-35376.UFhYLj.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`modulefinder` correctly handles modules that have the same name as a bad package. -Patch by Brandt Bucher. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-02-16-22-19-32.bpo-35936.Ay5WtD.rst b/Misc/NEWS.d/next/Library/2019-02-16-22-19-32.bpo-35936.Ay5WtD.rst deleted file mode 100644 index 55a028ec8349..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-16-22-19-32.bpo-35936.Ay5WtD.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`modulefinder` no longer depends on the deprecated :mod:`imp` module, and the initializer for :class:`modulefinder.ModuleFinder` now has immutable default arguments. -Patch by Brandt Bucher. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-02-17-12-55-51.bpo-36004.hCt_KK.rst b/Misc/NEWS.d/next/Library/2019-02-17-12-55-51.bpo-36004.hCt_KK.rst deleted file mode 100644 index d2162be82f70..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-17-12-55-51.bpo-36004.hCt_KK.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added new alternate constructors :meth:`datetime.date.fromisocalendar` and -:meth:`datetime.datetime.fromisocalendar`, which construct date objects from -ISO year, week number and weekday; these are the inverse of each class's -``isocalendar`` method. Patch by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Library/2019-03-07-20-02-18.bpo-36227.i2Z1XR.rst b/Misc/NEWS.d/next/Library/2019-03-07-20-02-18.bpo-36227.i2Z1XR.rst deleted file mode 100644 index 3b5b6cda09c8..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-07-20-02-18.bpo-36227.i2Z1XR.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added support for keyword arguments `default_namespace` and `xml_declaration` in functions -ElementTree.tostring() and ElementTree.tostringlist(). diff --git a/Misc/NEWS.d/next/Library/2019-03-13-16-48-42.bpo-31904.9sjd38.rst b/Misc/NEWS.d/next/Library/2019-03-13-16-48-42.bpo-31904.9sjd38.rst deleted file mode 100644 index 6fb5c89d41a5..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-13-16-48-42.bpo-31904.9sjd38.rst +++ /dev/null @@ -1 +0,0 @@ -Add time module support and fix test_time faiures for VxWorks. diff --git a/Misc/NEWS.d/next/Library/2019-03-18-16-16-55.bpo-36348.E0w_US.rst b/Misc/NEWS.d/next/Library/2019-03-18-16-16-55.bpo-36348.E0w_US.rst deleted file mode 100644 index 2320b4c05b53..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-18-16-16-55.bpo-36348.E0w_US.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :meth:`imap.IMAP4.logout` method no longer ignores silently arbitrary -exceptions. diff --git a/Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst b/Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst deleted file mode 100644 index 8d1f9d940cc6..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst +++ /dev/null @@ -1,4 +0,0 @@ -Calling ``stop()`` on an unstarted or stopped :func:`unittest.mock.patch` -object will now return `None` instead of raising :exc:`RuntimeError`, -making the method idempotent. -Patch by Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2019-03-22-13-47-52.bpo-36326.WCnEI5.rst b/Misc/NEWS.d/next/Library/2019-03-22-13-47-52.bpo-36326.WCnEI5.rst deleted file mode 100644 index e458a7024da5..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-22-13-47-52.bpo-36326.WCnEI5.rst +++ /dev/null @@ -1,2 +0,0 @@ -inspect.getdoc() can now find docstrings for member objects when __slots__ -is a dictionary. diff --git a/Misc/NEWS.d/next/Library/2019-03-23-17-16-15.bpo-36407.LG3aC4.rst b/Misc/NEWS.d/next/Library/2019-03-23-17-16-15.bpo-36407.LG3aC4.rst deleted file mode 100644 index 3873329a51e1..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-23-17-16-15.bpo-36407.LG3aC4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed wrong indentation writing for CDATA section in xml.dom.minidom. -Patch by Vladimir Surjaninov. diff --git a/Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst b/Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst deleted file mode 100644 index 6e3e050c89bd..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst +++ /dev/null @@ -1 +0,0 @@ -Errors during writing to a ZIP file no longer prevent to properly close it. diff --git a/Misc/NEWS.d/next/Library/2019-03-27-02-09-22.bpo-36385.we2F45.rst b/Misc/NEWS.d/next/Library/2019-03-27-02-09-22.bpo-36385.we2F45.rst deleted file mode 100644 index 26f6dd7d5f47..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-27-02-09-22.bpo-36385.we2F45.rst +++ /dev/null @@ -1 +0,0 @@ -Stop rejecting IPv4 octets for being ambiguously octal. Leading zeros are ignored, and no longer are assumed to specify octal octets. Octets are always decimal numbers. Octets must still be no more than three digits, including leading zeroes. diff --git a/Misc/NEWS.d/next/Library/2019-03-28-21-17-08.bpo-30427.lxzvbw.rst b/Misc/NEWS.d/next/Library/2019-03-28-21-17-08.bpo-30427.lxzvbw.rst deleted file mode 100644 index 80e7c4a15e52..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-28-21-17-08.bpo-30427.lxzvbw.rst +++ /dev/null @@ -1,2 +0,0 @@ -``os.path.normcase()`` relies on ``os.fspath()`` to check the type of its argument. Redundant checks have been removed from its ``posixpath.normcase()`` and ``ntpath.normcase()`` implementations. -Patch by Wolfgang Maier. diff --git a/Misc/NEWS.d/next/Library/2019-03-31-01-18-52.bpo-27181.LVUWcc.rst b/Misc/NEWS.d/next/Library/2019-03-31-01-18-52.bpo-27181.LVUWcc.rst deleted file mode 100644 index 3ce41c557982..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-31-01-18-52.bpo-27181.LVUWcc.rst +++ /dev/null @@ -1 +0,0 @@ -Add statistics.geometric_mean(). diff --git a/Misc/NEWS.d/next/Library/2019-03-31-10-21-54.bpo-36492.f7vyUs.rst b/Misc/NEWS.d/next/Library/2019-03-31-10-21-54.bpo-36492.f7vyUs.rst deleted file mode 100644 index f294bd27b25d..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-31-10-21-54.bpo-36492.f7vyUs.rst +++ /dev/null @@ -1,5 +0,0 @@ -Deprecated passing required arguments like *func* as keyword arguments -in functions which should accept arbitrary keyword arguments and pass them -to other function. Arbitrary keyword arguments (even with names "self" and -"func") can now be passed to these functions if the required arguments are -passed as positional arguments. diff --git a/Misc/NEWS.d/next/Library/2019-04-03-20-46-47.bpo-36522.g5x3By.rst b/Misc/NEWS.d/next/Library/2019-04-03-20-46-47.bpo-36522.g5x3By.rst deleted file mode 100644 index 7869526b71c7..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-03-20-46-47.bpo-36522.g5x3By.rst +++ /dev/null @@ -1 +0,0 @@ -If *debuglevel* is set to >0 in :mod:`http.client`, print all values for headers with multiple values for the same header name. Patch by Matt Houglum. diff --git a/Misc/NEWS.d/next/Library/2019-04-05-21-29-53.bpo-36050.x9DRKE.rst b/Misc/NEWS.d/next/Library/2019-04-05-21-29-53.bpo-36050.x9DRKE.rst deleted file mode 100644 index 92318f877b60..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-05-21-29-53.bpo-36050.x9DRKE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Optimized ``http.client.HTTPResponse.read()`` for large response. Patch by -Inada Naoki. diff --git a/Misc/NEWS.d/next/Library/2019-04-06-14-23-00.bpo-36546.YXjbyY.rst b/Misc/NEWS.d/next/Library/2019-04-06-14-23-00.bpo-36546.YXjbyY.rst deleted file mode 100644 index c69aadf3b69e..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-06-14-23-00.bpo-36546.YXjbyY.rst +++ /dev/null @@ -1 +0,0 @@ -Add statistics.quantiles() diff --git a/Misc/NEWS.d/next/Library/2019-04-06-20-25-25.bpo-36232.SClmhb.rst b/Misc/NEWS.d/next/Library/2019-04-06-20-25-25.bpo-36232.SClmhb.rst deleted file mode 100644 index 25290be7c9c5..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-06-20-25-25.bpo-36232.SClmhb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve error message when trying to open existing DBM database that -actually doesn't exist. Patch by Marco Rougeth. diff --git a/Misc/NEWS.d/next/Library/2019-04-08-14-41-22.bpo-34373.lEAl_-.rst b/Misc/NEWS.d/next/Library/2019-04-08-14-41-22.bpo-34373.lEAl_-.rst deleted file mode 100644 index 19b38fef6414..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-08-14-41-22.bpo-34373.lEAl_-.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :func:`time.mktime` error handling on AIX for year before 1970. diff --git a/Misc/NEWS.d/next/Library/2019-04-09-04-08-46.bpo-17561.hOhVnh.rst b/Misc/NEWS.d/next/Library/2019-04-09-04-08-46.bpo-17561.hOhVnh.rst deleted file mode 100644 index e281c22305b9..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-09-04-08-46.bpo-17561.hOhVnh.rst +++ /dev/null @@ -1 +0,0 @@ -Set backlog=None as the default for socket.create_server. diff --git a/Misc/NEWS.d/next/Library/2019-04-09-12-02-35.bpo-36559.LbDRrw.rst b/Misc/NEWS.d/next/Library/2019-04-09-12-02-35.bpo-36559.LbDRrw.rst deleted file mode 100644 index 2f6ee785e7de..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-09-12-02-35.bpo-36559.LbDRrw.rst +++ /dev/null @@ -1,2 +0,0 @@ -The random module now prefers the lean internal _sha512 module over hashlib -for seed(version=2) to optimize import time. diff --git a/Misc/NEWS.d/next/Library/2019-04-09-14-46-28.bpo-33461.SYJM-E.rst b/Misc/NEWS.d/next/Library/2019-04-09-14-46-28.bpo-33461.SYJM-E.rst deleted file mode 100644 index 12b3bceaf8e3..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-09-14-46-28.bpo-33461.SYJM-E.rst +++ /dev/null @@ -1,2 +0,0 @@ -``json.loads`` now emits ``DeprecationWarning`` when ``encoding`` option is -specified. Patch by Matthias Bussonnier. diff --git a/Misc/NEWS.d/next/Library/2019-04-09-22-40-52.bpo-36575.Vg_p92.rst b/Misc/NEWS.d/next/Library/2019-04-09-22-40-52.bpo-36575.Vg_p92.rst deleted file mode 100644 index 3e305f132c07..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-09-22-40-52.bpo-36575.Vg_p92.rst +++ /dev/null @@ -1,4 +0,0 @@ -The ``_lsprof`` module now uses internal timer same to ``time.perf_counter()`` by default. -``gettimeofday(2)`` was used on Unix. New timer has better resolution on most Unix -platforms and timings are no longer impacted by system clock updates since ``perf_counter()`` -is monotonic. Patch by Inada Naoki. diff --git a/Misc/NEWS.d/next/Library/2019-04-11-16-09-42.bpo-18748.QW7upB.rst b/Misc/NEWS.d/next/Library/2019-04-11-16-09-42.bpo-18748.QW7upB.rst deleted file mode 100644 index 2e0cef8d1818..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-11-16-09-42.bpo-18748.QW7upB.rst +++ /dev/null @@ -1,3 +0,0 @@ -In development mode (:option:`-X` ``dev``) and in debug build, the -:class:`io.IOBase` destructor now logs ``close()`` exceptions. These exceptions -are silent by default in release mode. diff --git a/Misc/NEWS.d/next/Library/2019-04-11-22-11-24.bpo-36598.hfzDUl.rst b/Misc/NEWS.d/next/Library/2019-04-11-22-11-24.bpo-36598.hfzDUl.rst deleted file mode 100644 index 2a7980209136..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-11-22-11-24.bpo-36598.hfzDUl.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``isinstance`` check for Mock objects with spec when the code is -executed under tracing. Patch by Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst b/Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst deleted file mode 100644 index 8828dccad69c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-12-13-52-15.bpo-36613.hqT1qn.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :mod:`asyncio` wait() not removing callback if exception \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-04-13-23-42-33.bpo-30485.JHhjJS.rst b/Misc/NEWS.d/next/Library/2019-04-13-23-42-33.bpo-30485.JHhjJS.rst deleted file mode 100644 index 900edf8c7553..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-13-23-42-33.bpo-30485.JHhjJS.rst +++ /dev/null @@ -1,3 +0,0 @@ -Path expressions in xml.etree.ElementTree can now avoid explicit namespace -prefixes for tags (or the "{namespace}tag" notation) by passing a default -namespace with an empty string prefix. diff --git a/Misc/NEWS.d/next/Library/2019-04-15-12-22-09.bpo-25430.7_8kqc.rst b/Misc/NEWS.d/next/Library/2019-04-15-12-22-09.bpo-25430.7_8kqc.rst deleted file mode 100644 index 922bdef56ec3..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-15-12-22-09.bpo-25430.7_8kqc.rst +++ /dev/null @@ -1 +0,0 @@ -improve performance of ``IPNetwork.__contains__()`` \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-04-16-17-50-39.bpo-35755.Fg4EXb.rst b/Misc/NEWS.d/next/Library/2019-04-16-17-50-39.bpo-35755.Fg4EXb.rst deleted file mode 100644 index d84f63bf7b83..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-16-17-50-39.bpo-35755.Fg4EXb.rst +++ /dev/null @@ -1,5 +0,0 @@ -:func:`shutil.which` and :func:`distutils.spawn.find_executable` now use -``os.confstr("CS_PATH")`` if available instead of :data:`os.defpath`, if the -``PATH`` environment variable is not set. Moreover, don't use -``os.confstr("CS_PATH")`` nor :data:`os.defpath` if the ``PATH`` environment -variable is set to an empty string. diff --git a/Misc/NEWS.d/next/Library/2019-04-18-16-10-29.bpo-28552.MW1TLt.rst b/Misc/NEWS.d/next/Library/2019-04-18-16-10-29.bpo-28552.MW1TLt.rst deleted file mode 100644 index 2aa30c98c452..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-18-16-10-29.bpo-28552.MW1TLt.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix :mod:`distutils.sysconfig` if :data:`sys.executable` is ``None`` or an -empty string: use :func:`os.getcwd` to initialize ``project_base``. Fix -also the distutils build command: don't use :data:`sys.executable` if it is -``None`` or an empty string. diff --git a/Misc/NEWS.d/next/Library/2019-04-19-15-29-55.bpo-36650._EVdrz.rst b/Misc/NEWS.d/next/Library/2019-04-19-15-29-55.bpo-36650._EVdrz.rst deleted file mode 100644 index de10575fc272..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-19-15-29-55.bpo-36650._EVdrz.rst +++ /dev/null @@ -1,4 +0,0 @@ -The C version of functools.lru_cache() was treating calls with an empty -``**kwargs`` dictionary as being distinct from calls with no keywords at all. -This did not result in an incorrect answer, but it did trigger an unexpected -cache miss. diff --git a/Misc/NEWS.d/next/Library/2019-04-20-09-50-32.bpo-36673.XF4Egb.rst b/Misc/NEWS.d/next/Library/2019-04-20-09-50-32.bpo-36673.XF4Egb.rst deleted file mode 100644 index 76bf914e22b1..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-20-09-50-32.bpo-36673.XF4Egb.rst +++ /dev/null @@ -1,3 +0,0 @@ -The TreeBuilder and XMLPullParser in xml.etree.ElementTree gained support -for parsing comments and processing instructions. -Patch by Stefan Behnel. diff --git a/Misc/NEWS.d/next/Library/2019-04-20-13-10-34.bpo-36676.XF4Egb.rst b/Misc/NEWS.d/next/Library/2019-04-20-13-10-34.bpo-36676.XF4Egb.rst deleted file mode 100644 index e0bede81eec1..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-20-13-10-34.bpo-36676.XF4Egb.rst +++ /dev/null @@ -1,3 +0,0 @@ -The XMLParser() in xml.etree.ElementTree provides namespace prefix context to the -parser target if it defines the callback methods "start_ns()" and/or "end_ns()". -Patch by Stefan Behnel. diff --git a/Misc/NEWS.d/next/Library/2019-04-24-17-08-45.bpo-36669.X4g0fu.rst b/Misc/NEWS.d/next/Library/2019-04-24-17-08-45.bpo-36669.X4g0fu.rst deleted file mode 100644 index 53bdefee12f2..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-24-17-08-45.bpo-36669.X4g0fu.rst +++ /dev/null @@ -1 +0,0 @@ -Add missing matrix multiplication operator support to weakref.proxy. diff --git a/Misc/NEWS.d/next/Library/2019-04-26-10-10-34.bpo-13611.XEF4bg.rst b/Misc/NEWS.d/next/Library/2019-04-26-10-10-34.bpo-13611.XEF4bg.rst deleted file mode 100644 index d01decb9617a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-26-10-10-34.bpo-13611.XEF4bg.rst +++ /dev/null @@ -1,2 +0,0 @@ -The xml.etree.ElementTree packages gained support for C14N 2.0 serialisation. -Patch by Stefan Behnel. diff --git a/Misc/NEWS.d/next/Library/2019-04-26-17-14-20.bpo-36734.p2MaiN.rst b/Misc/NEWS.d/next/Library/2019-04-26-17-14-20.bpo-36734.p2MaiN.rst deleted file mode 100644 index 09341990a63d..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-26-17-14-20.bpo-36734.p2MaiN.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix compilation of ``faulthandler.c`` on HP-UX. Initialize ``stack_t -current_stack`` to zero using ``memset()``. diff --git a/Misc/NEWS.d/next/Library/2019-04-27-21-09-33.bpo-1613500.Ogp4P0.rst b/Misc/NEWS.d/next/Library/2019-04-27-21-09-33.bpo-1613500.Ogp4P0.rst deleted file mode 100644 index 4501819ac360..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-27-21-09-33.bpo-1613500.Ogp4P0.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`fileinput.FileInput` now uses the input file mode to correctly set -the output file mode (previously it was hardcoded to ``'w'``) when -``inplace=True`` is passed to its constructor. diff --git a/Misc/NEWS.d/next/Library/2019-04-28-01-52-39.bpo-26978.Lpm-SI.rst b/Misc/NEWS.d/next/Library/2019-04-28-01-52-39.bpo-26978.Lpm-SI.rst deleted file mode 100644 index 0b14920ad45a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-28-01-52-39.bpo-26978.Lpm-SI.rst +++ /dev/null @@ -1,2 +0,0 @@ -`pathlib.path.link_to()` is now implemented. It creates a hard link pointing -to a path. diff --git a/Misc/NEWS.d/next/Library/2019-04-28-15-01-29.bpo-28238.gdk38f.rst b/Misc/NEWS.d/next/Library/2019-04-28-15-01-29.bpo-28238.gdk38f.rst deleted file mode 100644 index 62003a3d26e6..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-28-15-01-29.bpo-28238.gdk38f.rst +++ /dev/null @@ -1,3 +0,0 @@ -The ``.find*()`` methods of xml.etree.ElementTree can now search for -wildcards like ``{*}tag`` and ``{ns}*`` that match a tag in any namespace -or all tags in a namespace. Patch by Stefan Behnel. diff --git a/Misc/NEWS.d/next/Library/2019-04-29-11-47-06.bpo-35952.3uNuyo.rst b/Misc/NEWS.d/next/Library/2019-04-29-11-47-06.bpo-35952.3uNuyo.rst deleted file mode 100644 index 9aeea90d8162..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-29-11-47-06.bpo-35952.3uNuyo.rst +++ /dev/null @@ -1 +0,0 @@ -Fix pythoninfo when the compiler is missing. diff --git a/Misc/NEWS.d/next/Security/2019-01-17-10-03-48.bpo-35755.GmllIs.rst b/Misc/NEWS.d/next/Security/2019-01-17-10-03-48.bpo-35755.GmllIs.rst deleted file mode 100644 index 959aafd73449..000000000000 --- a/Misc/NEWS.d/next/Security/2019-01-17-10-03-48.bpo-35755.GmllIs.rst +++ /dev/null @@ -1,5 +0,0 @@ -:func:`shutil.which` now uses ``os.confstr("CS_PATH")`` if available and if the -:envvar:`PATH` environment variable is not set. Remove also the current -directory from :data:`posixpath.defpath`. On Unix, :func:`shutil.which` and the -:mod:`subprocess` module no longer search the executable in the current -directory if the :envvar:`PATH` environment variable is not set. diff --git a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst deleted file mode 100644 index ed8027fb4d64..000000000000 --- a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst +++ /dev/null @@ -1 +0,0 @@ -Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause an http.client.InvalidURL exception to be raised. diff --git a/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst b/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst deleted file mode 100644 index d729ed2f3cd5..000000000000 --- a/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes mishandling of pre-normalization characters in urlsplit(). diff --git a/Misc/NEWS.d/next/Tests/2019-03-18-10-47-45.bpo-36341.UXlY0P.rst b/Misc/NEWS.d/next/Tests/2019-03-18-10-47-45.bpo-36341.UXlY0P.rst deleted file mode 100644 index b76447d6cf97..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-03-18-10-47-45.bpo-36341.UXlY0P.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix tests that may fail with PermissionError upon calling bind() on AF_UNIX -sockets. diff --git a/Misc/NEWS.d/next/Tests/2019-03-19-17-39-25.bpo-31904.QxhhRx.rst b/Misc/NEWS.d/next/Tests/2019-03-19-17-39-25.bpo-31904.QxhhRx.rst deleted file mode 100644 index 95771508619e..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-03-19-17-39-25.bpo-31904.QxhhRx.rst +++ /dev/null @@ -1 +0,0 @@ -Fix test_utf8_mode on VxWorks: Python always use UTF-8 on VxWorks. diff --git a/Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst b/Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst deleted file mode 100644 index efc9296ad622..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``_testcapi.pymem_buffer_overflow()``: handle memory allocation failure. diff --git a/Misc/NEWS.d/next/Tests/2019-04-01-16-06-36.bpo-31904.peaceF.rst b/Misc/NEWS.d/next/Tests/2019-04-01-16-06-36.bpo-31904.peaceF.rst deleted file mode 100644 index 6297717e0fc6..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-01-16-06-36.bpo-31904.peaceF.rst +++ /dev/null @@ -1 +0,0 @@ -Fix test_tabnanny on VxWorks: adjust ENOENT error message. diff --git a/Misc/NEWS.d/next/Tests/2019-04-08-09-24-36.bpo-31904.ab03ea.rst b/Misc/NEWS.d/next/Tests/2019-04-08-09-24-36.bpo-31904.ab03ea.rst deleted file mode 100644 index 2b361011abae..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-08-09-24-36.bpo-31904.ab03ea.rst +++ /dev/null @@ -1 +0,0 @@ -Port test_resource to VxWorks: skip tests cases setting RLIMIT_FSIZE and RLIMIT_CPU. diff --git a/Misc/NEWS.d/next/Tests/2019-04-08-19-01-21.bpo-36565.2bxgtU.rst b/Misc/NEWS.d/next/Tests/2019-04-08-19-01-21.bpo-36565.2bxgtU.rst deleted file mode 100644 index 8a14d08ba88f..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-08-19-01-21.bpo-36565.2bxgtU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix reference hunting (``python3 -m test -R 3:3``) when Python has no -built-in abc module. diff --git a/Misc/NEWS.d/next/Tests/2019-04-09-14-08-02.bpo-36560._ejeOr.rst b/Misc/NEWS.d/next/Tests/2019-04-09-14-08-02.bpo-36560._ejeOr.rst deleted file mode 100644 index ad0f681ae877..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-09-14-08-02.bpo-36560._ejeOr.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix reference leak hunting in regrtest: compute also deltas (of reference -count, allocated memory blocks, file descriptor count) during warmup, to -ensure that everything is initialized before starting to hunt reference -leaks. diff --git a/Misc/NEWS.d/next/Tests/2019-04-12-12-44-42.bpo-36611.UtorXL.rst b/Misc/NEWS.d/next/Tests/2019-04-12-12-44-42.bpo-36611.UtorXL.rst deleted file mode 100644 index e4da7f1099f8..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-12-12-44-42.bpo-36611.UtorXL.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``test_sys.test_getallocatedblocks()`` when :mod:`tracemalloc` is -enabled. diff --git a/Misc/NEWS.d/next/Tests/2019-04-15-11-57-39.bpo-36629.ySnaL3.rst b/Misc/NEWS.d/next/Tests/2019-04-15-11-57-39.bpo-36629.ySnaL3.rst deleted file mode 100644 index 0837a233d582..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-15-11-57-39.bpo-36629.ySnaL3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``test_imap4_host_default_value()`` of ``test_imaplib``: catch also -:data:`errno.ENETUNREACH` error. diff --git a/Misc/NEWS.d/next/Tests/2019-04-15-16-55-49.bpo-36635.__FTq9.rst b/Misc/NEWS.d/next/Tests/2019-04-15-16-55-49.bpo-36635.__FTq9.rst deleted file mode 100644 index 855d1cb27764..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-15-16-55-49.bpo-36635.__FTq9.rst +++ /dev/null @@ -1 +0,0 @@ -Add a new :mod:`_testinternalcapi` module to test the internal C API. diff --git a/Misc/NEWS.d/next/Tests/2019-04-21-17-53-50.bpo-32424.Q4rBmn.rst b/Misc/NEWS.d/next/Tests/2019-04-21-17-53-50.bpo-32424.Q4rBmn.rst deleted file mode 100644 index f057d7e7730e..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-21-17-53-50.bpo-32424.Q4rBmn.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix typo in test_cyclic_gc() test for xml.etree.ElementTree. Patch by Gordon -P. Hemsley. diff --git a/Misc/NEWS.d/next/Tests/2019-04-21-17-55-18.bpo-32424.yDy49h.rst b/Misc/NEWS.d/next/Tests/2019-04-21-17-55-18.bpo-32424.yDy49h.rst deleted file mode 100644 index bb0839f7a318..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-21-17-55-18.bpo-32424.yDy49h.rst +++ /dev/null @@ -1 +0,0 @@ -Improve test coverage for xml.etree.ElementTree. Patch by Gordon P. Hemsley. diff --git a/Misc/NEWS.d/next/Tests/2019-04-23-17-48-11.bpo-36454.0q4lQz.rst b/Misc/NEWS.d/next/Tests/2019-04-23-17-48-11.bpo-36454.0q4lQz.rst deleted file mode 100644 index 151c7ab04040..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-23-17-48-11.bpo-36454.0q4lQz.rst +++ /dev/null @@ -1,3 +0,0 @@ -Change test_time.test_monotonic() to test only the lower bound of elapsed time -after a sleep command rather than the upper bound. This prevents unnecessary -test failures on slow buildbots. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2019-04-26-04-12-29.bpo-36725.B8-ghi.rst b/Misc/NEWS.d/next/Tests/2019-04-26-04-12-29.bpo-36725.B8-ghi.rst deleted file mode 100644 index b632c46d2b67..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-26-04-12-29.bpo-36725.B8-ghi.rst +++ /dev/null @@ -1,3 +0,0 @@ -When using mulitprocessing mode (-jN), regrtest now better reports errors if -a worker process fails, and it exits immediately on a worker thread failure -or when interrupted. diff --git a/Misc/NEWS.d/next/Tests/2019-04-26-09-02-49.bpo-36719.ys2uqH.rst b/Misc/NEWS.d/next/Tests/2019-04-26-09-02-49.bpo-36719.ys2uqH.rst deleted file mode 100644 index 4b6ef76bc6d6..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-04-26-09-02-49.bpo-36719.ys2uqH.rst +++ /dev/null @@ -1,4 +0,0 @@ -regrtest now always detects uncollectable objects. Previously, the check was -only enabled by ``--findleaks``. The check now also works with -``-jN/--multiprocess N``. ``--findleaks`` becomes a deprecated alias to -``--fail-env-changed``. diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst b/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst deleted file mode 100644 index b8659b886af8..000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2019-04-30-14-30-29.bpo-14546.r38Y-6.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the argument handling in Tools/scripts/lll.py. diff --git a/Misc/NEWS.d/next/Windows/2017-10-04-12-40-45.bpo-31512.YQeBt2.rst b/Misc/NEWS.d/next/Windows/2017-10-04-12-40-45.bpo-31512.YQeBt2.rst deleted file mode 100644 index a6dbb5c0639b..000000000000 --- a/Misc/NEWS.d/next/Windows/2017-10-04-12-40-45.bpo-31512.YQeBt2.rst +++ /dev/null @@ -1,2 +0,0 @@ -With the Windows 10 Creators Update, non-elevated users can now create -symlinks as long as the computer has Developer Mode enabled. diff --git a/Misc/NEWS.d/next/Windows/2018-07-20-13-09-19.bpo-34060.v-z87j.rst b/Misc/NEWS.d/next/Windows/2018-07-20-13-09-19.bpo-34060.v-z87j.rst deleted file mode 100644 index b77d805b7f2a..000000000000 --- a/Misc/NEWS.d/next/Windows/2018-07-20-13-09-19.bpo-34060.v-z87j.rst +++ /dev/null @@ -1,2 +0,0 @@ -Report system load when running test suite on Windows. Patch by Ammar Askar. -Based on prior work by Jeremy Kloth. diff --git a/Misc/NEWS.d/next/Windows/2019-02-11-14-53-17.bpo-35947.9vI4hP.rst b/Misc/NEWS.d/next/Windows/2019-02-11-14-53-17.bpo-35947.9vI4hP.rst deleted file mode 100644 index ae3c5a751b46..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-02-11-14-53-17.bpo-35947.9vI4hP.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added current version of libffi to cpython-source-deps. -Change _ctypes to use current version of libffi on Windows. diff --git a/Misc/NEWS.d/next/Windows/2019-03-05-18-09-43.bpo-29515.vwUTv0.rst b/Misc/NEWS.d/next/Windows/2019-03-05-18-09-43.bpo-29515.vwUTv0.rst deleted file mode 100644 index 2f3f0991d9a2..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-03-05-18-09-43.bpo-29515.vwUTv0.rst +++ /dev/null @@ -1,27 +0,0 @@ -Add the following socket module constants on Windows: -IPPROTO_AH -IPPROTO_CBT -IPPROTO_DSTOPTS -IPPROTO_EGP -IPPROTO_ESP -IPPROTO_FRAGMENT -IPPROTO_GGP -IPPROTO_HOPOPTS -IPPROTO_ICLFXBM -IPPROTO_ICMPV6 -IPPROTO_IDP -IPPROTO_IGMP -IPPROTO_IGP -IPPROTO_IPV4 -IPPROTO_IPV6 -IPPROTO_L2TP -IPPROTO_MAX -IPPROTO_ND -IPPROTO_NONE -IPPROTO_PGM -IPPROTO_PIM -IPPROTO_PUP -IPPROTO_RDP -IPPROTO_ROUTING -IPPROTO_SCTP -IPPROTO_ST diff --git a/Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst b/Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst deleted file mode 100644 index 32c57c49ae41..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst +++ /dev/null @@ -1 +0,0 @@ -Add the venv standard library module to the nuget distribution for Windows. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2019-03-18-11-44-49.bpo-36085.mLfxfc.rst b/Misc/NEWS.d/next/Windows/2019-03-18-11-44-49.bpo-36085.mLfxfc.rst deleted file mode 100644 index 41f23e655652..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-03-18-11-44-49.bpo-36085.mLfxfc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Enable better DLL resolution on Windows by using safe DLL search paths and -adding :func:`os.add_dll_directory`. diff --git a/Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst b/Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst deleted file mode 100644 index b27abff62098..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes creating a venv when debug binaries are installed. diff --git a/Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst b/Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst deleted file mode 100644 index cda654bfa5b9..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst +++ /dev/null @@ -1,3 +0,0 @@ -enum_certificates function of the ssl module now returns certificates from all available certificate stores inside windows in a query instead of returning only certificates from the system wide certificate store. -This includes certificates from these certificate stores: local machine, local machine enterprise, local machine group policy, current user, current user group policy, services, users. -ssl.enum_crls() function is changed in the same way to return all certificate revocation lists inside the windows certificate revocation list stores. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2019-04-02-10-11-18.bpo-36509.DdaM67.rst b/Misc/NEWS.d/next/Windows/2019-04-02-10-11-18.bpo-36509.DdaM67.rst deleted file mode 100644 index 722f7638a144..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-04-02-10-11-18.bpo-36509.DdaM67.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added preset-iot layout for Windows IoT ARM containers. This layout doesn't -contain UI components like tkinter or IDLE. It also doesn't contain files to -support on-target builds since Windows ARM32 builds must be cross-compiled -when using MSVC. diff --git a/Misc/NEWS.d/next/Windows/2019-04-10-04-35-31.bpo-34144._KzB5z.rst b/Misc/NEWS.d/next/Windows/2019-04-10-04-35-31.bpo-34144._KzB5z.rst deleted file mode 100644 index 7b8ca821b401..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-04-10-04-35-31.bpo-34144._KzB5z.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed activate.bat to correctly update codepage when chcp.com returns dots in output. -Patch by Lorenz Mende. diff --git a/Misc/NEWS.d/next/Windows/2019-04-17-11-39-24.bpo-36649.arbzIo.rst b/Misc/NEWS.d/next/Windows/2019-04-17-11-39-24.bpo-36649.arbzIo.rst deleted file mode 100644 index 8b44feb9f4c0..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-04-17-11-39-24.bpo-36649.arbzIo.rst +++ /dev/null @@ -1 +0,0 @@ -Remove trailing spaces for registry keys when installed via the Store. diff --git a/Misc/NEWS.d/next/Windows/2019-04-22-16-59-20.bpo-35920.VSfGOI.rst b/Misc/NEWS.d/next/Windows/2019-04-22-16-59-20.bpo-35920.VSfGOI.rst deleted file mode 100644 index 455e82450eb2..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-04-22-16-59-20.bpo-35920.VSfGOI.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added platform.win32_edition() and platform.win32_is_iot(). Added support -for cross-compiling packages for Windows ARM32. Skip tests that are not -expected to work on Windows IoT Core ARM32. diff --git a/Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst b/Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst deleted file mode 100644 index 6f7ac881c82e..000000000000 --- a/Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Avoid failures setting macOS stack resource limit with resource.setrlimit. -This reverts an earlier fix for bpo-18075 which forced a non-default stack -size when building the interpreter executable on macOS. diff --git a/README.rst b/README.rst index 0f0c32b7cf50..388543b8dcfc 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.8.0 alpha 3 +This is Python version 3.8.0 alpha 4 ==================================== .. image:: https://travis-ci.org/python/cpython.svg?branch=master From webhook-mailer at python.org Tue May 7 11:00:28 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Tue, 07 May 2019 15:00:28 -0000 Subject: [Python-checkins] bpo-36783: Added C API Documentation for Time_FromTimeAndFold and PyDateTime_FromDateAndTimeAndFold (GH-13147) Message-ID: https://github.com/python/cpython/commit/5765ecf79fcee987f2f97c246c64b494324dfd33 commit: 5765ecf79fcee987f2f97c246c64b494324dfd33 branch: master author: Edison A <20975616+SimiCode at users.noreply.github.com> committer: Cheryl Sabella date: 2019-05-07T11:00:21-04:00 summary: bpo-36783: Added C API Documentation for Time_FromTimeAndFold and PyDateTime_FromDateAndTimeAndFold (GH-13147) files: A Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst M Doc/c-api/datetime.rst diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index 78724619ea3c..b7949e235005 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -98,6 +98,22 @@ Macros to create objects: minute, second and microsecond. +.. c:function:: PyObject* PyDateTime_FromDateAndTimeAndFold(int year, int month, int day, int hour, int minute, int second, int usecond, int fold) + + Return a :class:`datetime.datetime` object with the specified year, month, day, hour, + minute, second, microsecond and fold. + + .. versionadded:: 3.6 + + +.. c:function:: PyObject* PyTime_FromTimeAndFold(int hour, int minute, int second, int usecond, int fold) + + Return a :class:`datetime.time` object with the specified hour, minute, second, + microsecond and fold. + + .. versionadded:: 3.6 + + .. c:function:: PyObject* PyTime_FromTime(int hour, int minute, int second, int usecond) Return a :class:`datetime.time` object with the specified hour, minute, second and diff --git a/Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst b/Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst new file mode 100644 index 000000000000..d3cbf4f6e13e --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst @@ -0,0 +1,2 @@ +Added C API Documentation for Time_FromTimeAndFold and PyDateTime_FromDateAndTimeAndFold as per PEP 495. +Patch by Edison Abahurire. \ No newline at end of file From webhook-mailer at python.org Tue May 7 11:17:53 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 15:17:53 -0000 Subject: [Python-checkins] bpo-36783: Added C API Documentation for Time_FromTimeAndFold and PyDateTime_FromDateAndTimeAndFold (GH-13147) Message-ID: https://github.com/python/cpython/commit/146010ea42fb949a48a1b79a13503995a5176833 commit: 146010ea42fb949a48a1b79a13503995a5176833 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-07T08:17:50-07:00 summary: bpo-36783: Added C API Documentation for Time_FromTimeAndFold and PyDateTime_FromDateAndTimeAndFold (GH-13147) (cherry picked from commit 5765ecf79fcee987f2f97c246c64b494324dfd33) Co-authored-by: Edison A <20975616+SimiCode at users.noreply.github.com> files: A Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst M Doc/c-api/datetime.rst diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index 78724619ea3c..b7949e235005 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -98,6 +98,22 @@ Macros to create objects: minute, second and microsecond. +.. c:function:: PyObject* PyDateTime_FromDateAndTimeAndFold(int year, int month, int day, int hour, int minute, int second, int usecond, int fold) + + Return a :class:`datetime.datetime` object with the specified year, month, day, hour, + minute, second, microsecond and fold. + + .. versionadded:: 3.6 + + +.. c:function:: PyObject* PyTime_FromTimeAndFold(int hour, int minute, int second, int usecond, int fold) + + Return a :class:`datetime.time` object with the specified hour, minute, second, + microsecond and fold. + + .. versionadded:: 3.6 + + .. c:function:: PyObject* PyTime_FromTime(int hour, int minute, int second, int usecond) Return a :class:`datetime.time` object with the specified hour, minute, second and diff --git a/Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst b/Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst new file mode 100644 index 000000000000..d3cbf4f6e13e --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst @@ -0,0 +1,2 @@ +Added C API Documentation for Time_FromTimeAndFold and PyDateTime_FromDateAndTimeAndFold as per PEP 495. +Patch by Edison Abahurire. \ No newline at end of file From webhook-mailer at python.org Tue May 7 11:27:53 2019 From: webhook-mailer at python.org (Julien Palard) Date: Tue, 07 May 2019 15:27:53 -0000 Subject: [Python-checkins] bpo-28795: Signal documentation: Fix misleading statement. (GH-13121) Message-ID: https://github.com/python/cpython/commit/e85ef7a7eacdef2f43e6bf2e67f335100e7ef2da commit: e85ef7a7eacdef2f43e6bf2e67f335100e7ef2da branch: master author: Julien Palard committer: GitHub date: 2019-05-07T17:27:48+02:00 summary: bpo-28795: Signal documentation: Fix misleading statement. (GH-13121) files: M Doc/library/signal.rst diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index ac6cad9aff8e..01200b4df880 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -16,7 +16,8 @@ The :func:`signal.signal` function allows defining custom handlers to be executed when a signal is received. A small number of default handlers are installed: :const:`SIGPIPE` is ignored (so write errors on pipes and sockets can be reported as ordinary Python exceptions) and :const:`SIGINT` is -translated into a :exc:`KeyboardInterrupt` exception. +translated into a :exc:`KeyboardInterrupt` exception if the parent process +has not changed it. A handler for a particular signal, once set, remains installed until it is explicitly reset (Python emulates the BSD style interface regardless of the From webhook-mailer at python.org Tue May 7 11:28:52 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Tue, 07 May 2019 15:28:52 -0000 Subject: [Python-checkins] bpo-30458: Disallow control chars in http URLs. (GH-12755) (GH-13154) Message-ID: https://github.com/python/cpython/commit/7e200e0763f5b71c199aaf98bd5588f291585619 commit: 7e200e0763f5b71c199aaf98bd5588f291585619 branch: 3.7 author: Miro Hron?ok committer: Gregory P. Smith date: 2019-05-07T11:28:47-04:00 summary: bpo-30458: Disallow control chars in http URLs. (GH-12755) (GH-13154) Disallow control chars in http URLs in urllib.urlopen. This addresses a potential security problem for applications that do not sanity check their URLs where http request headers could be injected. Disable https related urllib tests on a build without ssl (GH-13032) These tests require an SSL enabled build. Skip these tests when python is built without SSL to fix test failures. Use http.client.InvalidURL instead of ValueError as the new error case's exception. (GH-13044) Backport Co-Authored-By: Miro Hron?ok files: A Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst M Lib/http/client.py M Lib/test/test_urllib.py M Lib/test/test_xmlrpc.py diff --git a/Lib/http/client.py b/Lib/http/client.py index 1de151c38e92..2afd452fe30f 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -140,6 +140,16 @@ _is_legal_header_name = re.compile(rb'[^:\s][^:\r\n]*').fullmatch _is_illegal_header_value = re.compile(rb'\n(?![ \t])|\r(?![ \t\n])').search +# These characters are not allowed within HTTP URL paths. +# See https://tools.ietf.org/html/rfc3986#section-3.3 and the +# https://tools.ietf.org/html/rfc3986#appendix-A pchar definition. +# Prevents CVE-2019-9740. Includes control characters such as \r\n. +# We don't restrict chars above \x7f as putrequest() limits us to ASCII. +_contains_disallowed_url_pchar_re = re.compile('[\x00-\x20\x7f]') +# Arguably only these _should_ allowed: +# _is_allowed_url_pchars_re = re.compile(r"^[/!$&'()*+,;=:@%a-zA-Z0-9._~-]+$") +# We are more lenient for assumed real world compatibility purposes. + # We always set the Content-Length header for these methods because some # servers will otherwise respond with a 411 _METHODS_EXPECTING_BODY = {'PATCH', 'POST', 'PUT'} @@ -1101,6 +1111,11 @@ def putrequest(self, method, url, skip_host=False, self._method = method if not url: url = '/' + # Prevent CVE-2019-9740. + match = _contains_disallowed_url_pchar_re.search(url) + if match: + raise InvalidURL(f"URL can't contain control characters. {url!r} " + f"(found at least {match.group()!r})") request = '%s %s %s' % (method, url, self._http_vsn_str) # Non-ASCII characters should have been eliminated earlier diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 2ac73b58d832..7214492eca9d 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -329,6 +329,59 @@ def test_willclose(self): finally: self.unfakehttp() + @unittest.skipUnless(ssl, "ssl module required") + def test_url_with_control_char_rejected(self): + for char_no in list(range(0, 0x21)) + [0x7f]: + char = chr(char_no) + schemeless_url = f"//localhost:7777/test{char}/" + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + try: + # We explicitly test urllib.request.urlopen() instead of the top + # level 'def urlopen()' function defined in this... (quite ugly) + # test suite. They use different url opening codepaths. Plain + # urlopen uses FancyURLOpener which goes via a codepath that + # calls urllib.parse.quote() on the URL which makes all of the + # above attempts at injection within the url _path_ safe. + escaped_char_repr = repr(char).replace('\\', r'\\') + InvalidURL = http.client.InvalidURL + with self.assertRaisesRegex( + InvalidURL, f"contain control.*{escaped_char_repr}"): + urllib.request.urlopen(f"http:{schemeless_url}") + with self.assertRaisesRegex( + InvalidURL, f"contain control.*{escaped_char_repr}"): + urllib.request.urlopen(f"https:{schemeless_url}") + # This code path quotes the URL so there is no injection. + resp = urlopen(f"http:{schemeless_url}") + self.assertNotIn(char, resp.geturl()) + finally: + self.unfakehttp() + + @unittest.skipUnless(ssl, "ssl module required") + def test_url_with_newline_header_injection_rejected(self): + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + host = "localhost:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123" + schemeless_url = "//" + host + ":8080/test/?test=a" + try: + # We explicitly test urllib.request.urlopen() instead of the top + # level 'def urlopen()' function defined in this... (quite ugly) + # test suite. They use different url opening codepaths. Plain + # urlopen uses FancyURLOpener which goes via a codepath that + # calls urllib.parse.quote() on the URL which makes all of the + # above attempts at injection within the url _path_ safe. + InvalidURL = http.client.InvalidURL + with self.assertRaisesRegex( + InvalidURL, r"contain control.*\\r.*(found at least . .)"): + urllib.request.urlopen(f"http:{schemeless_url}") + with self.assertRaisesRegex(InvalidURL, r"contain control.*\\n"): + urllib.request.urlopen(f"https:{schemeless_url}") + # This code path quotes the URL so there is no injection. + resp = urlopen(f"http:{schemeless_url}") + self.assertNotIn(' ', resp.geturl()) + self.assertNotIn('\r', resp.geturl()) + self.assertNotIn('\n', resp.geturl()) + finally: + self.unfakehttp() + def test_read_0_9(self): # "0.9" response accepted (but not "simple responses" without # a status line) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 32263f7f0b3b..0e002ec4ef9f 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -945,7 +945,12 @@ def test_unicode_host(self): def test_partial_post(self): # Check that a partial POST doesn't make the server loop: issue #14001. conn = http.client.HTTPConnection(ADDR, PORT) - conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') + conn.send('POST /RPC2 HTTP/1.0\r\n' + 'Content-Length: 100\r\n\r\n' + 'bye HTTP/1.1\r\n' + f'Host: {ADDR}:{PORT}\r\n' + 'Accept-Encoding: identity\r\n' + 'Content-Length: 0\r\n\r\n'.encode('ascii')) conn.close() def test_context_manager(self): diff --git a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst new file mode 100644 index 000000000000..ed8027fb4d64 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst @@ -0,0 +1 @@ +Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause an http.client.InvalidURL exception to be raised. From webhook-mailer at python.org Tue May 7 11:55:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 15:55:43 -0000 Subject: [Python-checkins] bpo-28795: Signal documentation: Fix misleading statement. (GH-13121) Message-ID: https://github.com/python/cpython/commit/721729fca4fab9fd11861844880b3f3780015ae0 commit: 721729fca4fab9fd11861844880b3f3780015ae0 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-07T08:55:39-07:00 summary: bpo-28795: Signal documentation: Fix misleading statement. (GH-13121) (cherry picked from commit e85ef7a7eacdef2f43e6bf2e67f335100e7ef2da) Co-authored-by: Julien Palard files: M Doc/library/signal.rst diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 148a59c7105e..b6716eea95fb 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -16,7 +16,8 @@ The :func:`signal.signal` function allows defining custom handlers to be executed when a signal is received. A small number of default handlers are installed: :const:`SIGPIPE` is ignored (so write errors on pipes and sockets can be reported as ordinary Python exceptions) and :const:`SIGINT` is -translated into a :exc:`KeyboardInterrupt` exception. +translated into a :exc:`KeyboardInterrupt` exception if the parent process +has not changed it. A handler for a particular signal, once set, remains installed until it is explicitly reset (Python emulates the BSD style interface regardless of the From webhook-mailer at python.org Tue May 7 12:18:26 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Tue, 07 May 2019 16:18:26 -0000 Subject: [Python-checkins] bpo-36533: Reinit logging.Handler locks on fork(). (GH-12704) Message-ID: https://github.com/python/cpython/commit/64aa6d2000665efb1a2eccae176df9520bf5f5e6 commit: 64aa6d2000665efb1a2eccae176df9520bf5f5e6 branch: master author: Gregory P. Smith committer: GitHub date: 2019-05-07T12:18:20-04:00 summary: bpo-36533: Reinit logging.Handler locks on fork(). (GH-12704) Instead of attempting to acquire and release them all across fork which was leading to deadlocks in some applications that had chained their own handlers while holding multiple locks. files: A Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst M Lib/logging/__init__.py M Lib/test/test_logging.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index e093982a0cdf..07a0c0c4ae98 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -231,49 +231,38 @@ def _releaseLock(): # Prevent a held logging lock from blocking a child from logging. if not hasattr(os, 'register_at_fork'): # Windows and friends. - def _register_at_fork_acquire_release(instance): + def _register_at_fork_reinit_lock(instance): pass # no-op when os.register_at_fork does not exist. -else: # The os.register_at_fork API exists - os.register_at_fork(before=_acquireLock, - after_in_child=_releaseLock, - after_in_parent=_releaseLock) - - # A collection of instances with acquire and release methods (logging.Handler) - # to be called before and after fork. The weakref avoids us keeping discarded - # Handler instances alive forever in case an odd program creates and destroys - # many over its lifetime. - _at_fork_acquire_release_weakset = weakref.WeakSet() - - - def _register_at_fork_acquire_release(instance): - # We put the instance itself in a single WeakSet as we MUST have only - # one atomic weak ref. used by both before and after atfork calls to - # guarantee matched pairs of acquire and release calls. - _at_fork_acquire_release_weakset.add(instance) - +else: + # A collection of instances with a createLock method (logging.Handler) + # to be called in the child after forking. The weakref avoids us keeping + # discarded Handler instances alive. A set is used to avoid accumulating + # duplicate registrations as createLock() is responsible for registering + # a new Handler instance with this set in the first place. + _at_fork_reinit_lock_weakset = weakref.WeakSet() + + def _register_at_fork_reinit_lock(instance): + _acquireLock() + try: + _at_fork_reinit_lock_weakset.add(instance) + finally: + _releaseLock() - def _at_fork_weak_calls(method_name): - for instance in _at_fork_acquire_release_weakset: - method = getattr(instance, method_name) + def _after_at_fork_child_reinit_locks(): + # _acquireLock() was called in the parent before forking. + for handler in _at_fork_reinit_lock_weakset: try: - method() + handler.createLock() except Exception as err: # Similar to what PyErr_WriteUnraisable does. print("Ignoring exception from logging atfork", instance, - method_name, "method:", err, file=sys.stderr) - - - def _before_at_fork_weak_calls(): - _at_fork_weak_calls('acquire') + "._reinit_lock() method:", err, file=sys.stderr) + _releaseLock() # Acquired by os.register_at_fork(before=. - def _after_at_fork_weak_calls(): - _at_fork_weak_calls('release') - - - os.register_at_fork(before=_before_at_fork_weak_calls, - after_in_child=_after_at_fork_weak_calls, - after_in_parent=_after_at_fork_weak_calls) + os.register_at_fork(before=_acquireLock, + after_in_child=_after_at_fork_child_reinit_locks, + after_in_parent=_releaseLock) #--------------------------------------------------------------------------- @@ -900,7 +889,7 @@ def createLock(self): Acquire a thread lock for serializing access to the underlying I/O. """ self.lock = threading.RLock() - _register_at_fork_acquire_release(self) + _register_at_fork_reinit_lock(self) def acquire(self): """ diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 82cbedada472..950217cec288 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -668,10 +668,28 @@ def remove_loop(fname, tries): # register_at_fork mechanism is also present and used. @unittest.skipIf(not hasattr(os, 'fork'), 'Test requires os.fork().') def test_post_fork_child_no_deadlock(self): - """Ensure forked child logging locks are not held; bpo-6721.""" - refed_h = logging.Handler() + """Ensure child logging locks are not held; bpo-6721 & bpo-36533.""" + class _OurHandler(logging.Handler): + def __init__(self): + super().__init__() + self.sub_handler = logging.StreamHandler( + stream=open('/dev/null', 'wt')) + + def emit(self, record): + self.sub_handler.acquire() + try: + self.sub_handler.emit(record) + finally: + self.sub_handler.release() + + self.assertEqual(len(logging._handlers), 0) + refed_h = _OurHandler() refed_h.name = 'because we need at least one for this test' self.assertGreater(len(logging._handlers), 0) + self.assertGreater(len(logging._at_fork_reinit_lock_weakset), 1) + test_logger = logging.getLogger('test_post_fork_child_no_deadlock') + test_logger.addHandler(refed_h) + test_logger.setLevel(logging.DEBUG) locks_held__ready_to_fork = threading.Event() fork_happened__release_locks_and_end_thread = threading.Event() @@ -709,19 +727,24 @@ def lock_holder_thread_fn(): locks_held__ready_to_fork.wait() pid = os.fork() if pid == 0: # Child. - logging.error(r'Child process did not deadlock. \o/') - os._exit(0) + try: + test_logger.info(r'Child process did not deadlock. \o/') + finally: + os._exit(0) else: # Parent. + test_logger.info(r'Parent process returned from fork. \o/') fork_happened__release_locks_and_end_thread.set() lock_holder_thread.join() start_time = time.monotonic() while True: + test_logger.debug('Waiting for child process.') waited_pid, status = os.waitpid(pid, os.WNOHANG) if waited_pid == pid: break # child process exited. if time.monotonic() - start_time > 7: break # so long? implies child deadlock. time.sleep(0.05) + test_logger.debug('Done waiting.') if waited_pid != pid: os.kill(pid, signal.SIGKILL) waited_pid, status = os.waitpid(pid, 0) diff --git a/Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst b/Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst new file mode 100644 index 000000000000..15c4222d4837 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst @@ -0,0 +1,6 @@ +Reinitialize logging.Handler locks in forked child processes instead of +attempting to acquire them all in the parent before forking only to be +released in the child process. The acquire/release pattern was leading to +deadlocks in code that has implemented any form of chained logging handlers +that depend upon one another as the lock acquision order cannot be +guaranteed. From webhook-mailer at python.org Tue May 7 13:05:27 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 17:05:27 -0000 Subject: [Python-checkins] bpo-11001: updated cookie docs (GH-13086) Message-ID: https://github.com/python/cpython/commit/91cc01f40eec03ece2d6b04ad9ea786e77707d8d commit: 91cc01f40eec03ece2d6b04ad9ea786e77707d8d branch: master author: Julia Iliuk committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-07T10:05:20-07:00 summary: bpo-11001: updated cookie docs (GH-13086) Used **spookylukey**'s patch from 2011-01-24 https://bugs.python.org/issue11001 files: M Doc/library/http.cookies.rst diff --git a/Doc/library/http.cookies.rst b/Doc/library/http.cookies.rst index f3457a0cdc7b..17792b200599 100644 --- a/Doc/library/http.cookies.rst +++ b/Doc/library/http.cookies.rst @@ -55,8 +55,9 @@ in Cookie name (as :attr:`~Morsel.key`). .. class:: SimpleCookie([input]) This class derives from :class:`BaseCookie` and overrides :meth:`value_decode` - and :meth:`value_encode` to be the identity and :func:`str` respectively. - + and :meth:`value_encode`. SimpleCookie supports strings as cookie values. + When setting the value, SimpleCookie calls the builtin :func:`str()` to convert + the value to a string. Values received from HTTP are kept as strings. .. seealso:: @@ -76,15 +77,16 @@ Cookie Objects .. method:: BaseCookie.value_decode(val) - Return a decoded value from a string representation. Return value can be any - type. This method does nothing in :class:`BaseCookie` --- it exists so it can be - overridden. + Return a tuple ``(real_value, coded_value)`` from a string representation. + ``real_value`` can be any type. This method does no decoding in + :class:`BaseCookie` --- it exists so it can be overridden. .. method:: BaseCookie.value_encode(val) - Return an encoded value. *val* can be any type, but return value must be a - string. This method does nothing in :class:`BaseCookie` --- it exists so it can + Return a tuple ``(real_value, coded_value)``. *val* can be any type, but + ``coded_value`` will always be converted to a string. + This method does no encoding in :class:`BaseCookie` --- it exists so it can be overridden. In general, it should be the case that :meth:`value_encode` and From webhook-mailer at python.org Tue May 7 13:18:54 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 17:18:54 -0000 Subject: [Python-checkins] bpo-31922: Do not connect UDP sockets when broadcast is allowed (GH-423) Message-ID: https://github.com/python/cpython/commit/63deaa5b70108ef441c57728322da6b4321db4fc commit: 63deaa5b70108ef441c57728322da6b4321db4fc branch: master author: Vincent Michel committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-07T10:18:49-07:00 summary: bpo-31922: Do not connect UDP sockets when broadcast is allowed (GH-423) *Moved from python/asyncio#493.* This PR fixes issue python/asyncio#480, as explained in [this comment](https://github.com/python/asyncio/issues/480#issuecomment-278703828). The `_SelectorDatagramTransport.sendto` method has to be modified ~~so `_sock.sendto` is used in all cases (because it is tricky to reliably tell if the socket is connected or not). Could that be an issue for connected sockets?~~ *EDIT* ... so `_sock.send` is used only if `_sock` is connected. It also protects `socket.getsockname` against `OSError` in `_SelectorTransport`. This might happen on Windows if the socket is not connected (e.g. for UDP broadcasting). https://bugs.python.org/issue31922 files: A Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst M Lib/asyncio/base_events.py M Lib/asyncio/selector_events.py M Lib/test/test_asyncio/test_base_events.py M Lib/test/test_asyncio/test_selector_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index c58906f8b489..9613ac2a114f 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1306,7 +1306,8 @@ def _check_sendfile_params(self, sock, file, offset, count): if local_addr: sock.bind(local_address) if remote_addr: - await self.sock_connect(sock, remote_address) + if not allow_broadcast: + await self.sock_connect(sock, remote_address) r_addr = remote_address except OSError as exc: if sock is not None: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 93b688950943..29968214f8ed 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -587,7 +587,10 @@ class _SelectorTransport(transports._FlowControlMixin, def __init__(self, loop, sock, protocol, extra=None, server=None): super().__init__(extra, loop) self._extra['socket'] = sock - self._extra['sockname'] = sock.getsockname() + try: + self._extra['sockname'] = sock.getsockname() + except OSError: + self._extra['sockname'] = None if 'peername' not in self._extra: try: self._extra['peername'] = sock.getpeername() @@ -976,9 +979,11 @@ def sendto(self, data, addr=None): if not data: return - if self._address and addr not in (None, self._address): - raise ValueError( - f'Invalid address: must be None or {self._address}') + if self._address: + if addr not in (None, self._address): + raise ValueError( + f'Invalid address: must be None or {self._address}') + addr = self._address if self._conn_lost and self._address: if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: @@ -989,7 +994,7 @@ def sendto(self, data, addr=None): if not self._buffer: # Attempt to send it right away first. try: - if self._address: + if self._extra['peername']: self._sock.send(data) else: self._sock.sendto(data, addr) @@ -1012,7 +1017,7 @@ def _sendto_ready(self): while self._buffer: data, addr = self._buffer.popleft() try: - if self._address: + if self._extra['peername']: self._sock.send(data) else: self._sock.sendto(data, addr) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index c245c472996e..25420b2ff6fa 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1586,6 +1586,23 @@ def test_create_datagram_endpoint_connect_err(self): self.assertRaises( OSError, self.loop.run_until_complete, coro) + def test_create_datagram_endpoint_allow_broadcast(self): + protocol = MyDatagramProto(create_future=True, loop=self.loop) + self.loop.sock_connect = sock_connect = mock.Mock() + sock_connect.return_value = [] + + coro = self.loop.create_datagram_endpoint( + lambda: protocol, + remote_addr=('127.0.0.1', 0), + allow_broadcast=True) + + transport, _ = self.loop.run_until_complete(coro) + self.assertFalse(sock_connect.called) + + transport.close() + self.loop.run_until_complete(protocol.done) + self.assertEqual('CLOSED', protocol.state) + @patch_socket def test_create_datagram_endpoint_socket_err(self, m_socket): m_socket.getaddrinfo = socket.getaddrinfo diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index d0d171a9853a..bf721b0005b0 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1065,6 +1065,7 @@ def setUp(self): self.sock.fileno.return_value = 7 def datagram_transport(self, address=None): + self.sock.getpeername.side_effect = None if address else OSError transport = _SelectorDatagramTransport(self.loop, self.sock, self.protocol, address=address) diff --git a/Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst b/Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst new file mode 100644 index 000000000000..df3881bffaaa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst @@ -0,0 +1,3 @@ +:meth:`asyncio.AbstractEventLoop.create_datagram_endpoint`: +Do not connect UDP socket when broadcast is allowed. +This allows to receive replies after a UDP broadcast. From webhook-mailer at python.org Tue May 7 13:31:17 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Tue, 07 May 2019 17:31:17 -0000 Subject: [Python-checkins] Don't import wait from connection, it shadows a name (GH-13112) Message-ID: https://github.com/python/cpython/commit/f7bda5c5729a3cc69b32c2a3baf5c64dea666d33 commit: f7bda5c5729a3cc69b32c2a3baf5c64dea666d33 branch: master author: Brian Quinlan committer: Gregory P. Smith date: 2019-05-07T13:31:11-04:00 summary: Don't import wait from connection, it shadows a name (GH-13112) (lint cleanup) This import causes an argument parameter to shadow the global import name. files: M Lib/concurrent/futures/process.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 21bf4a447f08..d7e2478d9227 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -51,7 +51,7 @@ import queue from queue import Full import multiprocessing as mp -from multiprocessing.connection import wait +import multiprocessing.connection from multiprocessing.queues import Queue import threading import weakref @@ -352,7 +352,7 @@ def shutdown_worker(): # submitted, from the executor being shutdown/gc-ed, or from the # shutdown of the python interpreter. worker_sentinels = [p.sentinel for p in processes.values()] - ready = wait(readers + worker_sentinels) + ready = mp.connection.wait(readers + worker_sentinels) cause = None is_broken = True From webhook-mailer at python.org Tue May 7 13:32:49 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 17:32:49 -0000 Subject: [Python-checkins] [3.7] bpo-11001: updated cookie docs (GH-13086) (GH-13161) Message-ID: https://github.com/python/cpython/commit/1fe722cf14db0f786d6df1ff4392f44d37a9f867 commit: 1fe722cf14db0f786d6df1ff4392f44d37a9f867 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-07T10:32:45-07:00 summary: [3.7] bpo-11001: updated cookie docs (GH-13086) (GH-13161) Used **spookylukey**'s patch from 2011-01-24 https://bugs.python.org/issue11001 (cherry picked from commit 91cc01f40eec03ece2d6b04ad9ea786e77707d8d) Co-authored-by: Julia Iliuk https://bugs.python.org/issue11001 files: M Doc/library/http.cookies.rst diff --git a/Doc/library/http.cookies.rst b/Doc/library/http.cookies.rst index fb8317ad59e6..01bedfd266a8 100644 --- a/Doc/library/http.cookies.rst +++ b/Doc/library/http.cookies.rst @@ -55,8 +55,9 @@ in Cookie name (as :attr:`~Morsel.key`). .. class:: SimpleCookie([input]) This class derives from :class:`BaseCookie` and overrides :meth:`value_decode` - and :meth:`value_encode` to be the identity and :func:`str` respectively. - + and :meth:`value_encode`. SimpleCookie supports strings as cookie values. + When setting the value, SimpleCookie calls the builtin :func:`str()` to convert + the value to a string. Values received from HTTP are kept as strings. .. seealso:: @@ -76,15 +77,16 @@ Cookie Objects .. method:: BaseCookie.value_decode(val) - Return a decoded value from a string representation. Return value can be any - type. This method does nothing in :class:`BaseCookie` --- it exists so it can be - overridden. + Return a tuple ``(real_value, coded_value)`` from a string representation. + ``real_value`` can be any type. This method does no decoding in + :class:`BaseCookie` --- it exists so it can be overridden. .. method:: BaseCookie.value_encode(val) - Return an encoded value. *val* can be any type, but return value must be a - string. This method does nothing in :class:`BaseCookie` --- it exists so it can + Return a tuple ``(real_value, coded_value)``. *val* can be any type, but + ``coded_value`` will always be converted to a string. + This method does no encoding in :class:`BaseCookie` --- it exists so it can be overridden. In general, it should be the case that :meth:`value_encode` and From webhook-mailer at python.org Tue May 7 13:45:59 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 17:45:59 -0000 Subject: [Python-checkins] bpo-31922: Do not connect UDP sockets when broadcast is allowed (GH-423) Message-ID: https://github.com/python/cpython/commit/19ca5b500af4b66e1082a03d8fbf448e1f56af30 commit: 19ca5b500af4b66e1082a03d8fbf448e1f56af30 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-07T10:45:53-07:00 summary: bpo-31922: Do not connect UDP sockets when broadcast is allowed (GH-423) *Moved from python/asyncioGH-493.* This PR fixes issue python/asyncioGH-480, as explained in [this comment](https://github.com/python/asyncio/issues/480GH-issuecomment-278703828). The `_SelectorDatagramTransport.sendto` method has to be modified ~~so `_sock.sendto` is used in all cases (because it is tricky to reliably tell if the socket is connected or not). Could that be an issue for connected sockets?~~ *EDIT* ... so `_sock.send` is used only if `_sock` is connected. It also protects `socket.getsockname` against `OSError` in `_SelectorTransport`. This might happen on Windows if the socket is not connected (e.g. for UDP broadcasting). https://bugs.python.org/issue31922 (cherry picked from commit 63deaa5b70108ef441c57728322da6b4321db4fc) Co-authored-by: Vincent Michel files: A Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst M Lib/asyncio/base_events.py M Lib/asyncio/selector_events.py M Lib/test/test_asyncio/test_base_events.py M Lib/test/test_asyncio/test_selector_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 65e0529e1d90..1252e9dda4ac 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1229,7 +1229,8 @@ def _check_sendfile_params(self, sock, file, offset, count): if local_addr: sock.bind(local_address) if remote_addr: - await self.sock_connect(sock, remote_address) + if not allow_broadcast: + await self.sock_connect(sock, remote_address) r_addr = remote_address except OSError as exc: if sock is not None: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index d2861d34332a..fa27b3bc23af 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -578,7 +578,10 @@ class _SelectorTransport(transports._FlowControlMixin, def __init__(self, loop, sock, protocol, extra=None, server=None): super().__init__(extra, loop) self._extra['socket'] = sock - self._extra['sockname'] = sock.getsockname() + try: + self._extra['sockname'] = sock.getsockname() + except OSError: + self._extra['sockname'] = None if 'peername' not in self._extra: try: self._extra['peername'] = sock.getpeername() @@ -968,9 +971,11 @@ def sendto(self, data, addr=None): if not data: return - if self._address and addr not in (None, self._address): - raise ValueError( - f'Invalid address: must be None or {self._address}') + if self._address: + if addr not in (None, self._address): + raise ValueError( + f'Invalid address: must be None or {self._address}') + addr = self._address if self._conn_lost and self._address: if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: @@ -981,7 +986,7 @@ def sendto(self, data, addr=None): if not self._buffer: # Attempt to send it right away first. try: - if self._address: + if self._extra['peername']: self._sock.send(data) else: self._sock.sendto(data, addr) @@ -1004,7 +1009,7 @@ def _sendto_ready(self): while self._buffer: data, addr = self._buffer.popleft() try: - if self._address: + if self._extra['peername']: self._sock.send(data) else: self._sock.sendto(data, addr) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 559ed3ec5279..24d3356d159b 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1569,6 +1569,23 @@ def test_create_datagram_endpoint_connect_err(self): self.assertRaises( OSError, self.loop.run_until_complete, coro) + def test_create_datagram_endpoint_allow_broadcast(self): + protocol = MyDatagramProto(create_future=True, loop=self.loop) + self.loop.sock_connect = sock_connect = mock.Mock() + sock_connect.return_value = [] + + coro = self.loop.create_datagram_endpoint( + lambda: protocol, + remote_addr=('127.0.0.1', 0), + allow_broadcast=True) + + transport, _ = self.loop.run_until_complete(coro) + self.assertFalse(sock_connect.called) + + transport.close() + self.loop.run_until_complete(protocol.done) + self.assertEqual('CLOSED', protocol.state) + @patch_socket def test_create_datagram_endpoint_socket_err(self, m_socket): m_socket.getaddrinfo = socket.getaddrinfo diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index e94af28bade3..2205ee204249 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1467,6 +1467,7 @@ def setUp(self): self.sock.fileno.return_value = 7 def datagram_transport(self, address=None): + self.sock.getpeername.side_effect = None if address else OSError transport = _SelectorDatagramTransport(self.loop, self.sock, self.protocol, address=address) diff --git a/Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst b/Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst new file mode 100644 index 000000000000..df3881bffaaa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst @@ -0,0 +1,3 @@ +:meth:`asyncio.AbstractEventLoop.create_datagram_endpoint`: +Do not connect UDP socket when broadcast is allowed. +This allows to receive replies after a UDP broadcast. From webhook-mailer at python.org Tue May 7 14:58:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 18:58:32 -0000 Subject: [Python-checkins] bpo-35125: remove inner callback on outer cancellation in asyncio shield (GH-10340) Message-ID: https://github.com/python/cpython/commit/b35acc5b3a0148c5fd4462968b310fb436726d5a commit: b35acc5b3a0148c5fd4462968b310fb436726d5a branch: master author: Romain Picard committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-07T11:58:24-07:00 summary: bpo-35125: remove inner callback on outer cancellation in asyncio shield (GH-10340) When the future returned by shield is cancelled, its completion callback of the inner future is not removed. This makes the callback list of inner inner future grow each time a shield is created and cancelled. This change unregisters the callback from the inner future when the outer future is cancelled. https://bugs.python.org/issue35125 files: A Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst M Lib/asyncio/tasks.py M Lib/test/test_asyncio/test_tasks.py diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index b007b74344ed..211b9126b011 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -818,7 +818,7 @@ def shield(arg, *, loop=None): loop = futures._get_loop(inner) outer = loop.create_future() - def _done_callback(inner): + def _inner_done_callback(inner): if outer.cancelled(): if not inner.cancelled(): # Mark inner's result as retrieved. @@ -834,7 +834,13 @@ def _done_callback(inner): else: outer.set_result(inner.result()) - inner.add_done_callback(_done_callback) + + def _outer_done_callback(outer): + if not inner.done(): + inner.remove_done_callback(_inner_done_callback) + + inner.add_done_callback(_inner_done_callback) + outer.add_done_callback(_outer_done_callback) return outer diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index c4f6d703549c..fa9783f2ff21 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1777,7 +1777,7 @@ def test_shield_exception(self): test_utils.run_briefly(self.loop) self.assertIs(outer.exception(), exc) - def test_shield_cancel(self): + def test_shield_cancel_inner(self): inner = self.new_future(self.loop) outer = asyncio.shield(inner) test_utils.run_briefly(self.loop) @@ -1785,6 +1785,15 @@ def test_shield_cancel(self): test_utils.run_briefly(self.loop) self.assertTrue(outer.cancelled()) + def test_shield_cancel_outer(self): + inner = self.new_future(self.loop) + outer = asyncio.shield(inner) + test_utils.run_briefly(self.loop) + outer.cancel() + test_utils.run_briefly(self.loop) + self.assertTrue(outer.cancelled()) + self.assertEqual(0, 0 if outer._callbacks is None else len(outer._callbacks)) + def test_shield_shortcut(self): fut = self.new_future(self.loop) fut.set_result(42) diff --git a/Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst b/Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst new file mode 100644 index 000000000000..2e28a25d2415 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst @@ -0,0 +1 @@ +Asyncio: Remove inner callback on outer cancellation in shield From webhook-mailer at python.org Tue May 7 15:38:04 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 19:38:04 -0000 Subject: [Python-checkins] bpo-35125: remove inner callback on outer cancellation in asyncio shield (GH-10340) Message-ID: https://github.com/python/cpython/commit/299f69c24c5f0fcfea0b7385b0da661cda78df19 commit: 299f69c24c5f0fcfea0b7385b0da661cda78df19 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-07T12:38:00-07:00 summary: bpo-35125: remove inner callback on outer cancellation in asyncio shield (GH-10340) When the future returned by shield is cancelled, its completion callback of the inner future is not removed. This makes the callback list of inner inner future grow each time a shield is created and cancelled. This change unregisters the callback from the inner future when the outer future is cancelled. https://bugs.python.org/issue35125 (cherry picked from commit b35acc5b3a0148c5fd4462968b310fb436726d5a) Co-authored-by: Romain Picard files: A Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst M Lib/asyncio/tasks.py M Lib/test/test_asyncio/test_tasks.py diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 2af4f32a51a4..402c6e26a79b 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -774,7 +774,7 @@ def shield(arg, *, loop=None): loop = futures._get_loop(inner) outer = loop.create_future() - def _done_callback(inner): + def _inner_done_callback(inner): if outer.cancelled(): if not inner.cancelled(): # Mark inner's result as retrieved. @@ -790,7 +790,13 @@ def _done_callback(inner): else: outer.set_result(inner.result()) - inner.add_done_callback(_done_callback) + + def _outer_done_callback(outer): + if not inner.done(): + inner.remove_done_callback(_inner_done_callback) + + inner.add_done_callback(_inner_done_callback) + outer.add_done_callback(_outer_done_callback) return outer diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index d92ed32bc99f..e0dbc95001d6 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1745,7 +1745,7 @@ def test_shield_exception(self): test_utils.run_briefly(self.loop) self.assertIs(outer.exception(), exc) - def test_shield_cancel(self): + def test_shield_cancel_inner(self): inner = self.new_future(self.loop) outer = asyncio.shield(inner) test_utils.run_briefly(self.loop) @@ -1753,6 +1753,15 @@ def test_shield_cancel(self): test_utils.run_briefly(self.loop) self.assertTrue(outer.cancelled()) + def test_shield_cancel_outer(self): + inner = self.new_future(self.loop) + outer = asyncio.shield(inner) + test_utils.run_briefly(self.loop) + outer.cancel() + test_utils.run_briefly(self.loop) + self.assertTrue(outer.cancelled()) + self.assertEqual(0, 0 if outer._callbacks is None else len(outer._callbacks)) + def test_shield_shortcut(self): fut = self.new_future(self.loop) fut.set_result(42) diff --git a/Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst b/Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst new file mode 100644 index 000000000000..2e28a25d2415 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst @@ -0,0 +1 @@ +Asyncio: Remove inner callback on outer cancellation in shield From webhook-mailer at python.org Tue May 7 16:21:03 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Tue, 07 May 2019 20:21:03 -0000 Subject: [Python-checkins] Add a footnote about Cheese Shop in Doc/tutorial (GH-13103) Message-ID: https://github.com/python/cpython/commit/e19a91e45fd54a56e39c2d12e6aaf4757030507f commit: e19a91e45fd54a56e39c2d12e6aaf4757030507f branch: master author: Adorilson Bezerra committer: St?phane Wirtel date: 2019-05-07T16:20:58-04:00 summary: Add a footnote about Cheese Shop in Doc/tutorial (GH-13103) files: M Doc/tutorial/whatnow.rst diff --git a/Doc/tutorial/whatnow.rst b/Doc/tutorial/whatnow.rst index d876d0740d80..3208201312b8 100644 --- a/Doc/tutorial/whatnow.rst +++ b/Doc/tutorial/whatnow.rst @@ -39,7 +39,7 @@ More Python resources: * https://docs.python.org: Fast access to Python's documentation. * https://pypi.org: The Python Package Index, previously also nicknamed - the Cheese Shop, is an index of user-created Python modules that are available + the Cheese Shop [#]_, is an index of user-created Python modules that are available for download. Once you begin releasing code, you can register it here so that others can find it. @@ -68,3 +68,9 @@ Before posting, be sure to check the list of :ref:`Frequently Asked Questions ` (also called the FAQ). The FAQ answers many of the questions that come up again and again, and may already contain the solution for your problem. + +.. rubric:: Footnotes + +.. [#] "Cheese Shop" is a Monty Python's sketch: a customer enters a cheese shop, + but whatever cheese he asks for, the clerk says it's missing. + From webhook-mailer at python.org Tue May 7 16:29:48 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Tue, 07 May 2019 20:29:48 -0000 Subject: [Python-checkins] [3.7] bpo-36533: Reinit logging.Handler locks on fork(). (GH-12704) (GH-13170) Message-ID: https://github.com/python/cpython/commit/3b4b28efbde63502709bede7c5f9403ec6f37428 commit: 3b4b28efbde63502709bede7c5f9403ec6f37428 branch: 3.7 author: Gregory P. Smith committer: GitHub date: 2019-05-07T16:29:41-04:00 summary: [3.7] bpo-36533: Reinit logging.Handler locks on fork(). (GH-12704) (GH-13170) Instead of attempting to acquire and release them all across fork which was leading to deadlocks in some applications that had chained their own handlers while holding multiple locks. (cherry picked from commit 64aa6d2000665efb1a2eccae176df9520bf5f5e6) Co-authored-by: Gregory P. Smith [Google LLC] files: A Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst M Lib/logging/__init__.py M Lib/test/test_logging.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 66fd5ac9fe06..cd80d5cccc6e 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -229,49 +229,38 @@ def _releaseLock(): # Prevent a held logging lock from blocking a child from logging. if not hasattr(os, 'register_at_fork'): # Windows and friends. - def _register_at_fork_acquire_release(instance): + def _register_at_fork_reinit_lock(instance): pass # no-op when os.register_at_fork does not exist. -else: # The os.register_at_fork API exists - os.register_at_fork(before=_acquireLock, - after_in_child=_releaseLock, - after_in_parent=_releaseLock) - - # A collection of instances with acquire and release methods (logging.Handler) - # to be called before and after fork. The weakref avoids us keeping discarded - # Handler instances alive forever in case an odd program creates and destroys - # many over its lifetime. - _at_fork_acquire_release_weakset = weakref.WeakSet() - - - def _register_at_fork_acquire_release(instance): - # We put the instance itself in a single WeakSet as we MUST have only - # one atomic weak ref. used by both before and after atfork calls to - # guarantee matched pairs of acquire and release calls. - _at_fork_acquire_release_weakset.add(instance) - +else: + # A collection of instances with a createLock method (logging.Handler) + # to be called in the child after forking. The weakref avoids us keeping + # discarded Handler instances alive. A set is used to avoid accumulating + # duplicate registrations as createLock() is responsible for registering + # a new Handler instance with this set in the first place. + _at_fork_reinit_lock_weakset = weakref.WeakSet() + + def _register_at_fork_reinit_lock(instance): + _acquireLock() + try: + _at_fork_reinit_lock_weakset.add(instance) + finally: + _releaseLock() - def _at_fork_weak_calls(method_name): - for instance in _at_fork_acquire_release_weakset: - method = getattr(instance, method_name) + def _after_at_fork_child_reinit_locks(): + # _acquireLock() was called in the parent before forking. + for handler in _at_fork_reinit_lock_weakset: try: - method() + handler.createLock() except Exception as err: # Similar to what PyErr_WriteUnraisable does. print("Ignoring exception from logging atfork", instance, - method_name, "method:", err, file=sys.stderr) - - - def _before_at_fork_weak_calls(): - _at_fork_weak_calls('acquire') + "._reinit_lock() method:", err, file=sys.stderr) + _releaseLock() # Acquired by os.register_at_fork(before=. - def _after_at_fork_weak_calls(): - _at_fork_weak_calls('release') - - - os.register_at_fork(before=_before_at_fork_weak_calls, - after_in_child=_after_at_fork_weak_calls, - after_in_parent=_after_at_fork_weak_calls) + os.register_at_fork(before=_acquireLock, + after_in_child=_after_at_fork_child_reinit_locks, + after_in_parent=_releaseLock) #--------------------------------------------------------------------------- @@ -844,7 +833,7 @@ def createLock(self): Acquire a thread lock for serializing access to the underlying I/O. """ self.lock = threading.RLock() - _register_at_fork_acquire_release(self) + _register_at_fork_reinit_lock(self) def acquire(self): """ diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 6c5cb81377b3..42746d40d2cd 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -673,10 +673,28 @@ def remove_loop(fname, tries): # register_at_fork mechanism is also present and used. @unittest.skipIf(not hasattr(os, 'fork'), 'Test requires os.fork().') def test_post_fork_child_no_deadlock(self): - """Ensure forked child logging locks are not held; bpo-6721.""" - refed_h = logging.Handler() + """Ensure child logging locks are not held; bpo-6721 & bpo-36533.""" + class _OurHandler(logging.Handler): + def __init__(self): + super().__init__() + self.sub_handler = logging.StreamHandler( + stream=open('/dev/null', 'wt')) + + def emit(self, record): + self.sub_handler.acquire() + try: + self.sub_handler.emit(record) + finally: + self.sub_handler.release() + + self.assertEqual(len(logging._handlers), 0) + refed_h = _OurHandler() refed_h.name = 'because we need at least one for this test' self.assertGreater(len(logging._handlers), 0) + self.assertGreater(len(logging._at_fork_reinit_lock_weakset), 1) + test_logger = logging.getLogger('test_post_fork_child_no_deadlock') + test_logger.addHandler(refed_h) + test_logger.setLevel(logging.DEBUG) locks_held__ready_to_fork = threading.Event() fork_happened__release_locks_and_end_thread = threading.Event() @@ -714,19 +732,24 @@ def lock_holder_thread_fn(): locks_held__ready_to_fork.wait() pid = os.fork() if pid == 0: # Child. - logging.error(r'Child process did not deadlock. \o/') - os._exit(0) + try: + test_logger.info(r'Child process did not deadlock. \o/') + finally: + os._exit(0) else: # Parent. + test_logger.info(r'Parent process returned from fork. \o/') fork_happened__release_locks_and_end_thread.set() lock_holder_thread.join() start_time = time.monotonic() while True: + test_logger.debug('Waiting for child process.') waited_pid, status = os.waitpid(pid, os.WNOHANG) if waited_pid == pid: break # child process exited. if time.monotonic() - start_time > 7: break # so long? implies child deadlock. time.sleep(0.05) + test_logger.debug('Done waiting.') if waited_pid != pid: os.kill(pid, signal.SIGKILL) waited_pid, status = os.waitpid(pid, 0) diff --git a/Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst b/Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst new file mode 100644 index 000000000000..15c4222d4837 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst @@ -0,0 +1,6 @@ +Reinitialize logging.Handler locks in forked child processes instead of +attempting to acquire them all in the parent before forking only to be +released in the child process. The acquire/release pattern was leading to +deadlocks in code that has implemented any form of chained logging handlers +that depend upon one another as the lock acquision order cannot be +guaranteed. From webhook-mailer at python.org Tue May 7 16:53:23 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 20:53:23 -0000 Subject: [Python-checkins] bpo-36801: Fix waiting in StreamWriter.drain for closing SSL transport (GH-13098) Message-ID: https://github.com/python/cpython/commit/1cc0ee7d9f6a2817918fafd24c18d8bb093a85d3 commit: 1cc0ee7d9f6a2817918fafd24c18d8bb093a85d3 branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-07T13:53:19-07:00 summary: bpo-36801: Fix waiting in StreamWriter.drain for closing SSL transport (GH-13098) https://bugs.python.org/issue36801 files: A Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst M Lib/asyncio/streams.py M Lib/asyncio/subprocess.py M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index c9b1f32813d4..79adf028212f 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -199,6 +199,9 @@ def connection_lost(self, exc): self._drain_waiter = waiter await waiter + def _get_close_waiter(self, stream): + raise NotImplementedError + class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): """Helper class to adapt between Protocol and StreamReader. @@ -315,6 +318,9 @@ def eof_received(self): return False return True + def _get_close_waiter(self, stream): + return self._closed + def __del__(self): # Prevent reports about unhandled exceptions. # Better than self._closed._log_traceback = False hack @@ -376,7 +382,7 @@ def is_closing(self): return self._transport.is_closing() async def wait_closed(self): - await self._protocol._closed + await self._protocol._get_close_waiter(self) def get_extra_info(self, name, default=None): return self._transport.get_extra_info(name, default) @@ -394,13 +400,12 @@ def get_extra_info(self, name, default=None): if exc is not None: raise exc if self._transport.is_closing(): - # Yield to the event loop so connection_lost() may be - # called. Without this, _drain_helper() would return - # immediately, and code that calls - # write(...); await drain() - # in a loop would never call connection_lost(), so it - # would not see an error when the socket is closed. - await sleep(0, loop=self._loop) + # Wait for protocol.connection_lost() call + # Raise connection closing error if any, + # ConnectionResetError otherwise + fut = self._protocol._get_close_waiter(self) + await fut + raise ConnectionResetError('Connection lost') await self._protocol._drain_helper() async def aclose(self): diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index fa58e1e85862..d34b6118fdcf 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -26,6 +26,7 @@ def __init__(self, limit, loop, *, _asyncio_internal=False): self._transport = None self._process_exited = False self._pipe_fds = [] + self._stdin_closed = self._loop.create_future() def __repr__(self): info = [self.__class__.__name__] @@ -80,6 +81,10 @@ def pipe_connection_lost(self, fd, exc): if pipe is not None: pipe.close() self.connection_lost(exc) + if exc is None: + self._stdin_closed.set_result(None) + else: + self._stdin_closed.set_exception(exc) return if fd == 1: reader = self.stdout @@ -106,6 +111,10 @@ def _maybe_close_transport(self): self._transport.close() self._transport = None + def _get_close_waiter(self, stream): + if stream is self.stdin: + return self._stdin_closed + class Process: def __init__(self, transport, protocol, loop, *, _asyncio_internal=False): diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index c1cc9d7fa0e9..905141ca89c7 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -109,6 +109,29 @@ def test_open_unix_connection_no_loop_ssl(self): self._basetest_open_connection_no_loop_ssl(conn_fut) + @unittest.skipIf(ssl is None, 'No ssl module') + def test_drain_on_closed_writer_ssl(self): + + async def inner(httpd): + reader, writer = await asyncio.open_connection( + *httpd.address, + ssl=test_utils.dummy_ssl_context()) + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + writer.write(b'GET / HTTP/1.0\r\n\r\n') + data = await reader.read() + self.assertTrue(data.endswith(b'\r\n\r\nTest message')) + + writer.close() + with self.assertRaises(ConnectionResetError): + await writer.drain() + + self.assertEqual(messages, []) + + with test_utils.run_test_server(use_ssl=True) as httpd: + self.loop.run_until_complete(inner(httpd)) + def _basetest_open_connection_error(self, open_connection_fut): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) diff --git a/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst b/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst new file mode 100644 index 000000000000..43e51fe5ca94 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst @@ -0,0 +1 @@ +Properly handle SSL connection closing in asyncio StreamWriter.drain() call. From webhook-mailer at python.org Tue May 7 16:59:26 2019 From: webhook-mailer at python.org (Chris Withers) Date: Tue, 07 May 2019 20:59:26 -0000 Subject: [Python-checkins] Add a footnote about Cheese Shop in Doc/tutorial (GH-13103) (GH-13174) Message-ID: https://github.com/python/cpython/commit/5edd82c806435ccf936504553da39d0778e49825 commit: 5edd82c806435ccf936504553da39d0778e49825 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Chris Withers date: 2019-05-07T21:59:20+01:00 summary: Add a footnote about Cheese Shop in Doc/tutorial (GH-13103) (GH-13174) (cherry picked from commit e19a91e45fd54a56e39c2d12e6aaf4757030507f) Co-authored-by: Adorilson Bezerra files: M Doc/tutorial/whatnow.rst diff --git a/Doc/tutorial/whatnow.rst b/Doc/tutorial/whatnow.rst index d876d0740d80..3208201312b8 100644 --- a/Doc/tutorial/whatnow.rst +++ b/Doc/tutorial/whatnow.rst @@ -39,7 +39,7 @@ More Python resources: * https://docs.python.org: Fast access to Python's documentation. * https://pypi.org: The Python Package Index, previously also nicknamed - the Cheese Shop, is an index of user-created Python modules that are available + the Cheese Shop [#]_, is an index of user-created Python modules that are available for download. Once you begin releasing code, you can register it here so that others can find it. @@ -68,3 +68,9 @@ Before posting, be sure to check the list of :ref:`Frequently Asked Questions ` (also called the FAQ). The FAQ answers many of the questions that come up again and again, and may already contain the solution for your problem. + +.. rubric:: Footnotes + +.. [#] "Cheese Shop" is a Monty Python's sketch: a customer enters a cheese shop, + but whatever cheese he asks for, the clerk says it's missing. + From webhook-mailer at python.org Tue May 7 17:03:54 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Tue, 07 May 2019 21:03:54 -0000 Subject: [Python-checkins] bpo-36838: Suggest 'make venv' when missing Doc/ tools. (GH-13173) Message-ID: https://github.com/python/cpython/commit/3918ad6b45da31e05265de5a455102276717c659 commit: 3918ad6b45da31e05265de5a455102276717c659 branch: master author: Gregory P. Smith committer: GitHub date: 2019-05-07T17:03:50-04:00 summary: bpo-36838: Suggest 'make venv' when missing Doc/ tools. (GH-13173) files: M Doc/Makefile diff --git a/Doc/Makefile b/Doc/Makefile index 53877e613290..cf1bb88b0b8e 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -48,11 +48,19 @@ build: @if [ -f ../Misc/NEWS ] ; then \ echo "Using existing Misc/NEWS file"; \ cp ../Misc/NEWS build/NEWS; \ - elif [ -d ../Misc/NEWS.d ]; then \ - echo "Building NEWS from Misc/NEWS.d with blurb"; \ - $(BLURB) merge -f build/NEWS; \ + elif $(BLURB) help >/dev/null 2>&1 && $(SPHINXBUILD) --version >/dev/null 2>&1; then \ + if [ -d ../Misc/NEWS.d ]; then \ + echo "Building NEWS from Misc/NEWS.d with blurb"; \ + $(BLURB) merge -f build/NEWS; \ + else \ + echo "Neither Misc/NEWS.d nor Misc/NEWS found; cannot build docs"; \ + exit 1; \ + fi \ else \ - echo "Neither Misc/NEWS.d nor Misc/NEWS found; cannot build docs"; \ + echo ""; \ + echo "Missing the required blurb or sphinx-build tools."; \ + echo "Please run 'make venv' to install local copies."; \ + echo ""; \ exit 1; \ fi $(SPHINXBUILD) $(ALLSPHINXOPTS) From webhook-mailer at python.org Tue May 7 17:36:43 2019 From: webhook-mailer at python.org (Vinay Sajip) Date: Tue, 07 May 2019 21:36:43 -0000 Subject: [Python-checkins] bpo-36015: Handle StreamHandler representaton of stream with an integer name (GH-11908) Message-ID: https://github.com/python/cpython/commit/ca87eebb22d202c33f3317cbf85059cadc64fa9f commit: ca87eebb22d202c33f3317cbf85059cadc64fa9f branch: master author: Riccardo Magliocchetti committer: Vinay Sajip date: 2019-05-07T22:36:39+01:00 summary: bpo-36015: Handle StreamHandler representaton of stream with an integer name (GH-11908) files: M Lib/logging/__init__.py M Lib/test/test_logging.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 07a0c0c4ae98..16812ec8d556 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1111,6 +1111,8 @@ def setStream(self, stream): def __repr__(self): level = getLevelName(self.level) name = getattr(self.stream, 'name', '') + # bpo-36015: name can be an int + name = str(name) if name: name += ' ' return '<%s %s(%s)>' % (self.__class__.__name__, name, level) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 950217cec288..bc99c3adbe34 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -760,6 +760,10 @@ class TestStreamHandler(logging.StreamHandler): def handleError(self, record): self.error_record = record +class StreamWithIntName(object): + level = logging.NOTSET + name = 2 + class StreamHandlerTest(BaseTest): def test_error_handling(self): h = TestStreamHandler(BadStream()) @@ -797,6 +801,10 @@ def test_stream_setting(self): actual = h.setStream(old) self.assertIsNone(actual) + def test_can_represent_stream_with_int_name(self): + h = logging.StreamHandler(StreamWithIntName()) + self.assertEqual(repr(h), '') + # -- The following section could be moved into a server_helper.py module # -- if it proves to be of wider utility than just test_logging From webhook-mailer at python.org Tue May 7 17:41:09 2019 From: webhook-mailer at python.org (Mark Shannon) Date: Tue, 07 May 2019 21:41:09 -0000 Subject: [Python-checkins] bpo-27639: Correct return type for UserList slicing operation (#13169) Message-ID: https://github.com/python/cpython/commit/b1c3167c232c36ed3543ca351ff10c613639b5f5 commit: b1c3167c232c36ed3543ca351ff10c613639b5f5 branch: master author: Michael Blahay committer: Mark Shannon date: 2019-05-07T17:41:06-04:00 summary: bpo-27639: Correct return type for UserList slicing operation (#13169) * BPO-27639: Correct return type for UserList slicing operation Added logic to __getitem__ magic method for UserList to ensure that the return type matches that of self. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst M Lib/collections/__init__.py M Lib/test/test_userlist.py diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index e6cafb320fab..706907ad4a28 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1085,7 +1085,11 @@ def __cast(self, other): return other.data if isinstance(other, UserList) else other def __contains__(self, item): return item in self.data def __len__(self): return len(self.data) - def __getitem__(self, i): return self.data[i] + def __getitem__(self, i): + if isinstance(i, slice): + return self.__class__(self.data[i]) + else: + return self.data[i] def __setitem__(self, i, item): self.data[i] = item def __delitem__(self, i): del self.data[i] def __add__(self, other): diff --git a/Lib/test/test_userlist.py b/Lib/test/test_userlist.py index 8de6c14e392f..1ed67dac8059 100644 --- a/Lib/test/test_userlist.py +++ b/Lib/test/test_userlist.py @@ -17,6 +17,12 @@ def test_getslice(self): for j in range(-3, 6): self.assertEqual(u[i:j], l[i:j]) + def test_slice_type(self): + l = [0, 1, 2, 3, 4] + u = UserList(l) + self.assertIsInstance(u[:], u.__class__) + self.assertEqual(u[:],u) + def test_add_specials(self): u = UserList("spam") u2 = u + "eggs" diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst new file mode 100644 index 000000000000..ae5b915969d3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst @@ -0,0 +1,2 @@ +Correct return type for UserList slicing operations. Patch by Michael Blahay, +Erick Cervantes, and vaultah From webhook-mailer at python.org Tue May 7 17:48:40 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 May 2019 21:48:40 -0000 Subject: [Python-checkins] bpo-36801: Fix waiting in StreamWriter.drain for closing SSL transport (GH-13098) Message-ID: https://github.com/python/cpython/commit/93aa57ac6594d1cc30d147720fc8a7a4e1ca2d3e commit: 93aa57ac6594d1cc30d147720fc8a7a4e1ca2d3e branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-07T14:48:35-07:00 summary: bpo-36801: Fix waiting in StreamWriter.drain for closing SSL transport (GH-13098) https://bugs.python.org/issue36801 (cherry picked from commit 1cc0ee7d9f6a2817918fafd24c18d8bb093a85d3) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst M Lib/asyncio/streams.py M Lib/asyncio/subprocess.py M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index d6531f88a74d..50badd6b2479 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -208,6 +208,9 @@ def connection_lost(self, exc): self._drain_waiter = waiter await waiter + def _get_close_waiter(self, stream): + raise NotImplementedError + class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): """Helper class to adapt between Protocol and StreamReader. @@ -265,6 +268,9 @@ def eof_received(self): return False return True + def _get_close_waiter(self, stream): + return self._closed + def __del__(self): # Prevent reports about unhandled exceptions. # Better than self._closed._log_traceback = False hack @@ -320,7 +326,7 @@ def is_closing(self): return self._transport.is_closing() async def wait_closed(self): - await self._protocol._closed + await self._protocol._get_close_waiter(self) def get_extra_info(self, name, default=None): return self._transport.get_extra_info(name, default) @@ -338,13 +344,12 @@ def get_extra_info(self, name, default=None): if exc is not None: raise exc if self._transport.is_closing(): - # Yield to the event loop so connection_lost() may be - # called. Without this, _drain_helper() would return - # immediately, and code that calls - # write(...); await drain() - # in a loop would never call connection_lost(), so it - # would not see an error when the socket is closed. - await sleep(0, loop=self._loop) + # Wait for protocol.connection_lost() call + # Raise connection closing error if any, + # ConnectionResetError otherwise + fut = self._protocol._get_close_waiter(self) + await fut + raise ConnectionResetError('Connection lost') await self._protocol._drain_helper() diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index 90fc00de8339..ecacc1a66dbf 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -25,6 +25,7 @@ def __init__(self, limit, loop): self._transport = None self._process_exited = False self._pipe_fds = [] + self._stdin_closed = self._loop.create_future() def __repr__(self): info = [self.__class__.__name__] @@ -76,6 +77,10 @@ def pipe_connection_lost(self, fd, exc): if pipe is not None: pipe.close() self.connection_lost(exc) + if exc is None: + self._stdin_closed.set_result(None) + else: + self._stdin_closed.set_exception(exc) return if fd == 1: reader = self.stdout @@ -102,6 +107,10 @@ def _maybe_close_transport(self): self._transport.close() self._transport = None + def _get_close_waiter(self, stream): + if stream is self.stdin: + return self._stdin_closed + class Process: def __init__(self, transport, protocol, loop): diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 63fa13f79e28..2e5fc61bce2b 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -99,6 +99,29 @@ def test_open_unix_connection_no_loop_ssl(self): self._basetest_open_connection_no_loop_ssl(conn_fut) + @unittest.skipIf(ssl is None, 'No ssl module') + def test_drain_on_closed_writer_ssl(self): + + async def inner(httpd): + reader, writer = await asyncio.open_connection( + *httpd.address, + ssl=test_utils.dummy_ssl_context()) + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + writer.write(b'GET / HTTP/1.0\r\n\r\n') + data = await reader.read() + self.assertTrue(data.endswith(b'\r\n\r\nTest message')) + + writer.close() + with self.assertRaises(ConnectionResetError): + await writer.drain() + + self.assertEqual(messages, []) + + with test_utils.run_test_server(use_ssl=True) as httpd: + self.loop.run_until_complete(inner(httpd)) + def _basetest_open_connection_error(self, open_connection_fut): reader, writer = self.loop.run_until_complete(open_connection_fut) writer._protocol.connection_lost(ZeroDivisionError()) diff --git a/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst b/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst new file mode 100644 index 000000000000..43e51fe5ca94 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst @@ -0,0 +1 @@ +Properly handle SSL connection closing in asyncio StreamWriter.drain() call. From webhook-mailer at python.org Wed May 8 09:32:14 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Wed, 08 May 2019 13:32:14 -0000 Subject: [Python-checkins] [2.7] bpo-24712: Doc: Make sidebar sticky using browser support. (GH-13179) Message-ID: https://github.com/python/cpython/commit/8ab24b2ebcf99f703f00297cb3a0c3ff857eecf8 commit: 8ab24b2ebcf99f703f00297cb3a0c3ff857eecf8 branch: 2.7 author: Julien Palard committer: St?phane Wirtel date: 2019-05-08T09:32:07-04:00 summary: [2.7] bpo-24712: Doc: Make sidebar sticky using browser support. (GH-13179) Patch by Mike Taylor. files: M Doc/tools/static/sidebar.js diff --git a/Doc/tools/static/sidebar.js b/Doc/tools/static/sidebar.js index 1bdd829a7683..17f818ec140e 100644 --- a/Doc/tools/static/sidebar.js +++ b/Doc/tools/static/sidebar.js @@ -46,6 +46,15 @@ $(function() { var dark_color = $('.related').css('background-color'); var light_color = $('.document').css('background-color'); + // set position: sticky on sidebar + // (browsers that don't support this will fall-back to + // positioning via scroll_sidebar) + var supportsPositionSticky = (window.CSS && window.CSS.supports && + window.CSS.supports('position', 'sticky')); + if (supportsPositionSticky) { + sidebarwrapper.css('position', 'sticky'); + } + function get_viewport_height() { if (window.innerHeight) return window.innerHeight; @@ -157,6 +166,9 @@ $(function() { /* intelligent scrolling */ function scroll_sidebar() { + if (supportsPositionSticky) { + return; + } var sidebar_height = sidebarwrapper.height(); var viewport_height = get_viewport_height(); var offset = sidebar.position()['top']; From webhook-mailer at python.org Wed May 8 09:44:07 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Wed, 08 May 2019 13:44:07 -0000 Subject: [Python-checkins] Doc: Fix missing bracket (GH-13163) Message-ID: https://github.com/python/cpython/commit/70b80541bb044e8cb7037acaf97f64890fef418e commit: 70b80541bb044e8cb7037acaf97f64890fef418e branch: master author: Zhaorong Ma committer: St?phane Wirtel date: 2019-05-08T09:44:01-04:00 summary: Doc: Fix missing bracket (GH-13163) files: M Doc/distutils/setupscript.rst diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst index 54ed1aebc242..a65a26ac57fa 100644 --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -523,7 +523,7 @@ following way:: setup(..., data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']), - ('config', ['cfg/data.cfg']), + ('config', ['cfg/data.cfg'])], ) Each (*directory*, *files*) pair in the sequence specifies the installation From webhook-mailer at python.org Wed May 8 09:45:11 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Wed, 08 May 2019 13:45:11 -0000 Subject: [Python-checkins] bpo-36832: add zipfile.Path (#13153) Message-ID: https://github.com/python/cpython/commit/b2758ff9553d8bebe4e9dd1cb3996212473810e3 commit: b2758ff9553d8bebe4e9dd1cb3996212473810e3 branch: master author: Jason R. Coombs committer: Barry Warsaw date: 2019-05-08T09:45:05-04:00 summary: bpo-36832: add zipfile.Path (#13153) * bpo-36832: add zipfile.Path * bpo-36832: add documentation for zipfile.Path * ?? Added by blurb_it. * Remove module reference from blurb. * Sort the imports * Update docstrings and docs per recommendations. * Rely on test.support.temp_dir * Signal that 'root' is the parameter. * Correct spelling of 'mod' * Convert docstring to comment for brevity. * Fix more errors in the docs files: A Misc/NEWS.d/next/Library/2019-05-07-15-00-45.bpo-36832.TExgqb.rst M Doc/library/zipfile.rst M Lib/test/test_zipfile.py M Lib/zipfile.py diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 4e9edff27014..9db9697105d6 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -52,6 +52,15 @@ The module defines the following items: :ref:`zipfile-objects` for constructor details. +.. class:: Path + :noindex: + + A pathlib-compatible wrapper for zip files. See section + :ref:`path-objects` for details. + + .. versionadded:: 3.8 + + .. class:: PyZipFile :noindex: @@ -456,6 +465,64 @@ The following data attributes are also available: truncated. +.. _path-objects: + +Path Objects +------------ + +.. class:: Path(root, at='') + + Construct a Path object from a ``root`` zipfile (which may be a + :class:`ZipFile` instance or ``file`` suitable for passing to + the :class:`ZipFile` constructor). + + ``at`` specifies the location of this Path within the zipfile, + e.g. 'dir/file.txt', 'dir/', or ''. Defaults to the empty string, + indicating the root. + +Path objects expose the following features of :mod:`pathlib.Path` +objects: + +Path objects are traversable using the ``/`` operator. + +.. attribute:: Path.name + + The final path component. + +.. method:: Path.open(*, **) + + Invoke :meth:`ZipFile.open` on the current path. Accepts + the same arguments as :meth:`ZipFile.open`. + +.. method:: Path.listdir() + + Enumerate the children of the current directory. + +.. method:: Path.is_dir() + + Return ``True`` if the current context references a directory. + +.. method:: Path.is_file() + + Return ``True`` if the current context references a file. + +.. method:: Path.exists() + + Return ``True`` if the current context references a file or + directory in the zip file. + +.. method:: Path.read_text(*, **) + + Read the current file as unicode text. Positional and + keyword arguments are passed through to + :class:`io.TextIOWrapper` (except ``buffer``, which is + implied by the context). + +.. method:: Path.read_bytes() + + Read the current file as bytes. + + .. _pyzipfile-objects: PyZipFile Objects diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 14e1e08c5bfd..538d4ee55dfb 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -1,13 +1,15 @@ import contextlib +import importlib.util import io import os -import importlib.util import pathlib import posixpath -import time +import shutil import struct -import zipfile +import tempfile +import time import unittest +import zipfile from tempfile import TemporaryFile @@ -2392,5 +2394,113 @@ def test_extract_command(self): with open(path, 'rb') as f: self.assertEqual(f.read(), zf.read(zi)) + +# Poor man's technique to consume a (smallish) iterable. +consume = tuple + + +def add_dirs(zipfile): + """ + Given a writable zipfile, inject directory entries for + any directories implied by the presence of children. + """ + names = zipfile.namelist() + consume( + zipfile.writestr(name + "/", b"") + for name in map(posixpath.dirname, names) + if name and name + "/" not in names + ) + return zipfile + + +def build_abcde_files(): + """ + Create a zip file with this structure: + + . + ??? a.txt + ??? b + ??? c.txt + ??? d + ??? e.txt + """ + data = io.BytesIO() + zf = zipfile.ZipFile(data, "w") + zf.writestr("a.txt", b"content of a") + zf.writestr("b/c.txt", b"content of c") + zf.writestr("b/d/e.txt", b"content of e") + zf.filename = "abcde.zip" + return zf + + +class TestPath(unittest.TestCase): + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + + def zipfile_abcde(self): + with self.subTest(): + yield build_abcde_files() + with self.subTest(): + yield add_dirs(build_abcde_files()) + + def zipfile_ondisk(self): + tmpdir = pathlib.Path(self.fixtures.enter_context(temp_dir())) + for zipfile_abcde in self.zipfile_abcde(): + buffer = zipfile_abcde.fp + zipfile_abcde.close() + path = tmpdir / zipfile_abcde.filename + with path.open("wb") as strm: + strm.write(buffer.getvalue()) + yield path + + def test_iterdir_istype(self): + for zipfile_abcde in self.zipfile_abcde(): + root = zipfile.Path(zipfile_abcde) + assert root.is_dir() + a, b = root.iterdir() + assert a.is_file() + assert b.is_dir() + c, d = b.iterdir() + assert c.is_file() + e, = d.iterdir() + assert e.is_file() + + def test_open(self): + for zipfile_abcde in self.zipfile_abcde(): + root = zipfile.Path(zipfile_abcde) + a, b = root.iterdir() + with a.open() as strm: + data = strm.read() + assert data == b"content of a" + + def test_read(self): + for zipfile_abcde in self.zipfile_abcde(): + root = zipfile.Path(zipfile_abcde) + a, b = root.iterdir() + assert a.read_text() == "content of a" + assert a.read_bytes() == b"content of a" + + def test_traverse_truediv(self): + for zipfile_abcde in self.zipfile_abcde(): + root = zipfile.Path(zipfile_abcde) + a = root / "a" + assert a.is_file() + e = root / "b" / "d" / "e.txt" + assert e.read_text() == "content of e" + + def test_pathlike_construction(self): + """ + zipfile.Path should be constructable from a path-like object + """ + for zipfile_ondisk in self.zipfile_ondisk(): + pathlike = pathlib.Path(str(zipfile_ondisk)) + zipfile.Path(pathlike) + + def test_traverse_pathlike(self): + for zipfile_abcde in self.zipfile_abcde(): + root = zipfile.Path(zipfile_abcde) + root / pathlib.Path("a") + if __name__ == "__main__": unittest.main() diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 2dc016472117..62475c701f50 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -3,16 +3,18 @@ XXX references to utf-8 need further investigation. """ +import binascii +import functools +import importlib.util import io import os -import importlib.util -import sys -import time -import stat +import posixpath import shutil +import stat import struct -import binascii +import sys import threading +import time try: import zlib # We may need its compression method @@ -2102,6 +2104,138 @@ def _compile(file, optimize=-1): return (fname, archivename) +class Path: + """ + A pathlib-compatible interface for zip files. + + Consider a zip file with this structure:: + + . + ??? a.txt + ??? b + ??? c.txt + ??? d + ??? e.txt + + >>> data = io.BytesIO() + >>> zf = ZipFile(data, 'w') + >>> zf.writestr('a.txt', 'content of a') + >>> zf.writestr('b/c.txt', 'content of c') + >>> zf.writestr('b/d/e.txt', 'content of e') + >>> zf.filename = 'abcde.zip' + + Path accepts the zipfile object itself or a filename + + >>> root = Path(zf) + + From there, several path operations are available. + + Directory iteration (including the zip file itself): + + >>> a, b = root.iterdir() + >>> a + Path('abcde.zip', 'a.txt') + >>> b + Path('abcde.zip', 'b/') + + name property: + + >>> b.name + 'b' + + join with divide operator: + + >>> c = b / 'c.txt' + >>> c + Path('abcde.zip', 'b/c.txt') + >>> c.name + 'c.txt' + + Read text: + + >>> c.read_text() + 'content of c' + + existence: + + >>> c.exists() + True + >>> (b / 'missing.txt').exists() + False + + Coersion to string: + + >>> str(c) + 'abcde.zip/b/c.txt' + """ + + __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})" + + def __init__(self, root, at=""): + self.root = root if isinstance(root, ZipFile) else ZipFile(root) + self.at = at + + @property + def open(self): + return functools.partial(self.root.open, self.at) + + @property + def name(self): + return posixpath.basename(self.at.rstrip("/")) + + def read_text(self, *args, **kwargs): + with self.open() as strm: + return io.TextIOWrapper(strm, *args, **kwargs).read() + + def read_bytes(self): + with self.open() as strm: + return strm.read() + + def _is_child(self, path): + return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/") + + def _next(self, at): + return Path(self.root, at) + + def is_dir(self): + return not self.at or self.at.endswith("/") + + def is_file(self): + return not self.is_dir() + + def exists(self): + return self.at in self._names() + + def iterdir(self): + if not self.is_dir(): + raise ValueError("Can't listdir a file") + subs = map(self._next, self._names()) + return filter(self._is_child, subs) + + def __str__(self): + return posixpath.join(self.root.filename, self.at) + + def __repr__(self): + return self.__repr.format(self=self) + + def __truediv__(self, add): + next = posixpath.join(self.at, add) + next_dir = posixpath.join(self.at, add, "") + names = self._names() + return self._next(next_dir if next not in names and next_dir in names else next) + + @staticmethod + def _add_implied_dirs(names): + return names + [ + name + "/" + for name in map(posixpath.dirname, names) + if name and name + "/" not in names + ] + + def _names(self): + return self._add_implied_dirs(self.root.namelist()) + + def main(args=None): import argparse diff --git a/Misc/NEWS.d/next/Library/2019-05-07-15-00-45.bpo-36832.TExgqb.rst b/Misc/NEWS.d/next/Library/2019-05-07-15-00-45.bpo-36832.TExgqb.rst new file mode 100644 index 000000000000..23577d9b5a82 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-07-15-00-45.bpo-36832.TExgqb.rst @@ -0,0 +1 @@ +Introducing ``zipfile.Path``, a pathlib-compatible wrapper for traversing zip files. From webhook-mailer at python.org Wed May 8 10:07:07 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 08 May 2019 14:07:07 -0000 Subject: [Python-checkins] [3.7] Doc: Fix missing bracket (GH-13163) (GH-13189) Message-ID: https://github.com/python/cpython/commit/3afbe699883753ba7a8a8da6bb0b74eeb13c42f9 commit: 3afbe699883753ba7a8a8da6bb0b74eeb13c42f9 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-08T07:07:02-07:00 summary: [3.7] Doc: Fix missing bracket (GH-13163) (GH-13189) (cherry picked from commit 70b80541bb044e8cb7037acaf97f64890fef418e) Co-authored-by: Zhaorong Ma files: M Doc/distutils/setupscript.rst diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst index 54ed1aebc242..a65a26ac57fa 100644 --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -523,7 +523,7 @@ following way:: setup(..., data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']), - ('config', ['cfg/data.cfg']), + ('config', ['cfg/data.cfg'])], ) Each (*directory*, *files*) pair in the sequence specifies the installation From webhook-mailer at python.org Wed May 8 11:01:34 2019 From: webhook-mailer at python.org (Julien Palard) Date: Wed, 08 May 2019 15:01:34 -0000 Subject: [Python-checkins] Doc: Be explicit that Pathlib resolve was strict before 3.6. (GH-11316) Message-ID: https://github.com/python/cpython/commit/1d4b16051f8550fd7dada3670a3e83ae13b99d3b commit: 1d4b16051f8550fd7dada3670a3e83ae13b99d3b branch: master author: Julien Palard committer: GitHub date: 2019-05-08T17:01:11+02:00 summary: Doc: Be explicit that Pathlib resolve was strict before 3.6. (GH-11316) files: M Doc/library/pathlib.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 7a4a20dc6118..41aebc4f61c8 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -976,7 +976,7 @@ call fails (for example because the path doesn't exist). is raised. .. versionadded:: 3.6 - The *strict* argument. + The *strict* argument (pre-3.6 behavior is strict). .. method:: Path.rglob(pattern) From webhook-mailer at python.org Wed May 8 11:26:30 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 08 May 2019 15:26:30 -0000 Subject: [Python-checkins] Doc: Be explicit that Pathlib resolve was strict before 3.6. (GH-11316) Message-ID: https://github.com/python/cpython/commit/5e08fe18a791c6279d285ce89a0365333450c1b3 commit: 5e08fe18a791c6279d285ce89a0365333450c1b3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-08T08:26:23-07:00 summary: Doc: Be explicit that Pathlib resolve was strict before 3.6. (GH-11316) (cherry picked from commit 1d4b16051f8550fd7dada3670a3e83ae13b99d3b) Co-authored-by: Julien Palard files: M Doc/library/pathlib.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 7d4b41b1dd12..5b2df3feb708 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -966,7 +966,7 @@ call fails (for example because the path doesn't exist): is raised. .. versionadded:: 3.6 - The *strict* argument. + The *strict* argument (pre-3.6 behavior is strict). .. method:: Path.rglob(pattern) From webhook-mailer at python.org Wed May 8 12:02:42 2019 From: webhook-mailer at python.org (Julien Palard) Date: Wed, 08 May 2019 16:02:42 -0000 Subject: [Python-checkins] bpo-31873: Update unicode.rst - 'unicode' capitalization (GH-4125) Message-ID: https://github.com/python/cpython/commit/85225b6a58a516c50c055d5114668ed2fcdcda8c commit: 85225b6a58a516c50c055d5114668ed2fcdcda8c branch: master author: toonarmycaptain committer: Julien Palard date: 2019-05-08T18:02:34+02:00 summary: bpo-31873: Update unicode.rst - 'unicode' capitalization (GH-4125) Update 'unicode' capitalization. 'Unicode' is a proper noun, and as such should be capitalized. Changed multiple instances. files: M Doc/c-api/unicode.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 97c5ebcb1095..724c798456f9 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -22,14 +22,14 @@ in the Unicode object. The :c:type:`Py_UNICODE*` representation is deprecated and inefficient; it should be avoided in performance- or memory-sensitive situations. -Due to the transition between the old APIs and the new APIs, unicode objects +Due to the transition between the old APIs and the new APIs, Unicode objects can internally be in two states depending on how they were created: -* "canonical" unicode objects are all objects created by a non-deprecated - unicode API. They use the most efficient representation allowed by the +* "canonical" Unicode objects are all objects created by a non-deprecated + Unicode API. They use the most efficient representation allowed by the implementation. -* "legacy" unicode objects have been created through one of the deprecated +* "legacy" Unicode objects have been created through one of the deprecated APIs (typically :c:func:`PyUnicode_FromUnicode`) and only bear the :c:type:`Py_UNICODE*` representation; you will have to call :c:func:`PyUnicode_READY` on them before calling any other API. @@ -152,7 +152,7 @@ access internal read-only data of Unicode objects: .. c:function:: void* PyUnicode_DATA(PyObject *o) - Return a void pointer to the raw unicode buffer. *o* has to be a Unicode + Return a void pointer to the raw Unicode buffer. *o* has to be a Unicode object in the "canonical" representation (not checked). .. versionadded:: 3.3 @@ -430,7 +430,7 @@ APIs: .. c:function:: PyObject* PyUnicode_FromFormat(const char *format, ...) Take a C :c:func:`printf`\ -style *format* string and a variable number of - arguments, calculate the size of the resulting Python unicode string and return + arguments, calculate the size of the resulting Python Unicode string and return a string with the values formatted into it. The variable arguments must be C types and must correspond exactly to the format characters in the *format* ASCII-encoded string. The following format characters are allowed: @@ -504,9 +504,9 @@ APIs: | :attr:`%A` | PyObject\* | The result of calling | | | | :func:`ascii`. | +-------------------+---------------------+--------------------------------+ - | :attr:`%U` | PyObject\* | A unicode object. | + | :attr:`%U` | PyObject\* | A Unicode object. | +-------------------+---------------------+--------------------------------+ - | :attr:`%V` | PyObject\*, | A unicode object (which may be | + | :attr:`%V` | PyObject\*, | A Unicode object (which may be | | | const char\* | *NULL*) and a null-terminated | | | | C character array as a second | | | | parameter (which will be used, | @@ -1670,7 +1670,7 @@ They all return *NULL* or ``-1`` if an exception occurs. .. c:function:: int PyUnicode_CompareWithASCIIString(PyObject *uni, const char *string) - Compare a unicode object, *uni*, with *string* and return ``-1``, ``0``, ``1`` for less + Compare a Unicode object, *uni*, with *string* and return ``-1``, ``0``, ``1`` for less than, equal, and greater than, respectively. It is best to pass only ASCII-encoded strings, but the function interprets the input string as ISO-8859-1 if it contains non-ASCII characters. @@ -1680,7 +1680,7 @@ They all return *NULL* or ``-1`` if an exception occurs. .. c:function:: PyObject* PyUnicode_RichCompare(PyObject *left, PyObject *right, int op) - Rich compare two unicode strings and return one of the following: + Rich compare two Unicode strings and return one of the following: * ``NULL`` in case an exception was raised * :const:`Py_True` or :const:`Py_False` for successful comparisons @@ -1708,7 +1708,7 @@ They all return *NULL* or ``-1`` if an exception occurs. .. c:function:: void PyUnicode_InternInPlace(PyObject **string) Intern the argument *\*string* in place. The argument must be the address of a - pointer variable pointing to a Python unicode string object. If there is an + pointer variable pointing to a Python Unicode string object. If there is an existing interned string that is the same as *\*string*, it sets *\*string* to it (decrementing the reference count of the old string object and incrementing the reference count of the interned string object), otherwise it leaves @@ -1721,6 +1721,6 @@ They all return *NULL* or ``-1`` if an exception occurs. .. c:function:: PyObject* PyUnicode_InternFromString(const char *v) A combination of :c:func:`PyUnicode_FromString` and - :c:func:`PyUnicode_InternInPlace`, returning either a new unicode string + :c:func:`PyUnicode_InternInPlace`, returning either a new Unicode string object that has been interned, or a new ("owned") reference to an earlier interned string object with the same value. From webhook-mailer at python.org Wed May 8 12:31:29 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Wed, 08 May 2019 16:31:29 -0000 Subject: [Python-checkins] bpo-24048: Save the live exception during import.c's remove_module() (GH-13005) Message-ID: https://github.com/python/cpython/commit/94a64e9cd411a87514b68082c1c437eb3b49dfb9 commit: 94a64e9cd411a87514b68082c1c437eb3b49dfb9 branch: master author: Zackery Spytz committer: Nick Coghlan date: 2019-05-08T12:31:23-04:00 summary: bpo-24048: Save the live exception during import.c's remove_module() (GH-13005) Save the live exception during the course of remove_module(). files: A Misc/NEWS.d/next/Core and Builtins/2019-04-29-03-27-22.bpo-24048.vXxUDQ.rst M Python/import.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-29-03-27-22.bpo-24048.vXxUDQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-29-03-27-22.bpo-24048.vXxUDQ.rst new file mode 100644 index 000000000000..27c86a47f4b9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-29-03-27-22.bpo-24048.vXxUDQ.rst @@ -0,0 +1 @@ +Save the live exception during import.c's ``remove_module()``. diff --git a/Python/import.c b/Python/import.c index b03bc98773ae..9290f39c0ae2 100644 --- a/Python/import.c +++ b/Python/import.c @@ -837,14 +837,18 @@ PyImport_AddModule(const char *name) static void remove_module(PyObject *name) { + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); PyObject *modules = PyImport_GetModuleDict(); + if (!PyMapping_HasKey(modules, name)) { + goto out; + } if (PyMapping_DelItem(modules, name) < 0) { - if (!PyMapping_HasKey(modules, name)) { - return; - } Py_FatalError("import: deleting existing key in " "sys.modules failed"); } +out: + PyErr_Restore(type, value, traceback); } From webhook-mailer at python.org Wed May 8 12:33:30 2019 From: webhook-mailer at python.org (Ned Deily) Date: Wed, 08 May 2019 16:33:30 -0000 Subject: [Python-checkins] bpo-30458: Disallow control chars in http URLs. (GH-12755) (GH-13155) Message-ID: https://github.com/python/cpython/commit/c50d437e942d4c4c45c8cd76329b05340c02eb31 commit: c50d437e942d4c4c45c8cd76329b05340c02eb31 branch: 3.6 author: Miro Hron?ok committer: Ned Deily date: 2019-05-08T12:33:24-04:00 summary: bpo-30458: Disallow control chars in http URLs. (GH-12755) (GH-13155) Disallow control chars in http URLs in urllib.urlopen. This addresses a potential security problem for applications that do not sanity check their URLs where http request headers could be injected. Disable https related urllib tests on a build without ssl (GH-13032) These tests require an SSL enabled build. Skip these tests when python is built without SSL to fix test failures. Use http.client.InvalidURL instead of ValueError as the new error case's exception. (GH-13044) Co-Authored-By: Miro Hron?ok files: A Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst M Lib/http/client.py M Lib/test/test_urllib.py M Lib/test/test_xmlrpc.py diff --git a/Lib/http/client.py b/Lib/http/client.py index baabfeb2ea8c..1a6bd8ac42eb 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -141,6 +141,16 @@ _is_legal_header_name = re.compile(rb'[^:\s][^:\r\n]*').fullmatch _is_illegal_header_value = re.compile(rb'\n(?![ \t])|\r(?![ \t\n])').search +# These characters are not allowed within HTTP URL paths. +# See https://tools.ietf.org/html/rfc3986#section-3.3 and the +# https://tools.ietf.org/html/rfc3986#appendix-A pchar definition. +# Prevents CVE-2019-9740. Includes control characters such as \r\n. +# We don't restrict chars above \x7f as putrequest() limits us to ASCII. +_contains_disallowed_url_pchar_re = re.compile('[\x00-\x20\x7f]') +# Arguably only these _should_ allowed: +# _is_allowed_url_pchars_re = re.compile(r"^[/!$&'()*+,;=:@%a-zA-Z0-9._~-]+$") +# We are more lenient for assumed real world compatibility purposes. + # We always set the Content-Length header for these methods because some # servers will otherwise respond with a 411 _METHODS_EXPECTING_BODY = {'PATCH', 'POST', 'PUT'} @@ -1111,6 +1121,11 @@ def putrequest(self, method, url, skip_host=False, self._method = method if not url: url = '/' + # Prevent CVE-2019-9740. + match = _contains_disallowed_url_pchar_re.search(url) + if match: + raise InvalidURL(f"URL can't contain control characters. {url!r} " + f"(found at least {match.group()!r})") request = '%s %s %s' % (method, url, self._http_vsn_str) # Non-ASCII characters should have been eliminated earlier diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index fa3757cc94be..649a5b81575b 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -329,6 +329,59 @@ def test_willclose(self): finally: self.unfakehttp() + @unittest.skipUnless(ssl, "ssl module required") + def test_url_with_control_char_rejected(self): + for char_no in list(range(0, 0x21)) + [0x7f]: + char = chr(char_no) + schemeless_url = f"//localhost:7777/test{char}/" + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + try: + # We explicitly test urllib.request.urlopen() instead of the top + # level 'def urlopen()' function defined in this... (quite ugly) + # test suite. They use different url opening codepaths. Plain + # urlopen uses FancyURLOpener which goes via a codepath that + # calls urllib.parse.quote() on the URL which makes all of the + # above attempts at injection within the url _path_ safe. + escaped_char_repr = repr(char).replace('\\', r'\\') + InvalidURL = http.client.InvalidURL + with self.assertRaisesRegex( + InvalidURL, f"contain control.*{escaped_char_repr}"): + urllib.request.urlopen(f"http:{schemeless_url}") + with self.assertRaisesRegex( + InvalidURL, f"contain control.*{escaped_char_repr}"): + urllib.request.urlopen(f"https:{schemeless_url}") + # This code path quotes the URL so there is no injection. + resp = urlopen(f"http:{schemeless_url}") + self.assertNotIn(char, resp.geturl()) + finally: + self.unfakehttp() + + @unittest.skipUnless(ssl, "ssl module required") + def test_url_with_newline_header_injection_rejected(self): + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + host = "localhost:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123" + schemeless_url = "//" + host + ":8080/test/?test=a" + try: + # We explicitly test urllib.request.urlopen() instead of the top + # level 'def urlopen()' function defined in this... (quite ugly) + # test suite. They use different url opening codepaths. Plain + # urlopen uses FancyURLOpener which goes via a codepath that + # calls urllib.parse.quote() on the URL which makes all of the + # above attempts at injection within the url _path_ safe. + InvalidURL = http.client.InvalidURL + with self.assertRaisesRegex( + InvalidURL, r"contain control.*\\r.*(found at least . .)"): + urllib.request.urlopen(f"http:{schemeless_url}") + with self.assertRaisesRegex(InvalidURL, r"contain control.*\\n"): + urllib.request.urlopen(f"https:{schemeless_url}") + # This code path quotes the URL so there is no injection. + resp = urlopen(f"http:{schemeless_url}") + self.assertNotIn(' ', resp.geturl()) + self.assertNotIn('\r', resp.geturl()) + self.assertNotIn('\n', resp.geturl()) + finally: + self.unfakehttp() + def test_read_0_9(self): # "0.9" response accepted (but not "simple responses" without # a status line) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 07f7ba0f00b5..fc601d455224 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -950,7 +950,12 @@ def test_unicode_host(self): def test_partial_post(self): # Check that a partial POST doesn't make the server loop: issue #14001. conn = http.client.HTTPConnection(ADDR, PORT) - conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') + conn.send('POST /RPC2 HTTP/1.0\r\n' + 'Content-Length: 100\r\n\r\n' + 'bye HTTP/1.1\r\n' + f'Host: {ADDR}:{PORT}\r\n' + 'Accept-Encoding: identity\r\n' + 'Content-Length: 0\r\n\r\n'.encode('ascii')) conn.close() def test_context_manager(self): diff --git a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst new file mode 100644 index 000000000000..ed8027fb4d64 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst @@ -0,0 +1 @@ +Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause an http.client.InvalidURL exception to be raised. From webhook-mailer at python.org Wed May 8 12:34:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 08 May 2019 16:34:16 -0000 Subject: [Python-checkins] bpo-31873: Update unicode.rst - 'unicode' capitalization (GH-4125) Message-ID: https://github.com/python/cpython/commit/ed8860c5af87d78d312ae30dd2d6bedc60bd86e5 commit: ed8860c5af87d78d312ae30dd2d6bedc60bd86e5 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-08T09:34:12-07:00 summary: bpo-31873: Update unicode.rst - 'unicode' capitalization (GH-4125) Update 'unicode' capitalization. 'Unicode' is a proper noun, and as such should be capitalized. Changed multiple instances. (cherry picked from commit 85225b6a58a516c50c055d5114668ed2fcdcda8c) Co-authored-by: toonarmycaptain files: M Doc/c-api/unicode.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 39c067d439cc..1d724a325745 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -22,14 +22,14 @@ in the Unicode object. The :c:type:`Py_UNICODE*` representation is deprecated and inefficient; it should be avoided in performance- or memory-sensitive situations. -Due to the transition between the old APIs and the new APIs, unicode objects +Due to the transition between the old APIs and the new APIs, Unicode objects can internally be in two states depending on how they were created: -* "canonical" unicode objects are all objects created by a non-deprecated - unicode API. They use the most efficient representation allowed by the +* "canonical" Unicode objects are all objects created by a non-deprecated + Unicode API. They use the most efficient representation allowed by the implementation. -* "legacy" unicode objects have been created through one of the deprecated +* "legacy" Unicode objects have been created through one of the deprecated APIs (typically :c:func:`PyUnicode_FromUnicode`) and only bear the :c:type:`Py_UNICODE*` representation; you will have to call :c:func:`PyUnicode_READY` on them before calling any other API. @@ -152,7 +152,7 @@ access internal read-only data of Unicode objects: .. c:function:: void* PyUnicode_DATA(PyObject *o) - Return a void pointer to the raw unicode buffer. *o* has to be a Unicode + Return a void pointer to the raw Unicode buffer. *o* has to be a Unicode object in the "canonical" representation (not checked). .. versionadded:: 3.3 @@ -430,7 +430,7 @@ APIs: .. c:function:: PyObject* PyUnicode_FromFormat(const char *format, ...) Take a C :c:func:`printf`\ -style *format* string and a variable number of - arguments, calculate the size of the resulting Python unicode string and return + arguments, calculate the size of the resulting Python Unicode string and return a string with the values formatted into it. The variable arguments must be C types and must correspond exactly to the format characters in the *format* ASCII-encoded string. The following format characters are allowed: @@ -504,9 +504,9 @@ APIs: | :attr:`%A` | PyObject\* | The result of calling | | | | :func:`ascii`. | +-------------------+---------------------+--------------------------------+ - | :attr:`%U` | PyObject\* | A unicode object. | + | :attr:`%U` | PyObject\* | A Unicode object. | +-------------------+---------------------+--------------------------------+ - | :attr:`%V` | PyObject\*, | A unicode object (which may be | + | :attr:`%V` | PyObject\*, | A Unicode object (which may be | | | const char\* | *NULL*) and a null-terminated | | | | C character array as a second | | | | parameter (which will be used, | @@ -1670,7 +1670,7 @@ They all return *NULL* or ``-1`` if an exception occurs. .. c:function:: int PyUnicode_CompareWithASCIIString(PyObject *uni, const char *string) - Compare a unicode object, *uni*, with *string* and return ``-1``, ``0``, ``1`` for less + Compare a Unicode object, *uni*, with *string* and return ``-1``, ``0``, ``1`` for less than, equal, and greater than, respectively. It is best to pass only ASCII-encoded strings, but the function interprets the input string as ISO-8859-1 if it contains non-ASCII characters. @@ -1680,7 +1680,7 @@ They all return *NULL* or ``-1`` if an exception occurs. .. c:function:: PyObject* PyUnicode_RichCompare(PyObject *left, PyObject *right, int op) - Rich compare two unicode strings and return one of the following: + Rich compare two Unicode strings and return one of the following: * ``NULL`` in case an exception was raised * :const:`Py_True` or :const:`Py_False` for successful comparisons @@ -1708,7 +1708,7 @@ They all return *NULL* or ``-1`` if an exception occurs. .. c:function:: void PyUnicode_InternInPlace(PyObject **string) Intern the argument *\*string* in place. The argument must be the address of a - pointer variable pointing to a Python unicode string object. If there is an + pointer variable pointing to a Python Unicode string object. If there is an existing interned string that is the same as *\*string*, it sets *\*string* to it (decrementing the reference count of the old string object and incrementing the reference count of the interned string object), otherwise it leaves @@ -1721,6 +1721,6 @@ They all return *NULL* or ``-1`` if an exception occurs. .. c:function:: PyObject* PyUnicode_InternFromString(const char *v) A combination of :c:func:`PyUnicode_FromString` and - :c:func:`PyUnicode_InternInPlace`, returning either a new unicode string + :c:func:`PyUnicode_InternInPlace`, returning either a new Unicode string object that has been interned, or a new ("owned") reference to an earlier interned string object with the same value. From webhook-mailer at python.org Wed May 8 12:35:14 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 08 May 2019 16:35:14 -0000 Subject: [Python-checkins] bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) Message-ID: https://github.com/python/cpython/commit/6bd81734de0b73f1431880d6a75fb71bcbc65fa1 commit: 6bd81734de0b73f1431880d6a75fb71bcbc65fa1 branch: master author: Gregory P. Smith committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-08T09:35:09-07:00 summary: bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) We updated the server, our testsuite must match. https://bugs.python.org/issue36816 ?? CLE -> DEN ?? #pycon2019 files: A Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst M Lib/test/selfsigned_pythontestdotnet.pem diff --git a/Lib/test/selfsigned_pythontestdotnet.pem b/Lib/test/selfsigned_pythontestdotnet.pem index b6d259bcb236..2b1760747bce 100644 --- a/Lib/test/selfsigned_pythontestdotnet.pem +++ b/Lib/test/selfsigned_pythontestdotnet.pem @@ -1,16 +1,34 @@ -----BEGIN CERTIFICATE----- -MIIClTCCAf6gAwIBAgIJAKGU95wKR8pTMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV -BAYTAlhZMRcwFQYDVQQHDA5DYXN0bGUgQW50aHJheDEjMCEGA1UECgwaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMMGnNlbGYtc2lnbmVkLnB5dGhv -bnRlc3QubmV0MB4XDTE0MTEwMjE4MDkyOVoXDTI0MTAzMDE4MDkyOVowcDELMAkG -A1UEBhMCWFkxFzAVBgNVBAcMDkNhc3RsZSBBbnRocmF4MSMwIQYDVQQKDBpQeXRo -b24gU29mdHdhcmUgRm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0 -aG9udGVzdC5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANDXQXW9tjyZ -Xt0Iv2tLL1+jinr4wGg36ioLDLFkMf+2Y1GL0v0BnKYG4N1OKlAU15LXGeGer8vm -Sv/yIvmdrELvhAbbo3w4a9TMYQA4XkIVLdvu3mvNOAet+8PMJxn26dbDhG809ALv -EHY57lQsBS3G59RZyBPVqAqmImWNJnVzAgMBAAGjNzA1MCUGA1UdEQQeMByCGnNl -bGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEFBQADgYEAIuzAhgMouJpNdf3URCHIineyoSt6WK/9+eyUcjlKOrDoXNZaD72h -TXMeKYoWvJyVcSLKL8ckPtDobgP2OTt0UkyAaj0n+ZHaqq1lH2yVfGUA1ILJv515 -C8BqbvVZuqm3i7ygmw3bqE/lYMgOrYtXXnqOrz6nvsE6Yc9V9rFflOM= +MIIF9zCCA9+gAwIBAgIUH98b4Fw/DyugC9cV7VK7ZODzHsIwDQYJKoZIhvcNAQEL +BQAwgYoxCzAJBgNVBAYTAlhZMRcwFQYDVQQIDA5DYXN0bGUgQW50aHJheDEYMBYG +A1UEBwwPQXJndW1lbnQgQ2xpbmljMSMwIQYDVQQKDBpQeXRob24gU29mdHdhcmUg +Rm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQw +HhcNMTkwNTA4MDEwMjQzWhcNMjcwNzI0MDEwMjQzWjCBijELMAkGA1UEBhMCWFkx +FzAVBgNVBAgMDkNhc3RsZSBBbnRocmF4MRgwFgYDVQQHDA9Bcmd1bWVudCBDbGlu +aWMxIzAhBgNVBAoMGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQD +DBpzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMKdJlyCThkahwoBb7pl5q64Pe9Fn5jrIvzsveHTc97TpjV2 +RLfICnXKrltPk/ohkVl6K5SUZQZwMVzFubkyxE0nZPHYHlpiKWQxbsYVkYv01rix +IFdLvaxxbGYke2jwQao31s4o61AdlsfK1SdpHQUynBBMssqI3SB4XPmcA7e+wEEx +jxjVish4ixA1vuIZOx8yibu+CFCf/geEjoBMF3QPdzULzlrCSw8k/45iZCSoNbvK +DoL4TVV07PHOxpheDh8ZQmepGvU6pVqhb9m4lgmV0OGWHgozd5Ur9CbTVDmxIEz3 +TSoRtNJK7qtyZdGNqwjksQxgZTjM/d/Lm/BJG99AiOmYOjsl9gbQMZgvQmMAtUsI +aMJnQuZ6R+KEpW/TR5qSKLWZSG45z/op+tzI2m+cE6HwTRVAWbcuJxcAA55MZjqU +OOOu3BBYMjS5nf2sQ9uoXsVBFH7i0mQqoW1SLzr9opI8KsWwFxQmO2vBxWYaN+lH +OmwBZBwyODIsmI1YGXmTp09NxRYz3Qe5GCgFzYowpMrcxUC24iduIdMwwhRM7rKg +7GtIWMSrFfuI1XCLRmSlhDbhNN6fVg2f8Bo9PdH9ihiIyxSrc+FOUasUYCCJvlSZ +8hFUlLvcmrZlWuazohm0lsXuMK1JflmQr/DA/uXxP9xzFfRy+RU3jDyxJbRHAgMB +AAGjUzBRMB0GA1UdDgQWBBSQJyxiPMRK01i+0BsV9zUwDiBaHzAfBgNVHSMEGDAW +gBSQJyxiPMRK01i+0BsV9zUwDiBaHzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4ICAQCR+7a7N/m+WLkxPPIA/CB4MOr2Uf8ixTv435Nyv6rXOun0+lTP +ExSZ0uYQ+L0WylItI3cQHULldDueD+s8TGzxf5woaLKf6tqyr0NYhKs+UeNEzDnN +9PHQIhX0SZw3XyXGUgPNBfRCg2ZDdtMMdOU4XlQN/IN/9hbYTrueyY7eXq9hmtI9 +1srftAMqr9SR1JP7aHI6DVgrEsZVMTDnfT8WmLSGLlY1HmGfdEn1Ip5sbo9uSkiH +AEPgPfjYIvR5LqTOMn4KsrlZyBbFIDh9Sl99M1kZzgH6zUGVLCDg1y6Cms69fx/e +W1HoIeVkY4b4TY7Bk7JsqyNhIuqu7ARaxkdaZWhYaA2YyknwANdFfNpfH+elCLIk +BUt5S3f4i7DaUePTvKukCZiCq4Oyln7RcOn5If73wCeLB/ZM9Ei1HforyLWP1CN8 +XLfpHaoeoPSWIveI0XHUl65LsPN2UbMbul/F23hwl+h8+BLmyAS680Yhn4zEN6Ku +B7Po90HoFa1Du3bmx4jsN73UkT/dwMTi6K072FbipnC1904oGlWmLwvAHvrtxxmL +Pl3pvEaZIu8wa/PNF6Y7J7VIewikIJq6Ta6FrWeFfzMWOj2qA1ZZi6fUaDSNYvuV +J5quYKCc/O+I/yDDf8wyBbZ/gvUXzUHTMYGG+bFrn1p7XDbYYeEJ6R/xEg== -----END CERTIFICATE----- diff --git a/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst new file mode 100644 index 000000000000..420dfe832366 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst @@ -0,0 +1 @@ +Update Lib/test/selfsigned_pythontestdotnet.pem to match self-signed.pythontest.net's new TLS certificate. \ No newline at end of file From webhook-mailer at python.org Wed May 8 13:32:29 2019 From: webhook-mailer at python.org (Kushal Das) Date: Wed, 08 May 2019 17:32:29 -0000 Subject: [Python-checkins] bpo-24758: Improve the error msg for unittest.mock.Mock()'s unsafe mode (#12991) Message-ID: https://github.com/python/cpython/commit/b9b08cd948de97d756a199b60becce8397a8c882 commit: b9b08cd948de97d756a199b60becce8397a8c882 branch: master author: Zackery Spytz committer: Kushal Das date: 2019-05-08T23:02:23+05:30 summary: bpo-24758: Improve the error msg for unittest.mock.Mock()'s unsafe mode (#12991) * bpo-24758: Improve the error msg for unittest.mock.Mock()'s unsafe mode * Make the requested changes. files: M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 1e8057d5f5bb..47ed06c6f486 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -572,7 +572,8 @@ def __getattr__(self, name): raise AttributeError(name) if not self._mock_unsafe: if name.startswith(('assert', 'assret')): - raise AttributeError(name) + raise AttributeError("Attributes cannot start with 'assert' " + "or 'assret'") result = self._mock_children.get(name) if result is _deleted: diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 5f917dd20f1d..b20b8e20e7e6 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1453,9 +1453,10 @@ def static_method(): pass #Issue21238 def test_mock_unsafe(self): m = Mock() - with self.assertRaises(AttributeError): + msg = "Attributes cannot start with 'assert' or 'assret'" + with self.assertRaisesRegex(AttributeError, msg): m.assert_foo_call() - with self.assertRaises(AttributeError): + with self.assertRaisesRegex(AttributeError, msg): m.assret_foo_call() m = Mock(unsafe=True) m.assert_foo_call() From webhook-mailer at python.org Wed May 8 14:04:59 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 08 May 2019 18:04:59 -0000 Subject: [Python-checkins] bpo-26903: Limit ProcessPoolExecutor to 61 workers on Windows (GH-13132) Message-ID: https://github.com/python/cpython/commit/39889864c09741909da4ec489459d0197ea8f1fc commit: 39889864c09741909da4ec489459d0197ea8f1fc branch: master author: Brian Quinlan committer: Steve Dower date: 2019-05-08T14:04:53-04:00 summary: bpo-26903: Limit ProcessPoolExecutor to 61 workers on Windows (GH-13132) Co-Authored-By: brianquinlan files: A Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst M Doc/library/concurrent.futures.rst M Lib/concurrent/futures/process.py M Lib/test/test_concurrent_futures.py diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 8d6b1e8d71ff..ffc29d782ec0 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -216,6 +216,10 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. given, it will default to the number of processors on the machine. If *max_workers* is lower or equal to ``0``, then a :exc:`ValueError` will be raised. + On Windows, *max_workers* must be equal or lower than ``61``. If it is not + then :exc:`ValueError` will be raised. If *max_workers* is ``None``, then + the default chosen will be at most ``61``, even if more processors are + available. *mp_context* can be a multiprocessing context or None. It will be used to launch the workers. If *mp_context* is ``None`` or not given, the default multiprocessing context is used. diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index d7e2478d9227..dd14eaec907d 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -57,6 +57,7 @@ import weakref from functools import partial import itertools +import sys import traceback # Workers are created as daemon threads and processes. This is done to allow the @@ -109,6 +110,12 @@ def _python_exit(): EXTRA_QUEUED_CALLS = 1 +# On Windows, WaitForMultipleObjects is used to wait for processes to finish. +# It can wait on, at most, 63 objects. There is an overhead of two objects: +# - the result queue reader +# - the thread wakeup reader +_MAX_WINDOWS_WORKERS = 63 - 2 + # Hack to embed stringification of remote traceback in local traceback class _RemoteTraceback(Exception): @@ -505,9 +512,16 @@ def __init__(self, max_workers=None, mp_context=None, if max_workers is None: self._max_workers = os.cpu_count() or 1 + if sys.platform == 'win32': + self._max_workers = min(_MAX_WINDOWS_WORKERS, + self._max_workers) else: if max_workers <= 0: raise ValueError("max_workers must be greater than 0") + elif (sys.platform == 'win32' and + max_workers > _MAX_WINDOWS_WORKERS): + raise ValueError( + f"max_workers must be <= {_MAX_WINDOWS_WORKERS}") self._max_workers = max_workers diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 903afbd2a4f6..3c963dff1db2 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -755,6 +755,13 @@ def test_default_workers(self): class ProcessPoolExecutorTest(ExecutorTest): + + @unittest.skipUnless(sys.platform=='win32', 'Windows-only process limit') + def test_max_workers_too_large(self): + with self.assertRaisesRegex(ValueError, + "max_workers must be <= 61"): + futures.ProcessPoolExecutor(max_workers=62) + def test_killed_child(self): # When a child process is abruptly terminated, the whole pool gets # "broken". diff --git a/Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst b/Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst new file mode 100644 index 000000000000..ec3aa05e907e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst @@ -0,0 +1 @@ +Limit `max_workers` in `ProcessPoolExecutor` to 61 to work around a WaitForMultipleObjects limitation. \ No newline at end of file From webhook-mailer at python.org Wed May 8 15:21:05 2019 From: webhook-mailer at python.org (Ned Deily) Date: Wed, 08 May 2019 19:21:05 -0000 Subject: [Python-checkins] [3.6] bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) (GH-13198) Message-ID: https://github.com/python/cpython/commit/2b9d7abdbd4b41e2c624858f5bc80da59d8a681d commit: 2b9d7abdbd4b41e2c624858f5bc80da59d8a681d branch: 3.6 author: Gregory P. Smith committer: Ned Deily date: 2019-05-08T15:20:58-04:00 summary: [3.6] bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) (GH-13198) We updated the server, our testsuite must match. https://bugs.python.org/issue36816 ?? CLE -> DEN ?? GH-pycon2019 (cherry picked from commit 6bd81734de0b73f1431880d6a75fb71bcbc65fa1) Co-authored-by: Gregory P. Smith files: A Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst M Lib/test/selfsigned_pythontestdotnet.pem diff --git a/Lib/test/selfsigned_pythontestdotnet.pem b/Lib/test/selfsigned_pythontestdotnet.pem index b6d259bcb236..2b1760747bce 100644 --- a/Lib/test/selfsigned_pythontestdotnet.pem +++ b/Lib/test/selfsigned_pythontestdotnet.pem @@ -1,16 +1,34 @@ -----BEGIN CERTIFICATE----- -MIIClTCCAf6gAwIBAgIJAKGU95wKR8pTMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV -BAYTAlhZMRcwFQYDVQQHDA5DYXN0bGUgQW50aHJheDEjMCEGA1UECgwaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMMGnNlbGYtc2lnbmVkLnB5dGhv -bnRlc3QubmV0MB4XDTE0MTEwMjE4MDkyOVoXDTI0MTAzMDE4MDkyOVowcDELMAkG -A1UEBhMCWFkxFzAVBgNVBAcMDkNhc3RsZSBBbnRocmF4MSMwIQYDVQQKDBpQeXRo -b24gU29mdHdhcmUgRm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0 -aG9udGVzdC5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANDXQXW9tjyZ -Xt0Iv2tLL1+jinr4wGg36ioLDLFkMf+2Y1GL0v0BnKYG4N1OKlAU15LXGeGer8vm -Sv/yIvmdrELvhAbbo3w4a9TMYQA4XkIVLdvu3mvNOAet+8PMJxn26dbDhG809ALv -EHY57lQsBS3G59RZyBPVqAqmImWNJnVzAgMBAAGjNzA1MCUGA1UdEQQeMByCGnNl -bGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEFBQADgYEAIuzAhgMouJpNdf3URCHIineyoSt6WK/9+eyUcjlKOrDoXNZaD72h -TXMeKYoWvJyVcSLKL8ckPtDobgP2OTt0UkyAaj0n+ZHaqq1lH2yVfGUA1ILJv515 -C8BqbvVZuqm3i7ygmw3bqE/lYMgOrYtXXnqOrz6nvsE6Yc9V9rFflOM= +MIIF9zCCA9+gAwIBAgIUH98b4Fw/DyugC9cV7VK7ZODzHsIwDQYJKoZIhvcNAQEL +BQAwgYoxCzAJBgNVBAYTAlhZMRcwFQYDVQQIDA5DYXN0bGUgQW50aHJheDEYMBYG +A1UEBwwPQXJndW1lbnQgQ2xpbmljMSMwIQYDVQQKDBpQeXRob24gU29mdHdhcmUg +Rm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQw +HhcNMTkwNTA4MDEwMjQzWhcNMjcwNzI0MDEwMjQzWjCBijELMAkGA1UEBhMCWFkx +FzAVBgNVBAgMDkNhc3RsZSBBbnRocmF4MRgwFgYDVQQHDA9Bcmd1bWVudCBDbGlu +aWMxIzAhBgNVBAoMGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQD +DBpzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMKdJlyCThkahwoBb7pl5q64Pe9Fn5jrIvzsveHTc97TpjV2 +RLfICnXKrltPk/ohkVl6K5SUZQZwMVzFubkyxE0nZPHYHlpiKWQxbsYVkYv01rix +IFdLvaxxbGYke2jwQao31s4o61AdlsfK1SdpHQUynBBMssqI3SB4XPmcA7e+wEEx +jxjVish4ixA1vuIZOx8yibu+CFCf/geEjoBMF3QPdzULzlrCSw8k/45iZCSoNbvK +DoL4TVV07PHOxpheDh8ZQmepGvU6pVqhb9m4lgmV0OGWHgozd5Ur9CbTVDmxIEz3 +TSoRtNJK7qtyZdGNqwjksQxgZTjM/d/Lm/BJG99AiOmYOjsl9gbQMZgvQmMAtUsI +aMJnQuZ6R+KEpW/TR5qSKLWZSG45z/op+tzI2m+cE6HwTRVAWbcuJxcAA55MZjqU +OOOu3BBYMjS5nf2sQ9uoXsVBFH7i0mQqoW1SLzr9opI8KsWwFxQmO2vBxWYaN+lH +OmwBZBwyODIsmI1YGXmTp09NxRYz3Qe5GCgFzYowpMrcxUC24iduIdMwwhRM7rKg +7GtIWMSrFfuI1XCLRmSlhDbhNN6fVg2f8Bo9PdH9ihiIyxSrc+FOUasUYCCJvlSZ +8hFUlLvcmrZlWuazohm0lsXuMK1JflmQr/DA/uXxP9xzFfRy+RU3jDyxJbRHAgMB +AAGjUzBRMB0GA1UdDgQWBBSQJyxiPMRK01i+0BsV9zUwDiBaHzAfBgNVHSMEGDAW +gBSQJyxiPMRK01i+0BsV9zUwDiBaHzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4ICAQCR+7a7N/m+WLkxPPIA/CB4MOr2Uf8ixTv435Nyv6rXOun0+lTP +ExSZ0uYQ+L0WylItI3cQHULldDueD+s8TGzxf5woaLKf6tqyr0NYhKs+UeNEzDnN +9PHQIhX0SZw3XyXGUgPNBfRCg2ZDdtMMdOU4XlQN/IN/9hbYTrueyY7eXq9hmtI9 +1srftAMqr9SR1JP7aHI6DVgrEsZVMTDnfT8WmLSGLlY1HmGfdEn1Ip5sbo9uSkiH +AEPgPfjYIvR5LqTOMn4KsrlZyBbFIDh9Sl99M1kZzgH6zUGVLCDg1y6Cms69fx/e +W1HoIeVkY4b4TY7Bk7JsqyNhIuqu7ARaxkdaZWhYaA2YyknwANdFfNpfH+elCLIk +BUt5S3f4i7DaUePTvKukCZiCq4Oyln7RcOn5If73wCeLB/ZM9Ei1HforyLWP1CN8 +XLfpHaoeoPSWIveI0XHUl65LsPN2UbMbul/F23hwl+h8+BLmyAS680Yhn4zEN6Ku +B7Po90HoFa1Du3bmx4jsN73UkT/dwMTi6K072FbipnC1904oGlWmLwvAHvrtxxmL +Pl3pvEaZIu8wa/PNF6Y7J7VIewikIJq6Ta6FrWeFfzMWOj2qA1ZZi6fUaDSNYvuV +J5quYKCc/O+I/yDDf8wyBbZ/gvUXzUHTMYGG+bFrn1p7XDbYYeEJ6R/xEg== -----END CERTIFICATE----- diff --git a/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst new file mode 100644 index 000000000000..420dfe832366 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst @@ -0,0 +1 @@ +Update Lib/test/selfsigned_pythontestdotnet.pem to match self-signed.pythontest.net's new TLS certificate. \ No newline at end of file From webhook-mailer at python.org Wed May 8 15:40:29 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Wed, 08 May 2019 19:40:29 -0000 Subject: [Python-checkins] bpo-35900: Add a state_setter arg to save_reduce (GH-12588) Message-ID: https://github.com/python/cpython/commit/65d98d0f53f558d7c799098da0abf376068c15fd commit: 65d98d0f53f558d7c799098da0abf376068c15fd branch: master author: Pierre Glaser committer: Antoine Pitrou date: 2019-05-08T21:40:25+02:00 summary: bpo-35900: Add a state_setter arg to save_reduce (GH-12588) Allow reduction methods to return a 6-item tuple where the 6th item specifies a custom state-setting method that's called instead of the regular ``__setstate__`` method. files: A Misc/NEWS.d/next/Library/2019-03-27-15-09-00.bpo-35900.fh56UU.rst M Doc/library/pickle.rst M Lib/pickle.py M Lib/test/pickletester.py M Modules/_pickle.c diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index 53eb5d39ef94..3d89536d7d11 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -598,7 +598,7 @@ or both. module; the pickle module searches the module namespace to determine the object's module. This behaviour is typically useful for singletons. - When a tuple is returned, it must be between two and five items long. + When a tuple is returned, it must be between two and six items long. Optional items can either be omitted, or ``None`` can be provided as their value. The semantics of each item are in order: @@ -629,6 +629,15 @@ or both. value``. This is primarily used for dictionary subclasses, but may be used by other classes as long as they implement :meth:`__setitem__`. + * Optionally, a callable with a ``(obj, state)`` signature. This + callable allows the user to programatically control the state-updating + behavior of a specific object, instead of using ``obj``'s static + :meth:`__setstate__` method. If not ``None``, this callable will have + priority over ``obj``'s :meth:`__setstate__`. + + .. versionadded:: 3.8 + The optional sixth tuple item, ``(obj, state)``, was added. + .. method:: object.__reduce_ex__(protocol) diff --git a/Lib/pickle.py b/Lib/pickle.py index d533e660af3b..47f0d280efc9 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -537,9 +537,9 @@ def save(self, obj, save_persistent_id=True): # Assert that it returned an appropriately sized tuple l = len(rv) - if not (2 <= l <= 5): + if not (2 <= l <= 6): raise PicklingError("Tuple returned by %s must have " - "two to five elements" % reduce) + "two to six elements" % reduce) # Save the reduce() output and finally memoize the object self.save_reduce(obj=obj, *rv) @@ -561,7 +561,7 @@ def save_pers(self, pid): "persistent IDs in protocol 0 must be ASCII strings") def save_reduce(self, func, args, state=None, listitems=None, - dictitems=None, obj=None): + dictitems=None, state_setter=None, obj=None): # This API is called by some subclasses if not isinstance(args, tuple): @@ -655,8 +655,25 @@ def save_reduce(self, func, args, state=None, listitems=None, self._batch_setitems(dictitems) if state is not None: - save(state) - write(BUILD) + if state_setter is None: + save(state) + write(BUILD) + else: + # If a state_setter is specified, call it instead of load_build + # to update obj's with its previous state. + # First, push state_setter and its tuple of expected arguments + # (obj, state) onto the stack. + save(state_setter) + save(obj) # simple BINGET opcode as obj is already memoized. + save(state) + write(TUPLE2) + # Trigger a state_setter(obj, state) function call. + write(REDUCE) + # The purpose of state_setter is to carry-out an + # inplace modification of obj. We do not care about what the + # method might return, so its output is eventually removed from + # the stack. + write(POP) # Methods below this point are dispatched through the dispatch table diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index bb8e6ce0964f..19e8823a7310 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -2992,7 +2992,26 @@ def __reduce__(self): return str, (REDUCE_A,) class BBB(object): - pass + def __init__(self): + # Add an instance attribute to enable state-saving routines at pickling + # time. + self.a = "some attribute" + + def __setstate__(self, state): + self.a = "BBB.__setstate__" + + +def setstate_bbb(obj, state): + """Custom state setter for BBB objects + + Such callable may be created by other persons than the ones who created the + BBB class. If passed as the state_setter item of a custom reducer, this + allows for custom state setting behavior of BBB objects. One can think of + it as the analogous of list_setitems or dict_setitems but for foreign + classes/functions. + """ + obj.a = "custom state_setter" + class AbstractDispatchTableTests(unittest.TestCase): @@ -3081,6 +3100,25 @@ def reduce_2(obj): self.assertEqual(default_load_dump(a), REDUCE_A) self.assertIsInstance(default_load_dump(b), BBB) + # End-to-end testing of save_reduce with the state_setter keyword + # argument. This is a dispatch_table test as the primary goal of + # state_setter is to tweak objects reduction behavior. + # In particular, state_setter is useful when the default __setstate__ + # behavior is not flexible enough. + + # No custom reducer for b has been registered for now, so + # BBB.__setstate__ should be used at unpickling time + self.assertEqual(default_load_dump(b).a, "BBB.__setstate__") + + def reduce_bbb(obj): + return BBB, (), obj.__dict__, None, None, setstate_bbb + + dispatch_table[BBB] = reduce_bbb + + # The custom reducer reduce_bbb includes a state setter, that should + # have priority over BBB.__setstate__ + self.assertEqual(custom_load_dump(b).a, "custom state_setter") + if __name__ == "__main__": # Print some stuff that can be used to rewrite DATA{0,1,2} diff --git a/Misc/NEWS.d/next/Library/2019-03-27-15-09-00.bpo-35900.fh56UU.rst b/Misc/NEWS.d/next/Library/2019-03-27-15-09-00.bpo-35900.fh56UU.rst new file mode 100644 index 000000000000..7f3a0675cdab --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-27-15-09-00.bpo-35900.fh56UU.rst @@ -0,0 +1,3 @@ +Allow reduction methods to return a 6-item tuple where the 6th item specifies a +custom state-setting method that's called instead of the regular +``__setstate__`` method. diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 391ce5e923c6..897bbe1f24e4 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -3662,6 +3662,7 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) PyObject *state = NULL; PyObject *listitems = Py_None; PyObject *dictitems = Py_None; + PyObject *state_setter = Py_None; PickleState *st = _Pickle_GetGlobalState(); Py_ssize_t size; int use_newobj = 0, use_newobj_ex = 0; @@ -3672,14 +3673,15 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) const char newobj_ex_op = NEWOBJ_EX; size = PyTuple_Size(args); - if (size < 2 || size > 5) { + if (size < 2 || size > 6) { PyErr_SetString(st->PicklingError, "tuple returned by " - "__reduce__ must contain 2 through 5 elements"); + "__reduce__ must contain 2 through 6 elements"); return -1; } - if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5, - &callable, &argtup, &state, &listitems, &dictitems)) + if (!PyArg_UnpackTuple(args, "save_reduce", 2, 6, + &callable, &argtup, &state, &listitems, &dictitems, + &state_setter)) return -1; if (!PyCallable_Check(callable)) { @@ -3714,6 +3716,15 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) return -1; } + if (state_setter == Py_None) + state_setter = NULL; + else if (!PyCallable_Check(state_setter)) { + PyErr_Format(st->PicklingError, "sixth element of the tuple " + "returned by __reduce__ must be a function, not %s", + Py_TYPE(state_setter)->tp_name); + return -1; + } + if (self->proto >= 2) { PyObject *name; _Py_IDENTIFIER(__name__); @@ -3933,11 +3944,32 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) return -1; if (state) { - if (save(self, state, 0) < 0 || - _Pickler_Write(self, &build_op, 1) < 0) - return -1; - } + if (state_setter == NULL) { + if (save(self, state, 0) < 0 || + _Pickler_Write(self, &build_op, 1) < 0) + return -1; + } + else { + + /* If a state_setter is specified, call it instead of load_build to + * update obj's with its previous state. + * The first 4 save/write instructions push state_setter and its + * tuple of expected arguments (obj, state) onto the stack. The + * REDUCE opcode triggers the state_setter(obj, state) function + * call. Finally, because state-updating routines only do in-place + * modification, the whole operation has to be stack-transparent. + * Thus, we finally pop the call's output from the stack.*/ + const char tupletwo_op = TUPLE2; + const char pop_op = POP; + if (save(self, state_setter, 0) < 0 || + save(self, obj, 0) < 0 || save(self, state, 0) < 0 || + _Pickler_Write(self, &tupletwo_op, 1) < 0 || + _Pickler_Write(self, &reduce_op, 1) < 0 || + _Pickler_Write(self, &pop_op, 1) < 0) + return -1; + } + } return 0; } From webhook-mailer at python.org Wed May 8 16:28:55 2019 From: webhook-mailer at python.org (Eric V. Smith) Date: Wed, 08 May 2019 20:28:55 -0000 Subject: [Python-checkins] bpo-36817: Add f-string debugging using '='. (GH-13123) Message-ID: https://github.com/python/cpython/commit/9a4135e939bc223f592045a38e0f927ba170da32 commit: 9a4135e939bc223f592045a38e0f927ba170da32 branch: master author: Eric V. Smith committer: GitHub date: 2019-05-08T16:28:48-04:00 summary: bpo-36817: Add f-string debugging using '='. (GH-13123) If a "=" is specified a the end of an f-string expression, the f-string will evaluate to the text of the expression, followed by '=', followed by the repr of the value of the expression. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-02-11-48-08.bpo-36774.ZqbJ1J.rst M Doc/whatsnew/3.8.rst M Include/Python-ast.h M Lib/test/test_fstring.py M Lib/test/test_future.py M Parser/Python.asdl M Python/Python-ast.c M Python/ast.c M Python/ast_unparse.c M Python/ceval.c M Python/compile.c diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index d6388f8faaba..874b9b129432 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -148,6 +148,20 @@ extensions compiled in release mode and for C extensions compiled with the stable ABI. (Contributed by Victor Stinner in :issue:`36722`.) +f-strings now support = for quick and easy debugging +----------------------------------------------------- + +Add ``=`` specifier to f-strings. ``f'{expr=}'`` expands +to the text of the expression, an equal sign, then the repr of the +evaluated expression. So:: + + x = 3 + print(f'{x*9 + 15=}') + +Would print ``x*9 + 15=42``. + +(Contributed by Eric V. Smith and Larry Hastings in :issue:`36817`.) + Other Language Changes ====================== diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 0c739db6d141..08d50ffcddf6 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -330,6 +330,7 @@ struct _expr { expr_ty value; int conversion; expr_ty format_spec; + string expr_text; } FormattedValue; struct { @@ -637,10 +638,10 @@ expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, expr_ty _Py_Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7) _Py_FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7) +#define FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7, a8) expr_ty _Py_FormattedValue(expr_ty value, int conversion, expr_ty format_spec, - int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); + string expr_text, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); #define JoinedStr(a0, a1, a2, a3, a4, a5) _Py_JoinedStr(a0, a1, a2, a3, a4, a5) expr_ty _Py_JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 9d60be3a29a1..a0fae50d1720 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +# There are tests here with unicode string literals and +# identifiers. There's a code in ast.c that was added because of a +# failure with a non-ascii-only expression. So, I have tests for +# that. There are workarounds that would let me run tests for that +# code without unicode identifiers and strings, but just using them +# directly seems like the easiest and therefore safest thing to do. +# Unicode identifiers in tests is allowed by PEP 3131. + import ast import types import decimal @@ -878,6 +887,12 @@ def test_not_equal(self): self.assertEqual(f'{3!=4!s}', 'True') self.assertEqual(f'{3!=4!s:.3}', 'Tru') + def test_equal_equal(self): + # Because an expression ending in = has special meaning, + # there's a special test for ==. Make sure it works. + + self.assertEqual(f'{0==1}', 'False') + def test_conversions(self): self.assertEqual(f'{3.14:10.10}', ' 3.14') self.assertEqual(f'{3.14!s:10.10}', '3.14 ') @@ -1049,6 +1064,100 @@ def test_backslash_char(self): self.assertEqual(eval('f"\\\n"'), '') self.assertEqual(eval('f"\\\r"'), '') + def test_debug_conversion(self): + x = 'A string' + self.assertEqual(f'{x=}', 'x=' + repr(x)) + self.assertEqual(f'{x =}', 'x =' + repr(x)) + self.assertEqual(f'{x=!s}', 'x=' + str(x)) + self.assertEqual(f'{x=!r}', 'x=' + repr(x)) + self.assertEqual(f'{x=!a}', 'x=' + ascii(x)) + + x = 2.71828 + self.assertEqual(f'{x=:.2f}', 'x=' + format(x, '.2f')) + self.assertEqual(f'{x=:}', 'x=' + format(x, '')) + self.assertEqual(f'{x=!r:^20}', 'x=' + format(repr(x), '^20')) + self.assertEqual(f'{x=!s:^20}', 'x=' + format(str(x), '^20')) + self.assertEqual(f'{x=!a:^20}', 'x=' + format(ascii(x), '^20')) + + x = 9 + self.assertEqual(f'{3*x+15=}', '3*x+15=42') + + # There is code in ast.c that deals with non-ascii expression values. So, + # use a unicode identifier to trigger that. + ten? = 31.4 + self.assertEqual(f'{ten?=:.2f}', 'ten?=31.40') + + # Also test with Unicode in non-identifiers. + self.assertEqual(f'{"?"=}', '"?"=\'?\'') + + # Make sure nested fstrings still work. + self.assertEqual(f'{f"{3.1415=:.1f}":*^20}', '*****3.1415=3.1*****') + + # Make sure text before and after an expression with = works + # correctly. + pi = '?' + self.assertEqual(f'alpha ? {pi=} ? omega', "alpha ? pi='?' ? omega") + + # Check multi-line expressions. + self.assertEqual(f'''{ +3 +=}''', '\n3\n=3') + + # Since = is handled specially, make sure all existing uses of + # it still work. + + self.assertEqual(f'{0==1}', 'False') + self.assertEqual(f'{0!=1}', 'True') + self.assertEqual(f'{0<=1}', 'True') + self.assertEqual(f'{0>=1}', 'False') + self.assertEqual(f'{(x:="5")}', '5') + self.assertEqual(x, '5') + self.assertEqual(f'{(x:=5)}', '5') + self.assertEqual(x, 5) + self.assertEqual(f'{"="}', '=') + + x = 20 + # This isn't an assignment expression, it's 'x', with a format + # spec of '=10'. See test_walrus: you need to use parens. + self.assertEqual(f'{x:=10}', ' 20') + + # Test named function parameters, to make sure '=' parsing works + # there. + def f(a): + nonlocal x + oldx = x + x = a + return oldx + x = 0 + self.assertEqual(f'{f(a="3=")}', '0') + self.assertEqual(x, '3=') + self.assertEqual(f'{f(a=4)}', '3=') + self.assertEqual(x, 4) + + # Make sure __format__ is being called. + class C: + def __format__(self, s): + return f'FORMAT-{s}' + def __repr__(self): + return 'REPR' + + self.assertEqual(f'{C()=}', 'C()=REPR') + self.assertEqual(f'{C()=!r}', 'C()=REPR') + self.assertEqual(f'{C()=:}', 'C()=FORMAT-') + self.assertEqual(f'{C()=: }', 'C()=FORMAT- ') + self.assertEqual(f'{C()=:x}', 'C()=FORMAT-x') + self.assertEqual(f'{C()=!r:*^20}', 'C()=********REPR********') + + def test_walrus(self): + x = 20 + # This isn't an assignment expression, it's 'x', with a format + # spec of '=10'. + self.assertEqual(f'{x:=10}', ' 20') + + # This is an assignment expression, which requires parens. + self.assertEqual(f'{(x:=10)}', '10') + self.assertEqual(x, 10) + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py index c60a016f01f4..38de3dfdafcd 100644 --- a/Lib/test/test_future.py +++ b/Lib/test/test_future.py @@ -255,6 +255,15 @@ def test_annotations(self): eq("f'space between opening braces: { {a for a in (1, 2, 3)}}'") eq("f'{(lambda x: x)}'") eq("f'{(None if a else lambda x: x)}'") + eq("f'{x}'") + eq("f'{x!r}'") + eq("f'{x!a}'") + eq("f'{x=!r}'") + eq("f'{x=:}'") + eq("f'{x=:.2f}'") + eq("f'{x=!r}'") + eq("f'{x=!a}'") + eq("f'{x=!s:*^20}'") eq('(yield from outside_of_generator)') eq('(yield)') eq('(yield a + b)') diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-02-11-48-08.bpo-36774.ZqbJ1J.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-02-11-48-08.bpo-36774.ZqbJ1J.rst new file mode 100644 index 000000000000..b73547c84a7d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-02-11-48-08.bpo-36774.ZqbJ1J.rst @@ -0,0 +1,7 @@ +Add a ``=`` feature f-strings for debugging. This can precede ``!s``, +``!r``, or ``!a``. It produces the text of the expression, followed by +an equal sign, followed by the repr of the value of the expression. So +``f'{3*9+15=}'`` would be equal to the string ``'3*9+15=42'``. If +``=`` is specified, the default conversion is set to ``!r``, unless a +format spec is given, in which case the formatting behavior is +unchanged, and __format__ will be used. diff --git a/Parser/Python.asdl b/Parser/Python.asdl index 668d3c938090..626fa4fede47 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -76,7 +76,7 @@ module Python -- x < 4 < 3 and (x < 4) < 3 | Compare(expr left, cmpop* ops, expr* comparators) | Call(expr func, expr* args, keyword* keywords) - | FormattedValue(expr value, int? conversion, expr? format_spec) + | FormattedValue(expr value, int? conversion, expr? format_spec, string? expr_text) | JoinedStr(expr* values) | Constant(constant value, string? kind) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 6c8488f8fe68..cb53a41cdf35 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -314,10 +314,12 @@ static char *Call_fields[]={ static PyTypeObject *FormattedValue_type; _Py_IDENTIFIER(conversion); _Py_IDENTIFIER(format_spec); +_Py_IDENTIFIER(expr_text); static char *FormattedValue_fields[]={ "value", "conversion", "format_spec", + "expr_text", }; static PyTypeObject *JoinedStr_type; static char *JoinedStr_fields[]={ @@ -950,7 +952,7 @@ static int init_types(void) Call_type = make_type("Call", expr_type, Call_fields, 3); if (!Call_type) return 0; FormattedValue_type = make_type("FormattedValue", expr_type, - FormattedValue_fields, 3); + FormattedValue_fields, 4); if (!FormattedValue_type) return 0; JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1); if (!JoinedStr_type) return 0; @@ -2249,9 +2251,9 @@ Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int } expr_ty -FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno, - int col_offset, int end_lineno, int end_col_offset, PyArena - *arena) +FormattedValue(expr_ty value, int conversion, expr_ty format_spec, string + expr_text, int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena) { expr_ty p; if (!value) { @@ -2266,6 +2268,7 @@ FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno, p->v.FormattedValue.value = value; p->v.FormattedValue.conversion = conversion; p->v.FormattedValue.format_spec = format_spec; + p->v.FormattedValue.expr_text = expr_text; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -3496,6 +3499,11 @@ ast2obj_expr(void* _o) if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.FormattedValue.expr_text); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_expr_text, value) == -1) + goto failed; + Py_DECREF(value); break; case JoinedStr_kind: result = PyType_GenericNew(JoinedStr_type, NULL, NULL); @@ -7148,6 +7156,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty value; int conversion; expr_ty format_spec; + string expr_text; if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { return 1; @@ -7188,8 +7197,22 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = FormattedValue(value, conversion, format_spec, lineno, - col_offset, end_lineno, end_col_offset, arena); + if (_PyObject_LookupAttrId(obj, &PyId_expr_text, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + expr_text = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &expr_text, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = FormattedValue(value, conversion, format_spec, expr_text, + lineno, col_offset, end_lineno, end_col_offset, + arena); if (*out == NULL) goto failed; return 0; } diff --git a/Python/ast.c b/Python/ast.c index 4687f8178b02..21abd7e88d84 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -4854,7 +4854,8 @@ fstring_compile_expr(const char *expr_start, const char *expr_end, assert(expr_end >= expr_start); assert(*(expr_start-1) == '{'); - assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':'); + assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':' || + *expr_end == '='); /* If the substring is all whitespace, it's an error. We need to catch this here, and not when we call PyParser_SimpleParseStringFlagsFilename, @@ -4997,9 +4998,9 @@ fstring_parse(const char **str, const char *end, int raw, int recurse_lvl, struct compiling *c, const node *n); /* Parse the f-string at *str, ending at end. We know *str starts an - expression (so it must be a '{'). Returns the FormattedValue node, - which includes the expression, conversion character, and - format_spec expression. + expression (so it must be a '{'). Returns the FormattedValue node, which + includes the expression, conversion character, format_spec expression, and + optionally the text of the expression (if = is used). Note that I don't do a perfect job here: I don't make sure that a closing brace doesn't match an opening paren, for example. It @@ -5016,7 +5017,12 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, const char *expr_end; expr_ty simple_expression; expr_ty format_spec = NULL; /* Optional format specifier. */ - int conversion = -1; /* The conversion char. -1 if not specified. */ + int conversion = -1; /* The conversion char. Use default if not + specified, or !r if using = and no format + spec. */ + int equal_flag = 0; /* Are we using the = feature? */ + PyObject *expr_text = NULL; /* The text of the expression, used for =. */ + const char *expr_text_end; /* 0 if we're not in a string, else the quote char we're trying to match (single or double quote). */ @@ -5033,7 +5039,7 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, /* Can only nest one level deep. */ if (recurse_lvl >= 2) { ast_error(c, n, "f-string: expressions nested too deeply"); - return -1; + goto error; } /* The first char must be a left brace, or we wouldn't have gotten @@ -5061,7 +5067,7 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, ast_error(c, n, "f-string expression part " "cannot include a backslash"); - return -1; + goto error; } if (quote_char) { /* We're inside a string. See if we're at the end. */ @@ -5106,7 +5112,7 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, } else if (ch == '[' || ch == '{' || ch == '(') { if (nested_depth >= MAXLEVEL) { ast_error(c, n, "f-string: too many nested parenthesis"); - return -1; + goto error; } parenstack[nested_depth] = ch; nested_depth++; @@ -5114,22 +5120,38 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, /* Error: can't include a comment character, inside parens or not. */ ast_error(c, n, "f-string expression part cannot include '#'"); - return -1; + goto error; } else if (nested_depth == 0 && - (ch == '!' || ch == ':' || ch == '}')) { - /* First, test for the special case of "!=". Since '=' is - not an allowed conversion character, nothing is lost in - this test. */ - if (ch == '!' && *str+1 < end && *(*str+1) == '=') { - /* This isn't a conversion character, just continue. */ - continue; + (ch == '!' || ch == ':' || ch == '}' || + ch == '=' || ch == '>' || ch == '<')) { + /* See if there's a next character. */ + if (*str+1 < end) { + char next = *(*str+1); + + /* For "!=". since '=' is not an allowed conversion character, + nothing is lost in this test. */ + if ((ch == '!' && next == '=') || /* != */ + (ch == '=' && next == '=') || /* == */ + (ch == '<' && next == '=') || /* <= */ + (ch == '>' && next == '=') /* >= */ + ) { + *str += 1; + continue; + } + /* Don't get out of the loop for these, if they're single + chars (not part of 2-char tokens). If by themselves, they + don't end an expression (unlike say '!'). */ + if (ch == '>' || ch == '<') { + continue; + } } + /* Normal way out of this loop. */ break; } else if (ch == ']' || ch == '}' || ch == ')') { if (!nested_depth) { ast_error(c, n, "f-string: unmatched '%c'", ch); - return -1; + goto error; } nested_depth--; int opening = parenstack[nested_depth]; @@ -5141,7 +5163,7 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, "f-string: closing parenthesis '%c' " "does not match opening parenthesis '%c'", ch, opening); - return -1; + goto error; } } else { /* Just consume this char and loop around. */ @@ -5154,12 +5176,12 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, let's just do that.*/ if (quote_char) { ast_error(c, n, "f-string: unterminated string"); - return -1; + goto error; } if (nested_depth) { int opening = parenstack[nested_depth - 1]; ast_error(c, n, "f-string: unmatched '%c'", opening); - return -1; + goto error; } if (*str >= end) @@ -5170,7 +5192,22 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, conversion or format_spec. */ simple_expression = fstring_compile_expr(expr_start, expr_end, c, n); if (!simple_expression) - return -1; + goto error; + + /* Check for =, which puts the text value of the expression in + expr_text. */ + if (**str == '=') { + *str += 1; + equal_flag = 1; + + /* Skip over ASCII whitespace. No need to test for end of string + here, since we know there's at least a trailing quote somewhere + ahead. */ + while (Py_ISSPACE(**str)) { + *str += 1; + } + expr_text_end = *str; + } /* Check for a conversion char, if present. */ if (**str == '!') { @@ -5182,13 +5219,19 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, *str += 1; /* Validate the conversion. */ - if (!(conversion == 's' || conversion == 'r' - || conversion == 'a')) { + if (!(conversion == 's' || conversion == 'r' || conversion == 'a')) { ast_error(c, n, "f-string: invalid conversion character: " "expected 's', 'r', or 'a'"); - return -1; + goto error; } + + } + if (equal_flag) { + Py_ssize_t len = expr_text_end-expr_start; + expr_text = PyUnicode_FromStringAndSize(expr_start, len); + if (!expr_text) + goto error; } /* Check for the format spec, if present. */ @@ -5202,7 +5245,7 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, /* Parse the format spec. */ format_spec = fstring_parse(str, end, raw, recurse_lvl+1, c, n); if (!format_spec) - return -1; + goto error; } if (*str >= end || **str != '}') @@ -5213,20 +5256,31 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, assert(**str == '}'); *str += 1; + /* If we're in = mode, and have no format spec and no explict conversion, + set the conversion to 'r'. */ + if (equal_flag && format_spec == NULL && conversion == -1) { + conversion = 'r'; + } + /* And now create the FormattedValue node that represents this entire expression with the conversion and format spec. */ *expression = FormattedValue(simple_expression, conversion, - format_spec, LINENO(n), n->n_col_offset, - n->n_end_lineno, n->n_end_col_offset, - c->c_arena); + format_spec, expr_text, LINENO(n), + n->n_col_offset, n->n_end_lineno, + n->n_end_col_offset, c->c_arena); if (!*expression) - return -1; + goto error; return 0; unexpected_end_of_string: ast_error(c, n, "f-string: expecting '}'"); + /* Falls through to error. */ + +error: + Py_XDECREF(expr_text); return -1; + } /* Return -1 on error. diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index 916ad5f97f0c..25a5c698a1db 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -655,6 +655,11 @@ append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) } Py_DECREF(temp_fv_str); + if (e->v.FormattedValue.expr_text) { + /* Use the = for debug text expansion. */ + APPEND_STR("="); + } + if (e->v.FormattedValue.conversion > 0) { switch (e->v.FormattedValue.conversion) { case 'a': diff --git a/Python/ceval.c b/Python/ceval.c index e616a3f53989..4e43df2713d8 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3435,13 +3435,15 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* See if any conversion is specified. */ switch (which_conversion) { + case FVC_NONE: conv_fn = NULL; break; case FVC_STR: conv_fn = PyObject_Str; break; case FVC_REPR: conv_fn = PyObject_Repr; break; case FVC_ASCII: conv_fn = PyObject_ASCII; break; - - /* Must be 0 (meaning no conversion), since only four - values are allowed by (oparg & FVC_MASK). */ - default: conv_fn = NULL; break; + default: + PyErr_Format(PyExc_SystemError, + "unexpected conversion flag %d", + which_conversion); + goto error; } /* If there's a conversion function, call it and replace diff --git a/Python/compile.c b/Python/compile.c index 86f2a09ffb3a..dd27ba840f75 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3946,8 +3946,8 @@ compiler_formatted_value(struct compiler *c, expr_ty e) /* Our oparg encodes 2 pieces of information: the conversion character, and whether or not a format_spec was provided. - Convert the conversion char to 2 bits: - None: 000 0x0 FVC_NONE + Convert the conversion char to 3 bits: + : 000 0x0 FVC_NONE The default if nothing specified. !s : 001 0x1 FVC_STR !r : 010 0x2 FVC_REPR !a : 011 0x3 FVC_ASCII @@ -3957,19 +3957,26 @@ compiler_formatted_value(struct compiler *c, expr_ty e) no : 000 0x0 */ + int conversion = e->v.FormattedValue.conversion; int oparg; - /* Evaluate the expression to be formatted. */ + if (e->v.FormattedValue.expr_text) { + /* Push the text of the expression (which already has the '=' in + it. */ + ADDOP_LOAD_CONST(c, e->v.FormattedValue.expr_text); + } + + /* The expression to be formatted. */ VISIT(c, expr, e->v.FormattedValue.value); - switch (e->v.FormattedValue.conversion) { + switch (conversion) { case 's': oparg = FVC_STR; break; case 'r': oparg = FVC_REPR; break; case 'a': oparg = FVC_ASCII; break; case -1: oparg = FVC_NONE; break; default: - PyErr_SetString(PyExc_SystemError, - "Unrecognized conversion character"); + PyErr_Format(PyExc_SystemError, + "Unrecognized conversion character %d", conversion); return 0; } if (e->v.FormattedValue.format_spec) { @@ -3980,6 +3987,12 @@ compiler_formatted_value(struct compiler *c, expr_ty e) /* And push our opcode and oparg */ ADDOP_I(c, FORMAT_VALUE, oparg); + + /* If we have expr_text, join the 2 strings on the stack. */ + if (e->v.FormattedValue.expr_text) { + ADDOP_I(c, BUILD_STRING, 2); + } + return 1; } From webhook-mailer at python.org Wed May 8 17:08:32 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Wed, 08 May 2019 21:08:32 -0000 Subject: [Python-checkins] bpo-35900: Enable custom reduction callback registration in _pickle (GH-12499) Message-ID: https://github.com/python/cpython/commit/289f1f80ee87a4baf4567a86b3425fb3bf73291d commit: 289f1f80ee87a4baf4567a86b3425fb3bf73291d branch: master author: Pierre Glaser committer: Antoine Pitrou date: 2019-05-08T23:08:25+02:00 summary: bpo-35900: Enable custom reduction callback registration in _pickle (GH-12499) Enable custom reduction callback registration for functions and classes in _pickle.c, using the new Pickler's attribute ``reducer_override``. files: A Misc/NEWS.d/next/Library/2019-03-22-22-40-00.bpo-35900.oiee0o.rst M Doc/library/pickle.rst M Lib/pickle.py M Lib/test/pickletester.py M Lib/test/test_pickle.py M Modules/_pickle.c diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index 3d89536d7d11..55005f009431 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -356,6 +356,18 @@ The :mod:`pickle` module exports two classes, :class:`Pickler` and .. versionadded:: 3.3 + .. method:: reducer_override(self, obj) + + Special reducer that can be defined in :class:`Pickler` subclasses. This + method has priority over any reducer in the :attr:`dispatch_table`. It + should conform to the same interface as a :meth:`__reduce__` method, and + can optionally return ``NotImplemented`` to fallback on + :attr:`dispatch_table`-registered reducers to pickle ``obj``. + + For a detailed example, see :ref:`reducer_override`. + + .. versionadded:: 3.8 + .. attribute:: fast Deprecated. Enable fast mode if set to a true value. The fast mode @@ -791,6 +803,65 @@ A sample usage might be something like this:: >>> new_reader.readline() '3: Goodbye!' +.. _reducer_override: + +Custom Reduction for Types, Functions, and Other Objects +-------------------------------------------------------- + +.. versionadded:: 3.8 + +Sometimes, :attr:`~Pickler.dispatch_table` may not be flexible enough. +In particular we may want to customize pickling based on another criterion +than the object's type, or we may want to customize the pickling of +functions and classes. + +For those cases, it is possible to subclass from the :class:`Pickler` class and +implement a :meth:`~Pickler.reducer_override` method. This method can return an +arbitrary reduction tuple (see :meth:`__reduce__`). It can alternatively return +``NotImplemented`` to fallback to the traditional behavior. + +If both the :attr:`~Pickler.dispatch_table` and +:meth:`~Pickler.reducer_override` are defined, then +:meth:`~Pickler.reducer_override` method takes priority. + +.. Note:: + For performance reasons, :meth:`~Pickler.reducer_override` may not be + called for the following objects: ``None``, ``True``, ``False``, and + exact instances of :class:`int`, :class:`float`, :class:`bytes`, + :class:`str`, :class:`dict`, :class:`set`, :class:`frozenset`, :class:`list` + and :class:`tuple`. + +Here is a simple example where we allow pickling and reconstructing +a given class:: + + import io + import pickle + + class MyClass: + my_attribute = 1 + + class MyPickler(pickle.Pickler): + def reducer_override(self, obj): + """Custom reducer for MyClass.""" + if getattr(obj, "__name__", None) == "MyClass": + return type, (obj.__name__, obj.__bases__, + {'my_attribute': obj.my_attribute}) + else: + # For any other object, fallback to usual reduction + return NotImplemented + + f = io.BytesIO() + p = MyPickler(f) + p.dump(MyClass) + + del MyClass + + unpickled_class = pickle.loads(f.getvalue()) + + assert isinstance(unpickled_class, type) + assert unpickled_class.__name__ == "MyClass" + assert unpickled_class.my_attribute == 1 + .. _pickle-restrict: diff --git a/Lib/pickle.py b/Lib/pickle.py index 47f0d280efc9..595beda4765a 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -497,34 +497,42 @@ def save(self, obj, save_persistent_id=True): self.write(self.get(x[0])) return - # Check the type dispatch table - t = type(obj) - f = self.dispatch.get(t) - if f is not None: - f(self, obj) # Call unbound method with explicit self - return - - # Check private dispatch table if any, or else copyreg.dispatch_table - reduce = getattr(self, 'dispatch_table', dispatch_table).get(t) + rv = NotImplemented + reduce = getattr(self, "reducer_override", None) if reduce is not None: rv = reduce(obj) - else: - # Check for a class with a custom metaclass; treat as regular class - if issubclass(t, type): - self.save_global(obj) + + if rv is NotImplemented: + # Check the type dispatch table + t = type(obj) + f = self.dispatch.get(t) + if f is not None: + f(self, obj) # Call unbound method with explicit self return - # Check for a __reduce_ex__ method, fall back to __reduce__ - reduce = getattr(obj, "__reduce_ex__", None) + # Check private dispatch table if any, or else + # copyreg.dispatch_table + reduce = getattr(self, 'dispatch_table', dispatch_table).get(t) if reduce is not None: - rv = reduce(self.proto) + rv = reduce(obj) else: - reduce = getattr(obj, "__reduce__", None) + # Check for a class with a custom metaclass; treat as regular + # class + if issubclass(t, type): + self.save_global(obj) + return + + # Check for a __reduce_ex__ method, fall back to __reduce__ + reduce = getattr(obj, "__reduce_ex__", None) if reduce is not None: - rv = reduce() + rv = reduce(self.proto) else: - raise PicklingError("Can't pickle %r object: %r" % - (t.__name__, obj)) + reduce = getattr(obj, "__reduce__", None) + if reduce is not None: + rv = reduce() + else: + raise PicklingError("Can't pickle %r object: %r" % + (t.__name__, obj)) # Check for string returned by reduce(), meaning "save as global" if isinstance(rv, str): diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index 19e8823a7310..4f8c2942df93 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -4,6 +4,7 @@ import io import functools import os +import math import pickle import pickletools import shutil @@ -3013,6 +3014,73 @@ def setstate_bbb(obj, state): obj.a = "custom state_setter" + +class AbstractCustomPicklerClass: + """Pickler implementing a reducing hook using reducer_override.""" + def reducer_override(self, obj): + obj_name = getattr(obj, "__name__", None) + + if obj_name == 'f': + # asking the pickler to save f as 5 + return int, (5, ) + + if obj_name == 'MyClass': + return str, ('some str',) + + elif obj_name == 'g': + # in this case, the callback returns an invalid result (not a 2-5 + # tuple or a string), the pickler should raise a proper error. + return False + + elif obj_name == 'h': + # Simulate a case when the reducer fails. The error should + # be propagated to the original ``dump`` call. + raise ValueError('The reducer just failed') + + return NotImplemented + +class AbstractHookTests(unittest.TestCase): + def test_pickler_hook(self): + # test the ability of a custom, user-defined CPickler subclass to + # override the default reducing routines of any type using the method + # reducer_override + + def f(): + pass + + def g(): + pass + + def h(): + pass + + class MyClass: + pass + + for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + bio = io.BytesIO() + p = self.pickler_class(bio, proto) + + p.dump([f, MyClass, math.log]) + new_f, some_str, math_log = pickle.loads(bio.getvalue()) + + self.assertEqual(new_f, 5) + self.assertEqual(some_str, 'some str') + # math.log does not have its usual reducer overriden, so the + # custom reduction callback should silently direct the pickler + # to the default pickling by attribute, by returning + # NotImplemented + self.assertIs(math_log, math.log) + + with self.assertRaises(pickle.PicklingError): + p.dump(g) + + with self.assertRaisesRegex( + ValueError, 'The reducer just failed'): + p.dump(h) + + class AbstractDispatchTableTests(unittest.TestCase): def test_default_dispatch_table(self): diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py index b4bce7e6aceb..435c248802d3 100644 --- a/Lib/test/test_pickle.py +++ b/Lib/test/test_pickle.py @@ -11,6 +11,7 @@ import unittest from test import support +from test.pickletester import AbstractHookTests from test.pickletester import AbstractUnpickleTests from test.pickletester import AbstractPickleTests from test.pickletester import AbstractPickleModuleTests @@ -18,6 +19,7 @@ from test.pickletester import AbstractIdentityPersistentPicklerTests from test.pickletester import AbstractPicklerUnpicklerObjectTests from test.pickletester import AbstractDispatchTableTests +from test.pickletester import AbstractCustomPicklerClass from test.pickletester import BigmemPickleTests try: @@ -253,12 +255,23 @@ class CChainDispatchTableTests(AbstractDispatchTableTests): def get_dispatch_table(self): return collections.ChainMap({}, pickle.dispatch_table) + class PyPicklerHookTests(AbstractHookTests): + class CustomPyPicklerClass(pickle._Pickler, + AbstractCustomPicklerClass): + pass + pickler_class = CustomPyPicklerClass + + class CPicklerHookTests(AbstractHookTests): + class CustomCPicklerClass(_pickle.Pickler, AbstractCustomPicklerClass): + pass + pickler_class = CustomCPicklerClass + @support.cpython_only class SizeofTests(unittest.TestCase): check_sizeof = support.check_sizeof def test_pickler(self): - basesize = support.calcobjsize('6P2n3i2n3iP') + basesize = support.calcobjsize('6P2n3i2n3i2P') p = _pickle.Pickler(io.BytesIO()) self.assertEqual(object.__sizeof__(p), basesize) MT_size = struct.calcsize('3nP0n') @@ -498,7 +511,7 @@ def test_main(): tests = [PyPickleTests, PyUnpicklerTests, PyPicklerTests, PyPersPicklerTests, PyIdPersPicklerTests, PyDispatchTableTests, PyChainDispatchTableTests, - CompatPickleTests] + CompatPickleTests, PyPicklerHookTests] if has_c_implementation: tests.extend([CPickleTests, CUnpicklerTests, CPicklerTests, CPersPicklerTests, CIdPersPicklerTests, @@ -506,6 +519,7 @@ def test_main(): PyPicklerUnpicklerObjectTests, CPicklerUnpicklerObjectTests, CDispatchTableTests, CChainDispatchTableTests, + CPicklerHookTests, InMemoryPickleTests, SizeofTests]) support.run_unittest(*tests) support.run_doctest(pickle) diff --git a/Misc/NEWS.d/next/Library/2019-03-22-22-40-00.bpo-35900.oiee0o.rst b/Misc/NEWS.d/next/Library/2019-03-22-22-40-00.bpo-35900.oiee0o.rst new file mode 100644 index 000000000000..641572649694 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-22-22-40-00.bpo-35900.oiee0o.rst @@ -0,0 +1,2 @@ +enable custom reduction callback registration for functions and classes in +_pickle.c, using the new Pickler's attribute ``reducer_override`` diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 897bbe1f24e4..87f3cf7b614a 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -616,6 +616,9 @@ typedef struct PicklerObject { PyObject *pers_func_self; /* borrowed reference to self if pers_func is an unbound method, NULL otherwise */ PyObject *dispatch_table; /* private dispatch_table, can be NULL */ + PyObject *reducer_override; /* hook for invoking user-defined callbacks + instead of save_global when pickling + functions and classes*/ PyObject *write; /* write() method of the output stream. */ PyObject *output_buffer; /* Write into a local bytearray buffer before @@ -1110,6 +1113,7 @@ _Pickler_New(void) self->fast_memo = NULL; self->max_output_len = WRITE_BUF_SIZE; self->output_len = 0; + self->reducer_override = NULL; self->memo = PyMemoTable_New(); self->output_buffer = PyBytes_FromStringAndSize(NULL, @@ -2220,7 +2224,7 @@ save_bytes(PicklerObject *self, PyObject *obj) Python 2 *and* the appropriate 'bytes' object when unpickled using Python 3. Again this is a hack and we don't need to do this with newer protocols. */ - PyObject *reduce_value = NULL; + PyObject *reduce_value; int status; if (PyBytes_GET_SIZE(obj) == 0) { @@ -4058,7 +4062,25 @@ save(PicklerObject *self, PyObject *obj, int pers_save) status = save_tuple(self, obj); goto done; } - else if (type == &PyType_Type) { + + /* Now, check reducer_override. If it returns NotImplemented, + * fallback to save_type or save_global, and then perhaps to the + * regular reduction mechanism. + */ + if (self->reducer_override != NULL) { + reduce_value = PyObject_CallFunctionObjArgs(self->reducer_override, + obj, NULL); + if (reduce_value == NULL) { + goto error; + } + if (reduce_value != Py_NotImplemented) { + goto reduce; + } + Py_DECREF(reduce_value); + reduce_value = NULL; + } + + if (type == &PyType_Type) { status = save_type(self, obj); goto done; } @@ -4149,6 +4171,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) if (reduce_value == NULL) goto error; + reduce: if (PyUnicode_Check(reduce_value)) { status = save_global(self, obj, reduce_value); goto done; @@ -4180,6 +4203,20 @@ static int dump(PicklerObject *self, PyObject *obj) { const char stop_op = STOP; + PyObject *tmp; + _Py_IDENTIFIER(reducer_override); + + if (_PyObject_LookupAttrId((PyObject *)self, &PyId_reducer_override, + &tmp) < 0) { + return -1; + } + /* Cache the reducer_override method, if it exists. */ + if (tmp != NULL) { + Py_XSETREF(self->reducer_override, tmp); + } + else { + Py_CLEAR(self->reducer_override); + } if (self->proto >= 2) { char header[2]; @@ -4304,6 +4341,7 @@ Pickler_dealloc(PicklerObject *self) Py_XDECREF(self->pers_func); Py_XDECREF(self->dispatch_table); Py_XDECREF(self->fast_memo); + Py_XDECREF(self->reducer_override); PyMemoTable_Del(self->memo); @@ -4317,6 +4355,7 @@ Pickler_traverse(PicklerObject *self, visitproc visit, void *arg) Py_VISIT(self->pers_func); Py_VISIT(self->dispatch_table); Py_VISIT(self->fast_memo); + Py_VISIT(self->reducer_override); return 0; } @@ -4328,6 +4367,7 @@ Pickler_clear(PicklerObject *self) Py_CLEAR(self->pers_func); Py_CLEAR(self->dispatch_table); Py_CLEAR(self->fast_memo); + Py_CLEAR(self->reducer_override); if (self->memo != NULL) { PyMemoTable *memo = self->memo; From webhook-mailer at python.org Wed May 8 17:13:13 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 08 May 2019 21:13:13 -0000 Subject: [Python-checkins] [3.7] bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) (GH-13197) Message-ID: https://github.com/python/cpython/commit/6daaf3f7de78eec2c80eaa8e94e4cca54f758a30 commit: 6daaf3f7de78eec2c80eaa8e94e4cca54f758a30 branch: 3.7 author: Gregory P. Smith committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-08T14:13:08-07:00 summary: [3.7] bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) (GH-13197) We updated the server, our testsuite must match. https://bugs.python.org/issue36816 ?? CLE -> DEN ?? #pycon2019 #beyonce (cherry picked from commit 6bd81734de0b73f1431880d6a75fb71bcbc65fa1) Authored-by: Gregory P. Smith https://bugs.python.org/issue36816 files: A Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst M Lib/test/selfsigned_pythontestdotnet.pem diff --git a/Lib/test/selfsigned_pythontestdotnet.pem b/Lib/test/selfsigned_pythontestdotnet.pem index b6d259bcb236..2b1760747bce 100644 --- a/Lib/test/selfsigned_pythontestdotnet.pem +++ b/Lib/test/selfsigned_pythontestdotnet.pem @@ -1,16 +1,34 @@ -----BEGIN CERTIFICATE----- -MIIClTCCAf6gAwIBAgIJAKGU95wKR8pTMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV -BAYTAlhZMRcwFQYDVQQHDA5DYXN0bGUgQW50aHJheDEjMCEGA1UECgwaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMMGnNlbGYtc2lnbmVkLnB5dGhv -bnRlc3QubmV0MB4XDTE0MTEwMjE4MDkyOVoXDTI0MTAzMDE4MDkyOVowcDELMAkG -A1UEBhMCWFkxFzAVBgNVBAcMDkNhc3RsZSBBbnRocmF4MSMwIQYDVQQKDBpQeXRo -b24gU29mdHdhcmUgRm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0 -aG9udGVzdC5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANDXQXW9tjyZ -Xt0Iv2tLL1+jinr4wGg36ioLDLFkMf+2Y1GL0v0BnKYG4N1OKlAU15LXGeGer8vm -Sv/yIvmdrELvhAbbo3w4a9TMYQA4XkIVLdvu3mvNOAet+8PMJxn26dbDhG809ALv -EHY57lQsBS3G59RZyBPVqAqmImWNJnVzAgMBAAGjNzA1MCUGA1UdEQQeMByCGnNl -bGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEFBQADgYEAIuzAhgMouJpNdf3URCHIineyoSt6WK/9+eyUcjlKOrDoXNZaD72h -TXMeKYoWvJyVcSLKL8ckPtDobgP2OTt0UkyAaj0n+ZHaqq1lH2yVfGUA1ILJv515 -C8BqbvVZuqm3i7ygmw3bqE/lYMgOrYtXXnqOrz6nvsE6Yc9V9rFflOM= +MIIF9zCCA9+gAwIBAgIUH98b4Fw/DyugC9cV7VK7ZODzHsIwDQYJKoZIhvcNAQEL +BQAwgYoxCzAJBgNVBAYTAlhZMRcwFQYDVQQIDA5DYXN0bGUgQW50aHJheDEYMBYG +A1UEBwwPQXJndW1lbnQgQ2xpbmljMSMwIQYDVQQKDBpQeXRob24gU29mdHdhcmUg +Rm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQw +HhcNMTkwNTA4MDEwMjQzWhcNMjcwNzI0MDEwMjQzWjCBijELMAkGA1UEBhMCWFkx +FzAVBgNVBAgMDkNhc3RsZSBBbnRocmF4MRgwFgYDVQQHDA9Bcmd1bWVudCBDbGlu +aWMxIzAhBgNVBAoMGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQD +DBpzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMKdJlyCThkahwoBb7pl5q64Pe9Fn5jrIvzsveHTc97TpjV2 +RLfICnXKrltPk/ohkVl6K5SUZQZwMVzFubkyxE0nZPHYHlpiKWQxbsYVkYv01rix +IFdLvaxxbGYke2jwQao31s4o61AdlsfK1SdpHQUynBBMssqI3SB4XPmcA7e+wEEx +jxjVish4ixA1vuIZOx8yibu+CFCf/geEjoBMF3QPdzULzlrCSw8k/45iZCSoNbvK +DoL4TVV07PHOxpheDh8ZQmepGvU6pVqhb9m4lgmV0OGWHgozd5Ur9CbTVDmxIEz3 +TSoRtNJK7qtyZdGNqwjksQxgZTjM/d/Lm/BJG99AiOmYOjsl9gbQMZgvQmMAtUsI +aMJnQuZ6R+KEpW/TR5qSKLWZSG45z/op+tzI2m+cE6HwTRVAWbcuJxcAA55MZjqU +OOOu3BBYMjS5nf2sQ9uoXsVBFH7i0mQqoW1SLzr9opI8KsWwFxQmO2vBxWYaN+lH +OmwBZBwyODIsmI1YGXmTp09NxRYz3Qe5GCgFzYowpMrcxUC24iduIdMwwhRM7rKg +7GtIWMSrFfuI1XCLRmSlhDbhNN6fVg2f8Bo9PdH9ihiIyxSrc+FOUasUYCCJvlSZ +8hFUlLvcmrZlWuazohm0lsXuMK1JflmQr/DA/uXxP9xzFfRy+RU3jDyxJbRHAgMB +AAGjUzBRMB0GA1UdDgQWBBSQJyxiPMRK01i+0BsV9zUwDiBaHzAfBgNVHSMEGDAW +gBSQJyxiPMRK01i+0BsV9zUwDiBaHzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4ICAQCR+7a7N/m+WLkxPPIA/CB4MOr2Uf8ixTv435Nyv6rXOun0+lTP +ExSZ0uYQ+L0WylItI3cQHULldDueD+s8TGzxf5woaLKf6tqyr0NYhKs+UeNEzDnN +9PHQIhX0SZw3XyXGUgPNBfRCg2ZDdtMMdOU4XlQN/IN/9hbYTrueyY7eXq9hmtI9 +1srftAMqr9SR1JP7aHI6DVgrEsZVMTDnfT8WmLSGLlY1HmGfdEn1Ip5sbo9uSkiH +AEPgPfjYIvR5LqTOMn4KsrlZyBbFIDh9Sl99M1kZzgH6zUGVLCDg1y6Cms69fx/e +W1HoIeVkY4b4TY7Bk7JsqyNhIuqu7ARaxkdaZWhYaA2YyknwANdFfNpfH+elCLIk +BUt5S3f4i7DaUePTvKukCZiCq4Oyln7RcOn5If73wCeLB/ZM9Ei1HforyLWP1CN8 +XLfpHaoeoPSWIveI0XHUl65LsPN2UbMbul/F23hwl+h8+BLmyAS680Yhn4zEN6Ku +B7Po90HoFa1Du3bmx4jsN73UkT/dwMTi6K072FbipnC1904oGlWmLwvAHvrtxxmL +Pl3pvEaZIu8wa/PNF6Y7J7VIewikIJq6Ta6FrWeFfzMWOj2qA1ZZi6fUaDSNYvuV +J5quYKCc/O+I/yDDf8wyBbZ/gvUXzUHTMYGG+bFrn1p7XDbYYeEJ6R/xEg== -----END CERTIFICATE----- diff --git a/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst new file mode 100644 index 000000000000..420dfe832366 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst @@ -0,0 +1 @@ +Update Lib/test/selfsigned_pythontestdotnet.pem to match self-signed.pythontest.net's new TLS certificate. \ No newline at end of file From webhook-mailer at python.org Wed May 8 20:53:26 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Thu, 09 May 2019 00:53:26 -0000 Subject: [Python-checkins] [2.7] bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) (GH-13199) Message-ID: https://github.com/python/cpython/commit/7b5dca8345f4a909367836a3a2c3c7ac6e4e2c0c commit: 7b5dca8345f4a909367836a3a2c3c7ac6e4e2c0c branch: 2.7 author: Gregory P. Smith committer: GitHub date: 2019-05-08T18:53:15-06:00 summary: [2.7] bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) (GH-13199) * [2.7] bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) We updated the server, our testsuite must match. https://bugs.python.org/issue36816 ?? CLE -> DEN ?? #pycon2019 #beyonce (cherry picked from commit 6bd81734de0b73f1431880d6a75fb71bcbc65fa1) The 2.7 tree also needed a certificate in the capath directory updated. The filename for that was determined by `openssl x509 -in $cert.pem -subject_hash`. Authored-by: Gregory P. Smith files: A Lib/test/capath/efa5f9c3.0 A Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst M Lib/test/selfsigned_pythontestdotnet.pem diff --git a/Lib/test/capath/efa5f9c3.0 b/Lib/test/capath/efa5f9c3.0 new file mode 100644 index 000000000000..2b1760747bce --- /dev/null +++ b/Lib/test/capath/efa5f9c3.0 @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +MIIF9zCCA9+gAwIBAgIUH98b4Fw/DyugC9cV7VK7ZODzHsIwDQYJKoZIhvcNAQEL +BQAwgYoxCzAJBgNVBAYTAlhZMRcwFQYDVQQIDA5DYXN0bGUgQW50aHJheDEYMBYG +A1UEBwwPQXJndW1lbnQgQ2xpbmljMSMwIQYDVQQKDBpQeXRob24gU29mdHdhcmUg +Rm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQw +HhcNMTkwNTA4MDEwMjQzWhcNMjcwNzI0MDEwMjQzWjCBijELMAkGA1UEBhMCWFkx +FzAVBgNVBAgMDkNhc3RsZSBBbnRocmF4MRgwFgYDVQQHDA9Bcmd1bWVudCBDbGlu +aWMxIzAhBgNVBAoMGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQD +DBpzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMKdJlyCThkahwoBb7pl5q64Pe9Fn5jrIvzsveHTc97TpjV2 +RLfICnXKrltPk/ohkVl6K5SUZQZwMVzFubkyxE0nZPHYHlpiKWQxbsYVkYv01rix +IFdLvaxxbGYke2jwQao31s4o61AdlsfK1SdpHQUynBBMssqI3SB4XPmcA7e+wEEx +jxjVish4ixA1vuIZOx8yibu+CFCf/geEjoBMF3QPdzULzlrCSw8k/45iZCSoNbvK +DoL4TVV07PHOxpheDh8ZQmepGvU6pVqhb9m4lgmV0OGWHgozd5Ur9CbTVDmxIEz3 +TSoRtNJK7qtyZdGNqwjksQxgZTjM/d/Lm/BJG99AiOmYOjsl9gbQMZgvQmMAtUsI +aMJnQuZ6R+KEpW/TR5qSKLWZSG45z/op+tzI2m+cE6HwTRVAWbcuJxcAA55MZjqU +OOOu3BBYMjS5nf2sQ9uoXsVBFH7i0mQqoW1SLzr9opI8KsWwFxQmO2vBxWYaN+lH +OmwBZBwyODIsmI1YGXmTp09NxRYz3Qe5GCgFzYowpMrcxUC24iduIdMwwhRM7rKg +7GtIWMSrFfuI1XCLRmSlhDbhNN6fVg2f8Bo9PdH9ihiIyxSrc+FOUasUYCCJvlSZ +8hFUlLvcmrZlWuazohm0lsXuMK1JflmQr/DA/uXxP9xzFfRy+RU3jDyxJbRHAgMB +AAGjUzBRMB0GA1UdDgQWBBSQJyxiPMRK01i+0BsV9zUwDiBaHzAfBgNVHSMEGDAW +gBSQJyxiPMRK01i+0BsV9zUwDiBaHzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4ICAQCR+7a7N/m+WLkxPPIA/CB4MOr2Uf8ixTv435Nyv6rXOun0+lTP +ExSZ0uYQ+L0WylItI3cQHULldDueD+s8TGzxf5woaLKf6tqyr0NYhKs+UeNEzDnN +9PHQIhX0SZw3XyXGUgPNBfRCg2ZDdtMMdOU4XlQN/IN/9hbYTrueyY7eXq9hmtI9 +1srftAMqr9SR1JP7aHI6DVgrEsZVMTDnfT8WmLSGLlY1HmGfdEn1Ip5sbo9uSkiH +AEPgPfjYIvR5LqTOMn4KsrlZyBbFIDh9Sl99M1kZzgH6zUGVLCDg1y6Cms69fx/e +W1HoIeVkY4b4TY7Bk7JsqyNhIuqu7ARaxkdaZWhYaA2YyknwANdFfNpfH+elCLIk +BUt5S3f4i7DaUePTvKukCZiCq4Oyln7RcOn5If73wCeLB/ZM9Ei1HforyLWP1CN8 +XLfpHaoeoPSWIveI0XHUl65LsPN2UbMbul/F23hwl+h8+BLmyAS680Yhn4zEN6Ku +B7Po90HoFa1Du3bmx4jsN73UkT/dwMTi6K072FbipnC1904oGlWmLwvAHvrtxxmL +Pl3pvEaZIu8wa/PNF6Y7J7VIewikIJq6Ta6FrWeFfzMWOj2qA1ZZi6fUaDSNYvuV +J5quYKCc/O+I/yDDf8wyBbZ/gvUXzUHTMYGG+bFrn1p7XDbYYeEJ6R/xEg== +-----END CERTIFICATE----- diff --git a/Lib/test/selfsigned_pythontestdotnet.pem b/Lib/test/selfsigned_pythontestdotnet.pem index b6d259bcb236..2b1760747bce 100644 --- a/Lib/test/selfsigned_pythontestdotnet.pem +++ b/Lib/test/selfsigned_pythontestdotnet.pem @@ -1,16 +1,34 @@ -----BEGIN CERTIFICATE----- -MIIClTCCAf6gAwIBAgIJAKGU95wKR8pTMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV -BAYTAlhZMRcwFQYDVQQHDA5DYXN0bGUgQW50aHJheDEjMCEGA1UECgwaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMMGnNlbGYtc2lnbmVkLnB5dGhv -bnRlc3QubmV0MB4XDTE0MTEwMjE4MDkyOVoXDTI0MTAzMDE4MDkyOVowcDELMAkG -A1UEBhMCWFkxFzAVBgNVBAcMDkNhc3RsZSBBbnRocmF4MSMwIQYDVQQKDBpQeXRo -b24gU29mdHdhcmUgRm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0 -aG9udGVzdC5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANDXQXW9tjyZ -Xt0Iv2tLL1+jinr4wGg36ioLDLFkMf+2Y1GL0v0BnKYG4N1OKlAU15LXGeGer8vm -Sv/yIvmdrELvhAbbo3w4a9TMYQA4XkIVLdvu3mvNOAet+8PMJxn26dbDhG809ALv -EHY57lQsBS3G59RZyBPVqAqmImWNJnVzAgMBAAGjNzA1MCUGA1UdEQQeMByCGnNl -bGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEFBQADgYEAIuzAhgMouJpNdf3URCHIineyoSt6WK/9+eyUcjlKOrDoXNZaD72h -TXMeKYoWvJyVcSLKL8ckPtDobgP2OTt0UkyAaj0n+ZHaqq1lH2yVfGUA1ILJv515 -C8BqbvVZuqm3i7ygmw3bqE/lYMgOrYtXXnqOrz6nvsE6Yc9V9rFflOM= +MIIF9zCCA9+gAwIBAgIUH98b4Fw/DyugC9cV7VK7ZODzHsIwDQYJKoZIhvcNAQEL +BQAwgYoxCzAJBgNVBAYTAlhZMRcwFQYDVQQIDA5DYXN0bGUgQW50aHJheDEYMBYG +A1UEBwwPQXJndW1lbnQgQ2xpbmljMSMwIQYDVQQKDBpQeXRob24gU29mdHdhcmUg +Rm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQw +HhcNMTkwNTA4MDEwMjQzWhcNMjcwNzI0MDEwMjQzWjCBijELMAkGA1UEBhMCWFkx +FzAVBgNVBAgMDkNhc3RsZSBBbnRocmF4MRgwFgYDVQQHDA9Bcmd1bWVudCBDbGlu +aWMxIzAhBgNVBAoMGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQD +DBpzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMKdJlyCThkahwoBb7pl5q64Pe9Fn5jrIvzsveHTc97TpjV2 +RLfICnXKrltPk/ohkVl6K5SUZQZwMVzFubkyxE0nZPHYHlpiKWQxbsYVkYv01rix +IFdLvaxxbGYke2jwQao31s4o61AdlsfK1SdpHQUynBBMssqI3SB4XPmcA7e+wEEx +jxjVish4ixA1vuIZOx8yibu+CFCf/geEjoBMF3QPdzULzlrCSw8k/45iZCSoNbvK +DoL4TVV07PHOxpheDh8ZQmepGvU6pVqhb9m4lgmV0OGWHgozd5Ur9CbTVDmxIEz3 +TSoRtNJK7qtyZdGNqwjksQxgZTjM/d/Lm/BJG99AiOmYOjsl9gbQMZgvQmMAtUsI +aMJnQuZ6R+KEpW/TR5qSKLWZSG45z/op+tzI2m+cE6HwTRVAWbcuJxcAA55MZjqU +OOOu3BBYMjS5nf2sQ9uoXsVBFH7i0mQqoW1SLzr9opI8KsWwFxQmO2vBxWYaN+lH +OmwBZBwyODIsmI1YGXmTp09NxRYz3Qe5GCgFzYowpMrcxUC24iduIdMwwhRM7rKg +7GtIWMSrFfuI1XCLRmSlhDbhNN6fVg2f8Bo9PdH9ihiIyxSrc+FOUasUYCCJvlSZ +8hFUlLvcmrZlWuazohm0lsXuMK1JflmQr/DA/uXxP9xzFfRy+RU3jDyxJbRHAgMB +AAGjUzBRMB0GA1UdDgQWBBSQJyxiPMRK01i+0BsV9zUwDiBaHzAfBgNVHSMEGDAW +gBSQJyxiPMRK01i+0BsV9zUwDiBaHzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4ICAQCR+7a7N/m+WLkxPPIA/CB4MOr2Uf8ixTv435Nyv6rXOun0+lTP +ExSZ0uYQ+L0WylItI3cQHULldDueD+s8TGzxf5woaLKf6tqyr0NYhKs+UeNEzDnN +9PHQIhX0SZw3XyXGUgPNBfRCg2ZDdtMMdOU4XlQN/IN/9hbYTrueyY7eXq9hmtI9 +1srftAMqr9SR1JP7aHI6DVgrEsZVMTDnfT8WmLSGLlY1HmGfdEn1Ip5sbo9uSkiH +AEPgPfjYIvR5LqTOMn4KsrlZyBbFIDh9Sl99M1kZzgH6zUGVLCDg1y6Cms69fx/e +W1HoIeVkY4b4TY7Bk7JsqyNhIuqu7ARaxkdaZWhYaA2YyknwANdFfNpfH+elCLIk +BUt5S3f4i7DaUePTvKukCZiCq4Oyln7RcOn5If73wCeLB/ZM9Ei1HforyLWP1CN8 +XLfpHaoeoPSWIveI0XHUl65LsPN2UbMbul/F23hwl+h8+BLmyAS680Yhn4zEN6Ku +B7Po90HoFa1Du3bmx4jsN73UkT/dwMTi6K072FbipnC1904oGlWmLwvAHvrtxxmL +Pl3pvEaZIu8wa/PNF6Y7J7VIewikIJq6Ta6FrWeFfzMWOj2qA1ZZi6fUaDSNYvuV +J5quYKCc/O+I/yDDf8wyBbZ/gvUXzUHTMYGG+bFrn1p7XDbYYeEJ6R/xEg== -----END CERTIFICATE----- diff --git a/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst new file mode 100644 index 000000000000..420dfe832366 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst @@ -0,0 +1 @@ +Update Lib/test/selfsigned_pythontestdotnet.pem to match self-signed.pythontest.net's new TLS certificate. \ No newline at end of file From webhook-mailer at python.org Wed May 8 23:59:44 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Thu, 09 May 2019 03:59:44 -0000 Subject: [Python-checkins] closes bpo-36861: Update Unicode database to 12.1.0. (GH-13214) Message-ID: https://github.com/python/cpython/commit/3aca40d3cb4b9b6741cf3073d71fbfc682cab96d commit: 3aca40d3cb4b9b6741cf3073d71fbfc682cab96d branch: master author: Benjamin Peterson committer: GitHub date: 2019-05-08T20:59:35-07:00 summary: closes bpo-36861: Update Unicode database to 12.1.0. (GH-13214) Adds ?. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-08-20-42-40.bpo-36861.72mvZM.rst M Doc/library/stdtypes.rst M Doc/library/unicodedata.rst M Doc/reference/lexical_analysis.rst M Doc/whatsnew/3.8.rst M Lib/test/test_unicodedata.py M Modules/unicodedata_db.h M Modules/unicodename_db.h M Objects/unicodetype_db.h M Tools/unicode/makeunicodedata.py diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 0a6bb149075f..53337291dd39 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -351,7 +351,7 @@ Notes: The numeric literals accepted include the digits ``0`` to ``9`` or any Unicode equivalent (code points with the ``Nd`` property). - See http://www.unicode.org/Public/12.0.0/ucd/extracted/DerivedNumericType.txt + See http://www.unicode.org/Public/12.1.0/ucd/extracted/DerivedNumericType.txt for a complete list of code points with the ``Nd`` property. diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst index b019fa5b3bc9..ee790c0cd00b 100644 --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -17,8 +17,8 @@ This module provides access to the Unicode Character Database (UCD) which defines character properties for all Unicode characters. The data contained in -this database is compiled from the `UCD version 12.0.0 -`_. +this database is compiled from the `UCD version 12.1.0 +`_. The module uses the same names and symbols as defined by Unicode Standard Annex #44, `"Unicode Character Database" @@ -175,6 +175,6 @@ Examples: .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/12.0.0/ucd/NameAliases.txt +.. [#] http://www.unicode.org/Public/12.1.0/ucd/NameAliases.txt -.. [#] http://www.unicode.org/Public/12.0.0/ucd/NamedSequences.txt +.. [#] http://www.unicode.org/Public/12.1.0/ucd/NamedSequences.txt diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 13adc1a2e433..1cbe421ded98 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -316,7 +316,7 @@ The Unicode category codes mentioned above stand for: * *Nd* - decimal numbers * *Pc* - connector punctuations * *Other_ID_Start* - explicit list of characters in `PropList.txt - `_ to support backwards + `_ to support backwards compatibility * *Other_ID_Continue* - likewise diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 874b9b129432..d21a4c7944af 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -510,9 +510,8 @@ Added new clock :data:`~time.CLOCK_UPTIME_RAW` for macOS 10.12. unicodedata ----------- -* The :mod:`unicodedata` module has been upgraded to use the `Unicode 12.0.0 - `_ - release. +* The :mod:`unicodedata` module has been upgraded to use the `Unicode 12.1.0 + `_ release. * New function :func:`~unicodedata.is_normalized` can be used to verify a string is in a specific normal form. (Contributed by Max Belanger and David Euresti in diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py index 3c0916e26ad3..a52b6de547fb 100644 --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -80,7 +80,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): # Update this if the database changes. Make sure to do a full rebuild # (e.g. 'make distclean && make') to get the correct checksum. - expectedchecksum = '4cb02a243aed7c251067386dd738189146fddf94' + expectedchecksum = 'c44a49ca7c5cb6441640fe174ede604b45028652' def test_function_checksum(self): data = [] h = hashlib.sha1() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-20-42-40.bpo-36861.72mvZM.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-20-42-40.bpo-36861.72mvZM.rst new file mode 100644 index 000000000000..79c339a779e8 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-20-42-40.bpo-36861.72mvZM.rst @@ -0,0 +1 @@ +Update the Unicode database to version 12.1.0. diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h index 66f81e311e29..286287d047ca 100644 --- a/Modules/unicodedata_db.h +++ b/Modules/unicodedata_db.h @@ -1,6 +1,6 @@ /* this file was generated by Tools/unicode/makeunicodedata.py 3.3 */ -#define UNIDATA_VERSION "12.0.0" +#define UNIDATA_VERSION "12.1.0" /* a list of unique database records */ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {0, 0, 0, 0, 0, 0}, @@ -2061,7 +2061,6 @@ static const unsigned short index2[] = { 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 0, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, @@ -2070,16 +2069,17 @@ static const unsigned short index2[] = { 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, 171, + 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2092,11 +2092,11 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, 171, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2104,8 +2104,8 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 252, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -3667,431 +3667,438 @@ static const unsigned int decomp_data[] = { 263, 12507, 263, 12510, 263, 12511, 263, 12512, 263, 12513, 263, 12514, 263, 12516, 263, 12518, 263, 12520, 263, 12521, 263, 12522, 263, 12523, 263, 12524, 263, 12525, 263, 12527, 263, 12528, 263, 12529, 263, 12530, - 1034, 12450, 12497, 12540, 12488, 1034, 12450, 12523, 12501, 12449, 1034, - 12450, 12531, 12506, 12450, 778, 12450, 12540, 12523, 1034, 12452, 12491, - 12531, 12464, 778, 12452, 12531, 12481, 778, 12454, 12457, 12531, 1290, - 12456, 12473, 12463, 12540, 12489, 1034, 12456, 12540, 12459, 12540, 778, - 12458, 12531, 12473, 778, 12458, 12540, 12512, 778, 12459, 12452, 12522, - 1034, 12459, 12521, 12483, 12488, 1034, 12459, 12525, 12522, 12540, 778, - 12460, 12525, 12531, 778, 12460, 12531, 12510, 522, 12462, 12460, 778, - 12462, 12491, 12540, 1034, 12461, 12517, 12522, 12540, 1034, 12462, - 12523, 12480, 12540, 522, 12461, 12525, 1290, 12461, 12525, 12464, 12521, - 12512, 1546, 12461, 12525, 12513, 12540, 12488, 12523, 1290, 12461, - 12525, 12527, 12483, 12488, 778, 12464, 12521, 12512, 1290, 12464, 12521, - 12512, 12488, 12531, 1290, 12463, 12523, 12476, 12452, 12525, 1034, - 12463, 12525, 12540, 12493, 778, 12465, 12540, 12473, 778, 12467, 12523, - 12490, 778, 12467, 12540, 12509, 1034, 12469, 12452, 12463, 12523, 1290, - 12469, 12531, 12481, 12540, 12512, 1034, 12471, 12522, 12531, 12464, 778, - 12475, 12531, 12481, 778, 12475, 12531, 12488, 778, 12480, 12540, 12473, - 522, 12487, 12471, 522, 12489, 12523, 522, 12488, 12531, 522, 12490, - 12494, 778, 12494, 12483, 12488, 778, 12495, 12452, 12484, 1290, 12497, - 12540, 12475, 12531, 12488, 778, 12497, 12540, 12484, 1034, 12496, 12540, - 12524, 12523, 1290, 12500, 12450, 12473, 12488, 12523, 778, 12500, 12463, - 12523, 522, 12500, 12467, 522, 12499, 12523, 1290, 12501, 12449, 12521, - 12483, 12489, 1034, 12501, 12451, 12540, 12488, 1290, 12502, 12483, - 12471, 12455, 12523, 778, 12501, 12521, 12531, 1290, 12504, 12463, 12479, - 12540, 12523, 522, 12506, 12477, 778, 12506, 12491, 12498, 778, 12504, - 12523, 12484, 778, 12506, 12531, 12473, 778, 12506, 12540, 12472, 778, - 12505, 12540, 12479, 1034, 12509, 12452, 12531, 12488, 778, 12508, 12523, - 12488, 522, 12507, 12531, 778, 12509, 12531, 12489, 778, 12507, 12540, - 12523, 778, 12507, 12540, 12531, 1034, 12510, 12452, 12463, 12525, 778, - 12510, 12452, 12523, 778, 12510, 12483, 12495, 778, 12510, 12523, 12463, - 1290, 12510, 12531, 12471, 12519, 12531, 1034, 12511, 12463, 12525, - 12531, 522, 12511, 12522, 1290, 12511, 12522, 12496, 12540, 12523, 522, - 12513, 12460, 1034, 12513, 12460, 12488, 12531, 1034, 12513, 12540, - 12488, 12523, 778, 12516, 12540, 12489, 778, 12516, 12540, 12523, 778, - 12518, 12450, 12531, 1034, 12522, 12483, 12488, 12523, 522, 12522, 12521, - 778, 12523, 12500, 12540, 1034, 12523, 12540, 12502, 12523, 522, 12524, - 12512, 1290, 12524, 12531, 12488, 12466, 12531, 778, 12527, 12483, 12488, - 514, 48, 28857, 514, 49, 28857, 514, 50, 28857, 514, 51, 28857, 514, 52, - 28857, 514, 53, 28857, 514, 54, 28857, 514, 55, 28857, 514, 56, 28857, - 514, 57, 28857, 770, 49, 48, 28857, 770, 49, 49, 28857, 770, 49, 50, - 28857, 770, 49, 51, 28857, 770, 49, 52, 28857, 770, 49, 53, 28857, 770, - 49, 54, 28857, 770, 49, 55, 28857, 770, 49, 56, 28857, 770, 49, 57, - 28857, 770, 50, 48, 28857, 770, 50, 49, 28857, 770, 50, 50, 28857, 770, - 50, 51, 28857, 770, 50, 52, 28857, 778, 104, 80, 97, 522, 100, 97, 522, - 65, 85, 778, 98, 97, 114, 522, 111, 86, 522, 112, 99, 522, 100, 109, 778, - 100, 109, 178, 778, 100, 109, 179, 522, 73, 85, 522, 24179, 25104, 522, - 26157, 21644, 522, 22823, 27491, 522, 26126, 27835, 1034, 26666, 24335, - 20250, 31038, 522, 112, 65, 522, 110, 65, 522, 956, 65, 522, 109, 65, - 522, 107, 65, 522, 75, 66, 522, 77, 66, 522, 71, 66, 778, 99, 97, 108, - 1034, 107, 99, 97, 108, 522, 112, 70, 522, 110, 70, 522, 956, 70, 522, - 956, 103, 522, 109, 103, 522, 107, 103, 522, 72, 122, 778, 107, 72, 122, - 778, 77, 72, 122, 778, 71, 72, 122, 778, 84, 72, 122, 522, 956, 8467, - 522, 109, 8467, 522, 100, 8467, 522, 107, 8467, 522, 102, 109, 522, 110, - 109, 522, 956, 109, 522, 109, 109, 522, 99, 109, 522, 107, 109, 778, 109, - 109, 178, 778, 99, 109, 178, 522, 109, 178, 778, 107, 109, 178, 778, 109, - 109, 179, 778, 99, 109, 179, 522, 109, 179, 778, 107, 109, 179, 778, 109, - 8725, 115, 1034, 109, 8725, 115, 178, 522, 80, 97, 778, 107, 80, 97, 778, - 77, 80, 97, 778, 71, 80, 97, 778, 114, 97, 100, 1290, 114, 97, 100, 8725, - 115, 1546, 114, 97, 100, 8725, 115, 178, 522, 112, 115, 522, 110, 115, - 522, 956, 115, 522, 109, 115, 522, 112, 86, 522, 110, 86, 522, 956, 86, - 522, 109, 86, 522, 107, 86, 522, 77, 86, 522, 112, 87, 522, 110, 87, 522, - 956, 87, 522, 109, 87, 522, 107, 87, 522, 77, 87, 522, 107, 937, 522, 77, - 937, 1034, 97, 46, 109, 46, 522, 66, 113, 522, 99, 99, 522, 99, 100, - 1034, 67, 8725, 107, 103, 778, 67, 111, 46, 522, 100, 66, 522, 71, 121, - 522, 104, 97, 522, 72, 80, 522, 105, 110, 522, 75, 75, 522, 75, 77, 522, - 107, 116, 522, 108, 109, 522, 108, 110, 778, 108, 111, 103, 522, 108, - 120, 522, 109, 98, 778, 109, 105, 108, 778, 109, 111, 108, 522, 80, 72, - 1034, 112, 46, 109, 46, 778, 80, 80, 77, 522, 80, 82, 522, 115, 114, 522, - 83, 118, 522, 87, 98, 778, 86, 8725, 109, 778, 65, 8725, 109, 514, 49, - 26085, 514, 50, 26085, 514, 51, 26085, 514, 52, 26085, 514, 53, 26085, - 514, 54, 26085, 514, 55, 26085, 514, 56, 26085, 514, 57, 26085, 770, 49, - 48, 26085, 770, 49, 49, 26085, 770, 49, 50, 26085, 770, 49, 51, 26085, - 770, 49, 52, 26085, 770, 49, 53, 26085, 770, 49, 54, 26085, 770, 49, 55, - 26085, 770, 49, 56, 26085, 770, 49, 57, 26085, 770, 50, 48, 26085, 770, - 50, 49, 26085, 770, 50, 50, 26085, 770, 50, 51, 26085, 770, 50, 52, - 26085, 770, 50, 53, 26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770, - 50, 56, 26085, 770, 50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49, - 26085, 778, 103, 97, 108, 259, 1098, 259, 1100, 259, 42863, 259, 294, - 259, 339, 259, 42791, 259, 43831, 259, 619, 259, 43858, 256, 35912, 256, - 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, 256, 21477, 256, - 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, 256, 22856, 256, - 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, 256, 35064, 256, - 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, 256, 33853, 256, - 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, 256, 29211, 256, - 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, 256, 35172, 256, - 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, 256, 28010, 256, - 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, 256, 25796, 256, - 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, 256, 34396, 256, - 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, 256, 31103, 256, - 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, 256, 22751, 256, - 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, 256, 36034, 256, - 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, 256, 28431, 256, - 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, 256, 20956, 256, - 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, 256, 35712, 256, - 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, 256, 24594, 256, - 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, 256, 24489, 256, - 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, 256, 22622, 256, - 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, 256, 27784, 256, - 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, 256, 20841, 256, - 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, 256, 37327, 256, - 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, 256, 28670, 256, - 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, 256, 21147, 256, - 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, 256, 25088, 256, - 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, 256, 32244, 256, - 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, 256, 21015, 256, - 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, 256, 24265, 256, - 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, 256, 20196, 256, - 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, 256, 29801, 256, - 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, 256, 38936, 256, - 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, 256, 20102, 256, - 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, 256, 29134, 256, - 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, 256, 38446, 256, - 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, 256, 29705, 256, - 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, 256, 25134, 256, - 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, 256, 24459, 256, - 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, 256, 21519, 256, - 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, 256, 29702, 256, - 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, 256, 38626, 256, - 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, 256, 34298, 256, - 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, 256, 33256, 256, - 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, 256, 35672, 256, - 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, 256, 25299, 256, - 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, 256, 34892, 256, - 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, 256, 22618, 256, - 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, 256, 31070, 256, - 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, 256, 34322, 256, - 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, 256, 39208, 256, - 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, 256, 20813, 256, - 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, 256, - 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, 256, - 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, 256, - 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, 256, - 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, 256, - 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, 256, - 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, 256, - 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, 256, - 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, 256, - 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, 256, 20006, 256, - 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, 256, - 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, 256, - 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, 256, - 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, 256, - 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, 256, - 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, 256, - 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, 256, - 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, 256, - 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, 256, - 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, 256, - 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, 256, - 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, 256, - 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, 256, - 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, 256, - 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, 256, - 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, 256, 141380, 256, - 144341, 256, 15261, 256, 16408, 256, 16441, 256, 152137, 256, 154832, - 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, 514, 102, 105, 514, - 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, 514, 383, 116, 514, - 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, 1396, 1387, 514, 1406, - 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, 1463, 262, 1506, 262, - 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, 262, 1501, 262, 1512, - 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, 1474, 512, 64329, 1473, - 512, 64329, 1474, 512, 1488, 1463, 512, 1488, 1464, 512, 1488, 1468, 512, - 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, 512, 1492, 1468, 512, 1493, - 1468, 512, 1494, 1468, 512, 1496, 1468, 512, 1497, 1468, 512, 1498, 1468, - 512, 1499, 1468, 512, 1500, 1468, 512, 1502, 1468, 512, 1504, 1468, 512, - 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, 512, 1510, 1468, 512, 1511, - 1468, 512, 1512, 1468, 512, 1513, 1468, 512, 1514, 1468, 512, 1493, 1465, - 512, 1489, 1471, 512, 1499, 1471, 512, 1508, 1471, 514, 1488, 1500, 267, - 1649, 268, 1649, 267, 1659, 268, 1659, 269, 1659, 270, 1659, 267, 1662, - 268, 1662, 269, 1662, 270, 1662, 267, 1664, 268, 1664, 269, 1664, 270, - 1664, 267, 1658, 268, 1658, 269, 1658, 270, 1658, 267, 1663, 268, 1663, - 269, 1663, 270, 1663, 267, 1657, 268, 1657, 269, 1657, 270, 1657, 267, - 1700, 268, 1700, 269, 1700, 270, 1700, 267, 1702, 268, 1702, 269, 1702, - 270, 1702, 267, 1668, 268, 1668, 269, 1668, 270, 1668, 267, 1667, 268, - 1667, 269, 1667, 270, 1667, 267, 1670, 268, 1670, 269, 1670, 270, 1670, - 267, 1671, 268, 1671, 269, 1671, 270, 1671, 267, 1677, 268, 1677, 267, - 1676, 268, 1676, 267, 1678, 268, 1678, 267, 1672, 268, 1672, 267, 1688, - 268, 1688, 267, 1681, 268, 1681, 267, 1705, 268, 1705, 269, 1705, 270, - 1705, 267, 1711, 268, 1711, 269, 1711, 270, 1711, 267, 1715, 268, 1715, - 269, 1715, 270, 1715, 267, 1713, 268, 1713, 269, 1713, 270, 1713, 267, - 1722, 268, 1722, 267, 1723, 268, 1723, 269, 1723, 270, 1723, 267, 1728, - 268, 1728, 267, 1729, 268, 1729, 269, 1729, 270, 1729, 267, 1726, 268, - 1726, 269, 1726, 270, 1726, 267, 1746, 268, 1746, 267, 1747, 268, 1747, - 267, 1709, 268, 1709, 269, 1709, 270, 1709, 267, 1735, 268, 1735, 267, - 1734, 268, 1734, 267, 1736, 268, 1736, 267, 1655, 267, 1739, 268, 1739, - 267, 1733, 268, 1733, 267, 1737, 268, 1737, 267, 1744, 268, 1744, 269, - 1744, 270, 1744, 269, 1609, 270, 1609, 523, 1574, 1575, 524, 1574, 1575, - 523, 1574, 1749, 524, 1574, 1749, 523, 1574, 1608, 524, 1574, 1608, 523, - 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, 524, 1574, 1734, 523, 1574, - 1736, 524, 1574, 1736, 523, 1574, 1744, 524, 1574, 1744, 525, 1574, 1744, - 523, 1574, 1609, 524, 1574, 1609, 525, 1574, 1609, 267, 1740, 268, 1740, - 269, 1740, 270, 1740, 523, 1574, 1580, 523, 1574, 1581, 523, 1574, 1605, - 523, 1574, 1609, 523, 1574, 1610, 523, 1576, 1580, 523, 1576, 1581, 523, - 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, 523, 1576, 1610, 523, 1578, - 1580, 523, 1578, 1581, 523, 1578, 1582, 523, 1578, 1605, 523, 1578, 1609, - 523, 1578, 1610, 523, 1579, 1580, 523, 1579, 1605, 523, 1579, 1609, 523, - 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, 523, 1581, 1580, 523, 1581, - 1605, 523, 1582, 1580, 523, 1582, 1581, 523, 1582, 1605, 523, 1587, 1580, - 523, 1587, 1581, 523, 1587, 1582, 523, 1587, 1605, 523, 1589, 1581, 523, - 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, 523, 1590, 1582, 523, 1590, - 1605, 523, 1591, 1581, 523, 1591, 1605, 523, 1592, 1605, 523, 1593, 1580, - 523, 1593, 1605, 523, 1594, 1580, 523, 1594, 1605, 523, 1601, 1580, 523, - 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, 523, 1601, 1609, 523, 1601, - 1610, 523, 1602, 1581, 523, 1602, 1605, 523, 1602, 1609, 523, 1602, 1610, - 523, 1603, 1575, 523, 1603, 1580, 523, 1603, 1581, 523, 1603, 1582, 523, - 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, 523, 1603, 1610, 523, 1604, - 1580, 523, 1604, 1581, 523, 1604, 1582, 523, 1604, 1605, 523, 1604, 1609, - 523, 1604, 1610, 523, 1605, 1580, 523, 1605, 1581, 523, 1605, 1582, 523, - 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, 523, 1606, 1580, 523, 1606, - 1581, 523, 1606, 1582, 523, 1606, 1605, 523, 1606, 1609, 523, 1606, 1610, - 523, 1607, 1580, 523, 1607, 1605, 523, 1607, 1609, 523, 1607, 1610, 523, - 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, 523, 1610, 1605, 523, 1610, - 1609, 523, 1610, 1610, 523, 1584, 1648, 523, 1585, 1648, 523, 1609, 1648, - 779, 32, 1612, 1617, 779, 32, 1613, 1617, 779, 32, 1614, 1617, 779, 32, - 1615, 1617, 779, 32, 1616, 1617, 779, 32, 1617, 1648, 524, 1574, 1585, - 524, 1574, 1586, 524, 1574, 1605, 524, 1574, 1606, 524, 1574, 1609, 524, - 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, 524, 1576, 1605, 524, 1576, - 1606, 524, 1576, 1609, 524, 1576, 1610, 524, 1578, 1585, 524, 1578, 1586, - 524, 1578, 1605, 524, 1578, 1606, 524, 1578, 1609, 524, 1578, 1610, 524, - 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, 524, 1579, 1606, 524, 1579, - 1609, 524, 1579, 1610, 524, 1601, 1609, 524, 1601, 1610, 524, 1602, 1609, - 524, 1602, 1610, 524, 1603, 1575, 524, 1603, 1604, 524, 1603, 1605, 524, - 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, 524, 1604, 1609, 524, 1604, - 1610, 524, 1605, 1575, 524, 1605, 1605, 524, 1606, 1585, 524, 1606, 1586, - 524, 1606, 1605, 524, 1606, 1606, 524, 1606, 1609, 524, 1606, 1610, 524, - 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, 524, 1610, 1605, 524, 1610, - 1606, 524, 1610, 1609, 524, 1610, 1610, 525, 1574, 1580, 525, 1574, 1581, - 525, 1574, 1582, 525, 1574, 1605, 525, 1574, 1607, 525, 1576, 1580, 525, - 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, 525, 1576, 1607, 525, 1578, - 1580, 525, 1578, 1581, 525, 1578, 1582, 525, 1578, 1605, 525, 1578, 1607, - 525, 1579, 1605, 525, 1580, 1581, 525, 1580, 1605, 525, 1581, 1580, 525, - 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, 525, 1587, 1580, 525, 1587, - 1581, 525, 1587, 1582, 525, 1587, 1605, 525, 1589, 1581, 525, 1589, 1582, - 525, 1589, 1605, 525, 1590, 1580, 525, 1590, 1581, 525, 1590, 1582, 525, - 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, 525, 1593, 1580, 525, 1593, - 1605, 525, 1594, 1580, 525, 1594, 1605, 525, 1601, 1580, 525, 1601, 1581, - 525, 1601, 1582, 525, 1601, 1605, 525, 1602, 1581, 525, 1602, 1605, 525, - 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, 525, 1603, 1604, 525, 1603, - 1605, 525, 1604, 1580, 525, 1604, 1581, 525, 1604, 1582, 525, 1604, 1605, - 525, 1604, 1607, 525, 1605, 1580, 525, 1605, 1581, 525, 1605, 1582, 525, - 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, 525, 1606, 1582, 525, 1606, - 1605, 525, 1606, 1607, 525, 1607, 1580, 525, 1607, 1605, 525, 1607, 1648, - 525, 1610, 1580, 525, 1610, 1581, 525, 1610, 1582, 525, 1610, 1605, 525, - 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, 526, 1576, 1605, 526, 1576, - 1607, 526, 1578, 1605, 526, 1578, 1607, 526, 1579, 1605, 526, 1579, 1607, - 526, 1587, 1605, 526, 1587, 1607, 526, 1588, 1605, 526, 1588, 1607, 526, - 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, 526, 1606, 1605, 526, 1606, - 1607, 526, 1610, 1605, 526, 1610, 1607, 782, 1600, 1614, 1617, 782, 1600, - 1615, 1617, 782, 1600, 1616, 1617, 523, 1591, 1609, 523, 1591, 1610, 523, - 1593, 1609, 523, 1593, 1610, 523, 1594, 1609, 523, 1594, 1610, 523, 1587, - 1609, 523, 1587, 1610, 523, 1588, 1609, 523, 1588, 1610, 523, 1581, 1609, - 523, 1581, 1610, 523, 1580, 1609, 523, 1580, 1610, 523, 1582, 1609, 523, - 1582, 1610, 523, 1589, 1609, 523, 1589, 1610, 523, 1590, 1609, 523, 1590, - 1610, 523, 1588, 1580, 523, 1588, 1581, 523, 1588, 1582, 523, 1588, 1605, - 523, 1588, 1585, 523, 1587, 1585, 523, 1589, 1585, 523, 1590, 1585, 524, - 1591, 1609, 524, 1591, 1610, 524, 1593, 1609, 524, 1593, 1610, 524, 1594, - 1609, 524, 1594, 1610, 524, 1587, 1609, 524, 1587, 1610, 524, 1588, 1609, - 524, 1588, 1610, 524, 1581, 1609, 524, 1581, 1610, 524, 1580, 1609, 524, - 1580, 1610, 524, 1582, 1609, 524, 1582, 1610, 524, 1589, 1609, 524, 1589, - 1610, 524, 1590, 1609, 524, 1590, 1610, 524, 1588, 1580, 524, 1588, 1581, - 524, 1588, 1582, 524, 1588, 1605, 524, 1588, 1585, 524, 1587, 1585, 524, - 1589, 1585, 524, 1590, 1585, 525, 1588, 1580, 525, 1588, 1581, 525, 1588, - 1582, 525, 1588, 1605, 525, 1587, 1607, 525, 1588, 1607, 525, 1591, 1605, - 526, 1587, 1580, 526, 1587, 1581, 526, 1587, 1582, 526, 1588, 1580, 526, - 1588, 1581, 526, 1588, 1582, 526, 1591, 1605, 526, 1592, 1605, 524, 1575, - 1611, 523, 1575, 1611, 781, 1578, 1580, 1605, 780, 1578, 1581, 1580, 781, - 1578, 1581, 1580, 781, 1578, 1581, 1605, 781, 1578, 1582, 1605, 781, - 1578, 1605, 1580, 781, 1578, 1605, 1581, 781, 1578, 1605, 1582, 780, - 1580, 1605, 1581, 781, 1580, 1605, 1581, 780, 1581, 1605, 1610, 780, - 1581, 1605, 1609, 781, 1587, 1581, 1580, 781, 1587, 1580, 1581, 780, - 1587, 1580, 1609, 780, 1587, 1605, 1581, 781, 1587, 1605, 1581, 781, - 1587, 1605, 1580, 780, 1587, 1605, 1605, 781, 1587, 1605, 1605, 780, - 1589, 1581, 1581, 781, 1589, 1581, 1581, 780, 1589, 1605, 1605, 780, - 1588, 1581, 1605, 781, 1588, 1581, 1605, 780, 1588, 1580, 1610, 780, - 1588, 1605, 1582, 781, 1588, 1605, 1582, 780, 1588, 1605, 1605, 781, - 1588, 1605, 1605, 780, 1590, 1581, 1609, 780, 1590, 1582, 1605, 781, - 1590, 1582, 1605, 780, 1591, 1605, 1581, 781, 1591, 1605, 1581, 781, - 1591, 1605, 1605, 780, 1591, 1605, 1610, 780, 1593, 1580, 1605, 780, - 1593, 1605, 1605, 781, 1593, 1605, 1605, 780, 1593, 1605, 1609, 780, - 1594, 1605, 1605, 780, 1594, 1605, 1610, 780, 1594, 1605, 1609, 780, - 1601, 1582, 1605, 781, 1601, 1582, 1605, 780, 1602, 1605, 1581, 780, - 1602, 1605, 1605, 780, 1604, 1581, 1605, 780, 1604, 1581, 1610, 780, - 1604, 1581, 1609, 781, 1604, 1580, 1580, 780, 1604, 1580, 1580, 780, - 1604, 1582, 1605, 781, 1604, 1582, 1605, 780, 1604, 1605, 1581, 781, - 1604, 1605, 1581, 781, 1605, 1581, 1580, 781, 1605, 1581, 1605, 780, - 1605, 1581, 1610, 781, 1605, 1580, 1581, 781, 1605, 1580, 1605, 781, - 1605, 1582, 1580, 781, 1605, 1582, 1605, 781, 1605, 1580, 1582, 781, - 1607, 1605, 1580, 781, 1607, 1605, 1605, 781, 1606, 1581, 1605, 780, - 1606, 1581, 1609, 780, 1606, 1580, 1605, 781, 1606, 1580, 1605, 780, - 1606, 1580, 1609, 780, 1606, 1605, 1610, 780, 1606, 1605, 1609, 780, - 1610, 1605, 1605, 781, 1610, 1605, 1605, 780, 1576, 1582, 1610, 780, - 1578, 1580, 1610, 780, 1578, 1580, 1609, 780, 1578, 1582, 1610, 780, - 1578, 1582, 1609, 780, 1578, 1605, 1610, 780, 1578, 1605, 1609, 780, - 1580, 1605, 1610, 780, 1580, 1581, 1609, 780, 1580, 1605, 1609, 780, - 1587, 1582, 1609, 780, 1589, 1581, 1610, 780, 1588, 1581, 1610, 780, - 1590, 1581, 1610, 780, 1604, 1580, 1610, 780, 1604, 1605, 1610, 780, - 1610, 1581, 1610, 780, 1610, 1580, 1610, 780, 1610, 1605, 1610, 780, - 1605, 1605, 1610, 780, 1602, 1605, 1610, 780, 1606, 1581, 1610, 781, - 1602, 1605, 1581, 781, 1604, 1581, 1605, 780, 1593, 1605, 1610, 780, - 1603, 1605, 1610, 781, 1606, 1580, 1581, 780, 1605, 1582, 1610, 781, - 1604, 1580, 1605, 780, 1603, 1605, 1605, 780, 1604, 1580, 1605, 780, - 1606, 1580, 1581, 780, 1580, 1581, 1610, 780, 1581, 1580, 1610, 780, - 1605, 1580, 1610, 780, 1601, 1605, 1610, 780, 1576, 1581, 1610, 781, - 1603, 1605, 1605, 781, 1593, 1580, 1605, 781, 1589, 1605, 1605, 780, - 1587, 1582, 1610, 780, 1606, 1580, 1610, 779, 1589, 1604, 1746, 779, - 1602, 1604, 1746, 1035, 1575, 1604, 1604, 1607, 1035, 1575, 1603, 1576, - 1585, 1035, 1605, 1581, 1605, 1583, 1035, 1589, 1604, 1593, 1605, 1035, - 1585, 1587, 1608, 1604, 1035, 1593, 1604, 1610, 1607, 1035, 1608, 1587, - 1604, 1605, 779, 1589, 1604, 1609, 4619, 1589, 1604, 1609, 32, 1575, - 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, - 2059, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1035, 1585, 1740, - 1575, 1604, 265, 44, 265, 12289, 265, 12290, 265, 58, 265, 59, 265, 33, - 265, 63, 265, 12310, 265, 12311, 265, 8230, 265, 8229, 265, 8212, 265, - 8211, 265, 95, 265, 95, 265, 40, 265, 41, 265, 123, 265, 125, 265, 12308, - 265, 12309, 265, 12304, 265, 12305, 265, 12298, 265, 12299, 265, 12296, - 265, 12297, 265, 12300, 265, 12301, 265, 12302, 265, 12303, 265, 91, 265, - 93, 258, 8254, 258, 8254, 258, 8254, 258, 8254, 258, 95, 258, 95, 258, - 95, 271, 44, 271, 12289, 271, 46, 271, 59, 271, 58, 271, 63, 271, 33, - 271, 8212, 271, 40, 271, 41, 271, 123, 271, 125, 271, 12308, 271, 12309, - 271, 35, 271, 38, 271, 42, 271, 43, 271, 45, 271, 60, 271, 62, 271, 61, - 271, 92, 271, 36, 271, 37, 271, 64, 523, 32, 1611, 526, 1600, 1611, 523, - 32, 1612, 523, 32, 1613, 523, 32, 1614, 526, 1600, 1614, 523, 32, 1615, - 526, 1600, 1615, 523, 32, 1616, 526, 1600, 1616, 523, 32, 1617, 526, - 1600, 1617, 523, 32, 1618, 526, 1600, 1618, 267, 1569, 267, 1570, 268, - 1570, 267, 1571, 268, 1571, 267, 1572, 268, 1572, 267, 1573, 268, 1573, - 267, 1574, 268, 1574, 269, 1574, 270, 1574, 267, 1575, 268, 1575, 267, - 1576, 268, 1576, 269, 1576, 270, 1576, 267, 1577, 268, 1577, 267, 1578, - 268, 1578, 269, 1578, 270, 1578, 267, 1579, 268, 1579, 269, 1579, 270, - 1579, 267, 1580, 268, 1580, 269, 1580, 270, 1580, 267, 1581, 268, 1581, - 269, 1581, 270, 1581, 267, 1582, 268, 1582, 269, 1582, 270, 1582, 267, - 1583, 268, 1583, 267, 1584, 268, 1584, 267, 1585, 268, 1585, 267, 1586, - 268, 1586, 267, 1587, 268, 1587, 269, 1587, 270, 1587, 267, 1588, 268, - 1588, 269, 1588, 270, 1588, 267, 1589, 268, 1589, 269, 1589, 270, 1589, - 267, 1590, 268, 1590, 269, 1590, 270, 1590, 267, 1591, 268, 1591, 269, - 1591, 270, 1591, 267, 1592, 268, 1592, 269, 1592, 270, 1592, 267, 1593, - 268, 1593, 269, 1593, 270, 1593, 267, 1594, 268, 1594, 269, 1594, 270, - 1594, 267, 1601, 268, 1601, 269, 1601, 270, 1601, 267, 1602, 268, 1602, - 269, 1602, 270, 1602, 267, 1603, 268, 1603, 269, 1603, 270, 1603, 267, - 1604, 268, 1604, 269, 1604, 270, 1604, 267, 1605, 268, 1605, 269, 1605, - 270, 1605, 267, 1606, 268, 1606, 269, 1606, 270, 1606, 267, 1607, 268, - 1607, 269, 1607, 270, 1607, 267, 1608, 268, 1608, 267, 1609, 268, 1609, - 267, 1610, 268, 1610, 269, 1610, 270, 1610, 523, 1604, 1570, 524, 1604, - 1570, 523, 1604, 1571, 524, 1604, 1571, 523, 1604, 1573, 524, 1604, 1573, - 523, 1604, 1575, 524, 1604, 1575, 264, 33, 264, 34, 264, 35, 264, 36, - 264, 37, 264, 38, 264, 39, 264, 40, 264, 41, 264, 42, 264, 43, 264, 44, - 264, 45, 264, 46, 264, 47, 264, 48, 264, 49, 264, 50, 264, 51, 264, 52, - 264, 53, 264, 54, 264, 55, 264, 56, 264, 57, 264, 58, 264, 59, 264, 60, - 264, 61, 264, 62, 264, 63, 264, 64, 264, 65, 264, 66, 264, 67, 264, 68, - 264, 69, 264, 70, 264, 71, 264, 72, 264, 73, 264, 74, 264, 75, 264, 76, - 264, 77, 264, 78, 264, 79, 264, 80, 264, 81, 264, 82, 264, 83, 264, 84, - 264, 85, 264, 86, 264, 87, 264, 88, 264, 89, 264, 90, 264, 91, 264, 92, - 264, 93, 264, 94, 264, 95, 264, 96, 264, 97, 264, 98, 264, 99, 264, 100, - 264, 101, 264, 102, 264, 103, 264, 104, 264, 105, 264, 106, 264, 107, - 264, 108, 264, 109, 264, 110, 264, 111, 264, 112, 264, 113, 264, 114, - 264, 115, 264, 116, 264, 117, 264, 118, 264, 119, 264, 120, 264, 121, - 264, 122, 264, 123, 264, 124, 264, 125, 264, 126, 264, 10629, 264, 10630, - 272, 12290, 272, 12300, 272, 12301, 272, 12289, 272, 12539, 272, 12530, - 272, 12449, 272, 12451, 272, 12453, 272, 12455, 272, 12457, 272, 12515, - 272, 12517, 272, 12519, 272, 12483, 272, 12540, 272, 12450, 272, 12452, - 272, 12454, 272, 12456, 272, 12458, 272, 12459, 272, 12461, 272, 12463, - 272, 12465, 272, 12467, 272, 12469, 272, 12471, 272, 12473, 272, 12475, - 272, 12477, 272, 12479, 272, 12481, 272, 12484, 272, 12486, 272, 12488, - 272, 12490, 272, 12491, 272, 12492, 272, 12493, 272, 12494, 272, 12495, - 272, 12498, 272, 12501, 272, 12504, 272, 12507, 272, 12510, 272, 12511, - 272, 12512, 272, 12513, 272, 12514, 272, 12516, 272, 12518, 272, 12520, - 272, 12521, 272, 12522, 272, 12523, 272, 12524, 272, 12525, 272, 12527, - 272, 12531, 272, 12441, 272, 12442, 272, 12644, 272, 12593, 272, 12594, - 272, 12595, 272, 12596, 272, 12597, 272, 12598, 272, 12599, 272, 12600, - 272, 12601, 272, 12602, 272, 12603, 272, 12604, 272, 12605, 272, 12606, - 272, 12607, 272, 12608, 272, 12609, 272, 12610, 272, 12611, 272, 12612, - 272, 12613, 272, 12614, 272, 12615, 272, 12616, 272, 12617, 272, 12618, - 272, 12619, 272, 12620, 272, 12621, 272, 12622, 272, 12623, 272, 12624, - 272, 12625, 272, 12626, 272, 12627, 272, 12628, 272, 12629, 272, 12630, - 272, 12631, 272, 12632, 272, 12633, 272, 12634, 272, 12635, 272, 12636, - 272, 12637, 272, 12638, 272, 12639, 272, 12640, 272, 12641, 272, 12642, - 272, 12643, 264, 162, 264, 163, 264, 172, 264, 175, 264, 166, 264, 165, - 264, 8361, 272, 9474, 272, 8592, 272, 8593, 272, 8594, 272, 8595, 272, - 9632, 272, 9675, 512, 69785, 69818, 512, 69787, 69818, 512, 69797, 69818, - 512, 69937, 69927, 512, 69938, 69927, 512, 70471, 70462, 512, 70471, - 70487, 512, 70841, 70842, 512, 70841, 70832, 512, 70841, 70845, 512, - 71096, 71087, 512, 71097, 71087, 512, 119127, 119141, 512, 119128, - 119141, 512, 119135, 119150, 512, 119135, 119151, 512, 119135, 119152, - 512, 119135, 119153, 512, 119135, 119154, 512, 119225, 119141, 512, - 119226, 119141, 512, 119227, 119150, 512, 119228, 119150, 512, 119227, - 119151, 512, 119228, 119151, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, - 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, - 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, - 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, - 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, - 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, - 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, - 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, - 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, - 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, - 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, - 262, 101, 262, 102, 262, 103, 262, 105, 262, 106, 262, 107, 262, 108, - 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, - 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, - 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, - 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, - 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, - 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, - 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, - 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, - 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, - 262, 67, 262, 68, 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, 262, 80, - 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 102, 262, 104, 262, - 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 112, 262, + 522, 20196, 21644, 1034, 12450, 12497, 12540, 12488, 1034, 12450, 12523, + 12501, 12449, 1034, 12450, 12531, 12506, 12450, 778, 12450, 12540, 12523, + 1034, 12452, 12491, 12531, 12464, 778, 12452, 12531, 12481, 778, 12454, + 12457, 12531, 1290, 12456, 12473, 12463, 12540, 12489, 1034, 12456, + 12540, 12459, 12540, 778, 12458, 12531, 12473, 778, 12458, 12540, 12512, + 778, 12459, 12452, 12522, 1034, 12459, 12521, 12483, 12488, 1034, 12459, + 12525, 12522, 12540, 778, 12460, 12525, 12531, 778, 12460, 12531, 12510, + 522, 12462, 12460, 778, 12462, 12491, 12540, 1034, 12461, 12517, 12522, + 12540, 1034, 12462, 12523, 12480, 12540, 522, 12461, 12525, 1290, 12461, + 12525, 12464, 12521, 12512, 1546, 12461, 12525, 12513, 12540, 12488, + 12523, 1290, 12461, 12525, 12527, 12483, 12488, 778, 12464, 12521, 12512, + 1290, 12464, 12521, 12512, 12488, 12531, 1290, 12463, 12523, 12476, + 12452, 12525, 1034, 12463, 12525, 12540, 12493, 778, 12465, 12540, 12473, + 778, 12467, 12523, 12490, 778, 12467, 12540, 12509, 1034, 12469, 12452, + 12463, 12523, 1290, 12469, 12531, 12481, 12540, 12512, 1034, 12471, + 12522, 12531, 12464, 778, 12475, 12531, 12481, 778, 12475, 12531, 12488, + 778, 12480, 12540, 12473, 522, 12487, 12471, 522, 12489, 12523, 522, + 12488, 12531, 522, 12490, 12494, 778, 12494, 12483, 12488, 778, 12495, + 12452, 12484, 1290, 12497, 12540, 12475, 12531, 12488, 778, 12497, 12540, + 12484, 1034, 12496, 12540, 12524, 12523, 1290, 12500, 12450, 12473, + 12488, 12523, 778, 12500, 12463, 12523, 522, 12500, 12467, 522, 12499, + 12523, 1290, 12501, 12449, 12521, 12483, 12489, 1034, 12501, 12451, + 12540, 12488, 1290, 12502, 12483, 12471, 12455, 12523, 778, 12501, 12521, + 12531, 1290, 12504, 12463, 12479, 12540, 12523, 522, 12506, 12477, 778, + 12506, 12491, 12498, 778, 12504, 12523, 12484, 778, 12506, 12531, 12473, + 778, 12506, 12540, 12472, 778, 12505, 12540, 12479, 1034, 12509, 12452, + 12531, 12488, 778, 12508, 12523, 12488, 522, 12507, 12531, 778, 12509, + 12531, 12489, 778, 12507, 12540, 12523, 778, 12507, 12540, 12531, 1034, + 12510, 12452, 12463, 12525, 778, 12510, 12452, 12523, 778, 12510, 12483, + 12495, 778, 12510, 12523, 12463, 1290, 12510, 12531, 12471, 12519, 12531, + 1034, 12511, 12463, 12525, 12531, 522, 12511, 12522, 1290, 12511, 12522, + 12496, 12540, 12523, 522, 12513, 12460, 1034, 12513, 12460, 12488, 12531, + 1034, 12513, 12540, 12488, 12523, 778, 12516, 12540, 12489, 778, 12516, + 12540, 12523, 778, 12518, 12450, 12531, 1034, 12522, 12483, 12488, 12523, + 522, 12522, 12521, 778, 12523, 12500, 12540, 1034, 12523, 12540, 12502, + 12523, 522, 12524, 12512, 1290, 12524, 12531, 12488, 12466, 12531, 778, + 12527, 12483, 12488, 514, 48, 28857, 514, 49, 28857, 514, 50, 28857, 514, + 51, 28857, 514, 52, 28857, 514, 53, 28857, 514, 54, 28857, 514, 55, + 28857, 514, 56, 28857, 514, 57, 28857, 770, 49, 48, 28857, 770, 49, 49, + 28857, 770, 49, 50, 28857, 770, 49, 51, 28857, 770, 49, 52, 28857, 770, + 49, 53, 28857, 770, 49, 54, 28857, 770, 49, 55, 28857, 770, 49, 56, + 28857, 770, 49, 57, 28857, 770, 50, 48, 28857, 770, 50, 49, 28857, 770, + 50, 50, 28857, 770, 50, 51, 28857, 770, 50, 52, 28857, 778, 104, 80, 97, + 522, 100, 97, 522, 65, 85, 778, 98, 97, 114, 522, 111, 86, 522, 112, 99, + 522, 100, 109, 778, 100, 109, 178, 778, 100, 109, 179, 522, 73, 85, 522, + 24179, 25104, 522, 26157, 21644, 522, 22823, 27491, 522, 26126, 27835, + 1034, 26666, 24335, 20250, 31038, 522, 112, 65, 522, 110, 65, 522, 956, + 65, 522, 109, 65, 522, 107, 65, 522, 75, 66, 522, 77, 66, 522, 71, 66, + 778, 99, 97, 108, 1034, 107, 99, 97, 108, 522, 112, 70, 522, 110, 70, + 522, 956, 70, 522, 956, 103, 522, 109, 103, 522, 107, 103, 522, 72, 122, + 778, 107, 72, 122, 778, 77, 72, 122, 778, 71, 72, 122, 778, 84, 72, 122, + 522, 956, 8467, 522, 109, 8467, 522, 100, 8467, 522, 107, 8467, 522, 102, + 109, 522, 110, 109, 522, 956, 109, 522, 109, 109, 522, 99, 109, 522, 107, + 109, 778, 109, 109, 178, 778, 99, 109, 178, 522, 109, 178, 778, 107, 109, + 178, 778, 109, 109, 179, 778, 99, 109, 179, 522, 109, 179, 778, 107, 109, + 179, 778, 109, 8725, 115, 1034, 109, 8725, 115, 178, 522, 80, 97, 778, + 107, 80, 97, 778, 77, 80, 97, 778, 71, 80, 97, 778, 114, 97, 100, 1290, + 114, 97, 100, 8725, 115, 1546, 114, 97, 100, 8725, 115, 178, 522, 112, + 115, 522, 110, 115, 522, 956, 115, 522, 109, 115, 522, 112, 86, 522, 110, + 86, 522, 956, 86, 522, 109, 86, 522, 107, 86, 522, 77, 86, 522, 112, 87, + 522, 110, 87, 522, 956, 87, 522, 109, 87, 522, 107, 87, 522, 77, 87, 522, + 107, 937, 522, 77, 937, 1034, 97, 46, 109, 46, 522, 66, 113, 522, 99, 99, + 522, 99, 100, 1034, 67, 8725, 107, 103, 778, 67, 111, 46, 522, 100, 66, + 522, 71, 121, 522, 104, 97, 522, 72, 80, 522, 105, 110, 522, 75, 75, 522, + 75, 77, 522, 107, 116, 522, 108, 109, 522, 108, 110, 778, 108, 111, 103, + 522, 108, 120, 522, 109, 98, 778, 109, 105, 108, 778, 109, 111, 108, 522, + 80, 72, 1034, 112, 46, 109, 46, 778, 80, 80, 77, 522, 80, 82, 522, 115, + 114, 522, 83, 118, 522, 87, 98, 778, 86, 8725, 109, 778, 65, 8725, 109, + 514, 49, 26085, 514, 50, 26085, 514, 51, 26085, 514, 52, 26085, 514, 53, + 26085, 514, 54, 26085, 514, 55, 26085, 514, 56, 26085, 514, 57, 26085, + 770, 49, 48, 26085, 770, 49, 49, 26085, 770, 49, 50, 26085, 770, 49, 51, + 26085, 770, 49, 52, 26085, 770, 49, 53, 26085, 770, 49, 54, 26085, 770, + 49, 55, 26085, 770, 49, 56, 26085, 770, 49, 57, 26085, 770, 50, 48, + 26085, 770, 50, 49, 26085, 770, 50, 50, 26085, 770, 50, 51, 26085, 770, + 50, 52, 26085, 770, 50, 53, 26085, 770, 50, 54, 26085, 770, 50, 55, + 26085, 770, 50, 56, 26085, 770, 50, 57, 26085, 770, 51, 48, 26085, 770, + 51, 49, 26085, 778, 103, 97, 108, 259, 1098, 259, 1100, 259, 42863, 259, + 294, 259, 339, 259, 42791, 259, 43831, 259, 619, 259, 43858, 256, 35912, + 256, 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, 256, 21477, + 256, 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, 256, 22856, + 256, 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, 256, 35064, + 256, 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, 256, 33853, + 256, 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, 256, 29211, + 256, 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, 256, 35172, + 256, 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, 256, 28010, + 256, 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, 256, 25796, + 256, 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, 256, 34396, + 256, 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, 256, 31103, + 256, 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, 256, 22751, + 256, 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, 256, 36034, + 256, 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, 256, 28431, + 256, 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, 256, 20956, + 256, 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, 256, 35712, + 256, 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, 256, 24594, + 256, 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, 256, 24489, + 256, 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, 256, 22622, + 256, 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, 256, 27784, + 256, 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, 256, 20841, + 256, 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, 256, 37327, + 256, 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, 256, 28670, + 256, 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, 256, 21147, + 256, 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, 256, 25088, + 256, 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, 256, 32244, + 256, 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, 256, 21015, + 256, 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, 256, 24265, + 256, 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, 256, 20196, + 256, 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, 256, 29801, + 256, 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, 256, 38936, + 256, 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, 256, 20102, + 256, 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, 256, 29134, + 256, 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, 256, 38446, + 256, 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, 256, 29705, + 256, 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, 256, 25134, + 256, 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, 256, 24459, + 256, 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, 256, 21519, + 256, 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, 256, 29702, + 256, 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, 256, 38626, + 256, 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, 256, 34298, + 256, 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, 256, 33256, + 256, 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, 256, 35672, + 256, 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, 256, 25299, + 256, 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, 256, 34892, + 256, 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, 256, 22618, + 256, 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, 256, 31070, + 256, 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, 256, 34322, + 256, 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, 256, 39208, + 256, 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, 256, 20813, + 256, 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, + 256, 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, + 256, 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, + 256, 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, + 256, 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, + 256, 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, + 256, 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, + 256, 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, + 256, 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, + 256, 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, 256, 20006, + 256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, + 256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, + 256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, + 256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, + 256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, + 256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, + 256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, + 256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, + 256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, + 256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, + 256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, + 256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, + 256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, + 256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, + 256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, + 256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, 256, 141380, + 256, 144341, 256, 15261, 256, 16408, 256, 16441, 256, 152137, 256, + 154832, 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, 514, 102, + 105, 514, 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, 514, 383, + 116, 514, 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, 1396, 1387, + 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, 1463, 262, + 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, 262, 1501, + 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, 1474, 512, + 64329, 1473, 512, 64329, 1474, 512, 1488, 1463, 512, 1488, 1464, 512, + 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, 512, 1492, + 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, 1468, 512, 1497, 1468, + 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, 512, 1502, 1468, 512, + 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, 512, 1510, + 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, 1468, 512, 1514, 1468, + 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, 512, 1508, 1471, 514, + 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, 1659, 269, 1659, 270, + 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, 267, 1664, 268, 1664, + 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, 1658, 270, 1658, 267, + 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, 268, 1657, 269, 1657, + 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, 1700, 267, 1702, 268, + 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, 269, 1668, 270, 1668, + 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, 1670, 268, 1670, 269, + 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, 270, 1671, 267, 1677, + 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, 1678, 267, 1672, 268, + 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, 267, 1705, 268, 1705, + 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, 1711, 270, 1711, 267, + 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, 268, 1713, 269, 1713, + 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, 1723, 269, 1723, 270, + 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, 269, 1729, 270, 1729, + 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, 1746, 268, 1746, 267, + 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, 270, 1709, 267, 1735, + 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, 1736, 267, 1655, 267, + 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, 268, 1737, 267, 1744, + 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, 1609, 523, 1574, 1575, + 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, 523, 1574, 1608, 524, + 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, 524, 1574, + 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, 1744, 524, 1574, 1744, + 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, 525, 1574, 1609, 267, + 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, 1580, 523, 1574, 1581, + 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, 523, 1576, 1580, 523, + 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, 523, 1576, + 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, 1582, 523, 1578, 1605, + 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, 523, 1579, 1605, 523, + 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, 523, 1581, + 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, 1581, 523, 1582, 1605, + 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, 523, 1587, 1605, 523, + 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, 523, 1590, + 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, 1605, 523, 1592, 1605, + 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, 523, 1594, 1605, 523, + 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, 523, 1601, + 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, 1605, 523, 1602, 1609, + 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, 523, 1603, 1581, 523, + 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, 523, 1603, + 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, 1582, 523, 1604, 1605, + 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, 523, 1605, 1581, 523, + 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, 523, 1606, + 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, 1605, 523, 1606, 1609, + 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, 523, 1607, 1609, 523, + 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, 523, 1610, + 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, 1648, 523, 1585, 1648, + 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, 1613, 1617, 779, 32, 1614, + 1617, 779, 32, 1615, 1617, 779, 32, 1616, 1617, 779, 32, 1617, 1648, 524, + 1574, 1585, 524, 1574, 1586, 524, 1574, 1605, 524, 1574, 1606, 524, 1574, + 1609, 524, 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, 524, 1576, 1605, + 524, 1576, 1606, 524, 1576, 1609, 524, 1576, 1610, 524, 1578, 1585, 524, + 1578, 1586, 524, 1578, 1605, 524, 1578, 1606, 524, 1578, 1609, 524, 1578, + 1610, 524, 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, 524, 1579, 1606, + 524, 1579, 1609, 524, 1579, 1610, 524, 1601, 1609, 524, 1601, 1610, 524, + 1602, 1609, 524, 1602, 1610, 524, 1603, 1575, 524, 1603, 1604, 524, 1603, + 1605, 524, 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, 524, 1604, 1609, + 524, 1604, 1610, 524, 1605, 1575, 524, 1605, 1605, 524, 1606, 1585, 524, + 1606, 1586, 524, 1606, 1605, 524, 1606, 1606, 524, 1606, 1609, 524, 1606, + 1610, 524, 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, 524, 1610, 1605, + 524, 1610, 1606, 524, 1610, 1609, 524, 1610, 1610, 525, 1574, 1580, 525, + 1574, 1581, 525, 1574, 1582, 525, 1574, 1605, 525, 1574, 1607, 525, 1576, + 1580, 525, 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, 525, 1576, 1607, + 525, 1578, 1580, 525, 1578, 1581, 525, 1578, 1582, 525, 1578, 1605, 525, + 1578, 1607, 525, 1579, 1605, 525, 1580, 1581, 525, 1580, 1605, 525, 1581, + 1580, 525, 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, 525, 1587, 1580, + 525, 1587, 1581, 525, 1587, 1582, 525, 1587, 1605, 525, 1589, 1581, 525, + 1589, 1582, 525, 1589, 1605, 525, 1590, 1580, 525, 1590, 1581, 525, 1590, + 1582, 525, 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, 525, 1593, 1580, + 525, 1593, 1605, 525, 1594, 1580, 525, 1594, 1605, 525, 1601, 1580, 525, + 1601, 1581, 525, 1601, 1582, 525, 1601, 1605, 525, 1602, 1581, 525, 1602, + 1605, 525, 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, 525, 1603, 1604, + 525, 1603, 1605, 525, 1604, 1580, 525, 1604, 1581, 525, 1604, 1582, 525, + 1604, 1605, 525, 1604, 1607, 525, 1605, 1580, 525, 1605, 1581, 525, 1605, + 1582, 525, 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, 525, 1606, 1582, + 525, 1606, 1605, 525, 1606, 1607, 525, 1607, 1580, 525, 1607, 1605, 525, + 1607, 1648, 525, 1610, 1580, 525, 1610, 1581, 525, 1610, 1582, 525, 1610, + 1605, 525, 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, 526, 1576, 1605, + 526, 1576, 1607, 526, 1578, 1605, 526, 1578, 1607, 526, 1579, 1605, 526, + 1579, 1607, 526, 1587, 1605, 526, 1587, 1607, 526, 1588, 1605, 526, 1588, + 1607, 526, 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, 526, 1606, 1605, + 526, 1606, 1607, 526, 1610, 1605, 526, 1610, 1607, 782, 1600, 1614, 1617, + 782, 1600, 1615, 1617, 782, 1600, 1616, 1617, 523, 1591, 1609, 523, 1591, + 1610, 523, 1593, 1609, 523, 1593, 1610, 523, 1594, 1609, 523, 1594, 1610, + 523, 1587, 1609, 523, 1587, 1610, 523, 1588, 1609, 523, 1588, 1610, 523, + 1581, 1609, 523, 1581, 1610, 523, 1580, 1609, 523, 1580, 1610, 523, 1582, + 1609, 523, 1582, 1610, 523, 1589, 1609, 523, 1589, 1610, 523, 1590, 1609, + 523, 1590, 1610, 523, 1588, 1580, 523, 1588, 1581, 523, 1588, 1582, 523, + 1588, 1605, 523, 1588, 1585, 523, 1587, 1585, 523, 1589, 1585, 523, 1590, + 1585, 524, 1591, 1609, 524, 1591, 1610, 524, 1593, 1609, 524, 1593, 1610, + 524, 1594, 1609, 524, 1594, 1610, 524, 1587, 1609, 524, 1587, 1610, 524, + 1588, 1609, 524, 1588, 1610, 524, 1581, 1609, 524, 1581, 1610, 524, 1580, + 1609, 524, 1580, 1610, 524, 1582, 1609, 524, 1582, 1610, 524, 1589, 1609, + 524, 1589, 1610, 524, 1590, 1609, 524, 1590, 1610, 524, 1588, 1580, 524, + 1588, 1581, 524, 1588, 1582, 524, 1588, 1605, 524, 1588, 1585, 524, 1587, + 1585, 524, 1589, 1585, 524, 1590, 1585, 525, 1588, 1580, 525, 1588, 1581, + 525, 1588, 1582, 525, 1588, 1605, 525, 1587, 1607, 525, 1588, 1607, 525, + 1591, 1605, 526, 1587, 1580, 526, 1587, 1581, 526, 1587, 1582, 526, 1588, + 1580, 526, 1588, 1581, 526, 1588, 1582, 526, 1591, 1605, 526, 1592, 1605, + 524, 1575, 1611, 523, 1575, 1611, 781, 1578, 1580, 1605, 780, 1578, 1581, + 1580, 781, 1578, 1581, 1580, 781, 1578, 1581, 1605, 781, 1578, 1582, + 1605, 781, 1578, 1605, 1580, 781, 1578, 1605, 1581, 781, 1578, 1605, + 1582, 780, 1580, 1605, 1581, 781, 1580, 1605, 1581, 780, 1581, 1605, + 1610, 780, 1581, 1605, 1609, 781, 1587, 1581, 1580, 781, 1587, 1580, + 1581, 780, 1587, 1580, 1609, 780, 1587, 1605, 1581, 781, 1587, 1605, + 1581, 781, 1587, 1605, 1580, 780, 1587, 1605, 1605, 781, 1587, 1605, + 1605, 780, 1589, 1581, 1581, 781, 1589, 1581, 1581, 780, 1589, 1605, + 1605, 780, 1588, 1581, 1605, 781, 1588, 1581, 1605, 780, 1588, 1580, + 1610, 780, 1588, 1605, 1582, 781, 1588, 1605, 1582, 780, 1588, 1605, + 1605, 781, 1588, 1605, 1605, 780, 1590, 1581, 1609, 780, 1590, 1582, + 1605, 781, 1590, 1582, 1605, 780, 1591, 1605, 1581, 781, 1591, 1605, + 1581, 781, 1591, 1605, 1605, 780, 1591, 1605, 1610, 780, 1593, 1580, + 1605, 780, 1593, 1605, 1605, 781, 1593, 1605, 1605, 780, 1593, 1605, + 1609, 780, 1594, 1605, 1605, 780, 1594, 1605, 1610, 780, 1594, 1605, + 1609, 780, 1601, 1582, 1605, 781, 1601, 1582, 1605, 780, 1602, 1605, + 1581, 780, 1602, 1605, 1605, 780, 1604, 1581, 1605, 780, 1604, 1581, + 1610, 780, 1604, 1581, 1609, 781, 1604, 1580, 1580, 780, 1604, 1580, + 1580, 780, 1604, 1582, 1605, 781, 1604, 1582, 1605, 780, 1604, 1605, + 1581, 781, 1604, 1605, 1581, 781, 1605, 1581, 1580, 781, 1605, 1581, + 1605, 780, 1605, 1581, 1610, 781, 1605, 1580, 1581, 781, 1605, 1580, + 1605, 781, 1605, 1582, 1580, 781, 1605, 1582, 1605, 781, 1605, 1580, + 1582, 781, 1607, 1605, 1580, 781, 1607, 1605, 1605, 781, 1606, 1581, + 1605, 780, 1606, 1581, 1609, 780, 1606, 1580, 1605, 781, 1606, 1580, + 1605, 780, 1606, 1580, 1609, 780, 1606, 1605, 1610, 780, 1606, 1605, + 1609, 780, 1610, 1605, 1605, 781, 1610, 1605, 1605, 780, 1576, 1582, + 1610, 780, 1578, 1580, 1610, 780, 1578, 1580, 1609, 780, 1578, 1582, + 1610, 780, 1578, 1582, 1609, 780, 1578, 1605, 1610, 780, 1578, 1605, + 1609, 780, 1580, 1605, 1610, 780, 1580, 1581, 1609, 780, 1580, 1605, + 1609, 780, 1587, 1582, 1609, 780, 1589, 1581, 1610, 780, 1588, 1581, + 1610, 780, 1590, 1581, 1610, 780, 1604, 1580, 1610, 780, 1604, 1605, + 1610, 780, 1610, 1581, 1610, 780, 1610, 1580, 1610, 780, 1610, 1605, + 1610, 780, 1605, 1605, 1610, 780, 1602, 1605, 1610, 780, 1606, 1581, + 1610, 781, 1602, 1605, 1581, 781, 1604, 1581, 1605, 780, 1593, 1605, + 1610, 780, 1603, 1605, 1610, 781, 1606, 1580, 1581, 780, 1605, 1582, + 1610, 781, 1604, 1580, 1605, 780, 1603, 1605, 1605, 780, 1604, 1580, + 1605, 780, 1606, 1580, 1581, 780, 1580, 1581, 1610, 780, 1581, 1580, + 1610, 780, 1605, 1580, 1610, 780, 1601, 1605, 1610, 780, 1576, 1581, + 1610, 781, 1603, 1605, 1605, 781, 1593, 1580, 1605, 781, 1589, 1605, + 1605, 780, 1587, 1582, 1610, 780, 1606, 1580, 1610, 779, 1589, 1604, + 1746, 779, 1602, 1604, 1746, 1035, 1575, 1604, 1604, 1607, 1035, 1575, + 1603, 1576, 1585, 1035, 1605, 1581, 1605, 1583, 1035, 1589, 1604, 1593, + 1605, 1035, 1585, 1587, 1608, 1604, 1035, 1593, 1604, 1610, 1607, 1035, + 1608, 1587, 1604, 1605, 779, 1589, 1604, 1609, 4619, 1589, 1604, 1609, + 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, + 1604, 1605, 2059, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1035, + 1585, 1740, 1575, 1604, 265, 44, 265, 12289, 265, 12290, 265, 58, 265, + 59, 265, 33, 265, 63, 265, 12310, 265, 12311, 265, 8230, 265, 8229, 265, + 8212, 265, 8211, 265, 95, 265, 95, 265, 40, 265, 41, 265, 123, 265, 125, + 265, 12308, 265, 12309, 265, 12304, 265, 12305, 265, 12298, 265, 12299, + 265, 12296, 265, 12297, 265, 12300, 265, 12301, 265, 12302, 265, 12303, + 265, 91, 265, 93, 258, 8254, 258, 8254, 258, 8254, 258, 8254, 258, 95, + 258, 95, 258, 95, 271, 44, 271, 12289, 271, 46, 271, 59, 271, 58, 271, + 63, 271, 33, 271, 8212, 271, 40, 271, 41, 271, 123, 271, 125, 271, 12308, + 271, 12309, 271, 35, 271, 38, 271, 42, 271, 43, 271, 45, 271, 60, 271, + 62, 271, 61, 271, 92, 271, 36, 271, 37, 271, 64, 523, 32, 1611, 526, + 1600, 1611, 523, 32, 1612, 523, 32, 1613, 523, 32, 1614, 526, 1600, 1614, + 523, 32, 1615, 526, 1600, 1615, 523, 32, 1616, 526, 1600, 1616, 523, 32, + 1617, 526, 1600, 1617, 523, 32, 1618, 526, 1600, 1618, 267, 1569, 267, + 1570, 268, 1570, 267, 1571, 268, 1571, 267, 1572, 268, 1572, 267, 1573, + 268, 1573, 267, 1574, 268, 1574, 269, 1574, 270, 1574, 267, 1575, 268, + 1575, 267, 1576, 268, 1576, 269, 1576, 270, 1576, 267, 1577, 268, 1577, + 267, 1578, 268, 1578, 269, 1578, 270, 1578, 267, 1579, 268, 1579, 269, + 1579, 270, 1579, 267, 1580, 268, 1580, 269, 1580, 270, 1580, 267, 1581, + 268, 1581, 269, 1581, 270, 1581, 267, 1582, 268, 1582, 269, 1582, 270, + 1582, 267, 1583, 268, 1583, 267, 1584, 268, 1584, 267, 1585, 268, 1585, + 267, 1586, 268, 1586, 267, 1587, 268, 1587, 269, 1587, 270, 1587, 267, + 1588, 268, 1588, 269, 1588, 270, 1588, 267, 1589, 268, 1589, 269, 1589, + 270, 1589, 267, 1590, 268, 1590, 269, 1590, 270, 1590, 267, 1591, 268, + 1591, 269, 1591, 270, 1591, 267, 1592, 268, 1592, 269, 1592, 270, 1592, + 267, 1593, 268, 1593, 269, 1593, 270, 1593, 267, 1594, 268, 1594, 269, + 1594, 270, 1594, 267, 1601, 268, 1601, 269, 1601, 270, 1601, 267, 1602, + 268, 1602, 269, 1602, 270, 1602, 267, 1603, 268, 1603, 269, 1603, 270, + 1603, 267, 1604, 268, 1604, 269, 1604, 270, 1604, 267, 1605, 268, 1605, + 269, 1605, 270, 1605, 267, 1606, 268, 1606, 269, 1606, 270, 1606, 267, + 1607, 268, 1607, 269, 1607, 270, 1607, 267, 1608, 268, 1608, 267, 1609, + 268, 1609, 267, 1610, 268, 1610, 269, 1610, 270, 1610, 523, 1604, 1570, + 524, 1604, 1570, 523, 1604, 1571, 524, 1604, 1571, 523, 1604, 1573, 524, + 1604, 1573, 523, 1604, 1575, 524, 1604, 1575, 264, 33, 264, 34, 264, 35, + 264, 36, 264, 37, 264, 38, 264, 39, 264, 40, 264, 41, 264, 42, 264, 43, + 264, 44, 264, 45, 264, 46, 264, 47, 264, 48, 264, 49, 264, 50, 264, 51, + 264, 52, 264, 53, 264, 54, 264, 55, 264, 56, 264, 57, 264, 58, 264, 59, + 264, 60, 264, 61, 264, 62, 264, 63, 264, 64, 264, 65, 264, 66, 264, 67, + 264, 68, 264, 69, 264, 70, 264, 71, 264, 72, 264, 73, 264, 74, 264, 75, + 264, 76, 264, 77, 264, 78, 264, 79, 264, 80, 264, 81, 264, 82, 264, 83, + 264, 84, 264, 85, 264, 86, 264, 87, 264, 88, 264, 89, 264, 90, 264, 91, + 264, 92, 264, 93, 264, 94, 264, 95, 264, 96, 264, 97, 264, 98, 264, 99, + 264, 100, 264, 101, 264, 102, 264, 103, 264, 104, 264, 105, 264, 106, + 264, 107, 264, 108, 264, 109, 264, 110, 264, 111, 264, 112, 264, 113, + 264, 114, 264, 115, 264, 116, 264, 117, 264, 118, 264, 119, 264, 120, + 264, 121, 264, 122, 264, 123, 264, 124, 264, 125, 264, 126, 264, 10629, + 264, 10630, 272, 12290, 272, 12300, 272, 12301, 272, 12289, 272, 12539, + 272, 12530, 272, 12449, 272, 12451, 272, 12453, 272, 12455, 272, 12457, + 272, 12515, 272, 12517, 272, 12519, 272, 12483, 272, 12540, 272, 12450, + 272, 12452, 272, 12454, 272, 12456, 272, 12458, 272, 12459, 272, 12461, + 272, 12463, 272, 12465, 272, 12467, 272, 12469, 272, 12471, 272, 12473, + 272, 12475, 272, 12477, 272, 12479, 272, 12481, 272, 12484, 272, 12486, + 272, 12488, 272, 12490, 272, 12491, 272, 12492, 272, 12493, 272, 12494, + 272, 12495, 272, 12498, 272, 12501, 272, 12504, 272, 12507, 272, 12510, + 272, 12511, 272, 12512, 272, 12513, 272, 12514, 272, 12516, 272, 12518, + 272, 12520, 272, 12521, 272, 12522, 272, 12523, 272, 12524, 272, 12525, + 272, 12527, 272, 12531, 272, 12441, 272, 12442, 272, 12644, 272, 12593, + 272, 12594, 272, 12595, 272, 12596, 272, 12597, 272, 12598, 272, 12599, + 272, 12600, 272, 12601, 272, 12602, 272, 12603, 272, 12604, 272, 12605, + 272, 12606, 272, 12607, 272, 12608, 272, 12609, 272, 12610, 272, 12611, + 272, 12612, 272, 12613, 272, 12614, 272, 12615, 272, 12616, 272, 12617, + 272, 12618, 272, 12619, 272, 12620, 272, 12621, 272, 12622, 272, 12623, + 272, 12624, 272, 12625, 272, 12626, 272, 12627, 272, 12628, 272, 12629, + 272, 12630, 272, 12631, 272, 12632, 272, 12633, 272, 12634, 272, 12635, + 272, 12636, 272, 12637, 272, 12638, 272, 12639, 272, 12640, 272, 12641, + 272, 12642, 272, 12643, 264, 162, 264, 163, 264, 172, 264, 175, 264, 166, + 264, 165, 264, 8361, 272, 9474, 272, 8592, 272, 8593, 272, 8594, 272, + 8595, 272, 9632, 272, 9675, 512, 69785, 69818, 512, 69787, 69818, 512, + 69797, 69818, 512, 69937, 69927, 512, 69938, 69927, 512, 70471, 70462, + 512, 70471, 70487, 512, 70841, 70842, 512, 70841, 70832, 512, 70841, + 70845, 512, 71096, 71087, 512, 71097, 71087, 512, 119127, 119141, 512, + 119128, 119141, 512, 119135, 119150, 512, 119135, 119151, 512, 119135, + 119152, 512, 119135, 119153, 512, 119135, 119154, 512, 119225, 119141, + 512, 119226, 119141, 512, 119227, 119150, 512, 119228, 119150, 512, + 119227, 119151, 512, 119228, 119151, 262, 65, 262, 66, 262, 67, 262, 68, + 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, + 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, + 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, + 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, + 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, - 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, - 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, - 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, - 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, - 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, - 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, - 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, - 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, + 262, 100, 262, 101, 262, 102, 262, 103, 262, 105, 262, 106, 262, 107, + 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, + 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, + 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, + 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, + 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, + 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, + 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, + 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, + 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, + 262, 65, 262, 67, 262, 68, 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, + 262, 80, 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, + 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 102, 262, + 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, - 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, - 262, 70, 262, 71, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 79, - 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, + 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, + 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, + 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, + 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, + 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, + 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, + 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, + 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, + 262, 71, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, + 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, + 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, + 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, + 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, + 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, + 262, 69, 262, 70, 262, 71, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, + 262, 79, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, + 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, + 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, + 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, + 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, + 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, + 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, + 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, @@ -4129,15 +4136,33 @@ static const unsigned int decomp_data[] = { 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, - 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, - 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, - 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, - 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, - 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, - 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, - 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 305, 262, - 567, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, + 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, + 305, 262, 567, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, + 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, + 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, + 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, + 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, + 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, + 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, + 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, + 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, + 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, + 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, + 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, + 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, + 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, + 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, + 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, + 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, + 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, + 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, + 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, + 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, + 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, + 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, + 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, + 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, + 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, @@ -4153,177 +4178,152 @@ static const unsigned int decomp_data[] = { 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, - 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, - 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, - 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, - 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, - 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, - 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, - 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, - 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, - 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, - 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, - 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, - 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, - 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, - 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, - 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, - 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, - 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, - 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, - 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, - 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, - 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, - 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, - 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, - 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, - 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, - 1008, 262, 981, 262, 1009, 262, 982, 262, 988, 262, 989, 262, 48, 262, - 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, - 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, - 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, - 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, - 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, - 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, - 57, 262, 1575, 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, - 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1604, 262, 1605, 262, - 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, - 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, - 1592, 262, 1594, 262, 1646, 262, 1722, 262, 1697, 262, 1647, 262, 1576, - 262, 1580, 262, 1607, 262, 1581, 262, 1610, 262, 1603, 262, 1604, 262, - 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, - 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1594, 262, - 1580, 262, 1581, 262, 1610, 262, 1604, 262, 1606, 262, 1587, 262, 1593, - 262, 1589, 262, 1602, 262, 1588, 262, 1582, 262, 1590, 262, 1594, 262, - 1722, 262, 1647, 262, 1576, 262, 1580, 262, 1607, 262, 1581, 262, 1591, - 262, 1610, 262, 1603, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, - 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, 262, 1579, 262, 1582, - 262, 1590, 262, 1592, 262, 1594, 262, 1646, 262, 1697, 262, 1575, 262, - 1576, 262, 1580, 262, 1583, 262, 1607, 262, 1608, 262, 1586, 262, 1581, - 262, 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, - 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, - 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 262, - 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, 1591, - 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, - 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, - 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 514, 48, 46, 514, - 48, 44, 514, 49, 44, 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, 44, - 514, 54, 44, 514, 55, 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, 770, - 40, 66, 41, 770, 40, 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, 40, - 70, 41, 770, 40, 71, 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, 74, - 41, 770, 40, 75, 41, 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, 41, - 770, 40, 79, 41, 770, 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, 770, - 40, 83, 41, 770, 40, 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, 40, - 87, 41, 770, 40, 88, 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, 12308, - 83, 12309, 263, 67, 263, 82, 519, 67, 68, 519, 87, 90, 266, 65, 266, 66, - 266, 67, 266, 68, 266, 69, 266, 70, 266, 71, 266, 72, 266, 73, 266, 74, - 266, 75, 266, 76, 266, 77, 266, 78, 266, 79, 266, 80, 266, 81, 266, 82, - 266, 83, 266, 84, 266, 85, 266, 86, 266, 87, 266, 88, 266, 89, 266, 90, - 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80, 86, 522, - 87, 67, 515, 77, 67, 515, 77, 68, 515, 77, 82, 522, 68, 74, 522, 12411, - 12363, 522, 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, 21452, - 266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, 20132, - 266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, 20877, - 266, 26032, 266, 21021, 266, 32066, 266, 29983, 266, 36009, 266, 22768, - 266, 21561, 266, 28436, 266, 25237, 266, 25429, 266, 19968, 266, 19977, - 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, 36208, - 266, 25171, 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, 26377, - 266, 26376, 266, 30003, 266, 21106, 266, 21942, 266, 37197, 770, 12308, - 26412, 12309, 770, 12308, 19977, 12309, 770, 12308, 20108, 12309, 770, - 12308, 23433, 12309, 770, 12308, 28857, 12309, 770, 12308, 25171, 12309, - 770, 12308, 30423, 12309, 770, 12308, 21213, 12309, 770, 12308, 25943, - 12309, 263, 24471, 263, 21487, 256, 20029, 256, 20024, 256, 20033, 256, - 131362, 256, 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, 256, - 20633, 256, 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, 256, - 20820, 256, 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, 256, - 20877, 256, 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, - 20917, 256, 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, - 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, - 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, - 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, - 21375, 256, 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, 256, - 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, - 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, - 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, - 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, - 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, - 22577, 256, 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, 256, - 22810, 256, 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, 256, - 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, 256, - 23304, 256, 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, 256, - 23527, 256, 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, 256, - 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, 256, - 138724, 256, 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, 256, - 24033, 256, 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, 256, - 24169, 256, 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, 256, - 24246, 256, 24266, 256, 172946, 256, 24318, 256, 140081, 256, 140081, - 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, 156122, - 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, - 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 141012, - 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, - 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, - 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, - 256, 25424, 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, 25475, - 256, 25572, 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, 14894, - 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, 25935, - 256, 25964, 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, 15129, - 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, 26368, - 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, 26401, - 256, 26462, 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, 26501, - 256, 26706, 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, 26900, - 256, 15261, 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, 145059, - 256, 27355, 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, 15438, - 256, 27506, 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, 138507, - 256, 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, 256, 27751, - 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, - 256, 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, 256, 15667, - 256, 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, 256, 147294, - 256, 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, 256, 15766, - 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, 256, 28997, - 256, 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, 256, 29264, - 256, 149000, 256, 29312, 256, 29333, 256, 149301, 256, 149524, 256, - 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, - 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, - 29988, 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, 139679, - 256, 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, 256, - 16392, 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, 151859, - 256, 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, 30603, - 256, 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, 30924, - 256, 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, 256, - 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, - 153980, 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, 154539, - 256, 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, 17056, - 256, 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, 17153, - 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, 156231, - 256, 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, 256, 32762, - 256, 32773, 256, 156890, 256, 156963, 256, 32864, 256, 157096, 256, - 32880, 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, - 33086, 256, 23221, 256, 157607, 256, 157621, 256, 144275, 256, 144284, - 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419, - 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510, - 256, 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256, 33571, - 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256, 33740, - 256, 33756, 256, 158774, 256, 159083, 256, 158933, 256, 17707, 256, - 34033, 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, 159532, 256, - 17757, 256, 17761, 256, 159665, 256, 159954, 256, 17771, 256, 34384, 256, - 34396, 256, 34407, 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, - 34530, 256, 34681, 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, - 34785, 256, 34817, 256, 17913, 256, 34912, 256, 34915, 256, 161383, 256, - 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, 256, 161966, 256, - 162150, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, - 35925, 256, 162984, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256, - 163631, 256, 133124, 256, 36299, 256, 36284, 256, 36336, 256, 133342, - 256, 36564, 256, 36664, 256, 165330, 256, 165357, 256, 37012, 256, 37105, - 256, 37137, 256, 165678, 256, 37147, 256, 37432, 256, 37591, 256, 37592, - 256, 37500, 256, 37881, 256, 37909, 256, 166906, 256, 38283, 256, 18837, - 256, 38327, 256, 167287, 256, 18918, 256, 38595, 256, 23986, 256, 38691, - 256, 168261, 256, 168474, 256, 19054, 256, 19062, 256, 38880, 256, - 168970, 256, 19122, 256, 169110, 256, 38923, 256, 38923, 256, 38953, 256, - 169398, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, 39362, 256, - 39422, 256, 19406, 256, 170800, 256, 39698, 256, 40000, 256, 40189, 256, - 19662, 256, 19693, 256, 40295, 256, 172238, 256, 19704, 256, 172293, 256, - 172558, 256, 172689, 256, 40635, 256, 19798, 256, 40697, 256, 40702, 256, - 40709, 256, 40719, 256, 40726, 256, 40763, 256, 173568, + 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 988, 262, 989, 262, + 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, + 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, + 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, + 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, + 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, + 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, + 56, 262, 57, 262, 1575, 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, + 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1604, 262, 1605, + 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, + 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, + 262, 1592, 262, 1594, 262, 1646, 262, 1722, 262, 1697, 262, 1647, 262, + 1576, 262, 1580, 262, 1607, 262, 1581, 262, 1610, 262, 1603, 262, 1604, + 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, + 1602, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1594, + 262, 1580, 262, 1581, 262, 1610, 262, 1604, 262, 1606, 262, 1587, 262, + 1593, 262, 1589, 262, 1602, 262, 1588, 262, 1582, 262, 1590, 262, 1594, + 262, 1722, 262, 1647, 262, 1576, 262, 1580, 262, 1607, 262, 1581, 262, + 1591, 262, 1610, 262, 1603, 262, 1605, 262, 1606, 262, 1587, 262, 1593, + 262, 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, 262, 1579, 262, + 1582, 262, 1590, 262, 1592, 262, 1594, 262, 1646, 262, 1697, 262, 1575, + 262, 1576, 262, 1580, 262, 1583, 262, 1607, 262, 1608, 262, 1586, 262, + 1581, 262, 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, + 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, + 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, + 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, + 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, + 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, + 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 514, 48, 46, + 514, 48, 44, 514, 49, 44, 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, + 44, 514, 54, 44, 514, 55, 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, + 770, 40, 66, 41, 770, 40, 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, + 40, 70, 41, 770, 40, 71, 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, + 74, 41, 770, 40, 75, 41, 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, + 41, 770, 40, 79, 41, 770, 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, + 770, 40, 83, 41, 770, 40, 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, + 40, 87, 41, 770, 40, 88, 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, + 12308, 83, 12309, 263, 67, 263, 82, 519, 67, 68, 519, 87, 90, 266, 65, + 266, 66, 266, 67, 266, 68, 266, 69, 266, 70, 266, 71, 266, 72, 266, 73, + 266, 74, 266, 75, 266, 76, 266, 77, 266, 78, 266, 79, 266, 80, 266, 81, + 266, 82, 266, 83, 266, 84, 266, 85, 266, 86, 266, 87, 266, 88, 266, 89, + 266, 90, 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80, + 86, 522, 87, 67, 515, 77, 67, 515, 77, 68, 515, 77, 82, 522, 68, 74, 522, + 12411, 12363, 522, 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, + 21452, 266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, + 20132, 266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, + 20877, 266, 26032, 266, 21021, 266, 32066, 266, 29983, 266, 36009, 266, + 22768, 266, 21561, 266, 28436, 266, 25237, 266, 25429, 266, 19968, 266, + 19977, 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, + 36208, 266, 25171, 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, + 26377, 266, 26376, 266, 30003, 266, 21106, 266, 21942, 266, 37197, 770, + 12308, 26412, 12309, 770, 12308, 19977, 12309, 770, 12308, 20108, 12309, + 770, 12308, 23433, 12309, 770, 12308, 28857, 12309, 770, 12308, 25171, + 12309, 770, 12308, 30423, 12309, 770, 12308, 21213, 12309, 770, 12308, + 25943, 12309, 263, 24471, 263, 21487, 256, 20029, 256, 20024, 256, 20033, + 256, 131362, 256, 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, + 256, 20633, 256, 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, + 256, 20820, 256, 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, + 256, 20877, 256, 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, + 256, 20917, 256, 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, + 256, 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, + 256, 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, + 256, 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, + 256, 21375, 256, 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, + 256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, + 256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, + 256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, + 256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, + 256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, + 256, 22577, 256, 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, + 256, 22810, 256, 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, + 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, + 256, 23304, 256, 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, + 256, 23527, 256, 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, + 256, 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, + 256, 138724, 256, 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, + 256, 24033, 256, 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, + 256, 24169, 256, 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, + 256, 24246, 256, 24266, 256, 172946, 256, 24318, 256, 140081, 256, + 140081, 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, + 156122, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, + 24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, + 141012, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, + 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, + 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, + 25300, 256, 25424, 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, + 25475, 256, 25572, 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, + 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, + 25935, 256, 25964, 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, + 15129, 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, + 26368, 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, + 26401, 256, 26462, 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, + 26501, 256, 26706, 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, + 26900, 256, 15261, 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, + 145059, 256, 27355, 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, + 15438, 256, 27506, 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, + 138507, 256, 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, + 256, 27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, + 256, 28024, 256, 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, + 256, 15667, 256, 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, + 256, 147294, 256, 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, + 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, + 256, 28997, 256, 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, + 256, 29264, 256, 149000, 256, 29312, 256, 29333, 256, 149301, 256, + 149524, 256, 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, + 16056, 256, 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, + 16155, 256, 29988, 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, + 139679, 256, 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, + 256, 16392, 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, + 151859, 256, 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, + 30603, 256, 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, + 30924, 256, 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, + 256, 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, + 256, 153980, 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, + 154539, 256, 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, + 17056, 256, 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, + 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, + 156231, 256, 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, + 256, 32762, 256, 32773, 256, 156890, 256, 156963, 256, 32864, 256, + 157096, 256, 32880, 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, + 17419, 256, 33086, 256, 23221, 256, 157607, 256, 157621, 256, 144275, + 256, 144284, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, + 256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, + 256, 33510, 256, 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, + 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, + 256, 33740, 256, 33756, 256, 158774, 256, 159083, 256, 158933, 256, + 17707, 256, 34033, 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, + 159532, 256, 17757, 256, 17761, 256, 159665, 256, 159954, 256, 17771, + 256, 34384, 256, 34396, 256, 34407, 256, 34409, 256, 34473, 256, 34440, + 256, 34574, 256, 34530, 256, 34681, 256, 34600, 256, 34667, 256, 34694, + 256, 17879, 256, 34785, 256, 34817, 256, 17913, 256, 34912, 256, 34915, + 256, 161383, 256, 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, + 256, 161966, 256, 162150, 256, 18110, 256, 18119, 256, 35488, 256, 35565, + 256, 35722, 256, 35925, 256, 162984, 256, 36011, 256, 36033, 256, 36123, + 256, 36215, 256, 163631, 256, 133124, 256, 36299, 256, 36284, 256, 36336, + 256, 133342, 256, 36564, 256, 36664, 256, 165330, 256, 165357, 256, + 37012, 256, 37105, 256, 37137, 256, 165678, 256, 37147, 256, 37432, 256, + 37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909, 256, 166906, 256, + 38283, 256, 18837, 256, 38327, 256, 167287, 256, 18918, 256, 38595, 256, + 23986, 256, 38691, 256, 168261, 256, 168474, 256, 19054, 256, 19062, 256, + 38880, 256, 168970, 256, 19122, 256, 169110, 256, 38923, 256, 38923, 256, + 38953, 256, 169398, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, + 39362, 256, 39422, 256, 19406, 256, 170800, 256, 39698, 256, 40000, 256, + 40189, 256, 19662, 256, 19693, 256, 40295, 256, 172238, 256, 19704, 256, + 172293, 256, 172558, 256, 172689, 256, 40635, 256, 19798, 256, 40697, + 256, 40702, 256, 40709, 256, 40719, 256, 40726, 256, 40763, 256, 173568, }; /* index tables for the decomposition data */ @@ -5082,428 +5082,428 @@ static const unsigned short decomp_index2[] = { 5592, 5594, 5596, 5598, 5600, 5602, 5604, 5606, 5608, 5610, 5612, 5614, 5616, 5618, 5620, 5622, 5624, 5626, 5628, 5630, 5632, 5634, 5636, 5638, 5640, 5642, 5644, 5646, 5648, 5650, 5652, 5654, 5656, 5658, 5660, 5662, - 5664, 5666, 0, 5668, 5673, 5678, 5683, 5687, 5692, 5696, 5700, 5706, - 5711, 5715, 5719, 5723, 5728, 5733, 5737, 5741, 5744, 5748, 5753, 5758, - 5761, 5767, 5774, 5780, 5784, 5790, 5796, 5801, 5805, 5809, 5813, 5818, - 5824, 5829, 5833, 5837, 5841, 5844, 5847, 5850, 5853, 5857, 5861, 5867, - 5871, 5876, 5882, 5886, 5889, 5892, 5898, 5903, 5909, 5913, 5919, 5922, - 5926, 5930, 5934, 5938, 5942, 5947, 5951, 5954, 5958, 5962, 5966, 5971, - 5975, 5979, 5983, 5989, 5994, 5997, 6003, 6006, 6011, 6016, 6020, 6024, - 6028, 6033, 6036, 6040, 6045, 6048, 6054, 6058, 6061, 6064, 6067, 6070, - 6073, 6076, 6079, 6082, 6085, 6088, 6092, 6096, 6100, 6104, 6108, 6112, - 6116, 6120, 6124, 6128, 6132, 6136, 6140, 6144, 6148, 6152, 6155, 6158, - 6162, 6165, 6168, 6171, 6175, 6179, 6182, 6185, 6188, 6191, 6194, 6199, - 6202, 6205, 6208, 6211, 6214, 6217, 6220, 6223, 6227, 6232, 6235, 6238, - 6241, 6244, 6247, 6250, 6253, 6257, 6261, 6265, 6269, 6272, 6275, 6278, - 6281, 6284, 6287, 6290, 6293, 6296, 6299, 6303, 6307, 6310, 6314, 6318, - 6322, 6325, 6329, 6333, 6338, 6341, 6345, 6349, 6353, 6357, 6363, 6370, - 6373, 6376, 6379, 6382, 6385, 6388, 6391, 6394, 6397, 6400, 6403, 6406, - 6409, 6412, 6415, 6418, 6421, 6424, 6429, 6432, 6435, 6438, 6443, 6447, - 6450, 6453, 6456, 6459, 6462, 6465, 6468, 6471, 6474, 6477, 6481, 6484, - 6487, 6491, 6495, 6498, 6503, 6507, 6510, 6513, 6516, 6519, 6523, 6527, - 6530, 6533, 6536, 6539, 6542, 6545, 6548, 6551, 6554, 6558, 6562, 6566, - 6570, 6574, 6578, 6582, 6586, 6590, 6594, 6598, 6602, 6606, 6610, 6614, - 6618, 6622, 6626, 6630, 6634, 6638, 6642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6646, 6648, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6650, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6652, 6654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6656, 6658, 6660, 6662, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6664, 6666, 6668, 6670, 6672, 6674, 6676, 6678, - 6680, 6682, 6684, 6686, 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, - 6704, 6706, 6708, 6710, 6712, 6714, 6716, 6718, 6720, 6722, 6724, 6726, - 6728, 6730, 6732, 6734, 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, - 6752, 6754, 6756, 6758, 6760, 6762, 6764, 6766, 6768, 6770, 6772, 6774, - 6776, 6778, 6780, 6782, 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, - 6800, 6802, 6804, 6806, 6808, 6810, 6812, 6814, 6816, 6818, 6820, 6822, - 6824, 6826, 6828, 6830, 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, - 6848, 6850, 6852, 6854, 6856, 6858, 6860, 6862, 6864, 6866, 6868, 6870, - 6872, 6874, 6876, 6878, 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, - 6896, 6898, 6900, 6902, 6904, 6906, 6908, 6910, 6912, 6914, 6916, 6918, - 6920, 6922, 6924, 6926, 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, - 6944, 6946, 6948, 6950, 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, - 6968, 6970, 6972, 6974, 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, - 6992, 6994, 6996, 6998, 7000, 7002, 7004, 7006, 7008, 7010, 7012, 7014, - 7016, 7018, 7020, 7022, 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, - 7040, 7042, 7044, 7046, 7048, 7050, 7052, 7054, 7056, 7058, 7060, 7062, - 7064, 7066, 7068, 7070, 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, - 7088, 7090, 7092, 7094, 7096, 7098, 7100, 7102, 7104, 7106, 7108, 7110, - 7112, 7114, 7116, 7118, 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, - 7136, 7138, 7140, 7142, 7144, 7146, 7148, 7150, 7152, 7154, 7156, 7158, - 7160, 7162, 7164, 7166, 7168, 7170, 7172, 7174, 7176, 7178, 7180, 7182, - 7184, 7186, 7188, 7190, 7192, 7194, 7196, 7198, 7200, 7202, 0, 0, 7204, - 0, 7206, 0, 0, 7208, 7210, 7212, 7214, 7216, 7218, 7220, 7222, 7224, - 7226, 0, 7228, 0, 7230, 0, 0, 7232, 7234, 0, 0, 0, 7236, 7238, 7240, - 7242, 7244, 7246, 7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, 7264, - 7266, 7268, 7270, 7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, 7288, - 7290, 7292, 7294, 7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, 7312, - 7314, 7316, 7318, 7320, 7322, 7324, 7326, 7328, 7330, 7332, 7334, 7336, - 7338, 7340, 7342, 7344, 7346, 7348, 7350, 7352, 7354, 7356, 7358, 7360, - 7362, 7364, 7366, 7368, 7370, 0, 0, 7372, 7374, 7376, 7378, 7380, 7382, - 7384, 7386, 7388, 7390, 7392, 7394, 7396, 7398, 7400, 7402, 7404, 7406, - 7408, 7410, 7412, 7414, 7416, 7418, 7420, 7422, 7424, 7426, 7428, 7430, - 7432, 7434, 7436, 7438, 7440, 7442, 7444, 7446, 7448, 7450, 7452, 7454, - 7456, 7458, 7460, 7462, 7464, 7466, 7468, 7470, 7472, 7474, 7476, 7478, - 7480, 7482, 7484, 7486, 7488, 7490, 7492, 7494, 7496, 7498, 7500, 7502, - 7504, 7506, 7508, 7510, 7512, 7514, 7516, 7518, 7520, 7522, 7524, 7526, - 7528, 7530, 7532, 7534, 7536, 7538, 7540, 7542, 7544, 7546, 7548, 7550, - 7552, 7554, 7556, 7558, 7560, 7562, 7564, 7566, 7568, 7570, 7572, 7574, - 7576, 7578, 7580, 7582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7584, - 7587, 7590, 7593, 7597, 7601, 7604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7607, 7610, 7613, 7616, 7619, 0, 0, 0, 0, 0, 7622, 0, 7625, 7628, 7630, - 7632, 7634, 7636, 7638, 7640, 7642, 7644, 7646, 7648, 7651, 7654, 7657, - 7660, 7663, 7666, 7669, 7672, 7675, 7678, 7681, 7684, 0, 7687, 7690, - 7693, 7696, 7699, 0, 7702, 0, 7705, 7708, 0, 7711, 7714, 0, 7717, 7720, - 7723, 7726, 7729, 7732, 7735, 7738, 7741, 7744, 7747, 7749, 7751, 7753, - 7755, 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, 7777, - 7779, 7781, 7783, 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, 7801, - 7803, 7805, 7807, 7809, 7811, 7813, 7815, 7817, 7819, 7821, 7823, 7825, - 7827, 7829, 7831, 7833, 7835, 7837, 7839, 7841, 7843, 7845, 7847, 7849, - 7851, 7853, 7855, 7857, 7859, 7861, 7863, 7865, 7867, 7869, 7871, 7873, - 7875, 7877, 7879, 7881, 7883, 7885, 7887, 7889, 7891, 7893, 7895, 7897, - 7899, 7901, 7903, 7905, 7907, 7909, 7911, 7913, 7915, 7917, 7919, 7921, - 7923, 7925, 7927, 7929, 7931, 7933, 7935, 7937, 7939, 7941, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7943, 7945, 7947, 7949, 7951, 7953, 7955, 7957, 7959, - 7961, 7963, 7965, 7967, 7969, 7971, 7973, 7975, 7977, 7979, 7981, 7983, - 7985, 7987, 7989, 7992, 7995, 7998, 8001, 8004, 8007, 8010, 8013, 8016, - 8019, 8022, 8025, 8028, 8031, 8034, 8037, 8040, 8043, 8045, 8047, 8049, - 8051, 8054, 8057, 8060, 8063, 8066, 8069, 8072, 8075, 8078, 8081, 8084, - 8087, 8090, 8093, 8096, 8099, 8102, 8105, 8108, 8111, 8114, 8117, 8120, - 8123, 8126, 8129, 8132, 8135, 8138, 8141, 8144, 8147, 8150, 8153, 8156, - 8159, 8162, 8165, 8168, 8171, 8174, 8177, 8180, 8183, 8186, 8189, 8192, - 8195, 8198, 8201, 8204, 8207, 8210, 8213, 8216, 8219, 8222, 8225, 8228, - 8231, 8234, 8237, 8240, 8243, 8246, 8249, 8252, 8255, 8258, 8261, 8264, - 8267, 8270, 8273, 8276, 8279, 8282, 8285, 8288, 8291, 8294, 8297, 8300, - 8303, 8306, 8309, 8312, 8315, 8318, 8321, 8324, 8327, 8330, 8333, 8337, - 8341, 8345, 8349, 8353, 8357, 8360, 8363, 8366, 8369, 8372, 8375, 8378, - 8381, 8384, 8387, 8390, 8393, 8396, 8399, 8402, 8405, 8408, 8411, 8414, - 8417, 8420, 8423, 8426, 8429, 8432, 8435, 8438, 8441, 8444, 8447, 8450, - 8453, 8456, 8459, 8462, 8465, 8468, 8471, 8474, 8477, 8480, 8483, 8486, - 8489, 8492, 8495, 8498, 8501, 8504, 8507, 8510, 8513, 8516, 8519, 8522, - 8525, 8528, 8531, 8534, 8537, 8540, 8543, 8546, 8549, 8552, 8555, 8558, - 8561, 8564, 8567, 8570, 8573, 8576, 8579, 8582, 8585, 8588, 8591, 8594, - 8597, 8600, 8603, 8606, 8609, 8612, 8615, 8618, 8621, 8624, 8627, 8630, - 8633, 8636, 8639, 8642, 8645, 8648, 8651, 8654, 8657, 8660, 8663, 8666, - 8669, 8672, 8675, 8678, 8681, 8684, 8687, 8690, 8693, 8696, 8699, 8702, - 8705, 8708, 8711, 8714, 8717, 8720, 8723, 8726, 8729, 8732, 8735, 8738, - 8741, 8744, 8747, 8750, 8753, 8756, 8759, 8762, 8765, 8768, 8771, 8774, - 8777, 8780, 8783, 8787, 8791, 8795, 8798, 8801, 8804, 8807, 8810, 8813, - 8816, 8819, 8822, 8825, 8828, 8831, 8834, 8837, 8840, 8843, 8846, 8849, - 8852, 8855, 8858, 8861, 8864, 8867, 8870, 8873, 8876, 8879, 8882, 8885, - 8888, 8891, 8894, 8897, 8900, 8903, 8906, 8909, 8912, 8915, 8918, 8921, - 8924, 8927, 8930, 8933, 8936, 8939, 8942, 8945, 8948, 8951, 8954, 8957, - 8960, 8963, 8966, 8969, 8972, 8975, 8978, 8981, 8984, 8987, 8990, 8993, - 8996, 8999, 9002, 9005, 9008, 9011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9014, 9018, 9022, 9026, 9030, 9034, 9038, 9042, 9046, - 9050, 9054, 9058, 9062, 9066, 9070, 9074, 9078, 9082, 9086, 9090, 9094, - 9098, 9102, 9106, 9110, 9114, 9118, 9122, 9126, 9130, 9134, 9138, 9142, - 9146, 9150, 9154, 9158, 9162, 9166, 9170, 9174, 9178, 9182, 9186, 9190, - 9194, 9198, 9202, 9206, 9210, 9214, 9218, 9222, 9226, 9230, 9234, 9238, - 9242, 9246, 9250, 9254, 9258, 9262, 9266, 0, 0, 9270, 9274, 9278, 9282, - 9286, 9290, 9294, 9298, 9302, 9306, 9310, 9314, 9318, 9322, 9326, 9330, - 9334, 9338, 9342, 9346, 9350, 9354, 9358, 9362, 9366, 9370, 9374, 9378, - 9382, 9386, 9390, 9394, 9398, 9402, 9406, 9410, 9414, 9418, 9422, 9426, - 9430, 9434, 9438, 9442, 9446, 9450, 9454, 9458, 9462, 9466, 9470, 9474, - 9478, 9482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9486, 9490, - 9494, 9499, 9504, 9509, 9514, 9519, 9524, 9529, 9533, 9552, 9561, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9566, 9568, 9570, - 9572, 9574, 9576, 9578, 9580, 9582, 9584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9586, 9588, 9590, 9592, 9594, 9596, - 9598, 9600, 9602, 9604, 9606, 9608, 9610, 9612, 9614, 9616, 9618, 9620, - 9622, 9624, 9626, 0, 0, 9628, 9630, 9632, 9634, 9636, 9638, 9640, 9642, - 9644, 9646, 9648, 9650, 0, 9652, 9654, 9656, 9658, 9660, 9662, 9664, - 9666, 9668, 9670, 9672, 9674, 9676, 9678, 9680, 9682, 9684, 9686, 9688, - 0, 9690, 9692, 9694, 9696, 0, 0, 0, 0, 9698, 9701, 9704, 0, 9707, 0, - 9710, 9713, 9716, 9719, 9722, 9725, 9728, 9731, 9734, 9737, 9740, 9742, - 9744, 9746, 9748, 9750, 9752, 9754, 9756, 9758, 9760, 9762, 9764, 9766, - 9768, 9770, 9772, 9774, 9776, 9778, 9780, 9782, 9784, 9786, 9788, 9790, - 9792, 9794, 9796, 9798, 9800, 9802, 9804, 9806, 9808, 9810, 9812, 9814, - 9816, 9818, 9820, 9822, 9824, 9826, 9828, 9830, 9832, 9834, 9836, 9838, - 9840, 9842, 9844, 9846, 9848, 9850, 9852, 9854, 9856, 9858, 9860, 9862, - 9864, 9866, 9868, 9870, 9872, 9874, 9876, 9878, 9880, 9882, 9884, 9886, - 9888, 9890, 9892, 9894, 9896, 9898, 9900, 9902, 9904, 9906, 9908, 9910, - 9912, 9914, 9916, 9918, 9920, 9922, 9924, 9926, 9928, 9930, 9932, 9934, - 9936, 9938, 9940, 9942, 9944, 9946, 9948, 9950, 9952, 9954, 9956, 9958, - 9960, 9962, 9964, 9966, 9968, 9970, 9972, 9974, 9977, 9980, 9983, 9986, - 9989, 9992, 9995, 0, 0, 0, 0, 9998, 10000, 10002, 10004, 10006, 10008, - 10010, 10012, 10014, 10016, 10018, 10020, 10022, 10024, 10026, 10028, - 10030, 10032, 10034, 10036, 10038, 10040, 10042, 10044, 10046, 10048, - 10050, 10052, 10054, 10056, 10058, 10060, 10062, 10064, 10066, 10068, - 10070, 10072, 10074, 10076, 10078, 10080, 10082, 10084, 10086, 10088, - 10090, 10092, 10094, 10096, 10098, 10100, 10102, 10104, 10106, 10108, - 10110, 10112, 10114, 10116, 10118, 10120, 10122, 10124, 10126, 10128, - 10130, 10132, 10134, 10136, 10138, 10140, 10142, 10144, 10146, 10148, - 10150, 10152, 10154, 10156, 10158, 10160, 10162, 10164, 10166, 10168, - 10170, 10172, 10174, 10176, 10178, 10180, 10182, 10184, 10186, 10188, - 10190, 10192, 10194, 10196, 10198, 10200, 10202, 10204, 10206, 10208, - 10210, 10212, 10214, 10216, 10218, 10220, 10222, 10224, 10226, 10228, - 10230, 10232, 10234, 10236, 10238, 10240, 10242, 10244, 10246, 10248, - 10250, 10252, 10254, 10256, 10258, 10260, 10262, 10264, 10266, 10268, - 10270, 10272, 10274, 10276, 10278, 10280, 10282, 10284, 10286, 10288, - 10290, 10292, 10294, 10296, 10298, 10300, 10302, 10304, 10306, 10308, - 10310, 10312, 10314, 10316, 10318, 10320, 10322, 10324, 10326, 10328, - 10330, 10332, 10334, 10336, 10338, 10340, 10342, 10344, 10346, 10348, - 10350, 10352, 10354, 10356, 10358, 10360, 10362, 10364, 10366, 10368, - 10370, 10372, 10374, 10376, 0, 0, 0, 10378, 10380, 10382, 10384, 10386, - 10388, 0, 0, 10390, 10392, 10394, 10396, 10398, 10400, 0, 0, 10402, - 10404, 10406, 10408, 10410, 10412, 0, 0, 10414, 10416, 10418, 0, 0, 0, - 10420, 10422, 10424, 10426, 10428, 10430, 10432, 0, 10434, 10436, 10438, - 10440, 10442, 10444, 10446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10448, 0, 10451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10457, 10460, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10463, 10466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10469, - 10472, 0, 10475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10478, 10481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10484, 10487, 10490, 10493, 10496, 10499, 10502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10505, 10508, 10511, 10514, 10517, - 10520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10523, 10525, 10527, - 10529, 10531, 10533, 10535, 10537, 10539, 10541, 10543, 10545, 10547, - 10549, 10551, 10553, 10555, 10557, 10559, 10561, 10563, 10565, 10567, - 10569, 10571, 10573, 10575, 10577, 10579, 10581, 10583, 10585, 10587, - 10589, 10591, 10593, 10595, 10597, 10599, 10601, 10603, 10605, 10607, - 10609, 10611, 10613, 10615, 10617, 10619, 10621, 10623, 10625, 10627, - 10629, 10631, 10633, 10635, 10637, 10639, 10641, 10643, 10645, 10647, - 10649, 10651, 10653, 10655, 10657, 10659, 10661, 10663, 10665, 10667, - 10669, 10671, 10673, 10675, 10677, 10679, 10681, 10683, 10685, 10687, - 10689, 10691, 0, 10693, 10695, 10697, 10699, 10701, 10703, 10705, 10707, - 10709, 10711, 10713, 10715, 10717, 10719, 10721, 10723, 10725, 10727, - 10729, 10731, 10733, 10735, 10737, 10739, 10741, 10743, 10745, 10747, - 10749, 10751, 10753, 10755, 10757, 10759, 10761, 10763, 10765, 10767, - 10769, 10771, 10773, 10775, 10777, 10779, 10781, 10783, 10785, 10787, - 10789, 10791, 10793, 10795, 10797, 10799, 10801, 10803, 10805, 10807, - 10809, 10811, 10813, 10815, 10817, 10819, 10821, 10823, 10825, 10827, - 10829, 10831, 10833, 0, 10835, 10837, 0, 0, 10839, 0, 0, 10841, 10843, 0, - 0, 10845, 10847, 10849, 10851, 0, 10853, 10855, 10857, 10859, 10861, - 10863, 10865, 10867, 10869, 10871, 10873, 10875, 0, 10877, 0, 10879, - 10881, 10883, 10885, 10887, 10889, 10891, 0, 10893, 10895, 10897, 10899, - 10901, 10903, 10905, 10907, 10909, 10911, 10913, 10915, 10917, 10919, - 10921, 10923, 10925, 10927, 10929, 10931, 10933, 10935, 10937, 10939, - 10941, 10943, 10945, 10947, 10949, 10951, 10953, 10955, 10957, 10959, - 10961, 10963, 10965, 10967, 10969, 10971, 10973, 10975, 10977, 10979, - 10981, 10983, 10985, 10987, 10989, 10991, 10993, 10995, 10997, 10999, - 11001, 11003, 11005, 11007, 11009, 11011, 11013, 11015, 11017, 11019, - 11021, 0, 11023, 11025, 11027, 11029, 0, 0, 11031, 11033, 11035, 11037, - 11039, 11041, 11043, 11045, 0, 11047, 11049, 11051, 11053, 11055, 11057, - 11059, 0, 11061, 11063, 11065, 11067, 11069, 11071, 11073, 11075, 11077, - 11079, 11081, 11083, 11085, 11087, 11089, 11091, 11093, 11095, 11097, - 11099, 11101, 11103, 11105, 11107, 11109, 11111, 11113, 11115, 0, 11117, - 11119, 11121, 11123, 0, 11125, 11127, 11129, 11131, 11133, 0, 11135, 0, - 0, 0, 11137, 11139, 11141, 11143, 11145, 11147, 11149, 0, 11151, 11153, - 11155, 11157, 11159, 11161, 11163, 11165, 11167, 11169, 11171, 11173, - 11175, 11177, 11179, 11181, 11183, 11185, 11187, 11189, 11191, 11193, - 11195, 11197, 11199, 11201, 11203, 11205, 11207, 11209, 11211, 11213, - 11215, 11217, 11219, 11221, 11223, 11225, 11227, 11229, 11231, 11233, - 11235, 11237, 11239, 11241, 11243, 11245, 11247, 11249, 11251, 11253, - 11255, 11257, 11259, 11261, 11263, 11265, 11267, 11269, 11271, 11273, - 11275, 11277, 11279, 11281, 11283, 11285, 11287, 11289, 11291, 11293, - 11295, 11297, 11299, 11301, 11303, 11305, 11307, 11309, 11311, 11313, - 11315, 11317, 11319, 11321, 11323, 11325, 11327, 11329, 11331, 11333, - 11335, 11337, 11339, 11341, 11343, 11345, 11347, 11349, 11351, 11353, - 11355, 11357, 11359, 11361, 11363, 11365, 11367, 11369, 11371, 11373, - 11375, 11377, 11379, 11381, 11383, 11385, 11387, 11389, 11391, 11393, - 11395, 11397, 11399, 11401, 11403, 11405, 11407, 11409, 11411, 11413, - 11415, 11417, 11419, 11421, 11423, 11425, 11427, 11429, 11431, 11433, - 11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449, 11451, 11453, - 11455, 11457, 11459, 11461, 11463, 11465, 11467, 11469, 11471, 11473, - 11475, 11477, 11479, 11481, 11483, 11485, 11487, 11489, 11491, 11493, - 11495, 11497, 11499, 11501, 11503, 11505, 11507, 11509, 11511, 11513, - 11515, 11517, 11519, 11521, 11523, 11525, 11527, 11529, 11531, 11533, - 11535, 11537, 11539, 11541, 11543, 11545, 11547, 11549, 11551, 11553, - 11555, 11557, 11559, 11561, 11563, 11565, 11567, 11569, 11571, 11573, - 11575, 11577, 11579, 11581, 11583, 11585, 11587, 11589, 11591, 11593, - 11595, 11597, 11599, 11601, 11603, 11605, 11607, 11609, 11611, 11613, - 11615, 11617, 11619, 11621, 11623, 11625, 11627, 11629, 11631, 11633, - 11635, 11637, 11639, 11641, 11643, 11645, 11647, 11649, 11651, 11653, - 11655, 11657, 11659, 11661, 11663, 11665, 11667, 11669, 11671, 11673, - 11675, 11677, 11679, 11681, 11683, 11685, 11687, 11689, 11691, 11693, - 11695, 11697, 11699, 11701, 11703, 11705, 11707, 11709, 11711, 11713, - 11715, 11717, 11719, 11721, 11723, 11725, 11727, 11729, 11731, 11733, - 11735, 11737, 11739, 11741, 11743, 11745, 11747, 11749, 11751, 11753, - 11755, 11757, 11759, 11761, 11763, 11765, 11767, 11769, 11771, 11773, - 11775, 11777, 11779, 11781, 11783, 11785, 11787, 11789, 11791, 11793, - 11795, 11797, 11799, 11801, 11803, 11805, 11807, 11809, 11811, 11813, - 11815, 11817, 11819, 11821, 11823, 11825, 11827, 11829, 0, 0, 11831, - 11833, 11835, 11837, 11839, 11841, 11843, 11845, 11847, 11849, 11851, - 11853, 11855, 11857, 11859, 11861, 11863, 11865, 11867, 11869, 11871, - 11873, 11875, 11877, 11879, 11881, 11883, 11885, 11887, 11889, 11891, - 11893, 11895, 11897, 11899, 11901, 11903, 11905, 11907, 11909, 11911, - 11913, 11915, 11917, 11919, 11921, 11923, 11925, 11927, 11929, 11931, - 11933, 11935, 11937, 11939, 11941, 11943, 11945, 11947, 11949, 11951, - 11953, 11955, 11957, 11959, 11961, 11963, 11965, 11967, 11969, 11971, - 11973, 11975, 11977, 11979, 11981, 11983, 11985, 11987, 11989, 11991, - 11993, 11995, 11997, 11999, 12001, 12003, 12005, 12007, 12009, 12011, - 12013, 12015, 12017, 12019, 12021, 12023, 12025, 12027, 12029, 12031, - 12033, 12035, 12037, 12039, 12041, 12043, 12045, 12047, 12049, 12051, - 12053, 12055, 12057, 12059, 12061, 12063, 12065, 12067, 12069, 12071, - 12073, 12075, 12077, 12079, 12081, 12083, 12085, 12087, 12089, 12091, - 12093, 12095, 12097, 12099, 12101, 12103, 12105, 12107, 12109, 12111, - 12113, 12115, 12117, 12119, 12121, 12123, 12125, 12127, 12129, 12131, - 12133, 12135, 12137, 12139, 12141, 12143, 12145, 12147, 12149, 12151, - 12153, 12155, 12157, 12159, 12161, 12163, 12165, 12167, 12169, 12171, - 12173, 12175, 12177, 12179, 12181, 12183, 12185, 12187, 12189, 12191, - 12193, 12195, 12197, 12199, 12201, 12203, 12205, 12207, 12209, 12211, - 12213, 12215, 12217, 12219, 12221, 12223, 12225, 12227, 12229, 12231, - 12233, 12235, 12237, 12239, 12241, 12243, 12245, 12247, 12249, 12251, - 12253, 12255, 12257, 12259, 12261, 12263, 12265, 12267, 12269, 12271, - 12273, 12275, 12277, 12279, 12281, 12283, 12285, 12287, 12289, 12291, - 12293, 12295, 12297, 12299, 12301, 12303, 12305, 12307, 12309, 12311, - 12313, 12315, 12317, 12319, 12321, 12323, 12325, 12327, 12329, 12331, - 12333, 12335, 12337, 12339, 12341, 12343, 12345, 12347, 12349, 12351, - 12353, 12355, 12357, 12359, 12361, 12363, 12365, 12367, 12369, 12371, - 12373, 12375, 12377, 12379, 12381, 12383, 12385, 12387, 12389, 12391, - 12393, 12395, 12397, 12399, 12401, 12403, 12405, 12407, 12409, 12411, - 12413, 0, 0, 12415, 12417, 12419, 12421, 12423, 12425, 12427, 12429, - 12431, 12433, 12435, 12437, 12439, 12441, 12443, 12445, 12447, 12449, - 12451, 12453, 12455, 12457, 12459, 12461, 12463, 12465, 12467, 12469, - 12471, 12473, 12475, 12477, 12479, 12481, 12483, 12485, 12487, 12489, - 12491, 12493, 12495, 12497, 12499, 12501, 12503, 12505, 12507, 12509, - 12511, 12513, 12515, 12517, 12519, 12521, 0, 12523, 12525, 12527, 12529, - 12531, 12533, 12535, 12537, 12539, 12541, 12543, 12545, 12547, 12549, - 12551, 12553, 12555, 12557, 12559, 12561, 12563, 12565, 12567, 12569, - 12571, 12573, 12575, 0, 12577, 12579, 0, 12581, 0, 0, 12583, 0, 12585, - 12587, 12589, 12591, 12593, 12595, 12597, 12599, 12601, 12603, 0, 12605, - 12607, 12609, 12611, 0, 12613, 0, 12615, 0, 0, 0, 0, 0, 0, 12617, 0, 0, - 0, 0, 12619, 0, 12621, 0, 12623, 0, 12625, 12627, 12629, 0, 12631, 12633, - 0, 12635, 0, 0, 12637, 0, 12639, 0, 12641, 0, 12643, 0, 12645, 0, 12647, - 12649, 0, 12651, 0, 0, 12653, 12655, 12657, 12659, 0, 12661, 12663, - 12665, 12667, 12669, 12671, 12673, 0, 12675, 12677, 12679, 12681, 0, - 12683, 12685, 12687, 12689, 0, 12691, 0, 12693, 12695, 12697, 12699, - 12701, 12703, 12705, 12707, 12709, 12711, 0, 12713, 12715, 12717, 12719, - 12721, 12723, 12725, 12727, 12729, 12731, 12733, 12735, 12737, 12739, - 12741, 12743, 12745, 0, 0, 0, 0, 0, 12747, 12749, 12751, 0, 12753, 12755, - 12757, 12759, 12761, 0, 12763, 12765, 12767, 12769, 12771, 12773, 12775, - 12777, 12779, 12781, 12783, 12785, 12787, 12789, 12791, 12793, 12795, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12797, 12800, - 12803, 12806, 12809, 12812, 12815, 12818, 12821, 12824, 12827, 0, 0, 0, - 0, 0, 12830, 12834, 12838, 12842, 12846, 12850, 12854, 12858, 12862, - 12866, 12870, 12874, 12878, 12882, 12886, 12890, 12894, 12898, 12902, - 12906, 12910, 12914, 12918, 12922, 12926, 12930, 12934, 12938, 12940, - 12942, 12945, 0, 12948, 12950, 12952, 12954, 12956, 12958, 12960, 12962, - 12964, 12966, 12968, 12970, 12972, 12974, 12976, 12978, 12980, 12982, - 12984, 12986, 12988, 12990, 12992, 12994, 12996, 12998, 13000, 13003, - 13006, 13009, 13012, 13016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13019, 13022, 13025, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 13028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13031, - 13034, 13037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13039, 13041, 13043, - 13045, 13047, 13049, 13051, 13053, 13055, 13057, 13059, 13061, 13063, - 13065, 13067, 13069, 13071, 13073, 13075, 13077, 13079, 13081, 13083, - 13085, 13087, 13089, 13091, 13093, 13095, 13097, 13099, 13101, 13103, - 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, 13121, 13123, - 13125, 0, 0, 0, 0, 13127, 13131, 13135, 13139, 13143, 13147, 13151, - 13155, 13159, 0, 0, 0, 0, 0, 0, 0, 13163, 13165, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13167, 13169, 13171, 13173, - 13175, 13177, 13179, 13181, 13183, 13185, 13187, 13189, 13191, 13193, - 13195, 13197, 13199, 13201, 13203, 13205, 13207, 13209, 13211, 13213, - 13215, 13217, 13219, 13221, 13223, 13225, 13227, 13229, 13231, 13233, - 13235, 13237, 13239, 13241, 13243, 13245, 13247, 13249, 13251, 13253, - 13255, 13257, 13259, 13261, 13263, 13265, 13267, 13269, 13271, 13273, - 13275, 13277, 13279, 13281, 13283, 13285, 13287, 13289, 13291, 13293, - 13295, 13297, 13299, 13301, 13303, 13305, 13307, 13309, 13311, 13313, - 13315, 13317, 13319, 13321, 13323, 13325, 13327, 13329, 13331, 13333, - 13335, 13337, 13339, 13341, 13343, 13345, 13347, 13349, 13351, 13353, - 13355, 13357, 13359, 13361, 13363, 13365, 13367, 13369, 13371, 13373, - 13375, 13377, 13379, 13381, 13383, 13385, 13387, 13389, 13391, 13393, - 13395, 13397, 13399, 13401, 13403, 13405, 13407, 13409, 13411, 13413, - 13415, 13417, 13419, 13421, 13423, 13425, 13427, 13429, 13431, 13433, - 13435, 13437, 13439, 13441, 13443, 13445, 13447, 13449, 13451, 13453, - 13455, 13457, 13459, 13461, 13463, 13465, 13467, 13469, 13471, 13473, - 13475, 13477, 13479, 13481, 13483, 13485, 13487, 13489, 13491, 13493, - 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13511, 13513, - 13515, 13517, 13519, 13521, 13523, 13525, 13527, 13529, 13531, 13533, - 13535, 13537, 13539, 13541, 13543, 13545, 13547, 13549, 13551, 13553, - 13555, 13557, 13559, 13561, 13563, 13565, 13567, 13569, 13571, 13573, - 13575, 13577, 13579, 13581, 13583, 13585, 13587, 13589, 13591, 13593, - 13595, 13597, 13599, 13601, 13603, 13605, 13607, 13609, 13611, 13613, - 13615, 13617, 13619, 13621, 13623, 13625, 13627, 13629, 13631, 13633, - 13635, 13637, 13639, 13641, 13643, 13645, 13647, 13649, 13651, 13653, - 13655, 13657, 13659, 13661, 13663, 13665, 13667, 13669, 13671, 13673, - 13675, 13677, 13679, 13681, 13683, 13685, 13687, 13689, 13691, 13693, - 13695, 13697, 13699, 13701, 13703, 13705, 13707, 13709, 13711, 13713, - 13715, 13717, 13719, 13721, 13723, 13725, 13727, 13729, 13731, 13733, - 13735, 13737, 13739, 13741, 13743, 13745, 13747, 13749, 13751, 13753, - 13755, 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771, 13773, - 13775, 13777, 13779, 13781, 13783, 13785, 13787, 13789, 13791, 13793, - 13795, 13797, 13799, 13801, 13803, 13805, 13807, 13809, 13811, 13813, - 13815, 13817, 13819, 13821, 13823, 13825, 13827, 13829, 13831, 13833, - 13835, 13837, 13839, 13841, 13843, 13845, 13847, 13849, 13851, 13853, - 13855, 13857, 13859, 13861, 13863, 13865, 13867, 13869, 13871, 13873, - 13875, 13877, 13879, 13881, 13883, 13885, 13887, 13889, 13891, 13893, - 13895, 13897, 13899, 13901, 13903, 13905, 13907, 13909, 13911, 13913, - 13915, 13917, 13919, 13921, 13923, 13925, 13927, 13929, 13931, 13933, - 13935, 13937, 13939, 13941, 13943, 13945, 13947, 13949, 13951, 13953, - 13955, 13957, 13959, 13961, 13963, 13965, 13967, 13969, 13971, 13973, - 13975, 13977, 13979, 13981, 13983, 13985, 13987, 13989, 13991, 13993, - 13995, 13997, 13999, 14001, 14003, 14005, 14007, 14009, 14011, 14013, - 14015, 14017, 14019, 14021, 14023, 14025, 14027, 14029, 14031, 14033, - 14035, 14037, 14039, 14041, 14043, 14045, 14047, 14049, 14051, 14053, - 14055, 14057, 14059, 14061, 14063, 14065, 14067, 14069, 14071, 14073, - 14075, 14077, 14079, 14081, 14083, 14085, 14087, 14089, 14091, 14093, - 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14109, 14111, 14113, - 14115, 14117, 14119, 14121, 14123, 14125, 14127, 14129, 14131, 14133, - 14135, 14137, 14139, 14141, 14143, 14145, 14147, 14149, 14151, 14153, - 14155, 14157, 14159, 14161, 14163, 14165, 14167, 14169, 14171, 14173, - 14175, 14177, 14179, 14181, 14183, 14185, 14187, 14189, 14191, 14193, - 14195, 14197, 14199, 14201, 14203, 14205, 14207, 14209, 14211, 14213, - 14215, 14217, 14219, 14221, 14223, 14225, 14227, 14229, 14231, 14233, - 14235, 14237, 14239, 14241, 14243, 14245, 14247, 14249, 0, 0, 0, 0, 0, 0, + 5664, 5666, 5668, 5671, 5676, 5681, 5686, 5690, 5695, 5699, 5703, 5709, + 5714, 5718, 5722, 5726, 5731, 5736, 5740, 5744, 5747, 5751, 5756, 5761, + 5764, 5770, 5777, 5783, 5787, 5793, 5799, 5804, 5808, 5812, 5816, 5821, + 5827, 5832, 5836, 5840, 5844, 5847, 5850, 5853, 5856, 5860, 5864, 5870, + 5874, 5879, 5885, 5889, 5892, 5895, 5901, 5906, 5912, 5916, 5922, 5925, + 5929, 5933, 5937, 5941, 5945, 5950, 5954, 5957, 5961, 5965, 5969, 5974, + 5978, 5982, 5986, 5992, 5997, 6000, 6006, 6009, 6014, 6019, 6023, 6027, + 6031, 6036, 6039, 6043, 6048, 6051, 6057, 6061, 6064, 6067, 6070, 6073, + 6076, 6079, 6082, 6085, 6088, 6091, 6095, 6099, 6103, 6107, 6111, 6115, + 6119, 6123, 6127, 6131, 6135, 6139, 6143, 6147, 6151, 6155, 6158, 6161, + 6165, 6168, 6171, 6174, 6178, 6182, 6185, 6188, 6191, 6194, 6197, 6202, + 6205, 6208, 6211, 6214, 6217, 6220, 6223, 6226, 6230, 6235, 6238, 6241, + 6244, 6247, 6250, 6253, 6256, 6260, 6264, 6268, 6272, 6275, 6278, 6281, + 6284, 6287, 6290, 6293, 6296, 6299, 6302, 6306, 6310, 6313, 6317, 6321, + 6325, 6328, 6332, 6336, 6341, 6344, 6348, 6352, 6356, 6360, 6366, 6373, + 6376, 6379, 6382, 6385, 6388, 6391, 6394, 6397, 6400, 6403, 6406, 6409, + 6412, 6415, 6418, 6421, 6424, 6427, 6432, 6435, 6438, 6441, 6446, 6450, + 6453, 6456, 6459, 6462, 6465, 6468, 6471, 6474, 6477, 6480, 6484, 6487, + 6490, 6494, 6498, 6501, 6506, 6510, 6513, 6516, 6519, 6522, 6526, 6530, + 6533, 6536, 6539, 6542, 6545, 6548, 6551, 6554, 6557, 6561, 6565, 6569, + 6573, 6577, 6581, 6585, 6589, 6593, 6597, 6601, 6605, 6609, 6613, 6617, + 6621, 6625, 6629, 6633, 6637, 6641, 6645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6649, 6651, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6653, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6655, 6657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6659, 6661, 6663, 6665, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6667, 6669, 6671, 6673, 6675, 6677, 6679, 6681, + 6683, 6685, 6687, 6689, 6691, 6693, 6695, 6697, 6699, 6701, 6703, 6705, + 6707, 6709, 6711, 6713, 6715, 6717, 6719, 6721, 6723, 6725, 6727, 6729, + 6731, 6733, 6735, 6737, 6739, 6741, 6743, 6745, 6747, 6749, 6751, 6753, + 6755, 6757, 6759, 6761, 6763, 6765, 6767, 6769, 6771, 6773, 6775, 6777, + 6779, 6781, 6783, 6785, 6787, 6789, 6791, 6793, 6795, 6797, 6799, 6801, + 6803, 6805, 6807, 6809, 6811, 6813, 6815, 6817, 6819, 6821, 6823, 6825, + 6827, 6829, 6831, 6833, 6835, 6837, 6839, 6841, 6843, 6845, 6847, 6849, + 6851, 6853, 6855, 6857, 6859, 6861, 6863, 6865, 6867, 6869, 6871, 6873, + 6875, 6877, 6879, 6881, 6883, 6885, 6887, 6889, 6891, 6893, 6895, 6897, + 6899, 6901, 6903, 6905, 6907, 6909, 6911, 6913, 6915, 6917, 6919, 6921, + 6923, 6925, 6927, 6929, 6931, 6933, 6935, 6937, 6939, 6941, 6943, 6945, + 6947, 6949, 6951, 6953, 6955, 6957, 6959, 6961, 6963, 6965, 6967, 6969, + 6971, 6973, 6975, 6977, 6979, 6981, 6983, 6985, 6987, 6989, 6991, 6993, + 6995, 6997, 6999, 7001, 7003, 7005, 7007, 7009, 7011, 7013, 7015, 7017, + 7019, 7021, 7023, 7025, 7027, 7029, 7031, 7033, 7035, 7037, 7039, 7041, + 7043, 7045, 7047, 7049, 7051, 7053, 7055, 7057, 7059, 7061, 7063, 7065, + 7067, 7069, 7071, 7073, 7075, 7077, 7079, 7081, 7083, 7085, 7087, 7089, + 7091, 7093, 7095, 7097, 7099, 7101, 7103, 7105, 7107, 7109, 7111, 7113, + 7115, 7117, 7119, 7121, 7123, 7125, 7127, 7129, 7131, 7133, 7135, 7137, + 7139, 7141, 7143, 7145, 7147, 7149, 7151, 7153, 7155, 7157, 7159, 7161, + 7163, 7165, 7167, 7169, 7171, 7173, 7175, 7177, 7179, 7181, 7183, 7185, + 7187, 7189, 7191, 7193, 7195, 7197, 7199, 7201, 7203, 7205, 0, 0, 7207, + 0, 7209, 0, 0, 7211, 7213, 7215, 7217, 7219, 7221, 7223, 7225, 7227, + 7229, 0, 7231, 0, 7233, 0, 0, 7235, 7237, 0, 0, 0, 7239, 7241, 7243, + 7245, 7247, 7249, 7251, 7253, 7255, 7257, 7259, 7261, 7263, 7265, 7267, + 7269, 7271, 7273, 7275, 7277, 7279, 7281, 7283, 7285, 7287, 7289, 7291, + 7293, 7295, 7297, 7299, 7301, 7303, 7305, 7307, 7309, 7311, 7313, 7315, + 7317, 7319, 7321, 7323, 7325, 7327, 7329, 7331, 7333, 7335, 7337, 7339, + 7341, 7343, 7345, 7347, 7349, 7351, 7353, 7355, 7357, 7359, 7361, 7363, + 7365, 7367, 7369, 7371, 7373, 0, 0, 7375, 7377, 7379, 7381, 7383, 7385, + 7387, 7389, 7391, 7393, 7395, 7397, 7399, 7401, 7403, 7405, 7407, 7409, + 7411, 7413, 7415, 7417, 7419, 7421, 7423, 7425, 7427, 7429, 7431, 7433, + 7435, 7437, 7439, 7441, 7443, 7445, 7447, 7449, 7451, 7453, 7455, 7457, + 7459, 7461, 7463, 7465, 7467, 7469, 7471, 7473, 7475, 7477, 7479, 7481, + 7483, 7485, 7487, 7489, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, + 7507, 7509, 7511, 7513, 7515, 7517, 7519, 7521, 7523, 7525, 7527, 7529, + 7531, 7533, 7535, 7537, 7539, 7541, 7543, 7545, 7547, 7549, 7551, 7553, + 7555, 7557, 7559, 7561, 7563, 7565, 7567, 7569, 7571, 7573, 7575, 7577, + 7579, 7581, 7583, 7585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7587, + 7590, 7593, 7596, 7600, 7604, 7607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7610, 7613, 7616, 7619, 7622, 0, 0, 0, 0, 0, 7625, 0, 7628, 7631, 7633, + 7635, 7637, 7639, 7641, 7643, 7645, 7647, 7649, 7651, 7654, 7657, 7660, + 7663, 7666, 7669, 7672, 7675, 7678, 7681, 7684, 7687, 0, 7690, 7693, + 7696, 7699, 7702, 0, 7705, 0, 7708, 7711, 0, 7714, 7717, 0, 7720, 7723, + 7726, 7729, 7732, 7735, 7738, 7741, 7744, 7747, 7750, 7752, 7754, 7756, + 7758, 7760, 7762, 7764, 7766, 7768, 7770, 7772, 7774, 7776, 7778, 7780, + 7782, 7784, 7786, 7788, 7790, 7792, 7794, 7796, 7798, 7800, 7802, 7804, + 7806, 7808, 7810, 7812, 7814, 7816, 7818, 7820, 7822, 7824, 7826, 7828, + 7830, 7832, 7834, 7836, 7838, 7840, 7842, 7844, 7846, 7848, 7850, 7852, + 7854, 7856, 7858, 7860, 7862, 7864, 7866, 7868, 7870, 7872, 7874, 7876, + 7878, 7880, 7882, 7884, 7886, 7888, 7890, 7892, 7894, 7896, 7898, 7900, + 7902, 7904, 7906, 7908, 7910, 7912, 7914, 7916, 7918, 7920, 7922, 7924, + 7926, 7928, 7930, 7932, 7934, 7936, 7938, 7940, 7942, 7944, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7946, 7948, 7950, 7952, 7954, 7956, 7958, 7960, 7962, + 7964, 7966, 7968, 7970, 7972, 7974, 7976, 7978, 7980, 7982, 7984, 7986, + 7988, 7990, 7992, 7995, 7998, 8001, 8004, 8007, 8010, 8013, 8016, 8019, + 8022, 8025, 8028, 8031, 8034, 8037, 8040, 8043, 8046, 8048, 8050, 8052, + 8054, 8057, 8060, 8063, 8066, 8069, 8072, 8075, 8078, 8081, 8084, 8087, + 8090, 8093, 8096, 8099, 8102, 8105, 8108, 8111, 8114, 8117, 8120, 8123, + 8126, 8129, 8132, 8135, 8138, 8141, 8144, 8147, 8150, 8153, 8156, 8159, + 8162, 8165, 8168, 8171, 8174, 8177, 8180, 8183, 8186, 8189, 8192, 8195, + 8198, 8201, 8204, 8207, 8210, 8213, 8216, 8219, 8222, 8225, 8228, 8231, + 8234, 8237, 8240, 8243, 8246, 8249, 8252, 8255, 8258, 8261, 8264, 8267, + 8270, 8273, 8276, 8279, 8282, 8285, 8288, 8291, 8294, 8297, 8300, 8303, + 8306, 8309, 8312, 8315, 8318, 8321, 8324, 8327, 8330, 8333, 8336, 8340, + 8344, 8348, 8352, 8356, 8360, 8363, 8366, 8369, 8372, 8375, 8378, 8381, + 8384, 8387, 8390, 8393, 8396, 8399, 8402, 8405, 8408, 8411, 8414, 8417, + 8420, 8423, 8426, 8429, 8432, 8435, 8438, 8441, 8444, 8447, 8450, 8453, + 8456, 8459, 8462, 8465, 8468, 8471, 8474, 8477, 8480, 8483, 8486, 8489, + 8492, 8495, 8498, 8501, 8504, 8507, 8510, 8513, 8516, 8519, 8522, 8525, + 8528, 8531, 8534, 8537, 8540, 8543, 8546, 8549, 8552, 8555, 8558, 8561, + 8564, 8567, 8570, 8573, 8576, 8579, 8582, 8585, 8588, 8591, 8594, 8597, + 8600, 8603, 8606, 8609, 8612, 8615, 8618, 8621, 8624, 8627, 8630, 8633, + 8636, 8639, 8642, 8645, 8648, 8651, 8654, 8657, 8660, 8663, 8666, 8669, + 8672, 8675, 8678, 8681, 8684, 8687, 8690, 8693, 8696, 8699, 8702, 8705, + 8708, 8711, 8714, 8717, 8720, 8723, 8726, 8729, 8732, 8735, 8738, 8741, + 8744, 8747, 8750, 8753, 8756, 8759, 8762, 8765, 8768, 8771, 8774, 8777, + 8780, 8783, 8786, 8790, 8794, 8798, 8801, 8804, 8807, 8810, 8813, 8816, + 8819, 8822, 8825, 8828, 8831, 8834, 8837, 8840, 8843, 8846, 8849, 8852, + 8855, 8858, 8861, 8864, 8867, 8870, 8873, 8876, 8879, 8882, 8885, 8888, + 8891, 8894, 8897, 8900, 8903, 8906, 8909, 8912, 8915, 8918, 8921, 8924, + 8927, 8930, 8933, 8936, 8939, 8942, 8945, 8948, 8951, 8954, 8957, 8960, + 8963, 8966, 8969, 8972, 8975, 8978, 8981, 8984, 8987, 8990, 8993, 8996, + 8999, 9002, 9005, 9008, 9011, 9014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9017, 9021, 9025, 9029, 9033, 9037, 9041, 9045, 9049, + 9053, 9057, 9061, 9065, 9069, 9073, 9077, 9081, 9085, 9089, 9093, 9097, + 9101, 9105, 9109, 9113, 9117, 9121, 9125, 9129, 9133, 9137, 9141, 9145, + 9149, 9153, 9157, 9161, 9165, 9169, 9173, 9177, 9181, 9185, 9189, 9193, + 9197, 9201, 9205, 9209, 9213, 9217, 9221, 9225, 9229, 9233, 9237, 9241, + 9245, 9249, 9253, 9257, 9261, 9265, 9269, 0, 0, 9273, 9277, 9281, 9285, + 9289, 9293, 9297, 9301, 9305, 9309, 9313, 9317, 9321, 9325, 9329, 9333, + 9337, 9341, 9345, 9349, 9353, 9357, 9361, 9365, 9369, 9373, 9377, 9381, + 9385, 9389, 9393, 9397, 9401, 9405, 9409, 9413, 9417, 9421, 9425, 9429, + 9433, 9437, 9441, 9445, 9449, 9453, 9457, 9461, 9465, 9469, 9473, 9477, + 9481, 9485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9489, 9493, + 9497, 9502, 9507, 9512, 9517, 9522, 9527, 9532, 9536, 9555, 9564, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9569, 9571, 9573, + 9575, 9577, 9579, 9581, 9583, 9585, 9587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9589, 9591, 9593, 9595, 9597, 9599, + 9601, 9603, 9605, 9607, 9609, 9611, 9613, 9615, 9617, 9619, 9621, 9623, + 9625, 9627, 9629, 0, 0, 9631, 9633, 9635, 9637, 9639, 9641, 9643, 9645, + 9647, 9649, 9651, 9653, 0, 9655, 9657, 9659, 9661, 9663, 9665, 9667, + 9669, 9671, 9673, 9675, 9677, 9679, 9681, 9683, 9685, 9687, 9689, 9691, + 0, 9693, 9695, 9697, 9699, 0, 0, 0, 0, 9701, 9704, 9707, 0, 9710, 0, + 9713, 9716, 9719, 9722, 9725, 9728, 9731, 9734, 9737, 9740, 9743, 9745, + 9747, 9749, 9751, 9753, 9755, 9757, 9759, 9761, 9763, 9765, 9767, 9769, + 9771, 9773, 9775, 9777, 9779, 9781, 9783, 9785, 9787, 9789, 9791, 9793, + 9795, 9797, 9799, 9801, 9803, 9805, 9807, 9809, 9811, 9813, 9815, 9817, + 9819, 9821, 9823, 9825, 9827, 9829, 9831, 9833, 9835, 9837, 9839, 9841, + 9843, 9845, 9847, 9849, 9851, 9853, 9855, 9857, 9859, 9861, 9863, 9865, + 9867, 9869, 9871, 9873, 9875, 9877, 9879, 9881, 9883, 9885, 9887, 9889, + 9891, 9893, 9895, 9897, 9899, 9901, 9903, 9905, 9907, 9909, 9911, 9913, + 9915, 9917, 9919, 9921, 9923, 9925, 9927, 9929, 9931, 9933, 9935, 9937, + 9939, 9941, 9943, 9945, 9947, 9949, 9951, 9953, 9955, 9957, 9959, 9961, + 9963, 9965, 9967, 9969, 9971, 9973, 9975, 9977, 9980, 9983, 9986, 9989, + 9992, 9995, 9998, 0, 0, 0, 0, 10001, 10003, 10005, 10007, 10009, 10011, + 10013, 10015, 10017, 10019, 10021, 10023, 10025, 10027, 10029, 10031, + 10033, 10035, 10037, 10039, 10041, 10043, 10045, 10047, 10049, 10051, + 10053, 10055, 10057, 10059, 10061, 10063, 10065, 10067, 10069, 10071, + 10073, 10075, 10077, 10079, 10081, 10083, 10085, 10087, 10089, 10091, + 10093, 10095, 10097, 10099, 10101, 10103, 10105, 10107, 10109, 10111, + 10113, 10115, 10117, 10119, 10121, 10123, 10125, 10127, 10129, 10131, + 10133, 10135, 10137, 10139, 10141, 10143, 10145, 10147, 10149, 10151, + 10153, 10155, 10157, 10159, 10161, 10163, 10165, 10167, 10169, 10171, + 10173, 10175, 10177, 10179, 10181, 10183, 10185, 10187, 10189, 10191, + 10193, 10195, 10197, 10199, 10201, 10203, 10205, 10207, 10209, 10211, + 10213, 10215, 10217, 10219, 10221, 10223, 10225, 10227, 10229, 10231, + 10233, 10235, 10237, 10239, 10241, 10243, 10245, 10247, 10249, 10251, + 10253, 10255, 10257, 10259, 10261, 10263, 10265, 10267, 10269, 10271, + 10273, 10275, 10277, 10279, 10281, 10283, 10285, 10287, 10289, 10291, + 10293, 10295, 10297, 10299, 10301, 10303, 10305, 10307, 10309, 10311, + 10313, 10315, 10317, 10319, 10321, 10323, 10325, 10327, 10329, 10331, + 10333, 10335, 10337, 10339, 10341, 10343, 10345, 10347, 10349, 10351, + 10353, 10355, 10357, 10359, 10361, 10363, 10365, 10367, 10369, 10371, + 10373, 10375, 10377, 10379, 0, 0, 0, 10381, 10383, 10385, 10387, 10389, + 10391, 0, 0, 10393, 10395, 10397, 10399, 10401, 10403, 0, 0, 10405, + 10407, 10409, 10411, 10413, 10415, 0, 0, 10417, 10419, 10421, 0, 0, 0, + 10423, 10425, 10427, 10429, 10431, 10433, 10435, 0, 10437, 10439, 10441, + 10443, 10445, 10447, 10449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10451, 0, 10454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10460, 10463, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10466, 10469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10472, + 10475, 0, 10478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10481, 10484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10487, 10490, 10493, 10496, 10499, 10502, 10505, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10508, 10511, 10514, 10517, 10520, + 10523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10526, 10528, 10530, + 10532, 10534, 10536, 10538, 10540, 10542, 10544, 10546, 10548, 10550, + 10552, 10554, 10556, 10558, 10560, 10562, 10564, 10566, 10568, 10570, + 10572, 10574, 10576, 10578, 10580, 10582, 10584, 10586, 10588, 10590, + 10592, 10594, 10596, 10598, 10600, 10602, 10604, 10606, 10608, 10610, + 10612, 10614, 10616, 10618, 10620, 10622, 10624, 10626, 10628, 10630, + 10632, 10634, 10636, 10638, 10640, 10642, 10644, 10646, 10648, 10650, + 10652, 10654, 10656, 10658, 10660, 10662, 10664, 10666, 10668, 10670, + 10672, 10674, 10676, 10678, 10680, 10682, 10684, 10686, 10688, 10690, + 10692, 10694, 0, 10696, 10698, 10700, 10702, 10704, 10706, 10708, 10710, + 10712, 10714, 10716, 10718, 10720, 10722, 10724, 10726, 10728, 10730, + 10732, 10734, 10736, 10738, 10740, 10742, 10744, 10746, 10748, 10750, + 10752, 10754, 10756, 10758, 10760, 10762, 10764, 10766, 10768, 10770, + 10772, 10774, 10776, 10778, 10780, 10782, 10784, 10786, 10788, 10790, + 10792, 10794, 10796, 10798, 10800, 10802, 10804, 10806, 10808, 10810, + 10812, 10814, 10816, 10818, 10820, 10822, 10824, 10826, 10828, 10830, + 10832, 10834, 10836, 0, 10838, 10840, 0, 0, 10842, 0, 0, 10844, 10846, 0, + 0, 10848, 10850, 10852, 10854, 0, 10856, 10858, 10860, 10862, 10864, + 10866, 10868, 10870, 10872, 10874, 10876, 10878, 0, 10880, 0, 10882, + 10884, 10886, 10888, 10890, 10892, 10894, 0, 10896, 10898, 10900, 10902, + 10904, 10906, 10908, 10910, 10912, 10914, 10916, 10918, 10920, 10922, + 10924, 10926, 10928, 10930, 10932, 10934, 10936, 10938, 10940, 10942, + 10944, 10946, 10948, 10950, 10952, 10954, 10956, 10958, 10960, 10962, + 10964, 10966, 10968, 10970, 10972, 10974, 10976, 10978, 10980, 10982, + 10984, 10986, 10988, 10990, 10992, 10994, 10996, 10998, 11000, 11002, + 11004, 11006, 11008, 11010, 11012, 11014, 11016, 11018, 11020, 11022, + 11024, 0, 11026, 11028, 11030, 11032, 0, 0, 11034, 11036, 11038, 11040, + 11042, 11044, 11046, 11048, 0, 11050, 11052, 11054, 11056, 11058, 11060, + 11062, 0, 11064, 11066, 11068, 11070, 11072, 11074, 11076, 11078, 11080, + 11082, 11084, 11086, 11088, 11090, 11092, 11094, 11096, 11098, 11100, + 11102, 11104, 11106, 11108, 11110, 11112, 11114, 11116, 11118, 0, 11120, + 11122, 11124, 11126, 0, 11128, 11130, 11132, 11134, 11136, 0, 11138, 0, + 0, 0, 11140, 11142, 11144, 11146, 11148, 11150, 11152, 0, 11154, 11156, + 11158, 11160, 11162, 11164, 11166, 11168, 11170, 11172, 11174, 11176, + 11178, 11180, 11182, 11184, 11186, 11188, 11190, 11192, 11194, 11196, + 11198, 11200, 11202, 11204, 11206, 11208, 11210, 11212, 11214, 11216, + 11218, 11220, 11222, 11224, 11226, 11228, 11230, 11232, 11234, 11236, + 11238, 11240, 11242, 11244, 11246, 11248, 11250, 11252, 11254, 11256, + 11258, 11260, 11262, 11264, 11266, 11268, 11270, 11272, 11274, 11276, + 11278, 11280, 11282, 11284, 11286, 11288, 11290, 11292, 11294, 11296, + 11298, 11300, 11302, 11304, 11306, 11308, 11310, 11312, 11314, 11316, + 11318, 11320, 11322, 11324, 11326, 11328, 11330, 11332, 11334, 11336, + 11338, 11340, 11342, 11344, 11346, 11348, 11350, 11352, 11354, 11356, + 11358, 11360, 11362, 11364, 11366, 11368, 11370, 11372, 11374, 11376, + 11378, 11380, 11382, 11384, 11386, 11388, 11390, 11392, 11394, 11396, + 11398, 11400, 11402, 11404, 11406, 11408, 11410, 11412, 11414, 11416, + 11418, 11420, 11422, 11424, 11426, 11428, 11430, 11432, 11434, 11436, + 11438, 11440, 11442, 11444, 11446, 11448, 11450, 11452, 11454, 11456, + 11458, 11460, 11462, 11464, 11466, 11468, 11470, 11472, 11474, 11476, + 11478, 11480, 11482, 11484, 11486, 11488, 11490, 11492, 11494, 11496, + 11498, 11500, 11502, 11504, 11506, 11508, 11510, 11512, 11514, 11516, + 11518, 11520, 11522, 11524, 11526, 11528, 11530, 11532, 11534, 11536, + 11538, 11540, 11542, 11544, 11546, 11548, 11550, 11552, 11554, 11556, + 11558, 11560, 11562, 11564, 11566, 11568, 11570, 11572, 11574, 11576, + 11578, 11580, 11582, 11584, 11586, 11588, 11590, 11592, 11594, 11596, + 11598, 11600, 11602, 11604, 11606, 11608, 11610, 11612, 11614, 11616, + 11618, 11620, 11622, 11624, 11626, 11628, 11630, 11632, 11634, 11636, + 11638, 11640, 11642, 11644, 11646, 11648, 11650, 11652, 11654, 11656, + 11658, 11660, 11662, 11664, 11666, 11668, 11670, 11672, 11674, 11676, + 11678, 11680, 11682, 11684, 11686, 11688, 11690, 11692, 11694, 11696, + 11698, 11700, 11702, 11704, 11706, 11708, 11710, 11712, 11714, 11716, + 11718, 11720, 11722, 11724, 11726, 11728, 11730, 11732, 11734, 11736, + 11738, 11740, 11742, 11744, 11746, 11748, 11750, 11752, 11754, 11756, + 11758, 11760, 11762, 11764, 11766, 11768, 11770, 11772, 11774, 11776, + 11778, 11780, 11782, 11784, 11786, 11788, 11790, 11792, 11794, 11796, + 11798, 11800, 11802, 11804, 11806, 11808, 11810, 11812, 11814, 11816, + 11818, 11820, 11822, 11824, 11826, 11828, 11830, 11832, 0, 0, 11834, + 11836, 11838, 11840, 11842, 11844, 11846, 11848, 11850, 11852, 11854, + 11856, 11858, 11860, 11862, 11864, 11866, 11868, 11870, 11872, 11874, + 11876, 11878, 11880, 11882, 11884, 11886, 11888, 11890, 11892, 11894, + 11896, 11898, 11900, 11902, 11904, 11906, 11908, 11910, 11912, 11914, + 11916, 11918, 11920, 11922, 11924, 11926, 11928, 11930, 11932, 11934, + 11936, 11938, 11940, 11942, 11944, 11946, 11948, 11950, 11952, 11954, + 11956, 11958, 11960, 11962, 11964, 11966, 11968, 11970, 11972, 11974, + 11976, 11978, 11980, 11982, 11984, 11986, 11988, 11990, 11992, 11994, + 11996, 11998, 12000, 12002, 12004, 12006, 12008, 12010, 12012, 12014, + 12016, 12018, 12020, 12022, 12024, 12026, 12028, 12030, 12032, 12034, + 12036, 12038, 12040, 12042, 12044, 12046, 12048, 12050, 12052, 12054, + 12056, 12058, 12060, 12062, 12064, 12066, 12068, 12070, 12072, 12074, + 12076, 12078, 12080, 12082, 12084, 12086, 12088, 12090, 12092, 12094, + 12096, 12098, 12100, 12102, 12104, 12106, 12108, 12110, 12112, 12114, + 12116, 12118, 12120, 12122, 12124, 12126, 12128, 12130, 12132, 12134, + 12136, 12138, 12140, 12142, 12144, 12146, 12148, 12150, 12152, 12154, + 12156, 12158, 12160, 12162, 12164, 12166, 12168, 12170, 12172, 12174, + 12176, 12178, 12180, 12182, 12184, 12186, 12188, 12190, 12192, 12194, + 12196, 12198, 12200, 12202, 12204, 12206, 12208, 12210, 12212, 12214, + 12216, 12218, 12220, 12222, 12224, 12226, 12228, 12230, 12232, 12234, + 12236, 12238, 12240, 12242, 12244, 12246, 12248, 12250, 12252, 12254, + 12256, 12258, 12260, 12262, 12264, 12266, 12268, 12270, 12272, 12274, + 12276, 12278, 12280, 12282, 12284, 12286, 12288, 12290, 12292, 12294, + 12296, 12298, 12300, 12302, 12304, 12306, 12308, 12310, 12312, 12314, + 12316, 12318, 12320, 12322, 12324, 12326, 12328, 12330, 12332, 12334, + 12336, 12338, 12340, 12342, 12344, 12346, 12348, 12350, 12352, 12354, + 12356, 12358, 12360, 12362, 12364, 12366, 12368, 12370, 12372, 12374, + 12376, 12378, 12380, 12382, 12384, 12386, 12388, 12390, 12392, 12394, + 12396, 12398, 12400, 12402, 12404, 12406, 12408, 12410, 12412, 12414, + 12416, 0, 0, 12418, 12420, 12422, 12424, 12426, 12428, 12430, 12432, + 12434, 12436, 12438, 12440, 12442, 12444, 12446, 12448, 12450, 12452, + 12454, 12456, 12458, 12460, 12462, 12464, 12466, 12468, 12470, 12472, + 12474, 12476, 12478, 12480, 12482, 12484, 12486, 12488, 12490, 12492, + 12494, 12496, 12498, 12500, 12502, 12504, 12506, 12508, 12510, 12512, + 12514, 12516, 12518, 12520, 12522, 12524, 0, 12526, 12528, 12530, 12532, + 12534, 12536, 12538, 12540, 12542, 12544, 12546, 12548, 12550, 12552, + 12554, 12556, 12558, 12560, 12562, 12564, 12566, 12568, 12570, 12572, + 12574, 12576, 12578, 0, 12580, 12582, 0, 12584, 0, 0, 12586, 0, 12588, + 12590, 12592, 12594, 12596, 12598, 12600, 12602, 12604, 12606, 0, 12608, + 12610, 12612, 12614, 0, 12616, 0, 12618, 0, 0, 0, 0, 0, 0, 12620, 0, 0, + 0, 0, 12622, 0, 12624, 0, 12626, 0, 12628, 12630, 12632, 0, 12634, 12636, + 0, 12638, 0, 0, 12640, 0, 12642, 0, 12644, 0, 12646, 0, 12648, 0, 12650, + 12652, 0, 12654, 0, 0, 12656, 12658, 12660, 12662, 0, 12664, 12666, + 12668, 12670, 12672, 12674, 12676, 0, 12678, 12680, 12682, 12684, 0, + 12686, 12688, 12690, 12692, 0, 12694, 0, 12696, 12698, 12700, 12702, + 12704, 12706, 12708, 12710, 12712, 12714, 0, 12716, 12718, 12720, 12722, + 12724, 12726, 12728, 12730, 12732, 12734, 12736, 12738, 12740, 12742, + 12744, 12746, 12748, 0, 0, 0, 0, 0, 12750, 12752, 12754, 0, 12756, 12758, + 12760, 12762, 12764, 0, 12766, 12768, 12770, 12772, 12774, 12776, 12778, + 12780, 12782, 12784, 12786, 12788, 12790, 12792, 12794, 12796, 12798, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12800, 12803, + 12806, 12809, 12812, 12815, 12818, 12821, 12824, 12827, 12830, 0, 0, 0, + 0, 0, 12833, 12837, 12841, 12845, 12849, 12853, 12857, 12861, 12865, + 12869, 12873, 12877, 12881, 12885, 12889, 12893, 12897, 12901, 12905, + 12909, 12913, 12917, 12921, 12925, 12929, 12933, 12937, 12941, 12943, + 12945, 12948, 0, 12951, 12953, 12955, 12957, 12959, 12961, 12963, 12965, + 12967, 12969, 12971, 12973, 12975, 12977, 12979, 12981, 12983, 12985, + 12987, 12989, 12991, 12993, 12995, 12997, 12999, 13001, 13003, 13006, + 13009, 13012, 13015, 13019, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13022, 13025, 13028, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13031, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13034, + 13037, 13040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13042, 13044, 13046, + 13048, 13050, 13052, 13054, 13056, 13058, 13060, 13062, 13064, 13066, + 13068, 13070, 13072, 13074, 13076, 13078, 13080, 13082, 13084, 13086, + 13088, 13090, 13092, 13094, 13096, 13098, 13100, 13102, 13104, 13106, + 13108, 13110, 13112, 13114, 13116, 13118, 13120, 13122, 13124, 13126, + 13128, 0, 0, 0, 0, 13130, 13134, 13138, 13142, 13146, 13150, 13154, + 13158, 13162, 0, 0, 0, 0, 0, 0, 0, 13166, 13168, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13170, 13172, 13174, 13176, + 13178, 13180, 13182, 13184, 13186, 13188, 13190, 13192, 13194, 13196, + 13198, 13200, 13202, 13204, 13206, 13208, 13210, 13212, 13214, 13216, + 13218, 13220, 13222, 13224, 13226, 13228, 13230, 13232, 13234, 13236, + 13238, 13240, 13242, 13244, 13246, 13248, 13250, 13252, 13254, 13256, + 13258, 13260, 13262, 13264, 13266, 13268, 13270, 13272, 13274, 13276, + 13278, 13280, 13282, 13284, 13286, 13288, 13290, 13292, 13294, 13296, + 13298, 13300, 13302, 13304, 13306, 13308, 13310, 13312, 13314, 13316, + 13318, 13320, 13322, 13324, 13326, 13328, 13330, 13332, 13334, 13336, + 13338, 13340, 13342, 13344, 13346, 13348, 13350, 13352, 13354, 13356, + 13358, 13360, 13362, 13364, 13366, 13368, 13370, 13372, 13374, 13376, + 13378, 13380, 13382, 13384, 13386, 13388, 13390, 13392, 13394, 13396, + 13398, 13400, 13402, 13404, 13406, 13408, 13410, 13412, 13414, 13416, + 13418, 13420, 13422, 13424, 13426, 13428, 13430, 13432, 13434, 13436, + 13438, 13440, 13442, 13444, 13446, 13448, 13450, 13452, 13454, 13456, + 13458, 13460, 13462, 13464, 13466, 13468, 13470, 13472, 13474, 13476, + 13478, 13480, 13482, 13484, 13486, 13488, 13490, 13492, 13494, 13496, + 13498, 13500, 13502, 13504, 13506, 13508, 13510, 13512, 13514, 13516, + 13518, 13520, 13522, 13524, 13526, 13528, 13530, 13532, 13534, 13536, + 13538, 13540, 13542, 13544, 13546, 13548, 13550, 13552, 13554, 13556, + 13558, 13560, 13562, 13564, 13566, 13568, 13570, 13572, 13574, 13576, + 13578, 13580, 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, + 13598, 13600, 13602, 13604, 13606, 13608, 13610, 13612, 13614, 13616, + 13618, 13620, 13622, 13624, 13626, 13628, 13630, 13632, 13634, 13636, + 13638, 13640, 13642, 13644, 13646, 13648, 13650, 13652, 13654, 13656, + 13658, 13660, 13662, 13664, 13666, 13668, 13670, 13672, 13674, 13676, + 13678, 13680, 13682, 13684, 13686, 13688, 13690, 13692, 13694, 13696, + 13698, 13700, 13702, 13704, 13706, 13708, 13710, 13712, 13714, 13716, + 13718, 13720, 13722, 13724, 13726, 13728, 13730, 13732, 13734, 13736, + 13738, 13740, 13742, 13744, 13746, 13748, 13750, 13752, 13754, 13756, + 13758, 13760, 13762, 13764, 13766, 13768, 13770, 13772, 13774, 13776, + 13778, 13780, 13782, 13784, 13786, 13788, 13790, 13792, 13794, 13796, + 13798, 13800, 13802, 13804, 13806, 13808, 13810, 13812, 13814, 13816, + 13818, 13820, 13822, 13824, 13826, 13828, 13830, 13832, 13834, 13836, + 13838, 13840, 13842, 13844, 13846, 13848, 13850, 13852, 13854, 13856, + 13858, 13860, 13862, 13864, 13866, 13868, 13870, 13872, 13874, 13876, + 13878, 13880, 13882, 13884, 13886, 13888, 13890, 13892, 13894, 13896, + 13898, 13900, 13902, 13904, 13906, 13908, 13910, 13912, 13914, 13916, + 13918, 13920, 13922, 13924, 13926, 13928, 13930, 13932, 13934, 13936, + 13938, 13940, 13942, 13944, 13946, 13948, 13950, 13952, 13954, 13956, + 13958, 13960, 13962, 13964, 13966, 13968, 13970, 13972, 13974, 13976, + 13978, 13980, 13982, 13984, 13986, 13988, 13990, 13992, 13994, 13996, + 13998, 14000, 14002, 14004, 14006, 14008, 14010, 14012, 14014, 14016, + 14018, 14020, 14022, 14024, 14026, 14028, 14030, 14032, 14034, 14036, + 14038, 14040, 14042, 14044, 14046, 14048, 14050, 14052, 14054, 14056, + 14058, 14060, 14062, 14064, 14066, 14068, 14070, 14072, 14074, 14076, + 14078, 14080, 14082, 14084, 14086, 14088, 14090, 14092, 14094, 14096, + 14098, 14100, 14102, 14104, 14106, 14108, 14110, 14112, 14114, 14116, + 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134, 14136, + 14138, 14140, 14142, 14144, 14146, 14148, 14150, 14152, 14154, 14156, + 14158, 14160, 14162, 14164, 14166, 14168, 14170, 14172, 14174, 14176, + 14178, 14180, 14182, 14184, 14186, 14188, 14190, 14192, 14194, 14196, + 14198, 14200, 14202, 14204, 14206, 14208, 14210, 14212, 14214, 14216, + 14218, 14220, 14222, 14224, 14226, 14228, 14230, 14232, 14234, 14236, + 14238, 14240, 14242, 14244, 14246, 14248, 14250, 14252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6804,7 +6804,7 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h index 372616966aa4..60521106b189 100644 --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -1563,209 +1563,209 @@ static const unsigned char lexicon[] = { 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, 196, 82, 69, 76, 69, 65, 83, 69, 128, 82, 69, 76, 65, 88, 69, 68, 128, 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 76, 65, 84, 73, 79, 78, 128, 82, 69, 76, 65, 65, 128, 82, - 69, 74, 65, 78, 199, 82, 69, 73, 196, 82, 69, 73, 128, 82, 69, 71, 85, - 76, 85, 83, 45, 52, 128, 82, 69, 71, 85, 76, 85, 83, 45, 51, 128, 82, 69, - 71, 85, 76, 85, 83, 45, 50, 128, 82, 69, 71, 85, 76, 85, 83, 128, 82, 69, - 71, 85, 76, 85, 211, 82, 69, 71, 73, 83, 84, 69, 82, 69, 196, 82, 69, 71, - 73, 79, 78, 65, 204, 82, 69, 71, 73, 65, 45, 50, 128, 82, 69, 71, 73, 65, - 128, 82, 69, 70, 79, 82, 77, 69, 196, 82, 69, 70, 69, 82, 69, 78, 67, - 197, 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 82, 69, 67, - 89, 67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, 69, 196, 82, 69, 67, 84, - 73, 76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, 210, - 82, 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, 67, 84, 65, 78, 71, 76, - 197, 82, 69, 67, 82, 69, 65, 84, 73, 79, 78, 65, 204, 82, 69, 67, 79, 82, - 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, 128, 82, 69, 67, 79, 82, - 68, 128, 82, 69, 67, 79, 82, 196, 82, 69, 67, 73, 84, 65, 84, 73, 86, - 197, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, 67, 69, 73, 86, 69, 82, - 128, 82, 69, 67, 69, 73, 86, 69, 210, 82, 69, 67, 69, 73, 80, 84, 128, - 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, 82, 69, 65, 76, 71, 65, 82, 128, - 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, 65, 67, 72, 128, 82, 69, 45, 52, - 128, 82, 69, 45, 51, 128, 82, 69, 45, 50, 128, 82, 69, 45, 49, 128, 82, - 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, 65, 90, 79, 82, 128, - 82, 65, 89, 83, 128, 82, 65, 89, 211, 82, 65, 89, 65, 78, 78, 65, 128, - 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, 128, 82, 65, 84, 72, 193, - 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, 83, 87, 65, 68, 73, 128, - 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, 128, 82, 65, 81, 128, 82, - 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, 82, 65, 78, 65, 128, - 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, 65, 84, 128, 82, 65, - 75, 72, 65, 78, 71, 128, 82, 65, 75, 65, 65, 82, 65, 65, 78, 83, 65, 89, - 65, 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, 83, 69, 68, 128, 82, - 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, 82, 65, 73, 76, 87, - 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, 76, 128, 82, 65, - 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, 65, 84, 85, 76, 76, - 65, 200, 82, 65, 72, 128, 82, 65, 70, 69, 128, 82, 65, 69, 77, 128, 82, - 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, 73, 79, 128, 82, 65, - 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, 82, 65, 67, - 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, 65, 67, 73, 78, 199, - 82, 65, 67, 67, 79, 79, 78, 128, 82, 65, 66, 66, 73, 84, 128, 82, 65, 66, - 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, 128, 82, 65, 51, 128, 82, - 65, 50, 128, 82, 65, 45, 75, 65, 82, 65, 128, 82, 65, 45, 52, 128, 82, - 65, 45, 51, 128, 82, 65, 45, 50, 128, 82, 65, 45, 49, 128, 82, 48, 50, - 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, 82, 48, 50, 54, 128, - 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, 50, 51, 128, 82, 48, - 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, 128, 82, 48, 49, 57, - 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, 48, 49, 54, 65, 128, - 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, 49, 52, 128, 82, 48, - 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, 128, 82, 48, 49, 48, - 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, 82, 48, 48, 56, 128, - 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, 48, 53, 128, 82, 48, - 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, 51, 65, 128, 82, 48, - 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, 50, 128, 82, 48, 48, - 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, 81, 89, 85, 128, 81, - 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, 81, 89, 80, 128, 81, - 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, 81, 89, 69, 128, 81, - 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, 87, 73, 128, 81, 87, - 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, 81, 87, 65, 128, 81, - 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, 81, 85, 85, 128, 81, - 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, 128, 81, 85, 82, 88, - 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, 88, 128, 81, 85, 79, - 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, 85, 79, 84, 128, 81, - 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, 81, 85, 73, 78, 84, - 73, 76, 69, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, 78, 67, 69, 128, 81, - 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, 78, 67, 85, 78, - 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, 76, 212, 81, - 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, 81, 85, 70, - 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, 69, 83, 84, 73, 79, - 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, 69, 78, 128, 81, - 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, 128, 81, 85, - 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, 83, 128, 81, - 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, 128, 81, 85, 65, - 78, 84, 73, 84, 217, 81, 85, 65, 68, 82, 85, 80, 76, 197, 81, 85, 65, 68, - 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 65, 78, 212, 81, 85, 65, 68, 67, - 79, 76, 79, 78, 128, 81, 85, 65, 68, 128, 81, 85, 65, 196, 81, 85, 65, - 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, 81, 79, 80, - 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, 128, 81, 79, - 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, 128, 81, 78, - 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, 128, 81, 73, - 80, 128, 81, 73, 73, 128, 81, 73, 70, 128, 81, 73, 69, 88, 128, 81, 73, - 69, 84, 128, 81, 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, 128, 81, 72, - 87, 73, 128, 81, 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, 81, 72, 87, - 65, 65, 128, 81, 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, 79, 80, 72, - 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, 69, 69, 128, 81, 72, 69, - 128, 81, 72, 65, 85, 128, 81, 72, 65, 65, 128, 81, 72, 65, 128, 81, 71, - 65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, 69, 128, 81, - 65, 89, 128, 81, 65, 85, 128, 81, 65, 84, 65, 78, 128, 81, 65, 82, 78, - 69, 217, 81, 65, 82, 128, 81, 65, 81, 128, 81, 65, 80, 72, 128, 81, 65, - 77, 65, 84, 83, 128, 81, 65, 77, 65, 84, 211, 81, 65, 76, 193, 81, 65, - 73, 82, 84, 72, 82, 65, 128, 81, 65, 73, 128, 81, 65, 70, 128, 81, 65, - 198, 81, 65, 68, 77, 65, 128, 81, 65, 65, 73, 128, 81, 65, 65, 70, 85, - 128, 81, 65, 65, 70, 128, 81, 48, 48, 55, 128, 81, 48, 48, 54, 128, 81, - 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, 48, 51, 128, 81, 48, 48, - 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 80, 89, 88, 128, 80, 89, 84, - 128, 80, 89, 82, 88, 128, 80, 89, 82, 128, 80, 89, 80, 128, 80, 87, 79, - 89, 128, 80, 87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, 80, 87, 73, - 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, 128, 80, 87, - 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, 90, 90, 76, 197, 80, 85, - 88, 128, 80, 85, 85, 84, 128, 80, 85, 85, 128, 80, 85, 84, 82, 69, 70, - 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, 85, 212, 80, 85, 83, - 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, 128, 80, 85, 83, 72, - 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, 69, 128, 80, 85, 82, - 80, 76, 197, 80, 85, 82, 78, 65, 77, 65, 128, 80, 85, 82, 73, 84, 89, - 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, 82, 128, 80, 85, 81, 128, 80, - 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, - 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, 78, 71, 128, 80, 85, 78, 67, 84, - 85, 211, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, 128, 80, 85, 78, 67, - 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, 128, 80, 85, 77, 128, 80, - 85, 70, 70, 69, 68, 128, 80, 85, 69, 128, 80, 85, 67, 75, 128, 80, 85, - 66, 76, 73, 195, 80, 85, 194, 80, 85, 65, 81, 128, 80, 85, 65, 69, 128, - 80, 85, 65, 67, 72, 85, 197, 80, 85, 50, 128, 80, 85, 49, 128, 80, 85, - 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, 201, 80, - 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, 83, 73, - 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 80, - 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, 76, 89, - 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 65, 76, 84, 69, 210, - 80, 83, 128, 80, 82, 79, 86, 69, 128, 80, 82, 79, 84, 79, 86, 65, 82, 89, - 211, 80, 82, 79, 84, 79, 211, 80, 82, 79, 84, 69, 67, 84, 69, 196, 80, - 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 80, 82, 79, 83, - 69, 82, 80, 73, 78, 65, 128, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 65, - 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, 80, 82, 79, 80, 69, 82, - 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, 82, 79, 79, 70, 128, - 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, 65, 84, 73, 79, 78, - 197, 80, 82, 79, 74, 69, 67, 84, 79, 82, 128, 80, 82, 79, 74, 69, 67, 84, - 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, 79, - 72, 73, 66, 73, 84, 69, 196, 80, 82, 79, 71, 82, 69, 83, 83, 128, 80, 82, - 79, 71, 82, 65, 205, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, 68, - 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 79, 66, 73, 78, - 199, 80, 82, 73, 86, 65, 84, 69, 128, 80, 82, 73, 86, 65, 84, 197, 80, - 82, 73, 86, 65, 67, 217, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, - 193, 80, 82, 73, 78, 84, 83, 128, 80, 82, 73, 78, 84, 69, 82, 128, 80, - 82, 73, 78, 84, 69, 210, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, - 80, 82, 73, 78, 67, 69, 83, 83, 128, 80, 82, 73, 78, 67, 69, 128, 80, 82, - 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, - 80, 82, 69, 84, 90, 69, 76, 128, 80, 82, 69, 83, 83, 69, 196, 80, 82, 69, - 83, 69, 84, 128, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, 80, 82, - 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, 79, 78, 68, 69, - 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, 80, 82, 69, 71, - 78, 65, 78, 212, 80, 82, 69, 70, 73, 88, 69, 196, 80, 82, 69, 70, 65, 67, - 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, 82, 69, 67, 69, - 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, 82, 69, 67, 69, - 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, 67, 69, 68, 69, - 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 89, 69, 210, 80, 82, 65, - 77, 45, 80, 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, - 45, 77, 85, 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, - 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, - 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, - 77, 128, 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, - 80, 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, - 211, 80, 79, 87, 69, 82, 128, 80, 79, 87, 69, 210, 80, 79, 87, 68, 69, - 82, 69, 196, 80, 79, 87, 68, 69, 82, 128, 80, 79, 85, 78, 196, 80, 79, - 85, 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, 84, 65, 84, 79, - 128, 80, 79, 84, 65, 66, 76, 197, 80, 79, 212, 80, 79, 83, 84, 80, 79, - 83, 73, 84, 73, 79, 206, 80, 79, 83, 84, 66, 79, 88, 128, 80, 79, 83, 84, - 65, 204, 80, 79, 83, 84, 128, 80, 79, 83, 212, 80, 79, 83, 83, 69, 83, - 83, 73, 79, 78, 128, 80, 79, 83, 83, 69, 83, 83, 73, 79, 206, 80, 79, 83, - 73, 84, 73, 79, 78, 83, 128, 80, 79, 83, 73, 84, 73, 79, 78, 128, 80, 79, - 83, 69, 73, 68, 79, 78, 128, 80, 79, 82, 84, 65, 66, 76, 197, 80, 79, 82, - 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, 85, 211, 80, 79, - 80, 80, 73, 78, 199, 80, 79, 80, 80, 69, 82, 128, 80, 79, 80, 67, 79, 82, - 78, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 68, 76, 69, 128, 80, - 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, 80, 79, 77, 77, 69, - 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, 76, 79, 128, 80, 79, 76, 73, - 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, 201, 80, 79, 76, 69, - 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, 69, 128, 80, 79, 75, - 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, 79, 73, 78, 84, 79, 128, - 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, 69, 196, 80, 79, 73, - 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, 82, 217, 80, 79, 69, - 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, 79, 67, 75, 69, 212, - 80, 79, 65, 128, 80, 79, 128, 80, 207, 80, 78, 69, 85, 77, 65, 84, 65, - 128, 80, 76, 85, 84, 207, 80, 76, 85, 84, 65, 128, 80, 76, 85, 83, 45, - 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, 76, 85, 82, 65, 76, 128, - 80, 76, 85, 77, 69, 196, 80, 76, 85, 77, 128, 80, 76, 85, 75, 128, 80, - 76, 85, 71, 128, 80, 76, 85, 128, 80, 76, 79, 87, 128, 80, 76, 79, 80, - 72, 85, 128, 80, 76, 72, 65, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, - 128, 80, 76, 69, 65, 68, 73, 78, 199, 80, 76, 68, 128, 80, 76, 65, 89, - 73, 78, 199, 80, 76, 65, 84, 69, 128, 80, 76, 65, 83, 84, 73, 67, 83, - 128, 80, 76, 65, 78, 69, 84, 128, 80, 76, 65, 78, 69, 128, 80, 76, 65, - 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, - 65, 67, 69, 72, 79, 76, 68, 69, 82, 128, 80, 76, 65, 67, 69, 72, 79, 76, - 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, - 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, 80, 73, - 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, 67, 72, - 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, 80, 73, - 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, - 128, 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 82, - 65, 67, 89, 128, 80, 73, 82, 50, 128, 80, 73, 80, 73, 78, 71, 128, 80, - 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65, 69, 77, 66, - 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204, 80, 73, 78, - 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 67, 72, 73, 78, - 199, 80, 73, 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, 128, - 80, 73, 76, 197, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, 85, - 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, 88, - 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, - 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, 80, - 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, - 45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, - 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, - 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, - 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, - 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, - 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, - 80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, 73, - 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, - 80, 73, 69, 85, 208, 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, 73, - 69, 69, 84, 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, 80, - 73, 69, 128, 80, 73, 67, 84, 85, 82, 69, 128, 80, 73, 67, 75, 69, 84, + 69, 74, 65, 78, 199, 82, 69, 73, 87, 65, 128, 82, 69, 73, 196, 82, 69, + 73, 128, 82, 69, 71, 85, 76, 85, 83, 45, 52, 128, 82, 69, 71, 85, 76, 85, + 83, 45, 51, 128, 82, 69, 71, 85, 76, 85, 83, 45, 50, 128, 82, 69, 71, 85, + 76, 85, 83, 128, 82, 69, 71, 85, 76, 85, 211, 82, 69, 71, 73, 83, 84, 69, + 82, 69, 196, 82, 69, 71, 73, 79, 78, 65, 204, 82, 69, 71, 73, 65, 45, 50, + 128, 82, 69, 71, 73, 65, 128, 82, 69, 70, 79, 82, 77, 69, 196, 82, 69, + 70, 69, 82, 69, 78, 67, 197, 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, + 79, 78, 128, 82, 69, 67, 89, 67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, + 69, 196, 82, 69, 67, 84, 73, 76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, + 78, 71, 85, 76, 65, 210, 82, 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, + 67, 84, 65, 78, 71, 76, 197, 82, 69, 67, 82, 69, 65, 84, 73, 79, 78, 65, + 204, 82, 69, 67, 79, 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, + 128, 82, 69, 67, 79, 82, 68, 128, 82, 69, 67, 79, 82, 196, 82, 69, 67, + 73, 84, 65, 84, 73, 86, 197, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, + 67, 69, 73, 86, 69, 82, 128, 82, 69, 67, 69, 73, 86, 69, 210, 82, 69, 67, + 69, 73, 80, 84, 128, 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, 82, 69, 65, + 76, 71, 65, 82, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, 65, 67, 72, + 128, 82, 69, 45, 52, 128, 82, 69, 45, 51, 128, 82, 69, 45, 50, 128, 82, + 69, 45, 49, 128, 82, 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, + 65, 90, 79, 82, 128, 82, 65, 89, 83, 128, 82, 65, 89, 211, 82, 65, 89, + 65, 78, 78, 65, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, 128, + 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, 83, + 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, 128, + 82, 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, + 82, 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, + 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 75, 65, 65, 82, 65, + 65, 78, 83, 65, 89, 65, 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, 83, + 69, 68, 128, 82, 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, + 82, 65, 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, + 76, 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, + 65, 84, 85, 76, 76, 65, 200, 82, 65, 72, 128, 82, 65, 70, 69, 128, 82, + 65, 69, 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, + 73, 79, 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, + 65, 196, 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, + 65, 67, 73, 78, 199, 82, 65, 67, 67, 79, 79, 78, 128, 82, 65, 66, 66, 73, + 84, 128, 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, 128, + 82, 65, 51, 128, 82, 65, 50, 128, 82, 65, 45, 75, 65, 82, 65, 128, 82, + 65, 45, 52, 128, 82, 65, 45, 51, 128, 82, 65, 45, 50, 128, 82, 65, 45, + 49, 128, 82, 48, 50, 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, + 82, 48, 50, 54, 128, 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, + 50, 51, 128, 82, 48, 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, + 128, 82, 48, 49, 57, 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, + 48, 49, 54, 65, 128, 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, + 49, 52, 128, 82, 48, 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, + 128, 82, 48, 49, 48, 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, + 82, 48, 48, 56, 128, 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, + 48, 53, 128, 82, 48, 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, + 51, 65, 128, 82, 48, 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, + 50, 128, 82, 48, 48, 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, + 81, 89, 85, 128, 81, 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, + 81, 89, 80, 128, 81, 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, + 81, 89, 69, 128, 81, 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, + 87, 73, 128, 81, 87, 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, + 81, 87, 65, 128, 81, 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, + 81, 85, 85, 128, 81, 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, + 128, 81, 85, 82, 88, 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, + 88, 128, 81, 85, 79, 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, + 85, 79, 84, 128, 81, 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, + 81, 85, 73, 78, 84, 73, 76, 69, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, + 78, 67, 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, + 73, 78, 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, + 73, 76, 212, 81, 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, + 128, 81, 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, + 69, 83, 84, 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, + 69, 78, 128, 81, 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, + 83, 128, 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, + 82, 83, 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, + 128, 81, 85, 65, 78, 84, 73, 84, 217, 81, 85, 65, 68, 82, 85, 80, 76, + 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 65, 78, + 212, 81, 85, 65, 68, 67, 79, 76, 79, 78, 128, 81, 85, 65, 68, 128, 81, + 85, 65, 196, 81, 85, 65, 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, + 79, 84, 128, 81, 79, 80, 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, + 81, 79, 79, 128, 81, 79, 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, + 128, 81, 79, 128, 81, 78, 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, + 81, 73, 84, 128, 81, 73, 80, 128, 81, 73, 73, 128, 81, 73, 70, 128, 81, + 73, 69, 88, 128, 81, 73, 69, 84, 128, 81, 73, 69, 80, 128, 81, 73, 69, + 128, 81, 73, 128, 81, 72, 87, 73, 128, 81, 72, 87, 69, 69, 128, 81, 72, + 87, 69, 128, 81, 72, 87, 65, 65, 128, 81, 72, 87, 65, 128, 81, 72, 85, + 128, 81, 72, 79, 80, 72, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, + 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, 85, 128, 81, 72, 65, 65, 128, + 81, 72, 65, 128, 81, 71, 65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, + 69, 128, 81, 69, 128, 81, 65, 89, 128, 81, 65, 85, 128, 81, 65, 84, 65, + 78, 128, 81, 65, 82, 78, 69, 217, 81, 65, 82, 128, 81, 65, 81, 128, 81, + 65, 80, 72, 128, 81, 65, 77, 65, 84, 83, 128, 81, 65, 77, 65, 84, 211, + 81, 65, 76, 193, 81, 65, 73, 82, 84, 72, 82, 65, 128, 81, 65, 73, 128, + 81, 65, 70, 128, 81, 65, 198, 81, 65, 68, 77, 65, 128, 81, 65, 65, 73, + 128, 81, 65, 65, 70, 85, 128, 81, 65, 65, 70, 128, 81, 48, 48, 55, 128, + 81, 48, 48, 54, 128, 81, 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, + 48, 51, 128, 81, 48, 48, 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 80, + 89, 88, 128, 80, 89, 84, 128, 80, 89, 82, 88, 128, 80, 89, 82, 128, 80, + 89, 80, 128, 80, 87, 79, 89, 128, 80, 87, 79, 79, 128, 80, 87, 79, 128, + 80, 87, 207, 80, 87, 73, 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, + 80, 87, 69, 128, 80, 87, 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, + 90, 90, 76, 197, 80, 85, 88, 128, 80, 85, 85, 84, 128, 80, 85, 85, 128, + 80, 85, 84, 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, + 85, 212, 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, + 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, + 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, 82, 78, 65, 77, 65, 128, 80, + 85, 82, 73, 84, 89, 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, 82, 128, + 80, 85, 81, 128, 80, 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, + 128, 80, 85, 79, 128, 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, 78, 71, + 128, 80, 85, 78, 67, 84, 85, 211, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, + 78, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, + 128, 80, 85, 77, 128, 80, 85, 70, 70, 69, 68, 128, 80, 85, 69, 128, 80, + 85, 67, 75, 128, 80, 85, 66, 76, 73, 195, 80, 85, 194, 80, 85, 65, 81, + 128, 80, 85, 65, 69, 128, 80, 85, 65, 67, 72, 85, 197, 80, 85, 50, 128, + 80, 85, 49, 128, 80, 85, 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, + 80, 83, 73, 76, 201, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, + 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, + 69, 83, 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, + 73, 83, 84, 79, 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, + 65, 76, 84, 69, 210, 80, 83, 128, 80, 82, 79, 86, 69, 128, 80, 82, 79, + 84, 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82, 79, 84, 69, + 67, 84, 69, 196, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, + 128, 80, 82, 79, 83, 69, 82, 80, 73, 78, 65, 128, 80, 82, 79, 80, 79, 82, + 84, 73, 79, 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, 80, + 82, 79, 80, 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, 82, + 79, 79, 70, 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, 65, + 84, 73, 79, 78, 197, 80, 82, 79, 74, 69, 67, 84, 79, 82, 128, 80, 82, 79, + 74, 69, 67, 84, 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, + 128, 80, 82, 79, 72, 73, 66, 73, 84, 69, 196, 80, 82, 79, 71, 82, 69, 83, + 83, 128, 80, 82, 79, 71, 82, 65, 205, 80, 82, 79, 70, 79, 85, 78, 68, + 128, 80, 82, 79, 68, 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, + 82, 79, 66, 73, 78, 199, 80, 82, 73, 86, 65, 84, 69, 128, 80, 82, 73, 86, + 65, 84, 197, 80, 82, 73, 86, 65, 67, 217, 80, 82, 73, 83, 72, 84, 72, 65, + 77, 65, 84, 82, 193, 80, 82, 73, 78, 84, 83, 128, 80, 82, 73, 78, 84, 69, + 82, 128, 80, 82, 73, 78, 84, 69, 210, 80, 82, 73, 78, 84, 128, 80, 82, + 73, 78, 212, 80, 82, 73, 78, 67, 69, 83, 83, 128, 80, 82, 73, 78, 67, 69, + 128, 80, 82, 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, + 79, 85, 211, 80, 82, 69, 84, 90, 69, 76, 128, 80, 82, 69, 83, 83, 69, + 196, 80, 82, 69, 83, 69, 84, 128, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, + 79, 206, 80, 82, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, + 79, 78, 68, 69, 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, + 80, 82, 69, 71, 78, 65, 78, 212, 80, 82, 69, 70, 73, 88, 69, 196, 80, 82, + 69, 70, 65, 67, 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, + 82, 69, 67, 69, 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, + 82, 69, 67, 69, 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, + 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 89, 69, + 210, 80, 82, 65, 77, 45, 80, 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, + 201, 80, 82, 65, 77, 45, 77, 85, 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, + 79, 217, 80, 82, 65, 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, + 85, 79, 206, 80, 82, 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, + 69, 201, 80, 82, 65, 77, 128, 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, + 128, 80, 80, 77, 128, 80, 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, + 80, 79, 87, 69, 82, 211, 80, 79, 87, 69, 82, 128, 80, 79, 87, 69, 210, + 80, 79, 87, 68, 69, 82, 69, 196, 80, 79, 87, 68, 69, 82, 128, 80, 79, 85, + 78, 196, 80, 79, 85, 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, + 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197, 80, 79, 212, 80, 79, + 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83, 84, 66, 79, 88, 128, + 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80, 79, 83, 212, 80, 79, + 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, 79, 83, 83, 69, 83, 83, 73, 79, + 206, 80, 79, 83, 73, 84, 73, 79, 78, 83, 128, 80, 79, 83, 73, 84, 73, 79, + 78, 128, 80, 79, 83, 69, 73, 68, 79, 78, 128, 80, 79, 82, 84, 65, 66, 76, + 197, 80, 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, + 85, 211, 80, 79, 80, 80, 73, 78, 199, 80, 79, 80, 80, 69, 82, 128, 80, + 79, 80, 67, 79, 82, 78, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, + 68, 76, 69, 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, + 80, 79, 77, 77, 69, 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, 76, 79, + 128, 80, 79, 76, 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, + 201, 80, 79, 76, 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, + 69, 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, 79, + 73, 78, 84, 79, 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, + 69, 196, 80, 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, + 82, 217, 80, 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, + 79, 67, 75, 69, 212, 80, 79, 65, 128, 80, 79, 128, 80, 207, 80, 78, 69, + 85, 77, 65, 84, 65, 128, 80, 76, 85, 84, 207, 80, 76, 85, 84, 65, 128, + 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, 76, 85, + 82, 65, 76, 128, 80, 76, 85, 77, 69, 196, 80, 76, 85, 77, 128, 80, 76, + 85, 75, 128, 80, 76, 85, 71, 128, 80, 76, 85, 128, 80, 76, 79, 87, 128, + 80, 76, 79, 80, 72, 85, 128, 80, 76, 72, 65, 85, 128, 80, 76, 69, 84, 72, + 82, 79, 78, 128, 80, 76, 69, 65, 68, 73, 78, 199, 80, 76, 68, 128, 80, + 76, 65, 89, 73, 78, 199, 80, 76, 65, 84, 69, 128, 80, 76, 65, 83, 84, 73, + 67, 83, 128, 80, 76, 65, 78, 69, 84, 128, 80, 76, 65, 78, 69, 128, 80, + 76, 65, 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, + 80, 76, 65, 67, 69, 72, 79, 76, 68, 69, 82, 128, 80, 76, 65, 67, 69, 72, + 79, 76, 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, + 90, 73, 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, + 80, 73, 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, + 67, 72, 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, + 80, 73, 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, + 73, 71, 128, 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, + 73, 82, 65, 67, 89, 128, 80, 73, 82, 50, 128, 80, 73, 80, 73, 78, 71, + 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65, 69, + 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204, 80, + 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 67, 72, + 73, 78, 199, 80, 73, 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, + 128, 80, 73, 76, 197, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, + 85, 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, + 88, 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, + 69, 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, + 80, 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, + 80, 45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, + 85, 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, + 80, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, + 80, 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, + 45, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, + 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, + 85, 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, + 85, 80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, + 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, + 128, 80, 73, 69, 85, 208, 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, + 73, 69, 69, 84, 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, + 80, 73, 69, 128, 80, 73, 67, 84, 85, 82, 69, 128, 80, 73, 67, 75, 69, 84, 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, 79, 82, 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, 201, 80, 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, 210, 80, 72, 85, 78, @@ -6833,5462 +6833,5463 @@ static const unsigned int lexicon_offset[] = { 4450, 26972, 26976, 26986, 26994, 27004, 27015, 27021, 27026, 27036, 27044, 27051, 27057, 27064, 27069, 25501, 27073, 27082, 27086, 27089, 27094, 27102, 27109, 27118, 27126, 27134, 27142, 27152, 27161, 27167, - 27173, 27177, 25506, 25511, 27181, 27191, 27201, 27211, 27219, 27226, - 27236, 27244, 27252, 27258, 27266, 782, 27275, 17126, 599, 27289, 27298, - 27306, 27317, 27328, 27338, 27347, 27359, 27368, 27377, 27384, 27390, - 27400, 27409, 27418, 27426, 27434, 27444, 27452, 27460, 27466, 27471, - 27476, 27481, 7915, 27486, 27489, 27493, 27498, 27504, 27509, 27513, - 11142, 25524, 25529, 27521, 27527, 27533, 27538, 27543, 27547, 27555, - 27561, 27567, 27571, 3824, 27579, 27584, 27589, 27593, 27597, 11266, - 27604, 27612, 27626, 27633, 27640, 27646, 11275, 11281, 27654, 27662, - 27669, 27674, 27679, 25534, 27685, 27696, 27700, 27705, 2679, 27710, - 27721, 27727, 27732, 27736, 27740, 27743, 27750, 27757, 27763, 27771, - 27778, 27784, 27788, 7955, 27793, 27797, 27801, 27809, 27814, 27819, - 27824, 1717, 27829, 27834, 27839, 27844, 27849, 27854, 27859, 27864, - 27869, 27874, 27879, 27884, 27889, 27894, 27900, 27905, 27910, 27915, - 27920, 27925, 27930, 27936, 27941, 27946, 27951, 27956, 27961, 27966, - 27971, 27977, 27983, 27988, 27994, 27999, 28004, 5, 28010, 28014, 28018, - 28022, 28027, 28031, 28035, 28039, 28043, 28048, 28052, 28057, 28061, - 28064, 28068, 28073, 28077, 28082, 28086, 28090, 28094, 28099, 28103, - 28107, 28117, 28122, 28126, 28130, 28135, 28140, 28149, 28154, 28159, - 28163, 28167, 28176, 28189, 28201, 28210, 28219, 28224, 28230, 28235, - 28239, 28243, 28253, 28262, 28270, 28276, 28281, 28285, 28292, 28302, - 28311, 28319, 12474, 28327, 28335, 28344, 28353, 28361, 28371, 28376, - 28380, 28384, 28387, 28389, 28393, 28397, 28402, 28407, 28411, 28415, - 28418, 28422, 28425, 28429, 28432, 28435, 28439, 28445, 28449, 28453, - 28457, 28461, 28466, 28471, 28476, 28480, 28483, 28488, 28494, 28499, - 28505, 28510, 28514, 28520, 28524, 28528, 28533, 28537, 28542, 28547, - 28551, 28555, 28562, 28566, 28569, 28573, 28577, 28583, 28589, 28593, - 28597, 28602, 28609, 28615, 28619, 28628, 28632, 28636, 28639, 28645, - 28650, 28656, 1417, 1769, 28661, 28666, 28671, 28676, 28681, 28686, - 28691, 2150, 747, 28696, 28699, 28703, 28707, 28712, 28716, 17138, 28720, - 28725, 28730, 28734, 28737, 28742, 28746, 28751, 28755, 17142, 28760, - 28763, 28766, 28772, 28776, 28781, 28785, 28798, 28802, 28805, 28813, - 28822, 28829, 28834, 28840, 28846, 28854, 28861, 28868, 28872, 28876, - 28880, 28885, 28890, 28894, 28902, 28907, 28914, 28926, 28937, 28942, - 28946, 28953, 28957, 28962, 28968, 28971, 28976, 28981, 28988, 28992, - 28996, 28999, 29005, 8642, 2350, 29009, 29014, 29030, 10734, 29050, - 29059, 29075, 29079, 29086, 29089, 29095, 29105, 29111, 29120, 29135, - 29146, 29158, 29169, 29177, 29186, 29192, 29201, 29211, 29221, 29232, - 29243, 29253, 29262, 29269, 29278, 29286, 29293, 29300, 29308, 29315, - 29322, 29335, 29342, 29350, 29357, 29363, 29368, 29377, 29384, 29390, - 29395, 29403, 29411, 29418, 29425, 26996, 29437, 29449, 29463, 29471, - 29479, 29487, 29494, 29506, 29515, 29524, 29532, 29540, 29548, 29555, - 29561, 29570, 29578, 29588, 29597, 29607, 29616, 29625, 29633, 29638, - 29642, 29645, 29649, 29653, 29657, 29661, 29665, 29671, 29677, 29682, - 29690, 17200, 29697, 29702, 29709, 29715, 29722, 17208, 29729, 29732, - 29744, 29752, 29758, 29763, 29767, 29778, 29788, 29798, 11205, 29807, - 29816, 29824, 29834, 29843, 29850, 29857, 29865, 29869, 17219, 29872, - 29879, 29883, 4394, 29889, 29892, 29899, 29905, 29910, 29917, 29923, - 29927, 29932, 29936, 29945, 29952, 29958, 8700, 29965, 29973, 29980, - 29986, 29991, 29997, 30003, 30011, 30017, 30021, 30024, 30026, 29650, - 11218, 30035, 30040, 30046, 30056, 30061, 30068, 30074, 30079, 30084, - 30089, 30093, 30098, 30105, 30111, 30120, 30128, 30132, 30139, 30145, - 30154, 30161, 4648, 30167, 30173, 30178, 30185, 30197, 30208, 30213, - 30217, 30227, 30233, 30237, 30242, 30252, 30261, 30265, 30272, 30280, - 30287, 30293, 30298, 30306, 30313, 30318, 30325, 30337, 30346, 30350, - 15130, 30358, 30368, 30372, 30380, 28809, 30391, 30396, 30400, 30407, - 30414, 25186, 29575, 30419, 30423, 30426, 26324, 30431, 30445, 30461, - 30479, 30498, 30515, 30533, 26343, 30550, 30570, 26360, 30582, 30594, - 18413, 30606, 26380, 30620, 30632, 12130, 30646, 30651, 30656, 30661, - 30667, 30673, 30679, 30683, 30691, 30698, 30703, 30713, 30719, 11692, - 30725, 30727, 30732, 30740, 30744, 30101, 30750, 30757, 13395, 13405, - 30764, 30771, 30781, 30786, 30790, 30793, 30799, 30807, 30819, 30829, - 30845, 30858, 30872, 18431, 30886, 30893, 30897, 30900, 30905, 30909, - 30916, 30923, 30930, 30940, 30945, 30950, 30955, 30963, 30971, 30976, - 30985, 27017, 3485, 30990, 30993, 30996, 31001, 31008, 31013, 31018, - 31034, 31042, 31050, 10498, 31058, 31063, 31067, 31073, 31078, 31084, - 31087, 31093, 31105, 31113, 31120, 31126, 31133, 31144, 31158, 31171, - 31177, 31186, 31192, 31201, 31213, 31224, 31234, 31243, 31252, 31260, - 31271, 8682, 31278, 31285, 31291, 31296, 31302, 31309, 31320, 31330, - 31340, 31349, 31355, 31362, 31367, 31375, 31382, 31390, 31398, 31410, - 6904, 1094, 31417, 31426, 31434, 31440, 31446, 31451, 31455, 31458, - 31464, 31471, 31476, 31481, 31486, 31490, 31502, 31513, 31522, 31530, - 17401, 31535, 31543, 31548, 31556, 31562, 31568, 13388, 9497, 31573, - 31577, 31581, 31584, 31587, 31593, 31601, 31609, 31613, 31617, 31622, - 31626, 31629, 31638, 31643, 31647, 31650, 31658, 31669, 31678, 31682, - 31688, 31694, 31698, 31704, 31712, 31734, 31758, 31769, 31778, 31784, - 31791, 31798, 31804, 31812, 31818, 31823, 31834, 31852, 31859, 31867, - 31871, 31878, 31883, 31892, 31905, 31913, 31925, 31936, 31947, 31957, - 31971, 31980, 31988, 32000, 10751, 32011, 32022, 32033, 32045, 32055, - 32064, 32074, 32079, 32083, 32091, 32102, 32112, 32118, 32123, 32127, - 32130, 32133, 32141, 32149, 32158, 32168, 32177, 32183, 32197, 2762, - 32219, 32230, 32239, 32249, 32261, 32270, 32279, 32289, 32297, 32305, - 32314, 32319, 32330, 32335, 32344, 32350, 32361, 32365, 32368, 32378, - 32387, 32395, 32405, 32415, 32423, 32432, 32439, 32447, 32454, 32463, - 32472, 32477, 32482, 32486, 32494, 32501, 32505, 32513, 32520, 32531, - 32546, 32553, 32559, 32569, 32578, 32584, 32595, 32599, 32606, 32610, - 32617, 32623, 16275, 32629, 32633, 32638, 32644, 32651, 32655, 32659, - 32667, 32675, 32681, 32690, 32697, 32704, 32709, 32714, 32724, 27071, - 32728, 32731, 32736, 32741, 32746, 32751, 32756, 32761, 32766, 32771, - 32777, 32782, 32787, 32793, 1134, 725, 32798, 32805, 32814, 2398, 32821, - 32826, 32830, 32836, 1183, 653, 32841, 311, 32845, 32854, 32862, 32871, - 32879, 32886, 32897, 32905, 32914, 32924, 32932, 32937, 11373, 32941, - 32949, 32957, 32962, 17155, 4008, 32968, 32974, 32980, 6462, 32985, - 32989, 32996, 33002, 33008, 33012, 33018, 33023, 33030, 1376, 33036, - 33043, 33047, 1283, 6470, 33052, 33062, 33070, 33076, 33086, 33095, - 33103, 33109, 33114, 33122, 33129, 12911, 33135, 33142, 33147, 33154, - 33164, 1436, 230, 2149, 33170, 33176, 33183, 33194, 33205, 33213, 33220, - 33230, 33239, 33247, 33256, 33263, 33270, 33283, 33290, 33296, 33307, - 33326, 1188, 33331, 33336, 33344, 3891, 33348, 33353, 33357, 33361, 1380, - 28416, 33371, 33375, 33380, 33384, 33390, 3758, 33396, 33404, 33411, - 33422, 33431, 33439, 33464, 33472, 33477, 3892, 377, 33483, 33491, 33499, - 33506, 33512, 33517, 2218, 12332, 33524, 33530, 29928, 30203, 33536, 613, - 106, 33540, 33544, 33550, 715, 10371, 33555, 33562, 33568, 33572, 33576, - 1581, 33579, 33583, 17669, 33586, 33591, 33598, 33604, 8713, 33609, - 33617, 33624, 33630, 25696, 33634, 33638, 33642, 33646, 3962, 19497, - 33650, 33655, 33659, 33662, 33670, 33678, 33683, 33692, 33700, 33703, - 33710, 33720, 33732, 33740, 33745, 33749, 33757, 33764, 33770, 33777, - 33784, 33787, 33791, 33795, 1391, 33805, 33807, 33812, 33818, 33824, - 33829, 33834, 33839, 33844, 33849, 33854, 33859, 33864, 33869, 33874, - 33879, 33884, 33889, 33894, 33900, 33906, 33912, 33918, 33923, 33928, - 33933, 33939, 33944, 33949, 33954, 33960, 33965, 33971, 33976, 33981, - 33986, 33991, 33997, 34002, 34008, 34013, 34018, 34023, 34028, 34034, - 34039, 34045, 34050, 34055, 34060, 34065, 34070, 34075, 34080, 34085, - 34090, 34096, 34102, 34108, 34113, 34118, 34123, 34128, 34134, 34140, - 34146, 34152, 34158, 34164, 34169, 34175, 34180, 34185, 34190, 34195, - 34201, 2486, 34206, 2493, 2500, 2886, 34211, 2506, 2516, 34217, 2548, - 2553, 2558, 34221, 34226, 34231, 34237, 34242, 34247, 34251, 34256, - 34262, 34267, 34272, 34277, 34283, 34288, 34292, 34296, 34301, 34306, - 34311, 34316, 34321, 34327, 34333, 34338, 34342, 34347, 34353, 34357, - 34362, 34367, 34372, 34377, 34381, 34384, 34389, 34394, 34399, 34404, - 34409, 34415, 34421, 34426, 34431, 34436, 34440, 34445, 34450, 34455, - 34460, 34465, 34470, 34474, 34479, 34484, 34489, 34493, 34497, 34501, - 34506, 34514, 34519, 34524, 34530, 34536, 34542, 34547, 34555, 34559, - 34562, 34567, 34572, 34576, 34581, 34586, 34590, 34595, 34599, 34602, - 34607, 4104, 20257, 34612, 34617, 34622, 34627, 34635, 24401, 33040, - 10010, 34640, 34645, 34649, 34654, 34658, 34662, 34667, 34671, 34674, - 34677, 34681, 34686, 34690, 34698, 34702, 34705, 34710, 34714, 34718, - 34723, 34728, 34732, 34738, 34743, 34748, 34755, 34762, 34766, 34769, - 34775, 34784, 34791, 34799, 34806, 34810, 34815, 34819, 34823, 34829, - 34834, 34840, 34844, 34850, 34855, 34860, 34864, 34871, 34877, 34883, - 34889, 34895, 34902, 34908, 34914, 34920, 34926, 34932, 34938, 34944, - 34951, 34957, 34964, 34970, 34976, 34982, 34988, 34994, 35000, 35006, - 35012, 35018, 35024, 35029, 35034, 13266, 35039, 35045, 35050, 35055, - 35060, 35065, 35068, 35074, 35079, 35087, 35092, 35096, 35101, 35107, - 35116, 35122, 35127, 35132, 35137, 35141, 35146, 35150, 35155, 35160, - 35165, 35170, 35177, 35184, 35190, 35196, 35201, 19116, 35208, 35214, - 35221, 35227, 35233, 35238, 35246, 35251, 10916, 35255, 35260, 35265, - 35271, 35276, 35281, 35285, 35290, 35295, 35301, 35306, 35311, 35316, - 35320, 35325, 35330, 35334, 35339, 35344, 35348, 35353, 35357, 35362, - 35367, 35372, 35376, 35381, 35385, 35390, 35394, 35398, 35402, 17825, - 35407, 35414, 35423, 35429, 35435, 35444, 35452, 35461, 35469, 35474, - 35478, 35485, 35491, 35499, 35503, 35506, 35511, 35515, 35524, 35532, - 35550, 35556, 1435, 35562, 35565, 35569, 25836, 25842, 35575, 35579, - 35590, 35601, 35612, 35624, 35628, 35635, 35642, 35649, 35654, 35658, - 35666, 35671, 35676, 35681, 35686, 6527, 1050, 24400, 35691, 35696, - 35700, 35705, 35709, 35715, 35720, 35726, 35731, 35737, 35742, 35748, - 35753, 35759, 35765, 35771, 35776, 35732, 35738, 35780, 35785, 35791, - 35796, 35802, 35807, 35813, 35818, 35743, 11983, 35822, 35754, 35760, - 35766, 2978, 3672, 35828, 35831, 35836, 35842, 35848, 35854, 35861, - 35867, 35873, 35879, 35885, 35891, 35897, 35903, 35909, 35915, 35921, - 35927, 35933, 35940, 35946, 35952, 35958, 35964, 35970, 35973, 35978, - 35981, 35988, 35993, 36001, 36005, 36010, 36015, 36021, 36026, 36031, - 36035, 36040, 36046, 36051, 36057, 36062, 36068, 36073, 36079, 36085, - 36089, 36094, 36099, 36104, 36109, 36113, 36118, 36123, 36128, 36134, - 36140, 36146, 36152, 36157, 36161, 36164, 36170, 36176, 36185, 36193, - 36200, 36205, 36209, 36213, 36218, 17615, 36223, 36231, 36237, 4050, - 1293, 36242, 36246, 8763, 36252, 36258, 36265, 8772, 36269, 36275, 36282, - 36288, 36297, 36305, 36317, 36321, 36328, 36334, 36339, 36343, 36347, - 36350, 36360, 36369, 36377, 35733, 36382, 36392, 36402, 36412, 36418, - 36423, 36433, 36438, 36451, 36465, 36476, 36488, 36500, 36514, 36527, - 36539, 36551, 16966, 36565, 36570, 36575, 36579, 36583, 36587, 36591, - 36597, 36602, 36607, 36612, 36617, 36622, 36627, 1758, 31222, 36632, - 36637, 35781, 36642, 36645, 36650, 36655, 36660, 36666, 36672, 18733, - 11558, 36677, 36683, 36690, 18365, 36696, 36701, 36706, 36710, 36715, - 36720, 35786, 36725, 36730, 36735, 36741, 35792, 36746, 36749, 36756, - 36764, 36770, 36776, 36782, 36793, 36798, 36805, 36812, 36819, 36827, - 36836, 36845, 36851, 36857, 36865, 35797, 36870, 36876, 36882, 35803, - 36887, 36892, 36900, 36908, 36914, 36921, 36927, 36934, 36941, 36947, - 36955, 36965, 36972, 36978, 36983, 36989, 36994, 36999, 37006, 37015, - 37023, 37028, 37034, 37041, 37049, 37055, 37060, 37066, 37075, 37082, - 32163, 37088, 37092, 37097, 37106, 37111, 37116, 37121, 14446, 37129, - 37134, 37139, 37144, 37148, 37153, 37158, 37165, 37170, 37175, 37180, - 35808, 24329, 37186, 2589, 155, 37189, 37192, 37196, 37200, 37210, 37218, - 37225, 37229, 37233, 37236, 37244, 37251, 37258, 30157, 37267, 37270, - 37276, 37283, 37287, 37295, 37303, 37310, 37314, 37318, 37321, 37327, - 37334, 37338, 37342, 37349, 37357, 37365, 35744, 37372, 37380, 37385, - 37397, 11639, 11646, 11653, 11660, 11667, 11674, 578, 404, 37403, 37408, - 37413, 37419, 37424, 37429, 4071, 37434, 37437, 37442, 37447, 37452, - 37457, 37462, 37469, 25960, 37474, 37479, 37484, 37489, 37494, 37500, - 37505, 37511, 35984, 37517, 37522, 37528, 37534, 37544, 37549, 37554, - 37558, 37563, 37568, 37573, 37578, 37591, 37596, 25574, 19579, 978, - 37600, 37606, 37610, 37615, 37620, 37626, 37631, 37636, 37640, 37645, - 37650, 37656, 37661, 37666, 1298, 37670, 37675, 37680, 37685, 37689, - 37694, 37699, 37704, 37710, 37716, 37721, 37725, 37729, 37734, 37739, - 37744, 37748, 37753, 37761, 37765, 37771, 37775, 37782, 37791, 19350, - 35755, 37797, 37804, 37812, 37819, 37825, 37838, 37850, 37855, 37861, - 37865, 2905, 37869, 37873, 37329, 37882, 37893, 37904, 37909, 32226, - 37914, 37919, 37923, 32346, 25847, 37928, 37932, 37937, 35761, 24436, - 37941, 37946, 37952, 37957, 37961, 37965, 37968, 37972, 37978, 37987, - 37998, 38010, 35767, 38015, 38018, 38022, 38026, 38031, 38036, 38041, - 38046, 38051, 38056, 38061, 38066, 341, 38071, 38076, 38081, 38086, - 38091, 38096, 38102, 38107, 38112, 38118, 38123, 38129, 38134, 38140, - 38145, 38150, 38155, 38160, 38165, 38170, 38175, 38180, 38186, 38191, - 38196, 38201, 38206, 38211, 38216, 38221, 38227, 38233, 38238, 38243, - 38248, 38253, 38258, 38263, 38268, 38273, 38278, 38283, 38288, 38293, - 38298, 38303, 38308, 38313, 38318, 38323, 38333, 38343, 38349, 331, 9, - 38354, 38358, 38362, 38370, 38374, 38378, 38381, 16395, 38384, 38389, - 38393, 38398, 38402, 38407, 38411, 38416, 38420, 38423, 38425, 38429, - 38434, 38438, 38449, 38452, 38454, 38458, 38470, 38482, 38491, 38495, - 38505, 38509, 38515, 38520, 38529, 38535, 38540, 38545, 38549, 38553, - 38558, 38565, 38570, 38576, 38581, 38585, 38592, 29583, 29593, 38596, - 38601, 38606, 38611, 38618, 38622, 38629, 38635, 8918, 38639, 38648, - 38656, 38671, 38685, 38694, 38702, 38713, 38722, 38727, 38734, 38744, - 7924, 38754, 38759, 38764, 38768, 38771, 38776, 38780, 38785, 38789, - 38796, 38801, 38806, 38811, 38821, 38826, 38831, 38836, 9883, 38841, - 38843, 38851, 38854, 38857, 38859, 38863, 38869, 38873, 38878, 38883, - 38901, 38915, 38934, 38951, 38960, 38968, 38973, 38978, 1428, 38984, - 38990, 38995, 39005, 39014, 39022, 39027, 39033, 39038, 39047, 39056, - 39067, 39072, 39079, 39085, 39089, 39098, 39105, 39113, 39120, 39133, - 39141, 39145, 39155, 39160, 39164, 39172, 39180, 39185, 39189, 39193, - 39202, 39208, 39213, 39221, 39231, 39240, 39249, 39258, 39269, 39277, - 39288, 39297, 39305, 39312, 39318, 39323, 39334, 39345, 39350, 39354, - 39357, 39361, 39369, 39375, 39386, 39397, 39408, 39419, 39430, 39441, - 39452, 39463, 39475, 39487, 39499, 39511, 39523, 39535, 39547, 39556, - 39560, 39568, 39574, 39580, 39587, 39593, 39598, 39604, 39608, 39613, - 39618, 39623, 38328, 38338, 2460, 39628, 39630, 39635, 39640, 39645, - 39648, 39650, 39654, 39657, 39664, 39668, 11229, 39672, 39678, 39688, - 39693, 39699, 39703, 39708, 39721, 30051, 39727, 39736, 39745, 20480, - 39752, 39761, 36398, 39769, 39774, 39778, 39787, 39795, 39802, 39807, - 39811, 39816, 39821, 39829, 39833, 39841, 39847, 39853, 39858, 39863, - 39867, 39870, 39875, 39888, 39904, 26450, 39921, 39933, 39950, 39962, - 39976, 26467, 26486, 39988, 40000, 2779, 40014, 40019, 40024, 40029, - 40033, 40040, 40052, 40059, 40068, 40071, 40082, 40093, 40101, 40106, - 40110, 40115, 40120, 40125, 40130, 40135, 40140, 36862, 927, 40145, - 40149, 40153, 40156, 40161, 40166, 40172, 40177, 40182, 40188, 40194, - 40199, 40203, 40208, 40213, 40218, 40222, 40225, 40231, 40236, 40241, - 40246, 40250, 40255, 40261, 40269, 30330, 40274, 40279, 40286, 40292, - 40298, 40303, 40311, 25969, 40318, 40323, 40328, 40333, 40337, 40340, - 40345, 40349, 40353, 40360, 40366, 40372, 40378, 40385, 40390, 40396, - 39175, 40400, 40404, 40409, 40422, 40427, 40433, 40441, 40448, 40456, - 40466, 40472, 40478, 40484, 40488, 40497, 40505, 40512, 40517, 40522, - 12006, 40527, 40537, 40544, 40550, 40560, 40565, 40571, 40579, 3924, - 40586, 40593, 40599, 40606, 3930, 40610, 40615, 40626, 40633, 40639, - 40648, 40652, 4502, 40655, 40662, 40668, 40674, 40682, 40692, 33507, - 40699, 40707, 40713, 40718, 40724, 40729, 40733, 29895, 40739, 40746, - 40752, 40760, 40769, 40776, 40782, 40793, 27263, 40799, 40809, 40814, - 40818, 40826, 40834, 40841, 40847, 40852, 10874, 6502, 40857, 40861, - 40863, 40867, 40872, 40874, 40879, 40885, 40890, 40895, 40902, 37465, - 40908, 40913, 40917, 40922, 40926, 40935, 40939, 40945, 40952, 40958, - 40965, 40970, 40979, 40984, 40988, 40993, 41000, 41008, 41016, 41021, - 24492, 41025, 41028, 41032, 41036, 12429, 944, 41040, 41045, 41053, - 41058, 41062, 41071, 41078, 41082, 41086, 41094, 41101, 15728, 41111, - 41115, 41119, 41127, 41135, 41141, 41146, 41155, 15476, 41161, 41170, - 41177, 41182, 41189, 41196, 41204, 41211, 41219, 41227, 41236, 41241, - 41248, 41255, 41262, 41269, 41276, 41281, 41288, 41294, 41311, 41319, - 41329, 41337, 41344, 439, 41348, 41354, 41358, 41363, 38718, 41369, - 41372, 41376, 41382, 41393, 41401, 3935, 41409, 41415, 41421, 41431, - 41437, 41446, 41455, 41465, 41472, 41478, 41483, 3941, 3947, 41492, - 41499, 41507, 41512, 41516, 41523, 41531, 41538, 41545, 41551, 41560, - 41570, 41576, 41584, 41593, 41600, 41608, 41615, 25249, 41619, 41626, - 41632, 41642, 41651, 41659, 41670, 41674, 41684, 41691, 41696, 41702, - 41709, 41717, 41726, 41735, 41745, 41756, 41763, 41768, 41775, 3193, - 41783, 41789, 41794, 41801, 41807, 41813, 41818, 41831, 41844, 41857, - 41864, 41870, 41878, 41886, 41891, 41895, 41899, 41904, 41909, 41914, - 41919, 41924, 41929, 1397, 41934, 41938, 41942, 41946, 41950, 41954, - 41958, 41962, 41966, 41970, 41974, 41978, 41982, 41986, 41990, 41994, - 41998, 42002, 42006, 42010, 42014, 42018, 42022, 42026, 42030, 42034, - 42038, 42042, 42046, 42050, 42054, 42058, 42062, 42066, 42070, 42074, - 42078, 42082, 42086, 42090, 42094, 42098, 42102, 42106, 42110, 42114, - 42118, 42122, 42126, 42130, 42134, 42138, 42142, 42146, 42150, 42154, - 42158, 42162, 42166, 42170, 42174, 42178, 42182, 42186, 42190, 42194, - 42198, 42202, 42206, 42210, 42214, 42218, 42222, 42226, 42230, 42234, - 42238, 42242, 42246, 42250, 42254, 42258, 42262, 42266, 42270, 42274, - 42278, 42282, 42286, 42290, 42294, 42298, 42302, 42306, 42310, 42314, - 42318, 42322, 42326, 42330, 42334, 42338, 42342, 42346, 42350, 42354, - 42358, 42362, 42366, 42370, 42374, 42378, 42382, 42386, 42390, 42394, - 42398, 42402, 42406, 42410, 42414, 42418, 42422, 42426, 42430, 42434, - 42438, 42442, 42446, 42450, 42454, 42458, 42462, 42466, 42470, 42474, - 42478, 42482, 42486, 42490, 42494, 42498, 42502, 42506, 42510, 42514, - 42518, 42522, 42526, 42530, 42534, 42538, 42542, 42546, 42551, 42555, - 42560, 42564, 42569, 42573, 42578, 42582, 42588, 42593, 42597, 42602, - 42606, 42611, 42615, 42620, 42624, 42629, 42633, 42638, 42642, 42647, - 42651, 42657, 42663, 42668, 42672, 42677, 42681, 42687, 42692, 42696, - 42701, 42705, 42710, 42714, 42720, 42725, 42729, 42734, 42738, 42743, - 42747, 42752, 42756, 42762, 42767, 42771, 42776, 42780, 42786, 42791, - 42795, 42800, 42804, 42809, 42813, 42818, 42822, 42827, 42831, 42837, - 42842, 42846, 42852, 42857, 42861, 42867, 42872, 42876, 42881, 42885, - 42890, 42894, 42900, 42906, 42912, 42918, 42924, 42930, 42936, 42942, - 42947, 42951, 42956, 42960, 42966, 42971, 42975, 42980, 42984, 42989, - 42993, 42998, 43002, 43007, 43011, 43016, 43020, 43025, 43029, 43035, - 43040, 43044, 43049, 43053, 43059, 43065, 43070, 127, 63, 43074, 43076, - 43080, 43084, 43088, 43093, 43097, 43101, 43106, 10787, 43111, 43117, - 1703, 6943, 43123, 43126, 43131, 43135, 43140, 43144, 43148, 43153, - 11790, 43157, 43161, 43165, 571, 43169, 17934, 43174, 43178, 43183, - 43188, 43193, 43197, 43204, 30075, 43210, 43213, 43217, 43222, 43228, - 43232, 43235, 43243, 43249, 43254, 43258, 43261, 43265, 43271, 43275, - 43279, 3723, 3728, 14558, 43282, 43286, 43290, 43294, 43298, 43306, - 43313, 43317, 15426, 43324, 43329, 43343, 43350, 43361, 361, 43366, - 43370, 43376, 43388, 43394, 43400, 43405, 43411, 43415, 33780, 43424, - 43430, 43439, 43443, 43447, 43452, 43458, 43463, 43467, 43472, 43476, - 43480, 43487, 43493, 43498, 43509, 43524, 43539, 43554, 43570, 43588, - 11704, 43602, 43609, 43613, 43616, 43625, 43630, 43634, 43642, 18568, - 43650, 43654, 43664, 43675, 33705, 43688, 43692, 43701, 43719, 43738, - 43747, 43755, 43763, 11069, 11903, 43767, 25859, 43770, 34694, 43775, - 11068, 43780, 43786, 43791, 43797, 43802, 43808, 43813, 43819, 43824, - 43830, 43836, 43842, 43847, 43803, 43809, 43851, 43814, 43820, 43825, - 43856, 43831, 43837, 8931, 4327, 43862, 43870, 43874, 43877, 43884, - 43888, 43893, 43898, 43905, 43911, 43917, 43922, 17247, 43926, 29912, - 43930, 43934, 43938, 43944, 43948, 32097, 43957, 10043, 43961, 10469, - 43964, 43971, 43977, 43981, 13867, 43988, 43994, 43999, 44006, 44013, - 44020, 32866, 8828, 44027, 44034, 44041, 44047, 44052, 44059, 44070, - 44076, 44081, 44086, 44091, 44095, 44100, 44107, 43804, 44111, 44121, - 44130, 44141, 44147, 44155, 44162, 44167, 44172, 44177, 44182, 44187, - 44191, 44195, 44202, 44208, 44216, 2353, 29012, 11806, 11818, 11823, - 11829, 44225, 11834, 11839, 11845, 44230, 44240, 44244, 11850, 44249, - 19777, 44252, 44257, 44261, 40063, 44272, 44277, 44284, 44291, 44295, - 44298, 44306, 11717, 44313, 44316, 44322, 44332, 6554, 44341, 44346, - 44352, 44356, 44364, 44368, 44378, 44384, 44389, 44400, 44409, 44418, - 44427, 44436, 44445, 44454, 44463, 44469, 44475, 44480, 44486, 44492, - 44498, 44503, 44506, 44513, 44519, 44523, 44528, 44535, 44542, 44546, - 44549, 44559, 44572, 44581, 44590, 44601, 44614, 44626, 44637, 44646, - 44657, 44662, 44671, 44676, 11855, 44682, 44689, 44697, 44702, 44707, - 30121, 44711, 44718, 4267, 25, 44722, 44727, 19626, 44731, 44734, 44737, - 32283, 44741, 32875, 44749, 44753, 44757, 44760, 44766, 44772, 44777, - 35832, 44786, 44794, 44800, 44807, 32266, 44811, 32497, 44815, 44824, - 44828, 44836, 44842, 44848, 44853, 44857, 32901, 44863, 44866, 44874, - 44882, 4649, 44888, 44892, 44896, 44901, 44908, 44914, 44919, 44924, - 44928, 44934, 44939, 44945, 4555, 766, 44952, 44956, 44959, 44971, 44978, - 44983, 17807, 44987, 44995, 45003, 45011, 45019, 45026, 45034, 45042, - 45049, 45057, 45065, 45073, 45081, 45089, 45097, 45105, 45113, 45121, - 45129, 45137, 45144, 45152, 45160, 45168, 45176, 45184, 45192, 45200, - 45208, 45216, 45224, 45232, 45240, 45248, 45256, 45264, 45272, 45280, - 45288, 45296, 45303, 45311, 45318, 45326, 45334, 45342, 45350, 45358, - 45366, 45374, 45382, 45393, 25285, 45398, 45401, 45408, 45412, 45418, - 45422, 45428, 45433, 45439, 45444, 45449, 45453, 45457, 45465, 45470, - 45475, 45485, 45491, 45504, 45510, 45516, 45522, 45525, 45532, 45537, - 45543, 45548, 19522, 903, 45553, 45556, 45559, 45562, 35916, 35922, - 45565, 35928, 35941, 35947, 35953, 45571, 35959, 35965, 45577, 45583, 18, - 45591, 45598, 45602, 45606, 45614, 36751, 45618, 45622, 45629, 45634, - 45638, 45643, 45649, 45654, 45660, 45665, 45669, 45673, 45677, 45682, - 45686, 45691, 45695, 45699, 45706, 45711, 45715, 45719, 45724, 45728, - 45733, 45737, 45741, 45746, 45752, 18091, 18096, 45757, 45761, 45764, - 45770, 45774, 45778, 24286, 45783, 45787, 45793, 45800, 45806, 45811, - 38747, 45821, 45826, 45834, 45838, 45841, 36766, 45845, 4620, 45850, - 45855, 45859, 45864, 45868, 45873, 15494, 45884, 45888, 45891, 45895, - 45900, 45904, 45909, 45914, 45918, 45922, 45926, 45929, 45933, 45936, - 45941, 45946, 45951, 45956, 45961, 45966, 8415, 15510, 45971, 45974, - 45980, 45985, 45991, 45996, 46002, 46007, 46013, 46018, 46024, 46030, - 46036, 46041, 46045, 46049, 46056, 46065, 46081, 46097, 46107, 32173, - 46114, 46118, 46123, 46128, 46132, 46136, 41730, 46142, 46147, 46151, - 46158, 46163, 46168, 46172, 46175, 46179, 46185, 31025, 46189, 24599, - 46194, 46201, 46209, 46215, 46222, 46230, 46236, 46240, 46245, 46251, - 46259, 46264, 46268, 46277, 10768, 46285, 46289, 46297, 46304, 46309, - 46314, 46319, 46323, 46326, 46332, 46336, 46339, 46343, 46350, 46355, - 46359, 46365, 46369, 46375, 46380, 46385, 30416, 35979, 46390, 46399, - 46407, 46413, 46425, 46438, 46452, 46459, 46465, 46471, 46476, 46484, - 46487, 46489, 46496, 46503, 46509, 46513, 8414, 46516, 46520, 46524, - 46529, 46533, 46537, 46540, 46544, 46558, 26516, 46577, 46590, 46603, - 46616, 26534, 46631, 2732, 46646, 46652, 46656, 46666, 46670, 46674, - 46679, 46683, 46690, 46695, 46699, 46706, 46712, 46717, 46723, 46733, - 46745, 46756, 46761, 46768, 46772, 46776, 46779, 46787, 18589, 4039, - 46792, 18124, 46805, 46812, 46819, 46825, 46829, 46833, 46838, 46844, - 46849, 46855, 46859, 46863, 46866, 46871, 46875, 46880, 46885, 46890, - 46895, 46900, 46905, 46910, 46915, 46920, 8469, 18135, 46925, 46929, - 46935, 46944, 46949, 46958, 46965, 41566, 46971, 46976, 46980, 46987, - 46992, 46999, 47005, 47009, 47012, 47016, 47021, 2810, 47028, 47035, - 47039, 47042, 47047, 47052, 47058, 47063, 47068, 47072, 47077, 47087, - 47092, 47098, 47103, 44973, 47109, 47115, 47125, 47130, 47135, 47139, - 47144, 7926, 7938, 47149, 47152, 47159, 47165, 47174, 9963, 39315, 47182, - 47186, 47190, 36814, 47198, 47209, 47217, 41778, 47224, 47229, 47234, - 47245, 47252, 47263, 36838, 24616, 47271, 1022, 47276, 15917, 47282, - 32257, 47288, 47293, 47303, 47312, 47319, 47325, 47329, 47332, 47339, - 47345, 47352, 47358, 47368, 47376, 47382, 47388, 47393, 47397, 47404, - 47409, 47415, 47422, 47428, 46525, 47433, 47437, 15959, 15968, 15977, - 15986, 15995, 16024, 620, 16033, 47443, 47448, 47451, 47457, 47465, 1315, - 47470, 47474, 47479, 47484, 47489, 47496, 47502, 47506, 47511, 47517, - 47521, 35989, 47526, 47531, 47540, 47547, 47557, 47563, 32301, 47580, - 47589, 47597, 47603, 47608, 47615, 47621, 47629, 47638, 47646, 47654, - 47660, 47664, 47669, 47677, 33386, 36847, 47683, 47702, 18492, 47716, - 47732, 47746, 47752, 47757, 47762, 47767, 47773, 36853, 47778, 47781, - 47788, 47795, 47804, 47809, 47813, 420, 3100, 47820, 47825, 47830, 31394, - 47618, 47834, 47839, 47847, 47851, 47854, 47859, 47865, 47871, 47876, - 47880, 32374, 47883, 47888, 47892, 47895, 47900, 47904, 47909, 47914, - 47918, 47923, 47927, 47931, 47935, 24282, 24293, 47940, 47945, 47951, - 47956, 47962, 47968, 30981, 47973, 47977, 47980, 47986, 47991, 47996, - 48001, 48006, 48011, 48016, 48021, 48026, 48032, 48038, 24379, 18795, - 48043, 48048, 48053, 48058, 48063, 48068, 48073, 48078, 450, 68, 36006, - 36011, 36016, 36022, 36027, 36032, 48083, 36036, 48087, 48091, 48095, - 36041, 36047, 48109, 36058, 36063, 48117, 48122, 36069, 48127, 48132, - 48141, 48146, 48151, 48160, 48166, 48172, 48178, 36086, 48191, 48200, - 48206, 36090, 48210, 36095, 48215, 36100, 36105, 48218, 48223, 48227, - 48233, 15735, 48240, 15745, 48247, 48252, 36110, 48256, 48261, 48266, - 48271, 48276, 48280, 48285, 48290, 48296, 48301, 48306, 48312, 48318, - 48323, 48327, 48332, 48337, 48342, 48346, 48351, 48356, 48361, 48367, - 48373, 48379, 48384, 48388, 48393, 48397, 36114, 36119, 36124, 48401, - 48405, 48410, 48414, 48426, 36129, 36135, 36141, 36153, 48432, 29949, - 48436, 48441, 48445, 48450, 48457, 48462, 48467, 48472, 48476, 48480, - 48490, 48495, 48500, 48504, 48508, 48511, 48519, 48524, 36201, 48528, - 1407, 48534, 48539, 48545, 48553, 48557, 48566, 48574, 48578, 48582, - 48590, 48596, 48604, 48620, 48624, 48628, 48632, 48637, 48643, 48658, - 36238, 1711, 14075, 48662, 1294, 1309, 48674, 48682, 48689, 48694, 48701, - 48706, 10452, 963, 2575, 11882, 48713, 10350, 48718, 48721, 48730, 1202, - 48735, 46696, 48742, 48751, 48756, 48760, 48768, 25915, 2631, 48775, - 12382, 48785, 48791, 2371, 2381, 48800, 48809, 48819, 48830, 3508, 39689, - 48835, 4234, 4245, 19560, 1207, 48839, 48847, 48854, 48859, 48863, 48867, - 48872, 27524, 47023, 11973, 48880, 48889, 48898, 48906, 48919, 48926, - 48937, 48942, 48955, 48968, 48980, 48992, 49004, 49015, 49028, 49039, - 49050, 49060, 49068, 49076, 49088, 49100, 49111, 49120, 49128, 49135, - 49147, 49154, 49160, 49169, 49175, 49182, 49195, 49200, 49210, 49215, - 49221, 49226, 43978, 49230, 46328, 49237, 49244, 49252, 49259, 2588, - 49266, 49277, 49287, 49296, 49304, 49314, 49322, 49331, 49341, 49350, - 49355, 49361, 49367, 4083, 49378, 49388, 49397, 49406, 49414, 49424, - 49432, 49441, 49446, 49451, 49456, 1636, 47, 49464, 49472, 49483, 49494, - 19181, 49504, 49508, 49515, 49521, 49526, 49530, 49541, 49551, 49560, - 49571, 19599, 19604, 49576, 49585, 49590, 49600, 49605, 49613, 49621, - 49628, 49634, 1598, 259, 49638, 49644, 49649, 49652, 2119, 2597, 49660, - 49664, 49667, 1452, 49673, 16224, 1212, 49678, 49691, 2721, 2742, 49705, - 49717, 49729, 2756, 2773, 2788, 2804, 2821, 49743, 49755, 2836, 49769, - 1218, 1224, 1230, 12253, 49774, 49779, 49784, 49788, 49803, 49818, 49833, - 49848, 49863, 49878, 49893, 49908, 49923, 49938, 49953, 49968, 49983, - 49998, 50013, 50028, 50043, 50058, 50073, 50088, 50103, 50118, 50133, - 50148, 50163, 50178, 50193, 50208, 50223, 50238, 50253, 50268, 50283, - 50298, 50313, 50328, 50343, 50358, 50373, 50388, 50403, 50418, 50433, - 50448, 50463, 50478, 50493, 50508, 50523, 50538, 50553, 50568, 50583, - 50598, 50613, 50628, 50643, 50658, 50673, 50688, 50703, 50718, 50733, - 50748, 50763, 50778, 50793, 50808, 50823, 50838, 50853, 50868, 50883, - 50898, 50913, 50928, 50943, 50958, 50973, 50988, 51003, 51018, 51033, - 51048, 51063, 51078, 51093, 51108, 51123, 51138, 51153, 51168, 51183, - 51198, 51213, 51228, 51243, 51258, 51273, 51288, 51303, 51318, 51333, - 51348, 51363, 51378, 51393, 51408, 51423, 51438, 51453, 51468, 51483, - 51498, 51513, 51528, 51543, 51558, 51573, 51588, 51603, 51618, 51633, - 51648, 51663, 51678, 51693, 51708, 51723, 51738, 51753, 51768, 51783, - 51798, 51813, 51828, 51843, 51858, 51873, 51888, 51903, 51918, 51933, - 51948, 51963, 51978, 51993, 52008, 52023, 52038, 52053, 52068, 52083, - 52098, 52113, 52128, 52143, 52158, 52173, 52188, 52203, 52218, 52233, - 52248, 52263, 52278, 52293, 52308, 52323, 52338, 52353, 52368, 52383, - 52398, 52413, 52428, 52443, 52458, 52473, 52488, 52503, 52518, 52533, - 52548, 52563, 52578, 52593, 52608, 52623, 52638, 52653, 52668, 52683, - 52698, 52713, 52728, 52743, 52758, 52773, 52788, 52803, 52818, 52833, - 52848, 52863, 52878, 52893, 52908, 52923, 52938, 52953, 52968, 52983, - 52998, 53013, 53028, 53043, 53058, 53073, 53088, 53103, 53118, 53133, - 53148, 53163, 53178, 53193, 53208, 53223, 53238, 53253, 53268, 53283, - 53298, 53313, 53328, 53343, 53358, 53373, 53388, 53403, 53418, 53433, - 53448, 53463, 53478, 53493, 53508, 53523, 53538, 53553, 53568, 53583, - 53598, 53613, 53628, 53643, 53658, 53673, 53688, 53703, 53718, 53733, - 53748, 53763, 53778, 53793, 53808, 53823, 53838, 53853, 53868, 53883, - 53898, 53913, 53928, 53943, 53958, 53973, 53988, 54003, 54018, 54033, - 54048, 54063, 54078, 54093, 54108, 54123, 54138, 54153, 54168, 54183, - 54198, 54213, 54228, 54243, 54258, 54273, 54288, 54303, 54318, 54333, - 54348, 54363, 54378, 54393, 54408, 54423, 54438, 54453, 54468, 54483, - 54498, 54513, 54528, 54543, 54558, 54573, 54588, 54603, 54618, 54633, - 54648, 54663, 54678, 54693, 54708, 54723, 54738, 54753, 54768, 54783, - 54798, 54813, 54828, 54843, 54858, 54873, 54888, 54903, 54918, 54933, - 54948, 54963, 54978, 54993, 55008, 55023, 55038, 55053, 55068, 55083, - 55098, 55113, 55128, 55143, 55158, 55173, 55188, 55203, 55218, 55233, - 55248, 55263, 55278, 55293, 55308, 55323, 55338, 55353, 55368, 55383, - 55398, 55413, 55428, 55443, 55458, 55473, 55488, 55503, 55518, 55533, - 55548, 55563, 55578, 55593, 55608, 55623, 55638, 55653, 55668, 55683, - 55698, 55713, 55728, 55743, 55758, 55773, 55788, 55803, 55818, 55833, - 55848, 55863, 55878, 55893, 55908, 55923, 55938, 55953, 55968, 55983, - 55998, 56013, 56028, 56043, 56058, 56073, 56088, 56103, 56118, 56133, - 56148, 56163, 56178, 56193, 56208, 56223, 56238, 56253, 56268, 56283, - 56298, 56313, 56328, 56343, 56358, 56373, 56388, 56403, 56418, 56433, - 56448, 56463, 56478, 56493, 56508, 56523, 56538, 56553, 56568, 56583, - 56598, 56613, 56628, 56643, 56658, 56673, 56688, 56703, 56718, 56733, - 56748, 56763, 56778, 56793, 56808, 56823, 56838, 56853, 56868, 56883, - 56898, 56913, 56928, 56943, 56958, 56973, 56988, 57003, 57018, 57033, - 57048, 57063, 57078, 57093, 57108, 57123, 57138, 57153, 57168, 57183, - 57198, 57213, 57228, 57243, 57258, 57273, 57288, 57303, 57318, 57333, - 57348, 57363, 57378, 57393, 57408, 57423, 57438, 57453, 57468, 57483, - 57498, 57513, 57528, 57543, 57558, 57573, 57588, 57603, 57619, 57635, - 57651, 57667, 57683, 57699, 57715, 57731, 57747, 57763, 57779, 57795, - 57811, 57827, 57843, 57859, 57875, 57891, 57907, 57923, 57939, 57955, - 57971, 57987, 58003, 58019, 58035, 58051, 58067, 58083, 58099, 58115, - 58131, 58147, 58163, 58179, 58195, 58211, 58227, 58243, 58259, 58275, - 58291, 58307, 58323, 58339, 58355, 58371, 58387, 58403, 58419, 58435, - 58451, 58467, 58483, 58499, 58515, 58531, 58547, 58563, 58579, 58595, - 58611, 58627, 58643, 58659, 58675, 58691, 58707, 58723, 58739, 58755, - 58771, 58787, 58803, 58819, 58835, 58851, 58867, 58883, 58899, 58915, - 58931, 58947, 58963, 58979, 58995, 59011, 59027, 59043, 59059, 59075, - 59091, 59107, 59123, 59139, 59155, 59171, 59187, 59203, 59219, 59235, - 59251, 59267, 59283, 59299, 59315, 59331, 59347, 59363, 59379, 59395, - 59411, 59427, 59443, 59459, 59475, 59491, 59507, 59523, 59539, 59555, - 59571, 59587, 59603, 59619, 59635, 59651, 59667, 59683, 59699, 59715, - 59731, 59747, 59763, 59779, 59795, 59811, 59827, 59843, 59859, 59875, - 59891, 59907, 59923, 59939, 59955, 59971, 59987, 60003, 60019, 60035, - 60051, 60067, 60083, 60099, 60115, 60131, 60147, 60163, 60179, 60195, - 60211, 60227, 60243, 60259, 60275, 60291, 60307, 60323, 60339, 60355, - 60371, 60387, 60403, 60419, 60435, 60451, 60467, 60483, 60499, 60515, - 60531, 60547, 60563, 60579, 60595, 60611, 60627, 60643, 60659, 60675, - 60691, 60707, 60723, 60739, 60755, 60771, 60787, 60803, 60819, 60835, - 60851, 60867, 60883, 60899, 60915, 60931, 60947, 60963, 60979, 60995, - 61011, 61027, 61043, 61059, 61075, 61091, 61107, 61123, 61139, 61155, - 61171, 61187, 61203, 61219, 61235, 61251, 61267, 61283, 61299, 61315, - 61331, 61347, 61363, 61379, 61395, 61411, 61427, 61443, 61459, 61475, - 61491, 61507, 61523, 61539, 61555, 61571, 61587, 61603, 61619, 61635, - 61651, 61667, 61683, 61699, 61715, 61731, 61747, 61763, 61779, 61795, - 61811, 61827, 61843, 61859, 61875, 61891, 61907, 61923, 61939, 61955, - 61971, 61987, 62003, 62019, 62035, 62051, 62067, 62083, 62099, 62115, - 62131, 62147, 62163, 62179, 62195, 62211, 62227, 62243, 62259, 62275, - 62291, 62307, 62323, 62339, 62355, 62371, 62387, 62403, 62419, 62435, - 62451, 62467, 62483, 62499, 62515, 62531, 62547, 62563, 62579, 62595, - 62611, 62627, 62643, 62659, 62675, 62691, 62707, 62723, 62739, 62755, - 62771, 62787, 62803, 62819, 62835, 62851, 62867, 62883, 62899, 62915, - 62931, 62947, 62963, 62979, 62995, 63011, 63027, 63043, 63059, 63075, - 63091, 63107, 63123, 63139, 63155, 63171, 63187, 63203, 63219, 63235, - 63251, 63267, 63283, 63299, 63315, 63331, 63347, 63363, 63379, 63395, - 63411, 63427, 63443, 63459, 63475, 63491, 63507, 63523, 63539, 63555, - 63571, 63587, 63603, 63619, 63635, 63651, 63667, 63683, 63699, 63715, - 63731, 63747, 63763, 63779, 63795, 63811, 63827, 63843, 63859, 63875, - 63891, 63907, 63923, 63939, 63955, 63971, 63987, 64003, 64019, 64035, - 64051, 64067, 64083, 64099, 64115, 64131, 64147, 64163, 64179, 64195, - 64211, 64227, 64243, 64259, 64275, 64291, 64307, 64323, 64339, 64355, - 64371, 64387, 64403, 64419, 64435, 64451, 64467, 64483, 64499, 64515, - 64531, 64547, 64563, 64579, 64595, 64611, 64627, 64643, 64659, 64675, - 64691, 64707, 64723, 64739, 64755, 64771, 64787, 64803, 64819, 64835, - 64851, 64867, 64883, 64899, 64915, 64931, 64947, 64963, 64979, 64995, - 65011, 65027, 65043, 65059, 65075, 65091, 65107, 65123, 65139, 65155, - 65171, 65187, 65203, 65219, 65235, 65251, 65267, 65283, 65299, 65315, - 65331, 65347, 65363, 65379, 65395, 65411, 65427, 65443, 65459, 65475, - 65491, 65507, 65523, 65539, 65555, 65571, 65587, 65603, 65619, 65635, - 65651, 65667, 65683, 65699, 65715, 65731, 65747, 65763, 65779, 65795, - 65811, 65827, 65843, 65859, 65875, 65891, 65907, 65923, 65939, 65955, - 65971, 65987, 66003, 66019, 66035, 66051, 66067, 66083, 66099, 66115, - 66131, 66147, 66163, 66179, 66195, 66211, 66227, 66243, 66259, 66275, - 66284, 66299, 17090, 66308, 66313, 66319, 66325, 66335, 66343, 17343, - 18025, 11298, 66356, 1460, 1464, 66364, 4163, 31509, 7863, 66370, 66375, - 66380, 66385, 66390, 66396, 66401, 66407, 66412, 66418, 66423, 66428, - 66433, 66438, 66444, 66449, 66454, 66459, 66464, 66469, 66474, 66479, - 66485, 66490, 66496, 66503, 2635, 66508, 66514, 9347, 66518, 66523, - 66530, 66538, 4174, 4179, 4184, 4189, 65, 66542, 66548, 66553, 66558, - 66562, 66567, 66571, 66575, 12325, 66579, 66589, 66602, 66613, 66626, - 66633, 66639, 66647, 11807, 66654, 66659, 66665, 66671, 66677, 66682, - 66687, 66692, 66697, 66701, 66706, 66711, 66716, 66722, 66728, 66734, - 66739, 66743, 66748, 66753, 66757, 66762, 66767, 66772, 66776, 12341, - 12352, 12357, 1503, 66780, 66786, 1508, 19026, 66791, 19035, 66796, - 66802, 66807, 1539, 66813, 1545, 1551, 12387, 66818, 66827, 66835, 66843, - 66850, 66854, 66858, 66864, 66869, 35645, 66874, 66881, 66888, 66893, - 66897, 66901, 66910, 66915, 66920, 66925, 1556, 264, 66930, 66934, 19161, - 984, 66938, 66945, 66950, 66954, 19197, 1560, 44135, 66957, 66962, 66972, - 66981, 66986, 66990, 66996, 1565, 46977, 67001, 67010, 67016, 67021, - 67026, 12626, 12632, 67032, 67044, 67061, 67078, 67095, 67112, 67129, - 67146, 67163, 67180, 67197, 67214, 67231, 67248, 67265, 67282, 67299, - 67316, 67333, 67350, 67367, 67384, 67401, 67418, 67435, 67452, 67469, - 67486, 67503, 67520, 67537, 67554, 67571, 67588, 67605, 67622, 67639, - 67656, 67673, 67690, 67707, 67724, 67741, 67758, 67775, 67792, 67809, - 67826, 67843, 67860, 67877, 67888, 67898, 67903, 1570, 67907, 67912, - 67918, 67923, 67928, 67935, 10369, 1575, 67941, 67950, 31888, 67955, - 67966, 12643, 67976, 67981, 67987, 67992, 67999, 68005, 68010, 1580, - 19491, 68015, 68021, 12653, 68027, 68032, 68037, 68042, 68047, 68052, - 68057, 68062, 1585, 4638, 68067, 68072, 68078, 68083, 68088, 68093, - 68098, 68103, 68108, 68113, 68118, 68124, 68130, 68136, 68141, 68145, - 68150, 68155, 68159, 68164, 68169, 68174, 68179, 68183, 68188, 68194, - 68199, 68204, 68208, 68213, 68218, 68224, 68229, 68234, 68240, 68246, - 68251, 68255, 68260, 68265, 68270, 68274, 68279, 68284, 68289, 68295, - 68301, 68306, 68310, 68314, 68319, 68324, 68329, 33580, 68333, 68338, - 68343, 68349, 68354, 68359, 68363, 68368, 68373, 68379, 68384, 68389, - 68395, 68401, 68406, 68410, 68415, 68420, 68424, 68429, 68434, 68439, - 68445, 68451, 68456, 68460, 68465, 68470, 68474, 68479, 68484, 68489, - 68494, 68498, 68501, 68504, 68509, 68514, 36365, 68521, 68529, 68535, - 3840, 31831, 68548, 68555, 68561, 68567, 4014, 68572, 12795, 68578, - 68588, 68603, 68611, 12800, 68622, 68627, 68638, 68650, 68662, 68674, - 2827, 68686, 68691, 68703, 68707, 68713, 68719, 68724, 68733, 68740, - 68745, 68750, 68755, 68760, 68765, 68770, 1602, 18664, 68775, 68780, - 47043, 68784, 68788, 68793, 68797, 19639, 68802, 68805, 68810, 68818, - 68826, 1606, 12836, 12842, 1611, 68834, 68841, 68846, 68855, 68865, - 68872, 68877, 68882, 1616, 68889, 68894, 19759, 68898, 68903, 68910, - 68916, 68920, 68933, 68939, 68950, 68960, 68967, 19781, 10263, 10270, - 4248, 4254, 68974, 1621, 68979, 68988, 68994, 69002, 69009, 69015, 69022, - 69034, 69040, 69045, 69052, 69064, 69075, 69084, 69094, 69104, 4142, - 69112, 35439, 35448, 19821, 69125, 69130, 69135, 69140, 69145, 69150, - 69155, 1626, 1630, 69160, 69164, 69167, 69178, 69183, 1640, 69191, 69196, - 69201, 19880, 69213, 69216, 69222, 69228, 69233, 69241, 1645, 69246, - 69251, 69259, 69267, 69274, 69283, 69291, 69300, 69304, 1650, 69313, - 1655, 24467, 69318, 69325, 69331, 19967, 69339, 69349, 69355, 69360, - 69368, 69375, 69384, 69392, 69402, 69411, 69421, 69430, 69441, 69451, - 69461, 69470, 69480, 69494, 69507, 69516, 69524, 69534, 69543, 69555, - 69566, 69577, 69587, 19259, 69592, 12988, 69601, 69607, 69612, 69619, - 69626, 69632, 18870, 69642, 69648, 69653, 69664, 69671, 69678, 69683, - 69691, 13005, 13010, 69699, 69705, 69709, 4232, 4243, 20043, 47131, - 69717, 69723, 69728, 69736, 69743, 14056, 69748, 69754, 69760, 1666, - 69765, 69768, 69774, 69779, 69784, 69789, 69794, 69799, 69804, 69809, - 69814, 69820, 69826, 1373, 69831, 69836, 69841, 69847, 69852, 69857, - 69862, 69867, 69872, 69877, 1675, 13, 69883, 69887, 69892, 69896, 69900, - 69904, 36646, 69909, 26735, 69914, 69919, 69923, 69926, 69930, 69934, - 69939, 69943, 69948, 69952, 69958, 40157, 40162, 40167, 69961, 69968, - 69974, 69982, 46749, 69992, 40173, 36910, 36661, 36667, 40189, 36673, - 69997, 70002, 70006, 36943, 70013, 70016, 70020, 70028, 70035, 70040, - 70043, 70048, 70053, 70057, 70061, 70064, 70074, 70086, 70093, 70099, - 36678, 70106, 38561, 70109, 9364, 1108, 70112, 70116, 70121, 4057, 70125, - 70128, 15778, 70135, 70142, 70155, 70163, 70172, 70181, 70187, 70192, - 70202, 70215, 70227, 70234, 70239, 70248, 70261, 41825, 70279, 70284, - 70291, 70297, 70302, 844, 70307, 70315, 70322, 70329, 31335, 866, 70335, - 70341, 70351, 70359, 70365, 70370, 36697, 6637, 36711, 70374, 70384, - 70389, 70397, 70407, 70422, 70428, 70434, 36721, 70439, 35787, 70443, - 70448, 70455, 70460, 70464, 70469, 70477, 19824, 70484, 70489, 70493, - 6678, 36747, 70497, 70503, 330, 70513, 70520, 70527, 70533, 70540, 70545, - 70554, 15409, 66966, 66976, 70560, 70568, 70572, 70576, 70580, 70584, - 70589, 70593, 70599, 70607, 70612, 70617, 70624, 70629, 70633, 70638, - 70642, 70646, 70652, 70658, 70663, 70667, 70672, 70676, 36871, 70680, - 36877, 36883, 70685, 70691, 70698, 70703, 70707, 35804, 19478, 70710, - 70714, 70719, 70726, 70732, 70736, 70741, 46345, 70747, 70751, 70758, - 70762, 70767, 70773, 70779, 70785, 70797, 70806, 70816, 70822, 70829, - 70834, 70839, 70843, 70846, 70852, 70859, 70864, 70869, 70876, 70883, - 70890, 70896, 70901, 70906, 70914, 36888, 2465, 70919, 70924, 70930, - 70935, 70941, 70946, 70951, 70956, 70962, 36909, 70967, 70973, 70979, - 70985, 36979, 70990, 70995, 71000, 36990, 71005, 71010, 71015, 71021, - 71027, 36995, 71032, 71037, 71042, 37050, 37056, 71047, 71052, 37061, - 37083, 32164, 37089, 37093, 71057, 13757, 71061, 71069, 71075, 71083, - 71090, 71096, 71106, 71112, 71119, 12225, 37107, 71125, 71138, 71147, - 71153, 71162, 71168, 71174, 71181, 27078, 71189, 71196, 71206, 71214, - 71217, 37051, 71222, 71229, 71234, 71238, 71242, 71247, 71251, 4371, - 71256, 71261, 71266, 40251, 40256, 71270, 40270, 71275, 40275, 71280, - 71286, 40287, 40293, 40299, 71291, 71297, 25970, 71308, 71311, 71323, - 71331, 37130, 71335, 71344, 71354, 71363, 37140, 71368, 71375, 71384, - 71390, 71398, 71405, 71412, 6729, 4978, 71417, 37062, 71423, 71426, - 71432, 71439, 71444, 71449, 26982, 71453, 71459, 71465, 71470, 71475, - 71479, 71485, 71491, 38445, 71496, 41440, 43245, 43251, 37171, 37176, - 71500, 71504, 71508, 71511, 71524, 71530, 71534, 71537, 71542, 38814, - 71546, 35809, 24408, 71552, 6658, 6666, 10069, 71555, 71560, 71565, - 71570, 71575, 71580, 71585, 71590, 71595, 71600, 71606, 71611, 71616, - 71622, 71627, 71632, 71637, 71642, 71647, 71652, 71658, 71663, 71669, - 71674, 71679, 71684, 71689, 71694, 71699, 71704, 71709, 71714, 71719, - 71725, 71730, 71735, 71740, 71745, 71750, 71755, 71761, 71766, 71771, - 71776, 71781, 71786, 71791, 71796, 71801, 71806, 71812, 71817, 71822, - 71827, 71832, 71838, 71844, 71849, 71855, 71860, 71865, 71870, 71875, - 71880, 1453, 156, 71885, 71889, 71893, 71897, 28865, 71901, 71905, 71910, - 71914, 71919, 71923, 71928, 71933, 71938, 71942, 71946, 71951, 71955, - 15488, 71960, 71964, 71971, 71981, 17688, 71990, 71999, 72003, 72008, - 72013, 72017, 72021, 28653, 3183, 72025, 72031, 20325, 72035, 72044, - 72052, 72058, 72063, 72075, 72087, 72092, 72096, 72101, 72105, 72111, - 72117, 72122, 72132, 72142, 72148, 72156, 72161, 72165, 72171, 72176, - 72183, 72189, 72194, 72203, 72212, 72216, 18204, 72219, 72228, 72236, - 72248, 72259, 72270, 72279, 72283, 72292, 72300, 72310, 72318, 72325, - 72335, 72341, 72346, 72353, 72362, 72368, 72373, 72380, 72386, 72397, 60, - 35582, 72403, 30247, 30257, 72409, 72417, 72424, 72430, 72434, 72444, - 72455, 72463, 72472, 72477, 72482, 72487, 72491, 72495, 20272, 72503, - 72507, 72513, 72523, 72530, 72536, 72542, 40350, 72546, 72548, 72551, - 72557, 72561, 72572, 72582, 72588, 72595, 72602, 15425, 72610, 72616, - 72625, 72634, 72640, 11169, 72646, 72652, 72657, 72662, 72669, 72674, - 72681, 72687, 72692, 72700, 72713, 72722, 72731, 69456, 69466, 72741, - 72747, 72756, 72762, 72768, 72775, 72782, 72789, 72796, 72803, 72808, - 72812, 72816, 72819, 72829, 72833, 72845, 9733, 72854, 72865, 72870, - 72874, 69475, 72880, 72887, 72896, 72904, 72912, 72917, 72921, 72926, - 72931, 72941, 72949, 72961, 72966, 72970, 72974, 72980, 72988, 72995, - 73007, 73015, 73026, 73033, 73039, 73049, 73055, 73059, 73068, 73077, - 73084, 73090, 73095, 73099, 73103, 73107, 73116, 73125, 73134, 73140, - 73146, 73152, 73157, 73164, 73170, 73178, 73185, 73191, 14520, 73196, - 73202, 73206, 16579, 73210, 73215, 73225, 73230, 73239, 73245, 73251, - 73259, 73266, 73270, 73274, 73281, 73287, 73295, 73302, 73308, 73319, - 73323, 73327, 73331, 73334, 73340, 73345, 73350, 73354, 73358, 73367, - 73375, 73382, 73388, 73395, 27702, 46474, 73400, 73408, 73412, 73416, - 73419, 73427, 73434, 73440, 73449, 73457, 73463, 73468, 73472, 73477, - 73482, 73486, 73490, 73494, 73499, 73508, 73512, 73519, 43354, 73523, - 73529, 73537, 73541, 73547, 73555, 73561, 73566, 73577, 73585, 73591, - 73600, 26117, 73608, 73615, 73622, 73629, 73636, 73643, 49963, 15240, - 73650, 73657, 73662, 40386, 4603, 73668, 73673, 73678, 73684, 73690, - 73696, 73701, 73706, 73711, 73716, 73722, 73727, 73733, 73738, 73744, - 73749, 73754, 73759, 73764, 73769, 73774, 73779, 73785, 73790, 73796, - 73801, 73806, 73811, 73816, 73821, 73826, 73832, 73837, 73842, 73847, - 73852, 73857, 73862, 73867, 73872, 73877, 73882, 73888, 73893, 73898, - 73903, 73908, 73913, 73918, 73923, 73928, 73934, 73939, 73944, 73949, - 73954, 73959, 73964, 73969, 73974, 73979, 73984, 73989, 73994, 74000, - 1830, 282, 74005, 44253, 74009, 74012, 74017, 74021, 74024, 3554, 74029, - 74034, 74038, 74047, 74058, 74075, 74093, 74101, 72908, 74108, 74111, - 74121, 74128, 74137, 74153, 74162, 74172, 74177, 74190, 74200, 74209, - 74217, 74231, 74239, 74248, 74252, 74255, 74262, 74268, 74279, 74286, - 74298, 74309, 74320, 74329, 74336, 1213, 772, 74346, 2668, 74350, 74355, - 74364, 1013, 8806, 23861, 74372, 74380, 74394, 74407, 74411, 74416, - 74421, 74426, 74432, 74438, 74443, 9356, 17731, 74448, 74452, 74460, - 9793, 74465, 74471, 74480, 74488, 1683, 12849, 1023, 4286, 74492, 74496, - 74505, 74515, 2419, 31059, 74524, 74530, 19731, 31074, 74536, 4451, - 13231, 74542, 74549, 69173, 74553, 74557, 74563, 74568, 74573, 3773, 160, - 3799, 74578, 74590, 74594, 74598, 74604, 74609, 31908, 74613, 13219, - 2862, 4, 74618, 74628, 74639, 74650, 74660, 74666, 74677, 74684, 74690, - 74696, 74704, 74711, 74717, 74727, 74737, 74747, 74756, 27065, 1225, - 74761, 74765, 74769, 74775, 74779, 2885, 2891, 9353, 2274, 74783, 74787, - 74796, 74804, 74815, 74823, 74831, 74837, 74842, 74853, 74864, 74872, - 74878, 74883, 10978, 74893, 74901, 74905, 74909, 74914, 74918, 74930, - 32357, 17633, 74937, 74947, 74953, 74959, 7739, 11080, 74969, 74980, - 74991, 75001, 75010, 75014, 75021, 1015, 1095, 75031, 75036, 75044, - 68899, 75052, 75057, 75068, 75075, 75089, 16388, 504, 75099, 75106, - 75110, 75114, 75122, 75131, 75139, 19776, 75145, 75159, 75166, 75172, - 75180, 75189, 75196, 75206, 75214, 75221, 75229, 75236, 4250, 116, 75244, - 75255, 75259, 75271, 75277, 13427, 204, 75282, 10401, 75287, 2930, 75291, - 75298, 75304, 75315, 75325, 75333, 75340, 9744, 75347, 75356, 75364, - 4331, 75377, 4348, 75381, 75386, 75392, 75397, 75402, 75407, 2935, 540, - 75413, 75426, 75430, 75435, 2940, 1829, 892, 75439, 4352, 75447, 75453, - 75457, 783, 75467, 75476, 75481, 3790, 75485, 17382, 17389, 53325, 75489, - 4383, 4260, 15118, 75497, 75504, 75509, 27129, 75513, 75520, 75526, - 75531, 75536, 17402, 192, 75541, 75553, 75559, 75567, 2952, 1720, 75575, - 75577, 75582, 75587, 75592, 75598, 75603, 75608, 75613, 75618, 75623, - 75628, 75634, 75639, 75644, 75649, 75654, 75659, 75664, 75669, 75674, - 75680, 75685, 75690, 75695, 75701, 75706, 75712, 75717, 75722, 75727, - 75732, 75737, 75742, 75747, 75753, 75758, 75764, 75769, 75774, 75779, - 75784, 75789, 75794, 75799, 75804, 9425, 9438, 4399, 4404, 4409, 4414, - 26, 75810, 75816, 75821, 75826, 75831, 75837, 75842, 75846, 75850, 75855, - 75861, 75865, 75871, 75876, 75881, 75887, 75892, 75896, 75901, 75906, - 75910, 75913, 75915, 75919, 75922, 75929, 75934, 75938, 75943, 75947, - 75951, 75955, 75964, 75968, 37404, 75971, 37409, 75978, 75983, 37414, - 75992, 76001, 37420, 76006, 37425, 76015, 76020, 13470, 76024, 76029, - 76034, 37430, 76038, 76047, 48168, 76051, 76054, 76058, 9024, 76064, - 76067, 76072, 76077, 76081, 4072, 37435, 76084, 76088, 76091, 76102, - 76107, 76111, 76117, 76125, 76138, 76142, 76150, 76159, 76165, 76170, - 76176, 76180, 76186, 76192, 76200, 76205, 76209, 76216, 76222, 76230, - 76239, 76247, 37438, 76254, 76264, 76273, 76281, 76292, 76305, 76310, - 76315, 76319, 76328, 76334, 76341, 76354, 76366, 76377, 76389, 76396, - 76405, 76414, 76423, 76430, 76436, 76443, 76451, 76458, 76466, 76475, - 76483, 76490, 76498, 76507, 76515, 76524, 76534, 76543, 76551, 76558, - 76566, 76575, 76583, 76592, 76602, 76611, 76619, 76628, 76638, 76647, - 76657, 76668, 76678, 76687, 76695, 76702, 76710, 76719, 76727, 76736, - 76746, 76755, 76763, 76772, 76782, 76791, 76801, 76812, 76822, 76831, - 76839, 76848, 76858, 76867, 76877, 76888, 76898, 76907, 76917, 76928, - 76938, 76949, 76961, 76972, 76982, 76991, 76999, 77006, 77014, 77023, - 77031, 77040, 77050, 77059, 77067, 77076, 77086, 77095, 77105, 77116, - 77126, 77135, 77143, 77152, 77162, 77171, 77181, 77192, 77202, 77211, - 77221, 77232, 77242, 77253, 77265, 77276, 77286, 77295, 77303, 77312, - 77322, 77331, 77341, 77352, 77362, 77371, 77381, 77392, 77402, 77413, - 77425, 77436, 77446, 77455, 77465, 77476, 77486, 77497, 77509, 77520, - 77530, 77541, 77553, 77564, 77576, 77589, 77601, 77612, 77622, 77631, - 77639, 77646, 77654, 77663, 77671, 77680, 77690, 77699, 77707, 77716, - 77726, 77735, 77745, 77756, 77766, 77775, 77783, 77792, 77802, 77811, - 77821, 77832, 77842, 77851, 77861, 77872, 77882, 77893, 77905, 77916, - 77926, 77935, 77943, 77952, 77962, 77971, 77981, 77992, 78002, 78011, - 78021, 78032, 78042, 78053, 78065, 78076, 78086, 78095, 78105, 78116, - 78126, 78137, 78149, 78160, 78170, 78181, 78193, 78204, 78216, 78229, - 78241, 78252, 78262, 78271, 78279, 78288, 78298, 78307, 78317, 78328, - 78338, 78347, 78357, 78368, 78378, 78389, 78401, 78412, 78422, 78431, - 78441, 78452, 78462, 78473, 78485, 78496, 78506, 78517, 78529, 78540, - 78552, 78565, 78577, 78588, 78598, 78607, 78617, 78628, 78638, 78649, - 78661, 78672, 78682, 78693, 78705, 78716, 78728, 78741, 78753, 78764, - 78774, 78785, 78797, 78808, 78820, 78833, 78845, 78856, 78868, 78881, - 78893, 78906, 78920, 78933, 78945, 78956, 78966, 78975, 78983, 78990, - 78995, 78999, 8837, 79006, 79011, 37448, 79017, 79022, 37453, 79028, - 23983, 29812, 79033, 79039, 79047, 79053, 79059, 79066, 79073, 79078, - 79083, 79087, 79092, 79096, 79099, 79103, 79112, 79121, 79129, 79135, - 79147, 79158, 79162, 3245, 8812, 79167, 79170, 79173, 79175, 79179, - 79183, 79187, 79193, 79198, 29875, 79203, 79207, 79210, 79215, 79219, - 79226, 79232, 79236, 6822, 79240, 79245, 37475, 79249, 79256, 79265, - 79273, 79279, 79290, 79298, 79307, 79315, 79322, 79329, 79335, 79346, - 37480, 79351, 79362, 79374, 79382, 79393, 79402, 79410, 79421, 79426, - 79434, 2630, 79439, 39756, 79452, 79456, 79468, 79476, 79481, 79489, - 79500, 20490, 79509, 79515, 79522, 79530, 79536, 37490, 79541, 4377, - 66339, 79548, 79551, 79559, 79572, 79585, 79598, 79611, 79618, 79629, - 79638, 79643, 49780, 49785, 79647, 79651, 79659, 79666, 79675, 79683, - 79689, 79698, 79706, 79713, 79721, 79725, 79734, 79743, 79753, 79766, - 79779, 79789, 37495, 79795, 79802, 79808, 79814, 37501, 79819, 79822, - 79826, 79834, 79843, 49563, 79851, 79860, 79868, 79875, 79883, 79893, - 79902, 79911, 38943, 79920, 79931, 79946, 79956, 10434, 24737, 79965, - 79970, 79975, 79979, 18862, 79984, 79989, 79995, 80000, 80005, 80011, - 80016, 80021, 24697, 80026, 80033, 80041, 80049, 80057, 80062, 80069, - 80076, 80081, 1738, 80085, 80089, 80097, 80105, 37518, 80111, 80117, - 80129, 80135, 80142, 80146, 80153, 80158, 80165, 80171, 80178, 80189, - 80199, 80209, 80221, 80227, 80235, 80241, 80251, 80261, 37545, 80270, - 80279, 80285, 80297, 80308, 80315, 80320, 80324, 80332, 80338, 80343, - 80348, 80355, 80363, 80375, 80385, 80394, 80403, 80411, 80418, 39589, - 27490, 80424, 80429, 80433, 80437, 80442, 80450, 80456, 80467, 80480, - 80485, 80492, 37550, 80497, 80509, 80518, 80526, 80536, 80547, 80560, - 80567, 80576, 80585, 80593, 80598, 80604, 80608, 1442, 80613, 80618, - 80623, 80628, 80634, 80639, 80644, 80650, 80656, 80661, 80665, 80670, - 80675, 80680, 66906, 80685, 80690, 80695, 80700, 80706, 80712, 80717, - 80721, 80726, 18861, 80731, 80737, 80742, 80748, 80753, 80758, 80763, - 80768, 80772, 80778, 80783, 80792, 80797, 80802, 80807, 80812, 80816, - 80823, 80829, 4707, 20088, 3210, 80834, 80838, 80843, 80847, 80851, - 80855, 53580, 80859, 80784, 80861, 80871, 37559, 80874, 80879, 80888, - 80894, 6791, 37564, 80898, 80904, 80909, 80915, 80920, 80924, 80931, - 80936, 80946, 80955, 80959, 80965, 80971, 80977, 80981, 80989, 80996, - 81004, 81012, 37569, 81019, 81022, 81033, 81040, 81046, 81051, 81055, - 81061, 81069, 81076, 81081, 81085, 81094, 81102, 81108, 81113, 37574, - 81120, 26955, 81132, 81138, 81143, 81149, 81156, 81162, 24430, 31532, - 81168, 81173, 81179, 81183, 81195, 80817, 80824, 24629, 81205, 81210, - 81217, 81223, 81230, 81236, 81247, 81252, 81260, 10139, 81265, 81268, - 81274, 81278, 81282, 81285, 81291, 81297, 37291, 4708, 1457, 15537, - 81304, 81310, 81316, 81322, 81328, 81334, 81340, 81346, 81352, 81357, - 81362, 81367, 81372, 81377, 81382, 81387, 81392, 81397, 81402, 81407, - 81412, 81417, 81423, 81428, 81433, 81439, 81444, 81449, 81455, 81461, - 81467, 81473, 81479, 81485, 81491, 81497, 81503, 81508, 81513, 81519, - 81524, 81529, 81535, 81540, 81545, 81550, 81555, 81560, 81565, 81570, - 81575, 81580, 81585, 81590, 81595, 81601, 81606, 81611, 81616, 81622, - 81627, 81632, 81637, 81642, 81648, 81653, 81658, 81663, 81668, 81673, - 81678, 81683, 81688, 81693, 81698, 81703, 81708, 81713, 81718, 81723, - 81728, 81733, 81738, 81743, 81749, 81754, 81759, 81764, 81769, 81774, - 81779, 81784, 979, 169, 81789, 81793, 81797, 81802, 81810, 81814, 81821, - 81829, 81833, 81846, 81854, 81859, 81864, 30310, 81868, 81873, 81877, - 81882, 81886, 81894, 81898, 23991, 81903, 81907, 69713, 81911, 81914, - 81922, 81930, 81938, 81943, 81948, 81955, 81962, 81968, 81974, 81979, - 81986, 81991, 81999, 74399, 82006, 82011, 69485, 82018, 82023, 82027, - 82034, 82040, 82047, 69512, 13542, 82055, 82060, 82065, 82069, 82072, - 82083, 82092, 82098, 82103, 82107, 82117, 82126, 47959, 82130, 82134, - 82141, 82154, 82160, 82168, 82177, 82188, 82199, 82210, 82221, 82230, - 82236, 82245, 82253, 82263, 82276, 82284, 82291, 82302, 82308, 82313, - 82318, 82324, 82334, 82340, 82350, 82358, 82365, 82375, 82384, 80499, - 82392, 82398, 82406, 82412, 72953, 82419, 82424, 82427, 82431, 82437, - 82441, 82444, 82452, 82458, 82464, 82472, 82484, 82496, 82503, 82508, - 82512, 82523, 82531, 82538, 82550, 82558, 82565, 82573, 82580, 82586, - 82591, 82601, 82610, 82618, 82623, 82633, 82642, 48824, 82649, 82653, - 82658, 82666, 82673, 82679, 82683, 82693, 82704, 82712, 82719, 82731, - 82743, 82752, 79442, 82759, 82769, 82781, 82792, 82806, 82814, 82824, - 82831, 82839, 82852, 82864, 82873, 82881, 82891, 82902, 82914, 82923, - 82933, 82943, 82952, 82959, 82968, 82983, 82991, 83001, 83010, 83018, - 83031, 66309, 83046, 83056, 83065, 83077, 83087, 83099, 83110, 83124, - 83138, 83152, 83166, 83180, 83194, 83208, 83222, 83236, 83250, 83264, - 83278, 83292, 83306, 83320, 83334, 83348, 83362, 83376, 83390, 83404, - 83418, 83432, 83446, 83460, 83474, 83488, 83502, 83516, 83530, 83544, - 83558, 83572, 83586, 83600, 83614, 83628, 83642, 83656, 83670, 83684, - 83698, 83712, 83726, 83740, 83754, 83768, 83782, 83796, 83810, 83824, - 83838, 83852, 83866, 83880, 83894, 83908, 83922, 83936, 83950, 83964, - 83978, 83992, 84006, 84020, 84034, 84048, 84062, 84076, 84090, 84104, - 84118, 84132, 84146, 84160, 84174, 84188, 84202, 84216, 84230, 84244, - 84258, 84272, 84286, 84300, 84314, 84328, 84342, 84356, 84370, 84384, - 84398, 84412, 84426, 84440, 84454, 84468, 84482, 84496, 84510, 84524, - 84538, 84552, 84566, 84580, 84594, 84608, 84622, 84636, 84650, 84664, - 84678, 84692, 84706, 84720, 84734, 84748, 84762, 84776, 84790, 84804, - 84818, 84832, 84846, 84860, 84874, 84888, 84902, 84916, 84930, 84944, - 84958, 84972, 84986, 85000, 85014, 85028, 85042, 85056, 85070, 85084, - 85098, 85112, 85126, 85140, 85154, 85168, 85182, 85196, 85210, 85224, - 85238, 85252, 85266, 85280, 85294, 85308, 85322, 85336, 85350, 85364, - 85378, 85392, 85406, 85420, 85434, 85448, 85462, 85476, 85490, 85504, - 85518, 85532, 85546, 85560, 85574, 85588, 85602, 85616, 85630, 85644, - 85658, 85672, 85686, 85700, 85714, 85728, 85742, 85756, 85770, 85784, - 85798, 85812, 85826, 85840, 85854, 85868, 85882, 85896, 85910, 85924, - 85938, 85952, 85966, 85980, 85994, 86008, 86022, 86036, 86050, 86064, - 86078, 86092, 86106, 86120, 86134, 86148, 86162, 86176, 86190, 86204, - 86218, 86232, 86246, 86260, 86274, 86288, 86302, 86316, 86330, 86344, - 86358, 86372, 86386, 86400, 86414, 86428, 86442, 86456, 86470, 86484, - 86498, 86512, 86526, 86540, 86554, 86568, 86582, 86596, 86610, 86624, - 86638, 86652, 86666, 86680, 86694, 86708, 86722, 86736, 86750, 86764, - 86778, 86792, 86806, 86820, 86834, 86848, 86862, 86876, 86890, 86904, - 86918, 86932, 86946, 86960, 86974, 86988, 87002, 87016, 87030, 87044, - 87058, 87072, 87086, 87100, 87114, 87128, 87142, 87156, 87170, 87184, - 87198, 87212, 87226, 87240, 87254, 87268, 87282, 87296, 87310, 87324, - 87338, 87352, 87366, 87380, 87394, 87408, 87422, 87436, 87450, 87464, - 87478, 87492, 87506, 87520, 87534, 87548, 87562, 87576, 87590, 87604, - 87618, 87632, 87646, 87660, 87674, 87688, 87702, 87716, 87730, 87744, - 87758, 87772, 87786, 87800, 87814, 87828, 87842, 87856, 87870, 87884, - 87898, 87912, 87926, 87940, 87954, 87968, 87982, 87996, 88010, 88024, - 88038, 88052, 88066, 88080, 88094, 88108, 88122, 88136, 88150, 88164, - 88178, 88192, 88206, 88220, 88234, 88248, 88262, 88276, 88290, 88304, - 88318, 88332, 88346, 88360, 88374, 88388, 88402, 88416, 88430, 88444, - 88458, 88472, 88486, 88500, 88514, 88528, 88542, 88556, 88570, 88584, - 88598, 88612, 88626, 88640, 88654, 88668, 88682, 88696, 88710, 88724, - 88738, 88752, 88766, 88780, 88794, 88808, 88822, 88836, 88850, 88864, - 88878, 88892, 88906, 88920, 88934, 88948, 88962, 88976, 88990, 89004, - 89018, 89032, 89046, 89060, 89074, 89088, 89102, 89116, 89130, 89144, - 89158, 89172, 89186, 89200, 89214, 89228, 89242, 89256, 89270, 89284, - 89298, 89312, 89326, 89340, 89354, 89368, 89382, 89396, 89410, 89424, - 89438, 89452, 89466, 89480, 89494, 89508, 89522, 89536, 89550, 89564, - 89578, 89592, 89606, 89620, 89634, 89648, 89662, 89676, 89690, 89704, - 89718, 89732, 89746, 89760, 89774, 89788, 89802, 89816, 89830, 89844, - 89858, 89872, 89886, 89900, 89914, 89928, 89942, 89956, 89970, 89984, - 89998, 90012, 90026, 90040, 90054, 90068, 90082, 90096, 90110, 90124, - 90138, 90152, 90166, 90180, 90194, 90208, 90222, 90236, 90250, 90264, - 90278, 90292, 90306, 90320, 90334, 90348, 90362, 90376, 90390, 90404, - 90418, 90432, 90446, 90460, 90474, 90488, 90502, 90516, 90530, 90544, - 90558, 90572, 90586, 90600, 90614, 90628, 90642, 90656, 90670, 90684, - 90698, 90712, 90726, 90740, 90754, 90768, 90782, 90796, 90810, 90824, - 90838, 90852, 90866, 90880, 90894, 90908, 90922, 90936, 90950, 90964, - 90978, 90992, 91006, 91020, 91034, 91048, 91062, 91076, 91090, 91104, - 91118, 91132, 91146, 91160, 91174, 91188, 91202, 91216, 91230, 91244, - 91258, 91272, 91286, 91300, 91314, 91328, 91342, 91356, 91370, 91384, - 91398, 91412, 91426, 91440, 91454, 91468, 91482, 91496, 91510, 91524, - 91538, 91552, 91566, 91580, 91594, 91608, 91622, 91636, 91650, 91664, - 91678, 91692, 91706, 91720, 91734, 91748, 91762, 91776, 91790, 91804, - 91818, 91832, 91846, 91860, 91874, 91888, 91902, 91916, 91930, 91944, - 91958, 91972, 91986, 92000, 92014, 92028, 92042, 92056, 92070, 92084, - 92098, 92112, 92126, 92140, 92154, 92168, 92182, 92196, 92210, 92224, - 92238, 92252, 92266, 92280, 92294, 92308, 92322, 92336, 92350, 92364, - 92378, 92392, 92406, 92420, 92434, 92448, 92462, 92476, 92490, 92504, - 92518, 92532, 92546, 92560, 92574, 92588, 92602, 92616, 92630, 92644, - 92658, 92672, 92686, 92700, 92714, 92728, 92742, 92756, 92770, 92784, - 92798, 92812, 92826, 92840, 92854, 92868, 92882, 92896, 92910, 92924, - 92938, 92952, 92966, 92980, 92994, 93008, 93022, 93036, 93050, 93064, - 93078, 93092, 93106, 93120, 93134, 93148, 93162, 93176, 93190, 93204, - 93218, 93232, 93246, 93260, 93274, 93288, 93302, 93316, 93330, 93344, - 93358, 93372, 93386, 93400, 93414, 93428, 93442, 93456, 93470, 93484, - 93498, 93512, 93526, 93540, 93554, 93568, 93582, 93596, 93610, 93624, - 93638, 93652, 93666, 93680, 93689, 93700, 93711, 93721, 93732, 93740, - 93748, 93754, 93764, 93772, 93778, 33466, 93783, 93789, 93798, 93810, - 93815, 93822, 10992, 20510, 93828, 93837, 93842, 93846, 93853, 93859, - 93864, 93869, 93877, 93885, 93890, 93898, 13996, 93902, 93905, 93907, - 93922, 93935, 93942, 93948, 93959, 93964, 93968, 93973, 93980, 93986, - 93991, 93999, 74993, 75003, 94005, 94012, 94022, 12212, 94029, 94034, - 33704, 94043, 94048, 94055, 94065, 94073, 94081, 94090, 94099, 94105, - 94111, 94118, 94125, 94130, 94134, 94142, 69529, 94147, 94156, 94164, - 94171, 94176, 94180, 94189, 94195, 94198, 94202, 94211, 94221, 81841, - 94230, 94234, 94242, 94246, 94252, 94263, 94273, 20519, 94284, 94293, - 94301, 94309, 94316, 69548, 9590, 94324, 94328, 94337, 94344, 94347, - 31413, 94350, 94354, 94359, 94376, 94388, 12170, 94400, 94405, 94410, - 94415, 24081, 94419, 94424, 94429, 94435, 94440, 6436, 94445, 24085, - 94450, 94455, 94461, 94468, 94473, 94478, 94484, 94490, 94496, 94501, - 94507, 94511, 94525, 94533, 94541, 94547, 94552, 94559, 94569, 94578, - 94583, 94588, 94593, 94601, 94612, 94617, 94623, 94628, 94637, 68023, - 4637, 94642, 94660, 94679, 94692, 94706, 94722, 94729, 94736, 94745, - 94752, 94758, 94765, 94770, 94776, 94782, 94790, 94796, 94801, 94806, - 94822, 12183, 94836, 94843, 94851, 94857, 94861, 94864, 94869, 94874, - 94881, 94886, 94895, 94901, 94906, 94912, 94918, 94927, 94936, 41284, - 94941, 94949, 94958, 13611, 94967, 94973, 94981, 94987, 94993, 94999, - 95004, 95011, 95017, 13622, 95022, 95025, 95030, 37601, 95040, 95049, - 95054, 95060, 95065, 95073, 95080, 95091, 95107, 95123, 95139, 95155, - 95171, 95187, 95203, 95219, 95235, 95251, 95267, 95283, 95299, 95315, - 95331, 95347, 95363, 95379, 95395, 95411, 95427, 95443, 95459, 95475, - 95491, 95507, 95523, 95539, 95555, 95571, 95587, 95603, 95619, 95635, - 95651, 95667, 95683, 95699, 95715, 95731, 95747, 95763, 95779, 95795, - 95811, 95827, 95843, 95859, 95875, 95891, 95907, 95923, 95939, 95955, - 95971, 95987, 96003, 96019, 96035, 96051, 96067, 96083, 96099, 96115, - 96131, 96147, 96163, 96179, 96195, 96211, 96227, 96243, 96259, 96275, - 96291, 96307, 96323, 96339, 96355, 96371, 96387, 96403, 96419, 96435, - 96451, 96467, 96483, 96499, 96515, 96531, 96547, 96563, 96579, 96595, - 96611, 96627, 96643, 96659, 96675, 96691, 96707, 96723, 96739, 96755, - 96771, 96787, 96803, 96819, 96835, 96851, 96867, 96883, 96899, 96915, - 96931, 96947, 96963, 96979, 96995, 97011, 97027, 97043, 97059, 97075, - 97091, 97107, 97123, 97139, 97155, 97171, 97187, 97203, 97219, 97235, - 97251, 97267, 97283, 97299, 97315, 97331, 97347, 97363, 97379, 97395, - 97411, 97427, 97443, 97459, 97475, 97491, 97507, 97523, 97539, 97555, - 97571, 97587, 97603, 97619, 97635, 97651, 97667, 97683, 97699, 97715, - 97731, 97747, 97763, 97779, 97795, 97811, 97827, 97843, 97859, 97875, - 97891, 97907, 97923, 97939, 97955, 97971, 97987, 98003, 98019, 98035, - 98051, 98067, 98083, 98099, 98115, 98131, 98147, 98163, 98179, 98195, - 98211, 98227, 98243, 98259, 98275, 98291, 98307, 98323, 98339, 98355, - 98371, 98387, 98403, 98419, 98435, 98451, 98467, 98483, 98499, 98515, - 98531, 98547, 98563, 98579, 98595, 98611, 98627, 98643, 98659, 98675, - 98691, 98707, 98723, 98739, 98755, 98771, 98787, 98803, 98819, 98835, - 98851, 98867, 98883, 98899, 98915, 98931, 98947, 98963, 98979, 98995, - 99011, 99027, 99043, 99059, 99075, 99091, 99107, 99123, 99139, 99155, - 99171, 99187, 99203, 99219, 99235, 99251, 99267, 99283, 99299, 99315, - 99331, 99347, 99363, 99379, 99395, 99411, 99427, 99443, 99459, 99475, - 99491, 99507, 99523, 99539, 99555, 99571, 99587, 99603, 99619, 99635, - 99651, 99667, 99683, 99699, 99715, 99731, 99747, 99763, 99779, 99795, - 99811, 99827, 99843, 99859, 99875, 99891, 99907, 99923, 99939, 99955, - 99971, 99987, 100003, 100019, 100035, 100051, 100067, 100083, 100099, - 100115, 100131, 100147, 100163, 100179, 100195, 100211, 100227, 100243, - 100259, 100275, 100291, 100307, 100323, 100339, 100355, 100371, 100387, - 100403, 100419, 100435, 100451, 100467, 100483, 100499, 100515, 100531, - 100547, 100563, 100579, 100595, 100611, 100627, 100643, 100659, 100675, - 100691, 100707, 100723, 100739, 100755, 100771, 100787, 100803, 100819, - 100835, 100851, 100867, 100883, 100899, 100915, 100931, 100947, 100963, - 100979, 100995, 101011, 101027, 101043, 101059, 101075, 101091, 101107, - 101123, 101139, 101155, 101171, 101187, 101203, 101219, 101235, 101251, - 101267, 101283, 101299, 101315, 101331, 101347, 101363, 101379, 101395, - 101411, 101427, 101437, 101442, 101450, 74322, 101455, 101461, 101466, - 101473, 101482, 101490, 101494, 4231, 101500, 101507, 101513, 101517, - 19842, 44349, 3219, 101522, 101526, 101530, 101537, 101543, 101552, - 101558, 101565, 101569, 101590, 101612, 101628, 101645, 101664, 101673, - 101683, 101691, 101698, 101705, 101711, 31274, 101725, 101729, 101735, - 101743, 101755, 101761, 101769, 101776, 101781, 101786, 101790, 101798, - 101805, 101809, 101815, 101821, 101826, 3879, 49980, 101832, 101836, - 101840, 101844, 101849, 101854, 101859, 101865, 101871, 101877, 101884, - 101890, 101897, 101903, 101909, 101914, 101920, 101925, 101929, 101934, - 101938, 101943, 49995, 101947, 101952, 101960, 101964, 101969, 101976, - 101985, 101991, 102000, 102004, 102011, 102015, 102018, 102025, 102031, - 102040, 102050, 102060, 102065, 102069, 102076, 102084, 102093, 102097, - 102105, 102111, 102116, 102121, 102127, 102133, 102138, 102142, 102148, - 102153, 102157, 102161, 102164, 102169, 102177, 102187, 102193, 102198, - 102208, 47155, 102216, 102228, 102234, 102241, 102247, 102251, 102256, - 102262, 102274, 102285, 102292, 102298, 102305, 102312, 102324, 102331, - 102337, 24165, 102341, 102349, 102355, 102362, 102368, 102374, 102380, - 102385, 102390, 102395, 102399, 102408, 102416, 102427, 7696, 102432, - 19278, 102438, 102442, 102446, 102450, 102458, 102467, 102471, 102478, - 102487, 102495, 102508, 102514, 101939, 34604, 102519, 102521, 102526, - 102531, 102536, 102541, 102546, 102551, 102556, 102561, 102566, 102571, - 102576, 102581, 102586, 102591, 102597, 102602, 102607, 102612, 102617, - 102622, 102627, 102632, 102637, 102643, 102649, 102655, 102660, 102665, - 102677, 102682, 1872, 54, 102687, 102692, 37611, 102696, 37616, 37621, - 37627, 37632, 102700, 37637, 25306, 102722, 102726, 102730, 102735, - 102739, 37641, 102743, 102751, 102758, 102764, 102774, 37646, 102781, - 102784, 102789, 102793, 102802, 10802, 102810, 37651, 25150, 102813, - 102817, 102825, 1347, 102830, 37662, 102833, 102838, 29602, 29612, 40886, - 102843, 102848, 102853, 102858, 102864, 102869, 102878, 102883, 102892, - 102900, 102907, 102913, 102918, 102923, 102928, 102938, 102947, 102955, - 102960, 102968, 102972, 102980, 102984, 102991, 102999, 37466, 44084, - 103006, 103012, 103017, 103022, 14031, 32589, 103027, 103032, 103037, - 103043, 103050, 103056, 103065, 103070, 103078, 103088, 103095, 103105, - 103111, 103116, 103122, 103126, 20541, 103133, 41838, 103146, 103151, - 103157, 103172, 35661, 72735, 103185, 103189, 103198, 103207, 103214, - 103220, 103228, 103234, 103243, 103250, 44204, 103256, 103259, 103263, - 103267, 103271, 11546, 103277, 103284, 103290, 103298, 103303, 103307, - 27650, 103313, 103316, 103324, 103331, 103339, 103352, 103366, 103373, - 103379, 103386, 103392, 37676, 103396, 103403, 103411, 103419, 103425, - 37681, 103433, 103439, 103444, 103454, 103460, 103469, 35456, 40257, - 103477, 103482, 103487, 103491, 103496, 103500, 103508, 103513, 17374, - 18148, 103517, 103522, 37686, 17527, 103526, 103531, 103535, 103542, - 103551, 103555, 103563, 103569, 103574, 103580, 8879, 103585, 103591, - 103596, 103601, 103612, 103621, 103633, 103648, 37974, 103654, 19397, - 37690, 103658, 103665, 103671, 103675, 27774, 103682, 103689, 46445, - 103698, 103704, 103713, 103719, 103724, 103732, 103738, 103743, 37700, - 103748, 103757, 103766, 102280, 103775, 103782, 103788, 103794, 103803, - 103813, 103819, 103827, 103834, 103838, 37705, 103841, 37711, 1386, - 103846, 103854, 103862, 103872, 103881, 103889, 103896, 103906, 37722, - 103910, 103912, 103916, 103921, 103925, 103929, 103935, 103940, 103944, - 103955, 103960, 103969, 103974, 3224, 103978, 103985, 103989, 103998, - 104006, 104014, 104021, 104026, 104031, 71287, 104035, 104038, 104044, - 104052, 104058, 104062, 104067, 104074, 104079, 104084, 104088, 104095, - 104101, 104106, 40288, 104110, 104113, 104118, 104122, 104127, 104134, - 104139, 104143, 45512, 104151, 29621, 29630, 104157, 104163, 104169, - 104174, 104178, 104181, 104191, 104200, 104205, 104211, 104218, 104224, - 104228, 104236, 104241, 40294, 82094, 104245, 104253, 104259, 104266, - 104271, 104278, 104283, 104287, 104292, 66525, 104298, 104304, 10078, - 104309, 104314, 104318, 104323, 104328, 104333, 104337, 104342, 104347, - 104353, 104358, 104363, 104369, 104375, 104380, 104384, 104389, 104394, - 104399, 104403, 27773, 104408, 104413, 104419, 104425, 104431, 104436, - 104440, 104445, 104450, 104455, 104459, 104464, 104469, 104474, 104479, - 50250, 104483, 37730, 104491, 104495, 104503, 104511, 104522, 104527, - 104531, 25779, 79545, 104536, 104542, 104547, 4542, 104557, 104564, - 104569, 104577, 104586, 104591, 104595, 104600, 104604, 104612, 104620, - 104627, 74584, 104633, 104641, 104648, 104659, 104665, 104671, 37740, - 104674, 104681, 104689, 104694, 104698, 31764, 69117, 104704, 104709, - 104716, 104721, 9970, 104725, 104733, 104740, 104747, 104756, 104763, - 104769, 104783, 104791, 6517, 104553, 104797, 104802, 104808, 104812, - 104815, 104823, 104830, 104835, 104848, 104855, 104861, 104865, 104873, - 104878, 104885, 104891, 104896, 69388, 104901, 104904, 104913, 104920, - 104926, 104930, 104933, 104941, 104947, 104956, 104966, 104976, 104985, - 104996, 105004, 105015, 105020, 105024, 105029, 105033, 41017, 105041, - 24493, 41026, 105046, 97694, 97710, 97726, 97742, 97758, 105051, 97790, - 97806, 97822, 97838, 97950, 97966, 105055, 97998, 98014, 105059, 105063, - 105067, 105071, 98254, 98286, 105075, 98318, 105079, 105083, 98462, - 98478, 98494, 98510, 105087, 98574, 98590, 105091, 98718, 98734, 98750, - 98766, 98782, 98798, 98814, 98830, 98846, 98862, 98974, 98990, 99006, - 99022, 99038, 99054, 99070, 99086, 99102, 99118, 105095, 100910, 101022, - 101086, 101102, 101118, 101134, 101150, 101166, 101278, 101294, 101310, - 105099, 101358, 105103, 101390, 101406, 101422, 105107, 105112, 105117, - 105122, 105127, 105132, 105137, 105141, 105145, 105150, 105155, 105159, - 105164, 105169, 105173, 105178, 105183, 105188, 105193, 105197, 105202, - 105207, 105211, 105216, 105220, 105224, 105228, 105232, 105237, 105241, - 105245, 105249, 105253, 105257, 105261, 105265, 105269, 105273, 105278, - 105283, 105288, 105293, 105298, 105303, 105308, 105313, 105318, 105323, - 105327, 105331, 105335, 105339, 105343, 105347, 105352, 105356, 105361, - 105365, 105370, 105375, 105379, 105383, 105388, 105392, 105396, 105400, - 105404, 105408, 105412, 105416, 105420, 105424, 105428, 105432, 105436, - 105440, 105444, 105449, 105454, 105458, 105462, 105466, 105470, 105474, - 105478, 105483, 105487, 105491, 105495, 105499, 105503, 105507, 105512, - 105516, 105521, 105525, 105529, 105533, 105537, 105541, 105545, 105549, - 105553, 105557, 105561, 105565, 105570, 105574, 105578, 105582, 105586, - 105590, 105594, 105598, 105602, 105606, 105610, 105614, 105619, 105623, - 105627, 105632, 105637, 105641, 105645, 105649, 105653, 105657, 105661, - 105665, 105669, 105674, 105678, 105683, 105687, 105692, 105696, 105701, - 105705, 105711, 105716, 105720, 105725, 105729, 105734, 105738, 105743, - 105747, 105752, 1461, 105756, 2966, 1726, 26950, 1634, 29557, 105760, - 2975, 105764, 1316, 105769, 1258, 105773, 105777, 2999, 105781, 105789, - 105796, 105803, 105817, 3003, 7803, 105826, 105834, 105841, 105852, - 105861, 105865, 105872, 105884, 105897, 105910, 105921, 105926, 105933, - 105945, 105949, 3007, 13692, 105959, 105964, 105973, 105983, 105988, - 3011, 105996, 106000, 106005, 106012, 106018, 106023, 106032, 106040, - 106052, 106062, 1263, 15119, 106075, 106079, 106085, 106099, 106111, - 106123, 106131, 106141, 106150, 106159, 106168, 106176, 106187, 106195, - 4550, 106205, 106216, 106225, 106231, 106246, 106253, 106259, 106264, - 41156, 106269, 3035, 15123, 106273, 106280, 9901, 106289, 106295, 3040, - 37146, 106304, 69017, 106311, 106315, 106321, 106332, 106338, 106343, - 106350, 106356, 106364, 106371, 106377, 106388, 106398, 106407, 106418, - 106427, 106434, 106440, 106450, 106458, 106464, 106479, 106485, 106490, - 106497, 106505, 106509, 106512, 106518, 106525, 106531, 106539, 106548, - 106556, 106562, 106571, 49565, 106585, 106590, 106596, 17133, 106601, - 106614, 106626, 106635, 106643, 106650, 106654, 106658, 106661, 106668, - 106675, 106683, 106691, 106700, 106708, 17038, 106716, 106721, 106725, - 106737, 106744, 106751, 106760, 906, 106770, 106779, 106790, 3061, - 106794, 106798, 106804, 106817, 106829, 106839, 106848, 106860, 30362, - 106871, 106879, 106888, 106899, 106910, 106920, 106930, 106938, 106947, - 106955, 13139, 106962, 106966, 106969, 106974, 106979, 106983, 106989, - 1268, 106996, 107000, 13780, 107004, 107015, 107024, 107032, 107041, - 107049, 107065, 107076, 107085, 107093, 107105, 107116, 107132, 107142, - 107163, 107177, 107190, 107198, 107205, 7849, 107218, 107223, 107229, - 6526, 107235, 107238, 107245, 107255, 8981, 107262, 107267, 107272, - 107279, 107284, 107292, 107301, 107309, 107314, 107323, 107330, 11040, - 11049, 107336, 107347, 107353, 107358, 107364, 3077, 3082, 107370, 977, - 107376, 107383, 107390, 107403, 107408, 2261, 87, 107416, 107423, 107428, - 107436, 107446, 107455, 107461, 107470, 107478, 107488, 107492, 107496, - 107501, 107505, 107517, 3105, 107525, 107533, 107538, 107549, 107560, - 107572, 107583, 107593, 107602, 24534, 107607, 107613, 107618, 107628, - 107638, 107643, 32478, 107649, 107654, 107663, 24546, 107667, 4654, 16, - 107672, 107681, 107688, 107695, 107701, 107706, 107710, 107716, 32502, - 107721, 107726, 69679, 107731, 107736, 107742, 107748, 107756, 107761, - 107769, 107776, 107782, 107787, 45388, 49459, 107793, 1797, 32, 107803, - 107816, 107821, 107829, 107834, 107840, 3131, 32557, 107845, 107853, - 107860, 107865, 107870, 107879, 4233, 4244, 70885, 107887, 107891, 1661, - 1809, 107896, 107901, 107908, 32910, 1813, 302, 107915, 107921, 107926, - 3153, 107930, 107935, 107942, 1817, 107947, 107953, 107958, 107970, 6757, - 107980, 107987, 1824, 107993, 107998, 108005, 108012, 108027, 108034, - 108045, 108050, 108058, 2696, 108062, 108074, 108079, 108083, 108089, - 32356, 2266, 108093, 108104, 108108, 108112, 108118, 108122, 108131, - 108135, 108146, 108150, 2312, 36963, 108154, 108164, 108172, 3244, - 108178, 108187, 108195, 10439, 108200, 108208, 108213, 108217, 108226, - 108233, 108239, 3214, 17197, 108243, 108256, 108274, 108279, 108287, - 108295, 108305, 11344, 15241, 108317, 108330, 108337, 108351, 108358, - 108374, 108381, 108387, 24584, 14454, 108394, 108401, 108411, 108420, - 50249, 108432, 108440, 50384, 108447, 108450, 108456, 108462, 108468, - 108474, 108480, 108487, 108494, 108500, 108506, 108512, 108518, 108524, - 108530, 108536, 108542, 108548, 108554, 108560, 108566, 108572, 108578, - 108584, 108590, 108596, 108602, 108608, 108614, 108620, 108626, 108632, - 108638, 108644, 108650, 108656, 108662, 108668, 108674, 108680, 108686, - 108692, 108698, 108704, 108710, 108716, 108722, 108728, 108734, 108740, - 108746, 108752, 108758, 108764, 108770, 108776, 108782, 108788, 108794, - 108800, 108807, 108813, 108820, 108827, 108833, 108840, 108847, 108853, - 108859, 108865, 108871, 108877, 108883, 108889, 108895, 108901, 108907, - 108913, 108919, 108925, 108931, 108937, 3228, 10412, 108943, 108953, - 108959, 108967, 108971, 106008, 3232, 108975, 102509, 24294, 14066, 4158, - 108979, 3238, 108983, 108993, 108999, 109005, 109011, 109017, 109023, - 109029, 109035, 109041, 109047, 109053, 109059, 109065, 109071, 109077, - 109083, 109089, 109095, 109101, 109107, 109113, 109119, 109125, 109131, - 109137, 109143, 109150, 109157, 109163, 109169, 109175, 109181, 109187, - 109193, 1273, 109199, 109204, 109209, 109214, 109219, 109224, 109229, - 109234, 109239, 109243, 109247, 109251, 109255, 109259, 109263, 109267, - 109271, 109275, 109281, 109287, 109293, 109299, 109303, 109307, 109311, - 109315, 109319, 109323, 109327, 109331, 109335, 109340, 109345, 109350, - 109355, 109360, 109365, 109370, 109375, 109380, 109385, 109390, 109395, - 109400, 109405, 109410, 109415, 109420, 109425, 109430, 109435, 109440, - 109445, 109450, 109455, 109460, 109465, 109470, 109475, 109480, 109485, - 109490, 109495, 109500, 109505, 109510, 109515, 109520, 109525, 109530, - 109535, 109540, 109545, 109550, 109555, 109560, 109565, 109570, 109575, - 109580, 109585, 109590, 109595, 109600, 109605, 109610, 109615, 109620, - 109625, 109630, 109635, 109640, 109645, 109650, 109655, 109660, 109665, - 109670, 109675, 109680, 109685, 109690, 109695, 109700, 109705, 109710, - 109715, 109720, 109725, 109730, 109735, 109740, 109745, 109750, 109755, - 109760, 109765, 109770, 109775, 109780, 109785, 109790, 109795, 109800, - 109805, 109810, 109815, 109820, 109825, 109830, 109835, 109840, 109845, - 109850, 109855, 109860, 109865, 109870, 109875, 109880, 109885, 109890, - 109895, 109900, 109905, 109910, 109915, 109920, 109925, 109930, 109935, - 109940, 109945, 109950, 109955, 109960, 109965, 109970, 109975, 109980, - 109985, 109990, 109995, 110000, 110005, 110010, 110015, 110020, 110025, - 110030, 110035, 110040, 110045, 110050, 110055, 110060, 110065, 110070, - 110075, 110080, 110085, 110090, 110095, 110100, 110105, 110110, 110115, - 110120, 110125, 110130, 110135, 110140, 110145, 110150, 110155, 110160, - 110165, 110170, 110175, 110180, 110185, 110190, 110195, 110200, 110205, - 110210, 110215, 110220, 110225, 110231, 110236, 110241, 110246, 110251, - 110256, 110261, 110266, 110272, 110277, 110282, 110287, 110292, 110297, - 110302, 110307, 110312, 110317, 110322, 110327, 110332, 110337, 110342, - 110347, 110352, 110357, 110362, 110367, 110372, 110377, 110382, 110387, - 110392, 110397, 110402, 110407, 110412, 110417, 110422, 110427, 110432, - 110441, 110446, 110455, 110460, 110469, 110474, 110483, 110488, 110497, - 110502, 110511, 110516, 110525, 110530, 110539, 110544, 110549, 110558, - 110562, 110571, 110576, 110585, 110590, 110599, 110604, 110613, 110618, - 110627, 110632, 110641, 110646, 110655, 110660, 110669, 110674, 110683, - 110688, 110697, 110702, 110707, 110712, 110717, 110722, 110727, 110732, - 110736, 110741, 110746, 110751, 110756, 110761, 110766, 110772, 110777, - 110782, 110787, 110793, 110797, 110802, 110808, 110813, 110818, 110823, - 110828, 110833, 110838, 110843, 110848, 110853, 110858, 110864, 110869, - 110874, 110879, 110885, 110890, 110895, 110900, 110905, 110911, 110916, - 110921, 110926, 110931, 110936, 110942, 110947, 110952, 110957, 110962, - 110967, 110972, 110977, 110982, 110987, 110992, 110997, 111002, 111007, - 111012, 111017, 111022, 111027, 111032, 111037, 111042, 111047, 111052, - 111057, 111063, 111069, 111075, 111080, 111085, 111090, 111095, 111101, - 111107, 111113, 111118, 111123, 111128, 111134, 111139, 111144, 111149, - 111154, 111159, 111164, 111169, 111174, 111179, 111184, 111189, 111194, - 111199, 111204, 111209, 111214, 111220, 111226, 111232, 111237, 111242, - 111247, 111252, 111258, 111264, 111270, 111275, 111280, 111285, 111290, - 111295, 111300, 111305, 111310, 111315, 18785, 111320, 111326, 111331, - 111336, 111341, 111346, 111351, 111357, 111362, 111367, 111372, 111377, - 111382, 111388, 111393, 111398, 111403, 111408, 111413, 111418, 111423, - 111428, 111433, 111438, 111443, 111448, 111453, 111458, 111463, 111468, - 111473, 111478, 111483, 111488, 111493, 111498, 111504, 111509, 111514, - 111519, 111524, 111529, 111534, 111539, 111544, 111549, 111554, 111559, - 111564, 111569, 111574, 111579, 111584, 111589, 111594, 111599, 111604, - 111609, 111614, 111619, 111624, 111629, 111634, 111639, 111644, 111649, - 111654, 111659, 111664, 111669, 111674, 111679, 111684, 111689, 111694, - 111699, 111704, 111710, 111715, 111720, 111725, 111730, 111735, 111740, - 111745, 111750, 111755, 111760, 111765, 111771, 111776, 111782, 111787, - 111792, 111797, 111802, 111807, 111812, 111818, 111823, 111828, 111834, - 111839, 111844, 111849, 111854, 111859, 111865, 111871, 111876, 111881, - 14088, 111886, 111891, 111896, 111901, 111906, 111911, 111916, 111921, - 111926, 111931, 111936, 111941, 111946, 111951, 111956, 111961, 111966, - 111971, 111976, 111981, 111986, 111991, 111996, 112001, 112006, 112011, - 112016, 112021, 112026, 112031, 112036, 112041, 112046, 112051, 112056, - 112061, 112066, 112071, 112076, 112081, 112086, 112091, 112096, 112101, - 112106, 112111, 112116, 112121, 112126, 112131, 112136, 112141, 112146, - 112151, 112156, 112161, 112166, 112171, 112176, 112181, 112186, 112191, - 112196, 112201, 112206, 112212, 112217, 112222, 112227, 112232, 112238, - 112243, 112248, 112253, 112258, 112263, 112268, 112274, 112279, 112284, - 112289, 112294, 112299, 112305, 112310, 112315, 112320, 112325, 112330, - 112336, 112341, 112346, 112351, 112356, 112361, 112367, 112373, 112378, - 112383, 112388, 112394, 112400, 112406, 112411, 112416, 112422, 112428, - 112433, 112439, 112445, 112451, 112456, 112461, 112467, 112472, 112478, - 112483, 112489, 112498, 112503, 112508, 112514, 112519, 112525, 112530, - 112535, 112540, 112545, 112550, 112555, 112560, 112565, 112570, 112575, - 112580, 112585, 112590, 112595, 112600, 112605, 112610, 112615, 112620, - 112625, 112630, 112635, 112640, 112645, 112650, 112655, 112660, 112665, - 112670, 112675, 112680, 112686, 112692, 112698, 112703, 112708, 112713, - 112718, 112723, 112728, 112733, 112738, 112743, 112748, 112753, 112758, - 112763, 112768, 112773, 112778, 112783, 112788, 112793, 112798, 112804, - 112810, 112815, 112821, 112826, 112831, 112837, 112842, 112848, 112853, - 112859, 112864, 112870, 112875, 112881, 112886, 112891, 112896, 112901, - 112906, 112911, 112916, 108994, 109000, 109006, 109012, 112922, 109018, - 109024, 112928, 109030, 109036, 109042, 109048, 109054, 109060, 109066, - 109072, 109078, 112934, 109084, 109090, 109096, 112940, 109102, 109108, - 109114, 109120, 112946, 109126, 109132, 109138, 109158, 112952, 112958, - 109164, 112964, 109170, 109176, 109182, 109188, 109194, 112970, 3255, - 3260, 112975, 3275, 3280, 3285, 112980, 112983, 112989, 112995, 113002, - 113007, 113012, 2317, + 27173, 27179, 27183, 25506, 25511, 27187, 27197, 27207, 27217, 27225, + 27232, 27242, 27250, 27258, 27264, 27272, 782, 27281, 17126, 599, 27295, + 27304, 27312, 27323, 27334, 27344, 27353, 27365, 27374, 27383, 27390, + 27396, 27406, 27415, 27424, 27432, 27440, 27450, 27458, 27466, 27472, + 27477, 27482, 27487, 7915, 27492, 27495, 27499, 27504, 27510, 27515, + 27519, 11142, 25524, 25529, 27527, 27533, 27539, 27544, 27549, 27553, + 27561, 27567, 27573, 27577, 3824, 27585, 27590, 27595, 27599, 27603, + 11266, 27610, 27618, 27632, 27639, 27646, 27652, 11275, 11281, 27660, + 27668, 27675, 27680, 27685, 25534, 27691, 27702, 27706, 27711, 2679, + 27716, 27727, 27733, 27738, 27742, 27746, 27749, 27756, 27763, 27769, + 27777, 27784, 27790, 27794, 7955, 27799, 27803, 27807, 27815, 27820, + 27825, 27830, 1717, 27835, 27840, 27845, 27850, 27855, 27860, 27865, + 27870, 27875, 27880, 27885, 27890, 27895, 27900, 27906, 27911, 27916, + 27921, 27926, 27931, 27936, 27942, 27947, 27952, 27957, 27962, 27967, + 27972, 27977, 27983, 27989, 27994, 28000, 28005, 28010, 5, 28016, 28020, + 28024, 28028, 28033, 28037, 28041, 28045, 28049, 28054, 28058, 28063, + 28067, 28070, 28074, 28079, 28083, 28088, 28092, 28096, 28100, 28105, + 28109, 28113, 28123, 28128, 28132, 28136, 28141, 28146, 28155, 28160, + 28165, 28169, 28173, 28182, 28195, 28207, 28216, 28225, 28230, 28236, + 28241, 28245, 28249, 28259, 28268, 28276, 28282, 28287, 28291, 28298, + 28308, 28317, 28325, 12474, 28333, 28341, 28350, 28359, 28367, 28377, + 28382, 28386, 28390, 28393, 28395, 28399, 28403, 28408, 28413, 28417, + 28421, 28424, 28428, 28431, 28435, 28438, 28441, 28445, 28451, 28455, + 28459, 28463, 28467, 28472, 28477, 28482, 28486, 28489, 28494, 28500, + 28505, 28511, 28516, 28520, 28526, 28530, 28534, 28539, 28543, 28548, + 28553, 28557, 28561, 28568, 28572, 28575, 28579, 28583, 28589, 28595, + 28599, 28603, 28608, 28615, 28621, 28625, 28634, 28638, 28642, 28645, + 28651, 28656, 28662, 1417, 1769, 28667, 28672, 28677, 28682, 28687, + 28692, 28697, 2150, 747, 28702, 28705, 28709, 28713, 28718, 28722, 17138, + 28726, 28731, 28736, 28740, 28743, 28748, 28752, 28757, 28761, 17142, + 28766, 28769, 28772, 28778, 28782, 28787, 28791, 28804, 28808, 28811, + 28819, 28828, 28835, 28840, 28846, 28852, 28860, 28867, 28874, 28878, + 28882, 28886, 28891, 28896, 28900, 28908, 28913, 28920, 28932, 28943, + 28948, 28952, 28959, 28963, 28968, 28974, 28977, 28982, 28987, 28994, + 28998, 29002, 29005, 29011, 8642, 2350, 29015, 29020, 29036, 10734, + 29056, 29065, 29081, 29085, 29092, 29095, 29101, 29111, 29117, 29126, + 29141, 29152, 29164, 29175, 29183, 29192, 29198, 29207, 29217, 29227, + 29238, 29249, 29259, 29268, 29275, 29284, 29292, 29299, 29306, 29314, + 29321, 29328, 29341, 29348, 29356, 29363, 29369, 29374, 29383, 29390, + 29396, 29401, 29409, 29417, 29424, 29431, 26996, 29443, 29455, 29469, + 29477, 29485, 29493, 29500, 29512, 29521, 29530, 29538, 29546, 29554, + 29561, 29567, 29576, 29584, 29594, 29603, 29613, 29622, 29631, 29639, + 29644, 29648, 29651, 29655, 29659, 29663, 29667, 29671, 29677, 29683, + 29688, 29696, 17200, 29703, 29708, 29715, 29721, 29728, 17208, 29735, + 29738, 29750, 29758, 29764, 29769, 29773, 29784, 29794, 29804, 11205, + 29813, 29822, 29830, 29840, 29849, 29856, 29863, 29871, 29875, 17219, + 29878, 29885, 29889, 4394, 29895, 29898, 29905, 29911, 29916, 29923, + 29929, 29933, 29938, 29942, 29951, 29958, 29964, 8700, 29971, 29979, + 29986, 29992, 29997, 30003, 30009, 30017, 30023, 30027, 30030, 30032, + 29656, 11218, 30041, 30046, 30052, 30062, 30067, 30074, 30080, 30085, + 30090, 30095, 30099, 30104, 30111, 30117, 30126, 30134, 30138, 30145, + 30151, 30160, 30167, 4648, 30173, 30179, 30184, 30191, 30203, 30214, + 30219, 30223, 30233, 30239, 30243, 30248, 30258, 30267, 30271, 30278, + 30286, 30293, 30299, 30304, 30312, 30319, 30324, 30331, 30343, 30352, + 30356, 15130, 30364, 30374, 30378, 30386, 28815, 30397, 30402, 30406, + 30413, 30420, 25186, 29581, 30425, 30429, 30432, 26324, 30437, 30451, + 30467, 30485, 30504, 30521, 30539, 26343, 30556, 30576, 26360, 30588, + 30600, 18413, 30612, 26380, 30626, 30638, 12130, 30652, 30657, 30662, + 30667, 30673, 30679, 30685, 30689, 30697, 30704, 30709, 30719, 30725, + 11692, 30731, 30733, 30738, 30746, 30750, 30107, 30756, 30763, 13395, + 13405, 30770, 30777, 30787, 30792, 30796, 30799, 30805, 30813, 30825, + 30835, 30851, 30864, 30878, 18431, 30892, 30899, 30903, 30906, 30911, + 30915, 30922, 30929, 30936, 30946, 30951, 30956, 30961, 30969, 30977, + 30982, 30991, 27017, 3485, 30996, 30999, 31002, 31007, 31014, 31019, + 31024, 31040, 31048, 31056, 10498, 31064, 31069, 31073, 31079, 31084, + 31090, 31093, 31099, 31111, 31119, 31126, 31132, 31139, 31150, 31164, + 31177, 31183, 31192, 31198, 31207, 31219, 31230, 31240, 31249, 31258, + 31266, 31277, 8682, 31284, 31291, 31297, 31302, 31308, 31315, 31326, + 31336, 31346, 31355, 31361, 31368, 31373, 31381, 31388, 31396, 31404, + 31416, 6904, 1094, 31423, 31432, 31440, 31446, 31452, 31457, 31461, + 31464, 31470, 31477, 31482, 31487, 31492, 31496, 31508, 31519, 31528, + 31536, 17401, 31541, 31549, 31554, 31562, 31568, 31574, 13388, 9497, + 31579, 31583, 31587, 31590, 31593, 31599, 31607, 31615, 31619, 31623, + 31628, 31632, 31635, 31644, 31649, 31653, 31656, 31664, 31675, 31684, + 31688, 31694, 31700, 31704, 31710, 31718, 31740, 31764, 31775, 31784, + 31790, 31797, 31804, 31810, 31818, 31824, 31829, 31840, 31858, 31865, + 31873, 31877, 31884, 31889, 31898, 31911, 31919, 31931, 31942, 31953, + 31963, 31977, 31986, 31994, 32006, 10751, 32017, 32028, 32039, 32051, + 32061, 32070, 32080, 32085, 32089, 32097, 32108, 32118, 32124, 32129, + 32133, 32136, 32139, 32147, 32155, 32164, 32174, 32183, 32189, 32203, + 2762, 32225, 32236, 32245, 32255, 32267, 32276, 32285, 32295, 32303, + 32311, 32320, 32325, 32336, 32341, 32350, 32356, 32367, 32371, 32374, + 32384, 32393, 32401, 32411, 32421, 32429, 32438, 32445, 32453, 32460, + 32469, 32478, 32483, 32488, 32492, 32500, 32507, 32511, 32519, 32526, + 32537, 32552, 32559, 32565, 32575, 32584, 32590, 32601, 32605, 32612, + 32616, 32623, 32629, 16275, 32635, 32639, 32644, 32650, 32657, 32661, + 32665, 32673, 32681, 32687, 32696, 32703, 32710, 32715, 32720, 32730, + 27071, 32734, 32737, 32742, 32747, 32752, 32757, 32762, 32767, 32772, + 32777, 32783, 32788, 32793, 32799, 1134, 725, 32804, 32811, 32820, 2398, + 32827, 32832, 32836, 32842, 1183, 653, 32847, 311, 32851, 32860, 32868, + 32877, 32885, 32892, 32903, 32911, 32920, 32930, 32938, 32943, 11373, + 32947, 32955, 32963, 32968, 17155, 4008, 32974, 32980, 32986, 6462, + 32991, 32995, 33002, 33008, 33014, 33018, 33024, 33029, 33036, 1376, + 33042, 33049, 33053, 1283, 6470, 33058, 33068, 33076, 33082, 33092, + 33101, 33109, 33115, 33120, 33128, 33135, 12911, 33141, 33148, 33153, + 33160, 33170, 1436, 230, 2149, 33176, 33182, 33189, 33200, 33211, 33219, + 33226, 33236, 33245, 33253, 33262, 33269, 33276, 33289, 33296, 33302, + 33313, 33332, 1188, 33337, 33342, 33350, 3891, 33354, 33359, 33363, + 33367, 1380, 28422, 33377, 33381, 33386, 33390, 33396, 3758, 33402, + 33410, 33417, 33428, 33437, 33445, 33470, 33478, 33483, 3892, 377, 33489, + 33497, 33505, 33512, 33518, 33523, 2218, 12332, 33530, 33536, 29934, + 30209, 33542, 613, 106, 33546, 33550, 33556, 715, 10371, 33561, 33568, + 33574, 33578, 33582, 1581, 33585, 33589, 17669, 33592, 33597, 33604, + 33610, 8713, 33615, 33623, 33630, 33636, 25696, 33640, 33644, 33648, + 33652, 3962, 19497, 33656, 33661, 33665, 33668, 33676, 33684, 33689, + 33698, 33706, 33709, 33716, 33726, 33738, 33746, 33751, 33755, 33763, + 33770, 33776, 33783, 33790, 33793, 33797, 33801, 1391, 33811, 33813, + 33818, 33824, 33830, 33835, 33840, 33845, 33850, 33855, 33860, 33865, + 33870, 33875, 33880, 33885, 33890, 33895, 33900, 33906, 33912, 33918, + 33924, 33929, 33934, 33939, 33945, 33950, 33955, 33960, 33966, 33971, + 33977, 33982, 33987, 33992, 33997, 34003, 34008, 34014, 34019, 34024, + 34029, 34034, 34040, 34045, 34051, 34056, 34061, 34066, 34071, 34076, + 34081, 34086, 34091, 34096, 34102, 34108, 34114, 34119, 34124, 34129, + 34134, 34140, 34146, 34152, 34158, 34164, 34170, 34175, 34181, 34186, + 34191, 34196, 34201, 34207, 2486, 34212, 2493, 2500, 2886, 34217, 2506, + 2516, 34223, 2548, 2553, 2558, 34227, 34232, 34237, 34243, 34248, 34253, + 34257, 34262, 34268, 34273, 34278, 34283, 34289, 34294, 34298, 34302, + 34307, 34312, 34317, 34322, 34327, 34333, 34339, 34344, 34348, 34353, + 34359, 34363, 34368, 34373, 34378, 34383, 34387, 34390, 34395, 34400, + 34405, 34410, 34415, 34421, 34427, 34432, 34437, 34442, 34446, 34451, + 34456, 34461, 34466, 34471, 34476, 34480, 34485, 34490, 34495, 34499, + 34503, 34507, 34512, 34520, 34525, 34530, 34536, 34542, 34548, 34553, + 34561, 34565, 34568, 34573, 34578, 34582, 34587, 34592, 34596, 34601, + 34605, 34608, 34613, 4104, 20257, 34618, 34623, 34628, 34633, 34641, + 24401, 33046, 10010, 34646, 34651, 34655, 34660, 34664, 34668, 34673, + 34677, 34680, 34683, 34687, 34692, 34696, 34704, 34708, 34711, 34716, + 34720, 34724, 34729, 34734, 34738, 34744, 34749, 34754, 34761, 34768, + 34772, 34775, 34781, 34790, 34797, 34805, 34812, 34816, 34821, 34825, + 34829, 34835, 34840, 34846, 34850, 34856, 34861, 34866, 34870, 34877, + 34883, 34889, 34895, 34901, 34908, 34914, 34920, 34926, 34932, 34938, + 34944, 34950, 34957, 34963, 34970, 34976, 34982, 34988, 34994, 35000, + 35006, 35012, 35018, 35024, 35030, 35035, 35040, 13266, 35045, 35051, + 35056, 35061, 35066, 35071, 35074, 35080, 35085, 35093, 35098, 35102, + 35107, 35113, 35122, 35128, 35133, 35138, 35143, 35147, 35152, 35156, + 35161, 35166, 35171, 35176, 35183, 35190, 35196, 35202, 35207, 19116, + 35214, 35220, 35227, 35233, 35239, 35244, 35252, 35257, 10916, 35261, + 35266, 35271, 35277, 35282, 35287, 35291, 35296, 35301, 35307, 35312, + 35317, 35322, 35326, 35331, 35336, 35340, 35345, 35350, 35354, 35359, + 35363, 35368, 35373, 35378, 35382, 35387, 35391, 35396, 35400, 35404, + 35408, 17825, 35413, 35420, 35429, 35435, 35441, 35450, 35458, 35467, + 35475, 35480, 35484, 35491, 35497, 35505, 35509, 35512, 35517, 35521, + 35530, 35538, 35556, 35562, 1435, 35568, 35571, 35575, 25836, 25842, + 35581, 35585, 35596, 35607, 35618, 35630, 35634, 35641, 35648, 35655, + 35660, 35664, 35672, 35677, 35682, 35687, 35692, 6527, 1050, 24400, + 35697, 35702, 35706, 35711, 35715, 35721, 35726, 35732, 35737, 35743, + 35748, 35754, 35759, 35765, 35771, 35777, 35782, 35738, 35744, 35786, + 35791, 35797, 35802, 35808, 35813, 35819, 35824, 35749, 11983, 35828, + 35760, 35766, 35772, 2978, 3672, 35834, 35837, 35842, 35848, 35854, + 35860, 35867, 35873, 35879, 35885, 35891, 35897, 35903, 35909, 35915, + 35921, 35927, 35933, 35939, 35946, 35952, 35958, 35964, 35970, 35976, + 35979, 35984, 35987, 35994, 35999, 36007, 36011, 36016, 36021, 36027, + 36032, 36037, 36041, 36046, 36052, 36057, 36063, 36068, 36074, 36079, + 36085, 36091, 36095, 36100, 36105, 36110, 36115, 36119, 36124, 36129, + 36134, 36140, 36146, 36152, 36158, 36163, 36167, 36170, 36176, 36182, + 36191, 36199, 36206, 36211, 36215, 36219, 36224, 17615, 36229, 36237, + 36243, 4050, 1293, 36248, 36252, 8763, 36258, 36264, 36271, 8772, 36275, + 36281, 36288, 36294, 36303, 36311, 36323, 36327, 36334, 36340, 36345, + 36349, 36353, 36356, 36366, 36375, 36383, 35739, 36388, 36398, 36408, + 36418, 36424, 36429, 36439, 36444, 36457, 36471, 36482, 36494, 36506, + 36520, 36533, 36545, 36557, 16966, 36571, 36576, 36581, 36585, 36589, + 36593, 36597, 36603, 36608, 36613, 36618, 36623, 36628, 36633, 1758, + 31228, 36638, 36643, 35787, 36648, 36651, 36656, 36661, 36666, 36672, + 36678, 18733, 11558, 36683, 36689, 36696, 18365, 36702, 36707, 36712, + 36716, 36721, 36726, 35792, 36731, 36736, 36741, 36747, 35798, 36752, + 36755, 36762, 36770, 36776, 36782, 36788, 36799, 36804, 36811, 36818, + 36825, 36833, 36842, 36851, 36857, 36863, 36871, 35803, 36876, 36882, + 36888, 35809, 36893, 36898, 36906, 36914, 36920, 36927, 36933, 36940, + 36947, 36953, 36961, 36971, 36978, 36984, 36989, 36995, 37000, 37005, + 37012, 37021, 37029, 37034, 37040, 37047, 37055, 37061, 37066, 37072, + 37081, 37088, 32169, 37094, 37098, 37103, 37112, 37117, 37122, 37127, + 14446, 37135, 37140, 37145, 37150, 37154, 37159, 37164, 37171, 37176, + 37181, 37186, 35814, 24329, 37192, 2589, 155, 37195, 37198, 37202, 37206, + 37216, 37224, 37231, 37235, 37239, 37242, 37250, 37257, 37264, 30163, + 37273, 37276, 37282, 37289, 37293, 37301, 37309, 37316, 37320, 37324, + 37327, 37333, 37340, 37344, 37348, 37355, 37363, 37371, 35750, 37378, + 37386, 37391, 37403, 11639, 11646, 11653, 11660, 11667, 11674, 578, 404, + 37409, 37414, 37419, 37425, 37430, 37435, 4071, 37440, 37443, 37448, + 37453, 37458, 37463, 37468, 37475, 25960, 37480, 37485, 37490, 37495, + 37500, 37506, 37511, 37517, 35990, 37523, 37528, 37534, 37540, 37550, + 37555, 37560, 37564, 37569, 37574, 37579, 37584, 37597, 37602, 25574, + 19579, 978, 37606, 37612, 37616, 37621, 37626, 37632, 37637, 37642, + 37646, 37651, 37656, 37662, 37667, 37672, 1298, 37676, 37681, 37686, + 37691, 37695, 37700, 37705, 37710, 37716, 37722, 37727, 37731, 37735, + 37740, 37745, 37750, 37754, 37759, 37767, 37771, 37777, 37781, 37788, + 37797, 19350, 35761, 37803, 37810, 37818, 37825, 37831, 37844, 37856, + 37861, 37867, 37871, 2905, 37875, 37879, 37335, 37888, 37899, 37910, + 37915, 32232, 37920, 37925, 37929, 32352, 25847, 37934, 37938, 37943, + 35767, 24436, 37947, 37952, 37958, 37963, 37967, 37971, 37974, 37978, + 37984, 37993, 38004, 38016, 35773, 38021, 38024, 38028, 38032, 38037, + 38042, 38047, 38052, 38057, 38062, 38067, 38072, 341, 38077, 38082, + 38087, 38092, 38097, 38102, 38108, 38113, 38118, 38124, 38129, 38135, + 38140, 38146, 38151, 38156, 38161, 38166, 38171, 38176, 38181, 38186, + 38192, 38197, 38202, 38207, 38212, 38217, 38222, 38227, 38233, 38239, + 38244, 38249, 38254, 38259, 38264, 38269, 38274, 38279, 38284, 38289, + 38294, 38299, 38304, 38309, 38314, 38319, 38324, 38329, 38339, 38349, + 38355, 331, 9, 38360, 38364, 38368, 38376, 38380, 38384, 38387, 16395, + 38390, 38395, 38399, 38404, 38408, 38413, 38417, 38422, 38426, 38429, + 38431, 38435, 38440, 38444, 38455, 38458, 38460, 38464, 38476, 38488, + 38497, 38501, 38511, 38515, 38521, 38526, 38535, 38541, 38546, 38551, + 38555, 38559, 38564, 38571, 38576, 38582, 38587, 38591, 38598, 29589, + 29599, 38602, 38607, 38612, 38617, 38624, 38628, 38635, 38641, 8918, + 38645, 38654, 38662, 38677, 38691, 38700, 38708, 38719, 38728, 38733, + 38740, 38750, 7924, 38760, 38765, 38770, 38774, 38777, 38782, 38786, + 38791, 38795, 38802, 38807, 38812, 38817, 38827, 38832, 38837, 38842, + 9883, 38847, 38849, 38857, 38860, 38863, 38865, 38869, 38875, 38879, + 38884, 38889, 38907, 38921, 38940, 38957, 38966, 38974, 38979, 38984, + 1428, 38990, 38996, 39001, 39011, 39020, 39028, 39033, 39039, 39044, + 39053, 39062, 39073, 39078, 39085, 39091, 39095, 39104, 39111, 39119, + 39126, 39139, 39147, 39151, 39161, 39166, 39170, 39178, 39186, 39191, + 39195, 39199, 39208, 39214, 39219, 39227, 39237, 39246, 39255, 39264, + 39275, 39283, 39294, 39303, 39311, 39318, 39324, 39329, 39340, 39351, + 39356, 39360, 39363, 39367, 39375, 39381, 39392, 39403, 39414, 39425, + 39436, 39447, 39458, 39469, 39481, 39493, 39505, 39517, 39529, 39541, + 39553, 39562, 39566, 39574, 39580, 39586, 39593, 39599, 39604, 39610, + 39614, 39619, 39624, 39629, 38334, 38344, 2460, 39634, 39636, 39641, + 39646, 39651, 39654, 39656, 39660, 39663, 39670, 39674, 11229, 39678, + 39684, 39694, 39699, 39705, 39709, 39714, 39727, 30057, 39733, 39742, + 39751, 20480, 39758, 39767, 36404, 39775, 39780, 39784, 39793, 39801, + 39808, 39813, 39817, 39822, 39827, 39835, 39839, 39847, 39853, 39859, + 39864, 39869, 39873, 39876, 39881, 39894, 39910, 26450, 39927, 39939, + 39956, 39968, 39982, 26467, 26486, 39994, 40006, 2779, 40020, 40025, + 40030, 40035, 40039, 40046, 40058, 40065, 40074, 40077, 40088, 40099, + 40107, 40112, 40116, 40121, 40126, 40131, 40136, 40141, 40146, 36868, + 927, 40151, 40155, 40159, 40162, 40167, 40172, 40178, 40183, 40188, + 40194, 40200, 40205, 40209, 40214, 40219, 40224, 40228, 40231, 40237, + 40242, 40247, 40252, 40256, 40261, 40267, 40275, 30336, 40280, 40285, + 40292, 40298, 40304, 40309, 40317, 25969, 40324, 40329, 40334, 40339, + 40343, 40346, 40351, 40355, 40359, 40366, 40372, 40378, 40384, 40391, + 40396, 40402, 39181, 40406, 40410, 40415, 40428, 40433, 40439, 40447, + 40454, 40462, 40472, 40478, 40484, 40490, 40494, 40503, 40511, 40518, + 40523, 40528, 12006, 40533, 40543, 40550, 40556, 40566, 40571, 40577, + 40585, 3924, 40592, 40599, 40605, 40612, 3930, 40616, 40621, 40632, + 40639, 40645, 40654, 40658, 4502, 40661, 40668, 40674, 40680, 40688, + 40698, 33513, 40705, 40713, 40719, 40724, 40730, 40735, 40739, 29901, + 40745, 40752, 40758, 40766, 40775, 40782, 40788, 40799, 27269, 40805, + 40815, 40820, 40824, 40832, 40840, 40847, 40853, 40858, 10874, 6502, + 40863, 40867, 40869, 40873, 40878, 40880, 40885, 40891, 40896, 40901, + 40908, 37471, 40914, 40919, 40923, 40928, 40932, 40941, 40945, 40951, + 40958, 40964, 40971, 40976, 40985, 40990, 40994, 40999, 41006, 41014, + 41022, 41027, 24492, 41031, 41034, 41038, 41042, 12429, 944, 41046, + 41051, 41059, 41064, 41068, 41077, 41084, 41088, 41092, 41100, 41107, + 15728, 41117, 41121, 41125, 41133, 41141, 41147, 41152, 41161, 15476, + 41167, 41176, 41183, 41188, 41195, 41202, 41210, 41217, 41225, 41233, + 41242, 41247, 41254, 41261, 41268, 41275, 41282, 41287, 41294, 41300, + 41317, 41325, 41335, 41343, 41350, 439, 41354, 41360, 41364, 41369, + 38724, 41375, 41378, 41382, 41388, 41399, 41407, 3935, 41415, 41421, + 41427, 41437, 41443, 41452, 41461, 41471, 41478, 41484, 41489, 3941, + 3947, 41498, 41505, 41513, 41518, 41522, 41529, 41537, 41544, 41551, + 41557, 41566, 41576, 41582, 41590, 41599, 41606, 41614, 41621, 25249, + 41625, 41632, 41638, 41648, 41657, 41665, 41676, 41680, 41690, 41697, + 41702, 41708, 41715, 41723, 41732, 41741, 41751, 41762, 41769, 41774, + 41781, 3193, 41789, 41795, 41800, 41807, 41813, 41819, 41824, 41837, + 41850, 41863, 41870, 41876, 41884, 41892, 41897, 41901, 41905, 41910, + 41915, 41920, 41925, 41930, 41935, 1397, 41940, 41944, 41948, 41952, + 41956, 41960, 41964, 41968, 41972, 41976, 41980, 41984, 41988, 41992, + 41996, 42000, 42004, 42008, 42012, 42016, 42020, 42024, 42028, 42032, + 42036, 42040, 42044, 42048, 42052, 42056, 42060, 42064, 42068, 42072, + 42076, 42080, 42084, 42088, 42092, 42096, 42100, 42104, 42108, 42112, + 42116, 42120, 42124, 42128, 42132, 42136, 42140, 42144, 42148, 42152, + 42156, 42160, 42164, 42168, 42172, 42176, 42180, 42184, 42188, 42192, + 42196, 42200, 42204, 42208, 42212, 42216, 42220, 42224, 42228, 42232, + 42236, 42240, 42244, 42248, 42252, 42256, 42260, 42264, 42268, 42272, + 42276, 42280, 42284, 42288, 42292, 42296, 42300, 42304, 42308, 42312, + 42316, 42320, 42324, 42328, 42332, 42336, 42340, 42344, 42348, 42352, + 42356, 42360, 42364, 42368, 42372, 42376, 42380, 42384, 42388, 42392, + 42396, 42400, 42404, 42408, 42412, 42416, 42420, 42424, 42428, 42432, + 42436, 42440, 42444, 42448, 42452, 42456, 42460, 42464, 42468, 42472, + 42476, 42480, 42484, 42488, 42492, 42496, 42500, 42504, 42508, 42512, + 42516, 42520, 42524, 42528, 42532, 42536, 42540, 42544, 42548, 42552, + 42557, 42561, 42566, 42570, 42575, 42579, 42584, 42588, 42594, 42599, + 42603, 42608, 42612, 42617, 42621, 42626, 42630, 42635, 42639, 42644, + 42648, 42653, 42657, 42663, 42669, 42674, 42678, 42683, 42687, 42693, + 42698, 42702, 42707, 42711, 42716, 42720, 42726, 42731, 42735, 42740, + 42744, 42749, 42753, 42758, 42762, 42768, 42773, 42777, 42782, 42786, + 42792, 42797, 42801, 42806, 42810, 42815, 42819, 42824, 42828, 42833, + 42837, 42843, 42848, 42852, 42858, 42863, 42867, 42873, 42878, 42882, + 42887, 42891, 42896, 42900, 42906, 42912, 42918, 42924, 42930, 42936, + 42942, 42948, 42953, 42957, 42962, 42966, 42972, 42977, 42981, 42986, + 42990, 42995, 42999, 43004, 43008, 43013, 43017, 43022, 43026, 43031, + 43035, 43041, 43046, 43050, 43055, 43059, 43065, 43071, 43076, 127, 63, + 43080, 43082, 43086, 43090, 43094, 43099, 43103, 43107, 43112, 10787, + 43117, 43123, 1703, 6943, 43129, 43132, 43137, 43141, 43146, 43150, + 43154, 43159, 11790, 43163, 43167, 43171, 571, 43175, 17934, 43180, + 43184, 43189, 43194, 43199, 43203, 43210, 30081, 43216, 43219, 43223, + 43228, 43234, 43238, 43241, 43249, 43255, 43260, 43264, 43267, 43271, + 43277, 43281, 43285, 3723, 3728, 14558, 43288, 43292, 43296, 43300, + 43304, 43312, 43319, 43323, 15426, 43330, 43335, 43349, 43356, 43367, + 361, 43372, 43376, 43382, 43394, 43400, 43406, 43411, 43417, 43421, + 33786, 43430, 43436, 43445, 43449, 43453, 43458, 43464, 43469, 43473, + 43478, 43482, 43486, 43493, 43499, 43504, 43515, 43530, 43545, 43560, + 43576, 43594, 11704, 43608, 43615, 43619, 43622, 43631, 43636, 43640, + 43648, 18568, 43656, 43660, 43670, 43681, 33711, 43694, 43698, 43707, + 43725, 43744, 43753, 43761, 43769, 11069, 11903, 43773, 25859, 43776, + 34700, 43781, 11068, 43786, 43792, 43797, 43803, 43808, 43814, 43819, + 43825, 43830, 43836, 43842, 43848, 43853, 43809, 43815, 43857, 43820, + 43826, 43831, 43862, 43837, 43843, 8931, 4327, 43868, 43876, 43880, + 43883, 43890, 43894, 43899, 43904, 43911, 43917, 43923, 43928, 17247, + 43932, 29918, 43936, 43940, 43944, 43950, 43954, 32103, 43963, 10043, + 43967, 10469, 43970, 43977, 43983, 43987, 13867, 43994, 44000, 44005, + 44012, 44019, 44026, 32872, 8828, 44033, 44040, 44047, 44053, 44058, + 44065, 44076, 44082, 44087, 44092, 44097, 44101, 44106, 44113, 43810, + 44117, 44127, 44136, 44147, 44153, 44161, 44168, 44173, 44178, 44183, + 44188, 44193, 44197, 44201, 44208, 44214, 44222, 2353, 29018, 11806, + 11818, 11823, 11829, 44231, 11834, 11839, 11845, 44236, 44246, 44250, + 11850, 44255, 19777, 44258, 44263, 44267, 40069, 44278, 44283, 44290, + 44297, 44301, 44304, 44312, 11717, 44319, 44322, 44328, 44338, 6554, + 44347, 44352, 44358, 44362, 44370, 44374, 44384, 44390, 44395, 44406, + 44415, 44424, 44433, 44442, 44451, 44460, 44469, 44475, 44481, 44486, + 44492, 44498, 44504, 44509, 44512, 44519, 44525, 44529, 44534, 44541, + 44548, 44552, 44555, 44565, 44578, 44587, 44596, 44607, 44620, 44632, + 44643, 44652, 44663, 44668, 44677, 44682, 11855, 44688, 44695, 44703, + 44708, 44713, 30127, 44717, 44724, 4267, 25, 44728, 44733, 19626, 44737, + 44740, 44743, 32289, 44747, 32881, 44755, 44759, 44763, 44766, 44772, + 44778, 44783, 35838, 44792, 44800, 44806, 44813, 32272, 44817, 32503, + 44821, 44830, 44834, 44842, 44848, 44854, 44859, 44863, 32907, 44869, + 44872, 44880, 44888, 4649, 44894, 44898, 44902, 44907, 44914, 44920, + 44925, 44930, 44934, 44940, 44945, 44951, 4555, 766, 44958, 44962, 44965, + 44977, 44984, 44989, 17807, 44993, 45001, 45009, 45017, 45025, 45032, + 45040, 45048, 45055, 45063, 45071, 45079, 45087, 45095, 45103, 45111, + 45119, 45127, 45135, 45143, 45150, 45158, 45166, 45174, 45182, 45190, + 45198, 45206, 45214, 45222, 45230, 45238, 45246, 45254, 45262, 45270, + 45278, 45286, 45294, 45302, 45309, 45317, 45324, 45332, 45340, 45348, + 45356, 45364, 45372, 45380, 45388, 45399, 25285, 45404, 45407, 45414, + 45418, 45424, 45428, 45434, 45439, 45445, 45450, 45455, 45459, 45463, + 45471, 45476, 45481, 45491, 45497, 45510, 45516, 45522, 45528, 45531, + 45538, 45543, 45549, 45554, 19522, 903, 45559, 45562, 45565, 45568, + 35922, 35928, 45571, 35934, 35947, 35953, 35959, 45577, 35965, 35971, + 45583, 45589, 18, 45597, 45604, 45608, 45612, 45620, 36757, 45624, 45628, + 45635, 45640, 45644, 45649, 45655, 45660, 45666, 45671, 45675, 45679, + 45683, 45688, 45692, 45697, 45701, 45705, 45712, 45717, 45721, 45725, + 45730, 45734, 45739, 45743, 45747, 45752, 45758, 18091, 18096, 45763, + 45767, 45770, 45776, 45780, 45784, 24286, 45789, 45793, 45799, 45806, + 45812, 45817, 38753, 45827, 45832, 45840, 45844, 45847, 36772, 45851, + 4620, 45856, 45861, 45865, 45870, 45874, 45879, 15494, 45890, 45894, + 45897, 45901, 45906, 45910, 45915, 45920, 45924, 45928, 45932, 45935, + 45939, 45942, 45947, 45952, 45957, 45962, 45967, 45972, 8415, 15510, + 45977, 45980, 45986, 45991, 45997, 46002, 46008, 46013, 46019, 46024, + 46030, 46036, 46042, 46047, 46051, 46055, 46062, 46071, 46087, 46103, + 46113, 32179, 46120, 46124, 46129, 46134, 46138, 46142, 41736, 46148, + 46153, 46157, 46164, 46169, 46174, 46178, 46181, 46185, 46191, 31031, + 46195, 24599, 46200, 46207, 46215, 46221, 46228, 46236, 46242, 46246, + 46251, 46257, 46265, 46270, 46274, 46283, 10768, 46291, 46295, 46303, + 46310, 46315, 46320, 46325, 46329, 46332, 46338, 46342, 46345, 46349, + 46356, 46361, 46365, 46371, 46375, 46381, 46386, 46391, 30422, 35985, + 46396, 46405, 46413, 46419, 46431, 46444, 46458, 46465, 46471, 46477, + 46482, 46490, 46493, 46495, 46502, 46509, 46515, 46519, 8414, 46522, + 46526, 46530, 46535, 46539, 46543, 46546, 46550, 46564, 26516, 46583, + 46596, 46609, 46622, 26534, 46637, 2732, 46652, 46658, 46662, 46672, + 46676, 46680, 46685, 46689, 46696, 46701, 46705, 46712, 46718, 46723, + 46729, 46739, 46751, 46762, 46767, 46774, 46778, 46782, 46785, 46793, + 18589, 4039, 46798, 18124, 46811, 46818, 46825, 46831, 46835, 46839, + 46844, 46850, 46855, 46861, 46865, 46869, 46872, 46877, 46881, 46886, + 46891, 46896, 46901, 46906, 46911, 46916, 46921, 46926, 8469, 18135, + 46931, 46935, 46941, 46950, 46955, 46964, 46971, 41572, 46977, 46982, + 46986, 46993, 46998, 47005, 47011, 47015, 47018, 47022, 47027, 2810, + 47034, 47041, 47045, 47048, 47053, 47058, 47064, 47069, 47074, 47078, + 47083, 47093, 47098, 47104, 47109, 44979, 47115, 47121, 47131, 47136, + 47141, 47145, 47150, 7926, 7938, 47155, 47158, 47165, 47171, 47180, 9963, + 39321, 47188, 47192, 47196, 36820, 47204, 47215, 47223, 41784, 47230, + 47235, 47240, 47251, 47258, 47269, 36844, 24616, 47277, 1022, 47282, + 15917, 47288, 32263, 47294, 47299, 47309, 47318, 47325, 47331, 47335, + 47338, 47345, 47351, 47358, 47364, 47374, 47382, 47388, 47394, 47399, + 47403, 47410, 47415, 47421, 47428, 47434, 46531, 47439, 47443, 15959, + 15968, 15977, 15986, 15995, 16024, 620, 16033, 47449, 47454, 47457, + 47463, 47471, 1315, 47476, 47480, 47485, 47490, 47495, 47502, 47508, + 47512, 47517, 47523, 47527, 35995, 47532, 47537, 47546, 47553, 47563, + 47569, 32307, 47586, 47595, 47603, 47609, 47614, 47621, 47627, 47635, + 47644, 47652, 47660, 47666, 47670, 47675, 47683, 33392, 36853, 47689, + 47708, 18492, 47722, 47738, 47752, 47758, 47763, 47768, 47773, 47779, + 36859, 47784, 47787, 47794, 47801, 47810, 47815, 47819, 420, 3100, 47826, + 47831, 47836, 31400, 47624, 47840, 47845, 47853, 47857, 47860, 47865, + 47871, 47877, 47882, 47886, 32380, 47889, 47894, 47898, 47901, 47906, + 47910, 47915, 47920, 47924, 47929, 47933, 47937, 47941, 24282, 24293, + 47946, 47951, 47957, 47962, 47968, 47974, 30987, 47979, 47983, 47986, + 47992, 47997, 48002, 48007, 48012, 48017, 48022, 48027, 48032, 48038, + 48044, 24379, 18795, 48049, 48054, 48059, 48064, 48069, 48074, 48079, + 48084, 450, 68, 36012, 36017, 36022, 36028, 36033, 36038, 48089, 36042, + 48093, 48097, 48101, 36047, 36053, 48115, 36064, 36069, 48123, 48128, + 36075, 48133, 48138, 48147, 48152, 48157, 48166, 48172, 48178, 48184, + 36092, 48197, 48206, 48212, 36096, 48216, 36101, 48221, 36106, 36111, + 48224, 48229, 48233, 48239, 15735, 48246, 15745, 48253, 48258, 36116, + 48262, 48267, 48272, 48277, 48282, 48286, 48291, 48296, 48302, 48307, + 48312, 48318, 48324, 48329, 48333, 48338, 48343, 48348, 48352, 48357, + 48362, 48367, 48373, 48379, 48385, 48390, 48394, 48399, 48403, 36120, + 36125, 36130, 48407, 48411, 48416, 48420, 48432, 36135, 36141, 36147, + 36159, 48438, 29955, 48442, 48447, 48451, 48456, 48463, 48468, 48473, + 48478, 48482, 48486, 48496, 48501, 48506, 48510, 48514, 48517, 48525, + 48530, 36207, 48534, 1407, 48540, 48545, 48551, 48559, 48563, 48572, + 48580, 48584, 48588, 48596, 48602, 48610, 48626, 48630, 48634, 48638, + 48643, 48649, 48664, 36244, 1711, 14075, 48668, 1294, 1309, 48680, 48688, + 48695, 48700, 48707, 48712, 10452, 963, 2575, 11882, 48719, 10350, 48724, + 48727, 48736, 1202, 48741, 46702, 48748, 48757, 48762, 48766, 48774, + 25915, 2631, 48781, 12382, 48791, 48797, 2371, 2381, 48806, 48815, 48825, + 48836, 3508, 39695, 48841, 4234, 4245, 19560, 1207, 48845, 48853, 48860, + 48865, 48869, 48873, 48878, 27530, 47029, 11973, 48886, 48895, 48904, + 48912, 48925, 48932, 48943, 48948, 48961, 48974, 48986, 48998, 49010, + 49021, 49034, 49045, 49056, 49066, 49074, 49082, 49094, 49106, 49117, + 49126, 49134, 49141, 49153, 49160, 49166, 49175, 49181, 49188, 49201, + 49206, 49216, 49221, 49227, 49232, 43984, 49236, 46334, 49243, 49250, + 49258, 49265, 2588, 49272, 49283, 49293, 49302, 49310, 49320, 49328, + 49337, 49347, 49356, 49361, 49367, 49373, 4083, 49384, 49394, 49403, + 49412, 49420, 49430, 49438, 49447, 49452, 49457, 49462, 1636, 47, 49470, + 49478, 49489, 49500, 19181, 49510, 49514, 49521, 49527, 49532, 49536, + 49547, 49557, 49566, 49577, 19599, 19604, 49582, 49591, 49596, 49606, + 49611, 49619, 49627, 49634, 49640, 1598, 259, 49644, 49650, 49655, 49658, + 2119, 2597, 49666, 49670, 49673, 1452, 49679, 16224, 1212, 49684, 49697, + 2721, 2742, 49711, 49723, 49735, 2756, 2773, 2788, 2804, 2821, 49749, + 49761, 2836, 49775, 1218, 1224, 1230, 12253, 49780, 49785, 49790, 49794, + 49809, 49824, 49839, 49854, 49869, 49884, 49899, 49914, 49929, 49944, + 49959, 49974, 49989, 50004, 50019, 50034, 50049, 50064, 50079, 50094, + 50109, 50124, 50139, 50154, 50169, 50184, 50199, 50214, 50229, 50244, + 50259, 50274, 50289, 50304, 50319, 50334, 50349, 50364, 50379, 50394, + 50409, 50424, 50439, 50454, 50469, 50484, 50499, 50514, 50529, 50544, + 50559, 50574, 50589, 50604, 50619, 50634, 50649, 50664, 50679, 50694, + 50709, 50724, 50739, 50754, 50769, 50784, 50799, 50814, 50829, 50844, + 50859, 50874, 50889, 50904, 50919, 50934, 50949, 50964, 50979, 50994, + 51009, 51024, 51039, 51054, 51069, 51084, 51099, 51114, 51129, 51144, + 51159, 51174, 51189, 51204, 51219, 51234, 51249, 51264, 51279, 51294, + 51309, 51324, 51339, 51354, 51369, 51384, 51399, 51414, 51429, 51444, + 51459, 51474, 51489, 51504, 51519, 51534, 51549, 51564, 51579, 51594, + 51609, 51624, 51639, 51654, 51669, 51684, 51699, 51714, 51729, 51744, + 51759, 51774, 51789, 51804, 51819, 51834, 51849, 51864, 51879, 51894, + 51909, 51924, 51939, 51954, 51969, 51984, 51999, 52014, 52029, 52044, + 52059, 52074, 52089, 52104, 52119, 52134, 52149, 52164, 52179, 52194, + 52209, 52224, 52239, 52254, 52269, 52284, 52299, 52314, 52329, 52344, + 52359, 52374, 52389, 52404, 52419, 52434, 52449, 52464, 52479, 52494, + 52509, 52524, 52539, 52554, 52569, 52584, 52599, 52614, 52629, 52644, + 52659, 52674, 52689, 52704, 52719, 52734, 52749, 52764, 52779, 52794, + 52809, 52824, 52839, 52854, 52869, 52884, 52899, 52914, 52929, 52944, + 52959, 52974, 52989, 53004, 53019, 53034, 53049, 53064, 53079, 53094, + 53109, 53124, 53139, 53154, 53169, 53184, 53199, 53214, 53229, 53244, + 53259, 53274, 53289, 53304, 53319, 53334, 53349, 53364, 53379, 53394, + 53409, 53424, 53439, 53454, 53469, 53484, 53499, 53514, 53529, 53544, + 53559, 53574, 53589, 53604, 53619, 53634, 53649, 53664, 53679, 53694, + 53709, 53724, 53739, 53754, 53769, 53784, 53799, 53814, 53829, 53844, + 53859, 53874, 53889, 53904, 53919, 53934, 53949, 53964, 53979, 53994, + 54009, 54024, 54039, 54054, 54069, 54084, 54099, 54114, 54129, 54144, + 54159, 54174, 54189, 54204, 54219, 54234, 54249, 54264, 54279, 54294, + 54309, 54324, 54339, 54354, 54369, 54384, 54399, 54414, 54429, 54444, + 54459, 54474, 54489, 54504, 54519, 54534, 54549, 54564, 54579, 54594, + 54609, 54624, 54639, 54654, 54669, 54684, 54699, 54714, 54729, 54744, + 54759, 54774, 54789, 54804, 54819, 54834, 54849, 54864, 54879, 54894, + 54909, 54924, 54939, 54954, 54969, 54984, 54999, 55014, 55029, 55044, + 55059, 55074, 55089, 55104, 55119, 55134, 55149, 55164, 55179, 55194, + 55209, 55224, 55239, 55254, 55269, 55284, 55299, 55314, 55329, 55344, + 55359, 55374, 55389, 55404, 55419, 55434, 55449, 55464, 55479, 55494, + 55509, 55524, 55539, 55554, 55569, 55584, 55599, 55614, 55629, 55644, + 55659, 55674, 55689, 55704, 55719, 55734, 55749, 55764, 55779, 55794, + 55809, 55824, 55839, 55854, 55869, 55884, 55899, 55914, 55929, 55944, + 55959, 55974, 55989, 56004, 56019, 56034, 56049, 56064, 56079, 56094, + 56109, 56124, 56139, 56154, 56169, 56184, 56199, 56214, 56229, 56244, + 56259, 56274, 56289, 56304, 56319, 56334, 56349, 56364, 56379, 56394, + 56409, 56424, 56439, 56454, 56469, 56484, 56499, 56514, 56529, 56544, + 56559, 56574, 56589, 56604, 56619, 56634, 56649, 56664, 56679, 56694, + 56709, 56724, 56739, 56754, 56769, 56784, 56799, 56814, 56829, 56844, + 56859, 56874, 56889, 56904, 56919, 56934, 56949, 56964, 56979, 56994, + 57009, 57024, 57039, 57054, 57069, 57084, 57099, 57114, 57129, 57144, + 57159, 57174, 57189, 57204, 57219, 57234, 57249, 57264, 57279, 57294, + 57309, 57324, 57339, 57354, 57369, 57384, 57399, 57414, 57429, 57444, + 57459, 57474, 57489, 57504, 57519, 57534, 57549, 57564, 57579, 57594, + 57609, 57625, 57641, 57657, 57673, 57689, 57705, 57721, 57737, 57753, + 57769, 57785, 57801, 57817, 57833, 57849, 57865, 57881, 57897, 57913, + 57929, 57945, 57961, 57977, 57993, 58009, 58025, 58041, 58057, 58073, + 58089, 58105, 58121, 58137, 58153, 58169, 58185, 58201, 58217, 58233, + 58249, 58265, 58281, 58297, 58313, 58329, 58345, 58361, 58377, 58393, + 58409, 58425, 58441, 58457, 58473, 58489, 58505, 58521, 58537, 58553, + 58569, 58585, 58601, 58617, 58633, 58649, 58665, 58681, 58697, 58713, + 58729, 58745, 58761, 58777, 58793, 58809, 58825, 58841, 58857, 58873, + 58889, 58905, 58921, 58937, 58953, 58969, 58985, 59001, 59017, 59033, + 59049, 59065, 59081, 59097, 59113, 59129, 59145, 59161, 59177, 59193, + 59209, 59225, 59241, 59257, 59273, 59289, 59305, 59321, 59337, 59353, + 59369, 59385, 59401, 59417, 59433, 59449, 59465, 59481, 59497, 59513, + 59529, 59545, 59561, 59577, 59593, 59609, 59625, 59641, 59657, 59673, + 59689, 59705, 59721, 59737, 59753, 59769, 59785, 59801, 59817, 59833, + 59849, 59865, 59881, 59897, 59913, 59929, 59945, 59961, 59977, 59993, + 60009, 60025, 60041, 60057, 60073, 60089, 60105, 60121, 60137, 60153, + 60169, 60185, 60201, 60217, 60233, 60249, 60265, 60281, 60297, 60313, + 60329, 60345, 60361, 60377, 60393, 60409, 60425, 60441, 60457, 60473, + 60489, 60505, 60521, 60537, 60553, 60569, 60585, 60601, 60617, 60633, + 60649, 60665, 60681, 60697, 60713, 60729, 60745, 60761, 60777, 60793, + 60809, 60825, 60841, 60857, 60873, 60889, 60905, 60921, 60937, 60953, + 60969, 60985, 61001, 61017, 61033, 61049, 61065, 61081, 61097, 61113, + 61129, 61145, 61161, 61177, 61193, 61209, 61225, 61241, 61257, 61273, + 61289, 61305, 61321, 61337, 61353, 61369, 61385, 61401, 61417, 61433, + 61449, 61465, 61481, 61497, 61513, 61529, 61545, 61561, 61577, 61593, + 61609, 61625, 61641, 61657, 61673, 61689, 61705, 61721, 61737, 61753, + 61769, 61785, 61801, 61817, 61833, 61849, 61865, 61881, 61897, 61913, + 61929, 61945, 61961, 61977, 61993, 62009, 62025, 62041, 62057, 62073, + 62089, 62105, 62121, 62137, 62153, 62169, 62185, 62201, 62217, 62233, + 62249, 62265, 62281, 62297, 62313, 62329, 62345, 62361, 62377, 62393, + 62409, 62425, 62441, 62457, 62473, 62489, 62505, 62521, 62537, 62553, + 62569, 62585, 62601, 62617, 62633, 62649, 62665, 62681, 62697, 62713, + 62729, 62745, 62761, 62777, 62793, 62809, 62825, 62841, 62857, 62873, + 62889, 62905, 62921, 62937, 62953, 62969, 62985, 63001, 63017, 63033, + 63049, 63065, 63081, 63097, 63113, 63129, 63145, 63161, 63177, 63193, + 63209, 63225, 63241, 63257, 63273, 63289, 63305, 63321, 63337, 63353, + 63369, 63385, 63401, 63417, 63433, 63449, 63465, 63481, 63497, 63513, + 63529, 63545, 63561, 63577, 63593, 63609, 63625, 63641, 63657, 63673, + 63689, 63705, 63721, 63737, 63753, 63769, 63785, 63801, 63817, 63833, + 63849, 63865, 63881, 63897, 63913, 63929, 63945, 63961, 63977, 63993, + 64009, 64025, 64041, 64057, 64073, 64089, 64105, 64121, 64137, 64153, + 64169, 64185, 64201, 64217, 64233, 64249, 64265, 64281, 64297, 64313, + 64329, 64345, 64361, 64377, 64393, 64409, 64425, 64441, 64457, 64473, + 64489, 64505, 64521, 64537, 64553, 64569, 64585, 64601, 64617, 64633, + 64649, 64665, 64681, 64697, 64713, 64729, 64745, 64761, 64777, 64793, + 64809, 64825, 64841, 64857, 64873, 64889, 64905, 64921, 64937, 64953, + 64969, 64985, 65001, 65017, 65033, 65049, 65065, 65081, 65097, 65113, + 65129, 65145, 65161, 65177, 65193, 65209, 65225, 65241, 65257, 65273, + 65289, 65305, 65321, 65337, 65353, 65369, 65385, 65401, 65417, 65433, + 65449, 65465, 65481, 65497, 65513, 65529, 65545, 65561, 65577, 65593, + 65609, 65625, 65641, 65657, 65673, 65689, 65705, 65721, 65737, 65753, + 65769, 65785, 65801, 65817, 65833, 65849, 65865, 65881, 65897, 65913, + 65929, 65945, 65961, 65977, 65993, 66009, 66025, 66041, 66057, 66073, + 66089, 66105, 66121, 66137, 66153, 66169, 66185, 66201, 66217, 66233, + 66249, 66265, 66281, 66290, 66305, 17090, 66314, 66319, 66325, 66331, + 66341, 66349, 17343, 18025, 11298, 66362, 1460, 1464, 66370, 4163, 31515, + 7863, 66376, 66381, 66386, 66391, 66396, 66402, 66407, 66413, 66418, + 66424, 66429, 66434, 66439, 66444, 66450, 66455, 66460, 66465, 66470, + 66475, 66480, 66485, 66491, 66496, 66502, 66509, 2635, 66514, 66520, + 9347, 66524, 66529, 66536, 66544, 4174, 4179, 4184, 4189, 65, 66548, + 66554, 66559, 66564, 66568, 66573, 66577, 66581, 12325, 66585, 66595, + 66608, 66619, 66632, 66639, 66645, 66653, 11807, 66660, 66665, 66671, + 66677, 66683, 66688, 66693, 66698, 66703, 66707, 66712, 66717, 66722, + 66728, 66734, 66740, 66745, 66749, 66754, 66759, 66763, 66768, 66773, + 66778, 66782, 12341, 12352, 12357, 1503, 66786, 66792, 1508, 19026, + 66797, 19035, 66802, 66808, 66813, 1539, 66819, 1545, 1551, 12387, 66824, + 66833, 66841, 66849, 66856, 66860, 66864, 66870, 66875, 35651, 66880, + 66887, 66894, 66899, 66903, 66907, 66916, 66921, 66926, 66931, 1556, 264, + 66936, 66940, 19161, 984, 66944, 66951, 66956, 66960, 19197, 1560, 44141, + 66963, 66968, 66978, 66987, 66992, 66996, 67002, 1565, 46983, 67007, + 67016, 67022, 67027, 67032, 12626, 12632, 67038, 67050, 67067, 67084, + 67101, 67118, 67135, 67152, 67169, 67186, 67203, 67220, 67237, 67254, + 67271, 67288, 67305, 67322, 67339, 67356, 67373, 67390, 67407, 67424, + 67441, 67458, 67475, 67492, 67509, 67526, 67543, 67560, 67577, 67594, + 67611, 67628, 67645, 67662, 67679, 67696, 67713, 67730, 67747, 67764, + 67781, 67798, 67815, 67832, 67849, 67866, 67883, 67894, 67904, 67909, + 1570, 67913, 67918, 67924, 67929, 67934, 67941, 10369, 1575, 67947, + 67956, 31894, 67961, 67972, 12643, 67982, 67987, 67993, 67998, 68005, + 68011, 68016, 1580, 19491, 68021, 68027, 12653, 68033, 68038, 68043, + 68048, 68053, 68058, 68063, 68068, 1585, 4638, 68073, 68078, 68084, + 68089, 68094, 68099, 68104, 68109, 68114, 68119, 68124, 68130, 68136, + 68142, 68147, 68151, 68156, 68161, 68165, 68170, 68175, 68180, 68185, + 68189, 68194, 68200, 68205, 68210, 68214, 68219, 68224, 68230, 68235, + 68240, 68246, 68252, 68257, 68261, 68266, 68271, 68276, 68280, 68285, + 68290, 68295, 68301, 68307, 68312, 68316, 68320, 68325, 68330, 68335, + 33586, 68339, 68344, 68349, 68355, 68360, 68365, 68369, 68374, 68379, + 68385, 68390, 68395, 68401, 68407, 68412, 68416, 68421, 68426, 68430, + 68435, 68440, 68445, 68451, 68457, 68462, 68466, 68471, 68476, 68480, + 68485, 68490, 68495, 68500, 68504, 68507, 68510, 68515, 68520, 36371, + 68527, 68535, 68541, 3840, 31837, 68554, 68561, 68567, 68573, 4014, + 68578, 12795, 68584, 68594, 68609, 68617, 12800, 68628, 68633, 68644, + 68656, 68668, 68680, 2827, 68692, 68697, 68709, 68713, 68719, 68725, + 68730, 68739, 68746, 68751, 68756, 68761, 68766, 68771, 68776, 1602, + 18664, 68781, 68786, 47049, 68790, 68794, 68799, 68803, 19639, 68808, + 68811, 68816, 68824, 68832, 1606, 12836, 12842, 1611, 68840, 68847, + 68852, 68861, 68871, 68878, 68883, 68888, 1616, 68895, 68900, 19759, + 68904, 68909, 68916, 68922, 68926, 68939, 68945, 68956, 68966, 68973, + 19781, 10263, 10270, 4248, 4254, 68980, 1621, 68985, 68994, 69000, 69008, + 69015, 69021, 69028, 69040, 69046, 69051, 69058, 69070, 69081, 69090, + 69100, 69110, 4142, 69118, 35445, 35454, 19821, 69131, 69136, 69141, + 69146, 69151, 69156, 69161, 1626, 1630, 69166, 69170, 69173, 69184, + 69189, 1640, 69197, 69202, 69207, 19880, 69219, 69222, 69228, 69234, + 69239, 69247, 1645, 69252, 69257, 69265, 69273, 69280, 69289, 69297, + 69306, 69310, 1650, 69319, 1655, 24467, 69324, 69331, 69337, 19967, + 69345, 69355, 69361, 69366, 69374, 69381, 69390, 69398, 69408, 69417, + 69427, 69436, 69447, 69457, 69467, 69476, 69486, 69500, 69513, 69522, + 69530, 69540, 69549, 69561, 69572, 69583, 69593, 19259, 69598, 12988, + 69607, 69613, 69618, 69625, 69632, 69638, 18870, 69648, 69654, 69659, + 69670, 69677, 69684, 69689, 69697, 13005, 13010, 69705, 69711, 69715, + 4232, 4243, 20043, 47137, 69723, 69729, 69734, 69742, 69749, 14056, + 69754, 69760, 69766, 1666, 69771, 69774, 69780, 69785, 69790, 69795, + 69800, 69805, 69810, 69815, 69820, 69826, 69832, 1373, 69837, 69842, + 69847, 69853, 69858, 69863, 69868, 69873, 69878, 69883, 1675, 13, 69889, + 69893, 69898, 69902, 69906, 69910, 36652, 69915, 26735, 69920, 69925, + 69929, 69932, 69936, 69940, 69945, 69949, 69954, 69958, 69964, 40163, + 40168, 40173, 69967, 69974, 69980, 69988, 46755, 69998, 40179, 36916, + 36667, 36673, 40195, 36679, 70003, 70008, 70012, 36949, 70019, 70022, + 70026, 70034, 70041, 70046, 70049, 70054, 70059, 70063, 70067, 70070, + 70080, 70092, 70099, 70105, 36684, 70112, 38567, 70115, 9364, 1108, + 70118, 70122, 70127, 4057, 70131, 70134, 15778, 70141, 70148, 70161, + 70169, 70178, 70187, 70193, 70198, 70208, 70221, 70233, 70240, 70245, + 70254, 70267, 41831, 70285, 70290, 70297, 70303, 70308, 844, 70313, + 70321, 70328, 70335, 31341, 866, 70341, 70347, 70357, 70365, 70371, + 70376, 36703, 6637, 36717, 70380, 70390, 70395, 70403, 70413, 70428, + 70434, 70440, 36727, 70445, 35793, 70449, 70454, 70461, 70466, 70470, + 70475, 70483, 19824, 70490, 70495, 70499, 6678, 36753, 70503, 70509, 330, + 70519, 70526, 70533, 70539, 70546, 70551, 70560, 15409, 66972, 66982, + 70566, 70574, 70578, 70582, 70586, 70590, 70595, 70599, 70605, 70613, + 70618, 70623, 70630, 70635, 70639, 70644, 70648, 70652, 70658, 70664, + 70669, 70673, 70678, 70682, 36877, 70686, 36883, 36889, 70691, 70697, + 70704, 70709, 70713, 35810, 19478, 70716, 70720, 70725, 70732, 70738, + 70742, 70747, 46351, 70753, 70757, 70764, 70768, 70773, 70779, 70785, + 70791, 70803, 70812, 70822, 70828, 70835, 70840, 70845, 70849, 70852, + 70858, 70865, 70870, 70875, 70882, 70889, 70896, 70902, 70907, 70912, + 70920, 36894, 2465, 70925, 70930, 70936, 70941, 70947, 70952, 70957, + 70962, 70968, 36915, 70973, 70979, 70985, 70991, 36985, 70996, 71001, + 71006, 36996, 71011, 71016, 71021, 71027, 71033, 37001, 71038, 71043, + 71048, 37056, 37062, 71053, 71058, 37067, 37089, 32170, 37095, 37099, + 71063, 13757, 71067, 71075, 71081, 71089, 71096, 71102, 71112, 71118, + 71125, 12225, 37113, 71131, 71144, 71153, 71159, 71168, 71174, 71180, + 71187, 27078, 71195, 71202, 71212, 71220, 71223, 37057, 71228, 71235, + 71240, 71244, 71248, 71253, 71257, 4371, 71262, 71267, 71272, 40257, + 40262, 71276, 40276, 71281, 40281, 71286, 71292, 40293, 40299, 40305, + 71297, 71303, 25970, 71314, 71317, 71329, 71337, 37136, 71341, 71350, + 71360, 71369, 37146, 71374, 71381, 71390, 71396, 71404, 71411, 71418, + 6729, 4978, 71423, 37068, 71429, 71432, 71438, 71445, 71450, 71455, + 26982, 71459, 71465, 71471, 71476, 71481, 71485, 71491, 71497, 38451, + 71502, 41446, 43251, 43257, 37177, 37182, 71506, 71510, 71514, 71517, + 71530, 71536, 71540, 71543, 71548, 38820, 71552, 35815, 24408, 71558, + 6658, 6666, 10069, 71561, 71566, 71571, 71576, 71581, 71586, 71591, + 71596, 71601, 71606, 71612, 71617, 71622, 71628, 71633, 71638, 71643, + 71648, 71653, 71658, 71664, 71669, 71675, 71680, 71685, 71690, 71695, + 71700, 71705, 71710, 71715, 71720, 71725, 71731, 71736, 71741, 71746, + 71751, 71756, 71761, 71767, 71772, 71777, 71782, 71787, 71792, 71797, + 71802, 71807, 71812, 71818, 71823, 71828, 71833, 71838, 71844, 71850, + 71855, 71861, 71866, 71871, 71876, 71881, 71886, 1453, 156, 71891, 71895, + 71899, 71903, 28871, 71907, 71911, 71916, 71920, 71925, 71929, 71934, + 71939, 71944, 71948, 71952, 71957, 71961, 15488, 71966, 71970, 71977, + 71987, 17688, 71996, 72005, 72009, 72014, 72019, 72023, 72027, 28659, + 3183, 72031, 72037, 20325, 72041, 72050, 72058, 72064, 72069, 72081, + 72093, 72098, 72102, 72107, 72111, 72117, 72123, 72128, 72138, 72148, + 72154, 72162, 72167, 72171, 72177, 72182, 72189, 72195, 72200, 72209, + 72218, 72222, 18204, 72225, 72234, 72242, 72254, 72265, 72276, 72285, + 72289, 72298, 72306, 72316, 72324, 72331, 72341, 72347, 72352, 72359, + 72368, 72374, 72379, 72386, 72392, 72403, 60, 35588, 72409, 30253, 30263, + 72415, 72423, 72430, 72436, 72440, 72450, 72461, 72469, 72478, 72483, + 72488, 72493, 72497, 72501, 20272, 72509, 72513, 72519, 72529, 72536, + 72542, 72548, 40356, 72552, 72554, 72557, 72563, 72567, 72578, 72588, + 72594, 72601, 72608, 15425, 72616, 72622, 72631, 72640, 72646, 11169, + 72652, 72658, 72663, 72668, 72675, 72680, 72687, 72693, 72698, 72706, + 72719, 72728, 72737, 69462, 69472, 72747, 72753, 72762, 72768, 72774, + 72781, 72788, 72795, 72802, 72809, 72814, 72818, 72822, 72825, 72835, + 72839, 72851, 9733, 72860, 72871, 72876, 72880, 69481, 72886, 72893, + 72902, 72910, 72918, 72923, 72927, 72932, 72937, 72947, 72955, 72967, + 72972, 72976, 72980, 72986, 72994, 73001, 73013, 73021, 73032, 73039, + 73045, 73055, 73061, 73065, 73074, 73083, 73090, 73096, 73101, 73105, + 73109, 73113, 73122, 73131, 73140, 73146, 73152, 73158, 73163, 73170, + 73176, 73184, 73191, 73197, 14520, 73202, 73208, 73212, 16579, 73216, + 73221, 73231, 73236, 73245, 73251, 73257, 73265, 73272, 73276, 73280, + 73287, 73293, 73301, 73308, 73314, 73325, 73329, 73333, 73337, 73340, + 73346, 73351, 73356, 73360, 73364, 73373, 73381, 73388, 73394, 73401, + 27708, 46480, 73406, 73414, 73418, 73422, 73425, 73433, 73440, 73446, + 73455, 73463, 73469, 73474, 73478, 73483, 73488, 73492, 73496, 73500, + 73505, 73514, 73518, 73525, 43360, 73529, 73535, 73543, 73547, 73553, + 73561, 73567, 73572, 73583, 73591, 73597, 73606, 26117, 73614, 73621, + 73628, 73635, 73642, 73649, 49969, 15240, 73656, 73663, 73668, 40392, + 4603, 73674, 73679, 73684, 73690, 73696, 73702, 73707, 73712, 73717, + 73722, 73728, 73733, 73739, 73744, 73750, 73755, 73760, 73765, 73770, + 73775, 73780, 73785, 73791, 73796, 73802, 73807, 73812, 73817, 73822, + 73827, 73832, 73838, 73843, 73848, 73853, 73858, 73863, 73868, 73873, + 73878, 73883, 73888, 73894, 73899, 73904, 73909, 73914, 73919, 73924, + 73929, 73934, 73940, 73945, 73950, 73955, 73960, 73965, 73970, 73975, + 73980, 73985, 73990, 73995, 74000, 74006, 1830, 282, 74011, 44259, 74015, + 74018, 74023, 74027, 74030, 3554, 74035, 74040, 74044, 74053, 74064, + 74081, 74099, 74107, 72914, 74114, 74117, 74127, 74134, 74143, 74159, + 74168, 74178, 74183, 74196, 74206, 74215, 74223, 74237, 74245, 74254, + 74258, 74261, 74268, 74274, 74285, 74292, 74304, 74315, 74326, 74335, + 74342, 1213, 772, 74352, 2668, 74356, 74361, 74370, 1013, 8806, 23861, + 74378, 74386, 74400, 74413, 74417, 74422, 74427, 74432, 74438, 74444, + 74449, 9356, 17731, 74454, 74458, 74466, 9793, 74471, 74477, 74486, + 74494, 1683, 12849, 1023, 4286, 74498, 74502, 74511, 74521, 2419, 31065, + 74530, 74536, 19731, 31080, 74542, 4451, 13231, 74548, 74555, 69179, + 74559, 74563, 74569, 74574, 74579, 3773, 160, 3799, 74584, 74596, 74600, + 74604, 74610, 74615, 31914, 74619, 13219, 2862, 4, 74624, 74634, 74645, + 74656, 74666, 74672, 74683, 74690, 74696, 74702, 74710, 74717, 74723, + 74733, 74743, 74753, 74762, 27065, 1225, 74767, 74771, 74775, 74781, + 74785, 2885, 2891, 9353, 2274, 74789, 74793, 74802, 74810, 74821, 74829, + 74837, 74843, 74848, 74859, 74870, 74878, 74884, 74889, 10978, 74899, + 74907, 74911, 74915, 74920, 74924, 74936, 32363, 17633, 74943, 74953, + 74959, 74965, 7739, 11080, 74975, 74986, 74997, 75007, 75016, 75020, + 75027, 1015, 1095, 75037, 75042, 75050, 68905, 75058, 75063, 75074, + 75081, 75095, 16388, 504, 75105, 75112, 75116, 75120, 75128, 75137, + 75145, 19776, 75151, 75165, 75172, 75178, 75186, 75195, 75202, 75212, + 75220, 75227, 75235, 75242, 4250, 116, 75250, 75261, 75265, 75277, 75283, + 13427, 204, 75288, 10401, 75293, 2930, 75297, 75304, 75310, 75321, 75331, + 75339, 75346, 9744, 75353, 75362, 75370, 4331, 75383, 4348, 75387, 75392, + 75398, 75403, 75408, 75413, 2935, 540, 75419, 75432, 75436, 75441, 2940, + 1829, 892, 75445, 4352, 75453, 75459, 75463, 783, 75473, 75482, 75487, + 3790, 75491, 17382, 17389, 53331, 75495, 4383, 4260, 15118, 75503, 75510, + 75515, 27129, 75519, 75526, 75532, 75537, 75542, 17402, 192, 75547, + 75559, 75565, 75573, 2952, 1720, 75581, 75583, 75588, 75593, 75598, + 75604, 75609, 75614, 75619, 75624, 75629, 75634, 75640, 75645, 75650, + 75655, 75660, 75665, 75670, 75675, 75680, 75686, 75691, 75696, 75701, + 75707, 75712, 75718, 75723, 75728, 75733, 75738, 75743, 75748, 75753, + 75759, 75764, 75770, 75775, 75780, 75785, 75790, 75795, 75800, 75805, + 75810, 9425, 9438, 4399, 4404, 4409, 4414, 26, 75816, 75822, 75827, + 75832, 75837, 75843, 75848, 75852, 75856, 75861, 75867, 75871, 75877, + 75882, 75887, 75893, 75898, 75902, 75907, 75912, 75916, 75919, 75921, + 75925, 75928, 75935, 75940, 75944, 75949, 75953, 75957, 75961, 75970, + 75974, 37410, 75977, 37415, 75984, 75989, 37420, 75998, 76007, 37426, + 76012, 37431, 76021, 76026, 13470, 76030, 76035, 76040, 37436, 76044, + 76053, 48174, 76057, 76060, 76064, 9024, 76070, 76073, 76078, 76083, + 76087, 4072, 37441, 76090, 76094, 76097, 76108, 76113, 76117, 76123, + 76131, 76144, 76148, 76156, 76165, 76171, 76176, 76182, 76186, 76192, + 76198, 76206, 76211, 76215, 76222, 76228, 76236, 76245, 76253, 37444, + 76260, 76270, 76279, 76287, 76298, 76311, 76316, 76321, 76325, 76334, + 76340, 76347, 76360, 76372, 76383, 76395, 76402, 76411, 76420, 76429, + 76436, 76442, 76449, 76457, 76464, 76472, 76481, 76489, 76496, 76504, + 76513, 76521, 76530, 76540, 76549, 76557, 76564, 76572, 76581, 76589, + 76598, 76608, 76617, 76625, 76634, 76644, 76653, 76663, 76674, 76684, + 76693, 76701, 76708, 76716, 76725, 76733, 76742, 76752, 76761, 76769, + 76778, 76788, 76797, 76807, 76818, 76828, 76837, 76845, 76854, 76864, + 76873, 76883, 76894, 76904, 76913, 76923, 76934, 76944, 76955, 76967, + 76978, 76988, 76997, 77005, 77012, 77020, 77029, 77037, 77046, 77056, + 77065, 77073, 77082, 77092, 77101, 77111, 77122, 77132, 77141, 77149, + 77158, 77168, 77177, 77187, 77198, 77208, 77217, 77227, 77238, 77248, + 77259, 77271, 77282, 77292, 77301, 77309, 77318, 77328, 77337, 77347, + 77358, 77368, 77377, 77387, 77398, 77408, 77419, 77431, 77442, 77452, + 77461, 77471, 77482, 77492, 77503, 77515, 77526, 77536, 77547, 77559, + 77570, 77582, 77595, 77607, 77618, 77628, 77637, 77645, 77652, 77660, + 77669, 77677, 77686, 77696, 77705, 77713, 77722, 77732, 77741, 77751, + 77762, 77772, 77781, 77789, 77798, 77808, 77817, 77827, 77838, 77848, + 77857, 77867, 77878, 77888, 77899, 77911, 77922, 77932, 77941, 77949, + 77958, 77968, 77977, 77987, 77998, 78008, 78017, 78027, 78038, 78048, + 78059, 78071, 78082, 78092, 78101, 78111, 78122, 78132, 78143, 78155, + 78166, 78176, 78187, 78199, 78210, 78222, 78235, 78247, 78258, 78268, + 78277, 78285, 78294, 78304, 78313, 78323, 78334, 78344, 78353, 78363, + 78374, 78384, 78395, 78407, 78418, 78428, 78437, 78447, 78458, 78468, + 78479, 78491, 78502, 78512, 78523, 78535, 78546, 78558, 78571, 78583, + 78594, 78604, 78613, 78623, 78634, 78644, 78655, 78667, 78678, 78688, + 78699, 78711, 78722, 78734, 78747, 78759, 78770, 78780, 78791, 78803, + 78814, 78826, 78839, 78851, 78862, 78874, 78887, 78899, 78912, 78926, + 78939, 78951, 78962, 78972, 78981, 78989, 78996, 79001, 79005, 8837, + 79012, 79017, 37454, 79023, 79028, 37459, 79034, 23983, 29818, 79039, + 79045, 79053, 79059, 79065, 79072, 79079, 79084, 79089, 79093, 79098, + 79102, 79105, 79109, 79118, 79127, 79135, 79141, 79153, 79164, 79168, + 3245, 8812, 79173, 79176, 79179, 79181, 79185, 79189, 79193, 79199, + 79204, 29881, 79209, 79213, 79216, 79221, 79225, 79232, 79238, 79242, + 6822, 79246, 79251, 37481, 79255, 79262, 79271, 79279, 79285, 79296, + 79304, 79313, 79321, 79328, 79335, 79341, 79352, 37486, 79357, 79368, + 79380, 79388, 79399, 79408, 79416, 79427, 79432, 79440, 2630, 79445, + 39762, 79458, 79462, 79474, 79482, 79487, 79495, 79506, 20490, 79515, + 79521, 79528, 79536, 79542, 37496, 79547, 4377, 66345, 79554, 79557, + 79565, 79578, 79591, 79604, 79617, 79624, 79635, 79644, 79649, 49786, + 49791, 79653, 79657, 79665, 79672, 79681, 79689, 79695, 79704, 79712, + 79719, 79727, 79731, 79740, 79749, 79759, 79772, 79785, 79795, 37501, + 79801, 79808, 79814, 79820, 37507, 79825, 79828, 79832, 79840, 79849, + 49569, 79857, 79866, 79874, 79881, 79889, 79899, 79908, 79917, 38949, + 79926, 79937, 79952, 79962, 10434, 24737, 79971, 79976, 79981, 79985, + 18862, 79990, 79995, 80001, 80006, 80011, 80017, 80022, 80027, 24697, + 80032, 80039, 80047, 80055, 80063, 80068, 80075, 80082, 80087, 1738, + 80091, 80095, 80103, 80111, 37524, 80117, 80123, 80135, 80141, 80148, + 80152, 80159, 80164, 80171, 80177, 80184, 80195, 80205, 80215, 80227, + 80233, 80241, 80247, 80257, 80267, 37551, 80276, 80285, 80291, 80303, + 80314, 80321, 80326, 80330, 80338, 80344, 80349, 80354, 80361, 80369, + 80381, 80391, 80400, 80409, 80417, 80424, 39595, 27496, 80430, 80435, + 80439, 80443, 80448, 80456, 80462, 80473, 80486, 80491, 80498, 37556, + 80503, 80515, 80524, 80532, 80542, 80553, 80566, 80573, 80582, 80591, + 80599, 80604, 80610, 80614, 1442, 80619, 80624, 80629, 80634, 80640, + 80645, 80650, 80656, 80662, 80667, 80671, 80676, 80681, 80686, 66912, + 80691, 80696, 80701, 80706, 80712, 80718, 80723, 80727, 80732, 18861, + 80737, 80743, 80748, 80754, 80759, 80764, 80769, 80774, 80778, 80784, + 80789, 80798, 80803, 80808, 80813, 80818, 80822, 80829, 80835, 4707, + 20088, 3210, 80840, 80844, 80849, 80853, 80857, 80861, 53586, 80865, + 80790, 80867, 80877, 37565, 80880, 80885, 80894, 80900, 6791, 37570, + 80904, 80910, 80915, 80921, 80926, 80930, 80937, 80942, 80952, 80961, + 80965, 80971, 80977, 80983, 80987, 80995, 81002, 81010, 81018, 37575, + 81025, 81028, 81039, 81046, 81052, 81057, 81061, 81067, 81075, 81082, + 81087, 81091, 81100, 81108, 81114, 81119, 37580, 81126, 26955, 81138, + 81144, 81149, 81155, 81162, 81168, 24430, 31538, 81174, 81179, 81185, + 81189, 81201, 80823, 80830, 24629, 81211, 81216, 81223, 81229, 81236, + 81242, 81253, 81258, 81266, 10139, 81271, 81274, 81280, 81284, 81288, + 81291, 81297, 81303, 37297, 4708, 1457, 15537, 81310, 81316, 81322, + 81328, 81334, 81340, 81346, 81352, 81358, 81363, 81368, 81373, 81378, + 81383, 81388, 81393, 81398, 81403, 81408, 81413, 81418, 81423, 81429, + 81434, 81439, 81445, 81450, 81455, 81461, 81467, 81473, 81479, 81485, + 81491, 81497, 81503, 81509, 81514, 81519, 81525, 81530, 81535, 81541, + 81546, 81551, 81556, 81561, 81566, 81571, 81576, 81581, 81586, 81591, + 81596, 81601, 81607, 81612, 81617, 81622, 81628, 81633, 81638, 81643, + 81648, 81654, 81659, 81664, 81669, 81674, 81679, 81684, 81689, 81694, + 81699, 81704, 81709, 81714, 81719, 81724, 81729, 81734, 81739, 81744, + 81749, 81755, 81760, 81765, 81770, 81775, 81780, 81785, 81790, 979, 169, + 81795, 81799, 81803, 81808, 81816, 81820, 81827, 81835, 81839, 81852, + 81860, 81865, 81870, 30316, 81874, 81879, 81883, 81888, 81892, 81900, + 81904, 23991, 81909, 81913, 69719, 81917, 81920, 81928, 81936, 81944, + 81949, 81954, 81961, 81968, 81974, 81980, 81985, 81992, 81997, 82005, + 74405, 82012, 82017, 69491, 82024, 82029, 82033, 82040, 82046, 82053, + 69518, 13542, 82061, 82066, 82071, 82075, 82078, 82089, 82098, 82104, + 82109, 82113, 82123, 82132, 47965, 82136, 82140, 82147, 82160, 82166, + 82174, 82183, 82194, 82205, 82216, 82227, 82236, 82242, 82251, 82259, + 82269, 82282, 82290, 82297, 82308, 82314, 82319, 82324, 82330, 82340, + 82346, 82356, 82364, 82371, 82381, 82390, 80505, 82398, 82404, 82412, + 82418, 72959, 82425, 82430, 82433, 82437, 82443, 82447, 82450, 82458, + 82464, 82470, 82478, 82490, 82502, 82509, 82514, 82518, 82529, 82537, + 82544, 82556, 82564, 82571, 82579, 82586, 82592, 82597, 82607, 82616, + 82624, 82629, 82639, 82648, 48830, 82655, 82659, 82664, 82672, 82679, + 82685, 82689, 82699, 82710, 82718, 82725, 82737, 82749, 82758, 79448, + 82765, 82775, 82787, 82798, 82812, 82820, 82830, 82837, 82845, 82858, + 82870, 82879, 82887, 82897, 82908, 82920, 82929, 82939, 82949, 82958, + 82965, 82974, 82989, 82997, 83007, 83016, 83024, 83037, 66315, 83052, + 83062, 83071, 83083, 83093, 83105, 83116, 83130, 83144, 83158, 83172, + 83186, 83200, 83214, 83228, 83242, 83256, 83270, 83284, 83298, 83312, + 83326, 83340, 83354, 83368, 83382, 83396, 83410, 83424, 83438, 83452, + 83466, 83480, 83494, 83508, 83522, 83536, 83550, 83564, 83578, 83592, + 83606, 83620, 83634, 83648, 83662, 83676, 83690, 83704, 83718, 83732, + 83746, 83760, 83774, 83788, 83802, 83816, 83830, 83844, 83858, 83872, + 83886, 83900, 83914, 83928, 83942, 83956, 83970, 83984, 83998, 84012, + 84026, 84040, 84054, 84068, 84082, 84096, 84110, 84124, 84138, 84152, + 84166, 84180, 84194, 84208, 84222, 84236, 84250, 84264, 84278, 84292, + 84306, 84320, 84334, 84348, 84362, 84376, 84390, 84404, 84418, 84432, + 84446, 84460, 84474, 84488, 84502, 84516, 84530, 84544, 84558, 84572, + 84586, 84600, 84614, 84628, 84642, 84656, 84670, 84684, 84698, 84712, + 84726, 84740, 84754, 84768, 84782, 84796, 84810, 84824, 84838, 84852, + 84866, 84880, 84894, 84908, 84922, 84936, 84950, 84964, 84978, 84992, + 85006, 85020, 85034, 85048, 85062, 85076, 85090, 85104, 85118, 85132, + 85146, 85160, 85174, 85188, 85202, 85216, 85230, 85244, 85258, 85272, + 85286, 85300, 85314, 85328, 85342, 85356, 85370, 85384, 85398, 85412, + 85426, 85440, 85454, 85468, 85482, 85496, 85510, 85524, 85538, 85552, + 85566, 85580, 85594, 85608, 85622, 85636, 85650, 85664, 85678, 85692, + 85706, 85720, 85734, 85748, 85762, 85776, 85790, 85804, 85818, 85832, + 85846, 85860, 85874, 85888, 85902, 85916, 85930, 85944, 85958, 85972, + 85986, 86000, 86014, 86028, 86042, 86056, 86070, 86084, 86098, 86112, + 86126, 86140, 86154, 86168, 86182, 86196, 86210, 86224, 86238, 86252, + 86266, 86280, 86294, 86308, 86322, 86336, 86350, 86364, 86378, 86392, + 86406, 86420, 86434, 86448, 86462, 86476, 86490, 86504, 86518, 86532, + 86546, 86560, 86574, 86588, 86602, 86616, 86630, 86644, 86658, 86672, + 86686, 86700, 86714, 86728, 86742, 86756, 86770, 86784, 86798, 86812, + 86826, 86840, 86854, 86868, 86882, 86896, 86910, 86924, 86938, 86952, + 86966, 86980, 86994, 87008, 87022, 87036, 87050, 87064, 87078, 87092, + 87106, 87120, 87134, 87148, 87162, 87176, 87190, 87204, 87218, 87232, + 87246, 87260, 87274, 87288, 87302, 87316, 87330, 87344, 87358, 87372, + 87386, 87400, 87414, 87428, 87442, 87456, 87470, 87484, 87498, 87512, + 87526, 87540, 87554, 87568, 87582, 87596, 87610, 87624, 87638, 87652, + 87666, 87680, 87694, 87708, 87722, 87736, 87750, 87764, 87778, 87792, + 87806, 87820, 87834, 87848, 87862, 87876, 87890, 87904, 87918, 87932, + 87946, 87960, 87974, 87988, 88002, 88016, 88030, 88044, 88058, 88072, + 88086, 88100, 88114, 88128, 88142, 88156, 88170, 88184, 88198, 88212, + 88226, 88240, 88254, 88268, 88282, 88296, 88310, 88324, 88338, 88352, + 88366, 88380, 88394, 88408, 88422, 88436, 88450, 88464, 88478, 88492, + 88506, 88520, 88534, 88548, 88562, 88576, 88590, 88604, 88618, 88632, + 88646, 88660, 88674, 88688, 88702, 88716, 88730, 88744, 88758, 88772, + 88786, 88800, 88814, 88828, 88842, 88856, 88870, 88884, 88898, 88912, + 88926, 88940, 88954, 88968, 88982, 88996, 89010, 89024, 89038, 89052, + 89066, 89080, 89094, 89108, 89122, 89136, 89150, 89164, 89178, 89192, + 89206, 89220, 89234, 89248, 89262, 89276, 89290, 89304, 89318, 89332, + 89346, 89360, 89374, 89388, 89402, 89416, 89430, 89444, 89458, 89472, + 89486, 89500, 89514, 89528, 89542, 89556, 89570, 89584, 89598, 89612, + 89626, 89640, 89654, 89668, 89682, 89696, 89710, 89724, 89738, 89752, + 89766, 89780, 89794, 89808, 89822, 89836, 89850, 89864, 89878, 89892, + 89906, 89920, 89934, 89948, 89962, 89976, 89990, 90004, 90018, 90032, + 90046, 90060, 90074, 90088, 90102, 90116, 90130, 90144, 90158, 90172, + 90186, 90200, 90214, 90228, 90242, 90256, 90270, 90284, 90298, 90312, + 90326, 90340, 90354, 90368, 90382, 90396, 90410, 90424, 90438, 90452, + 90466, 90480, 90494, 90508, 90522, 90536, 90550, 90564, 90578, 90592, + 90606, 90620, 90634, 90648, 90662, 90676, 90690, 90704, 90718, 90732, + 90746, 90760, 90774, 90788, 90802, 90816, 90830, 90844, 90858, 90872, + 90886, 90900, 90914, 90928, 90942, 90956, 90970, 90984, 90998, 91012, + 91026, 91040, 91054, 91068, 91082, 91096, 91110, 91124, 91138, 91152, + 91166, 91180, 91194, 91208, 91222, 91236, 91250, 91264, 91278, 91292, + 91306, 91320, 91334, 91348, 91362, 91376, 91390, 91404, 91418, 91432, + 91446, 91460, 91474, 91488, 91502, 91516, 91530, 91544, 91558, 91572, + 91586, 91600, 91614, 91628, 91642, 91656, 91670, 91684, 91698, 91712, + 91726, 91740, 91754, 91768, 91782, 91796, 91810, 91824, 91838, 91852, + 91866, 91880, 91894, 91908, 91922, 91936, 91950, 91964, 91978, 91992, + 92006, 92020, 92034, 92048, 92062, 92076, 92090, 92104, 92118, 92132, + 92146, 92160, 92174, 92188, 92202, 92216, 92230, 92244, 92258, 92272, + 92286, 92300, 92314, 92328, 92342, 92356, 92370, 92384, 92398, 92412, + 92426, 92440, 92454, 92468, 92482, 92496, 92510, 92524, 92538, 92552, + 92566, 92580, 92594, 92608, 92622, 92636, 92650, 92664, 92678, 92692, + 92706, 92720, 92734, 92748, 92762, 92776, 92790, 92804, 92818, 92832, + 92846, 92860, 92874, 92888, 92902, 92916, 92930, 92944, 92958, 92972, + 92986, 93000, 93014, 93028, 93042, 93056, 93070, 93084, 93098, 93112, + 93126, 93140, 93154, 93168, 93182, 93196, 93210, 93224, 93238, 93252, + 93266, 93280, 93294, 93308, 93322, 93336, 93350, 93364, 93378, 93392, + 93406, 93420, 93434, 93448, 93462, 93476, 93490, 93504, 93518, 93532, + 93546, 93560, 93574, 93588, 93602, 93616, 93630, 93644, 93658, 93672, + 93686, 93695, 93706, 93717, 93727, 93738, 93746, 93754, 93760, 93770, + 93778, 93784, 33472, 93789, 93795, 93804, 93816, 93821, 93828, 10992, + 20510, 93834, 93843, 93848, 93852, 93859, 93865, 93870, 93875, 93883, + 93891, 93896, 93904, 13996, 93908, 93911, 93913, 93928, 93941, 93948, + 93954, 93965, 93970, 93974, 93979, 93986, 93992, 93997, 94005, 74999, + 75009, 94011, 94018, 94028, 12212, 94035, 94040, 33710, 94049, 94054, + 94061, 94071, 94079, 94087, 94096, 94105, 94111, 94117, 94124, 94131, + 94136, 94140, 94148, 69535, 94153, 94162, 94170, 94177, 94182, 94186, + 94195, 94201, 94204, 94208, 94217, 94227, 81847, 94236, 94240, 94248, + 94252, 94258, 94269, 94279, 20519, 94290, 94299, 94307, 94315, 94322, + 69554, 9590, 94330, 94334, 94343, 94350, 94353, 31419, 94356, 94360, + 94365, 94382, 94394, 12170, 94406, 94411, 94416, 94421, 24081, 94425, + 94430, 94435, 94441, 94446, 6436, 94451, 24085, 94456, 94461, 94467, + 94474, 94479, 94484, 94490, 94496, 94502, 94507, 94513, 94517, 94531, + 94539, 94547, 94553, 94558, 94565, 94575, 94584, 94589, 94594, 94599, + 94607, 94618, 94623, 94629, 94634, 94643, 68029, 4637, 94648, 94666, + 94685, 94698, 94712, 94728, 94735, 94742, 94751, 94758, 94764, 94771, + 94776, 94782, 94788, 94796, 94802, 94807, 94812, 94828, 12183, 94842, + 94849, 94857, 94863, 94867, 94870, 94875, 94880, 94887, 94892, 94901, + 94907, 94912, 94918, 94924, 94933, 94942, 41290, 94947, 94955, 94964, + 13611, 94973, 94979, 94987, 94993, 94999, 95005, 95010, 95017, 95023, + 13622, 95028, 95031, 95036, 37607, 95046, 95055, 95060, 95066, 95071, + 95079, 95086, 95097, 95113, 95129, 95145, 95161, 95177, 95193, 95209, + 95225, 95241, 95257, 95273, 95289, 95305, 95321, 95337, 95353, 95369, + 95385, 95401, 95417, 95433, 95449, 95465, 95481, 95497, 95513, 95529, + 95545, 95561, 95577, 95593, 95609, 95625, 95641, 95657, 95673, 95689, + 95705, 95721, 95737, 95753, 95769, 95785, 95801, 95817, 95833, 95849, + 95865, 95881, 95897, 95913, 95929, 95945, 95961, 95977, 95993, 96009, + 96025, 96041, 96057, 96073, 96089, 96105, 96121, 96137, 96153, 96169, + 96185, 96201, 96217, 96233, 96249, 96265, 96281, 96297, 96313, 96329, + 96345, 96361, 96377, 96393, 96409, 96425, 96441, 96457, 96473, 96489, + 96505, 96521, 96537, 96553, 96569, 96585, 96601, 96617, 96633, 96649, + 96665, 96681, 96697, 96713, 96729, 96745, 96761, 96777, 96793, 96809, + 96825, 96841, 96857, 96873, 96889, 96905, 96921, 96937, 96953, 96969, + 96985, 97001, 97017, 97033, 97049, 97065, 97081, 97097, 97113, 97129, + 97145, 97161, 97177, 97193, 97209, 97225, 97241, 97257, 97273, 97289, + 97305, 97321, 97337, 97353, 97369, 97385, 97401, 97417, 97433, 97449, + 97465, 97481, 97497, 97513, 97529, 97545, 97561, 97577, 97593, 97609, + 97625, 97641, 97657, 97673, 97689, 97705, 97721, 97737, 97753, 97769, + 97785, 97801, 97817, 97833, 97849, 97865, 97881, 97897, 97913, 97929, + 97945, 97961, 97977, 97993, 98009, 98025, 98041, 98057, 98073, 98089, + 98105, 98121, 98137, 98153, 98169, 98185, 98201, 98217, 98233, 98249, + 98265, 98281, 98297, 98313, 98329, 98345, 98361, 98377, 98393, 98409, + 98425, 98441, 98457, 98473, 98489, 98505, 98521, 98537, 98553, 98569, + 98585, 98601, 98617, 98633, 98649, 98665, 98681, 98697, 98713, 98729, + 98745, 98761, 98777, 98793, 98809, 98825, 98841, 98857, 98873, 98889, + 98905, 98921, 98937, 98953, 98969, 98985, 99001, 99017, 99033, 99049, + 99065, 99081, 99097, 99113, 99129, 99145, 99161, 99177, 99193, 99209, + 99225, 99241, 99257, 99273, 99289, 99305, 99321, 99337, 99353, 99369, + 99385, 99401, 99417, 99433, 99449, 99465, 99481, 99497, 99513, 99529, + 99545, 99561, 99577, 99593, 99609, 99625, 99641, 99657, 99673, 99689, + 99705, 99721, 99737, 99753, 99769, 99785, 99801, 99817, 99833, 99849, + 99865, 99881, 99897, 99913, 99929, 99945, 99961, 99977, 99993, 100009, + 100025, 100041, 100057, 100073, 100089, 100105, 100121, 100137, 100153, + 100169, 100185, 100201, 100217, 100233, 100249, 100265, 100281, 100297, + 100313, 100329, 100345, 100361, 100377, 100393, 100409, 100425, 100441, + 100457, 100473, 100489, 100505, 100521, 100537, 100553, 100569, 100585, + 100601, 100617, 100633, 100649, 100665, 100681, 100697, 100713, 100729, + 100745, 100761, 100777, 100793, 100809, 100825, 100841, 100857, 100873, + 100889, 100905, 100921, 100937, 100953, 100969, 100985, 101001, 101017, + 101033, 101049, 101065, 101081, 101097, 101113, 101129, 101145, 101161, + 101177, 101193, 101209, 101225, 101241, 101257, 101273, 101289, 101305, + 101321, 101337, 101353, 101369, 101385, 101401, 101417, 101433, 101443, + 101448, 101456, 74328, 101461, 101467, 101472, 101479, 101488, 101496, + 101500, 4231, 101506, 101513, 101519, 101523, 19842, 44355, 3219, 101528, + 101532, 101536, 101543, 101549, 101558, 101564, 101571, 101575, 101596, + 101618, 101634, 101651, 101670, 101679, 101689, 101697, 101704, 101711, + 101717, 31280, 101731, 101735, 101741, 101749, 101761, 101767, 101775, + 101782, 101787, 101792, 101796, 101804, 101811, 101815, 101821, 101827, + 101832, 3879, 49986, 101838, 101842, 101846, 101850, 101855, 101860, + 101865, 101871, 101877, 101883, 101890, 101896, 101903, 101909, 101915, + 101920, 101926, 101931, 101935, 101940, 101944, 101949, 50001, 101953, + 101958, 101966, 101970, 101975, 101982, 101991, 101997, 102006, 102010, + 102017, 102021, 102024, 102031, 102037, 102046, 102056, 102066, 102071, + 102075, 102082, 102090, 102099, 102103, 102111, 102117, 102122, 102127, + 102133, 102139, 102144, 102148, 102154, 102159, 102163, 102167, 102170, + 102175, 102183, 102193, 102199, 102204, 102214, 47161, 102222, 102234, + 102240, 102247, 102253, 102257, 102262, 102268, 102280, 102291, 102298, + 102304, 102311, 102318, 102330, 102337, 102343, 24165, 102347, 102355, + 102361, 102368, 102374, 102380, 102386, 102391, 102396, 102401, 102405, + 102414, 102422, 102433, 7696, 102438, 19278, 102444, 102448, 102452, + 102456, 102464, 102473, 102477, 102484, 102493, 102501, 102514, 102520, + 101945, 34610, 102525, 102527, 102532, 102537, 102542, 102547, 102552, + 102557, 102562, 102567, 102572, 102577, 102582, 102587, 102592, 102597, + 102603, 102608, 102613, 102618, 102623, 102628, 102633, 102638, 102643, + 102649, 102655, 102661, 102666, 102671, 102683, 102688, 1872, 54, 102693, + 102698, 37617, 102702, 37622, 37627, 37633, 37638, 102706, 37643, 25306, + 102728, 102732, 102736, 102741, 102745, 37647, 102749, 102757, 102764, + 102770, 102780, 37652, 102787, 102790, 102795, 102799, 102808, 10802, + 102816, 37657, 25150, 102819, 102823, 102831, 1347, 102836, 37668, + 102839, 102844, 29608, 29618, 40892, 102849, 102854, 102859, 102864, + 102870, 102875, 102884, 102889, 102898, 102906, 102913, 102919, 102924, + 102929, 102934, 102944, 102953, 102961, 102966, 102974, 102978, 102986, + 102990, 102997, 103005, 37472, 44090, 103012, 103018, 103023, 103028, + 14031, 32595, 103033, 103038, 103043, 103049, 103056, 103062, 103071, + 103076, 103084, 103094, 103101, 103111, 103117, 103122, 103128, 103132, + 20541, 103139, 41844, 103152, 103157, 103163, 103178, 35667, 72741, + 103191, 103195, 103204, 103213, 103220, 103226, 103234, 103240, 103249, + 103256, 44210, 103262, 103265, 103269, 103273, 103277, 11546, 103283, + 103290, 103296, 103304, 103309, 103313, 27656, 103319, 103322, 103330, + 103337, 103345, 103358, 103372, 103379, 103385, 103392, 103398, 37682, + 103402, 103409, 103417, 103425, 103431, 37687, 103439, 103445, 103450, + 103460, 103466, 103475, 35462, 40263, 103483, 103488, 103493, 103497, + 103502, 103506, 103514, 103519, 17374, 18148, 103523, 103528, 37692, + 17527, 103532, 103537, 103541, 103548, 103557, 103561, 103569, 103575, + 103580, 103586, 8879, 103591, 103597, 103602, 103607, 103618, 103627, + 103639, 103654, 37980, 103660, 19397, 37696, 103664, 103671, 103677, + 103681, 27780, 103688, 103695, 46451, 103704, 103710, 103719, 103725, + 103730, 103738, 103744, 103749, 37706, 103754, 103763, 103772, 102286, + 103781, 103788, 103794, 103800, 103809, 103819, 103825, 103833, 103840, + 103844, 37711, 103847, 37717, 1386, 103852, 103860, 103868, 103878, + 103887, 103895, 103902, 103912, 37728, 103916, 103918, 103922, 103927, + 103931, 103935, 103941, 103946, 103950, 103961, 103966, 103975, 103980, + 3224, 103984, 103991, 103995, 104004, 104012, 104020, 104027, 104032, + 104037, 71293, 104041, 104044, 104050, 104058, 104064, 104068, 104073, + 104080, 104085, 104090, 104094, 104101, 104107, 104112, 40294, 104116, + 104119, 104124, 104128, 104133, 104140, 104145, 104149, 45518, 104157, + 29627, 29636, 104163, 104169, 104175, 104180, 104184, 104187, 104197, + 104206, 104211, 104217, 104224, 104230, 104234, 104242, 104247, 40300, + 82100, 104251, 104259, 104265, 104272, 104277, 104284, 104289, 104293, + 104298, 66531, 104304, 104310, 10078, 104315, 104320, 104324, 104329, + 104334, 104339, 104343, 104348, 104353, 104359, 104364, 104369, 104375, + 104381, 104386, 104390, 104395, 104400, 104405, 104409, 27779, 104414, + 104419, 104425, 104431, 104437, 104442, 104446, 104451, 104456, 104461, + 104465, 104470, 104475, 104480, 104485, 50256, 104489, 37736, 104497, + 104501, 104509, 104517, 104528, 104533, 104537, 25779, 79551, 104542, + 104548, 104553, 4542, 104563, 104570, 104575, 104583, 104592, 104597, + 104601, 104606, 104610, 104618, 104626, 104633, 74590, 104639, 104647, + 104654, 104665, 104671, 104677, 37746, 104680, 104687, 104695, 104700, + 104704, 31770, 69123, 104710, 104715, 104722, 104727, 9970, 104731, + 104739, 104746, 104753, 104762, 104769, 104775, 104789, 104797, 6517, + 104559, 104803, 104808, 104814, 104818, 104821, 104829, 104836, 104841, + 104854, 104861, 104867, 104871, 104879, 104884, 104891, 104897, 104902, + 69394, 104907, 104910, 104919, 104926, 104932, 104936, 104939, 104947, + 104953, 104962, 104972, 104982, 104991, 105002, 105010, 105021, 105026, + 105030, 105035, 105039, 41023, 105047, 24493, 41032, 105052, 97700, + 97716, 97732, 97748, 97764, 105057, 97796, 97812, 97828, 97844, 97956, + 97972, 105061, 98004, 98020, 105065, 105069, 105073, 105077, 98260, + 98292, 105081, 98324, 105085, 105089, 98468, 98484, 98500, 98516, 105093, + 98580, 98596, 105097, 98724, 98740, 98756, 98772, 98788, 98804, 98820, + 98836, 98852, 98868, 98980, 98996, 99012, 99028, 99044, 99060, 99076, + 99092, 99108, 99124, 105101, 100916, 101028, 101092, 101108, 101124, + 101140, 101156, 101172, 101284, 101300, 101316, 105105, 101364, 105109, + 101396, 101412, 101428, 105113, 105118, 105123, 105128, 105133, 105138, + 105143, 105147, 105151, 105156, 105161, 105165, 105170, 105175, 105179, + 105184, 105189, 105194, 105199, 105203, 105208, 105213, 105217, 105222, + 105226, 105230, 105234, 105238, 105243, 105247, 105251, 105255, 105259, + 105263, 105267, 105271, 105275, 105279, 105284, 105289, 105294, 105299, + 105304, 105309, 105314, 105319, 105324, 105329, 105333, 105337, 105341, + 105345, 105349, 105353, 105358, 105362, 105367, 105371, 105376, 105381, + 105385, 105389, 105394, 105398, 105402, 105406, 105410, 105414, 105418, + 105422, 105426, 105430, 105434, 105438, 105442, 105446, 105450, 105455, + 105460, 105464, 105468, 105472, 105476, 105480, 105484, 105489, 105493, + 105497, 105501, 105505, 105509, 105513, 105518, 105522, 105527, 105531, + 105535, 105539, 105543, 105547, 105551, 105555, 105559, 105563, 105567, + 105571, 105576, 105580, 105584, 105588, 105592, 105596, 105600, 105604, + 105608, 105612, 105616, 105620, 105625, 105629, 105633, 105638, 105643, + 105647, 105651, 105655, 105659, 105663, 105667, 105671, 105675, 105680, + 105684, 105689, 105693, 105698, 105702, 105707, 105711, 105717, 105722, + 105726, 105731, 105735, 105740, 105744, 105749, 105753, 105758, 1461, + 105762, 2966, 1726, 26950, 1634, 29563, 105766, 2975, 105770, 1316, + 105775, 1258, 105779, 105783, 2999, 105787, 105795, 105802, 105809, + 105823, 3003, 7803, 105832, 105840, 105847, 105858, 105867, 105871, + 105878, 105890, 105903, 105916, 105927, 105932, 105939, 105951, 105955, + 3007, 13692, 105965, 105970, 105979, 105989, 105994, 3011, 106002, + 106006, 106011, 106018, 106024, 106029, 106038, 106046, 106058, 106068, + 1263, 15119, 106081, 106085, 106091, 106105, 106117, 106129, 106137, + 106147, 106156, 106165, 106174, 106182, 106193, 106201, 4550, 106211, + 106222, 106231, 106237, 106252, 106259, 106265, 106270, 41162, 106275, + 3035, 15123, 106279, 106286, 9901, 106295, 106301, 3040, 37152, 106310, + 69023, 106317, 106321, 106327, 106338, 106344, 106349, 106356, 106362, + 106370, 106377, 106383, 106394, 106404, 106413, 106424, 106433, 106440, + 106446, 106456, 106464, 106470, 106485, 106491, 106496, 106503, 106511, + 106515, 106518, 106524, 106531, 106537, 106545, 106554, 106562, 106568, + 106577, 49571, 106591, 106596, 106602, 17133, 106607, 106620, 106632, + 106641, 106649, 106656, 106660, 106664, 106667, 106674, 106681, 106689, + 106697, 106706, 106714, 17038, 106722, 106727, 106731, 106743, 106750, + 106757, 106766, 906, 106776, 106785, 106796, 3061, 106800, 106804, + 106810, 106823, 106835, 106845, 106854, 106866, 30368, 106877, 106885, + 106894, 106905, 106916, 106926, 106936, 106944, 106953, 106961, 13139, + 106968, 106972, 106975, 106980, 106985, 106989, 106995, 1268, 107002, + 107006, 13780, 107010, 107021, 107030, 107038, 107047, 107055, 107071, + 107082, 107091, 107099, 107111, 107122, 107138, 107148, 107169, 107183, + 107196, 107204, 107211, 7849, 107224, 107229, 107235, 6526, 107241, + 107244, 107251, 107261, 8981, 107268, 107273, 107278, 107285, 107290, + 107298, 107307, 107315, 107320, 107329, 107336, 11040, 11049, 107342, + 107353, 107359, 107364, 107370, 3077, 3082, 107376, 977, 107382, 107389, + 107396, 107409, 107414, 2261, 87, 107422, 107429, 107434, 107442, 107452, + 107461, 107467, 107476, 107484, 107494, 107498, 107502, 107507, 107511, + 107523, 3105, 107531, 107539, 107544, 107555, 107566, 107578, 107589, + 107599, 107608, 24534, 107613, 107619, 107624, 107634, 107644, 107649, + 32484, 107655, 107660, 107669, 24546, 107673, 4654, 16, 107678, 107687, + 107694, 107701, 107707, 107712, 107716, 107722, 32508, 107727, 107732, + 69685, 107737, 107742, 107748, 107754, 107762, 107767, 107775, 107782, + 107788, 107793, 45394, 49465, 107799, 1797, 32, 107809, 107822, 107827, + 107835, 107840, 107846, 3131, 32563, 107851, 107859, 107866, 107871, + 107876, 107885, 4233, 4244, 70891, 107893, 107897, 1661, 1809, 107902, + 107907, 107914, 32916, 1813, 302, 107921, 107927, 107932, 3153, 107936, + 107941, 107948, 1817, 107953, 107959, 107964, 107976, 6757, 107986, + 107993, 1824, 107999, 108004, 108011, 108018, 108033, 108040, 108051, + 108056, 108064, 2696, 108068, 108080, 108085, 108089, 108095, 32362, + 2266, 108099, 108110, 108114, 108118, 108124, 108128, 108137, 108141, + 108152, 108156, 2312, 36969, 108160, 108170, 108178, 3244, 108184, + 108193, 108201, 10439, 108206, 108214, 108219, 108223, 108232, 108239, + 108245, 3214, 17197, 108249, 108262, 108280, 108285, 108293, 108301, + 108311, 11344, 15241, 108323, 108336, 108343, 108357, 108364, 108380, + 108387, 108393, 24584, 14454, 108400, 108407, 108417, 108426, 50255, + 108438, 108446, 50390, 108453, 108456, 108462, 108468, 108474, 108480, + 108486, 108493, 108500, 108506, 108512, 108518, 108524, 108530, 108536, + 108542, 108548, 108554, 108560, 108566, 108572, 108578, 108584, 108590, + 108596, 108602, 108608, 108614, 108620, 108626, 108632, 108638, 108644, + 108650, 108656, 108662, 108668, 108674, 108680, 108686, 108692, 108698, + 108704, 108710, 108716, 108722, 108728, 108734, 108740, 108746, 108752, + 108758, 108764, 108770, 108776, 108782, 108788, 108794, 108800, 108806, + 108813, 108819, 108826, 108833, 108839, 108846, 108853, 108859, 108865, + 108871, 108877, 108883, 108889, 108895, 108901, 108907, 108913, 108919, + 108925, 108931, 108937, 108943, 3228, 10412, 108949, 108959, 108965, + 108973, 108977, 106014, 3232, 108981, 102515, 24294, 14066, 4158, 108985, + 3238, 108989, 108999, 109005, 109011, 109017, 109023, 109029, 109035, + 109041, 109047, 109053, 109059, 109065, 109071, 109077, 109083, 109089, + 109095, 109101, 109107, 109113, 109119, 109125, 109131, 109137, 109143, + 109149, 109156, 109163, 109169, 109175, 109181, 109187, 109193, 109199, + 1273, 109205, 109210, 109215, 109220, 109225, 109230, 109235, 109240, + 109245, 109249, 109253, 109257, 109261, 109265, 109269, 109273, 109277, + 109281, 109287, 109293, 109299, 109305, 109309, 109313, 109317, 109321, + 109325, 109329, 109333, 109337, 109341, 109346, 109351, 109356, 109361, + 109366, 109371, 109376, 109381, 109386, 109391, 109396, 109401, 109406, + 109411, 109416, 109421, 109426, 109431, 109436, 109441, 109446, 109451, + 109456, 109461, 109466, 109471, 109476, 109481, 109486, 109491, 109496, + 109501, 109506, 109511, 109516, 109521, 109526, 109531, 109536, 109541, + 109546, 109551, 109556, 109561, 109566, 109571, 109576, 109581, 109586, + 109591, 109596, 109601, 109606, 109611, 109616, 109621, 109626, 109631, + 109636, 109641, 109646, 109651, 109656, 109661, 109666, 109671, 109676, + 109681, 109686, 109691, 109696, 109701, 109706, 109711, 109716, 109721, + 109726, 109731, 109736, 109741, 109746, 109751, 109756, 109761, 109766, + 109771, 109776, 109781, 109786, 109791, 109796, 109801, 109806, 109811, + 109816, 109821, 109826, 109831, 109836, 109841, 109846, 109851, 109856, + 109861, 109866, 109871, 109876, 109881, 109886, 109891, 109896, 109901, + 109906, 109911, 109916, 109921, 109926, 109931, 109936, 109941, 109946, + 109951, 109956, 109961, 109966, 109971, 109976, 109981, 109986, 109991, + 109996, 110001, 110006, 110011, 110016, 110021, 110026, 110031, 110036, + 110041, 110046, 110051, 110056, 110061, 110066, 110071, 110076, 110081, + 110086, 110091, 110096, 110101, 110106, 110111, 110116, 110121, 110126, + 110131, 110136, 110141, 110146, 110151, 110156, 110161, 110166, 110171, + 110176, 110181, 110186, 110191, 110196, 110201, 110206, 110211, 110216, + 110221, 110226, 110231, 110237, 110242, 110247, 110252, 110257, 110262, + 110267, 110272, 110278, 110283, 110288, 110293, 110298, 110303, 110308, + 110313, 110318, 110323, 110328, 110333, 110338, 110343, 110348, 110353, + 110358, 110363, 110368, 110373, 110378, 110383, 110388, 110393, 110398, + 110403, 110408, 110413, 110418, 110423, 110428, 110433, 110438, 110447, + 110452, 110461, 110466, 110475, 110480, 110489, 110494, 110503, 110508, + 110517, 110522, 110531, 110536, 110545, 110550, 110555, 110564, 110568, + 110577, 110582, 110591, 110596, 110605, 110610, 110619, 110624, 110633, + 110638, 110647, 110652, 110661, 110666, 110675, 110680, 110689, 110694, + 110703, 110708, 110713, 110718, 110723, 110728, 110733, 110738, 110742, + 110747, 110752, 110757, 110762, 110767, 110772, 110778, 110783, 110788, + 110793, 110799, 110803, 110808, 110814, 110819, 110824, 110829, 110834, + 110839, 110844, 110849, 110854, 110859, 110864, 110870, 110875, 110880, + 110885, 110891, 110896, 110901, 110906, 110911, 110917, 110922, 110927, + 110932, 110937, 110942, 110948, 110953, 110958, 110963, 110968, 110973, + 110978, 110983, 110988, 110993, 110998, 111003, 111008, 111013, 111018, + 111023, 111028, 111033, 111038, 111043, 111048, 111053, 111058, 111063, + 111069, 111075, 111081, 111086, 111091, 111096, 111101, 111107, 111113, + 111119, 111124, 111129, 111134, 111140, 111145, 111150, 111155, 111160, + 111165, 111170, 111175, 111180, 111185, 111190, 111195, 111200, 111205, + 111210, 111215, 111220, 111226, 111232, 111238, 111243, 111248, 111253, + 111258, 111264, 111270, 111276, 111281, 111286, 111291, 111296, 111301, + 111306, 111311, 111316, 111321, 18785, 111326, 111332, 111337, 111342, + 111347, 111352, 111357, 111363, 111368, 111373, 111378, 111383, 111388, + 111394, 111399, 111404, 111409, 111414, 111419, 111424, 111429, 111434, + 111439, 111444, 111449, 111454, 111459, 111464, 111469, 111474, 111479, + 111484, 111489, 111494, 111499, 111504, 111510, 111515, 111520, 111525, + 111530, 111535, 111540, 111545, 111550, 111555, 111560, 111565, 111570, + 111575, 111580, 111585, 111590, 111595, 111600, 111605, 111610, 111615, + 111620, 111625, 111630, 111635, 111640, 111645, 111650, 111655, 111660, + 111665, 111670, 111675, 111680, 111685, 111690, 111695, 111700, 111705, + 111710, 111716, 111721, 111726, 111731, 111736, 111741, 111746, 111751, + 111756, 111761, 111766, 111771, 111777, 111782, 111788, 111793, 111798, + 111803, 111808, 111813, 111818, 111824, 111829, 111834, 111840, 111845, + 111850, 111855, 111860, 111865, 111871, 111877, 111882, 111887, 14088, + 111892, 111897, 111902, 111907, 111912, 111917, 111922, 111927, 111932, + 111937, 111942, 111947, 111952, 111957, 111962, 111967, 111972, 111977, + 111982, 111987, 111992, 111997, 112002, 112007, 112012, 112017, 112022, + 112027, 112032, 112037, 112042, 112047, 112052, 112057, 112062, 112067, + 112072, 112077, 112082, 112087, 112092, 112097, 112102, 112107, 112112, + 112117, 112122, 112127, 112132, 112137, 112142, 112147, 112152, 112157, + 112162, 112167, 112172, 112177, 112182, 112187, 112192, 112197, 112202, + 112207, 112212, 112218, 112223, 112228, 112233, 112238, 112244, 112249, + 112254, 112259, 112264, 112269, 112274, 112280, 112285, 112290, 112295, + 112300, 112305, 112311, 112316, 112321, 112326, 112331, 112336, 112342, + 112347, 112352, 112357, 112362, 112367, 112373, 112379, 112384, 112389, + 112394, 112400, 112406, 112412, 112417, 112422, 112428, 112434, 112439, + 112445, 112451, 112457, 112462, 112467, 112473, 112478, 112484, 112489, + 112495, 112504, 112509, 112514, 112520, 112525, 112531, 112536, 112541, + 112546, 112551, 112556, 112561, 112566, 112571, 112576, 112581, 112586, + 112591, 112596, 112601, 112606, 112611, 112616, 112621, 112626, 112631, + 112636, 112641, 112646, 112651, 112656, 112661, 112666, 112671, 112676, + 112681, 112686, 112692, 112698, 112704, 112709, 112714, 112719, 112724, + 112729, 112734, 112739, 112744, 112749, 112754, 112759, 112764, 112769, + 112774, 112779, 112784, 112789, 112794, 112799, 112804, 112810, 112816, + 112821, 112827, 112832, 112837, 112843, 112848, 112854, 112859, 112865, + 112870, 112876, 112881, 112887, 112892, 112897, 112902, 112907, 112912, + 112917, 112922, 109000, 109006, 109012, 109018, 112928, 109024, 109030, + 112934, 109036, 109042, 109048, 109054, 109060, 109066, 109072, 109078, + 109084, 112940, 109090, 109096, 109102, 112946, 109108, 109114, 109120, + 109126, 112952, 109132, 109138, 109144, 109164, 112958, 112964, 109170, + 112970, 109176, 109182, 109188, 109194, 109200, 112976, 3255, 3260, + 112981, 3275, 3280, 3285, 112986, 112989, 112995, 113001, 113008, 113013, + 113018, 2317, }; /* code->name phrasebook */ #define phrasebook_shift 7 #define phrasebook_short 194 static const unsigned char phrasebook[] = { - 0, 205, 148, 236, 89, 78, 211, 61, 78, 31, 55, 239, 9, 55, 213, 44, 55, - 251, 110, 251, 29, 50, 213, 139, 53, 213, 139, 250, 178, 98, 55, 244, - 158, 231, 5, 234, 216, 204, 226, 205, 177, 17, 195, 79, 17, 100, 17, 102, - 17, 134, 17, 136, 17, 146, 17, 167, 17, 178, 17, 171, 17, 182, 244, 167, - 207, 105, 222, 139, 55, 236, 171, 55, 233, 93, 55, 211, 78, 78, 244, 156, - 250, 167, 8, 6, 1, 63, 8, 6, 1, 250, 111, 8, 6, 1, 247, 206, 8, 6, 1, - 240, 230, 8, 6, 1, 69, 8, 6, 1, 236, 48, 8, 6, 1, 234, 189, 8, 6, 1, 233, - 14, 8, 6, 1, 68, 8, 6, 1, 225, 216, 8, 6, 1, 225, 79, 8, 6, 1, 159, 8, 6, - 1, 221, 135, 8, 6, 1, 218, 54, 8, 6, 1, 72, 8, 6, 1, 214, 2, 8, 6, 1, - 211, 166, 8, 6, 1, 144, 8, 6, 1, 209, 80, 8, 6, 1, 203, 216, 8, 6, 1, 66, + 0, 205, 148, 236, 90, 78, 211, 62, 78, 31, 55, 239, 10, 55, 213, 45, 55, + 251, 111, 251, 30, 50, 213, 140, 53, 213, 140, 250, 179, 98, 55, 244, + 159, 231, 6, 234, 217, 204, 226, 205, 177, 17, 195, 79, 17, 100, 17, 102, + 17, 134, 17, 136, 17, 146, 17, 167, 17, 178, 17, 171, 17, 182, 244, 168, + 207, 105, 222, 140, 55, 236, 172, 55, 233, 94, 55, 211, 79, 78, 244, 157, + 250, 168, 8, 6, 1, 63, 8, 6, 1, 250, 112, 8, 6, 1, 247, 207, 8, 6, 1, + 240, 231, 8, 6, 1, 69, 8, 6, 1, 236, 49, 8, 6, 1, 234, 190, 8, 6, 1, 233, + 15, 8, 6, 1, 68, 8, 6, 1, 225, 217, 8, 6, 1, 225, 80, 8, 6, 1, 159, 8, 6, + 1, 221, 136, 8, 6, 1, 218, 55, 8, 6, 1, 72, 8, 6, 1, 214, 3, 8, 6, 1, + 211, 167, 8, 6, 1, 144, 8, 6, 1, 209, 80, 8, 6, 1, 203, 216, 8, 6, 1, 66, 8, 6, 1, 199, 230, 8, 6, 1, 197, 199, 8, 6, 1, 196, 222, 8, 6, 1, 196, 148, 8, 6, 1, 195, 158, 50, 47, 179, 210, 90, 205, 177, 53, 47, 179, 244, - 240, 252, 21, 126, 222, 74, 233, 100, 252, 21, 8, 4, 1, 63, 8, 4, 1, 250, - 111, 8, 4, 1, 247, 206, 8, 4, 1, 240, 230, 8, 4, 1, 69, 8, 4, 1, 236, 48, - 8, 4, 1, 234, 189, 8, 4, 1, 233, 14, 8, 4, 1, 68, 8, 4, 1, 225, 216, 8, - 4, 1, 225, 79, 8, 4, 1, 159, 8, 4, 1, 221, 135, 8, 4, 1, 218, 54, 8, 4, - 1, 72, 8, 4, 1, 214, 2, 8, 4, 1, 211, 166, 8, 4, 1, 144, 8, 4, 1, 209, + 241, 252, 22, 126, 222, 75, 233, 101, 252, 22, 8, 4, 1, 63, 8, 4, 1, 250, + 112, 8, 4, 1, 247, 207, 8, 4, 1, 240, 231, 8, 4, 1, 69, 8, 4, 1, 236, 49, + 8, 4, 1, 234, 190, 8, 4, 1, 233, 15, 8, 4, 1, 68, 8, 4, 1, 225, 217, 8, + 4, 1, 225, 80, 8, 4, 1, 159, 8, 4, 1, 221, 136, 8, 4, 1, 218, 55, 8, 4, + 1, 72, 8, 4, 1, 214, 3, 8, 4, 1, 211, 167, 8, 4, 1, 144, 8, 4, 1, 209, 80, 8, 4, 1, 203, 216, 8, 4, 1, 66, 8, 4, 1, 199, 230, 8, 4, 1, 197, 199, - 8, 4, 1, 196, 222, 8, 4, 1, 196, 148, 8, 4, 1, 195, 158, 50, 241, 17, - 179, 83, 222, 74, 53, 241, 17, 179, 202, 84, 216, 43, 205, 148, 226, 16, - 236, 89, 78, 247, 38, 55, 212, 62, 55, 241, 16, 55, 196, 60, 55, 248, 32, - 154, 208, 133, 55, 239, 149, 241, 104, 55, 235, 169, 214, 66, 226, 67, - 222, 178, 52, 251, 90, 211, 61, 78, 216, 18, 55, 205, 186, 231, 6, 210, - 148, 55, 220, 113, 239, 230, 55, 212, 123, 55, 204, 95, 102, 204, 95, - 134, 252, 9, 252, 21, 219, 68, 55, 212, 178, 55, 112, 238, 252, 247, 49, - 204, 95, 100, 220, 12, 214, 66, 226, 67, 210, 17, 52, 251, 90, 211, 61, - 78, 197, 217, 191, 97, 211, 86, 197, 217, 191, 97, 232, 224, 197, 217, - 191, 115, 211, 84, 226, 16, 211, 78, 78, 8, 6, 1, 39, 3, 233, 99, 8, 6, - 1, 39, 3, 186, 8, 6, 1, 39, 3, 244, 239, 8, 6, 1, 39, 3, 202, 84, 8, 6, - 1, 39, 3, 239, 149, 8, 6, 1, 39, 3, 210, 3, 57, 8, 6, 1, 251, 244, 8, 6, - 1, 247, 207, 3, 247, 49, 8, 6, 1, 237, 135, 3, 233, 99, 8, 6, 1, 237, - 135, 3, 186, 8, 6, 1, 237, 135, 3, 244, 239, 8, 6, 1, 237, 135, 3, 239, - 149, 8, 6, 1, 230, 248, 3, 233, 99, 8, 6, 1, 230, 248, 3, 186, 8, 6, 1, - 230, 248, 3, 244, 239, 8, 6, 1, 230, 248, 3, 239, 149, 8, 6, 1, 236, 120, - 8, 6, 1, 218, 55, 3, 202, 84, 8, 6, 1, 177, 3, 233, 99, 8, 6, 1, 177, 3, - 186, 8, 6, 1, 177, 3, 244, 239, 8, 6, 1, 177, 3, 202, 84, 8, 6, 1, 177, - 3, 239, 149, 218, 117, 55, 8, 6, 1, 177, 3, 106, 8, 6, 1, 118, 3, 233, - 99, 8, 6, 1, 118, 3, 186, 8, 6, 1, 118, 3, 244, 239, 8, 6, 1, 118, 3, - 239, 149, 8, 6, 1, 196, 149, 3, 186, 8, 6, 1, 202, 162, 8, 4, 1, 207, 13, - 209, 80, 8, 4, 1, 39, 3, 233, 99, 8, 4, 1, 39, 3, 186, 8, 4, 1, 39, 3, - 244, 239, 8, 4, 1, 39, 3, 202, 84, 8, 4, 1, 39, 3, 239, 149, 8, 4, 1, 39, - 3, 210, 3, 57, 8, 4, 1, 251, 244, 8, 4, 1, 247, 207, 3, 247, 49, 8, 4, 1, - 237, 135, 3, 233, 99, 8, 4, 1, 237, 135, 3, 186, 8, 4, 1, 237, 135, 3, - 244, 239, 8, 4, 1, 237, 135, 3, 239, 149, 8, 4, 1, 230, 248, 3, 233, 99, - 8, 4, 1, 230, 248, 3, 186, 8, 4, 1, 230, 248, 3, 244, 239, 8, 4, 1, 230, - 248, 3, 239, 149, 8, 4, 1, 236, 120, 8, 4, 1, 218, 55, 3, 202, 84, 8, 4, - 1, 177, 3, 233, 99, 8, 4, 1, 177, 3, 186, 8, 4, 1, 177, 3, 244, 239, 8, - 4, 1, 177, 3, 202, 84, 8, 4, 1, 177, 3, 239, 149, 239, 53, 55, 8, 4, 1, - 177, 3, 106, 8, 4, 1, 118, 3, 233, 99, 8, 4, 1, 118, 3, 186, 8, 4, 1, - 118, 3, 244, 239, 8, 4, 1, 118, 3, 239, 149, 8, 4, 1, 196, 149, 3, 186, - 8, 4, 1, 202, 162, 8, 4, 1, 196, 149, 3, 239, 149, 8, 6, 1, 39, 3, 220, - 113, 8, 4, 1, 39, 3, 220, 113, 8, 6, 1, 39, 3, 248, 46, 8, 4, 1, 39, 3, - 248, 46, 8, 6, 1, 39, 3, 214, 150, 8, 4, 1, 39, 3, 214, 150, 8, 6, 1, - 247, 207, 3, 186, 8, 4, 1, 247, 207, 3, 186, 8, 6, 1, 247, 207, 3, 244, - 239, 8, 4, 1, 247, 207, 3, 244, 239, 8, 6, 1, 247, 207, 3, 76, 57, 8, 4, - 1, 247, 207, 3, 76, 57, 8, 6, 1, 247, 207, 3, 247, 105, 8, 4, 1, 247, - 207, 3, 247, 105, 8, 6, 1, 240, 231, 3, 247, 105, 8, 4, 1, 240, 231, 3, - 247, 105, 8, 6, 1, 240, 231, 3, 106, 8, 4, 1, 240, 231, 3, 106, 8, 6, 1, - 237, 135, 3, 220, 113, 8, 4, 1, 237, 135, 3, 220, 113, 8, 6, 1, 237, 135, - 3, 248, 46, 8, 4, 1, 237, 135, 3, 248, 46, 8, 6, 1, 237, 135, 3, 76, 57, - 8, 4, 1, 237, 135, 3, 76, 57, 8, 6, 1, 237, 135, 3, 214, 150, 8, 4, 1, - 237, 135, 3, 214, 150, 8, 6, 1, 237, 135, 3, 247, 105, 8, 4, 1, 237, 135, - 3, 247, 105, 8, 6, 1, 234, 190, 3, 244, 239, 8, 4, 1, 234, 190, 3, 244, - 239, 8, 6, 1, 234, 190, 3, 248, 46, 8, 4, 1, 234, 190, 3, 248, 46, 8, 6, - 1, 234, 190, 3, 76, 57, 8, 4, 1, 234, 190, 3, 76, 57, 8, 6, 1, 234, 190, - 3, 247, 49, 8, 4, 1, 234, 190, 3, 247, 49, 8, 6, 1, 233, 15, 3, 244, 239, - 8, 4, 1, 233, 15, 3, 244, 239, 8, 6, 1, 233, 15, 3, 106, 8, 4, 1, 233, - 15, 3, 106, 8, 6, 1, 230, 248, 3, 202, 84, 8, 4, 1, 230, 248, 3, 202, 84, - 8, 6, 1, 230, 248, 3, 220, 113, 8, 4, 1, 230, 248, 3, 220, 113, 8, 6, 1, - 230, 248, 3, 248, 46, 8, 4, 1, 230, 248, 3, 248, 46, 8, 6, 1, 230, 248, - 3, 214, 150, 8, 4, 1, 230, 248, 3, 214, 150, 8, 6, 1, 230, 248, 3, 76, - 57, 8, 4, 1, 238, 251, 68, 8, 6, 33, 226, 117, 8, 4, 33, 226, 117, 8, 6, - 1, 225, 217, 3, 244, 239, 8, 4, 1, 225, 217, 3, 244, 239, 8, 6, 1, 225, - 80, 3, 247, 49, 8, 4, 1, 225, 80, 3, 247, 49, 8, 4, 1, 223, 209, 8, 6, 1, - 223, 99, 3, 186, 8, 4, 1, 223, 99, 3, 186, 8, 6, 1, 223, 99, 3, 247, 49, - 8, 4, 1, 223, 99, 3, 247, 49, 8, 6, 1, 223, 99, 3, 247, 105, 8, 4, 1, - 223, 99, 3, 247, 105, 8, 6, 1, 223, 99, 3, 112, 238, 252, 8, 4, 1, 223, - 99, 3, 112, 238, 252, 8, 6, 1, 223, 99, 3, 106, 8, 4, 1, 223, 99, 3, 106, - 8, 6, 1, 218, 55, 3, 186, 8, 4, 1, 218, 55, 3, 186, 8, 6, 1, 218, 55, 3, - 247, 49, 8, 4, 1, 218, 55, 3, 247, 49, 8, 6, 1, 218, 55, 3, 247, 105, 8, - 4, 1, 218, 55, 3, 247, 105, 8, 4, 1, 218, 55, 212, 36, 247, 218, 251, 29, - 8, 6, 1, 236, 214, 8, 4, 1, 236, 214, 8, 6, 1, 177, 3, 220, 113, 8, 4, 1, - 177, 3, 220, 113, 8, 6, 1, 177, 3, 248, 46, 8, 4, 1, 177, 3, 248, 46, 8, - 6, 1, 177, 3, 52, 186, 8, 4, 1, 177, 3, 52, 186, 8, 6, 33, 214, 163, 8, - 4, 33, 214, 163, 8, 6, 1, 211, 31, 3, 186, 8, 4, 1, 211, 31, 3, 186, 8, - 6, 1, 211, 31, 3, 247, 49, 8, 4, 1, 211, 31, 3, 247, 49, 8, 6, 1, 211, - 31, 3, 247, 105, 8, 4, 1, 211, 31, 3, 247, 105, 8, 6, 1, 209, 81, 3, 186, - 8, 4, 1, 209, 81, 3, 186, 8, 6, 1, 209, 81, 3, 244, 239, 8, 4, 1, 209, - 81, 3, 244, 239, 8, 6, 1, 209, 81, 3, 247, 49, 8, 4, 1, 209, 81, 3, 247, - 49, 8, 6, 1, 209, 81, 3, 247, 105, 8, 4, 1, 209, 81, 3, 247, 105, 8, 6, - 1, 203, 217, 3, 247, 49, 8, 4, 1, 203, 217, 3, 247, 49, 8, 6, 1, 203, - 217, 3, 247, 105, 8, 4, 1, 203, 217, 3, 247, 105, 8, 6, 1, 203, 217, 3, + 8, 4, 1, 196, 222, 8, 4, 1, 196, 148, 8, 4, 1, 195, 158, 50, 241, 18, + 179, 83, 222, 75, 53, 241, 18, 179, 202, 84, 216, 44, 205, 148, 226, 17, + 236, 90, 78, 247, 39, 55, 212, 63, 55, 241, 17, 55, 196, 60, 55, 248, 33, + 154, 208, 133, 55, 239, 150, 241, 105, 55, 235, 170, 214, 67, 226, 68, + 222, 179, 52, 251, 91, 211, 62, 78, 216, 19, 55, 205, 186, 231, 7, 210, + 149, 55, 220, 114, 239, 231, 55, 212, 124, 55, 204, 95, 102, 204, 95, + 134, 252, 10, 252, 22, 219, 69, 55, 212, 179, 55, 112, 238, 253, 247, 50, + 204, 95, 100, 220, 13, 214, 67, 226, 68, 210, 17, 52, 251, 91, 211, 62, + 78, 197, 217, 191, 97, 211, 87, 197, 217, 191, 97, 232, 225, 197, 217, + 191, 115, 211, 85, 226, 17, 211, 79, 78, 8, 6, 1, 39, 3, 233, 100, 8, 6, + 1, 39, 3, 186, 8, 6, 1, 39, 3, 244, 240, 8, 6, 1, 39, 3, 202, 84, 8, 6, + 1, 39, 3, 239, 150, 8, 6, 1, 39, 3, 210, 3, 57, 8, 6, 1, 251, 245, 8, 6, + 1, 247, 208, 3, 247, 50, 8, 6, 1, 237, 136, 3, 233, 100, 8, 6, 1, 237, + 136, 3, 186, 8, 6, 1, 237, 136, 3, 244, 240, 8, 6, 1, 237, 136, 3, 239, + 150, 8, 6, 1, 230, 249, 3, 233, 100, 8, 6, 1, 230, 249, 3, 186, 8, 6, 1, + 230, 249, 3, 244, 240, 8, 6, 1, 230, 249, 3, 239, 150, 8, 6, 1, 236, 121, + 8, 6, 1, 218, 56, 3, 202, 84, 8, 6, 1, 177, 3, 233, 100, 8, 6, 1, 177, 3, + 186, 8, 6, 1, 177, 3, 244, 240, 8, 6, 1, 177, 3, 202, 84, 8, 6, 1, 177, + 3, 239, 150, 218, 118, 55, 8, 6, 1, 177, 3, 106, 8, 6, 1, 118, 3, 233, + 100, 8, 6, 1, 118, 3, 186, 8, 6, 1, 118, 3, 244, 240, 8, 6, 1, 118, 3, + 239, 150, 8, 6, 1, 196, 149, 3, 186, 8, 6, 1, 202, 162, 8, 4, 1, 207, 13, + 209, 80, 8, 4, 1, 39, 3, 233, 100, 8, 4, 1, 39, 3, 186, 8, 4, 1, 39, 3, + 244, 240, 8, 4, 1, 39, 3, 202, 84, 8, 4, 1, 39, 3, 239, 150, 8, 4, 1, 39, + 3, 210, 3, 57, 8, 4, 1, 251, 245, 8, 4, 1, 247, 208, 3, 247, 50, 8, 4, 1, + 237, 136, 3, 233, 100, 8, 4, 1, 237, 136, 3, 186, 8, 4, 1, 237, 136, 3, + 244, 240, 8, 4, 1, 237, 136, 3, 239, 150, 8, 4, 1, 230, 249, 3, 233, 100, + 8, 4, 1, 230, 249, 3, 186, 8, 4, 1, 230, 249, 3, 244, 240, 8, 4, 1, 230, + 249, 3, 239, 150, 8, 4, 1, 236, 121, 8, 4, 1, 218, 56, 3, 202, 84, 8, 4, + 1, 177, 3, 233, 100, 8, 4, 1, 177, 3, 186, 8, 4, 1, 177, 3, 244, 240, 8, + 4, 1, 177, 3, 202, 84, 8, 4, 1, 177, 3, 239, 150, 239, 54, 55, 8, 4, 1, + 177, 3, 106, 8, 4, 1, 118, 3, 233, 100, 8, 4, 1, 118, 3, 186, 8, 4, 1, + 118, 3, 244, 240, 8, 4, 1, 118, 3, 239, 150, 8, 4, 1, 196, 149, 3, 186, + 8, 4, 1, 202, 162, 8, 4, 1, 196, 149, 3, 239, 150, 8, 6, 1, 39, 3, 220, + 114, 8, 4, 1, 39, 3, 220, 114, 8, 6, 1, 39, 3, 248, 47, 8, 4, 1, 39, 3, + 248, 47, 8, 6, 1, 39, 3, 214, 151, 8, 4, 1, 39, 3, 214, 151, 8, 6, 1, + 247, 208, 3, 186, 8, 4, 1, 247, 208, 3, 186, 8, 6, 1, 247, 208, 3, 244, + 240, 8, 4, 1, 247, 208, 3, 244, 240, 8, 6, 1, 247, 208, 3, 76, 57, 8, 4, + 1, 247, 208, 3, 76, 57, 8, 6, 1, 247, 208, 3, 247, 106, 8, 4, 1, 247, + 208, 3, 247, 106, 8, 6, 1, 240, 232, 3, 247, 106, 8, 4, 1, 240, 232, 3, + 247, 106, 8, 6, 1, 240, 232, 3, 106, 8, 4, 1, 240, 232, 3, 106, 8, 6, 1, + 237, 136, 3, 220, 114, 8, 4, 1, 237, 136, 3, 220, 114, 8, 6, 1, 237, 136, + 3, 248, 47, 8, 4, 1, 237, 136, 3, 248, 47, 8, 6, 1, 237, 136, 3, 76, 57, + 8, 4, 1, 237, 136, 3, 76, 57, 8, 6, 1, 237, 136, 3, 214, 151, 8, 4, 1, + 237, 136, 3, 214, 151, 8, 6, 1, 237, 136, 3, 247, 106, 8, 4, 1, 237, 136, + 3, 247, 106, 8, 6, 1, 234, 191, 3, 244, 240, 8, 4, 1, 234, 191, 3, 244, + 240, 8, 6, 1, 234, 191, 3, 248, 47, 8, 4, 1, 234, 191, 3, 248, 47, 8, 6, + 1, 234, 191, 3, 76, 57, 8, 4, 1, 234, 191, 3, 76, 57, 8, 6, 1, 234, 191, + 3, 247, 50, 8, 4, 1, 234, 191, 3, 247, 50, 8, 6, 1, 233, 16, 3, 244, 240, + 8, 4, 1, 233, 16, 3, 244, 240, 8, 6, 1, 233, 16, 3, 106, 8, 4, 1, 233, + 16, 3, 106, 8, 6, 1, 230, 249, 3, 202, 84, 8, 4, 1, 230, 249, 3, 202, 84, + 8, 6, 1, 230, 249, 3, 220, 114, 8, 4, 1, 230, 249, 3, 220, 114, 8, 6, 1, + 230, 249, 3, 248, 47, 8, 4, 1, 230, 249, 3, 248, 47, 8, 6, 1, 230, 249, + 3, 214, 151, 8, 4, 1, 230, 249, 3, 214, 151, 8, 6, 1, 230, 249, 3, 76, + 57, 8, 4, 1, 238, 252, 68, 8, 6, 33, 226, 118, 8, 4, 33, 226, 118, 8, 6, + 1, 225, 218, 3, 244, 240, 8, 4, 1, 225, 218, 3, 244, 240, 8, 6, 1, 225, + 81, 3, 247, 50, 8, 4, 1, 225, 81, 3, 247, 50, 8, 4, 1, 223, 210, 8, 6, 1, + 223, 100, 3, 186, 8, 4, 1, 223, 100, 3, 186, 8, 6, 1, 223, 100, 3, 247, + 50, 8, 4, 1, 223, 100, 3, 247, 50, 8, 6, 1, 223, 100, 3, 247, 106, 8, 4, + 1, 223, 100, 3, 247, 106, 8, 6, 1, 223, 100, 3, 112, 238, 253, 8, 4, 1, + 223, 100, 3, 112, 238, 253, 8, 6, 1, 223, 100, 3, 106, 8, 4, 1, 223, 100, + 3, 106, 8, 6, 1, 218, 56, 3, 186, 8, 4, 1, 218, 56, 3, 186, 8, 6, 1, 218, + 56, 3, 247, 50, 8, 4, 1, 218, 56, 3, 247, 50, 8, 6, 1, 218, 56, 3, 247, + 106, 8, 4, 1, 218, 56, 3, 247, 106, 8, 4, 1, 218, 56, 212, 37, 247, 219, + 251, 30, 8, 6, 1, 236, 215, 8, 4, 1, 236, 215, 8, 6, 1, 177, 3, 220, 114, + 8, 4, 1, 177, 3, 220, 114, 8, 6, 1, 177, 3, 248, 47, 8, 4, 1, 177, 3, + 248, 47, 8, 6, 1, 177, 3, 52, 186, 8, 4, 1, 177, 3, 52, 186, 8, 6, 33, + 214, 164, 8, 4, 33, 214, 164, 8, 6, 1, 211, 32, 3, 186, 8, 4, 1, 211, 32, + 3, 186, 8, 6, 1, 211, 32, 3, 247, 50, 8, 4, 1, 211, 32, 3, 247, 50, 8, 6, + 1, 211, 32, 3, 247, 106, 8, 4, 1, 211, 32, 3, 247, 106, 8, 6, 1, 209, 81, + 3, 186, 8, 4, 1, 209, 81, 3, 186, 8, 6, 1, 209, 81, 3, 244, 240, 8, 4, 1, + 209, 81, 3, 244, 240, 8, 6, 1, 209, 81, 3, 247, 50, 8, 4, 1, 209, 81, 3, + 247, 50, 8, 6, 1, 209, 81, 3, 247, 106, 8, 4, 1, 209, 81, 3, 247, 106, 8, + 6, 1, 203, 217, 3, 247, 50, 8, 4, 1, 203, 217, 3, 247, 50, 8, 6, 1, 203, + 217, 3, 247, 106, 8, 4, 1, 203, 217, 3, 247, 106, 8, 6, 1, 203, 217, 3, 106, 8, 4, 1, 203, 217, 3, 106, 8, 6, 1, 118, 3, 202, 84, 8, 4, 1, 118, - 3, 202, 84, 8, 6, 1, 118, 3, 220, 113, 8, 4, 1, 118, 3, 220, 113, 8, 6, - 1, 118, 3, 248, 46, 8, 4, 1, 118, 3, 248, 46, 8, 6, 1, 118, 3, 210, 3, + 3, 202, 84, 8, 6, 1, 118, 3, 220, 114, 8, 4, 1, 118, 3, 220, 114, 8, 6, + 1, 118, 3, 248, 47, 8, 4, 1, 118, 3, 248, 47, 8, 6, 1, 118, 3, 210, 3, 57, 8, 4, 1, 118, 3, 210, 3, 57, 8, 6, 1, 118, 3, 52, 186, 8, 4, 1, 118, - 3, 52, 186, 8, 6, 1, 118, 3, 214, 150, 8, 4, 1, 118, 3, 214, 150, 8, 6, - 1, 197, 200, 3, 244, 239, 8, 4, 1, 197, 200, 3, 244, 239, 8, 6, 1, 196, - 149, 3, 244, 239, 8, 4, 1, 196, 149, 3, 244, 239, 8, 6, 1, 196, 149, 3, - 239, 149, 8, 6, 1, 195, 159, 3, 186, 8, 4, 1, 195, 159, 3, 186, 8, 6, 1, + 3, 52, 186, 8, 6, 1, 118, 3, 214, 151, 8, 4, 1, 118, 3, 214, 151, 8, 6, + 1, 197, 200, 3, 244, 240, 8, 4, 1, 197, 200, 3, 244, 240, 8, 6, 1, 196, + 149, 3, 244, 240, 8, 4, 1, 196, 149, 3, 244, 240, 8, 6, 1, 196, 149, 3, + 239, 150, 8, 6, 1, 195, 159, 3, 186, 8, 4, 1, 195, 159, 3, 186, 8, 6, 1, 195, 159, 3, 76, 57, 8, 4, 1, 195, 159, 3, 76, 57, 8, 6, 1, 195, 159, 3, - 247, 105, 8, 4, 1, 195, 159, 3, 247, 105, 8, 4, 1, 181, 209, 80, 8, 4, 1, + 247, 106, 8, 4, 1, 195, 159, 3, 247, 106, 8, 4, 1, 181, 209, 80, 8, 4, 1, 74, 3, 106, 8, 6, 1, 74, 3, 122, 8, 6, 1, 74, 3, 201, 240, 8, 4, 1, 74, 3, 201, 240, 8, 6, 1, 152, 167, 8, 4, 1, 152, 167, 8, 6, 1, 192, 72, 8, - 6, 1, 247, 207, 3, 122, 8, 4, 1, 247, 207, 3, 122, 8, 6, 1, 251, 219, - 240, 230, 8, 6, 1, 240, 231, 3, 122, 8, 6, 1, 240, 231, 3, 201, 240, 8, - 4, 1, 240, 231, 3, 201, 240, 8, 4, 1, 163, 239, 211, 8, 6, 1, 210, 89, - 69, 8, 6, 1, 208, 163, 8, 6, 1, 192, 69, 8, 6, 1, 236, 49, 3, 122, 8, 4, - 1, 236, 49, 3, 122, 8, 6, 1, 234, 190, 3, 122, 8, 6, 1, 234, 93, 8, 4, 1, - 231, 43, 8, 6, 1, 226, 6, 8, 6, 1, 230, 248, 3, 106, 8, 6, 1, 225, 80, 3, - 122, 8, 4, 1, 225, 80, 3, 122, 8, 4, 1, 223, 99, 3, 154, 8, 4, 1, 222, - 246, 3, 106, 8, 6, 1, 163, 221, 135, 8, 6, 1, 218, 55, 3, 50, 122, 8, 4, - 1, 218, 55, 3, 181, 53, 222, 171, 8, 6, 1, 177, 3, 112, 202, 84, 8, 6, 1, - 177, 3, 231, 101, 8, 4, 1, 177, 3, 231, 101, 8, 6, 1, 214, 145, 8, 4, 1, - 214, 145, 8, 6, 1, 214, 3, 3, 122, 8, 4, 1, 214, 3, 3, 122, 8, 1, 195, - 220, 8, 6, 1, 152, 102, 8, 4, 1, 152, 102, 8, 6, 1, 236, 140, 8, 1, 210, - 89, 236, 141, 221, 224, 8, 4, 1, 203, 217, 3, 213, 214, 122, 8, 6, 1, + 6, 1, 247, 208, 3, 122, 8, 4, 1, 247, 208, 3, 122, 8, 6, 1, 251, 220, + 240, 231, 8, 6, 1, 240, 232, 3, 122, 8, 6, 1, 240, 232, 3, 201, 240, 8, + 4, 1, 240, 232, 3, 201, 240, 8, 4, 1, 163, 239, 212, 8, 6, 1, 210, 89, + 69, 8, 6, 1, 208, 163, 8, 6, 1, 192, 69, 8, 6, 1, 236, 50, 3, 122, 8, 4, + 1, 236, 50, 3, 122, 8, 6, 1, 234, 191, 3, 122, 8, 6, 1, 234, 94, 8, 4, 1, + 231, 44, 8, 6, 1, 226, 7, 8, 6, 1, 230, 249, 3, 106, 8, 6, 1, 225, 81, 3, + 122, 8, 4, 1, 225, 81, 3, 122, 8, 4, 1, 223, 100, 3, 154, 8, 4, 1, 222, + 247, 3, 106, 8, 6, 1, 163, 221, 136, 8, 6, 1, 218, 56, 3, 50, 122, 8, 4, + 1, 218, 56, 3, 181, 53, 222, 172, 8, 6, 1, 177, 3, 112, 202, 84, 8, 6, 1, + 177, 3, 231, 102, 8, 4, 1, 177, 3, 231, 102, 8, 6, 1, 214, 146, 8, 4, 1, + 214, 146, 8, 6, 1, 214, 4, 3, 122, 8, 4, 1, 214, 4, 3, 122, 8, 1, 195, + 220, 8, 6, 1, 152, 102, 8, 4, 1, 152, 102, 8, 6, 1, 236, 141, 8, 1, 210, + 89, 236, 142, 221, 225, 8, 4, 1, 203, 217, 3, 213, 215, 122, 8, 6, 1, 203, 217, 3, 122, 8, 4, 1, 203, 217, 3, 122, 8, 6, 1, 203, 217, 3, 210, - 95, 122, 8, 6, 1, 118, 3, 231, 101, 8, 4, 1, 118, 3, 231, 101, 8, 6, 1, + 95, 122, 8, 6, 1, 118, 3, 231, 102, 8, 4, 1, 118, 3, 231, 102, 8, 6, 1, 200, 28, 8, 6, 1, 199, 231, 3, 122, 8, 6, 1, 196, 149, 3, 122, 8, 4, 1, 196, 149, 3, 122, 8, 6, 1, 195, 159, 3, 106, 8, 4, 1, 195, 159, 3, 106, - 8, 6, 1, 236, 51, 8, 6, 1, 236, 52, 210, 88, 8, 4, 1, 236, 52, 210, 88, - 8, 4, 1, 236, 52, 3, 203, 135, 8, 1, 99, 3, 106, 8, 6, 1, 152, 146, 8, 4, - 1, 152, 146, 8, 1, 226, 16, 233, 151, 204, 227, 3, 106, 8, 1, 196, 225, - 8, 1, 239, 204, 244, 214, 8, 1, 222, 217, 244, 214, 8, 1, 251, 123, 244, - 214, 8, 1, 210, 95, 244, 214, 8, 6, 1, 237, 157, 3, 247, 105, 8, 6, 1, - 240, 231, 3, 4, 1, 195, 159, 3, 247, 105, 8, 4, 1, 237, 157, 3, 247, 105, - 8, 6, 1, 222, 40, 8, 6, 1, 223, 99, 3, 4, 1, 225, 216, 8, 4, 1, 222, 40, - 8, 6, 1, 216, 164, 8, 6, 1, 218, 55, 3, 4, 1, 225, 216, 8, 4, 1, 216, - 164, 8, 6, 1, 39, 3, 247, 105, 8, 4, 1, 39, 3, 247, 105, 8, 6, 1, 230, - 248, 3, 247, 105, 8, 4, 1, 230, 248, 3, 247, 105, 8, 6, 1, 177, 3, 247, - 105, 8, 4, 1, 177, 3, 247, 105, 8, 6, 1, 118, 3, 247, 105, 8, 4, 1, 118, - 3, 247, 105, 8, 6, 1, 118, 3, 239, 150, 26, 220, 113, 8, 4, 1, 118, 3, - 239, 150, 26, 220, 113, 8, 6, 1, 118, 3, 239, 150, 26, 186, 8, 4, 1, 118, - 3, 239, 150, 26, 186, 8, 6, 1, 118, 3, 239, 150, 26, 247, 105, 8, 4, 1, - 118, 3, 239, 150, 26, 247, 105, 8, 6, 1, 118, 3, 239, 150, 26, 233, 99, - 8, 4, 1, 118, 3, 239, 150, 26, 233, 99, 8, 4, 1, 163, 69, 8, 6, 1, 39, 3, - 239, 150, 26, 220, 113, 8, 4, 1, 39, 3, 239, 150, 26, 220, 113, 8, 6, 1, - 39, 3, 76, 90, 26, 220, 113, 8, 4, 1, 39, 3, 76, 90, 26, 220, 113, 8, 6, - 1, 251, 245, 3, 220, 113, 8, 4, 1, 251, 245, 3, 220, 113, 8, 6, 1, 234, - 190, 3, 106, 8, 4, 1, 234, 190, 3, 106, 8, 6, 1, 234, 190, 3, 247, 105, - 8, 4, 1, 234, 190, 3, 247, 105, 8, 6, 1, 225, 80, 3, 247, 105, 8, 4, 1, - 225, 80, 3, 247, 105, 8, 6, 1, 177, 3, 214, 150, 8, 4, 1, 177, 3, 214, - 150, 8, 6, 1, 177, 3, 214, 151, 26, 220, 113, 8, 4, 1, 177, 3, 214, 151, - 26, 220, 113, 8, 6, 1, 236, 52, 3, 247, 105, 8, 4, 1, 236, 52, 3, 247, - 105, 8, 4, 1, 225, 217, 3, 247, 105, 8, 6, 1, 237, 156, 8, 6, 1, 240, - 231, 3, 4, 1, 195, 158, 8, 4, 1, 237, 156, 8, 6, 1, 234, 190, 3, 186, 8, - 4, 1, 234, 190, 3, 186, 8, 6, 1, 231, 40, 8, 6, 1, 196, 225, 8, 6, 1, - 218, 55, 3, 233, 99, 8, 4, 1, 218, 55, 3, 233, 99, 8, 6, 1, 39, 3, 210, - 3, 90, 26, 186, 8, 4, 1, 39, 3, 210, 3, 90, 26, 186, 8, 6, 1, 251, 245, - 3, 186, 8, 4, 1, 251, 245, 3, 186, 8, 6, 1, 177, 3, 204, 196, 26, 186, 8, - 4, 1, 177, 3, 204, 196, 26, 186, 8, 6, 1, 39, 3, 52, 233, 99, 8, 4, 1, - 39, 3, 52, 233, 99, 8, 6, 1, 39, 3, 226, 16, 248, 46, 8, 4, 1, 39, 3, - 226, 16, 248, 46, 8, 6, 1, 237, 135, 3, 52, 233, 99, 8, 4, 1, 237, 135, - 3, 52, 233, 99, 8, 6, 1, 237, 135, 3, 226, 16, 248, 46, 8, 4, 1, 237, - 135, 3, 226, 16, 248, 46, 8, 6, 1, 230, 248, 3, 52, 233, 99, 8, 4, 1, - 230, 248, 3, 52, 233, 99, 8, 6, 1, 230, 248, 3, 226, 16, 248, 46, 8, 4, - 1, 230, 248, 3, 226, 16, 248, 46, 8, 6, 1, 177, 3, 52, 233, 99, 8, 4, 1, - 177, 3, 52, 233, 99, 8, 6, 1, 177, 3, 226, 16, 248, 46, 8, 4, 1, 177, 3, - 226, 16, 248, 46, 8, 6, 1, 211, 31, 3, 52, 233, 99, 8, 4, 1, 211, 31, 3, - 52, 233, 99, 8, 6, 1, 211, 31, 3, 226, 16, 248, 46, 8, 4, 1, 211, 31, 3, - 226, 16, 248, 46, 8, 6, 1, 118, 3, 52, 233, 99, 8, 4, 1, 118, 3, 52, 233, - 99, 8, 6, 1, 118, 3, 226, 16, 248, 46, 8, 4, 1, 118, 3, 226, 16, 248, 46, - 8, 6, 1, 209, 81, 3, 244, 159, 60, 8, 4, 1, 209, 81, 3, 244, 159, 60, 8, - 6, 1, 203, 217, 3, 244, 159, 60, 8, 4, 1, 203, 217, 3, 244, 159, 60, 8, - 6, 1, 195, 239, 8, 4, 1, 195, 239, 8, 6, 1, 233, 15, 3, 247, 105, 8, 4, - 1, 233, 15, 3, 247, 105, 8, 6, 1, 218, 55, 3, 181, 53, 222, 171, 8, 4, 1, - 240, 231, 3, 241, 20, 8, 6, 1, 214, 38, 8, 4, 1, 214, 38, 8, 6, 1, 195, - 159, 3, 122, 8, 4, 1, 195, 159, 3, 122, 8, 6, 1, 39, 3, 76, 57, 8, 4, 1, - 39, 3, 76, 57, 8, 6, 1, 237, 135, 3, 247, 49, 8, 4, 1, 237, 135, 3, 247, - 49, 8, 6, 1, 177, 3, 239, 150, 26, 220, 113, 8, 4, 1, 177, 3, 239, 150, - 26, 220, 113, 8, 6, 1, 177, 3, 202, 85, 26, 220, 113, 8, 4, 1, 177, 3, - 202, 85, 26, 220, 113, 8, 6, 1, 177, 3, 76, 57, 8, 4, 1, 177, 3, 76, 57, - 8, 6, 1, 177, 3, 76, 90, 26, 220, 113, 8, 4, 1, 177, 3, 76, 90, 26, 220, - 113, 8, 6, 1, 196, 149, 3, 220, 113, 8, 4, 1, 196, 149, 3, 220, 113, 8, - 4, 1, 223, 99, 3, 241, 20, 8, 4, 1, 218, 55, 3, 241, 20, 8, 4, 1, 203, - 217, 3, 241, 20, 8, 4, 1, 238, 251, 225, 216, 8, 4, 1, 240, 50, 239, 109, - 8, 4, 1, 211, 97, 239, 109, 8, 6, 1, 39, 3, 106, 8, 6, 1, 247, 207, 3, - 106, 8, 4, 1, 247, 207, 3, 106, 8, 6, 1, 223, 99, 3, 154, 8, 6, 1, 203, - 217, 3, 239, 146, 106, 8, 4, 1, 209, 81, 3, 204, 63, 203, 135, 8, 4, 1, - 195, 159, 3, 204, 63, 203, 135, 8, 6, 1, 233, 151, 204, 226, 8, 4, 1, - 233, 151, 204, 226, 8, 6, 1, 74, 3, 106, 8, 6, 1, 118, 154, 8, 6, 1, 163, - 199, 230, 8, 6, 1, 237, 135, 3, 106, 8, 4, 1, 237, 135, 3, 106, 8, 6, 1, - 225, 217, 3, 106, 8, 4, 1, 225, 217, 3, 106, 8, 6, 1, 4, 211, 167, 3, - 231, 164, 203, 135, 8, 4, 1, 211, 167, 3, 231, 164, 203, 135, 8, 6, 1, - 211, 31, 3, 106, 8, 4, 1, 211, 31, 3, 106, 8, 6, 1, 196, 149, 3, 106, 8, - 4, 1, 196, 149, 3, 106, 8, 4, 1, 163, 63, 8, 4, 1, 251, 133, 8, 4, 1, - 163, 251, 133, 8, 4, 1, 74, 3, 122, 8, 4, 1, 192, 72, 8, 4, 1, 247, 207, - 3, 241, 20, 8, 4, 1, 240, 231, 3, 203, 135, 8, 4, 1, 240, 231, 3, 122, 8, - 4, 1, 210, 89, 69, 8, 4, 1, 208, 163, 8, 4, 1, 208, 164, 3, 122, 8, 4, 1, - 192, 69, 8, 4, 1, 210, 89, 192, 69, 8, 4, 1, 210, 89, 192, 237, 135, 3, - 122, 8, 4, 1, 244, 202, 210, 89, 192, 69, 8, 4, 1, 238, 251, 225, 217, 3, - 106, 8, 4, 1, 234, 190, 3, 122, 8, 4, 1, 145, 234, 189, 8, 1, 4, 6, 234, - 189, 8, 4, 1, 234, 93, 8, 4, 1, 210, 207, 231, 101, 8, 4, 1, 163, 233, - 14, 8, 4, 1, 233, 15, 3, 122, 8, 4, 1, 232, 99, 3, 122, 8, 4, 1, 230, - 248, 3, 106, 8, 4, 1, 226, 6, 8, 1, 4, 6, 68, 8, 4, 1, 223, 99, 3, 112, - 202, 84, 8, 4, 1, 223, 99, 3, 248, 224, 8, 4, 1, 223, 99, 3, 210, 95, - 122, 8, 4, 1, 222, 124, 8, 4, 1, 163, 221, 135, 8, 4, 1, 163, 221, 136, - 3, 181, 222, 171, 8, 4, 1, 221, 136, 3, 122, 8, 4, 1, 218, 55, 3, 50, - 122, 8, 4, 1, 218, 55, 3, 210, 95, 122, 8, 1, 4, 6, 218, 54, 8, 4, 1, - 249, 73, 72, 8, 1, 4, 6, 214, 163, 8, 4, 1, 244, 202, 214, 123, 8, 4, 1, - 212, 245, 8, 4, 1, 163, 144, 8, 4, 1, 163, 211, 31, 3, 181, 222, 171, 8, - 4, 1, 163, 211, 31, 3, 122, 8, 4, 1, 211, 31, 3, 181, 222, 171, 8, 4, 1, - 211, 31, 3, 203, 135, 8, 4, 1, 211, 31, 3, 235, 107, 8, 4, 1, 210, 89, - 211, 31, 3, 235, 107, 8, 1, 4, 6, 144, 8, 1, 4, 6, 226, 16, 144, 8, 4, 1, - 209, 81, 3, 122, 8, 4, 1, 236, 140, 8, 4, 1, 238, 251, 225, 217, 3, 204, - 196, 26, 122, 8, 4, 1, 205, 91, 210, 89, 236, 140, 8, 4, 1, 236, 141, 3, - 241, 20, 8, 4, 1, 163, 203, 216, 8, 4, 1, 203, 217, 3, 210, 95, 122, 8, + 8, 6, 1, 236, 52, 8, 6, 1, 236, 53, 210, 88, 8, 4, 1, 236, 53, 210, 88, + 8, 4, 1, 236, 53, 3, 203, 135, 8, 1, 99, 3, 106, 8, 6, 1, 152, 146, 8, 4, + 1, 152, 146, 8, 1, 226, 17, 233, 152, 204, 227, 3, 106, 8, 1, 196, 225, + 8, 1, 239, 205, 244, 215, 8, 1, 222, 218, 244, 215, 8, 1, 251, 124, 244, + 215, 8, 1, 210, 95, 244, 215, 8, 6, 1, 237, 158, 3, 247, 106, 8, 6, 1, + 240, 232, 3, 4, 1, 195, 159, 3, 247, 106, 8, 4, 1, 237, 158, 3, 247, 106, + 8, 6, 1, 222, 41, 8, 6, 1, 223, 100, 3, 4, 1, 225, 217, 8, 4, 1, 222, 41, + 8, 6, 1, 216, 165, 8, 6, 1, 218, 56, 3, 4, 1, 225, 217, 8, 4, 1, 216, + 165, 8, 6, 1, 39, 3, 247, 106, 8, 4, 1, 39, 3, 247, 106, 8, 6, 1, 230, + 249, 3, 247, 106, 8, 4, 1, 230, 249, 3, 247, 106, 8, 6, 1, 177, 3, 247, + 106, 8, 4, 1, 177, 3, 247, 106, 8, 6, 1, 118, 3, 247, 106, 8, 4, 1, 118, + 3, 247, 106, 8, 6, 1, 118, 3, 239, 151, 26, 220, 114, 8, 4, 1, 118, 3, + 239, 151, 26, 220, 114, 8, 6, 1, 118, 3, 239, 151, 26, 186, 8, 4, 1, 118, + 3, 239, 151, 26, 186, 8, 6, 1, 118, 3, 239, 151, 26, 247, 106, 8, 4, 1, + 118, 3, 239, 151, 26, 247, 106, 8, 6, 1, 118, 3, 239, 151, 26, 233, 100, + 8, 4, 1, 118, 3, 239, 151, 26, 233, 100, 8, 4, 1, 163, 69, 8, 6, 1, 39, + 3, 239, 151, 26, 220, 114, 8, 4, 1, 39, 3, 239, 151, 26, 220, 114, 8, 6, + 1, 39, 3, 76, 90, 26, 220, 114, 8, 4, 1, 39, 3, 76, 90, 26, 220, 114, 8, + 6, 1, 251, 246, 3, 220, 114, 8, 4, 1, 251, 246, 3, 220, 114, 8, 6, 1, + 234, 191, 3, 106, 8, 4, 1, 234, 191, 3, 106, 8, 6, 1, 234, 191, 3, 247, + 106, 8, 4, 1, 234, 191, 3, 247, 106, 8, 6, 1, 225, 81, 3, 247, 106, 8, 4, + 1, 225, 81, 3, 247, 106, 8, 6, 1, 177, 3, 214, 151, 8, 4, 1, 177, 3, 214, + 151, 8, 6, 1, 177, 3, 214, 152, 26, 220, 114, 8, 4, 1, 177, 3, 214, 152, + 26, 220, 114, 8, 6, 1, 236, 53, 3, 247, 106, 8, 4, 1, 236, 53, 3, 247, + 106, 8, 4, 1, 225, 218, 3, 247, 106, 8, 6, 1, 237, 157, 8, 6, 1, 240, + 232, 3, 4, 1, 195, 158, 8, 4, 1, 237, 157, 8, 6, 1, 234, 191, 3, 186, 8, + 4, 1, 234, 191, 3, 186, 8, 6, 1, 231, 41, 8, 6, 1, 196, 225, 8, 6, 1, + 218, 56, 3, 233, 100, 8, 4, 1, 218, 56, 3, 233, 100, 8, 6, 1, 39, 3, 210, + 3, 90, 26, 186, 8, 4, 1, 39, 3, 210, 3, 90, 26, 186, 8, 6, 1, 251, 246, + 3, 186, 8, 4, 1, 251, 246, 3, 186, 8, 6, 1, 177, 3, 204, 196, 26, 186, 8, + 4, 1, 177, 3, 204, 196, 26, 186, 8, 6, 1, 39, 3, 52, 233, 100, 8, 4, 1, + 39, 3, 52, 233, 100, 8, 6, 1, 39, 3, 226, 17, 248, 47, 8, 4, 1, 39, 3, + 226, 17, 248, 47, 8, 6, 1, 237, 136, 3, 52, 233, 100, 8, 4, 1, 237, 136, + 3, 52, 233, 100, 8, 6, 1, 237, 136, 3, 226, 17, 248, 47, 8, 4, 1, 237, + 136, 3, 226, 17, 248, 47, 8, 6, 1, 230, 249, 3, 52, 233, 100, 8, 4, 1, + 230, 249, 3, 52, 233, 100, 8, 6, 1, 230, 249, 3, 226, 17, 248, 47, 8, 4, + 1, 230, 249, 3, 226, 17, 248, 47, 8, 6, 1, 177, 3, 52, 233, 100, 8, 4, 1, + 177, 3, 52, 233, 100, 8, 6, 1, 177, 3, 226, 17, 248, 47, 8, 4, 1, 177, 3, + 226, 17, 248, 47, 8, 6, 1, 211, 32, 3, 52, 233, 100, 8, 4, 1, 211, 32, 3, + 52, 233, 100, 8, 6, 1, 211, 32, 3, 226, 17, 248, 47, 8, 4, 1, 211, 32, 3, + 226, 17, 248, 47, 8, 6, 1, 118, 3, 52, 233, 100, 8, 4, 1, 118, 3, 52, + 233, 100, 8, 6, 1, 118, 3, 226, 17, 248, 47, 8, 4, 1, 118, 3, 226, 17, + 248, 47, 8, 6, 1, 209, 81, 3, 244, 160, 60, 8, 4, 1, 209, 81, 3, 244, + 160, 60, 8, 6, 1, 203, 217, 3, 244, 160, 60, 8, 4, 1, 203, 217, 3, 244, + 160, 60, 8, 6, 1, 195, 239, 8, 4, 1, 195, 239, 8, 6, 1, 233, 16, 3, 247, + 106, 8, 4, 1, 233, 16, 3, 247, 106, 8, 6, 1, 218, 56, 3, 181, 53, 222, + 172, 8, 4, 1, 240, 232, 3, 241, 21, 8, 6, 1, 214, 39, 8, 4, 1, 214, 39, + 8, 6, 1, 195, 159, 3, 122, 8, 4, 1, 195, 159, 3, 122, 8, 6, 1, 39, 3, 76, + 57, 8, 4, 1, 39, 3, 76, 57, 8, 6, 1, 237, 136, 3, 247, 50, 8, 4, 1, 237, + 136, 3, 247, 50, 8, 6, 1, 177, 3, 239, 151, 26, 220, 114, 8, 4, 1, 177, + 3, 239, 151, 26, 220, 114, 8, 6, 1, 177, 3, 202, 85, 26, 220, 114, 8, 4, + 1, 177, 3, 202, 85, 26, 220, 114, 8, 6, 1, 177, 3, 76, 57, 8, 4, 1, 177, + 3, 76, 57, 8, 6, 1, 177, 3, 76, 90, 26, 220, 114, 8, 4, 1, 177, 3, 76, + 90, 26, 220, 114, 8, 6, 1, 196, 149, 3, 220, 114, 8, 4, 1, 196, 149, 3, + 220, 114, 8, 4, 1, 223, 100, 3, 241, 21, 8, 4, 1, 218, 56, 3, 241, 21, 8, + 4, 1, 203, 217, 3, 241, 21, 8, 4, 1, 238, 252, 225, 217, 8, 4, 1, 240, + 51, 239, 110, 8, 4, 1, 211, 98, 239, 110, 8, 6, 1, 39, 3, 106, 8, 6, 1, + 247, 208, 3, 106, 8, 4, 1, 247, 208, 3, 106, 8, 6, 1, 223, 100, 3, 154, + 8, 6, 1, 203, 217, 3, 239, 147, 106, 8, 4, 1, 209, 81, 3, 204, 63, 203, + 135, 8, 4, 1, 195, 159, 3, 204, 63, 203, 135, 8, 6, 1, 233, 152, 204, + 226, 8, 4, 1, 233, 152, 204, 226, 8, 6, 1, 74, 3, 106, 8, 6, 1, 118, 154, + 8, 6, 1, 163, 199, 230, 8, 6, 1, 237, 136, 3, 106, 8, 4, 1, 237, 136, 3, + 106, 8, 6, 1, 225, 218, 3, 106, 8, 4, 1, 225, 218, 3, 106, 8, 6, 1, 4, + 211, 168, 3, 231, 165, 203, 135, 8, 4, 1, 211, 168, 3, 231, 165, 203, + 135, 8, 6, 1, 211, 32, 3, 106, 8, 4, 1, 211, 32, 3, 106, 8, 6, 1, 196, + 149, 3, 106, 8, 4, 1, 196, 149, 3, 106, 8, 4, 1, 163, 63, 8, 4, 1, 251, + 134, 8, 4, 1, 163, 251, 134, 8, 4, 1, 74, 3, 122, 8, 4, 1, 192, 72, 8, 4, + 1, 247, 208, 3, 241, 21, 8, 4, 1, 240, 232, 3, 203, 135, 8, 4, 1, 240, + 232, 3, 122, 8, 4, 1, 210, 89, 69, 8, 4, 1, 208, 163, 8, 4, 1, 208, 164, + 3, 122, 8, 4, 1, 192, 69, 8, 4, 1, 210, 89, 192, 69, 8, 4, 1, 210, 89, + 192, 237, 136, 3, 122, 8, 4, 1, 244, 203, 210, 89, 192, 69, 8, 4, 1, 238, + 252, 225, 218, 3, 106, 8, 4, 1, 234, 191, 3, 122, 8, 4, 1, 145, 234, 190, + 8, 1, 4, 6, 234, 190, 8, 4, 1, 234, 94, 8, 4, 1, 210, 208, 231, 102, 8, + 4, 1, 163, 233, 15, 8, 4, 1, 233, 16, 3, 122, 8, 4, 1, 232, 100, 3, 122, + 8, 4, 1, 230, 249, 3, 106, 8, 4, 1, 226, 7, 8, 1, 4, 6, 68, 8, 4, 1, 223, + 100, 3, 112, 202, 84, 8, 4, 1, 223, 100, 3, 248, 225, 8, 4, 1, 223, 100, + 3, 210, 95, 122, 8, 4, 1, 222, 125, 8, 4, 1, 163, 221, 136, 8, 4, 1, 163, + 221, 137, 3, 181, 222, 172, 8, 4, 1, 221, 137, 3, 122, 8, 4, 1, 218, 56, + 3, 50, 122, 8, 4, 1, 218, 56, 3, 210, 95, 122, 8, 1, 4, 6, 218, 55, 8, 4, + 1, 249, 74, 72, 8, 1, 4, 6, 214, 164, 8, 4, 1, 244, 203, 214, 124, 8, 4, + 1, 212, 246, 8, 4, 1, 163, 144, 8, 4, 1, 163, 211, 32, 3, 181, 222, 172, + 8, 4, 1, 163, 211, 32, 3, 122, 8, 4, 1, 211, 32, 3, 181, 222, 172, 8, 4, + 1, 211, 32, 3, 203, 135, 8, 4, 1, 211, 32, 3, 235, 108, 8, 4, 1, 210, 89, + 211, 32, 3, 235, 108, 8, 1, 4, 6, 144, 8, 1, 4, 6, 226, 17, 144, 8, 4, 1, + 209, 81, 3, 122, 8, 4, 1, 236, 141, 8, 4, 1, 238, 252, 225, 218, 3, 204, + 196, 26, 122, 8, 4, 1, 205, 91, 210, 89, 236, 141, 8, 4, 1, 236, 142, 3, + 241, 21, 8, 4, 1, 163, 203, 216, 8, 4, 1, 203, 217, 3, 210, 95, 122, 8, 4, 1, 118, 154, 8, 4, 1, 200, 28, 8, 4, 1, 199, 231, 3, 122, 8, 4, 1, 163, 199, 230, 8, 4, 1, 163, 197, 199, 8, 4, 1, 163, 196, 148, 8, 1, 4, 6, 196, 148, 8, 4, 1, 195, 159, 3, 210, 95, 122, 8, 4, 1, 195, 159, 3, - 241, 20, 8, 4, 1, 236, 51, 8, 4, 1, 236, 52, 3, 241, 20, 8, 1, 233, 151, - 204, 226, 8, 1, 212, 252, 198, 244, 234, 240, 8, 1, 226, 16, 233, 151, - 204, 226, 8, 1, 204, 204, 247, 206, 8, 1, 248, 167, 244, 214, 8, 1, 4, 6, - 250, 111, 8, 4, 1, 244, 202, 192, 69, 8, 1, 4, 6, 234, 190, 3, 122, 8, 1, - 4, 6, 233, 14, 8, 4, 1, 225, 217, 3, 241, 56, 8, 4, 1, 163, 225, 79, 8, - 1, 4, 6, 159, 8, 4, 1, 211, 167, 3, 122, 8, 1, 233, 151, 204, 227, 3, - 106, 8, 1, 210, 89, 233, 151, 204, 227, 3, 106, 8, 4, 1, 237, 157, 239, - 109, 8, 4, 1, 239, 177, 239, 109, 8, 4, 1, 237, 157, 239, 110, 3, 241, - 20, 8, 4, 1, 201, 115, 239, 109, 8, 4, 1, 203, 7, 239, 109, 8, 4, 1, 203, - 75, 239, 110, 3, 241, 20, 8, 4, 1, 235, 166, 239, 109, 8, 4, 1, 221, 192, - 239, 109, 8, 4, 1, 221, 137, 239, 109, 8, 1, 248, 167, 213, 43, 8, 1, - 248, 175, 213, 43, 8, 4, 1, 163, 233, 15, 3, 235, 107, 8, 4, 1, 163, 233, - 15, 3, 235, 108, 26, 203, 135, 73, 1, 4, 233, 14, 73, 1, 4, 233, 15, 3, - 122, 73, 1, 4, 225, 216, 73, 1, 4, 144, 73, 1, 4, 163, 144, 73, 1, 4, - 163, 211, 31, 3, 122, 73, 1, 4, 6, 226, 16, 144, 73, 1, 4, 197, 199, 73, - 1, 4, 196, 148, 73, 1, 212, 18, 73, 1, 52, 212, 18, 73, 1, 163, 244, 158, - 73, 1, 251, 29, 73, 1, 210, 89, 244, 158, 73, 1, 53, 157, 210, 2, 73, 1, - 50, 157, 210, 2, 73, 1, 233, 151, 204, 226, 73, 1, 210, 89, 233, 151, - 204, 226, 73, 1, 50, 250, 216, 73, 1, 53, 250, 216, 73, 1, 124, 250, 216, - 73, 1, 135, 250, 216, 73, 1, 244, 240, 252, 21, 247, 105, 73, 1, 83, 222, - 74, 73, 1, 220, 113, 73, 1, 252, 9, 252, 21, 73, 1, 233, 100, 252, 21, - 73, 1, 126, 83, 222, 74, 73, 1, 126, 220, 113, 73, 1, 126, 233, 100, 252, - 21, 73, 1, 126, 252, 9, 252, 21, 73, 1, 201, 177, 244, 167, 73, 1, 157, - 201, 177, 244, 167, 73, 1, 247, 34, 53, 157, 210, 2, 73, 1, 247, 34, 50, + 241, 21, 8, 4, 1, 236, 52, 8, 4, 1, 236, 53, 3, 241, 21, 8, 1, 233, 152, + 204, 226, 8, 1, 212, 253, 198, 244, 234, 241, 8, 1, 226, 17, 233, 152, + 204, 226, 8, 1, 204, 204, 247, 207, 8, 1, 248, 168, 244, 215, 8, 1, 4, 6, + 250, 112, 8, 4, 1, 244, 203, 192, 69, 8, 1, 4, 6, 234, 191, 3, 122, 8, 1, + 4, 6, 233, 15, 8, 4, 1, 225, 218, 3, 241, 57, 8, 4, 1, 163, 225, 80, 8, + 1, 4, 6, 159, 8, 4, 1, 211, 168, 3, 122, 8, 1, 233, 152, 204, 227, 3, + 106, 8, 1, 210, 89, 233, 152, 204, 227, 3, 106, 8, 4, 1, 237, 158, 239, + 110, 8, 4, 1, 239, 178, 239, 110, 8, 4, 1, 237, 158, 239, 111, 3, 241, + 21, 8, 4, 1, 201, 115, 239, 110, 8, 4, 1, 203, 7, 239, 110, 8, 4, 1, 203, + 75, 239, 111, 3, 241, 21, 8, 4, 1, 235, 167, 239, 110, 8, 4, 1, 221, 193, + 239, 110, 8, 4, 1, 221, 138, 239, 110, 8, 1, 248, 168, 213, 44, 8, 1, + 248, 176, 213, 44, 8, 4, 1, 163, 233, 16, 3, 235, 108, 8, 4, 1, 163, 233, + 16, 3, 235, 109, 26, 203, 135, 73, 1, 4, 233, 15, 73, 1, 4, 233, 16, 3, + 122, 73, 1, 4, 225, 217, 73, 1, 4, 144, 73, 1, 4, 163, 144, 73, 1, 4, + 163, 211, 32, 3, 122, 73, 1, 4, 6, 226, 17, 144, 73, 1, 4, 197, 199, 73, + 1, 4, 196, 148, 73, 1, 212, 19, 73, 1, 52, 212, 19, 73, 1, 163, 244, 159, + 73, 1, 251, 30, 73, 1, 210, 89, 244, 159, 73, 1, 53, 157, 210, 2, 73, 1, + 50, 157, 210, 2, 73, 1, 233, 152, 204, 226, 73, 1, 210, 89, 233, 152, + 204, 226, 73, 1, 50, 250, 217, 73, 1, 53, 250, 217, 73, 1, 124, 250, 217, + 73, 1, 135, 250, 217, 73, 1, 244, 241, 252, 22, 247, 106, 73, 1, 83, 222, + 75, 73, 1, 220, 114, 73, 1, 252, 10, 252, 22, 73, 1, 233, 101, 252, 22, + 73, 1, 126, 83, 222, 75, 73, 1, 126, 220, 114, 73, 1, 126, 233, 101, 252, + 22, 73, 1, 126, 252, 10, 252, 22, 73, 1, 201, 177, 244, 168, 73, 1, 157, + 201, 177, 244, 168, 73, 1, 247, 35, 53, 157, 210, 2, 73, 1, 247, 35, 50, 157, 210, 2, 73, 1, 124, 203, 147, 73, 1, 135, 203, 147, 73, 1, 98, 55, - 73, 1, 219, 15, 55, 248, 46, 76, 57, 210, 3, 57, 214, 150, 4, 202, 84, - 52, 252, 9, 252, 21, 73, 1, 210, 73, 122, 73, 1, 241, 61, 252, 21, 73, 1, - 4, 234, 93, 73, 1, 4, 159, 73, 1, 4, 209, 80, 73, 1, 4, 196, 222, 73, 1, - 4, 210, 89, 233, 151, 204, 226, 73, 1, 236, 73, 152, 154, 73, 1, 130, - 152, 154, 73, 1, 219, 64, 152, 154, 73, 1, 126, 152, 154, 73, 1, 236, 72, - 152, 154, 73, 1, 196, 13, 239, 201, 152, 78, 73, 1, 196, 96, 239, 201, - 152, 78, 73, 1, 198, 242, 73, 1, 200, 68, 73, 1, 52, 251, 29, 73, 1, 126, - 135, 250, 216, 73, 1, 126, 124, 250, 216, 73, 1, 126, 50, 250, 216, 73, - 1, 126, 53, 250, 216, 73, 1, 126, 210, 2, 73, 1, 112, 233, 100, 252, 21, - 73, 1, 112, 52, 233, 100, 252, 21, 73, 1, 112, 52, 252, 9, 252, 21, 73, - 1, 126, 202, 84, 73, 1, 210, 214, 244, 167, 73, 1, 248, 242, 130, 202, - 11, 73, 1, 236, 221, 130, 202, 11, 73, 1, 248, 242, 126, 202, 11, 73, 1, - 236, 221, 126, 202, 11, 73, 1, 206, 246, 73, 1, 192, 206, 246, 73, 1, - 126, 50, 51, 38, 233, 100, 252, 21, 38, 252, 9, 252, 21, 38, 244, 240, - 252, 21, 38, 202, 84, 38, 220, 113, 38, 214, 18, 38, 248, 46, 38, 76, 57, - 38, 239, 149, 38, 231, 164, 57, 38, 210, 3, 57, 38, 52, 252, 9, 252, 21, - 38, 247, 105, 38, 83, 222, 75, 57, 38, 52, 83, 222, 75, 57, 38, 52, 233, - 100, 252, 21, 38, 247, 132, 38, 226, 16, 248, 46, 38, 163, 244, 159, 57, - 38, 244, 159, 57, 38, 210, 89, 244, 159, 57, 38, 244, 159, 90, 210, 22, - 38, 233, 100, 252, 22, 60, 38, 252, 9, 252, 22, 60, 38, 50, 203, 148, 60, - 38, 53, 203, 148, 60, 38, 50, 251, 90, 57, 38, 231, 101, 38, 50, 157, + 73, 1, 219, 16, 55, 248, 47, 76, 57, 210, 3, 57, 214, 151, 4, 202, 84, + 52, 252, 10, 252, 22, 73, 1, 210, 73, 122, 73, 1, 241, 62, 252, 22, 73, + 1, 4, 234, 94, 73, 1, 4, 159, 73, 1, 4, 209, 80, 73, 1, 4, 196, 222, 73, + 1, 4, 210, 89, 233, 152, 204, 226, 73, 1, 236, 74, 152, 154, 73, 1, 130, + 152, 154, 73, 1, 219, 65, 152, 154, 73, 1, 126, 152, 154, 73, 1, 236, 73, + 152, 154, 73, 1, 196, 13, 239, 202, 152, 78, 73, 1, 196, 96, 239, 202, + 152, 78, 73, 1, 198, 242, 73, 1, 200, 68, 73, 1, 52, 251, 30, 73, 1, 126, + 135, 250, 217, 73, 1, 126, 124, 250, 217, 73, 1, 126, 50, 250, 217, 73, + 1, 126, 53, 250, 217, 73, 1, 126, 210, 2, 73, 1, 112, 233, 101, 252, 22, + 73, 1, 112, 52, 233, 101, 252, 22, 73, 1, 112, 52, 252, 10, 252, 22, 73, + 1, 126, 202, 84, 73, 1, 210, 215, 244, 168, 73, 1, 248, 243, 130, 202, + 11, 73, 1, 236, 222, 130, 202, 11, 73, 1, 248, 243, 126, 202, 11, 73, 1, + 236, 222, 126, 202, 11, 73, 1, 206, 246, 73, 1, 192, 206, 246, 73, 1, + 126, 50, 51, 38, 233, 101, 252, 22, 38, 252, 10, 252, 22, 38, 244, 241, + 252, 22, 38, 202, 84, 38, 220, 114, 38, 214, 19, 38, 248, 47, 38, 76, 57, + 38, 239, 150, 38, 231, 165, 57, 38, 210, 3, 57, 38, 52, 252, 10, 252, 22, + 38, 247, 106, 38, 83, 222, 76, 57, 38, 52, 83, 222, 76, 57, 38, 52, 233, + 101, 252, 22, 38, 247, 133, 38, 226, 17, 248, 47, 38, 163, 244, 160, 57, + 38, 244, 160, 57, 38, 210, 89, 244, 160, 57, 38, 244, 160, 90, 210, 22, + 38, 233, 101, 252, 23, 60, 38, 252, 10, 252, 23, 60, 38, 50, 203, 148, + 60, 38, 53, 203, 148, 60, 38, 50, 251, 91, 57, 38, 231, 102, 38, 50, 157, 210, 3, 60, 38, 124, 203, 148, 60, 38, 135, 203, 148, 60, 38, 98, 2, 60, - 38, 219, 15, 2, 60, 38, 213, 212, 231, 164, 60, 38, 210, 95, 231, 164, - 60, 38, 76, 60, 38, 239, 150, 60, 38, 210, 3, 60, 38, 244, 159, 60, 38, - 247, 49, 38, 214, 150, 38, 83, 222, 75, 60, 38, 248, 39, 60, 38, 226, 16, - 52, 250, 251, 60, 38, 247, 106, 60, 38, 244, 240, 252, 22, 60, 38, 248, - 47, 60, 38, 226, 16, 248, 47, 60, 38, 202, 85, 60, 38, 220, 114, 60, 38, - 126, 222, 74, 38, 52, 126, 222, 74, 38, 202, 85, 214, 19, 38, 206, 182, - 204, 196, 214, 19, 38, 181, 204, 196, 214, 19, 38, 206, 182, 205, 178, - 214, 19, 38, 181, 205, 178, 214, 19, 38, 53, 157, 210, 3, 60, 38, 226, - 16, 248, 39, 60, 38, 47, 60, 38, 208, 141, 60, 38, 196, 223, 57, 38, 83, - 202, 84, 38, 52, 214, 18, 38, 233, 100, 152, 78, 38, 252, 9, 152, 78, 38, - 32, 213, 37, 38, 32, 223, 231, 38, 32, 239, 143, 201, 248, 38, 32, 195, - 225, 38, 248, 39, 57, 38, 236, 171, 2, 60, 38, 52, 83, 222, 75, 60, 38, - 50, 251, 90, 60, 38, 216, 18, 202, 85, 57, 38, 231, 170, 57, 38, 251, - 138, 180, 202, 30, 57, 38, 50, 53, 61, 60, 38, 200, 24, 61, 60, 38, 233, - 106, 225, 123, 38, 53, 250, 217, 57, 38, 50, 157, 210, 3, 57, 38, 235, - 163, 38, 196, 223, 60, 38, 50, 250, 217, 60, 38, 53, 250, 217, 60, 38, - 53, 250, 217, 26, 124, 250, 217, 60, 38, 53, 157, 210, 3, 57, 38, 76, 90, - 210, 22, 38, 250, 179, 60, 38, 52, 210, 3, 60, 38, 195, 24, 57, 38, 52, - 248, 47, 60, 38, 52, 248, 46, 38, 52, 220, 113, 38, 52, 220, 114, 60, 38, - 52, 202, 84, 38, 52, 226, 16, 248, 46, 38, 52, 91, 61, 60, 38, 8, 4, 1, + 38, 219, 16, 2, 60, 38, 213, 213, 231, 165, 60, 38, 210, 95, 231, 165, + 60, 38, 76, 60, 38, 239, 151, 60, 38, 210, 3, 60, 38, 244, 160, 60, 38, + 247, 50, 38, 214, 151, 38, 83, 222, 76, 60, 38, 248, 40, 60, 38, 226, 17, + 52, 250, 252, 60, 38, 247, 107, 60, 38, 244, 241, 252, 23, 60, 38, 248, + 48, 60, 38, 226, 17, 248, 48, 60, 38, 202, 85, 60, 38, 220, 115, 60, 38, + 126, 222, 75, 38, 52, 126, 222, 75, 38, 202, 85, 214, 20, 38, 206, 182, + 204, 196, 214, 20, 38, 181, 204, 196, 214, 20, 38, 206, 182, 205, 178, + 214, 20, 38, 181, 205, 178, 214, 20, 38, 53, 157, 210, 3, 60, 38, 226, + 17, 248, 40, 60, 38, 47, 60, 38, 208, 141, 60, 38, 196, 223, 57, 38, 83, + 202, 84, 38, 52, 214, 19, 38, 233, 101, 152, 78, 38, 252, 10, 152, 78, + 38, 32, 213, 38, 38, 32, 223, 232, 38, 32, 239, 144, 201, 248, 38, 32, + 195, 225, 38, 248, 40, 57, 38, 236, 172, 2, 60, 38, 52, 83, 222, 76, 60, + 38, 50, 251, 91, 60, 38, 216, 19, 202, 85, 57, 38, 231, 171, 57, 38, 251, + 139, 180, 202, 30, 57, 38, 50, 53, 61, 60, 38, 200, 24, 61, 60, 38, 233, + 107, 225, 124, 38, 53, 250, 218, 57, 38, 50, 157, 210, 3, 57, 38, 235, + 164, 38, 196, 223, 60, 38, 50, 250, 218, 60, 38, 53, 250, 218, 60, 38, + 53, 250, 218, 26, 124, 250, 218, 60, 38, 53, 157, 210, 3, 57, 38, 76, 90, + 210, 22, 38, 250, 180, 60, 38, 52, 210, 3, 60, 38, 195, 24, 57, 38, 52, + 248, 48, 60, 38, 52, 248, 47, 38, 52, 220, 114, 38, 52, 220, 115, 60, 38, + 52, 202, 84, 38, 52, 226, 17, 248, 47, 38, 52, 91, 61, 60, 38, 8, 4, 1, 63, 38, 8, 4, 1, 69, 38, 8, 4, 1, 68, 38, 8, 4, 1, 72, 38, 8, 4, 1, 66, - 38, 8, 4, 1, 247, 206, 38, 8, 4, 1, 240, 230, 38, 8, 4, 1, 233, 14, 38, - 8, 4, 1, 221, 135, 38, 8, 4, 1, 144, 38, 8, 4, 1, 203, 216, 38, 8, 4, 1, - 199, 230, 38, 8, 4, 1, 196, 222, 32, 6, 1, 232, 87, 32, 4, 1, 232, 87, - 32, 6, 1, 250, 250, 208, 222, 32, 4, 1, 250, 250, 208, 222, 32, 215, 141, - 55, 32, 221, 202, 215, 141, 55, 32, 6, 1, 213, 195, 239, 117, 32, 4, 1, - 213, 195, 239, 117, 32, 195, 225, 32, 4, 210, 89, 221, 172, 206, 87, 105, - 32, 4, 237, 249, 221, 172, 206, 87, 105, 32, 4, 210, 89, 237, 249, 221, - 172, 206, 87, 105, 32, 211, 78, 78, 32, 6, 1, 195, 232, 32, 201, 248, 32, - 239, 143, 201, 248, 32, 6, 1, 251, 134, 3, 201, 248, 32, 251, 73, 203, - 35, 32, 6, 1, 236, 174, 3, 201, 248, 32, 6, 1, 236, 126, 3, 201, 248, 32, - 6, 1, 226, 7, 3, 201, 248, 32, 6, 1, 214, 122, 3, 201, 248, 32, 6, 1, - 200, 29, 3, 201, 248, 32, 6, 1, 214, 124, 3, 201, 248, 32, 4, 1, 226, 7, - 3, 239, 143, 26, 201, 248, 32, 6, 1, 251, 133, 32, 6, 1, 248, 205, 32, 6, - 1, 234, 93, 32, 6, 1, 239, 211, 32, 6, 1, 236, 173, 32, 6, 1, 195, 78, - 32, 6, 1, 236, 125, 32, 6, 1, 202, 199, 32, 6, 1, 226, 6, 32, 6, 1, 225, - 1, 32, 6, 1, 222, 244, 32, 6, 1, 218, 144, 32, 6, 1, 215, 185, 32, 6, 1, - 196, 196, 32, 6, 1, 214, 121, 32, 6, 1, 212, 219, 32, 6, 1, 210, 74, 32, - 6, 1, 206, 86, 32, 6, 1, 203, 89, 32, 6, 1, 200, 28, 32, 6, 1, 212, 245, - 32, 6, 1, 245, 74, 32, 6, 1, 211, 237, 32, 6, 1, 214, 123, 32, 6, 1, 226, - 7, 3, 239, 142, 32, 6, 1, 200, 29, 3, 239, 142, 32, 4, 1, 251, 134, 3, - 201, 248, 32, 4, 1, 236, 174, 3, 201, 248, 32, 4, 1, 236, 126, 3, 201, - 248, 32, 4, 1, 226, 7, 3, 201, 248, 32, 4, 1, 200, 29, 3, 239, 143, 26, - 201, 248, 32, 4, 1, 251, 133, 32, 4, 1, 248, 205, 32, 4, 1, 234, 93, 32, - 4, 1, 239, 211, 32, 4, 1, 236, 173, 32, 4, 1, 195, 78, 32, 4, 1, 236, - 125, 32, 4, 1, 202, 199, 32, 4, 1, 226, 6, 32, 4, 1, 225, 1, 32, 4, 1, - 222, 244, 32, 4, 1, 218, 144, 32, 4, 1, 215, 185, 32, 4, 1, 196, 196, 32, - 4, 1, 214, 121, 32, 4, 1, 212, 219, 32, 4, 1, 210, 74, 32, 4, 1, 48, 206, + 38, 8, 4, 1, 247, 207, 38, 8, 4, 1, 240, 231, 38, 8, 4, 1, 233, 15, 38, + 8, 4, 1, 221, 136, 38, 8, 4, 1, 144, 38, 8, 4, 1, 203, 216, 38, 8, 4, 1, + 199, 230, 38, 8, 4, 1, 196, 222, 32, 6, 1, 232, 88, 32, 4, 1, 232, 88, + 32, 6, 1, 250, 251, 208, 222, 32, 4, 1, 250, 251, 208, 222, 32, 215, 142, + 55, 32, 221, 203, 215, 142, 55, 32, 6, 1, 213, 196, 239, 118, 32, 4, 1, + 213, 196, 239, 118, 32, 195, 225, 32, 4, 210, 89, 221, 173, 206, 87, 105, + 32, 4, 237, 250, 221, 173, 206, 87, 105, 32, 4, 210, 89, 237, 250, 221, + 173, 206, 87, 105, 32, 211, 79, 78, 32, 6, 1, 195, 232, 32, 201, 248, 32, + 239, 144, 201, 248, 32, 6, 1, 251, 135, 3, 201, 248, 32, 251, 74, 203, + 35, 32, 6, 1, 236, 175, 3, 201, 248, 32, 6, 1, 236, 127, 3, 201, 248, 32, + 6, 1, 226, 8, 3, 201, 248, 32, 6, 1, 214, 123, 3, 201, 248, 32, 6, 1, + 200, 29, 3, 201, 248, 32, 6, 1, 214, 125, 3, 201, 248, 32, 4, 1, 226, 8, + 3, 239, 144, 26, 201, 248, 32, 6, 1, 251, 134, 32, 6, 1, 248, 206, 32, 6, + 1, 234, 94, 32, 6, 1, 239, 212, 32, 6, 1, 236, 174, 32, 6, 1, 195, 78, + 32, 6, 1, 236, 126, 32, 6, 1, 202, 199, 32, 6, 1, 226, 7, 32, 6, 1, 225, + 2, 32, 6, 1, 222, 245, 32, 6, 1, 218, 145, 32, 6, 1, 215, 186, 32, 6, 1, + 196, 196, 32, 6, 1, 214, 122, 32, 6, 1, 212, 220, 32, 6, 1, 210, 74, 32, + 6, 1, 206, 86, 32, 6, 1, 203, 89, 32, 6, 1, 200, 28, 32, 6, 1, 212, 246, + 32, 6, 1, 245, 75, 32, 6, 1, 211, 238, 32, 6, 1, 214, 124, 32, 6, 1, 226, + 8, 3, 239, 143, 32, 6, 1, 200, 29, 3, 239, 143, 32, 4, 1, 251, 135, 3, + 201, 248, 32, 4, 1, 236, 175, 3, 201, 248, 32, 4, 1, 236, 127, 3, 201, + 248, 32, 4, 1, 226, 8, 3, 201, 248, 32, 4, 1, 200, 29, 3, 239, 144, 26, + 201, 248, 32, 4, 1, 251, 134, 32, 4, 1, 248, 206, 32, 4, 1, 234, 94, 32, + 4, 1, 239, 212, 32, 4, 1, 236, 174, 32, 4, 1, 195, 78, 32, 4, 1, 236, + 126, 32, 4, 1, 202, 199, 32, 4, 1, 226, 7, 32, 4, 1, 225, 2, 32, 4, 1, + 222, 245, 32, 4, 1, 218, 145, 32, 4, 1, 215, 186, 32, 4, 1, 196, 196, 32, + 4, 1, 214, 122, 32, 4, 1, 212, 220, 32, 4, 1, 210, 74, 32, 4, 1, 48, 206, 86, 32, 4, 1, 206, 86, 32, 4, 1, 203, 89, 32, 4, 1, 200, 28, 32, 4, 1, - 212, 245, 32, 4, 1, 245, 74, 32, 4, 1, 211, 237, 32, 4, 1, 214, 123, 32, - 4, 1, 226, 7, 3, 239, 142, 32, 4, 1, 200, 29, 3, 239, 142, 32, 4, 1, 214, - 122, 3, 201, 248, 32, 4, 1, 200, 29, 3, 201, 248, 32, 4, 1, 214, 124, 3, - 201, 248, 32, 6, 225, 31, 105, 32, 248, 206, 105, 32, 202, 200, 105, 32, - 200, 29, 3, 231, 164, 105, 32, 200, 29, 3, 252, 9, 26, 231, 164, 105, 32, - 200, 29, 3, 239, 150, 26, 231, 164, 105, 32, 212, 246, 105, 32, 212, 220, - 105, 32, 225, 31, 105, 32, 1, 250, 250, 223, 235, 32, 4, 1, 250, 250, - 223, 235, 32, 1, 204, 236, 32, 4, 1, 204, 236, 32, 1, 239, 117, 32, 4, 1, - 239, 117, 32, 1, 223, 235, 32, 4, 1, 223, 235, 32, 1, 208, 222, 32, 4, 1, - 208, 222, 88, 6, 1, 206, 247, 88, 4, 1, 206, 247, 88, 6, 1, 235, 173, 88, - 4, 1, 235, 173, 88, 6, 1, 224, 128, 88, 4, 1, 224, 128, 88, 6, 1, 231, - 155, 88, 4, 1, 231, 155, 88, 6, 1, 234, 88, 88, 4, 1, 234, 88, 88, 6, 1, - 206, 213, 88, 4, 1, 206, 213, 88, 6, 1, 239, 227, 88, 4, 1, 239, 227, 32, - 225, 2, 105, 32, 210, 75, 105, 32, 221, 172, 206, 87, 105, 32, 1, 195, - 232, 32, 6, 202, 200, 105, 32, 221, 172, 236, 174, 105, 32, 210, 89, 221, - 172, 236, 174, 105, 32, 6, 1, 206, 198, 32, 4, 1, 206, 198, 32, 6, 221, - 172, 206, 87, 105, 32, 6, 1, 208, 219, 32, 4, 1, 208, 219, 32, 210, 75, - 3, 204, 196, 105, 32, 6, 210, 89, 221, 172, 206, 87, 105, 32, 6, 237, - 249, 221, 172, 206, 87, 105, 32, 6, 210, 89, 237, 249, 221, 172, 206, 87, - 105, 40, 6, 1, 226, 147, 3, 233, 99, 40, 6, 1, 226, 11, 40, 6, 1, 239, - 45, 40, 6, 1, 233, 160, 40, 6, 1, 200, 84, 226, 146, 40, 6, 1, 237, 152, - 40, 6, 1, 247, 216, 68, 40, 6, 1, 196, 24, 40, 6, 1, 225, 192, 40, 6, 1, - 222, 39, 40, 6, 1, 216, 156, 40, 6, 1, 201, 101, 40, 6, 1, 224, 37, 40, - 6, 1, 230, 248, 3, 233, 99, 40, 6, 1, 206, 182, 66, 40, 6, 1, 237, 148, - 40, 6, 1, 63, 40, 6, 1, 249, 8, 40, 6, 1, 199, 118, 40, 6, 1, 233, 215, - 40, 6, 1, 239, 251, 40, 6, 1, 226, 146, 40, 6, 1, 195, 65, 40, 6, 1, 195, - 88, 40, 6, 1, 68, 40, 6, 1, 206, 182, 68, 40, 6, 1, 155, 40, 6, 1, 237, - 6, 40, 6, 1, 236, 240, 40, 6, 1, 236, 229, 40, 6, 1, 72, 40, 6, 1, 213, - 91, 40, 6, 1, 236, 162, 40, 6, 1, 236, 150, 40, 6, 1, 203, 68, 40, 6, 1, - 66, 40, 6, 1, 237, 46, 40, 6, 1, 142, 40, 6, 1, 201, 107, 40, 6, 1, 245, - 102, 40, 6, 1, 207, 50, 40, 6, 1, 207, 2, 40, 6, 1, 232, 172, 55, 40, 6, - 1, 196, 47, 40, 6, 1, 205, 186, 55, 40, 6, 1, 69, 40, 6, 1, 195, 217, 40, - 6, 1, 164, 40, 4, 1, 63, 40, 4, 1, 249, 8, 40, 4, 1, 199, 118, 40, 4, 1, - 233, 215, 40, 4, 1, 239, 251, 40, 4, 1, 226, 146, 40, 4, 1, 195, 65, 40, - 4, 1, 195, 88, 40, 4, 1, 68, 40, 4, 1, 206, 182, 68, 40, 4, 1, 155, 40, - 4, 1, 237, 6, 40, 4, 1, 236, 240, 40, 4, 1, 236, 229, 40, 4, 1, 72, 40, - 4, 1, 213, 91, 40, 4, 1, 236, 162, 40, 4, 1, 236, 150, 40, 4, 1, 203, 68, - 40, 4, 1, 66, 40, 4, 1, 237, 46, 40, 4, 1, 142, 40, 4, 1, 201, 107, 40, - 4, 1, 245, 102, 40, 4, 1, 207, 50, 40, 4, 1, 207, 2, 40, 4, 1, 232, 172, - 55, 40, 4, 1, 196, 47, 40, 4, 1, 205, 186, 55, 40, 4, 1, 69, 40, 4, 1, - 195, 217, 40, 4, 1, 164, 40, 4, 1, 226, 147, 3, 233, 99, 40, 4, 1, 226, - 11, 40, 4, 1, 239, 45, 40, 4, 1, 233, 160, 40, 4, 1, 200, 84, 226, 146, - 40, 4, 1, 237, 152, 40, 4, 1, 247, 216, 68, 40, 4, 1, 196, 24, 40, 4, 1, - 225, 192, 40, 4, 1, 222, 39, 40, 4, 1, 216, 156, 40, 4, 1, 201, 101, 40, - 4, 1, 224, 37, 40, 4, 1, 230, 248, 3, 233, 99, 40, 4, 1, 206, 182, 66, - 40, 4, 1, 237, 148, 40, 6, 1, 214, 123, 40, 4, 1, 214, 123, 40, 6, 1, - 196, 84, 40, 4, 1, 196, 84, 40, 6, 1, 226, 4, 69, 40, 4, 1, 226, 4, 69, - 40, 6, 1, 222, 46, 195, 182, 40, 4, 1, 222, 46, 195, 182, 40, 6, 1, 226, - 4, 222, 46, 195, 182, 40, 4, 1, 226, 4, 222, 46, 195, 182, 40, 6, 1, 248, - 170, 195, 182, 40, 4, 1, 248, 170, 195, 182, 40, 6, 1, 226, 4, 248, 170, - 195, 182, 40, 4, 1, 226, 4, 248, 170, 195, 182, 40, 6, 1, 223, 202, 40, - 4, 1, 223, 202, 40, 6, 1, 211, 237, 40, 4, 1, 211, 237, 40, 6, 1, 235, - 102, 40, 4, 1, 235, 102, 40, 6, 1, 225, 218, 40, 4, 1, 225, 218, 40, 6, - 1, 225, 219, 3, 52, 233, 100, 252, 21, 40, 4, 1, 225, 219, 3, 52, 233, - 100, 252, 21, 40, 6, 1, 200, 87, 40, 4, 1, 200, 87, 40, 6, 1, 209, 187, - 214, 123, 40, 4, 1, 209, 187, 214, 123, 40, 6, 1, 214, 124, 3, 202, 54, - 40, 4, 1, 214, 124, 3, 202, 54, 40, 6, 1, 214, 48, 40, 4, 1, 214, 48, 40, - 6, 1, 223, 235, 40, 4, 1, 223, 235, 40, 202, 158, 55, 38, 40, 202, 54, - 38, 40, 213, 213, 38, 40, 240, 62, 212, 118, 38, 40, 211, 231, 212, 118, - 38, 40, 212, 102, 38, 40, 231, 57, 202, 158, 55, 38, 40, 219, 26, 55, 40, - 6, 1, 206, 182, 230, 248, 3, 203, 135, 40, 4, 1, 206, 182, 230, 248, 3, - 203, 135, 40, 6, 1, 207, 101, 55, 40, 4, 1, 207, 101, 55, 40, 6, 1, 236, - 163, 3, 202, 111, 40, 4, 1, 236, 163, 3, 202, 111, 40, 6, 1, 233, 216, 3, - 200, 27, 40, 4, 1, 233, 216, 3, 200, 27, 40, 6, 1, 233, 216, 3, 106, 40, - 4, 1, 233, 216, 3, 106, 40, 6, 1, 233, 216, 3, 112, 122, 40, 4, 1, 233, - 216, 3, 112, 122, 40, 6, 1, 195, 66, 3, 239, 194, 40, 4, 1, 195, 66, 3, - 239, 194, 40, 6, 1, 195, 89, 3, 239, 194, 40, 4, 1, 195, 89, 3, 239, 194, - 40, 6, 1, 225, 69, 3, 239, 194, 40, 4, 1, 225, 69, 3, 239, 194, 40, 6, 1, - 225, 69, 3, 83, 106, 40, 4, 1, 225, 69, 3, 83, 106, 40, 6, 1, 225, 69, 3, - 106, 40, 4, 1, 225, 69, 3, 106, 40, 6, 1, 249, 61, 155, 40, 4, 1, 249, - 61, 155, 40, 6, 1, 236, 230, 3, 239, 194, 40, 4, 1, 236, 230, 3, 239, - 194, 40, 6, 33, 236, 230, 233, 215, 40, 4, 33, 236, 230, 233, 215, 40, 6, - 1, 213, 92, 3, 112, 122, 40, 4, 1, 213, 92, 3, 112, 122, 40, 6, 1, 252, - 28, 142, 40, 4, 1, 252, 28, 142, 40, 6, 1, 236, 151, 3, 239, 194, 40, 4, - 1, 236, 151, 3, 239, 194, 40, 6, 1, 203, 69, 3, 239, 194, 40, 4, 1, 203, - 69, 3, 239, 194, 40, 6, 1, 204, 218, 66, 40, 4, 1, 204, 218, 66, 40, 6, - 1, 204, 218, 118, 3, 106, 40, 4, 1, 204, 218, 118, 3, 106, 40, 6, 1, 233, - 3, 3, 239, 194, 40, 4, 1, 233, 3, 3, 239, 194, 40, 6, 33, 203, 69, 201, - 107, 40, 4, 33, 203, 69, 201, 107, 40, 6, 1, 245, 103, 3, 239, 194, 40, - 4, 1, 245, 103, 3, 239, 194, 40, 6, 1, 245, 103, 3, 83, 106, 40, 4, 1, - 245, 103, 3, 83, 106, 40, 6, 1, 206, 224, 40, 4, 1, 206, 224, 40, 6, 1, - 252, 28, 245, 102, 40, 4, 1, 252, 28, 245, 102, 40, 6, 1, 252, 28, 245, - 103, 3, 239, 194, 40, 4, 1, 252, 28, 245, 103, 3, 239, 194, 40, 1, 213, - 202, 40, 6, 1, 195, 66, 3, 248, 46, 40, 4, 1, 195, 66, 3, 248, 46, 40, 6, - 1, 225, 69, 3, 122, 40, 4, 1, 225, 69, 3, 122, 40, 6, 1, 237, 7, 3, 203, - 135, 40, 4, 1, 237, 7, 3, 203, 135, 40, 6, 1, 236, 230, 3, 122, 40, 4, 1, - 236, 230, 3, 122, 40, 6, 1, 236, 230, 3, 203, 135, 40, 4, 1, 236, 230, 3, - 203, 135, 40, 6, 1, 224, 139, 245, 102, 40, 4, 1, 224, 139, 245, 102, 40, - 6, 1, 236, 241, 3, 203, 135, 40, 4, 1, 236, 241, 3, 203, 135, 40, 4, 1, - 213, 202, 40, 6, 1, 39, 3, 248, 46, 40, 4, 1, 39, 3, 248, 46, 40, 6, 1, - 39, 3, 239, 149, 40, 4, 1, 39, 3, 239, 149, 40, 6, 33, 39, 226, 146, 40, - 4, 33, 39, 226, 146, 40, 6, 1, 226, 147, 3, 248, 46, 40, 4, 1, 226, 147, - 3, 248, 46, 40, 6, 1, 208, 163, 40, 4, 1, 208, 163, 40, 6, 1, 208, 164, - 3, 239, 149, 40, 4, 1, 208, 164, 3, 239, 149, 40, 6, 1, 195, 66, 3, 239, - 149, 40, 4, 1, 195, 66, 3, 239, 149, 40, 6, 1, 195, 89, 3, 239, 149, 40, - 4, 1, 195, 89, 3, 239, 149, 40, 6, 1, 252, 28, 237, 152, 40, 4, 1, 252, - 28, 237, 152, 40, 6, 1, 230, 248, 3, 220, 113, 40, 4, 1, 230, 248, 3, - 220, 113, 40, 6, 1, 230, 248, 3, 239, 149, 40, 4, 1, 230, 248, 3, 239, - 149, 40, 6, 1, 177, 3, 239, 149, 40, 4, 1, 177, 3, 239, 149, 40, 6, 1, - 249, 73, 72, 40, 4, 1, 249, 73, 72, 40, 6, 1, 249, 73, 177, 3, 239, 149, - 40, 4, 1, 249, 73, 177, 3, 239, 149, 40, 6, 1, 237, 135, 3, 239, 149, 40, - 4, 1, 237, 135, 3, 239, 149, 40, 6, 1, 118, 3, 220, 113, 40, 4, 1, 118, - 3, 220, 113, 40, 6, 1, 118, 3, 239, 149, 40, 4, 1, 118, 3, 239, 149, 40, - 6, 1, 118, 3, 52, 186, 40, 4, 1, 118, 3, 52, 186, 40, 6, 1, 245, 103, 3, - 239, 149, 40, 4, 1, 245, 103, 3, 239, 149, 40, 6, 1, 233, 216, 3, 239, - 194, 40, 4, 1, 233, 216, 3, 239, 194, 40, 6, 1, 196, 48, 3, 239, 149, 40, - 4, 1, 196, 48, 3, 239, 149, 40, 6, 1, 233, 216, 3, 204, 196, 26, 122, 40, - 4, 1, 233, 216, 3, 204, 196, 26, 122, 40, 6, 1, 233, 3, 3, 122, 40, 4, 1, - 233, 3, 3, 122, 40, 6, 1, 233, 3, 3, 106, 40, 4, 1, 233, 3, 3, 106, 40, - 6, 1, 223, 245, 239, 251, 40, 4, 1, 223, 245, 239, 251, 40, 6, 1, 223, - 245, 239, 45, 40, 4, 1, 223, 245, 239, 45, 40, 6, 1, 223, 245, 195, 15, - 40, 4, 1, 223, 245, 195, 15, 40, 6, 1, 223, 245, 237, 144, 40, 4, 1, 223, - 245, 237, 144, 40, 6, 1, 223, 245, 222, 39, 40, 4, 1, 223, 245, 222, 39, - 40, 6, 1, 223, 245, 216, 156, 40, 4, 1, 223, 245, 216, 156, 40, 6, 1, - 223, 245, 206, 8, 40, 4, 1, 223, 245, 206, 8, 40, 6, 1, 223, 245, 202, - 48, 40, 4, 1, 223, 245, 202, 48, 40, 6, 1, 210, 89, 195, 88, 40, 4, 1, - 210, 89, 195, 88, 40, 6, 1, 237, 7, 3, 122, 40, 4, 1, 237, 7, 3, 122, 40, - 6, 1, 222, 121, 40, 4, 1, 222, 121, 40, 6, 1, 210, 77, 40, 4, 1, 210, 77, - 40, 6, 1, 196, 118, 40, 4, 1, 196, 118, 40, 6, 1, 211, 158, 40, 4, 1, - 211, 158, 40, 6, 1, 197, 109, 40, 4, 1, 197, 109, 40, 6, 1, 251, 159, - 155, 40, 4, 1, 251, 159, 155, 40, 6, 1, 237, 7, 3, 112, 122, 40, 4, 1, - 237, 7, 3, 112, 122, 40, 6, 1, 236, 230, 3, 112, 122, 40, 4, 1, 236, 230, - 3, 112, 122, 40, 6, 1, 213, 92, 3, 239, 194, 40, 4, 1, 213, 92, 3, 239, - 194, 40, 6, 1, 206, 225, 3, 239, 194, 40, 4, 1, 206, 225, 3, 239, 194, - 40, 6, 1, 236, 230, 3, 50, 122, 40, 4, 1, 236, 230, 3, 50, 122, 40, 6, 1, - 237, 136, 40, 4, 1, 237, 136, 40, 6, 1, 240, 44, 40, 4, 1, 240, 44, 40, - 6, 1, 237, 7, 3, 239, 194, 40, 4, 1, 237, 7, 3, 239, 194, 250, 229, 6, 1, - 250, 118, 250, 229, 6, 1, 248, 222, 250, 229, 6, 1, 233, 178, 250, 229, - 6, 1, 240, 135, 250, 229, 6, 1, 237, 59, 250, 229, 6, 1, 195, 115, 250, - 229, 6, 1, 237, 39, 250, 229, 6, 1, 236, 127, 250, 229, 6, 1, 149, 250, - 229, 6, 1, 195, 65, 250, 229, 6, 1, 226, 54, 250, 229, 6, 1, 222, 43, - 250, 229, 6, 1, 196, 200, 250, 229, 6, 1, 247, 173, 250, 229, 6, 1, 224, - 181, 250, 229, 6, 1, 231, 192, 250, 229, 6, 1, 225, 213, 250, 229, 6, 1, - 233, 226, 250, 229, 6, 1, 245, 92, 250, 229, 6, 1, 219, 163, 250, 229, 6, - 1, 196, 24, 250, 229, 6, 1, 216, 3, 250, 229, 6, 1, 207, 50, 250, 229, 6, - 1, 198, 248, 250, 229, 6, 1, 247, 15, 250, 229, 6, 1, 213, 71, 250, 229, - 6, 1, 225, 174, 250, 229, 6, 1, 169, 250, 229, 6, 1, 208, 119, 250, 229, - 6, 1, 199, 39, 250, 229, 6, 1, 202, 51, 250, 229, 6, 1, 210, 141, 250, - 229, 6, 1, 244, 181, 250, 229, 6, 1, 196, 8, 250, 229, 6, 1, 212, 153, - 250, 229, 6, 1, 224, 192, 250, 229, 6, 1, 214, 148, 250, 229, 6, 1, 235, - 175, 250, 229, 73, 1, 50, 157, 210, 2, 250, 229, 251, 29, 250, 229, 236, - 233, 78, 250, 229, 236, 89, 78, 250, 229, 244, 158, 250, 229, 211, 78, - 78, 250, 229, 252, 29, 78, 250, 229, 4, 1, 163, 250, 118, 250, 229, 4, 1, - 250, 118, 250, 229, 4, 1, 248, 222, 250, 229, 4, 1, 233, 178, 250, 229, - 4, 1, 240, 135, 250, 229, 4, 1, 237, 59, 250, 229, 4, 1, 195, 115, 250, - 229, 4, 1, 237, 39, 250, 229, 4, 1, 236, 127, 250, 229, 4, 1, 149, 250, - 229, 4, 1, 195, 65, 250, 229, 4, 1, 226, 54, 250, 229, 4, 1, 222, 43, - 250, 229, 4, 1, 196, 200, 250, 229, 4, 1, 247, 173, 250, 229, 4, 1, 224, - 181, 250, 229, 4, 1, 231, 192, 250, 229, 4, 1, 225, 213, 250, 229, 4, 1, - 233, 226, 250, 229, 4, 1, 245, 92, 250, 229, 4, 1, 219, 163, 250, 229, 4, - 1, 196, 24, 250, 229, 4, 1, 216, 3, 250, 229, 4, 1, 207, 50, 250, 229, 4, - 1, 198, 248, 250, 229, 4, 1, 247, 15, 250, 229, 4, 1, 213, 71, 250, 229, - 4, 1, 225, 174, 250, 229, 4, 1, 169, 250, 229, 4, 1, 208, 119, 250, 229, - 4, 1, 199, 39, 250, 229, 4, 1, 202, 51, 250, 229, 4, 1, 210, 141, 250, - 229, 4, 1, 244, 181, 250, 229, 4, 1, 196, 8, 250, 229, 4, 1, 212, 153, - 250, 229, 4, 1, 224, 192, 250, 229, 4, 1, 214, 148, 250, 229, 4, 1, 235, - 175, 250, 229, 4, 33, 237, 60, 196, 8, 250, 229, 4, 1, 11, 3, 106, 250, - 229, 234, 216, 204, 226, 250, 229, 231, 6, 210, 21, 250, 229, 236, 123, - 55, 222, 182, 250, 229, 236, 123, 55, 250, 229, 237, 221, 55, 123, 252, - 22, 236, 118, 123, 252, 22, 208, 120, 123, 252, 22, 207, 27, 123, 252, - 22, 195, 100, 211, 141, 123, 252, 22, 195, 100, 234, 112, 123, 252, 22, - 202, 66, 123, 252, 22, 210, 86, 123, 252, 22, 195, 98, 123, 252, 22, 213, - 123, 123, 252, 22, 196, 37, 123, 252, 22, 202, 240, 123, 252, 22, 234, - 21, 123, 252, 22, 234, 22, 218, 101, 123, 252, 22, 234, 19, 123, 252, 22, - 211, 142, 213, 155, 123, 252, 22, 203, 30, 234, 40, 123, 252, 22, 213, - 97, 123, 252, 22, 250, 158, 232, 239, 123, 252, 22, 218, 111, 123, 252, - 22, 220, 85, 123, 252, 22, 219, 152, 123, 252, 22, 219, 153, 224, 193, - 123, 252, 22, 240, 71, 123, 252, 22, 211, 153, 123, 252, 22, 203, 30, - 211, 136, 123, 252, 22, 196, 50, 248, 223, 195, 238, 123, 252, 22, 214, - 130, 123, 252, 22, 226, 105, 123, 252, 22, 239, 228, 123, 252, 22, 195, - 22, 123, 117, 220, 7, 244, 248, 123, 212, 110, 206, 227, 123, 212, 110, - 232, 163, 208, 120, 123, 212, 110, 232, 163, 213, 114, 123, 212, 110, - 232, 163, 211, 146, 123, 212, 110, 232, 32, 123, 212, 110, 201, 104, 123, - 212, 110, 208, 120, 123, 212, 110, 213, 114, 123, 212, 110, 211, 146, - 123, 212, 110, 231, 176, 123, 212, 110, 231, 177, 232, 165, 36, 199, 122, - 123, 212, 110, 211, 82, 123, 212, 110, 240, 120, 214, 72, 220, 41, 123, - 212, 110, 219, 141, 123, 211, 213, 220, 38, 123, 212, 110, 210, 226, 123, - 211, 213, 213, 125, 123, 212, 110, 206, 212, 238, 252, 123, 212, 110, - 206, 66, 238, 252, 123, 211, 213, 205, 187, 213, 116, 123, 117, 200, 33, - 238, 252, 123, 117, 221, 202, 238, 252, 123, 211, 213, 215, 138, 232, - 238, 123, 212, 110, 211, 147, 211, 141, 123, 1, 251, 163, 123, 1, 248, - 207, 123, 1, 233, 176, 123, 1, 240, 100, 123, 1, 232, 146, 123, 1, 199, - 122, 123, 1, 195, 92, 123, 1, 232, 88, 123, 1, 203, 1, 123, 1, 195, 241, - 123, 1, 48, 225, 34, 123, 1, 225, 34, 123, 1, 222, 240, 123, 1, 48, 219, - 170, 123, 1, 219, 170, 123, 1, 48, 215, 137, 123, 1, 215, 137, 123, 1, - 208, 225, 123, 1, 250, 116, 123, 1, 48, 213, 91, 123, 1, 213, 91, 123, 1, - 48, 201, 108, 123, 1, 201, 108, 123, 1, 211, 105, 123, 1, 210, 109, 123, - 1, 206, 211, 123, 1, 203, 85, 123, 195, 242, 201, 180, 123, 33, 196, 22, - 52, 199, 122, 123, 33, 196, 22, 199, 123, 195, 241, 123, 33, 196, 22, 52, - 195, 241, 123, 211, 213, 234, 21, 123, 211, 213, 234, 19, 9, 31, 55, 9, - 2, 208, 218, 9, 235, 34, 220, 23, 9, 2, 209, 3, 9, 2, 208, 221, 9, 31, - 117, 57, 251, 8, 241, 36, 209, 200, 251, 8, 234, 255, 209, 200, 9, 210, - 190, 251, 8, 213, 45, 219, 28, 55, 251, 8, 213, 45, 203, 24, 202, 159, - 55, 251, 221, 55, 9, 244, 158, 9, 240, 58, 207, 90, 9, 212, 112, 199, - 102, 55, 9, 2, 219, 7, 9, 2, 208, 235, 251, 166, 197, 133, 9, 2, 251, - 166, 250, 183, 9, 2, 210, 224, 251, 165, 9, 2, 210, 232, 251, 143, 251, - 81, 9, 2, 203, 126, 9, 4, 130, 203, 139, 9, 4, 130, 33, 151, 3, 222, 249, - 3, 196, 64, 9, 4, 130, 195, 106, 9, 4, 235, 199, 9, 4, 240, 94, 9, 4, - 224, 237, 9, 207, 105, 9, 1, 78, 9, 201, 165, 76, 211, 213, 78, 9, 211, - 78, 78, 9, 1, 224, 241, 196, 64, 9, 1, 232, 212, 9, 1, 151, 3, 220, 109, - 57, 9, 1, 151, 3, 232, 213, 57, 9, 1, 197, 118, 3, 232, 213, 57, 9, 1, - 151, 3, 232, 213, 60, 9, 1, 93, 3, 232, 213, 57, 9, 1, 251, 163, 9, 1, - 248, 238, 9, 1, 203, 42, 220, 34, 9, 1, 203, 41, 9, 1, 202, 213, 9, 1, - 225, 188, 9, 1, 232, 235, 9, 1, 224, 141, 9, 1, 240, 106, 9, 1, 202, 225, - 9, 1, 210, 141, 9, 1, 195, 106, 9, 1, 208, 125, 9, 1, 206, 251, 9, 1, - 209, 8, 9, 1, 240, 129, 9, 1, 203, 139, 9, 1, 195, 109, 9, 1, 251, 193, - 9, 1, 233, 224, 9, 1, 224, 191, 3, 99, 238, 250, 57, 9, 1, 224, 191, 3, - 115, 238, 250, 60, 9, 1, 235, 203, 93, 3, 226, 16, 199, 230, 9, 1, 235, - 203, 93, 3, 99, 238, 250, 57, 9, 1, 235, 203, 93, 3, 115, 238, 250, 57, - 9, 203, 91, 9, 1, 235, 175, 9, 1, 211, 151, 9, 1, 225, 34, 9, 1, 222, - 248, 9, 1, 219, 184, 9, 1, 216, 30, 9, 1, 232, 112, 9, 1, 197, 117, 9, 1, - 151, 220, 68, 9, 1, 196, 64, 9, 235, 197, 9, 240, 92, 9, 224, 235, 9, - 235, 199, 9, 240, 94, 9, 224, 237, 9, 207, 40, 9, 204, 119, 9, 220, 107, - 57, 9, 232, 213, 57, 9, 232, 213, 60, 9, 204, 143, 251, 163, 9, 226, 16, - 240, 94, 9, 117, 216, 31, 233, 195, 9, 194, 241, 9, 18, 2, 4, 199, 231, - 57, 9, 18, 2, 226, 16, 4, 199, 231, 57, 9, 18, 2, 76, 60, 9, 210, 89, - 240, 94, 9, 235, 200, 3, 99, 238, 249, 9, 197, 119, 232, 213, 60, 251, 8, - 17, 195, 79, 251, 8, 17, 100, 251, 8, 17, 102, 251, 8, 17, 134, 251, 8, - 17, 136, 251, 8, 17, 146, 251, 8, 17, 167, 251, 8, 17, 178, 251, 8, 17, - 171, 251, 8, 17, 182, 9, 213, 44, 55, 9, 239, 243, 207, 90, 9, 202, 158, - 207, 90, 9, 235, 100, 212, 108, 205, 7, 9, 1, 238, 251, 248, 238, 9, 1, - 238, 251, 211, 151, 9, 1, 204, 95, 251, 163, 9, 1, 151, 197, 134, 9, 1, - 151, 3, 197, 119, 232, 213, 57, 9, 1, 151, 3, 197, 119, 232, 213, 60, 9, - 1, 130, 232, 212, 9, 1, 130, 232, 213, 251, 163, 9, 1, 130, 232, 213, - 197, 117, 9, 1, 118, 3, 232, 213, 57, 9, 1, 130, 232, 213, 196, 64, 9, 1, - 201, 70, 9, 1, 201, 68, 9, 1, 248, 248, 9, 1, 203, 42, 3, 210, 2, 9, 1, - 203, 42, 3, 115, 238, 250, 90, 237, 229, 9, 1, 213, 71, 9, 1, 203, 39, 9, - 1, 248, 236, 9, 1, 168, 3, 232, 213, 57, 9, 1, 168, 3, 99, 238, 250, 83, - 57, 9, 1, 215, 94, 9, 1, 237, 161, 9, 1, 168, 3, 115, 238, 250, 57, 9, 1, - 203, 72, 9, 1, 203, 70, 9, 1, 240, 35, 9, 1, 240, 107, 3, 210, 2, 9, 1, - 240, 107, 3, 76, 60, 9, 1, 240, 107, 3, 76, 248, 226, 26, 4, 203, 139, 9, - 1, 240, 113, 9, 1, 240, 37, 9, 1, 237, 190, 9, 1, 240, 107, 3, 115, 238, - 250, 90, 237, 229, 9, 1, 240, 107, 3, 235, 6, 238, 250, 57, 9, 1, 209, - 173, 9, 1, 210, 142, 3, 4, 199, 230, 9, 1, 210, 142, 3, 210, 2, 9, 1, - 210, 142, 3, 76, 60, 9, 1, 210, 142, 3, 4, 199, 231, 60, 9, 1, 210, 142, - 3, 76, 248, 226, 26, 76, 57, 9, 1, 210, 142, 3, 99, 238, 250, 57, 9, 1, - 225, 185, 9, 1, 210, 142, 3, 235, 6, 238, 250, 57, 9, 1, 208, 126, 3, 76, - 248, 226, 26, 76, 57, 9, 1, 208, 126, 3, 115, 238, 250, 60, 9, 1, 208, - 126, 3, 115, 238, 250, 248, 226, 26, 115, 238, 250, 57, 9, 1, 209, 9, 3, - 99, 238, 250, 60, 9, 1, 209, 9, 3, 115, 238, 250, 57, 9, 1, 203, 140, 3, - 115, 238, 250, 57, 9, 1, 251, 194, 3, 115, 238, 250, 57, 9, 1, 238, 251, - 235, 175, 9, 1, 235, 176, 3, 76, 218, 161, 60, 9, 1, 235, 176, 3, 76, 60, - 9, 1, 199, 111, 9, 1, 235, 176, 3, 115, 238, 250, 60, 9, 1, 213, 69, 9, - 1, 211, 152, 3, 76, 57, 9, 1, 211, 152, 3, 115, 238, 250, 57, 9, 1, 224, - 190, 9, 1, 204, 63, 225, 34, 9, 1, 225, 35, 3, 210, 2, 9, 1, 225, 35, 3, - 76, 57, 9, 1, 217, 72, 9, 1, 225, 35, 3, 115, 238, 250, 60, 9, 1, 234, - 109, 9, 1, 234, 110, 3, 210, 2, 9, 1, 216, 249, 9, 1, 234, 110, 3, 99, - 238, 250, 60, 9, 1, 233, 62, 9, 1, 234, 110, 3, 115, 238, 250, 57, 9, 1, - 222, 249, 3, 4, 199, 230, 9, 1, 222, 249, 3, 76, 57, 9, 1, 222, 249, 3, - 115, 238, 250, 57, 9, 1, 222, 249, 3, 115, 238, 250, 60, 9, 1, 216, 31, - 3, 76, 60, 9, 1, 216, 31, 233, 195, 9, 1, 209, 235, 9, 1, 216, 31, 3, - 210, 2, 9, 1, 216, 31, 3, 115, 238, 250, 57, 9, 1, 232, 113, 239, 23, 9, - 1, 203, 73, 3, 76, 57, 9, 1, 232, 113, 3, 93, 57, 9, 1, 232, 113, 233, - 140, 9, 1, 232, 113, 233, 141, 3, 232, 213, 57, 9, 1, 203, 42, 220, 35, - 233, 140, 9, 1, 197, 118, 3, 210, 2, 9, 1, 224, 66, 214, 163, 9, 1, 214, - 163, 9, 1, 66, 9, 1, 195, 217, 9, 1, 224, 66, 195, 217, 9, 1, 197, 118, - 3, 99, 238, 250, 57, 9, 1, 199, 118, 9, 1, 235, 203, 196, 64, 9, 1, 93, + 212, 246, 32, 4, 1, 245, 75, 32, 4, 1, 211, 238, 32, 4, 1, 214, 124, 32, + 4, 1, 226, 8, 3, 239, 143, 32, 4, 1, 200, 29, 3, 239, 143, 32, 4, 1, 214, + 123, 3, 201, 248, 32, 4, 1, 200, 29, 3, 201, 248, 32, 4, 1, 214, 125, 3, + 201, 248, 32, 6, 225, 32, 105, 32, 248, 207, 105, 32, 202, 200, 105, 32, + 200, 29, 3, 231, 165, 105, 32, 200, 29, 3, 252, 10, 26, 231, 165, 105, + 32, 200, 29, 3, 239, 151, 26, 231, 165, 105, 32, 212, 247, 105, 32, 212, + 221, 105, 32, 225, 32, 105, 32, 1, 250, 251, 223, 236, 32, 4, 1, 250, + 251, 223, 236, 32, 1, 204, 236, 32, 4, 1, 204, 236, 32, 1, 239, 118, 32, + 4, 1, 239, 118, 32, 1, 223, 236, 32, 4, 1, 223, 236, 32, 1, 208, 222, 32, + 4, 1, 208, 222, 88, 6, 1, 206, 247, 88, 4, 1, 206, 247, 88, 6, 1, 235, + 174, 88, 4, 1, 235, 174, 88, 6, 1, 224, 129, 88, 4, 1, 224, 129, 88, 6, + 1, 231, 156, 88, 4, 1, 231, 156, 88, 6, 1, 234, 89, 88, 4, 1, 234, 89, + 88, 6, 1, 206, 213, 88, 4, 1, 206, 213, 88, 6, 1, 239, 228, 88, 4, 1, + 239, 228, 32, 225, 3, 105, 32, 210, 75, 105, 32, 221, 173, 206, 87, 105, + 32, 1, 195, 232, 32, 6, 202, 200, 105, 32, 221, 173, 236, 175, 105, 32, + 210, 89, 221, 173, 236, 175, 105, 32, 6, 1, 206, 198, 32, 4, 1, 206, 198, + 32, 6, 221, 173, 206, 87, 105, 32, 6, 1, 208, 219, 32, 4, 1, 208, 219, + 32, 210, 75, 3, 204, 196, 105, 32, 6, 210, 89, 221, 173, 206, 87, 105, + 32, 6, 237, 250, 221, 173, 206, 87, 105, 32, 6, 210, 89, 237, 250, 221, + 173, 206, 87, 105, 40, 6, 1, 226, 148, 3, 233, 100, 40, 6, 1, 226, 12, + 40, 6, 1, 239, 46, 40, 6, 1, 233, 161, 40, 6, 1, 200, 84, 226, 147, 40, + 6, 1, 237, 153, 40, 6, 1, 247, 217, 68, 40, 6, 1, 196, 24, 40, 6, 1, 225, + 193, 40, 6, 1, 222, 40, 40, 6, 1, 216, 157, 40, 6, 1, 201, 101, 40, 6, 1, + 224, 38, 40, 6, 1, 230, 249, 3, 233, 100, 40, 6, 1, 206, 182, 66, 40, 6, + 1, 237, 149, 40, 6, 1, 63, 40, 6, 1, 249, 9, 40, 6, 1, 199, 118, 40, 6, + 1, 233, 216, 40, 6, 1, 239, 252, 40, 6, 1, 226, 147, 40, 6, 1, 195, 65, + 40, 6, 1, 195, 88, 40, 6, 1, 68, 40, 6, 1, 206, 182, 68, 40, 6, 1, 155, + 40, 6, 1, 237, 7, 40, 6, 1, 236, 241, 40, 6, 1, 236, 230, 40, 6, 1, 72, + 40, 6, 1, 213, 92, 40, 6, 1, 236, 163, 40, 6, 1, 236, 151, 40, 6, 1, 203, + 68, 40, 6, 1, 66, 40, 6, 1, 237, 47, 40, 6, 1, 142, 40, 6, 1, 201, 107, + 40, 6, 1, 245, 103, 40, 6, 1, 207, 50, 40, 6, 1, 207, 2, 40, 6, 1, 232, + 173, 55, 40, 6, 1, 196, 47, 40, 6, 1, 205, 186, 55, 40, 6, 1, 69, 40, 6, + 1, 195, 217, 40, 6, 1, 164, 40, 4, 1, 63, 40, 4, 1, 249, 9, 40, 4, 1, + 199, 118, 40, 4, 1, 233, 216, 40, 4, 1, 239, 252, 40, 4, 1, 226, 147, 40, + 4, 1, 195, 65, 40, 4, 1, 195, 88, 40, 4, 1, 68, 40, 4, 1, 206, 182, 68, + 40, 4, 1, 155, 40, 4, 1, 237, 7, 40, 4, 1, 236, 241, 40, 4, 1, 236, 230, + 40, 4, 1, 72, 40, 4, 1, 213, 92, 40, 4, 1, 236, 163, 40, 4, 1, 236, 151, + 40, 4, 1, 203, 68, 40, 4, 1, 66, 40, 4, 1, 237, 47, 40, 4, 1, 142, 40, 4, + 1, 201, 107, 40, 4, 1, 245, 103, 40, 4, 1, 207, 50, 40, 4, 1, 207, 2, 40, + 4, 1, 232, 173, 55, 40, 4, 1, 196, 47, 40, 4, 1, 205, 186, 55, 40, 4, 1, + 69, 40, 4, 1, 195, 217, 40, 4, 1, 164, 40, 4, 1, 226, 148, 3, 233, 100, + 40, 4, 1, 226, 12, 40, 4, 1, 239, 46, 40, 4, 1, 233, 161, 40, 4, 1, 200, + 84, 226, 147, 40, 4, 1, 237, 153, 40, 4, 1, 247, 217, 68, 40, 4, 1, 196, + 24, 40, 4, 1, 225, 193, 40, 4, 1, 222, 40, 40, 4, 1, 216, 157, 40, 4, 1, + 201, 101, 40, 4, 1, 224, 38, 40, 4, 1, 230, 249, 3, 233, 100, 40, 4, 1, + 206, 182, 66, 40, 4, 1, 237, 149, 40, 6, 1, 214, 124, 40, 4, 1, 214, 124, + 40, 6, 1, 196, 84, 40, 4, 1, 196, 84, 40, 6, 1, 226, 5, 69, 40, 4, 1, + 226, 5, 69, 40, 6, 1, 222, 47, 195, 182, 40, 4, 1, 222, 47, 195, 182, 40, + 6, 1, 226, 5, 222, 47, 195, 182, 40, 4, 1, 226, 5, 222, 47, 195, 182, 40, + 6, 1, 248, 171, 195, 182, 40, 4, 1, 248, 171, 195, 182, 40, 6, 1, 226, 5, + 248, 171, 195, 182, 40, 4, 1, 226, 5, 248, 171, 195, 182, 40, 6, 1, 223, + 203, 40, 4, 1, 223, 203, 40, 6, 1, 211, 238, 40, 4, 1, 211, 238, 40, 6, + 1, 235, 103, 40, 4, 1, 235, 103, 40, 6, 1, 225, 219, 40, 4, 1, 225, 219, + 40, 6, 1, 225, 220, 3, 52, 233, 101, 252, 22, 40, 4, 1, 225, 220, 3, 52, + 233, 101, 252, 22, 40, 6, 1, 200, 87, 40, 4, 1, 200, 87, 40, 6, 1, 209, + 187, 214, 124, 40, 4, 1, 209, 187, 214, 124, 40, 6, 1, 214, 125, 3, 202, + 54, 40, 4, 1, 214, 125, 3, 202, 54, 40, 6, 1, 214, 49, 40, 4, 1, 214, 49, + 40, 6, 1, 223, 236, 40, 4, 1, 223, 236, 40, 202, 158, 55, 38, 40, 202, + 54, 38, 40, 213, 214, 38, 40, 240, 63, 212, 119, 38, 40, 211, 232, 212, + 119, 38, 40, 212, 103, 38, 40, 231, 58, 202, 158, 55, 38, 40, 219, 27, + 55, 40, 6, 1, 206, 182, 230, 249, 3, 203, 135, 40, 4, 1, 206, 182, 230, + 249, 3, 203, 135, 40, 6, 1, 207, 101, 55, 40, 4, 1, 207, 101, 55, 40, 6, + 1, 236, 164, 3, 202, 111, 40, 4, 1, 236, 164, 3, 202, 111, 40, 6, 1, 233, + 217, 3, 200, 27, 40, 4, 1, 233, 217, 3, 200, 27, 40, 6, 1, 233, 217, 3, + 106, 40, 4, 1, 233, 217, 3, 106, 40, 6, 1, 233, 217, 3, 112, 122, 40, 4, + 1, 233, 217, 3, 112, 122, 40, 6, 1, 195, 66, 3, 239, 195, 40, 4, 1, 195, + 66, 3, 239, 195, 40, 6, 1, 195, 89, 3, 239, 195, 40, 4, 1, 195, 89, 3, + 239, 195, 40, 6, 1, 225, 70, 3, 239, 195, 40, 4, 1, 225, 70, 3, 239, 195, + 40, 6, 1, 225, 70, 3, 83, 106, 40, 4, 1, 225, 70, 3, 83, 106, 40, 6, 1, + 225, 70, 3, 106, 40, 4, 1, 225, 70, 3, 106, 40, 6, 1, 249, 62, 155, 40, + 4, 1, 249, 62, 155, 40, 6, 1, 236, 231, 3, 239, 195, 40, 4, 1, 236, 231, + 3, 239, 195, 40, 6, 33, 236, 231, 233, 216, 40, 4, 33, 236, 231, 233, + 216, 40, 6, 1, 213, 93, 3, 112, 122, 40, 4, 1, 213, 93, 3, 112, 122, 40, + 6, 1, 252, 29, 142, 40, 4, 1, 252, 29, 142, 40, 6, 1, 236, 152, 3, 239, + 195, 40, 4, 1, 236, 152, 3, 239, 195, 40, 6, 1, 203, 69, 3, 239, 195, 40, + 4, 1, 203, 69, 3, 239, 195, 40, 6, 1, 204, 218, 66, 40, 4, 1, 204, 218, + 66, 40, 6, 1, 204, 218, 118, 3, 106, 40, 4, 1, 204, 218, 118, 3, 106, 40, + 6, 1, 233, 4, 3, 239, 195, 40, 4, 1, 233, 4, 3, 239, 195, 40, 6, 33, 203, + 69, 201, 107, 40, 4, 33, 203, 69, 201, 107, 40, 6, 1, 245, 104, 3, 239, + 195, 40, 4, 1, 245, 104, 3, 239, 195, 40, 6, 1, 245, 104, 3, 83, 106, 40, + 4, 1, 245, 104, 3, 83, 106, 40, 6, 1, 206, 224, 40, 4, 1, 206, 224, 40, + 6, 1, 252, 29, 245, 103, 40, 4, 1, 252, 29, 245, 103, 40, 6, 1, 252, 29, + 245, 104, 3, 239, 195, 40, 4, 1, 252, 29, 245, 104, 3, 239, 195, 40, 1, + 213, 203, 40, 6, 1, 195, 66, 3, 248, 47, 40, 4, 1, 195, 66, 3, 248, 47, + 40, 6, 1, 225, 70, 3, 122, 40, 4, 1, 225, 70, 3, 122, 40, 6, 1, 237, 8, + 3, 203, 135, 40, 4, 1, 237, 8, 3, 203, 135, 40, 6, 1, 236, 231, 3, 122, + 40, 4, 1, 236, 231, 3, 122, 40, 6, 1, 236, 231, 3, 203, 135, 40, 4, 1, + 236, 231, 3, 203, 135, 40, 6, 1, 224, 140, 245, 103, 40, 4, 1, 224, 140, + 245, 103, 40, 6, 1, 236, 242, 3, 203, 135, 40, 4, 1, 236, 242, 3, 203, + 135, 40, 4, 1, 213, 203, 40, 6, 1, 39, 3, 248, 47, 40, 4, 1, 39, 3, 248, + 47, 40, 6, 1, 39, 3, 239, 150, 40, 4, 1, 39, 3, 239, 150, 40, 6, 33, 39, + 226, 147, 40, 4, 33, 39, 226, 147, 40, 6, 1, 226, 148, 3, 248, 47, 40, 4, + 1, 226, 148, 3, 248, 47, 40, 6, 1, 208, 163, 40, 4, 1, 208, 163, 40, 6, + 1, 208, 164, 3, 239, 150, 40, 4, 1, 208, 164, 3, 239, 150, 40, 6, 1, 195, + 66, 3, 239, 150, 40, 4, 1, 195, 66, 3, 239, 150, 40, 6, 1, 195, 89, 3, + 239, 150, 40, 4, 1, 195, 89, 3, 239, 150, 40, 6, 1, 252, 29, 237, 153, + 40, 4, 1, 252, 29, 237, 153, 40, 6, 1, 230, 249, 3, 220, 114, 40, 4, 1, + 230, 249, 3, 220, 114, 40, 6, 1, 230, 249, 3, 239, 150, 40, 4, 1, 230, + 249, 3, 239, 150, 40, 6, 1, 177, 3, 239, 150, 40, 4, 1, 177, 3, 239, 150, + 40, 6, 1, 249, 74, 72, 40, 4, 1, 249, 74, 72, 40, 6, 1, 249, 74, 177, 3, + 239, 150, 40, 4, 1, 249, 74, 177, 3, 239, 150, 40, 6, 1, 237, 136, 3, + 239, 150, 40, 4, 1, 237, 136, 3, 239, 150, 40, 6, 1, 118, 3, 220, 114, + 40, 4, 1, 118, 3, 220, 114, 40, 6, 1, 118, 3, 239, 150, 40, 4, 1, 118, 3, + 239, 150, 40, 6, 1, 118, 3, 52, 186, 40, 4, 1, 118, 3, 52, 186, 40, 6, 1, + 245, 104, 3, 239, 150, 40, 4, 1, 245, 104, 3, 239, 150, 40, 6, 1, 233, + 217, 3, 239, 195, 40, 4, 1, 233, 217, 3, 239, 195, 40, 6, 1, 196, 48, 3, + 239, 150, 40, 4, 1, 196, 48, 3, 239, 150, 40, 6, 1, 233, 217, 3, 204, + 196, 26, 122, 40, 4, 1, 233, 217, 3, 204, 196, 26, 122, 40, 6, 1, 233, 4, + 3, 122, 40, 4, 1, 233, 4, 3, 122, 40, 6, 1, 233, 4, 3, 106, 40, 4, 1, + 233, 4, 3, 106, 40, 6, 1, 223, 246, 239, 252, 40, 4, 1, 223, 246, 239, + 252, 40, 6, 1, 223, 246, 239, 46, 40, 4, 1, 223, 246, 239, 46, 40, 6, 1, + 223, 246, 195, 15, 40, 4, 1, 223, 246, 195, 15, 40, 6, 1, 223, 246, 237, + 145, 40, 4, 1, 223, 246, 237, 145, 40, 6, 1, 223, 246, 222, 40, 40, 4, 1, + 223, 246, 222, 40, 40, 6, 1, 223, 246, 216, 157, 40, 4, 1, 223, 246, 216, + 157, 40, 6, 1, 223, 246, 206, 8, 40, 4, 1, 223, 246, 206, 8, 40, 6, 1, + 223, 246, 202, 48, 40, 4, 1, 223, 246, 202, 48, 40, 6, 1, 210, 89, 195, + 88, 40, 4, 1, 210, 89, 195, 88, 40, 6, 1, 237, 8, 3, 122, 40, 4, 1, 237, + 8, 3, 122, 40, 6, 1, 222, 122, 40, 4, 1, 222, 122, 40, 6, 1, 210, 77, 40, + 4, 1, 210, 77, 40, 6, 1, 196, 118, 40, 4, 1, 196, 118, 40, 6, 1, 211, + 159, 40, 4, 1, 211, 159, 40, 6, 1, 197, 109, 40, 4, 1, 197, 109, 40, 6, + 1, 251, 160, 155, 40, 4, 1, 251, 160, 155, 40, 6, 1, 237, 8, 3, 112, 122, + 40, 4, 1, 237, 8, 3, 112, 122, 40, 6, 1, 236, 231, 3, 112, 122, 40, 4, 1, + 236, 231, 3, 112, 122, 40, 6, 1, 213, 93, 3, 239, 195, 40, 4, 1, 213, 93, + 3, 239, 195, 40, 6, 1, 206, 225, 3, 239, 195, 40, 4, 1, 206, 225, 3, 239, + 195, 40, 6, 1, 236, 231, 3, 50, 122, 40, 4, 1, 236, 231, 3, 50, 122, 40, + 6, 1, 237, 137, 40, 4, 1, 237, 137, 40, 6, 1, 240, 45, 40, 4, 1, 240, 45, + 40, 6, 1, 237, 8, 3, 239, 195, 40, 4, 1, 237, 8, 3, 239, 195, 250, 230, + 6, 1, 250, 119, 250, 230, 6, 1, 248, 223, 250, 230, 6, 1, 233, 179, 250, + 230, 6, 1, 240, 136, 250, 230, 6, 1, 237, 60, 250, 230, 6, 1, 195, 115, + 250, 230, 6, 1, 237, 40, 250, 230, 6, 1, 236, 128, 250, 230, 6, 1, 149, + 250, 230, 6, 1, 195, 65, 250, 230, 6, 1, 226, 55, 250, 230, 6, 1, 222, + 44, 250, 230, 6, 1, 196, 200, 250, 230, 6, 1, 247, 174, 250, 230, 6, 1, + 224, 182, 250, 230, 6, 1, 231, 193, 250, 230, 6, 1, 225, 214, 250, 230, + 6, 1, 233, 227, 250, 230, 6, 1, 245, 93, 250, 230, 6, 1, 219, 164, 250, + 230, 6, 1, 196, 24, 250, 230, 6, 1, 216, 4, 250, 230, 6, 1, 207, 50, 250, + 230, 6, 1, 198, 248, 250, 230, 6, 1, 247, 16, 250, 230, 6, 1, 213, 72, + 250, 230, 6, 1, 225, 175, 250, 230, 6, 1, 169, 250, 230, 6, 1, 208, 119, + 250, 230, 6, 1, 199, 39, 250, 230, 6, 1, 202, 51, 250, 230, 6, 1, 210, + 142, 250, 230, 6, 1, 244, 182, 250, 230, 6, 1, 196, 8, 250, 230, 6, 1, + 212, 154, 250, 230, 6, 1, 224, 193, 250, 230, 6, 1, 214, 149, 250, 230, + 6, 1, 235, 176, 250, 230, 73, 1, 50, 157, 210, 2, 250, 230, 251, 30, 250, + 230, 236, 234, 78, 250, 230, 236, 90, 78, 250, 230, 244, 159, 250, 230, + 211, 79, 78, 250, 230, 252, 30, 78, 250, 230, 4, 1, 163, 250, 119, 250, + 230, 4, 1, 250, 119, 250, 230, 4, 1, 248, 223, 250, 230, 4, 1, 233, 179, + 250, 230, 4, 1, 240, 136, 250, 230, 4, 1, 237, 60, 250, 230, 4, 1, 195, + 115, 250, 230, 4, 1, 237, 40, 250, 230, 4, 1, 236, 128, 250, 230, 4, 1, + 149, 250, 230, 4, 1, 195, 65, 250, 230, 4, 1, 226, 55, 250, 230, 4, 1, + 222, 44, 250, 230, 4, 1, 196, 200, 250, 230, 4, 1, 247, 174, 250, 230, 4, + 1, 224, 182, 250, 230, 4, 1, 231, 193, 250, 230, 4, 1, 225, 214, 250, + 230, 4, 1, 233, 227, 250, 230, 4, 1, 245, 93, 250, 230, 4, 1, 219, 164, + 250, 230, 4, 1, 196, 24, 250, 230, 4, 1, 216, 4, 250, 230, 4, 1, 207, 50, + 250, 230, 4, 1, 198, 248, 250, 230, 4, 1, 247, 16, 250, 230, 4, 1, 213, + 72, 250, 230, 4, 1, 225, 175, 250, 230, 4, 1, 169, 250, 230, 4, 1, 208, + 119, 250, 230, 4, 1, 199, 39, 250, 230, 4, 1, 202, 51, 250, 230, 4, 1, + 210, 142, 250, 230, 4, 1, 244, 182, 250, 230, 4, 1, 196, 8, 250, 230, 4, + 1, 212, 154, 250, 230, 4, 1, 224, 193, 250, 230, 4, 1, 214, 149, 250, + 230, 4, 1, 235, 176, 250, 230, 4, 33, 237, 61, 196, 8, 250, 230, 4, 1, + 11, 3, 106, 250, 230, 234, 217, 204, 226, 250, 230, 231, 7, 210, 21, 250, + 230, 236, 124, 55, 222, 183, 250, 230, 236, 124, 55, 250, 230, 237, 222, + 55, 123, 252, 23, 236, 119, 123, 252, 23, 208, 120, 123, 252, 23, 207, + 27, 123, 252, 23, 195, 100, 211, 142, 123, 252, 23, 195, 100, 234, 113, + 123, 252, 23, 202, 66, 123, 252, 23, 210, 86, 123, 252, 23, 195, 98, 123, + 252, 23, 213, 124, 123, 252, 23, 196, 37, 123, 252, 23, 202, 240, 123, + 252, 23, 234, 22, 123, 252, 23, 234, 23, 218, 102, 123, 252, 23, 234, 20, + 123, 252, 23, 211, 143, 213, 156, 123, 252, 23, 203, 30, 234, 41, 123, + 252, 23, 213, 98, 123, 252, 23, 250, 159, 232, 240, 123, 252, 23, 218, + 112, 123, 252, 23, 220, 86, 123, 252, 23, 219, 153, 123, 252, 23, 219, + 154, 224, 194, 123, 252, 23, 240, 72, 123, 252, 23, 211, 154, 123, 252, + 23, 203, 30, 211, 137, 123, 252, 23, 196, 50, 248, 224, 195, 238, 123, + 252, 23, 214, 131, 123, 252, 23, 226, 106, 123, 252, 23, 239, 229, 123, + 252, 23, 195, 22, 123, 117, 220, 8, 244, 249, 123, 212, 111, 206, 227, + 123, 212, 111, 232, 164, 208, 120, 123, 212, 111, 232, 164, 213, 115, + 123, 212, 111, 232, 164, 211, 147, 123, 212, 111, 232, 33, 123, 212, 111, + 201, 104, 123, 212, 111, 208, 120, 123, 212, 111, 213, 115, 123, 212, + 111, 211, 147, 123, 212, 111, 231, 177, 123, 212, 111, 231, 178, 232, + 166, 36, 199, 122, 123, 212, 111, 211, 83, 123, 212, 111, 240, 121, 214, + 73, 220, 42, 123, 212, 111, 219, 142, 123, 211, 214, 220, 39, 123, 212, + 111, 210, 227, 123, 211, 214, 213, 126, 123, 212, 111, 206, 212, 238, + 253, 123, 212, 111, 206, 66, 238, 253, 123, 211, 214, 205, 187, 213, 117, + 123, 117, 200, 33, 238, 253, 123, 117, 221, 203, 238, 253, 123, 211, 214, + 215, 139, 232, 239, 123, 212, 111, 211, 148, 211, 142, 123, 1, 251, 164, + 123, 1, 248, 208, 123, 1, 233, 177, 123, 1, 240, 101, 123, 1, 232, 147, + 123, 1, 199, 122, 123, 1, 195, 92, 123, 1, 232, 89, 123, 1, 203, 1, 123, + 1, 195, 241, 123, 1, 48, 225, 35, 123, 1, 225, 35, 123, 1, 222, 241, 123, + 1, 48, 219, 171, 123, 1, 219, 171, 123, 1, 48, 215, 138, 123, 1, 215, + 138, 123, 1, 208, 225, 123, 1, 250, 117, 123, 1, 48, 213, 92, 123, 1, + 213, 92, 123, 1, 48, 201, 108, 123, 1, 201, 108, 123, 1, 211, 106, 123, + 1, 210, 109, 123, 1, 206, 211, 123, 1, 203, 85, 123, 195, 242, 201, 180, + 123, 33, 196, 22, 52, 199, 122, 123, 33, 196, 22, 199, 123, 195, 241, + 123, 33, 196, 22, 52, 195, 241, 123, 211, 214, 234, 22, 123, 211, 214, + 234, 20, 9, 31, 55, 9, 2, 208, 218, 9, 235, 35, 220, 24, 9, 2, 209, 3, 9, + 2, 208, 221, 9, 31, 117, 57, 251, 9, 241, 37, 209, 200, 251, 9, 235, 0, + 209, 200, 9, 210, 191, 251, 9, 213, 46, 219, 29, 55, 251, 9, 213, 46, + 203, 24, 202, 159, 55, 251, 222, 55, 9, 244, 159, 9, 240, 59, 207, 90, 9, + 212, 113, 199, 102, 55, 9, 2, 219, 8, 9, 2, 208, 235, 251, 167, 197, 133, + 9, 2, 251, 167, 250, 184, 9, 2, 210, 225, 251, 166, 9, 2, 210, 233, 251, + 144, 251, 82, 9, 2, 203, 126, 9, 4, 130, 203, 139, 9, 4, 130, 33, 151, 3, + 222, 250, 3, 196, 64, 9, 4, 130, 195, 106, 9, 4, 235, 200, 9, 4, 240, 95, + 9, 4, 224, 238, 9, 207, 105, 9, 1, 78, 9, 201, 165, 76, 211, 214, 78, 9, + 211, 79, 78, 9, 1, 224, 242, 196, 64, 9, 1, 232, 213, 9, 1, 151, 3, 220, + 110, 57, 9, 1, 151, 3, 232, 214, 57, 9, 1, 197, 118, 3, 232, 214, 57, 9, + 1, 151, 3, 232, 214, 60, 9, 1, 93, 3, 232, 214, 57, 9, 1, 251, 164, 9, 1, + 248, 239, 9, 1, 203, 42, 220, 35, 9, 1, 203, 41, 9, 1, 202, 213, 9, 1, + 225, 189, 9, 1, 232, 236, 9, 1, 224, 142, 9, 1, 240, 107, 9, 1, 202, 225, + 9, 1, 210, 142, 9, 1, 195, 106, 9, 1, 208, 125, 9, 1, 206, 251, 9, 1, + 209, 8, 9, 1, 240, 130, 9, 1, 203, 139, 9, 1, 195, 109, 9, 1, 251, 194, + 9, 1, 233, 225, 9, 1, 224, 192, 3, 99, 238, 251, 57, 9, 1, 224, 192, 3, + 115, 238, 251, 60, 9, 1, 235, 204, 93, 3, 226, 17, 199, 230, 9, 1, 235, + 204, 93, 3, 99, 238, 251, 57, 9, 1, 235, 204, 93, 3, 115, 238, 251, 57, + 9, 203, 91, 9, 1, 235, 176, 9, 1, 211, 152, 9, 1, 225, 35, 9, 1, 222, + 249, 9, 1, 219, 185, 9, 1, 216, 31, 9, 1, 232, 113, 9, 1, 197, 117, 9, 1, + 151, 220, 69, 9, 1, 196, 64, 9, 235, 198, 9, 240, 93, 9, 224, 236, 9, + 235, 200, 9, 240, 95, 9, 224, 238, 9, 207, 40, 9, 204, 119, 9, 220, 108, + 57, 9, 232, 214, 57, 9, 232, 214, 60, 9, 204, 143, 251, 164, 9, 226, 17, + 240, 95, 9, 117, 216, 32, 233, 196, 9, 194, 241, 9, 18, 2, 4, 199, 231, + 57, 9, 18, 2, 226, 17, 4, 199, 231, 57, 9, 18, 2, 76, 60, 9, 210, 89, + 240, 95, 9, 235, 201, 3, 99, 238, 250, 9, 197, 119, 232, 214, 60, 251, 9, + 17, 195, 79, 251, 9, 17, 100, 251, 9, 17, 102, 251, 9, 17, 134, 251, 9, + 17, 136, 251, 9, 17, 146, 251, 9, 17, 167, 251, 9, 17, 178, 251, 9, 17, + 171, 251, 9, 17, 182, 9, 213, 45, 55, 9, 239, 244, 207, 90, 9, 202, 158, + 207, 90, 9, 235, 101, 212, 109, 205, 7, 9, 1, 238, 252, 248, 239, 9, 1, + 238, 252, 211, 152, 9, 1, 204, 95, 251, 164, 9, 1, 151, 197, 134, 9, 1, + 151, 3, 197, 119, 232, 214, 57, 9, 1, 151, 3, 197, 119, 232, 214, 60, 9, + 1, 130, 232, 213, 9, 1, 130, 232, 214, 251, 164, 9, 1, 130, 232, 214, + 197, 117, 9, 1, 118, 3, 232, 214, 57, 9, 1, 130, 232, 214, 196, 64, 9, 1, + 201, 70, 9, 1, 201, 68, 9, 1, 248, 249, 9, 1, 203, 42, 3, 210, 2, 9, 1, + 203, 42, 3, 115, 238, 251, 90, 237, 230, 9, 1, 213, 72, 9, 1, 203, 39, 9, + 1, 248, 237, 9, 1, 168, 3, 232, 214, 57, 9, 1, 168, 3, 99, 238, 251, 83, + 57, 9, 1, 215, 95, 9, 1, 237, 162, 9, 1, 168, 3, 115, 238, 251, 57, 9, 1, + 203, 72, 9, 1, 203, 70, 9, 1, 240, 36, 9, 1, 240, 108, 3, 210, 2, 9, 1, + 240, 108, 3, 76, 60, 9, 1, 240, 108, 3, 76, 248, 227, 26, 4, 203, 139, 9, + 1, 240, 114, 9, 1, 240, 38, 9, 1, 237, 191, 9, 1, 240, 108, 3, 115, 238, + 251, 90, 237, 230, 9, 1, 240, 108, 3, 235, 7, 238, 251, 57, 9, 1, 209, + 173, 9, 1, 210, 143, 3, 4, 199, 230, 9, 1, 210, 143, 3, 210, 2, 9, 1, + 210, 143, 3, 76, 60, 9, 1, 210, 143, 3, 4, 199, 231, 60, 9, 1, 210, 143, + 3, 76, 248, 227, 26, 76, 57, 9, 1, 210, 143, 3, 99, 238, 251, 57, 9, 1, + 225, 186, 9, 1, 210, 143, 3, 235, 7, 238, 251, 57, 9, 1, 208, 126, 3, 76, + 248, 227, 26, 76, 57, 9, 1, 208, 126, 3, 115, 238, 251, 60, 9, 1, 208, + 126, 3, 115, 238, 251, 248, 227, 26, 115, 238, 251, 57, 9, 1, 209, 9, 3, + 99, 238, 251, 60, 9, 1, 209, 9, 3, 115, 238, 251, 57, 9, 1, 203, 140, 3, + 115, 238, 251, 57, 9, 1, 251, 195, 3, 115, 238, 251, 57, 9, 1, 238, 252, + 235, 176, 9, 1, 235, 177, 3, 76, 218, 162, 60, 9, 1, 235, 177, 3, 76, 60, + 9, 1, 199, 111, 9, 1, 235, 177, 3, 115, 238, 251, 60, 9, 1, 213, 70, 9, + 1, 211, 153, 3, 76, 57, 9, 1, 211, 153, 3, 115, 238, 251, 57, 9, 1, 224, + 191, 9, 1, 204, 63, 225, 35, 9, 1, 225, 36, 3, 210, 2, 9, 1, 225, 36, 3, + 76, 57, 9, 1, 217, 73, 9, 1, 225, 36, 3, 115, 238, 251, 60, 9, 1, 234, + 110, 9, 1, 234, 111, 3, 210, 2, 9, 1, 216, 250, 9, 1, 234, 111, 3, 99, + 238, 251, 60, 9, 1, 233, 63, 9, 1, 234, 111, 3, 115, 238, 251, 57, 9, 1, + 222, 250, 3, 4, 199, 230, 9, 1, 222, 250, 3, 76, 57, 9, 1, 222, 250, 3, + 115, 238, 251, 57, 9, 1, 222, 250, 3, 115, 238, 251, 60, 9, 1, 216, 32, + 3, 76, 60, 9, 1, 216, 32, 233, 196, 9, 1, 209, 235, 9, 1, 216, 32, 3, + 210, 2, 9, 1, 216, 32, 3, 115, 238, 251, 57, 9, 1, 232, 114, 239, 24, 9, + 1, 203, 73, 3, 76, 57, 9, 1, 232, 114, 3, 93, 57, 9, 1, 232, 114, 233, + 141, 9, 1, 232, 114, 233, 142, 3, 232, 214, 57, 9, 1, 203, 42, 220, 36, + 233, 141, 9, 1, 197, 118, 3, 210, 2, 9, 1, 224, 67, 214, 164, 9, 1, 214, + 164, 9, 1, 66, 9, 1, 195, 217, 9, 1, 224, 67, 195, 217, 9, 1, 197, 118, + 3, 99, 238, 251, 57, 9, 1, 199, 118, 9, 1, 235, 204, 196, 64, 9, 1, 93, 3, 203, 135, 9, 1, 93, 3, 4, 199, 230, 9, 1, 197, 118, 3, 76, 57, 9, 1, - 69, 9, 1, 93, 3, 115, 238, 250, 60, 9, 1, 93, 249, 71, 9, 1, 93, 249, 72, - 3, 232, 213, 57, 9, 234, 216, 204, 226, 9, 1, 251, 244, 9, 4, 130, 33, - 209, 9, 3, 222, 249, 3, 151, 220, 68, 9, 4, 130, 33, 211, 152, 3, 222, - 249, 3, 151, 220, 68, 9, 4, 130, 87, 84, 20, 9, 4, 130, 222, 249, 251, - 163, 9, 4, 130, 225, 188, 9, 4, 130, 115, 238, 249, 9, 4, 130, 208, 125, - 9, 236, 221, 77, 250, 120, 9, 205, 3, 77, 209, 132, 237, 7, 232, 27, 9, - 4, 130, 209, 185, 195, 79, 9, 4, 130, 200, 31, 210, 161, 195, 79, 9, 4, - 130, 238, 251, 232, 137, 77, 224, 141, 9, 4, 130, 87, 70, 20, 9, 4, 126, - 208, 125, 9, 4, 130, 220, 108, 9, 4, 197, 117, 9, 4, 196, 64, 9, 4, 130, - 196, 64, 9, 4, 130, 216, 30, 9, 212, 148, 77, 208, 249, 9, 236, 231, 247, - 36, 126, 204, 226, 9, 236, 231, 247, 36, 130, 204, 226, 9, 209, 185, 130, - 204, 227, 3, 235, 134, 247, 35, 9, 4, 126, 219, 184, 9, 1, 240, 107, 3, - 226, 16, 199, 230, 9, 1, 210, 142, 3, 226, 16, 199, 230, 236, 78, 251, 8, - 17, 195, 79, 236, 78, 251, 8, 17, 100, 236, 78, 251, 8, 17, 102, 236, 78, - 251, 8, 17, 134, 236, 78, 251, 8, 17, 136, 236, 78, 251, 8, 17, 146, 236, - 78, 251, 8, 17, 167, 236, 78, 251, 8, 17, 178, 236, 78, 251, 8, 17, 171, - 236, 78, 251, 8, 17, 182, 9, 1, 206, 252, 3, 76, 60, 9, 1, 240, 130, 3, - 76, 60, 9, 1, 233, 225, 3, 76, 60, 9, 2, 206, 65, 251, 110, 9, 2, 206, - 65, 212, 69, 219, 163, 9, 1, 232, 113, 3, 226, 16, 199, 230, 203, 236, - 236, 221, 77, 213, 152, 203, 236, 204, 90, 234, 216, 204, 226, 203, 236, - 204, 145, 234, 216, 204, 226, 203, 236, 204, 90, 244, 167, 203, 236, 204, - 145, 244, 167, 203, 236, 231, 154, 244, 167, 203, 236, 244, 168, 206, 4, - 222, 183, 203, 236, 244, 168, 206, 4, 210, 22, 203, 236, 204, 90, 244, - 168, 206, 4, 222, 183, 203, 236, 204, 145, 244, 168, 206, 4, 210, 22, - 203, 236, 241, 122, 203, 236, 232, 170, 214, 183, 203, 236, 232, 170, - 219, 139, 203, 236, 232, 170, 250, 180, 203, 236, 252, 29, 78, 203, 236, - 1, 251, 168, 203, 236, 1, 204, 95, 251, 168, 203, 236, 1, 248, 204, 203, - 236, 1, 234, 99, 203, 236, 1, 234, 100, 234, 76, 203, 236, 1, 240, 103, - 203, 236, 1, 238, 251, 240, 104, 209, 251, 203, 236, 1, 232, 146, 203, - 236, 1, 197, 117, 203, 236, 1, 195, 106, 203, 236, 1, 232, 86, 203, 236, - 1, 202, 253, 203, 236, 1, 202, 254, 234, 76, 203, 236, 1, 195, 200, 203, - 236, 1, 195, 201, 232, 146, 203, 236, 1, 225, 4, 203, 236, 1, 222, 247, - 203, 236, 1, 219, 24, 203, 236, 1, 215, 137, 203, 236, 1, 207, 98, 203, - 236, 1, 48, 207, 98, 203, 236, 1, 69, 203, 236, 1, 213, 91, 203, 236, 1, - 210, 89, 213, 91, 203, 236, 1, 209, 5, 203, 236, 1, 211, 145, 203, 236, + 69, 9, 1, 93, 3, 115, 238, 251, 60, 9, 1, 93, 249, 72, 9, 1, 93, 249, 73, + 3, 232, 214, 57, 9, 234, 217, 204, 226, 9, 1, 251, 245, 9, 4, 130, 33, + 209, 9, 3, 222, 250, 3, 151, 220, 69, 9, 4, 130, 33, 211, 153, 3, 222, + 250, 3, 151, 220, 69, 9, 4, 130, 87, 84, 20, 9, 4, 130, 222, 250, 251, + 164, 9, 4, 130, 225, 189, 9, 4, 130, 115, 238, 250, 9, 4, 130, 208, 125, + 9, 236, 222, 77, 250, 121, 9, 205, 3, 77, 209, 132, 237, 8, 232, 28, 9, + 4, 130, 209, 185, 195, 79, 9, 4, 130, 200, 31, 210, 162, 195, 79, 9, 4, + 130, 238, 252, 232, 138, 77, 224, 142, 9, 4, 130, 87, 70, 20, 9, 4, 126, + 208, 125, 9, 4, 130, 220, 109, 9, 4, 197, 117, 9, 4, 196, 64, 9, 4, 130, + 196, 64, 9, 4, 130, 216, 31, 9, 212, 149, 77, 208, 249, 9, 236, 232, 247, + 37, 126, 204, 226, 9, 236, 232, 247, 37, 130, 204, 226, 9, 209, 185, 130, + 204, 227, 3, 235, 135, 247, 36, 9, 4, 126, 219, 185, 9, 1, 240, 108, 3, + 226, 17, 199, 230, 9, 1, 210, 143, 3, 226, 17, 199, 230, 236, 79, 251, 9, + 17, 195, 79, 236, 79, 251, 9, 17, 100, 236, 79, 251, 9, 17, 102, 236, 79, + 251, 9, 17, 134, 236, 79, 251, 9, 17, 136, 236, 79, 251, 9, 17, 146, 236, + 79, 251, 9, 17, 167, 236, 79, 251, 9, 17, 178, 236, 79, 251, 9, 17, 171, + 236, 79, 251, 9, 17, 182, 9, 1, 206, 252, 3, 76, 60, 9, 1, 240, 131, 3, + 76, 60, 9, 1, 233, 226, 3, 76, 60, 9, 2, 206, 65, 251, 111, 9, 2, 206, + 65, 212, 70, 219, 164, 9, 1, 232, 114, 3, 226, 17, 199, 230, 203, 236, + 236, 222, 77, 213, 153, 203, 236, 204, 90, 234, 217, 204, 226, 203, 236, + 204, 145, 234, 217, 204, 226, 203, 236, 204, 90, 244, 168, 203, 236, 204, + 145, 244, 168, 203, 236, 231, 155, 244, 168, 203, 236, 244, 169, 206, 4, + 222, 184, 203, 236, 244, 169, 206, 4, 210, 22, 203, 236, 204, 90, 244, + 169, 206, 4, 222, 184, 203, 236, 204, 145, 244, 169, 206, 4, 210, 22, + 203, 236, 241, 123, 203, 236, 232, 171, 214, 184, 203, 236, 232, 171, + 219, 140, 203, 236, 232, 171, 250, 181, 203, 236, 252, 30, 78, 203, 236, + 1, 251, 169, 203, 236, 1, 204, 95, 251, 169, 203, 236, 1, 248, 205, 203, + 236, 1, 234, 100, 203, 236, 1, 234, 101, 234, 77, 203, 236, 1, 240, 104, + 203, 236, 1, 238, 252, 240, 105, 209, 251, 203, 236, 1, 232, 147, 203, + 236, 1, 197, 117, 203, 236, 1, 195, 106, 203, 236, 1, 232, 87, 203, 236, + 1, 202, 253, 203, 236, 1, 202, 254, 234, 77, 203, 236, 1, 195, 200, 203, + 236, 1, 195, 201, 232, 147, 203, 236, 1, 225, 5, 203, 236, 1, 222, 248, + 203, 236, 1, 219, 25, 203, 236, 1, 215, 138, 203, 236, 1, 207, 98, 203, + 236, 1, 48, 207, 98, 203, 236, 1, 69, 203, 236, 1, 213, 92, 203, 236, 1, + 210, 89, 213, 92, 203, 236, 1, 209, 5, 203, 236, 1, 211, 146, 203, 236, 1, 209, 251, 203, 236, 1, 206, 211, 203, 236, 1, 203, 82, 203, 236, 1, - 213, 29, 248, 189, 203, 236, 1, 213, 29, 233, 222, 203, 236, 1, 213, 29, - 239, 170, 203, 236, 211, 227, 57, 203, 236, 211, 227, 60, 203, 236, 211, - 227, 237, 248, 203, 236, 195, 4, 57, 203, 236, 195, 4, 60, 203, 236, 195, - 4, 237, 248, 203, 236, 210, 185, 57, 203, 236, 210, 185, 60, 203, 236, - 237, 249, 195, 12, 231, 153, 203, 236, 237, 249, 195, 12, 251, 82, 203, - 236, 232, 151, 57, 203, 236, 232, 151, 60, 203, 236, 232, 150, 237, 248, - 203, 236, 236, 144, 57, 203, 236, 236, 144, 60, 203, 236, 209, 96, 203, - 236, 235, 169, 238, 252, 203, 236, 211, 55, 203, 236, 209, 126, 203, 236, - 99, 83, 238, 250, 57, 203, 236, 99, 83, 238, 250, 60, 203, 236, 115, 238, - 250, 57, 203, 236, 115, 238, 250, 60, 203, 236, 214, 181, 222, 75, 57, - 203, 236, 214, 181, 222, 75, 60, 203, 236, 218, 87, 203, 236, 249, 70, - 203, 236, 1, 205, 182, 195, 72, 203, 236, 1, 205, 182, 224, 134, 203, - 236, 1, 205, 182, 235, 188, 9, 1, 248, 239, 3, 115, 238, 250, 231, 103, - 60, 9, 1, 248, 239, 3, 76, 248, 226, 26, 115, 238, 250, 57, 9, 1, 248, - 239, 3, 115, 238, 250, 212, 106, 200, 24, 60, 9, 1, 248, 239, 3, 115, - 238, 250, 212, 106, 200, 24, 248, 226, 26, 99, 238, 250, 57, 9, 1, 248, - 239, 3, 99, 238, 250, 248, 226, 26, 76, 57, 9, 1, 248, 239, 3, 226, 16, - 4, 199, 231, 60, 9, 1, 248, 239, 3, 4, 199, 230, 9, 1, 168, 3, 99, 238, - 250, 57, 9, 1, 168, 3, 115, 238, 250, 212, 106, 200, 24, 60, 9, 1, 240, - 107, 3, 99, 238, 250, 199, 50, 248, 226, 26, 4, 203, 139, 9, 1, 240, 107, - 3, 226, 16, 4, 199, 231, 60, 9, 1, 210, 142, 3, 106, 9, 1, 208, 126, 3, - 235, 6, 238, 250, 57, 9, 1, 251, 194, 3, 99, 238, 250, 57, 9, 1, 251, - 194, 3, 115, 238, 250, 212, 106, 237, 230, 57, 9, 1, 251, 194, 3, 99, - 238, 250, 199, 50, 57, 9, 1, 235, 176, 3, 99, 238, 250, 60, 9, 1, 235, - 176, 3, 115, 238, 250, 212, 106, 200, 24, 60, 9, 1, 224, 191, 3, 76, 57, - 9, 1, 224, 191, 3, 115, 238, 250, 57, 9, 1, 224, 191, 3, 115, 238, 250, - 212, 106, 200, 24, 60, 9, 1, 87, 3, 76, 57, 9, 1, 87, 3, 76, 60, 9, 1, - 216, 31, 3, 99, 238, 250, 60, 9, 1, 216, 31, 3, 4, 203, 139, 9, 1, 216, - 31, 3, 4, 199, 230, 9, 1, 222, 249, 3, 154, 9, 1, 210, 142, 3, 99, 238, - 250, 199, 50, 57, 9, 1, 210, 142, 3, 232, 213, 57, 9, 1, 208, 126, 3, 99, - 238, 250, 199, 50, 57, 9, 1, 168, 3, 4, 9, 1, 203, 140, 60, 9, 1, 168, 3, - 4, 9, 1, 203, 140, 26, 99, 238, 249, 9, 1, 208, 126, 3, 4, 9, 1, 203, - 140, 26, 99, 238, 249, 9, 1, 210, 142, 3, 4, 9, 1, 203, 140, 26, 99, 238, - 249, 9, 1, 168, 3, 4, 9, 1, 203, 140, 57, 9, 1, 151, 3, 236, 78, 251, 8, - 17, 99, 57, 9, 1, 151, 3, 236, 78, 251, 8, 17, 115, 57, 9, 1, 235, 203, - 93, 3, 236, 78, 251, 8, 17, 99, 57, 9, 1, 235, 203, 93, 3, 236, 78, 251, - 8, 17, 115, 57, 9, 1, 235, 203, 93, 3, 236, 78, 251, 8, 17, 235, 6, 60, - 9, 1, 197, 118, 3, 236, 78, 251, 8, 17, 99, 57, 9, 1, 197, 118, 3, 236, - 78, 251, 8, 17, 115, 57, 9, 1, 93, 249, 72, 3, 236, 78, 251, 8, 17, 99, - 57, 9, 1, 93, 249, 72, 3, 236, 78, 251, 8, 17, 115, 57, 9, 1, 168, 3, - 236, 78, 251, 8, 17, 235, 6, 60, 9, 1, 208, 126, 3, 236, 78, 251, 8, 17, - 235, 6, 57, 9, 1, 208, 126, 3, 226, 16, 199, 230, 9, 1, 225, 35, 3, 99, - 238, 250, 57, 202, 230, 1, 232, 245, 202, 230, 1, 207, 5, 202, 230, 1, - 216, 29, 202, 230, 1, 210, 243, 202, 230, 1, 249, 142, 202, 230, 1, 222, - 118, 202, 230, 1, 225, 49, 202, 230, 1, 251, 150, 202, 230, 1, 199, 150, - 202, 230, 1, 219, 183, 202, 230, 1, 235, 236, 202, 230, 1, 239, 173, 202, - 230, 1, 202, 232, 202, 230, 1, 223, 78, 202, 230, 1, 234, 118, 202, 230, - 1, 233, 146, 202, 230, 1, 208, 124, 202, 230, 1, 240, 56, 202, 230, 1, + 213, 30, 248, 190, 203, 236, 1, 213, 30, 233, 223, 203, 236, 1, 213, 30, + 239, 171, 203, 236, 211, 228, 57, 203, 236, 211, 228, 60, 203, 236, 211, + 228, 237, 249, 203, 236, 195, 4, 57, 203, 236, 195, 4, 60, 203, 236, 195, + 4, 237, 249, 203, 236, 210, 186, 57, 203, 236, 210, 186, 60, 203, 236, + 237, 250, 195, 12, 231, 154, 203, 236, 237, 250, 195, 12, 251, 83, 203, + 236, 232, 152, 57, 203, 236, 232, 152, 60, 203, 236, 232, 151, 237, 249, + 203, 236, 236, 145, 57, 203, 236, 236, 145, 60, 203, 236, 209, 96, 203, + 236, 235, 170, 238, 253, 203, 236, 211, 56, 203, 236, 209, 126, 203, 236, + 99, 83, 238, 251, 57, 203, 236, 99, 83, 238, 251, 60, 203, 236, 115, 238, + 251, 57, 203, 236, 115, 238, 251, 60, 203, 236, 214, 182, 222, 76, 57, + 203, 236, 214, 182, 222, 76, 60, 203, 236, 218, 88, 203, 236, 249, 71, + 203, 236, 1, 205, 182, 195, 72, 203, 236, 1, 205, 182, 224, 135, 203, + 236, 1, 205, 182, 235, 189, 9, 1, 248, 240, 3, 115, 238, 251, 231, 104, + 60, 9, 1, 248, 240, 3, 76, 248, 227, 26, 115, 238, 251, 57, 9, 1, 248, + 240, 3, 115, 238, 251, 212, 107, 200, 24, 60, 9, 1, 248, 240, 3, 115, + 238, 251, 212, 107, 200, 24, 248, 227, 26, 99, 238, 251, 57, 9, 1, 248, + 240, 3, 99, 238, 251, 248, 227, 26, 76, 57, 9, 1, 248, 240, 3, 226, 17, + 4, 199, 231, 60, 9, 1, 248, 240, 3, 4, 199, 230, 9, 1, 168, 3, 99, 238, + 251, 57, 9, 1, 168, 3, 115, 238, 251, 212, 107, 200, 24, 60, 9, 1, 240, + 108, 3, 99, 238, 251, 199, 50, 248, 227, 26, 4, 203, 139, 9, 1, 240, 108, + 3, 226, 17, 4, 199, 231, 60, 9, 1, 210, 143, 3, 106, 9, 1, 208, 126, 3, + 235, 7, 238, 251, 57, 9, 1, 251, 195, 3, 99, 238, 251, 57, 9, 1, 251, + 195, 3, 115, 238, 251, 212, 107, 237, 231, 57, 9, 1, 251, 195, 3, 99, + 238, 251, 199, 50, 57, 9, 1, 235, 177, 3, 99, 238, 251, 60, 9, 1, 235, + 177, 3, 115, 238, 251, 212, 107, 200, 24, 60, 9, 1, 224, 192, 3, 76, 57, + 9, 1, 224, 192, 3, 115, 238, 251, 57, 9, 1, 224, 192, 3, 115, 238, 251, + 212, 107, 200, 24, 60, 9, 1, 87, 3, 76, 57, 9, 1, 87, 3, 76, 60, 9, 1, + 216, 32, 3, 99, 238, 251, 60, 9, 1, 216, 32, 3, 4, 203, 139, 9, 1, 216, + 32, 3, 4, 199, 230, 9, 1, 222, 250, 3, 154, 9, 1, 210, 143, 3, 99, 238, + 251, 199, 50, 57, 9, 1, 210, 143, 3, 232, 214, 57, 9, 1, 208, 126, 3, 99, + 238, 251, 199, 50, 57, 9, 1, 168, 3, 4, 9, 1, 203, 140, 60, 9, 1, 168, 3, + 4, 9, 1, 203, 140, 26, 99, 238, 250, 9, 1, 208, 126, 3, 4, 9, 1, 203, + 140, 26, 99, 238, 250, 9, 1, 210, 143, 3, 4, 9, 1, 203, 140, 26, 99, 238, + 250, 9, 1, 168, 3, 4, 9, 1, 203, 140, 57, 9, 1, 151, 3, 236, 79, 251, 9, + 17, 99, 57, 9, 1, 151, 3, 236, 79, 251, 9, 17, 115, 57, 9, 1, 235, 204, + 93, 3, 236, 79, 251, 9, 17, 99, 57, 9, 1, 235, 204, 93, 3, 236, 79, 251, + 9, 17, 115, 57, 9, 1, 235, 204, 93, 3, 236, 79, 251, 9, 17, 235, 7, 60, + 9, 1, 197, 118, 3, 236, 79, 251, 9, 17, 99, 57, 9, 1, 197, 118, 3, 236, + 79, 251, 9, 17, 115, 57, 9, 1, 93, 249, 73, 3, 236, 79, 251, 9, 17, 99, + 57, 9, 1, 93, 249, 73, 3, 236, 79, 251, 9, 17, 115, 57, 9, 1, 168, 3, + 236, 79, 251, 9, 17, 235, 7, 60, 9, 1, 208, 126, 3, 236, 79, 251, 9, 17, + 235, 7, 57, 9, 1, 208, 126, 3, 226, 17, 199, 230, 9, 1, 225, 36, 3, 99, + 238, 251, 57, 202, 230, 1, 232, 246, 202, 230, 1, 207, 5, 202, 230, 1, + 216, 30, 202, 230, 1, 210, 244, 202, 230, 1, 249, 143, 202, 230, 1, 222, + 119, 202, 230, 1, 225, 50, 202, 230, 1, 251, 151, 202, 230, 1, 199, 150, + 202, 230, 1, 219, 184, 202, 230, 1, 235, 237, 202, 230, 1, 239, 174, 202, + 230, 1, 202, 232, 202, 230, 1, 223, 79, 202, 230, 1, 234, 119, 202, 230, + 1, 233, 147, 202, 230, 1, 208, 124, 202, 230, 1, 240, 57, 202, 230, 1, 195, 95, 202, 230, 1, 203, 84, 202, 230, 1, 196, 129, 202, 230, 1, 213, - 105, 202, 230, 1, 225, 197, 202, 230, 1, 245, 105, 202, 230, 1, 201, 77, - 202, 230, 1, 232, 78, 202, 230, 1, 224, 144, 202, 230, 1, 202, 231, 202, + 106, 202, 230, 1, 225, 198, 202, 230, 1, 245, 106, 202, 230, 1, 201, 77, + 202, 230, 1, 232, 79, 202, 230, 1, 224, 145, 202, 230, 1, 202, 231, 202, 230, 1, 195, 113, 202, 230, 1, 206, 250, 202, 230, 1, 209, 12, 202, 230, - 1, 240, 133, 202, 230, 1, 149, 202, 230, 1, 195, 11, 202, 230, 1, 251, - 190, 202, 230, 1, 233, 223, 202, 230, 1, 211, 155, 202, 230, 1, 197, 159, - 202, 230, 252, 31, 202, 230, 252, 132, 202, 230, 230, 203, 202, 230, 237, - 52, 202, 230, 200, 107, 202, 230, 214, 100, 202, 230, 237, 62, 202, 230, - 236, 68, 202, 230, 214, 180, 202, 230, 214, 188, 202, 230, 204, 119, 202, - 230, 1, 217, 243, 216, 113, 17, 195, 79, 216, 113, 17, 100, 216, 113, 17, - 102, 216, 113, 17, 134, 216, 113, 17, 136, 216, 113, 17, 146, 216, 113, - 17, 167, 216, 113, 17, 178, 216, 113, 17, 171, 216, 113, 17, 182, 216, - 113, 1, 63, 216, 113, 1, 237, 53, 216, 113, 1, 68, 216, 113, 1, 69, 216, - 113, 1, 66, 216, 113, 1, 214, 101, 216, 113, 1, 72, 216, 113, 1, 240, - 121, 216, 113, 1, 218, 54, 216, 113, 1, 249, 144, 216, 113, 1, 161, 216, - 113, 1, 189, 216, 113, 1, 225, 213, 216, 113, 1, 247, 15, 216, 113, 1, - 240, 135, 216, 113, 1, 169, 216, 113, 1, 209, 181, 216, 113, 1, 183, 216, - 113, 1, 234, 64, 216, 113, 1, 235, 238, 216, 113, 1, 155, 216, 113, 1, - 172, 216, 113, 1, 218, 0, 197, 23, 216, 113, 1, 166, 216, 113, 1, 215, - 108, 216, 113, 1, 176, 216, 113, 1, 142, 216, 113, 1, 197, 166, 216, 113, - 1, 164, 216, 113, 1, 215, 109, 197, 23, 216, 113, 1, 225, 120, 225, 213, - 216, 113, 1, 225, 120, 247, 15, 216, 113, 1, 225, 120, 169, 216, 113, 38, - 206, 182, 130, 202, 11, 216, 113, 38, 206, 182, 126, 202, 11, 216, 113, - 38, 206, 182, 209, 250, 202, 11, 216, 113, 38, 181, 239, 193, 202, 11, - 216, 113, 38, 181, 130, 202, 11, 216, 113, 38, 181, 126, 202, 11, 216, - 113, 38, 181, 209, 250, 202, 11, 216, 113, 38, 217, 207, 78, 216, 113, - 38, 52, 76, 57, 216, 113, 130, 152, 251, 29, 216, 113, 126, 152, 251, 29, - 216, 113, 16, 214, 102, 239, 207, 216, 113, 16, 234, 63, 216, 113, 244, - 158, 216, 113, 236, 89, 78, 216, 113, 223, 51, 216, 113, 240, 82, 216, - 113, 238, 254, 55, 216, 113, 203, 116, 55, 208, 228, 1, 251, 170, 208, - 228, 1, 248, 144, 208, 228, 1, 234, 98, 208, 228, 1, 240, 105, 208, 228, - 1, 225, 224, 208, 228, 1, 249, 142, 208, 228, 1, 195, 82, 208, 228, 1, - 225, 233, 208, 228, 1, 202, 57, 208, 228, 1, 195, 181, 208, 228, 1, 225, - 50, 208, 228, 1, 223, 74, 208, 228, 1, 219, 24, 208, 228, 1, 215, 137, - 208, 228, 1, 206, 63, 208, 228, 1, 226, 85, 208, 228, 1, 235, 152, 208, - 228, 1, 201, 111, 208, 228, 1, 211, 75, 208, 228, 1, 209, 251, 208, 228, - 1, 207, 24, 208, 228, 1, 203, 161, 208, 228, 117, 226, 85, 208, 228, 117, - 226, 84, 208, 228, 117, 214, 175, 208, 228, 117, 240, 119, 208, 228, 73, - 1, 236, 178, 195, 181, 208, 228, 117, 236, 178, 195, 181, 208, 228, 18, - 2, 181, 69, 208, 228, 18, 2, 69, 208, 228, 18, 2, 214, 17, 252, 167, 208, - 228, 18, 2, 181, 252, 167, 208, 228, 18, 2, 252, 167, 208, 228, 18, 2, - 214, 17, 63, 208, 228, 18, 2, 181, 63, 208, 228, 18, 2, 63, 208, 228, 73, + 1, 240, 134, 202, 230, 1, 149, 202, 230, 1, 195, 11, 202, 230, 1, 251, + 191, 202, 230, 1, 233, 224, 202, 230, 1, 211, 156, 202, 230, 1, 197, 159, + 202, 230, 252, 32, 202, 230, 252, 133, 202, 230, 230, 204, 202, 230, 237, + 53, 202, 230, 200, 107, 202, 230, 214, 101, 202, 230, 237, 63, 202, 230, + 236, 69, 202, 230, 214, 181, 202, 230, 214, 189, 202, 230, 204, 119, 202, + 230, 1, 217, 244, 216, 114, 17, 195, 79, 216, 114, 17, 100, 216, 114, 17, + 102, 216, 114, 17, 134, 216, 114, 17, 136, 216, 114, 17, 146, 216, 114, + 17, 167, 216, 114, 17, 178, 216, 114, 17, 171, 216, 114, 17, 182, 216, + 114, 1, 63, 216, 114, 1, 237, 54, 216, 114, 1, 68, 216, 114, 1, 69, 216, + 114, 1, 66, 216, 114, 1, 214, 102, 216, 114, 1, 72, 216, 114, 1, 240, + 122, 216, 114, 1, 218, 55, 216, 114, 1, 249, 145, 216, 114, 1, 161, 216, + 114, 1, 189, 216, 114, 1, 225, 214, 216, 114, 1, 247, 16, 216, 114, 1, + 240, 136, 216, 114, 1, 169, 216, 114, 1, 209, 181, 216, 114, 1, 183, 216, + 114, 1, 234, 65, 216, 114, 1, 235, 239, 216, 114, 1, 155, 216, 114, 1, + 172, 216, 114, 1, 218, 1, 197, 23, 216, 114, 1, 166, 216, 114, 1, 215, + 109, 216, 114, 1, 176, 216, 114, 1, 142, 216, 114, 1, 197, 166, 216, 114, + 1, 164, 216, 114, 1, 215, 110, 197, 23, 216, 114, 1, 225, 121, 225, 214, + 216, 114, 1, 225, 121, 247, 16, 216, 114, 1, 225, 121, 169, 216, 114, 38, + 206, 182, 130, 202, 11, 216, 114, 38, 206, 182, 126, 202, 11, 216, 114, + 38, 206, 182, 209, 250, 202, 11, 216, 114, 38, 181, 239, 194, 202, 11, + 216, 114, 38, 181, 130, 202, 11, 216, 114, 38, 181, 126, 202, 11, 216, + 114, 38, 181, 209, 250, 202, 11, 216, 114, 38, 217, 208, 78, 216, 114, + 38, 52, 76, 57, 216, 114, 130, 152, 251, 30, 216, 114, 126, 152, 251, 30, + 216, 114, 16, 214, 103, 239, 208, 216, 114, 16, 234, 64, 216, 114, 244, + 159, 216, 114, 236, 90, 78, 216, 114, 223, 52, 216, 114, 240, 83, 216, + 114, 238, 255, 55, 216, 114, 203, 116, 55, 208, 228, 1, 251, 171, 208, + 228, 1, 248, 145, 208, 228, 1, 234, 99, 208, 228, 1, 240, 106, 208, 228, + 1, 225, 225, 208, 228, 1, 249, 143, 208, 228, 1, 195, 82, 208, 228, 1, + 225, 234, 208, 228, 1, 202, 57, 208, 228, 1, 195, 181, 208, 228, 1, 225, + 51, 208, 228, 1, 223, 75, 208, 228, 1, 219, 25, 208, 228, 1, 215, 138, + 208, 228, 1, 206, 63, 208, 228, 1, 226, 86, 208, 228, 1, 235, 153, 208, + 228, 1, 201, 111, 208, 228, 1, 211, 76, 208, 228, 1, 209, 251, 208, 228, + 1, 207, 24, 208, 228, 1, 203, 161, 208, 228, 117, 226, 86, 208, 228, 117, + 226, 85, 208, 228, 117, 214, 176, 208, 228, 117, 240, 120, 208, 228, 73, + 1, 236, 179, 195, 181, 208, 228, 117, 236, 179, 195, 181, 208, 228, 18, + 2, 181, 69, 208, 228, 18, 2, 69, 208, 228, 18, 2, 214, 18, 252, 168, 208, + 228, 18, 2, 181, 252, 168, 208, 228, 18, 2, 252, 168, 208, 228, 18, 2, + 214, 18, 63, 208, 228, 18, 2, 181, 63, 208, 228, 18, 2, 63, 208, 228, 73, 1, 206, 182, 63, 208, 228, 18, 2, 206, 182, 63, 208, 228, 18, 2, 181, 66, 208, 228, 18, 2, 66, 208, 228, 73, 1, 68, 208, 228, 18, 2, 181, 68, 208, 228, 18, 2, 68, 208, 228, 18, 2, 72, 208, 228, 18, 2, 204, 119, 208, 228, - 117, 217, 92, 208, 228, 211, 213, 217, 92, 208, 228, 211, 213, 251, 218, - 208, 228, 211, 213, 251, 95, 208, 228, 211, 213, 249, 48, 208, 228, 211, - 213, 250, 159, 208, 228, 211, 213, 206, 199, 208, 228, 252, 29, 78, 208, - 228, 211, 213, 219, 173, 211, 111, 208, 228, 211, 213, 195, 19, 208, 228, - 211, 213, 211, 111, 208, 228, 211, 213, 195, 112, 208, 228, 211, 213, - 201, 0, 208, 228, 211, 213, 250, 235, 208, 228, 211, 213, 205, 187, 220, - 9, 208, 228, 211, 213, 251, 76, 220, 57, 1, 232, 219, 220, 57, 1, 252, - 116, 220, 57, 1, 251, 216, 220, 57, 1, 252, 5, 220, 57, 1, 251, 208, 220, - 57, 1, 199, 251, 220, 57, 1, 250, 113, 220, 57, 1, 225, 233, 220, 57, 1, - 250, 156, 220, 57, 1, 251, 175, 220, 57, 1, 251, 180, 220, 57, 1, 251, - 172, 220, 57, 1, 251, 122, 220, 57, 1, 251, 105, 220, 57, 1, 250, 201, - 220, 57, 1, 226, 85, 220, 57, 1, 251, 45, 220, 57, 1, 250, 169, 220, 57, - 1, 251, 17, 220, 57, 1, 251, 13, 220, 57, 1, 250, 194, 220, 57, 1, 250, - 167, 220, 57, 1, 237, 174, 220, 57, 1, 225, 42, 220, 57, 1, 251, 193, - 220, 57, 251, 222, 78, 220, 57, 198, 246, 78, 220, 57, 234, 35, 78, 220, - 57, 211, 212, 203, 236, 1, 131, 217, 70, 203, 236, 1, 131, 225, 213, 203, - 236, 1, 131, 215, 108, 203, 236, 1, 131, 201, 78, 203, 236, 1, 131, 216, - 85, 203, 236, 1, 131, 216, 67, 203, 236, 1, 131, 248, 196, 203, 236, 1, - 131, 169, 203, 236, 1, 131, 222, 36, 203, 236, 1, 131, 222, 25, 203, 236, - 1, 131, 205, 80, 9, 1, 248, 239, 3, 4, 199, 231, 60, 9, 1, 248, 239, 3, - 232, 213, 57, 9, 1, 225, 189, 3, 99, 238, 250, 57, 9, 1, 203, 140, 3, 99, - 238, 250, 57, 9, 1, 235, 176, 3, 76, 248, 226, 26, 115, 238, 250, 57, 9, - 1, 211, 152, 3, 76, 60, 9, 1, 222, 249, 3, 52, 154, 9, 1, 87, 3, 115, - 238, 250, 57, 9, 1, 93, 3, 99, 238, 250, 248, 226, 26, 232, 213, 57, 9, - 1, 93, 3, 99, 238, 250, 248, 226, 26, 76, 57, 9, 1, 210, 142, 3, 221, - 224, 9, 1, 197, 118, 3, 76, 197, 38, 9, 1, 209, 214, 196, 64, 9, 1, 126, - 251, 163, 9, 1, 240, 107, 3, 115, 238, 250, 60, 9, 1, 209, 9, 3, 115, - 238, 250, 60, 9, 1, 234, 110, 3, 226, 16, 106, 9, 1, 204, 218, 197, 117, - 9, 1, 195, 107, 3, 226, 16, 199, 231, 57, 9, 1, 251, 194, 3, 115, 238, - 250, 60, 9, 1, 225, 35, 3, 76, 60, 9, 1, 248, 239, 3, 4, 87, 57, 9, 1, - 213, 72, 3, 4, 87, 57, 9, 1, 203, 42, 3, 4, 203, 42, 57, 9, 1, 210, 142, - 3, 4, 216, 31, 57, 9, 1, 93, 3, 99, 238, 250, 248, 226, 26, 4, 216, 31, - 57, 9, 1, 251, 219, 235, 175, 9, 1, 251, 219, 211, 151, 9, 1, 251, 219, - 216, 30, 9, 4, 126, 197, 117, 9, 4, 130, 197, 9, 251, 10, 9, 4, 130, 209, - 8, 9, 4, 130, 251, 193, 9, 4, 130, 211, 151, 9, 4, 130, 216, 31, 3, 224, - 237, 9, 4, 126, 216, 31, 3, 224, 237, 9, 4, 130, 197, 9, 250, 166, 9, 4, - 130, 197, 9, 250, 200, 9, 4, 130, 197, 9, 251, 104, 9, 4, 130, 197, 9, - 208, 243, 9, 4, 130, 197, 9, 211, 115, 9, 4, 130, 197, 9, 197, 140, 9, 4, - 130, 235, 34, 220, 23, 9, 4, 130, 2, 209, 3, 9, 239, 70, 236, 221, 77, - 250, 120, 9, 163, 240, 95, 60, 9, 241, 17, 235, 199, 9, 241, 17, 240, 94, - 9, 241, 17, 224, 237, 9, 241, 17, 235, 197, 9, 241, 17, 240, 92, 9, 241, - 17, 224, 235, 9, 152, 97, 76, 57, 9, 152, 99, 238, 250, 57, 9, 152, 221, - 225, 57, 9, 152, 97, 76, 60, 9, 152, 99, 238, 250, 60, 9, 152, 221, 225, - 60, 9, 192, 235, 197, 9, 192, 240, 92, 9, 192, 224, 235, 9, 4, 130, 197, - 117, 9, 235, 200, 3, 210, 2, 9, 235, 200, 3, 76, 57, 9, 224, 238, 3, 76, - 60, 9, 50, 250, 217, 57, 9, 53, 250, 217, 57, 9, 50, 250, 217, 60, 9, 53, - 250, 217, 60, 9, 52, 53, 250, 217, 57, 9, 52, 53, 250, 217, 90, 3, 238, - 252, 9, 53, 250, 217, 90, 3, 238, 252, 9, 240, 95, 3, 238, 252, 9, 117, - 206, 96, 216, 31, 233, 195, 101, 2, 226, 16, 247, 132, 101, 2, 247, 132, - 101, 2, 251, 50, 101, 2, 199, 2, 101, 1, 206, 182, 63, 101, 1, 63, 101, - 1, 252, 167, 101, 1, 68, 101, 1, 226, 119, 101, 1, 66, 101, 1, 199, 245, - 101, 1, 110, 144, 101, 1, 110, 159, 101, 1, 247, 135, 69, 101, 1, 206, - 182, 69, 101, 1, 69, 101, 1, 251, 199, 101, 1, 247, 135, 72, 101, 1, 206, - 182, 72, 101, 1, 72, 101, 1, 250, 149, 101, 1, 155, 101, 1, 224, 145, - 101, 1, 234, 122, 101, 1, 233, 229, 101, 1, 217, 70, 101, 1, 247, 173, - 101, 1, 247, 15, 101, 1, 225, 213, 101, 1, 225, 179, 101, 1, 215, 108, - 101, 1, 201, 78, 101, 1, 201, 66, 101, 1, 240, 40, 101, 1, 240, 24, 101, - 1, 216, 85, 101, 1, 189, 101, 1, 202, 233, 101, 1, 240, 135, 101, 1, 239, - 175, 101, 1, 176, 101, 1, 216, 67, 101, 1, 161, 101, 1, 213, 5, 101, 1, - 249, 144, 101, 1, 248, 196, 101, 1, 166, 101, 1, 164, 101, 1, 169, 101, - 1, 209, 181, 101, 1, 172, 101, 1, 222, 36, 101, 1, 222, 25, 101, 1, 199, + 117, 217, 93, 208, 228, 211, 214, 217, 93, 208, 228, 211, 214, 251, 219, + 208, 228, 211, 214, 251, 96, 208, 228, 211, 214, 249, 49, 208, 228, 211, + 214, 250, 160, 208, 228, 211, 214, 206, 199, 208, 228, 252, 30, 78, 208, + 228, 211, 214, 219, 174, 211, 112, 208, 228, 211, 214, 195, 19, 208, 228, + 211, 214, 211, 112, 208, 228, 211, 214, 195, 112, 208, 228, 211, 214, + 201, 0, 208, 228, 211, 214, 250, 236, 208, 228, 211, 214, 205, 187, 220, + 10, 208, 228, 211, 214, 251, 77, 220, 58, 1, 232, 220, 220, 58, 1, 252, + 117, 220, 58, 1, 251, 217, 220, 58, 1, 252, 6, 220, 58, 1, 251, 209, 220, + 58, 1, 199, 251, 220, 58, 1, 250, 114, 220, 58, 1, 225, 234, 220, 58, 1, + 250, 157, 220, 58, 1, 251, 176, 220, 58, 1, 251, 181, 220, 58, 1, 251, + 173, 220, 58, 1, 251, 123, 220, 58, 1, 251, 106, 220, 58, 1, 250, 202, + 220, 58, 1, 226, 86, 220, 58, 1, 251, 46, 220, 58, 1, 250, 170, 220, 58, + 1, 251, 18, 220, 58, 1, 251, 14, 220, 58, 1, 250, 195, 220, 58, 1, 250, + 168, 220, 58, 1, 237, 175, 220, 58, 1, 225, 43, 220, 58, 1, 251, 194, + 220, 58, 251, 223, 78, 220, 58, 198, 246, 78, 220, 58, 234, 36, 78, 220, + 58, 211, 213, 203, 236, 1, 131, 217, 71, 203, 236, 1, 131, 225, 214, 203, + 236, 1, 131, 215, 109, 203, 236, 1, 131, 201, 78, 203, 236, 1, 131, 216, + 86, 203, 236, 1, 131, 216, 68, 203, 236, 1, 131, 248, 197, 203, 236, 1, + 131, 169, 203, 236, 1, 131, 222, 37, 203, 236, 1, 131, 222, 26, 203, 236, + 1, 131, 205, 80, 9, 1, 248, 240, 3, 4, 199, 231, 60, 9, 1, 248, 240, 3, + 232, 214, 57, 9, 1, 225, 190, 3, 99, 238, 251, 57, 9, 1, 203, 140, 3, 99, + 238, 251, 57, 9, 1, 235, 177, 3, 76, 248, 227, 26, 115, 238, 251, 57, 9, + 1, 211, 153, 3, 76, 60, 9, 1, 222, 250, 3, 52, 154, 9, 1, 87, 3, 115, + 238, 251, 57, 9, 1, 93, 3, 99, 238, 251, 248, 227, 26, 232, 214, 57, 9, + 1, 93, 3, 99, 238, 251, 248, 227, 26, 76, 57, 9, 1, 210, 143, 3, 221, + 225, 9, 1, 197, 118, 3, 76, 197, 38, 9, 1, 209, 214, 196, 64, 9, 1, 126, + 251, 164, 9, 1, 240, 108, 3, 115, 238, 251, 60, 9, 1, 209, 9, 3, 115, + 238, 251, 60, 9, 1, 234, 111, 3, 226, 17, 106, 9, 1, 204, 218, 197, 117, + 9, 1, 195, 107, 3, 226, 17, 199, 231, 57, 9, 1, 251, 195, 3, 115, 238, + 251, 60, 9, 1, 225, 36, 3, 76, 60, 9, 1, 248, 240, 3, 4, 87, 57, 9, 1, + 213, 73, 3, 4, 87, 57, 9, 1, 203, 42, 3, 4, 203, 42, 57, 9, 1, 210, 143, + 3, 4, 216, 32, 57, 9, 1, 93, 3, 99, 238, 251, 248, 227, 26, 4, 216, 32, + 57, 9, 1, 251, 220, 235, 176, 9, 1, 251, 220, 211, 152, 9, 1, 251, 220, + 216, 31, 9, 4, 126, 197, 117, 9, 4, 130, 197, 9, 251, 11, 9, 4, 130, 209, + 8, 9, 4, 130, 251, 194, 9, 4, 130, 211, 152, 9, 4, 130, 216, 32, 3, 224, + 238, 9, 4, 126, 216, 32, 3, 224, 238, 9, 4, 130, 197, 9, 250, 167, 9, 4, + 130, 197, 9, 250, 201, 9, 4, 130, 197, 9, 251, 105, 9, 4, 130, 197, 9, + 208, 243, 9, 4, 130, 197, 9, 211, 116, 9, 4, 130, 197, 9, 197, 140, 9, 4, + 130, 235, 35, 220, 24, 9, 4, 130, 2, 209, 3, 9, 239, 71, 236, 222, 77, + 250, 121, 9, 163, 240, 96, 60, 9, 241, 18, 235, 200, 9, 241, 18, 240, 95, + 9, 241, 18, 224, 238, 9, 241, 18, 235, 198, 9, 241, 18, 240, 93, 9, 241, + 18, 224, 236, 9, 152, 97, 76, 57, 9, 152, 99, 238, 251, 57, 9, 152, 221, + 226, 57, 9, 152, 97, 76, 60, 9, 152, 99, 238, 251, 60, 9, 152, 221, 226, + 60, 9, 192, 235, 198, 9, 192, 240, 93, 9, 192, 224, 236, 9, 4, 130, 197, + 117, 9, 235, 201, 3, 210, 2, 9, 235, 201, 3, 76, 57, 9, 224, 239, 3, 76, + 60, 9, 50, 250, 218, 57, 9, 53, 250, 218, 57, 9, 50, 250, 218, 60, 9, 53, + 250, 218, 60, 9, 52, 53, 250, 218, 57, 9, 52, 53, 250, 218, 90, 3, 238, + 253, 9, 53, 250, 218, 90, 3, 238, 253, 9, 240, 96, 3, 238, 253, 9, 117, + 206, 96, 216, 32, 233, 196, 101, 2, 226, 17, 247, 133, 101, 2, 247, 133, + 101, 2, 251, 51, 101, 2, 199, 2, 101, 1, 206, 182, 63, 101, 1, 63, 101, + 1, 252, 168, 101, 1, 68, 101, 1, 226, 120, 101, 1, 66, 101, 1, 199, 245, + 101, 1, 110, 144, 101, 1, 110, 159, 101, 1, 247, 136, 69, 101, 1, 206, + 182, 69, 101, 1, 69, 101, 1, 251, 200, 101, 1, 247, 136, 72, 101, 1, 206, + 182, 72, 101, 1, 72, 101, 1, 250, 150, 101, 1, 155, 101, 1, 224, 146, + 101, 1, 234, 123, 101, 1, 233, 230, 101, 1, 217, 71, 101, 1, 247, 174, + 101, 1, 247, 16, 101, 1, 225, 214, 101, 1, 225, 180, 101, 1, 215, 109, + 101, 1, 201, 78, 101, 1, 201, 66, 101, 1, 240, 41, 101, 1, 240, 25, 101, + 1, 216, 86, 101, 1, 189, 101, 1, 202, 233, 101, 1, 240, 136, 101, 1, 239, + 176, 101, 1, 176, 101, 1, 216, 68, 101, 1, 161, 101, 1, 213, 6, 101, 1, + 249, 145, 101, 1, 248, 197, 101, 1, 166, 101, 1, 164, 101, 1, 169, 101, + 1, 209, 181, 101, 1, 172, 101, 1, 222, 37, 101, 1, 222, 26, 101, 1, 199, 152, 101, 1, 207, 50, 101, 1, 205, 80, 101, 1, 183, 101, 1, 142, 101, 18, - 2, 214, 163, 101, 18, 2, 214, 99, 101, 2, 215, 148, 101, 2, 250, 131, - 101, 18, 2, 252, 167, 101, 18, 2, 68, 101, 18, 2, 226, 119, 101, 18, 2, + 2, 214, 164, 101, 18, 2, 214, 100, 101, 2, 215, 149, 101, 2, 250, 132, + 101, 18, 2, 252, 168, 101, 18, 2, 68, 101, 18, 2, 226, 120, 101, 18, 2, 66, 101, 18, 2, 199, 245, 101, 18, 2, 110, 144, 101, 18, 2, 110, 209, - 182, 101, 18, 2, 247, 135, 69, 101, 18, 2, 206, 182, 69, 101, 18, 2, 69, - 101, 18, 2, 251, 199, 101, 18, 2, 247, 135, 72, 101, 18, 2, 206, 182, 72, - 101, 18, 2, 72, 101, 18, 2, 250, 149, 101, 2, 199, 7, 101, 18, 2, 212, - 10, 69, 101, 18, 2, 250, 126, 101, 214, 126, 101, 204, 206, 2, 200, 101, - 101, 204, 206, 2, 251, 52, 101, 233, 100, 252, 21, 101, 252, 9, 252, 21, - 101, 18, 2, 247, 135, 181, 69, 101, 18, 2, 200, 99, 101, 18, 2, 199, 244, - 101, 1, 211, 158, 101, 1, 224, 126, 101, 1, 233, 204, 101, 1, 195, 115, - 101, 1, 240, 29, 101, 1, 210, 77, 101, 1, 235, 238, 101, 1, 195, 167, - 101, 1, 110, 209, 182, 101, 1, 110, 222, 37, 101, 18, 2, 110, 159, 101, - 18, 2, 110, 222, 37, 101, 240, 87, 101, 52, 240, 87, 101, 17, 195, 79, + 182, 101, 18, 2, 247, 136, 69, 101, 18, 2, 206, 182, 69, 101, 18, 2, 69, + 101, 18, 2, 251, 200, 101, 18, 2, 247, 136, 72, 101, 18, 2, 206, 182, 72, + 101, 18, 2, 72, 101, 18, 2, 250, 150, 101, 2, 199, 7, 101, 18, 2, 212, + 11, 69, 101, 18, 2, 250, 127, 101, 214, 127, 101, 204, 206, 2, 200, 101, + 101, 204, 206, 2, 251, 53, 101, 233, 101, 252, 22, 101, 252, 10, 252, 22, + 101, 18, 2, 247, 136, 181, 69, 101, 18, 2, 200, 99, 101, 18, 2, 199, 244, + 101, 1, 211, 159, 101, 1, 224, 127, 101, 1, 233, 205, 101, 1, 195, 115, + 101, 1, 240, 30, 101, 1, 210, 77, 101, 1, 235, 239, 101, 1, 195, 167, + 101, 1, 110, 209, 182, 101, 1, 110, 222, 38, 101, 18, 2, 110, 159, 101, + 18, 2, 110, 222, 38, 101, 240, 88, 101, 52, 240, 88, 101, 17, 195, 79, 101, 17, 100, 101, 17, 102, 101, 17, 134, 101, 17, 136, 101, 17, 146, - 101, 17, 167, 101, 17, 178, 101, 17, 171, 101, 17, 182, 101, 252, 29, 55, - 101, 2, 130, 205, 147, 238, 252, 101, 1, 247, 135, 63, 101, 1, 214, 163, - 101, 1, 214, 99, 101, 1, 250, 126, 101, 1, 200, 99, 101, 1, 199, 244, - 101, 1, 220, 15, 240, 40, 101, 1, 195, 74, 101, 1, 85, 164, 101, 1, 234, - 9, 101, 1, 225, 157, 101, 1, 233, 151, 204, 226, 101, 1, 240, 30, 101, 1, - 249, 44, 248, 218, 251, 79, 248, 218, 2, 247, 132, 248, 218, 2, 251, 50, - 248, 218, 2, 199, 2, 248, 218, 1, 63, 248, 218, 1, 252, 167, 248, 218, 1, - 68, 248, 218, 1, 226, 119, 248, 218, 1, 66, 248, 218, 1, 199, 245, 248, - 218, 1, 110, 144, 248, 218, 1, 110, 159, 248, 218, 1, 69, 248, 218, 1, - 251, 199, 248, 218, 1, 72, 248, 218, 1, 250, 149, 248, 218, 1, 155, 248, - 218, 1, 224, 145, 248, 218, 1, 234, 122, 248, 218, 1, 233, 229, 248, 218, - 1, 217, 70, 248, 218, 1, 247, 173, 248, 218, 1, 247, 15, 248, 218, 1, - 225, 213, 248, 218, 1, 225, 179, 248, 218, 1, 215, 108, 248, 218, 1, 201, - 78, 248, 218, 1, 201, 66, 248, 218, 1, 240, 40, 248, 218, 1, 240, 24, - 248, 218, 1, 216, 85, 248, 218, 1, 189, 248, 218, 1, 202, 233, 248, 218, - 1, 240, 135, 248, 218, 1, 239, 175, 248, 218, 1, 176, 248, 218, 1, 161, - 248, 218, 1, 213, 5, 248, 218, 1, 249, 144, 248, 218, 1, 248, 196, 248, - 218, 1, 166, 248, 218, 1, 164, 248, 218, 1, 169, 248, 218, 1, 172, 248, - 218, 1, 207, 50, 248, 218, 1, 205, 80, 248, 218, 1, 183, 248, 218, 1, - 142, 248, 218, 2, 215, 148, 248, 218, 2, 250, 131, 248, 218, 18, 2, 252, - 167, 248, 218, 18, 2, 68, 248, 218, 18, 2, 226, 119, 248, 218, 18, 2, 66, - 248, 218, 18, 2, 199, 245, 248, 218, 18, 2, 110, 144, 248, 218, 18, 2, - 110, 209, 182, 248, 218, 18, 2, 69, 248, 218, 18, 2, 251, 199, 248, 218, - 18, 2, 72, 248, 218, 18, 2, 250, 149, 248, 218, 2, 199, 7, 248, 218, 1, - 224, 136, 189, 248, 218, 250, 150, 222, 157, 78, 248, 218, 1, 209, 181, - 248, 218, 1, 210, 77, 248, 218, 1, 195, 167, 248, 218, 1, 110, 209, 182, - 248, 218, 1, 110, 222, 37, 248, 218, 18, 2, 110, 159, 248, 218, 18, 2, - 110, 222, 37, 248, 218, 17, 195, 79, 248, 218, 17, 100, 248, 218, 17, - 102, 248, 218, 17, 134, 248, 218, 17, 136, 248, 218, 17, 146, 248, 218, - 17, 167, 248, 218, 17, 178, 248, 218, 17, 171, 248, 218, 17, 182, 248, - 218, 1, 210, 251, 3, 112, 239, 145, 248, 218, 1, 210, 251, 3, 221, 202, - 239, 145, 248, 218, 209, 108, 78, 248, 218, 209, 108, 55, 248, 218, 241, - 16, 215, 140, 100, 248, 218, 241, 16, 215, 140, 102, 248, 218, 241, 16, - 215, 140, 134, 248, 218, 241, 16, 215, 140, 136, 248, 218, 241, 16, 215, - 140, 97, 222, 140, 202, 223, 202, 218, 239, 205, 248, 218, 241, 16, 239, - 206, 206, 23, 248, 218, 225, 234, 248, 218, 234, 89, 78, 248, 218, 1, - 199, 115, 251, 50, 248, 218, 252, 29, 55, 248, 218, 208, 215, 78, 233, - 41, 2, 252, 4, 248, 162, 233, 41, 2, 248, 162, 233, 41, 2, 199, 2, 233, - 41, 1, 63, 233, 41, 1, 252, 167, 233, 41, 1, 68, 233, 41, 1, 226, 119, - 233, 41, 1, 66, 233, 41, 1, 199, 245, 233, 41, 1, 237, 53, 233, 41, 1, - 251, 199, 233, 41, 1, 214, 101, 233, 41, 1, 250, 149, 233, 41, 1, 155, - 233, 41, 1, 224, 145, 233, 41, 1, 234, 122, 233, 41, 1, 233, 229, 233, - 41, 1, 217, 70, 233, 41, 1, 247, 173, 233, 41, 1, 247, 15, 233, 41, 1, - 225, 213, 233, 41, 1, 225, 179, 233, 41, 1, 215, 108, 233, 41, 1, 201, - 78, 233, 41, 1, 201, 66, 233, 41, 1, 240, 40, 233, 41, 1, 240, 24, 233, - 41, 1, 216, 85, 233, 41, 1, 189, 233, 41, 1, 202, 233, 233, 41, 1, 240, - 135, 233, 41, 1, 239, 175, 233, 41, 1, 176, 233, 41, 1, 161, 233, 41, 1, - 213, 5, 233, 41, 1, 249, 144, 233, 41, 1, 248, 196, 233, 41, 1, 166, 233, - 41, 1, 164, 233, 41, 1, 169, 233, 41, 1, 172, 233, 41, 1, 222, 36, 233, - 41, 1, 199, 152, 233, 41, 1, 207, 50, 233, 41, 1, 183, 233, 41, 1, 142, - 233, 41, 2, 215, 148, 233, 41, 18, 2, 252, 167, 233, 41, 18, 2, 68, 233, - 41, 18, 2, 226, 119, 233, 41, 18, 2, 66, 233, 41, 18, 2, 199, 245, 233, - 41, 18, 2, 237, 53, 233, 41, 18, 2, 251, 199, 233, 41, 18, 2, 214, 101, - 233, 41, 18, 2, 250, 149, 233, 41, 2, 199, 7, 233, 41, 2, 200, 103, 233, - 41, 1, 224, 126, 233, 41, 1, 233, 204, 233, 41, 1, 195, 115, 233, 41, 1, - 209, 181, 233, 41, 1, 235, 238, 233, 41, 17, 195, 79, 233, 41, 17, 100, - 233, 41, 17, 102, 233, 41, 17, 134, 233, 41, 17, 136, 233, 41, 17, 146, - 233, 41, 17, 167, 233, 41, 17, 178, 233, 41, 17, 171, 233, 41, 17, 182, - 233, 41, 202, 65, 233, 41, 252, 3, 233, 41, 225, 254, 233, 41, 200, 17, - 233, 41, 237, 14, 214, 106, 233, 41, 2, 196, 104, 233, 41, 252, 29, 55, - 233, 57, 2, 247, 132, 233, 57, 2, 251, 50, 233, 57, 2, 199, 2, 233, 57, - 1, 63, 233, 57, 1, 252, 167, 233, 57, 1, 68, 233, 57, 1, 226, 119, 233, - 57, 1, 66, 233, 57, 1, 199, 245, 233, 57, 1, 110, 144, 233, 57, 1, 110, - 159, 233, 57, 18, 247, 135, 69, 233, 57, 1, 69, 233, 57, 1, 251, 199, - 233, 57, 18, 247, 135, 72, 233, 57, 1, 72, 233, 57, 1, 250, 149, 233, 57, - 1, 155, 233, 57, 1, 224, 145, 233, 57, 1, 234, 122, 233, 57, 1, 233, 229, - 233, 57, 1, 217, 70, 233, 57, 1, 247, 173, 233, 57, 1, 247, 15, 233, 57, - 1, 225, 213, 233, 57, 1, 225, 179, 233, 57, 1, 215, 108, 233, 57, 1, 201, - 78, 233, 57, 1, 201, 66, 233, 57, 1, 240, 40, 233, 57, 1, 240, 24, 233, - 57, 1, 216, 85, 233, 57, 1, 189, 233, 57, 1, 202, 233, 233, 57, 1, 240, - 135, 233, 57, 1, 239, 175, 233, 57, 1, 176, 233, 57, 1, 161, 233, 57, 1, - 213, 5, 233, 57, 1, 249, 144, 233, 57, 1, 248, 196, 233, 57, 1, 166, 233, - 57, 1, 164, 233, 57, 1, 169, 233, 57, 1, 172, 233, 57, 1, 222, 36, 233, - 57, 1, 199, 152, 233, 57, 1, 207, 50, 233, 57, 1, 205, 80, 233, 57, 1, - 183, 233, 57, 1, 142, 233, 57, 2, 215, 148, 233, 57, 2, 250, 131, 233, - 57, 18, 2, 252, 167, 233, 57, 18, 2, 68, 233, 57, 18, 2, 226, 119, 233, - 57, 18, 2, 66, 233, 57, 18, 2, 199, 245, 233, 57, 18, 2, 110, 144, 233, - 57, 18, 2, 110, 209, 182, 233, 57, 18, 2, 247, 135, 69, 233, 57, 18, 2, - 69, 233, 57, 18, 2, 251, 199, 233, 57, 18, 2, 247, 135, 72, 233, 57, 18, - 2, 72, 233, 57, 18, 2, 250, 149, 233, 57, 2, 199, 7, 233, 57, 214, 126, - 233, 57, 1, 110, 209, 182, 233, 57, 1, 110, 222, 37, 233, 57, 18, 2, 110, - 159, 233, 57, 18, 2, 110, 222, 37, 233, 57, 17, 195, 79, 233, 57, 17, - 100, 233, 57, 17, 102, 233, 57, 17, 134, 233, 57, 17, 136, 233, 57, 17, - 146, 233, 57, 17, 167, 233, 57, 17, 178, 233, 57, 17, 171, 233, 57, 17, - 182, 233, 57, 252, 29, 55, 233, 57, 209, 108, 55, 233, 57, 1, 195, 74, - 233, 57, 2, 204, 119, 233, 57, 2, 207, 40, 233, 57, 2, 220, 106, 233, 57, - 2, 202, 153, 215, 149, 57, 233, 57, 2, 244, 249, 215, 149, 57, 233, 57, - 2, 200, 217, 215, 149, 57, 214, 61, 2, 247, 132, 214, 61, 2, 251, 50, - 214, 61, 2, 199, 2, 214, 61, 1, 63, 214, 61, 1, 252, 167, 214, 61, 1, 68, - 214, 61, 1, 226, 119, 214, 61, 1, 66, 214, 61, 1, 199, 245, 214, 61, 1, - 110, 144, 214, 61, 1, 110, 159, 214, 61, 1, 69, 214, 61, 1, 251, 199, - 214, 61, 1, 72, 214, 61, 1, 250, 149, 214, 61, 1, 155, 214, 61, 1, 224, - 145, 214, 61, 1, 234, 122, 214, 61, 1, 233, 229, 214, 61, 1, 217, 70, - 214, 61, 1, 247, 173, 214, 61, 1, 247, 15, 214, 61, 1, 225, 213, 214, 61, - 1, 225, 179, 214, 61, 1, 215, 108, 214, 61, 1, 201, 78, 214, 61, 1, 201, - 66, 214, 61, 1, 240, 40, 214, 61, 1, 240, 24, 214, 61, 1, 216, 85, 214, - 61, 1, 189, 214, 61, 1, 202, 233, 214, 61, 1, 240, 135, 214, 61, 1, 239, - 175, 214, 61, 1, 176, 214, 61, 1, 161, 214, 61, 1, 213, 5, 214, 61, 1, - 249, 144, 214, 61, 1, 248, 196, 214, 61, 1, 166, 214, 61, 1, 164, 214, - 61, 1, 169, 214, 61, 1, 172, 214, 61, 1, 222, 36, 214, 61, 1, 199, 152, - 214, 61, 1, 207, 50, 214, 61, 1, 205, 80, 214, 61, 1, 183, 214, 61, 1, - 142, 214, 61, 2, 215, 148, 214, 61, 2, 250, 131, 214, 61, 18, 2, 252, - 167, 214, 61, 18, 2, 68, 214, 61, 18, 2, 226, 119, 214, 61, 18, 2, 66, - 214, 61, 18, 2, 199, 245, 214, 61, 18, 2, 110, 144, 214, 61, 18, 2, 110, - 209, 182, 214, 61, 18, 2, 69, 214, 61, 18, 2, 251, 199, 214, 61, 18, 2, - 72, 214, 61, 18, 2, 250, 149, 214, 61, 2, 199, 7, 214, 61, 251, 200, 222, - 157, 78, 214, 61, 250, 150, 222, 157, 78, 214, 61, 1, 209, 181, 214, 61, - 1, 210, 77, 214, 61, 1, 195, 167, 214, 61, 1, 110, 209, 182, 214, 61, 1, - 110, 222, 37, 214, 61, 18, 2, 110, 159, 214, 61, 18, 2, 110, 222, 37, - 214, 61, 17, 195, 79, 214, 61, 17, 100, 214, 61, 17, 102, 214, 61, 17, - 134, 214, 61, 17, 136, 214, 61, 17, 146, 214, 61, 17, 167, 214, 61, 17, - 178, 214, 61, 17, 171, 214, 61, 17, 182, 214, 61, 225, 234, 214, 61, 1, - 197, 166, 214, 61, 191, 97, 211, 86, 214, 61, 191, 97, 232, 224, 214, 61, - 191, 115, 211, 84, 214, 61, 191, 97, 206, 21, 214, 61, 191, 97, 237, 25, - 214, 61, 191, 115, 206, 18, 42, 2, 251, 50, 42, 2, 199, 2, 42, 1, 63, 42, - 1, 252, 167, 42, 1, 68, 42, 1, 226, 119, 42, 1, 66, 42, 1, 199, 245, 42, - 1, 69, 42, 1, 237, 53, 42, 1, 251, 199, 42, 1, 72, 42, 1, 214, 101, 42, - 1, 250, 149, 42, 1, 155, 42, 1, 217, 70, 42, 1, 247, 173, 42, 1, 225, - 213, 42, 1, 215, 108, 42, 1, 201, 78, 42, 1, 216, 85, 42, 1, 189, 42, 1, - 176, 42, 1, 216, 67, 42, 1, 161, 42, 1, 166, 42, 1, 164, 42, 1, 169, 42, - 1, 209, 181, 42, 1, 172, 42, 1, 222, 36, 42, 1, 222, 25, 42, 1, 199, 152, + 101, 17, 167, 101, 17, 178, 101, 17, 171, 101, 17, 182, 101, 252, 30, 55, + 101, 2, 130, 205, 147, 238, 253, 101, 1, 247, 136, 63, 101, 1, 214, 164, + 101, 1, 214, 100, 101, 1, 250, 127, 101, 1, 200, 99, 101, 1, 199, 244, + 101, 1, 220, 16, 240, 41, 101, 1, 195, 74, 101, 1, 85, 164, 101, 1, 234, + 10, 101, 1, 225, 158, 101, 1, 233, 152, 204, 226, 101, 1, 240, 31, 101, + 1, 249, 45, 248, 219, 251, 80, 248, 219, 2, 247, 133, 248, 219, 2, 251, + 51, 248, 219, 2, 199, 2, 248, 219, 1, 63, 248, 219, 1, 252, 168, 248, + 219, 1, 68, 248, 219, 1, 226, 120, 248, 219, 1, 66, 248, 219, 1, 199, + 245, 248, 219, 1, 110, 144, 248, 219, 1, 110, 159, 248, 219, 1, 69, 248, + 219, 1, 251, 200, 248, 219, 1, 72, 248, 219, 1, 250, 150, 248, 219, 1, + 155, 248, 219, 1, 224, 146, 248, 219, 1, 234, 123, 248, 219, 1, 233, 230, + 248, 219, 1, 217, 71, 248, 219, 1, 247, 174, 248, 219, 1, 247, 16, 248, + 219, 1, 225, 214, 248, 219, 1, 225, 180, 248, 219, 1, 215, 109, 248, 219, + 1, 201, 78, 248, 219, 1, 201, 66, 248, 219, 1, 240, 41, 248, 219, 1, 240, + 25, 248, 219, 1, 216, 86, 248, 219, 1, 189, 248, 219, 1, 202, 233, 248, + 219, 1, 240, 136, 248, 219, 1, 239, 176, 248, 219, 1, 176, 248, 219, 1, + 161, 248, 219, 1, 213, 6, 248, 219, 1, 249, 145, 248, 219, 1, 248, 197, + 248, 219, 1, 166, 248, 219, 1, 164, 248, 219, 1, 169, 248, 219, 1, 172, + 248, 219, 1, 207, 50, 248, 219, 1, 205, 80, 248, 219, 1, 183, 248, 219, + 1, 142, 248, 219, 2, 215, 149, 248, 219, 2, 250, 132, 248, 219, 18, 2, + 252, 168, 248, 219, 18, 2, 68, 248, 219, 18, 2, 226, 120, 248, 219, 18, + 2, 66, 248, 219, 18, 2, 199, 245, 248, 219, 18, 2, 110, 144, 248, 219, + 18, 2, 110, 209, 182, 248, 219, 18, 2, 69, 248, 219, 18, 2, 251, 200, + 248, 219, 18, 2, 72, 248, 219, 18, 2, 250, 150, 248, 219, 2, 199, 7, 248, + 219, 1, 224, 137, 189, 248, 219, 250, 151, 222, 158, 78, 248, 219, 1, + 209, 181, 248, 219, 1, 210, 77, 248, 219, 1, 195, 167, 248, 219, 1, 110, + 209, 182, 248, 219, 1, 110, 222, 38, 248, 219, 18, 2, 110, 159, 248, 219, + 18, 2, 110, 222, 38, 248, 219, 17, 195, 79, 248, 219, 17, 100, 248, 219, + 17, 102, 248, 219, 17, 134, 248, 219, 17, 136, 248, 219, 17, 146, 248, + 219, 17, 167, 248, 219, 17, 178, 248, 219, 17, 171, 248, 219, 17, 182, + 248, 219, 1, 210, 252, 3, 112, 239, 146, 248, 219, 1, 210, 252, 3, 221, + 203, 239, 146, 248, 219, 209, 108, 78, 248, 219, 209, 108, 55, 248, 219, + 241, 17, 215, 141, 100, 248, 219, 241, 17, 215, 141, 102, 248, 219, 241, + 17, 215, 141, 134, 248, 219, 241, 17, 215, 141, 136, 248, 219, 241, 17, + 215, 141, 97, 222, 141, 202, 223, 202, 218, 239, 206, 248, 219, 241, 17, + 239, 207, 206, 23, 248, 219, 225, 235, 248, 219, 234, 90, 78, 248, 219, + 1, 199, 115, 251, 51, 248, 219, 252, 30, 55, 248, 219, 208, 215, 78, 233, + 42, 2, 252, 5, 248, 163, 233, 42, 2, 248, 163, 233, 42, 2, 199, 2, 233, + 42, 1, 63, 233, 42, 1, 252, 168, 233, 42, 1, 68, 233, 42, 1, 226, 120, + 233, 42, 1, 66, 233, 42, 1, 199, 245, 233, 42, 1, 237, 54, 233, 42, 1, + 251, 200, 233, 42, 1, 214, 102, 233, 42, 1, 250, 150, 233, 42, 1, 155, + 233, 42, 1, 224, 146, 233, 42, 1, 234, 123, 233, 42, 1, 233, 230, 233, + 42, 1, 217, 71, 233, 42, 1, 247, 174, 233, 42, 1, 247, 16, 233, 42, 1, + 225, 214, 233, 42, 1, 225, 180, 233, 42, 1, 215, 109, 233, 42, 1, 201, + 78, 233, 42, 1, 201, 66, 233, 42, 1, 240, 41, 233, 42, 1, 240, 25, 233, + 42, 1, 216, 86, 233, 42, 1, 189, 233, 42, 1, 202, 233, 233, 42, 1, 240, + 136, 233, 42, 1, 239, 176, 233, 42, 1, 176, 233, 42, 1, 161, 233, 42, 1, + 213, 6, 233, 42, 1, 249, 145, 233, 42, 1, 248, 197, 233, 42, 1, 166, 233, + 42, 1, 164, 233, 42, 1, 169, 233, 42, 1, 172, 233, 42, 1, 222, 37, 233, + 42, 1, 199, 152, 233, 42, 1, 207, 50, 233, 42, 1, 183, 233, 42, 1, 142, + 233, 42, 2, 215, 149, 233, 42, 18, 2, 252, 168, 233, 42, 18, 2, 68, 233, + 42, 18, 2, 226, 120, 233, 42, 18, 2, 66, 233, 42, 18, 2, 199, 245, 233, + 42, 18, 2, 237, 54, 233, 42, 18, 2, 251, 200, 233, 42, 18, 2, 214, 102, + 233, 42, 18, 2, 250, 150, 233, 42, 2, 199, 7, 233, 42, 2, 200, 103, 233, + 42, 1, 224, 127, 233, 42, 1, 233, 205, 233, 42, 1, 195, 115, 233, 42, 1, + 209, 181, 233, 42, 1, 235, 239, 233, 42, 17, 195, 79, 233, 42, 17, 100, + 233, 42, 17, 102, 233, 42, 17, 134, 233, 42, 17, 136, 233, 42, 17, 146, + 233, 42, 17, 167, 233, 42, 17, 178, 233, 42, 17, 171, 233, 42, 17, 182, + 233, 42, 202, 65, 233, 42, 252, 4, 233, 42, 225, 255, 233, 42, 200, 17, + 233, 42, 237, 15, 214, 107, 233, 42, 2, 196, 104, 233, 42, 252, 30, 55, + 233, 58, 2, 247, 133, 233, 58, 2, 251, 51, 233, 58, 2, 199, 2, 233, 58, + 1, 63, 233, 58, 1, 252, 168, 233, 58, 1, 68, 233, 58, 1, 226, 120, 233, + 58, 1, 66, 233, 58, 1, 199, 245, 233, 58, 1, 110, 144, 233, 58, 1, 110, + 159, 233, 58, 18, 247, 136, 69, 233, 58, 1, 69, 233, 58, 1, 251, 200, + 233, 58, 18, 247, 136, 72, 233, 58, 1, 72, 233, 58, 1, 250, 150, 233, 58, + 1, 155, 233, 58, 1, 224, 146, 233, 58, 1, 234, 123, 233, 58, 1, 233, 230, + 233, 58, 1, 217, 71, 233, 58, 1, 247, 174, 233, 58, 1, 247, 16, 233, 58, + 1, 225, 214, 233, 58, 1, 225, 180, 233, 58, 1, 215, 109, 233, 58, 1, 201, + 78, 233, 58, 1, 201, 66, 233, 58, 1, 240, 41, 233, 58, 1, 240, 25, 233, + 58, 1, 216, 86, 233, 58, 1, 189, 233, 58, 1, 202, 233, 233, 58, 1, 240, + 136, 233, 58, 1, 239, 176, 233, 58, 1, 176, 233, 58, 1, 161, 233, 58, 1, + 213, 6, 233, 58, 1, 249, 145, 233, 58, 1, 248, 197, 233, 58, 1, 166, 233, + 58, 1, 164, 233, 58, 1, 169, 233, 58, 1, 172, 233, 58, 1, 222, 37, 233, + 58, 1, 199, 152, 233, 58, 1, 207, 50, 233, 58, 1, 205, 80, 233, 58, 1, + 183, 233, 58, 1, 142, 233, 58, 2, 215, 149, 233, 58, 2, 250, 132, 233, + 58, 18, 2, 252, 168, 233, 58, 18, 2, 68, 233, 58, 18, 2, 226, 120, 233, + 58, 18, 2, 66, 233, 58, 18, 2, 199, 245, 233, 58, 18, 2, 110, 144, 233, + 58, 18, 2, 110, 209, 182, 233, 58, 18, 2, 247, 136, 69, 233, 58, 18, 2, + 69, 233, 58, 18, 2, 251, 200, 233, 58, 18, 2, 247, 136, 72, 233, 58, 18, + 2, 72, 233, 58, 18, 2, 250, 150, 233, 58, 2, 199, 7, 233, 58, 214, 127, + 233, 58, 1, 110, 209, 182, 233, 58, 1, 110, 222, 38, 233, 58, 18, 2, 110, + 159, 233, 58, 18, 2, 110, 222, 38, 233, 58, 17, 195, 79, 233, 58, 17, + 100, 233, 58, 17, 102, 233, 58, 17, 134, 233, 58, 17, 136, 233, 58, 17, + 146, 233, 58, 17, 167, 233, 58, 17, 178, 233, 58, 17, 171, 233, 58, 17, + 182, 233, 58, 252, 30, 55, 233, 58, 209, 108, 55, 233, 58, 1, 195, 74, + 233, 58, 2, 204, 119, 233, 58, 2, 207, 40, 233, 58, 2, 220, 107, 233, 58, + 2, 202, 153, 215, 150, 57, 233, 58, 2, 244, 250, 215, 150, 57, 233, 58, + 2, 200, 217, 215, 150, 57, 214, 62, 2, 247, 133, 214, 62, 2, 251, 51, + 214, 62, 2, 199, 2, 214, 62, 1, 63, 214, 62, 1, 252, 168, 214, 62, 1, 68, + 214, 62, 1, 226, 120, 214, 62, 1, 66, 214, 62, 1, 199, 245, 214, 62, 1, + 110, 144, 214, 62, 1, 110, 159, 214, 62, 1, 69, 214, 62, 1, 251, 200, + 214, 62, 1, 72, 214, 62, 1, 250, 150, 214, 62, 1, 155, 214, 62, 1, 224, + 146, 214, 62, 1, 234, 123, 214, 62, 1, 233, 230, 214, 62, 1, 217, 71, + 214, 62, 1, 247, 174, 214, 62, 1, 247, 16, 214, 62, 1, 225, 214, 214, 62, + 1, 225, 180, 214, 62, 1, 215, 109, 214, 62, 1, 201, 78, 214, 62, 1, 201, + 66, 214, 62, 1, 240, 41, 214, 62, 1, 240, 25, 214, 62, 1, 216, 86, 214, + 62, 1, 189, 214, 62, 1, 202, 233, 214, 62, 1, 240, 136, 214, 62, 1, 239, + 176, 214, 62, 1, 176, 214, 62, 1, 161, 214, 62, 1, 213, 6, 214, 62, 1, + 249, 145, 214, 62, 1, 248, 197, 214, 62, 1, 166, 214, 62, 1, 164, 214, + 62, 1, 169, 214, 62, 1, 172, 214, 62, 1, 222, 37, 214, 62, 1, 199, 152, + 214, 62, 1, 207, 50, 214, 62, 1, 205, 80, 214, 62, 1, 183, 214, 62, 1, + 142, 214, 62, 2, 215, 149, 214, 62, 2, 250, 132, 214, 62, 18, 2, 252, + 168, 214, 62, 18, 2, 68, 214, 62, 18, 2, 226, 120, 214, 62, 18, 2, 66, + 214, 62, 18, 2, 199, 245, 214, 62, 18, 2, 110, 144, 214, 62, 18, 2, 110, + 209, 182, 214, 62, 18, 2, 69, 214, 62, 18, 2, 251, 200, 214, 62, 18, 2, + 72, 214, 62, 18, 2, 250, 150, 214, 62, 2, 199, 7, 214, 62, 251, 201, 222, + 158, 78, 214, 62, 250, 151, 222, 158, 78, 214, 62, 1, 209, 181, 214, 62, + 1, 210, 77, 214, 62, 1, 195, 167, 214, 62, 1, 110, 209, 182, 214, 62, 1, + 110, 222, 38, 214, 62, 18, 2, 110, 159, 214, 62, 18, 2, 110, 222, 38, + 214, 62, 17, 195, 79, 214, 62, 17, 100, 214, 62, 17, 102, 214, 62, 17, + 134, 214, 62, 17, 136, 214, 62, 17, 146, 214, 62, 17, 167, 214, 62, 17, + 178, 214, 62, 17, 171, 214, 62, 17, 182, 214, 62, 225, 235, 214, 62, 1, + 197, 166, 214, 62, 191, 97, 211, 87, 214, 62, 191, 97, 232, 225, 214, 62, + 191, 115, 211, 85, 214, 62, 191, 97, 206, 21, 214, 62, 191, 97, 237, 26, + 214, 62, 191, 115, 206, 18, 42, 2, 251, 51, 42, 2, 199, 2, 42, 1, 63, 42, + 1, 252, 168, 42, 1, 68, 42, 1, 226, 120, 42, 1, 66, 42, 1, 199, 245, 42, + 1, 69, 42, 1, 237, 54, 42, 1, 251, 200, 42, 1, 72, 42, 1, 214, 102, 42, + 1, 250, 150, 42, 1, 155, 42, 1, 217, 71, 42, 1, 247, 174, 42, 1, 225, + 214, 42, 1, 215, 109, 42, 1, 201, 78, 42, 1, 216, 86, 42, 1, 189, 42, 1, + 176, 42, 1, 216, 68, 42, 1, 161, 42, 1, 166, 42, 1, 164, 42, 1, 169, 42, + 1, 209, 181, 42, 1, 172, 42, 1, 222, 37, 42, 1, 222, 26, 42, 1, 199, 152, 42, 1, 207, 50, 42, 1, 205, 80, 42, 1, 183, 42, 1, 142, 42, 18, 2, 252, - 167, 42, 18, 2, 68, 42, 18, 2, 226, 119, 42, 18, 2, 66, 42, 18, 2, 199, - 245, 42, 18, 2, 69, 42, 18, 2, 237, 53, 42, 18, 2, 251, 199, 42, 18, 2, - 72, 42, 18, 2, 214, 101, 42, 18, 2, 250, 149, 42, 2, 199, 7, 42, 214, - 126, 42, 250, 150, 222, 157, 78, 42, 17, 195, 79, 42, 17, 100, 42, 17, + 168, 42, 18, 2, 68, 42, 18, 2, 226, 120, 42, 18, 2, 66, 42, 18, 2, 199, + 245, 42, 18, 2, 69, 42, 18, 2, 237, 54, 42, 18, 2, 251, 200, 42, 18, 2, + 72, 42, 18, 2, 214, 102, 42, 18, 2, 250, 150, 42, 2, 199, 7, 42, 214, + 127, 42, 250, 151, 222, 158, 78, 42, 17, 195, 79, 42, 17, 100, 42, 17, 102, 42, 17, 134, 42, 17, 136, 42, 17, 146, 42, 17, 167, 42, 17, 178, 42, - 17, 171, 42, 17, 182, 42, 31, 203, 23, 42, 31, 97, 231, 56, 42, 31, 97, - 170, 42, 240, 53, 55, 42, 218, 197, 55, 42, 196, 67, 55, 42, 239, 247, - 55, 42, 241, 73, 55, 42, 250, 202, 90, 55, 42, 209, 108, 55, 42, 31, 55, - 194, 194, 2, 38, 247, 133, 57, 194, 194, 2, 247, 132, 194, 194, 2, 251, - 50, 194, 194, 2, 199, 2, 194, 194, 2, 38, 251, 51, 57, 194, 194, 1, 63, - 194, 194, 1, 252, 167, 194, 194, 1, 68, 194, 194, 1, 226, 119, 194, 194, + 17, 171, 42, 17, 182, 42, 31, 203, 23, 42, 31, 97, 231, 57, 42, 31, 97, + 170, 42, 240, 54, 55, 42, 218, 198, 55, 42, 196, 67, 55, 42, 239, 248, + 55, 42, 241, 74, 55, 42, 250, 203, 90, 55, 42, 209, 108, 55, 42, 31, 55, + 194, 194, 2, 38, 247, 134, 57, 194, 194, 2, 247, 133, 194, 194, 2, 251, + 51, 194, 194, 2, 199, 2, 194, 194, 2, 38, 251, 52, 57, 194, 194, 1, 63, + 194, 194, 1, 252, 168, 194, 194, 1, 68, 194, 194, 1, 226, 120, 194, 194, 1, 66, 194, 194, 1, 199, 245, 194, 194, 1, 110, 144, 194, 194, 1, 110, - 159, 194, 194, 1, 69, 194, 194, 1, 237, 53, 194, 194, 1, 251, 199, 194, - 194, 1, 72, 194, 194, 1, 214, 101, 194, 194, 1, 250, 149, 194, 194, 1, - 155, 194, 194, 1, 224, 145, 194, 194, 1, 234, 122, 194, 194, 1, 233, 229, - 194, 194, 1, 217, 70, 194, 194, 1, 247, 173, 194, 194, 1, 247, 15, 194, - 194, 1, 225, 213, 194, 194, 1, 225, 179, 194, 194, 1, 215, 108, 194, 194, - 1, 201, 78, 194, 194, 1, 201, 66, 194, 194, 1, 240, 40, 194, 194, 1, 240, - 24, 194, 194, 1, 216, 85, 194, 194, 1, 189, 194, 194, 1, 202, 233, 194, - 194, 1, 240, 135, 194, 194, 1, 239, 175, 194, 194, 1, 176, 194, 194, 1, - 161, 194, 194, 1, 213, 5, 194, 194, 1, 249, 144, 194, 194, 1, 248, 196, + 159, 194, 194, 1, 69, 194, 194, 1, 237, 54, 194, 194, 1, 251, 200, 194, + 194, 1, 72, 194, 194, 1, 214, 102, 194, 194, 1, 250, 150, 194, 194, 1, + 155, 194, 194, 1, 224, 146, 194, 194, 1, 234, 123, 194, 194, 1, 233, 230, + 194, 194, 1, 217, 71, 194, 194, 1, 247, 174, 194, 194, 1, 247, 16, 194, + 194, 1, 225, 214, 194, 194, 1, 225, 180, 194, 194, 1, 215, 109, 194, 194, + 1, 201, 78, 194, 194, 1, 201, 66, 194, 194, 1, 240, 41, 194, 194, 1, 240, + 25, 194, 194, 1, 216, 86, 194, 194, 1, 189, 194, 194, 1, 202, 233, 194, + 194, 1, 240, 136, 194, 194, 1, 239, 176, 194, 194, 1, 176, 194, 194, 1, + 161, 194, 194, 1, 213, 6, 194, 194, 1, 249, 145, 194, 194, 1, 248, 197, 194, 194, 1, 166, 194, 194, 1, 164, 194, 194, 1, 169, 194, 194, 1, 209, - 181, 194, 194, 1, 172, 194, 194, 1, 222, 36, 194, 194, 1, 222, 25, 194, + 181, 194, 194, 1, 172, 194, 194, 1, 222, 37, 194, 194, 1, 222, 26, 194, 194, 1, 199, 152, 194, 194, 1, 207, 50, 194, 194, 1, 205, 80, 194, 194, - 1, 183, 194, 194, 1, 142, 194, 194, 2, 250, 131, 194, 194, 18, 2, 252, - 167, 194, 194, 18, 2, 68, 194, 194, 18, 2, 226, 119, 194, 194, 18, 2, 66, + 1, 183, 194, 194, 1, 142, 194, 194, 2, 250, 132, 194, 194, 18, 2, 252, + 168, 194, 194, 18, 2, 68, 194, 194, 18, 2, 226, 120, 194, 194, 18, 2, 66, 194, 194, 18, 2, 199, 245, 194, 194, 18, 2, 110, 144, 194, 194, 18, 2, - 110, 209, 182, 194, 194, 18, 2, 69, 194, 194, 18, 2, 237, 53, 194, 194, - 18, 2, 251, 199, 194, 194, 18, 2, 72, 194, 194, 18, 2, 214, 101, 194, - 194, 18, 2, 250, 149, 194, 194, 2, 199, 7, 194, 194, 222, 157, 78, 194, - 194, 251, 200, 222, 157, 78, 194, 194, 1, 201, 113, 194, 194, 1, 237, - 155, 194, 194, 1, 209, 162, 194, 194, 1, 110, 209, 182, 194, 194, 1, 110, - 222, 37, 194, 194, 18, 2, 110, 159, 194, 194, 18, 2, 110, 222, 37, 194, + 110, 209, 182, 194, 194, 18, 2, 69, 194, 194, 18, 2, 237, 54, 194, 194, + 18, 2, 251, 200, 194, 194, 18, 2, 72, 194, 194, 18, 2, 214, 102, 194, + 194, 18, 2, 250, 150, 194, 194, 2, 199, 7, 194, 194, 222, 158, 78, 194, + 194, 251, 201, 222, 158, 78, 194, 194, 1, 201, 113, 194, 194, 1, 237, + 156, 194, 194, 1, 209, 162, 194, 194, 1, 110, 209, 182, 194, 194, 1, 110, + 222, 38, 194, 194, 18, 2, 110, 159, 194, 194, 18, 2, 110, 222, 38, 194, 194, 17, 195, 79, 194, 194, 17, 100, 194, 194, 17, 102, 194, 194, 17, 134, 194, 194, 17, 136, 194, 194, 17, 146, 194, 194, 17, 167, 194, 194, 17, 178, 194, 194, 17, 171, 194, 194, 17, 182, 194, 194, 2, 206, 100, - 194, 194, 191, 17, 195, 80, 36, 214, 167, 212, 56, 77, 136, 194, 194, - 191, 17, 97, 36, 214, 167, 212, 56, 77, 136, 194, 194, 191, 17, 99, 36, - 214, 167, 212, 56, 77, 136, 194, 194, 191, 17, 115, 36, 214, 167, 212, - 56, 77, 136, 194, 194, 191, 17, 97, 36, 236, 102, 212, 56, 77, 136, 194, - 194, 191, 17, 99, 36, 236, 102, 212, 56, 77, 136, 194, 194, 191, 17, 115, - 36, 236, 102, 212, 56, 77, 136, 194, 194, 2, 200, 250, 225, 10, 2, 205, - 147, 247, 132, 225, 10, 2, 247, 132, 225, 10, 2, 251, 50, 225, 10, 2, - 199, 2, 225, 10, 2, 206, 100, 225, 10, 1, 63, 225, 10, 1, 252, 167, 225, - 10, 1, 68, 225, 10, 1, 226, 119, 225, 10, 1, 66, 225, 10, 1, 199, 245, - 225, 10, 1, 110, 144, 225, 10, 1, 110, 159, 225, 10, 1, 69, 225, 10, 1, - 237, 53, 225, 10, 1, 251, 199, 225, 10, 1, 72, 225, 10, 1, 214, 101, 225, - 10, 1, 250, 149, 225, 10, 1, 155, 225, 10, 1, 224, 145, 225, 10, 1, 234, - 122, 225, 10, 1, 233, 229, 225, 10, 1, 217, 70, 225, 10, 1, 247, 173, - 225, 10, 1, 247, 15, 225, 10, 1, 225, 213, 225, 10, 1, 225, 179, 225, 10, - 1, 215, 108, 225, 10, 1, 201, 78, 225, 10, 1, 201, 66, 225, 10, 1, 240, - 40, 225, 10, 1, 240, 24, 225, 10, 1, 216, 85, 225, 10, 1, 189, 225, 10, - 1, 202, 233, 225, 10, 1, 240, 135, 225, 10, 1, 239, 175, 225, 10, 1, 176, - 225, 10, 1, 161, 225, 10, 1, 213, 5, 225, 10, 1, 249, 144, 225, 10, 1, - 248, 196, 225, 10, 1, 166, 225, 10, 1, 164, 225, 10, 1, 169, 225, 10, 1, - 209, 181, 225, 10, 1, 172, 225, 10, 1, 222, 36, 225, 10, 1, 199, 152, - 225, 10, 1, 207, 50, 225, 10, 1, 205, 80, 225, 10, 1, 183, 225, 10, 1, - 142, 225, 10, 2, 215, 148, 225, 10, 2, 250, 131, 225, 10, 18, 2, 252, - 167, 225, 10, 18, 2, 68, 225, 10, 18, 2, 226, 119, 225, 10, 18, 2, 66, - 225, 10, 18, 2, 199, 245, 225, 10, 18, 2, 110, 144, 225, 10, 18, 2, 110, - 209, 182, 225, 10, 18, 2, 69, 225, 10, 18, 2, 237, 53, 225, 10, 18, 2, - 251, 199, 225, 10, 18, 2, 72, 225, 10, 18, 2, 214, 101, 225, 10, 18, 2, - 250, 149, 225, 10, 2, 199, 7, 225, 10, 222, 157, 78, 225, 10, 251, 200, - 222, 157, 78, 225, 10, 1, 235, 238, 225, 10, 1, 110, 209, 182, 225, 10, - 1, 110, 222, 37, 225, 10, 18, 2, 110, 159, 225, 10, 18, 2, 110, 222, 37, - 225, 10, 17, 195, 79, 225, 10, 17, 100, 225, 10, 17, 102, 225, 10, 17, - 134, 225, 10, 17, 136, 225, 10, 17, 146, 225, 10, 17, 167, 225, 10, 17, - 178, 225, 10, 17, 171, 225, 10, 17, 182, 225, 10, 2, 225, 164, 225, 10, - 2, 200, 34, 131, 2, 38, 251, 51, 57, 131, 2, 247, 132, 131, 2, 251, 50, - 131, 2, 199, 2, 131, 1, 63, 131, 1, 252, 167, 131, 1, 68, 131, 1, 226, - 119, 131, 1, 66, 131, 1, 199, 245, 131, 1, 110, 144, 131, 1, 110, 159, - 131, 1, 69, 131, 1, 237, 53, 131, 1, 251, 199, 131, 1, 72, 131, 1, 214, - 101, 131, 1, 250, 149, 131, 1, 155, 131, 1, 224, 145, 131, 1, 234, 122, - 131, 1, 233, 229, 131, 1, 217, 70, 131, 1, 247, 173, 131, 1, 247, 15, - 131, 1, 225, 213, 131, 1, 225, 179, 131, 1, 215, 108, 131, 1, 201, 78, - 131, 1, 201, 66, 131, 1, 240, 40, 131, 1, 240, 24, 131, 1, 216, 85, 131, - 1, 189, 131, 1, 202, 233, 131, 1, 240, 135, 131, 1, 239, 175, 131, 1, - 176, 131, 1, 216, 67, 131, 1, 161, 131, 1, 213, 5, 131, 1, 249, 144, 131, - 1, 248, 196, 131, 1, 166, 131, 1, 164, 131, 1, 169, 131, 1, 209, 181, - 131, 1, 172, 131, 1, 222, 36, 131, 1, 222, 25, 131, 1, 199, 152, 131, 1, + 194, 194, 191, 17, 195, 80, 36, 214, 168, 212, 57, 77, 136, 194, 194, + 191, 17, 97, 36, 214, 168, 212, 57, 77, 136, 194, 194, 191, 17, 99, 36, + 214, 168, 212, 57, 77, 136, 194, 194, 191, 17, 115, 36, 214, 168, 212, + 57, 77, 136, 194, 194, 191, 17, 97, 36, 236, 103, 212, 57, 77, 136, 194, + 194, 191, 17, 99, 36, 236, 103, 212, 57, 77, 136, 194, 194, 191, 17, 115, + 36, 236, 103, 212, 57, 77, 136, 194, 194, 2, 200, 250, 225, 11, 2, 205, + 147, 247, 133, 225, 11, 2, 247, 133, 225, 11, 2, 251, 51, 225, 11, 2, + 199, 2, 225, 11, 2, 206, 100, 225, 11, 1, 63, 225, 11, 1, 252, 168, 225, + 11, 1, 68, 225, 11, 1, 226, 120, 225, 11, 1, 66, 225, 11, 1, 199, 245, + 225, 11, 1, 110, 144, 225, 11, 1, 110, 159, 225, 11, 1, 69, 225, 11, 1, + 237, 54, 225, 11, 1, 251, 200, 225, 11, 1, 72, 225, 11, 1, 214, 102, 225, + 11, 1, 250, 150, 225, 11, 1, 155, 225, 11, 1, 224, 146, 225, 11, 1, 234, + 123, 225, 11, 1, 233, 230, 225, 11, 1, 217, 71, 225, 11, 1, 247, 174, + 225, 11, 1, 247, 16, 225, 11, 1, 225, 214, 225, 11, 1, 225, 180, 225, 11, + 1, 215, 109, 225, 11, 1, 201, 78, 225, 11, 1, 201, 66, 225, 11, 1, 240, + 41, 225, 11, 1, 240, 25, 225, 11, 1, 216, 86, 225, 11, 1, 189, 225, 11, + 1, 202, 233, 225, 11, 1, 240, 136, 225, 11, 1, 239, 176, 225, 11, 1, 176, + 225, 11, 1, 161, 225, 11, 1, 213, 6, 225, 11, 1, 249, 145, 225, 11, 1, + 248, 197, 225, 11, 1, 166, 225, 11, 1, 164, 225, 11, 1, 169, 225, 11, 1, + 209, 181, 225, 11, 1, 172, 225, 11, 1, 222, 37, 225, 11, 1, 199, 152, + 225, 11, 1, 207, 50, 225, 11, 1, 205, 80, 225, 11, 1, 183, 225, 11, 1, + 142, 225, 11, 2, 215, 149, 225, 11, 2, 250, 132, 225, 11, 18, 2, 252, + 168, 225, 11, 18, 2, 68, 225, 11, 18, 2, 226, 120, 225, 11, 18, 2, 66, + 225, 11, 18, 2, 199, 245, 225, 11, 18, 2, 110, 144, 225, 11, 18, 2, 110, + 209, 182, 225, 11, 18, 2, 69, 225, 11, 18, 2, 237, 54, 225, 11, 18, 2, + 251, 200, 225, 11, 18, 2, 72, 225, 11, 18, 2, 214, 102, 225, 11, 18, 2, + 250, 150, 225, 11, 2, 199, 7, 225, 11, 222, 158, 78, 225, 11, 251, 201, + 222, 158, 78, 225, 11, 1, 235, 239, 225, 11, 1, 110, 209, 182, 225, 11, + 1, 110, 222, 38, 225, 11, 18, 2, 110, 159, 225, 11, 18, 2, 110, 222, 38, + 225, 11, 17, 195, 79, 225, 11, 17, 100, 225, 11, 17, 102, 225, 11, 17, + 134, 225, 11, 17, 136, 225, 11, 17, 146, 225, 11, 17, 167, 225, 11, 17, + 178, 225, 11, 17, 171, 225, 11, 17, 182, 225, 11, 2, 225, 165, 225, 11, + 2, 200, 34, 131, 2, 38, 251, 52, 57, 131, 2, 247, 133, 131, 2, 251, 51, + 131, 2, 199, 2, 131, 1, 63, 131, 1, 252, 168, 131, 1, 68, 131, 1, 226, + 120, 131, 1, 66, 131, 1, 199, 245, 131, 1, 110, 144, 131, 1, 110, 159, + 131, 1, 69, 131, 1, 237, 54, 131, 1, 251, 200, 131, 1, 72, 131, 1, 214, + 102, 131, 1, 250, 150, 131, 1, 155, 131, 1, 224, 146, 131, 1, 234, 123, + 131, 1, 233, 230, 131, 1, 217, 71, 131, 1, 247, 174, 131, 1, 247, 16, + 131, 1, 225, 214, 131, 1, 225, 180, 131, 1, 215, 109, 131, 1, 201, 78, + 131, 1, 201, 66, 131, 1, 240, 41, 131, 1, 240, 25, 131, 1, 216, 86, 131, + 1, 189, 131, 1, 202, 233, 131, 1, 240, 136, 131, 1, 239, 176, 131, 1, + 176, 131, 1, 216, 68, 131, 1, 161, 131, 1, 213, 6, 131, 1, 249, 145, 131, + 1, 248, 197, 131, 1, 166, 131, 1, 164, 131, 1, 169, 131, 1, 209, 181, + 131, 1, 172, 131, 1, 222, 37, 131, 1, 222, 26, 131, 1, 199, 152, 131, 1, 207, 50, 131, 1, 205, 80, 131, 1, 183, 131, 1, 142, 131, 1, 201, 47, 131, - 2, 83, 249, 79, 199, 7, 131, 2, 244, 242, 199, 7, 131, 2, 250, 131, 131, - 18, 2, 252, 167, 131, 18, 2, 68, 131, 18, 2, 226, 119, 131, 18, 2, 66, + 2, 83, 249, 80, 199, 7, 131, 2, 244, 243, 199, 7, 131, 2, 250, 132, 131, + 18, 2, 252, 168, 131, 18, 2, 68, 131, 18, 2, 226, 120, 131, 18, 2, 66, 131, 18, 2, 199, 245, 131, 18, 2, 110, 144, 131, 18, 2, 110, 209, 182, - 131, 18, 2, 69, 131, 18, 2, 237, 53, 131, 18, 2, 251, 199, 131, 18, 2, - 72, 131, 18, 2, 214, 101, 131, 18, 2, 250, 149, 131, 2, 199, 7, 131, 1, - 76, 210, 116, 131, 2, 213, 155, 131, 1, 245, 63, 221, 135, 131, 1, 245, - 63, 196, 148, 131, 1, 245, 63, 222, 26, 131, 250, 150, 222, 157, 78, 131, - 191, 97, 214, 114, 131, 191, 97, 235, 16, 131, 191, 115, 237, 21, 131, + 131, 18, 2, 69, 131, 18, 2, 237, 54, 131, 18, 2, 251, 200, 131, 18, 2, + 72, 131, 18, 2, 214, 102, 131, 18, 2, 250, 150, 131, 2, 199, 7, 131, 1, + 76, 210, 116, 131, 2, 213, 156, 131, 1, 245, 64, 221, 136, 131, 1, 245, + 64, 196, 148, 131, 1, 245, 64, 222, 27, 131, 250, 151, 222, 158, 78, 131, + 191, 97, 214, 115, 131, 191, 97, 235, 17, 131, 191, 115, 237, 22, 131, 191, 97, 200, 237, 131, 191, 97, 203, 14, 131, 191, 115, 200, 236, 131, - 191, 97, 235, 147, 131, 1, 250, 250, 226, 119, 131, 1, 110, 209, 182, - 131, 1, 110, 222, 37, 131, 18, 2, 110, 159, 131, 18, 2, 110, 222, 37, + 191, 97, 235, 148, 131, 1, 250, 251, 226, 120, 131, 1, 110, 209, 182, + 131, 1, 110, 222, 38, 131, 18, 2, 110, 159, 131, 18, 2, 110, 222, 38, 131, 17, 195, 79, 131, 17, 100, 131, 17, 102, 131, 17, 134, 131, 17, 136, 131, 17, 146, 131, 17, 167, 131, 17, 178, 131, 17, 171, 131, 17, 182, - 131, 31, 203, 23, 131, 31, 97, 231, 56, 131, 31, 97, 170, 131, 191, 97, - 211, 86, 131, 191, 97, 232, 224, 131, 191, 115, 211, 84, 131, 191, 97, - 206, 21, 131, 191, 97, 237, 25, 131, 191, 115, 206, 18, 131, 240, 58, 78, - 131, 1, 245, 63, 216, 86, 131, 1, 245, 63, 218, 54, 131, 1, 245, 63, 209, - 182, 131, 1, 245, 63, 159, 131, 1, 245, 63, 222, 37, 131, 1, 245, 63, - 225, 79, 153, 2, 251, 49, 153, 2, 199, 1, 153, 1, 250, 119, 153, 1, 252, - 120, 153, 1, 251, 224, 153, 1, 251, 239, 153, 1, 225, 223, 153, 1, 226, - 118, 153, 1, 199, 236, 153, 1, 199, 239, 153, 1, 225, 249, 153, 1, 225, - 250, 153, 1, 226, 104, 153, 1, 226, 106, 153, 1, 236, 69, 153, 1, 237, - 48, 153, 1, 251, 182, 153, 1, 214, 6, 153, 1, 214, 94, 153, 1, 250, 134, - 153, 1, 251, 136, 224, 213, 153, 1, 220, 87, 224, 213, 153, 1, 251, 136, - 234, 67, 153, 1, 220, 87, 234, 67, 153, 1, 225, 9, 217, 240, 153, 1, 208, - 209, 234, 67, 153, 1, 251, 136, 247, 82, 153, 1, 220, 87, 247, 82, 153, - 1, 251, 136, 225, 195, 153, 1, 220, 87, 225, 195, 153, 1, 203, 159, 217, - 240, 153, 1, 203, 159, 208, 208, 217, 241, 153, 1, 208, 209, 225, 195, - 153, 1, 251, 136, 201, 74, 153, 1, 220, 87, 201, 74, 153, 1, 251, 136, - 240, 31, 153, 1, 220, 87, 240, 31, 153, 1, 218, 83, 217, 193, 153, 1, - 208, 209, 240, 31, 153, 1, 251, 136, 203, 76, 153, 1, 220, 87, 203, 76, - 153, 1, 251, 136, 240, 51, 153, 1, 220, 87, 240, 51, 153, 1, 240, 83, - 217, 193, 153, 1, 208, 209, 240, 51, 153, 1, 251, 136, 213, 99, 153, 1, - 220, 87, 213, 99, 153, 1, 251, 136, 249, 46, 153, 1, 220, 87, 249, 46, - 153, 1, 219, 248, 153, 1, 251, 116, 249, 46, 153, 1, 196, 74, 153, 1, - 210, 189, 153, 1, 240, 83, 222, 205, 153, 1, 199, 120, 153, 1, 203, 159, - 208, 179, 153, 1, 218, 83, 208, 179, 153, 1, 240, 83, 208, 179, 153, 1, - 232, 152, 153, 1, 218, 83, 222, 205, 153, 1, 235, 190, 153, 2, 251, 171, - 153, 18, 2, 251, 234, 153, 18, 2, 224, 170, 251, 241, 153, 18, 2, 239, - 118, 251, 241, 153, 18, 2, 224, 170, 225, 246, 153, 18, 2, 239, 118, 225, - 246, 153, 18, 2, 224, 170, 213, 241, 153, 18, 2, 239, 118, 213, 241, 153, - 18, 2, 234, 111, 153, 18, 2, 223, 246, 153, 18, 2, 239, 118, 223, 246, - 153, 18, 2, 223, 248, 239, 225, 153, 18, 2, 223, 247, 232, 246, 251, 234, - 153, 18, 2, 223, 247, 232, 246, 239, 118, 251, 234, 153, 18, 2, 223, 247, - 232, 246, 234, 66, 153, 18, 2, 234, 66, 153, 222, 49, 17, 195, 79, 153, - 222, 49, 17, 100, 153, 222, 49, 17, 102, 153, 222, 49, 17, 134, 153, 222, - 49, 17, 136, 153, 222, 49, 17, 146, 153, 222, 49, 17, 167, 153, 222, 49, - 17, 178, 153, 222, 49, 17, 171, 153, 222, 49, 17, 182, 153, 18, 2, 239, - 118, 234, 111, 153, 18, 2, 239, 118, 234, 66, 153, 211, 213, 223, 164, - 202, 228, 190, 224, 11, 225, 30, 202, 228, 190, 224, 117, 224, 140, 202, - 228, 190, 224, 117, 224, 108, 202, 228, 190, 224, 117, 224, 103, 202, - 228, 190, 224, 117, 224, 113, 202, 228, 190, 224, 117, 210, 210, 202, - 228, 190, 216, 252, 216, 239, 202, 228, 190, 245, 49, 247, 4, 202, 228, - 190, 245, 49, 245, 59, 202, 228, 190, 245, 49, 247, 3, 202, 228, 190, - 205, 201, 205, 200, 202, 228, 190, 245, 49, 245, 45, 202, 228, 190, 196, - 4, 196, 11, 202, 228, 190, 239, 28, 247, 12, 202, 228, 190, 202, 30, 213, - 113, 202, 228, 190, 202, 170, 202, 222, 202, 228, 190, 202, 170, 217, - 216, 202, 228, 190, 202, 170, 212, 222, 202, 228, 190, 216, 50, 217, 100, - 202, 228, 190, 239, 28, 239, 226, 202, 228, 190, 202, 30, 203, 106, 202, + 131, 31, 203, 23, 131, 31, 97, 231, 57, 131, 31, 97, 170, 131, 191, 97, + 211, 87, 131, 191, 97, 232, 225, 131, 191, 115, 211, 85, 131, 191, 97, + 206, 21, 131, 191, 97, 237, 26, 131, 191, 115, 206, 18, 131, 240, 59, 78, + 131, 1, 245, 64, 216, 87, 131, 1, 245, 64, 218, 55, 131, 1, 245, 64, 209, + 182, 131, 1, 245, 64, 159, 131, 1, 245, 64, 222, 38, 131, 1, 245, 64, + 225, 80, 153, 2, 251, 50, 153, 2, 199, 1, 153, 1, 250, 120, 153, 1, 252, + 121, 153, 1, 251, 225, 153, 1, 251, 240, 153, 1, 225, 224, 153, 1, 226, + 119, 153, 1, 199, 236, 153, 1, 199, 239, 153, 1, 225, 250, 153, 1, 225, + 251, 153, 1, 226, 105, 153, 1, 226, 107, 153, 1, 236, 70, 153, 1, 237, + 49, 153, 1, 251, 183, 153, 1, 214, 7, 153, 1, 214, 95, 153, 1, 250, 135, + 153, 1, 251, 137, 224, 214, 153, 1, 220, 88, 224, 214, 153, 1, 251, 137, + 234, 68, 153, 1, 220, 88, 234, 68, 153, 1, 225, 10, 217, 241, 153, 1, + 208, 209, 234, 68, 153, 1, 251, 137, 247, 83, 153, 1, 220, 88, 247, 83, + 153, 1, 251, 137, 225, 196, 153, 1, 220, 88, 225, 196, 153, 1, 203, 159, + 217, 241, 153, 1, 203, 159, 208, 208, 217, 242, 153, 1, 208, 209, 225, + 196, 153, 1, 251, 137, 201, 74, 153, 1, 220, 88, 201, 74, 153, 1, 251, + 137, 240, 32, 153, 1, 220, 88, 240, 32, 153, 1, 218, 84, 217, 194, 153, + 1, 208, 209, 240, 32, 153, 1, 251, 137, 203, 76, 153, 1, 220, 88, 203, + 76, 153, 1, 251, 137, 240, 52, 153, 1, 220, 88, 240, 52, 153, 1, 240, 84, + 217, 194, 153, 1, 208, 209, 240, 52, 153, 1, 251, 137, 213, 100, 153, 1, + 220, 88, 213, 100, 153, 1, 251, 137, 249, 47, 153, 1, 220, 88, 249, 47, + 153, 1, 219, 249, 153, 1, 251, 117, 249, 47, 153, 1, 196, 74, 153, 1, + 210, 190, 153, 1, 240, 84, 222, 206, 153, 1, 199, 120, 153, 1, 203, 159, + 208, 179, 153, 1, 218, 84, 208, 179, 153, 1, 240, 84, 208, 179, 153, 1, + 232, 153, 153, 1, 218, 84, 222, 206, 153, 1, 235, 191, 153, 2, 251, 172, + 153, 18, 2, 251, 235, 153, 18, 2, 224, 171, 251, 242, 153, 18, 2, 239, + 119, 251, 242, 153, 18, 2, 224, 171, 225, 247, 153, 18, 2, 239, 119, 225, + 247, 153, 18, 2, 224, 171, 213, 242, 153, 18, 2, 239, 119, 213, 242, 153, + 18, 2, 234, 112, 153, 18, 2, 223, 247, 153, 18, 2, 239, 119, 223, 247, + 153, 18, 2, 223, 249, 239, 226, 153, 18, 2, 223, 248, 232, 247, 251, 235, + 153, 18, 2, 223, 248, 232, 247, 239, 119, 251, 235, 153, 18, 2, 223, 248, + 232, 247, 234, 67, 153, 18, 2, 234, 67, 153, 222, 50, 17, 195, 79, 153, + 222, 50, 17, 100, 153, 222, 50, 17, 102, 153, 222, 50, 17, 134, 153, 222, + 50, 17, 136, 153, 222, 50, 17, 146, 153, 222, 50, 17, 167, 153, 222, 50, + 17, 178, 153, 222, 50, 17, 171, 153, 222, 50, 17, 182, 153, 18, 2, 239, + 119, 234, 112, 153, 18, 2, 239, 119, 234, 67, 153, 211, 214, 223, 165, + 202, 228, 190, 224, 12, 225, 31, 202, 228, 190, 224, 118, 224, 141, 202, + 228, 190, 224, 118, 224, 109, 202, 228, 190, 224, 118, 224, 104, 202, + 228, 190, 224, 118, 224, 114, 202, 228, 190, 224, 118, 210, 211, 202, + 228, 190, 216, 253, 216, 240, 202, 228, 190, 245, 50, 247, 5, 202, 228, + 190, 245, 50, 245, 60, 202, 228, 190, 245, 50, 247, 4, 202, 228, 190, + 205, 201, 205, 200, 202, 228, 190, 245, 50, 245, 46, 202, 228, 190, 196, + 4, 196, 11, 202, 228, 190, 239, 29, 247, 13, 202, 228, 190, 202, 30, 213, + 114, 202, 228, 190, 202, 170, 202, 222, 202, 228, 190, 202, 170, 217, + 217, 202, 228, 190, 202, 170, 212, 223, 202, 228, 190, 216, 51, 217, 101, + 202, 228, 190, 239, 29, 239, 227, 202, 228, 190, 202, 30, 203, 106, 202, 228, 190, 202, 170, 202, 136, 202, 228, 190, 202, 170, 202, 229, 202, - 228, 190, 202, 170, 202, 165, 202, 228, 190, 216, 50, 215, 185, 202, 228, - 190, 248, 116, 249, 109, 202, 228, 190, 212, 117, 212, 149, 202, 228, - 190, 212, 234, 212, 224, 202, 228, 190, 235, 51, 235, 238, 202, 228, 190, - 212, 234, 212, 254, 202, 228, 190, 235, 51, 235, 209, 202, 228, 190, 212, - 234, 208, 223, 202, 228, 190, 218, 251, 166, 202, 228, 190, 196, 4, 196, + 228, 190, 202, 170, 202, 165, 202, 228, 190, 216, 51, 215, 186, 202, 228, + 190, 248, 117, 249, 110, 202, 228, 190, 212, 118, 212, 150, 202, 228, + 190, 212, 235, 212, 225, 202, 228, 190, 235, 52, 235, 239, 202, 228, 190, + 212, 235, 212, 255, 202, 228, 190, 235, 52, 235, 210, 202, 228, 190, 212, + 235, 208, 223, 202, 228, 190, 218, 252, 166, 202, 228, 190, 196, 4, 196, 105, 202, 228, 190, 209, 233, 209, 133, 202, 228, 190, 209, 140, 202, - 228, 190, 222, 7, 222, 67, 202, 228, 190, 221, 190, 202, 228, 190, 197, + 228, 190, 222, 8, 222, 68, 202, 228, 190, 221, 191, 202, 228, 190, 197, 35, 197, 156, 202, 228, 190, 205, 201, 208, 239, 202, 228, 190, 205, 201, - 209, 104, 202, 228, 190, 205, 201, 204, 163, 202, 228, 190, 231, 193, - 232, 34, 202, 228, 190, 222, 7, 245, 28, 202, 228, 190, 177, 251, 96, - 202, 228, 190, 231, 193, 216, 40, 202, 228, 190, 213, 216, 202, 228, 190, - 208, 203, 63, 202, 228, 190, 220, 81, 232, 210, 202, 228, 190, 208, 203, - 252, 167, 202, 228, 190, 208, 203, 251, 122, 202, 228, 190, 208, 203, 68, - 202, 228, 190, 208, 203, 226, 119, 202, 228, 190, 208, 203, 200, 99, 202, + 209, 104, 202, 228, 190, 205, 201, 204, 163, 202, 228, 190, 231, 194, + 232, 35, 202, 228, 190, 222, 8, 245, 29, 202, 228, 190, 177, 251, 97, + 202, 228, 190, 231, 194, 216, 41, 202, 228, 190, 213, 217, 202, 228, 190, + 208, 203, 63, 202, 228, 190, 220, 82, 232, 211, 202, 228, 190, 208, 203, + 252, 168, 202, 228, 190, 208, 203, 251, 123, 202, 228, 190, 208, 203, 68, + 202, 228, 190, 208, 203, 226, 120, 202, 228, 190, 208, 203, 200, 99, 202, 228, 190, 208, 203, 200, 97, 202, 228, 190, 208, 203, 66, 202, 228, 190, - 208, 203, 199, 245, 202, 228, 190, 212, 236, 202, 228, 241, 16, 16, 249, - 110, 202, 228, 190, 208, 203, 69, 202, 228, 190, 208, 203, 251, 244, 202, - 228, 190, 208, 203, 72, 202, 228, 190, 208, 203, 251, 200, 220, 75, 202, - 228, 190, 208, 203, 251, 200, 220, 76, 202, 228, 190, 222, 252, 202, 228, - 190, 220, 72, 202, 228, 190, 220, 73, 202, 228, 190, 220, 81, 237, 13, - 202, 228, 190, 220, 81, 202, 169, 202, 228, 190, 220, 81, 201, 183, 202, - 228, 190, 220, 81, 245, 107, 202, 228, 190, 202, 220, 202, 228, 190, 216, - 186, 202, 228, 190, 196, 99, 202, 228, 190, 235, 41, 202, 228, 17, 195, + 208, 203, 199, 245, 202, 228, 190, 212, 237, 202, 228, 241, 17, 16, 249, + 111, 202, 228, 190, 208, 203, 69, 202, 228, 190, 208, 203, 251, 245, 202, + 228, 190, 208, 203, 72, 202, 228, 190, 208, 203, 251, 201, 220, 76, 202, + 228, 190, 208, 203, 251, 201, 220, 77, 202, 228, 190, 222, 253, 202, 228, + 190, 220, 73, 202, 228, 190, 220, 74, 202, 228, 190, 220, 82, 237, 14, + 202, 228, 190, 220, 82, 202, 169, 202, 228, 190, 220, 82, 201, 183, 202, + 228, 190, 220, 82, 245, 108, 202, 228, 190, 202, 220, 202, 228, 190, 216, + 187, 202, 228, 190, 196, 99, 202, 228, 190, 235, 42, 202, 228, 17, 195, 79, 202, 228, 17, 100, 202, 228, 17, 102, 202, 228, 17, 134, 202, 228, 17, 136, 202, 228, 17, 146, 202, 228, 17, 167, 202, 228, 17, 178, 202, - 228, 17, 171, 202, 228, 17, 182, 202, 228, 190, 251, 91, 202, 228, 190, - 224, 114, 222, 231, 1, 224, 10, 222, 231, 1, 224, 117, 204, 108, 222, - 231, 1, 224, 117, 203, 117, 222, 231, 1, 213, 209, 233, 229, 222, 231, 1, - 216, 251, 222, 231, 1, 244, 181, 222, 231, 1, 213, 209, 247, 15, 222, - 231, 1, 205, 201, 203, 117, 222, 231, 1, 213, 209, 225, 179, 222, 231, 1, - 215, 72, 222, 231, 1, 213, 209, 215, 108, 222, 231, 1, 213, 209, 201, 78, - 222, 231, 1, 213, 209, 201, 66, 222, 231, 1, 213, 209, 240, 40, 222, 231, - 1, 213, 209, 240, 24, 222, 231, 1, 213, 209, 216, 85, 222, 231, 1, 239, - 27, 222, 231, 1, 149, 222, 231, 1, 202, 170, 204, 108, 222, 231, 1, 202, - 170, 203, 117, 222, 231, 1, 213, 209, 239, 175, 222, 231, 1, 216, 49, - 222, 231, 1, 248, 115, 222, 231, 1, 212, 116, 222, 231, 1, 212, 234, 204, - 108, 222, 231, 1, 235, 51, 203, 117, 222, 231, 1, 212, 234, 203, 117, - 222, 231, 1, 235, 51, 204, 108, 222, 231, 1, 213, 209, 248, 196, 222, - 231, 1, 218, 250, 222, 231, 1, 196, 3, 222, 231, 1, 222, 7, 222, 67, 222, - 231, 1, 222, 7, 221, 222, 222, 231, 1, 197, 34, 222, 231, 1, 208, 211, - 207, 50, 222, 231, 1, 208, 211, 205, 80, 222, 231, 1, 205, 201, 204, 108, - 222, 231, 1, 231, 193, 204, 108, 222, 231, 1, 213, 209, 222, 36, 222, - 231, 1, 72, 222, 231, 1, 231, 193, 203, 117, 222, 231, 236, 246, 222, - 231, 18, 2, 63, 222, 231, 18, 2, 220, 81, 225, 16, 222, 231, 18, 2, 252, - 167, 222, 231, 18, 2, 251, 122, 222, 231, 18, 2, 68, 222, 231, 18, 2, - 226, 119, 222, 231, 18, 2, 196, 148, 222, 231, 18, 2, 195, 168, 222, 231, - 18, 2, 66, 222, 231, 18, 2, 199, 245, 222, 231, 2, 213, 209, 199, 7, 222, - 231, 18, 2, 220, 81, 223, 244, 222, 231, 207, 100, 2, 222, 6, 222, 231, - 207, 100, 2, 215, 72, 222, 231, 18, 2, 69, 222, 231, 18, 2, 237, 32, 222, - 231, 18, 2, 72, 222, 231, 18, 2, 250, 121, 222, 231, 18, 2, 251, 199, - 222, 231, 224, 11, 172, 222, 231, 152, 220, 81, 237, 13, 222, 231, 152, - 220, 81, 202, 169, 222, 231, 152, 220, 81, 202, 122, 222, 231, 152, 220, - 81, 247, 90, 222, 231, 247, 138, 78, 222, 231, 216, 195, 222, 231, 17, - 195, 79, 222, 231, 17, 100, 222, 231, 17, 102, 222, 231, 17, 134, 222, - 231, 17, 136, 222, 231, 17, 146, 222, 231, 17, 167, 222, 231, 17, 178, - 222, 231, 17, 171, 222, 231, 17, 182, 222, 231, 231, 193, 216, 49, 222, - 231, 231, 193, 218, 250, 222, 231, 1, 224, 118, 233, 143, 222, 231, 1, - 224, 118, 215, 72, 82, 5, 214, 126, 82, 117, 233, 77, 196, 16, 219, 95, - 201, 119, 63, 82, 117, 233, 77, 196, 16, 219, 95, 255, 168, 209, 237, - 249, 10, 166, 82, 117, 233, 77, 196, 16, 219, 95, 255, 168, 233, 77, 201, - 99, 166, 82, 117, 84, 196, 16, 219, 95, 219, 208, 166, 82, 117, 244, 198, - 196, 16, 219, 95, 207, 57, 166, 82, 117, 247, 110, 196, 16, 219, 95, 212, - 223, 207, 43, 166, 82, 117, 196, 16, 219, 95, 201, 99, 207, 43, 166, 82, - 117, 208, 177, 207, 42, 82, 117, 248, 23, 196, 16, 219, 94, 82, 117, 248, - 137, 206, 192, 196, 16, 219, 94, 82, 117, 226, 21, 201, 98, 82, 117, 239, - 218, 201, 99, 248, 22, 82, 117, 207, 42, 82, 117, 215, 77, 207, 42, 82, - 117, 201, 99, 207, 42, 82, 117, 215, 77, 201, 99, 207, 42, 82, 117, 210, - 5, 245, 88, 205, 97, 207, 42, 82, 117, 210, 81, 233, 111, 207, 42, 82, - 117, 247, 110, 255, 172, 209, 145, 219, 207, 181, 247, 141, 82, 117, 233, - 77, 201, 98, 82, 221, 246, 2, 247, 13, 209, 144, 82, 221, 246, 2, 222, - 119, 209, 144, 82, 250, 173, 2, 207, 53, 234, 50, 255, 173, 209, 144, 82, - 250, 173, 2, 255, 170, 161, 82, 250, 173, 2, 208, 148, 201, 93, 82, 2, - 210, 184, 239, 42, 234, 49, 82, 2, 210, 184, 239, 42, 233, 145, 82, 2, - 210, 184, 239, 42, 233, 78, 82, 2, 210, 184, 217, 236, 234, 49, 82, 2, - 210, 184, 217, 236, 233, 145, 82, 2, 210, 184, 239, 42, 210, 184, 217, - 235, 82, 17, 195, 79, 82, 17, 100, 82, 17, 102, 82, 17, 134, 82, 17, 136, + 228, 17, 171, 202, 228, 17, 182, 202, 228, 190, 251, 92, 202, 228, 190, + 224, 115, 222, 232, 1, 224, 11, 222, 232, 1, 224, 118, 204, 108, 222, + 232, 1, 224, 118, 203, 117, 222, 232, 1, 213, 210, 233, 230, 222, 232, 1, + 216, 252, 222, 232, 1, 244, 182, 222, 232, 1, 213, 210, 247, 16, 222, + 232, 1, 205, 201, 203, 117, 222, 232, 1, 213, 210, 225, 180, 222, 232, 1, + 215, 73, 222, 232, 1, 213, 210, 215, 109, 222, 232, 1, 213, 210, 201, 78, + 222, 232, 1, 213, 210, 201, 66, 222, 232, 1, 213, 210, 240, 41, 222, 232, + 1, 213, 210, 240, 25, 222, 232, 1, 213, 210, 216, 86, 222, 232, 1, 239, + 28, 222, 232, 1, 149, 222, 232, 1, 202, 170, 204, 108, 222, 232, 1, 202, + 170, 203, 117, 222, 232, 1, 213, 210, 239, 176, 222, 232, 1, 216, 50, + 222, 232, 1, 248, 116, 222, 232, 1, 212, 117, 222, 232, 1, 212, 235, 204, + 108, 222, 232, 1, 235, 52, 203, 117, 222, 232, 1, 212, 235, 203, 117, + 222, 232, 1, 235, 52, 204, 108, 222, 232, 1, 213, 210, 248, 197, 222, + 232, 1, 218, 251, 222, 232, 1, 196, 3, 222, 232, 1, 222, 8, 222, 68, 222, + 232, 1, 222, 8, 221, 223, 222, 232, 1, 197, 34, 222, 232, 1, 208, 211, + 207, 50, 222, 232, 1, 208, 211, 205, 80, 222, 232, 1, 205, 201, 204, 108, + 222, 232, 1, 231, 194, 204, 108, 222, 232, 1, 213, 210, 222, 37, 222, + 232, 1, 72, 222, 232, 1, 231, 194, 203, 117, 222, 232, 236, 247, 222, + 232, 18, 2, 63, 222, 232, 18, 2, 220, 82, 225, 17, 222, 232, 18, 2, 252, + 168, 222, 232, 18, 2, 251, 123, 222, 232, 18, 2, 68, 222, 232, 18, 2, + 226, 120, 222, 232, 18, 2, 196, 148, 222, 232, 18, 2, 195, 168, 222, 232, + 18, 2, 66, 222, 232, 18, 2, 199, 245, 222, 232, 2, 213, 210, 199, 7, 222, + 232, 18, 2, 220, 82, 223, 245, 222, 232, 207, 100, 2, 222, 7, 222, 232, + 207, 100, 2, 215, 73, 222, 232, 18, 2, 69, 222, 232, 18, 2, 237, 33, 222, + 232, 18, 2, 72, 222, 232, 18, 2, 250, 122, 222, 232, 18, 2, 251, 200, + 222, 232, 224, 12, 172, 222, 232, 152, 220, 82, 237, 14, 222, 232, 152, + 220, 82, 202, 169, 222, 232, 152, 220, 82, 202, 122, 222, 232, 152, 220, + 82, 247, 91, 222, 232, 247, 139, 78, 222, 232, 216, 196, 222, 232, 17, + 195, 79, 222, 232, 17, 100, 222, 232, 17, 102, 222, 232, 17, 134, 222, + 232, 17, 136, 222, 232, 17, 146, 222, 232, 17, 167, 222, 232, 17, 178, + 222, 232, 17, 171, 222, 232, 17, 182, 222, 232, 231, 194, 216, 50, 222, + 232, 231, 194, 218, 251, 222, 232, 1, 224, 119, 233, 144, 222, 232, 1, + 224, 119, 215, 73, 82, 5, 214, 127, 82, 117, 233, 78, 196, 16, 219, 96, + 201, 119, 63, 82, 117, 233, 78, 196, 16, 219, 96, 255, 169, 209, 237, + 249, 11, 166, 82, 117, 233, 78, 196, 16, 219, 96, 255, 169, 233, 78, 201, + 99, 166, 82, 117, 84, 196, 16, 219, 96, 219, 209, 166, 82, 117, 244, 199, + 196, 16, 219, 96, 207, 57, 166, 82, 117, 247, 111, 196, 16, 219, 96, 212, + 224, 207, 43, 166, 82, 117, 196, 16, 219, 96, 201, 99, 207, 43, 166, 82, + 117, 208, 177, 207, 42, 82, 117, 248, 24, 196, 16, 219, 95, 82, 117, 248, + 138, 206, 192, 196, 16, 219, 95, 82, 117, 226, 22, 201, 98, 82, 117, 239, + 219, 201, 99, 248, 23, 82, 117, 207, 42, 82, 117, 215, 78, 207, 42, 82, + 117, 201, 99, 207, 42, 82, 117, 215, 78, 201, 99, 207, 42, 82, 117, 210, + 5, 245, 89, 205, 97, 207, 42, 82, 117, 210, 81, 233, 112, 207, 42, 82, + 117, 247, 111, 255, 173, 209, 145, 219, 208, 181, 247, 142, 82, 117, 233, + 78, 201, 98, 82, 221, 247, 2, 247, 14, 209, 144, 82, 221, 247, 2, 222, + 120, 209, 144, 82, 250, 174, 2, 207, 53, 234, 51, 255, 174, 209, 144, 82, + 250, 174, 2, 255, 171, 161, 82, 250, 174, 2, 208, 148, 201, 93, 82, 2, + 210, 185, 239, 43, 234, 50, 82, 2, 210, 185, 239, 43, 233, 146, 82, 2, + 210, 185, 239, 43, 233, 79, 82, 2, 210, 185, 217, 237, 234, 50, 82, 2, + 210, 185, 217, 237, 233, 146, 82, 2, 210, 185, 239, 43, 210, 185, 217, + 236, 82, 17, 195, 79, 82, 17, 100, 82, 17, 102, 82, 17, 134, 82, 17, 136, 82, 17, 146, 82, 17, 167, 82, 17, 178, 82, 17, 171, 82, 17, 182, 82, 17, 157, 100, 82, 17, 157, 102, 82, 17, 157, 134, 82, 17, 157, 136, 82, 17, 157, 146, 82, 17, 157, 167, 82, 17, 157, 178, 82, 17, 157, 171, 82, 17, - 157, 182, 82, 17, 157, 195, 79, 82, 117, 248, 25, 209, 144, 82, 117, 217, - 61, 247, 208, 215, 89, 195, 13, 82, 117, 247, 110, 255, 172, 209, 145, - 247, 209, 219, 40, 247, 141, 82, 117, 217, 61, 247, 208, 207, 54, 209, - 144, 82, 117, 245, 103, 219, 94, 82, 117, 201, 114, 255, 169, 82, 117, - 233, 60, 209, 145, 233, 17, 82, 117, 233, 60, 209, 145, 233, 23, 82, 117, - 251, 97, 224, 135, 233, 17, 82, 117, 251, 97, 224, 135, 233, 23, 82, 2, - 196, 91, 201, 97, 82, 2, 220, 37, 201, 97, 82, 1, 155, 82, 1, 224, 145, - 82, 1, 234, 122, 82, 1, 233, 229, 82, 1, 217, 70, 82, 1, 247, 173, 82, 1, - 247, 15, 82, 1, 225, 213, 82, 1, 215, 108, 82, 1, 201, 78, 82, 1, 201, - 66, 82, 1, 240, 40, 82, 1, 240, 24, 82, 1, 216, 85, 82, 1, 189, 82, 1, - 202, 233, 82, 1, 240, 135, 82, 1, 239, 175, 82, 1, 176, 82, 1, 161, 82, - 1, 213, 5, 82, 1, 249, 144, 82, 1, 248, 196, 82, 1, 166, 82, 1, 201, 113, - 82, 1, 201, 103, 82, 1, 237, 155, 82, 1, 237, 149, 82, 1, 197, 166, 82, - 1, 195, 74, 82, 1, 195, 115, 82, 1, 255, 175, 82, 1, 164, 82, 1, 169, 82, + 157, 182, 82, 17, 157, 195, 79, 82, 117, 248, 26, 209, 144, 82, 117, 217, + 62, 247, 209, 215, 90, 195, 13, 82, 117, 247, 111, 255, 173, 209, 145, + 247, 210, 219, 41, 247, 142, 82, 117, 217, 62, 247, 209, 207, 54, 209, + 144, 82, 117, 245, 104, 219, 95, 82, 117, 201, 114, 255, 170, 82, 117, + 233, 61, 209, 145, 233, 18, 82, 117, 233, 61, 209, 145, 233, 24, 82, 117, + 251, 98, 224, 136, 233, 18, 82, 117, 251, 98, 224, 136, 233, 24, 82, 2, + 196, 91, 201, 97, 82, 2, 220, 38, 201, 97, 82, 1, 155, 82, 1, 224, 146, + 82, 1, 234, 123, 82, 1, 233, 230, 82, 1, 217, 71, 82, 1, 247, 174, 82, 1, + 247, 16, 82, 1, 225, 214, 82, 1, 215, 109, 82, 1, 201, 78, 82, 1, 201, + 66, 82, 1, 240, 41, 82, 1, 240, 25, 82, 1, 216, 86, 82, 1, 189, 82, 1, + 202, 233, 82, 1, 240, 136, 82, 1, 239, 176, 82, 1, 176, 82, 1, 161, 82, + 1, 213, 6, 82, 1, 249, 145, 82, 1, 248, 197, 82, 1, 166, 82, 1, 201, 113, + 82, 1, 201, 103, 82, 1, 237, 156, 82, 1, 237, 150, 82, 1, 197, 166, 82, + 1, 195, 74, 82, 1, 195, 115, 82, 1, 255, 176, 82, 1, 164, 82, 1, 169, 82, 1, 172, 82, 1, 207, 50, 82, 1, 205, 80, 82, 1, 183, 82, 1, 142, 82, 1, - 63, 82, 1, 223, 200, 82, 1, 235, 96, 169, 82, 1, 224, 35, 82, 1, 209, - 181, 82, 18, 2, 252, 167, 82, 18, 2, 68, 82, 18, 2, 226, 119, 82, 18, 2, + 63, 82, 1, 223, 201, 82, 1, 235, 97, 169, 82, 1, 224, 36, 82, 1, 209, + 181, 82, 18, 2, 252, 168, 82, 18, 2, 68, 82, 18, 2, 226, 120, 82, 18, 2, 66, 82, 18, 2, 199, 245, 82, 18, 2, 110, 144, 82, 18, 2, 110, 209, 182, - 82, 18, 2, 110, 159, 82, 18, 2, 110, 222, 37, 82, 18, 2, 69, 82, 18, 2, - 237, 53, 82, 18, 2, 72, 82, 18, 2, 214, 101, 82, 2, 209, 243, 204, 173, - 217, 71, 209, 232, 82, 2, 209, 237, 249, 9, 82, 18, 2, 210, 89, 68, 82, - 18, 2, 210, 89, 226, 119, 82, 2, 215, 89, 195, 14, 217, 244, 240, 135, - 82, 2, 205, 215, 222, 198, 82, 117, 232, 226, 82, 117, 213, 201, 82, 2, - 222, 201, 209, 144, 82, 2, 196, 96, 209, 144, 82, 2, 222, 202, 201, 114, - 247, 141, 82, 2, 219, 210, 247, 141, 82, 2, 233, 81, 247, 142, 210, 79, - 82, 2, 233, 81, 219, 196, 210, 79, 82, 2, 226, 16, 219, 210, 247, 141, - 82, 204, 152, 2, 222, 202, 201, 114, 247, 141, 82, 204, 152, 2, 219, 210, - 247, 141, 82, 204, 152, 2, 226, 16, 219, 210, 247, 141, 82, 204, 152, 1, - 155, 82, 204, 152, 1, 224, 145, 82, 204, 152, 1, 234, 122, 82, 204, 152, - 1, 233, 229, 82, 204, 152, 1, 217, 70, 82, 204, 152, 1, 247, 173, 82, - 204, 152, 1, 247, 15, 82, 204, 152, 1, 225, 213, 82, 204, 152, 1, 215, - 108, 82, 204, 152, 1, 201, 78, 82, 204, 152, 1, 201, 66, 82, 204, 152, 1, - 240, 40, 82, 204, 152, 1, 240, 24, 82, 204, 152, 1, 216, 85, 82, 204, - 152, 1, 189, 82, 204, 152, 1, 202, 233, 82, 204, 152, 1, 240, 135, 82, - 204, 152, 1, 239, 175, 82, 204, 152, 1, 176, 82, 204, 152, 1, 161, 82, - 204, 152, 1, 213, 5, 82, 204, 152, 1, 249, 144, 82, 204, 152, 1, 248, - 196, 82, 204, 152, 1, 166, 82, 204, 152, 1, 201, 113, 82, 204, 152, 1, - 201, 103, 82, 204, 152, 1, 237, 155, 82, 204, 152, 1, 237, 149, 82, 204, + 82, 18, 2, 110, 159, 82, 18, 2, 110, 222, 38, 82, 18, 2, 69, 82, 18, 2, + 237, 54, 82, 18, 2, 72, 82, 18, 2, 214, 102, 82, 2, 209, 243, 204, 173, + 217, 72, 209, 232, 82, 2, 209, 237, 249, 10, 82, 18, 2, 210, 89, 68, 82, + 18, 2, 210, 89, 226, 120, 82, 2, 215, 90, 195, 14, 217, 245, 240, 136, + 82, 2, 205, 215, 222, 199, 82, 117, 232, 227, 82, 117, 213, 202, 82, 2, + 222, 202, 209, 144, 82, 2, 196, 96, 209, 144, 82, 2, 222, 203, 201, 114, + 247, 142, 82, 2, 219, 211, 247, 142, 82, 2, 233, 82, 247, 143, 210, 79, + 82, 2, 233, 82, 219, 197, 210, 79, 82, 2, 226, 17, 219, 211, 247, 142, + 82, 204, 152, 2, 222, 203, 201, 114, 247, 142, 82, 204, 152, 2, 219, 211, + 247, 142, 82, 204, 152, 2, 226, 17, 219, 211, 247, 142, 82, 204, 152, 1, + 155, 82, 204, 152, 1, 224, 146, 82, 204, 152, 1, 234, 123, 82, 204, 152, + 1, 233, 230, 82, 204, 152, 1, 217, 71, 82, 204, 152, 1, 247, 174, 82, + 204, 152, 1, 247, 16, 82, 204, 152, 1, 225, 214, 82, 204, 152, 1, 215, + 109, 82, 204, 152, 1, 201, 78, 82, 204, 152, 1, 201, 66, 82, 204, 152, 1, + 240, 41, 82, 204, 152, 1, 240, 25, 82, 204, 152, 1, 216, 86, 82, 204, + 152, 1, 189, 82, 204, 152, 1, 202, 233, 82, 204, 152, 1, 240, 136, 82, + 204, 152, 1, 239, 176, 82, 204, 152, 1, 176, 82, 204, 152, 1, 161, 82, + 204, 152, 1, 213, 6, 82, 204, 152, 1, 249, 145, 82, 204, 152, 1, 248, + 197, 82, 204, 152, 1, 166, 82, 204, 152, 1, 201, 113, 82, 204, 152, 1, + 201, 103, 82, 204, 152, 1, 237, 156, 82, 204, 152, 1, 237, 150, 82, 204, 152, 1, 197, 166, 82, 204, 152, 1, 195, 74, 82, 204, 152, 1, 195, 115, - 82, 204, 152, 1, 255, 175, 82, 204, 152, 1, 164, 82, 204, 152, 1, 169, + 82, 204, 152, 1, 255, 176, 82, 204, 152, 1, 164, 82, 204, 152, 1, 169, 82, 204, 152, 1, 172, 82, 204, 152, 1, 207, 50, 82, 204, 152, 1, 205, 80, 82, 204, 152, 1, 183, 82, 204, 152, 1, 142, 82, 204, 152, 1, 63, 82, 204, - 152, 1, 223, 200, 82, 204, 152, 1, 235, 96, 197, 166, 82, 204, 152, 1, - 235, 96, 164, 82, 204, 152, 1, 235, 96, 169, 82, 223, 187, 209, 141, 224, - 145, 82, 223, 187, 209, 141, 224, 146, 247, 209, 219, 40, 247, 141, 82, - 247, 125, 2, 85, 248, 255, 82, 247, 125, 2, 175, 248, 255, 82, 247, 125, - 2, 247, 129, 203, 58, 82, 247, 125, 2, 208, 176, 255, 174, 82, 16, 237, - 216, 248, 20, 82, 16, 210, 183, 209, 244, 82, 16, 213, 228, 234, 48, 82, - 16, 210, 183, 209, 245, 210, 81, 233, 110, 82, 16, 212, 223, 161, 82, 16, - 216, 27, 248, 20, 82, 16, 216, 27, 248, 21, 215, 77, 255, 171, 82, 16, - 216, 27, 248, 21, 233, 79, 255, 171, 82, 16, 216, 27, 248, 21, 247, 209, - 255, 171, 82, 2, 210, 184, 217, 236, 210, 184, 239, 41, 82, 2, 210, 184, - 217, 236, 233, 78, 82, 117, 248, 24, 206, 192, 233, 192, 219, 95, 210, - 80, 82, 117, 218, 252, 196, 16, 233, 192, 219, 95, 210, 80, 82, 117, 215, - 77, 201, 98, 82, 117, 84, 248, 53, 209, 234, 196, 16, 219, 95, 219, 208, - 166, 82, 117, 244, 198, 248, 53, 209, 234, 196, 16, 219, 95, 207, 57, - 166, 210, 21, 204, 69, 55, 222, 182, 204, 69, 55, 210, 21, 204, 69, 2, 3, - 238, 249, 222, 182, 204, 69, 2, 3, 238, 249, 82, 117, 222, 193, 219, 211, - 209, 144, 82, 117, 201, 209, 219, 211, 209, 144, 75, 1, 155, 75, 1, 224, - 145, 75, 1, 234, 122, 75, 1, 233, 229, 75, 1, 217, 70, 75, 1, 247, 173, - 75, 1, 247, 15, 75, 1, 225, 213, 75, 1, 225, 179, 75, 1, 215, 108, 75, 1, - 216, 51, 75, 1, 201, 78, 75, 1, 201, 66, 75, 1, 240, 40, 75, 1, 240, 24, - 75, 1, 216, 85, 75, 1, 189, 75, 1, 202, 233, 75, 1, 240, 135, 75, 1, 239, - 175, 75, 1, 176, 75, 1, 161, 75, 1, 213, 5, 75, 1, 249, 144, 75, 1, 248, - 196, 75, 1, 166, 75, 1, 164, 75, 1, 169, 75, 1, 172, 75, 1, 197, 166, 75, - 1, 183, 75, 1, 142, 75, 1, 222, 36, 75, 1, 63, 75, 1, 207, 25, 63, 75, 1, - 68, 75, 1, 226, 119, 75, 1, 66, 75, 1, 199, 245, 75, 1, 69, 75, 1, 218, - 215, 69, 75, 1, 72, 75, 1, 250, 149, 75, 18, 2, 203, 120, 252, 167, 75, - 18, 2, 252, 167, 75, 18, 2, 68, 75, 18, 2, 226, 119, 75, 18, 2, 66, 75, - 18, 2, 199, 245, 75, 18, 2, 69, 75, 18, 2, 251, 199, 75, 18, 2, 218, 215, - 226, 119, 75, 18, 2, 218, 215, 72, 75, 18, 2, 237, 135, 57, 75, 2, 251, - 50, 75, 2, 76, 60, 75, 2, 199, 2, 75, 2, 199, 7, 75, 2, 250, 198, 75, - 108, 2, 219, 193, 164, 75, 108, 2, 219, 193, 169, 75, 108, 2, 219, 193, - 197, 166, 75, 108, 2, 219, 193, 142, 75, 1, 233, 95, 183, 75, 17, 195, + 152, 1, 223, 201, 82, 204, 152, 1, 235, 97, 197, 166, 82, 204, 152, 1, + 235, 97, 164, 82, 204, 152, 1, 235, 97, 169, 82, 223, 188, 209, 141, 224, + 146, 82, 223, 188, 209, 141, 224, 147, 247, 210, 219, 41, 247, 142, 82, + 247, 126, 2, 85, 249, 0, 82, 247, 126, 2, 175, 249, 0, 82, 247, 126, 2, + 247, 130, 203, 58, 82, 247, 126, 2, 208, 176, 255, 175, 82, 16, 237, 217, + 248, 21, 82, 16, 210, 184, 209, 244, 82, 16, 213, 229, 234, 49, 82, 16, + 210, 184, 209, 245, 210, 81, 233, 111, 82, 16, 212, 224, 161, 82, 16, + 216, 28, 248, 21, 82, 16, 216, 28, 248, 22, 215, 78, 255, 172, 82, 16, + 216, 28, 248, 22, 233, 80, 255, 172, 82, 16, 216, 28, 248, 22, 247, 210, + 255, 172, 82, 2, 210, 185, 217, 237, 210, 185, 239, 42, 82, 2, 210, 185, + 217, 237, 233, 79, 82, 117, 248, 25, 206, 192, 233, 193, 219, 96, 210, + 80, 82, 117, 218, 253, 196, 16, 233, 193, 219, 96, 210, 80, 82, 117, 215, + 78, 201, 98, 82, 117, 84, 248, 54, 209, 234, 196, 16, 219, 96, 219, 209, + 166, 82, 117, 244, 199, 248, 54, 209, 234, 196, 16, 219, 96, 207, 57, + 166, 210, 21, 204, 69, 55, 222, 183, 204, 69, 55, 210, 21, 204, 69, 2, 3, + 238, 250, 222, 183, 204, 69, 2, 3, 238, 250, 82, 117, 222, 194, 219, 212, + 209, 144, 82, 117, 201, 209, 219, 212, 209, 144, 75, 1, 155, 75, 1, 224, + 146, 75, 1, 234, 123, 75, 1, 233, 230, 75, 1, 217, 71, 75, 1, 247, 174, + 75, 1, 247, 16, 75, 1, 225, 214, 75, 1, 225, 180, 75, 1, 215, 109, 75, 1, + 216, 52, 75, 1, 201, 78, 75, 1, 201, 66, 75, 1, 240, 41, 75, 1, 240, 25, + 75, 1, 216, 86, 75, 1, 189, 75, 1, 202, 233, 75, 1, 240, 136, 75, 1, 239, + 176, 75, 1, 176, 75, 1, 161, 75, 1, 213, 6, 75, 1, 249, 145, 75, 1, 248, + 197, 75, 1, 166, 75, 1, 164, 75, 1, 169, 75, 1, 172, 75, 1, 197, 166, 75, + 1, 183, 75, 1, 142, 75, 1, 222, 37, 75, 1, 63, 75, 1, 207, 25, 63, 75, 1, + 68, 75, 1, 226, 120, 75, 1, 66, 75, 1, 199, 245, 75, 1, 69, 75, 1, 218, + 216, 69, 75, 1, 72, 75, 1, 250, 150, 75, 18, 2, 203, 120, 252, 168, 75, + 18, 2, 252, 168, 75, 18, 2, 68, 75, 18, 2, 226, 120, 75, 18, 2, 66, 75, + 18, 2, 199, 245, 75, 18, 2, 69, 75, 18, 2, 251, 200, 75, 18, 2, 218, 216, + 226, 120, 75, 18, 2, 218, 216, 72, 75, 18, 2, 237, 136, 57, 75, 2, 251, + 51, 75, 2, 76, 60, 75, 2, 199, 2, 75, 2, 199, 7, 75, 2, 250, 199, 75, + 108, 2, 219, 194, 164, 75, 108, 2, 219, 194, 169, 75, 108, 2, 219, 194, + 197, 166, 75, 108, 2, 219, 194, 142, 75, 1, 233, 96, 183, 75, 17, 195, 79, 75, 17, 100, 75, 17, 102, 75, 17, 134, 75, 17, 136, 75, 17, 146, 75, - 17, 167, 75, 17, 178, 75, 17, 171, 75, 17, 182, 75, 2, 222, 46, 208, 132, - 75, 2, 208, 132, 75, 16, 221, 255, 75, 16, 244, 151, 75, 16, 251, 220, - 75, 16, 234, 28, 75, 1, 207, 50, 75, 1, 205, 80, 75, 1, 110, 144, 75, 1, - 110, 209, 182, 75, 1, 110, 159, 75, 1, 110, 222, 37, 75, 18, 2, 110, 144, - 75, 18, 2, 110, 209, 182, 75, 18, 2, 110, 159, 75, 18, 2, 110, 222, 37, - 75, 1, 218, 215, 217, 70, 75, 1, 218, 215, 225, 179, 75, 1, 218, 215, - 249, 44, 75, 1, 218, 215, 249, 39, 75, 108, 2, 218, 215, 219, 193, 176, - 75, 108, 2, 218, 215, 219, 193, 166, 75, 108, 2, 218, 215, 219, 193, 172, - 75, 1, 207, 56, 224, 247, 207, 50, 75, 18, 2, 207, 56, 224, 247, 236, - 115, 75, 152, 117, 207, 56, 224, 247, 232, 160, 75, 152, 117, 207, 56, - 224, 247, 224, 209, 212, 233, 75, 1, 197, 86, 211, 178, 224, 247, 202, - 233, 75, 1, 197, 86, 211, 178, 224, 247, 211, 184, 75, 18, 2, 197, 86, - 211, 178, 224, 247, 236, 115, 75, 18, 2, 197, 86, 211, 178, 224, 247, - 200, 99, 75, 2, 197, 86, 211, 178, 224, 247, 202, 10, 75, 2, 197, 86, - 211, 178, 224, 247, 202, 9, 75, 2, 197, 86, 211, 178, 224, 247, 202, 8, - 75, 2, 197, 86, 211, 178, 224, 247, 202, 7, 75, 2, 197, 86, 211, 178, - 224, 247, 202, 6, 75, 1, 237, 66, 211, 178, 224, 247, 216, 85, 75, 1, - 237, 66, 211, 178, 224, 247, 195, 175, 75, 1, 237, 66, 211, 178, 224, - 247, 233, 194, 75, 18, 2, 234, 43, 224, 247, 68, 75, 18, 2, 224, 214, - 214, 163, 75, 18, 2, 224, 214, 66, 75, 18, 2, 224, 214, 237, 53, 75, 1, - 207, 25, 155, 75, 1, 207, 25, 224, 145, 75, 1, 207, 25, 234, 122, 75, 1, - 207, 25, 247, 173, 75, 1, 207, 25, 195, 115, 75, 1, 207, 25, 215, 108, - 75, 1, 207, 25, 240, 135, 75, 1, 207, 25, 176, 75, 1, 207, 25, 213, 5, - 75, 1, 207, 25, 235, 238, 75, 1, 207, 25, 249, 144, 75, 1, 207, 25, 202, - 233, 75, 1, 207, 25, 142, 75, 108, 2, 207, 25, 219, 193, 197, 166, 75, - 18, 2, 207, 25, 252, 167, 75, 18, 2, 207, 25, 69, 75, 18, 2, 207, 25, - 237, 135, 57, 75, 18, 2, 207, 25, 48, 196, 148, 75, 2, 207, 25, 202, 9, - 75, 2, 207, 25, 202, 8, 75, 2, 207, 25, 202, 6, 75, 2, 207, 25, 202, 5, - 75, 2, 207, 25, 241, 90, 202, 9, 75, 2, 207, 25, 241, 90, 202, 8, 75, 2, - 207, 25, 241, 90, 236, 232, 202, 11, 75, 1, 209, 119, 213, 211, 235, 238, - 75, 2, 209, 119, 213, 211, 202, 6, 75, 207, 25, 17, 195, 79, 75, 207, 25, - 17, 100, 75, 207, 25, 17, 102, 75, 207, 25, 17, 134, 75, 207, 25, 17, - 136, 75, 207, 25, 17, 146, 75, 207, 25, 17, 167, 75, 207, 25, 17, 178, - 75, 207, 25, 17, 171, 75, 207, 25, 17, 182, 75, 2, 224, 138, 202, 10, 75, - 2, 224, 138, 202, 8, 75, 18, 2, 251, 185, 63, 75, 18, 2, 251, 185, 251, - 199, 75, 16, 207, 25, 100, 75, 16, 207, 25, 236, 88, 94, 6, 1, 251, 105, - 94, 6, 1, 249, 92, 94, 6, 1, 234, 92, 94, 6, 1, 239, 5, 94, 6, 1, 236, - 229, 94, 6, 1, 199, 16, 94, 6, 1, 195, 82, 94, 6, 1, 203, 114, 94, 6, 1, - 226, 85, 94, 6, 1, 225, 16, 94, 6, 1, 222, 221, 94, 6, 1, 220, 61, 94, 6, - 1, 217, 210, 94, 6, 1, 214, 118, 94, 6, 1, 213, 156, 94, 6, 1, 195, 70, - 94, 6, 1, 210, 228, 94, 6, 1, 208, 219, 94, 6, 1, 203, 101, 94, 6, 1, - 200, 72, 94, 6, 1, 212, 253, 94, 6, 1, 224, 133, 94, 6, 1, 233, 220, 94, - 6, 1, 211, 143, 94, 6, 1, 206, 211, 94, 6, 1, 245, 61, 94, 6, 1, 247, - 141, 94, 6, 1, 225, 161, 94, 6, 1, 244, 255, 94, 6, 1, 246, 255, 94, 6, - 1, 196, 206, 94, 6, 1, 225, 176, 94, 6, 1, 232, 241, 94, 6, 1, 232, 146, - 94, 6, 1, 232, 57, 94, 6, 1, 197, 109, 94, 6, 1, 232, 174, 94, 6, 1, 231, - 180, 94, 6, 1, 196, 5, 94, 6, 1, 251, 233, 94, 1, 251, 105, 94, 1, 249, - 92, 94, 1, 234, 92, 94, 1, 239, 5, 94, 1, 236, 229, 94, 1, 199, 16, 94, - 1, 195, 82, 94, 1, 203, 114, 94, 1, 226, 85, 94, 1, 225, 16, 94, 1, 222, - 221, 94, 1, 220, 61, 94, 1, 217, 210, 94, 1, 214, 118, 94, 1, 213, 156, - 94, 1, 195, 70, 94, 1, 210, 228, 94, 1, 208, 219, 94, 1, 203, 101, 94, 1, - 200, 72, 94, 1, 212, 253, 94, 1, 224, 133, 94, 1, 233, 220, 94, 1, 211, - 143, 94, 1, 206, 211, 94, 1, 245, 61, 94, 1, 247, 141, 94, 1, 225, 161, - 94, 1, 244, 255, 94, 1, 246, 255, 94, 1, 196, 206, 94, 1, 225, 176, 94, - 1, 232, 241, 94, 1, 232, 146, 94, 1, 232, 57, 94, 1, 197, 109, 94, 1, - 232, 174, 94, 1, 231, 180, 94, 1, 235, 152, 94, 1, 196, 5, 94, 1, 236, - 248, 94, 1, 163, 234, 92, 94, 1, 251, 193, 94, 213, 153, 207, 90, 73, 1, - 94, 217, 210, 94, 1, 251, 233, 94, 1, 232, 172, 55, 94, 1, 223, 72, 55, - 29, 137, 224, 47, 29, 137, 205, 72, 29, 137, 216, 207, 29, 137, 202, 97, - 29, 137, 205, 61, 29, 137, 210, 54, 29, 137, 219, 55, 29, 137, 212, 205, - 29, 137, 205, 69, 29, 137, 206, 52, 29, 137, 205, 66, 29, 137, 226, 142, - 29, 137, 245, 5, 29, 137, 205, 76, 29, 137, 245, 70, 29, 137, 224, 121, - 29, 137, 202, 191, 29, 137, 212, 243, 29, 137, 232, 54, 29, 137, 216, - 203, 29, 137, 205, 70, 29, 137, 216, 197, 29, 137, 216, 201, 29, 137, - 202, 94, 29, 137, 210, 42, 29, 137, 205, 68, 29, 137, 210, 52, 29, 137, - 224, 253, 29, 137, 219, 48, 29, 137, 225, 0, 29, 137, 212, 200, 29, 137, - 212, 198, 29, 137, 212, 186, 29, 137, 212, 194, 29, 137, 212, 192, 29, - 137, 212, 189, 29, 137, 212, 191, 29, 137, 212, 188, 29, 137, 212, 193, - 29, 137, 212, 203, 29, 137, 212, 204, 29, 137, 212, 187, 29, 137, 212, - 197, 29, 137, 224, 254, 29, 137, 224, 252, 29, 137, 206, 45, 29, 137, - 206, 43, 29, 137, 206, 35, 29, 137, 206, 38, 29, 137, 206, 44, 29, 137, - 206, 40, 29, 137, 206, 39, 29, 137, 206, 37, 29, 137, 206, 48, 29, 137, - 206, 50, 29, 137, 206, 51, 29, 137, 206, 46, 29, 137, 206, 36, 29, 137, - 206, 41, 29, 137, 206, 49, 29, 137, 245, 52, 29, 137, 245, 50, 29, 137, - 247, 28, 29, 137, 247, 26, 29, 137, 213, 173, 29, 137, 226, 137, 29, 137, - 226, 128, 29, 137, 226, 136, 29, 137, 226, 133, 29, 137, 226, 131, 29, - 137, 226, 135, 29, 137, 205, 73, 29, 137, 226, 140, 29, 137, 226, 141, - 29, 137, 226, 129, 29, 137, 226, 134, 29, 137, 196, 46, 29, 137, 245, 4, - 29, 137, 245, 53, 29, 137, 245, 51, 29, 137, 247, 29, 29, 137, 247, 27, - 29, 137, 245, 68, 29, 137, 245, 69, 29, 137, 245, 54, 29, 137, 247, 30, - 29, 137, 212, 241, 29, 137, 224, 255, 29, 137, 205, 74, 29, 137, 196, 52, - 29, 137, 224, 38, 29, 137, 216, 199, 29, 137, 216, 205, 29, 137, 216, - 204, 29, 137, 202, 91, 29, 137, 235, 133, 29, 225, 101, 235, 133, 29, - 225, 101, 63, 29, 225, 101, 251, 244, 29, 225, 101, 164, 29, 225, 101, - 196, 118, 29, 225, 101, 236, 191, 29, 225, 101, 69, 29, 225, 101, 196, - 56, 29, 225, 101, 196, 69, 29, 225, 101, 72, 29, 225, 101, 197, 166, 29, - 225, 101, 197, 157, 29, 225, 101, 214, 163, 29, 225, 101, 196, 3, 29, - 225, 101, 66, 29, 225, 101, 197, 91, 29, 225, 101, 197, 109, 29, 225, - 101, 197, 70, 29, 225, 101, 195, 217, 29, 225, 101, 236, 115, 29, 225, - 101, 196, 24, 29, 225, 101, 68, 29, 225, 101, 255, 163, 29, 225, 101, - 255, 162, 29, 225, 101, 196, 132, 29, 225, 101, 196, 130, 29, 225, 101, - 236, 189, 29, 225, 101, 236, 188, 29, 225, 101, 236, 190, 29, 225, 101, - 196, 55, 29, 225, 101, 196, 54, 29, 225, 101, 215, 17, 29, 225, 101, 215, - 18, 29, 225, 101, 215, 11, 29, 225, 101, 215, 16, 29, 225, 101, 215, 14, - 29, 225, 101, 195, 247, 29, 225, 101, 195, 246, 29, 225, 101, 195, 245, - 29, 225, 101, 195, 248, 29, 225, 101, 195, 249, 29, 225, 101, 200, 172, - 29, 225, 101, 200, 171, 29, 225, 101, 200, 169, 29, 225, 101, 200, 165, - 29, 225, 101, 200, 166, 29, 225, 101, 195, 212, 29, 225, 101, 195, 209, - 29, 225, 101, 195, 210, 29, 225, 101, 195, 204, 29, 225, 101, 195, 205, - 29, 225, 101, 195, 206, 29, 225, 101, 195, 208, 29, 225, 101, 236, 109, - 29, 225, 101, 236, 111, 29, 225, 101, 196, 23, 29, 225, 101, 230, 243, - 29, 225, 101, 230, 235, 29, 225, 101, 230, 238, 29, 225, 101, 230, 236, - 29, 225, 101, 230, 240, 29, 225, 101, 230, 242, 29, 225, 101, 251, 5, 29, - 225, 101, 251, 2, 29, 225, 101, 251, 0, 29, 225, 101, 251, 1, 29, 225, - 101, 205, 77, 29, 225, 101, 255, 164, 29, 225, 101, 196, 131, 29, 225, - 101, 196, 53, 29, 225, 101, 215, 13, 29, 225, 101, 215, 12, 29, 116, 224, - 47, 29, 116, 205, 72, 29, 116, 224, 40, 29, 116, 216, 207, 29, 116, 216, - 205, 29, 116, 216, 204, 29, 116, 202, 97, 29, 116, 210, 54, 29, 116, 210, - 49, 29, 116, 210, 46, 29, 116, 210, 39, 29, 116, 210, 34, 29, 116, 210, - 29, 29, 116, 210, 40, 29, 116, 210, 52, 29, 116, 219, 55, 29, 116, 212, - 205, 29, 116, 212, 194, 29, 116, 206, 52, 29, 116, 205, 66, 29, 116, 226, - 142, 29, 116, 245, 5, 29, 116, 245, 70, 29, 116, 224, 121, 29, 116, 202, - 191, 29, 116, 212, 243, 29, 116, 232, 54, 29, 116, 224, 41, 29, 116, 224, - 39, 29, 116, 216, 203, 29, 116, 216, 197, 29, 116, 216, 199, 29, 116, - 216, 202, 29, 116, 216, 198, 29, 116, 202, 94, 29, 116, 202, 91, 29, 116, - 210, 47, 29, 116, 210, 42, 29, 116, 210, 28, 29, 116, 210, 27, 29, 116, - 205, 68, 29, 116, 210, 44, 29, 116, 210, 43, 29, 116, 210, 36, 29, 116, - 210, 38, 29, 116, 210, 51, 29, 116, 210, 31, 29, 116, 210, 41, 29, 116, - 210, 50, 29, 116, 210, 26, 29, 116, 219, 51, 29, 116, 219, 46, 29, 116, - 219, 48, 29, 116, 219, 45, 29, 116, 219, 43, 29, 116, 219, 49, 29, 116, - 219, 54, 29, 116, 219, 52, 29, 116, 225, 0, 29, 116, 212, 196, 29, 116, - 212, 197, 29, 116, 212, 202, 29, 116, 224, 254, 29, 116, 206, 45, 29, - 116, 206, 35, 29, 116, 206, 38, 29, 116, 206, 40, 29, 116, 213, 173, 29, - 116, 226, 137, 29, 116, 226, 130, 29, 116, 205, 73, 29, 116, 226, 138, - 29, 116, 196, 46, 29, 116, 196, 40, 29, 116, 196, 41, 29, 116, 212, 241, - 29, 116, 224, 255, 29, 116, 232, 52, 29, 116, 232, 50, 29, 116, 232, 53, - 29, 116, 232, 51, 29, 116, 196, 52, 29, 116, 224, 43, 29, 116, 224, 42, - 29, 116, 224, 46, 29, 116, 224, 44, 29, 116, 224, 45, 29, 116, 205, 70, - 35, 5, 142, 35, 5, 231, 74, 35, 5, 232, 70, 35, 5, 232, 245, 35, 5, 232, - 117, 35, 5, 232, 146, 35, 5, 231, 192, 35, 5, 231, 183, 35, 5, 172, 35, - 5, 221, 190, 35, 5, 222, 108, 35, 5, 223, 81, 35, 5, 222, 187, 35, 5, - 222, 196, 35, 5, 222, 6, 35, 5, 221, 158, 35, 5, 232, 79, 35, 5, 232, 73, - 35, 5, 232, 75, 35, 5, 232, 78, 35, 5, 232, 76, 35, 5, 232, 77, 35, 5, - 232, 74, 35, 5, 232, 72, 35, 5, 166, 35, 5, 218, 144, 35, 5, 219, 77, 35, - 5, 220, 118, 35, 5, 219, 187, 35, 5, 219, 206, 35, 5, 218, 250, 35, 5, - 218, 71, 35, 5, 203, 227, 35, 5, 203, 221, 35, 5, 203, 223, 35, 5, 203, - 226, 35, 5, 203, 224, 35, 5, 203, 225, 35, 5, 203, 222, 35, 5, 203, 220, - 35, 5, 169, 35, 5, 209, 140, 35, 5, 210, 72, 35, 5, 210, 243, 35, 5, 210, - 154, 35, 5, 210, 182, 35, 5, 209, 232, 35, 5, 209, 98, 35, 5, 183, 35, 5, - 204, 172, 35, 5, 206, 112, 35, 5, 209, 13, 35, 5, 208, 129, 35, 5, 208, - 147, 35, 5, 205, 200, 35, 5, 204, 67, 35, 5, 207, 50, 35, 5, 206, 151, - 35, 5, 206, 223, 35, 5, 207, 45, 35, 5, 206, 253, 35, 5, 206, 255, 35, 5, - 206, 198, 35, 5, 206, 130, 35, 5, 211, 158, 35, 5, 211, 96, 35, 5, 211, - 120, 35, 5, 211, 157, 35, 5, 211, 137, 35, 5, 211, 138, 35, 5, 211, 108, - 35, 5, 211, 107, 35, 5, 211, 49, 35, 5, 211, 45, 35, 5, 211, 48, 35, 5, - 211, 46, 35, 5, 211, 47, 35, 5, 211, 134, 35, 5, 211, 126, 35, 5, 211, - 129, 35, 5, 211, 133, 35, 5, 211, 130, 35, 5, 211, 131, 35, 5, 211, 128, - 35, 5, 211, 125, 35, 5, 211, 121, 35, 5, 211, 124, 35, 5, 211, 122, 35, - 5, 211, 123, 35, 5, 249, 144, 35, 5, 248, 20, 35, 5, 248, 183, 35, 5, - 249, 142, 35, 5, 248, 250, 35, 5, 249, 8, 35, 5, 248, 115, 35, 5, 247, - 223, 35, 5, 199, 152, 35, 5, 197, 220, 35, 5, 199, 34, 35, 5, 199, 151, + 17, 167, 75, 17, 178, 75, 17, 171, 75, 17, 182, 75, 2, 222, 47, 208, 132, + 75, 2, 208, 132, 75, 16, 222, 0, 75, 16, 244, 152, 75, 16, 251, 221, 75, + 16, 234, 29, 75, 1, 207, 50, 75, 1, 205, 80, 75, 1, 110, 144, 75, 1, 110, + 209, 182, 75, 1, 110, 159, 75, 1, 110, 222, 38, 75, 18, 2, 110, 144, 75, + 18, 2, 110, 209, 182, 75, 18, 2, 110, 159, 75, 18, 2, 110, 222, 38, 75, + 1, 218, 216, 217, 71, 75, 1, 218, 216, 225, 180, 75, 1, 218, 216, 249, + 45, 75, 1, 218, 216, 249, 40, 75, 108, 2, 218, 216, 219, 194, 176, 75, + 108, 2, 218, 216, 219, 194, 166, 75, 108, 2, 218, 216, 219, 194, 172, 75, + 1, 207, 56, 224, 248, 207, 50, 75, 18, 2, 207, 56, 224, 248, 236, 116, + 75, 152, 117, 207, 56, 224, 248, 232, 161, 75, 152, 117, 207, 56, 224, + 248, 224, 210, 212, 234, 75, 1, 197, 86, 211, 179, 224, 248, 202, 233, + 75, 1, 197, 86, 211, 179, 224, 248, 211, 185, 75, 18, 2, 197, 86, 211, + 179, 224, 248, 236, 116, 75, 18, 2, 197, 86, 211, 179, 224, 248, 200, 99, + 75, 2, 197, 86, 211, 179, 224, 248, 202, 10, 75, 2, 197, 86, 211, 179, + 224, 248, 202, 9, 75, 2, 197, 86, 211, 179, 224, 248, 202, 8, 75, 2, 197, + 86, 211, 179, 224, 248, 202, 7, 75, 2, 197, 86, 211, 179, 224, 248, 202, + 6, 75, 1, 237, 67, 211, 179, 224, 248, 216, 86, 75, 1, 237, 67, 211, 179, + 224, 248, 195, 175, 75, 1, 237, 67, 211, 179, 224, 248, 233, 195, 75, 18, + 2, 234, 44, 224, 248, 68, 75, 18, 2, 224, 215, 214, 164, 75, 18, 2, 224, + 215, 66, 75, 18, 2, 224, 215, 237, 54, 75, 1, 207, 25, 155, 75, 1, 207, + 25, 224, 146, 75, 1, 207, 25, 234, 123, 75, 1, 207, 25, 247, 174, 75, 1, + 207, 25, 195, 115, 75, 1, 207, 25, 215, 109, 75, 1, 207, 25, 240, 136, + 75, 1, 207, 25, 176, 75, 1, 207, 25, 213, 6, 75, 1, 207, 25, 235, 239, + 75, 1, 207, 25, 249, 145, 75, 1, 207, 25, 202, 233, 75, 1, 207, 25, 142, + 75, 108, 2, 207, 25, 219, 194, 197, 166, 75, 18, 2, 207, 25, 252, 168, + 75, 18, 2, 207, 25, 69, 75, 18, 2, 207, 25, 237, 136, 57, 75, 18, 2, 207, + 25, 48, 196, 148, 75, 2, 207, 25, 202, 9, 75, 2, 207, 25, 202, 8, 75, 2, + 207, 25, 202, 6, 75, 2, 207, 25, 202, 5, 75, 2, 207, 25, 241, 91, 202, 9, + 75, 2, 207, 25, 241, 91, 202, 8, 75, 2, 207, 25, 241, 91, 236, 233, 202, + 11, 75, 1, 209, 119, 213, 212, 235, 239, 75, 2, 209, 119, 213, 212, 202, + 6, 75, 207, 25, 17, 195, 79, 75, 207, 25, 17, 100, 75, 207, 25, 17, 102, + 75, 207, 25, 17, 134, 75, 207, 25, 17, 136, 75, 207, 25, 17, 146, 75, + 207, 25, 17, 167, 75, 207, 25, 17, 178, 75, 207, 25, 17, 171, 75, 207, + 25, 17, 182, 75, 2, 224, 139, 202, 10, 75, 2, 224, 139, 202, 8, 75, 18, + 2, 251, 186, 63, 75, 18, 2, 251, 186, 251, 200, 75, 16, 207, 25, 100, 75, + 16, 207, 25, 236, 89, 94, 6, 1, 251, 106, 94, 6, 1, 249, 93, 94, 6, 1, + 234, 93, 94, 6, 1, 239, 6, 94, 6, 1, 236, 230, 94, 6, 1, 199, 16, 94, 6, + 1, 195, 82, 94, 6, 1, 203, 114, 94, 6, 1, 226, 86, 94, 6, 1, 225, 17, 94, + 6, 1, 222, 222, 94, 6, 1, 220, 62, 94, 6, 1, 217, 211, 94, 6, 1, 214, + 119, 94, 6, 1, 213, 157, 94, 6, 1, 195, 70, 94, 6, 1, 210, 229, 94, 6, 1, + 208, 219, 94, 6, 1, 203, 101, 94, 6, 1, 200, 72, 94, 6, 1, 212, 254, 94, + 6, 1, 224, 134, 94, 6, 1, 233, 221, 94, 6, 1, 211, 144, 94, 6, 1, 206, + 211, 94, 6, 1, 245, 62, 94, 6, 1, 247, 142, 94, 6, 1, 225, 162, 94, 6, 1, + 245, 0, 94, 6, 1, 247, 0, 94, 6, 1, 196, 206, 94, 6, 1, 225, 177, 94, 6, + 1, 232, 242, 94, 6, 1, 232, 147, 94, 6, 1, 232, 58, 94, 6, 1, 197, 109, + 94, 6, 1, 232, 175, 94, 6, 1, 231, 181, 94, 6, 1, 196, 5, 94, 6, 1, 251, + 234, 94, 1, 251, 106, 94, 1, 249, 93, 94, 1, 234, 93, 94, 1, 239, 6, 94, + 1, 236, 230, 94, 1, 199, 16, 94, 1, 195, 82, 94, 1, 203, 114, 94, 1, 226, + 86, 94, 1, 225, 17, 94, 1, 222, 222, 94, 1, 220, 62, 94, 1, 217, 211, 94, + 1, 214, 119, 94, 1, 213, 157, 94, 1, 195, 70, 94, 1, 210, 229, 94, 1, + 208, 219, 94, 1, 203, 101, 94, 1, 200, 72, 94, 1, 212, 254, 94, 1, 224, + 134, 94, 1, 233, 221, 94, 1, 211, 144, 94, 1, 206, 211, 94, 1, 245, 62, + 94, 1, 247, 142, 94, 1, 225, 162, 94, 1, 245, 0, 94, 1, 247, 0, 94, 1, + 196, 206, 94, 1, 225, 177, 94, 1, 232, 242, 94, 1, 232, 147, 94, 1, 232, + 58, 94, 1, 197, 109, 94, 1, 232, 175, 94, 1, 231, 181, 94, 1, 235, 153, + 94, 1, 196, 5, 94, 1, 236, 249, 94, 1, 163, 234, 93, 94, 1, 251, 194, 94, + 213, 154, 207, 90, 73, 1, 94, 217, 211, 94, 1, 251, 234, 94, 1, 232, 173, + 55, 94, 1, 223, 73, 55, 29, 137, 224, 48, 29, 137, 205, 72, 29, 137, 216, + 208, 29, 137, 202, 97, 29, 137, 205, 61, 29, 137, 210, 54, 29, 137, 219, + 56, 29, 137, 212, 206, 29, 137, 205, 69, 29, 137, 206, 52, 29, 137, 205, + 66, 29, 137, 226, 143, 29, 137, 245, 6, 29, 137, 205, 76, 29, 137, 245, + 71, 29, 137, 224, 122, 29, 137, 202, 191, 29, 137, 212, 244, 29, 137, + 232, 55, 29, 137, 216, 204, 29, 137, 205, 70, 29, 137, 216, 198, 29, 137, + 216, 202, 29, 137, 202, 94, 29, 137, 210, 42, 29, 137, 205, 68, 29, 137, + 210, 52, 29, 137, 224, 254, 29, 137, 219, 49, 29, 137, 225, 1, 29, 137, + 212, 201, 29, 137, 212, 199, 29, 137, 212, 187, 29, 137, 212, 195, 29, + 137, 212, 193, 29, 137, 212, 190, 29, 137, 212, 192, 29, 137, 212, 189, + 29, 137, 212, 194, 29, 137, 212, 204, 29, 137, 212, 205, 29, 137, 212, + 188, 29, 137, 212, 198, 29, 137, 224, 255, 29, 137, 224, 253, 29, 137, + 206, 45, 29, 137, 206, 43, 29, 137, 206, 35, 29, 137, 206, 38, 29, 137, + 206, 44, 29, 137, 206, 40, 29, 137, 206, 39, 29, 137, 206, 37, 29, 137, + 206, 48, 29, 137, 206, 50, 29, 137, 206, 51, 29, 137, 206, 46, 29, 137, + 206, 36, 29, 137, 206, 41, 29, 137, 206, 49, 29, 137, 245, 53, 29, 137, + 245, 51, 29, 137, 247, 29, 29, 137, 247, 27, 29, 137, 213, 174, 29, 137, + 226, 138, 29, 137, 226, 129, 29, 137, 226, 137, 29, 137, 226, 134, 29, + 137, 226, 132, 29, 137, 226, 136, 29, 137, 205, 73, 29, 137, 226, 141, + 29, 137, 226, 142, 29, 137, 226, 130, 29, 137, 226, 135, 29, 137, 196, + 46, 29, 137, 245, 5, 29, 137, 245, 54, 29, 137, 245, 52, 29, 137, 247, + 30, 29, 137, 247, 28, 29, 137, 245, 69, 29, 137, 245, 70, 29, 137, 245, + 55, 29, 137, 247, 31, 29, 137, 212, 242, 29, 137, 225, 0, 29, 137, 205, + 74, 29, 137, 196, 52, 29, 137, 224, 39, 29, 137, 216, 200, 29, 137, 216, + 206, 29, 137, 216, 205, 29, 137, 202, 91, 29, 137, 235, 134, 29, 225, + 102, 235, 134, 29, 225, 102, 63, 29, 225, 102, 251, 245, 29, 225, 102, + 164, 29, 225, 102, 196, 118, 29, 225, 102, 236, 192, 29, 225, 102, 69, + 29, 225, 102, 196, 56, 29, 225, 102, 196, 69, 29, 225, 102, 72, 29, 225, + 102, 197, 166, 29, 225, 102, 197, 157, 29, 225, 102, 214, 164, 29, 225, + 102, 196, 3, 29, 225, 102, 66, 29, 225, 102, 197, 91, 29, 225, 102, 197, + 109, 29, 225, 102, 197, 70, 29, 225, 102, 195, 217, 29, 225, 102, 236, + 116, 29, 225, 102, 196, 24, 29, 225, 102, 68, 29, 225, 102, 255, 164, 29, + 225, 102, 255, 163, 29, 225, 102, 196, 132, 29, 225, 102, 196, 130, 29, + 225, 102, 236, 190, 29, 225, 102, 236, 189, 29, 225, 102, 236, 191, 29, + 225, 102, 196, 55, 29, 225, 102, 196, 54, 29, 225, 102, 215, 18, 29, 225, + 102, 215, 19, 29, 225, 102, 215, 12, 29, 225, 102, 215, 17, 29, 225, 102, + 215, 15, 29, 225, 102, 195, 247, 29, 225, 102, 195, 246, 29, 225, 102, + 195, 245, 29, 225, 102, 195, 248, 29, 225, 102, 195, 249, 29, 225, 102, + 200, 172, 29, 225, 102, 200, 171, 29, 225, 102, 200, 169, 29, 225, 102, + 200, 165, 29, 225, 102, 200, 166, 29, 225, 102, 195, 212, 29, 225, 102, + 195, 209, 29, 225, 102, 195, 210, 29, 225, 102, 195, 204, 29, 225, 102, + 195, 205, 29, 225, 102, 195, 206, 29, 225, 102, 195, 208, 29, 225, 102, + 236, 110, 29, 225, 102, 236, 112, 29, 225, 102, 196, 23, 29, 225, 102, + 230, 244, 29, 225, 102, 230, 236, 29, 225, 102, 230, 239, 29, 225, 102, + 230, 237, 29, 225, 102, 230, 241, 29, 225, 102, 230, 243, 29, 225, 102, + 251, 6, 29, 225, 102, 251, 3, 29, 225, 102, 251, 1, 29, 225, 102, 251, 2, + 29, 225, 102, 205, 77, 29, 225, 102, 255, 165, 29, 225, 102, 196, 131, + 29, 225, 102, 196, 53, 29, 225, 102, 215, 14, 29, 225, 102, 215, 13, 29, + 116, 224, 48, 29, 116, 205, 72, 29, 116, 224, 41, 29, 116, 216, 208, 29, + 116, 216, 206, 29, 116, 216, 205, 29, 116, 202, 97, 29, 116, 210, 54, 29, + 116, 210, 49, 29, 116, 210, 46, 29, 116, 210, 39, 29, 116, 210, 34, 29, + 116, 210, 29, 29, 116, 210, 40, 29, 116, 210, 52, 29, 116, 219, 56, 29, + 116, 212, 206, 29, 116, 212, 195, 29, 116, 206, 52, 29, 116, 205, 66, 29, + 116, 226, 143, 29, 116, 245, 6, 29, 116, 245, 71, 29, 116, 224, 122, 29, + 116, 202, 191, 29, 116, 212, 244, 29, 116, 232, 55, 29, 116, 224, 42, 29, + 116, 224, 40, 29, 116, 216, 204, 29, 116, 216, 198, 29, 116, 216, 200, + 29, 116, 216, 203, 29, 116, 216, 199, 29, 116, 202, 94, 29, 116, 202, 91, + 29, 116, 210, 47, 29, 116, 210, 42, 29, 116, 210, 28, 29, 116, 210, 27, + 29, 116, 205, 68, 29, 116, 210, 44, 29, 116, 210, 43, 29, 116, 210, 36, + 29, 116, 210, 38, 29, 116, 210, 51, 29, 116, 210, 31, 29, 116, 210, 41, + 29, 116, 210, 50, 29, 116, 210, 26, 29, 116, 219, 52, 29, 116, 219, 47, + 29, 116, 219, 49, 29, 116, 219, 46, 29, 116, 219, 44, 29, 116, 219, 50, + 29, 116, 219, 55, 29, 116, 219, 53, 29, 116, 225, 1, 29, 116, 212, 197, + 29, 116, 212, 198, 29, 116, 212, 203, 29, 116, 224, 255, 29, 116, 206, + 45, 29, 116, 206, 35, 29, 116, 206, 38, 29, 116, 206, 40, 29, 116, 213, + 174, 29, 116, 226, 138, 29, 116, 226, 131, 29, 116, 205, 73, 29, 116, + 226, 139, 29, 116, 196, 46, 29, 116, 196, 40, 29, 116, 196, 41, 29, 116, + 212, 242, 29, 116, 225, 0, 29, 116, 232, 53, 29, 116, 232, 51, 29, 116, + 232, 54, 29, 116, 232, 52, 29, 116, 196, 52, 29, 116, 224, 44, 29, 116, + 224, 43, 29, 116, 224, 47, 29, 116, 224, 45, 29, 116, 224, 46, 29, 116, + 205, 70, 35, 5, 142, 35, 5, 231, 75, 35, 5, 232, 71, 35, 5, 232, 246, 35, + 5, 232, 118, 35, 5, 232, 147, 35, 5, 231, 193, 35, 5, 231, 184, 35, 5, + 172, 35, 5, 221, 191, 35, 5, 222, 109, 35, 5, 223, 82, 35, 5, 222, 188, + 35, 5, 222, 197, 35, 5, 222, 7, 35, 5, 221, 159, 35, 5, 232, 80, 35, 5, + 232, 74, 35, 5, 232, 76, 35, 5, 232, 79, 35, 5, 232, 77, 35, 5, 232, 78, + 35, 5, 232, 75, 35, 5, 232, 73, 35, 5, 166, 35, 5, 218, 145, 35, 5, 219, + 78, 35, 5, 220, 119, 35, 5, 219, 188, 35, 5, 219, 207, 35, 5, 218, 251, + 35, 5, 218, 72, 35, 5, 203, 227, 35, 5, 203, 221, 35, 5, 203, 223, 35, 5, + 203, 226, 35, 5, 203, 224, 35, 5, 203, 225, 35, 5, 203, 222, 35, 5, 203, + 220, 35, 5, 169, 35, 5, 209, 140, 35, 5, 210, 72, 35, 5, 210, 244, 35, 5, + 210, 155, 35, 5, 210, 183, 35, 5, 209, 232, 35, 5, 209, 98, 35, 5, 183, + 35, 5, 204, 172, 35, 5, 206, 112, 35, 5, 209, 13, 35, 5, 208, 129, 35, 5, + 208, 147, 35, 5, 205, 200, 35, 5, 204, 67, 35, 5, 207, 50, 35, 5, 206, + 151, 35, 5, 206, 223, 35, 5, 207, 45, 35, 5, 206, 253, 35, 5, 206, 255, + 35, 5, 206, 198, 35, 5, 206, 130, 35, 5, 211, 159, 35, 5, 211, 97, 35, 5, + 211, 121, 35, 5, 211, 158, 35, 5, 211, 138, 35, 5, 211, 139, 35, 5, 211, + 109, 35, 5, 211, 108, 35, 5, 211, 50, 35, 5, 211, 46, 35, 5, 211, 49, 35, + 5, 211, 47, 35, 5, 211, 48, 35, 5, 211, 135, 35, 5, 211, 127, 35, 5, 211, + 130, 35, 5, 211, 134, 35, 5, 211, 131, 35, 5, 211, 132, 35, 5, 211, 129, + 35, 5, 211, 126, 35, 5, 211, 122, 35, 5, 211, 125, 35, 5, 211, 123, 35, + 5, 211, 124, 35, 5, 249, 145, 35, 5, 248, 21, 35, 5, 248, 184, 35, 5, + 249, 143, 35, 5, 248, 251, 35, 5, 249, 9, 35, 5, 248, 116, 35, 5, 247, + 224, 35, 5, 199, 152, 35, 5, 197, 220, 35, 5, 199, 34, 35, 5, 199, 151, 35, 5, 199, 113, 35, 5, 199, 118, 35, 5, 198, 248, 35, 5, 197, 209, 35, 5, 189, 35, 5, 201, 40, 35, 5, 202, 122, 35, 5, 203, 162, 35, 5, 203, 48, - 35, 5, 203, 68, 35, 5, 149, 35, 5, 200, 245, 35, 5, 247, 173, 35, 5, 241, - 40, 35, 5, 245, 10, 35, 5, 247, 172, 35, 5, 247, 48, 35, 5, 247, 56, 35, - 5, 244, 181, 35, 5, 240, 253, 35, 5, 196, 208, 35, 5, 196, 177, 35, 5, + 35, 5, 203, 68, 35, 5, 149, 35, 5, 200, 245, 35, 5, 247, 174, 35, 5, 241, + 41, 35, 5, 245, 11, 35, 5, 247, 173, 35, 5, 247, 49, 35, 5, 247, 57, 35, + 5, 244, 182, 35, 5, 240, 254, 35, 5, 196, 208, 35, 5, 196, 177, 35, 5, 196, 196, 35, 5, 196, 207, 35, 5, 196, 201, 35, 5, 196, 202, 35, 5, 196, 185, 35, 5, 196, 184, 35, 5, 196, 170, 35, 5, 196, 166, 35, 5, 196, 169, - 35, 5, 196, 167, 35, 5, 196, 168, 35, 5, 176, 35, 5, 215, 185, 35, 5, - 216, 222, 35, 5, 217, 243, 35, 5, 217, 106, 35, 5, 217, 117, 35, 5, 216, - 49, 35, 5, 215, 117, 35, 5, 215, 108, 35, 5, 215, 65, 35, 5, 215, 88, 35, - 5, 215, 107, 35, 5, 215, 96, 35, 5, 215, 97, 35, 5, 215, 72, 35, 5, 215, - 55, 35, 5, 233, 151, 63, 35, 5, 233, 151, 66, 35, 5, 233, 151, 68, 35, 5, - 233, 151, 252, 167, 35, 5, 233, 151, 237, 53, 35, 5, 233, 151, 69, 35, 5, - 233, 151, 72, 35, 5, 233, 151, 197, 166, 35, 5, 155, 35, 5, 223, 186, 35, - 5, 224, 100, 35, 5, 225, 54, 35, 5, 224, 199, 35, 5, 224, 208, 35, 5, - 224, 10, 35, 5, 224, 5, 35, 5, 223, 135, 35, 5, 223, 128, 35, 5, 223, - 134, 35, 5, 223, 129, 35, 5, 223, 130, 35, 5, 223, 121, 35, 5, 223, 115, - 35, 5, 223, 117, 35, 5, 223, 120, 35, 5, 223, 118, 35, 5, 223, 119, 35, - 5, 223, 116, 35, 5, 223, 114, 35, 5, 223, 110, 35, 5, 223, 113, 35, 5, - 223, 111, 35, 5, 223, 112, 35, 5, 197, 166, 35, 5, 196, 243, 35, 5, 197, + 35, 5, 196, 167, 35, 5, 196, 168, 35, 5, 176, 35, 5, 215, 186, 35, 5, + 216, 223, 35, 5, 217, 244, 35, 5, 217, 107, 35, 5, 217, 118, 35, 5, 216, + 50, 35, 5, 215, 118, 35, 5, 215, 109, 35, 5, 215, 66, 35, 5, 215, 89, 35, + 5, 215, 108, 35, 5, 215, 97, 35, 5, 215, 98, 35, 5, 215, 73, 35, 5, 215, + 56, 35, 5, 233, 152, 63, 35, 5, 233, 152, 66, 35, 5, 233, 152, 68, 35, 5, + 233, 152, 252, 168, 35, 5, 233, 152, 237, 54, 35, 5, 233, 152, 69, 35, 5, + 233, 152, 72, 35, 5, 233, 152, 197, 166, 35, 5, 155, 35, 5, 223, 187, 35, + 5, 224, 101, 35, 5, 225, 55, 35, 5, 224, 200, 35, 5, 224, 209, 35, 5, + 224, 11, 35, 5, 224, 6, 35, 5, 223, 136, 35, 5, 223, 129, 35, 5, 223, + 135, 35, 5, 223, 130, 35, 5, 223, 131, 35, 5, 223, 122, 35, 5, 223, 116, + 35, 5, 223, 118, 35, 5, 223, 121, 35, 5, 223, 119, 35, 5, 223, 120, 35, + 5, 223, 117, 35, 5, 223, 115, 35, 5, 223, 111, 35, 5, 223, 114, 35, 5, + 223, 112, 35, 5, 223, 113, 35, 5, 197, 166, 35, 5, 196, 243, 35, 5, 197, 70, 35, 5, 197, 160, 35, 5, 197, 98, 35, 5, 197, 109, 35, 5, 197, 34, 35, - 5, 197, 26, 35, 5, 212, 252, 63, 35, 5, 212, 252, 66, 35, 5, 212, 252, - 68, 35, 5, 212, 252, 252, 167, 35, 5, 212, 252, 237, 53, 35, 5, 212, 252, - 69, 35, 5, 212, 252, 72, 35, 5, 195, 115, 35, 5, 194, 255, 35, 5, 195, + 5, 197, 26, 35, 5, 212, 253, 63, 35, 5, 212, 253, 66, 35, 5, 212, 253, + 68, 35, 5, 212, 253, 252, 168, 35, 5, 212, 253, 237, 54, 35, 5, 212, 253, + 69, 35, 5, 212, 253, 72, 35, 5, 195, 115, 35, 5, 194, 255, 35, 5, 195, 33, 35, 5, 195, 113, 35, 5, 195, 85, 35, 5, 195, 88, 35, 5, 195, 11, 35, 5, 194, 242, 35, 5, 195, 74, 35, 5, 195, 51, 35, 5, 195, 60, 35, 5, 195, 73, 35, 5, 195, 64, 35, 5, 195, 65, 35, 5, 195, 57, 35, 5, 195, 42, 35, 5, 164, 35, 5, 195, 217, 35, 5, 196, 24, 35, 5, 196, 129, 35, 5, 196, 66, - 35, 5, 196, 69, 35, 5, 196, 3, 35, 5, 195, 243, 35, 5, 240, 135, 35, 5, - 237, 200, 35, 5, 239, 151, 35, 5, 240, 134, 35, 5, 239, 236, 35, 5, 239, - 251, 35, 5, 239, 27, 35, 5, 237, 166, 35, 5, 240, 40, 35, 5, 240, 5, 35, - 5, 240, 17, 35, 5, 240, 39, 35, 5, 240, 27, 35, 5, 240, 28, 35, 5, 240, - 10, 35, 5, 239, 252, 35, 5, 225, 213, 35, 5, 225, 109, 35, 5, 225, 171, - 35, 5, 225, 212, 35, 5, 225, 190, 35, 5, 225, 192, 35, 5, 225, 128, 35, - 5, 225, 87, 35, 5, 234, 122, 35, 5, 233, 75, 35, 5, 233, 191, 35, 5, 234, - 119, 35, 5, 234, 39, 35, 5, 234, 47, 35, 5, 233, 143, 35, 5, 233, 142, - 35, 5, 233, 33, 35, 5, 233, 29, 35, 5, 233, 32, 35, 5, 233, 30, 35, 5, - 233, 31, 35, 5, 234, 9, 35, 5, 233, 245, 35, 5, 233, 255, 35, 5, 234, 8, - 35, 5, 234, 3, 35, 5, 234, 4, 35, 5, 233, 249, 35, 5, 233, 234, 35, 5, + 35, 5, 196, 69, 35, 5, 196, 3, 35, 5, 195, 243, 35, 5, 240, 136, 35, 5, + 237, 201, 35, 5, 239, 152, 35, 5, 240, 135, 35, 5, 239, 237, 35, 5, 239, + 252, 35, 5, 239, 28, 35, 5, 237, 167, 35, 5, 240, 41, 35, 5, 240, 6, 35, + 5, 240, 18, 35, 5, 240, 40, 35, 5, 240, 28, 35, 5, 240, 29, 35, 5, 240, + 11, 35, 5, 239, 253, 35, 5, 225, 214, 35, 5, 225, 110, 35, 5, 225, 172, + 35, 5, 225, 213, 35, 5, 225, 191, 35, 5, 225, 193, 35, 5, 225, 129, 35, + 5, 225, 88, 35, 5, 234, 123, 35, 5, 233, 76, 35, 5, 233, 192, 35, 5, 234, + 120, 35, 5, 234, 40, 35, 5, 234, 48, 35, 5, 233, 144, 35, 5, 233, 143, + 35, 5, 233, 34, 35, 5, 233, 30, 35, 5, 233, 33, 35, 5, 233, 31, 35, 5, + 233, 32, 35, 5, 234, 10, 35, 5, 233, 246, 35, 5, 234, 0, 35, 5, 234, 9, + 35, 5, 234, 4, 35, 5, 234, 5, 35, 5, 233, 250, 35, 5, 233, 235, 35, 5, 202, 233, 35, 5, 202, 142, 35, 5, 202, 195, 35, 5, 202, 232, 35, 5, 202, - 215, 35, 5, 202, 217, 35, 5, 202, 169, 35, 5, 202, 133, 35, 5, 247, 15, - 35, 5, 245, 29, 35, 5, 245, 74, 35, 5, 247, 14, 35, 5, 245, 98, 35, 5, - 245, 102, 35, 5, 245, 48, 35, 5, 245, 18, 35, 5, 213, 5, 35, 5, 212, 225, - 35, 5, 212, 245, 35, 5, 213, 4, 35, 5, 212, 247, 35, 5, 212, 248, 35, 5, - 212, 233, 35, 5, 212, 221, 35, 5, 201, 113, 35, 5, 201, 86, 35, 5, 201, + 215, 35, 5, 202, 217, 35, 5, 202, 169, 35, 5, 202, 133, 35, 5, 247, 16, + 35, 5, 245, 30, 35, 5, 245, 75, 35, 5, 247, 15, 35, 5, 245, 99, 35, 5, + 245, 103, 35, 5, 245, 49, 35, 5, 245, 19, 35, 5, 213, 6, 35, 5, 212, 226, + 35, 5, 212, 246, 35, 5, 213, 5, 35, 5, 212, 248, 35, 5, 212, 249, 35, 5, + 212, 234, 35, 5, 212, 222, 35, 5, 201, 113, 35, 5, 201, 86, 35, 5, 201, 92, 35, 5, 201, 112, 35, 5, 201, 106, 35, 5, 201, 107, 35, 5, 201, 90, 35, 5, 201, 84, 35, 5, 200, 186, 35, 5, 200, 178, 35, 5, 200, 182, 35, 5, 200, 185, 35, 5, 200, 183, 35, 5, 200, 184, 35, 5, 200, 180, 35, 5, 200, - 179, 35, 5, 235, 238, 35, 5, 234, 222, 35, 5, 235, 152, 35, 5, 235, 237, - 35, 5, 235, 181, 35, 5, 235, 188, 35, 5, 235, 50, 35, 5, 234, 200, 35, 5, - 161, 35, 5, 211, 226, 35, 5, 212, 219, 35, 5, 213, 242, 35, 5, 213, 78, - 35, 5, 213, 91, 35, 5, 212, 116, 35, 5, 211, 184, 35, 5, 209, 88, 35, 5, - 218, 60, 35, 5, 234, 194, 35, 38, 234, 35, 26, 18, 222, 157, 78, 35, 38, - 18, 222, 157, 78, 35, 38, 234, 35, 78, 35, 208, 133, 78, 35, 197, 8, 35, - 234, 216, 204, 226, 35, 244, 158, 35, 207, 105, 35, 244, 167, 35, 212, - 31, 244, 167, 35, 211, 78, 78, 35, 213, 153, 207, 90, 35, 17, 100, 35, + 179, 35, 5, 235, 239, 35, 5, 234, 223, 35, 5, 235, 153, 35, 5, 235, 238, + 35, 5, 235, 182, 35, 5, 235, 189, 35, 5, 235, 51, 35, 5, 234, 201, 35, 5, + 161, 35, 5, 211, 227, 35, 5, 212, 220, 35, 5, 213, 243, 35, 5, 213, 79, + 35, 5, 213, 92, 35, 5, 212, 117, 35, 5, 211, 185, 35, 5, 209, 88, 35, 5, + 218, 61, 35, 5, 234, 195, 35, 38, 234, 36, 26, 18, 222, 158, 78, 35, 38, + 18, 222, 158, 78, 35, 38, 234, 36, 78, 35, 208, 133, 78, 35, 197, 8, 35, + 234, 217, 204, 226, 35, 244, 159, 35, 207, 105, 35, 244, 168, 35, 212, + 32, 244, 168, 35, 211, 79, 78, 35, 213, 154, 207, 90, 35, 17, 100, 35, 17, 102, 35, 17, 134, 35, 17, 136, 35, 17, 146, 35, 17, 167, 35, 17, 178, 35, 17, 171, 35, 17, 182, 35, 31, 203, 23, 35, 31, 200, 234, 35, 31, 202, - 177, 35, 31, 235, 13, 35, 31, 235, 144, 35, 31, 206, 13, 35, 31, 207, 65, - 35, 31, 237, 19, 35, 31, 216, 173, 35, 31, 231, 56, 35, 31, 203, 24, 170, - 35, 5, 208, 138, 218, 71, 35, 5, 218, 67, 35, 5, 218, 68, 35, 5, 218, 69, - 35, 5, 208, 138, 247, 223, 35, 5, 247, 220, 35, 5, 247, 221, 35, 5, 247, - 222, 35, 5, 208, 138, 234, 200, 35, 5, 234, 196, 35, 5, 234, 197, 35, 5, - 234, 198, 35, 5, 208, 138, 211, 184, 35, 5, 211, 180, 35, 5, 211, 181, - 35, 5, 211, 182, 35, 202, 12, 117, 196, 6, 35, 202, 12, 117, 239, 196, + 177, 35, 31, 235, 14, 35, 31, 235, 145, 35, 31, 206, 13, 35, 31, 207, 65, + 35, 31, 237, 20, 35, 31, 216, 174, 35, 31, 231, 57, 35, 31, 203, 24, 170, + 35, 5, 208, 138, 218, 72, 35, 5, 218, 68, 35, 5, 218, 69, 35, 5, 218, 70, + 35, 5, 208, 138, 247, 224, 35, 5, 247, 221, 35, 5, 247, 222, 35, 5, 247, + 223, 35, 5, 208, 138, 234, 201, 35, 5, 234, 197, 35, 5, 234, 198, 35, 5, + 234, 199, 35, 5, 208, 138, 211, 185, 35, 5, 211, 181, 35, 5, 211, 182, + 35, 5, 211, 183, 35, 202, 12, 117, 196, 6, 35, 202, 12, 117, 239, 197, 35, 202, 12, 117, 210, 8, 35, 202, 12, 117, 206, 182, 210, 8, 35, 202, - 12, 117, 239, 125, 35, 202, 12, 117, 224, 180, 35, 202, 12, 117, 245, 56, - 35, 202, 12, 117, 232, 59, 35, 202, 12, 117, 239, 195, 35, 202, 12, 117, - 223, 151, 95, 1, 63, 95, 1, 69, 95, 1, 68, 95, 1, 72, 95, 1, 66, 95, 1, - 199, 230, 95, 1, 234, 122, 95, 1, 155, 95, 1, 234, 47, 95, 1, 233, 191, - 95, 1, 233, 143, 95, 1, 233, 75, 95, 1, 233, 35, 95, 1, 142, 95, 1, 232, - 146, 95, 1, 232, 70, 95, 1, 231, 192, 95, 1, 231, 74, 95, 1, 231, 43, 95, - 1, 172, 95, 1, 222, 196, 95, 1, 222, 108, 95, 1, 222, 6, 95, 1, 221, 190, - 95, 1, 221, 159, 95, 1, 166, 95, 1, 219, 206, 95, 1, 219, 77, 95, 1, 218, - 250, 95, 1, 218, 144, 95, 1, 176, 95, 1, 231, 216, 95, 1, 217, 230, 95, - 1, 217, 117, 95, 1, 216, 222, 95, 1, 216, 49, 95, 1, 215, 185, 95, 1, - 215, 119, 95, 1, 211, 95, 95, 1, 211, 81, 95, 1, 211, 74, 95, 1, 211, 64, - 95, 1, 211, 53, 95, 1, 211, 51, 95, 1, 183, 95, 1, 209, 80, 95, 1, 208, + 12, 117, 239, 126, 35, 202, 12, 117, 224, 181, 35, 202, 12, 117, 245, 57, + 35, 202, 12, 117, 232, 60, 35, 202, 12, 117, 239, 196, 35, 202, 12, 117, + 223, 152, 95, 1, 63, 95, 1, 69, 95, 1, 68, 95, 1, 72, 95, 1, 66, 95, 1, + 199, 230, 95, 1, 234, 123, 95, 1, 155, 95, 1, 234, 48, 95, 1, 233, 192, + 95, 1, 233, 144, 95, 1, 233, 76, 95, 1, 233, 36, 95, 1, 142, 95, 1, 232, + 147, 95, 1, 232, 71, 95, 1, 231, 193, 95, 1, 231, 75, 95, 1, 231, 44, 95, + 1, 172, 95, 1, 222, 197, 95, 1, 222, 109, 95, 1, 222, 7, 95, 1, 221, 191, + 95, 1, 221, 160, 95, 1, 166, 95, 1, 219, 207, 95, 1, 219, 78, 95, 1, 218, + 251, 95, 1, 218, 145, 95, 1, 176, 95, 1, 231, 217, 95, 1, 217, 231, 95, + 1, 217, 118, 95, 1, 216, 223, 95, 1, 216, 50, 95, 1, 215, 186, 95, 1, + 215, 120, 95, 1, 211, 96, 95, 1, 211, 82, 95, 1, 211, 75, 95, 1, 211, 65, + 95, 1, 211, 54, 95, 1, 211, 52, 95, 1, 183, 95, 1, 209, 80, 95, 1, 208, 147, 95, 1, 206, 112, 95, 1, 205, 200, 95, 1, 204, 172, 95, 1, 204, 72, - 95, 1, 240, 135, 95, 1, 189, 95, 1, 239, 251, 95, 1, 203, 68, 95, 1, 239, - 151, 95, 1, 202, 122, 95, 1, 239, 27, 95, 1, 237, 200, 95, 1, 237, 169, - 95, 1, 239, 39, 95, 1, 202, 47, 95, 1, 202, 46, 95, 1, 202, 35, 95, 1, + 95, 1, 240, 136, 95, 1, 189, 95, 1, 239, 252, 95, 1, 203, 68, 95, 1, 239, + 152, 95, 1, 202, 122, 95, 1, 239, 28, 95, 1, 237, 201, 95, 1, 237, 170, + 95, 1, 239, 40, 95, 1, 202, 47, 95, 1, 202, 46, 95, 1, 202, 35, 95, 1, 202, 34, 95, 1, 202, 33, 95, 1, 202, 32, 95, 1, 201, 113, 95, 1, 201, 107, 95, 1, 201, 92, 95, 1, 201, 90, 95, 1, 201, 86, 95, 1, 201, 85, 95, 1, 197, 166, 95, 1, 197, 109, 95, 1, 197, 70, 95, 1, 197, 34, 95, 1, 196, 243, 95, 1, 196, 230, 95, 1, 164, 95, 1, 196, 69, 95, 1, 196, 24, 95, 1, - 196, 3, 95, 1, 195, 217, 95, 1, 195, 176, 95, 1, 218, 78, 95, 4, 1, 196, + 196, 3, 95, 1, 195, 217, 95, 1, 195, 176, 95, 1, 218, 79, 95, 4, 1, 196, 69, 95, 4, 1, 196, 24, 95, 4, 1, 196, 3, 95, 4, 1, 195, 217, 95, 4, 1, - 195, 176, 95, 4, 1, 218, 78, 21, 22, 231, 6, 21, 22, 69, 21, 22, 252, - 131, 21, 22, 68, 21, 22, 226, 119, 21, 22, 72, 21, 22, 214, 101, 21, 22, - 196, 147, 214, 101, 21, 22, 92, 237, 53, 21, 22, 92, 68, 21, 22, 63, 21, - 22, 252, 167, 21, 22, 197, 109, 21, 22, 197, 87, 197, 109, 21, 22, 197, + 195, 176, 95, 4, 1, 218, 79, 21, 22, 231, 7, 21, 22, 69, 21, 22, 252, + 132, 21, 22, 68, 21, 22, 226, 120, 21, 22, 72, 21, 22, 214, 102, 21, 22, + 196, 147, 214, 102, 21, 22, 92, 237, 54, 21, 22, 92, 68, 21, 22, 63, 21, + 22, 252, 168, 21, 22, 197, 109, 21, 22, 197, 87, 197, 109, 21, 22, 197, 70, 21, 22, 197, 87, 197, 70, 21, 22, 197, 54, 21, 22, 197, 87, 197, 54, 21, 22, 197, 34, 21, 22, 197, 87, 197, 34, 21, 22, 197, 15, 21, 22, 197, - 87, 197, 15, 21, 22, 217, 204, 197, 15, 21, 22, 197, 166, 21, 22, 197, + 87, 197, 15, 21, 22, 217, 205, 197, 15, 21, 22, 197, 166, 21, 22, 197, 87, 197, 166, 21, 22, 197, 160, 21, 22, 197, 87, 197, 160, 21, 22, 217, - 204, 197, 160, 21, 22, 251, 199, 21, 22, 196, 147, 197, 199, 21, 22, 233, - 151, 204, 226, 21, 22, 48, 186, 21, 22, 48, 233, 99, 21, 22, 48, 248, 84, - 157, 210, 2, 21, 22, 48, 201, 243, 157, 210, 2, 21, 22, 48, 53, 157, 210, - 2, 21, 22, 48, 210, 2, 21, 22, 48, 52, 186, 21, 22, 48, 52, 206, 182, 83, - 204, 183, 21, 22, 48, 112, 238, 252, 21, 22, 48, 206, 182, 231, 154, 106, - 21, 22, 48, 212, 124, 21, 22, 48, 135, 203, 147, 21, 22, 236, 229, 21, - 22, 226, 85, 21, 22, 214, 118, 21, 22, 251, 105, 21, 22, 213, 91, 21, 22, - 213, 240, 21, 22, 212, 219, 21, 22, 212, 181, 21, 22, 212, 116, 21, 22, - 212, 90, 21, 22, 196, 147, 212, 90, 21, 22, 92, 232, 117, 21, 22, 92, - 232, 70, 21, 22, 161, 21, 22, 213, 242, 21, 22, 211, 182, 21, 22, 197, - 87, 211, 182, 21, 22, 211, 180, 21, 22, 197, 87, 211, 180, 21, 22, 211, - 179, 21, 22, 197, 87, 211, 179, 21, 22, 211, 177, 21, 22, 197, 87, 211, - 177, 21, 22, 211, 176, 21, 22, 197, 87, 211, 176, 21, 22, 211, 184, 21, - 22, 197, 87, 211, 184, 21, 22, 211, 183, 21, 22, 197, 87, 211, 183, 21, - 22, 196, 147, 211, 183, 21, 22, 214, 2, 21, 22, 197, 87, 214, 2, 21, 22, - 92, 233, 14, 21, 22, 203, 68, 21, 22, 203, 160, 21, 22, 202, 122, 21, 22, - 202, 99, 21, 22, 149, 21, 22, 201, 247, 21, 22, 196, 147, 201, 247, 21, - 22, 92, 239, 236, 21, 22, 92, 239, 151, 21, 22, 189, 21, 22, 203, 162, - 21, 22, 200, 243, 21, 22, 197, 87, 200, 243, 21, 22, 200, 221, 21, 22, - 197, 87, 200, 221, 21, 22, 200, 220, 21, 22, 197, 87, 200, 220, 21, 22, - 102, 21, 22, 197, 87, 102, 21, 22, 200, 211, 21, 22, 197, 87, 200, 211, - 21, 22, 200, 245, 21, 22, 197, 87, 200, 245, 21, 22, 200, 244, 21, 22, - 197, 87, 200, 244, 21, 22, 217, 204, 200, 244, 21, 22, 203, 216, 21, 22, - 201, 73, 21, 22, 201, 57, 21, 22, 201, 55, 21, 22, 201, 78, 21, 22, 224, - 208, 21, 22, 225, 48, 21, 22, 224, 100, 21, 22, 224, 79, 21, 22, 224, 10, - 21, 22, 223, 241, 21, 22, 196, 147, 223, 241, 21, 22, 155, 21, 22, 225, - 54, 21, 22, 223, 130, 21, 22, 197, 87, 223, 130, 21, 22, 223, 128, 21, - 22, 197, 87, 223, 128, 21, 22, 223, 127, 21, 22, 197, 87, 223, 127, 21, - 22, 223, 125, 21, 22, 197, 87, 223, 125, 21, 22, 223, 124, 21, 22, 197, - 87, 223, 124, 21, 22, 223, 135, 21, 22, 197, 87, 223, 135, 21, 22, 223, - 134, 21, 22, 197, 87, 223, 134, 21, 22, 217, 204, 223, 134, 21, 22, 225, - 79, 21, 22, 223, 136, 21, 22, 205, 158, 224, 192, 21, 22, 205, 158, 224, - 80, 21, 22, 205, 158, 224, 0, 21, 22, 205, 158, 225, 32, 21, 22, 247, 56, - 21, 22, 247, 171, 21, 22, 245, 10, 21, 22, 245, 0, 21, 22, 244, 181, 21, - 22, 241, 116, 21, 22, 196, 147, 241, 116, 21, 22, 247, 173, 21, 22, 247, - 172, 21, 22, 240, 251, 21, 22, 197, 87, 240, 251, 21, 22, 240, 249, 21, - 22, 197, 87, 240, 249, 21, 22, 240, 248, 21, 22, 197, 87, 240, 248, 21, - 22, 240, 247, 21, 22, 197, 87, 240, 247, 21, 22, 240, 246, 21, 22, 197, - 87, 240, 246, 21, 22, 240, 253, 21, 22, 197, 87, 240, 253, 21, 22, 240, - 252, 21, 22, 197, 87, 240, 252, 21, 22, 217, 204, 240, 252, 21, 22, 247, - 206, 21, 22, 208, 178, 202, 235, 21, 22, 219, 206, 21, 22, 220, 117, 21, - 22, 219, 77, 21, 22, 219, 39, 21, 22, 218, 250, 21, 22, 218, 194, 21, 22, - 196, 147, 218, 194, 21, 22, 166, 21, 22, 220, 118, 21, 22, 218, 69, 21, - 22, 197, 87, 218, 69, 21, 22, 218, 67, 21, 22, 197, 87, 218, 67, 21, 22, - 218, 66, 21, 22, 197, 87, 218, 66, 21, 22, 218, 65, 21, 22, 197, 87, 218, - 65, 21, 22, 218, 64, 21, 22, 197, 87, 218, 64, 21, 22, 218, 71, 21, 22, - 197, 87, 218, 71, 21, 22, 218, 70, 21, 22, 197, 87, 218, 70, 21, 22, 217, - 204, 218, 70, 21, 22, 221, 135, 21, 22, 197, 87, 221, 135, 21, 22, 219, - 81, 21, 22, 250, 165, 221, 135, 21, 22, 208, 178, 221, 135, 21, 22, 217, - 117, 21, 22, 217, 242, 21, 22, 216, 222, 21, 22, 216, 189, 21, 22, 216, - 49, 21, 22, 216, 32, 21, 22, 196, 147, 216, 32, 21, 22, 176, 21, 22, 217, - 243, 21, 22, 215, 115, 21, 22, 197, 87, 215, 115, 21, 22, 215, 117, 21, - 22, 197, 87, 215, 117, 21, 22, 215, 116, 21, 22, 197, 87, 215, 116, 21, - 22, 217, 204, 215, 116, 21, 22, 218, 54, 21, 22, 92, 217, 72, 21, 22, - 216, 227, 21, 22, 222, 196, 21, 22, 223, 80, 21, 22, 222, 108, 21, 22, - 222, 90, 21, 22, 222, 6, 21, 22, 221, 228, 21, 22, 196, 147, 221, 228, - 21, 22, 172, 21, 22, 223, 81, 21, 22, 221, 156, 21, 22, 197, 87, 221, - 156, 21, 22, 221, 155, 21, 22, 197, 87, 221, 155, 21, 22, 221, 154, 21, - 22, 197, 87, 221, 154, 21, 22, 221, 153, 21, 22, 197, 87, 221, 153, 21, - 22, 221, 152, 21, 22, 197, 87, 221, 152, 21, 22, 221, 158, 21, 22, 197, - 87, 221, 158, 21, 22, 221, 157, 21, 22, 197, 87, 221, 157, 21, 22, 159, - 21, 22, 197, 87, 159, 21, 22, 219, 193, 159, 21, 22, 208, 147, 21, 22, - 209, 11, 21, 22, 206, 112, 21, 22, 206, 84, 21, 22, 205, 200, 21, 22, - 205, 171, 21, 22, 196, 147, 205, 171, 21, 22, 183, 21, 22, 209, 13, 21, - 22, 204, 62, 21, 22, 197, 87, 204, 62, 21, 22, 204, 56, 21, 22, 197, 87, - 204, 56, 21, 22, 204, 55, 21, 22, 197, 87, 204, 55, 21, 22, 204, 50, 21, - 22, 197, 87, 204, 50, 21, 22, 204, 49, 21, 22, 197, 87, 204, 49, 21, 22, - 204, 67, 21, 22, 197, 87, 204, 67, 21, 22, 204, 66, 21, 22, 197, 87, 204, - 66, 21, 22, 217, 204, 204, 66, 21, 22, 209, 80, 21, 22, 250, 165, 209, - 80, 21, 22, 204, 68, 21, 22, 248, 132, 209, 80, 21, 22, 218, 187, 206, 7, - 21, 22, 217, 204, 205, 252, 21, 22, 217, 204, 209, 78, 21, 22, 217, 204, - 205, 96, 21, 22, 217, 204, 204, 175, 21, 22, 217, 204, 205, 251, 21, 22, - 217, 204, 208, 150, 21, 22, 206, 255, 21, 22, 206, 223, 21, 22, 206, 218, - 21, 22, 206, 198, 21, 22, 206, 190, 21, 22, 207, 50, 21, 22, 207, 45, 21, - 22, 206, 127, 21, 22, 197, 87, 206, 127, 21, 22, 206, 126, 21, 22, 197, - 87, 206, 126, 21, 22, 206, 125, 21, 22, 197, 87, 206, 125, 21, 22, 206, - 124, 21, 22, 197, 87, 206, 124, 21, 22, 206, 123, 21, 22, 197, 87, 206, - 123, 21, 22, 206, 130, 21, 22, 197, 87, 206, 130, 21, 22, 206, 129, 21, - 22, 197, 87, 206, 129, 21, 22, 207, 52, 21, 22, 196, 69, 21, 22, 196, - 127, 21, 22, 196, 24, 21, 22, 196, 14, 21, 22, 196, 3, 21, 22, 195, 237, - 21, 22, 196, 147, 195, 237, 21, 22, 164, 21, 22, 196, 129, 21, 22, 195, - 173, 21, 22, 197, 87, 195, 173, 21, 22, 195, 172, 21, 22, 197, 87, 195, - 172, 21, 22, 195, 171, 21, 22, 197, 87, 195, 171, 21, 22, 195, 170, 21, - 22, 197, 87, 195, 170, 21, 22, 195, 169, 21, 22, 197, 87, 195, 169, 21, - 22, 195, 175, 21, 22, 197, 87, 195, 175, 21, 22, 195, 174, 21, 22, 197, - 87, 195, 174, 21, 22, 217, 204, 195, 174, 21, 22, 196, 148, 21, 22, 248, - 181, 196, 148, 21, 22, 197, 87, 196, 148, 21, 22, 208, 178, 196, 24, 21, - 22, 210, 182, 21, 22, 211, 30, 210, 182, 21, 22, 197, 87, 222, 196, 21, - 22, 210, 242, 21, 22, 210, 72, 21, 22, 210, 9, 21, 22, 209, 232, 21, 22, - 209, 206, 21, 22, 197, 87, 222, 6, 21, 22, 169, 21, 22, 210, 243, 21, 22, - 197, 87, 172, 21, 22, 209, 97, 21, 22, 197, 87, 209, 97, 21, 22, 144, 21, - 22, 197, 87, 144, 21, 22, 219, 193, 144, 21, 22, 235, 188, 21, 22, 235, - 235, 21, 22, 235, 152, 21, 22, 235, 138, 21, 22, 235, 50, 21, 22, 235, - 39, 21, 22, 235, 238, 21, 22, 235, 237, 21, 22, 234, 199, 21, 22, 197, - 87, 234, 199, 21, 22, 236, 48, 21, 22, 202, 217, 21, 22, 218, 52, 202, - 217, 21, 22, 202, 195, 21, 22, 218, 52, 202, 195, 21, 22, 202, 189, 21, - 22, 218, 52, 202, 189, 21, 22, 202, 169, 21, 22, 202, 164, 21, 22, 202, - 233, 21, 22, 202, 232, 21, 22, 202, 132, 21, 22, 197, 87, 202, 132, 21, - 22, 202, 235, 21, 22, 201, 64, 21, 22, 201, 62, 21, 22, 201, 61, 21, 22, - 201, 66, 21, 22, 201, 67, 21, 22, 200, 204, 21, 22, 200, 203, 21, 22, - 200, 202, 21, 22, 200, 206, 21, 22, 215, 136, 232, 146, 21, 22, 215, 136, - 232, 70, 21, 22, 215, 136, 232, 42, 21, 22, 215, 136, 231, 192, 21, 22, - 215, 136, 231, 165, 21, 22, 215, 136, 142, 21, 22, 215, 136, 232, 245, - 21, 22, 215, 136, 233, 14, 21, 22, 215, 135, 233, 14, 21, 22, 232, 26, - 21, 22, 211, 154, 21, 22, 211, 120, 21, 22, 211, 114, 21, 22, 211, 108, - 21, 22, 211, 103, 21, 22, 211, 158, 21, 22, 211, 157, 21, 22, 211, 166, - 21, 22, 202, 43, 21, 22, 202, 41, 21, 22, 202, 40, 21, 22, 202, 44, 21, - 22, 197, 87, 210, 182, 21, 22, 197, 87, 210, 72, 21, 22, 197, 87, 209, - 232, 21, 22, 197, 87, 169, 21, 22, 217, 68, 21, 22, 217, 18, 21, 22, 217, - 14, 21, 22, 216, 251, 21, 22, 216, 246, 21, 22, 217, 70, 21, 22, 217, 69, - 21, 22, 217, 72, 21, 22, 216, 78, 21, 22, 208, 178, 206, 255, 21, 22, - 208, 178, 206, 223, 21, 22, 208, 178, 206, 198, 21, 22, 208, 178, 207, - 50, 21, 22, 197, 13, 202, 217, 21, 22, 197, 13, 202, 195, 21, 22, 197, - 13, 202, 169, 21, 22, 197, 13, 202, 233, 21, 22, 197, 13, 202, 235, 21, - 22, 222, 115, 21, 22, 222, 114, 21, 22, 222, 113, 21, 22, 222, 112, 21, - 22, 222, 121, 21, 22, 222, 120, 21, 22, 222, 122, 21, 22, 202, 234, 202, - 217, 21, 22, 202, 234, 202, 195, 21, 22, 202, 234, 202, 189, 21, 22, 202, - 234, 202, 169, 21, 22, 202, 234, 202, 164, 21, 22, 202, 234, 202, 233, - 21, 22, 202, 234, 202, 232, 21, 22, 202, 234, 202, 235, 21, 22, 251, 183, - 250, 111, 21, 22, 248, 132, 69, 21, 22, 248, 132, 68, 21, 22, 248, 132, - 72, 21, 22, 248, 132, 63, 21, 22, 248, 132, 197, 109, 21, 22, 248, 132, - 197, 70, 21, 22, 248, 132, 197, 34, 21, 22, 248, 132, 197, 166, 21, 22, - 248, 132, 217, 117, 21, 22, 248, 132, 216, 222, 21, 22, 248, 132, 216, - 49, 21, 22, 248, 132, 176, 21, 22, 248, 132, 224, 208, 21, 22, 248, 132, - 224, 100, 21, 22, 248, 132, 224, 10, 21, 22, 248, 132, 155, 21, 22, 208, - 178, 232, 146, 21, 22, 208, 178, 232, 70, 21, 22, 208, 178, 231, 192, 21, - 22, 208, 178, 142, 21, 22, 92, 233, 197, 21, 22, 92, 233, 201, 21, 22, - 92, 233, 215, 21, 22, 92, 233, 214, 21, 22, 92, 233, 203, 21, 22, 92, - 233, 229, 21, 22, 92, 209, 140, 21, 22, 92, 209, 232, 21, 22, 92, 210, - 182, 21, 22, 92, 210, 154, 21, 22, 92, 210, 72, 21, 22, 92, 169, 21, 22, - 92, 196, 243, 21, 22, 92, 197, 34, 21, 22, 92, 197, 109, 21, 22, 92, 197, - 98, 21, 22, 92, 197, 70, 21, 22, 92, 197, 166, 21, 22, 92, 231, 35, 21, - 22, 92, 231, 36, 21, 22, 92, 231, 39, 21, 22, 92, 231, 38, 21, 22, 92, - 231, 37, 21, 22, 92, 231, 42, 21, 22, 92, 202, 142, 21, 22, 92, 202, 169, - 21, 22, 92, 202, 217, 21, 22, 92, 202, 215, 21, 22, 92, 202, 195, 21, 22, - 92, 202, 233, 21, 22, 92, 201, 45, 21, 22, 92, 201, 55, 21, 22, 92, 201, - 73, 21, 22, 92, 201, 72, 21, 22, 92, 201, 57, 21, 22, 92, 201, 78, 21, - 22, 92, 211, 226, 21, 22, 92, 212, 116, 21, 22, 92, 213, 91, 21, 22, 92, - 213, 78, 21, 22, 92, 212, 219, 21, 22, 92, 161, 21, 22, 92, 214, 2, 21, - 22, 92, 233, 75, 21, 22, 92, 233, 143, 21, 22, 92, 234, 47, 21, 22, 92, - 234, 39, 21, 22, 92, 233, 191, 21, 22, 92, 234, 122, 21, 22, 92, 224, - 109, 21, 22, 92, 224, 116, 21, 22, 92, 224, 130, 21, 22, 92, 224, 129, - 21, 22, 92, 224, 123, 21, 22, 92, 224, 145, 21, 22, 92, 224, 30, 21, 22, - 92, 224, 31, 21, 22, 92, 224, 34, 21, 22, 92, 224, 33, 21, 22, 92, 224, - 32, 21, 22, 92, 224, 35, 21, 22, 92, 224, 36, 21, 22, 92, 215, 185, 21, - 22, 92, 216, 49, 21, 22, 92, 217, 117, 21, 22, 92, 217, 106, 21, 22, 92, - 216, 222, 21, 22, 92, 176, 21, 22, 92, 218, 144, 21, 22, 92, 218, 250, - 21, 22, 92, 219, 206, 21, 22, 92, 219, 187, 21, 22, 92, 219, 77, 21, 22, - 92, 166, 21, 22, 92, 195, 217, 21, 22, 92, 196, 3, 21, 22, 92, 196, 69, - 21, 22, 92, 196, 66, 21, 22, 92, 196, 24, 21, 22, 92, 164, 21, 22, 92, - 225, 109, 21, 22, 208, 178, 225, 109, 21, 22, 92, 225, 128, 21, 22, 92, - 225, 192, 21, 22, 92, 225, 190, 21, 22, 92, 225, 171, 21, 22, 208, 178, - 225, 171, 21, 22, 92, 225, 213, 21, 22, 92, 225, 142, 21, 22, 92, 225, - 146, 21, 22, 92, 225, 156, 21, 22, 92, 225, 155, 21, 22, 92, 225, 154, - 21, 22, 92, 225, 157, 21, 22, 92, 221, 190, 21, 22, 92, 222, 6, 21, 22, - 92, 222, 196, 21, 22, 92, 222, 187, 21, 22, 92, 222, 108, 21, 22, 92, - 172, 21, 22, 92, 239, 32, 21, 22, 92, 239, 33, 21, 22, 92, 239, 38, 21, - 22, 92, 239, 37, 21, 22, 92, 239, 34, 21, 22, 92, 239, 39, 21, 22, 92, - 222, 111, 21, 22, 92, 222, 113, 21, 22, 92, 222, 117, 21, 22, 92, 222, - 116, 21, 22, 92, 222, 115, 21, 22, 92, 222, 121, 21, 22, 92, 202, 38, 21, + 205, 197, 160, 21, 22, 251, 200, 21, 22, 196, 147, 197, 199, 21, 22, 233, + 152, 204, 226, 21, 22, 48, 186, 21, 22, 48, 233, 100, 21, 22, 48, 248, + 85, 157, 210, 2, 21, 22, 48, 201, 243, 157, 210, 2, 21, 22, 48, 53, 157, + 210, 2, 21, 22, 48, 210, 2, 21, 22, 48, 52, 186, 21, 22, 48, 52, 206, + 182, 83, 204, 183, 21, 22, 48, 112, 238, 253, 21, 22, 48, 206, 182, 231, + 155, 106, 21, 22, 48, 212, 125, 21, 22, 48, 135, 203, 147, 21, 22, 236, + 230, 21, 22, 226, 86, 21, 22, 214, 119, 21, 22, 251, 106, 21, 22, 213, + 92, 21, 22, 213, 241, 21, 22, 212, 220, 21, 22, 212, 182, 21, 22, 212, + 117, 21, 22, 212, 91, 21, 22, 196, 147, 212, 91, 21, 22, 92, 232, 118, + 21, 22, 92, 232, 71, 21, 22, 161, 21, 22, 213, 243, 21, 22, 211, 183, 21, + 22, 197, 87, 211, 183, 21, 22, 211, 181, 21, 22, 197, 87, 211, 181, 21, + 22, 211, 180, 21, 22, 197, 87, 211, 180, 21, 22, 211, 178, 21, 22, 197, + 87, 211, 178, 21, 22, 211, 177, 21, 22, 197, 87, 211, 177, 21, 22, 211, + 185, 21, 22, 197, 87, 211, 185, 21, 22, 211, 184, 21, 22, 197, 87, 211, + 184, 21, 22, 196, 147, 211, 184, 21, 22, 214, 3, 21, 22, 197, 87, 214, 3, + 21, 22, 92, 233, 15, 21, 22, 203, 68, 21, 22, 203, 160, 21, 22, 202, 122, + 21, 22, 202, 99, 21, 22, 149, 21, 22, 201, 247, 21, 22, 196, 147, 201, + 247, 21, 22, 92, 239, 237, 21, 22, 92, 239, 152, 21, 22, 189, 21, 22, + 203, 162, 21, 22, 200, 243, 21, 22, 197, 87, 200, 243, 21, 22, 200, 221, + 21, 22, 197, 87, 200, 221, 21, 22, 200, 220, 21, 22, 197, 87, 200, 220, + 21, 22, 102, 21, 22, 197, 87, 102, 21, 22, 200, 211, 21, 22, 197, 87, + 200, 211, 21, 22, 200, 245, 21, 22, 197, 87, 200, 245, 21, 22, 200, 244, + 21, 22, 197, 87, 200, 244, 21, 22, 217, 205, 200, 244, 21, 22, 203, 216, + 21, 22, 201, 73, 21, 22, 201, 57, 21, 22, 201, 55, 21, 22, 201, 78, 21, + 22, 224, 209, 21, 22, 225, 49, 21, 22, 224, 101, 21, 22, 224, 80, 21, 22, + 224, 11, 21, 22, 223, 242, 21, 22, 196, 147, 223, 242, 21, 22, 155, 21, + 22, 225, 55, 21, 22, 223, 131, 21, 22, 197, 87, 223, 131, 21, 22, 223, + 129, 21, 22, 197, 87, 223, 129, 21, 22, 223, 128, 21, 22, 197, 87, 223, + 128, 21, 22, 223, 126, 21, 22, 197, 87, 223, 126, 21, 22, 223, 125, 21, + 22, 197, 87, 223, 125, 21, 22, 223, 136, 21, 22, 197, 87, 223, 136, 21, + 22, 223, 135, 21, 22, 197, 87, 223, 135, 21, 22, 217, 205, 223, 135, 21, + 22, 225, 80, 21, 22, 223, 137, 21, 22, 205, 158, 224, 193, 21, 22, 205, + 158, 224, 81, 21, 22, 205, 158, 224, 1, 21, 22, 205, 158, 225, 33, 21, + 22, 247, 57, 21, 22, 247, 172, 21, 22, 245, 11, 21, 22, 245, 1, 21, 22, + 244, 182, 21, 22, 241, 117, 21, 22, 196, 147, 241, 117, 21, 22, 247, 174, + 21, 22, 247, 173, 21, 22, 240, 252, 21, 22, 197, 87, 240, 252, 21, 22, + 240, 250, 21, 22, 197, 87, 240, 250, 21, 22, 240, 249, 21, 22, 197, 87, + 240, 249, 21, 22, 240, 248, 21, 22, 197, 87, 240, 248, 21, 22, 240, 247, + 21, 22, 197, 87, 240, 247, 21, 22, 240, 254, 21, 22, 197, 87, 240, 254, + 21, 22, 240, 253, 21, 22, 197, 87, 240, 253, 21, 22, 217, 205, 240, 253, + 21, 22, 247, 207, 21, 22, 208, 178, 202, 235, 21, 22, 219, 207, 21, 22, + 220, 118, 21, 22, 219, 78, 21, 22, 219, 40, 21, 22, 218, 251, 21, 22, + 218, 195, 21, 22, 196, 147, 218, 195, 21, 22, 166, 21, 22, 220, 119, 21, + 22, 218, 70, 21, 22, 197, 87, 218, 70, 21, 22, 218, 68, 21, 22, 197, 87, + 218, 68, 21, 22, 218, 67, 21, 22, 197, 87, 218, 67, 21, 22, 218, 66, 21, + 22, 197, 87, 218, 66, 21, 22, 218, 65, 21, 22, 197, 87, 218, 65, 21, 22, + 218, 72, 21, 22, 197, 87, 218, 72, 21, 22, 218, 71, 21, 22, 197, 87, 218, + 71, 21, 22, 217, 205, 218, 71, 21, 22, 221, 136, 21, 22, 197, 87, 221, + 136, 21, 22, 219, 82, 21, 22, 250, 166, 221, 136, 21, 22, 208, 178, 221, + 136, 21, 22, 217, 118, 21, 22, 217, 243, 21, 22, 216, 223, 21, 22, 216, + 190, 21, 22, 216, 50, 21, 22, 216, 33, 21, 22, 196, 147, 216, 33, 21, 22, + 176, 21, 22, 217, 244, 21, 22, 215, 116, 21, 22, 197, 87, 215, 116, 21, + 22, 215, 118, 21, 22, 197, 87, 215, 118, 21, 22, 215, 117, 21, 22, 197, + 87, 215, 117, 21, 22, 217, 205, 215, 117, 21, 22, 218, 55, 21, 22, 92, + 217, 73, 21, 22, 216, 228, 21, 22, 222, 197, 21, 22, 223, 81, 21, 22, + 222, 109, 21, 22, 222, 91, 21, 22, 222, 7, 21, 22, 221, 229, 21, 22, 196, + 147, 221, 229, 21, 22, 172, 21, 22, 223, 82, 21, 22, 221, 157, 21, 22, + 197, 87, 221, 157, 21, 22, 221, 156, 21, 22, 197, 87, 221, 156, 21, 22, + 221, 155, 21, 22, 197, 87, 221, 155, 21, 22, 221, 154, 21, 22, 197, 87, + 221, 154, 21, 22, 221, 153, 21, 22, 197, 87, 221, 153, 21, 22, 221, 159, + 21, 22, 197, 87, 221, 159, 21, 22, 221, 158, 21, 22, 197, 87, 221, 158, + 21, 22, 159, 21, 22, 197, 87, 159, 21, 22, 219, 194, 159, 21, 22, 208, + 147, 21, 22, 209, 11, 21, 22, 206, 112, 21, 22, 206, 84, 21, 22, 205, + 200, 21, 22, 205, 171, 21, 22, 196, 147, 205, 171, 21, 22, 183, 21, 22, + 209, 13, 21, 22, 204, 62, 21, 22, 197, 87, 204, 62, 21, 22, 204, 56, 21, + 22, 197, 87, 204, 56, 21, 22, 204, 55, 21, 22, 197, 87, 204, 55, 21, 22, + 204, 50, 21, 22, 197, 87, 204, 50, 21, 22, 204, 49, 21, 22, 197, 87, 204, + 49, 21, 22, 204, 67, 21, 22, 197, 87, 204, 67, 21, 22, 204, 66, 21, 22, + 197, 87, 204, 66, 21, 22, 217, 205, 204, 66, 21, 22, 209, 80, 21, 22, + 250, 166, 209, 80, 21, 22, 204, 68, 21, 22, 248, 133, 209, 80, 21, 22, + 218, 188, 206, 7, 21, 22, 217, 205, 205, 252, 21, 22, 217, 205, 209, 78, + 21, 22, 217, 205, 205, 96, 21, 22, 217, 205, 204, 175, 21, 22, 217, 205, + 205, 251, 21, 22, 217, 205, 208, 150, 21, 22, 206, 255, 21, 22, 206, 223, + 21, 22, 206, 218, 21, 22, 206, 198, 21, 22, 206, 190, 21, 22, 207, 50, + 21, 22, 207, 45, 21, 22, 206, 127, 21, 22, 197, 87, 206, 127, 21, 22, + 206, 126, 21, 22, 197, 87, 206, 126, 21, 22, 206, 125, 21, 22, 197, 87, + 206, 125, 21, 22, 206, 124, 21, 22, 197, 87, 206, 124, 21, 22, 206, 123, + 21, 22, 197, 87, 206, 123, 21, 22, 206, 130, 21, 22, 197, 87, 206, 130, + 21, 22, 206, 129, 21, 22, 197, 87, 206, 129, 21, 22, 207, 52, 21, 22, + 196, 69, 21, 22, 196, 127, 21, 22, 196, 24, 21, 22, 196, 14, 21, 22, 196, + 3, 21, 22, 195, 237, 21, 22, 196, 147, 195, 237, 21, 22, 164, 21, 22, + 196, 129, 21, 22, 195, 173, 21, 22, 197, 87, 195, 173, 21, 22, 195, 172, + 21, 22, 197, 87, 195, 172, 21, 22, 195, 171, 21, 22, 197, 87, 195, 171, + 21, 22, 195, 170, 21, 22, 197, 87, 195, 170, 21, 22, 195, 169, 21, 22, + 197, 87, 195, 169, 21, 22, 195, 175, 21, 22, 197, 87, 195, 175, 21, 22, + 195, 174, 21, 22, 197, 87, 195, 174, 21, 22, 217, 205, 195, 174, 21, 22, + 196, 148, 21, 22, 248, 182, 196, 148, 21, 22, 197, 87, 196, 148, 21, 22, + 208, 178, 196, 24, 21, 22, 210, 183, 21, 22, 211, 31, 210, 183, 21, 22, + 197, 87, 222, 197, 21, 22, 210, 243, 21, 22, 210, 72, 21, 22, 210, 9, 21, + 22, 209, 232, 21, 22, 209, 206, 21, 22, 197, 87, 222, 7, 21, 22, 169, 21, + 22, 210, 244, 21, 22, 197, 87, 172, 21, 22, 209, 97, 21, 22, 197, 87, + 209, 97, 21, 22, 144, 21, 22, 197, 87, 144, 21, 22, 219, 194, 144, 21, + 22, 235, 189, 21, 22, 235, 236, 21, 22, 235, 153, 21, 22, 235, 139, 21, + 22, 235, 51, 21, 22, 235, 40, 21, 22, 235, 239, 21, 22, 235, 238, 21, 22, + 234, 200, 21, 22, 197, 87, 234, 200, 21, 22, 236, 49, 21, 22, 202, 217, + 21, 22, 218, 53, 202, 217, 21, 22, 202, 195, 21, 22, 218, 53, 202, 195, + 21, 22, 202, 189, 21, 22, 218, 53, 202, 189, 21, 22, 202, 169, 21, 22, + 202, 164, 21, 22, 202, 233, 21, 22, 202, 232, 21, 22, 202, 132, 21, 22, + 197, 87, 202, 132, 21, 22, 202, 235, 21, 22, 201, 64, 21, 22, 201, 62, + 21, 22, 201, 61, 21, 22, 201, 66, 21, 22, 201, 67, 21, 22, 200, 204, 21, + 22, 200, 203, 21, 22, 200, 202, 21, 22, 200, 206, 21, 22, 215, 137, 232, + 147, 21, 22, 215, 137, 232, 71, 21, 22, 215, 137, 232, 43, 21, 22, 215, + 137, 231, 193, 21, 22, 215, 137, 231, 166, 21, 22, 215, 137, 142, 21, 22, + 215, 137, 232, 246, 21, 22, 215, 137, 233, 15, 21, 22, 215, 136, 233, 15, + 21, 22, 232, 27, 21, 22, 211, 155, 21, 22, 211, 121, 21, 22, 211, 115, + 21, 22, 211, 109, 21, 22, 211, 104, 21, 22, 211, 159, 21, 22, 211, 158, + 21, 22, 211, 167, 21, 22, 202, 43, 21, 22, 202, 41, 21, 22, 202, 40, 21, + 22, 202, 44, 21, 22, 197, 87, 210, 183, 21, 22, 197, 87, 210, 72, 21, 22, + 197, 87, 209, 232, 21, 22, 197, 87, 169, 21, 22, 217, 69, 21, 22, 217, + 19, 21, 22, 217, 15, 21, 22, 216, 252, 21, 22, 216, 247, 21, 22, 217, 71, + 21, 22, 217, 70, 21, 22, 217, 73, 21, 22, 216, 79, 21, 22, 208, 178, 206, + 255, 21, 22, 208, 178, 206, 223, 21, 22, 208, 178, 206, 198, 21, 22, 208, + 178, 207, 50, 21, 22, 197, 13, 202, 217, 21, 22, 197, 13, 202, 195, 21, + 22, 197, 13, 202, 169, 21, 22, 197, 13, 202, 233, 21, 22, 197, 13, 202, + 235, 21, 22, 222, 116, 21, 22, 222, 115, 21, 22, 222, 114, 21, 22, 222, + 113, 21, 22, 222, 122, 21, 22, 222, 121, 21, 22, 222, 123, 21, 22, 202, + 234, 202, 217, 21, 22, 202, 234, 202, 195, 21, 22, 202, 234, 202, 189, + 21, 22, 202, 234, 202, 169, 21, 22, 202, 234, 202, 164, 21, 22, 202, 234, + 202, 233, 21, 22, 202, 234, 202, 232, 21, 22, 202, 234, 202, 235, 21, 22, + 251, 184, 250, 112, 21, 22, 248, 133, 69, 21, 22, 248, 133, 68, 21, 22, + 248, 133, 72, 21, 22, 248, 133, 63, 21, 22, 248, 133, 197, 109, 21, 22, + 248, 133, 197, 70, 21, 22, 248, 133, 197, 34, 21, 22, 248, 133, 197, 166, + 21, 22, 248, 133, 217, 118, 21, 22, 248, 133, 216, 223, 21, 22, 248, 133, + 216, 50, 21, 22, 248, 133, 176, 21, 22, 248, 133, 224, 209, 21, 22, 248, + 133, 224, 101, 21, 22, 248, 133, 224, 11, 21, 22, 248, 133, 155, 21, 22, + 208, 178, 232, 147, 21, 22, 208, 178, 232, 71, 21, 22, 208, 178, 231, + 193, 21, 22, 208, 178, 142, 21, 22, 92, 233, 198, 21, 22, 92, 233, 202, + 21, 22, 92, 233, 216, 21, 22, 92, 233, 215, 21, 22, 92, 233, 204, 21, 22, + 92, 233, 230, 21, 22, 92, 209, 140, 21, 22, 92, 209, 232, 21, 22, 92, + 210, 183, 21, 22, 92, 210, 155, 21, 22, 92, 210, 72, 21, 22, 92, 169, 21, + 22, 92, 196, 243, 21, 22, 92, 197, 34, 21, 22, 92, 197, 109, 21, 22, 92, + 197, 98, 21, 22, 92, 197, 70, 21, 22, 92, 197, 166, 21, 22, 92, 231, 36, + 21, 22, 92, 231, 37, 21, 22, 92, 231, 40, 21, 22, 92, 231, 39, 21, 22, + 92, 231, 38, 21, 22, 92, 231, 43, 21, 22, 92, 202, 142, 21, 22, 92, 202, + 169, 21, 22, 92, 202, 217, 21, 22, 92, 202, 215, 21, 22, 92, 202, 195, + 21, 22, 92, 202, 233, 21, 22, 92, 201, 45, 21, 22, 92, 201, 55, 21, 22, + 92, 201, 73, 21, 22, 92, 201, 72, 21, 22, 92, 201, 57, 21, 22, 92, 201, + 78, 21, 22, 92, 211, 227, 21, 22, 92, 212, 117, 21, 22, 92, 213, 92, 21, + 22, 92, 213, 79, 21, 22, 92, 212, 220, 21, 22, 92, 161, 21, 22, 92, 214, + 3, 21, 22, 92, 233, 76, 21, 22, 92, 233, 144, 21, 22, 92, 234, 48, 21, + 22, 92, 234, 40, 21, 22, 92, 233, 192, 21, 22, 92, 234, 123, 21, 22, 92, + 224, 110, 21, 22, 92, 224, 117, 21, 22, 92, 224, 131, 21, 22, 92, 224, + 130, 21, 22, 92, 224, 124, 21, 22, 92, 224, 146, 21, 22, 92, 224, 31, 21, + 22, 92, 224, 32, 21, 22, 92, 224, 35, 21, 22, 92, 224, 34, 21, 22, 92, + 224, 33, 21, 22, 92, 224, 36, 21, 22, 92, 224, 37, 21, 22, 92, 215, 186, + 21, 22, 92, 216, 50, 21, 22, 92, 217, 118, 21, 22, 92, 217, 107, 21, 22, + 92, 216, 223, 21, 22, 92, 176, 21, 22, 92, 218, 145, 21, 22, 92, 218, + 251, 21, 22, 92, 219, 207, 21, 22, 92, 219, 188, 21, 22, 92, 219, 78, 21, + 22, 92, 166, 21, 22, 92, 195, 217, 21, 22, 92, 196, 3, 21, 22, 92, 196, + 69, 21, 22, 92, 196, 66, 21, 22, 92, 196, 24, 21, 22, 92, 164, 21, 22, + 92, 225, 110, 21, 22, 208, 178, 225, 110, 21, 22, 92, 225, 129, 21, 22, + 92, 225, 193, 21, 22, 92, 225, 191, 21, 22, 92, 225, 172, 21, 22, 208, + 178, 225, 172, 21, 22, 92, 225, 214, 21, 22, 92, 225, 143, 21, 22, 92, + 225, 147, 21, 22, 92, 225, 157, 21, 22, 92, 225, 156, 21, 22, 92, 225, + 155, 21, 22, 92, 225, 158, 21, 22, 92, 221, 191, 21, 22, 92, 222, 7, 21, + 22, 92, 222, 197, 21, 22, 92, 222, 188, 21, 22, 92, 222, 109, 21, 22, 92, + 172, 21, 22, 92, 239, 33, 21, 22, 92, 239, 34, 21, 22, 92, 239, 39, 21, + 22, 92, 239, 38, 21, 22, 92, 239, 35, 21, 22, 92, 239, 40, 21, 22, 92, + 222, 112, 21, 22, 92, 222, 114, 21, 22, 92, 222, 118, 21, 22, 92, 222, + 117, 21, 22, 92, 222, 116, 21, 22, 92, 222, 122, 21, 22, 92, 202, 38, 21, 22, 92, 202, 40, 21, 22, 92, 202, 43, 21, 22, 92, 202, 42, 21, 22, 92, 202, 41, 21, 22, 92, 202, 44, 21, 22, 92, 202, 33, 21, 22, 92, 202, 34, 21, 22, 92, 202, 46, 21, 22, 92, 202, 45, 21, 22, 92, 202, 35, 21, 22, 92, 202, 47, 21, 22, 92, 194, 255, 21, 22, 92, 195, 11, 21, 22, 92, 195, 88, 21, 22, 92, 195, 85, 21, 22, 92, 195, 33, 21, 22, 92, 195, 115, 21, - 22, 92, 195, 158, 21, 22, 92, 84, 195, 158, 21, 22, 92, 237, 142, 21, 22, - 92, 237, 143, 21, 22, 92, 237, 152, 21, 22, 92, 237, 151, 21, 22, 92, - 237, 146, 21, 22, 92, 237, 155, 21, 22, 92, 204, 172, 21, 22, 92, 205, + 22, 92, 195, 158, 21, 22, 92, 84, 195, 158, 21, 22, 92, 237, 143, 21, 22, + 92, 237, 144, 21, 22, 92, 237, 153, 21, 22, 92, 237, 152, 21, 22, 92, + 237, 147, 21, 22, 92, 237, 156, 21, 22, 92, 204, 172, 21, 22, 92, 205, 200, 21, 22, 92, 208, 147, 21, 22, 92, 208, 129, 21, 22, 92, 206, 112, 21, 22, 92, 183, 21, 22, 92, 206, 151, 21, 22, 92, 206, 198, 21, 22, 92, 206, 255, 21, 22, 92, 206, 253, 21, 22, 92, 206, 223, 21, 22, 92, 207, 50, 21, 22, 92, 207, 52, 21, 22, 92, 201, 86, 21, 22, 92, 201, 90, 21, 22, 92, 201, 107, 21, 22, 92, 201, 106, 21, 22, 92, 201, 92, 21, 22, 92, - 201, 113, 21, 22, 92, 245, 29, 21, 22, 92, 245, 48, 21, 22, 92, 245, 102, - 21, 22, 92, 245, 98, 21, 22, 92, 245, 74, 21, 22, 92, 247, 15, 21, 22, + 201, 113, 21, 22, 92, 245, 30, 21, 22, 92, 245, 49, 21, 22, 92, 245, 103, + 21, 22, 92, 245, 99, 21, 22, 92, 245, 75, 21, 22, 92, 247, 16, 21, 22, 92, 201, 48, 21, 22, 92, 201, 49, 21, 22, 92, 201, 52, 21, 22, 92, 201, - 51, 21, 22, 92, 201, 50, 21, 22, 92, 201, 53, 21, 22, 245, 75, 55, 21, - 22, 234, 216, 204, 226, 21, 22, 211, 150, 21, 22, 217, 66, 21, 22, 216, - 75, 21, 22, 216, 74, 21, 22, 216, 73, 21, 22, 216, 72, 21, 22, 216, 77, - 21, 22, 216, 76, 21, 22, 197, 13, 202, 130, 21, 22, 197, 13, 202, 129, + 51, 21, 22, 92, 201, 50, 21, 22, 92, 201, 53, 21, 22, 245, 76, 55, 21, + 22, 234, 217, 204, 226, 21, 22, 211, 151, 21, 22, 217, 67, 21, 22, 216, + 76, 21, 22, 216, 75, 21, 22, 216, 74, 21, 22, 216, 73, 21, 22, 216, 78, + 21, 22, 216, 77, 21, 22, 197, 13, 202, 130, 21, 22, 197, 13, 202, 129, 21, 22, 197, 13, 202, 128, 21, 22, 197, 13, 202, 127, 21, 22, 197, 13, 202, 126, 21, 22, 197, 13, 202, 133, 21, 22, 197, 13, 202, 132, 21, 22, - 197, 13, 48, 202, 235, 21, 22, 248, 132, 197, 199, 214, 152, 205, 149, - 78, 214, 152, 1, 248, 232, 214, 152, 1, 221, 176, 214, 152, 1, 235, 185, - 214, 152, 1, 208, 251, 214, 152, 1, 216, 171, 214, 152, 1, 200, 111, 214, - 152, 1, 240, 108, 214, 152, 1, 202, 71, 214, 152, 1, 244, 170, 214, 152, - 1, 247, 43, 214, 152, 1, 218, 127, 214, 152, 1, 233, 122, 214, 152, 1, - 217, 56, 214, 152, 1, 204, 219, 214, 152, 1, 209, 127, 214, 152, 1, 251, - 195, 214, 152, 1, 214, 105, 214, 152, 1, 200, 21, 214, 152, 1, 237, 79, - 214, 152, 1, 226, 10, 214, 152, 1, 237, 80, 214, 152, 1, 214, 71, 214, - 152, 1, 200, 88, 214, 152, 1, 226, 125, 214, 152, 1, 237, 77, 214, 152, - 1, 213, 68, 214, 152, 235, 184, 78, 214, 152, 210, 89, 235, 184, 78, 209, - 116, 1, 235, 174, 235, 165, 235, 189, 236, 48, 209, 116, 1, 199, 230, + 197, 13, 48, 202, 235, 21, 22, 248, 133, 197, 199, 214, 153, 205, 149, + 78, 214, 153, 1, 248, 233, 214, 153, 1, 221, 177, 214, 153, 1, 235, 186, + 214, 153, 1, 208, 251, 214, 153, 1, 216, 172, 214, 153, 1, 200, 111, 214, + 153, 1, 240, 109, 214, 153, 1, 202, 71, 214, 153, 1, 244, 171, 214, 153, + 1, 247, 44, 214, 153, 1, 218, 128, 214, 153, 1, 233, 123, 214, 153, 1, + 217, 57, 214, 153, 1, 204, 219, 214, 153, 1, 209, 127, 214, 153, 1, 251, + 196, 214, 153, 1, 214, 106, 214, 153, 1, 200, 21, 214, 153, 1, 237, 80, + 214, 153, 1, 226, 11, 214, 153, 1, 237, 81, 214, 153, 1, 214, 72, 214, + 153, 1, 200, 88, 214, 153, 1, 226, 126, 214, 153, 1, 237, 78, 214, 153, + 1, 213, 69, 214, 153, 235, 185, 78, 214, 153, 210, 89, 235, 185, 78, 209, + 116, 1, 235, 175, 235, 166, 235, 190, 236, 49, 209, 116, 1, 199, 230, 209, 116, 1, 200, 6, 200, 22, 66, 209, 116, 1, 195, 220, 209, 116, 1, 196, 148, 209, 116, 1, 197, 199, 209, 116, 1, 202, 135, 202, 134, 202, - 162, 209, 116, 1, 236, 120, 209, 116, 1, 251, 69, 63, 209, 116, 1, 214, - 53, 72, 209, 116, 1, 252, 25, 63, 209, 116, 1, 251, 228, 209, 116, 1, - 221, 235, 72, 209, 116, 1, 206, 175, 72, 209, 116, 1, 72, 209, 116, 1, - 214, 163, 209, 116, 1, 214, 118, 209, 116, 1, 210, 221, 210, 234, 210, - 139, 144, 209, 116, 1, 224, 224, 209, 116, 1, 247, 39, 209, 116, 1, 224, - 225, 225, 79, 209, 116, 1, 234, 189, 209, 116, 1, 236, 214, 209, 116, 1, - 234, 42, 233, 20, 234, 189, 209, 116, 1, 234, 82, 209, 116, 1, 196, 235, - 196, 226, 197, 199, 209, 116, 1, 232, 236, 233, 14, 209, 116, 1, 232, - 240, 233, 14, 209, 116, 1, 221, 237, 233, 14, 209, 116, 1, 206, 178, 233, - 14, 209, 116, 1, 217, 199, 215, 98, 217, 200, 218, 54, 209, 116, 1, 206, - 176, 218, 54, 209, 116, 1, 237, 246, 209, 116, 1, 225, 244, 225, 248, - 225, 235, 68, 209, 116, 1, 69, 209, 116, 1, 225, 182, 225, 216, 209, 116, - 1, 234, 23, 209, 116, 1, 221, 238, 251, 244, 209, 116, 1, 206, 180, 63, - 209, 116, 1, 225, 227, 236, 187, 209, 116, 1, 213, 24, 213, 49, 214, 2, - 209, 116, 1, 251, 156, 236, 185, 209, 116, 1, 205, 155, 209, 80, 209, - 116, 1, 206, 88, 221, 234, 209, 80, 209, 116, 1, 206, 174, 209, 80, 209, - 116, 1, 247, 206, 209, 116, 1, 195, 158, 209, 116, 1, 202, 52, 202, 64, + 162, 209, 116, 1, 236, 121, 209, 116, 1, 251, 70, 63, 209, 116, 1, 214, + 54, 72, 209, 116, 1, 252, 26, 63, 209, 116, 1, 251, 229, 209, 116, 1, + 221, 236, 72, 209, 116, 1, 206, 175, 72, 209, 116, 1, 72, 209, 116, 1, + 214, 164, 209, 116, 1, 214, 119, 209, 116, 1, 210, 222, 210, 235, 210, + 140, 144, 209, 116, 1, 224, 225, 209, 116, 1, 247, 40, 209, 116, 1, 224, + 226, 225, 80, 209, 116, 1, 234, 190, 209, 116, 1, 236, 215, 209, 116, 1, + 234, 43, 233, 21, 234, 190, 209, 116, 1, 234, 83, 209, 116, 1, 196, 235, + 196, 226, 197, 199, 209, 116, 1, 232, 237, 233, 15, 209, 116, 1, 232, + 241, 233, 15, 209, 116, 1, 221, 238, 233, 15, 209, 116, 1, 206, 178, 233, + 15, 209, 116, 1, 217, 200, 215, 99, 217, 201, 218, 55, 209, 116, 1, 206, + 176, 218, 55, 209, 116, 1, 237, 247, 209, 116, 1, 225, 245, 225, 249, + 225, 236, 68, 209, 116, 1, 69, 209, 116, 1, 225, 183, 225, 217, 209, 116, + 1, 234, 24, 209, 116, 1, 221, 239, 251, 245, 209, 116, 1, 206, 180, 63, + 209, 116, 1, 225, 228, 236, 188, 209, 116, 1, 213, 25, 213, 50, 214, 3, + 209, 116, 1, 251, 157, 236, 186, 209, 116, 1, 205, 155, 209, 80, 209, + 116, 1, 206, 88, 221, 235, 209, 80, 209, 116, 1, 206, 174, 209, 80, 209, + 116, 1, 247, 207, 209, 116, 1, 195, 158, 209, 116, 1, 202, 52, 202, 64, 200, 188, 203, 216, 209, 116, 1, 206, 173, 203, 216, 209, 116, 1, 240, - 230, 209, 116, 1, 248, 210, 248, 213, 248, 138, 250, 111, 209, 116, 1, - 206, 179, 250, 111, 209, 116, 1, 237, 245, 209, 116, 1, 214, 85, 209, - 116, 1, 237, 33, 237, 40, 69, 209, 116, 1, 220, 50, 220, 62, 221, 135, - 209, 116, 1, 221, 236, 221, 135, 209, 116, 1, 206, 177, 221, 135, 209, - 116, 1, 222, 211, 223, 58, 221, 245, 159, 209, 116, 1, 237, 247, 209, - 116, 1, 226, 58, 209, 116, 1, 226, 59, 209, 116, 1, 240, 122, 240, 128, - 240, 230, 209, 116, 1, 214, 46, 236, 119, 72, 209, 116, 1, 237, 75, 209, - 116, 1, 226, 8, 209, 116, 1, 240, 250, 209, 116, 1, 247, 156, 209, 116, - 1, 247, 55, 209, 116, 1, 205, 13, 209, 116, 1, 221, 233, 209, 116, 1, - 206, 172, 209, 116, 1, 230, 199, 209, 116, 1, 211, 166, 209, 116, 1, 196, - 222, 209, 116, 206, 62, 211, 212, 209, 116, 218, 119, 211, 212, 209, 116, - 241, 61, 211, 212, 209, 116, 250, 232, 105, 209, 116, 200, 247, 105, 209, - 116, 248, 230, 105, 209, 116, 1, 225, 79, 209, 116, 1, 207, 52, 209, 116, - 1, 214, 101, 209, 116, 1, 234, 246, 247, 94, 214, 52, 209, 116, 1, 234, - 246, 247, 94, 225, 247, 209, 116, 1, 234, 246, 247, 94, 237, 39, 209, - 116, 1, 234, 246, 247, 94, 252, 24, 209, 116, 1, 234, 246, 247, 94, 251, - 228, 203, 142, 1, 63, 203, 142, 1, 68, 203, 142, 1, 66, 203, 142, 1, 155, - 203, 142, 1, 234, 122, 203, 142, 1, 217, 70, 203, 142, 1, 189, 203, 142, - 1, 240, 135, 203, 142, 1, 176, 203, 142, 1, 161, 203, 142, 1, 249, 144, + 231, 209, 116, 1, 248, 211, 248, 214, 248, 139, 250, 112, 209, 116, 1, + 206, 179, 250, 112, 209, 116, 1, 237, 246, 209, 116, 1, 214, 86, 209, + 116, 1, 237, 34, 237, 41, 69, 209, 116, 1, 220, 51, 220, 63, 221, 136, + 209, 116, 1, 221, 237, 221, 136, 209, 116, 1, 206, 177, 221, 136, 209, + 116, 1, 222, 212, 223, 59, 221, 246, 159, 209, 116, 1, 237, 248, 209, + 116, 1, 226, 59, 209, 116, 1, 226, 60, 209, 116, 1, 240, 123, 240, 129, + 240, 231, 209, 116, 1, 214, 47, 236, 120, 72, 209, 116, 1, 237, 76, 209, + 116, 1, 226, 9, 209, 116, 1, 240, 251, 209, 116, 1, 247, 157, 209, 116, + 1, 247, 56, 209, 116, 1, 205, 13, 209, 116, 1, 221, 234, 209, 116, 1, + 206, 172, 209, 116, 1, 230, 200, 209, 116, 1, 211, 167, 209, 116, 1, 196, + 222, 209, 116, 206, 62, 211, 213, 209, 116, 218, 120, 211, 213, 209, 116, + 241, 62, 211, 213, 209, 116, 250, 233, 105, 209, 116, 200, 247, 105, 209, + 116, 248, 231, 105, 209, 116, 1, 225, 80, 209, 116, 1, 207, 52, 209, 116, + 1, 214, 102, 209, 116, 1, 234, 247, 247, 95, 214, 53, 209, 116, 1, 234, + 247, 247, 95, 225, 248, 209, 116, 1, 234, 247, 247, 95, 237, 40, 209, + 116, 1, 234, 247, 247, 95, 252, 25, 209, 116, 1, 234, 247, 247, 95, 251, + 229, 203, 142, 1, 63, 203, 142, 1, 68, 203, 142, 1, 66, 203, 142, 1, 155, + 203, 142, 1, 234, 123, 203, 142, 1, 217, 71, 203, 142, 1, 189, 203, 142, + 1, 240, 136, 203, 142, 1, 176, 203, 142, 1, 161, 203, 142, 1, 249, 145, 203, 142, 1, 166, 203, 142, 1, 164, 203, 142, 1, 172, 203, 142, 1, 197, 166, 203, 142, 1, 183, 203, 142, 1, 142, 203, 142, 18, 2, 68, 203, 142, - 18, 2, 66, 203, 142, 2, 199, 7, 232, 178, 1, 63, 232, 178, 1, 68, 232, - 178, 1, 66, 232, 178, 1, 155, 232, 178, 1, 234, 122, 232, 178, 1, 217, - 70, 232, 178, 1, 189, 232, 178, 1, 240, 135, 232, 178, 1, 176, 232, 178, - 1, 161, 232, 178, 1, 249, 144, 232, 178, 1, 166, 232, 178, 1, 164, 232, - 178, 1, 169, 232, 178, 1, 172, 232, 178, 1, 197, 166, 232, 178, 1, 183, - 232, 178, 1, 142, 232, 178, 18, 2, 68, 232, 178, 18, 2, 66, 232, 178, 2, - 213, 193, 212, 238, 206, 62, 211, 212, 212, 238, 52, 211, 212, 248, 12, - 1, 63, 248, 12, 1, 68, 248, 12, 1, 66, 248, 12, 1, 155, 248, 12, 1, 234, - 122, 248, 12, 1, 217, 70, 248, 12, 1, 189, 248, 12, 1, 240, 135, 248, 12, - 1, 176, 248, 12, 1, 161, 248, 12, 1, 249, 144, 248, 12, 1, 166, 248, 12, - 1, 164, 248, 12, 1, 169, 248, 12, 1, 172, 248, 12, 1, 197, 166, 248, 12, - 1, 183, 248, 12, 1, 142, 248, 12, 18, 2, 68, 248, 12, 18, 2, 66, 203, + 18, 2, 66, 203, 142, 2, 199, 7, 232, 179, 1, 63, 232, 179, 1, 68, 232, + 179, 1, 66, 232, 179, 1, 155, 232, 179, 1, 234, 123, 232, 179, 1, 217, + 71, 232, 179, 1, 189, 232, 179, 1, 240, 136, 232, 179, 1, 176, 232, 179, + 1, 161, 232, 179, 1, 249, 145, 232, 179, 1, 166, 232, 179, 1, 164, 232, + 179, 1, 169, 232, 179, 1, 172, 232, 179, 1, 197, 166, 232, 179, 1, 183, + 232, 179, 1, 142, 232, 179, 18, 2, 68, 232, 179, 18, 2, 66, 232, 179, 2, + 213, 194, 212, 239, 206, 62, 211, 213, 212, 239, 52, 211, 213, 248, 13, + 1, 63, 248, 13, 1, 68, 248, 13, 1, 66, 248, 13, 1, 155, 248, 13, 1, 234, + 123, 248, 13, 1, 217, 71, 248, 13, 1, 189, 248, 13, 1, 240, 136, 248, 13, + 1, 176, 248, 13, 1, 161, 248, 13, 1, 249, 145, 248, 13, 1, 166, 248, 13, + 1, 164, 248, 13, 1, 169, 248, 13, 1, 172, 248, 13, 1, 197, 166, 248, 13, + 1, 183, 248, 13, 1, 142, 248, 13, 18, 2, 68, 248, 13, 18, 2, 66, 203, 141, 1, 63, 203, 141, 1, 68, 203, 141, 1, 66, 203, 141, 1, 155, 203, 141, - 1, 234, 122, 203, 141, 1, 217, 70, 203, 141, 1, 189, 203, 141, 1, 240, - 135, 203, 141, 1, 176, 203, 141, 1, 161, 203, 141, 1, 249, 144, 203, 141, + 1, 234, 123, 203, 141, 1, 217, 71, 203, 141, 1, 189, 203, 141, 1, 240, + 136, 203, 141, 1, 176, 203, 141, 1, 161, 203, 141, 1, 249, 145, 203, 141, 1, 166, 203, 141, 1, 164, 203, 141, 1, 172, 203, 141, 1, 197, 166, 203, 141, 1, 183, 203, 141, 18, 2, 68, 203, 141, 18, 2, 66, 89, 1, 155, 89, 1, - 224, 145, 89, 1, 224, 10, 89, 1, 224, 116, 89, 1, 216, 251, 89, 1, 247, - 173, 89, 1, 247, 15, 89, 1, 244, 181, 89, 1, 245, 48, 89, 1, 215, 72, 89, - 1, 240, 135, 89, 1, 201, 66, 89, 1, 239, 27, 89, 1, 201, 61, 89, 1, 216, - 55, 89, 1, 189, 89, 1, 202, 233, 89, 1, 149, 89, 1, 202, 169, 89, 1, 216, - 49, 89, 1, 249, 144, 89, 1, 213, 5, 89, 1, 212, 116, 89, 1, 212, 233, 89, - 1, 218, 250, 89, 1, 196, 3, 89, 1, 209, 232, 89, 1, 222, 6, 89, 1, 198, + 224, 146, 89, 1, 224, 11, 89, 1, 224, 117, 89, 1, 216, 252, 89, 1, 247, + 174, 89, 1, 247, 16, 89, 1, 244, 182, 89, 1, 245, 49, 89, 1, 215, 73, 89, + 1, 240, 136, 89, 1, 201, 66, 89, 1, 239, 28, 89, 1, 201, 61, 89, 1, 216, + 56, 89, 1, 189, 89, 1, 202, 233, 89, 1, 149, 89, 1, 202, 169, 89, 1, 216, + 50, 89, 1, 249, 145, 89, 1, 213, 6, 89, 1, 212, 117, 89, 1, 212, 234, 89, + 1, 218, 251, 89, 1, 196, 3, 89, 1, 209, 232, 89, 1, 222, 7, 89, 1, 198, 248, 89, 1, 207, 50, 89, 1, 205, 39, 89, 1, 183, 89, 1, 142, 89, 1, 172, - 89, 1, 211, 158, 89, 226, 72, 18, 211, 144, 89, 226, 72, 18, 211, 157, - 89, 226, 72, 18, 211, 120, 89, 226, 72, 18, 211, 114, 89, 226, 72, 18, - 211, 96, 89, 226, 72, 18, 211, 65, 89, 226, 72, 18, 211, 53, 89, 226, 72, - 18, 211, 52, 89, 226, 72, 18, 209, 89, 89, 226, 72, 18, 209, 82, 89, 226, - 72, 18, 221, 150, 89, 226, 72, 18, 221, 138, 89, 226, 72, 18, 211, 138, - 89, 226, 72, 18, 211, 150, 89, 226, 72, 18, 211, 104, 200, 201, 100, 89, - 226, 72, 18, 211, 104, 200, 201, 102, 89, 226, 72, 18, 211, 140, 89, 18, - 226, 56, 251, 17, 89, 18, 226, 56, 252, 167, 89, 18, 2, 252, 167, 89, 18, - 2, 68, 89, 18, 2, 226, 119, 89, 18, 2, 196, 148, 89, 18, 2, 195, 168, 89, - 18, 2, 66, 89, 18, 2, 199, 245, 89, 18, 2, 200, 114, 89, 18, 2, 214, 163, - 89, 18, 2, 164, 89, 18, 2, 226, 146, 89, 18, 2, 69, 89, 18, 2, 251, 244, - 89, 18, 2, 251, 199, 89, 18, 2, 214, 101, 89, 18, 2, 250, 149, 89, 2, - 216, 187, 89, 2, 210, 176, 89, 2, 195, 179, 89, 2, 218, 82, 89, 2, 201, - 168, 89, 2, 249, 81, 89, 2, 209, 221, 89, 2, 202, 21, 89, 2, 225, 23, 89, - 2, 251, 201, 89, 2, 208, 220, 208, 212, 89, 2, 199, 4, 89, 2, 244, 173, - 89, 2, 249, 51, 89, 2, 224, 137, 89, 2, 249, 76, 89, 2, 247, 144, 212, - 182, 223, 142, 89, 2, 222, 164, 201, 247, 89, 2, 248, 198, 89, 2, 212, - 235, 218, 137, 89, 2, 223, 239, 89, 241, 16, 16, 210, 56, 89, 2, 250, - 130, 89, 2, 250, 152, 89, 17, 195, 79, 89, 17, 100, 89, 17, 102, 89, 17, + 89, 1, 211, 159, 89, 226, 73, 18, 211, 145, 89, 226, 73, 18, 211, 158, + 89, 226, 73, 18, 211, 121, 89, 226, 73, 18, 211, 115, 89, 226, 73, 18, + 211, 97, 89, 226, 73, 18, 211, 66, 89, 226, 73, 18, 211, 54, 89, 226, 73, + 18, 211, 53, 89, 226, 73, 18, 209, 89, 89, 226, 73, 18, 209, 82, 89, 226, + 73, 18, 221, 151, 89, 226, 73, 18, 221, 139, 89, 226, 73, 18, 211, 139, + 89, 226, 73, 18, 211, 151, 89, 226, 73, 18, 211, 105, 200, 201, 100, 89, + 226, 73, 18, 211, 105, 200, 201, 102, 89, 226, 73, 18, 211, 141, 89, 18, + 226, 57, 251, 18, 89, 18, 226, 57, 252, 168, 89, 18, 2, 252, 168, 89, 18, + 2, 68, 89, 18, 2, 226, 120, 89, 18, 2, 196, 148, 89, 18, 2, 195, 168, 89, + 18, 2, 66, 89, 18, 2, 199, 245, 89, 18, 2, 200, 114, 89, 18, 2, 214, 164, + 89, 18, 2, 164, 89, 18, 2, 226, 147, 89, 18, 2, 69, 89, 18, 2, 251, 245, + 89, 18, 2, 251, 200, 89, 18, 2, 214, 102, 89, 18, 2, 250, 150, 89, 2, + 216, 188, 89, 2, 210, 177, 89, 2, 195, 179, 89, 2, 218, 83, 89, 2, 201, + 168, 89, 2, 249, 82, 89, 2, 209, 221, 89, 2, 202, 21, 89, 2, 225, 24, 89, + 2, 251, 202, 89, 2, 208, 220, 208, 212, 89, 2, 199, 4, 89, 2, 244, 174, + 89, 2, 249, 52, 89, 2, 224, 138, 89, 2, 249, 77, 89, 2, 247, 145, 212, + 183, 223, 143, 89, 2, 222, 165, 201, 247, 89, 2, 248, 199, 89, 2, 212, + 236, 218, 138, 89, 2, 223, 240, 89, 241, 17, 16, 210, 56, 89, 2, 250, + 131, 89, 2, 250, 153, 89, 17, 195, 79, 89, 17, 100, 89, 17, 102, 89, 17, 134, 89, 17, 136, 89, 17, 146, 89, 17, 167, 89, 17, 178, 89, 17, 171, 89, - 17, 182, 89, 16, 222, 164, 250, 154, 205, 174, 89, 16, 222, 164, 250, - 154, 218, 103, 89, 16, 222, 164, 250, 154, 212, 181, 89, 16, 222, 164, - 250, 154, 248, 233, 89, 16, 222, 164, 250, 154, 247, 248, 89, 16, 222, - 164, 250, 154, 212, 48, 89, 16, 222, 164, 250, 154, 212, 42, 89, 16, 222, - 164, 250, 154, 212, 40, 89, 16, 222, 164, 250, 154, 212, 46, 89, 16, 222, - 164, 250, 154, 212, 44, 96, 248, 153, 96, 236, 246, 96, 244, 158, 96, - 234, 216, 204, 226, 96, 244, 167, 96, 235, 6, 238, 249, 96, 202, 20, 205, - 186, 231, 6, 96, 206, 104, 5, 248, 80, 220, 23, 96, 220, 58, 244, 158, - 96, 220, 58, 234, 216, 204, 226, 96, 216, 169, 96, 234, 245, 62, 208, - 115, 100, 96, 234, 245, 62, 208, 115, 102, 96, 234, 245, 62, 208, 115, + 17, 182, 89, 16, 222, 165, 250, 155, 205, 174, 89, 16, 222, 165, 250, + 155, 218, 104, 89, 16, 222, 165, 250, 155, 212, 182, 89, 16, 222, 165, + 250, 155, 248, 234, 89, 16, 222, 165, 250, 155, 247, 249, 89, 16, 222, + 165, 250, 155, 212, 49, 89, 16, 222, 165, 250, 155, 212, 43, 89, 16, 222, + 165, 250, 155, 212, 41, 89, 16, 222, 165, 250, 155, 212, 47, 89, 16, 222, + 165, 250, 155, 212, 45, 96, 248, 154, 96, 236, 247, 96, 244, 159, 96, + 234, 217, 204, 226, 96, 244, 168, 96, 235, 7, 238, 250, 96, 202, 20, 205, + 186, 231, 7, 96, 206, 104, 5, 248, 81, 220, 24, 96, 220, 59, 244, 159, + 96, 220, 59, 234, 217, 204, 226, 96, 216, 170, 96, 234, 246, 62, 208, + 115, 100, 96, 234, 246, 62, 208, 115, 102, 96, 234, 246, 62, 208, 115, 134, 96, 18, 207, 90, 96, 17, 195, 79, 96, 17, 100, 96, 17, 102, 96, 17, 134, 96, 17, 136, 96, 17, 146, 96, 17, 167, 96, 17, 178, 96, 17, 171, 96, 17, 182, 96, 1, 63, 96, 1, 69, 96, 1, 68, 96, 1, 72, 96, 1, 66, 96, 1, - 214, 163, 96, 1, 200, 99, 96, 1, 237, 53, 96, 1, 176, 96, 1, 251, 96, 96, - 1, 249, 144, 96, 1, 161, 96, 1, 211, 158, 96, 1, 234, 122, 96, 1, 166, - 96, 1, 172, 96, 1, 183, 96, 1, 207, 50, 96, 1, 189, 96, 1, 240, 135, 96, - 1, 247, 15, 96, 1, 225, 213, 96, 1, 164, 96, 1, 169, 96, 1, 197, 166, 96, - 1, 235, 238, 96, 1, 155, 96, 1, 224, 145, 96, 1, 201, 113, 96, 1, 195, - 115, 96, 1, 232, 245, 96, 1, 195, 3, 96, 1, 222, 121, 96, 1, 195, 60, 96, - 1, 245, 74, 96, 1, 202, 20, 181, 18, 55, 96, 1, 202, 20, 69, 96, 1, 202, - 20, 68, 96, 1, 202, 20, 72, 96, 1, 202, 20, 66, 96, 1, 202, 20, 214, 163, - 96, 1, 202, 20, 200, 99, 96, 1, 202, 20, 251, 96, 96, 1, 202, 20, 249, - 144, 96, 1, 202, 20, 161, 96, 1, 202, 20, 211, 158, 96, 1, 202, 20, 234, - 122, 96, 1, 202, 20, 166, 96, 1, 202, 20, 189, 96, 1, 202, 20, 240, 135, - 96, 1, 202, 20, 247, 15, 96, 1, 202, 20, 225, 213, 96, 1, 202, 20, 201, + 214, 164, 96, 1, 200, 99, 96, 1, 237, 54, 96, 1, 176, 96, 1, 251, 97, 96, + 1, 249, 145, 96, 1, 161, 96, 1, 211, 159, 96, 1, 234, 123, 96, 1, 166, + 96, 1, 172, 96, 1, 183, 96, 1, 207, 50, 96, 1, 189, 96, 1, 240, 136, 96, + 1, 247, 16, 96, 1, 225, 214, 96, 1, 164, 96, 1, 169, 96, 1, 197, 166, 96, + 1, 235, 239, 96, 1, 155, 96, 1, 224, 146, 96, 1, 201, 113, 96, 1, 195, + 115, 96, 1, 232, 246, 96, 1, 195, 3, 96, 1, 222, 122, 96, 1, 195, 60, 96, + 1, 245, 75, 96, 1, 202, 20, 181, 18, 55, 96, 1, 202, 20, 69, 96, 1, 202, + 20, 68, 96, 1, 202, 20, 72, 96, 1, 202, 20, 66, 96, 1, 202, 20, 214, 164, + 96, 1, 202, 20, 200, 99, 96, 1, 202, 20, 251, 97, 96, 1, 202, 20, 249, + 145, 96, 1, 202, 20, 161, 96, 1, 202, 20, 211, 159, 96, 1, 202, 20, 234, + 123, 96, 1, 202, 20, 166, 96, 1, 202, 20, 189, 96, 1, 202, 20, 240, 136, + 96, 1, 202, 20, 247, 16, 96, 1, 202, 20, 225, 214, 96, 1, 202, 20, 201, 113, 96, 1, 202, 20, 164, 96, 1, 202, 20, 197, 166, 96, 1, 202, 20, 155, - 96, 1, 202, 20, 234, 119, 96, 1, 202, 20, 232, 245, 96, 1, 202, 20, 225, - 170, 96, 1, 202, 20, 216, 212, 96, 1, 202, 20, 237, 155, 96, 1, 206, 104, - 69, 96, 1, 206, 104, 68, 96, 1, 206, 104, 225, 224, 96, 1, 206, 104, 200, - 99, 96, 1, 206, 104, 66, 96, 1, 206, 104, 251, 96, 96, 1, 206, 104, 155, - 96, 1, 206, 104, 234, 122, 96, 1, 206, 104, 142, 96, 1, 206, 104, 161, + 96, 1, 202, 20, 234, 120, 96, 1, 202, 20, 232, 246, 96, 1, 202, 20, 225, + 171, 96, 1, 202, 20, 216, 213, 96, 1, 202, 20, 237, 156, 96, 1, 206, 104, + 69, 96, 1, 206, 104, 68, 96, 1, 206, 104, 225, 225, 96, 1, 206, 104, 200, + 99, 96, 1, 206, 104, 66, 96, 1, 206, 104, 251, 97, 96, 1, 206, 104, 155, + 96, 1, 206, 104, 234, 123, 96, 1, 206, 104, 142, 96, 1, 206, 104, 161, 96, 1, 206, 104, 207, 50, 96, 1, 206, 104, 189, 96, 1, 206, 104, 240, - 135, 96, 1, 206, 104, 225, 213, 96, 1, 206, 104, 235, 238, 96, 1, 206, - 104, 234, 119, 96, 1, 206, 104, 232, 245, 96, 1, 206, 104, 201, 113, 96, - 1, 206, 104, 195, 115, 96, 1, 206, 104, 210, 243, 96, 1, 206, 104, 247, - 15, 96, 1, 206, 104, 195, 74, 96, 1, 220, 58, 68, 96, 1, 220, 58, 155, - 96, 1, 220, 58, 169, 96, 1, 220, 58, 235, 238, 96, 1, 220, 58, 195, 74, - 96, 1, 247, 16, 3, 99, 238, 249, 96, 1, 251, 155, 234, 102, 251, 51, 100, - 96, 1, 251, 155, 234, 102, 199, 3, 100, 96, 1, 251, 155, 234, 102, 240, - 96, 96, 1, 251, 155, 234, 102, 200, 109, 96, 1, 251, 155, 234, 102, 226, - 16, 200, 109, 96, 1, 251, 155, 234, 102, 249, 95, 96, 1, 251, 155, 234, - 102, 115, 249, 95, 96, 1, 251, 155, 234, 102, 63, 96, 1, 251, 155, 234, - 102, 68, 96, 1, 251, 155, 234, 102, 155, 96, 1, 251, 155, 234, 102, 217, - 70, 96, 1, 251, 155, 234, 102, 247, 173, 96, 1, 251, 155, 234, 102, 201, - 78, 96, 1, 251, 155, 234, 102, 201, 66, 96, 1, 251, 155, 234, 102, 240, - 40, 96, 1, 251, 155, 234, 102, 216, 85, 96, 1, 251, 155, 234, 102, 189, - 96, 1, 251, 155, 234, 102, 240, 135, 96, 1, 251, 155, 234, 102, 161, 96, - 1, 251, 155, 234, 102, 213, 5, 96, 1, 251, 155, 234, 102, 205, 80, 96, 1, - 251, 155, 234, 102, 195, 74, 96, 1, 251, 155, 234, 102, 195, 115, 96, 1, - 251, 155, 234, 102, 251, 208, 96, 1, 202, 20, 251, 155, 234, 102, 189, - 96, 1, 202, 20, 251, 155, 234, 102, 195, 74, 96, 1, 220, 58, 251, 155, - 234, 102, 233, 229, 96, 1, 220, 58, 251, 155, 234, 102, 217, 70, 96, 1, - 220, 58, 251, 155, 234, 102, 247, 173, 96, 1, 220, 58, 251, 155, 234, - 102, 225, 179, 96, 1, 220, 58, 251, 155, 234, 102, 201, 78, 96, 1, 220, - 58, 251, 155, 234, 102, 240, 24, 96, 1, 220, 58, 251, 155, 234, 102, 189, - 96, 1, 220, 58, 251, 155, 234, 102, 239, 175, 96, 1, 220, 58, 251, 155, - 234, 102, 205, 80, 96, 1, 220, 58, 251, 155, 234, 102, 240, 244, 96, 1, - 220, 58, 251, 155, 234, 102, 195, 74, 96, 1, 220, 58, 251, 155, 234, 102, - 195, 115, 96, 1, 251, 155, 234, 102, 157, 66, 96, 1, 251, 155, 234, 102, - 157, 164, 96, 1, 220, 58, 251, 155, 234, 102, 248, 196, 96, 1, 251, 155, - 234, 102, 240, 123, 96, 1, 220, 58, 251, 155, 234, 102, 222, 121, 21, 22, - 214, 7, 21, 22, 250, 121, 21, 22, 252, 121, 21, 22, 197, 112, 21, 22, - 212, 54, 21, 22, 213, 100, 21, 22, 211, 175, 21, 22, 203, 77, 21, 22, - 224, 215, 21, 22, 223, 132, 21, 22, 219, 250, 21, 22, 216, 0, 21, 22, - 217, 194, 21, 22, 222, 206, 21, 22, 205, 153, 21, 22, 208, 180, 21, 22, + 136, 96, 1, 206, 104, 225, 214, 96, 1, 206, 104, 235, 239, 96, 1, 206, + 104, 234, 120, 96, 1, 206, 104, 232, 246, 96, 1, 206, 104, 201, 113, 96, + 1, 206, 104, 195, 115, 96, 1, 206, 104, 210, 244, 96, 1, 206, 104, 247, + 16, 96, 1, 206, 104, 195, 74, 96, 1, 220, 59, 68, 96, 1, 220, 59, 155, + 96, 1, 220, 59, 169, 96, 1, 220, 59, 235, 239, 96, 1, 220, 59, 195, 74, + 96, 1, 247, 17, 3, 99, 238, 250, 96, 1, 251, 156, 234, 103, 251, 52, 100, + 96, 1, 251, 156, 234, 103, 199, 3, 100, 96, 1, 251, 156, 234, 103, 240, + 97, 96, 1, 251, 156, 234, 103, 200, 109, 96, 1, 251, 156, 234, 103, 226, + 17, 200, 109, 96, 1, 251, 156, 234, 103, 249, 96, 96, 1, 251, 156, 234, + 103, 115, 249, 96, 96, 1, 251, 156, 234, 103, 63, 96, 1, 251, 156, 234, + 103, 68, 96, 1, 251, 156, 234, 103, 155, 96, 1, 251, 156, 234, 103, 217, + 71, 96, 1, 251, 156, 234, 103, 247, 174, 96, 1, 251, 156, 234, 103, 201, + 78, 96, 1, 251, 156, 234, 103, 201, 66, 96, 1, 251, 156, 234, 103, 240, + 41, 96, 1, 251, 156, 234, 103, 216, 86, 96, 1, 251, 156, 234, 103, 189, + 96, 1, 251, 156, 234, 103, 240, 136, 96, 1, 251, 156, 234, 103, 161, 96, + 1, 251, 156, 234, 103, 213, 6, 96, 1, 251, 156, 234, 103, 205, 80, 96, 1, + 251, 156, 234, 103, 195, 74, 96, 1, 251, 156, 234, 103, 195, 115, 96, 1, + 251, 156, 234, 103, 251, 209, 96, 1, 202, 20, 251, 156, 234, 103, 189, + 96, 1, 202, 20, 251, 156, 234, 103, 195, 74, 96, 1, 220, 59, 251, 156, + 234, 103, 233, 230, 96, 1, 220, 59, 251, 156, 234, 103, 217, 71, 96, 1, + 220, 59, 251, 156, 234, 103, 247, 174, 96, 1, 220, 59, 251, 156, 234, + 103, 225, 180, 96, 1, 220, 59, 251, 156, 234, 103, 201, 78, 96, 1, 220, + 59, 251, 156, 234, 103, 240, 25, 96, 1, 220, 59, 251, 156, 234, 103, 189, + 96, 1, 220, 59, 251, 156, 234, 103, 239, 176, 96, 1, 220, 59, 251, 156, + 234, 103, 205, 80, 96, 1, 220, 59, 251, 156, 234, 103, 240, 245, 96, 1, + 220, 59, 251, 156, 234, 103, 195, 74, 96, 1, 220, 59, 251, 156, 234, 103, + 195, 115, 96, 1, 251, 156, 234, 103, 157, 66, 96, 1, 251, 156, 234, 103, + 157, 164, 96, 1, 220, 59, 251, 156, 234, 103, 248, 197, 96, 1, 251, 156, + 234, 103, 240, 124, 96, 1, 220, 59, 251, 156, 234, 103, 222, 122, 21, 22, + 214, 8, 21, 22, 250, 122, 21, 22, 252, 122, 21, 22, 197, 112, 21, 22, + 212, 55, 21, 22, 213, 101, 21, 22, 211, 176, 21, 22, 203, 77, 21, 22, + 224, 216, 21, 22, 223, 133, 21, 22, 219, 251, 21, 22, 216, 1, 21, 22, + 217, 195, 21, 22, 222, 207, 21, 22, 205, 153, 21, 22, 208, 180, 21, 22, 206, 160, 21, 22, 207, 3, 21, 22, 206, 122, 21, 22, 195, 226, 21, 22, - 196, 75, 21, 22, 210, 190, 21, 22, 215, 114, 21, 22, 214, 140, 215, 114, - 21, 22, 215, 113, 21, 22, 214, 140, 215, 113, 21, 22, 215, 112, 21, 22, - 214, 140, 215, 112, 21, 22, 215, 111, 21, 22, 214, 140, 215, 111, 21, 22, + 196, 75, 21, 22, 210, 191, 21, 22, 215, 115, 21, 22, 214, 141, 215, 115, + 21, 22, 215, 114, 21, 22, 214, 141, 215, 114, 21, 22, 215, 113, 21, 22, + 214, 141, 215, 113, 21, 22, 215, 112, 21, 22, 214, 141, 215, 112, 21, 22, 209, 94, 21, 22, 209, 93, 21, 22, 209, 92, 21, 22, 209, 91, 21, 22, 209, - 90, 21, 22, 209, 98, 21, 22, 214, 140, 214, 2, 21, 22, 214, 140, 203, - 216, 21, 22, 214, 140, 225, 79, 21, 22, 214, 140, 247, 206, 21, 22, 214, - 140, 221, 135, 21, 22, 214, 140, 218, 54, 21, 22, 214, 140, 209, 80, 21, - 22, 214, 140, 207, 52, 21, 22, 237, 66, 197, 199, 21, 22, 197, 86, 197, - 199, 21, 22, 48, 4, 210, 2, 21, 22, 48, 210, 214, 238, 252, 21, 22, 211, - 30, 209, 95, 21, 22, 197, 87, 221, 228, 21, 22, 197, 87, 223, 81, 21, 22, + 90, 21, 22, 209, 98, 21, 22, 214, 141, 214, 3, 21, 22, 214, 141, 203, + 216, 21, 22, 214, 141, 225, 80, 21, 22, 214, 141, 247, 207, 21, 22, 214, + 141, 221, 136, 21, 22, 214, 141, 218, 55, 21, 22, 214, 141, 209, 80, 21, + 22, 214, 141, 207, 52, 21, 22, 237, 67, 197, 199, 21, 22, 197, 86, 197, + 199, 21, 22, 48, 4, 210, 2, 21, 22, 48, 210, 215, 238, 253, 21, 22, 211, + 31, 209, 95, 21, 22, 197, 87, 221, 229, 21, 22, 197, 87, 223, 82, 21, 22, 202, 131, 21, 22, 202, 133, 21, 22, 201, 58, 21, 22, 201, 60, 21, 22, 201, 65, 21, 22, 202, 37, 21, 22, 202, 39, 21, 22, 208, 178, 206, 127, - 21, 22, 208, 178, 206, 190, 21, 22, 208, 178, 231, 165, 21, 22, 92, 233, - 28, 21, 22, 92, 239, 209, 234, 39, 21, 22, 92, 234, 119, 21, 22, 92, 233, - 33, 21, 22, 208, 178, 225, 89, 21, 22, 92, 225, 87, 21, 22, 248, 253, - 239, 209, 159, 21, 22, 248, 253, 239, 209, 144, 21, 22, 92, 239, 204, - 209, 80, 222, 84, 198, 226, 222, 134, 222, 84, 1, 155, 222, 84, 1, 224, - 145, 222, 84, 1, 234, 122, 222, 84, 1, 233, 229, 222, 84, 1, 217, 70, - 222, 84, 1, 247, 173, 222, 84, 1, 247, 15, 222, 84, 1, 225, 213, 222, 84, - 1, 225, 179, 222, 84, 1, 196, 97, 222, 84, 1, 189, 222, 84, 1, 202, 233, - 222, 84, 1, 240, 135, 222, 84, 1, 239, 175, 222, 84, 1, 176, 222, 84, 1, - 161, 222, 84, 1, 213, 5, 222, 84, 1, 249, 144, 222, 84, 1, 248, 196, 222, - 84, 1, 166, 222, 84, 1, 164, 222, 84, 1, 169, 222, 84, 1, 172, 222, 84, - 1, 197, 166, 222, 84, 1, 207, 50, 222, 84, 1, 205, 80, 222, 84, 1, 183, - 222, 84, 1, 142, 222, 84, 1, 233, 24, 222, 84, 1, 201, 217, 222, 84, 18, - 2, 63, 222, 84, 18, 2, 68, 222, 84, 18, 2, 66, 222, 84, 18, 2, 237, 53, - 222, 84, 18, 2, 251, 199, 222, 84, 18, 2, 214, 101, 222, 84, 18, 2, 250, - 149, 222, 84, 18, 2, 69, 222, 84, 18, 2, 72, 222, 84, 204, 152, 1, 164, - 222, 84, 204, 152, 1, 169, 222, 84, 204, 152, 1, 197, 166, 222, 84, 4, 1, - 155, 222, 84, 4, 1, 217, 70, 222, 84, 4, 1, 251, 50, 222, 84, 4, 1, 189, - 222, 84, 4, 1, 176, 222, 84, 4, 1, 161, 222, 84, 4, 1, 166, 222, 84, 4, - 1, 169, 222, 84, 4, 1, 172, 222, 84, 2, 218, 124, 222, 84, 2, 224, 187, - 222, 84, 2, 209, 14, 222, 84, 2, 221, 228, 222, 84, 236, 89, 78, 222, 84, - 211, 78, 78, 222, 84, 17, 195, 79, 222, 84, 17, 100, 222, 84, 17, 102, - 222, 84, 17, 134, 222, 84, 17, 136, 222, 84, 17, 146, 222, 84, 17, 167, - 222, 84, 17, 178, 222, 84, 17, 171, 222, 84, 17, 182, 49, 222, 197, 1, - 155, 49, 222, 197, 1, 196, 208, 49, 222, 197, 1, 217, 70, 49, 222, 197, - 1, 201, 113, 49, 222, 197, 1, 183, 49, 222, 197, 1, 164, 49, 222, 197, 1, - 189, 49, 222, 197, 1, 202, 233, 49, 222, 197, 1, 172, 49, 222, 197, 1, - 161, 49, 222, 197, 1, 213, 5, 49, 222, 197, 1, 166, 49, 222, 197, 1, 235, - 238, 49, 222, 197, 1, 199, 152, 49, 222, 197, 1, 142, 49, 222, 197, 1, - 211, 158, 49, 222, 197, 1, 224, 145, 49, 222, 197, 1, 201, 103, 49, 222, - 197, 1, 176, 49, 222, 197, 1, 63, 49, 222, 197, 1, 68, 49, 222, 197, 1, - 237, 53, 49, 222, 197, 1, 237, 39, 49, 222, 197, 1, 66, 49, 222, 197, 1, - 214, 101, 49, 222, 197, 1, 72, 49, 222, 197, 1, 200, 99, 49, 222, 197, 1, - 69, 49, 222, 197, 1, 250, 147, 49, 222, 197, 1, 251, 199, 49, 222, 197, - 1, 202, 9, 49, 222, 197, 1, 202, 8, 49, 222, 197, 1, 202, 7, 49, 222, - 197, 1, 202, 6, 49, 222, 197, 1, 202, 5, 217, 82, 49, 221, 184, 1, 130, - 211, 158, 217, 82, 49, 221, 184, 1, 126, 211, 158, 217, 82, 49, 221, 184, - 1, 130, 155, 217, 82, 49, 221, 184, 1, 130, 196, 208, 217, 82, 49, 221, - 184, 1, 130, 217, 70, 217, 82, 49, 221, 184, 1, 126, 155, 217, 82, 49, - 221, 184, 1, 126, 196, 208, 217, 82, 49, 221, 184, 1, 126, 217, 70, 217, - 82, 49, 221, 184, 1, 130, 201, 113, 217, 82, 49, 221, 184, 1, 130, 183, - 217, 82, 49, 221, 184, 1, 130, 164, 217, 82, 49, 221, 184, 1, 126, 201, - 113, 217, 82, 49, 221, 184, 1, 126, 183, 217, 82, 49, 221, 184, 1, 126, - 164, 217, 82, 49, 221, 184, 1, 130, 189, 217, 82, 49, 221, 184, 1, 130, - 202, 233, 217, 82, 49, 221, 184, 1, 130, 176, 217, 82, 49, 221, 184, 1, - 126, 189, 217, 82, 49, 221, 184, 1, 126, 202, 233, 217, 82, 49, 221, 184, - 1, 126, 176, 217, 82, 49, 221, 184, 1, 130, 161, 217, 82, 49, 221, 184, - 1, 130, 213, 5, 217, 82, 49, 221, 184, 1, 130, 166, 217, 82, 49, 221, - 184, 1, 126, 161, 217, 82, 49, 221, 184, 1, 126, 213, 5, 217, 82, 49, - 221, 184, 1, 126, 166, 217, 82, 49, 221, 184, 1, 130, 235, 238, 217, 82, - 49, 221, 184, 1, 130, 199, 152, 217, 82, 49, 221, 184, 1, 130, 172, 217, - 82, 49, 221, 184, 1, 126, 235, 238, 217, 82, 49, 221, 184, 1, 126, 199, - 152, 217, 82, 49, 221, 184, 1, 126, 172, 217, 82, 49, 221, 184, 1, 130, - 142, 217, 82, 49, 221, 184, 1, 130, 240, 135, 217, 82, 49, 221, 184, 1, - 130, 249, 144, 217, 82, 49, 221, 184, 1, 126, 142, 217, 82, 49, 221, 184, - 1, 126, 240, 135, 217, 82, 49, 221, 184, 1, 126, 249, 144, 217, 82, 49, - 221, 184, 1, 130, 223, 137, 217, 82, 49, 221, 184, 1, 130, 196, 174, 217, - 82, 49, 221, 184, 1, 126, 223, 137, 217, 82, 49, 221, 184, 1, 126, 196, - 174, 217, 82, 49, 221, 184, 1, 130, 204, 163, 217, 82, 49, 221, 184, 1, - 126, 204, 163, 217, 82, 49, 221, 184, 18, 2, 18, 206, 170, 217, 82, 49, - 221, 184, 18, 2, 252, 167, 217, 82, 49, 221, 184, 18, 2, 226, 119, 217, - 82, 49, 221, 184, 18, 2, 66, 217, 82, 49, 221, 184, 18, 2, 199, 245, 217, - 82, 49, 221, 184, 18, 2, 69, 217, 82, 49, 221, 184, 18, 2, 251, 244, 217, - 82, 49, 221, 184, 18, 2, 72, 217, 82, 49, 221, 184, 18, 2, 214, 189, 217, - 82, 49, 221, 184, 18, 2, 200, 99, 217, 82, 49, 221, 184, 18, 2, 250, 121, - 217, 82, 49, 221, 184, 18, 2, 252, 121, 217, 82, 49, 221, 184, 18, 2, - 199, 237, 217, 82, 49, 221, 184, 18, 2, 214, 7, 217, 82, 49, 221, 184, - 18, 2, 214, 186, 217, 82, 49, 221, 184, 18, 2, 200, 94, 217, 82, 49, 221, - 184, 18, 2, 225, 224, 217, 82, 49, 221, 184, 1, 48, 199, 230, 217, 82, - 49, 221, 184, 1, 48, 217, 72, 217, 82, 49, 221, 184, 1, 48, 218, 54, 217, - 82, 49, 221, 184, 1, 48, 221, 135, 217, 82, 49, 221, 184, 1, 48, 225, 79, - 217, 82, 49, 221, 184, 1, 48, 240, 230, 217, 82, 49, 221, 184, 1, 48, - 250, 111, 217, 82, 49, 221, 184, 152, 220, 27, 217, 82, 49, 221, 184, - 152, 220, 26, 217, 82, 49, 221, 184, 17, 195, 79, 217, 82, 49, 221, 184, - 17, 100, 217, 82, 49, 221, 184, 17, 102, 217, 82, 49, 221, 184, 17, 134, - 217, 82, 49, 221, 184, 17, 136, 217, 82, 49, 221, 184, 17, 146, 217, 82, - 49, 221, 184, 17, 167, 217, 82, 49, 221, 184, 17, 178, 217, 82, 49, 221, - 184, 17, 171, 217, 82, 49, 221, 184, 17, 182, 217, 82, 49, 221, 184, 120, - 17, 100, 217, 82, 49, 221, 184, 2, 223, 64, 217, 82, 49, 221, 184, 2, - 223, 63, 89, 16, 213, 110, 89, 16, 218, 104, 224, 2, 89, 16, 212, 182, - 224, 2, 89, 16, 248, 234, 224, 2, 89, 16, 247, 249, 224, 2, 89, 16, 212, - 49, 224, 2, 89, 16, 212, 43, 224, 2, 89, 16, 212, 41, 224, 2, 89, 16, - 212, 47, 224, 2, 89, 16, 212, 45, 224, 2, 89, 16, 240, 81, 224, 2, 89, - 16, 240, 77, 224, 2, 89, 16, 240, 76, 224, 2, 89, 16, 240, 79, 224, 2, - 89, 16, 240, 78, 224, 2, 89, 16, 240, 75, 224, 2, 89, 16, 200, 253, 89, - 16, 218, 104, 209, 219, 89, 16, 212, 182, 209, 219, 89, 16, 248, 234, - 209, 219, 89, 16, 247, 249, 209, 219, 89, 16, 212, 49, 209, 219, 89, 16, - 212, 43, 209, 219, 89, 16, 212, 41, 209, 219, 89, 16, 212, 47, 209, 219, - 89, 16, 212, 45, 209, 219, 89, 16, 240, 81, 209, 219, 89, 16, 240, 77, - 209, 219, 89, 16, 240, 76, 209, 219, 89, 16, 240, 79, 209, 219, 89, 16, - 240, 78, 209, 219, 89, 16, 240, 75, 209, 219, 248, 13, 1, 155, 248, 13, - 1, 234, 122, 248, 13, 1, 217, 70, 248, 13, 1, 217, 13, 248, 13, 1, 161, - 248, 13, 1, 249, 144, 248, 13, 1, 166, 248, 13, 1, 218, 150, 248, 13, 1, - 189, 248, 13, 1, 240, 135, 248, 13, 1, 176, 248, 13, 1, 215, 251, 248, - 13, 1, 247, 173, 248, 13, 1, 225, 213, 248, 13, 1, 215, 108, 248, 13, 1, - 215, 99, 248, 13, 1, 164, 248, 13, 1, 169, 248, 13, 1, 172, 248, 13, 1, - 199, 152, 248, 13, 1, 183, 248, 13, 1, 63, 248, 13, 1, 142, 248, 13, 18, - 2, 68, 248, 13, 18, 2, 66, 248, 13, 18, 2, 69, 248, 13, 18, 2, 72, 248, - 13, 18, 2, 251, 244, 248, 13, 213, 207, 248, 13, 236, 221, 77, 208, 132, - 49, 120, 1, 130, 155, 49, 120, 1, 130, 224, 145, 49, 120, 1, 130, 223, - 121, 49, 120, 1, 126, 155, 49, 120, 1, 126, 223, 121, 49, 120, 1, 126, - 224, 145, 49, 120, 1, 217, 70, 49, 120, 1, 130, 247, 173, 49, 120, 1, - 130, 247, 15, 49, 120, 1, 126, 247, 173, 49, 120, 1, 126, 183, 49, 120, - 1, 126, 247, 15, 49, 120, 1, 215, 108, 49, 120, 1, 210, 196, 49, 120, 1, - 130, 210, 194, 49, 120, 1, 240, 135, 49, 120, 1, 126, 210, 194, 49, 120, - 1, 210, 205, 49, 120, 1, 130, 189, 49, 120, 1, 130, 202, 233, 49, 120, 1, + 21, 22, 208, 178, 206, 190, 21, 22, 208, 178, 231, 166, 21, 22, 92, 233, + 29, 21, 22, 92, 239, 210, 234, 40, 21, 22, 92, 234, 120, 21, 22, 92, 233, + 34, 21, 22, 208, 178, 225, 90, 21, 22, 92, 225, 88, 21, 22, 248, 254, + 239, 210, 159, 21, 22, 248, 254, 239, 210, 144, 21, 22, 92, 239, 205, + 209, 80, 222, 85, 198, 226, 222, 135, 222, 85, 1, 155, 222, 85, 1, 224, + 146, 222, 85, 1, 234, 123, 222, 85, 1, 233, 230, 222, 85, 1, 217, 71, + 222, 85, 1, 247, 174, 222, 85, 1, 247, 16, 222, 85, 1, 225, 214, 222, 85, + 1, 225, 180, 222, 85, 1, 196, 97, 222, 85, 1, 189, 222, 85, 1, 202, 233, + 222, 85, 1, 240, 136, 222, 85, 1, 239, 176, 222, 85, 1, 176, 222, 85, 1, + 161, 222, 85, 1, 213, 6, 222, 85, 1, 249, 145, 222, 85, 1, 248, 197, 222, + 85, 1, 166, 222, 85, 1, 164, 222, 85, 1, 169, 222, 85, 1, 172, 222, 85, + 1, 197, 166, 222, 85, 1, 207, 50, 222, 85, 1, 205, 80, 222, 85, 1, 183, + 222, 85, 1, 142, 222, 85, 1, 233, 25, 222, 85, 1, 201, 217, 222, 85, 18, + 2, 63, 222, 85, 18, 2, 68, 222, 85, 18, 2, 66, 222, 85, 18, 2, 237, 54, + 222, 85, 18, 2, 251, 200, 222, 85, 18, 2, 214, 102, 222, 85, 18, 2, 250, + 150, 222, 85, 18, 2, 69, 222, 85, 18, 2, 72, 222, 85, 204, 152, 1, 164, + 222, 85, 204, 152, 1, 169, 222, 85, 204, 152, 1, 197, 166, 222, 85, 4, 1, + 155, 222, 85, 4, 1, 217, 71, 222, 85, 4, 1, 251, 51, 222, 85, 4, 1, 189, + 222, 85, 4, 1, 176, 222, 85, 4, 1, 161, 222, 85, 4, 1, 166, 222, 85, 4, + 1, 169, 222, 85, 4, 1, 172, 222, 85, 2, 218, 125, 222, 85, 2, 224, 188, + 222, 85, 2, 209, 14, 222, 85, 2, 221, 229, 222, 85, 236, 90, 78, 222, 85, + 211, 79, 78, 222, 85, 17, 195, 79, 222, 85, 17, 100, 222, 85, 17, 102, + 222, 85, 17, 134, 222, 85, 17, 136, 222, 85, 17, 146, 222, 85, 17, 167, + 222, 85, 17, 178, 222, 85, 17, 171, 222, 85, 17, 182, 49, 222, 198, 1, + 155, 49, 222, 198, 1, 196, 208, 49, 222, 198, 1, 217, 71, 49, 222, 198, + 1, 201, 113, 49, 222, 198, 1, 183, 49, 222, 198, 1, 164, 49, 222, 198, 1, + 189, 49, 222, 198, 1, 202, 233, 49, 222, 198, 1, 172, 49, 222, 198, 1, + 161, 49, 222, 198, 1, 213, 6, 49, 222, 198, 1, 166, 49, 222, 198, 1, 235, + 239, 49, 222, 198, 1, 199, 152, 49, 222, 198, 1, 142, 49, 222, 198, 1, + 211, 159, 49, 222, 198, 1, 224, 146, 49, 222, 198, 1, 201, 103, 49, 222, + 198, 1, 176, 49, 222, 198, 1, 63, 49, 222, 198, 1, 68, 49, 222, 198, 1, + 237, 54, 49, 222, 198, 1, 237, 40, 49, 222, 198, 1, 66, 49, 222, 198, 1, + 214, 102, 49, 222, 198, 1, 72, 49, 222, 198, 1, 200, 99, 49, 222, 198, 1, + 69, 49, 222, 198, 1, 250, 148, 49, 222, 198, 1, 251, 200, 49, 222, 198, + 1, 202, 9, 49, 222, 198, 1, 202, 8, 49, 222, 198, 1, 202, 7, 49, 222, + 198, 1, 202, 6, 49, 222, 198, 1, 202, 5, 217, 83, 49, 221, 185, 1, 130, + 211, 159, 217, 83, 49, 221, 185, 1, 126, 211, 159, 217, 83, 49, 221, 185, + 1, 130, 155, 217, 83, 49, 221, 185, 1, 130, 196, 208, 217, 83, 49, 221, + 185, 1, 130, 217, 71, 217, 83, 49, 221, 185, 1, 126, 155, 217, 83, 49, + 221, 185, 1, 126, 196, 208, 217, 83, 49, 221, 185, 1, 126, 217, 71, 217, + 83, 49, 221, 185, 1, 130, 201, 113, 217, 83, 49, 221, 185, 1, 130, 183, + 217, 83, 49, 221, 185, 1, 130, 164, 217, 83, 49, 221, 185, 1, 126, 201, + 113, 217, 83, 49, 221, 185, 1, 126, 183, 217, 83, 49, 221, 185, 1, 126, + 164, 217, 83, 49, 221, 185, 1, 130, 189, 217, 83, 49, 221, 185, 1, 130, + 202, 233, 217, 83, 49, 221, 185, 1, 130, 176, 217, 83, 49, 221, 185, 1, + 126, 189, 217, 83, 49, 221, 185, 1, 126, 202, 233, 217, 83, 49, 221, 185, + 1, 126, 176, 217, 83, 49, 221, 185, 1, 130, 161, 217, 83, 49, 221, 185, + 1, 130, 213, 6, 217, 83, 49, 221, 185, 1, 130, 166, 217, 83, 49, 221, + 185, 1, 126, 161, 217, 83, 49, 221, 185, 1, 126, 213, 6, 217, 83, 49, + 221, 185, 1, 126, 166, 217, 83, 49, 221, 185, 1, 130, 235, 239, 217, 83, + 49, 221, 185, 1, 130, 199, 152, 217, 83, 49, 221, 185, 1, 130, 172, 217, + 83, 49, 221, 185, 1, 126, 235, 239, 217, 83, 49, 221, 185, 1, 126, 199, + 152, 217, 83, 49, 221, 185, 1, 126, 172, 217, 83, 49, 221, 185, 1, 130, + 142, 217, 83, 49, 221, 185, 1, 130, 240, 136, 217, 83, 49, 221, 185, 1, + 130, 249, 145, 217, 83, 49, 221, 185, 1, 126, 142, 217, 83, 49, 221, 185, + 1, 126, 240, 136, 217, 83, 49, 221, 185, 1, 126, 249, 145, 217, 83, 49, + 221, 185, 1, 130, 223, 138, 217, 83, 49, 221, 185, 1, 130, 196, 174, 217, + 83, 49, 221, 185, 1, 126, 223, 138, 217, 83, 49, 221, 185, 1, 126, 196, + 174, 217, 83, 49, 221, 185, 1, 130, 204, 163, 217, 83, 49, 221, 185, 1, + 126, 204, 163, 217, 83, 49, 221, 185, 18, 2, 18, 206, 170, 217, 83, 49, + 221, 185, 18, 2, 252, 168, 217, 83, 49, 221, 185, 18, 2, 226, 120, 217, + 83, 49, 221, 185, 18, 2, 66, 217, 83, 49, 221, 185, 18, 2, 199, 245, 217, + 83, 49, 221, 185, 18, 2, 69, 217, 83, 49, 221, 185, 18, 2, 251, 245, 217, + 83, 49, 221, 185, 18, 2, 72, 217, 83, 49, 221, 185, 18, 2, 214, 190, 217, + 83, 49, 221, 185, 18, 2, 200, 99, 217, 83, 49, 221, 185, 18, 2, 250, 122, + 217, 83, 49, 221, 185, 18, 2, 252, 122, 217, 83, 49, 221, 185, 18, 2, + 199, 237, 217, 83, 49, 221, 185, 18, 2, 214, 8, 217, 83, 49, 221, 185, + 18, 2, 214, 187, 217, 83, 49, 221, 185, 18, 2, 200, 94, 217, 83, 49, 221, + 185, 18, 2, 225, 225, 217, 83, 49, 221, 185, 1, 48, 199, 230, 217, 83, + 49, 221, 185, 1, 48, 217, 73, 217, 83, 49, 221, 185, 1, 48, 218, 55, 217, + 83, 49, 221, 185, 1, 48, 221, 136, 217, 83, 49, 221, 185, 1, 48, 225, 80, + 217, 83, 49, 221, 185, 1, 48, 240, 231, 217, 83, 49, 221, 185, 1, 48, + 250, 112, 217, 83, 49, 221, 185, 152, 220, 28, 217, 83, 49, 221, 185, + 152, 220, 27, 217, 83, 49, 221, 185, 17, 195, 79, 217, 83, 49, 221, 185, + 17, 100, 217, 83, 49, 221, 185, 17, 102, 217, 83, 49, 221, 185, 17, 134, + 217, 83, 49, 221, 185, 17, 136, 217, 83, 49, 221, 185, 17, 146, 217, 83, + 49, 221, 185, 17, 167, 217, 83, 49, 221, 185, 17, 178, 217, 83, 49, 221, + 185, 17, 171, 217, 83, 49, 221, 185, 17, 182, 217, 83, 49, 221, 185, 120, + 17, 100, 217, 83, 49, 221, 185, 2, 223, 65, 217, 83, 49, 221, 185, 2, + 223, 64, 89, 16, 213, 111, 89, 16, 218, 105, 224, 3, 89, 16, 212, 183, + 224, 3, 89, 16, 248, 235, 224, 3, 89, 16, 247, 250, 224, 3, 89, 16, 212, + 50, 224, 3, 89, 16, 212, 44, 224, 3, 89, 16, 212, 42, 224, 3, 89, 16, + 212, 48, 224, 3, 89, 16, 212, 46, 224, 3, 89, 16, 240, 82, 224, 3, 89, + 16, 240, 78, 224, 3, 89, 16, 240, 77, 224, 3, 89, 16, 240, 80, 224, 3, + 89, 16, 240, 79, 224, 3, 89, 16, 240, 76, 224, 3, 89, 16, 200, 253, 89, + 16, 218, 105, 209, 219, 89, 16, 212, 183, 209, 219, 89, 16, 248, 235, + 209, 219, 89, 16, 247, 250, 209, 219, 89, 16, 212, 50, 209, 219, 89, 16, + 212, 44, 209, 219, 89, 16, 212, 42, 209, 219, 89, 16, 212, 48, 209, 219, + 89, 16, 212, 46, 209, 219, 89, 16, 240, 82, 209, 219, 89, 16, 240, 78, + 209, 219, 89, 16, 240, 77, 209, 219, 89, 16, 240, 80, 209, 219, 89, 16, + 240, 79, 209, 219, 89, 16, 240, 76, 209, 219, 248, 14, 1, 155, 248, 14, + 1, 234, 123, 248, 14, 1, 217, 71, 248, 14, 1, 217, 14, 248, 14, 1, 161, + 248, 14, 1, 249, 145, 248, 14, 1, 166, 248, 14, 1, 218, 151, 248, 14, 1, + 189, 248, 14, 1, 240, 136, 248, 14, 1, 176, 248, 14, 1, 215, 252, 248, + 14, 1, 247, 174, 248, 14, 1, 225, 214, 248, 14, 1, 215, 109, 248, 14, 1, + 215, 100, 248, 14, 1, 164, 248, 14, 1, 169, 248, 14, 1, 172, 248, 14, 1, + 199, 152, 248, 14, 1, 183, 248, 14, 1, 63, 248, 14, 1, 142, 248, 14, 18, + 2, 68, 248, 14, 18, 2, 66, 248, 14, 18, 2, 69, 248, 14, 18, 2, 72, 248, + 14, 18, 2, 251, 245, 248, 14, 213, 208, 248, 14, 236, 222, 77, 208, 132, + 49, 120, 1, 130, 155, 49, 120, 1, 130, 224, 146, 49, 120, 1, 130, 223, + 122, 49, 120, 1, 126, 155, 49, 120, 1, 126, 223, 122, 49, 120, 1, 126, + 224, 146, 49, 120, 1, 217, 71, 49, 120, 1, 130, 247, 174, 49, 120, 1, + 130, 247, 16, 49, 120, 1, 126, 247, 174, 49, 120, 1, 126, 183, 49, 120, + 1, 126, 247, 16, 49, 120, 1, 215, 109, 49, 120, 1, 210, 197, 49, 120, 1, + 130, 210, 195, 49, 120, 1, 240, 136, 49, 120, 1, 126, 210, 195, 49, 120, + 1, 210, 206, 49, 120, 1, 130, 189, 49, 120, 1, 130, 202, 233, 49, 120, 1, 126, 189, 49, 120, 1, 126, 202, 233, 49, 120, 1, 176, 49, 120, 1, 249, - 144, 49, 120, 1, 130, 161, 49, 120, 1, 130, 213, 5, 49, 120, 1, 130, 235, - 238, 49, 120, 1, 126, 161, 49, 120, 1, 126, 235, 238, 49, 120, 1, 126, - 213, 5, 49, 120, 1, 166, 49, 120, 1, 126, 164, 49, 120, 1, 130, 164, 49, - 120, 1, 169, 49, 120, 1, 209, 129, 49, 120, 1, 172, 49, 120, 1, 221, 183, + 145, 49, 120, 1, 130, 161, 49, 120, 1, 130, 213, 6, 49, 120, 1, 130, 235, + 239, 49, 120, 1, 126, 161, 49, 120, 1, 126, 235, 239, 49, 120, 1, 126, + 213, 6, 49, 120, 1, 166, 49, 120, 1, 126, 164, 49, 120, 1, 130, 164, 49, + 120, 1, 169, 49, 120, 1, 209, 129, 49, 120, 1, 172, 49, 120, 1, 221, 184, 49, 120, 1, 197, 166, 49, 120, 1, 130, 207, 50, 49, 120, 1, 130, 205, 80, - 49, 120, 1, 130, 183, 49, 120, 1, 130, 142, 49, 120, 1, 222, 36, 49, 120, - 1, 63, 49, 120, 1, 126, 142, 49, 120, 1, 68, 49, 120, 1, 226, 119, 49, - 120, 1, 66, 49, 120, 1, 199, 245, 49, 120, 1, 237, 53, 49, 120, 1, 214, - 101, 49, 120, 1, 223, 64, 49, 120, 1, 233, 95, 183, 49, 120, 108, 2, 219, - 193, 169, 49, 120, 108, 2, 219, 193, 172, 49, 120, 108, 2, 223, 82, 203, - 111, 223, 53, 49, 120, 2, 220, 81, 225, 13, 223, 53, 49, 120, 108, 2, 48, - 217, 70, 49, 120, 108, 2, 126, 161, 49, 120, 108, 2, 130, 210, 195, 214, - 72, 126, 161, 49, 120, 108, 2, 166, 49, 120, 108, 2, 249, 144, 49, 120, + 49, 120, 1, 130, 183, 49, 120, 1, 130, 142, 49, 120, 1, 222, 37, 49, 120, + 1, 63, 49, 120, 1, 126, 142, 49, 120, 1, 68, 49, 120, 1, 226, 120, 49, + 120, 1, 66, 49, 120, 1, 199, 245, 49, 120, 1, 237, 54, 49, 120, 1, 214, + 102, 49, 120, 1, 223, 65, 49, 120, 1, 233, 96, 183, 49, 120, 108, 2, 219, + 194, 169, 49, 120, 108, 2, 219, 194, 172, 49, 120, 108, 2, 223, 83, 203, + 111, 223, 54, 49, 120, 2, 220, 82, 225, 14, 223, 54, 49, 120, 108, 2, 48, + 217, 71, 49, 120, 108, 2, 126, 161, 49, 120, 108, 2, 130, 210, 196, 214, + 73, 126, 161, 49, 120, 108, 2, 166, 49, 120, 108, 2, 249, 145, 49, 120, 108, 2, 183, 49, 120, 2, 208, 244, 49, 120, 18, 2, 63, 49, 120, 18, 2, - 220, 81, 208, 199, 49, 120, 18, 2, 252, 167, 49, 120, 18, 2, 203, 120, - 252, 167, 49, 120, 18, 2, 68, 49, 120, 18, 2, 226, 119, 49, 120, 18, 2, + 220, 82, 208, 199, 49, 120, 18, 2, 252, 168, 49, 120, 18, 2, 203, 120, + 252, 168, 49, 120, 18, 2, 68, 49, 120, 18, 2, 226, 120, 49, 120, 18, 2, 200, 99, 49, 120, 18, 2, 199, 244, 49, 120, 18, 2, 66, 49, 120, 18, 2, - 199, 245, 49, 120, 18, 2, 72, 49, 120, 18, 2, 214, 190, 60, 49, 120, 18, - 2, 214, 7, 49, 120, 18, 2, 69, 49, 120, 18, 2, 251, 244, 49, 120, 18, 2, - 214, 101, 49, 120, 18, 2, 251, 199, 49, 120, 18, 2, 120, 251, 199, 49, - 120, 18, 2, 214, 190, 57, 49, 120, 2, 220, 81, 225, 12, 49, 120, 2, 202, - 10, 49, 120, 2, 202, 9, 49, 120, 2, 224, 105, 202, 8, 49, 120, 2, 224, - 105, 202, 7, 49, 120, 2, 224, 105, 202, 6, 49, 120, 2, 210, 251, 232, - 244, 49, 120, 2, 220, 81, 208, 229, 49, 120, 2, 224, 104, 224, 249, 49, - 120, 38, 241, 43, 238, 252, 49, 120, 231, 156, 17, 195, 79, 49, 120, 231, - 156, 17, 100, 49, 120, 231, 156, 17, 102, 49, 120, 231, 156, 17, 134, 49, - 120, 231, 156, 17, 136, 49, 120, 231, 156, 17, 146, 49, 120, 231, 156, - 17, 167, 49, 120, 231, 156, 17, 178, 49, 120, 231, 156, 17, 171, 49, 120, - 231, 156, 17, 182, 49, 120, 120, 17, 195, 79, 49, 120, 120, 17, 100, 49, + 199, 245, 49, 120, 18, 2, 72, 49, 120, 18, 2, 214, 191, 60, 49, 120, 18, + 2, 214, 8, 49, 120, 18, 2, 69, 49, 120, 18, 2, 251, 245, 49, 120, 18, 2, + 214, 102, 49, 120, 18, 2, 251, 200, 49, 120, 18, 2, 120, 251, 200, 49, + 120, 18, 2, 214, 191, 57, 49, 120, 2, 220, 82, 225, 13, 49, 120, 2, 202, + 10, 49, 120, 2, 202, 9, 49, 120, 2, 224, 106, 202, 8, 49, 120, 2, 224, + 106, 202, 7, 49, 120, 2, 224, 106, 202, 6, 49, 120, 2, 210, 252, 232, + 245, 49, 120, 2, 220, 82, 208, 229, 49, 120, 2, 224, 105, 224, 250, 49, + 120, 38, 241, 44, 238, 253, 49, 120, 231, 157, 17, 195, 79, 49, 120, 231, + 157, 17, 100, 49, 120, 231, 157, 17, 102, 49, 120, 231, 157, 17, 134, 49, + 120, 231, 157, 17, 136, 49, 120, 231, 157, 17, 146, 49, 120, 231, 157, + 17, 167, 49, 120, 231, 157, 17, 178, 49, 120, 231, 157, 17, 171, 49, 120, + 231, 157, 17, 182, 49, 120, 120, 17, 195, 79, 49, 120, 120, 17, 100, 49, 120, 120, 17, 102, 49, 120, 120, 17, 134, 49, 120, 120, 17, 136, 49, 120, 120, 17, 146, 49, 120, 120, 17, 167, 49, 120, 120, 17, 178, 49, 120, 120, 17, 171, 49, 120, 120, 17, 182, 49, 120, 2, 197, 64, 49, 120, 2, 197, 63, - 49, 120, 2, 208, 184, 49, 120, 2, 224, 176, 49, 120, 2, 231, 84, 49, 120, - 2, 239, 11, 49, 120, 2, 210, 89, 209, 194, 210, 205, 49, 120, 2, 220, 81, - 196, 98, 49, 120, 2, 225, 47, 49, 120, 2, 225, 46, 49, 120, 2, 208, 194, - 49, 120, 2, 208, 193, 49, 120, 2, 232, 181, 49, 120, 2, 247, 170, 38, - 237, 239, 244, 240, 252, 21, 38, 239, 148, 38, 226, 62, 38, 237, 230, 51, - 38, 201, 165, 238, 252, 38, 196, 221, 60, 38, 197, 56, 222, 75, 60, 38, - 192, 117, 60, 38, 52, 192, 117, 60, 38, 175, 247, 37, 204, 196, 60, 38, - 204, 182, 247, 37, 204, 196, 60, 38, 213, 141, 57, 38, 52, 213, 141, 57, - 38, 213, 141, 60, 38, 213, 141, 214, 19, 141, 2, 200, 82, 210, 59, 141, - 2, 200, 82, 247, 134, 141, 2, 247, 52, 141, 2, 204, 86, 141, 2, 248, 150, - 141, 1, 251, 178, 141, 1, 251, 179, 203, 50, 141, 1, 226, 115, 141, 1, - 226, 116, 203, 50, 141, 1, 200, 85, 141, 1, 200, 86, 203, 50, 141, 1, - 210, 251, 210, 122, 141, 1, 210, 251, 210, 123, 203, 50, 141, 1, 223, 82, - 222, 158, 141, 1, 223, 82, 222, 159, 203, 50, 141, 1, 237, 11, 141, 1, - 251, 196, 141, 1, 214, 136, 141, 1, 214, 137, 203, 50, 141, 1, 155, 141, - 1, 225, 69, 220, 84, 141, 1, 234, 122, 141, 1, 234, 123, 233, 128, 141, - 1, 217, 70, 141, 1, 247, 173, 141, 1, 247, 174, 223, 68, 141, 1, 225, - 213, 141, 1, 225, 214, 225, 183, 141, 1, 215, 108, 141, 1, 203, 169, 222, - 216, 141, 1, 203, 169, 218, 99, 220, 84, 141, 1, 240, 136, 218, 99, 251, - 135, 141, 1, 240, 136, 218, 99, 220, 84, 141, 1, 218, 0, 210, 208, 141, - 1, 189, 141, 1, 203, 169, 203, 81, 141, 1, 240, 135, 141, 1, 240, 136, - 220, 105, 141, 1, 176, 141, 1, 161, 141, 1, 213, 243, 225, 5, 141, 1, - 249, 144, 141, 1, 249, 145, 224, 188, 141, 1, 166, 141, 1, 164, 141, 1, - 169, 141, 1, 172, 141, 1, 197, 166, 141, 1, 209, 23, 209, 0, 141, 1, 209, - 23, 208, 206, 141, 1, 183, 141, 1, 142, 141, 2, 210, 112, 141, 18, 2, - 203, 50, 141, 18, 2, 200, 81, 141, 18, 2, 200, 82, 208, 202, 141, 18, 2, - 204, 121, 141, 18, 2, 204, 122, 226, 107, 141, 18, 2, 210, 251, 210, 122, - 141, 18, 2, 210, 251, 210, 123, 203, 50, 141, 18, 2, 223, 82, 222, 158, - 141, 18, 2, 223, 82, 222, 159, 203, 50, 141, 18, 2, 203, 121, 141, 18, 2, - 203, 122, 210, 122, 141, 18, 2, 203, 122, 203, 50, 141, 18, 2, 203, 122, - 210, 123, 203, 50, 141, 18, 2, 213, 47, 141, 18, 2, 213, 48, 203, 50, - 141, 252, 0, 251, 255, 141, 1, 225, 35, 208, 201, 141, 1, 224, 111, 208, - 201, 141, 1, 200, 181, 208, 201, 141, 1, 237, 47, 208, 201, 141, 1, 199, - 119, 208, 201, 141, 1, 195, 105, 208, 201, 141, 1, 250, 170, 208, 201, - 141, 17, 195, 79, 141, 17, 100, 141, 17, 102, 141, 17, 134, 141, 17, 136, - 141, 17, 146, 141, 17, 167, 141, 17, 178, 141, 17, 171, 141, 17, 182, - 141, 213, 170, 141, 213, 199, 141, 197, 48, 141, 247, 107, 213, 192, 141, - 247, 107, 206, 81, 141, 247, 107, 213, 138, 141, 213, 198, 141, 34, 16, - 239, 3, 141, 34, 16, 239, 208, 141, 34, 16, 237, 183, 141, 34, 16, 240, - 85, 141, 34, 16, 240, 86, 204, 86, 141, 34, 16, 239, 93, 141, 34, 16, - 240, 127, 141, 34, 16, 239, 184, 141, 34, 16, 240, 109, 141, 34, 16, 240, - 86, 234, 41, 141, 34, 16, 38, 203, 43, 141, 34, 16, 38, 236, 218, 141, - 34, 16, 38, 224, 183, 141, 34, 16, 38, 224, 185, 141, 34, 16, 38, 225, - 187, 141, 34, 16, 38, 224, 184, 3, 225, 187, 141, 34, 16, 38, 224, 186, - 3, 225, 187, 141, 34, 16, 38, 248, 219, 141, 34, 16, 38, 233, 132, 141, - 34, 16, 210, 20, 192, 237, 194, 141, 34, 16, 210, 20, 192, 240, 125, 141, - 34, 16, 210, 20, 244, 202, 201, 26, 141, 34, 16, 210, 20, 244, 202, 203, - 131, 141, 34, 16, 222, 181, 192, 213, 184, 141, 34, 16, 222, 181, 192, - 211, 210, 141, 34, 16, 222, 181, 244, 202, 212, 144, 141, 34, 16, 222, - 181, 244, 202, 212, 128, 141, 34, 16, 222, 181, 192, 212, 170, 204, 110, - 2, 213, 167, 204, 110, 2, 213, 180, 204, 110, 2, 213, 176, 204, 110, 1, - 63, 204, 110, 1, 68, 204, 110, 1, 66, 204, 110, 1, 251, 244, 204, 110, 1, - 72, 204, 110, 1, 69, 204, 110, 1, 236, 115, 204, 110, 1, 155, 204, 110, - 1, 211, 158, 204, 110, 1, 234, 122, 204, 110, 1, 217, 70, 204, 110, 1, - 247, 173, 204, 110, 1, 225, 213, 204, 110, 1, 195, 115, 204, 110, 1, 215, - 108, 204, 110, 1, 189, 204, 110, 1, 240, 135, 204, 110, 1, 176, 204, 110, - 1, 161, 204, 110, 1, 235, 238, 204, 110, 1, 199, 152, 204, 110, 1, 249, - 144, 204, 110, 1, 166, 204, 110, 1, 164, 204, 110, 1, 169, 204, 110, 1, - 172, 204, 110, 1, 197, 166, 204, 110, 1, 183, 204, 110, 1, 196, 208, 204, - 110, 1, 142, 204, 110, 108, 2, 213, 196, 204, 110, 108, 2, 213, 169, 204, - 110, 108, 2, 213, 166, 204, 110, 18, 2, 213, 183, 204, 110, 18, 2, 213, - 165, 204, 110, 18, 2, 213, 189, 204, 110, 18, 2, 213, 175, 204, 110, 18, - 2, 213, 197, 204, 110, 18, 2, 213, 185, 204, 110, 2, 213, 200, 204, 110, - 2, 199, 7, 204, 110, 108, 2, 213, 126, 166, 204, 110, 108, 2, 213, 126, - 197, 166, 204, 110, 1, 224, 145, 204, 110, 1, 204, 43, 204, 110, 17, 195, - 79, 204, 110, 17, 100, 204, 110, 17, 102, 204, 110, 17, 134, 204, 110, - 17, 136, 204, 110, 17, 146, 204, 110, 17, 167, 204, 110, 17, 178, 204, - 110, 17, 171, 204, 110, 17, 182, 204, 110, 250, 131, 204, 110, 1, 210, - 92, 204, 110, 1, 222, 131, 204, 110, 1, 248, 196, 204, 110, 1, 48, 225, - 79, 204, 110, 1, 48, 221, 135, 249, 54, 1, 63, 249, 54, 1, 206, 73, 63, - 249, 54, 1, 142, 249, 54, 1, 206, 73, 142, 249, 54, 1, 220, 56, 142, 249, - 54, 1, 249, 144, 249, 54, 1, 224, 246, 249, 144, 249, 54, 1, 161, 249, - 54, 1, 206, 73, 161, 249, 54, 1, 176, 249, 54, 1, 220, 56, 176, 249, 54, - 1, 197, 166, 249, 54, 1, 206, 73, 197, 166, 249, 54, 1, 213, 215, 197, - 166, 249, 54, 1, 234, 122, 249, 54, 1, 206, 73, 234, 122, 249, 54, 1, - 225, 213, 249, 54, 1, 240, 135, 249, 54, 1, 169, 249, 54, 1, 206, 73, - 169, 249, 54, 1, 166, 249, 54, 1, 206, 73, 166, 249, 54, 1, 205, 157, - 189, 249, 54, 1, 216, 22, 189, 249, 54, 1, 183, 249, 54, 1, 206, 73, 183, - 249, 54, 1, 220, 56, 183, 249, 54, 1, 164, 249, 54, 1, 206, 73, 164, 249, - 54, 1, 217, 70, 249, 54, 1, 172, 249, 54, 1, 206, 73, 172, 249, 54, 1, - 215, 108, 249, 54, 1, 247, 173, 249, 54, 1, 217, 158, 249, 54, 1, 219, - 240, 249, 54, 1, 68, 249, 54, 1, 66, 249, 54, 2, 202, 14, 249, 54, 18, 2, - 69, 249, 54, 18, 2, 213, 215, 69, 249, 54, 18, 2, 237, 53, 249, 54, 18, - 2, 68, 249, 54, 18, 2, 224, 246, 68, 249, 54, 18, 2, 72, 249, 54, 18, 2, - 224, 246, 72, 249, 54, 18, 2, 66, 249, 54, 18, 2, 118, 36, 206, 73, 183, - 249, 54, 108, 2, 217, 72, 249, 54, 108, 2, 233, 14, 249, 54, 213, 178, - 249, 54, 213, 174, 249, 54, 16, 248, 160, 218, 0, 219, 140, 249, 54, 16, - 248, 160, 212, 174, 249, 54, 16, 248, 160, 225, 106, 249, 54, 16, 248, - 160, 213, 178, 222, 142, 1, 155, 222, 142, 1, 224, 28, 222, 142, 1, 224, - 145, 222, 142, 1, 234, 122, 222, 142, 1, 233, 159, 222, 142, 1, 217, 70, - 222, 142, 1, 247, 173, 222, 142, 1, 247, 15, 222, 142, 1, 225, 213, 222, - 142, 1, 215, 108, 222, 142, 1, 189, 222, 142, 1, 202, 233, 222, 142, 1, - 240, 135, 222, 142, 1, 176, 222, 142, 1, 161, 222, 142, 1, 212, 149, 222, - 142, 1, 213, 5, 222, 142, 1, 235, 238, 222, 142, 1, 235, 94, 222, 142, 1, - 249, 144, 222, 142, 1, 248, 136, 222, 142, 1, 166, 222, 142, 1, 219, 1, - 222, 142, 1, 201, 113, 222, 142, 1, 201, 103, 222, 142, 1, 237, 155, 222, - 142, 1, 164, 222, 142, 1, 169, 222, 142, 1, 172, 222, 142, 1, 142, 222, - 142, 1, 232, 24, 222, 142, 1, 199, 152, 222, 142, 1, 183, 222, 142, 1, - 207, 50, 222, 142, 1, 197, 166, 222, 142, 1, 63, 222, 142, 204, 152, 1, - 164, 222, 142, 204, 152, 1, 169, 222, 142, 18, 2, 252, 167, 222, 142, 18, - 2, 68, 222, 142, 18, 2, 72, 222, 142, 18, 2, 214, 101, 222, 142, 18, 2, - 66, 222, 142, 18, 2, 199, 245, 222, 142, 18, 2, 69, 222, 142, 108, 2, - 225, 79, 222, 142, 108, 2, 221, 135, 222, 142, 108, 2, 159, 222, 142, - 108, 2, 218, 54, 222, 142, 108, 2, 214, 2, 222, 142, 108, 2, 144, 222, - 142, 108, 2, 203, 216, 222, 142, 108, 2, 215, 80, 222, 142, 108, 2, 225, - 12, 222, 142, 2, 210, 206, 222, 142, 2, 215, 148, 222, 142, 211, 213, - 203, 164, 222, 142, 211, 213, 215, 92, 202, 125, 203, 164, 222, 142, 211, - 213, 247, 24, 222, 142, 211, 213, 201, 95, 247, 24, 222, 142, 211, 213, - 201, 94, 222, 142, 17, 195, 79, 222, 142, 17, 100, 222, 142, 17, 102, - 222, 142, 17, 134, 222, 142, 17, 136, 222, 142, 17, 146, 222, 142, 17, - 167, 222, 142, 17, 178, 222, 142, 17, 171, 222, 142, 17, 182, 222, 142, - 1, 201, 78, 222, 142, 1, 201, 66, 222, 142, 1, 240, 40, 214, 134, 245, - 67, 17, 195, 79, 214, 134, 245, 67, 17, 100, 214, 134, 245, 67, 17, 102, - 214, 134, 245, 67, 17, 134, 214, 134, 245, 67, 17, 136, 214, 134, 245, - 67, 17, 146, 214, 134, 245, 67, 17, 167, 214, 134, 245, 67, 17, 178, 214, - 134, 245, 67, 17, 171, 214, 134, 245, 67, 17, 182, 214, 134, 245, 67, 1, - 172, 214, 134, 245, 67, 1, 250, 167, 214, 134, 245, 67, 1, 251, 216, 214, - 134, 245, 67, 1, 251, 96, 214, 134, 245, 67, 1, 251, 172, 214, 134, 245, - 67, 1, 223, 81, 214, 134, 245, 67, 1, 252, 129, 214, 134, 245, 67, 1, - 252, 130, 214, 134, 245, 67, 1, 252, 128, 214, 134, 245, 67, 1, 252, 122, - 214, 134, 245, 67, 1, 222, 108, 214, 134, 245, 67, 1, 225, 247, 214, 134, - 245, 67, 1, 226, 120, 214, 134, 245, 67, 1, 226, 13, 214, 134, 245, 67, - 1, 226, 0, 214, 134, 245, 67, 1, 221, 190, 214, 134, 245, 67, 1, 200, - 106, 214, 134, 245, 67, 1, 200, 104, 214, 134, 245, 67, 1, 200, 42, 214, - 134, 245, 67, 1, 199, 237, 214, 134, 245, 67, 1, 222, 196, 214, 134, 245, - 67, 1, 236, 182, 214, 134, 245, 67, 1, 237, 56, 214, 134, 245, 67, 1, - 236, 229, 214, 134, 245, 67, 1, 236, 154, 214, 134, 245, 67, 1, 222, 6, - 214, 134, 245, 67, 1, 214, 43, 214, 134, 245, 67, 1, 214, 185, 214, 134, - 245, 67, 1, 214, 28, 214, 134, 245, 67, 1, 214, 148, 214, 134, 245, 67, - 218, 145, 201, 43, 214, 134, 245, 67, 234, 117, 201, 44, 214, 134, 245, - 67, 218, 139, 201, 44, 214, 134, 245, 67, 210, 137, 214, 134, 245, 67, - 213, 3, 214, 134, 245, 67, 251, 207, 214, 134, 245, 67, 211, 213, 218, - 135, 214, 134, 245, 67, 211, 213, 52, 218, 135, 40, 4, 1, 209, 185, 199, - 118, 40, 4, 1, 221, 232, 239, 251, 40, 4, 1, 217, 209, 72, 40, 4, 1, 197, - 62, 236, 150, 40, 4, 1, 203, 120, 203, 68, 40, 4, 1, 202, 150, 203, 68, - 40, 4, 1, 203, 120, 232, 172, 55, 40, 4, 1, 203, 120, 196, 84, 40, 4, 1, - 200, 67, 200, 87, 94, 218, 146, 6, 1, 251, 105, 94, 218, 146, 6, 1, 249, - 92, 94, 218, 146, 6, 1, 234, 92, 94, 218, 146, 6, 1, 239, 5, 94, 218, - 146, 6, 1, 236, 229, 94, 218, 146, 6, 1, 199, 16, 94, 218, 146, 6, 1, - 195, 82, 94, 218, 146, 6, 1, 203, 114, 94, 218, 146, 6, 1, 226, 85, 94, - 218, 146, 6, 1, 225, 16, 94, 218, 146, 6, 1, 222, 221, 94, 218, 146, 6, - 1, 220, 61, 94, 218, 146, 6, 1, 217, 210, 94, 218, 146, 6, 1, 214, 118, - 94, 218, 146, 6, 1, 213, 156, 94, 218, 146, 6, 1, 195, 70, 94, 218, 146, - 6, 1, 210, 228, 94, 218, 146, 6, 1, 208, 219, 94, 218, 146, 6, 1, 203, - 101, 94, 218, 146, 6, 1, 200, 72, 94, 218, 146, 6, 1, 212, 253, 94, 218, - 146, 6, 1, 224, 133, 94, 218, 146, 6, 1, 233, 220, 94, 218, 146, 6, 1, - 211, 143, 94, 218, 146, 6, 1, 206, 211, 94, 218, 146, 6, 1, 245, 61, 94, - 218, 146, 6, 1, 247, 141, 94, 218, 146, 6, 1, 225, 161, 94, 218, 146, 6, - 1, 244, 255, 94, 218, 146, 6, 1, 246, 255, 94, 218, 146, 6, 1, 196, 206, - 94, 218, 146, 6, 1, 225, 176, 94, 218, 146, 6, 1, 232, 241, 94, 218, 146, - 6, 1, 232, 146, 94, 218, 146, 6, 1, 232, 57, 94, 218, 146, 6, 1, 197, - 109, 94, 218, 146, 6, 1, 232, 174, 94, 218, 146, 6, 1, 231, 180, 94, 218, - 146, 6, 1, 235, 152, 94, 218, 146, 6, 1, 196, 5, 94, 218, 146, 6, 1, 236, - 248, 94, 218, 146, 6, 1, 163, 234, 92, 94, 218, 146, 6, 1, 251, 193, 94, - 218, 146, 6, 1, 251, 233, 94, 218, 146, 6, 1, 232, 172, 55, 94, 218, 146, - 6, 1, 223, 72, 55, 204, 110, 211, 213, 248, 160, 204, 79, 204, 110, 211, - 213, 248, 160, 213, 179, 204, 110, 211, 213, 248, 160, 211, 200, 204, - 110, 211, 213, 248, 160, 247, 158, 204, 110, 211, 213, 248, 160, 222, - 132, 208, 198, 204, 110, 211, 213, 248, 160, 225, 69, 208, 198, 204, 110, - 211, 213, 248, 160, 240, 136, 208, 198, 204, 110, 211, 213, 248, 160, - 249, 145, 208, 198, 199, 115, 152, 224, 242, 199, 115, 152, 207, 16, 199, - 115, 152, 212, 28, 199, 115, 2, 216, 190, 199, 115, 2, 196, 106, 219, 60, - 204, 70, 199, 115, 152, 196, 106, 251, 212, 226, 72, 204, 70, 199, 115, - 152, 196, 106, 226, 72, 204, 70, 199, 115, 152, 196, 106, 224, 230, 226, - 72, 204, 70, 199, 115, 152, 247, 135, 60, 199, 115, 152, 196, 106, 224, - 230, 226, 72, 204, 71, 208, 165, 199, 115, 152, 52, 204, 70, 199, 115, - 152, 201, 165, 204, 70, 199, 115, 152, 224, 230, 251, 52, 199, 115, 152, - 76, 60, 199, 115, 152, 99, 238, 250, 60, 199, 115, 152, 115, 238, 250, - 60, 199, 115, 152, 210, 10, 224, 241, 226, 72, 204, 70, 199, 115, 152, - 250, 164, 226, 72, 204, 70, 199, 115, 2, 199, 3, 204, 70, 199, 115, 2, + 49, 120, 2, 208, 184, 49, 120, 2, 224, 177, 49, 120, 2, 231, 85, 49, 120, + 2, 239, 12, 49, 120, 2, 210, 89, 209, 194, 210, 206, 49, 120, 2, 220, 82, + 196, 98, 49, 120, 2, 225, 48, 49, 120, 2, 225, 47, 49, 120, 2, 208, 194, + 49, 120, 2, 208, 193, 49, 120, 2, 232, 182, 49, 120, 2, 247, 171, 38, + 237, 240, 244, 241, 252, 22, 38, 239, 149, 38, 226, 63, 38, 237, 231, 51, + 38, 201, 165, 238, 253, 38, 196, 221, 60, 38, 197, 56, 222, 76, 60, 38, + 192, 117, 60, 38, 52, 192, 117, 60, 38, 175, 247, 38, 204, 196, 60, 38, + 204, 182, 247, 38, 204, 196, 60, 38, 213, 142, 57, 38, 52, 213, 142, 57, + 38, 213, 142, 60, 38, 213, 142, 214, 20, 141, 2, 200, 82, 210, 59, 141, + 2, 200, 82, 247, 135, 141, 2, 247, 53, 141, 2, 204, 86, 141, 2, 248, 151, + 141, 1, 251, 179, 141, 1, 251, 180, 203, 50, 141, 1, 226, 116, 141, 1, + 226, 117, 203, 50, 141, 1, 200, 85, 141, 1, 200, 86, 203, 50, 141, 1, + 210, 252, 210, 122, 141, 1, 210, 252, 210, 123, 203, 50, 141, 1, 223, 83, + 222, 159, 141, 1, 223, 83, 222, 160, 203, 50, 141, 1, 237, 12, 141, 1, + 251, 197, 141, 1, 214, 137, 141, 1, 214, 138, 203, 50, 141, 1, 155, 141, + 1, 225, 70, 220, 85, 141, 1, 234, 123, 141, 1, 234, 124, 233, 129, 141, + 1, 217, 71, 141, 1, 247, 174, 141, 1, 247, 175, 223, 69, 141, 1, 225, + 214, 141, 1, 225, 215, 225, 184, 141, 1, 215, 109, 141, 1, 203, 169, 222, + 217, 141, 1, 203, 169, 218, 100, 220, 85, 141, 1, 240, 137, 218, 100, + 251, 136, 141, 1, 240, 137, 218, 100, 220, 85, 141, 1, 218, 1, 210, 209, + 141, 1, 189, 141, 1, 203, 169, 203, 81, 141, 1, 240, 136, 141, 1, 240, + 137, 220, 106, 141, 1, 176, 141, 1, 161, 141, 1, 213, 244, 225, 6, 141, + 1, 249, 145, 141, 1, 249, 146, 224, 189, 141, 1, 166, 141, 1, 164, 141, + 1, 169, 141, 1, 172, 141, 1, 197, 166, 141, 1, 209, 23, 209, 0, 141, 1, + 209, 23, 208, 206, 141, 1, 183, 141, 1, 142, 141, 2, 210, 112, 141, 18, + 2, 203, 50, 141, 18, 2, 200, 81, 141, 18, 2, 200, 82, 208, 202, 141, 18, + 2, 204, 121, 141, 18, 2, 204, 122, 226, 108, 141, 18, 2, 210, 252, 210, + 122, 141, 18, 2, 210, 252, 210, 123, 203, 50, 141, 18, 2, 223, 83, 222, + 159, 141, 18, 2, 223, 83, 222, 160, 203, 50, 141, 18, 2, 203, 121, 141, + 18, 2, 203, 122, 210, 122, 141, 18, 2, 203, 122, 203, 50, 141, 18, 2, + 203, 122, 210, 123, 203, 50, 141, 18, 2, 213, 48, 141, 18, 2, 213, 49, + 203, 50, 141, 252, 1, 252, 0, 141, 1, 225, 36, 208, 201, 141, 1, 224, + 112, 208, 201, 141, 1, 200, 181, 208, 201, 141, 1, 237, 48, 208, 201, + 141, 1, 199, 119, 208, 201, 141, 1, 195, 105, 208, 201, 141, 1, 250, 171, + 208, 201, 141, 17, 195, 79, 141, 17, 100, 141, 17, 102, 141, 17, 134, + 141, 17, 136, 141, 17, 146, 141, 17, 167, 141, 17, 178, 141, 17, 171, + 141, 17, 182, 141, 213, 171, 141, 213, 200, 141, 197, 48, 141, 247, 108, + 213, 193, 141, 247, 108, 206, 81, 141, 247, 108, 213, 139, 141, 213, 199, + 141, 34, 16, 239, 4, 141, 34, 16, 239, 209, 141, 34, 16, 237, 184, 141, + 34, 16, 240, 86, 141, 34, 16, 240, 87, 204, 86, 141, 34, 16, 239, 94, + 141, 34, 16, 240, 128, 141, 34, 16, 239, 185, 141, 34, 16, 240, 110, 141, + 34, 16, 240, 87, 234, 42, 141, 34, 16, 38, 203, 43, 141, 34, 16, 38, 236, + 219, 141, 34, 16, 38, 224, 184, 141, 34, 16, 38, 224, 186, 141, 34, 16, + 38, 225, 188, 141, 34, 16, 38, 224, 185, 3, 225, 188, 141, 34, 16, 38, + 224, 187, 3, 225, 188, 141, 34, 16, 38, 248, 220, 141, 34, 16, 38, 233, + 133, 141, 34, 16, 210, 20, 192, 237, 195, 141, 34, 16, 210, 20, 192, 240, + 126, 141, 34, 16, 210, 20, 244, 203, 201, 26, 141, 34, 16, 210, 20, 244, + 203, 203, 131, 141, 34, 16, 222, 182, 192, 213, 185, 141, 34, 16, 222, + 182, 192, 211, 211, 141, 34, 16, 222, 182, 244, 203, 212, 145, 141, 34, + 16, 222, 182, 244, 203, 212, 129, 141, 34, 16, 222, 182, 192, 212, 171, + 204, 110, 2, 213, 168, 204, 110, 2, 213, 181, 204, 110, 2, 213, 177, 204, + 110, 1, 63, 204, 110, 1, 68, 204, 110, 1, 66, 204, 110, 1, 251, 245, 204, + 110, 1, 72, 204, 110, 1, 69, 204, 110, 1, 236, 116, 204, 110, 1, 155, + 204, 110, 1, 211, 159, 204, 110, 1, 234, 123, 204, 110, 1, 217, 71, 204, + 110, 1, 247, 174, 204, 110, 1, 225, 214, 204, 110, 1, 195, 115, 204, 110, + 1, 215, 109, 204, 110, 1, 189, 204, 110, 1, 240, 136, 204, 110, 1, 176, + 204, 110, 1, 161, 204, 110, 1, 235, 239, 204, 110, 1, 199, 152, 204, 110, + 1, 249, 145, 204, 110, 1, 166, 204, 110, 1, 164, 204, 110, 1, 169, 204, + 110, 1, 172, 204, 110, 1, 197, 166, 204, 110, 1, 183, 204, 110, 1, 196, + 208, 204, 110, 1, 142, 204, 110, 108, 2, 213, 197, 204, 110, 108, 2, 213, + 170, 204, 110, 108, 2, 213, 167, 204, 110, 18, 2, 213, 184, 204, 110, 18, + 2, 213, 166, 204, 110, 18, 2, 213, 190, 204, 110, 18, 2, 213, 176, 204, + 110, 18, 2, 213, 198, 204, 110, 18, 2, 213, 186, 204, 110, 2, 213, 201, + 204, 110, 2, 199, 7, 204, 110, 108, 2, 213, 127, 166, 204, 110, 108, 2, + 213, 127, 197, 166, 204, 110, 1, 224, 146, 204, 110, 1, 204, 43, 204, + 110, 17, 195, 79, 204, 110, 17, 100, 204, 110, 17, 102, 204, 110, 17, + 134, 204, 110, 17, 136, 204, 110, 17, 146, 204, 110, 17, 167, 204, 110, + 17, 178, 204, 110, 17, 171, 204, 110, 17, 182, 204, 110, 250, 132, 204, + 110, 1, 210, 92, 204, 110, 1, 222, 132, 204, 110, 1, 248, 197, 204, 110, + 1, 48, 225, 80, 204, 110, 1, 48, 221, 136, 249, 55, 1, 63, 249, 55, 1, + 206, 73, 63, 249, 55, 1, 142, 249, 55, 1, 206, 73, 142, 249, 55, 1, 220, + 57, 142, 249, 55, 1, 249, 145, 249, 55, 1, 224, 247, 249, 145, 249, 55, + 1, 161, 249, 55, 1, 206, 73, 161, 249, 55, 1, 176, 249, 55, 1, 220, 57, + 176, 249, 55, 1, 197, 166, 249, 55, 1, 206, 73, 197, 166, 249, 55, 1, + 213, 216, 197, 166, 249, 55, 1, 234, 123, 249, 55, 1, 206, 73, 234, 123, + 249, 55, 1, 225, 214, 249, 55, 1, 240, 136, 249, 55, 1, 169, 249, 55, 1, + 206, 73, 169, 249, 55, 1, 166, 249, 55, 1, 206, 73, 166, 249, 55, 1, 205, + 157, 189, 249, 55, 1, 216, 23, 189, 249, 55, 1, 183, 249, 55, 1, 206, 73, + 183, 249, 55, 1, 220, 57, 183, 249, 55, 1, 164, 249, 55, 1, 206, 73, 164, + 249, 55, 1, 217, 71, 249, 55, 1, 172, 249, 55, 1, 206, 73, 172, 249, 55, + 1, 215, 109, 249, 55, 1, 247, 174, 249, 55, 1, 217, 159, 249, 55, 1, 219, + 241, 249, 55, 1, 68, 249, 55, 1, 66, 249, 55, 2, 202, 14, 249, 55, 18, 2, + 69, 249, 55, 18, 2, 213, 216, 69, 249, 55, 18, 2, 237, 54, 249, 55, 18, + 2, 68, 249, 55, 18, 2, 224, 247, 68, 249, 55, 18, 2, 72, 249, 55, 18, 2, + 224, 247, 72, 249, 55, 18, 2, 66, 249, 55, 18, 2, 118, 36, 206, 73, 183, + 249, 55, 108, 2, 217, 73, 249, 55, 108, 2, 233, 15, 249, 55, 213, 179, + 249, 55, 213, 175, 249, 55, 16, 248, 161, 218, 1, 219, 141, 249, 55, 16, + 248, 161, 212, 175, 249, 55, 16, 248, 161, 225, 107, 249, 55, 16, 248, + 161, 213, 179, 222, 143, 1, 155, 222, 143, 1, 224, 29, 222, 143, 1, 224, + 146, 222, 143, 1, 234, 123, 222, 143, 1, 233, 160, 222, 143, 1, 217, 71, + 222, 143, 1, 247, 174, 222, 143, 1, 247, 16, 222, 143, 1, 225, 214, 222, + 143, 1, 215, 109, 222, 143, 1, 189, 222, 143, 1, 202, 233, 222, 143, 1, + 240, 136, 222, 143, 1, 176, 222, 143, 1, 161, 222, 143, 1, 212, 150, 222, + 143, 1, 213, 6, 222, 143, 1, 235, 239, 222, 143, 1, 235, 95, 222, 143, 1, + 249, 145, 222, 143, 1, 248, 137, 222, 143, 1, 166, 222, 143, 1, 219, 2, + 222, 143, 1, 201, 113, 222, 143, 1, 201, 103, 222, 143, 1, 237, 156, 222, + 143, 1, 164, 222, 143, 1, 169, 222, 143, 1, 172, 222, 143, 1, 142, 222, + 143, 1, 232, 25, 222, 143, 1, 199, 152, 222, 143, 1, 183, 222, 143, 1, + 207, 50, 222, 143, 1, 197, 166, 222, 143, 1, 63, 222, 143, 204, 152, 1, + 164, 222, 143, 204, 152, 1, 169, 222, 143, 18, 2, 252, 168, 222, 143, 18, + 2, 68, 222, 143, 18, 2, 72, 222, 143, 18, 2, 214, 102, 222, 143, 18, 2, + 66, 222, 143, 18, 2, 199, 245, 222, 143, 18, 2, 69, 222, 143, 108, 2, + 225, 80, 222, 143, 108, 2, 221, 136, 222, 143, 108, 2, 159, 222, 143, + 108, 2, 218, 55, 222, 143, 108, 2, 214, 3, 222, 143, 108, 2, 144, 222, + 143, 108, 2, 203, 216, 222, 143, 108, 2, 215, 81, 222, 143, 108, 2, 225, + 13, 222, 143, 2, 210, 207, 222, 143, 2, 215, 149, 222, 143, 211, 214, + 203, 164, 222, 143, 211, 214, 215, 93, 202, 125, 203, 164, 222, 143, 211, + 214, 247, 25, 222, 143, 211, 214, 201, 95, 247, 25, 222, 143, 211, 214, + 201, 94, 222, 143, 17, 195, 79, 222, 143, 17, 100, 222, 143, 17, 102, + 222, 143, 17, 134, 222, 143, 17, 136, 222, 143, 17, 146, 222, 143, 17, + 167, 222, 143, 17, 178, 222, 143, 17, 171, 222, 143, 17, 182, 222, 143, + 1, 201, 78, 222, 143, 1, 201, 66, 222, 143, 1, 240, 41, 214, 135, 245, + 68, 17, 195, 79, 214, 135, 245, 68, 17, 100, 214, 135, 245, 68, 17, 102, + 214, 135, 245, 68, 17, 134, 214, 135, 245, 68, 17, 136, 214, 135, 245, + 68, 17, 146, 214, 135, 245, 68, 17, 167, 214, 135, 245, 68, 17, 178, 214, + 135, 245, 68, 17, 171, 214, 135, 245, 68, 17, 182, 214, 135, 245, 68, 1, + 172, 214, 135, 245, 68, 1, 250, 168, 214, 135, 245, 68, 1, 251, 217, 214, + 135, 245, 68, 1, 251, 97, 214, 135, 245, 68, 1, 251, 173, 214, 135, 245, + 68, 1, 223, 82, 214, 135, 245, 68, 1, 252, 130, 214, 135, 245, 68, 1, + 252, 131, 214, 135, 245, 68, 1, 252, 129, 214, 135, 245, 68, 1, 252, 123, + 214, 135, 245, 68, 1, 222, 109, 214, 135, 245, 68, 1, 225, 248, 214, 135, + 245, 68, 1, 226, 121, 214, 135, 245, 68, 1, 226, 14, 214, 135, 245, 68, + 1, 226, 1, 214, 135, 245, 68, 1, 221, 191, 214, 135, 245, 68, 1, 200, + 106, 214, 135, 245, 68, 1, 200, 104, 214, 135, 245, 68, 1, 200, 42, 214, + 135, 245, 68, 1, 199, 237, 214, 135, 245, 68, 1, 222, 197, 214, 135, 245, + 68, 1, 236, 183, 214, 135, 245, 68, 1, 237, 57, 214, 135, 245, 68, 1, + 236, 230, 214, 135, 245, 68, 1, 236, 155, 214, 135, 245, 68, 1, 222, 7, + 214, 135, 245, 68, 1, 214, 44, 214, 135, 245, 68, 1, 214, 186, 214, 135, + 245, 68, 1, 214, 29, 214, 135, 245, 68, 1, 214, 149, 214, 135, 245, 68, + 218, 146, 201, 43, 214, 135, 245, 68, 234, 118, 201, 44, 214, 135, 245, + 68, 218, 140, 201, 44, 214, 135, 245, 68, 210, 137, 214, 135, 245, 68, + 213, 4, 214, 135, 245, 68, 251, 208, 214, 135, 245, 68, 211, 214, 218, + 136, 214, 135, 245, 68, 211, 214, 52, 218, 136, 40, 4, 1, 209, 185, 199, + 118, 40, 4, 1, 221, 233, 239, 252, 40, 4, 1, 217, 210, 72, 40, 4, 1, 197, + 62, 236, 151, 40, 4, 1, 203, 120, 203, 68, 40, 4, 1, 202, 150, 203, 68, + 40, 4, 1, 203, 120, 232, 173, 55, 40, 4, 1, 203, 120, 196, 84, 40, 4, 1, + 200, 67, 200, 87, 94, 218, 147, 6, 1, 251, 106, 94, 218, 147, 6, 1, 249, + 93, 94, 218, 147, 6, 1, 234, 93, 94, 218, 147, 6, 1, 239, 6, 94, 218, + 147, 6, 1, 236, 230, 94, 218, 147, 6, 1, 199, 16, 94, 218, 147, 6, 1, + 195, 82, 94, 218, 147, 6, 1, 203, 114, 94, 218, 147, 6, 1, 226, 86, 94, + 218, 147, 6, 1, 225, 17, 94, 218, 147, 6, 1, 222, 222, 94, 218, 147, 6, + 1, 220, 62, 94, 218, 147, 6, 1, 217, 211, 94, 218, 147, 6, 1, 214, 119, + 94, 218, 147, 6, 1, 213, 157, 94, 218, 147, 6, 1, 195, 70, 94, 218, 147, + 6, 1, 210, 229, 94, 218, 147, 6, 1, 208, 219, 94, 218, 147, 6, 1, 203, + 101, 94, 218, 147, 6, 1, 200, 72, 94, 218, 147, 6, 1, 212, 254, 94, 218, + 147, 6, 1, 224, 134, 94, 218, 147, 6, 1, 233, 221, 94, 218, 147, 6, 1, + 211, 144, 94, 218, 147, 6, 1, 206, 211, 94, 218, 147, 6, 1, 245, 62, 94, + 218, 147, 6, 1, 247, 142, 94, 218, 147, 6, 1, 225, 162, 94, 218, 147, 6, + 1, 245, 0, 94, 218, 147, 6, 1, 247, 0, 94, 218, 147, 6, 1, 196, 206, 94, + 218, 147, 6, 1, 225, 177, 94, 218, 147, 6, 1, 232, 242, 94, 218, 147, 6, + 1, 232, 147, 94, 218, 147, 6, 1, 232, 58, 94, 218, 147, 6, 1, 197, 109, + 94, 218, 147, 6, 1, 232, 175, 94, 218, 147, 6, 1, 231, 181, 94, 218, 147, + 6, 1, 235, 153, 94, 218, 147, 6, 1, 196, 5, 94, 218, 147, 6, 1, 236, 249, + 94, 218, 147, 6, 1, 163, 234, 93, 94, 218, 147, 6, 1, 251, 194, 94, 218, + 147, 6, 1, 251, 234, 94, 218, 147, 6, 1, 232, 173, 55, 94, 218, 147, 6, + 1, 223, 73, 55, 204, 110, 211, 214, 248, 161, 204, 79, 204, 110, 211, + 214, 248, 161, 213, 180, 204, 110, 211, 214, 248, 161, 211, 201, 204, + 110, 211, 214, 248, 161, 247, 159, 204, 110, 211, 214, 248, 161, 222, + 133, 208, 198, 204, 110, 211, 214, 248, 161, 225, 70, 208, 198, 204, 110, + 211, 214, 248, 161, 240, 137, 208, 198, 204, 110, 211, 214, 248, 161, + 249, 146, 208, 198, 199, 115, 152, 224, 243, 199, 115, 152, 207, 16, 199, + 115, 152, 212, 29, 199, 115, 2, 216, 191, 199, 115, 2, 196, 106, 219, 61, + 204, 70, 199, 115, 152, 196, 106, 251, 213, 226, 73, 204, 70, 199, 115, + 152, 196, 106, 226, 73, 204, 70, 199, 115, 152, 196, 106, 224, 231, 226, + 73, 204, 70, 199, 115, 152, 247, 136, 60, 199, 115, 152, 196, 106, 224, + 231, 226, 73, 204, 71, 208, 165, 199, 115, 152, 52, 204, 70, 199, 115, + 152, 201, 165, 204, 70, 199, 115, 152, 224, 231, 251, 53, 199, 115, 152, + 76, 60, 199, 115, 152, 99, 238, 251, 60, 199, 115, 152, 115, 238, 251, + 60, 199, 115, 152, 210, 10, 224, 242, 226, 73, 204, 70, 199, 115, 152, + 250, 165, 226, 73, 204, 70, 199, 115, 2, 199, 3, 204, 70, 199, 115, 2, 199, 3, 200, 101, 199, 115, 2, 210, 89, 199, 3, 200, 101, 199, 115, 2, - 199, 3, 251, 52, 199, 115, 2, 210, 89, 199, 3, 251, 52, 199, 115, 2, 199, - 3, 200, 102, 3, 203, 135, 199, 115, 2, 199, 3, 251, 53, 3, 203, 135, 199, - 115, 2, 251, 51, 251, 67, 199, 115, 2, 251, 51, 249, 111, 199, 115, 2, - 251, 51, 199, 142, 199, 115, 2, 251, 51, 199, 143, 3, 203, 135, 199, 115, - 2, 202, 58, 199, 115, 2, 232, 82, 181, 251, 50, 199, 115, 2, 181, 251, - 50, 199, 115, 2, 209, 142, 181, 251, 50, 199, 115, 2, 251, 51, 200, 108, - 218, 126, 199, 115, 2, 250, 246, 199, 115, 2, 209, 194, 250, 246, 199, - 115, 152, 247, 135, 57, 199, 115, 2, 225, 164, 199, 115, 2, 200, 34, 199, - 115, 2, 250, 162, 199, 115, 152, 210, 3, 57, 199, 115, 152, 52, 210, 3, - 57, 199, 115, 2, 52, 251, 51, 251, 67, 8, 1, 4, 6, 63, 8, 1, 4, 6, 251, - 244, 8, 4, 1, 163, 251, 244, 8, 1, 4, 6, 249, 73, 250, 111, 8, 1, 4, 6, - 247, 206, 8, 1, 4, 6, 240, 230, 8, 1, 4, 6, 236, 120, 8, 1, 4, 6, 69, 8, - 4, 1, 163, 192, 69, 8, 4, 1, 163, 68, 8, 1, 4, 6, 225, 216, 8, 1, 4, 6, - 225, 79, 8, 1, 4, 6, 223, 99, 3, 106, 8, 1, 4, 6, 221, 135, 8, 1, 4, 6, - 210, 89, 218, 54, 8, 1, 4, 6, 72, 8, 1, 4, 6, 192, 72, 8, 4, 1, 206, 96, + 199, 3, 251, 53, 199, 115, 2, 210, 89, 199, 3, 251, 53, 199, 115, 2, 199, + 3, 200, 102, 3, 203, 135, 199, 115, 2, 199, 3, 251, 54, 3, 203, 135, 199, + 115, 2, 251, 52, 251, 68, 199, 115, 2, 251, 52, 249, 112, 199, 115, 2, + 251, 52, 199, 142, 199, 115, 2, 251, 52, 199, 143, 3, 203, 135, 199, 115, + 2, 202, 58, 199, 115, 2, 232, 83, 181, 251, 51, 199, 115, 2, 181, 251, + 51, 199, 115, 2, 209, 142, 181, 251, 51, 199, 115, 2, 251, 52, 200, 108, + 218, 127, 199, 115, 2, 250, 247, 199, 115, 2, 209, 194, 250, 247, 199, + 115, 152, 247, 136, 57, 199, 115, 2, 225, 165, 199, 115, 2, 200, 34, 199, + 115, 2, 250, 163, 199, 115, 152, 210, 3, 57, 199, 115, 152, 52, 210, 3, + 57, 199, 115, 2, 52, 251, 52, 251, 68, 8, 1, 4, 6, 63, 8, 1, 4, 6, 251, + 245, 8, 4, 1, 163, 251, 245, 8, 1, 4, 6, 249, 74, 250, 112, 8, 1, 4, 6, + 247, 207, 8, 1, 4, 6, 240, 231, 8, 1, 4, 6, 236, 121, 8, 1, 4, 6, 69, 8, + 4, 1, 163, 192, 69, 8, 4, 1, 163, 68, 8, 1, 4, 6, 225, 217, 8, 1, 4, 6, + 225, 80, 8, 1, 4, 6, 223, 100, 3, 106, 8, 1, 4, 6, 221, 136, 8, 1, 4, 6, + 210, 89, 218, 55, 8, 1, 4, 6, 72, 8, 1, 4, 6, 192, 72, 8, 4, 1, 206, 96, 72, 8, 4, 1, 206, 96, 192, 72, 8, 4, 1, 206, 96, 177, 3, 106, 8, 4, 1, - 163, 214, 163, 8, 1, 4, 6, 214, 38, 8, 4, 1, 201, 243, 157, 72, 8, 4, 1, - 248, 84, 157, 72, 8, 1, 4, 6, 214, 2, 8, 1, 4, 6, 210, 89, 144, 8, 1, 4, + 163, 214, 164, 8, 1, 4, 6, 214, 39, 8, 4, 1, 201, 243, 157, 72, 8, 4, 1, + 248, 85, 157, 72, 8, 1, 4, 6, 214, 3, 8, 1, 4, 6, 210, 89, 144, 8, 1, 4, 6, 163, 144, 8, 1, 4, 6, 203, 216, 8, 1, 4, 6, 66, 8, 4, 1, 206, 96, 66, - 8, 4, 1, 206, 96, 239, 147, 66, 8, 4, 1, 206, 96, 163, 221, 135, 8, 1, 4, + 8, 4, 1, 206, 96, 239, 148, 66, 8, 4, 1, 206, 96, 163, 221, 136, 8, 1, 4, 6, 199, 230, 8, 1, 4, 6, 197, 199, 8, 1, 4, 6, 195, 158, 8, 1, 4, 6, 236, - 51, 8, 1, 198, 244, 222, 222, 205, 119, 8, 1, 251, 193, 32, 1, 4, 6, 234, - 93, 32, 1, 4, 6, 222, 244, 32, 1, 4, 6, 212, 219, 32, 1, 4, 6, 210, 74, - 32, 1, 4, 6, 211, 237, 40, 1, 4, 6, 237, 6, 73, 1, 6, 63, 73, 1, 6, 251, - 244, 73, 1, 6, 250, 111, 73, 1, 6, 249, 73, 250, 111, 73, 1, 6, 240, 230, - 73, 1, 6, 69, 73, 1, 6, 210, 89, 69, 73, 1, 6, 234, 189, 73, 1, 6, 233, - 14, 73, 1, 6, 68, 73, 1, 6, 225, 216, 73, 1, 6, 225, 79, 73, 1, 6, 159, - 73, 1, 6, 221, 135, 73, 1, 6, 218, 54, 73, 1, 6, 210, 89, 218, 54, 73, 1, - 6, 72, 73, 1, 6, 214, 38, 73, 1, 6, 214, 2, 73, 1, 6, 144, 73, 1, 6, 203, + 52, 8, 1, 198, 244, 222, 223, 205, 119, 8, 1, 251, 194, 32, 1, 4, 6, 234, + 94, 32, 1, 4, 6, 222, 245, 32, 1, 4, 6, 212, 220, 32, 1, 4, 6, 210, 74, + 32, 1, 4, 6, 211, 238, 40, 1, 4, 6, 237, 7, 73, 1, 6, 63, 73, 1, 6, 251, + 245, 73, 1, 6, 250, 112, 73, 1, 6, 249, 74, 250, 112, 73, 1, 6, 240, 231, + 73, 1, 6, 69, 73, 1, 6, 210, 89, 69, 73, 1, 6, 234, 190, 73, 1, 6, 233, + 15, 73, 1, 6, 68, 73, 1, 6, 225, 217, 73, 1, 6, 225, 80, 73, 1, 6, 159, + 73, 1, 6, 221, 136, 73, 1, 6, 218, 55, 73, 1, 6, 210, 89, 218, 55, 73, 1, + 6, 72, 73, 1, 6, 214, 39, 73, 1, 6, 214, 3, 73, 1, 6, 144, 73, 1, 6, 203, 216, 73, 1, 6, 66, 73, 1, 6, 197, 199, 73, 1, 4, 63, 73, 1, 4, 163, 63, - 73, 1, 4, 251, 133, 73, 1, 4, 163, 251, 244, 73, 1, 4, 250, 111, 73, 1, - 4, 240, 230, 73, 1, 4, 69, 73, 1, 4, 208, 163, 73, 1, 4, 192, 69, 73, 1, - 4, 163, 192, 69, 73, 1, 4, 234, 189, 73, 1, 4, 163, 68, 73, 1, 4, 225, - 79, 73, 1, 4, 221, 135, 73, 1, 4, 236, 214, 73, 1, 4, 72, 73, 1, 4, 192, - 72, 73, 1, 4, 201, 243, 157, 72, 73, 1, 4, 248, 84, 157, 72, 73, 1, 4, - 214, 2, 73, 1, 4, 203, 216, 73, 1, 4, 66, 73, 1, 4, 206, 96, 66, 73, 1, - 4, 163, 221, 135, 73, 1, 4, 199, 230, 73, 1, 4, 251, 193, 73, 1, 4, 248, - 205, 73, 1, 4, 32, 234, 93, 73, 1, 4, 239, 211, 73, 1, 4, 32, 212, 245, - 73, 1, 4, 245, 74, 8, 204, 143, 4, 1, 68, 8, 204, 143, 4, 1, 144, 8, 204, - 143, 4, 1, 66, 8, 204, 143, 4, 1, 199, 230, 32, 204, 143, 4, 1, 248, 205, - 32, 204, 143, 4, 1, 234, 93, 32, 204, 143, 4, 1, 210, 74, 32, 204, 143, - 4, 1, 212, 245, 32, 204, 143, 4, 1, 245, 74, 8, 4, 1, 200, 99, 8, 4, 1, - 74, 3, 112, 202, 84, 8, 4, 1, 240, 231, 3, 112, 202, 84, 8, 4, 1, 236, - 49, 3, 112, 202, 84, 8, 4, 1, 221, 136, 3, 112, 202, 84, 8, 4, 1, 218, - 55, 3, 112, 202, 84, 8, 4, 1, 214, 3, 3, 112, 202, 84, 8, 4, 1, 211, 31, - 3, 112, 202, 84, 8, 4, 1, 211, 31, 3, 235, 108, 26, 112, 202, 84, 8, 4, + 73, 1, 4, 251, 134, 73, 1, 4, 163, 251, 245, 73, 1, 4, 250, 112, 73, 1, + 4, 240, 231, 73, 1, 4, 69, 73, 1, 4, 208, 163, 73, 1, 4, 192, 69, 73, 1, + 4, 163, 192, 69, 73, 1, 4, 234, 190, 73, 1, 4, 163, 68, 73, 1, 4, 225, + 80, 73, 1, 4, 221, 136, 73, 1, 4, 236, 215, 73, 1, 4, 72, 73, 1, 4, 192, + 72, 73, 1, 4, 201, 243, 157, 72, 73, 1, 4, 248, 85, 157, 72, 73, 1, 4, + 214, 3, 73, 1, 4, 203, 216, 73, 1, 4, 66, 73, 1, 4, 206, 96, 66, 73, 1, + 4, 163, 221, 136, 73, 1, 4, 199, 230, 73, 1, 4, 251, 194, 73, 1, 4, 248, + 206, 73, 1, 4, 32, 234, 94, 73, 1, 4, 239, 212, 73, 1, 4, 32, 212, 246, + 73, 1, 4, 245, 75, 8, 204, 143, 4, 1, 68, 8, 204, 143, 4, 1, 144, 8, 204, + 143, 4, 1, 66, 8, 204, 143, 4, 1, 199, 230, 32, 204, 143, 4, 1, 248, 206, + 32, 204, 143, 4, 1, 234, 94, 32, 204, 143, 4, 1, 210, 74, 32, 204, 143, + 4, 1, 212, 246, 32, 204, 143, 4, 1, 245, 75, 8, 4, 1, 200, 99, 8, 4, 1, + 74, 3, 112, 202, 84, 8, 4, 1, 240, 232, 3, 112, 202, 84, 8, 4, 1, 236, + 50, 3, 112, 202, 84, 8, 4, 1, 221, 137, 3, 112, 202, 84, 8, 4, 1, 218, + 56, 3, 112, 202, 84, 8, 4, 1, 214, 4, 3, 112, 202, 84, 8, 4, 1, 211, 32, + 3, 112, 202, 84, 8, 4, 1, 211, 32, 3, 235, 109, 26, 112, 202, 84, 8, 4, 1, 209, 81, 3, 112, 202, 84, 8, 4, 1, 203, 217, 3, 112, 202, 84, 8, 4, 1, - 195, 159, 3, 112, 202, 84, 8, 4, 1, 163, 234, 189, 73, 1, 40, 236, 229, - 8, 4, 1, 226, 38, 234, 189, 8, 4, 1, 202, 236, 3, 204, 200, 8, 4, 6, 1, - 230, 248, 3, 106, 8, 4, 1, 226, 7, 3, 106, 8, 4, 1, 214, 3, 3, 106, 8, 4, - 6, 1, 118, 3, 106, 8, 4, 1, 200, 29, 3, 106, 8, 4, 1, 74, 3, 213, 214, - 122, 8, 4, 1, 240, 231, 3, 213, 214, 122, 8, 4, 1, 236, 49, 3, 213, 214, - 122, 8, 4, 1, 234, 190, 3, 213, 214, 122, 8, 4, 1, 225, 80, 3, 213, 214, - 122, 8, 4, 1, 223, 99, 3, 213, 214, 122, 8, 4, 1, 221, 136, 3, 213, 214, - 122, 8, 4, 1, 218, 55, 3, 213, 214, 122, 8, 4, 1, 214, 3, 3, 213, 214, - 122, 8, 4, 1, 211, 31, 3, 213, 214, 122, 8, 4, 1, 209, 81, 3, 213, 214, - 122, 8, 4, 1, 236, 141, 3, 213, 214, 122, 8, 4, 1, 199, 231, 3, 213, 214, - 122, 8, 4, 1, 196, 223, 3, 213, 214, 122, 8, 4, 1, 195, 159, 3, 213, 214, - 122, 8, 4, 1, 39, 3, 210, 95, 122, 8, 4, 1, 251, 134, 3, 210, 95, 122, 8, - 4, 1, 240, 231, 3, 231, 164, 26, 203, 135, 8, 4, 1, 237, 135, 3, 210, 95, - 122, 8, 4, 1, 192, 237, 135, 3, 210, 95, 122, 8, 4, 1, 210, 89, 192, 237, - 135, 3, 210, 95, 122, 8, 4, 1, 208, 164, 3, 210, 95, 122, 8, 4, 1, 230, - 248, 3, 210, 95, 122, 8, 4, 1, 192, 177, 3, 210, 95, 122, 8, 4, 1, 236, - 141, 3, 210, 95, 122, 8, 4, 1, 118, 3, 210, 95, 122, 8, 4, 1, 236, 52, 3, - 210, 95, 122, 73, 1, 4, 163, 251, 133, 73, 1, 4, 247, 206, 73, 1, 4, 247, - 207, 3, 241, 20, 73, 1, 4, 236, 120, 73, 1, 4, 210, 89, 192, 69, 73, 1, - 4, 236, 48, 73, 1, 4, 238, 251, 225, 217, 3, 106, 73, 1, 4, 145, 234, - 189, 73, 1, 4, 163, 233, 14, 73, 1, 4, 230, 248, 3, 106, 73, 1, 4, 226, - 6, 73, 1, 4, 6, 68, 73, 1, 4, 6, 230, 248, 3, 106, 73, 1, 4, 225, 217, 3, - 241, 56, 73, 1, 4, 223, 99, 3, 210, 95, 122, 73, 1, 4, 223, 99, 3, 213, - 214, 122, 73, 1, 4, 6, 159, 73, 1, 4, 221, 136, 3, 122, 73, 1, 4, 163, - 221, 136, 3, 181, 222, 171, 73, 1, 4, 218, 55, 3, 50, 122, 73, 1, 4, 218, - 55, 3, 210, 95, 122, 73, 1, 4, 6, 218, 54, 73, 1, 4, 249, 73, 72, 73, 1, - 4, 212, 245, 73, 1, 4, 209, 81, 3, 122, 73, 1, 4, 236, 140, 73, 1, 4, - 203, 217, 3, 213, 214, 122, 73, 1, 4, 118, 154, 73, 1, 4, 200, 28, 73, 1, + 195, 159, 3, 112, 202, 84, 8, 4, 1, 163, 234, 190, 73, 1, 40, 236, 230, + 8, 4, 1, 226, 39, 234, 190, 8, 4, 1, 202, 236, 3, 204, 200, 8, 4, 6, 1, + 230, 249, 3, 106, 8, 4, 1, 226, 8, 3, 106, 8, 4, 1, 214, 4, 3, 106, 8, 4, + 6, 1, 118, 3, 106, 8, 4, 1, 200, 29, 3, 106, 8, 4, 1, 74, 3, 213, 215, + 122, 8, 4, 1, 240, 232, 3, 213, 215, 122, 8, 4, 1, 236, 50, 3, 213, 215, + 122, 8, 4, 1, 234, 191, 3, 213, 215, 122, 8, 4, 1, 225, 81, 3, 213, 215, + 122, 8, 4, 1, 223, 100, 3, 213, 215, 122, 8, 4, 1, 221, 137, 3, 213, 215, + 122, 8, 4, 1, 218, 56, 3, 213, 215, 122, 8, 4, 1, 214, 4, 3, 213, 215, + 122, 8, 4, 1, 211, 32, 3, 213, 215, 122, 8, 4, 1, 209, 81, 3, 213, 215, + 122, 8, 4, 1, 236, 142, 3, 213, 215, 122, 8, 4, 1, 199, 231, 3, 213, 215, + 122, 8, 4, 1, 196, 223, 3, 213, 215, 122, 8, 4, 1, 195, 159, 3, 213, 215, + 122, 8, 4, 1, 39, 3, 210, 95, 122, 8, 4, 1, 251, 135, 3, 210, 95, 122, 8, + 4, 1, 240, 232, 3, 231, 165, 26, 203, 135, 8, 4, 1, 237, 136, 3, 210, 95, + 122, 8, 4, 1, 192, 237, 136, 3, 210, 95, 122, 8, 4, 1, 210, 89, 192, 237, + 136, 3, 210, 95, 122, 8, 4, 1, 208, 164, 3, 210, 95, 122, 8, 4, 1, 230, + 249, 3, 210, 95, 122, 8, 4, 1, 192, 177, 3, 210, 95, 122, 8, 4, 1, 236, + 142, 3, 210, 95, 122, 8, 4, 1, 118, 3, 210, 95, 122, 8, 4, 1, 236, 53, 3, + 210, 95, 122, 73, 1, 4, 163, 251, 134, 73, 1, 4, 247, 207, 73, 1, 4, 247, + 208, 3, 241, 21, 73, 1, 4, 236, 121, 73, 1, 4, 210, 89, 192, 69, 73, 1, + 4, 236, 49, 73, 1, 4, 238, 252, 225, 218, 3, 106, 73, 1, 4, 145, 234, + 190, 73, 1, 4, 163, 233, 15, 73, 1, 4, 230, 249, 3, 106, 73, 1, 4, 226, + 7, 73, 1, 4, 6, 68, 73, 1, 4, 6, 230, 249, 3, 106, 73, 1, 4, 225, 218, 3, + 241, 57, 73, 1, 4, 223, 100, 3, 210, 95, 122, 73, 1, 4, 223, 100, 3, 213, + 215, 122, 73, 1, 4, 6, 159, 73, 1, 4, 221, 137, 3, 122, 73, 1, 4, 163, + 221, 137, 3, 181, 222, 172, 73, 1, 4, 218, 56, 3, 50, 122, 73, 1, 4, 218, + 56, 3, 210, 95, 122, 73, 1, 4, 6, 218, 55, 73, 1, 4, 249, 74, 72, 73, 1, + 4, 212, 246, 73, 1, 4, 209, 81, 3, 122, 73, 1, 4, 236, 141, 73, 1, 4, + 203, 217, 3, 213, 215, 122, 73, 1, 4, 118, 154, 73, 1, 4, 200, 28, 73, 1, 4, 6, 66, 73, 1, 4, 199, 231, 3, 122, 73, 1, 4, 163, 199, 230, 73, 1, 4, 195, 158, 73, 1, 4, 195, 159, 3, 210, 95, 122, 73, 1, 4, 195, 159, 3, - 241, 20, 73, 1, 4, 236, 51, 73, 1, 4, 202, 199, 38, 237, 249, 233, 100, - 252, 21, 38, 237, 249, 252, 9, 252, 21, 38, 205, 213, 60, 38, 204, 77, - 78, 38, 220, 112, 38, 233, 97, 38, 220, 110, 38, 252, 7, 38, 233, 98, 38, - 252, 8, 38, 8, 4, 1, 211, 31, 60, 38, 248, 45, 38, 220, 111, 38, 52, 244, - 240, 57, 38, 214, 151, 57, 38, 195, 24, 60, 38, 225, 248, 60, 38, 200, - 22, 57, 38, 200, 5, 57, 38, 8, 4, 1, 235, 78, 192, 39, 57, 38, 8, 4, 1, - 251, 244, 38, 8, 4, 1, 251, 48, 38, 8, 4, 1, 250, 132, 38, 8, 4, 1, 247, - 207, 247, 49, 38, 8, 4, 1, 226, 38, 240, 230, 38, 8, 4, 1, 236, 120, 38, - 8, 4, 1, 234, 189, 38, 8, 1, 4, 6, 234, 189, 38, 8, 4, 1, 225, 79, 38, 8, - 4, 1, 159, 38, 8, 1, 4, 6, 159, 38, 8, 1, 4, 6, 221, 135, 38, 8, 4, 1, - 218, 54, 38, 8, 1, 4, 6, 218, 54, 38, 8, 1, 4, 6, 144, 38, 8, 4, 1, 211, - 31, 209, 188, 38, 8, 4, 1, 209, 80, 38, 8, 4, 1, 181, 209, 80, 38, 8, 4, - 1, 195, 158, 38, 8, 4, 1, 251, 133, 38, 8, 4, 1, 250, 111, 38, 8, 4, 1, - 248, 205, 38, 8, 4, 1, 208, 163, 38, 8, 4, 1, 236, 48, 38, 8, 4, 1, 223, - 99, 3, 52, 112, 202, 84, 38, 8, 4, 1, 177, 3, 175, 247, 37, 106, 38, 8, - 4, 1, 214, 2, 38, 8, 4, 1, 236, 140, 38, 8, 4, 1, 118, 3, 175, 247, 37, - 106, 38, 8, 4, 1, 197, 199, 38, 8, 4, 1, 39, 3, 239, 149, 38, 8, 4, 1, - 177, 3, 239, 149, 38, 8, 4, 1, 118, 3, 239, 149, 38, 124, 203, 148, 57, - 38, 224, 221, 90, 210, 22, 38, 224, 221, 90, 222, 183, 38, 76, 90, 222, - 183, 38, 197, 62, 226, 16, 248, 39, 60, 38, 239, 220, 78, 38, 52, 226, - 16, 248, 47, 60, 38, 251, 138, 180, 202, 30, 60, 38, 50, 250, 217, 57, - 38, 53, 250, 217, 26, 135, 250, 217, 60, 8, 6, 1, 39, 3, 210, 3, 60, 8, + 241, 21, 73, 1, 4, 236, 52, 73, 1, 4, 202, 199, 38, 237, 250, 233, 101, + 252, 22, 38, 237, 250, 252, 10, 252, 22, 38, 205, 213, 60, 38, 204, 77, + 78, 38, 220, 113, 38, 233, 98, 38, 220, 111, 38, 252, 8, 38, 233, 99, 38, + 252, 9, 38, 8, 4, 1, 211, 32, 60, 38, 248, 46, 38, 220, 112, 38, 52, 244, + 241, 57, 38, 214, 152, 57, 38, 195, 24, 60, 38, 225, 249, 60, 38, 200, + 22, 57, 38, 200, 5, 57, 38, 8, 4, 1, 235, 79, 192, 39, 57, 38, 8, 4, 1, + 251, 245, 38, 8, 4, 1, 251, 49, 38, 8, 4, 1, 250, 133, 38, 8, 4, 1, 247, + 208, 247, 50, 38, 8, 4, 1, 226, 39, 240, 231, 38, 8, 4, 1, 236, 121, 38, + 8, 4, 1, 234, 190, 38, 8, 1, 4, 6, 234, 190, 38, 8, 4, 1, 225, 80, 38, 8, + 4, 1, 159, 38, 8, 1, 4, 6, 159, 38, 8, 1, 4, 6, 221, 136, 38, 8, 4, 1, + 218, 55, 38, 8, 1, 4, 6, 218, 55, 38, 8, 1, 4, 6, 144, 38, 8, 4, 1, 211, + 32, 209, 188, 38, 8, 4, 1, 209, 80, 38, 8, 4, 1, 181, 209, 80, 38, 8, 4, + 1, 195, 158, 38, 8, 4, 1, 251, 134, 38, 8, 4, 1, 250, 112, 38, 8, 4, 1, + 248, 206, 38, 8, 4, 1, 208, 163, 38, 8, 4, 1, 236, 49, 38, 8, 4, 1, 223, + 100, 3, 52, 112, 202, 84, 38, 8, 4, 1, 177, 3, 175, 247, 38, 106, 38, 8, + 4, 1, 214, 3, 38, 8, 4, 1, 236, 141, 38, 8, 4, 1, 118, 3, 175, 247, 38, + 106, 38, 8, 4, 1, 197, 199, 38, 8, 4, 1, 39, 3, 239, 150, 38, 8, 4, 1, + 177, 3, 239, 150, 38, 8, 4, 1, 118, 3, 239, 150, 38, 124, 203, 148, 57, + 38, 224, 222, 90, 210, 22, 38, 224, 222, 90, 222, 184, 38, 76, 90, 222, + 184, 38, 197, 62, 226, 17, 248, 40, 60, 38, 239, 221, 78, 38, 52, 226, + 17, 248, 48, 60, 38, 251, 139, 180, 202, 30, 60, 38, 50, 250, 218, 57, + 38, 53, 250, 218, 26, 135, 250, 218, 60, 8, 6, 1, 39, 3, 210, 3, 60, 8, 4, 1, 39, 3, 210, 3, 60, 8, 6, 1, 74, 3, 76, 57, 8, 4, 1, 74, 3, 76, 57, - 8, 6, 1, 74, 3, 76, 60, 8, 4, 1, 74, 3, 76, 60, 8, 6, 1, 74, 3, 222, 75, - 60, 8, 4, 1, 74, 3, 222, 75, 60, 8, 6, 1, 247, 207, 3, 247, 50, 26, 186, - 8, 4, 1, 247, 207, 3, 247, 50, 26, 186, 8, 6, 1, 240, 231, 3, 76, 57, 8, - 4, 1, 240, 231, 3, 76, 57, 8, 6, 1, 240, 231, 3, 76, 60, 8, 4, 1, 240, - 231, 3, 76, 60, 8, 6, 1, 240, 231, 3, 222, 75, 60, 8, 4, 1, 240, 231, 3, - 222, 75, 60, 8, 6, 1, 240, 231, 3, 247, 49, 8, 4, 1, 240, 231, 3, 247, - 49, 8, 6, 1, 240, 231, 3, 244, 240, 60, 8, 4, 1, 240, 231, 3, 244, 240, - 60, 8, 6, 1, 237, 135, 3, 220, 114, 26, 233, 99, 8, 4, 1, 237, 135, 3, - 220, 114, 26, 233, 99, 8, 6, 1, 237, 135, 3, 220, 114, 26, 186, 8, 4, 1, - 237, 135, 3, 220, 114, 26, 186, 8, 6, 1, 237, 135, 3, 244, 240, 60, 8, 4, - 1, 237, 135, 3, 244, 240, 60, 8, 6, 1, 237, 135, 3, 202, 85, 60, 8, 4, 1, - 237, 135, 3, 202, 85, 60, 8, 6, 1, 237, 135, 3, 247, 50, 26, 248, 46, 8, - 4, 1, 237, 135, 3, 247, 50, 26, 248, 46, 8, 6, 1, 236, 49, 3, 76, 57, 8, - 4, 1, 236, 49, 3, 76, 57, 8, 6, 1, 234, 190, 3, 220, 113, 8, 4, 1, 234, - 190, 3, 220, 113, 8, 6, 1, 233, 15, 3, 76, 57, 8, 4, 1, 233, 15, 3, 76, - 57, 8, 6, 1, 233, 15, 3, 76, 60, 8, 4, 1, 233, 15, 3, 76, 60, 8, 6, 1, - 233, 15, 3, 239, 149, 8, 4, 1, 233, 15, 3, 239, 149, 8, 6, 1, 233, 15, 3, - 247, 49, 8, 4, 1, 233, 15, 3, 247, 49, 8, 6, 1, 233, 15, 3, 248, 47, 60, - 8, 4, 1, 233, 15, 3, 248, 47, 60, 8, 6, 1, 230, 248, 3, 202, 85, 60, 8, - 4, 1, 230, 248, 3, 202, 85, 60, 8, 6, 1, 230, 248, 3, 239, 150, 26, 186, - 8, 4, 1, 230, 248, 3, 239, 150, 26, 186, 8, 6, 1, 225, 80, 3, 186, 8, 4, - 1, 225, 80, 3, 186, 8, 6, 1, 225, 80, 3, 76, 60, 8, 4, 1, 225, 80, 3, 76, - 60, 8, 6, 1, 225, 80, 3, 222, 75, 60, 8, 4, 1, 225, 80, 3, 222, 75, 60, - 8, 6, 1, 223, 99, 3, 76, 60, 8, 4, 1, 223, 99, 3, 76, 60, 8, 6, 1, 223, - 99, 3, 76, 248, 226, 26, 220, 113, 8, 4, 1, 223, 99, 3, 76, 248, 226, 26, - 220, 113, 8, 6, 1, 223, 99, 3, 222, 75, 60, 8, 4, 1, 223, 99, 3, 222, 75, - 60, 8, 6, 1, 223, 99, 3, 244, 240, 60, 8, 4, 1, 223, 99, 3, 244, 240, 60, - 8, 6, 1, 221, 136, 3, 186, 8, 4, 1, 221, 136, 3, 186, 8, 6, 1, 221, 136, - 3, 76, 57, 8, 4, 1, 221, 136, 3, 76, 57, 8, 6, 1, 221, 136, 3, 76, 60, 8, - 4, 1, 221, 136, 3, 76, 60, 8, 6, 1, 218, 55, 3, 76, 57, 8, 4, 1, 218, 55, - 3, 76, 57, 8, 6, 1, 218, 55, 3, 76, 60, 8, 4, 1, 218, 55, 3, 76, 60, 8, - 6, 1, 218, 55, 3, 222, 75, 60, 8, 4, 1, 218, 55, 3, 222, 75, 60, 8, 6, 1, - 218, 55, 3, 244, 240, 60, 8, 4, 1, 218, 55, 3, 244, 240, 60, 8, 6, 1, - 177, 3, 202, 85, 26, 186, 8, 4, 1, 177, 3, 202, 85, 26, 186, 8, 6, 1, - 177, 3, 202, 85, 26, 239, 149, 8, 4, 1, 177, 3, 202, 85, 26, 239, 149, 8, - 6, 1, 177, 3, 220, 114, 26, 233, 99, 8, 4, 1, 177, 3, 220, 114, 26, 233, - 99, 8, 6, 1, 177, 3, 220, 114, 26, 186, 8, 4, 1, 177, 3, 220, 114, 26, - 186, 8, 6, 1, 214, 3, 3, 186, 8, 4, 1, 214, 3, 3, 186, 8, 6, 1, 214, 3, - 3, 76, 57, 8, 4, 1, 214, 3, 3, 76, 57, 8, 6, 1, 211, 31, 3, 76, 57, 8, 4, - 1, 211, 31, 3, 76, 57, 8, 6, 1, 211, 31, 3, 76, 60, 8, 4, 1, 211, 31, 3, - 76, 60, 8, 6, 1, 211, 31, 3, 76, 248, 226, 26, 220, 113, 8, 4, 1, 211, - 31, 3, 76, 248, 226, 26, 220, 113, 8, 6, 1, 211, 31, 3, 222, 75, 60, 8, - 4, 1, 211, 31, 3, 222, 75, 60, 8, 6, 1, 209, 81, 3, 76, 57, 8, 4, 1, 209, - 81, 3, 76, 57, 8, 6, 1, 209, 81, 3, 76, 60, 8, 4, 1, 209, 81, 3, 76, 60, - 8, 6, 1, 209, 81, 3, 252, 9, 26, 76, 57, 8, 4, 1, 209, 81, 3, 252, 9, 26, - 76, 57, 8, 6, 1, 209, 81, 3, 247, 106, 26, 76, 57, 8, 4, 1, 209, 81, 3, - 247, 106, 26, 76, 57, 8, 6, 1, 209, 81, 3, 76, 248, 226, 26, 76, 57, 8, - 4, 1, 209, 81, 3, 76, 248, 226, 26, 76, 57, 8, 6, 1, 203, 217, 3, 76, 57, - 8, 4, 1, 203, 217, 3, 76, 57, 8, 6, 1, 203, 217, 3, 76, 60, 8, 4, 1, 203, - 217, 3, 76, 60, 8, 6, 1, 203, 217, 3, 222, 75, 60, 8, 4, 1, 203, 217, 3, - 222, 75, 60, 8, 6, 1, 203, 217, 3, 244, 240, 60, 8, 4, 1, 203, 217, 3, - 244, 240, 60, 8, 6, 1, 118, 3, 239, 150, 60, 8, 4, 1, 118, 3, 239, 150, - 60, 8, 6, 1, 118, 3, 202, 85, 60, 8, 4, 1, 118, 3, 202, 85, 60, 8, 6, 1, - 118, 3, 244, 240, 60, 8, 4, 1, 118, 3, 244, 240, 60, 8, 6, 1, 118, 3, - 202, 85, 26, 186, 8, 4, 1, 118, 3, 202, 85, 26, 186, 8, 6, 1, 118, 3, - 220, 114, 26, 239, 149, 8, 4, 1, 118, 3, 220, 114, 26, 239, 149, 8, 6, 1, - 199, 231, 3, 202, 84, 8, 4, 1, 199, 231, 3, 202, 84, 8, 6, 1, 199, 231, - 3, 76, 60, 8, 4, 1, 199, 231, 3, 76, 60, 8, 6, 1, 197, 200, 3, 233, 99, - 8, 4, 1, 197, 200, 3, 233, 99, 8, 6, 1, 197, 200, 3, 186, 8, 4, 1, 197, - 200, 3, 186, 8, 6, 1, 197, 200, 3, 239, 149, 8, 4, 1, 197, 200, 3, 239, - 149, 8, 6, 1, 197, 200, 3, 76, 57, 8, 4, 1, 197, 200, 3, 76, 57, 8, 6, 1, - 197, 200, 3, 76, 60, 8, 4, 1, 197, 200, 3, 76, 60, 8, 6, 1, 196, 223, 3, - 76, 57, 8, 4, 1, 196, 223, 3, 76, 57, 8, 6, 1, 196, 223, 3, 239, 149, 8, - 4, 1, 196, 223, 3, 239, 149, 8, 6, 1, 196, 149, 3, 76, 57, 8, 4, 1, 196, - 149, 3, 76, 57, 8, 6, 1, 195, 159, 3, 244, 239, 8, 4, 1, 195, 159, 3, - 244, 239, 8, 6, 1, 195, 159, 3, 76, 60, 8, 4, 1, 195, 159, 3, 76, 60, 8, - 6, 1, 195, 159, 3, 222, 75, 60, 8, 4, 1, 195, 159, 3, 222, 75, 60, 8, 4, - 1, 233, 15, 3, 222, 75, 60, 8, 4, 1, 203, 217, 3, 239, 149, 8, 4, 1, 197, - 200, 3, 210, 3, 57, 8, 4, 1, 196, 149, 3, 210, 3, 57, 8, 4, 1, 39, 3, 53, - 157, 210, 2, 8, 4, 1, 181, 209, 81, 3, 76, 57, 8, 4, 1, 181, 209, 81, 3, - 239, 146, 106, 8, 4, 1, 181, 209, 81, 3, 130, 106, 8, 6, 1, 207, 13, 209, - 80, 8, 4, 1, 239, 211, 8, 6, 1, 39, 3, 76, 60, 8, 4, 1, 39, 3, 76, 60, 8, - 6, 1, 39, 3, 231, 164, 57, 8, 4, 1, 39, 3, 231, 164, 57, 8, 6, 1, 39, 3, - 244, 240, 26, 186, 8, 4, 1, 39, 3, 244, 240, 26, 186, 8, 6, 1, 39, 3, - 244, 240, 26, 233, 99, 8, 4, 1, 39, 3, 244, 240, 26, 233, 99, 8, 6, 1, - 39, 3, 244, 240, 26, 231, 164, 57, 8, 4, 1, 39, 3, 244, 240, 26, 231, - 164, 57, 8, 6, 1, 39, 3, 244, 240, 26, 202, 84, 8, 4, 1, 39, 3, 244, 240, - 26, 202, 84, 8, 6, 1, 39, 3, 244, 240, 26, 76, 60, 8, 4, 1, 39, 3, 244, - 240, 26, 76, 60, 8, 6, 1, 39, 3, 248, 47, 26, 186, 8, 4, 1, 39, 3, 248, - 47, 26, 186, 8, 6, 1, 39, 3, 248, 47, 26, 233, 99, 8, 4, 1, 39, 3, 248, - 47, 26, 233, 99, 8, 6, 1, 39, 3, 248, 47, 26, 231, 164, 57, 8, 4, 1, 39, - 3, 248, 47, 26, 231, 164, 57, 8, 6, 1, 39, 3, 248, 47, 26, 202, 84, 8, 4, - 1, 39, 3, 248, 47, 26, 202, 84, 8, 6, 1, 39, 3, 248, 47, 26, 76, 60, 8, - 4, 1, 39, 3, 248, 47, 26, 76, 60, 8, 6, 1, 237, 135, 3, 76, 60, 8, 4, 1, - 237, 135, 3, 76, 60, 8, 6, 1, 237, 135, 3, 231, 164, 57, 8, 4, 1, 237, - 135, 3, 231, 164, 57, 8, 6, 1, 237, 135, 3, 202, 84, 8, 4, 1, 237, 135, - 3, 202, 84, 8, 6, 1, 237, 135, 3, 244, 240, 26, 186, 8, 4, 1, 237, 135, - 3, 244, 240, 26, 186, 8, 6, 1, 237, 135, 3, 244, 240, 26, 233, 99, 8, 4, - 1, 237, 135, 3, 244, 240, 26, 233, 99, 8, 6, 1, 237, 135, 3, 244, 240, - 26, 231, 164, 57, 8, 4, 1, 237, 135, 3, 244, 240, 26, 231, 164, 57, 8, 6, - 1, 237, 135, 3, 244, 240, 26, 202, 84, 8, 4, 1, 237, 135, 3, 244, 240, - 26, 202, 84, 8, 6, 1, 237, 135, 3, 244, 240, 26, 76, 60, 8, 4, 1, 237, - 135, 3, 244, 240, 26, 76, 60, 8, 6, 1, 230, 248, 3, 231, 164, 57, 8, 4, - 1, 230, 248, 3, 231, 164, 57, 8, 6, 1, 230, 248, 3, 76, 60, 8, 4, 1, 230, - 248, 3, 76, 60, 8, 6, 1, 177, 3, 76, 60, 8, 4, 1, 177, 3, 76, 60, 8, 6, - 1, 177, 3, 231, 164, 57, 8, 4, 1, 177, 3, 231, 164, 57, 8, 6, 1, 177, 3, - 244, 240, 26, 186, 8, 4, 1, 177, 3, 244, 240, 26, 186, 8, 6, 1, 177, 3, - 244, 240, 26, 233, 99, 8, 4, 1, 177, 3, 244, 240, 26, 233, 99, 8, 6, 1, - 177, 3, 244, 240, 26, 231, 164, 57, 8, 4, 1, 177, 3, 244, 240, 26, 231, - 164, 57, 8, 6, 1, 177, 3, 244, 240, 26, 202, 84, 8, 4, 1, 177, 3, 244, - 240, 26, 202, 84, 8, 6, 1, 177, 3, 244, 240, 26, 76, 60, 8, 4, 1, 177, 3, - 244, 240, 26, 76, 60, 8, 6, 1, 177, 3, 231, 102, 26, 186, 8, 4, 1, 177, - 3, 231, 102, 26, 186, 8, 6, 1, 177, 3, 231, 102, 26, 233, 99, 8, 4, 1, - 177, 3, 231, 102, 26, 233, 99, 8, 6, 1, 177, 3, 231, 102, 26, 231, 164, - 57, 8, 4, 1, 177, 3, 231, 102, 26, 231, 164, 57, 8, 6, 1, 177, 3, 231, - 102, 26, 202, 84, 8, 4, 1, 177, 3, 231, 102, 26, 202, 84, 8, 6, 1, 177, - 3, 231, 102, 26, 76, 60, 8, 4, 1, 177, 3, 231, 102, 26, 76, 60, 8, 6, 1, - 118, 3, 76, 60, 8, 4, 1, 118, 3, 76, 60, 8, 6, 1, 118, 3, 231, 164, 57, - 8, 4, 1, 118, 3, 231, 164, 57, 8, 6, 1, 118, 3, 231, 102, 26, 186, 8, 4, - 1, 118, 3, 231, 102, 26, 186, 8, 6, 1, 118, 3, 231, 102, 26, 233, 99, 8, - 4, 1, 118, 3, 231, 102, 26, 233, 99, 8, 6, 1, 118, 3, 231, 102, 26, 231, - 164, 57, 8, 4, 1, 118, 3, 231, 102, 26, 231, 164, 57, 8, 6, 1, 118, 3, - 231, 102, 26, 202, 84, 8, 4, 1, 118, 3, 231, 102, 26, 202, 84, 8, 6, 1, - 118, 3, 231, 102, 26, 76, 60, 8, 4, 1, 118, 3, 231, 102, 26, 76, 60, 8, - 6, 1, 196, 149, 3, 233, 99, 8, 4, 1, 196, 149, 3, 233, 99, 8, 6, 1, 196, - 149, 3, 76, 60, 8, 4, 1, 196, 149, 3, 76, 60, 8, 6, 1, 196, 149, 3, 231, - 164, 57, 8, 4, 1, 196, 149, 3, 231, 164, 57, 8, 6, 1, 196, 149, 3, 202, - 84, 8, 4, 1, 196, 149, 3, 202, 84, 8, 6, 1, 219, 61, 222, 37, 8, 4, 1, - 219, 61, 222, 37, 8, 6, 1, 219, 61, 199, 230, 8, 4, 1, 219, 61, 199, 230, - 8, 6, 1, 196, 149, 3, 221, 224, 8, 4, 1, 196, 149, 3, 221, 224, 32, 4, 1, - 251, 134, 3, 211, 230, 32, 4, 1, 251, 134, 3, 240, 61, 32, 4, 1, 251, - 134, 3, 211, 231, 26, 199, 133, 32, 4, 1, 251, 134, 3, 240, 62, 26, 199, - 133, 32, 4, 1, 251, 134, 3, 211, 231, 26, 214, 8, 32, 4, 1, 251, 134, 3, - 240, 62, 26, 214, 8, 32, 4, 1, 251, 134, 3, 211, 231, 26, 213, 37, 32, 4, - 1, 251, 134, 3, 240, 62, 26, 213, 37, 32, 6, 1, 251, 134, 3, 211, 230, - 32, 6, 1, 251, 134, 3, 240, 61, 32, 6, 1, 251, 134, 3, 211, 231, 26, 199, - 133, 32, 6, 1, 251, 134, 3, 240, 62, 26, 199, 133, 32, 6, 1, 251, 134, 3, - 211, 231, 26, 214, 8, 32, 6, 1, 251, 134, 3, 240, 62, 26, 214, 8, 32, 6, - 1, 251, 134, 3, 211, 231, 26, 213, 37, 32, 6, 1, 251, 134, 3, 240, 62, - 26, 213, 37, 32, 4, 1, 236, 174, 3, 211, 230, 32, 4, 1, 236, 174, 3, 240, - 61, 32, 4, 1, 236, 174, 3, 211, 231, 26, 199, 133, 32, 4, 1, 236, 174, 3, - 240, 62, 26, 199, 133, 32, 4, 1, 236, 174, 3, 211, 231, 26, 214, 8, 32, - 4, 1, 236, 174, 3, 240, 62, 26, 214, 8, 32, 6, 1, 236, 174, 3, 211, 230, - 32, 6, 1, 236, 174, 3, 240, 61, 32, 6, 1, 236, 174, 3, 211, 231, 26, 199, - 133, 32, 6, 1, 236, 174, 3, 240, 62, 26, 199, 133, 32, 6, 1, 236, 174, 3, - 211, 231, 26, 214, 8, 32, 6, 1, 236, 174, 3, 240, 62, 26, 214, 8, 32, 4, - 1, 236, 126, 3, 211, 230, 32, 4, 1, 236, 126, 3, 240, 61, 32, 4, 1, 236, - 126, 3, 211, 231, 26, 199, 133, 32, 4, 1, 236, 126, 3, 240, 62, 26, 199, - 133, 32, 4, 1, 236, 126, 3, 211, 231, 26, 214, 8, 32, 4, 1, 236, 126, 3, - 240, 62, 26, 214, 8, 32, 4, 1, 236, 126, 3, 211, 231, 26, 213, 37, 32, 4, - 1, 236, 126, 3, 240, 62, 26, 213, 37, 32, 6, 1, 236, 126, 3, 211, 230, - 32, 6, 1, 236, 126, 3, 240, 61, 32, 6, 1, 236, 126, 3, 211, 231, 26, 199, - 133, 32, 6, 1, 236, 126, 3, 240, 62, 26, 199, 133, 32, 6, 1, 236, 126, 3, - 211, 231, 26, 214, 8, 32, 6, 1, 236, 126, 3, 240, 62, 26, 214, 8, 32, 6, - 1, 236, 126, 3, 211, 231, 26, 213, 37, 32, 6, 1, 236, 126, 3, 240, 62, - 26, 213, 37, 32, 4, 1, 226, 7, 3, 211, 230, 32, 4, 1, 226, 7, 3, 240, 61, - 32, 4, 1, 226, 7, 3, 211, 231, 26, 199, 133, 32, 4, 1, 226, 7, 3, 240, - 62, 26, 199, 133, 32, 4, 1, 226, 7, 3, 211, 231, 26, 214, 8, 32, 4, 1, - 226, 7, 3, 240, 62, 26, 214, 8, 32, 4, 1, 226, 7, 3, 211, 231, 26, 213, - 37, 32, 4, 1, 226, 7, 3, 240, 62, 26, 213, 37, 32, 6, 1, 226, 7, 3, 211, - 230, 32, 6, 1, 226, 7, 3, 240, 61, 32, 6, 1, 226, 7, 3, 211, 231, 26, - 199, 133, 32, 6, 1, 226, 7, 3, 240, 62, 26, 199, 133, 32, 6, 1, 226, 7, - 3, 211, 231, 26, 214, 8, 32, 6, 1, 226, 7, 3, 240, 62, 26, 214, 8, 32, 6, - 1, 226, 7, 3, 211, 231, 26, 213, 37, 32, 6, 1, 226, 7, 3, 240, 62, 26, - 213, 37, 32, 4, 1, 214, 122, 3, 211, 230, 32, 4, 1, 214, 122, 3, 240, 61, - 32, 4, 1, 214, 122, 3, 211, 231, 26, 199, 133, 32, 4, 1, 214, 122, 3, - 240, 62, 26, 199, 133, 32, 4, 1, 214, 122, 3, 211, 231, 26, 214, 8, 32, - 4, 1, 214, 122, 3, 240, 62, 26, 214, 8, 32, 6, 1, 214, 122, 3, 211, 230, - 32, 6, 1, 214, 122, 3, 240, 61, 32, 6, 1, 214, 122, 3, 211, 231, 26, 199, - 133, 32, 6, 1, 214, 122, 3, 240, 62, 26, 199, 133, 32, 6, 1, 214, 122, 3, - 211, 231, 26, 214, 8, 32, 6, 1, 214, 122, 3, 240, 62, 26, 214, 8, 32, 4, - 1, 200, 29, 3, 211, 230, 32, 4, 1, 200, 29, 3, 240, 61, 32, 4, 1, 200, - 29, 3, 211, 231, 26, 199, 133, 32, 4, 1, 200, 29, 3, 240, 62, 26, 199, - 133, 32, 4, 1, 200, 29, 3, 211, 231, 26, 214, 8, 32, 4, 1, 200, 29, 3, - 240, 62, 26, 214, 8, 32, 4, 1, 200, 29, 3, 211, 231, 26, 213, 37, 32, 4, - 1, 200, 29, 3, 240, 62, 26, 213, 37, 32, 6, 1, 200, 29, 3, 240, 61, 32, - 6, 1, 200, 29, 3, 240, 62, 26, 199, 133, 32, 6, 1, 200, 29, 3, 240, 62, - 26, 214, 8, 32, 6, 1, 200, 29, 3, 240, 62, 26, 213, 37, 32, 4, 1, 214, - 124, 3, 211, 230, 32, 4, 1, 214, 124, 3, 240, 61, 32, 4, 1, 214, 124, 3, - 211, 231, 26, 199, 133, 32, 4, 1, 214, 124, 3, 240, 62, 26, 199, 133, 32, - 4, 1, 214, 124, 3, 211, 231, 26, 214, 8, 32, 4, 1, 214, 124, 3, 240, 62, - 26, 214, 8, 32, 4, 1, 214, 124, 3, 211, 231, 26, 213, 37, 32, 4, 1, 214, - 124, 3, 240, 62, 26, 213, 37, 32, 6, 1, 214, 124, 3, 211, 230, 32, 6, 1, - 214, 124, 3, 240, 61, 32, 6, 1, 214, 124, 3, 211, 231, 26, 199, 133, 32, - 6, 1, 214, 124, 3, 240, 62, 26, 199, 133, 32, 6, 1, 214, 124, 3, 211, - 231, 26, 214, 8, 32, 6, 1, 214, 124, 3, 240, 62, 26, 214, 8, 32, 6, 1, - 214, 124, 3, 211, 231, 26, 213, 37, 32, 6, 1, 214, 124, 3, 240, 62, 26, - 213, 37, 32, 4, 1, 251, 134, 3, 199, 133, 32, 4, 1, 251, 134, 3, 214, 8, - 32, 4, 1, 236, 174, 3, 199, 133, 32, 4, 1, 236, 174, 3, 214, 8, 32, 4, 1, - 236, 126, 3, 199, 133, 32, 4, 1, 236, 126, 3, 214, 8, 32, 4, 1, 226, 7, - 3, 199, 133, 32, 4, 1, 226, 7, 3, 214, 8, 32, 4, 1, 214, 122, 3, 199, - 133, 32, 4, 1, 214, 122, 3, 214, 8, 32, 4, 1, 200, 29, 3, 199, 133, 32, - 4, 1, 200, 29, 3, 214, 8, 32, 4, 1, 214, 124, 3, 199, 133, 32, 4, 1, 214, - 124, 3, 214, 8, 32, 4, 1, 251, 134, 3, 211, 231, 26, 195, 225, 32, 4, 1, - 251, 134, 3, 240, 62, 26, 195, 225, 32, 4, 1, 251, 134, 3, 211, 231, 26, - 199, 134, 26, 195, 225, 32, 4, 1, 251, 134, 3, 240, 62, 26, 199, 134, 26, - 195, 225, 32, 4, 1, 251, 134, 3, 211, 231, 26, 214, 9, 26, 195, 225, 32, - 4, 1, 251, 134, 3, 240, 62, 26, 214, 9, 26, 195, 225, 32, 4, 1, 251, 134, - 3, 211, 231, 26, 213, 38, 26, 195, 225, 32, 4, 1, 251, 134, 3, 240, 62, - 26, 213, 38, 26, 195, 225, 32, 6, 1, 251, 134, 3, 211, 231, 26, 211, 244, - 32, 6, 1, 251, 134, 3, 240, 62, 26, 211, 244, 32, 6, 1, 251, 134, 3, 211, - 231, 26, 199, 134, 26, 211, 244, 32, 6, 1, 251, 134, 3, 240, 62, 26, 199, - 134, 26, 211, 244, 32, 6, 1, 251, 134, 3, 211, 231, 26, 214, 9, 26, 211, - 244, 32, 6, 1, 251, 134, 3, 240, 62, 26, 214, 9, 26, 211, 244, 32, 6, 1, - 251, 134, 3, 211, 231, 26, 213, 38, 26, 211, 244, 32, 6, 1, 251, 134, 3, - 240, 62, 26, 213, 38, 26, 211, 244, 32, 4, 1, 236, 126, 3, 211, 231, 26, - 195, 225, 32, 4, 1, 236, 126, 3, 240, 62, 26, 195, 225, 32, 4, 1, 236, - 126, 3, 211, 231, 26, 199, 134, 26, 195, 225, 32, 4, 1, 236, 126, 3, 240, - 62, 26, 199, 134, 26, 195, 225, 32, 4, 1, 236, 126, 3, 211, 231, 26, 214, - 9, 26, 195, 225, 32, 4, 1, 236, 126, 3, 240, 62, 26, 214, 9, 26, 195, - 225, 32, 4, 1, 236, 126, 3, 211, 231, 26, 213, 38, 26, 195, 225, 32, 4, - 1, 236, 126, 3, 240, 62, 26, 213, 38, 26, 195, 225, 32, 6, 1, 236, 126, - 3, 211, 231, 26, 211, 244, 32, 6, 1, 236, 126, 3, 240, 62, 26, 211, 244, - 32, 6, 1, 236, 126, 3, 211, 231, 26, 199, 134, 26, 211, 244, 32, 6, 1, - 236, 126, 3, 240, 62, 26, 199, 134, 26, 211, 244, 32, 6, 1, 236, 126, 3, - 211, 231, 26, 214, 9, 26, 211, 244, 32, 6, 1, 236, 126, 3, 240, 62, 26, - 214, 9, 26, 211, 244, 32, 6, 1, 236, 126, 3, 211, 231, 26, 213, 38, 26, - 211, 244, 32, 6, 1, 236, 126, 3, 240, 62, 26, 213, 38, 26, 211, 244, 32, - 4, 1, 214, 124, 3, 211, 231, 26, 195, 225, 32, 4, 1, 214, 124, 3, 240, - 62, 26, 195, 225, 32, 4, 1, 214, 124, 3, 211, 231, 26, 199, 134, 26, 195, - 225, 32, 4, 1, 214, 124, 3, 240, 62, 26, 199, 134, 26, 195, 225, 32, 4, - 1, 214, 124, 3, 211, 231, 26, 214, 9, 26, 195, 225, 32, 4, 1, 214, 124, - 3, 240, 62, 26, 214, 9, 26, 195, 225, 32, 4, 1, 214, 124, 3, 211, 231, - 26, 213, 38, 26, 195, 225, 32, 4, 1, 214, 124, 3, 240, 62, 26, 213, 38, - 26, 195, 225, 32, 6, 1, 214, 124, 3, 211, 231, 26, 211, 244, 32, 6, 1, - 214, 124, 3, 240, 62, 26, 211, 244, 32, 6, 1, 214, 124, 3, 211, 231, 26, - 199, 134, 26, 211, 244, 32, 6, 1, 214, 124, 3, 240, 62, 26, 199, 134, 26, - 211, 244, 32, 6, 1, 214, 124, 3, 211, 231, 26, 214, 9, 26, 211, 244, 32, - 6, 1, 214, 124, 3, 240, 62, 26, 214, 9, 26, 211, 244, 32, 6, 1, 214, 124, - 3, 211, 231, 26, 213, 38, 26, 211, 244, 32, 6, 1, 214, 124, 3, 240, 62, - 26, 213, 38, 26, 211, 244, 32, 4, 1, 251, 134, 3, 198, 224, 32, 4, 1, - 251, 134, 3, 220, 113, 32, 4, 1, 251, 134, 3, 199, 134, 26, 195, 225, 32, - 4, 1, 251, 134, 3, 195, 225, 32, 4, 1, 251, 134, 3, 214, 9, 26, 195, 225, - 32, 4, 1, 251, 134, 3, 213, 37, 32, 4, 1, 251, 134, 3, 213, 38, 26, 195, - 225, 32, 6, 1, 251, 134, 3, 198, 224, 32, 6, 1, 251, 134, 3, 220, 113, - 32, 6, 1, 251, 134, 3, 199, 133, 32, 6, 1, 251, 134, 3, 214, 8, 32, 6, 1, - 251, 134, 3, 211, 244, 32, 223, 231, 32, 211, 244, 32, 211, 230, 32, 213, - 37, 32, 239, 143, 26, 213, 37, 32, 4, 1, 236, 126, 3, 199, 134, 26, 195, - 225, 32, 4, 1, 236, 126, 3, 195, 225, 32, 4, 1, 236, 126, 3, 214, 9, 26, - 195, 225, 32, 4, 1, 236, 126, 3, 213, 37, 32, 4, 1, 236, 126, 3, 213, 38, - 26, 195, 225, 32, 6, 1, 236, 174, 3, 199, 133, 32, 6, 1, 236, 174, 3, - 214, 8, 32, 6, 1, 236, 126, 3, 199, 133, 32, 6, 1, 236, 126, 3, 214, 8, - 32, 6, 1, 236, 126, 3, 211, 244, 32, 211, 231, 26, 199, 133, 32, 211, - 231, 26, 214, 8, 32, 211, 231, 26, 213, 37, 32, 4, 1, 226, 7, 3, 198, - 224, 32, 4, 1, 226, 7, 3, 220, 113, 32, 4, 1, 226, 7, 3, 239, 143, 26, - 199, 133, 32, 4, 1, 226, 7, 3, 239, 143, 26, 214, 8, 32, 4, 1, 226, 7, 3, - 213, 37, 32, 4, 1, 226, 7, 3, 239, 143, 26, 213, 37, 32, 6, 1, 226, 7, 3, - 198, 224, 32, 6, 1, 226, 7, 3, 220, 113, 32, 6, 1, 226, 7, 3, 199, 133, - 32, 6, 1, 226, 7, 3, 214, 8, 32, 240, 62, 26, 199, 133, 32, 240, 62, 26, - 214, 8, 32, 240, 62, 26, 213, 37, 32, 4, 1, 200, 29, 3, 198, 224, 32, 4, - 1, 200, 29, 3, 220, 113, 32, 4, 1, 200, 29, 3, 239, 143, 26, 199, 133, - 32, 4, 1, 200, 29, 3, 239, 143, 26, 214, 8, 32, 4, 1, 210, 75, 3, 211, - 230, 32, 4, 1, 210, 75, 3, 240, 61, 32, 4, 1, 200, 29, 3, 213, 37, 32, 4, - 1, 200, 29, 3, 239, 143, 26, 213, 37, 32, 6, 1, 200, 29, 3, 198, 224, 32, - 6, 1, 200, 29, 3, 220, 113, 32, 6, 1, 200, 29, 3, 199, 133, 32, 6, 1, - 200, 29, 3, 214, 8, 32, 6, 1, 210, 75, 3, 240, 61, 32, 239, 143, 26, 199, - 133, 32, 239, 143, 26, 214, 8, 32, 199, 133, 32, 4, 1, 214, 124, 3, 199, - 134, 26, 195, 225, 32, 4, 1, 214, 124, 3, 195, 225, 32, 4, 1, 214, 124, - 3, 214, 9, 26, 195, 225, 32, 4, 1, 214, 124, 3, 213, 37, 32, 4, 1, 214, - 124, 3, 213, 38, 26, 195, 225, 32, 6, 1, 214, 122, 3, 199, 133, 32, 6, 1, - 214, 122, 3, 214, 8, 32, 6, 1, 214, 124, 3, 199, 133, 32, 6, 1, 214, 124, - 3, 214, 8, 32, 6, 1, 214, 124, 3, 211, 244, 32, 214, 8, 32, 240, 61, 236, - 230, 211, 93, 236, 241, 211, 93, 236, 230, 205, 148, 236, 241, 205, 148, - 202, 148, 205, 148, 235, 4, 205, 148, 206, 27, 205, 148, 235, 142, 205, - 148, 211, 213, 205, 148, 202, 188, 205, 148, 232, 233, 205, 148, 195, 80, - 197, 59, 205, 148, 195, 80, 197, 59, 216, 35, 195, 80, 197, 59, 225, 123, - 222, 174, 78, 210, 13, 78, 231, 6, 216, 36, 231, 6, 235, 142, 240, 64, - 236, 230, 240, 64, 236, 241, 240, 64, 231, 154, 154, 52, 83, 222, 74, 52, - 126, 222, 74, 50, 206, 62, 211, 61, 78, 53, 206, 62, 211, 61, 78, 206, - 62, 221, 206, 211, 61, 78, 206, 62, 232, 44, 211, 61, 78, 50, 52, 211, - 61, 78, 53, 52, 211, 61, 78, 52, 221, 206, 211, 61, 78, 52, 232, 44, 211, - 61, 78, 240, 117, 52, 240, 117, 248, 4, 201, 177, 248, 4, 97, 76, 222, - 194, 99, 76, 222, 194, 231, 154, 236, 246, 231, 4, 212, 109, 222, 75, - 207, 90, 213, 153, 207, 90, 222, 174, 236, 239, 210, 13, 236, 239, 212, - 87, 239, 83, 235, 21, 222, 174, 214, 16, 210, 13, 214, 16, 217, 209, 216, - 43, 205, 148, 213, 45, 219, 28, 55, 213, 45, 203, 24, 202, 159, 55, 212, - 18, 52, 212, 18, 201, 165, 212, 18, 210, 89, 212, 18, 210, 89, 52, 212, - 18, 210, 89, 201, 165, 212, 18, 247, 109, 206, 62, 222, 178, 251, 90, - 211, 61, 78, 206, 62, 210, 17, 251, 90, 211, 61, 78, 210, 153, 78, 52, - 236, 89, 78, 226, 25, 214, 18, 200, 59, 190, 202, 107, 247, 110, 226, 42, - 212, 109, 250, 176, 231, 7, 248, 4, 191, 205, 248, 50, 47, 248, 61, 3, - 211, 72, 53, 47, 248, 61, 3, 211, 72, 52, 211, 78, 78, 211, 78, 236, 89, - 78, 236, 89, 211, 78, 78, 202, 60, 2, 236, 127, 210, 89, 212, 178, 55, - 58, 107, 248, 4, 58, 91, 248, 4, 126, 250, 178, 210, 89, 207, 105, 244, - 203, 200, 36, 99, 250, 177, 251, 149, 199, 49, 244, 156, 219, 15, 55, - 204, 46, 240, 64, 226, 16, 200, 59, 235, 62, 211, 213, 78, 115, 76, 211, - 212, 211, 89, 212, 18, 235, 6, 76, 211, 212, 235, 100, 76, 211, 212, 99, - 76, 211, 212, 235, 6, 76, 78, 237, 249, 241, 60, 201, 176, 83, 235, 6, - 238, 249, 219, 189, 13, 205, 148, 197, 9, 225, 123, 234, 214, 251, 24, - 226, 14, 202, 76, 226, 14, 207, 90, 226, 14, 212, 124, 222, 174, 225, - 239, 210, 13, 225, 239, 235, 112, 204, 182, 225, 239, 212, 87, 239, 83, - 225, 239, 226, 55, 203, 248, 204, 64, 252, 11, 203, 248, 204, 64, 226, - 55, 9, 235, 23, 207, 19, 252, 11, 9, 235, 23, 207, 19, 217, 203, 17, 207, - 20, 216, 39, 17, 207, 20, 204, 95, 195, 79, 204, 95, 8, 4, 1, 68, 204, - 95, 136, 204, 95, 146, 204, 95, 167, 204, 95, 178, 204, 95, 171, 204, 95, - 182, 204, 95, 98, 55, 204, 95, 219, 14, 204, 95, 236, 171, 55, 204, 95, - 50, 213, 139, 204, 95, 53, 213, 139, 204, 95, 8, 4, 1, 218, 54, 204, 143, - 195, 79, 204, 143, 100, 204, 143, 102, 204, 143, 134, 204, 143, 136, 204, - 143, 146, 204, 143, 167, 204, 143, 178, 204, 143, 171, 204, 143, 182, - 204, 143, 98, 55, 204, 143, 219, 14, 204, 143, 236, 171, 55, 204, 143, - 50, 213, 139, 204, 143, 53, 213, 139, 8, 204, 143, 4, 1, 63, 8, 204, 143, - 4, 1, 69, 8, 204, 143, 4, 1, 72, 8, 204, 143, 4, 1, 196, 222, 8, 204, - 143, 4, 1, 208, 163, 8, 204, 143, 4, 1, 233, 14, 8, 204, 143, 4, 1, 225, - 79, 8, 204, 143, 4, 1, 159, 8, 204, 143, 4, 1, 221, 135, 8, 204, 143, 4, - 1, 218, 54, 8, 204, 143, 4, 1, 214, 2, 8, 204, 143, 4, 1, 209, 80, 8, - 204, 143, 4, 1, 203, 216, 236, 106, 55, 244, 168, 55, 241, 45, 55, 234, - 242, 234, 247, 55, 222, 54, 55, 219, 29, 55, 217, 227, 55, 213, 22, 55, - 209, 108, 55, 197, 17, 55, 217, 82, 206, 241, 55, 239, 4, 55, 236, 107, - 55, 224, 69, 55, 201, 27, 55, 237, 227, 55, 234, 20, 213, 57, 55, 213, - 19, 55, 233, 70, 55, 250, 139, 55, 231, 80, 55, 247, 51, 55, 222, 44, - 201, 223, 55, 205, 128, 55, 203, 21, 55, 226, 70, 209, 108, 55, 201, 6, - 222, 54, 55, 216, 25, 117, 55, 220, 59, 55, 209, 131, 55, 222, 223, 55, - 248, 143, 55, 38, 50, 232, 168, 57, 38, 53, 232, 168, 57, 38, 181, 83, - 222, 75, 214, 19, 38, 206, 182, 83, 222, 75, 214, 19, 38, 251, 64, 61, - 57, 38, 244, 204, 61, 57, 38, 50, 61, 57, 38, 53, 61, 57, 38, 210, 3, - 214, 19, 38, 244, 204, 210, 3, 214, 19, 38, 251, 64, 210, 3, 214, 19, 38, - 115, 238, 250, 57, 38, 235, 6, 238, 250, 57, 38, 236, 225, 244, 248, 38, - 236, 225, 205, 94, 38, 236, 225, 239, 139, 38, 236, 225, 244, 249, 249, - 132, 38, 50, 53, 61, 57, 38, 236, 225, 208, 154, 38, 236, 225, 224, 148, - 38, 236, 225, 200, 26, 212, 106, 201, 180, 38, 210, 90, 205, 178, 214, - 19, 38, 52, 83, 204, 196, 214, 19, 38, 251, 74, 105, 38, 201, 165, 200, - 61, 38, 197, 62, 248, 39, 57, 38, 107, 61, 214, 19, 38, 181, 52, 205, - 178, 214, 19, 38, 91, 232, 168, 3, 165, 237, 229, 38, 107, 232, 168, 3, - 165, 237, 229, 38, 50, 61, 60, 38, 53, 61, 60, 38, 250, 179, 57, 252, 17, - 214, 158, 252, 1, 202, 30, 202, 218, 204, 153, 237, 240, 6, 247, 206, - 239, 230, 247, 41, 247, 36, 222, 75, 105, 247, 111, 214, 158, 247, 165, - 200, 71, 236, 108, 241, 136, 208, 151, 239, 230, 235, 220, 145, 4, 234, - 189, 145, 6, 233, 14, 248, 133, 6, 233, 14, 237, 240, 6, 233, 14, 212, - 143, 241, 136, 212, 143, 241, 137, 127, 99, 212, 219, 145, 6, 68, 248, - 133, 6, 68, 145, 6, 159, 145, 4, 159, 223, 99, 74, 249, 79, 105, 237, - 240, 6, 218, 54, 215, 139, 55, 205, 162, 210, 165, 241, 103, 145, 6, 214, - 2, 237, 240, 6, 214, 2, 237, 240, 6, 211, 166, 145, 6, 144, 248, 133, 6, - 144, 237, 240, 6, 144, 212, 26, 203, 128, 210, 102, 207, 81, 78, 203, 34, - 55, 201, 213, 117, 55, 199, 101, 237, 240, 6, 195, 158, 214, 37, 55, 214, - 147, 55, 226, 16, 214, 147, 55, 248, 133, 6, 195, 158, 163, 32, 4, 1, - 226, 6, 224, 189, 55, 251, 84, 55, 145, 6, 250, 111, 248, 133, 6, 247, - 206, 236, 132, 105, 145, 4, 69, 145, 6, 69, 145, 6, 236, 48, 163, 6, 236, - 48, 145, 6, 221, 135, 145, 4, 72, 151, 105, 248, 208, 105, 233, 177, 105, - 240, 101, 105, 226, 60, 205, 160, 209, 194, 6, 211, 166, 235, 223, 55, - 237, 240, 4, 212, 219, 237, 240, 4, 234, 93, 237, 240, 6, 234, 93, 237, - 240, 6, 212, 219, 237, 240, 218, 53, 204, 114, 163, 45, 6, 234, 189, 163, - 45, 6, 159, 210, 89, 45, 6, 159, 163, 45, 6, 196, 148, 237, 240, 41, 6, - 240, 230, 237, 240, 41, 4, 240, 230, 237, 240, 41, 4, 69, 237, 240, 41, - 4, 68, 237, 240, 41, 4, 225, 216, 211, 248, 222, 74, 163, 251, 110, 213, - 45, 55, 251, 174, 163, 4, 236, 48, 16, 36, 208, 228, 205, 160, 197, 217, - 191, 97, 207, 67, 197, 217, 191, 97, 216, 172, 197, 217, 191, 97, 203, - 14, 197, 217, 191, 97, 202, 184, 197, 217, 191, 99, 202, 181, 197, 217, - 191, 97, 235, 147, 197, 217, 191, 99, 235, 146, 197, 217, 191, 115, 235, - 146, 197, 217, 191, 235, 6, 235, 146, 197, 217, 191, 97, 206, 17, 197, - 217, 191, 235, 100, 206, 15, 197, 217, 191, 97, 237, 25, 197, 217, 191, - 115, 237, 23, 197, 217, 191, 235, 100, 237, 23, 197, 217, 191, 207, 71, - 237, 23, 191, 215, 140, 100, 209, 208, 215, 141, 100, 209, 208, 215, 141, - 102, 209, 208, 215, 141, 134, 209, 208, 215, 141, 136, 209, 208, 215, - 141, 146, 209, 208, 215, 141, 167, 209, 208, 215, 141, 178, 209, 208, - 215, 141, 171, 209, 208, 215, 141, 182, 209, 208, 215, 141, 203, 23, 209, - 208, 215, 141, 236, 251, 209, 208, 215, 141, 200, 239, 209, 208, 215, - 141, 235, 144, 209, 208, 215, 141, 97, 231, 56, 209, 208, 215, 141, 235, - 100, 231, 56, 209, 208, 215, 141, 97, 170, 4, 209, 208, 215, 141, 100, 4, - 209, 208, 215, 141, 102, 4, 209, 208, 215, 141, 134, 4, 209, 208, 215, - 141, 136, 4, 209, 208, 215, 141, 146, 4, 209, 208, 215, 141, 167, 4, 209, - 208, 215, 141, 178, 4, 209, 208, 215, 141, 171, 4, 209, 208, 215, 141, - 182, 4, 209, 208, 215, 141, 203, 23, 4, 209, 208, 215, 141, 236, 251, 4, - 209, 208, 215, 141, 200, 239, 4, 209, 208, 215, 141, 235, 144, 4, 209, - 208, 215, 141, 97, 231, 56, 4, 209, 208, 215, 141, 235, 100, 231, 56, 4, - 209, 208, 215, 141, 97, 170, 209, 208, 215, 141, 97, 202, 159, 247, 207, - 240, 230, 209, 208, 215, 141, 235, 100, 170, 209, 208, 215, 141, 203, 24, - 170, 209, 208, 215, 141, 210, 89, 97, 231, 56, 8, 4, 1, 210, 89, 247, - 206, 209, 208, 215, 141, 206, 29, 222, 218, 20, 209, 208, 215, 141, 235, - 145, 237, 74, 20, 209, 208, 215, 141, 235, 145, 170, 209, 208, 215, 141, - 97, 231, 57, 170, 197, 217, 191, 195, 80, 202, 181, 163, 17, 102, 163, - 17, 134, 107, 51, 200, 24, 51, 91, 51, 237, 230, 51, 50, 53, 51, 124, - 135, 51, 173, 197, 89, 51, 173, 237, 68, 51, 205, 159, 237, 68, 51, 205, - 159, 197, 89, 51, 107, 61, 3, 106, 91, 61, 3, 106, 107, 197, 123, 51, 91, - 197, 123, 51, 107, 99, 232, 134, 51, 200, 24, 99, 232, 134, 51, 91, 99, - 232, 134, 51, 237, 230, 99, 232, 134, 51, 107, 61, 3, 203, 135, 91, 61, - 3, 203, 135, 107, 61, 234, 234, 154, 200, 24, 61, 234, 234, 154, 91, 61, - 234, 234, 154, 237, 230, 61, 234, 234, 154, 124, 135, 61, 3, 249, 65, - 107, 61, 3, 122, 91, 61, 3, 122, 107, 61, 3, 221, 224, 91, 61, 3, 221, - 224, 50, 53, 197, 123, 51, 50, 53, 61, 3, 106, 237, 230, 195, 24, 51, - 200, 24, 61, 3, 202, 68, 222, 173, 200, 24, 61, 3, 202, 68, 210, 11, 237, - 230, 61, 3, 202, 68, 222, 173, 237, 230, 61, 3, 202, 68, 210, 11, 91, 61, - 3, 241, 101, 237, 229, 237, 230, 61, 3, 241, 101, 222, 173, 251, 64, 201, - 243, 207, 108, 51, 244, 204, 201, 243, 207, 108, 51, 173, 197, 89, 61, - 202, 30, 181, 154, 107, 61, 202, 30, 249, 79, 127, 91, 61, 202, 30, 154, - 251, 64, 192, 244, 249, 51, 244, 204, 192, 244, 249, 51, 107, 232, 168, - 3, 165, 200, 23, 107, 232, 168, 3, 165, 237, 229, 200, 24, 232, 168, 3, - 165, 210, 11, 200, 24, 232, 168, 3, 165, 222, 173, 91, 232, 168, 3, 165, - 200, 23, 91, 232, 168, 3, 165, 237, 229, 237, 230, 232, 168, 3, 165, 210, - 11, 237, 230, 232, 168, 3, 165, 222, 173, 91, 61, 127, 107, 51, 200, 24, - 61, 107, 77, 237, 230, 51, 107, 61, 127, 91, 51, 107, 213, 218, 250, 213, - 200, 24, 213, 218, 250, 213, 91, 213, 218, 250, 213, 237, 230, 213, 218, - 250, 213, 107, 232, 168, 127, 91, 232, 167, 91, 232, 168, 127, 107, 232, - 167, 107, 52, 61, 3, 106, 50, 53, 52, 61, 3, 106, 91, 52, 61, 3, 106, - 107, 52, 51, 200, 24, 52, 51, 91, 52, 51, 237, 230, 52, 51, 50, 53, 52, - 51, 124, 135, 52, 51, 173, 197, 89, 52, 51, 173, 237, 68, 52, 51, 205, - 159, 237, 68, 52, 51, 205, 159, 197, 89, 52, 51, 107, 201, 165, 51, 91, + 8, 6, 1, 74, 3, 76, 60, 8, 4, 1, 74, 3, 76, 60, 8, 6, 1, 74, 3, 222, 76, + 60, 8, 4, 1, 74, 3, 222, 76, 60, 8, 6, 1, 247, 208, 3, 247, 51, 26, 186, + 8, 4, 1, 247, 208, 3, 247, 51, 26, 186, 8, 6, 1, 240, 232, 3, 76, 57, 8, + 4, 1, 240, 232, 3, 76, 57, 8, 6, 1, 240, 232, 3, 76, 60, 8, 4, 1, 240, + 232, 3, 76, 60, 8, 6, 1, 240, 232, 3, 222, 76, 60, 8, 4, 1, 240, 232, 3, + 222, 76, 60, 8, 6, 1, 240, 232, 3, 247, 50, 8, 4, 1, 240, 232, 3, 247, + 50, 8, 6, 1, 240, 232, 3, 244, 241, 60, 8, 4, 1, 240, 232, 3, 244, 241, + 60, 8, 6, 1, 237, 136, 3, 220, 115, 26, 233, 100, 8, 4, 1, 237, 136, 3, + 220, 115, 26, 233, 100, 8, 6, 1, 237, 136, 3, 220, 115, 26, 186, 8, 4, 1, + 237, 136, 3, 220, 115, 26, 186, 8, 6, 1, 237, 136, 3, 244, 241, 60, 8, 4, + 1, 237, 136, 3, 244, 241, 60, 8, 6, 1, 237, 136, 3, 202, 85, 60, 8, 4, 1, + 237, 136, 3, 202, 85, 60, 8, 6, 1, 237, 136, 3, 247, 51, 26, 248, 47, 8, + 4, 1, 237, 136, 3, 247, 51, 26, 248, 47, 8, 6, 1, 236, 50, 3, 76, 57, 8, + 4, 1, 236, 50, 3, 76, 57, 8, 6, 1, 234, 191, 3, 220, 114, 8, 4, 1, 234, + 191, 3, 220, 114, 8, 6, 1, 233, 16, 3, 76, 57, 8, 4, 1, 233, 16, 3, 76, + 57, 8, 6, 1, 233, 16, 3, 76, 60, 8, 4, 1, 233, 16, 3, 76, 60, 8, 6, 1, + 233, 16, 3, 239, 150, 8, 4, 1, 233, 16, 3, 239, 150, 8, 6, 1, 233, 16, 3, + 247, 50, 8, 4, 1, 233, 16, 3, 247, 50, 8, 6, 1, 233, 16, 3, 248, 48, 60, + 8, 4, 1, 233, 16, 3, 248, 48, 60, 8, 6, 1, 230, 249, 3, 202, 85, 60, 8, + 4, 1, 230, 249, 3, 202, 85, 60, 8, 6, 1, 230, 249, 3, 239, 151, 26, 186, + 8, 4, 1, 230, 249, 3, 239, 151, 26, 186, 8, 6, 1, 225, 81, 3, 186, 8, 4, + 1, 225, 81, 3, 186, 8, 6, 1, 225, 81, 3, 76, 60, 8, 4, 1, 225, 81, 3, 76, + 60, 8, 6, 1, 225, 81, 3, 222, 76, 60, 8, 4, 1, 225, 81, 3, 222, 76, 60, + 8, 6, 1, 223, 100, 3, 76, 60, 8, 4, 1, 223, 100, 3, 76, 60, 8, 6, 1, 223, + 100, 3, 76, 248, 227, 26, 220, 114, 8, 4, 1, 223, 100, 3, 76, 248, 227, + 26, 220, 114, 8, 6, 1, 223, 100, 3, 222, 76, 60, 8, 4, 1, 223, 100, 3, + 222, 76, 60, 8, 6, 1, 223, 100, 3, 244, 241, 60, 8, 4, 1, 223, 100, 3, + 244, 241, 60, 8, 6, 1, 221, 137, 3, 186, 8, 4, 1, 221, 137, 3, 186, 8, 6, + 1, 221, 137, 3, 76, 57, 8, 4, 1, 221, 137, 3, 76, 57, 8, 6, 1, 221, 137, + 3, 76, 60, 8, 4, 1, 221, 137, 3, 76, 60, 8, 6, 1, 218, 56, 3, 76, 57, 8, + 4, 1, 218, 56, 3, 76, 57, 8, 6, 1, 218, 56, 3, 76, 60, 8, 4, 1, 218, 56, + 3, 76, 60, 8, 6, 1, 218, 56, 3, 222, 76, 60, 8, 4, 1, 218, 56, 3, 222, + 76, 60, 8, 6, 1, 218, 56, 3, 244, 241, 60, 8, 4, 1, 218, 56, 3, 244, 241, + 60, 8, 6, 1, 177, 3, 202, 85, 26, 186, 8, 4, 1, 177, 3, 202, 85, 26, 186, + 8, 6, 1, 177, 3, 202, 85, 26, 239, 150, 8, 4, 1, 177, 3, 202, 85, 26, + 239, 150, 8, 6, 1, 177, 3, 220, 115, 26, 233, 100, 8, 4, 1, 177, 3, 220, + 115, 26, 233, 100, 8, 6, 1, 177, 3, 220, 115, 26, 186, 8, 4, 1, 177, 3, + 220, 115, 26, 186, 8, 6, 1, 214, 4, 3, 186, 8, 4, 1, 214, 4, 3, 186, 8, + 6, 1, 214, 4, 3, 76, 57, 8, 4, 1, 214, 4, 3, 76, 57, 8, 6, 1, 211, 32, 3, + 76, 57, 8, 4, 1, 211, 32, 3, 76, 57, 8, 6, 1, 211, 32, 3, 76, 60, 8, 4, + 1, 211, 32, 3, 76, 60, 8, 6, 1, 211, 32, 3, 76, 248, 227, 26, 220, 114, + 8, 4, 1, 211, 32, 3, 76, 248, 227, 26, 220, 114, 8, 6, 1, 211, 32, 3, + 222, 76, 60, 8, 4, 1, 211, 32, 3, 222, 76, 60, 8, 6, 1, 209, 81, 3, 76, + 57, 8, 4, 1, 209, 81, 3, 76, 57, 8, 6, 1, 209, 81, 3, 76, 60, 8, 4, 1, + 209, 81, 3, 76, 60, 8, 6, 1, 209, 81, 3, 252, 10, 26, 76, 57, 8, 4, 1, + 209, 81, 3, 252, 10, 26, 76, 57, 8, 6, 1, 209, 81, 3, 247, 107, 26, 76, + 57, 8, 4, 1, 209, 81, 3, 247, 107, 26, 76, 57, 8, 6, 1, 209, 81, 3, 76, + 248, 227, 26, 76, 57, 8, 4, 1, 209, 81, 3, 76, 248, 227, 26, 76, 57, 8, + 6, 1, 203, 217, 3, 76, 57, 8, 4, 1, 203, 217, 3, 76, 57, 8, 6, 1, 203, + 217, 3, 76, 60, 8, 4, 1, 203, 217, 3, 76, 60, 8, 6, 1, 203, 217, 3, 222, + 76, 60, 8, 4, 1, 203, 217, 3, 222, 76, 60, 8, 6, 1, 203, 217, 3, 244, + 241, 60, 8, 4, 1, 203, 217, 3, 244, 241, 60, 8, 6, 1, 118, 3, 239, 151, + 60, 8, 4, 1, 118, 3, 239, 151, 60, 8, 6, 1, 118, 3, 202, 85, 60, 8, 4, 1, + 118, 3, 202, 85, 60, 8, 6, 1, 118, 3, 244, 241, 60, 8, 4, 1, 118, 3, 244, + 241, 60, 8, 6, 1, 118, 3, 202, 85, 26, 186, 8, 4, 1, 118, 3, 202, 85, 26, + 186, 8, 6, 1, 118, 3, 220, 115, 26, 239, 150, 8, 4, 1, 118, 3, 220, 115, + 26, 239, 150, 8, 6, 1, 199, 231, 3, 202, 84, 8, 4, 1, 199, 231, 3, 202, + 84, 8, 6, 1, 199, 231, 3, 76, 60, 8, 4, 1, 199, 231, 3, 76, 60, 8, 6, 1, + 197, 200, 3, 233, 100, 8, 4, 1, 197, 200, 3, 233, 100, 8, 6, 1, 197, 200, + 3, 186, 8, 4, 1, 197, 200, 3, 186, 8, 6, 1, 197, 200, 3, 239, 150, 8, 4, + 1, 197, 200, 3, 239, 150, 8, 6, 1, 197, 200, 3, 76, 57, 8, 4, 1, 197, + 200, 3, 76, 57, 8, 6, 1, 197, 200, 3, 76, 60, 8, 4, 1, 197, 200, 3, 76, + 60, 8, 6, 1, 196, 223, 3, 76, 57, 8, 4, 1, 196, 223, 3, 76, 57, 8, 6, 1, + 196, 223, 3, 239, 150, 8, 4, 1, 196, 223, 3, 239, 150, 8, 6, 1, 196, 149, + 3, 76, 57, 8, 4, 1, 196, 149, 3, 76, 57, 8, 6, 1, 195, 159, 3, 244, 240, + 8, 4, 1, 195, 159, 3, 244, 240, 8, 6, 1, 195, 159, 3, 76, 60, 8, 4, 1, + 195, 159, 3, 76, 60, 8, 6, 1, 195, 159, 3, 222, 76, 60, 8, 4, 1, 195, + 159, 3, 222, 76, 60, 8, 4, 1, 233, 16, 3, 222, 76, 60, 8, 4, 1, 203, 217, + 3, 239, 150, 8, 4, 1, 197, 200, 3, 210, 3, 57, 8, 4, 1, 196, 149, 3, 210, + 3, 57, 8, 4, 1, 39, 3, 53, 157, 210, 2, 8, 4, 1, 181, 209, 81, 3, 76, 57, + 8, 4, 1, 181, 209, 81, 3, 239, 147, 106, 8, 4, 1, 181, 209, 81, 3, 130, + 106, 8, 6, 1, 207, 13, 209, 80, 8, 4, 1, 239, 212, 8, 6, 1, 39, 3, 76, + 60, 8, 4, 1, 39, 3, 76, 60, 8, 6, 1, 39, 3, 231, 165, 57, 8, 4, 1, 39, 3, + 231, 165, 57, 8, 6, 1, 39, 3, 244, 241, 26, 186, 8, 4, 1, 39, 3, 244, + 241, 26, 186, 8, 6, 1, 39, 3, 244, 241, 26, 233, 100, 8, 4, 1, 39, 3, + 244, 241, 26, 233, 100, 8, 6, 1, 39, 3, 244, 241, 26, 231, 165, 57, 8, 4, + 1, 39, 3, 244, 241, 26, 231, 165, 57, 8, 6, 1, 39, 3, 244, 241, 26, 202, + 84, 8, 4, 1, 39, 3, 244, 241, 26, 202, 84, 8, 6, 1, 39, 3, 244, 241, 26, + 76, 60, 8, 4, 1, 39, 3, 244, 241, 26, 76, 60, 8, 6, 1, 39, 3, 248, 48, + 26, 186, 8, 4, 1, 39, 3, 248, 48, 26, 186, 8, 6, 1, 39, 3, 248, 48, 26, + 233, 100, 8, 4, 1, 39, 3, 248, 48, 26, 233, 100, 8, 6, 1, 39, 3, 248, 48, + 26, 231, 165, 57, 8, 4, 1, 39, 3, 248, 48, 26, 231, 165, 57, 8, 6, 1, 39, + 3, 248, 48, 26, 202, 84, 8, 4, 1, 39, 3, 248, 48, 26, 202, 84, 8, 6, 1, + 39, 3, 248, 48, 26, 76, 60, 8, 4, 1, 39, 3, 248, 48, 26, 76, 60, 8, 6, 1, + 237, 136, 3, 76, 60, 8, 4, 1, 237, 136, 3, 76, 60, 8, 6, 1, 237, 136, 3, + 231, 165, 57, 8, 4, 1, 237, 136, 3, 231, 165, 57, 8, 6, 1, 237, 136, 3, + 202, 84, 8, 4, 1, 237, 136, 3, 202, 84, 8, 6, 1, 237, 136, 3, 244, 241, + 26, 186, 8, 4, 1, 237, 136, 3, 244, 241, 26, 186, 8, 6, 1, 237, 136, 3, + 244, 241, 26, 233, 100, 8, 4, 1, 237, 136, 3, 244, 241, 26, 233, 100, 8, + 6, 1, 237, 136, 3, 244, 241, 26, 231, 165, 57, 8, 4, 1, 237, 136, 3, 244, + 241, 26, 231, 165, 57, 8, 6, 1, 237, 136, 3, 244, 241, 26, 202, 84, 8, 4, + 1, 237, 136, 3, 244, 241, 26, 202, 84, 8, 6, 1, 237, 136, 3, 244, 241, + 26, 76, 60, 8, 4, 1, 237, 136, 3, 244, 241, 26, 76, 60, 8, 6, 1, 230, + 249, 3, 231, 165, 57, 8, 4, 1, 230, 249, 3, 231, 165, 57, 8, 6, 1, 230, + 249, 3, 76, 60, 8, 4, 1, 230, 249, 3, 76, 60, 8, 6, 1, 177, 3, 76, 60, 8, + 4, 1, 177, 3, 76, 60, 8, 6, 1, 177, 3, 231, 165, 57, 8, 4, 1, 177, 3, + 231, 165, 57, 8, 6, 1, 177, 3, 244, 241, 26, 186, 8, 4, 1, 177, 3, 244, + 241, 26, 186, 8, 6, 1, 177, 3, 244, 241, 26, 233, 100, 8, 4, 1, 177, 3, + 244, 241, 26, 233, 100, 8, 6, 1, 177, 3, 244, 241, 26, 231, 165, 57, 8, + 4, 1, 177, 3, 244, 241, 26, 231, 165, 57, 8, 6, 1, 177, 3, 244, 241, 26, + 202, 84, 8, 4, 1, 177, 3, 244, 241, 26, 202, 84, 8, 6, 1, 177, 3, 244, + 241, 26, 76, 60, 8, 4, 1, 177, 3, 244, 241, 26, 76, 60, 8, 6, 1, 177, 3, + 231, 103, 26, 186, 8, 4, 1, 177, 3, 231, 103, 26, 186, 8, 6, 1, 177, 3, + 231, 103, 26, 233, 100, 8, 4, 1, 177, 3, 231, 103, 26, 233, 100, 8, 6, 1, + 177, 3, 231, 103, 26, 231, 165, 57, 8, 4, 1, 177, 3, 231, 103, 26, 231, + 165, 57, 8, 6, 1, 177, 3, 231, 103, 26, 202, 84, 8, 4, 1, 177, 3, 231, + 103, 26, 202, 84, 8, 6, 1, 177, 3, 231, 103, 26, 76, 60, 8, 4, 1, 177, 3, + 231, 103, 26, 76, 60, 8, 6, 1, 118, 3, 76, 60, 8, 4, 1, 118, 3, 76, 60, + 8, 6, 1, 118, 3, 231, 165, 57, 8, 4, 1, 118, 3, 231, 165, 57, 8, 6, 1, + 118, 3, 231, 103, 26, 186, 8, 4, 1, 118, 3, 231, 103, 26, 186, 8, 6, 1, + 118, 3, 231, 103, 26, 233, 100, 8, 4, 1, 118, 3, 231, 103, 26, 233, 100, + 8, 6, 1, 118, 3, 231, 103, 26, 231, 165, 57, 8, 4, 1, 118, 3, 231, 103, + 26, 231, 165, 57, 8, 6, 1, 118, 3, 231, 103, 26, 202, 84, 8, 4, 1, 118, + 3, 231, 103, 26, 202, 84, 8, 6, 1, 118, 3, 231, 103, 26, 76, 60, 8, 4, 1, + 118, 3, 231, 103, 26, 76, 60, 8, 6, 1, 196, 149, 3, 233, 100, 8, 4, 1, + 196, 149, 3, 233, 100, 8, 6, 1, 196, 149, 3, 76, 60, 8, 4, 1, 196, 149, + 3, 76, 60, 8, 6, 1, 196, 149, 3, 231, 165, 57, 8, 4, 1, 196, 149, 3, 231, + 165, 57, 8, 6, 1, 196, 149, 3, 202, 84, 8, 4, 1, 196, 149, 3, 202, 84, 8, + 6, 1, 219, 62, 222, 38, 8, 4, 1, 219, 62, 222, 38, 8, 6, 1, 219, 62, 199, + 230, 8, 4, 1, 219, 62, 199, 230, 8, 6, 1, 196, 149, 3, 221, 225, 8, 4, 1, + 196, 149, 3, 221, 225, 32, 4, 1, 251, 135, 3, 211, 231, 32, 4, 1, 251, + 135, 3, 240, 62, 32, 4, 1, 251, 135, 3, 211, 232, 26, 199, 133, 32, 4, 1, + 251, 135, 3, 240, 63, 26, 199, 133, 32, 4, 1, 251, 135, 3, 211, 232, 26, + 214, 9, 32, 4, 1, 251, 135, 3, 240, 63, 26, 214, 9, 32, 4, 1, 251, 135, + 3, 211, 232, 26, 213, 38, 32, 4, 1, 251, 135, 3, 240, 63, 26, 213, 38, + 32, 6, 1, 251, 135, 3, 211, 231, 32, 6, 1, 251, 135, 3, 240, 62, 32, 6, + 1, 251, 135, 3, 211, 232, 26, 199, 133, 32, 6, 1, 251, 135, 3, 240, 63, + 26, 199, 133, 32, 6, 1, 251, 135, 3, 211, 232, 26, 214, 9, 32, 6, 1, 251, + 135, 3, 240, 63, 26, 214, 9, 32, 6, 1, 251, 135, 3, 211, 232, 26, 213, + 38, 32, 6, 1, 251, 135, 3, 240, 63, 26, 213, 38, 32, 4, 1, 236, 175, 3, + 211, 231, 32, 4, 1, 236, 175, 3, 240, 62, 32, 4, 1, 236, 175, 3, 211, + 232, 26, 199, 133, 32, 4, 1, 236, 175, 3, 240, 63, 26, 199, 133, 32, 4, + 1, 236, 175, 3, 211, 232, 26, 214, 9, 32, 4, 1, 236, 175, 3, 240, 63, 26, + 214, 9, 32, 6, 1, 236, 175, 3, 211, 231, 32, 6, 1, 236, 175, 3, 240, 62, + 32, 6, 1, 236, 175, 3, 211, 232, 26, 199, 133, 32, 6, 1, 236, 175, 3, + 240, 63, 26, 199, 133, 32, 6, 1, 236, 175, 3, 211, 232, 26, 214, 9, 32, + 6, 1, 236, 175, 3, 240, 63, 26, 214, 9, 32, 4, 1, 236, 127, 3, 211, 231, + 32, 4, 1, 236, 127, 3, 240, 62, 32, 4, 1, 236, 127, 3, 211, 232, 26, 199, + 133, 32, 4, 1, 236, 127, 3, 240, 63, 26, 199, 133, 32, 4, 1, 236, 127, 3, + 211, 232, 26, 214, 9, 32, 4, 1, 236, 127, 3, 240, 63, 26, 214, 9, 32, 4, + 1, 236, 127, 3, 211, 232, 26, 213, 38, 32, 4, 1, 236, 127, 3, 240, 63, + 26, 213, 38, 32, 6, 1, 236, 127, 3, 211, 231, 32, 6, 1, 236, 127, 3, 240, + 62, 32, 6, 1, 236, 127, 3, 211, 232, 26, 199, 133, 32, 6, 1, 236, 127, 3, + 240, 63, 26, 199, 133, 32, 6, 1, 236, 127, 3, 211, 232, 26, 214, 9, 32, + 6, 1, 236, 127, 3, 240, 63, 26, 214, 9, 32, 6, 1, 236, 127, 3, 211, 232, + 26, 213, 38, 32, 6, 1, 236, 127, 3, 240, 63, 26, 213, 38, 32, 4, 1, 226, + 8, 3, 211, 231, 32, 4, 1, 226, 8, 3, 240, 62, 32, 4, 1, 226, 8, 3, 211, + 232, 26, 199, 133, 32, 4, 1, 226, 8, 3, 240, 63, 26, 199, 133, 32, 4, 1, + 226, 8, 3, 211, 232, 26, 214, 9, 32, 4, 1, 226, 8, 3, 240, 63, 26, 214, + 9, 32, 4, 1, 226, 8, 3, 211, 232, 26, 213, 38, 32, 4, 1, 226, 8, 3, 240, + 63, 26, 213, 38, 32, 6, 1, 226, 8, 3, 211, 231, 32, 6, 1, 226, 8, 3, 240, + 62, 32, 6, 1, 226, 8, 3, 211, 232, 26, 199, 133, 32, 6, 1, 226, 8, 3, + 240, 63, 26, 199, 133, 32, 6, 1, 226, 8, 3, 211, 232, 26, 214, 9, 32, 6, + 1, 226, 8, 3, 240, 63, 26, 214, 9, 32, 6, 1, 226, 8, 3, 211, 232, 26, + 213, 38, 32, 6, 1, 226, 8, 3, 240, 63, 26, 213, 38, 32, 4, 1, 214, 123, + 3, 211, 231, 32, 4, 1, 214, 123, 3, 240, 62, 32, 4, 1, 214, 123, 3, 211, + 232, 26, 199, 133, 32, 4, 1, 214, 123, 3, 240, 63, 26, 199, 133, 32, 4, + 1, 214, 123, 3, 211, 232, 26, 214, 9, 32, 4, 1, 214, 123, 3, 240, 63, 26, + 214, 9, 32, 6, 1, 214, 123, 3, 211, 231, 32, 6, 1, 214, 123, 3, 240, 62, + 32, 6, 1, 214, 123, 3, 211, 232, 26, 199, 133, 32, 6, 1, 214, 123, 3, + 240, 63, 26, 199, 133, 32, 6, 1, 214, 123, 3, 211, 232, 26, 214, 9, 32, + 6, 1, 214, 123, 3, 240, 63, 26, 214, 9, 32, 4, 1, 200, 29, 3, 211, 231, + 32, 4, 1, 200, 29, 3, 240, 62, 32, 4, 1, 200, 29, 3, 211, 232, 26, 199, + 133, 32, 4, 1, 200, 29, 3, 240, 63, 26, 199, 133, 32, 4, 1, 200, 29, 3, + 211, 232, 26, 214, 9, 32, 4, 1, 200, 29, 3, 240, 63, 26, 214, 9, 32, 4, + 1, 200, 29, 3, 211, 232, 26, 213, 38, 32, 4, 1, 200, 29, 3, 240, 63, 26, + 213, 38, 32, 6, 1, 200, 29, 3, 240, 62, 32, 6, 1, 200, 29, 3, 240, 63, + 26, 199, 133, 32, 6, 1, 200, 29, 3, 240, 63, 26, 214, 9, 32, 6, 1, 200, + 29, 3, 240, 63, 26, 213, 38, 32, 4, 1, 214, 125, 3, 211, 231, 32, 4, 1, + 214, 125, 3, 240, 62, 32, 4, 1, 214, 125, 3, 211, 232, 26, 199, 133, 32, + 4, 1, 214, 125, 3, 240, 63, 26, 199, 133, 32, 4, 1, 214, 125, 3, 211, + 232, 26, 214, 9, 32, 4, 1, 214, 125, 3, 240, 63, 26, 214, 9, 32, 4, 1, + 214, 125, 3, 211, 232, 26, 213, 38, 32, 4, 1, 214, 125, 3, 240, 63, 26, + 213, 38, 32, 6, 1, 214, 125, 3, 211, 231, 32, 6, 1, 214, 125, 3, 240, 62, + 32, 6, 1, 214, 125, 3, 211, 232, 26, 199, 133, 32, 6, 1, 214, 125, 3, + 240, 63, 26, 199, 133, 32, 6, 1, 214, 125, 3, 211, 232, 26, 214, 9, 32, + 6, 1, 214, 125, 3, 240, 63, 26, 214, 9, 32, 6, 1, 214, 125, 3, 211, 232, + 26, 213, 38, 32, 6, 1, 214, 125, 3, 240, 63, 26, 213, 38, 32, 4, 1, 251, + 135, 3, 199, 133, 32, 4, 1, 251, 135, 3, 214, 9, 32, 4, 1, 236, 175, 3, + 199, 133, 32, 4, 1, 236, 175, 3, 214, 9, 32, 4, 1, 236, 127, 3, 199, 133, + 32, 4, 1, 236, 127, 3, 214, 9, 32, 4, 1, 226, 8, 3, 199, 133, 32, 4, 1, + 226, 8, 3, 214, 9, 32, 4, 1, 214, 123, 3, 199, 133, 32, 4, 1, 214, 123, + 3, 214, 9, 32, 4, 1, 200, 29, 3, 199, 133, 32, 4, 1, 200, 29, 3, 214, 9, + 32, 4, 1, 214, 125, 3, 199, 133, 32, 4, 1, 214, 125, 3, 214, 9, 32, 4, 1, + 251, 135, 3, 211, 232, 26, 195, 225, 32, 4, 1, 251, 135, 3, 240, 63, 26, + 195, 225, 32, 4, 1, 251, 135, 3, 211, 232, 26, 199, 134, 26, 195, 225, + 32, 4, 1, 251, 135, 3, 240, 63, 26, 199, 134, 26, 195, 225, 32, 4, 1, + 251, 135, 3, 211, 232, 26, 214, 10, 26, 195, 225, 32, 4, 1, 251, 135, 3, + 240, 63, 26, 214, 10, 26, 195, 225, 32, 4, 1, 251, 135, 3, 211, 232, 26, + 213, 39, 26, 195, 225, 32, 4, 1, 251, 135, 3, 240, 63, 26, 213, 39, 26, + 195, 225, 32, 6, 1, 251, 135, 3, 211, 232, 26, 211, 245, 32, 6, 1, 251, + 135, 3, 240, 63, 26, 211, 245, 32, 6, 1, 251, 135, 3, 211, 232, 26, 199, + 134, 26, 211, 245, 32, 6, 1, 251, 135, 3, 240, 63, 26, 199, 134, 26, 211, + 245, 32, 6, 1, 251, 135, 3, 211, 232, 26, 214, 10, 26, 211, 245, 32, 6, + 1, 251, 135, 3, 240, 63, 26, 214, 10, 26, 211, 245, 32, 6, 1, 251, 135, + 3, 211, 232, 26, 213, 39, 26, 211, 245, 32, 6, 1, 251, 135, 3, 240, 63, + 26, 213, 39, 26, 211, 245, 32, 4, 1, 236, 127, 3, 211, 232, 26, 195, 225, + 32, 4, 1, 236, 127, 3, 240, 63, 26, 195, 225, 32, 4, 1, 236, 127, 3, 211, + 232, 26, 199, 134, 26, 195, 225, 32, 4, 1, 236, 127, 3, 240, 63, 26, 199, + 134, 26, 195, 225, 32, 4, 1, 236, 127, 3, 211, 232, 26, 214, 10, 26, 195, + 225, 32, 4, 1, 236, 127, 3, 240, 63, 26, 214, 10, 26, 195, 225, 32, 4, 1, + 236, 127, 3, 211, 232, 26, 213, 39, 26, 195, 225, 32, 4, 1, 236, 127, 3, + 240, 63, 26, 213, 39, 26, 195, 225, 32, 6, 1, 236, 127, 3, 211, 232, 26, + 211, 245, 32, 6, 1, 236, 127, 3, 240, 63, 26, 211, 245, 32, 6, 1, 236, + 127, 3, 211, 232, 26, 199, 134, 26, 211, 245, 32, 6, 1, 236, 127, 3, 240, + 63, 26, 199, 134, 26, 211, 245, 32, 6, 1, 236, 127, 3, 211, 232, 26, 214, + 10, 26, 211, 245, 32, 6, 1, 236, 127, 3, 240, 63, 26, 214, 10, 26, 211, + 245, 32, 6, 1, 236, 127, 3, 211, 232, 26, 213, 39, 26, 211, 245, 32, 6, + 1, 236, 127, 3, 240, 63, 26, 213, 39, 26, 211, 245, 32, 4, 1, 214, 125, + 3, 211, 232, 26, 195, 225, 32, 4, 1, 214, 125, 3, 240, 63, 26, 195, 225, + 32, 4, 1, 214, 125, 3, 211, 232, 26, 199, 134, 26, 195, 225, 32, 4, 1, + 214, 125, 3, 240, 63, 26, 199, 134, 26, 195, 225, 32, 4, 1, 214, 125, 3, + 211, 232, 26, 214, 10, 26, 195, 225, 32, 4, 1, 214, 125, 3, 240, 63, 26, + 214, 10, 26, 195, 225, 32, 4, 1, 214, 125, 3, 211, 232, 26, 213, 39, 26, + 195, 225, 32, 4, 1, 214, 125, 3, 240, 63, 26, 213, 39, 26, 195, 225, 32, + 6, 1, 214, 125, 3, 211, 232, 26, 211, 245, 32, 6, 1, 214, 125, 3, 240, + 63, 26, 211, 245, 32, 6, 1, 214, 125, 3, 211, 232, 26, 199, 134, 26, 211, + 245, 32, 6, 1, 214, 125, 3, 240, 63, 26, 199, 134, 26, 211, 245, 32, 6, + 1, 214, 125, 3, 211, 232, 26, 214, 10, 26, 211, 245, 32, 6, 1, 214, 125, + 3, 240, 63, 26, 214, 10, 26, 211, 245, 32, 6, 1, 214, 125, 3, 211, 232, + 26, 213, 39, 26, 211, 245, 32, 6, 1, 214, 125, 3, 240, 63, 26, 213, 39, + 26, 211, 245, 32, 4, 1, 251, 135, 3, 198, 224, 32, 4, 1, 251, 135, 3, + 220, 114, 32, 4, 1, 251, 135, 3, 199, 134, 26, 195, 225, 32, 4, 1, 251, + 135, 3, 195, 225, 32, 4, 1, 251, 135, 3, 214, 10, 26, 195, 225, 32, 4, 1, + 251, 135, 3, 213, 38, 32, 4, 1, 251, 135, 3, 213, 39, 26, 195, 225, 32, + 6, 1, 251, 135, 3, 198, 224, 32, 6, 1, 251, 135, 3, 220, 114, 32, 6, 1, + 251, 135, 3, 199, 133, 32, 6, 1, 251, 135, 3, 214, 9, 32, 6, 1, 251, 135, + 3, 211, 245, 32, 223, 232, 32, 211, 245, 32, 211, 231, 32, 213, 38, 32, + 239, 144, 26, 213, 38, 32, 4, 1, 236, 127, 3, 199, 134, 26, 195, 225, 32, + 4, 1, 236, 127, 3, 195, 225, 32, 4, 1, 236, 127, 3, 214, 10, 26, 195, + 225, 32, 4, 1, 236, 127, 3, 213, 38, 32, 4, 1, 236, 127, 3, 213, 39, 26, + 195, 225, 32, 6, 1, 236, 175, 3, 199, 133, 32, 6, 1, 236, 175, 3, 214, 9, + 32, 6, 1, 236, 127, 3, 199, 133, 32, 6, 1, 236, 127, 3, 214, 9, 32, 6, 1, + 236, 127, 3, 211, 245, 32, 211, 232, 26, 199, 133, 32, 211, 232, 26, 214, + 9, 32, 211, 232, 26, 213, 38, 32, 4, 1, 226, 8, 3, 198, 224, 32, 4, 1, + 226, 8, 3, 220, 114, 32, 4, 1, 226, 8, 3, 239, 144, 26, 199, 133, 32, 4, + 1, 226, 8, 3, 239, 144, 26, 214, 9, 32, 4, 1, 226, 8, 3, 213, 38, 32, 4, + 1, 226, 8, 3, 239, 144, 26, 213, 38, 32, 6, 1, 226, 8, 3, 198, 224, 32, + 6, 1, 226, 8, 3, 220, 114, 32, 6, 1, 226, 8, 3, 199, 133, 32, 6, 1, 226, + 8, 3, 214, 9, 32, 240, 63, 26, 199, 133, 32, 240, 63, 26, 214, 9, 32, + 240, 63, 26, 213, 38, 32, 4, 1, 200, 29, 3, 198, 224, 32, 4, 1, 200, 29, + 3, 220, 114, 32, 4, 1, 200, 29, 3, 239, 144, 26, 199, 133, 32, 4, 1, 200, + 29, 3, 239, 144, 26, 214, 9, 32, 4, 1, 210, 75, 3, 211, 231, 32, 4, 1, + 210, 75, 3, 240, 62, 32, 4, 1, 200, 29, 3, 213, 38, 32, 4, 1, 200, 29, 3, + 239, 144, 26, 213, 38, 32, 6, 1, 200, 29, 3, 198, 224, 32, 6, 1, 200, 29, + 3, 220, 114, 32, 6, 1, 200, 29, 3, 199, 133, 32, 6, 1, 200, 29, 3, 214, + 9, 32, 6, 1, 210, 75, 3, 240, 62, 32, 239, 144, 26, 199, 133, 32, 239, + 144, 26, 214, 9, 32, 199, 133, 32, 4, 1, 214, 125, 3, 199, 134, 26, 195, + 225, 32, 4, 1, 214, 125, 3, 195, 225, 32, 4, 1, 214, 125, 3, 214, 10, 26, + 195, 225, 32, 4, 1, 214, 125, 3, 213, 38, 32, 4, 1, 214, 125, 3, 213, 39, + 26, 195, 225, 32, 6, 1, 214, 123, 3, 199, 133, 32, 6, 1, 214, 123, 3, + 214, 9, 32, 6, 1, 214, 125, 3, 199, 133, 32, 6, 1, 214, 125, 3, 214, 9, + 32, 6, 1, 214, 125, 3, 211, 245, 32, 214, 9, 32, 240, 62, 236, 231, 211, + 94, 236, 242, 211, 94, 236, 231, 205, 148, 236, 242, 205, 148, 202, 148, + 205, 148, 235, 5, 205, 148, 206, 27, 205, 148, 235, 143, 205, 148, 211, + 214, 205, 148, 202, 188, 205, 148, 232, 234, 205, 148, 195, 80, 197, 59, + 205, 148, 195, 80, 197, 59, 216, 36, 195, 80, 197, 59, 225, 124, 222, + 175, 78, 210, 13, 78, 231, 7, 216, 37, 231, 7, 235, 143, 240, 65, 236, + 231, 240, 65, 236, 242, 240, 65, 231, 155, 154, 52, 83, 222, 75, 52, 126, + 222, 75, 50, 206, 62, 211, 62, 78, 53, 206, 62, 211, 62, 78, 206, 62, + 221, 207, 211, 62, 78, 206, 62, 232, 45, 211, 62, 78, 50, 52, 211, 62, + 78, 53, 52, 211, 62, 78, 52, 221, 207, 211, 62, 78, 52, 232, 45, 211, 62, + 78, 240, 118, 52, 240, 118, 248, 5, 201, 177, 248, 5, 97, 76, 222, 195, + 99, 76, 222, 195, 231, 155, 236, 247, 231, 5, 212, 110, 222, 76, 207, 90, + 213, 154, 207, 90, 222, 175, 236, 240, 210, 13, 236, 240, 212, 88, 239, + 84, 235, 22, 222, 175, 214, 17, 210, 13, 214, 17, 217, 210, 216, 44, 205, + 148, 213, 46, 219, 29, 55, 213, 46, 203, 24, 202, 159, 55, 212, 19, 52, + 212, 19, 201, 165, 212, 19, 210, 89, 212, 19, 210, 89, 52, 212, 19, 210, + 89, 201, 165, 212, 19, 247, 110, 206, 62, 222, 179, 251, 91, 211, 62, 78, + 206, 62, 210, 17, 251, 91, 211, 62, 78, 210, 154, 78, 52, 236, 90, 78, + 226, 26, 214, 19, 200, 59, 190, 202, 107, 247, 111, 226, 43, 212, 110, + 250, 177, 231, 8, 248, 5, 191, 205, 248, 50, 47, 248, 62, 3, 211, 73, 53, + 47, 248, 62, 3, 211, 73, 52, 211, 79, 78, 211, 79, 236, 90, 78, 236, 90, + 211, 79, 78, 202, 60, 2, 236, 128, 210, 89, 212, 179, 55, 58, 107, 248, + 5, 58, 91, 248, 5, 126, 250, 179, 210, 89, 207, 105, 244, 204, 200, 36, + 99, 250, 178, 251, 150, 199, 49, 244, 157, 219, 16, 55, 204, 46, 240, 65, + 226, 17, 200, 59, 235, 63, 211, 214, 78, 115, 76, 211, 213, 211, 90, 212, + 19, 235, 7, 76, 211, 213, 235, 101, 76, 211, 213, 99, 76, 211, 213, 235, + 7, 76, 78, 237, 250, 241, 61, 201, 176, 83, 235, 7, 238, 250, 219, 190, + 13, 205, 148, 197, 9, 225, 124, 234, 215, 251, 25, 226, 15, 202, 76, 226, + 15, 207, 90, 226, 15, 212, 125, 222, 175, 225, 240, 210, 13, 225, 240, + 235, 113, 204, 182, 225, 240, 212, 88, 239, 84, 225, 240, 226, 56, 203, + 248, 204, 64, 252, 12, 203, 248, 204, 64, 226, 56, 9, 235, 24, 207, 19, + 252, 12, 9, 235, 24, 207, 19, 217, 204, 17, 207, 20, 216, 40, 17, 207, + 20, 204, 95, 195, 79, 204, 95, 8, 4, 1, 68, 204, 95, 136, 204, 95, 146, + 204, 95, 167, 204, 95, 178, 204, 95, 171, 204, 95, 182, 204, 95, 98, 55, + 204, 95, 219, 15, 204, 95, 236, 172, 55, 204, 95, 50, 213, 140, 204, 95, + 53, 213, 140, 204, 95, 8, 4, 1, 218, 55, 204, 143, 195, 79, 204, 143, + 100, 204, 143, 102, 204, 143, 134, 204, 143, 136, 204, 143, 146, 204, + 143, 167, 204, 143, 178, 204, 143, 171, 204, 143, 182, 204, 143, 98, 55, + 204, 143, 219, 15, 204, 143, 236, 172, 55, 204, 143, 50, 213, 140, 204, + 143, 53, 213, 140, 8, 204, 143, 4, 1, 63, 8, 204, 143, 4, 1, 69, 8, 204, + 143, 4, 1, 72, 8, 204, 143, 4, 1, 196, 222, 8, 204, 143, 4, 1, 208, 163, + 8, 204, 143, 4, 1, 233, 15, 8, 204, 143, 4, 1, 225, 80, 8, 204, 143, 4, + 1, 159, 8, 204, 143, 4, 1, 221, 136, 8, 204, 143, 4, 1, 218, 55, 8, 204, + 143, 4, 1, 214, 3, 8, 204, 143, 4, 1, 209, 80, 8, 204, 143, 4, 1, 203, + 216, 236, 107, 55, 244, 169, 55, 241, 46, 55, 234, 243, 234, 248, 55, + 222, 55, 55, 219, 30, 55, 217, 228, 55, 213, 23, 55, 209, 108, 55, 197, + 17, 55, 217, 83, 206, 241, 55, 239, 5, 55, 236, 108, 55, 224, 70, 55, + 201, 27, 55, 237, 228, 55, 234, 21, 213, 58, 55, 213, 20, 55, 233, 71, + 55, 250, 140, 55, 231, 81, 55, 247, 52, 55, 222, 45, 201, 223, 55, 205, + 128, 55, 203, 21, 55, 226, 71, 209, 108, 55, 201, 6, 222, 55, 55, 216, + 26, 117, 55, 220, 60, 55, 209, 131, 55, 222, 224, 55, 248, 144, 55, 38, + 50, 232, 169, 57, 38, 53, 232, 169, 57, 38, 181, 83, 222, 76, 214, 20, + 38, 206, 182, 83, 222, 76, 214, 20, 38, 251, 65, 61, 57, 38, 244, 205, + 61, 57, 38, 50, 61, 57, 38, 53, 61, 57, 38, 210, 3, 214, 20, 38, 244, + 205, 210, 3, 214, 20, 38, 251, 65, 210, 3, 214, 20, 38, 115, 238, 251, + 57, 38, 235, 7, 238, 251, 57, 38, 236, 226, 244, 249, 38, 236, 226, 205, + 94, 38, 236, 226, 239, 140, 38, 236, 226, 244, 250, 249, 133, 38, 50, 53, + 61, 57, 38, 236, 226, 208, 154, 38, 236, 226, 224, 149, 38, 236, 226, + 200, 26, 212, 107, 201, 180, 38, 210, 90, 205, 178, 214, 20, 38, 52, 83, + 204, 196, 214, 20, 38, 251, 75, 105, 38, 201, 165, 200, 61, 38, 197, 62, + 248, 40, 57, 38, 107, 61, 214, 20, 38, 181, 52, 205, 178, 214, 20, 38, + 91, 232, 169, 3, 165, 237, 230, 38, 107, 232, 169, 3, 165, 237, 230, 38, + 50, 61, 60, 38, 53, 61, 60, 38, 250, 180, 57, 252, 18, 214, 159, 252, 2, + 202, 30, 202, 218, 204, 153, 237, 241, 6, 247, 207, 239, 231, 247, 42, + 247, 37, 222, 76, 105, 247, 112, 214, 159, 247, 166, 200, 71, 236, 109, + 241, 137, 208, 151, 239, 231, 235, 221, 145, 4, 234, 190, 145, 6, 233, + 15, 248, 134, 6, 233, 15, 237, 241, 6, 233, 15, 212, 144, 241, 137, 212, + 144, 241, 138, 127, 99, 212, 220, 145, 6, 68, 248, 134, 6, 68, 145, 6, + 159, 145, 4, 159, 223, 100, 74, 249, 80, 105, 237, 241, 6, 218, 55, 215, + 140, 55, 205, 162, 210, 166, 241, 104, 145, 6, 214, 3, 237, 241, 6, 214, + 3, 237, 241, 6, 211, 167, 145, 6, 144, 248, 134, 6, 144, 237, 241, 6, + 144, 212, 27, 203, 128, 210, 102, 207, 81, 78, 203, 34, 55, 201, 213, + 117, 55, 199, 101, 237, 241, 6, 195, 158, 214, 38, 55, 214, 148, 55, 226, + 17, 214, 148, 55, 248, 134, 6, 195, 158, 163, 32, 4, 1, 226, 7, 224, 190, + 55, 251, 85, 55, 145, 6, 250, 112, 248, 134, 6, 247, 207, 236, 133, 105, + 145, 4, 69, 145, 6, 69, 145, 6, 236, 49, 163, 6, 236, 49, 145, 6, 221, + 136, 145, 4, 72, 151, 105, 248, 209, 105, 233, 178, 105, 240, 102, 105, + 226, 61, 205, 160, 209, 194, 6, 211, 167, 235, 224, 55, 237, 241, 4, 212, + 220, 237, 241, 4, 234, 94, 237, 241, 6, 234, 94, 237, 241, 6, 212, 220, + 237, 241, 218, 54, 204, 114, 163, 45, 6, 234, 190, 163, 45, 6, 159, 210, + 89, 45, 6, 159, 163, 45, 6, 196, 148, 237, 241, 41, 6, 240, 231, 237, + 241, 41, 4, 240, 231, 237, 241, 41, 4, 69, 237, 241, 41, 4, 68, 237, 241, + 41, 4, 225, 217, 211, 249, 222, 75, 163, 251, 111, 213, 46, 55, 251, 175, + 163, 4, 236, 49, 16, 36, 208, 228, 205, 160, 197, 217, 191, 97, 207, 67, + 197, 217, 191, 97, 216, 173, 197, 217, 191, 97, 203, 14, 197, 217, 191, + 97, 202, 184, 197, 217, 191, 99, 202, 181, 197, 217, 191, 97, 235, 148, + 197, 217, 191, 99, 235, 147, 197, 217, 191, 115, 235, 147, 197, 217, 191, + 235, 7, 235, 147, 197, 217, 191, 97, 206, 17, 197, 217, 191, 235, 101, + 206, 15, 197, 217, 191, 97, 237, 26, 197, 217, 191, 115, 237, 24, 197, + 217, 191, 235, 101, 237, 24, 197, 217, 191, 207, 71, 237, 24, 191, 215, + 141, 100, 209, 208, 215, 142, 100, 209, 208, 215, 142, 102, 209, 208, + 215, 142, 134, 209, 208, 215, 142, 136, 209, 208, 215, 142, 146, 209, + 208, 215, 142, 167, 209, 208, 215, 142, 178, 209, 208, 215, 142, 171, + 209, 208, 215, 142, 182, 209, 208, 215, 142, 203, 23, 209, 208, 215, 142, + 236, 252, 209, 208, 215, 142, 200, 239, 209, 208, 215, 142, 235, 145, + 209, 208, 215, 142, 97, 231, 57, 209, 208, 215, 142, 235, 101, 231, 57, + 209, 208, 215, 142, 97, 170, 4, 209, 208, 215, 142, 100, 4, 209, 208, + 215, 142, 102, 4, 209, 208, 215, 142, 134, 4, 209, 208, 215, 142, 136, 4, + 209, 208, 215, 142, 146, 4, 209, 208, 215, 142, 167, 4, 209, 208, 215, + 142, 178, 4, 209, 208, 215, 142, 171, 4, 209, 208, 215, 142, 182, 4, 209, + 208, 215, 142, 203, 23, 4, 209, 208, 215, 142, 236, 252, 4, 209, 208, + 215, 142, 200, 239, 4, 209, 208, 215, 142, 235, 145, 4, 209, 208, 215, + 142, 97, 231, 57, 4, 209, 208, 215, 142, 235, 101, 231, 57, 4, 209, 208, + 215, 142, 97, 170, 209, 208, 215, 142, 97, 202, 159, 247, 208, 240, 231, + 209, 208, 215, 142, 235, 101, 170, 209, 208, 215, 142, 203, 24, 170, 209, + 208, 215, 142, 210, 89, 97, 231, 57, 8, 4, 1, 210, 89, 247, 207, 209, + 208, 215, 142, 206, 29, 222, 219, 20, 209, 208, 215, 142, 235, 146, 237, + 75, 20, 209, 208, 215, 142, 235, 146, 170, 209, 208, 215, 142, 97, 231, + 58, 170, 197, 217, 191, 195, 80, 202, 181, 163, 17, 102, 163, 17, 134, + 107, 51, 200, 24, 51, 91, 51, 237, 231, 51, 50, 53, 51, 124, 135, 51, + 173, 197, 89, 51, 173, 237, 69, 51, 205, 159, 237, 69, 51, 205, 159, 197, + 89, 51, 107, 61, 3, 106, 91, 61, 3, 106, 107, 197, 123, 51, 91, 197, 123, + 51, 107, 99, 232, 135, 51, 200, 24, 99, 232, 135, 51, 91, 99, 232, 135, + 51, 237, 231, 99, 232, 135, 51, 107, 61, 3, 203, 135, 91, 61, 3, 203, + 135, 107, 61, 234, 235, 154, 200, 24, 61, 234, 235, 154, 91, 61, 234, + 235, 154, 237, 231, 61, 234, 235, 154, 124, 135, 61, 3, 249, 66, 107, 61, + 3, 122, 91, 61, 3, 122, 107, 61, 3, 221, 225, 91, 61, 3, 221, 225, 50, + 53, 197, 123, 51, 50, 53, 61, 3, 106, 237, 231, 195, 24, 51, 200, 24, 61, + 3, 202, 68, 222, 174, 200, 24, 61, 3, 202, 68, 210, 11, 237, 231, 61, 3, + 202, 68, 222, 174, 237, 231, 61, 3, 202, 68, 210, 11, 91, 61, 3, 241, + 102, 237, 230, 237, 231, 61, 3, 241, 102, 222, 174, 251, 65, 201, 243, + 207, 108, 51, 244, 205, 201, 243, 207, 108, 51, 173, 197, 89, 61, 202, + 30, 181, 154, 107, 61, 202, 30, 249, 80, 127, 91, 61, 202, 30, 154, 251, + 65, 192, 244, 250, 51, 244, 205, 192, 244, 250, 51, 107, 232, 169, 3, + 165, 200, 23, 107, 232, 169, 3, 165, 237, 230, 200, 24, 232, 169, 3, 165, + 210, 11, 200, 24, 232, 169, 3, 165, 222, 174, 91, 232, 169, 3, 165, 200, + 23, 91, 232, 169, 3, 165, 237, 230, 237, 231, 232, 169, 3, 165, 210, 11, + 237, 231, 232, 169, 3, 165, 222, 174, 91, 61, 127, 107, 51, 200, 24, 61, + 107, 77, 237, 231, 51, 107, 61, 127, 91, 51, 107, 213, 219, 250, 214, + 200, 24, 213, 219, 250, 214, 91, 213, 219, 250, 214, 237, 231, 213, 219, + 250, 214, 107, 232, 169, 127, 91, 232, 168, 91, 232, 169, 127, 107, 232, + 168, 107, 52, 61, 3, 106, 50, 53, 52, 61, 3, 106, 91, 52, 61, 3, 106, + 107, 52, 51, 200, 24, 52, 51, 91, 52, 51, 237, 231, 52, 51, 50, 53, 52, + 51, 124, 135, 52, 51, 173, 197, 89, 52, 51, 173, 237, 69, 52, 51, 205, + 159, 237, 69, 52, 51, 205, 159, 197, 89, 52, 51, 107, 201, 165, 51, 91, 201, 165, 51, 107, 205, 87, 51, 91, 205, 87, 51, 200, 24, 61, 3, 52, 106, - 237, 230, 61, 3, 52, 106, 107, 240, 63, 51, 200, 24, 240, 63, 51, 91, - 240, 63, 51, 237, 230, 240, 63, 51, 107, 61, 202, 30, 154, 91, 61, 202, - 30, 154, 107, 59, 51, 200, 24, 59, 51, 91, 59, 51, 237, 230, 59, 51, 200, - 24, 59, 61, 234, 234, 154, 200, 24, 59, 61, 214, 119, 213, 81, 200, 24, - 59, 61, 214, 119, 213, 82, 3, 231, 154, 154, 200, 24, 59, 61, 214, 119, - 213, 82, 3, 83, 154, 200, 24, 59, 52, 51, 200, 24, 59, 52, 61, 214, 119, - 213, 81, 91, 59, 61, 234, 234, 197, 148, 173, 197, 89, 61, 202, 30, 241, - 100, 205, 159, 237, 68, 61, 202, 30, 241, 100, 124, 135, 59, 51, 53, 61, - 3, 4, 244, 248, 237, 230, 61, 107, 77, 200, 24, 51, 115, 91, 250, 213, + 237, 231, 61, 3, 52, 106, 107, 240, 64, 51, 200, 24, 240, 64, 51, 91, + 240, 64, 51, 237, 231, 240, 64, 51, 107, 61, 202, 30, 154, 91, 61, 202, + 30, 154, 107, 59, 51, 200, 24, 59, 51, 91, 59, 51, 237, 231, 59, 51, 200, + 24, 59, 61, 234, 235, 154, 200, 24, 59, 61, 214, 120, 213, 82, 200, 24, + 59, 61, 214, 120, 213, 83, 3, 231, 155, 154, 200, 24, 59, 61, 214, 120, + 213, 83, 3, 83, 154, 200, 24, 59, 52, 51, 200, 24, 59, 52, 61, 214, 120, + 213, 82, 91, 59, 61, 234, 235, 197, 148, 173, 197, 89, 61, 202, 30, 241, + 101, 205, 159, 237, 69, 61, 202, 30, 241, 101, 124, 135, 59, 51, 53, 61, + 3, 4, 244, 249, 237, 231, 61, 107, 77, 200, 24, 51, 115, 91, 250, 214, 107, 61, 3, 83, 106, 91, 61, 3, 83, 106, 50, 53, 61, 3, 83, 106, 107, 61, 3, 52, 83, 106, 91, 61, 3, 52, 83, 106, 50, 53, 61, 3, 52, 83, 106, 107, - 214, 89, 51, 91, 214, 89, 51, 50, 53, 214, 89, 51, 36, 251, 145, 244, - 152, 213, 131, 239, 123, 202, 208, 236, 84, 202, 208, 239, 18, 216, 18, - 236, 85, 236, 231, 207, 76, 226, 74, 217, 238, 236, 255, 214, 158, 216, - 18, 251, 106, 236, 255, 214, 158, 4, 236, 255, 214, 158, 241, 130, 250, - 202, 219, 167, 239, 18, 216, 18, 241, 132, 250, 202, 219, 167, 4, 241, - 130, 250, 202, 219, 167, 236, 221, 77, 211, 250, 218, 53, 212, 4, 218, - 53, 241, 107, 218, 53, 204, 114, 219, 15, 55, 219, 13, 55, 76, 212, 124, - 239, 53, 205, 248, 207, 77, 219, 14, 250, 179, 214, 81, 210, 3, 214, 81, - 248, 5, 214, 81, 47, 209, 200, 241, 36, 209, 200, 234, 255, 209, 200, - 211, 246, 149, 226, 62, 53, 251, 89, 251, 89, 219, 200, 251, 89, 205, - 127, 251, 89, 239, 56, 239, 18, 216, 18, 239, 60, 213, 145, 149, 216, 18, - 213, 145, 149, 221, 248, 251, 99, 221, 248, 214, 71, 226, 22, 200, 51, - 226, 36, 52, 226, 36, 201, 165, 226, 36, 241, 124, 226, 36, 204, 84, 226, - 36, 198, 236, 226, 36, 244, 204, 226, 36, 244, 204, 241, 124, 226, 36, - 251, 64, 241, 124, 226, 36, 202, 207, 248, 252, 210, 193, 211, 247, 76, - 219, 14, 236, 92, 234, 26, 211, 247, 231, 169, 202, 85, 214, 81, 210, 89, - 202, 84, 226, 16, 222, 203, 209, 80, 206, 64, 197, 122, 196, 253, 212, 4, - 216, 18, 202, 84, 219, 15, 202, 84, 250, 171, 180, 149, 216, 18, 250, - 171, 180, 149, 251, 20, 180, 149, 251, 20, 247, 231, 216, 18, 252, 10, - 180, 149, 217, 102, 251, 20, 216, 27, 252, 10, 180, 149, 251, 138, 180, - 149, 216, 18, 251, 138, 180, 149, 251, 138, 180, 214, 72, 180, 149, 201, - 165, 202, 84, 251, 146, 180, 149, 236, 164, 149, 234, 25, 236, 164, 149, - 239, 124, 248, 202, 251, 22, 202, 218, 222, 82, 234, 25, 180, 149, 251, - 20, 180, 202, 30, 214, 72, 202, 218, 226, 101, 214, 158, 226, 101, 77, - 214, 72, 251, 20, 180, 149, 244, 168, 236, 170, 236, 171, 244, 167, 210, - 3, 226, 86, 180, 149, 210, 3, 180, 149, 241, 93, 149, 236, 131, 236, 169, - 149, 205, 8, 236, 170, 239, 212, 180, 149, 180, 202, 30, 247, 218, 239, - 231, 219, 200, 247, 217, 211, 76, 180, 149, 216, 18, 180, 149, 230, 192, - 149, 216, 18, 230, 192, 149, 204, 203, 236, 164, 149, 222, 139, 214, 72, - 180, 149, 233, 93, 214, 72, 180, 149, 222, 139, 127, 180, 149, 233, 93, - 127, 180, 149, 222, 139, 247, 231, 216, 18, 180, 149, 233, 93, 247, 231, - 216, 18, 180, 149, 218, 134, 222, 138, 218, 134, 233, 92, 248, 202, 216, - 18, 236, 164, 149, 216, 18, 222, 138, 216, 18, 233, 92, 217, 102, 222, - 139, 216, 27, 180, 149, 217, 102, 233, 93, 216, 27, 180, 149, 222, 139, - 214, 72, 236, 164, 149, 233, 93, 214, 72, 236, 164, 149, 217, 102, 222, - 139, 216, 27, 236, 164, 149, 217, 102, 233, 93, 216, 27, 236, 164, 149, - 222, 139, 214, 72, 233, 92, 233, 93, 214, 72, 222, 138, 217, 102, 222, - 139, 216, 27, 233, 92, 217, 102, 233, 93, 216, 27, 222, 138, 212, 34, - 204, 133, 212, 35, 214, 72, 180, 149, 204, 134, 214, 72, 180, 149, 212, - 35, 214, 72, 236, 164, 149, 204, 134, 214, 72, 236, 164, 149, 239, 18, - 216, 18, 212, 37, 239, 18, 216, 18, 204, 135, 204, 142, 214, 158, 204, - 94, 214, 158, 216, 18, 39, 204, 142, 214, 158, 216, 18, 39, 204, 94, 214, - 158, 204, 142, 77, 214, 72, 180, 149, 204, 94, 77, 214, 72, 180, 149, - 217, 102, 39, 204, 142, 77, 216, 27, 180, 149, 217, 102, 39, 204, 94, 77, - 216, 27, 180, 149, 204, 142, 77, 3, 216, 18, 180, 149, 204, 94, 77, 3, - 216, 18, 180, 149, 218, 114, 218, 115, 218, 116, 218, 115, 200, 51, 47, - 226, 101, 214, 158, 47, 214, 62, 214, 158, 47, 226, 101, 77, 214, 72, - 180, 149, 47, 214, 62, 77, 214, 72, 180, 149, 47, 247, 124, 47, 241, 26, - 46, 212, 124, 46, 219, 14, 46, 202, 76, 46, 239, 53, 205, 248, 46, 76, - 214, 81, 46, 210, 3, 214, 81, 46, 250, 179, 214, 81, 46, 236, 170, 46, - 240, 64, 103, 212, 124, 103, 219, 14, 103, 202, 76, 103, 76, 214, 81, 53, - 203, 147, 50, 203, 147, 135, 203, 147, 124, 203, 147, 250, 182, 218, 239, - 201, 142, 235, 29, 201, 165, 83, 249, 79, 53, 201, 3, 52, 83, 249, 79, - 52, 53, 201, 3, 239, 18, 216, 18, 211, 240, 216, 18, 201, 142, 239, 18, - 216, 18, 235, 30, 217, 105, 52, 83, 249, 79, 52, 53, 201, 3, 212, 35, - 200, 64, 210, 136, 204, 134, 200, 64, 210, 136, 216, 24, 204, 156, 214, - 158, 241, 130, 250, 202, 216, 24, 204, 155, 216, 24, 204, 156, 77, 214, - 72, 180, 149, 241, 130, 250, 202, 216, 24, 204, 156, 214, 72, 180, 149, - 214, 62, 214, 158, 226, 101, 214, 158, 218, 121, 232, 91, 241, 141, 220, - 0, 226, 33, 196, 181, 217, 218, 216, 26, 53, 251, 90, 3, 250, 252, 53, - 201, 180, 218, 53, 221, 248, 251, 99, 218, 53, 221, 248, 214, 71, 218, - 53, 226, 22, 218, 53, 200, 51, 239, 140, 214, 81, 76, 214, 81, 205, 8, - 214, 81, 239, 53, 202, 76, 248, 70, 50, 216, 24, 235, 222, 207, 104, 212, - 4, 53, 216, 24, 235, 222, 207, 104, 212, 4, 50, 207, 104, 212, 4, 53, - 207, 104, 212, 4, 210, 89, 202, 85, 236, 170, 241, 17, 221, 248, 214, 71, - 241, 17, 221, 248, 251, 99, 52, 204, 141, 52, 204, 93, 52, 226, 22, 52, - 200, 51, 212, 154, 180, 26, 213, 145, 149, 222, 139, 3, 238, 252, 233, - 93, 3, 238, 252, 199, 48, 218, 134, 222, 138, 199, 48, 218, 134, 233, 92, - 222, 139, 180, 202, 30, 214, 72, 233, 92, 233, 93, 180, 202, 30, 214, 72, - 222, 138, 180, 202, 30, 214, 72, 222, 138, 180, 202, 30, 214, 72, 233, - 92, 180, 202, 30, 214, 72, 212, 34, 180, 202, 30, 214, 72, 204, 133, 239, - 18, 216, 18, 212, 38, 214, 72, 236, 172, 239, 18, 216, 18, 204, 136, 214, - 72, 236, 172, 216, 18, 47, 226, 101, 77, 214, 72, 180, 149, 216, 18, 47, - 214, 62, 77, 214, 72, 180, 149, 47, 226, 101, 77, 214, 72, 216, 18, 180, - 149, 47, 214, 62, 77, 214, 72, 216, 18, 180, 149, 222, 139, 247, 231, - 216, 18, 236, 164, 149, 233, 93, 247, 231, 216, 18, 236, 164, 149, 212, - 35, 247, 231, 216, 18, 236, 164, 149, 204, 134, 247, 231, 216, 18, 236, - 164, 149, 216, 18, 216, 24, 204, 156, 214, 158, 239, 18, 216, 18, 241, - 132, 250, 202, 216, 24, 204, 155, 216, 18, 216, 24, 204, 156, 77, 214, - 72, 180, 149, 239, 18, 216, 18, 241, 132, 250, 202, 216, 24, 204, 156, - 214, 72, 236, 172, 83, 236, 246, 219, 60, 231, 154, 236, 246, 124, 53, - 239, 146, 236, 246, 135, 53, 239, 146, 236, 246, 236, 255, 77, 3, 181, - 231, 154, 106, 236, 255, 77, 3, 83, 249, 79, 250, 168, 236, 221, 77, 231, - 154, 106, 4, 236, 255, 77, 3, 83, 249, 79, 250, 168, 236, 221, 77, 231, - 154, 106, 236, 255, 77, 3, 76, 57, 236, 255, 77, 3, 214, 25, 4, 236, 255, - 77, 3, 214, 25, 236, 255, 77, 3, 200, 62, 236, 255, 77, 3, 99, 231, 154, - 204, 183, 241, 130, 3, 181, 231, 154, 106, 241, 130, 3, 83, 249, 79, 250, - 168, 236, 221, 77, 231, 154, 106, 4, 241, 130, 3, 83, 249, 79, 250, 168, - 236, 221, 77, 231, 154, 106, 241, 130, 3, 214, 25, 4, 241, 130, 3, 214, - 25, 195, 159, 216, 16, 249, 122, 219, 166, 239, 141, 55, 237, 1, 51, 231, - 86, 124, 250, 216, 135, 250, 216, 211, 254, 213, 25, 197, 119, 222, 74, - 50, 247, 44, 53, 247, 44, 50, 235, 68, 53, 235, 68, 248, 84, 53, 241, 62, - 248, 84, 50, 241, 62, 201, 243, 53, 241, 62, 201, 243, 50, 241, 62, 210, - 89, 216, 18, 55, 47, 221, 197, 250, 252, 208, 122, 208, 131, 203, 34, - 210, 166, 212, 78, 226, 67, 199, 22, 205, 94, 212, 148, 77, 226, 32, 55, - 163, 216, 18, 55, 197, 129, 231, 88, 201, 243, 50, 241, 100, 201, 243, - 53, 241, 100, 248, 84, 50, 241, 100, 248, 84, 53, 241, 100, 201, 243, - 157, 226, 36, 248, 84, 157, 226, 36, 234, 229, 205, 219, 124, 250, 217, - 248, 203, 99, 231, 154, 249, 67, 214, 74, 224, 152, 236, 160, 202, 30, - 202, 218, 210, 22, 196, 223, 226, 86, 39, 210, 163, 248, 69, 224, 150, - 222, 178, 251, 90, 179, 210, 17, 251, 90, 179, 236, 160, 202, 30, 202, - 218, 222, 183, 248, 214, 210, 2, 240, 240, 251, 146, 250, 225, 203, 247, - 201, 228, 209, 113, 239, 103, 214, 63, 241, 145, 203, 103, 205, 233, 241, - 89, 241, 88, 251, 39, 234, 212, 16, 230, 241, 251, 39, 234, 212, 16, 205, - 85, 211, 93, 251, 39, 234, 212, 16, 211, 94, 236, 172, 251, 39, 234, 212, - 16, 211, 94, 239, 60, 251, 39, 234, 212, 16, 211, 94, 239, 139, 251, 39, - 234, 212, 16, 211, 94, 225, 115, 251, 39, 234, 212, 16, 211, 94, 244, - 248, 251, 39, 234, 212, 16, 244, 249, 204, 234, 251, 39, 234, 212, 16, - 244, 249, 225, 115, 251, 39, 234, 212, 16, 205, 249, 154, 251, 39, 234, - 212, 16, 249, 133, 154, 251, 39, 234, 212, 16, 211, 94, 205, 248, 251, - 39, 234, 212, 16, 211, 94, 249, 132, 251, 39, 234, 212, 16, 211, 94, 222, - 138, 251, 39, 234, 212, 16, 211, 94, 233, 92, 251, 39, 234, 212, 16, 107, - 199, 140, 251, 39, 234, 212, 16, 91, 199, 140, 251, 39, 234, 212, 16, - 211, 94, 107, 51, 251, 39, 234, 212, 16, 211, 94, 91, 51, 251, 39, 234, - 212, 16, 244, 249, 249, 132, 251, 39, 234, 212, 16, 135, 203, 148, 200, - 62, 251, 39, 234, 212, 16, 239, 212, 204, 234, 251, 39, 234, 212, 16, - 211, 94, 135, 247, 109, 251, 39, 234, 212, 16, 211, 94, 239, 211, 251, - 39, 234, 212, 16, 135, 203, 148, 225, 115, 251, 39, 234, 212, 16, 200, - 24, 199, 140, 251, 39, 234, 212, 16, 211, 94, 200, 24, 51, 251, 39, 234, - 212, 16, 124, 203, 148, 214, 25, 251, 39, 234, 212, 16, 239, 224, 204, - 234, 251, 39, 234, 212, 16, 211, 94, 124, 247, 109, 251, 39, 234, 212, - 16, 211, 94, 239, 223, 251, 39, 234, 212, 16, 124, 203, 148, 225, 115, - 251, 39, 234, 212, 16, 237, 230, 199, 140, 251, 39, 234, 212, 16, 211, - 94, 237, 230, 51, 251, 39, 234, 212, 16, 211, 60, 200, 62, 251, 39, 234, - 212, 16, 239, 212, 200, 62, 251, 39, 234, 212, 16, 239, 140, 200, 62, - 251, 39, 234, 212, 16, 225, 116, 200, 62, 251, 39, 234, 212, 16, 244, - 249, 200, 62, 251, 39, 234, 212, 16, 124, 206, 195, 225, 115, 251, 39, - 234, 212, 16, 211, 60, 211, 93, 251, 39, 234, 212, 16, 244, 249, 205, 7, - 251, 39, 234, 212, 16, 211, 94, 244, 167, 251, 39, 234, 212, 16, 124, - 203, 148, 239, 149, 251, 39, 234, 212, 16, 239, 224, 239, 149, 251, 39, - 234, 212, 16, 205, 8, 239, 149, 251, 39, 234, 212, 16, 225, 116, 239, - 149, 251, 39, 234, 212, 16, 244, 249, 239, 149, 251, 39, 234, 212, 16, - 135, 206, 195, 204, 234, 251, 39, 234, 212, 16, 50, 206, 195, 204, 234, - 251, 39, 234, 212, 16, 202, 85, 239, 149, 251, 39, 234, 212, 16, 233, 93, - 239, 149, 251, 39, 234, 212, 16, 244, 159, 154, 251, 39, 234, 212, 16, - 239, 224, 202, 84, 251, 39, 234, 212, 16, 195, 23, 251, 39, 234, 212, 16, - 204, 235, 202, 84, 251, 39, 234, 212, 16, 207, 106, 200, 62, 251, 39, - 234, 212, 16, 211, 94, 216, 18, 236, 172, 251, 39, 234, 212, 16, 211, 94, - 211, 77, 251, 39, 234, 212, 16, 135, 247, 110, 202, 84, 251, 39, 234, - 212, 16, 124, 247, 110, 202, 84, 251, 39, 234, 212, 16, 226, 6, 251, 39, - 234, 212, 16, 210, 74, 251, 39, 234, 212, 16, 214, 123, 251, 39, 234, - 212, 16, 251, 134, 200, 62, 251, 39, 234, 212, 16, 236, 174, 200, 62, - 251, 39, 234, 212, 16, 226, 7, 200, 62, 251, 39, 234, 212, 16, 214, 124, - 200, 62, 251, 39, 234, 212, 16, 251, 133, 216, 18, 245, 101, 78, 53, 251, - 90, 3, 237, 230, 195, 24, 51, 206, 163, 192, 248, 69, 248, 229, 105, 83, - 222, 75, 3, 112, 238, 252, 226, 42, 105, 241, 125, 200, 60, 105, 239, 76, - 200, 60, 105, 236, 233, 105, 241, 160, 105, 59, 47, 3, 247, 36, 83, 222, - 74, 236, 204, 105, 251, 125, 224, 153, 105, 232, 104, 105, 46, 231, 154, - 249, 79, 3, 216, 15, 46, 201, 181, 237, 234, 248, 32, 244, 249, 3, 216, - 21, 51, 200, 58, 105, 218, 199, 105, 231, 2, 105, 214, 90, 233, 13, 105, - 214, 90, 223, 97, 105, 213, 119, 105, 213, 118, 105, 239, 85, 241, 15, - 16, 235, 23, 102, 205, 183, 105, 251, 39, 234, 212, 16, 211, 93, 239, - 243, 207, 91, 224, 153, 105, 212, 20, 213, 226, 217, 75, 213, 226, 212, - 15, 208, 155, 105, 244, 220, 208, 155, 105, 50, 213, 140, 200, 33, 122, - 50, 213, 140, 236, 76, 50, 213, 140, 221, 202, 122, 53, 213, 140, 200, - 33, 122, 53, 213, 140, 236, 76, 53, 213, 140, 221, 202, 122, 50, 47, 248, - 61, 200, 33, 241, 100, 50, 47, 248, 61, 236, 76, 50, 47, 248, 61, 221, - 202, 241, 100, 53, 47, 248, 61, 200, 33, 241, 100, 53, 47, 248, 61, 236, - 76, 53, 47, 248, 61, 221, 202, 241, 100, 50, 241, 17, 248, 61, 200, 33, - 122, 50, 241, 17, 248, 61, 112, 212, 211, 50, 241, 17, 248, 61, 221, 202, - 122, 241, 17, 248, 61, 236, 76, 53, 241, 17, 248, 61, 200, 33, 122, 53, - 241, 17, 248, 61, 112, 212, 211, 53, 241, 17, 248, 61, 221, 202, 122, - 226, 37, 236, 76, 231, 154, 222, 75, 236, 76, 200, 33, 50, 214, 72, 221, - 202, 53, 241, 17, 248, 61, 208, 132, 200, 33, 53, 214, 72, 221, 202, 50, - 241, 17, 248, 61, 208, 132, 204, 115, 201, 242, 204, 115, 248, 83, 201, - 243, 47, 179, 248, 84, 47, 179, 248, 84, 47, 248, 61, 127, 201, 243, 47, - 179, 44, 16, 248, 83, 50, 83, 111, 222, 74, 53, 83, 111, 222, 74, 231, - 154, 208, 174, 222, 73, 231, 154, 208, 174, 222, 72, 231, 154, 208, 174, - 222, 71, 231, 154, 208, 174, 222, 70, 239, 203, 16, 175, 83, 26, 201, - 243, 210, 22, 239, 203, 16, 175, 83, 26, 248, 84, 210, 22, 239, 203, 16, - 175, 83, 3, 244, 248, 239, 203, 16, 175, 135, 26, 231, 154, 3, 244, 248, - 239, 203, 16, 175, 124, 26, 231, 154, 3, 244, 248, 239, 203, 16, 175, 83, - 3, 201, 180, 239, 203, 16, 175, 135, 26, 231, 154, 3, 201, 180, 239, 203, - 16, 175, 124, 26, 231, 154, 3, 201, 180, 239, 203, 16, 175, 83, 26, 197, - 122, 239, 203, 16, 175, 135, 26, 231, 154, 3, 197, 122, 239, 203, 16, - 175, 124, 26, 231, 154, 3, 197, 122, 239, 203, 16, 175, 135, 26, 231, - 153, 239, 203, 16, 175, 124, 26, 231, 153, 239, 203, 16, 175, 83, 26, - 201, 243, 222, 183, 239, 203, 16, 175, 83, 26, 248, 84, 222, 183, 47, - 235, 36, 210, 94, 105, 237, 15, 105, 83, 222, 75, 236, 76, 219, 136, 248, - 46, 219, 136, 181, 127, 206, 181, 219, 136, 206, 182, 127, 221, 239, 219, - 136, 181, 127, 99, 206, 167, 219, 136, 99, 206, 168, 127, 221, 239, 219, - 136, 99, 206, 168, 225, 124, 219, 136, 201, 161, 219, 136, 202, 249, 219, - 136, 213, 52, 237, 72, 233, 84, 234, 206, 201, 243, 213, 139, 248, 84, - 213, 139, 201, 243, 241, 17, 179, 248, 84, 241, 17, 179, 201, 243, 201, - 231, 206, 245, 179, 248, 84, 201, 231, 206, 245, 179, 59, 201, 197, 248, - 214, 210, 3, 3, 244, 248, 204, 216, 235, 79, 252, 25, 241, 14, 237, 0, - 226, 22, 239, 243, 236, 80, 105, 58, 210, 17, 52, 201, 180, 58, 222, 178, - 52, 201, 180, 58, 200, 35, 52, 201, 180, 58, 237, 233, 52, 201, 180, 58, - 210, 17, 52, 201, 181, 3, 83, 154, 58, 222, 178, 52, 201, 181, 3, 83, - 154, 58, 210, 17, 201, 181, 3, 52, 83, 154, 251, 167, 244, 205, 204, 223, - 202, 77, 244, 205, 231, 89, 3, 235, 59, 208, 217, 58, 219, 189, 222, 178, - 201, 180, 58, 219, 189, 210, 17, 201, 180, 58, 219, 189, 200, 35, 201, - 180, 58, 219, 189, 237, 233, 201, 180, 52, 83, 154, 58, 47, 36, 204, 226, - 58, 244, 249, 36, 210, 167, 212, 58, 105, 212, 58, 214, 117, 105, 212, - 58, 214, 119, 105, 212, 58, 205, 244, 105, 214, 177, 236, 67, 105, 16, - 36, 215, 145, 16, 36, 205, 3, 77, 232, 133, 16, 36, 205, 3, 77, 202, 237, - 16, 36, 236, 221, 77, 202, 237, 16, 36, 236, 221, 77, 201, 202, 16, 36, - 236, 207, 16, 36, 252, 13, 16, 36, 248, 228, 16, 36, 249, 131, 16, 36, - 231, 154, 203, 149, 16, 36, 222, 75, 235, 179, 16, 36, 83, 203, 149, 16, - 36, 235, 23, 235, 179, 16, 36, 247, 101, 210, 93, 16, 36, 206, 219, 214, - 33, 16, 36, 206, 219, 226, 85, 16, 36, 240, 59, 222, 65, 236, 142, 16, - 36, 239, 182, 241, 120, 100, 16, 36, 239, 182, 241, 120, 102, 16, 36, - 239, 182, 241, 120, 134, 16, 36, 239, 182, 241, 120, 136, 16, 36, 217, - 103, 252, 13, 16, 36, 203, 242, 226, 148, 16, 36, 236, 221, 77, 201, 203, - 248, 125, 16, 36, 247, 139, 16, 36, 236, 221, 77, 219, 188, 16, 36, 204, - 139, 16, 36, 236, 142, 16, 36, 235, 137, 207, 90, 16, 36, 233, 83, 207, - 90, 16, 36, 210, 168, 207, 90, 16, 36, 200, 50, 207, 90, 16, 36, 205, - 148, 16, 36, 239, 221, 248, 129, 105, 192, 248, 69, 16, 36, 217, 78, 16, - 36, 239, 222, 235, 23, 102, 16, 36, 204, 140, 235, 23, 102, 214, 173, - 122, 214, 173, 247, 10, 214, 173, 235, 26, 214, 173, 226, 16, 235, 26, - 214, 173, 248, 225, 248, 17, 214, 173, 248, 77, 202, 107, 214, 173, 248, - 57, 249, 84, 230, 191, 214, 173, 251, 112, 77, 245, 100, 214, 173, 240, - 64, 214, 173, 241, 3, 252, 17, 215, 143, 214, 173, 52, 249, 132, 46, 17, - 100, 46, 17, 102, 46, 17, 134, 46, 17, 136, 46, 17, 146, 46, 17, 167, 46, - 17, 178, 46, 17, 171, 46, 17, 182, 46, 31, 203, 23, 46, 31, 236, 251, 46, - 31, 200, 239, 46, 31, 202, 179, 46, 31, 235, 0, 46, 31, 235, 148, 46, 31, - 206, 23, 46, 31, 207, 68, 46, 31, 237, 27, 46, 31, 216, 175, 46, 31, 200, + 214, 90, 51, 91, 214, 90, 51, 50, 53, 214, 90, 51, 36, 251, 146, 244, + 153, 213, 132, 239, 124, 202, 208, 236, 85, 202, 208, 239, 19, 216, 19, + 236, 86, 236, 232, 207, 76, 226, 75, 217, 239, 237, 0, 214, 159, 216, 19, + 251, 107, 237, 0, 214, 159, 4, 237, 0, 214, 159, 241, 131, 250, 203, 219, + 168, 239, 19, 216, 19, 241, 133, 250, 203, 219, 168, 4, 241, 131, 250, + 203, 219, 168, 236, 222, 77, 211, 251, 218, 54, 212, 5, 218, 54, 241, + 108, 218, 54, 204, 114, 219, 16, 55, 219, 14, 55, 76, 212, 125, 239, 54, + 205, 248, 207, 77, 219, 15, 250, 180, 214, 82, 210, 3, 214, 82, 248, 6, + 214, 82, 47, 209, 200, 241, 37, 209, 200, 235, 0, 209, 200, 211, 247, + 149, 226, 63, 53, 251, 90, 251, 90, 219, 201, 251, 90, 205, 127, 251, 90, + 239, 57, 239, 19, 216, 19, 239, 61, 213, 146, 149, 216, 19, 213, 146, + 149, 221, 249, 251, 100, 221, 249, 214, 72, 226, 23, 200, 51, 226, 37, + 52, 226, 37, 201, 165, 226, 37, 241, 125, 226, 37, 204, 84, 226, 37, 198, + 236, 226, 37, 244, 205, 226, 37, 244, 205, 241, 125, 226, 37, 251, 65, + 241, 125, 226, 37, 202, 207, 248, 253, 210, 194, 211, 248, 76, 219, 15, + 236, 93, 234, 27, 211, 248, 231, 170, 202, 85, 214, 82, 210, 89, 202, 84, + 226, 17, 222, 204, 209, 80, 206, 64, 197, 122, 196, 253, 212, 5, 216, 19, + 202, 84, 219, 16, 202, 84, 250, 172, 180, 149, 216, 19, 250, 172, 180, + 149, 251, 21, 180, 149, 251, 21, 247, 232, 216, 19, 252, 11, 180, 149, + 217, 103, 251, 21, 216, 28, 252, 11, 180, 149, 251, 139, 180, 149, 216, + 19, 251, 139, 180, 149, 251, 139, 180, 214, 73, 180, 149, 201, 165, 202, + 84, 251, 147, 180, 149, 236, 165, 149, 234, 26, 236, 165, 149, 239, 125, + 248, 203, 251, 23, 202, 218, 222, 83, 234, 26, 180, 149, 251, 21, 180, + 202, 30, 214, 73, 202, 218, 226, 102, 214, 159, 226, 102, 77, 214, 73, + 251, 21, 180, 149, 244, 169, 236, 171, 236, 172, 244, 168, 210, 3, 226, + 87, 180, 149, 210, 3, 180, 149, 241, 94, 149, 236, 132, 236, 170, 149, + 205, 8, 236, 171, 239, 213, 180, 149, 180, 202, 30, 247, 219, 239, 232, + 219, 201, 247, 218, 211, 77, 180, 149, 216, 19, 180, 149, 230, 193, 149, + 216, 19, 230, 193, 149, 204, 203, 236, 165, 149, 222, 140, 214, 73, 180, + 149, 233, 94, 214, 73, 180, 149, 222, 140, 127, 180, 149, 233, 94, 127, + 180, 149, 222, 140, 247, 232, 216, 19, 180, 149, 233, 94, 247, 232, 216, + 19, 180, 149, 218, 135, 222, 139, 218, 135, 233, 93, 248, 203, 216, 19, + 236, 165, 149, 216, 19, 222, 139, 216, 19, 233, 93, 217, 103, 222, 140, + 216, 28, 180, 149, 217, 103, 233, 94, 216, 28, 180, 149, 222, 140, 214, + 73, 236, 165, 149, 233, 94, 214, 73, 236, 165, 149, 217, 103, 222, 140, + 216, 28, 236, 165, 149, 217, 103, 233, 94, 216, 28, 236, 165, 149, 222, + 140, 214, 73, 233, 93, 233, 94, 214, 73, 222, 139, 217, 103, 222, 140, + 216, 28, 233, 93, 217, 103, 233, 94, 216, 28, 222, 139, 212, 35, 204, + 133, 212, 36, 214, 73, 180, 149, 204, 134, 214, 73, 180, 149, 212, 36, + 214, 73, 236, 165, 149, 204, 134, 214, 73, 236, 165, 149, 239, 19, 216, + 19, 212, 38, 239, 19, 216, 19, 204, 135, 204, 142, 214, 159, 204, 94, + 214, 159, 216, 19, 39, 204, 142, 214, 159, 216, 19, 39, 204, 94, 214, + 159, 204, 142, 77, 214, 73, 180, 149, 204, 94, 77, 214, 73, 180, 149, + 217, 103, 39, 204, 142, 77, 216, 28, 180, 149, 217, 103, 39, 204, 94, 77, + 216, 28, 180, 149, 204, 142, 77, 3, 216, 19, 180, 149, 204, 94, 77, 3, + 216, 19, 180, 149, 218, 115, 218, 116, 218, 117, 218, 116, 200, 51, 47, + 226, 102, 214, 159, 47, 214, 63, 214, 159, 47, 226, 102, 77, 214, 73, + 180, 149, 47, 214, 63, 77, 214, 73, 180, 149, 47, 247, 125, 47, 241, 27, + 46, 212, 125, 46, 219, 15, 46, 202, 76, 46, 239, 54, 205, 248, 46, 76, + 214, 82, 46, 210, 3, 214, 82, 46, 250, 180, 214, 82, 46, 236, 171, 46, + 240, 65, 103, 212, 125, 103, 219, 15, 103, 202, 76, 103, 76, 214, 82, 53, + 203, 147, 50, 203, 147, 135, 203, 147, 124, 203, 147, 250, 183, 218, 240, + 201, 142, 235, 30, 201, 165, 83, 249, 80, 53, 201, 3, 52, 83, 249, 80, + 52, 53, 201, 3, 239, 19, 216, 19, 211, 241, 216, 19, 201, 142, 239, 19, + 216, 19, 235, 31, 217, 106, 52, 83, 249, 80, 52, 53, 201, 3, 212, 36, + 200, 64, 210, 136, 204, 134, 200, 64, 210, 136, 216, 25, 204, 156, 214, + 159, 241, 131, 250, 203, 216, 25, 204, 155, 216, 25, 204, 156, 77, 214, + 73, 180, 149, 241, 131, 250, 203, 216, 25, 204, 156, 214, 73, 180, 149, + 214, 63, 214, 159, 226, 102, 214, 159, 218, 122, 232, 92, 241, 142, 220, + 1, 226, 34, 196, 181, 217, 219, 216, 27, 53, 251, 91, 3, 250, 253, 53, + 201, 180, 218, 54, 221, 249, 251, 100, 218, 54, 221, 249, 214, 72, 218, + 54, 226, 23, 218, 54, 200, 51, 239, 141, 214, 82, 76, 214, 82, 205, 8, + 214, 82, 239, 54, 202, 76, 248, 71, 50, 216, 25, 235, 223, 207, 104, 212, + 5, 53, 216, 25, 235, 223, 207, 104, 212, 5, 50, 207, 104, 212, 5, 53, + 207, 104, 212, 5, 210, 89, 202, 85, 236, 171, 241, 18, 221, 249, 214, 72, + 241, 18, 221, 249, 251, 100, 52, 204, 141, 52, 204, 93, 52, 226, 23, 52, + 200, 51, 212, 155, 180, 26, 213, 146, 149, 222, 140, 3, 238, 253, 233, + 94, 3, 238, 253, 199, 48, 218, 135, 222, 139, 199, 48, 218, 135, 233, 93, + 222, 140, 180, 202, 30, 214, 73, 233, 93, 233, 94, 180, 202, 30, 214, 73, + 222, 139, 180, 202, 30, 214, 73, 222, 139, 180, 202, 30, 214, 73, 233, + 93, 180, 202, 30, 214, 73, 212, 35, 180, 202, 30, 214, 73, 204, 133, 239, + 19, 216, 19, 212, 39, 214, 73, 236, 173, 239, 19, 216, 19, 204, 136, 214, + 73, 236, 173, 216, 19, 47, 226, 102, 77, 214, 73, 180, 149, 216, 19, 47, + 214, 63, 77, 214, 73, 180, 149, 47, 226, 102, 77, 214, 73, 216, 19, 180, + 149, 47, 214, 63, 77, 214, 73, 216, 19, 180, 149, 222, 140, 247, 232, + 216, 19, 236, 165, 149, 233, 94, 247, 232, 216, 19, 236, 165, 149, 212, + 36, 247, 232, 216, 19, 236, 165, 149, 204, 134, 247, 232, 216, 19, 236, + 165, 149, 216, 19, 216, 25, 204, 156, 214, 159, 239, 19, 216, 19, 241, + 133, 250, 203, 216, 25, 204, 155, 216, 19, 216, 25, 204, 156, 77, 214, + 73, 180, 149, 239, 19, 216, 19, 241, 133, 250, 203, 216, 25, 204, 156, + 214, 73, 236, 173, 83, 236, 247, 219, 61, 231, 155, 236, 247, 124, 53, + 239, 147, 236, 247, 135, 53, 239, 147, 236, 247, 237, 0, 77, 3, 181, 231, + 155, 106, 237, 0, 77, 3, 83, 249, 80, 250, 169, 236, 222, 77, 231, 155, + 106, 4, 237, 0, 77, 3, 83, 249, 80, 250, 169, 236, 222, 77, 231, 155, + 106, 237, 0, 77, 3, 76, 57, 237, 0, 77, 3, 214, 26, 4, 237, 0, 77, 3, + 214, 26, 237, 0, 77, 3, 200, 62, 237, 0, 77, 3, 99, 231, 155, 204, 183, + 241, 131, 3, 181, 231, 155, 106, 241, 131, 3, 83, 249, 80, 250, 169, 236, + 222, 77, 231, 155, 106, 4, 241, 131, 3, 83, 249, 80, 250, 169, 236, 222, + 77, 231, 155, 106, 241, 131, 3, 214, 26, 4, 241, 131, 3, 214, 26, 195, + 159, 216, 17, 249, 123, 219, 167, 239, 142, 55, 237, 2, 51, 231, 87, 124, + 250, 217, 135, 250, 217, 211, 255, 213, 26, 197, 119, 222, 75, 50, 247, + 45, 53, 247, 45, 50, 235, 69, 53, 235, 69, 248, 85, 53, 241, 63, 248, 85, + 50, 241, 63, 201, 243, 53, 241, 63, 201, 243, 50, 241, 63, 210, 89, 216, + 19, 55, 47, 221, 198, 250, 253, 208, 122, 208, 131, 203, 34, 210, 167, + 212, 79, 226, 68, 199, 22, 205, 94, 212, 149, 77, 226, 33, 55, 163, 216, + 19, 55, 197, 129, 231, 89, 201, 243, 50, 241, 101, 201, 243, 53, 241, + 101, 248, 85, 50, 241, 101, 248, 85, 53, 241, 101, 201, 243, 157, 226, + 37, 248, 85, 157, 226, 37, 234, 230, 205, 219, 124, 250, 218, 248, 204, + 99, 231, 155, 249, 68, 214, 75, 224, 153, 236, 161, 202, 30, 202, 218, + 210, 22, 196, 223, 226, 87, 39, 210, 164, 248, 70, 224, 151, 222, 179, + 251, 91, 179, 210, 17, 251, 91, 179, 236, 161, 202, 30, 202, 218, 222, + 184, 248, 215, 210, 2, 240, 241, 251, 147, 250, 226, 203, 247, 201, 228, + 209, 113, 239, 104, 214, 64, 241, 146, 203, 103, 205, 233, 241, 90, 241, + 89, 251, 40, 234, 213, 16, 230, 242, 251, 40, 234, 213, 16, 205, 85, 211, + 94, 251, 40, 234, 213, 16, 211, 95, 236, 173, 251, 40, 234, 213, 16, 211, + 95, 239, 61, 251, 40, 234, 213, 16, 211, 95, 239, 140, 251, 40, 234, 213, + 16, 211, 95, 225, 116, 251, 40, 234, 213, 16, 211, 95, 244, 249, 251, 40, + 234, 213, 16, 244, 250, 204, 234, 251, 40, 234, 213, 16, 244, 250, 225, + 116, 251, 40, 234, 213, 16, 205, 249, 154, 251, 40, 234, 213, 16, 249, + 134, 154, 251, 40, 234, 213, 16, 211, 95, 205, 248, 251, 40, 234, 213, + 16, 211, 95, 249, 133, 251, 40, 234, 213, 16, 211, 95, 222, 139, 251, 40, + 234, 213, 16, 211, 95, 233, 93, 251, 40, 234, 213, 16, 107, 199, 140, + 251, 40, 234, 213, 16, 91, 199, 140, 251, 40, 234, 213, 16, 211, 95, 107, + 51, 251, 40, 234, 213, 16, 211, 95, 91, 51, 251, 40, 234, 213, 16, 244, + 250, 249, 133, 251, 40, 234, 213, 16, 135, 203, 148, 200, 62, 251, 40, + 234, 213, 16, 239, 213, 204, 234, 251, 40, 234, 213, 16, 211, 95, 135, + 247, 110, 251, 40, 234, 213, 16, 211, 95, 239, 212, 251, 40, 234, 213, + 16, 135, 203, 148, 225, 116, 251, 40, 234, 213, 16, 200, 24, 199, 140, + 251, 40, 234, 213, 16, 211, 95, 200, 24, 51, 251, 40, 234, 213, 16, 124, + 203, 148, 214, 26, 251, 40, 234, 213, 16, 239, 225, 204, 234, 251, 40, + 234, 213, 16, 211, 95, 124, 247, 110, 251, 40, 234, 213, 16, 211, 95, + 239, 224, 251, 40, 234, 213, 16, 124, 203, 148, 225, 116, 251, 40, 234, + 213, 16, 237, 231, 199, 140, 251, 40, 234, 213, 16, 211, 95, 237, 231, + 51, 251, 40, 234, 213, 16, 211, 61, 200, 62, 251, 40, 234, 213, 16, 239, + 213, 200, 62, 251, 40, 234, 213, 16, 239, 141, 200, 62, 251, 40, 234, + 213, 16, 225, 117, 200, 62, 251, 40, 234, 213, 16, 244, 250, 200, 62, + 251, 40, 234, 213, 16, 124, 206, 195, 225, 116, 251, 40, 234, 213, 16, + 211, 61, 211, 94, 251, 40, 234, 213, 16, 244, 250, 205, 7, 251, 40, 234, + 213, 16, 211, 95, 244, 168, 251, 40, 234, 213, 16, 124, 203, 148, 239, + 150, 251, 40, 234, 213, 16, 239, 225, 239, 150, 251, 40, 234, 213, 16, + 205, 8, 239, 150, 251, 40, 234, 213, 16, 225, 117, 239, 150, 251, 40, + 234, 213, 16, 244, 250, 239, 150, 251, 40, 234, 213, 16, 135, 206, 195, + 204, 234, 251, 40, 234, 213, 16, 50, 206, 195, 204, 234, 251, 40, 234, + 213, 16, 202, 85, 239, 150, 251, 40, 234, 213, 16, 233, 94, 239, 150, + 251, 40, 234, 213, 16, 244, 160, 154, 251, 40, 234, 213, 16, 239, 225, + 202, 84, 251, 40, 234, 213, 16, 195, 23, 251, 40, 234, 213, 16, 204, 235, + 202, 84, 251, 40, 234, 213, 16, 207, 106, 200, 62, 251, 40, 234, 213, 16, + 211, 95, 216, 19, 236, 173, 251, 40, 234, 213, 16, 211, 95, 211, 78, 251, + 40, 234, 213, 16, 135, 247, 111, 202, 84, 251, 40, 234, 213, 16, 124, + 247, 111, 202, 84, 251, 40, 234, 213, 16, 226, 7, 251, 40, 234, 213, 16, + 210, 74, 251, 40, 234, 213, 16, 214, 124, 251, 40, 234, 213, 16, 251, + 135, 200, 62, 251, 40, 234, 213, 16, 236, 175, 200, 62, 251, 40, 234, + 213, 16, 226, 8, 200, 62, 251, 40, 234, 213, 16, 214, 125, 200, 62, 251, + 40, 234, 213, 16, 251, 134, 216, 19, 245, 102, 78, 53, 251, 91, 3, 237, + 231, 195, 24, 51, 206, 163, 192, 248, 70, 248, 230, 105, 83, 222, 76, 3, + 112, 238, 253, 226, 43, 105, 241, 126, 200, 60, 105, 239, 77, 200, 60, + 105, 236, 234, 105, 241, 161, 105, 59, 47, 3, 247, 37, 83, 222, 75, 236, + 205, 105, 251, 126, 224, 154, 105, 232, 105, 105, 46, 231, 155, 249, 80, + 3, 216, 16, 46, 201, 181, 237, 235, 248, 33, 244, 250, 3, 216, 22, 51, + 200, 58, 105, 218, 200, 105, 231, 3, 105, 214, 91, 233, 14, 105, 214, 91, + 223, 98, 105, 213, 120, 105, 213, 119, 105, 239, 86, 241, 16, 16, 235, + 24, 102, 205, 183, 105, 251, 40, 234, 213, 16, 211, 94, 239, 244, 207, + 91, 224, 154, 105, 212, 21, 213, 227, 217, 76, 213, 227, 212, 16, 208, + 155, 105, 244, 221, 208, 155, 105, 50, 213, 141, 200, 33, 122, 50, 213, + 141, 236, 77, 50, 213, 141, 221, 203, 122, 53, 213, 141, 200, 33, 122, + 53, 213, 141, 236, 77, 53, 213, 141, 221, 203, 122, 50, 47, 248, 62, 200, + 33, 241, 101, 50, 47, 248, 62, 236, 77, 50, 47, 248, 62, 221, 203, 241, + 101, 53, 47, 248, 62, 200, 33, 241, 101, 53, 47, 248, 62, 236, 77, 53, + 47, 248, 62, 221, 203, 241, 101, 50, 241, 18, 248, 62, 200, 33, 122, 50, + 241, 18, 248, 62, 112, 212, 212, 50, 241, 18, 248, 62, 221, 203, 122, + 241, 18, 248, 62, 236, 77, 53, 241, 18, 248, 62, 200, 33, 122, 53, 241, + 18, 248, 62, 112, 212, 212, 53, 241, 18, 248, 62, 221, 203, 122, 226, 38, + 236, 77, 231, 155, 222, 76, 236, 77, 200, 33, 50, 214, 73, 221, 203, 53, + 241, 18, 248, 62, 208, 132, 200, 33, 53, 214, 73, 221, 203, 50, 241, 18, + 248, 62, 208, 132, 204, 115, 201, 242, 204, 115, 248, 84, 201, 243, 47, + 179, 248, 85, 47, 179, 248, 85, 47, 248, 62, 127, 201, 243, 47, 179, 44, + 16, 248, 84, 50, 83, 111, 222, 75, 53, 83, 111, 222, 75, 231, 155, 208, + 174, 222, 74, 231, 155, 208, 174, 222, 73, 231, 155, 208, 174, 222, 72, + 231, 155, 208, 174, 222, 71, 239, 204, 16, 175, 83, 26, 201, 243, 210, + 22, 239, 204, 16, 175, 83, 26, 248, 85, 210, 22, 239, 204, 16, 175, 83, + 3, 244, 249, 239, 204, 16, 175, 135, 26, 231, 155, 3, 244, 249, 239, 204, + 16, 175, 124, 26, 231, 155, 3, 244, 249, 239, 204, 16, 175, 83, 3, 201, + 180, 239, 204, 16, 175, 135, 26, 231, 155, 3, 201, 180, 239, 204, 16, + 175, 124, 26, 231, 155, 3, 201, 180, 239, 204, 16, 175, 83, 26, 197, 122, + 239, 204, 16, 175, 135, 26, 231, 155, 3, 197, 122, 239, 204, 16, 175, + 124, 26, 231, 155, 3, 197, 122, 239, 204, 16, 175, 135, 26, 231, 154, + 239, 204, 16, 175, 124, 26, 231, 154, 239, 204, 16, 175, 83, 26, 201, + 243, 222, 184, 239, 204, 16, 175, 83, 26, 248, 85, 222, 184, 47, 235, 37, + 210, 94, 105, 237, 16, 105, 83, 222, 76, 236, 77, 219, 137, 248, 47, 219, + 137, 181, 127, 206, 181, 219, 137, 206, 182, 127, 221, 240, 219, 137, + 181, 127, 99, 206, 167, 219, 137, 99, 206, 168, 127, 221, 240, 219, 137, + 99, 206, 168, 225, 125, 219, 137, 201, 161, 219, 137, 202, 249, 219, 137, + 213, 53, 237, 73, 233, 85, 234, 207, 201, 243, 213, 140, 248, 85, 213, + 140, 201, 243, 241, 18, 179, 248, 85, 241, 18, 179, 201, 243, 201, 231, + 206, 245, 179, 248, 85, 201, 231, 206, 245, 179, 59, 201, 197, 248, 215, + 210, 3, 3, 244, 249, 204, 216, 235, 80, 252, 26, 241, 15, 237, 1, 226, + 23, 239, 244, 236, 81, 105, 58, 210, 17, 52, 201, 180, 58, 222, 179, 52, + 201, 180, 58, 200, 35, 52, 201, 180, 58, 237, 234, 52, 201, 180, 58, 210, + 17, 52, 201, 181, 3, 83, 154, 58, 222, 179, 52, 201, 181, 3, 83, 154, 58, + 210, 17, 201, 181, 3, 52, 83, 154, 251, 168, 244, 206, 204, 223, 202, 77, + 244, 206, 231, 90, 3, 235, 60, 208, 217, 58, 219, 190, 222, 179, 201, + 180, 58, 219, 190, 210, 17, 201, 180, 58, 219, 190, 200, 35, 201, 180, + 58, 219, 190, 237, 234, 201, 180, 52, 83, 154, 58, 47, 36, 204, 226, 58, + 244, 250, 36, 210, 168, 212, 59, 105, 212, 59, 214, 118, 105, 212, 59, + 214, 120, 105, 212, 59, 205, 244, 105, 214, 178, 236, 68, 105, 16, 36, + 215, 146, 16, 36, 205, 3, 77, 232, 134, 16, 36, 205, 3, 77, 202, 237, 16, + 36, 236, 222, 77, 202, 237, 16, 36, 236, 222, 77, 201, 202, 16, 36, 236, + 208, 16, 36, 252, 14, 16, 36, 248, 229, 16, 36, 249, 132, 16, 36, 231, + 155, 203, 149, 16, 36, 222, 76, 235, 180, 16, 36, 83, 203, 149, 16, 36, + 235, 24, 235, 180, 16, 36, 247, 102, 210, 93, 16, 36, 206, 219, 214, 34, + 16, 36, 206, 219, 226, 86, 16, 36, 240, 60, 222, 66, 236, 143, 16, 36, + 239, 183, 241, 121, 100, 16, 36, 239, 183, 241, 121, 102, 16, 36, 239, + 183, 241, 121, 134, 16, 36, 239, 183, 241, 121, 136, 16, 36, 217, 104, + 252, 14, 16, 36, 203, 242, 226, 149, 16, 36, 236, 222, 77, 201, 203, 248, + 126, 16, 36, 247, 140, 16, 36, 236, 222, 77, 219, 189, 16, 36, 204, 139, + 16, 36, 236, 143, 16, 36, 235, 138, 207, 90, 16, 36, 233, 84, 207, 90, + 16, 36, 210, 169, 207, 90, 16, 36, 200, 50, 207, 90, 16, 36, 205, 148, + 16, 36, 239, 222, 248, 130, 105, 192, 248, 70, 16, 36, 217, 79, 16, 36, + 239, 223, 235, 24, 102, 16, 36, 204, 140, 235, 24, 102, 214, 174, 122, + 214, 174, 247, 11, 214, 174, 235, 27, 214, 174, 226, 17, 235, 27, 214, + 174, 248, 226, 248, 18, 214, 174, 248, 78, 202, 107, 214, 174, 248, 58, + 249, 85, 230, 192, 214, 174, 251, 113, 77, 245, 101, 214, 174, 240, 65, + 214, 174, 241, 4, 252, 18, 215, 144, 214, 174, 52, 249, 133, 46, 17, 100, + 46, 17, 102, 46, 17, 134, 46, 17, 136, 46, 17, 146, 46, 17, 167, 46, 17, + 178, 46, 17, 171, 46, 17, 182, 46, 31, 203, 23, 46, 31, 236, 252, 46, 31, + 200, 239, 46, 31, 202, 179, 46, 31, 235, 1, 46, 31, 235, 149, 46, 31, + 206, 23, 46, 31, 207, 68, 46, 31, 237, 28, 46, 31, 216, 176, 46, 31, 200, 234, 119, 17, 100, 119, 17, 102, 119, 17, 134, 119, 17, 136, 119, 17, 146, 119, 17, 167, 119, 17, 178, 119, 17, 171, 119, 17, 182, 119, 31, - 203, 23, 119, 31, 236, 251, 119, 31, 200, 239, 119, 31, 202, 179, 119, - 31, 235, 0, 119, 31, 235, 148, 119, 31, 206, 23, 119, 31, 207, 68, 119, - 31, 237, 27, 119, 31, 216, 175, 119, 31, 200, 234, 17, 97, 234, 216, 204, - 226, 17, 99, 234, 216, 204, 226, 17, 115, 234, 216, 204, 226, 17, 235, 6, - 234, 216, 204, 226, 17, 235, 100, 234, 216, 204, 226, 17, 206, 29, 234, - 216, 204, 226, 17, 207, 71, 234, 216, 204, 226, 17, 237, 30, 234, 216, - 204, 226, 17, 216, 178, 234, 216, 204, 226, 31, 203, 24, 234, 216, 204, - 226, 31, 236, 252, 234, 216, 204, 226, 31, 200, 240, 234, 216, 204, 226, - 31, 202, 180, 234, 216, 204, 226, 31, 235, 1, 234, 216, 204, 226, 31, - 235, 149, 234, 216, 204, 226, 31, 206, 24, 234, 216, 204, 226, 31, 207, - 69, 234, 216, 204, 226, 31, 237, 28, 234, 216, 204, 226, 31, 216, 176, - 234, 216, 204, 226, 31, 200, 235, 234, 216, 204, 226, 119, 8, 4, 1, 63, - 119, 8, 4, 1, 250, 111, 119, 8, 4, 1, 247, 206, 119, 8, 4, 1, 240, 230, - 119, 8, 4, 1, 69, 119, 8, 4, 1, 236, 48, 119, 8, 4, 1, 234, 189, 119, 8, - 4, 1, 233, 14, 119, 8, 4, 1, 68, 119, 8, 4, 1, 225, 216, 119, 8, 4, 1, - 225, 79, 119, 8, 4, 1, 159, 119, 8, 4, 1, 221, 135, 119, 8, 4, 1, 218, - 54, 119, 8, 4, 1, 72, 119, 8, 4, 1, 214, 2, 119, 8, 4, 1, 211, 166, 119, + 203, 23, 119, 31, 236, 252, 119, 31, 200, 239, 119, 31, 202, 179, 119, + 31, 235, 1, 119, 31, 235, 149, 119, 31, 206, 23, 119, 31, 207, 68, 119, + 31, 237, 28, 119, 31, 216, 176, 119, 31, 200, 234, 17, 97, 234, 217, 204, + 226, 17, 99, 234, 217, 204, 226, 17, 115, 234, 217, 204, 226, 17, 235, 7, + 234, 217, 204, 226, 17, 235, 101, 234, 217, 204, 226, 17, 206, 29, 234, + 217, 204, 226, 17, 207, 71, 234, 217, 204, 226, 17, 237, 31, 234, 217, + 204, 226, 17, 216, 179, 234, 217, 204, 226, 31, 203, 24, 234, 217, 204, + 226, 31, 236, 253, 234, 217, 204, 226, 31, 200, 240, 234, 217, 204, 226, + 31, 202, 180, 234, 217, 204, 226, 31, 235, 2, 234, 217, 204, 226, 31, + 235, 150, 234, 217, 204, 226, 31, 206, 24, 234, 217, 204, 226, 31, 207, + 69, 234, 217, 204, 226, 31, 237, 29, 234, 217, 204, 226, 31, 216, 177, + 234, 217, 204, 226, 31, 200, 235, 234, 217, 204, 226, 119, 8, 4, 1, 63, + 119, 8, 4, 1, 250, 112, 119, 8, 4, 1, 247, 207, 119, 8, 4, 1, 240, 231, + 119, 8, 4, 1, 69, 119, 8, 4, 1, 236, 49, 119, 8, 4, 1, 234, 190, 119, 8, + 4, 1, 233, 15, 119, 8, 4, 1, 68, 119, 8, 4, 1, 225, 217, 119, 8, 4, 1, + 225, 80, 119, 8, 4, 1, 159, 119, 8, 4, 1, 221, 136, 119, 8, 4, 1, 218, + 55, 119, 8, 4, 1, 72, 119, 8, 4, 1, 214, 3, 119, 8, 4, 1, 211, 167, 119, 8, 4, 1, 144, 119, 8, 4, 1, 209, 80, 119, 8, 4, 1, 203, 216, 119, 8, 4, 1, 66, 119, 8, 4, 1, 199, 230, 119, 8, 4, 1, 197, 199, 119, 8, 4, 1, 196, 222, 119, 8, 4, 1, 196, 148, 119, 8, 4, 1, 195, 158, 46, 8, 6, 1, 63, 46, - 8, 6, 1, 250, 111, 46, 8, 6, 1, 247, 206, 46, 8, 6, 1, 240, 230, 46, 8, - 6, 1, 69, 46, 8, 6, 1, 236, 48, 46, 8, 6, 1, 234, 189, 46, 8, 6, 1, 233, - 14, 46, 8, 6, 1, 68, 46, 8, 6, 1, 225, 216, 46, 8, 6, 1, 225, 79, 46, 8, - 6, 1, 159, 46, 8, 6, 1, 221, 135, 46, 8, 6, 1, 218, 54, 46, 8, 6, 1, 72, - 46, 8, 6, 1, 214, 2, 46, 8, 6, 1, 211, 166, 46, 8, 6, 1, 144, 46, 8, 6, + 8, 6, 1, 250, 112, 46, 8, 6, 1, 247, 207, 46, 8, 6, 1, 240, 231, 46, 8, + 6, 1, 69, 46, 8, 6, 1, 236, 49, 46, 8, 6, 1, 234, 190, 46, 8, 6, 1, 233, + 15, 46, 8, 6, 1, 68, 46, 8, 6, 1, 225, 217, 46, 8, 6, 1, 225, 80, 46, 8, + 6, 1, 159, 46, 8, 6, 1, 221, 136, 46, 8, 6, 1, 218, 55, 46, 8, 6, 1, 72, + 46, 8, 6, 1, 214, 3, 46, 8, 6, 1, 211, 167, 46, 8, 6, 1, 144, 46, 8, 6, 1, 209, 80, 46, 8, 6, 1, 203, 216, 46, 8, 6, 1, 66, 46, 8, 6, 1, 199, 230, 46, 8, 6, 1, 197, 199, 46, 8, 6, 1, 196, 222, 46, 8, 6, 1, 196, 148, - 46, 8, 6, 1, 195, 158, 46, 8, 4, 1, 63, 46, 8, 4, 1, 250, 111, 46, 8, 4, - 1, 247, 206, 46, 8, 4, 1, 240, 230, 46, 8, 4, 1, 69, 46, 8, 4, 1, 236, - 48, 46, 8, 4, 1, 234, 189, 46, 8, 4, 1, 233, 14, 46, 8, 4, 1, 68, 46, 8, - 4, 1, 225, 216, 46, 8, 4, 1, 225, 79, 46, 8, 4, 1, 159, 46, 8, 4, 1, 221, - 135, 46, 8, 4, 1, 218, 54, 46, 8, 4, 1, 72, 46, 8, 4, 1, 214, 2, 46, 8, - 4, 1, 211, 166, 46, 8, 4, 1, 144, 46, 8, 4, 1, 209, 80, 46, 8, 4, 1, 203, + 46, 8, 6, 1, 195, 158, 46, 8, 4, 1, 63, 46, 8, 4, 1, 250, 112, 46, 8, 4, + 1, 247, 207, 46, 8, 4, 1, 240, 231, 46, 8, 4, 1, 69, 46, 8, 4, 1, 236, + 49, 46, 8, 4, 1, 234, 190, 46, 8, 4, 1, 233, 15, 46, 8, 4, 1, 68, 46, 8, + 4, 1, 225, 217, 46, 8, 4, 1, 225, 80, 46, 8, 4, 1, 159, 46, 8, 4, 1, 221, + 136, 46, 8, 4, 1, 218, 55, 46, 8, 4, 1, 72, 46, 8, 4, 1, 214, 3, 46, 8, + 4, 1, 211, 167, 46, 8, 4, 1, 144, 46, 8, 4, 1, 209, 80, 46, 8, 4, 1, 203, 216, 46, 8, 4, 1, 66, 46, 8, 4, 1, 199, 230, 46, 8, 4, 1, 197, 199, 46, 8, 4, 1, 196, 222, 46, 8, 4, 1, 196, 148, 46, 8, 4, 1, 195, 158, 46, 17, - 195, 79, 217, 103, 46, 31, 236, 251, 217, 103, 46, 31, 200, 239, 217, - 103, 46, 31, 202, 179, 217, 103, 46, 31, 235, 0, 217, 103, 46, 31, 235, - 148, 217, 103, 46, 31, 206, 23, 217, 103, 46, 31, 207, 68, 217, 103, 46, - 31, 237, 27, 217, 103, 46, 31, 216, 175, 217, 103, 46, 31, 200, 234, 52, + 195, 79, 217, 104, 46, 31, 236, 252, 217, 104, 46, 31, 200, 239, 217, + 104, 46, 31, 202, 179, 217, 104, 46, 31, 235, 1, 217, 104, 46, 31, 235, + 149, 217, 104, 46, 31, 206, 23, 217, 104, 46, 31, 207, 68, 217, 104, 46, + 31, 237, 28, 217, 104, 46, 31, 216, 176, 217, 104, 46, 31, 200, 234, 52, 46, 17, 100, 52, 46, 17, 102, 52, 46, 17, 134, 52, 46, 17, 136, 52, 46, 17, 146, 52, 46, 17, 167, 52, 46, 17, 178, 52, 46, 17, 171, 52, 46, 17, - 182, 52, 46, 31, 203, 23, 217, 103, 46, 17, 195, 79, 111, 129, 175, 231, - 153, 111, 129, 85, 231, 153, 111, 129, 175, 199, 100, 111, 129, 85, 199, - 100, 111, 129, 175, 201, 165, 240, 65, 231, 153, 111, 129, 85, 201, 165, - 240, 65, 231, 153, 111, 129, 175, 201, 165, 240, 65, 199, 100, 111, 129, - 85, 201, 165, 240, 65, 199, 100, 111, 129, 175, 211, 89, 240, 65, 231, - 153, 111, 129, 85, 211, 89, 240, 65, 231, 153, 111, 129, 175, 211, 89, - 240, 65, 199, 100, 111, 129, 85, 211, 89, 240, 65, 199, 100, 111, 129, - 175, 135, 26, 210, 22, 111, 129, 135, 175, 26, 53, 232, 119, 111, 129, - 135, 85, 26, 53, 222, 94, 111, 129, 85, 135, 26, 210, 22, 111, 129, 175, - 135, 26, 222, 183, 111, 129, 135, 175, 26, 50, 232, 119, 111, 129, 135, - 85, 26, 50, 222, 94, 111, 129, 85, 135, 26, 222, 183, 111, 129, 175, 124, - 26, 210, 22, 111, 129, 124, 175, 26, 53, 232, 119, 111, 129, 124, 85, 26, - 53, 222, 94, 111, 129, 85, 124, 26, 210, 22, 111, 129, 175, 124, 26, 222, - 183, 111, 129, 124, 175, 26, 50, 232, 119, 111, 129, 124, 85, 26, 50, - 222, 94, 111, 129, 85, 124, 26, 222, 183, 111, 129, 175, 83, 26, 210, 22, - 111, 129, 83, 175, 26, 53, 232, 119, 111, 129, 124, 85, 26, 53, 135, 222, - 94, 111, 129, 135, 85, 26, 53, 124, 222, 94, 111, 129, 83, 85, 26, 53, - 222, 94, 111, 129, 135, 175, 26, 53, 124, 232, 119, 111, 129, 124, 175, - 26, 53, 135, 232, 119, 111, 129, 85, 83, 26, 210, 22, 111, 129, 175, 83, - 26, 222, 183, 111, 129, 83, 175, 26, 50, 232, 119, 111, 129, 124, 85, 26, - 50, 135, 222, 94, 111, 129, 135, 85, 26, 50, 124, 222, 94, 111, 129, 83, - 85, 26, 50, 222, 94, 111, 129, 135, 175, 26, 50, 124, 232, 119, 111, 129, - 124, 175, 26, 50, 135, 232, 119, 111, 129, 85, 83, 26, 222, 183, 111, - 129, 175, 135, 26, 231, 153, 111, 129, 50, 85, 26, 53, 135, 222, 94, 111, - 129, 53, 85, 26, 50, 135, 222, 94, 111, 129, 135, 175, 26, 231, 154, 232, - 119, 111, 129, 135, 85, 26, 231, 154, 222, 94, 111, 129, 53, 175, 26, 50, - 135, 232, 119, 111, 129, 50, 175, 26, 53, 135, 232, 119, 111, 129, 85, - 135, 26, 231, 153, 111, 129, 175, 124, 26, 231, 153, 111, 129, 50, 85, - 26, 53, 124, 222, 94, 111, 129, 53, 85, 26, 50, 124, 222, 94, 111, 129, - 124, 175, 26, 231, 154, 232, 119, 111, 129, 124, 85, 26, 231, 154, 222, - 94, 111, 129, 53, 175, 26, 50, 124, 232, 119, 111, 129, 50, 175, 26, 53, - 124, 232, 119, 111, 129, 85, 124, 26, 231, 153, 111, 129, 175, 83, 26, - 231, 153, 111, 129, 50, 85, 26, 53, 83, 222, 94, 111, 129, 53, 85, 26, - 50, 83, 222, 94, 111, 129, 83, 175, 26, 231, 154, 232, 119, 111, 129, - 124, 85, 26, 135, 231, 154, 222, 94, 111, 129, 135, 85, 26, 124, 231, - 154, 222, 94, 111, 129, 83, 85, 26, 231, 154, 222, 94, 111, 129, 50, 124, - 85, 26, 53, 135, 222, 94, 111, 129, 53, 124, 85, 26, 50, 135, 222, 94, - 111, 129, 50, 135, 85, 26, 53, 124, 222, 94, 111, 129, 53, 135, 85, 26, - 50, 124, 222, 94, 111, 129, 135, 175, 26, 124, 231, 154, 232, 119, 111, - 129, 124, 175, 26, 135, 231, 154, 232, 119, 111, 129, 53, 175, 26, 50, - 83, 232, 119, 111, 129, 50, 175, 26, 53, 83, 232, 119, 111, 129, 85, 83, - 26, 231, 153, 111, 129, 175, 52, 240, 65, 231, 153, 111, 129, 85, 52, - 240, 65, 231, 153, 111, 129, 175, 52, 240, 65, 199, 100, 111, 129, 85, - 52, 240, 65, 199, 100, 111, 129, 52, 231, 153, 111, 129, 52, 199, 100, - 111, 129, 135, 206, 62, 26, 53, 237, 244, 111, 129, 135, 52, 26, 53, 206, + 182, 52, 46, 31, 203, 23, 217, 104, 46, 17, 195, 79, 111, 129, 175, 231, + 154, 111, 129, 85, 231, 154, 111, 129, 175, 199, 100, 111, 129, 85, 199, + 100, 111, 129, 175, 201, 165, 240, 66, 231, 154, 111, 129, 85, 201, 165, + 240, 66, 231, 154, 111, 129, 175, 201, 165, 240, 66, 199, 100, 111, 129, + 85, 201, 165, 240, 66, 199, 100, 111, 129, 175, 211, 90, 240, 66, 231, + 154, 111, 129, 85, 211, 90, 240, 66, 231, 154, 111, 129, 175, 211, 90, + 240, 66, 199, 100, 111, 129, 85, 211, 90, 240, 66, 199, 100, 111, 129, + 175, 135, 26, 210, 22, 111, 129, 135, 175, 26, 53, 232, 120, 111, 129, + 135, 85, 26, 53, 222, 95, 111, 129, 85, 135, 26, 210, 22, 111, 129, 175, + 135, 26, 222, 184, 111, 129, 135, 175, 26, 50, 232, 120, 111, 129, 135, + 85, 26, 50, 222, 95, 111, 129, 85, 135, 26, 222, 184, 111, 129, 175, 124, + 26, 210, 22, 111, 129, 124, 175, 26, 53, 232, 120, 111, 129, 124, 85, 26, + 53, 222, 95, 111, 129, 85, 124, 26, 210, 22, 111, 129, 175, 124, 26, 222, + 184, 111, 129, 124, 175, 26, 50, 232, 120, 111, 129, 124, 85, 26, 50, + 222, 95, 111, 129, 85, 124, 26, 222, 184, 111, 129, 175, 83, 26, 210, 22, + 111, 129, 83, 175, 26, 53, 232, 120, 111, 129, 124, 85, 26, 53, 135, 222, + 95, 111, 129, 135, 85, 26, 53, 124, 222, 95, 111, 129, 83, 85, 26, 53, + 222, 95, 111, 129, 135, 175, 26, 53, 124, 232, 120, 111, 129, 124, 175, + 26, 53, 135, 232, 120, 111, 129, 85, 83, 26, 210, 22, 111, 129, 175, 83, + 26, 222, 184, 111, 129, 83, 175, 26, 50, 232, 120, 111, 129, 124, 85, 26, + 50, 135, 222, 95, 111, 129, 135, 85, 26, 50, 124, 222, 95, 111, 129, 83, + 85, 26, 50, 222, 95, 111, 129, 135, 175, 26, 50, 124, 232, 120, 111, 129, + 124, 175, 26, 50, 135, 232, 120, 111, 129, 85, 83, 26, 222, 184, 111, + 129, 175, 135, 26, 231, 154, 111, 129, 50, 85, 26, 53, 135, 222, 95, 111, + 129, 53, 85, 26, 50, 135, 222, 95, 111, 129, 135, 175, 26, 231, 155, 232, + 120, 111, 129, 135, 85, 26, 231, 155, 222, 95, 111, 129, 53, 175, 26, 50, + 135, 232, 120, 111, 129, 50, 175, 26, 53, 135, 232, 120, 111, 129, 85, + 135, 26, 231, 154, 111, 129, 175, 124, 26, 231, 154, 111, 129, 50, 85, + 26, 53, 124, 222, 95, 111, 129, 53, 85, 26, 50, 124, 222, 95, 111, 129, + 124, 175, 26, 231, 155, 232, 120, 111, 129, 124, 85, 26, 231, 155, 222, + 95, 111, 129, 53, 175, 26, 50, 124, 232, 120, 111, 129, 50, 175, 26, 53, + 124, 232, 120, 111, 129, 85, 124, 26, 231, 154, 111, 129, 175, 83, 26, + 231, 154, 111, 129, 50, 85, 26, 53, 83, 222, 95, 111, 129, 53, 85, 26, + 50, 83, 222, 95, 111, 129, 83, 175, 26, 231, 155, 232, 120, 111, 129, + 124, 85, 26, 135, 231, 155, 222, 95, 111, 129, 135, 85, 26, 124, 231, + 155, 222, 95, 111, 129, 83, 85, 26, 231, 155, 222, 95, 111, 129, 50, 124, + 85, 26, 53, 135, 222, 95, 111, 129, 53, 124, 85, 26, 50, 135, 222, 95, + 111, 129, 50, 135, 85, 26, 53, 124, 222, 95, 111, 129, 53, 135, 85, 26, + 50, 124, 222, 95, 111, 129, 135, 175, 26, 124, 231, 155, 232, 120, 111, + 129, 124, 175, 26, 135, 231, 155, 232, 120, 111, 129, 53, 175, 26, 50, + 83, 232, 120, 111, 129, 50, 175, 26, 53, 83, 232, 120, 111, 129, 85, 83, + 26, 231, 154, 111, 129, 175, 52, 240, 66, 231, 154, 111, 129, 85, 52, + 240, 66, 231, 154, 111, 129, 175, 52, 240, 66, 199, 100, 111, 129, 85, + 52, 240, 66, 199, 100, 111, 129, 52, 231, 154, 111, 129, 52, 199, 100, + 111, 129, 135, 206, 62, 26, 53, 237, 245, 111, 129, 135, 52, 26, 53, 206, 61, 111, 129, 52, 135, 26, 210, 22, 111, 129, 135, 206, 62, 26, 50, 237, - 244, 111, 129, 135, 52, 26, 50, 206, 61, 111, 129, 52, 135, 26, 222, 183, - 111, 129, 124, 206, 62, 26, 53, 237, 244, 111, 129, 124, 52, 26, 53, 206, + 245, 111, 129, 135, 52, 26, 50, 206, 61, 111, 129, 52, 135, 26, 222, 184, + 111, 129, 124, 206, 62, 26, 53, 237, 245, 111, 129, 124, 52, 26, 53, 206, 61, 111, 129, 52, 124, 26, 210, 22, 111, 129, 124, 206, 62, 26, 50, 237, - 244, 111, 129, 124, 52, 26, 50, 206, 61, 111, 129, 52, 124, 26, 222, 183, - 111, 129, 83, 206, 62, 26, 53, 237, 244, 111, 129, 83, 52, 26, 53, 206, + 245, 111, 129, 124, 52, 26, 50, 206, 61, 111, 129, 52, 124, 26, 222, 184, + 111, 129, 83, 206, 62, 26, 53, 237, 245, 111, 129, 83, 52, 26, 53, 206, 61, 111, 129, 52, 83, 26, 210, 22, 111, 129, 83, 206, 62, 26, 50, 237, - 244, 111, 129, 83, 52, 26, 50, 206, 61, 111, 129, 52, 83, 26, 222, 183, - 111, 129, 135, 206, 62, 26, 231, 154, 237, 244, 111, 129, 135, 52, 26, - 231, 154, 206, 61, 111, 129, 52, 135, 26, 231, 153, 111, 129, 124, 206, - 62, 26, 231, 154, 237, 244, 111, 129, 124, 52, 26, 231, 154, 206, 61, - 111, 129, 52, 124, 26, 231, 153, 111, 129, 83, 206, 62, 26, 231, 154, - 237, 244, 111, 129, 83, 52, 26, 231, 154, 206, 61, 111, 129, 52, 83, 26, - 231, 153, 111, 129, 175, 250, 253, 135, 26, 210, 22, 111, 129, 175, 250, - 253, 135, 26, 222, 183, 111, 129, 175, 250, 253, 124, 26, 222, 183, 111, - 129, 175, 250, 253, 124, 26, 210, 22, 111, 129, 175, 239, 146, 200, 33, - 53, 202, 30, 221, 202, 222, 183, 111, 129, 175, 239, 146, 200, 33, 50, - 202, 30, 221, 202, 210, 22, 111, 129, 175, 239, 146, 241, 60, 111, 129, - 175, 222, 183, 111, 129, 175, 200, 36, 111, 129, 175, 210, 22, 111, 129, - 175, 237, 234, 111, 129, 85, 222, 183, 111, 129, 85, 200, 36, 111, 129, - 85, 210, 22, 111, 129, 85, 237, 234, 111, 129, 175, 50, 26, 85, 210, 22, - 111, 129, 175, 124, 26, 85, 237, 234, 111, 129, 85, 50, 26, 175, 210, 22, - 111, 129, 85, 124, 26, 175, 237, 234, 200, 33, 157, 248, 125, 221, 202, - 97, 237, 26, 248, 125, 221, 202, 97, 211, 87, 248, 125, 221, 202, 115, - 237, 24, 248, 125, 221, 202, 157, 248, 125, 221, 202, 235, 100, 237, 24, - 248, 125, 221, 202, 115, 211, 85, 248, 125, 221, 202, 207, 71, 237, 24, - 248, 125, 234, 216, 248, 125, 50, 207, 71, 237, 24, 248, 125, 50, 115, - 211, 85, 248, 125, 50, 235, 100, 237, 24, 248, 125, 50, 157, 248, 125, - 50, 115, 237, 24, 248, 125, 50, 97, 211, 87, 248, 125, 50, 97, 237, 26, - 248, 125, 53, 157, 248, 125, 175, 207, 39, 219, 189, 207, 39, 240, 70, - 207, 39, 200, 33, 97, 237, 26, 248, 125, 53, 97, 237, 26, 248, 125, 211, - 91, 221, 202, 222, 183, 211, 91, 221, 202, 210, 22, 211, 91, 200, 33, - 222, 183, 211, 91, 200, 33, 50, 26, 221, 202, 50, 26, 221, 202, 210, 22, - 211, 91, 200, 33, 50, 26, 221, 202, 210, 22, 211, 91, 200, 33, 50, 26, - 200, 33, 53, 26, 221, 202, 222, 183, 211, 91, 200, 33, 50, 26, 200, 33, - 53, 26, 221, 202, 210, 22, 211, 91, 200, 33, 210, 22, 211, 91, 200, 33, - 53, 26, 221, 202, 222, 183, 211, 91, 200, 33, 53, 26, 221, 202, 50, 26, - 221, 202, 210, 22, 58, 205, 94, 59, 205, 94, 59, 47, 3, 209, 185, 241, - 99, 59, 47, 241, 131, 58, 4, 205, 94, 47, 3, 231, 154, 235, 135, 47, 3, - 83, 235, 135, 47, 3, 214, 54, 241, 55, 235, 135, 47, 3, 200, 33, 50, 202, - 30, 221, 202, 53, 235, 135, 47, 3, 200, 33, 53, 202, 30, 221, 202, 50, - 235, 135, 47, 3, 239, 146, 241, 55, 235, 135, 58, 4, 205, 94, 59, 4, 205, - 94, 58, 210, 162, 59, 210, 162, 58, 83, 210, 162, 59, 83, 210, 162, 58, - 213, 143, 59, 213, 143, 58, 200, 35, 201, 180, 59, 200, 35, 201, 180, 58, + 245, 111, 129, 83, 52, 26, 50, 206, 61, 111, 129, 52, 83, 26, 222, 184, + 111, 129, 135, 206, 62, 26, 231, 155, 237, 245, 111, 129, 135, 52, 26, + 231, 155, 206, 61, 111, 129, 52, 135, 26, 231, 154, 111, 129, 124, 206, + 62, 26, 231, 155, 237, 245, 111, 129, 124, 52, 26, 231, 155, 206, 61, + 111, 129, 52, 124, 26, 231, 154, 111, 129, 83, 206, 62, 26, 231, 155, + 237, 245, 111, 129, 83, 52, 26, 231, 155, 206, 61, 111, 129, 52, 83, 26, + 231, 154, 111, 129, 175, 250, 254, 135, 26, 210, 22, 111, 129, 175, 250, + 254, 135, 26, 222, 184, 111, 129, 175, 250, 254, 124, 26, 222, 184, 111, + 129, 175, 250, 254, 124, 26, 210, 22, 111, 129, 175, 239, 147, 200, 33, + 53, 202, 30, 221, 203, 222, 184, 111, 129, 175, 239, 147, 200, 33, 50, + 202, 30, 221, 203, 210, 22, 111, 129, 175, 239, 147, 241, 61, 111, 129, + 175, 222, 184, 111, 129, 175, 200, 36, 111, 129, 175, 210, 22, 111, 129, + 175, 237, 235, 111, 129, 85, 222, 184, 111, 129, 85, 200, 36, 111, 129, + 85, 210, 22, 111, 129, 85, 237, 235, 111, 129, 175, 50, 26, 85, 210, 22, + 111, 129, 175, 124, 26, 85, 237, 235, 111, 129, 85, 50, 26, 175, 210, 22, + 111, 129, 85, 124, 26, 175, 237, 235, 200, 33, 157, 248, 126, 221, 203, + 97, 237, 27, 248, 126, 221, 203, 97, 211, 88, 248, 126, 221, 203, 115, + 237, 25, 248, 126, 221, 203, 157, 248, 126, 221, 203, 235, 101, 237, 25, + 248, 126, 221, 203, 115, 211, 86, 248, 126, 221, 203, 207, 71, 237, 25, + 248, 126, 234, 217, 248, 126, 50, 207, 71, 237, 25, 248, 126, 50, 115, + 211, 86, 248, 126, 50, 235, 101, 237, 25, 248, 126, 50, 157, 248, 126, + 50, 115, 237, 25, 248, 126, 50, 97, 211, 88, 248, 126, 50, 97, 237, 27, + 248, 126, 53, 157, 248, 126, 175, 207, 39, 219, 190, 207, 39, 240, 71, + 207, 39, 200, 33, 97, 237, 27, 248, 126, 53, 97, 237, 27, 248, 126, 211, + 92, 221, 203, 222, 184, 211, 92, 221, 203, 210, 22, 211, 92, 200, 33, + 222, 184, 211, 92, 200, 33, 50, 26, 221, 203, 50, 26, 221, 203, 210, 22, + 211, 92, 200, 33, 50, 26, 221, 203, 210, 22, 211, 92, 200, 33, 50, 26, + 200, 33, 53, 26, 221, 203, 222, 184, 211, 92, 200, 33, 50, 26, 200, 33, + 53, 26, 221, 203, 210, 22, 211, 92, 200, 33, 210, 22, 211, 92, 200, 33, + 53, 26, 221, 203, 222, 184, 211, 92, 200, 33, 53, 26, 221, 203, 50, 26, + 221, 203, 210, 22, 58, 205, 94, 59, 205, 94, 59, 47, 3, 209, 185, 241, + 100, 59, 47, 241, 132, 58, 4, 205, 94, 47, 3, 231, 155, 235, 136, 47, 3, + 83, 235, 136, 47, 3, 214, 55, 241, 56, 235, 136, 47, 3, 200, 33, 50, 202, + 30, 221, 203, 53, 235, 136, 47, 3, 200, 33, 53, 202, 30, 221, 203, 50, + 235, 136, 47, 3, 239, 147, 241, 56, 235, 136, 58, 4, 205, 94, 59, 4, 205, + 94, 58, 210, 163, 59, 210, 163, 58, 83, 210, 163, 59, 83, 210, 163, 58, + 213, 144, 59, 213, 144, 58, 200, 35, 201, 180, 59, 200, 35, 201, 180, 58, 200, 35, 4, 201, 180, 59, 200, 35, 4, 201, 180, 58, 210, 17, 201, 180, 59, 210, 17, 201, 180, 58, 210, 17, 4, 201, 180, 59, 210, 17, 4, 201, - 180, 58, 210, 17, 212, 107, 59, 210, 17, 212, 107, 58, 237, 233, 201, - 180, 59, 237, 233, 201, 180, 58, 237, 233, 4, 201, 180, 59, 237, 233, 4, - 201, 180, 58, 222, 178, 201, 180, 59, 222, 178, 201, 180, 58, 222, 178, - 4, 201, 180, 59, 222, 178, 4, 201, 180, 58, 222, 178, 212, 107, 59, 222, - 178, 212, 107, 58, 239, 139, 59, 239, 139, 59, 239, 140, 241, 131, 58, 4, - 239, 139, 235, 109, 221, 197, 59, 244, 248, 237, 249, 244, 248, 244, 249, - 3, 83, 235, 135, 248, 0, 58, 244, 248, 244, 249, 3, 50, 157, 248, 135, - 244, 249, 3, 53, 157, 248, 135, 244, 249, 3, 221, 202, 157, 248, 135, - 244, 249, 3, 200, 33, 157, 248, 135, 244, 249, 3, 200, 33, 53, 211, 91, - 248, 135, 244, 249, 3, 251, 146, 247, 231, 200, 33, 50, 211, 91, 248, - 135, 50, 157, 58, 244, 248, 53, 157, 58, 244, 248, 226, 18, 248, 4, 226, - 18, 59, 244, 248, 200, 33, 157, 226, 18, 59, 244, 248, 221, 202, 157, - 226, 18, 59, 244, 248, 200, 33, 50, 211, 91, 244, 242, 250, 252, 200, 33, - 53, 211, 91, 244, 242, 250, 252, 221, 202, 53, 211, 91, 244, 242, 250, - 252, 221, 202, 50, 211, 91, 244, 242, 250, 252, 200, 33, 157, 244, 248, - 221, 202, 157, 244, 248, 58, 221, 202, 53, 201, 180, 58, 221, 202, 50, + 180, 58, 210, 17, 212, 108, 59, 210, 17, 212, 108, 58, 237, 234, 201, + 180, 59, 237, 234, 201, 180, 58, 237, 234, 4, 201, 180, 59, 237, 234, 4, + 201, 180, 58, 222, 179, 201, 180, 59, 222, 179, 201, 180, 58, 222, 179, + 4, 201, 180, 59, 222, 179, 4, 201, 180, 58, 222, 179, 212, 108, 59, 222, + 179, 212, 108, 58, 239, 140, 59, 239, 140, 59, 239, 141, 241, 132, 58, 4, + 239, 140, 235, 110, 221, 198, 59, 244, 249, 237, 250, 244, 249, 244, 250, + 3, 83, 235, 136, 248, 1, 58, 244, 249, 244, 250, 3, 50, 157, 248, 136, + 244, 250, 3, 53, 157, 248, 136, 244, 250, 3, 221, 203, 157, 248, 136, + 244, 250, 3, 200, 33, 157, 248, 136, 244, 250, 3, 200, 33, 53, 211, 92, + 248, 136, 244, 250, 3, 251, 147, 247, 232, 200, 33, 50, 211, 92, 248, + 136, 50, 157, 58, 244, 249, 53, 157, 58, 244, 249, 226, 19, 248, 5, 226, + 19, 59, 244, 249, 200, 33, 157, 226, 19, 59, 244, 249, 221, 203, 157, + 226, 19, 59, 244, 249, 200, 33, 50, 211, 92, 244, 243, 250, 253, 200, 33, + 53, 211, 92, 244, 243, 250, 253, 221, 203, 53, 211, 92, 244, 243, 250, + 253, 221, 203, 50, 211, 92, 244, 243, 250, 253, 200, 33, 157, 244, 249, + 221, 203, 157, 244, 249, 58, 221, 203, 53, 201, 180, 58, 221, 203, 50, 201, 180, 58, 200, 33, 50, 201, 180, 58, 200, 33, 53, 201, 180, 59, 248, - 4, 47, 3, 50, 157, 248, 135, 47, 3, 53, 157, 248, 135, 47, 3, 200, 33, - 50, 239, 146, 157, 248, 135, 47, 3, 221, 202, 53, 239, 146, 157, 248, - 135, 59, 47, 3, 83, 248, 149, 222, 74, 59, 200, 35, 201, 181, 3, 238, - 252, 200, 35, 201, 181, 3, 50, 157, 248, 135, 200, 35, 201, 181, 3, 53, - 157, 248, 135, 222, 227, 244, 248, 59, 47, 3, 200, 33, 50, 211, 90, 59, - 47, 3, 221, 202, 50, 211, 90, 59, 47, 3, 221, 202, 53, 211, 90, 59, 47, - 3, 200, 33, 53, 211, 90, 59, 244, 249, 3, 200, 33, 50, 211, 90, 59, 244, - 249, 3, 221, 202, 50, 211, 90, 59, 244, 249, 3, 221, 202, 53, 211, 90, - 59, 244, 249, 3, 200, 33, 53, 211, 90, 200, 33, 50, 201, 180, 200, 33, - 53, 201, 180, 221, 202, 50, 201, 180, 59, 219, 189, 205, 94, 58, 219, - 189, 205, 94, 59, 219, 189, 4, 205, 94, 58, 219, 189, 4, 205, 94, 221, - 202, 53, 201, 180, 58, 204, 112, 3, 210, 187, 244, 193, 200, 76, 205, - 202, 244, 161, 58, 205, 7, 59, 205, 7, 222, 91, 202, 137, 204, 111, 250, - 197, 216, 41, 239, 193, 216, 41, 241, 140, 214, 77, 58, 203, 33, 59, 203, - 33, 249, 98, 248, 69, 249, 98, 111, 3, 245, 100, 249, 98, 111, 3, 196, - 222, 208, 230, 200, 77, 3, 210, 217, 237, 207, 231, 95, 248, 200, 59, - 206, 191, 212, 211, 58, 206, 191, 212, 211, 207, 26, 210, 89, 209, 194, - 235, 65, 232, 126, 248, 4, 58, 50, 212, 106, 226, 71, 58, 53, 212, 106, - 226, 71, 59, 50, 212, 106, 226, 71, 59, 124, 212, 106, 226, 71, 59, 53, - 212, 106, 226, 71, 59, 135, 212, 106, 226, 71, 205, 255, 26, 241, 59, - 247, 85, 55, 210, 229, 55, 248, 157, 55, 247, 164, 251, 78, 214, 55, 241, - 60, 245, 75, 210, 74, 241, 61, 77, 221, 219, 241, 61, 77, 225, 181, 205, - 8, 26, 241, 70, 235, 203, 105, 251, 253, 207, 29, 232, 216, 26, 206, 103, - 213, 90, 105, 196, 13, 196, 95, 201, 170, 36, 232, 121, 201, 170, 36, - 223, 0, 201, 170, 36, 235, 117, 201, 170, 36, 202, 138, 201, 170, 36, - 197, 50, 201, 170, 36, 197, 127, 201, 170, 36, 218, 168, 201, 170, 36, - 237, 71, 197, 78, 77, 239, 167, 59, 234, 228, 235, 232, 59, 205, 218, - 235, 232, 58, 205, 218, 235, 232, 59, 204, 112, 3, 210, 187, 235, 112, - 211, 87, 218, 188, 222, 220, 211, 87, 218, 188, 219, 157, 235, 171, 55, - 237, 71, 220, 66, 55, 225, 94, 208, 192, 200, 16, 217, 93, 212, 120, 250, - 238, 203, 87, 234, 34, 247, 137, 222, 145, 199, 5, 222, 105, 208, 157, - 208, 255, 247, 119, 251, 14, 212, 159, 59, 245, 82, 224, 72, 59, 245, 82, - 211, 79, 59, 245, 82, 209, 203, 59, 245, 82, 248, 147, 59, 245, 82, 224, - 18, 59, 245, 82, 213, 102, 58, 245, 82, 224, 72, 58, 245, 82, 211, 79, - 58, 245, 82, 209, 203, 58, 245, 82, 248, 147, 58, 245, 82, 224, 18, 58, - 245, 82, 213, 102, 58, 205, 146, 204, 124, 59, 232, 126, 204, 124, 59, - 239, 140, 204, 124, 58, 244, 190, 204, 124, 59, 205, 146, 204, 124, 58, - 232, 126, 204, 124, 58, 239, 140, 204, 124, 59, 244, 190, 204, 124, 231, - 95, 205, 99, 211, 87, 216, 12, 237, 26, 216, 12, 249, 4, 237, 26, 216, 7, - 249, 4, 206, 22, 216, 7, 218, 88, 235, 82, 55, 218, 88, 217, 202, 55, - 218, 88, 207, 13, 55, 197, 89, 203, 236, 241, 60, 237, 68, 203, 236, 241, - 60, 200, 46, 210, 158, 105, 210, 158, 16, 36, 200, 200, 212, 139, 210, - 158, 16, 36, 200, 198, 212, 139, 210, 158, 16, 36, 200, 197, 212, 139, - 210, 158, 16, 36, 200, 195, 212, 139, 210, 158, 16, 36, 200, 193, 212, - 139, 210, 158, 16, 36, 200, 191, 212, 139, 210, 158, 16, 36, 200, 189, - 212, 139, 210, 158, 16, 36, 234, 31, 220, 1, 58, 200, 46, 210, 158, 105, - 210, 159, 213, 161, 105, 213, 130, 213, 161, 105, 213, 36, 213, 161, 55, - 197, 76, 105, 239, 132, 235, 231, 239, 132, 235, 230, 239, 132, 235, 229, - 239, 132, 235, 228, 239, 132, 235, 227, 239, 132, 235, 226, 59, 244, 249, - 3, 76, 210, 22, 59, 244, 249, 3, 99, 238, 249, 58, 244, 249, 3, 59, 76, - 210, 22, 58, 244, 249, 3, 99, 59, 238, 249, 218, 204, 36, 196, 95, 218, - 204, 36, 196, 12, 239, 113, 36, 233, 94, 196, 95, 239, 113, 36, 222, 137, - 196, 12, 239, 113, 36, 222, 137, 196, 95, 239, 113, 36, 233, 94, 196, 12, - 59, 235, 92, 58, 235, 92, 232, 216, 26, 212, 215, 251, 101, 241, 58, 204, - 47, 205, 17, 77, 251, 227, 208, 175, 251, 162, 235, 61, 234, 44, 205, 17, - 77, 232, 93, 250, 157, 105, 235, 77, 214, 29, 59, 205, 7, 115, 222, 69, - 241, 117, 210, 22, 115, 222, 69, 241, 117, 222, 183, 197, 138, 55, 130, - 198, 237, 55, 237, 239, 235, 171, 55, 237, 239, 220, 66, 55, 226, 28, - 235, 171, 26, 220, 66, 55, 220, 66, 26, 235, 171, 55, 220, 66, 3, 204, - 196, 55, 220, 66, 3, 204, 196, 26, 220, 66, 26, 235, 171, 55, 83, 220, - 66, 3, 204, 196, 55, 231, 154, 220, 66, 3, 204, 196, 55, 219, 189, 59, - 244, 248, 219, 189, 58, 244, 248, 219, 189, 4, 59, 244, 248, 220, 20, - 105, 239, 51, 105, 200, 43, 213, 129, 105, 244, 172, 234, 211, 200, 12, - 217, 85, 247, 21, 213, 208, 225, 100, 199, 45, 245, 55, 58, 218, 189, - 222, 88, 207, 61, 207, 102, 211, 69, 207, 79, 205, 190, 249, 102, 249, - 64, 103, 224, 152, 59, 237, 219, 220, 61, 59, 237, 219, 224, 72, 58, 237, - 219, 220, 61, 58, 237, 219, 224, 72, 205, 203, 197, 37, 205, 206, 204, - 112, 248, 235, 244, 193, 210, 216, 58, 205, 202, 202, 139, 244, 194, 26, - 210, 216, 163, 59, 206, 191, 212, 211, 163, 58, 206, 191, 212, 211, 59, - 239, 140, 226, 86, 205, 94, 241, 54, 222, 234, 239, 80, 247, 115, 214, - 80, 212, 215, 247, 116, 205, 237, 232, 103, 3, 59, 241, 60, 46, 241, 54, - 222, 234, 247, 11, 216, 50, 236, 198, 251, 130, 214, 110, 50, 197, 113, + 5, 47, 3, 50, 157, 248, 136, 47, 3, 53, 157, 248, 136, 47, 3, 200, 33, + 50, 239, 147, 157, 248, 136, 47, 3, 221, 203, 53, 239, 147, 157, 248, + 136, 59, 47, 3, 83, 248, 150, 222, 75, 59, 200, 35, 201, 181, 3, 238, + 253, 200, 35, 201, 181, 3, 50, 157, 248, 136, 200, 35, 201, 181, 3, 53, + 157, 248, 136, 222, 228, 244, 249, 59, 47, 3, 200, 33, 50, 211, 91, 59, + 47, 3, 221, 203, 50, 211, 91, 59, 47, 3, 221, 203, 53, 211, 91, 59, 47, + 3, 200, 33, 53, 211, 91, 59, 244, 250, 3, 200, 33, 50, 211, 91, 59, 244, + 250, 3, 221, 203, 50, 211, 91, 59, 244, 250, 3, 221, 203, 53, 211, 91, + 59, 244, 250, 3, 200, 33, 53, 211, 91, 200, 33, 50, 201, 180, 200, 33, + 53, 201, 180, 221, 203, 50, 201, 180, 59, 219, 190, 205, 94, 58, 219, + 190, 205, 94, 59, 219, 190, 4, 205, 94, 58, 219, 190, 4, 205, 94, 221, + 203, 53, 201, 180, 58, 204, 112, 3, 210, 188, 244, 194, 200, 76, 205, + 202, 244, 162, 58, 205, 7, 59, 205, 7, 222, 92, 202, 137, 204, 111, 250, + 198, 216, 42, 239, 194, 216, 42, 241, 141, 214, 78, 58, 203, 33, 59, 203, + 33, 249, 99, 248, 70, 249, 99, 111, 3, 245, 101, 249, 99, 111, 3, 196, + 222, 208, 230, 200, 77, 3, 210, 218, 237, 208, 231, 96, 248, 201, 59, + 206, 191, 212, 212, 58, 206, 191, 212, 212, 207, 26, 210, 89, 209, 194, + 235, 66, 232, 127, 248, 5, 58, 50, 212, 107, 226, 72, 58, 53, 212, 107, + 226, 72, 59, 50, 212, 107, 226, 72, 59, 124, 212, 107, 226, 72, 59, 53, + 212, 107, 226, 72, 59, 135, 212, 107, 226, 72, 205, 255, 26, 241, 60, + 247, 86, 55, 210, 230, 55, 248, 158, 55, 247, 165, 251, 79, 214, 56, 241, + 61, 245, 76, 210, 74, 241, 62, 77, 221, 220, 241, 62, 77, 225, 182, 205, + 8, 26, 241, 71, 235, 204, 105, 251, 254, 207, 29, 232, 217, 26, 206, 103, + 213, 91, 105, 196, 13, 196, 95, 201, 170, 36, 232, 122, 201, 170, 36, + 223, 1, 201, 170, 36, 235, 118, 201, 170, 36, 202, 138, 201, 170, 36, + 197, 50, 201, 170, 36, 197, 127, 201, 170, 36, 218, 169, 201, 170, 36, + 237, 72, 197, 78, 77, 239, 168, 59, 234, 229, 235, 233, 59, 205, 218, + 235, 233, 58, 205, 218, 235, 233, 59, 204, 112, 3, 210, 188, 235, 113, + 211, 88, 218, 189, 222, 221, 211, 88, 218, 189, 219, 158, 235, 172, 55, + 237, 72, 220, 67, 55, 225, 95, 208, 192, 200, 16, 217, 94, 212, 121, 250, + 239, 203, 87, 234, 35, 247, 138, 222, 146, 199, 5, 222, 106, 208, 157, + 208, 255, 247, 120, 251, 15, 212, 160, 59, 245, 83, 224, 73, 59, 245, 83, + 211, 80, 59, 245, 83, 209, 203, 59, 245, 83, 248, 148, 59, 245, 83, 224, + 19, 59, 245, 83, 213, 103, 58, 245, 83, 224, 73, 58, 245, 83, 211, 80, + 58, 245, 83, 209, 203, 58, 245, 83, 248, 148, 58, 245, 83, 224, 19, 58, + 245, 83, 213, 103, 58, 205, 146, 204, 124, 59, 232, 127, 204, 124, 59, + 239, 141, 204, 124, 58, 244, 191, 204, 124, 59, 205, 146, 204, 124, 58, + 232, 127, 204, 124, 58, 239, 141, 204, 124, 59, 244, 191, 204, 124, 231, + 96, 205, 99, 211, 88, 216, 13, 237, 27, 216, 13, 249, 5, 237, 27, 216, 8, + 249, 5, 206, 22, 216, 8, 218, 89, 235, 83, 55, 218, 89, 217, 203, 55, + 218, 89, 207, 13, 55, 197, 89, 203, 236, 241, 61, 237, 69, 203, 236, 241, + 61, 200, 46, 210, 159, 105, 210, 159, 16, 36, 200, 200, 212, 140, 210, + 159, 16, 36, 200, 198, 212, 140, 210, 159, 16, 36, 200, 197, 212, 140, + 210, 159, 16, 36, 200, 195, 212, 140, 210, 159, 16, 36, 200, 193, 212, + 140, 210, 159, 16, 36, 200, 191, 212, 140, 210, 159, 16, 36, 200, 189, + 212, 140, 210, 159, 16, 36, 234, 32, 220, 2, 58, 200, 46, 210, 159, 105, + 210, 160, 213, 162, 105, 213, 131, 213, 162, 105, 213, 37, 213, 162, 55, + 197, 76, 105, 239, 133, 235, 232, 239, 133, 235, 231, 239, 133, 235, 230, + 239, 133, 235, 229, 239, 133, 235, 228, 239, 133, 235, 227, 59, 244, 250, + 3, 76, 210, 22, 59, 244, 250, 3, 99, 238, 250, 58, 244, 250, 3, 59, 76, + 210, 22, 58, 244, 250, 3, 99, 59, 238, 250, 218, 205, 36, 196, 95, 218, + 205, 36, 196, 12, 239, 114, 36, 233, 95, 196, 95, 239, 114, 36, 222, 138, + 196, 12, 239, 114, 36, 222, 138, 196, 95, 239, 114, 36, 233, 95, 196, 12, + 59, 235, 93, 58, 235, 93, 232, 217, 26, 212, 216, 251, 102, 241, 59, 204, + 47, 205, 17, 77, 251, 228, 208, 175, 251, 163, 235, 62, 234, 45, 205, 17, + 77, 232, 94, 250, 158, 105, 235, 78, 214, 30, 59, 205, 7, 115, 222, 70, + 241, 118, 210, 22, 115, 222, 70, 241, 118, 222, 184, 197, 138, 55, 130, + 198, 237, 55, 237, 240, 235, 172, 55, 237, 240, 220, 67, 55, 226, 29, + 235, 172, 26, 220, 67, 55, 220, 67, 26, 235, 172, 55, 220, 67, 3, 204, + 196, 55, 220, 67, 3, 204, 196, 26, 220, 67, 26, 235, 172, 55, 83, 220, + 67, 3, 204, 196, 55, 231, 155, 220, 67, 3, 204, 196, 55, 219, 190, 59, + 244, 249, 219, 190, 58, 244, 249, 219, 190, 4, 59, 244, 249, 220, 21, + 105, 239, 52, 105, 200, 43, 213, 130, 105, 244, 173, 234, 212, 200, 12, + 217, 86, 247, 22, 213, 209, 225, 101, 199, 45, 245, 56, 58, 218, 190, + 222, 89, 207, 61, 207, 102, 211, 70, 207, 79, 205, 190, 249, 103, 249, + 65, 103, 224, 153, 59, 237, 220, 220, 62, 59, 237, 220, 224, 73, 58, 237, + 220, 220, 62, 58, 237, 220, 224, 73, 205, 203, 197, 37, 205, 206, 204, + 112, 248, 236, 244, 194, 210, 217, 58, 205, 202, 202, 139, 244, 195, 26, + 210, 217, 163, 59, 206, 191, 212, 212, 163, 58, 206, 191, 212, 212, 59, + 239, 141, 226, 87, 205, 94, 241, 55, 222, 235, 239, 81, 247, 116, 214, + 81, 212, 216, 247, 117, 205, 237, 232, 104, 3, 59, 241, 61, 46, 241, 55, + 222, 235, 247, 12, 216, 51, 236, 199, 251, 131, 214, 111, 50, 197, 113, 201, 210, 58, 200, 212, 50, 197, 113, 201, 210, 59, 200, 212, 50, 197, - 113, 201, 210, 58, 50, 222, 235, 219, 156, 59, 50, 222, 235, 219, 156, - 237, 214, 205, 228, 55, 85, 59, 237, 233, 201, 180, 50, 244, 202, 236, - 198, 103, 208, 230, 235, 212, 239, 146, 226, 86, 59, 244, 249, 226, 86, - 58, 205, 94, 58, 201, 144, 210, 100, 50, 236, 197, 210, 100, 50, 236, - 196, 250, 172, 16, 36, 200, 16, 85, 244, 249, 3, 204, 196, 26, 99, 238, - 250, 57, 213, 53, 210, 19, 226, 30, 213, 53, 222, 180, 226, 30, 213, 53, - 226, 16, 213, 53, 58, 241, 61, 214, 119, 206, 220, 206, 208, 206, 156, - 245, 21, 247, 93, 232, 31, 206, 30, 234, 45, 197, 37, 231, 68, 234, 45, - 3, 232, 185, 220, 43, 16, 36, 222, 93, 218, 168, 200, 77, 214, 119, 233, - 84, 235, 7, 235, 93, 226, 86, 231, 174, 235, 161, 208, 250, 47, 235, 6, - 241, 99, 206, 2, 230, 201, 206, 6, 213, 28, 3, 249, 102, 203, 15, 225, - 201, 249, 84, 105, 232, 130, 233, 96, 105, 234, 219, 211, 214, 241, 27, - 214, 119, 58, 205, 94, 59, 235, 93, 3, 231, 154, 112, 58, 204, 197, 58, - 209, 4, 208, 161, 200, 33, 248, 130, 208, 161, 58, 208, 161, 221, 202, - 248, 130, 208, 161, 59, 208, 161, 59, 85, 245, 101, 78, 203, 34, 222, 3, - 55, 203, 104, 237, 213, 251, 186, 236, 193, 210, 214, 235, 105, 210, 214, - 232, 208, 199, 32, 232, 208, 196, 246, 232, 208, 221, 202, 53, 213, 63, - 213, 63, 200, 33, 53, 213, 63, 59, 216, 211, 58, 216, 211, 245, 101, 78, - 85, 245, 101, 78, 218, 117, 196, 222, 85, 218, 117, 196, 222, 249, 98, - 196, 222, 85, 249, 98, 196, 222, 214, 29, 32, 241, 60, 85, 32, 241, 60, - 192, 247, 36, 241, 60, 85, 192, 247, 36, 241, 60, 8, 241, 60, 207, 37, - 59, 8, 241, 60, 214, 29, 8, 241, 60, 220, 63, 241, 60, 205, 8, 77, 240, - 57, 235, 6, 203, 53, 250, 178, 235, 6, 249, 99, 250, 178, 85, 235, 6, - 249, 99, 250, 178, 235, 6, 244, 188, 250, 178, 58, 235, 6, 212, 108, 205, - 7, 59, 235, 6, 212, 108, 205, 7, 205, 141, 204, 206, 214, 29, 59, 205, 7, - 46, 59, 205, 7, 192, 247, 36, 58, 205, 7, 58, 247, 36, 59, 205, 7, 214, - 29, 58, 205, 7, 85, 214, 29, 58, 205, 7, 212, 169, 205, 7, 207, 37, 59, - 205, 7, 85, 250, 178, 192, 247, 36, 250, 178, 237, 30, 205, 110, 250, - 178, 237, 30, 212, 108, 58, 205, 7, 237, 30, 212, 108, 212, 169, 205, 7, - 206, 29, 212, 108, 58, 205, 7, 237, 30, 212, 108, 210, 160, 58, 205, 7, - 85, 237, 30, 212, 108, 210, 160, 58, 205, 7, 200, 240, 212, 108, 58, 205, - 7, 206, 24, 212, 108, 250, 178, 203, 53, 250, 178, 192, 247, 36, 203, 53, - 250, 178, 85, 203, 53, 250, 178, 206, 29, 213, 16, 58, 26, 59, 235, 64, - 58, 235, 64, 59, 235, 64, 237, 30, 213, 16, 214, 29, 58, 235, 64, 46, - 192, 247, 36, 237, 30, 212, 108, 205, 7, 85, 203, 53, 212, 169, 250, 178, - 205, 204, 202, 101, 201, 173, 205, 204, 85, 245, 78, 205, 204, 205, 143, - 85, 205, 143, 249, 99, 250, 178, 237, 30, 203, 53, 211, 249, 250, 178, - 85, 237, 30, 203, 53, 211, 249, 250, 178, 241, 61, 78, 207, 37, 59, 244, - 248, 217, 103, 103, 241, 61, 78, 221, 202, 53, 237, 209, 59, 205, 94, - 200, 33, 53, 237, 209, 59, 205, 94, 221, 202, 53, 207, 37, 59, 205, 94, - 200, 33, 53, 207, 37, 59, 205, 94, 58, 211, 78, 117, 214, 58, 59, 211, - 78, 117, 214, 58, 59, 236, 89, 117, 214, 58, 58, 239, 140, 219, 15, 59, - 196, 222, 85, 236, 89, 117, 105, 175, 83, 154, 219, 189, 83, 154, 85, 83, - 154, 85, 206, 62, 163, 244, 159, 211, 61, 117, 214, 58, 85, 206, 62, 244, - 159, 211, 61, 117, 214, 58, 85, 52, 163, 244, 159, 211, 61, 117, 214, 58, - 85, 52, 244, 159, 211, 61, 117, 214, 58, 85, 126, 206, 62, 244, 159, 211, - 61, 117, 214, 58, 85, 126, 52, 244, 159, 211, 61, 117, 214, 58, 241, 9, - 204, 244, 213, 153, 2, 214, 58, 85, 236, 89, 117, 214, 58, 85, 232, 126, - 236, 89, 117, 214, 58, 85, 58, 232, 125, 209, 194, 85, 58, 232, 126, 248, - 4, 235, 65, 232, 125, 209, 194, 235, 65, 232, 126, 248, 4, 219, 189, 50, - 213, 140, 214, 58, 219, 189, 53, 213, 140, 214, 58, 219, 189, 235, 78, - 50, 213, 140, 214, 58, 219, 189, 235, 78, 53, 213, 140, 214, 58, 219, - 189, 222, 178, 251, 90, 248, 61, 214, 58, 219, 189, 210, 17, 251, 90, - 248, 61, 214, 58, 85, 222, 178, 251, 90, 211, 61, 117, 214, 58, 85, 210, - 17, 251, 90, 211, 61, 117, 214, 58, 85, 222, 178, 251, 90, 248, 61, 214, - 58, 85, 210, 17, 251, 90, 248, 61, 214, 58, 175, 50, 201, 231, 206, 245, - 248, 61, 214, 58, 175, 53, 201, 231, 206, 245, 248, 61, 214, 58, 219, - 189, 50, 241, 17, 248, 61, 214, 58, 219, 189, 53, 241, 17, 248, 61, 214, - 58, 239, 92, 217, 103, 46, 17, 100, 239, 92, 217, 103, 46, 17, 102, 239, - 92, 217, 103, 46, 17, 134, 239, 92, 217, 103, 46, 17, 136, 239, 92, 217, - 103, 46, 17, 146, 239, 92, 217, 103, 46, 17, 167, 239, 92, 217, 103, 46, - 17, 178, 239, 92, 217, 103, 46, 17, 171, 239, 92, 217, 103, 46, 17, 182, - 239, 92, 217, 103, 46, 31, 203, 23, 239, 92, 46, 45, 17, 100, 239, 92, - 46, 45, 17, 102, 239, 92, 46, 45, 17, 134, 239, 92, 46, 45, 17, 136, 239, - 92, 46, 45, 17, 146, 239, 92, 46, 45, 17, 167, 239, 92, 46, 45, 17, 178, - 239, 92, 46, 45, 17, 171, 239, 92, 46, 45, 17, 182, 239, 92, 46, 45, 31, - 203, 23, 239, 92, 217, 103, 46, 45, 17, 100, 239, 92, 217, 103, 46, 45, - 17, 102, 239, 92, 217, 103, 46, 45, 17, 134, 239, 92, 217, 103, 46, 45, - 17, 136, 239, 92, 217, 103, 46, 45, 17, 146, 239, 92, 217, 103, 46, 45, - 17, 167, 239, 92, 217, 103, 46, 45, 17, 178, 239, 92, 217, 103, 46, 45, - 17, 171, 239, 92, 217, 103, 46, 45, 17, 182, 239, 92, 217, 103, 46, 45, - 31, 203, 23, 85, 197, 61, 91, 51, 85, 98, 55, 85, 219, 15, 55, 85, 239, - 53, 55, 85, 205, 159, 237, 68, 51, 85, 91, 51, 85, 173, 237, 68, 51, 237, - 224, 212, 110, 91, 51, 85, 209, 186, 91, 51, 201, 179, 91, 51, 85, 201, - 179, 91, 51, 240, 63, 201, 179, 91, 51, 85, 240, 63, 201, 179, 91, 51, - 58, 91, 51, 202, 154, 201, 241, 91, 250, 216, 202, 154, 248, 82, 91, 250, - 216, 58, 91, 250, 216, 85, 58, 241, 9, 237, 230, 26, 91, 51, 85, 58, 241, - 9, 200, 24, 26, 91, 51, 205, 91, 58, 91, 51, 85, 241, 153, 58, 91, 51, - 210, 16, 59, 91, 51, 222, 177, 59, 91, 51, 249, 136, 207, 37, 59, 91, 51, - 234, 231, 207, 37, 59, 91, 51, 85, 221, 202, 210, 15, 59, 91, 51, 85, - 200, 33, 210, 15, 59, 91, 51, 216, 14, 221, 202, 210, 15, 59, 91, 51, - 241, 17, 221, 224, 216, 14, 200, 33, 210, 15, 59, 91, 51, 46, 85, 59, 91, - 51, 197, 72, 91, 51, 248, 134, 205, 159, 237, 68, 51, 248, 134, 91, 51, - 248, 134, 173, 237, 68, 51, 85, 248, 134, 205, 159, 237, 68, 51, 85, 248, - 134, 91, 51, 85, 248, 134, 173, 237, 68, 51, 203, 55, 91, 51, 85, 203, - 54, 91, 51, 197, 99, 91, 51, 85, 197, 99, 91, 51, 214, 86, 91, 51, 52, - 241, 17, 221, 224, 115, 239, 102, 251, 89, 59, 201, 181, 241, 131, 4, 59, - 201, 180, 213, 31, 192, 204, 141, 192, 204, 93, 50, 209, 79, 249, 122, - 239, 217, 53, 209, 79, 249, 122, 239, 217, 214, 72, 3, 76, 226, 40, 210, - 90, 205, 178, 212, 33, 204, 141, 204, 94, 212, 33, 205, 177, 83, 249, 79, - 3, 231, 154, 106, 13, 209, 250, 239, 145, 181, 239, 52, 13, 235, 212, - 239, 145, 103, 221, 248, 251, 99, 103, 221, 248, 214, 71, 59, 239, 140, - 3, 247, 34, 238, 252, 26, 3, 238, 252, 236, 255, 77, 214, 84, 200, 23, - 221, 202, 53, 241, 101, 3, 238, 252, 200, 33, 50, 241, 101, 3, 238, 252, - 50, 214, 31, 225, 126, 53, 214, 31, 225, 126, 234, 216, 214, 31, 225, - 126, 222, 227, 124, 203, 147, 222, 227, 135, 203, 147, 50, 26, 53, 52, - 201, 3, 50, 26, 53, 203, 147, 50, 218, 121, 181, 53, 203, 147, 181, 50, - 203, 147, 124, 203, 148, 3, 244, 249, 57, 221, 198, 239, 59, 247, 218, - 231, 154, 209, 124, 59, 241, 152, 239, 139, 59, 241, 152, 239, 140, 3, - 107, 202, 111, 59, 241, 152, 239, 140, 3, 91, 202, 111, 59, 47, 3, 107, - 202, 111, 59, 47, 3, 91, 202, 111, 13, 50, 59, 47, 179, 13, 53, 59, 47, - 179, 13, 50, 251, 90, 179, 13, 53, 251, 90, 179, 13, 50, 52, 251, 90, - 179, 13, 53, 52, 251, 90, 179, 13, 50, 59, 201, 231, 206, 245, 179, 13, - 53, 59, 201, 231, 206, 245, 179, 13, 50, 235, 78, 213, 139, 13, 53, 235, - 78, 213, 139, 200, 24, 211, 89, 51, 237, 230, 211, 89, 51, 251, 64, 234, - 84, 244, 249, 51, 244, 204, 234, 84, 244, 249, 51, 53, 61, 3, 46, 212, - 124, 181, 107, 51, 181, 91, 51, 181, 50, 53, 51, 181, 107, 52, 51, 181, - 91, 52, 51, 181, 50, 53, 52, 51, 181, 107, 61, 234, 234, 154, 181, 91, - 61, 234, 234, 154, 181, 107, 52, 61, 234, 234, 154, 181, 91, 52, 61, 234, - 234, 154, 181, 91, 205, 87, 51, 64, 65, 248, 128, 64, 65, 238, 248, 64, - 65, 238, 120, 64, 65, 238, 247, 64, 65, 238, 56, 64, 65, 238, 183, 64, - 65, 238, 119, 64, 65, 238, 246, 64, 65, 238, 24, 64, 65, 238, 151, 64, - 65, 238, 87, 64, 65, 238, 214, 64, 65, 238, 55, 64, 65, 238, 182, 64, 65, - 238, 118, 64, 65, 238, 245, 64, 65, 238, 8, 64, 65, 238, 135, 64, 65, - 238, 71, 64, 65, 238, 198, 64, 65, 238, 39, 64, 65, 238, 166, 64, 65, - 238, 102, 64, 65, 238, 229, 64, 65, 238, 23, 64, 65, 238, 150, 64, 65, - 238, 86, 64, 65, 238, 213, 64, 65, 238, 54, 64, 65, 238, 181, 64, 65, - 238, 117, 64, 65, 238, 244, 64, 65, 238, 0, 64, 65, 238, 127, 64, 65, - 238, 63, 64, 65, 238, 190, 64, 65, 238, 31, 64, 65, 238, 158, 64, 65, - 238, 94, 64, 65, 238, 221, 64, 65, 238, 15, 64, 65, 238, 142, 64, 65, - 238, 78, 64, 65, 238, 205, 64, 65, 238, 46, 64, 65, 238, 173, 64, 65, - 238, 109, 64, 65, 238, 236, 64, 65, 238, 7, 64, 65, 238, 134, 64, 65, - 238, 70, 64, 65, 238, 197, 64, 65, 238, 38, 64, 65, 238, 165, 64, 65, - 238, 101, 64, 65, 238, 228, 64, 65, 238, 22, 64, 65, 238, 149, 64, 65, - 238, 85, 64, 65, 238, 212, 64, 65, 238, 53, 64, 65, 238, 180, 64, 65, - 238, 116, 64, 65, 238, 243, 64, 65, 237, 252, 64, 65, 238, 123, 64, 65, - 238, 59, 64, 65, 238, 186, 64, 65, 238, 27, 64, 65, 238, 154, 64, 65, - 238, 90, 64, 65, 238, 217, 64, 65, 238, 11, 64, 65, 238, 138, 64, 65, - 238, 74, 64, 65, 238, 201, 64, 65, 238, 42, 64, 65, 238, 169, 64, 65, - 238, 105, 64, 65, 238, 232, 64, 65, 238, 3, 64, 65, 238, 130, 64, 65, - 238, 66, 64, 65, 238, 193, 64, 65, 238, 34, 64, 65, 238, 161, 64, 65, - 238, 97, 64, 65, 238, 224, 64, 65, 238, 18, 64, 65, 238, 145, 64, 65, - 238, 81, 64, 65, 238, 208, 64, 65, 238, 49, 64, 65, 238, 176, 64, 65, - 238, 112, 64, 65, 238, 239, 64, 65, 237, 255, 64, 65, 238, 126, 64, 65, - 238, 62, 64, 65, 238, 189, 64, 65, 238, 30, 64, 65, 238, 157, 64, 65, - 238, 93, 64, 65, 238, 220, 64, 65, 238, 14, 64, 65, 238, 141, 64, 65, - 238, 77, 64, 65, 238, 204, 64, 65, 238, 45, 64, 65, 238, 172, 64, 65, - 238, 108, 64, 65, 238, 235, 64, 65, 238, 6, 64, 65, 238, 133, 64, 65, - 238, 69, 64, 65, 238, 196, 64, 65, 238, 37, 64, 65, 238, 164, 64, 65, - 238, 100, 64, 65, 238, 227, 64, 65, 238, 21, 64, 65, 238, 148, 64, 65, - 238, 84, 64, 65, 238, 211, 64, 65, 238, 52, 64, 65, 238, 179, 64, 65, - 238, 115, 64, 65, 238, 242, 64, 65, 237, 250, 64, 65, 238, 121, 64, 65, - 238, 57, 64, 65, 238, 184, 64, 65, 238, 25, 64, 65, 238, 152, 64, 65, - 238, 88, 64, 65, 238, 215, 64, 65, 238, 9, 64, 65, 238, 136, 64, 65, 238, - 72, 64, 65, 238, 199, 64, 65, 238, 40, 64, 65, 238, 167, 64, 65, 238, - 103, 64, 65, 238, 230, 64, 65, 238, 1, 64, 65, 238, 128, 64, 65, 238, 64, - 64, 65, 238, 191, 64, 65, 238, 32, 64, 65, 238, 159, 64, 65, 238, 95, 64, - 65, 238, 222, 64, 65, 238, 16, 64, 65, 238, 143, 64, 65, 238, 79, 64, 65, - 238, 206, 64, 65, 238, 47, 64, 65, 238, 174, 64, 65, 238, 110, 64, 65, - 238, 237, 64, 65, 237, 253, 64, 65, 238, 124, 64, 65, 238, 60, 64, 65, - 238, 187, 64, 65, 238, 28, 64, 65, 238, 155, 64, 65, 238, 91, 64, 65, - 238, 218, 64, 65, 238, 12, 64, 65, 238, 139, 64, 65, 238, 75, 64, 65, - 238, 202, 64, 65, 238, 43, 64, 65, 238, 170, 64, 65, 238, 106, 64, 65, - 238, 233, 64, 65, 238, 4, 64, 65, 238, 131, 64, 65, 238, 67, 64, 65, 238, - 194, 64, 65, 238, 35, 64, 65, 238, 162, 64, 65, 238, 98, 64, 65, 238, - 225, 64, 65, 238, 19, 64, 65, 238, 146, 64, 65, 238, 82, 64, 65, 238, - 209, 64, 65, 238, 50, 64, 65, 238, 177, 64, 65, 238, 113, 64, 65, 238, - 240, 64, 65, 237, 251, 64, 65, 238, 122, 64, 65, 238, 58, 64, 65, 238, - 185, 64, 65, 238, 26, 64, 65, 238, 153, 64, 65, 238, 89, 64, 65, 238, - 216, 64, 65, 238, 10, 64, 65, 238, 137, 64, 65, 238, 73, 64, 65, 238, - 200, 64, 65, 238, 41, 64, 65, 238, 168, 64, 65, 238, 104, 64, 65, 238, - 231, 64, 65, 238, 2, 64, 65, 238, 129, 64, 65, 238, 65, 64, 65, 238, 192, - 64, 65, 238, 33, 64, 65, 238, 160, 64, 65, 238, 96, 64, 65, 238, 223, 64, - 65, 238, 17, 64, 65, 238, 144, 64, 65, 238, 80, 64, 65, 238, 207, 64, 65, - 238, 48, 64, 65, 238, 175, 64, 65, 238, 111, 64, 65, 238, 238, 64, 65, - 237, 254, 64, 65, 238, 125, 64, 65, 238, 61, 64, 65, 238, 188, 64, 65, - 238, 29, 64, 65, 238, 156, 64, 65, 238, 92, 64, 65, 238, 219, 64, 65, - 238, 13, 64, 65, 238, 140, 64, 65, 238, 76, 64, 65, 238, 203, 64, 65, - 238, 44, 64, 65, 238, 171, 64, 65, 238, 107, 64, 65, 238, 234, 64, 65, - 238, 5, 64, 65, 238, 132, 64, 65, 238, 68, 64, 65, 238, 195, 64, 65, 238, - 36, 64, 65, 238, 163, 64, 65, 238, 99, 64, 65, 238, 226, 64, 65, 238, 20, - 64, 65, 238, 147, 64, 65, 238, 83, 64, 65, 238, 210, 64, 65, 238, 51, 64, - 65, 238, 178, 64, 65, 238, 114, 64, 65, 238, 241, 91, 200, 215, 61, 3, - 83, 106, 91, 200, 215, 61, 3, 52, 83, 106, 107, 52, 61, 3, 83, 106, 91, - 52, 61, 3, 83, 106, 50, 53, 52, 61, 3, 83, 106, 91, 200, 215, 61, 234, - 234, 154, 107, 52, 61, 234, 234, 154, 91, 52, 61, 234, 234, 154, 237, - 230, 61, 3, 231, 154, 106, 200, 24, 61, 3, 231, 154, 106, 200, 24, 201, - 165, 51, 237, 230, 201, 165, 51, 107, 52, 240, 65, 51, 91, 52, 240, 65, - 51, 107, 201, 165, 240, 65, 51, 91, 201, 165, 240, 65, 51, 91, 200, 215, - 201, 165, 240, 65, 51, 91, 61, 3, 237, 249, 204, 243, 200, 24, 61, 202, - 30, 154, 237, 230, 61, 202, 30, 154, 91, 61, 3, 203, 136, 3, 83, 106, 91, - 61, 3, 203, 136, 3, 52, 83, 106, 91, 200, 215, 61, 3, 203, 135, 91, 200, - 215, 61, 3, 203, 136, 3, 83, 106, 91, 200, 215, 61, 3, 203, 136, 3, 52, - 83, 106, 107, 250, 218, 91, 250, 218, 107, 52, 250, 218, 91, 52, 250, - 218, 107, 61, 202, 30, 58, 239, 139, 91, 61, 202, 30, 58, 239, 139, 107, - 61, 234, 234, 249, 79, 202, 30, 58, 239, 139, 91, 61, 234, 234, 249, 79, - 202, 30, 58, 239, 139, 173, 197, 89, 26, 205, 159, 237, 68, 51, 173, 237, - 68, 26, 205, 159, 197, 89, 51, 173, 197, 89, 61, 3, 122, 173, 237, 68, - 61, 3, 122, 205, 159, 237, 68, 61, 3, 122, 205, 159, 197, 89, 61, 3, 122, - 173, 197, 89, 61, 26, 173, 237, 68, 51, 173, 237, 68, 61, 26, 205, 159, - 237, 68, 51, 205, 159, 237, 68, 61, 26, 205, 159, 197, 89, 51, 205, 159, - 197, 89, 61, 26, 173, 197, 89, 51, 209, 250, 239, 146, 241, 54, 235, 212, - 239, 145, 235, 212, 239, 146, 241, 54, 209, 250, 239, 145, 205, 159, 237, - 68, 61, 241, 54, 173, 237, 68, 51, 173, 237, 68, 61, 241, 54, 205, 159, - 237, 68, 51, 235, 212, 239, 146, 241, 54, 173, 237, 68, 51, 209, 250, - 239, 146, 241, 54, 205, 159, 237, 68, 51, 173, 237, 68, 61, 241, 54, 173, - 197, 89, 51, 173, 197, 89, 61, 241, 54, 173, 237, 68, 51, 197, 123, 61, - 212, 106, 239, 82, 210, 22, 61, 212, 106, 91, 202, 209, 241, 7, 200, 23, - 61, 212, 106, 91, 202, 209, 241, 7, 237, 229, 61, 212, 106, 237, 230, - 202, 209, 241, 7, 222, 173, 61, 212, 106, 237, 230, 202, 209, 241, 7, - 210, 11, 210, 14, 250, 253, 244, 204, 51, 222, 176, 250, 253, 251, 64, - 51, 201, 243, 250, 253, 251, 64, 51, 248, 84, 250, 253, 251, 64, 51, 201, - 243, 250, 253, 244, 204, 61, 3, 219, 14, 201, 243, 250, 253, 251, 64, 61, - 3, 212, 124, 221, 202, 53, 207, 107, 244, 204, 51, 221, 202, 50, 207, - 107, 251, 64, 51, 251, 64, 244, 202, 244, 249, 51, 244, 204, 244, 202, - 244, 249, 51, 91, 61, 90, 206, 182, 107, 51, 107, 61, 90, 206, 182, 91, - 51, 206, 182, 91, 61, 90, 107, 51, 91, 61, 3, 98, 60, 107, 61, 3, 98, 60, - 91, 61, 202, 145, 196, 222, 50, 53, 61, 202, 145, 4, 244, 248, 200, 24, - 200, 215, 61, 234, 234, 4, 244, 248, 50, 165, 124, 53, 165, 135, 232, - 167, 50, 165, 135, 53, 165, 124, 232, 167, 124, 165, 53, 135, 165, 50, - 232, 167, 124, 165, 50, 135, 165, 53, 232, 167, 50, 165, 124, 53, 165, - 124, 232, 167, 124, 165, 53, 135, 165, 53, 232, 167, 50, 165, 135, 53, - 165, 135, 232, 167, 124, 165, 50, 135, 165, 50, 232, 167, 107, 232, 168, - 3, 165, 124, 202, 30, 154, 91, 232, 168, 3, 165, 124, 202, 30, 154, 200, - 24, 232, 168, 3, 165, 53, 202, 30, 154, 237, 230, 232, 168, 3, 165, 53, - 202, 30, 154, 107, 232, 168, 3, 165, 135, 202, 30, 154, 91, 232, 168, 3, - 165, 135, 202, 30, 154, 200, 24, 232, 168, 3, 165, 50, 202, 30, 154, 237, - 230, 232, 168, 3, 165, 50, 202, 30, 154, 107, 232, 168, 3, 165, 124, 234, - 234, 154, 91, 232, 168, 3, 165, 124, 234, 234, 154, 200, 24, 232, 168, 3, - 165, 53, 234, 234, 154, 237, 230, 232, 168, 3, 165, 53, 234, 234, 154, - 107, 232, 168, 3, 165, 135, 234, 234, 154, 91, 232, 168, 3, 165, 135, - 234, 234, 154, 200, 24, 232, 168, 3, 165, 50, 234, 234, 154, 237, 230, - 232, 168, 3, 165, 50, 234, 234, 154, 107, 232, 168, 3, 165, 124, 90, 107, - 232, 168, 3, 165, 237, 234, 200, 24, 232, 168, 3, 165, 50, 248, 209, 200, - 24, 232, 168, 3, 165, 210, 22, 91, 232, 168, 3, 165, 124, 90, 91, 232, - 168, 3, 165, 237, 234, 237, 230, 232, 168, 3, 165, 50, 248, 209, 237, - 230, 232, 168, 3, 165, 210, 22, 107, 232, 168, 3, 165, 124, 90, 91, 232, - 168, 3, 165, 200, 36, 107, 232, 168, 3, 165, 135, 90, 91, 232, 168, 3, - 165, 237, 234, 91, 232, 168, 3, 165, 124, 90, 107, 232, 168, 3, 165, 200, - 36, 91, 232, 168, 3, 165, 135, 90, 107, 232, 168, 3, 165, 237, 234, 107, - 232, 168, 3, 165, 124, 90, 181, 240, 64, 107, 232, 168, 3, 165, 135, 248, - 226, 181, 240, 64, 91, 232, 168, 3, 165, 124, 90, 181, 240, 64, 91, 232, - 168, 3, 165, 135, 248, 226, 181, 240, 64, 200, 24, 232, 168, 3, 165, 50, - 248, 209, 237, 230, 232, 168, 3, 165, 210, 22, 237, 230, 232, 168, 3, - 165, 50, 248, 209, 200, 24, 232, 168, 3, 165, 210, 22, 53, 52, 61, 3, - 209, 185, 232, 136, 236, 171, 2, 90, 91, 51, 202, 85, 214, 82, 90, 91, - 51, 107, 61, 90, 202, 85, 214, 81, 91, 61, 90, 202, 85, 214, 81, 91, 61, - 90, 251, 138, 180, 149, 222, 139, 90, 107, 51, 107, 61, 202, 145, 222, - 138, 233, 93, 90, 91, 51, 204, 142, 90, 91, 51, 107, 61, 202, 145, 204, - 141, 204, 94, 90, 107, 51, 50, 235, 111, 203, 135, 53, 235, 111, 203, - 135, 124, 235, 111, 203, 135, 135, 235, 111, 203, 135, 201, 165, 83, 249, - 79, 239, 217, 195, 159, 216, 16, 205, 105, 195, 159, 216, 16, 200, 201, - 244, 167, 50, 59, 241, 17, 179, 53, 59, 241, 17, 179, 50, 59, 213, 139, - 53, 59, 213, 139, 195, 159, 216, 16, 50, 226, 101, 179, 195, 159, 216, - 16, 53, 226, 101, 179, 195, 159, 216, 16, 50, 248, 161, 179, 195, 159, - 216, 16, 53, 248, 161, 179, 50, 47, 248, 61, 3, 200, 62, 53, 47, 248, 61, - 3, 200, 62, 50, 47, 248, 61, 3, 202, 112, 226, 86, 201, 243, 241, 100, - 53, 47, 248, 61, 3, 202, 112, 226, 86, 248, 84, 241, 100, 50, 47, 248, - 61, 3, 202, 112, 226, 86, 248, 84, 241, 100, 53, 47, 248, 61, 3, 202, - 112, 226, 86, 201, 243, 241, 100, 50, 251, 90, 248, 61, 3, 238, 252, 53, - 251, 90, 248, 61, 3, 238, 252, 50, 250, 253, 222, 139, 179, 53, 250, 253, - 233, 93, 179, 52, 50, 250, 253, 233, 93, 179, 52, 53, 250, 253, 222, 139, - 179, 50, 58, 201, 231, 206, 245, 179, 53, 58, 201, 231, 206, 245, 179, - 237, 249, 235, 168, 83, 195, 24, 222, 74, 219, 200, 251, 90, 214, 84, - 222, 183, 53, 251, 90, 199, 132, 3, 205, 94, 219, 200, 53, 251, 90, 3, - 238, 252, 251, 90, 3, 209, 81, 226, 40, 252, 9, 251, 89, 205, 127, 251, - 90, 214, 84, 222, 183, 205, 127, 251, 90, 214, 84, 200, 36, 163, 251, 89, - 210, 89, 251, 89, 251, 90, 3, 200, 62, 210, 89, 251, 90, 3, 200, 62, 214, - 181, 251, 90, 214, 84, 200, 36, 214, 181, 251, 90, 214, 84, 237, 234, - 219, 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, 86, 61, 212, 106, - 124, 26, 210, 22, 219, 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, 86, - 61, 212, 106, 124, 26, 222, 183, 219, 200, 251, 90, 3, 192, 250, 231, - 236, 217, 226, 86, 61, 212, 106, 135, 26, 210, 22, 219, 200, 251, 90, 3, - 192, 250, 231, 236, 217, 226, 86, 61, 212, 106, 135, 26, 222, 183, 219, - 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, 86, 61, 212, 106, 53, 26, - 200, 36, 219, 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, 86, 61, 212, - 106, 50, 26, 200, 36, 219, 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, - 86, 61, 212, 106, 53, 26, 237, 234, 219, 200, 251, 90, 3, 192, 250, 231, - 236, 217, 226, 86, 61, 212, 106, 50, 26, 237, 234, 210, 89, 236, 231, - 207, 76, 236, 231, 207, 77, 3, 214, 25, 236, 231, 207, 77, 3, 4, 244, - 249, 57, 236, 231, 207, 77, 3, 53, 61, 57, 236, 231, 207, 77, 3, 50, 61, - 57, 244, 249, 3, 231, 154, 154, 46, 83, 154, 46, 213, 144, 46, 210, 90, - 205, 177, 46, 213, 31, 244, 249, 239, 59, 247, 218, 231, 154, 249, 79, - 26, 201, 243, 157, 239, 59, 247, 218, 83, 154, 244, 249, 3, 204, 96, 196, - 222, 46, 251, 62, 239, 53, 55, 124, 61, 202, 145, 244, 248, 46, 59, 248, - 4, 46, 248, 4, 46, 222, 138, 46, 233, 92, 244, 249, 3, 4, 244, 249, 202, - 30, 202, 218, 210, 22, 244, 249, 3, 99, 231, 154, 204, 184, 202, 30, 202, - 218, 210, 22, 103, 209, 250, 239, 146, 205, 248, 103, 235, 212, 239, 146, - 205, 248, 103, 250, 178, 103, 4, 244, 248, 103, 205, 94, 99, 225, 125, - 205, 92, 201, 181, 3, 76, 57, 201, 181, 3, 200, 62, 209, 81, 226, 86, - 201, 180, 201, 181, 3, 207, 84, 250, 168, 248, 83, 53, 201, 181, 90, 50, - 201, 180, 50, 201, 181, 248, 209, 83, 154, 83, 249, 79, 248, 209, 53, - 201, 180, 248, 71, 3, 50, 157, 248, 135, 248, 71, 3, 53, 157, 248, 135, - 58, 248, 70, 24, 3, 50, 157, 248, 135, 24, 3, 53, 157, 248, 135, 59, 231, - 88, 58, 231, 88, 50, 197, 56, 235, 168, 53, 197, 56, 235, 168, 50, 52, - 197, 56, 235, 168, 53, 52, 197, 56, 235, 168, 226, 78, 226, 62, 202, 108, - 127, 226, 62, 226, 63, 217, 105, 3, 83, 154, 237, 243, 218, 121, 47, 3, - 241, 123, 214, 30, 226, 75, 250, 201, 206, 144, 212, 4, 236, 171, 2, 26, - 205, 250, 213, 144, 236, 171, 2, 26, 205, 250, 213, 145, 3, 202, 85, 57, - 230, 192, 202, 30, 26, 205, 250, 213, 144, 233, 154, 205, 6, 202, 206, - 237, 233, 201, 181, 3, 50, 157, 248, 135, 237, 233, 201, 181, 3, 53, 157, - 248, 135, 58, 239, 140, 3, 135, 51, 58, 221, 197, 59, 244, 249, 3, 135, - 51, 58, 244, 249, 3, 135, 51, 236, 153, 59, 205, 94, 236, 153, 58, 205, - 94, 236, 153, 59, 239, 139, 236, 153, 58, 239, 139, 236, 153, 59, 244, - 248, 236, 153, 58, 244, 248, 209, 123, 210, 90, 205, 178, 214, 81, 205, - 178, 3, 214, 25, 210, 90, 205, 178, 3, 231, 154, 106, 248, 170, 205, 177, - 248, 170, 210, 90, 205, 177, 52, 212, 124, 201, 165, 212, 124, 222, 178, - 241, 9, 251, 90, 179, 210, 17, 241, 9, 251, 90, 179, 202, 69, 219, 12, - 218, 53, 46, 76, 214, 81, 218, 53, 46, 98, 214, 81, 218, 53, 46, 24, 214, - 81, 218, 53, 200, 52, 214, 82, 3, 238, 252, 218, 53, 200, 52, 214, 82, 3, - 212, 124, 218, 53, 47, 226, 23, 214, 81, 218, 53, 47, 200, 52, 214, 81, - 99, 221, 248, 26, 214, 81, 99, 221, 248, 214, 72, 214, 81, 218, 53, 24, - 214, 81, 218, 218, 99, 204, 117, 204, 115, 3, 226, 36, 211, 89, 226, 37, - 214, 81, 235, 120, 213, 133, 226, 36, 226, 37, 3, 52, 106, 226, 37, 250, - 129, 3, 205, 248, 244, 241, 234, 213, 251, 64, 226, 34, 222, 75, 226, 35, - 3, 210, 161, 213, 112, 250, 226, 212, 100, 222, 75, 226, 35, 3, 207, 107, - 213, 112, 250, 226, 212, 100, 222, 75, 226, 35, 216, 18, 226, 80, 202, - 218, 212, 100, 226, 37, 250, 226, 39, 212, 110, 214, 81, 211, 83, 226, - 37, 214, 81, 226, 37, 3, 107, 61, 3, 122, 226, 37, 3, 24, 55, 226, 37, 3, - 226, 22, 226, 37, 3, 200, 51, 226, 37, 3, 214, 25, 226, 37, 3, 200, 62, - 225, 126, 222, 227, 50, 201, 181, 214, 81, 195, 159, 216, 16, 208, 169, - 241, 159, 195, 159, 216, 16, 208, 169, 212, 165, 195, 159, 216, 16, 208, - 169, 211, 255, 98, 2, 3, 4, 244, 249, 57, 98, 2, 3, 244, 240, 252, 22, - 57, 98, 2, 3, 202, 85, 57, 98, 2, 3, 76, 60, 98, 2, 3, 202, 85, 60, 98, - 2, 3, 204, 143, 102, 98, 2, 3, 58, 201, 180, 219, 15, 2, 3, 244, 159, 57, - 219, 15, 2, 3, 76, 60, 219, 15, 2, 3, 235, 212, 238, 249, 219, 15, 2, 3, - 209, 250, 238, 249, 98, 2, 226, 86, 50, 157, 244, 248, 98, 2, 226, 86, - 53, 157, 244, 248, 199, 117, 214, 72, 241, 61, 212, 4, 218, 117, 2, 3, - 76, 57, 218, 117, 2, 3, 200, 62, 207, 104, 212, 5, 3, 248, 84, 244, 201, - 205, 222, 212, 4, 218, 117, 2, 226, 86, 50, 157, 244, 248, 218, 117, 2, - 226, 86, 53, 157, 244, 248, 46, 218, 117, 2, 3, 244, 240, 252, 21, 218, - 117, 2, 226, 86, 52, 244, 248, 46, 239, 53, 55, 98, 2, 226, 86, 201, 180, - 219, 15, 2, 226, 86, 201, 180, 218, 117, 2, 226, 86, 201, 180, 226, 31, - 212, 4, 210, 12, 226, 31, 212, 4, 195, 159, 216, 16, 210, 135, 241, 159, - 251, 120, 214, 72, 241, 107, 226, 23, 3, 238, 252, 200, 52, 3, 219, 15, - 55, 200, 52, 3, 214, 25, 226, 23, 3, 214, 25, 226, 23, 3, 221, 248, 251, - 99, 200, 52, 3, 221, 248, 214, 71, 200, 52, 90, 226, 22, 226, 23, 90, - 200, 51, 200, 52, 90, 249, 79, 90, 226, 22, 226, 23, 90, 249, 79, 90, - 200, 51, 200, 52, 248, 209, 26, 225, 125, 3, 200, 51, 226, 23, 248, 209, - 26, 225, 125, 3, 226, 22, 244, 202, 200, 52, 3, 207, 83, 244, 202, 226, - 23, 3, 207, 83, 52, 47, 226, 22, 52, 47, 200, 51, 244, 202, 200, 52, 3, - 207, 84, 26, 205, 222, 212, 4, 221, 248, 26, 3, 76, 57, 221, 248, 214, - 72, 3, 76, 57, 52, 221, 248, 251, 99, 52, 221, 248, 214, 71, 99, 226, 24, - 221, 248, 251, 99, 99, 226, 24, 221, 248, 214, 71, 205, 232, 222, 227, - 214, 71, 205, 232, 222, 227, 251, 99, 221, 248, 214, 72, 214, 21, 221, - 248, 251, 99, 221, 248, 26, 3, 112, 204, 243, 221, 248, 214, 72, 3, 112, - 204, 243, 221, 248, 26, 3, 231, 154, 240, 64, 221, 248, 214, 72, 3, 231, - 154, 240, 64, 221, 248, 26, 3, 52, 214, 25, 221, 248, 26, 3, 200, 62, - 221, 248, 26, 3, 52, 200, 62, 4, 199, 114, 3, 200, 62, 221, 248, 214, 72, - 3, 52, 214, 25, 221, 248, 214, 72, 3, 52, 200, 62, 195, 159, 216, 16, - 239, 6, 251, 54, 195, 159, 216, 16, 210, 204, 251, 54, 236, 171, 2, 3, - 76, 60, 230, 192, 3, 76, 57, 201, 165, 231, 154, 249, 79, 3, 52, 83, 106, - 201, 165, 231, 154, 249, 79, 3, 201, 165, 83, 106, 202, 85, 214, 82, 3, - 76, 57, 202, 85, 214, 82, 3, 209, 250, 238, 249, 206, 71, 219, 15, 206, - 70, 241, 146, 3, 76, 57, 236, 171, 3, 250, 178, 251, 138, 180, 202, 30, - 3, 244, 240, 252, 21, 251, 20, 180, 214, 72, 180, 149, 236, 171, 2, 90, - 98, 55, 98, 2, 90, 236, 171, 55, 236, 171, 2, 90, 202, 85, 214, 81, 52, - 244, 168, 236, 172, 99, 241, 139, 236, 171, 206, 85, 115, 241, 139, 236, - 171, 206, 85, 236, 171, 2, 3, 99, 238, 250, 90, 26, 99, 238, 250, 60, - 236, 164, 3, 235, 6, 238, 250, 57, 222, 139, 3, 244, 249, 226, 40, 233, - 93, 3, 244, 249, 226, 40, 222, 139, 3, 211, 78, 117, 57, 233, 93, 3, 211, - 78, 117, 57, 222, 139, 214, 72, 205, 250, 180, 149, 233, 93, 214, 72, - 205, 250, 180, 149, 222, 139, 214, 72, 205, 250, 180, 202, 30, 3, 76, - 226, 40, 233, 93, 214, 72, 205, 250, 180, 202, 30, 3, 76, 226, 40, 222, - 139, 214, 72, 205, 250, 180, 202, 30, 3, 76, 57, 233, 93, 214, 72, 205, - 250, 180, 202, 30, 3, 76, 57, 222, 139, 214, 72, 205, 250, 180, 202, 30, - 3, 76, 90, 210, 22, 233, 93, 214, 72, 205, 250, 180, 202, 30, 3, 76, 90, - 222, 183, 222, 139, 214, 72, 251, 21, 233, 93, 214, 72, 251, 21, 222, - 139, 26, 206, 60, 216, 18, 180, 149, 233, 93, 26, 206, 60, 216, 18, 180, - 149, 222, 139, 26, 216, 18, 251, 21, 233, 93, 26, 216, 18, 251, 21, 222, - 139, 90, 237, 242, 180, 90, 233, 92, 233, 93, 90, 237, 242, 180, 90, 222, - 138, 222, 139, 90, 206, 71, 214, 72, 236, 172, 233, 93, 90, 206, 71, 214, - 72, 236, 172, 222, 139, 90, 206, 71, 90, 233, 92, 233, 93, 90, 206, 71, - 90, 222, 138, 222, 139, 90, 233, 93, 90, 237, 242, 236, 172, 233, 93, 90, - 222, 139, 90, 237, 242, 236, 172, 222, 139, 90, 205, 250, 180, 90, 233, - 93, 90, 205, 250, 236, 172, 233, 93, 90, 205, 250, 180, 90, 222, 139, 90, - 205, 250, 236, 172, 205, 250, 180, 202, 30, 214, 72, 222, 138, 205, 250, - 180, 202, 30, 214, 72, 233, 92, 205, 250, 180, 202, 30, 214, 72, 222, - 139, 3, 76, 226, 40, 205, 250, 180, 202, 30, 214, 72, 233, 93, 3, 76, - 226, 40, 237, 242, 180, 202, 30, 214, 72, 222, 138, 237, 242, 180, 202, - 30, 214, 72, 233, 92, 237, 242, 205, 250, 180, 202, 30, 214, 72, 222, - 138, 237, 242, 205, 250, 180, 202, 30, 214, 72, 233, 92, 206, 71, 214, - 72, 222, 138, 206, 71, 214, 72, 233, 92, 206, 71, 90, 222, 139, 90, 236, - 171, 55, 206, 71, 90, 233, 93, 90, 236, 171, 55, 52, 217, 89, 222, 138, - 52, 217, 89, 233, 92, 52, 217, 89, 222, 139, 3, 200, 62, 233, 93, 214, - 21, 222, 138, 233, 93, 248, 209, 222, 138, 222, 139, 244, 202, 247, 218, - 241, 10, 233, 93, 244, 202, 247, 218, 241, 10, 222, 139, 244, 202, 247, - 218, 241, 11, 90, 205, 250, 236, 172, 233, 93, 244, 202, 247, 218, 241, - 11, 90, 205, 250, 236, 172, 205, 223, 202, 222, 222, 225, 202, 222, 205, - 223, 202, 223, 214, 72, 180, 149, 222, 225, 202, 223, 214, 72, 180, 149, - 236, 171, 2, 3, 247, 253, 57, 212, 35, 90, 206, 60, 236, 171, 55, 204, - 134, 90, 206, 60, 236, 171, 55, 212, 35, 90, 206, 60, 216, 18, 180, 149, - 204, 134, 90, 206, 60, 216, 18, 180, 149, 212, 35, 90, 236, 171, 55, 204, - 134, 90, 236, 171, 55, 212, 35, 90, 216, 18, 180, 149, 204, 134, 90, 216, - 18, 180, 149, 212, 35, 90, 251, 138, 180, 149, 204, 134, 90, 251, 138, - 180, 149, 212, 35, 90, 216, 18, 251, 138, 180, 149, 204, 134, 90, 216, - 18, 251, 138, 180, 149, 52, 212, 34, 52, 204, 133, 204, 142, 3, 238, 252, - 204, 94, 3, 238, 252, 204, 142, 3, 98, 2, 60, 204, 94, 3, 98, 2, 60, 204, - 142, 3, 218, 117, 2, 60, 204, 94, 3, 218, 117, 2, 60, 204, 142, 77, 214, - 72, 180, 202, 30, 3, 76, 57, 204, 94, 77, 214, 72, 180, 202, 30, 3, 76, - 57, 204, 142, 77, 90, 236, 171, 55, 204, 94, 77, 90, 236, 171, 55, 204, - 142, 77, 90, 202, 85, 214, 81, 204, 94, 77, 90, 202, 85, 214, 81, 204, - 142, 77, 90, 251, 138, 180, 149, 204, 94, 77, 90, 251, 138, 180, 149, - 204, 142, 77, 90, 216, 18, 180, 149, 204, 94, 77, 90, 216, 18, 180, 149, - 47, 50, 192, 111, 214, 81, 47, 53, 192, 111, 214, 81, 244, 202, 204, 141, - 244, 202, 204, 93, 244, 202, 204, 142, 214, 72, 180, 149, 244, 202, 204, - 94, 214, 72, 180, 149, 204, 142, 90, 204, 93, 204, 94, 90, 204, 141, 204, - 142, 90, 204, 141, 204, 94, 90, 204, 93, 204, 94, 248, 209, 204, 141, - 204, 94, 248, 209, 26, 225, 125, 247, 218, 240, 65, 3, 204, 141, 236, - 255, 77, 214, 84, 237, 229, 212, 155, 3, 203, 49, 201, 242, 201, 198, - 226, 22, 235, 24, 216, 33, 206, 182, 50, 203, 147, 206, 182, 135, 203, - 147, 206, 182, 124, 203, 147, 213, 32, 3, 209, 80, 83, 249, 79, 201, 165, - 53, 201, 3, 52, 83, 249, 79, 50, 201, 3, 83, 249, 79, 52, 50, 201, 3, 52, - 83, 249, 79, 52, 50, 201, 3, 181, 240, 65, 234, 234, 50, 219, 168, 77, - 52, 199, 100, 206, 182, 135, 203, 148, 3, 214, 25, 206, 182, 124, 203, - 148, 3, 200, 62, 206, 182, 124, 203, 148, 90, 206, 182, 135, 203, 147, - 52, 135, 203, 147, 52, 124, 203, 147, 52, 204, 196, 216, 18, 55, 210, 89, - 52, 204, 196, 216, 18, 55, 239, 18, 216, 18, 239, 61, 3, 210, 89, 217, - 104, 205, 248, 83, 222, 75, 3, 244, 249, 57, 83, 222, 75, 3, 244, 249, - 60, 135, 203, 148, 3, 244, 249, 60, 213, 145, 3, 231, 154, 106, 213, 145, - 3, 202, 85, 214, 81, 201, 165, 83, 249, 79, 248, 163, 210, 136, 201, 165, - 83, 249, 79, 3, 231, 154, 106, 201, 165, 244, 168, 214, 81, 201, 165, - 217, 89, 222, 138, 201, 165, 217, 89, 233, 92, 237, 242, 205, 250, 222, - 139, 214, 72, 180, 149, 237, 242, 205, 250, 233, 93, 214, 72, 180, 149, - 201, 165, 205, 178, 248, 163, 210, 136, 222, 227, 201, 165, 83, 249, 79, - 214, 81, 52, 205, 178, 214, 81, 59, 83, 154, 218, 53, 59, 83, 154, 173, - 237, 68, 59, 51, 173, 197, 89, 59, 51, 205, 159, 237, 68, 59, 51, 205, - 159, 197, 89, 59, 51, 50, 53, 59, 51, 107, 58, 51, 200, 24, 58, 51, 237, - 230, 58, 51, 173, 237, 68, 58, 51, 173, 197, 89, 58, 51, 205, 159, 237, - 68, 58, 51, 205, 159, 197, 89, 58, 51, 50, 53, 58, 51, 124, 135, 58, 51, - 91, 61, 3, 202, 68, 237, 229, 91, 61, 3, 202, 68, 200, 23, 107, 61, 3, - 202, 68, 237, 229, 107, 61, 3, 202, 68, 200, 23, 47, 3, 201, 243, 157, - 248, 135, 47, 3, 248, 84, 157, 248, 135, 47, 3, 200, 33, 53, 239, 146, - 157, 248, 135, 47, 3, 221, 202, 50, 239, 146, 157, 248, 135, 239, 140, 3, - 50, 157, 248, 135, 239, 140, 3, 53, 157, 248, 135, 239, 140, 3, 201, 243, - 157, 248, 135, 239, 140, 3, 248, 84, 157, 248, 135, 237, 249, 205, 94, - 58, 222, 227, 205, 94, 59, 222, 227, 205, 94, 58, 199, 48, 4, 205, 94, - 59, 199, 48, 4, 205, 94, 58, 213, 54, 59, 213, 54, 59, 232, 84, 58, 232, - 84, 231, 154, 58, 232, 84, 58, 222, 227, 244, 248, 58, 219, 189, 239, - 139, 59, 219, 189, 239, 139, 58, 219, 189, 221, 197, 59, 219, 189, 221, - 197, 58, 4, 239, 139, 58, 4, 221, 197, 59, 4, 221, 197, 58, 231, 154, - 236, 247, 59, 231, 154, 236, 247, 58, 83, 236, 247, 59, 83, 236, 247, 50, - 61, 3, 4, 244, 248, 115, 107, 250, 213, 50, 61, 3, 46, 212, 124, 181, - 107, 205, 87, 51, 107, 200, 215, 61, 3, 83, 106, 107, 200, 215, 61, 3, - 52, 83, 106, 107, 200, 215, 61, 234, 234, 154, 107, 200, 215, 201, 165, - 240, 65, 51, 107, 61, 3, 237, 249, 204, 243, 107, 61, 3, 203, 136, 3, 83, - 106, 107, 61, 3, 203, 136, 3, 52, 83, 106, 107, 200, 215, 61, 3, 203, - 135, 107, 200, 215, 61, 3, 203, 136, 3, 83, 106, 107, 200, 215, 61, 3, - 203, 136, 3, 52, 83, 106, 107, 61, 202, 145, 196, 222, 197, 123, 61, 212, - 106, 239, 82, 222, 183, 236, 171, 2, 90, 107, 51, 210, 90, 202, 85, 214, - 82, 90, 107, 51, 107, 61, 90, 210, 90, 251, 138, 180, 149, 91, 61, 202, - 145, 233, 92, 91, 61, 202, 145, 204, 93, 107, 211, 89, 51, 91, 211, 89, - 51, 210, 90, 202, 85, 214, 82, 90, 91, 51, 91, 61, 90, 210, 90, 251, 138, - 180, 149, 202, 85, 214, 82, 90, 107, 51, 107, 61, 90, 251, 138, 180, 149, - 107, 61, 90, 210, 90, 202, 85, 214, 81, 91, 61, 90, 210, 90, 202, 85, - 214, 81, 237, 230, 201, 179, 195, 24, 51, 206, 182, 205, 250, 173, 51, - 206, 182, 249, 134, 205, 159, 51, 59, 219, 189, 205, 7, 58, 4, 205, 7, - 59, 4, 205, 7, 58, 210, 17, 213, 54, 59, 210, 17, 213, 54, 85, 222, 227, - 244, 248, 85, 214, 27, 3, 214, 27, 226, 40, 85, 244, 249, 3, 244, 249, - 226, 40, 85, 244, 248, 85, 46, 208, 230, 205, 250, 173, 61, 3, 231, 163, - 232, 136, 249, 134, 205, 159, 61, 3, 231, 163, 203, 135, 205, 250, 173, - 61, 3, 231, 154, 203, 135, 249, 134, 205, 159, 61, 3, 231, 154, 203, 135, - 248, 217, 61, 212, 106, 237, 230, 202, 209, 173, 237, 67, 206, 182, 248, - 217, 61, 212, 106, 237, 230, 202, 209, 173, 237, 67, 107, 201, 179, 51, - 200, 24, 201, 179, 51, 91, 201, 179, 51, 237, 230, 201, 179, 51, 50, 53, - 201, 179, 51, 124, 135, 201, 179, 51, 173, 197, 89, 201, 179, 51, 173, - 237, 68, 201, 179, 51, 205, 159, 237, 68, 201, 179, 51, 205, 159, 197, - 89, 201, 179, 51, 107, 201, 179, 240, 63, 51, 200, 24, 201, 179, 240, 63, - 51, 91, 201, 179, 240, 63, 51, 237, 230, 201, 179, 240, 63, 51, 244, 204, - 201, 179, 192, 244, 249, 51, 251, 64, 201, 179, 192, 244, 249, 51, 107, - 201, 179, 61, 202, 30, 154, 200, 24, 201, 179, 61, 202, 30, 154, 91, 201, - 179, 61, 202, 30, 154, 237, 230, 201, 179, 61, 202, 30, 154, 173, 197, - 89, 201, 179, 61, 202, 30, 154, 173, 237, 68, 201, 179, 61, 202, 30, 154, - 205, 159, 237, 68, 201, 179, 61, 202, 30, 154, 205, 159, 197, 89, 201, - 179, 61, 202, 30, 154, 107, 201, 179, 61, 3, 52, 231, 154, 106, 200, 24, - 201, 179, 61, 3, 52, 231, 154, 106, 91, 201, 179, 61, 3, 52, 231, 154, - 106, 237, 230, 201, 179, 61, 3, 52, 231, 154, 106, 231, 154, 203, 155, - 224, 152, 83, 203, 155, 224, 152, 107, 201, 179, 61, 127, 91, 201, 179, - 51, 200, 24, 201, 179, 61, 107, 77, 237, 230, 201, 179, 51, 91, 201, 179, - 61, 127, 107, 201, 179, 51, 237, 230, 201, 179, 61, 107, 77, 200, 24, - 201, 179, 51, 107, 201, 179, 213, 218, 250, 213, 200, 24, 201, 179, 213, - 218, 250, 213, 91, 201, 179, 213, 218, 250, 213, 237, 230, 201, 179, 213, - 218, 250, 213, 107, 58, 46, 59, 51, 200, 24, 58, 46, 59, 51, 91, 58, 46, - 59, 51, 237, 230, 58, 46, 59, 51, 251, 64, 201, 179, 53, 200, 167, 51, - 251, 64, 201, 179, 248, 84, 200, 167, 51, 251, 64, 201, 179, 50, 200, - 167, 51, 251, 64, 201, 179, 201, 243, 200, 167, 51, 210, 94, 222, 183, - 210, 94, 210, 22, 217, 79, 222, 183, 217, 79, 210, 22, 235, 6, 241, 101, - 250, 214, 244, 244, 251, 63, 91, 58, 51, 202, 154, 201, 241, 107, 236, - 165, 250, 216, 202, 154, 210, 18, 200, 24, 236, 165, 250, 216, 202, 154, - 201, 241, 91, 236, 165, 250, 216, 202, 154, 222, 179, 237, 230, 236, 165, - 250, 216, 58, 107, 236, 165, 250, 216, 58, 200, 24, 236, 165, 250, 216, - 58, 91, 236, 165, 250, 216, 58, 237, 230, 236, 165, 250, 216, 237, 230, - 201, 179, 61, 3, 181, 202, 68, 222, 173, 237, 230, 201, 179, 61, 3, 181, - 202, 68, 210, 11, 200, 24, 201, 179, 61, 3, 181, 202, 68, 222, 173, 200, - 24, 201, 179, 61, 3, 181, 202, 68, 210, 11, 107, 201, 179, 61, 3, 181, - 202, 68, 200, 23, 91, 201, 179, 61, 3, 181, 202, 68, 200, 23, 107, 201, - 179, 61, 3, 181, 202, 68, 237, 229, 91, 201, 179, 61, 3, 181, 202, 68, - 237, 229, 58, 241, 9, 237, 230, 26, 107, 51, 58, 241, 9, 237, 230, 26, - 91, 51, 58, 241, 9, 200, 24, 26, 107, 51, 58, 241, 9, 200, 24, 26, 91, - 51, 58, 241, 9, 107, 26, 200, 24, 51, 58, 241, 9, 91, 26, 200, 24, 51, - 58, 241, 9, 107, 26, 237, 230, 51, 58, 241, 9, 91, 26, 237, 230, 51, 210, - 63, 61, 135, 222, 183, 210, 63, 61, 135, 210, 22, 210, 63, 61, 124, 222, - 183, 210, 63, 61, 124, 210, 22, 210, 63, 61, 50, 200, 36, 210, 63, 61, - 53, 200, 36, 210, 63, 61, 50, 237, 234, 210, 63, 61, 53, 237, 234, 200, - 24, 59, 61, 234, 234, 249, 79, 3, 231, 154, 154, 124, 250, 217, 226, 86, - 39, 210, 163, 248, 69, 214, 21, 59, 205, 92, 214, 21, 59, 26, 58, 205, - 92, 214, 21, 58, 205, 92, 249, 98, 111, 3, 175, 196, 222, 46, 196, 222, - 46, 27, 196, 222, 58, 47, 247, 33, 58, 239, 140, 247, 33, 163, 58, 213, - 54, 231, 154, 58, 214, 172, 58, 214, 172, 58, 219, 189, 200, 35, 201, - 181, 247, 33, 58, 219, 189, 237, 233, 201, 181, 247, 33, 58, 219, 189, - 222, 178, 201, 181, 247, 33, 58, 219, 189, 210, 17, 201, 181, 247, 33, - 217, 94, 235, 23, 102, 201, 243, 157, 58, 244, 248, 248, 84, 157, 58, - 244, 248, 175, 235, 6, 212, 108, 58, 241, 5, 209, 194, 175, 235, 6, 212, - 108, 58, 241, 5, 59, 235, 6, 212, 108, 241, 5, 209, 194, 59, 235, 6, 212, - 108, 241, 5, 47, 212, 78, 226, 67, 200, 66, 55, 233, 83, 78, 212, 121, - 235, 23, 102, 212, 121, 235, 23, 134, 212, 121, 235, 23, 136, 212, 121, - 235, 23, 146, 201, 200, 211, 245, 250, 174, 231, 9, 212, 230, 217, 90, - 59, 218, 189, 207, 113, 58, 239, 140, 214, 119, 241, 60, 201, 143, 175, - 218, 189, 250, 209, 241, 24, 232, 242, 195, 77, 223, 203, 251, 33, 251, - 251, 197, 218, 212, 79, 50, 157, 58, 205, 7, 53, 157, 58, 205, 7, 205, 8, - 3, 50, 157, 248, 135, 205, 8, 3, 53, 157, 248, 135, 107, 200, 215, 61, 3, - 201, 181, 250, 215, 200, 24, 200, 215, 61, 3, 201, 181, 250, 215, 91, - 200, 215, 61, 3, 201, 181, 250, 215, 237, 230, 200, 215, 61, 3, 201, 181, - 250, 215, 236, 155, 235, 23, 100, 236, 155, 235, 23, 102, 208, 130, 209, - 103, 250, 173, 16, 199, 19, 209, 103, 250, 173, 16, 216, 4, 209, 103, - 250, 173, 16, 211, 66, 209, 103, 250, 173, 16, 248, 158, 209, 103, 250, - 173, 16, 207, 96, 209, 103, 250, 173, 16, 201, 192, 236, 171, 2, 3, 226, - 63, 60, 200, 48, 105, 207, 92, 105, 237, 239, 105, 213, 122, 105, 210, - 89, 53, 251, 89, 232, 105, 213, 106, 105, 125, 6, 1, 250, 112, 125, 6, 1, - 248, 8, 125, 6, 1, 199, 116, 125, 6, 1, 233, 158, 125, 6, 1, 239, 22, - 125, 6, 1, 196, 38, 125, 6, 1, 195, 58, 125, 6, 1, 237, 150, 125, 6, 1, - 195, 84, 125, 6, 1, 225, 220, 125, 6, 1, 84, 225, 220, 125, 6, 1, 68, - 125, 6, 1, 239, 43, 125, 6, 1, 225, 22, 125, 6, 1, 222, 38, 125, 6, 1, - 218, 58, 125, 6, 1, 217, 205, 125, 6, 1, 214, 103, 125, 6, 1, 212, 103, - 125, 6, 1, 209, 249, 125, 6, 1, 205, 229, 125, 6, 1, 200, 246, 125, 6, 1, - 200, 83, 125, 6, 1, 234, 237, 125, 6, 1, 232, 90, 125, 6, 1, 214, 39, - 125, 6, 1, 213, 91, 125, 6, 1, 206, 154, 125, 6, 1, 201, 92, 125, 6, 1, - 245, 35, 125, 6, 1, 207, 50, 125, 6, 1, 196, 47, 125, 6, 1, 196, 49, 125, - 6, 1, 196, 82, 125, 6, 1, 205, 123, 142, 125, 6, 1, 195, 217, 125, 6, 1, - 4, 195, 182, 125, 6, 1, 4, 195, 183, 3, 203, 135, 125, 6, 1, 196, 3, 125, - 6, 1, 226, 5, 4, 195, 182, 125, 6, 1, 248, 170, 195, 182, 125, 6, 1, 226, - 5, 248, 170, 195, 182, 125, 6, 1, 235, 102, 125, 6, 1, 225, 218, 125, 6, - 1, 206, 153, 125, 6, 1, 201, 155, 63, 125, 6, 1, 222, 215, 218, 58, 125, - 4, 1, 250, 112, 125, 4, 1, 248, 8, 125, 4, 1, 199, 116, 125, 4, 1, 233, - 158, 125, 4, 1, 239, 22, 125, 4, 1, 196, 38, 125, 4, 1, 195, 58, 125, 4, - 1, 237, 150, 125, 4, 1, 195, 84, 125, 4, 1, 225, 220, 125, 4, 1, 84, 225, - 220, 125, 4, 1, 68, 125, 4, 1, 239, 43, 125, 4, 1, 225, 22, 125, 4, 1, - 222, 38, 125, 4, 1, 218, 58, 125, 4, 1, 217, 205, 125, 4, 1, 214, 103, - 125, 4, 1, 212, 103, 125, 4, 1, 209, 249, 125, 4, 1, 205, 229, 125, 4, 1, - 200, 246, 125, 4, 1, 200, 83, 125, 4, 1, 234, 237, 125, 4, 1, 232, 90, - 125, 4, 1, 214, 39, 125, 4, 1, 213, 91, 125, 4, 1, 206, 154, 125, 4, 1, - 201, 92, 125, 4, 1, 245, 35, 125, 4, 1, 207, 50, 125, 4, 1, 196, 47, 125, - 4, 1, 196, 49, 125, 4, 1, 196, 82, 125, 4, 1, 205, 123, 142, 125, 4, 1, - 195, 217, 125, 4, 1, 4, 195, 182, 125, 4, 1, 4, 195, 183, 3, 203, 135, - 125, 4, 1, 196, 3, 125, 4, 1, 226, 5, 4, 195, 182, 125, 4, 1, 248, 170, - 195, 182, 125, 4, 1, 226, 5, 248, 170, 195, 182, 125, 4, 1, 235, 102, - 125, 4, 1, 225, 218, 125, 4, 1, 206, 153, 125, 4, 1, 201, 155, 63, 125, - 4, 1, 222, 215, 218, 58, 8, 6, 1, 223, 99, 3, 52, 154, 8, 4, 1, 223, 99, - 3, 52, 154, 8, 6, 1, 223, 99, 3, 112, 202, 84, 8, 6, 1, 214, 3, 3, 106, - 8, 6, 1, 211, 31, 3, 203, 135, 8, 4, 1, 39, 3, 106, 8, 4, 1, 203, 217, 3, - 239, 146, 106, 8, 6, 1, 233, 15, 3, 239, 194, 8, 4, 1, 233, 15, 3, 239, - 194, 8, 6, 1, 225, 80, 3, 239, 194, 8, 4, 1, 225, 80, 3, 239, 194, 8, 6, - 1, 195, 159, 3, 239, 194, 8, 4, 1, 195, 159, 3, 239, 194, 8, 6, 1, 251, - 133, 8, 6, 1, 221, 136, 3, 122, 8, 6, 1, 163, 63, 8, 6, 1, 163, 251, 133, - 8, 4, 1, 199, 231, 3, 53, 122, 8, 6, 1, 197, 200, 3, 122, 8, 4, 1, 197, - 200, 3, 122, 8, 4, 1, 199, 231, 3, 241, 20, 8, 6, 1, 157, 233, 14, 8, 4, - 1, 157, 233, 14, 8, 4, 1, 203, 133, 212, 245, 8, 4, 1, 237, 135, 3, 216, - 15, 8, 4, 1, 163, 211, 31, 3, 203, 135, 8, 4, 1, 177, 3, 126, 210, 3, - 226, 40, 8, 1, 4, 6, 163, 69, 8, 204, 143, 4, 1, 225, 216, 73, 1, 6, 199, - 230, 8, 6, 1, 209, 81, 3, 204, 63, 203, 135, 8, 6, 1, 195, 159, 3, 204, - 63, 203, 135, 88, 6, 1, 251, 157, 88, 4, 1, 251, 157, 88, 6, 1, 199, 31, - 88, 4, 1, 199, 31, 88, 6, 1, 234, 93, 88, 4, 1, 234, 93, 88, 6, 1, 240, - 102, 88, 4, 1, 240, 102, 88, 6, 1, 237, 31, 88, 4, 1, 237, 31, 88, 6, 1, - 205, 164, 88, 4, 1, 205, 164, 88, 6, 1, 195, 96, 88, 4, 1, 195, 96, 88, - 6, 1, 232, 161, 88, 4, 1, 232, 161, 88, 6, 1, 202, 197, 88, 4, 1, 202, - 197, 88, 6, 1, 230, 206, 88, 4, 1, 230, 206, 88, 6, 1, 225, 6, 88, 4, 1, - 225, 6, 88, 6, 1, 222, 210, 88, 4, 1, 222, 210, 88, 6, 1, 219, 77, 88, 4, - 1, 219, 77, 88, 6, 1, 216, 222, 88, 4, 1, 216, 222, 88, 6, 1, 223, 202, - 88, 4, 1, 223, 202, 88, 6, 1, 72, 88, 4, 1, 72, 88, 6, 1, 212, 219, 88, - 4, 1, 212, 219, 88, 6, 1, 209, 232, 88, 4, 1, 209, 232, 88, 6, 1, 206, - 74, 88, 4, 1, 206, 74, 88, 6, 1, 203, 89, 88, 4, 1, 203, 89, 88, 6, 1, - 200, 114, 88, 4, 1, 200, 114, 88, 6, 1, 235, 152, 88, 4, 1, 235, 152, 88, - 6, 1, 224, 123, 88, 4, 1, 224, 123, 88, 6, 1, 211, 237, 88, 4, 1, 211, - 237, 88, 6, 1, 214, 95, 88, 4, 1, 214, 95, 88, 6, 1, 239, 144, 251, 163, - 88, 4, 1, 239, 144, 251, 163, 88, 6, 1, 37, 88, 251, 193, 88, 4, 1, 37, - 88, 251, 193, 88, 6, 1, 241, 43, 237, 31, 88, 4, 1, 241, 43, 237, 31, 88, - 6, 1, 239, 144, 225, 6, 88, 4, 1, 239, 144, 225, 6, 88, 6, 1, 239, 144, - 216, 222, 88, 4, 1, 239, 144, 216, 222, 88, 6, 1, 241, 43, 216, 222, 88, - 4, 1, 241, 43, 216, 222, 88, 6, 1, 37, 88, 214, 95, 88, 4, 1, 37, 88, - 214, 95, 88, 6, 1, 208, 222, 88, 4, 1, 208, 222, 88, 6, 1, 241, 58, 206, - 247, 88, 4, 1, 241, 58, 206, 247, 88, 6, 1, 37, 88, 206, 247, 88, 4, 1, - 37, 88, 206, 247, 88, 6, 1, 37, 88, 236, 140, 88, 4, 1, 37, 88, 236, 140, - 88, 6, 1, 251, 176, 224, 128, 88, 4, 1, 251, 176, 224, 128, 88, 6, 1, - 239, 144, 231, 155, 88, 4, 1, 239, 144, 231, 155, 88, 6, 1, 37, 88, 231, - 155, 88, 4, 1, 37, 88, 231, 155, 88, 6, 1, 37, 88, 142, 88, 4, 1, 37, 88, - 142, 88, 6, 1, 223, 98, 142, 88, 4, 1, 223, 98, 142, 88, 6, 1, 37, 88, - 232, 111, 88, 4, 1, 37, 88, 232, 111, 88, 6, 1, 37, 88, 232, 164, 88, 4, - 1, 37, 88, 232, 164, 88, 6, 1, 37, 88, 234, 88, 88, 4, 1, 37, 88, 234, - 88, 88, 6, 1, 37, 88, 239, 46, 88, 4, 1, 37, 88, 239, 46, 88, 6, 1, 37, - 88, 206, 213, 88, 4, 1, 37, 88, 206, 213, 88, 6, 1, 37, 215, 152, 206, - 213, 88, 4, 1, 37, 215, 152, 206, 213, 88, 6, 1, 37, 215, 152, 217, 18, - 88, 4, 1, 37, 215, 152, 217, 18, 88, 6, 1, 37, 215, 152, 215, 88, 88, 4, - 1, 37, 215, 152, 215, 88, 88, 6, 1, 37, 215, 152, 197, 124, 88, 4, 1, 37, - 215, 152, 197, 124, 88, 16, 225, 30, 88, 16, 219, 78, 209, 232, 88, 16, - 212, 220, 209, 232, 88, 16, 204, 252, 88, 16, 203, 90, 209, 232, 88, 16, - 224, 124, 209, 232, 88, 16, 206, 214, 206, 74, 88, 6, 1, 241, 43, 206, - 247, 88, 4, 1, 241, 43, 206, 247, 88, 6, 1, 241, 43, 234, 88, 88, 4, 1, - 241, 43, 234, 88, 88, 38, 216, 223, 57, 88, 38, 205, 116, 250, 186, 88, - 38, 205, 116, 222, 147, 88, 6, 1, 248, 108, 224, 128, 88, 4, 1, 248, 108, - 224, 128, 88, 37, 215, 152, 234, 216, 204, 226, 88, 37, 215, 152, 239, - 85, 211, 78, 78, 88, 37, 215, 152, 226, 65, 211, 78, 78, 88, 37, 215, - 152, 199, 102, 239, 58, 88, 191, 97, 232, 224, 88, 234, 216, 204, 226, - 88, 218, 184, 239, 58, 94, 4, 1, 251, 105, 94, 4, 1, 249, 92, 94, 4, 1, - 234, 92, 94, 4, 1, 239, 5, 94, 4, 1, 236, 229, 94, 4, 1, 199, 16, 94, 4, - 1, 195, 82, 94, 4, 1, 203, 114, 94, 4, 1, 226, 85, 94, 4, 1, 225, 16, 94, - 4, 1, 222, 221, 94, 4, 1, 220, 61, 94, 4, 1, 217, 210, 94, 4, 1, 214, - 118, 94, 4, 1, 213, 156, 94, 4, 1, 195, 70, 94, 4, 1, 210, 228, 94, 4, 1, - 208, 219, 94, 4, 1, 203, 101, 94, 4, 1, 200, 72, 94, 4, 1, 212, 253, 94, - 4, 1, 224, 133, 94, 4, 1, 233, 220, 94, 4, 1, 211, 143, 94, 4, 1, 206, - 211, 94, 4, 1, 245, 61, 94, 4, 1, 247, 141, 94, 4, 1, 225, 161, 94, 4, 1, - 244, 255, 94, 4, 1, 246, 255, 94, 4, 1, 196, 206, 94, 4, 1, 225, 176, 94, - 4, 1, 232, 241, 94, 4, 1, 232, 146, 94, 4, 1, 232, 57, 94, 4, 1, 197, - 109, 94, 4, 1, 232, 174, 94, 4, 1, 231, 180, 94, 4, 1, 196, 5, 94, 4, 1, - 251, 233, 202, 104, 1, 164, 202, 104, 1, 196, 125, 202, 104, 1, 196, 124, - 202, 104, 1, 196, 114, 202, 104, 1, 196, 112, 202, 104, 1, 248, 211, 252, - 23, 196, 107, 202, 104, 1, 196, 107, 202, 104, 1, 196, 122, 202, 104, 1, - 196, 119, 202, 104, 1, 196, 121, 202, 104, 1, 196, 120, 202, 104, 1, 196, - 29, 202, 104, 1, 196, 116, 202, 104, 1, 196, 105, 202, 104, 1, 201, 32, - 196, 105, 202, 104, 1, 196, 102, 202, 104, 1, 196, 110, 202, 104, 1, 248, - 211, 252, 23, 196, 110, 202, 104, 1, 201, 32, 196, 110, 202, 104, 1, 196, - 109, 202, 104, 1, 196, 129, 202, 104, 1, 196, 103, 202, 104, 1, 201, 32, - 196, 103, 202, 104, 1, 196, 92, 202, 104, 1, 201, 32, 196, 92, 202, 104, - 1, 196, 24, 202, 104, 1, 196, 71, 202, 104, 1, 251, 206, 196, 71, 202, - 104, 1, 201, 32, 196, 71, 202, 104, 1, 196, 101, 202, 104, 1, 196, 100, - 202, 104, 1, 196, 97, 202, 104, 1, 201, 32, 196, 111, 202, 104, 1, 201, - 32, 196, 95, 202, 104, 1, 196, 93, 202, 104, 1, 195, 217, 202, 104, 1, - 196, 90, 202, 104, 1, 196, 88, 202, 104, 1, 196, 113, 202, 104, 1, 201, - 32, 196, 113, 202, 104, 1, 250, 117, 196, 113, 202, 104, 1, 196, 87, 202, - 104, 1, 196, 85, 202, 104, 1, 196, 86, 202, 104, 1, 196, 84, 202, 104, 1, - 196, 83, 202, 104, 1, 196, 123, 202, 104, 1, 196, 81, 202, 104, 1, 196, - 79, 202, 104, 1, 196, 78, 202, 104, 1, 196, 75, 202, 104, 1, 196, 72, - 202, 104, 1, 203, 80, 196, 72, 202, 104, 1, 196, 70, 202, 104, 1, 196, - 69, 202, 104, 1, 196, 3, 202, 104, 73, 1, 223, 71, 78, 202, 104, 207, 91, - 78, 202, 104, 108, 225, 123, 35, 5, 222, 5, 35, 5, 218, 243, 35, 5, 209, - 224, 35, 5, 205, 192, 35, 5, 206, 197, 35, 5, 248, 114, 35, 5, 202, 22, - 35, 5, 244, 180, 35, 5, 216, 42, 35, 5, 215, 71, 35, 5, 233, 151, 214, - 189, 35, 5, 195, 10, 35, 5, 239, 25, 35, 5, 240, 9, 35, 5, 225, 127, 35, - 5, 202, 168, 35, 5, 245, 47, 35, 5, 212, 232, 35, 5, 212, 115, 35, 5, - 233, 235, 35, 5, 233, 231, 35, 5, 233, 232, 35, 5, 233, 233, 35, 5, 205, - 80, 35, 5, 205, 34, 35, 5, 205, 47, 35, 5, 205, 79, 35, 5, 205, 52, 35, - 5, 205, 53, 35, 5, 205, 39, 35, 5, 247, 79, 35, 5, 247, 58, 35, 5, 247, - 60, 35, 5, 247, 78, 35, 5, 247, 76, 35, 5, 247, 77, 35, 5, 247, 59, 35, - 5, 194, 228, 35, 5, 194, 206, 35, 5, 194, 219, 35, 5, 194, 227, 35, 5, - 194, 222, 35, 5, 194, 223, 35, 5, 194, 211, 35, 5, 247, 74, 35, 5, 247, - 61, 35, 5, 247, 63, 35, 5, 247, 73, 35, 5, 247, 71, 35, 5, 247, 72, 35, - 5, 247, 62, 35, 5, 211, 43, 35, 5, 211, 33, 35, 5, 211, 39, 35, 5, 211, - 42, 35, 5, 211, 40, 35, 5, 211, 41, 35, 5, 211, 38, 35, 5, 223, 109, 35, - 5, 223, 101, 35, 5, 223, 104, 35, 5, 223, 108, 35, 5, 223, 105, 35, 5, - 223, 106, 35, 5, 223, 102, 35, 5, 196, 164, 35, 5, 196, 151, 35, 5, 196, - 159, 35, 5, 196, 163, 35, 5, 196, 161, 35, 5, 196, 162, 35, 5, 196, 158, - 35, 5, 233, 26, 35, 5, 233, 16, 35, 5, 233, 19, 35, 5, 233, 25, 35, 5, - 233, 21, 35, 5, 233, 22, 35, 5, 233, 18, 38, 40, 1, 249, 8, 38, 40, 1, - 199, 118, 38, 40, 1, 233, 215, 38, 40, 1, 239, 251, 38, 40, 1, 195, 65, - 38, 40, 1, 195, 88, 38, 40, 1, 155, 38, 40, 1, 237, 6, 38, 40, 1, 236, - 240, 38, 40, 1, 236, 229, 38, 40, 1, 72, 38, 40, 1, 213, 91, 38, 40, 1, - 236, 162, 38, 40, 1, 236, 150, 38, 40, 1, 203, 68, 38, 40, 1, 142, 38, - 40, 1, 201, 107, 38, 40, 1, 245, 102, 38, 40, 1, 207, 50, 38, 40, 1, 207, - 2, 38, 40, 1, 235, 102, 38, 40, 1, 236, 146, 38, 40, 1, 63, 38, 40, 1, - 226, 146, 38, 40, 1, 239, 44, 38, 40, 1, 218, 202, 200, 87, 38, 40, 1, - 196, 84, 38, 40, 1, 195, 217, 38, 40, 1, 226, 4, 63, 38, 40, 1, 222, 46, - 195, 182, 38, 40, 1, 248, 170, 195, 182, 38, 40, 1, 226, 4, 248, 170, - 195, 182, 53, 251, 90, 204, 138, 220, 23, 53, 251, 90, 237, 249, 204, - 138, 220, 23, 50, 204, 138, 179, 53, 204, 138, 179, 50, 237, 249, 204, - 138, 179, 53, 237, 249, 204, 138, 179, 210, 214, 226, 27, 220, 23, 210, - 214, 237, 249, 226, 27, 220, 23, 237, 249, 201, 199, 220, 23, 50, 201, - 199, 179, 53, 201, 199, 179, 210, 214, 205, 94, 50, 210, 214, 214, 120, - 179, 53, 210, 214, 214, 120, 179, 237, 54, 241, 97, 213, 151, 235, 25, - 213, 151, 210, 89, 235, 25, 213, 151, 231, 3, 237, 249, 214, 184, 237, - 230, 251, 100, 200, 24, 251, 100, 237, 249, 210, 17, 251, 89, 52, 214, - 181, 231, 6, 226, 16, 226, 25, 213, 206, 248, 56, 231, 7, 3, 239, 149, - 202, 85, 3, 210, 3, 57, 50, 126, 213, 142, 179, 53, 126, 213, 142, 179, - 202, 85, 3, 76, 57, 202, 85, 3, 76, 60, 50, 83, 249, 79, 3, 211, 72, 53, - 83, 249, 79, 3, 211, 72, 201, 243, 50, 157, 179, 201, 243, 53, 157, 179, - 248, 84, 50, 157, 179, 248, 84, 53, 157, 179, 50, 206, 96, 118, 179, 53, - 206, 96, 118, 179, 50, 52, 213, 139, 53, 52, 213, 139, 99, 238, 250, 127, - 97, 76, 211, 212, 97, 76, 127, 99, 238, 250, 211, 212, 103, 235, 6, 76, - 211, 212, 235, 100, 76, 78, 210, 89, 211, 78, 78, 83, 202, 84, 210, 3, - 212, 109, 197, 9, 207, 91, 112, 238, 252, 163, 244, 158, 210, 214, 238, - 252, 210, 214, 244, 158, 163, 207, 105, 240, 118, 3, 50, 233, 69, 240, - 118, 3, 53, 233, 69, 163, 240, 117, 201, 243, 157, 208, 133, 55, 200, - 216, 240, 64, 202, 152, 240, 64, 204, 242, 234, 216, 204, 226, 83, 206, - 29, 238, 249, 197, 56, 83, 222, 74, 247, 122, 52, 231, 6, 210, 89, 244, - 158, 52, 221, 203, 211, 61, 78, 240, 65, 3, 50, 200, 27, 52, 204, 77, 78, - 226, 16, 126, 224, 220, 226, 16, 126, 224, 221, 3, 224, 221, 57, 126, - 224, 220, 126, 224, 221, 3, 238, 252, 52, 205, 19, 244, 158, 237, 249, - 205, 177, 201, 165, 240, 117, 219, 190, 244, 158, 213, 150, 78, 211, 211, - 236, 253, 78, 241, 98, 199, 102, 239, 58, 12, 44, 210, 119, 12, 44, 244, - 213, 12, 44, 208, 136, 100, 12, 44, 208, 136, 102, 12, 44, 208, 136, 134, - 12, 44, 213, 27, 12, 44, 248, 69, 12, 44, 203, 152, 12, 44, 224, 21, 100, - 12, 44, 224, 21, 102, 12, 44, 239, 55, 12, 44, 208, 140, 12, 44, 4, 100, - 12, 44, 4, 102, 12, 44, 222, 243, 100, 12, 44, 222, 243, 102, 12, 44, - 222, 243, 134, 12, 44, 222, 243, 136, 12, 44, 205, 212, 12, 44, 202, 156, - 12, 44, 205, 209, 100, 12, 44, 205, 209, 102, 12, 44, 232, 126, 100, 12, - 44, 232, 126, 102, 12, 44, 232, 208, 12, 44, 210, 203, 12, 44, 245, 44, - 12, 44, 204, 111, 12, 44, 218, 188, 12, 44, 239, 248, 12, 44, 218, 177, - 12, 44, 244, 231, 12, 44, 197, 128, 100, 12, 44, 197, 128, 102, 12, 44, - 235, 117, 12, 44, 213, 104, 100, 12, 44, 213, 104, 102, 12, 44, 206, 69, - 157, 201, 191, 201, 118, 12, 44, 241, 82, 12, 44, 239, 16, 12, 44, 225, - 208, 12, 44, 248, 107, 77, 244, 196, 12, 44, 236, 66, 12, 44, 205, 118, - 100, 12, 44, 205, 118, 102, 12, 44, 249, 94, 12, 44, 206, 76, 12, 44, - 247, 203, 206, 76, 12, 44, 217, 88, 100, 12, 44, 217, 88, 102, 12, 44, - 217, 88, 134, 12, 44, 217, 88, 136, 12, 44, 219, 149, 12, 44, 206, 249, - 12, 44, 210, 209, 12, 44, 236, 96, 12, 44, 214, 132, 12, 44, 248, 28, - 100, 12, 44, 248, 28, 102, 12, 44, 219, 198, 12, 44, 218, 183, 12, 44, - 233, 103, 100, 12, 44, 233, 103, 102, 12, 44, 233, 103, 134, 12, 44, 202, - 102, 12, 44, 244, 195, 12, 44, 197, 89, 100, 12, 44, 197, 89, 102, 12, - 44, 247, 203, 208, 129, 12, 44, 206, 69, 231, 101, 12, 44, 231, 101, 12, - 44, 247, 203, 205, 131, 12, 44, 247, 203, 206, 244, 12, 44, 235, 36, 12, - 44, 247, 203, 247, 98, 12, 44, 206, 69, 197, 150, 12, 44, 197, 151, 100, - 12, 44, 197, 151, 102, 12, 44, 244, 234, 12, 44, 247, 203, 233, 134, 12, - 44, 181, 100, 12, 44, 181, 102, 12, 44, 247, 203, 221, 239, 12, 44, 247, - 203, 234, 73, 12, 44, 218, 172, 100, 12, 44, 218, 172, 102, 12, 44, 210, - 216, 12, 44, 248, 117, 12, 44, 247, 203, 203, 107, 222, 189, 12, 44, 247, - 203, 222, 191, 12, 44, 247, 203, 197, 50, 12, 44, 247, 203, 235, 54, 12, - 44, 237, 65, 100, 12, 44, 237, 65, 102, 12, 44, 237, 65, 134, 12, 44, - 247, 203, 237, 64, 12, 44, 232, 136, 12, 44, 247, 203, 231, 97, 12, 44, - 248, 103, 12, 44, 233, 199, 12, 44, 247, 203, 235, 110, 12, 44, 247, 203, - 248, 155, 12, 44, 247, 203, 208, 233, 12, 44, 206, 69, 197, 79, 12, 44, - 206, 69, 196, 61, 12, 44, 247, 203, 234, 235, 12, 44, 225, 215, 236, 101, - 12, 44, 247, 203, 236, 101, 12, 44, 225, 215, 201, 244, 12, 44, 247, 203, - 201, 244, 12, 44, 225, 215, 237, 222, 12, 44, 247, 203, 237, 222, 12, 44, - 201, 1, 12, 44, 225, 215, 201, 1, 12, 44, 247, 203, 201, 1, 79, 44, 100, - 79, 44, 222, 74, 79, 44, 238, 252, 79, 44, 205, 248, 79, 44, 208, 135, - 79, 44, 122, 79, 44, 102, 79, 44, 222, 103, 79, 44, 220, 61, 79, 44, 222, - 168, 79, 44, 236, 203, 79, 44, 171, 79, 44, 135, 248, 69, 79, 44, 241, - 85, 79, 44, 230, 200, 79, 44, 203, 152, 79, 44, 192, 248, 69, 79, 44, - 224, 20, 79, 44, 212, 57, 79, 44, 196, 255, 79, 44, 205, 107, 79, 44, 53, - 192, 248, 69, 79, 44, 232, 58, 236, 224, 79, 44, 203, 23, 79, 44, 239, - 55, 79, 44, 208, 140, 79, 44, 244, 213, 79, 44, 212, 7, 79, 44, 251, 215, - 79, 44, 218, 163, 79, 44, 236, 224, 79, 44, 237, 71, 79, 44, 208, 168, - 79, 44, 233, 143, 79, 44, 233, 144, 205, 226, 79, 44, 236, 100, 79, 44, - 248, 169, 79, 44, 197, 21, 79, 44, 245, 65, 79, 44, 209, 205, 79, 44, - 226, 81, 79, 44, 205, 224, 79, 44, 222, 242, 79, 44, 241, 95, 79, 44, - 205, 98, 79, 44, 218, 168, 79, 44, 209, 246, 79, 44, 197, 6, 79, 44, 214, - 109, 79, 44, 201, 9, 79, 44, 237, 202, 79, 44, 206, 182, 202, 156, 79, - 44, 237, 249, 244, 213, 79, 44, 181, 204, 202, 79, 44, 99, 232, 183, 79, - 44, 206, 188, 79, 44, 248, 76, 79, 44, 205, 208, 79, 44, 248, 35, 79, 44, - 204, 241, 79, 44, 232, 125, 79, 44, 232, 225, 79, 44, 239, 0, 79, 44, - 232, 208, 79, 44, 248, 56, 79, 44, 210, 203, 79, 44, 208, 153, 79, 44, - 239, 87, 79, 44, 250, 122, 79, 44, 205, 94, 79, 44, 216, 17, 79, 44, 204, - 111, 79, 44, 208, 180, 79, 44, 218, 188, 79, 44, 201, 190, 79, 44, 223, - 67, 79, 44, 204, 226, 79, 44, 239, 248, 79, 44, 197, 104, 79, 44, 239, - 28, 216, 17, 79, 44, 244, 154, 79, 44, 234, 209, 79, 44, 244, 225, 79, - 44, 204, 247, 79, 44, 197, 127, 79, 44, 235, 117, 79, 44, 244, 221, 79, - 44, 235, 195, 79, 44, 52, 196, 222, 79, 44, 157, 201, 191, 201, 118, 79, - 44, 205, 239, 79, 44, 235, 207, 79, 44, 241, 82, 79, 44, 239, 16, 79, 44, - 212, 3, 79, 44, 225, 208, 79, 44, 219, 172, 79, 44, 202, 83, 79, 44, 204, - 58, 79, 44, 222, 97, 79, 44, 200, 2, 79, 44, 235, 150, 79, 44, 248, 107, - 77, 244, 196, 79, 44, 206, 102, 79, 44, 237, 249, 203, 15, 79, 44, 197, - 73, 79, 44, 206, 1, 79, 44, 239, 74, 79, 44, 236, 66, 79, 44, 205, 134, - 79, 44, 51, 79, 44, 204, 228, 79, 44, 205, 117, 79, 44, 201, 216, 79, 44, - 233, 112, 79, 44, 247, 84, 79, 44, 205, 12, 79, 44, 249, 94, 79, 44, 210, - 60, 79, 44, 206, 76, 79, 44, 225, 200, 79, 44, 217, 87, 79, 44, 206, 249, - 79, 44, 235, 183, 79, 44, 214, 132, 79, 44, 251, 99, 79, 44, 212, 131, - 79, 44, 237, 75, 79, 44, 248, 27, 79, 44, 219, 198, 79, 44, 219, 16, 79, - 44, 207, 112, 79, 44, 250, 220, 79, 44, 218, 183, 79, 44, 201, 249, 79, - 44, 214, 79, 79, 44, 248, 111, 79, 44, 204, 224, 79, 44, 244, 166, 79, - 44, 233, 102, 79, 44, 202, 102, 79, 44, 226, 44, 79, 44, 248, 123, 79, - 44, 197, 151, 236, 224, 79, 44, 244, 195, 79, 44, 197, 88, 79, 44, 208, - 129, 79, 44, 231, 101, 79, 44, 205, 131, 79, 44, 199, 144, 79, 44, 249, - 3, 79, 44, 212, 183, 79, 44, 249, 124, 79, 44, 206, 244, 79, 44, 210, - 156, 79, 44, 209, 117, 79, 44, 235, 36, 79, 44, 248, 109, 79, 44, 247, - 98, 79, 44, 248, 140, 79, 44, 218, 185, 79, 44, 197, 150, 79, 44, 244, - 234, 79, 44, 197, 46, 79, 44, 239, 66, 79, 44, 199, 17, 79, 44, 233, 134, - 79, 44, 221, 239, 79, 44, 234, 73, 79, 44, 218, 171, 79, 44, 205, 247, - 79, 44, 206, 182, 203, 134, 248, 155, 79, 44, 210, 216, 79, 44, 248, 117, - 79, 44, 196, 245, 79, 44, 235, 232, 79, 44, 222, 189, 79, 44, 203, 107, - 222, 189, 79, 44, 222, 185, 79, 44, 205, 161, 79, 44, 222, 191, 79, 44, - 197, 50, 79, 44, 235, 54, 79, 44, 237, 64, 79, 44, 232, 136, 79, 44, 234, - 251, 79, 44, 231, 97, 79, 44, 248, 103, 79, 44, 203, 119, 79, 44, 232, - 232, 79, 44, 235, 143, 79, 44, 209, 10, 197, 46, 79, 44, 247, 86, 79, 44, - 233, 199, 79, 44, 235, 110, 79, 44, 248, 155, 79, 44, 208, 233, 79, 44, - 239, 233, 79, 44, 197, 79, 79, 44, 232, 101, 79, 44, 196, 61, 79, 44, - 219, 27, 79, 44, 248, 135, 79, 44, 236, 236, 79, 44, 234, 235, 79, 44, - 201, 162, 79, 44, 237, 205, 79, 44, 210, 197, 79, 44, 216, 19, 79, 44, - 236, 101, 79, 44, 201, 244, 79, 44, 237, 222, 79, 44, 201, 1, 79, 44, - 235, 57, 143, 239, 192, 190, 50, 202, 30, 210, 22, 143, 239, 192, 190, - 90, 202, 30, 60, 143, 239, 192, 190, 50, 202, 30, 112, 26, 210, 22, 143, - 239, 192, 190, 90, 202, 30, 112, 26, 60, 143, 239, 192, 190, 234, 216, - 204, 81, 143, 239, 192, 190, 204, 82, 234, 234, 57, 143, 239, 192, 190, - 204, 82, 234, 234, 60, 143, 239, 192, 190, 204, 82, 234, 234, 222, 183, - 143, 239, 192, 190, 204, 82, 234, 234, 200, 33, 222, 183, 143, 239, 192, - 190, 204, 82, 234, 234, 200, 33, 210, 22, 143, 239, 192, 190, 204, 82, - 234, 234, 221, 202, 222, 183, 143, 239, 192, 190, 214, 23, 143, 205, 148, - 143, 244, 158, 143, 234, 216, 204, 226, 239, 63, 78, 225, 201, 226, 64, - 205, 11, 105, 143, 225, 231, 78, 143, 244, 198, 78, 143, 31, 195, 79, 50, - 251, 90, 179, 53, 251, 90, 179, 50, 52, 251, 90, 179, 53, 52, 251, 90, - 179, 50, 241, 101, 179, 53, 241, 101, 179, 50, 59, 241, 101, 179, 53, 59, - 241, 101, 179, 50, 58, 222, 146, 179, 53, 58, 222, 146, 179, 212, 71, 78, - 234, 12, 78, 50, 201, 231, 206, 245, 179, 53, 201, 231, 206, 245, 179, - 50, 59, 222, 146, 179, 53, 59, 222, 146, 179, 50, 59, 201, 231, 206, 245, - 179, 53, 59, 201, 231, 206, 245, 179, 50, 59, 47, 179, 53, 59, 47, 179, - 197, 123, 240, 64, 210, 89, 52, 212, 19, 211, 61, 78, 52, 212, 19, 211, - 61, 78, 126, 52, 212, 19, 211, 61, 78, 212, 71, 117, 235, 232, 232, 180, - 215, 141, 100, 232, 180, 215, 141, 102, 232, 180, 215, 141, 134, 232, - 180, 215, 141, 136, 232, 180, 215, 141, 146, 232, 180, 215, 141, 167, - 232, 180, 215, 141, 178, 232, 180, 215, 141, 171, 232, 180, 215, 141, - 182, 143, 222, 127, 152, 78, 143, 209, 250, 152, 78, 143, 239, 201, 152, - 78, 143, 236, 202, 152, 78, 29, 206, 62, 76, 152, 78, 29, 52, 76, 152, - 78, 197, 119, 240, 64, 83, 225, 15, 210, 120, 78, 83, 225, 15, 210, 120, - 3, 198, 244, 205, 162, 78, 83, 225, 15, 210, 120, 117, 200, 33, 232, 224, - 83, 225, 15, 210, 120, 3, 198, 244, 205, 162, 117, 200, 33, 232, 224, 83, - 225, 15, 210, 120, 117, 221, 202, 232, 224, 46, 212, 71, 78, 143, 203, - 36, 222, 75, 235, 180, 207, 91, 105, 232, 180, 215, 141, 203, 23, 232, - 180, 215, 141, 200, 234, 232, 180, 215, 141, 202, 177, 83, 143, 225, 231, - 78, 220, 4, 78, 213, 133, 251, 126, 78, 143, 62, 226, 67, 143, 157, 235, - 136, 205, 148, 188, 1, 4, 63, 188, 1, 63, 188, 1, 4, 68, 188, 1, 68, 188, + 113, 201, 210, 58, 50, 222, 236, 219, 157, 59, 50, 222, 236, 219, 157, + 237, 215, 205, 228, 55, 85, 59, 237, 234, 201, 180, 50, 244, 203, 236, + 199, 103, 208, 230, 235, 213, 239, 147, 226, 87, 59, 244, 250, 226, 87, + 58, 205, 94, 58, 201, 144, 210, 100, 50, 236, 198, 210, 100, 50, 236, + 197, 250, 173, 16, 36, 200, 16, 85, 244, 250, 3, 204, 196, 26, 99, 238, + 251, 57, 213, 54, 210, 19, 226, 31, 213, 54, 222, 181, 226, 31, 213, 54, + 226, 17, 213, 54, 58, 241, 62, 214, 120, 206, 220, 206, 208, 206, 156, + 245, 22, 247, 94, 232, 32, 206, 30, 234, 46, 197, 37, 231, 69, 234, 46, + 3, 232, 186, 220, 44, 16, 36, 222, 94, 218, 169, 200, 77, 214, 120, 233, + 85, 235, 8, 235, 94, 226, 87, 231, 175, 235, 162, 208, 250, 47, 235, 7, + 241, 100, 206, 2, 230, 202, 206, 6, 213, 29, 3, 249, 103, 203, 15, 225, + 202, 249, 85, 105, 232, 131, 233, 97, 105, 234, 220, 211, 215, 241, 28, + 214, 120, 58, 205, 94, 59, 235, 94, 3, 231, 155, 112, 58, 204, 197, 58, + 209, 4, 208, 161, 200, 33, 248, 131, 208, 161, 58, 208, 161, 221, 203, + 248, 131, 208, 161, 59, 208, 161, 59, 85, 245, 102, 78, 203, 34, 222, 4, + 55, 203, 104, 237, 214, 251, 187, 236, 194, 210, 215, 235, 106, 210, 215, + 232, 209, 199, 32, 232, 209, 196, 246, 232, 209, 221, 203, 53, 213, 64, + 213, 64, 200, 33, 53, 213, 64, 59, 216, 212, 58, 216, 212, 245, 102, 78, + 85, 245, 102, 78, 218, 118, 196, 222, 85, 218, 118, 196, 222, 249, 99, + 196, 222, 85, 249, 99, 196, 222, 214, 30, 32, 241, 61, 85, 32, 241, 61, + 192, 247, 37, 241, 61, 85, 192, 247, 37, 241, 61, 8, 241, 61, 207, 37, + 59, 8, 241, 61, 214, 30, 8, 241, 61, 220, 64, 241, 61, 205, 8, 77, 240, + 58, 235, 7, 203, 53, 250, 179, 235, 7, 249, 100, 250, 179, 85, 235, 7, + 249, 100, 250, 179, 235, 7, 244, 189, 250, 179, 58, 235, 7, 212, 109, + 205, 7, 59, 235, 7, 212, 109, 205, 7, 205, 141, 204, 206, 214, 30, 59, + 205, 7, 46, 59, 205, 7, 192, 247, 37, 58, 205, 7, 58, 247, 37, 59, 205, + 7, 214, 30, 58, 205, 7, 85, 214, 30, 58, 205, 7, 212, 170, 205, 7, 207, + 37, 59, 205, 7, 85, 250, 179, 192, 247, 37, 250, 179, 237, 31, 205, 110, + 250, 179, 237, 31, 212, 109, 58, 205, 7, 237, 31, 212, 109, 212, 170, + 205, 7, 206, 29, 212, 109, 58, 205, 7, 237, 31, 212, 109, 210, 161, 58, + 205, 7, 85, 237, 31, 212, 109, 210, 161, 58, 205, 7, 200, 240, 212, 109, + 58, 205, 7, 206, 24, 212, 109, 250, 179, 203, 53, 250, 179, 192, 247, 37, + 203, 53, 250, 179, 85, 203, 53, 250, 179, 206, 29, 213, 17, 58, 26, 59, + 235, 65, 58, 235, 65, 59, 235, 65, 237, 31, 213, 17, 214, 30, 58, 235, + 65, 46, 192, 247, 37, 237, 31, 212, 109, 205, 7, 85, 203, 53, 212, 170, + 250, 179, 205, 204, 202, 101, 201, 173, 205, 204, 85, 245, 79, 205, 204, + 205, 143, 85, 205, 143, 249, 100, 250, 179, 237, 31, 203, 53, 211, 250, + 250, 179, 85, 237, 31, 203, 53, 211, 250, 250, 179, 241, 62, 78, 207, 37, + 59, 244, 249, 217, 104, 103, 241, 62, 78, 221, 203, 53, 237, 210, 59, + 205, 94, 200, 33, 53, 237, 210, 59, 205, 94, 221, 203, 53, 207, 37, 59, + 205, 94, 200, 33, 53, 207, 37, 59, 205, 94, 58, 211, 79, 117, 214, 59, + 59, 211, 79, 117, 214, 59, 59, 236, 90, 117, 214, 59, 58, 239, 141, 219, + 16, 59, 196, 222, 85, 236, 90, 117, 105, 175, 83, 154, 219, 190, 83, 154, + 85, 83, 154, 85, 206, 62, 163, 244, 160, 211, 62, 117, 214, 59, 85, 206, + 62, 244, 160, 211, 62, 117, 214, 59, 85, 52, 163, 244, 160, 211, 62, 117, + 214, 59, 85, 52, 244, 160, 211, 62, 117, 214, 59, 85, 126, 206, 62, 244, + 160, 211, 62, 117, 214, 59, 85, 126, 52, 244, 160, 211, 62, 117, 214, 59, + 241, 10, 204, 244, 213, 154, 2, 214, 59, 85, 236, 90, 117, 214, 59, 85, + 232, 127, 236, 90, 117, 214, 59, 85, 58, 232, 126, 209, 194, 85, 58, 232, + 127, 248, 5, 235, 66, 232, 126, 209, 194, 235, 66, 232, 127, 248, 5, 219, + 190, 50, 213, 141, 214, 59, 219, 190, 53, 213, 141, 214, 59, 219, 190, + 235, 79, 50, 213, 141, 214, 59, 219, 190, 235, 79, 53, 213, 141, 214, 59, + 219, 190, 222, 179, 251, 91, 248, 62, 214, 59, 219, 190, 210, 17, 251, + 91, 248, 62, 214, 59, 85, 222, 179, 251, 91, 211, 62, 117, 214, 59, 85, + 210, 17, 251, 91, 211, 62, 117, 214, 59, 85, 222, 179, 251, 91, 248, 62, + 214, 59, 85, 210, 17, 251, 91, 248, 62, 214, 59, 175, 50, 201, 231, 206, + 245, 248, 62, 214, 59, 175, 53, 201, 231, 206, 245, 248, 62, 214, 59, + 219, 190, 50, 241, 18, 248, 62, 214, 59, 219, 190, 53, 241, 18, 248, 62, + 214, 59, 239, 93, 217, 104, 46, 17, 100, 239, 93, 217, 104, 46, 17, 102, + 239, 93, 217, 104, 46, 17, 134, 239, 93, 217, 104, 46, 17, 136, 239, 93, + 217, 104, 46, 17, 146, 239, 93, 217, 104, 46, 17, 167, 239, 93, 217, 104, + 46, 17, 178, 239, 93, 217, 104, 46, 17, 171, 239, 93, 217, 104, 46, 17, + 182, 239, 93, 217, 104, 46, 31, 203, 23, 239, 93, 46, 45, 17, 100, 239, + 93, 46, 45, 17, 102, 239, 93, 46, 45, 17, 134, 239, 93, 46, 45, 17, 136, + 239, 93, 46, 45, 17, 146, 239, 93, 46, 45, 17, 167, 239, 93, 46, 45, 17, + 178, 239, 93, 46, 45, 17, 171, 239, 93, 46, 45, 17, 182, 239, 93, 46, 45, + 31, 203, 23, 239, 93, 217, 104, 46, 45, 17, 100, 239, 93, 217, 104, 46, + 45, 17, 102, 239, 93, 217, 104, 46, 45, 17, 134, 239, 93, 217, 104, 46, + 45, 17, 136, 239, 93, 217, 104, 46, 45, 17, 146, 239, 93, 217, 104, 46, + 45, 17, 167, 239, 93, 217, 104, 46, 45, 17, 178, 239, 93, 217, 104, 46, + 45, 17, 171, 239, 93, 217, 104, 46, 45, 17, 182, 239, 93, 217, 104, 46, + 45, 31, 203, 23, 85, 197, 61, 91, 51, 85, 98, 55, 85, 219, 16, 55, 85, + 239, 54, 55, 85, 205, 159, 237, 69, 51, 85, 91, 51, 85, 173, 237, 69, 51, + 237, 225, 212, 111, 91, 51, 85, 209, 186, 91, 51, 201, 179, 91, 51, 85, + 201, 179, 91, 51, 240, 64, 201, 179, 91, 51, 85, 240, 64, 201, 179, 91, + 51, 58, 91, 51, 202, 154, 201, 241, 91, 250, 217, 202, 154, 248, 83, 91, + 250, 217, 58, 91, 250, 217, 85, 58, 241, 10, 237, 231, 26, 91, 51, 85, + 58, 241, 10, 200, 24, 26, 91, 51, 205, 91, 58, 91, 51, 85, 241, 154, 58, + 91, 51, 210, 16, 59, 91, 51, 222, 178, 59, 91, 51, 249, 137, 207, 37, 59, + 91, 51, 234, 232, 207, 37, 59, 91, 51, 85, 221, 203, 210, 15, 59, 91, 51, + 85, 200, 33, 210, 15, 59, 91, 51, 216, 15, 221, 203, 210, 15, 59, 91, 51, + 241, 18, 221, 225, 216, 15, 200, 33, 210, 15, 59, 91, 51, 46, 85, 59, 91, + 51, 197, 72, 91, 51, 248, 135, 205, 159, 237, 69, 51, 248, 135, 91, 51, + 248, 135, 173, 237, 69, 51, 85, 248, 135, 205, 159, 237, 69, 51, 85, 248, + 135, 91, 51, 85, 248, 135, 173, 237, 69, 51, 203, 55, 91, 51, 85, 203, + 54, 91, 51, 197, 99, 91, 51, 85, 197, 99, 91, 51, 214, 87, 91, 51, 52, + 241, 18, 221, 225, 115, 239, 103, 251, 90, 59, 201, 181, 241, 132, 4, 59, + 201, 180, 213, 32, 192, 204, 141, 192, 204, 93, 50, 209, 79, 249, 123, + 239, 218, 53, 209, 79, 249, 123, 239, 218, 214, 73, 3, 76, 226, 41, 210, + 90, 205, 178, 212, 34, 204, 141, 204, 94, 212, 34, 205, 177, 83, 249, 80, + 3, 231, 155, 106, 13, 209, 250, 239, 146, 181, 239, 53, 13, 235, 213, + 239, 146, 103, 221, 249, 251, 100, 103, 221, 249, 214, 72, 59, 239, 141, + 3, 247, 35, 238, 253, 26, 3, 238, 253, 237, 0, 77, 214, 85, 200, 23, 221, + 203, 53, 241, 102, 3, 238, 253, 200, 33, 50, 241, 102, 3, 238, 253, 50, + 214, 32, 225, 127, 53, 214, 32, 225, 127, 234, 217, 214, 32, 225, 127, + 222, 228, 124, 203, 147, 222, 228, 135, 203, 147, 50, 26, 53, 52, 201, 3, + 50, 26, 53, 203, 147, 50, 218, 122, 181, 53, 203, 147, 181, 50, 203, 147, + 124, 203, 148, 3, 244, 250, 57, 221, 199, 239, 60, 247, 219, 231, 155, + 209, 124, 59, 241, 153, 239, 140, 59, 241, 153, 239, 141, 3, 107, 202, + 111, 59, 241, 153, 239, 141, 3, 91, 202, 111, 59, 47, 3, 107, 202, 111, + 59, 47, 3, 91, 202, 111, 13, 50, 59, 47, 179, 13, 53, 59, 47, 179, 13, + 50, 251, 91, 179, 13, 53, 251, 91, 179, 13, 50, 52, 251, 91, 179, 13, 53, + 52, 251, 91, 179, 13, 50, 59, 201, 231, 206, 245, 179, 13, 53, 59, 201, + 231, 206, 245, 179, 13, 50, 235, 79, 213, 140, 13, 53, 235, 79, 213, 140, + 200, 24, 211, 90, 51, 237, 231, 211, 90, 51, 251, 65, 234, 85, 244, 250, + 51, 244, 205, 234, 85, 244, 250, 51, 53, 61, 3, 46, 212, 125, 181, 107, + 51, 181, 91, 51, 181, 50, 53, 51, 181, 107, 52, 51, 181, 91, 52, 51, 181, + 50, 53, 52, 51, 181, 107, 61, 234, 235, 154, 181, 91, 61, 234, 235, 154, + 181, 107, 52, 61, 234, 235, 154, 181, 91, 52, 61, 234, 235, 154, 181, 91, + 205, 87, 51, 64, 65, 248, 129, 64, 65, 238, 249, 64, 65, 238, 121, 64, + 65, 238, 248, 64, 65, 238, 57, 64, 65, 238, 184, 64, 65, 238, 120, 64, + 65, 238, 247, 64, 65, 238, 25, 64, 65, 238, 152, 64, 65, 238, 88, 64, 65, + 238, 215, 64, 65, 238, 56, 64, 65, 238, 183, 64, 65, 238, 119, 64, 65, + 238, 246, 64, 65, 238, 9, 64, 65, 238, 136, 64, 65, 238, 72, 64, 65, 238, + 199, 64, 65, 238, 40, 64, 65, 238, 167, 64, 65, 238, 103, 64, 65, 238, + 230, 64, 65, 238, 24, 64, 65, 238, 151, 64, 65, 238, 87, 64, 65, 238, + 214, 64, 65, 238, 55, 64, 65, 238, 182, 64, 65, 238, 118, 64, 65, 238, + 245, 64, 65, 238, 1, 64, 65, 238, 128, 64, 65, 238, 64, 64, 65, 238, 191, + 64, 65, 238, 32, 64, 65, 238, 159, 64, 65, 238, 95, 64, 65, 238, 222, 64, + 65, 238, 16, 64, 65, 238, 143, 64, 65, 238, 79, 64, 65, 238, 206, 64, 65, + 238, 47, 64, 65, 238, 174, 64, 65, 238, 110, 64, 65, 238, 237, 64, 65, + 238, 8, 64, 65, 238, 135, 64, 65, 238, 71, 64, 65, 238, 198, 64, 65, 238, + 39, 64, 65, 238, 166, 64, 65, 238, 102, 64, 65, 238, 229, 64, 65, 238, + 23, 64, 65, 238, 150, 64, 65, 238, 86, 64, 65, 238, 213, 64, 65, 238, 54, + 64, 65, 238, 181, 64, 65, 238, 117, 64, 65, 238, 244, 64, 65, 237, 253, + 64, 65, 238, 124, 64, 65, 238, 60, 64, 65, 238, 187, 64, 65, 238, 28, 64, + 65, 238, 155, 64, 65, 238, 91, 64, 65, 238, 218, 64, 65, 238, 12, 64, 65, + 238, 139, 64, 65, 238, 75, 64, 65, 238, 202, 64, 65, 238, 43, 64, 65, + 238, 170, 64, 65, 238, 106, 64, 65, 238, 233, 64, 65, 238, 4, 64, 65, + 238, 131, 64, 65, 238, 67, 64, 65, 238, 194, 64, 65, 238, 35, 64, 65, + 238, 162, 64, 65, 238, 98, 64, 65, 238, 225, 64, 65, 238, 19, 64, 65, + 238, 146, 64, 65, 238, 82, 64, 65, 238, 209, 64, 65, 238, 50, 64, 65, + 238, 177, 64, 65, 238, 113, 64, 65, 238, 240, 64, 65, 238, 0, 64, 65, + 238, 127, 64, 65, 238, 63, 64, 65, 238, 190, 64, 65, 238, 31, 64, 65, + 238, 158, 64, 65, 238, 94, 64, 65, 238, 221, 64, 65, 238, 15, 64, 65, + 238, 142, 64, 65, 238, 78, 64, 65, 238, 205, 64, 65, 238, 46, 64, 65, + 238, 173, 64, 65, 238, 109, 64, 65, 238, 236, 64, 65, 238, 7, 64, 65, + 238, 134, 64, 65, 238, 70, 64, 65, 238, 197, 64, 65, 238, 38, 64, 65, + 238, 165, 64, 65, 238, 101, 64, 65, 238, 228, 64, 65, 238, 22, 64, 65, + 238, 149, 64, 65, 238, 85, 64, 65, 238, 212, 64, 65, 238, 53, 64, 65, + 238, 180, 64, 65, 238, 116, 64, 65, 238, 243, 64, 65, 237, 251, 64, 65, + 238, 122, 64, 65, 238, 58, 64, 65, 238, 185, 64, 65, 238, 26, 64, 65, + 238, 153, 64, 65, 238, 89, 64, 65, 238, 216, 64, 65, 238, 10, 64, 65, + 238, 137, 64, 65, 238, 73, 64, 65, 238, 200, 64, 65, 238, 41, 64, 65, + 238, 168, 64, 65, 238, 104, 64, 65, 238, 231, 64, 65, 238, 2, 64, 65, + 238, 129, 64, 65, 238, 65, 64, 65, 238, 192, 64, 65, 238, 33, 64, 65, + 238, 160, 64, 65, 238, 96, 64, 65, 238, 223, 64, 65, 238, 17, 64, 65, + 238, 144, 64, 65, 238, 80, 64, 65, 238, 207, 64, 65, 238, 48, 64, 65, + 238, 175, 64, 65, 238, 111, 64, 65, 238, 238, 64, 65, 237, 254, 64, 65, + 238, 125, 64, 65, 238, 61, 64, 65, 238, 188, 64, 65, 238, 29, 64, 65, + 238, 156, 64, 65, 238, 92, 64, 65, 238, 219, 64, 65, 238, 13, 64, 65, + 238, 140, 64, 65, 238, 76, 64, 65, 238, 203, 64, 65, 238, 44, 64, 65, + 238, 171, 64, 65, 238, 107, 64, 65, 238, 234, 64, 65, 238, 5, 64, 65, + 238, 132, 64, 65, 238, 68, 64, 65, 238, 195, 64, 65, 238, 36, 64, 65, + 238, 163, 64, 65, 238, 99, 64, 65, 238, 226, 64, 65, 238, 20, 64, 65, + 238, 147, 64, 65, 238, 83, 64, 65, 238, 210, 64, 65, 238, 51, 64, 65, + 238, 178, 64, 65, 238, 114, 64, 65, 238, 241, 64, 65, 237, 252, 64, 65, + 238, 123, 64, 65, 238, 59, 64, 65, 238, 186, 64, 65, 238, 27, 64, 65, + 238, 154, 64, 65, 238, 90, 64, 65, 238, 217, 64, 65, 238, 11, 64, 65, + 238, 138, 64, 65, 238, 74, 64, 65, 238, 201, 64, 65, 238, 42, 64, 65, + 238, 169, 64, 65, 238, 105, 64, 65, 238, 232, 64, 65, 238, 3, 64, 65, + 238, 130, 64, 65, 238, 66, 64, 65, 238, 193, 64, 65, 238, 34, 64, 65, + 238, 161, 64, 65, 238, 97, 64, 65, 238, 224, 64, 65, 238, 18, 64, 65, + 238, 145, 64, 65, 238, 81, 64, 65, 238, 208, 64, 65, 238, 49, 64, 65, + 238, 176, 64, 65, 238, 112, 64, 65, 238, 239, 64, 65, 237, 255, 64, 65, + 238, 126, 64, 65, 238, 62, 64, 65, 238, 189, 64, 65, 238, 30, 64, 65, + 238, 157, 64, 65, 238, 93, 64, 65, 238, 220, 64, 65, 238, 14, 64, 65, + 238, 141, 64, 65, 238, 77, 64, 65, 238, 204, 64, 65, 238, 45, 64, 65, + 238, 172, 64, 65, 238, 108, 64, 65, 238, 235, 64, 65, 238, 6, 64, 65, + 238, 133, 64, 65, 238, 69, 64, 65, 238, 196, 64, 65, 238, 37, 64, 65, + 238, 164, 64, 65, 238, 100, 64, 65, 238, 227, 64, 65, 238, 21, 64, 65, + 238, 148, 64, 65, 238, 84, 64, 65, 238, 211, 64, 65, 238, 52, 64, 65, + 238, 179, 64, 65, 238, 115, 64, 65, 238, 242, 91, 200, 215, 61, 3, 83, + 106, 91, 200, 215, 61, 3, 52, 83, 106, 107, 52, 61, 3, 83, 106, 91, 52, + 61, 3, 83, 106, 50, 53, 52, 61, 3, 83, 106, 91, 200, 215, 61, 234, 235, + 154, 107, 52, 61, 234, 235, 154, 91, 52, 61, 234, 235, 154, 237, 231, 61, + 3, 231, 155, 106, 200, 24, 61, 3, 231, 155, 106, 200, 24, 201, 165, 51, + 237, 231, 201, 165, 51, 107, 52, 240, 66, 51, 91, 52, 240, 66, 51, 107, + 201, 165, 240, 66, 51, 91, 201, 165, 240, 66, 51, 91, 200, 215, 201, 165, + 240, 66, 51, 91, 61, 3, 237, 250, 204, 243, 200, 24, 61, 202, 30, 154, + 237, 231, 61, 202, 30, 154, 91, 61, 3, 203, 136, 3, 83, 106, 91, 61, 3, + 203, 136, 3, 52, 83, 106, 91, 200, 215, 61, 3, 203, 135, 91, 200, 215, + 61, 3, 203, 136, 3, 83, 106, 91, 200, 215, 61, 3, 203, 136, 3, 52, 83, + 106, 107, 250, 219, 91, 250, 219, 107, 52, 250, 219, 91, 52, 250, 219, + 107, 61, 202, 30, 58, 239, 140, 91, 61, 202, 30, 58, 239, 140, 107, 61, + 234, 235, 249, 80, 202, 30, 58, 239, 140, 91, 61, 234, 235, 249, 80, 202, + 30, 58, 239, 140, 173, 197, 89, 26, 205, 159, 237, 69, 51, 173, 237, 69, + 26, 205, 159, 197, 89, 51, 173, 197, 89, 61, 3, 122, 173, 237, 69, 61, 3, + 122, 205, 159, 237, 69, 61, 3, 122, 205, 159, 197, 89, 61, 3, 122, 173, + 197, 89, 61, 26, 173, 237, 69, 51, 173, 237, 69, 61, 26, 205, 159, 237, + 69, 51, 205, 159, 237, 69, 61, 26, 205, 159, 197, 89, 51, 205, 159, 197, + 89, 61, 26, 173, 197, 89, 51, 209, 250, 239, 147, 241, 55, 235, 213, 239, + 146, 235, 213, 239, 147, 241, 55, 209, 250, 239, 146, 205, 159, 237, 69, + 61, 241, 55, 173, 237, 69, 51, 173, 237, 69, 61, 241, 55, 205, 159, 237, + 69, 51, 235, 213, 239, 147, 241, 55, 173, 237, 69, 51, 209, 250, 239, + 147, 241, 55, 205, 159, 237, 69, 51, 173, 237, 69, 61, 241, 55, 173, 197, + 89, 51, 173, 197, 89, 61, 241, 55, 173, 237, 69, 51, 197, 123, 61, 212, + 107, 239, 83, 210, 22, 61, 212, 107, 91, 202, 209, 241, 8, 200, 23, 61, + 212, 107, 91, 202, 209, 241, 8, 237, 230, 61, 212, 107, 237, 231, 202, + 209, 241, 8, 222, 174, 61, 212, 107, 237, 231, 202, 209, 241, 8, 210, 11, + 210, 14, 250, 254, 244, 205, 51, 222, 177, 250, 254, 251, 65, 51, 201, + 243, 250, 254, 251, 65, 51, 248, 85, 250, 254, 251, 65, 51, 201, 243, + 250, 254, 244, 205, 61, 3, 219, 15, 201, 243, 250, 254, 251, 65, 61, 3, + 212, 125, 221, 203, 53, 207, 107, 244, 205, 51, 221, 203, 50, 207, 107, + 251, 65, 51, 251, 65, 244, 203, 244, 250, 51, 244, 205, 244, 203, 244, + 250, 51, 91, 61, 90, 206, 182, 107, 51, 107, 61, 90, 206, 182, 91, 51, + 206, 182, 91, 61, 90, 107, 51, 91, 61, 3, 98, 60, 107, 61, 3, 98, 60, 91, + 61, 202, 145, 196, 222, 50, 53, 61, 202, 145, 4, 244, 249, 200, 24, 200, + 215, 61, 234, 235, 4, 244, 249, 50, 165, 124, 53, 165, 135, 232, 168, 50, + 165, 135, 53, 165, 124, 232, 168, 124, 165, 53, 135, 165, 50, 232, 168, + 124, 165, 50, 135, 165, 53, 232, 168, 50, 165, 124, 53, 165, 124, 232, + 168, 124, 165, 53, 135, 165, 53, 232, 168, 50, 165, 135, 53, 165, 135, + 232, 168, 124, 165, 50, 135, 165, 50, 232, 168, 107, 232, 169, 3, 165, + 124, 202, 30, 154, 91, 232, 169, 3, 165, 124, 202, 30, 154, 200, 24, 232, + 169, 3, 165, 53, 202, 30, 154, 237, 231, 232, 169, 3, 165, 53, 202, 30, + 154, 107, 232, 169, 3, 165, 135, 202, 30, 154, 91, 232, 169, 3, 165, 135, + 202, 30, 154, 200, 24, 232, 169, 3, 165, 50, 202, 30, 154, 237, 231, 232, + 169, 3, 165, 50, 202, 30, 154, 107, 232, 169, 3, 165, 124, 234, 235, 154, + 91, 232, 169, 3, 165, 124, 234, 235, 154, 200, 24, 232, 169, 3, 165, 53, + 234, 235, 154, 237, 231, 232, 169, 3, 165, 53, 234, 235, 154, 107, 232, + 169, 3, 165, 135, 234, 235, 154, 91, 232, 169, 3, 165, 135, 234, 235, + 154, 200, 24, 232, 169, 3, 165, 50, 234, 235, 154, 237, 231, 232, 169, 3, + 165, 50, 234, 235, 154, 107, 232, 169, 3, 165, 124, 90, 107, 232, 169, 3, + 165, 237, 235, 200, 24, 232, 169, 3, 165, 50, 248, 210, 200, 24, 232, + 169, 3, 165, 210, 22, 91, 232, 169, 3, 165, 124, 90, 91, 232, 169, 3, + 165, 237, 235, 237, 231, 232, 169, 3, 165, 50, 248, 210, 237, 231, 232, + 169, 3, 165, 210, 22, 107, 232, 169, 3, 165, 124, 90, 91, 232, 169, 3, + 165, 200, 36, 107, 232, 169, 3, 165, 135, 90, 91, 232, 169, 3, 165, 237, + 235, 91, 232, 169, 3, 165, 124, 90, 107, 232, 169, 3, 165, 200, 36, 91, + 232, 169, 3, 165, 135, 90, 107, 232, 169, 3, 165, 237, 235, 107, 232, + 169, 3, 165, 124, 90, 181, 240, 65, 107, 232, 169, 3, 165, 135, 248, 227, + 181, 240, 65, 91, 232, 169, 3, 165, 124, 90, 181, 240, 65, 91, 232, 169, + 3, 165, 135, 248, 227, 181, 240, 65, 200, 24, 232, 169, 3, 165, 50, 248, + 210, 237, 231, 232, 169, 3, 165, 210, 22, 237, 231, 232, 169, 3, 165, 50, + 248, 210, 200, 24, 232, 169, 3, 165, 210, 22, 53, 52, 61, 3, 209, 185, + 232, 137, 236, 172, 2, 90, 91, 51, 202, 85, 214, 83, 90, 91, 51, 107, 61, + 90, 202, 85, 214, 82, 91, 61, 90, 202, 85, 214, 82, 91, 61, 90, 251, 139, + 180, 149, 222, 140, 90, 107, 51, 107, 61, 202, 145, 222, 139, 233, 94, + 90, 91, 51, 204, 142, 90, 91, 51, 107, 61, 202, 145, 204, 141, 204, 94, + 90, 107, 51, 50, 235, 112, 203, 135, 53, 235, 112, 203, 135, 124, 235, + 112, 203, 135, 135, 235, 112, 203, 135, 201, 165, 83, 249, 80, 239, 218, + 195, 159, 216, 17, 205, 105, 195, 159, 216, 17, 200, 201, 244, 168, 50, + 59, 241, 18, 179, 53, 59, 241, 18, 179, 50, 59, 213, 140, 53, 59, 213, + 140, 195, 159, 216, 17, 50, 226, 102, 179, 195, 159, 216, 17, 53, 226, + 102, 179, 195, 159, 216, 17, 50, 248, 162, 179, 195, 159, 216, 17, 53, + 248, 162, 179, 50, 47, 248, 62, 3, 200, 62, 53, 47, 248, 62, 3, 200, 62, + 50, 47, 248, 62, 3, 202, 112, 226, 87, 201, 243, 241, 101, 53, 47, 248, + 62, 3, 202, 112, 226, 87, 248, 85, 241, 101, 50, 47, 248, 62, 3, 202, + 112, 226, 87, 248, 85, 241, 101, 53, 47, 248, 62, 3, 202, 112, 226, 87, + 201, 243, 241, 101, 50, 251, 91, 248, 62, 3, 238, 253, 53, 251, 91, 248, + 62, 3, 238, 253, 50, 250, 254, 222, 140, 179, 53, 250, 254, 233, 94, 179, + 52, 50, 250, 254, 233, 94, 179, 52, 53, 250, 254, 222, 140, 179, 50, 58, + 201, 231, 206, 245, 179, 53, 58, 201, 231, 206, 245, 179, 237, 250, 235, + 169, 83, 195, 24, 222, 75, 219, 201, 251, 91, 214, 85, 222, 184, 53, 251, + 91, 199, 132, 3, 205, 94, 219, 201, 53, 251, 91, 3, 238, 253, 251, 91, 3, + 209, 81, 226, 41, 252, 10, 251, 90, 205, 127, 251, 91, 214, 85, 222, 184, + 205, 127, 251, 91, 214, 85, 200, 36, 163, 251, 90, 210, 89, 251, 90, 251, + 91, 3, 200, 62, 210, 89, 251, 91, 3, 200, 62, 214, 182, 251, 91, 214, 85, + 200, 36, 214, 182, 251, 91, 214, 85, 237, 235, 219, 201, 251, 91, 3, 192, + 250, 232, 236, 218, 226, 87, 61, 212, 107, 124, 26, 210, 22, 219, 201, + 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, 107, 124, 26, 222, + 184, 219, 201, 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, + 107, 135, 26, 210, 22, 219, 201, 251, 91, 3, 192, 250, 232, 236, 218, + 226, 87, 61, 212, 107, 135, 26, 222, 184, 219, 201, 251, 91, 3, 192, 250, + 232, 236, 218, 226, 87, 61, 212, 107, 53, 26, 200, 36, 219, 201, 251, 91, + 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, 107, 50, 26, 200, 36, 219, + 201, 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, 107, 53, 26, + 237, 235, 219, 201, 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, + 212, 107, 50, 26, 237, 235, 210, 89, 236, 232, 207, 76, 236, 232, 207, + 77, 3, 214, 26, 236, 232, 207, 77, 3, 4, 244, 250, 57, 236, 232, 207, 77, + 3, 53, 61, 57, 236, 232, 207, 77, 3, 50, 61, 57, 244, 250, 3, 231, 155, + 154, 46, 83, 154, 46, 213, 145, 46, 210, 90, 205, 177, 46, 213, 32, 244, + 250, 239, 60, 247, 219, 231, 155, 249, 80, 26, 201, 243, 157, 239, 60, + 247, 219, 83, 154, 244, 250, 3, 204, 96, 196, 222, 46, 251, 63, 239, 54, + 55, 124, 61, 202, 145, 244, 249, 46, 59, 248, 5, 46, 248, 5, 46, 222, + 139, 46, 233, 93, 244, 250, 3, 4, 244, 250, 202, 30, 202, 218, 210, 22, + 244, 250, 3, 99, 231, 155, 204, 184, 202, 30, 202, 218, 210, 22, 103, + 209, 250, 239, 147, 205, 248, 103, 235, 213, 239, 147, 205, 248, 103, + 250, 179, 103, 4, 244, 249, 103, 205, 94, 99, 225, 126, 205, 92, 201, + 181, 3, 76, 57, 201, 181, 3, 200, 62, 209, 81, 226, 87, 201, 180, 201, + 181, 3, 207, 84, 250, 169, 248, 84, 53, 201, 181, 90, 50, 201, 180, 50, + 201, 181, 248, 210, 83, 154, 83, 249, 80, 248, 210, 53, 201, 180, 248, + 72, 3, 50, 157, 248, 136, 248, 72, 3, 53, 157, 248, 136, 58, 248, 71, 24, + 3, 50, 157, 248, 136, 24, 3, 53, 157, 248, 136, 59, 231, 89, 58, 231, 89, + 50, 197, 56, 235, 169, 53, 197, 56, 235, 169, 50, 52, 197, 56, 235, 169, + 53, 52, 197, 56, 235, 169, 226, 79, 226, 63, 202, 108, 127, 226, 63, 226, + 64, 217, 106, 3, 83, 154, 237, 244, 218, 122, 47, 3, 241, 124, 214, 31, + 226, 76, 250, 202, 206, 144, 212, 5, 236, 172, 2, 26, 205, 250, 213, 145, + 236, 172, 2, 26, 205, 250, 213, 146, 3, 202, 85, 57, 230, 193, 202, 30, + 26, 205, 250, 213, 145, 233, 155, 205, 6, 202, 206, 237, 234, 201, 181, + 3, 50, 157, 248, 136, 237, 234, 201, 181, 3, 53, 157, 248, 136, 58, 239, + 141, 3, 135, 51, 58, 221, 198, 59, 244, 250, 3, 135, 51, 58, 244, 250, 3, + 135, 51, 236, 154, 59, 205, 94, 236, 154, 58, 205, 94, 236, 154, 59, 239, + 140, 236, 154, 58, 239, 140, 236, 154, 59, 244, 249, 236, 154, 58, 244, + 249, 209, 123, 210, 90, 205, 178, 214, 82, 205, 178, 3, 214, 26, 210, 90, + 205, 178, 3, 231, 155, 106, 248, 171, 205, 177, 248, 171, 210, 90, 205, + 177, 52, 212, 125, 201, 165, 212, 125, 222, 179, 241, 10, 251, 91, 179, + 210, 17, 241, 10, 251, 91, 179, 202, 69, 219, 13, 218, 54, 46, 76, 214, + 82, 218, 54, 46, 98, 214, 82, 218, 54, 46, 24, 214, 82, 218, 54, 200, 52, + 214, 83, 3, 238, 253, 218, 54, 200, 52, 214, 83, 3, 212, 125, 218, 54, + 47, 226, 24, 214, 82, 218, 54, 47, 200, 52, 214, 82, 99, 221, 249, 26, + 214, 82, 99, 221, 249, 214, 73, 214, 82, 218, 54, 24, 214, 82, 218, 219, + 99, 204, 117, 204, 115, 3, 226, 37, 211, 90, 226, 38, 214, 82, 235, 121, + 213, 134, 226, 37, 226, 38, 3, 52, 106, 226, 38, 250, 130, 3, 205, 248, + 244, 242, 234, 214, 251, 65, 226, 35, 222, 76, 226, 36, 3, 210, 162, 213, + 113, 250, 227, 212, 101, 222, 76, 226, 36, 3, 207, 107, 213, 113, 250, + 227, 212, 101, 222, 76, 226, 36, 216, 19, 226, 81, 202, 218, 212, 101, + 226, 38, 250, 227, 39, 212, 111, 214, 82, 211, 84, 226, 38, 214, 82, 226, + 38, 3, 107, 61, 3, 122, 226, 38, 3, 24, 55, 226, 38, 3, 226, 23, 226, 38, + 3, 200, 51, 226, 38, 3, 214, 26, 226, 38, 3, 200, 62, 225, 127, 222, 228, + 50, 201, 181, 214, 82, 195, 159, 216, 17, 208, 169, 241, 160, 195, 159, + 216, 17, 208, 169, 212, 166, 195, 159, 216, 17, 208, 169, 212, 0, 98, 2, + 3, 4, 244, 250, 57, 98, 2, 3, 244, 241, 252, 23, 57, 98, 2, 3, 202, 85, + 57, 98, 2, 3, 76, 60, 98, 2, 3, 202, 85, 60, 98, 2, 3, 204, 143, 102, 98, + 2, 3, 58, 201, 180, 219, 16, 2, 3, 244, 160, 57, 219, 16, 2, 3, 76, 60, + 219, 16, 2, 3, 235, 213, 238, 250, 219, 16, 2, 3, 209, 250, 238, 250, 98, + 2, 226, 87, 50, 157, 244, 249, 98, 2, 226, 87, 53, 157, 244, 249, 199, + 117, 214, 73, 241, 62, 212, 5, 218, 118, 2, 3, 76, 57, 218, 118, 2, 3, + 200, 62, 207, 104, 212, 6, 3, 248, 85, 244, 202, 205, 222, 212, 5, 218, + 118, 2, 226, 87, 50, 157, 244, 249, 218, 118, 2, 226, 87, 53, 157, 244, + 249, 46, 218, 118, 2, 3, 244, 241, 252, 22, 218, 118, 2, 226, 87, 52, + 244, 249, 46, 239, 54, 55, 98, 2, 226, 87, 201, 180, 219, 16, 2, 226, 87, + 201, 180, 218, 118, 2, 226, 87, 201, 180, 226, 32, 212, 5, 210, 12, 226, + 32, 212, 5, 195, 159, 216, 17, 210, 135, 241, 160, 251, 121, 214, 73, + 241, 108, 226, 24, 3, 238, 253, 200, 52, 3, 219, 16, 55, 200, 52, 3, 214, + 26, 226, 24, 3, 214, 26, 226, 24, 3, 221, 249, 251, 100, 200, 52, 3, 221, + 249, 214, 72, 200, 52, 90, 226, 23, 226, 24, 90, 200, 51, 200, 52, 90, + 249, 80, 90, 226, 23, 226, 24, 90, 249, 80, 90, 200, 51, 200, 52, 248, + 210, 26, 225, 126, 3, 200, 51, 226, 24, 248, 210, 26, 225, 126, 3, 226, + 23, 244, 203, 200, 52, 3, 207, 83, 244, 203, 226, 24, 3, 207, 83, 52, 47, + 226, 23, 52, 47, 200, 51, 244, 203, 200, 52, 3, 207, 84, 26, 205, 222, + 212, 5, 221, 249, 26, 3, 76, 57, 221, 249, 214, 73, 3, 76, 57, 52, 221, + 249, 251, 100, 52, 221, 249, 214, 72, 99, 226, 25, 221, 249, 251, 100, + 99, 226, 25, 221, 249, 214, 72, 205, 232, 222, 228, 214, 72, 205, 232, + 222, 228, 251, 100, 221, 249, 214, 73, 214, 22, 221, 249, 251, 100, 221, + 249, 26, 3, 112, 204, 243, 221, 249, 214, 73, 3, 112, 204, 243, 221, 249, + 26, 3, 231, 155, 240, 65, 221, 249, 214, 73, 3, 231, 155, 240, 65, 221, + 249, 26, 3, 52, 214, 26, 221, 249, 26, 3, 200, 62, 221, 249, 26, 3, 52, + 200, 62, 4, 199, 114, 3, 200, 62, 221, 249, 214, 73, 3, 52, 214, 26, 221, + 249, 214, 73, 3, 52, 200, 62, 195, 159, 216, 17, 239, 7, 251, 55, 195, + 159, 216, 17, 210, 205, 251, 55, 236, 172, 2, 3, 76, 60, 230, 193, 3, 76, + 57, 201, 165, 231, 155, 249, 80, 3, 52, 83, 106, 201, 165, 231, 155, 249, + 80, 3, 201, 165, 83, 106, 202, 85, 214, 83, 3, 76, 57, 202, 85, 214, 83, + 3, 209, 250, 238, 250, 206, 71, 219, 16, 206, 70, 241, 147, 3, 76, 57, + 236, 172, 3, 250, 179, 251, 139, 180, 202, 30, 3, 244, 241, 252, 22, 251, + 21, 180, 214, 73, 180, 149, 236, 172, 2, 90, 98, 55, 98, 2, 90, 236, 172, + 55, 236, 172, 2, 90, 202, 85, 214, 82, 52, 244, 169, 236, 173, 99, 241, + 140, 236, 172, 206, 85, 115, 241, 140, 236, 172, 206, 85, 236, 172, 2, 3, + 99, 238, 251, 90, 26, 99, 238, 251, 60, 236, 165, 3, 235, 7, 238, 251, + 57, 222, 140, 3, 244, 250, 226, 41, 233, 94, 3, 244, 250, 226, 41, 222, + 140, 3, 211, 79, 117, 57, 233, 94, 3, 211, 79, 117, 57, 222, 140, 214, + 73, 205, 250, 180, 149, 233, 94, 214, 73, 205, 250, 180, 149, 222, 140, + 214, 73, 205, 250, 180, 202, 30, 3, 76, 226, 41, 233, 94, 214, 73, 205, + 250, 180, 202, 30, 3, 76, 226, 41, 222, 140, 214, 73, 205, 250, 180, 202, + 30, 3, 76, 57, 233, 94, 214, 73, 205, 250, 180, 202, 30, 3, 76, 57, 222, + 140, 214, 73, 205, 250, 180, 202, 30, 3, 76, 90, 210, 22, 233, 94, 214, + 73, 205, 250, 180, 202, 30, 3, 76, 90, 222, 184, 222, 140, 214, 73, 251, + 22, 233, 94, 214, 73, 251, 22, 222, 140, 26, 206, 60, 216, 19, 180, 149, + 233, 94, 26, 206, 60, 216, 19, 180, 149, 222, 140, 26, 216, 19, 251, 22, + 233, 94, 26, 216, 19, 251, 22, 222, 140, 90, 237, 243, 180, 90, 233, 93, + 233, 94, 90, 237, 243, 180, 90, 222, 139, 222, 140, 90, 206, 71, 214, 73, + 236, 173, 233, 94, 90, 206, 71, 214, 73, 236, 173, 222, 140, 90, 206, 71, + 90, 233, 93, 233, 94, 90, 206, 71, 90, 222, 139, 222, 140, 90, 233, 94, + 90, 237, 243, 236, 173, 233, 94, 90, 222, 140, 90, 237, 243, 236, 173, + 222, 140, 90, 205, 250, 180, 90, 233, 94, 90, 205, 250, 236, 173, 233, + 94, 90, 205, 250, 180, 90, 222, 140, 90, 205, 250, 236, 173, 205, 250, + 180, 202, 30, 214, 73, 222, 139, 205, 250, 180, 202, 30, 214, 73, 233, + 93, 205, 250, 180, 202, 30, 214, 73, 222, 140, 3, 76, 226, 41, 205, 250, + 180, 202, 30, 214, 73, 233, 94, 3, 76, 226, 41, 237, 243, 180, 202, 30, + 214, 73, 222, 139, 237, 243, 180, 202, 30, 214, 73, 233, 93, 237, 243, + 205, 250, 180, 202, 30, 214, 73, 222, 139, 237, 243, 205, 250, 180, 202, + 30, 214, 73, 233, 93, 206, 71, 214, 73, 222, 139, 206, 71, 214, 73, 233, + 93, 206, 71, 90, 222, 140, 90, 236, 172, 55, 206, 71, 90, 233, 94, 90, + 236, 172, 55, 52, 217, 90, 222, 139, 52, 217, 90, 233, 93, 52, 217, 90, + 222, 140, 3, 200, 62, 233, 94, 214, 22, 222, 139, 233, 94, 248, 210, 222, + 139, 222, 140, 244, 203, 247, 219, 241, 11, 233, 94, 244, 203, 247, 219, + 241, 11, 222, 140, 244, 203, 247, 219, 241, 12, 90, 205, 250, 236, 173, + 233, 94, 244, 203, 247, 219, 241, 12, 90, 205, 250, 236, 173, 205, 223, + 202, 222, 222, 226, 202, 222, 205, 223, 202, 223, 214, 73, 180, 149, 222, + 226, 202, 223, 214, 73, 180, 149, 236, 172, 2, 3, 247, 254, 57, 212, 36, + 90, 206, 60, 236, 172, 55, 204, 134, 90, 206, 60, 236, 172, 55, 212, 36, + 90, 206, 60, 216, 19, 180, 149, 204, 134, 90, 206, 60, 216, 19, 180, 149, + 212, 36, 90, 236, 172, 55, 204, 134, 90, 236, 172, 55, 212, 36, 90, 216, + 19, 180, 149, 204, 134, 90, 216, 19, 180, 149, 212, 36, 90, 251, 139, + 180, 149, 204, 134, 90, 251, 139, 180, 149, 212, 36, 90, 216, 19, 251, + 139, 180, 149, 204, 134, 90, 216, 19, 251, 139, 180, 149, 52, 212, 35, + 52, 204, 133, 204, 142, 3, 238, 253, 204, 94, 3, 238, 253, 204, 142, 3, + 98, 2, 60, 204, 94, 3, 98, 2, 60, 204, 142, 3, 218, 118, 2, 60, 204, 94, + 3, 218, 118, 2, 60, 204, 142, 77, 214, 73, 180, 202, 30, 3, 76, 57, 204, + 94, 77, 214, 73, 180, 202, 30, 3, 76, 57, 204, 142, 77, 90, 236, 172, 55, + 204, 94, 77, 90, 236, 172, 55, 204, 142, 77, 90, 202, 85, 214, 82, 204, + 94, 77, 90, 202, 85, 214, 82, 204, 142, 77, 90, 251, 139, 180, 149, 204, + 94, 77, 90, 251, 139, 180, 149, 204, 142, 77, 90, 216, 19, 180, 149, 204, + 94, 77, 90, 216, 19, 180, 149, 47, 50, 192, 111, 214, 82, 47, 53, 192, + 111, 214, 82, 244, 203, 204, 141, 244, 203, 204, 93, 244, 203, 204, 142, + 214, 73, 180, 149, 244, 203, 204, 94, 214, 73, 180, 149, 204, 142, 90, + 204, 93, 204, 94, 90, 204, 141, 204, 142, 90, 204, 141, 204, 94, 90, 204, + 93, 204, 94, 248, 210, 204, 141, 204, 94, 248, 210, 26, 225, 126, 247, + 219, 240, 66, 3, 204, 141, 237, 0, 77, 214, 85, 237, 230, 212, 156, 3, + 203, 49, 201, 242, 201, 198, 226, 23, 235, 25, 216, 34, 206, 182, 50, + 203, 147, 206, 182, 135, 203, 147, 206, 182, 124, 203, 147, 213, 33, 3, + 209, 80, 83, 249, 80, 201, 165, 53, 201, 3, 52, 83, 249, 80, 50, 201, 3, + 83, 249, 80, 52, 50, 201, 3, 52, 83, 249, 80, 52, 50, 201, 3, 181, 240, + 66, 234, 235, 50, 219, 169, 77, 52, 199, 100, 206, 182, 135, 203, 148, 3, + 214, 26, 206, 182, 124, 203, 148, 3, 200, 62, 206, 182, 124, 203, 148, + 90, 206, 182, 135, 203, 147, 52, 135, 203, 147, 52, 124, 203, 147, 52, + 204, 196, 216, 19, 55, 210, 89, 52, 204, 196, 216, 19, 55, 239, 19, 216, + 19, 239, 62, 3, 210, 89, 217, 105, 205, 248, 83, 222, 76, 3, 244, 250, + 57, 83, 222, 76, 3, 244, 250, 60, 135, 203, 148, 3, 244, 250, 60, 213, + 146, 3, 231, 155, 106, 213, 146, 3, 202, 85, 214, 82, 201, 165, 83, 249, + 80, 248, 164, 210, 136, 201, 165, 83, 249, 80, 3, 231, 155, 106, 201, + 165, 244, 169, 214, 82, 201, 165, 217, 90, 222, 139, 201, 165, 217, 90, + 233, 93, 237, 243, 205, 250, 222, 140, 214, 73, 180, 149, 237, 243, 205, + 250, 233, 94, 214, 73, 180, 149, 201, 165, 205, 178, 248, 164, 210, 136, + 222, 228, 201, 165, 83, 249, 80, 214, 82, 52, 205, 178, 214, 82, 59, 83, + 154, 218, 54, 59, 83, 154, 173, 237, 69, 59, 51, 173, 197, 89, 59, 51, + 205, 159, 237, 69, 59, 51, 205, 159, 197, 89, 59, 51, 50, 53, 59, 51, + 107, 58, 51, 200, 24, 58, 51, 237, 231, 58, 51, 173, 237, 69, 58, 51, + 173, 197, 89, 58, 51, 205, 159, 237, 69, 58, 51, 205, 159, 197, 89, 58, + 51, 50, 53, 58, 51, 124, 135, 58, 51, 91, 61, 3, 202, 68, 237, 230, 91, + 61, 3, 202, 68, 200, 23, 107, 61, 3, 202, 68, 237, 230, 107, 61, 3, 202, + 68, 200, 23, 47, 3, 201, 243, 157, 248, 136, 47, 3, 248, 85, 157, 248, + 136, 47, 3, 200, 33, 53, 239, 147, 157, 248, 136, 47, 3, 221, 203, 50, + 239, 147, 157, 248, 136, 239, 141, 3, 50, 157, 248, 136, 239, 141, 3, 53, + 157, 248, 136, 239, 141, 3, 201, 243, 157, 248, 136, 239, 141, 3, 248, + 85, 157, 248, 136, 237, 250, 205, 94, 58, 222, 228, 205, 94, 59, 222, + 228, 205, 94, 58, 199, 48, 4, 205, 94, 59, 199, 48, 4, 205, 94, 58, 213, + 55, 59, 213, 55, 59, 232, 85, 58, 232, 85, 231, 155, 58, 232, 85, 58, + 222, 228, 244, 249, 58, 219, 190, 239, 140, 59, 219, 190, 239, 140, 58, + 219, 190, 221, 198, 59, 219, 190, 221, 198, 58, 4, 239, 140, 58, 4, 221, + 198, 59, 4, 221, 198, 58, 231, 155, 236, 248, 59, 231, 155, 236, 248, 58, + 83, 236, 248, 59, 83, 236, 248, 50, 61, 3, 4, 244, 249, 115, 107, 250, + 214, 50, 61, 3, 46, 212, 125, 181, 107, 205, 87, 51, 107, 200, 215, 61, + 3, 83, 106, 107, 200, 215, 61, 3, 52, 83, 106, 107, 200, 215, 61, 234, + 235, 154, 107, 200, 215, 201, 165, 240, 66, 51, 107, 61, 3, 237, 250, + 204, 243, 107, 61, 3, 203, 136, 3, 83, 106, 107, 61, 3, 203, 136, 3, 52, + 83, 106, 107, 200, 215, 61, 3, 203, 135, 107, 200, 215, 61, 3, 203, 136, + 3, 83, 106, 107, 200, 215, 61, 3, 203, 136, 3, 52, 83, 106, 107, 61, 202, + 145, 196, 222, 197, 123, 61, 212, 107, 239, 83, 222, 184, 236, 172, 2, + 90, 107, 51, 210, 90, 202, 85, 214, 83, 90, 107, 51, 107, 61, 90, 210, + 90, 251, 139, 180, 149, 91, 61, 202, 145, 233, 93, 91, 61, 202, 145, 204, + 93, 107, 211, 90, 51, 91, 211, 90, 51, 210, 90, 202, 85, 214, 83, 90, 91, + 51, 91, 61, 90, 210, 90, 251, 139, 180, 149, 202, 85, 214, 83, 90, 107, + 51, 107, 61, 90, 251, 139, 180, 149, 107, 61, 90, 210, 90, 202, 85, 214, + 82, 91, 61, 90, 210, 90, 202, 85, 214, 82, 237, 231, 201, 179, 195, 24, + 51, 206, 182, 205, 250, 173, 51, 206, 182, 249, 135, 205, 159, 51, 59, + 219, 190, 205, 7, 58, 4, 205, 7, 59, 4, 205, 7, 58, 210, 17, 213, 55, 59, + 210, 17, 213, 55, 85, 222, 228, 244, 249, 85, 214, 28, 3, 214, 28, 226, + 41, 85, 244, 250, 3, 244, 250, 226, 41, 85, 244, 249, 85, 46, 208, 230, + 205, 250, 173, 61, 3, 231, 164, 232, 137, 249, 135, 205, 159, 61, 3, 231, + 164, 203, 135, 205, 250, 173, 61, 3, 231, 155, 203, 135, 249, 135, 205, + 159, 61, 3, 231, 155, 203, 135, 248, 218, 61, 212, 107, 237, 231, 202, + 209, 173, 237, 68, 206, 182, 248, 218, 61, 212, 107, 237, 231, 202, 209, + 173, 237, 68, 107, 201, 179, 51, 200, 24, 201, 179, 51, 91, 201, 179, 51, + 237, 231, 201, 179, 51, 50, 53, 201, 179, 51, 124, 135, 201, 179, 51, + 173, 197, 89, 201, 179, 51, 173, 237, 69, 201, 179, 51, 205, 159, 237, + 69, 201, 179, 51, 205, 159, 197, 89, 201, 179, 51, 107, 201, 179, 240, + 64, 51, 200, 24, 201, 179, 240, 64, 51, 91, 201, 179, 240, 64, 51, 237, + 231, 201, 179, 240, 64, 51, 244, 205, 201, 179, 192, 244, 250, 51, 251, + 65, 201, 179, 192, 244, 250, 51, 107, 201, 179, 61, 202, 30, 154, 200, + 24, 201, 179, 61, 202, 30, 154, 91, 201, 179, 61, 202, 30, 154, 237, 231, + 201, 179, 61, 202, 30, 154, 173, 197, 89, 201, 179, 61, 202, 30, 154, + 173, 237, 69, 201, 179, 61, 202, 30, 154, 205, 159, 237, 69, 201, 179, + 61, 202, 30, 154, 205, 159, 197, 89, 201, 179, 61, 202, 30, 154, 107, + 201, 179, 61, 3, 52, 231, 155, 106, 200, 24, 201, 179, 61, 3, 52, 231, + 155, 106, 91, 201, 179, 61, 3, 52, 231, 155, 106, 237, 231, 201, 179, 61, + 3, 52, 231, 155, 106, 231, 155, 203, 155, 224, 153, 83, 203, 155, 224, + 153, 107, 201, 179, 61, 127, 91, 201, 179, 51, 200, 24, 201, 179, 61, + 107, 77, 237, 231, 201, 179, 51, 91, 201, 179, 61, 127, 107, 201, 179, + 51, 237, 231, 201, 179, 61, 107, 77, 200, 24, 201, 179, 51, 107, 201, + 179, 213, 219, 250, 214, 200, 24, 201, 179, 213, 219, 250, 214, 91, 201, + 179, 213, 219, 250, 214, 237, 231, 201, 179, 213, 219, 250, 214, 107, 58, + 46, 59, 51, 200, 24, 58, 46, 59, 51, 91, 58, 46, 59, 51, 237, 231, 58, + 46, 59, 51, 251, 65, 201, 179, 53, 200, 167, 51, 251, 65, 201, 179, 248, + 85, 200, 167, 51, 251, 65, 201, 179, 50, 200, 167, 51, 251, 65, 201, 179, + 201, 243, 200, 167, 51, 210, 94, 222, 184, 210, 94, 210, 22, 217, 80, + 222, 184, 217, 80, 210, 22, 235, 7, 241, 102, 250, 215, 244, 245, 251, + 64, 91, 58, 51, 202, 154, 201, 241, 107, 236, 166, 250, 217, 202, 154, + 210, 18, 200, 24, 236, 166, 250, 217, 202, 154, 201, 241, 91, 236, 166, + 250, 217, 202, 154, 222, 180, 237, 231, 236, 166, 250, 217, 58, 107, 236, + 166, 250, 217, 58, 200, 24, 236, 166, 250, 217, 58, 91, 236, 166, 250, + 217, 58, 237, 231, 236, 166, 250, 217, 237, 231, 201, 179, 61, 3, 181, + 202, 68, 222, 174, 237, 231, 201, 179, 61, 3, 181, 202, 68, 210, 11, 200, + 24, 201, 179, 61, 3, 181, 202, 68, 222, 174, 200, 24, 201, 179, 61, 3, + 181, 202, 68, 210, 11, 107, 201, 179, 61, 3, 181, 202, 68, 200, 23, 91, + 201, 179, 61, 3, 181, 202, 68, 200, 23, 107, 201, 179, 61, 3, 181, 202, + 68, 237, 230, 91, 201, 179, 61, 3, 181, 202, 68, 237, 230, 58, 241, 10, + 237, 231, 26, 107, 51, 58, 241, 10, 237, 231, 26, 91, 51, 58, 241, 10, + 200, 24, 26, 107, 51, 58, 241, 10, 200, 24, 26, 91, 51, 58, 241, 10, 107, + 26, 200, 24, 51, 58, 241, 10, 91, 26, 200, 24, 51, 58, 241, 10, 107, 26, + 237, 231, 51, 58, 241, 10, 91, 26, 237, 231, 51, 210, 63, 61, 135, 222, + 184, 210, 63, 61, 135, 210, 22, 210, 63, 61, 124, 222, 184, 210, 63, 61, + 124, 210, 22, 210, 63, 61, 50, 200, 36, 210, 63, 61, 53, 200, 36, 210, + 63, 61, 50, 237, 235, 210, 63, 61, 53, 237, 235, 200, 24, 59, 61, 234, + 235, 249, 80, 3, 231, 155, 154, 124, 250, 218, 226, 87, 39, 210, 164, + 248, 70, 214, 22, 59, 205, 92, 214, 22, 59, 26, 58, 205, 92, 214, 22, 58, + 205, 92, 249, 99, 111, 3, 175, 196, 222, 46, 196, 222, 46, 27, 196, 222, + 58, 47, 247, 34, 58, 239, 141, 247, 34, 163, 58, 213, 55, 231, 155, 58, + 214, 173, 58, 214, 173, 58, 219, 190, 200, 35, 201, 181, 247, 34, 58, + 219, 190, 237, 234, 201, 181, 247, 34, 58, 219, 190, 222, 179, 201, 181, + 247, 34, 58, 219, 190, 210, 17, 201, 181, 247, 34, 217, 95, 235, 24, 102, + 201, 243, 157, 58, 244, 249, 248, 85, 157, 58, 244, 249, 175, 235, 7, + 212, 109, 58, 241, 6, 209, 194, 175, 235, 7, 212, 109, 58, 241, 6, 59, + 235, 7, 212, 109, 241, 6, 209, 194, 59, 235, 7, 212, 109, 241, 6, 47, + 212, 79, 226, 68, 200, 66, 55, 233, 84, 78, 212, 122, 235, 24, 102, 212, + 122, 235, 24, 134, 212, 122, 235, 24, 136, 212, 122, 235, 24, 146, 201, + 200, 211, 246, 250, 175, 231, 10, 212, 231, 217, 91, 59, 218, 190, 207, + 113, 58, 239, 141, 214, 120, 241, 61, 201, 143, 175, 218, 190, 250, 210, + 241, 25, 232, 243, 195, 77, 223, 204, 251, 34, 251, 252, 197, 218, 212, + 80, 50, 157, 58, 205, 7, 53, 157, 58, 205, 7, 205, 8, 3, 50, 157, 248, + 136, 205, 8, 3, 53, 157, 248, 136, 107, 200, 215, 61, 3, 201, 181, 250, + 216, 200, 24, 200, 215, 61, 3, 201, 181, 250, 216, 91, 200, 215, 61, 3, + 201, 181, 250, 216, 237, 231, 200, 215, 61, 3, 201, 181, 250, 216, 236, + 156, 235, 24, 100, 236, 156, 235, 24, 102, 208, 130, 209, 103, 250, 174, + 16, 199, 19, 209, 103, 250, 174, 16, 216, 5, 209, 103, 250, 174, 16, 211, + 67, 209, 103, 250, 174, 16, 248, 159, 209, 103, 250, 174, 16, 207, 96, + 209, 103, 250, 174, 16, 201, 192, 236, 172, 2, 3, 226, 64, 60, 200, 48, + 105, 207, 92, 105, 237, 240, 105, 213, 123, 105, 210, 89, 53, 251, 90, + 232, 106, 213, 107, 105, 125, 6, 1, 250, 113, 125, 6, 1, 248, 9, 125, 6, + 1, 199, 116, 125, 6, 1, 233, 159, 125, 6, 1, 239, 23, 125, 6, 1, 196, 38, + 125, 6, 1, 195, 58, 125, 6, 1, 237, 151, 125, 6, 1, 195, 84, 125, 6, 1, + 225, 221, 125, 6, 1, 84, 225, 221, 125, 6, 1, 68, 125, 6, 1, 239, 44, + 125, 6, 1, 225, 23, 125, 6, 1, 222, 39, 125, 6, 1, 218, 59, 125, 6, 1, + 217, 206, 125, 6, 1, 214, 104, 125, 6, 1, 212, 104, 125, 6, 1, 209, 249, + 125, 6, 1, 205, 229, 125, 6, 1, 200, 246, 125, 6, 1, 200, 83, 125, 6, 1, + 234, 238, 125, 6, 1, 232, 91, 125, 6, 1, 214, 40, 125, 6, 1, 213, 92, + 125, 6, 1, 206, 154, 125, 6, 1, 201, 92, 125, 6, 1, 245, 36, 125, 6, 1, + 207, 50, 125, 6, 1, 196, 47, 125, 6, 1, 196, 49, 125, 6, 1, 196, 82, 125, + 6, 1, 205, 123, 142, 125, 6, 1, 195, 217, 125, 6, 1, 4, 195, 182, 125, 6, + 1, 4, 195, 183, 3, 203, 135, 125, 6, 1, 196, 3, 125, 6, 1, 226, 6, 4, + 195, 182, 125, 6, 1, 248, 171, 195, 182, 125, 6, 1, 226, 6, 248, 171, + 195, 182, 125, 6, 1, 235, 103, 125, 6, 1, 225, 219, 125, 6, 1, 206, 153, + 125, 6, 1, 201, 155, 63, 125, 6, 1, 222, 216, 218, 59, 125, 4, 1, 250, + 113, 125, 4, 1, 248, 9, 125, 4, 1, 199, 116, 125, 4, 1, 233, 159, 125, 4, + 1, 239, 23, 125, 4, 1, 196, 38, 125, 4, 1, 195, 58, 125, 4, 1, 237, 151, + 125, 4, 1, 195, 84, 125, 4, 1, 225, 221, 125, 4, 1, 84, 225, 221, 125, 4, + 1, 68, 125, 4, 1, 239, 44, 125, 4, 1, 225, 23, 125, 4, 1, 222, 39, 125, + 4, 1, 218, 59, 125, 4, 1, 217, 206, 125, 4, 1, 214, 104, 125, 4, 1, 212, + 104, 125, 4, 1, 209, 249, 125, 4, 1, 205, 229, 125, 4, 1, 200, 246, 125, + 4, 1, 200, 83, 125, 4, 1, 234, 238, 125, 4, 1, 232, 91, 125, 4, 1, 214, + 40, 125, 4, 1, 213, 92, 125, 4, 1, 206, 154, 125, 4, 1, 201, 92, 125, 4, + 1, 245, 36, 125, 4, 1, 207, 50, 125, 4, 1, 196, 47, 125, 4, 1, 196, 49, + 125, 4, 1, 196, 82, 125, 4, 1, 205, 123, 142, 125, 4, 1, 195, 217, 125, + 4, 1, 4, 195, 182, 125, 4, 1, 4, 195, 183, 3, 203, 135, 125, 4, 1, 196, + 3, 125, 4, 1, 226, 6, 4, 195, 182, 125, 4, 1, 248, 171, 195, 182, 125, 4, + 1, 226, 6, 248, 171, 195, 182, 125, 4, 1, 235, 103, 125, 4, 1, 225, 219, + 125, 4, 1, 206, 153, 125, 4, 1, 201, 155, 63, 125, 4, 1, 222, 216, 218, + 59, 8, 6, 1, 223, 100, 3, 52, 154, 8, 4, 1, 223, 100, 3, 52, 154, 8, 6, + 1, 223, 100, 3, 112, 202, 84, 8, 6, 1, 214, 4, 3, 106, 8, 6, 1, 211, 32, + 3, 203, 135, 8, 4, 1, 39, 3, 106, 8, 4, 1, 203, 217, 3, 239, 147, 106, 8, + 6, 1, 233, 16, 3, 239, 195, 8, 4, 1, 233, 16, 3, 239, 195, 8, 6, 1, 225, + 81, 3, 239, 195, 8, 4, 1, 225, 81, 3, 239, 195, 8, 6, 1, 195, 159, 3, + 239, 195, 8, 4, 1, 195, 159, 3, 239, 195, 8, 6, 1, 251, 134, 8, 6, 1, + 221, 137, 3, 122, 8, 6, 1, 163, 63, 8, 6, 1, 163, 251, 134, 8, 4, 1, 199, + 231, 3, 53, 122, 8, 6, 1, 197, 200, 3, 122, 8, 4, 1, 197, 200, 3, 122, 8, + 4, 1, 199, 231, 3, 241, 21, 8, 6, 1, 157, 233, 15, 8, 4, 1, 157, 233, 15, + 8, 4, 1, 203, 133, 212, 246, 8, 4, 1, 237, 136, 3, 216, 16, 8, 4, 1, 163, + 211, 32, 3, 203, 135, 8, 4, 1, 177, 3, 126, 210, 3, 226, 41, 8, 1, 4, 6, + 163, 69, 8, 204, 143, 4, 1, 225, 217, 73, 1, 6, 199, 230, 8, 6, 1, 209, + 81, 3, 204, 63, 203, 135, 8, 6, 1, 195, 159, 3, 204, 63, 203, 135, 88, 6, + 1, 251, 158, 88, 4, 1, 251, 158, 88, 6, 1, 199, 31, 88, 4, 1, 199, 31, + 88, 6, 1, 234, 94, 88, 4, 1, 234, 94, 88, 6, 1, 240, 103, 88, 4, 1, 240, + 103, 88, 6, 1, 237, 32, 88, 4, 1, 237, 32, 88, 6, 1, 205, 164, 88, 4, 1, + 205, 164, 88, 6, 1, 195, 96, 88, 4, 1, 195, 96, 88, 6, 1, 232, 162, 88, + 4, 1, 232, 162, 88, 6, 1, 202, 197, 88, 4, 1, 202, 197, 88, 6, 1, 230, + 207, 88, 4, 1, 230, 207, 88, 6, 1, 225, 7, 88, 4, 1, 225, 7, 88, 6, 1, + 222, 211, 88, 4, 1, 222, 211, 88, 6, 1, 219, 78, 88, 4, 1, 219, 78, 88, + 6, 1, 216, 223, 88, 4, 1, 216, 223, 88, 6, 1, 223, 203, 88, 4, 1, 223, + 203, 88, 6, 1, 72, 88, 4, 1, 72, 88, 6, 1, 212, 220, 88, 4, 1, 212, 220, + 88, 6, 1, 209, 232, 88, 4, 1, 209, 232, 88, 6, 1, 206, 74, 88, 4, 1, 206, + 74, 88, 6, 1, 203, 89, 88, 4, 1, 203, 89, 88, 6, 1, 200, 114, 88, 4, 1, + 200, 114, 88, 6, 1, 235, 153, 88, 4, 1, 235, 153, 88, 6, 1, 224, 124, 88, + 4, 1, 224, 124, 88, 6, 1, 211, 238, 88, 4, 1, 211, 238, 88, 6, 1, 214, + 96, 88, 4, 1, 214, 96, 88, 6, 1, 239, 145, 251, 164, 88, 4, 1, 239, 145, + 251, 164, 88, 6, 1, 37, 88, 251, 194, 88, 4, 1, 37, 88, 251, 194, 88, 6, + 1, 241, 44, 237, 32, 88, 4, 1, 241, 44, 237, 32, 88, 6, 1, 239, 145, 225, + 7, 88, 4, 1, 239, 145, 225, 7, 88, 6, 1, 239, 145, 216, 223, 88, 4, 1, + 239, 145, 216, 223, 88, 6, 1, 241, 44, 216, 223, 88, 4, 1, 241, 44, 216, + 223, 88, 6, 1, 37, 88, 214, 96, 88, 4, 1, 37, 88, 214, 96, 88, 6, 1, 208, + 222, 88, 4, 1, 208, 222, 88, 6, 1, 241, 59, 206, 247, 88, 4, 1, 241, 59, + 206, 247, 88, 6, 1, 37, 88, 206, 247, 88, 4, 1, 37, 88, 206, 247, 88, 6, + 1, 37, 88, 236, 141, 88, 4, 1, 37, 88, 236, 141, 88, 6, 1, 251, 177, 224, + 129, 88, 4, 1, 251, 177, 224, 129, 88, 6, 1, 239, 145, 231, 156, 88, 4, + 1, 239, 145, 231, 156, 88, 6, 1, 37, 88, 231, 156, 88, 4, 1, 37, 88, 231, + 156, 88, 6, 1, 37, 88, 142, 88, 4, 1, 37, 88, 142, 88, 6, 1, 223, 99, + 142, 88, 4, 1, 223, 99, 142, 88, 6, 1, 37, 88, 232, 112, 88, 4, 1, 37, + 88, 232, 112, 88, 6, 1, 37, 88, 232, 165, 88, 4, 1, 37, 88, 232, 165, 88, + 6, 1, 37, 88, 234, 89, 88, 4, 1, 37, 88, 234, 89, 88, 6, 1, 37, 88, 239, + 47, 88, 4, 1, 37, 88, 239, 47, 88, 6, 1, 37, 88, 206, 213, 88, 4, 1, 37, + 88, 206, 213, 88, 6, 1, 37, 215, 153, 206, 213, 88, 4, 1, 37, 215, 153, + 206, 213, 88, 6, 1, 37, 215, 153, 217, 19, 88, 4, 1, 37, 215, 153, 217, + 19, 88, 6, 1, 37, 215, 153, 215, 89, 88, 4, 1, 37, 215, 153, 215, 89, 88, + 6, 1, 37, 215, 153, 197, 124, 88, 4, 1, 37, 215, 153, 197, 124, 88, 16, + 225, 31, 88, 16, 219, 79, 209, 232, 88, 16, 212, 221, 209, 232, 88, 16, + 204, 252, 88, 16, 203, 90, 209, 232, 88, 16, 224, 125, 209, 232, 88, 16, + 206, 214, 206, 74, 88, 6, 1, 241, 44, 206, 247, 88, 4, 1, 241, 44, 206, + 247, 88, 6, 1, 241, 44, 234, 89, 88, 4, 1, 241, 44, 234, 89, 88, 38, 216, + 224, 57, 88, 38, 205, 116, 250, 187, 88, 38, 205, 116, 222, 148, 88, 6, + 1, 248, 109, 224, 129, 88, 4, 1, 248, 109, 224, 129, 88, 37, 215, 153, + 234, 217, 204, 226, 88, 37, 215, 153, 239, 86, 211, 79, 78, 88, 37, 215, + 153, 226, 66, 211, 79, 78, 88, 37, 215, 153, 199, 102, 239, 59, 88, 191, + 97, 232, 225, 88, 234, 217, 204, 226, 88, 218, 185, 239, 59, 94, 4, 1, + 251, 106, 94, 4, 1, 249, 93, 94, 4, 1, 234, 93, 94, 4, 1, 239, 6, 94, 4, + 1, 236, 230, 94, 4, 1, 199, 16, 94, 4, 1, 195, 82, 94, 4, 1, 203, 114, + 94, 4, 1, 226, 86, 94, 4, 1, 225, 17, 94, 4, 1, 222, 222, 94, 4, 1, 220, + 62, 94, 4, 1, 217, 211, 94, 4, 1, 214, 119, 94, 4, 1, 213, 157, 94, 4, 1, + 195, 70, 94, 4, 1, 210, 229, 94, 4, 1, 208, 219, 94, 4, 1, 203, 101, 94, + 4, 1, 200, 72, 94, 4, 1, 212, 254, 94, 4, 1, 224, 134, 94, 4, 1, 233, + 221, 94, 4, 1, 211, 144, 94, 4, 1, 206, 211, 94, 4, 1, 245, 62, 94, 4, 1, + 247, 142, 94, 4, 1, 225, 162, 94, 4, 1, 245, 0, 94, 4, 1, 247, 0, 94, 4, + 1, 196, 206, 94, 4, 1, 225, 177, 94, 4, 1, 232, 242, 94, 4, 1, 232, 147, + 94, 4, 1, 232, 58, 94, 4, 1, 197, 109, 94, 4, 1, 232, 175, 94, 4, 1, 231, + 181, 94, 4, 1, 196, 5, 94, 4, 1, 251, 234, 202, 104, 1, 164, 202, 104, 1, + 196, 125, 202, 104, 1, 196, 124, 202, 104, 1, 196, 114, 202, 104, 1, 196, + 112, 202, 104, 1, 248, 212, 252, 24, 196, 107, 202, 104, 1, 196, 107, + 202, 104, 1, 196, 122, 202, 104, 1, 196, 119, 202, 104, 1, 196, 121, 202, + 104, 1, 196, 120, 202, 104, 1, 196, 29, 202, 104, 1, 196, 116, 202, 104, + 1, 196, 105, 202, 104, 1, 201, 32, 196, 105, 202, 104, 1, 196, 102, 202, + 104, 1, 196, 110, 202, 104, 1, 248, 212, 252, 24, 196, 110, 202, 104, 1, + 201, 32, 196, 110, 202, 104, 1, 196, 109, 202, 104, 1, 196, 129, 202, + 104, 1, 196, 103, 202, 104, 1, 201, 32, 196, 103, 202, 104, 1, 196, 92, + 202, 104, 1, 201, 32, 196, 92, 202, 104, 1, 196, 24, 202, 104, 1, 196, + 71, 202, 104, 1, 251, 207, 196, 71, 202, 104, 1, 201, 32, 196, 71, 202, + 104, 1, 196, 101, 202, 104, 1, 196, 100, 202, 104, 1, 196, 97, 202, 104, + 1, 201, 32, 196, 111, 202, 104, 1, 201, 32, 196, 95, 202, 104, 1, 196, + 93, 202, 104, 1, 195, 217, 202, 104, 1, 196, 90, 202, 104, 1, 196, 88, + 202, 104, 1, 196, 113, 202, 104, 1, 201, 32, 196, 113, 202, 104, 1, 250, + 118, 196, 113, 202, 104, 1, 196, 87, 202, 104, 1, 196, 85, 202, 104, 1, + 196, 86, 202, 104, 1, 196, 84, 202, 104, 1, 196, 83, 202, 104, 1, 196, + 123, 202, 104, 1, 196, 81, 202, 104, 1, 196, 79, 202, 104, 1, 196, 78, + 202, 104, 1, 196, 75, 202, 104, 1, 196, 72, 202, 104, 1, 203, 80, 196, + 72, 202, 104, 1, 196, 70, 202, 104, 1, 196, 69, 202, 104, 1, 196, 3, 202, + 104, 73, 1, 223, 72, 78, 202, 104, 207, 91, 78, 202, 104, 108, 225, 124, + 35, 5, 222, 6, 35, 5, 218, 244, 35, 5, 209, 224, 35, 5, 205, 192, 35, 5, + 206, 197, 35, 5, 248, 115, 35, 5, 202, 22, 35, 5, 244, 181, 35, 5, 216, + 43, 35, 5, 215, 72, 35, 5, 233, 152, 214, 190, 35, 5, 195, 10, 35, 5, + 239, 26, 35, 5, 240, 10, 35, 5, 225, 128, 35, 5, 202, 168, 35, 5, 245, + 48, 35, 5, 212, 233, 35, 5, 212, 116, 35, 5, 233, 236, 35, 5, 233, 232, + 35, 5, 233, 233, 35, 5, 233, 234, 35, 5, 205, 80, 35, 5, 205, 34, 35, 5, + 205, 47, 35, 5, 205, 79, 35, 5, 205, 52, 35, 5, 205, 53, 35, 5, 205, 39, + 35, 5, 247, 80, 35, 5, 247, 59, 35, 5, 247, 61, 35, 5, 247, 79, 35, 5, + 247, 77, 35, 5, 247, 78, 35, 5, 247, 60, 35, 5, 194, 228, 35, 5, 194, + 206, 35, 5, 194, 219, 35, 5, 194, 227, 35, 5, 194, 222, 35, 5, 194, 223, + 35, 5, 194, 211, 35, 5, 247, 75, 35, 5, 247, 62, 35, 5, 247, 64, 35, 5, + 247, 74, 35, 5, 247, 72, 35, 5, 247, 73, 35, 5, 247, 63, 35, 5, 211, 44, + 35, 5, 211, 34, 35, 5, 211, 40, 35, 5, 211, 43, 35, 5, 211, 41, 35, 5, + 211, 42, 35, 5, 211, 39, 35, 5, 223, 110, 35, 5, 223, 102, 35, 5, 223, + 105, 35, 5, 223, 109, 35, 5, 223, 106, 35, 5, 223, 107, 35, 5, 223, 103, + 35, 5, 196, 164, 35, 5, 196, 151, 35, 5, 196, 159, 35, 5, 196, 163, 35, + 5, 196, 161, 35, 5, 196, 162, 35, 5, 196, 158, 35, 5, 233, 27, 35, 5, + 233, 17, 35, 5, 233, 20, 35, 5, 233, 26, 35, 5, 233, 22, 35, 5, 233, 23, + 35, 5, 233, 19, 38, 40, 1, 249, 9, 38, 40, 1, 199, 118, 38, 40, 1, 233, + 216, 38, 40, 1, 239, 252, 38, 40, 1, 195, 65, 38, 40, 1, 195, 88, 38, 40, + 1, 155, 38, 40, 1, 237, 7, 38, 40, 1, 236, 241, 38, 40, 1, 236, 230, 38, + 40, 1, 72, 38, 40, 1, 213, 92, 38, 40, 1, 236, 163, 38, 40, 1, 236, 151, + 38, 40, 1, 203, 68, 38, 40, 1, 142, 38, 40, 1, 201, 107, 38, 40, 1, 245, + 103, 38, 40, 1, 207, 50, 38, 40, 1, 207, 2, 38, 40, 1, 235, 103, 38, 40, + 1, 236, 147, 38, 40, 1, 63, 38, 40, 1, 226, 147, 38, 40, 1, 239, 45, 38, + 40, 1, 218, 203, 200, 87, 38, 40, 1, 196, 84, 38, 40, 1, 195, 217, 38, + 40, 1, 226, 5, 63, 38, 40, 1, 222, 47, 195, 182, 38, 40, 1, 248, 171, + 195, 182, 38, 40, 1, 226, 5, 248, 171, 195, 182, 53, 251, 91, 204, 138, + 220, 24, 53, 251, 91, 237, 250, 204, 138, 220, 24, 50, 204, 138, 179, 53, + 204, 138, 179, 50, 237, 250, 204, 138, 179, 53, 237, 250, 204, 138, 179, + 210, 215, 226, 28, 220, 24, 210, 215, 237, 250, 226, 28, 220, 24, 237, + 250, 201, 199, 220, 24, 50, 201, 199, 179, 53, 201, 199, 179, 210, 215, + 205, 94, 50, 210, 215, 214, 121, 179, 53, 210, 215, 214, 121, 179, 237, + 55, 241, 98, 213, 152, 235, 26, 213, 152, 210, 89, 235, 26, 213, 152, + 231, 4, 237, 250, 214, 185, 237, 231, 251, 101, 200, 24, 251, 101, 237, + 250, 210, 17, 251, 90, 52, 214, 182, 231, 7, 226, 17, 226, 26, 213, 207, + 248, 57, 231, 8, 3, 239, 150, 202, 85, 3, 210, 3, 57, 50, 126, 213, 143, + 179, 53, 126, 213, 143, 179, 202, 85, 3, 76, 57, 202, 85, 3, 76, 60, 50, + 83, 249, 80, 3, 211, 73, 53, 83, 249, 80, 3, 211, 73, 201, 243, 50, 157, + 179, 201, 243, 53, 157, 179, 248, 85, 50, 157, 179, 248, 85, 53, 157, + 179, 50, 206, 96, 118, 179, 53, 206, 96, 118, 179, 50, 52, 213, 140, 53, + 52, 213, 140, 99, 238, 251, 127, 97, 76, 211, 213, 97, 76, 127, 99, 238, + 251, 211, 213, 103, 235, 7, 76, 211, 213, 235, 101, 76, 78, 210, 89, 211, + 79, 78, 83, 202, 84, 210, 3, 212, 110, 197, 9, 207, 91, 112, 238, 253, + 163, 244, 159, 210, 215, 238, 253, 210, 215, 244, 159, 163, 207, 105, + 240, 119, 3, 50, 233, 70, 240, 119, 3, 53, 233, 70, 163, 240, 118, 201, + 243, 157, 208, 133, 55, 200, 216, 240, 65, 202, 152, 240, 65, 204, 242, + 234, 217, 204, 226, 83, 206, 29, 238, 250, 197, 56, 83, 222, 75, 247, + 123, 52, 231, 7, 210, 89, 244, 159, 52, 221, 204, 211, 62, 78, 240, 66, + 3, 50, 200, 27, 52, 204, 77, 78, 226, 17, 126, 224, 221, 226, 17, 126, + 224, 222, 3, 224, 222, 57, 126, 224, 221, 126, 224, 222, 3, 238, 253, 52, + 205, 19, 244, 159, 237, 250, 205, 177, 201, 165, 240, 118, 219, 191, 244, + 159, 213, 151, 78, 211, 212, 236, 254, 78, 241, 99, 199, 102, 239, 59, + 12, 44, 210, 119, 12, 44, 244, 214, 12, 44, 208, 136, 100, 12, 44, 208, + 136, 102, 12, 44, 208, 136, 134, 12, 44, 213, 28, 12, 44, 248, 70, 12, + 44, 203, 152, 12, 44, 224, 22, 100, 12, 44, 224, 22, 102, 12, 44, 239, + 56, 12, 44, 208, 140, 12, 44, 4, 100, 12, 44, 4, 102, 12, 44, 222, 244, + 100, 12, 44, 222, 244, 102, 12, 44, 222, 244, 134, 12, 44, 222, 244, 136, + 12, 44, 205, 212, 12, 44, 202, 156, 12, 44, 205, 209, 100, 12, 44, 205, + 209, 102, 12, 44, 232, 127, 100, 12, 44, 232, 127, 102, 12, 44, 232, 209, + 12, 44, 210, 204, 12, 44, 245, 45, 12, 44, 204, 111, 12, 44, 218, 189, + 12, 44, 239, 249, 12, 44, 218, 178, 12, 44, 244, 232, 12, 44, 197, 128, + 100, 12, 44, 197, 128, 102, 12, 44, 235, 118, 12, 44, 213, 105, 100, 12, + 44, 213, 105, 102, 12, 44, 206, 69, 157, 201, 191, 201, 118, 12, 44, 241, + 83, 12, 44, 239, 17, 12, 44, 225, 209, 12, 44, 248, 108, 77, 244, 197, + 12, 44, 236, 67, 12, 44, 205, 118, 100, 12, 44, 205, 118, 102, 12, 44, + 249, 95, 12, 44, 206, 76, 12, 44, 247, 204, 206, 76, 12, 44, 217, 89, + 100, 12, 44, 217, 89, 102, 12, 44, 217, 89, 134, 12, 44, 217, 89, 136, + 12, 44, 219, 150, 12, 44, 206, 249, 12, 44, 210, 210, 12, 44, 236, 97, + 12, 44, 214, 133, 12, 44, 248, 29, 100, 12, 44, 248, 29, 102, 12, 44, + 219, 199, 12, 44, 218, 184, 12, 44, 233, 104, 100, 12, 44, 233, 104, 102, + 12, 44, 233, 104, 134, 12, 44, 202, 102, 12, 44, 244, 196, 12, 44, 197, + 89, 100, 12, 44, 197, 89, 102, 12, 44, 247, 204, 208, 129, 12, 44, 206, + 69, 231, 102, 12, 44, 231, 102, 12, 44, 247, 204, 205, 131, 12, 44, 247, + 204, 206, 244, 12, 44, 235, 37, 12, 44, 247, 204, 247, 99, 12, 44, 206, + 69, 197, 150, 12, 44, 197, 151, 100, 12, 44, 197, 151, 102, 12, 44, 244, + 235, 12, 44, 247, 204, 233, 135, 12, 44, 181, 100, 12, 44, 181, 102, 12, + 44, 247, 204, 221, 240, 12, 44, 247, 204, 234, 74, 12, 44, 218, 173, 100, + 12, 44, 218, 173, 102, 12, 44, 210, 217, 12, 44, 248, 118, 12, 44, 247, + 204, 203, 107, 222, 190, 12, 44, 247, 204, 222, 192, 12, 44, 247, 204, + 197, 50, 12, 44, 247, 204, 235, 55, 12, 44, 237, 66, 100, 12, 44, 237, + 66, 102, 12, 44, 237, 66, 134, 12, 44, 247, 204, 237, 65, 12, 44, 232, + 137, 12, 44, 247, 204, 231, 98, 12, 44, 248, 104, 12, 44, 233, 200, 12, + 44, 247, 204, 235, 111, 12, 44, 247, 204, 248, 156, 12, 44, 247, 204, + 208, 233, 12, 44, 206, 69, 197, 79, 12, 44, 206, 69, 196, 61, 12, 44, + 247, 204, 234, 236, 12, 44, 225, 216, 236, 102, 12, 44, 247, 204, 236, + 102, 12, 44, 225, 216, 201, 244, 12, 44, 247, 204, 201, 244, 12, 44, 225, + 216, 237, 223, 12, 44, 247, 204, 237, 223, 12, 44, 201, 1, 12, 44, 225, + 216, 201, 1, 12, 44, 247, 204, 201, 1, 79, 44, 100, 79, 44, 222, 75, 79, + 44, 238, 253, 79, 44, 205, 248, 79, 44, 208, 135, 79, 44, 122, 79, 44, + 102, 79, 44, 222, 104, 79, 44, 220, 62, 79, 44, 222, 169, 79, 44, 236, + 204, 79, 44, 171, 79, 44, 135, 248, 70, 79, 44, 241, 86, 79, 44, 230, + 201, 79, 44, 203, 152, 79, 44, 192, 248, 70, 79, 44, 224, 21, 79, 44, + 212, 58, 79, 44, 196, 255, 79, 44, 205, 107, 79, 44, 53, 192, 248, 70, + 79, 44, 232, 59, 236, 225, 79, 44, 203, 23, 79, 44, 239, 56, 79, 44, 208, + 140, 79, 44, 244, 214, 79, 44, 212, 8, 79, 44, 251, 216, 79, 44, 218, + 164, 79, 44, 236, 225, 79, 44, 237, 72, 79, 44, 208, 168, 79, 44, 233, + 144, 79, 44, 233, 145, 205, 226, 79, 44, 236, 101, 79, 44, 248, 170, 79, + 44, 197, 21, 79, 44, 245, 66, 79, 44, 209, 205, 79, 44, 226, 82, 79, 44, + 205, 224, 79, 44, 222, 243, 79, 44, 241, 96, 79, 44, 205, 98, 79, 44, + 218, 169, 79, 44, 209, 246, 79, 44, 197, 6, 79, 44, 214, 110, 79, 44, + 201, 9, 79, 44, 237, 203, 79, 44, 206, 182, 202, 156, 79, 44, 237, 250, + 244, 214, 79, 44, 181, 204, 202, 79, 44, 99, 232, 184, 79, 44, 206, 188, + 79, 44, 248, 77, 79, 44, 205, 208, 79, 44, 248, 36, 79, 44, 204, 241, 79, + 44, 232, 126, 79, 44, 232, 226, 79, 44, 239, 1, 79, 44, 232, 209, 79, 44, + 248, 57, 79, 44, 210, 204, 79, 44, 208, 153, 79, 44, 239, 88, 79, 44, + 250, 123, 79, 44, 205, 94, 79, 44, 216, 18, 79, 44, 204, 111, 79, 44, + 208, 180, 79, 44, 218, 189, 79, 44, 201, 190, 79, 44, 223, 68, 79, 44, + 204, 226, 79, 44, 239, 249, 79, 44, 197, 104, 79, 44, 239, 29, 216, 18, + 79, 44, 244, 155, 79, 44, 234, 210, 79, 44, 244, 226, 79, 44, 204, 247, + 79, 44, 197, 127, 79, 44, 235, 118, 79, 44, 244, 222, 79, 44, 235, 196, + 79, 44, 52, 196, 222, 79, 44, 157, 201, 191, 201, 118, 79, 44, 205, 239, + 79, 44, 235, 208, 79, 44, 241, 83, 79, 44, 239, 17, 79, 44, 212, 4, 79, + 44, 225, 209, 79, 44, 219, 173, 79, 44, 202, 83, 79, 44, 204, 58, 79, 44, + 222, 98, 79, 44, 200, 2, 79, 44, 235, 151, 79, 44, 248, 108, 77, 244, + 197, 79, 44, 206, 102, 79, 44, 237, 250, 203, 15, 79, 44, 197, 73, 79, + 44, 206, 1, 79, 44, 239, 75, 79, 44, 236, 67, 79, 44, 205, 134, 79, 44, + 51, 79, 44, 204, 228, 79, 44, 205, 117, 79, 44, 201, 216, 79, 44, 233, + 113, 79, 44, 247, 85, 79, 44, 205, 12, 79, 44, 249, 95, 79, 44, 210, 60, + 79, 44, 206, 76, 79, 44, 225, 201, 79, 44, 217, 88, 79, 44, 206, 249, 79, + 44, 235, 184, 79, 44, 214, 133, 79, 44, 251, 100, 79, 44, 212, 132, 79, + 44, 237, 76, 79, 44, 248, 28, 79, 44, 219, 199, 79, 44, 219, 17, 79, 44, + 207, 112, 79, 44, 250, 221, 79, 44, 218, 184, 79, 44, 201, 249, 79, 44, + 214, 80, 79, 44, 248, 112, 79, 44, 204, 224, 79, 44, 244, 167, 79, 44, + 233, 103, 79, 44, 202, 102, 79, 44, 226, 45, 79, 44, 248, 124, 79, 44, + 197, 151, 236, 225, 79, 44, 244, 196, 79, 44, 197, 88, 79, 44, 208, 129, + 79, 44, 231, 102, 79, 44, 205, 131, 79, 44, 199, 144, 79, 44, 249, 4, 79, + 44, 212, 184, 79, 44, 249, 125, 79, 44, 206, 244, 79, 44, 210, 157, 79, + 44, 209, 117, 79, 44, 235, 37, 79, 44, 248, 110, 79, 44, 247, 99, 79, 44, + 248, 141, 79, 44, 218, 186, 79, 44, 197, 150, 79, 44, 244, 235, 79, 44, + 197, 46, 79, 44, 239, 67, 79, 44, 199, 17, 79, 44, 233, 135, 79, 44, 221, + 240, 79, 44, 234, 74, 79, 44, 218, 172, 79, 44, 205, 247, 79, 44, 206, + 182, 203, 134, 248, 156, 79, 44, 210, 217, 79, 44, 248, 118, 79, 44, 196, + 245, 79, 44, 235, 233, 79, 44, 222, 190, 79, 44, 203, 107, 222, 190, 79, + 44, 222, 186, 79, 44, 205, 161, 79, 44, 222, 192, 79, 44, 197, 50, 79, + 44, 235, 55, 79, 44, 237, 65, 79, 44, 232, 137, 79, 44, 234, 252, 79, 44, + 231, 98, 79, 44, 248, 104, 79, 44, 203, 119, 79, 44, 232, 233, 79, 44, + 235, 144, 79, 44, 209, 10, 197, 46, 79, 44, 247, 87, 79, 44, 233, 200, + 79, 44, 235, 111, 79, 44, 248, 156, 79, 44, 208, 233, 79, 44, 239, 234, + 79, 44, 197, 79, 79, 44, 232, 102, 79, 44, 196, 61, 79, 44, 219, 28, 79, + 44, 248, 136, 79, 44, 236, 237, 79, 44, 234, 236, 79, 44, 201, 162, 79, + 44, 237, 206, 79, 44, 210, 198, 79, 44, 216, 20, 79, 44, 236, 102, 79, + 44, 201, 244, 79, 44, 237, 223, 79, 44, 201, 1, 79, 44, 235, 58, 143, + 239, 193, 190, 50, 202, 30, 210, 22, 143, 239, 193, 190, 90, 202, 30, 60, + 143, 239, 193, 190, 50, 202, 30, 112, 26, 210, 22, 143, 239, 193, 190, + 90, 202, 30, 112, 26, 60, 143, 239, 193, 190, 234, 217, 204, 81, 143, + 239, 193, 190, 204, 82, 234, 235, 57, 143, 239, 193, 190, 204, 82, 234, + 235, 60, 143, 239, 193, 190, 204, 82, 234, 235, 222, 184, 143, 239, 193, + 190, 204, 82, 234, 235, 200, 33, 222, 184, 143, 239, 193, 190, 204, 82, + 234, 235, 200, 33, 210, 22, 143, 239, 193, 190, 204, 82, 234, 235, 221, + 203, 222, 184, 143, 239, 193, 190, 214, 24, 143, 205, 148, 143, 244, 159, + 143, 234, 217, 204, 226, 239, 64, 78, 225, 202, 226, 65, 205, 11, 105, + 143, 225, 232, 78, 143, 244, 199, 78, 143, 31, 195, 79, 50, 251, 91, 179, + 53, 251, 91, 179, 50, 52, 251, 91, 179, 53, 52, 251, 91, 179, 50, 241, + 102, 179, 53, 241, 102, 179, 50, 59, 241, 102, 179, 53, 59, 241, 102, + 179, 50, 58, 222, 147, 179, 53, 58, 222, 147, 179, 212, 72, 78, 234, 13, + 78, 50, 201, 231, 206, 245, 179, 53, 201, 231, 206, 245, 179, 50, 59, + 222, 147, 179, 53, 59, 222, 147, 179, 50, 59, 201, 231, 206, 245, 179, + 53, 59, 201, 231, 206, 245, 179, 50, 59, 47, 179, 53, 59, 47, 179, 197, + 123, 240, 65, 210, 89, 52, 212, 20, 211, 62, 78, 52, 212, 20, 211, 62, + 78, 126, 52, 212, 20, 211, 62, 78, 212, 72, 117, 235, 233, 232, 181, 215, + 142, 100, 232, 181, 215, 142, 102, 232, 181, 215, 142, 134, 232, 181, + 215, 142, 136, 232, 181, 215, 142, 146, 232, 181, 215, 142, 167, 232, + 181, 215, 142, 178, 232, 181, 215, 142, 171, 232, 181, 215, 142, 182, + 143, 222, 128, 152, 78, 143, 209, 250, 152, 78, 143, 239, 202, 152, 78, + 143, 236, 203, 152, 78, 29, 206, 62, 76, 152, 78, 29, 52, 76, 152, 78, + 197, 119, 240, 65, 83, 225, 16, 210, 120, 78, 83, 225, 16, 210, 120, 3, + 198, 244, 205, 162, 78, 83, 225, 16, 210, 120, 117, 200, 33, 232, 225, + 83, 225, 16, 210, 120, 3, 198, 244, 205, 162, 117, 200, 33, 232, 225, 83, + 225, 16, 210, 120, 117, 221, 203, 232, 225, 46, 212, 72, 78, 143, 203, + 36, 222, 76, 235, 181, 207, 91, 105, 232, 181, 215, 142, 203, 23, 232, + 181, 215, 142, 200, 234, 232, 181, 215, 142, 202, 177, 83, 143, 225, 232, + 78, 220, 5, 78, 213, 134, 251, 127, 78, 143, 62, 226, 68, 143, 157, 235, + 137, 205, 148, 188, 1, 4, 63, 188, 1, 63, 188, 1, 4, 68, 188, 1, 68, 188, 1, 4, 66, 188, 1, 66, 188, 1, 4, 69, 188, 1, 69, 188, 1, 4, 72, 188, 1, - 72, 188, 1, 155, 188, 1, 234, 122, 188, 1, 224, 100, 188, 1, 233, 191, - 188, 1, 223, 186, 188, 1, 233, 75, 188, 1, 224, 208, 188, 1, 234, 47, - 188, 1, 224, 10, 188, 1, 233, 143, 188, 1, 183, 188, 1, 195, 115, 188, 1, + 72, 188, 1, 155, 188, 1, 234, 123, 188, 1, 224, 101, 188, 1, 233, 192, + 188, 1, 223, 187, 188, 1, 233, 76, 188, 1, 224, 209, 188, 1, 234, 48, + 188, 1, 224, 11, 188, 1, 233, 144, 188, 1, 183, 188, 1, 195, 115, 188, 1, 206, 112, 188, 1, 195, 33, 188, 1, 204, 172, 188, 1, 194, 255, 188, 1, 208, 147, 188, 1, 195, 88, 188, 1, 205, 200, 188, 1, 195, 11, 188, 1, - 189, 188, 1, 240, 135, 188, 1, 202, 122, 188, 1, 239, 151, 188, 1, 4, - 201, 40, 188, 1, 201, 40, 188, 1, 237, 200, 188, 1, 203, 68, 188, 1, 239, - 251, 188, 1, 149, 188, 1, 239, 27, 188, 1, 176, 188, 1, 216, 222, 188, 1, - 215, 185, 188, 1, 217, 117, 188, 1, 216, 49, 188, 1, 142, 188, 1, 249, - 144, 188, 1, 161, 188, 1, 232, 70, 188, 1, 248, 183, 188, 1, 212, 219, - 188, 1, 231, 74, 188, 1, 248, 20, 188, 1, 211, 226, 188, 1, 232, 146, - 188, 1, 249, 8, 188, 1, 213, 91, 188, 1, 231, 192, 188, 1, 248, 115, 188, - 1, 212, 116, 188, 1, 166, 188, 1, 219, 77, 188, 1, 218, 144, 188, 1, 219, - 206, 188, 1, 218, 250, 188, 1, 4, 164, 188, 1, 164, 188, 1, 4, 195, 217, + 189, 188, 1, 240, 136, 188, 1, 202, 122, 188, 1, 239, 152, 188, 1, 4, + 201, 40, 188, 1, 201, 40, 188, 1, 237, 201, 188, 1, 203, 68, 188, 1, 239, + 252, 188, 1, 149, 188, 1, 239, 28, 188, 1, 176, 188, 1, 216, 223, 188, 1, + 215, 186, 188, 1, 217, 118, 188, 1, 216, 50, 188, 1, 142, 188, 1, 249, + 145, 188, 1, 161, 188, 1, 232, 71, 188, 1, 248, 184, 188, 1, 212, 220, + 188, 1, 231, 75, 188, 1, 248, 21, 188, 1, 211, 227, 188, 1, 232, 147, + 188, 1, 249, 9, 188, 1, 213, 92, 188, 1, 231, 193, 188, 1, 248, 116, 188, + 1, 212, 117, 188, 1, 166, 188, 1, 219, 78, 188, 1, 218, 145, 188, 1, 219, + 207, 188, 1, 218, 251, 188, 1, 4, 164, 188, 1, 164, 188, 1, 4, 195, 217, 188, 1, 195, 217, 188, 1, 4, 196, 3, 188, 1, 196, 3, 188, 1, 169, 188, 1, - 210, 72, 188, 1, 209, 140, 188, 1, 210, 182, 188, 1, 209, 232, 188, 1, 4, + 210, 72, 188, 1, 209, 140, 188, 1, 210, 183, 188, 1, 209, 232, 188, 1, 4, 197, 166, 188, 1, 197, 166, 188, 1, 197, 70, 188, 1, 197, 109, 188, 1, - 197, 34, 188, 1, 218, 54, 188, 1, 197, 220, 188, 1, 4, 155, 188, 1, 4, - 224, 208, 38, 224, 233, 198, 244, 205, 162, 78, 38, 224, 233, 207, 110, - 205, 162, 78, 224, 233, 198, 244, 205, 162, 78, 224, 233, 207, 110, 205, - 162, 78, 188, 225, 231, 78, 188, 198, 244, 225, 231, 78, 188, 239, 110, - 195, 233, 224, 233, 52, 231, 6, 71, 1, 4, 63, 71, 1, 63, 71, 1, 4, 68, + 197, 34, 188, 1, 218, 55, 188, 1, 197, 220, 188, 1, 4, 155, 188, 1, 4, + 224, 209, 38, 224, 234, 198, 244, 205, 162, 78, 38, 224, 234, 207, 110, + 205, 162, 78, 224, 234, 198, 244, 205, 162, 78, 224, 234, 207, 110, 205, + 162, 78, 188, 225, 232, 78, 188, 198, 244, 225, 232, 78, 188, 239, 111, + 195, 233, 224, 234, 52, 231, 7, 71, 1, 4, 63, 71, 1, 63, 71, 1, 4, 68, 71, 1, 68, 71, 1, 4, 66, 71, 1, 66, 71, 1, 4, 69, 71, 1, 69, 71, 1, 4, - 72, 71, 1, 72, 71, 1, 155, 71, 1, 234, 122, 71, 1, 224, 100, 71, 1, 233, - 191, 71, 1, 223, 186, 71, 1, 233, 75, 71, 1, 224, 208, 71, 1, 234, 47, - 71, 1, 224, 10, 71, 1, 233, 143, 71, 1, 183, 71, 1, 195, 115, 71, 1, 206, + 72, 71, 1, 72, 71, 1, 155, 71, 1, 234, 123, 71, 1, 224, 101, 71, 1, 233, + 192, 71, 1, 223, 187, 71, 1, 233, 76, 71, 1, 224, 209, 71, 1, 234, 48, + 71, 1, 224, 11, 71, 1, 233, 144, 71, 1, 183, 71, 1, 195, 115, 71, 1, 206, 112, 71, 1, 195, 33, 71, 1, 204, 172, 71, 1, 194, 255, 71, 1, 208, 147, 71, 1, 195, 88, 71, 1, 205, 200, 71, 1, 195, 11, 71, 1, 189, 71, 1, 240, - 135, 71, 1, 202, 122, 71, 1, 239, 151, 71, 1, 4, 201, 40, 71, 1, 201, 40, - 71, 1, 237, 200, 71, 1, 203, 68, 71, 1, 239, 251, 71, 1, 149, 71, 1, 239, - 27, 71, 1, 176, 71, 1, 216, 222, 71, 1, 215, 185, 71, 1, 217, 117, 71, 1, - 216, 49, 71, 1, 142, 71, 1, 249, 144, 71, 1, 161, 71, 1, 232, 70, 71, 1, - 248, 183, 71, 1, 212, 219, 71, 1, 231, 74, 71, 1, 248, 20, 71, 1, 211, - 226, 71, 1, 232, 146, 71, 1, 249, 8, 71, 1, 213, 91, 71, 1, 231, 192, 71, - 1, 248, 115, 71, 1, 212, 116, 71, 1, 166, 71, 1, 219, 77, 71, 1, 218, - 144, 71, 1, 219, 206, 71, 1, 218, 250, 71, 1, 4, 164, 71, 1, 164, 71, 1, + 136, 71, 1, 202, 122, 71, 1, 239, 152, 71, 1, 4, 201, 40, 71, 1, 201, 40, + 71, 1, 237, 201, 71, 1, 203, 68, 71, 1, 239, 252, 71, 1, 149, 71, 1, 239, + 28, 71, 1, 176, 71, 1, 216, 223, 71, 1, 215, 186, 71, 1, 217, 118, 71, 1, + 216, 50, 71, 1, 142, 71, 1, 249, 145, 71, 1, 161, 71, 1, 232, 71, 71, 1, + 248, 184, 71, 1, 212, 220, 71, 1, 231, 75, 71, 1, 248, 21, 71, 1, 211, + 227, 71, 1, 232, 147, 71, 1, 249, 9, 71, 1, 213, 92, 71, 1, 231, 193, 71, + 1, 248, 116, 71, 1, 212, 117, 71, 1, 166, 71, 1, 219, 78, 71, 1, 218, + 145, 71, 1, 219, 207, 71, 1, 218, 251, 71, 1, 4, 164, 71, 1, 164, 71, 1, 4, 195, 217, 71, 1, 195, 217, 71, 1, 4, 196, 3, 71, 1, 196, 3, 71, 1, - 169, 71, 1, 210, 72, 71, 1, 209, 140, 71, 1, 210, 182, 71, 1, 209, 232, + 169, 71, 1, 210, 72, 71, 1, 209, 140, 71, 1, 210, 183, 71, 1, 209, 232, 71, 1, 4, 197, 166, 71, 1, 197, 166, 71, 1, 197, 70, 71, 1, 197, 109, 71, - 1, 197, 34, 71, 1, 218, 54, 71, 1, 197, 220, 71, 1, 4, 155, 71, 1, 4, - 224, 208, 71, 1, 199, 152, 71, 1, 199, 34, 71, 1, 199, 118, 71, 1, 198, - 248, 71, 112, 238, 252, 224, 233, 211, 251, 205, 162, 78, 71, 225, 231, - 78, 71, 198, 244, 225, 231, 78, 71, 239, 110, 223, 228, 248, 93, 1, 250, - 111, 248, 93, 1, 214, 2, 248, 93, 1, 221, 135, 248, 93, 1, 236, 48, 248, - 93, 1, 240, 230, 248, 93, 1, 203, 216, 248, 93, 1, 218, 54, 248, 93, 1, - 159, 248, 93, 1, 234, 189, 248, 93, 1, 225, 79, 248, 93, 1, 233, 14, 248, - 93, 1, 225, 216, 248, 93, 1, 211, 166, 248, 93, 1, 196, 222, 248, 93, 1, - 195, 75, 248, 93, 1, 247, 17, 248, 93, 1, 207, 52, 248, 93, 1, 144, 248, - 93, 1, 195, 158, 248, 93, 1, 247, 206, 248, 93, 1, 209, 80, 248, 93, 1, - 63, 248, 93, 1, 72, 248, 93, 1, 69, 248, 93, 1, 237, 39, 248, 93, 1, 251, - 199, 248, 93, 1, 237, 32, 248, 93, 1, 250, 149, 248, 93, 1, 214, 38, 248, - 93, 1, 251, 105, 248, 93, 1, 236, 229, 248, 93, 1, 251, 96, 248, 93, 1, - 236, 214, 248, 93, 1, 236, 162, 248, 93, 1, 68, 248, 93, 1, 66, 248, 93, - 1, 225, 229, 248, 93, 1, 199, 230, 248, 93, 1, 217, 72, 248, 93, 1, 233, - 147, 248, 93, 1, 226, 120, 248, 93, 1, 177, 3, 76, 57, 248, 93, 1, 216, - 86, 29, 1, 224, 47, 29, 1, 205, 72, 29, 1, 224, 40, 29, 1, 216, 207, 29, - 1, 216, 205, 29, 1, 216, 204, 29, 1, 202, 97, 29, 1, 205, 61, 29, 1, 210, + 1, 197, 34, 71, 1, 218, 55, 71, 1, 197, 220, 71, 1, 4, 155, 71, 1, 4, + 224, 209, 71, 1, 199, 152, 71, 1, 199, 34, 71, 1, 199, 118, 71, 1, 198, + 248, 71, 112, 238, 253, 224, 234, 211, 252, 205, 162, 78, 71, 225, 232, + 78, 71, 198, 244, 225, 232, 78, 71, 239, 111, 223, 229, 248, 94, 1, 250, + 112, 248, 94, 1, 214, 3, 248, 94, 1, 221, 136, 248, 94, 1, 236, 49, 248, + 94, 1, 240, 231, 248, 94, 1, 203, 216, 248, 94, 1, 218, 55, 248, 94, 1, + 159, 248, 94, 1, 234, 190, 248, 94, 1, 225, 80, 248, 94, 1, 233, 15, 248, + 94, 1, 225, 217, 248, 94, 1, 211, 167, 248, 94, 1, 196, 222, 248, 94, 1, + 195, 75, 248, 94, 1, 247, 18, 248, 94, 1, 207, 52, 248, 94, 1, 144, 248, + 94, 1, 195, 158, 248, 94, 1, 247, 207, 248, 94, 1, 209, 80, 248, 94, 1, + 63, 248, 94, 1, 72, 248, 94, 1, 69, 248, 94, 1, 237, 40, 248, 94, 1, 251, + 200, 248, 94, 1, 237, 33, 248, 94, 1, 250, 150, 248, 94, 1, 214, 39, 248, + 94, 1, 251, 106, 248, 94, 1, 236, 230, 248, 94, 1, 251, 97, 248, 94, 1, + 236, 215, 248, 94, 1, 236, 163, 248, 94, 1, 68, 248, 94, 1, 66, 248, 94, + 1, 225, 230, 248, 94, 1, 199, 230, 248, 94, 1, 217, 73, 248, 94, 1, 233, + 148, 248, 94, 1, 226, 121, 248, 94, 1, 177, 3, 76, 57, 248, 94, 1, 216, + 87, 29, 1, 224, 48, 29, 1, 205, 72, 29, 1, 224, 41, 29, 1, 216, 208, 29, + 1, 216, 206, 29, 1, 216, 205, 29, 1, 202, 97, 29, 1, 205, 61, 29, 1, 210, 54, 29, 1, 210, 49, 29, 1, 210, 46, 29, 1, 210, 39, 29, 1, 210, 34, 29, - 1, 210, 29, 29, 1, 210, 40, 29, 1, 210, 52, 29, 1, 219, 55, 29, 1, 212, - 205, 29, 1, 205, 69, 29, 1, 212, 194, 29, 1, 206, 52, 29, 1, 205, 66, 29, - 1, 226, 142, 29, 1, 245, 5, 29, 1, 205, 76, 29, 1, 245, 70, 29, 1, 224, - 121, 29, 1, 202, 191, 29, 1, 212, 243, 29, 1, 232, 54, 29, 1, 63, 29, 1, - 251, 244, 29, 1, 164, 29, 1, 196, 118, 29, 1, 236, 191, 29, 1, 69, 29, 1, + 1, 210, 29, 29, 1, 210, 40, 29, 1, 210, 52, 29, 1, 219, 56, 29, 1, 212, + 206, 29, 1, 205, 69, 29, 1, 212, 195, 29, 1, 206, 52, 29, 1, 205, 66, 29, + 1, 226, 143, 29, 1, 245, 6, 29, 1, 205, 76, 29, 1, 245, 71, 29, 1, 224, + 122, 29, 1, 202, 191, 29, 1, 212, 244, 29, 1, 232, 55, 29, 1, 63, 29, 1, + 251, 245, 29, 1, 164, 29, 1, 196, 118, 29, 1, 236, 192, 29, 1, 69, 29, 1, 196, 56, 29, 1, 196, 69, 29, 1, 72, 29, 1, 197, 166, 29, 1, 197, 157, 29, - 1, 214, 163, 29, 1, 196, 3, 29, 1, 66, 29, 1, 197, 91, 29, 1, 197, 109, - 29, 1, 197, 70, 29, 1, 195, 217, 29, 1, 236, 115, 29, 1, 196, 24, 29, 1, - 68, 29, 235, 133, 29, 1, 205, 70, 29, 1, 216, 197, 29, 1, 216, 199, 29, - 1, 216, 202, 29, 1, 210, 47, 29, 1, 210, 28, 29, 1, 210, 36, 29, 1, 210, - 41, 29, 1, 210, 26, 29, 1, 219, 48, 29, 1, 219, 45, 29, 1, 219, 49, 29, - 1, 225, 0, 29, 1, 212, 200, 29, 1, 212, 186, 29, 1, 212, 192, 29, 1, 212, - 189, 29, 1, 212, 203, 29, 1, 212, 187, 29, 1, 224, 254, 29, 1, 224, 252, + 1, 214, 164, 29, 1, 196, 3, 29, 1, 66, 29, 1, 197, 91, 29, 1, 197, 109, + 29, 1, 197, 70, 29, 1, 195, 217, 29, 1, 236, 116, 29, 1, 196, 24, 29, 1, + 68, 29, 235, 134, 29, 1, 205, 70, 29, 1, 216, 198, 29, 1, 216, 200, 29, + 1, 216, 203, 29, 1, 210, 47, 29, 1, 210, 28, 29, 1, 210, 36, 29, 1, 210, + 41, 29, 1, 210, 26, 29, 1, 219, 49, 29, 1, 219, 46, 29, 1, 219, 50, 29, + 1, 225, 1, 29, 1, 212, 201, 29, 1, 212, 187, 29, 1, 212, 193, 29, 1, 212, + 190, 29, 1, 212, 204, 29, 1, 212, 188, 29, 1, 224, 255, 29, 1, 224, 253, 29, 1, 206, 45, 29, 1, 206, 43, 29, 1, 206, 35, 29, 1, 206, 40, 29, 1, - 206, 50, 29, 1, 213, 173, 29, 1, 205, 73, 29, 1, 196, 46, 29, 1, 196, 40, - 29, 1, 196, 41, 29, 1, 224, 255, 29, 1, 205, 74, 29, 1, 196, 52, 29, 1, + 206, 50, 29, 1, 213, 174, 29, 1, 205, 73, 29, 1, 196, 46, 29, 1, 196, 40, + 29, 1, 196, 41, 29, 1, 225, 0, 29, 1, 205, 74, 29, 1, 196, 52, 29, 1, 195, 247, 29, 1, 195, 246, 29, 1, 195, 249, 29, 1, 195, 204, 29, 1, 195, - 205, 29, 1, 195, 208, 29, 1, 251, 5, 29, 1, 250, 255, 143, 251, 75, 222, - 63, 78, 143, 251, 75, 210, 90, 78, 143, 251, 75, 97, 78, 143, 251, 75, - 99, 78, 143, 251, 75, 115, 78, 143, 251, 75, 235, 6, 78, 143, 251, 75, - 201, 243, 78, 143, 251, 75, 112, 78, 143, 251, 75, 248, 84, 78, 143, 251, - 75, 235, 112, 78, 143, 251, 75, 208, 136, 78, 143, 251, 75, 202, 185, 78, - 143, 251, 75, 234, 255, 78, 143, 251, 75, 232, 122, 78, 143, 251, 75, - 237, 72, 78, 143, 251, 75, 220, 62, 78, 248, 93, 1, 248, 20, 248, 93, 1, - 195, 33, 248, 93, 1, 225, 171, 248, 93, 1, 233, 75, 248, 93, 1, 237, 53, - 248, 93, 1, 236, 211, 248, 93, 1, 214, 101, 248, 93, 1, 214, 105, 248, - 93, 1, 226, 0, 248, 93, 1, 251, 77, 248, 93, 1, 226, 51, 248, 93, 1, 200, - 42, 248, 93, 1, 226, 102, 248, 93, 1, 217, 50, 248, 93, 1, 251, 192, 248, - 93, 1, 250, 144, 248, 93, 1, 251, 122, 248, 93, 1, 214, 126, 248, 93, 1, - 214, 108, 248, 93, 1, 226, 48, 248, 93, 48, 1, 214, 2, 248, 93, 48, 1, - 203, 216, 248, 93, 48, 1, 225, 79, 248, 93, 48, 1, 233, 14, 248, 93, 1, - 233, 230, 248, 93, 1, 222, 122, 248, 93, 1, 194, 235, 12, 204, 196, 203, - 216, 12, 204, 196, 197, 82, 12, 204, 196, 196, 197, 12, 204, 196, 247, - 219, 12, 204, 196, 204, 68, 12, 204, 196, 230, 252, 12, 204, 196, 231, 0, - 12, 204, 196, 231, 83, 12, 204, 196, 230, 253, 12, 204, 196, 203, 219, - 12, 204, 196, 230, 255, 12, 204, 196, 230, 251, 12, 204, 196, 231, 81, - 12, 204, 196, 230, 254, 12, 204, 196, 230, 250, 12, 204, 196, 218, 54, - 12, 204, 196, 233, 14, 12, 204, 196, 209, 80, 12, 204, 196, 214, 2, 12, - 204, 196, 205, 151, 12, 204, 196, 240, 230, 12, 204, 196, 231, 1, 12, - 204, 196, 232, 80, 12, 204, 196, 203, 228, 12, 204, 196, 204, 45, 12, - 204, 196, 205, 23, 12, 204, 196, 207, 58, 12, 204, 196, 213, 95, 12, 204, - 196, 211, 168, 12, 204, 196, 202, 31, 12, 204, 196, 203, 218, 12, 204, - 196, 204, 57, 12, 204, 196, 231, 11, 12, 204, 196, 230, 249, 12, 204, - 196, 213, 7, 12, 204, 196, 211, 166, 71, 1, 4, 223, 186, 71, 1, 4, 206, - 112, 71, 1, 4, 204, 172, 71, 1, 4, 149, 71, 1, 4, 215, 185, 71, 1, 4, - 142, 71, 1, 4, 232, 70, 71, 1, 4, 231, 74, 71, 1, 4, 232, 146, 71, 1, 4, - 231, 192, 71, 1, 4, 218, 144, 71, 1, 4, 169, 71, 1, 4, 210, 72, 71, 1, 4, - 209, 140, 71, 1, 4, 210, 182, 71, 1, 4, 209, 232, 119, 29, 224, 47, 119, - 29, 216, 207, 119, 29, 202, 97, 119, 29, 210, 54, 119, 29, 219, 55, 119, - 29, 212, 205, 119, 29, 206, 52, 119, 29, 226, 142, 119, 29, 245, 5, 119, - 29, 245, 70, 119, 29, 224, 121, 119, 29, 202, 191, 119, 29, 212, 243, - 119, 29, 232, 54, 119, 29, 224, 48, 63, 119, 29, 216, 208, 63, 119, 29, - 202, 98, 63, 119, 29, 210, 55, 63, 119, 29, 219, 56, 63, 119, 29, 212, - 206, 63, 119, 29, 206, 53, 63, 119, 29, 226, 143, 63, 119, 29, 245, 6, - 63, 119, 29, 245, 71, 63, 119, 29, 224, 122, 63, 119, 29, 202, 192, 63, - 119, 29, 212, 244, 63, 119, 29, 232, 55, 63, 119, 29, 245, 6, 66, 119, - 223, 232, 190, 214, 141, 119, 223, 232, 190, 177, 231, 74, 119, 230, 190, - 100, 119, 230, 190, 102, 119, 230, 190, 134, 119, 230, 190, 136, 119, - 230, 190, 146, 119, 230, 190, 167, 119, 230, 190, 178, 119, 230, 190, - 171, 119, 230, 190, 182, 119, 230, 190, 203, 23, 119, 230, 190, 218, 188, - 119, 230, 190, 235, 117, 119, 230, 190, 197, 127, 119, 230, 190, 197, 14, - 119, 230, 190, 219, 142, 119, 230, 190, 237, 71, 119, 230, 190, 204, 111, - 119, 230, 190, 204, 229, 119, 230, 190, 232, 155, 119, 230, 190, 205, - 189, 119, 230, 190, 217, 221, 119, 230, 190, 205, 133, 119, 230, 190, - 235, 128, 119, 230, 190, 241, 147, 119, 230, 190, 223, 70, 119, 230, 190, - 210, 113, 119, 230, 190, 247, 151, 119, 230, 190, 204, 178, 119, 230, - 190, 204, 91, 119, 230, 190, 236, 201, 119, 230, 190, 210, 103, 119, 230, - 190, 251, 141, 119, 230, 190, 235, 160, 119, 230, 190, 210, 101, 119, - 230, 190, 207, 112, 119, 230, 190, 210, 177, 46, 230, 190, 211, 77, 46, - 230, 190, 224, 74, 46, 230, 190, 208, 166, 46, 230, 190, 223, 228, 46, - 31, 203, 24, 214, 119, 58, 205, 94, 46, 31, 200, 235, 214, 119, 58, 205, - 94, 46, 31, 202, 178, 214, 119, 58, 205, 94, 46, 31, 235, 14, 214, 119, - 58, 205, 94, 46, 31, 235, 145, 214, 119, 58, 205, 94, 46, 31, 206, 14, - 214, 119, 58, 205, 94, 46, 31, 207, 66, 214, 119, 58, 205, 94, 46, 31, - 237, 20, 214, 119, 58, 205, 94, 213, 129, 55, 46, 31, 200, 235, 100, 46, - 31, 200, 235, 102, 46, 31, 200, 235, 134, 46, 31, 200, 235, 136, 46, 31, - 200, 235, 146, 46, 31, 200, 235, 167, 46, 31, 200, 235, 178, 46, 31, 200, - 235, 171, 46, 31, 200, 235, 182, 46, 31, 202, 177, 46, 31, 202, 178, 100, - 46, 31, 202, 178, 102, 46, 31, 202, 178, 134, 46, 31, 202, 178, 136, 46, - 31, 202, 178, 146, 46, 29, 224, 47, 46, 29, 216, 207, 46, 29, 202, 97, - 46, 29, 210, 54, 46, 29, 219, 55, 46, 29, 212, 205, 46, 29, 206, 52, 46, - 29, 226, 142, 46, 29, 245, 5, 46, 29, 245, 70, 46, 29, 224, 121, 46, 29, - 202, 191, 46, 29, 212, 243, 46, 29, 232, 54, 46, 29, 224, 48, 63, 46, 29, - 216, 208, 63, 46, 29, 202, 98, 63, 46, 29, 210, 55, 63, 46, 29, 219, 56, - 63, 46, 29, 212, 206, 63, 46, 29, 206, 53, 63, 46, 29, 226, 143, 63, 46, - 29, 245, 6, 63, 46, 29, 245, 71, 63, 46, 29, 224, 122, 63, 46, 29, 202, - 192, 63, 46, 29, 212, 244, 63, 46, 29, 232, 55, 63, 46, 223, 232, 190, - 247, 5, 46, 223, 232, 190, 225, 105, 46, 29, 226, 143, 66, 223, 232, 205, - 11, 105, 46, 230, 190, 100, 46, 230, 190, 102, 46, 230, 190, 134, 46, - 230, 190, 136, 46, 230, 190, 146, 46, 230, 190, 167, 46, 230, 190, 178, - 46, 230, 190, 171, 46, 230, 190, 182, 46, 230, 190, 203, 23, 46, 230, - 190, 218, 188, 46, 230, 190, 235, 117, 46, 230, 190, 197, 127, 46, 230, - 190, 197, 14, 46, 230, 190, 219, 142, 46, 230, 190, 237, 71, 46, 230, - 190, 204, 111, 46, 230, 190, 204, 229, 46, 230, 190, 232, 155, 46, 230, - 190, 205, 189, 46, 230, 190, 217, 221, 46, 230, 190, 205, 133, 46, 230, - 190, 235, 128, 46, 230, 190, 241, 147, 46, 230, 190, 223, 70, 46, 230, - 190, 208, 134, 46, 230, 190, 220, 65, 46, 230, 190, 235, 170, 46, 230, - 190, 204, 123, 46, 230, 190, 236, 93, 46, 230, 190, 212, 14, 46, 230, - 190, 250, 153, 46, 230, 190, 225, 232, 46, 230, 190, 210, 101, 46, 230, - 190, 241, 106, 46, 230, 190, 241, 94, 46, 230, 190, 232, 47, 46, 230, - 190, 247, 35, 46, 230, 190, 221, 207, 46, 230, 190, 222, 183, 46, 230, - 190, 210, 22, 46, 230, 190, 219, 191, 46, 230, 190, 210, 131, 46, 230, - 190, 204, 178, 46, 230, 190, 204, 91, 46, 230, 190, 236, 201, 46, 230, - 190, 210, 103, 46, 230, 190, 251, 141, 46, 230, 190, 216, 193, 46, 31, - 202, 178, 167, 46, 31, 202, 178, 178, 46, 31, 202, 178, 171, 46, 31, 202, - 178, 182, 46, 31, 235, 13, 46, 31, 235, 14, 100, 46, 31, 235, 14, 102, - 46, 31, 235, 14, 134, 46, 31, 235, 14, 136, 46, 31, 235, 14, 146, 46, 31, - 235, 14, 167, 46, 31, 235, 14, 178, 46, 31, 235, 14, 171, 46, 31, 235, - 14, 182, 46, 31, 235, 144, 143, 203, 36, 16, 36, 225, 203, 143, 203, 36, - 16, 36, 235, 182, 143, 203, 36, 16, 36, 220, 30, 143, 203, 36, 16, 36, - 251, 19, 143, 203, 36, 16, 36, 219, 250, 143, 203, 36, 16, 36, 225, 102, - 143, 203, 36, 16, 36, 225, 103, 143, 203, 36, 16, 36, 250, 145, 143, 203, - 36, 16, 36, 207, 89, 143, 203, 36, 16, 36, 214, 169, 143, 203, 36, 16, - 36, 216, 5, 143, 203, 36, 16, 36, 239, 245, 47, 232, 80, 47, 236, 158, - 47, 236, 103, 222, 80, 222, 107, 55, 46, 71, 63, 46, 71, 68, 46, 71, 66, - 46, 71, 69, 46, 71, 72, 46, 71, 155, 46, 71, 224, 100, 46, 71, 223, 186, - 46, 71, 224, 208, 46, 71, 224, 10, 46, 71, 183, 46, 71, 206, 112, 46, 71, - 204, 172, 46, 71, 208, 147, 46, 71, 205, 200, 46, 71, 189, 46, 71, 202, - 122, 46, 71, 201, 40, 46, 71, 203, 68, 46, 71, 149, 46, 71, 176, 46, 71, - 216, 222, 46, 71, 215, 185, 46, 71, 217, 117, 46, 71, 216, 49, 46, 71, - 142, 46, 71, 232, 70, 46, 71, 231, 74, 46, 71, 232, 146, 46, 71, 231, - 192, 46, 71, 166, 46, 71, 219, 77, 46, 71, 218, 144, 46, 71, 219, 206, - 46, 71, 218, 250, 46, 71, 164, 46, 71, 195, 217, 46, 71, 196, 3, 46, 71, - 169, 46, 71, 210, 72, 46, 71, 209, 140, 46, 71, 210, 182, 46, 71, 209, - 232, 46, 71, 197, 166, 46, 71, 197, 70, 46, 71, 197, 109, 46, 71, 197, - 34, 47, 251, 44, 47, 250, 203, 47, 251, 71, 47, 252, 124, 47, 226, 53, - 47, 226, 20, 47, 200, 39, 47, 236, 130, 47, 237, 50, 47, 214, 104, 47, - 214, 97, 47, 225, 28, 47, 224, 248, 47, 224, 243, 47, 234, 77, 47, 234, - 87, 47, 233, 179, 47, 233, 175, 47, 223, 100, 47, 233, 166, 47, 224, 65, - 47, 224, 64, 47, 224, 63, 47, 224, 62, 47, 233, 43, 47, 233, 42, 47, 223, - 149, 47, 223, 152, 47, 224, 195, 47, 223, 230, 47, 223, 238, 47, 208, - 252, 47, 208, 210, 47, 206, 33, 47, 207, 95, 47, 207, 94, 47, 240, 131, - 47, 239, 188, 47, 238, 253, 47, 202, 13, 47, 217, 215, 47, 216, 6, 47, - 232, 229, 47, 213, 236, 47, 213, 235, 47, 249, 141, 47, 212, 216, 47, - 212, 179, 47, 212, 180, 47, 248, 151, 47, 231, 69, 47, 231, 64, 47, 247, - 234, 47, 231, 48, 47, 232, 108, 47, 213, 18, 47, 213, 59, 47, 232, 89, - 47, 213, 55, 47, 213, 73, 47, 248, 245, 47, 212, 105, 47, 248, 89, 47, - 231, 168, 47, 212, 91, 47, 231, 159, 47, 231, 161, 47, 220, 78, 47, 220, - 74, 47, 220, 83, 47, 220, 16, 47, 220, 47, 47, 219, 34, 47, 219, 9, 47, - 219, 8, 47, 219, 179, 47, 219, 176, 47, 219, 180, 47, 196, 128, 47, 196, + 205, 29, 1, 195, 208, 29, 1, 251, 6, 29, 1, 251, 0, 143, 251, 76, 222, + 64, 78, 143, 251, 76, 210, 90, 78, 143, 251, 76, 97, 78, 143, 251, 76, + 99, 78, 143, 251, 76, 115, 78, 143, 251, 76, 235, 7, 78, 143, 251, 76, + 201, 243, 78, 143, 251, 76, 112, 78, 143, 251, 76, 248, 85, 78, 143, 251, + 76, 235, 113, 78, 143, 251, 76, 208, 136, 78, 143, 251, 76, 202, 185, 78, + 143, 251, 76, 235, 0, 78, 143, 251, 76, 232, 123, 78, 143, 251, 76, 237, + 73, 78, 143, 251, 76, 220, 63, 78, 248, 94, 1, 248, 21, 248, 94, 1, 195, + 33, 248, 94, 1, 225, 172, 248, 94, 1, 233, 76, 248, 94, 1, 237, 54, 248, + 94, 1, 236, 212, 248, 94, 1, 214, 102, 248, 94, 1, 214, 106, 248, 94, 1, + 226, 1, 248, 94, 1, 251, 78, 248, 94, 1, 226, 52, 248, 94, 1, 200, 42, + 248, 94, 1, 226, 103, 248, 94, 1, 217, 51, 248, 94, 1, 251, 193, 248, 94, + 1, 250, 145, 248, 94, 1, 251, 123, 248, 94, 1, 214, 127, 248, 94, 1, 214, + 109, 248, 94, 1, 226, 49, 248, 94, 48, 1, 214, 3, 248, 94, 48, 1, 203, + 216, 248, 94, 48, 1, 225, 80, 248, 94, 48, 1, 233, 15, 248, 94, 1, 233, + 231, 248, 94, 1, 222, 123, 248, 94, 1, 194, 235, 12, 204, 196, 203, 216, + 12, 204, 196, 197, 82, 12, 204, 196, 196, 197, 12, 204, 196, 247, 220, + 12, 204, 196, 204, 68, 12, 204, 196, 230, 253, 12, 204, 196, 231, 1, 12, + 204, 196, 231, 84, 12, 204, 196, 230, 254, 12, 204, 196, 203, 219, 12, + 204, 196, 231, 0, 12, 204, 196, 230, 252, 12, 204, 196, 231, 82, 12, 204, + 196, 230, 255, 12, 204, 196, 230, 251, 12, 204, 196, 218, 55, 12, 204, + 196, 233, 15, 12, 204, 196, 209, 80, 12, 204, 196, 214, 3, 12, 204, 196, + 205, 151, 12, 204, 196, 240, 231, 12, 204, 196, 231, 2, 12, 204, 196, + 232, 81, 12, 204, 196, 203, 228, 12, 204, 196, 204, 45, 12, 204, 196, + 205, 23, 12, 204, 196, 207, 58, 12, 204, 196, 213, 96, 12, 204, 196, 211, + 169, 12, 204, 196, 202, 31, 12, 204, 196, 203, 218, 12, 204, 196, 204, + 57, 12, 204, 196, 231, 12, 12, 204, 196, 230, 250, 12, 204, 196, 213, 8, + 12, 204, 196, 211, 167, 71, 1, 4, 223, 187, 71, 1, 4, 206, 112, 71, 1, 4, + 204, 172, 71, 1, 4, 149, 71, 1, 4, 215, 186, 71, 1, 4, 142, 71, 1, 4, + 232, 71, 71, 1, 4, 231, 75, 71, 1, 4, 232, 147, 71, 1, 4, 231, 193, 71, + 1, 4, 218, 145, 71, 1, 4, 169, 71, 1, 4, 210, 72, 71, 1, 4, 209, 140, 71, + 1, 4, 210, 183, 71, 1, 4, 209, 232, 119, 29, 224, 48, 119, 29, 216, 208, + 119, 29, 202, 97, 119, 29, 210, 54, 119, 29, 219, 56, 119, 29, 212, 206, + 119, 29, 206, 52, 119, 29, 226, 143, 119, 29, 245, 6, 119, 29, 245, 71, + 119, 29, 224, 122, 119, 29, 202, 191, 119, 29, 212, 244, 119, 29, 232, + 55, 119, 29, 224, 49, 63, 119, 29, 216, 209, 63, 119, 29, 202, 98, 63, + 119, 29, 210, 55, 63, 119, 29, 219, 57, 63, 119, 29, 212, 207, 63, 119, + 29, 206, 53, 63, 119, 29, 226, 144, 63, 119, 29, 245, 7, 63, 119, 29, + 245, 72, 63, 119, 29, 224, 123, 63, 119, 29, 202, 192, 63, 119, 29, 212, + 245, 63, 119, 29, 232, 56, 63, 119, 29, 245, 7, 66, 119, 223, 233, 190, + 214, 142, 119, 223, 233, 190, 177, 231, 75, 119, 230, 191, 100, 119, 230, + 191, 102, 119, 230, 191, 134, 119, 230, 191, 136, 119, 230, 191, 146, + 119, 230, 191, 167, 119, 230, 191, 178, 119, 230, 191, 171, 119, 230, + 191, 182, 119, 230, 191, 203, 23, 119, 230, 191, 218, 189, 119, 230, 191, + 235, 118, 119, 230, 191, 197, 127, 119, 230, 191, 197, 14, 119, 230, 191, + 219, 143, 119, 230, 191, 237, 72, 119, 230, 191, 204, 111, 119, 230, 191, + 204, 229, 119, 230, 191, 232, 156, 119, 230, 191, 205, 189, 119, 230, + 191, 217, 222, 119, 230, 191, 205, 133, 119, 230, 191, 235, 129, 119, + 230, 191, 241, 148, 119, 230, 191, 223, 71, 119, 230, 191, 210, 113, 119, + 230, 191, 247, 152, 119, 230, 191, 204, 178, 119, 230, 191, 204, 91, 119, + 230, 191, 236, 202, 119, 230, 191, 210, 103, 119, 230, 191, 251, 142, + 119, 230, 191, 235, 161, 119, 230, 191, 210, 101, 119, 230, 191, 207, + 112, 119, 230, 191, 210, 178, 46, 230, 191, 211, 78, 46, 230, 191, 224, + 75, 46, 230, 191, 208, 166, 46, 230, 191, 223, 229, 46, 31, 203, 24, 214, + 120, 58, 205, 94, 46, 31, 200, 235, 214, 120, 58, 205, 94, 46, 31, 202, + 178, 214, 120, 58, 205, 94, 46, 31, 235, 15, 214, 120, 58, 205, 94, 46, + 31, 235, 146, 214, 120, 58, 205, 94, 46, 31, 206, 14, 214, 120, 58, 205, + 94, 46, 31, 207, 66, 214, 120, 58, 205, 94, 46, 31, 237, 21, 214, 120, + 58, 205, 94, 213, 130, 55, 46, 31, 200, 235, 100, 46, 31, 200, 235, 102, + 46, 31, 200, 235, 134, 46, 31, 200, 235, 136, 46, 31, 200, 235, 146, 46, + 31, 200, 235, 167, 46, 31, 200, 235, 178, 46, 31, 200, 235, 171, 46, 31, + 200, 235, 182, 46, 31, 202, 177, 46, 31, 202, 178, 100, 46, 31, 202, 178, + 102, 46, 31, 202, 178, 134, 46, 31, 202, 178, 136, 46, 31, 202, 178, 146, + 46, 29, 224, 48, 46, 29, 216, 208, 46, 29, 202, 97, 46, 29, 210, 54, 46, + 29, 219, 56, 46, 29, 212, 206, 46, 29, 206, 52, 46, 29, 226, 143, 46, 29, + 245, 6, 46, 29, 245, 71, 46, 29, 224, 122, 46, 29, 202, 191, 46, 29, 212, + 244, 46, 29, 232, 55, 46, 29, 224, 49, 63, 46, 29, 216, 209, 63, 46, 29, + 202, 98, 63, 46, 29, 210, 55, 63, 46, 29, 219, 57, 63, 46, 29, 212, 207, + 63, 46, 29, 206, 53, 63, 46, 29, 226, 144, 63, 46, 29, 245, 7, 63, 46, + 29, 245, 72, 63, 46, 29, 224, 123, 63, 46, 29, 202, 192, 63, 46, 29, 212, + 245, 63, 46, 29, 232, 56, 63, 46, 223, 233, 190, 247, 6, 46, 223, 233, + 190, 225, 106, 46, 29, 226, 144, 66, 223, 233, 205, 11, 105, 46, 230, + 191, 100, 46, 230, 191, 102, 46, 230, 191, 134, 46, 230, 191, 136, 46, + 230, 191, 146, 46, 230, 191, 167, 46, 230, 191, 178, 46, 230, 191, 171, + 46, 230, 191, 182, 46, 230, 191, 203, 23, 46, 230, 191, 218, 189, 46, + 230, 191, 235, 118, 46, 230, 191, 197, 127, 46, 230, 191, 197, 14, 46, + 230, 191, 219, 143, 46, 230, 191, 237, 72, 46, 230, 191, 204, 111, 46, + 230, 191, 204, 229, 46, 230, 191, 232, 156, 46, 230, 191, 205, 189, 46, + 230, 191, 217, 222, 46, 230, 191, 205, 133, 46, 230, 191, 235, 129, 46, + 230, 191, 241, 148, 46, 230, 191, 223, 71, 46, 230, 191, 208, 134, 46, + 230, 191, 220, 66, 46, 230, 191, 235, 171, 46, 230, 191, 204, 123, 46, + 230, 191, 236, 94, 46, 230, 191, 212, 15, 46, 230, 191, 250, 154, 46, + 230, 191, 225, 233, 46, 230, 191, 210, 101, 46, 230, 191, 241, 107, 46, + 230, 191, 241, 95, 46, 230, 191, 232, 48, 46, 230, 191, 247, 36, 46, 230, + 191, 221, 208, 46, 230, 191, 222, 184, 46, 230, 191, 210, 22, 46, 230, + 191, 219, 192, 46, 230, 191, 210, 131, 46, 230, 191, 204, 178, 46, 230, + 191, 204, 91, 46, 230, 191, 236, 202, 46, 230, 191, 210, 103, 46, 230, + 191, 251, 142, 46, 230, 191, 216, 194, 46, 31, 202, 178, 167, 46, 31, + 202, 178, 178, 46, 31, 202, 178, 171, 46, 31, 202, 178, 182, 46, 31, 235, + 14, 46, 31, 235, 15, 100, 46, 31, 235, 15, 102, 46, 31, 235, 15, 134, 46, + 31, 235, 15, 136, 46, 31, 235, 15, 146, 46, 31, 235, 15, 167, 46, 31, + 235, 15, 178, 46, 31, 235, 15, 171, 46, 31, 235, 15, 182, 46, 31, 235, + 145, 143, 203, 36, 16, 36, 225, 204, 143, 203, 36, 16, 36, 235, 183, 143, + 203, 36, 16, 36, 220, 31, 143, 203, 36, 16, 36, 251, 20, 143, 203, 36, + 16, 36, 219, 251, 143, 203, 36, 16, 36, 225, 103, 143, 203, 36, 16, 36, + 225, 104, 143, 203, 36, 16, 36, 250, 146, 143, 203, 36, 16, 36, 207, 89, + 143, 203, 36, 16, 36, 214, 170, 143, 203, 36, 16, 36, 216, 6, 143, 203, + 36, 16, 36, 239, 246, 47, 232, 81, 47, 236, 159, 47, 236, 104, 222, 81, + 222, 108, 55, 46, 71, 63, 46, 71, 68, 46, 71, 66, 46, 71, 69, 46, 71, 72, + 46, 71, 155, 46, 71, 224, 101, 46, 71, 223, 187, 46, 71, 224, 209, 46, + 71, 224, 11, 46, 71, 183, 46, 71, 206, 112, 46, 71, 204, 172, 46, 71, + 208, 147, 46, 71, 205, 200, 46, 71, 189, 46, 71, 202, 122, 46, 71, 201, + 40, 46, 71, 203, 68, 46, 71, 149, 46, 71, 176, 46, 71, 216, 223, 46, 71, + 215, 186, 46, 71, 217, 118, 46, 71, 216, 50, 46, 71, 142, 46, 71, 232, + 71, 46, 71, 231, 75, 46, 71, 232, 147, 46, 71, 231, 193, 46, 71, 166, 46, + 71, 219, 78, 46, 71, 218, 145, 46, 71, 219, 207, 46, 71, 218, 251, 46, + 71, 164, 46, 71, 195, 217, 46, 71, 196, 3, 46, 71, 169, 46, 71, 210, 72, + 46, 71, 209, 140, 46, 71, 210, 183, 46, 71, 209, 232, 46, 71, 197, 166, + 46, 71, 197, 70, 46, 71, 197, 109, 46, 71, 197, 34, 47, 236, 162, 217, + 223, 210, 139, 47, 251, 45, 47, 250, 204, 47, 251, 72, 47, 252, 125, 47, + 226, 54, 47, 226, 21, 47, 200, 39, 47, 236, 131, 47, 237, 51, 47, 214, + 105, 47, 214, 98, 47, 225, 29, 47, 224, 249, 47, 224, 244, 47, 234, 78, + 47, 234, 88, 47, 233, 180, 47, 233, 176, 47, 223, 101, 47, 233, 167, 47, + 224, 66, 47, 224, 65, 47, 224, 64, 47, 224, 63, 47, 233, 44, 47, 233, 43, + 47, 223, 150, 47, 223, 153, 47, 224, 196, 47, 223, 231, 47, 223, 239, 47, + 208, 252, 47, 208, 210, 47, 206, 33, 47, 207, 95, 47, 207, 94, 47, 240, + 132, 47, 239, 189, 47, 238, 254, 47, 202, 13, 47, 217, 216, 47, 216, 7, + 47, 232, 230, 47, 213, 237, 47, 213, 236, 47, 249, 142, 47, 212, 217, 47, + 212, 180, 47, 212, 181, 47, 248, 152, 47, 231, 70, 47, 231, 65, 47, 247, + 235, 47, 231, 49, 47, 232, 109, 47, 213, 19, 47, 213, 60, 47, 232, 90, + 47, 213, 56, 47, 213, 74, 47, 248, 246, 47, 212, 106, 47, 248, 90, 47, + 231, 169, 47, 212, 92, 47, 231, 160, 47, 231, 162, 47, 220, 79, 47, 220, + 75, 47, 220, 84, 47, 220, 17, 47, 220, 48, 47, 219, 35, 47, 219, 10, 47, + 219, 9, 47, 219, 180, 47, 219, 177, 47, 219, 181, 47, 196, 128, 47, 196, 126, 47, 195, 202, 47, 209, 248, 47, 209, 252, 47, 209, 107, 47, 209, 100, 47, 210, 128, 47, 210, 125, 47, 197, 125, 143, 203, 36, 16, 36, 231, - 91, 195, 79, 143, 203, 36, 16, 36, 231, 91, 100, 143, 203, 36, 16, 36, - 231, 91, 102, 143, 203, 36, 16, 36, 231, 91, 134, 143, 203, 36, 16, 36, - 231, 91, 136, 143, 203, 36, 16, 36, 231, 91, 146, 143, 203, 36, 16, 36, - 231, 91, 167, 143, 203, 36, 16, 36, 231, 91, 178, 143, 203, 36, 16, 36, - 231, 91, 171, 143, 203, 36, 16, 36, 231, 91, 182, 143, 203, 36, 16, 36, - 231, 91, 203, 23, 143, 203, 36, 16, 36, 231, 91, 236, 251, 143, 203, 36, - 16, 36, 231, 91, 200, 239, 143, 203, 36, 16, 36, 231, 91, 202, 179, 143, - 203, 36, 16, 36, 231, 91, 235, 0, 143, 203, 36, 16, 36, 231, 91, 235, - 148, 143, 203, 36, 16, 36, 231, 91, 206, 23, 143, 203, 36, 16, 36, 231, - 91, 207, 68, 143, 203, 36, 16, 36, 231, 91, 237, 27, 143, 203, 36, 16, - 36, 231, 91, 216, 175, 143, 203, 36, 16, 36, 231, 91, 200, 234, 143, 203, - 36, 16, 36, 231, 91, 200, 227, 143, 203, 36, 16, 36, 231, 91, 200, 222, - 143, 203, 36, 16, 36, 231, 91, 200, 224, 143, 203, 36, 16, 36, 231, 91, - 200, 229, 47, 231, 82, 47, 240, 135, 47, 250, 149, 47, 154, 47, 214, 28, - 47, 213, 96, 47, 239, 30, 47, 239, 31, 205, 93, 47, 239, 31, 241, 34, 47, - 225, 229, 47, 236, 161, 217, 222, 232, 109, 47, 236, 161, 217, 222, 203, - 239, 47, 236, 161, 217, 222, 203, 132, 47, 236, 161, 217, 222, 219, 175, - 47, 241, 96, 47, 213, 243, 251, 108, 47, 176, 47, 218, 145, 63, 47, 166, - 47, 155, 47, 224, 211, 47, 219, 245, 47, 234, 65, 47, 247, 157, 47, 224, - 210, 47, 213, 8, 47, 217, 74, 47, 218, 145, 236, 48, 47, 218, 145, 234, - 189, 47, 219, 118, 47, 224, 147, 47, 231, 1, 47, 224, 102, 47, 219, 79, - 47, 233, 193, 47, 202, 124, 47, 218, 145, 159, 47, 219, 2, 47, 239, 40, - 47, 224, 29, 47, 235, 52, 47, 216, 87, 47, 218, 145, 221, 135, 47, 218, - 255, 47, 244, 182, 47, 224, 23, 47, 219, 0, 205, 93, 47, 244, 183, 205, - 93, 47, 221, 136, 205, 93, 47, 224, 24, 205, 93, 47, 219, 0, 241, 34, 47, - 244, 183, 241, 34, 47, 221, 136, 241, 34, 47, 224, 24, 241, 34, 47, 221, - 136, 127, 209, 80, 47, 221, 136, 127, 209, 81, 205, 93, 47, 161, 47, 223, - 222, 47, 218, 150, 47, 233, 117, 47, 210, 233, 47, 210, 234, 127, 209, - 80, 47, 210, 234, 127, 209, 81, 205, 93, 47, 211, 239, 47, 215, 226, 47, - 218, 145, 209, 80, 47, 218, 147, 47, 211, 186, 47, 215, 119, 47, 218, - 145, 199, 230, 47, 218, 78, 47, 223, 138, 47, 218, 79, 219, 179, 47, 211, - 185, 47, 215, 118, 47, 218, 145, 197, 199, 47, 218, 72, 47, 223, 136, 47, - 218, 73, 219, 179, 47, 225, 80, 214, 146, 47, 221, 136, 214, 146, 47, - 251, 122, 47, 248, 64, 47, 247, 80, 47, 247, 57, 47, 247, 207, 127, 224, - 147, 47, 244, 181, 47, 240, 49, 47, 233, 27, 47, 142, 47, 231, 83, 47, - 226, 85, 47, 224, 36, 47, 224, 24, 247, 123, 47, 223, 188, 47, 222, 9, - 47, 222, 8, 47, 221, 249, 47, 221, 151, 47, 219, 246, 205, 224, 47, 219, - 33, 47, 218, 216, 47, 213, 6, 47, 212, 119, 47, 212, 52, 47, 212, 50, 47, - 205, 84, 47, 204, 72, 47, 197, 111, 47, 199, 231, 127, 221, 135, 47, 39, - 127, 221, 135, 143, 203, 36, 16, 36, 240, 53, 100, 143, 203, 36, 16, 36, - 240, 53, 102, 143, 203, 36, 16, 36, 240, 53, 134, 143, 203, 36, 16, 36, - 240, 53, 136, 143, 203, 36, 16, 36, 240, 53, 146, 143, 203, 36, 16, 36, - 240, 53, 167, 143, 203, 36, 16, 36, 240, 53, 178, 143, 203, 36, 16, 36, - 240, 53, 171, 143, 203, 36, 16, 36, 240, 53, 182, 143, 203, 36, 16, 36, - 240, 53, 203, 23, 143, 203, 36, 16, 36, 240, 53, 236, 251, 143, 203, 36, - 16, 36, 240, 53, 200, 239, 143, 203, 36, 16, 36, 240, 53, 202, 179, 143, - 203, 36, 16, 36, 240, 53, 235, 0, 143, 203, 36, 16, 36, 240, 53, 235, - 148, 143, 203, 36, 16, 36, 240, 53, 206, 23, 143, 203, 36, 16, 36, 240, - 53, 207, 68, 143, 203, 36, 16, 36, 240, 53, 237, 27, 143, 203, 36, 16, - 36, 240, 53, 216, 175, 143, 203, 36, 16, 36, 240, 53, 200, 234, 143, 203, - 36, 16, 36, 240, 53, 200, 227, 143, 203, 36, 16, 36, 240, 53, 200, 222, - 143, 203, 36, 16, 36, 240, 53, 200, 224, 143, 203, 36, 16, 36, 240, 53, - 200, 229, 143, 203, 36, 16, 36, 240, 53, 200, 230, 143, 203, 36, 16, 36, - 240, 53, 200, 225, 143, 203, 36, 16, 36, 240, 53, 200, 226, 143, 203, 36, - 16, 36, 240, 53, 200, 233, 143, 203, 36, 16, 36, 240, 53, 200, 228, 143, - 203, 36, 16, 36, 240, 53, 202, 177, 143, 203, 36, 16, 36, 240, 53, 202, - 175, 47, 234, 104, 232, 83, 36, 202, 218, 241, 74, 232, 121, 232, 83, 36, - 202, 218, 210, 170, 237, 71, 232, 83, 36, 239, 121, 250, 168, 202, 218, - 248, 240, 232, 83, 36, 195, 230, 235, 44, 232, 83, 36, 197, 152, 232, 83, - 36, 241, 150, 232, 83, 36, 202, 218, 250, 227, 232, 83, 36, 231, 175, - 202, 19, 232, 83, 36, 4, 203, 115, 232, 83, 36, 201, 193, 232, 83, 36, - 213, 89, 232, 83, 36, 205, 9, 232, 83, 36, 235, 172, 232, 83, 36, 233, - 95, 212, 74, 232, 83, 36, 218, 236, 232, 83, 36, 236, 200, 232, 83, 36, - 235, 45, 232, 83, 36, 197, 7, 214, 119, 202, 218, 239, 246, 232, 83, 36, - 251, 23, 232, 83, 36, 241, 129, 232, 83, 36, 248, 141, 202, 144, 232, 83, - 36, 233, 115, 232, 83, 36, 205, 111, 251, 43, 232, 83, 36, 210, 93, 232, - 83, 36, 226, 47, 232, 83, 36, 233, 95, 203, 115, 232, 83, 36, 218, 164, - 241, 99, 232, 83, 36, 233, 95, 212, 27, 232, 83, 36, 202, 218, 252, 26, - 197, 127, 232, 83, 36, 202, 218, 244, 210, 235, 117, 232, 83, 36, 226, - 61, 232, 83, 36, 237, 176, 232, 83, 36, 210, 96, 232, 83, 36, 233, 95, - 212, 57, 232, 83, 36, 212, 1, 232, 83, 36, 240, 69, 77, 202, 218, 222, - 94, 232, 83, 36, 202, 218, 235, 210, 232, 83, 36, 214, 77, 232, 83, 36, - 214, 176, 232, 83, 36, 239, 216, 232, 83, 36, 239, 238, 232, 83, 36, 226, - 76, 232, 83, 36, 248, 50, 232, 83, 36, 244, 160, 202, 30, 219, 182, 232, - 83, 36, 234, 72, 202, 19, 232, 83, 36, 211, 196, 200, 25, 232, 83, 36, - 214, 76, 232, 83, 36, 202, 218, 197, 93, 232, 83, 36, 210, 84, 232, 83, - 36, 202, 218, 247, 86, 232, 83, 36, 202, 218, 250, 223, 202, 138, 232, - 83, 36, 202, 218, 224, 196, 204, 233, 218, 168, 232, 83, 36, 239, 183, - 232, 83, 36, 202, 218, 220, 19, 220, 79, 232, 83, 36, 252, 27, 232, 83, - 36, 202, 218, 197, 144, 232, 83, 36, 202, 218, 234, 27, 197, 50, 232, 83, - 36, 202, 218, 225, 111, 223, 0, 232, 83, 36, 239, 71, 232, 83, 36, 222, - 81, 232, 83, 36, 226, 50, 201, 117, 232, 83, 36, 4, 212, 27, 232, 83, 36, - 251, 217, 244, 150, 232, 83, 36, 248, 243, 244, 150, 11, 5, 225, 233, 11, - 5, 225, 225, 11, 5, 68, 11, 5, 226, 3, 11, 5, 226, 144, 11, 5, 226, 127, - 11, 5, 226, 146, 11, 5, 226, 145, 11, 5, 250, 167, 11, 5, 250, 123, 11, - 5, 63, 11, 5, 251, 45, 11, 5, 200, 37, 11, 5, 200, 41, 11, 5, 200, 38, - 11, 5, 214, 48, 11, 5, 214, 12, 11, 5, 72, 11, 5, 214, 92, 11, 5, 236, - 94, 11, 5, 69, 11, 5, 196, 243, 11, 5, 248, 144, 11, 5, 248, 139, 11, 5, - 248, 183, 11, 5, 248, 156, 11, 5, 248, 172, 11, 5, 248, 171, 11, 5, 248, - 174, 11, 5, 248, 173, 11, 5, 249, 55, 11, 5, 249, 47, 11, 5, 249, 144, - 11, 5, 249, 80, 11, 5, 247, 246, 11, 5, 247, 250, 11, 5, 247, 247, 11, 5, - 248, 88, 11, 5, 248, 69, 11, 5, 248, 115, 11, 5, 248, 94, 11, 5, 248, - 199, 11, 5, 249, 8, 11, 5, 248, 212, 11, 5, 247, 230, 11, 5, 247, 224, - 11, 5, 248, 20, 11, 5, 247, 245, 11, 5, 247, 238, 11, 5, 247, 243, 11, 5, - 247, 212, 11, 5, 247, 210, 11, 5, 247, 217, 11, 5, 247, 215, 11, 5, 247, - 213, 11, 5, 247, 214, 11, 5, 212, 156, 11, 5, 212, 152, 11, 5, 212, 219, - 11, 5, 212, 168, 11, 5, 212, 185, 11, 5, 212, 212, 11, 5, 212, 208, 11, - 5, 213, 115, 11, 5, 213, 101, 11, 5, 161, 11, 5, 213, 162, 11, 5, 211, - 206, 11, 5, 211, 208, 11, 5, 211, 207, 11, 5, 212, 67, 11, 5, 212, 55, - 11, 5, 212, 116, 11, 5, 212, 86, 11, 5, 211, 192, 11, 5, 211, 188, 11, 5, - 211, 226, 11, 5, 211, 205, 11, 5, 211, 197, 11, 5, 211, 203, 11, 5, 211, - 170, 11, 5, 211, 169, 11, 5, 211, 174, 11, 5, 211, 173, 11, 5, 211, 171, - 11, 5, 211, 172, 11, 5, 249, 29, 11, 5, 249, 28, 11, 5, 249, 35, 11, 5, - 249, 30, 11, 5, 249, 32, 11, 5, 249, 31, 11, 5, 249, 34, 11, 5, 249, 33, - 11, 5, 249, 41, 11, 5, 249, 40, 11, 5, 249, 44, 11, 5, 249, 42, 11, 5, - 249, 20, 11, 5, 249, 22, 11, 5, 249, 21, 11, 5, 249, 25, 11, 5, 249, 24, - 11, 5, 249, 27, 11, 5, 249, 26, 11, 5, 249, 36, 11, 5, 249, 39, 11, 5, - 249, 37, 11, 5, 249, 16, 11, 5, 249, 15, 11, 5, 249, 23, 11, 5, 249, 19, - 11, 5, 249, 17, 11, 5, 249, 18, 11, 5, 249, 12, 11, 5, 249, 11, 11, 5, - 249, 14, 11, 5, 249, 13, 11, 5, 217, 181, 11, 5, 217, 180, 11, 5, 217, - 186, 11, 5, 217, 182, 11, 5, 217, 183, 11, 5, 217, 185, 11, 5, 217, 184, - 11, 5, 217, 189, 11, 5, 217, 188, 11, 5, 217, 191, 11, 5, 217, 190, 11, - 5, 217, 177, 11, 5, 217, 176, 11, 5, 217, 179, 11, 5, 217, 178, 11, 5, - 217, 170, 11, 5, 217, 169, 11, 5, 217, 174, 11, 5, 217, 173, 11, 5, 217, - 171, 11, 5, 217, 172, 11, 5, 217, 164, 11, 5, 217, 163, 11, 5, 217, 168, - 11, 5, 217, 167, 11, 5, 217, 165, 11, 5, 217, 166, 11, 5, 231, 236, 11, - 5, 231, 235, 11, 5, 231, 241, 11, 5, 231, 237, 11, 5, 231, 238, 11, 5, - 231, 240, 11, 5, 231, 239, 11, 5, 231, 244, 11, 5, 231, 243, 11, 5, 231, - 246, 11, 5, 231, 245, 11, 5, 231, 227, 11, 5, 231, 229, 11, 5, 231, 228, - 11, 5, 231, 232, 11, 5, 231, 231, 11, 5, 231, 234, 11, 5, 231, 233, 11, - 5, 231, 223, 11, 5, 231, 222, 11, 5, 231, 230, 11, 5, 231, 226, 11, 5, - 231, 224, 11, 5, 231, 225, 11, 5, 231, 217, 11, 5, 231, 221, 11, 5, 231, - 220, 11, 5, 231, 218, 11, 5, 231, 219, 11, 5, 219, 5, 11, 5, 219, 4, 11, - 5, 219, 77, 11, 5, 219, 11, 11, 5, 219, 41, 11, 5, 219, 59, 11, 5, 219, - 57, 11, 5, 220, 3, 11, 5, 219, 253, 11, 5, 166, 11, 5, 220, 42, 11, 5, - 218, 106, 11, 5, 218, 105, 11, 5, 218, 109, 11, 5, 218, 107, 11, 5, 218, - 179, 11, 5, 218, 152, 11, 5, 218, 250, 11, 5, 218, 186, 11, 5, 219, 129, - 11, 5, 219, 206, 11, 5, 218, 86, 11, 5, 218, 80, 11, 5, 218, 144, 11, 5, - 218, 102, 11, 5, 218, 95, 11, 5, 218, 100, 11, 5, 218, 57, 11, 5, 218, - 56, 11, 5, 218, 62, 11, 5, 218, 59, 11, 5, 235, 103, 11, 5, 235, 97, 11, - 5, 235, 152, 11, 5, 235, 119, 11, 5, 235, 201, 11, 5, 235, 192, 11, 5, - 235, 238, 11, 5, 235, 206, 11, 5, 234, 253, 11, 5, 235, 50, 11, 5, 235, - 31, 11, 5, 234, 205, 11, 5, 234, 204, 11, 5, 234, 222, 11, 5, 234, 210, - 11, 5, 234, 208, 11, 5, 234, 209, 11, 5, 234, 192, 11, 5, 234, 191, 11, - 5, 234, 195, 11, 5, 234, 193, 11, 5, 198, 255, 11, 5, 198, 250, 11, 5, + 92, 195, 79, 143, 203, 36, 16, 36, 231, 92, 100, 143, 203, 36, 16, 36, + 231, 92, 102, 143, 203, 36, 16, 36, 231, 92, 134, 143, 203, 36, 16, 36, + 231, 92, 136, 143, 203, 36, 16, 36, 231, 92, 146, 143, 203, 36, 16, 36, + 231, 92, 167, 143, 203, 36, 16, 36, 231, 92, 178, 143, 203, 36, 16, 36, + 231, 92, 171, 143, 203, 36, 16, 36, 231, 92, 182, 143, 203, 36, 16, 36, + 231, 92, 203, 23, 143, 203, 36, 16, 36, 231, 92, 236, 252, 143, 203, 36, + 16, 36, 231, 92, 200, 239, 143, 203, 36, 16, 36, 231, 92, 202, 179, 143, + 203, 36, 16, 36, 231, 92, 235, 1, 143, 203, 36, 16, 36, 231, 92, 235, + 149, 143, 203, 36, 16, 36, 231, 92, 206, 23, 143, 203, 36, 16, 36, 231, + 92, 207, 68, 143, 203, 36, 16, 36, 231, 92, 237, 28, 143, 203, 36, 16, + 36, 231, 92, 216, 176, 143, 203, 36, 16, 36, 231, 92, 200, 234, 143, 203, + 36, 16, 36, 231, 92, 200, 227, 143, 203, 36, 16, 36, 231, 92, 200, 222, + 143, 203, 36, 16, 36, 231, 92, 200, 224, 143, 203, 36, 16, 36, 231, 92, + 200, 229, 47, 231, 83, 47, 240, 136, 47, 250, 150, 47, 154, 47, 214, 29, + 47, 213, 97, 47, 239, 31, 47, 239, 32, 205, 93, 47, 239, 32, 241, 35, 47, + 225, 230, 47, 236, 162, 217, 223, 232, 110, 47, 236, 162, 217, 223, 203, + 239, 47, 236, 162, 217, 223, 203, 132, 47, 236, 162, 217, 223, 219, 176, + 47, 241, 97, 47, 213, 244, 251, 109, 47, 176, 47, 218, 146, 63, 47, 166, + 47, 155, 47, 224, 212, 47, 219, 246, 47, 234, 66, 47, 247, 158, 47, 224, + 211, 47, 213, 9, 47, 217, 75, 47, 218, 146, 236, 49, 47, 218, 146, 234, + 190, 47, 219, 119, 47, 224, 148, 47, 231, 2, 47, 224, 103, 47, 219, 80, + 47, 233, 194, 47, 202, 124, 47, 218, 146, 159, 47, 219, 3, 47, 239, 41, + 47, 224, 30, 47, 235, 53, 47, 216, 88, 47, 218, 146, 221, 136, 47, 219, + 0, 47, 244, 183, 47, 224, 24, 47, 219, 1, 205, 93, 47, 244, 184, 205, 93, + 47, 221, 137, 205, 93, 47, 224, 25, 205, 93, 47, 219, 1, 241, 35, 47, + 244, 184, 241, 35, 47, 221, 137, 241, 35, 47, 224, 25, 241, 35, 47, 221, + 137, 127, 209, 80, 47, 221, 137, 127, 209, 81, 205, 93, 47, 161, 47, 223, + 223, 47, 218, 151, 47, 233, 118, 47, 210, 234, 47, 210, 235, 127, 209, + 80, 47, 210, 235, 127, 209, 81, 205, 93, 47, 211, 240, 47, 215, 227, 47, + 218, 146, 209, 80, 47, 218, 148, 47, 211, 187, 47, 215, 120, 47, 218, + 146, 199, 230, 47, 218, 79, 47, 223, 139, 47, 218, 80, 219, 180, 47, 211, + 186, 47, 215, 119, 47, 218, 146, 197, 199, 47, 218, 73, 47, 223, 137, 47, + 218, 74, 219, 180, 47, 225, 81, 214, 147, 47, 221, 137, 214, 147, 47, + 251, 123, 47, 248, 65, 47, 247, 81, 47, 247, 58, 47, 247, 208, 127, 224, + 148, 47, 244, 182, 47, 240, 50, 47, 233, 28, 47, 142, 47, 231, 84, 47, + 226, 86, 47, 224, 37, 47, 224, 25, 247, 124, 47, 223, 189, 47, 222, 10, + 47, 222, 9, 47, 221, 250, 47, 221, 152, 47, 219, 247, 205, 224, 47, 219, + 34, 47, 218, 217, 47, 213, 7, 47, 212, 120, 47, 212, 53, 47, 212, 51, 47, + 205, 84, 47, 204, 72, 47, 197, 111, 47, 199, 231, 127, 221, 136, 47, 39, + 127, 221, 136, 143, 203, 36, 16, 36, 240, 54, 100, 143, 203, 36, 16, 36, + 240, 54, 102, 143, 203, 36, 16, 36, 240, 54, 134, 143, 203, 36, 16, 36, + 240, 54, 136, 143, 203, 36, 16, 36, 240, 54, 146, 143, 203, 36, 16, 36, + 240, 54, 167, 143, 203, 36, 16, 36, 240, 54, 178, 143, 203, 36, 16, 36, + 240, 54, 171, 143, 203, 36, 16, 36, 240, 54, 182, 143, 203, 36, 16, 36, + 240, 54, 203, 23, 143, 203, 36, 16, 36, 240, 54, 236, 252, 143, 203, 36, + 16, 36, 240, 54, 200, 239, 143, 203, 36, 16, 36, 240, 54, 202, 179, 143, + 203, 36, 16, 36, 240, 54, 235, 1, 143, 203, 36, 16, 36, 240, 54, 235, + 149, 143, 203, 36, 16, 36, 240, 54, 206, 23, 143, 203, 36, 16, 36, 240, + 54, 207, 68, 143, 203, 36, 16, 36, 240, 54, 237, 28, 143, 203, 36, 16, + 36, 240, 54, 216, 176, 143, 203, 36, 16, 36, 240, 54, 200, 234, 143, 203, + 36, 16, 36, 240, 54, 200, 227, 143, 203, 36, 16, 36, 240, 54, 200, 222, + 143, 203, 36, 16, 36, 240, 54, 200, 224, 143, 203, 36, 16, 36, 240, 54, + 200, 229, 143, 203, 36, 16, 36, 240, 54, 200, 230, 143, 203, 36, 16, 36, + 240, 54, 200, 225, 143, 203, 36, 16, 36, 240, 54, 200, 226, 143, 203, 36, + 16, 36, 240, 54, 200, 233, 143, 203, 36, 16, 36, 240, 54, 200, 228, 143, + 203, 36, 16, 36, 240, 54, 202, 177, 143, 203, 36, 16, 36, 240, 54, 202, + 175, 47, 234, 105, 232, 84, 36, 202, 218, 241, 75, 232, 122, 232, 84, 36, + 202, 218, 210, 171, 237, 72, 232, 84, 36, 239, 122, 250, 169, 202, 218, + 248, 241, 232, 84, 36, 195, 230, 235, 45, 232, 84, 36, 197, 152, 232, 84, + 36, 241, 151, 232, 84, 36, 202, 218, 250, 228, 232, 84, 36, 231, 176, + 202, 19, 232, 84, 36, 4, 203, 115, 232, 84, 36, 201, 193, 232, 84, 36, + 213, 90, 232, 84, 36, 205, 9, 232, 84, 36, 235, 173, 232, 84, 36, 233, + 96, 212, 75, 232, 84, 36, 218, 237, 232, 84, 36, 236, 201, 232, 84, 36, + 235, 46, 232, 84, 36, 197, 7, 214, 120, 202, 218, 239, 247, 232, 84, 36, + 251, 24, 232, 84, 36, 241, 130, 232, 84, 36, 248, 142, 202, 144, 232, 84, + 36, 233, 116, 232, 84, 36, 205, 111, 251, 44, 232, 84, 36, 210, 93, 232, + 84, 36, 226, 48, 232, 84, 36, 233, 96, 203, 115, 232, 84, 36, 218, 165, + 241, 100, 232, 84, 36, 233, 96, 212, 28, 232, 84, 36, 202, 218, 252, 27, + 197, 127, 232, 84, 36, 202, 218, 244, 211, 235, 118, 232, 84, 36, 226, + 62, 232, 84, 36, 237, 177, 232, 84, 36, 210, 96, 232, 84, 36, 233, 96, + 212, 58, 232, 84, 36, 212, 2, 232, 84, 36, 240, 70, 77, 202, 218, 222, + 95, 232, 84, 36, 202, 218, 235, 211, 232, 84, 36, 214, 78, 232, 84, 36, + 214, 177, 232, 84, 36, 239, 217, 232, 84, 36, 239, 239, 232, 84, 36, 226, + 77, 232, 84, 36, 248, 51, 232, 84, 36, 244, 161, 202, 30, 219, 183, 232, + 84, 36, 234, 73, 202, 19, 232, 84, 36, 211, 197, 200, 25, 232, 84, 36, + 214, 77, 232, 84, 36, 202, 218, 197, 93, 232, 84, 36, 210, 84, 232, 84, + 36, 202, 218, 247, 87, 232, 84, 36, 202, 218, 250, 224, 202, 138, 232, + 84, 36, 202, 218, 224, 197, 204, 233, 218, 169, 232, 84, 36, 239, 184, + 232, 84, 36, 202, 218, 220, 20, 220, 80, 232, 84, 36, 252, 28, 232, 84, + 36, 202, 218, 197, 144, 232, 84, 36, 202, 218, 234, 28, 197, 50, 232, 84, + 36, 202, 218, 225, 112, 223, 1, 232, 84, 36, 239, 72, 232, 84, 36, 222, + 82, 232, 84, 36, 226, 51, 201, 117, 232, 84, 36, 4, 212, 28, 232, 84, 36, + 251, 218, 244, 151, 232, 84, 36, 248, 244, 244, 151, 11, 5, 225, 234, 11, + 5, 225, 226, 11, 5, 68, 11, 5, 226, 4, 11, 5, 226, 145, 11, 5, 226, 128, + 11, 5, 226, 147, 11, 5, 226, 146, 11, 5, 250, 168, 11, 5, 250, 124, 11, + 5, 63, 11, 5, 251, 46, 11, 5, 200, 37, 11, 5, 200, 41, 11, 5, 200, 38, + 11, 5, 214, 49, 11, 5, 214, 13, 11, 5, 72, 11, 5, 214, 93, 11, 5, 236, + 95, 11, 5, 69, 11, 5, 196, 243, 11, 5, 248, 145, 11, 5, 248, 140, 11, 5, + 248, 184, 11, 5, 248, 157, 11, 5, 248, 173, 11, 5, 248, 172, 11, 5, 248, + 175, 11, 5, 248, 174, 11, 5, 249, 56, 11, 5, 249, 48, 11, 5, 249, 145, + 11, 5, 249, 81, 11, 5, 247, 247, 11, 5, 247, 251, 11, 5, 247, 248, 11, 5, + 248, 89, 11, 5, 248, 70, 11, 5, 248, 116, 11, 5, 248, 95, 11, 5, 248, + 200, 11, 5, 249, 9, 11, 5, 248, 213, 11, 5, 247, 231, 11, 5, 247, 225, + 11, 5, 248, 21, 11, 5, 247, 246, 11, 5, 247, 239, 11, 5, 247, 244, 11, 5, + 247, 213, 11, 5, 247, 211, 11, 5, 247, 218, 11, 5, 247, 216, 11, 5, 247, + 214, 11, 5, 247, 215, 11, 5, 212, 157, 11, 5, 212, 153, 11, 5, 212, 220, + 11, 5, 212, 169, 11, 5, 212, 186, 11, 5, 212, 213, 11, 5, 212, 209, 11, + 5, 213, 116, 11, 5, 213, 102, 11, 5, 161, 11, 5, 213, 163, 11, 5, 211, + 207, 11, 5, 211, 209, 11, 5, 211, 208, 11, 5, 212, 68, 11, 5, 212, 56, + 11, 5, 212, 117, 11, 5, 212, 87, 11, 5, 211, 193, 11, 5, 211, 189, 11, 5, + 211, 227, 11, 5, 211, 206, 11, 5, 211, 198, 11, 5, 211, 204, 11, 5, 211, + 171, 11, 5, 211, 170, 11, 5, 211, 175, 11, 5, 211, 174, 11, 5, 211, 172, + 11, 5, 211, 173, 11, 5, 249, 30, 11, 5, 249, 29, 11, 5, 249, 36, 11, 5, + 249, 31, 11, 5, 249, 33, 11, 5, 249, 32, 11, 5, 249, 35, 11, 5, 249, 34, + 11, 5, 249, 42, 11, 5, 249, 41, 11, 5, 249, 45, 11, 5, 249, 43, 11, 5, + 249, 21, 11, 5, 249, 23, 11, 5, 249, 22, 11, 5, 249, 26, 11, 5, 249, 25, + 11, 5, 249, 28, 11, 5, 249, 27, 11, 5, 249, 37, 11, 5, 249, 40, 11, 5, + 249, 38, 11, 5, 249, 17, 11, 5, 249, 16, 11, 5, 249, 24, 11, 5, 249, 20, + 11, 5, 249, 18, 11, 5, 249, 19, 11, 5, 249, 13, 11, 5, 249, 12, 11, 5, + 249, 15, 11, 5, 249, 14, 11, 5, 217, 182, 11, 5, 217, 181, 11, 5, 217, + 187, 11, 5, 217, 183, 11, 5, 217, 184, 11, 5, 217, 186, 11, 5, 217, 185, + 11, 5, 217, 190, 11, 5, 217, 189, 11, 5, 217, 192, 11, 5, 217, 191, 11, + 5, 217, 178, 11, 5, 217, 177, 11, 5, 217, 180, 11, 5, 217, 179, 11, 5, + 217, 171, 11, 5, 217, 170, 11, 5, 217, 175, 11, 5, 217, 174, 11, 5, 217, + 172, 11, 5, 217, 173, 11, 5, 217, 165, 11, 5, 217, 164, 11, 5, 217, 169, + 11, 5, 217, 168, 11, 5, 217, 166, 11, 5, 217, 167, 11, 5, 231, 237, 11, + 5, 231, 236, 11, 5, 231, 242, 11, 5, 231, 238, 11, 5, 231, 239, 11, 5, + 231, 241, 11, 5, 231, 240, 11, 5, 231, 245, 11, 5, 231, 244, 11, 5, 231, + 247, 11, 5, 231, 246, 11, 5, 231, 228, 11, 5, 231, 230, 11, 5, 231, 229, + 11, 5, 231, 233, 11, 5, 231, 232, 11, 5, 231, 235, 11, 5, 231, 234, 11, + 5, 231, 224, 11, 5, 231, 223, 11, 5, 231, 231, 11, 5, 231, 227, 11, 5, + 231, 225, 11, 5, 231, 226, 11, 5, 231, 218, 11, 5, 231, 222, 11, 5, 231, + 221, 11, 5, 231, 219, 11, 5, 231, 220, 11, 5, 219, 6, 11, 5, 219, 5, 11, + 5, 219, 78, 11, 5, 219, 12, 11, 5, 219, 42, 11, 5, 219, 60, 11, 5, 219, + 58, 11, 5, 220, 4, 11, 5, 219, 254, 11, 5, 166, 11, 5, 220, 43, 11, 5, + 218, 107, 11, 5, 218, 106, 11, 5, 218, 110, 11, 5, 218, 108, 11, 5, 218, + 180, 11, 5, 218, 153, 11, 5, 218, 251, 11, 5, 218, 187, 11, 5, 219, 130, + 11, 5, 219, 207, 11, 5, 218, 87, 11, 5, 218, 81, 11, 5, 218, 145, 11, 5, + 218, 103, 11, 5, 218, 96, 11, 5, 218, 101, 11, 5, 218, 58, 11, 5, 218, + 57, 11, 5, 218, 63, 11, 5, 218, 60, 11, 5, 235, 104, 11, 5, 235, 98, 11, + 5, 235, 153, 11, 5, 235, 120, 11, 5, 235, 202, 11, 5, 235, 193, 11, 5, + 235, 239, 11, 5, 235, 207, 11, 5, 234, 254, 11, 5, 235, 51, 11, 5, 235, + 32, 11, 5, 234, 206, 11, 5, 234, 205, 11, 5, 234, 223, 11, 5, 234, 211, + 11, 5, 234, 209, 11, 5, 234, 210, 11, 5, 234, 193, 11, 5, 234, 192, 11, + 5, 234, 196, 11, 5, 234, 194, 11, 5, 198, 255, 11, 5, 198, 250, 11, 5, 199, 34, 11, 5, 199, 8, 11, 5, 199, 23, 11, 5, 199, 20, 11, 5, 199, 26, 11, 5, 199, 25, 11, 5, 199, 126, 11, 5, 199, 121, 11, 5, 199, 152, 11, 5, 199, 139, 11, 5, 198, 229, 11, 5, 198, 225, 11, 5, 198, 248, 11, 5, 198, 231, 11, 5, 199, 38, 11, 5, 199, 106, 11, 5, 197, 213, 11, 5, 197, 211, 11, 5, 197, 220, 11, 5, 197, 216, 11, 5, 197, 214, 11, 5, 197, 215, 11, 5, 197, 203, 11, 5, 197, 202, 11, 5, 197, 207, 11, 5, 197, 206, 11, 5, - 197, 204, 11, 5, 197, 205, 11, 5, 239, 64, 11, 5, 239, 50, 11, 5, 239, - 151, 11, 5, 239, 91, 11, 5, 239, 126, 11, 5, 239, 131, 11, 5, 239, 130, - 11, 5, 240, 60, 11, 5, 240, 54, 11, 5, 240, 135, 11, 5, 240, 80, 11, 5, - 237, 181, 11, 5, 237, 182, 11, 5, 238, 252, 11, 5, 237, 228, 11, 5, 239, - 27, 11, 5, 238, 255, 11, 5, 239, 181, 11, 5, 239, 251, 11, 5, 239, 202, - 11, 5, 237, 172, 11, 5, 237, 170, 11, 5, 237, 200, 11, 5, 237, 180, 11, - 5, 237, 175, 11, 5, 237, 178, 11, 5, 202, 57, 11, 5, 202, 49, 11, 5, 202, + 197, 204, 11, 5, 197, 205, 11, 5, 239, 65, 11, 5, 239, 51, 11, 5, 239, + 152, 11, 5, 239, 92, 11, 5, 239, 127, 11, 5, 239, 132, 11, 5, 239, 131, + 11, 5, 240, 61, 11, 5, 240, 55, 11, 5, 240, 136, 11, 5, 240, 81, 11, 5, + 237, 182, 11, 5, 237, 183, 11, 5, 238, 253, 11, 5, 237, 229, 11, 5, 239, + 28, 11, 5, 239, 0, 11, 5, 239, 182, 11, 5, 239, 252, 11, 5, 239, 203, 11, + 5, 237, 173, 11, 5, 237, 171, 11, 5, 237, 201, 11, 5, 237, 181, 11, 5, + 237, 176, 11, 5, 237, 179, 11, 5, 202, 57, 11, 5, 202, 49, 11, 5, 202, 122, 11, 5, 202, 67, 11, 5, 202, 105, 11, 5, 202, 107, 11, 5, 202, 106, 11, 5, 203, 94, 11, 5, 203, 79, 11, 5, 189, 11, 5, 203, 105, 11, 5, 201, 15, 11, 5, 201, 14, 11, 5, 201, 17, 11, 5, 201, 16, 11, 5, 201, 229, 11, 5, 201, 219, 11, 5, 149, 11, 5, 201, 242, 11, 5, 202, 239, 11, 5, 203, 68, 11, 5, 203, 10, 11, 5, 200, 254, 11, 5, 200, 249, 11, 5, 201, 40, 11, - 5, 201, 13, 11, 5, 200, 255, 11, 5, 201, 10, 11, 5, 240, 12, 11, 5, 240, - 11, 11, 5, 240, 17, 11, 5, 240, 13, 11, 5, 240, 14, 11, 5, 240, 16, 11, - 5, 240, 15, 11, 5, 240, 33, 11, 5, 240, 32, 11, 5, 240, 40, 11, 5, 240, - 34, 11, 5, 240, 2, 11, 5, 240, 4, 11, 5, 240, 3, 11, 5, 240, 7, 11, 5, - 240, 6, 11, 5, 240, 10, 11, 5, 240, 8, 11, 5, 240, 25, 11, 5, 240, 28, - 11, 5, 240, 26, 11, 5, 239, 254, 11, 5, 239, 253, 11, 5, 240, 5, 11, 5, - 240, 1, 11, 5, 239, 255, 11, 5, 240, 0, 11, 5, 217, 136, 11, 5, 217, 135, - 11, 5, 217, 143, 11, 5, 217, 138, 11, 5, 217, 139, 11, 5, 217, 140, 11, - 5, 217, 152, 11, 5, 217, 151, 11, 5, 217, 158, 11, 5, 217, 153, 11, 5, - 217, 128, 11, 5, 217, 127, 11, 5, 217, 134, 11, 5, 217, 129, 11, 5, 217, - 144, 11, 5, 217, 150, 11, 5, 217, 148, 11, 5, 217, 120, 11, 5, 217, 119, - 11, 5, 217, 125, 11, 5, 217, 123, 11, 5, 217, 121, 11, 5, 217, 122, 11, - 5, 231, 202, 11, 5, 231, 201, 11, 5, 231, 208, 11, 5, 231, 203, 11, 5, - 231, 205, 11, 5, 231, 204, 11, 5, 231, 207, 11, 5, 231, 206, 11, 5, 231, - 214, 11, 5, 231, 212, 11, 5, 231, 216, 11, 5, 231, 215, 11, 5, 231, 195, - 11, 5, 231, 196, 11, 5, 231, 199, 11, 5, 231, 198, 11, 5, 231, 200, 11, - 5, 231, 209, 11, 5, 231, 211, 11, 5, 231, 210, 11, 5, 231, 194, 11, 5, - 216, 167, 11, 5, 216, 165, 11, 5, 216, 222, 11, 5, 216, 170, 11, 5, 216, - 196, 11, 5, 216, 210, 11, 5, 216, 209, 11, 5, 217, 196, 11, 5, 176, 11, - 5, 217, 212, 11, 5, 215, 129, 11, 5, 215, 131, 11, 5, 215, 130, 11, 5, - 216, 17, 11, 5, 216, 1, 11, 5, 216, 49, 11, 5, 216, 28, 11, 5, 217, 76, - 11, 5, 217, 117, 11, 5, 217, 95, 11, 5, 215, 124, 11, 5, 215, 120, 11, 5, - 215, 185, 11, 5, 215, 128, 11, 5, 215, 126, 11, 5, 215, 127, 11, 5, 232, - 11, 11, 5, 232, 10, 11, 5, 232, 16, 11, 5, 232, 12, 11, 5, 232, 13, 11, - 5, 232, 15, 11, 5, 232, 14, 11, 5, 232, 22, 11, 5, 232, 20, 11, 5, 232, - 24, 11, 5, 232, 23, 11, 5, 232, 3, 11, 5, 232, 5, 11, 5, 232, 4, 11, 5, - 232, 7, 11, 5, 232, 9, 11, 5, 232, 8, 11, 5, 232, 17, 11, 5, 232, 19, 11, - 5, 232, 18, 11, 5, 231, 255, 11, 5, 231, 254, 11, 5, 232, 6, 11, 5, 232, - 2, 11, 5, 232, 0, 11, 5, 232, 1, 11, 5, 231, 249, 11, 5, 231, 248, 11, 5, - 231, 253, 11, 5, 231, 252, 11, 5, 231, 250, 11, 5, 231, 251, 11, 5, 222, - 50, 11, 5, 222, 42, 11, 5, 222, 108, 11, 5, 222, 60, 11, 5, 222, 99, 11, - 5, 222, 98, 11, 5, 222, 102, 11, 5, 222, 100, 11, 5, 222, 219, 11, 5, - 222, 207, 11, 5, 172, 11, 5, 222, 230, 11, 5, 221, 168, 11, 5, 221, 167, - 11, 5, 221, 170, 11, 5, 221, 169, 11, 5, 221, 215, 11, 5, 221, 199, 11, - 5, 222, 6, 11, 5, 221, 221, 11, 5, 222, 125, 11, 5, 222, 196, 11, 5, 222, - 143, 11, 5, 221, 162, 11, 5, 221, 160, 11, 5, 221, 190, 11, 5, 221, 166, - 11, 5, 221, 164, 11, 5, 221, 165, 11, 5, 221, 140, 11, 5, 221, 139, 11, - 5, 221, 150, 11, 5, 221, 143, 11, 5, 221, 141, 11, 5, 221, 142, 11, 5, - 233, 162, 11, 5, 233, 161, 11, 5, 233, 191, 11, 5, 233, 174, 11, 5, 233, - 183, 11, 5, 233, 182, 11, 5, 233, 185, 11, 5, 233, 184, 11, 5, 234, 74, - 11, 5, 234, 69, 11, 5, 234, 122, 11, 5, 234, 85, 11, 5, 233, 48, 11, 5, - 233, 47, 11, 5, 233, 50, 11, 5, 233, 49, 11, 5, 233, 120, 11, 5, 233, - 118, 11, 5, 233, 143, 11, 5, 233, 129, 11, 5, 234, 13, 11, 5, 234, 11, - 11, 5, 234, 47, 11, 5, 234, 24, 11, 5, 233, 37, 11, 5, 233, 36, 11, 5, - 233, 75, 11, 5, 233, 46, 11, 5, 233, 38, 11, 5, 233, 45, 11, 5, 224, 54, - 11, 5, 224, 49, 11, 5, 224, 100, 11, 5, 224, 68, 11, 5, 224, 81, 11, 5, - 224, 85, 11, 5, 224, 83, 11, 5, 224, 234, 11, 5, 224, 216, 11, 5, 155, - 11, 5, 225, 7, 11, 5, 223, 157, 11, 5, 223, 162, 11, 5, 223, 159, 11, 5, - 223, 229, 11, 5, 223, 224, 11, 5, 224, 10, 11, 5, 223, 236, 11, 5, 224, - 171, 11, 5, 224, 154, 11, 5, 224, 208, 11, 5, 224, 175, 11, 5, 223, 144, - 11, 5, 223, 140, 11, 5, 223, 186, 11, 5, 223, 156, 11, 5, 223, 148, 11, - 5, 223, 153, 11, 5, 233, 251, 11, 5, 233, 250, 11, 5, 233, 255, 11, 5, - 233, 252, 11, 5, 233, 254, 11, 5, 233, 253, 11, 5, 234, 6, 11, 5, 234, 5, - 11, 5, 234, 9, 11, 5, 234, 7, 11, 5, 233, 242, 11, 5, 233, 241, 11, 5, - 233, 244, 11, 5, 233, 243, 11, 5, 233, 247, 11, 5, 233, 246, 11, 5, 233, - 249, 11, 5, 233, 248, 11, 5, 234, 1, 11, 5, 234, 0, 11, 5, 234, 4, 11, 5, - 234, 2, 11, 5, 233, 237, 11, 5, 233, 236, 11, 5, 233, 245, 11, 5, 233, - 240, 11, 5, 233, 238, 11, 5, 233, 239, 11, 5, 219, 96, 11, 5, 219, 97, - 11, 5, 219, 115, 11, 5, 219, 114, 11, 5, 219, 117, 11, 5, 219, 116, 11, - 5, 219, 87, 11, 5, 219, 89, 11, 5, 219, 88, 11, 5, 219, 92, 11, 5, 219, - 91, 11, 5, 219, 94, 11, 5, 219, 93, 11, 5, 219, 98, 11, 5, 219, 100, 11, - 5, 219, 99, 11, 5, 219, 83, 11, 5, 219, 82, 11, 5, 219, 90, 11, 5, 219, - 86, 11, 5, 219, 84, 11, 5, 219, 85, 11, 5, 231, 21, 11, 5, 231, 20, 11, - 5, 231, 27, 11, 5, 231, 22, 11, 5, 231, 24, 11, 5, 231, 23, 11, 5, 231, - 26, 11, 5, 231, 25, 11, 5, 231, 32, 11, 5, 231, 31, 11, 5, 231, 34, 11, - 5, 231, 33, 11, 5, 231, 13, 11, 5, 231, 12, 11, 5, 231, 15, 11, 5, 231, - 14, 11, 5, 231, 17, 11, 5, 231, 16, 11, 5, 231, 19, 11, 5, 231, 18, 11, - 5, 231, 28, 11, 5, 231, 30, 11, 5, 231, 29, 11, 5, 217, 15, 11, 5, 217, - 17, 11, 5, 217, 16, 11, 5, 217, 60, 11, 5, 217, 58, 11, 5, 217, 70, 11, - 5, 217, 63, 11, 5, 216, 232, 11, 5, 216, 231, 11, 5, 216, 233, 11, 5, - 216, 243, 11, 5, 216, 240, 11, 5, 216, 251, 11, 5, 216, 245, 11, 5, 217, - 51, 11, 5, 217, 57, 11, 5, 217, 53, 11, 5, 232, 30, 11, 5, 232, 48, 11, - 5, 232, 57, 11, 5, 232, 164, 11, 5, 232, 153, 11, 5, 142, 11, 5, 232, - 176, 11, 5, 231, 50, 11, 5, 231, 49, 11, 5, 231, 52, 11, 5, 231, 51, 11, - 5, 231, 94, 11, 5, 231, 85, 11, 5, 231, 192, 11, 5, 231, 157, 11, 5, 232, - 85, 11, 5, 232, 146, 11, 5, 232, 97, 11, 5, 197, 130, 11, 5, 197, 115, + 5, 201, 13, 11, 5, 200, 255, 11, 5, 201, 10, 11, 5, 240, 13, 11, 5, 240, + 12, 11, 5, 240, 18, 11, 5, 240, 14, 11, 5, 240, 15, 11, 5, 240, 17, 11, + 5, 240, 16, 11, 5, 240, 34, 11, 5, 240, 33, 11, 5, 240, 41, 11, 5, 240, + 35, 11, 5, 240, 3, 11, 5, 240, 5, 11, 5, 240, 4, 11, 5, 240, 8, 11, 5, + 240, 7, 11, 5, 240, 11, 11, 5, 240, 9, 11, 5, 240, 26, 11, 5, 240, 29, + 11, 5, 240, 27, 11, 5, 239, 255, 11, 5, 239, 254, 11, 5, 240, 6, 11, 5, + 240, 2, 11, 5, 240, 0, 11, 5, 240, 1, 11, 5, 217, 137, 11, 5, 217, 136, + 11, 5, 217, 144, 11, 5, 217, 139, 11, 5, 217, 140, 11, 5, 217, 141, 11, + 5, 217, 153, 11, 5, 217, 152, 11, 5, 217, 159, 11, 5, 217, 154, 11, 5, + 217, 129, 11, 5, 217, 128, 11, 5, 217, 135, 11, 5, 217, 130, 11, 5, 217, + 145, 11, 5, 217, 151, 11, 5, 217, 149, 11, 5, 217, 121, 11, 5, 217, 120, + 11, 5, 217, 126, 11, 5, 217, 124, 11, 5, 217, 122, 11, 5, 217, 123, 11, + 5, 231, 203, 11, 5, 231, 202, 11, 5, 231, 209, 11, 5, 231, 204, 11, 5, + 231, 206, 11, 5, 231, 205, 11, 5, 231, 208, 11, 5, 231, 207, 11, 5, 231, + 215, 11, 5, 231, 213, 11, 5, 231, 217, 11, 5, 231, 216, 11, 5, 231, 196, + 11, 5, 231, 197, 11, 5, 231, 200, 11, 5, 231, 199, 11, 5, 231, 201, 11, + 5, 231, 210, 11, 5, 231, 212, 11, 5, 231, 211, 11, 5, 231, 195, 11, 5, + 216, 168, 11, 5, 216, 166, 11, 5, 216, 223, 11, 5, 216, 171, 11, 5, 216, + 197, 11, 5, 216, 211, 11, 5, 216, 210, 11, 5, 217, 197, 11, 5, 176, 11, + 5, 217, 213, 11, 5, 215, 130, 11, 5, 215, 132, 11, 5, 215, 131, 11, 5, + 216, 18, 11, 5, 216, 2, 11, 5, 216, 50, 11, 5, 216, 29, 11, 5, 217, 77, + 11, 5, 217, 118, 11, 5, 217, 96, 11, 5, 215, 125, 11, 5, 215, 121, 11, 5, + 215, 186, 11, 5, 215, 129, 11, 5, 215, 127, 11, 5, 215, 128, 11, 5, 232, + 12, 11, 5, 232, 11, 11, 5, 232, 17, 11, 5, 232, 13, 11, 5, 232, 14, 11, + 5, 232, 16, 11, 5, 232, 15, 11, 5, 232, 23, 11, 5, 232, 21, 11, 5, 232, + 25, 11, 5, 232, 24, 11, 5, 232, 4, 11, 5, 232, 6, 11, 5, 232, 5, 11, 5, + 232, 8, 11, 5, 232, 10, 11, 5, 232, 9, 11, 5, 232, 18, 11, 5, 232, 20, + 11, 5, 232, 19, 11, 5, 232, 0, 11, 5, 231, 255, 11, 5, 232, 7, 11, 5, + 232, 3, 11, 5, 232, 1, 11, 5, 232, 2, 11, 5, 231, 250, 11, 5, 231, 249, + 11, 5, 231, 254, 11, 5, 231, 253, 11, 5, 231, 251, 11, 5, 231, 252, 11, + 5, 222, 51, 11, 5, 222, 43, 11, 5, 222, 109, 11, 5, 222, 61, 11, 5, 222, + 100, 11, 5, 222, 99, 11, 5, 222, 103, 11, 5, 222, 101, 11, 5, 222, 220, + 11, 5, 222, 208, 11, 5, 172, 11, 5, 222, 231, 11, 5, 221, 169, 11, 5, + 221, 168, 11, 5, 221, 171, 11, 5, 221, 170, 11, 5, 221, 216, 11, 5, 221, + 200, 11, 5, 222, 7, 11, 5, 221, 222, 11, 5, 222, 126, 11, 5, 222, 197, + 11, 5, 222, 144, 11, 5, 221, 163, 11, 5, 221, 161, 11, 5, 221, 191, 11, + 5, 221, 167, 11, 5, 221, 165, 11, 5, 221, 166, 11, 5, 221, 141, 11, 5, + 221, 140, 11, 5, 221, 151, 11, 5, 221, 144, 11, 5, 221, 142, 11, 5, 221, + 143, 11, 5, 233, 163, 11, 5, 233, 162, 11, 5, 233, 192, 11, 5, 233, 175, + 11, 5, 233, 184, 11, 5, 233, 183, 11, 5, 233, 186, 11, 5, 233, 185, 11, + 5, 234, 75, 11, 5, 234, 70, 11, 5, 234, 123, 11, 5, 234, 86, 11, 5, 233, + 49, 11, 5, 233, 48, 11, 5, 233, 51, 11, 5, 233, 50, 11, 5, 233, 121, 11, + 5, 233, 119, 11, 5, 233, 144, 11, 5, 233, 130, 11, 5, 234, 14, 11, 5, + 234, 12, 11, 5, 234, 48, 11, 5, 234, 25, 11, 5, 233, 38, 11, 5, 233, 37, + 11, 5, 233, 76, 11, 5, 233, 47, 11, 5, 233, 39, 11, 5, 233, 46, 11, 5, + 224, 55, 11, 5, 224, 50, 11, 5, 224, 101, 11, 5, 224, 69, 11, 5, 224, 82, + 11, 5, 224, 86, 11, 5, 224, 84, 11, 5, 224, 235, 11, 5, 224, 217, 11, 5, + 155, 11, 5, 225, 8, 11, 5, 223, 158, 11, 5, 223, 163, 11, 5, 223, 160, + 11, 5, 223, 230, 11, 5, 223, 225, 11, 5, 224, 11, 11, 5, 223, 237, 11, 5, + 224, 172, 11, 5, 224, 155, 11, 5, 224, 209, 11, 5, 224, 176, 11, 5, 223, + 145, 11, 5, 223, 141, 11, 5, 223, 187, 11, 5, 223, 157, 11, 5, 223, 149, + 11, 5, 223, 154, 11, 5, 233, 252, 11, 5, 233, 251, 11, 5, 234, 0, 11, 5, + 233, 253, 11, 5, 233, 255, 11, 5, 233, 254, 11, 5, 234, 7, 11, 5, 234, 6, + 11, 5, 234, 10, 11, 5, 234, 8, 11, 5, 233, 243, 11, 5, 233, 242, 11, 5, + 233, 245, 11, 5, 233, 244, 11, 5, 233, 248, 11, 5, 233, 247, 11, 5, 233, + 250, 11, 5, 233, 249, 11, 5, 234, 2, 11, 5, 234, 1, 11, 5, 234, 5, 11, 5, + 234, 3, 11, 5, 233, 238, 11, 5, 233, 237, 11, 5, 233, 246, 11, 5, 233, + 241, 11, 5, 233, 239, 11, 5, 233, 240, 11, 5, 219, 97, 11, 5, 219, 98, + 11, 5, 219, 116, 11, 5, 219, 115, 11, 5, 219, 118, 11, 5, 219, 117, 11, + 5, 219, 88, 11, 5, 219, 90, 11, 5, 219, 89, 11, 5, 219, 93, 11, 5, 219, + 92, 11, 5, 219, 95, 11, 5, 219, 94, 11, 5, 219, 99, 11, 5, 219, 101, 11, + 5, 219, 100, 11, 5, 219, 84, 11, 5, 219, 83, 11, 5, 219, 91, 11, 5, 219, + 87, 11, 5, 219, 85, 11, 5, 219, 86, 11, 5, 231, 22, 11, 5, 231, 21, 11, + 5, 231, 28, 11, 5, 231, 23, 11, 5, 231, 25, 11, 5, 231, 24, 11, 5, 231, + 27, 11, 5, 231, 26, 11, 5, 231, 33, 11, 5, 231, 32, 11, 5, 231, 35, 11, + 5, 231, 34, 11, 5, 231, 14, 11, 5, 231, 13, 11, 5, 231, 16, 11, 5, 231, + 15, 11, 5, 231, 18, 11, 5, 231, 17, 11, 5, 231, 20, 11, 5, 231, 19, 11, + 5, 231, 29, 11, 5, 231, 31, 11, 5, 231, 30, 11, 5, 217, 16, 11, 5, 217, + 18, 11, 5, 217, 17, 11, 5, 217, 61, 11, 5, 217, 59, 11, 5, 217, 71, 11, + 5, 217, 64, 11, 5, 216, 233, 11, 5, 216, 232, 11, 5, 216, 234, 11, 5, + 216, 244, 11, 5, 216, 241, 11, 5, 216, 252, 11, 5, 216, 246, 11, 5, 217, + 52, 11, 5, 217, 58, 11, 5, 217, 54, 11, 5, 232, 31, 11, 5, 232, 49, 11, + 5, 232, 58, 11, 5, 232, 165, 11, 5, 232, 154, 11, 5, 142, 11, 5, 232, + 177, 11, 5, 231, 51, 11, 5, 231, 50, 11, 5, 231, 53, 11, 5, 231, 52, 11, + 5, 231, 95, 11, 5, 231, 86, 11, 5, 231, 193, 11, 5, 231, 158, 11, 5, 232, + 86, 11, 5, 232, 147, 11, 5, 232, 98, 11, 5, 197, 130, 11, 5, 197, 115, 11, 5, 197, 166, 11, 5, 197, 141, 11, 5, 196, 232, 11, 5, 196, 234, 11, 5, 196, 233, 11, 5, 197, 0, 11, 5, 197, 34, 11, 5, 197, 10, 11, 5, 197, 83, 11, 5, 197, 109, 11, 5, 197, 90, 11, 5, 195, 18, 11, 5, 195, 17, 11, @@ -12299,27 +12300,27 @@ static const unsigned char phrasebook[] = { 195, 81, 11, 5, 194, 244, 11, 5, 194, 243, 11, 5, 194, 255, 11, 5, 194, 247, 11, 5, 194, 245, 11, 5, 194, 246, 11, 5, 194, 230, 11, 5, 194, 229, 11, 5, 194, 235, 11, 5, 194, 233, 11, 5, 194, 231, 11, 5, 194, 232, 11, - 5, 244, 237, 11, 5, 244, 230, 11, 5, 245, 10, 11, 5, 244, 250, 11, 5, - 245, 7, 11, 5, 245, 1, 11, 5, 245, 9, 11, 5, 245, 8, 11, 5, 247, 91, 11, - 5, 247, 83, 11, 5, 247, 173, 11, 5, 247, 124, 11, 5, 241, 28, 11, 5, 241, - 30, 11, 5, 241, 29, 11, 5, 241, 92, 11, 5, 241, 80, 11, 5, 244, 181, 11, - 5, 241, 111, 11, 5, 247, 19, 11, 5, 247, 56, 11, 5, 247, 25, 11, 5, 241, - 0, 11, 5, 240, 254, 11, 5, 241, 40, 11, 5, 241, 26, 11, 5, 241, 6, 11, 5, - 241, 21, 11, 5, 240, 233, 11, 5, 240, 232, 11, 5, 240, 245, 11, 5, 240, - 239, 11, 5, 240, 234, 11, 5, 240, 236, 11, 5, 194, 213, 11, 5, 194, 212, + 5, 244, 238, 11, 5, 244, 231, 11, 5, 245, 11, 11, 5, 244, 251, 11, 5, + 245, 8, 11, 5, 245, 2, 11, 5, 245, 10, 11, 5, 245, 9, 11, 5, 247, 92, 11, + 5, 247, 84, 11, 5, 247, 174, 11, 5, 247, 125, 11, 5, 241, 29, 11, 5, 241, + 31, 11, 5, 241, 30, 11, 5, 241, 93, 11, 5, 241, 81, 11, 5, 244, 182, 11, + 5, 241, 112, 11, 5, 247, 20, 11, 5, 247, 57, 11, 5, 247, 26, 11, 5, 241, + 1, 11, 5, 240, 255, 11, 5, 241, 41, 11, 5, 241, 27, 11, 5, 241, 7, 11, 5, + 241, 22, 11, 5, 240, 234, 11, 5, 240, 233, 11, 5, 240, 246, 11, 5, 240, + 240, 11, 5, 240, 235, 11, 5, 240, 237, 11, 5, 194, 213, 11, 5, 194, 212, 11, 5, 194, 219, 11, 5, 194, 214, 11, 5, 194, 216, 11, 5, 194, 215, 11, 5, 194, 218, 11, 5, 194, 217, 11, 5, 194, 225, 11, 5, 194, 224, 11, 5, 194, 228, 11, 5, 194, 226, 11, 5, 194, 209, 11, 5, 194, 211, 11, 5, 194, 210, 11, 5, 194, 220, 11, 5, 194, 223, 11, 5, 194, 221, 11, 5, 194, 202, 11, 5, 194, 206, 11, 5, 194, 205, 11, 5, 194, 203, 11, 5, 194, 204, 11, 5, 194, 196, 11, 5, 194, 195, 11, 5, 194, 201, 11, 5, 194, 199, 11, 5, - 194, 197, 11, 5, 194, 198, 11, 5, 215, 40, 11, 5, 215, 39, 11, 5, 215, - 45, 11, 5, 215, 41, 11, 5, 215, 42, 11, 5, 215, 44, 11, 5, 215, 43, 11, - 5, 215, 50, 11, 5, 215, 49, 11, 5, 215, 53, 11, 5, 215, 52, 11, 5, 215, - 33, 11, 5, 215, 34, 11, 5, 215, 37, 11, 5, 215, 38, 11, 5, 215, 46, 11, - 5, 215, 48, 11, 5, 215, 28, 11, 5, 215, 36, 11, 5, 215, 32, 11, 5, 215, - 29, 11, 5, 215, 30, 11, 5, 215, 23, 11, 5, 215, 22, 11, 5, 215, 27, 11, - 5, 215, 26, 11, 5, 215, 24, 11, 5, 215, 25, 11, 5, 206, 31, 11, 5, 167, + 194, 197, 11, 5, 194, 198, 11, 5, 215, 41, 11, 5, 215, 40, 11, 5, 215, + 46, 11, 5, 215, 42, 11, 5, 215, 43, 11, 5, 215, 45, 11, 5, 215, 44, 11, + 5, 215, 51, 11, 5, 215, 50, 11, 5, 215, 54, 11, 5, 215, 53, 11, 5, 215, + 34, 11, 5, 215, 35, 11, 5, 215, 38, 11, 5, 215, 39, 11, 5, 215, 47, 11, + 5, 215, 49, 11, 5, 215, 29, 11, 5, 215, 37, 11, 5, 215, 33, 11, 5, 215, + 30, 11, 5, 215, 31, 11, 5, 215, 24, 11, 5, 215, 23, 11, 5, 215, 28, 11, + 5, 215, 27, 11, 5, 215, 25, 11, 5, 215, 26, 11, 5, 206, 31, 11, 5, 167, 11, 5, 206, 112, 11, 5, 206, 34, 11, 5, 206, 92, 11, 5, 206, 95, 11, 5, 206, 93, 11, 5, 208, 199, 11, 5, 208, 183, 11, 5, 183, 11, 5, 208, 207, 11, 5, 204, 101, 11, 5, 204, 103, 11, 5, 204, 102, 11, 5, 205, 165, 11, @@ -12339,65 +12340,65 @@ static const unsigned char phrasebook[] = { 11, 5, 195, 61, 11, 5, 195, 65, 11, 5, 195, 63, 11, 5, 195, 44, 11, 5, 195, 43, 11, 5, 195, 51, 11, 5, 195, 47, 11, 5, 195, 45, 11, 5, 195, 46, 11, 5, 195, 36, 11, 5, 195, 35, 11, 5, 195, 40, 11, 5, 195, 39, 11, 5, - 195, 37, 11, 5, 195, 38, 11, 5, 245, 108, 11, 5, 245, 104, 11, 5, 247, - 15, 11, 5, 247, 1, 11, 5, 245, 25, 11, 5, 245, 24, 11, 5, 245, 27, 11, 5, - 245, 26, 11, 5, 245, 40, 11, 5, 245, 39, 11, 5, 245, 48, 11, 5, 245, 43, - 11, 5, 245, 79, 11, 5, 245, 77, 11, 5, 245, 102, 11, 5, 245, 87, 11, 5, - 245, 19, 11, 5, 245, 29, 11, 5, 245, 23, 11, 5, 245, 20, 11, 5, 245, 22, - 11, 5, 245, 12, 11, 5, 245, 11, 11, 5, 245, 16, 11, 5, 245, 15, 11, 5, - 245, 13, 11, 5, 245, 14, 11, 5, 209, 177, 11, 5, 209, 181, 11, 5, 209, + 195, 37, 11, 5, 195, 38, 11, 5, 245, 109, 11, 5, 245, 105, 11, 5, 247, + 16, 11, 5, 247, 2, 11, 5, 245, 26, 11, 5, 245, 25, 11, 5, 245, 28, 11, 5, + 245, 27, 11, 5, 245, 41, 11, 5, 245, 40, 11, 5, 245, 49, 11, 5, 245, 44, + 11, 5, 245, 80, 11, 5, 245, 78, 11, 5, 245, 103, 11, 5, 245, 88, 11, 5, + 245, 20, 11, 5, 245, 30, 11, 5, 245, 24, 11, 5, 245, 21, 11, 5, 245, 23, + 11, 5, 245, 13, 11, 5, 245, 12, 11, 5, 245, 17, 11, 5, 245, 16, 11, 5, + 245, 14, 11, 5, 245, 15, 11, 5, 209, 177, 11, 5, 209, 181, 11, 5, 209, 159, 11, 5, 209, 160, 11, 5, 209, 164, 11, 5, 209, 163, 11, 5, 209, 167, 11, 5, 209, 165, 11, 5, 209, 171, 11, 5, 209, 170, 11, 5, 209, 176, 11, 5, 209, 172, 11, 5, 209, 155, 11, 5, 209, 153, 11, 5, 209, 161, 11, 5, 209, 158, 11, 5, 209, 156, 11, 5, 209, 157, 11, 5, 209, 148, 11, 5, 209, 147, 11, 5, 209, 152, 11, 5, 209, 151, 11, 5, 209, 149, 11, 5, 209, 150, - 11, 5, 215, 249, 11, 5, 215, 248, 11, 5, 215, 251, 11, 5, 215, 250, 11, - 5, 215, 240, 11, 5, 215, 242, 11, 5, 215, 241, 11, 5, 215, 244, 11, 5, - 215, 243, 11, 5, 215, 247, 11, 5, 215, 246, 11, 5, 215, 234, 11, 5, 215, - 233, 11, 5, 215, 239, 11, 5, 215, 237, 11, 5, 215, 235, 11, 5, 215, 236, - 11, 5, 215, 228, 11, 5, 215, 227, 11, 5, 215, 232, 11, 5, 215, 231, 11, - 5, 215, 229, 11, 5, 215, 230, 11, 5, 207, 9, 11, 5, 207, 4, 11, 5, 207, + 11, 5, 215, 250, 11, 5, 215, 249, 11, 5, 215, 252, 11, 5, 215, 251, 11, + 5, 215, 241, 11, 5, 215, 243, 11, 5, 215, 242, 11, 5, 215, 245, 11, 5, + 215, 244, 11, 5, 215, 248, 11, 5, 215, 247, 11, 5, 215, 235, 11, 5, 215, + 234, 11, 5, 215, 240, 11, 5, 215, 238, 11, 5, 215, 236, 11, 5, 215, 237, + 11, 5, 215, 229, 11, 5, 215, 228, 11, 5, 215, 233, 11, 5, 215, 232, 11, + 5, 215, 230, 11, 5, 215, 231, 11, 5, 207, 9, 11, 5, 207, 4, 11, 5, 207, 50, 11, 5, 207, 22, 11, 5, 206, 139, 11, 5, 206, 141, 11, 5, 206, 140, 11, 5, 206, 166, 11, 5, 206, 161, 11, 5, 206, 198, 11, 5, 206, 186, 11, 5, 206, 233, 11, 5, 206, 226, 11, 5, 206, 255, 11, 5, 206, 242, 11, 5, 206, 135, 11, 5, 206, 132, 11, 5, 206, 151, 11, 5, 206, 138, 11, 5, 206, 136, 11, 5, 206, 137, 11, 5, 206, 115, 11, 5, 206, 114, 11, 5, 206, 121, - 11, 5, 206, 118, 11, 5, 206, 116, 11, 5, 206, 117, 11, 5, 210, 197, 11, - 5, 210, 191, 11, 5, 169, 11, 5, 210, 203, 11, 5, 209, 110, 11, 5, 209, + 11, 5, 206, 118, 11, 5, 206, 116, 11, 5, 206, 117, 11, 5, 210, 198, 11, + 5, 210, 192, 11, 5, 169, 11, 5, 210, 204, 11, 5, 209, 110, 11, 5, 209, 112, 11, 5, 209, 111, 11, 5, 209, 195, 11, 5, 209, 183, 11, 5, 209, 232, - 11, 5, 209, 199, 11, 5, 210, 82, 11, 5, 210, 182, 11, 5, 210, 124, 11, 5, + 11, 5, 209, 199, 11, 5, 210, 82, 11, 5, 210, 183, 11, 5, 210, 124, 11, 5, 209, 102, 11, 5, 209, 99, 11, 5, 209, 140, 11, 5, 209, 109, 11, 5, 209, 105, 11, 5, 209, 106, 11, 5, 209, 84, 11, 5, 209, 83, 11, 5, 209, 89, 11, - 5, 209, 87, 11, 5, 209, 85, 11, 5, 209, 86, 11, 5, 225, 159, 11, 5, 225, - 158, 11, 5, 225, 171, 11, 5, 225, 160, 11, 5, 225, 167, 11, 5, 225, 166, - 11, 5, 225, 169, 11, 5, 225, 168, 11, 5, 225, 97, 11, 5, 225, 96, 11, 5, - 225, 99, 11, 5, 225, 98, 11, 5, 225, 115, 11, 5, 225, 113, 11, 5, 225, - 128, 11, 5, 225, 117, 11, 5, 225, 90, 11, 5, 225, 88, 11, 5, 225, 109, - 11, 5, 225, 95, 11, 5, 225, 92, 11, 5, 225, 93, 11, 5, 225, 82, 11, 5, - 225, 81, 11, 5, 225, 86, 11, 5, 225, 85, 11, 5, 225, 83, 11, 5, 225, 84, - 11, 5, 211, 112, 11, 5, 211, 110, 11, 5, 211, 120, 11, 5, 211, 113, 11, - 5, 211, 117, 11, 5, 211, 116, 11, 5, 211, 119, 11, 5, 211, 118, 11, 5, - 211, 62, 11, 5, 211, 59, 11, 5, 211, 64, 11, 5, 211, 63, 11, 5, 211, 99, - 11, 5, 211, 98, 11, 5, 211, 108, 11, 5, 211, 102, 11, 5, 211, 54, 11, 5, - 211, 50, 11, 5, 211, 96, 11, 5, 211, 58, 11, 5, 211, 56, 11, 5, 211, 57, - 11, 5, 211, 34, 11, 5, 211, 32, 11, 5, 211, 44, 11, 5, 211, 37, 11, 5, - 211, 35, 11, 5, 211, 36, 11, 5, 225, 148, 11, 5, 225, 147, 11, 5, 225, - 154, 11, 5, 225, 149, 11, 5, 225, 151, 11, 5, 225, 150, 11, 5, 225, 153, - 11, 5, 225, 152, 11, 5, 225, 139, 11, 5, 225, 141, 11, 5, 225, 140, 11, - 5, 225, 144, 11, 5, 225, 143, 11, 5, 225, 146, 11, 5, 225, 145, 11, 5, - 225, 135, 11, 5, 225, 134, 11, 5, 225, 142, 11, 5, 225, 138, 11, 5, 225, - 136, 11, 5, 225, 137, 11, 5, 225, 131, 11, 5, 225, 130, 11, 5, 225, 133, - 11, 5, 225, 132, 11, 5, 216, 140, 11, 5, 216, 139, 11, 5, 216, 147, 11, - 5, 216, 141, 11, 5, 216, 143, 11, 5, 216, 142, 11, 5, 216, 146, 11, 5, - 216, 144, 11, 5, 216, 129, 11, 5, 216, 130, 11, 5, 216, 135, 11, 5, 216, - 134, 11, 5, 216, 138, 11, 5, 216, 136, 11, 5, 216, 124, 11, 5, 216, 133, - 11, 5, 216, 128, 11, 5, 216, 125, 11, 5, 216, 126, 11, 5, 216, 119, 11, - 5, 216, 118, 11, 5, 216, 123, 11, 5, 216, 122, 11, 5, 216, 120, 11, 5, - 216, 121, 11, 5, 215, 75, 11, 5, 215, 74, 11, 5, 215, 88, 11, 5, 215, 79, - 11, 5, 215, 84, 11, 5, 215, 83, 11, 5, 215, 86, 11, 5, 215, 85, 11, 5, - 215, 60, 11, 5, 215, 62, 11, 5, 215, 61, 11, 5, 215, 67, 11, 5, 215, 66, - 11, 5, 215, 72, 11, 5, 215, 68, 11, 5, 215, 58, 11, 5, 215, 56, 11, 5, - 215, 65, 11, 5, 215, 59, 11, 5, 196, 187, 11, 5, 196, 186, 11, 5, 196, + 5, 209, 87, 11, 5, 209, 85, 11, 5, 209, 86, 11, 5, 225, 160, 11, 5, 225, + 159, 11, 5, 225, 172, 11, 5, 225, 161, 11, 5, 225, 168, 11, 5, 225, 167, + 11, 5, 225, 170, 11, 5, 225, 169, 11, 5, 225, 98, 11, 5, 225, 97, 11, 5, + 225, 100, 11, 5, 225, 99, 11, 5, 225, 116, 11, 5, 225, 114, 11, 5, 225, + 129, 11, 5, 225, 118, 11, 5, 225, 91, 11, 5, 225, 89, 11, 5, 225, 110, + 11, 5, 225, 96, 11, 5, 225, 93, 11, 5, 225, 94, 11, 5, 225, 83, 11, 5, + 225, 82, 11, 5, 225, 87, 11, 5, 225, 86, 11, 5, 225, 84, 11, 5, 225, 85, + 11, 5, 211, 113, 11, 5, 211, 111, 11, 5, 211, 121, 11, 5, 211, 114, 11, + 5, 211, 118, 11, 5, 211, 117, 11, 5, 211, 120, 11, 5, 211, 119, 11, 5, + 211, 63, 11, 5, 211, 60, 11, 5, 211, 65, 11, 5, 211, 64, 11, 5, 211, 100, + 11, 5, 211, 99, 11, 5, 211, 109, 11, 5, 211, 103, 11, 5, 211, 55, 11, 5, + 211, 51, 11, 5, 211, 97, 11, 5, 211, 59, 11, 5, 211, 57, 11, 5, 211, 58, + 11, 5, 211, 35, 11, 5, 211, 33, 11, 5, 211, 45, 11, 5, 211, 38, 11, 5, + 211, 36, 11, 5, 211, 37, 11, 5, 225, 149, 11, 5, 225, 148, 11, 5, 225, + 155, 11, 5, 225, 150, 11, 5, 225, 152, 11, 5, 225, 151, 11, 5, 225, 154, + 11, 5, 225, 153, 11, 5, 225, 140, 11, 5, 225, 142, 11, 5, 225, 141, 11, + 5, 225, 145, 11, 5, 225, 144, 11, 5, 225, 147, 11, 5, 225, 146, 11, 5, + 225, 136, 11, 5, 225, 135, 11, 5, 225, 143, 11, 5, 225, 139, 11, 5, 225, + 137, 11, 5, 225, 138, 11, 5, 225, 132, 11, 5, 225, 131, 11, 5, 225, 134, + 11, 5, 225, 133, 11, 5, 216, 141, 11, 5, 216, 140, 11, 5, 216, 148, 11, + 5, 216, 142, 11, 5, 216, 144, 11, 5, 216, 143, 11, 5, 216, 147, 11, 5, + 216, 145, 11, 5, 216, 130, 11, 5, 216, 131, 11, 5, 216, 136, 11, 5, 216, + 135, 11, 5, 216, 139, 11, 5, 216, 137, 11, 5, 216, 125, 11, 5, 216, 134, + 11, 5, 216, 129, 11, 5, 216, 126, 11, 5, 216, 127, 11, 5, 216, 120, 11, + 5, 216, 119, 11, 5, 216, 124, 11, 5, 216, 123, 11, 5, 216, 121, 11, 5, + 216, 122, 11, 5, 215, 76, 11, 5, 215, 75, 11, 5, 215, 89, 11, 5, 215, 80, + 11, 5, 215, 85, 11, 5, 215, 84, 11, 5, 215, 87, 11, 5, 215, 86, 11, 5, + 215, 61, 11, 5, 215, 63, 11, 5, 215, 62, 11, 5, 215, 68, 11, 5, 215, 67, + 11, 5, 215, 73, 11, 5, 215, 69, 11, 5, 215, 59, 11, 5, 215, 57, 11, 5, + 215, 66, 11, 5, 215, 60, 11, 5, 196, 187, 11, 5, 196, 186, 11, 5, 196, 196, 11, 5, 196, 189, 11, 5, 196, 191, 11, 5, 196, 190, 11, 5, 196, 193, 11, 5, 196, 192, 11, 5, 196, 175, 11, 5, 196, 176, 11, 5, 196, 180, 11, 5, 196, 179, 11, 5, 196, 185, 11, 5, 196, 183, 11, 5, 196, 152, 11, 5, @@ -12408,299 +12409,299 @@ static const unsigned char phrasebook[] = { 5, 195, 227, 11, 5, 196, 3, 11, 5, 195, 236, 11, 5, 195, 181, 11, 5, 195, 177, 11, 5, 195, 217, 11, 5, 195, 188, 11, 5, 195, 184, 11, 5, 195, 185, 11, 5, 195, 161, 11, 5, 195, 160, 11, 5, 195, 168, 11, 5, 195, 164, 11, - 5, 195, 162, 11, 5, 195, 163, 11, 44, 211, 99, 11, 44, 222, 108, 11, 44, - 224, 54, 11, 44, 215, 79, 11, 44, 240, 239, 11, 44, 205, 47, 11, 44, 233, - 248, 11, 44, 234, 24, 11, 44, 219, 77, 11, 44, 231, 21, 11, 44, 221, 142, - 11, 44, 249, 16, 11, 44, 218, 186, 11, 44, 196, 3, 11, 44, 211, 192, 11, - 44, 231, 15, 11, 44, 203, 94, 11, 44, 234, 122, 11, 44, 194, 247, 11, 44, - 240, 233, 11, 44, 240, 0, 11, 44, 247, 243, 11, 44, 233, 244, 11, 44, - 215, 68, 11, 44, 201, 40, 11, 44, 214, 92, 11, 44, 225, 135, 11, 44, 195, - 6, 11, 44, 211, 170, 11, 44, 231, 234, 11, 44, 196, 9, 11, 44, 197, 215, - 11, 44, 206, 121, 11, 44, 199, 106, 11, 44, 195, 115, 11, 44, 225, 128, - 11, 44, 215, 32, 11, 44, 225, 133, 11, 44, 233, 120, 11, 44, 225, 153, - 11, 44, 197, 34, 11, 44, 237, 200, 11, 44, 206, 137, 11, 44, 222, 102, - 11, 44, 240, 245, 11, 44, 241, 29, 11, 44, 244, 250, 11, 44, 231, 18, 11, - 44, 207, 9, 11, 44, 194, 246, 11, 44, 206, 186, 11, 44, 245, 102, 11, 44, - 194, 216, 11, 44, 217, 185, 11, 44, 224, 208, 222, 51, 1, 249, 144, 222, - 51, 1, 161, 222, 51, 1, 213, 5, 222, 51, 1, 240, 135, 222, 51, 1, 189, - 222, 51, 1, 202, 233, 222, 51, 1, 234, 122, 222, 51, 1, 155, 222, 51, 1, - 224, 145, 222, 51, 1, 225, 213, 222, 51, 1, 247, 173, 222, 51, 1, 247, - 15, 222, 51, 1, 237, 155, 222, 51, 1, 201, 113, 222, 51, 1, 201, 103, - 222, 51, 1, 166, 222, 51, 1, 176, 222, 51, 1, 172, 222, 51, 1, 183, 222, - 51, 1, 195, 74, 222, 51, 1, 195, 115, 222, 51, 1, 217, 70, 222, 51, 1, - 142, 222, 51, 1, 196, 208, 222, 51, 1, 232, 79, 222, 51, 1, 235, 238, - 222, 51, 1, 197, 166, 222, 51, 1, 207, 50, 222, 51, 1, 164, 222, 51, 1, - 233, 229, 222, 51, 1, 63, 222, 51, 1, 251, 244, 222, 51, 1, 69, 222, 51, - 1, 236, 115, 222, 51, 1, 68, 222, 51, 1, 72, 222, 51, 1, 66, 222, 51, 1, - 200, 99, 222, 51, 1, 200, 92, 222, 51, 1, 214, 163, 222, 51, 1, 152, 218, - 61, 202, 122, 222, 51, 1, 152, 218, 0, 212, 116, 222, 51, 1, 152, 218, - 61, 240, 244, 222, 51, 1, 152, 218, 61, 248, 115, 222, 51, 1, 152, 218, - 61, 176, 222, 51, 1, 152, 218, 61, 225, 180, 222, 51, 211, 213, 244, 158, - 222, 51, 211, 213, 234, 216, 204, 226, 54, 5, 237, 53, 54, 5, 237, 49, - 54, 5, 232, 117, 54, 5, 197, 98, 54, 5, 197, 97, 54, 5, 213, 78, 54, 5, - 248, 190, 54, 5, 248, 250, 54, 5, 219, 232, 54, 5, 223, 217, 54, 5, 219, - 109, 54, 5, 234, 60, 54, 5, 235, 181, 54, 5, 199, 113, 54, 5, 203, 48, - 54, 5, 202, 215, 54, 5, 239, 165, 54, 5, 239, 162, 54, 5, 222, 187, 54, - 5, 210, 154, 54, 5, 239, 236, 54, 5, 217, 149, 54, 5, 208, 129, 54, 5, - 206, 253, 54, 5, 195, 85, 54, 5, 195, 64, 54, 5, 247, 48, 54, 5, 225, - 190, 54, 5, 216, 154, 54, 5, 196, 66, 54, 5, 224, 199, 54, 5, 217, 43, - 54, 5, 234, 39, 54, 5, 219, 187, 54, 5, 217, 106, 54, 5, 215, 96, 54, 5, - 68, 54, 5, 226, 85, 54, 5, 232, 70, 54, 5, 232, 40, 54, 5, 197, 70, 54, - 5, 197, 52, 54, 5, 212, 219, 54, 5, 248, 188, 54, 5, 248, 183, 54, 5, - 219, 225, 54, 5, 223, 214, 54, 5, 219, 106, 54, 5, 234, 56, 54, 5, 235, - 152, 54, 5, 199, 34, 54, 5, 202, 122, 54, 5, 202, 195, 54, 5, 239, 157, - 54, 5, 239, 161, 54, 5, 222, 108, 54, 5, 210, 72, 54, 5, 239, 151, 54, 5, - 217, 143, 54, 5, 206, 112, 54, 5, 206, 223, 54, 5, 195, 33, 54, 5, 195, - 60, 54, 5, 245, 10, 54, 5, 225, 171, 54, 5, 216, 147, 54, 5, 196, 24, 54, - 5, 224, 100, 54, 5, 217, 35, 54, 5, 233, 191, 54, 5, 219, 77, 54, 5, 216, - 222, 54, 5, 215, 88, 54, 5, 63, 54, 5, 251, 105, 54, 5, 217, 65, 54, 5, - 142, 54, 5, 232, 211, 54, 5, 197, 166, 54, 5, 197, 146, 54, 5, 161, 54, - 5, 248, 196, 54, 5, 249, 144, 54, 5, 219, 240, 54, 5, 223, 222, 54, 5, - 223, 220, 54, 5, 219, 113, 54, 5, 234, 64, 54, 5, 235, 238, 54, 5, 199, - 152, 54, 5, 189, 54, 5, 202, 233, 54, 5, 239, 175, 54, 5, 239, 164, 54, - 5, 172, 54, 5, 169, 54, 5, 240, 135, 54, 5, 217, 158, 54, 5, 183, 54, 5, - 207, 50, 54, 5, 195, 115, 54, 5, 195, 74, 54, 5, 247, 173, 54, 5, 225, - 213, 54, 5, 216, 163, 54, 5, 164, 54, 5, 155, 54, 5, 225, 16, 54, 5, 217, - 49, 54, 5, 234, 122, 54, 5, 166, 54, 5, 176, 54, 5, 215, 108, 54, 5, 214, - 101, 54, 5, 214, 96, 54, 5, 231, 165, 54, 5, 197, 15, 54, 5, 197, 11, 54, - 5, 212, 90, 54, 5, 248, 186, 54, 5, 248, 102, 54, 5, 219, 220, 54, 5, - 223, 212, 54, 5, 219, 102, 54, 5, 234, 52, 54, 5, 235, 39, 54, 5, 198, - 233, 54, 5, 201, 247, 54, 5, 202, 164, 54, 5, 239, 154, 54, 5, 239, 159, - 54, 5, 221, 228, 54, 5, 209, 206, 54, 5, 239, 2, 54, 5, 217, 130, 54, 5, + 5, 195, 162, 11, 5, 195, 163, 11, 44, 211, 100, 11, 44, 222, 109, 11, 44, + 224, 55, 11, 44, 215, 80, 11, 44, 240, 240, 11, 44, 205, 47, 11, 44, 233, + 249, 11, 44, 234, 25, 11, 44, 219, 78, 11, 44, 231, 22, 11, 44, 221, 143, + 11, 44, 249, 17, 11, 44, 218, 187, 11, 44, 196, 3, 11, 44, 211, 193, 11, + 44, 231, 16, 11, 44, 203, 94, 11, 44, 234, 123, 11, 44, 194, 247, 11, 44, + 240, 234, 11, 44, 240, 1, 11, 44, 247, 244, 11, 44, 233, 245, 11, 44, + 215, 69, 11, 44, 201, 40, 11, 44, 214, 93, 11, 44, 225, 136, 11, 44, 195, + 6, 11, 44, 211, 171, 11, 44, 231, 235, 11, 44, 196, 9, 11, 44, 197, 215, + 11, 44, 206, 121, 11, 44, 199, 106, 11, 44, 195, 115, 11, 44, 225, 129, + 11, 44, 215, 33, 11, 44, 225, 134, 11, 44, 233, 121, 11, 44, 225, 154, + 11, 44, 197, 34, 11, 44, 237, 201, 11, 44, 206, 137, 11, 44, 222, 103, + 11, 44, 240, 246, 11, 44, 241, 30, 11, 44, 244, 251, 11, 44, 231, 19, 11, + 44, 207, 9, 11, 44, 194, 246, 11, 44, 206, 186, 11, 44, 245, 103, 11, 44, + 194, 216, 11, 44, 217, 186, 11, 44, 224, 209, 222, 52, 1, 249, 145, 222, + 52, 1, 161, 222, 52, 1, 213, 6, 222, 52, 1, 240, 136, 222, 52, 1, 189, + 222, 52, 1, 202, 233, 222, 52, 1, 234, 123, 222, 52, 1, 155, 222, 52, 1, + 224, 146, 222, 52, 1, 225, 214, 222, 52, 1, 247, 174, 222, 52, 1, 247, + 16, 222, 52, 1, 237, 156, 222, 52, 1, 201, 113, 222, 52, 1, 201, 103, + 222, 52, 1, 166, 222, 52, 1, 176, 222, 52, 1, 172, 222, 52, 1, 183, 222, + 52, 1, 195, 74, 222, 52, 1, 195, 115, 222, 52, 1, 217, 71, 222, 52, 1, + 142, 222, 52, 1, 196, 208, 222, 52, 1, 232, 80, 222, 52, 1, 235, 239, + 222, 52, 1, 197, 166, 222, 52, 1, 207, 50, 222, 52, 1, 164, 222, 52, 1, + 233, 230, 222, 52, 1, 63, 222, 52, 1, 251, 245, 222, 52, 1, 69, 222, 52, + 1, 236, 116, 222, 52, 1, 68, 222, 52, 1, 72, 222, 52, 1, 66, 222, 52, 1, + 200, 99, 222, 52, 1, 200, 92, 222, 52, 1, 214, 164, 222, 52, 1, 152, 218, + 62, 202, 122, 222, 52, 1, 152, 218, 1, 212, 117, 222, 52, 1, 152, 218, + 62, 240, 245, 222, 52, 1, 152, 218, 62, 248, 116, 222, 52, 1, 152, 218, + 62, 176, 222, 52, 1, 152, 218, 62, 225, 181, 222, 52, 211, 214, 244, 159, + 222, 52, 211, 214, 234, 217, 204, 226, 54, 5, 237, 54, 54, 5, 237, 50, + 54, 5, 232, 118, 54, 5, 197, 98, 54, 5, 197, 97, 54, 5, 213, 79, 54, 5, + 248, 191, 54, 5, 248, 251, 54, 5, 219, 233, 54, 5, 223, 218, 54, 5, 219, + 110, 54, 5, 234, 61, 54, 5, 235, 182, 54, 5, 199, 113, 54, 5, 203, 48, + 54, 5, 202, 215, 54, 5, 239, 166, 54, 5, 239, 163, 54, 5, 222, 188, 54, + 5, 210, 155, 54, 5, 239, 237, 54, 5, 217, 150, 54, 5, 208, 129, 54, 5, + 206, 253, 54, 5, 195, 85, 54, 5, 195, 64, 54, 5, 247, 49, 54, 5, 225, + 191, 54, 5, 216, 155, 54, 5, 196, 66, 54, 5, 224, 200, 54, 5, 217, 44, + 54, 5, 234, 40, 54, 5, 219, 188, 54, 5, 217, 107, 54, 5, 215, 97, 54, 5, + 68, 54, 5, 226, 86, 54, 5, 232, 71, 54, 5, 232, 41, 54, 5, 197, 70, 54, + 5, 197, 52, 54, 5, 212, 220, 54, 5, 248, 189, 54, 5, 248, 184, 54, 5, + 219, 226, 54, 5, 223, 215, 54, 5, 219, 107, 54, 5, 234, 57, 54, 5, 235, + 153, 54, 5, 199, 34, 54, 5, 202, 122, 54, 5, 202, 195, 54, 5, 239, 158, + 54, 5, 239, 162, 54, 5, 222, 109, 54, 5, 210, 72, 54, 5, 239, 152, 54, 5, + 217, 144, 54, 5, 206, 112, 54, 5, 206, 223, 54, 5, 195, 33, 54, 5, 195, + 60, 54, 5, 245, 11, 54, 5, 225, 172, 54, 5, 216, 148, 54, 5, 196, 24, 54, + 5, 224, 101, 54, 5, 217, 36, 54, 5, 233, 192, 54, 5, 219, 78, 54, 5, 216, + 223, 54, 5, 215, 89, 54, 5, 63, 54, 5, 251, 106, 54, 5, 217, 66, 54, 5, + 142, 54, 5, 232, 212, 54, 5, 197, 166, 54, 5, 197, 146, 54, 5, 161, 54, + 5, 248, 197, 54, 5, 249, 145, 54, 5, 219, 241, 54, 5, 223, 223, 54, 5, + 223, 221, 54, 5, 219, 114, 54, 5, 234, 65, 54, 5, 235, 239, 54, 5, 199, + 152, 54, 5, 189, 54, 5, 202, 233, 54, 5, 239, 176, 54, 5, 239, 165, 54, + 5, 172, 54, 5, 169, 54, 5, 240, 136, 54, 5, 217, 159, 54, 5, 183, 54, 5, + 207, 50, 54, 5, 195, 115, 54, 5, 195, 74, 54, 5, 247, 174, 54, 5, 225, + 214, 54, 5, 216, 164, 54, 5, 164, 54, 5, 155, 54, 5, 225, 17, 54, 5, 217, + 50, 54, 5, 234, 123, 54, 5, 166, 54, 5, 176, 54, 5, 215, 109, 54, 5, 214, + 102, 54, 5, 214, 97, 54, 5, 231, 166, 54, 5, 197, 15, 54, 5, 197, 11, 54, + 5, 212, 91, 54, 5, 248, 187, 54, 5, 248, 103, 54, 5, 219, 221, 54, 5, + 223, 213, 54, 5, 219, 103, 54, 5, 234, 53, 54, 5, 235, 40, 54, 5, 198, + 233, 54, 5, 201, 247, 54, 5, 202, 164, 54, 5, 239, 155, 54, 5, 239, 160, + 54, 5, 221, 229, 54, 5, 209, 206, 54, 5, 239, 3, 54, 5, 217, 131, 54, 5, 205, 171, 54, 5, 206, 190, 54, 5, 195, 8, 54, 5, 195, 55, 54, 5, 241, - 116, 54, 5, 225, 118, 54, 5, 216, 137, 54, 5, 195, 237, 54, 5, 223, 241, - 54, 5, 217, 33, 54, 5, 233, 131, 54, 5, 218, 194, 54, 5, 216, 32, 54, 5, - 215, 69, 54, 5, 66, 54, 5, 200, 72, 54, 5, 231, 74, 54, 5, 231, 58, 54, - 5, 196, 243, 54, 5, 196, 236, 54, 5, 211, 226, 54, 5, 248, 185, 54, 5, - 248, 20, 54, 5, 219, 219, 54, 5, 223, 210, 54, 5, 219, 101, 54, 5, 234, - 51, 54, 5, 234, 222, 54, 5, 197, 220, 54, 5, 201, 40, 54, 5, 202, 142, - 54, 5, 239, 152, 54, 5, 239, 158, 54, 5, 221, 190, 54, 5, 209, 140, 54, - 5, 237, 200, 54, 5, 217, 125, 54, 5, 204, 172, 54, 5, 206, 151, 54, 5, - 194, 255, 54, 5, 195, 51, 54, 5, 241, 40, 54, 5, 225, 109, 54, 5, 216, - 133, 54, 5, 195, 217, 54, 5, 223, 186, 54, 5, 217, 32, 54, 5, 233, 75, - 54, 5, 218, 144, 54, 5, 215, 185, 54, 5, 215, 65, 54, 5, 72, 54, 5, 214, - 118, 54, 5, 216, 247, 54, 5, 231, 192, 54, 5, 231, 168, 54, 5, 197, 34, - 54, 5, 197, 16, 54, 5, 212, 116, 54, 5, 248, 187, 54, 5, 248, 115, 54, 5, - 219, 221, 54, 5, 223, 213, 54, 5, 219, 104, 54, 5, 234, 54, 54, 5, 234, - 53, 54, 5, 235, 50, 54, 5, 198, 248, 54, 5, 149, 54, 5, 202, 169, 54, 5, - 239, 155, 54, 5, 239, 160, 54, 5, 222, 6, 54, 5, 209, 232, 54, 5, 239, - 27, 54, 5, 217, 134, 54, 5, 205, 200, 54, 5, 206, 198, 54, 5, 195, 11, - 54, 5, 195, 57, 54, 5, 244, 181, 54, 5, 225, 128, 54, 5, 216, 138, 54, 5, - 196, 3, 54, 5, 224, 10, 54, 5, 217, 34, 54, 5, 233, 143, 54, 5, 218, 250, - 54, 5, 216, 49, 54, 5, 215, 72, 54, 5, 69, 54, 5, 236, 229, 54, 5, 217, - 54, 54, 5, 232, 146, 54, 5, 232, 100, 54, 5, 197, 109, 54, 5, 197, 92, - 54, 5, 213, 91, 54, 5, 248, 191, 54, 5, 249, 8, 54, 5, 219, 233, 54, 5, - 223, 218, 54, 5, 223, 216, 54, 5, 219, 110, 54, 5, 234, 61, 54, 5, 234, - 59, 54, 5, 235, 188, 54, 5, 199, 118, 54, 5, 203, 68, 54, 5, 202, 217, - 54, 5, 239, 166, 54, 5, 239, 163, 54, 5, 222, 196, 54, 5, 210, 182, 54, - 5, 239, 251, 54, 5, 217, 150, 54, 5, 208, 147, 54, 5, 206, 255, 54, 5, - 195, 88, 54, 5, 195, 65, 54, 5, 247, 56, 54, 5, 225, 192, 54, 5, 216, - 156, 54, 5, 196, 69, 54, 5, 224, 208, 54, 5, 217, 44, 54, 5, 217, 40, 54, - 5, 234, 47, 54, 5, 234, 33, 54, 5, 219, 206, 54, 5, 217, 117, 54, 5, 215, - 97, 54, 5, 217, 72, 54, 5, 222, 149, 54, 244, 158, 54, 234, 216, 204, - 226, 54, 211, 78, 78, 54, 5, 217, 133, 235, 238, 54, 5, 217, 133, 155, - 54, 5, 217, 133, 205, 171, 54, 16, 235, 177, 54, 16, 224, 197, 54, 16, - 202, 72, 54, 16, 216, 189, 54, 16, 249, 86, 54, 16, 235, 237, 54, 16, - 203, 162, 54, 16, 240, 85, 54, 16, 239, 1, 54, 16, 223, 163, 54, 16, 201, - 251, 54, 16, 239, 26, 54, 16, 225, 119, 54, 17, 195, 79, 54, 17, 100, 54, + 117, 54, 5, 225, 119, 54, 5, 216, 138, 54, 5, 195, 237, 54, 5, 223, 242, + 54, 5, 217, 34, 54, 5, 233, 132, 54, 5, 218, 195, 54, 5, 216, 33, 54, 5, + 215, 70, 54, 5, 66, 54, 5, 200, 72, 54, 5, 231, 75, 54, 5, 231, 59, 54, + 5, 196, 243, 54, 5, 196, 236, 54, 5, 211, 227, 54, 5, 248, 186, 54, 5, + 248, 21, 54, 5, 219, 220, 54, 5, 223, 211, 54, 5, 219, 102, 54, 5, 234, + 52, 54, 5, 234, 223, 54, 5, 197, 220, 54, 5, 201, 40, 54, 5, 202, 142, + 54, 5, 239, 153, 54, 5, 239, 159, 54, 5, 221, 191, 54, 5, 209, 140, 54, + 5, 237, 201, 54, 5, 217, 126, 54, 5, 204, 172, 54, 5, 206, 151, 54, 5, + 194, 255, 54, 5, 195, 51, 54, 5, 241, 41, 54, 5, 225, 110, 54, 5, 216, + 134, 54, 5, 195, 217, 54, 5, 223, 187, 54, 5, 217, 33, 54, 5, 233, 76, + 54, 5, 218, 145, 54, 5, 215, 186, 54, 5, 215, 66, 54, 5, 72, 54, 5, 214, + 119, 54, 5, 216, 248, 54, 5, 231, 193, 54, 5, 231, 169, 54, 5, 197, 34, + 54, 5, 197, 16, 54, 5, 212, 117, 54, 5, 248, 188, 54, 5, 248, 116, 54, 5, + 219, 222, 54, 5, 223, 214, 54, 5, 219, 105, 54, 5, 234, 55, 54, 5, 234, + 54, 54, 5, 235, 51, 54, 5, 198, 248, 54, 5, 149, 54, 5, 202, 169, 54, 5, + 239, 156, 54, 5, 239, 161, 54, 5, 222, 7, 54, 5, 209, 232, 54, 5, 239, + 28, 54, 5, 217, 135, 54, 5, 205, 200, 54, 5, 206, 198, 54, 5, 195, 11, + 54, 5, 195, 57, 54, 5, 244, 182, 54, 5, 225, 129, 54, 5, 216, 139, 54, 5, + 196, 3, 54, 5, 224, 11, 54, 5, 217, 35, 54, 5, 233, 144, 54, 5, 218, 251, + 54, 5, 216, 50, 54, 5, 215, 73, 54, 5, 69, 54, 5, 236, 230, 54, 5, 217, + 55, 54, 5, 232, 147, 54, 5, 232, 101, 54, 5, 197, 109, 54, 5, 197, 92, + 54, 5, 213, 92, 54, 5, 248, 192, 54, 5, 249, 9, 54, 5, 219, 234, 54, 5, + 223, 219, 54, 5, 223, 217, 54, 5, 219, 111, 54, 5, 234, 62, 54, 5, 234, + 60, 54, 5, 235, 189, 54, 5, 199, 118, 54, 5, 203, 68, 54, 5, 202, 217, + 54, 5, 239, 167, 54, 5, 239, 164, 54, 5, 222, 197, 54, 5, 210, 183, 54, + 5, 239, 252, 54, 5, 217, 151, 54, 5, 208, 147, 54, 5, 206, 255, 54, 5, + 195, 88, 54, 5, 195, 65, 54, 5, 247, 57, 54, 5, 225, 193, 54, 5, 216, + 157, 54, 5, 196, 69, 54, 5, 224, 209, 54, 5, 217, 45, 54, 5, 217, 41, 54, + 5, 234, 48, 54, 5, 234, 34, 54, 5, 219, 207, 54, 5, 217, 118, 54, 5, 215, + 98, 54, 5, 217, 73, 54, 5, 222, 150, 54, 244, 159, 54, 234, 217, 204, + 226, 54, 211, 79, 78, 54, 5, 217, 134, 235, 239, 54, 5, 217, 134, 155, + 54, 5, 217, 134, 205, 171, 54, 16, 235, 178, 54, 16, 224, 198, 54, 16, + 202, 72, 54, 16, 216, 190, 54, 16, 249, 87, 54, 16, 235, 238, 54, 16, + 203, 162, 54, 16, 240, 86, 54, 16, 239, 2, 54, 16, 223, 164, 54, 16, 201, + 251, 54, 16, 239, 27, 54, 16, 225, 120, 54, 17, 195, 79, 54, 17, 100, 54, 17, 102, 54, 17, 134, 54, 17, 136, 54, 17, 146, 54, 17, 167, 54, 17, 178, - 54, 17, 171, 54, 17, 182, 54, 5, 217, 133, 166, 54, 5, 217, 133, 239, 27, - 40, 6, 1, 195, 83, 40, 4, 1, 195, 83, 40, 6, 1, 237, 150, 40, 4, 1, 237, - 150, 40, 6, 1, 210, 89, 237, 152, 40, 4, 1, 210, 89, 237, 152, 40, 6, 1, - 226, 6, 40, 4, 1, 226, 6, 40, 6, 1, 239, 44, 40, 4, 1, 239, 44, 40, 6, 1, - 218, 202, 200, 87, 40, 4, 1, 218, 202, 200, 87, 40, 6, 1, 248, 34, 214, - 123, 40, 4, 1, 248, 34, 214, 123, 40, 6, 1, 217, 84, 196, 51, 40, 4, 1, - 217, 84, 196, 51, 40, 6, 1, 196, 48, 3, 249, 138, 196, 51, 40, 4, 1, 196, - 48, 3, 249, 138, 196, 51, 40, 6, 1, 226, 4, 196, 84, 40, 4, 1, 226, 4, + 54, 17, 171, 54, 17, 182, 54, 5, 217, 134, 166, 54, 5, 217, 134, 239, 28, + 40, 6, 1, 195, 83, 40, 4, 1, 195, 83, 40, 6, 1, 237, 151, 40, 4, 1, 237, + 151, 40, 6, 1, 210, 89, 237, 153, 40, 4, 1, 210, 89, 237, 153, 40, 6, 1, + 226, 7, 40, 4, 1, 226, 7, 40, 6, 1, 239, 45, 40, 4, 1, 239, 45, 40, 6, 1, + 218, 203, 200, 87, 40, 4, 1, 218, 203, 200, 87, 40, 6, 1, 248, 35, 214, + 124, 40, 4, 1, 248, 35, 214, 124, 40, 6, 1, 217, 85, 196, 51, 40, 4, 1, + 217, 85, 196, 51, 40, 6, 1, 196, 48, 3, 249, 139, 196, 51, 40, 4, 1, 196, + 48, 3, 249, 139, 196, 51, 40, 6, 1, 226, 5, 196, 84, 40, 4, 1, 226, 5, 196, 84, 40, 6, 1, 210, 89, 195, 217, 40, 4, 1, 210, 89, 195, 217, 40, 6, - 1, 226, 4, 63, 40, 4, 1, 226, 4, 63, 40, 6, 1, 244, 202, 222, 46, 195, - 182, 40, 4, 1, 244, 202, 222, 46, 195, 182, 40, 6, 1, 248, 127, 195, 182, - 40, 4, 1, 248, 127, 195, 182, 40, 6, 1, 226, 4, 244, 202, 222, 46, 195, - 182, 40, 4, 1, 226, 4, 244, 202, 222, 46, 195, 182, 40, 6, 1, 196, 5, 40, + 1, 226, 5, 63, 40, 4, 1, 226, 5, 63, 40, 6, 1, 244, 203, 222, 47, 195, + 182, 40, 4, 1, 244, 203, 222, 47, 195, 182, 40, 6, 1, 248, 128, 195, 182, + 40, 4, 1, 248, 128, 195, 182, 40, 6, 1, 226, 5, 244, 203, 222, 47, 195, + 182, 40, 4, 1, 226, 5, 244, 203, 222, 47, 195, 182, 40, 6, 1, 196, 5, 40, 4, 1, 196, 5, 40, 6, 1, 210, 89, 201, 107, 40, 4, 1, 210, 89, 201, 107, - 40, 6, 1, 205, 186, 239, 251, 40, 4, 1, 205, 186, 239, 251, 40, 6, 1, - 205, 186, 237, 6, 40, 4, 1, 205, 186, 237, 6, 40, 6, 1, 205, 186, 236, - 240, 40, 4, 1, 205, 186, 236, 240, 40, 6, 1, 218, 206, 72, 40, 4, 1, 218, - 206, 72, 40, 6, 1, 248, 159, 72, 40, 4, 1, 248, 159, 72, 40, 6, 1, 52, - 218, 206, 72, 40, 4, 1, 52, 218, 206, 72, 40, 1, 218, 120, 72, 38, 40, - 197, 201, 38, 40, 203, 24, 219, 26, 55, 38, 40, 231, 57, 219, 26, 55, 38, - 40, 202, 159, 219, 26, 55, 205, 246, 250, 178, 38, 40, 1, 200, 84, 226, - 146, 38, 40, 1, 68, 38, 40, 1, 196, 24, 38, 40, 1, 66, 38, 40, 1, 232, - 172, 55, 38, 40, 1, 196, 47, 38, 40, 1, 205, 186, 55, 38, 40, 1, 214, - 123, 38, 40, 224, 220, 38, 40, 213, 98, 40, 224, 220, 40, 213, 98, 40, 6, - 1, 237, 165, 40, 4, 1, 237, 165, 40, 6, 1, 237, 141, 40, 4, 1, 237, 141, - 40, 6, 1, 195, 41, 40, 4, 1, 195, 41, 40, 6, 1, 247, 72, 40, 4, 1, 247, - 72, 40, 6, 1, 237, 137, 40, 4, 1, 237, 137, 40, 6, 1, 203, 69, 3, 112, + 40, 6, 1, 205, 186, 239, 252, 40, 4, 1, 205, 186, 239, 252, 40, 6, 1, + 205, 186, 237, 7, 40, 4, 1, 205, 186, 237, 7, 40, 6, 1, 205, 186, 236, + 241, 40, 4, 1, 205, 186, 236, 241, 40, 6, 1, 218, 207, 72, 40, 4, 1, 218, + 207, 72, 40, 6, 1, 248, 160, 72, 40, 4, 1, 248, 160, 72, 40, 6, 1, 52, + 218, 207, 72, 40, 4, 1, 52, 218, 207, 72, 40, 1, 218, 121, 72, 38, 40, + 197, 201, 38, 40, 203, 24, 219, 27, 55, 38, 40, 231, 58, 219, 27, 55, 38, + 40, 202, 159, 219, 27, 55, 205, 246, 250, 179, 38, 40, 1, 200, 84, 226, + 147, 38, 40, 1, 68, 38, 40, 1, 196, 24, 38, 40, 1, 66, 38, 40, 1, 232, + 173, 55, 38, 40, 1, 196, 47, 38, 40, 1, 205, 186, 55, 38, 40, 1, 214, + 124, 38, 40, 224, 221, 38, 40, 213, 99, 40, 224, 221, 40, 213, 99, 40, 6, + 1, 237, 166, 40, 4, 1, 237, 166, 40, 6, 1, 237, 142, 40, 4, 1, 237, 142, + 40, 6, 1, 195, 41, 40, 4, 1, 195, 41, 40, 6, 1, 247, 73, 40, 4, 1, 247, + 73, 40, 6, 1, 237, 138, 40, 4, 1, 237, 138, 40, 6, 1, 203, 69, 3, 112, 122, 40, 4, 1, 203, 69, 3, 112, 122, 40, 6, 1, 200, 243, 40, 4, 1, 200, 243, 40, 6, 1, 201, 82, 40, 4, 1, 201, 82, 40, 6, 1, 201, 87, 40, 4, 1, - 201, 87, 40, 6, 1, 203, 74, 40, 4, 1, 203, 74, 40, 6, 1, 231, 39, 40, 4, - 1, 231, 39, 40, 6, 1, 206, 127, 40, 4, 1, 206, 127, 40, 6, 1, 52, 72, 40, - 4, 1, 52, 72, 40, 6, 1, 241, 58, 72, 40, 4, 1, 241, 58, 72, 73, 1, 40, - 232, 172, 55, 73, 1, 40, 205, 186, 55, 38, 40, 1, 237, 46, 38, 40, 1, - 226, 4, 69, 25, 1, 63, 25, 1, 155, 25, 1, 66, 25, 1, 223, 186, 25, 1, - 237, 53, 25, 1, 210, 154, 25, 1, 203, 145, 25, 1, 72, 25, 1, 215, 88, 25, + 201, 87, 40, 6, 1, 203, 74, 40, 4, 1, 203, 74, 40, 6, 1, 231, 40, 40, 4, + 1, 231, 40, 40, 6, 1, 206, 127, 40, 4, 1, 206, 127, 40, 6, 1, 52, 72, 40, + 4, 1, 52, 72, 40, 6, 1, 241, 59, 72, 40, 4, 1, 241, 59, 72, 73, 1, 40, + 232, 173, 55, 73, 1, 40, 205, 186, 55, 38, 40, 1, 237, 47, 38, 40, 1, + 226, 5, 69, 25, 1, 63, 25, 1, 155, 25, 1, 66, 25, 1, 223, 187, 25, 1, + 237, 54, 25, 1, 210, 155, 25, 1, 203, 145, 25, 1, 72, 25, 1, 215, 89, 25, 1, 68, 25, 1, 172, 25, 1, 161, 25, 1, 210, 9, 25, 1, 210, 57, 25, 1, 222, - 186, 25, 1, 219, 186, 25, 1, 203, 162, 25, 1, 217, 156, 25, 1, 216, 161, - 25, 1, 221, 135, 25, 1, 204, 74, 25, 1, 218, 144, 25, 1, 206, 218, 25, 1, - 206, 112, 25, 1, 206, 228, 25, 1, 207, 72, 25, 1, 223, 105, 25, 1, 224, - 171, 25, 1, 215, 153, 25, 1, 215, 185, 25, 1, 216, 132, 25, 1, 195, 234, - 25, 1, 206, 151, 25, 1, 195, 186, 25, 1, 164, 25, 1, 215, 222, 25, 1, - 224, 157, 25, 1, 213, 9, 25, 1, 216, 154, 25, 1, 215, 202, 25, 1, 211, - 217, 25, 1, 196, 240, 25, 1, 213, 78, 25, 1, 235, 181, 25, 1, 209, 140, - 25, 1, 221, 190, 25, 1, 219, 77, 25, 1, 216, 222, 25, 1, 210, 91, 25, 1, - 210, 228, 25, 1, 224, 181, 25, 1, 216, 254, 25, 1, 217, 49, 25, 1, 217, - 70, 25, 1, 206, 198, 25, 1, 211, 222, 25, 1, 234, 222, 25, 1, 235, 43, - 25, 1, 197, 166, 25, 1, 176, 25, 1, 222, 108, 25, 1, 212, 219, 25, 1, - 221, 220, 25, 1, 224, 10, 25, 1, 219, 230, 25, 1, 210, 126, 25, 1, 219, - 163, 25, 1, 166, 25, 1, 202, 122, 25, 1, 224, 100, 25, 1, 218, 250, 25, - 1, 219, 238, 25, 1, 203, 1, 25, 1, 223, 222, 25, 1, 203, 23, 25, 1, 215, - 188, 25, 1, 208, 227, 25, 1, 235, 234, 25, 1, 223, 225, 25, 1, 224, 1, - 25, 38, 117, 223, 234, 25, 38, 117, 201, 25, 25, 216, 160, 25, 234, 216, - 204, 226, 25, 244, 167, 25, 244, 158, 25, 207, 105, 25, 211, 78, 78, 73, - 1, 245, 60, 152, 196, 13, 212, 170, 73, 1, 245, 60, 152, 196, 96, 212, - 170, 73, 1, 245, 60, 152, 196, 13, 207, 23, 73, 1, 245, 60, 152, 196, 96, - 207, 23, 73, 1, 245, 60, 152, 196, 13, 211, 96, 73, 1, 245, 60, 152, 196, - 96, 211, 96, 73, 1, 245, 60, 152, 196, 13, 209, 140, 73, 1, 245, 60, 152, - 196, 96, 209, 140, 73, 1, 236, 73, 237, 249, 152, 154, 73, 1, 130, 237, - 249, 152, 154, 73, 1, 219, 64, 237, 249, 152, 154, 73, 1, 126, 237, 249, - 152, 154, 73, 1, 236, 72, 237, 249, 152, 154, 73, 1, 236, 73, 237, 249, - 222, 175, 152, 154, 73, 1, 130, 237, 249, 222, 175, 152, 154, 73, 1, 219, - 64, 237, 249, 222, 175, 152, 154, 73, 1, 126, 237, 249, 222, 175, 152, - 154, 73, 1, 236, 72, 237, 249, 222, 175, 152, 154, 73, 1, 236, 73, 222, - 175, 152, 154, 73, 1, 130, 222, 175, 152, 154, 73, 1, 219, 64, 222, 175, - 152, 154, 73, 1, 126, 222, 175, 152, 154, 73, 1, 236, 72, 222, 175, 152, - 154, 73, 1, 76, 83, 154, 73, 1, 76, 205, 248, 73, 1, 76, 231, 154, 154, - 73, 1, 221, 202, 53, 241, 101, 251, 89, 73, 1, 210, 214, 124, 51, 73, 1, - 210, 214, 135, 51, 73, 1, 210, 214, 236, 89, 78, 73, 1, 210, 214, 226, - 16, 236, 89, 78, 73, 1, 126, 226, 16, 236, 89, 78, 73, 1, 204, 206, 26, - 130, 202, 11, 73, 1, 204, 206, 26, 126, 202, 11, 8, 6, 1, 237, 41, 251, - 163, 8, 4, 1, 237, 41, 251, 163, 8, 6, 1, 237, 41, 251, 193, 8, 4, 1, - 237, 41, 251, 193, 8, 6, 1, 232, 98, 8, 4, 1, 232, 98, 8, 6, 1, 200, 187, + 187, 25, 1, 219, 187, 25, 1, 203, 162, 25, 1, 217, 157, 25, 1, 216, 162, + 25, 1, 221, 136, 25, 1, 204, 74, 25, 1, 218, 145, 25, 1, 206, 218, 25, 1, + 206, 112, 25, 1, 206, 228, 25, 1, 207, 72, 25, 1, 223, 106, 25, 1, 224, + 172, 25, 1, 215, 154, 25, 1, 215, 186, 25, 1, 216, 133, 25, 1, 195, 234, + 25, 1, 206, 151, 25, 1, 195, 186, 25, 1, 164, 25, 1, 215, 223, 25, 1, + 224, 158, 25, 1, 213, 10, 25, 1, 216, 155, 25, 1, 215, 203, 25, 1, 211, + 218, 25, 1, 196, 240, 25, 1, 213, 79, 25, 1, 235, 182, 25, 1, 209, 140, + 25, 1, 221, 191, 25, 1, 219, 78, 25, 1, 216, 223, 25, 1, 210, 91, 25, 1, + 210, 229, 25, 1, 224, 182, 25, 1, 216, 255, 25, 1, 217, 50, 25, 1, 217, + 71, 25, 1, 206, 198, 25, 1, 211, 223, 25, 1, 234, 223, 25, 1, 235, 44, + 25, 1, 197, 166, 25, 1, 176, 25, 1, 222, 109, 25, 1, 212, 220, 25, 1, + 221, 221, 25, 1, 224, 11, 25, 1, 219, 231, 25, 1, 210, 126, 25, 1, 219, + 164, 25, 1, 166, 25, 1, 202, 122, 25, 1, 224, 101, 25, 1, 218, 251, 25, + 1, 219, 239, 25, 1, 203, 1, 25, 1, 223, 223, 25, 1, 203, 23, 25, 1, 215, + 189, 25, 1, 208, 227, 25, 1, 235, 235, 25, 1, 223, 226, 25, 1, 224, 2, + 25, 38, 117, 223, 235, 25, 38, 117, 201, 25, 25, 216, 161, 25, 234, 217, + 204, 226, 25, 244, 168, 25, 244, 159, 25, 207, 105, 25, 211, 79, 78, 73, + 1, 245, 61, 152, 196, 13, 212, 171, 73, 1, 245, 61, 152, 196, 96, 212, + 171, 73, 1, 245, 61, 152, 196, 13, 207, 23, 73, 1, 245, 61, 152, 196, 96, + 207, 23, 73, 1, 245, 61, 152, 196, 13, 211, 97, 73, 1, 245, 61, 152, 196, + 96, 211, 97, 73, 1, 245, 61, 152, 196, 13, 209, 140, 73, 1, 245, 61, 152, + 196, 96, 209, 140, 73, 1, 236, 74, 237, 250, 152, 154, 73, 1, 130, 237, + 250, 152, 154, 73, 1, 219, 65, 237, 250, 152, 154, 73, 1, 126, 237, 250, + 152, 154, 73, 1, 236, 73, 237, 250, 152, 154, 73, 1, 236, 74, 237, 250, + 222, 176, 152, 154, 73, 1, 130, 237, 250, 222, 176, 152, 154, 73, 1, 219, + 65, 237, 250, 222, 176, 152, 154, 73, 1, 126, 237, 250, 222, 176, 152, + 154, 73, 1, 236, 73, 237, 250, 222, 176, 152, 154, 73, 1, 236, 74, 222, + 176, 152, 154, 73, 1, 130, 222, 176, 152, 154, 73, 1, 219, 65, 222, 176, + 152, 154, 73, 1, 126, 222, 176, 152, 154, 73, 1, 236, 73, 222, 176, 152, + 154, 73, 1, 76, 83, 154, 73, 1, 76, 205, 248, 73, 1, 76, 231, 155, 154, + 73, 1, 221, 203, 53, 241, 102, 251, 90, 73, 1, 210, 215, 124, 51, 73, 1, + 210, 215, 135, 51, 73, 1, 210, 215, 236, 90, 78, 73, 1, 210, 215, 226, + 17, 236, 90, 78, 73, 1, 126, 226, 17, 236, 90, 78, 73, 1, 204, 206, 26, + 130, 202, 11, 73, 1, 204, 206, 26, 126, 202, 11, 8, 6, 1, 237, 42, 251, + 164, 8, 4, 1, 237, 42, 251, 164, 8, 6, 1, 237, 42, 251, 194, 8, 4, 1, + 237, 42, 251, 194, 8, 6, 1, 232, 99, 8, 4, 1, 232, 99, 8, 6, 1, 200, 187, 8, 4, 1, 200, 187, 8, 6, 1, 201, 184, 8, 4, 1, 201, 184, 8, 6, 1, 241, - 37, 8, 4, 1, 241, 37, 8, 6, 1, 241, 38, 3, 244, 158, 8, 4, 1, 241, 38, 3, - 244, 158, 8, 1, 4, 6, 236, 48, 8, 1, 4, 6, 209, 80, 8, 6, 1, 252, 167, 8, - 4, 1, 252, 167, 8, 6, 1, 251, 48, 8, 4, 1, 251, 48, 8, 6, 1, 250, 149, 8, - 4, 1, 250, 149, 8, 6, 1, 250, 132, 8, 4, 1, 250, 132, 8, 6, 1, 250, 133, - 3, 231, 154, 154, 8, 4, 1, 250, 133, 3, 231, 154, 154, 8, 6, 1, 250, 121, - 8, 4, 1, 250, 121, 8, 6, 1, 210, 89, 247, 207, 3, 238, 252, 8, 4, 1, 210, - 89, 247, 207, 3, 238, 252, 8, 6, 1, 225, 80, 3, 106, 8, 4, 1, 225, 80, 3, - 106, 8, 6, 1, 225, 80, 3, 239, 146, 106, 8, 4, 1, 225, 80, 3, 239, 146, - 106, 8, 6, 1, 225, 80, 3, 204, 196, 26, 239, 146, 106, 8, 4, 1, 225, 80, - 3, 204, 196, 26, 239, 146, 106, 8, 6, 1, 248, 32, 159, 8, 4, 1, 248, 32, - 159, 8, 6, 1, 223, 99, 3, 130, 106, 8, 4, 1, 223, 99, 3, 130, 106, 8, 6, - 1, 177, 3, 181, 204, 196, 214, 19, 8, 4, 1, 177, 3, 181, 204, 196, 214, - 19, 8, 6, 1, 177, 3, 221, 224, 8, 4, 1, 177, 3, 221, 224, 8, 6, 1, 214, - 101, 8, 4, 1, 214, 101, 8, 6, 1, 214, 3, 3, 204, 196, 202, 145, 239, 194, - 8, 4, 1, 214, 3, 3, 204, 196, 202, 145, 239, 194, 8, 6, 1, 214, 3, 3, - 235, 63, 8, 4, 1, 214, 3, 3, 235, 63, 8, 6, 1, 214, 3, 3, 205, 86, 203, - 135, 8, 4, 1, 214, 3, 3, 205, 86, 203, 135, 8, 6, 1, 211, 167, 3, 204, - 196, 202, 145, 239, 194, 8, 4, 1, 211, 167, 3, 204, 196, 202, 145, 239, - 194, 8, 6, 1, 211, 167, 3, 239, 146, 106, 8, 4, 1, 211, 167, 3, 239, 146, - 106, 8, 6, 1, 211, 31, 209, 188, 8, 4, 1, 211, 31, 209, 188, 8, 6, 1, - 209, 121, 209, 188, 8, 4, 1, 209, 121, 209, 188, 8, 6, 1, 199, 231, 3, - 239, 146, 106, 8, 4, 1, 199, 231, 3, 239, 146, 106, 8, 6, 1, 197, 207, 8, + 38, 8, 4, 1, 241, 38, 8, 6, 1, 241, 39, 3, 244, 159, 8, 4, 1, 241, 39, 3, + 244, 159, 8, 1, 4, 6, 236, 49, 8, 1, 4, 6, 209, 80, 8, 6, 1, 252, 168, 8, + 4, 1, 252, 168, 8, 6, 1, 251, 49, 8, 4, 1, 251, 49, 8, 6, 1, 250, 150, 8, + 4, 1, 250, 150, 8, 6, 1, 250, 133, 8, 4, 1, 250, 133, 8, 6, 1, 250, 134, + 3, 231, 155, 154, 8, 4, 1, 250, 134, 3, 231, 155, 154, 8, 6, 1, 250, 122, + 8, 4, 1, 250, 122, 8, 6, 1, 210, 89, 247, 208, 3, 238, 253, 8, 4, 1, 210, + 89, 247, 208, 3, 238, 253, 8, 6, 1, 225, 81, 3, 106, 8, 4, 1, 225, 81, 3, + 106, 8, 6, 1, 225, 81, 3, 239, 147, 106, 8, 4, 1, 225, 81, 3, 239, 147, + 106, 8, 6, 1, 225, 81, 3, 204, 196, 26, 239, 147, 106, 8, 4, 1, 225, 81, + 3, 204, 196, 26, 239, 147, 106, 8, 6, 1, 248, 33, 159, 8, 4, 1, 248, 33, + 159, 8, 6, 1, 223, 100, 3, 130, 106, 8, 4, 1, 223, 100, 3, 130, 106, 8, + 6, 1, 177, 3, 181, 204, 196, 214, 20, 8, 4, 1, 177, 3, 181, 204, 196, + 214, 20, 8, 6, 1, 177, 3, 221, 225, 8, 4, 1, 177, 3, 221, 225, 8, 6, 1, + 214, 102, 8, 4, 1, 214, 102, 8, 6, 1, 214, 4, 3, 204, 196, 202, 145, 239, + 195, 8, 4, 1, 214, 4, 3, 204, 196, 202, 145, 239, 195, 8, 6, 1, 214, 4, + 3, 235, 64, 8, 4, 1, 214, 4, 3, 235, 64, 8, 6, 1, 214, 4, 3, 205, 86, + 203, 135, 8, 4, 1, 214, 4, 3, 205, 86, 203, 135, 8, 6, 1, 211, 168, 3, + 204, 196, 202, 145, 239, 195, 8, 4, 1, 211, 168, 3, 204, 196, 202, 145, + 239, 195, 8, 6, 1, 211, 168, 3, 239, 147, 106, 8, 4, 1, 211, 168, 3, 239, + 147, 106, 8, 6, 1, 211, 32, 209, 188, 8, 4, 1, 211, 32, 209, 188, 8, 6, + 1, 209, 121, 209, 188, 8, 4, 1, 209, 121, 209, 188, 8, 6, 1, 199, 231, 3, + 239, 147, 106, 8, 4, 1, 199, 231, 3, 239, 147, 106, 8, 6, 1, 197, 207, 8, 4, 1, 197, 207, 8, 6, 1, 199, 0, 195, 158, 8, 4, 1, 199, 0, 195, 158, 8, 6, 1, 202, 163, 3, 106, 8, 4, 1, 202, 163, 3, 106, 8, 6, 1, 202, 163, 3, - 204, 196, 202, 145, 239, 194, 8, 4, 1, 202, 163, 3, 204, 196, 202, 145, - 239, 194, 8, 6, 1, 199, 107, 8, 4, 1, 199, 107, 8, 6, 1, 236, 127, 8, 4, - 1, 236, 127, 8, 6, 1, 225, 247, 8, 4, 1, 225, 247, 8, 6, 1, 241, 154, 8, - 4, 1, 241, 154, 73, 1, 200, 4, 8, 4, 1, 237, 189, 8, 4, 1, 221, 173, 8, - 4, 1, 218, 113, 8, 4, 1, 215, 144, 8, 4, 1, 209, 120, 8, 1, 4, 6, 209, - 120, 8, 4, 1, 201, 22, 8, 4, 1, 200, 79, 8, 6, 1, 226, 38, 240, 230, 8, - 4, 1, 226, 38, 240, 230, 8, 6, 1, 226, 38, 236, 48, 8, 4, 1, 226, 38, - 236, 48, 8, 6, 1, 226, 38, 234, 189, 8, 6, 1, 163, 226, 38, 234, 189, 8, - 4, 1, 163, 226, 38, 234, 189, 8, 6, 1, 163, 159, 8, 4, 1, 163, 159, 8, 6, - 1, 226, 38, 144, 8, 4, 1, 226, 38, 144, 8, 6, 1, 226, 38, 209, 80, 8, 4, - 1, 226, 38, 209, 80, 8, 6, 1, 226, 38, 203, 216, 8, 4, 1, 226, 38, 203, - 216, 73, 1, 126, 244, 240, 252, 21, 73, 1, 244, 167, 73, 1, 206, 182, - 236, 171, 55, 8, 6, 1, 208, 231, 8, 4, 1, 208, 231, 8, 6, 1, 163, 233, - 14, 8, 4, 1, 223, 99, 3, 210, 95, 231, 164, 26, 248, 224, 8, 1, 206, 55, - 238, 252, 8, 6, 1, 218, 55, 3, 239, 194, 8, 4, 1, 218, 55, 3, 239, 194, - 8, 6, 1, 247, 207, 3, 154, 8, 4, 1, 247, 207, 3, 154, 8, 4, 1, 247, 207, - 3, 213, 214, 122, 8, 4, 1, 233, 15, 3, 213, 214, 122, 8, 6, 1, 74, 3, - 235, 63, 8, 4, 1, 74, 3, 235, 63, 8, 6, 1, 236, 49, 3, 106, 8, 4, 1, 236, - 49, 3, 106, 8, 6, 1, 198, 240, 251, 244, 8, 4, 1, 198, 240, 251, 244, 8, - 6, 1, 198, 240, 214, 163, 8, 4, 1, 198, 240, 214, 163, 8, 6, 1, 198, 240, - 200, 99, 8, 4, 1, 198, 240, 200, 99, 8, 6, 1, 234, 190, 3, 214, 181, 106, - 8, 4, 1, 234, 190, 3, 214, 181, 106, 8, 6, 1, 225, 80, 3, 214, 181, 106, - 8, 4, 1, 225, 80, 3, 214, 181, 106, 8, 6, 1, 218, 55, 3, 214, 181, 106, - 8, 4, 1, 218, 55, 3, 214, 181, 106, 8, 6, 1, 211, 31, 3, 214, 181, 106, - 8, 4, 1, 211, 31, 3, 214, 181, 106, 8, 6, 1, 209, 81, 3, 214, 181, 106, - 8, 4, 1, 209, 81, 3, 214, 181, 106, 8, 6, 1, 233, 15, 3, 122, 8, 6, 1, - 210, 89, 192, 69, 8, 6, 1, 145, 234, 189, 8, 6, 1, 223, 99, 3, 248, 224, - 8, 6, 1, 4, 6, 68, 8, 1, 4, 6, 211, 166, 8, 6, 1, 163, 225, 79, 8, 6, 1, - 163, 203, 216, 8, 6, 1, 225, 217, 3, 241, 56, 8, 6, 1, 245, 74, 8, 6, 1, - 248, 205, 8, 4, 1, 248, 205, 8, 6, 1, 214, 123, 8, 4, 1, 214, 123, 8, 6, - 1, 118, 3, 106, 8, 4, 1, 118, 3, 106, 8, 6, 1, 233, 151, 63, 8, 4, 1, - 233, 151, 63, 8, 6, 1, 233, 151, 68, 8, 4, 1, 233, 151, 68, 8, 6, 1, 233, - 151, 66, 8, 4, 1, 233, 151, 66, 8, 6, 1, 251, 86, 197, 199, 8, 4, 1, 251, - 86, 197, 199, 8, 6, 1, 247, 207, 3, 213, 214, 122, 8, 6, 1, 209, 81, 3, - 122, 8, 6, 1, 195, 159, 3, 213, 214, 122, 8, 236, 176, 1, 206, 96, 68, - 73, 1, 6, 233, 15, 3, 106, 73, 1, 4, 33, 214, 163, 8, 1, 4, 6, 163, 221, - 135, 8, 236, 176, 1, 210, 89, 236, 48, 8, 236, 176, 1, 210, 89, 214, 2, - 8, 236, 176, 1, 226, 16, 221, 135, 8, 236, 176, 1, 230, 248, 221, 230, 8, - 236, 176, 1, 250, 250, 221, 135, 204, 41, 217, 231, 1, 63, 204, 41, 217, - 231, 1, 68, 204, 41, 217, 231, 2, 237, 167, 204, 41, 217, 231, 1, 66, - 204, 41, 217, 231, 1, 69, 204, 41, 217, 231, 1, 72, 204, 41, 217, 231, 2, - 232, 166, 204, 41, 217, 231, 1, 224, 10, 204, 41, 217, 231, 1, 224, 116, - 204, 41, 217, 231, 1, 233, 143, 204, 41, 217, 231, 1, 233, 201, 204, 41, - 217, 231, 2, 251, 50, 204, 41, 217, 231, 1, 244, 181, 204, 41, 217, 231, - 1, 245, 48, 204, 41, 217, 231, 1, 225, 128, 204, 41, 217, 231, 1, 225, - 173, 204, 41, 217, 231, 1, 201, 55, 204, 41, 217, 231, 1, 201, 61, 204, - 41, 217, 231, 1, 240, 10, 204, 41, 217, 231, 1, 240, 19, 204, 41, 217, - 231, 1, 149, 204, 41, 217, 231, 1, 202, 169, 204, 41, 217, 231, 1, 239, - 27, 204, 41, 217, 231, 1, 239, 155, 204, 41, 217, 231, 1, 216, 49, 204, - 41, 217, 231, 1, 212, 116, 204, 41, 217, 231, 1, 212, 233, 204, 41, 217, - 231, 1, 248, 115, 204, 41, 217, 231, 1, 248, 187, 204, 41, 217, 231, 1, - 218, 250, 204, 41, 217, 231, 1, 209, 232, 204, 41, 217, 231, 1, 222, 6, - 204, 41, 217, 231, 1, 209, 167, 204, 41, 217, 231, 1, 205, 200, 204, 41, - 217, 231, 1, 231, 192, 204, 41, 217, 231, 18, 2, 63, 204, 41, 217, 231, - 18, 2, 68, 204, 41, 217, 231, 18, 2, 66, 204, 41, 217, 231, 18, 2, 69, - 204, 41, 217, 231, 18, 2, 214, 101, 204, 41, 217, 231, 212, 111, 220, 27, - 204, 41, 217, 231, 212, 111, 220, 26, 204, 41, 217, 231, 212, 111, 220, - 25, 204, 41, 217, 231, 212, 111, 220, 24, 173, 226, 69, 191, 97, 211, 86, - 173, 226, 69, 191, 97, 232, 224, 173, 226, 69, 191, 115, 211, 84, 173, - 226, 69, 191, 97, 206, 21, 173, 226, 69, 191, 97, 237, 25, 173, 226, 69, - 191, 115, 206, 18, 173, 226, 69, 211, 87, 78, 173, 226, 69, 212, 147, 78, - 173, 226, 69, 209, 108, 78, 173, 226, 69, 211, 88, 78, 213, 1, 1, 155, - 213, 1, 1, 224, 145, 213, 1, 1, 234, 122, 213, 1, 1, 217, 70, 213, 1, 1, - 247, 173, 213, 1, 1, 247, 15, 213, 1, 1, 225, 213, 213, 1, 1, 215, 108, - 213, 1, 1, 189, 213, 1, 1, 202, 233, 213, 1, 1, 240, 135, 213, 1, 1, 176, - 213, 1, 1, 161, 213, 1, 1, 213, 5, 213, 1, 1, 249, 144, 213, 1, 1, 166, - 213, 1, 1, 201, 113, 213, 1, 1, 201, 103, 213, 1, 1, 237, 155, 213, 1, 1, - 197, 166, 213, 1, 1, 195, 74, 213, 1, 1, 195, 115, 213, 1, 1, 4, 63, 213, - 1, 1, 164, 213, 1, 1, 169, 213, 1, 1, 172, 213, 1, 1, 207, 50, 213, 1, 1, - 183, 213, 1, 1, 142, 213, 1, 1, 63, 213, 1, 1, 68, 213, 1, 1, 66, 213, 1, - 1, 69, 213, 1, 1, 72, 213, 1, 1, 211, 158, 213, 1, 1, 196, 208, 213, 1, - 1, 235, 238, 213, 1, 1, 234, 9, 213, 1, 1, 237, 53, 213, 1, 204, 152, 1, - 197, 166, 213, 1, 204, 152, 1, 164, 213, 1, 1, 201, 78, 213, 1, 1, 201, - 66, 213, 1, 1, 240, 40, 213, 1, 1, 216, 85, 213, 1, 1, 251, 130, 164, - 213, 1, 1, 198, 243, 207, 50, 213, 1, 1, 198, 244, 142, 213, 1, 1, 250, - 185, 235, 238, 213, 1, 204, 152, 1, 169, 213, 1, 204, 98, 1, 169, 213, 1, - 1, 247, 132, 213, 1, 206, 62, 232, 137, 78, 213, 1, 52, 232, 137, 78, - 213, 1, 117, 207, 42, 213, 1, 117, 52, 207, 42, 208, 188, 2, 251, 50, - 208, 188, 2, 199, 2, 208, 188, 1, 63, 208, 188, 1, 252, 167, 208, 188, 1, - 68, 208, 188, 1, 226, 119, 208, 188, 1, 66, 208, 188, 1, 199, 245, 208, + 204, 196, 202, 145, 239, 195, 8, 4, 1, 202, 163, 3, 204, 196, 202, 145, + 239, 195, 8, 6, 1, 199, 107, 8, 4, 1, 199, 107, 8, 6, 1, 236, 128, 8, 4, + 1, 236, 128, 8, 6, 1, 225, 248, 8, 4, 1, 225, 248, 8, 6, 1, 241, 155, 8, + 4, 1, 241, 155, 73, 1, 200, 4, 8, 4, 1, 237, 190, 8, 4, 1, 221, 174, 8, + 4, 1, 218, 114, 8, 4, 1, 215, 145, 8, 4, 1, 209, 120, 8, 1, 4, 6, 209, + 120, 8, 4, 1, 201, 22, 8, 4, 1, 200, 79, 8, 6, 1, 226, 39, 240, 231, 8, + 4, 1, 226, 39, 240, 231, 8, 6, 1, 226, 39, 236, 49, 8, 4, 1, 226, 39, + 236, 49, 8, 6, 1, 226, 39, 234, 190, 8, 6, 1, 163, 226, 39, 234, 190, 8, + 4, 1, 163, 226, 39, 234, 190, 8, 6, 1, 163, 159, 8, 4, 1, 163, 159, 8, 6, + 1, 226, 39, 144, 8, 4, 1, 226, 39, 144, 8, 6, 1, 226, 39, 209, 80, 8, 4, + 1, 226, 39, 209, 80, 8, 6, 1, 226, 39, 203, 216, 8, 4, 1, 226, 39, 203, + 216, 73, 1, 126, 244, 241, 252, 22, 73, 1, 244, 168, 73, 1, 206, 182, + 236, 172, 55, 8, 6, 1, 208, 231, 8, 4, 1, 208, 231, 8, 6, 1, 163, 233, + 15, 8, 4, 1, 223, 100, 3, 210, 95, 231, 165, 26, 248, 225, 8, 1, 206, 55, + 238, 253, 8, 6, 1, 218, 56, 3, 239, 195, 8, 4, 1, 218, 56, 3, 239, 195, + 8, 6, 1, 247, 208, 3, 154, 8, 4, 1, 247, 208, 3, 154, 8, 4, 1, 247, 208, + 3, 213, 215, 122, 8, 4, 1, 233, 16, 3, 213, 215, 122, 8, 6, 1, 74, 3, + 235, 64, 8, 4, 1, 74, 3, 235, 64, 8, 6, 1, 236, 50, 3, 106, 8, 4, 1, 236, + 50, 3, 106, 8, 6, 1, 198, 240, 251, 245, 8, 4, 1, 198, 240, 251, 245, 8, + 6, 1, 198, 240, 214, 164, 8, 4, 1, 198, 240, 214, 164, 8, 6, 1, 198, 240, + 200, 99, 8, 4, 1, 198, 240, 200, 99, 8, 6, 1, 234, 191, 3, 214, 182, 106, + 8, 4, 1, 234, 191, 3, 214, 182, 106, 8, 6, 1, 225, 81, 3, 214, 182, 106, + 8, 4, 1, 225, 81, 3, 214, 182, 106, 8, 6, 1, 218, 56, 3, 214, 182, 106, + 8, 4, 1, 218, 56, 3, 214, 182, 106, 8, 6, 1, 211, 32, 3, 214, 182, 106, + 8, 4, 1, 211, 32, 3, 214, 182, 106, 8, 6, 1, 209, 81, 3, 214, 182, 106, + 8, 4, 1, 209, 81, 3, 214, 182, 106, 8, 6, 1, 233, 16, 3, 122, 8, 6, 1, + 210, 89, 192, 69, 8, 6, 1, 145, 234, 190, 8, 6, 1, 223, 100, 3, 248, 225, + 8, 6, 1, 4, 6, 68, 8, 1, 4, 6, 211, 167, 8, 6, 1, 163, 225, 80, 8, 6, 1, + 163, 203, 216, 8, 6, 1, 225, 218, 3, 241, 57, 8, 6, 1, 245, 75, 8, 6, 1, + 248, 206, 8, 4, 1, 248, 206, 8, 6, 1, 214, 124, 8, 4, 1, 214, 124, 8, 6, + 1, 118, 3, 106, 8, 4, 1, 118, 3, 106, 8, 6, 1, 233, 152, 63, 8, 4, 1, + 233, 152, 63, 8, 6, 1, 233, 152, 68, 8, 4, 1, 233, 152, 68, 8, 6, 1, 233, + 152, 66, 8, 4, 1, 233, 152, 66, 8, 6, 1, 251, 87, 197, 199, 8, 4, 1, 251, + 87, 197, 199, 8, 6, 1, 247, 208, 3, 213, 215, 122, 8, 6, 1, 209, 81, 3, + 122, 8, 6, 1, 195, 159, 3, 213, 215, 122, 8, 236, 177, 1, 206, 96, 68, + 73, 1, 6, 233, 16, 3, 106, 73, 1, 4, 33, 214, 164, 8, 1, 4, 6, 163, 221, + 136, 8, 236, 177, 1, 210, 89, 236, 49, 8, 236, 177, 1, 210, 89, 214, 3, + 8, 236, 177, 1, 226, 17, 221, 136, 8, 236, 177, 1, 230, 249, 221, 231, 8, + 236, 177, 1, 250, 251, 221, 136, 204, 41, 217, 232, 1, 63, 204, 41, 217, + 232, 1, 68, 204, 41, 217, 232, 2, 237, 168, 204, 41, 217, 232, 1, 66, + 204, 41, 217, 232, 1, 69, 204, 41, 217, 232, 1, 72, 204, 41, 217, 232, 2, + 232, 167, 204, 41, 217, 232, 1, 224, 11, 204, 41, 217, 232, 1, 224, 117, + 204, 41, 217, 232, 1, 233, 144, 204, 41, 217, 232, 1, 233, 202, 204, 41, + 217, 232, 2, 251, 51, 204, 41, 217, 232, 1, 244, 182, 204, 41, 217, 232, + 1, 245, 49, 204, 41, 217, 232, 1, 225, 129, 204, 41, 217, 232, 1, 225, + 174, 204, 41, 217, 232, 1, 201, 55, 204, 41, 217, 232, 1, 201, 61, 204, + 41, 217, 232, 1, 240, 11, 204, 41, 217, 232, 1, 240, 20, 204, 41, 217, + 232, 1, 149, 204, 41, 217, 232, 1, 202, 169, 204, 41, 217, 232, 1, 239, + 28, 204, 41, 217, 232, 1, 239, 156, 204, 41, 217, 232, 1, 216, 50, 204, + 41, 217, 232, 1, 212, 117, 204, 41, 217, 232, 1, 212, 234, 204, 41, 217, + 232, 1, 248, 116, 204, 41, 217, 232, 1, 248, 188, 204, 41, 217, 232, 1, + 218, 251, 204, 41, 217, 232, 1, 209, 232, 204, 41, 217, 232, 1, 222, 7, + 204, 41, 217, 232, 1, 209, 167, 204, 41, 217, 232, 1, 205, 200, 204, 41, + 217, 232, 1, 231, 193, 204, 41, 217, 232, 18, 2, 63, 204, 41, 217, 232, + 18, 2, 68, 204, 41, 217, 232, 18, 2, 66, 204, 41, 217, 232, 18, 2, 69, + 204, 41, 217, 232, 18, 2, 214, 102, 204, 41, 217, 232, 212, 112, 220, 28, + 204, 41, 217, 232, 212, 112, 220, 27, 204, 41, 217, 232, 212, 112, 220, + 26, 204, 41, 217, 232, 212, 112, 220, 25, 173, 226, 70, 191, 97, 211, 87, + 173, 226, 70, 191, 97, 232, 225, 173, 226, 70, 191, 115, 211, 85, 173, + 226, 70, 191, 97, 206, 21, 173, 226, 70, 191, 97, 237, 26, 173, 226, 70, + 191, 115, 206, 18, 173, 226, 70, 211, 88, 78, 173, 226, 70, 212, 148, 78, + 173, 226, 70, 209, 108, 78, 173, 226, 70, 211, 89, 78, 213, 2, 1, 155, + 213, 2, 1, 224, 146, 213, 2, 1, 234, 123, 213, 2, 1, 217, 71, 213, 2, 1, + 247, 174, 213, 2, 1, 247, 16, 213, 2, 1, 225, 214, 213, 2, 1, 215, 109, + 213, 2, 1, 189, 213, 2, 1, 202, 233, 213, 2, 1, 240, 136, 213, 2, 1, 176, + 213, 2, 1, 161, 213, 2, 1, 213, 6, 213, 2, 1, 249, 145, 213, 2, 1, 166, + 213, 2, 1, 201, 113, 213, 2, 1, 201, 103, 213, 2, 1, 237, 156, 213, 2, 1, + 197, 166, 213, 2, 1, 195, 74, 213, 2, 1, 195, 115, 213, 2, 1, 4, 63, 213, + 2, 1, 164, 213, 2, 1, 169, 213, 2, 1, 172, 213, 2, 1, 207, 50, 213, 2, 1, + 183, 213, 2, 1, 142, 213, 2, 1, 63, 213, 2, 1, 68, 213, 2, 1, 66, 213, 2, + 1, 69, 213, 2, 1, 72, 213, 2, 1, 211, 159, 213, 2, 1, 196, 208, 213, 2, + 1, 235, 239, 213, 2, 1, 234, 10, 213, 2, 1, 237, 54, 213, 2, 204, 152, 1, + 197, 166, 213, 2, 204, 152, 1, 164, 213, 2, 1, 201, 78, 213, 2, 1, 201, + 66, 213, 2, 1, 240, 41, 213, 2, 1, 216, 86, 213, 2, 1, 251, 131, 164, + 213, 2, 1, 198, 243, 207, 50, 213, 2, 1, 198, 244, 142, 213, 2, 1, 250, + 186, 235, 239, 213, 2, 204, 152, 1, 169, 213, 2, 204, 98, 1, 169, 213, 2, + 1, 247, 133, 213, 2, 206, 62, 232, 138, 78, 213, 2, 52, 232, 138, 78, + 213, 2, 117, 207, 42, 213, 2, 117, 52, 207, 42, 208, 188, 2, 251, 51, + 208, 188, 2, 199, 2, 208, 188, 1, 63, 208, 188, 1, 252, 168, 208, 188, 1, + 68, 208, 188, 1, 226, 120, 208, 188, 1, 66, 208, 188, 1, 199, 245, 208, 188, 1, 110, 144, 208, 188, 1, 110, 209, 182, 208, 188, 1, 110, 159, 208, - 188, 1, 110, 222, 37, 208, 188, 1, 69, 208, 188, 1, 237, 53, 208, 188, 1, - 251, 199, 208, 188, 1, 72, 208, 188, 1, 214, 101, 208, 188, 1, 250, 149, - 208, 188, 1, 155, 208, 188, 1, 224, 145, 208, 188, 1, 234, 122, 208, 188, - 1, 233, 229, 208, 188, 1, 217, 70, 208, 188, 1, 247, 173, 208, 188, 1, - 247, 15, 208, 188, 1, 225, 213, 208, 188, 1, 225, 179, 208, 188, 1, 215, - 108, 208, 188, 1, 201, 78, 208, 188, 1, 201, 66, 208, 188, 1, 240, 40, - 208, 188, 1, 240, 24, 208, 188, 1, 216, 85, 208, 188, 1, 189, 208, 188, - 1, 202, 233, 208, 188, 1, 240, 135, 208, 188, 1, 239, 175, 208, 188, 1, - 176, 208, 188, 1, 161, 208, 188, 1, 213, 5, 208, 188, 1, 249, 144, 208, - 188, 1, 248, 196, 208, 188, 1, 166, 208, 188, 1, 164, 208, 188, 1, 169, + 188, 1, 110, 222, 38, 208, 188, 1, 69, 208, 188, 1, 237, 54, 208, 188, 1, + 251, 200, 208, 188, 1, 72, 208, 188, 1, 214, 102, 208, 188, 1, 250, 150, + 208, 188, 1, 155, 208, 188, 1, 224, 146, 208, 188, 1, 234, 123, 208, 188, + 1, 233, 230, 208, 188, 1, 217, 71, 208, 188, 1, 247, 174, 208, 188, 1, + 247, 16, 208, 188, 1, 225, 214, 208, 188, 1, 225, 180, 208, 188, 1, 215, + 109, 208, 188, 1, 201, 78, 208, 188, 1, 201, 66, 208, 188, 1, 240, 41, + 208, 188, 1, 240, 25, 208, 188, 1, 216, 86, 208, 188, 1, 189, 208, 188, + 1, 202, 233, 208, 188, 1, 240, 136, 208, 188, 1, 239, 176, 208, 188, 1, + 176, 208, 188, 1, 161, 208, 188, 1, 213, 6, 208, 188, 1, 249, 145, 208, + 188, 1, 248, 197, 208, 188, 1, 166, 208, 188, 1, 164, 208, 188, 1, 169, 208, 188, 1, 172, 208, 188, 1, 199, 152, 208, 188, 1, 207, 50, 208, 188, - 1, 205, 80, 208, 188, 1, 183, 208, 188, 1, 142, 208, 188, 1, 222, 36, - 208, 188, 108, 2, 232, 243, 208, 188, 18, 2, 252, 167, 208, 188, 18, 2, - 68, 208, 188, 18, 2, 226, 119, 208, 188, 18, 2, 66, 208, 188, 18, 2, 199, + 1, 205, 80, 208, 188, 1, 183, 208, 188, 1, 142, 208, 188, 1, 222, 37, + 208, 188, 108, 2, 232, 244, 208, 188, 18, 2, 252, 168, 208, 188, 18, 2, + 68, 208, 188, 18, 2, 226, 120, 208, 188, 18, 2, 66, 208, 188, 18, 2, 199, 245, 208, 188, 18, 2, 110, 144, 208, 188, 18, 2, 110, 209, 182, 208, 188, - 18, 2, 110, 159, 208, 188, 18, 2, 110, 222, 37, 208, 188, 18, 2, 69, 208, - 188, 18, 2, 237, 53, 208, 188, 18, 2, 251, 199, 208, 188, 18, 2, 72, 208, - 188, 18, 2, 214, 101, 208, 188, 18, 2, 250, 149, 208, 188, 2, 199, 7, - 208, 188, 2, 247, 132, 208, 188, 240, 87, 208, 188, 52, 240, 87, 208, + 18, 2, 110, 159, 208, 188, 18, 2, 110, 222, 38, 208, 188, 18, 2, 69, 208, + 188, 18, 2, 237, 54, 208, 188, 18, 2, 251, 200, 208, 188, 18, 2, 72, 208, + 188, 18, 2, 214, 102, 208, 188, 18, 2, 250, 150, 208, 188, 2, 199, 7, + 208, 188, 2, 247, 133, 208, 188, 240, 88, 208, 188, 52, 240, 88, 208, 188, 17, 195, 79, 208, 188, 17, 100, 208, 188, 17, 102, 208, 188, 17, 134, 208, 188, 17, 136, 208, 188, 17, 146, 208, 188, 17, 167, 208, 188, 17, 178, 208, 188, 17, 171, 208, 188, 17, 182, 38, 101, 17, 195, 79, 38, @@ -12708,3771 +12709,3774 @@ static const unsigned char phrasebook[] = { 101, 17, 146, 38, 101, 17, 167, 38, 101, 17, 178, 38, 101, 17, 171, 38, 101, 17, 182, 38, 101, 1, 63, 38, 101, 1, 66, 38, 101, 1, 155, 38, 101, 1, 176, 38, 101, 1, 161, 38, 101, 1, 169, 38, 101, 1, 199, 34, 38, 101, - 2, 250, 131, 101, 2, 205, 147, 247, 132, 101, 2, 247, 133, 199, 7, 101, - 2, 52, 247, 133, 199, 7, 101, 2, 247, 133, 102, 101, 2, 247, 133, 134, - 101, 2, 247, 133, 250, 131, 101, 2, 211, 195, 101, 234, 86, 235, 133, - 101, 247, 109, 101, 232, 129, 101, 2, 206, 100, 101, 225, 205, 214, 126, - 101, 1, 250, 121, 101, 18, 2, 250, 121, 224, 214, 222, 109, 17, 195, 79, - 224, 214, 222, 109, 17, 100, 224, 214, 222, 109, 17, 102, 224, 214, 222, - 109, 17, 134, 224, 214, 222, 109, 17, 136, 224, 214, 222, 109, 17, 146, - 224, 214, 222, 109, 17, 167, 224, 214, 222, 109, 17, 178, 224, 214, 222, - 109, 17, 171, 224, 214, 222, 109, 17, 182, 224, 214, 222, 109, 1, 155, - 224, 214, 222, 109, 1, 224, 145, 224, 214, 222, 109, 1, 234, 122, 224, - 214, 222, 109, 1, 217, 70, 224, 214, 222, 109, 1, 183, 224, 214, 222, - 109, 1, 207, 50, 224, 214, 222, 109, 1, 195, 115, 224, 214, 222, 109, 1, - 215, 108, 224, 214, 222, 109, 1, 189, 224, 214, 222, 109, 1, 231, 78, - 224, 214, 222, 109, 1, 176, 224, 214, 222, 109, 1, 161, 224, 214, 222, - 109, 1, 213, 5, 224, 214, 222, 109, 1, 166, 224, 214, 222, 109, 1, 240, - 135, 224, 214, 222, 109, 1, 249, 144, 224, 214, 222, 109, 1, 169, 224, - 214, 222, 109, 1, 164, 224, 214, 222, 109, 1, 172, 224, 214, 222, 109, 1, - 197, 166, 224, 214, 222, 109, 1, 202, 233, 224, 214, 222, 109, 1, 142, - 224, 214, 222, 109, 1, 199, 152, 224, 214, 222, 109, 1, 247, 173, 224, - 214, 222, 109, 1, 63, 224, 214, 222, 109, 1, 214, 163, 224, 214, 222, - 109, 1, 68, 224, 214, 222, 109, 1, 214, 101, 224, 214, 222, 109, 18, 200, - 99, 224, 214, 222, 109, 18, 69, 224, 214, 222, 109, 18, 66, 224, 214, - 222, 109, 18, 237, 53, 224, 214, 222, 109, 18, 72, 224, 214, 222, 109, - 152, 212, 132, 224, 214, 222, 109, 152, 247, 148, 224, 214, 222, 109, - 152, 247, 149, 212, 132, 224, 214, 222, 109, 2, 240, 249, 224, 214, 222, - 109, 2, 206, 120, 210, 138, 1, 155, 210, 138, 1, 234, 122, 210, 138, 1, - 217, 70, 210, 138, 1, 189, 210, 138, 1, 240, 135, 210, 138, 1, 176, 210, - 138, 1, 161, 210, 138, 1, 249, 144, 210, 138, 1, 166, 210, 138, 1, 247, - 173, 210, 138, 1, 225, 213, 210, 138, 1, 215, 108, 210, 138, 1, 183, 210, + 2, 250, 132, 101, 2, 205, 147, 247, 133, 101, 2, 247, 134, 199, 7, 101, + 2, 52, 247, 134, 199, 7, 101, 2, 247, 134, 102, 101, 2, 247, 134, 134, + 101, 2, 247, 134, 250, 132, 101, 2, 211, 196, 101, 234, 87, 235, 134, + 101, 247, 110, 101, 232, 130, 101, 2, 206, 100, 101, 225, 206, 214, 127, + 101, 1, 250, 122, 101, 18, 2, 250, 122, 224, 215, 222, 110, 17, 195, 79, + 224, 215, 222, 110, 17, 100, 224, 215, 222, 110, 17, 102, 224, 215, 222, + 110, 17, 134, 224, 215, 222, 110, 17, 136, 224, 215, 222, 110, 17, 146, + 224, 215, 222, 110, 17, 167, 224, 215, 222, 110, 17, 178, 224, 215, 222, + 110, 17, 171, 224, 215, 222, 110, 17, 182, 224, 215, 222, 110, 1, 155, + 224, 215, 222, 110, 1, 224, 146, 224, 215, 222, 110, 1, 234, 123, 224, + 215, 222, 110, 1, 217, 71, 224, 215, 222, 110, 1, 183, 224, 215, 222, + 110, 1, 207, 50, 224, 215, 222, 110, 1, 195, 115, 224, 215, 222, 110, 1, + 215, 109, 224, 215, 222, 110, 1, 189, 224, 215, 222, 110, 1, 231, 79, + 224, 215, 222, 110, 1, 176, 224, 215, 222, 110, 1, 161, 224, 215, 222, + 110, 1, 213, 6, 224, 215, 222, 110, 1, 166, 224, 215, 222, 110, 1, 240, + 136, 224, 215, 222, 110, 1, 249, 145, 224, 215, 222, 110, 1, 169, 224, + 215, 222, 110, 1, 164, 224, 215, 222, 110, 1, 172, 224, 215, 222, 110, 1, + 197, 166, 224, 215, 222, 110, 1, 202, 233, 224, 215, 222, 110, 1, 142, + 224, 215, 222, 110, 1, 199, 152, 224, 215, 222, 110, 1, 247, 174, 224, + 215, 222, 110, 1, 63, 224, 215, 222, 110, 1, 214, 164, 224, 215, 222, + 110, 1, 68, 224, 215, 222, 110, 1, 214, 102, 224, 215, 222, 110, 18, 200, + 99, 224, 215, 222, 110, 18, 69, 224, 215, 222, 110, 18, 66, 224, 215, + 222, 110, 18, 237, 54, 224, 215, 222, 110, 18, 72, 224, 215, 222, 110, + 152, 212, 133, 224, 215, 222, 110, 152, 247, 149, 224, 215, 222, 110, + 152, 247, 150, 212, 133, 224, 215, 222, 110, 2, 240, 250, 224, 215, 222, + 110, 2, 206, 120, 210, 138, 1, 155, 210, 138, 1, 234, 123, 210, 138, 1, + 217, 71, 210, 138, 1, 189, 210, 138, 1, 240, 136, 210, 138, 1, 176, 210, + 138, 1, 161, 210, 138, 1, 249, 145, 210, 138, 1, 166, 210, 138, 1, 247, + 174, 210, 138, 1, 225, 214, 210, 138, 1, 215, 109, 210, 138, 1, 183, 210, 138, 1, 169, 210, 138, 1, 172, 210, 138, 1, 164, 210, 138, 1, 197, 166, - 210, 138, 1, 142, 210, 138, 1, 219, 240, 210, 138, 1, 217, 49, 210, 138, - 1, 217, 158, 210, 138, 1, 215, 73, 210, 138, 1, 63, 210, 138, 18, 2, 68, - 210, 138, 18, 2, 66, 210, 138, 18, 2, 69, 210, 138, 18, 2, 251, 199, 210, - 138, 18, 2, 72, 210, 138, 18, 2, 250, 149, 210, 138, 18, 2, 236, 115, - 210, 138, 18, 2, 237, 81, 210, 138, 108, 2, 217, 72, 210, 138, 108, 2, - 218, 54, 210, 138, 108, 2, 144, 210, 138, 108, 2, 233, 14, 210, 138, 199, + 210, 138, 1, 142, 210, 138, 1, 219, 241, 210, 138, 1, 217, 50, 210, 138, + 1, 217, 159, 210, 138, 1, 215, 74, 210, 138, 1, 63, 210, 138, 18, 2, 68, + 210, 138, 18, 2, 66, 210, 138, 18, 2, 69, 210, 138, 18, 2, 251, 200, 210, + 138, 18, 2, 72, 210, 138, 18, 2, 250, 150, 210, 138, 18, 2, 236, 116, + 210, 138, 18, 2, 237, 82, 210, 138, 108, 2, 217, 73, 210, 138, 108, 2, + 218, 55, 210, 138, 108, 2, 144, 210, 138, 108, 2, 233, 15, 210, 138, 199, 7, 210, 138, 208, 133, 78, 29, 137, 202, 93, 29, 137, 202, 92, 29, 137, 202, 90, 29, 137, 202, 95, 29, 137, 210, 49, 29, 137, 210, 33, 29, 137, 210, 28, 29, 137, 210, 30, 29, 137, 210, 46, 29, 137, 210, 39, 29, 137, 210, 32, 29, 137, 210, 51, 29, 137, 210, 34, 29, 137, 210, 53, 29, 137, - 210, 50, 29, 137, 219, 51, 29, 137, 219, 42, 29, 137, 219, 45, 29, 137, - 212, 190, 29, 137, 212, 201, 29, 137, 212, 202, 29, 137, 205, 64, 29, - 137, 226, 132, 29, 137, 226, 139, 29, 137, 205, 75, 29, 137, 205, 62, 29, - 137, 212, 242, 29, 137, 232, 49, 29, 137, 205, 59, 225, 198, 2, 213, 168, - 225, 198, 2, 247, 53, 225, 198, 2, 222, 204, 225, 198, 2, 197, 55, 225, - 198, 1, 63, 225, 198, 1, 230, 248, 224, 218, 225, 198, 1, 68, 225, 198, - 1, 226, 119, 225, 198, 1, 66, 225, 198, 1, 213, 243, 247, 23, 225, 198, - 1, 217, 71, 222, 162, 225, 198, 1, 217, 71, 222, 163, 210, 198, 225, 198, - 1, 69, 225, 198, 1, 251, 199, 225, 198, 1, 72, 225, 198, 1, 155, 225, - 198, 1, 225, 69, 208, 201, 225, 198, 1, 225, 69, 218, 98, 225, 198, 1, - 234, 122, 225, 198, 1, 234, 123, 218, 98, 225, 198, 1, 217, 70, 225, 198, - 1, 247, 173, 225, 198, 1, 247, 174, 218, 98, 225, 198, 1, 225, 213, 225, - 198, 1, 215, 109, 218, 98, 225, 198, 1, 225, 214, 220, 84, 225, 198, 1, - 215, 108, 225, 198, 1, 201, 78, 225, 198, 1, 201, 79, 220, 84, 225, 198, - 1, 240, 40, 225, 198, 1, 240, 41, 220, 84, 225, 198, 1, 218, 0, 218, 98, - 225, 198, 1, 189, 225, 198, 1, 203, 169, 218, 98, 225, 198, 1, 240, 135, - 225, 198, 1, 240, 136, 220, 84, 225, 198, 1, 176, 225, 198, 1, 161, 225, - 198, 1, 213, 243, 218, 98, 225, 198, 1, 249, 144, 225, 198, 1, 249, 145, - 218, 98, 225, 198, 1, 166, 225, 198, 1, 164, 225, 198, 1, 169, 225, 198, - 1, 210, 251, 251, 209, 225, 198, 1, 172, 225, 198, 1, 197, 166, 225, 198, - 1, 209, 23, 218, 98, 225, 198, 1, 209, 23, 220, 84, 225, 198, 1, 183, - 225, 198, 1, 142, 225, 198, 2, 247, 54, 203, 27, 225, 198, 18, 2, 203, - 97, 225, 198, 18, 2, 202, 16, 225, 198, 18, 2, 196, 237, 225, 198, 18, 2, - 196, 238, 219, 174, 225, 198, 18, 2, 204, 121, 225, 198, 18, 2, 204, 122, - 219, 162, 225, 198, 18, 2, 203, 121, 225, 198, 18, 2, 239, 81, 218, 97, - 225, 198, 18, 2, 213, 47, 225, 198, 108, 2, 224, 174, 225, 198, 108, 2, - 213, 61, 225, 198, 108, 2, 247, 158, 225, 198, 213, 181, 225, 198, 50, - 210, 111, 225, 198, 53, 210, 111, 225, 198, 213, 231, 251, 98, 225, 198, - 213, 231, 220, 104, 225, 198, 213, 231, 221, 177, 225, 198, 213, 231, - 197, 48, 225, 198, 213, 231, 213, 182, 225, 198, 213, 231, 222, 66, 225, - 198, 213, 231, 221, 171, 225, 198, 213, 231, 251, 255, 225, 198, 213, - 231, 252, 0, 251, 255, 225, 198, 213, 231, 212, 158, 225, 198, 163, 213, - 231, 212, 158, 225, 198, 213, 177, 225, 198, 17, 195, 79, 225, 198, 17, - 100, 225, 198, 17, 102, 225, 198, 17, 134, 225, 198, 17, 136, 225, 198, - 17, 146, 225, 198, 17, 167, 225, 198, 17, 178, 225, 198, 17, 171, 225, - 198, 17, 182, 225, 198, 213, 231, 202, 59, 201, 19, 225, 198, 213, 231, - 225, 243, 75, 1, 207, 25, 233, 229, 75, 1, 207, 25, 247, 15, 75, 1, 207, - 25, 225, 179, 75, 1, 207, 25, 216, 85, 75, 1, 207, 25, 248, 196, 75, 2, - 207, 25, 208, 185, 75, 73, 1, 207, 25, 210, 155, 75, 1, 49, 223, 52, 215, - 108, 75, 1, 49, 223, 52, 235, 238, 75, 1, 49, 223, 52, 234, 122, 75, 1, - 49, 223, 52, 233, 229, 75, 1, 49, 223, 52, 225, 213, 75, 1, 49, 223, 52, - 225, 179, 75, 1, 49, 223, 52, 240, 40, 75, 1, 49, 223, 52, 240, 24, 75, - 1, 49, 223, 52, 216, 85, 75, 49, 223, 52, 17, 195, 79, 75, 49, 223, 52, - 17, 100, 75, 49, 223, 52, 17, 102, 75, 49, 223, 52, 17, 134, 75, 49, 223, - 52, 17, 136, 75, 49, 223, 52, 17, 146, 75, 49, 223, 52, 17, 167, 75, 49, - 223, 52, 17, 178, 75, 49, 223, 52, 17, 171, 75, 49, 223, 52, 17, 182, 75, - 1, 49, 223, 52, 222, 36, 75, 1, 49, 223, 52, 240, 135, 75, 1, 49, 223, - 52, 239, 175, 75, 1, 49, 223, 52, 249, 144, 75, 1, 49, 223, 52, 248, 196, - 247, 8, 1, 63, 247, 8, 1, 68, 247, 8, 1, 66, 247, 8, 1, 69, 247, 8, 1, - 251, 199, 247, 8, 1, 72, 247, 8, 1, 155, 247, 8, 1, 224, 145, 247, 8, 1, - 234, 122, 247, 8, 1, 233, 229, 247, 8, 1, 216, 235, 247, 8, 1, 217, 70, - 247, 8, 1, 247, 15, 247, 8, 1, 245, 76, 247, 8, 1, 225, 213, 247, 8, 1, - 225, 179, 247, 8, 1, 216, 224, 247, 8, 1, 216, 226, 247, 8, 1, 216, 225, - 247, 8, 1, 189, 247, 8, 1, 202, 233, 247, 8, 1, 240, 135, 247, 8, 1, 239, - 175, 247, 8, 1, 215, 151, 247, 8, 1, 176, 247, 8, 1, 240, 40, 247, 8, 1, - 161, 247, 8, 1, 212, 53, 247, 8, 1, 213, 5, 247, 8, 1, 249, 144, 247, 8, - 1, 248, 196, 247, 8, 1, 218, 132, 247, 8, 1, 166, 247, 8, 1, 249, 44, - 247, 8, 1, 164, 247, 8, 1, 169, 247, 8, 1, 172, 247, 8, 1, 199, 152, 247, - 8, 1, 205, 80, 247, 8, 1, 183, 247, 8, 1, 142, 247, 8, 18, 2, 252, 167, - 247, 8, 18, 2, 68, 247, 8, 18, 2, 226, 119, 247, 8, 18, 2, 237, 32, 247, - 8, 18, 2, 66, 247, 8, 18, 2, 214, 163, 247, 8, 18, 2, 72, 247, 8, 18, 2, - 251, 199, 247, 8, 18, 2, 250, 149, 247, 8, 18, 2, 200, 99, 247, 8, 108, - 2, 164, 247, 8, 108, 2, 169, 247, 8, 108, 2, 172, 247, 8, 108, 2, 197, - 166, 247, 8, 1, 48, 225, 79, 247, 8, 1, 48, 234, 189, 247, 8, 1, 48, 217, - 72, 247, 8, 108, 2, 48, 217, 72, 247, 8, 1, 48, 247, 17, 247, 8, 1, 48, - 203, 216, 247, 8, 1, 48, 218, 54, 247, 8, 1, 48, 214, 2, 247, 8, 1, 48, - 196, 148, 247, 8, 1, 48, 144, 247, 8, 1, 48, 159, 247, 8, 1, 48, 205, 83, - 247, 8, 108, 2, 48, 221, 135, 247, 8, 108, 2, 48, 233, 14, 247, 8, 17, - 195, 79, 247, 8, 17, 100, 247, 8, 17, 102, 247, 8, 17, 134, 247, 8, 17, - 136, 247, 8, 17, 146, 247, 8, 17, 167, 247, 8, 17, 178, 247, 8, 17, 171, - 247, 8, 17, 182, 247, 8, 211, 213, 205, 120, 247, 8, 211, 213, 240, 87, - 247, 8, 211, 213, 52, 240, 87, 247, 8, 211, 213, 201, 165, 240, 87, 75, - 1, 224, 138, 234, 122, 75, 1, 224, 138, 247, 173, 75, 1, 224, 138, 247, - 15, 75, 1, 224, 138, 225, 213, 75, 1, 224, 138, 225, 179, 75, 1, 224, - 138, 215, 108, 75, 1, 224, 138, 201, 78, 75, 1, 224, 138, 201, 66, 75, 1, - 224, 138, 240, 40, 75, 1, 224, 138, 240, 24, 75, 1, 224, 138, 239, 175, - 75, 1, 224, 138, 176, 75, 1, 224, 138, 183, 75, 1, 224, 138, 142, 75, 1, - 224, 138, 232, 79, 75, 1, 224, 138, 235, 238, 75, 73, 1, 224, 138, 210, - 155, 75, 1, 224, 138, 196, 208, 75, 1, 224, 138, 195, 115, 75, 1, 224, - 138, 169, 75, 221, 247, 224, 138, 214, 186, 75, 221, 247, 224, 138, 211, - 109, 75, 221, 247, 224, 138, 231, 247, 75, 16, 251, 185, 236, 88, 75, 16, - 251, 185, 100, 75, 16, 251, 185, 102, 75, 1, 251, 185, 169, 75, 2, 213, - 164, 224, 247, 202, 11, 75, 2, 49, 223, 52, 202, 9, 75, 2, 49, 223, 52, - 202, 6, 75, 1, 206, 128, 213, 211, 247, 15, 75, 1, 206, 128, 213, 211, - 207, 50, 49, 199, 24, 1, 126, 224, 10, 49, 199, 24, 1, 130, 224, 10, 49, - 199, 24, 1, 126, 224, 116, 49, 199, 24, 1, 130, 224, 116, 49, 199, 24, 1, - 126, 224, 125, 49, 199, 24, 1, 130, 224, 125, 49, 199, 24, 1, 126, 233, - 143, 49, 199, 24, 1, 130, 233, 143, 49, 199, 24, 1, 126, 216, 251, 49, - 199, 24, 1, 130, 216, 251, 49, 199, 24, 1, 126, 244, 181, 49, 199, 24, 1, - 130, 244, 181, 49, 199, 24, 1, 126, 245, 48, 49, 199, 24, 1, 130, 245, - 48, 49, 199, 24, 1, 126, 205, 200, 49, 199, 24, 1, 130, 205, 200, 49, - 199, 24, 1, 126, 215, 72, 49, 199, 24, 1, 130, 215, 72, 49, 199, 24, 1, - 126, 239, 27, 49, 199, 24, 1, 130, 239, 27, 49, 199, 24, 1, 126, 149, 49, - 199, 24, 1, 130, 149, 49, 199, 24, 1, 126, 202, 169, 49, 199, 24, 1, 130, - 202, 169, 49, 199, 24, 1, 126, 216, 49, 49, 199, 24, 1, 130, 216, 49, 49, - 199, 24, 1, 126, 248, 115, 49, 199, 24, 1, 130, 248, 115, 49, 199, 24, 1, - 126, 212, 116, 49, 199, 24, 1, 130, 212, 116, 49, 199, 24, 1, 126, 212, - 233, 49, 199, 24, 1, 130, 212, 233, 49, 199, 24, 1, 126, 235, 50, 49, - 199, 24, 1, 130, 235, 50, 49, 199, 24, 1, 126, 218, 250, 49, 199, 24, 1, - 130, 218, 250, 49, 199, 24, 1, 126, 196, 3, 49, 199, 24, 1, 130, 196, 3, - 49, 199, 24, 1, 126, 209, 232, 49, 199, 24, 1, 130, 209, 232, 49, 199, - 24, 1, 126, 222, 6, 49, 199, 24, 1, 130, 222, 6, 49, 199, 24, 1, 126, - 198, 248, 49, 199, 24, 1, 130, 198, 248, 49, 199, 24, 1, 126, 231, 192, - 49, 199, 24, 1, 130, 231, 192, 49, 199, 24, 1, 126, 72, 49, 199, 24, 1, - 130, 72, 49, 199, 24, 220, 81, 225, 12, 49, 199, 24, 18, 252, 167, 49, - 199, 24, 18, 68, 49, 199, 24, 18, 200, 99, 49, 199, 24, 18, 66, 49, 199, - 24, 18, 69, 49, 199, 24, 18, 72, 49, 199, 24, 220, 81, 224, 119, 49, 199, - 24, 18, 230, 209, 49, 199, 24, 18, 200, 98, 49, 199, 24, 18, 200, 114, - 49, 199, 24, 18, 250, 147, 49, 199, 24, 18, 250, 121, 49, 199, 24, 18, - 251, 105, 49, 199, 24, 18, 251, 122, 49, 199, 24, 152, 220, 81, 237, 13, - 49, 199, 24, 152, 220, 81, 215, 150, 49, 199, 24, 152, 220, 81, 202, 169, - 49, 199, 24, 152, 220, 81, 205, 173, 49, 199, 24, 16, 223, 244, 49, 199, - 24, 16, 215, 150, 49, 199, 24, 16, 208, 229, 49, 199, 24, 16, 231, 193, - 231, 179, 49, 199, 24, 16, 223, 255, 223, 254, 219, 181, 219, 247, 1, 69, - 219, 181, 219, 247, 1, 72, 219, 181, 219, 247, 1, 247, 15, 219, 181, 219, - 247, 1, 215, 108, 219, 181, 219, 247, 1, 201, 78, 219, 181, 219, 247, 1, - 201, 66, 219, 181, 219, 247, 1, 240, 40, 219, 181, 219, 247, 1, 240, 24, - 219, 181, 219, 247, 1, 216, 85, 219, 181, 219, 247, 1, 207, 50, 219, 181, - 219, 247, 1, 205, 80, 219, 181, 219, 247, 18, 2, 226, 119, 219, 181, 219, - 247, 18, 2, 199, 245, 219, 181, 219, 247, 18, 2, 252, 131, 219, 181, 219, - 247, 18, 2, 250, 149, 219, 181, 219, 247, 18, 2, 252, 123, 219, 181, 219, - 247, 245, 91, 219, 181, 219, 247, 251, 205, 224, 107, 219, 181, 219, 247, - 251, 79, 219, 181, 219, 247, 5, 210, 117, 78, 219, 181, 219, 247, 197, 9, - 210, 117, 78, 219, 181, 219, 247, 18, 2, 199, 2, 219, 181, 219, 247, 199, - 7, 35, 5, 201, 59, 35, 5, 201, 62, 35, 5, 201, 65, 35, 5, 201, 63, 35, 5, - 201, 64, 35, 5, 201, 61, 35, 5, 240, 18, 35, 5, 240, 20, 35, 5, 240, 23, - 35, 5, 240, 21, 35, 5, 240, 22, 35, 5, 240, 19, 35, 5, 237, 142, 35, 5, - 237, 146, 35, 5, 237, 154, 35, 5, 237, 151, 35, 5, 237, 152, 35, 5, 237, - 143, 35, 5, 247, 70, 35, 5, 247, 64, 35, 5, 247, 66, 35, 5, 247, 69, 35, - 5, 247, 67, 35, 5, 247, 68, 35, 5, 247, 65, 35, 5, 249, 44, 35, 5, 249, - 23, 35, 5, 249, 35, 35, 5, 249, 43, 35, 5, 249, 38, 35, 5, 249, 39, 35, - 5, 249, 27, 8, 4, 1, 249, 73, 251, 133, 8, 4, 1, 39, 210, 87, 8, 4, 1, - 248, 131, 69, 8, 4, 1, 249, 73, 69, 8, 4, 1, 237, 135, 3, 235, 63, 8, 4, - 1, 222, 148, 236, 48, 8, 4, 1, 145, 234, 190, 3, 241, 56, 8, 4, 1, 223, - 99, 3, 226, 16, 222, 203, 209, 80, 8, 4, 1, 223, 99, 3, 52, 112, 202, 84, - 8, 4, 1, 223, 99, 3, 112, 210, 2, 8, 4, 1, 221, 136, 3, 241, 56, 8, 4, 1, - 218, 55, 3, 241, 56, 8, 4, 1, 236, 215, 3, 241, 56, 8, 4, 1, 248, 131, - 72, 8, 4, 1, 248, 131, 177, 3, 106, 8, 4, 1, 192, 177, 3, 106, 8, 4, 1, - 226, 16, 214, 163, 8, 4, 1, 163, 214, 164, 3, 106, 8, 4, 1, 163, 214, - 164, 3, 231, 154, 106, 8, 4, 1, 163, 177, 214, 87, 8, 4, 1, 163, 177, - 214, 88, 3, 106, 8, 4, 1, 204, 231, 144, 8, 1, 4, 6, 211, 31, 3, 53, 222, - 171, 8, 4, 1, 211, 31, 197, 37, 232, 186, 8, 4, 1, 52, 144, 8, 4, 1, 211, - 31, 3, 241, 56, 8, 4, 1, 52, 211, 31, 3, 241, 56, 8, 4, 1, 145, 144, 8, - 4, 1, 145, 211, 31, 3, 210, 2, 8, 4, 1, 249, 63, 236, 140, 8, 4, 1, 118, - 3, 206, 182, 53, 222, 171, 8, 4, 1, 118, 249, 79, 3, 206, 182, 53, 222, - 171, 8, 4, 1, 200, 90, 8, 4, 1, 163, 200, 90, 8, 4, 1, 118, 3, 50, 122, - 8, 4, 1, 245, 74, 8, 4, 1, 245, 75, 3, 126, 53, 210, 2, 8, 4, 1, 245, 75, + 210, 50, 29, 137, 219, 52, 29, 137, 219, 43, 29, 137, 219, 46, 29, 137, + 212, 191, 29, 137, 212, 202, 29, 137, 212, 203, 29, 137, 205, 64, 29, + 137, 226, 133, 29, 137, 226, 140, 29, 137, 205, 75, 29, 137, 205, 62, 29, + 137, 212, 243, 29, 137, 232, 50, 29, 137, 205, 59, 225, 199, 2, 213, 169, + 225, 199, 2, 247, 54, 225, 199, 2, 222, 205, 225, 199, 2, 197, 55, 225, + 199, 1, 63, 225, 199, 1, 230, 249, 224, 219, 225, 199, 1, 68, 225, 199, + 1, 226, 120, 225, 199, 1, 66, 225, 199, 1, 213, 244, 247, 24, 225, 199, + 1, 217, 72, 222, 163, 225, 199, 1, 217, 72, 222, 164, 210, 199, 225, 199, + 1, 69, 225, 199, 1, 251, 200, 225, 199, 1, 72, 225, 199, 1, 155, 225, + 199, 1, 225, 70, 208, 201, 225, 199, 1, 225, 70, 218, 99, 225, 199, 1, + 234, 123, 225, 199, 1, 234, 124, 218, 99, 225, 199, 1, 217, 71, 225, 199, + 1, 247, 174, 225, 199, 1, 247, 175, 218, 99, 225, 199, 1, 225, 214, 225, + 199, 1, 215, 110, 218, 99, 225, 199, 1, 225, 215, 220, 85, 225, 199, 1, + 215, 109, 225, 199, 1, 201, 78, 225, 199, 1, 201, 79, 220, 85, 225, 199, + 1, 240, 41, 225, 199, 1, 240, 42, 220, 85, 225, 199, 1, 218, 1, 218, 99, + 225, 199, 1, 189, 225, 199, 1, 203, 169, 218, 99, 225, 199, 1, 240, 136, + 225, 199, 1, 240, 137, 220, 85, 225, 199, 1, 176, 225, 199, 1, 161, 225, + 199, 1, 213, 244, 218, 99, 225, 199, 1, 249, 145, 225, 199, 1, 249, 146, + 218, 99, 225, 199, 1, 166, 225, 199, 1, 164, 225, 199, 1, 169, 225, 199, + 1, 210, 252, 251, 210, 225, 199, 1, 172, 225, 199, 1, 197, 166, 225, 199, + 1, 209, 23, 218, 99, 225, 199, 1, 209, 23, 220, 85, 225, 199, 1, 183, + 225, 199, 1, 142, 225, 199, 2, 247, 55, 203, 27, 225, 199, 18, 2, 203, + 97, 225, 199, 18, 2, 202, 16, 225, 199, 18, 2, 196, 237, 225, 199, 18, 2, + 196, 238, 219, 175, 225, 199, 18, 2, 204, 121, 225, 199, 18, 2, 204, 122, + 219, 163, 225, 199, 18, 2, 203, 121, 225, 199, 18, 2, 239, 82, 218, 98, + 225, 199, 18, 2, 213, 48, 225, 199, 108, 2, 224, 175, 225, 199, 108, 2, + 213, 62, 225, 199, 108, 2, 247, 159, 225, 199, 213, 182, 225, 199, 50, + 210, 111, 225, 199, 53, 210, 111, 225, 199, 213, 232, 251, 99, 225, 199, + 213, 232, 220, 105, 225, 199, 213, 232, 221, 178, 225, 199, 213, 232, + 197, 48, 225, 199, 213, 232, 213, 183, 225, 199, 213, 232, 222, 67, 225, + 199, 213, 232, 221, 172, 225, 199, 213, 232, 252, 0, 225, 199, 213, 232, + 252, 1, 252, 0, 225, 199, 213, 232, 212, 159, 225, 199, 163, 213, 232, + 212, 159, 225, 199, 213, 178, 225, 199, 17, 195, 79, 225, 199, 17, 100, + 225, 199, 17, 102, 225, 199, 17, 134, 225, 199, 17, 136, 225, 199, 17, + 146, 225, 199, 17, 167, 225, 199, 17, 178, 225, 199, 17, 171, 225, 199, + 17, 182, 225, 199, 213, 232, 202, 59, 201, 19, 225, 199, 213, 232, 225, + 244, 75, 1, 207, 25, 233, 230, 75, 1, 207, 25, 247, 16, 75, 1, 207, 25, + 225, 180, 75, 1, 207, 25, 216, 86, 75, 1, 207, 25, 248, 197, 75, 2, 207, + 25, 208, 185, 75, 73, 1, 207, 25, 210, 156, 75, 1, 49, 223, 53, 215, 109, + 75, 1, 49, 223, 53, 235, 239, 75, 1, 49, 223, 53, 234, 123, 75, 1, 49, + 223, 53, 233, 230, 75, 1, 49, 223, 53, 225, 214, 75, 1, 49, 223, 53, 225, + 180, 75, 1, 49, 223, 53, 240, 41, 75, 1, 49, 223, 53, 240, 25, 75, 1, 49, + 223, 53, 216, 86, 75, 49, 223, 53, 17, 195, 79, 75, 49, 223, 53, 17, 100, + 75, 49, 223, 53, 17, 102, 75, 49, 223, 53, 17, 134, 75, 49, 223, 53, 17, + 136, 75, 49, 223, 53, 17, 146, 75, 49, 223, 53, 17, 167, 75, 49, 223, 53, + 17, 178, 75, 49, 223, 53, 17, 171, 75, 49, 223, 53, 17, 182, 75, 1, 49, + 223, 53, 222, 37, 75, 1, 49, 223, 53, 240, 136, 75, 1, 49, 223, 53, 239, + 176, 75, 1, 49, 223, 53, 249, 145, 75, 1, 49, 223, 53, 248, 197, 247, 9, + 1, 63, 247, 9, 1, 68, 247, 9, 1, 66, 247, 9, 1, 69, 247, 9, 1, 251, 200, + 247, 9, 1, 72, 247, 9, 1, 155, 247, 9, 1, 224, 146, 247, 9, 1, 234, 123, + 247, 9, 1, 233, 230, 247, 9, 1, 216, 236, 247, 9, 1, 217, 71, 247, 9, 1, + 247, 16, 247, 9, 1, 245, 77, 247, 9, 1, 225, 214, 247, 9, 1, 225, 180, + 247, 9, 1, 216, 225, 247, 9, 1, 216, 227, 247, 9, 1, 216, 226, 247, 9, 1, + 189, 247, 9, 1, 202, 233, 247, 9, 1, 240, 136, 247, 9, 1, 239, 176, 247, + 9, 1, 215, 152, 247, 9, 1, 176, 247, 9, 1, 240, 41, 247, 9, 1, 161, 247, + 9, 1, 212, 54, 247, 9, 1, 213, 6, 247, 9, 1, 249, 145, 247, 9, 1, 248, + 197, 247, 9, 1, 218, 133, 247, 9, 1, 166, 247, 9, 1, 249, 45, 247, 9, 1, + 164, 247, 9, 1, 169, 247, 9, 1, 172, 247, 9, 1, 199, 152, 247, 9, 1, 205, + 80, 247, 9, 1, 183, 247, 9, 1, 142, 247, 9, 18, 2, 252, 168, 247, 9, 18, + 2, 68, 247, 9, 18, 2, 226, 120, 247, 9, 18, 2, 237, 33, 247, 9, 18, 2, + 66, 247, 9, 18, 2, 214, 164, 247, 9, 18, 2, 72, 247, 9, 18, 2, 251, 200, + 247, 9, 18, 2, 250, 150, 247, 9, 18, 2, 200, 99, 247, 9, 108, 2, 164, + 247, 9, 108, 2, 169, 247, 9, 108, 2, 172, 247, 9, 108, 2, 197, 166, 247, + 9, 1, 48, 225, 80, 247, 9, 1, 48, 234, 190, 247, 9, 1, 48, 217, 73, 247, + 9, 108, 2, 48, 217, 73, 247, 9, 1, 48, 247, 18, 247, 9, 1, 48, 203, 216, + 247, 9, 1, 48, 218, 55, 247, 9, 1, 48, 214, 3, 247, 9, 1, 48, 196, 148, + 247, 9, 1, 48, 144, 247, 9, 1, 48, 159, 247, 9, 1, 48, 205, 83, 247, 9, + 108, 2, 48, 221, 136, 247, 9, 108, 2, 48, 233, 15, 247, 9, 17, 195, 79, + 247, 9, 17, 100, 247, 9, 17, 102, 247, 9, 17, 134, 247, 9, 17, 136, 247, + 9, 17, 146, 247, 9, 17, 167, 247, 9, 17, 178, 247, 9, 17, 171, 247, 9, + 17, 182, 247, 9, 211, 214, 205, 120, 247, 9, 211, 214, 240, 88, 247, 9, + 211, 214, 52, 240, 88, 247, 9, 211, 214, 201, 165, 240, 88, 75, 1, 224, + 139, 234, 123, 75, 1, 224, 139, 247, 174, 75, 1, 224, 139, 247, 16, 75, + 1, 224, 139, 225, 214, 75, 1, 224, 139, 225, 180, 75, 1, 224, 139, 215, + 109, 75, 1, 224, 139, 201, 78, 75, 1, 224, 139, 201, 66, 75, 1, 224, 139, + 240, 41, 75, 1, 224, 139, 240, 25, 75, 1, 224, 139, 239, 176, 75, 1, 224, + 139, 176, 75, 1, 224, 139, 183, 75, 1, 224, 139, 142, 75, 1, 224, 139, + 232, 80, 75, 1, 224, 139, 235, 239, 75, 73, 1, 224, 139, 210, 156, 75, 1, + 224, 139, 196, 208, 75, 1, 224, 139, 195, 115, 75, 1, 224, 139, 169, 75, + 221, 248, 224, 139, 214, 187, 75, 221, 248, 224, 139, 211, 110, 75, 221, + 248, 224, 139, 231, 248, 75, 16, 251, 186, 236, 89, 75, 16, 251, 186, + 100, 75, 16, 251, 186, 102, 75, 1, 251, 186, 169, 75, 2, 213, 165, 224, + 248, 202, 11, 75, 2, 49, 223, 53, 202, 9, 75, 2, 49, 223, 53, 202, 6, 75, + 1, 206, 128, 213, 212, 247, 16, 75, 1, 206, 128, 213, 212, 207, 50, 49, + 199, 24, 1, 126, 224, 11, 49, 199, 24, 1, 130, 224, 11, 49, 199, 24, 1, + 126, 224, 117, 49, 199, 24, 1, 130, 224, 117, 49, 199, 24, 1, 126, 224, + 126, 49, 199, 24, 1, 130, 224, 126, 49, 199, 24, 1, 126, 233, 144, 49, + 199, 24, 1, 130, 233, 144, 49, 199, 24, 1, 126, 216, 252, 49, 199, 24, 1, + 130, 216, 252, 49, 199, 24, 1, 126, 244, 182, 49, 199, 24, 1, 130, 244, + 182, 49, 199, 24, 1, 126, 245, 49, 49, 199, 24, 1, 130, 245, 49, 49, 199, + 24, 1, 126, 205, 200, 49, 199, 24, 1, 130, 205, 200, 49, 199, 24, 1, 126, + 215, 73, 49, 199, 24, 1, 130, 215, 73, 49, 199, 24, 1, 126, 239, 28, 49, + 199, 24, 1, 130, 239, 28, 49, 199, 24, 1, 126, 149, 49, 199, 24, 1, 130, + 149, 49, 199, 24, 1, 126, 202, 169, 49, 199, 24, 1, 130, 202, 169, 49, + 199, 24, 1, 126, 216, 50, 49, 199, 24, 1, 130, 216, 50, 49, 199, 24, 1, + 126, 248, 116, 49, 199, 24, 1, 130, 248, 116, 49, 199, 24, 1, 126, 212, + 117, 49, 199, 24, 1, 130, 212, 117, 49, 199, 24, 1, 126, 212, 234, 49, + 199, 24, 1, 130, 212, 234, 49, 199, 24, 1, 126, 235, 51, 49, 199, 24, 1, + 130, 235, 51, 49, 199, 24, 1, 126, 218, 251, 49, 199, 24, 1, 130, 218, + 251, 49, 199, 24, 1, 126, 196, 3, 49, 199, 24, 1, 130, 196, 3, 49, 199, + 24, 1, 126, 209, 232, 49, 199, 24, 1, 130, 209, 232, 49, 199, 24, 1, 126, + 222, 7, 49, 199, 24, 1, 130, 222, 7, 49, 199, 24, 1, 126, 198, 248, 49, + 199, 24, 1, 130, 198, 248, 49, 199, 24, 1, 126, 231, 193, 49, 199, 24, 1, + 130, 231, 193, 49, 199, 24, 1, 126, 72, 49, 199, 24, 1, 130, 72, 49, 199, + 24, 220, 82, 225, 13, 49, 199, 24, 18, 252, 168, 49, 199, 24, 18, 68, 49, + 199, 24, 18, 200, 99, 49, 199, 24, 18, 66, 49, 199, 24, 18, 69, 49, 199, + 24, 18, 72, 49, 199, 24, 220, 82, 224, 120, 49, 199, 24, 18, 230, 210, + 49, 199, 24, 18, 200, 98, 49, 199, 24, 18, 200, 114, 49, 199, 24, 18, + 250, 148, 49, 199, 24, 18, 250, 122, 49, 199, 24, 18, 251, 106, 49, 199, + 24, 18, 251, 123, 49, 199, 24, 152, 220, 82, 237, 14, 49, 199, 24, 152, + 220, 82, 215, 151, 49, 199, 24, 152, 220, 82, 202, 169, 49, 199, 24, 152, + 220, 82, 205, 173, 49, 199, 24, 16, 223, 245, 49, 199, 24, 16, 215, 151, + 49, 199, 24, 16, 208, 229, 49, 199, 24, 16, 231, 194, 231, 180, 49, 199, + 24, 16, 224, 0, 223, 255, 219, 182, 219, 248, 1, 69, 219, 182, 219, 248, + 1, 72, 219, 182, 219, 248, 1, 247, 16, 219, 182, 219, 248, 1, 215, 109, + 219, 182, 219, 248, 1, 201, 78, 219, 182, 219, 248, 1, 201, 66, 219, 182, + 219, 248, 1, 240, 41, 219, 182, 219, 248, 1, 240, 25, 219, 182, 219, 248, + 1, 216, 86, 219, 182, 219, 248, 1, 207, 50, 219, 182, 219, 248, 1, 205, + 80, 219, 182, 219, 248, 18, 2, 226, 120, 219, 182, 219, 248, 18, 2, 199, + 245, 219, 182, 219, 248, 18, 2, 252, 132, 219, 182, 219, 248, 18, 2, 250, + 150, 219, 182, 219, 248, 18, 2, 252, 124, 219, 182, 219, 248, 245, 92, + 219, 182, 219, 248, 251, 206, 224, 108, 219, 182, 219, 248, 251, 80, 219, + 182, 219, 248, 5, 210, 117, 78, 219, 182, 219, 248, 197, 9, 210, 117, 78, + 219, 182, 219, 248, 18, 2, 199, 2, 219, 182, 219, 248, 199, 7, 35, 5, + 201, 59, 35, 5, 201, 62, 35, 5, 201, 65, 35, 5, 201, 63, 35, 5, 201, 64, + 35, 5, 201, 61, 35, 5, 240, 19, 35, 5, 240, 21, 35, 5, 240, 24, 35, 5, + 240, 22, 35, 5, 240, 23, 35, 5, 240, 20, 35, 5, 237, 143, 35, 5, 237, + 147, 35, 5, 237, 155, 35, 5, 237, 152, 35, 5, 237, 153, 35, 5, 237, 144, + 35, 5, 247, 71, 35, 5, 247, 65, 35, 5, 247, 67, 35, 5, 247, 70, 35, 5, + 247, 68, 35, 5, 247, 69, 35, 5, 247, 66, 35, 5, 249, 45, 35, 5, 249, 24, + 35, 5, 249, 36, 35, 5, 249, 44, 35, 5, 249, 39, 35, 5, 249, 40, 35, 5, + 249, 28, 8, 4, 1, 249, 74, 251, 134, 8, 4, 1, 39, 210, 87, 8, 4, 1, 248, + 132, 69, 8, 4, 1, 249, 74, 69, 8, 4, 1, 237, 136, 3, 235, 64, 8, 4, 1, + 222, 149, 236, 49, 8, 4, 1, 145, 234, 191, 3, 241, 57, 8, 4, 1, 223, 100, + 3, 226, 17, 222, 204, 209, 80, 8, 4, 1, 223, 100, 3, 52, 112, 202, 84, 8, + 4, 1, 223, 100, 3, 112, 210, 2, 8, 4, 1, 221, 137, 3, 241, 57, 8, 4, 1, + 218, 56, 3, 241, 57, 8, 4, 1, 236, 216, 3, 241, 57, 8, 4, 1, 248, 132, + 72, 8, 4, 1, 248, 132, 177, 3, 106, 8, 4, 1, 192, 177, 3, 106, 8, 4, 1, + 226, 17, 214, 164, 8, 4, 1, 163, 214, 165, 3, 106, 8, 4, 1, 163, 214, + 165, 3, 231, 155, 106, 8, 4, 1, 163, 177, 214, 88, 8, 4, 1, 163, 177, + 214, 89, 3, 106, 8, 4, 1, 204, 231, 144, 8, 1, 4, 6, 211, 32, 3, 53, 222, + 172, 8, 4, 1, 211, 32, 197, 37, 232, 187, 8, 4, 1, 52, 144, 8, 4, 1, 211, + 32, 3, 241, 57, 8, 4, 1, 52, 211, 32, 3, 241, 57, 8, 4, 1, 145, 144, 8, + 4, 1, 145, 211, 32, 3, 210, 2, 8, 4, 1, 249, 64, 236, 141, 8, 4, 1, 118, + 3, 206, 182, 53, 222, 172, 8, 4, 1, 118, 249, 80, 3, 206, 182, 53, 222, + 172, 8, 4, 1, 200, 90, 8, 4, 1, 163, 200, 90, 8, 4, 1, 118, 3, 50, 122, + 8, 4, 1, 245, 75, 8, 4, 1, 245, 76, 3, 126, 53, 210, 2, 8, 4, 1, 245, 76, 3, 126, 50, 207, 85, 8, 4, 1, 196, 223, 3, 126, 53, 210, 2, 8, 4, 1, 196, - 223, 3, 181, 50, 222, 171, 8, 4, 1, 196, 223, 3, 181, 50, 222, 172, 26, - 126, 53, 210, 2, 8, 4, 1, 196, 223, 3, 181, 50, 222, 172, 3, 207, 85, 8, - 4, 1, 196, 149, 3, 206, 182, 53, 222, 171, 73, 248, 47, 3, 226, 16, 248, - 46, 73, 1, 4, 232, 98, 73, 1, 4, 223, 99, 3, 226, 16, 222, 203, 209, 80, - 73, 1, 4, 223, 99, 3, 112, 202, 84, 73, 1, 4, 118, 3, 50, 122, 8, 4, 1, - 208, 246, 196, 84, 8, 4, 1, 226, 4, 69, 8, 4, 1, 192, 214, 163, 8, 4, 1, - 200, 41, 8, 4, 1, 226, 16, 251, 133, 32, 1, 4, 6, 214, 123, 8, 4, 1, 237, - 157, 239, 110, 3, 210, 95, 122, 8, 4, 1, 201, 115, 239, 110, 3, 210, 95, + 223, 3, 181, 50, 222, 172, 8, 4, 1, 196, 223, 3, 181, 50, 222, 173, 26, + 126, 53, 210, 2, 8, 4, 1, 196, 223, 3, 181, 50, 222, 173, 3, 207, 85, 8, + 4, 1, 196, 149, 3, 206, 182, 53, 222, 172, 73, 248, 48, 3, 226, 17, 248, + 47, 73, 1, 4, 232, 99, 73, 1, 4, 223, 100, 3, 226, 17, 222, 204, 209, 80, + 73, 1, 4, 223, 100, 3, 112, 202, 84, 73, 1, 4, 118, 3, 50, 122, 8, 4, 1, + 208, 246, 196, 84, 8, 4, 1, 226, 5, 69, 8, 4, 1, 192, 214, 164, 8, 4, 1, + 200, 41, 8, 4, 1, 226, 17, 251, 134, 32, 1, 4, 6, 214, 124, 8, 4, 1, 237, + 158, 239, 111, 3, 210, 95, 122, 8, 4, 1, 201, 115, 239, 111, 3, 210, 95, 122, 95, 4, 1, 63, 95, 4, 1, 69, 95, 4, 1, 68, 95, 4, 1, 72, 95, 4, 1, - 66, 95, 4, 1, 199, 230, 95, 4, 1, 234, 122, 95, 4, 1, 155, 95, 4, 1, 234, - 47, 95, 4, 1, 233, 191, 95, 4, 1, 233, 143, 95, 4, 1, 233, 75, 95, 4, 1, - 233, 35, 95, 4, 1, 142, 95, 4, 1, 232, 146, 95, 4, 1, 232, 70, 95, 4, 1, - 231, 192, 95, 4, 1, 231, 74, 95, 4, 1, 231, 43, 95, 4, 1, 172, 95, 4, 1, - 222, 196, 95, 4, 1, 222, 108, 95, 4, 1, 222, 6, 95, 4, 1, 221, 190, 95, - 4, 1, 221, 159, 95, 4, 1, 166, 95, 4, 1, 219, 206, 95, 4, 1, 219, 77, 95, - 4, 1, 218, 250, 95, 4, 1, 218, 144, 95, 4, 1, 176, 95, 4, 1, 231, 216, - 95, 4, 1, 217, 230, 95, 4, 1, 217, 117, 95, 4, 1, 216, 222, 95, 4, 1, - 216, 49, 95, 4, 1, 215, 185, 95, 4, 1, 215, 119, 95, 4, 1, 211, 95, 95, - 4, 1, 211, 81, 95, 4, 1, 211, 74, 95, 4, 1, 211, 64, 95, 4, 1, 211, 53, - 95, 4, 1, 211, 51, 95, 4, 1, 183, 95, 4, 1, 209, 80, 95, 4, 1, 208, 147, + 66, 95, 4, 1, 199, 230, 95, 4, 1, 234, 123, 95, 4, 1, 155, 95, 4, 1, 234, + 48, 95, 4, 1, 233, 192, 95, 4, 1, 233, 144, 95, 4, 1, 233, 76, 95, 4, 1, + 233, 36, 95, 4, 1, 142, 95, 4, 1, 232, 147, 95, 4, 1, 232, 71, 95, 4, 1, + 231, 193, 95, 4, 1, 231, 75, 95, 4, 1, 231, 44, 95, 4, 1, 172, 95, 4, 1, + 222, 197, 95, 4, 1, 222, 109, 95, 4, 1, 222, 7, 95, 4, 1, 221, 191, 95, + 4, 1, 221, 160, 95, 4, 1, 166, 95, 4, 1, 219, 207, 95, 4, 1, 219, 78, 95, + 4, 1, 218, 251, 95, 4, 1, 218, 145, 95, 4, 1, 176, 95, 4, 1, 231, 217, + 95, 4, 1, 217, 231, 95, 4, 1, 217, 118, 95, 4, 1, 216, 223, 95, 4, 1, + 216, 50, 95, 4, 1, 215, 186, 95, 4, 1, 215, 120, 95, 4, 1, 211, 96, 95, + 4, 1, 211, 82, 95, 4, 1, 211, 75, 95, 4, 1, 211, 65, 95, 4, 1, 211, 54, + 95, 4, 1, 211, 52, 95, 4, 1, 183, 95, 4, 1, 209, 80, 95, 4, 1, 208, 147, 95, 4, 1, 206, 112, 95, 4, 1, 205, 200, 95, 4, 1, 204, 172, 95, 4, 1, - 204, 72, 95, 4, 1, 240, 135, 95, 4, 1, 189, 95, 4, 1, 239, 251, 95, 4, 1, - 203, 68, 95, 4, 1, 239, 151, 95, 4, 1, 202, 122, 95, 4, 1, 239, 27, 95, - 4, 1, 237, 200, 95, 4, 1, 237, 169, 95, 4, 1, 239, 39, 95, 4, 1, 202, 47, + 204, 72, 95, 4, 1, 240, 136, 95, 4, 1, 189, 95, 4, 1, 239, 252, 95, 4, 1, + 203, 68, 95, 4, 1, 239, 152, 95, 4, 1, 202, 122, 95, 4, 1, 239, 28, 95, + 4, 1, 237, 201, 95, 4, 1, 237, 170, 95, 4, 1, 239, 40, 95, 4, 1, 202, 47, 95, 4, 1, 202, 46, 95, 4, 1, 202, 35, 95, 4, 1, 202, 34, 95, 4, 1, 202, 33, 95, 4, 1, 202, 32, 95, 4, 1, 201, 113, 95, 4, 1, 201, 107, 95, 4, 1, 201, 92, 95, 4, 1, 201, 90, 95, 4, 1, 201, 86, 95, 4, 1, 201, 85, 95, 4, 1, 197, 166, 95, 4, 1, 197, 109, 95, 4, 1, 197, 70, 95, 4, 1, 197, 34, - 95, 4, 1, 196, 243, 95, 4, 1, 196, 230, 95, 4, 1, 164, 219, 181, 219, - 247, 1, 223, 251, 219, 181, 219, 247, 1, 208, 229, 219, 181, 219, 247, 1, - 223, 53, 219, 181, 219, 247, 1, 219, 5, 219, 181, 219, 247, 1, 161, 219, - 181, 219, 247, 1, 176, 219, 181, 219, 247, 1, 245, 66, 219, 181, 219, - 247, 1, 202, 86, 219, 181, 219, 247, 1, 224, 110, 219, 181, 219, 247, 1, - 216, 241, 219, 181, 219, 247, 1, 202, 161, 219, 181, 219, 247, 1, 197, - 154, 219, 181, 219, 247, 1, 196, 95, 219, 181, 219, 247, 1, 231, 63, 219, - 181, 219, 247, 1, 200, 72, 219, 181, 219, 247, 1, 68, 219, 181, 219, 247, - 1, 212, 255, 219, 181, 219, 247, 1, 250, 160, 219, 181, 219, 247, 1, 233, - 135, 219, 181, 219, 247, 1, 225, 177, 219, 181, 219, 247, 1, 210, 223, - 219, 181, 219, 247, 1, 249, 144, 219, 181, 219, 247, 1, 225, 161, 219, - 181, 219, 247, 1, 239, 108, 219, 181, 219, 247, 1, 233, 198, 219, 181, - 219, 247, 1, 239, 153, 219, 181, 219, 247, 1, 248, 193, 219, 181, 219, - 247, 1, 223, 252, 221, 229, 219, 181, 219, 247, 1, 223, 54, 221, 229, - 219, 181, 219, 247, 1, 219, 6, 221, 229, 219, 181, 219, 247, 1, 213, 243, - 221, 229, 219, 181, 219, 247, 1, 218, 0, 221, 229, 219, 181, 219, 247, 1, - 202, 87, 221, 229, 219, 181, 219, 247, 1, 216, 242, 221, 229, 219, 181, - 219, 247, 1, 230, 248, 221, 229, 219, 181, 219, 247, 18, 2, 214, 116, - 219, 181, 219, 247, 18, 2, 226, 83, 219, 181, 219, 247, 18, 2, 251, 103, - 219, 181, 219, 247, 18, 2, 196, 58, 219, 181, 219, 247, 18, 2, 205, 163, - 219, 181, 219, 247, 18, 2, 200, 69, 219, 181, 219, 247, 18, 2, 245, 89, - 219, 181, 219, 247, 18, 2, 215, 134, 219, 181, 219, 247, 245, 90, 219, - 181, 219, 247, 221, 174, 225, 222, 219, 181, 219, 247, 251, 18, 225, 222, - 219, 181, 219, 247, 17, 195, 79, 219, 181, 219, 247, 17, 100, 219, 181, - 219, 247, 17, 102, 219, 181, 219, 247, 17, 134, 219, 181, 219, 247, 17, - 136, 219, 181, 219, 247, 17, 146, 219, 181, 219, 247, 17, 167, 219, 181, - 219, 247, 17, 178, 219, 181, 219, 247, 17, 171, 219, 181, 219, 247, 17, - 182, 29, 225, 101, 215, 10, 29, 225, 101, 215, 15, 29, 225, 101, 195, - 252, 29, 225, 101, 195, 251, 29, 225, 101, 195, 250, 29, 225, 101, 200, - 164, 29, 225, 101, 200, 168, 29, 225, 101, 195, 211, 29, 225, 101, 195, - 207, 29, 225, 101, 236, 114, 29, 225, 101, 236, 112, 29, 225, 101, 236, - 113, 29, 225, 101, 236, 110, 29, 225, 101, 230, 234, 29, 225, 101, 230, - 233, 29, 225, 101, 230, 231, 29, 225, 101, 230, 232, 29, 225, 101, 230, - 237, 29, 225, 101, 230, 230, 29, 225, 101, 230, 229, 29, 225, 101, 230, - 239, 29, 225, 101, 251, 4, 29, 225, 101, 251, 3, 29, 116, 216, 200, 29, - 116, 216, 206, 29, 116, 205, 61, 29, 116, 205, 60, 29, 116, 202, 92, 29, + 95, 4, 1, 196, 243, 95, 4, 1, 196, 230, 95, 4, 1, 164, 219, 182, 219, + 248, 1, 223, 252, 219, 182, 219, 248, 1, 208, 229, 219, 182, 219, 248, 1, + 223, 54, 219, 182, 219, 248, 1, 219, 6, 219, 182, 219, 248, 1, 161, 219, + 182, 219, 248, 1, 176, 219, 182, 219, 248, 1, 245, 67, 219, 182, 219, + 248, 1, 202, 86, 219, 182, 219, 248, 1, 224, 111, 219, 182, 219, 248, 1, + 216, 242, 219, 182, 219, 248, 1, 202, 161, 219, 182, 219, 248, 1, 197, + 154, 219, 182, 219, 248, 1, 196, 95, 219, 182, 219, 248, 1, 231, 64, 219, + 182, 219, 248, 1, 200, 72, 219, 182, 219, 248, 1, 68, 219, 182, 219, 248, + 1, 213, 0, 219, 182, 219, 248, 1, 250, 161, 219, 182, 219, 248, 1, 233, + 136, 219, 182, 219, 248, 1, 225, 178, 219, 182, 219, 248, 1, 210, 224, + 219, 182, 219, 248, 1, 249, 145, 219, 182, 219, 248, 1, 225, 162, 219, + 182, 219, 248, 1, 239, 109, 219, 182, 219, 248, 1, 233, 199, 219, 182, + 219, 248, 1, 239, 154, 219, 182, 219, 248, 1, 248, 194, 219, 182, 219, + 248, 1, 223, 253, 221, 230, 219, 182, 219, 248, 1, 223, 55, 221, 230, + 219, 182, 219, 248, 1, 219, 7, 221, 230, 219, 182, 219, 248, 1, 213, 244, + 221, 230, 219, 182, 219, 248, 1, 218, 1, 221, 230, 219, 182, 219, 248, 1, + 202, 87, 221, 230, 219, 182, 219, 248, 1, 216, 243, 221, 230, 219, 182, + 219, 248, 1, 230, 249, 221, 230, 219, 182, 219, 248, 18, 2, 214, 117, + 219, 182, 219, 248, 18, 2, 226, 84, 219, 182, 219, 248, 18, 2, 251, 104, + 219, 182, 219, 248, 18, 2, 196, 58, 219, 182, 219, 248, 18, 2, 205, 163, + 219, 182, 219, 248, 18, 2, 200, 69, 219, 182, 219, 248, 18, 2, 245, 90, + 219, 182, 219, 248, 18, 2, 215, 135, 219, 182, 219, 248, 245, 91, 219, + 182, 219, 248, 221, 175, 225, 223, 219, 182, 219, 248, 251, 19, 225, 223, + 219, 182, 219, 248, 17, 195, 79, 219, 182, 219, 248, 17, 100, 219, 182, + 219, 248, 17, 102, 219, 182, 219, 248, 17, 134, 219, 182, 219, 248, 17, + 136, 219, 182, 219, 248, 17, 146, 219, 182, 219, 248, 17, 167, 219, 182, + 219, 248, 17, 178, 219, 182, 219, 248, 17, 171, 219, 182, 219, 248, 17, + 182, 29, 225, 102, 215, 11, 29, 225, 102, 215, 16, 29, 225, 102, 195, + 252, 29, 225, 102, 195, 251, 29, 225, 102, 195, 250, 29, 225, 102, 200, + 164, 29, 225, 102, 200, 168, 29, 225, 102, 195, 211, 29, 225, 102, 195, + 207, 29, 225, 102, 236, 115, 29, 225, 102, 236, 113, 29, 225, 102, 236, + 114, 29, 225, 102, 236, 111, 29, 225, 102, 230, 235, 29, 225, 102, 230, + 234, 29, 225, 102, 230, 232, 29, 225, 102, 230, 233, 29, 225, 102, 230, + 238, 29, 225, 102, 230, 231, 29, 225, 102, 230, 230, 29, 225, 102, 230, + 240, 29, 225, 102, 251, 5, 29, 225, 102, 251, 4, 29, 116, 216, 201, 29, + 116, 216, 207, 29, 116, 205, 61, 29, 116, 205, 60, 29, 116, 202, 92, 29, 116, 202, 90, 29, 116, 202, 89, 29, 116, 202, 95, 29, 116, 202, 96, 29, 116, 202, 88, 29, 116, 210, 33, 29, 116, 210, 48, 29, 116, 205, 67, 29, 116, 210, 45, 29, 116, 210, 35, 29, 116, 210, 37, 29, 116, 210, 24, 29, - 116, 210, 25, 29, 116, 224, 253, 29, 116, 219, 50, 29, 116, 219, 44, 29, - 116, 205, 71, 29, 116, 219, 47, 29, 116, 219, 53, 29, 116, 212, 186, 29, - 116, 212, 195, 29, 116, 212, 199, 29, 116, 205, 69, 29, 116, 212, 189, - 29, 116, 212, 203, 29, 116, 212, 204, 29, 116, 206, 44, 29, 116, 206, 47, + 116, 210, 25, 29, 116, 224, 254, 29, 116, 219, 51, 29, 116, 219, 45, 29, + 116, 205, 71, 29, 116, 219, 48, 29, 116, 219, 54, 29, 116, 212, 187, 29, + 116, 212, 196, 29, 116, 212, 200, 29, 116, 205, 69, 29, 116, 212, 190, + 29, 116, 212, 204, 29, 116, 212, 205, 29, 116, 206, 44, 29, 116, 206, 47, 29, 116, 205, 65, 29, 116, 205, 63, 29, 116, 206, 42, 29, 116, 206, 50, - 29, 116, 206, 51, 29, 116, 206, 36, 29, 116, 206, 49, 29, 116, 213, 171, - 29, 116, 213, 172, 29, 116, 196, 42, 29, 116, 196, 45, 29, 116, 245, 3, - 29, 116, 245, 2, 29, 116, 205, 76, 29, 116, 212, 240, 29, 116, 212, 239, - 12, 15, 228, 110, 12, 15, 228, 109, 12, 15, 228, 108, 12, 15, 228, 107, - 12, 15, 228, 106, 12, 15, 228, 105, 12, 15, 228, 104, 12, 15, 228, 103, - 12, 15, 228, 102, 12, 15, 228, 101, 12, 15, 228, 100, 12, 15, 228, 99, - 12, 15, 228, 98, 12, 15, 228, 97, 12, 15, 228, 96, 12, 15, 228, 95, 12, - 15, 228, 94, 12, 15, 228, 93, 12, 15, 228, 92, 12, 15, 228, 91, 12, 15, - 228, 90, 12, 15, 228, 89, 12, 15, 228, 88, 12, 15, 228, 87, 12, 15, 228, - 86, 12, 15, 228, 85, 12, 15, 228, 84, 12, 15, 228, 83, 12, 15, 228, 82, - 12, 15, 228, 81, 12, 15, 228, 80, 12, 15, 228, 79, 12, 15, 228, 78, 12, - 15, 228, 77, 12, 15, 228, 76, 12, 15, 228, 75, 12, 15, 228, 74, 12, 15, - 228, 73, 12, 15, 228, 72, 12, 15, 228, 71, 12, 15, 228, 70, 12, 15, 228, - 69, 12, 15, 228, 68, 12, 15, 228, 67, 12, 15, 228, 66, 12, 15, 228, 65, - 12, 15, 228, 64, 12, 15, 228, 63, 12, 15, 228, 62, 12, 15, 228, 61, 12, - 15, 228, 60, 12, 15, 228, 59, 12, 15, 228, 58, 12, 15, 228, 57, 12, 15, - 228, 56, 12, 15, 228, 55, 12, 15, 228, 54, 12, 15, 228, 53, 12, 15, 228, - 52, 12, 15, 228, 51, 12, 15, 228, 50, 12, 15, 228, 49, 12, 15, 228, 48, - 12, 15, 228, 47, 12, 15, 228, 46, 12, 15, 228, 45, 12, 15, 228, 44, 12, - 15, 228, 43, 12, 15, 228, 42, 12, 15, 228, 41, 12, 15, 228, 40, 12, 15, - 228, 39, 12, 15, 228, 38, 12, 15, 228, 37, 12, 15, 228, 36, 12, 15, 228, - 35, 12, 15, 228, 34, 12, 15, 228, 33, 12, 15, 228, 32, 12, 15, 228, 31, - 12, 15, 228, 30, 12, 15, 228, 29, 12, 15, 228, 28, 12, 15, 228, 27, 12, - 15, 228, 26, 12, 15, 228, 25, 12, 15, 228, 24, 12, 15, 228, 23, 12, 15, - 228, 22, 12, 15, 228, 21, 12, 15, 228, 20, 12, 15, 228, 19, 12, 15, 228, - 18, 12, 15, 228, 17, 12, 15, 228, 16, 12, 15, 228, 15, 12, 15, 228, 14, - 12, 15, 228, 13, 12, 15, 228, 12, 12, 15, 228, 11, 12, 15, 228, 10, 12, - 15, 228, 9, 12, 15, 228, 8, 12, 15, 228, 7, 12, 15, 228, 6, 12, 15, 228, - 5, 12, 15, 228, 4, 12, 15, 228, 3, 12, 15, 228, 2, 12, 15, 228, 1, 12, - 15, 228, 0, 12, 15, 227, 255, 12, 15, 227, 254, 12, 15, 227, 253, 12, 15, - 227, 252, 12, 15, 227, 251, 12, 15, 227, 250, 12, 15, 227, 249, 12, 15, - 227, 248, 12, 15, 227, 247, 12, 15, 227, 246, 12, 15, 227, 245, 12, 15, - 227, 244, 12, 15, 227, 243, 12, 15, 227, 242, 12, 15, 227, 241, 12, 15, - 227, 240, 12, 15, 227, 239, 12, 15, 227, 238, 12, 15, 227, 237, 12, 15, - 227, 236, 12, 15, 227, 235, 12, 15, 227, 234, 12, 15, 227, 233, 12, 15, - 227, 232, 12, 15, 227, 231, 12, 15, 227, 230, 12, 15, 227, 229, 12, 15, - 227, 228, 12, 15, 227, 227, 12, 15, 227, 226, 12, 15, 227, 225, 12, 15, - 227, 224, 12, 15, 227, 223, 12, 15, 227, 222, 12, 15, 227, 221, 12, 15, - 227, 220, 12, 15, 227, 219, 12, 15, 227, 218, 12, 15, 227, 217, 12, 15, - 227, 216, 12, 15, 227, 215, 12, 15, 227, 214, 12, 15, 227, 213, 12, 15, - 227, 212, 12, 15, 227, 211, 12, 15, 227, 210, 12, 15, 227, 209, 12, 15, - 227, 208, 12, 15, 227, 207, 12, 15, 227, 206, 12, 15, 227, 205, 12, 15, - 227, 204, 12, 15, 227, 203, 12, 15, 227, 202, 12, 15, 227, 201, 12, 15, - 227, 200, 12, 15, 227, 199, 12, 15, 227, 198, 12, 15, 227, 197, 12, 15, - 227, 196, 12, 15, 227, 195, 12, 15, 227, 194, 12, 15, 227, 193, 12, 15, - 227, 192, 12, 15, 227, 191, 12, 15, 227, 190, 12, 15, 227, 189, 12, 15, - 227, 188, 12, 15, 227, 187, 12, 15, 227, 186, 12, 15, 227, 185, 12, 15, - 227, 184, 12, 15, 227, 183, 12, 15, 227, 182, 12, 15, 227, 181, 12, 15, - 227, 180, 12, 15, 227, 179, 12, 15, 227, 178, 12, 15, 227, 177, 12, 15, - 227, 176, 12, 15, 227, 175, 12, 15, 227, 174, 12, 15, 227, 173, 12, 15, - 227, 172, 12, 15, 227, 171, 12, 15, 227, 170, 12, 15, 227, 169, 12, 15, - 227, 168, 12, 15, 227, 167, 12, 15, 227, 166, 12, 15, 227, 165, 12, 15, - 227, 164, 12, 15, 227, 163, 12, 15, 227, 162, 12, 15, 227, 161, 12, 15, - 227, 160, 12, 15, 227, 159, 12, 15, 227, 158, 12, 15, 227, 157, 12, 15, - 227, 156, 12, 15, 227, 155, 12, 15, 227, 154, 12, 15, 227, 153, 12, 15, - 227, 152, 12, 15, 227, 151, 12, 15, 227, 150, 12, 15, 227, 149, 12, 15, - 227, 148, 12, 15, 227, 147, 12, 15, 227, 146, 12, 15, 227, 145, 12, 15, - 227, 144, 12, 15, 227, 143, 12, 15, 227, 142, 12, 15, 227, 141, 12, 15, - 227, 140, 12, 15, 227, 139, 12, 15, 227, 138, 12, 15, 227, 137, 12, 15, - 227, 136, 12, 15, 227, 135, 12, 15, 227, 134, 12, 15, 227, 133, 12, 15, - 227, 132, 12, 15, 227, 131, 12, 15, 227, 130, 12, 15, 227, 129, 12, 15, - 227, 128, 12, 15, 227, 127, 12, 15, 227, 126, 12, 15, 227, 125, 12, 15, - 227, 124, 12, 15, 227, 123, 12, 15, 227, 122, 12, 15, 227, 121, 12, 15, - 227, 120, 12, 15, 227, 119, 12, 15, 227, 118, 12, 15, 227, 117, 12, 15, - 227, 116, 12, 15, 227, 115, 12, 15, 227, 114, 12, 15, 227, 113, 12, 15, - 227, 112, 12, 15, 227, 111, 12, 15, 227, 110, 12, 15, 227, 109, 12, 15, - 227, 108, 12, 15, 227, 107, 12, 15, 227, 106, 12, 15, 227, 105, 12, 15, - 227, 104, 12, 15, 227, 103, 12, 15, 227, 102, 12, 15, 227, 101, 12, 15, - 227, 100, 12, 15, 227, 99, 12, 15, 227, 98, 12, 15, 227, 97, 12, 15, 227, - 96, 12, 15, 227, 95, 12, 15, 227, 94, 12, 15, 227, 93, 12, 15, 227, 92, - 12, 15, 227, 91, 12, 15, 227, 90, 12, 15, 227, 89, 12, 15, 227, 88, 12, - 15, 227, 87, 12, 15, 227, 86, 12, 15, 227, 85, 12, 15, 227, 84, 12, 15, - 227, 83, 12, 15, 227, 82, 12, 15, 227, 81, 12, 15, 227, 80, 12, 15, 227, - 79, 12, 15, 227, 78, 12, 15, 227, 77, 12, 15, 227, 76, 12, 15, 227, 75, - 12, 15, 227, 74, 12, 15, 227, 73, 12, 15, 227, 72, 12, 15, 227, 71, 12, - 15, 227, 70, 12, 15, 227, 69, 12, 15, 227, 68, 12, 15, 227, 67, 12, 15, - 227, 66, 12, 15, 227, 65, 12, 15, 227, 64, 12, 15, 227, 63, 12, 15, 227, - 62, 12, 15, 227, 61, 12, 15, 227, 60, 12, 15, 227, 59, 12, 15, 227, 58, - 12, 15, 227, 57, 12, 15, 227, 56, 12, 15, 227, 55, 12, 15, 227, 54, 12, - 15, 227, 53, 12, 15, 227, 52, 12, 15, 227, 51, 12, 15, 227, 50, 12, 15, - 227, 49, 12, 15, 227, 48, 12, 15, 227, 47, 12, 15, 227, 46, 12, 15, 227, - 45, 12, 15, 227, 44, 12, 15, 227, 43, 12, 15, 227, 42, 12, 15, 227, 41, - 12, 15, 227, 40, 12, 15, 227, 39, 12, 15, 227, 38, 12, 15, 227, 37, 12, - 15, 227, 36, 12, 15, 227, 35, 12, 15, 227, 34, 12, 15, 227, 33, 12, 15, - 227, 32, 12, 15, 227, 31, 12, 15, 227, 30, 12, 15, 227, 29, 12, 15, 227, - 28, 12, 15, 227, 27, 12, 15, 227, 26, 12, 15, 227, 25, 12, 15, 227, 24, - 12, 15, 227, 23, 12, 15, 227, 22, 12, 15, 227, 21, 12, 15, 227, 20, 12, - 15, 227, 19, 12, 15, 227, 18, 12, 15, 227, 17, 12, 15, 227, 16, 12, 15, - 227, 15, 12, 15, 227, 14, 12, 15, 227, 13, 12, 15, 227, 12, 12, 15, 227, - 11, 12, 15, 227, 10, 12, 15, 227, 9, 12, 15, 227, 8, 12, 15, 227, 7, 12, - 15, 227, 6, 12, 15, 227, 5, 12, 15, 227, 4, 12, 15, 227, 3, 12, 15, 227, - 2, 12, 15, 227, 1, 12, 15, 227, 0, 12, 15, 226, 255, 12, 15, 226, 254, - 12, 15, 226, 253, 12, 15, 226, 252, 12, 15, 226, 251, 12, 15, 226, 250, - 12, 15, 226, 249, 12, 15, 226, 248, 12, 15, 226, 247, 12, 15, 226, 246, - 12, 15, 226, 245, 12, 15, 226, 244, 12, 15, 226, 243, 12, 15, 226, 242, - 12, 15, 226, 241, 12, 15, 226, 240, 12, 15, 226, 239, 12, 15, 226, 238, - 12, 15, 226, 237, 12, 15, 226, 236, 12, 15, 226, 235, 12, 15, 226, 234, - 12, 15, 226, 233, 12, 15, 226, 232, 12, 15, 226, 231, 12, 15, 226, 230, - 12, 15, 226, 229, 12, 15, 226, 228, 12, 15, 226, 227, 12, 15, 226, 226, - 12, 15, 226, 225, 12, 15, 226, 224, 12, 15, 226, 223, 12, 15, 226, 222, - 12, 15, 226, 221, 12, 15, 226, 220, 12, 15, 226, 219, 12, 15, 226, 218, - 12, 15, 226, 217, 12, 15, 226, 216, 12, 15, 226, 215, 12, 15, 226, 214, - 12, 15, 226, 213, 12, 15, 226, 212, 12, 15, 226, 211, 12, 15, 226, 210, - 12, 15, 226, 209, 12, 15, 226, 208, 12, 15, 226, 207, 12, 15, 226, 206, - 12, 15, 226, 205, 12, 15, 226, 204, 12, 15, 226, 203, 12, 15, 226, 202, - 12, 15, 226, 201, 12, 15, 226, 200, 12, 15, 226, 199, 12, 15, 226, 198, - 12, 15, 226, 197, 12, 15, 226, 196, 12, 15, 226, 195, 12, 15, 226, 194, - 12, 15, 226, 193, 12, 15, 226, 192, 12, 15, 226, 191, 12, 15, 226, 190, - 12, 15, 226, 189, 12, 15, 226, 188, 12, 15, 226, 187, 12, 15, 226, 186, - 12, 15, 226, 185, 12, 15, 226, 184, 12, 15, 226, 183, 12, 15, 226, 182, - 12, 15, 226, 181, 12, 15, 226, 180, 12, 15, 226, 179, 12, 15, 226, 178, - 12, 15, 226, 177, 12, 15, 226, 176, 12, 15, 226, 175, 12, 15, 226, 174, - 12, 15, 226, 173, 12, 15, 226, 172, 12, 15, 226, 171, 12, 15, 226, 170, - 12, 15, 226, 169, 12, 15, 226, 168, 12, 15, 226, 167, 12, 15, 226, 166, - 12, 15, 226, 165, 12, 15, 226, 164, 12, 15, 226, 163, 12, 15, 226, 162, - 12, 15, 226, 161, 12, 15, 226, 160, 12, 15, 226, 159, 12, 15, 226, 158, - 12, 15, 226, 157, 12, 15, 226, 156, 12, 15, 226, 155, 12, 15, 226, 154, - 12, 15, 226, 153, 12, 15, 226, 152, 12, 15, 226, 151, 8, 4, 33, 235, 156, - 8, 4, 33, 235, 152, 8, 4, 33, 235, 95, 8, 4, 33, 235, 155, 8, 4, 33, 235, - 154, 8, 4, 33, 181, 209, 81, 203, 216, 8, 4, 33, 205, 23, 250, 229, 4, - 33, 219, 164, 216, 3, 250, 229, 4, 33, 219, 164, 237, 59, 250, 229, 4, - 33, 219, 164, 226, 54, 250, 229, 4, 33, 199, 40, 216, 3, 250, 229, 4, 33, - 219, 164, 196, 200, 123, 1, 195, 242, 3, 232, 32, 123, 212, 110, 225, - 108, 199, 130, 123, 33, 196, 22, 195, 242, 195, 242, 213, 114, 123, 1, - 251, 125, 250, 116, 123, 1, 197, 62, 251, 163, 123, 1, 197, 62, 240, 100, - 123, 1, 197, 62, 232, 146, 123, 1, 197, 62, 225, 34, 123, 1, 197, 62, - 222, 240, 123, 1, 197, 62, 48, 219, 170, 123, 1, 197, 62, 210, 109, 123, - 1, 197, 62, 203, 85, 123, 1, 251, 125, 98, 55, 123, 1, 206, 212, 3, 206, - 212, 238, 252, 123, 1, 206, 212, 3, 206, 66, 238, 252, 123, 1, 206, 212, - 3, 240, 120, 26, 206, 212, 238, 252, 123, 1, 206, 212, 3, 240, 120, 26, - 206, 66, 238, 252, 123, 1, 151, 3, 213, 114, 123, 1, 151, 3, 211, 146, - 123, 1, 151, 3, 220, 41, 123, 1, 248, 208, 3, 240, 119, 123, 1, 233, 177, - 3, 240, 119, 123, 1, 240, 101, 3, 240, 119, 123, 1, 232, 147, 3, 220, 41, - 123, 1, 199, 123, 3, 240, 119, 123, 1, 195, 93, 3, 240, 119, 123, 1, 203, - 2, 3, 240, 119, 123, 1, 195, 242, 3, 240, 119, 123, 1, 48, 225, 35, 3, - 240, 119, 123, 1, 225, 35, 3, 240, 119, 123, 1, 222, 241, 3, 240, 119, - 123, 1, 219, 171, 3, 240, 119, 123, 1, 215, 138, 3, 240, 119, 123, 1, - 208, 226, 3, 240, 119, 123, 1, 48, 213, 92, 3, 240, 119, 123, 1, 213, 92, - 3, 240, 119, 123, 1, 201, 109, 3, 240, 119, 123, 1, 211, 106, 3, 240, - 119, 123, 1, 210, 110, 3, 240, 119, 123, 1, 206, 212, 3, 240, 119, 123, - 1, 203, 86, 3, 240, 119, 123, 1, 199, 123, 3, 231, 176, 123, 1, 248, 208, - 3, 210, 226, 123, 1, 225, 35, 3, 210, 226, 123, 1, 213, 92, 3, 210, 226, - 123, 33, 151, 222, 240, 9, 1, 151, 197, 135, 70, 20, 9, 1, 151, 197, 135, - 48, 20, 9, 1, 248, 249, 70, 20, 9, 1, 248, 249, 48, 20, 9, 1, 248, 249, - 84, 20, 9, 1, 248, 249, 219, 193, 20, 9, 1, 213, 72, 70, 20, 9, 1, 213, - 72, 48, 20, 9, 1, 213, 72, 84, 20, 9, 1, 213, 72, 219, 193, 20, 9, 1, - 248, 237, 70, 20, 9, 1, 248, 237, 48, 20, 9, 1, 248, 237, 84, 20, 9, 1, - 248, 237, 219, 193, 20, 9, 1, 201, 69, 70, 20, 9, 1, 201, 69, 48, 20, 9, - 1, 201, 69, 84, 20, 9, 1, 201, 69, 219, 193, 20, 9, 1, 203, 40, 70, 20, - 9, 1, 203, 40, 48, 20, 9, 1, 203, 40, 84, 20, 9, 1, 203, 40, 219, 193, + 29, 116, 206, 51, 29, 116, 206, 36, 29, 116, 206, 49, 29, 116, 213, 172, + 29, 116, 213, 173, 29, 116, 196, 42, 29, 116, 196, 45, 29, 116, 245, 4, + 29, 116, 245, 3, 29, 116, 205, 76, 29, 116, 212, 241, 29, 116, 212, 240, + 12, 15, 228, 111, 12, 15, 228, 110, 12, 15, 228, 109, 12, 15, 228, 108, + 12, 15, 228, 107, 12, 15, 228, 106, 12, 15, 228, 105, 12, 15, 228, 104, + 12, 15, 228, 103, 12, 15, 228, 102, 12, 15, 228, 101, 12, 15, 228, 100, + 12, 15, 228, 99, 12, 15, 228, 98, 12, 15, 228, 97, 12, 15, 228, 96, 12, + 15, 228, 95, 12, 15, 228, 94, 12, 15, 228, 93, 12, 15, 228, 92, 12, 15, + 228, 91, 12, 15, 228, 90, 12, 15, 228, 89, 12, 15, 228, 88, 12, 15, 228, + 87, 12, 15, 228, 86, 12, 15, 228, 85, 12, 15, 228, 84, 12, 15, 228, 83, + 12, 15, 228, 82, 12, 15, 228, 81, 12, 15, 228, 80, 12, 15, 228, 79, 12, + 15, 228, 78, 12, 15, 228, 77, 12, 15, 228, 76, 12, 15, 228, 75, 12, 15, + 228, 74, 12, 15, 228, 73, 12, 15, 228, 72, 12, 15, 228, 71, 12, 15, 228, + 70, 12, 15, 228, 69, 12, 15, 228, 68, 12, 15, 228, 67, 12, 15, 228, 66, + 12, 15, 228, 65, 12, 15, 228, 64, 12, 15, 228, 63, 12, 15, 228, 62, 12, + 15, 228, 61, 12, 15, 228, 60, 12, 15, 228, 59, 12, 15, 228, 58, 12, 15, + 228, 57, 12, 15, 228, 56, 12, 15, 228, 55, 12, 15, 228, 54, 12, 15, 228, + 53, 12, 15, 228, 52, 12, 15, 228, 51, 12, 15, 228, 50, 12, 15, 228, 49, + 12, 15, 228, 48, 12, 15, 228, 47, 12, 15, 228, 46, 12, 15, 228, 45, 12, + 15, 228, 44, 12, 15, 228, 43, 12, 15, 228, 42, 12, 15, 228, 41, 12, 15, + 228, 40, 12, 15, 228, 39, 12, 15, 228, 38, 12, 15, 228, 37, 12, 15, 228, + 36, 12, 15, 228, 35, 12, 15, 228, 34, 12, 15, 228, 33, 12, 15, 228, 32, + 12, 15, 228, 31, 12, 15, 228, 30, 12, 15, 228, 29, 12, 15, 228, 28, 12, + 15, 228, 27, 12, 15, 228, 26, 12, 15, 228, 25, 12, 15, 228, 24, 12, 15, + 228, 23, 12, 15, 228, 22, 12, 15, 228, 21, 12, 15, 228, 20, 12, 15, 228, + 19, 12, 15, 228, 18, 12, 15, 228, 17, 12, 15, 228, 16, 12, 15, 228, 15, + 12, 15, 228, 14, 12, 15, 228, 13, 12, 15, 228, 12, 12, 15, 228, 11, 12, + 15, 228, 10, 12, 15, 228, 9, 12, 15, 228, 8, 12, 15, 228, 7, 12, 15, 228, + 6, 12, 15, 228, 5, 12, 15, 228, 4, 12, 15, 228, 3, 12, 15, 228, 2, 12, + 15, 228, 1, 12, 15, 228, 0, 12, 15, 227, 255, 12, 15, 227, 254, 12, 15, + 227, 253, 12, 15, 227, 252, 12, 15, 227, 251, 12, 15, 227, 250, 12, 15, + 227, 249, 12, 15, 227, 248, 12, 15, 227, 247, 12, 15, 227, 246, 12, 15, + 227, 245, 12, 15, 227, 244, 12, 15, 227, 243, 12, 15, 227, 242, 12, 15, + 227, 241, 12, 15, 227, 240, 12, 15, 227, 239, 12, 15, 227, 238, 12, 15, + 227, 237, 12, 15, 227, 236, 12, 15, 227, 235, 12, 15, 227, 234, 12, 15, + 227, 233, 12, 15, 227, 232, 12, 15, 227, 231, 12, 15, 227, 230, 12, 15, + 227, 229, 12, 15, 227, 228, 12, 15, 227, 227, 12, 15, 227, 226, 12, 15, + 227, 225, 12, 15, 227, 224, 12, 15, 227, 223, 12, 15, 227, 222, 12, 15, + 227, 221, 12, 15, 227, 220, 12, 15, 227, 219, 12, 15, 227, 218, 12, 15, + 227, 217, 12, 15, 227, 216, 12, 15, 227, 215, 12, 15, 227, 214, 12, 15, + 227, 213, 12, 15, 227, 212, 12, 15, 227, 211, 12, 15, 227, 210, 12, 15, + 227, 209, 12, 15, 227, 208, 12, 15, 227, 207, 12, 15, 227, 206, 12, 15, + 227, 205, 12, 15, 227, 204, 12, 15, 227, 203, 12, 15, 227, 202, 12, 15, + 227, 201, 12, 15, 227, 200, 12, 15, 227, 199, 12, 15, 227, 198, 12, 15, + 227, 197, 12, 15, 227, 196, 12, 15, 227, 195, 12, 15, 227, 194, 12, 15, + 227, 193, 12, 15, 227, 192, 12, 15, 227, 191, 12, 15, 227, 190, 12, 15, + 227, 189, 12, 15, 227, 188, 12, 15, 227, 187, 12, 15, 227, 186, 12, 15, + 227, 185, 12, 15, 227, 184, 12, 15, 227, 183, 12, 15, 227, 182, 12, 15, + 227, 181, 12, 15, 227, 180, 12, 15, 227, 179, 12, 15, 227, 178, 12, 15, + 227, 177, 12, 15, 227, 176, 12, 15, 227, 175, 12, 15, 227, 174, 12, 15, + 227, 173, 12, 15, 227, 172, 12, 15, 227, 171, 12, 15, 227, 170, 12, 15, + 227, 169, 12, 15, 227, 168, 12, 15, 227, 167, 12, 15, 227, 166, 12, 15, + 227, 165, 12, 15, 227, 164, 12, 15, 227, 163, 12, 15, 227, 162, 12, 15, + 227, 161, 12, 15, 227, 160, 12, 15, 227, 159, 12, 15, 227, 158, 12, 15, + 227, 157, 12, 15, 227, 156, 12, 15, 227, 155, 12, 15, 227, 154, 12, 15, + 227, 153, 12, 15, 227, 152, 12, 15, 227, 151, 12, 15, 227, 150, 12, 15, + 227, 149, 12, 15, 227, 148, 12, 15, 227, 147, 12, 15, 227, 146, 12, 15, + 227, 145, 12, 15, 227, 144, 12, 15, 227, 143, 12, 15, 227, 142, 12, 15, + 227, 141, 12, 15, 227, 140, 12, 15, 227, 139, 12, 15, 227, 138, 12, 15, + 227, 137, 12, 15, 227, 136, 12, 15, 227, 135, 12, 15, 227, 134, 12, 15, + 227, 133, 12, 15, 227, 132, 12, 15, 227, 131, 12, 15, 227, 130, 12, 15, + 227, 129, 12, 15, 227, 128, 12, 15, 227, 127, 12, 15, 227, 126, 12, 15, + 227, 125, 12, 15, 227, 124, 12, 15, 227, 123, 12, 15, 227, 122, 12, 15, + 227, 121, 12, 15, 227, 120, 12, 15, 227, 119, 12, 15, 227, 118, 12, 15, + 227, 117, 12, 15, 227, 116, 12, 15, 227, 115, 12, 15, 227, 114, 12, 15, + 227, 113, 12, 15, 227, 112, 12, 15, 227, 111, 12, 15, 227, 110, 12, 15, + 227, 109, 12, 15, 227, 108, 12, 15, 227, 107, 12, 15, 227, 106, 12, 15, + 227, 105, 12, 15, 227, 104, 12, 15, 227, 103, 12, 15, 227, 102, 12, 15, + 227, 101, 12, 15, 227, 100, 12, 15, 227, 99, 12, 15, 227, 98, 12, 15, + 227, 97, 12, 15, 227, 96, 12, 15, 227, 95, 12, 15, 227, 94, 12, 15, 227, + 93, 12, 15, 227, 92, 12, 15, 227, 91, 12, 15, 227, 90, 12, 15, 227, 89, + 12, 15, 227, 88, 12, 15, 227, 87, 12, 15, 227, 86, 12, 15, 227, 85, 12, + 15, 227, 84, 12, 15, 227, 83, 12, 15, 227, 82, 12, 15, 227, 81, 12, 15, + 227, 80, 12, 15, 227, 79, 12, 15, 227, 78, 12, 15, 227, 77, 12, 15, 227, + 76, 12, 15, 227, 75, 12, 15, 227, 74, 12, 15, 227, 73, 12, 15, 227, 72, + 12, 15, 227, 71, 12, 15, 227, 70, 12, 15, 227, 69, 12, 15, 227, 68, 12, + 15, 227, 67, 12, 15, 227, 66, 12, 15, 227, 65, 12, 15, 227, 64, 12, 15, + 227, 63, 12, 15, 227, 62, 12, 15, 227, 61, 12, 15, 227, 60, 12, 15, 227, + 59, 12, 15, 227, 58, 12, 15, 227, 57, 12, 15, 227, 56, 12, 15, 227, 55, + 12, 15, 227, 54, 12, 15, 227, 53, 12, 15, 227, 52, 12, 15, 227, 51, 12, + 15, 227, 50, 12, 15, 227, 49, 12, 15, 227, 48, 12, 15, 227, 47, 12, 15, + 227, 46, 12, 15, 227, 45, 12, 15, 227, 44, 12, 15, 227, 43, 12, 15, 227, + 42, 12, 15, 227, 41, 12, 15, 227, 40, 12, 15, 227, 39, 12, 15, 227, 38, + 12, 15, 227, 37, 12, 15, 227, 36, 12, 15, 227, 35, 12, 15, 227, 34, 12, + 15, 227, 33, 12, 15, 227, 32, 12, 15, 227, 31, 12, 15, 227, 30, 12, 15, + 227, 29, 12, 15, 227, 28, 12, 15, 227, 27, 12, 15, 227, 26, 12, 15, 227, + 25, 12, 15, 227, 24, 12, 15, 227, 23, 12, 15, 227, 22, 12, 15, 227, 21, + 12, 15, 227, 20, 12, 15, 227, 19, 12, 15, 227, 18, 12, 15, 227, 17, 12, + 15, 227, 16, 12, 15, 227, 15, 12, 15, 227, 14, 12, 15, 227, 13, 12, 15, + 227, 12, 12, 15, 227, 11, 12, 15, 227, 10, 12, 15, 227, 9, 12, 15, 227, + 8, 12, 15, 227, 7, 12, 15, 227, 6, 12, 15, 227, 5, 12, 15, 227, 4, 12, + 15, 227, 3, 12, 15, 227, 2, 12, 15, 227, 1, 12, 15, 227, 0, 12, 15, 226, + 255, 12, 15, 226, 254, 12, 15, 226, 253, 12, 15, 226, 252, 12, 15, 226, + 251, 12, 15, 226, 250, 12, 15, 226, 249, 12, 15, 226, 248, 12, 15, 226, + 247, 12, 15, 226, 246, 12, 15, 226, 245, 12, 15, 226, 244, 12, 15, 226, + 243, 12, 15, 226, 242, 12, 15, 226, 241, 12, 15, 226, 240, 12, 15, 226, + 239, 12, 15, 226, 238, 12, 15, 226, 237, 12, 15, 226, 236, 12, 15, 226, + 235, 12, 15, 226, 234, 12, 15, 226, 233, 12, 15, 226, 232, 12, 15, 226, + 231, 12, 15, 226, 230, 12, 15, 226, 229, 12, 15, 226, 228, 12, 15, 226, + 227, 12, 15, 226, 226, 12, 15, 226, 225, 12, 15, 226, 224, 12, 15, 226, + 223, 12, 15, 226, 222, 12, 15, 226, 221, 12, 15, 226, 220, 12, 15, 226, + 219, 12, 15, 226, 218, 12, 15, 226, 217, 12, 15, 226, 216, 12, 15, 226, + 215, 12, 15, 226, 214, 12, 15, 226, 213, 12, 15, 226, 212, 12, 15, 226, + 211, 12, 15, 226, 210, 12, 15, 226, 209, 12, 15, 226, 208, 12, 15, 226, + 207, 12, 15, 226, 206, 12, 15, 226, 205, 12, 15, 226, 204, 12, 15, 226, + 203, 12, 15, 226, 202, 12, 15, 226, 201, 12, 15, 226, 200, 12, 15, 226, + 199, 12, 15, 226, 198, 12, 15, 226, 197, 12, 15, 226, 196, 12, 15, 226, + 195, 12, 15, 226, 194, 12, 15, 226, 193, 12, 15, 226, 192, 12, 15, 226, + 191, 12, 15, 226, 190, 12, 15, 226, 189, 12, 15, 226, 188, 12, 15, 226, + 187, 12, 15, 226, 186, 12, 15, 226, 185, 12, 15, 226, 184, 12, 15, 226, + 183, 12, 15, 226, 182, 12, 15, 226, 181, 12, 15, 226, 180, 12, 15, 226, + 179, 12, 15, 226, 178, 12, 15, 226, 177, 12, 15, 226, 176, 12, 15, 226, + 175, 12, 15, 226, 174, 12, 15, 226, 173, 12, 15, 226, 172, 12, 15, 226, + 171, 12, 15, 226, 170, 12, 15, 226, 169, 12, 15, 226, 168, 12, 15, 226, + 167, 12, 15, 226, 166, 12, 15, 226, 165, 12, 15, 226, 164, 12, 15, 226, + 163, 12, 15, 226, 162, 12, 15, 226, 161, 12, 15, 226, 160, 12, 15, 226, + 159, 12, 15, 226, 158, 12, 15, 226, 157, 12, 15, 226, 156, 12, 15, 226, + 155, 12, 15, 226, 154, 12, 15, 226, 153, 12, 15, 226, 152, 8, 4, 33, 235, + 157, 8, 4, 33, 235, 153, 8, 4, 33, 235, 96, 8, 4, 33, 235, 156, 8, 4, 33, + 235, 155, 8, 4, 33, 181, 209, 81, 203, 216, 8, 4, 33, 205, 23, 250, 230, + 4, 33, 219, 165, 216, 4, 250, 230, 4, 33, 219, 165, 237, 60, 250, 230, 4, + 33, 219, 165, 226, 55, 250, 230, 4, 33, 199, 40, 216, 4, 250, 230, 4, 33, + 219, 165, 196, 200, 123, 1, 195, 242, 3, 232, 33, 123, 212, 111, 225, + 109, 199, 130, 123, 33, 196, 22, 195, 242, 195, 242, 213, 115, 123, 1, + 251, 126, 250, 117, 123, 1, 197, 62, 251, 164, 123, 1, 197, 62, 240, 101, + 123, 1, 197, 62, 232, 147, 123, 1, 197, 62, 225, 35, 123, 1, 197, 62, + 222, 241, 123, 1, 197, 62, 48, 219, 171, 123, 1, 197, 62, 210, 109, 123, + 1, 197, 62, 203, 85, 123, 1, 251, 126, 98, 55, 123, 1, 206, 212, 3, 206, + 212, 238, 253, 123, 1, 206, 212, 3, 206, 66, 238, 253, 123, 1, 206, 212, + 3, 240, 121, 26, 206, 212, 238, 253, 123, 1, 206, 212, 3, 240, 121, 26, + 206, 66, 238, 253, 123, 1, 151, 3, 213, 115, 123, 1, 151, 3, 211, 147, + 123, 1, 151, 3, 220, 42, 123, 1, 248, 209, 3, 240, 120, 123, 1, 233, 178, + 3, 240, 120, 123, 1, 240, 102, 3, 240, 120, 123, 1, 232, 148, 3, 220, 42, + 123, 1, 199, 123, 3, 240, 120, 123, 1, 195, 93, 3, 240, 120, 123, 1, 203, + 2, 3, 240, 120, 123, 1, 195, 242, 3, 240, 120, 123, 1, 48, 225, 36, 3, + 240, 120, 123, 1, 225, 36, 3, 240, 120, 123, 1, 222, 242, 3, 240, 120, + 123, 1, 219, 172, 3, 240, 120, 123, 1, 215, 139, 3, 240, 120, 123, 1, + 208, 226, 3, 240, 120, 123, 1, 48, 213, 93, 3, 240, 120, 123, 1, 213, 93, + 3, 240, 120, 123, 1, 201, 109, 3, 240, 120, 123, 1, 211, 107, 3, 240, + 120, 123, 1, 210, 110, 3, 240, 120, 123, 1, 206, 212, 3, 240, 120, 123, + 1, 203, 86, 3, 240, 120, 123, 1, 199, 123, 3, 231, 177, 123, 1, 248, 209, + 3, 210, 227, 123, 1, 225, 36, 3, 210, 227, 123, 1, 213, 93, 3, 210, 227, + 123, 33, 151, 222, 241, 9, 1, 151, 197, 135, 70, 20, 9, 1, 151, 197, 135, + 48, 20, 9, 1, 248, 250, 70, 20, 9, 1, 248, 250, 48, 20, 9, 1, 248, 250, + 84, 20, 9, 1, 248, 250, 219, 194, 20, 9, 1, 213, 73, 70, 20, 9, 1, 213, + 73, 48, 20, 9, 1, 213, 73, 84, 20, 9, 1, 213, 73, 219, 194, 20, 9, 1, + 248, 238, 70, 20, 9, 1, 248, 238, 48, 20, 9, 1, 248, 238, 84, 20, 9, 1, + 248, 238, 219, 194, 20, 9, 1, 201, 69, 70, 20, 9, 1, 201, 69, 48, 20, 9, + 1, 201, 69, 84, 20, 9, 1, 201, 69, 219, 194, 20, 9, 1, 203, 40, 70, 20, + 9, 1, 203, 40, 48, 20, 9, 1, 203, 40, 84, 20, 9, 1, 203, 40, 219, 194, 20, 9, 1, 201, 71, 70, 20, 9, 1, 201, 71, 48, 20, 9, 1, 201, 71, 84, 20, - 9, 1, 201, 71, 219, 193, 20, 9, 1, 199, 112, 70, 20, 9, 1, 199, 112, 48, - 20, 9, 1, 199, 112, 84, 20, 9, 1, 199, 112, 219, 193, 20, 9, 1, 213, 70, - 70, 20, 9, 1, 213, 70, 48, 20, 9, 1, 213, 70, 84, 20, 9, 1, 213, 70, 219, - 193, 20, 9, 1, 237, 162, 70, 20, 9, 1, 237, 162, 48, 20, 9, 1, 237, 162, - 84, 20, 9, 1, 237, 162, 219, 193, 20, 9, 1, 215, 95, 70, 20, 9, 1, 215, - 95, 48, 20, 9, 1, 215, 95, 84, 20, 9, 1, 215, 95, 219, 193, 20, 9, 1, + 9, 1, 201, 71, 219, 194, 20, 9, 1, 199, 112, 70, 20, 9, 1, 199, 112, 48, + 20, 9, 1, 199, 112, 84, 20, 9, 1, 199, 112, 219, 194, 20, 9, 1, 213, 71, + 70, 20, 9, 1, 213, 71, 48, 20, 9, 1, 213, 71, 84, 20, 9, 1, 213, 71, 219, + 194, 20, 9, 1, 237, 163, 70, 20, 9, 1, 237, 163, 48, 20, 9, 1, 237, 163, + 84, 20, 9, 1, 237, 163, 219, 194, 20, 9, 1, 215, 96, 70, 20, 9, 1, 215, + 96, 48, 20, 9, 1, 215, 96, 84, 20, 9, 1, 215, 96, 219, 194, 20, 9, 1, 203, 73, 70, 20, 9, 1, 203, 73, 48, 20, 9, 1, 203, 73, 84, 20, 9, 1, 203, - 73, 219, 193, 20, 9, 1, 203, 71, 70, 20, 9, 1, 203, 71, 48, 20, 9, 1, - 203, 71, 84, 20, 9, 1, 203, 71, 219, 193, 20, 9, 1, 240, 38, 70, 20, 9, - 1, 240, 38, 48, 20, 9, 1, 240, 114, 70, 20, 9, 1, 240, 114, 48, 20, 9, 1, - 237, 191, 70, 20, 9, 1, 237, 191, 48, 20, 9, 1, 240, 36, 70, 20, 9, 1, - 240, 36, 48, 20, 9, 1, 225, 186, 70, 20, 9, 1, 225, 186, 48, 20, 9, 1, - 209, 174, 70, 20, 9, 1, 209, 174, 48, 20, 9, 1, 224, 191, 70, 20, 9, 1, - 224, 191, 48, 20, 9, 1, 224, 191, 84, 20, 9, 1, 224, 191, 219, 193, 20, - 9, 1, 234, 110, 70, 20, 9, 1, 234, 110, 48, 20, 9, 1, 234, 110, 84, 20, - 9, 1, 234, 110, 219, 193, 20, 9, 1, 233, 63, 70, 20, 9, 1, 233, 63, 48, - 20, 9, 1, 233, 63, 84, 20, 9, 1, 233, 63, 219, 193, 20, 9, 1, 216, 250, - 70, 20, 9, 1, 216, 250, 48, 20, 9, 1, 216, 250, 84, 20, 9, 1, 216, 250, - 219, 193, 20, 9, 1, 216, 31, 233, 196, 70, 20, 9, 1, 216, 31, 233, 196, + 73, 219, 194, 20, 9, 1, 203, 71, 70, 20, 9, 1, 203, 71, 48, 20, 9, 1, + 203, 71, 84, 20, 9, 1, 203, 71, 219, 194, 20, 9, 1, 240, 39, 70, 20, 9, + 1, 240, 39, 48, 20, 9, 1, 240, 115, 70, 20, 9, 1, 240, 115, 48, 20, 9, 1, + 237, 192, 70, 20, 9, 1, 237, 192, 48, 20, 9, 1, 240, 37, 70, 20, 9, 1, + 240, 37, 48, 20, 9, 1, 225, 187, 70, 20, 9, 1, 225, 187, 48, 20, 9, 1, + 209, 174, 70, 20, 9, 1, 209, 174, 48, 20, 9, 1, 224, 192, 70, 20, 9, 1, + 224, 192, 48, 20, 9, 1, 224, 192, 84, 20, 9, 1, 224, 192, 219, 194, 20, + 9, 1, 234, 111, 70, 20, 9, 1, 234, 111, 48, 20, 9, 1, 234, 111, 84, 20, + 9, 1, 234, 111, 219, 194, 20, 9, 1, 233, 64, 70, 20, 9, 1, 233, 64, 48, + 20, 9, 1, 233, 64, 84, 20, 9, 1, 233, 64, 219, 194, 20, 9, 1, 216, 251, + 70, 20, 9, 1, 216, 251, 48, 20, 9, 1, 216, 251, 84, 20, 9, 1, 216, 251, + 219, 194, 20, 9, 1, 216, 32, 233, 197, 70, 20, 9, 1, 216, 32, 233, 197, 48, 20, 9, 1, 209, 236, 70, 20, 9, 1, 209, 236, 48, 20, 9, 1, 209, 236, - 84, 20, 9, 1, 209, 236, 219, 193, 20, 9, 1, 232, 113, 3, 93, 90, 70, 20, - 9, 1, 232, 113, 3, 93, 90, 48, 20, 9, 1, 232, 113, 233, 141, 70, 20, 9, - 1, 232, 113, 233, 141, 48, 20, 9, 1, 232, 113, 233, 141, 84, 20, 9, 1, - 232, 113, 233, 141, 219, 193, 20, 9, 1, 232, 113, 239, 24, 70, 20, 9, 1, - 232, 113, 239, 24, 48, 20, 9, 1, 232, 113, 239, 24, 84, 20, 9, 1, 232, - 113, 239, 24, 219, 193, 20, 9, 1, 93, 249, 72, 70, 20, 9, 1, 93, 249, 72, - 48, 20, 9, 1, 93, 249, 72, 3, 232, 213, 90, 70, 20, 9, 1, 93, 249, 72, 3, - 232, 213, 90, 48, 20, 9, 16, 76, 57, 9, 16, 76, 60, 9, 16, 99, 238, 250, - 57, 9, 16, 99, 238, 250, 60, 9, 16, 115, 238, 250, 57, 9, 16, 115, 238, - 250, 60, 9, 16, 115, 238, 250, 212, 106, 237, 230, 57, 9, 16, 115, 238, - 250, 212, 106, 237, 230, 60, 9, 16, 235, 6, 238, 250, 57, 9, 16, 235, 6, - 238, 250, 60, 9, 16, 52, 83, 249, 79, 60, 9, 16, 99, 238, 250, 199, 50, - 57, 9, 16, 99, 238, 250, 199, 50, 60, 9, 16, 210, 2, 9, 16, 4, 203, 140, - 57, 9, 16, 4, 203, 140, 60, 9, 1, 217, 73, 70, 20, 9, 1, 217, 73, 48, 20, - 9, 1, 217, 73, 84, 20, 9, 1, 217, 73, 219, 193, 20, 9, 1, 118, 70, 20, 9, - 1, 118, 48, 20, 9, 1, 214, 164, 70, 20, 9, 1, 214, 164, 48, 20, 9, 1, - 195, 218, 70, 20, 9, 1, 195, 218, 48, 20, 9, 1, 118, 3, 232, 213, 90, 70, - 20, 9, 1, 199, 119, 70, 20, 9, 1, 199, 119, 48, 20, 9, 1, 224, 66, 214, - 164, 70, 20, 9, 1, 224, 66, 214, 164, 48, 20, 9, 1, 224, 66, 195, 218, - 70, 20, 9, 1, 224, 66, 195, 218, 48, 20, 9, 1, 237, 135, 70, 20, 9, 1, - 237, 135, 48, 20, 9, 1, 237, 135, 84, 20, 9, 1, 237, 135, 219, 193, 20, - 9, 1, 200, 89, 224, 212, 224, 66, 151, 220, 69, 84, 20, 9, 1, 200, 89, - 224, 212, 224, 66, 151, 220, 69, 219, 193, 20, 9, 33, 93, 3, 232, 213, - 90, 3, 151, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 151, 48, 20, 9, 33, - 93, 3, 232, 213, 90, 3, 251, 245, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, - 251, 245, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 197, 118, 70, 20, 9, 33, - 93, 3, 232, 213, 90, 3, 197, 118, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, - 118, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 118, 48, 20, 9, 33, 93, 3, - 232, 213, 90, 3, 214, 164, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 214, - 164, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 195, 218, 70, 20, 9, 33, 93, - 3, 232, 213, 90, 3, 195, 218, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 237, - 135, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 237, 135, 48, 20, 9, 33, 93, - 3, 232, 213, 90, 3, 237, 135, 84, 20, 9, 33, 200, 89, 224, 66, 93, 3, - 232, 213, 90, 3, 151, 220, 69, 70, 20, 9, 33, 200, 89, 224, 66, 93, 3, - 232, 213, 90, 3, 151, 220, 69, 48, 20, 9, 33, 200, 89, 224, 66, 93, 3, - 232, 213, 90, 3, 151, 220, 69, 84, 20, 9, 1, 235, 203, 93, 70, 20, 9, 1, - 235, 203, 93, 48, 20, 9, 1, 235, 203, 93, 84, 20, 9, 1, 235, 203, 93, - 219, 193, 20, 9, 33, 93, 3, 232, 213, 90, 3, 225, 189, 70, 20, 9, 33, 93, - 3, 232, 213, 90, 3, 168, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 87, 70, - 20, 9, 33, 93, 3, 232, 213, 90, 3, 151, 220, 69, 70, 20, 9, 33, 93, 3, - 232, 213, 90, 3, 93, 70, 20, 9, 33, 248, 239, 3, 225, 189, 70, 20, 9, 33, - 248, 239, 3, 168, 70, 20, 9, 33, 248, 239, 3, 224, 142, 70, 20, 9, 33, - 248, 239, 3, 87, 70, 20, 9, 33, 248, 239, 3, 151, 220, 69, 70, 20, 9, 33, - 248, 239, 3, 93, 70, 20, 9, 33, 203, 42, 3, 225, 189, 70, 20, 9, 33, 203, - 42, 3, 168, 70, 20, 9, 33, 203, 42, 3, 224, 142, 70, 20, 9, 33, 203, 42, - 3, 87, 70, 20, 9, 33, 203, 42, 3, 151, 220, 69, 70, 20, 9, 33, 203, 42, - 3, 93, 70, 20, 9, 33, 202, 214, 3, 225, 189, 70, 20, 9, 33, 202, 214, 3, - 87, 70, 20, 9, 33, 202, 214, 3, 151, 220, 69, 70, 20, 9, 33, 202, 214, 3, - 93, 70, 20, 9, 33, 225, 189, 3, 168, 70, 20, 9, 33, 225, 189, 3, 87, 70, - 20, 9, 33, 168, 3, 225, 189, 70, 20, 9, 33, 168, 3, 87, 70, 20, 9, 33, - 224, 142, 3, 225, 189, 70, 20, 9, 33, 224, 142, 3, 168, 70, 20, 9, 33, - 224, 142, 3, 87, 70, 20, 9, 33, 208, 126, 3, 225, 189, 70, 20, 9, 33, - 208, 126, 3, 168, 70, 20, 9, 33, 208, 126, 3, 224, 142, 70, 20, 9, 33, + 84, 20, 9, 1, 209, 236, 219, 194, 20, 9, 1, 232, 114, 3, 93, 90, 70, 20, + 9, 1, 232, 114, 3, 93, 90, 48, 20, 9, 1, 232, 114, 233, 142, 70, 20, 9, + 1, 232, 114, 233, 142, 48, 20, 9, 1, 232, 114, 233, 142, 84, 20, 9, 1, + 232, 114, 233, 142, 219, 194, 20, 9, 1, 232, 114, 239, 25, 70, 20, 9, 1, + 232, 114, 239, 25, 48, 20, 9, 1, 232, 114, 239, 25, 84, 20, 9, 1, 232, + 114, 239, 25, 219, 194, 20, 9, 1, 93, 249, 73, 70, 20, 9, 1, 93, 249, 73, + 48, 20, 9, 1, 93, 249, 73, 3, 232, 214, 90, 70, 20, 9, 1, 93, 249, 73, 3, + 232, 214, 90, 48, 20, 9, 16, 76, 57, 9, 16, 76, 60, 9, 16, 99, 238, 251, + 57, 9, 16, 99, 238, 251, 60, 9, 16, 115, 238, 251, 57, 9, 16, 115, 238, + 251, 60, 9, 16, 115, 238, 251, 212, 107, 237, 231, 57, 9, 16, 115, 238, + 251, 212, 107, 237, 231, 60, 9, 16, 235, 7, 238, 251, 57, 9, 16, 235, 7, + 238, 251, 60, 9, 16, 52, 83, 249, 80, 60, 9, 16, 99, 238, 251, 199, 50, + 57, 9, 16, 99, 238, 251, 199, 50, 60, 9, 16, 210, 2, 9, 16, 4, 203, 140, + 57, 9, 16, 4, 203, 140, 60, 9, 1, 217, 74, 70, 20, 9, 1, 217, 74, 48, 20, + 9, 1, 217, 74, 84, 20, 9, 1, 217, 74, 219, 194, 20, 9, 1, 118, 70, 20, 9, + 1, 118, 48, 20, 9, 1, 214, 165, 70, 20, 9, 1, 214, 165, 48, 20, 9, 1, + 195, 218, 70, 20, 9, 1, 195, 218, 48, 20, 9, 1, 118, 3, 232, 214, 90, 70, + 20, 9, 1, 199, 119, 70, 20, 9, 1, 199, 119, 48, 20, 9, 1, 224, 67, 214, + 165, 70, 20, 9, 1, 224, 67, 214, 165, 48, 20, 9, 1, 224, 67, 195, 218, + 70, 20, 9, 1, 224, 67, 195, 218, 48, 20, 9, 1, 237, 136, 70, 20, 9, 1, + 237, 136, 48, 20, 9, 1, 237, 136, 84, 20, 9, 1, 237, 136, 219, 194, 20, + 9, 1, 200, 89, 224, 213, 224, 67, 151, 220, 70, 84, 20, 9, 1, 200, 89, + 224, 213, 224, 67, 151, 220, 70, 219, 194, 20, 9, 33, 93, 3, 232, 214, + 90, 3, 151, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 151, 48, 20, 9, 33, + 93, 3, 232, 214, 90, 3, 251, 246, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, + 251, 246, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 197, 118, 70, 20, 9, 33, + 93, 3, 232, 214, 90, 3, 197, 118, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, + 118, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 118, 48, 20, 9, 33, 93, 3, + 232, 214, 90, 3, 214, 165, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 214, + 165, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 195, 218, 70, 20, 9, 33, 93, + 3, 232, 214, 90, 3, 195, 218, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 237, + 136, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 237, 136, 48, 20, 9, 33, 93, + 3, 232, 214, 90, 3, 237, 136, 84, 20, 9, 33, 200, 89, 224, 67, 93, 3, + 232, 214, 90, 3, 151, 220, 70, 70, 20, 9, 33, 200, 89, 224, 67, 93, 3, + 232, 214, 90, 3, 151, 220, 70, 48, 20, 9, 33, 200, 89, 224, 67, 93, 3, + 232, 214, 90, 3, 151, 220, 70, 84, 20, 9, 1, 235, 204, 93, 70, 20, 9, 1, + 235, 204, 93, 48, 20, 9, 1, 235, 204, 93, 84, 20, 9, 1, 235, 204, 93, + 219, 194, 20, 9, 33, 93, 3, 232, 214, 90, 3, 225, 190, 70, 20, 9, 33, 93, + 3, 232, 214, 90, 3, 168, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 87, 70, + 20, 9, 33, 93, 3, 232, 214, 90, 3, 151, 220, 70, 70, 20, 9, 33, 93, 3, + 232, 214, 90, 3, 93, 70, 20, 9, 33, 248, 240, 3, 225, 190, 70, 20, 9, 33, + 248, 240, 3, 168, 70, 20, 9, 33, 248, 240, 3, 224, 143, 70, 20, 9, 33, + 248, 240, 3, 87, 70, 20, 9, 33, 248, 240, 3, 151, 220, 70, 70, 20, 9, 33, + 248, 240, 3, 93, 70, 20, 9, 33, 203, 42, 3, 225, 190, 70, 20, 9, 33, 203, + 42, 3, 168, 70, 20, 9, 33, 203, 42, 3, 224, 143, 70, 20, 9, 33, 203, 42, + 3, 87, 70, 20, 9, 33, 203, 42, 3, 151, 220, 70, 70, 20, 9, 33, 203, 42, + 3, 93, 70, 20, 9, 33, 202, 214, 3, 225, 190, 70, 20, 9, 33, 202, 214, 3, + 87, 70, 20, 9, 33, 202, 214, 3, 151, 220, 70, 70, 20, 9, 33, 202, 214, 3, + 93, 70, 20, 9, 33, 225, 190, 3, 168, 70, 20, 9, 33, 225, 190, 3, 87, 70, + 20, 9, 33, 168, 3, 225, 190, 70, 20, 9, 33, 168, 3, 87, 70, 20, 9, 33, + 224, 143, 3, 225, 190, 70, 20, 9, 33, 224, 143, 3, 168, 70, 20, 9, 33, + 224, 143, 3, 87, 70, 20, 9, 33, 208, 126, 3, 225, 190, 70, 20, 9, 33, + 208, 126, 3, 168, 70, 20, 9, 33, 208, 126, 3, 224, 143, 70, 20, 9, 33, 208, 126, 3, 87, 70, 20, 9, 33, 209, 9, 3, 168, 70, 20, 9, 33, 209, 9, 3, - 87, 70, 20, 9, 33, 240, 130, 3, 225, 189, 70, 20, 9, 33, 240, 130, 3, - 168, 70, 20, 9, 33, 240, 130, 3, 224, 142, 70, 20, 9, 33, 240, 130, 3, + 87, 70, 20, 9, 33, 240, 131, 3, 225, 190, 70, 20, 9, 33, 240, 131, 3, + 168, 70, 20, 9, 33, 240, 131, 3, 224, 143, 70, 20, 9, 33, 240, 131, 3, 87, 70, 20, 9, 33, 203, 140, 3, 168, 70, 20, 9, 33, 203, 140, 3, 87, 70, - 20, 9, 33, 195, 110, 3, 87, 70, 20, 9, 33, 251, 194, 3, 225, 189, 70, 20, - 9, 33, 251, 194, 3, 87, 70, 20, 9, 33, 233, 225, 3, 225, 189, 70, 20, 9, - 33, 233, 225, 3, 87, 70, 20, 9, 33, 235, 176, 3, 225, 189, 70, 20, 9, 33, - 235, 176, 3, 168, 70, 20, 9, 33, 235, 176, 3, 224, 142, 70, 20, 9, 33, - 235, 176, 3, 87, 70, 20, 9, 33, 235, 176, 3, 151, 220, 69, 70, 20, 9, 33, - 235, 176, 3, 93, 70, 20, 9, 33, 211, 152, 3, 168, 70, 20, 9, 33, 211, - 152, 3, 87, 70, 20, 9, 33, 211, 152, 3, 151, 220, 69, 70, 20, 9, 33, 211, - 152, 3, 93, 70, 20, 9, 33, 225, 35, 3, 151, 70, 20, 9, 33, 225, 35, 3, - 225, 189, 70, 20, 9, 33, 225, 35, 3, 168, 70, 20, 9, 33, 225, 35, 3, 224, - 142, 70, 20, 9, 33, 225, 35, 3, 222, 249, 70, 20, 9, 33, 225, 35, 3, 87, - 70, 20, 9, 33, 225, 35, 3, 151, 220, 69, 70, 20, 9, 33, 225, 35, 3, 93, - 70, 20, 9, 33, 222, 249, 3, 225, 189, 70, 20, 9, 33, 222, 249, 3, 168, - 70, 20, 9, 33, 222, 249, 3, 224, 142, 70, 20, 9, 33, 222, 249, 3, 87, 70, - 20, 9, 33, 222, 249, 3, 151, 220, 69, 70, 20, 9, 33, 222, 249, 3, 93, 70, - 20, 9, 33, 87, 3, 225, 189, 70, 20, 9, 33, 87, 3, 168, 70, 20, 9, 33, 87, - 3, 224, 142, 70, 20, 9, 33, 87, 3, 87, 70, 20, 9, 33, 87, 3, 151, 220, - 69, 70, 20, 9, 33, 87, 3, 93, 70, 20, 9, 33, 216, 31, 3, 225, 189, 70, - 20, 9, 33, 216, 31, 3, 168, 70, 20, 9, 33, 216, 31, 3, 224, 142, 70, 20, - 9, 33, 216, 31, 3, 87, 70, 20, 9, 33, 216, 31, 3, 151, 220, 69, 70, 20, - 9, 33, 216, 31, 3, 93, 70, 20, 9, 33, 232, 113, 3, 225, 189, 70, 20, 9, - 33, 232, 113, 3, 87, 70, 20, 9, 33, 232, 113, 3, 151, 220, 69, 70, 20, 9, - 33, 232, 113, 3, 93, 70, 20, 9, 33, 93, 3, 225, 189, 70, 20, 9, 33, 93, - 3, 168, 70, 20, 9, 33, 93, 3, 224, 142, 70, 20, 9, 33, 93, 3, 87, 70, 20, - 9, 33, 93, 3, 151, 220, 69, 70, 20, 9, 33, 93, 3, 93, 70, 20, 9, 33, 202, - 226, 3, 204, 95, 151, 70, 20, 9, 33, 210, 142, 3, 204, 95, 151, 70, 20, - 9, 33, 151, 220, 69, 3, 204, 95, 151, 70, 20, 9, 33, 207, 41, 3, 240, 93, - 70, 20, 9, 33, 207, 41, 3, 224, 236, 70, 20, 9, 33, 207, 41, 3, 235, 200, - 70, 20, 9, 33, 207, 41, 3, 240, 95, 70, 20, 9, 33, 207, 41, 3, 224, 238, - 70, 20, 9, 33, 207, 41, 3, 204, 95, 151, 70, 20, 9, 33, 93, 3, 232, 213, - 90, 3, 210, 142, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 195, 107, 48, 20, - 9, 33, 93, 3, 232, 213, 90, 3, 87, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, - 216, 31, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 151, 220, 69, 48, 20, 9, - 33, 93, 3, 232, 213, 90, 3, 93, 48, 20, 9, 33, 248, 239, 3, 210, 142, 48, - 20, 9, 33, 248, 239, 3, 195, 107, 48, 20, 9, 33, 248, 239, 3, 87, 48, 20, - 9, 33, 248, 239, 3, 216, 31, 48, 20, 9, 33, 248, 239, 3, 151, 220, 69, - 48, 20, 9, 33, 248, 239, 3, 93, 48, 20, 9, 33, 203, 42, 3, 210, 142, 48, + 20, 9, 33, 195, 110, 3, 87, 70, 20, 9, 33, 251, 195, 3, 225, 190, 70, 20, + 9, 33, 251, 195, 3, 87, 70, 20, 9, 33, 233, 226, 3, 225, 190, 70, 20, 9, + 33, 233, 226, 3, 87, 70, 20, 9, 33, 235, 177, 3, 225, 190, 70, 20, 9, 33, + 235, 177, 3, 168, 70, 20, 9, 33, 235, 177, 3, 224, 143, 70, 20, 9, 33, + 235, 177, 3, 87, 70, 20, 9, 33, 235, 177, 3, 151, 220, 70, 70, 20, 9, 33, + 235, 177, 3, 93, 70, 20, 9, 33, 211, 153, 3, 168, 70, 20, 9, 33, 211, + 153, 3, 87, 70, 20, 9, 33, 211, 153, 3, 151, 220, 70, 70, 20, 9, 33, 211, + 153, 3, 93, 70, 20, 9, 33, 225, 36, 3, 151, 70, 20, 9, 33, 225, 36, 3, + 225, 190, 70, 20, 9, 33, 225, 36, 3, 168, 70, 20, 9, 33, 225, 36, 3, 224, + 143, 70, 20, 9, 33, 225, 36, 3, 222, 250, 70, 20, 9, 33, 225, 36, 3, 87, + 70, 20, 9, 33, 225, 36, 3, 151, 220, 70, 70, 20, 9, 33, 225, 36, 3, 93, + 70, 20, 9, 33, 222, 250, 3, 225, 190, 70, 20, 9, 33, 222, 250, 3, 168, + 70, 20, 9, 33, 222, 250, 3, 224, 143, 70, 20, 9, 33, 222, 250, 3, 87, 70, + 20, 9, 33, 222, 250, 3, 151, 220, 70, 70, 20, 9, 33, 222, 250, 3, 93, 70, + 20, 9, 33, 87, 3, 225, 190, 70, 20, 9, 33, 87, 3, 168, 70, 20, 9, 33, 87, + 3, 224, 143, 70, 20, 9, 33, 87, 3, 87, 70, 20, 9, 33, 87, 3, 151, 220, + 70, 70, 20, 9, 33, 87, 3, 93, 70, 20, 9, 33, 216, 32, 3, 225, 190, 70, + 20, 9, 33, 216, 32, 3, 168, 70, 20, 9, 33, 216, 32, 3, 224, 143, 70, 20, + 9, 33, 216, 32, 3, 87, 70, 20, 9, 33, 216, 32, 3, 151, 220, 70, 70, 20, + 9, 33, 216, 32, 3, 93, 70, 20, 9, 33, 232, 114, 3, 225, 190, 70, 20, 9, + 33, 232, 114, 3, 87, 70, 20, 9, 33, 232, 114, 3, 151, 220, 70, 70, 20, 9, + 33, 232, 114, 3, 93, 70, 20, 9, 33, 93, 3, 225, 190, 70, 20, 9, 33, 93, + 3, 168, 70, 20, 9, 33, 93, 3, 224, 143, 70, 20, 9, 33, 93, 3, 87, 70, 20, + 9, 33, 93, 3, 151, 220, 70, 70, 20, 9, 33, 93, 3, 93, 70, 20, 9, 33, 202, + 226, 3, 204, 95, 151, 70, 20, 9, 33, 210, 143, 3, 204, 95, 151, 70, 20, + 9, 33, 151, 220, 70, 3, 204, 95, 151, 70, 20, 9, 33, 207, 41, 3, 240, 94, + 70, 20, 9, 33, 207, 41, 3, 224, 237, 70, 20, 9, 33, 207, 41, 3, 235, 201, + 70, 20, 9, 33, 207, 41, 3, 240, 96, 70, 20, 9, 33, 207, 41, 3, 224, 239, + 70, 20, 9, 33, 207, 41, 3, 204, 95, 151, 70, 20, 9, 33, 93, 3, 232, 214, + 90, 3, 210, 143, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 195, 107, 48, 20, + 9, 33, 93, 3, 232, 214, 90, 3, 87, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, + 216, 32, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 151, 220, 70, 48, 20, 9, + 33, 93, 3, 232, 214, 90, 3, 93, 48, 20, 9, 33, 248, 240, 3, 210, 143, 48, + 20, 9, 33, 248, 240, 3, 195, 107, 48, 20, 9, 33, 248, 240, 3, 87, 48, 20, + 9, 33, 248, 240, 3, 216, 32, 48, 20, 9, 33, 248, 240, 3, 151, 220, 70, + 48, 20, 9, 33, 248, 240, 3, 93, 48, 20, 9, 33, 203, 42, 3, 210, 143, 48, 20, 9, 33, 203, 42, 3, 195, 107, 48, 20, 9, 33, 203, 42, 3, 87, 48, 20, - 9, 33, 203, 42, 3, 216, 31, 48, 20, 9, 33, 203, 42, 3, 151, 220, 69, 48, - 20, 9, 33, 203, 42, 3, 93, 48, 20, 9, 33, 202, 214, 3, 210, 142, 48, 20, + 9, 33, 203, 42, 3, 216, 32, 48, 20, 9, 33, 203, 42, 3, 151, 220, 70, 48, + 20, 9, 33, 203, 42, 3, 93, 48, 20, 9, 33, 202, 214, 3, 210, 143, 48, 20, 9, 33, 202, 214, 3, 195, 107, 48, 20, 9, 33, 202, 214, 3, 87, 48, 20, 9, - 33, 202, 214, 3, 216, 31, 48, 20, 9, 33, 202, 214, 3, 151, 220, 69, 48, - 20, 9, 33, 202, 214, 3, 93, 48, 20, 9, 33, 235, 176, 3, 151, 220, 69, 48, - 20, 9, 33, 235, 176, 3, 93, 48, 20, 9, 33, 211, 152, 3, 151, 220, 69, 48, - 20, 9, 33, 211, 152, 3, 93, 48, 20, 9, 33, 225, 35, 3, 151, 48, 20, 9, - 33, 225, 35, 3, 222, 249, 48, 20, 9, 33, 225, 35, 3, 87, 48, 20, 9, 33, - 225, 35, 3, 151, 220, 69, 48, 20, 9, 33, 225, 35, 3, 93, 48, 20, 9, 33, - 222, 249, 3, 87, 48, 20, 9, 33, 222, 249, 3, 151, 220, 69, 48, 20, 9, 33, - 222, 249, 3, 93, 48, 20, 9, 33, 87, 3, 151, 48, 20, 9, 33, 87, 3, 87, 48, - 20, 9, 33, 216, 31, 3, 210, 142, 48, 20, 9, 33, 216, 31, 3, 195, 107, 48, - 20, 9, 33, 216, 31, 3, 87, 48, 20, 9, 33, 216, 31, 3, 216, 31, 48, 20, 9, - 33, 216, 31, 3, 151, 220, 69, 48, 20, 9, 33, 216, 31, 3, 93, 48, 20, 9, - 33, 151, 220, 69, 3, 204, 95, 151, 48, 20, 9, 33, 93, 3, 210, 142, 48, + 33, 202, 214, 3, 216, 32, 48, 20, 9, 33, 202, 214, 3, 151, 220, 70, 48, + 20, 9, 33, 202, 214, 3, 93, 48, 20, 9, 33, 235, 177, 3, 151, 220, 70, 48, + 20, 9, 33, 235, 177, 3, 93, 48, 20, 9, 33, 211, 153, 3, 151, 220, 70, 48, + 20, 9, 33, 211, 153, 3, 93, 48, 20, 9, 33, 225, 36, 3, 151, 48, 20, 9, + 33, 225, 36, 3, 222, 250, 48, 20, 9, 33, 225, 36, 3, 87, 48, 20, 9, 33, + 225, 36, 3, 151, 220, 70, 48, 20, 9, 33, 225, 36, 3, 93, 48, 20, 9, 33, + 222, 250, 3, 87, 48, 20, 9, 33, 222, 250, 3, 151, 220, 70, 48, 20, 9, 33, + 222, 250, 3, 93, 48, 20, 9, 33, 87, 3, 151, 48, 20, 9, 33, 87, 3, 87, 48, + 20, 9, 33, 216, 32, 3, 210, 143, 48, 20, 9, 33, 216, 32, 3, 195, 107, 48, + 20, 9, 33, 216, 32, 3, 87, 48, 20, 9, 33, 216, 32, 3, 216, 32, 48, 20, 9, + 33, 216, 32, 3, 151, 220, 70, 48, 20, 9, 33, 216, 32, 3, 93, 48, 20, 9, + 33, 151, 220, 70, 3, 204, 95, 151, 48, 20, 9, 33, 93, 3, 210, 143, 48, 20, 9, 33, 93, 3, 195, 107, 48, 20, 9, 33, 93, 3, 87, 48, 20, 9, 33, 93, - 3, 216, 31, 48, 20, 9, 33, 93, 3, 151, 220, 69, 48, 20, 9, 33, 93, 3, 93, - 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 225, 189, 84, 20, 9, 33, 93, 3, - 232, 213, 90, 3, 168, 84, 20, 9, 33, 93, 3, 232, 213, 90, 3, 224, 142, - 84, 20, 9, 33, 93, 3, 232, 213, 90, 3, 87, 84, 20, 9, 33, 93, 3, 232, - 213, 90, 3, 232, 113, 84, 20, 9, 33, 248, 239, 3, 225, 189, 84, 20, 9, - 33, 248, 239, 3, 168, 84, 20, 9, 33, 248, 239, 3, 224, 142, 84, 20, 9, - 33, 248, 239, 3, 87, 84, 20, 9, 33, 248, 239, 3, 232, 113, 84, 20, 9, 33, - 203, 42, 3, 225, 189, 84, 20, 9, 33, 203, 42, 3, 168, 84, 20, 9, 33, 203, - 42, 3, 224, 142, 84, 20, 9, 33, 203, 42, 3, 87, 84, 20, 9, 33, 203, 42, - 3, 232, 113, 84, 20, 9, 33, 202, 214, 3, 87, 84, 20, 9, 33, 225, 189, 3, - 168, 84, 20, 9, 33, 225, 189, 3, 87, 84, 20, 9, 33, 168, 3, 225, 189, 84, - 20, 9, 33, 168, 3, 87, 84, 20, 9, 33, 224, 142, 3, 225, 189, 84, 20, 9, - 33, 224, 142, 3, 87, 84, 20, 9, 33, 208, 126, 3, 225, 189, 84, 20, 9, 33, - 208, 126, 3, 168, 84, 20, 9, 33, 208, 126, 3, 224, 142, 84, 20, 9, 33, + 3, 216, 32, 48, 20, 9, 33, 93, 3, 151, 220, 70, 48, 20, 9, 33, 93, 3, 93, + 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 225, 190, 84, 20, 9, 33, 93, 3, + 232, 214, 90, 3, 168, 84, 20, 9, 33, 93, 3, 232, 214, 90, 3, 224, 143, + 84, 20, 9, 33, 93, 3, 232, 214, 90, 3, 87, 84, 20, 9, 33, 93, 3, 232, + 214, 90, 3, 232, 114, 84, 20, 9, 33, 248, 240, 3, 225, 190, 84, 20, 9, + 33, 248, 240, 3, 168, 84, 20, 9, 33, 248, 240, 3, 224, 143, 84, 20, 9, + 33, 248, 240, 3, 87, 84, 20, 9, 33, 248, 240, 3, 232, 114, 84, 20, 9, 33, + 203, 42, 3, 225, 190, 84, 20, 9, 33, 203, 42, 3, 168, 84, 20, 9, 33, 203, + 42, 3, 224, 143, 84, 20, 9, 33, 203, 42, 3, 87, 84, 20, 9, 33, 203, 42, + 3, 232, 114, 84, 20, 9, 33, 202, 214, 3, 87, 84, 20, 9, 33, 225, 190, 3, + 168, 84, 20, 9, 33, 225, 190, 3, 87, 84, 20, 9, 33, 168, 3, 225, 190, 84, + 20, 9, 33, 168, 3, 87, 84, 20, 9, 33, 224, 143, 3, 225, 190, 84, 20, 9, + 33, 224, 143, 3, 87, 84, 20, 9, 33, 208, 126, 3, 225, 190, 84, 20, 9, 33, + 208, 126, 3, 168, 84, 20, 9, 33, 208, 126, 3, 224, 143, 84, 20, 9, 33, 208, 126, 3, 87, 84, 20, 9, 33, 209, 9, 3, 168, 84, 20, 9, 33, 209, 9, 3, - 224, 142, 84, 20, 9, 33, 209, 9, 3, 87, 84, 20, 9, 33, 240, 130, 3, 225, - 189, 84, 20, 9, 33, 240, 130, 3, 168, 84, 20, 9, 33, 240, 130, 3, 224, - 142, 84, 20, 9, 33, 240, 130, 3, 87, 84, 20, 9, 33, 203, 140, 3, 168, 84, - 20, 9, 33, 195, 110, 3, 87, 84, 20, 9, 33, 251, 194, 3, 225, 189, 84, 20, - 9, 33, 251, 194, 3, 87, 84, 20, 9, 33, 233, 225, 3, 225, 189, 84, 20, 9, - 33, 233, 225, 3, 87, 84, 20, 9, 33, 235, 176, 3, 225, 189, 84, 20, 9, 33, - 235, 176, 3, 168, 84, 20, 9, 33, 235, 176, 3, 224, 142, 84, 20, 9, 33, - 235, 176, 3, 87, 84, 20, 9, 33, 211, 152, 3, 168, 84, 20, 9, 33, 211, - 152, 3, 87, 84, 20, 9, 33, 225, 35, 3, 225, 189, 84, 20, 9, 33, 225, 35, - 3, 168, 84, 20, 9, 33, 225, 35, 3, 224, 142, 84, 20, 9, 33, 225, 35, 3, - 222, 249, 84, 20, 9, 33, 225, 35, 3, 87, 84, 20, 9, 33, 222, 249, 3, 225, - 189, 84, 20, 9, 33, 222, 249, 3, 168, 84, 20, 9, 33, 222, 249, 3, 224, - 142, 84, 20, 9, 33, 222, 249, 3, 87, 84, 20, 9, 33, 222, 249, 3, 232, - 113, 84, 20, 9, 33, 87, 3, 225, 189, 84, 20, 9, 33, 87, 3, 168, 84, 20, - 9, 33, 87, 3, 224, 142, 84, 20, 9, 33, 87, 3, 87, 84, 20, 9, 33, 216, 31, - 3, 225, 189, 84, 20, 9, 33, 216, 31, 3, 168, 84, 20, 9, 33, 216, 31, 3, - 224, 142, 84, 20, 9, 33, 216, 31, 3, 87, 84, 20, 9, 33, 216, 31, 3, 232, - 113, 84, 20, 9, 33, 232, 113, 3, 225, 189, 84, 20, 9, 33, 232, 113, 3, - 87, 84, 20, 9, 33, 232, 113, 3, 204, 95, 151, 84, 20, 9, 33, 93, 3, 225, - 189, 84, 20, 9, 33, 93, 3, 168, 84, 20, 9, 33, 93, 3, 224, 142, 84, 20, - 9, 33, 93, 3, 87, 84, 20, 9, 33, 93, 3, 232, 113, 84, 20, 9, 33, 93, 3, - 232, 213, 90, 3, 87, 219, 193, 20, 9, 33, 93, 3, 232, 213, 90, 3, 232, - 113, 219, 193, 20, 9, 33, 248, 239, 3, 87, 219, 193, 20, 9, 33, 248, 239, - 3, 232, 113, 219, 193, 20, 9, 33, 203, 42, 3, 87, 219, 193, 20, 9, 33, - 203, 42, 3, 232, 113, 219, 193, 20, 9, 33, 202, 214, 3, 87, 219, 193, 20, - 9, 33, 202, 214, 3, 232, 113, 219, 193, 20, 9, 33, 208, 126, 3, 87, 219, - 193, 20, 9, 33, 208, 126, 3, 232, 113, 219, 193, 20, 9, 33, 206, 252, 3, - 87, 219, 193, 20, 9, 33, 206, 252, 3, 232, 113, 219, 193, 20, 9, 33, 225, - 35, 3, 222, 249, 219, 193, 20, 9, 33, 225, 35, 3, 87, 219, 193, 20, 9, - 33, 222, 249, 3, 87, 219, 193, 20, 9, 33, 216, 31, 3, 87, 219, 193, 20, - 9, 33, 216, 31, 3, 232, 113, 219, 193, 20, 9, 33, 93, 3, 87, 219, 193, - 20, 9, 33, 93, 3, 232, 113, 219, 193, 20, 9, 33, 207, 41, 3, 235, 200, - 219, 193, 20, 9, 33, 207, 41, 3, 240, 95, 219, 193, 20, 9, 33, 207, 41, - 3, 224, 238, 219, 193, 20, 9, 33, 203, 140, 3, 151, 220, 69, 70, 20, 9, - 33, 203, 140, 3, 93, 70, 20, 9, 33, 251, 194, 3, 151, 220, 69, 70, 20, 9, - 33, 251, 194, 3, 93, 70, 20, 9, 33, 233, 225, 3, 151, 220, 69, 70, 20, 9, - 33, 233, 225, 3, 93, 70, 20, 9, 33, 208, 126, 3, 151, 220, 69, 70, 20, 9, - 33, 208, 126, 3, 93, 70, 20, 9, 33, 206, 252, 3, 151, 220, 69, 70, 20, 9, - 33, 206, 252, 3, 93, 70, 20, 9, 33, 168, 3, 151, 220, 69, 70, 20, 9, 33, - 168, 3, 93, 70, 20, 9, 33, 225, 189, 3, 151, 220, 69, 70, 20, 9, 33, 225, - 189, 3, 93, 70, 20, 9, 33, 224, 142, 3, 151, 220, 69, 70, 20, 9, 33, 224, - 142, 3, 93, 70, 20, 9, 33, 209, 9, 3, 151, 220, 69, 70, 20, 9, 33, 209, - 9, 3, 93, 70, 20, 9, 33, 240, 130, 3, 151, 220, 69, 70, 20, 9, 33, 240, - 130, 3, 93, 70, 20, 9, 33, 206, 252, 3, 225, 189, 70, 20, 9, 33, 206, - 252, 3, 168, 70, 20, 9, 33, 206, 252, 3, 224, 142, 70, 20, 9, 33, 206, - 252, 3, 87, 70, 20, 9, 33, 206, 252, 3, 210, 142, 70, 20, 9, 33, 208, - 126, 3, 210, 142, 70, 20, 9, 33, 209, 9, 3, 210, 142, 70, 20, 9, 33, 240, - 130, 3, 210, 142, 70, 20, 9, 33, 203, 140, 3, 151, 220, 69, 48, 20, 9, - 33, 203, 140, 3, 93, 48, 20, 9, 33, 251, 194, 3, 151, 220, 69, 48, 20, 9, - 33, 251, 194, 3, 93, 48, 20, 9, 33, 233, 225, 3, 151, 220, 69, 48, 20, 9, - 33, 233, 225, 3, 93, 48, 20, 9, 33, 208, 126, 3, 151, 220, 69, 48, 20, 9, - 33, 208, 126, 3, 93, 48, 20, 9, 33, 206, 252, 3, 151, 220, 69, 48, 20, 9, - 33, 206, 252, 3, 93, 48, 20, 9, 33, 168, 3, 151, 220, 69, 48, 20, 9, 33, - 168, 3, 93, 48, 20, 9, 33, 225, 189, 3, 151, 220, 69, 48, 20, 9, 33, 225, - 189, 3, 93, 48, 20, 9, 33, 224, 142, 3, 151, 220, 69, 48, 20, 9, 33, 224, - 142, 3, 93, 48, 20, 9, 33, 209, 9, 3, 151, 220, 69, 48, 20, 9, 33, 209, - 9, 3, 93, 48, 20, 9, 33, 240, 130, 3, 151, 220, 69, 48, 20, 9, 33, 240, - 130, 3, 93, 48, 20, 9, 33, 206, 252, 3, 225, 189, 48, 20, 9, 33, 206, - 252, 3, 168, 48, 20, 9, 33, 206, 252, 3, 224, 142, 48, 20, 9, 33, 206, - 252, 3, 87, 48, 20, 9, 33, 206, 252, 3, 210, 142, 48, 20, 9, 33, 208, - 126, 3, 210, 142, 48, 20, 9, 33, 209, 9, 3, 210, 142, 48, 20, 9, 33, 240, - 130, 3, 210, 142, 48, 20, 9, 33, 206, 252, 3, 225, 189, 84, 20, 9, 33, - 206, 252, 3, 168, 84, 20, 9, 33, 206, 252, 3, 224, 142, 84, 20, 9, 33, - 206, 252, 3, 87, 84, 20, 9, 33, 208, 126, 3, 232, 113, 84, 20, 9, 33, - 206, 252, 3, 232, 113, 84, 20, 9, 33, 203, 140, 3, 87, 84, 20, 9, 33, - 208, 126, 3, 225, 189, 219, 193, 20, 9, 33, 208, 126, 3, 168, 219, 193, - 20, 9, 33, 208, 126, 3, 224, 142, 219, 193, 20, 9, 33, 206, 252, 3, 225, - 189, 219, 193, 20, 9, 33, 206, 252, 3, 168, 219, 193, 20, 9, 33, 206, - 252, 3, 224, 142, 219, 193, 20, 9, 33, 203, 140, 3, 87, 219, 193, 20, 9, - 33, 195, 110, 3, 87, 219, 193, 20, 9, 33, 151, 3, 235, 198, 48, 20, 9, - 33, 151, 3, 235, 198, 70, 20, 214, 56, 50, 213, 139, 214, 56, 53, 213, - 139, 9, 33, 203, 42, 3, 225, 189, 3, 87, 84, 20, 9, 33, 203, 42, 3, 168, - 3, 225, 189, 48, 20, 9, 33, 203, 42, 3, 168, 3, 225, 189, 84, 20, 9, 33, - 203, 42, 3, 168, 3, 87, 84, 20, 9, 33, 203, 42, 3, 224, 142, 3, 87, 84, - 20, 9, 33, 203, 42, 3, 87, 3, 225, 189, 84, 20, 9, 33, 203, 42, 3, 87, 3, - 168, 84, 20, 9, 33, 203, 42, 3, 87, 3, 224, 142, 84, 20, 9, 33, 225, 189, - 3, 87, 3, 168, 48, 20, 9, 33, 225, 189, 3, 87, 3, 168, 84, 20, 9, 33, - 168, 3, 87, 3, 93, 48, 20, 9, 33, 168, 3, 87, 3, 151, 220, 69, 48, 20, 9, - 33, 208, 126, 3, 168, 3, 225, 189, 84, 20, 9, 33, 208, 126, 3, 225, 189, - 3, 168, 84, 20, 9, 33, 208, 126, 3, 225, 189, 3, 151, 220, 69, 48, 20, 9, + 224, 143, 84, 20, 9, 33, 209, 9, 3, 87, 84, 20, 9, 33, 240, 131, 3, 225, + 190, 84, 20, 9, 33, 240, 131, 3, 168, 84, 20, 9, 33, 240, 131, 3, 224, + 143, 84, 20, 9, 33, 240, 131, 3, 87, 84, 20, 9, 33, 203, 140, 3, 168, 84, + 20, 9, 33, 195, 110, 3, 87, 84, 20, 9, 33, 251, 195, 3, 225, 190, 84, 20, + 9, 33, 251, 195, 3, 87, 84, 20, 9, 33, 233, 226, 3, 225, 190, 84, 20, 9, + 33, 233, 226, 3, 87, 84, 20, 9, 33, 235, 177, 3, 225, 190, 84, 20, 9, 33, + 235, 177, 3, 168, 84, 20, 9, 33, 235, 177, 3, 224, 143, 84, 20, 9, 33, + 235, 177, 3, 87, 84, 20, 9, 33, 211, 153, 3, 168, 84, 20, 9, 33, 211, + 153, 3, 87, 84, 20, 9, 33, 225, 36, 3, 225, 190, 84, 20, 9, 33, 225, 36, + 3, 168, 84, 20, 9, 33, 225, 36, 3, 224, 143, 84, 20, 9, 33, 225, 36, 3, + 222, 250, 84, 20, 9, 33, 225, 36, 3, 87, 84, 20, 9, 33, 222, 250, 3, 225, + 190, 84, 20, 9, 33, 222, 250, 3, 168, 84, 20, 9, 33, 222, 250, 3, 224, + 143, 84, 20, 9, 33, 222, 250, 3, 87, 84, 20, 9, 33, 222, 250, 3, 232, + 114, 84, 20, 9, 33, 87, 3, 225, 190, 84, 20, 9, 33, 87, 3, 168, 84, 20, + 9, 33, 87, 3, 224, 143, 84, 20, 9, 33, 87, 3, 87, 84, 20, 9, 33, 216, 32, + 3, 225, 190, 84, 20, 9, 33, 216, 32, 3, 168, 84, 20, 9, 33, 216, 32, 3, + 224, 143, 84, 20, 9, 33, 216, 32, 3, 87, 84, 20, 9, 33, 216, 32, 3, 232, + 114, 84, 20, 9, 33, 232, 114, 3, 225, 190, 84, 20, 9, 33, 232, 114, 3, + 87, 84, 20, 9, 33, 232, 114, 3, 204, 95, 151, 84, 20, 9, 33, 93, 3, 225, + 190, 84, 20, 9, 33, 93, 3, 168, 84, 20, 9, 33, 93, 3, 224, 143, 84, 20, + 9, 33, 93, 3, 87, 84, 20, 9, 33, 93, 3, 232, 114, 84, 20, 9, 33, 93, 3, + 232, 214, 90, 3, 87, 219, 194, 20, 9, 33, 93, 3, 232, 214, 90, 3, 232, + 114, 219, 194, 20, 9, 33, 248, 240, 3, 87, 219, 194, 20, 9, 33, 248, 240, + 3, 232, 114, 219, 194, 20, 9, 33, 203, 42, 3, 87, 219, 194, 20, 9, 33, + 203, 42, 3, 232, 114, 219, 194, 20, 9, 33, 202, 214, 3, 87, 219, 194, 20, + 9, 33, 202, 214, 3, 232, 114, 219, 194, 20, 9, 33, 208, 126, 3, 87, 219, + 194, 20, 9, 33, 208, 126, 3, 232, 114, 219, 194, 20, 9, 33, 206, 252, 3, + 87, 219, 194, 20, 9, 33, 206, 252, 3, 232, 114, 219, 194, 20, 9, 33, 225, + 36, 3, 222, 250, 219, 194, 20, 9, 33, 225, 36, 3, 87, 219, 194, 20, 9, + 33, 222, 250, 3, 87, 219, 194, 20, 9, 33, 216, 32, 3, 87, 219, 194, 20, + 9, 33, 216, 32, 3, 232, 114, 219, 194, 20, 9, 33, 93, 3, 87, 219, 194, + 20, 9, 33, 93, 3, 232, 114, 219, 194, 20, 9, 33, 207, 41, 3, 235, 201, + 219, 194, 20, 9, 33, 207, 41, 3, 240, 96, 219, 194, 20, 9, 33, 207, 41, + 3, 224, 239, 219, 194, 20, 9, 33, 203, 140, 3, 151, 220, 70, 70, 20, 9, + 33, 203, 140, 3, 93, 70, 20, 9, 33, 251, 195, 3, 151, 220, 70, 70, 20, 9, + 33, 251, 195, 3, 93, 70, 20, 9, 33, 233, 226, 3, 151, 220, 70, 70, 20, 9, + 33, 233, 226, 3, 93, 70, 20, 9, 33, 208, 126, 3, 151, 220, 70, 70, 20, 9, + 33, 208, 126, 3, 93, 70, 20, 9, 33, 206, 252, 3, 151, 220, 70, 70, 20, 9, + 33, 206, 252, 3, 93, 70, 20, 9, 33, 168, 3, 151, 220, 70, 70, 20, 9, 33, + 168, 3, 93, 70, 20, 9, 33, 225, 190, 3, 151, 220, 70, 70, 20, 9, 33, 225, + 190, 3, 93, 70, 20, 9, 33, 224, 143, 3, 151, 220, 70, 70, 20, 9, 33, 224, + 143, 3, 93, 70, 20, 9, 33, 209, 9, 3, 151, 220, 70, 70, 20, 9, 33, 209, + 9, 3, 93, 70, 20, 9, 33, 240, 131, 3, 151, 220, 70, 70, 20, 9, 33, 240, + 131, 3, 93, 70, 20, 9, 33, 206, 252, 3, 225, 190, 70, 20, 9, 33, 206, + 252, 3, 168, 70, 20, 9, 33, 206, 252, 3, 224, 143, 70, 20, 9, 33, 206, + 252, 3, 87, 70, 20, 9, 33, 206, 252, 3, 210, 143, 70, 20, 9, 33, 208, + 126, 3, 210, 143, 70, 20, 9, 33, 209, 9, 3, 210, 143, 70, 20, 9, 33, 240, + 131, 3, 210, 143, 70, 20, 9, 33, 203, 140, 3, 151, 220, 70, 48, 20, 9, + 33, 203, 140, 3, 93, 48, 20, 9, 33, 251, 195, 3, 151, 220, 70, 48, 20, 9, + 33, 251, 195, 3, 93, 48, 20, 9, 33, 233, 226, 3, 151, 220, 70, 48, 20, 9, + 33, 233, 226, 3, 93, 48, 20, 9, 33, 208, 126, 3, 151, 220, 70, 48, 20, 9, + 33, 208, 126, 3, 93, 48, 20, 9, 33, 206, 252, 3, 151, 220, 70, 48, 20, 9, + 33, 206, 252, 3, 93, 48, 20, 9, 33, 168, 3, 151, 220, 70, 48, 20, 9, 33, + 168, 3, 93, 48, 20, 9, 33, 225, 190, 3, 151, 220, 70, 48, 20, 9, 33, 225, + 190, 3, 93, 48, 20, 9, 33, 224, 143, 3, 151, 220, 70, 48, 20, 9, 33, 224, + 143, 3, 93, 48, 20, 9, 33, 209, 9, 3, 151, 220, 70, 48, 20, 9, 33, 209, + 9, 3, 93, 48, 20, 9, 33, 240, 131, 3, 151, 220, 70, 48, 20, 9, 33, 240, + 131, 3, 93, 48, 20, 9, 33, 206, 252, 3, 225, 190, 48, 20, 9, 33, 206, + 252, 3, 168, 48, 20, 9, 33, 206, 252, 3, 224, 143, 48, 20, 9, 33, 206, + 252, 3, 87, 48, 20, 9, 33, 206, 252, 3, 210, 143, 48, 20, 9, 33, 208, + 126, 3, 210, 143, 48, 20, 9, 33, 209, 9, 3, 210, 143, 48, 20, 9, 33, 240, + 131, 3, 210, 143, 48, 20, 9, 33, 206, 252, 3, 225, 190, 84, 20, 9, 33, + 206, 252, 3, 168, 84, 20, 9, 33, 206, 252, 3, 224, 143, 84, 20, 9, 33, + 206, 252, 3, 87, 84, 20, 9, 33, 208, 126, 3, 232, 114, 84, 20, 9, 33, + 206, 252, 3, 232, 114, 84, 20, 9, 33, 203, 140, 3, 87, 84, 20, 9, 33, + 208, 126, 3, 225, 190, 219, 194, 20, 9, 33, 208, 126, 3, 168, 219, 194, + 20, 9, 33, 208, 126, 3, 224, 143, 219, 194, 20, 9, 33, 206, 252, 3, 225, + 190, 219, 194, 20, 9, 33, 206, 252, 3, 168, 219, 194, 20, 9, 33, 206, + 252, 3, 224, 143, 219, 194, 20, 9, 33, 203, 140, 3, 87, 219, 194, 20, 9, + 33, 195, 110, 3, 87, 219, 194, 20, 9, 33, 151, 3, 235, 199, 48, 20, 9, + 33, 151, 3, 235, 199, 70, 20, 214, 57, 50, 213, 140, 214, 57, 53, 213, + 140, 9, 33, 203, 42, 3, 225, 190, 3, 87, 84, 20, 9, 33, 203, 42, 3, 168, + 3, 225, 190, 48, 20, 9, 33, 203, 42, 3, 168, 3, 225, 190, 84, 20, 9, 33, + 203, 42, 3, 168, 3, 87, 84, 20, 9, 33, 203, 42, 3, 224, 143, 3, 87, 84, + 20, 9, 33, 203, 42, 3, 87, 3, 225, 190, 84, 20, 9, 33, 203, 42, 3, 87, 3, + 168, 84, 20, 9, 33, 203, 42, 3, 87, 3, 224, 143, 84, 20, 9, 33, 225, 190, + 3, 87, 3, 168, 48, 20, 9, 33, 225, 190, 3, 87, 3, 168, 84, 20, 9, 33, + 168, 3, 87, 3, 93, 48, 20, 9, 33, 168, 3, 87, 3, 151, 220, 70, 48, 20, 9, + 33, 208, 126, 3, 168, 3, 225, 190, 84, 20, 9, 33, 208, 126, 3, 225, 190, + 3, 168, 84, 20, 9, 33, 208, 126, 3, 225, 190, 3, 151, 220, 70, 48, 20, 9, 33, 208, 126, 3, 87, 3, 168, 48, 20, 9, 33, 208, 126, 3, 87, 3, 168, 84, - 20, 9, 33, 208, 126, 3, 87, 3, 225, 189, 84, 20, 9, 33, 208, 126, 3, 87, + 20, 9, 33, 208, 126, 3, 87, 3, 225, 190, 84, 20, 9, 33, 208, 126, 3, 87, 3, 87, 48, 20, 9, 33, 208, 126, 3, 87, 3, 87, 84, 20, 9, 33, 209, 9, 3, 168, 3, 168, 48, 20, 9, 33, 209, 9, 3, 168, 3, 168, 84, 20, 9, 33, 209, 9, 3, 87, 3, 87, 48, 20, 9, 33, 206, 252, 3, 168, 3, 87, 48, 20, 9, 33, - 206, 252, 3, 168, 3, 87, 84, 20, 9, 33, 206, 252, 3, 225, 189, 3, 93, 48, - 20, 9, 33, 206, 252, 3, 87, 3, 224, 142, 48, 20, 9, 33, 206, 252, 3, 87, - 3, 224, 142, 84, 20, 9, 33, 206, 252, 3, 87, 3, 87, 48, 20, 9, 33, 206, - 252, 3, 87, 3, 87, 84, 20, 9, 33, 240, 130, 3, 168, 3, 151, 220, 69, 48, - 20, 9, 33, 240, 130, 3, 224, 142, 3, 87, 48, 20, 9, 33, 240, 130, 3, 224, - 142, 3, 87, 84, 20, 9, 33, 203, 140, 3, 87, 3, 168, 48, 20, 9, 33, 203, + 206, 252, 3, 168, 3, 87, 84, 20, 9, 33, 206, 252, 3, 225, 190, 3, 93, 48, + 20, 9, 33, 206, 252, 3, 87, 3, 224, 143, 48, 20, 9, 33, 206, 252, 3, 87, + 3, 224, 143, 84, 20, 9, 33, 206, 252, 3, 87, 3, 87, 48, 20, 9, 33, 206, + 252, 3, 87, 3, 87, 84, 20, 9, 33, 240, 131, 3, 168, 3, 151, 220, 70, 48, + 20, 9, 33, 240, 131, 3, 224, 143, 3, 87, 48, 20, 9, 33, 240, 131, 3, 224, + 143, 3, 87, 84, 20, 9, 33, 203, 140, 3, 87, 3, 168, 48, 20, 9, 33, 203, 140, 3, 87, 3, 168, 84, 20, 9, 33, 203, 140, 3, 87, 3, 87, 84, 20, 9, 33, - 203, 140, 3, 87, 3, 93, 48, 20, 9, 33, 251, 194, 3, 225, 189, 3, 87, 48, - 20, 9, 33, 251, 194, 3, 87, 3, 87, 48, 20, 9, 33, 251, 194, 3, 87, 3, 87, - 84, 20, 9, 33, 251, 194, 3, 87, 3, 151, 220, 69, 48, 20, 9, 33, 233, 225, - 3, 87, 3, 87, 48, 20, 9, 33, 233, 225, 3, 87, 3, 93, 48, 20, 9, 33, 233, - 225, 3, 87, 3, 151, 220, 69, 48, 20, 9, 33, 235, 176, 3, 224, 142, 3, 87, - 48, 20, 9, 33, 235, 176, 3, 224, 142, 3, 87, 84, 20, 9, 33, 211, 152, 3, - 87, 3, 168, 48, 20, 9, 33, 211, 152, 3, 87, 3, 87, 48, 20, 9, 33, 222, - 249, 3, 168, 3, 87, 48, 20, 9, 33, 222, 249, 3, 168, 3, 93, 48, 20, 9, - 33, 222, 249, 3, 168, 3, 151, 220, 69, 48, 20, 9, 33, 222, 249, 3, 225, - 189, 3, 225, 189, 84, 20, 9, 33, 222, 249, 3, 225, 189, 3, 225, 189, 48, - 20, 9, 33, 222, 249, 3, 224, 142, 3, 87, 48, 20, 9, 33, 222, 249, 3, 224, - 142, 3, 87, 84, 20, 9, 33, 222, 249, 3, 87, 3, 168, 48, 20, 9, 33, 222, - 249, 3, 87, 3, 168, 84, 20, 9, 33, 87, 3, 168, 3, 225, 189, 84, 20, 9, + 203, 140, 3, 87, 3, 93, 48, 20, 9, 33, 251, 195, 3, 225, 190, 3, 87, 48, + 20, 9, 33, 251, 195, 3, 87, 3, 87, 48, 20, 9, 33, 251, 195, 3, 87, 3, 87, + 84, 20, 9, 33, 251, 195, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 233, 226, + 3, 87, 3, 87, 48, 20, 9, 33, 233, 226, 3, 87, 3, 93, 48, 20, 9, 33, 233, + 226, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 235, 177, 3, 224, 143, 3, 87, + 48, 20, 9, 33, 235, 177, 3, 224, 143, 3, 87, 84, 20, 9, 33, 211, 153, 3, + 87, 3, 168, 48, 20, 9, 33, 211, 153, 3, 87, 3, 87, 48, 20, 9, 33, 222, + 250, 3, 168, 3, 87, 48, 20, 9, 33, 222, 250, 3, 168, 3, 93, 48, 20, 9, + 33, 222, 250, 3, 168, 3, 151, 220, 70, 48, 20, 9, 33, 222, 250, 3, 225, + 190, 3, 225, 190, 84, 20, 9, 33, 222, 250, 3, 225, 190, 3, 225, 190, 48, + 20, 9, 33, 222, 250, 3, 224, 143, 3, 87, 48, 20, 9, 33, 222, 250, 3, 224, + 143, 3, 87, 84, 20, 9, 33, 222, 250, 3, 87, 3, 168, 48, 20, 9, 33, 222, + 250, 3, 87, 3, 168, 84, 20, 9, 33, 87, 3, 168, 3, 225, 190, 84, 20, 9, 33, 87, 3, 168, 3, 87, 84, 20, 9, 33, 87, 3, 168, 3, 93, 48, 20, 9, 33, - 87, 3, 225, 189, 3, 168, 84, 20, 9, 33, 87, 3, 225, 189, 3, 87, 84, 20, - 9, 33, 87, 3, 224, 142, 3, 225, 189, 84, 20, 9, 33, 87, 3, 224, 142, 3, - 87, 84, 20, 9, 33, 87, 3, 225, 189, 3, 224, 142, 84, 20, 9, 33, 232, 113, - 3, 87, 3, 225, 189, 84, 20, 9, 33, 232, 113, 3, 87, 3, 87, 84, 20, 9, 33, - 216, 31, 3, 168, 3, 87, 84, 20, 9, 33, 216, 31, 3, 168, 3, 151, 220, 69, - 48, 20, 9, 33, 216, 31, 3, 225, 189, 3, 87, 48, 20, 9, 33, 216, 31, 3, - 225, 189, 3, 87, 84, 20, 9, 33, 216, 31, 3, 225, 189, 3, 151, 220, 69, - 48, 20, 9, 33, 216, 31, 3, 87, 3, 93, 48, 20, 9, 33, 216, 31, 3, 87, 3, - 151, 220, 69, 48, 20, 9, 33, 93, 3, 87, 3, 87, 48, 20, 9, 33, 93, 3, 87, - 3, 87, 84, 20, 9, 33, 248, 239, 3, 224, 142, 3, 93, 48, 20, 9, 33, 203, - 42, 3, 225, 189, 3, 93, 48, 20, 9, 33, 203, 42, 3, 225, 189, 3, 151, 220, - 69, 48, 20, 9, 33, 203, 42, 3, 224, 142, 3, 93, 48, 20, 9, 33, 203, 42, - 3, 224, 142, 3, 151, 220, 69, 48, 20, 9, 33, 203, 42, 3, 87, 3, 93, 48, - 20, 9, 33, 203, 42, 3, 87, 3, 151, 220, 69, 48, 20, 9, 33, 225, 189, 3, - 87, 3, 93, 48, 20, 9, 33, 225, 189, 3, 168, 3, 151, 220, 69, 48, 20, 9, - 33, 225, 189, 3, 87, 3, 151, 220, 69, 48, 20, 9, 33, 208, 126, 3, 224, - 142, 3, 151, 220, 69, 48, 20, 9, 33, 209, 9, 3, 168, 3, 93, 48, 20, 9, - 33, 206, 252, 3, 168, 3, 93, 48, 20, 9, 33, 240, 130, 3, 168, 3, 93, 48, - 20, 9, 33, 222, 249, 3, 225, 189, 3, 93, 48, 20, 9, 33, 222, 249, 3, 87, - 3, 93, 48, 20, 9, 33, 93, 3, 168, 3, 93, 48, 20, 9, 33, 93, 3, 225, 189, + 87, 3, 225, 190, 3, 168, 84, 20, 9, 33, 87, 3, 225, 190, 3, 87, 84, 20, + 9, 33, 87, 3, 224, 143, 3, 225, 190, 84, 20, 9, 33, 87, 3, 224, 143, 3, + 87, 84, 20, 9, 33, 87, 3, 225, 190, 3, 224, 143, 84, 20, 9, 33, 232, 114, + 3, 87, 3, 225, 190, 84, 20, 9, 33, 232, 114, 3, 87, 3, 87, 84, 20, 9, 33, + 216, 32, 3, 168, 3, 87, 84, 20, 9, 33, 216, 32, 3, 168, 3, 151, 220, 70, + 48, 20, 9, 33, 216, 32, 3, 225, 190, 3, 87, 48, 20, 9, 33, 216, 32, 3, + 225, 190, 3, 87, 84, 20, 9, 33, 216, 32, 3, 225, 190, 3, 151, 220, 70, + 48, 20, 9, 33, 216, 32, 3, 87, 3, 93, 48, 20, 9, 33, 216, 32, 3, 87, 3, + 151, 220, 70, 48, 20, 9, 33, 93, 3, 87, 3, 87, 48, 20, 9, 33, 93, 3, 87, + 3, 87, 84, 20, 9, 33, 248, 240, 3, 224, 143, 3, 93, 48, 20, 9, 33, 203, + 42, 3, 225, 190, 3, 93, 48, 20, 9, 33, 203, 42, 3, 225, 190, 3, 151, 220, + 70, 48, 20, 9, 33, 203, 42, 3, 224, 143, 3, 93, 48, 20, 9, 33, 203, 42, + 3, 224, 143, 3, 151, 220, 70, 48, 20, 9, 33, 203, 42, 3, 87, 3, 93, 48, + 20, 9, 33, 203, 42, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 225, 190, 3, + 87, 3, 93, 48, 20, 9, 33, 225, 190, 3, 168, 3, 151, 220, 70, 48, 20, 9, + 33, 225, 190, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 208, 126, 3, 224, + 143, 3, 151, 220, 70, 48, 20, 9, 33, 209, 9, 3, 168, 3, 93, 48, 20, 9, + 33, 206, 252, 3, 168, 3, 93, 48, 20, 9, 33, 240, 131, 3, 168, 3, 93, 48, + 20, 9, 33, 222, 250, 3, 225, 190, 3, 93, 48, 20, 9, 33, 222, 250, 3, 87, + 3, 93, 48, 20, 9, 33, 93, 3, 168, 3, 93, 48, 20, 9, 33, 93, 3, 225, 190, 3, 93, 48, 20, 9, 33, 93, 3, 87, 3, 93, 48, 20, 9, 33, 87, 3, 87, 3, 93, - 48, 20, 9, 33, 211, 152, 3, 87, 3, 93, 48, 20, 9, 33, 216, 31, 3, 168, 3, - 93, 48, 20, 9, 33, 211, 152, 3, 87, 3, 168, 84, 20, 9, 33, 222, 249, 3, - 168, 3, 87, 84, 20, 9, 33, 251, 194, 3, 87, 3, 93, 48, 20, 9, 33, 225, - 35, 3, 87, 3, 93, 48, 20, 9, 33, 216, 31, 3, 225, 189, 3, 168, 84, 20, 9, - 33, 87, 3, 224, 142, 3, 93, 48, 20, 9, 33, 222, 249, 3, 225, 189, 3, 87, - 84, 20, 9, 33, 225, 35, 3, 87, 3, 87, 48, 20, 9, 33, 222, 249, 3, 225, - 189, 3, 87, 48, 20, 9, 33, 216, 31, 3, 225, 189, 3, 168, 48, 20, 9, 33, - 225, 189, 3, 168, 3, 93, 48, 20, 9, 33, 168, 3, 225, 189, 3, 93, 48, 20, - 9, 33, 87, 3, 225, 189, 3, 93, 48, 20, 9, 33, 235, 176, 3, 87, 3, 93, 48, - 20, 9, 33, 248, 239, 3, 168, 3, 93, 48, 20, 9, 33, 225, 35, 3, 87, 3, 87, - 84, 20, 9, 33, 251, 194, 3, 225, 189, 3, 87, 84, 20, 9, 33, 209, 9, 3, - 87, 3, 87, 84, 20, 9, 33, 208, 126, 3, 224, 142, 3, 93, 48, 20, 9, 33, - 216, 31, 3, 225, 189, 3, 93, 48, 20, 9, 33, 208, 236, 199, 255, 250, 202, - 223, 233, 204, 227, 2, 70, 20, 9, 33, 211, 148, 199, 255, 250, 202, 223, - 233, 204, 227, 2, 70, 20, 9, 33, 251, 144, 70, 20, 9, 33, 251, 177, 70, - 20, 9, 33, 218, 217, 70, 20, 9, 33, 208, 237, 70, 20, 9, 33, 210, 199, - 70, 20, 9, 33, 251, 166, 70, 20, 9, 33, 197, 137, 70, 20, 9, 33, 208, - 236, 70, 20, 9, 33, 208, 235, 251, 166, 197, 136, 9, 33, 225, 204, 210, - 64, 55, 9, 33, 248, 146, 251, 11, 251, 12, 62, 208, 113, 62, 208, 2, 62, + 48, 20, 9, 33, 211, 153, 3, 87, 3, 93, 48, 20, 9, 33, 216, 32, 3, 168, 3, + 93, 48, 20, 9, 33, 211, 153, 3, 87, 3, 168, 84, 20, 9, 33, 222, 250, 3, + 168, 3, 87, 84, 20, 9, 33, 251, 195, 3, 87, 3, 93, 48, 20, 9, 33, 225, + 36, 3, 87, 3, 93, 48, 20, 9, 33, 216, 32, 3, 225, 190, 3, 168, 84, 20, 9, + 33, 87, 3, 224, 143, 3, 93, 48, 20, 9, 33, 222, 250, 3, 225, 190, 3, 87, + 84, 20, 9, 33, 225, 36, 3, 87, 3, 87, 48, 20, 9, 33, 222, 250, 3, 225, + 190, 3, 87, 48, 20, 9, 33, 216, 32, 3, 225, 190, 3, 168, 48, 20, 9, 33, + 225, 190, 3, 168, 3, 93, 48, 20, 9, 33, 168, 3, 225, 190, 3, 93, 48, 20, + 9, 33, 87, 3, 225, 190, 3, 93, 48, 20, 9, 33, 235, 177, 3, 87, 3, 93, 48, + 20, 9, 33, 248, 240, 3, 168, 3, 93, 48, 20, 9, 33, 225, 36, 3, 87, 3, 87, + 84, 20, 9, 33, 251, 195, 3, 225, 190, 3, 87, 84, 20, 9, 33, 209, 9, 3, + 87, 3, 87, 84, 20, 9, 33, 208, 126, 3, 224, 143, 3, 93, 48, 20, 9, 33, + 216, 32, 3, 225, 190, 3, 93, 48, 20, 9, 33, 208, 236, 199, 255, 250, 203, + 223, 234, 204, 227, 2, 70, 20, 9, 33, 211, 149, 199, 255, 250, 203, 223, + 234, 204, 227, 2, 70, 20, 9, 33, 251, 145, 70, 20, 9, 33, 251, 178, 70, + 20, 9, 33, 218, 218, 70, 20, 9, 33, 208, 237, 70, 20, 9, 33, 210, 200, + 70, 20, 9, 33, 251, 167, 70, 20, 9, 33, 197, 137, 70, 20, 9, 33, 208, + 236, 70, 20, 9, 33, 208, 235, 251, 167, 197, 136, 9, 33, 225, 205, 210, + 64, 55, 9, 33, 248, 147, 251, 12, 251, 13, 62, 208, 113, 62, 208, 2, 62, 207, 190, 62, 207, 179, 62, 207, 168, 62, 207, 157, 62, 207, 146, 62, 207, 135, 62, 207, 124, 62, 208, 112, 62, 208, 101, 62, 208, 90, 62, 208, - 79, 62, 208, 68, 62, 208, 57, 62, 208, 46, 212, 24, 235, 23, 36, 83, 244, - 158, 212, 24, 235, 23, 36, 83, 143, 244, 158, 212, 24, 235, 23, 36, 83, - 143, 234, 216, 204, 226, 212, 24, 235, 23, 36, 83, 244, 167, 212, 24, - 235, 23, 36, 83, 207, 105, 212, 24, 235, 23, 36, 83, 236, 89, 78, 212, - 24, 235, 23, 36, 83, 211, 78, 78, 212, 24, 235, 23, 36, 83, 50, 59, 222, - 146, 179, 212, 24, 235, 23, 36, 83, 53, 59, 222, 146, 248, 58, 212, 24, - 235, 23, 36, 83, 231, 154, 236, 246, 38, 33, 50, 232, 224, 38, 33, 53, - 232, 224, 38, 52, 202, 85, 50, 232, 224, 38, 52, 202, 85, 53, 232, 224, - 38, 220, 114, 50, 232, 224, 38, 220, 114, 53, 232, 224, 38, 241, 142, - 220, 113, 38, 33, 50, 157, 60, 38, 33, 53, 157, 60, 38, 202, 85, 50, 157, - 60, 38, 202, 85, 53, 157, 60, 38, 220, 114, 50, 157, 60, 38, 220, 114, - 53, 157, 60, 38, 241, 142, 220, 114, 60, 38, 40, 202, 55, 50, 232, 224, - 38, 40, 202, 55, 53, 232, 224, 212, 24, 235, 23, 36, 83, 99, 76, 222, - 194, 212, 24, 235, 23, 36, 83, 236, 241, 240, 64, 212, 24, 235, 23, 36, - 83, 236, 230, 240, 64, 212, 24, 235, 23, 36, 83, 126, 222, 74, 212, 24, - 235, 23, 36, 83, 197, 119, 126, 222, 74, 212, 24, 235, 23, 36, 83, 50, - 213, 139, 212, 24, 235, 23, 36, 83, 53, 213, 139, 212, 24, 235, 23, 36, - 83, 50, 241, 17, 179, 212, 24, 235, 23, 36, 83, 53, 241, 17, 179, 212, - 24, 235, 23, 36, 83, 50, 201, 231, 206, 245, 179, 212, 24, 235, 23, 36, - 83, 53, 201, 231, 206, 245, 179, 212, 24, 235, 23, 36, 83, 50, 58, 222, - 146, 179, 212, 24, 235, 23, 36, 83, 53, 58, 222, 146, 179, 212, 24, 235, - 23, 36, 83, 50, 52, 251, 90, 179, 212, 24, 235, 23, 36, 83, 53, 52, 251, - 90, 179, 212, 24, 235, 23, 36, 83, 50, 251, 90, 179, 212, 24, 235, 23, - 36, 83, 53, 251, 90, 179, 212, 24, 235, 23, 36, 83, 50, 241, 101, 179, - 212, 24, 235, 23, 36, 83, 53, 241, 101, 179, 212, 24, 235, 23, 36, 83, - 50, 59, 241, 101, 179, 212, 24, 235, 23, 36, 83, 53, 59, 241, 101, 179, - 207, 80, 238, 252, 59, 207, 80, 238, 252, 212, 24, 235, 23, 36, 83, 50, - 47, 179, 212, 24, 235, 23, 36, 83, 53, 47, 179, 240, 63, 214, 18, 247, - 32, 214, 18, 197, 119, 214, 18, 52, 197, 119, 214, 18, 240, 63, 126, 222, - 74, 247, 32, 126, 222, 74, 197, 119, 126, 222, 74, 4, 244, 158, 4, 143, - 244, 158, 4, 234, 216, 204, 226, 4, 207, 105, 4, 244, 167, 4, 211, 78, - 78, 4, 236, 89, 78, 4, 236, 241, 240, 64, 4, 50, 213, 139, 4, 53, 213, - 139, 4, 50, 241, 17, 179, 4, 53, 241, 17, 179, 4, 50, 201, 231, 206, 245, - 179, 4, 53, 201, 231, 206, 245, 179, 4, 31, 55, 4, 251, 110, 4, 250, 178, - 4, 98, 55, 4, 231, 5, 4, 222, 139, 55, 4, 233, 93, 55, 4, 236, 171, 55, - 4, 210, 90, 205, 177, 4, 239, 9, 55, 4, 213, 44, 55, 4, 244, 156, 250, - 167, 9, 235, 198, 70, 20, 9, 203, 92, 3, 235, 198, 57, 9, 240, 93, 70, - 20, 9, 203, 136, 234, 252, 9, 224, 236, 70, 20, 9, 235, 200, 70, 20, 9, - 235, 200, 219, 193, 20, 9, 240, 95, 70, 20, 9, 240, 95, 219, 193, 20, 9, - 224, 238, 70, 20, 9, 224, 238, 219, 193, 20, 9, 207, 41, 70, 20, 9, 207, - 41, 219, 193, 20, 9, 204, 120, 70, 20, 9, 204, 120, 219, 193, 20, 9, 1, - 232, 213, 70, 20, 9, 1, 151, 3, 220, 109, 90, 70, 20, 9, 1, 151, 3, 220, - 109, 90, 48, 20, 9, 1, 151, 3, 232, 213, 90, 70, 20, 9, 1, 151, 3, 232, - 213, 90, 48, 20, 9, 1, 197, 118, 3, 232, 213, 90, 70, 20, 9, 1, 197, 118, - 3, 232, 213, 90, 48, 20, 9, 1, 151, 3, 232, 213, 248, 226, 70, 20, 9, 1, - 151, 3, 232, 213, 248, 226, 48, 20, 9, 1, 93, 3, 232, 213, 90, 70, 20, 9, - 1, 93, 3, 232, 213, 90, 48, 20, 9, 1, 93, 3, 232, 213, 90, 84, 20, 9, 1, - 93, 3, 232, 213, 90, 219, 193, 20, 9, 1, 151, 70, 20, 9, 1, 151, 48, 20, - 9, 1, 248, 239, 70, 20, 9, 1, 248, 239, 48, 20, 9, 1, 248, 239, 84, 20, - 9, 1, 248, 239, 219, 193, 20, 9, 1, 203, 42, 220, 35, 70, 20, 9, 1, 203, - 42, 220, 35, 48, 20, 9, 1, 203, 42, 70, 20, 9, 1, 203, 42, 48, 20, 9, 1, - 203, 42, 84, 20, 9, 1, 203, 42, 219, 193, 20, 9, 1, 202, 214, 70, 20, 9, - 1, 202, 214, 48, 20, 9, 1, 202, 214, 84, 20, 9, 1, 202, 214, 219, 193, - 20, 9, 1, 225, 189, 70, 20, 9, 1, 225, 189, 48, 20, 9, 1, 225, 189, 84, - 20, 9, 1, 225, 189, 219, 193, 20, 9, 1, 168, 70, 20, 9, 1, 168, 48, 20, - 9, 1, 168, 84, 20, 9, 1, 168, 219, 193, 20, 9, 1, 224, 142, 70, 20, 9, 1, - 224, 142, 48, 20, 9, 1, 224, 142, 84, 20, 9, 1, 224, 142, 219, 193, 20, - 9, 1, 240, 107, 70, 20, 9, 1, 240, 107, 48, 20, 9, 1, 202, 226, 70, 20, - 9, 1, 202, 226, 48, 20, 9, 1, 210, 142, 70, 20, 9, 1, 210, 142, 48, 20, + 79, 62, 208, 68, 62, 208, 57, 62, 208, 46, 212, 25, 235, 24, 36, 83, 244, + 159, 212, 25, 235, 24, 36, 83, 143, 244, 159, 212, 25, 235, 24, 36, 83, + 143, 234, 217, 204, 226, 212, 25, 235, 24, 36, 83, 244, 168, 212, 25, + 235, 24, 36, 83, 207, 105, 212, 25, 235, 24, 36, 83, 236, 90, 78, 212, + 25, 235, 24, 36, 83, 211, 79, 78, 212, 25, 235, 24, 36, 83, 50, 59, 222, + 147, 179, 212, 25, 235, 24, 36, 83, 53, 59, 222, 147, 248, 59, 212, 25, + 235, 24, 36, 83, 231, 155, 236, 247, 38, 33, 50, 232, 225, 38, 33, 53, + 232, 225, 38, 52, 202, 85, 50, 232, 225, 38, 52, 202, 85, 53, 232, 225, + 38, 220, 115, 50, 232, 225, 38, 220, 115, 53, 232, 225, 38, 241, 143, + 220, 114, 38, 33, 50, 157, 60, 38, 33, 53, 157, 60, 38, 202, 85, 50, 157, + 60, 38, 202, 85, 53, 157, 60, 38, 220, 115, 50, 157, 60, 38, 220, 115, + 53, 157, 60, 38, 241, 143, 220, 115, 60, 38, 40, 202, 55, 50, 232, 225, + 38, 40, 202, 55, 53, 232, 225, 212, 25, 235, 24, 36, 83, 99, 76, 222, + 195, 212, 25, 235, 24, 36, 83, 236, 242, 240, 65, 212, 25, 235, 24, 36, + 83, 236, 231, 240, 65, 212, 25, 235, 24, 36, 83, 126, 222, 75, 212, 25, + 235, 24, 36, 83, 197, 119, 126, 222, 75, 212, 25, 235, 24, 36, 83, 50, + 213, 140, 212, 25, 235, 24, 36, 83, 53, 213, 140, 212, 25, 235, 24, 36, + 83, 50, 241, 18, 179, 212, 25, 235, 24, 36, 83, 53, 241, 18, 179, 212, + 25, 235, 24, 36, 83, 50, 201, 231, 206, 245, 179, 212, 25, 235, 24, 36, + 83, 53, 201, 231, 206, 245, 179, 212, 25, 235, 24, 36, 83, 50, 58, 222, + 147, 179, 212, 25, 235, 24, 36, 83, 53, 58, 222, 147, 179, 212, 25, 235, + 24, 36, 83, 50, 52, 251, 91, 179, 212, 25, 235, 24, 36, 83, 53, 52, 251, + 91, 179, 212, 25, 235, 24, 36, 83, 50, 251, 91, 179, 212, 25, 235, 24, + 36, 83, 53, 251, 91, 179, 212, 25, 235, 24, 36, 83, 50, 241, 102, 179, + 212, 25, 235, 24, 36, 83, 53, 241, 102, 179, 212, 25, 235, 24, 36, 83, + 50, 59, 241, 102, 179, 212, 25, 235, 24, 36, 83, 53, 59, 241, 102, 179, + 207, 80, 238, 253, 59, 207, 80, 238, 253, 212, 25, 235, 24, 36, 83, 50, + 47, 179, 212, 25, 235, 24, 36, 83, 53, 47, 179, 240, 64, 214, 19, 247, + 33, 214, 19, 197, 119, 214, 19, 52, 197, 119, 214, 19, 240, 64, 126, 222, + 75, 247, 33, 126, 222, 75, 197, 119, 126, 222, 75, 4, 244, 159, 4, 143, + 244, 159, 4, 234, 217, 204, 226, 4, 207, 105, 4, 244, 168, 4, 211, 79, + 78, 4, 236, 90, 78, 4, 236, 242, 240, 65, 4, 50, 213, 140, 4, 53, 213, + 140, 4, 50, 241, 18, 179, 4, 53, 241, 18, 179, 4, 50, 201, 231, 206, 245, + 179, 4, 53, 201, 231, 206, 245, 179, 4, 31, 55, 4, 251, 111, 4, 250, 179, + 4, 98, 55, 4, 231, 6, 4, 222, 140, 55, 4, 233, 94, 55, 4, 236, 172, 55, + 4, 210, 90, 205, 177, 4, 239, 10, 55, 4, 213, 45, 55, 4, 244, 157, 250, + 168, 9, 235, 199, 70, 20, 9, 203, 92, 3, 235, 199, 57, 9, 240, 94, 70, + 20, 9, 203, 136, 234, 253, 9, 224, 237, 70, 20, 9, 235, 201, 70, 20, 9, + 235, 201, 219, 194, 20, 9, 240, 96, 70, 20, 9, 240, 96, 219, 194, 20, 9, + 224, 239, 70, 20, 9, 224, 239, 219, 194, 20, 9, 207, 41, 70, 20, 9, 207, + 41, 219, 194, 20, 9, 204, 120, 70, 20, 9, 204, 120, 219, 194, 20, 9, 1, + 232, 214, 70, 20, 9, 1, 151, 3, 220, 110, 90, 70, 20, 9, 1, 151, 3, 220, + 110, 90, 48, 20, 9, 1, 151, 3, 232, 214, 90, 70, 20, 9, 1, 151, 3, 232, + 214, 90, 48, 20, 9, 1, 197, 118, 3, 232, 214, 90, 70, 20, 9, 1, 197, 118, + 3, 232, 214, 90, 48, 20, 9, 1, 151, 3, 232, 214, 248, 227, 70, 20, 9, 1, + 151, 3, 232, 214, 248, 227, 48, 20, 9, 1, 93, 3, 232, 214, 90, 70, 20, 9, + 1, 93, 3, 232, 214, 90, 48, 20, 9, 1, 93, 3, 232, 214, 90, 84, 20, 9, 1, + 93, 3, 232, 214, 90, 219, 194, 20, 9, 1, 151, 70, 20, 9, 1, 151, 48, 20, + 9, 1, 248, 240, 70, 20, 9, 1, 248, 240, 48, 20, 9, 1, 248, 240, 84, 20, + 9, 1, 248, 240, 219, 194, 20, 9, 1, 203, 42, 220, 36, 70, 20, 9, 1, 203, + 42, 220, 36, 48, 20, 9, 1, 203, 42, 70, 20, 9, 1, 203, 42, 48, 20, 9, 1, + 203, 42, 84, 20, 9, 1, 203, 42, 219, 194, 20, 9, 1, 202, 214, 70, 20, 9, + 1, 202, 214, 48, 20, 9, 1, 202, 214, 84, 20, 9, 1, 202, 214, 219, 194, + 20, 9, 1, 225, 190, 70, 20, 9, 1, 225, 190, 48, 20, 9, 1, 225, 190, 84, + 20, 9, 1, 225, 190, 219, 194, 20, 9, 1, 168, 70, 20, 9, 1, 168, 48, 20, + 9, 1, 168, 84, 20, 9, 1, 168, 219, 194, 20, 9, 1, 224, 143, 70, 20, 9, 1, + 224, 143, 48, 20, 9, 1, 224, 143, 84, 20, 9, 1, 224, 143, 219, 194, 20, + 9, 1, 240, 108, 70, 20, 9, 1, 240, 108, 48, 20, 9, 1, 202, 226, 70, 20, + 9, 1, 202, 226, 48, 20, 9, 1, 210, 143, 70, 20, 9, 1, 210, 143, 48, 20, 9, 1, 195, 107, 70, 20, 9, 1, 195, 107, 48, 20, 9, 1, 208, 126, 70, 20, - 9, 1, 208, 126, 48, 20, 9, 1, 208, 126, 84, 20, 9, 1, 208, 126, 219, 193, + 9, 1, 208, 126, 48, 20, 9, 1, 208, 126, 84, 20, 9, 1, 208, 126, 219, 194, 20, 9, 1, 206, 252, 70, 20, 9, 1, 206, 252, 48, 20, 9, 1, 206, 252, 84, - 20, 9, 1, 206, 252, 219, 193, 20, 9, 1, 209, 9, 70, 20, 9, 1, 209, 9, 48, - 20, 9, 1, 209, 9, 84, 20, 9, 1, 209, 9, 219, 193, 20, 9, 1, 240, 130, 70, - 20, 9, 1, 240, 130, 48, 20, 9, 1, 240, 130, 84, 20, 9, 1, 240, 130, 219, - 193, 20, 9, 1, 203, 140, 70, 20, 9, 1, 203, 140, 48, 20, 9, 1, 203, 140, - 84, 20, 9, 1, 203, 140, 219, 193, 20, 9, 1, 195, 110, 70, 20, 9, 1, 195, - 110, 48, 20, 9, 1, 195, 110, 84, 20, 9, 1, 195, 110, 219, 193, 20, 9, 1, - 251, 194, 70, 20, 9, 1, 251, 194, 48, 20, 9, 1, 251, 194, 84, 20, 9, 1, - 251, 194, 219, 193, 20, 9, 1, 233, 225, 70, 20, 9, 1, 233, 225, 48, 20, - 9, 1, 233, 225, 84, 20, 9, 1, 233, 225, 219, 193, 20, 9, 1, 235, 176, 70, - 20, 9, 1, 235, 176, 48, 20, 9, 1, 235, 176, 84, 20, 9, 1, 235, 176, 219, - 193, 20, 9, 1, 211, 152, 70, 20, 9, 1, 211, 152, 48, 20, 9, 1, 211, 152, - 84, 20, 9, 1, 211, 152, 219, 193, 20, 9, 1, 225, 35, 70, 20, 9, 1, 225, - 35, 48, 20, 9, 1, 225, 35, 84, 20, 9, 1, 225, 35, 219, 193, 20, 9, 1, - 222, 249, 70, 20, 9, 1, 222, 249, 48, 20, 9, 1, 222, 249, 84, 20, 9, 1, - 222, 249, 219, 193, 20, 9, 1, 87, 70, 20, 9, 1, 87, 48, 20, 9, 1, 87, 84, - 20, 9, 1, 87, 219, 193, 20, 9, 1, 216, 31, 70, 20, 9, 1, 216, 31, 48, 20, - 9, 1, 216, 31, 84, 20, 9, 1, 216, 31, 219, 193, 20, 9, 1, 232, 113, 70, - 20, 9, 1, 232, 113, 48, 20, 9, 1, 232, 113, 84, 20, 9, 1, 232, 113, 219, - 193, 20, 9, 1, 197, 118, 70, 20, 9, 1, 197, 118, 48, 20, 9, 1, 151, 220, - 69, 70, 20, 9, 1, 151, 220, 69, 48, 20, 9, 1, 93, 70, 20, 9, 1, 93, 48, - 20, 9, 1, 93, 84, 20, 9, 1, 93, 219, 193, 20, 9, 33, 222, 249, 3, 151, 3, - 220, 109, 90, 70, 20, 9, 33, 222, 249, 3, 151, 3, 220, 109, 90, 48, 20, - 9, 33, 222, 249, 3, 151, 3, 232, 213, 90, 70, 20, 9, 33, 222, 249, 3, - 151, 3, 232, 213, 90, 48, 20, 9, 33, 222, 249, 3, 151, 3, 232, 213, 248, - 226, 70, 20, 9, 33, 222, 249, 3, 151, 3, 232, 213, 248, 226, 48, 20, 9, - 33, 222, 249, 3, 151, 70, 20, 9, 33, 222, 249, 3, 151, 48, 20, 195, 80, - 197, 59, 216, 43, 205, 148, 174, 236, 89, 78, 174, 211, 61, 78, 174, 31, - 55, 174, 239, 9, 55, 174, 213, 44, 55, 174, 251, 110, 174, 251, 29, 174, - 50, 213, 139, 174, 53, 213, 139, 174, 250, 178, 174, 98, 55, 174, 244, - 158, 174, 231, 5, 174, 234, 216, 204, 226, 174, 205, 177, 174, 17, 195, + 20, 9, 1, 206, 252, 219, 194, 20, 9, 1, 209, 9, 70, 20, 9, 1, 209, 9, 48, + 20, 9, 1, 209, 9, 84, 20, 9, 1, 209, 9, 219, 194, 20, 9, 1, 240, 131, 70, + 20, 9, 1, 240, 131, 48, 20, 9, 1, 240, 131, 84, 20, 9, 1, 240, 131, 219, + 194, 20, 9, 1, 203, 140, 70, 20, 9, 1, 203, 140, 48, 20, 9, 1, 203, 140, + 84, 20, 9, 1, 203, 140, 219, 194, 20, 9, 1, 195, 110, 70, 20, 9, 1, 195, + 110, 48, 20, 9, 1, 195, 110, 84, 20, 9, 1, 195, 110, 219, 194, 20, 9, 1, + 251, 195, 70, 20, 9, 1, 251, 195, 48, 20, 9, 1, 251, 195, 84, 20, 9, 1, + 251, 195, 219, 194, 20, 9, 1, 233, 226, 70, 20, 9, 1, 233, 226, 48, 20, + 9, 1, 233, 226, 84, 20, 9, 1, 233, 226, 219, 194, 20, 9, 1, 235, 177, 70, + 20, 9, 1, 235, 177, 48, 20, 9, 1, 235, 177, 84, 20, 9, 1, 235, 177, 219, + 194, 20, 9, 1, 211, 153, 70, 20, 9, 1, 211, 153, 48, 20, 9, 1, 211, 153, + 84, 20, 9, 1, 211, 153, 219, 194, 20, 9, 1, 225, 36, 70, 20, 9, 1, 225, + 36, 48, 20, 9, 1, 225, 36, 84, 20, 9, 1, 225, 36, 219, 194, 20, 9, 1, + 222, 250, 70, 20, 9, 1, 222, 250, 48, 20, 9, 1, 222, 250, 84, 20, 9, 1, + 222, 250, 219, 194, 20, 9, 1, 87, 70, 20, 9, 1, 87, 48, 20, 9, 1, 87, 84, + 20, 9, 1, 87, 219, 194, 20, 9, 1, 216, 32, 70, 20, 9, 1, 216, 32, 48, 20, + 9, 1, 216, 32, 84, 20, 9, 1, 216, 32, 219, 194, 20, 9, 1, 232, 114, 70, + 20, 9, 1, 232, 114, 48, 20, 9, 1, 232, 114, 84, 20, 9, 1, 232, 114, 219, + 194, 20, 9, 1, 197, 118, 70, 20, 9, 1, 197, 118, 48, 20, 9, 1, 151, 220, + 70, 70, 20, 9, 1, 151, 220, 70, 48, 20, 9, 1, 93, 70, 20, 9, 1, 93, 48, + 20, 9, 1, 93, 84, 20, 9, 1, 93, 219, 194, 20, 9, 33, 222, 250, 3, 151, 3, + 220, 110, 90, 70, 20, 9, 33, 222, 250, 3, 151, 3, 220, 110, 90, 48, 20, + 9, 33, 222, 250, 3, 151, 3, 232, 214, 90, 70, 20, 9, 33, 222, 250, 3, + 151, 3, 232, 214, 90, 48, 20, 9, 33, 222, 250, 3, 151, 3, 232, 214, 248, + 227, 70, 20, 9, 33, 222, 250, 3, 151, 3, 232, 214, 248, 227, 48, 20, 9, + 33, 222, 250, 3, 151, 70, 20, 9, 33, 222, 250, 3, 151, 48, 20, 195, 80, + 197, 59, 216, 44, 205, 148, 174, 236, 90, 78, 174, 211, 62, 78, 174, 31, + 55, 174, 239, 10, 55, 174, 213, 45, 55, 174, 251, 111, 174, 251, 30, 174, + 50, 213, 140, 174, 53, 213, 140, 174, 250, 179, 174, 98, 55, 174, 244, + 159, 174, 231, 6, 174, 234, 217, 204, 226, 174, 205, 177, 174, 17, 195, 79, 174, 17, 100, 174, 17, 102, 174, 17, 134, 174, 17, 136, 174, 17, 146, - 174, 17, 167, 174, 17, 178, 174, 17, 171, 174, 17, 182, 174, 244, 167, - 174, 207, 105, 174, 222, 139, 55, 174, 236, 171, 55, 174, 233, 93, 55, - 174, 211, 78, 78, 174, 244, 156, 250, 167, 174, 8, 6, 1, 63, 174, 8, 6, - 1, 250, 111, 174, 8, 6, 1, 247, 206, 174, 8, 6, 1, 240, 230, 174, 8, 6, - 1, 69, 174, 8, 6, 1, 236, 48, 174, 8, 6, 1, 234, 189, 174, 8, 6, 1, 233, - 14, 174, 8, 6, 1, 68, 174, 8, 6, 1, 225, 216, 174, 8, 6, 1, 225, 79, 174, - 8, 6, 1, 159, 174, 8, 6, 1, 221, 135, 174, 8, 6, 1, 218, 54, 174, 8, 6, - 1, 72, 174, 8, 6, 1, 214, 2, 174, 8, 6, 1, 211, 166, 174, 8, 6, 1, 144, + 174, 17, 167, 174, 17, 178, 174, 17, 171, 174, 17, 182, 174, 244, 168, + 174, 207, 105, 174, 222, 140, 55, 174, 236, 172, 55, 174, 233, 94, 55, + 174, 211, 79, 78, 174, 244, 157, 250, 168, 174, 8, 6, 1, 63, 174, 8, 6, + 1, 250, 112, 174, 8, 6, 1, 247, 207, 174, 8, 6, 1, 240, 231, 174, 8, 6, + 1, 69, 174, 8, 6, 1, 236, 49, 174, 8, 6, 1, 234, 190, 174, 8, 6, 1, 233, + 15, 174, 8, 6, 1, 68, 174, 8, 6, 1, 225, 217, 174, 8, 6, 1, 225, 80, 174, + 8, 6, 1, 159, 174, 8, 6, 1, 221, 136, 174, 8, 6, 1, 218, 55, 174, 8, 6, + 1, 72, 174, 8, 6, 1, 214, 3, 174, 8, 6, 1, 211, 167, 174, 8, 6, 1, 144, 174, 8, 6, 1, 209, 80, 174, 8, 6, 1, 203, 216, 174, 8, 6, 1, 66, 174, 8, 6, 1, 199, 230, 174, 8, 6, 1, 197, 199, 174, 8, 6, 1, 196, 222, 174, 8, 6, 1, 196, 148, 174, 8, 6, 1, 195, 158, 174, 50, 47, 179, 174, 210, 90, - 205, 177, 174, 53, 47, 179, 174, 244, 240, 252, 21, 174, 126, 222, 74, - 174, 233, 100, 252, 21, 174, 8, 4, 1, 63, 174, 8, 4, 1, 250, 111, 174, 8, - 4, 1, 247, 206, 174, 8, 4, 1, 240, 230, 174, 8, 4, 1, 69, 174, 8, 4, 1, - 236, 48, 174, 8, 4, 1, 234, 189, 174, 8, 4, 1, 233, 14, 174, 8, 4, 1, 68, - 174, 8, 4, 1, 225, 216, 174, 8, 4, 1, 225, 79, 174, 8, 4, 1, 159, 174, 8, - 4, 1, 221, 135, 174, 8, 4, 1, 218, 54, 174, 8, 4, 1, 72, 174, 8, 4, 1, - 214, 2, 174, 8, 4, 1, 211, 166, 174, 8, 4, 1, 144, 174, 8, 4, 1, 209, 80, + 205, 177, 174, 53, 47, 179, 174, 244, 241, 252, 22, 174, 126, 222, 75, + 174, 233, 101, 252, 22, 174, 8, 4, 1, 63, 174, 8, 4, 1, 250, 112, 174, 8, + 4, 1, 247, 207, 174, 8, 4, 1, 240, 231, 174, 8, 4, 1, 69, 174, 8, 4, 1, + 236, 49, 174, 8, 4, 1, 234, 190, 174, 8, 4, 1, 233, 15, 174, 8, 4, 1, 68, + 174, 8, 4, 1, 225, 217, 174, 8, 4, 1, 225, 80, 174, 8, 4, 1, 159, 174, 8, + 4, 1, 221, 136, 174, 8, 4, 1, 218, 55, 174, 8, 4, 1, 72, 174, 8, 4, 1, + 214, 3, 174, 8, 4, 1, 211, 167, 174, 8, 4, 1, 144, 174, 8, 4, 1, 209, 80, 174, 8, 4, 1, 203, 216, 174, 8, 4, 1, 66, 174, 8, 4, 1, 199, 230, 174, 8, 4, 1, 197, 199, 174, 8, 4, 1, 196, 222, 174, 8, 4, 1, 196, 148, 174, 8, - 4, 1, 195, 158, 174, 50, 241, 17, 179, 174, 83, 222, 74, 174, 53, 241, - 17, 179, 174, 202, 84, 174, 50, 59, 213, 139, 174, 53, 59, 213, 139, 138, - 143, 234, 216, 204, 226, 138, 50, 241, 101, 179, 138, 53, 241, 101, 179, - 138, 143, 244, 158, 138, 71, 112, 238, 252, 138, 71, 1, 197, 34, 138, 71, + 4, 1, 195, 158, 174, 50, 241, 18, 179, 174, 83, 222, 75, 174, 53, 241, + 18, 179, 174, 202, 84, 174, 50, 59, 213, 140, 174, 53, 59, 213, 140, 138, + 143, 234, 217, 204, 226, 138, 50, 241, 102, 179, 138, 53, 241, 102, 179, + 138, 143, 244, 159, 138, 71, 112, 238, 253, 138, 71, 1, 197, 34, 138, 71, 1, 4, 63, 138, 71, 1, 4, 68, 138, 71, 1, 4, 66, 138, 71, 1, 4, 69, 138, 71, 1, 4, 72, 138, 71, 1, 4, 164, 138, 71, 1, 4, 195, 217, 138, 71, 1, 4, - 196, 3, 138, 71, 1, 4, 201, 40, 138, 224, 233, 211, 251, 205, 162, 78, + 196, 3, 138, 71, 1, 4, 201, 40, 138, 224, 234, 211, 252, 205, 162, 78, 138, 71, 1, 63, 138, 71, 1, 68, 138, 71, 1, 66, 138, 71, 1, 69, 138, 71, - 1, 72, 138, 71, 1, 155, 138, 71, 1, 224, 100, 138, 71, 1, 223, 186, 138, - 71, 1, 224, 208, 138, 71, 1, 224, 10, 138, 71, 1, 183, 138, 71, 1, 206, + 1, 72, 138, 71, 1, 155, 138, 71, 1, 224, 101, 138, 71, 1, 223, 187, 138, + 71, 1, 224, 209, 138, 71, 1, 224, 11, 138, 71, 1, 183, 138, 71, 1, 206, 112, 138, 71, 1, 204, 172, 138, 71, 1, 208, 147, 138, 71, 1, 205, 200, 138, 71, 1, 189, 138, 71, 1, 202, 122, 138, 71, 1, 201, 40, 138, 71, 1, - 203, 68, 138, 71, 1, 149, 138, 71, 1, 176, 138, 71, 1, 216, 222, 138, 71, - 1, 215, 185, 138, 71, 1, 217, 117, 138, 71, 1, 216, 49, 138, 71, 1, 142, - 138, 71, 1, 232, 70, 138, 71, 1, 231, 74, 138, 71, 1, 232, 146, 138, 71, - 1, 231, 192, 138, 71, 1, 166, 138, 71, 1, 219, 77, 138, 71, 1, 218, 144, - 138, 71, 1, 219, 206, 138, 71, 1, 218, 250, 138, 71, 1, 164, 138, 71, 1, + 203, 68, 138, 71, 1, 149, 138, 71, 1, 176, 138, 71, 1, 216, 223, 138, 71, + 1, 215, 186, 138, 71, 1, 217, 118, 138, 71, 1, 216, 50, 138, 71, 1, 142, + 138, 71, 1, 232, 71, 138, 71, 1, 231, 75, 138, 71, 1, 232, 147, 138, 71, + 1, 231, 193, 138, 71, 1, 166, 138, 71, 1, 219, 78, 138, 71, 1, 218, 145, + 138, 71, 1, 219, 207, 138, 71, 1, 218, 251, 138, 71, 1, 164, 138, 71, 1, 195, 217, 138, 71, 1, 196, 3, 138, 71, 1, 169, 138, 71, 1, 210, 72, 138, - 71, 1, 209, 140, 138, 71, 1, 210, 182, 138, 71, 1, 209, 232, 138, 71, 1, - 197, 166, 138, 71, 1, 218, 54, 138, 71, 198, 244, 205, 162, 78, 138, 71, - 207, 110, 205, 162, 78, 138, 29, 235, 133, 138, 29, 1, 224, 47, 138, 29, - 1, 205, 72, 138, 29, 1, 224, 40, 138, 29, 1, 216, 207, 138, 29, 1, 216, - 205, 138, 29, 1, 216, 204, 138, 29, 1, 202, 97, 138, 29, 1, 205, 61, 138, + 71, 1, 209, 140, 138, 71, 1, 210, 183, 138, 71, 1, 209, 232, 138, 71, 1, + 197, 166, 138, 71, 1, 218, 55, 138, 71, 198, 244, 205, 162, 78, 138, 71, + 207, 110, 205, 162, 78, 138, 29, 235, 134, 138, 29, 1, 224, 48, 138, 29, + 1, 205, 72, 138, 29, 1, 224, 41, 138, 29, 1, 216, 208, 138, 29, 1, 216, + 206, 138, 29, 1, 216, 205, 138, 29, 1, 202, 97, 138, 29, 1, 205, 61, 138, 29, 1, 210, 54, 138, 29, 1, 210, 49, 138, 29, 1, 210, 46, 138, 29, 1, 210, 39, 138, 29, 1, 210, 34, 138, 29, 1, 210, 29, 138, 29, 1, 210, 40, - 138, 29, 1, 210, 52, 138, 29, 1, 219, 55, 138, 29, 1, 212, 205, 138, 29, - 1, 205, 69, 138, 29, 1, 212, 194, 138, 29, 1, 206, 52, 138, 29, 1, 205, - 66, 138, 29, 1, 226, 142, 138, 29, 1, 245, 5, 138, 29, 1, 205, 76, 138, - 29, 1, 245, 70, 138, 29, 1, 224, 121, 138, 29, 1, 202, 191, 138, 29, 1, - 212, 243, 138, 29, 1, 232, 54, 138, 29, 1, 63, 138, 29, 1, 251, 244, 138, - 29, 1, 164, 138, 29, 1, 196, 118, 138, 29, 1, 236, 191, 138, 29, 1, 69, + 138, 29, 1, 210, 52, 138, 29, 1, 219, 56, 138, 29, 1, 212, 206, 138, 29, + 1, 205, 69, 138, 29, 1, 212, 195, 138, 29, 1, 206, 52, 138, 29, 1, 205, + 66, 138, 29, 1, 226, 143, 138, 29, 1, 245, 6, 138, 29, 1, 205, 76, 138, + 29, 1, 245, 71, 138, 29, 1, 224, 122, 138, 29, 1, 202, 191, 138, 29, 1, + 212, 244, 138, 29, 1, 232, 55, 138, 29, 1, 63, 138, 29, 1, 251, 245, 138, + 29, 1, 164, 138, 29, 1, 196, 118, 138, 29, 1, 236, 192, 138, 29, 1, 69, 138, 29, 1, 196, 56, 138, 29, 1, 196, 69, 138, 29, 1, 72, 138, 29, 1, - 197, 166, 138, 29, 1, 197, 157, 138, 29, 1, 214, 163, 138, 29, 1, 196, 3, + 197, 166, 138, 29, 1, 197, 157, 138, 29, 1, 214, 164, 138, 29, 1, 196, 3, 138, 29, 1, 66, 138, 29, 1, 197, 91, 138, 29, 1, 197, 109, 138, 29, 1, - 197, 70, 138, 29, 1, 195, 217, 138, 29, 1, 236, 115, 138, 29, 1, 196, 24, - 138, 29, 1, 68, 174, 247, 38, 55, 174, 212, 62, 55, 174, 216, 18, 55, - 174, 220, 113, 174, 248, 32, 154, 174, 196, 60, 55, 174, 197, 17, 55, - 138, 235, 18, 175, 199, 100, 138, 107, 51, 138, 200, 24, 51, 138, 91, 51, - 138, 237, 230, 51, 138, 58, 205, 94, 138, 59, 244, 248, 226, 29, 251, 75, - 251, 101, 226, 29, 251, 75, 207, 90, 226, 29, 251, 75, 203, 8, 214, 182, - 210, 114, 246, 254, 210, 114, 246, 254, 30, 74, 5, 250, 95, 63, 30, 74, - 5, 250, 64, 69, 30, 74, 5, 250, 73, 68, 30, 74, 5, 250, 41, 72, 30, 74, - 5, 250, 91, 66, 30, 74, 5, 250, 110, 240, 135, 30, 74, 5, 250, 57, 239, - 251, 30, 74, 5, 250, 97, 239, 151, 30, 74, 5, 250, 87, 239, 27, 30, 74, - 5, 250, 51, 237, 200, 30, 74, 5, 250, 45, 225, 213, 30, 74, 5, 250, 56, - 225, 192, 30, 74, 5, 250, 66, 225, 128, 30, 74, 5, 250, 37, 225, 109, 30, - 74, 5, 250, 25, 155, 30, 74, 5, 250, 58, 224, 208, 30, 74, 5, 250, 35, - 224, 100, 30, 74, 5, 250, 32, 224, 10, 30, 74, 5, 250, 21, 223, 186, 30, - 74, 5, 250, 22, 166, 30, 74, 5, 250, 88, 219, 206, 30, 74, 5, 250, 29, - 219, 77, 30, 74, 5, 250, 86, 218, 250, 30, 74, 5, 250, 78, 218, 144, 30, - 74, 5, 250, 99, 176, 30, 74, 5, 250, 77, 217, 117, 30, 74, 5, 250, 71, - 216, 222, 30, 74, 5, 250, 50, 216, 49, 30, 74, 5, 250, 47, 215, 185, 30, - 74, 5, 250, 106, 161, 30, 74, 5, 250, 30, 213, 91, 30, 74, 5, 250, 63, - 212, 219, 30, 74, 5, 250, 90, 212, 116, 30, 74, 5, 250, 52, 211, 226, 30, - 74, 5, 250, 85, 211, 158, 30, 74, 5, 250, 24, 211, 138, 30, 74, 5, 250, - 80, 211, 120, 30, 74, 5, 250, 69, 211, 108, 30, 74, 5, 250, 42, 169, 30, - 74, 5, 250, 74, 210, 182, 30, 74, 5, 250, 49, 210, 72, 30, 74, 5, 250, - 108, 209, 232, 30, 74, 5, 250, 75, 209, 140, 30, 74, 5, 250, 70, 183, 30, - 74, 5, 250, 93, 208, 147, 30, 74, 5, 250, 61, 206, 112, 30, 74, 5, 250, - 89, 205, 200, 30, 74, 5, 250, 44, 204, 172, 30, 74, 5, 250, 43, 189, 30, - 74, 5, 250, 104, 203, 68, 30, 74, 5, 250, 65, 202, 122, 30, 74, 5, 250, - 102, 149, 30, 74, 5, 250, 33, 201, 40, 30, 74, 5, 250, 48, 197, 166, 30, - 74, 5, 250, 27, 197, 109, 30, 74, 5, 250, 62, 197, 70, 30, 74, 5, 250, - 60, 197, 34, 30, 74, 5, 250, 84, 195, 115, 30, 74, 5, 250, 28, 195, 88, - 30, 74, 5, 250, 81, 195, 11, 30, 74, 5, 250, 76, 254, 176, 30, 74, 5, - 250, 59, 254, 64, 30, 74, 5, 250, 18, 250, 149, 30, 74, 5, 250, 31, 237, - 165, 30, 74, 5, 250, 14, 237, 164, 30, 74, 5, 250, 54, 215, 117, 30, 74, - 5, 250, 72, 211, 224, 30, 74, 5, 250, 40, 211, 228, 30, 74, 5, 250, 26, - 210, 245, 30, 74, 5, 250, 68, 210, 244, 30, 74, 5, 250, 34, 209, 225, 30, - 74, 5, 250, 36, 203, 163, 30, 74, 5, 250, 16, 200, 243, 30, 74, 5, 250, - 13, 102, 30, 74, 16, 250, 83, 30, 74, 16, 250, 82, 30, 74, 16, 250, 79, - 30, 74, 16, 250, 67, 30, 74, 16, 250, 55, 30, 74, 16, 250, 53, 30, 74, - 16, 250, 46, 30, 74, 16, 250, 39, 30, 74, 16, 250, 38, 30, 74, 16, 250, - 23, 30, 74, 16, 250, 20, 30, 74, 16, 250, 19, 30, 74, 16, 250, 17, 30, - 74, 16, 250, 15, 30, 74, 147, 250, 12, 220, 61, 30, 74, 147, 250, 11, - 197, 21, 30, 74, 147, 250, 10, 239, 233, 30, 74, 147, 250, 9, 236, 168, - 30, 74, 147, 250, 8, 220, 28, 30, 74, 147, 250, 7, 205, 15, 30, 74, 147, - 250, 6, 236, 96, 30, 74, 147, 250, 5, 210, 209, 30, 74, 147, 250, 4, 206, - 254, 30, 74, 147, 250, 3, 232, 138, 30, 74, 147, 250, 2, 205, 156, 30, - 74, 147, 250, 1, 248, 113, 30, 74, 147, 250, 0, 241, 82, 30, 74, 147, - 249, 255, 248, 6, 30, 74, 147, 249, 254, 197, 79, 30, 74, 147, 249, 253, - 249, 75, 30, 74, 147, 249, 252, 214, 128, 30, 74, 147, 249, 251, 205, - 126, 30, 74, 147, 249, 250, 240, 238, 30, 74, 218, 204, 249, 249, 225, 3, - 30, 74, 218, 204, 249, 248, 225, 14, 30, 74, 147, 249, 247, 214, 143, 30, - 74, 147, 249, 246, 197, 46, 30, 74, 147, 249, 245, 30, 74, 218, 204, 249, - 244, 250, 243, 30, 74, 218, 204, 249, 243, 219, 155, 30, 74, 147, 249, - 242, 248, 31, 30, 74, 147, 249, 241, 233, 134, 30, 74, 147, 249, 240, 30, - 74, 147, 249, 239, 197, 12, 30, 74, 147, 249, 238, 30, 74, 147, 249, 237, - 30, 74, 147, 249, 236, 231, 101, 30, 74, 147, 249, 235, 30, 74, 147, 249, - 234, 30, 74, 147, 249, 233, 30, 74, 218, 204, 249, 231, 201, 2, 30, 74, - 147, 249, 230, 30, 74, 147, 249, 229, 30, 74, 147, 249, 228, 244, 196, - 30, 74, 147, 249, 227, 30, 74, 147, 249, 226, 30, 74, 147, 249, 225, 234, - 78, 30, 74, 147, 249, 224, 250, 228, 30, 74, 147, 249, 223, 30, 74, 147, - 249, 222, 30, 74, 147, 249, 221, 30, 74, 147, 249, 220, 30, 74, 147, 249, - 219, 30, 74, 147, 249, 218, 30, 74, 147, 249, 217, 30, 74, 147, 249, 216, - 30, 74, 147, 249, 215, 30, 74, 147, 249, 214, 218, 196, 30, 74, 147, 249, - 213, 30, 74, 147, 249, 212, 201, 190, 30, 74, 147, 249, 211, 30, 74, 147, - 249, 210, 30, 74, 147, 249, 209, 30, 74, 147, 249, 208, 30, 74, 147, 249, - 207, 30, 74, 147, 249, 206, 30, 74, 147, 249, 205, 30, 74, 147, 249, 204, - 30, 74, 147, 249, 203, 30, 74, 147, 249, 202, 30, 74, 147, 249, 201, 30, - 74, 147, 249, 200, 232, 102, 30, 74, 147, 249, 179, 235, 32, 30, 74, 147, - 249, 176, 249, 50, 30, 74, 147, 249, 171, 205, 134, 30, 74, 147, 249, - 170, 51, 30, 74, 147, 249, 169, 30, 74, 147, 249, 168, 204, 48, 30, 74, - 147, 249, 167, 30, 74, 147, 249, 166, 30, 74, 147, 249, 165, 197, 74, - 245, 111, 30, 74, 147, 249, 164, 245, 111, 30, 74, 147, 249, 163, 245, - 112, 234, 249, 30, 74, 147, 249, 162, 197, 77, 30, 74, 147, 249, 161, 30, - 74, 147, 249, 160, 30, 74, 218, 204, 249, 159, 239, 86, 30, 74, 147, 249, - 158, 30, 74, 147, 249, 157, 30, 74, 147, 249, 155, 30, 74, 147, 249, 154, - 30, 74, 147, 249, 153, 30, 74, 147, 249, 152, 240, 67, 30, 74, 147, 249, - 151, 30, 74, 147, 249, 150, 30, 74, 147, 249, 149, 30, 74, 147, 249, 148, - 30, 74, 147, 249, 147, 30, 74, 147, 199, 47, 249, 232, 30, 74, 147, 199, - 47, 249, 199, 30, 74, 147, 199, 47, 249, 198, 30, 74, 147, 199, 47, 249, - 197, 30, 74, 147, 199, 47, 249, 196, 30, 74, 147, 199, 47, 249, 195, 30, - 74, 147, 199, 47, 249, 194, 30, 74, 147, 199, 47, 249, 193, 30, 74, 147, - 199, 47, 249, 192, 30, 74, 147, 199, 47, 249, 191, 30, 74, 147, 199, 47, - 249, 190, 30, 74, 147, 199, 47, 249, 189, 30, 74, 147, 199, 47, 249, 188, - 30, 74, 147, 199, 47, 249, 187, 30, 74, 147, 199, 47, 249, 186, 30, 74, - 147, 199, 47, 249, 185, 30, 74, 147, 199, 47, 249, 184, 30, 74, 147, 199, - 47, 249, 183, 30, 74, 147, 199, 47, 249, 182, 30, 74, 147, 199, 47, 249, - 181, 30, 74, 147, 199, 47, 249, 180, 30, 74, 147, 199, 47, 249, 178, 30, - 74, 147, 199, 47, 249, 177, 30, 74, 147, 199, 47, 249, 175, 30, 74, 147, - 199, 47, 249, 174, 30, 74, 147, 199, 47, 249, 173, 30, 74, 147, 199, 47, - 249, 172, 30, 74, 147, 199, 47, 249, 156, 30, 74, 147, 199, 47, 249, 146, - 251, 237, 197, 9, 207, 91, 222, 74, 251, 237, 197, 9, 207, 91, 238, 252, - 251, 237, 245, 101, 78, 251, 237, 31, 100, 251, 237, 31, 102, 251, 237, - 31, 134, 251, 237, 31, 136, 251, 237, 31, 146, 251, 237, 31, 167, 251, - 237, 31, 178, 251, 237, 31, 171, 251, 237, 31, 182, 251, 237, 31, 203, - 23, 251, 237, 31, 200, 234, 251, 237, 31, 202, 177, 251, 237, 31, 235, - 13, 251, 237, 31, 235, 144, 251, 237, 31, 206, 13, 251, 237, 31, 207, 65, - 251, 237, 31, 237, 19, 251, 237, 31, 216, 173, 251, 237, 31, 97, 231, 56, - 251, 237, 31, 99, 231, 56, 251, 237, 31, 115, 231, 56, 251, 237, 31, 235, - 6, 231, 56, 251, 237, 31, 235, 100, 231, 56, 251, 237, 31, 206, 29, 231, - 56, 251, 237, 31, 207, 71, 231, 56, 251, 237, 31, 237, 30, 231, 56, 251, - 237, 31, 216, 178, 231, 56, 251, 237, 31, 97, 170, 251, 237, 31, 99, 170, - 251, 237, 31, 115, 170, 251, 237, 31, 235, 6, 170, 251, 237, 31, 235, - 100, 170, 251, 237, 31, 206, 29, 170, 251, 237, 31, 207, 71, 170, 251, - 237, 31, 237, 30, 170, 251, 237, 31, 216, 178, 170, 251, 237, 31, 203, - 24, 170, 251, 237, 31, 200, 235, 170, 251, 237, 31, 202, 178, 170, 251, - 237, 31, 235, 14, 170, 251, 237, 31, 235, 145, 170, 251, 237, 31, 206, - 14, 170, 251, 237, 31, 207, 66, 170, 251, 237, 31, 237, 20, 170, 251, - 237, 31, 216, 174, 170, 251, 237, 197, 94, 249, 66, 200, 49, 251, 237, - 197, 94, 235, 112, 204, 137, 251, 237, 197, 94, 208, 136, 204, 137, 251, - 237, 197, 94, 202, 185, 204, 137, 251, 237, 197, 94, 234, 255, 204, 137, - 251, 237, 237, 203, 219, 202, 235, 112, 204, 137, 251, 237, 222, 55, 219, - 202, 235, 112, 204, 137, 251, 237, 219, 202, 208, 136, 204, 137, 251, - 237, 219, 202, 202, 185, 204, 137, 32, 252, 12, 250, 151, 97, 211, 86, - 32, 252, 12, 250, 151, 97, 232, 224, 32, 252, 12, 250, 151, 97, 237, 226, - 32, 252, 12, 250, 151, 146, 32, 252, 12, 250, 151, 235, 144, 32, 252, 12, - 250, 151, 235, 100, 231, 56, 32, 252, 12, 250, 151, 235, 100, 170, 32, - 252, 12, 250, 151, 235, 145, 170, 32, 252, 12, 250, 151, 235, 100, 203, - 123, 32, 252, 12, 250, 151, 203, 24, 203, 123, 32, 252, 12, 250, 151, - 235, 145, 203, 123, 32, 252, 12, 250, 151, 97, 231, 57, 203, 123, 32, - 252, 12, 250, 151, 235, 100, 231, 57, 203, 123, 32, 252, 12, 250, 151, - 97, 202, 159, 203, 123, 32, 252, 12, 250, 151, 235, 100, 202, 159, 203, - 123, 32, 252, 12, 250, 151, 235, 100, 204, 255, 32, 252, 12, 250, 151, - 203, 24, 204, 255, 32, 252, 12, 250, 151, 235, 145, 204, 255, 32, 252, - 12, 250, 151, 97, 231, 57, 204, 255, 32, 252, 12, 250, 151, 235, 100, - 231, 57, 204, 255, 32, 252, 12, 250, 151, 97, 202, 159, 204, 255, 32, - 252, 12, 250, 151, 203, 24, 202, 159, 204, 255, 32, 252, 12, 250, 151, - 235, 145, 202, 159, 204, 255, 32, 252, 12, 250, 151, 203, 24, 218, 253, - 32, 252, 12, 232, 96, 97, 212, 134, 32, 252, 12, 202, 201, 100, 32, 252, - 12, 232, 92, 100, 32, 252, 12, 236, 177, 102, 32, 252, 12, 202, 201, 102, - 32, 252, 12, 240, 235, 99, 237, 225, 32, 252, 12, 236, 177, 99, 237, 225, - 32, 252, 12, 201, 156, 146, 32, 252, 12, 201, 156, 203, 23, 32, 252, 12, - 201, 156, 203, 24, 251, 130, 20, 32, 252, 12, 232, 92, 203, 23, 32, 252, - 12, 219, 144, 203, 23, 32, 252, 12, 202, 201, 203, 23, 32, 252, 12, 202, - 201, 202, 177, 32, 252, 12, 201, 156, 235, 144, 32, 252, 12, 201, 156, - 235, 145, 251, 130, 20, 32, 252, 12, 232, 92, 235, 144, 32, 252, 12, 202, - 201, 235, 144, 32, 252, 12, 202, 201, 97, 231, 56, 32, 252, 12, 202, 201, - 115, 231, 56, 32, 252, 12, 236, 177, 235, 100, 231, 56, 32, 252, 12, 201, - 156, 235, 100, 231, 56, 32, 252, 12, 202, 201, 235, 100, 231, 56, 32, - 252, 12, 247, 95, 235, 100, 231, 56, 32, 252, 12, 217, 195, 235, 100, - 231, 56, 32, 252, 12, 202, 201, 97, 170, 32, 252, 12, 202, 201, 235, 100, - 170, 32, 252, 12, 239, 214, 235, 100, 218, 253, 32, 252, 12, 204, 214, - 235, 145, 218, 253, 32, 97, 157, 55, 32, 97, 157, 2, 251, 130, 20, 32, - 99, 202, 182, 55, 32, 115, 211, 85, 55, 32, 196, 67, 55, 32, 203, 124, - 55, 32, 237, 227, 55, 32, 214, 179, 55, 32, 99, 214, 178, 55, 32, 115, - 214, 178, 55, 32, 235, 6, 214, 178, 55, 32, 235, 100, 214, 178, 55, 32, - 219, 138, 55, 32, 223, 107, 249, 66, 55, 32, 222, 48, 55, 32, 214, 35, - 55, 32, 196, 199, 55, 32, 250, 208, 55, 32, 250, 224, 55, 32, 233, 109, - 55, 32, 201, 116, 249, 66, 55, 32, 195, 80, 55, 32, 97, 211, 87, 55, 32, - 206, 54, 55, 32, 226, 66, 55, 216, 38, 55, 209, 208, 207, 62, 55, 209, + 197, 70, 138, 29, 1, 195, 217, 138, 29, 1, 236, 116, 138, 29, 1, 196, 24, + 138, 29, 1, 68, 174, 247, 39, 55, 174, 212, 63, 55, 174, 216, 19, 55, + 174, 220, 114, 174, 248, 33, 154, 174, 196, 60, 55, 174, 197, 17, 55, + 138, 235, 19, 175, 199, 100, 138, 107, 51, 138, 200, 24, 51, 138, 91, 51, + 138, 237, 231, 51, 138, 58, 205, 94, 138, 59, 244, 249, 226, 30, 251, 76, + 251, 102, 226, 30, 251, 76, 207, 90, 226, 30, 251, 76, 203, 8, 214, 183, + 210, 114, 246, 255, 210, 114, 246, 255, 30, 74, 5, 250, 96, 63, 30, 74, + 5, 250, 65, 69, 30, 74, 5, 250, 74, 68, 30, 74, 5, 250, 42, 72, 30, 74, + 5, 250, 92, 66, 30, 74, 5, 250, 111, 240, 136, 30, 74, 5, 250, 58, 239, + 252, 30, 74, 5, 250, 98, 239, 152, 30, 74, 5, 250, 88, 239, 28, 30, 74, + 5, 250, 52, 237, 201, 30, 74, 5, 250, 46, 225, 214, 30, 74, 5, 250, 57, + 225, 193, 30, 74, 5, 250, 67, 225, 129, 30, 74, 5, 250, 38, 225, 110, 30, + 74, 5, 250, 26, 155, 30, 74, 5, 250, 59, 224, 209, 30, 74, 5, 250, 36, + 224, 101, 30, 74, 5, 250, 33, 224, 11, 30, 74, 5, 250, 22, 223, 187, 30, + 74, 5, 250, 23, 166, 30, 74, 5, 250, 89, 219, 207, 30, 74, 5, 250, 30, + 219, 78, 30, 74, 5, 250, 87, 218, 251, 30, 74, 5, 250, 79, 218, 145, 30, + 74, 5, 250, 100, 176, 30, 74, 5, 250, 78, 217, 118, 30, 74, 5, 250, 72, + 216, 223, 30, 74, 5, 250, 51, 216, 50, 30, 74, 5, 250, 48, 215, 186, 30, + 74, 5, 250, 107, 161, 30, 74, 5, 250, 31, 213, 92, 30, 74, 5, 250, 64, + 212, 220, 30, 74, 5, 250, 91, 212, 117, 30, 74, 5, 250, 53, 211, 227, 30, + 74, 5, 250, 86, 211, 159, 30, 74, 5, 250, 25, 211, 139, 30, 74, 5, 250, + 81, 211, 121, 30, 74, 5, 250, 70, 211, 109, 30, 74, 5, 250, 43, 169, 30, + 74, 5, 250, 75, 210, 183, 30, 74, 5, 250, 50, 210, 72, 30, 74, 5, 250, + 109, 209, 232, 30, 74, 5, 250, 76, 209, 140, 30, 74, 5, 250, 71, 183, 30, + 74, 5, 250, 94, 208, 147, 30, 74, 5, 250, 62, 206, 112, 30, 74, 5, 250, + 90, 205, 200, 30, 74, 5, 250, 45, 204, 172, 30, 74, 5, 250, 44, 189, 30, + 74, 5, 250, 105, 203, 68, 30, 74, 5, 250, 66, 202, 122, 30, 74, 5, 250, + 103, 149, 30, 74, 5, 250, 34, 201, 40, 30, 74, 5, 250, 49, 197, 166, 30, + 74, 5, 250, 28, 197, 109, 30, 74, 5, 250, 63, 197, 70, 30, 74, 5, 250, + 61, 197, 34, 30, 74, 5, 250, 85, 195, 115, 30, 74, 5, 250, 29, 195, 88, + 30, 74, 5, 250, 82, 195, 11, 30, 74, 5, 250, 77, 254, 177, 30, 74, 5, + 250, 60, 254, 65, 30, 74, 5, 250, 19, 250, 150, 30, 74, 5, 250, 32, 237, + 166, 30, 74, 5, 250, 15, 237, 165, 30, 74, 5, 250, 55, 215, 118, 30, 74, + 5, 250, 73, 211, 225, 30, 74, 5, 250, 41, 211, 229, 30, 74, 5, 250, 27, + 210, 246, 30, 74, 5, 250, 69, 210, 245, 30, 74, 5, 250, 35, 209, 225, 30, + 74, 5, 250, 37, 203, 163, 30, 74, 5, 250, 17, 200, 243, 30, 74, 5, 250, + 14, 102, 30, 74, 16, 250, 84, 30, 74, 16, 250, 83, 30, 74, 16, 250, 80, + 30, 74, 16, 250, 68, 30, 74, 16, 250, 56, 30, 74, 16, 250, 54, 30, 74, + 16, 250, 47, 30, 74, 16, 250, 40, 30, 74, 16, 250, 39, 30, 74, 16, 250, + 24, 30, 74, 16, 250, 21, 30, 74, 16, 250, 20, 30, 74, 16, 250, 18, 30, + 74, 16, 250, 16, 30, 74, 147, 250, 13, 220, 62, 30, 74, 147, 250, 12, + 197, 21, 30, 74, 147, 250, 11, 239, 234, 30, 74, 147, 250, 10, 236, 169, + 30, 74, 147, 250, 9, 220, 29, 30, 74, 147, 250, 8, 205, 15, 30, 74, 147, + 250, 7, 236, 97, 30, 74, 147, 250, 6, 210, 210, 30, 74, 147, 250, 5, 206, + 254, 30, 74, 147, 250, 4, 232, 139, 30, 74, 147, 250, 3, 205, 156, 30, + 74, 147, 250, 2, 248, 114, 30, 74, 147, 250, 1, 241, 83, 30, 74, 147, + 250, 0, 248, 7, 30, 74, 147, 249, 255, 197, 79, 30, 74, 147, 249, 254, + 249, 76, 30, 74, 147, 249, 253, 214, 129, 30, 74, 147, 249, 252, 205, + 126, 30, 74, 147, 249, 251, 240, 239, 30, 74, 218, 205, 249, 250, 225, 4, + 30, 74, 218, 205, 249, 249, 225, 15, 30, 74, 147, 249, 248, 214, 144, 30, + 74, 147, 249, 247, 197, 46, 30, 74, 147, 249, 246, 30, 74, 218, 205, 249, + 245, 250, 244, 30, 74, 218, 205, 249, 244, 219, 156, 30, 74, 147, 249, + 243, 248, 32, 30, 74, 147, 249, 242, 233, 135, 30, 74, 147, 249, 241, 30, + 74, 147, 249, 240, 197, 12, 30, 74, 147, 249, 239, 30, 74, 147, 249, 238, + 30, 74, 147, 249, 237, 231, 102, 30, 74, 147, 249, 236, 30, 74, 147, 249, + 235, 30, 74, 147, 249, 234, 30, 74, 218, 205, 249, 232, 201, 2, 30, 74, + 147, 249, 231, 30, 74, 147, 249, 230, 30, 74, 147, 249, 229, 244, 197, + 30, 74, 147, 249, 228, 30, 74, 147, 249, 227, 30, 74, 147, 249, 226, 234, + 79, 30, 74, 147, 249, 225, 250, 229, 30, 74, 147, 249, 224, 30, 74, 147, + 249, 223, 30, 74, 147, 249, 222, 30, 74, 147, 249, 221, 30, 74, 147, 249, + 220, 30, 74, 147, 249, 219, 30, 74, 147, 249, 218, 30, 74, 147, 249, 217, + 30, 74, 147, 249, 216, 30, 74, 147, 249, 215, 218, 197, 30, 74, 147, 249, + 214, 30, 74, 147, 249, 213, 201, 190, 30, 74, 147, 249, 212, 30, 74, 147, + 249, 211, 30, 74, 147, 249, 210, 30, 74, 147, 249, 209, 30, 74, 147, 249, + 208, 30, 74, 147, 249, 207, 30, 74, 147, 249, 206, 30, 74, 147, 249, 205, + 30, 74, 147, 249, 204, 30, 74, 147, 249, 203, 30, 74, 147, 249, 202, 30, + 74, 147, 249, 201, 232, 103, 30, 74, 147, 249, 180, 235, 33, 30, 74, 147, + 249, 177, 249, 51, 30, 74, 147, 249, 172, 205, 134, 30, 74, 147, 249, + 171, 51, 30, 74, 147, 249, 170, 30, 74, 147, 249, 169, 204, 48, 30, 74, + 147, 249, 168, 30, 74, 147, 249, 167, 30, 74, 147, 249, 166, 197, 74, + 245, 112, 30, 74, 147, 249, 165, 245, 112, 30, 74, 147, 249, 164, 245, + 113, 234, 250, 30, 74, 147, 249, 163, 197, 77, 30, 74, 147, 249, 162, 30, + 74, 147, 249, 161, 30, 74, 218, 205, 249, 160, 239, 87, 30, 74, 147, 249, + 159, 30, 74, 147, 249, 158, 30, 74, 147, 249, 156, 30, 74, 147, 249, 155, + 30, 74, 147, 249, 154, 30, 74, 147, 249, 153, 240, 68, 30, 74, 147, 249, + 152, 30, 74, 147, 249, 151, 30, 74, 147, 249, 150, 30, 74, 147, 249, 149, + 30, 74, 147, 249, 148, 30, 74, 147, 199, 47, 249, 233, 30, 74, 147, 199, + 47, 249, 200, 30, 74, 147, 199, 47, 249, 199, 30, 74, 147, 199, 47, 249, + 198, 30, 74, 147, 199, 47, 249, 197, 30, 74, 147, 199, 47, 249, 196, 30, + 74, 147, 199, 47, 249, 195, 30, 74, 147, 199, 47, 249, 194, 30, 74, 147, + 199, 47, 249, 193, 30, 74, 147, 199, 47, 249, 192, 30, 74, 147, 199, 47, + 249, 191, 30, 74, 147, 199, 47, 249, 190, 30, 74, 147, 199, 47, 249, 189, + 30, 74, 147, 199, 47, 249, 188, 30, 74, 147, 199, 47, 249, 187, 30, 74, + 147, 199, 47, 249, 186, 30, 74, 147, 199, 47, 249, 185, 30, 74, 147, 199, + 47, 249, 184, 30, 74, 147, 199, 47, 249, 183, 30, 74, 147, 199, 47, 249, + 182, 30, 74, 147, 199, 47, 249, 181, 30, 74, 147, 199, 47, 249, 179, 30, + 74, 147, 199, 47, 249, 178, 30, 74, 147, 199, 47, 249, 176, 30, 74, 147, + 199, 47, 249, 175, 30, 74, 147, 199, 47, 249, 174, 30, 74, 147, 199, 47, + 249, 173, 30, 74, 147, 199, 47, 249, 157, 30, 74, 147, 199, 47, 249, 147, + 251, 238, 197, 9, 207, 91, 222, 75, 251, 238, 197, 9, 207, 91, 238, 253, + 251, 238, 245, 102, 78, 251, 238, 31, 100, 251, 238, 31, 102, 251, 238, + 31, 134, 251, 238, 31, 136, 251, 238, 31, 146, 251, 238, 31, 167, 251, + 238, 31, 178, 251, 238, 31, 171, 251, 238, 31, 182, 251, 238, 31, 203, + 23, 251, 238, 31, 200, 234, 251, 238, 31, 202, 177, 251, 238, 31, 235, + 14, 251, 238, 31, 235, 145, 251, 238, 31, 206, 13, 251, 238, 31, 207, 65, + 251, 238, 31, 237, 20, 251, 238, 31, 216, 174, 251, 238, 31, 97, 231, 57, + 251, 238, 31, 99, 231, 57, 251, 238, 31, 115, 231, 57, 251, 238, 31, 235, + 7, 231, 57, 251, 238, 31, 235, 101, 231, 57, 251, 238, 31, 206, 29, 231, + 57, 251, 238, 31, 207, 71, 231, 57, 251, 238, 31, 237, 31, 231, 57, 251, + 238, 31, 216, 179, 231, 57, 251, 238, 31, 97, 170, 251, 238, 31, 99, 170, + 251, 238, 31, 115, 170, 251, 238, 31, 235, 7, 170, 251, 238, 31, 235, + 101, 170, 251, 238, 31, 206, 29, 170, 251, 238, 31, 207, 71, 170, 251, + 238, 31, 237, 31, 170, 251, 238, 31, 216, 179, 170, 251, 238, 31, 203, + 24, 170, 251, 238, 31, 200, 235, 170, 251, 238, 31, 202, 178, 170, 251, + 238, 31, 235, 15, 170, 251, 238, 31, 235, 146, 170, 251, 238, 31, 206, + 14, 170, 251, 238, 31, 207, 66, 170, 251, 238, 31, 237, 21, 170, 251, + 238, 31, 216, 175, 170, 251, 238, 197, 94, 249, 67, 200, 49, 251, 238, + 197, 94, 235, 113, 204, 137, 251, 238, 197, 94, 208, 136, 204, 137, 251, + 238, 197, 94, 202, 185, 204, 137, 251, 238, 197, 94, 235, 0, 204, 137, + 251, 238, 237, 204, 219, 203, 235, 113, 204, 137, 251, 238, 222, 56, 219, + 203, 235, 113, 204, 137, 251, 238, 219, 203, 208, 136, 204, 137, 251, + 238, 219, 203, 202, 185, 204, 137, 32, 252, 13, 250, 152, 97, 211, 87, + 32, 252, 13, 250, 152, 97, 232, 225, 32, 252, 13, 250, 152, 97, 237, 227, + 32, 252, 13, 250, 152, 146, 32, 252, 13, 250, 152, 235, 145, 32, 252, 13, + 250, 152, 235, 101, 231, 57, 32, 252, 13, 250, 152, 235, 101, 170, 32, + 252, 13, 250, 152, 235, 146, 170, 32, 252, 13, 250, 152, 235, 101, 203, + 123, 32, 252, 13, 250, 152, 203, 24, 203, 123, 32, 252, 13, 250, 152, + 235, 146, 203, 123, 32, 252, 13, 250, 152, 97, 231, 58, 203, 123, 32, + 252, 13, 250, 152, 235, 101, 231, 58, 203, 123, 32, 252, 13, 250, 152, + 97, 202, 159, 203, 123, 32, 252, 13, 250, 152, 235, 101, 202, 159, 203, + 123, 32, 252, 13, 250, 152, 235, 101, 204, 255, 32, 252, 13, 250, 152, + 203, 24, 204, 255, 32, 252, 13, 250, 152, 235, 146, 204, 255, 32, 252, + 13, 250, 152, 97, 231, 58, 204, 255, 32, 252, 13, 250, 152, 235, 101, + 231, 58, 204, 255, 32, 252, 13, 250, 152, 97, 202, 159, 204, 255, 32, + 252, 13, 250, 152, 203, 24, 202, 159, 204, 255, 32, 252, 13, 250, 152, + 235, 146, 202, 159, 204, 255, 32, 252, 13, 250, 152, 203, 24, 218, 254, + 32, 252, 13, 232, 97, 97, 212, 135, 32, 252, 13, 202, 201, 100, 32, 252, + 13, 232, 93, 100, 32, 252, 13, 236, 178, 102, 32, 252, 13, 202, 201, 102, + 32, 252, 13, 240, 236, 99, 237, 226, 32, 252, 13, 236, 178, 99, 237, 226, + 32, 252, 13, 201, 156, 146, 32, 252, 13, 201, 156, 203, 23, 32, 252, 13, + 201, 156, 203, 24, 251, 131, 20, 32, 252, 13, 232, 93, 203, 23, 32, 252, + 13, 219, 145, 203, 23, 32, 252, 13, 202, 201, 203, 23, 32, 252, 13, 202, + 201, 202, 177, 32, 252, 13, 201, 156, 235, 145, 32, 252, 13, 201, 156, + 235, 146, 251, 131, 20, 32, 252, 13, 232, 93, 235, 145, 32, 252, 13, 202, + 201, 235, 145, 32, 252, 13, 202, 201, 97, 231, 57, 32, 252, 13, 202, 201, + 115, 231, 57, 32, 252, 13, 236, 178, 235, 101, 231, 57, 32, 252, 13, 201, + 156, 235, 101, 231, 57, 32, 252, 13, 202, 201, 235, 101, 231, 57, 32, + 252, 13, 247, 96, 235, 101, 231, 57, 32, 252, 13, 217, 196, 235, 101, + 231, 57, 32, 252, 13, 202, 201, 97, 170, 32, 252, 13, 202, 201, 235, 101, + 170, 32, 252, 13, 239, 215, 235, 101, 218, 254, 32, 252, 13, 204, 214, + 235, 146, 218, 254, 32, 97, 157, 55, 32, 97, 157, 2, 251, 131, 20, 32, + 99, 202, 182, 55, 32, 115, 211, 86, 55, 32, 196, 67, 55, 32, 203, 124, + 55, 32, 237, 228, 55, 32, 214, 180, 55, 32, 99, 214, 179, 55, 32, 115, + 214, 179, 55, 32, 235, 7, 214, 179, 55, 32, 235, 101, 214, 179, 55, 32, + 219, 139, 55, 32, 223, 108, 249, 67, 55, 32, 222, 49, 55, 32, 214, 36, + 55, 32, 196, 199, 55, 32, 250, 209, 55, 32, 250, 225, 55, 32, 233, 110, + 55, 32, 201, 116, 249, 67, 55, 32, 195, 80, 55, 32, 97, 211, 88, 55, 32, + 206, 54, 55, 32, 226, 67, 55, 216, 39, 55, 209, 208, 207, 62, 55, 209, 208, 200, 65, 55, 209, 208, 207, 97, 55, 209, 208, 207, 60, 55, 209, 208, - 239, 101, 207, 60, 55, 209, 208, 206, 77, 55, 209, 208, 239, 210, 55, - 209, 208, 211, 70, 55, 209, 208, 207, 78, 55, 209, 208, 237, 179, 55, - 209, 208, 250, 202, 55, 209, 208, 247, 31, 55, 32, 16, 203, 90, 210, 74, - 213, 0, 239, 78, 2, 213, 80, 213, 0, 239, 78, 2, 212, 126, 232, 136, 213, - 0, 239, 78, 2, 203, 93, 232, 136, 213, 0, 239, 78, 2, 247, 118, 213, 0, - 239, 78, 2, 245, 65, 213, 0, 239, 78, 2, 197, 21, 213, 0, 239, 78, 2, - 232, 102, 213, 0, 239, 78, 2, 234, 70, 213, 0, 239, 78, 2, 202, 113, 213, - 0, 239, 78, 2, 51, 213, 0, 239, 78, 2, 248, 76, 213, 0, 239, 78, 2, 206, - 220, 213, 0, 239, 78, 2, 244, 189, 213, 0, 239, 78, 2, 220, 60, 213, 0, - 239, 78, 2, 219, 255, 213, 0, 239, 78, 2, 208, 185, 213, 0, 239, 78, 2, - 222, 103, 213, 0, 239, 78, 2, 248, 97, 213, 0, 239, 78, 2, 247, 102, 212, - 141, 213, 0, 239, 78, 2, 239, 10, 213, 0, 239, 78, 2, 244, 164, 213, 0, - 239, 78, 2, 205, 235, 213, 0, 239, 78, 2, 244, 165, 213, 0, 239, 78, 2, - 248, 247, 213, 0, 239, 78, 2, 206, 207, 213, 0, 239, 78, 2, 231, 101, - 213, 0, 239, 78, 2, 232, 60, 213, 0, 239, 78, 2, 248, 1, 222, 171, 213, - 0, 239, 78, 2, 247, 91, 213, 0, 239, 78, 2, 210, 209, 213, 0, 239, 78, 2, - 237, 78, 213, 0, 239, 78, 2, 237, 235, 213, 0, 239, 78, 2, 201, 18, 213, - 0, 239, 78, 2, 248, 250, 213, 0, 239, 78, 2, 212, 142, 201, 190, 213, 0, - 239, 78, 2, 199, 14, 213, 0, 239, 78, 2, 213, 157, 213, 0, 239, 78, 2, - 209, 197, 213, 0, 239, 78, 2, 222, 87, 213, 0, 239, 78, 2, 214, 13, 249, - 137, 213, 0, 239, 78, 2, 235, 57, 213, 0, 239, 78, 2, 233, 101, 213, 0, - 239, 78, 2, 204, 215, 213, 0, 239, 78, 2, 4, 250, 122, 213, 0, 239, 78, - 2, 197, 119, 249, 88, 213, 0, 239, 78, 2, 38, 214, 181, 106, 221, 148, 1, - 63, 221, 148, 1, 69, 221, 148, 1, 250, 111, 221, 148, 1, 248, 197, 221, - 148, 1, 234, 189, 221, 148, 1, 240, 230, 221, 148, 1, 68, 221, 148, 1, - 197, 199, 221, 148, 1, 195, 158, 221, 148, 1, 202, 235, 221, 148, 1, 225, - 216, 221, 148, 1, 225, 79, 221, 148, 1, 211, 166, 221, 148, 1, 159, 221, - 148, 1, 221, 135, 221, 148, 1, 218, 54, 221, 148, 1, 218, 255, 221, 148, - 1, 216, 86, 221, 148, 1, 66, 221, 148, 1, 214, 2, 221, 148, 1, 224, 36, - 221, 148, 1, 144, 221, 148, 1, 209, 80, 221, 148, 1, 203, 216, 221, 148, - 1, 201, 81, 221, 148, 1, 251, 105, 221, 148, 1, 236, 229, 221, 148, 1, - 233, 14, 221, 148, 1, 196, 222, 247, 108, 1, 63, 247, 108, 1, 213, 244, - 247, 108, 1, 240, 230, 247, 108, 1, 159, 247, 108, 1, 199, 243, 247, 108, - 1, 144, 247, 108, 1, 222, 200, 247, 108, 1, 254, 176, 247, 108, 1, 211, - 166, 247, 108, 1, 250, 111, 247, 108, 1, 221, 135, 247, 108, 1, 72, 247, - 108, 1, 240, 137, 247, 108, 1, 203, 216, 247, 108, 1, 207, 52, 247, 108, - 1, 207, 51, 247, 108, 1, 209, 80, 247, 108, 1, 247, 205, 247, 108, 1, 66, - 247, 108, 1, 216, 86, 247, 108, 1, 196, 222, 247, 108, 1, 218, 54, 247, - 108, 1, 201, 80, 247, 108, 1, 214, 2, 247, 108, 1, 205, 83, 247, 108, 1, - 68, 247, 108, 1, 69, 247, 108, 1, 199, 240, 247, 108, 1, 225, 79, 247, - 108, 1, 225, 70, 247, 108, 1, 217, 160, 247, 108, 1, 199, 245, 247, 108, - 1, 234, 189, 247, 108, 1, 234, 124, 247, 108, 1, 205, 23, 247, 108, 1, - 205, 22, 247, 108, 1, 217, 72, 247, 108, 1, 226, 119, 247, 108, 1, 247, - 204, 247, 108, 1, 201, 81, 247, 108, 1, 199, 242, 247, 108, 1, 209, 182, - 247, 108, 1, 219, 245, 247, 108, 1, 219, 244, 247, 108, 1, 219, 243, 247, - 108, 1, 219, 242, 247, 108, 1, 222, 199, 247, 108, 1, 237, 82, 247, 108, - 1, 199, 241, 88, 236, 180, 202, 158, 78, 88, 236, 180, 17, 100, 88, 236, - 180, 17, 102, 88, 236, 180, 17, 134, 88, 236, 180, 17, 136, 88, 236, 180, - 17, 146, 88, 236, 180, 17, 167, 88, 236, 180, 17, 178, 88, 236, 180, 17, - 171, 88, 236, 180, 17, 182, 88, 236, 180, 31, 203, 23, 88, 236, 180, 31, - 200, 234, 88, 236, 180, 31, 202, 177, 88, 236, 180, 31, 235, 13, 88, 236, - 180, 31, 235, 144, 88, 236, 180, 31, 206, 13, 88, 236, 180, 31, 207, 65, - 88, 236, 180, 31, 237, 19, 88, 236, 180, 31, 216, 173, 88, 236, 180, 31, - 97, 231, 56, 88, 236, 180, 31, 99, 231, 56, 88, 236, 180, 31, 115, 231, - 56, 88, 236, 180, 31, 235, 6, 231, 56, 88, 236, 180, 31, 235, 100, 231, - 56, 88, 236, 180, 31, 206, 29, 231, 56, 88, 236, 180, 31, 207, 71, 231, - 56, 88, 236, 180, 31, 237, 30, 231, 56, 88, 236, 180, 31, 216, 178, 231, - 56, 37, 41, 1, 63, 37, 41, 1, 249, 8, 37, 41, 1, 224, 208, 37, 41, 1, - 239, 251, 37, 41, 1, 69, 37, 41, 1, 199, 118, 37, 41, 1, 195, 88, 37, 41, - 1, 232, 146, 37, 41, 1, 202, 217, 37, 41, 1, 68, 37, 41, 1, 155, 37, 41, - 1, 237, 6, 37, 41, 1, 236, 240, 37, 41, 1, 236, 229, 37, 41, 1, 236, 140, - 37, 41, 1, 72, 37, 41, 1, 213, 91, 37, 41, 1, 206, 255, 37, 41, 1, 223, - 186, 37, 41, 1, 236, 162, 37, 41, 1, 236, 150, 37, 41, 1, 203, 68, 37, - 41, 1, 66, 37, 41, 1, 237, 9, 37, 41, 1, 212, 248, 37, 41, 1, 224, 130, - 37, 41, 1, 237, 46, 37, 41, 1, 236, 152, 37, 41, 1, 245, 102, 37, 41, 1, - 226, 119, 37, 41, 1, 199, 245, 37, 41, 1, 236, 133, 37, 41, 215, 141, - 100, 37, 41, 215, 141, 146, 37, 41, 215, 141, 203, 23, 37, 41, 215, 141, - 235, 144, 37, 41, 1, 196, 69, 37, 41, 1, 216, 22, 201, 107, 37, 41, 1, - 205, 157, 201, 107, 233, 119, 1, 251, 202, 233, 119, 1, 249, 108, 233, - 119, 1, 233, 188, 233, 119, 1, 240, 116, 233, 119, 1, 251, 197, 233, 119, - 1, 211, 149, 233, 119, 1, 225, 228, 233, 119, 1, 232, 237, 233, 119, 1, - 202, 171, 233, 119, 1, 237, 17, 233, 119, 1, 223, 145, 233, 119, 1, 223, - 57, 233, 119, 1, 220, 51, 233, 119, 1, 217, 197, 233, 119, 1, 225, 184, - 233, 119, 1, 200, 7, 233, 119, 1, 213, 217, 233, 119, 1, 216, 173, 233, - 119, 1, 210, 222, 233, 119, 1, 208, 189, 233, 119, 1, 203, 38, 233, 119, - 1, 197, 44, 233, 119, 1, 235, 218, 233, 119, 1, 226, 123, 233, 119, 1, - 231, 40, 233, 119, 1, 214, 47, 233, 119, 1, 216, 178, 231, 56, 37, 213, - 35, 1, 251, 105, 37, 213, 35, 1, 247, 243, 37, 213, 35, 1, 234, 106, 37, - 213, 35, 1, 239, 14, 37, 213, 35, 1, 69, 37, 213, 35, 1, 195, 56, 37, - 213, 35, 1, 237, 147, 37, 213, 35, 1, 195, 96, 37, 213, 35, 1, 237, 145, - 37, 213, 35, 1, 68, 37, 213, 35, 1, 223, 250, 37, 213, 35, 1, 222, 167, - 37, 213, 35, 1, 219, 161, 37, 213, 35, 1, 217, 98, 37, 213, 35, 1, 198, - 232, 37, 213, 35, 1, 213, 77, 37, 213, 35, 1, 210, 140, 37, 213, 35, 1, - 206, 84, 37, 213, 35, 1, 203, 137, 37, 213, 35, 1, 66, 37, 213, 35, 1, - 245, 83, 37, 213, 35, 1, 206, 189, 37, 213, 35, 1, 207, 1, 37, 213, 35, - 1, 195, 219, 37, 213, 35, 1, 196, 47, 37, 213, 35, 1, 72, 37, 213, 35, 1, - 214, 101, 37, 213, 35, 1, 237, 46, 37, 213, 35, 1, 142, 37, 213, 35, 1, - 201, 91, 37, 213, 35, 1, 199, 105, 37, 213, 35, 1, 196, 51, 37, 213, 35, - 1, 196, 49, 37, 213, 35, 1, 196, 84, 37, 213, 35, 1, 226, 146, 37, 213, - 35, 1, 195, 217, 37, 213, 35, 1, 164, 37, 213, 35, 1, 230, 209, 38, 37, - 213, 35, 1, 251, 105, 38, 37, 213, 35, 1, 239, 14, 38, 37, 213, 35, 1, - 195, 96, 38, 37, 213, 35, 1, 217, 98, 38, 37, 213, 35, 1, 206, 84, 200, - 93, 1, 251, 137, 200, 93, 1, 248, 205, 200, 93, 1, 234, 94, 200, 93, 1, - 224, 145, 200, 93, 1, 239, 211, 200, 93, 1, 231, 192, 200, 93, 1, 197, - 34, 200, 93, 1, 195, 78, 200, 93, 1, 231, 93, 200, 93, 1, 203, 1, 200, - 93, 1, 195, 241, 200, 93, 1, 225, 34, 200, 93, 1, 206, 211, 200, 93, 1, - 222, 244, 200, 93, 1, 219, 170, 200, 93, 1, 239, 171, 200, 93, 1, 215, - 137, 200, 93, 1, 194, 255, 200, 93, 1, 208, 224, 200, 93, 1, 251, 193, - 200, 93, 1, 211, 226, 200, 93, 1, 209, 7, 200, 93, 1, 211, 101, 200, 93, - 1, 210, 200, 200, 93, 1, 202, 221, 200, 93, 1, 233, 224, 200, 93, 1, 149, + 239, 102, 207, 60, 55, 209, 208, 206, 77, 55, 209, 208, 239, 211, 55, + 209, 208, 211, 71, 55, 209, 208, 207, 78, 55, 209, 208, 237, 180, 55, + 209, 208, 250, 203, 55, 209, 208, 247, 32, 55, 32, 16, 203, 90, 210, 74, + 213, 1, 239, 79, 2, 213, 81, 213, 1, 239, 79, 2, 212, 127, 232, 137, 213, + 1, 239, 79, 2, 203, 93, 232, 137, 213, 1, 239, 79, 2, 247, 119, 213, 1, + 239, 79, 2, 245, 66, 213, 1, 239, 79, 2, 197, 21, 213, 1, 239, 79, 2, + 232, 103, 213, 1, 239, 79, 2, 234, 71, 213, 1, 239, 79, 2, 202, 113, 213, + 1, 239, 79, 2, 51, 213, 1, 239, 79, 2, 248, 77, 213, 1, 239, 79, 2, 206, + 220, 213, 1, 239, 79, 2, 244, 190, 213, 1, 239, 79, 2, 220, 61, 213, 1, + 239, 79, 2, 220, 0, 213, 1, 239, 79, 2, 208, 185, 213, 1, 239, 79, 2, + 222, 104, 213, 1, 239, 79, 2, 248, 98, 213, 1, 239, 79, 2, 247, 103, 212, + 142, 213, 1, 239, 79, 2, 239, 11, 213, 1, 239, 79, 2, 244, 165, 213, 1, + 239, 79, 2, 205, 235, 213, 1, 239, 79, 2, 244, 166, 213, 1, 239, 79, 2, + 248, 248, 213, 1, 239, 79, 2, 206, 207, 213, 1, 239, 79, 2, 231, 102, + 213, 1, 239, 79, 2, 232, 61, 213, 1, 239, 79, 2, 248, 2, 222, 172, 213, + 1, 239, 79, 2, 247, 92, 213, 1, 239, 79, 2, 210, 210, 213, 1, 239, 79, 2, + 237, 79, 213, 1, 239, 79, 2, 237, 236, 213, 1, 239, 79, 2, 201, 18, 213, + 1, 239, 79, 2, 248, 251, 213, 1, 239, 79, 2, 212, 143, 201, 190, 213, 1, + 239, 79, 2, 199, 14, 213, 1, 239, 79, 2, 213, 158, 213, 1, 239, 79, 2, + 209, 197, 213, 1, 239, 79, 2, 222, 88, 213, 1, 239, 79, 2, 214, 14, 249, + 138, 213, 1, 239, 79, 2, 235, 58, 213, 1, 239, 79, 2, 233, 102, 213, 1, + 239, 79, 2, 204, 215, 213, 1, 239, 79, 2, 4, 250, 123, 213, 1, 239, 79, + 2, 197, 119, 249, 89, 213, 1, 239, 79, 2, 38, 214, 182, 106, 221, 149, 1, + 63, 221, 149, 1, 69, 221, 149, 1, 250, 112, 221, 149, 1, 248, 198, 221, + 149, 1, 234, 190, 221, 149, 1, 240, 231, 221, 149, 1, 68, 221, 149, 1, + 197, 199, 221, 149, 1, 195, 158, 221, 149, 1, 202, 235, 221, 149, 1, 225, + 217, 221, 149, 1, 225, 80, 221, 149, 1, 211, 167, 221, 149, 1, 159, 221, + 149, 1, 221, 136, 221, 149, 1, 218, 55, 221, 149, 1, 219, 0, 221, 149, 1, + 216, 87, 221, 149, 1, 66, 221, 149, 1, 214, 3, 221, 149, 1, 224, 37, 221, + 149, 1, 144, 221, 149, 1, 209, 80, 221, 149, 1, 203, 216, 221, 149, 1, + 201, 81, 221, 149, 1, 251, 106, 221, 149, 1, 236, 230, 221, 149, 1, 233, + 15, 221, 149, 1, 196, 222, 247, 109, 1, 63, 247, 109, 1, 213, 245, 247, + 109, 1, 240, 231, 247, 109, 1, 159, 247, 109, 1, 199, 243, 247, 109, 1, + 144, 247, 109, 1, 222, 201, 247, 109, 1, 254, 177, 247, 109, 1, 211, 167, + 247, 109, 1, 250, 112, 247, 109, 1, 221, 136, 247, 109, 1, 72, 247, 109, + 1, 240, 138, 247, 109, 1, 203, 216, 247, 109, 1, 207, 52, 247, 109, 1, + 207, 51, 247, 109, 1, 209, 80, 247, 109, 1, 247, 206, 247, 109, 1, 66, + 247, 109, 1, 216, 87, 247, 109, 1, 196, 222, 247, 109, 1, 218, 55, 247, + 109, 1, 201, 80, 247, 109, 1, 214, 3, 247, 109, 1, 205, 83, 247, 109, 1, + 68, 247, 109, 1, 69, 247, 109, 1, 199, 240, 247, 109, 1, 225, 80, 247, + 109, 1, 225, 71, 247, 109, 1, 217, 161, 247, 109, 1, 199, 245, 247, 109, + 1, 234, 190, 247, 109, 1, 234, 125, 247, 109, 1, 205, 23, 247, 109, 1, + 205, 22, 247, 109, 1, 217, 73, 247, 109, 1, 226, 120, 247, 109, 1, 247, + 205, 247, 109, 1, 201, 81, 247, 109, 1, 199, 242, 247, 109, 1, 209, 182, + 247, 109, 1, 219, 246, 247, 109, 1, 219, 245, 247, 109, 1, 219, 244, 247, + 109, 1, 219, 243, 247, 109, 1, 222, 200, 247, 109, 1, 237, 83, 247, 109, + 1, 199, 241, 88, 236, 181, 202, 158, 78, 88, 236, 181, 17, 100, 88, 236, + 181, 17, 102, 88, 236, 181, 17, 134, 88, 236, 181, 17, 136, 88, 236, 181, + 17, 146, 88, 236, 181, 17, 167, 88, 236, 181, 17, 178, 88, 236, 181, 17, + 171, 88, 236, 181, 17, 182, 88, 236, 181, 31, 203, 23, 88, 236, 181, 31, + 200, 234, 88, 236, 181, 31, 202, 177, 88, 236, 181, 31, 235, 14, 88, 236, + 181, 31, 235, 145, 88, 236, 181, 31, 206, 13, 88, 236, 181, 31, 207, 65, + 88, 236, 181, 31, 237, 20, 88, 236, 181, 31, 216, 174, 88, 236, 181, 31, + 97, 231, 57, 88, 236, 181, 31, 99, 231, 57, 88, 236, 181, 31, 115, 231, + 57, 88, 236, 181, 31, 235, 7, 231, 57, 88, 236, 181, 31, 235, 101, 231, + 57, 88, 236, 181, 31, 206, 29, 231, 57, 88, 236, 181, 31, 207, 71, 231, + 57, 88, 236, 181, 31, 237, 31, 231, 57, 88, 236, 181, 31, 216, 179, 231, + 57, 37, 41, 1, 63, 37, 41, 1, 249, 9, 37, 41, 1, 224, 209, 37, 41, 1, + 239, 252, 37, 41, 1, 69, 37, 41, 1, 199, 118, 37, 41, 1, 195, 88, 37, 41, + 1, 232, 147, 37, 41, 1, 202, 217, 37, 41, 1, 68, 37, 41, 1, 155, 37, 41, + 1, 237, 7, 37, 41, 1, 236, 241, 37, 41, 1, 236, 230, 37, 41, 1, 236, 141, + 37, 41, 1, 72, 37, 41, 1, 213, 92, 37, 41, 1, 206, 255, 37, 41, 1, 223, + 187, 37, 41, 1, 236, 163, 37, 41, 1, 236, 151, 37, 41, 1, 203, 68, 37, + 41, 1, 66, 37, 41, 1, 237, 10, 37, 41, 1, 212, 249, 37, 41, 1, 224, 131, + 37, 41, 1, 237, 47, 37, 41, 1, 236, 153, 37, 41, 1, 245, 103, 37, 41, 1, + 226, 120, 37, 41, 1, 199, 245, 37, 41, 1, 236, 134, 37, 41, 215, 142, + 100, 37, 41, 215, 142, 146, 37, 41, 215, 142, 203, 23, 37, 41, 215, 142, + 235, 145, 37, 41, 1, 196, 69, 37, 41, 1, 216, 23, 201, 107, 37, 41, 1, + 205, 157, 201, 107, 233, 120, 1, 251, 203, 233, 120, 1, 249, 109, 233, + 120, 1, 233, 189, 233, 120, 1, 240, 117, 233, 120, 1, 251, 198, 233, 120, + 1, 211, 150, 233, 120, 1, 225, 229, 233, 120, 1, 232, 238, 233, 120, 1, + 202, 171, 233, 120, 1, 237, 18, 233, 120, 1, 223, 146, 233, 120, 1, 223, + 58, 233, 120, 1, 220, 52, 233, 120, 1, 217, 198, 233, 120, 1, 225, 185, + 233, 120, 1, 200, 7, 233, 120, 1, 213, 218, 233, 120, 1, 216, 174, 233, + 120, 1, 210, 223, 233, 120, 1, 208, 189, 233, 120, 1, 203, 38, 233, 120, + 1, 197, 44, 233, 120, 1, 235, 219, 233, 120, 1, 226, 124, 233, 120, 1, + 231, 41, 233, 120, 1, 214, 48, 233, 120, 1, 216, 179, 231, 57, 37, 213, + 36, 1, 251, 106, 37, 213, 36, 1, 247, 244, 37, 213, 36, 1, 234, 107, 37, + 213, 36, 1, 239, 15, 37, 213, 36, 1, 69, 37, 213, 36, 1, 195, 56, 37, + 213, 36, 1, 237, 148, 37, 213, 36, 1, 195, 96, 37, 213, 36, 1, 237, 146, + 37, 213, 36, 1, 68, 37, 213, 36, 1, 223, 251, 37, 213, 36, 1, 222, 168, + 37, 213, 36, 1, 219, 162, 37, 213, 36, 1, 217, 99, 37, 213, 36, 1, 198, + 232, 37, 213, 36, 1, 213, 78, 37, 213, 36, 1, 210, 141, 37, 213, 36, 1, + 206, 84, 37, 213, 36, 1, 203, 137, 37, 213, 36, 1, 66, 37, 213, 36, 1, + 245, 84, 37, 213, 36, 1, 206, 189, 37, 213, 36, 1, 207, 1, 37, 213, 36, + 1, 195, 219, 37, 213, 36, 1, 196, 47, 37, 213, 36, 1, 72, 37, 213, 36, 1, + 214, 102, 37, 213, 36, 1, 237, 47, 37, 213, 36, 1, 142, 37, 213, 36, 1, + 201, 91, 37, 213, 36, 1, 199, 105, 37, 213, 36, 1, 196, 51, 37, 213, 36, + 1, 196, 49, 37, 213, 36, 1, 196, 84, 37, 213, 36, 1, 226, 147, 37, 213, + 36, 1, 195, 217, 37, 213, 36, 1, 164, 37, 213, 36, 1, 230, 210, 38, 37, + 213, 36, 1, 251, 106, 38, 37, 213, 36, 1, 239, 15, 38, 37, 213, 36, 1, + 195, 96, 38, 37, 213, 36, 1, 217, 99, 38, 37, 213, 36, 1, 206, 84, 200, + 93, 1, 251, 138, 200, 93, 1, 248, 206, 200, 93, 1, 234, 95, 200, 93, 1, + 224, 146, 200, 93, 1, 239, 212, 200, 93, 1, 231, 193, 200, 93, 1, 197, + 34, 200, 93, 1, 195, 78, 200, 93, 1, 231, 94, 200, 93, 1, 203, 1, 200, + 93, 1, 195, 241, 200, 93, 1, 225, 35, 200, 93, 1, 206, 211, 200, 93, 1, + 222, 245, 200, 93, 1, 219, 171, 200, 93, 1, 239, 172, 200, 93, 1, 215, + 138, 200, 93, 1, 194, 255, 200, 93, 1, 208, 224, 200, 93, 1, 251, 194, + 200, 93, 1, 211, 227, 200, 93, 1, 209, 7, 200, 93, 1, 211, 102, 200, 93, + 1, 210, 201, 200, 93, 1, 202, 221, 200, 93, 1, 233, 225, 200, 93, 1, 149, 200, 93, 1, 68, 200, 93, 1, 66, 200, 93, 1, 205, 34, 200, 93, 197, 9, - 239, 58, 37, 213, 29, 2, 63, 37, 213, 29, 2, 68, 37, 213, 29, 2, 66, 37, - 213, 29, 2, 155, 37, 213, 29, 2, 223, 186, 37, 213, 29, 2, 234, 122, 37, - 213, 29, 2, 233, 75, 37, 213, 29, 2, 196, 208, 37, 213, 29, 2, 247, 173, - 37, 213, 29, 2, 225, 213, 37, 213, 29, 2, 225, 171, 37, 213, 29, 2, 189, - 37, 213, 29, 2, 201, 40, 37, 213, 29, 2, 240, 135, 37, 213, 29, 2, 239, - 151, 37, 213, 29, 2, 237, 200, 37, 213, 29, 2, 202, 233, 37, 213, 29, 2, - 161, 37, 213, 29, 2, 249, 144, 37, 213, 29, 2, 235, 238, 37, 213, 29, 2, - 176, 37, 213, 29, 2, 215, 185, 37, 213, 29, 2, 166, 37, 213, 29, 2, 219, - 77, 37, 213, 29, 2, 218, 144, 37, 213, 29, 2, 164, 37, 213, 29, 2, 199, - 152, 37, 213, 29, 2, 199, 34, 37, 213, 29, 2, 169, 37, 213, 29, 2, 209, - 140, 37, 213, 29, 2, 172, 37, 213, 29, 2, 183, 37, 213, 29, 2, 195, 115, - 37, 213, 29, 2, 207, 50, 37, 213, 29, 2, 205, 80, 37, 213, 29, 2, 142, - 37, 213, 29, 2, 250, 143, 37, 213, 29, 2, 250, 142, 37, 213, 29, 2, 250, - 141, 37, 213, 29, 2, 196, 178, 37, 213, 29, 2, 240, 112, 37, 213, 29, 2, - 240, 111, 37, 213, 29, 2, 249, 119, 37, 213, 29, 2, 247, 225, 37, 213, - 29, 197, 9, 239, 58, 37, 213, 29, 31, 100, 37, 213, 29, 31, 102, 37, 213, - 29, 31, 203, 23, 37, 213, 29, 31, 200, 234, 37, 213, 29, 31, 231, 56, - 239, 191, 6, 1, 181, 68, 239, 191, 6, 1, 181, 69, 239, 191, 6, 1, 181, - 63, 239, 191, 6, 1, 181, 251, 208, 239, 191, 6, 1, 181, 72, 239, 191, 6, - 1, 181, 214, 101, 239, 191, 6, 1, 206, 182, 68, 239, 191, 6, 1, 206, 182, - 69, 239, 191, 6, 1, 206, 182, 63, 239, 191, 6, 1, 206, 182, 251, 208, - 239, 191, 6, 1, 206, 182, 72, 239, 191, 6, 1, 206, 182, 214, 101, 239, - 191, 6, 1, 250, 121, 239, 191, 6, 1, 214, 15, 239, 191, 6, 1, 196, 243, - 239, 191, 6, 1, 196, 66, 239, 191, 6, 1, 233, 14, 239, 191, 6, 1, 213, - 78, 239, 191, 6, 1, 248, 250, 239, 191, 6, 1, 203, 48, 239, 191, 6, 1, - 239, 236, 239, 191, 6, 1, 245, 98, 239, 191, 6, 1, 225, 190, 239, 191, 6, - 1, 224, 215, 239, 191, 6, 1, 234, 68, 239, 191, 6, 1, 237, 46, 239, 191, - 6, 1, 199, 113, 239, 191, 6, 1, 236, 120, 239, 191, 6, 1, 202, 215, 239, - 191, 6, 1, 236, 150, 239, 191, 6, 1, 195, 85, 239, 191, 6, 1, 236, 140, - 239, 191, 6, 1, 195, 64, 239, 191, 6, 1, 236, 162, 239, 191, 6, 1, 237, - 6, 239, 191, 6, 1, 236, 240, 239, 191, 6, 1, 236, 229, 239, 191, 6, 1, - 236, 214, 239, 191, 6, 1, 214, 145, 239, 191, 6, 1, 236, 97, 239, 191, 4, - 1, 181, 68, 239, 191, 4, 1, 181, 69, 239, 191, 4, 1, 181, 63, 239, 191, - 4, 1, 181, 251, 208, 239, 191, 4, 1, 181, 72, 239, 191, 4, 1, 181, 214, - 101, 239, 191, 4, 1, 206, 182, 68, 239, 191, 4, 1, 206, 182, 69, 239, - 191, 4, 1, 206, 182, 63, 239, 191, 4, 1, 206, 182, 251, 208, 239, 191, 4, - 1, 206, 182, 72, 239, 191, 4, 1, 206, 182, 214, 101, 239, 191, 4, 1, 250, - 121, 239, 191, 4, 1, 214, 15, 239, 191, 4, 1, 196, 243, 239, 191, 4, 1, - 196, 66, 239, 191, 4, 1, 233, 14, 239, 191, 4, 1, 213, 78, 239, 191, 4, - 1, 248, 250, 239, 191, 4, 1, 203, 48, 239, 191, 4, 1, 239, 236, 239, 191, - 4, 1, 245, 98, 239, 191, 4, 1, 225, 190, 239, 191, 4, 1, 224, 215, 239, - 191, 4, 1, 234, 68, 239, 191, 4, 1, 237, 46, 239, 191, 4, 1, 199, 113, - 239, 191, 4, 1, 236, 120, 239, 191, 4, 1, 202, 215, 239, 191, 4, 1, 236, - 150, 239, 191, 4, 1, 195, 85, 239, 191, 4, 1, 236, 140, 239, 191, 4, 1, - 195, 64, 239, 191, 4, 1, 236, 162, 239, 191, 4, 1, 237, 6, 239, 191, 4, - 1, 236, 240, 239, 191, 4, 1, 236, 229, 239, 191, 4, 1, 236, 214, 239, - 191, 4, 1, 214, 145, 239, 191, 4, 1, 236, 97, 207, 6, 1, 213, 75, 207, 6, - 1, 201, 229, 207, 6, 1, 224, 88, 207, 6, 1, 235, 181, 207, 6, 1, 202, - 190, 207, 6, 1, 205, 200, 207, 6, 1, 204, 85, 207, 6, 1, 245, 21, 207, 6, - 1, 196, 68, 207, 6, 1, 231, 53, 207, 6, 1, 248, 182, 207, 6, 1, 239, 250, - 207, 6, 1, 234, 108, 207, 6, 1, 198, 227, 207, 6, 1, 202, 196, 207, 6, 1, - 195, 8, 207, 6, 1, 219, 201, 207, 6, 1, 225, 107, 207, 6, 1, 197, 25, - 207, 6, 1, 232, 247, 207, 6, 1, 221, 244, 207, 6, 1, 219, 23, 207, 6, 1, - 226, 126, 207, 6, 1, 237, 44, 207, 6, 1, 250, 194, 207, 6, 1, 251, 249, - 207, 6, 1, 214, 118, 207, 6, 1, 197, 12, 207, 6, 1, 214, 33, 207, 6, 1, - 251, 208, 207, 6, 1, 209, 223, 207, 6, 1, 215, 137, 207, 6, 1, 237, 64, - 207, 6, 1, 251, 213, 207, 6, 1, 230, 200, 207, 6, 1, 200, 36, 207, 6, 1, - 214, 187, 207, 6, 1, 214, 93, 207, 6, 1, 214, 143, 207, 6, 1, 250, 124, - 207, 6, 1, 250, 245, 207, 6, 1, 214, 71, 207, 6, 1, 251, 188, 207, 6, 1, - 236, 154, 207, 6, 1, 250, 221, 207, 6, 1, 237, 75, 207, 6, 1, 230, 208, - 207, 6, 1, 196, 30, 214, 49, 1, 251, 163, 214, 49, 1, 249, 144, 214, 49, - 1, 189, 214, 49, 1, 225, 213, 214, 49, 1, 196, 208, 214, 49, 1, 224, 145, - 214, 49, 1, 239, 235, 214, 49, 1, 169, 214, 49, 1, 183, 214, 49, 1, 206, - 217, 214, 49, 1, 239, 175, 214, 49, 1, 247, 81, 214, 49, 1, 234, 122, - 214, 49, 1, 235, 238, 214, 49, 1, 211, 156, 214, 49, 1, 225, 50, 214, 49, - 1, 223, 77, 214, 49, 1, 219, 37, 214, 49, 1, 215, 121, 214, 49, 1, 197, - 117, 214, 49, 1, 142, 214, 49, 1, 164, 214, 49, 1, 63, 214, 49, 1, 69, - 214, 49, 1, 68, 214, 49, 1, 72, 214, 49, 1, 66, 214, 49, 1, 252, 167, - 214, 49, 1, 237, 53, 214, 49, 1, 214, 101, 214, 49, 17, 195, 79, 214, 49, - 17, 100, 214, 49, 17, 102, 214, 49, 17, 134, 214, 49, 17, 136, 214, 49, - 17, 146, 214, 49, 17, 167, 214, 49, 17, 178, 214, 49, 17, 171, 214, 49, - 17, 182, 214, 51, 6, 1, 63, 214, 51, 6, 1, 251, 199, 214, 51, 6, 1, 251, - 193, 214, 51, 6, 1, 251, 208, 214, 51, 6, 1, 248, 63, 214, 51, 6, 1, 247, - 15, 214, 51, 6, 1, 237, 38, 214, 51, 6, 1, 69, 214, 51, 6, 1, 237, 18, - 214, 51, 6, 1, 142, 214, 51, 6, 1, 231, 10, 214, 51, 6, 1, 68, 214, 51, - 6, 1, 155, 214, 51, 6, 1, 237, 37, 214, 51, 6, 1, 223, 109, 214, 51, 6, - 1, 172, 214, 51, 6, 1, 166, 214, 51, 6, 1, 176, 214, 51, 6, 1, 72, 214, - 51, 6, 1, 214, 142, 214, 51, 6, 1, 161, 214, 51, 6, 1, 237, 36, 214, 51, - 6, 1, 183, 214, 51, 6, 1, 207, 50, 214, 51, 6, 1, 189, 214, 51, 6, 1, - 237, 35, 214, 51, 6, 1, 201, 113, 214, 51, 6, 1, 237, 34, 214, 51, 6, 1, - 201, 103, 214, 51, 6, 1, 239, 175, 214, 51, 6, 1, 66, 214, 51, 6, 1, 197, - 166, 214, 51, 6, 1, 224, 145, 214, 51, 6, 1, 233, 229, 214, 51, 6, 1, - 195, 115, 214, 51, 6, 1, 195, 74, 214, 51, 4, 1, 63, 214, 51, 4, 1, 251, - 199, 214, 51, 4, 1, 251, 193, 214, 51, 4, 1, 251, 208, 214, 51, 4, 1, - 248, 63, 214, 51, 4, 1, 247, 15, 214, 51, 4, 1, 237, 38, 214, 51, 4, 1, - 69, 214, 51, 4, 1, 237, 18, 214, 51, 4, 1, 142, 214, 51, 4, 1, 231, 10, - 214, 51, 4, 1, 68, 214, 51, 4, 1, 155, 214, 51, 4, 1, 237, 37, 214, 51, - 4, 1, 223, 109, 214, 51, 4, 1, 172, 214, 51, 4, 1, 166, 214, 51, 4, 1, - 176, 214, 51, 4, 1, 72, 214, 51, 4, 1, 214, 142, 214, 51, 4, 1, 161, 214, - 51, 4, 1, 237, 36, 214, 51, 4, 1, 183, 214, 51, 4, 1, 207, 50, 214, 51, - 4, 1, 189, 214, 51, 4, 1, 237, 35, 214, 51, 4, 1, 201, 113, 214, 51, 4, - 1, 237, 34, 214, 51, 4, 1, 201, 103, 214, 51, 4, 1, 239, 175, 214, 51, 4, - 1, 66, 214, 51, 4, 1, 197, 166, 214, 51, 4, 1, 224, 145, 214, 51, 4, 1, - 233, 229, 214, 51, 4, 1, 195, 115, 214, 51, 4, 1, 195, 74, 237, 2, 1, 63, - 237, 2, 1, 249, 8, 237, 2, 1, 247, 56, 237, 2, 1, 245, 102, 237, 2, 1, - 239, 251, 237, 2, 1, 217, 150, 237, 2, 1, 239, 166, 237, 2, 1, 237, 32, - 237, 2, 1, 69, 237, 2, 1, 235, 188, 237, 2, 1, 234, 47, 237, 2, 1, 233, - 160, 237, 2, 1, 232, 146, 237, 2, 1, 68, 237, 2, 1, 225, 192, 237, 2, 1, - 224, 208, 237, 2, 1, 222, 196, 237, 2, 1, 222, 31, 237, 2, 1, 219, 206, - 237, 2, 1, 217, 117, 237, 2, 1, 176, 237, 2, 1, 216, 156, 237, 2, 1, 72, - 237, 2, 1, 213, 91, 237, 2, 1, 211, 138, 237, 2, 1, 210, 182, 237, 2, 1, - 209, 176, 237, 2, 1, 208, 147, 237, 2, 1, 206, 255, 237, 2, 1, 203, 68, - 237, 2, 1, 202, 217, 237, 2, 1, 66, 237, 2, 1, 199, 118, 237, 2, 1, 196, - 202, 237, 2, 1, 196, 148, 237, 2, 1, 195, 88, 237, 2, 1, 195, 65, 237, 2, - 1, 233, 215, 237, 2, 1, 233, 221, 237, 2, 1, 224, 130, 247, 88, 251, 164, - 1, 251, 132, 247, 88, 251, 164, 1, 248, 207, 247, 88, 251, 164, 1, 233, - 178, 247, 88, 251, 164, 1, 240, 60, 247, 88, 251, 164, 1, 237, 63, 247, - 88, 251, 164, 1, 195, 99, 247, 88, 251, 164, 1, 236, 57, 247, 88, 251, - 164, 1, 195, 59, 247, 88, 251, 164, 1, 203, 96, 247, 88, 251, 164, 1, - 247, 15, 247, 88, 251, 164, 1, 195, 228, 247, 88, 251, 164, 1, 195, 74, - 247, 88, 251, 164, 1, 225, 255, 247, 88, 251, 164, 1, 207, 50, 247, 88, - 251, 164, 1, 222, 237, 247, 88, 251, 164, 1, 226, 12, 247, 88, 251, 164, - 1, 196, 198, 247, 88, 251, 164, 1, 237, 163, 247, 88, 251, 164, 1, 247, - 115, 247, 88, 251, 164, 1, 225, 172, 247, 88, 251, 164, 1, 224, 250, 247, - 88, 251, 164, 1, 221, 144, 247, 88, 251, 164, 1, 232, 81, 247, 88, 251, - 164, 1, 211, 139, 247, 88, 251, 164, 1, 251, 47, 247, 88, 251, 164, 1, - 245, 38, 247, 88, 251, 164, 1, 245, 74, 247, 88, 251, 164, 1, 240, 242, - 247, 88, 251, 164, 1, 220, 39, 247, 88, 251, 164, 1, 211, 143, 247, 88, - 251, 164, 1, 216, 2, 247, 88, 251, 164, 1, 237, 140, 247, 88, 251, 164, - 1, 207, 33, 247, 88, 251, 164, 1, 225, 193, 247, 88, 251, 164, 1, 214, - 118, 247, 88, 251, 164, 1, 200, 205, 247, 88, 251, 164, 1, 235, 211, 247, - 88, 251, 164, 1, 237, 153, 247, 88, 251, 164, 1, 245, 108, 247, 88, 251, - 164, 1, 213, 64, 247, 88, 251, 164, 1, 233, 205, 247, 88, 251, 164, 1, - 210, 197, 247, 88, 251, 164, 1, 207, 59, 247, 88, 251, 164, 1, 199, 37, - 247, 88, 251, 164, 1, 202, 50, 247, 88, 251, 164, 1, 206, 160, 247, 88, - 251, 164, 1, 225, 226, 247, 88, 251, 164, 1, 240, 243, 247, 88, 251, 164, - 1, 247, 81, 247, 88, 251, 164, 1, 196, 73, 247, 88, 251, 164, 1, 212, - 153, 247, 88, 251, 164, 1, 224, 51, 247, 88, 251, 164, 244, 236, 78, 30, - 39, 2, 252, 115, 30, 39, 2, 252, 114, 30, 39, 2, 252, 113, 30, 39, 2, - 252, 112, 30, 39, 2, 252, 111, 30, 39, 2, 252, 110, 30, 39, 2, 252, 109, - 30, 39, 2, 252, 108, 30, 39, 2, 252, 107, 30, 39, 2, 252, 106, 30, 39, 2, - 252, 105, 30, 39, 2, 252, 104, 30, 39, 2, 252, 103, 30, 39, 2, 252, 102, - 30, 39, 2, 252, 101, 30, 39, 2, 252, 100, 30, 39, 2, 252, 99, 30, 39, 2, - 252, 98, 30, 39, 2, 252, 97, 30, 39, 2, 252, 96, 30, 39, 2, 252, 95, 30, - 39, 2, 252, 94, 30, 39, 2, 252, 93, 30, 39, 2, 252, 92, 30, 39, 2, 252, - 91, 30, 39, 2, 252, 90, 30, 39, 2, 252, 89, 30, 39, 2, 255, 125, 30, 39, - 2, 252, 88, 30, 39, 2, 252, 87, 30, 39, 2, 252, 86, 30, 39, 2, 252, 85, - 30, 39, 2, 252, 84, 30, 39, 2, 252, 83, 30, 39, 2, 252, 82, 30, 39, 2, - 252, 81, 30, 39, 2, 252, 80, 30, 39, 2, 252, 79, 30, 39, 2, 252, 78, 30, - 39, 2, 252, 77, 30, 39, 2, 252, 76, 30, 39, 2, 252, 75, 30, 39, 2, 252, - 74, 30, 39, 2, 252, 73, 30, 39, 2, 252, 72, 30, 39, 2, 252, 71, 30, 39, - 2, 252, 70, 30, 39, 2, 252, 69, 30, 39, 2, 252, 68, 30, 39, 2, 252, 67, - 30, 39, 2, 252, 66, 30, 39, 2, 252, 65, 30, 39, 2, 252, 64, 30, 39, 2, - 252, 63, 30, 39, 2, 252, 62, 30, 39, 2, 252, 61, 30, 39, 2, 252, 60, 30, - 39, 2, 252, 59, 30, 39, 2, 252, 58, 30, 39, 2, 252, 57, 30, 39, 2, 252, - 56, 30, 39, 2, 252, 55, 30, 39, 2, 252, 54, 30, 39, 2, 252, 53, 30, 39, - 2, 252, 52, 30, 39, 2, 252, 51, 30, 39, 2, 252, 50, 30, 39, 2, 252, 49, - 30, 39, 2, 252, 48, 30, 39, 2, 252, 47, 30, 39, 2, 252, 46, 30, 39, 2, - 255, 38, 30, 39, 2, 252, 45, 30, 39, 2, 252, 44, 30, 39, 2, 255, 3, 30, - 39, 2, 252, 43, 30, 39, 2, 252, 42, 30, 39, 2, 252, 41, 30, 39, 2, 252, - 40, 30, 39, 2, 254, 246, 30, 39, 2, 252, 39, 30, 39, 2, 252, 38, 30, 39, - 2, 252, 37, 30, 39, 2, 252, 36, 30, 39, 2, 252, 35, 30, 39, 2, 254, 62, - 30, 39, 2, 254, 61, 30, 39, 2, 254, 60, 30, 39, 2, 254, 59, 30, 39, 2, - 254, 58, 30, 39, 2, 254, 57, 30, 39, 2, 254, 56, 30, 39, 2, 254, 55, 30, - 39, 2, 254, 53, 30, 39, 2, 254, 52, 30, 39, 2, 254, 51, 30, 39, 2, 254, - 50, 30, 39, 2, 254, 49, 30, 39, 2, 254, 48, 30, 39, 2, 254, 46, 30, 39, - 2, 254, 45, 30, 39, 2, 254, 44, 30, 39, 2, 254, 43, 30, 39, 2, 254, 42, - 30, 39, 2, 254, 41, 30, 39, 2, 254, 40, 30, 39, 2, 254, 39, 30, 39, 2, - 254, 38, 30, 39, 2, 254, 37, 30, 39, 2, 254, 36, 30, 39, 2, 254, 35, 30, - 39, 2, 254, 34, 30, 39, 2, 254, 33, 30, 39, 2, 254, 32, 30, 39, 2, 254, - 31, 30, 39, 2, 254, 30, 30, 39, 2, 254, 29, 30, 39, 2, 254, 28, 30, 39, - 2, 254, 26, 30, 39, 2, 254, 25, 30, 39, 2, 254, 24, 30, 39, 2, 254, 20, - 30, 39, 2, 254, 19, 30, 39, 2, 254, 18, 30, 39, 2, 254, 17, 30, 39, 2, - 254, 13, 30, 39, 2, 254, 12, 30, 39, 2, 254, 11, 30, 39, 2, 254, 10, 30, - 39, 2, 254, 9, 30, 39, 2, 254, 8, 30, 39, 2, 254, 7, 30, 39, 2, 254, 6, - 30, 39, 2, 254, 5, 30, 39, 2, 254, 4, 30, 39, 2, 254, 3, 30, 39, 2, 254, - 2, 30, 39, 2, 254, 1, 30, 39, 2, 254, 0, 30, 39, 2, 253, 255, 30, 39, 2, - 253, 254, 30, 39, 2, 253, 253, 30, 39, 2, 253, 252, 30, 39, 2, 253, 251, - 30, 39, 2, 253, 250, 30, 39, 2, 253, 249, 30, 39, 2, 253, 248, 30, 39, 2, - 253, 247, 30, 39, 2, 253, 245, 30, 39, 2, 253, 244, 30, 39, 2, 253, 243, - 30, 39, 2, 253, 242, 30, 39, 2, 253, 241, 30, 39, 2, 253, 239, 30, 39, 2, - 253, 238, 30, 39, 2, 253, 237, 30, 39, 2, 253, 236, 30, 39, 2, 253, 234, - 30, 39, 2, 253, 233, 30, 39, 2, 253, 232, 30, 39, 2, 253, 198, 30, 39, 2, - 253, 196, 30, 39, 2, 253, 194, 30, 39, 2, 253, 192, 30, 39, 2, 253, 190, - 30, 39, 2, 253, 188, 30, 39, 2, 253, 186, 30, 39, 2, 253, 184, 30, 39, 2, - 253, 182, 30, 39, 2, 253, 180, 30, 39, 2, 253, 178, 30, 39, 2, 253, 175, - 30, 39, 2, 253, 173, 30, 39, 2, 253, 171, 30, 39, 2, 253, 169, 30, 39, 2, - 253, 167, 30, 39, 2, 253, 165, 30, 39, 2, 253, 163, 30, 39, 2, 253, 161, - 30, 39, 2, 253, 79, 30, 39, 2, 253, 78, 30, 39, 2, 253, 77, 30, 39, 2, - 253, 76, 30, 39, 2, 253, 75, 30, 39, 2, 253, 74, 30, 39, 2, 253, 72, 30, - 39, 2, 253, 71, 30, 39, 2, 253, 70, 30, 39, 2, 253, 69, 30, 39, 2, 253, - 68, 30, 39, 2, 253, 67, 30, 39, 2, 253, 65, 30, 39, 2, 253, 64, 30, 39, - 2, 253, 60, 30, 39, 2, 253, 59, 30, 39, 2, 253, 57, 30, 39, 2, 253, 56, - 30, 39, 2, 253, 55, 30, 39, 2, 253, 54, 30, 39, 2, 253, 53, 30, 39, 2, - 253, 52, 30, 39, 2, 253, 51, 30, 39, 2, 253, 50, 30, 39, 2, 253, 49, 30, - 39, 2, 253, 48, 30, 39, 2, 253, 47, 30, 39, 2, 253, 46, 30, 39, 2, 253, - 45, 30, 39, 2, 253, 44, 30, 39, 2, 253, 43, 30, 39, 2, 253, 42, 30, 39, - 2, 253, 41, 30, 39, 2, 253, 40, 30, 39, 2, 253, 39, 30, 39, 2, 253, 38, - 30, 39, 2, 253, 37, 30, 39, 2, 253, 36, 30, 39, 2, 253, 35, 30, 39, 2, - 253, 34, 30, 39, 2, 253, 33, 30, 39, 2, 253, 32, 30, 39, 2, 253, 31, 30, - 39, 2, 253, 30, 30, 39, 2, 253, 29, 30, 39, 2, 253, 28, 30, 39, 2, 253, - 27, 30, 39, 2, 253, 26, 30, 39, 2, 253, 25, 30, 39, 2, 253, 24, 30, 39, - 2, 253, 23, 30, 39, 2, 253, 22, 30, 39, 2, 253, 21, 30, 39, 2, 253, 20, - 30, 39, 2, 253, 19, 30, 39, 2, 253, 18, 30, 39, 2, 253, 17, 30, 39, 2, - 253, 16, 30, 39, 2, 253, 15, 30, 39, 2, 253, 14, 30, 39, 2, 253, 13, 30, - 39, 2, 253, 12, 30, 39, 2, 253, 11, 30, 39, 2, 253, 10, 30, 39, 2, 253, - 9, 30, 39, 2, 253, 8, 30, 39, 2, 253, 7, 30, 39, 2, 253, 6, 30, 39, 2, - 253, 5, 30, 39, 2, 253, 4, 30, 39, 2, 253, 3, 30, 39, 2, 253, 2, 30, 39, - 2, 253, 1, 30, 39, 2, 253, 0, 30, 39, 2, 252, 255, 30, 39, 2, 252, 254, - 30, 39, 2, 252, 253, 30, 39, 2, 252, 252, 30, 39, 2, 252, 251, 30, 39, 2, - 252, 250, 30, 39, 2, 252, 249, 30, 39, 2, 252, 248, 30, 39, 2, 252, 247, - 30, 39, 2, 252, 246, 30, 39, 2, 252, 245, 30, 39, 2, 252, 244, 30, 39, 2, - 252, 243, 30, 39, 2, 252, 242, 30, 39, 2, 252, 241, 30, 39, 2, 252, 240, - 30, 39, 2, 252, 239, 30, 39, 2, 252, 238, 30, 39, 2, 252, 237, 30, 39, 2, - 252, 236, 30, 39, 2, 252, 235, 30, 39, 2, 252, 234, 30, 39, 2, 252, 233, - 30, 39, 2, 252, 232, 30, 39, 2, 252, 231, 30, 39, 2, 252, 230, 30, 39, 2, - 252, 229, 30, 39, 2, 252, 228, 30, 39, 2, 252, 227, 30, 39, 2, 252, 226, - 30, 39, 2, 252, 225, 30, 39, 2, 252, 224, 30, 39, 2, 252, 223, 30, 39, 2, - 252, 222, 30, 39, 2, 252, 221, 30, 39, 2, 252, 220, 30, 39, 2, 252, 219, - 30, 39, 2, 252, 218, 30, 39, 2, 252, 217, 30, 39, 2, 252, 216, 30, 39, 2, - 252, 215, 30, 39, 2, 252, 214, 30, 39, 2, 252, 213, 30, 39, 2, 252, 212, - 30, 39, 2, 252, 211, 30, 39, 2, 252, 210, 30, 39, 2, 252, 209, 30, 39, 2, - 252, 208, 30, 39, 2, 252, 207, 30, 39, 2, 252, 206, 30, 39, 2, 252, 205, - 30, 39, 2, 252, 204, 30, 39, 2, 252, 203, 30, 39, 2, 252, 202, 30, 39, 2, - 252, 201, 30, 39, 2, 252, 200, 30, 39, 2, 252, 199, 30, 39, 2, 252, 198, - 30, 39, 2, 252, 197, 63, 30, 39, 2, 252, 196, 250, 111, 30, 39, 2, 252, - 195, 240, 230, 30, 39, 2, 252, 194, 69, 30, 39, 2, 252, 193, 236, 48, 30, - 39, 2, 252, 192, 233, 14, 30, 39, 2, 252, 191, 225, 216, 30, 39, 2, 252, - 190, 225, 79, 30, 39, 2, 252, 189, 159, 30, 39, 2, 252, 188, 223, 86, 30, - 39, 2, 252, 187, 223, 85, 30, 39, 2, 252, 186, 223, 84, 30, 39, 2, 252, - 185, 223, 83, 30, 39, 2, 252, 184, 197, 199, 30, 39, 2, 252, 183, 196, - 222, 30, 39, 2, 252, 182, 196, 148, 30, 39, 2, 252, 181, 214, 123, 30, - 39, 2, 252, 180, 252, 30, 30, 39, 2, 252, 179, 249, 45, 30, 39, 2, 252, - 178, 240, 42, 30, 39, 2, 252, 177, 236, 56, 30, 39, 2, 252, 176, 225, - 192, 30, 39, 2, 252, 175, 30, 39, 2, 252, 174, 30, 39, 2, 252, 173, 30, - 39, 2, 252, 172, 30, 39, 2, 252, 171, 30, 39, 2, 252, 170, 30, 39, 2, - 252, 169, 30, 39, 2, 252, 168, 240, 237, 5, 63, 240, 237, 5, 69, 240, - 237, 5, 68, 240, 237, 5, 72, 240, 237, 5, 66, 240, 237, 5, 225, 213, 240, - 237, 5, 225, 128, 240, 237, 5, 155, 240, 237, 5, 224, 208, 240, 237, 5, - 224, 100, 240, 237, 5, 224, 10, 240, 237, 5, 223, 186, 240, 237, 5, 172, - 240, 237, 5, 222, 196, 240, 237, 5, 222, 108, 240, 237, 5, 222, 6, 240, - 237, 5, 221, 190, 240, 237, 5, 166, 240, 237, 5, 219, 206, 240, 237, 5, - 219, 77, 240, 237, 5, 218, 250, 240, 237, 5, 218, 144, 240, 237, 5, 176, - 240, 237, 5, 217, 117, 240, 237, 5, 216, 222, 240, 237, 5, 216, 49, 240, - 237, 5, 215, 185, 240, 237, 5, 161, 240, 237, 5, 213, 91, 240, 237, 5, - 212, 219, 240, 237, 5, 212, 116, 240, 237, 5, 211, 226, 240, 237, 5, 169, - 240, 237, 5, 210, 182, 240, 237, 5, 210, 72, 240, 237, 5, 209, 232, 240, - 237, 5, 209, 140, 240, 237, 5, 183, 240, 237, 5, 208, 147, 240, 237, 5, - 206, 112, 240, 237, 5, 205, 200, 240, 237, 5, 204, 172, 240, 237, 5, 189, - 240, 237, 5, 203, 68, 240, 237, 5, 202, 122, 240, 237, 5, 149, 240, 237, - 5, 201, 40, 240, 237, 5, 197, 166, 240, 237, 5, 197, 109, 240, 237, 5, - 197, 70, 240, 237, 5, 197, 34, 240, 237, 5, 196, 208, 240, 237, 5, 196, - 202, 240, 237, 5, 195, 115, 240, 237, 5, 195, 11, 226, 87, 250, 254, 1, - 251, 161, 226, 87, 250, 254, 1, 248, 204, 226, 87, 250, 254, 1, 233, 176, - 226, 87, 250, 254, 1, 240, 99, 226, 87, 250, 254, 1, 232, 146, 226, 87, - 250, 254, 1, 197, 117, 226, 87, 250, 254, 1, 195, 92, 226, 87, 250, 254, - 1, 232, 86, 226, 87, 250, 254, 1, 202, 253, 226, 87, 250, 254, 1, 195, - 240, 226, 87, 250, 254, 1, 225, 4, 226, 87, 250, 254, 1, 222, 239, 226, - 87, 250, 254, 1, 219, 170, 226, 87, 250, 254, 1, 215, 137, 226, 87, 250, - 254, 1, 208, 225, 226, 87, 250, 254, 1, 250, 116, 226, 87, 250, 254, 1, - 213, 91, 226, 87, 250, 254, 1, 209, 5, 226, 87, 250, 254, 1, 211, 100, - 226, 87, 250, 254, 1, 210, 109, 226, 87, 250, 254, 1, 206, 211, 226, 87, - 250, 254, 1, 203, 82, 226, 87, 250, 254, 208, 133, 55, 226, 87, 250, 254, - 31, 100, 226, 87, 250, 254, 31, 102, 226, 87, 250, 254, 31, 134, 226, 87, - 250, 254, 31, 203, 23, 226, 87, 250, 254, 31, 200, 234, 226, 87, 250, - 254, 31, 97, 231, 56, 226, 87, 250, 254, 31, 97, 170, 226, 87, 250, 254, - 31, 203, 24, 170, 213, 203, 1, 251, 161, 213, 203, 1, 248, 204, 213, 203, - 1, 233, 176, 213, 203, 1, 240, 99, 213, 203, 1, 232, 146, 213, 203, 1, - 197, 117, 213, 203, 1, 195, 92, 213, 203, 1, 232, 86, 213, 203, 1, 202, - 253, 213, 203, 1, 195, 240, 213, 203, 1, 225, 4, 213, 203, 1, 222, 239, - 213, 203, 1, 219, 170, 213, 203, 1, 48, 215, 137, 213, 203, 1, 215, 137, - 213, 203, 1, 208, 225, 213, 203, 1, 250, 116, 213, 203, 1, 213, 91, 213, - 203, 1, 209, 5, 213, 203, 1, 211, 100, 213, 203, 1, 210, 109, 213, 203, - 1, 206, 211, 213, 203, 1, 203, 82, 213, 203, 222, 178, 235, 76, 213, 203, - 210, 17, 235, 76, 213, 203, 31, 100, 213, 203, 31, 102, 213, 203, 31, - 134, 213, 203, 31, 136, 213, 203, 31, 146, 213, 203, 31, 203, 23, 213, - 203, 31, 200, 234, 217, 239, 1, 48, 251, 161, 217, 239, 1, 251, 161, 217, - 239, 1, 48, 248, 204, 217, 239, 1, 248, 204, 217, 239, 1, 233, 176, 217, - 239, 1, 240, 99, 217, 239, 1, 48, 232, 146, 217, 239, 1, 232, 146, 217, - 239, 1, 197, 117, 217, 239, 1, 195, 92, 217, 239, 1, 232, 86, 217, 239, - 1, 202, 253, 217, 239, 1, 48, 195, 240, 217, 239, 1, 195, 240, 217, 239, - 1, 48, 225, 4, 217, 239, 1, 225, 4, 217, 239, 1, 48, 222, 239, 217, 239, - 1, 222, 239, 217, 239, 1, 48, 219, 170, 217, 239, 1, 219, 170, 217, 239, - 1, 48, 215, 137, 217, 239, 1, 215, 137, 217, 239, 1, 208, 225, 217, 239, - 1, 250, 116, 217, 239, 1, 213, 91, 217, 239, 1, 209, 5, 217, 239, 1, 211, - 100, 217, 239, 1, 210, 109, 217, 239, 1, 48, 206, 211, 217, 239, 1, 206, - 211, 217, 239, 1, 203, 82, 217, 239, 31, 100, 217, 239, 31, 102, 217, - 239, 31, 134, 217, 239, 31, 136, 217, 239, 241, 46, 31, 136, 217, 239, - 31, 146, 217, 239, 31, 203, 23, 217, 239, 31, 200, 234, 217, 239, 31, 97, - 231, 56, 232, 159, 1, 251, 161, 232, 159, 1, 248, 204, 232, 159, 1, 233, - 176, 232, 159, 1, 240, 98, 232, 159, 1, 232, 146, 232, 159, 1, 197, 117, - 232, 159, 1, 195, 90, 232, 159, 1, 232, 86, 232, 159, 1, 202, 253, 232, - 159, 1, 195, 240, 232, 159, 1, 225, 4, 232, 159, 1, 222, 239, 232, 159, - 1, 219, 170, 232, 159, 1, 215, 137, 232, 159, 1, 208, 225, 232, 159, 1, - 250, 114, 232, 159, 1, 213, 91, 232, 159, 1, 209, 5, 232, 159, 1, 211, - 100, 232, 159, 1, 206, 211, 232, 159, 1, 203, 82, 232, 159, 31, 100, 232, - 159, 31, 146, 232, 159, 31, 203, 23, 232, 159, 31, 200, 234, 232, 159, - 31, 97, 231, 56, 212, 231, 1, 251, 158, 212, 231, 1, 248, 207, 212, 231, - 1, 234, 95, 212, 231, 1, 239, 213, 212, 231, 1, 232, 146, 212, 231, 1, - 197, 124, 212, 231, 1, 195, 108, 212, 231, 1, 232, 88, 212, 231, 1, 203, - 1, 212, 231, 1, 195, 241, 212, 231, 1, 225, 34, 212, 231, 1, 222, 245, - 212, 231, 1, 219, 170, 212, 231, 1, 215, 137, 212, 231, 1, 207, 99, 212, - 231, 1, 251, 193, 212, 231, 1, 213, 91, 212, 231, 1, 209, 7, 212, 231, 1, - 211, 105, 212, 231, 1, 209, 196, 212, 231, 1, 206, 211, 212, 231, 1, 203, - 89, 212, 231, 31, 100, 212, 231, 31, 203, 23, 212, 231, 31, 200, 234, - 212, 231, 31, 97, 231, 56, 212, 231, 31, 102, 212, 231, 31, 134, 212, - 231, 197, 9, 207, 90, 221, 147, 1, 63, 221, 147, 1, 250, 111, 221, 147, - 1, 234, 189, 221, 147, 1, 240, 230, 221, 147, 1, 69, 221, 147, 1, 199, - 230, 221, 147, 1, 68, 221, 147, 1, 196, 148, 221, 147, 1, 225, 79, 221, - 147, 1, 159, 221, 147, 1, 221, 135, 221, 147, 1, 218, 54, 221, 147, 1, - 72, 221, 147, 1, 144, 221, 147, 1, 205, 83, 221, 147, 1, 203, 216, 221, - 147, 1, 66, 221, 147, 1, 236, 48, 221, 147, 1, 211, 166, 221, 147, 1, - 209, 80, 221, 147, 1, 201, 81, 221, 147, 1, 251, 105, 221, 147, 1, 236, - 229, 221, 147, 1, 221, 150, 221, 147, 1, 216, 86, 221, 147, 1, 247, 206, - 221, 147, 201, 177, 78, 140, 232, 56, 1, 63, 140, 232, 56, 1, 69, 140, - 232, 56, 1, 68, 140, 232, 56, 1, 72, 140, 232, 56, 1, 164, 140, 232, 56, - 1, 197, 166, 140, 232, 56, 1, 249, 144, 140, 232, 56, 1, 249, 143, 140, - 232, 56, 1, 161, 140, 232, 56, 1, 166, 140, 232, 56, 1, 176, 140, 232, - 56, 1, 217, 254, 140, 232, 56, 1, 217, 117, 140, 232, 56, 1, 217, 115, - 140, 232, 56, 1, 169, 140, 232, 56, 1, 210, 249, 140, 232, 56, 1, 172, - 140, 232, 56, 1, 224, 145, 140, 232, 56, 1, 232, 79, 140, 232, 56, 1, - 183, 140, 232, 56, 1, 209, 21, 140, 232, 56, 1, 208, 147, 140, 232, 56, - 1, 155, 140, 232, 56, 1, 211, 158, 140, 232, 56, 1, 189, 140, 232, 56, 1, - 203, 167, 140, 232, 56, 1, 203, 68, 140, 232, 56, 1, 203, 66, 140, 232, - 56, 1, 149, 140, 232, 56, 1, 240, 135, 140, 232, 56, 16, 199, 28, 140, - 232, 56, 16, 199, 27, 140, 241, 12, 1, 63, 140, 241, 12, 1, 69, 140, 241, - 12, 1, 68, 140, 241, 12, 1, 72, 140, 241, 12, 1, 164, 140, 241, 12, 1, - 197, 166, 140, 241, 12, 1, 249, 144, 140, 241, 12, 1, 161, 140, 241, 12, - 1, 166, 140, 241, 12, 1, 176, 140, 241, 12, 1, 217, 117, 140, 241, 12, 1, - 169, 140, 241, 12, 1, 172, 140, 241, 12, 1, 224, 145, 140, 241, 12, 1, - 232, 79, 140, 241, 12, 1, 183, 140, 241, 12, 1, 250, 250, 183, 140, 241, - 12, 1, 208, 147, 140, 241, 12, 1, 155, 140, 241, 12, 1, 211, 158, 140, - 241, 12, 1, 189, 140, 241, 12, 1, 203, 68, 140, 241, 12, 1, 149, 140, - 241, 12, 1, 240, 135, 140, 241, 12, 191, 236, 252, 200, 241, 140, 241, - 12, 191, 97, 232, 224, 140, 241, 12, 221, 247, 209, 238, 140, 241, 12, - 221, 247, 226, 92, 140, 241, 12, 31, 100, 140, 241, 12, 31, 102, 140, - 241, 12, 31, 134, 140, 241, 12, 31, 136, 140, 241, 12, 31, 146, 140, 241, - 12, 31, 167, 140, 241, 12, 31, 178, 140, 241, 12, 31, 171, 140, 241, 12, - 31, 182, 140, 241, 12, 31, 203, 23, 140, 241, 12, 31, 200, 234, 140, 241, - 12, 31, 202, 177, 140, 241, 12, 31, 235, 13, 140, 241, 12, 31, 235, 144, - 140, 241, 12, 31, 206, 13, 140, 241, 12, 31, 207, 65, 140, 241, 12, 31, - 97, 231, 56, 140, 241, 12, 31, 99, 231, 56, 140, 241, 12, 31, 115, 231, - 56, 140, 241, 12, 31, 235, 6, 231, 56, 140, 241, 12, 31, 235, 100, 231, - 56, 140, 241, 12, 31, 206, 29, 231, 56, 140, 241, 12, 31, 207, 71, 231, - 56, 140, 241, 12, 31, 237, 30, 231, 56, 140, 241, 12, 31, 216, 178, 231, - 56, 140, 241, 12, 31, 97, 170, 140, 241, 12, 31, 99, 170, 140, 241, 12, - 31, 115, 170, 140, 241, 12, 31, 235, 6, 170, 140, 241, 12, 31, 235, 100, - 170, 140, 241, 12, 31, 206, 29, 170, 140, 241, 12, 31, 207, 71, 170, 140, - 241, 12, 31, 237, 30, 170, 140, 241, 12, 31, 216, 178, 170, 140, 241, 12, - 31, 203, 24, 170, 140, 241, 12, 31, 200, 235, 170, 140, 241, 12, 31, 202, - 178, 170, 140, 241, 12, 31, 235, 14, 170, 140, 241, 12, 31, 235, 145, - 170, 140, 241, 12, 31, 206, 14, 170, 140, 241, 12, 31, 207, 66, 170, 140, - 241, 12, 31, 237, 20, 170, 140, 241, 12, 31, 216, 174, 170, 140, 241, 12, - 31, 97, 231, 57, 170, 140, 241, 12, 31, 99, 231, 57, 170, 140, 241, 12, - 31, 115, 231, 57, 170, 140, 241, 12, 31, 235, 6, 231, 57, 170, 140, 241, - 12, 31, 235, 100, 231, 57, 170, 140, 241, 12, 31, 206, 29, 231, 57, 170, - 140, 241, 12, 31, 207, 71, 231, 57, 170, 140, 241, 12, 31, 237, 30, 231, - 57, 170, 140, 241, 12, 31, 216, 178, 231, 57, 170, 140, 241, 12, 191, 97, - 200, 242, 140, 241, 12, 191, 99, 200, 241, 140, 241, 12, 191, 115, 200, - 241, 140, 241, 12, 191, 235, 6, 200, 241, 140, 241, 12, 191, 235, 100, - 200, 241, 140, 241, 12, 191, 206, 29, 200, 241, 140, 241, 12, 191, 207, - 71, 200, 241, 140, 241, 12, 191, 237, 30, 200, 241, 140, 241, 12, 191, - 216, 178, 200, 241, 140, 241, 12, 191, 203, 24, 200, 241, 224, 132, 1, - 63, 224, 132, 18, 2, 68, 224, 132, 18, 2, 66, 224, 132, 18, 2, 110, 144, - 224, 132, 18, 2, 69, 224, 132, 18, 2, 72, 224, 132, 18, 222, 157, 78, - 224, 132, 2, 52, 210, 3, 60, 224, 132, 2, 251, 50, 224, 132, 2, 199, 2, - 224, 132, 1, 155, 224, 132, 1, 224, 145, 224, 132, 1, 234, 122, 224, 132, - 1, 233, 229, 224, 132, 1, 247, 173, 224, 132, 1, 247, 15, 224, 132, 1, - 225, 213, 224, 132, 1, 215, 108, 224, 132, 1, 201, 78, 224, 132, 1, 201, - 66, 224, 132, 1, 240, 40, 224, 132, 1, 240, 24, 224, 132, 1, 216, 85, - 224, 132, 1, 189, 224, 132, 1, 202, 233, 224, 132, 1, 240, 135, 224, 132, - 1, 239, 175, 224, 132, 1, 176, 224, 132, 1, 161, 224, 132, 1, 213, 5, - 224, 132, 1, 249, 144, 224, 132, 1, 248, 196, 224, 132, 1, 166, 224, 132, - 1, 164, 224, 132, 1, 169, 224, 132, 1, 172, 224, 132, 1, 199, 152, 224, - 132, 1, 207, 50, 224, 132, 1, 205, 80, 224, 132, 1, 183, 224, 132, 1, - 195, 115, 224, 132, 1, 142, 224, 132, 1, 224, 35, 224, 132, 1, 201, 46, - 224, 132, 1, 201, 47, 224, 132, 1, 199, 35, 224, 132, 2, 249, 79, 57, - 224, 132, 2, 247, 87, 224, 132, 2, 76, 60, 224, 132, 199, 7, 224, 132, - 17, 100, 224, 132, 17, 102, 224, 132, 17, 134, 224, 132, 17, 136, 224, - 132, 31, 203, 23, 224, 132, 31, 200, 234, 224, 132, 31, 97, 231, 56, 224, - 132, 31, 97, 170, 224, 132, 191, 97, 232, 224, 224, 132, 211, 213, 238, - 252, 224, 132, 211, 213, 4, 244, 248, 224, 132, 211, 213, 244, 248, 224, - 132, 211, 213, 241, 71, 154, 224, 132, 211, 213, 220, 54, 224, 132, 211, - 213, 221, 212, 224, 132, 211, 213, 240, 87, 224, 132, 211, 213, 52, 240, - 87, 224, 132, 211, 213, 222, 68, 37, 205, 159, 251, 9, 1, 232, 146, 37, - 205, 159, 251, 9, 1, 222, 239, 37, 205, 159, 251, 9, 1, 232, 86, 37, 205, - 159, 251, 9, 1, 219, 170, 37, 205, 159, 251, 9, 1, 211, 100, 37, 205, - 159, 251, 9, 1, 197, 117, 37, 205, 159, 251, 9, 1, 206, 211, 37, 205, - 159, 251, 9, 1, 210, 109, 37, 205, 159, 251, 9, 1, 248, 204, 37, 205, - 159, 251, 9, 1, 203, 82, 37, 205, 159, 251, 9, 1, 208, 199, 37, 205, 159, - 251, 9, 1, 225, 4, 37, 205, 159, 251, 9, 1, 215, 137, 37, 205, 159, 251, - 9, 1, 224, 127, 37, 205, 159, 251, 9, 1, 209, 5, 37, 205, 159, 251, 9, 1, - 208, 225, 37, 205, 159, 251, 9, 1, 235, 188, 37, 205, 159, 251, 9, 1, - 251, 163, 37, 205, 159, 251, 9, 1, 250, 114, 37, 205, 159, 251, 9, 1, - 239, 172, 37, 205, 159, 251, 9, 1, 233, 176, 37, 205, 159, 251, 9, 1, - 240, 99, 37, 205, 159, 251, 9, 1, 233, 217, 37, 205, 159, 251, 9, 1, 202, - 253, 37, 205, 159, 251, 9, 1, 195, 90, 37, 205, 159, 251, 9, 1, 239, 169, - 37, 205, 159, 251, 9, 1, 195, 240, 37, 205, 159, 251, 9, 1, 202, 219, 37, - 205, 159, 251, 9, 1, 202, 198, 37, 205, 159, 251, 9, 31, 100, 37, 205, - 159, 251, 9, 31, 235, 144, 37, 205, 159, 251, 9, 156, 226, 67, 37, 173, - 251, 9, 1, 232, 112, 37, 173, 251, 9, 1, 222, 248, 37, 173, 251, 9, 1, - 232, 235, 37, 173, 251, 9, 1, 219, 184, 37, 173, 251, 9, 1, 211, 151, 37, - 173, 251, 9, 1, 197, 117, 37, 173, 251, 9, 1, 236, 148, 37, 173, 251, 9, - 1, 210, 141, 37, 173, 251, 9, 1, 248, 238, 37, 173, 251, 9, 1, 203, 41, - 37, 173, 251, 9, 1, 236, 149, 37, 173, 251, 9, 1, 225, 34, 37, 173, 251, - 9, 1, 216, 30, 37, 173, 251, 9, 1, 224, 141, 37, 173, 251, 9, 1, 209, 8, - 37, 173, 251, 9, 1, 236, 147, 37, 173, 251, 9, 1, 235, 175, 37, 173, 251, - 9, 1, 251, 163, 37, 173, 251, 9, 1, 251, 193, 37, 173, 251, 9, 1, 240, - 129, 37, 173, 251, 9, 1, 234, 38, 37, 173, 251, 9, 1, 240, 106, 37, 173, - 251, 9, 1, 233, 224, 37, 173, 251, 9, 1, 203, 139, 37, 173, 251, 9, 1, - 195, 106, 37, 173, 251, 9, 1, 202, 225, 37, 173, 251, 9, 1, 196, 64, 37, - 173, 251, 9, 1, 202, 213, 37, 173, 251, 9, 1, 195, 109, 37, 173, 251, 9, - 31, 100, 37, 173, 251, 9, 31, 203, 23, 37, 173, 251, 9, 31, 200, 234, - 220, 52, 1, 251, 161, 220, 52, 1, 248, 204, 220, 52, 1, 248, 189, 220, - 52, 1, 233, 176, 220, 52, 1, 233, 202, 220, 52, 1, 240, 99, 220, 52, 1, - 232, 146, 220, 52, 1, 197, 117, 220, 52, 2, 200, 104, 220, 52, 1, 195, - 92, 220, 52, 1, 195, 67, 220, 52, 1, 225, 194, 220, 52, 1, 225, 175, 220, - 52, 1, 232, 86, 220, 52, 1, 202, 253, 220, 52, 1, 195, 240, 220, 52, 1, - 225, 4, 220, 52, 1, 196, 205, 220, 52, 1, 224, 134, 220, 52, 1, 222, 239, - 220, 52, 1, 239, 168, 220, 52, 1, 202, 224, 220, 52, 1, 219, 170, 220, - 52, 1, 215, 137, 220, 52, 1, 208, 225, 220, 52, 1, 250, 116, 220, 52, 1, - 252, 119, 220, 52, 1, 213, 91, 220, 52, 1, 235, 188, 220, 52, 1, 209, 5, - 220, 52, 1, 211, 100, 220, 52, 1, 196, 182, 220, 52, 1, 211, 127, 220, - 52, 1, 210, 109, 220, 52, 1, 206, 211, 220, 52, 1, 205, 48, 220, 52, 1, - 203, 82, 220, 52, 252, 29, 117, 57, 220, 52, 252, 29, 117, 60, 220, 52, - 31, 100, 220, 52, 31, 146, 220, 52, 31, 203, 23, 220, 52, 31, 200, 234, - 220, 52, 31, 97, 231, 56, 220, 52, 211, 213, 205, 7, 220, 52, 211, 213, - 235, 76, 220, 52, 211, 213, 52, 76, 197, 39, 238, 252, 220, 52, 211, 213, - 76, 197, 39, 238, 252, 220, 52, 211, 213, 238, 252, 220, 52, 211, 213, - 99, 238, 249, 220, 52, 211, 213, 222, 75, 235, 133, 250, 128, 1, 63, 250, - 128, 1, 252, 167, 250, 128, 1, 251, 48, 250, 128, 1, 252, 125, 250, 128, - 1, 251, 105, 250, 128, 1, 252, 127, 250, 128, 1, 251, 244, 250, 128, 1, - 251, 240, 250, 128, 1, 69, 250, 128, 1, 237, 53, 250, 128, 1, 72, 250, - 128, 1, 214, 101, 250, 128, 1, 68, 250, 128, 1, 226, 119, 250, 128, 1, - 66, 250, 128, 1, 199, 245, 250, 128, 1, 224, 208, 250, 128, 1, 196, 202, - 250, 128, 1, 196, 162, 250, 128, 1, 196, 173, 250, 128, 1, 234, 47, 250, - 128, 1, 234, 4, 250, 128, 1, 233, 215, 250, 128, 1, 247, 56, 250, 128, 1, - 225, 192, 250, 128, 1, 203, 68, 250, 128, 1, 202, 217, 250, 128, 1, 239, - 251, 250, 128, 1, 239, 166, 250, 128, 1, 201, 73, 250, 128, 1, 213, 91, - 250, 128, 1, 235, 188, 250, 128, 1, 249, 8, 250, 128, 1, 248, 191, 250, - 128, 1, 217, 57, 250, 128, 1, 216, 228, 250, 128, 1, 216, 229, 250, 128, - 1, 217, 117, 250, 128, 1, 215, 97, 250, 128, 1, 216, 80, 250, 128, 1, - 219, 206, 250, 128, 1, 231, 242, 250, 128, 1, 195, 165, 250, 128, 1, 196, - 69, 250, 128, 1, 199, 118, 250, 128, 1, 210, 182, 250, 128, 1, 222, 196, - 250, 128, 1, 208, 147, 250, 128, 1, 195, 88, 250, 128, 1, 206, 255, 250, - 128, 1, 195, 65, 250, 128, 1, 206, 119, 250, 128, 1, 205, 49, 250, 128, - 1, 232, 146, 250, 128, 252, 29, 78, 202, 70, 99, 238, 250, 127, 97, 76, - 211, 212, 4, 99, 238, 250, 127, 97, 76, 211, 212, 222, 227, 99, 238, 250, - 127, 97, 76, 211, 212, 222, 227, 97, 76, 127, 99, 238, 250, 211, 212, - 222, 227, 99, 209, 255, 127, 97, 210, 3, 211, 212, 222, 227, 97, 210, 3, - 127, 99, 209, 255, 211, 212, 226, 45, 213, 132, 1, 251, 161, 226, 45, - 213, 132, 1, 248, 204, 226, 45, 213, 132, 1, 233, 176, 226, 45, 213, 132, - 1, 240, 99, 226, 45, 213, 132, 1, 232, 146, 226, 45, 213, 132, 1, 197, - 117, 226, 45, 213, 132, 1, 195, 92, 226, 45, 213, 132, 1, 232, 86, 226, - 45, 213, 132, 1, 202, 253, 226, 45, 213, 132, 1, 195, 240, 226, 45, 213, - 132, 1, 225, 4, 226, 45, 213, 132, 1, 222, 239, 226, 45, 213, 132, 1, - 219, 170, 226, 45, 213, 132, 1, 215, 137, 226, 45, 213, 132, 1, 208, 225, - 226, 45, 213, 132, 1, 250, 116, 226, 45, 213, 132, 1, 213, 91, 226, 45, - 213, 132, 1, 209, 5, 226, 45, 213, 132, 1, 211, 100, 226, 45, 213, 132, - 1, 210, 109, 226, 45, 213, 132, 1, 206, 211, 226, 45, 213, 132, 1, 203, - 82, 226, 45, 213, 132, 31, 100, 226, 45, 213, 132, 31, 102, 226, 45, 213, - 132, 31, 134, 226, 45, 213, 132, 31, 136, 226, 45, 213, 132, 31, 203, 23, - 226, 45, 213, 132, 31, 200, 234, 226, 45, 213, 132, 31, 97, 231, 56, 226, - 45, 213, 132, 31, 97, 170, 226, 45, 213, 221, 1, 251, 161, 226, 45, 213, - 221, 1, 248, 204, 226, 45, 213, 221, 1, 233, 176, 226, 45, 213, 221, 1, - 240, 99, 226, 45, 213, 221, 1, 232, 146, 226, 45, 213, 221, 1, 197, 116, - 226, 45, 213, 221, 1, 195, 92, 226, 45, 213, 221, 1, 232, 86, 226, 45, - 213, 221, 1, 202, 253, 226, 45, 213, 221, 1, 195, 240, 226, 45, 213, 221, - 1, 225, 4, 226, 45, 213, 221, 1, 222, 239, 226, 45, 213, 221, 1, 219, - 169, 226, 45, 213, 221, 1, 215, 137, 226, 45, 213, 221, 1, 208, 225, 226, - 45, 213, 221, 1, 213, 91, 226, 45, 213, 221, 1, 209, 5, 226, 45, 213, - 221, 1, 206, 211, 226, 45, 213, 221, 1, 203, 82, 226, 45, 213, 221, 31, - 100, 226, 45, 213, 221, 31, 102, 226, 45, 213, 221, 31, 134, 226, 45, - 213, 221, 31, 136, 226, 45, 213, 221, 31, 203, 23, 226, 45, 213, 221, 31, - 200, 234, 226, 45, 213, 221, 31, 97, 231, 56, 226, 45, 213, 221, 31, 97, - 170, 211, 238, 213, 221, 1, 251, 161, 211, 238, 213, 221, 1, 248, 204, - 211, 238, 213, 221, 1, 233, 176, 211, 238, 213, 221, 1, 240, 99, 211, - 238, 213, 221, 1, 232, 146, 211, 238, 213, 221, 1, 197, 116, 211, 238, - 213, 221, 1, 195, 92, 211, 238, 213, 221, 1, 232, 86, 211, 238, 213, 221, - 1, 195, 240, 211, 238, 213, 221, 1, 225, 4, 211, 238, 213, 221, 1, 222, - 239, 211, 238, 213, 221, 1, 219, 169, 211, 238, 213, 221, 1, 215, 137, - 211, 238, 213, 221, 1, 208, 225, 211, 238, 213, 221, 1, 213, 91, 211, - 238, 213, 221, 1, 209, 5, 211, 238, 213, 221, 1, 206, 211, 211, 238, 213, - 221, 1, 203, 82, 211, 238, 213, 221, 208, 133, 78, 211, 238, 213, 221, - 163, 208, 133, 78, 211, 238, 213, 221, 235, 6, 238, 250, 3, 241, 60, 211, - 238, 213, 221, 235, 6, 238, 250, 3, 238, 252, 211, 238, 213, 221, 31, - 100, 211, 238, 213, 221, 31, 102, 211, 238, 213, 221, 31, 134, 211, 238, - 213, 221, 31, 136, 211, 238, 213, 221, 31, 203, 23, 211, 238, 213, 221, - 31, 200, 234, 211, 238, 213, 221, 31, 97, 231, 56, 37, 201, 7, 1, 214, - 60, 63, 37, 201, 7, 1, 196, 57, 63, 37, 201, 7, 1, 196, 57, 251, 244, 37, - 201, 7, 1, 214, 60, 68, 37, 201, 7, 1, 196, 57, 68, 37, 201, 7, 1, 196, - 57, 69, 37, 201, 7, 1, 214, 60, 72, 37, 201, 7, 1, 214, 60, 214, 163, 37, - 201, 7, 1, 196, 57, 214, 163, 37, 201, 7, 1, 214, 60, 252, 116, 37, 201, - 7, 1, 196, 57, 252, 116, 37, 201, 7, 1, 214, 60, 251, 243, 37, 201, 7, 1, - 196, 57, 251, 243, 37, 201, 7, 1, 214, 60, 251, 216, 37, 201, 7, 1, 196, - 57, 251, 216, 37, 201, 7, 1, 214, 60, 251, 238, 37, 201, 7, 1, 196, 57, - 251, 238, 37, 201, 7, 1, 214, 60, 252, 5, 37, 201, 7, 1, 196, 57, 252, 5, - 37, 201, 7, 1, 214, 60, 251, 242, 37, 201, 7, 1, 214, 60, 236, 55, 37, - 201, 7, 1, 196, 57, 236, 55, 37, 201, 7, 1, 214, 60, 250, 121, 37, 201, - 7, 1, 196, 57, 250, 121, 37, 201, 7, 1, 214, 60, 251, 225, 37, 201, 7, 1, - 196, 57, 251, 225, 37, 201, 7, 1, 214, 60, 251, 236, 37, 201, 7, 1, 196, - 57, 251, 236, 37, 201, 7, 1, 214, 60, 214, 161, 37, 201, 7, 1, 196, 57, - 214, 161, 37, 201, 7, 1, 214, 60, 251, 172, 37, 201, 7, 1, 196, 57, 251, - 172, 37, 201, 7, 1, 214, 60, 251, 235, 37, 201, 7, 1, 214, 60, 236, 244, - 37, 201, 7, 1, 214, 60, 236, 240, 37, 201, 7, 1, 214, 60, 251, 105, 37, - 201, 7, 1, 214, 60, 251, 233, 37, 201, 7, 1, 196, 57, 251, 233, 37, 201, - 7, 1, 214, 60, 236, 206, 37, 201, 7, 1, 196, 57, 236, 206, 37, 201, 7, 1, - 214, 60, 236, 226, 37, 201, 7, 1, 196, 57, 236, 226, 37, 201, 7, 1, 214, - 60, 236, 192, 37, 201, 7, 1, 196, 57, 236, 192, 37, 201, 7, 1, 196, 57, - 251, 96, 37, 201, 7, 1, 214, 60, 236, 214, 37, 201, 7, 1, 196, 57, 251, - 232, 37, 201, 7, 1, 214, 60, 236, 182, 37, 201, 7, 1, 214, 60, 214, 92, - 37, 201, 7, 1, 214, 60, 230, 202, 37, 201, 7, 1, 214, 60, 237, 61, 37, - 201, 7, 1, 196, 57, 237, 61, 37, 201, 7, 1, 214, 60, 251, 17, 37, 201, 7, - 1, 196, 57, 251, 17, 37, 201, 7, 1, 214, 60, 226, 2, 37, 201, 7, 1, 196, - 57, 226, 2, 37, 201, 7, 1, 214, 60, 214, 73, 37, 201, 7, 1, 196, 57, 214, - 73, 37, 201, 7, 1, 214, 60, 251, 13, 37, 201, 7, 1, 196, 57, 251, 13, 37, - 201, 7, 1, 214, 60, 251, 231, 37, 201, 7, 1, 214, 60, 250, 201, 37, 201, - 7, 1, 214, 60, 251, 229, 37, 201, 7, 1, 214, 60, 250, 194, 37, 201, 7, 1, - 196, 57, 250, 194, 37, 201, 7, 1, 214, 60, 236, 140, 37, 201, 7, 1, 196, - 57, 236, 140, 37, 201, 7, 1, 214, 60, 250, 167, 37, 201, 7, 1, 196, 57, - 250, 167, 37, 201, 7, 1, 214, 60, 251, 226, 37, 201, 7, 1, 196, 57, 251, - 226, 37, 201, 7, 1, 214, 60, 214, 48, 37, 201, 7, 1, 214, 60, 249, 62, - 37, 160, 6, 1, 63, 37, 160, 6, 1, 252, 167, 37, 160, 6, 1, 237, 63, 37, - 160, 6, 1, 251, 117, 37, 160, 6, 1, 237, 61, 37, 160, 6, 1, 236, 226, 37, - 160, 6, 1, 237, 58, 37, 160, 6, 1, 237, 57, 37, 160, 6, 1, 251, 99, 37, - 160, 6, 1, 69, 37, 160, 6, 1, 244, 203, 69, 37, 160, 6, 1, 237, 53, 37, - 160, 6, 1, 237, 46, 37, 160, 6, 1, 237, 45, 37, 160, 6, 1, 237, 42, 37, - 160, 6, 1, 237, 39, 37, 160, 6, 1, 68, 37, 160, 6, 1, 226, 119, 37, 160, - 6, 1, 237, 16, 37, 160, 6, 1, 237, 13, 37, 160, 6, 1, 251, 180, 37, 160, - 6, 1, 200, 45, 37, 160, 6, 1, 237, 6, 37, 160, 6, 1, 236, 243, 37, 160, - 6, 1, 236, 240, 37, 160, 6, 1, 236, 229, 37, 160, 6, 1, 236, 192, 37, - 160, 6, 1, 72, 37, 160, 6, 1, 214, 101, 37, 160, 6, 1, 216, 185, 214, - 163, 37, 160, 6, 1, 209, 130, 214, 163, 37, 160, 6, 1, 214, 162, 37, 160, - 6, 1, 236, 182, 37, 160, 6, 1, 236, 234, 37, 160, 6, 1, 236, 162, 37, - 160, 6, 1, 206, 182, 236, 162, 37, 160, 6, 1, 236, 150, 37, 160, 6, 1, - 236, 129, 37, 160, 6, 1, 236, 127, 37, 160, 6, 1, 236, 206, 37, 160, 6, - 1, 236, 116, 37, 160, 6, 1, 237, 59, 37, 160, 6, 1, 66, 37, 160, 6, 1, - 199, 245, 37, 160, 6, 1, 216, 185, 200, 99, 37, 160, 6, 1, 209, 130, 200, - 99, 37, 160, 6, 1, 236, 103, 37, 160, 6, 1, 236, 55, 37, 160, 6, 1, 236, - 50, 37, 160, 6, 1, 236, 205, 55, 37, 160, 6, 1, 200, 4, 37, 160, 4, 1, - 63, 37, 160, 4, 1, 252, 167, 37, 160, 4, 1, 237, 63, 37, 160, 4, 1, 251, - 117, 37, 160, 4, 1, 237, 61, 37, 160, 4, 1, 236, 226, 37, 160, 4, 1, 237, - 58, 37, 160, 4, 1, 237, 57, 37, 160, 4, 1, 251, 99, 37, 160, 4, 1, 69, - 37, 160, 4, 1, 244, 203, 69, 37, 160, 4, 1, 237, 53, 37, 160, 4, 1, 237, - 46, 37, 160, 4, 1, 237, 45, 37, 160, 4, 1, 237, 42, 37, 160, 4, 1, 237, - 39, 37, 160, 4, 1, 68, 37, 160, 4, 1, 226, 119, 37, 160, 4, 1, 237, 16, - 37, 160, 4, 1, 237, 13, 37, 160, 4, 1, 251, 180, 37, 160, 4, 1, 200, 45, - 37, 160, 4, 1, 237, 6, 37, 160, 4, 1, 236, 243, 37, 160, 4, 1, 236, 240, - 37, 160, 4, 1, 236, 229, 37, 160, 4, 1, 236, 192, 37, 160, 4, 1, 72, 37, - 160, 4, 1, 214, 101, 37, 160, 4, 1, 216, 185, 214, 163, 37, 160, 4, 1, - 209, 130, 214, 163, 37, 160, 4, 1, 214, 162, 37, 160, 4, 1, 236, 182, 37, - 160, 4, 1, 236, 234, 37, 160, 4, 1, 236, 162, 37, 160, 4, 1, 206, 182, - 236, 162, 37, 160, 4, 1, 236, 150, 37, 160, 4, 1, 236, 129, 37, 160, 4, - 1, 236, 127, 37, 160, 4, 1, 236, 206, 37, 160, 4, 1, 236, 116, 37, 160, - 4, 1, 237, 59, 37, 160, 4, 1, 66, 37, 160, 4, 1, 199, 245, 37, 160, 4, 1, - 216, 185, 200, 99, 37, 160, 4, 1, 209, 130, 200, 99, 37, 160, 4, 1, 236, - 103, 37, 160, 4, 1, 236, 55, 37, 160, 4, 1, 236, 50, 37, 160, 4, 1, 236, - 205, 55, 37, 160, 4, 1, 200, 4, 37, 160, 31, 100, 37, 160, 31, 146, 37, - 160, 31, 203, 23, 37, 160, 31, 235, 144, 37, 160, 31, 97, 231, 56, 37, - 160, 31, 97, 170, 232, 179, 209, 214, 1, 63, 232, 179, 209, 214, 1, 249, - 144, 232, 179, 209, 214, 1, 161, 232, 179, 209, 214, 1, 189, 232, 179, - 209, 214, 1, 201, 78, 232, 179, 209, 214, 1, 225, 213, 232, 179, 209, - 214, 1, 247, 173, 232, 179, 209, 214, 1, 142, 232, 179, 209, 214, 1, 224, - 145, 232, 179, 209, 214, 1, 235, 238, 232, 179, 209, 214, 1, 240, 135, - 232, 179, 209, 214, 1, 240, 40, 232, 179, 209, 214, 1, 169, 232, 179, - 209, 214, 1, 209, 181, 232, 179, 209, 214, 1, 195, 115, 232, 179, 209, - 214, 1, 183, 232, 179, 209, 214, 1, 207, 50, 232, 179, 209, 214, 1, 155, - 232, 179, 209, 214, 1, 234, 122, 232, 179, 209, 214, 1, 172, 232, 179, - 209, 214, 1, 166, 232, 179, 209, 214, 1, 176, 232, 179, 209, 214, 1, 197, - 166, 232, 179, 209, 214, 1, 224, 71, 197, 166, 232, 179, 209, 214, 1, - 164, 232, 179, 209, 214, 1, 224, 71, 164, 232, 179, 209, 214, 1, 217, 70, - 232, 179, 209, 214, 1, 215, 108, 232, 179, 209, 214, 1, 199, 152, 232, - 179, 209, 214, 18, 63, 232, 179, 209, 214, 18, 68, 232, 179, 209, 214, - 18, 66, 232, 179, 209, 214, 18, 69, 232, 179, 209, 214, 18, 72, 232, 179, - 209, 214, 117, 208, 245, 232, 179, 209, 214, 117, 218, 0, 224, 112, 232, - 179, 209, 214, 2, 232, 173, 232, 179, 209, 214, 2, 203, 138, 232, 179, - 209, 214, 2, 203, 113, 232, 179, 209, 214, 2, 203, 95, 232, 179, 209, - 214, 17, 195, 79, 232, 179, 209, 214, 17, 100, 232, 179, 209, 214, 17, - 102, 232, 179, 209, 214, 17, 134, 232, 179, 209, 214, 17, 136, 232, 179, - 209, 214, 17, 146, 232, 179, 209, 214, 17, 167, 232, 179, 209, 214, 17, - 178, 232, 179, 209, 214, 17, 171, 232, 179, 209, 214, 17, 182, 209, 118, + 239, 59, 37, 213, 30, 2, 63, 37, 213, 30, 2, 68, 37, 213, 30, 2, 66, 37, + 213, 30, 2, 155, 37, 213, 30, 2, 223, 187, 37, 213, 30, 2, 234, 123, 37, + 213, 30, 2, 233, 76, 37, 213, 30, 2, 196, 208, 37, 213, 30, 2, 247, 174, + 37, 213, 30, 2, 225, 214, 37, 213, 30, 2, 225, 172, 37, 213, 30, 2, 189, + 37, 213, 30, 2, 201, 40, 37, 213, 30, 2, 240, 136, 37, 213, 30, 2, 239, + 152, 37, 213, 30, 2, 237, 201, 37, 213, 30, 2, 202, 233, 37, 213, 30, 2, + 161, 37, 213, 30, 2, 249, 145, 37, 213, 30, 2, 235, 239, 37, 213, 30, 2, + 176, 37, 213, 30, 2, 215, 186, 37, 213, 30, 2, 166, 37, 213, 30, 2, 219, + 78, 37, 213, 30, 2, 218, 145, 37, 213, 30, 2, 164, 37, 213, 30, 2, 199, + 152, 37, 213, 30, 2, 199, 34, 37, 213, 30, 2, 169, 37, 213, 30, 2, 209, + 140, 37, 213, 30, 2, 172, 37, 213, 30, 2, 183, 37, 213, 30, 2, 195, 115, + 37, 213, 30, 2, 207, 50, 37, 213, 30, 2, 205, 80, 37, 213, 30, 2, 142, + 37, 213, 30, 2, 250, 144, 37, 213, 30, 2, 250, 143, 37, 213, 30, 2, 250, + 142, 37, 213, 30, 2, 196, 178, 37, 213, 30, 2, 240, 113, 37, 213, 30, 2, + 240, 112, 37, 213, 30, 2, 249, 120, 37, 213, 30, 2, 247, 226, 37, 213, + 30, 197, 9, 239, 59, 37, 213, 30, 31, 100, 37, 213, 30, 31, 102, 37, 213, + 30, 31, 203, 23, 37, 213, 30, 31, 200, 234, 37, 213, 30, 31, 231, 57, + 239, 192, 6, 1, 181, 68, 239, 192, 6, 1, 181, 69, 239, 192, 6, 1, 181, + 63, 239, 192, 6, 1, 181, 251, 209, 239, 192, 6, 1, 181, 72, 239, 192, 6, + 1, 181, 214, 102, 239, 192, 6, 1, 206, 182, 68, 239, 192, 6, 1, 206, 182, + 69, 239, 192, 6, 1, 206, 182, 63, 239, 192, 6, 1, 206, 182, 251, 209, + 239, 192, 6, 1, 206, 182, 72, 239, 192, 6, 1, 206, 182, 214, 102, 239, + 192, 6, 1, 250, 122, 239, 192, 6, 1, 214, 16, 239, 192, 6, 1, 196, 243, + 239, 192, 6, 1, 196, 66, 239, 192, 6, 1, 233, 15, 239, 192, 6, 1, 213, + 79, 239, 192, 6, 1, 248, 251, 239, 192, 6, 1, 203, 48, 239, 192, 6, 1, + 239, 237, 239, 192, 6, 1, 245, 99, 239, 192, 6, 1, 225, 191, 239, 192, 6, + 1, 224, 216, 239, 192, 6, 1, 234, 69, 239, 192, 6, 1, 237, 47, 239, 192, + 6, 1, 199, 113, 239, 192, 6, 1, 236, 121, 239, 192, 6, 1, 202, 215, 239, + 192, 6, 1, 236, 151, 239, 192, 6, 1, 195, 85, 239, 192, 6, 1, 236, 141, + 239, 192, 6, 1, 195, 64, 239, 192, 6, 1, 236, 163, 239, 192, 6, 1, 237, + 7, 239, 192, 6, 1, 236, 241, 239, 192, 6, 1, 236, 230, 239, 192, 6, 1, + 236, 215, 239, 192, 6, 1, 214, 146, 239, 192, 6, 1, 236, 98, 239, 192, 4, + 1, 181, 68, 239, 192, 4, 1, 181, 69, 239, 192, 4, 1, 181, 63, 239, 192, + 4, 1, 181, 251, 209, 239, 192, 4, 1, 181, 72, 239, 192, 4, 1, 181, 214, + 102, 239, 192, 4, 1, 206, 182, 68, 239, 192, 4, 1, 206, 182, 69, 239, + 192, 4, 1, 206, 182, 63, 239, 192, 4, 1, 206, 182, 251, 209, 239, 192, 4, + 1, 206, 182, 72, 239, 192, 4, 1, 206, 182, 214, 102, 239, 192, 4, 1, 250, + 122, 239, 192, 4, 1, 214, 16, 239, 192, 4, 1, 196, 243, 239, 192, 4, 1, + 196, 66, 239, 192, 4, 1, 233, 15, 239, 192, 4, 1, 213, 79, 239, 192, 4, + 1, 248, 251, 239, 192, 4, 1, 203, 48, 239, 192, 4, 1, 239, 237, 239, 192, + 4, 1, 245, 99, 239, 192, 4, 1, 225, 191, 239, 192, 4, 1, 224, 216, 239, + 192, 4, 1, 234, 69, 239, 192, 4, 1, 237, 47, 239, 192, 4, 1, 199, 113, + 239, 192, 4, 1, 236, 121, 239, 192, 4, 1, 202, 215, 239, 192, 4, 1, 236, + 151, 239, 192, 4, 1, 195, 85, 239, 192, 4, 1, 236, 141, 239, 192, 4, 1, + 195, 64, 239, 192, 4, 1, 236, 163, 239, 192, 4, 1, 237, 7, 239, 192, 4, + 1, 236, 241, 239, 192, 4, 1, 236, 230, 239, 192, 4, 1, 236, 215, 239, + 192, 4, 1, 214, 146, 239, 192, 4, 1, 236, 98, 207, 6, 1, 213, 76, 207, 6, + 1, 201, 229, 207, 6, 1, 224, 89, 207, 6, 1, 235, 182, 207, 6, 1, 202, + 190, 207, 6, 1, 205, 200, 207, 6, 1, 204, 85, 207, 6, 1, 245, 22, 207, 6, + 1, 196, 68, 207, 6, 1, 231, 54, 207, 6, 1, 248, 183, 207, 6, 1, 239, 251, + 207, 6, 1, 234, 109, 207, 6, 1, 198, 227, 207, 6, 1, 202, 196, 207, 6, 1, + 195, 8, 207, 6, 1, 219, 202, 207, 6, 1, 225, 108, 207, 6, 1, 197, 25, + 207, 6, 1, 232, 248, 207, 6, 1, 221, 245, 207, 6, 1, 219, 24, 207, 6, 1, + 226, 127, 207, 6, 1, 237, 45, 207, 6, 1, 250, 195, 207, 6, 1, 251, 250, + 207, 6, 1, 214, 119, 207, 6, 1, 197, 12, 207, 6, 1, 214, 34, 207, 6, 1, + 251, 209, 207, 6, 1, 209, 223, 207, 6, 1, 215, 138, 207, 6, 1, 237, 65, + 207, 6, 1, 251, 214, 207, 6, 1, 230, 201, 207, 6, 1, 200, 36, 207, 6, 1, + 214, 188, 207, 6, 1, 214, 94, 207, 6, 1, 214, 144, 207, 6, 1, 250, 125, + 207, 6, 1, 250, 246, 207, 6, 1, 214, 72, 207, 6, 1, 251, 189, 207, 6, 1, + 236, 155, 207, 6, 1, 250, 222, 207, 6, 1, 237, 76, 207, 6, 1, 230, 209, + 207, 6, 1, 196, 30, 214, 50, 1, 251, 164, 214, 50, 1, 249, 145, 214, 50, + 1, 189, 214, 50, 1, 225, 214, 214, 50, 1, 196, 208, 214, 50, 1, 224, 146, + 214, 50, 1, 239, 236, 214, 50, 1, 169, 214, 50, 1, 183, 214, 50, 1, 206, + 217, 214, 50, 1, 239, 176, 214, 50, 1, 247, 82, 214, 50, 1, 234, 123, + 214, 50, 1, 235, 239, 214, 50, 1, 211, 157, 214, 50, 1, 225, 51, 214, 50, + 1, 223, 78, 214, 50, 1, 219, 38, 214, 50, 1, 215, 122, 214, 50, 1, 197, + 117, 214, 50, 1, 142, 214, 50, 1, 164, 214, 50, 1, 63, 214, 50, 1, 69, + 214, 50, 1, 68, 214, 50, 1, 72, 214, 50, 1, 66, 214, 50, 1, 252, 168, + 214, 50, 1, 237, 54, 214, 50, 1, 214, 102, 214, 50, 17, 195, 79, 214, 50, + 17, 100, 214, 50, 17, 102, 214, 50, 17, 134, 214, 50, 17, 136, 214, 50, + 17, 146, 214, 50, 17, 167, 214, 50, 17, 178, 214, 50, 17, 171, 214, 50, + 17, 182, 214, 52, 6, 1, 63, 214, 52, 6, 1, 251, 200, 214, 52, 6, 1, 251, + 194, 214, 52, 6, 1, 251, 209, 214, 52, 6, 1, 248, 64, 214, 52, 6, 1, 247, + 16, 214, 52, 6, 1, 237, 39, 214, 52, 6, 1, 69, 214, 52, 6, 1, 237, 19, + 214, 52, 6, 1, 142, 214, 52, 6, 1, 231, 11, 214, 52, 6, 1, 68, 214, 52, + 6, 1, 155, 214, 52, 6, 1, 237, 38, 214, 52, 6, 1, 223, 110, 214, 52, 6, + 1, 172, 214, 52, 6, 1, 166, 214, 52, 6, 1, 176, 214, 52, 6, 1, 72, 214, + 52, 6, 1, 214, 143, 214, 52, 6, 1, 161, 214, 52, 6, 1, 237, 37, 214, 52, + 6, 1, 183, 214, 52, 6, 1, 207, 50, 214, 52, 6, 1, 189, 214, 52, 6, 1, + 237, 36, 214, 52, 6, 1, 201, 113, 214, 52, 6, 1, 237, 35, 214, 52, 6, 1, + 201, 103, 214, 52, 6, 1, 239, 176, 214, 52, 6, 1, 66, 214, 52, 6, 1, 197, + 166, 214, 52, 6, 1, 224, 146, 214, 52, 6, 1, 233, 230, 214, 52, 6, 1, + 195, 115, 214, 52, 6, 1, 195, 74, 214, 52, 4, 1, 63, 214, 52, 4, 1, 251, + 200, 214, 52, 4, 1, 251, 194, 214, 52, 4, 1, 251, 209, 214, 52, 4, 1, + 248, 64, 214, 52, 4, 1, 247, 16, 214, 52, 4, 1, 237, 39, 214, 52, 4, 1, + 69, 214, 52, 4, 1, 237, 19, 214, 52, 4, 1, 142, 214, 52, 4, 1, 231, 11, + 214, 52, 4, 1, 68, 214, 52, 4, 1, 155, 214, 52, 4, 1, 237, 38, 214, 52, + 4, 1, 223, 110, 214, 52, 4, 1, 172, 214, 52, 4, 1, 166, 214, 52, 4, 1, + 176, 214, 52, 4, 1, 72, 214, 52, 4, 1, 214, 143, 214, 52, 4, 1, 161, 214, + 52, 4, 1, 237, 37, 214, 52, 4, 1, 183, 214, 52, 4, 1, 207, 50, 214, 52, + 4, 1, 189, 214, 52, 4, 1, 237, 36, 214, 52, 4, 1, 201, 113, 214, 52, 4, + 1, 237, 35, 214, 52, 4, 1, 201, 103, 214, 52, 4, 1, 239, 176, 214, 52, 4, + 1, 66, 214, 52, 4, 1, 197, 166, 214, 52, 4, 1, 224, 146, 214, 52, 4, 1, + 233, 230, 214, 52, 4, 1, 195, 115, 214, 52, 4, 1, 195, 74, 237, 3, 1, 63, + 237, 3, 1, 249, 9, 237, 3, 1, 247, 57, 237, 3, 1, 245, 103, 237, 3, 1, + 239, 252, 237, 3, 1, 217, 151, 237, 3, 1, 239, 167, 237, 3, 1, 237, 33, + 237, 3, 1, 69, 237, 3, 1, 235, 189, 237, 3, 1, 234, 48, 237, 3, 1, 233, + 161, 237, 3, 1, 232, 147, 237, 3, 1, 68, 237, 3, 1, 225, 193, 237, 3, 1, + 224, 209, 237, 3, 1, 222, 197, 237, 3, 1, 222, 32, 237, 3, 1, 219, 207, + 237, 3, 1, 217, 118, 237, 3, 1, 176, 237, 3, 1, 216, 157, 237, 3, 1, 72, + 237, 3, 1, 213, 92, 237, 3, 1, 211, 139, 237, 3, 1, 210, 183, 237, 3, 1, + 209, 176, 237, 3, 1, 208, 147, 237, 3, 1, 206, 255, 237, 3, 1, 203, 68, + 237, 3, 1, 202, 217, 237, 3, 1, 66, 237, 3, 1, 199, 118, 237, 3, 1, 196, + 202, 237, 3, 1, 196, 148, 237, 3, 1, 195, 88, 237, 3, 1, 195, 65, 237, 3, + 1, 233, 216, 237, 3, 1, 233, 222, 237, 3, 1, 224, 131, 247, 89, 251, 165, + 1, 251, 133, 247, 89, 251, 165, 1, 248, 208, 247, 89, 251, 165, 1, 233, + 179, 247, 89, 251, 165, 1, 240, 61, 247, 89, 251, 165, 1, 237, 64, 247, + 89, 251, 165, 1, 195, 99, 247, 89, 251, 165, 1, 236, 58, 247, 89, 251, + 165, 1, 195, 59, 247, 89, 251, 165, 1, 203, 96, 247, 89, 251, 165, 1, + 247, 16, 247, 89, 251, 165, 1, 195, 228, 247, 89, 251, 165, 1, 195, 74, + 247, 89, 251, 165, 1, 226, 0, 247, 89, 251, 165, 1, 207, 50, 247, 89, + 251, 165, 1, 222, 238, 247, 89, 251, 165, 1, 226, 13, 247, 89, 251, 165, + 1, 196, 198, 247, 89, 251, 165, 1, 237, 164, 247, 89, 251, 165, 1, 247, + 116, 247, 89, 251, 165, 1, 225, 173, 247, 89, 251, 165, 1, 224, 251, 247, + 89, 251, 165, 1, 221, 145, 247, 89, 251, 165, 1, 232, 82, 247, 89, 251, + 165, 1, 211, 140, 247, 89, 251, 165, 1, 251, 48, 247, 89, 251, 165, 1, + 245, 39, 247, 89, 251, 165, 1, 245, 75, 247, 89, 251, 165, 1, 240, 243, + 247, 89, 251, 165, 1, 220, 40, 247, 89, 251, 165, 1, 211, 144, 247, 89, + 251, 165, 1, 216, 3, 247, 89, 251, 165, 1, 237, 141, 247, 89, 251, 165, + 1, 207, 33, 247, 89, 251, 165, 1, 225, 194, 247, 89, 251, 165, 1, 214, + 119, 247, 89, 251, 165, 1, 200, 205, 247, 89, 251, 165, 1, 235, 212, 247, + 89, 251, 165, 1, 237, 154, 247, 89, 251, 165, 1, 245, 109, 247, 89, 251, + 165, 1, 213, 65, 247, 89, 251, 165, 1, 233, 206, 247, 89, 251, 165, 1, + 210, 198, 247, 89, 251, 165, 1, 207, 59, 247, 89, 251, 165, 1, 199, 37, + 247, 89, 251, 165, 1, 202, 50, 247, 89, 251, 165, 1, 206, 160, 247, 89, + 251, 165, 1, 225, 227, 247, 89, 251, 165, 1, 240, 244, 247, 89, 251, 165, + 1, 247, 82, 247, 89, 251, 165, 1, 196, 73, 247, 89, 251, 165, 1, 212, + 154, 247, 89, 251, 165, 1, 224, 52, 247, 89, 251, 165, 244, 237, 78, 30, + 39, 2, 252, 116, 30, 39, 2, 252, 115, 30, 39, 2, 252, 114, 30, 39, 2, + 252, 113, 30, 39, 2, 252, 112, 30, 39, 2, 252, 111, 30, 39, 2, 252, 110, + 30, 39, 2, 252, 109, 30, 39, 2, 252, 108, 30, 39, 2, 252, 107, 30, 39, 2, + 252, 106, 30, 39, 2, 252, 105, 30, 39, 2, 252, 104, 30, 39, 2, 252, 103, + 30, 39, 2, 252, 102, 30, 39, 2, 252, 101, 30, 39, 2, 252, 100, 30, 39, 2, + 252, 99, 30, 39, 2, 252, 98, 30, 39, 2, 252, 97, 30, 39, 2, 252, 96, 30, + 39, 2, 252, 95, 30, 39, 2, 252, 94, 30, 39, 2, 252, 93, 30, 39, 2, 252, + 92, 30, 39, 2, 252, 91, 30, 39, 2, 252, 90, 30, 39, 2, 255, 126, 30, 39, + 2, 252, 89, 30, 39, 2, 252, 88, 30, 39, 2, 252, 87, 30, 39, 2, 252, 86, + 30, 39, 2, 252, 85, 30, 39, 2, 252, 84, 30, 39, 2, 252, 83, 30, 39, 2, + 252, 82, 30, 39, 2, 252, 81, 30, 39, 2, 252, 80, 30, 39, 2, 252, 79, 30, + 39, 2, 252, 78, 30, 39, 2, 252, 77, 30, 39, 2, 252, 76, 30, 39, 2, 252, + 75, 30, 39, 2, 252, 74, 30, 39, 2, 252, 73, 30, 39, 2, 252, 72, 30, 39, + 2, 252, 71, 30, 39, 2, 252, 70, 30, 39, 2, 252, 69, 30, 39, 2, 252, 68, + 30, 39, 2, 252, 67, 30, 39, 2, 252, 66, 30, 39, 2, 252, 65, 30, 39, 2, + 252, 64, 30, 39, 2, 252, 63, 30, 39, 2, 252, 62, 30, 39, 2, 252, 61, 30, + 39, 2, 252, 60, 30, 39, 2, 252, 59, 30, 39, 2, 252, 58, 30, 39, 2, 252, + 57, 30, 39, 2, 252, 56, 30, 39, 2, 252, 55, 30, 39, 2, 252, 54, 30, 39, + 2, 252, 53, 30, 39, 2, 252, 52, 30, 39, 2, 252, 51, 30, 39, 2, 252, 50, + 30, 39, 2, 252, 49, 30, 39, 2, 252, 48, 30, 39, 2, 252, 47, 30, 39, 2, + 255, 39, 30, 39, 2, 252, 46, 30, 39, 2, 252, 45, 30, 39, 2, 255, 4, 30, + 39, 2, 252, 44, 30, 39, 2, 252, 43, 30, 39, 2, 252, 42, 30, 39, 2, 252, + 41, 30, 39, 2, 254, 247, 30, 39, 2, 252, 40, 30, 39, 2, 252, 39, 30, 39, + 2, 252, 38, 30, 39, 2, 252, 37, 30, 39, 2, 252, 36, 30, 39, 2, 254, 63, + 30, 39, 2, 254, 62, 30, 39, 2, 254, 61, 30, 39, 2, 254, 60, 30, 39, 2, + 254, 59, 30, 39, 2, 254, 58, 30, 39, 2, 254, 57, 30, 39, 2, 254, 56, 30, + 39, 2, 254, 54, 30, 39, 2, 254, 53, 30, 39, 2, 254, 52, 30, 39, 2, 254, + 51, 30, 39, 2, 254, 50, 30, 39, 2, 254, 49, 30, 39, 2, 254, 47, 30, 39, + 2, 254, 46, 30, 39, 2, 254, 45, 30, 39, 2, 254, 44, 30, 39, 2, 254, 43, + 30, 39, 2, 254, 42, 30, 39, 2, 254, 41, 30, 39, 2, 254, 40, 30, 39, 2, + 254, 39, 30, 39, 2, 254, 38, 30, 39, 2, 254, 37, 30, 39, 2, 254, 36, 30, + 39, 2, 254, 35, 30, 39, 2, 254, 34, 30, 39, 2, 254, 33, 30, 39, 2, 254, + 32, 30, 39, 2, 254, 31, 30, 39, 2, 254, 30, 30, 39, 2, 254, 29, 30, 39, + 2, 254, 27, 30, 39, 2, 254, 26, 30, 39, 2, 254, 25, 30, 39, 2, 254, 21, + 30, 39, 2, 254, 20, 30, 39, 2, 254, 19, 30, 39, 2, 254, 18, 30, 39, 2, + 254, 14, 30, 39, 2, 254, 13, 30, 39, 2, 254, 12, 30, 39, 2, 254, 11, 30, + 39, 2, 254, 10, 30, 39, 2, 254, 9, 30, 39, 2, 254, 8, 30, 39, 2, 254, 7, + 30, 39, 2, 254, 6, 30, 39, 2, 254, 5, 30, 39, 2, 254, 4, 30, 39, 2, 254, + 3, 30, 39, 2, 254, 2, 30, 39, 2, 254, 1, 30, 39, 2, 254, 0, 30, 39, 2, + 253, 255, 30, 39, 2, 253, 254, 30, 39, 2, 253, 253, 30, 39, 2, 253, 252, + 30, 39, 2, 253, 251, 30, 39, 2, 253, 250, 30, 39, 2, 253, 249, 30, 39, 2, + 253, 248, 30, 39, 2, 253, 246, 30, 39, 2, 253, 245, 30, 39, 2, 253, 244, + 30, 39, 2, 253, 243, 30, 39, 2, 253, 242, 30, 39, 2, 253, 240, 30, 39, 2, + 253, 239, 30, 39, 2, 253, 238, 30, 39, 2, 253, 237, 30, 39, 2, 253, 235, + 30, 39, 2, 253, 234, 30, 39, 2, 253, 233, 30, 39, 2, 253, 199, 30, 39, 2, + 253, 197, 30, 39, 2, 253, 195, 30, 39, 2, 253, 193, 30, 39, 2, 253, 191, + 30, 39, 2, 253, 189, 30, 39, 2, 253, 187, 30, 39, 2, 253, 185, 30, 39, 2, + 253, 183, 30, 39, 2, 253, 181, 30, 39, 2, 253, 179, 30, 39, 2, 253, 176, + 30, 39, 2, 253, 174, 30, 39, 2, 253, 172, 30, 39, 2, 253, 170, 30, 39, 2, + 253, 168, 30, 39, 2, 253, 166, 30, 39, 2, 253, 164, 30, 39, 2, 253, 162, + 30, 39, 2, 253, 80, 30, 39, 2, 253, 79, 30, 39, 2, 253, 78, 30, 39, 2, + 253, 77, 30, 39, 2, 253, 76, 30, 39, 2, 253, 75, 30, 39, 2, 253, 73, 30, + 39, 2, 253, 72, 30, 39, 2, 253, 71, 30, 39, 2, 253, 70, 30, 39, 2, 253, + 69, 30, 39, 2, 253, 68, 30, 39, 2, 253, 66, 30, 39, 2, 253, 65, 30, 39, + 2, 253, 61, 30, 39, 2, 253, 60, 30, 39, 2, 253, 58, 30, 39, 2, 253, 57, + 30, 39, 2, 253, 56, 30, 39, 2, 253, 55, 30, 39, 2, 253, 54, 30, 39, 2, + 253, 53, 30, 39, 2, 253, 52, 30, 39, 2, 253, 51, 30, 39, 2, 253, 50, 30, + 39, 2, 253, 49, 30, 39, 2, 253, 48, 30, 39, 2, 253, 47, 30, 39, 2, 253, + 46, 30, 39, 2, 253, 45, 30, 39, 2, 253, 44, 30, 39, 2, 253, 43, 30, 39, + 2, 253, 42, 30, 39, 2, 253, 41, 30, 39, 2, 253, 40, 30, 39, 2, 253, 39, + 30, 39, 2, 253, 38, 30, 39, 2, 253, 37, 30, 39, 2, 253, 36, 30, 39, 2, + 253, 35, 30, 39, 2, 253, 34, 30, 39, 2, 253, 33, 30, 39, 2, 253, 32, 30, + 39, 2, 253, 31, 30, 39, 2, 253, 30, 30, 39, 2, 253, 29, 30, 39, 2, 253, + 28, 30, 39, 2, 253, 27, 30, 39, 2, 253, 26, 30, 39, 2, 253, 25, 30, 39, + 2, 253, 24, 30, 39, 2, 253, 23, 30, 39, 2, 253, 22, 30, 39, 2, 253, 21, + 30, 39, 2, 253, 20, 30, 39, 2, 253, 19, 30, 39, 2, 253, 18, 30, 39, 2, + 253, 17, 30, 39, 2, 253, 16, 30, 39, 2, 253, 15, 30, 39, 2, 253, 14, 30, + 39, 2, 253, 13, 30, 39, 2, 253, 12, 30, 39, 2, 253, 11, 30, 39, 2, 253, + 10, 30, 39, 2, 253, 9, 30, 39, 2, 253, 8, 30, 39, 2, 253, 7, 30, 39, 2, + 253, 6, 30, 39, 2, 253, 5, 30, 39, 2, 253, 4, 30, 39, 2, 253, 3, 30, 39, + 2, 253, 2, 30, 39, 2, 253, 1, 30, 39, 2, 253, 0, 30, 39, 2, 252, 255, 30, + 39, 2, 252, 254, 30, 39, 2, 252, 253, 30, 39, 2, 252, 252, 30, 39, 2, + 252, 251, 30, 39, 2, 252, 250, 30, 39, 2, 252, 249, 30, 39, 2, 252, 248, + 30, 39, 2, 252, 247, 30, 39, 2, 252, 246, 30, 39, 2, 252, 245, 30, 39, 2, + 252, 244, 30, 39, 2, 252, 243, 30, 39, 2, 252, 242, 30, 39, 2, 252, 241, + 30, 39, 2, 252, 240, 30, 39, 2, 252, 239, 30, 39, 2, 252, 238, 30, 39, 2, + 252, 237, 30, 39, 2, 252, 236, 30, 39, 2, 252, 235, 30, 39, 2, 252, 234, + 30, 39, 2, 252, 233, 30, 39, 2, 252, 232, 30, 39, 2, 252, 231, 30, 39, 2, + 252, 230, 30, 39, 2, 252, 229, 30, 39, 2, 252, 228, 30, 39, 2, 252, 227, + 30, 39, 2, 252, 226, 30, 39, 2, 252, 225, 30, 39, 2, 252, 224, 30, 39, 2, + 252, 223, 30, 39, 2, 252, 222, 30, 39, 2, 252, 221, 30, 39, 2, 252, 220, + 30, 39, 2, 252, 219, 30, 39, 2, 252, 218, 30, 39, 2, 252, 217, 30, 39, 2, + 252, 216, 30, 39, 2, 252, 215, 30, 39, 2, 252, 214, 30, 39, 2, 252, 213, + 30, 39, 2, 252, 212, 30, 39, 2, 252, 211, 30, 39, 2, 252, 210, 30, 39, 2, + 252, 209, 30, 39, 2, 252, 208, 30, 39, 2, 252, 207, 30, 39, 2, 252, 206, + 30, 39, 2, 252, 205, 30, 39, 2, 252, 204, 30, 39, 2, 252, 203, 30, 39, 2, + 252, 202, 30, 39, 2, 252, 201, 30, 39, 2, 252, 200, 30, 39, 2, 252, 199, + 30, 39, 2, 252, 198, 63, 30, 39, 2, 252, 197, 250, 112, 30, 39, 2, 252, + 196, 240, 231, 30, 39, 2, 252, 195, 69, 30, 39, 2, 252, 194, 236, 49, 30, + 39, 2, 252, 193, 233, 15, 30, 39, 2, 252, 192, 225, 217, 30, 39, 2, 252, + 191, 225, 80, 30, 39, 2, 252, 190, 159, 30, 39, 2, 252, 189, 223, 87, 30, + 39, 2, 252, 188, 223, 86, 30, 39, 2, 252, 187, 223, 85, 30, 39, 2, 252, + 186, 223, 84, 30, 39, 2, 252, 185, 197, 199, 30, 39, 2, 252, 184, 196, + 222, 30, 39, 2, 252, 183, 196, 148, 30, 39, 2, 252, 182, 214, 124, 30, + 39, 2, 252, 181, 252, 31, 30, 39, 2, 252, 180, 249, 46, 30, 39, 2, 252, + 179, 240, 43, 30, 39, 2, 252, 178, 236, 57, 30, 39, 2, 252, 177, 225, + 193, 30, 39, 2, 252, 176, 30, 39, 2, 252, 175, 30, 39, 2, 252, 174, 30, + 39, 2, 252, 173, 30, 39, 2, 252, 172, 30, 39, 2, 252, 171, 30, 39, 2, + 252, 170, 30, 39, 2, 252, 169, 240, 238, 5, 63, 240, 238, 5, 69, 240, + 238, 5, 68, 240, 238, 5, 72, 240, 238, 5, 66, 240, 238, 5, 225, 214, 240, + 238, 5, 225, 129, 240, 238, 5, 155, 240, 238, 5, 224, 209, 240, 238, 5, + 224, 101, 240, 238, 5, 224, 11, 240, 238, 5, 223, 187, 240, 238, 5, 172, + 240, 238, 5, 222, 197, 240, 238, 5, 222, 109, 240, 238, 5, 222, 7, 240, + 238, 5, 221, 191, 240, 238, 5, 166, 240, 238, 5, 219, 207, 240, 238, 5, + 219, 78, 240, 238, 5, 218, 251, 240, 238, 5, 218, 145, 240, 238, 5, 176, + 240, 238, 5, 217, 118, 240, 238, 5, 216, 223, 240, 238, 5, 216, 50, 240, + 238, 5, 215, 186, 240, 238, 5, 161, 240, 238, 5, 213, 92, 240, 238, 5, + 212, 220, 240, 238, 5, 212, 117, 240, 238, 5, 211, 227, 240, 238, 5, 169, + 240, 238, 5, 210, 183, 240, 238, 5, 210, 72, 240, 238, 5, 209, 232, 240, + 238, 5, 209, 140, 240, 238, 5, 183, 240, 238, 5, 208, 147, 240, 238, 5, + 206, 112, 240, 238, 5, 205, 200, 240, 238, 5, 204, 172, 240, 238, 5, 189, + 240, 238, 5, 203, 68, 240, 238, 5, 202, 122, 240, 238, 5, 149, 240, 238, + 5, 201, 40, 240, 238, 5, 197, 166, 240, 238, 5, 197, 109, 240, 238, 5, + 197, 70, 240, 238, 5, 197, 34, 240, 238, 5, 196, 208, 240, 238, 5, 196, + 202, 240, 238, 5, 195, 115, 240, 238, 5, 195, 11, 226, 88, 250, 255, 1, + 251, 162, 226, 88, 250, 255, 1, 248, 205, 226, 88, 250, 255, 1, 233, 177, + 226, 88, 250, 255, 1, 240, 100, 226, 88, 250, 255, 1, 232, 147, 226, 88, + 250, 255, 1, 197, 117, 226, 88, 250, 255, 1, 195, 92, 226, 88, 250, 255, + 1, 232, 87, 226, 88, 250, 255, 1, 202, 253, 226, 88, 250, 255, 1, 195, + 240, 226, 88, 250, 255, 1, 225, 5, 226, 88, 250, 255, 1, 222, 240, 226, + 88, 250, 255, 1, 219, 171, 226, 88, 250, 255, 1, 215, 138, 226, 88, 250, + 255, 1, 208, 225, 226, 88, 250, 255, 1, 250, 117, 226, 88, 250, 255, 1, + 213, 92, 226, 88, 250, 255, 1, 209, 5, 226, 88, 250, 255, 1, 211, 101, + 226, 88, 250, 255, 1, 210, 109, 226, 88, 250, 255, 1, 206, 211, 226, 88, + 250, 255, 1, 203, 82, 226, 88, 250, 255, 208, 133, 55, 226, 88, 250, 255, + 31, 100, 226, 88, 250, 255, 31, 102, 226, 88, 250, 255, 31, 134, 226, 88, + 250, 255, 31, 203, 23, 226, 88, 250, 255, 31, 200, 234, 226, 88, 250, + 255, 31, 97, 231, 57, 226, 88, 250, 255, 31, 97, 170, 226, 88, 250, 255, + 31, 203, 24, 170, 213, 204, 1, 251, 162, 213, 204, 1, 248, 205, 213, 204, + 1, 233, 177, 213, 204, 1, 240, 100, 213, 204, 1, 232, 147, 213, 204, 1, + 197, 117, 213, 204, 1, 195, 92, 213, 204, 1, 232, 87, 213, 204, 1, 202, + 253, 213, 204, 1, 195, 240, 213, 204, 1, 225, 5, 213, 204, 1, 222, 240, + 213, 204, 1, 219, 171, 213, 204, 1, 48, 215, 138, 213, 204, 1, 215, 138, + 213, 204, 1, 208, 225, 213, 204, 1, 250, 117, 213, 204, 1, 213, 92, 213, + 204, 1, 209, 5, 213, 204, 1, 211, 101, 213, 204, 1, 210, 109, 213, 204, + 1, 206, 211, 213, 204, 1, 203, 82, 213, 204, 222, 179, 235, 77, 213, 204, + 210, 17, 235, 77, 213, 204, 31, 100, 213, 204, 31, 102, 213, 204, 31, + 134, 213, 204, 31, 136, 213, 204, 31, 146, 213, 204, 31, 203, 23, 213, + 204, 31, 200, 234, 217, 240, 1, 48, 251, 162, 217, 240, 1, 251, 162, 217, + 240, 1, 48, 248, 205, 217, 240, 1, 248, 205, 217, 240, 1, 233, 177, 217, + 240, 1, 240, 100, 217, 240, 1, 48, 232, 147, 217, 240, 1, 232, 147, 217, + 240, 1, 197, 117, 217, 240, 1, 195, 92, 217, 240, 1, 232, 87, 217, 240, + 1, 202, 253, 217, 240, 1, 48, 195, 240, 217, 240, 1, 195, 240, 217, 240, + 1, 48, 225, 5, 217, 240, 1, 225, 5, 217, 240, 1, 48, 222, 240, 217, 240, + 1, 222, 240, 217, 240, 1, 48, 219, 171, 217, 240, 1, 219, 171, 217, 240, + 1, 48, 215, 138, 217, 240, 1, 215, 138, 217, 240, 1, 208, 225, 217, 240, + 1, 250, 117, 217, 240, 1, 213, 92, 217, 240, 1, 209, 5, 217, 240, 1, 211, + 101, 217, 240, 1, 210, 109, 217, 240, 1, 48, 206, 211, 217, 240, 1, 206, + 211, 217, 240, 1, 203, 82, 217, 240, 31, 100, 217, 240, 31, 102, 217, + 240, 31, 134, 217, 240, 31, 136, 217, 240, 241, 47, 31, 136, 217, 240, + 31, 146, 217, 240, 31, 203, 23, 217, 240, 31, 200, 234, 217, 240, 31, 97, + 231, 57, 232, 160, 1, 251, 162, 232, 160, 1, 248, 205, 232, 160, 1, 233, + 177, 232, 160, 1, 240, 99, 232, 160, 1, 232, 147, 232, 160, 1, 197, 117, + 232, 160, 1, 195, 90, 232, 160, 1, 232, 87, 232, 160, 1, 202, 253, 232, + 160, 1, 195, 240, 232, 160, 1, 225, 5, 232, 160, 1, 222, 240, 232, 160, + 1, 219, 171, 232, 160, 1, 215, 138, 232, 160, 1, 208, 225, 232, 160, 1, + 250, 115, 232, 160, 1, 213, 92, 232, 160, 1, 209, 5, 232, 160, 1, 211, + 101, 232, 160, 1, 206, 211, 232, 160, 1, 203, 82, 232, 160, 31, 100, 232, + 160, 31, 146, 232, 160, 31, 203, 23, 232, 160, 31, 200, 234, 232, 160, + 31, 97, 231, 57, 212, 232, 1, 251, 159, 212, 232, 1, 248, 208, 212, 232, + 1, 234, 96, 212, 232, 1, 239, 214, 212, 232, 1, 232, 147, 212, 232, 1, + 197, 124, 212, 232, 1, 195, 108, 212, 232, 1, 232, 89, 212, 232, 1, 203, + 1, 212, 232, 1, 195, 241, 212, 232, 1, 225, 35, 212, 232, 1, 222, 246, + 212, 232, 1, 219, 171, 212, 232, 1, 215, 138, 212, 232, 1, 207, 99, 212, + 232, 1, 251, 194, 212, 232, 1, 213, 92, 212, 232, 1, 209, 7, 212, 232, 1, + 211, 106, 212, 232, 1, 209, 196, 212, 232, 1, 206, 211, 212, 232, 1, 203, + 89, 212, 232, 31, 100, 212, 232, 31, 203, 23, 212, 232, 31, 200, 234, + 212, 232, 31, 97, 231, 57, 212, 232, 31, 102, 212, 232, 31, 134, 212, + 232, 197, 9, 207, 90, 221, 148, 1, 63, 221, 148, 1, 250, 112, 221, 148, + 1, 234, 190, 221, 148, 1, 240, 231, 221, 148, 1, 69, 221, 148, 1, 199, + 230, 221, 148, 1, 68, 221, 148, 1, 196, 148, 221, 148, 1, 225, 80, 221, + 148, 1, 159, 221, 148, 1, 221, 136, 221, 148, 1, 218, 55, 221, 148, 1, + 72, 221, 148, 1, 144, 221, 148, 1, 205, 83, 221, 148, 1, 203, 216, 221, + 148, 1, 66, 221, 148, 1, 236, 49, 221, 148, 1, 211, 167, 221, 148, 1, + 209, 80, 221, 148, 1, 201, 81, 221, 148, 1, 251, 106, 221, 148, 1, 236, + 230, 221, 148, 1, 221, 151, 221, 148, 1, 216, 87, 221, 148, 1, 247, 207, + 221, 148, 201, 177, 78, 140, 232, 57, 1, 63, 140, 232, 57, 1, 69, 140, + 232, 57, 1, 68, 140, 232, 57, 1, 72, 140, 232, 57, 1, 164, 140, 232, 57, + 1, 197, 166, 140, 232, 57, 1, 249, 145, 140, 232, 57, 1, 249, 144, 140, + 232, 57, 1, 161, 140, 232, 57, 1, 166, 140, 232, 57, 1, 176, 140, 232, + 57, 1, 217, 255, 140, 232, 57, 1, 217, 118, 140, 232, 57, 1, 217, 116, + 140, 232, 57, 1, 169, 140, 232, 57, 1, 210, 250, 140, 232, 57, 1, 172, + 140, 232, 57, 1, 224, 146, 140, 232, 57, 1, 232, 80, 140, 232, 57, 1, + 183, 140, 232, 57, 1, 209, 21, 140, 232, 57, 1, 208, 147, 140, 232, 57, + 1, 155, 140, 232, 57, 1, 211, 159, 140, 232, 57, 1, 189, 140, 232, 57, 1, + 203, 167, 140, 232, 57, 1, 203, 68, 140, 232, 57, 1, 203, 66, 140, 232, + 57, 1, 149, 140, 232, 57, 1, 240, 136, 140, 232, 57, 16, 199, 28, 140, + 232, 57, 16, 199, 27, 140, 241, 13, 1, 63, 140, 241, 13, 1, 69, 140, 241, + 13, 1, 68, 140, 241, 13, 1, 72, 140, 241, 13, 1, 164, 140, 241, 13, 1, + 197, 166, 140, 241, 13, 1, 249, 145, 140, 241, 13, 1, 161, 140, 241, 13, + 1, 166, 140, 241, 13, 1, 176, 140, 241, 13, 1, 217, 118, 140, 241, 13, 1, + 169, 140, 241, 13, 1, 172, 140, 241, 13, 1, 224, 146, 140, 241, 13, 1, + 232, 80, 140, 241, 13, 1, 183, 140, 241, 13, 1, 250, 251, 183, 140, 241, + 13, 1, 208, 147, 140, 241, 13, 1, 155, 140, 241, 13, 1, 211, 159, 140, + 241, 13, 1, 189, 140, 241, 13, 1, 203, 68, 140, 241, 13, 1, 149, 140, + 241, 13, 1, 240, 136, 140, 241, 13, 191, 236, 253, 200, 241, 140, 241, + 13, 191, 97, 232, 225, 140, 241, 13, 221, 248, 209, 238, 140, 241, 13, + 221, 248, 226, 93, 140, 241, 13, 31, 100, 140, 241, 13, 31, 102, 140, + 241, 13, 31, 134, 140, 241, 13, 31, 136, 140, 241, 13, 31, 146, 140, 241, + 13, 31, 167, 140, 241, 13, 31, 178, 140, 241, 13, 31, 171, 140, 241, 13, + 31, 182, 140, 241, 13, 31, 203, 23, 140, 241, 13, 31, 200, 234, 140, 241, + 13, 31, 202, 177, 140, 241, 13, 31, 235, 14, 140, 241, 13, 31, 235, 145, + 140, 241, 13, 31, 206, 13, 140, 241, 13, 31, 207, 65, 140, 241, 13, 31, + 97, 231, 57, 140, 241, 13, 31, 99, 231, 57, 140, 241, 13, 31, 115, 231, + 57, 140, 241, 13, 31, 235, 7, 231, 57, 140, 241, 13, 31, 235, 101, 231, + 57, 140, 241, 13, 31, 206, 29, 231, 57, 140, 241, 13, 31, 207, 71, 231, + 57, 140, 241, 13, 31, 237, 31, 231, 57, 140, 241, 13, 31, 216, 179, 231, + 57, 140, 241, 13, 31, 97, 170, 140, 241, 13, 31, 99, 170, 140, 241, 13, + 31, 115, 170, 140, 241, 13, 31, 235, 7, 170, 140, 241, 13, 31, 235, 101, + 170, 140, 241, 13, 31, 206, 29, 170, 140, 241, 13, 31, 207, 71, 170, 140, + 241, 13, 31, 237, 31, 170, 140, 241, 13, 31, 216, 179, 170, 140, 241, 13, + 31, 203, 24, 170, 140, 241, 13, 31, 200, 235, 170, 140, 241, 13, 31, 202, + 178, 170, 140, 241, 13, 31, 235, 15, 170, 140, 241, 13, 31, 235, 146, + 170, 140, 241, 13, 31, 206, 14, 170, 140, 241, 13, 31, 207, 66, 170, 140, + 241, 13, 31, 237, 21, 170, 140, 241, 13, 31, 216, 175, 170, 140, 241, 13, + 31, 97, 231, 58, 170, 140, 241, 13, 31, 99, 231, 58, 170, 140, 241, 13, + 31, 115, 231, 58, 170, 140, 241, 13, 31, 235, 7, 231, 58, 170, 140, 241, + 13, 31, 235, 101, 231, 58, 170, 140, 241, 13, 31, 206, 29, 231, 58, 170, + 140, 241, 13, 31, 207, 71, 231, 58, 170, 140, 241, 13, 31, 237, 31, 231, + 58, 170, 140, 241, 13, 31, 216, 179, 231, 58, 170, 140, 241, 13, 191, 97, + 200, 242, 140, 241, 13, 191, 99, 200, 241, 140, 241, 13, 191, 115, 200, + 241, 140, 241, 13, 191, 235, 7, 200, 241, 140, 241, 13, 191, 235, 101, + 200, 241, 140, 241, 13, 191, 206, 29, 200, 241, 140, 241, 13, 191, 207, + 71, 200, 241, 140, 241, 13, 191, 237, 31, 200, 241, 140, 241, 13, 191, + 216, 179, 200, 241, 140, 241, 13, 191, 203, 24, 200, 241, 224, 133, 1, + 63, 224, 133, 18, 2, 68, 224, 133, 18, 2, 66, 224, 133, 18, 2, 110, 144, + 224, 133, 18, 2, 69, 224, 133, 18, 2, 72, 224, 133, 18, 222, 158, 78, + 224, 133, 2, 52, 210, 3, 60, 224, 133, 2, 251, 51, 224, 133, 2, 199, 2, + 224, 133, 1, 155, 224, 133, 1, 224, 146, 224, 133, 1, 234, 123, 224, 133, + 1, 233, 230, 224, 133, 1, 247, 174, 224, 133, 1, 247, 16, 224, 133, 1, + 225, 214, 224, 133, 1, 215, 109, 224, 133, 1, 201, 78, 224, 133, 1, 201, + 66, 224, 133, 1, 240, 41, 224, 133, 1, 240, 25, 224, 133, 1, 216, 86, + 224, 133, 1, 189, 224, 133, 1, 202, 233, 224, 133, 1, 240, 136, 224, 133, + 1, 239, 176, 224, 133, 1, 176, 224, 133, 1, 161, 224, 133, 1, 213, 6, + 224, 133, 1, 249, 145, 224, 133, 1, 248, 197, 224, 133, 1, 166, 224, 133, + 1, 164, 224, 133, 1, 169, 224, 133, 1, 172, 224, 133, 1, 199, 152, 224, + 133, 1, 207, 50, 224, 133, 1, 205, 80, 224, 133, 1, 183, 224, 133, 1, + 195, 115, 224, 133, 1, 142, 224, 133, 1, 224, 36, 224, 133, 1, 201, 46, + 224, 133, 1, 201, 47, 224, 133, 1, 199, 35, 224, 133, 2, 249, 80, 57, + 224, 133, 2, 247, 88, 224, 133, 2, 76, 60, 224, 133, 199, 7, 224, 133, + 17, 100, 224, 133, 17, 102, 224, 133, 17, 134, 224, 133, 17, 136, 224, + 133, 31, 203, 23, 224, 133, 31, 200, 234, 224, 133, 31, 97, 231, 57, 224, + 133, 31, 97, 170, 224, 133, 191, 97, 232, 225, 224, 133, 211, 214, 238, + 253, 224, 133, 211, 214, 4, 244, 249, 224, 133, 211, 214, 244, 249, 224, + 133, 211, 214, 241, 72, 154, 224, 133, 211, 214, 220, 55, 224, 133, 211, + 214, 221, 213, 224, 133, 211, 214, 240, 88, 224, 133, 211, 214, 52, 240, + 88, 224, 133, 211, 214, 222, 69, 37, 205, 159, 251, 10, 1, 232, 147, 37, + 205, 159, 251, 10, 1, 222, 240, 37, 205, 159, 251, 10, 1, 232, 87, 37, + 205, 159, 251, 10, 1, 219, 171, 37, 205, 159, 251, 10, 1, 211, 101, 37, + 205, 159, 251, 10, 1, 197, 117, 37, 205, 159, 251, 10, 1, 206, 211, 37, + 205, 159, 251, 10, 1, 210, 109, 37, 205, 159, 251, 10, 1, 248, 205, 37, + 205, 159, 251, 10, 1, 203, 82, 37, 205, 159, 251, 10, 1, 208, 199, 37, + 205, 159, 251, 10, 1, 225, 5, 37, 205, 159, 251, 10, 1, 215, 138, 37, + 205, 159, 251, 10, 1, 224, 128, 37, 205, 159, 251, 10, 1, 209, 5, 37, + 205, 159, 251, 10, 1, 208, 225, 37, 205, 159, 251, 10, 1, 235, 189, 37, + 205, 159, 251, 10, 1, 251, 164, 37, 205, 159, 251, 10, 1, 250, 115, 37, + 205, 159, 251, 10, 1, 239, 173, 37, 205, 159, 251, 10, 1, 233, 177, 37, + 205, 159, 251, 10, 1, 240, 100, 37, 205, 159, 251, 10, 1, 233, 218, 37, + 205, 159, 251, 10, 1, 202, 253, 37, 205, 159, 251, 10, 1, 195, 90, 37, + 205, 159, 251, 10, 1, 239, 170, 37, 205, 159, 251, 10, 1, 195, 240, 37, + 205, 159, 251, 10, 1, 202, 219, 37, 205, 159, 251, 10, 1, 202, 198, 37, + 205, 159, 251, 10, 31, 100, 37, 205, 159, 251, 10, 31, 235, 145, 37, 205, + 159, 251, 10, 156, 226, 68, 37, 173, 251, 10, 1, 232, 113, 37, 173, 251, + 10, 1, 222, 249, 37, 173, 251, 10, 1, 232, 236, 37, 173, 251, 10, 1, 219, + 185, 37, 173, 251, 10, 1, 211, 152, 37, 173, 251, 10, 1, 197, 117, 37, + 173, 251, 10, 1, 236, 149, 37, 173, 251, 10, 1, 210, 142, 37, 173, 251, + 10, 1, 248, 239, 37, 173, 251, 10, 1, 203, 41, 37, 173, 251, 10, 1, 236, + 150, 37, 173, 251, 10, 1, 225, 35, 37, 173, 251, 10, 1, 216, 31, 37, 173, + 251, 10, 1, 224, 142, 37, 173, 251, 10, 1, 209, 8, 37, 173, 251, 10, 1, + 236, 148, 37, 173, 251, 10, 1, 235, 176, 37, 173, 251, 10, 1, 251, 164, + 37, 173, 251, 10, 1, 251, 194, 37, 173, 251, 10, 1, 240, 130, 37, 173, + 251, 10, 1, 234, 39, 37, 173, 251, 10, 1, 240, 107, 37, 173, 251, 10, 1, + 233, 225, 37, 173, 251, 10, 1, 203, 139, 37, 173, 251, 10, 1, 195, 106, + 37, 173, 251, 10, 1, 202, 225, 37, 173, 251, 10, 1, 196, 64, 37, 173, + 251, 10, 1, 202, 213, 37, 173, 251, 10, 1, 195, 109, 37, 173, 251, 10, + 31, 100, 37, 173, 251, 10, 31, 203, 23, 37, 173, 251, 10, 31, 200, 234, + 220, 53, 1, 251, 162, 220, 53, 1, 248, 205, 220, 53, 1, 248, 190, 220, + 53, 1, 233, 177, 220, 53, 1, 233, 203, 220, 53, 1, 240, 100, 220, 53, 1, + 232, 147, 220, 53, 1, 197, 117, 220, 53, 2, 200, 104, 220, 53, 1, 195, + 92, 220, 53, 1, 195, 67, 220, 53, 1, 225, 195, 220, 53, 1, 225, 176, 220, + 53, 1, 232, 87, 220, 53, 1, 202, 253, 220, 53, 1, 195, 240, 220, 53, 1, + 225, 5, 220, 53, 1, 196, 205, 220, 53, 1, 224, 135, 220, 53, 1, 222, 240, + 220, 53, 1, 239, 169, 220, 53, 1, 202, 224, 220, 53, 1, 219, 171, 220, + 53, 1, 215, 138, 220, 53, 1, 208, 225, 220, 53, 1, 250, 117, 220, 53, 1, + 252, 120, 220, 53, 1, 213, 92, 220, 53, 1, 235, 189, 220, 53, 1, 209, 5, + 220, 53, 1, 211, 101, 220, 53, 1, 196, 182, 220, 53, 1, 211, 128, 220, + 53, 1, 210, 109, 220, 53, 1, 206, 211, 220, 53, 1, 205, 48, 220, 53, 1, + 203, 82, 220, 53, 252, 30, 117, 57, 220, 53, 252, 30, 117, 60, 220, 53, + 31, 100, 220, 53, 31, 146, 220, 53, 31, 203, 23, 220, 53, 31, 200, 234, + 220, 53, 31, 97, 231, 57, 220, 53, 211, 214, 205, 7, 220, 53, 211, 214, + 235, 77, 220, 53, 211, 214, 52, 76, 197, 39, 238, 253, 220, 53, 211, 214, + 76, 197, 39, 238, 253, 220, 53, 211, 214, 238, 253, 220, 53, 211, 214, + 99, 238, 250, 220, 53, 211, 214, 222, 76, 235, 134, 250, 129, 1, 63, 250, + 129, 1, 252, 168, 250, 129, 1, 251, 49, 250, 129, 1, 252, 126, 250, 129, + 1, 251, 106, 250, 129, 1, 252, 128, 250, 129, 1, 251, 245, 250, 129, 1, + 251, 241, 250, 129, 1, 69, 250, 129, 1, 237, 54, 250, 129, 1, 72, 250, + 129, 1, 214, 102, 250, 129, 1, 68, 250, 129, 1, 226, 120, 250, 129, 1, + 66, 250, 129, 1, 199, 245, 250, 129, 1, 224, 209, 250, 129, 1, 196, 202, + 250, 129, 1, 196, 162, 250, 129, 1, 196, 173, 250, 129, 1, 234, 48, 250, + 129, 1, 234, 5, 250, 129, 1, 233, 216, 250, 129, 1, 247, 57, 250, 129, 1, + 225, 193, 250, 129, 1, 203, 68, 250, 129, 1, 202, 217, 250, 129, 1, 239, + 252, 250, 129, 1, 239, 167, 250, 129, 1, 201, 73, 250, 129, 1, 213, 92, + 250, 129, 1, 235, 189, 250, 129, 1, 249, 9, 250, 129, 1, 248, 192, 250, + 129, 1, 217, 58, 250, 129, 1, 216, 229, 250, 129, 1, 216, 230, 250, 129, + 1, 217, 118, 250, 129, 1, 215, 98, 250, 129, 1, 216, 81, 250, 129, 1, + 219, 207, 250, 129, 1, 231, 243, 250, 129, 1, 195, 165, 250, 129, 1, 196, + 69, 250, 129, 1, 199, 118, 250, 129, 1, 210, 183, 250, 129, 1, 222, 197, + 250, 129, 1, 208, 147, 250, 129, 1, 195, 88, 250, 129, 1, 206, 255, 250, + 129, 1, 195, 65, 250, 129, 1, 206, 119, 250, 129, 1, 205, 49, 250, 129, + 1, 232, 147, 250, 129, 252, 30, 78, 202, 70, 99, 238, 251, 127, 97, 76, + 211, 213, 4, 99, 238, 251, 127, 97, 76, 211, 213, 222, 228, 99, 238, 251, + 127, 97, 76, 211, 213, 222, 228, 97, 76, 127, 99, 238, 251, 211, 213, + 222, 228, 99, 209, 255, 127, 97, 210, 3, 211, 213, 222, 228, 97, 210, 3, + 127, 99, 209, 255, 211, 213, 226, 46, 213, 133, 1, 251, 162, 226, 46, + 213, 133, 1, 248, 205, 226, 46, 213, 133, 1, 233, 177, 226, 46, 213, 133, + 1, 240, 100, 226, 46, 213, 133, 1, 232, 147, 226, 46, 213, 133, 1, 197, + 117, 226, 46, 213, 133, 1, 195, 92, 226, 46, 213, 133, 1, 232, 87, 226, + 46, 213, 133, 1, 202, 253, 226, 46, 213, 133, 1, 195, 240, 226, 46, 213, + 133, 1, 225, 5, 226, 46, 213, 133, 1, 222, 240, 226, 46, 213, 133, 1, + 219, 171, 226, 46, 213, 133, 1, 215, 138, 226, 46, 213, 133, 1, 208, 225, + 226, 46, 213, 133, 1, 250, 117, 226, 46, 213, 133, 1, 213, 92, 226, 46, + 213, 133, 1, 209, 5, 226, 46, 213, 133, 1, 211, 101, 226, 46, 213, 133, + 1, 210, 109, 226, 46, 213, 133, 1, 206, 211, 226, 46, 213, 133, 1, 203, + 82, 226, 46, 213, 133, 31, 100, 226, 46, 213, 133, 31, 102, 226, 46, 213, + 133, 31, 134, 226, 46, 213, 133, 31, 136, 226, 46, 213, 133, 31, 203, 23, + 226, 46, 213, 133, 31, 200, 234, 226, 46, 213, 133, 31, 97, 231, 57, 226, + 46, 213, 133, 31, 97, 170, 226, 46, 213, 222, 1, 251, 162, 226, 46, 213, + 222, 1, 248, 205, 226, 46, 213, 222, 1, 233, 177, 226, 46, 213, 222, 1, + 240, 100, 226, 46, 213, 222, 1, 232, 147, 226, 46, 213, 222, 1, 197, 116, + 226, 46, 213, 222, 1, 195, 92, 226, 46, 213, 222, 1, 232, 87, 226, 46, + 213, 222, 1, 202, 253, 226, 46, 213, 222, 1, 195, 240, 226, 46, 213, 222, + 1, 225, 5, 226, 46, 213, 222, 1, 222, 240, 226, 46, 213, 222, 1, 219, + 170, 226, 46, 213, 222, 1, 215, 138, 226, 46, 213, 222, 1, 208, 225, 226, + 46, 213, 222, 1, 213, 92, 226, 46, 213, 222, 1, 209, 5, 226, 46, 213, + 222, 1, 206, 211, 226, 46, 213, 222, 1, 203, 82, 226, 46, 213, 222, 31, + 100, 226, 46, 213, 222, 31, 102, 226, 46, 213, 222, 31, 134, 226, 46, + 213, 222, 31, 136, 226, 46, 213, 222, 31, 203, 23, 226, 46, 213, 222, 31, + 200, 234, 226, 46, 213, 222, 31, 97, 231, 57, 226, 46, 213, 222, 31, 97, + 170, 211, 239, 213, 222, 1, 251, 162, 211, 239, 213, 222, 1, 248, 205, + 211, 239, 213, 222, 1, 233, 177, 211, 239, 213, 222, 1, 240, 100, 211, + 239, 213, 222, 1, 232, 147, 211, 239, 213, 222, 1, 197, 116, 211, 239, + 213, 222, 1, 195, 92, 211, 239, 213, 222, 1, 232, 87, 211, 239, 213, 222, + 1, 195, 240, 211, 239, 213, 222, 1, 225, 5, 211, 239, 213, 222, 1, 222, + 240, 211, 239, 213, 222, 1, 219, 170, 211, 239, 213, 222, 1, 215, 138, + 211, 239, 213, 222, 1, 208, 225, 211, 239, 213, 222, 1, 213, 92, 211, + 239, 213, 222, 1, 209, 5, 211, 239, 213, 222, 1, 206, 211, 211, 239, 213, + 222, 1, 203, 82, 211, 239, 213, 222, 208, 133, 78, 211, 239, 213, 222, + 163, 208, 133, 78, 211, 239, 213, 222, 235, 7, 238, 251, 3, 241, 61, 211, + 239, 213, 222, 235, 7, 238, 251, 3, 238, 253, 211, 239, 213, 222, 31, + 100, 211, 239, 213, 222, 31, 102, 211, 239, 213, 222, 31, 134, 211, 239, + 213, 222, 31, 136, 211, 239, 213, 222, 31, 203, 23, 211, 239, 213, 222, + 31, 200, 234, 211, 239, 213, 222, 31, 97, 231, 57, 37, 201, 7, 1, 214, + 61, 63, 37, 201, 7, 1, 196, 57, 63, 37, 201, 7, 1, 196, 57, 251, 245, 37, + 201, 7, 1, 214, 61, 68, 37, 201, 7, 1, 196, 57, 68, 37, 201, 7, 1, 196, + 57, 69, 37, 201, 7, 1, 214, 61, 72, 37, 201, 7, 1, 214, 61, 214, 164, 37, + 201, 7, 1, 196, 57, 214, 164, 37, 201, 7, 1, 214, 61, 252, 117, 37, 201, + 7, 1, 196, 57, 252, 117, 37, 201, 7, 1, 214, 61, 251, 244, 37, 201, 7, 1, + 196, 57, 251, 244, 37, 201, 7, 1, 214, 61, 251, 217, 37, 201, 7, 1, 196, + 57, 251, 217, 37, 201, 7, 1, 214, 61, 251, 239, 37, 201, 7, 1, 196, 57, + 251, 239, 37, 201, 7, 1, 214, 61, 252, 6, 37, 201, 7, 1, 196, 57, 252, 6, + 37, 201, 7, 1, 214, 61, 251, 243, 37, 201, 7, 1, 214, 61, 236, 56, 37, + 201, 7, 1, 196, 57, 236, 56, 37, 201, 7, 1, 214, 61, 250, 122, 37, 201, + 7, 1, 196, 57, 250, 122, 37, 201, 7, 1, 214, 61, 251, 226, 37, 201, 7, 1, + 196, 57, 251, 226, 37, 201, 7, 1, 214, 61, 251, 237, 37, 201, 7, 1, 196, + 57, 251, 237, 37, 201, 7, 1, 214, 61, 214, 162, 37, 201, 7, 1, 196, 57, + 214, 162, 37, 201, 7, 1, 214, 61, 251, 173, 37, 201, 7, 1, 196, 57, 251, + 173, 37, 201, 7, 1, 214, 61, 251, 236, 37, 201, 7, 1, 214, 61, 236, 245, + 37, 201, 7, 1, 214, 61, 236, 241, 37, 201, 7, 1, 214, 61, 251, 106, 37, + 201, 7, 1, 214, 61, 251, 234, 37, 201, 7, 1, 196, 57, 251, 234, 37, 201, + 7, 1, 214, 61, 236, 207, 37, 201, 7, 1, 196, 57, 236, 207, 37, 201, 7, 1, + 214, 61, 236, 227, 37, 201, 7, 1, 196, 57, 236, 227, 37, 201, 7, 1, 214, + 61, 236, 193, 37, 201, 7, 1, 196, 57, 236, 193, 37, 201, 7, 1, 196, 57, + 251, 97, 37, 201, 7, 1, 214, 61, 236, 215, 37, 201, 7, 1, 196, 57, 251, + 233, 37, 201, 7, 1, 214, 61, 236, 183, 37, 201, 7, 1, 214, 61, 214, 93, + 37, 201, 7, 1, 214, 61, 230, 203, 37, 201, 7, 1, 214, 61, 237, 62, 37, + 201, 7, 1, 196, 57, 237, 62, 37, 201, 7, 1, 214, 61, 251, 18, 37, 201, 7, + 1, 196, 57, 251, 18, 37, 201, 7, 1, 214, 61, 226, 3, 37, 201, 7, 1, 196, + 57, 226, 3, 37, 201, 7, 1, 214, 61, 214, 74, 37, 201, 7, 1, 196, 57, 214, + 74, 37, 201, 7, 1, 214, 61, 251, 14, 37, 201, 7, 1, 196, 57, 251, 14, 37, + 201, 7, 1, 214, 61, 251, 232, 37, 201, 7, 1, 214, 61, 250, 202, 37, 201, + 7, 1, 214, 61, 251, 230, 37, 201, 7, 1, 214, 61, 250, 195, 37, 201, 7, 1, + 196, 57, 250, 195, 37, 201, 7, 1, 214, 61, 236, 141, 37, 201, 7, 1, 196, + 57, 236, 141, 37, 201, 7, 1, 214, 61, 250, 168, 37, 201, 7, 1, 196, 57, + 250, 168, 37, 201, 7, 1, 214, 61, 251, 227, 37, 201, 7, 1, 196, 57, 251, + 227, 37, 201, 7, 1, 214, 61, 214, 49, 37, 201, 7, 1, 214, 61, 249, 63, + 37, 160, 6, 1, 63, 37, 160, 6, 1, 252, 168, 37, 160, 6, 1, 237, 64, 37, + 160, 6, 1, 251, 118, 37, 160, 6, 1, 237, 62, 37, 160, 6, 1, 236, 227, 37, + 160, 6, 1, 237, 59, 37, 160, 6, 1, 237, 58, 37, 160, 6, 1, 251, 100, 37, + 160, 6, 1, 69, 37, 160, 6, 1, 244, 204, 69, 37, 160, 6, 1, 237, 54, 37, + 160, 6, 1, 237, 47, 37, 160, 6, 1, 237, 46, 37, 160, 6, 1, 237, 43, 37, + 160, 6, 1, 237, 40, 37, 160, 6, 1, 68, 37, 160, 6, 1, 226, 120, 37, 160, + 6, 1, 237, 17, 37, 160, 6, 1, 237, 14, 37, 160, 6, 1, 251, 181, 37, 160, + 6, 1, 200, 45, 37, 160, 6, 1, 237, 7, 37, 160, 6, 1, 236, 244, 37, 160, + 6, 1, 236, 241, 37, 160, 6, 1, 236, 230, 37, 160, 6, 1, 236, 193, 37, + 160, 6, 1, 72, 37, 160, 6, 1, 214, 102, 37, 160, 6, 1, 216, 186, 214, + 164, 37, 160, 6, 1, 209, 130, 214, 164, 37, 160, 6, 1, 214, 163, 37, 160, + 6, 1, 236, 183, 37, 160, 6, 1, 236, 235, 37, 160, 6, 1, 236, 163, 37, + 160, 6, 1, 206, 182, 236, 163, 37, 160, 6, 1, 236, 151, 37, 160, 6, 1, + 236, 130, 37, 160, 6, 1, 236, 128, 37, 160, 6, 1, 236, 207, 37, 160, 6, + 1, 236, 117, 37, 160, 6, 1, 237, 60, 37, 160, 6, 1, 66, 37, 160, 6, 1, + 199, 245, 37, 160, 6, 1, 216, 186, 200, 99, 37, 160, 6, 1, 209, 130, 200, + 99, 37, 160, 6, 1, 236, 104, 37, 160, 6, 1, 236, 56, 37, 160, 6, 1, 236, + 51, 37, 160, 6, 1, 236, 206, 55, 37, 160, 6, 1, 200, 4, 37, 160, 4, 1, + 63, 37, 160, 4, 1, 252, 168, 37, 160, 4, 1, 237, 64, 37, 160, 4, 1, 251, + 118, 37, 160, 4, 1, 237, 62, 37, 160, 4, 1, 236, 227, 37, 160, 4, 1, 237, + 59, 37, 160, 4, 1, 237, 58, 37, 160, 4, 1, 251, 100, 37, 160, 4, 1, 69, + 37, 160, 4, 1, 244, 204, 69, 37, 160, 4, 1, 237, 54, 37, 160, 4, 1, 237, + 47, 37, 160, 4, 1, 237, 46, 37, 160, 4, 1, 237, 43, 37, 160, 4, 1, 237, + 40, 37, 160, 4, 1, 68, 37, 160, 4, 1, 226, 120, 37, 160, 4, 1, 237, 17, + 37, 160, 4, 1, 237, 14, 37, 160, 4, 1, 251, 181, 37, 160, 4, 1, 200, 45, + 37, 160, 4, 1, 237, 7, 37, 160, 4, 1, 236, 244, 37, 160, 4, 1, 236, 241, + 37, 160, 4, 1, 236, 230, 37, 160, 4, 1, 236, 193, 37, 160, 4, 1, 72, 37, + 160, 4, 1, 214, 102, 37, 160, 4, 1, 216, 186, 214, 164, 37, 160, 4, 1, + 209, 130, 214, 164, 37, 160, 4, 1, 214, 163, 37, 160, 4, 1, 236, 183, 37, + 160, 4, 1, 236, 235, 37, 160, 4, 1, 236, 163, 37, 160, 4, 1, 206, 182, + 236, 163, 37, 160, 4, 1, 236, 151, 37, 160, 4, 1, 236, 130, 37, 160, 4, + 1, 236, 128, 37, 160, 4, 1, 236, 207, 37, 160, 4, 1, 236, 117, 37, 160, + 4, 1, 237, 60, 37, 160, 4, 1, 66, 37, 160, 4, 1, 199, 245, 37, 160, 4, 1, + 216, 186, 200, 99, 37, 160, 4, 1, 209, 130, 200, 99, 37, 160, 4, 1, 236, + 104, 37, 160, 4, 1, 236, 56, 37, 160, 4, 1, 236, 51, 37, 160, 4, 1, 236, + 206, 55, 37, 160, 4, 1, 200, 4, 37, 160, 31, 100, 37, 160, 31, 146, 37, + 160, 31, 203, 23, 37, 160, 31, 235, 145, 37, 160, 31, 97, 231, 57, 37, + 160, 31, 97, 170, 232, 180, 209, 214, 1, 63, 232, 180, 209, 214, 1, 249, + 145, 232, 180, 209, 214, 1, 161, 232, 180, 209, 214, 1, 189, 232, 180, + 209, 214, 1, 201, 78, 232, 180, 209, 214, 1, 225, 214, 232, 180, 209, + 214, 1, 247, 174, 232, 180, 209, 214, 1, 142, 232, 180, 209, 214, 1, 224, + 146, 232, 180, 209, 214, 1, 235, 239, 232, 180, 209, 214, 1, 240, 136, + 232, 180, 209, 214, 1, 240, 41, 232, 180, 209, 214, 1, 169, 232, 180, + 209, 214, 1, 209, 181, 232, 180, 209, 214, 1, 195, 115, 232, 180, 209, + 214, 1, 183, 232, 180, 209, 214, 1, 207, 50, 232, 180, 209, 214, 1, 155, + 232, 180, 209, 214, 1, 234, 123, 232, 180, 209, 214, 1, 172, 232, 180, + 209, 214, 1, 166, 232, 180, 209, 214, 1, 176, 232, 180, 209, 214, 1, 197, + 166, 232, 180, 209, 214, 1, 224, 72, 197, 166, 232, 180, 209, 214, 1, + 164, 232, 180, 209, 214, 1, 224, 72, 164, 232, 180, 209, 214, 1, 217, 71, + 232, 180, 209, 214, 1, 215, 109, 232, 180, 209, 214, 1, 199, 152, 232, + 180, 209, 214, 18, 63, 232, 180, 209, 214, 18, 68, 232, 180, 209, 214, + 18, 66, 232, 180, 209, 214, 18, 69, 232, 180, 209, 214, 18, 72, 232, 180, + 209, 214, 117, 208, 245, 232, 180, 209, 214, 117, 218, 1, 224, 113, 232, + 180, 209, 214, 2, 232, 174, 232, 180, 209, 214, 2, 203, 138, 232, 180, + 209, 214, 2, 203, 113, 232, 180, 209, 214, 2, 203, 95, 232, 180, 209, + 214, 17, 195, 79, 232, 180, 209, 214, 17, 100, 232, 180, 209, 214, 17, + 102, 232, 180, 209, 214, 17, 134, 232, 180, 209, 214, 17, 136, 232, 180, + 209, 214, 17, 146, 232, 180, 209, 214, 17, 167, 232, 180, 209, 214, 17, + 178, 232, 180, 209, 214, 17, 171, 232, 180, 209, 214, 17, 182, 209, 118, 17, 100, 209, 118, 17, 102, 209, 118, 17, 134, 209, 118, 17, 136, 209, 118, 17, 146, 209, 118, 17, 167, 209, 118, 17, 178, 209, 118, 17, 171, 209, 118, 17, 182, 209, 118, 31, 203, 23, 209, 118, 31, 200, 234, 209, - 118, 31, 202, 177, 209, 118, 31, 235, 13, 209, 118, 31, 235, 144, 209, - 118, 31, 206, 13, 209, 118, 31, 207, 65, 209, 118, 31, 237, 19, 209, 118, - 31, 216, 173, 209, 118, 31, 97, 231, 56, 209, 118, 31, 99, 231, 56, 209, - 118, 31, 115, 231, 56, 209, 118, 31, 235, 6, 231, 56, 209, 118, 31, 235, - 100, 231, 56, 209, 118, 31, 206, 29, 231, 56, 209, 118, 31, 207, 71, 231, - 56, 209, 118, 31, 237, 30, 231, 56, 209, 118, 31, 216, 178, 231, 56, 209, - 118, 191, 97, 232, 224, 209, 118, 191, 97, 211, 86, 209, 118, 191, 97, - 202, 184, 209, 118, 191, 99, 202, 181, 37, 205, 182, 1, 251, 161, 37, - 205, 182, 1, 48, 251, 161, 37, 205, 182, 1, 248, 204, 37, 205, 182, 1, - 48, 248, 204, 37, 205, 182, 1, 233, 176, 37, 205, 182, 1, 232, 146, 37, - 205, 182, 1, 48, 232, 146, 37, 205, 182, 1, 197, 117, 37, 205, 182, 1, - 195, 92, 37, 205, 182, 1, 232, 86, 37, 205, 182, 1, 195, 240, 37, 205, - 182, 1, 225, 4, 37, 205, 182, 1, 222, 239, 37, 205, 182, 1, 219, 170, 37, - 205, 182, 1, 215, 137, 37, 205, 182, 1, 48, 215, 137, 37, 205, 182, 1, - 48, 215, 138, 3, 83, 203, 135, 37, 205, 182, 1, 208, 225, 37, 205, 182, - 1, 250, 116, 37, 205, 182, 1, 251, 130, 250, 116, 37, 205, 182, 1, 213, - 91, 37, 205, 182, 1, 209, 5, 37, 205, 182, 1, 48, 209, 5, 37, 205, 182, + 118, 31, 202, 177, 209, 118, 31, 235, 14, 209, 118, 31, 235, 145, 209, + 118, 31, 206, 13, 209, 118, 31, 207, 65, 209, 118, 31, 237, 20, 209, 118, + 31, 216, 174, 209, 118, 31, 97, 231, 57, 209, 118, 31, 99, 231, 57, 209, + 118, 31, 115, 231, 57, 209, 118, 31, 235, 7, 231, 57, 209, 118, 31, 235, + 101, 231, 57, 209, 118, 31, 206, 29, 231, 57, 209, 118, 31, 207, 71, 231, + 57, 209, 118, 31, 237, 31, 231, 57, 209, 118, 31, 216, 179, 231, 57, 209, + 118, 191, 97, 232, 225, 209, 118, 191, 97, 211, 87, 209, 118, 191, 97, + 202, 184, 209, 118, 191, 99, 202, 181, 37, 205, 182, 1, 251, 162, 37, + 205, 182, 1, 48, 251, 162, 37, 205, 182, 1, 248, 205, 37, 205, 182, 1, + 48, 248, 205, 37, 205, 182, 1, 233, 177, 37, 205, 182, 1, 232, 147, 37, + 205, 182, 1, 48, 232, 147, 37, 205, 182, 1, 197, 117, 37, 205, 182, 1, + 195, 92, 37, 205, 182, 1, 232, 87, 37, 205, 182, 1, 195, 240, 37, 205, + 182, 1, 225, 5, 37, 205, 182, 1, 222, 240, 37, 205, 182, 1, 219, 171, 37, + 205, 182, 1, 215, 138, 37, 205, 182, 1, 48, 215, 138, 37, 205, 182, 1, + 48, 215, 139, 3, 83, 203, 135, 37, 205, 182, 1, 208, 225, 37, 205, 182, + 1, 250, 117, 37, 205, 182, 1, 251, 131, 250, 117, 37, 205, 182, 1, 213, + 92, 37, 205, 182, 1, 209, 5, 37, 205, 182, 1, 48, 209, 5, 37, 205, 182, 1, 48, 209, 6, 3, 83, 203, 135, 37, 205, 182, 1, 210, 107, 37, 205, 182, 1, 206, 211, 37, 205, 182, 1, 203, 82, 37, 205, 182, 1, 48, 203, 82, 37, 205, 182, 1, 48, 203, 83, 3, 83, 203, 135, 37, 205, 182, 31, 100, 37, 205, 182, 31, 102, 37, 205, 182, 31, 134, 37, 205, 182, 31, 136, 37, 205, 182, 31, 146, 37, 205, 182, 31, 203, 23, 37, 205, 182, 31, 200, 234, 37, - 205, 182, 31, 202, 177, 37, 205, 182, 31, 97, 231, 56, 37, 205, 182, 191, - 97, 232, 224, 37, 205, 182, 33, 250, 115, 205, 182, 1, 251, 161, 205, - 182, 1, 248, 204, 205, 182, 1, 233, 176, 205, 182, 1, 232, 146, 205, 182, - 1, 197, 117, 205, 182, 1, 195, 92, 205, 182, 1, 232, 86, 205, 182, 1, - 195, 240, 205, 182, 1, 225, 4, 205, 182, 1, 222, 239, 205, 182, 1, 219, - 170, 205, 182, 1, 215, 137, 205, 182, 1, 208, 225, 205, 182, 1, 250, 116, - 205, 182, 1, 213, 91, 205, 182, 1, 209, 5, 205, 182, 1, 210, 108, 205, - 182, 1, 206, 211, 205, 182, 1, 203, 82, 205, 182, 1, 235, 159, 205, 182, - 1, 222, 141, 205, 182, 226, 72, 206, 211, 205, 182, 38, 76, 60, 205, 182, - 38, 99, 238, 250, 60, 205, 182, 38, 76, 57, 205, 182, 38, 99, 238, 250, - 57, 205, 182, 38, 241, 11, 57, 205, 182, 38, 241, 11, 60, 205, 182, 38, - 231, 164, 57, 205, 182, 38, 231, 164, 60, 205, 182, 38, 181, 231, 164, + 205, 182, 31, 202, 177, 37, 205, 182, 31, 97, 231, 57, 37, 205, 182, 191, + 97, 232, 225, 37, 205, 182, 33, 250, 116, 205, 182, 1, 251, 162, 205, + 182, 1, 248, 205, 205, 182, 1, 233, 177, 205, 182, 1, 232, 147, 205, 182, + 1, 197, 117, 205, 182, 1, 195, 92, 205, 182, 1, 232, 87, 205, 182, 1, + 195, 240, 205, 182, 1, 225, 5, 205, 182, 1, 222, 240, 205, 182, 1, 219, + 171, 205, 182, 1, 215, 138, 205, 182, 1, 208, 225, 205, 182, 1, 250, 117, + 205, 182, 1, 213, 92, 205, 182, 1, 209, 5, 205, 182, 1, 210, 108, 205, + 182, 1, 206, 211, 205, 182, 1, 203, 82, 205, 182, 1, 235, 160, 205, 182, + 1, 222, 142, 205, 182, 226, 73, 206, 211, 205, 182, 38, 76, 60, 205, 182, + 38, 99, 238, 251, 60, 205, 182, 38, 76, 57, 205, 182, 38, 99, 238, 251, + 57, 205, 182, 38, 241, 12, 57, 205, 182, 38, 241, 12, 60, 205, 182, 38, + 231, 165, 57, 205, 182, 38, 231, 165, 60, 205, 182, 38, 181, 231, 165, 60, 205, 182, 38, 210, 110, 60, 205, 182, 38, 204, 196, 60, 205, 182, 31, 100, 205, 182, 31, 203, 23, 205, 182, 31, 200, 234, 205, 182, 31, 97, - 231, 56, 205, 182, 211, 213, 99, 83, 249, 67, 205, 182, 211, 213, 99, 83, - 249, 68, 3, 238, 249, 205, 182, 211, 213, 244, 249, 3, 238, 252, 205, - 182, 211, 213, 99, 244, 246, 3, 238, 249, 205, 182, 211, 213, 157, 244, - 249, 3, 238, 252, 236, 242, 1, 251, 161, 236, 242, 1, 248, 204, 236, 242, - 1, 233, 176, 236, 242, 1, 240, 99, 236, 242, 1, 232, 146, 236, 242, 1, - 197, 117, 236, 242, 1, 195, 92, 236, 242, 1, 232, 86, 236, 242, 1, 202, - 253, 236, 242, 1, 195, 240, 236, 242, 1, 225, 4, 236, 242, 1, 222, 239, - 236, 242, 1, 219, 170, 236, 242, 1, 215, 137, 236, 242, 1, 208, 225, 236, - 242, 1, 250, 116, 236, 242, 1, 213, 91, 236, 242, 1, 209, 5, 236, 242, 1, - 211, 100, 236, 242, 1, 210, 109, 236, 242, 1, 206, 211, 236, 242, 1, 203, - 82, 236, 242, 33, 195, 91, 158, 2, 247, 132, 158, 2, 251, 50, 158, 2, - 199, 2, 158, 2, 225, 164, 158, 2, 200, 34, 158, 1, 63, 158, 1, 252, 167, - 158, 1, 68, 158, 1, 226, 119, 158, 1, 66, 158, 1, 199, 245, 158, 1, 110, - 144, 158, 1, 110, 209, 182, 158, 1, 110, 159, 158, 1, 110, 222, 37, 158, - 1, 69, 158, 1, 251, 199, 158, 1, 72, 158, 1, 250, 149, 158, 1, 155, 158, - 1, 224, 145, 158, 1, 234, 122, 158, 1, 233, 229, 158, 1, 217, 70, 158, 1, - 247, 173, 158, 1, 247, 15, 158, 1, 225, 213, 158, 1, 225, 179, 158, 1, - 215, 108, 158, 1, 201, 78, 158, 1, 201, 66, 158, 1, 240, 40, 158, 1, 240, - 24, 158, 1, 216, 85, 158, 1, 189, 158, 1, 202, 233, 158, 1, 240, 135, - 158, 1, 239, 175, 158, 1, 176, 158, 1, 161, 158, 1, 213, 5, 158, 1, 249, - 144, 158, 1, 248, 196, 158, 1, 166, 158, 1, 164, 158, 1, 169, 158, 1, + 231, 57, 205, 182, 211, 214, 99, 83, 249, 68, 205, 182, 211, 214, 99, 83, + 249, 69, 3, 238, 250, 205, 182, 211, 214, 244, 250, 3, 238, 253, 205, + 182, 211, 214, 99, 244, 247, 3, 238, 250, 205, 182, 211, 214, 157, 244, + 250, 3, 238, 253, 236, 243, 1, 251, 162, 236, 243, 1, 248, 205, 236, 243, + 1, 233, 177, 236, 243, 1, 240, 100, 236, 243, 1, 232, 147, 236, 243, 1, + 197, 117, 236, 243, 1, 195, 92, 236, 243, 1, 232, 87, 236, 243, 1, 202, + 253, 236, 243, 1, 195, 240, 236, 243, 1, 225, 5, 236, 243, 1, 222, 240, + 236, 243, 1, 219, 171, 236, 243, 1, 215, 138, 236, 243, 1, 208, 225, 236, + 243, 1, 250, 117, 236, 243, 1, 213, 92, 236, 243, 1, 209, 5, 236, 243, 1, + 211, 101, 236, 243, 1, 210, 109, 236, 243, 1, 206, 211, 236, 243, 1, 203, + 82, 236, 243, 33, 195, 91, 158, 2, 247, 133, 158, 2, 251, 51, 158, 2, + 199, 2, 158, 2, 225, 165, 158, 2, 200, 34, 158, 1, 63, 158, 1, 252, 168, + 158, 1, 68, 158, 1, 226, 120, 158, 1, 66, 158, 1, 199, 245, 158, 1, 110, + 144, 158, 1, 110, 209, 182, 158, 1, 110, 159, 158, 1, 110, 222, 38, 158, + 1, 69, 158, 1, 251, 200, 158, 1, 72, 158, 1, 250, 150, 158, 1, 155, 158, + 1, 224, 146, 158, 1, 234, 123, 158, 1, 233, 230, 158, 1, 217, 71, 158, 1, + 247, 174, 158, 1, 247, 16, 158, 1, 225, 214, 158, 1, 225, 180, 158, 1, + 215, 109, 158, 1, 201, 78, 158, 1, 201, 66, 158, 1, 240, 41, 158, 1, 240, + 25, 158, 1, 216, 86, 158, 1, 189, 158, 1, 202, 233, 158, 1, 240, 136, + 158, 1, 239, 176, 158, 1, 176, 158, 1, 161, 158, 1, 213, 6, 158, 1, 249, + 145, 158, 1, 248, 197, 158, 1, 166, 158, 1, 164, 158, 1, 169, 158, 1, 172, 158, 1, 199, 152, 158, 1, 207, 50, 158, 1, 205, 80, 158, 1, 183, - 158, 1, 142, 158, 1, 222, 36, 158, 1, 37, 42, 222, 25, 158, 1, 37, 42, - 209, 181, 158, 1, 37, 42, 216, 67, 158, 18, 2, 252, 167, 158, 18, 2, 248, - 192, 252, 167, 158, 18, 2, 68, 158, 18, 2, 226, 119, 158, 18, 2, 66, 158, + 158, 1, 142, 158, 1, 222, 37, 158, 1, 37, 42, 222, 26, 158, 1, 37, 42, + 209, 181, 158, 1, 37, 42, 216, 68, 158, 18, 2, 252, 168, 158, 18, 2, 248, + 193, 252, 168, 158, 18, 2, 68, 158, 18, 2, 226, 120, 158, 18, 2, 66, 158, 18, 2, 199, 245, 158, 18, 2, 110, 144, 158, 18, 2, 110, 209, 182, 158, - 18, 2, 110, 159, 158, 18, 2, 110, 222, 37, 158, 18, 2, 69, 158, 18, 2, - 251, 199, 158, 18, 2, 72, 158, 18, 2, 250, 149, 158, 199, 7, 158, 240, - 87, 158, 52, 240, 87, 158, 211, 213, 238, 252, 158, 211, 213, 52, 238, - 252, 158, 211, 213, 222, 74, 158, 211, 213, 241, 71, 154, 158, 211, 213, - 221, 212, 158, 31, 100, 158, 31, 102, 158, 31, 134, 158, 31, 136, 158, + 18, 2, 110, 159, 158, 18, 2, 110, 222, 38, 158, 18, 2, 69, 158, 18, 2, + 251, 200, 158, 18, 2, 72, 158, 18, 2, 250, 150, 158, 199, 7, 158, 240, + 88, 158, 52, 240, 88, 158, 211, 214, 238, 253, 158, 211, 214, 52, 238, + 253, 158, 211, 214, 222, 75, 158, 211, 214, 241, 72, 154, 158, 211, 214, + 221, 213, 158, 31, 100, 158, 31, 102, 158, 31, 134, 158, 31, 136, 158, 31, 146, 158, 31, 167, 158, 31, 178, 158, 31, 171, 158, 31, 182, 158, 31, - 203, 23, 158, 31, 200, 234, 158, 31, 202, 177, 158, 31, 235, 13, 158, 31, - 235, 144, 158, 31, 206, 13, 158, 31, 207, 65, 158, 31, 237, 19, 158, 31, - 216, 173, 158, 31, 97, 231, 56, 158, 31, 97, 170, 158, 17, 195, 79, 158, + 203, 23, 158, 31, 200, 234, 158, 31, 202, 177, 158, 31, 235, 14, 158, 31, + 235, 145, 158, 31, 206, 13, 158, 31, 207, 65, 158, 31, 237, 20, 158, 31, + 216, 174, 158, 31, 97, 231, 57, 158, 31, 97, 170, 158, 17, 195, 79, 158, 17, 100, 158, 17, 102, 158, 17, 134, 158, 17, 136, 158, 17, 146, 158, 17, - 167, 158, 17, 178, 158, 17, 171, 158, 17, 182, 158, 31, 225, 123, 225, - 27, 2, 247, 132, 225, 27, 2, 251, 50, 225, 27, 2, 199, 2, 225, 27, 1, 63, - 225, 27, 1, 252, 167, 225, 27, 1, 68, 225, 27, 1, 226, 119, 225, 27, 1, - 66, 225, 27, 1, 199, 245, 225, 27, 1, 69, 225, 27, 1, 251, 199, 225, 27, - 1, 72, 225, 27, 1, 250, 149, 225, 27, 1, 155, 225, 27, 1, 224, 145, 225, - 27, 1, 234, 122, 225, 27, 1, 233, 229, 225, 27, 1, 217, 70, 225, 27, 1, - 247, 173, 225, 27, 1, 247, 15, 225, 27, 1, 225, 213, 225, 27, 1, 225, - 179, 225, 27, 1, 215, 108, 225, 27, 1, 201, 78, 225, 27, 1, 201, 66, 225, - 27, 1, 240, 40, 225, 27, 1, 240, 29, 225, 27, 1, 240, 24, 225, 27, 1, - 210, 77, 225, 27, 1, 216, 85, 225, 27, 1, 189, 225, 27, 1, 202, 233, 225, - 27, 1, 240, 135, 225, 27, 1, 239, 175, 225, 27, 1, 176, 225, 27, 1, 161, - 225, 27, 1, 213, 5, 225, 27, 1, 249, 144, 225, 27, 1, 248, 196, 225, 27, - 1, 166, 225, 27, 1, 164, 225, 27, 1, 169, 225, 27, 1, 172, 225, 27, 1, - 199, 152, 225, 27, 1, 207, 50, 225, 27, 1, 205, 80, 225, 27, 1, 183, 225, - 27, 1, 142, 225, 27, 18, 2, 252, 167, 225, 27, 18, 2, 68, 225, 27, 18, 2, - 226, 119, 225, 27, 18, 2, 66, 225, 27, 18, 2, 199, 245, 225, 27, 18, 2, - 69, 225, 27, 18, 2, 251, 199, 225, 27, 18, 2, 72, 225, 27, 18, 2, 250, - 149, 225, 27, 2, 199, 7, 225, 27, 2, 215, 148, 225, 27, 252, 29, 55, 225, - 27, 236, 195, 55, 225, 27, 31, 55, 225, 27, 208, 133, 78, 225, 27, 52, - 208, 133, 78, 225, 27, 240, 87, 225, 27, 52, 240, 87, 225, 27, 31, 2, 57, + 167, 158, 17, 178, 158, 17, 171, 158, 17, 182, 158, 31, 225, 124, 225, + 28, 2, 247, 133, 225, 28, 2, 251, 51, 225, 28, 2, 199, 2, 225, 28, 1, 63, + 225, 28, 1, 252, 168, 225, 28, 1, 68, 225, 28, 1, 226, 120, 225, 28, 1, + 66, 225, 28, 1, 199, 245, 225, 28, 1, 69, 225, 28, 1, 251, 200, 225, 28, + 1, 72, 225, 28, 1, 250, 150, 225, 28, 1, 155, 225, 28, 1, 224, 146, 225, + 28, 1, 234, 123, 225, 28, 1, 233, 230, 225, 28, 1, 217, 71, 225, 28, 1, + 247, 174, 225, 28, 1, 247, 16, 225, 28, 1, 225, 214, 225, 28, 1, 225, + 180, 225, 28, 1, 215, 109, 225, 28, 1, 201, 78, 225, 28, 1, 201, 66, 225, + 28, 1, 240, 41, 225, 28, 1, 240, 30, 225, 28, 1, 240, 25, 225, 28, 1, + 210, 77, 225, 28, 1, 216, 86, 225, 28, 1, 189, 225, 28, 1, 202, 233, 225, + 28, 1, 240, 136, 225, 28, 1, 239, 176, 225, 28, 1, 176, 225, 28, 1, 161, + 225, 28, 1, 213, 6, 225, 28, 1, 249, 145, 225, 28, 1, 248, 197, 225, 28, + 1, 166, 225, 28, 1, 164, 225, 28, 1, 169, 225, 28, 1, 172, 225, 28, 1, + 199, 152, 225, 28, 1, 207, 50, 225, 28, 1, 205, 80, 225, 28, 1, 183, 225, + 28, 1, 142, 225, 28, 18, 2, 252, 168, 225, 28, 18, 2, 68, 225, 28, 18, 2, + 226, 120, 225, 28, 18, 2, 66, 225, 28, 18, 2, 199, 245, 225, 28, 18, 2, + 69, 225, 28, 18, 2, 251, 200, 225, 28, 18, 2, 72, 225, 28, 18, 2, 250, + 150, 225, 28, 2, 199, 7, 225, 28, 2, 215, 149, 225, 28, 252, 30, 55, 225, + 28, 236, 196, 55, 225, 28, 31, 55, 225, 28, 208, 133, 78, 225, 28, 52, + 208, 133, 78, 225, 28, 240, 88, 225, 28, 52, 240, 88, 225, 28, 31, 2, 57, 205, 167, 205, 175, 1, 208, 254, 205, 167, 205, 175, 1, 203, 139, 205, - 167, 205, 175, 1, 249, 114, 205, 167, 205, 175, 1, 247, 162, 205, 167, - 205, 175, 1, 240, 115, 205, 167, 205, 175, 1, 234, 107, 205, 167, 205, - 175, 1, 220, 88, 205, 167, 205, 175, 1, 217, 67, 205, 167, 205, 175, 1, - 223, 56, 205, 167, 205, 175, 1, 217, 230, 205, 167, 205, 175, 1, 199, - 148, 205, 167, 205, 175, 1, 213, 222, 205, 167, 205, 175, 1, 196, 110, - 205, 167, 205, 175, 1, 210, 225, 205, 167, 205, 175, 1, 232, 235, 205, - 167, 205, 175, 1, 225, 32, 205, 167, 205, 175, 1, 225, 207, 205, 167, - 205, 175, 1, 215, 105, 205, 167, 205, 175, 1, 251, 208, 205, 167, 205, - 175, 1, 237, 51, 205, 167, 205, 175, 1, 226, 120, 205, 167, 205, 175, 1, - 200, 92, 205, 167, 205, 175, 1, 214, 148, 205, 167, 205, 175, 1, 237, 39, - 205, 167, 205, 175, 1, 220, 103, 205, 167, 205, 175, 17, 195, 79, 205, + 167, 205, 175, 1, 249, 115, 205, 167, 205, 175, 1, 247, 163, 205, 167, + 205, 175, 1, 240, 116, 205, 167, 205, 175, 1, 234, 108, 205, 167, 205, + 175, 1, 220, 89, 205, 167, 205, 175, 1, 217, 68, 205, 167, 205, 175, 1, + 223, 57, 205, 167, 205, 175, 1, 217, 231, 205, 167, 205, 175, 1, 199, + 148, 205, 167, 205, 175, 1, 213, 223, 205, 167, 205, 175, 1, 196, 110, + 205, 167, 205, 175, 1, 210, 226, 205, 167, 205, 175, 1, 232, 236, 205, + 167, 205, 175, 1, 225, 33, 205, 167, 205, 175, 1, 225, 208, 205, 167, + 205, 175, 1, 215, 106, 205, 167, 205, 175, 1, 251, 209, 205, 167, 205, + 175, 1, 237, 52, 205, 167, 205, 175, 1, 226, 121, 205, 167, 205, 175, 1, + 200, 92, 205, 167, 205, 175, 1, 214, 149, 205, 167, 205, 175, 1, 237, 40, + 205, 167, 205, 175, 1, 220, 104, 205, 167, 205, 175, 17, 195, 79, 205, 167, 205, 175, 17, 100, 205, 167, 205, 175, 17, 102, 205, 167, 205, 175, 17, 134, 205, 167, 205, 175, 17, 136, 205, 167, 205, 175, 17, 146, 205, 167, 205, 175, 17, 167, 205, 167, 205, 175, 17, 178, 205, 167, 205, 175, - 17, 171, 205, 167, 205, 175, 17, 182, 247, 9, 2, 247, 132, 247, 9, 2, - 251, 50, 247, 9, 2, 199, 2, 247, 9, 1, 252, 167, 247, 9, 1, 68, 247, 9, - 1, 66, 247, 9, 1, 69, 247, 9, 1, 225, 54, 247, 9, 1, 224, 144, 247, 9, 1, - 234, 119, 247, 9, 1, 233, 228, 247, 9, 1, 217, 69, 247, 9, 1, 247, 172, - 247, 9, 1, 247, 14, 247, 9, 1, 225, 212, 247, 9, 1, 225, 178, 247, 9, 1, - 215, 107, 247, 9, 1, 201, 77, 247, 9, 1, 201, 65, 247, 9, 1, 240, 39, - 247, 9, 1, 240, 23, 247, 9, 1, 216, 84, 247, 9, 1, 203, 162, 247, 9, 1, - 202, 232, 247, 9, 1, 240, 134, 247, 9, 1, 239, 174, 247, 9, 1, 217, 243, - 247, 9, 1, 213, 242, 247, 9, 1, 213, 4, 247, 9, 1, 249, 142, 247, 9, 1, - 248, 195, 247, 9, 1, 220, 118, 247, 9, 1, 195, 166, 247, 9, 1, 196, 129, - 247, 9, 1, 210, 243, 247, 9, 1, 223, 81, 247, 9, 1, 197, 160, 247, 9, 1, - 209, 13, 247, 9, 1, 232, 245, 247, 9, 18, 2, 63, 247, 9, 18, 2, 68, 247, - 9, 18, 2, 226, 119, 247, 9, 18, 2, 66, 247, 9, 18, 2, 199, 245, 247, 9, - 18, 2, 69, 247, 9, 18, 2, 251, 199, 247, 9, 18, 2, 72, 247, 9, 18, 2, - 250, 149, 247, 9, 18, 2, 214, 145, 247, 9, 177, 78, 247, 9, 250, 150, 78, - 247, 9, 199, 7, 247, 9, 220, 116, 247, 9, 17, 195, 79, 247, 9, 17, 100, - 247, 9, 17, 102, 247, 9, 17, 134, 247, 9, 17, 136, 247, 9, 17, 146, 247, - 9, 17, 167, 247, 9, 17, 178, 247, 9, 17, 171, 247, 9, 17, 182, 247, 9, - 208, 133, 78, 247, 9, 240, 87, 247, 9, 52, 240, 87, 247, 9, 211, 78, 78, - 247, 9, 1, 222, 120, 247, 9, 18, 2, 252, 167, 247, 9, 18, 2, 237, 32, - 220, 86, 1, 63, 220, 86, 1, 68, 220, 86, 1, 66, 220, 86, 1, 69, 220, 86, - 1, 72, 220, 86, 1, 155, 220, 86, 1, 224, 145, 220, 86, 1, 234, 122, 220, - 86, 1, 233, 229, 220, 86, 1, 247, 173, 220, 86, 1, 247, 15, 220, 86, 1, - 225, 213, 220, 86, 1, 225, 179, 220, 86, 1, 215, 108, 220, 86, 1, 201, - 78, 220, 86, 1, 201, 66, 220, 86, 1, 240, 40, 220, 86, 1, 240, 24, 220, - 86, 1, 216, 85, 220, 86, 1, 189, 220, 86, 1, 202, 233, 220, 86, 1, 240, - 135, 220, 86, 1, 239, 175, 220, 86, 1, 176, 220, 86, 1, 161, 220, 86, 1, - 213, 5, 220, 86, 1, 249, 144, 220, 86, 1, 248, 196, 220, 86, 1, 166, 220, - 86, 1, 169, 220, 86, 1, 172, 220, 86, 1, 199, 152, 220, 86, 1, 183, 220, - 86, 1, 142, 220, 86, 1, 209, 181, 220, 86, 2, 215, 148, 220, 86, 252, 29, - 55, 220, 86, 208, 133, 78, 220, 86, 33, 206, 159, 207, 15, 2, 247, 132, - 207, 15, 2, 251, 50, 207, 15, 2, 199, 2, 207, 15, 1, 63, 207, 15, 1, 252, - 167, 207, 15, 1, 68, 207, 15, 1, 226, 119, 207, 15, 1, 66, 207, 15, 1, - 199, 245, 207, 15, 1, 110, 144, 207, 15, 1, 110, 209, 182, 207, 15, 1, - 110, 159, 207, 15, 1, 110, 222, 37, 207, 15, 1, 69, 207, 15, 1, 251, 199, - 207, 15, 1, 72, 207, 15, 1, 250, 149, 207, 15, 1, 155, 207, 15, 1, 224, - 145, 207, 15, 1, 234, 122, 207, 15, 1, 233, 229, 207, 15, 1, 217, 70, - 207, 15, 1, 247, 173, 207, 15, 1, 247, 15, 207, 15, 1, 225, 213, 207, 15, - 1, 225, 179, 207, 15, 1, 215, 108, 207, 15, 1, 201, 78, 207, 15, 1, 201, - 66, 207, 15, 1, 240, 40, 207, 15, 1, 240, 24, 207, 15, 1, 216, 85, 207, - 15, 1, 189, 207, 15, 1, 202, 233, 207, 15, 1, 240, 135, 207, 15, 1, 239, - 175, 207, 15, 1, 176, 207, 15, 1, 161, 207, 15, 1, 213, 5, 207, 15, 1, - 249, 144, 207, 15, 1, 248, 196, 207, 15, 1, 166, 207, 15, 1, 164, 207, - 15, 1, 169, 207, 15, 1, 172, 207, 15, 1, 222, 36, 207, 15, 1, 199, 152, - 207, 15, 1, 207, 50, 207, 15, 1, 205, 80, 207, 15, 1, 183, 207, 15, 1, - 142, 207, 15, 18, 2, 252, 167, 207, 15, 18, 2, 68, 207, 15, 18, 2, 226, - 119, 207, 15, 18, 2, 66, 207, 15, 18, 2, 199, 245, 207, 15, 18, 2, 110, - 144, 207, 15, 18, 2, 110, 209, 182, 207, 15, 18, 2, 110, 159, 207, 15, - 18, 2, 110, 222, 37, 207, 15, 18, 2, 69, 207, 15, 18, 2, 251, 199, 207, - 15, 18, 2, 72, 207, 15, 18, 2, 250, 149, 207, 15, 2, 199, 7, 207, 15, 2, - 250, 131, 207, 15, 2, 225, 164, 207, 15, 2, 200, 34, 207, 15, 214, 126, - 207, 15, 240, 87, 207, 15, 52, 240, 87, 207, 15, 252, 29, 55, 207, 15, - 207, 90, 207, 15, 208, 215, 78, 207, 15, 2, 215, 148, 207, 15, 18, 73, - 78, 207, 15, 236, 74, 206, 182, 18, 78, 207, 15, 204, 75, 78, 207, 15, - 17, 195, 79, 207, 15, 17, 100, 207, 15, 17, 102, 207, 15, 17, 134, 207, - 15, 17, 136, 207, 15, 17, 146, 207, 15, 17, 167, 207, 15, 17, 178, 207, - 15, 17, 171, 207, 15, 17, 182, 207, 15, 237, 12, 207, 15, 2, 206, 100, - 207, 15, 232, 129, 207, 15, 241, 127, 55, 207, 15, 208, 133, 220, 27, - 207, 15, 208, 133, 220, 26, 153, 250, 250, 17, 100, 153, 250, 250, 17, - 102, 153, 250, 250, 17, 134, 153, 250, 250, 17, 136, 153, 250, 250, 17, - 146, 153, 250, 250, 17, 167, 153, 250, 250, 17, 178, 153, 250, 250, 17, - 171, 153, 250, 250, 17, 182, 153, 250, 250, 31, 203, 23, 153, 250, 250, - 31, 200, 234, 153, 250, 250, 31, 202, 177, 153, 250, 250, 31, 235, 13, - 153, 250, 250, 31, 235, 144, 153, 250, 250, 31, 206, 13, 153, 250, 250, - 31, 207, 65, 153, 250, 250, 31, 237, 19, 153, 250, 250, 31, 216, 173, - 153, 250, 250, 31, 97, 231, 56, 153, 250, 250, 31, 97, 170, 224, 115, 1, - 63, 224, 115, 1, 252, 167, 224, 115, 1, 68, 224, 115, 1, 66, 224, 115, 1, - 69, 224, 115, 1, 251, 199, 224, 115, 1, 72, 224, 115, 1, 250, 149, 224, - 115, 1, 155, 224, 115, 1, 224, 145, 224, 115, 1, 234, 122, 224, 115, 1, - 234, 9, 224, 115, 1, 233, 229, 224, 115, 1, 217, 70, 224, 115, 1, 247, - 173, 224, 115, 1, 247, 15, 224, 115, 1, 225, 213, 224, 115, 1, 225, 157, - 224, 115, 1, 215, 108, 224, 115, 1, 201, 78, 224, 115, 1, 201, 66, 224, - 115, 1, 240, 40, 224, 115, 1, 240, 24, 224, 115, 1, 216, 85, 224, 115, 1, - 189, 224, 115, 1, 202, 233, 224, 115, 1, 240, 135, 224, 115, 1, 240, 30, - 224, 115, 1, 239, 175, 224, 115, 1, 176, 224, 115, 1, 161, 224, 115, 1, - 213, 5, 224, 115, 1, 249, 144, 224, 115, 1, 249, 44, 224, 115, 1, 248, - 196, 224, 115, 1, 166, 224, 115, 1, 164, 224, 115, 1, 169, 224, 115, 1, - 172, 224, 115, 1, 199, 152, 224, 115, 1, 183, 224, 115, 1, 142, 224, 115, - 1, 222, 36, 224, 115, 18, 2, 252, 167, 224, 115, 18, 2, 68, 224, 115, 18, - 2, 226, 119, 224, 115, 18, 2, 66, 224, 115, 18, 2, 69, 224, 115, 18, 2, - 251, 199, 224, 115, 18, 2, 72, 224, 115, 18, 2, 250, 149, 224, 115, 2, - 251, 50, 224, 115, 2, 199, 7, 224, 115, 2, 215, 148, 224, 115, 2, 207, - 40, 224, 115, 240, 87, 224, 115, 52, 240, 87, 224, 115, 197, 9, 207, 90, - 224, 115, 208, 133, 78, 224, 115, 52, 208, 133, 78, 224, 115, 252, 29, - 55, 224, 115, 2, 204, 119, 218, 123, 1, 63, 218, 123, 1, 68, 218, 123, 1, - 66, 218, 123, 1, 69, 218, 123, 1, 155, 218, 123, 1, 224, 145, 218, 123, - 1, 234, 122, 218, 123, 1, 233, 229, 218, 123, 1, 247, 173, 218, 123, 1, - 247, 15, 218, 123, 1, 225, 213, 218, 123, 1, 225, 157, 218, 123, 1, 215, - 108, 218, 123, 1, 201, 78, 218, 123, 1, 201, 66, 218, 123, 1, 240, 40, - 218, 123, 1, 240, 30, 218, 123, 1, 240, 24, 218, 123, 1, 216, 85, 218, - 123, 1, 189, 218, 123, 1, 202, 233, 218, 123, 1, 240, 135, 218, 123, 1, - 239, 175, 218, 123, 1, 176, 218, 123, 1, 161, 218, 123, 1, 213, 5, 218, - 123, 1, 249, 144, 218, 123, 1, 248, 196, 218, 123, 1, 166, 218, 123, 1, - 164, 218, 123, 1, 169, 218, 123, 1, 172, 218, 123, 1, 199, 152, 218, 123, - 1, 183, 218, 123, 1, 142, 218, 123, 1, 209, 181, 218, 123, 1, 210, 77, - 218, 123, 208, 133, 78, 224, 106, 1, 63, 224, 106, 1, 252, 167, 224, 106, - 1, 68, 224, 106, 1, 226, 119, 224, 106, 1, 66, 224, 106, 1, 199, 245, - 224, 106, 1, 69, 224, 106, 1, 251, 199, 224, 106, 1, 72, 224, 106, 1, - 250, 149, 224, 106, 1, 155, 224, 106, 1, 224, 145, 224, 106, 1, 234, 122, - 224, 106, 1, 234, 9, 224, 106, 1, 233, 229, 224, 106, 1, 217, 70, 224, - 106, 1, 247, 173, 224, 106, 1, 247, 15, 224, 106, 1, 225, 213, 224, 106, - 1, 225, 157, 224, 106, 1, 225, 179, 224, 106, 1, 215, 108, 224, 106, 1, - 201, 78, 224, 106, 1, 201, 66, 224, 106, 1, 240, 40, 224, 106, 1, 240, - 30, 224, 106, 1, 209, 181, 224, 106, 1, 240, 24, 224, 106, 1, 216, 85, - 224, 106, 1, 189, 224, 106, 1, 202, 233, 224, 106, 1, 240, 135, 224, 106, - 1, 239, 175, 224, 106, 1, 176, 224, 106, 1, 161, 224, 106, 1, 213, 5, - 224, 106, 1, 249, 144, 224, 106, 1, 249, 44, 224, 106, 1, 248, 196, 224, - 106, 1, 166, 224, 106, 1, 164, 224, 106, 1, 169, 224, 106, 1, 172, 224, - 106, 1, 199, 152, 224, 106, 1, 207, 50, 224, 106, 1, 183, 224, 106, 1, - 142, 224, 106, 2, 251, 50, 224, 106, 18, 2, 252, 167, 224, 106, 18, 2, - 68, 224, 106, 18, 2, 226, 119, 224, 106, 18, 2, 66, 224, 106, 18, 2, 199, - 245, 224, 106, 18, 2, 69, 224, 106, 18, 2, 251, 199, 224, 106, 18, 2, 72, - 224, 106, 18, 2, 250, 149, 224, 106, 2, 215, 148, 224, 106, 2, 199, 7, - 224, 106, 17, 195, 79, 224, 106, 17, 100, 224, 106, 17, 102, 224, 106, - 17, 134, 224, 106, 17, 136, 224, 106, 17, 146, 224, 106, 17, 167, 224, - 106, 17, 178, 224, 106, 17, 171, 224, 106, 17, 182, 233, 108, 2, 38, 251, - 51, 57, 233, 108, 2, 247, 132, 233, 108, 2, 251, 50, 233, 108, 2, 199, 2, - 233, 108, 1, 63, 233, 108, 1, 252, 167, 233, 108, 1, 68, 233, 108, 1, - 226, 119, 233, 108, 1, 66, 233, 108, 1, 199, 245, 233, 108, 1, 110, 144, - 233, 108, 1, 110, 159, 233, 108, 1, 237, 53, 233, 108, 1, 251, 199, 233, - 108, 1, 214, 101, 233, 108, 1, 250, 149, 233, 108, 1, 155, 233, 108, 1, - 224, 145, 233, 108, 1, 234, 122, 233, 108, 1, 233, 229, 233, 108, 1, 217, - 70, 233, 108, 1, 247, 173, 233, 108, 1, 247, 15, 233, 108, 1, 225, 213, - 233, 108, 1, 225, 179, 233, 108, 1, 215, 108, 233, 108, 1, 201, 78, 233, - 108, 1, 201, 66, 233, 108, 1, 240, 40, 233, 108, 1, 240, 24, 233, 108, 1, - 216, 85, 233, 108, 1, 189, 233, 108, 1, 202, 233, 233, 108, 1, 240, 135, - 233, 108, 1, 239, 175, 233, 108, 1, 176, 233, 108, 1, 161, 233, 108, 1, - 213, 5, 233, 108, 1, 249, 144, 233, 108, 1, 248, 196, 233, 108, 1, 166, - 233, 108, 1, 164, 233, 108, 1, 169, 233, 108, 1, 172, 233, 108, 1, 222, - 36, 233, 108, 1, 199, 152, 233, 108, 1, 207, 50, 233, 108, 1, 205, 80, - 233, 108, 1, 183, 233, 108, 1, 142, 38, 248, 160, 60, 233, 108, 2, 215, - 148, 233, 108, 2, 250, 131, 233, 108, 18, 2, 252, 167, 233, 108, 18, 2, - 68, 233, 108, 18, 2, 226, 119, 233, 108, 18, 2, 66, 233, 108, 18, 2, 199, - 245, 233, 108, 18, 2, 110, 144, 233, 108, 18, 2, 110, 209, 182, 233, 108, - 18, 2, 237, 53, 233, 108, 18, 2, 251, 199, 233, 108, 18, 2, 214, 101, - 233, 108, 18, 2, 250, 149, 233, 108, 2, 199, 7, 233, 108, 214, 126, 233, - 108, 250, 150, 222, 157, 78, 233, 108, 2, 212, 122, 233, 108, 1, 199, - 115, 251, 50, 233, 108, 1, 199, 115, 52, 251, 50, 233, 108, 1, 110, 209, - 182, 233, 108, 1, 110, 222, 37, 233, 108, 18, 2, 110, 159, 233, 108, 18, - 2, 110, 222, 37, 38, 233, 108, 17, 195, 79, 38, 233, 108, 17, 100, 38, - 233, 108, 17, 102, 38, 233, 108, 17, 134, 38, 233, 108, 17, 136, 38, 233, - 108, 17, 146, 38, 233, 108, 17, 167, 38, 233, 108, 1, 63, 38, 233, 108, - 1, 155, 38, 233, 108, 1, 176, 38, 233, 108, 1, 199, 34, 38, 233, 108, 1, - 161, 217, 80, 1, 63, 217, 80, 1, 252, 167, 217, 80, 1, 68, 217, 80, 1, - 226, 119, 217, 80, 1, 66, 217, 80, 1, 199, 245, 217, 80, 1, 110, 144, - 217, 80, 1, 110, 209, 182, 217, 80, 1, 110, 159, 217, 80, 1, 110, 222, - 37, 217, 80, 1, 69, 217, 80, 1, 251, 199, 217, 80, 1, 72, 217, 80, 1, - 250, 149, 217, 80, 1, 155, 217, 80, 1, 224, 145, 217, 80, 1, 234, 122, - 217, 80, 1, 233, 229, 217, 80, 1, 217, 70, 217, 80, 1, 217, 19, 217, 80, - 1, 247, 173, 217, 80, 1, 247, 15, 217, 80, 1, 225, 213, 217, 80, 1, 225, - 179, 217, 80, 1, 215, 108, 217, 80, 1, 215, 90, 217, 80, 1, 201, 78, 217, - 80, 1, 201, 66, 217, 80, 1, 240, 40, 217, 80, 1, 240, 24, 217, 80, 1, - 216, 85, 217, 80, 1, 189, 217, 80, 1, 202, 233, 217, 80, 1, 240, 135, - 217, 80, 1, 239, 175, 217, 80, 1, 176, 217, 80, 1, 216, 226, 217, 80, 1, - 161, 217, 80, 1, 213, 5, 217, 80, 1, 249, 144, 217, 80, 1, 248, 196, 217, - 80, 1, 166, 217, 80, 1, 219, 80, 217, 80, 1, 164, 217, 80, 1, 169, 217, - 80, 1, 210, 77, 217, 80, 1, 172, 217, 80, 1, 222, 121, 217, 80, 1, 197, - 166, 217, 80, 1, 207, 50, 217, 80, 1, 205, 80, 217, 80, 1, 183, 217, 80, - 1, 142, 217, 80, 18, 2, 252, 167, 217, 80, 18, 2, 68, 217, 80, 18, 2, - 226, 119, 217, 80, 18, 2, 66, 217, 80, 18, 2, 199, 245, 217, 80, 18, 2, - 110, 144, 217, 80, 18, 2, 110, 209, 182, 217, 80, 18, 2, 110, 159, 217, - 80, 18, 2, 110, 222, 37, 217, 80, 18, 2, 69, 217, 80, 18, 2, 251, 199, - 217, 80, 18, 2, 72, 217, 80, 18, 2, 250, 149, 217, 80, 2, 199, 7, 217, - 80, 2, 247, 132, 217, 80, 2, 251, 50, 217, 80, 2, 199, 2, 217, 80, 2, - 215, 148, 217, 80, 2, 250, 131, 217, 80, 2, 48, 251, 50, 217, 80, 214, - 126, 217, 80, 206, 99, 217, 80, 240, 87, 217, 80, 52, 240, 87, 217, 80, - 244, 158, 217, 80, 234, 86, 235, 133, 217, 80, 252, 29, 55, 217, 80, 17, - 195, 79, 217, 80, 17, 100, 217, 80, 17, 102, 217, 80, 17, 134, 217, 80, - 17, 136, 217, 80, 17, 146, 217, 80, 17, 167, 217, 80, 17, 178, 217, 80, - 17, 171, 217, 80, 17, 182, 217, 80, 212, 147, 78, 217, 80, 226, 42, 55, - 217, 80, 208, 215, 78, 217, 80, 1, 199, 115, 251, 50, 202, 61, 251, 79, - 202, 61, 1, 63, 202, 61, 1, 252, 167, 202, 61, 1, 68, 202, 61, 1, 226, - 119, 202, 61, 1, 66, 202, 61, 1, 199, 245, 202, 61, 1, 110, 144, 202, 61, - 1, 110, 209, 182, 202, 61, 1, 110, 159, 202, 61, 1, 110, 222, 37, 202, - 61, 1, 69, 202, 61, 1, 251, 199, 202, 61, 1, 72, 202, 61, 1, 250, 149, - 202, 61, 1, 155, 202, 61, 1, 224, 145, 202, 61, 1, 234, 122, 202, 61, 1, - 233, 229, 202, 61, 1, 217, 70, 202, 61, 1, 247, 173, 202, 61, 1, 247, 15, - 202, 61, 1, 225, 213, 202, 61, 1, 225, 179, 202, 61, 1, 215, 108, 202, - 61, 1, 201, 78, 202, 61, 1, 201, 66, 202, 61, 1, 240, 40, 202, 61, 1, - 240, 24, 202, 61, 1, 216, 85, 202, 61, 1, 189, 202, 61, 1, 202, 233, 202, - 61, 1, 240, 135, 202, 61, 1, 239, 175, 202, 61, 1, 176, 202, 61, 1, 161, - 202, 61, 1, 213, 5, 202, 61, 1, 249, 144, 202, 61, 1, 248, 196, 202, 61, + 17, 171, 205, 167, 205, 175, 17, 182, 247, 10, 2, 247, 133, 247, 10, 2, + 251, 51, 247, 10, 2, 199, 2, 247, 10, 1, 252, 168, 247, 10, 1, 68, 247, + 10, 1, 66, 247, 10, 1, 69, 247, 10, 1, 225, 55, 247, 10, 1, 224, 145, + 247, 10, 1, 234, 120, 247, 10, 1, 233, 229, 247, 10, 1, 217, 70, 247, 10, + 1, 247, 173, 247, 10, 1, 247, 15, 247, 10, 1, 225, 213, 247, 10, 1, 225, + 179, 247, 10, 1, 215, 108, 247, 10, 1, 201, 77, 247, 10, 1, 201, 65, 247, + 10, 1, 240, 40, 247, 10, 1, 240, 24, 247, 10, 1, 216, 85, 247, 10, 1, + 203, 162, 247, 10, 1, 202, 232, 247, 10, 1, 240, 135, 247, 10, 1, 239, + 175, 247, 10, 1, 217, 244, 247, 10, 1, 213, 243, 247, 10, 1, 213, 5, 247, + 10, 1, 249, 143, 247, 10, 1, 248, 196, 247, 10, 1, 220, 119, 247, 10, 1, + 195, 166, 247, 10, 1, 196, 129, 247, 10, 1, 210, 244, 247, 10, 1, 223, + 82, 247, 10, 1, 197, 160, 247, 10, 1, 209, 13, 247, 10, 1, 232, 246, 247, + 10, 18, 2, 63, 247, 10, 18, 2, 68, 247, 10, 18, 2, 226, 120, 247, 10, 18, + 2, 66, 247, 10, 18, 2, 199, 245, 247, 10, 18, 2, 69, 247, 10, 18, 2, 251, + 200, 247, 10, 18, 2, 72, 247, 10, 18, 2, 250, 150, 247, 10, 18, 2, 214, + 146, 247, 10, 177, 78, 247, 10, 250, 151, 78, 247, 10, 199, 7, 247, 10, + 220, 117, 247, 10, 17, 195, 79, 247, 10, 17, 100, 247, 10, 17, 102, 247, + 10, 17, 134, 247, 10, 17, 136, 247, 10, 17, 146, 247, 10, 17, 167, 247, + 10, 17, 178, 247, 10, 17, 171, 247, 10, 17, 182, 247, 10, 208, 133, 78, + 247, 10, 240, 88, 247, 10, 52, 240, 88, 247, 10, 211, 79, 78, 247, 10, 1, + 222, 121, 247, 10, 18, 2, 252, 168, 247, 10, 18, 2, 237, 33, 220, 87, 1, + 63, 220, 87, 1, 68, 220, 87, 1, 66, 220, 87, 1, 69, 220, 87, 1, 72, 220, + 87, 1, 155, 220, 87, 1, 224, 146, 220, 87, 1, 234, 123, 220, 87, 1, 233, + 230, 220, 87, 1, 247, 174, 220, 87, 1, 247, 16, 220, 87, 1, 225, 214, + 220, 87, 1, 225, 180, 220, 87, 1, 215, 109, 220, 87, 1, 201, 78, 220, 87, + 1, 201, 66, 220, 87, 1, 240, 41, 220, 87, 1, 240, 25, 220, 87, 1, 216, + 86, 220, 87, 1, 189, 220, 87, 1, 202, 233, 220, 87, 1, 240, 136, 220, 87, + 1, 239, 176, 220, 87, 1, 176, 220, 87, 1, 161, 220, 87, 1, 213, 6, 220, + 87, 1, 249, 145, 220, 87, 1, 248, 197, 220, 87, 1, 166, 220, 87, 1, 169, + 220, 87, 1, 172, 220, 87, 1, 199, 152, 220, 87, 1, 183, 220, 87, 1, 142, + 220, 87, 1, 209, 181, 220, 87, 2, 215, 149, 220, 87, 252, 30, 55, 220, + 87, 208, 133, 78, 220, 87, 33, 206, 159, 207, 15, 2, 247, 133, 207, 15, + 2, 251, 51, 207, 15, 2, 199, 2, 207, 15, 1, 63, 207, 15, 1, 252, 168, + 207, 15, 1, 68, 207, 15, 1, 226, 120, 207, 15, 1, 66, 207, 15, 1, 199, + 245, 207, 15, 1, 110, 144, 207, 15, 1, 110, 209, 182, 207, 15, 1, 110, + 159, 207, 15, 1, 110, 222, 38, 207, 15, 1, 69, 207, 15, 1, 251, 200, 207, + 15, 1, 72, 207, 15, 1, 250, 150, 207, 15, 1, 155, 207, 15, 1, 224, 146, + 207, 15, 1, 234, 123, 207, 15, 1, 233, 230, 207, 15, 1, 217, 71, 207, 15, + 1, 247, 174, 207, 15, 1, 247, 16, 207, 15, 1, 225, 214, 207, 15, 1, 225, + 180, 207, 15, 1, 215, 109, 207, 15, 1, 201, 78, 207, 15, 1, 201, 66, 207, + 15, 1, 240, 41, 207, 15, 1, 240, 25, 207, 15, 1, 216, 86, 207, 15, 1, + 189, 207, 15, 1, 202, 233, 207, 15, 1, 240, 136, 207, 15, 1, 239, 176, + 207, 15, 1, 176, 207, 15, 1, 161, 207, 15, 1, 213, 6, 207, 15, 1, 249, + 145, 207, 15, 1, 248, 197, 207, 15, 1, 166, 207, 15, 1, 164, 207, 15, 1, + 169, 207, 15, 1, 172, 207, 15, 1, 222, 37, 207, 15, 1, 199, 152, 207, 15, + 1, 207, 50, 207, 15, 1, 205, 80, 207, 15, 1, 183, 207, 15, 1, 142, 207, + 15, 18, 2, 252, 168, 207, 15, 18, 2, 68, 207, 15, 18, 2, 226, 120, 207, + 15, 18, 2, 66, 207, 15, 18, 2, 199, 245, 207, 15, 18, 2, 110, 144, 207, + 15, 18, 2, 110, 209, 182, 207, 15, 18, 2, 110, 159, 207, 15, 18, 2, 110, + 222, 38, 207, 15, 18, 2, 69, 207, 15, 18, 2, 251, 200, 207, 15, 18, 2, + 72, 207, 15, 18, 2, 250, 150, 207, 15, 2, 199, 7, 207, 15, 2, 250, 132, + 207, 15, 2, 225, 165, 207, 15, 2, 200, 34, 207, 15, 214, 127, 207, 15, + 240, 88, 207, 15, 52, 240, 88, 207, 15, 252, 30, 55, 207, 15, 207, 90, + 207, 15, 208, 215, 78, 207, 15, 2, 215, 149, 207, 15, 18, 73, 78, 207, + 15, 236, 75, 206, 182, 18, 78, 207, 15, 204, 75, 78, 207, 15, 17, 195, + 79, 207, 15, 17, 100, 207, 15, 17, 102, 207, 15, 17, 134, 207, 15, 17, + 136, 207, 15, 17, 146, 207, 15, 17, 167, 207, 15, 17, 178, 207, 15, 17, + 171, 207, 15, 17, 182, 207, 15, 237, 13, 207, 15, 2, 206, 100, 207, 15, + 232, 130, 207, 15, 241, 128, 55, 207, 15, 208, 133, 220, 28, 207, 15, + 208, 133, 220, 27, 153, 250, 251, 17, 100, 153, 250, 251, 17, 102, 153, + 250, 251, 17, 134, 153, 250, 251, 17, 136, 153, 250, 251, 17, 146, 153, + 250, 251, 17, 167, 153, 250, 251, 17, 178, 153, 250, 251, 17, 171, 153, + 250, 251, 17, 182, 153, 250, 251, 31, 203, 23, 153, 250, 251, 31, 200, + 234, 153, 250, 251, 31, 202, 177, 153, 250, 251, 31, 235, 14, 153, 250, + 251, 31, 235, 145, 153, 250, 251, 31, 206, 13, 153, 250, 251, 31, 207, + 65, 153, 250, 251, 31, 237, 20, 153, 250, 251, 31, 216, 174, 153, 250, + 251, 31, 97, 231, 57, 153, 250, 251, 31, 97, 170, 224, 116, 1, 63, 224, + 116, 1, 252, 168, 224, 116, 1, 68, 224, 116, 1, 66, 224, 116, 1, 69, 224, + 116, 1, 251, 200, 224, 116, 1, 72, 224, 116, 1, 250, 150, 224, 116, 1, + 155, 224, 116, 1, 224, 146, 224, 116, 1, 234, 123, 224, 116, 1, 234, 10, + 224, 116, 1, 233, 230, 224, 116, 1, 217, 71, 224, 116, 1, 247, 174, 224, + 116, 1, 247, 16, 224, 116, 1, 225, 214, 224, 116, 1, 225, 158, 224, 116, + 1, 215, 109, 224, 116, 1, 201, 78, 224, 116, 1, 201, 66, 224, 116, 1, + 240, 41, 224, 116, 1, 240, 25, 224, 116, 1, 216, 86, 224, 116, 1, 189, + 224, 116, 1, 202, 233, 224, 116, 1, 240, 136, 224, 116, 1, 240, 31, 224, + 116, 1, 239, 176, 224, 116, 1, 176, 224, 116, 1, 161, 224, 116, 1, 213, + 6, 224, 116, 1, 249, 145, 224, 116, 1, 249, 45, 224, 116, 1, 248, 197, + 224, 116, 1, 166, 224, 116, 1, 164, 224, 116, 1, 169, 224, 116, 1, 172, + 224, 116, 1, 199, 152, 224, 116, 1, 183, 224, 116, 1, 142, 224, 116, 1, + 222, 37, 224, 116, 18, 2, 252, 168, 224, 116, 18, 2, 68, 224, 116, 18, 2, + 226, 120, 224, 116, 18, 2, 66, 224, 116, 18, 2, 69, 224, 116, 18, 2, 251, + 200, 224, 116, 18, 2, 72, 224, 116, 18, 2, 250, 150, 224, 116, 2, 251, + 51, 224, 116, 2, 199, 7, 224, 116, 2, 215, 149, 224, 116, 2, 207, 40, + 224, 116, 240, 88, 224, 116, 52, 240, 88, 224, 116, 197, 9, 207, 90, 224, + 116, 208, 133, 78, 224, 116, 52, 208, 133, 78, 224, 116, 252, 30, 55, + 224, 116, 2, 204, 119, 218, 124, 1, 63, 218, 124, 1, 68, 218, 124, 1, 66, + 218, 124, 1, 69, 218, 124, 1, 155, 218, 124, 1, 224, 146, 218, 124, 1, + 234, 123, 218, 124, 1, 233, 230, 218, 124, 1, 247, 174, 218, 124, 1, 247, + 16, 218, 124, 1, 225, 214, 218, 124, 1, 225, 158, 218, 124, 1, 215, 109, + 218, 124, 1, 201, 78, 218, 124, 1, 201, 66, 218, 124, 1, 240, 41, 218, + 124, 1, 240, 31, 218, 124, 1, 240, 25, 218, 124, 1, 216, 86, 218, 124, 1, + 189, 218, 124, 1, 202, 233, 218, 124, 1, 240, 136, 218, 124, 1, 239, 176, + 218, 124, 1, 176, 218, 124, 1, 161, 218, 124, 1, 213, 6, 218, 124, 1, + 249, 145, 218, 124, 1, 248, 197, 218, 124, 1, 166, 218, 124, 1, 164, 218, + 124, 1, 169, 218, 124, 1, 172, 218, 124, 1, 199, 152, 218, 124, 1, 183, + 218, 124, 1, 142, 218, 124, 1, 209, 181, 218, 124, 1, 210, 77, 218, 124, + 208, 133, 78, 224, 107, 1, 63, 224, 107, 1, 252, 168, 224, 107, 1, 68, + 224, 107, 1, 226, 120, 224, 107, 1, 66, 224, 107, 1, 199, 245, 224, 107, + 1, 69, 224, 107, 1, 251, 200, 224, 107, 1, 72, 224, 107, 1, 250, 150, + 224, 107, 1, 155, 224, 107, 1, 224, 146, 224, 107, 1, 234, 123, 224, 107, + 1, 234, 10, 224, 107, 1, 233, 230, 224, 107, 1, 217, 71, 224, 107, 1, + 247, 174, 224, 107, 1, 247, 16, 224, 107, 1, 225, 214, 224, 107, 1, 225, + 158, 224, 107, 1, 225, 180, 224, 107, 1, 215, 109, 224, 107, 1, 201, 78, + 224, 107, 1, 201, 66, 224, 107, 1, 240, 41, 224, 107, 1, 240, 31, 224, + 107, 1, 209, 181, 224, 107, 1, 240, 25, 224, 107, 1, 216, 86, 224, 107, + 1, 189, 224, 107, 1, 202, 233, 224, 107, 1, 240, 136, 224, 107, 1, 239, + 176, 224, 107, 1, 176, 224, 107, 1, 161, 224, 107, 1, 213, 6, 224, 107, + 1, 249, 145, 224, 107, 1, 249, 45, 224, 107, 1, 248, 197, 224, 107, 1, + 166, 224, 107, 1, 164, 224, 107, 1, 169, 224, 107, 1, 172, 224, 107, 1, + 199, 152, 224, 107, 1, 207, 50, 224, 107, 1, 183, 224, 107, 1, 142, 224, + 107, 2, 251, 51, 224, 107, 18, 2, 252, 168, 224, 107, 18, 2, 68, 224, + 107, 18, 2, 226, 120, 224, 107, 18, 2, 66, 224, 107, 18, 2, 199, 245, + 224, 107, 18, 2, 69, 224, 107, 18, 2, 251, 200, 224, 107, 18, 2, 72, 224, + 107, 18, 2, 250, 150, 224, 107, 2, 215, 149, 224, 107, 2, 199, 7, 224, + 107, 17, 195, 79, 224, 107, 17, 100, 224, 107, 17, 102, 224, 107, 17, + 134, 224, 107, 17, 136, 224, 107, 17, 146, 224, 107, 17, 167, 224, 107, + 17, 178, 224, 107, 17, 171, 224, 107, 17, 182, 233, 109, 2, 38, 251, 52, + 57, 233, 109, 2, 247, 133, 233, 109, 2, 251, 51, 233, 109, 2, 199, 2, + 233, 109, 1, 63, 233, 109, 1, 252, 168, 233, 109, 1, 68, 233, 109, 1, + 226, 120, 233, 109, 1, 66, 233, 109, 1, 199, 245, 233, 109, 1, 110, 144, + 233, 109, 1, 110, 159, 233, 109, 1, 237, 54, 233, 109, 1, 251, 200, 233, + 109, 1, 214, 102, 233, 109, 1, 250, 150, 233, 109, 1, 155, 233, 109, 1, + 224, 146, 233, 109, 1, 234, 123, 233, 109, 1, 233, 230, 233, 109, 1, 217, + 71, 233, 109, 1, 247, 174, 233, 109, 1, 247, 16, 233, 109, 1, 225, 214, + 233, 109, 1, 225, 180, 233, 109, 1, 215, 109, 233, 109, 1, 201, 78, 233, + 109, 1, 201, 66, 233, 109, 1, 240, 41, 233, 109, 1, 240, 25, 233, 109, 1, + 216, 86, 233, 109, 1, 189, 233, 109, 1, 202, 233, 233, 109, 1, 240, 136, + 233, 109, 1, 239, 176, 233, 109, 1, 176, 233, 109, 1, 161, 233, 109, 1, + 213, 6, 233, 109, 1, 249, 145, 233, 109, 1, 248, 197, 233, 109, 1, 166, + 233, 109, 1, 164, 233, 109, 1, 169, 233, 109, 1, 172, 233, 109, 1, 222, + 37, 233, 109, 1, 199, 152, 233, 109, 1, 207, 50, 233, 109, 1, 205, 80, + 233, 109, 1, 183, 233, 109, 1, 142, 38, 248, 161, 60, 233, 109, 2, 215, + 149, 233, 109, 2, 250, 132, 233, 109, 18, 2, 252, 168, 233, 109, 18, 2, + 68, 233, 109, 18, 2, 226, 120, 233, 109, 18, 2, 66, 233, 109, 18, 2, 199, + 245, 233, 109, 18, 2, 110, 144, 233, 109, 18, 2, 110, 209, 182, 233, 109, + 18, 2, 237, 54, 233, 109, 18, 2, 251, 200, 233, 109, 18, 2, 214, 102, + 233, 109, 18, 2, 250, 150, 233, 109, 2, 199, 7, 233, 109, 214, 127, 233, + 109, 250, 151, 222, 158, 78, 233, 109, 2, 212, 123, 233, 109, 1, 199, + 115, 251, 51, 233, 109, 1, 199, 115, 52, 251, 51, 233, 109, 1, 110, 209, + 182, 233, 109, 1, 110, 222, 38, 233, 109, 18, 2, 110, 159, 233, 109, 18, + 2, 110, 222, 38, 38, 233, 109, 17, 195, 79, 38, 233, 109, 17, 100, 38, + 233, 109, 17, 102, 38, 233, 109, 17, 134, 38, 233, 109, 17, 136, 38, 233, + 109, 17, 146, 38, 233, 109, 17, 167, 38, 233, 109, 1, 63, 38, 233, 109, + 1, 155, 38, 233, 109, 1, 176, 38, 233, 109, 1, 199, 34, 38, 233, 109, 1, + 161, 217, 81, 1, 63, 217, 81, 1, 252, 168, 217, 81, 1, 68, 217, 81, 1, + 226, 120, 217, 81, 1, 66, 217, 81, 1, 199, 245, 217, 81, 1, 110, 144, + 217, 81, 1, 110, 209, 182, 217, 81, 1, 110, 159, 217, 81, 1, 110, 222, + 38, 217, 81, 1, 69, 217, 81, 1, 251, 200, 217, 81, 1, 72, 217, 81, 1, + 250, 150, 217, 81, 1, 155, 217, 81, 1, 224, 146, 217, 81, 1, 234, 123, + 217, 81, 1, 233, 230, 217, 81, 1, 217, 71, 217, 81, 1, 217, 20, 217, 81, + 1, 247, 174, 217, 81, 1, 247, 16, 217, 81, 1, 225, 214, 217, 81, 1, 225, + 180, 217, 81, 1, 215, 109, 217, 81, 1, 215, 91, 217, 81, 1, 201, 78, 217, + 81, 1, 201, 66, 217, 81, 1, 240, 41, 217, 81, 1, 240, 25, 217, 81, 1, + 216, 86, 217, 81, 1, 189, 217, 81, 1, 202, 233, 217, 81, 1, 240, 136, + 217, 81, 1, 239, 176, 217, 81, 1, 176, 217, 81, 1, 216, 227, 217, 81, 1, + 161, 217, 81, 1, 213, 6, 217, 81, 1, 249, 145, 217, 81, 1, 248, 197, 217, + 81, 1, 166, 217, 81, 1, 219, 81, 217, 81, 1, 164, 217, 81, 1, 169, 217, + 81, 1, 210, 77, 217, 81, 1, 172, 217, 81, 1, 222, 122, 217, 81, 1, 197, + 166, 217, 81, 1, 207, 50, 217, 81, 1, 205, 80, 217, 81, 1, 183, 217, 81, + 1, 142, 217, 81, 18, 2, 252, 168, 217, 81, 18, 2, 68, 217, 81, 18, 2, + 226, 120, 217, 81, 18, 2, 66, 217, 81, 18, 2, 199, 245, 217, 81, 18, 2, + 110, 144, 217, 81, 18, 2, 110, 209, 182, 217, 81, 18, 2, 110, 159, 217, + 81, 18, 2, 110, 222, 38, 217, 81, 18, 2, 69, 217, 81, 18, 2, 251, 200, + 217, 81, 18, 2, 72, 217, 81, 18, 2, 250, 150, 217, 81, 2, 199, 7, 217, + 81, 2, 247, 133, 217, 81, 2, 251, 51, 217, 81, 2, 199, 2, 217, 81, 2, + 215, 149, 217, 81, 2, 250, 132, 217, 81, 2, 48, 251, 51, 217, 81, 214, + 127, 217, 81, 206, 99, 217, 81, 240, 88, 217, 81, 52, 240, 88, 217, 81, + 244, 159, 217, 81, 234, 87, 235, 134, 217, 81, 252, 30, 55, 217, 81, 17, + 195, 79, 217, 81, 17, 100, 217, 81, 17, 102, 217, 81, 17, 134, 217, 81, + 17, 136, 217, 81, 17, 146, 217, 81, 17, 167, 217, 81, 17, 178, 217, 81, + 17, 171, 217, 81, 17, 182, 217, 81, 212, 148, 78, 217, 81, 226, 43, 55, + 217, 81, 208, 215, 78, 217, 81, 1, 199, 115, 251, 51, 202, 61, 251, 80, + 202, 61, 1, 63, 202, 61, 1, 252, 168, 202, 61, 1, 68, 202, 61, 1, 226, + 120, 202, 61, 1, 66, 202, 61, 1, 199, 245, 202, 61, 1, 110, 144, 202, 61, + 1, 110, 209, 182, 202, 61, 1, 110, 159, 202, 61, 1, 110, 222, 38, 202, + 61, 1, 69, 202, 61, 1, 251, 200, 202, 61, 1, 72, 202, 61, 1, 250, 150, + 202, 61, 1, 155, 202, 61, 1, 224, 146, 202, 61, 1, 234, 123, 202, 61, 1, + 233, 230, 202, 61, 1, 217, 71, 202, 61, 1, 247, 174, 202, 61, 1, 247, 16, + 202, 61, 1, 225, 214, 202, 61, 1, 225, 180, 202, 61, 1, 215, 109, 202, + 61, 1, 201, 78, 202, 61, 1, 201, 66, 202, 61, 1, 240, 41, 202, 61, 1, + 240, 25, 202, 61, 1, 216, 86, 202, 61, 1, 189, 202, 61, 1, 202, 233, 202, + 61, 1, 240, 136, 202, 61, 1, 239, 176, 202, 61, 1, 176, 202, 61, 1, 161, + 202, 61, 1, 213, 6, 202, 61, 1, 249, 145, 202, 61, 1, 248, 197, 202, 61, 1, 166, 202, 61, 1, 164, 202, 61, 1, 169, 202, 61, 1, 172, 202, 61, 1, 199, 152, 202, 61, 1, 207, 50, 202, 61, 1, 205, 80, 202, 61, 1, 183, 202, - 61, 1, 142, 202, 61, 18, 2, 252, 167, 202, 61, 18, 2, 68, 202, 61, 18, 2, - 226, 119, 202, 61, 18, 2, 66, 202, 61, 18, 2, 199, 245, 202, 61, 18, 2, + 61, 1, 142, 202, 61, 18, 2, 252, 168, 202, 61, 18, 2, 68, 202, 61, 18, 2, + 226, 120, 202, 61, 18, 2, 66, 202, 61, 18, 2, 199, 245, 202, 61, 18, 2, 110, 144, 202, 61, 18, 2, 110, 209, 182, 202, 61, 18, 2, 110, 159, 202, - 61, 18, 2, 110, 222, 37, 202, 61, 18, 2, 69, 202, 61, 18, 2, 206, 182, - 69, 202, 61, 18, 2, 251, 199, 202, 61, 18, 2, 72, 202, 61, 18, 2, 206, - 182, 72, 202, 61, 18, 2, 250, 149, 202, 61, 2, 247, 132, 202, 61, 2, 251, - 50, 202, 61, 2, 199, 2, 202, 61, 2, 199, 7, 202, 61, 2, 215, 148, 202, - 61, 2, 250, 131, 202, 61, 233, 34, 202, 61, 252, 29, 55, 202, 61, 214, - 126, 202, 61, 17, 195, 79, 202, 61, 17, 100, 202, 61, 17, 102, 202, 61, + 61, 18, 2, 110, 222, 38, 202, 61, 18, 2, 69, 202, 61, 18, 2, 206, 182, + 69, 202, 61, 18, 2, 251, 200, 202, 61, 18, 2, 72, 202, 61, 18, 2, 206, + 182, 72, 202, 61, 18, 2, 250, 150, 202, 61, 2, 247, 133, 202, 61, 2, 251, + 51, 202, 61, 2, 199, 2, 202, 61, 2, 199, 7, 202, 61, 2, 215, 149, 202, + 61, 2, 250, 132, 202, 61, 233, 35, 202, 61, 252, 30, 55, 202, 61, 214, + 127, 202, 61, 17, 195, 79, 202, 61, 17, 100, 202, 61, 17, 102, 202, 61, 17, 134, 202, 61, 17, 136, 202, 61, 17, 146, 202, 61, 17, 167, 202, 61, 17, 178, 202, 61, 17, 171, 202, 61, 17, 182, 206, 101, 1, 63, 206, 101, - 1, 252, 167, 206, 101, 1, 68, 206, 101, 1, 226, 119, 206, 101, 1, 66, + 1, 252, 168, 206, 101, 1, 68, 206, 101, 1, 226, 120, 206, 101, 1, 66, 206, 101, 1, 199, 245, 206, 101, 1, 110, 144, 206, 101, 1, 110, 209, 182, - 206, 101, 1, 110, 159, 206, 101, 1, 110, 222, 37, 206, 101, 1, 69, 206, - 101, 1, 251, 199, 206, 101, 1, 72, 206, 101, 1, 250, 149, 206, 101, 1, - 155, 206, 101, 1, 224, 145, 206, 101, 1, 234, 122, 206, 101, 1, 233, 229, - 206, 101, 1, 217, 70, 206, 101, 1, 247, 173, 206, 101, 1, 247, 15, 206, - 101, 1, 225, 213, 206, 101, 1, 225, 179, 206, 101, 1, 215, 108, 206, 101, - 1, 201, 78, 206, 101, 1, 201, 66, 206, 101, 1, 240, 40, 206, 101, 1, 240, - 24, 206, 101, 1, 216, 85, 206, 101, 1, 189, 206, 101, 1, 202, 233, 206, - 101, 1, 240, 135, 206, 101, 1, 239, 175, 206, 101, 1, 176, 206, 101, 1, - 161, 206, 101, 1, 213, 5, 206, 101, 1, 249, 144, 206, 101, 1, 248, 196, + 206, 101, 1, 110, 159, 206, 101, 1, 110, 222, 38, 206, 101, 1, 69, 206, + 101, 1, 251, 200, 206, 101, 1, 72, 206, 101, 1, 250, 150, 206, 101, 1, + 155, 206, 101, 1, 224, 146, 206, 101, 1, 234, 123, 206, 101, 1, 233, 230, + 206, 101, 1, 217, 71, 206, 101, 1, 247, 174, 206, 101, 1, 247, 16, 206, + 101, 1, 225, 214, 206, 101, 1, 225, 180, 206, 101, 1, 215, 109, 206, 101, + 1, 201, 78, 206, 101, 1, 201, 66, 206, 101, 1, 240, 41, 206, 101, 1, 240, + 25, 206, 101, 1, 216, 86, 206, 101, 1, 189, 206, 101, 1, 202, 233, 206, + 101, 1, 240, 136, 206, 101, 1, 239, 176, 206, 101, 1, 176, 206, 101, 1, + 161, 206, 101, 1, 213, 6, 206, 101, 1, 249, 145, 206, 101, 1, 248, 197, 206, 101, 1, 166, 206, 101, 1, 164, 206, 101, 1, 169, 206, 101, 1, 172, 206, 101, 1, 199, 152, 206, 101, 1, 207, 50, 206, 101, 1, 205, 80, 206, - 101, 1, 183, 206, 101, 1, 142, 206, 101, 18, 2, 252, 167, 206, 101, 18, - 2, 68, 206, 101, 18, 2, 226, 119, 206, 101, 18, 2, 66, 206, 101, 18, 2, + 101, 1, 183, 206, 101, 1, 142, 206, 101, 18, 2, 252, 168, 206, 101, 18, + 2, 68, 206, 101, 18, 2, 226, 120, 206, 101, 18, 2, 66, 206, 101, 18, 2, 199, 245, 206, 101, 18, 2, 110, 144, 206, 101, 18, 2, 110, 209, 182, 206, - 101, 18, 2, 69, 206, 101, 18, 2, 251, 199, 206, 101, 18, 2, 72, 206, 101, - 18, 2, 250, 149, 206, 101, 2, 247, 132, 206, 101, 2, 251, 50, 206, 101, - 2, 199, 2, 206, 101, 2, 199, 7, 206, 101, 2, 215, 148, 206, 101, 2, 206, - 100, 206, 101, 240, 87, 206, 101, 52, 240, 87, 206, 101, 207, 91, 238, - 252, 206, 101, 207, 91, 154, 206, 101, 210, 117, 220, 27, 206, 101, 210, - 117, 220, 26, 206, 101, 210, 117, 220, 25, 206, 101, 236, 221, 77, 202, - 238, 78, 206, 101, 208, 133, 117, 3, 201, 175, 26, 200, 167, 214, 57, - 206, 101, 208, 133, 117, 3, 201, 175, 26, 237, 249, 241, 69, 206, 101, - 208, 133, 117, 3, 210, 188, 26, 237, 249, 241, 69, 206, 101, 208, 133, - 117, 3, 210, 188, 26, 237, 249, 52, 241, 69, 206, 101, 208, 133, 117, 3, - 210, 188, 26, 237, 249, 201, 165, 241, 69, 206, 101, 208, 133, 117, 52, - 210, 2, 206, 101, 208, 133, 117, 52, 210, 3, 3, 210, 187, 206, 101, 208, - 133, 117, 3, 52, 241, 69, 206, 101, 208, 133, 117, 3, 201, 165, 241, 69, - 206, 101, 208, 133, 117, 3, 211, 89, 241, 69, 206, 101, 208, 133, 117, 3, - 207, 88, 241, 69, 206, 101, 208, 133, 117, 3, 244, 246, 26, 210, 187, - 206, 101, 208, 133, 117, 3, 244, 246, 26, 99, 236, 223, 206, 101, 208, - 133, 117, 3, 244, 246, 26, 235, 6, 236, 223, 206, 101, 1, 202, 155, 251, - 130, 68, 206, 101, 1, 200, 217, 251, 130, 68, 206, 101, 1, 200, 217, 251, - 130, 226, 119, 206, 101, 1, 251, 130, 66, 206, 101, 18, 2, 251, 130, 66, - 206, 101, 18, 2, 251, 130, 199, 245, 218, 235, 1, 63, 218, 235, 1, 252, - 167, 218, 235, 1, 68, 218, 235, 1, 226, 119, 218, 235, 1, 66, 218, 235, - 1, 199, 245, 218, 235, 1, 110, 144, 218, 235, 1, 110, 209, 182, 218, 235, - 1, 110, 159, 218, 235, 1, 110, 222, 37, 218, 235, 1, 69, 218, 235, 1, - 251, 199, 218, 235, 1, 72, 218, 235, 1, 250, 149, 218, 235, 1, 155, 218, - 235, 1, 224, 145, 218, 235, 1, 234, 122, 218, 235, 1, 233, 229, 218, 235, - 1, 217, 70, 218, 235, 1, 247, 173, 218, 235, 1, 247, 15, 218, 235, 1, - 225, 213, 218, 235, 1, 225, 179, 218, 235, 1, 215, 108, 218, 235, 1, 201, - 78, 218, 235, 1, 201, 66, 218, 235, 1, 240, 40, 218, 235, 1, 240, 24, - 218, 235, 1, 216, 85, 218, 235, 1, 189, 218, 235, 1, 202, 233, 218, 235, - 1, 240, 135, 218, 235, 1, 239, 175, 218, 235, 1, 176, 218, 235, 1, 161, - 218, 235, 1, 213, 5, 218, 235, 1, 249, 144, 218, 235, 1, 248, 196, 218, - 235, 1, 166, 218, 235, 1, 164, 218, 235, 1, 169, 218, 235, 1, 172, 218, - 235, 1, 199, 152, 218, 235, 1, 207, 50, 218, 235, 1, 205, 80, 218, 235, - 1, 183, 218, 235, 1, 142, 218, 235, 1, 222, 36, 218, 235, 18, 2, 252, - 167, 218, 235, 18, 2, 68, 218, 235, 18, 2, 226, 119, 218, 235, 18, 2, 66, - 218, 235, 18, 2, 199, 245, 218, 235, 18, 2, 110, 144, 218, 235, 18, 2, - 110, 209, 182, 218, 235, 18, 2, 110, 159, 218, 235, 18, 2, 110, 222, 37, - 218, 235, 18, 2, 69, 218, 235, 18, 2, 251, 199, 218, 235, 18, 2, 72, 218, - 235, 18, 2, 250, 149, 218, 235, 2, 251, 50, 218, 235, 2, 199, 2, 218, - 235, 2, 199, 7, 218, 235, 2, 250, 247, 218, 235, 240, 87, 218, 235, 52, - 240, 87, 218, 235, 252, 29, 55, 218, 235, 2, 231, 44, 218, 235, 17, 195, - 79, 218, 235, 17, 100, 218, 235, 17, 102, 218, 235, 17, 134, 218, 235, - 17, 136, 218, 235, 17, 146, 218, 235, 17, 167, 218, 235, 17, 178, 218, - 235, 17, 171, 218, 235, 17, 182, 96, 248, 154, 3, 214, 58, 96, 209, 194, - 248, 153, 96, 52, 248, 154, 3, 214, 58, 96, 201, 165, 248, 154, 3, 214, - 58, 96, 248, 154, 3, 52, 214, 58, 96, 209, 194, 248, 154, 3, 214, 58, 96, - 209, 194, 248, 154, 3, 52, 214, 58, 96, 226, 16, 248, 153, 96, 226, 16, - 248, 154, 3, 52, 214, 58, 96, 204, 51, 248, 153, 96, 204, 51, 248, 154, - 3, 214, 58, 96, 204, 51, 248, 154, 3, 52, 214, 58, 96, 163, 204, 51, 248, - 154, 3, 52, 214, 58, 203, 125, 1, 63, 203, 125, 1, 252, 167, 203, 125, 1, - 68, 203, 125, 1, 226, 119, 203, 125, 1, 66, 203, 125, 1, 199, 245, 203, - 125, 1, 69, 203, 125, 1, 251, 199, 203, 125, 1, 72, 203, 125, 1, 250, - 149, 203, 125, 1, 155, 203, 125, 1, 224, 145, 203, 125, 1, 234, 122, 203, - 125, 1, 233, 229, 203, 125, 1, 217, 70, 203, 125, 1, 247, 173, 203, 125, - 1, 247, 15, 203, 125, 1, 225, 213, 203, 125, 1, 225, 179, 203, 125, 1, - 215, 108, 203, 125, 1, 201, 78, 203, 125, 1, 201, 66, 203, 125, 1, 240, - 40, 203, 125, 1, 240, 24, 203, 125, 1, 216, 85, 203, 125, 1, 189, 203, - 125, 1, 202, 233, 203, 125, 1, 240, 135, 203, 125, 1, 239, 175, 203, 125, - 1, 176, 203, 125, 1, 161, 203, 125, 1, 213, 5, 203, 125, 1, 249, 144, - 203, 125, 1, 248, 196, 203, 125, 1, 166, 203, 125, 1, 164, 203, 125, 1, + 101, 18, 2, 69, 206, 101, 18, 2, 251, 200, 206, 101, 18, 2, 72, 206, 101, + 18, 2, 250, 150, 206, 101, 2, 247, 133, 206, 101, 2, 251, 51, 206, 101, + 2, 199, 2, 206, 101, 2, 199, 7, 206, 101, 2, 215, 149, 206, 101, 2, 206, + 100, 206, 101, 240, 88, 206, 101, 52, 240, 88, 206, 101, 207, 91, 238, + 253, 206, 101, 207, 91, 154, 206, 101, 210, 117, 220, 28, 206, 101, 210, + 117, 220, 27, 206, 101, 210, 117, 220, 26, 206, 101, 236, 222, 77, 202, + 238, 78, 206, 101, 208, 133, 117, 3, 201, 175, 26, 200, 167, 214, 58, + 206, 101, 208, 133, 117, 3, 201, 175, 26, 237, 250, 241, 70, 206, 101, + 208, 133, 117, 3, 210, 189, 26, 237, 250, 241, 70, 206, 101, 208, 133, + 117, 3, 210, 189, 26, 237, 250, 52, 241, 70, 206, 101, 208, 133, 117, 3, + 210, 189, 26, 237, 250, 201, 165, 241, 70, 206, 101, 208, 133, 117, 52, + 210, 2, 206, 101, 208, 133, 117, 52, 210, 3, 3, 210, 188, 206, 101, 208, + 133, 117, 3, 52, 241, 70, 206, 101, 208, 133, 117, 3, 201, 165, 241, 70, + 206, 101, 208, 133, 117, 3, 211, 90, 241, 70, 206, 101, 208, 133, 117, 3, + 207, 88, 241, 70, 206, 101, 208, 133, 117, 3, 244, 247, 26, 210, 188, + 206, 101, 208, 133, 117, 3, 244, 247, 26, 99, 236, 224, 206, 101, 208, + 133, 117, 3, 244, 247, 26, 235, 7, 236, 224, 206, 101, 1, 202, 155, 251, + 131, 68, 206, 101, 1, 200, 217, 251, 131, 68, 206, 101, 1, 200, 217, 251, + 131, 226, 120, 206, 101, 1, 251, 131, 66, 206, 101, 18, 2, 251, 131, 66, + 206, 101, 18, 2, 251, 131, 199, 245, 218, 236, 1, 63, 218, 236, 1, 252, + 168, 218, 236, 1, 68, 218, 236, 1, 226, 120, 218, 236, 1, 66, 218, 236, + 1, 199, 245, 218, 236, 1, 110, 144, 218, 236, 1, 110, 209, 182, 218, 236, + 1, 110, 159, 218, 236, 1, 110, 222, 38, 218, 236, 1, 69, 218, 236, 1, + 251, 200, 218, 236, 1, 72, 218, 236, 1, 250, 150, 218, 236, 1, 155, 218, + 236, 1, 224, 146, 218, 236, 1, 234, 123, 218, 236, 1, 233, 230, 218, 236, + 1, 217, 71, 218, 236, 1, 247, 174, 218, 236, 1, 247, 16, 218, 236, 1, + 225, 214, 218, 236, 1, 225, 180, 218, 236, 1, 215, 109, 218, 236, 1, 201, + 78, 218, 236, 1, 201, 66, 218, 236, 1, 240, 41, 218, 236, 1, 240, 25, + 218, 236, 1, 216, 86, 218, 236, 1, 189, 218, 236, 1, 202, 233, 218, 236, + 1, 240, 136, 218, 236, 1, 239, 176, 218, 236, 1, 176, 218, 236, 1, 161, + 218, 236, 1, 213, 6, 218, 236, 1, 249, 145, 218, 236, 1, 248, 197, 218, + 236, 1, 166, 218, 236, 1, 164, 218, 236, 1, 169, 218, 236, 1, 172, 218, + 236, 1, 199, 152, 218, 236, 1, 207, 50, 218, 236, 1, 205, 80, 218, 236, + 1, 183, 218, 236, 1, 142, 218, 236, 1, 222, 37, 218, 236, 18, 2, 252, + 168, 218, 236, 18, 2, 68, 218, 236, 18, 2, 226, 120, 218, 236, 18, 2, 66, + 218, 236, 18, 2, 199, 245, 218, 236, 18, 2, 110, 144, 218, 236, 18, 2, + 110, 209, 182, 218, 236, 18, 2, 110, 159, 218, 236, 18, 2, 110, 222, 38, + 218, 236, 18, 2, 69, 218, 236, 18, 2, 251, 200, 218, 236, 18, 2, 72, 218, + 236, 18, 2, 250, 150, 218, 236, 2, 251, 51, 218, 236, 2, 199, 2, 218, + 236, 2, 199, 7, 218, 236, 2, 250, 248, 218, 236, 240, 88, 218, 236, 52, + 240, 88, 218, 236, 252, 30, 55, 218, 236, 2, 231, 45, 218, 236, 17, 195, + 79, 218, 236, 17, 100, 218, 236, 17, 102, 218, 236, 17, 134, 218, 236, + 17, 136, 218, 236, 17, 146, 218, 236, 17, 167, 218, 236, 17, 178, 218, + 236, 17, 171, 218, 236, 17, 182, 96, 248, 155, 3, 214, 59, 96, 209, 194, + 248, 154, 96, 52, 248, 155, 3, 214, 59, 96, 201, 165, 248, 155, 3, 214, + 59, 96, 248, 155, 3, 52, 214, 59, 96, 209, 194, 248, 155, 3, 214, 59, 96, + 209, 194, 248, 155, 3, 52, 214, 59, 96, 226, 17, 248, 154, 96, 226, 17, + 248, 155, 3, 52, 214, 59, 96, 204, 51, 248, 154, 96, 204, 51, 248, 155, + 3, 214, 59, 96, 204, 51, 248, 155, 3, 52, 214, 59, 96, 163, 204, 51, 248, + 155, 3, 52, 214, 59, 203, 125, 1, 63, 203, 125, 1, 252, 168, 203, 125, 1, + 68, 203, 125, 1, 226, 120, 203, 125, 1, 66, 203, 125, 1, 199, 245, 203, + 125, 1, 69, 203, 125, 1, 251, 200, 203, 125, 1, 72, 203, 125, 1, 250, + 150, 203, 125, 1, 155, 203, 125, 1, 224, 146, 203, 125, 1, 234, 123, 203, + 125, 1, 233, 230, 203, 125, 1, 217, 71, 203, 125, 1, 247, 174, 203, 125, + 1, 247, 16, 203, 125, 1, 225, 214, 203, 125, 1, 225, 180, 203, 125, 1, + 215, 109, 203, 125, 1, 201, 78, 203, 125, 1, 201, 66, 203, 125, 1, 240, + 41, 203, 125, 1, 240, 25, 203, 125, 1, 216, 86, 203, 125, 1, 189, 203, + 125, 1, 202, 233, 203, 125, 1, 240, 136, 203, 125, 1, 239, 176, 203, 125, + 1, 176, 203, 125, 1, 161, 203, 125, 1, 213, 6, 203, 125, 1, 249, 145, + 203, 125, 1, 248, 197, 203, 125, 1, 166, 203, 125, 1, 164, 203, 125, 1, 169, 203, 125, 1, 172, 203, 125, 1, 199, 152, 203, 125, 1, 207, 50, 203, 125, 1, 183, 203, 125, 1, 142, 203, 125, 1, 209, 181, 203, 125, 2, 251, - 50, 203, 125, 2, 199, 2, 203, 125, 18, 2, 252, 167, 203, 125, 18, 2, 68, - 203, 125, 18, 2, 226, 119, 203, 125, 18, 2, 66, 203, 125, 18, 2, 199, - 245, 203, 125, 18, 2, 69, 203, 125, 18, 2, 251, 199, 203, 125, 18, 2, 72, - 203, 125, 18, 2, 250, 149, 203, 125, 2, 199, 7, 203, 125, 2, 215, 148, - 203, 125, 1, 250, 250, 224, 145, 203, 125, 17, 195, 79, 203, 125, 17, + 51, 203, 125, 2, 199, 2, 203, 125, 18, 2, 252, 168, 203, 125, 18, 2, 68, + 203, 125, 18, 2, 226, 120, 203, 125, 18, 2, 66, 203, 125, 18, 2, 199, + 245, 203, 125, 18, 2, 69, 203, 125, 18, 2, 251, 200, 203, 125, 18, 2, 72, + 203, 125, 18, 2, 250, 150, 203, 125, 2, 199, 7, 203, 125, 2, 215, 149, + 203, 125, 1, 250, 251, 224, 146, 203, 125, 17, 195, 79, 203, 125, 17, 100, 203, 125, 17, 102, 203, 125, 17, 134, 203, 125, 17, 136, 203, 125, 17, 146, 203, 125, 17, 167, 203, 125, 17, 178, 203, 125, 17, 171, 203, - 125, 17, 182, 251, 203, 1, 155, 251, 203, 1, 224, 145, 251, 203, 1, 217, - 70, 251, 203, 1, 176, 251, 203, 1, 189, 251, 203, 1, 251, 130, 189, 251, - 203, 1, 161, 251, 203, 1, 213, 5, 251, 203, 1, 249, 144, 251, 203, 1, - 166, 251, 203, 1, 225, 213, 251, 203, 1, 247, 15, 251, 203, 1, 202, 233, - 251, 203, 1, 169, 251, 203, 1, 172, 251, 203, 1, 183, 251, 203, 1, 215, - 108, 251, 203, 1, 142, 251, 203, 1, 63, 251, 203, 1, 240, 135, 251, 203, - 1, 239, 175, 251, 203, 1, 234, 122, 251, 203, 1, 251, 130, 234, 122, 251, - 203, 1, 233, 229, 251, 203, 1, 248, 196, 251, 203, 1, 225, 179, 251, 203, - 1, 251, 130, 249, 144, 251, 203, 108, 2, 219, 193, 172, 251, 203, 108, 2, - 219, 193, 169, 251, 203, 108, 2, 219, 193, 222, 95, 169, 251, 203, 18, 2, - 63, 251, 203, 18, 2, 252, 167, 251, 203, 18, 2, 68, 251, 203, 18, 2, 226, - 119, 251, 203, 18, 2, 66, 251, 203, 18, 2, 199, 245, 251, 203, 18, 2, 69, - 251, 203, 18, 2, 250, 126, 251, 203, 18, 2, 72, 251, 203, 18, 2, 251, - 199, 251, 203, 18, 2, 251, 122, 251, 203, 2, 224, 77, 251, 203, 17, 195, - 79, 251, 203, 17, 100, 251, 203, 17, 102, 251, 203, 17, 134, 251, 203, - 17, 136, 251, 203, 17, 146, 251, 203, 17, 167, 251, 203, 17, 178, 251, - 203, 17, 171, 251, 203, 17, 182, 251, 203, 31, 203, 23, 251, 203, 31, - 200, 234, 251, 203, 2, 4, 208, 132, 251, 203, 2, 208, 132, 251, 203, 2, - 209, 125, 251, 203, 16, 199, 34, 239, 15, 1, 63, 239, 15, 1, 252, 167, - 239, 15, 1, 68, 239, 15, 1, 226, 119, 239, 15, 1, 66, 239, 15, 1, 199, - 245, 239, 15, 1, 69, 239, 15, 1, 251, 199, 239, 15, 1, 72, 239, 15, 1, - 250, 149, 239, 15, 1, 155, 239, 15, 1, 224, 145, 239, 15, 1, 234, 122, - 239, 15, 1, 233, 229, 239, 15, 1, 217, 70, 239, 15, 1, 247, 173, 239, 15, - 1, 247, 15, 239, 15, 1, 225, 213, 239, 15, 1, 225, 179, 239, 15, 1, 215, - 108, 239, 15, 1, 201, 78, 239, 15, 1, 201, 66, 239, 15, 1, 240, 40, 239, - 15, 1, 240, 24, 239, 15, 1, 216, 85, 239, 15, 1, 189, 239, 15, 1, 202, - 233, 239, 15, 1, 240, 135, 239, 15, 1, 239, 175, 239, 15, 1, 176, 239, - 15, 1, 161, 239, 15, 1, 213, 5, 239, 15, 1, 249, 144, 239, 15, 1, 248, - 196, 239, 15, 1, 166, 239, 15, 1, 164, 239, 15, 1, 169, 239, 15, 1, 172, - 239, 15, 1, 199, 152, 239, 15, 1, 207, 50, 239, 15, 1, 205, 80, 239, 15, - 1, 183, 239, 15, 1, 142, 239, 15, 1, 209, 181, 239, 15, 18, 2, 252, 167, - 239, 15, 18, 2, 68, 239, 15, 18, 2, 226, 119, 239, 15, 18, 2, 66, 239, - 15, 18, 2, 199, 245, 239, 15, 18, 2, 110, 144, 239, 15, 18, 2, 110, 209, - 182, 239, 15, 18, 2, 69, 239, 15, 18, 2, 251, 199, 239, 15, 18, 2, 72, - 239, 15, 18, 2, 250, 149, 239, 15, 2, 251, 50, 239, 15, 2, 199, 2, 239, - 15, 2, 199, 7, 239, 15, 2, 215, 148, 239, 15, 252, 29, 55, 197, 139, 244, - 235, 6, 1, 217, 69, 197, 139, 244, 235, 6, 1, 63, 197, 139, 244, 235, 6, - 1, 197, 70, 197, 139, 244, 235, 6, 1, 195, 217, 197, 139, 244, 235, 6, 1, - 164, 197, 139, 244, 235, 6, 1, 196, 3, 197, 139, 244, 235, 6, 1, 226, - 119, 197, 139, 244, 235, 6, 1, 199, 245, 197, 139, 244, 235, 6, 1, 69, - 197, 139, 244, 235, 6, 1, 72, 197, 139, 244, 235, 6, 1, 251, 96, 197, - 139, 244, 235, 6, 1, 234, 122, 197, 139, 244, 235, 6, 1, 224, 10, 197, - 139, 244, 235, 6, 1, 236, 192, 197, 139, 244, 235, 6, 1, 195, 196, 197, - 139, 244, 235, 6, 1, 200, 106, 197, 139, 244, 235, 6, 1, 236, 211, 197, - 139, 244, 235, 6, 1, 214, 166, 197, 139, 244, 235, 6, 1, 201, 73, 197, - 139, 244, 235, 6, 1, 215, 134, 197, 139, 244, 235, 6, 1, 240, 135, 197, - 139, 244, 235, 6, 1, 250, 167, 197, 139, 244, 235, 6, 1, 251, 122, 197, - 139, 244, 235, 6, 1, 248, 20, 197, 139, 244, 235, 6, 1, 211, 226, 197, - 139, 244, 235, 6, 1, 232, 28, 197, 139, 244, 235, 6, 1, 231, 172, 197, - 139, 244, 235, 6, 1, 231, 99, 197, 139, 244, 235, 6, 1, 232, 174, 197, - 139, 244, 235, 6, 1, 205, 31, 197, 139, 244, 235, 6, 1, 206, 84, 197, - 139, 244, 235, 6, 1, 198, 249, 197, 139, 244, 235, 4, 1, 217, 69, 197, - 139, 244, 235, 4, 1, 63, 197, 139, 244, 235, 4, 1, 197, 70, 197, 139, - 244, 235, 4, 1, 195, 217, 197, 139, 244, 235, 4, 1, 164, 197, 139, 244, - 235, 4, 1, 196, 3, 197, 139, 244, 235, 4, 1, 226, 119, 197, 139, 244, - 235, 4, 1, 199, 245, 197, 139, 244, 235, 4, 1, 69, 197, 139, 244, 235, 4, - 1, 72, 197, 139, 244, 235, 4, 1, 251, 96, 197, 139, 244, 235, 4, 1, 234, - 122, 197, 139, 244, 235, 4, 1, 224, 10, 197, 139, 244, 235, 4, 1, 236, - 192, 197, 139, 244, 235, 4, 1, 195, 196, 197, 139, 244, 235, 4, 1, 200, - 106, 197, 139, 244, 235, 4, 1, 236, 211, 197, 139, 244, 235, 4, 1, 214, - 166, 197, 139, 244, 235, 4, 1, 201, 73, 197, 139, 244, 235, 4, 1, 215, - 134, 197, 139, 244, 235, 4, 1, 240, 135, 197, 139, 244, 235, 4, 1, 250, - 167, 197, 139, 244, 235, 4, 1, 251, 122, 197, 139, 244, 235, 4, 1, 248, - 20, 197, 139, 244, 235, 4, 1, 211, 226, 197, 139, 244, 235, 4, 1, 232, - 28, 197, 139, 244, 235, 4, 1, 231, 172, 197, 139, 244, 235, 4, 1, 231, - 99, 197, 139, 244, 235, 4, 1, 232, 174, 197, 139, 244, 235, 4, 1, 205, - 31, 197, 139, 244, 235, 4, 1, 206, 84, 197, 139, 244, 235, 4, 1, 198, - 249, 197, 139, 244, 235, 17, 195, 79, 197, 139, 244, 235, 17, 100, 197, - 139, 244, 235, 17, 102, 197, 139, 244, 235, 17, 134, 197, 139, 244, 235, - 17, 136, 197, 139, 244, 235, 17, 146, 197, 139, 244, 235, 17, 167, 197, - 139, 244, 235, 17, 178, 197, 139, 244, 235, 17, 171, 197, 139, 244, 235, - 17, 182, 197, 139, 244, 235, 31, 203, 23, 197, 139, 244, 235, 31, 200, - 234, 197, 139, 244, 235, 31, 202, 177, 197, 139, 244, 235, 31, 235, 13, - 197, 139, 244, 235, 31, 235, 144, 197, 139, 244, 235, 31, 206, 13, 197, - 139, 244, 235, 31, 207, 65, 197, 139, 244, 235, 31, 237, 19, 197, 139, - 244, 235, 31, 216, 173, 197, 139, 244, 235, 214, 126, 217, 217, 1, 63, - 217, 217, 1, 252, 167, 217, 217, 1, 68, 217, 217, 1, 226, 119, 217, 217, - 1, 66, 217, 217, 1, 199, 245, 217, 217, 1, 110, 144, 217, 217, 1, 110, - 209, 182, 217, 217, 1, 69, 217, 217, 1, 251, 199, 217, 217, 1, 72, 217, - 217, 1, 250, 149, 217, 217, 1, 155, 217, 217, 1, 224, 145, 217, 217, 1, - 234, 122, 217, 217, 1, 233, 229, 217, 217, 1, 217, 70, 217, 217, 1, 247, - 173, 217, 217, 1, 247, 15, 217, 217, 1, 225, 213, 217, 217, 1, 225, 179, - 217, 217, 1, 215, 108, 217, 217, 1, 201, 78, 217, 217, 1, 201, 66, 217, - 217, 1, 240, 40, 217, 217, 1, 240, 24, 217, 217, 1, 216, 85, 217, 217, 1, - 189, 217, 217, 1, 202, 233, 217, 217, 1, 240, 135, 217, 217, 1, 239, 175, - 217, 217, 1, 176, 217, 217, 1, 161, 217, 217, 1, 213, 5, 217, 217, 1, - 249, 144, 217, 217, 1, 248, 196, 217, 217, 1, 166, 217, 217, 1, 164, 217, - 217, 1, 169, 217, 217, 1, 172, 217, 217, 1, 199, 152, 217, 217, 1, 207, - 50, 217, 217, 1, 205, 80, 217, 217, 1, 183, 217, 217, 1, 142, 217, 217, - 1, 222, 36, 217, 217, 1, 209, 181, 217, 217, 18, 2, 252, 167, 217, 217, - 18, 2, 68, 217, 217, 18, 2, 226, 119, 217, 217, 18, 2, 66, 217, 217, 18, - 2, 199, 245, 217, 217, 18, 2, 110, 144, 217, 217, 18, 2, 110, 209, 182, - 217, 217, 18, 2, 69, 217, 217, 18, 2, 251, 199, 217, 217, 18, 2, 72, 217, - 217, 18, 2, 250, 149, 217, 217, 2, 251, 50, 217, 217, 2, 199, 2, 217, - 217, 2, 199, 7, 217, 217, 2, 250, 131, 217, 217, 2, 206, 100, 217, 217, - 232, 129, 217, 217, 18, 2, 212, 10, 69, 195, 102, 47, 1, 63, 195, 102, + 125, 17, 182, 251, 204, 1, 155, 251, 204, 1, 224, 146, 251, 204, 1, 217, + 71, 251, 204, 1, 176, 251, 204, 1, 189, 251, 204, 1, 251, 131, 189, 251, + 204, 1, 161, 251, 204, 1, 213, 6, 251, 204, 1, 249, 145, 251, 204, 1, + 166, 251, 204, 1, 225, 214, 251, 204, 1, 247, 16, 251, 204, 1, 202, 233, + 251, 204, 1, 169, 251, 204, 1, 172, 251, 204, 1, 183, 251, 204, 1, 215, + 109, 251, 204, 1, 142, 251, 204, 1, 63, 251, 204, 1, 240, 136, 251, 204, + 1, 239, 176, 251, 204, 1, 234, 123, 251, 204, 1, 251, 131, 234, 123, 251, + 204, 1, 233, 230, 251, 204, 1, 248, 197, 251, 204, 1, 225, 180, 251, 204, + 1, 251, 131, 249, 145, 251, 204, 108, 2, 219, 194, 172, 251, 204, 108, 2, + 219, 194, 169, 251, 204, 108, 2, 219, 194, 222, 96, 169, 251, 204, 18, 2, + 63, 251, 204, 18, 2, 252, 168, 251, 204, 18, 2, 68, 251, 204, 18, 2, 226, + 120, 251, 204, 18, 2, 66, 251, 204, 18, 2, 199, 245, 251, 204, 18, 2, 69, + 251, 204, 18, 2, 250, 127, 251, 204, 18, 2, 72, 251, 204, 18, 2, 251, + 200, 251, 204, 18, 2, 251, 123, 251, 204, 2, 224, 78, 251, 204, 17, 195, + 79, 251, 204, 17, 100, 251, 204, 17, 102, 251, 204, 17, 134, 251, 204, + 17, 136, 251, 204, 17, 146, 251, 204, 17, 167, 251, 204, 17, 178, 251, + 204, 17, 171, 251, 204, 17, 182, 251, 204, 31, 203, 23, 251, 204, 31, + 200, 234, 251, 204, 2, 4, 208, 132, 251, 204, 2, 208, 132, 251, 204, 2, + 209, 125, 251, 204, 16, 199, 34, 239, 16, 1, 63, 239, 16, 1, 252, 168, + 239, 16, 1, 68, 239, 16, 1, 226, 120, 239, 16, 1, 66, 239, 16, 1, 199, + 245, 239, 16, 1, 69, 239, 16, 1, 251, 200, 239, 16, 1, 72, 239, 16, 1, + 250, 150, 239, 16, 1, 155, 239, 16, 1, 224, 146, 239, 16, 1, 234, 123, + 239, 16, 1, 233, 230, 239, 16, 1, 217, 71, 239, 16, 1, 247, 174, 239, 16, + 1, 247, 16, 239, 16, 1, 225, 214, 239, 16, 1, 225, 180, 239, 16, 1, 215, + 109, 239, 16, 1, 201, 78, 239, 16, 1, 201, 66, 239, 16, 1, 240, 41, 239, + 16, 1, 240, 25, 239, 16, 1, 216, 86, 239, 16, 1, 189, 239, 16, 1, 202, + 233, 239, 16, 1, 240, 136, 239, 16, 1, 239, 176, 239, 16, 1, 176, 239, + 16, 1, 161, 239, 16, 1, 213, 6, 239, 16, 1, 249, 145, 239, 16, 1, 248, + 197, 239, 16, 1, 166, 239, 16, 1, 164, 239, 16, 1, 169, 239, 16, 1, 172, + 239, 16, 1, 199, 152, 239, 16, 1, 207, 50, 239, 16, 1, 205, 80, 239, 16, + 1, 183, 239, 16, 1, 142, 239, 16, 1, 209, 181, 239, 16, 18, 2, 252, 168, + 239, 16, 18, 2, 68, 239, 16, 18, 2, 226, 120, 239, 16, 18, 2, 66, 239, + 16, 18, 2, 199, 245, 239, 16, 18, 2, 110, 144, 239, 16, 18, 2, 110, 209, + 182, 239, 16, 18, 2, 69, 239, 16, 18, 2, 251, 200, 239, 16, 18, 2, 72, + 239, 16, 18, 2, 250, 150, 239, 16, 2, 251, 51, 239, 16, 2, 199, 2, 239, + 16, 2, 199, 7, 239, 16, 2, 215, 149, 239, 16, 252, 30, 55, 197, 139, 244, + 236, 6, 1, 217, 70, 197, 139, 244, 236, 6, 1, 63, 197, 139, 244, 236, 6, + 1, 197, 70, 197, 139, 244, 236, 6, 1, 195, 217, 197, 139, 244, 236, 6, 1, + 164, 197, 139, 244, 236, 6, 1, 196, 3, 197, 139, 244, 236, 6, 1, 226, + 120, 197, 139, 244, 236, 6, 1, 199, 245, 197, 139, 244, 236, 6, 1, 69, + 197, 139, 244, 236, 6, 1, 72, 197, 139, 244, 236, 6, 1, 251, 97, 197, + 139, 244, 236, 6, 1, 234, 123, 197, 139, 244, 236, 6, 1, 224, 11, 197, + 139, 244, 236, 6, 1, 236, 193, 197, 139, 244, 236, 6, 1, 195, 196, 197, + 139, 244, 236, 6, 1, 200, 106, 197, 139, 244, 236, 6, 1, 236, 212, 197, + 139, 244, 236, 6, 1, 214, 167, 197, 139, 244, 236, 6, 1, 201, 73, 197, + 139, 244, 236, 6, 1, 215, 135, 197, 139, 244, 236, 6, 1, 240, 136, 197, + 139, 244, 236, 6, 1, 250, 168, 197, 139, 244, 236, 6, 1, 251, 123, 197, + 139, 244, 236, 6, 1, 248, 21, 197, 139, 244, 236, 6, 1, 211, 227, 197, + 139, 244, 236, 6, 1, 232, 29, 197, 139, 244, 236, 6, 1, 231, 173, 197, + 139, 244, 236, 6, 1, 231, 100, 197, 139, 244, 236, 6, 1, 232, 175, 197, + 139, 244, 236, 6, 1, 205, 31, 197, 139, 244, 236, 6, 1, 206, 84, 197, + 139, 244, 236, 6, 1, 198, 249, 197, 139, 244, 236, 4, 1, 217, 70, 197, + 139, 244, 236, 4, 1, 63, 197, 139, 244, 236, 4, 1, 197, 70, 197, 139, + 244, 236, 4, 1, 195, 217, 197, 139, 244, 236, 4, 1, 164, 197, 139, 244, + 236, 4, 1, 196, 3, 197, 139, 244, 236, 4, 1, 226, 120, 197, 139, 244, + 236, 4, 1, 199, 245, 197, 139, 244, 236, 4, 1, 69, 197, 139, 244, 236, 4, + 1, 72, 197, 139, 244, 236, 4, 1, 251, 97, 197, 139, 244, 236, 4, 1, 234, + 123, 197, 139, 244, 236, 4, 1, 224, 11, 197, 139, 244, 236, 4, 1, 236, + 193, 197, 139, 244, 236, 4, 1, 195, 196, 197, 139, 244, 236, 4, 1, 200, + 106, 197, 139, 244, 236, 4, 1, 236, 212, 197, 139, 244, 236, 4, 1, 214, + 167, 197, 139, 244, 236, 4, 1, 201, 73, 197, 139, 244, 236, 4, 1, 215, + 135, 197, 139, 244, 236, 4, 1, 240, 136, 197, 139, 244, 236, 4, 1, 250, + 168, 197, 139, 244, 236, 4, 1, 251, 123, 197, 139, 244, 236, 4, 1, 248, + 21, 197, 139, 244, 236, 4, 1, 211, 227, 197, 139, 244, 236, 4, 1, 232, + 29, 197, 139, 244, 236, 4, 1, 231, 173, 197, 139, 244, 236, 4, 1, 231, + 100, 197, 139, 244, 236, 4, 1, 232, 175, 197, 139, 244, 236, 4, 1, 205, + 31, 197, 139, 244, 236, 4, 1, 206, 84, 197, 139, 244, 236, 4, 1, 198, + 249, 197, 139, 244, 236, 17, 195, 79, 197, 139, 244, 236, 17, 100, 197, + 139, 244, 236, 17, 102, 197, 139, 244, 236, 17, 134, 197, 139, 244, 236, + 17, 136, 197, 139, 244, 236, 17, 146, 197, 139, 244, 236, 17, 167, 197, + 139, 244, 236, 17, 178, 197, 139, 244, 236, 17, 171, 197, 139, 244, 236, + 17, 182, 197, 139, 244, 236, 31, 203, 23, 197, 139, 244, 236, 31, 200, + 234, 197, 139, 244, 236, 31, 202, 177, 197, 139, 244, 236, 31, 235, 14, + 197, 139, 244, 236, 31, 235, 145, 197, 139, 244, 236, 31, 206, 13, 197, + 139, 244, 236, 31, 207, 65, 197, 139, 244, 236, 31, 237, 20, 197, 139, + 244, 236, 31, 216, 174, 197, 139, 244, 236, 214, 127, 217, 218, 1, 63, + 217, 218, 1, 252, 168, 217, 218, 1, 68, 217, 218, 1, 226, 120, 217, 218, + 1, 66, 217, 218, 1, 199, 245, 217, 218, 1, 110, 144, 217, 218, 1, 110, + 209, 182, 217, 218, 1, 69, 217, 218, 1, 251, 200, 217, 218, 1, 72, 217, + 218, 1, 250, 150, 217, 218, 1, 155, 217, 218, 1, 224, 146, 217, 218, 1, + 234, 123, 217, 218, 1, 233, 230, 217, 218, 1, 217, 71, 217, 218, 1, 247, + 174, 217, 218, 1, 247, 16, 217, 218, 1, 225, 214, 217, 218, 1, 225, 180, + 217, 218, 1, 215, 109, 217, 218, 1, 201, 78, 217, 218, 1, 201, 66, 217, + 218, 1, 240, 41, 217, 218, 1, 240, 25, 217, 218, 1, 216, 86, 217, 218, 1, + 189, 217, 218, 1, 202, 233, 217, 218, 1, 240, 136, 217, 218, 1, 239, 176, + 217, 218, 1, 176, 217, 218, 1, 161, 217, 218, 1, 213, 6, 217, 218, 1, + 249, 145, 217, 218, 1, 248, 197, 217, 218, 1, 166, 217, 218, 1, 164, 217, + 218, 1, 169, 217, 218, 1, 172, 217, 218, 1, 199, 152, 217, 218, 1, 207, + 50, 217, 218, 1, 205, 80, 217, 218, 1, 183, 217, 218, 1, 142, 217, 218, + 1, 222, 37, 217, 218, 1, 209, 181, 217, 218, 18, 2, 252, 168, 217, 218, + 18, 2, 68, 217, 218, 18, 2, 226, 120, 217, 218, 18, 2, 66, 217, 218, 18, + 2, 199, 245, 217, 218, 18, 2, 110, 144, 217, 218, 18, 2, 110, 209, 182, + 217, 218, 18, 2, 69, 217, 218, 18, 2, 251, 200, 217, 218, 18, 2, 72, 217, + 218, 18, 2, 250, 150, 217, 218, 2, 251, 51, 217, 218, 2, 199, 2, 217, + 218, 2, 199, 7, 217, 218, 2, 250, 132, 217, 218, 2, 206, 100, 217, 218, + 232, 130, 217, 218, 18, 2, 212, 11, 69, 195, 102, 47, 1, 63, 195, 102, 47, 18, 2, 68, 195, 102, 47, 18, 2, 200, 99, 195, 102, 47, 18, 2, 66, - 195, 102, 47, 18, 2, 69, 195, 102, 47, 18, 2, 214, 163, 195, 102, 47, 18, - 2, 72, 195, 102, 47, 18, 2, 251, 199, 195, 102, 47, 18, 2, 250, 149, 195, - 102, 47, 18, 2, 210, 89, 68, 195, 102, 47, 18, 222, 157, 78, 195, 102, - 47, 1, 155, 195, 102, 47, 1, 224, 145, 195, 102, 47, 1, 234, 122, 195, - 102, 47, 1, 233, 229, 195, 102, 47, 1, 217, 70, 195, 102, 47, 1, 247, - 173, 195, 102, 47, 1, 247, 15, 195, 102, 47, 1, 225, 213, 195, 102, 47, - 1, 215, 108, 195, 102, 47, 1, 201, 78, 195, 102, 47, 1, 201, 66, 195, - 102, 47, 1, 240, 40, 195, 102, 47, 1, 240, 24, 195, 102, 47, 1, 216, 85, + 195, 102, 47, 18, 2, 69, 195, 102, 47, 18, 2, 214, 164, 195, 102, 47, 18, + 2, 72, 195, 102, 47, 18, 2, 251, 200, 195, 102, 47, 18, 2, 250, 150, 195, + 102, 47, 18, 2, 210, 89, 68, 195, 102, 47, 18, 222, 158, 78, 195, 102, + 47, 1, 155, 195, 102, 47, 1, 224, 146, 195, 102, 47, 1, 234, 123, 195, + 102, 47, 1, 233, 230, 195, 102, 47, 1, 217, 71, 195, 102, 47, 1, 247, + 174, 195, 102, 47, 1, 247, 16, 195, 102, 47, 1, 225, 214, 195, 102, 47, + 1, 215, 109, 195, 102, 47, 1, 201, 78, 195, 102, 47, 1, 201, 66, 195, + 102, 47, 1, 240, 41, 195, 102, 47, 1, 240, 25, 195, 102, 47, 1, 216, 86, 195, 102, 47, 1, 189, 195, 102, 47, 1, 202, 233, 195, 102, 47, 1, 240, - 135, 195, 102, 47, 1, 239, 175, 195, 102, 47, 1, 176, 195, 102, 47, 1, - 161, 195, 102, 47, 1, 213, 5, 195, 102, 47, 1, 249, 144, 195, 102, 47, 1, - 248, 196, 195, 102, 47, 1, 166, 195, 102, 47, 1, 201, 113, 195, 102, 47, - 1, 201, 103, 195, 102, 47, 1, 237, 155, 195, 102, 47, 1, 237, 149, 195, + 136, 195, 102, 47, 1, 239, 176, 195, 102, 47, 1, 176, 195, 102, 47, 1, + 161, 195, 102, 47, 1, 213, 6, 195, 102, 47, 1, 249, 145, 195, 102, 47, 1, + 248, 197, 195, 102, 47, 1, 166, 195, 102, 47, 1, 201, 113, 195, 102, 47, + 1, 201, 103, 195, 102, 47, 1, 237, 156, 195, 102, 47, 1, 237, 150, 195, 102, 47, 1, 195, 74, 195, 102, 47, 1, 195, 115, 195, 102, 47, 1, 255, - 175, 195, 102, 47, 1, 164, 195, 102, 47, 1, 169, 195, 102, 47, 1, 172, + 176, 195, 102, 47, 1, 164, 195, 102, 47, 1, 169, 195, 102, 47, 1, 172, 195, 102, 47, 1, 199, 152, 195, 102, 47, 1, 207, 50, 195, 102, 47, 1, 205, 80, 195, 102, 47, 1, 183, 195, 102, 47, 1, 142, 195, 102, 47, 1, - 223, 200, 195, 102, 47, 48, 108, 78, 195, 102, 47, 2, 199, 7, 195, 102, - 47, 2, 247, 132, 195, 102, 47, 2, 247, 133, 3, 214, 58, 195, 102, 47, 2, - 247, 135, 3, 214, 58, 195, 102, 47, 2, 251, 50, 195, 102, 47, 2, 199, 2, - 195, 102, 47, 244, 184, 1, 169, 195, 102, 47, 244, 185, 1, 164, 195, 102, - 47, 244, 185, 1, 169, 195, 102, 47, 244, 185, 1, 172, 195, 102, 47, 244, - 185, 1, 199, 152, 195, 102, 47, 84, 232, 137, 78, 195, 102, 47, 244, 198, - 232, 137, 78, 195, 102, 47, 117, 201, 98, 195, 102, 47, 117, 207, 42, + 223, 201, 195, 102, 47, 48, 108, 78, 195, 102, 47, 2, 199, 7, 195, 102, + 47, 2, 247, 133, 195, 102, 47, 2, 247, 134, 3, 214, 59, 195, 102, 47, 2, + 247, 136, 3, 214, 59, 195, 102, 47, 2, 251, 51, 195, 102, 47, 2, 199, 2, + 195, 102, 47, 244, 185, 1, 169, 195, 102, 47, 244, 186, 1, 164, 195, 102, + 47, 244, 186, 1, 169, 195, 102, 47, 244, 186, 1, 172, 195, 102, 47, 244, + 186, 1, 199, 152, 195, 102, 47, 84, 232, 138, 78, 195, 102, 47, 244, 199, + 232, 138, 78, 195, 102, 47, 117, 201, 98, 195, 102, 47, 117, 207, 42, 195, 102, 47, 117, 52, 207, 42, 195, 102, 47, 117, 181, 201, 98, 195, - 102, 47, 84, 237, 241, 232, 137, 78, 195, 102, 47, 244, 198, 237, 241, - 232, 137, 78, 195, 102, 47, 204, 151, 205, 152, 1, 63, 205, 152, 18, 2, + 102, 47, 84, 237, 242, 232, 138, 78, 195, 102, 47, 244, 199, 237, 242, + 232, 138, 78, 195, 102, 47, 204, 151, 205, 152, 1, 63, 205, 152, 18, 2, 68, 205, 152, 18, 2, 200, 99, 205, 152, 18, 2, 66, 205, 152, 18, 2, 69, - 205, 152, 18, 2, 72, 205, 152, 18, 2, 214, 163, 205, 152, 18, 2, 251, - 199, 205, 152, 18, 2, 250, 149, 205, 152, 18, 2, 110, 144, 205, 152, 18, - 2, 110, 159, 205, 152, 18, 222, 157, 78, 205, 152, 1, 155, 205, 152, 1, - 224, 145, 205, 152, 1, 234, 122, 205, 152, 1, 233, 229, 205, 152, 1, 217, - 70, 205, 152, 1, 247, 173, 205, 152, 1, 247, 15, 205, 152, 1, 225, 213, - 205, 152, 1, 225, 179, 205, 152, 1, 215, 108, 205, 152, 1, 201, 78, 205, - 152, 1, 201, 66, 205, 152, 1, 240, 40, 205, 152, 1, 240, 24, 205, 152, 1, - 216, 85, 205, 152, 1, 189, 205, 152, 1, 202, 233, 205, 152, 1, 240, 135, - 205, 152, 1, 239, 175, 205, 152, 1, 176, 205, 152, 1, 161, 205, 152, 1, - 213, 5, 205, 152, 1, 249, 144, 205, 152, 1, 248, 196, 205, 152, 1, 166, - 205, 152, 1, 201, 113, 205, 152, 1, 201, 103, 205, 152, 1, 237, 155, 205, - 152, 1, 195, 74, 205, 152, 1, 195, 115, 205, 152, 1, 255, 175, 205, 152, + 205, 152, 18, 2, 72, 205, 152, 18, 2, 214, 164, 205, 152, 18, 2, 251, + 200, 205, 152, 18, 2, 250, 150, 205, 152, 18, 2, 110, 144, 205, 152, 18, + 2, 110, 159, 205, 152, 18, 222, 158, 78, 205, 152, 1, 155, 205, 152, 1, + 224, 146, 205, 152, 1, 234, 123, 205, 152, 1, 233, 230, 205, 152, 1, 217, + 71, 205, 152, 1, 247, 174, 205, 152, 1, 247, 16, 205, 152, 1, 225, 214, + 205, 152, 1, 225, 180, 205, 152, 1, 215, 109, 205, 152, 1, 201, 78, 205, + 152, 1, 201, 66, 205, 152, 1, 240, 41, 205, 152, 1, 240, 25, 205, 152, 1, + 216, 86, 205, 152, 1, 189, 205, 152, 1, 202, 233, 205, 152, 1, 240, 136, + 205, 152, 1, 239, 176, 205, 152, 1, 176, 205, 152, 1, 161, 205, 152, 1, + 213, 6, 205, 152, 1, 249, 145, 205, 152, 1, 248, 197, 205, 152, 1, 166, + 205, 152, 1, 201, 113, 205, 152, 1, 201, 103, 205, 152, 1, 237, 156, 205, + 152, 1, 195, 74, 205, 152, 1, 195, 115, 205, 152, 1, 255, 176, 205, 152, 1, 164, 205, 152, 1, 169, 205, 152, 1, 172, 205, 152, 1, 199, 152, 205, 152, 1, 207, 50, 205, 152, 1, 205, 80, 205, 152, 1, 183, 205, 152, 1, - 142, 205, 152, 1, 223, 200, 205, 152, 2, 225, 164, 205, 152, 2, 200, 34, - 205, 152, 244, 184, 1, 169, 205, 152, 244, 184, 1, 172, 205, 152, 244, - 184, 1, 207, 50, 205, 152, 244, 184, 1, 183, 205, 152, 48, 108, 2, 234, - 189, 205, 152, 48, 108, 2, 225, 79, 205, 152, 48, 108, 2, 217, 72, 205, - 152, 48, 108, 2, 240, 230, 205, 152, 48, 108, 2, 218, 54, 205, 152, 48, - 108, 2, 250, 111, 205, 152, 48, 108, 2, 221, 135, 205, 152, 48, 108, 2, + 142, 205, 152, 1, 223, 201, 205, 152, 2, 225, 165, 205, 152, 2, 200, 34, + 205, 152, 244, 185, 1, 169, 205, 152, 244, 185, 1, 172, 205, 152, 244, + 185, 1, 207, 50, 205, 152, 244, 185, 1, 183, 205, 152, 48, 108, 2, 234, + 190, 205, 152, 48, 108, 2, 225, 80, 205, 152, 48, 108, 2, 217, 73, 205, + 152, 48, 108, 2, 240, 231, 205, 152, 48, 108, 2, 218, 55, 205, 152, 48, + 108, 2, 250, 112, 205, 152, 48, 108, 2, 221, 136, 205, 152, 48, 108, 2, 144, 205, 152, 48, 108, 2, 159, 205, 152, 48, 108, 2, 207, 52, 205, 152, - 48, 108, 2, 209, 80, 205, 152, 48, 108, 2, 255, 175, 205, 152, 2, 251, - 50, 205, 152, 2, 199, 2, 205, 152, 234, 35, 78, 205, 152, 204, 151, 205, + 48, 108, 2, 209, 80, 205, 152, 48, 108, 2, 255, 176, 205, 152, 2, 251, + 51, 205, 152, 2, 199, 2, 205, 152, 234, 36, 78, 205, 152, 204, 151, 205, 152, 117, 201, 98, 205, 152, 117, 207, 42, 205, 152, 117, 52, 207, 42, - 205, 152, 117, 212, 122, 205, 152, 232, 137, 117, 3, 218, 189, 26, 204, - 112, 26, 201, 165, 235, 85, 205, 152, 232, 137, 117, 3, 218, 189, 26, - 204, 112, 26, 235, 85, 205, 152, 232, 137, 117, 3, 218, 189, 26, 204, - 111, 205, 152, 203, 9, 220, 27, 205, 152, 203, 9, 220, 26, 213, 108, 244, - 253, 232, 158, 1, 161, 213, 108, 244, 253, 232, 158, 1, 155, 213, 108, - 244, 253, 232, 158, 1, 172, 213, 108, 244, 253, 232, 158, 1, 166, 213, - 108, 244, 253, 232, 158, 1, 240, 135, 213, 108, 244, 253, 232, 158, 1, - 195, 115, 213, 108, 244, 253, 232, 158, 1, 199, 152, 213, 108, 244, 253, - 232, 158, 1, 217, 70, 213, 108, 244, 253, 232, 158, 1, 142, 213, 108, - 244, 253, 232, 158, 1, 234, 122, 213, 108, 244, 253, 232, 158, 1, 224, - 145, 213, 108, 244, 253, 232, 158, 1, 183, 213, 108, 244, 253, 232, 158, - 1, 249, 144, 213, 108, 244, 253, 232, 158, 1, 247, 173, 213, 108, 244, - 253, 232, 158, 1, 189, 213, 108, 244, 253, 232, 158, 1, 202, 233, 213, - 108, 244, 253, 232, 158, 1, 176, 213, 108, 244, 253, 232, 158, 1, 213, 5, - 213, 108, 244, 253, 232, 158, 1, 169, 213, 108, 244, 253, 232, 158, 1, - 235, 238, 213, 108, 244, 253, 232, 158, 1, 247, 15, 213, 108, 244, 253, - 232, 158, 1, 63, 213, 108, 244, 253, 232, 158, 1, 69, 213, 108, 244, 253, - 232, 158, 1, 68, 213, 108, 244, 253, 232, 158, 1, 72, 213, 108, 244, 253, - 232, 158, 1, 66, 213, 108, 244, 253, 232, 158, 1, 200, 114, 213, 108, - 244, 253, 232, 158, 1, 230, 209, 213, 108, 244, 253, 232, 158, 1, 48, - 214, 2, 213, 108, 244, 253, 232, 158, 1, 48, 225, 79, 213, 108, 244, 253, - 232, 158, 1, 48, 203, 216, 213, 108, 244, 253, 232, 158, 1, 48, 221, 135, - 213, 108, 244, 253, 232, 158, 1, 48, 218, 54, 213, 108, 244, 253, 232, - 158, 1, 48, 159, 213, 108, 244, 253, 232, 158, 1, 48, 197, 199, 213, 108, - 244, 253, 232, 158, 1, 48, 217, 72, 213, 108, 244, 253, 232, 158, 1, 48, - 196, 148, 213, 108, 244, 253, 232, 158, 209, 250, 152, 221, 239, 213, - 108, 244, 253, 232, 158, 209, 250, 202, 11, 213, 108, 244, 253, 232, 158, - 208, 215, 233, 151, 204, 226, 213, 108, 244, 253, 232, 158, 209, 250, - 152, 181, 235, 129, 213, 108, 244, 253, 232, 158, 209, 250, 152, 235, - 129, 213, 108, 244, 253, 232, 158, 208, 215, 233, 151, 204, 227, 235, - 129, 213, 108, 244, 253, 232, 158, 208, 215, 152, 221, 239, 213, 108, - 244, 253, 232, 158, 208, 215, 202, 11, 213, 108, 244, 253, 232, 158, 208, - 215, 152, 181, 235, 129, 213, 108, 244, 253, 232, 158, 208, 215, 152, - 235, 129, 213, 108, 244, 253, 232, 158, 219, 63, 202, 11, 213, 108, 244, - 253, 232, 158, 233, 151, 204, 227, 199, 131, 213, 108, 244, 253, 232, - 158, 219, 63, 152, 181, 235, 129, 213, 108, 244, 253, 232, 158, 219, 63, - 152, 235, 129, 213, 108, 244, 253, 232, 158, 221, 205, 152, 221, 239, - 213, 108, 244, 253, 232, 158, 221, 205, 202, 11, 213, 108, 244, 253, 232, - 158, 233, 151, 204, 226, 213, 108, 244, 253, 232, 158, 221, 205, 152, - 181, 235, 129, 213, 108, 244, 253, 232, 158, 221, 205, 152, 235, 129, - 213, 108, 244, 253, 232, 158, 233, 151, 204, 227, 235, 129, 248, 194, 1, - 63, 248, 194, 1, 252, 167, 248, 194, 1, 68, 248, 194, 1, 226, 119, 248, - 194, 1, 66, 248, 194, 1, 199, 245, 248, 194, 1, 110, 144, 248, 194, 1, - 110, 209, 182, 248, 194, 1, 110, 159, 248, 194, 1, 69, 248, 194, 1, 251, - 199, 248, 194, 1, 72, 248, 194, 1, 250, 149, 248, 194, 1, 155, 248, 194, - 1, 224, 145, 248, 194, 1, 234, 122, 248, 194, 1, 233, 229, 248, 194, 1, - 217, 70, 248, 194, 1, 247, 173, 248, 194, 1, 247, 15, 248, 194, 1, 225, - 213, 248, 194, 1, 225, 179, 248, 194, 1, 215, 108, 248, 194, 1, 201, 78, - 248, 194, 1, 201, 66, 248, 194, 1, 240, 40, 248, 194, 1, 240, 24, 248, - 194, 1, 216, 85, 248, 194, 1, 189, 248, 194, 1, 202, 233, 248, 194, 1, - 240, 135, 248, 194, 1, 239, 175, 248, 194, 1, 176, 248, 194, 1, 161, 248, - 194, 1, 213, 5, 248, 194, 1, 249, 144, 248, 194, 1, 248, 196, 248, 194, - 1, 166, 248, 194, 1, 164, 248, 194, 1, 169, 248, 194, 1, 172, 248, 194, - 1, 199, 152, 248, 194, 1, 207, 50, 248, 194, 1, 205, 80, 248, 194, 1, - 183, 248, 194, 1, 142, 248, 194, 18, 2, 252, 167, 248, 194, 18, 2, 68, - 248, 194, 18, 2, 226, 119, 248, 194, 18, 2, 66, 248, 194, 18, 2, 199, - 245, 248, 194, 18, 2, 110, 144, 248, 194, 18, 2, 110, 209, 182, 248, 194, - 18, 2, 110, 159, 248, 194, 18, 2, 69, 248, 194, 18, 2, 251, 199, 248, - 194, 18, 2, 72, 248, 194, 18, 2, 250, 149, 248, 194, 2, 247, 132, 248, - 194, 2, 251, 50, 248, 194, 2, 199, 2, 248, 194, 2, 199, 7, 248, 194, 2, - 250, 131, 248, 194, 240, 87, 248, 194, 52, 240, 87, 248, 194, 197, 9, - 207, 90, 248, 194, 234, 86, 235, 132, 248, 194, 234, 86, 235, 131, 248, - 194, 17, 195, 79, 248, 194, 17, 100, 248, 194, 17, 102, 248, 194, 17, - 134, 248, 194, 17, 136, 248, 194, 17, 146, 248, 194, 17, 167, 248, 194, - 17, 178, 248, 194, 17, 171, 248, 194, 17, 182, 248, 194, 31, 100, 248, - 194, 31, 102, 248, 194, 31, 134, 248, 194, 31, 136, 248, 194, 31, 146, - 248, 194, 31, 167, 248, 194, 31, 178, 248, 194, 31, 171, 248, 194, 31, - 182, 248, 194, 31, 203, 23, 248, 194, 31, 200, 234, 248, 194, 31, 202, - 177, 248, 194, 31, 235, 13, 248, 194, 31, 235, 144, 248, 194, 31, 206, - 13, 248, 194, 31, 207, 65, 248, 194, 31, 237, 19, 248, 194, 31, 216, 173, - 248, 194, 231, 55, 200, 50, 78, 220, 29, 232, 137, 78, 220, 29, 117, 207, - 42, 220, 29, 1, 155, 220, 29, 1, 224, 145, 220, 29, 1, 234, 122, 220, 29, - 1, 217, 70, 220, 29, 1, 247, 173, 220, 29, 1, 247, 15, 220, 29, 1, 225, - 213, 220, 29, 1, 215, 108, 220, 29, 1, 189, 220, 29, 1, 202, 233, 220, - 29, 1, 240, 135, 220, 29, 1, 176, 220, 29, 1, 161, 220, 29, 1, 213, 5, - 220, 29, 1, 249, 144, 220, 29, 1, 166, 220, 29, 1, 201, 113, 220, 29, 1, - 201, 103, 220, 29, 1, 237, 155, 220, 29, 1, 197, 166, 220, 29, 1, 195, - 74, 220, 29, 1, 195, 115, 220, 29, 1, 255, 175, 220, 29, 1, 164, 220, 29, - 1, 169, 220, 29, 1, 172, 220, 29, 1, 207, 50, 220, 29, 1, 183, 220, 29, - 1, 142, 220, 29, 1, 63, 220, 29, 204, 152, 1, 155, 220, 29, 204, 152, 1, - 224, 145, 220, 29, 204, 152, 1, 234, 122, 220, 29, 204, 152, 1, 217, 70, - 220, 29, 204, 152, 1, 247, 173, 220, 29, 204, 152, 1, 247, 15, 220, 29, - 204, 152, 1, 225, 213, 220, 29, 204, 152, 1, 215, 108, 220, 29, 204, 152, - 1, 189, 220, 29, 204, 152, 1, 202, 233, 220, 29, 204, 152, 1, 240, 135, - 220, 29, 204, 152, 1, 176, 220, 29, 204, 152, 1, 161, 220, 29, 204, 152, - 1, 213, 5, 220, 29, 204, 152, 1, 249, 144, 220, 29, 204, 152, 1, 166, - 220, 29, 204, 152, 1, 201, 113, 220, 29, 204, 152, 1, 201, 103, 220, 29, - 204, 152, 1, 237, 155, 220, 29, 204, 152, 1, 197, 166, 220, 29, 204, 152, - 1, 195, 74, 220, 29, 204, 152, 1, 195, 115, 220, 29, 204, 152, 1, 164, - 220, 29, 204, 152, 1, 169, 220, 29, 204, 152, 1, 172, 220, 29, 204, 152, - 1, 207, 50, 220, 29, 204, 152, 1, 183, 220, 29, 204, 152, 1, 142, 220, - 29, 204, 152, 1, 63, 220, 29, 18, 2, 252, 167, 220, 29, 18, 2, 68, 220, - 29, 18, 2, 66, 220, 29, 18, 2, 69, 220, 29, 18, 2, 72, 220, 29, 2, 251, - 50, 220, 29, 2, 247, 132, 220, 13, 121, 1, 63, 220, 13, 121, 1, 252, 167, - 220, 13, 121, 1, 68, 220, 13, 121, 1, 226, 119, 220, 13, 121, 1, 66, 220, - 13, 121, 1, 199, 245, 220, 13, 121, 1, 69, 220, 13, 121, 1, 251, 199, - 220, 13, 121, 1, 72, 220, 13, 121, 1, 250, 149, 220, 13, 121, 1, 155, - 220, 13, 121, 1, 224, 145, 220, 13, 121, 1, 234, 122, 220, 13, 121, 1, - 233, 229, 220, 13, 121, 1, 217, 70, 220, 13, 121, 1, 247, 173, 220, 13, - 121, 1, 247, 15, 220, 13, 121, 1, 225, 213, 220, 13, 121, 1, 225, 179, - 220, 13, 121, 1, 215, 108, 220, 13, 121, 1, 201, 78, 220, 13, 121, 1, - 201, 66, 220, 13, 121, 1, 240, 40, 220, 13, 121, 1, 240, 24, 220, 13, - 121, 1, 216, 85, 220, 13, 121, 1, 189, 220, 13, 121, 1, 202, 233, 220, - 13, 121, 1, 240, 135, 220, 13, 121, 1, 239, 175, 220, 13, 121, 1, 176, - 220, 13, 121, 1, 161, 220, 13, 121, 1, 213, 5, 220, 13, 121, 1, 249, 144, - 220, 13, 121, 1, 248, 196, 220, 13, 121, 1, 166, 220, 13, 121, 1, 164, - 220, 13, 121, 1, 169, 220, 13, 121, 1, 172, 220, 13, 121, 1, 199, 152, - 220, 13, 121, 1, 207, 50, 220, 13, 121, 1, 205, 80, 220, 13, 121, 1, 183, - 220, 13, 121, 1, 142, 220, 13, 121, 1, 222, 36, 220, 13, 121, 1, 223, - 200, 220, 13, 121, 1, 225, 129, 220, 13, 121, 1, 201, 217, 220, 13, 121, - 18, 2, 252, 167, 220, 13, 121, 18, 2, 68, 220, 13, 121, 18, 2, 226, 119, - 220, 13, 121, 18, 2, 66, 220, 13, 121, 18, 2, 199, 245, 220, 13, 121, 18, - 2, 110, 144, 220, 13, 121, 18, 2, 69, 220, 13, 121, 18, 2, 251, 199, 220, - 13, 121, 18, 2, 72, 220, 13, 121, 18, 2, 250, 149, 220, 13, 121, 2, 251, - 50, 220, 13, 121, 2, 199, 2, 220, 13, 121, 2, 215, 148, 220, 13, 121, 2, - 247, 134, 220, 13, 121, 2, 232, 226, 220, 13, 121, 199, 7, 220, 13, 121, - 210, 115, 220, 13, 121, 210, 246, 220, 13, 121, 17, 195, 79, 220, 13, - 121, 17, 100, 220, 13, 121, 17, 102, 220, 13, 121, 17, 134, 220, 13, 121, - 17, 136, 220, 13, 121, 17, 146, 220, 13, 121, 17, 167, 220, 13, 121, 17, - 178, 220, 13, 121, 17, 171, 220, 13, 121, 17, 182, 233, 53, 121, 1, 63, - 233, 53, 121, 1, 252, 167, 233, 53, 121, 1, 68, 233, 53, 121, 1, 226, - 119, 233, 53, 121, 1, 66, 233, 53, 121, 1, 199, 245, 233, 53, 121, 1, - 237, 53, 233, 53, 121, 1, 251, 199, 233, 53, 121, 1, 214, 101, 233, 53, - 121, 1, 250, 149, 233, 53, 121, 1, 164, 233, 53, 121, 1, 199, 152, 233, - 53, 121, 1, 249, 144, 233, 53, 121, 1, 248, 196, 233, 53, 121, 1, 166, - 233, 53, 121, 1, 155, 233, 53, 121, 1, 224, 145, 233, 53, 121, 1, 189, - 233, 53, 121, 1, 202, 233, 233, 53, 121, 1, 172, 233, 53, 121, 1, 234, - 122, 233, 53, 121, 1, 233, 229, 233, 53, 121, 1, 240, 135, 233, 53, 121, - 1, 239, 175, 233, 53, 121, 1, 176, 233, 53, 121, 1, 247, 173, 233, 53, - 121, 1, 247, 15, 233, 53, 121, 1, 201, 78, 233, 53, 121, 1, 201, 66, 233, - 53, 121, 1, 222, 36, 233, 53, 121, 1, 225, 213, 233, 53, 121, 1, 225, - 179, 233, 53, 121, 1, 240, 40, 233, 53, 121, 1, 240, 24, 233, 53, 121, 1, - 217, 70, 233, 53, 121, 1, 161, 233, 53, 121, 1, 213, 5, 233, 53, 121, 1, - 142, 233, 53, 121, 1, 169, 233, 53, 121, 1, 183, 233, 53, 121, 18, 2, - 252, 167, 233, 53, 121, 18, 2, 68, 233, 53, 121, 18, 2, 226, 119, 233, - 53, 121, 18, 2, 66, 233, 53, 121, 18, 2, 199, 245, 233, 53, 121, 18, 2, - 237, 53, 233, 53, 121, 18, 2, 251, 199, 233, 53, 121, 18, 2, 214, 101, - 233, 53, 121, 18, 2, 250, 149, 233, 53, 121, 2, 251, 50, 233, 53, 121, 2, - 199, 2, 233, 53, 121, 199, 7, 233, 53, 121, 214, 126, 233, 53, 121, 17, - 195, 79, 233, 53, 121, 17, 100, 233, 53, 121, 17, 102, 233, 53, 121, 17, - 134, 233, 53, 121, 17, 136, 233, 53, 121, 17, 146, 233, 53, 121, 17, 167, - 233, 53, 121, 17, 178, 233, 53, 121, 17, 171, 233, 53, 121, 17, 182, 220, - 70, 1, 155, 220, 70, 1, 234, 122, 220, 70, 1, 217, 70, 220, 70, 1, 161, - 220, 70, 1, 249, 144, 220, 70, 1, 166, 220, 70, 1, 189, 220, 70, 1, 240, - 135, 220, 70, 1, 176, 220, 70, 1, 247, 173, 220, 70, 1, 225, 213, 220, - 70, 1, 215, 108, 220, 70, 1, 164, 220, 70, 1, 169, 220, 70, 1, 172, 220, - 70, 1, 199, 152, 220, 70, 1, 183, 220, 70, 1, 63, 220, 70, 251, 92, 220, - 70, 18, 2, 68, 220, 70, 18, 2, 66, 220, 70, 18, 2, 69, 220, 70, 18, 2, - 72, 220, 70, 213, 120, 220, 70, 236, 221, 77, 208, 132, 42, 191, 97, 202, - 151, 42, 191, 97, 214, 114, 42, 191, 97, 237, 22, 42, 191, 97, 206, 11, - 42, 191, 97, 235, 16, 42, 191, 97, 202, 173, 42, 191, 115, 237, 21, 42, + 205, 152, 117, 212, 123, 205, 152, 232, 138, 117, 3, 218, 190, 26, 204, + 112, 26, 201, 165, 235, 86, 205, 152, 232, 138, 117, 3, 218, 190, 26, + 204, 112, 26, 235, 86, 205, 152, 232, 138, 117, 3, 218, 190, 26, 204, + 111, 205, 152, 203, 9, 220, 28, 205, 152, 203, 9, 220, 27, 213, 109, 244, + 254, 232, 159, 1, 161, 213, 109, 244, 254, 232, 159, 1, 155, 213, 109, + 244, 254, 232, 159, 1, 172, 213, 109, 244, 254, 232, 159, 1, 166, 213, + 109, 244, 254, 232, 159, 1, 240, 136, 213, 109, 244, 254, 232, 159, 1, + 195, 115, 213, 109, 244, 254, 232, 159, 1, 199, 152, 213, 109, 244, 254, + 232, 159, 1, 217, 71, 213, 109, 244, 254, 232, 159, 1, 142, 213, 109, + 244, 254, 232, 159, 1, 234, 123, 213, 109, 244, 254, 232, 159, 1, 224, + 146, 213, 109, 244, 254, 232, 159, 1, 183, 213, 109, 244, 254, 232, 159, + 1, 249, 145, 213, 109, 244, 254, 232, 159, 1, 247, 174, 213, 109, 244, + 254, 232, 159, 1, 189, 213, 109, 244, 254, 232, 159, 1, 202, 233, 213, + 109, 244, 254, 232, 159, 1, 176, 213, 109, 244, 254, 232, 159, 1, 213, 6, + 213, 109, 244, 254, 232, 159, 1, 169, 213, 109, 244, 254, 232, 159, 1, + 235, 239, 213, 109, 244, 254, 232, 159, 1, 247, 16, 213, 109, 244, 254, + 232, 159, 1, 63, 213, 109, 244, 254, 232, 159, 1, 69, 213, 109, 244, 254, + 232, 159, 1, 68, 213, 109, 244, 254, 232, 159, 1, 72, 213, 109, 244, 254, + 232, 159, 1, 66, 213, 109, 244, 254, 232, 159, 1, 200, 114, 213, 109, + 244, 254, 232, 159, 1, 230, 210, 213, 109, 244, 254, 232, 159, 1, 48, + 214, 3, 213, 109, 244, 254, 232, 159, 1, 48, 225, 80, 213, 109, 244, 254, + 232, 159, 1, 48, 203, 216, 213, 109, 244, 254, 232, 159, 1, 48, 221, 136, + 213, 109, 244, 254, 232, 159, 1, 48, 218, 55, 213, 109, 244, 254, 232, + 159, 1, 48, 159, 213, 109, 244, 254, 232, 159, 1, 48, 197, 199, 213, 109, + 244, 254, 232, 159, 1, 48, 217, 73, 213, 109, 244, 254, 232, 159, 1, 48, + 196, 148, 213, 109, 244, 254, 232, 159, 209, 250, 152, 221, 240, 213, + 109, 244, 254, 232, 159, 209, 250, 202, 11, 213, 109, 244, 254, 232, 159, + 208, 215, 233, 152, 204, 226, 213, 109, 244, 254, 232, 159, 209, 250, + 152, 181, 235, 130, 213, 109, 244, 254, 232, 159, 209, 250, 152, 235, + 130, 213, 109, 244, 254, 232, 159, 208, 215, 233, 152, 204, 227, 235, + 130, 213, 109, 244, 254, 232, 159, 208, 215, 152, 221, 240, 213, 109, + 244, 254, 232, 159, 208, 215, 202, 11, 213, 109, 244, 254, 232, 159, 208, + 215, 152, 181, 235, 130, 213, 109, 244, 254, 232, 159, 208, 215, 152, + 235, 130, 213, 109, 244, 254, 232, 159, 219, 64, 202, 11, 213, 109, 244, + 254, 232, 159, 233, 152, 204, 227, 199, 131, 213, 109, 244, 254, 232, + 159, 219, 64, 152, 181, 235, 130, 213, 109, 244, 254, 232, 159, 219, 64, + 152, 235, 130, 213, 109, 244, 254, 232, 159, 221, 206, 152, 221, 240, + 213, 109, 244, 254, 232, 159, 221, 206, 202, 11, 213, 109, 244, 254, 232, + 159, 233, 152, 204, 226, 213, 109, 244, 254, 232, 159, 221, 206, 152, + 181, 235, 130, 213, 109, 244, 254, 232, 159, 221, 206, 152, 235, 130, + 213, 109, 244, 254, 232, 159, 233, 152, 204, 227, 235, 130, 248, 195, 1, + 63, 248, 195, 1, 252, 168, 248, 195, 1, 68, 248, 195, 1, 226, 120, 248, + 195, 1, 66, 248, 195, 1, 199, 245, 248, 195, 1, 110, 144, 248, 195, 1, + 110, 209, 182, 248, 195, 1, 110, 159, 248, 195, 1, 69, 248, 195, 1, 251, + 200, 248, 195, 1, 72, 248, 195, 1, 250, 150, 248, 195, 1, 155, 248, 195, + 1, 224, 146, 248, 195, 1, 234, 123, 248, 195, 1, 233, 230, 248, 195, 1, + 217, 71, 248, 195, 1, 247, 174, 248, 195, 1, 247, 16, 248, 195, 1, 225, + 214, 248, 195, 1, 225, 180, 248, 195, 1, 215, 109, 248, 195, 1, 201, 78, + 248, 195, 1, 201, 66, 248, 195, 1, 240, 41, 248, 195, 1, 240, 25, 248, + 195, 1, 216, 86, 248, 195, 1, 189, 248, 195, 1, 202, 233, 248, 195, 1, + 240, 136, 248, 195, 1, 239, 176, 248, 195, 1, 176, 248, 195, 1, 161, 248, + 195, 1, 213, 6, 248, 195, 1, 249, 145, 248, 195, 1, 248, 197, 248, 195, + 1, 166, 248, 195, 1, 164, 248, 195, 1, 169, 248, 195, 1, 172, 248, 195, + 1, 199, 152, 248, 195, 1, 207, 50, 248, 195, 1, 205, 80, 248, 195, 1, + 183, 248, 195, 1, 142, 248, 195, 18, 2, 252, 168, 248, 195, 18, 2, 68, + 248, 195, 18, 2, 226, 120, 248, 195, 18, 2, 66, 248, 195, 18, 2, 199, + 245, 248, 195, 18, 2, 110, 144, 248, 195, 18, 2, 110, 209, 182, 248, 195, + 18, 2, 110, 159, 248, 195, 18, 2, 69, 248, 195, 18, 2, 251, 200, 248, + 195, 18, 2, 72, 248, 195, 18, 2, 250, 150, 248, 195, 2, 247, 133, 248, + 195, 2, 251, 51, 248, 195, 2, 199, 2, 248, 195, 2, 199, 7, 248, 195, 2, + 250, 132, 248, 195, 240, 88, 248, 195, 52, 240, 88, 248, 195, 197, 9, + 207, 90, 248, 195, 234, 87, 235, 133, 248, 195, 234, 87, 235, 132, 248, + 195, 17, 195, 79, 248, 195, 17, 100, 248, 195, 17, 102, 248, 195, 17, + 134, 248, 195, 17, 136, 248, 195, 17, 146, 248, 195, 17, 167, 248, 195, + 17, 178, 248, 195, 17, 171, 248, 195, 17, 182, 248, 195, 31, 100, 248, + 195, 31, 102, 248, 195, 31, 134, 248, 195, 31, 136, 248, 195, 31, 146, + 248, 195, 31, 167, 248, 195, 31, 178, 248, 195, 31, 171, 248, 195, 31, + 182, 248, 195, 31, 203, 23, 248, 195, 31, 200, 234, 248, 195, 31, 202, + 177, 248, 195, 31, 235, 14, 248, 195, 31, 235, 145, 248, 195, 31, 206, + 13, 248, 195, 31, 207, 65, 248, 195, 31, 237, 20, 248, 195, 31, 216, 174, + 248, 195, 231, 56, 200, 50, 78, 220, 30, 232, 138, 78, 220, 30, 117, 207, + 42, 220, 30, 1, 155, 220, 30, 1, 224, 146, 220, 30, 1, 234, 123, 220, 30, + 1, 217, 71, 220, 30, 1, 247, 174, 220, 30, 1, 247, 16, 220, 30, 1, 225, + 214, 220, 30, 1, 215, 109, 220, 30, 1, 189, 220, 30, 1, 202, 233, 220, + 30, 1, 240, 136, 220, 30, 1, 176, 220, 30, 1, 161, 220, 30, 1, 213, 6, + 220, 30, 1, 249, 145, 220, 30, 1, 166, 220, 30, 1, 201, 113, 220, 30, 1, + 201, 103, 220, 30, 1, 237, 156, 220, 30, 1, 197, 166, 220, 30, 1, 195, + 74, 220, 30, 1, 195, 115, 220, 30, 1, 255, 176, 220, 30, 1, 164, 220, 30, + 1, 169, 220, 30, 1, 172, 220, 30, 1, 207, 50, 220, 30, 1, 183, 220, 30, + 1, 142, 220, 30, 1, 63, 220, 30, 204, 152, 1, 155, 220, 30, 204, 152, 1, + 224, 146, 220, 30, 204, 152, 1, 234, 123, 220, 30, 204, 152, 1, 217, 71, + 220, 30, 204, 152, 1, 247, 174, 220, 30, 204, 152, 1, 247, 16, 220, 30, + 204, 152, 1, 225, 214, 220, 30, 204, 152, 1, 215, 109, 220, 30, 204, 152, + 1, 189, 220, 30, 204, 152, 1, 202, 233, 220, 30, 204, 152, 1, 240, 136, + 220, 30, 204, 152, 1, 176, 220, 30, 204, 152, 1, 161, 220, 30, 204, 152, + 1, 213, 6, 220, 30, 204, 152, 1, 249, 145, 220, 30, 204, 152, 1, 166, + 220, 30, 204, 152, 1, 201, 113, 220, 30, 204, 152, 1, 201, 103, 220, 30, + 204, 152, 1, 237, 156, 220, 30, 204, 152, 1, 197, 166, 220, 30, 204, 152, + 1, 195, 74, 220, 30, 204, 152, 1, 195, 115, 220, 30, 204, 152, 1, 164, + 220, 30, 204, 152, 1, 169, 220, 30, 204, 152, 1, 172, 220, 30, 204, 152, + 1, 207, 50, 220, 30, 204, 152, 1, 183, 220, 30, 204, 152, 1, 142, 220, + 30, 204, 152, 1, 63, 220, 30, 18, 2, 252, 168, 220, 30, 18, 2, 68, 220, + 30, 18, 2, 66, 220, 30, 18, 2, 69, 220, 30, 18, 2, 72, 220, 30, 2, 251, + 51, 220, 30, 2, 247, 133, 220, 14, 121, 1, 63, 220, 14, 121, 1, 252, 168, + 220, 14, 121, 1, 68, 220, 14, 121, 1, 226, 120, 220, 14, 121, 1, 66, 220, + 14, 121, 1, 199, 245, 220, 14, 121, 1, 69, 220, 14, 121, 1, 251, 200, + 220, 14, 121, 1, 72, 220, 14, 121, 1, 250, 150, 220, 14, 121, 1, 155, + 220, 14, 121, 1, 224, 146, 220, 14, 121, 1, 234, 123, 220, 14, 121, 1, + 233, 230, 220, 14, 121, 1, 217, 71, 220, 14, 121, 1, 247, 174, 220, 14, + 121, 1, 247, 16, 220, 14, 121, 1, 225, 214, 220, 14, 121, 1, 225, 180, + 220, 14, 121, 1, 215, 109, 220, 14, 121, 1, 201, 78, 220, 14, 121, 1, + 201, 66, 220, 14, 121, 1, 240, 41, 220, 14, 121, 1, 240, 25, 220, 14, + 121, 1, 216, 86, 220, 14, 121, 1, 189, 220, 14, 121, 1, 202, 233, 220, + 14, 121, 1, 240, 136, 220, 14, 121, 1, 239, 176, 220, 14, 121, 1, 176, + 220, 14, 121, 1, 161, 220, 14, 121, 1, 213, 6, 220, 14, 121, 1, 249, 145, + 220, 14, 121, 1, 248, 197, 220, 14, 121, 1, 166, 220, 14, 121, 1, 164, + 220, 14, 121, 1, 169, 220, 14, 121, 1, 172, 220, 14, 121, 1, 199, 152, + 220, 14, 121, 1, 207, 50, 220, 14, 121, 1, 205, 80, 220, 14, 121, 1, 183, + 220, 14, 121, 1, 142, 220, 14, 121, 1, 222, 37, 220, 14, 121, 1, 223, + 201, 220, 14, 121, 1, 225, 130, 220, 14, 121, 1, 201, 217, 220, 14, 121, + 18, 2, 252, 168, 220, 14, 121, 18, 2, 68, 220, 14, 121, 18, 2, 226, 120, + 220, 14, 121, 18, 2, 66, 220, 14, 121, 18, 2, 199, 245, 220, 14, 121, 18, + 2, 110, 144, 220, 14, 121, 18, 2, 69, 220, 14, 121, 18, 2, 251, 200, 220, + 14, 121, 18, 2, 72, 220, 14, 121, 18, 2, 250, 150, 220, 14, 121, 2, 251, + 51, 220, 14, 121, 2, 199, 2, 220, 14, 121, 2, 215, 149, 220, 14, 121, 2, + 247, 135, 220, 14, 121, 2, 232, 227, 220, 14, 121, 199, 7, 220, 14, 121, + 210, 115, 220, 14, 121, 210, 247, 220, 14, 121, 17, 195, 79, 220, 14, + 121, 17, 100, 220, 14, 121, 17, 102, 220, 14, 121, 17, 134, 220, 14, 121, + 17, 136, 220, 14, 121, 17, 146, 220, 14, 121, 17, 167, 220, 14, 121, 17, + 178, 220, 14, 121, 17, 171, 220, 14, 121, 17, 182, 233, 54, 121, 1, 63, + 233, 54, 121, 1, 252, 168, 233, 54, 121, 1, 68, 233, 54, 121, 1, 226, + 120, 233, 54, 121, 1, 66, 233, 54, 121, 1, 199, 245, 233, 54, 121, 1, + 237, 54, 233, 54, 121, 1, 251, 200, 233, 54, 121, 1, 214, 102, 233, 54, + 121, 1, 250, 150, 233, 54, 121, 1, 164, 233, 54, 121, 1, 199, 152, 233, + 54, 121, 1, 249, 145, 233, 54, 121, 1, 248, 197, 233, 54, 121, 1, 166, + 233, 54, 121, 1, 155, 233, 54, 121, 1, 224, 146, 233, 54, 121, 1, 189, + 233, 54, 121, 1, 202, 233, 233, 54, 121, 1, 172, 233, 54, 121, 1, 234, + 123, 233, 54, 121, 1, 233, 230, 233, 54, 121, 1, 240, 136, 233, 54, 121, + 1, 239, 176, 233, 54, 121, 1, 176, 233, 54, 121, 1, 247, 174, 233, 54, + 121, 1, 247, 16, 233, 54, 121, 1, 201, 78, 233, 54, 121, 1, 201, 66, 233, + 54, 121, 1, 222, 37, 233, 54, 121, 1, 225, 214, 233, 54, 121, 1, 225, + 180, 233, 54, 121, 1, 240, 41, 233, 54, 121, 1, 240, 25, 233, 54, 121, 1, + 217, 71, 233, 54, 121, 1, 161, 233, 54, 121, 1, 213, 6, 233, 54, 121, 1, + 142, 233, 54, 121, 1, 169, 233, 54, 121, 1, 183, 233, 54, 121, 18, 2, + 252, 168, 233, 54, 121, 18, 2, 68, 233, 54, 121, 18, 2, 226, 120, 233, + 54, 121, 18, 2, 66, 233, 54, 121, 18, 2, 199, 245, 233, 54, 121, 18, 2, + 237, 54, 233, 54, 121, 18, 2, 251, 200, 233, 54, 121, 18, 2, 214, 102, + 233, 54, 121, 18, 2, 250, 150, 233, 54, 121, 2, 251, 51, 233, 54, 121, 2, + 199, 2, 233, 54, 121, 199, 7, 233, 54, 121, 214, 127, 233, 54, 121, 17, + 195, 79, 233, 54, 121, 17, 100, 233, 54, 121, 17, 102, 233, 54, 121, 17, + 134, 233, 54, 121, 17, 136, 233, 54, 121, 17, 146, 233, 54, 121, 17, 167, + 233, 54, 121, 17, 178, 233, 54, 121, 17, 171, 233, 54, 121, 17, 182, 220, + 71, 1, 155, 220, 71, 1, 234, 123, 220, 71, 1, 217, 71, 220, 71, 1, 161, + 220, 71, 1, 249, 145, 220, 71, 1, 166, 220, 71, 1, 189, 220, 71, 1, 240, + 136, 220, 71, 1, 176, 220, 71, 1, 247, 174, 220, 71, 1, 225, 214, 220, + 71, 1, 215, 109, 220, 71, 1, 164, 220, 71, 1, 169, 220, 71, 1, 172, 220, + 71, 1, 199, 152, 220, 71, 1, 183, 220, 71, 1, 63, 220, 71, 251, 93, 220, + 71, 18, 2, 68, 220, 71, 18, 2, 66, 220, 71, 18, 2, 69, 220, 71, 18, 2, + 72, 220, 71, 213, 121, 220, 71, 236, 222, 77, 208, 132, 42, 191, 97, 202, + 151, 42, 191, 97, 214, 115, 42, 191, 97, 237, 23, 42, 191, 97, 206, 11, + 42, 191, 97, 235, 17, 42, 191, 97, 202, 173, 42, 191, 115, 237, 22, 42, 191, 115, 206, 10, 42, 191, 97, 200, 237, 42, 191, 97, 206, 20, 42, 191, - 97, 206, 19, 42, 191, 97, 203, 14, 42, 191, 97, 237, 25, 42, 191, 115, - 200, 236, 42, 191, 115, 206, 18, 42, 191, 97, 235, 147, 42, 191, 97, 211, - 86, 42, 191, 97, 232, 223, 42, 191, 97, 232, 222, 42, 191, 115, 211, 84, - 42, 191, 237, 232, 235, 222, 224, 78, 42, 2, 217, 101, 42, 2, 247, 20, - 42, 2, 252, 118, 42, 2, 199, 233, 42, 2, 218, 81, 42, 2, 223, 150, 42, 2, - 213, 111, 42, 2, 218, 125, 42, 2, 225, 51, 42, 2, 213, 188, 42, 2, 212, - 92, 42, 2, 199, 137, 42, 2, 213, 237, 42, 2, 223, 139, 42, 2, 199, 108, - 42, 197, 85, 241, 32, 55, 42, 237, 203, 241, 32, 55, 42, 222, 236, 55, - 42, 208, 234, 213, 191, 55, 42, 201, 212, 241, 73, 55, 42, 201, 212, 31, - 55, 42, 241, 15, 55, 42, 26, 214, 167, 55, 42, 205, 129, 55, 42, 201, - 228, 55, 42, 226, 86, 212, 75, 55, 42, 205, 1, 234, 234, 55, 42, 2, 218, - 85, 42, 2, 199, 145, 42, 211, 213, 236, 221, 77, 202, 237, 10, 2, 63, 10, - 2, 39, 24, 63, 10, 2, 39, 24, 249, 126, 10, 2, 39, 24, 234, 91, 203, 12, - 10, 2, 39, 24, 142, 10, 2, 39, 24, 226, 121, 10, 2, 39, 24, 223, 60, 233, - 51, 10, 2, 39, 24, 218, 92, 10, 2, 39, 24, 209, 1, 10, 2, 254, 176, 10, - 2, 252, 116, 10, 2, 252, 117, 24, 250, 192, 10, 2, 252, 117, 24, 237, - 186, 233, 51, 10, 2, 252, 117, 24, 234, 104, 10, 2, 252, 117, 24, 234, - 91, 203, 12, 10, 2, 252, 117, 24, 142, 10, 2, 252, 117, 24, 226, 122, - 233, 51, 10, 2, 252, 117, 24, 226, 95, 10, 2, 252, 117, 24, 223, 61, 10, - 2, 252, 117, 24, 206, 239, 10, 2, 252, 117, 24, 118, 98, 118, 98, 66, 10, - 2, 252, 117, 233, 51, 10, 2, 252, 33, 10, 2, 252, 34, 24, 249, 105, 10, - 2, 252, 34, 24, 234, 91, 203, 12, 10, 2, 252, 34, 24, 219, 207, 98, 236, - 229, 10, 2, 252, 34, 24, 207, 48, 10, 2, 252, 34, 24, 203, 129, 10, 2, - 252, 5, 10, 2, 251, 180, 10, 2, 251, 181, 24, 236, 156, 10, 2, 251, 181, - 24, 206, 201, 98, 233, 163, 10, 2, 251, 172, 10, 2, 251, 173, 24, 251, - 172, 10, 2, 251, 173, 24, 239, 104, 10, 2, 251, 173, 24, 233, 163, 10, 2, - 251, 173, 24, 142, 10, 2, 251, 173, 24, 225, 39, 10, 2, 251, 173, 24, - 224, 100, 10, 2, 251, 173, 24, 206, 255, 10, 2, 251, 173, 24, 199, 253, - 10, 2, 251, 169, 10, 2, 251, 161, 10, 2, 251, 118, 10, 2, 251, 119, 24, - 206, 255, 10, 2, 251, 105, 10, 2, 251, 106, 127, 251, 105, 10, 2, 251, - 106, 115, 202, 76, 10, 2, 251, 106, 98, 217, 234, 214, 78, 251, 106, 98, - 217, 233, 10, 2, 251, 106, 98, 217, 234, 205, 93, 10, 2, 251, 70, 10, 2, - 251, 40, 10, 2, 251, 6, 10, 2, 251, 7, 24, 223, 153, 10, 2, 250, 234, 10, - 2, 250, 199, 10, 2, 250, 194, 10, 2, 250, 195, 195, 29, 203, 12, 10, 2, - 250, 195, 225, 43, 203, 12, 10, 2, 250, 195, 127, 250, 195, 201, 29, 127, - 201, 29, 201, 29, 127, 201, 29, 213, 162, 10, 2, 250, 195, 127, 250, 195, - 127, 250, 194, 10, 2, 250, 195, 127, 250, 195, 127, 250, 195, 241, 54, - 250, 195, 127, 250, 195, 127, 250, 194, 10, 2, 250, 192, 10, 2, 250, 188, - 10, 2, 249, 144, 10, 2, 249, 126, 10, 2, 249, 120, 10, 2, 249, 112, 10, - 2, 249, 106, 10, 2, 249, 107, 127, 249, 106, 10, 2, 249, 105, 10, 2, 154, - 10, 2, 249, 78, 10, 2, 248, 183, 10, 2, 248, 184, 24, 63, 10, 2, 248, - 184, 24, 234, 82, 10, 2, 248, 184, 24, 226, 122, 233, 51, 10, 2, 248, 20, - 10, 2, 248, 21, 127, 248, 21, 252, 116, 10, 2, 248, 21, 127, 248, 21, - 200, 72, 10, 2, 248, 21, 241, 54, 248, 20, 10, 2, 247, 254, 10, 2, 247, - 255, 127, 247, 254, 10, 2, 247, 243, 10, 2, 247, 242, 10, 2, 240, 135, - 10, 2, 240, 125, 10, 2, 240, 126, 224, 59, 24, 39, 98, 220, 11, 10, 2, - 240, 126, 224, 59, 24, 251, 118, 10, 2, 240, 126, 224, 59, 24, 249, 105, - 10, 2, 240, 126, 224, 59, 24, 248, 183, 10, 2, 240, 126, 224, 59, 24, - 234, 122, 10, 2, 240, 126, 224, 59, 24, 234, 123, 98, 220, 11, 10, 2, - 240, 126, 224, 59, 24, 233, 191, 10, 2, 240, 126, 224, 59, 24, 233, 172, - 10, 2, 240, 126, 224, 59, 24, 233, 64, 10, 2, 240, 126, 224, 59, 24, 142, - 10, 2, 240, 126, 224, 59, 24, 226, 0, 10, 2, 240, 126, 224, 59, 24, 226, - 1, 98, 221, 190, 10, 2, 240, 126, 224, 59, 24, 225, 24, 10, 2, 240, 126, - 224, 59, 24, 172, 10, 2, 240, 126, 224, 59, 24, 221, 190, 10, 2, 240, - 126, 224, 59, 24, 221, 191, 98, 220, 10, 10, 2, 240, 126, 224, 59, 24, - 221, 173, 10, 2, 240, 126, 224, 59, 24, 217, 117, 10, 2, 240, 126, 224, - 59, 24, 213, 163, 98, 213, 162, 10, 2, 240, 126, 224, 59, 24, 206, 112, - 10, 2, 240, 126, 224, 59, 24, 203, 129, 10, 2, 240, 126, 224, 59, 24, - 200, 116, 98, 233, 172, 10, 2, 240, 126, 224, 59, 24, 199, 253, 10, 2, - 240, 97, 10, 2, 240, 74, 10, 2, 240, 73, 10, 2, 240, 72, 10, 2, 239, 151, - 10, 2, 239, 133, 10, 2, 239, 106, 10, 2, 239, 107, 24, 206, 255, 10, 2, - 239, 104, 10, 2, 239, 94, 10, 2, 239, 95, 224, 240, 118, 233, 52, 239, - 74, 10, 2, 239, 74, 10, 2, 237, 200, 10, 2, 237, 201, 127, 237, 200, 10, - 2, 237, 201, 233, 51, 10, 2, 237, 201, 206, 236, 10, 2, 237, 198, 10, 2, - 237, 199, 24, 236, 137, 10, 2, 237, 197, 10, 2, 237, 194, 10, 2, 237, - 193, 10, 2, 237, 192, 10, 2, 237, 187, 10, 2, 237, 185, 10, 2, 237, 186, - 233, 51, 10, 2, 237, 186, 233, 52, 233, 51, 10, 2, 237, 184, 10, 2, 237, - 177, 10, 2, 69, 10, 2, 237, 135, 24, 213, 162, 10, 2, 237, 135, 127, 237, - 135, 215, 138, 127, 215, 137, 10, 2, 237, 82, 10, 2, 237, 83, 24, 39, 98, - 233, 3, 98, 240, 135, 10, 2, 237, 83, 24, 234, 82, 10, 2, 237, 83, 24, - 219, 77, 10, 2, 237, 83, 24, 208, 241, 10, 2, 237, 83, 24, 206, 255, 10, - 2, 237, 83, 24, 66, 10, 2, 237, 55, 10, 2, 237, 43, 10, 2, 237, 6, 10, 2, - 236, 229, 10, 2, 236, 230, 24, 234, 90, 10, 2, 236, 230, 24, 234, 91, - 203, 12, 10, 2, 236, 230, 24, 219, 206, 10, 2, 236, 230, 241, 54, 236, - 229, 10, 2, 236, 230, 214, 78, 236, 229, 10, 2, 236, 230, 205, 93, 10, 2, - 236, 159, 10, 2, 236, 156, 10, 2, 236, 137, 10, 2, 236, 53, 10, 2, 236, - 54, 24, 63, 10, 2, 236, 54, 24, 39, 98, 222, 250, 10, 2, 236, 54, 24, 39, - 98, 222, 251, 24, 222, 250, 10, 2, 236, 54, 24, 251, 105, 10, 2, 236, 54, - 24, 249, 126, 10, 2, 236, 54, 24, 237, 186, 233, 51, 10, 2, 236, 54, 24, - 237, 186, 233, 52, 233, 51, 10, 2, 236, 54, 24, 142, 10, 2, 236, 54, 24, - 233, 3, 233, 51, 10, 2, 236, 54, 24, 226, 122, 233, 51, 10, 2, 236, 54, - 24, 224, 239, 10, 2, 236, 54, 24, 224, 240, 205, 93, 10, 2, 236, 54, 24, - 223, 177, 10, 2, 236, 54, 24, 172, 10, 2, 236, 54, 24, 222, 251, 24, 222, - 250, 10, 2, 236, 54, 24, 222, 108, 10, 2, 236, 54, 24, 221, 190, 10, 2, - 236, 54, 24, 200, 115, 10, 2, 236, 54, 24, 200, 104, 10, 2, 234, 122, 10, - 2, 234, 123, 233, 51, 10, 2, 234, 120, 10, 2, 234, 121, 24, 39, 98, 240, - 136, 98, 142, 10, 2, 234, 121, 24, 39, 98, 142, 10, 2, 234, 121, 24, 39, - 98, 226, 121, 10, 2, 234, 121, 24, 252, 34, 203, 13, 98, 203, 154, 10, 2, - 234, 121, 24, 251, 105, 10, 2, 234, 121, 24, 250, 194, 10, 2, 234, 121, - 24, 250, 193, 98, 234, 104, 10, 2, 234, 121, 24, 249, 126, 10, 2, 234, - 121, 24, 249, 79, 98, 169, 10, 2, 234, 121, 24, 247, 243, 10, 2, 234, - 121, 24, 247, 244, 98, 169, 10, 2, 234, 121, 24, 240, 135, 10, 2, 234, - 121, 24, 239, 151, 10, 2, 234, 121, 24, 239, 107, 24, 206, 255, 10, 2, - 234, 121, 24, 237, 198, 10, 2, 234, 121, 24, 237, 6, 10, 2, 234, 121, 24, - 237, 7, 98, 172, 10, 2, 234, 121, 24, 236, 229, 10, 2, 234, 121, 24, 236, - 230, 24, 234, 91, 203, 12, 10, 2, 234, 121, 24, 234, 91, 203, 12, 10, 2, - 234, 121, 24, 234, 82, 10, 2, 234, 121, 24, 233, 191, 10, 2, 234, 121, - 24, 233, 189, 10, 2, 234, 121, 24, 233, 190, 98, 63, 10, 2, 234, 121, 24, - 233, 173, 98, 204, 172, 10, 2, 234, 121, 24, 233, 3, 98, 221, 191, 98, - 236, 137, 10, 2, 234, 121, 24, 232, 227, 10, 2, 234, 121, 24, 232, 228, - 98, 172, 10, 2, 234, 121, 24, 232, 71, 98, 222, 108, 10, 2, 234, 121, 24, - 231, 66, 10, 2, 234, 121, 24, 226, 122, 233, 51, 10, 2, 234, 121, 24, - 225, 242, 98, 231, 75, 98, 250, 194, 10, 2, 234, 121, 24, 225, 24, 10, 2, - 234, 121, 24, 224, 239, 10, 2, 234, 121, 24, 224, 86, 10, 2, 234, 121, - 24, 224, 87, 98, 222, 250, 10, 2, 234, 121, 24, 223, 178, 98, 251, 105, - 10, 2, 234, 121, 24, 172, 10, 2, 234, 121, 24, 219, 207, 98, 236, 229, - 10, 2, 234, 121, 24, 219, 77, 10, 2, 234, 121, 24, 215, 137, 10, 2, 234, - 121, 24, 215, 138, 127, 215, 137, 10, 2, 234, 121, 24, 161, 10, 2, 234, - 121, 24, 208, 241, 10, 2, 234, 121, 24, 208, 204, 10, 2, 234, 121, 24, - 206, 255, 10, 2, 234, 121, 24, 207, 0, 98, 201, 10, 10, 2, 234, 121, 24, - 206, 221, 10, 2, 234, 121, 24, 204, 117, 10, 2, 234, 121, 24, 203, 129, - 10, 2, 234, 121, 24, 66, 10, 2, 234, 121, 24, 200, 104, 10, 2, 234, 121, - 24, 200, 105, 98, 237, 200, 10, 2, 234, 121, 127, 234, 120, 10, 2, 234, - 115, 10, 2, 234, 116, 241, 54, 234, 115, 10, 2, 234, 113, 10, 2, 234, - 114, 127, 234, 114, 234, 83, 127, 234, 82, 10, 2, 234, 104, 10, 2, 234, - 105, 234, 114, 127, 234, 114, 234, 83, 127, 234, 82, 10, 2, 234, 103, 10, - 2, 234, 101, 10, 2, 234, 92, 10, 2, 234, 90, 10, 2, 234, 91, 203, 12, 10, - 2, 234, 91, 127, 234, 90, 10, 2, 234, 91, 241, 54, 234, 90, 10, 2, 234, - 82, 10, 2, 234, 81, 10, 2, 234, 75, 10, 2, 234, 16, 10, 2, 234, 17, 24, - 223, 153, 10, 2, 233, 191, 10, 2, 233, 192, 24, 69, 10, 2, 233, 192, 24, - 66, 10, 2, 233, 192, 241, 54, 233, 191, 10, 2, 233, 189, 10, 2, 233, 190, - 127, 233, 189, 10, 2, 233, 190, 241, 54, 233, 189, 10, 2, 233, 186, 10, - 2, 233, 172, 10, 2, 233, 173, 233, 51, 10, 2, 233, 170, 10, 2, 233, 171, - 24, 39, 98, 226, 121, 10, 2, 233, 171, 24, 234, 91, 203, 12, 10, 2, 233, - 171, 24, 226, 121, 10, 2, 233, 171, 24, 221, 191, 98, 226, 121, 10, 2, - 233, 171, 24, 161, 10, 2, 233, 165, 10, 2, 233, 163, 10, 2, 233, 164, - 241, 54, 233, 163, 10, 2, 233, 164, 24, 249, 126, 10, 2, 233, 164, 24, - 203, 129, 10, 2, 233, 164, 203, 12, 10, 2, 233, 75, 10, 2, 233, 76, 241, - 54, 233, 75, 10, 2, 233, 73, 10, 2, 233, 74, 24, 225, 24, 10, 2, 233, 74, - 24, 225, 25, 24, 226, 122, 233, 51, 10, 2, 233, 74, 24, 215, 137, 10, 2, - 233, 74, 24, 208, 242, 98, 201, 28, 10, 2, 233, 74, 233, 51, 10, 2, 233, - 64, 10, 2, 233, 65, 24, 39, 98, 223, 153, 10, 2, 233, 65, 24, 223, 153, - 10, 2, 233, 65, 127, 233, 65, 221, 181, 10, 2, 233, 56, 10, 2, 233, 54, - 10, 2, 233, 55, 24, 206, 255, 10, 2, 233, 45, 10, 2, 233, 44, 10, 2, 233, - 40, 10, 2, 233, 39, 10, 2, 142, 10, 2, 233, 3, 203, 12, 10, 2, 233, 3, - 233, 51, 10, 2, 232, 227, 10, 2, 232, 70, 10, 2, 232, 71, 24, 250, 194, - 10, 2, 232, 71, 24, 250, 192, 10, 2, 232, 71, 24, 249, 126, 10, 2, 232, - 71, 24, 239, 74, 10, 2, 232, 71, 24, 234, 113, 10, 2, 232, 71, 24, 224, - 75, 10, 2, 232, 71, 24, 215, 137, 10, 2, 232, 71, 24, 206, 255, 10, 2, - 232, 71, 24, 66, 10, 2, 231, 74, 10, 2, 231, 66, 10, 2, 231, 67, 24, 251, - 105, 10, 2, 231, 67, 24, 232, 227, 10, 2, 231, 67, 24, 224, 239, 10, 2, - 231, 67, 24, 222, 52, 10, 2, 231, 67, 24, 200, 104, 10, 2, 231, 62, 10, - 2, 68, 10, 2, 230, 248, 63, 10, 2, 230, 204, 10, 2, 226, 149, 10, 2, 226, - 150, 127, 226, 150, 247, 243, 10, 2, 226, 150, 127, 226, 150, 205, 93, - 10, 2, 226, 124, 10, 2, 226, 121, 10, 2, 226, 122, 239, 133, 10, 2, 226, - 122, 210, 72, 10, 2, 226, 122, 127, 226, 122, 206, 205, 127, 206, 205, - 200, 105, 127, 200, 104, 10, 2, 226, 122, 233, 51, 10, 2, 226, 113, 10, - 2, 226, 114, 24, 234, 91, 203, 12, 10, 2, 226, 112, 10, 2, 226, 102, 10, - 2, 226, 103, 24, 203, 129, 10, 2, 226, 103, 241, 54, 226, 102, 10, 2, - 226, 103, 214, 78, 226, 102, 10, 2, 226, 103, 205, 93, 10, 2, 226, 95, - 10, 2, 226, 85, 10, 2, 226, 0, 10, 2, 225, 241, 10, 2, 155, 10, 2, 225, - 69, 24, 63, 10, 2, 225, 69, 24, 252, 5, 10, 2, 225, 69, 24, 252, 6, 98, - 223, 177, 10, 2, 225, 69, 24, 250, 192, 10, 2, 225, 69, 24, 249, 126, 10, - 2, 225, 69, 24, 249, 105, 10, 2, 225, 69, 24, 154, 10, 2, 225, 69, 24, - 248, 183, 10, 2, 225, 69, 24, 236, 156, 10, 2, 225, 69, 24, 236, 137, 10, - 2, 225, 69, 24, 234, 122, 10, 2, 225, 69, 24, 234, 104, 10, 2, 225, 69, - 24, 234, 91, 203, 12, 10, 2, 225, 69, 24, 234, 82, 10, 2, 225, 69, 24, - 234, 83, 98, 207, 49, 98, 63, 10, 2, 225, 69, 24, 233, 191, 10, 2, 225, - 69, 24, 233, 172, 10, 2, 225, 69, 24, 233, 164, 98, 208, 204, 10, 2, 225, - 69, 24, 233, 164, 241, 54, 233, 163, 10, 2, 225, 69, 24, 233, 75, 10, 2, - 225, 69, 24, 233, 44, 10, 2, 225, 69, 24, 226, 121, 10, 2, 225, 69, 24, - 226, 102, 10, 2, 225, 69, 24, 225, 24, 10, 2, 225, 69, 24, 224, 100, 10, - 2, 225, 69, 24, 224, 86, 10, 2, 225, 69, 24, 222, 108, 10, 2, 225, 69, - 24, 221, 190, 10, 2, 225, 69, 24, 219, 206, 10, 2, 225, 69, 24, 219, 207, - 98, 237, 200, 10, 2, 225, 69, 24, 219, 207, 98, 233, 191, 10, 2, 225, 69, - 24, 219, 207, 98, 203, 68, 10, 2, 225, 69, 24, 219, 77, 10, 2, 225, 69, - 24, 219, 78, 98, 215, 132, 10, 2, 225, 69, 24, 217, 117, 10, 2, 225, 69, - 24, 215, 137, 10, 2, 225, 69, 24, 212, 219, 10, 2, 225, 69, 24, 209, 140, - 10, 2, 225, 69, 24, 183, 10, 2, 225, 69, 24, 208, 204, 10, 2, 225, 69, - 24, 207, 50, 10, 2, 225, 69, 24, 206, 255, 10, 2, 225, 69, 24, 206, 221, - 10, 2, 225, 69, 24, 206, 151, 10, 2, 225, 69, 24, 206, 91, 10, 2, 225, - 69, 24, 204, 126, 10, 2, 225, 69, 24, 203, 101, 10, 2, 225, 69, 24, 66, - 10, 2, 225, 69, 24, 200, 115, 10, 2, 225, 69, 24, 200, 104, 10, 2, 225, - 69, 24, 200, 75, 24, 161, 10, 2, 225, 69, 24, 199, 253, 10, 2, 225, 69, - 24, 195, 33, 10, 2, 225, 55, 10, 2, 225, 56, 241, 54, 225, 55, 10, 2, - 225, 44, 10, 2, 225, 41, 10, 2, 225, 39, 10, 2, 225, 38, 10, 2, 225, 36, - 10, 2, 225, 37, 127, 225, 36, 10, 2, 225, 24, 10, 2, 225, 25, 24, 226, - 122, 233, 51, 10, 2, 225, 20, 10, 2, 225, 21, 24, 249, 126, 10, 2, 225, - 21, 241, 54, 225, 20, 10, 2, 225, 18, 10, 2, 225, 17, 10, 2, 224, 239, - 10, 2, 224, 240, 223, 62, 24, 118, 127, 223, 62, 24, 66, 10, 2, 224, 240, - 127, 224, 240, 223, 62, 24, 118, 127, 223, 62, 24, 66, 10, 2, 224, 172, - 10, 2, 224, 100, 10, 2, 224, 101, 24, 249, 126, 10, 2, 224, 101, 24, 66, - 10, 2, 224, 101, 24, 200, 104, 10, 2, 224, 86, 10, 2, 224, 75, 10, 2, - 224, 61, 10, 2, 224, 60, 10, 2, 224, 58, 10, 2, 224, 59, 127, 224, 58, - 10, 2, 223, 186, 10, 2, 223, 187, 127, 232, 71, 24, 250, 193, 223, 187, - 127, 232, 71, 24, 250, 192, 10, 2, 223, 177, 10, 2, 223, 175, 10, 2, 223, - 176, 199, 132, 20, 10, 2, 223, 174, 10, 2, 223, 166, 10, 2, 223, 167, - 233, 51, 10, 2, 223, 165, 10, 2, 223, 153, 10, 2, 223, 154, 214, 78, 223, - 153, 10, 2, 223, 146, 10, 2, 223, 123, 10, 2, 172, 10, 2, 223, 61, 10, 2, - 223, 62, 24, 63, 10, 2, 223, 62, 24, 39, 98, 240, 136, 98, 142, 10, 2, - 223, 62, 24, 39, 98, 234, 82, 10, 2, 223, 62, 24, 39, 98, 222, 250, 10, - 2, 223, 62, 24, 251, 172, 10, 2, 223, 62, 24, 251, 105, 10, 2, 223, 62, - 24, 250, 195, 195, 29, 203, 12, 10, 2, 223, 62, 24, 249, 126, 10, 2, 223, - 62, 24, 248, 183, 10, 2, 223, 62, 24, 240, 74, 10, 2, 223, 62, 24, 236, - 229, 10, 2, 223, 62, 24, 234, 122, 10, 2, 223, 62, 24, 234, 82, 10, 2, - 223, 62, 24, 233, 64, 10, 2, 223, 62, 24, 233, 65, 98, 233, 64, 10, 2, - 223, 62, 24, 142, 10, 2, 223, 62, 24, 232, 227, 10, 2, 223, 62, 24, 232, - 71, 24, 215, 137, 10, 2, 223, 62, 24, 226, 122, 233, 51, 10, 2, 223, 62, - 24, 226, 102, 10, 2, 223, 62, 24, 226, 103, 98, 142, 10, 2, 223, 62, 24, - 226, 103, 98, 221, 190, 10, 2, 223, 62, 24, 224, 100, 10, 2, 223, 62, 24, - 224, 75, 10, 2, 223, 62, 24, 223, 177, 10, 2, 223, 62, 24, 223, 166, 10, - 2, 223, 62, 24, 223, 167, 98, 232, 71, 98, 63, 10, 2, 223, 62, 24, 223, - 61, 10, 2, 223, 62, 24, 222, 52, 10, 2, 223, 62, 24, 221, 190, 10, 2, - 223, 62, 24, 221, 175, 10, 2, 223, 62, 24, 219, 206, 10, 2, 223, 62, 24, - 219, 207, 98, 236, 229, 10, 2, 223, 62, 24, 218, 92, 10, 2, 223, 62, 24, - 217, 117, 10, 2, 223, 62, 24, 207, 0, 98, 204, 117, 10, 2, 223, 62, 24, - 206, 201, 98, 233, 164, 98, 236, 156, 10, 2, 223, 62, 24, 206, 201, 98, - 233, 164, 203, 12, 10, 2, 223, 62, 24, 206, 149, 10, 2, 223, 62, 24, 206, - 150, 98, 206, 149, 10, 2, 223, 62, 24, 204, 117, 10, 2, 223, 62, 24, 203, - 143, 10, 2, 223, 62, 24, 203, 129, 10, 2, 223, 62, 24, 203, 69, 98, 39, - 98, 204, 173, 98, 176, 10, 2, 223, 62, 24, 66, 10, 2, 223, 62, 24, 118, - 98, 63, 10, 2, 223, 62, 24, 118, 98, 118, 98, 66, 10, 2, 223, 62, 24, - 200, 116, 98, 250, 194, 10, 2, 223, 62, 24, 200, 104, 10, 2, 223, 62, 24, - 199, 253, 10, 2, 223, 62, 205, 93, 10, 2, 223, 59, 10, 2, 223, 60, 24, - 206, 255, 10, 2, 223, 60, 24, 207, 0, 98, 204, 117, 10, 2, 223, 60, 233, - 51, 10, 2, 223, 60, 233, 52, 127, 223, 60, 233, 52, 206, 255, 10, 2, 223, - 55, 10, 2, 222, 250, 10, 2, 222, 251, 24, 222, 250, 10, 2, 222, 248, 10, - 2, 222, 249, 24, 223, 153, 10, 2, 222, 249, 24, 223, 154, 98, 209, 140, - 10, 2, 222, 108, 10, 2, 222, 89, 10, 2, 222, 77, 10, 2, 222, 52, 10, 2, - 221, 190, 10, 2, 221, 191, 24, 249, 126, 10, 2, 221, 188, 10, 2, 221, - 189, 24, 251, 172, 10, 2, 221, 189, 24, 249, 126, 10, 2, 221, 189, 24, - 236, 137, 10, 2, 221, 189, 24, 236, 138, 203, 12, 10, 2, 221, 189, 24, - 234, 91, 203, 12, 10, 2, 221, 189, 24, 232, 71, 24, 249, 126, 10, 2, 221, - 189, 24, 226, 102, 10, 2, 221, 189, 24, 225, 41, 10, 2, 221, 189, 24, - 225, 39, 10, 2, 221, 189, 24, 225, 40, 98, 250, 194, 10, 2, 221, 189, 24, - 224, 100, 10, 2, 221, 189, 24, 223, 82, 98, 250, 194, 10, 2, 221, 189, - 24, 223, 61, 10, 2, 221, 189, 24, 219, 207, 98, 236, 229, 10, 2, 221, - 189, 24, 217, 117, 10, 2, 221, 189, 24, 215, 185, 10, 2, 221, 189, 24, - 206, 113, 98, 250, 194, 10, 2, 221, 189, 24, 206, 83, 98, 248, 20, 10, 2, - 221, 189, 24, 201, 28, 10, 2, 221, 189, 203, 12, 10, 2, 221, 189, 241, - 54, 221, 188, 10, 2, 221, 189, 214, 78, 221, 188, 10, 2, 221, 189, 205, - 93, 10, 2, 221, 189, 206, 236, 10, 2, 221, 187, 10, 2, 221, 181, 10, 2, - 221, 182, 127, 221, 181, 10, 2, 221, 182, 214, 78, 221, 181, 10, 2, 221, - 182, 206, 236, 10, 2, 221, 178, 10, 2, 221, 175, 10, 2, 221, 173, 10, 2, - 221, 174, 127, 221, 173, 10, 2, 221, 174, 127, 221, 174, 234, 83, 127, - 234, 82, 10, 2, 166, 10, 2, 220, 127, 24, 203, 129, 10, 2, 220, 127, 233, - 51, 10, 2, 220, 119, 10, 2, 220, 88, 10, 2, 220, 36, 10, 2, 220, 11, 10, - 2, 220, 10, 10, 2, 219, 206, 10, 2, 219, 150, 10, 2, 219, 77, 10, 2, 219, - 22, 10, 2, 218, 144, 10, 2, 218, 145, 127, 218, 144, 10, 2, 218, 129, 10, - 2, 218, 130, 233, 51, 10, 2, 218, 110, 10, 2, 218, 96, 10, 2, 218, 92, - 10, 2, 218, 93, 24, 63, 10, 2, 218, 93, 24, 223, 153, 10, 2, 218, 93, 24, - 195, 115, 10, 2, 218, 93, 127, 218, 92, 10, 2, 218, 93, 127, 218, 93, 24, - 39, 98, 176, 10, 2, 218, 93, 241, 54, 218, 92, 10, 2, 218, 90, 10, 2, - 218, 91, 24, 63, 10, 2, 218, 91, 24, 39, 98, 239, 151, 10, 2, 218, 91, - 24, 239, 151, 10, 2, 218, 91, 233, 51, 10, 2, 176, 10, 2, 217, 246, 10, - 2, 217, 233, 10, 2, 217, 234, 226, 15, 10, 2, 217, 234, 24, 206, 152, - 203, 12, 10, 2, 217, 234, 214, 78, 217, 233, 10, 2, 217, 232, 10, 2, 217, - 225, 215, 123, 10, 2, 217, 224, 10, 2, 217, 223, 10, 2, 217, 117, 10, 2, - 217, 118, 24, 63, 10, 2, 217, 118, 24, 200, 104, 10, 2, 217, 118, 206, - 236, 10, 2, 216, 222, 10, 2, 216, 223, 24, 69, 10, 2, 216, 213, 10, 2, - 216, 183, 10, 2, 216, 184, 24, 234, 91, 203, 12, 10, 2, 216, 184, 24, - 234, 83, 98, 234, 91, 203, 12, 10, 2, 216, 179, 10, 2, 216, 180, 24, 251, - 105, 10, 2, 216, 180, 24, 250, 194, 10, 2, 216, 180, 24, 250, 195, 98, - 250, 194, 10, 2, 216, 180, 24, 233, 64, 10, 2, 216, 180, 24, 219, 207, - 98, 234, 91, 203, 12, 10, 2, 216, 180, 24, 217, 117, 10, 2, 216, 180, 24, - 215, 137, 10, 2, 216, 180, 24, 206, 255, 10, 2, 216, 180, 24, 207, 0, 98, - 39, 251, 105, 10, 2, 216, 180, 24, 207, 0, 98, 250, 194, 10, 2, 216, 180, - 24, 207, 0, 98, 250, 195, 98, 250, 194, 10, 2, 216, 180, 24, 200, 116, - 98, 250, 194, 10, 2, 216, 180, 24, 199, 253, 10, 2, 216, 168, 10, 2, 215, - 185, 10, 2, 215, 154, 10, 2, 215, 137, 10, 2, 215, 138, 223, 60, 24, 234, - 82, 10, 2, 215, 138, 223, 60, 24, 220, 11, 10, 2, 215, 138, 223, 60, 24, - 208, 241, 10, 2, 215, 138, 223, 60, 24, 208, 242, 127, 215, 138, 223, 60, - 24, 208, 241, 10, 2, 215, 138, 223, 60, 24, 199, 253, 10, 2, 215, 138, - 203, 12, 10, 2, 215, 138, 127, 215, 137, 10, 2, 215, 138, 241, 54, 215, - 137, 10, 2, 215, 138, 241, 54, 215, 138, 223, 60, 127, 223, 59, 10, 2, - 215, 132, 10, 2, 215, 133, 252, 34, 24, 250, 188, 10, 2, 215, 133, 252, - 34, 24, 248, 183, 10, 2, 215, 133, 252, 34, 24, 237, 194, 10, 2, 215, - 133, 252, 34, 24, 233, 64, 10, 2, 215, 133, 252, 34, 24, 226, 122, 233, - 51, 10, 2, 215, 133, 252, 34, 24, 225, 39, 10, 2, 215, 133, 252, 34, 24, - 172, 10, 2, 215, 133, 252, 34, 24, 217, 117, 10, 2, 215, 133, 252, 34, - 24, 206, 80, 10, 2, 215, 133, 252, 34, 24, 200, 115, 10, 2, 215, 133, - 224, 59, 24, 248, 183, 10, 2, 215, 133, 224, 59, 24, 248, 184, 66, 10, 2, - 161, 10, 2, 213, 232, 10, 2, 213, 190, 10, 2, 213, 162, 10, 2, 213, 20, - 10, 2, 212, 219, 10, 2, 212, 220, 24, 63, 10, 2, 212, 220, 24, 252, 116, - 10, 2, 212, 220, 24, 248, 183, 10, 2, 212, 220, 24, 248, 20, 10, 2, 212, - 220, 24, 69, 10, 2, 212, 220, 24, 68, 10, 2, 212, 220, 24, 230, 204, 10, - 2, 212, 220, 24, 66, 10, 2, 212, 220, 24, 200, 115, 10, 2, 212, 220, 241, - 54, 212, 219, 10, 2, 212, 160, 10, 2, 212, 161, 24, 225, 20, 10, 2, 212, - 161, 24, 200, 104, 10, 2, 212, 161, 24, 195, 115, 10, 2, 212, 161, 214, - 78, 212, 160, 10, 2, 169, 10, 2, 210, 241, 10, 2, 210, 72, 10, 2, 209, - 140, 10, 2, 183, 10, 2, 209, 2, 215, 123, 10, 2, 209, 1, 10, 2, 209, 2, - 24, 63, 10, 2, 209, 2, 24, 237, 200, 10, 2, 209, 2, 24, 237, 198, 10, 2, - 209, 2, 24, 142, 10, 2, 209, 2, 24, 225, 24, 10, 2, 209, 2, 24, 223, 153, - 10, 2, 209, 2, 24, 221, 173, 10, 2, 209, 2, 24, 219, 77, 10, 2, 209, 2, - 24, 215, 137, 10, 2, 209, 2, 24, 208, 241, 10, 2, 209, 2, 24, 206, 221, + 97, 206, 19, 42, 191, 97, 203, 14, 42, 191, 97, 237, 26, 42, 191, 115, + 200, 236, 42, 191, 115, 206, 18, 42, 191, 97, 235, 148, 42, 191, 97, 211, + 87, 42, 191, 97, 232, 224, 42, 191, 97, 232, 223, 42, 191, 115, 211, 85, + 42, 191, 237, 233, 235, 223, 224, 79, 42, 2, 217, 102, 42, 2, 247, 21, + 42, 2, 252, 119, 42, 2, 199, 233, 42, 2, 218, 82, 42, 2, 223, 151, 42, 2, + 213, 112, 42, 2, 218, 126, 42, 2, 225, 52, 42, 2, 213, 189, 42, 2, 212, + 93, 42, 2, 199, 137, 42, 2, 213, 238, 42, 2, 223, 140, 42, 2, 199, 108, + 42, 197, 85, 241, 33, 55, 42, 237, 204, 241, 33, 55, 42, 222, 237, 55, + 42, 208, 234, 213, 192, 55, 42, 201, 212, 241, 74, 55, 42, 201, 212, 31, + 55, 42, 241, 16, 55, 42, 26, 214, 168, 55, 42, 205, 129, 55, 42, 201, + 228, 55, 42, 226, 87, 212, 76, 55, 42, 205, 1, 234, 235, 55, 42, 2, 218, + 86, 42, 2, 199, 145, 42, 211, 214, 236, 222, 77, 202, 237, 10, 2, 63, 10, + 2, 39, 24, 63, 10, 2, 39, 24, 249, 127, 10, 2, 39, 24, 234, 92, 203, 12, + 10, 2, 39, 24, 142, 10, 2, 39, 24, 226, 122, 10, 2, 39, 24, 223, 61, 233, + 52, 10, 2, 39, 24, 218, 93, 10, 2, 39, 24, 209, 1, 10, 2, 254, 177, 10, + 2, 252, 117, 10, 2, 252, 118, 24, 250, 193, 10, 2, 252, 118, 24, 237, + 187, 233, 52, 10, 2, 252, 118, 24, 234, 105, 10, 2, 252, 118, 24, 234, + 92, 203, 12, 10, 2, 252, 118, 24, 142, 10, 2, 252, 118, 24, 226, 123, + 233, 52, 10, 2, 252, 118, 24, 226, 96, 10, 2, 252, 118, 24, 223, 62, 10, + 2, 252, 118, 24, 206, 239, 10, 2, 252, 118, 24, 118, 98, 118, 98, 66, 10, + 2, 252, 118, 233, 52, 10, 2, 252, 34, 10, 2, 252, 35, 24, 249, 106, 10, + 2, 252, 35, 24, 234, 92, 203, 12, 10, 2, 252, 35, 24, 219, 208, 98, 236, + 230, 10, 2, 252, 35, 24, 207, 48, 10, 2, 252, 35, 24, 203, 129, 10, 2, + 252, 6, 10, 2, 251, 181, 10, 2, 251, 182, 24, 236, 157, 10, 2, 251, 182, + 24, 206, 201, 98, 233, 164, 10, 2, 251, 173, 10, 2, 251, 174, 24, 251, + 173, 10, 2, 251, 174, 24, 239, 105, 10, 2, 251, 174, 24, 233, 164, 10, 2, + 251, 174, 24, 142, 10, 2, 251, 174, 24, 225, 40, 10, 2, 251, 174, 24, + 224, 101, 10, 2, 251, 174, 24, 206, 255, 10, 2, 251, 174, 24, 199, 253, + 10, 2, 251, 170, 10, 2, 251, 162, 10, 2, 251, 119, 10, 2, 251, 120, 24, + 206, 255, 10, 2, 251, 106, 10, 2, 251, 107, 127, 251, 106, 10, 2, 251, + 107, 115, 202, 76, 10, 2, 251, 107, 98, 217, 235, 214, 79, 251, 107, 98, + 217, 234, 10, 2, 251, 107, 98, 217, 235, 205, 93, 10, 2, 251, 71, 10, 2, + 251, 41, 10, 2, 251, 7, 10, 2, 251, 8, 24, 223, 154, 10, 2, 250, 235, 10, + 2, 250, 200, 10, 2, 250, 195, 10, 2, 250, 196, 195, 29, 203, 12, 10, 2, + 250, 196, 225, 44, 203, 12, 10, 2, 250, 196, 127, 250, 196, 201, 29, 127, + 201, 29, 201, 29, 127, 201, 29, 213, 163, 10, 2, 250, 196, 127, 250, 196, + 127, 250, 195, 10, 2, 250, 196, 127, 250, 196, 127, 250, 196, 241, 55, + 250, 196, 127, 250, 196, 127, 250, 195, 10, 2, 250, 193, 10, 2, 250, 189, + 10, 2, 249, 145, 10, 2, 249, 127, 10, 2, 249, 121, 10, 2, 249, 113, 10, + 2, 249, 107, 10, 2, 249, 108, 127, 249, 107, 10, 2, 249, 106, 10, 2, 154, + 10, 2, 249, 79, 10, 2, 248, 184, 10, 2, 248, 185, 24, 63, 10, 2, 248, + 185, 24, 234, 83, 10, 2, 248, 185, 24, 226, 123, 233, 52, 10, 2, 248, 21, + 10, 2, 248, 22, 127, 248, 22, 252, 117, 10, 2, 248, 22, 127, 248, 22, + 200, 72, 10, 2, 248, 22, 241, 55, 248, 21, 10, 2, 247, 255, 10, 2, 248, + 0, 127, 247, 255, 10, 2, 247, 244, 10, 2, 247, 243, 10, 2, 240, 136, 10, + 2, 240, 126, 10, 2, 240, 127, 224, 60, 24, 39, 98, 220, 12, 10, 2, 240, + 127, 224, 60, 24, 251, 119, 10, 2, 240, 127, 224, 60, 24, 249, 106, 10, + 2, 240, 127, 224, 60, 24, 248, 184, 10, 2, 240, 127, 224, 60, 24, 234, + 123, 10, 2, 240, 127, 224, 60, 24, 234, 124, 98, 220, 12, 10, 2, 240, + 127, 224, 60, 24, 233, 192, 10, 2, 240, 127, 224, 60, 24, 233, 173, 10, + 2, 240, 127, 224, 60, 24, 233, 65, 10, 2, 240, 127, 224, 60, 24, 142, 10, + 2, 240, 127, 224, 60, 24, 226, 1, 10, 2, 240, 127, 224, 60, 24, 226, 2, + 98, 221, 191, 10, 2, 240, 127, 224, 60, 24, 225, 25, 10, 2, 240, 127, + 224, 60, 24, 172, 10, 2, 240, 127, 224, 60, 24, 221, 191, 10, 2, 240, + 127, 224, 60, 24, 221, 192, 98, 220, 11, 10, 2, 240, 127, 224, 60, 24, + 221, 174, 10, 2, 240, 127, 224, 60, 24, 217, 118, 10, 2, 240, 127, 224, + 60, 24, 213, 164, 98, 213, 163, 10, 2, 240, 127, 224, 60, 24, 206, 112, + 10, 2, 240, 127, 224, 60, 24, 203, 129, 10, 2, 240, 127, 224, 60, 24, + 200, 116, 98, 233, 173, 10, 2, 240, 127, 224, 60, 24, 199, 253, 10, 2, + 240, 98, 10, 2, 240, 75, 10, 2, 240, 74, 10, 2, 240, 73, 10, 2, 239, 152, + 10, 2, 239, 134, 10, 2, 239, 107, 10, 2, 239, 108, 24, 206, 255, 10, 2, + 239, 105, 10, 2, 239, 95, 10, 2, 239, 96, 224, 241, 118, 233, 53, 239, + 75, 10, 2, 239, 75, 10, 2, 237, 201, 10, 2, 237, 202, 127, 237, 201, 10, + 2, 237, 202, 233, 52, 10, 2, 237, 202, 206, 236, 10, 2, 237, 199, 10, 2, + 237, 200, 24, 236, 138, 10, 2, 237, 198, 10, 2, 237, 195, 10, 2, 237, + 194, 10, 2, 237, 193, 10, 2, 237, 188, 10, 2, 237, 186, 10, 2, 237, 187, + 233, 52, 10, 2, 237, 187, 233, 53, 233, 52, 10, 2, 237, 185, 10, 2, 237, + 178, 10, 2, 69, 10, 2, 237, 136, 24, 213, 163, 10, 2, 237, 136, 127, 237, + 136, 215, 139, 127, 215, 138, 10, 2, 237, 83, 10, 2, 237, 84, 24, 39, 98, + 233, 4, 98, 240, 136, 10, 2, 237, 84, 24, 234, 83, 10, 2, 237, 84, 24, + 219, 78, 10, 2, 237, 84, 24, 208, 241, 10, 2, 237, 84, 24, 206, 255, 10, + 2, 237, 84, 24, 66, 10, 2, 237, 56, 10, 2, 237, 44, 10, 2, 237, 7, 10, 2, + 236, 230, 10, 2, 236, 231, 24, 234, 91, 10, 2, 236, 231, 24, 234, 92, + 203, 12, 10, 2, 236, 231, 24, 219, 207, 10, 2, 236, 231, 241, 55, 236, + 230, 10, 2, 236, 231, 214, 79, 236, 230, 10, 2, 236, 231, 205, 93, 10, 2, + 236, 160, 10, 2, 236, 157, 10, 2, 236, 138, 10, 2, 236, 54, 10, 2, 236, + 55, 24, 63, 10, 2, 236, 55, 24, 39, 98, 222, 251, 10, 2, 236, 55, 24, 39, + 98, 222, 252, 24, 222, 251, 10, 2, 236, 55, 24, 251, 106, 10, 2, 236, 55, + 24, 249, 127, 10, 2, 236, 55, 24, 237, 187, 233, 52, 10, 2, 236, 55, 24, + 237, 187, 233, 53, 233, 52, 10, 2, 236, 55, 24, 142, 10, 2, 236, 55, 24, + 233, 4, 233, 52, 10, 2, 236, 55, 24, 226, 123, 233, 52, 10, 2, 236, 55, + 24, 224, 240, 10, 2, 236, 55, 24, 224, 241, 205, 93, 10, 2, 236, 55, 24, + 223, 178, 10, 2, 236, 55, 24, 172, 10, 2, 236, 55, 24, 222, 252, 24, 222, + 251, 10, 2, 236, 55, 24, 222, 109, 10, 2, 236, 55, 24, 221, 191, 10, 2, + 236, 55, 24, 200, 115, 10, 2, 236, 55, 24, 200, 104, 10, 2, 234, 123, 10, + 2, 234, 124, 233, 52, 10, 2, 234, 121, 10, 2, 234, 122, 24, 39, 98, 240, + 137, 98, 142, 10, 2, 234, 122, 24, 39, 98, 142, 10, 2, 234, 122, 24, 39, + 98, 226, 122, 10, 2, 234, 122, 24, 252, 35, 203, 13, 98, 203, 154, 10, 2, + 234, 122, 24, 251, 106, 10, 2, 234, 122, 24, 250, 195, 10, 2, 234, 122, + 24, 250, 194, 98, 234, 105, 10, 2, 234, 122, 24, 249, 127, 10, 2, 234, + 122, 24, 249, 80, 98, 169, 10, 2, 234, 122, 24, 247, 244, 10, 2, 234, + 122, 24, 247, 245, 98, 169, 10, 2, 234, 122, 24, 240, 136, 10, 2, 234, + 122, 24, 239, 152, 10, 2, 234, 122, 24, 239, 108, 24, 206, 255, 10, 2, + 234, 122, 24, 237, 199, 10, 2, 234, 122, 24, 237, 7, 10, 2, 234, 122, 24, + 237, 8, 98, 172, 10, 2, 234, 122, 24, 236, 230, 10, 2, 234, 122, 24, 236, + 231, 24, 234, 92, 203, 12, 10, 2, 234, 122, 24, 234, 92, 203, 12, 10, 2, + 234, 122, 24, 234, 83, 10, 2, 234, 122, 24, 233, 192, 10, 2, 234, 122, + 24, 233, 190, 10, 2, 234, 122, 24, 233, 191, 98, 63, 10, 2, 234, 122, 24, + 233, 174, 98, 204, 172, 10, 2, 234, 122, 24, 233, 4, 98, 221, 192, 98, + 236, 138, 10, 2, 234, 122, 24, 232, 228, 10, 2, 234, 122, 24, 232, 229, + 98, 172, 10, 2, 234, 122, 24, 232, 72, 98, 222, 109, 10, 2, 234, 122, 24, + 231, 67, 10, 2, 234, 122, 24, 226, 123, 233, 52, 10, 2, 234, 122, 24, + 225, 243, 98, 231, 76, 98, 250, 195, 10, 2, 234, 122, 24, 225, 25, 10, 2, + 234, 122, 24, 224, 240, 10, 2, 234, 122, 24, 224, 87, 10, 2, 234, 122, + 24, 224, 88, 98, 222, 251, 10, 2, 234, 122, 24, 223, 179, 98, 251, 106, + 10, 2, 234, 122, 24, 172, 10, 2, 234, 122, 24, 219, 208, 98, 236, 230, + 10, 2, 234, 122, 24, 219, 78, 10, 2, 234, 122, 24, 215, 138, 10, 2, 234, + 122, 24, 215, 139, 127, 215, 138, 10, 2, 234, 122, 24, 161, 10, 2, 234, + 122, 24, 208, 241, 10, 2, 234, 122, 24, 208, 204, 10, 2, 234, 122, 24, + 206, 255, 10, 2, 234, 122, 24, 207, 0, 98, 201, 10, 10, 2, 234, 122, 24, + 206, 221, 10, 2, 234, 122, 24, 204, 117, 10, 2, 234, 122, 24, 203, 129, + 10, 2, 234, 122, 24, 66, 10, 2, 234, 122, 24, 200, 104, 10, 2, 234, 122, + 24, 200, 105, 98, 237, 201, 10, 2, 234, 122, 127, 234, 121, 10, 2, 234, + 116, 10, 2, 234, 117, 241, 55, 234, 116, 10, 2, 234, 114, 10, 2, 234, + 115, 127, 234, 115, 234, 84, 127, 234, 83, 10, 2, 234, 105, 10, 2, 234, + 106, 234, 115, 127, 234, 115, 234, 84, 127, 234, 83, 10, 2, 234, 104, 10, + 2, 234, 102, 10, 2, 234, 93, 10, 2, 234, 91, 10, 2, 234, 92, 203, 12, 10, + 2, 234, 92, 127, 234, 91, 10, 2, 234, 92, 241, 55, 234, 91, 10, 2, 234, + 83, 10, 2, 234, 82, 10, 2, 234, 76, 10, 2, 234, 17, 10, 2, 234, 18, 24, + 223, 154, 10, 2, 233, 192, 10, 2, 233, 193, 24, 69, 10, 2, 233, 193, 24, + 66, 10, 2, 233, 193, 241, 55, 233, 192, 10, 2, 233, 190, 10, 2, 233, 191, + 127, 233, 190, 10, 2, 233, 191, 241, 55, 233, 190, 10, 2, 233, 187, 10, + 2, 233, 173, 10, 2, 233, 174, 233, 52, 10, 2, 233, 171, 10, 2, 233, 172, + 24, 39, 98, 226, 122, 10, 2, 233, 172, 24, 234, 92, 203, 12, 10, 2, 233, + 172, 24, 226, 122, 10, 2, 233, 172, 24, 221, 192, 98, 226, 122, 10, 2, + 233, 172, 24, 161, 10, 2, 233, 166, 10, 2, 233, 164, 10, 2, 233, 165, + 241, 55, 233, 164, 10, 2, 233, 165, 24, 249, 127, 10, 2, 233, 165, 24, + 203, 129, 10, 2, 233, 165, 203, 12, 10, 2, 233, 76, 10, 2, 233, 77, 241, + 55, 233, 76, 10, 2, 233, 74, 10, 2, 233, 75, 24, 225, 25, 10, 2, 233, 75, + 24, 225, 26, 24, 226, 123, 233, 52, 10, 2, 233, 75, 24, 215, 138, 10, 2, + 233, 75, 24, 208, 242, 98, 201, 28, 10, 2, 233, 75, 233, 52, 10, 2, 233, + 65, 10, 2, 233, 66, 24, 39, 98, 223, 154, 10, 2, 233, 66, 24, 223, 154, + 10, 2, 233, 66, 127, 233, 66, 221, 182, 10, 2, 233, 57, 10, 2, 233, 55, + 10, 2, 233, 56, 24, 206, 255, 10, 2, 233, 46, 10, 2, 233, 45, 10, 2, 233, + 41, 10, 2, 233, 40, 10, 2, 142, 10, 2, 233, 4, 203, 12, 10, 2, 233, 4, + 233, 52, 10, 2, 232, 228, 10, 2, 232, 71, 10, 2, 232, 72, 24, 250, 195, + 10, 2, 232, 72, 24, 250, 193, 10, 2, 232, 72, 24, 249, 127, 10, 2, 232, + 72, 24, 239, 75, 10, 2, 232, 72, 24, 234, 114, 10, 2, 232, 72, 24, 224, + 76, 10, 2, 232, 72, 24, 215, 138, 10, 2, 232, 72, 24, 206, 255, 10, 2, + 232, 72, 24, 66, 10, 2, 231, 75, 10, 2, 231, 67, 10, 2, 231, 68, 24, 251, + 106, 10, 2, 231, 68, 24, 232, 228, 10, 2, 231, 68, 24, 224, 240, 10, 2, + 231, 68, 24, 222, 53, 10, 2, 231, 68, 24, 200, 104, 10, 2, 231, 63, 10, + 2, 68, 10, 2, 230, 249, 63, 10, 2, 230, 205, 10, 2, 226, 150, 10, 2, 226, + 151, 127, 226, 151, 247, 244, 10, 2, 226, 151, 127, 226, 151, 205, 93, + 10, 2, 226, 125, 10, 2, 226, 122, 10, 2, 226, 123, 239, 134, 10, 2, 226, + 123, 210, 72, 10, 2, 226, 123, 127, 226, 123, 206, 205, 127, 206, 205, + 200, 105, 127, 200, 104, 10, 2, 226, 123, 233, 52, 10, 2, 226, 114, 10, + 2, 226, 115, 24, 234, 92, 203, 12, 10, 2, 226, 113, 10, 2, 226, 103, 10, + 2, 226, 104, 24, 203, 129, 10, 2, 226, 104, 241, 55, 226, 103, 10, 2, + 226, 104, 214, 79, 226, 103, 10, 2, 226, 104, 205, 93, 10, 2, 226, 96, + 10, 2, 226, 86, 10, 2, 226, 1, 10, 2, 225, 242, 10, 2, 155, 10, 2, 225, + 70, 24, 63, 10, 2, 225, 70, 24, 252, 6, 10, 2, 225, 70, 24, 252, 7, 98, + 223, 178, 10, 2, 225, 70, 24, 250, 193, 10, 2, 225, 70, 24, 249, 127, 10, + 2, 225, 70, 24, 249, 106, 10, 2, 225, 70, 24, 154, 10, 2, 225, 70, 24, + 248, 184, 10, 2, 225, 70, 24, 236, 157, 10, 2, 225, 70, 24, 236, 138, 10, + 2, 225, 70, 24, 234, 123, 10, 2, 225, 70, 24, 234, 105, 10, 2, 225, 70, + 24, 234, 92, 203, 12, 10, 2, 225, 70, 24, 234, 83, 10, 2, 225, 70, 24, + 234, 84, 98, 207, 49, 98, 63, 10, 2, 225, 70, 24, 233, 192, 10, 2, 225, + 70, 24, 233, 173, 10, 2, 225, 70, 24, 233, 165, 98, 208, 204, 10, 2, 225, + 70, 24, 233, 165, 241, 55, 233, 164, 10, 2, 225, 70, 24, 233, 76, 10, 2, + 225, 70, 24, 233, 45, 10, 2, 225, 70, 24, 226, 122, 10, 2, 225, 70, 24, + 226, 103, 10, 2, 225, 70, 24, 225, 25, 10, 2, 225, 70, 24, 224, 101, 10, + 2, 225, 70, 24, 224, 87, 10, 2, 225, 70, 24, 222, 109, 10, 2, 225, 70, + 24, 221, 191, 10, 2, 225, 70, 24, 219, 207, 10, 2, 225, 70, 24, 219, 208, + 98, 237, 201, 10, 2, 225, 70, 24, 219, 208, 98, 233, 192, 10, 2, 225, 70, + 24, 219, 208, 98, 203, 68, 10, 2, 225, 70, 24, 219, 78, 10, 2, 225, 70, + 24, 219, 79, 98, 215, 133, 10, 2, 225, 70, 24, 217, 118, 10, 2, 225, 70, + 24, 215, 138, 10, 2, 225, 70, 24, 212, 220, 10, 2, 225, 70, 24, 209, 140, + 10, 2, 225, 70, 24, 183, 10, 2, 225, 70, 24, 208, 204, 10, 2, 225, 70, + 24, 207, 50, 10, 2, 225, 70, 24, 206, 255, 10, 2, 225, 70, 24, 206, 221, + 10, 2, 225, 70, 24, 206, 151, 10, 2, 225, 70, 24, 206, 91, 10, 2, 225, + 70, 24, 204, 126, 10, 2, 225, 70, 24, 203, 101, 10, 2, 225, 70, 24, 66, + 10, 2, 225, 70, 24, 200, 115, 10, 2, 225, 70, 24, 200, 104, 10, 2, 225, + 70, 24, 200, 75, 24, 161, 10, 2, 225, 70, 24, 199, 253, 10, 2, 225, 70, + 24, 195, 33, 10, 2, 225, 56, 10, 2, 225, 57, 241, 55, 225, 56, 10, 2, + 225, 45, 10, 2, 225, 42, 10, 2, 225, 40, 10, 2, 225, 39, 10, 2, 225, 37, + 10, 2, 225, 38, 127, 225, 37, 10, 2, 225, 25, 10, 2, 225, 26, 24, 226, + 123, 233, 52, 10, 2, 225, 21, 10, 2, 225, 22, 24, 249, 127, 10, 2, 225, + 22, 241, 55, 225, 21, 10, 2, 225, 19, 10, 2, 225, 18, 10, 2, 224, 240, + 10, 2, 224, 241, 223, 63, 24, 118, 127, 223, 63, 24, 66, 10, 2, 224, 241, + 127, 224, 241, 223, 63, 24, 118, 127, 223, 63, 24, 66, 10, 2, 224, 173, + 10, 2, 224, 101, 10, 2, 224, 102, 24, 249, 127, 10, 2, 224, 102, 24, 66, + 10, 2, 224, 102, 24, 200, 104, 10, 2, 224, 87, 10, 2, 224, 76, 10, 2, + 224, 62, 10, 2, 224, 61, 10, 2, 224, 59, 10, 2, 224, 60, 127, 224, 59, + 10, 2, 223, 187, 10, 2, 223, 188, 127, 232, 72, 24, 250, 194, 223, 188, + 127, 232, 72, 24, 250, 193, 10, 2, 223, 178, 10, 2, 223, 176, 10, 2, 223, + 177, 199, 132, 20, 10, 2, 223, 175, 10, 2, 223, 167, 10, 2, 223, 168, + 233, 52, 10, 2, 223, 166, 10, 2, 223, 154, 10, 2, 223, 155, 214, 79, 223, + 154, 10, 2, 223, 147, 10, 2, 223, 124, 10, 2, 172, 10, 2, 223, 62, 10, 2, + 223, 63, 24, 63, 10, 2, 223, 63, 24, 39, 98, 240, 137, 98, 142, 10, 2, + 223, 63, 24, 39, 98, 234, 83, 10, 2, 223, 63, 24, 39, 98, 222, 251, 10, + 2, 223, 63, 24, 251, 173, 10, 2, 223, 63, 24, 251, 106, 10, 2, 223, 63, + 24, 250, 196, 195, 29, 203, 12, 10, 2, 223, 63, 24, 249, 127, 10, 2, 223, + 63, 24, 248, 184, 10, 2, 223, 63, 24, 240, 75, 10, 2, 223, 63, 24, 236, + 230, 10, 2, 223, 63, 24, 234, 123, 10, 2, 223, 63, 24, 234, 83, 10, 2, + 223, 63, 24, 233, 65, 10, 2, 223, 63, 24, 233, 66, 98, 233, 65, 10, 2, + 223, 63, 24, 142, 10, 2, 223, 63, 24, 232, 228, 10, 2, 223, 63, 24, 232, + 72, 24, 215, 138, 10, 2, 223, 63, 24, 226, 123, 233, 52, 10, 2, 223, 63, + 24, 226, 103, 10, 2, 223, 63, 24, 226, 104, 98, 142, 10, 2, 223, 63, 24, + 226, 104, 98, 221, 191, 10, 2, 223, 63, 24, 224, 101, 10, 2, 223, 63, 24, + 224, 76, 10, 2, 223, 63, 24, 223, 178, 10, 2, 223, 63, 24, 223, 167, 10, + 2, 223, 63, 24, 223, 168, 98, 232, 72, 98, 63, 10, 2, 223, 63, 24, 223, + 62, 10, 2, 223, 63, 24, 222, 53, 10, 2, 223, 63, 24, 221, 191, 10, 2, + 223, 63, 24, 221, 176, 10, 2, 223, 63, 24, 219, 207, 10, 2, 223, 63, 24, + 219, 208, 98, 236, 230, 10, 2, 223, 63, 24, 218, 93, 10, 2, 223, 63, 24, + 217, 118, 10, 2, 223, 63, 24, 207, 0, 98, 204, 117, 10, 2, 223, 63, 24, + 206, 201, 98, 233, 165, 98, 236, 157, 10, 2, 223, 63, 24, 206, 201, 98, + 233, 165, 203, 12, 10, 2, 223, 63, 24, 206, 149, 10, 2, 223, 63, 24, 206, + 150, 98, 206, 149, 10, 2, 223, 63, 24, 204, 117, 10, 2, 223, 63, 24, 203, + 143, 10, 2, 223, 63, 24, 203, 129, 10, 2, 223, 63, 24, 203, 69, 98, 39, + 98, 204, 173, 98, 176, 10, 2, 223, 63, 24, 66, 10, 2, 223, 63, 24, 118, + 98, 63, 10, 2, 223, 63, 24, 118, 98, 118, 98, 66, 10, 2, 223, 63, 24, + 200, 116, 98, 250, 195, 10, 2, 223, 63, 24, 200, 104, 10, 2, 223, 63, 24, + 199, 253, 10, 2, 223, 63, 205, 93, 10, 2, 223, 60, 10, 2, 223, 61, 24, + 206, 255, 10, 2, 223, 61, 24, 207, 0, 98, 204, 117, 10, 2, 223, 61, 233, + 52, 10, 2, 223, 61, 233, 53, 127, 223, 61, 233, 53, 206, 255, 10, 2, 223, + 56, 10, 2, 222, 251, 10, 2, 222, 252, 24, 222, 251, 10, 2, 222, 249, 10, + 2, 222, 250, 24, 223, 154, 10, 2, 222, 250, 24, 223, 155, 98, 209, 140, + 10, 2, 222, 109, 10, 2, 222, 90, 10, 2, 222, 78, 10, 2, 222, 53, 10, 2, + 221, 191, 10, 2, 221, 192, 24, 249, 127, 10, 2, 221, 189, 10, 2, 221, + 190, 24, 251, 173, 10, 2, 221, 190, 24, 249, 127, 10, 2, 221, 190, 24, + 236, 138, 10, 2, 221, 190, 24, 236, 139, 203, 12, 10, 2, 221, 190, 24, + 234, 92, 203, 12, 10, 2, 221, 190, 24, 232, 72, 24, 249, 127, 10, 2, 221, + 190, 24, 226, 103, 10, 2, 221, 190, 24, 225, 42, 10, 2, 221, 190, 24, + 225, 40, 10, 2, 221, 190, 24, 225, 41, 98, 250, 195, 10, 2, 221, 190, 24, + 224, 101, 10, 2, 221, 190, 24, 223, 83, 98, 250, 195, 10, 2, 221, 190, + 24, 223, 62, 10, 2, 221, 190, 24, 219, 208, 98, 236, 230, 10, 2, 221, + 190, 24, 217, 118, 10, 2, 221, 190, 24, 215, 186, 10, 2, 221, 190, 24, + 206, 113, 98, 250, 195, 10, 2, 221, 190, 24, 206, 83, 98, 248, 21, 10, 2, + 221, 190, 24, 201, 28, 10, 2, 221, 190, 203, 12, 10, 2, 221, 190, 241, + 55, 221, 189, 10, 2, 221, 190, 214, 79, 221, 189, 10, 2, 221, 190, 205, + 93, 10, 2, 221, 190, 206, 236, 10, 2, 221, 188, 10, 2, 221, 182, 10, 2, + 221, 183, 127, 221, 182, 10, 2, 221, 183, 214, 79, 221, 182, 10, 2, 221, + 183, 206, 236, 10, 2, 221, 179, 10, 2, 221, 176, 10, 2, 221, 174, 10, 2, + 221, 175, 127, 221, 174, 10, 2, 221, 175, 127, 221, 175, 234, 84, 127, + 234, 83, 10, 2, 166, 10, 2, 220, 128, 24, 203, 129, 10, 2, 220, 128, 233, + 52, 10, 2, 220, 120, 10, 2, 220, 89, 10, 2, 220, 37, 10, 2, 220, 12, 10, + 2, 220, 11, 10, 2, 219, 207, 10, 2, 219, 151, 10, 2, 219, 78, 10, 2, 219, + 23, 10, 2, 218, 145, 10, 2, 218, 146, 127, 218, 145, 10, 2, 218, 130, 10, + 2, 218, 131, 233, 52, 10, 2, 218, 111, 10, 2, 218, 97, 10, 2, 218, 93, + 10, 2, 218, 94, 24, 63, 10, 2, 218, 94, 24, 223, 154, 10, 2, 218, 94, 24, + 195, 115, 10, 2, 218, 94, 127, 218, 93, 10, 2, 218, 94, 127, 218, 94, 24, + 39, 98, 176, 10, 2, 218, 94, 241, 55, 218, 93, 10, 2, 218, 91, 10, 2, + 218, 92, 24, 63, 10, 2, 218, 92, 24, 39, 98, 239, 152, 10, 2, 218, 92, + 24, 239, 152, 10, 2, 218, 92, 233, 52, 10, 2, 176, 10, 2, 217, 247, 10, + 2, 217, 234, 10, 2, 217, 235, 226, 16, 10, 2, 217, 235, 24, 206, 152, + 203, 12, 10, 2, 217, 235, 214, 79, 217, 234, 10, 2, 217, 233, 10, 2, 217, + 226, 215, 124, 10, 2, 217, 225, 10, 2, 217, 224, 10, 2, 217, 118, 10, 2, + 217, 119, 24, 63, 10, 2, 217, 119, 24, 200, 104, 10, 2, 217, 119, 206, + 236, 10, 2, 216, 223, 10, 2, 216, 224, 24, 69, 10, 2, 216, 214, 10, 2, + 216, 184, 10, 2, 216, 185, 24, 234, 92, 203, 12, 10, 2, 216, 185, 24, + 234, 84, 98, 234, 92, 203, 12, 10, 2, 216, 180, 10, 2, 216, 181, 24, 251, + 106, 10, 2, 216, 181, 24, 250, 195, 10, 2, 216, 181, 24, 250, 196, 98, + 250, 195, 10, 2, 216, 181, 24, 233, 65, 10, 2, 216, 181, 24, 219, 208, + 98, 234, 92, 203, 12, 10, 2, 216, 181, 24, 217, 118, 10, 2, 216, 181, 24, + 215, 138, 10, 2, 216, 181, 24, 206, 255, 10, 2, 216, 181, 24, 207, 0, 98, + 39, 251, 106, 10, 2, 216, 181, 24, 207, 0, 98, 250, 195, 10, 2, 216, 181, + 24, 207, 0, 98, 250, 196, 98, 250, 195, 10, 2, 216, 181, 24, 200, 116, + 98, 250, 195, 10, 2, 216, 181, 24, 199, 253, 10, 2, 216, 169, 10, 2, 215, + 186, 10, 2, 215, 155, 10, 2, 215, 138, 10, 2, 215, 139, 223, 61, 24, 234, + 83, 10, 2, 215, 139, 223, 61, 24, 220, 12, 10, 2, 215, 139, 223, 61, 24, + 208, 241, 10, 2, 215, 139, 223, 61, 24, 208, 242, 127, 215, 139, 223, 61, + 24, 208, 241, 10, 2, 215, 139, 223, 61, 24, 199, 253, 10, 2, 215, 139, + 203, 12, 10, 2, 215, 139, 127, 215, 138, 10, 2, 215, 139, 241, 55, 215, + 138, 10, 2, 215, 139, 241, 55, 215, 139, 223, 61, 127, 223, 60, 10, 2, + 215, 133, 10, 2, 215, 134, 252, 35, 24, 250, 189, 10, 2, 215, 134, 252, + 35, 24, 248, 184, 10, 2, 215, 134, 252, 35, 24, 237, 195, 10, 2, 215, + 134, 252, 35, 24, 233, 65, 10, 2, 215, 134, 252, 35, 24, 226, 123, 233, + 52, 10, 2, 215, 134, 252, 35, 24, 225, 40, 10, 2, 215, 134, 252, 35, 24, + 172, 10, 2, 215, 134, 252, 35, 24, 217, 118, 10, 2, 215, 134, 252, 35, + 24, 206, 80, 10, 2, 215, 134, 252, 35, 24, 200, 115, 10, 2, 215, 134, + 224, 60, 24, 248, 184, 10, 2, 215, 134, 224, 60, 24, 248, 185, 66, 10, 2, + 161, 10, 2, 213, 233, 10, 2, 213, 191, 10, 2, 213, 163, 10, 2, 213, 21, + 10, 2, 212, 220, 10, 2, 212, 221, 24, 63, 10, 2, 212, 221, 24, 252, 117, + 10, 2, 212, 221, 24, 248, 184, 10, 2, 212, 221, 24, 248, 21, 10, 2, 212, + 221, 24, 69, 10, 2, 212, 221, 24, 68, 10, 2, 212, 221, 24, 230, 205, 10, + 2, 212, 221, 24, 66, 10, 2, 212, 221, 24, 200, 115, 10, 2, 212, 221, 241, + 55, 212, 220, 10, 2, 212, 161, 10, 2, 212, 162, 24, 225, 21, 10, 2, 212, + 162, 24, 200, 104, 10, 2, 212, 162, 24, 195, 115, 10, 2, 212, 162, 214, + 79, 212, 161, 10, 2, 169, 10, 2, 210, 242, 10, 2, 210, 72, 10, 2, 209, + 140, 10, 2, 183, 10, 2, 209, 2, 215, 124, 10, 2, 209, 1, 10, 2, 209, 2, + 24, 63, 10, 2, 209, 2, 24, 237, 201, 10, 2, 209, 2, 24, 237, 199, 10, 2, + 209, 2, 24, 142, 10, 2, 209, 2, 24, 225, 25, 10, 2, 209, 2, 24, 223, 154, + 10, 2, 209, 2, 24, 221, 174, 10, 2, 209, 2, 24, 219, 78, 10, 2, 209, 2, + 24, 215, 138, 10, 2, 209, 2, 24, 208, 241, 10, 2, 209, 2, 24, 206, 221, 10, 2, 209, 2, 24, 203, 154, 10, 2, 209, 2, 24, 200, 115, 10, 2, 209, 2, 24, 200, 110, 10, 2, 209, 2, 24, 200, 79, 10, 2, 209, 2, 24, 200, 21, 10, 2, 209, 2, 24, 199, 253, 10, 2, 209, 2, 127, 209, 1, 10, 2, 209, 2, 233, - 51, 10, 2, 208, 241, 10, 2, 208, 242, 223, 62, 24, 250, 192, 10, 2, 208, + 52, 10, 2, 208, 241, 10, 2, 208, 242, 223, 63, 24, 250, 193, 10, 2, 208, 213, 10, 2, 208, 204, 10, 2, 207, 50, 10, 2, 207, 48, 10, 2, 207, 49, 24, - 63, 10, 2, 207, 49, 24, 249, 126, 10, 2, 207, 49, 24, 233, 163, 10, 2, - 207, 49, 24, 217, 117, 10, 2, 207, 49, 24, 206, 149, 10, 2, 207, 49, 24, + 63, 10, 2, 207, 49, 24, 249, 127, 10, 2, 207, 49, 24, 233, 164, 10, 2, + 207, 49, 24, 217, 118, 10, 2, 207, 49, 24, 206, 149, 10, 2, 207, 49, 24, 201, 10, 10, 2, 207, 49, 24, 66, 10, 2, 207, 49, 24, 118, 98, 63, 10, 2, 207, 46, 10, 2, 207, 44, 10, 2, 207, 17, 10, 2, 206, 255, 10, 2, 207, 0, - 231, 74, 10, 2, 207, 0, 127, 207, 0, 234, 114, 127, 234, 114, 234, 83, - 127, 234, 82, 10, 2, 207, 0, 127, 207, 0, 203, 155, 127, 203, 155, 234, - 83, 127, 234, 82, 10, 2, 206, 248, 10, 2, 206, 243, 10, 2, 206, 239, 10, + 231, 75, 10, 2, 207, 0, 127, 207, 0, 234, 115, 127, 234, 115, 234, 84, + 127, 234, 83, 10, 2, 207, 0, 127, 207, 0, 203, 155, 127, 203, 155, 234, + 84, 127, 234, 83, 10, 2, 206, 248, 10, 2, 206, 243, 10, 2, 206, 239, 10, 2, 206, 238, 10, 2, 206, 235, 10, 2, 206, 221, 10, 2, 206, 222, 24, 63, - 10, 2, 206, 222, 24, 226, 102, 10, 2, 206, 215, 10, 2, 206, 216, 24, 63, - 10, 2, 206, 216, 24, 249, 106, 10, 2, 206, 216, 24, 247, 254, 10, 2, 206, - 216, 24, 239, 94, 10, 2, 206, 216, 24, 234, 82, 10, 2, 206, 216, 24, 226, - 121, 10, 2, 206, 216, 24, 226, 122, 233, 51, 10, 2, 206, 216, 24, 223, - 146, 10, 2, 206, 216, 24, 221, 175, 10, 2, 206, 216, 24, 218, 129, 10, 2, + 10, 2, 206, 222, 24, 226, 103, 10, 2, 206, 215, 10, 2, 206, 216, 24, 63, + 10, 2, 206, 216, 24, 249, 107, 10, 2, 206, 216, 24, 247, 255, 10, 2, 206, + 216, 24, 239, 95, 10, 2, 206, 216, 24, 234, 83, 10, 2, 206, 216, 24, 226, + 122, 10, 2, 206, 216, 24, 226, 123, 233, 52, 10, 2, 206, 216, 24, 223, + 147, 10, 2, 206, 216, 24, 221, 176, 10, 2, 206, 216, 24, 218, 130, 10, 2, 206, 216, 24, 208, 241, 10, 2, 206, 209, 10, 2, 206, 204, 10, 2, 206, - 205, 203, 12, 10, 2, 206, 205, 127, 206, 205, 247, 244, 127, 247, 243, - 10, 2, 206, 200, 10, 2, 206, 151, 10, 2, 206, 152, 127, 226, 16, 206, + 205, 203, 12, 10, 2, 206, 205, 127, 206, 205, 247, 245, 127, 247, 244, + 10, 2, 206, 200, 10, 2, 206, 151, 10, 2, 206, 152, 127, 226, 17, 206, 151, 10, 2, 206, 149, 10, 2, 206, 147, 10, 2, 206, 112, 10, 2, 206, 113, - 233, 51, 10, 2, 206, 91, 10, 2, 206, 89, 10, 2, 206, 90, 127, 206, 90, + 233, 52, 10, 2, 206, 91, 10, 2, 206, 89, 10, 2, 206, 90, 127, 206, 90, 206, 149, 10, 2, 206, 82, 10, 2, 206, 80, 10, 2, 204, 172, 10, 2, 204, 173, 127, 204, 172, 10, 2, 204, 129, 10, 2, 204, 128, 10, 2, 204, 126, 10, 2, 204, 117, 10, 2, 204, 116, 10, 2, 204, 88, 10, 2, 204, 87, 10, 2, - 189, 10, 2, 203, 169, 250, 178, 10, 2, 203, 169, 24, 232, 70, 10, 2, 203, - 169, 24, 219, 77, 10, 2, 203, 169, 233, 51, 10, 2, 203, 154, 10, 2, 203, - 155, 127, 203, 155, 216, 223, 127, 216, 223, 239, 75, 127, 239, 74, 10, - 2, 203, 155, 205, 93, 10, 2, 203, 143, 10, 2, 184, 24, 248, 183, 10, 2, - 184, 24, 233, 64, 10, 2, 184, 24, 206, 255, 10, 2, 184, 24, 206, 151, 10, + 189, 10, 2, 203, 169, 250, 179, 10, 2, 203, 169, 24, 232, 71, 10, 2, 203, + 169, 24, 219, 78, 10, 2, 203, 169, 233, 52, 10, 2, 203, 154, 10, 2, 203, + 155, 127, 203, 155, 216, 224, 127, 216, 224, 239, 76, 127, 239, 75, 10, + 2, 203, 155, 205, 93, 10, 2, 203, 143, 10, 2, 184, 24, 248, 184, 10, 2, + 184, 24, 233, 65, 10, 2, 184, 24, 206, 255, 10, 2, 184, 24, 206, 151, 10, 2, 184, 24, 201, 28, 10, 2, 184, 24, 200, 104, 10, 2, 203, 129, 10, 2, - 203, 101, 10, 2, 203, 68, 10, 2, 203, 69, 233, 51, 10, 2, 202, 122, 10, + 203, 101, 10, 2, 203, 68, 10, 2, 203, 69, 233, 52, 10, 2, 202, 122, 10, 2, 202, 123, 203, 12, 10, 2, 202, 86, 10, 2, 202, 63, 10, 2, 202, 64, 24, 203, 129, 10, 2, 202, 64, 127, 202, 63, 10, 2, 202, 64, 127, 202, 64, - 234, 114, 127, 234, 114, 234, 83, 127, 234, 82, 10, 2, 201, 40, 10, 2, + 234, 115, 127, 234, 115, 234, 84, 127, 234, 83, 10, 2, 201, 40, 10, 2, 201, 28, 10, 2, 201, 26, 10, 2, 201, 22, 10, 2, 201, 10, 10, 2, 201, 11, - 127, 201, 11, 195, 116, 127, 195, 115, 10, 2, 66, 10, 2, 118, 233, 64, - 10, 2, 118, 118, 66, 10, 2, 118, 127, 118, 213, 243, 127, 213, 243, 234, - 83, 127, 234, 82, 10, 2, 118, 127, 118, 204, 89, 127, 204, 88, 10, 2, + 127, 201, 11, 195, 116, 127, 195, 115, 10, 2, 66, 10, 2, 118, 233, 65, + 10, 2, 118, 118, 66, 10, 2, 118, 127, 118, 213, 244, 127, 213, 244, 234, + 84, 127, 234, 83, 10, 2, 118, 127, 118, 204, 89, 127, 204, 88, 10, 2, 118, 127, 118, 118, 210, 89, 127, 118, 210, 88, 10, 2, 200, 115, 10, 2, - 200, 110, 10, 2, 200, 104, 10, 2, 200, 105, 223, 146, 10, 2, 200, 105, - 24, 249, 126, 10, 2, 200, 105, 24, 219, 77, 10, 2, 200, 105, 24, 118, 98, - 118, 98, 66, 10, 2, 200, 105, 24, 118, 98, 118, 98, 118, 233, 51, 10, 2, - 200, 105, 233, 51, 10, 2, 200, 105, 206, 236, 10, 2, 200, 105, 206, 237, - 24, 249, 126, 10, 2, 200, 100, 10, 2, 200, 79, 10, 2, 200, 80, 24, 223, - 61, 10, 2, 200, 80, 24, 219, 207, 98, 240, 135, 10, 2, 200, 80, 24, 207, + 200, 110, 10, 2, 200, 104, 10, 2, 200, 105, 223, 147, 10, 2, 200, 105, + 24, 249, 127, 10, 2, 200, 105, 24, 219, 78, 10, 2, 200, 105, 24, 118, 98, + 118, 98, 66, 10, 2, 200, 105, 24, 118, 98, 118, 98, 118, 233, 52, 10, 2, + 200, 105, 233, 52, 10, 2, 200, 105, 206, 236, 10, 2, 200, 105, 206, 237, + 24, 249, 127, 10, 2, 200, 100, 10, 2, 200, 79, 10, 2, 200, 80, 24, 223, + 62, 10, 2, 200, 80, 24, 219, 208, 98, 240, 136, 10, 2, 200, 80, 24, 207, 48, 10, 2, 200, 80, 24, 66, 10, 2, 200, 78, 10, 2, 200, 74, 10, 2, 200, - 75, 24, 224, 239, 10, 2, 200, 75, 24, 161, 10, 2, 200, 72, 10, 2, 200, - 73, 233, 51, 10, 2, 200, 21, 10, 2, 200, 22, 241, 54, 200, 21, 10, 2, + 75, 24, 224, 240, 10, 2, 200, 75, 24, 161, 10, 2, 200, 72, 10, 2, 200, + 73, 233, 52, 10, 2, 200, 21, 10, 2, 200, 22, 241, 55, 200, 21, 10, 2, 200, 22, 206, 236, 10, 2, 200, 19, 10, 2, 200, 20, 24, 39, 98, 142, 10, - 2, 200, 20, 24, 39, 98, 176, 10, 2, 200, 20, 24, 251, 172, 10, 2, 200, - 20, 24, 142, 10, 2, 200, 20, 24, 215, 137, 10, 2, 200, 20, 24, 200, 115, - 10, 2, 200, 20, 24, 200, 116, 98, 250, 194, 10, 2, 200, 20, 24, 200, 116, - 98, 248, 183, 10, 2, 200, 18, 10, 2, 200, 15, 10, 2, 200, 14, 10, 2, 200, - 10, 10, 2, 200, 11, 24, 63, 10, 2, 200, 11, 24, 250, 188, 10, 2, 200, 11, - 24, 154, 10, 2, 200, 11, 24, 237, 187, 10, 2, 200, 11, 24, 234, 122, 10, - 2, 200, 11, 24, 234, 104, 10, 2, 200, 11, 24, 234, 91, 203, 12, 10, 2, - 200, 11, 24, 234, 82, 10, 2, 200, 11, 24, 233, 75, 10, 2, 200, 11, 24, - 142, 10, 2, 200, 11, 24, 226, 121, 10, 2, 200, 11, 24, 226, 102, 10, 2, - 200, 11, 24, 225, 241, 10, 2, 200, 11, 24, 224, 100, 10, 2, 200, 11, 24, - 221, 173, 10, 2, 200, 11, 24, 219, 22, 10, 2, 200, 11, 24, 161, 10, 2, + 2, 200, 20, 24, 39, 98, 176, 10, 2, 200, 20, 24, 251, 173, 10, 2, 200, + 20, 24, 142, 10, 2, 200, 20, 24, 215, 138, 10, 2, 200, 20, 24, 200, 115, + 10, 2, 200, 20, 24, 200, 116, 98, 250, 195, 10, 2, 200, 20, 24, 200, 116, + 98, 248, 184, 10, 2, 200, 18, 10, 2, 200, 15, 10, 2, 200, 14, 10, 2, 200, + 10, 10, 2, 200, 11, 24, 63, 10, 2, 200, 11, 24, 250, 189, 10, 2, 200, 11, + 24, 154, 10, 2, 200, 11, 24, 237, 188, 10, 2, 200, 11, 24, 234, 123, 10, + 2, 200, 11, 24, 234, 105, 10, 2, 200, 11, 24, 234, 92, 203, 12, 10, 2, + 200, 11, 24, 234, 83, 10, 2, 200, 11, 24, 233, 76, 10, 2, 200, 11, 24, + 142, 10, 2, 200, 11, 24, 226, 122, 10, 2, 200, 11, 24, 226, 103, 10, 2, + 200, 11, 24, 225, 242, 10, 2, 200, 11, 24, 224, 101, 10, 2, 200, 11, 24, + 221, 174, 10, 2, 200, 11, 24, 219, 23, 10, 2, 200, 11, 24, 161, 10, 2, 200, 11, 24, 206, 255, 10, 2, 200, 11, 24, 206, 89, 10, 2, 200, 11, 24, - 201, 40, 10, 2, 200, 11, 24, 118, 98, 233, 64, 10, 2, 200, 11, 24, 200, + 201, 40, 10, 2, 200, 11, 24, 118, 98, 233, 65, 10, 2, 200, 11, 24, 200, 104, 10, 2, 200, 11, 24, 200, 8, 10, 2, 200, 8, 10, 2, 200, 9, 24, 66, - 10, 2, 199, 253, 10, 2, 199, 254, 24, 63, 10, 2, 199, 254, 24, 223, 186, - 10, 2, 199, 254, 24, 223, 153, 10, 2, 199, 254, 24, 203, 129, 10, 2, 199, + 10, 2, 199, 253, 10, 2, 199, 254, 24, 63, 10, 2, 199, 254, 24, 223, 187, + 10, 2, 199, 254, 24, 223, 154, 10, 2, 199, 254, 24, 203, 129, 10, 2, 199, 249, 10, 2, 199, 252, 10, 2, 199, 250, 10, 2, 199, 246, 10, 2, 199, 234, - 10, 2, 199, 235, 24, 224, 239, 10, 2, 199, 232, 10, 2, 195, 115, 10, 2, - 195, 116, 203, 12, 10, 2, 195, 116, 103, 24, 223, 153, 10, 2, 195, 111, + 10, 2, 199, 235, 24, 224, 240, 10, 2, 199, 232, 10, 2, 195, 115, 10, 2, + 195, 116, 203, 12, 10, 2, 195, 116, 103, 24, 223, 154, 10, 2, 195, 111, 10, 2, 195, 103, 10, 2, 195, 87, 10, 2, 195, 33, 10, 2, 195, 34, 127, - 195, 33, 10, 2, 195, 32, 10, 2, 195, 30, 10, 2, 195, 31, 225, 43, 203, + 195, 33, 10, 2, 195, 32, 10, 2, 195, 30, 10, 2, 195, 31, 225, 44, 203, 12, 10, 2, 195, 25, 10, 2, 195, 16, 10, 2, 194, 255, 10, 2, 194, 253, 10, - 2, 194, 254, 24, 63, 10, 2, 194, 252, 10, 2, 194, 251, 10, 2, 225, 8, - 237, 3, 10, 2, 252, 117, 24, 215, 137, 10, 2, 252, 34, 24, 63, 10, 2, - 251, 119, 24, 223, 168, 10, 2, 240, 126, 224, 59, 24, 200, 116, 98, 220, - 11, 10, 2, 240, 124, 10, 2, 239, 75, 98, 206, 151, 10, 2, 237, 199, 24, - 206, 255, 10, 2, 236, 54, 24, 233, 64, 10, 2, 236, 54, 24, 206, 255, 10, - 2, 234, 121, 24, 251, 106, 98, 225, 25, 98, 63, 10, 2, 234, 121, 24, 250, - 192, 10, 2, 234, 46, 10, 2, 233, 180, 10, 2, 231, 47, 10, 2, 225, 69, 24, - 251, 70, 10, 2, 225, 69, 24, 250, 191, 10, 2, 225, 69, 24, 233, 163, 10, - 2, 225, 69, 24, 233, 64, 10, 2, 225, 69, 24, 232, 71, 24, 250, 192, 10, - 2, 225, 69, 24, 221, 173, 10, 2, 225, 69, 24, 161, 10, 2, 225, 69, 24, - 206, 143, 10, 2, 225, 69, 24, 201, 40, 10, 2, 225, 69, 24, 200, 19, 10, - 2, 223, 62, 24, 233, 191, 10, 2, 221, 189, 206, 237, 24, 249, 126, 10, 2, - 221, 189, 24, 236, 138, 98, 222, 250, 10, 2, 221, 189, 24, 206, 151, 10, - 2, 219, 149, 10, 2, 218, 91, 24, 195, 115, 10, 2, 217, 245, 10, 2, 216, - 182, 10, 2, 216, 181, 10, 2, 216, 180, 24, 249, 106, 10, 2, 216, 180, 24, - 233, 191, 10, 2, 215, 155, 209, 194, 216, 174, 239, 229, 10, 2, 213, 21, - 250, 178, 10, 2, 212, 164, 10, 2, 209, 2, 24, 226, 122, 233, 51, 10, 2, - 202, 114, 10, 2, 200, 80, 24, 219, 206, 10, 2, 118, 66, 10, 156, 2, 99, - 250, 194, 10, 156, 2, 115, 250, 194, 10, 156, 2, 235, 6, 250, 194, 10, - 156, 2, 235, 100, 250, 194, 10, 156, 2, 206, 29, 250, 194, 10, 156, 2, - 207, 71, 250, 194, 10, 156, 2, 237, 30, 250, 194, 10, 156, 2, 216, 178, - 250, 194, 10, 156, 2, 115, 239, 74, 10, 156, 2, 235, 6, 239, 74, 10, 156, - 2, 235, 100, 239, 74, 10, 156, 2, 206, 29, 239, 74, 10, 156, 2, 207, 71, - 239, 74, 10, 156, 2, 237, 30, 239, 74, 10, 156, 2, 216, 178, 239, 74, 10, - 156, 2, 235, 6, 66, 10, 156, 2, 235, 100, 66, 10, 156, 2, 206, 29, 66, - 10, 156, 2, 207, 71, 66, 10, 156, 2, 237, 30, 66, 10, 156, 2, 216, 178, - 66, 10, 156, 2, 97, 234, 18, 10, 156, 2, 99, 234, 18, 10, 156, 2, 115, - 234, 18, 10, 156, 2, 235, 6, 234, 18, 10, 156, 2, 235, 100, 234, 18, 10, - 156, 2, 206, 29, 234, 18, 10, 156, 2, 207, 71, 234, 18, 10, 156, 2, 237, - 30, 234, 18, 10, 156, 2, 216, 178, 234, 18, 10, 156, 2, 97, 234, 15, 10, - 156, 2, 99, 234, 15, 10, 156, 2, 115, 234, 15, 10, 156, 2, 235, 6, 234, - 15, 10, 156, 2, 235, 100, 234, 15, 10, 156, 2, 99, 207, 17, 10, 156, 2, - 115, 207, 17, 10, 156, 2, 115, 207, 18, 199, 132, 20, 10, 156, 2, 235, 6, - 207, 17, 10, 156, 2, 235, 100, 207, 17, 10, 156, 2, 206, 29, 207, 17, 10, - 156, 2, 207, 71, 207, 17, 10, 156, 2, 237, 30, 207, 17, 10, 156, 2, 216, - 178, 207, 17, 10, 156, 2, 97, 207, 10, 10, 156, 2, 99, 207, 10, 10, 156, + 2, 194, 254, 24, 63, 10, 2, 194, 252, 10, 2, 194, 251, 10, 2, 225, 9, + 237, 4, 10, 2, 252, 118, 24, 215, 138, 10, 2, 252, 35, 24, 63, 10, 2, + 251, 120, 24, 223, 169, 10, 2, 240, 127, 224, 60, 24, 200, 116, 98, 220, + 12, 10, 2, 240, 125, 10, 2, 239, 76, 98, 206, 151, 10, 2, 237, 200, 24, + 206, 255, 10, 2, 236, 55, 24, 233, 65, 10, 2, 236, 55, 24, 206, 255, 10, + 2, 234, 122, 24, 251, 107, 98, 225, 26, 98, 63, 10, 2, 234, 122, 24, 250, + 193, 10, 2, 234, 47, 10, 2, 233, 181, 10, 2, 231, 48, 10, 2, 225, 70, 24, + 251, 71, 10, 2, 225, 70, 24, 250, 192, 10, 2, 225, 70, 24, 233, 164, 10, + 2, 225, 70, 24, 233, 65, 10, 2, 225, 70, 24, 232, 72, 24, 250, 193, 10, + 2, 225, 70, 24, 221, 174, 10, 2, 225, 70, 24, 161, 10, 2, 225, 70, 24, + 206, 143, 10, 2, 225, 70, 24, 201, 40, 10, 2, 225, 70, 24, 200, 19, 10, + 2, 223, 63, 24, 233, 192, 10, 2, 221, 190, 206, 237, 24, 249, 127, 10, 2, + 221, 190, 24, 236, 139, 98, 222, 251, 10, 2, 221, 190, 24, 206, 151, 10, + 2, 219, 150, 10, 2, 218, 92, 24, 195, 115, 10, 2, 217, 246, 10, 2, 216, + 183, 10, 2, 216, 182, 10, 2, 216, 181, 24, 249, 107, 10, 2, 216, 181, 24, + 233, 192, 10, 2, 215, 156, 209, 194, 216, 175, 239, 230, 10, 2, 213, 22, + 250, 179, 10, 2, 212, 165, 10, 2, 209, 2, 24, 226, 123, 233, 52, 10, 2, + 202, 114, 10, 2, 200, 80, 24, 219, 207, 10, 2, 118, 66, 10, 156, 2, 99, + 250, 195, 10, 156, 2, 115, 250, 195, 10, 156, 2, 235, 7, 250, 195, 10, + 156, 2, 235, 101, 250, 195, 10, 156, 2, 206, 29, 250, 195, 10, 156, 2, + 207, 71, 250, 195, 10, 156, 2, 237, 31, 250, 195, 10, 156, 2, 216, 179, + 250, 195, 10, 156, 2, 115, 239, 75, 10, 156, 2, 235, 7, 239, 75, 10, 156, + 2, 235, 101, 239, 75, 10, 156, 2, 206, 29, 239, 75, 10, 156, 2, 207, 71, + 239, 75, 10, 156, 2, 237, 31, 239, 75, 10, 156, 2, 216, 179, 239, 75, 10, + 156, 2, 235, 7, 66, 10, 156, 2, 235, 101, 66, 10, 156, 2, 206, 29, 66, + 10, 156, 2, 207, 71, 66, 10, 156, 2, 237, 31, 66, 10, 156, 2, 216, 179, + 66, 10, 156, 2, 97, 234, 19, 10, 156, 2, 99, 234, 19, 10, 156, 2, 115, + 234, 19, 10, 156, 2, 235, 7, 234, 19, 10, 156, 2, 235, 101, 234, 19, 10, + 156, 2, 206, 29, 234, 19, 10, 156, 2, 207, 71, 234, 19, 10, 156, 2, 237, + 31, 234, 19, 10, 156, 2, 216, 179, 234, 19, 10, 156, 2, 97, 234, 16, 10, + 156, 2, 99, 234, 16, 10, 156, 2, 115, 234, 16, 10, 156, 2, 235, 7, 234, + 16, 10, 156, 2, 235, 101, 234, 16, 10, 156, 2, 99, 207, 17, 10, 156, 2, + 115, 207, 17, 10, 156, 2, 115, 207, 18, 199, 132, 20, 10, 156, 2, 235, 7, + 207, 17, 10, 156, 2, 235, 101, 207, 17, 10, 156, 2, 206, 29, 207, 17, 10, + 156, 2, 207, 71, 207, 17, 10, 156, 2, 237, 31, 207, 17, 10, 156, 2, 216, + 179, 207, 17, 10, 156, 2, 97, 207, 10, 10, 156, 2, 99, 207, 10, 10, 156, 2, 115, 207, 10, 10, 156, 2, 115, 207, 11, 199, 132, 20, 10, 156, 2, 235, - 6, 207, 10, 10, 156, 2, 235, 100, 207, 10, 10, 156, 2, 207, 18, 24, 234, - 105, 98, 239, 74, 10, 156, 2, 207, 18, 24, 234, 105, 98, 219, 22, 10, - 156, 2, 97, 247, 239, 10, 156, 2, 99, 247, 239, 10, 156, 2, 115, 247, - 239, 10, 156, 2, 115, 247, 240, 199, 132, 20, 10, 156, 2, 235, 6, 247, - 239, 10, 156, 2, 235, 100, 247, 239, 10, 156, 2, 115, 199, 132, 235, 23, - 236, 139, 10, 156, 2, 115, 199, 132, 235, 23, 236, 136, 10, 156, 2, 235, - 6, 199, 132, 235, 23, 222, 78, 10, 156, 2, 235, 6, 199, 132, 235, 23, - 222, 76, 10, 156, 2, 235, 6, 199, 132, 235, 23, 222, 79, 63, 10, 156, 2, - 235, 6, 199, 132, 235, 23, 222, 79, 250, 111, 10, 156, 2, 206, 29, 199, - 132, 235, 23, 250, 190, 10, 156, 2, 207, 71, 199, 132, 235, 23, 226, 94, - 10, 156, 2, 207, 71, 199, 132, 235, 23, 226, 96, 63, 10, 156, 2, 207, 71, - 199, 132, 235, 23, 226, 96, 250, 111, 10, 156, 2, 237, 30, 199, 132, 235, - 23, 199, 248, 10, 156, 2, 237, 30, 199, 132, 235, 23, 199, 247, 10, 156, - 2, 216, 178, 199, 132, 235, 23, 226, 110, 10, 156, 2, 216, 178, 199, 132, - 235, 23, 226, 109, 10, 156, 2, 216, 178, 199, 132, 235, 23, 226, 108, 10, - 156, 2, 216, 178, 199, 132, 235, 23, 226, 111, 63, 10, 156, 2, 99, 250, - 195, 203, 12, 10, 156, 2, 115, 250, 195, 203, 12, 10, 156, 2, 235, 6, - 250, 195, 203, 12, 10, 156, 2, 235, 100, 250, 195, 203, 12, 10, 156, 2, - 206, 29, 250, 195, 203, 12, 10, 156, 2, 97, 249, 90, 10, 156, 2, 99, 249, - 90, 10, 156, 2, 115, 249, 90, 10, 156, 2, 235, 6, 249, 90, 10, 156, 2, - 235, 6, 249, 91, 199, 132, 20, 10, 156, 2, 235, 100, 249, 90, 10, 156, 2, - 235, 100, 249, 91, 199, 132, 20, 10, 156, 2, 216, 191, 10, 156, 2, 216, - 192, 10, 156, 2, 97, 236, 135, 10, 156, 2, 99, 236, 135, 10, 156, 2, 97, - 202, 185, 239, 74, 10, 156, 2, 99, 202, 182, 239, 74, 10, 156, 2, 235, - 100, 206, 16, 239, 74, 10, 156, 2, 97, 202, 185, 199, 132, 235, 23, 63, - 10, 156, 2, 99, 202, 182, 199, 132, 235, 23, 63, 10, 156, 2, 97, 237, 26, - 250, 194, 10, 156, 2, 97, 211, 87, 250, 194, 10, 156, 2, 37, 250, 181, - 97, 206, 17, 10, 156, 2, 37, 250, 181, 97, 211, 86, 10, 156, 2, 97, 211, - 87, 233, 45, 10, 156, 2, 97, 157, 233, 45, 10, 156, 2, 237, 4, 97, 202, - 184, 10, 156, 2, 237, 4, 99, 202, 181, 10, 156, 2, 237, 4, 235, 13, 10, - 156, 2, 237, 4, 235, 144, 10, 156, 2, 235, 6, 118, 199, 132, 20, 10, 156, - 2, 235, 100, 118, 199, 132, 20, 10, 156, 2, 206, 29, 118, 199, 132, 20, - 10, 156, 2, 207, 71, 118, 199, 132, 20, 10, 156, 2, 237, 30, 118, 199, - 132, 20, 10, 156, 2, 216, 178, 118, 199, 132, 20, 10, 211, 213, 2, 37, - 250, 181, 197, 9, 239, 58, 10, 211, 213, 2, 83, 244, 167, 10, 211, 213, - 2, 239, 146, 244, 167, 10, 211, 213, 2, 239, 146, 201, 176, 10, 211, 213, - 2, 239, 146, 211, 92, 10, 2, 252, 117, 24, 215, 138, 203, 12, 10, 2, 252, - 117, 24, 206, 149, 10, 2, 252, 6, 24, 236, 137, 10, 2, 249, 127, 24, 239, - 75, 203, 12, 10, 2, 249, 113, 24, 252, 33, 10, 2, 249, 113, 24, 216, 222, - 10, 2, 249, 113, 24, 195, 115, 10, 2, 248, 21, 127, 248, 21, 24, 217, - 246, 10, 2, 240, 136, 24, 203, 129, 10, 2, 240, 126, 24, 223, 153, 10, 2, - 239, 107, 24, 226, 121, 10, 2, 239, 107, 24, 118, 118, 66, 10, 2, 239, - 105, 24, 200, 104, 10, 2, 237, 195, 24, 251, 70, 10, 2, 237, 195, 24, - 250, 194, 10, 2, 237, 195, 24, 250, 195, 250, 168, 222, 183, 10, 2, 237, - 195, 24, 239, 94, 10, 2, 237, 195, 24, 237, 187, 10, 2, 237, 195, 24, - 236, 156, 10, 2, 237, 195, 24, 234, 122, 10, 2, 237, 195, 24, 233, 191, - 10, 2, 237, 195, 24, 233, 173, 233, 51, 10, 2, 237, 195, 24, 233, 163, - 10, 2, 237, 195, 24, 142, 10, 2, 237, 195, 24, 232, 70, 10, 2, 237, 195, - 24, 226, 122, 233, 51, 10, 2, 237, 195, 24, 224, 239, 10, 2, 237, 195, - 24, 223, 153, 10, 2, 237, 195, 24, 223, 146, 10, 2, 237, 195, 24, 223, - 147, 98, 224, 239, 10, 2, 237, 195, 24, 223, 49, 10, 2, 237, 195, 24, - 222, 248, 10, 2, 237, 195, 24, 222, 249, 24, 223, 153, 10, 2, 237, 195, - 24, 221, 179, 98, 233, 163, 10, 2, 237, 195, 24, 220, 11, 10, 2, 237, - 195, 24, 219, 150, 10, 2, 237, 195, 24, 219, 77, 10, 2, 237, 195, 24, - 216, 222, 10, 2, 237, 195, 24, 212, 219, 10, 2, 237, 195, 24, 206, 255, - 10, 2, 237, 195, 24, 206, 113, 233, 51, 10, 2, 237, 83, 24, 223, 153, 10, - 2, 237, 83, 24, 213, 162, 10, 2, 236, 157, 196, 222, 10, 2, 236, 138, - 241, 54, 236, 137, 10, 2, 236, 54, 206, 237, 24, 250, 194, 10, 2, 236, - 54, 206, 237, 24, 232, 70, 10, 2, 236, 54, 206, 237, 24, 226, 122, 233, - 51, 10, 2, 236, 54, 206, 237, 24, 172, 10, 2, 236, 54, 206, 237, 24, 222, - 250, 10, 2, 236, 54, 206, 237, 24, 219, 206, 10, 2, 236, 54, 206, 237, - 24, 219, 150, 10, 2, 236, 54, 206, 237, 24, 204, 172, 10, 2, 236, 54, 24, - 204, 172, 10, 2, 234, 121, 24, 249, 112, 10, 2, 234, 121, 24, 239, 107, - 233, 51, 10, 2, 234, 121, 24, 237, 195, 24, 226, 122, 233, 51, 10, 2, - 234, 121, 24, 237, 195, 24, 224, 239, 10, 2, 234, 121, 24, 236, 159, 10, - 2, 234, 121, 24, 234, 122, 10, 2, 234, 121, 24, 234, 83, 98, 239, 151, - 10, 2, 234, 121, 24, 234, 83, 98, 217, 117, 10, 2, 234, 121, 24, 233, 3, - 98, 63, 10, 2, 234, 121, 24, 223, 147, 98, 224, 239, 10, 2, 234, 121, 24, - 222, 248, 10, 2, 234, 121, 24, 222, 249, 24, 223, 153, 10, 2, 234, 121, - 24, 221, 178, 10, 2, 234, 121, 24, 218, 92, 10, 2, 234, 121, 24, 217, - 117, 10, 2, 234, 121, 24, 217, 118, 98, 237, 82, 10, 2, 234, 121, 24, - 217, 118, 98, 233, 191, 10, 2, 234, 121, 24, 206, 215, 10, 2, 234, 121, - 24, 195, 16, 10, 2, 234, 116, 209, 194, 216, 174, 239, 229, 10, 2, 234, - 17, 24, 66, 10, 2, 233, 164, 24, 233, 164, 241, 54, 233, 163, 10, 2, 233, - 74, 24, 226, 122, 233, 51, 10, 2, 233, 65, 98, 233, 164, 24, 203, 129, - 10, 2, 233, 3, 203, 13, 233, 51, 10, 2, 232, 71, 24, 250, 195, 127, 232, - 71, 24, 250, 194, 10, 2, 225, 69, 24, 248, 20, 10, 2, 225, 69, 24, 155, - 10, 2, 225, 69, 24, 118, 118, 66, 10, 2, 225, 69, 24, 200, 21, 10, 2, - 223, 62, 24, 195, 0, 127, 194, 255, 10, 2, 223, 50, 10, 2, 223, 48, 10, - 2, 223, 47, 10, 2, 223, 46, 10, 2, 223, 45, 10, 2, 223, 44, 10, 2, 223, - 43, 10, 2, 223, 42, 127, 223, 42, 233, 51, 10, 2, 223, 41, 10, 2, 223, - 40, 127, 223, 39, 10, 2, 223, 38, 10, 2, 223, 37, 10, 2, 223, 36, 10, 2, - 223, 35, 10, 2, 223, 34, 10, 2, 223, 33, 10, 2, 223, 32, 10, 2, 223, 31, - 10, 2, 223, 30, 10, 2, 223, 29, 10, 2, 223, 28, 10, 2, 223, 27, 10, 2, - 223, 26, 10, 2, 223, 25, 10, 2, 223, 24, 10, 2, 223, 23, 10, 2, 223, 22, - 10, 2, 223, 21, 10, 2, 223, 19, 10, 2, 223, 20, 24, 233, 75, 10, 2, 223, - 20, 24, 226, 121, 10, 2, 223, 20, 24, 213, 163, 98, 221, 187, 10, 2, 223, - 20, 24, 213, 163, 98, 213, 163, 98, 221, 187, 10, 2, 223, 20, 24, 200, - 116, 98, 249, 144, 10, 2, 223, 18, 10, 2, 223, 17, 10, 2, 223, 16, 10, 2, - 223, 15, 10, 2, 223, 14, 10, 2, 223, 13, 10, 2, 223, 12, 10, 2, 223, 11, - 10, 2, 223, 10, 10, 2, 223, 9, 10, 2, 223, 7, 10, 2, 223, 8, 24, 250, - 194, 10, 2, 223, 8, 24, 249, 126, 10, 2, 223, 8, 24, 237, 186, 233, 52, - 233, 51, 10, 2, 223, 8, 24, 223, 177, 10, 2, 223, 8, 24, 172, 10, 2, 223, - 8, 24, 203, 101, 10, 2, 223, 8, 24, 203, 68, 10, 2, 223, 8, 24, 200, 115, - 10, 2, 223, 8, 24, 200, 104, 10, 2, 223, 8, 24, 200, 8, 10, 2, 223, 6, - 10, 2, 223, 4, 10, 2, 223, 5, 24, 237, 198, 10, 2, 223, 5, 24, 234, 122, - 10, 2, 223, 5, 24, 226, 121, 10, 2, 223, 5, 24, 226, 122, 233, 51, 10, 2, - 223, 5, 24, 216, 222, 10, 2, 223, 5, 24, 213, 163, 98, 213, 163, 98, 221, - 187, 10, 2, 223, 5, 24, 206, 240, 98, 224, 100, 10, 2, 223, 5, 24, 200, - 104, 10, 2, 223, 5, 24, 200, 8, 10, 2, 223, 2, 10, 2, 223, 1, 10, 2, 221, - 189, 233, 52, 24, 250, 194, 10, 2, 221, 189, 24, 239, 74, 10, 2, 221, - 189, 24, 232, 227, 10, 2, 221, 189, 24, 213, 162, 10, 2, 221, 189, 24, - 213, 163, 98, 213, 163, 98, 221, 187, 10, 2, 221, 189, 24, 203, 129, 10, - 2, 219, 78, 98, 195, 114, 10, 2, 218, 93, 127, 218, 93, 24, 234, 122, 10, - 2, 218, 93, 127, 218, 93, 24, 225, 24, 10, 2, 216, 180, 24, 239, 107, - 233, 51, 10, 2, 216, 180, 24, 233, 163, 10, 2, 216, 180, 24, 233, 56, 10, - 2, 216, 180, 24, 232, 70, 10, 2, 216, 180, 24, 224, 172, 10, 2, 216, 180, - 24, 223, 45, 10, 2, 216, 180, 24, 220, 11, 10, 2, 216, 180, 24, 213, 163, - 98, 213, 162, 10, 2, 216, 180, 24, 66, 10, 2, 216, 180, 24, 118, 98, 66, - 10, 2, 216, 180, 24, 200, 8, 10, 2, 209, 2, 233, 52, 24, 142, 10, 2, 209, - 2, 24, 236, 229, 10, 2, 209, 2, 24, 207, 0, 250, 168, 222, 183, 10, 2, + 7, 207, 10, 10, 156, 2, 235, 101, 207, 10, 10, 156, 2, 207, 18, 24, 234, + 106, 98, 239, 75, 10, 156, 2, 207, 18, 24, 234, 106, 98, 219, 23, 10, + 156, 2, 97, 247, 240, 10, 156, 2, 99, 247, 240, 10, 156, 2, 115, 247, + 240, 10, 156, 2, 115, 247, 241, 199, 132, 20, 10, 156, 2, 235, 7, 247, + 240, 10, 156, 2, 235, 101, 247, 240, 10, 156, 2, 115, 199, 132, 235, 24, + 236, 140, 10, 156, 2, 115, 199, 132, 235, 24, 236, 137, 10, 156, 2, 235, + 7, 199, 132, 235, 24, 222, 79, 10, 156, 2, 235, 7, 199, 132, 235, 24, + 222, 77, 10, 156, 2, 235, 7, 199, 132, 235, 24, 222, 80, 63, 10, 156, 2, + 235, 7, 199, 132, 235, 24, 222, 80, 250, 112, 10, 156, 2, 206, 29, 199, + 132, 235, 24, 250, 191, 10, 156, 2, 207, 71, 199, 132, 235, 24, 226, 95, + 10, 156, 2, 207, 71, 199, 132, 235, 24, 226, 97, 63, 10, 156, 2, 207, 71, + 199, 132, 235, 24, 226, 97, 250, 112, 10, 156, 2, 237, 31, 199, 132, 235, + 24, 199, 248, 10, 156, 2, 237, 31, 199, 132, 235, 24, 199, 247, 10, 156, + 2, 216, 179, 199, 132, 235, 24, 226, 111, 10, 156, 2, 216, 179, 199, 132, + 235, 24, 226, 110, 10, 156, 2, 216, 179, 199, 132, 235, 24, 226, 109, 10, + 156, 2, 216, 179, 199, 132, 235, 24, 226, 112, 63, 10, 156, 2, 99, 250, + 196, 203, 12, 10, 156, 2, 115, 250, 196, 203, 12, 10, 156, 2, 235, 7, + 250, 196, 203, 12, 10, 156, 2, 235, 101, 250, 196, 203, 12, 10, 156, 2, + 206, 29, 250, 196, 203, 12, 10, 156, 2, 97, 249, 91, 10, 156, 2, 99, 249, + 91, 10, 156, 2, 115, 249, 91, 10, 156, 2, 235, 7, 249, 91, 10, 156, 2, + 235, 7, 249, 92, 199, 132, 20, 10, 156, 2, 235, 101, 249, 91, 10, 156, 2, + 235, 101, 249, 92, 199, 132, 20, 10, 156, 2, 216, 192, 10, 156, 2, 216, + 193, 10, 156, 2, 97, 236, 136, 10, 156, 2, 99, 236, 136, 10, 156, 2, 97, + 202, 185, 239, 75, 10, 156, 2, 99, 202, 182, 239, 75, 10, 156, 2, 235, + 101, 206, 16, 239, 75, 10, 156, 2, 97, 202, 185, 199, 132, 235, 24, 63, + 10, 156, 2, 99, 202, 182, 199, 132, 235, 24, 63, 10, 156, 2, 97, 237, 27, + 250, 195, 10, 156, 2, 97, 211, 88, 250, 195, 10, 156, 2, 37, 250, 182, + 97, 206, 17, 10, 156, 2, 37, 250, 182, 97, 211, 87, 10, 156, 2, 97, 211, + 88, 233, 46, 10, 156, 2, 97, 157, 233, 46, 10, 156, 2, 237, 5, 97, 202, + 184, 10, 156, 2, 237, 5, 99, 202, 181, 10, 156, 2, 237, 5, 235, 14, 10, + 156, 2, 237, 5, 235, 145, 10, 156, 2, 235, 7, 118, 199, 132, 20, 10, 156, + 2, 235, 101, 118, 199, 132, 20, 10, 156, 2, 206, 29, 118, 199, 132, 20, + 10, 156, 2, 207, 71, 118, 199, 132, 20, 10, 156, 2, 237, 31, 118, 199, + 132, 20, 10, 156, 2, 216, 179, 118, 199, 132, 20, 10, 211, 214, 2, 37, + 250, 182, 197, 9, 239, 59, 10, 211, 214, 2, 83, 244, 168, 10, 211, 214, + 2, 239, 147, 244, 168, 10, 211, 214, 2, 239, 147, 201, 176, 10, 211, 214, + 2, 239, 147, 211, 93, 10, 2, 252, 118, 24, 215, 139, 203, 12, 10, 2, 252, + 118, 24, 206, 149, 10, 2, 252, 7, 24, 236, 138, 10, 2, 249, 128, 24, 239, + 76, 203, 12, 10, 2, 249, 114, 24, 252, 34, 10, 2, 249, 114, 24, 216, 223, + 10, 2, 249, 114, 24, 195, 115, 10, 2, 248, 22, 127, 248, 22, 24, 217, + 247, 10, 2, 240, 137, 24, 203, 129, 10, 2, 240, 127, 24, 223, 154, 10, 2, + 239, 108, 24, 226, 122, 10, 2, 239, 108, 24, 118, 118, 66, 10, 2, 239, + 106, 24, 200, 104, 10, 2, 237, 196, 24, 251, 71, 10, 2, 237, 196, 24, + 250, 195, 10, 2, 237, 196, 24, 250, 196, 250, 169, 222, 184, 10, 2, 237, + 196, 24, 239, 95, 10, 2, 237, 196, 24, 237, 188, 10, 2, 237, 196, 24, + 236, 157, 10, 2, 237, 196, 24, 234, 123, 10, 2, 237, 196, 24, 233, 192, + 10, 2, 237, 196, 24, 233, 174, 233, 52, 10, 2, 237, 196, 24, 233, 164, + 10, 2, 237, 196, 24, 142, 10, 2, 237, 196, 24, 232, 71, 10, 2, 237, 196, + 24, 226, 123, 233, 52, 10, 2, 237, 196, 24, 224, 240, 10, 2, 237, 196, + 24, 223, 154, 10, 2, 237, 196, 24, 223, 147, 10, 2, 237, 196, 24, 223, + 148, 98, 224, 240, 10, 2, 237, 196, 24, 223, 50, 10, 2, 237, 196, 24, + 222, 249, 10, 2, 237, 196, 24, 222, 250, 24, 223, 154, 10, 2, 237, 196, + 24, 221, 180, 98, 233, 164, 10, 2, 237, 196, 24, 220, 12, 10, 2, 237, + 196, 24, 219, 151, 10, 2, 237, 196, 24, 219, 78, 10, 2, 237, 196, 24, + 216, 223, 10, 2, 237, 196, 24, 212, 220, 10, 2, 237, 196, 24, 206, 255, + 10, 2, 237, 196, 24, 206, 113, 233, 52, 10, 2, 237, 84, 24, 223, 154, 10, + 2, 237, 84, 24, 213, 163, 10, 2, 236, 158, 196, 222, 10, 2, 236, 139, + 241, 55, 236, 138, 10, 2, 236, 55, 206, 237, 24, 250, 195, 10, 2, 236, + 55, 206, 237, 24, 232, 71, 10, 2, 236, 55, 206, 237, 24, 226, 123, 233, + 52, 10, 2, 236, 55, 206, 237, 24, 172, 10, 2, 236, 55, 206, 237, 24, 222, + 251, 10, 2, 236, 55, 206, 237, 24, 219, 207, 10, 2, 236, 55, 206, 237, + 24, 219, 151, 10, 2, 236, 55, 206, 237, 24, 204, 172, 10, 2, 236, 55, 24, + 204, 172, 10, 2, 234, 122, 24, 249, 113, 10, 2, 234, 122, 24, 239, 108, + 233, 52, 10, 2, 234, 122, 24, 237, 196, 24, 226, 123, 233, 52, 10, 2, + 234, 122, 24, 237, 196, 24, 224, 240, 10, 2, 234, 122, 24, 236, 160, 10, + 2, 234, 122, 24, 234, 123, 10, 2, 234, 122, 24, 234, 84, 98, 239, 152, + 10, 2, 234, 122, 24, 234, 84, 98, 217, 118, 10, 2, 234, 122, 24, 233, 4, + 98, 63, 10, 2, 234, 122, 24, 223, 148, 98, 224, 240, 10, 2, 234, 122, 24, + 222, 249, 10, 2, 234, 122, 24, 222, 250, 24, 223, 154, 10, 2, 234, 122, + 24, 221, 179, 10, 2, 234, 122, 24, 218, 93, 10, 2, 234, 122, 24, 217, + 118, 10, 2, 234, 122, 24, 217, 119, 98, 237, 83, 10, 2, 234, 122, 24, + 217, 119, 98, 233, 192, 10, 2, 234, 122, 24, 206, 215, 10, 2, 234, 122, + 24, 195, 16, 10, 2, 234, 117, 209, 194, 216, 175, 239, 230, 10, 2, 234, + 18, 24, 66, 10, 2, 233, 165, 24, 233, 165, 241, 55, 233, 164, 10, 2, 233, + 75, 24, 226, 123, 233, 52, 10, 2, 233, 66, 98, 233, 165, 24, 203, 129, + 10, 2, 233, 4, 203, 13, 233, 52, 10, 2, 232, 72, 24, 250, 196, 127, 232, + 72, 24, 250, 195, 10, 2, 225, 70, 24, 248, 21, 10, 2, 225, 70, 24, 155, + 10, 2, 225, 70, 24, 118, 118, 66, 10, 2, 225, 70, 24, 200, 21, 10, 2, + 223, 63, 24, 195, 0, 127, 194, 255, 10, 2, 223, 51, 10, 2, 223, 49, 10, + 2, 223, 48, 10, 2, 223, 47, 10, 2, 223, 46, 10, 2, 223, 45, 10, 2, 223, + 44, 10, 2, 223, 43, 127, 223, 43, 233, 52, 10, 2, 223, 42, 10, 2, 223, + 41, 127, 223, 40, 10, 2, 223, 39, 10, 2, 223, 38, 10, 2, 223, 37, 10, 2, + 223, 36, 10, 2, 223, 35, 10, 2, 223, 34, 10, 2, 223, 33, 10, 2, 223, 32, + 10, 2, 223, 31, 10, 2, 223, 30, 10, 2, 223, 29, 10, 2, 223, 28, 10, 2, + 223, 27, 10, 2, 223, 26, 10, 2, 223, 25, 10, 2, 223, 24, 10, 2, 223, 23, + 10, 2, 223, 22, 10, 2, 223, 20, 10, 2, 223, 21, 24, 233, 76, 10, 2, 223, + 21, 24, 226, 122, 10, 2, 223, 21, 24, 213, 164, 98, 221, 188, 10, 2, 223, + 21, 24, 213, 164, 98, 213, 164, 98, 221, 188, 10, 2, 223, 21, 24, 200, + 116, 98, 249, 145, 10, 2, 223, 19, 10, 2, 223, 18, 10, 2, 223, 17, 10, 2, + 223, 16, 10, 2, 223, 15, 10, 2, 223, 14, 10, 2, 223, 13, 10, 2, 223, 12, + 10, 2, 223, 11, 10, 2, 223, 10, 10, 2, 223, 8, 10, 2, 223, 9, 24, 250, + 195, 10, 2, 223, 9, 24, 249, 127, 10, 2, 223, 9, 24, 237, 187, 233, 53, + 233, 52, 10, 2, 223, 9, 24, 223, 178, 10, 2, 223, 9, 24, 172, 10, 2, 223, + 9, 24, 203, 101, 10, 2, 223, 9, 24, 203, 68, 10, 2, 223, 9, 24, 200, 115, + 10, 2, 223, 9, 24, 200, 104, 10, 2, 223, 9, 24, 200, 8, 10, 2, 223, 7, + 10, 2, 223, 5, 10, 2, 223, 6, 24, 237, 199, 10, 2, 223, 6, 24, 234, 123, + 10, 2, 223, 6, 24, 226, 122, 10, 2, 223, 6, 24, 226, 123, 233, 52, 10, 2, + 223, 6, 24, 216, 223, 10, 2, 223, 6, 24, 213, 164, 98, 213, 164, 98, 221, + 188, 10, 2, 223, 6, 24, 206, 240, 98, 224, 101, 10, 2, 223, 6, 24, 200, + 104, 10, 2, 223, 6, 24, 200, 8, 10, 2, 223, 3, 10, 2, 223, 2, 10, 2, 221, + 190, 233, 53, 24, 250, 195, 10, 2, 221, 190, 24, 239, 75, 10, 2, 221, + 190, 24, 232, 228, 10, 2, 221, 190, 24, 213, 163, 10, 2, 221, 190, 24, + 213, 164, 98, 213, 164, 98, 221, 188, 10, 2, 221, 190, 24, 203, 129, 10, + 2, 219, 79, 98, 195, 114, 10, 2, 218, 94, 127, 218, 94, 24, 234, 123, 10, + 2, 218, 94, 127, 218, 94, 24, 225, 25, 10, 2, 216, 181, 24, 239, 108, + 233, 52, 10, 2, 216, 181, 24, 233, 164, 10, 2, 216, 181, 24, 233, 57, 10, + 2, 216, 181, 24, 232, 71, 10, 2, 216, 181, 24, 224, 173, 10, 2, 216, 181, + 24, 223, 46, 10, 2, 216, 181, 24, 220, 12, 10, 2, 216, 181, 24, 213, 164, + 98, 213, 163, 10, 2, 216, 181, 24, 66, 10, 2, 216, 181, 24, 118, 98, 66, + 10, 2, 216, 181, 24, 200, 8, 10, 2, 209, 2, 233, 53, 24, 142, 10, 2, 209, + 2, 24, 236, 230, 10, 2, 209, 2, 24, 207, 0, 250, 169, 222, 184, 10, 2, 209, 2, 24, 203, 129, 10, 2, 207, 47, 203, 12, 10, 2, 207, 0, 127, 206, - 255, 10, 2, 207, 0, 98, 231, 66, 10, 2, 207, 0, 98, 217, 223, 10, 2, 207, - 0, 98, 208, 204, 10, 2, 206, 150, 98, 237, 195, 24, 216, 222, 10, 2, 206, - 150, 98, 237, 83, 24, 251, 105, 10, 2, 206, 113, 24, 203, 129, 10, 2, - 203, 130, 98, 209, 1, 10, 2, 201, 23, 24, 234, 91, 203, 12, 10, 2, 201, - 23, 24, 115, 239, 74, 10, 2, 200, 20, 226, 15, 10, 2, 200, 20, 24, 200, - 104, 10, 2, 200, 11, 24, 240, 73, 10, 2, 200, 11, 24, 223, 3, 10, 2, 200, - 11, 24, 221, 187, 10, 2, 195, 114, 10, 2, 195, 0, 127, 195, 0, 98, 208, - 204, 10, 2, 194, 254, 24, 115, 239, 75, 203, 12, 14, 7, 255, 160, 14, 7, - 255, 159, 14, 7, 255, 158, 14, 7, 255, 157, 14, 7, 255, 156, 14, 7, 255, - 155, 14, 7, 255, 154, 14, 7, 255, 153, 14, 7, 255, 152, 14, 7, 255, 151, - 14, 7, 255, 150, 14, 7, 255, 149, 14, 7, 255, 148, 14, 7, 255, 146, 14, - 7, 255, 145, 14, 7, 255, 144, 14, 7, 255, 143, 14, 7, 255, 142, 14, 7, - 255, 141, 14, 7, 255, 140, 14, 7, 255, 139, 14, 7, 255, 138, 14, 7, 255, - 137, 14, 7, 255, 136, 14, 7, 255, 135, 14, 7, 255, 134, 14, 7, 255, 133, - 14, 7, 255, 132, 14, 7, 255, 131, 14, 7, 255, 130, 14, 7, 255, 129, 14, - 7, 255, 127, 14, 7, 255, 126, 14, 7, 255, 124, 14, 7, 255, 123, 14, 7, - 255, 122, 14, 7, 255, 121, 14, 7, 255, 120, 14, 7, 255, 119, 14, 7, 255, - 118, 14, 7, 255, 117, 14, 7, 255, 116, 14, 7, 255, 115, 14, 7, 255, 114, - 14, 7, 255, 113, 14, 7, 255, 111, 14, 7, 255, 110, 14, 7, 255, 109, 14, - 7, 255, 107, 14, 7, 255, 106, 14, 7, 255, 105, 14, 7, 255, 104, 14, 7, - 255, 103, 14, 7, 255, 102, 14, 7, 255, 101, 14, 7, 255, 100, 14, 7, 255, - 97, 14, 7, 255, 96, 14, 7, 255, 95, 14, 7, 255, 94, 14, 7, 255, 93, 14, - 7, 255, 92, 14, 7, 255, 91, 14, 7, 255, 90, 14, 7, 255, 89, 14, 7, 255, - 88, 14, 7, 255, 87, 14, 7, 255, 86, 14, 7, 255, 85, 14, 7, 255, 84, 14, - 7, 255, 83, 14, 7, 255, 82, 14, 7, 255, 81, 14, 7, 255, 80, 14, 7, 255, - 79, 14, 7, 255, 78, 14, 7, 255, 74, 14, 7, 255, 73, 14, 7, 255, 72, 14, - 7, 255, 71, 14, 7, 250, 109, 14, 7, 250, 107, 14, 7, 250, 105, 14, 7, - 250, 103, 14, 7, 250, 101, 14, 7, 250, 100, 14, 7, 250, 98, 14, 7, 250, - 96, 14, 7, 250, 94, 14, 7, 250, 92, 14, 7, 247, 202, 14, 7, 247, 201, 14, - 7, 247, 200, 14, 7, 247, 199, 14, 7, 247, 198, 14, 7, 247, 197, 14, 7, - 247, 196, 14, 7, 247, 195, 14, 7, 247, 194, 14, 7, 247, 193, 14, 7, 247, - 192, 14, 7, 247, 191, 14, 7, 247, 190, 14, 7, 247, 189, 14, 7, 247, 188, - 14, 7, 247, 187, 14, 7, 247, 186, 14, 7, 247, 185, 14, 7, 247, 184, 14, - 7, 247, 183, 14, 7, 247, 182, 14, 7, 247, 181, 14, 7, 247, 180, 14, 7, - 247, 179, 14, 7, 247, 178, 14, 7, 247, 177, 14, 7, 247, 176, 14, 7, 247, - 175, 14, 7, 240, 229, 14, 7, 240, 228, 14, 7, 240, 227, 14, 7, 240, 226, - 14, 7, 240, 225, 14, 7, 240, 224, 14, 7, 240, 223, 14, 7, 240, 222, 14, - 7, 240, 221, 14, 7, 240, 220, 14, 7, 240, 219, 14, 7, 240, 218, 14, 7, - 240, 217, 14, 7, 240, 216, 14, 7, 240, 215, 14, 7, 240, 214, 14, 7, 240, - 213, 14, 7, 240, 212, 14, 7, 240, 211, 14, 7, 240, 210, 14, 7, 240, 209, - 14, 7, 240, 208, 14, 7, 240, 207, 14, 7, 240, 206, 14, 7, 240, 205, 14, - 7, 240, 204, 14, 7, 240, 203, 14, 7, 240, 202, 14, 7, 240, 201, 14, 7, - 240, 200, 14, 7, 240, 199, 14, 7, 240, 198, 14, 7, 240, 197, 14, 7, 240, - 196, 14, 7, 240, 195, 14, 7, 240, 194, 14, 7, 240, 193, 14, 7, 240, 192, - 14, 7, 240, 191, 14, 7, 240, 190, 14, 7, 240, 189, 14, 7, 240, 188, 14, - 7, 240, 187, 14, 7, 240, 186, 14, 7, 240, 185, 14, 7, 240, 184, 14, 7, - 240, 183, 14, 7, 240, 182, 14, 7, 240, 181, 14, 7, 240, 180, 14, 7, 240, - 179, 14, 7, 240, 178, 14, 7, 240, 177, 14, 7, 240, 176, 14, 7, 240, 175, - 14, 7, 240, 174, 14, 7, 240, 173, 14, 7, 240, 172, 14, 7, 240, 171, 14, - 7, 240, 170, 14, 7, 240, 169, 14, 7, 240, 168, 14, 7, 240, 167, 14, 7, - 240, 166, 14, 7, 240, 165, 14, 7, 240, 164, 14, 7, 240, 163, 14, 7, 240, - 162, 14, 7, 240, 161, 14, 7, 240, 160, 14, 7, 240, 159, 14, 7, 240, 158, - 14, 7, 240, 157, 14, 7, 240, 156, 14, 7, 240, 155, 14, 7, 240, 154, 14, - 7, 240, 153, 14, 7, 240, 152, 14, 7, 240, 151, 14, 7, 240, 150, 14, 7, - 240, 149, 14, 7, 240, 148, 14, 7, 240, 147, 14, 7, 240, 146, 14, 7, 240, - 145, 14, 7, 240, 144, 14, 7, 240, 143, 14, 7, 240, 142, 14, 7, 240, 141, - 14, 7, 240, 140, 14, 7, 240, 139, 14, 7, 240, 138, 14, 7, 237, 127, 14, - 7, 237, 126, 14, 7, 237, 125, 14, 7, 237, 124, 14, 7, 237, 123, 14, 7, - 237, 122, 14, 7, 237, 121, 14, 7, 237, 120, 14, 7, 237, 119, 14, 7, 237, - 118, 14, 7, 237, 117, 14, 7, 237, 116, 14, 7, 237, 115, 14, 7, 237, 114, - 14, 7, 237, 113, 14, 7, 237, 112, 14, 7, 237, 111, 14, 7, 237, 110, 14, - 7, 237, 109, 14, 7, 237, 108, 14, 7, 237, 107, 14, 7, 237, 106, 14, 7, - 237, 105, 14, 7, 237, 104, 14, 7, 237, 103, 14, 7, 237, 102, 14, 7, 237, - 101, 14, 7, 237, 100, 14, 7, 237, 99, 14, 7, 237, 98, 14, 7, 237, 97, 14, - 7, 237, 96, 14, 7, 237, 95, 14, 7, 237, 94, 14, 7, 237, 93, 14, 7, 237, - 92, 14, 7, 237, 91, 14, 7, 237, 90, 14, 7, 237, 89, 14, 7, 237, 88, 14, - 7, 237, 87, 14, 7, 237, 86, 14, 7, 237, 85, 14, 7, 237, 84, 14, 7, 236, - 47, 14, 7, 236, 46, 14, 7, 236, 45, 14, 7, 236, 44, 14, 7, 236, 43, 14, - 7, 236, 42, 14, 7, 236, 41, 14, 7, 236, 40, 14, 7, 236, 39, 14, 7, 236, - 38, 14, 7, 236, 37, 14, 7, 236, 36, 14, 7, 236, 35, 14, 7, 236, 34, 14, - 7, 236, 33, 14, 7, 236, 32, 14, 7, 236, 31, 14, 7, 236, 30, 14, 7, 236, - 29, 14, 7, 236, 28, 14, 7, 236, 27, 14, 7, 236, 26, 14, 7, 236, 25, 14, - 7, 236, 24, 14, 7, 236, 23, 14, 7, 236, 22, 14, 7, 236, 21, 14, 7, 236, - 20, 14, 7, 236, 19, 14, 7, 236, 18, 14, 7, 236, 17, 14, 7, 236, 16, 14, - 7, 236, 15, 14, 7, 236, 14, 14, 7, 236, 13, 14, 7, 236, 12, 14, 7, 236, - 11, 14, 7, 236, 10, 14, 7, 236, 9, 14, 7, 236, 8, 14, 7, 236, 7, 14, 7, - 236, 6, 14, 7, 236, 5, 14, 7, 236, 4, 14, 7, 236, 3, 14, 7, 236, 2, 14, - 7, 236, 1, 14, 7, 236, 0, 14, 7, 235, 255, 14, 7, 235, 254, 14, 7, 235, - 253, 14, 7, 235, 252, 14, 7, 235, 251, 14, 7, 235, 250, 14, 7, 235, 249, - 14, 7, 235, 248, 14, 7, 235, 247, 14, 7, 235, 246, 14, 7, 235, 245, 14, - 7, 235, 244, 14, 7, 235, 243, 14, 7, 235, 242, 14, 7, 235, 241, 14, 7, - 235, 240, 14, 7, 235, 239, 14, 7, 234, 188, 14, 7, 234, 187, 14, 7, 234, - 186, 14, 7, 234, 185, 14, 7, 234, 184, 14, 7, 234, 183, 14, 7, 234, 182, - 14, 7, 234, 181, 14, 7, 234, 180, 14, 7, 234, 179, 14, 7, 234, 178, 14, - 7, 234, 177, 14, 7, 234, 176, 14, 7, 234, 175, 14, 7, 234, 174, 14, 7, - 234, 173, 14, 7, 234, 172, 14, 7, 234, 171, 14, 7, 234, 170, 14, 7, 234, - 169, 14, 7, 234, 168, 14, 7, 234, 167, 14, 7, 234, 166, 14, 7, 234, 165, - 14, 7, 234, 164, 14, 7, 234, 163, 14, 7, 234, 162, 14, 7, 234, 161, 14, - 7, 234, 160, 14, 7, 234, 159, 14, 7, 234, 158, 14, 7, 234, 157, 14, 7, - 234, 156, 14, 7, 234, 155, 14, 7, 234, 154, 14, 7, 234, 153, 14, 7, 234, - 152, 14, 7, 234, 151, 14, 7, 234, 150, 14, 7, 234, 149, 14, 7, 234, 148, - 14, 7, 234, 147, 14, 7, 234, 146, 14, 7, 234, 145, 14, 7, 234, 144, 14, - 7, 234, 143, 14, 7, 234, 142, 14, 7, 234, 141, 14, 7, 234, 140, 14, 7, - 234, 139, 14, 7, 234, 138, 14, 7, 234, 137, 14, 7, 234, 136, 14, 7, 234, - 135, 14, 7, 234, 134, 14, 7, 234, 133, 14, 7, 234, 132, 14, 7, 234, 131, - 14, 7, 234, 130, 14, 7, 234, 129, 14, 7, 234, 128, 14, 7, 234, 127, 14, - 7, 234, 126, 14, 7, 234, 125, 14, 7, 233, 12, 14, 7, 233, 11, 14, 7, 233, - 10, 14, 7, 233, 9, 14, 7, 233, 8, 14, 7, 233, 7, 14, 7, 233, 6, 14, 7, - 233, 5, 14, 7, 233, 4, 14, 7, 230, 228, 14, 7, 230, 227, 14, 7, 230, 226, - 14, 7, 230, 225, 14, 7, 230, 224, 14, 7, 230, 223, 14, 7, 230, 222, 14, - 7, 230, 221, 14, 7, 230, 220, 14, 7, 230, 219, 14, 7, 230, 218, 14, 7, - 230, 217, 14, 7, 230, 216, 14, 7, 230, 215, 14, 7, 230, 214, 14, 7, 230, - 213, 14, 7, 230, 212, 14, 7, 230, 211, 14, 7, 230, 210, 14, 7, 225, 78, - 14, 7, 225, 77, 14, 7, 225, 76, 14, 7, 225, 75, 14, 7, 225, 74, 14, 7, - 225, 73, 14, 7, 225, 72, 14, 7, 225, 71, 14, 7, 223, 96, 14, 7, 223, 95, - 14, 7, 223, 94, 14, 7, 223, 93, 14, 7, 223, 92, 14, 7, 223, 91, 14, 7, - 223, 90, 14, 7, 223, 89, 14, 7, 223, 88, 14, 7, 223, 87, 14, 7, 221, 133, - 14, 7, 221, 132, 14, 7, 221, 131, 14, 7, 221, 129, 14, 7, 221, 127, 14, - 7, 221, 126, 14, 7, 221, 124, 14, 7, 221, 122, 14, 7, 221, 120, 14, 7, - 221, 118, 14, 7, 221, 116, 14, 7, 221, 114, 14, 7, 221, 112, 14, 7, 221, - 111, 14, 7, 221, 109, 14, 7, 221, 107, 14, 7, 221, 106, 14, 7, 221, 105, - 14, 7, 221, 104, 14, 7, 221, 103, 14, 7, 221, 102, 14, 7, 221, 101, 14, - 7, 221, 100, 14, 7, 221, 99, 14, 7, 221, 97, 14, 7, 221, 95, 14, 7, 221, - 93, 14, 7, 221, 92, 14, 7, 221, 90, 14, 7, 221, 89, 14, 7, 221, 87, 14, - 7, 221, 86, 14, 7, 221, 84, 14, 7, 221, 82, 14, 7, 221, 80, 14, 7, 221, - 78, 14, 7, 221, 76, 14, 7, 221, 75, 14, 7, 221, 73, 14, 7, 221, 71, 14, - 7, 221, 70, 14, 7, 221, 68, 14, 7, 221, 66, 14, 7, 221, 64, 14, 7, 221, - 62, 14, 7, 221, 61, 14, 7, 221, 59, 14, 7, 221, 57, 14, 7, 221, 55, 14, - 7, 221, 54, 14, 7, 221, 52, 14, 7, 221, 50, 14, 7, 221, 49, 14, 7, 221, - 48, 14, 7, 221, 46, 14, 7, 221, 44, 14, 7, 221, 42, 14, 7, 221, 40, 14, - 7, 221, 38, 14, 7, 221, 36, 14, 7, 221, 34, 14, 7, 221, 33, 14, 7, 221, - 31, 14, 7, 221, 29, 14, 7, 221, 27, 14, 7, 221, 25, 14, 7, 218, 49, 14, - 7, 218, 48, 14, 7, 218, 47, 14, 7, 218, 46, 14, 7, 218, 45, 14, 7, 218, - 44, 14, 7, 218, 43, 14, 7, 218, 42, 14, 7, 218, 41, 14, 7, 218, 40, 14, - 7, 218, 39, 14, 7, 218, 38, 14, 7, 218, 37, 14, 7, 218, 36, 14, 7, 218, - 35, 14, 7, 218, 34, 14, 7, 218, 33, 14, 7, 218, 32, 14, 7, 218, 31, 14, - 7, 218, 30, 14, 7, 218, 29, 14, 7, 218, 28, 14, 7, 218, 27, 14, 7, 218, - 26, 14, 7, 218, 25, 14, 7, 218, 24, 14, 7, 218, 23, 14, 7, 218, 22, 14, - 7, 218, 21, 14, 7, 218, 20, 14, 7, 218, 19, 14, 7, 218, 18, 14, 7, 218, - 17, 14, 7, 218, 16, 14, 7, 218, 15, 14, 7, 218, 14, 14, 7, 218, 13, 14, - 7, 218, 12, 14, 7, 218, 11, 14, 7, 218, 10, 14, 7, 218, 9, 14, 7, 218, 8, - 14, 7, 218, 7, 14, 7, 218, 6, 14, 7, 218, 5, 14, 7, 218, 4, 14, 7, 218, - 3, 14, 7, 218, 2, 14, 7, 218, 1, 14, 7, 216, 110, 14, 7, 216, 109, 14, 7, - 216, 108, 14, 7, 216, 107, 14, 7, 216, 106, 14, 7, 216, 105, 14, 7, 216, - 104, 14, 7, 216, 103, 14, 7, 216, 102, 14, 7, 216, 101, 14, 7, 216, 100, - 14, 7, 216, 99, 14, 7, 216, 98, 14, 7, 216, 97, 14, 7, 216, 96, 14, 7, - 216, 95, 14, 7, 216, 94, 14, 7, 216, 93, 14, 7, 216, 92, 14, 7, 216, 91, - 14, 7, 216, 90, 14, 7, 216, 89, 14, 7, 215, 181, 14, 7, 215, 180, 14, 7, - 215, 179, 14, 7, 215, 178, 14, 7, 215, 177, 14, 7, 215, 176, 14, 7, 215, - 175, 14, 7, 215, 174, 14, 7, 215, 173, 14, 7, 215, 172, 14, 7, 215, 171, - 14, 7, 215, 170, 14, 7, 215, 169, 14, 7, 215, 168, 14, 7, 215, 167, 14, - 7, 215, 166, 14, 7, 215, 165, 14, 7, 215, 164, 14, 7, 215, 163, 14, 7, - 215, 162, 14, 7, 215, 161, 14, 7, 215, 160, 14, 7, 215, 159, 14, 7, 215, - 158, 14, 7, 215, 157, 14, 7, 215, 156, 14, 7, 215, 9, 14, 7, 215, 8, 14, - 7, 215, 7, 14, 7, 215, 6, 14, 7, 215, 5, 14, 7, 215, 4, 14, 7, 215, 3, - 14, 7, 215, 2, 14, 7, 215, 1, 14, 7, 215, 0, 14, 7, 214, 255, 14, 7, 214, - 254, 14, 7, 214, 253, 14, 7, 214, 252, 14, 7, 214, 251, 14, 7, 214, 250, - 14, 7, 214, 249, 14, 7, 214, 248, 14, 7, 214, 247, 14, 7, 214, 246, 14, - 7, 214, 245, 14, 7, 214, 244, 14, 7, 214, 243, 14, 7, 214, 242, 14, 7, - 214, 241, 14, 7, 214, 240, 14, 7, 214, 239, 14, 7, 214, 238, 14, 7, 214, - 237, 14, 7, 214, 236, 14, 7, 214, 235, 14, 7, 214, 234, 14, 7, 214, 233, - 14, 7, 214, 232, 14, 7, 214, 231, 14, 7, 214, 230, 14, 7, 214, 229, 14, - 7, 214, 228, 14, 7, 214, 227, 14, 7, 214, 226, 14, 7, 214, 225, 14, 7, - 214, 224, 14, 7, 214, 223, 14, 7, 214, 222, 14, 7, 214, 221, 14, 7, 214, - 220, 14, 7, 214, 219, 14, 7, 214, 218, 14, 7, 214, 217, 14, 7, 214, 216, - 14, 7, 214, 215, 14, 7, 214, 214, 14, 7, 214, 213, 14, 7, 214, 212, 14, - 7, 214, 211, 14, 7, 214, 210, 14, 7, 214, 209, 14, 7, 214, 208, 14, 7, - 214, 207, 14, 7, 214, 206, 14, 7, 214, 205, 14, 7, 214, 204, 14, 7, 214, - 203, 14, 7, 214, 202, 14, 7, 214, 201, 14, 7, 214, 200, 14, 7, 214, 199, - 14, 7, 214, 198, 14, 7, 214, 197, 14, 7, 214, 196, 14, 7, 214, 195, 14, - 7, 214, 194, 14, 7, 214, 193, 14, 7, 214, 192, 14, 7, 214, 191, 14, 7, - 214, 1, 14, 7, 214, 0, 14, 7, 213, 255, 14, 7, 213, 254, 14, 7, 213, 253, - 14, 7, 213, 252, 14, 7, 213, 251, 14, 7, 213, 250, 14, 7, 213, 249, 14, - 7, 213, 248, 14, 7, 213, 247, 14, 7, 213, 246, 14, 7, 213, 245, 14, 7, - 211, 165, 14, 7, 211, 164, 14, 7, 211, 163, 14, 7, 211, 162, 14, 7, 211, - 161, 14, 7, 211, 160, 14, 7, 211, 159, 14, 7, 211, 29, 14, 7, 211, 28, - 14, 7, 211, 27, 14, 7, 211, 26, 14, 7, 211, 25, 14, 7, 211, 24, 14, 7, - 211, 23, 14, 7, 211, 22, 14, 7, 211, 21, 14, 7, 211, 20, 14, 7, 211, 19, - 14, 7, 211, 18, 14, 7, 211, 17, 14, 7, 211, 16, 14, 7, 211, 15, 14, 7, - 211, 14, 14, 7, 211, 13, 14, 7, 211, 12, 14, 7, 211, 11, 14, 7, 211, 10, - 14, 7, 211, 9, 14, 7, 211, 8, 14, 7, 211, 7, 14, 7, 211, 6, 14, 7, 211, - 5, 14, 7, 211, 4, 14, 7, 211, 3, 14, 7, 211, 2, 14, 7, 211, 1, 14, 7, - 211, 0, 14, 7, 210, 255, 14, 7, 210, 254, 14, 7, 210, 253, 14, 7, 210, - 252, 14, 7, 209, 77, 14, 7, 209, 76, 14, 7, 209, 75, 14, 7, 209, 74, 14, - 7, 209, 73, 14, 7, 209, 72, 14, 7, 209, 71, 14, 7, 209, 70, 14, 7, 209, - 69, 14, 7, 209, 68, 14, 7, 209, 67, 14, 7, 209, 66, 14, 7, 209, 65, 14, - 7, 209, 64, 14, 7, 209, 63, 14, 7, 209, 62, 14, 7, 209, 61, 14, 7, 209, - 60, 14, 7, 209, 59, 14, 7, 209, 58, 14, 7, 209, 57, 14, 7, 209, 56, 14, - 7, 209, 55, 14, 7, 209, 54, 14, 7, 209, 53, 14, 7, 209, 52, 14, 7, 209, - 51, 14, 7, 209, 50, 14, 7, 209, 49, 14, 7, 209, 48, 14, 7, 209, 47, 14, - 7, 209, 46, 14, 7, 209, 45, 14, 7, 209, 44, 14, 7, 209, 43, 14, 7, 209, - 42, 14, 7, 209, 41, 14, 7, 209, 40, 14, 7, 209, 39, 14, 7, 209, 38, 14, - 7, 209, 37, 14, 7, 209, 36, 14, 7, 209, 35, 14, 7, 209, 34, 14, 7, 209, - 33, 14, 7, 209, 32, 14, 7, 209, 31, 14, 7, 209, 30, 14, 7, 209, 29, 14, - 7, 209, 28, 14, 7, 209, 27, 14, 7, 209, 26, 14, 7, 209, 25, 14, 7, 209, - 24, 14, 7, 203, 213, 14, 7, 203, 212, 14, 7, 203, 211, 14, 7, 203, 210, - 14, 7, 203, 209, 14, 7, 203, 208, 14, 7, 203, 207, 14, 7, 203, 206, 14, - 7, 203, 205, 14, 7, 203, 204, 14, 7, 203, 203, 14, 7, 203, 202, 14, 7, - 203, 201, 14, 7, 203, 200, 14, 7, 203, 199, 14, 7, 203, 198, 14, 7, 203, - 197, 14, 7, 203, 196, 14, 7, 203, 195, 14, 7, 203, 194, 14, 7, 203, 193, - 14, 7, 203, 192, 14, 7, 203, 191, 14, 7, 203, 190, 14, 7, 203, 189, 14, - 7, 203, 188, 14, 7, 203, 187, 14, 7, 203, 186, 14, 7, 203, 185, 14, 7, - 203, 184, 14, 7, 203, 183, 14, 7, 203, 182, 14, 7, 203, 181, 14, 7, 203, - 180, 14, 7, 203, 179, 14, 7, 203, 178, 14, 7, 203, 177, 14, 7, 203, 176, - 14, 7, 203, 175, 14, 7, 203, 174, 14, 7, 203, 173, 14, 7, 203, 172, 14, - 7, 203, 171, 14, 7, 203, 170, 14, 7, 200, 163, 14, 7, 200, 162, 14, 7, - 200, 161, 14, 7, 200, 160, 14, 7, 200, 159, 14, 7, 200, 158, 14, 7, 200, - 157, 14, 7, 200, 156, 14, 7, 200, 155, 14, 7, 200, 154, 14, 7, 200, 153, - 14, 7, 200, 152, 14, 7, 200, 151, 14, 7, 200, 150, 14, 7, 200, 149, 14, - 7, 200, 148, 14, 7, 200, 147, 14, 7, 200, 146, 14, 7, 200, 145, 14, 7, - 200, 144, 14, 7, 200, 143, 14, 7, 200, 142, 14, 7, 200, 141, 14, 7, 200, - 140, 14, 7, 200, 139, 14, 7, 200, 138, 14, 7, 200, 137, 14, 7, 200, 136, - 14, 7, 200, 135, 14, 7, 200, 134, 14, 7, 200, 133, 14, 7, 200, 132, 14, - 7, 200, 131, 14, 7, 200, 130, 14, 7, 200, 129, 14, 7, 200, 128, 14, 7, - 200, 127, 14, 7, 200, 126, 14, 7, 200, 125, 14, 7, 200, 124, 14, 7, 200, - 123, 14, 7, 200, 122, 14, 7, 200, 121, 14, 7, 200, 120, 14, 7, 200, 119, - 14, 7, 200, 118, 14, 7, 200, 117, 14, 7, 199, 229, 14, 7, 199, 228, 14, - 7, 199, 227, 14, 7, 199, 226, 14, 7, 199, 225, 14, 7, 199, 224, 14, 7, - 199, 223, 14, 7, 199, 222, 14, 7, 199, 221, 14, 7, 199, 220, 14, 7, 199, - 219, 14, 7, 199, 218, 14, 7, 199, 217, 14, 7, 199, 216, 14, 7, 199, 215, - 14, 7, 199, 214, 14, 7, 199, 213, 14, 7, 199, 212, 14, 7, 199, 211, 14, - 7, 199, 210, 14, 7, 199, 209, 14, 7, 199, 208, 14, 7, 199, 207, 14, 7, - 199, 206, 14, 7, 199, 205, 14, 7, 199, 204, 14, 7, 199, 203, 14, 7, 199, - 202, 14, 7, 199, 201, 14, 7, 199, 200, 14, 7, 199, 199, 14, 7, 199, 198, - 14, 7, 199, 197, 14, 7, 199, 196, 14, 7, 199, 195, 14, 7, 199, 194, 14, - 7, 199, 193, 14, 7, 199, 192, 14, 7, 199, 191, 14, 7, 199, 190, 14, 7, - 199, 189, 14, 7, 199, 188, 14, 7, 199, 187, 14, 7, 199, 186, 14, 7, 199, - 185, 14, 7, 199, 184, 14, 7, 199, 183, 14, 7, 199, 182, 14, 7, 199, 181, - 14, 7, 199, 180, 14, 7, 199, 179, 14, 7, 199, 178, 14, 7, 199, 177, 14, - 7, 199, 176, 14, 7, 199, 175, 14, 7, 199, 174, 14, 7, 199, 173, 14, 7, - 199, 172, 14, 7, 199, 171, 14, 7, 199, 170, 14, 7, 199, 169, 14, 7, 199, - 168, 14, 7, 199, 167, 14, 7, 199, 166, 14, 7, 199, 165, 14, 7, 199, 164, - 14, 7, 199, 163, 14, 7, 199, 162, 14, 7, 199, 161, 14, 7, 199, 160, 14, - 7, 199, 159, 14, 7, 199, 158, 14, 7, 199, 157, 14, 7, 199, 156, 14, 7, - 199, 155, 14, 7, 199, 154, 14, 7, 199, 153, 14, 7, 197, 198, 14, 7, 197, - 197, 14, 7, 197, 196, 14, 7, 197, 195, 14, 7, 197, 194, 14, 7, 197, 193, - 14, 7, 197, 192, 14, 7, 197, 191, 14, 7, 197, 190, 14, 7, 197, 189, 14, - 7, 197, 188, 14, 7, 197, 187, 14, 7, 197, 186, 14, 7, 197, 185, 14, 7, - 197, 184, 14, 7, 197, 183, 14, 7, 197, 182, 14, 7, 197, 181, 14, 7, 197, - 180, 14, 7, 197, 179, 14, 7, 197, 178, 14, 7, 197, 177, 14, 7, 197, 176, - 14, 7, 197, 175, 14, 7, 197, 174, 14, 7, 197, 173, 14, 7, 197, 172, 14, - 7, 197, 171, 14, 7, 197, 170, 14, 7, 197, 169, 14, 7, 197, 168, 14, 7, - 197, 167, 14, 7, 196, 220, 14, 7, 196, 219, 14, 7, 196, 218, 14, 7, 196, - 217, 14, 7, 196, 216, 14, 7, 196, 215, 14, 7, 196, 214, 14, 7, 196, 213, - 14, 7, 196, 212, 14, 7, 196, 211, 14, 7, 196, 210, 14, 7, 196, 209, 14, - 7, 196, 146, 14, 7, 196, 145, 14, 7, 196, 144, 14, 7, 196, 143, 14, 7, - 196, 142, 14, 7, 196, 141, 14, 7, 196, 140, 14, 7, 196, 139, 14, 7, 196, - 138, 14, 7, 195, 157, 14, 7, 195, 156, 14, 7, 195, 155, 14, 7, 195, 154, - 14, 7, 195, 153, 14, 7, 195, 152, 14, 7, 195, 151, 14, 7, 195, 150, 14, - 7, 195, 149, 14, 7, 195, 148, 14, 7, 195, 147, 14, 7, 195, 146, 14, 7, - 195, 145, 14, 7, 195, 144, 14, 7, 195, 143, 14, 7, 195, 142, 14, 7, 195, - 141, 14, 7, 195, 140, 14, 7, 195, 139, 14, 7, 195, 138, 14, 7, 195, 137, - 14, 7, 195, 136, 14, 7, 195, 135, 14, 7, 195, 134, 14, 7, 195, 133, 14, - 7, 195, 132, 14, 7, 195, 131, 14, 7, 195, 130, 14, 7, 195, 129, 14, 7, - 195, 128, 14, 7, 195, 127, 14, 7, 195, 126, 14, 7, 195, 125, 14, 7, 195, - 124, 14, 7, 195, 123, 14, 7, 195, 122, 14, 7, 195, 121, 14, 7, 195, 120, - 14, 7, 195, 119, 14, 7, 195, 118, 14, 7, 195, 117, 14, 7, 252, 166, 14, - 7, 252, 165, 14, 7, 252, 164, 14, 7, 252, 163, 14, 7, 252, 162, 14, 7, - 252, 161, 14, 7, 252, 160, 14, 7, 252, 159, 14, 7, 252, 158, 14, 7, 252, - 157, 14, 7, 252, 156, 14, 7, 252, 155, 14, 7, 252, 154, 14, 7, 252, 153, - 14, 7, 252, 152, 14, 7, 252, 151, 14, 7, 252, 150, 14, 7, 252, 149, 14, - 7, 252, 148, 14, 7, 252, 147, 14, 7, 252, 146, 14, 7, 252, 145, 14, 7, - 252, 144, 14, 7, 252, 143, 14, 7, 252, 142, 14, 7, 252, 141, 14, 7, 252, - 140, 14, 7, 252, 139, 14, 7, 252, 138, 14, 7, 252, 137, 14, 7, 252, 136, - 14, 7, 252, 135, 14, 7, 252, 134, 14, 7, 252, 133, 14, 7, 83, 225, 123, - 14, 7, 231, 154, 225, 123, 14, 7, 226, 43, 250, 168, 201, 243, 205, 2, - 14, 7, 226, 43, 250, 168, 248, 84, 205, 2, 14, 7, 226, 43, 250, 168, 201, - 243, 236, 220, 14, 7, 226, 43, 250, 168, 248, 84, 236, 220, 14, 7, 214, - 20, 219, 62, 14, 7, 248, 242, 208, 122, 14, 7, 236, 221, 208, 122, 28, 7, - 255, 160, 28, 7, 255, 159, 28, 7, 255, 158, 28, 7, 255, 157, 28, 7, 255, - 156, 28, 7, 255, 154, 28, 7, 255, 151, 28, 7, 255, 150, 28, 7, 255, 149, - 28, 7, 255, 148, 28, 7, 255, 147, 28, 7, 255, 146, 28, 7, 255, 145, 28, - 7, 255, 144, 28, 7, 255, 143, 28, 7, 255, 141, 28, 7, 255, 140, 28, 7, - 255, 139, 28, 7, 255, 137, 28, 7, 255, 136, 28, 7, 255, 135, 28, 7, 255, - 134, 28, 7, 255, 133, 28, 7, 255, 132, 28, 7, 255, 131, 28, 7, 255, 130, - 28, 7, 255, 129, 28, 7, 255, 128, 28, 7, 255, 127, 28, 7, 255, 126, 28, - 7, 255, 124, 28, 7, 255, 123, 28, 7, 255, 122, 28, 7, 255, 121, 28, 7, - 255, 119, 28, 7, 255, 118, 28, 7, 255, 117, 28, 7, 255, 116, 28, 7, 255, - 115, 28, 7, 255, 114, 28, 7, 255, 113, 28, 7, 255, 112, 28, 7, 255, 111, - 28, 7, 255, 109, 28, 7, 255, 108, 28, 7, 255, 107, 28, 7, 255, 105, 28, - 7, 255, 103, 28, 7, 255, 102, 28, 7, 255, 101, 28, 7, 255, 100, 28, 7, - 255, 99, 28, 7, 255, 98, 28, 7, 255, 97, 28, 7, 255, 96, 28, 7, 255, 95, - 28, 7, 255, 94, 28, 7, 255, 93, 28, 7, 255, 92, 28, 7, 255, 91, 28, 7, - 255, 90, 28, 7, 255, 89, 28, 7, 255, 88, 28, 7, 255, 87, 28, 7, 255, 86, - 28, 7, 255, 85, 28, 7, 255, 84, 28, 7, 255, 83, 28, 7, 255, 82, 28, 7, - 255, 81, 28, 7, 255, 80, 28, 7, 255, 79, 28, 7, 255, 78, 28, 7, 255, 77, - 28, 7, 255, 76, 28, 7, 255, 75, 28, 7, 255, 74, 28, 7, 255, 73, 28, 7, - 255, 72, 28, 7, 255, 71, 28, 7, 255, 70, 28, 7, 255, 69, 28, 7, 255, 68, - 28, 7, 255, 67, 28, 7, 255, 66, 28, 7, 255, 65, 28, 7, 255, 64, 28, 7, - 255, 63, 28, 7, 255, 62, 28, 7, 255, 61, 28, 7, 255, 60, 28, 7, 255, 59, - 28, 7, 255, 58, 28, 7, 255, 57, 28, 7, 255, 56, 28, 7, 255, 55, 28, 7, - 255, 54, 28, 7, 255, 53, 28, 7, 255, 52, 28, 7, 255, 51, 28, 7, 255, 50, - 28, 7, 255, 49, 28, 7, 255, 48, 28, 7, 255, 47, 28, 7, 255, 46, 28, 7, - 255, 45, 28, 7, 255, 44, 28, 7, 255, 43, 28, 7, 255, 42, 28, 7, 255, 41, - 28, 7, 255, 40, 28, 7, 255, 39, 28, 7, 255, 37, 28, 7, 255, 36, 28, 7, - 255, 35, 28, 7, 255, 34, 28, 7, 255, 33, 28, 7, 255, 32, 28, 7, 255, 31, - 28, 7, 255, 30, 28, 7, 255, 29, 28, 7, 255, 28, 28, 7, 255, 27, 28, 7, - 255, 26, 28, 7, 255, 25, 28, 7, 255, 24, 28, 7, 255, 23, 28, 7, 255, 22, - 28, 7, 255, 21, 28, 7, 255, 20, 28, 7, 255, 19, 28, 7, 255, 18, 28, 7, - 255, 17, 28, 7, 255, 16, 28, 7, 255, 15, 28, 7, 255, 14, 28, 7, 255, 13, - 28, 7, 255, 12, 28, 7, 255, 11, 28, 7, 255, 10, 28, 7, 255, 9, 28, 7, - 255, 8, 28, 7, 255, 7, 28, 7, 255, 6, 28, 7, 255, 5, 28, 7, 255, 4, 28, - 7, 255, 2, 28, 7, 255, 1, 28, 7, 255, 0, 28, 7, 254, 255, 28, 7, 254, - 254, 28, 7, 254, 253, 28, 7, 254, 252, 28, 7, 254, 251, 28, 7, 254, 250, - 28, 7, 254, 249, 28, 7, 254, 248, 28, 7, 254, 247, 28, 7, 254, 245, 28, - 7, 254, 244, 28, 7, 254, 243, 28, 7, 254, 242, 28, 7, 254, 241, 28, 7, - 254, 240, 28, 7, 254, 239, 28, 7, 254, 238, 28, 7, 254, 237, 28, 7, 254, - 236, 28, 7, 254, 235, 28, 7, 254, 234, 28, 7, 254, 233, 28, 7, 254, 232, - 28, 7, 254, 231, 28, 7, 254, 230, 28, 7, 254, 229, 28, 7, 254, 228, 28, - 7, 254, 227, 28, 7, 254, 226, 28, 7, 254, 225, 28, 7, 254, 224, 28, 7, - 254, 223, 28, 7, 254, 222, 28, 7, 254, 221, 28, 7, 254, 220, 28, 7, 254, - 219, 28, 7, 254, 218, 28, 7, 254, 217, 28, 7, 254, 216, 28, 7, 254, 215, - 28, 7, 254, 214, 28, 7, 254, 213, 28, 7, 254, 212, 28, 7, 254, 211, 28, - 7, 254, 210, 28, 7, 254, 209, 28, 7, 254, 208, 28, 7, 254, 207, 28, 7, - 254, 206, 28, 7, 254, 205, 28, 7, 254, 204, 28, 7, 254, 203, 28, 7, 254, - 202, 28, 7, 254, 201, 28, 7, 254, 200, 28, 7, 254, 199, 28, 7, 254, 198, - 28, 7, 254, 197, 28, 7, 254, 196, 28, 7, 254, 195, 28, 7, 254, 194, 28, - 7, 254, 193, 28, 7, 254, 192, 28, 7, 254, 191, 28, 7, 254, 190, 28, 7, - 254, 189, 28, 7, 254, 188, 28, 7, 254, 187, 28, 7, 254, 186, 28, 7, 254, - 185, 28, 7, 254, 184, 28, 7, 254, 183, 28, 7, 254, 182, 28, 7, 254, 181, - 28, 7, 254, 180, 28, 7, 254, 179, 28, 7, 254, 178, 28, 7, 254, 177, 28, - 7, 254, 175, 28, 7, 254, 174, 28, 7, 254, 173, 28, 7, 254, 172, 28, 7, - 254, 171, 28, 7, 254, 170, 28, 7, 254, 169, 28, 7, 254, 168, 28, 7, 254, - 167, 28, 7, 254, 166, 28, 7, 254, 165, 28, 7, 254, 164, 28, 7, 254, 163, - 28, 7, 254, 162, 28, 7, 254, 161, 28, 7, 254, 160, 28, 7, 254, 159, 28, - 7, 254, 158, 28, 7, 254, 157, 28, 7, 254, 156, 28, 7, 254, 155, 28, 7, - 254, 154, 28, 7, 254, 153, 28, 7, 254, 152, 28, 7, 254, 151, 28, 7, 254, - 150, 28, 7, 254, 149, 28, 7, 254, 148, 28, 7, 254, 147, 28, 7, 254, 146, - 28, 7, 254, 145, 28, 7, 254, 144, 28, 7, 254, 143, 28, 7, 254, 142, 28, - 7, 254, 141, 28, 7, 254, 140, 28, 7, 254, 139, 28, 7, 254, 138, 28, 7, - 254, 137, 28, 7, 254, 136, 28, 7, 254, 135, 28, 7, 254, 134, 28, 7, 254, - 133, 28, 7, 254, 132, 28, 7, 254, 131, 28, 7, 254, 130, 28, 7, 254, 129, - 28, 7, 254, 128, 28, 7, 254, 127, 28, 7, 254, 126, 28, 7, 254, 125, 28, - 7, 254, 124, 28, 7, 254, 123, 28, 7, 254, 122, 28, 7, 254, 121, 28, 7, - 254, 120, 28, 7, 254, 119, 28, 7, 254, 118, 28, 7, 254, 117, 28, 7, 254, - 116, 28, 7, 254, 115, 28, 7, 254, 114, 28, 7, 254, 113, 28, 7, 254, 112, - 28, 7, 254, 111, 28, 7, 254, 110, 28, 7, 254, 109, 28, 7, 254, 108, 28, - 7, 254, 107, 28, 7, 254, 106, 28, 7, 254, 105, 28, 7, 254, 104, 28, 7, - 254, 103, 28, 7, 254, 102, 28, 7, 254, 101, 28, 7, 254, 100, 28, 7, 254, - 99, 28, 7, 254, 98, 28, 7, 254, 97, 28, 7, 254, 96, 28, 7, 254, 95, 28, - 7, 254, 94, 28, 7, 254, 93, 28, 7, 254, 92, 28, 7, 254, 91, 28, 7, 254, - 90, 28, 7, 254, 89, 28, 7, 254, 88, 28, 7, 254, 87, 28, 7, 254, 86, 28, - 7, 254, 85, 28, 7, 254, 84, 28, 7, 254, 83, 28, 7, 254, 82, 28, 7, 254, - 81, 28, 7, 254, 80, 28, 7, 254, 79, 28, 7, 254, 78, 28, 7, 254, 77, 28, - 7, 254, 76, 28, 7, 254, 75, 28, 7, 254, 74, 28, 7, 254, 73, 28, 7, 254, - 72, 28, 7, 254, 71, 28, 7, 254, 70, 28, 7, 254, 69, 28, 7, 254, 68, 28, - 7, 254, 67, 28, 7, 254, 66, 28, 7, 254, 65, 28, 7, 254, 63, 28, 7, 254, - 62, 28, 7, 254, 61, 28, 7, 254, 60, 28, 7, 254, 59, 28, 7, 254, 58, 28, - 7, 254, 57, 28, 7, 254, 56, 28, 7, 254, 55, 28, 7, 254, 54, 28, 7, 254, - 53, 28, 7, 254, 50, 28, 7, 254, 49, 28, 7, 254, 48, 28, 7, 254, 47, 28, - 7, 254, 43, 28, 7, 254, 42, 28, 7, 254, 41, 28, 7, 254, 40, 28, 7, 254, - 39, 28, 7, 254, 38, 28, 7, 254, 37, 28, 7, 254, 36, 28, 7, 254, 35, 28, - 7, 254, 34, 28, 7, 254, 33, 28, 7, 254, 32, 28, 7, 254, 31, 28, 7, 254, - 30, 28, 7, 254, 29, 28, 7, 254, 28, 28, 7, 254, 27, 28, 7, 254, 26, 28, - 7, 254, 25, 28, 7, 254, 23, 28, 7, 254, 22, 28, 7, 254, 21, 28, 7, 254, - 20, 28, 7, 254, 19, 28, 7, 254, 18, 28, 7, 254, 17, 28, 7, 254, 16, 28, - 7, 254, 15, 28, 7, 254, 14, 28, 7, 254, 13, 28, 7, 254, 12, 28, 7, 254, - 11, 28, 7, 254, 10, 28, 7, 254, 9, 28, 7, 254, 8, 28, 7, 254, 7, 28, 7, - 254, 6, 28, 7, 254, 5, 28, 7, 254, 4, 28, 7, 254, 3, 28, 7, 254, 2, 28, - 7, 254, 1, 28, 7, 254, 0, 28, 7, 253, 255, 28, 7, 253, 254, 28, 7, 253, - 253, 28, 7, 253, 252, 28, 7, 253, 251, 28, 7, 253, 250, 28, 7, 253, 249, - 28, 7, 253, 248, 28, 7, 253, 247, 28, 7, 253, 246, 28, 7, 253, 245, 28, - 7, 253, 244, 28, 7, 253, 243, 28, 7, 253, 242, 28, 7, 253, 241, 28, 7, - 253, 240, 28, 7, 253, 239, 28, 7, 253, 238, 28, 7, 253, 237, 28, 7, 253, - 236, 28, 7, 253, 235, 28, 7, 253, 234, 28, 7, 253, 233, 28, 7, 253, 232, - 28, 7, 253, 231, 28, 7, 253, 230, 28, 7, 253, 229, 28, 7, 253, 228, 28, - 7, 253, 227, 28, 7, 253, 226, 28, 7, 253, 225, 28, 7, 253, 224, 28, 7, - 253, 223, 28, 7, 253, 222, 28, 7, 253, 221, 28, 7, 253, 220, 28, 7, 253, - 219, 28, 7, 253, 218, 210, 251, 214, 72, 210, 72, 28, 7, 253, 217, 28, 7, - 253, 216, 28, 7, 253, 215, 28, 7, 253, 214, 28, 7, 253, 213, 28, 7, 253, - 212, 28, 7, 253, 211, 28, 7, 253, 210, 28, 7, 253, 209, 28, 7, 253, 208, - 28, 7, 253, 207, 28, 7, 253, 206, 171, 28, 7, 253, 205, 28, 7, 253, 204, - 28, 7, 253, 203, 28, 7, 253, 202, 28, 7, 253, 201, 28, 7, 253, 200, 28, - 7, 253, 199, 28, 7, 253, 197, 28, 7, 253, 195, 28, 7, 253, 193, 28, 7, - 253, 191, 28, 7, 253, 189, 28, 7, 253, 187, 28, 7, 253, 185, 28, 7, 253, - 183, 28, 7, 253, 181, 28, 7, 253, 179, 248, 242, 221, 247, 78, 28, 7, - 253, 177, 236, 221, 221, 247, 78, 28, 7, 253, 176, 28, 7, 253, 174, 28, - 7, 253, 172, 28, 7, 253, 170, 28, 7, 253, 168, 28, 7, 253, 166, 28, 7, - 253, 164, 28, 7, 253, 162, 28, 7, 253, 160, 28, 7, 253, 159, 28, 7, 253, - 158, 28, 7, 253, 157, 28, 7, 253, 156, 28, 7, 253, 155, 28, 7, 253, 154, - 28, 7, 253, 153, 28, 7, 253, 152, 28, 7, 253, 151, 28, 7, 253, 150, 28, - 7, 253, 149, 28, 7, 253, 148, 28, 7, 253, 147, 28, 7, 253, 146, 28, 7, - 253, 145, 28, 7, 253, 144, 28, 7, 253, 143, 28, 7, 253, 142, 28, 7, 253, - 141, 28, 7, 253, 140, 28, 7, 253, 139, 28, 7, 253, 138, 28, 7, 253, 137, - 28, 7, 253, 136, 28, 7, 253, 135, 28, 7, 253, 134, 28, 7, 253, 133, 28, - 7, 253, 132, 28, 7, 253, 131, 28, 7, 253, 130, 28, 7, 253, 129, 28, 7, - 253, 128, 28, 7, 253, 127, 28, 7, 253, 126, 28, 7, 253, 125, 28, 7, 253, - 124, 28, 7, 253, 123, 28, 7, 253, 122, 28, 7, 253, 121, 28, 7, 253, 120, - 28, 7, 253, 119, 28, 7, 253, 118, 28, 7, 253, 117, 28, 7, 253, 116, 28, - 7, 253, 115, 28, 7, 253, 114, 28, 7, 253, 113, 28, 7, 253, 112, 28, 7, - 253, 111, 28, 7, 253, 110, 28, 7, 253, 109, 28, 7, 253, 108, 28, 7, 253, - 107, 28, 7, 253, 106, 28, 7, 253, 105, 28, 7, 253, 104, 28, 7, 253, 103, - 28, 7, 253, 102, 28, 7, 253, 101, 28, 7, 253, 100, 28, 7, 253, 99, 28, 7, - 253, 98, 28, 7, 253, 97, 28, 7, 253, 96, 28, 7, 253, 95, 28, 7, 253, 94, - 28, 7, 253, 93, 28, 7, 253, 92, 28, 7, 253, 91, 28, 7, 253, 90, 28, 7, - 253, 89, 28, 7, 253, 88, 28, 7, 253, 87, 28, 7, 253, 86, 28, 7, 253, 85, - 28, 7, 253, 84, 28, 7, 253, 83, 28, 7, 253, 82, 28, 7, 253, 81, 28, 7, - 253, 80, 28, 7, 253, 79, 28, 7, 253, 78, 28, 7, 253, 77, 28, 7, 253, 76, - 28, 7, 253, 75, 28, 7, 253, 74, 28, 7, 253, 73, 28, 7, 253, 72, 28, 7, - 253, 71, 28, 7, 253, 70, 28, 7, 253, 69, 28, 7, 253, 68, 28, 7, 253, 67, - 28, 7, 253, 66, 28, 7, 253, 65, 28, 7, 253, 64, 28, 7, 253, 63, 28, 7, - 253, 62, 28, 7, 253, 61, 28, 7, 253, 60, 28, 7, 253, 59, 28, 7, 253, 58, - 28, 7, 253, 57, 28, 7, 253, 56, 28, 7, 253, 55, 28, 7, 253, 54, 28, 7, - 253, 53, 28, 7, 253, 52, 28, 7, 253, 51, 28, 7, 253, 50, 25, 1, 212, 251, - 217, 3, 219, 119, 25, 1, 212, 251, 234, 55, 235, 42, 25, 1, 212, 251, - 212, 93, 219, 120, 212, 166, 25, 1, 212, 251, 212, 93, 219, 120, 212, - 167, 25, 1, 212, 251, 217, 244, 219, 119, 25, 1, 212, 251, 206, 146, 25, - 1, 212, 251, 202, 56, 219, 119, 25, 1, 212, 251, 215, 54, 219, 119, 25, - 1, 212, 251, 206, 210, 213, 243, 216, 147, 25, 1, 212, 251, 212, 93, 213, - 243, 216, 148, 212, 166, 25, 1, 212, 251, 212, 93, 213, 243, 216, 148, - 212, 167, 25, 1, 212, 251, 220, 98, 25, 1, 212, 251, 201, 41, 220, 99, - 25, 1, 212, 251, 217, 64, 25, 1, 212, 251, 220, 95, 25, 1, 212, 251, 220, - 48, 25, 1, 212, 251, 218, 77, 25, 1, 212, 251, 207, 73, 25, 1, 212, 251, - 215, 194, 25, 1, 212, 251, 224, 164, 25, 1, 212, 251, 216, 114, 25, 1, - 212, 251, 204, 74, 25, 1, 212, 251, 217, 2, 25, 1, 212, 251, 222, 229, - 25, 1, 212, 251, 222, 136, 223, 144, 25, 1, 212, 251, 215, 204, 219, 127, - 25, 1, 212, 251, 220, 102, 25, 1, 212, 251, 213, 124, 25, 1, 212, 251, - 233, 210, 25, 1, 212, 251, 213, 194, 25, 1, 212, 251, 218, 215, 217, 37, - 25, 1, 212, 251, 215, 35, 219, 130, 25, 1, 212, 251, 118, 195, 187, 217, - 237, 25, 1, 212, 251, 233, 211, 25, 1, 212, 251, 215, 204, 215, 205, 25, - 1, 212, 251, 206, 32, 25, 1, 212, 251, 219, 112, 25, 1, 212, 251, 219, - 133, 25, 1, 212, 251, 218, 190, 25, 1, 212, 251, 225, 33, 25, 1, 212, - 251, 213, 243, 222, 184, 25, 1, 212, 251, 217, 159, 222, 184, 25, 1, 212, - 251, 213, 17, 25, 1, 212, 251, 220, 96, 25, 1, 212, 251, 216, 188, 25, 1, - 212, 251, 211, 205, 25, 1, 212, 251, 201, 33, 25, 1, 212, 251, 221, 186, - 25, 1, 212, 251, 205, 172, 25, 1, 212, 251, 202, 242, 25, 1, 212, 251, - 220, 93, 25, 1, 212, 251, 224, 171, 25, 1, 212, 251, 217, 155, 25, 1, - 212, 251, 223, 158, 25, 1, 212, 251, 218, 191, 25, 1, 212, 251, 206, 142, - 25, 1, 212, 251, 221, 240, 25, 1, 212, 251, 235, 113, 25, 1, 212, 251, - 209, 209, 25, 1, 212, 251, 223, 211, 25, 1, 212, 251, 205, 168, 25, 1, - 212, 251, 220, 43, 212, 209, 25, 1, 212, 251, 206, 203, 25, 1, 212, 251, - 215, 203, 25, 1, 212, 251, 206, 184, 215, 215, 195, 195, 25, 1, 212, 251, - 215, 76, 218, 211, 25, 1, 212, 251, 213, 238, 25, 1, 212, 251, 216, 116, - 25, 1, 212, 251, 200, 44, 25, 1, 212, 251, 217, 40, 25, 1, 212, 251, 220, - 92, 25, 1, 212, 251, 216, 159, 25, 1, 212, 251, 219, 235, 25, 1, 212, - 251, 215, 91, 25, 1, 212, 251, 202, 246, 25, 1, 212, 251, 205, 165, 25, - 1, 212, 251, 213, 239, 25, 1, 212, 251, 215, 219, 25, 1, 212, 251, 220, - 100, 25, 1, 212, 251, 215, 88, 25, 1, 212, 251, 224, 251, 25, 1, 212, - 251, 215, 222, 25, 1, 212, 251, 199, 113, 25, 1, 212, 251, 221, 190, 25, - 1, 212, 251, 217, 100, 25, 1, 212, 251, 217, 211, 25, 1, 212, 251, 219, - 234, 25, 1, 212, 250, 215, 217, 25, 1, 212, 250, 201, 41, 220, 97, 25, 1, - 212, 250, 206, 94, 25, 1, 212, 250, 207, 77, 201, 40, 25, 1, 212, 250, - 221, 242, 215, 200, 25, 1, 212, 250, 219, 241, 220, 101, 25, 1, 212, 250, - 224, 84, 25, 1, 212, 250, 196, 32, 25, 1, 212, 250, 219, 236, 25, 1, 212, - 250, 225, 19, 25, 1, 212, 250, 213, 74, 25, 1, 212, 250, 196, 115, 222, - 184, 25, 1, 212, 250, 222, 249, 215, 215, 215, 102, 25, 1, 212, 250, 215, - 197, 206, 229, 25, 1, 212, 250, 217, 126, 216, 162, 25, 1, 212, 250, 233, - 208, 25, 1, 212, 250, 212, 156, 25, 1, 212, 250, 201, 41, 215, 213, 25, - 1, 212, 250, 206, 234, 216, 157, 25, 1, 212, 250, 206, 230, 25, 1, 212, - 250, 219, 120, 202, 245, 25, 1, 212, 250, 219, 223, 219, 237, 25, 1, 212, - 250, 215, 89, 215, 200, 25, 1, 212, 250, 224, 160, 25, 1, 212, 250, 233, - 209, 25, 1, 212, 250, 224, 156, 25, 1, 212, 250, 223, 76, 25, 1, 212, - 250, 213, 127, 25, 1, 212, 250, 199, 42, 25, 1, 212, 250, 217, 4, 218, - 75, 25, 1, 212, 250, 217, 39, 219, 219, 25, 1, 212, 250, 196, 241, 25, 1, - 212, 250, 208, 247, 25, 1, 212, 250, 203, 158, 25, 1, 212, 250, 219, 132, - 25, 1, 212, 250, 217, 23, 25, 1, 212, 250, 217, 24, 222, 226, 25, 1, 212, - 250, 219, 122, 25, 1, 212, 250, 204, 127, 25, 1, 212, 250, 219, 227, 25, - 1, 212, 250, 218, 195, 25, 1, 212, 250, 215, 106, 25, 1, 212, 250, 211, - 209, 25, 1, 212, 250, 219, 131, 217, 41, 25, 1, 212, 250, 235, 157, 25, - 1, 212, 250, 219, 214, 25, 1, 212, 250, 235, 181, 25, 1, 212, 250, 224, - 168, 25, 1, 212, 250, 220, 127, 216, 151, 25, 1, 212, 250, 220, 127, 216, - 127, 25, 1, 212, 250, 222, 135, 25, 1, 212, 250, 217, 47, 25, 1, 212, - 250, 215, 224, 25, 1, 212, 250, 166, 25, 1, 212, 250, 224, 67, 25, 1, - 212, 250, 216, 248, 25, 1, 193, 217, 3, 220, 99, 25, 1, 193, 215, 53, 25, - 1, 193, 195, 195, 25, 1, 193, 197, 143, 25, 1, 193, 217, 40, 25, 1, 193, - 217, 147, 25, 1, 193, 217, 10, 25, 1, 193, 233, 218, 25, 1, 193, 219, - 231, 25, 1, 193, 234, 62, 25, 1, 193, 215, 78, 219, 3, 219, 134, 25, 1, - 193, 215, 191, 219, 222, 25, 1, 193, 219, 228, 25, 1, 193, 212, 162, 25, - 1, 193, 217, 132, 25, 1, 193, 219, 239, 247, 169, 25, 1, 193, 224, 158, - 25, 1, 193, 233, 219, 25, 1, 193, 224, 165, 25, 1, 193, 195, 218, 218, - 108, 25, 1, 193, 215, 47, 25, 1, 193, 219, 216, 25, 1, 193, 215, 223, 25, - 1, 193, 219, 222, 25, 1, 193, 196, 33, 25, 1, 193, 223, 219, 25, 1, 193, - 225, 54, 25, 1, 193, 207, 72, 25, 1, 193, 217, 141, 25, 1, 193, 203, 156, - 25, 1, 193, 216, 131, 25, 1, 193, 202, 56, 195, 199, 25, 1, 193, 204, - 159, 25, 1, 193, 217, 30, 215, 102, 25, 1, 193, 199, 41, 25, 1, 193, 217, - 214, 25, 1, 193, 220, 127, 224, 167, 25, 1, 193, 215, 205, 25, 1, 193, - 217, 25, 25, 1, 193, 222, 230, 25, 1, 193, 219, 224, 25, 1, 193, 219, - 111, 25, 1, 193, 215, 199, 25, 1, 193, 202, 241, 25, 1, 193, 217, 27, 25, - 1, 193, 234, 220, 25, 1, 193, 217, 146, 25, 1, 193, 215, 225, 25, 1, 193, - 215, 221, 25, 1, 193, 247, 252, 25, 1, 193, 199, 43, 25, 1, 193, 219, - 229, 25, 1, 193, 209, 140, 25, 1, 193, 216, 161, 25, 1, 193, 222, 248, - 25, 1, 193, 202, 53, 25, 1, 193, 215, 207, 216, 248, 25, 1, 193, 216, - 153, 25, 1, 193, 224, 171, 25, 1, 193, 217, 32, 25, 1, 193, 220, 92, 25, - 1, 193, 219, 217, 25, 1, 193, 221, 190, 25, 1, 193, 223, 144, 25, 1, 193, - 216, 159, 25, 1, 193, 216, 248, 25, 1, 193, 196, 231, 25, 1, 193, 217, - 28, 25, 1, 193, 215, 210, 25, 1, 193, 215, 201, 25, 1, 193, 223, 160, - 216, 116, 25, 1, 193, 215, 208, 25, 1, 193, 217, 154, 25, 1, 193, 220, - 127, 215, 213, 25, 1, 193, 196, 129, 25, 1, 193, 217, 153, 25, 1, 193, - 206, 145, 25, 1, 193, 207, 75, 25, 1, 193, 219, 225, 25, 1, 193, 220, 99, - 25, 1, 193, 219, 235, 25, 1, 193, 224, 159, 25, 1, 193, 219, 226, 25, 1, - 193, 224, 163, 25, 1, 193, 219, 239, 212, 214, 25, 1, 193, 195, 178, 25, - 1, 193, 216, 149, 25, 1, 193, 219, 58, 25, 1, 193, 218, 138, 25, 1, 193, - 206, 206, 25, 1, 193, 224, 182, 222, 208, 25, 1, 193, 224, 182, 235, 194, - 25, 1, 193, 217, 62, 25, 1, 193, 217, 211, 25, 1, 193, 222, 56, 25, 1, - 193, 212, 175, 25, 1, 193, 213, 64, 25, 1, 193, 203, 1, 25, 1, 148, 219, - 215, 25, 1, 148, 197, 141, 25, 1, 148, 216, 147, 25, 1, 148, 219, 119, - 25, 1, 148, 216, 145, 25, 1, 148, 222, 101, 25, 1, 148, 216, 150, 25, 1, - 148, 215, 220, 25, 1, 148, 217, 46, 25, 1, 148, 215, 102, 25, 1, 148, - 196, 242, 25, 1, 148, 217, 0, 25, 1, 148, 206, 253, 25, 1, 148, 217, 11, - 25, 1, 148, 224, 166, 25, 1, 148, 202, 243, 25, 1, 148, 206, 232, 25, 1, - 148, 216, 158, 25, 1, 148, 204, 127, 25, 1, 148, 224, 171, 25, 1, 148, - 196, 117, 25, 1, 148, 223, 161, 25, 1, 148, 208, 207, 25, 1, 148, 219, - 124, 25, 1, 148, 217, 145, 25, 1, 148, 220, 64, 25, 1, 148, 219, 130, 25, - 1, 148, 207, 74, 25, 1, 148, 196, 59, 25, 1, 148, 216, 152, 25, 1, 148, - 224, 162, 219, 218, 25, 1, 148, 217, 7, 25, 1, 148, 201, 40, 25, 1, 148, - 233, 228, 25, 1, 148, 216, 253, 25, 1, 148, 235, 158, 25, 1, 148, 217, - 149, 25, 1, 148, 219, 103, 25, 1, 148, 222, 129, 25, 1, 148, 217, 131, - 25, 1, 148, 218, 210, 25, 1, 148, 219, 107, 25, 1, 148, 211, 189, 25, 1, - 148, 219, 105, 25, 1, 148, 219, 121, 25, 1, 148, 221, 173, 25, 1, 148, - 215, 212, 25, 1, 148, 219, 238, 25, 1, 148, 223, 133, 25, 1, 148, 215, - 91, 25, 1, 148, 202, 246, 25, 1, 148, 205, 165, 25, 1, 148, 195, 178, 25, - 1, 148, 224, 163, 25, 1, 148, 210, 227, 25, 1, 148, 203, 47, 25, 1, 148, - 217, 8, 25, 1, 148, 219, 126, 25, 1, 148, 215, 211, 25, 1, 148, 224, 161, - 25, 1, 148, 212, 168, 25, 1, 148, 213, 10, 25, 1, 148, 215, 64, 25, 1, - 148, 222, 135, 25, 1, 148, 217, 47, 25, 1, 148, 219, 123, 25, 1, 148, - 217, 20, 25, 1, 148, 195, 192, 25, 1, 148, 213, 162, 25, 1, 148, 195, - 191, 25, 1, 148, 217, 154, 25, 1, 148, 215, 200, 25, 1, 148, 204, 161, - 25, 1, 148, 223, 165, 25, 1, 148, 217, 36, 25, 1, 148, 217, 5, 25, 1, - 148, 201, 15, 25, 1, 148, 219, 134, 25, 1, 148, 223, 155, 25, 1, 148, - 215, 209, 25, 1, 148, 202, 244, 25, 1, 148, 220, 94, 25, 1, 148, 217, 45, - 25, 1, 148, 222, 128, 25, 1, 148, 217, 26, 25, 1, 148, 215, 214, 25, 1, - 148, 216, 131, 25, 1, 148, 233, 212, 25, 1, 148, 223, 186, 25, 1, 148, - 210, 127, 214, 132, 25, 1, 148, 203, 145, 25, 1, 148, 201, 239, 25, 1, - 148, 215, 88, 25, 1, 148, 210, 9, 25, 1, 148, 222, 186, 25, 1, 148, 219, - 186, 25, 1, 148, 221, 135, 25, 1, 148, 204, 74, 25, 1, 148, 218, 144, 25, - 1, 148, 206, 218, 25, 1, 148, 206, 228, 25, 1, 148, 223, 105, 25, 1, 148, - 215, 185, 25, 1, 148, 206, 151, 25, 1, 148, 215, 202, 25, 1, 148, 213, - 78, 25, 1, 148, 216, 222, 25, 1, 148, 206, 183, 25, 1, 148, 211, 204, 25, - 1, 148, 218, 75, 25, 1, 148, 221, 220, 25, 1, 148, 210, 127, 218, 133, - 25, 1, 148, 202, 122, 25, 1, 148, 215, 188, 25, 1, 148, 219, 239, 178, - 25, 1, 148, 208, 205, 25, 1, 148, 235, 237, 25, 1, 104, 217, 153, 25, 1, - 104, 201, 245, 25, 1, 104, 219, 228, 25, 1, 104, 222, 230, 25, 1, 104, - 198, 235, 25, 1, 104, 221, 226, 25, 1, 104, 213, 242, 25, 1, 104, 205, - 176, 25, 1, 104, 210, 201, 25, 1, 104, 215, 216, 25, 1, 104, 217, 124, - 25, 1, 104, 211, 222, 25, 1, 104, 203, 117, 25, 1, 104, 217, 13, 25, 1, - 104, 223, 215, 25, 1, 104, 196, 234, 25, 1, 104, 208, 129, 25, 1, 104, - 217, 37, 25, 1, 104, 213, 239, 25, 1, 104, 201, 247, 25, 1, 104, 223, - 159, 25, 1, 104, 221, 241, 25, 1, 104, 215, 219, 25, 1, 104, 216, 245, - 25, 1, 104, 220, 100, 25, 1, 104, 217, 6, 25, 1, 104, 216, 244, 25, 1, - 104, 215, 218, 25, 1, 104, 210, 6, 25, 1, 104, 216, 149, 25, 1, 104, 213, - 76, 25, 1, 104, 209, 13, 25, 1, 104, 217, 21, 25, 1, 104, 219, 113, 25, - 1, 104, 233, 206, 25, 1, 104, 217, 9, 25, 1, 104, 216, 160, 25, 1, 104, - 220, 42, 25, 1, 104, 221, 222, 25, 1, 104, 217, 42, 25, 1, 104, 217, 137, - 25, 1, 104, 203, 144, 215, 200, 25, 1, 104, 207, 76, 25, 1, 104, 211, - 215, 25, 1, 104, 217, 157, 205, 184, 25, 1, 104, 217, 29, 215, 102, 25, - 1, 104, 196, 20, 25, 1, 104, 233, 207, 25, 1, 104, 201, 34, 25, 1, 104, - 196, 36, 25, 1, 104, 212, 116, 25, 1, 104, 201, 21, 25, 1, 104, 224, 169, - 25, 1, 104, 204, 160, 25, 1, 104, 202, 245, 25, 1, 104, 199, 44, 25, 1, - 104, 197, 84, 25, 1, 104, 223, 79, 25, 1, 104, 211, 226, 25, 1, 104, 203, - 157, 25, 1, 104, 233, 227, 25, 1, 104, 217, 52, 25, 1, 104, 206, 231, 25, - 1, 104, 219, 108, 25, 1, 104, 219, 232, 25, 1, 104, 215, 51, 25, 1, 104, - 216, 112, 25, 1, 104, 234, 58, 25, 1, 104, 201, 22, 25, 1, 104, 223, 169, - 25, 1, 104, 196, 93, 25, 1, 104, 215, 89, 244, 219, 25, 1, 104, 196, 9, - 25, 1, 104, 219, 125, 25, 1, 104, 217, 142, 25, 1, 104, 212, 210, 25, 1, - 104, 195, 198, 25, 1, 104, 222, 130, 25, 1, 104, 234, 220, 25, 1, 104, - 234, 57, 25, 1, 104, 216, 255, 25, 1, 104, 224, 171, 25, 1, 104, 220, - 103, 25, 1, 104, 217, 12, 25, 1, 104, 233, 213, 25, 1, 104, 235, 238, 25, - 1, 104, 215, 189, 25, 1, 104, 213, 11, 25, 1, 104, 196, 34, 25, 1, 104, - 217, 38, 25, 1, 104, 215, 89, 248, 202, 25, 1, 104, 215, 31, 25, 1, 104, - 212, 88, 25, 1, 104, 219, 58, 25, 1, 104, 234, 218, 25, 1, 104, 217, 237, - 25, 1, 104, 218, 138, 25, 1, 104, 233, 212, 25, 1, 104, 234, 223, 68, 25, - 1, 104, 218, 76, 25, 1, 104, 211, 221, 25, 1, 104, 217, 1, 25, 1, 104, - 223, 144, 25, 1, 104, 212, 207, 25, 1, 104, 215, 203, 25, 1, 104, 196, - 35, 25, 1, 104, 217, 22, 25, 1, 104, 213, 243, 213, 50, 25, 1, 104, 234, - 223, 247, 151, 25, 1, 104, 235, 43, 25, 1, 104, 216, 154, 25, 1, 104, 63, - 25, 1, 104, 201, 239, 25, 1, 104, 72, 25, 1, 104, 68, 25, 1, 104, 222, - 228, 25, 1, 104, 213, 243, 212, 125, 25, 1, 104, 203, 162, 25, 1, 104, - 203, 102, 25, 1, 104, 217, 157, 218, 63, 231, 86, 25, 1, 104, 206, 206, - 25, 1, 104, 196, 31, 25, 1, 104, 216, 238, 25, 1, 104, 195, 203, 25, 1, - 104, 195, 235, 204, 53, 25, 1, 104, 195, 235, 241, 85, 25, 1, 104, 195, - 186, 25, 1, 104, 195, 194, 25, 1, 104, 224, 157, 25, 1, 104, 213, 9, 25, - 1, 104, 216, 155, 236, 175, 25, 1, 104, 211, 217, 25, 1, 104, 196, 240, - 25, 1, 104, 235, 181, 25, 1, 104, 199, 113, 25, 1, 104, 221, 190, 25, 1, - 104, 219, 77, 25, 1, 104, 210, 91, 25, 1, 104, 210, 228, 25, 1, 104, 216, - 237, 25, 1, 104, 217, 70, 25, 1, 104, 206, 198, 25, 1, 104, 206, 183, 25, - 1, 104, 234, 223, 210, 130, 25, 1, 104, 176, 25, 1, 104, 212, 219, 25, 1, - 104, 221, 220, 25, 1, 104, 224, 10, 25, 1, 104, 219, 163, 25, 1, 104, - 166, 25, 1, 104, 220, 39, 25, 1, 104, 202, 247, 25, 1, 104, 224, 100, 25, - 1, 104, 218, 214, 25, 1, 104, 203, 23, 25, 1, 104, 235, 205, 25, 1, 104, - 233, 200, 25, 1, 212, 249, 155, 25, 1, 212, 249, 66, 25, 1, 212, 249, - 223, 186, 25, 1, 212, 249, 237, 53, 25, 1, 212, 249, 210, 154, 25, 1, - 212, 249, 203, 145, 25, 1, 212, 249, 215, 88, 25, 1, 212, 249, 172, 25, - 1, 212, 249, 210, 9, 25, 1, 212, 249, 210, 57, 25, 1, 212, 249, 219, 186, - 25, 1, 212, 249, 203, 162, 25, 1, 212, 249, 217, 156, 25, 1, 212, 249, - 216, 161, 25, 1, 212, 249, 221, 135, 25, 1, 212, 249, 204, 74, 25, 1, - 212, 249, 206, 218, 25, 1, 212, 249, 206, 112, 25, 1, 212, 249, 207, 72, - 25, 1, 212, 249, 223, 105, 25, 1, 212, 249, 224, 171, 25, 1, 212, 249, - 215, 153, 25, 1, 212, 249, 215, 185, 25, 1, 212, 249, 216, 132, 25, 1, - 212, 249, 195, 234, 25, 1, 212, 249, 206, 151, 25, 1, 212, 249, 164, 25, - 1, 212, 249, 215, 222, 25, 1, 212, 249, 213, 9, 25, 1, 212, 249, 215, - 202, 25, 1, 212, 249, 196, 240, 25, 1, 212, 249, 213, 78, 25, 1, 212, - 249, 209, 140, 25, 1, 212, 249, 216, 222, 25, 1, 212, 249, 210, 91, 25, - 1, 212, 249, 224, 181, 25, 1, 212, 249, 216, 254, 25, 1, 212, 249, 217, - 49, 25, 1, 212, 249, 206, 198, 25, 1, 212, 249, 211, 222, 25, 1, 212, - 249, 235, 43, 25, 1, 212, 249, 197, 166, 25, 1, 212, 249, 222, 108, 25, - 1, 212, 249, 221, 220, 25, 1, 212, 249, 224, 10, 25, 1, 212, 249, 219, - 230, 25, 1, 212, 249, 210, 126, 25, 1, 212, 249, 166, 25, 1, 212, 249, - 218, 250, 25, 1, 212, 249, 219, 238, 25, 1, 212, 249, 203, 1, 25, 1, 212, - 249, 223, 222, 25, 1, 212, 249, 208, 227, 25, 1, 212, 249, 197, 219, 218, - 148, 1, 189, 218, 148, 1, 217, 18, 218, 148, 1, 196, 3, 218, 148, 1, 219, - 24, 218, 148, 1, 249, 144, 218, 148, 1, 240, 135, 218, 148, 1, 63, 218, - 148, 1, 212, 245, 218, 148, 1, 224, 140, 218, 148, 1, 232, 177, 218, 148, - 1, 240, 110, 218, 148, 1, 245, 29, 218, 148, 1, 224, 201, 218, 148, 1, - 214, 133, 218, 148, 1, 220, 100, 218, 148, 1, 216, 182, 218, 148, 1, 161, - 218, 148, 1, 214, 101, 218, 148, 1, 72, 218, 148, 1, 209, 232, 218, 148, - 1, 206, 223, 218, 148, 1, 202, 216, 218, 148, 1, 237, 81, 218, 148, 1, - 197, 166, 218, 148, 1, 69, 218, 148, 1, 224, 10, 218, 148, 1, 222, 237, - 218, 148, 1, 172, 218, 148, 1, 232, 234, 218, 148, 1, 210, 72, 218, 148, - 1, 203, 37, 218, 148, 17, 195, 79, 218, 148, 17, 100, 218, 148, 17, 102, - 218, 148, 17, 134, 218, 148, 17, 136, 218, 148, 17, 146, 218, 148, 17, - 167, 218, 148, 17, 178, 218, 148, 17, 171, 218, 148, 17, 182, 218, 148, - 240, 87, 218, 148, 52, 240, 87, 249, 58, 199, 149, 1, 236, 210, 249, 58, - 199, 149, 1, 155, 249, 58, 199, 149, 1, 208, 147, 249, 58, 199, 149, 1, - 235, 238, 249, 58, 199, 149, 1, 219, 233, 249, 58, 199, 149, 1, 196, 21, - 249, 58, 199, 149, 1, 234, 107, 249, 58, 199, 149, 1, 239, 156, 249, 58, - 199, 149, 1, 223, 221, 249, 58, 199, 149, 1, 225, 128, 249, 58, 199, 149, - 1, 231, 41, 249, 58, 199, 149, 1, 197, 166, 249, 58, 199, 149, 1, 195, - 11, 249, 58, 199, 149, 1, 234, 51, 249, 58, 199, 149, 1, 239, 27, 249, - 58, 199, 149, 1, 247, 56, 249, 58, 199, 149, 1, 199, 238, 249, 58, 199, - 149, 1, 149, 249, 58, 199, 149, 1, 249, 144, 249, 58, 199, 149, 1, 197, - 220, 249, 58, 199, 149, 1, 196, 63, 249, 58, 199, 149, 1, 161, 249, 58, - 199, 149, 1, 197, 158, 249, 58, 199, 149, 1, 63, 249, 58, 199, 149, 1, - 72, 249, 58, 199, 149, 1, 214, 101, 249, 58, 199, 149, 1, 66, 249, 58, - 199, 149, 1, 237, 53, 249, 58, 199, 149, 1, 69, 249, 58, 199, 149, 1, 68, - 249, 58, 199, 149, 38, 130, 202, 11, 249, 58, 199, 149, 38, 126, 202, 11, - 249, 58, 199, 149, 38, 219, 64, 202, 11, 249, 58, 199, 149, 38, 221, 204, - 202, 11, 249, 58, 199, 149, 38, 232, 45, 202, 11, 249, 58, 199, 149, 234, - 216, 204, 226, 133, 86, 18, 224, 198, 133, 86, 18, 224, 194, 133, 86, 18, - 224, 89, 133, 86, 18, 224, 52, 133, 86, 18, 224, 226, 133, 86, 18, 224, - 223, 133, 86, 18, 223, 170, 133, 86, 18, 223, 141, 133, 86, 18, 224, 200, - 133, 86, 18, 224, 155, 133, 86, 18, 225, 29, 133, 86, 18, 225, 26, 133, - 86, 18, 223, 240, 133, 86, 18, 223, 237, 133, 86, 18, 224, 219, 133, 86, - 18, 224, 217, 133, 86, 18, 223, 172, 133, 86, 18, 223, 171, 133, 86, 18, - 224, 3, 133, 86, 18, 223, 226, 133, 86, 18, 224, 91, 133, 86, 18, 224, - 90, 133, 86, 18, 225, 44, 133, 86, 18, 224, 222, 133, 86, 18, 223, 131, - 133, 86, 18, 223, 122, 133, 86, 18, 225, 53, 133, 86, 18, 225, 45, 133, - 86, 108, 199, 124, 133, 86, 108, 215, 192, 133, 86, 108, 222, 214, 133, - 86, 108, 232, 157, 133, 86, 108, 216, 88, 133, 86, 108, 210, 192, 133, - 86, 108, 216, 115, 133, 86, 108, 211, 132, 133, 86, 108, 196, 80, 133, - 86, 108, 232, 21, 133, 86, 108, 219, 254, 133, 86, 108, 245, 106, 133, - 86, 108, 217, 161, 133, 86, 108, 231, 213, 133, 86, 108, 212, 133, 133, - 86, 108, 215, 198, 133, 86, 108, 217, 201, 133, 86, 108, 250, 149, 133, - 86, 108, 196, 204, 133, 86, 108, 247, 89, 133, 86, 117, 244, 254, 201, - 31, 133, 86, 117, 244, 254, 205, 200, 133, 86, 117, 244, 254, 224, 173, - 133, 86, 117, 244, 254, 224, 131, 133, 86, 117, 244, 254, 204, 158, 133, - 86, 117, 244, 254, 231, 171, 133, 86, 117, 244, 254, 203, 88, 133, 86, 2, - 198, 230, 202, 166, 133, 86, 2, 198, 230, 201, 102, 247, 47, 133, 86, 2, - 244, 254, 245, 95, 133, 86, 2, 198, 230, 202, 194, 133, 86, 2, 198, 230, - 235, 178, 133, 86, 2, 196, 160, 215, 186, 133, 86, 2, 196, 160, 210, 74, - 133, 86, 2, 196, 160, 201, 222, 133, 86, 2, 196, 160, 235, 219, 133, 86, - 2, 198, 230, 208, 123, 133, 86, 2, 219, 185, 204, 162, 133, 86, 2, 198, - 230, 215, 238, 133, 86, 2, 230, 205, 196, 100, 133, 86, 2, 196, 203, 133, - 86, 2, 244, 254, 201, 89, 209, 215, 133, 86, 17, 195, 79, 133, 86, 17, + 255, 10, 2, 207, 0, 98, 231, 67, 10, 2, 207, 0, 98, 217, 224, 10, 2, 207, + 0, 98, 208, 204, 10, 2, 206, 150, 98, 237, 196, 24, 216, 223, 10, 2, 206, + 150, 98, 237, 84, 24, 251, 106, 10, 2, 206, 113, 24, 203, 129, 10, 2, + 203, 130, 98, 209, 1, 10, 2, 201, 23, 24, 234, 92, 203, 12, 10, 2, 201, + 23, 24, 115, 239, 75, 10, 2, 200, 20, 226, 16, 10, 2, 200, 20, 24, 200, + 104, 10, 2, 200, 11, 24, 240, 74, 10, 2, 200, 11, 24, 223, 4, 10, 2, 200, + 11, 24, 221, 188, 10, 2, 195, 114, 10, 2, 195, 0, 127, 195, 0, 98, 208, + 204, 10, 2, 194, 254, 24, 115, 239, 76, 203, 12, 14, 7, 255, 161, 14, 7, + 255, 160, 14, 7, 255, 159, 14, 7, 255, 158, 14, 7, 255, 157, 14, 7, 255, + 156, 14, 7, 255, 155, 14, 7, 255, 154, 14, 7, 255, 153, 14, 7, 255, 152, + 14, 7, 255, 151, 14, 7, 255, 150, 14, 7, 255, 149, 14, 7, 255, 147, 14, + 7, 255, 146, 14, 7, 255, 145, 14, 7, 255, 144, 14, 7, 255, 143, 14, 7, + 255, 142, 14, 7, 255, 141, 14, 7, 255, 140, 14, 7, 255, 139, 14, 7, 255, + 138, 14, 7, 255, 137, 14, 7, 255, 136, 14, 7, 255, 135, 14, 7, 255, 134, + 14, 7, 255, 133, 14, 7, 255, 132, 14, 7, 255, 131, 14, 7, 255, 130, 14, + 7, 255, 128, 14, 7, 255, 127, 14, 7, 255, 125, 14, 7, 255, 124, 14, 7, + 255, 123, 14, 7, 255, 122, 14, 7, 255, 121, 14, 7, 255, 120, 14, 7, 255, + 119, 14, 7, 255, 118, 14, 7, 255, 117, 14, 7, 255, 116, 14, 7, 255, 115, + 14, 7, 255, 114, 14, 7, 255, 112, 14, 7, 255, 111, 14, 7, 255, 110, 14, + 7, 255, 108, 14, 7, 255, 107, 14, 7, 255, 106, 14, 7, 255, 105, 14, 7, + 255, 104, 14, 7, 255, 103, 14, 7, 255, 102, 14, 7, 255, 101, 14, 7, 255, + 98, 14, 7, 255, 97, 14, 7, 255, 96, 14, 7, 255, 95, 14, 7, 255, 94, 14, + 7, 255, 93, 14, 7, 255, 92, 14, 7, 255, 91, 14, 7, 255, 90, 14, 7, 255, + 89, 14, 7, 255, 88, 14, 7, 255, 87, 14, 7, 255, 86, 14, 7, 255, 85, 14, + 7, 255, 84, 14, 7, 255, 83, 14, 7, 255, 82, 14, 7, 255, 81, 14, 7, 255, + 80, 14, 7, 255, 79, 14, 7, 255, 75, 14, 7, 255, 74, 14, 7, 255, 73, 14, + 7, 255, 72, 14, 7, 250, 110, 14, 7, 250, 108, 14, 7, 250, 106, 14, 7, + 250, 104, 14, 7, 250, 102, 14, 7, 250, 101, 14, 7, 250, 99, 14, 7, 250, + 97, 14, 7, 250, 95, 14, 7, 250, 93, 14, 7, 247, 203, 14, 7, 247, 202, 14, + 7, 247, 201, 14, 7, 247, 200, 14, 7, 247, 199, 14, 7, 247, 198, 14, 7, + 247, 197, 14, 7, 247, 196, 14, 7, 247, 195, 14, 7, 247, 194, 14, 7, 247, + 193, 14, 7, 247, 192, 14, 7, 247, 191, 14, 7, 247, 190, 14, 7, 247, 189, + 14, 7, 247, 188, 14, 7, 247, 187, 14, 7, 247, 186, 14, 7, 247, 185, 14, + 7, 247, 184, 14, 7, 247, 183, 14, 7, 247, 182, 14, 7, 247, 181, 14, 7, + 247, 180, 14, 7, 247, 179, 14, 7, 247, 178, 14, 7, 247, 177, 14, 7, 247, + 176, 14, 7, 240, 230, 14, 7, 240, 229, 14, 7, 240, 228, 14, 7, 240, 227, + 14, 7, 240, 226, 14, 7, 240, 225, 14, 7, 240, 224, 14, 7, 240, 223, 14, + 7, 240, 222, 14, 7, 240, 221, 14, 7, 240, 220, 14, 7, 240, 219, 14, 7, + 240, 218, 14, 7, 240, 217, 14, 7, 240, 216, 14, 7, 240, 215, 14, 7, 240, + 214, 14, 7, 240, 213, 14, 7, 240, 212, 14, 7, 240, 211, 14, 7, 240, 210, + 14, 7, 240, 209, 14, 7, 240, 208, 14, 7, 240, 207, 14, 7, 240, 206, 14, + 7, 240, 205, 14, 7, 240, 204, 14, 7, 240, 203, 14, 7, 240, 202, 14, 7, + 240, 201, 14, 7, 240, 200, 14, 7, 240, 199, 14, 7, 240, 198, 14, 7, 240, + 197, 14, 7, 240, 196, 14, 7, 240, 195, 14, 7, 240, 194, 14, 7, 240, 193, + 14, 7, 240, 192, 14, 7, 240, 191, 14, 7, 240, 190, 14, 7, 240, 189, 14, + 7, 240, 188, 14, 7, 240, 187, 14, 7, 240, 186, 14, 7, 240, 185, 14, 7, + 240, 184, 14, 7, 240, 183, 14, 7, 240, 182, 14, 7, 240, 181, 14, 7, 240, + 180, 14, 7, 240, 179, 14, 7, 240, 178, 14, 7, 240, 177, 14, 7, 240, 176, + 14, 7, 240, 175, 14, 7, 240, 174, 14, 7, 240, 173, 14, 7, 240, 172, 14, + 7, 240, 171, 14, 7, 240, 170, 14, 7, 240, 169, 14, 7, 240, 168, 14, 7, + 240, 167, 14, 7, 240, 166, 14, 7, 240, 165, 14, 7, 240, 164, 14, 7, 240, + 163, 14, 7, 240, 162, 14, 7, 240, 161, 14, 7, 240, 160, 14, 7, 240, 159, + 14, 7, 240, 158, 14, 7, 240, 157, 14, 7, 240, 156, 14, 7, 240, 155, 14, + 7, 240, 154, 14, 7, 240, 153, 14, 7, 240, 152, 14, 7, 240, 151, 14, 7, + 240, 150, 14, 7, 240, 149, 14, 7, 240, 148, 14, 7, 240, 147, 14, 7, 240, + 146, 14, 7, 240, 145, 14, 7, 240, 144, 14, 7, 240, 143, 14, 7, 240, 142, + 14, 7, 240, 141, 14, 7, 240, 140, 14, 7, 240, 139, 14, 7, 237, 128, 14, + 7, 237, 127, 14, 7, 237, 126, 14, 7, 237, 125, 14, 7, 237, 124, 14, 7, + 237, 123, 14, 7, 237, 122, 14, 7, 237, 121, 14, 7, 237, 120, 14, 7, 237, + 119, 14, 7, 237, 118, 14, 7, 237, 117, 14, 7, 237, 116, 14, 7, 237, 115, + 14, 7, 237, 114, 14, 7, 237, 113, 14, 7, 237, 112, 14, 7, 237, 111, 14, + 7, 237, 110, 14, 7, 237, 109, 14, 7, 237, 108, 14, 7, 237, 107, 14, 7, + 237, 106, 14, 7, 237, 105, 14, 7, 237, 104, 14, 7, 237, 103, 14, 7, 237, + 102, 14, 7, 237, 101, 14, 7, 237, 100, 14, 7, 237, 99, 14, 7, 237, 98, + 14, 7, 237, 97, 14, 7, 237, 96, 14, 7, 237, 95, 14, 7, 237, 94, 14, 7, + 237, 93, 14, 7, 237, 92, 14, 7, 237, 91, 14, 7, 237, 90, 14, 7, 237, 89, + 14, 7, 237, 88, 14, 7, 237, 87, 14, 7, 237, 86, 14, 7, 237, 85, 14, 7, + 236, 48, 14, 7, 236, 47, 14, 7, 236, 46, 14, 7, 236, 45, 14, 7, 236, 44, + 14, 7, 236, 43, 14, 7, 236, 42, 14, 7, 236, 41, 14, 7, 236, 40, 14, 7, + 236, 39, 14, 7, 236, 38, 14, 7, 236, 37, 14, 7, 236, 36, 14, 7, 236, 35, + 14, 7, 236, 34, 14, 7, 236, 33, 14, 7, 236, 32, 14, 7, 236, 31, 14, 7, + 236, 30, 14, 7, 236, 29, 14, 7, 236, 28, 14, 7, 236, 27, 14, 7, 236, 26, + 14, 7, 236, 25, 14, 7, 236, 24, 14, 7, 236, 23, 14, 7, 236, 22, 14, 7, + 236, 21, 14, 7, 236, 20, 14, 7, 236, 19, 14, 7, 236, 18, 14, 7, 236, 17, + 14, 7, 236, 16, 14, 7, 236, 15, 14, 7, 236, 14, 14, 7, 236, 13, 14, 7, + 236, 12, 14, 7, 236, 11, 14, 7, 236, 10, 14, 7, 236, 9, 14, 7, 236, 8, + 14, 7, 236, 7, 14, 7, 236, 6, 14, 7, 236, 5, 14, 7, 236, 4, 14, 7, 236, + 3, 14, 7, 236, 2, 14, 7, 236, 1, 14, 7, 236, 0, 14, 7, 235, 255, 14, 7, + 235, 254, 14, 7, 235, 253, 14, 7, 235, 252, 14, 7, 235, 251, 14, 7, 235, + 250, 14, 7, 235, 249, 14, 7, 235, 248, 14, 7, 235, 247, 14, 7, 235, 246, + 14, 7, 235, 245, 14, 7, 235, 244, 14, 7, 235, 243, 14, 7, 235, 242, 14, + 7, 235, 241, 14, 7, 235, 240, 14, 7, 234, 189, 14, 7, 234, 188, 14, 7, + 234, 187, 14, 7, 234, 186, 14, 7, 234, 185, 14, 7, 234, 184, 14, 7, 234, + 183, 14, 7, 234, 182, 14, 7, 234, 181, 14, 7, 234, 180, 14, 7, 234, 179, + 14, 7, 234, 178, 14, 7, 234, 177, 14, 7, 234, 176, 14, 7, 234, 175, 14, + 7, 234, 174, 14, 7, 234, 173, 14, 7, 234, 172, 14, 7, 234, 171, 14, 7, + 234, 170, 14, 7, 234, 169, 14, 7, 234, 168, 14, 7, 234, 167, 14, 7, 234, + 166, 14, 7, 234, 165, 14, 7, 234, 164, 14, 7, 234, 163, 14, 7, 234, 162, + 14, 7, 234, 161, 14, 7, 234, 160, 14, 7, 234, 159, 14, 7, 234, 158, 14, + 7, 234, 157, 14, 7, 234, 156, 14, 7, 234, 155, 14, 7, 234, 154, 14, 7, + 234, 153, 14, 7, 234, 152, 14, 7, 234, 151, 14, 7, 234, 150, 14, 7, 234, + 149, 14, 7, 234, 148, 14, 7, 234, 147, 14, 7, 234, 146, 14, 7, 234, 145, + 14, 7, 234, 144, 14, 7, 234, 143, 14, 7, 234, 142, 14, 7, 234, 141, 14, + 7, 234, 140, 14, 7, 234, 139, 14, 7, 234, 138, 14, 7, 234, 137, 14, 7, + 234, 136, 14, 7, 234, 135, 14, 7, 234, 134, 14, 7, 234, 133, 14, 7, 234, + 132, 14, 7, 234, 131, 14, 7, 234, 130, 14, 7, 234, 129, 14, 7, 234, 128, + 14, 7, 234, 127, 14, 7, 234, 126, 14, 7, 233, 13, 14, 7, 233, 12, 14, 7, + 233, 11, 14, 7, 233, 10, 14, 7, 233, 9, 14, 7, 233, 8, 14, 7, 233, 7, 14, + 7, 233, 6, 14, 7, 233, 5, 14, 7, 230, 229, 14, 7, 230, 228, 14, 7, 230, + 227, 14, 7, 230, 226, 14, 7, 230, 225, 14, 7, 230, 224, 14, 7, 230, 223, + 14, 7, 230, 222, 14, 7, 230, 221, 14, 7, 230, 220, 14, 7, 230, 219, 14, + 7, 230, 218, 14, 7, 230, 217, 14, 7, 230, 216, 14, 7, 230, 215, 14, 7, + 230, 214, 14, 7, 230, 213, 14, 7, 230, 212, 14, 7, 230, 211, 14, 7, 225, + 79, 14, 7, 225, 78, 14, 7, 225, 77, 14, 7, 225, 76, 14, 7, 225, 75, 14, + 7, 225, 74, 14, 7, 225, 73, 14, 7, 225, 72, 14, 7, 223, 97, 14, 7, 223, + 96, 14, 7, 223, 95, 14, 7, 223, 94, 14, 7, 223, 93, 14, 7, 223, 92, 14, + 7, 223, 91, 14, 7, 223, 90, 14, 7, 223, 89, 14, 7, 223, 88, 14, 7, 221, + 134, 14, 7, 221, 133, 14, 7, 221, 132, 14, 7, 221, 130, 14, 7, 221, 128, + 14, 7, 221, 127, 14, 7, 221, 125, 14, 7, 221, 123, 14, 7, 221, 121, 14, + 7, 221, 119, 14, 7, 221, 117, 14, 7, 221, 115, 14, 7, 221, 113, 14, 7, + 221, 112, 14, 7, 221, 110, 14, 7, 221, 108, 14, 7, 221, 107, 14, 7, 221, + 106, 14, 7, 221, 105, 14, 7, 221, 104, 14, 7, 221, 103, 14, 7, 221, 102, + 14, 7, 221, 101, 14, 7, 221, 100, 14, 7, 221, 98, 14, 7, 221, 96, 14, 7, + 221, 94, 14, 7, 221, 93, 14, 7, 221, 91, 14, 7, 221, 90, 14, 7, 221, 88, + 14, 7, 221, 87, 14, 7, 221, 85, 14, 7, 221, 83, 14, 7, 221, 81, 14, 7, + 221, 79, 14, 7, 221, 77, 14, 7, 221, 76, 14, 7, 221, 74, 14, 7, 221, 72, + 14, 7, 221, 71, 14, 7, 221, 69, 14, 7, 221, 67, 14, 7, 221, 65, 14, 7, + 221, 63, 14, 7, 221, 62, 14, 7, 221, 60, 14, 7, 221, 58, 14, 7, 221, 56, + 14, 7, 221, 55, 14, 7, 221, 53, 14, 7, 221, 51, 14, 7, 221, 50, 14, 7, + 221, 49, 14, 7, 221, 47, 14, 7, 221, 45, 14, 7, 221, 43, 14, 7, 221, 41, + 14, 7, 221, 39, 14, 7, 221, 37, 14, 7, 221, 35, 14, 7, 221, 34, 14, 7, + 221, 32, 14, 7, 221, 30, 14, 7, 221, 28, 14, 7, 221, 26, 14, 7, 218, 50, + 14, 7, 218, 49, 14, 7, 218, 48, 14, 7, 218, 47, 14, 7, 218, 46, 14, 7, + 218, 45, 14, 7, 218, 44, 14, 7, 218, 43, 14, 7, 218, 42, 14, 7, 218, 41, + 14, 7, 218, 40, 14, 7, 218, 39, 14, 7, 218, 38, 14, 7, 218, 37, 14, 7, + 218, 36, 14, 7, 218, 35, 14, 7, 218, 34, 14, 7, 218, 33, 14, 7, 218, 32, + 14, 7, 218, 31, 14, 7, 218, 30, 14, 7, 218, 29, 14, 7, 218, 28, 14, 7, + 218, 27, 14, 7, 218, 26, 14, 7, 218, 25, 14, 7, 218, 24, 14, 7, 218, 23, + 14, 7, 218, 22, 14, 7, 218, 21, 14, 7, 218, 20, 14, 7, 218, 19, 14, 7, + 218, 18, 14, 7, 218, 17, 14, 7, 218, 16, 14, 7, 218, 15, 14, 7, 218, 14, + 14, 7, 218, 13, 14, 7, 218, 12, 14, 7, 218, 11, 14, 7, 218, 10, 14, 7, + 218, 9, 14, 7, 218, 8, 14, 7, 218, 7, 14, 7, 218, 6, 14, 7, 218, 5, 14, + 7, 218, 4, 14, 7, 218, 3, 14, 7, 218, 2, 14, 7, 216, 111, 14, 7, 216, + 110, 14, 7, 216, 109, 14, 7, 216, 108, 14, 7, 216, 107, 14, 7, 216, 106, + 14, 7, 216, 105, 14, 7, 216, 104, 14, 7, 216, 103, 14, 7, 216, 102, 14, + 7, 216, 101, 14, 7, 216, 100, 14, 7, 216, 99, 14, 7, 216, 98, 14, 7, 216, + 97, 14, 7, 216, 96, 14, 7, 216, 95, 14, 7, 216, 94, 14, 7, 216, 93, 14, + 7, 216, 92, 14, 7, 216, 91, 14, 7, 216, 90, 14, 7, 215, 182, 14, 7, 215, + 181, 14, 7, 215, 180, 14, 7, 215, 179, 14, 7, 215, 178, 14, 7, 215, 177, + 14, 7, 215, 176, 14, 7, 215, 175, 14, 7, 215, 174, 14, 7, 215, 173, 14, + 7, 215, 172, 14, 7, 215, 171, 14, 7, 215, 170, 14, 7, 215, 169, 14, 7, + 215, 168, 14, 7, 215, 167, 14, 7, 215, 166, 14, 7, 215, 165, 14, 7, 215, + 164, 14, 7, 215, 163, 14, 7, 215, 162, 14, 7, 215, 161, 14, 7, 215, 160, + 14, 7, 215, 159, 14, 7, 215, 158, 14, 7, 215, 157, 14, 7, 215, 10, 14, 7, + 215, 9, 14, 7, 215, 8, 14, 7, 215, 7, 14, 7, 215, 6, 14, 7, 215, 5, 14, + 7, 215, 4, 14, 7, 215, 3, 14, 7, 215, 2, 14, 7, 215, 1, 14, 7, 215, 0, + 14, 7, 214, 255, 14, 7, 214, 254, 14, 7, 214, 253, 14, 7, 214, 252, 14, + 7, 214, 251, 14, 7, 214, 250, 14, 7, 214, 249, 14, 7, 214, 248, 14, 7, + 214, 247, 14, 7, 214, 246, 14, 7, 214, 245, 14, 7, 214, 244, 14, 7, 214, + 243, 14, 7, 214, 242, 14, 7, 214, 241, 14, 7, 214, 240, 14, 7, 214, 239, + 14, 7, 214, 238, 14, 7, 214, 237, 14, 7, 214, 236, 14, 7, 214, 235, 14, + 7, 214, 234, 14, 7, 214, 233, 14, 7, 214, 232, 14, 7, 214, 231, 14, 7, + 214, 230, 14, 7, 214, 229, 14, 7, 214, 228, 14, 7, 214, 227, 14, 7, 214, + 226, 14, 7, 214, 225, 14, 7, 214, 224, 14, 7, 214, 223, 14, 7, 214, 222, + 14, 7, 214, 221, 14, 7, 214, 220, 14, 7, 214, 219, 14, 7, 214, 218, 14, + 7, 214, 217, 14, 7, 214, 216, 14, 7, 214, 215, 14, 7, 214, 214, 14, 7, + 214, 213, 14, 7, 214, 212, 14, 7, 214, 211, 14, 7, 214, 210, 14, 7, 214, + 209, 14, 7, 214, 208, 14, 7, 214, 207, 14, 7, 214, 206, 14, 7, 214, 205, + 14, 7, 214, 204, 14, 7, 214, 203, 14, 7, 214, 202, 14, 7, 214, 201, 14, + 7, 214, 200, 14, 7, 214, 199, 14, 7, 214, 198, 14, 7, 214, 197, 14, 7, + 214, 196, 14, 7, 214, 195, 14, 7, 214, 194, 14, 7, 214, 193, 14, 7, 214, + 192, 14, 7, 214, 2, 14, 7, 214, 1, 14, 7, 214, 0, 14, 7, 213, 255, 14, 7, + 213, 254, 14, 7, 213, 253, 14, 7, 213, 252, 14, 7, 213, 251, 14, 7, 213, + 250, 14, 7, 213, 249, 14, 7, 213, 248, 14, 7, 213, 247, 14, 7, 213, 246, + 14, 7, 211, 166, 14, 7, 211, 165, 14, 7, 211, 164, 14, 7, 211, 163, 14, + 7, 211, 162, 14, 7, 211, 161, 14, 7, 211, 160, 14, 7, 211, 30, 14, 7, + 211, 29, 14, 7, 211, 28, 14, 7, 211, 27, 14, 7, 211, 26, 14, 7, 211, 25, + 14, 7, 211, 24, 14, 7, 211, 23, 14, 7, 211, 22, 14, 7, 211, 21, 14, 7, + 211, 20, 14, 7, 211, 19, 14, 7, 211, 18, 14, 7, 211, 17, 14, 7, 211, 16, + 14, 7, 211, 15, 14, 7, 211, 14, 14, 7, 211, 13, 14, 7, 211, 12, 14, 7, + 211, 11, 14, 7, 211, 10, 14, 7, 211, 9, 14, 7, 211, 8, 14, 7, 211, 7, 14, + 7, 211, 6, 14, 7, 211, 5, 14, 7, 211, 4, 14, 7, 211, 3, 14, 7, 211, 2, + 14, 7, 211, 1, 14, 7, 211, 0, 14, 7, 210, 255, 14, 7, 210, 254, 14, 7, + 210, 253, 14, 7, 209, 77, 14, 7, 209, 76, 14, 7, 209, 75, 14, 7, 209, 74, + 14, 7, 209, 73, 14, 7, 209, 72, 14, 7, 209, 71, 14, 7, 209, 70, 14, 7, + 209, 69, 14, 7, 209, 68, 14, 7, 209, 67, 14, 7, 209, 66, 14, 7, 209, 65, + 14, 7, 209, 64, 14, 7, 209, 63, 14, 7, 209, 62, 14, 7, 209, 61, 14, 7, + 209, 60, 14, 7, 209, 59, 14, 7, 209, 58, 14, 7, 209, 57, 14, 7, 209, 56, + 14, 7, 209, 55, 14, 7, 209, 54, 14, 7, 209, 53, 14, 7, 209, 52, 14, 7, + 209, 51, 14, 7, 209, 50, 14, 7, 209, 49, 14, 7, 209, 48, 14, 7, 209, 47, + 14, 7, 209, 46, 14, 7, 209, 45, 14, 7, 209, 44, 14, 7, 209, 43, 14, 7, + 209, 42, 14, 7, 209, 41, 14, 7, 209, 40, 14, 7, 209, 39, 14, 7, 209, 38, + 14, 7, 209, 37, 14, 7, 209, 36, 14, 7, 209, 35, 14, 7, 209, 34, 14, 7, + 209, 33, 14, 7, 209, 32, 14, 7, 209, 31, 14, 7, 209, 30, 14, 7, 209, 29, + 14, 7, 209, 28, 14, 7, 209, 27, 14, 7, 209, 26, 14, 7, 209, 25, 14, 7, + 209, 24, 14, 7, 203, 213, 14, 7, 203, 212, 14, 7, 203, 211, 14, 7, 203, + 210, 14, 7, 203, 209, 14, 7, 203, 208, 14, 7, 203, 207, 14, 7, 203, 206, + 14, 7, 203, 205, 14, 7, 203, 204, 14, 7, 203, 203, 14, 7, 203, 202, 14, + 7, 203, 201, 14, 7, 203, 200, 14, 7, 203, 199, 14, 7, 203, 198, 14, 7, + 203, 197, 14, 7, 203, 196, 14, 7, 203, 195, 14, 7, 203, 194, 14, 7, 203, + 193, 14, 7, 203, 192, 14, 7, 203, 191, 14, 7, 203, 190, 14, 7, 203, 189, + 14, 7, 203, 188, 14, 7, 203, 187, 14, 7, 203, 186, 14, 7, 203, 185, 14, + 7, 203, 184, 14, 7, 203, 183, 14, 7, 203, 182, 14, 7, 203, 181, 14, 7, + 203, 180, 14, 7, 203, 179, 14, 7, 203, 178, 14, 7, 203, 177, 14, 7, 203, + 176, 14, 7, 203, 175, 14, 7, 203, 174, 14, 7, 203, 173, 14, 7, 203, 172, + 14, 7, 203, 171, 14, 7, 203, 170, 14, 7, 200, 163, 14, 7, 200, 162, 14, + 7, 200, 161, 14, 7, 200, 160, 14, 7, 200, 159, 14, 7, 200, 158, 14, 7, + 200, 157, 14, 7, 200, 156, 14, 7, 200, 155, 14, 7, 200, 154, 14, 7, 200, + 153, 14, 7, 200, 152, 14, 7, 200, 151, 14, 7, 200, 150, 14, 7, 200, 149, + 14, 7, 200, 148, 14, 7, 200, 147, 14, 7, 200, 146, 14, 7, 200, 145, 14, + 7, 200, 144, 14, 7, 200, 143, 14, 7, 200, 142, 14, 7, 200, 141, 14, 7, + 200, 140, 14, 7, 200, 139, 14, 7, 200, 138, 14, 7, 200, 137, 14, 7, 200, + 136, 14, 7, 200, 135, 14, 7, 200, 134, 14, 7, 200, 133, 14, 7, 200, 132, + 14, 7, 200, 131, 14, 7, 200, 130, 14, 7, 200, 129, 14, 7, 200, 128, 14, + 7, 200, 127, 14, 7, 200, 126, 14, 7, 200, 125, 14, 7, 200, 124, 14, 7, + 200, 123, 14, 7, 200, 122, 14, 7, 200, 121, 14, 7, 200, 120, 14, 7, 200, + 119, 14, 7, 200, 118, 14, 7, 200, 117, 14, 7, 199, 229, 14, 7, 199, 228, + 14, 7, 199, 227, 14, 7, 199, 226, 14, 7, 199, 225, 14, 7, 199, 224, 14, + 7, 199, 223, 14, 7, 199, 222, 14, 7, 199, 221, 14, 7, 199, 220, 14, 7, + 199, 219, 14, 7, 199, 218, 14, 7, 199, 217, 14, 7, 199, 216, 14, 7, 199, + 215, 14, 7, 199, 214, 14, 7, 199, 213, 14, 7, 199, 212, 14, 7, 199, 211, + 14, 7, 199, 210, 14, 7, 199, 209, 14, 7, 199, 208, 14, 7, 199, 207, 14, + 7, 199, 206, 14, 7, 199, 205, 14, 7, 199, 204, 14, 7, 199, 203, 14, 7, + 199, 202, 14, 7, 199, 201, 14, 7, 199, 200, 14, 7, 199, 199, 14, 7, 199, + 198, 14, 7, 199, 197, 14, 7, 199, 196, 14, 7, 199, 195, 14, 7, 199, 194, + 14, 7, 199, 193, 14, 7, 199, 192, 14, 7, 199, 191, 14, 7, 199, 190, 14, + 7, 199, 189, 14, 7, 199, 188, 14, 7, 199, 187, 14, 7, 199, 186, 14, 7, + 199, 185, 14, 7, 199, 184, 14, 7, 199, 183, 14, 7, 199, 182, 14, 7, 199, + 181, 14, 7, 199, 180, 14, 7, 199, 179, 14, 7, 199, 178, 14, 7, 199, 177, + 14, 7, 199, 176, 14, 7, 199, 175, 14, 7, 199, 174, 14, 7, 199, 173, 14, + 7, 199, 172, 14, 7, 199, 171, 14, 7, 199, 170, 14, 7, 199, 169, 14, 7, + 199, 168, 14, 7, 199, 167, 14, 7, 199, 166, 14, 7, 199, 165, 14, 7, 199, + 164, 14, 7, 199, 163, 14, 7, 199, 162, 14, 7, 199, 161, 14, 7, 199, 160, + 14, 7, 199, 159, 14, 7, 199, 158, 14, 7, 199, 157, 14, 7, 199, 156, 14, + 7, 199, 155, 14, 7, 199, 154, 14, 7, 199, 153, 14, 7, 197, 198, 14, 7, + 197, 197, 14, 7, 197, 196, 14, 7, 197, 195, 14, 7, 197, 194, 14, 7, 197, + 193, 14, 7, 197, 192, 14, 7, 197, 191, 14, 7, 197, 190, 14, 7, 197, 189, + 14, 7, 197, 188, 14, 7, 197, 187, 14, 7, 197, 186, 14, 7, 197, 185, 14, + 7, 197, 184, 14, 7, 197, 183, 14, 7, 197, 182, 14, 7, 197, 181, 14, 7, + 197, 180, 14, 7, 197, 179, 14, 7, 197, 178, 14, 7, 197, 177, 14, 7, 197, + 176, 14, 7, 197, 175, 14, 7, 197, 174, 14, 7, 197, 173, 14, 7, 197, 172, + 14, 7, 197, 171, 14, 7, 197, 170, 14, 7, 197, 169, 14, 7, 197, 168, 14, + 7, 197, 167, 14, 7, 196, 220, 14, 7, 196, 219, 14, 7, 196, 218, 14, 7, + 196, 217, 14, 7, 196, 216, 14, 7, 196, 215, 14, 7, 196, 214, 14, 7, 196, + 213, 14, 7, 196, 212, 14, 7, 196, 211, 14, 7, 196, 210, 14, 7, 196, 209, + 14, 7, 196, 146, 14, 7, 196, 145, 14, 7, 196, 144, 14, 7, 196, 143, 14, + 7, 196, 142, 14, 7, 196, 141, 14, 7, 196, 140, 14, 7, 196, 139, 14, 7, + 196, 138, 14, 7, 195, 157, 14, 7, 195, 156, 14, 7, 195, 155, 14, 7, 195, + 154, 14, 7, 195, 153, 14, 7, 195, 152, 14, 7, 195, 151, 14, 7, 195, 150, + 14, 7, 195, 149, 14, 7, 195, 148, 14, 7, 195, 147, 14, 7, 195, 146, 14, + 7, 195, 145, 14, 7, 195, 144, 14, 7, 195, 143, 14, 7, 195, 142, 14, 7, + 195, 141, 14, 7, 195, 140, 14, 7, 195, 139, 14, 7, 195, 138, 14, 7, 195, + 137, 14, 7, 195, 136, 14, 7, 195, 135, 14, 7, 195, 134, 14, 7, 195, 133, + 14, 7, 195, 132, 14, 7, 195, 131, 14, 7, 195, 130, 14, 7, 195, 129, 14, + 7, 195, 128, 14, 7, 195, 127, 14, 7, 195, 126, 14, 7, 195, 125, 14, 7, + 195, 124, 14, 7, 195, 123, 14, 7, 195, 122, 14, 7, 195, 121, 14, 7, 195, + 120, 14, 7, 195, 119, 14, 7, 195, 118, 14, 7, 195, 117, 14, 7, 252, 167, + 14, 7, 252, 166, 14, 7, 252, 165, 14, 7, 252, 164, 14, 7, 252, 163, 14, + 7, 252, 162, 14, 7, 252, 161, 14, 7, 252, 160, 14, 7, 252, 159, 14, 7, + 252, 158, 14, 7, 252, 157, 14, 7, 252, 156, 14, 7, 252, 155, 14, 7, 252, + 154, 14, 7, 252, 153, 14, 7, 252, 152, 14, 7, 252, 151, 14, 7, 252, 150, + 14, 7, 252, 149, 14, 7, 252, 148, 14, 7, 252, 147, 14, 7, 252, 146, 14, + 7, 252, 145, 14, 7, 252, 144, 14, 7, 252, 143, 14, 7, 252, 142, 14, 7, + 252, 141, 14, 7, 252, 140, 14, 7, 252, 139, 14, 7, 252, 138, 14, 7, 252, + 137, 14, 7, 252, 136, 14, 7, 252, 135, 14, 7, 252, 134, 14, 7, 83, 225, + 124, 14, 7, 231, 155, 225, 124, 14, 7, 226, 44, 250, 169, 201, 243, 205, + 2, 14, 7, 226, 44, 250, 169, 248, 85, 205, 2, 14, 7, 226, 44, 250, 169, + 201, 243, 236, 221, 14, 7, 226, 44, 250, 169, 248, 85, 236, 221, 14, 7, + 214, 21, 219, 63, 14, 7, 248, 243, 208, 122, 14, 7, 236, 222, 208, 122, + 28, 7, 255, 161, 28, 7, 255, 160, 28, 7, 255, 159, 28, 7, 255, 158, 28, + 7, 255, 157, 28, 7, 255, 155, 28, 7, 255, 152, 28, 7, 255, 151, 28, 7, + 255, 150, 28, 7, 255, 149, 28, 7, 255, 148, 28, 7, 255, 147, 28, 7, 255, + 146, 28, 7, 255, 145, 28, 7, 255, 144, 28, 7, 255, 142, 28, 7, 255, 141, + 28, 7, 255, 140, 28, 7, 255, 138, 28, 7, 255, 137, 28, 7, 255, 136, 28, + 7, 255, 135, 28, 7, 255, 134, 28, 7, 255, 133, 28, 7, 255, 132, 28, 7, + 255, 131, 28, 7, 255, 130, 28, 7, 255, 129, 28, 7, 255, 128, 28, 7, 255, + 127, 28, 7, 255, 125, 28, 7, 255, 124, 28, 7, 255, 123, 28, 7, 255, 122, + 28, 7, 255, 120, 28, 7, 255, 119, 28, 7, 255, 118, 28, 7, 255, 117, 28, + 7, 255, 116, 28, 7, 255, 115, 28, 7, 255, 114, 28, 7, 255, 113, 28, 7, + 255, 112, 28, 7, 255, 110, 28, 7, 255, 109, 28, 7, 255, 108, 28, 7, 255, + 106, 28, 7, 255, 104, 28, 7, 255, 103, 28, 7, 255, 102, 28, 7, 255, 101, + 28, 7, 255, 100, 28, 7, 255, 99, 28, 7, 255, 98, 28, 7, 255, 97, 28, 7, + 255, 96, 28, 7, 255, 95, 28, 7, 255, 94, 28, 7, 255, 93, 28, 7, 255, 92, + 28, 7, 255, 91, 28, 7, 255, 90, 28, 7, 255, 89, 28, 7, 255, 88, 28, 7, + 255, 87, 28, 7, 255, 86, 28, 7, 255, 85, 28, 7, 255, 84, 28, 7, 255, 83, + 28, 7, 255, 82, 28, 7, 255, 81, 28, 7, 255, 80, 28, 7, 255, 79, 28, 7, + 255, 78, 28, 7, 255, 77, 28, 7, 255, 76, 28, 7, 255, 75, 28, 7, 255, 74, + 28, 7, 255, 73, 28, 7, 255, 72, 28, 7, 255, 71, 28, 7, 255, 70, 28, 7, + 255, 69, 28, 7, 255, 68, 28, 7, 255, 67, 28, 7, 255, 66, 28, 7, 255, 65, + 28, 7, 255, 64, 28, 7, 255, 63, 28, 7, 255, 62, 28, 7, 255, 61, 28, 7, + 255, 60, 28, 7, 255, 59, 28, 7, 255, 58, 28, 7, 255, 57, 28, 7, 255, 56, + 28, 7, 255, 55, 28, 7, 255, 54, 28, 7, 255, 53, 28, 7, 255, 52, 28, 7, + 255, 51, 28, 7, 255, 50, 28, 7, 255, 49, 28, 7, 255, 48, 28, 7, 255, 47, + 28, 7, 255, 46, 28, 7, 255, 45, 28, 7, 255, 44, 28, 7, 255, 43, 28, 7, + 255, 42, 28, 7, 255, 41, 28, 7, 255, 40, 28, 7, 255, 38, 28, 7, 255, 37, + 28, 7, 255, 36, 28, 7, 255, 35, 28, 7, 255, 34, 28, 7, 255, 33, 28, 7, + 255, 32, 28, 7, 255, 31, 28, 7, 255, 30, 28, 7, 255, 29, 28, 7, 255, 28, + 28, 7, 255, 27, 28, 7, 255, 26, 28, 7, 255, 25, 28, 7, 255, 24, 28, 7, + 255, 23, 28, 7, 255, 22, 28, 7, 255, 21, 28, 7, 255, 20, 28, 7, 255, 19, + 28, 7, 255, 18, 28, 7, 255, 17, 28, 7, 255, 16, 28, 7, 255, 15, 28, 7, + 255, 14, 28, 7, 255, 13, 28, 7, 255, 12, 28, 7, 255, 11, 28, 7, 255, 10, + 28, 7, 255, 9, 28, 7, 255, 8, 28, 7, 255, 7, 28, 7, 255, 6, 28, 7, 255, + 5, 28, 7, 255, 3, 28, 7, 255, 2, 28, 7, 255, 1, 28, 7, 255, 0, 28, 7, + 254, 255, 28, 7, 254, 254, 28, 7, 254, 253, 28, 7, 254, 252, 28, 7, 254, + 251, 28, 7, 254, 250, 28, 7, 254, 249, 28, 7, 254, 248, 28, 7, 254, 246, + 28, 7, 254, 245, 28, 7, 254, 244, 28, 7, 254, 243, 28, 7, 254, 242, 28, + 7, 254, 241, 28, 7, 254, 240, 28, 7, 254, 239, 28, 7, 254, 238, 28, 7, + 254, 237, 28, 7, 254, 236, 28, 7, 254, 235, 28, 7, 254, 234, 28, 7, 254, + 233, 28, 7, 254, 232, 28, 7, 254, 231, 28, 7, 254, 230, 28, 7, 254, 229, + 28, 7, 254, 228, 28, 7, 254, 227, 28, 7, 254, 226, 28, 7, 254, 225, 28, + 7, 254, 224, 28, 7, 254, 223, 28, 7, 254, 222, 28, 7, 254, 221, 28, 7, + 254, 220, 28, 7, 254, 219, 28, 7, 254, 218, 28, 7, 254, 217, 28, 7, 254, + 216, 28, 7, 254, 215, 28, 7, 254, 214, 28, 7, 254, 213, 28, 7, 254, 212, + 28, 7, 254, 211, 28, 7, 254, 210, 28, 7, 254, 209, 28, 7, 254, 208, 28, + 7, 254, 207, 28, 7, 254, 206, 28, 7, 254, 205, 28, 7, 254, 204, 28, 7, + 254, 203, 28, 7, 254, 202, 28, 7, 254, 201, 28, 7, 254, 200, 28, 7, 254, + 199, 28, 7, 254, 198, 28, 7, 254, 197, 28, 7, 254, 196, 28, 7, 254, 195, + 28, 7, 254, 194, 28, 7, 254, 193, 28, 7, 254, 192, 28, 7, 254, 191, 28, + 7, 254, 190, 28, 7, 254, 189, 28, 7, 254, 188, 28, 7, 254, 187, 28, 7, + 254, 186, 28, 7, 254, 185, 28, 7, 254, 184, 28, 7, 254, 183, 28, 7, 254, + 182, 28, 7, 254, 181, 28, 7, 254, 180, 28, 7, 254, 179, 28, 7, 254, 178, + 28, 7, 254, 176, 28, 7, 254, 175, 28, 7, 254, 174, 28, 7, 254, 173, 28, + 7, 254, 172, 28, 7, 254, 171, 28, 7, 254, 170, 28, 7, 254, 169, 28, 7, + 254, 168, 28, 7, 254, 167, 28, 7, 254, 166, 28, 7, 254, 165, 28, 7, 254, + 164, 28, 7, 254, 163, 28, 7, 254, 162, 28, 7, 254, 161, 28, 7, 254, 160, + 28, 7, 254, 159, 28, 7, 254, 158, 28, 7, 254, 157, 28, 7, 254, 156, 28, + 7, 254, 155, 28, 7, 254, 154, 28, 7, 254, 153, 28, 7, 254, 152, 28, 7, + 254, 151, 28, 7, 254, 150, 28, 7, 254, 149, 28, 7, 254, 148, 28, 7, 254, + 147, 28, 7, 254, 146, 28, 7, 254, 145, 28, 7, 254, 144, 28, 7, 254, 143, + 28, 7, 254, 142, 28, 7, 254, 141, 28, 7, 254, 140, 28, 7, 254, 139, 28, + 7, 254, 138, 28, 7, 254, 137, 28, 7, 254, 136, 28, 7, 254, 135, 28, 7, + 254, 134, 28, 7, 254, 133, 28, 7, 254, 132, 28, 7, 254, 131, 28, 7, 254, + 130, 28, 7, 254, 129, 28, 7, 254, 128, 28, 7, 254, 127, 28, 7, 254, 126, + 28, 7, 254, 125, 28, 7, 254, 124, 28, 7, 254, 123, 28, 7, 254, 122, 28, + 7, 254, 121, 28, 7, 254, 120, 28, 7, 254, 119, 28, 7, 254, 118, 28, 7, + 254, 117, 28, 7, 254, 116, 28, 7, 254, 115, 28, 7, 254, 114, 28, 7, 254, + 113, 28, 7, 254, 112, 28, 7, 254, 111, 28, 7, 254, 110, 28, 7, 254, 109, + 28, 7, 254, 108, 28, 7, 254, 107, 28, 7, 254, 106, 28, 7, 254, 105, 28, + 7, 254, 104, 28, 7, 254, 103, 28, 7, 254, 102, 28, 7, 254, 101, 28, 7, + 254, 100, 28, 7, 254, 99, 28, 7, 254, 98, 28, 7, 254, 97, 28, 7, 254, 96, + 28, 7, 254, 95, 28, 7, 254, 94, 28, 7, 254, 93, 28, 7, 254, 92, 28, 7, + 254, 91, 28, 7, 254, 90, 28, 7, 254, 89, 28, 7, 254, 88, 28, 7, 254, 87, + 28, 7, 254, 86, 28, 7, 254, 85, 28, 7, 254, 84, 28, 7, 254, 83, 28, 7, + 254, 82, 28, 7, 254, 81, 28, 7, 254, 80, 28, 7, 254, 79, 28, 7, 254, 78, + 28, 7, 254, 77, 28, 7, 254, 76, 28, 7, 254, 75, 28, 7, 254, 74, 28, 7, + 254, 73, 28, 7, 254, 72, 28, 7, 254, 71, 28, 7, 254, 70, 28, 7, 254, 69, + 28, 7, 254, 68, 28, 7, 254, 67, 28, 7, 254, 66, 28, 7, 254, 64, 28, 7, + 254, 63, 28, 7, 254, 62, 28, 7, 254, 61, 28, 7, 254, 60, 28, 7, 254, 59, + 28, 7, 254, 58, 28, 7, 254, 57, 28, 7, 254, 56, 28, 7, 254, 55, 28, 7, + 254, 54, 28, 7, 254, 51, 28, 7, 254, 50, 28, 7, 254, 49, 28, 7, 254, 48, + 28, 7, 254, 44, 28, 7, 254, 43, 28, 7, 254, 42, 28, 7, 254, 41, 28, 7, + 254, 40, 28, 7, 254, 39, 28, 7, 254, 38, 28, 7, 254, 37, 28, 7, 254, 36, + 28, 7, 254, 35, 28, 7, 254, 34, 28, 7, 254, 33, 28, 7, 254, 32, 28, 7, + 254, 31, 28, 7, 254, 30, 28, 7, 254, 29, 28, 7, 254, 28, 28, 7, 254, 27, + 28, 7, 254, 26, 28, 7, 254, 24, 28, 7, 254, 23, 28, 7, 254, 22, 28, 7, + 254, 21, 28, 7, 254, 20, 28, 7, 254, 19, 28, 7, 254, 18, 28, 7, 254, 17, + 28, 7, 254, 16, 28, 7, 254, 15, 28, 7, 254, 14, 28, 7, 254, 13, 28, 7, + 254, 12, 28, 7, 254, 11, 28, 7, 254, 10, 28, 7, 254, 9, 28, 7, 254, 8, + 28, 7, 254, 7, 28, 7, 254, 6, 28, 7, 254, 5, 28, 7, 254, 4, 28, 7, 254, + 3, 28, 7, 254, 2, 28, 7, 254, 1, 28, 7, 254, 0, 28, 7, 253, 255, 28, 7, + 253, 254, 28, 7, 253, 253, 28, 7, 253, 252, 28, 7, 253, 251, 28, 7, 253, + 250, 28, 7, 253, 249, 28, 7, 253, 248, 28, 7, 253, 247, 28, 7, 253, 246, + 28, 7, 253, 245, 28, 7, 253, 244, 28, 7, 253, 243, 28, 7, 253, 242, 28, + 7, 253, 241, 28, 7, 253, 240, 28, 7, 253, 239, 28, 7, 253, 238, 28, 7, + 253, 237, 28, 7, 253, 236, 28, 7, 253, 235, 28, 7, 253, 234, 28, 7, 253, + 233, 28, 7, 253, 232, 28, 7, 253, 231, 28, 7, 253, 230, 28, 7, 253, 229, + 28, 7, 253, 228, 28, 7, 253, 227, 28, 7, 253, 226, 28, 7, 253, 225, 28, + 7, 253, 224, 28, 7, 253, 223, 28, 7, 253, 222, 28, 7, 253, 221, 28, 7, + 253, 220, 28, 7, 253, 219, 210, 252, 214, 73, 210, 72, 28, 7, 253, 218, + 28, 7, 253, 217, 28, 7, 253, 216, 28, 7, 253, 215, 28, 7, 253, 214, 28, + 7, 253, 213, 28, 7, 253, 212, 28, 7, 253, 211, 28, 7, 253, 210, 28, 7, + 253, 209, 28, 7, 253, 208, 28, 7, 253, 207, 171, 28, 7, 253, 206, 28, 7, + 253, 205, 28, 7, 253, 204, 28, 7, 253, 203, 28, 7, 253, 202, 28, 7, 253, + 201, 28, 7, 253, 200, 28, 7, 253, 198, 28, 7, 253, 196, 28, 7, 253, 194, + 28, 7, 253, 192, 28, 7, 253, 190, 28, 7, 253, 188, 28, 7, 253, 186, 28, + 7, 253, 184, 28, 7, 253, 182, 28, 7, 253, 180, 248, 243, 221, 248, 78, + 28, 7, 253, 178, 236, 222, 221, 248, 78, 28, 7, 253, 177, 28, 7, 253, + 175, 28, 7, 253, 173, 28, 7, 253, 171, 28, 7, 253, 169, 28, 7, 253, 167, + 28, 7, 253, 165, 28, 7, 253, 163, 28, 7, 253, 161, 28, 7, 253, 160, 28, + 7, 253, 159, 28, 7, 253, 158, 28, 7, 253, 157, 28, 7, 253, 156, 28, 7, + 253, 155, 28, 7, 253, 154, 28, 7, 253, 153, 28, 7, 253, 152, 28, 7, 253, + 151, 28, 7, 253, 150, 28, 7, 253, 149, 28, 7, 253, 148, 28, 7, 253, 147, + 28, 7, 253, 146, 28, 7, 253, 145, 28, 7, 253, 144, 28, 7, 253, 143, 28, + 7, 253, 142, 28, 7, 253, 141, 28, 7, 253, 140, 28, 7, 253, 139, 28, 7, + 253, 138, 28, 7, 253, 137, 28, 7, 253, 136, 28, 7, 253, 135, 28, 7, 253, + 134, 28, 7, 253, 133, 28, 7, 253, 132, 28, 7, 253, 131, 28, 7, 253, 130, + 28, 7, 253, 129, 28, 7, 253, 128, 28, 7, 253, 127, 28, 7, 253, 126, 28, + 7, 253, 125, 28, 7, 253, 124, 28, 7, 253, 123, 28, 7, 253, 122, 28, 7, + 253, 121, 28, 7, 253, 120, 28, 7, 253, 119, 28, 7, 253, 118, 28, 7, 253, + 117, 28, 7, 253, 116, 28, 7, 253, 115, 28, 7, 253, 114, 28, 7, 253, 113, + 28, 7, 253, 112, 28, 7, 253, 111, 28, 7, 253, 110, 28, 7, 253, 109, 28, + 7, 253, 108, 28, 7, 253, 107, 28, 7, 253, 106, 28, 7, 253, 105, 28, 7, + 253, 104, 28, 7, 253, 103, 28, 7, 253, 102, 28, 7, 253, 101, 28, 7, 253, + 100, 28, 7, 253, 99, 28, 7, 253, 98, 28, 7, 253, 97, 28, 7, 253, 96, 28, + 7, 253, 95, 28, 7, 253, 94, 28, 7, 253, 93, 28, 7, 253, 92, 28, 7, 253, + 91, 28, 7, 253, 90, 28, 7, 253, 89, 28, 7, 253, 88, 28, 7, 253, 87, 28, + 7, 253, 86, 28, 7, 253, 85, 28, 7, 253, 84, 28, 7, 253, 83, 28, 7, 253, + 82, 28, 7, 253, 81, 28, 7, 253, 80, 28, 7, 253, 79, 28, 7, 253, 78, 28, + 7, 253, 77, 28, 7, 253, 76, 28, 7, 253, 75, 28, 7, 253, 74, 28, 7, 253, + 73, 28, 7, 253, 72, 28, 7, 253, 71, 28, 7, 253, 70, 28, 7, 253, 69, 28, + 7, 253, 68, 28, 7, 253, 67, 28, 7, 253, 66, 28, 7, 253, 65, 28, 7, 253, + 64, 28, 7, 253, 63, 28, 7, 253, 62, 28, 7, 253, 61, 28, 7, 253, 60, 28, + 7, 253, 59, 28, 7, 253, 58, 28, 7, 253, 57, 28, 7, 253, 56, 28, 7, 253, + 55, 28, 7, 253, 54, 28, 7, 253, 53, 28, 7, 253, 52, 28, 7, 253, 51, 25, + 1, 212, 252, 217, 4, 219, 120, 25, 1, 212, 252, 234, 56, 235, 43, 25, 1, + 212, 252, 212, 94, 219, 121, 212, 167, 25, 1, 212, 252, 212, 94, 219, + 121, 212, 168, 25, 1, 212, 252, 217, 245, 219, 120, 25, 1, 212, 252, 206, + 146, 25, 1, 212, 252, 202, 56, 219, 120, 25, 1, 212, 252, 215, 55, 219, + 120, 25, 1, 212, 252, 206, 210, 213, 244, 216, 148, 25, 1, 212, 252, 212, + 94, 213, 244, 216, 149, 212, 167, 25, 1, 212, 252, 212, 94, 213, 244, + 216, 149, 212, 168, 25, 1, 212, 252, 220, 99, 25, 1, 212, 252, 201, 41, + 220, 100, 25, 1, 212, 252, 217, 65, 25, 1, 212, 252, 220, 96, 25, 1, 212, + 252, 220, 49, 25, 1, 212, 252, 218, 78, 25, 1, 212, 252, 207, 73, 25, 1, + 212, 252, 215, 195, 25, 1, 212, 252, 224, 165, 25, 1, 212, 252, 216, 115, + 25, 1, 212, 252, 204, 74, 25, 1, 212, 252, 217, 3, 25, 1, 212, 252, 222, + 230, 25, 1, 212, 252, 222, 137, 223, 145, 25, 1, 212, 252, 215, 205, 219, + 128, 25, 1, 212, 252, 220, 103, 25, 1, 212, 252, 213, 125, 25, 1, 212, + 252, 233, 211, 25, 1, 212, 252, 213, 195, 25, 1, 212, 252, 218, 216, 217, + 38, 25, 1, 212, 252, 215, 36, 219, 131, 25, 1, 212, 252, 118, 195, 187, + 217, 238, 25, 1, 212, 252, 233, 212, 25, 1, 212, 252, 215, 205, 215, 206, + 25, 1, 212, 252, 206, 32, 25, 1, 212, 252, 219, 113, 25, 1, 212, 252, + 219, 134, 25, 1, 212, 252, 218, 191, 25, 1, 212, 252, 225, 34, 25, 1, + 212, 252, 213, 244, 222, 185, 25, 1, 212, 252, 217, 160, 222, 185, 25, 1, + 212, 252, 213, 18, 25, 1, 212, 252, 220, 97, 25, 1, 212, 252, 216, 189, + 25, 1, 212, 252, 211, 206, 25, 1, 212, 252, 201, 33, 25, 1, 212, 252, + 221, 187, 25, 1, 212, 252, 205, 172, 25, 1, 212, 252, 202, 242, 25, 1, + 212, 252, 220, 94, 25, 1, 212, 252, 224, 172, 25, 1, 212, 252, 217, 156, + 25, 1, 212, 252, 223, 159, 25, 1, 212, 252, 218, 192, 25, 1, 212, 252, + 206, 142, 25, 1, 212, 252, 221, 241, 25, 1, 212, 252, 235, 114, 25, 1, + 212, 252, 209, 209, 25, 1, 212, 252, 223, 212, 25, 1, 212, 252, 205, 168, + 25, 1, 212, 252, 220, 44, 212, 210, 25, 1, 212, 252, 206, 203, 25, 1, + 212, 252, 215, 204, 25, 1, 212, 252, 206, 184, 215, 216, 195, 195, 25, 1, + 212, 252, 215, 77, 218, 212, 25, 1, 212, 252, 213, 239, 25, 1, 212, 252, + 216, 117, 25, 1, 212, 252, 200, 44, 25, 1, 212, 252, 217, 41, 25, 1, 212, + 252, 220, 93, 25, 1, 212, 252, 216, 160, 25, 1, 212, 252, 219, 236, 25, + 1, 212, 252, 215, 92, 25, 1, 212, 252, 202, 246, 25, 1, 212, 252, 205, + 165, 25, 1, 212, 252, 213, 240, 25, 1, 212, 252, 215, 220, 25, 1, 212, + 252, 220, 101, 25, 1, 212, 252, 215, 89, 25, 1, 212, 252, 224, 252, 25, + 1, 212, 252, 215, 223, 25, 1, 212, 252, 199, 113, 25, 1, 212, 252, 221, + 191, 25, 1, 212, 252, 217, 101, 25, 1, 212, 252, 217, 212, 25, 1, 212, + 252, 219, 235, 25, 1, 212, 251, 215, 218, 25, 1, 212, 251, 201, 41, 220, + 98, 25, 1, 212, 251, 206, 94, 25, 1, 212, 251, 207, 77, 201, 40, 25, 1, + 212, 251, 221, 243, 215, 201, 25, 1, 212, 251, 219, 242, 220, 102, 25, 1, + 212, 251, 224, 85, 25, 1, 212, 251, 196, 32, 25, 1, 212, 251, 219, 237, + 25, 1, 212, 251, 225, 20, 25, 1, 212, 251, 213, 75, 25, 1, 212, 251, 196, + 115, 222, 185, 25, 1, 212, 251, 222, 250, 215, 216, 215, 103, 25, 1, 212, + 251, 215, 198, 206, 229, 25, 1, 212, 251, 217, 127, 216, 163, 25, 1, 212, + 251, 233, 209, 25, 1, 212, 251, 212, 157, 25, 1, 212, 251, 201, 41, 215, + 214, 25, 1, 212, 251, 206, 234, 216, 158, 25, 1, 212, 251, 206, 230, 25, + 1, 212, 251, 219, 121, 202, 245, 25, 1, 212, 251, 219, 224, 219, 238, 25, + 1, 212, 251, 215, 90, 215, 201, 25, 1, 212, 251, 224, 161, 25, 1, 212, + 251, 233, 210, 25, 1, 212, 251, 224, 157, 25, 1, 212, 251, 223, 77, 25, + 1, 212, 251, 213, 128, 25, 1, 212, 251, 199, 42, 25, 1, 212, 251, 217, 5, + 218, 76, 25, 1, 212, 251, 217, 40, 219, 220, 25, 1, 212, 251, 196, 241, + 25, 1, 212, 251, 208, 247, 25, 1, 212, 251, 203, 158, 25, 1, 212, 251, + 219, 133, 25, 1, 212, 251, 217, 24, 25, 1, 212, 251, 217, 25, 222, 227, + 25, 1, 212, 251, 219, 123, 25, 1, 212, 251, 204, 127, 25, 1, 212, 251, + 219, 228, 25, 1, 212, 251, 218, 196, 25, 1, 212, 251, 215, 107, 25, 1, + 212, 251, 211, 210, 25, 1, 212, 251, 219, 132, 217, 42, 25, 1, 212, 251, + 235, 158, 25, 1, 212, 251, 219, 215, 25, 1, 212, 251, 235, 182, 25, 1, + 212, 251, 224, 169, 25, 1, 212, 251, 220, 128, 216, 152, 25, 1, 212, 251, + 220, 128, 216, 128, 25, 1, 212, 251, 222, 136, 25, 1, 212, 251, 217, 48, + 25, 1, 212, 251, 215, 225, 25, 1, 212, 251, 166, 25, 1, 212, 251, 224, + 68, 25, 1, 212, 251, 216, 249, 25, 1, 193, 217, 4, 220, 100, 25, 1, 193, + 215, 54, 25, 1, 193, 195, 195, 25, 1, 193, 197, 143, 25, 1, 193, 217, 41, + 25, 1, 193, 217, 148, 25, 1, 193, 217, 11, 25, 1, 193, 233, 219, 25, 1, + 193, 219, 232, 25, 1, 193, 234, 63, 25, 1, 193, 215, 79, 219, 4, 219, + 135, 25, 1, 193, 215, 192, 219, 223, 25, 1, 193, 219, 229, 25, 1, 193, + 212, 163, 25, 1, 193, 217, 133, 25, 1, 193, 219, 240, 247, 170, 25, 1, + 193, 224, 159, 25, 1, 193, 233, 220, 25, 1, 193, 224, 166, 25, 1, 193, + 195, 218, 218, 109, 25, 1, 193, 215, 48, 25, 1, 193, 219, 217, 25, 1, + 193, 215, 224, 25, 1, 193, 219, 223, 25, 1, 193, 196, 33, 25, 1, 193, + 223, 220, 25, 1, 193, 225, 55, 25, 1, 193, 207, 72, 25, 1, 193, 217, 142, + 25, 1, 193, 203, 156, 25, 1, 193, 216, 132, 25, 1, 193, 202, 56, 195, + 199, 25, 1, 193, 204, 159, 25, 1, 193, 217, 31, 215, 103, 25, 1, 193, + 199, 41, 25, 1, 193, 217, 215, 25, 1, 193, 220, 128, 224, 168, 25, 1, + 193, 215, 206, 25, 1, 193, 217, 26, 25, 1, 193, 222, 231, 25, 1, 193, + 219, 225, 25, 1, 193, 219, 112, 25, 1, 193, 215, 200, 25, 1, 193, 202, + 241, 25, 1, 193, 217, 28, 25, 1, 193, 234, 221, 25, 1, 193, 217, 147, 25, + 1, 193, 215, 226, 25, 1, 193, 215, 222, 25, 1, 193, 247, 253, 25, 1, 193, + 199, 43, 25, 1, 193, 219, 230, 25, 1, 193, 209, 140, 25, 1, 193, 216, + 162, 25, 1, 193, 222, 249, 25, 1, 193, 202, 53, 25, 1, 193, 215, 208, + 216, 249, 25, 1, 193, 216, 154, 25, 1, 193, 224, 172, 25, 1, 193, 217, + 33, 25, 1, 193, 220, 93, 25, 1, 193, 219, 218, 25, 1, 193, 221, 191, 25, + 1, 193, 223, 145, 25, 1, 193, 216, 160, 25, 1, 193, 216, 249, 25, 1, 193, + 196, 231, 25, 1, 193, 217, 29, 25, 1, 193, 215, 211, 25, 1, 193, 215, + 202, 25, 1, 193, 223, 161, 216, 117, 25, 1, 193, 215, 209, 25, 1, 193, + 217, 155, 25, 1, 193, 220, 128, 215, 214, 25, 1, 193, 196, 129, 25, 1, + 193, 217, 154, 25, 1, 193, 206, 145, 25, 1, 193, 207, 75, 25, 1, 193, + 219, 226, 25, 1, 193, 220, 100, 25, 1, 193, 219, 236, 25, 1, 193, 224, + 160, 25, 1, 193, 219, 227, 25, 1, 193, 224, 164, 25, 1, 193, 219, 240, + 212, 215, 25, 1, 193, 195, 178, 25, 1, 193, 216, 150, 25, 1, 193, 219, + 59, 25, 1, 193, 218, 139, 25, 1, 193, 206, 206, 25, 1, 193, 224, 183, + 222, 209, 25, 1, 193, 224, 183, 235, 195, 25, 1, 193, 217, 63, 25, 1, + 193, 217, 212, 25, 1, 193, 222, 57, 25, 1, 193, 212, 176, 25, 1, 193, + 213, 65, 25, 1, 193, 203, 1, 25, 1, 148, 219, 216, 25, 1, 148, 197, 141, + 25, 1, 148, 216, 148, 25, 1, 148, 219, 120, 25, 1, 148, 216, 146, 25, 1, + 148, 222, 102, 25, 1, 148, 216, 151, 25, 1, 148, 215, 221, 25, 1, 148, + 217, 47, 25, 1, 148, 215, 103, 25, 1, 148, 196, 242, 25, 1, 148, 217, 1, + 25, 1, 148, 206, 253, 25, 1, 148, 217, 12, 25, 1, 148, 224, 167, 25, 1, + 148, 202, 243, 25, 1, 148, 206, 232, 25, 1, 148, 216, 159, 25, 1, 148, + 204, 127, 25, 1, 148, 224, 172, 25, 1, 148, 196, 117, 25, 1, 148, 223, + 162, 25, 1, 148, 208, 207, 25, 1, 148, 219, 125, 25, 1, 148, 217, 146, + 25, 1, 148, 220, 65, 25, 1, 148, 219, 131, 25, 1, 148, 207, 74, 25, 1, + 148, 196, 59, 25, 1, 148, 216, 153, 25, 1, 148, 224, 163, 219, 219, 25, + 1, 148, 217, 8, 25, 1, 148, 201, 40, 25, 1, 148, 233, 229, 25, 1, 148, + 216, 254, 25, 1, 148, 235, 159, 25, 1, 148, 217, 150, 25, 1, 148, 219, + 104, 25, 1, 148, 222, 130, 25, 1, 148, 217, 132, 25, 1, 148, 218, 211, + 25, 1, 148, 219, 108, 25, 1, 148, 211, 190, 25, 1, 148, 219, 106, 25, 1, + 148, 219, 122, 25, 1, 148, 221, 174, 25, 1, 148, 215, 213, 25, 1, 148, + 219, 239, 25, 1, 148, 223, 134, 25, 1, 148, 215, 92, 25, 1, 148, 202, + 246, 25, 1, 148, 205, 165, 25, 1, 148, 195, 178, 25, 1, 148, 224, 164, + 25, 1, 148, 210, 228, 25, 1, 148, 203, 47, 25, 1, 148, 217, 9, 25, 1, + 148, 219, 127, 25, 1, 148, 215, 212, 25, 1, 148, 224, 162, 25, 1, 148, + 212, 169, 25, 1, 148, 213, 11, 25, 1, 148, 215, 65, 25, 1, 148, 222, 136, + 25, 1, 148, 217, 48, 25, 1, 148, 219, 124, 25, 1, 148, 217, 21, 25, 1, + 148, 195, 192, 25, 1, 148, 213, 163, 25, 1, 148, 195, 191, 25, 1, 148, + 217, 155, 25, 1, 148, 215, 201, 25, 1, 148, 204, 161, 25, 1, 148, 223, + 166, 25, 1, 148, 217, 37, 25, 1, 148, 217, 6, 25, 1, 148, 201, 15, 25, 1, + 148, 219, 135, 25, 1, 148, 223, 156, 25, 1, 148, 215, 210, 25, 1, 148, + 202, 244, 25, 1, 148, 220, 95, 25, 1, 148, 217, 46, 25, 1, 148, 222, 129, + 25, 1, 148, 217, 27, 25, 1, 148, 215, 215, 25, 1, 148, 216, 132, 25, 1, + 148, 233, 213, 25, 1, 148, 223, 187, 25, 1, 148, 210, 127, 214, 133, 25, + 1, 148, 203, 145, 25, 1, 148, 201, 239, 25, 1, 148, 215, 89, 25, 1, 148, + 210, 9, 25, 1, 148, 222, 187, 25, 1, 148, 219, 187, 25, 1, 148, 221, 136, + 25, 1, 148, 204, 74, 25, 1, 148, 218, 145, 25, 1, 148, 206, 218, 25, 1, + 148, 206, 228, 25, 1, 148, 223, 106, 25, 1, 148, 215, 186, 25, 1, 148, + 206, 151, 25, 1, 148, 215, 203, 25, 1, 148, 213, 79, 25, 1, 148, 216, + 223, 25, 1, 148, 206, 183, 25, 1, 148, 211, 205, 25, 1, 148, 218, 76, 25, + 1, 148, 221, 221, 25, 1, 148, 210, 127, 218, 134, 25, 1, 148, 202, 122, + 25, 1, 148, 215, 189, 25, 1, 148, 219, 240, 178, 25, 1, 148, 208, 205, + 25, 1, 148, 235, 238, 25, 1, 104, 217, 154, 25, 1, 104, 201, 245, 25, 1, + 104, 219, 229, 25, 1, 104, 222, 231, 25, 1, 104, 198, 235, 25, 1, 104, + 221, 227, 25, 1, 104, 213, 243, 25, 1, 104, 205, 176, 25, 1, 104, 210, + 202, 25, 1, 104, 215, 217, 25, 1, 104, 217, 125, 25, 1, 104, 211, 223, + 25, 1, 104, 203, 117, 25, 1, 104, 217, 14, 25, 1, 104, 223, 216, 25, 1, + 104, 196, 234, 25, 1, 104, 208, 129, 25, 1, 104, 217, 38, 25, 1, 104, + 213, 240, 25, 1, 104, 201, 247, 25, 1, 104, 223, 160, 25, 1, 104, 221, + 242, 25, 1, 104, 215, 220, 25, 1, 104, 216, 246, 25, 1, 104, 220, 101, + 25, 1, 104, 217, 7, 25, 1, 104, 216, 245, 25, 1, 104, 215, 219, 25, 1, + 104, 210, 6, 25, 1, 104, 216, 150, 25, 1, 104, 213, 77, 25, 1, 104, 209, + 13, 25, 1, 104, 217, 22, 25, 1, 104, 219, 114, 25, 1, 104, 233, 207, 25, + 1, 104, 217, 10, 25, 1, 104, 216, 161, 25, 1, 104, 220, 43, 25, 1, 104, + 221, 223, 25, 1, 104, 217, 43, 25, 1, 104, 217, 138, 25, 1, 104, 203, + 144, 215, 201, 25, 1, 104, 207, 76, 25, 1, 104, 211, 216, 25, 1, 104, + 217, 158, 205, 184, 25, 1, 104, 217, 30, 215, 103, 25, 1, 104, 196, 20, + 25, 1, 104, 233, 208, 25, 1, 104, 201, 34, 25, 1, 104, 196, 36, 25, 1, + 104, 212, 117, 25, 1, 104, 201, 21, 25, 1, 104, 224, 170, 25, 1, 104, + 204, 160, 25, 1, 104, 202, 245, 25, 1, 104, 199, 44, 25, 1, 104, 197, 84, + 25, 1, 104, 223, 80, 25, 1, 104, 211, 227, 25, 1, 104, 203, 157, 25, 1, + 104, 233, 228, 25, 1, 104, 217, 53, 25, 1, 104, 206, 231, 25, 1, 104, + 219, 109, 25, 1, 104, 219, 233, 25, 1, 104, 215, 52, 25, 1, 104, 216, + 113, 25, 1, 104, 234, 59, 25, 1, 104, 201, 22, 25, 1, 104, 223, 170, 25, + 1, 104, 196, 93, 25, 1, 104, 215, 90, 244, 220, 25, 1, 104, 196, 9, 25, + 1, 104, 219, 126, 25, 1, 104, 217, 143, 25, 1, 104, 212, 211, 25, 1, 104, + 195, 198, 25, 1, 104, 222, 131, 25, 1, 104, 234, 221, 25, 1, 104, 234, + 58, 25, 1, 104, 217, 0, 25, 1, 104, 224, 172, 25, 1, 104, 220, 104, 25, + 1, 104, 217, 13, 25, 1, 104, 233, 214, 25, 1, 104, 235, 239, 25, 1, 104, + 215, 190, 25, 1, 104, 213, 12, 25, 1, 104, 196, 34, 25, 1, 104, 217, 39, + 25, 1, 104, 215, 90, 248, 203, 25, 1, 104, 215, 32, 25, 1, 104, 212, 89, + 25, 1, 104, 219, 59, 25, 1, 104, 234, 219, 25, 1, 104, 217, 238, 25, 1, + 104, 218, 139, 25, 1, 104, 233, 213, 25, 1, 104, 234, 224, 68, 25, 1, + 104, 218, 77, 25, 1, 104, 211, 222, 25, 1, 104, 217, 2, 25, 1, 104, 223, + 145, 25, 1, 104, 212, 208, 25, 1, 104, 215, 204, 25, 1, 104, 196, 35, 25, + 1, 104, 217, 23, 25, 1, 104, 213, 244, 213, 51, 25, 1, 104, 234, 224, + 247, 152, 25, 1, 104, 235, 44, 25, 1, 104, 216, 155, 25, 1, 104, 63, 25, + 1, 104, 201, 239, 25, 1, 104, 72, 25, 1, 104, 68, 25, 1, 104, 222, 229, + 25, 1, 104, 213, 244, 212, 126, 25, 1, 104, 203, 162, 25, 1, 104, 203, + 102, 25, 1, 104, 217, 158, 218, 64, 231, 87, 25, 1, 104, 206, 206, 25, 1, + 104, 196, 31, 25, 1, 104, 216, 239, 25, 1, 104, 195, 203, 25, 1, 104, + 195, 235, 204, 53, 25, 1, 104, 195, 235, 241, 86, 25, 1, 104, 195, 186, + 25, 1, 104, 195, 194, 25, 1, 104, 224, 158, 25, 1, 104, 213, 10, 25, 1, + 104, 216, 156, 236, 176, 25, 1, 104, 211, 218, 25, 1, 104, 196, 240, 25, + 1, 104, 235, 182, 25, 1, 104, 199, 113, 25, 1, 104, 221, 191, 25, 1, 104, + 219, 78, 25, 1, 104, 210, 91, 25, 1, 104, 210, 229, 25, 1, 104, 216, 238, + 25, 1, 104, 217, 71, 25, 1, 104, 206, 198, 25, 1, 104, 206, 183, 25, 1, + 104, 234, 224, 210, 130, 25, 1, 104, 176, 25, 1, 104, 212, 220, 25, 1, + 104, 221, 221, 25, 1, 104, 224, 11, 25, 1, 104, 219, 164, 25, 1, 104, + 166, 25, 1, 104, 220, 40, 25, 1, 104, 202, 247, 25, 1, 104, 224, 101, 25, + 1, 104, 218, 215, 25, 1, 104, 203, 23, 25, 1, 104, 235, 206, 25, 1, 104, + 233, 201, 25, 1, 212, 250, 155, 25, 1, 212, 250, 66, 25, 1, 212, 250, + 223, 187, 25, 1, 212, 250, 237, 54, 25, 1, 212, 250, 210, 155, 25, 1, + 212, 250, 203, 145, 25, 1, 212, 250, 215, 89, 25, 1, 212, 250, 172, 25, + 1, 212, 250, 210, 9, 25, 1, 212, 250, 210, 57, 25, 1, 212, 250, 219, 187, + 25, 1, 212, 250, 203, 162, 25, 1, 212, 250, 217, 157, 25, 1, 212, 250, + 216, 162, 25, 1, 212, 250, 221, 136, 25, 1, 212, 250, 204, 74, 25, 1, + 212, 250, 206, 218, 25, 1, 212, 250, 206, 112, 25, 1, 212, 250, 207, 72, + 25, 1, 212, 250, 223, 106, 25, 1, 212, 250, 224, 172, 25, 1, 212, 250, + 215, 154, 25, 1, 212, 250, 215, 186, 25, 1, 212, 250, 216, 133, 25, 1, + 212, 250, 195, 234, 25, 1, 212, 250, 206, 151, 25, 1, 212, 250, 164, 25, + 1, 212, 250, 215, 223, 25, 1, 212, 250, 213, 10, 25, 1, 212, 250, 215, + 203, 25, 1, 212, 250, 196, 240, 25, 1, 212, 250, 213, 79, 25, 1, 212, + 250, 209, 140, 25, 1, 212, 250, 216, 223, 25, 1, 212, 250, 210, 91, 25, + 1, 212, 250, 224, 182, 25, 1, 212, 250, 216, 255, 25, 1, 212, 250, 217, + 50, 25, 1, 212, 250, 206, 198, 25, 1, 212, 250, 211, 223, 25, 1, 212, + 250, 235, 44, 25, 1, 212, 250, 197, 166, 25, 1, 212, 250, 222, 109, 25, + 1, 212, 250, 221, 221, 25, 1, 212, 250, 224, 11, 25, 1, 212, 250, 219, + 231, 25, 1, 212, 250, 210, 126, 25, 1, 212, 250, 166, 25, 1, 212, 250, + 218, 251, 25, 1, 212, 250, 219, 239, 25, 1, 212, 250, 203, 1, 25, 1, 212, + 250, 223, 223, 25, 1, 212, 250, 208, 227, 25, 1, 212, 250, 197, 219, 218, + 149, 1, 189, 218, 149, 1, 217, 19, 218, 149, 1, 196, 3, 218, 149, 1, 219, + 25, 218, 149, 1, 249, 145, 218, 149, 1, 240, 136, 218, 149, 1, 63, 218, + 149, 1, 212, 246, 218, 149, 1, 224, 141, 218, 149, 1, 232, 178, 218, 149, + 1, 240, 111, 218, 149, 1, 245, 30, 218, 149, 1, 224, 202, 218, 149, 1, + 214, 134, 218, 149, 1, 220, 101, 218, 149, 1, 216, 183, 218, 149, 1, 161, + 218, 149, 1, 214, 102, 218, 149, 1, 72, 218, 149, 1, 209, 232, 218, 149, + 1, 206, 223, 218, 149, 1, 202, 216, 218, 149, 1, 237, 82, 218, 149, 1, + 197, 166, 218, 149, 1, 69, 218, 149, 1, 224, 11, 218, 149, 1, 222, 238, + 218, 149, 1, 172, 218, 149, 1, 232, 235, 218, 149, 1, 210, 72, 218, 149, + 1, 203, 37, 218, 149, 17, 195, 79, 218, 149, 17, 100, 218, 149, 17, 102, + 218, 149, 17, 134, 218, 149, 17, 136, 218, 149, 17, 146, 218, 149, 17, + 167, 218, 149, 17, 178, 218, 149, 17, 171, 218, 149, 17, 182, 218, 149, + 240, 88, 218, 149, 52, 240, 88, 249, 59, 199, 149, 1, 236, 211, 249, 59, + 199, 149, 1, 155, 249, 59, 199, 149, 1, 208, 147, 249, 59, 199, 149, 1, + 235, 239, 249, 59, 199, 149, 1, 219, 234, 249, 59, 199, 149, 1, 196, 21, + 249, 59, 199, 149, 1, 234, 108, 249, 59, 199, 149, 1, 239, 157, 249, 59, + 199, 149, 1, 223, 222, 249, 59, 199, 149, 1, 225, 129, 249, 59, 199, 149, + 1, 231, 42, 249, 59, 199, 149, 1, 197, 166, 249, 59, 199, 149, 1, 195, + 11, 249, 59, 199, 149, 1, 234, 52, 249, 59, 199, 149, 1, 239, 28, 249, + 59, 199, 149, 1, 247, 57, 249, 59, 199, 149, 1, 199, 238, 249, 59, 199, + 149, 1, 149, 249, 59, 199, 149, 1, 249, 145, 249, 59, 199, 149, 1, 197, + 220, 249, 59, 199, 149, 1, 196, 63, 249, 59, 199, 149, 1, 161, 249, 59, + 199, 149, 1, 197, 158, 249, 59, 199, 149, 1, 63, 249, 59, 199, 149, 1, + 72, 249, 59, 199, 149, 1, 214, 102, 249, 59, 199, 149, 1, 66, 249, 59, + 199, 149, 1, 237, 54, 249, 59, 199, 149, 1, 69, 249, 59, 199, 149, 1, 68, + 249, 59, 199, 149, 38, 130, 202, 11, 249, 59, 199, 149, 38, 126, 202, 11, + 249, 59, 199, 149, 38, 219, 65, 202, 11, 249, 59, 199, 149, 38, 221, 205, + 202, 11, 249, 59, 199, 149, 38, 232, 46, 202, 11, 249, 59, 199, 149, 234, + 217, 204, 226, 133, 86, 18, 224, 199, 133, 86, 18, 224, 195, 133, 86, 18, + 224, 90, 133, 86, 18, 224, 53, 133, 86, 18, 224, 227, 133, 86, 18, 224, + 224, 133, 86, 18, 223, 171, 133, 86, 18, 223, 142, 133, 86, 18, 224, 201, + 133, 86, 18, 224, 156, 133, 86, 18, 225, 30, 133, 86, 18, 225, 27, 133, + 86, 18, 223, 241, 133, 86, 18, 223, 238, 133, 86, 18, 224, 220, 133, 86, + 18, 224, 218, 133, 86, 18, 223, 173, 133, 86, 18, 223, 172, 133, 86, 18, + 224, 4, 133, 86, 18, 223, 227, 133, 86, 18, 224, 92, 133, 86, 18, 224, + 91, 133, 86, 18, 225, 45, 133, 86, 18, 224, 223, 133, 86, 18, 223, 132, + 133, 86, 18, 223, 123, 133, 86, 18, 225, 54, 133, 86, 18, 225, 46, 133, + 86, 108, 199, 124, 133, 86, 108, 215, 193, 133, 86, 108, 222, 215, 133, + 86, 108, 232, 158, 133, 86, 108, 216, 89, 133, 86, 108, 210, 193, 133, + 86, 108, 216, 116, 133, 86, 108, 211, 133, 133, 86, 108, 196, 80, 133, + 86, 108, 232, 22, 133, 86, 108, 219, 255, 133, 86, 108, 245, 107, 133, + 86, 108, 217, 162, 133, 86, 108, 231, 214, 133, 86, 108, 212, 134, 133, + 86, 108, 215, 199, 133, 86, 108, 217, 202, 133, 86, 108, 250, 150, 133, + 86, 108, 196, 204, 133, 86, 108, 247, 90, 133, 86, 117, 244, 255, 201, + 31, 133, 86, 117, 244, 255, 205, 200, 133, 86, 117, 244, 255, 224, 174, + 133, 86, 117, 244, 255, 224, 132, 133, 86, 117, 244, 255, 204, 158, 133, + 86, 117, 244, 255, 231, 172, 133, 86, 117, 244, 255, 203, 88, 133, 86, 2, + 198, 230, 202, 166, 133, 86, 2, 198, 230, 201, 102, 247, 48, 133, 86, 2, + 244, 255, 245, 96, 133, 86, 2, 198, 230, 202, 194, 133, 86, 2, 198, 230, + 235, 179, 133, 86, 2, 196, 160, 215, 187, 133, 86, 2, 196, 160, 210, 74, + 133, 86, 2, 196, 160, 201, 222, 133, 86, 2, 196, 160, 235, 220, 133, 86, + 2, 198, 230, 208, 123, 133, 86, 2, 219, 186, 204, 162, 133, 86, 2, 198, + 230, 215, 239, 133, 86, 2, 230, 206, 196, 100, 133, 86, 2, 196, 203, 133, + 86, 2, 244, 255, 201, 89, 209, 215, 133, 86, 17, 195, 79, 133, 86, 17, 100, 133, 86, 17, 102, 133, 86, 17, 134, 133, 86, 17, 136, 133, 86, 17, 146, 133, 86, 17, 167, 133, 86, 17, 178, 133, 86, 17, 171, 133, 86, 17, - 182, 133, 86, 31, 203, 18, 133, 86, 31, 231, 54, 133, 86, 31, 203, 24, - 202, 157, 133, 86, 31, 219, 25, 133, 86, 31, 231, 57, 219, 25, 133, 86, - 31, 203, 24, 248, 164, 133, 86, 31, 201, 167, 133, 86, 2, 198, 230, 221, - 185, 133, 86, 2, 196, 157, 133, 86, 2, 232, 16, 133, 86, 2, 202, 183, - 232, 16, 133, 86, 2, 194, 240, 202, 227, 133, 86, 2, 231, 197, 133, 86, - 2, 215, 252, 133, 86, 2, 196, 195, 133, 86, 2, 215, 190, 133, 86, 2, 250, - 132, 133, 86, 2, 200, 209, 247, 46, 133, 86, 2, 219, 185, 201, 105, 133, - 86, 2, 203, 89, 133, 86, 2, 221, 217, 133, 86, 2, 218, 94, 133, 86, 2, - 244, 254, 232, 230, 221, 163, 215, 196, 215, 195, 133, 86, 2, 244, 254, - 241, 39, 201, 96, 133, 86, 2, 244, 254, 200, 207, 133, 86, 2, 244, 254, - 200, 208, 245, 17, 133, 86, 2, 244, 254, 211, 220, 240, 55, 133, 86, 2, - 244, 254, 215, 245, 201, 230, 133, 86, 244, 226, 2, 201, 100, 133, 86, - 244, 226, 2, 196, 65, 133, 86, 244, 226, 2, 222, 53, 133, 86, 244, 226, - 2, 222, 212, 133, 86, 244, 226, 2, 196, 156, 133, 86, 244, 226, 2, 223, - 241, 133, 86, 244, 226, 2, 232, 154, 133, 86, 244, 226, 2, 218, 136, 133, - 86, 244, 226, 2, 202, 167, 133, 86, 244, 226, 2, 201, 110, 133, 86, 244, - 226, 2, 213, 2, 133, 86, 244, 226, 2, 224, 143, 133, 86, 244, 226, 2, - 232, 218, 133, 86, 244, 226, 2, 199, 146, 133, 86, 244, 226, 2, 235, 215, - 133, 86, 244, 226, 2, 196, 107, 133, 86, 244, 226, 2, 201, 83, 133, 86, - 244, 226, 2, 223, 126, 133, 86, 244, 226, 2, 197, 208, 219, 194, 6, 1, - 221, 135, 219, 194, 6, 1, 209, 80, 219, 194, 6, 1, 199, 230, 219, 194, 6, - 1, 197, 199, 219, 194, 6, 1, 250, 161, 219, 194, 6, 1, 195, 158, 219, - 194, 6, 1, 223, 223, 219, 194, 6, 1, 214, 2, 219, 194, 6, 1, 203, 216, - 219, 194, 6, 1, 234, 189, 219, 194, 6, 1, 236, 48, 219, 194, 6, 1, 68, - 219, 194, 6, 1, 225, 79, 219, 194, 6, 1, 63, 219, 194, 6, 1, 225, 216, - 219, 194, 6, 1, 69, 219, 194, 6, 1, 250, 111, 219, 194, 6, 1, 247, 206, - 219, 194, 6, 1, 66, 219, 194, 6, 1, 195, 217, 219, 194, 6, 1, 159, 219, - 194, 6, 1, 211, 166, 219, 194, 6, 1, 231, 83, 219, 194, 6, 1, 215, 110, - 219, 194, 6, 1, 196, 222, 219, 194, 6, 1, 240, 230, 219, 194, 6, 1, 214, - 163, 219, 194, 6, 1, 218, 54, 219, 194, 6, 1, 144, 219, 194, 6, 1, 72, - 219, 194, 6, 1, 251, 199, 219, 194, 6, 1, 196, 148, 219, 194, 4, 1, 221, - 135, 219, 194, 4, 1, 209, 80, 219, 194, 4, 1, 199, 230, 219, 194, 4, 1, - 197, 199, 219, 194, 4, 1, 250, 161, 219, 194, 4, 1, 195, 158, 219, 194, - 4, 1, 223, 223, 219, 194, 4, 1, 214, 2, 219, 194, 4, 1, 203, 216, 219, - 194, 4, 1, 234, 189, 219, 194, 4, 1, 236, 48, 219, 194, 4, 1, 68, 219, - 194, 4, 1, 225, 79, 219, 194, 4, 1, 63, 219, 194, 4, 1, 225, 216, 219, - 194, 4, 1, 69, 219, 194, 4, 1, 250, 111, 219, 194, 4, 1, 247, 206, 219, - 194, 4, 1, 66, 219, 194, 4, 1, 195, 217, 219, 194, 4, 1, 159, 219, 194, - 4, 1, 211, 166, 219, 194, 4, 1, 231, 83, 219, 194, 4, 1, 215, 110, 219, - 194, 4, 1, 196, 222, 219, 194, 4, 1, 240, 230, 219, 194, 4, 1, 214, 163, - 219, 194, 4, 1, 218, 54, 219, 194, 4, 1, 144, 219, 194, 4, 1, 72, 219, - 194, 4, 1, 251, 199, 219, 194, 4, 1, 196, 148, 219, 194, 17, 195, 79, - 219, 194, 17, 100, 219, 194, 17, 102, 219, 194, 17, 134, 219, 194, 17, - 136, 219, 194, 17, 146, 219, 194, 17, 167, 219, 194, 17, 178, 219, 194, - 17, 171, 219, 194, 17, 182, 219, 194, 31, 203, 23, 219, 194, 31, 236, - 251, 219, 194, 31, 200, 239, 219, 194, 31, 202, 179, 219, 194, 31, 235, - 0, 219, 194, 31, 235, 148, 219, 194, 31, 206, 23, 219, 194, 31, 207, 68, - 219, 194, 31, 237, 27, 219, 194, 31, 216, 175, 219, 194, 17, 97, 251, - 130, 20, 219, 194, 17, 99, 251, 130, 20, 219, 194, 17, 115, 251, 130, 20, - 219, 194, 244, 158, 219, 194, 234, 216, 204, 226, 219, 194, 16, 251, 184, - 219, 194, 236, 89, 214, 148, 109, 1, 161, 109, 1, 249, 144, 109, 1, 11, - 161, 109, 1, 212, 149, 109, 1, 166, 109, 1, 219, 80, 109, 1, 250, 250, - 166, 109, 1, 235, 238, 109, 1, 199, 152, 109, 1, 199, 36, 109, 1, 189, - 109, 1, 240, 135, 109, 1, 11, 201, 78, 109, 1, 11, 189, 109, 1, 201, 78, - 109, 1, 240, 40, 109, 1, 176, 109, 1, 216, 226, 109, 1, 11, 216, 85, 109, - 1, 250, 250, 176, 109, 1, 216, 85, 109, 1, 216, 71, 109, 1, 172, 109, 1, - 221, 149, 109, 1, 222, 121, 109, 1, 222, 110, 109, 1, 202, 44, 109, 1, - 239, 36, 109, 1, 202, 36, 109, 1, 239, 35, 109, 1, 155, 109, 1, 234, 122, - 109, 1, 11, 155, 109, 1, 211, 158, 109, 1, 211, 135, 109, 1, 217, 70, - 109, 1, 217, 19, 109, 1, 250, 250, 217, 70, 109, 1, 142, 109, 1, 196, - 208, 109, 1, 233, 229, 109, 1, 233, 204, 109, 1, 201, 88, 109, 1, 237, - 138, 109, 1, 215, 108, 109, 1, 215, 90, 109, 1, 201, 103, 109, 1, 237, - 149, 109, 1, 11, 201, 103, 109, 1, 11, 237, 149, 109, 1, 210, 152, 201, + 182, 133, 86, 31, 203, 18, 133, 86, 31, 231, 55, 133, 86, 31, 203, 24, + 202, 157, 133, 86, 31, 219, 26, 133, 86, 31, 231, 58, 219, 26, 133, 86, + 31, 203, 24, 248, 165, 133, 86, 31, 201, 167, 133, 86, 2, 198, 230, 221, + 186, 133, 86, 2, 196, 157, 133, 86, 2, 232, 17, 133, 86, 2, 202, 183, + 232, 17, 133, 86, 2, 194, 240, 202, 227, 133, 86, 2, 231, 198, 133, 86, + 2, 215, 253, 133, 86, 2, 196, 195, 133, 86, 2, 215, 191, 133, 86, 2, 250, + 133, 133, 86, 2, 200, 209, 247, 47, 133, 86, 2, 219, 186, 201, 105, 133, + 86, 2, 203, 89, 133, 86, 2, 221, 218, 133, 86, 2, 218, 95, 133, 86, 2, + 244, 255, 232, 231, 221, 164, 215, 197, 215, 196, 133, 86, 2, 244, 255, + 241, 40, 201, 96, 133, 86, 2, 244, 255, 200, 207, 133, 86, 2, 244, 255, + 200, 208, 245, 18, 133, 86, 2, 244, 255, 211, 221, 240, 56, 133, 86, 2, + 244, 255, 215, 246, 201, 230, 133, 86, 244, 227, 2, 201, 100, 133, 86, + 244, 227, 2, 196, 65, 133, 86, 244, 227, 2, 222, 54, 133, 86, 244, 227, + 2, 222, 213, 133, 86, 244, 227, 2, 196, 156, 133, 86, 244, 227, 2, 223, + 242, 133, 86, 244, 227, 2, 232, 155, 133, 86, 244, 227, 2, 218, 137, 133, + 86, 244, 227, 2, 202, 167, 133, 86, 244, 227, 2, 201, 110, 133, 86, 244, + 227, 2, 213, 3, 133, 86, 244, 227, 2, 224, 144, 133, 86, 244, 227, 2, + 232, 219, 133, 86, 244, 227, 2, 199, 146, 133, 86, 244, 227, 2, 235, 216, + 133, 86, 244, 227, 2, 196, 107, 133, 86, 244, 227, 2, 201, 83, 133, 86, + 244, 227, 2, 223, 127, 133, 86, 244, 227, 2, 197, 208, 219, 195, 6, 1, + 221, 136, 219, 195, 6, 1, 209, 80, 219, 195, 6, 1, 199, 230, 219, 195, 6, + 1, 197, 199, 219, 195, 6, 1, 250, 162, 219, 195, 6, 1, 195, 158, 219, + 195, 6, 1, 223, 224, 219, 195, 6, 1, 214, 3, 219, 195, 6, 1, 203, 216, + 219, 195, 6, 1, 234, 190, 219, 195, 6, 1, 236, 49, 219, 195, 6, 1, 68, + 219, 195, 6, 1, 225, 80, 219, 195, 6, 1, 63, 219, 195, 6, 1, 225, 217, + 219, 195, 6, 1, 69, 219, 195, 6, 1, 250, 112, 219, 195, 6, 1, 247, 207, + 219, 195, 6, 1, 66, 219, 195, 6, 1, 195, 217, 219, 195, 6, 1, 159, 219, + 195, 6, 1, 211, 167, 219, 195, 6, 1, 231, 84, 219, 195, 6, 1, 215, 111, + 219, 195, 6, 1, 196, 222, 219, 195, 6, 1, 240, 231, 219, 195, 6, 1, 214, + 164, 219, 195, 6, 1, 218, 55, 219, 195, 6, 1, 144, 219, 195, 6, 1, 72, + 219, 195, 6, 1, 251, 200, 219, 195, 6, 1, 196, 148, 219, 195, 4, 1, 221, + 136, 219, 195, 4, 1, 209, 80, 219, 195, 4, 1, 199, 230, 219, 195, 4, 1, + 197, 199, 219, 195, 4, 1, 250, 162, 219, 195, 4, 1, 195, 158, 219, 195, + 4, 1, 223, 224, 219, 195, 4, 1, 214, 3, 219, 195, 4, 1, 203, 216, 219, + 195, 4, 1, 234, 190, 219, 195, 4, 1, 236, 49, 219, 195, 4, 1, 68, 219, + 195, 4, 1, 225, 80, 219, 195, 4, 1, 63, 219, 195, 4, 1, 225, 217, 219, + 195, 4, 1, 69, 219, 195, 4, 1, 250, 112, 219, 195, 4, 1, 247, 207, 219, + 195, 4, 1, 66, 219, 195, 4, 1, 195, 217, 219, 195, 4, 1, 159, 219, 195, + 4, 1, 211, 167, 219, 195, 4, 1, 231, 84, 219, 195, 4, 1, 215, 111, 219, + 195, 4, 1, 196, 222, 219, 195, 4, 1, 240, 231, 219, 195, 4, 1, 214, 164, + 219, 195, 4, 1, 218, 55, 219, 195, 4, 1, 144, 219, 195, 4, 1, 72, 219, + 195, 4, 1, 251, 200, 219, 195, 4, 1, 196, 148, 219, 195, 17, 195, 79, + 219, 195, 17, 100, 219, 195, 17, 102, 219, 195, 17, 134, 219, 195, 17, + 136, 219, 195, 17, 146, 219, 195, 17, 167, 219, 195, 17, 178, 219, 195, + 17, 171, 219, 195, 17, 182, 219, 195, 31, 203, 23, 219, 195, 31, 236, + 252, 219, 195, 31, 200, 239, 219, 195, 31, 202, 179, 219, 195, 31, 235, + 1, 219, 195, 31, 235, 149, 219, 195, 31, 206, 23, 219, 195, 31, 207, 68, + 219, 195, 31, 237, 28, 219, 195, 31, 216, 176, 219, 195, 17, 97, 251, + 131, 20, 219, 195, 17, 99, 251, 131, 20, 219, 195, 17, 115, 251, 131, 20, + 219, 195, 244, 159, 219, 195, 234, 217, 204, 226, 219, 195, 16, 251, 185, + 219, 195, 236, 90, 214, 149, 109, 1, 161, 109, 1, 249, 145, 109, 1, 11, + 161, 109, 1, 212, 150, 109, 1, 166, 109, 1, 219, 81, 109, 1, 250, 251, + 166, 109, 1, 235, 239, 109, 1, 199, 152, 109, 1, 199, 36, 109, 1, 189, + 109, 1, 240, 136, 109, 1, 11, 201, 78, 109, 1, 11, 189, 109, 1, 201, 78, + 109, 1, 240, 41, 109, 1, 176, 109, 1, 216, 227, 109, 1, 11, 216, 86, 109, + 1, 250, 251, 176, 109, 1, 216, 86, 109, 1, 216, 72, 109, 1, 172, 109, 1, + 221, 150, 109, 1, 222, 122, 109, 1, 222, 111, 109, 1, 202, 44, 109, 1, + 239, 37, 109, 1, 202, 36, 109, 1, 239, 36, 109, 1, 155, 109, 1, 234, 123, + 109, 1, 11, 155, 109, 1, 211, 159, 109, 1, 211, 136, 109, 1, 217, 71, + 109, 1, 217, 20, 109, 1, 250, 251, 217, 71, 109, 1, 142, 109, 1, 196, + 208, 109, 1, 233, 230, 109, 1, 233, 205, 109, 1, 201, 88, 109, 1, 237, + 139, 109, 1, 215, 109, 109, 1, 215, 91, 109, 1, 201, 103, 109, 1, 237, + 150, 109, 1, 11, 201, 103, 109, 1, 11, 237, 150, 109, 1, 210, 153, 201, 103, 109, 1, 207, 50, 109, 1, 205, 80, 109, 1, 195, 74, 109, 1, 195, 1, - 109, 1, 201, 113, 109, 1, 237, 155, 109, 1, 11, 201, 113, 109, 1, 183, + 109, 1, 201, 113, 109, 1, 237, 156, 109, 1, 11, 201, 113, 109, 1, 183, 109, 1, 195, 115, 109, 1, 195, 2, 109, 1, 194, 228, 109, 1, 194, 208, - 109, 1, 250, 250, 194, 228, 109, 1, 194, 200, 109, 1, 194, 207, 109, 1, - 197, 166, 109, 1, 251, 208, 109, 1, 232, 79, 109, 1, 248, 42, 109, 1, - 204, 42, 109, 1, 237, 139, 109, 1, 203, 68, 109, 1, 201, 107, 109, 1, - 209, 143, 109, 2, 108, 73, 154, 109, 1, 217, 206, 109, 2, 250, 184, 109, - 2, 210, 152, 198, 242, 109, 2, 210, 152, 250, 184, 109, 18, 2, 63, 109, - 18, 2, 252, 167, 109, 18, 2, 251, 204, 109, 18, 2, 251, 105, 109, 18, 2, - 251, 96, 109, 18, 2, 72, 109, 18, 2, 214, 101, 109, 18, 2, 197, 34, 109, - 18, 2, 197, 199, 109, 18, 2, 69, 109, 18, 2, 236, 229, 109, 18, 2, 236, - 214, 109, 18, 2, 214, 159, 109, 18, 2, 68, 109, 18, 2, 230, 209, 109, 18, - 2, 230, 208, 109, 18, 2, 230, 207, 109, 18, 2, 226, 11, 109, 18, 2, 226, - 146, 109, 18, 2, 226, 119, 109, 18, 2, 225, 229, 109, 18, 2, 226, 59, + 109, 1, 250, 251, 194, 228, 109, 1, 194, 200, 109, 1, 194, 207, 109, 1, + 197, 166, 109, 1, 251, 209, 109, 1, 232, 80, 109, 1, 248, 43, 109, 1, + 204, 42, 109, 1, 237, 140, 109, 1, 203, 68, 109, 1, 201, 107, 109, 1, + 209, 143, 109, 2, 108, 73, 154, 109, 1, 217, 207, 109, 2, 250, 185, 109, + 2, 210, 153, 198, 242, 109, 2, 210, 153, 250, 185, 109, 18, 2, 63, 109, + 18, 2, 252, 168, 109, 18, 2, 251, 205, 109, 18, 2, 251, 106, 109, 18, 2, + 251, 97, 109, 18, 2, 72, 109, 18, 2, 214, 102, 109, 18, 2, 197, 34, 109, + 18, 2, 197, 199, 109, 18, 2, 69, 109, 18, 2, 236, 230, 109, 18, 2, 236, + 215, 109, 18, 2, 214, 160, 109, 18, 2, 68, 109, 18, 2, 230, 210, 109, 18, + 2, 230, 209, 109, 18, 2, 230, 208, 109, 18, 2, 226, 12, 109, 18, 2, 226, + 147, 109, 18, 2, 226, 120, 109, 18, 2, 225, 230, 109, 18, 2, 226, 60, 109, 18, 2, 66, 109, 18, 2, 200, 114, 109, 18, 2, 200, 113, 109, 18, 2, 200, 112, 109, 18, 2, 199, 245, 109, 18, 2, 200, 96, 109, 18, 2, 200, 56, - 109, 18, 2, 196, 148, 109, 18, 2, 196, 24, 109, 18, 2, 251, 244, 109, 18, - 2, 251, 240, 109, 18, 2, 236, 154, 109, 18, 2, 209, 185, 236, 154, 109, - 18, 2, 236, 162, 109, 18, 2, 209, 185, 236, 162, 109, 18, 2, 251, 199, - 109, 18, 2, 237, 32, 109, 18, 2, 250, 149, 109, 18, 2, 214, 38, 109, 18, - 2, 218, 54, 109, 18, 2, 217, 72, 109, 18, 2, 200, 40, 109, 18, 2, 195, - 197, 109, 18, 2, 214, 153, 109, 18, 2, 214, 160, 109, 18, 2, 197, 210, - 109, 18, 2, 226, 124, 109, 18, 2, 237, 81, 109, 18, 2, 226, 9, 109, 18, + 109, 18, 2, 196, 148, 109, 18, 2, 196, 24, 109, 18, 2, 251, 245, 109, 18, + 2, 251, 241, 109, 18, 2, 236, 155, 109, 18, 2, 209, 185, 236, 155, 109, + 18, 2, 236, 163, 109, 18, 2, 209, 185, 236, 163, 109, 18, 2, 251, 200, + 109, 18, 2, 237, 33, 109, 18, 2, 250, 150, 109, 18, 2, 214, 39, 109, 18, + 2, 218, 55, 109, 18, 2, 217, 73, 109, 18, 2, 200, 40, 109, 18, 2, 195, + 197, 109, 18, 2, 214, 154, 109, 18, 2, 214, 161, 109, 18, 2, 197, 210, + 109, 18, 2, 226, 125, 109, 18, 2, 237, 82, 109, 18, 2, 226, 10, 109, 18, 2, 200, 90, 109, 152, 210, 22, 109, 152, 201, 243, 210, 22, 109, 152, 57, 109, 152, 60, 109, 1, 202, 9, 109, 1, 202, 8, 109, 1, 202, 7, 109, 1, - 202, 6, 109, 1, 202, 5, 109, 1, 202, 4, 109, 1, 202, 3, 109, 1, 210, 152, - 202, 10, 109, 1, 210, 152, 202, 9, 109, 1, 210, 152, 202, 7, 109, 1, 210, - 152, 202, 6, 109, 1, 210, 152, 202, 5, 109, 1, 210, 152, 202, 3, 19, 225, - 231, 78, 43, 225, 231, 78, 37, 245, 60, 231, 164, 78, 37, 245, 60, 225, - 231, 78, 19, 244, 147, 19, 244, 146, 19, 244, 145, 19, 244, 144, 19, 244, - 143, 19, 244, 142, 19, 244, 141, 19, 244, 140, 19, 244, 139, 19, 244, - 138, 19, 244, 137, 19, 244, 136, 19, 244, 135, 19, 244, 134, 19, 244, - 133, 19, 244, 132, 19, 244, 131, 19, 244, 130, 19, 244, 129, 19, 244, - 128, 19, 244, 127, 19, 244, 126, 19, 244, 125, 19, 244, 124, 19, 244, - 123, 19, 244, 122, 19, 244, 121, 19, 244, 120, 19, 244, 119, 19, 244, - 118, 19, 244, 117, 19, 244, 116, 19, 244, 115, 19, 244, 114, 19, 244, - 113, 19, 244, 112, 19, 244, 111, 19, 244, 110, 19, 244, 109, 19, 244, - 108, 19, 244, 107, 19, 244, 106, 19, 244, 105, 19, 244, 104, 19, 244, - 103, 19, 244, 102, 19, 244, 101, 19, 244, 100, 19, 244, 99, 19, 244, 98, - 19, 244, 97, 19, 244, 96, 19, 244, 95, 19, 244, 94, 19, 244, 93, 19, 244, - 92, 19, 244, 91, 19, 244, 90, 19, 244, 89, 19, 244, 88, 19, 244, 87, 19, - 244, 86, 19, 244, 85, 19, 244, 84, 19, 244, 83, 19, 244, 82, 19, 244, 81, - 19, 244, 80, 19, 244, 79, 19, 244, 78, 19, 244, 77, 19, 244, 76, 19, 244, - 75, 19, 244, 74, 19, 244, 73, 19, 244, 72, 19, 244, 71, 19, 244, 70, 19, - 244, 69, 19, 244, 68, 19, 244, 67, 19, 244, 66, 19, 244, 65, 19, 244, 64, - 19, 244, 63, 19, 244, 62, 19, 244, 61, 19, 244, 60, 19, 244, 59, 19, 244, - 58, 19, 244, 57, 19, 244, 56, 19, 244, 55, 19, 244, 54, 19, 244, 53, 19, - 244, 52, 19, 244, 51, 19, 244, 50, 19, 244, 49, 19, 244, 48, 19, 244, 47, - 19, 244, 46, 19, 244, 45, 19, 244, 44, 19, 244, 43, 19, 244, 42, 19, 244, - 41, 19, 244, 40, 19, 244, 39, 19, 244, 38, 19, 244, 37, 19, 244, 36, 19, - 244, 35, 19, 244, 34, 19, 244, 33, 19, 244, 32, 19, 244, 31, 19, 244, 30, - 19, 244, 29, 19, 244, 28, 19, 244, 27, 19, 244, 26, 19, 244, 25, 19, 244, - 24, 19, 244, 23, 19, 244, 22, 19, 244, 21, 19, 244, 20, 19, 244, 19, 19, - 244, 18, 19, 244, 17, 19, 244, 16, 19, 244, 15, 19, 244, 14, 19, 244, 13, - 19, 244, 12, 19, 244, 11, 19, 244, 10, 19, 244, 9, 19, 244, 8, 19, 244, - 7, 19, 244, 6, 19, 244, 5, 19, 244, 4, 19, 244, 3, 19, 244, 2, 19, 244, - 1, 19, 244, 0, 19, 243, 255, 19, 243, 254, 19, 243, 253, 19, 243, 252, - 19, 243, 251, 19, 243, 250, 19, 243, 249, 19, 243, 248, 19, 243, 247, 19, - 243, 246, 19, 243, 245, 19, 243, 244, 19, 243, 243, 19, 243, 242, 19, - 243, 241, 19, 243, 240, 19, 243, 239, 19, 243, 238, 19, 243, 237, 19, - 243, 236, 19, 243, 235, 19, 243, 234, 19, 243, 233, 19, 243, 232, 19, - 243, 231, 19, 243, 230, 19, 243, 229, 19, 243, 228, 19, 243, 227, 19, - 243, 226, 19, 243, 225, 19, 243, 224, 19, 243, 223, 19, 243, 222, 19, - 243, 221, 19, 243, 220, 19, 243, 219, 19, 243, 218, 19, 243, 217, 19, - 243, 216, 19, 243, 215, 19, 243, 214, 19, 243, 213, 19, 243, 212, 19, - 243, 211, 19, 243, 210, 19, 243, 209, 19, 243, 208, 19, 243, 207, 19, - 243, 206, 19, 243, 205, 19, 243, 204, 19, 243, 203, 19, 243, 202, 19, - 243, 201, 19, 243, 200, 19, 243, 199, 19, 243, 198, 19, 243, 197, 19, - 243, 196, 19, 243, 195, 19, 243, 194, 19, 243, 193, 19, 243, 192, 19, - 243, 191, 19, 243, 190, 19, 243, 189, 19, 243, 188, 19, 243, 187, 19, - 243, 186, 19, 243, 185, 19, 243, 184, 19, 243, 183, 19, 243, 182, 19, - 243, 181, 19, 243, 180, 19, 243, 179, 19, 243, 178, 19, 243, 177, 19, - 243, 176, 19, 243, 175, 19, 243, 174, 19, 243, 173, 19, 243, 172, 19, - 243, 171, 19, 243, 170, 19, 243, 169, 19, 243, 168, 19, 243, 167, 19, - 243, 166, 19, 243, 165, 19, 243, 164, 19, 243, 163, 19, 243, 162, 19, - 243, 161, 19, 243, 160, 19, 243, 159, 19, 243, 158, 19, 243, 157, 19, - 243, 156, 19, 243, 155, 19, 243, 154, 19, 243, 153, 19, 243, 152, 19, - 243, 151, 19, 243, 150, 19, 243, 149, 19, 243, 148, 19, 243, 147, 19, - 243, 146, 19, 243, 145, 19, 243, 144, 19, 243, 143, 19, 243, 142, 19, - 243, 141, 19, 243, 140, 19, 243, 139, 19, 243, 138, 19, 243, 137, 19, - 243, 136, 19, 243, 135, 19, 243, 134, 19, 243, 133, 19, 243, 132, 19, - 243, 131, 19, 243, 130, 19, 243, 129, 19, 243, 128, 19, 243, 127, 19, - 243, 126, 19, 243, 125, 19, 243, 124, 19, 243, 123, 19, 243, 122, 19, - 243, 121, 19, 243, 120, 19, 243, 119, 19, 243, 118, 19, 243, 117, 19, - 243, 116, 19, 243, 115, 19, 243, 114, 19, 243, 113, 19, 243, 112, 19, - 243, 111, 19, 243, 110, 19, 243, 109, 19, 243, 108, 19, 243, 107, 19, - 243, 106, 19, 243, 105, 19, 243, 104, 19, 243, 103, 19, 243, 102, 19, - 243, 101, 19, 243, 100, 19, 243, 99, 19, 243, 98, 19, 243, 97, 19, 243, - 96, 19, 243, 95, 19, 243, 94, 19, 243, 93, 19, 243, 92, 19, 243, 91, 19, - 243, 90, 19, 243, 89, 19, 243, 88, 19, 243, 87, 19, 243, 86, 19, 243, 85, - 19, 243, 84, 19, 243, 83, 19, 243, 82, 19, 243, 81, 19, 243, 80, 19, 243, - 79, 19, 243, 78, 19, 243, 77, 19, 243, 76, 19, 243, 75, 19, 243, 74, 19, - 243, 73, 19, 243, 72, 19, 243, 71, 19, 243, 70, 19, 243, 69, 19, 243, 68, - 19, 243, 67, 19, 243, 66, 19, 243, 65, 19, 243, 64, 19, 243, 63, 19, 243, - 62, 19, 243, 61, 19, 243, 60, 19, 243, 59, 19, 243, 58, 19, 243, 57, 19, - 243, 56, 19, 243, 55, 19, 243, 54, 19, 243, 53, 19, 243, 52, 19, 243, 51, - 19, 243, 50, 19, 243, 49, 19, 243, 48, 19, 243, 47, 19, 243, 46, 19, 243, - 45, 19, 243, 44, 19, 243, 43, 19, 243, 42, 19, 243, 41, 19, 243, 40, 19, - 243, 39, 19, 243, 38, 19, 243, 37, 19, 243, 36, 19, 243, 35, 19, 243, 34, - 19, 243, 33, 19, 243, 32, 19, 243, 31, 19, 243, 30, 19, 243, 29, 19, 243, - 28, 19, 243, 27, 19, 243, 26, 19, 243, 25, 19, 243, 24, 19, 243, 23, 19, - 243, 22, 19, 243, 21, 19, 243, 20, 19, 243, 19, 19, 243, 18, 19, 243, 17, - 19, 243, 16, 19, 243, 15, 19, 243, 14, 19, 243, 13, 19, 243, 12, 19, 243, - 11, 19, 243, 10, 19, 243, 9, 19, 243, 8, 19, 243, 7, 19, 243, 6, 19, 243, - 5, 19, 243, 4, 19, 243, 3, 19, 243, 2, 19, 243, 1, 19, 243, 0, 19, 242, - 255, 19, 242, 254, 19, 242, 253, 19, 242, 252, 19, 242, 251, 19, 242, - 250, 19, 242, 249, 19, 242, 248, 19, 242, 247, 19, 242, 246, 19, 242, - 245, 19, 242, 244, 19, 242, 243, 19, 242, 242, 19, 242, 241, 19, 242, - 240, 19, 242, 239, 19, 242, 238, 19, 242, 237, 19, 242, 236, 19, 242, - 235, 19, 242, 234, 19, 242, 233, 19, 242, 232, 19, 242, 231, 19, 242, - 230, 19, 242, 229, 19, 242, 228, 19, 242, 227, 19, 242, 226, 19, 242, - 225, 19, 242, 224, 19, 242, 223, 19, 242, 222, 19, 242, 221, 19, 242, - 220, 19, 242, 219, 19, 242, 218, 19, 242, 217, 19, 242, 216, 19, 242, - 215, 19, 242, 214, 19, 242, 213, 19, 242, 212, 19, 242, 211, 19, 242, - 210, 19, 242, 209, 19, 242, 208, 19, 242, 207, 19, 242, 206, 19, 242, - 205, 19, 242, 204, 19, 242, 203, 19, 242, 202, 19, 242, 201, 19, 242, - 200, 19, 242, 199, 19, 242, 198, 19, 242, 197, 19, 242, 196, 19, 242, - 195, 19, 242, 194, 19, 242, 193, 19, 242, 192, 19, 242, 191, 19, 242, - 190, 19, 242, 189, 19, 242, 188, 19, 242, 187, 19, 242, 186, 19, 242, - 185, 19, 242, 184, 19, 242, 183, 19, 242, 182, 19, 242, 181, 19, 242, - 180, 19, 242, 179, 19, 242, 178, 19, 242, 177, 19, 242, 176, 19, 242, - 175, 19, 242, 174, 19, 242, 173, 19, 242, 172, 19, 242, 171, 19, 242, - 170, 19, 242, 169, 19, 242, 168, 19, 242, 167, 19, 242, 166, 19, 242, - 165, 19, 242, 164, 19, 242, 163, 19, 242, 162, 19, 242, 161, 19, 242, - 160, 19, 242, 159, 19, 242, 158, 19, 242, 157, 19, 242, 156, 19, 242, - 155, 19, 242, 154, 19, 242, 153, 19, 242, 152, 19, 242, 151, 19, 242, - 150, 19, 242, 149, 19, 242, 148, 19, 242, 147, 19, 242, 146, 19, 242, - 145, 19, 242, 144, 19, 242, 143, 19, 242, 142, 19, 242, 141, 19, 242, - 140, 19, 242, 139, 19, 242, 138, 19, 242, 137, 19, 242, 136, 19, 242, - 135, 19, 242, 134, 19, 242, 133, 19, 242, 132, 19, 242, 131, 19, 242, - 130, 19, 242, 129, 19, 242, 128, 19, 242, 127, 19, 242, 126, 19, 242, - 125, 19, 242, 124, 19, 242, 123, 19, 242, 122, 19, 242, 121, 19, 242, - 120, 19, 242, 119, 19, 242, 118, 19, 242, 117, 19, 242, 116, 19, 242, - 115, 19, 242, 114, 19, 242, 113, 19, 242, 112, 19, 242, 111, 19, 242, - 110, 19, 242, 109, 19, 242, 108, 19, 242, 107, 19, 242, 106, 19, 242, - 105, 19, 242, 104, 19, 242, 103, 19, 242, 102, 19, 242, 101, 19, 242, - 100, 19, 242, 99, 19, 242, 98, 19, 242, 97, 19, 242, 96, 19, 242, 95, 19, - 242, 94, 19, 242, 93, 19, 242, 92, 19, 242, 91, 19, 242, 90, 19, 242, 89, - 19, 242, 88, 19, 242, 87, 19, 242, 86, 19, 242, 85, 19, 242, 84, 19, 242, - 83, 19, 242, 82, 19, 242, 81, 19, 242, 80, 19, 242, 79, 19, 242, 78, 19, - 242, 77, 19, 242, 76, 19, 242, 75, 19, 242, 74, 19, 242, 73, 19, 242, 72, - 19, 242, 71, 19, 242, 70, 19, 242, 69, 19, 242, 68, 19, 242, 67, 19, 242, - 66, 19, 242, 65, 19, 242, 64, 19, 242, 63, 19, 242, 62, 19, 242, 61, 19, - 242, 60, 19, 242, 59, 19, 242, 58, 19, 242, 57, 19, 242, 56, 19, 242, 55, - 19, 242, 54, 19, 242, 53, 19, 242, 52, 19, 242, 51, 19, 242, 50, 19, 242, - 49, 19, 242, 48, 19, 242, 47, 19, 242, 46, 19, 242, 45, 19, 242, 44, 19, - 242, 43, 19, 242, 42, 19, 242, 41, 19, 242, 40, 19, 242, 39, 19, 242, 38, - 19, 242, 37, 19, 242, 36, 19, 242, 35, 19, 242, 34, 19, 242, 33, 19, 242, - 32, 19, 242, 31, 19, 242, 30, 19, 242, 29, 19, 242, 28, 19, 242, 27, 19, - 242, 26, 19, 242, 25, 19, 242, 24, 19, 242, 23, 19, 242, 22, 19, 242, 21, - 19, 242, 20, 19, 242, 19, 19, 242, 18, 19, 242, 17, 19, 242, 16, 19, 242, - 15, 19, 242, 14, 19, 242, 13, 19, 242, 12, 19, 242, 11, 19, 242, 10, 19, - 242, 9, 19, 242, 8, 19, 242, 7, 19, 242, 6, 19, 242, 5, 19, 242, 4, 19, - 242, 3, 19, 242, 2, 19, 242, 1, 19, 242, 0, 19, 241, 255, 19, 241, 254, - 19, 241, 253, 19, 241, 252, 19, 241, 251, 19, 241, 250, 19, 241, 249, 19, - 241, 248, 19, 241, 247, 19, 241, 246, 19, 241, 245, 19, 241, 244, 19, - 241, 243, 19, 241, 242, 19, 241, 241, 19, 241, 240, 19, 241, 239, 19, - 241, 238, 19, 241, 237, 19, 241, 236, 19, 241, 235, 19, 241, 234, 19, - 241, 233, 19, 241, 232, 19, 241, 231, 19, 241, 230, 19, 241, 229, 19, - 241, 228, 19, 241, 227, 19, 241, 226, 19, 241, 225, 19, 241, 224, 19, - 241, 223, 19, 241, 222, 19, 241, 221, 19, 241, 220, 19, 241, 219, 19, - 241, 218, 19, 241, 217, 19, 241, 216, 19, 241, 215, 19, 241, 214, 19, - 241, 213, 19, 241, 212, 19, 241, 211, 19, 241, 210, 19, 241, 209, 19, - 241, 208, 19, 241, 207, 19, 241, 206, 19, 241, 205, 19, 241, 204, 19, - 241, 203, 19, 241, 202, 19, 241, 201, 19, 241, 200, 19, 241, 199, 19, - 241, 198, 19, 241, 197, 19, 241, 196, 19, 241, 195, 19, 241, 194, 19, - 241, 193, 19, 241, 192, 19, 241, 191, 19, 241, 190, 19, 241, 189, 19, - 241, 188, 19, 241, 187, 19, 241, 186, 19, 241, 185, 19, 241, 184, 19, - 241, 183, 19, 241, 182, 19, 241, 181, 19, 241, 180, 19, 241, 179, 19, - 241, 178, 19, 241, 177, 19, 241, 176, 19, 241, 175, 19, 241, 174, 19, - 241, 173, 19, 241, 172, 19, 241, 171, 19, 241, 170, 19, 241, 169, 19, - 241, 168, 19, 241, 167, 19, 241, 166, 19, 241, 165, 19, 241, 164, 19, - 241, 163, 19, 241, 162, 19, 241, 161, 71, 1, 250, 250, 69, 188, 1, 250, - 250, 196, 69, 56, 1, 255, 167, 56, 1, 255, 166, 56, 1, 255, 165, 56, 1, - 255, 161, 56, 1, 230, 247, 56, 1, 230, 246, 56, 1, 230, 245, 56, 1, 230, - 244, 56, 1, 200, 177, 56, 1, 200, 176, 56, 1, 200, 175, 56, 1, 200, 174, - 56, 1, 200, 173, 56, 1, 237, 133, 56, 1, 237, 132, 56, 1, 237, 131, 56, - 1, 237, 130, 56, 1, 237, 129, 56, 1, 215, 21, 56, 1, 215, 20, 56, 1, 215, - 19, 56, 1, 225, 68, 56, 1, 225, 65, 56, 1, 225, 64, 56, 1, 225, 63, 56, - 1, 225, 62, 56, 1, 225, 61, 56, 1, 225, 60, 56, 1, 225, 59, 56, 1, 225, - 58, 56, 1, 225, 67, 56, 1, 225, 66, 56, 1, 225, 57, 56, 1, 224, 99, 56, - 1, 224, 98, 56, 1, 224, 97, 56, 1, 224, 96, 56, 1, 224, 95, 56, 1, 224, - 94, 56, 1, 224, 93, 56, 1, 224, 92, 56, 1, 223, 185, 56, 1, 223, 184, 56, - 1, 223, 183, 56, 1, 223, 182, 56, 1, 223, 181, 56, 1, 223, 180, 56, 1, - 223, 179, 56, 1, 224, 207, 56, 1, 224, 206, 56, 1, 224, 205, 56, 1, 224, - 204, 56, 1, 224, 203, 56, 1, 224, 202, 56, 1, 224, 9, 56, 1, 224, 8, 56, - 1, 224, 7, 56, 1, 224, 6, 56, 1, 209, 22, 56, 1, 209, 21, 56, 1, 209, 20, + 202, 6, 109, 1, 202, 5, 109, 1, 202, 4, 109, 1, 202, 3, 109, 1, 210, 153, + 202, 10, 109, 1, 210, 153, 202, 9, 109, 1, 210, 153, 202, 7, 109, 1, 210, + 153, 202, 6, 109, 1, 210, 153, 202, 5, 109, 1, 210, 153, 202, 3, 19, 225, + 232, 78, 43, 225, 232, 78, 37, 245, 61, 231, 165, 78, 37, 245, 61, 225, + 232, 78, 19, 244, 148, 19, 244, 147, 19, 244, 146, 19, 244, 145, 19, 244, + 144, 19, 244, 143, 19, 244, 142, 19, 244, 141, 19, 244, 140, 19, 244, + 139, 19, 244, 138, 19, 244, 137, 19, 244, 136, 19, 244, 135, 19, 244, + 134, 19, 244, 133, 19, 244, 132, 19, 244, 131, 19, 244, 130, 19, 244, + 129, 19, 244, 128, 19, 244, 127, 19, 244, 126, 19, 244, 125, 19, 244, + 124, 19, 244, 123, 19, 244, 122, 19, 244, 121, 19, 244, 120, 19, 244, + 119, 19, 244, 118, 19, 244, 117, 19, 244, 116, 19, 244, 115, 19, 244, + 114, 19, 244, 113, 19, 244, 112, 19, 244, 111, 19, 244, 110, 19, 244, + 109, 19, 244, 108, 19, 244, 107, 19, 244, 106, 19, 244, 105, 19, 244, + 104, 19, 244, 103, 19, 244, 102, 19, 244, 101, 19, 244, 100, 19, 244, 99, + 19, 244, 98, 19, 244, 97, 19, 244, 96, 19, 244, 95, 19, 244, 94, 19, 244, + 93, 19, 244, 92, 19, 244, 91, 19, 244, 90, 19, 244, 89, 19, 244, 88, 19, + 244, 87, 19, 244, 86, 19, 244, 85, 19, 244, 84, 19, 244, 83, 19, 244, 82, + 19, 244, 81, 19, 244, 80, 19, 244, 79, 19, 244, 78, 19, 244, 77, 19, 244, + 76, 19, 244, 75, 19, 244, 74, 19, 244, 73, 19, 244, 72, 19, 244, 71, 19, + 244, 70, 19, 244, 69, 19, 244, 68, 19, 244, 67, 19, 244, 66, 19, 244, 65, + 19, 244, 64, 19, 244, 63, 19, 244, 62, 19, 244, 61, 19, 244, 60, 19, 244, + 59, 19, 244, 58, 19, 244, 57, 19, 244, 56, 19, 244, 55, 19, 244, 54, 19, + 244, 53, 19, 244, 52, 19, 244, 51, 19, 244, 50, 19, 244, 49, 19, 244, 48, + 19, 244, 47, 19, 244, 46, 19, 244, 45, 19, 244, 44, 19, 244, 43, 19, 244, + 42, 19, 244, 41, 19, 244, 40, 19, 244, 39, 19, 244, 38, 19, 244, 37, 19, + 244, 36, 19, 244, 35, 19, 244, 34, 19, 244, 33, 19, 244, 32, 19, 244, 31, + 19, 244, 30, 19, 244, 29, 19, 244, 28, 19, 244, 27, 19, 244, 26, 19, 244, + 25, 19, 244, 24, 19, 244, 23, 19, 244, 22, 19, 244, 21, 19, 244, 20, 19, + 244, 19, 19, 244, 18, 19, 244, 17, 19, 244, 16, 19, 244, 15, 19, 244, 14, + 19, 244, 13, 19, 244, 12, 19, 244, 11, 19, 244, 10, 19, 244, 9, 19, 244, + 8, 19, 244, 7, 19, 244, 6, 19, 244, 5, 19, 244, 4, 19, 244, 3, 19, 244, + 2, 19, 244, 1, 19, 244, 0, 19, 243, 255, 19, 243, 254, 19, 243, 253, 19, + 243, 252, 19, 243, 251, 19, 243, 250, 19, 243, 249, 19, 243, 248, 19, + 243, 247, 19, 243, 246, 19, 243, 245, 19, 243, 244, 19, 243, 243, 19, + 243, 242, 19, 243, 241, 19, 243, 240, 19, 243, 239, 19, 243, 238, 19, + 243, 237, 19, 243, 236, 19, 243, 235, 19, 243, 234, 19, 243, 233, 19, + 243, 232, 19, 243, 231, 19, 243, 230, 19, 243, 229, 19, 243, 228, 19, + 243, 227, 19, 243, 226, 19, 243, 225, 19, 243, 224, 19, 243, 223, 19, + 243, 222, 19, 243, 221, 19, 243, 220, 19, 243, 219, 19, 243, 218, 19, + 243, 217, 19, 243, 216, 19, 243, 215, 19, 243, 214, 19, 243, 213, 19, + 243, 212, 19, 243, 211, 19, 243, 210, 19, 243, 209, 19, 243, 208, 19, + 243, 207, 19, 243, 206, 19, 243, 205, 19, 243, 204, 19, 243, 203, 19, + 243, 202, 19, 243, 201, 19, 243, 200, 19, 243, 199, 19, 243, 198, 19, + 243, 197, 19, 243, 196, 19, 243, 195, 19, 243, 194, 19, 243, 193, 19, + 243, 192, 19, 243, 191, 19, 243, 190, 19, 243, 189, 19, 243, 188, 19, + 243, 187, 19, 243, 186, 19, 243, 185, 19, 243, 184, 19, 243, 183, 19, + 243, 182, 19, 243, 181, 19, 243, 180, 19, 243, 179, 19, 243, 178, 19, + 243, 177, 19, 243, 176, 19, 243, 175, 19, 243, 174, 19, 243, 173, 19, + 243, 172, 19, 243, 171, 19, 243, 170, 19, 243, 169, 19, 243, 168, 19, + 243, 167, 19, 243, 166, 19, 243, 165, 19, 243, 164, 19, 243, 163, 19, + 243, 162, 19, 243, 161, 19, 243, 160, 19, 243, 159, 19, 243, 158, 19, + 243, 157, 19, 243, 156, 19, 243, 155, 19, 243, 154, 19, 243, 153, 19, + 243, 152, 19, 243, 151, 19, 243, 150, 19, 243, 149, 19, 243, 148, 19, + 243, 147, 19, 243, 146, 19, 243, 145, 19, 243, 144, 19, 243, 143, 19, + 243, 142, 19, 243, 141, 19, 243, 140, 19, 243, 139, 19, 243, 138, 19, + 243, 137, 19, 243, 136, 19, 243, 135, 19, 243, 134, 19, 243, 133, 19, + 243, 132, 19, 243, 131, 19, 243, 130, 19, 243, 129, 19, 243, 128, 19, + 243, 127, 19, 243, 126, 19, 243, 125, 19, 243, 124, 19, 243, 123, 19, + 243, 122, 19, 243, 121, 19, 243, 120, 19, 243, 119, 19, 243, 118, 19, + 243, 117, 19, 243, 116, 19, 243, 115, 19, 243, 114, 19, 243, 113, 19, + 243, 112, 19, 243, 111, 19, 243, 110, 19, 243, 109, 19, 243, 108, 19, + 243, 107, 19, 243, 106, 19, 243, 105, 19, 243, 104, 19, 243, 103, 19, + 243, 102, 19, 243, 101, 19, 243, 100, 19, 243, 99, 19, 243, 98, 19, 243, + 97, 19, 243, 96, 19, 243, 95, 19, 243, 94, 19, 243, 93, 19, 243, 92, 19, + 243, 91, 19, 243, 90, 19, 243, 89, 19, 243, 88, 19, 243, 87, 19, 243, 86, + 19, 243, 85, 19, 243, 84, 19, 243, 83, 19, 243, 82, 19, 243, 81, 19, 243, + 80, 19, 243, 79, 19, 243, 78, 19, 243, 77, 19, 243, 76, 19, 243, 75, 19, + 243, 74, 19, 243, 73, 19, 243, 72, 19, 243, 71, 19, 243, 70, 19, 243, 69, + 19, 243, 68, 19, 243, 67, 19, 243, 66, 19, 243, 65, 19, 243, 64, 19, 243, + 63, 19, 243, 62, 19, 243, 61, 19, 243, 60, 19, 243, 59, 19, 243, 58, 19, + 243, 57, 19, 243, 56, 19, 243, 55, 19, 243, 54, 19, 243, 53, 19, 243, 52, + 19, 243, 51, 19, 243, 50, 19, 243, 49, 19, 243, 48, 19, 243, 47, 19, 243, + 46, 19, 243, 45, 19, 243, 44, 19, 243, 43, 19, 243, 42, 19, 243, 41, 19, + 243, 40, 19, 243, 39, 19, 243, 38, 19, 243, 37, 19, 243, 36, 19, 243, 35, + 19, 243, 34, 19, 243, 33, 19, 243, 32, 19, 243, 31, 19, 243, 30, 19, 243, + 29, 19, 243, 28, 19, 243, 27, 19, 243, 26, 19, 243, 25, 19, 243, 24, 19, + 243, 23, 19, 243, 22, 19, 243, 21, 19, 243, 20, 19, 243, 19, 19, 243, 18, + 19, 243, 17, 19, 243, 16, 19, 243, 15, 19, 243, 14, 19, 243, 13, 19, 243, + 12, 19, 243, 11, 19, 243, 10, 19, 243, 9, 19, 243, 8, 19, 243, 7, 19, + 243, 6, 19, 243, 5, 19, 243, 4, 19, 243, 3, 19, 243, 2, 19, 243, 1, 19, + 243, 0, 19, 242, 255, 19, 242, 254, 19, 242, 253, 19, 242, 252, 19, 242, + 251, 19, 242, 250, 19, 242, 249, 19, 242, 248, 19, 242, 247, 19, 242, + 246, 19, 242, 245, 19, 242, 244, 19, 242, 243, 19, 242, 242, 19, 242, + 241, 19, 242, 240, 19, 242, 239, 19, 242, 238, 19, 242, 237, 19, 242, + 236, 19, 242, 235, 19, 242, 234, 19, 242, 233, 19, 242, 232, 19, 242, + 231, 19, 242, 230, 19, 242, 229, 19, 242, 228, 19, 242, 227, 19, 242, + 226, 19, 242, 225, 19, 242, 224, 19, 242, 223, 19, 242, 222, 19, 242, + 221, 19, 242, 220, 19, 242, 219, 19, 242, 218, 19, 242, 217, 19, 242, + 216, 19, 242, 215, 19, 242, 214, 19, 242, 213, 19, 242, 212, 19, 242, + 211, 19, 242, 210, 19, 242, 209, 19, 242, 208, 19, 242, 207, 19, 242, + 206, 19, 242, 205, 19, 242, 204, 19, 242, 203, 19, 242, 202, 19, 242, + 201, 19, 242, 200, 19, 242, 199, 19, 242, 198, 19, 242, 197, 19, 242, + 196, 19, 242, 195, 19, 242, 194, 19, 242, 193, 19, 242, 192, 19, 242, + 191, 19, 242, 190, 19, 242, 189, 19, 242, 188, 19, 242, 187, 19, 242, + 186, 19, 242, 185, 19, 242, 184, 19, 242, 183, 19, 242, 182, 19, 242, + 181, 19, 242, 180, 19, 242, 179, 19, 242, 178, 19, 242, 177, 19, 242, + 176, 19, 242, 175, 19, 242, 174, 19, 242, 173, 19, 242, 172, 19, 242, + 171, 19, 242, 170, 19, 242, 169, 19, 242, 168, 19, 242, 167, 19, 242, + 166, 19, 242, 165, 19, 242, 164, 19, 242, 163, 19, 242, 162, 19, 242, + 161, 19, 242, 160, 19, 242, 159, 19, 242, 158, 19, 242, 157, 19, 242, + 156, 19, 242, 155, 19, 242, 154, 19, 242, 153, 19, 242, 152, 19, 242, + 151, 19, 242, 150, 19, 242, 149, 19, 242, 148, 19, 242, 147, 19, 242, + 146, 19, 242, 145, 19, 242, 144, 19, 242, 143, 19, 242, 142, 19, 242, + 141, 19, 242, 140, 19, 242, 139, 19, 242, 138, 19, 242, 137, 19, 242, + 136, 19, 242, 135, 19, 242, 134, 19, 242, 133, 19, 242, 132, 19, 242, + 131, 19, 242, 130, 19, 242, 129, 19, 242, 128, 19, 242, 127, 19, 242, + 126, 19, 242, 125, 19, 242, 124, 19, 242, 123, 19, 242, 122, 19, 242, + 121, 19, 242, 120, 19, 242, 119, 19, 242, 118, 19, 242, 117, 19, 242, + 116, 19, 242, 115, 19, 242, 114, 19, 242, 113, 19, 242, 112, 19, 242, + 111, 19, 242, 110, 19, 242, 109, 19, 242, 108, 19, 242, 107, 19, 242, + 106, 19, 242, 105, 19, 242, 104, 19, 242, 103, 19, 242, 102, 19, 242, + 101, 19, 242, 100, 19, 242, 99, 19, 242, 98, 19, 242, 97, 19, 242, 96, + 19, 242, 95, 19, 242, 94, 19, 242, 93, 19, 242, 92, 19, 242, 91, 19, 242, + 90, 19, 242, 89, 19, 242, 88, 19, 242, 87, 19, 242, 86, 19, 242, 85, 19, + 242, 84, 19, 242, 83, 19, 242, 82, 19, 242, 81, 19, 242, 80, 19, 242, 79, + 19, 242, 78, 19, 242, 77, 19, 242, 76, 19, 242, 75, 19, 242, 74, 19, 242, + 73, 19, 242, 72, 19, 242, 71, 19, 242, 70, 19, 242, 69, 19, 242, 68, 19, + 242, 67, 19, 242, 66, 19, 242, 65, 19, 242, 64, 19, 242, 63, 19, 242, 62, + 19, 242, 61, 19, 242, 60, 19, 242, 59, 19, 242, 58, 19, 242, 57, 19, 242, + 56, 19, 242, 55, 19, 242, 54, 19, 242, 53, 19, 242, 52, 19, 242, 51, 19, + 242, 50, 19, 242, 49, 19, 242, 48, 19, 242, 47, 19, 242, 46, 19, 242, 45, + 19, 242, 44, 19, 242, 43, 19, 242, 42, 19, 242, 41, 19, 242, 40, 19, 242, + 39, 19, 242, 38, 19, 242, 37, 19, 242, 36, 19, 242, 35, 19, 242, 34, 19, + 242, 33, 19, 242, 32, 19, 242, 31, 19, 242, 30, 19, 242, 29, 19, 242, 28, + 19, 242, 27, 19, 242, 26, 19, 242, 25, 19, 242, 24, 19, 242, 23, 19, 242, + 22, 19, 242, 21, 19, 242, 20, 19, 242, 19, 19, 242, 18, 19, 242, 17, 19, + 242, 16, 19, 242, 15, 19, 242, 14, 19, 242, 13, 19, 242, 12, 19, 242, 11, + 19, 242, 10, 19, 242, 9, 19, 242, 8, 19, 242, 7, 19, 242, 6, 19, 242, 5, + 19, 242, 4, 19, 242, 3, 19, 242, 2, 19, 242, 1, 19, 242, 0, 19, 241, 255, + 19, 241, 254, 19, 241, 253, 19, 241, 252, 19, 241, 251, 19, 241, 250, 19, + 241, 249, 19, 241, 248, 19, 241, 247, 19, 241, 246, 19, 241, 245, 19, + 241, 244, 19, 241, 243, 19, 241, 242, 19, 241, 241, 19, 241, 240, 19, + 241, 239, 19, 241, 238, 19, 241, 237, 19, 241, 236, 19, 241, 235, 19, + 241, 234, 19, 241, 233, 19, 241, 232, 19, 241, 231, 19, 241, 230, 19, + 241, 229, 19, 241, 228, 19, 241, 227, 19, 241, 226, 19, 241, 225, 19, + 241, 224, 19, 241, 223, 19, 241, 222, 19, 241, 221, 19, 241, 220, 19, + 241, 219, 19, 241, 218, 19, 241, 217, 19, 241, 216, 19, 241, 215, 19, + 241, 214, 19, 241, 213, 19, 241, 212, 19, 241, 211, 19, 241, 210, 19, + 241, 209, 19, 241, 208, 19, 241, 207, 19, 241, 206, 19, 241, 205, 19, + 241, 204, 19, 241, 203, 19, 241, 202, 19, 241, 201, 19, 241, 200, 19, + 241, 199, 19, 241, 198, 19, 241, 197, 19, 241, 196, 19, 241, 195, 19, + 241, 194, 19, 241, 193, 19, 241, 192, 19, 241, 191, 19, 241, 190, 19, + 241, 189, 19, 241, 188, 19, 241, 187, 19, 241, 186, 19, 241, 185, 19, + 241, 184, 19, 241, 183, 19, 241, 182, 19, 241, 181, 19, 241, 180, 19, + 241, 179, 19, 241, 178, 19, 241, 177, 19, 241, 176, 19, 241, 175, 19, + 241, 174, 19, 241, 173, 19, 241, 172, 19, 241, 171, 19, 241, 170, 19, + 241, 169, 19, 241, 168, 19, 241, 167, 19, 241, 166, 19, 241, 165, 19, + 241, 164, 19, 241, 163, 19, 241, 162, 71, 1, 250, 251, 69, 188, 1, 250, + 251, 196, 69, 56, 1, 255, 168, 56, 1, 255, 167, 56, 1, 255, 166, 56, 1, + 255, 162, 56, 1, 230, 248, 56, 1, 230, 247, 56, 1, 230, 246, 56, 1, 230, + 245, 56, 1, 200, 177, 56, 1, 200, 176, 56, 1, 200, 175, 56, 1, 200, 174, + 56, 1, 200, 173, 56, 1, 237, 134, 56, 1, 237, 133, 56, 1, 237, 132, 56, + 1, 237, 131, 56, 1, 237, 130, 56, 1, 215, 22, 56, 1, 215, 21, 56, 1, 215, + 20, 56, 1, 225, 69, 56, 1, 225, 66, 56, 1, 225, 65, 56, 1, 225, 64, 56, + 1, 225, 63, 56, 1, 225, 62, 56, 1, 225, 61, 56, 1, 225, 60, 56, 1, 225, + 59, 56, 1, 225, 68, 56, 1, 225, 67, 56, 1, 225, 58, 56, 1, 224, 100, 56, + 1, 224, 99, 56, 1, 224, 98, 56, 1, 224, 97, 56, 1, 224, 96, 56, 1, 224, + 95, 56, 1, 224, 94, 56, 1, 224, 93, 56, 1, 223, 186, 56, 1, 223, 185, 56, + 1, 223, 184, 56, 1, 223, 183, 56, 1, 223, 182, 56, 1, 223, 181, 56, 1, + 223, 180, 56, 1, 224, 208, 56, 1, 224, 207, 56, 1, 224, 206, 56, 1, 224, + 205, 56, 1, 224, 204, 56, 1, 224, 203, 56, 1, 224, 10, 56, 1, 224, 9, 56, + 1, 224, 8, 56, 1, 224, 7, 56, 1, 209, 22, 56, 1, 209, 21, 56, 1, 209, 20, 56, 1, 209, 19, 56, 1, 209, 18, 56, 1, 209, 17, 56, 1, 209, 16, 56, 1, 209, 15, 56, 1, 206, 111, 56, 1, 206, 110, 56, 1, 206, 109, 56, 1, 206, 108, 56, 1, 206, 107, 56, 1, 206, 106, 56, 1, 204, 171, 56, 1, 204, 170, @@ -16487,1418 +16491,1418 @@ static const unsigned char phrasebook[] = { 1, 203, 67, 56, 1, 203, 66, 56, 1, 203, 65, 56, 1, 203, 64, 56, 1, 203, 63, 56, 1, 203, 62, 56, 1, 203, 61, 56, 1, 203, 60, 56, 1, 203, 59, 56, 1, 202, 29, 56, 1, 202, 28, 56, 1, 202, 27, 56, 1, 202, 26, 56, 1, 202, - 25, 56, 1, 202, 24, 56, 1, 202, 23, 56, 1, 217, 255, 56, 1, 217, 254, 56, - 1, 217, 253, 56, 1, 217, 252, 56, 1, 217, 251, 56, 1, 217, 250, 56, 1, - 217, 249, 56, 1, 217, 248, 56, 1, 217, 247, 56, 1, 216, 221, 56, 1, 216, - 220, 56, 1, 216, 219, 56, 1, 216, 218, 56, 1, 216, 217, 56, 1, 216, 216, - 56, 1, 216, 215, 56, 1, 216, 214, 56, 1, 215, 184, 56, 1, 215, 183, 56, - 1, 215, 182, 56, 1, 217, 116, 56, 1, 217, 115, 56, 1, 217, 114, 56, 1, - 217, 113, 56, 1, 217, 112, 56, 1, 217, 111, 56, 1, 217, 110, 56, 1, 216, - 48, 56, 1, 216, 47, 56, 1, 216, 46, 56, 1, 216, 45, 56, 1, 216, 44, 56, - 1, 233, 2, 56, 1, 232, 255, 56, 1, 232, 254, 56, 1, 232, 253, 56, 1, 232, - 252, 56, 1, 232, 251, 56, 1, 232, 250, 56, 1, 232, 249, 56, 1, 232, 248, - 56, 1, 233, 1, 56, 1, 233, 0, 56, 1, 232, 69, 56, 1, 232, 68, 56, 1, 232, - 67, 56, 1, 232, 66, 56, 1, 232, 65, 56, 1, 232, 64, 56, 1, 232, 63, 56, - 1, 231, 73, 56, 1, 231, 72, 56, 1, 231, 71, 56, 1, 232, 145, 56, 1, 232, - 144, 56, 1, 232, 143, 56, 1, 232, 142, 56, 1, 232, 141, 56, 1, 232, 140, - 56, 1, 232, 139, 56, 1, 231, 191, 56, 1, 231, 190, 56, 1, 231, 189, 56, - 1, 231, 188, 56, 1, 231, 187, 56, 1, 231, 186, 56, 1, 231, 185, 56, 1, - 231, 184, 56, 1, 220, 126, 56, 1, 220, 125, 56, 1, 220, 124, 56, 1, 220, - 123, 56, 1, 220, 122, 56, 1, 220, 121, 56, 1, 220, 120, 56, 1, 219, 76, - 56, 1, 219, 75, 56, 1, 219, 74, 56, 1, 219, 73, 56, 1, 219, 72, 56, 1, - 219, 71, 56, 1, 219, 70, 56, 1, 218, 143, 56, 1, 218, 142, 56, 1, 218, - 141, 56, 1, 218, 140, 56, 1, 219, 205, 56, 1, 219, 204, 56, 1, 219, 203, - 56, 1, 218, 249, 56, 1, 218, 248, 56, 1, 218, 247, 56, 1, 218, 246, 56, - 1, 218, 245, 56, 1, 218, 244, 56, 1, 196, 137, 56, 1, 196, 136, 56, 1, + 25, 56, 1, 202, 24, 56, 1, 202, 23, 56, 1, 218, 0, 56, 1, 217, 255, 56, + 1, 217, 254, 56, 1, 217, 253, 56, 1, 217, 252, 56, 1, 217, 251, 56, 1, + 217, 250, 56, 1, 217, 249, 56, 1, 217, 248, 56, 1, 216, 222, 56, 1, 216, + 221, 56, 1, 216, 220, 56, 1, 216, 219, 56, 1, 216, 218, 56, 1, 216, 217, + 56, 1, 216, 216, 56, 1, 216, 215, 56, 1, 215, 185, 56, 1, 215, 184, 56, + 1, 215, 183, 56, 1, 217, 117, 56, 1, 217, 116, 56, 1, 217, 115, 56, 1, + 217, 114, 56, 1, 217, 113, 56, 1, 217, 112, 56, 1, 217, 111, 56, 1, 216, + 49, 56, 1, 216, 48, 56, 1, 216, 47, 56, 1, 216, 46, 56, 1, 216, 45, 56, + 1, 233, 3, 56, 1, 233, 0, 56, 1, 232, 255, 56, 1, 232, 254, 56, 1, 232, + 253, 56, 1, 232, 252, 56, 1, 232, 251, 56, 1, 232, 250, 56, 1, 232, 249, + 56, 1, 233, 2, 56, 1, 233, 1, 56, 1, 232, 70, 56, 1, 232, 69, 56, 1, 232, + 68, 56, 1, 232, 67, 56, 1, 232, 66, 56, 1, 232, 65, 56, 1, 232, 64, 56, + 1, 231, 74, 56, 1, 231, 73, 56, 1, 231, 72, 56, 1, 232, 146, 56, 1, 232, + 145, 56, 1, 232, 144, 56, 1, 232, 143, 56, 1, 232, 142, 56, 1, 232, 141, + 56, 1, 232, 140, 56, 1, 231, 192, 56, 1, 231, 191, 56, 1, 231, 190, 56, + 1, 231, 189, 56, 1, 231, 188, 56, 1, 231, 187, 56, 1, 231, 186, 56, 1, + 231, 185, 56, 1, 220, 127, 56, 1, 220, 126, 56, 1, 220, 125, 56, 1, 220, + 124, 56, 1, 220, 123, 56, 1, 220, 122, 56, 1, 220, 121, 56, 1, 219, 77, + 56, 1, 219, 76, 56, 1, 219, 75, 56, 1, 219, 74, 56, 1, 219, 73, 56, 1, + 219, 72, 56, 1, 219, 71, 56, 1, 218, 144, 56, 1, 218, 143, 56, 1, 218, + 142, 56, 1, 218, 141, 56, 1, 219, 206, 56, 1, 219, 205, 56, 1, 219, 204, + 56, 1, 218, 250, 56, 1, 218, 249, 56, 1, 218, 248, 56, 1, 218, 247, 56, + 1, 218, 246, 56, 1, 218, 245, 56, 1, 196, 137, 56, 1, 196, 136, 56, 1, 196, 135, 56, 1, 196, 134, 56, 1, 196, 133, 56, 1, 196, 130, 56, 1, 195, 216, 56, 1, 195, 215, 56, 1, 195, 214, 56, 1, 195, 213, 56, 1, 196, 2, 56, 1, 196, 1, 56, 1, 196, 0, 56, 1, 195, 255, 56, 1, 195, 254, 56, 1, - 195, 253, 56, 1, 210, 250, 56, 1, 210, 249, 56, 1, 210, 248, 56, 1, 210, - 247, 56, 1, 210, 71, 56, 1, 210, 70, 56, 1, 210, 69, 56, 1, 210, 68, 56, + 195, 253, 56, 1, 210, 251, 56, 1, 210, 250, 56, 1, 210, 249, 56, 1, 210, + 248, 56, 1, 210, 71, 56, 1, 210, 70, 56, 1, 210, 69, 56, 1, 210, 68, 56, 1, 210, 67, 56, 1, 210, 66, 56, 1, 210, 65, 56, 1, 209, 139, 56, 1, 209, 138, 56, 1, 209, 137, 56, 1, 209, 136, 56, 1, 209, 135, 56, 1, 209, 134, - 56, 1, 210, 181, 56, 1, 210, 180, 56, 1, 210, 179, 56, 1, 210, 178, 56, + 56, 1, 210, 182, 56, 1, 210, 181, 56, 1, 210, 180, 56, 1, 210, 179, 56, 1, 209, 231, 56, 1, 209, 230, 56, 1, 209, 229, 56, 1, 209, 228, 56, 1, 209, 227, 56, 1, 209, 226, 56, 1, 197, 165, 56, 1, 197, 164, 56, 1, 197, 163, 56, 1, 197, 162, 56, 1, 197, 161, 56, 1, 197, 69, 56, 1, 197, 68, 56, 1, 197, 67, 56, 1, 197, 66, 56, 1, 197, 65, 56, 1, 197, 108, 56, 1, 197, 107, 56, 1, 197, 106, 56, 1, 197, 105, 56, 1, 197, 33, 56, 1, 197, 32, 56, 1, 197, 31, 56, 1, 197, 30, 56, 1, 197, 29, 56, 1, 197, 28, 56, - 1, 197, 27, 56, 1, 218, 51, 56, 1, 218, 50, 188, 1, 4, 197, 70, 188, 1, + 1, 197, 27, 56, 1, 218, 52, 56, 1, 218, 51, 188, 1, 4, 197, 70, 188, 1, 4, 197, 109, 188, 1, 4, 197, 34, 71, 1, 4, 197, 70, 71, 1, 4, 197, 109, - 71, 1, 4, 197, 34, 71, 1, 4, 218, 54, 43, 246, 253, 43, 246, 252, 43, - 246, 251, 43, 246, 250, 43, 246, 249, 43, 246, 248, 43, 246, 247, 43, - 246, 246, 43, 246, 245, 43, 246, 244, 43, 246, 243, 43, 246, 242, 43, - 246, 241, 43, 246, 240, 43, 246, 239, 43, 246, 238, 43, 246, 237, 43, - 246, 236, 43, 246, 235, 43, 246, 234, 43, 246, 233, 43, 246, 232, 43, - 246, 231, 43, 246, 230, 43, 246, 229, 43, 246, 228, 43, 246, 227, 43, - 246, 226, 43, 246, 225, 43, 246, 224, 43, 246, 223, 43, 246, 222, 43, - 246, 221, 43, 246, 220, 43, 246, 219, 43, 246, 218, 43, 246, 217, 43, - 246, 216, 43, 246, 215, 43, 246, 214, 43, 246, 213, 43, 246, 212, 43, - 246, 211, 43, 246, 210, 43, 246, 209, 43, 246, 208, 43, 246, 207, 43, - 246, 206, 43, 246, 205, 43, 246, 204, 43, 246, 203, 43, 246, 202, 43, - 246, 201, 43, 246, 200, 43, 246, 199, 43, 246, 198, 43, 246, 197, 43, - 246, 196, 43, 246, 195, 43, 246, 194, 43, 246, 193, 43, 246, 192, 43, - 246, 191, 43, 246, 190, 43, 246, 189, 43, 246, 188, 43, 246, 187, 43, - 246, 186, 43, 246, 185, 43, 246, 184, 43, 246, 183, 43, 246, 182, 43, - 246, 181, 43, 246, 180, 43, 246, 179, 43, 246, 178, 43, 246, 177, 43, - 246, 176, 43, 246, 175, 43, 246, 174, 43, 246, 173, 43, 246, 172, 43, - 246, 171, 43, 246, 170, 43, 246, 169, 43, 246, 168, 43, 246, 167, 43, - 246, 166, 43, 246, 165, 43, 246, 164, 43, 246, 163, 43, 246, 162, 43, - 246, 161, 43, 246, 160, 43, 246, 159, 43, 246, 158, 43, 246, 157, 43, - 246, 156, 43, 246, 155, 43, 246, 154, 43, 246, 153, 43, 246, 152, 43, - 246, 151, 43, 246, 150, 43, 246, 149, 43, 246, 148, 43, 246, 147, 43, - 246, 146, 43, 246, 145, 43, 246, 144, 43, 246, 143, 43, 246, 142, 43, - 246, 141, 43, 246, 140, 43, 246, 139, 43, 246, 138, 43, 246, 137, 43, - 246, 136, 43, 246, 135, 43, 246, 134, 43, 246, 133, 43, 246, 132, 43, - 246, 131, 43, 246, 130, 43, 246, 129, 43, 246, 128, 43, 246, 127, 43, - 246, 126, 43, 246, 125, 43, 246, 124, 43, 246, 123, 43, 246, 122, 43, - 246, 121, 43, 246, 120, 43, 246, 119, 43, 246, 118, 43, 246, 117, 43, - 246, 116, 43, 246, 115, 43, 246, 114, 43, 246, 113, 43, 246, 112, 43, - 246, 111, 43, 246, 110, 43, 246, 109, 43, 246, 108, 43, 246, 107, 43, - 246, 106, 43, 246, 105, 43, 246, 104, 43, 246, 103, 43, 246, 102, 43, - 246, 101, 43, 246, 100, 43, 246, 99, 43, 246, 98, 43, 246, 97, 43, 246, - 96, 43, 246, 95, 43, 246, 94, 43, 246, 93, 43, 246, 92, 43, 246, 91, 43, - 246, 90, 43, 246, 89, 43, 246, 88, 43, 246, 87, 43, 246, 86, 43, 246, 85, - 43, 246, 84, 43, 246, 83, 43, 246, 82, 43, 246, 81, 43, 246, 80, 43, 246, - 79, 43, 246, 78, 43, 246, 77, 43, 246, 76, 43, 246, 75, 43, 246, 74, 43, - 246, 73, 43, 246, 72, 43, 246, 71, 43, 246, 70, 43, 246, 69, 43, 246, 68, - 43, 246, 67, 43, 246, 66, 43, 246, 65, 43, 246, 64, 43, 246, 63, 43, 246, - 62, 43, 246, 61, 43, 246, 60, 43, 246, 59, 43, 246, 58, 43, 246, 57, 43, - 246, 56, 43, 246, 55, 43, 246, 54, 43, 246, 53, 43, 246, 52, 43, 246, 51, - 43, 246, 50, 43, 246, 49, 43, 246, 48, 43, 246, 47, 43, 246, 46, 43, 246, - 45, 43, 246, 44, 43, 246, 43, 43, 246, 42, 43, 246, 41, 43, 246, 40, 43, - 246, 39, 43, 246, 38, 43, 246, 37, 43, 246, 36, 43, 246, 35, 43, 246, 34, - 43, 246, 33, 43, 246, 32, 43, 246, 31, 43, 246, 30, 43, 246, 29, 43, 246, - 28, 43, 246, 27, 43, 246, 26, 43, 246, 25, 43, 246, 24, 43, 246, 23, 43, - 246, 22, 43, 246, 21, 43, 246, 20, 43, 246, 19, 43, 246, 18, 43, 246, 17, - 43, 246, 16, 43, 246, 15, 43, 246, 14, 43, 246, 13, 43, 246, 12, 43, 246, - 11, 43, 246, 10, 43, 246, 9, 43, 246, 8, 43, 246, 7, 43, 246, 6, 43, 246, - 5, 43, 246, 4, 43, 246, 3, 43, 246, 2, 43, 246, 1, 43, 246, 0, 43, 245, - 255, 43, 245, 254, 43, 245, 253, 43, 245, 252, 43, 245, 251, 43, 245, - 250, 43, 245, 249, 43, 245, 248, 43, 245, 247, 43, 245, 246, 43, 245, - 245, 43, 245, 244, 43, 245, 243, 43, 245, 242, 43, 245, 241, 43, 245, - 240, 43, 245, 239, 43, 245, 238, 43, 245, 237, 43, 245, 236, 43, 245, - 235, 43, 245, 234, 43, 245, 233, 43, 245, 232, 43, 245, 231, 43, 245, - 230, 43, 245, 229, 43, 245, 228, 43, 245, 227, 43, 245, 226, 43, 245, - 225, 43, 245, 224, 43, 245, 223, 43, 245, 222, 43, 245, 221, 43, 245, - 220, 43, 245, 219, 43, 245, 218, 43, 245, 217, 43, 245, 216, 43, 245, - 215, 43, 245, 214, 43, 245, 213, 43, 245, 212, 43, 245, 211, 43, 245, - 210, 43, 245, 209, 43, 245, 208, 43, 245, 207, 43, 245, 206, 43, 245, - 205, 43, 245, 204, 43, 245, 203, 43, 245, 202, 43, 245, 201, 43, 245, - 200, 43, 245, 199, 43, 245, 198, 43, 245, 197, 43, 245, 196, 43, 245, - 195, 43, 245, 194, 43, 245, 193, 43, 245, 192, 43, 245, 191, 43, 245, - 190, 43, 245, 189, 43, 245, 188, 43, 245, 187, 43, 245, 186, 43, 245, - 185, 43, 245, 184, 43, 245, 183, 43, 245, 182, 43, 245, 181, 43, 245, - 180, 43, 245, 179, 43, 245, 178, 43, 245, 177, 43, 245, 176, 43, 245, - 175, 43, 245, 174, 43, 245, 173, 43, 245, 172, 43, 245, 171, 43, 245, - 170, 43, 245, 169, 43, 245, 168, 43, 245, 167, 43, 245, 166, 43, 245, - 165, 43, 245, 164, 43, 245, 163, 43, 245, 162, 43, 245, 161, 43, 245, - 160, 43, 245, 159, 43, 245, 158, 43, 245, 157, 43, 245, 156, 43, 245, - 155, 43, 245, 154, 43, 245, 153, 43, 245, 152, 43, 245, 151, 43, 245, - 150, 43, 245, 149, 43, 245, 148, 43, 245, 147, 43, 245, 146, 43, 245, - 145, 43, 245, 144, 43, 245, 143, 43, 245, 142, 43, 245, 141, 43, 245, - 140, 43, 245, 139, 43, 245, 138, 43, 245, 137, 43, 245, 136, 43, 245, - 135, 43, 245, 134, 43, 245, 133, 43, 245, 132, 43, 245, 131, 43, 245, - 130, 43, 245, 129, 43, 245, 128, 43, 245, 127, 43, 245, 126, 43, 245, - 125, 43, 245, 124, 43, 245, 123, 43, 245, 122, 43, 245, 121, 43, 245, - 120, 43, 245, 119, 43, 245, 118, 43, 245, 117, 43, 245, 116, 43, 245, - 115, 43, 245, 114, 114, 1, 233, 14, 114, 1, 196, 222, 114, 1, 214, 2, - 114, 1, 203, 216, 114, 1, 236, 48, 114, 1, 225, 79, 114, 1, 159, 114, 1, - 250, 111, 114, 1, 240, 230, 114, 1, 199, 230, 114, 1, 234, 189, 114, 1, - 144, 114, 1, 214, 3, 218, 54, 114, 1, 240, 231, 209, 80, 114, 1, 236, 49, - 218, 54, 114, 1, 225, 80, 221, 135, 114, 1, 211, 31, 209, 80, 114, 1, - 202, 235, 114, 1, 205, 234, 239, 176, 114, 1, 239, 176, 114, 1, 224, 36, - 114, 1, 205, 234, 225, 216, 114, 1, 232, 25, 114, 1, 222, 122, 114, 1, - 210, 78, 114, 1, 221, 135, 114, 1, 218, 54, 114, 1, 225, 216, 114, 1, - 209, 80, 114, 1, 221, 136, 218, 54, 114, 1, 218, 55, 221, 135, 114, 1, - 225, 217, 221, 135, 114, 1, 209, 81, 225, 216, 114, 1, 221, 136, 3, 238, - 252, 114, 1, 218, 55, 3, 238, 252, 114, 1, 225, 217, 3, 238, 252, 114, 1, - 225, 217, 3, 238, 250, 226, 41, 26, 57, 114, 1, 209, 81, 3, 238, 252, - 114, 1, 209, 81, 3, 76, 60, 114, 1, 221, 136, 209, 80, 114, 1, 218, 55, - 209, 80, 114, 1, 225, 217, 209, 80, 114, 1, 209, 81, 209, 80, 114, 1, - 221, 136, 218, 55, 209, 80, 114, 1, 218, 55, 221, 136, 209, 80, 114, 1, - 225, 217, 221, 136, 209, 80, 114, 1, 209, 81, 225, 217, 209, 80, 114, 1, - 225, 217, 209, 81, 3, 238, 252, 114, 1, 225, 217, 218, 54, 114, 1, 225, - 217, 218, 55, 209, 80, 114, 1, 209, 81, 203, 216, 114, 1, 209, 81, 203, - 217, 144, 114, 1, 209, 81, 214, 2, 114, 1, 209, 81, 214, 3, 144, 114, 1, - 203, 217, 209, 80, 114, 1, 203, 217, 211, 31, 209, 80, 114, 1, 197, 199, - 114, 1, 197, 81, 114, 1, 197, 200, 144, 114, 1, 209, 81, 218, 54, 114, 1, - 209, 81, 221, 135, 114, 1, 225, 80, 211, 31, 209, 80, 114, 1, 234, 190, - 211, 31, 209, 80, 114, 1, 209, 81, 225, 79, 114, 1, 209, 81, 225, 80, - 144, 114, 1, 63, 114, 1, 205, 234, 214, 15, 114, 1, 214, 189, 114, 1, 72, - 114, 1, 251, 46, 114, 1, 68, 114, 1, 69, 114, 1, 226, 146, 114, 1, 206, - 182, 68, 114, 1, 200, 90, 114, 1, 237, 53, 114, 1, 205, 234, 237, 39, - 114, 1, 209, 207, 68, 114, 1, 205, 234, 237, 53, 114, 1, 181, 68, 114, 1, - 196, 69, 114, 1, 66, 114, 1, 236, 115, 114, 1, 196, 171, 114, 1, 118, - 218, 54, 114, 1, 181, 66, 114, 1, 209, 207, 66, 114, 1, 200, 92, 114, 1, - 205, 234, 66, 114, 1, 214, 98, 114, 1, 214, 15, 114, 1, 214, 38, 114, 1, + 71, 1, 4, 197, 34, 71, 1, 4, 218, 55, 43, 246, 254, 43, 246, 253, 43, + 246, 252, 43, 246, 251, 43, 246, 250, 43, 246, 249, 43, 246, 248, 43, + 246, 247, 43, 246, 246, 43, 246, 245, 43, 246, 244, 43, 246, 243, 43, + 246, 242, 43, 246, 241, 43, 246, 240, 43, 246, 239, 43, 246, 238, 43, + 246, 237, 43, 246, 236, 43, 246, 235, 43, 246, 234, 43, 246, 233, 43, + 246, 232, 43, 246, 231, 43, 246, 230, 43, 246, 229, 43, 246, 228, 43, + 246, 227, 43, 246, 226, 43, 246, 225, 43, 246, 224, 43, 246, 223, 43, + 246, 222, 43, 246, 221, 43, 246, 220, 43, 246, 219, 43, 246, 218, 43, + 246, 217, 43, 246, 216, 43, 246, 215, 43, 246, 214, 43, 246, 213, 43, + 246, 212, 43, 246, 211, 43, 246, 210, 43, 246, 209, 43, 246, 208, 43, + 246, 207, 43, 246, 206, 43, 246, 205, 43, 246, 204, 43, 246, 203, 43, + 246, 202, 43, 246, 201, 43, 246, 200, 43, 246, 199, 43, 246, 198, 43, + 246, 197, 43, 246, 196, 43, 246, 195, 43, 246, 194, 43, 246, 193, 43, + 246, 192, 43, 246, 191, 43, 246, 190, 43, 246, 189, 43, 246, 188, 43, + 246, 187, 43, 246, 186, 43, 246, 185, 43, 246, 184, 43, 246, 183, 43, + 246, 182, 43, 246, 181, 43, 246, 180, 43, 246, 179, 43, 246, 178, 43, + 246, 177, 43, 246, 176, 43, 246, 175, 43, 246, 174, 43, 246, 173, 43, + 246, 172, 43, 246, 171, 43, 246, 170, 43, 246, 169, 43, 246, 168, 43, + 246, 167, 43, 246, 166, 43, 246, 165, 43, 246, 164, 43, 246, 163, 43, + 246, 162, 43, 246, 161, 43, 246, 160, 43, 246, 159, 43, 246, 158, 43, + 246, 157, 43, 246, 156, 43, 246, 155, 43, 246, 154, 43, 246, 153, 43, + 246, 152, 43, 246, 151, 43, 246, 150, 43, 246, 149, 43, 246, 148, 43, + 246, 147, 43, 246, 146, 43, 246, 145, 43, 246, 144, 43, 246, 143, 43, + 246, 142, 43, 246, 141, 43, 246, 140, 43, 246, 139, 43, 246, 138, 43, + 246, 137, 43, 246, 136, 43, 246, 135, 43, 246, 134, 43, 246, 133, 43, + 246, 132, 43, 246, 131, 43, 246, 130, 43, 246, 129, 43, 246, 128, 43, + 246, 127, 43, 246, 126, 43, 246, 125, 43, 246, 124, 43, 246, 123, 43, + 246, 122, 43, 246, 121, 43, 246, 120, 43, 246, 119, 43, 246, 118, 43, + 246, 117, 43, 246, 116, 43, 246, 115, 43, 246, 114, 43, 246, 113, 43, + 246, 112, 43, 246, 111, 43, 246, 110, 43, 246, 109, 43, 246, 108, 43, + 246, 107, 43, 246, 106, 43, 246, 105, 43, 246, 104, 43, 246, 103, 43, + 246, 102, 43, 246, 101, 43, 246, 100, 43, 246, 99, 43, 246, 98, 43, 246, + 97, 43, 246, 96, 43, 246, 95, 43, 246, 94, 43, 246, 93, 43, 246, 92, 43, + 246, 91, 43, 246, 90, 43, 246, 89, 43, 246, 88, 43, 246, 87, 43, 246, 86, + 43, 246, 85, 43, 246, 84, 43, 246, 83, 43, 246, 82, 43, 246, 81, 43, 246, + 80, 43, 246, 79, 43, 246, 78, 43, 246, 77, 43, 246, 76, 43, 246, 75, 43, + 246, 74, 43, 246, 73, 43, 246, 72, 43, 246, 71, 43, 246, 70, 43, 246, 69, + 43, 246, 68, 43, 246, 67, 43, 246, 66, 43, 246, 65, 43, 246, 64, 43, 246, + 63, 43, 246, 62, 43, 246, 61, 43, 246, 60, 43, 246, 59, 43, 246, 58, 43, + 246, 57, 43, 246, 56, 43, 246, 55, 43, 246, 54, 43, 246, 53, 43, 246, 52, + 43, 246, 51, 43, 246, 50, 43, 246, 49, 43, 246, 48, 43, 246, 47, 43, 246, + 46, 43, 246, 45, 43, 246, 44, 43, 246, 43, 43, 246, 42, 43, 246, 41, 43, + 246, 40, 43, 246, 39, 43, 246, 38, 43, 246, 37, 43, 246, 36, 43, 246, 35, + 43, 246, 34, 43, 246, 33, 43, 246, 32, 43, 246, 31, 43, 246, 30, 43, 246, + 29, 43, 246, 28, 43, 246, 27, 43, 246, 26, 43, 246, 25, 43, 246, 24, 43, + 246, 23, 43, 246, 22, 43, 246, 21, 43, 246, 20, 43, 246, 19, 43, 246, 18, + 43, 246, 17, 43, 246, 16, 43, 246, 15, 43, 246, 14, 43, 246, 13, 43, 246, + 12, 43, 246, 11, 43, 246, 10, 43, 246, 9, 43, 246, 8, 43, 246, 7, 43, + 246, 6, 43, 246, 5, 43, 246, 4, 43, 246, 3, 43, 246, 2, 43, 246, 1, 43, + 246, 0, 43, 245, 255, 43, 245, 254, 43, 245, 253, 43, 245, 252, 43, 245, + 251, 43, 245, 250, 43, 245, 249, 43, 245, 248, 43, 245, 247, 43, 245, + 246, 43, 245, 245, 43, 245, 244, 43, 245, 243, 43, 245, 242, 43, 245, + 241, 43, 245, 240, 43, 245, 239, 43, 245, 238, 43, 245, 237, 43, 245, + 236, 43, 245, 235, 43, 245, 234, 43, 245, 233, 43, 245, 232, 43, 245, + 231, 43, 245, 230, 43, 245, 229, 43, 245, 228, 43, 245, 227, 43, 245, + 226, 43, 245, 225, 43, 245, 224, 43, 245, 223, 43, 245, 222, 43, 245, + 221, 43, 245, 220, 43, 245, 219, 43, 245, 218, 43, 245, 217, 43, 245, + 216, 43, 245, 215, 43, 245, 214, 43, 245, 213, 43, 245, 212, 43, 245, + 211, 43, 245, 210, 43, 245, 209, 43, 245, 208, 43, 245, 207, 43, 245, + 206, 43, 245, 205, 43, 245, 204, 43, 245, 203, 43, 245, 202, 43, 245, + 201, 43, 245, 200, 43, 245, 199, 43, 245, 198, 43, 245, 197, 43, 245, + 196, 43, 245, 195, 43, 245, 194, 43, 245, 193, 43, 245, 192, 43, 245, + 191, 43, 245, 190, 43, 245, 189, 43, 245, 188, 43, 245, 187, 43, 245, + 186, 43, 245, 185, 43, 245, 184, 43, 245, 183, 43, 245, 182, 43, 245, + 181, 43, 245, 180, 43, 245, 179, 43, 245, 178, 43, 245, 177, 43, 245, + 176, 43, 245, 175, 43, 245, 174, 43, 245, 173, 43, 245, 172, 43, 245, + 171, 43, 245, 170, 43, 245, 169, 43, 245, 168, 43, 245, 167, 43, 245, + 166, 43, 245, 165, 43, 245, 164, 43, 245, 163, 43, 245, 162, 43, 245, + 161, 43, 245, 160, 43, 245, 159, 43, 245, 158, 43, 245, 157, 43, 245, + 156, 43, 245, 155, 43, 245, 154, 43, 245, 153, 43, 245, 152, 43, 245, + 151, 43, 245, 150, 43, 245, 149, 43, 245, 148, 43, 245, 147, 43, 245, + 146, 43, 245, 145, 43, 245, 144, 43, 245, 143, 43, 245, 142, 43, 245, + 141, 43, 245, 140, 43, 245, 139, 43, 245, 138, 43, 245, 137, 43, 245, + 136, 43, 245, 135, 43, 245, 134, 43, 245, 133, 43, 245, 132, 43, 245, + 131, 43, 245, 130, 43, 245, 129, 43, 245, 128, 43, 245, 127, 43, 245, + 126, 43, 245, 125, 43, 245, 124, 43, 245, 123, 43, 245, 122, 43, 245, + 121, 43, 245, 120, 43, 245, 119, 43, 245, 118, 43, 245, 117, 43, 245, + 116, 43, 245, 115, 114, 1, 233, 15, 114, 1, 196, 222, 114, 1, 214, 3, + 114, 1, 203, 216, 114, 1, 236, 49, 114, 1, 225, 80, 114, 1, 159, 114, 1, + 250, 112, 114, 1, 240, 231, 114, 1, 199, 230, 114, 1, 234, 190, 114, 1, + 144, 114, 1, 214, 4, 218, 55, 114, 1, 240, 232, 209, 80, 114, 1, 236, 50, + 218, 55, 114, 1, 225, 81, 221, 136, 114, 1, 211, 32, 209, 80, 114, 1, + 202, 235, 114, 1, 205, 234, 239, 177, 114, 1, 239, 177, 114, 1, 224, 37, + 114, 1, 205, 234, 225, 217, 114, 1, 232, 26, 114, 1, 222, 123, 114, 1, + 210, 78, 114, 1, 221, 136, 114, 1, 218, 55, 114, 1, 225, 217, 114, 1, + 209, 80, 114, 1, 221, 137, 218, 55, 114, 1, 218, 56, 221, 136, 114, 1, + 225, 218, 221, 136, 114, 1, 209, 81, 225, 217, 114, 1, 221, 137, 3, 238, + 253, 114, 1, 218, 56, 3, 238, 253, 114, 1, 225, 218, 3, 238, 253, 114, 1, + 225, 218, 3, 238, 251, 226, 42, 26, 57, 114, 1, 209, 81, 3, 238, 253, + 114, 1, 209, 81, 3, 76, 60, 114, 1, 221, 137, 209, 80, 114, 1, 218, 56, + 209, 80, 114, 1, 225, 218, 209, 80, 114, 1, 209, 81, 209, 80, 114, 1, + 221, 137, 218, 56, 209, 80, 114, 1, 218, 56, 221, 137, 209, 80, 114, 1, + 225, 218, 221, 137, 209, 80, 114, 1, 209, 81, 225, 218, 209, 80, 114, 1, + 225, 218, 209, 81, 3, 238, 253, 114, 1, 225, 218, 218, 55, 114, 1, 225, + 218, 218, 56, 209, 80, 114, 1, 209, 81, 203, 216, 114, 1, 209, 81, 203, + 217, 144, 114, 1, 209, 81, 214, 3, 114, 1, 209, 81, 214, 4, 144, 114, 1, + 203, 217, 209, 80, 114, 1, 203, 217, 211, 32, 209, 80, 114, 1, 197, 199, + 114, 1, 197, 81, 114, 1, 197, 200, 144, 114, 1, 209, 81, 218, 55, 114, 1, + 209, 81, 221, 136, 114, 1, 225, 81, 211, 32, 209, 80, 114, 1, 234, 191, + 211, 32, 209, 80, 114, 1, 209, 81, 225, 80, 114, 1, 209, 81, 225, 81, + 144, 114, 1, 63, 114, 1, 205, 234, 214, 16, 114, 1, 214, 190, 114, 1, 72, + 114, 1, 251, 47, 114, 1, 68, 114, 1, 69, 114, 1, 226, 147, 114, 1, 206, + 182, 68, 114, 1, 200, 90, 114, 1, 237, 54, 114, 1, 205, 234, 237, 40, + 114, 1, 209, 207, 68, 114, 1, 205, 234, 237, 54, 114, 1, 181, 68, 114, 1, + 196, 69, 114, 1, 66, 114, 1, 236, 116, 114, 1, 196, 171, 114, 1, 118, + 218, 55, 114, 1, 181, 66, 114, 1, 209, 207, 66, 114, 1, 200, 92, 114, 1, + 205, 234, 66, 114, 1, 214, 99, 114, 1, 214, 16, 114, 1, 214, 39, 114, 1, 197, 166, 114, 1, 197, 34, 114, 1, 197, 70, 114, 1, 197, 96, 114, 1, 197, - 1, 114, 1, 217, 208, 66, 114, 1, 217, 208, 72, 114, 1, 217, 208, 68, 114, - 1, 217, 208, 63, 114, 1, 213, 33, 251, 105, 114, 1, 213, 33, 251, 122, - 114, 1, 205, 234, 236, 229, 114, 1, 205, 234, 251, 105, 114, 1, 205, 234, - 214, 118, 114, 1, 110, 221, 135, 114, 251, 223, 50, 231, 154, 208, 137, - 114, 251, 223, 219, 64, 231, 154, 208, 137, 114, 251, 223, 53, 231, 154, - 208, 137, 114, 251, 223, 126, 83, 208, 137, 114, 251, 223, 219, 64, 83, - 208, 137, 114, 251, 223, 130, 83, 208, 137, 114, 251, 223, 250, 155, 208, - 137, 114, 251, 223, 250, 155, 222, 174, 208, 137, 114, 251, 223, 250, - 155, 203, 109, 114, 251, 223, 250, 155, 203, 135, 114, 251, 223, 250, - 155, 237, 135, 122, 114, 251, 223, 250, 155, 230, 248, 122, 114, 251, - 223, 250, 155, 203, 110, 122, 114, 251, 223, 130, 186, 114, 251, 223, - 130, 202, 101, 186, 114, 251, 223, 130, 233, 99, 114, 251, 223, 130, 181, - 233, 99, 114, 251, 223, 130, 238, 252, 114, 251, 223, 130, 244, 248, 114, - 251, 223, 130, 222, 74, 114, 251, 223, 130, 197, 122, 114, 251, 223, 130, - 199, 100, 114, 251, 223, 126, 186, 114, 251, 223, 126, 202, 101, 186, - 114, 251, 223, 126, 233, 99, 114, 251, 223, 126, 181, 233, 99, 114, 251, - 223, 126, 238, 252, 114, 251, 223, 126, 244, 248, 114, 251, 223, 126, - 222, 74, 114, 251, 223, 126, 197, 122, 114, 251, 223, 126, 199, 100, 114, - 251, 223, 126, 51, 114, 2, 177, 3, 241, 60, 114, 202, 193, 1, 208, 114, - 114, 52, 78, 114, 211, 213, 245, 58, 234, 216, 204, 226, 206, 169, 235, - 22, 1, 214, 22, 206, 169, 235, 22, 241, 126, 214, 22, 206, 169, 235, 22, - 135, 204, 241, 206, 169, 235, 22, 124, 204, 241, 67, 34, 16, 211, 230, - 67, 34, 16, 240, 66, 67, 34, 16, 213, 37, 67, 34, 16, 214, 11, 237, 10, - 67, 34, 16, 214, 11, 239, 89, 67, 34, 16, 199, 136, 237, 10, 67, 34, 16, - 199, 136, 239, 89, 67, 34, 16, 224, 229, 67, 34, 16, 203, 233, 67, 34, - 16, 213, 146, 67, 34, 16, 195, 223, 67, 34, 16, 195, 224, 239, 89, 67, - 34, 16, 223, 204, 67, 34, 16, 251, 41, 237, 10, 67, 34, 16, 236, 83, 237, - 10, 67, 34, 16, 203, 35, 67, 34, 16, 224, 177, 67, 34, 16, 251, 30, 67, - 34, 16, 251, 31, 239, 89, 67, 34, 16, 203, 240, 67, 34, 16, 202, 172, 67, - 34, 16, 214, 129, 250, 248, 67, 34, 16, 233, 126, 250, 248, 67, 34, 16, - 211, 229, 67, 34, 16, 247, 6, 67, 34, 16, 199, 125, 67, 34, 16, 225, 238, - 250, 248, 67, 34, 16, 224, 179, 250, 248, 67, 34, 16, 224, 178, 250, 248, - 67, 34, 16, 208, 182, 67, 34, 16, 213, 136, 67, 34, 16, 204, 251, 251, - 34, 67, 34, 16, 214, 10, 250, 248, 67, 34, 16, 199, 135, 250, 248, 67, - 34, 16, 251, 35, 250, 248, 67, 34, 16, 251, 28, 67, 34, 16, 224, 26, 67, - 34, 16, 210, 85, 67, 34, 16, 212, 217, 250, 248, 67, 34, 16, 202, 74, 67, - 34, 16, 251, 102, 67, 34, 16, 208, 117, 67, 34, 16, 203, 244, 250, 248, - 67, 34, 16, 203, 244, 219, 143, 204, 249, 67, 34, 16, 214, 5, 250, 248, - 67, 34, 16, 202, 211, 67, 34, 16, 222, 161, 67, 34, 16, 237, 158, 67, 34, - 16, 201, 182, 67, 34, 16, 203, 4, 67, 34, 16, 223, 207, 67, 34, 16, 251, - 41, 236, 83, 217, 96, 67, 34, 16, 234, 224, 250, 248, 67, 34, 16, 226, - 98, 67, 34, 16, 201, 151, 250, 248, 67, 34, 16, 224, 232, 201, 150, 67, - 34, 16, 213, 66, 67, 34, 16, 211, 234, 67, 34, 16, 223, 242, 67, 34, 16, - 245, 41, 250, 248, 67, 34, 16, 210, 202, 67, 34, 16, 213, 149, 250, 248, - 67, 34, 16, 213, 147, 250, 248, 67, 34, 16, 230, 198, 67, 34, 16, 217, - 219, 67, 34, 16, 213, 15, 67, 34, 16, 223, 243, 251, 140, 67, 34, 16, - 201, 151, 251, 140, 67, 34, 16, 204, 220, 67, 34, 16, 233, 85, 67, 34, - 16, 225, 238, 217, 96, 67, 34, 16, 214, 129, 217, 96, 67, 34, 16, 214, - 11, 217, 96, 67, 34, 16, 213, 14, 67, 34, 16, 223, 227, 67, 34, 16, 213, - 13, 67, 34, 16, 223, 206, 67, 34, 16, 213, 67, 217, 96, 67, 34, 16, 224, - 178, 217, 97, 251, 72, 67, 34, 16, 224, 179, 217, 97, 251, 72, 67, 34, - 16, 195, 221, 67, 34, 16, 251, 31, 217, 96, 67, 34, 16, 251, 32, 203, - 241, 217, 96, 67, 34, 16, 195, 222, 67, 34, 16, 223, 205, 67, 34, 16, - 237, 5, 67, 34, 16, 247, 7, 67, 34, 16, 219, 35, 225, 237, 67, 34, 16, - 199, 136, 217, 96, 67, 34, 16, 212, 217, 217, 96, 67, 34, 16, 211, 235, - 217, 96, 67, 34, 16, 214, 125, 67, 34, 16, 251, 59, 67, 34, 16, 221, 146, - 67, 34, 16, 213, 147, 217, 96, 67, 34, 16, 213, 149, 217, 96, 67, 34, 16, - 236, 121, 213, 148, 67, 34, 16, 223, 103, 67, 34, 16, 251, 60, 67, 34, - 16, 201, 151, 217, 96, 67, 34, 16, 237, 8, 67, 34, 16, 203, 244, 217, 96, - 67, 34, 16, 203, 234, 67, 34, 16, 245, 41, 217, 96, 67, 34, 16, 236, 179, - 67, 34, 16, 208, 118, 217, 96, 67, 34, 16, 196, 188, 224, 26, 67, 34, 16, - 201, 148, 67, 34, 16, 211, 236, 67, 34, 16, 201, 152, 67, 34, 16, 201, - 149, 67, 34, 16, 211, 233, 67, 34, 16, 201, 147, 67, 34, 16, 211, 232, - 67, 34, 16, 233, 125, 67, 34, 16, 250, 240, 67, 34, 16, 236, 121, 250, - 240, 67, 34, 16, 214, 5, 217, 96, 67, 34, 16, 202, 210, 236, 134, 67, 34, - 16, 202, 210, 236, 82, 67, 34, 16, 202, 212, 251, 36, 67, 34, 16, 202, - 204, 225, 31, 251, 27, 67, 34, 16, 224, 231, 67, 34, 16, 236, 216, 67, - 34, 16, 196, 28, 224, 228, 67, 34, 16, 196, 28, 251, 72, 67, 34, 16, 204, - 250, 67, 34, 16, 224, 27, 251, 72, 67, 34, 16, 239, 90, 250, 248, 67, 34, - 16, 223, 208, 250, 248, 67, 34, 16, 223, 208, 251, 140, 67, 34, 16, 223, - 208, 217, 96, 67, 34, 16, 251, 35, 217, 96, 67, 34, 16, 251, 37, 67, 34, - 16, 239, 89, 67, 34, 16, 201, 163, 67, 34, 16, 202, 250, 67, 34, 16, 223, - 231, 67, 34, 16, 222, 166, 236, 209, 245, 31, 67, 34, 16, 222, 166, 237, - 159, 245, 32, 67, 34, 16, 222, 166, 201, 166, 245, 32, 67, 34, 16, 222, - 166, 203, 6, 245, 32, 67, 34, 16, 222, 166, 226, 93, 245, 31, 67, 34, 16, - 233, 126, 217, 97, 251, 72, 67, 34, 16, 233, 126, 213, 137, 250, 236, 67, - 34, 16, 233, 126, 213, 137, 239, 180, 67, 34, 16, 239, 114, 67, 34, 16, - 239, 115, 213, 137, 250, 237, 224, 228, 67, 34, 16, 239, 115, 213, 137, - 250, 237, 251, 72, 67, 34, 16, 239, 115, 213, 137, 239, 180, 67, 34, 16, - 201, 171, 67, 34, 16, 250, 241, 67, 34, 16, 226, 100, 67, 34, 16, 239, - 137, 67, 34, 16, 251, 210, 212, 99, 250, 242, 67, 34, 16, 251, 210, 250, - 239, 67, 34, 16, 251, 210, 250, 242, 67, 34, 16, 251, 210, 219, 137, 67, - 34, 16, 251, 210, 219, 148, 67, 34, 16, 251, 210, 233, 127, 67, 34, 16, - 251, 210, 233, 124, 67, 34, 16, 251, 210, 212, 99, 233, 127, 67, 34, 16, - 220, 17, 211, 242, 230, 196, 67, 34, 16, 220, 17, 251, 142, 211, 242, - 230, 196, 67, 34, 16, 220, 17, 239, 179, 230, 196, 67, 34, 16, 220, 17, - 251, 142, 239, 179, 230, 196, 67, 34, 16, 220, 17, 201, 158, 230, 196, - 67, 34, 16, 220, 17, 201, 172, 67, 34, 16, 220, 17, 202, 255, 230, 196, - 67, 34, 16, 220, 17, 202, 255, 222, 170, 230, 196, 67, 34, 16, 220, 17, - 222, 170, 230, 196, 67, 34, 16, 220, 17, 212, 145, 230, 196, 67, 34, 16, - 225, 245, 203, 28, 230, 197, 67, 34, 16, 251, 32, 203, 28, 230, 197, 67, - 34, 16, 235, 208, 202, 252, 67, 34, 16, 235, 208, 218, 205, 67, 34, 16, - 235, 208, 239, 120, 67, 34, 16, 220, 17, 199, 129, 230, 196, 67, 34, 16, - 220, 17, 211, 241, 230, 196, 67, 34, 16, 220, 17, 212, 145, 202, 255, - 230, 196, 67, 34, 16, 233, 121, 218, 55, 251, 36, 67, 34, 16, 233, 121, - 218, 55, 239, 88, 67, 34, 16, 236, 227, 225, 31, 234, 224, 198, 228, 67, - 34, 16, 226, 99, 67, 34, 16, 226, 97, 67, 34, 16, 234, 224, 250, 249, - 239, 178, 230, 195, 67, 34, 16, 234, 224, 239, 135, 161, 67, 34, 16, 234, - 224, 239, 135, 217, 219, 67, 34, 16, 234, 224, 217, 213, 230, 196, 67, - 34, 16, 234, 224, 239, 135, 239, 151, 67, 34, 16, 234, 224, 206, 0, 239, - 134, 239, 151, 67, 34, 16, 234, 224, 239, 135, 224, 208, 67, 34, 16, 234, - 224, 239, 135, 195, 11, 67, 34, 16, 234, 224, 239, 135, 216, 223, 224, - 228, 67, 34, 16, 234, 224, 239, 135, 216, 223, 251, 72, 67, 34, 16, 234, - 224, 220, 67, 245, 33, 239, 120, 67, 34, 16, 234, 224, 220, 67, 245, 33, - 218, 205, 67, 34, 16, 235, 153, 206, 0, 245, 33, 199, 128, 67, 34, 16, - 234, 224, 206, 0, 245, 33, 203, 245, 67, 34, 16, 234, 224, 217, 99, 67, - 34, 16, 245, 34, 194, 234, 67, 34, 16, 245, 34, 224, 25, 67, 34, 16, 245, - 34, 205, 139, 67, 34, 16, 234, 224, 230, 248, 196, 27, 203, 0, 67, 34, - 16, 234, 224, 236, 228, 251, 61, 67, 34, 16, 196, 27, 201, 159, 67, 34, - 16, 239, 128, 201, 159, 67, 34, 16, 239, 128, 203, 0, 67, 34, 16, 239, - 128, 251, 38, 237, 159, 239, 19, 67, 34, 16, 239, 128, 218, 203, 203, 5, - 239, 19, 67, 34, 16, 239, 128, 239, 111, 236, 95, 239, 19, 67, 34, 16, - 239, 128, 201, 169, 214, 135, 239, 19, 67, 34, 16, 196, 27, 251, 38, 237, - 159, 239, 19, 67, 34, 16, 196, 27, 218, 203, 203, 5, 239, 19, 67, 34, 16, - 196, 27, 239, 111, 236, 95, 239, 19, 67, 34, 16, 196, 27, 201, 169, 214, - 135, 239, 19, 67, 34, 16, 234, 29, 239, 127, 67, 34, 16, 234, 29, 196, - 26, 67, 34, 16, 239, 136, 251, 38, 219, 36, 67, 34, 16, 239, 136, 251, - 38, 219, 178, 67, 34, 16, 239, 136, 239, 89, 67, 34, 16, 239, 136, 202, - 202, 67, 34, 16, 206, 72, 202, 202, 67, 34, 16, 206, 72, 202, 203, 239, - 73, 67, 34, 16, 206, 72, 202, 203, 201, 160, 67, 34, 16, 206, 72, 202, - 203, 202, 248, 67, 34, 16, 206, 72, 250, 210, 67, 34, 16, 206, 72, 250, - 211, 239, 73, 67, 34, 16, 206, 72, 250, 211, 201, 160, 67, 34, 16, 206, - 72, 250, 211, 202, 248, 67, 34, 16, 239, 112, 234, 10, 67, 34, 16, 239, - 119, 214, 38, 67, 34, 16, 204, 236, 67, 34, 16, 250, 233, 161, 67, 34, - 16, 250, 233, 198, 228, 67, 34, 16, 250, 233, 234, 122, 67, 34, 16, 250, - 233, 239, 151, 67, 34, 16, 250, 233, 224, 208, 67, 34, 16, 250, 233, 195, - 11, 67, 34, 16, 250, 233, 216, 222, 67, 34, 16, 224, 178, 217, 97, 219, - 147, 67, 34, 16, 224, 179, 217, 97, 219, 147, 67, 34, 16, 224, 178, 217, - 97, 224, 228, 67, 34, 16, 224, 179, 217, 97, 224, 228, 67, 34, 16, 224, - 27, 224, 228, 67, 34, 16, 233, 126, 217, 97, 224, 228, 34, 16, 206, 62, - 249, 74, 34, 16, 52, 249, 74, 34, 16, 48, 249, 74, 34, 16, 210, 90, 48, - 249, 74, 34, 16, 240, 63, 249, 74, 34, 16, 206, 182, 249, 74, 34, 16, 50, - 210, 120, 55, 34, 16, 53, 210, 120, 55, 34, 16, 210, 120, 238, 249, 34, - 16, 240, 107, 208, 121, 34, 16, 240, 136, 247, 121, 34, 16, 208, 121, 34, - 16, 244, 175, 34, 16, 210, 118, 235, 141, 34, 16, 210, 118, 235, 140, 34, - 16, 210, 118, 235, 139, 34, 16, 235, 163, 34, 16, 235, 164, 60, 34, 16, - 248, 48, 78, 34, 16, 247, 163, 34, 16, 248, 62, 34, 16, 179, 34, 16, 214, - 113, 205, 16, 34, 16, 200, 214, 205, 16, 34, 16, 202, 149, 205, 16, 34, - 16, 235, 5, 205, 16, 34, 16, 235, 99, 205, 16, 34, 16, 206, 28, 205, 16, - 34, 16, 206, 26, 234, 241, 34, 16, 235, 3, 234, 241, 34, 16, 234, 190, - 244, 217, 34, 16, 234, 190, 244, 218, 214, 42, 251, 131, 34, 16, 234, - 190, 244, 218, 214, 42, 249, 57, 34, 16, 247, 207, 244, 217, 34, 16, 236, - 49, 244, 217, 34, 16, 236, 49, 244, 218, 214, 42, 251, 131, 34, 16, 236, - 49, 244, 218, 214, 42, 249, 57, 34, 16, 237, 206, 244, 216, 34, 16, 237, - 206, 244, 215, 34, 16, 218, 119, 219, 202, 210, 101, 34, 16, 52, 207, 12, - 34, 16, 52, 235, 81, 34, 16, 235, 82, 200, 36, 34, 16, 235, 82, 237, 234, - 34, 16, 217, 202, 200, 36, 34, 16, 217, 202, 237, 234, 34, 16, 207, 13, - 200, 36, 34, 16, 207, 13, 237, 234, 34, 16, 211, 87, 152, 207, 12, 34, - 16, 211, 87, 152, 235, 81, 34, 16, 244, 155, 202, 78, 34, 16, 241, 1, - 202, 78, 34, 16, 214, 42, 251, 131, 34, 16, 214, 42, 249, 57, 34, 16, - 211, 68, 251, 131, 34, 16, 211, 68, 249, 57, 34, 16, 218, 122, 210, 101, - 34, 16, 197, 71, 210, 101, 34, 16, 157, 210, 101, 34, 16, 211, 87, 210, - 101, 34, 16, 237, 26, 210, 101, 34, 16, 206, 22, 210, 101, 34, 16, 202, - 174, 210, 101, 34, 16, 206, 12, 210, 101, 34, 16, 97, 231, 57, 200, 232, - 210, 101, 34, 16, 196, 223, 216, 8, 34, 16, 98, 216, 8, 34, 16, 244, 249, - 196, 223, 216, 8, 34, 16, 47, 216, 9, 197, 73, 34, 16, 47, 216, 9, 248, - 135, 34, 16, 201, 181, 216, 9, 124, 197, 73, 34, 16, 201, 181, 216, 9, - 124, 248, 135, 34, 16, 201, 181, 216, 9, 50, 197, 73, 34, 16, 201, 181, - 216, 9, 50, 248, 135, 34, 16, 201, 181, 216, 9, 53, 197, 73, 34, 16, 201, - 181, 216, 9, 53, 248, 135, 34, 16, 201, 181, 216, 9, 135, 197, 73, 34, - 16, 201, 181, 216, 9, 135, 248, 135, 34, 16, 201, 181, 216, 9, 124, 53, - 197, 73, 34, 16, 201, 181, 216, 9, 124, 53, 248, 135, 34, 16, 218, 189, - 216, 9, 197, 73, 34, 16, 218, 189, 216, 9, 248, 135, 34, 16, 201, 178, - 216, 9, 135, 197, 73, 34, 16, 201, 178, 216, 9, 135, 248, 135, 34, 16, - 213, 140, 216, 8, 34, 16, 198, 241, 216, 8, 34, 16, 216, 9, 248, 135, 34, - 16, 215, 146, 216, 8, 34, 16, 244, 186, 216, 9, 197, 73, 34, 16, 244, - 186, 216, 9, 248, 135, 34, 16, 248, 46, 34, 16, 197, 71, 216, 12, 34, 16, - 157, 216, 12, 34, 16, 211, 87, 216, 12, 34, 16, 237, 26, 216, 12, 34, 16, - 206, 22, 216, 12, 34, 16, 202, 174, 216, 12, 34, 16, 206, 12, 216, 12, - 34, 16, 97, 231, 57, 200, 232, 216, 12, 34, 16, 38, 204, 243, 34, 16, 38, - 205, 101, 204, 243, 34, 16, 38, 201, 189, 34, 16, 38, 201, 188, 34, 16, - 38, 201, 187, 34, 16, 235, 124, 201, 189, 34, 16, 235, 124, 201, 188, 34, - 16, 235, 124, 201, 187, 34, 16, 38, 250, 146, 238, 252, 34, 16, 38, 235, - 91, 34, 16, 38, 235, 90, 34, 16, 38, 235, 89, 34, 16, 38, 235, 88, 34, - 16, 38, 235, 87, 34, 16, 248, 242, 249, 5, 34, 16, 236, 221, 249, 5, 34, - 16, 248, 242, 202, 107, 34, 16, 236, 221, 202, 107, 34, 16, 248, 242, - 205, 225, 34, 16, 236, 221, 205, 225, 34, 16, 248, 242, 212, 226, 34, 16, - 236, 221, 212, 226, 34, 16, 38, 252, 21, 34, 16, 38, 205, 20, 34, 16, 38, - 203, 11, 34, 16, 38, 205, 21, 34, 16, 38, 220, 32, 34, 16, 38, 220, 31, - 34, 16, 38, 252, 20, 34, 16, 38, 221, 209, 34, 16, 250, 222, 200, 36, 34, - 16, 250, 222, 237, 234, 34, 16, 38, 239, 12, 34, 16, 38, 209, 254, 34, - 16, 38, 235, 70, 34, 16, 38, 205, 221, 34, 16, 38, 248, 220, 34, 16, 38, - 52, 201, 249, 34, 16, 38, 201, 165, 201, 249, 34, 16, 210, 4, 34, 16, - 204, 154, 34, 16, 195, 158, 34, 16, 212, 218, 34, 16, 219, 128, 34, 16, - 235, 17, 34, 16, 241, 72, 34, 16, 239, 237, 34, 16, 233, 116, 216, 13, - 205, 248, 34, 16, 233, 116, 216, 13, 216, 50, 205, 248, 34, 16, 201, 218, - 34, 16, 201, 4, 34, 16, 226, 16, 201, 4, 34, 16, 201, 5, 205, 248, 34, - 16, 201, 5, 200, 36, 34, 16, 214, 59, 204, 195, 34, 16, 214, 59, 204, - 192, 34, 16, 214, 59, 204, 191, 34, 16, 214, 59, 204, 190, 34, 16, 214, - 59, 204, 189, 34, 16, 214, 59, 204, 188, 34, 16, 214, 59, 204, 187, 34, - 16, 214, 59, 204, 186, 34, 16, 214, 59, 204, 185, 34, 16, 214, 59, 204, - 194, 34, 16, 214, 59, 204, 193, 34, 16, 232, 156, 34, 16, 217, 109, 34, - 16, 236, 221, 77, 204, 232, 34, 16, 239, 230, 205, 248, 34, 16, 38, 135, - 248, 76, 34, 16, 38, 124, 248, 76, 34, 16, 38, 232, 169, 34, 16, 38, 205, - 211, 212, 150, 34, 16, 213, 83, 78, 34, 16, 213, 83, 124, 78, 34, 16, - 157, 213, 83, 78, 34, 16, 233, 153, 200, 36, 34, 16, 233, 153, 237, 234, - 34, 16, 3, 235, 123, 34, 16, 240, 90, 34, 16, 240, 91, 251, 145, 34, 16, - 219, 252, 34, 16, 221, 230, 34, 16, 248, 43, 34, 16, 207, 109, 197, 73, - 34, 16, 207, 109, 248, 135, 34, 16, 219, 18, 34, 16, 219, 19, 248, 135, - 34, 16, 207, 103, 197, 73, 34, 16, 207, 103, 248, 135, 34, 16, 234, 207, - 197, 73, 34, 16, 234, 207, 248, 135, 34, 16, 221, 231, 213, 42, 210, 101, - 34, 16, 221, 231, 226, 90, 210, 101, 34, 16, 248, 44, 210, 101, 34, 16, - 207, 109, 210, 101, 34, 16, 219, 19, 210, 101, 34, 16, 207, 103, 210, - 101, 34, 16, 203, 25, 213, 40, 241, 31, 211, 252, 213, 41, 34, 16, 203, - 25, 213, 40, 241, 31, 211, 252, 226, 89, 34, 16, 203, 25, 213, 40, 241, - 31, 211, 252, 213, 42, 239, 99, 34, 16, 203, 25, 226, 88, 241, 31, 211, - 252, 213, 41, 34, 16, 203, 25, 226, 88, 241, 31, 211, 252, 226, 89, 34, - 16, 203, 25, 226, 88, 241, 31, 211, 252, 226, 90, 239, 99, 34, 16, 203, - 25, 226, 88, 241, 31, 211, 252, 226, 90, 239, 98, 34, 16, 203, 25, 226, - 88, 241, 31, 211, 252, 226, 90, 239, 97, 34, 16, 241, 63, 34, 16, 233, - 88, 247, 207, 244, 217, 34, 16, 233, 88, 236, 49, 244, 217, 34, 16, 47, - 250, 111, 34, 16, 199, 6, 34, 16, 212, 113, 34, 16, 244, 207, 34, 16, - 208, 172, 34, 16, 244, 212, 34, 16, 201, 236, 34, 16, 212, 81, 34, 16, - 212, 82, 235, 73, 34, 16, 208, 173, 235, 73, 34, 16, 201, 237, 210, 98, - 34, 16, 213, 23, 204, 144, 34, 16, 224, 82, 247, 207, 244, 217, 34, 16, - 224, 82, 236, 221, 77, 212, 211, 34, 16, 224, 82, 48, 216, 12, 34, 16, - 224, 82, 210, 169, 78, 34, 16, 224, 82, 197, 71, 216, 12, 34, 16, 224, - 82, 157, 216, 12, 34, 16, 224, 82, 211, 87, 216, 13, 204, 244, 237, 234, - 34, 16, 224, 82, 211, 87, 216, 13, 204, 244, 200, 36, 34, 16, 224, 82, - 237, 26, 216, 13, 204, 244, 237, 234, 34, 16, 224, 82, 237, 26, 216, 13, - 204, 244, 200, 36, 34, 16, 224, 82, 235, 82, 55, 32, 198, 247, 216, 16, - 204, 40, 32, 198, 247, 216, 16, 204, 29, 32, 198, 247, 216, 16, 204, 19, - 32, 198, 247, 216, 16, 204, 12, 32, 198, 247, 216, 16, 204, 4, 32, 198, - 247, 216, 16, 203, 254, 32, 198, 247, 216, 16, 203, 253, 32, 198, 247, - 216, 16, 203, 252, 32, 198, 247, 216, 16, 203, 251, 32, 198, 247, 216, - 16, 204, 39, 32, 198, 247, 216, 16, 204, 38, 32, 198, 247, 216, 16, 204, - 37, 32, 198, 247, 216, 16, 204, 36, 32, 198, 247, 216, 16, 204, 35, 32, - 198, 247, 216, 16, 204, 34, 32, 198, 247, 216, 16, 204, 33, 32, 198, 247, - 216, 16, 204, 32, 32, 198, 247, 216, 16, 204, 31, 32, 198, 247, 216, 16, - 204, 30, 32, 198, 247, 216, 16, 204, 28, 32, 198, 247, 216, 16, 204, 27, - 32, 198, 247, 216, 16, 204, 26, 32, 198, 247, 216, 16, 204, 25, 32, 198, - 247, 216, 16, 204, 24, 32, 198, 247, 216, 16, 204, 3, 32, 198, 247, 216, - 16, 204, 2, 32, 198, 247, 216, 16, 204, 1, 32, 198, 247, 216, 16, 204, 0, - 32, 198, 247, 216, 16, 203, 255, 32, 226, 39, 216, 16, 204, 40, 32, 226, - 39, 216, 16, 204, 29, 32, 226, 39, 216, 16, 204, 12, 32, 226, 39, 216, - 16, 204, 4, 32, 226, 39, 216, 16, 203, 253, 32, 226, 39, 216, 16, 203, - 252, 32, 226, 39, 216, 16, 204, 38, 32, 226, 39, 216, 16, 204, 37, 32, - 226, 39, 216, 16, 204, 36, 32, 226, 39, 216, 16, 204, 35, 32, 226, 39, - 216, 16, 204, 32, 32, 226, 39, 216, 16, 204, 31, 32, 226, 39, 216, 16, - 204, 30, 32, 226, 39, 216, 16, 204, 25, 32, 226, 39, 216, 16, 204, 24, - 32, 226, 39, 216, 16, 204, 23, 32, 226, 39, 216, 16, 204, 22, 32, 226, - 39, 216, 16, 204, 21, 32, 226, 39, 216, 16, 204, 20, 32, 226, 39, 216, - 16, 204, 18, 32, 226, 39, 216, 16, 204, 17, 32, 226, 39, 216, 16, 204, - 16, 32, 226, 39, 216, 16, 204, 15, 32, 226, 39, 216, 16, 204, 14, 32, - 226, 39, 216, 16, 204, 13, 32, 226, 39, 216, 16, 204, 11, 32, 226, 39, - 216, 16, 204, 10, 32, 226, 39, 216, 16, 204, 9, 32, 226, 39, 216, 16, - 204, 8, 32, 226, 39, 216, 16, 204, 7, 32, 226, 39, 216, 16, 204, 6, 32, - 226, 39, 216, 16, 204, 5, 32, 226, 39, 216, 16, 204, 3, 32, 226, 39, 216, - 16, 204, 2, 32, 226, 39, 216, 16, 204, 1, 32, 226, 39, 216, 16, 204, 0, - 32, 226, 39, 216, 16, 203, 255, 38, 32, 34, 201, 161, 38, 32, 34, 202, - 249, 38, 32, 34, 213, 52, 32, 34, 222, 165, 219, 249, 215, 141, 195, 79, - 219, 249, 215, 141, 100, 219, 249, 215, 141, 102, 219, 249, 215, 141, - 134, 219, 249, 215, 141, 136, 219, 249, 215, 141, 146, 219, 249, 215, - 141, 167, 219, 249, 215, 141, 178, 219, 249, 215, 141, 171, 219, 249, - 215, 141, 182, 219, 249, 215, 141, 203, 23, 219, 249, 215, 141, 236, 251, - 219, 249, 215, 141, 200, 239, 219, 249, 215, 141, 202, 179, 219, 249, - 215, 141, 235, 0, 219, 249, 215, 141, 235, 148, 219, 249, 215, 141, 206, - 23, 219, 249, 215, 141, 207, 68, 219, 249, 215, 141, 237, 27, 219, 249, - 215, 141, 216, 175, 218, 204, 36, 237, 71, 239, 113, 36, 232, 120, 237, - 71, 239, 113, 36, 231, 61, 237, 71, 239, 113, 36, 237, 70, 232, 121, 239, - 113, 36, 237, 70, 231, 60, 239, 113, 36, 237, 71, 202, 251, 36, 247, 35, - 202, 251, 36, 234, 216, 244, 248, 202, 251, 36, 219, 10, 202, 251, 36, - 249, 69, 202, 251, 36, 224, 196, 205, 224, 202, 251, 36, 241, 121, 202, - 251, 36, 250, 196, 202, 251, 36, 214, 77, 202, 251, 36, 248, 54, 214, 33, - 202, 251, 36, 239, 232, 214, 72, 239, 65, 202, 251, 36, 239, 62, 202, - 251, 36, 195, 229, 202, 251, 36, 226, 76, 202, 251, 36, 213, 62, 202, - 251, 36, 210, 177, 202, 251, 36, 241, 133, 202, 251, 36, 231, 175, 249, - 137, 202, 251, 36, 197, 152, 202, 251, 36, 235, 45, 202, 251, 36, 251, - 247, 202, 251, 36, 210, 133, 202, 251, 36, 210, 105, 202, 251, 36, 237, - 69, 202, 251, 36, 225, 112, 202, 251, 36, 241, 128, 202, 251, 36, 236, - 219, 202, 251, 36, 237, 171, 202, 251, 36, 247, 2, 202, 251, 36, 239, - 242, 202, 251, 36, 27, 210, 104, 202, 251, 36, 213, 233, 202, 251, 36, - 222, 169, 202, 251, 36, 244, 200, 202, 251, 36, 224, 70, 202, 251, 36, - 234, 71, 202, 251, 36, 204, 207, 202, 251, 36, 211, 201, 202, 251, 36, - 234, 215, 202, 251, 36, 210, 106, 202, 251, 36, 222, 209, 214, 72, 218, - 240, 202, 251, 36, 210, 102, 202, 251, 36, 233, 136, 202, 30, 219, 182, - 202, 251, 36, 236, 222, 202, 251, 36, 204, 221, 202, 251, 36, 233, 91, - 202, 251, 36, 236, 212, 202, 251, 36, 213, 109, 202, 251, 36, 209, 247, - 202, 251, 36, 235, 71, 202, 251, 36, 199, 127, 214, 72, 197, 131, 202, - 251, 36, 241, 138, 202, 251, 36, 219, 201, 202, 251, 36, 236, 122, 202, - 251, 36, 200, 47, 202, 251, 36, 239, 100, 202, 251, 36, 244, 202, 218, - 163, 202, 251, 36, 233, 67, 202, 251, 36, 234, 72, 226, 85, 202, 251, 36, - 220, 5, 202, 251, 36, 252, 16, 202, 251, 36, 236, 238, 202, 251, 36, 237, - 238, 202, 251, 36, 197, 129, 202, 251, 36, 206, 57, 202, 251, 36, 226, - 49, 202, 251, 36, 239, 199, 202, 251, 36, 240, 68, 202, 251, 36, 239, 96, - 202, 251, 36, 236, 86, 202, 251, 36, 207, 64, 202, 251, 36, 204, 225, - 202, 251, 36, 232, 171, 202, 251, 36, 244, 150, 202, 251, 36, 244, 197, - 202, 251, 36, 235, 217, 202, 251, 36, 251, 211, 202, 251, 36, 244, 149, - 202, 251, 36, 214, 119, 202, 218, 199, 103, 202, 251, 36, 239, 122, 202, - 251, 36, 223, 69, 202, 251, 36, 235, 9, 241, 87, 209, 216, 200, 50, 17, - 100, 241, 87, 209, 216, 200, 50, 17, 102, 241, 87, 209, 216, 200, 50, 17, - 134, 241, 87, 209, 216, 200, 50, 17, 136, 241, 87, 209, 216, 200, 50, 17, - 146, 241, 87, 209, 216, 200, 50, 17, 167, 241, 87, 209, 216, 200, 50, 17, - 178, 241, 87, 209, 216, 200, 50, 17, 171, 241, 87, 209, 216, 200, 50, 17, - 182, 241, 87, 209, 216, 203, 19, 17, 100, 241, 87, 209, 216, 203, 19, 17, - 102, 241, 87, 209, 216, 203, 19, 17, 134, 241, 87, 209, 216, 203, 19, 17, - 136, 241, 87, 209, 216, 203, 19, 17, 146, 241, 87, 209, 216, 203, 19, 17, - 167, 241, 87, 209, 216, 203, 19, 17, 178, 241, 87, 209, 216, 203, 19, 17, - 171, 241, 87, 209, 216, 203, 19, 17, 182, 143, 203, 118, 117, 100, 143, - 203, 118, 117, 102, 143, 203, 118, 117, 134, 143, 203, 118, 117, 136, - 143, 203, 118, 117, 146, 203, 118, 117, 100, 203, 118, 117, 146, 13, 27, - 6, 63, 13, 27, 6, 250, 111, 13, 27, 6, 247, 206, 13, 27, 6, 240, 230, 13, - 27, 6, 69, 13, 27, 6, 236, 48, 13, 27, 6, 234, 189, 13, 27, 6, 233, 14, - 13, 27, 6, 68, 13, 27, 6, 225, 216, 13, 27, 6, 225, 79, 13, 27, 6, 159, - 13, 27, 6, 221, 135, 13, 27, 6, 218, 54, 13, 27, 6, 72, 13, 27, 6, 214, - 2, 13, 27, 6, 211, 166, 13, 27, 6, 144, 13, 27, 6, 209, 80, 13, 27, 6, - 203, 216, 13, 27, 6, 66, 13, 27, 6, 199, 230, 13, 27, 6, 197, 199, 13, - 27, 6, 196, 222, 13, 27, 6, 196, 148, 13, 27, 6, 195, 158, 13, 27, 4, 63, - 13, 27, 4, 250, 111, 13, 27, 4, 247, 206, 13, 27, 4, 240, 230, 13, 27, 4, - 69, 13, 27, 4, 236, 48, 13, 27, 4, 234, 189, 13, 27, 4, 233, 14, 13, 27, - 4, 68, 13, 27, 4, 225, 216, 13, 27, 4, 225, 79, 13, 27, 4, 159, 13, 27, - 4, 221, 135, 13, 27, 4, 218, 54, 13, 27, 4, 72, 13, 27, 4, 214, 2, 13, - 27, 4, 211, 166, 13, 27, 4, 144, 13, 27, 4, 209, 80, 13, 27, 4, 203, 216, - 13, 27, 4, 66, 13, 27, 4, 199, 230, 13, 27, 4, 197, 199, 13, 27, 4, 196, - 222, 13, 27, 4, 196, 148, 13, 27, 4, 195, 158, 13, 41, 6, 63, 13, 41, 6, - 250, 111, 13, 41, 6, 247, 206, 13, 41, 6, 240, 230, 13, 41, 6, 69, 13, - 41, 6, 236, 48, 13, 41, 6, 234, 189, 13, 41, 6, 233, 14, 13, 41, 6, 68, - 13, 41, 6, 225, 216, 13, 41, 6, 225, 79, 13, 41, 6, 159, 13, 41, 6, 221, - 135, 13, 41, 6, 218, 54, 13, 41, 6, 72, 13, 41, 6, 214, 2, 13, 41, 6, - 211, 166, 13, 41, 6, 144, 13, 41, 6, 209, 80, 13, 41, 6, 203, 216, 13, - 41, 6, 66, 13, 41, 6, 199, 230, 13, 41, 6, 197, 199, 13, 41, 6, 196, 222, - 13, 41, 6, 196, 148, 13, 41, 6, 195, 158, 13, 41, 4, 63, 13, 41, 4, 250, - 111, 13, 41, 4, 247, 206, 13, 41, 4, 240, 230, 13, 41, 4, 69, 13, 41, 4, - 236, 48, 13, 41, 4, 234, 189, 13, 41, 4, 68, 13, 41, 4, 225, 216, 13, 41, - 4, 225, 79, 13, 41, 4, 159, 13, 41, 4, 221, 135, 13, 41, 4, 218, 54, 13, - 41, 4, 72, 13, 41, 4, 214, 2, 13, 41, 4, 211, 166, 13, 41, 4, 144, 13, - 41, 4, 209, 80, 13, 41, 4, 203, 216, 13, 41, 4, 66, 13, 41, 4, 199, 230, - 13, 41, 4, 197, 199, 13, 41, 4, 196, 222, 13, 41, 4, 196, 148, 13, 41, 4, - 195, 158, 13, 27, 41, 6, 63, 13, 27, 41, 6, 250, 111, 13, 27, 41, 6, 247, - 206, 13, 27, 41, 6, 240, 230, 13, 27, 41, 6, 69, 13, 27, 41, 6, 236, 48, - 13, 27, 41, 6, 234, 189, 13, 27, 41, 6, 233, 14, 13, 27, 41, 6, 68, 13, - 27, 41, 6, 225, 216, 13, 27, 41, 6, 225, 79, 13, 27, 41, 6, 159, 13, 27, - 41, 6, 221, 135, 13, 27, 41, 6, 218, 54, 13, 27, 41, 6, 72, 13, 27, 41, - 6, 214, 2, 13, 27, 41, 6, 211, 166, 13, 27, 41, 6, 144, 13, 27, 41, 6, - 209, 80, 13, 27, 41, 6, 203, 216, 13, 27, 41, 6, 66, 13, 27, 41, 6, 199, - 230, 13, 27, 41, 6, 197, 199, 13, 27, 41, 6, 196, 222, 13, 27, 41, 6, - 196, 148, 13, 27, 41, 6, 195, 158, 13, 27, 41, 4, 63, 13, 27, 41, 4, 250, - 111, 13, 27, 41, 4, 247, 206, 13, 27, 41, 4, 240, 230, 13, 27, 41, 4, 69, - 13, 27, 41, 4, 236, 48, 13, 27, 41, 4, 234, 189, 13, 27, 41, 4, 233, 14, - 13, 27, 41, 4, 68, 13, 27, 41, 4, 225, 216, 13, 27, 41, 4, 225, 79, 13, - 27, 41, 4, 159, 13, 27, 41, 4, 221, 135, 13, 27, 41, 4, 218, 54, 13, 27, - 41, 4, 72, 13, 27, 41, 4, 214, 2, 13, 27, 41, 4, 211, 166, 13, 27, 41, 4, - 144, 13, 27, 41, 4, 209, 80, 13, 27, 41, 4, 203, 216, 13, 27, 41, 4, 66, - 13, 27, 41, 4, 199, 230, 13, 27, 41, 4, 197, 199, 13, 27, 41, 4, 196, - 222, 13, 27, 41, 4, 196, 148, 13, 27, 41, 4, 195, 158, 13, 145, 6, 63, - 13, 145, 6, 247, 206, 13, 145, 6, 240, 230, 13, 145, 6, 234, 189, 13, - 145, 6, 225, 216, 13, 145, 6, 225, 79, 13, 145, 6, 218, 54, 13, 145, 6, - 72, 13, 145, 6, 214, 2, 13, 145, 6, 211, 166, 13, 145, 6, 209, 80, 13, - 145, 6, 203, 216, 13, 145, 6, 66, 13, 145, 6, 199, 230, 13, 145, 6, 197, - 199, 13, 145, 6, 196, 222, 13, 145, 6, 196, 148, 13, 145, 6, 195, 158, - 13, 145, 4, 63, 13, 145, 4, 250, 111, 13, 145, 4, 247, 206, 13, 145, 4, - 240, 230, 13, 145, 4, 236, 48, 13, 145, 4, 233, 14, 13, 145, 4, 68, 13, - 145, 4, 225, 216, 13, 145, 4, 225, 79, 13, 145, 4, 159, 13, 145, 4, 221, - 135, 13, 145, 4, 218, 54, 13, 145, 4, 214, 2, 13, 145, 4, 211, 166, 13, - 145, 4, 144, 13, 145, 4, 209, 80, 13, 145, 4, 203, 216, 13, 145, 4, 66, - 13, 145, 4, 199, 230, 13, 145, 4, 197, 199, 13, 145, 4, 196, 222, 13, - 145, 4, 196, 148, 13, 145, 4, 195, 158, 13, 27, 145, 6, 63, 13, 27, 145, - 6, 250, 111, 13, 27, 145, 6, 247, 206, 13, 27, 145, 6, 240, 230, 13, 27, - 145, 6, 69, 13, 27, 145, 6, 236, 48, 13, 27, 145, 6, 234, 189, 13, 27, - 145, 6, 233, 14, 13, 27, 145, 6, 68, 13, 27, 145, 6, 225, 216, 13, 27, - 145, 6, 225, 79, 13, 27, 145, 6, 159, 13, 27, 145, 6, 221, 135, 13, 27, - 145, 6, 218, 54, 13, 27, 145, 6, 72, 13, 27, 145, 6, 214, 2, 13, 27, 145, - 6, 211, 166, 13, 27, 145, 6, 144, 13, 27, 145, 6, 209, 80, 13, 27, 145, - 6, 203, 216, 13, 27, 145, 6, 66, 13, 27, 145, 6, 199, 230, 13, 27, 145, - 6, 197, 199, 13, 27, 145, 6, 196, 222, 13, 27, 145, 6, 196, 148, 13, 27, - 145, 6, 195, 158, 13, 27, 145, 4, 63, 13, 27, 145, 4, 250, 111, 13, 27, - 145, 4, 247, 206, 13, 27, 145, 4, 240, 230, 13, 27, 145, 4, 69, 13, 27, - 145, 4, 236, 48, 13, 27, 145, 4, 234, 189, 13, 27, 145, 4, 233, 14, 13, - 27, 145, 4, 68, 13, 27, 145, 4, 225, 216, 13, 27, 145, 4, 225, 79, 13, - 27, 145, 4, 159, 13, 27, 145, 4, 221, 135, 13, 27, 145, 4, 218, 54, 13, - 27, 145, 4, 72, 13, 27, 145, 4, 214, 2, 13, 27, 145, 4, 211, 166, 13, 27, - 145, 4, 144, 13, 27, 145, 4, 209, 80, 13, 27, 145, 4, 203, 216, 13, 27, - 145, 4, 66, 13, 27, 145, 4, 199, 230, 13, 27, 145, 4, 197, 199, 13, 27, - 145, 4, 196, 222, 13, 27, 145, 4, 196, 148, 13, 27, 145, 4, 195, 158, 13, - 187, 6, 63, 13, 187, 6, 250, 111, 13, 187, 6, 240, 230, 13, 187, 6, 69, - 13, 187, 6, 236, 48, 13, 187, 6, 234, 189, 13, 187, 6, 225, 216, 13, 187, - 6, 225, 79, 13, 187, 6, 159, 13, 187, 6, 221, 135, 13, 187, 6, 218, 54, - 13, 187, 6, 72, 13, 187, 6, 214, 2, 13, 187, 6, 211, 166, 13, 187, 6, + 1, 114, 1, 217, 209, 66, 114, 1, 217, 209, 72, 114, 1, 217, 209, 68, 114, + 1, 217, 209, 63, 114, 1, 213, 34, 251, 106, 114, 1, 213, 34, 251, 123, + 114, 1, 205, 234, 236, 230, 114, 1, 205, 234, 251, 106, 114, 1, 205, 234, + 214, 119, 114, 1, 110, 221, 136, 114, 251, 224, 50, 231, 155, 208, 137, + 114, 251, 224, 219, 65, 231, 155, 208, 137, 114, 251, 224, 53, 231, 155, + 208, 137, 114, 251, 224, 126, 83, 208, 137, 114, 251, 224, 219, 65, 83, + 208, 137, 114, 251, 224, 130, 83, 208, 137, 114, 251, 224, 250, 156, 208, + 137, 114, 251, 224, 250, 156, 222, 175, 208, 137, 114, 251, 224, 250, + 156, 203, 109, 114, 251, 224, 250, 156, 203, 135, 114, 251, 224, 250, + 156, 237, 136, 122, 114, 251, 224, 250, 156, 230, 249, 122, 114, 251, + 224, 250, 156, 203, 110, 122, 114, 251, 224, 130, 186, 114, 251, 224, + 130, 202, 101, 186, 114, 251, 224, 130, 233, 100, 114, 251, 224, 130, + 181, 233, 100, 114, 251, 224, 130, 238, 253, 114, 251, 224, 130, 244, + 249, 114, 251, 224, 130, 222, 75, 114, 251, 224, 130, 197, 122, 114, 251, + 224, 130, 199, 100, 114, 251, 224, 126, 186, 114, 251, 224, 126, 202, + 101, 186, 114, 251, 224, 126, 233, 100, 114, 251, 224, 126, 181, 233, + 100, 114, 251, 224, 126, 238, 253, 114, 251, 224, 126, 244, 249, 114, + 251, 224, 126, 222, 75, 114, 251, 224, 126, 197, 122, 114, 251, 224, 126, + 199, 100, 114, 251, 224, 126, 51, 114, 2, 177, 3, 241, 61, 114, 202, 193, + 1, 208, 114, 114, 52, 78, 114, 211, 214, 245, 59, 234, 217, 204, 226, + 206, 169, 235, 23, 1, 214, 23, 206, 169, 235, 23, 241, 127, 214, 23, 206, + 169, 235, 23, 135, 204, 241, 206, 169, 235, 23, 124, 204, 241, 67, 34, + 16, 211, 231, 67, 34, 16, 240, 67, 67, 34, 16, 213, 38, 67, 34, 16, 214, + 12, 237, 11, 67, 34, 16, 214, 12, 239, 90, 67, 34, 16, 199, 136, 237, 11, + 67, 34, 16, 199, 136, 239, 90, 67, 34, 16, 224, 230, 67, 34, 16, 203, + 233, 67, 34, 16, 213, 147, 67, 34, 16, 195, 223, 67, 34, 16, 195, 224, + 239, 90, 67, 34, 16, 223, 205, 67, 34, 16, 251, 42, 237, 11, 67, 34, 16, + 236, 84, 237, 11, 67, 34, 16, 203, 35, 67, 34, 16, 224, 178, 67, 34, 16, + 251, 31, 67, 34, 16, 251, 32, 239, 90, 67, 34, 16, 203, 240, 67, 34, 16, + 202, 172, 67, 34, 16, 214, 130, 250, 249, 67, 34, 16, 233, 127, 250, 249, + 67, 34, 16, 211, 230, 67, 34, 16, 247, 7, 67, 34, 16, 199, 125, 67, 34, + 16, 225, 239, 250, 249, 67, 34, 16, 224, 180, 250, 249, 67, 34, 16, 224, + 179, 250, 249, 67, 34, 16, 208, 182, 67, 34, 16, 213, 137, 67, 34, 16, + 204, 251, 251, 35, 67, 34, 16, 214, 11, 250, 249, 67, 34, 16, 199, 135, + 250, 249, 67, 34, 16, 251, 36, 250, 249, 67, 34, 16, 251, 29, 67, 34, 16, + 224, 27, 67, 34, 16, 210, 85, 67, 34, 16, 212, 218, 250, 249, 67, 34, 16, + 202, 74, 67, 34, 16, 251, 103, 67, 34, 16, 208, 117, 67, 34, 16, 203, + 244, 250, 249, 67, 34, 16, 203, 244, 219, 144, 204, 249, 67, 34, 16, 214, + 6, 250, 249, 67, 34, 16, 202, 211, 67, 34, 16, 222, 162, 67, 34, 16, 237, + 159, 67, 34, 16, 201, 182, 67, 34, 16, 203, 4, 67, 34, 16, 223, 208, 67, + 34, 16, 251, 42, 236, 84, 217, 97, 67, 34, 16, 234, 225, 250, 249, 67, + 34, 16, 226, 99, 67, 34, 16, 201, 151, 250, 249, 67, 34, 16, 224, 233, + 201, 150, 67, 34, 16, 213, 67, 67, 34, 16, 211, 235, 67, 34, 16, 223, + 243, 67, 34, 16, 245, 42, 250, 249, 67, 34, 16, 210, 203, 67, 34, 16, + 213, 150, 250, 249, 67, 34, 16, 213, 148, 250, 249, 67, 34, 16, 230, 199, + 67, 34, 16, 217, 220, 67, 34, 16, 213, 16, 67, 34, 16, 223, 244, 251, + 141, 67, 34, 16, 201, 151, 251, 141, 67, 34, 16, 204, 220, 67, 34, 16, + 233, 86, 67, 34, 16, 225, 239, 217, 97, 67, 34, 16, 214, 130, 217, 97, + 67, 34, 16, 214, 12, 217, 97, 67, 34, 16, 213, 15, 67, 34, 16, 223, 228, + 67, 34, 16, 213, 14, 67, 34, 16, 223, 207, 67, 34, 16, 213, 68, 217, 97, + 67, 34, 16, 224, 179, 217, 98, 251, 73, 67, 34, 16, 224, 180, 217, 98, + 251, 73, 67, 34, 16, 195, 221, 67, 34, 16, 251, 32, 217, 97, 67, 34, 16, + 251, 33, 203, 241, 217, 97, 67, 34, 16, 195, 222, 67, 34, 16, 223, 206, + 67, 34, 16, 237, 6, 67, 34, 16, 247, 8, 67, 34, 16, 219, 36, 225, 238, + 67, 34, 16, 199, 136, 217, 97, 67, 34, 16, 212, 218, 217, 97, 67, 34, 16, + 211, 236, 217, 97, 67, 34, 16, 214, 126, 67, 34, 16, 251, 60, 67, 34, 16, + 221, 147, 67, 34, 16, 213, 148, 217, 97, 67, 34, 16, 213, 150, 217, 97, + 67, 34, 16, 236, 122, 213, 149, 67, 34, 16, 223, 104, 67, 34, 16, 251, + 61, 67, 34, 16, 201, 151, 217, 97, 67, 34, 16, 237, 9, 67, 34, 16, 203, + 244, 217, 97, 67, 34, 16, 203, 234, 67, 34, 16, 245, 42, 217, 97, 67, 34, + 16, 236, 180, 67, 34, 16, 208, 118, 217, 97, 67, 34, 16, 196, 188, 224, + 27, 67, 34, 16, 201, 148, 67, 34, 16, 211, 237, 67, 34, 16, 201, 152, 67, + 34, 16, 201, 149, 67, 34, 16, 211, 234, 67, 34, 16, 201, 147, 67, 34, 16, + 211, 233, 67, 34, 16, 233, 126, 67, 34, 16, 250, 241, 67, 34, 16, 236, + 122, 250, 241, 67, 34, 16, 214, 6, 217, 97, 67, 34, 16, 202, 210, 236, + 135, 67, 34, 16, 202, 210, 236, 83, 67, 34, 16, 202, 212, 251, 37, 67, + 34, 16, 202, 204, 225, 32, 251, 28, 67, 34, 16, 224, 232, 67, 34, 16, + 236, 217, 67, 34, 16, 196, 28, 224, 229, 67, 34, 16, 196, 28, 251, 73, + 67, 34, 16, 204, 250, 67, 34, 16, 224, 28, 251, 73, 67, 34, 16, 239, 91, + 250, 249, 67, 34, 16, 223, 209, 250, 249, 67, 34, 16, 223, 209, 251, 141, + 67, 34, 16, 223, 209, 217, 97, 67, 34, 16, 251, 36, 217, 97, 67, 34, 16, + 251, 38, 67, 34, 16, 239, 90, 67, 34, 16, 201, 163, 67, 34, 16, 202, 250, + 67, 34, 16, 223, 232, 67, 34, 16, 222, 167, 236, 210, 245, 32, 67, 34, + 16, 222, 167, 237, 160, 245, 33, 67, 34, 16, 222, 167, 201, 166, 245, 33, + 67, 34, 16, 222, 167, 203, 6, 245, 33, 67, 34, 16, 222, 167, 226, 94, + 245, 32, 67, 34, 16, 233, 127, 217, 98, 251, 73, 67, 34, 16, 233, 127, + 213, 138, 250, 237, 67, 34, 16, 233, 127, 213, 138, 239, 181, 67, 34, 16, + 239, 115, 67, 34, 16, 239, 116, 213, 138, 250, 238, 224, 229, 67, 34, 16, + 239, 116, 213, 138, 250, 238, 251, 73, 67, 34, 16, 239, 116, 213, 138, + 239, 181, 67, 34, 16, 201, 171, 67, 34, 16, 250, 242, 67, 34, 16, 226, + 101, 67, 34, 16, 239, 138, 67, 34, 16, 251, 211, 212, 100, 250, 243, 67, + 34, 16, 251, 211, 250, 240, 67, 34, 16, 251, 211, 250, 243, 67, 34, 16, + 251, 211, 219, 138, 67, 34, 16, 251, 211, 219, 149, 67, 34, 16, 251, 211, + 233, 128, 67, 34, 16, 251, 211, 233, 125, 67, 34, 16, 251, 211, 212, 100, + 233, 128, 67, 34, 16, 220, 18, 211, 243, 230, 197, 67, 34, 16, 220, 18, + 251, 143, 211, 243, 230, 197, 67, 34, 16, 220, 18, 239, 180, 230, 197, + 67, 34, 16, 220, 18, 251, 143, 239, 180, 230, 197, 67, 34, 16, 220, 18, + 201, 158, 230, 197, 67, 34, 16, 220, 18, 201, 172, 67, 34, 16, 220, 18, + 202, 255, 230, 197, 67, 34, 16, 220, 18, 202, 255, 222, 171, 230, 197, + 67, 34, 16, 220, 18, 222, 171, 230, 197, 67, 34, 16, 220, 18, 212, 146, + 230, 197, 67, 34, 16, 225, 246, 203, 28, 230, 198, 67, 34, 16, 251, 33, + 203, 28, 230, 198, 67, 34, 16, 235, 209, 202, 252, 67, 34, 16, 235, 209, + 218, 206, 67, 34, 16, 235, 209, 239, 121, 67, 34, 16, 220, 18, 199, 129, + 230, 197, 67, 34, 16, 220, 18, 211, 242, 230, 197, 67, 34, 16, 220, 18, + 212, 146, 202, 255, 230, 197, 67, 34, 16, 233, 122, 218, 56, 251, 37, 67, + 34, 16, 233, 122, 218, 56, 239, 89, 67, 34, 16, 236, 228, 225, 32, 234, + 225, 198, 228, 67, 34, 16, 226, 100, 67, 34, 16, 226, 98, 67, 34, 16, + 234, 225, 250, 250, 239, 179, 230, 196, 67, 34, 16, 234, 225, 239, 136, + 161, 67, 34, 16, 234, 225, 239, 136, 217, 220, 67, 34, 16, 234, 225, 217, + 214, 230, 197, 67, 34, 16, 234, 225, 239, 136, 239, 152, 67, 34, 16, 234, + 225, 206, 0, 239, 135, 239, 152, 67, 34, 16, 234, 225, 239, 136, 224, + 209, 67, 34, 16, 234, 225, 239, 136, 195, 11, 67, 34, 16, 234, 225, 239, + 136, 216, 224, 224, 229, 67, 34, 16, 234, 225, 239, 136, 216, 224, 251, + 73, 67, 34, 16, 234, 225, 220, 68, 245, 34, 239, 121, 67, 34, 16, 234, + 225, 220, 68, 245, 34, 218, 206, 67, 34, 16, 235, 154, 206, 0, 245, 34, + 199, 128, 67, 34, 16, 234, 225, 206, 0, 245, 34, 203, 245, 67, 34, 16, + 234, 225, 217, 100, 67, 34, 16, 245, 35, 194, 234, 67, 34, 16, 245, 35, + 224, 26, 67, 34, 16, 245, 35, 205, 139, 67, 34, 16, 234, 225, 230, 249, + 196, 27, 203, 0, 67, 34, 16, 234, 225, 236, 229, 251, 62, 67, 34, 16, + 196, 27, 201, 159, 67, 34, 16, 239, 129, 201, 159, 67, 34, 16, 239, 129, + 203, 0, 67, 34, 16, 239, 129, 251, 39, 237, 160, 239, 20, 67, 34, 16, + 239, 129, 218, 204, 203, 5, 239, 20, 67, 34, 16, 239, 129, 239, 112, 236, + 96, 239, 20, 67, 34, 16, 239, 129, 201, 169, 214, 136, 239, 20, 67, 34, + 16, 196, 27, 251, 39, 237, 160, 239, 20, 67, 34, 16, 196, 27, 218, 204, + 203, 5, 239, 20, 67, 34, 16, 196, 27, 239, 112, 236, 96, 239, 20, 67, 34, + 16, 196, 27, 201, 169, 214, 136, 239, 20, 67, 34, 16, 234, 30, 239, 128, + 67, 34, 16, 234, 30, 196, 26, 67, 34, 16, 239, 137, 251, 39, 219, 37, 67, + 34, 16, 239, 137, 251, 39, 219, 179, 67, 34, 16, 239, 137, 239, 90, 67, + 34, 16, 239, 137, 202, 202, 67, 34, 16, 206, 72, 202, 202, 67, 34, 16, + 206, 72, 202, 203, 239, 74, 67, 34, 16, 206, 72, 202, 203, 201, 160, 67, + 34, 16, 206, 72, 202, 203, 202, 248, 67, 34, 16, 206, 72, 250, 211, 67, + 34, 16, 206, 72, 250, 212, 239, 74, 67, 34, 16, 206, 72, 250, 212, 201, + 160, 67, 34, 16, 206, 72, 250, 212, 202, 248, 67, 34, 16, 239, 113, 234, + 11, 67, 34, 16, 239, 120, 214, 39, 67, 34, 16, 204, 236, 67, 34, 16, 250, + 234, 161, 67, 34, 16, 250, 234, 198, 228, 67, 34, 16, 250, 234, 234, 123, + 67, 34, 16, 250, 234, 239, 152, 67, 34, 16, 250, 234, 224, 209, 67, 34, + 16, 250, 234, 195, 11, 67, 34, 16, 250, 234, 216, 223, 67, 34, 16, 224, + 179, 217, 98, 219, 148, 67, 34, 16, 224, 180, 217, 98, 219, 148, 67, 34, + 16, 224, 179, 217, 98, 224, 229, 67, 34, 16, 224, 180, 217, 98, 224, 229, + 67, 34, 16, 224, 28, 224, 229, 67, 34, 16, 233, 127, 217, 98, 224, 229, + 34, 16, 206, 62, 249, 75, 34, 16, 52, 249, 75, 34, 16, 48, 249, 75, 34, + 16, 210, 90, 48, 249, 75, 34, 16, 240, 64, 249, 75, 34, 16, 206, 182, + 249, 75, 34, 16, 50, 210, 120, 55, 34, 16, 53, 210, 120, 55, 34, 16, 210, + 120, 238, 250, 34, 16, 240, 108, 208, 121, 34, 16, 240, 137, 247, 122, + 34, 16, 208, 121, 34, 16, 244, 176, 34, 16, 210, 118, 235, 142, 34, 16, + 210, 118, 235, 141, 34, 16, 210, 118, 235, 140, 34, 16, 235, 164, 34, 16, + 235, 165, 60, 34, 16, 248, 49, 78, 34, 16, 247, 164, 34, 16, 248, 63, 34, + 16, 179, 34, 16, 214, 114, 205, 16, 34, 16, 200, 214, 205, 16, 34, 16, + 202, 149, 205, 16, 34, 16, 235, 6, 205, 16, 34, 16, 235, 100, 205, 16, + 34, 16, 206, 28, 205, 16, 34, 16, 206, 26, 234, 242, 34, 16, 235, 4, 234, + 242, 34, 16, 234, 191, 244, 218, 34, 16, 234, 191, 244, 219, 214, 43, + 251, 132, 34, 16, 234, 191, 244, 219, 214, 43, 249, 58, 34, 16, 247, 208, + 244, 218, 34, 16, 236, 50, 244, 218, 34, 16, 236, 50, 244, 219, 214, 43, + 251, 132, 34, 16, 236, 50, 244, 219, 214, 43, 249, 58, 34, 16, 237, 207, + 244, 217, 34, 16, 237, 207, 244, 216, 34, 16, 218, 120, 219, 203, 210, + 101, 34, 16, 52, 207, 12, 34, 16, 52, 235, 82, 34, 16, 235, 83, 200, 36, + 34, 16, 235, 83, 237, 235, 34, 16, 217, 203, 200, 36, 34, 16, 217, 203, + 237, 235, 34, 16, 207, 13, 200, 36, 34, 16, 207, 13, 237, 235, 34, 16, + 211, 88, 152, 207, 12, 34, 16, 211, 88, 152, 235, 82, 34, 16, 244, 156, + 202, 78, 34, 16, 241, 2, 202, 78, 34, 16, 214, 43, 251, 132, 34, 16, 214, + 43, 249, 58, 34, 16, 211, 69, 251, 132, 34, 16, 211, 69, 249, 58, 34, 16, + 218, 123, 210, 101, 34, 16, 197, 71, 210, 101, 34, 16, 157, 210, 101, 34, + 16, 211, 88, 210, 101, 34, 16, 237, 27, 210, 101, 34, 16, 206, 22, 210, + 101, 34, 16, 202, 174, 210, 101, 34, 16, 206, 12, 210, 101, 34, 16, 97, + 231, 58, 200, 232, 210, 101, 34, 16, 196, 223, 216, 9, 34, 16, 98, 216, + 9, 34, 16, 244, 250, 196, 223, 216, 9, 34, 16, 47, 216, 10, 197, 73, 34, + 16, 47, 216, 10, 248, 136, 34, 16, 201, 181, 216, 10, 124, 197, 73, 34, + 16, 201, 181, 216, 10, 124, 248, 136, 34, 16, 201, 181, 216, 10, 50, 197, + 73, 34, 16, 201, 181, 216, 10, 50, 248, 136, 34, 16, 201, 181, 216, 10, + 53, 197, 73, 34, 16, 201, 181, 216, 10, 53, 248, 136, 34, 16, 201, 181, + 216, 10, 135, 197, 73, 34, 16, 201, 181, 216, 10, 135, 248, 136, 34, 16, + 201, 181, 216, 10, 124, 53, 197, 73, 34, 16, 201, 181, 216, 10, 124, 53, + 248, 136, 34, 16, 218, 190, 216, 10, 197, 73, 34, 16, 218, 190, 216, 10, + 248, 136, 34, 16, 201, 178, 216, 10, 135, 197, 73, 34, 16, 201, 178, 216, + 10, 135, 248, 136, 34, 16, 213, 141, 216, 9, 34, 16, 198, 241, 216, 9, + 34, 16, 216, 10, 248, 136, 34, 16, 215, 147, 216, 9, 34, 16, 244, 187, + 216, 10, 197, 73, 34, 16, 244, 187, 216, 10, 248, 136, 34, 16, 248, 47, + 34, 16, 197, 71, 216, 13, 34, 16, 157, 216, 13, 34, 16, 211, 88, 216, 13, + 34, 16, 237, 27, 216, 13, 34, 16, 206, 22, 216, 13, 34, 16, 202, 174, + 216, 13, 34, 16, 206, 12, 216, 13, 34, 16, 97, 231, 58, 200, 232, 216, + 13, 34, 16, 38, 204, 243, 34, 16, 38, 205, 101, 204, 243, 34, 16, 38, + 201, 189, 34, 16, 38, 201, 188, 34, 16, 38, 201, 187, 34, 16, 235, 125, + 201, 189, 34, 16, 235, 125, 201, 188, 34, 16, 235, 125, 201, 187, 34, 16, + 38, 250, 147, 238, 253, 34, 16, 38, 235, 92, 34, 16, 38, 235, 91, 34, 16, + 38, 235, 90, 34, 16, 38, 235, 89, 34, 16, 38, 235, 88, 34, 16, 248, 243, + 249, 6, 34, 16, 236, 222, 249, 6, 34, 16, 248, 243, 202, 107, 34, 16, + 236, 222, 202, 107, 34, 16, 248, 243, 205, 225, 34, 16, 236, 222, 205, + 225, 34, 16, 248, 243, 212, 227, 34, 16, 236, 222, 212, 227, 34, 16, 38, + 252, 22, 34, 16, 38, 205, 20, 34, 16, 38, 203, 11, 34, 16, 38, 205, 21, + 34, 16, 38, 220, 33, 34, 16, 38, 220, 32, 34, 16, 38, 252, 21, 34, 16, + 38, 221, 210, 34, 16, 250, 223, 200, 36, 34, 16, 250, 223, 237, 235, 34, + 16, 38, 239, 13, 34, 16, 38, 209, 254, 34, 16, 38, 235, 71, 34, 16, 38, + 205, 221, 34, 16, 38, 248, 221, 34, 16, 38, 52, 201, 249, 34, 16, 38, + 201, 165, 201, 249, 34, 16, 210, 4, 34, 16, 204, 154, 34, 16, 195, 158, + 34, 16, 212, 219, 34, 16, 219, 129, 34, 16, 235, 18, 34, 16, 241, 73, 34, + 16, 239, 238, 34, 16, 233, 117, 216, 14, 205, 248, 34, 16, 233, 117, 216, + 14, 216, 51, 205, 248, 34, 16, 201, 218, 34, 16, 201, 4, 34, 16, 226, 17, + 201, 4, 34, 16, 201, 5, 205, 248, 34, 16, 201, 5, 200, 36, 34, 16, 214, + 60, 204, 195, 34, 16, 214, 60, 204, 192, 34, 16, 214, 60, 204, 191, 34, + 16, 214, 60, 204, 190, 34, 16, 214, 60, 204, 189, 34, 16, 214, 60, 204, + 188, 34, 16, 214, 60, 204, 187, 34, 16, 214, 60, 204, 186, 34, 16, 214, + 60, 204, 185, 34, 16, 214, 60, 204, 194, 34, 16, 214, 60, 204, 193, 34, + 16, 232, 157, 34, 16, 217, 110, 34, 16, 236, 222, 77, 204, 232, 34, 16, + 239, 231, 205, 248, 34, 16, 38, 135, 248, 77, 34, 16, 38, 124, 248, 77, + 34, 16, 38, 232, 170, 34, 16, 38, 205, 211, 212, 151, 34, 16, 213, 84, + 78, 34, 16, 213, 84, 124, 78, 34, 16, 157, 213, 84, 78, 34, 16, 233, 154, + 200, 36, 34, 16, 233, 154, 237, 235, 34, 16, 3, 235, 124, 34, 16, 240, + 91, 34, 16, 240, 92, 251, 146, 34, 16, 219, 253, 34, 16, 221, 231, 34, + 16, 248, 44, 34, 16, 207, 109, 197, 73, 34, 16, 207, 109, 248, 136, 34, + 16, 219, 19, 34, 16, 219, 20, 248, 136, 34, 16, 207, 103, 197, 73, 34, + 16, 207, 103, 248, 136, 34, 16, 234, 208, 197, 73, 34, 16, 234, 208, 248, + 136, 34, 16, 221, 232, 213, 43, 210, 101, 34, 16, 221, 232, 226, 91, 210, + 101, 34, 16, 248, 45, 210, 101, 34, 16, 207, 109, 210, 101, 34, 16, 219, + 20, 210, 101, 34, 16, 207, 103, 210, 101, 34, 16, 203, 25, 213, 41, 241, + 32, 211, 253, 213, 42, 34, 16, 203, 25, 213, 41, 241, 32, 211, 253, 226, + 90, 34, 16, 203, 25, 213, 41, 241, 32, 211, 253, 213, 43, 239, 100, 34, + 16, 203, 25, 226, 89, 241, 32, 211, 253, 213, 42, 34, 16, 203, 25, 226, + 89, 241, 32, 211, 253, 226, 90, 34, 16, 203, 25, 226, 89, 241, 32, 211, + 253, 226, 91, 239, 100, 34, 16, 203, 25, 226, 89, 241, 32, 211, 253, 226, + 91, 239, 99, 34, 16, 203, 25, 226, 89, 241, 32, 211, 253, 226, 91, 239, + 98, 34, 16, 241, 64, 34, 16, 233, 89, 247, 208, 244, 218, 34, 16, 233, + 89, 236, 50, 244, 218, 34, 16, 47, 250, 112, 34, 16, 199, 6, 34, 16, 212, + 114, 34, 16, 244, 208, 34, 16, 208, 172, 34, 16, 244, 213, 34, 16, 201, + 236, 34, 16, 212, 82, 34, 16, 212, 83, 235, 74, 34, 16, 208, 173, 235, + 74, 34, 16, 201, 237, 210, 98, 34, 16, 213, 24, 204, 144, 34, 16, 224, + 83, 247, 208, 244, 218, 34, 16, 224, 83, 236, 222, 77, 212, 212, 34, 16, + 224, 83, 48, 216, 13, 34, 16, 224, 83, 210, 170, 78, 34, 16, 224, 83, + 197, 71, 216, 13, 34, 16, 224, 83, 157, 216, 13, 34, 16, 224, 83, 211, + 88, 216, 14, 204, 244, 237, 235, 34, 16, 224, 83, 211, 88, 216, 14, 204, + 244, 200, 36, 34, 16, 224, 83, 237, 27, 216, 14, 204, 244, 237, 235, 34, + 16, 224, 83, 237, 27, 216, 14, 204, 244, 200, 36, 34, 16, 224, 83, 235, + 83, 55, 32, 198, 247, 216, 17, 204, 40, 32, 198, 247, 216, 17, 204, 29, + 32, 198, 247, 216, 17, 204, 19, 32, 198, 247, 216, 17, 204, 12, 32, 198, + 247, 216, 17, 204, 4, 32, 198, 247, 216, 17, 203, 254, 32, 198, 247, 216, + 17, 203, 253, 32, 198, 247, 216, 17, 203, 252, 32, 198, 247, 216, 17, + 203, 251, 32, 198, 247, 216, 17, 204, 39, 32, 198, 247, 216, 17, 204, 38, + 32, 198, 247, 216, 17, 204, 37, 32, 198, 247, 216, 17, 204, 36, 32, 198, + 247, 216, 17, 204, 35, 32, 198, 247, 216, 17, 204, 34, 32, 198, 247, 216, + 17, 204, 33, 32, 198, 247, 216, 17, 204, 32, 32, 198, 247, 216, 17, 204, + 31, 32, 198, 247, 216, 17, 204, 30, 32, 198, 247, 216, 17, 204, 28, 32, + 198, 247, 216, 17, 204, 27, 32, 198, 247, 216, 17, 204, 26, 32, 198, 247, + 216, 17, 204, 25, 32, 198, 247, 216, 17, 204, 24, 32, 198, 247, 216, 17, + 204, 3, 32, 198, 247, 216, 17, 204, 2, 32, 198, 247, 216, 17, 204, 1, 32, + 198, 247, 216, 17, 204, 0, 32, 198, 247, 216, 17, 203, 255, 32, 226, 40, + 216, 17, 204, 40, 32, 226, 40, 216, 17, 204, 29, 32, 226, 40, 216, 17, + 204, 12, 32, 226, 40, 216, 17, 204, 4, 32, 226, 40, 216, 17, 203, 253, + 32, 226, 40, 216, 17, 203, 252, 32, 226, 40, 216, 17, 204, 38, 32, 226, + 40, 216, 17, 204, 37, 32, 226, 40, 216, 17, 204, 36, 32, 226, 40, 216, + 17, 204, 35, 32, 226, 40, 216, 17, 204, 32, 32, 226, 40, 216, 17, 204, + 31, 32, 226, 40, 216, 17, 204, 30, 32, 226, 40, 216, 17, 204, 25, 32, + 226, 40, 216, 17, 204, 24, 32, 226, 40, 216, 17, 204, 23, 32, 226, 40, + 216, 17, 204, 22, 32, 226, 40, 216, 17, 204, 21, 32, 226, 40, 216, 17, + 204, 20, 32, 226, 40, 216, 17, 204, 18, 32, 226, 40, 216, 17, 204, 17, + 32, 226, 40, 216, 17, 204, 16, 32, 226, 40, 216, 17, 204, 15, 32, 226, + 40, 216, 17, 204, 14, 32, 226, 40, 216, 17, 204, 13, 32, 226, 40, 216, + 17, 204, 11, 32, 226, 40, 216, 17, 204, 10, 32, 226, 40, 216, 17, 204, 9, + 32, 226, 40, 216, 17, 204, 8, 32, 226, 40, 216, 17, 204, 7, 32, 226, 40, + 216, 17, 204, 6, 32, 226, 40, 216, 17, 204, 5, 32, 226, 40, 216, 17, 204, + 3, 32, 226, 40, 216, 17, 204, 2, 32, 226, 40, 216, 17, 204, 1, 32, 226, + 40, 216, 17, 204, 0, 32, 226, 40, 216, 17, 203, 255, 38, 32, 34, 201, + 161, 38, 32, 34, 202, 249, 38, 32, 34, 213, 53, 32, 34, 222, 166, 219, + 250, 215, 142, 195, 79, 219, 250, 215, 142, 100, 219, 250, 215, 142, 102, + 219, 250, 215, 142, 134, 219, 250, 215, 142, 136, 219, 250, 215, 142, + 146, 219, 250, 215, 142, 167, 219, 250, 215, 142, 178, 219, 250, 215, + 142, 171, 219, 250, 215, 142, 182, 219, 250, 215, 142, 203, 23, 219, 250, + 215, 142, 236, 252, 219, 250, 215, 142, 200, 239, 219, 250, 215, 142, + 202, 179, 219, 250, 215, 142, 235, 1, 219, 250, 215, 142, 235, 149, 219, + 250, 215, 142, 206, 23, 219, 250, 215, 142, 207, 68, 219, 250, 215, 142, + 237, 28, 219, 250, 215, 142, 216, 176, 218, 205, 36, 237, 72, 239, 114, + 36, 232, 121, 237, 72, 239, 114, 36, 231, 62, 237, 72, 239, 114, 36, 237, + 71, 232, 122, 239, 114, 36, 237, 71, 231, 61, 239, 114, 36, 237, 72, 202, + 251, 36, 247, 36, 202, 251, 36, 234, 217, 244, 249, 202, 251, 36, 219, + 11, 202, 251, 36, 249, 70, 202, 251, 36, 224, 197, 205, 224, 202, 251, + 36, 241, 122, 202, 251, 36, 250, 197, 202, 251, 36, 214, 78, 202, 251, + 36, 248, 55, 214, 34, 202, 251, 36, 239, 233, 214, 73, 239, 66, 202, 251, + 36, 239, 63, 202, 251, 36, 195, 229, 202, 251, 36, 226, 77, 202, 251, 36, + 213, 63, 202, 251, 36, 210, 178, 202, 251, 36, 241, 134, 202, 251, 36, + 231, 176, 249, 138, 202, 251, 36, 197, 152, 202, 251, 36, 235, 46, 202, + 251, 36, 251, 248, 202, 251, 36, 210, 133, 202, 251, 36, 210, 105, 202, + 251, 36, 237, 70, 202, 251, 36, 225, 113, 202, 251, 36, 241, 129, 202, + 251, 36, 236, 220, 202, 251, 36, 237, 172, 202, 251, 36, 247, 3, 202, + 251, 36, 239, 243, 202, 251, 36, 27, 210, 104, 202, 251, 36, 213, 234, + 202, 251, 36, 222, 170, 202, 251, 36, 244, 201, 202, 251, 36, 224, 71, + 202, 251, 36, 234, 72, 202, 251, 36, 204, 207, 202, 251, 36, 211, 202, + 202, 251, 36, 234, 216, 202, 251, 36, 210, 106, 202, 251, 36, 222, 210, + 214, 73, 218, 241, 202, 251, 36, 210, 102, 202, 251, 36, 233, 137, 202, + 30, 219, 183, 202, 251, 36, 236, 223, 202, 251, 36, 204, 221, 202, 251, + 36, 233, 92, 202, 251, 36, 236, 213, 202, 251, 36, 213, 110, 202, 251, + 36, 209, 247, 202, 251, 36, 235, 72, 202, 251, 36, 199, 127, 214, 73, + 197, 131, 202, 251, 36, 241, 139, 202, 251, 36, 219, 202, 202, 251, 36, + 236, 123, 202, 251, 36, 200, 47, 202, 251, 36, 239, 101, 202, 251, 36, + 244, 203, 218, 164, 202, 251, 36, 233, 68, 202, 251, 36, 234, 73, 226, + 86, 202, 251, 36, 220, 6, 202, 251, 36, 252, 17, 202, 251, 36, 236, 239, + 202, 251, 36, 237, 239, 202, 251, 36, 197, 129, 202, 251, 36, 206, 57, + 202, 251, 36, 226, 50, 202, 251, 36, 239, 200, 202, 251, 36, 240, 69, + 202, 251, 36, 239, 97, 202, 251, 36, 236, 87, 202, 251, 36, 207, 64, 202, + 251, 36, 204, 225, 202, 251, 36, 232, 172, 202, 251, 36, 244, 151, 202, + 251, 36, 244, 198, 202, 251, 36, 235, 218, 202, 251, 36, 251, 212, 202, + 251, 36, 244, 150, 202, 251, 36, 214, 120, 202, 218, 199, 103, 202, 251, + 36, 239, 123, 202, 251, 36, 223, 70, 202, 251, 36, 235, 10, 241, 88, 209, + 216, 200, 50, 17, 100, 241, 88, 209, 216, 200, 50, 17, 102, 241, 88, 209, + 216, 200, 50, 17, 134, 241, 88, 209, 216, 200, 50, 17, 136, 241, 88, 209, + 216, 200, 50, 17, 146, 241, 88, 209, 216, 200, 50, 17, 167, 241, 88, 209, + 216, 200, 50, 17, 178, 241, 88, 209, 216, 200, 50, 17, 171, 241, 88, 209, + 216, 200, 50, 17, 182, 241, 88, 209, 216, 203, 19, 17, 100, 241, 88, 209, + 216, 203, 19, 17, 102, 241, 88, 209, 216, 203, 19, 17, 134, 241, 88, 209, + 216, 203, 19, 17, 136, 241, 88, 209, 216, 203, 19, 17, 146, 241, 88, 209, + 216, 203, 19, 17, 167, 241, 88, 209, 216, 203, 19, 17, 178, 241, 88, 209, + 216, 203, 19, 17, 171, 241, 88, 209, 216, 203, 19, 17, 182, 143, 203, + 118, 117, 100, 143, 203, 118, 117, 102, 143, 203, 118, 117, 134, 143, + 203, 118, 117, 136, 143, 203, 118, 117, 146, 203, 118, 117, 100, 203, + 118, 117, 146, 13, 27, 6, 63, 13, 27, 6, 250, 112, 13, 27, 6, 247, 207, + 13, 27, 6, 240, 231, 13, 27, 6, 69, 13, 27, 6, 236, 49, 13, 27, 6, 234, + 190, 13, 27, 6, 233, 15, 13, 27, 6, 68, 13, 27, 6, 225, 217, 13, 27, 6, + 225, 80, 13, 27, 6, 159, 13, 27, 6, 221, 136, 13, 27, 6, 218, 55, 13, 27, + 6, 72, 13, 27, 6, 214, 3, 13, 27, 6, 211, 167, 13, 27, 6, 144, 13, 27, 6, + 209, 80, 13, 27, 6, 203, 216, 13, 27, 6, 66, 13, 27, 6, 199, 230, 13, 27, + 6, 197, 199, 13, 27, 6, 196, 222, 13, 27, 6, 196, 148, 13, 27, 6, 195, + 158, 13, 27, 4, 63, 13, 27, 4, 250, 112, 13, 27, 4, 247, 207, 13, 27, 4, + 240, 231, 13, 27, 4, 69, 13, 27, 4, 236, 49, 13, 27, 4, 234, 190, 13, 27, + 4, 233, 15, 13, 27, 4, 68, 13, 27, 4, 225, 217, 13, 27, 4, 225, 80, 13, + 27, 4, 159, 13, 27, 4, 221, 136, 13, 27, 4, 218, 55, 13, 27, 4, 72, 13, + 27, 4, 214, 3, 13, 27, 4, 211, 167, 13, 27, 4, 144, 13, 27, 4, 209, 80, + 13, 27, 4, 203, 216, 13, 27, 4, 66, 13, 27, 4, 199, 230, 13, 27, 4, 197, + 199, 13, 27, 4, 196, 222, 13, 27, 4, 196, 148, 13, 27, 4, 195, 158, 13, + 41, 6, 63, 13, 41, 6, 250, 112, 13, 41, 6, 247, 207, 13, 41, 6, 240, 231, + 13, 41, 6, 69, 13, 41, 6, 236, 49, 13, 41, 6, 234, 190, 13, 41, 6, 233, + 15, 13, 41, 6, 68, 13, 41, 6, 225, 217, 13, 41, 6, 225, 80, 13, 41, 6, + 159, 13, 41, 6, 221, 136, 13, 41, 6, 218, 55, 13, 41, 6, 72, 13, 41, 6, + 214, 3, 13, 41, 6, 211, 167, 13, 41, 6, 144, 13, 41, 6, 209, 80, 13, 41, + 6, 203, 216, 13, 41, 6, 66, 13, 41, 6, 199, 230, 13, 41, 6, 197, 199, 13, + 41, 6, 196, 222, 13, 41, 6, 196, 148, 13, 41, 6, 195, 158, 13, 41, 4, 63, + 13, 41, 4, 250, 112, 13, 41, 4, 247, 207, 13, 41, 4, 240, 231, 13, 41, 4, + 69, 13, 41, 4, 236, 49, 13, 41, 4, 234, 190, 13, 41, 4, 68, 13, 41, 4, + 225, 217, 13, 41, 4, 225, 80, 13, 41, 4, 159, 13, 41, 4, 221, 136, 13, + 41, 4, 218, 55, 13, 41, 4, 72, 13, 41, 4, 214, 3, 13, 41, 4, 211, 167, + 13, 41, 4, 144, 13, 41, 4, 209, 80, 13, 41, 4, 203, 216, 13, 41, 4, 66, + 13, 41, 4, 199, 230, 13, 41, 4, 197, 199, 13, 41, 4, 196, 222, 13, 41, 4, + 196, 148, 13, 41, 4, 195, 158, 13, 27, 41, 6, 63, 13, 27, 41, 6, 250, + 112, 13, 27, 41, 6, 247, 207, 13, 27, 41, 6, 240, 231, 13, 27, 41, 6, 69, + 13, 27, 41, 6, 236, 49, 13, 27, 41, 6, 234, 190, 13, 27, 41, 6, 233, 15, + 13, 27, 41, 6, 68, 13, 27, 41, 6, 225, 217, 13, 27, 41, 6, 225, 80, 13, + 27, 41, 6, 159, 13, 27, 41, 6, 221, 136, 13, 27, 41, 6, 218, 55, 13, 27, + 41, 6, 72, 13, 27, 41, 6, 214, 3, 13, 27, 41, 6, 211, 167, 13, 27, 41, 6, + 144, 13, 27, 41, 6, 209, 80, 13, 27, 41, 6, 203, 216, 13, 27, 41, 6, 66, + 13, 27, 41, 6, 199, 230, 13, 27, 41, 6, 197, 199, 13, 27, 41, 6, 196, + 222, 13, 27, 41, 6, 196, 148, 13, 27, 41, 6, 195, 158, 13, 27, 41, 4, 63, + 13, 27, 41, 4, 250, 112, 13, 27, 41, 4, 247, 207, 13, 27, 41, 4, 240, + 231, 13, 27, 41, 4, 69, 13, 27, 41, 4, 236, 49, 13, 27, 41, 4, 234, 190, + 13, 27, 41, 4, 233, 15, 13, 27, 41, 4, 68, 13, 27, 41, 4, 225, 217, 13, + 27, 41, 4, 225, 80, 13, 27, 41, 4, 159, 13, 27, 41, 4, 221, 136, 13, 27, + 41, 4, 218, 55, 13, 27, 41, 4, 72, 13, 27, 41, 4, 214, 3, 13, 27, 41, 4, + 211, 167, 13, 27, 41, 4, 144, 13, 27, 41, 4, 209, 80, 13, 27, 41, 4, 203, + 216, 13, 27, 41, 4, 66, 13, 27, 41, 4, 199, 230, 13, 27, 41, 4, 197, 199, + 13, 27, 41, 4, 196, 222, 13, 27, 41, 4, 196, 148, 13, 27, 41, 4, 195, + 158, 13, 145, 6, 63, 13, 145, 6, 247, 207, 13, 145, 6, 240, 231, 13, 145, + 6, 234, 190, 13, 145, 6, 225, 217, 13, 145, 6, 225, 80, 13, 145, 6, 218, + 55, 13, 145, 6, 72, 13, 145, 6, 214, 3, 13, 145, 6, 211, 167, 13, 145, 6, + 209, 80, 13, 145, 6, 203, 216, 13, 145, 6, 66, 13, 145, 6, 199, 230, 13, + 145, 6, 197, 199, 13, 145, 6, 196, 222, 13, 145, 6, 196, 148, 13, 145, 6, + 195, 158, 13, 145, 4, 63, 13, 145, 4, 250, 112, 13, 145, 4, 247, 207, 13, + 145, 4, 240, 231, 13, 145, 4, 236, 49, 13, 145, 4, 233, 15, 13, 145, 4, + 68, 13, 145, 4, 225, 217, 13, 145, 4, 225, 80, 13, 145, 4, 159, 13, 145, + 4, 221, 136, 13, 145, 4, 218, 55, 13, 145, 4, 214, 3, 13, 145, 4, 211, + 167, 13, 145, 4, 144, 13, 145, 4, 209, 80, 13, 145, 4, 203, 216, 13, 145, + 4, 66, 13, 145, 4, 199, 230, 13, 145, 4, 197, 199, 13, 145, 4, 196, 222, + 13, 145, 4, 196, 148, 13, 145, 4, 195, 158, 13, 27, 145, 6, 63, 13, 27, + 145, 6, 250, 112, 13, 27, 145, 6, 247, 207, 13, 27, 145, 6, 240, 231, 13, + 27, 145, 6, 69, 13, 27, 145, 6, 236, 49, 13, 27, 145, 6, 234, 190, 13, + 27, 145, 6, 233, 15, 13, 27, 145, 6, 68, 13, 27, 145, 6, 225, 217, 13, + 27, 145, 6, 225, 80, 13, 27, 145, 6, 159, 13, 27, 145, 6, 221, 136, 13, + 27, 145, 6, 218, 55, 13, 27, 145, 6, 72, 13, 27, 145, 6, 214, 3, 13, 27, + 145, 6, 211, 167, 13, 27, 145, 6, 144, 13, 27, 145, 6, 209, 80, 13, 27, + 145, 6, 203, 216, 13, 27, 145, 6, 66, 13, 27, 145, 6, 199, 230, 13, 27, + 145, 6, 197, 199, 13, 27, 145, 6, 196, 222, 13, 27, 145, 6, 196, 148, 13, + 27, 145, 6, 195, 158, 13, 27, 145, 4, 63, 13, 27, 145, 4, 250, 112, 13, + 27, 145, 4, 247, 207, 13, 27, 145, 4, 240, 231, 13, 27, 145, 4, 69, 13, + 27, 145, 4, 236, 49, 13, 27, 145, 4, 234, 190, 13, 27, 145, 4, 233, 15, + 13, 27, 145, 4, 68, 13, 27, 145, 4, 225, 217, 13, 27, 145, 4, 225, 80, + 13, 27, 145, 4, 159, 13, 27, 145, 4, 221, 136, 13, 27, 145, 4, 218, 55, + 13, 27, 145, 4, 72, 13, 27, 145, 4, 214, 3, 13, 27, 145, 4, 211, 167, 13, + 27, 145, 4, 144, 13, 27, 145, 4, 209, 80, 13, 27, 145, 4, 203, 216, 13, + 27, 145, 4, 66, 13, 27, 145, 4, 199, 230, 13, 27, 145, 4, 197, 199, 13, + 27, 145, 4, 196, 222, 13, 27, 145, 4, 196, 148, 13, 27, 145, 4, 195, 158, + 13, 187, 6, 63, 13, 187, 6, 250, 112, 13, 187, 6, 240, 231, 13, 187, 6, + 69, 13, 187, 6, 236, 49, 13, 187, 6, 234, 190, 13, 187, 6, 225, 217, 13, + 187, 6, 225, 80, 13, 187, 6, 159, 13, 187, 6, 221, 136, 13, 187, 6, 218, + 55, 13, 187, 6, 72, 13, 187, 6, 214, 3, 13, 187, 6, 211, 167, 13, 187, 6, 209, 80, 13, 187, 6, 203, 216, 13, 187, 6, 66, 13, 187, 6, 199, 230, 13, 187, 6, 197, 199, 13, 187, 6, 196, 222, 13, 187, 6, 196, 148, 13, 187, 4, - 63, 13, 187, 4, 250, 111, 13, 187, 4, 247, 206, 13, 187, 4, 240, 230, 13, - 187, 4, 69, 13, 187, 4, 236, 48, 13, 187, 4, 234, 189, 13, 187, 4, 233, - 14, 13, 187, 4, 68, 13, 187, 4, 225, 216, 13, 187, 4, 225, 79, 13, 187, - 4, 159, 13, 187, 4, 221, 135, 13, 187, 4, 218, 54, 13, 187, 4, 72, 13, - 187, 4, 214, 2, 13, 187, 4, 211, 166, 13, 187, 4, 144, 13, 187, 4, 209, + 63, 13, 187, 4, 250, 112, 13, 187, 4, 247, 207, 13, 187, 4, 240, 231, 13, + 187, 4, 69, 13, 187, 4, 236, 49, 13, 187, 4, 234, 190, 13, 187, 4, 233, + 15, 13, 187, 4, 68, 13, 187, 4, 225, 217, 13, 187, 4, 225, 80, 13, 187, + 4, 159, 13, 187, 4, 221, 136, 13, 187, 4, 218, 55, 13, 187, 4, 72, 13, + 187, 4, 214, 3, 13, 187, 4, 211, 167, 13, 187, 4, 144, 13, 187, 4, 209, 80, 13, 187, 4, 203, 216, 13, 187, 4, 66, 13, 187, 4, 199, 230, 13, 187, 4, 197, 199, 13, 187, 4, 196, 222, 13, 187, 4, 196, 148, 13, 187, 4, 195, - 158, 13, 237, 240, 6, 63, 13, 237, 240, 6, 250, 111, 13, 237, 240, 6, - 240, 230, 13, 237, 240, 6, 69, 13, 237, 240, 6, 236, 48, 13, 237, 240, 6, - 234, 189, 13, 237, 240, 6, 68, 13, 237, 240, 6, 225, 216, 13, 237, 240, - 6, 225, 79, 13, 237, 240, 6, 159, 13, 237, 240, 6, 221, 135, 13, 237, - 240, 6, 72, 13, 237, 240, 6, 209, 80, 13, 237, 240, 6, 203, 216, 13, 237, - 240, 6, 66, 13, 237, 240, 6, 199, 230, 13, 237, 240, 6, 197, 199, 13, - 237, 240, 6, 196, 222, 13, 237, 240, 6, 196, 148, 13, 237, 240, 4, 63, - 13, 237, 240, 4, 250, 111, 13, 237, 240, 4, 247, 206, 13, 237, 240, 4, - 240, 230, 13, 237, 240, 4, 69, 13, 237, 240, 4, 236, 48, 13, 237, 240, 4, - 234, 189, 13, 237, 240, 4, 233, 14, 13, 237, 240, 4, 68, 13, 237, 240, 4, - 225, 216, 13, 237, 240, 4, 225, 79, 13, 237, 240, 4, 159, 13, 237, 240, - 4, 221, 135, 13, 237, 240, 4, 218, 54, 13, 237, 240, 4, 72, 13, 237, 240, - 4, 214, 2, 13, 237, 240, 4, 211, 166, 13, 237, 240, 4, 144, 13, 237, 240, - 4, 209, 80, 13, 237, 240, 4, 203, 216, 13, 237, 240, 4, 66, 13, 237, 240, - 4, 199, 230, 13, 237, 240, 4, 197, 199, 13, 237, 240, 4, 196, 222, 13, - 237, 240, 4, 196, 148, 13, 237, 240, 4, 195, 158, 13, 27, 187, 6, 63, 13, - 27, 187, 6, 250, 111, 13, 27, 187, 6, 247, 206, 13, 27, 187, 6, 240, 230, - 13, 27, 187, 6, 69, 13, 27, 187, 6, 236, 48, 13, 27, 187, 6, 234, 189, - 13, 27, 187, 6, 233, 14, 13, 27, 187, 6, 68, 13, 27, 187, 6, 225, 216, - 13, 27, 187, 6, 225, 79, 13, 27, 187, 6, 159, 13, 27, 187, 6, 221, 135, - 13, 27, 187, 6, 218, 54, 13, 27, 187, 6, 72, 13, 27, 187, 6, 214, 2, 13, - 27, 187, 6, 211, 166, 13, 27, 187, 6, 144, 13, 27, 187, 6, 209, 80, 13, + 158, 13, 237, 241, 6, 63, 13, 237, 241, 6, 250, 112, 13, 237, 241, 6, + 240, 231, 13, 237, 241, 6, 69, 13, 237, 241, 6, 236, 49, 13, 237, 241, 6, + 234, 190, 13, 237, 241, 6, 68, 13, 237, 241, 6, 225, 217, 13, 237, 241, + 6, 225, 80, 13, 237, 241, 6, 159, 13, 237, 241, 6, 221, 136, 13, 237, + 241, 6, 72, 13, 237, 241, 6, 209, 80, 13, 237, 241, 6, 203, 216, 13, 237, + 241, 6, 66, 13, 237, 241, 6, 199, 230, 13, 237, 241, 6, 197, 199, 13, + 237, 241, 6, 196, 222, 13, 237, 241, 6, 196, 148, 13, 237, 241, 4, 63, + 13, 237, 241, 4, 250, 112, 13, 237, 241, 4, 247, 207, 13, 237, 241, 4, + 240, 231, 13, 237, 241, 4, 69, 13, 237, 241, 4, 236, 49, 13, 237, 241, 4, + 234, 190, 13, 237, 241, 4, 233, 15, 13, 237, 241, 4, 68, 13, 237, 241, 4, + 225, 217, 13, 237, 241, 4, 225, 80, 13, 237, 241, 4, 159, 13, 237, 241, + 4, 221, 136, 13, 237, 241, 4, 218, 55, 13, 237, 241, 4, 72, 13, 237, 241, + 4, 214, 3, 13, 237, 241, 4, 211, 167, 13, 237, 241, 4, 144, 13, 237, 241, + 4, 209, 80, 13, 237, 241, 4, 203, 216, 13, 237, 241, 4, 66, 13, 237, 241, + 4, 199, 230, 13, 237, 241, 4, 197, 199, 13, 237, 241, 4, 196, 222, 13, + 237, 241, 4, 196, 148, 13, 237, 241, 4, 195, 158, 13, 27, 187, 6, 63, 13, + 27, 187, 6, 250, 112, 13, 27, 187, 6, 247, 207, 13, 27, 187, 6, 240, 231, + 13, 27, 187, 6, 69, 13, 27, 187, 6, 236, 49, 13, 27, 187, 6, 234, 190, + 13, 27, 187, 6, 233, 15, 13, 27, 187, 6, 68, 13, 27, 187, 6, 225, 217, + 13, 27, 187, 6, 225, 80, 13, 27, 187, 6, 159, 13, 27, 187, 6, 221, 136, + 13, 27, 187, 6, 218, 55, 13, 27, 187, 6, 72, 13, 27, 187, 6, 214, 3, 13, + 27, 187, 6, 211, 167, 13, 27, 187, 6, 144, 13, 27, 187, 6, 209, 80, 13, 27, 187, 6, 203, 216, 13, 27, 187, 6, 66, 13, 27, 187, 6, 199, 230, 13, 27, 187, 6, 197, 199, 13, 27, 187, 6, 196, 222, 13, 27, 187, 6, 196, 148, - 13, 27, 187, 6, 195, 158, 13, 27, 187, 4, 63, 13, 27, 187, 4, 250, 111, - 13, 27, 187, 4, 247, 206, 13, 27, 187, 4, 240, 230, 13, 27, 187, 4, 69, - 13, 27, 187, 4, 236, 48, 13, 27, 187, 4, 234, 189, 13, 27, 187, 4, 233, - 14, 13, 27, 187, 4, 68, 13, 27, 187, 4, 225, 216, 13, 27, 187, 4, 225, - 79, 13, 27, 187, 4, 159, 13, 27, 187, 4, 221, 135, 13, 27, 187, 4, 218, - 54, 13, 27, 187, 4, 72, 13, 27, 187, 4, 214, 2, 13, 27, 187, 4, 211, 166, + 13, 27, 187, 6, 195, 158, 13, 27, 187, 4, 63, 13, 27, 187, 4, 250, 112, + 13, 27, 187, 4, 247, 207, 13, 27, 187, 4, 240, 231, 13, 27, 187, 4, 69, + 13, 27, 187, 4, 236, 49, 13, 27, 187, 4, 234, 190, 13, 27, 187, 4, 233, + 15, 13, 27, 187, 4, 68, 13, 27, 187, 4, 225, 217, 13, 27, 187, 4, 225, + 80, 13, 27, 187, 4, 159, 13, 27, 187, 4, 221, 136, 13, 27, 187, 4, 218, + 55, 13, 27, 187, 4, 72, 13, 27, 187, 4, 214, 3, 13, 27, 187, 4, 211, 167, 13, 27, 187, 4, 144, 13, 27, 187, 4, 209, 80, 13, 27, 187, 4, 203, 216, 13, 27, 187, 4, 66, 13, 27, 187, 4, 199, 230, 13, 27, 187, 4, 197, 199, 13, 27, 187, 4, 196, 222, 13, 27, 187, 4, 196, 148, 13, 27, 187, 4, 195, - 158, 13, 45, 6, 63, 13, 45, 6, 250, 111, 13, 45, 6, 247, 206, 13, 45, 6, - 240, 230, 13, 45, 6, 69, 13, 45, 6, 236, 48, 13, 45, 6, 234, 189, 13, 45, - 6, 233, 14, 13, 45, 6, 68, 13, 45, 6, 225, 216, 13, 45, 6, 225, 79, 13, - 45, 6, 159, 13, 45, 6, 221, 135, 13, 45, 6, 218, 54, 13, 45, 6, 72, 13, - 45, 6, 214, 2, 13, 45, 6, 211, 166, 13, 45, 6, 144, 13, 45, 6, 209, 80, + 158, 13, 45, 6, 63, 13, 45, 6, 250, 112, 13, 45, 6, 247, 207, 13, 45, 6, + 240, 231, 13, 45, 6, 69, 13, 45, 6, 236, 49, 13, 45, 6, 234, 190, 13, 45, + 6, 233, 15, 13, 45, 6, 68, 13, 45, 6, 225, 217, 13, 45, 6, 225, 80, 13, + 45, 6, 159, 13, 45, 6, 221, 136, 13, 45, 6, 218, 55, 13, 45, 6, 72, 13, + 45, 6, 214, 3, 13, 45, 6, 211, 167, 13, 45, 6, 144, 13, 45, 6, 209, 80, 13, 45, 6, 203, 216, 13, 45, 6, 66, 13, 45, 6, 199, 230, 13, 45, 6, 197, 199, 13, 45, 6, 196, 222, 13, 45, 6, 196, 148, 13, 45, 6, 195, 158, 13, - 45, 4, 63, 13, 45, 4, 250, 111, 13, 45, 4, 247, 206, 13, 45, 4, 240, 230, - 13, 45, 4, 69, 13, 45, 4, 236, 48, 13, 45, 4, 234, 189, 13, 45, 4, 233, - 14, 13, 45, 4, 68, 13, 45, 4, 225, 216, 13, 45, 4, 225, 79, 13, 45, 4, - 159, 13, 45, 4, 221, 135, 13, 45, 4, 218, 54, 13, 45, 4, 72, 13, 45, 4, - 214, 2, 13, 45, 4, 211, 166, 13, 45, 4, 144, 13, 45, 4, 209, 80, 13, 45, + 45, 4, 63, 13, 45, 4, 250, 112, 13, 45, 4, 247, 207, 13, 45, 4, 240, 231, + 13, 45, 4, 69, 13, 45, 4, 236, 49, 13, 45, 4, 234, 190, 13, 45, 4, 233, + 15, 13, 45, 4, 68, 13, 45, 4, 225, 217, 13, 45, 4, 225, 80, 13, 45, 4, + 159, 13, 45, 4, 221, 136, 13, 45, 4, 218, 55, 13, 45, 4, 72, 13, 45, 4, + 214, 3, 13, 45, 4, 211, 167, 13, 45, 4, 144, 13, 45, 4, 209, 80, 13, 45, 4, 203, 216, 13, 45, 4, 66, 13, 45, 4, 199, 230, 13, 45, 4, 197, 199, 13, 45, 4, 196, 222, 13, 45, 4, 196, 148, 13, 45, 4, 195, 158, 13, 45, 27, 6, - 63, 13, 45, 27, 6, 250, 111, 13, 45, 27, 6, 247, 206, 13, 45, 27, 6, 240, - 230, 13, 45, 27, 6, 69, 13, 45, 27, 6, 236, 48, 13, 45, 27, 6, 234, 189, - 13, 45, 27, 6, 233, 14, 13, 45, 27, 6, 68, 13, 45, 27, 6, 225, 216, 13, - 45, 27, 6, 225, 79, 13, 45, 27, 6, 159, 13, 45, 27, 6, 221, 135, 13, 45, - 27, 6, 218, 54, 13, 45, 27, 6, 72, 13, 45, 27, 6, 214, 2, 13, 45, 27, 6, - 211, 166, 13, 45, 27, 6, 144, 13, 45, 27, 6, 209, 80, 13, 45, 27, 6, 203, + 63, 13, 45, 27, 6, 250, 112, 13, 45, 27, 6, 247, 207, 13, 45, 27, 6, 240, + 231, 13, 45, 27, 6, 69, 13, 45, 27, 6, 236, 49, 13, 45, 27, 6, 234, 190, + 13, 45, 27, 6, 233, 15, 13, 45, 27, 6, 68, 13, 45, 27, 6, 225, 217, 13, + 45, 27, 6, 225, 80, 13, 45, 27, 6, 159, 13, 45, 27, 6, 221, 136, 13, 45, + 27, 6, 218, 55, 13, 45, 27, 6, 72, 13, 45, 27, 6, 214, 3, 13, 45, 27, 6, + 211, 167, 13, 45, 27, 6, 144, 13, 45, 27, 6, 209, 80, 13, 45, 27, 6, 203, 216, 13, 45, 27, 6, 66, 13, 45, 27, 6, 199, 230, 13, 45, 27, 6, 197, 199, 13, 45, 27, 6, 196, 222, 13, 45, 27, 6, 196, 148, 13, 45, 27, 6, 195, - 158, 13, 45, 27, 4, 63, 13, 45, 27, 4, 250, 111, 13, 45, 27, 4, 247, 206, - 13, 45, 27, 4, 240, 230, 13, 45, 27, 4, 69, 13, 45, 27, 4, 236, 48, 13, - 45, 27, 4, 234, 189, 13, 45, 27, 4, 233, 14, 13, 45, 27, 4, 68, 13, 45, - 27, 4, 225, 216, 13, 45, 27, 4, 225, 79, 13, 45, 27, 4, 159, 13, 45, 27, - 4, 221, 135, 13, 45, 27, 4, 218, 54, 13, 45, 27, 4, 72, 13, 45, 27, 4, - 214, 2, 13, 45, 27, 4, 211, 166, 13, 45, 27, 4, 144, 13, 45, 27, 4, 209, + 158, 13, 45, 27, 4, 63, 13, 45, 27, 4, 250, 112, 13, 45, 27, 4, 247, 207, + 13, 45, 27, 4, 240, 231, 13, 45, 27, 4, 69, 13, 45, 27, 4, 236, 49, 13, + 45, 27, 4, 234, 190, 13, 45, 27, 4, 233, 15, 13, 45, 27, 4, 68, 13, 45, + 27, 4, 225, 217, 13, 45, 27, 4, 225, 80, 13, 45, 27, 4, 159, 13, 45, 27, + 4, 221, 136, 13, 45, 27, 4, 218, 55, 13, 45, 27, 4, 72, 13, 45, 27, 4, + 214, 3, 13, 45, 27, 4, 211, 167, 13, 45, 27, 4, 144, 13, 45, 27, 4, 209, 80, 13, 45, 27, 4, 203, 216, 13, 45, 27, 4, 66, 13, 45, 27, 4, 199, 230, 13, 45, 27, 4, 197, 199, 13, 45, 27, 4, 196, 222, 13, 45, 27, 4, 196, - 148, 13, 45, 27, 4, 195, 158, 13, 45, 41, 6, 63, 13, 45, 41, 6, 250, 111, - 13, 45, 41, 6, 247, 206, 13, 45, 41, 6, 240, 230, 13, 45, 41, 6, 69, 13, - 45, 41, 6, 236, 48, 13, 45, 41, 6, 234, 189, 13, 45, 41, 6, 233, 14, 13, - 45, 41, 6, 68, 13, 45, 41, 6, 225, 216, 13, 45, 41, 6, 225, 79, 13, 45, - 41, 6, 159, 13, 45, 41, 6, 221, 135, 13, 45, 41, 6, 218, 54, 13, 45, 41, - 6, 72, 13, 45, 41, 6, 214, 2, 13, 45, 41, 6, 211, 166, 13, 45, 41, 6, + 148, 13, 45, 27, 4, 195, 158, 13, 45, 41, 6, 63, 13, 45, 41, 6, 250, 112, + 13, 45, 41, 6, 247, 207, 13, 45, 41, 6, 240, 231, 13, 45, 41, 6, 69, 13, + 45, 41, 6, 236, 49, 13, 45, 41, 6, 234, 190, 13, 45, 41, 6, 233, 15, 13, + 45, 41, 6, 68, 13, 45, 41, 6, 225, 217, 13, 45, 41, 6, 225, 80, 13, 45, + 41, 6, 159, 13, 45, 41, 6, 221, 136, 13, 45, 41, 6, 218, 55, 13, 45, 41, + 6, 72, 13, 45, 41, 6, 214, 3, 13, 45, 41, 6, 211, 167, 13, 45, 41, 6, 144, 13, 45, 41, 6, 209, 80, 13, 45, 41, 6, 203, 216, 13, 45, 41, 6, 66, 13, 45, 41, 6, 199, 230, 13, 45, 41, 6, 197, 199, 13, 45, 41, 6, 196, 222, 13, 45, 41, 6, 196, 148, 13, 45, 41, 6, 195, 158, 13, 45, 41, 4, 63, - 13, 45, 41, 4, 250, 111, 13, 45, 41, 4, 247, 206, 13, 45, 41, 4, 240, - 230, 13, 45, 41, 4, 69, 13, 45, 41, 4, 236, 48, 13, 45, 41, 4, 234, 189, - 13, 45, 41, 4, 233, 14, 13, 45, 41, 4, 68, 13, 45, 41, 4, 225, 216, 13, - 45, 41, 4, 225, 79, 13, 45, 41, 4, 159, 13, 45, 41, 4, 221, 135, 13, 45, - 41, 4, 218, 54, 13, 45, 41, 4, 72, 13, 45, 41, 4, 214, 2, 13, 45, 41, 4, - 211, 166, 13, 45, 41, 4, 144, 13, 45, 41, 4, 209, 80, 13, 45, 41, 4, 203, + 13, 45, 41, 4, 250, 112, 13, 45, 41, 4, 247, 207, 13, 45, 41, 4, 240, + 231, 13, 45, 41, 4, 69, 13, 45, 41, 4, 236, 49, 13, 45, 41, 4, 234, 190, + 13, 45, 41, 4, 233, 15, 13, 45, 41, 4, 68, 13, 45, 41, 4, 225, 217, 13, + 45, 41, 4, 225, 80, 13, 45, 41, 4, 159, 13, 45, 41, 4, 221, 136, 13, 45, + 41, 4, 218, 55, 13, 45, 41, 4, 72, 13, 45, 41, 4, 214, 3, 13, 45, 41, 4, + 211, 167, 13, 45, 41, 4, 144, 13, 45, 41, 4, 209, 80, 13, 45, 41, 4, 203, 216, 13, 45, 41, 4, 66, 13, 45, 41, 4, 199, 230, 13, 45, 41, 4, 197, 199, 13, 45, 41, 4, 196, 222, 13, 45, 41, 4, 196, 148, 13, 45, 41, 4, 195, - 158, 13, 45, 27, 41, 6, 63, 13, 45, 27, 41, 6, 250, 111, 13, 45, 27, 41, - 6, 247, 206, 13, 45, 27, 41, 6, 240, 230, 13, 45, 27, 41, 6, 69, 13, 45, - 27, 41, 6, 236, 48, 13, 45, 27, 41, 6, 234, 189, 13, 45, 27, 41, 6, 233, - 14, 13, 45, 27, 41, 6, 68, 13, 45, 27, 41, 6, 225, 216, 13, 45, 27, 41, - 6, 225, 79, 13, 45, 27, 41, 6, 159, 13, 45, 27, 41, 6, 221, 135, 13, 45, - 27, 41, 6, 218, 54, 13, 45, 27, 41, 6, 72, 13, 45, 27, 41, 6, 214, 2, 13, - 45, 27, 41, 6, 211, 166, 13, 45, 27, 41, 6, 144, 13, 45, 27, 41, 6, 209, + 158, 13, 45, 27, 41, 6, 63, 13, 45, 27, 41, 6, 250, 112, 13, 45, 27, 41, + 6, 247, 207, 13, 45, 27, 41, 6, 240, 231, 13, 45, 27, 41, 6, 69, 13, 45, + 27, 41, 6, 236, 49, 13, 45, 27, 41, 6, 234, 190, 13, 45, 27, 41, 6, 233, + 15, 13, 45, 27, 41, 6, 68, 13, 45, 27, 41, 6, 225, 217, 13, 45, 27, 41, + 6, 225, 80, 13, 45, 27, 41, 6, 159, 13, 45, 27, 41, 6, 221, 136, 13, 45, + 27, 41, 6, 218, 55, 13, 45, 27, 41, 6, 72, 13, 45, 27, 41, 6, 214, 3, 13, + 45, 27, 41, 6, 211, 167, 13, 45, 27, 41, 6, 144, 13, 45, 27, 41, 6, 209, 80, 13, 45, 27, 41, 6, 203, 216, 13, 45, 27, 41, 6, 66, 13, 45, 27, 41, 6, 199, 230, 13, 45, 27, 41, 6, 197, 199, 13, 45, 27, 41, 6, 196, 222, 13, 45, 27, 41, 6, 196, 148, 13, 45, 27, 41, 6, 195, 158, 13, 45, 27, 41, - 4, 63, 13, 45, 27, 41, 4, 250, 111, 13, 45, 27, 41, 4, 247, 206, 13, 45, - 27, 41, 4, 240, 230, 13, 45, 27, 41, 4, 69, 13, 45, 27, 41, 4, 236, 48, - 13, 45, 27, 41, 4, 234, 189, 13, 45, 27, 41, 4, 233, 14, 13, 45, 27, 41, - 4, 68, 13, 45, 27, 41, 4, 225, 216, 13, 45, 27, 41, 4, 225, 79, 13, 45, - 27, 41, 4, 159, 13, 45, 27, 41, 4, 221, 135, 13, 45, 27, 41, 4, 218, 54, - 13, 45, 27, 41, 4, 72, 13, 45, 27, 41, 4, 214, 2, 13, 45, 27, 41, 4, 211, - 166, 13, 45, 27, 41, 4, 144, 13, 45, 27, 41, 4, 209, 80, 13, 45, 27, 41, + 4, 63, 13, 45, 27, 41, 4, 250, 112, 13, 45, 27, 41, 4, 247, 207, 13, 45, + 27, 41, 4, 240, 231, 13, 45, 27, 41, 4, 69, 13, 45, 27, 41, 4, 236, 49, + 13, 45, 27, 41, 4, 234, 190, 13, 45, 27, 41, 4, 233, 15, 13, 45, 27, 41, + 4, 68, 13, 45, 27, 41, 4, 225, 217, 13, 45, 27, 41, 4, 225, 80, 13, 45, + 27, 41, 4, 159, 13, 45, 27, 41, 4, 221, 136, 13, 45, 27, 41, 4, 218, 55, + 13, 45, 27, 41, 4, 72, 13, 45, 27, 41, 4, 214, 3, 13, 45, 27, 41, 4, 211, + 167, 13, 45, 27, 41, 4, 144, 13, 45, 27, 41, 4, 209, 80, 13, 45, 27, 41, 4, 203, 216, 13, 45, 27, 41, 4, 66, 13, 45, 27, 41, 4, 199, 230, 13, 45, 27, 41, 4, 197, 199, 13, 45, 27, 41, 4, 196, 222, 13, 45, 27, 41, 4, 196, - 148, 13, 45, 27, 41, 4, 195, 158, 13, 218, 200, 6, 63, 13, 218, 200, 6, - 250, 111, 13, 218, 200, 6, 247, 206, 13, 218, 200, 6, 240, 230, 13, 218, - 200, 6, 69, 13, 218, 200, 6, 236, 48, 13, 218, 200, 6, 234, 189, 13, 218, - 200, 6, 233, 14, 13, 218, 200, 6, 68, 13, 218, 200, 6, 225, 216, 13, 218, - 200, 6, 225, 79, 13, 218, 200, 6, 159, 13, 218, 200, 6, 221, 135, 13, - 218, 200, 6, 218, 54, 13, 218, 200, 6, 72, 13, 218, 200, 6, 214, 2, 13, - 218, 200, 6, 211, 166, 13, 218, 200, 6, 144, 13, 218, 200, 6, 209, 80, - 13, 218, 200, 6, 203, 216, 13, 218, 200, 6, 66, 13, 218, 200, 6, 199, - 230, 13, 218, 200, 6, 197, 199, 13, 218, 200, 6, 196, 222, 13, 218, 200, - 6, 196, 148, 13, 218, 200, 6, 195, 158, 13, 218, 200, 4, 63, 13, 218, - 200, 4, 250, 111, 13, 218, 200, 4, 247, 206, 13, 218, 200, 4, 240, 230, - 13, 218, 200, 4, 69, 13, 218, 200, 4, 236, 48, 13, 218, 200, 4, 234, 189, - 13, 218, 200, 4, 233, 14, 13, 218, 200, 4, 68, 13, 218, 200, 4, 225, 216, - 13, 218, 200, 4, 225, 79, 13, 218, 200, 4, 159, 13, 218, 200, 4, 221, - 135, 13, 218, 200, 4, 218, 54, 13, 218, 200, 4, 72, 13, 218, 200, 4, 214, - 2, 13, 218, 200, 4, 211, 166, 13, 218, 200, 4, 144, 13, 218, 200, 4, 209, - 80, 13, 218, 200, 4, 203, 216, 13, 218, 200, 4, 66, 13, 218, 200, 4, 199, - 230, 13, 218, 200, 4, 197, 199, 13, 218, 200, 4, 196, 222, 13, 218, 200, - 4, 196, 148, 13, 218, 200, 4, 195, 158, 13, 41, 4, 238, 251, 68, 13, 41, - 4, 238, 251, 225, 216, 13, 27, 6, 251, 133, 13, 27, 6, 248, 205, 13, 27, - 6, 234, 93, 13, 27, 6, 239, 211, 13, 27, 6, 236, 173, 13, 27, 6, 195, 78, - 13, 27, 6, 236, 125, 13, 27, 6, 202, 199, 13, 27, 6, 226, 6, 13, 27, 6, - 225, 1, 13, 27, 6, 222, 244, 13, 27, 6, 218, 144, 13, 27, 6, 215, 185, - 13, 27, 6, 196, 196, 13, 27, 6, 214, 121, 13, 27, 6, 212, 219, 13, 27, 6, + 148, 13, 45, 27, 41, 4, 195, 158, 13, 218, 201, 6, 63, 13, 218, 201, 6, + 250, 112, 13, 218, 201, 6, 247, 207, 13, 218, 201, 6, 240, 231, 13, 218, + 201, 6, 69, 13, 218, 201, 6, 236, 49, 13, 218, 201, 6, 234, 190, 13, 218, + 201, 6, 233, 15, 13, 218, 201, 6, 68, 13, 218, 201, 6, 225, 217, 13, 218, + 201, 6, 225, 80, 13, 218, 201, 6, 159, 13, 218, 201, 6, 221, 136, 13, + 218, 201, 6, 218, 55, 13, 218, 201, 6, 72, 13, 218, 201, 6, 214, 3, 13, + 218, 201, 6, 211, 167, 13, 218, 201, 6, 144, 13, 218, 201, 6, 209, 80, + 13, 218, 201, 6, 203, 216, 13, 218, 201, 6, 66, 13, 218, 201, 6, 199, + 230, 13, 218, 201, 6, 197, 199, 13, 218, 201, 6, 196, 222, 13, 218, 201, + 6, 196, 148, 13, 218, 201, 6, 195, 158, 13, 218, 201, 4, 63, 13, 218, + 201, 4, 250, 112, 13, 218, 201, 4, 247, 207, 13, 218, 201, 4, 240, 231, + 13, 218, 201, 4, 69, 13, 218, 201, 4, 236, 49, 13, 218, 201, 4, 234, 190, + 13, 218, 201, 4, 233, 15, 13, 218, 201, 4, 68, 13, 218, 201, 4, 225, 217, + 13, 218, 201, 4, 225, 80, 13, 218, 201, 4, 159, 13, 218, 201, 4, 221, + 136, 13, 218, 201, 4, 218, 55, 13, 218, 201, 4, 72, 13, 218, 201, 4, 214, + 3, 13, 218, 201, 4, 211, 167, 13, 218, 201, 4, 144, 13, 218, 201, 4, 209, + 80, 13, 218, 201, 4, 203, 216, 13, 218, 201, 4, 66, 13, 218, 201, 4, 199, + 230, 13, 218, 201, 4, 197, 199, 13, 218, 201, 4, 196, 222, 13, 218, 201, + 4, 196, 148, 13, 218, 201, 4, 195, 158, 13, 41, 4, 238, 252, 68, 13, 41, + 4, 238, 252, 225, 217, 13, 27, 6, 251, 134, 13, 27, 6, 248, 206, 13, 27, + 6, 234, 94, 13, 27, 6, 239, 212, 13, 27, 6, 236, 174, 13, 27, 6, 195, 78, + 13, 27, 6, 236, 126, 13, 27, 6, 202, 199, 13, 27, 6, 226, 7, 13, 27, 6, + 225, 2, 13, 27, 6, 222, 245, 13, 27, 6, 218, 145, 13, 27, 6, 215, 186, + 13, 27, 6, 196, 196, 13, 27, 6, 214, 122, 13, 27, 6, 212, 220, 13, 27, 6, 210, 74, 13, 27, 6, 202, 200, 105, 13, 27, 6, 206, 86, 13, 27, 6, 203, - 89, 13, 27, 6, 200, 28, 13, 27, 6, 212, 245, 13, 27, 6, 245, 74, 13, 27, - 6, 211, 237, 13, 27, 6, 214, 123, 13, 27, 217, 238, 13, 27, 4, 251, 133, - 13, 27, 4, 248, 205, 13, 27, 4, 234, 93, 13, 27, 4, 239, 211, 13, 27, 4, - 236, 173, 13, 27, 4, 195, 78, 13, 27, 4, 236, 125, 13, 27, 4, 202, 199, - 13, 27, 4, 226, 6, 13, 27, 4, 225, 1, 13, 27, 4, 222, 244, 13, 27, 4, - 218, 144, 13, 27, 4, 215, 185, 13, 27, 4, 196, 196, 13, 27, 4, 214, 121, - 13, 27, 4, 212, 219, 13, 27, 4, 210, 74, 13, 27, 4, 48, 206, 86, 13, 27, - 4, 206, 86, 13, 27, 4, 203, 89, 13, 27, 4, 200, 28, 13, 27, 4, 212, 245, - 13, 27, 4, 245, 74, 13, 27, 4, 211, 237, 13, 27, 4, 214, 123, 13, 27, - 213, 131, 239, 123, 13, 27, 236, 174, 105, 13, 27, 202, 200, 105, 13, 27, - 225, 2, 105, 13, 27, 212, 246, 105, 13, 27, 210, 75, 105, 13, 27, 212, - 220, 105, 13, 41, 6, 251, 133, 13, 41, 6, 248, 205, 13, 41, 6, 234, 93, - 13, 41, 6, 239, 211, 13, 41, 6, 236, 173, 13, 41, 6, 195, 78, 13, 41, 6, - 236, 125, 13, 41, 6, 202, 199, 13, 41, 6, 226, 6, 13, 41, 6, 225, 1, 13, - 41, 6, 222, 244, 13, 41, 6, 218, 144, 13, 41, 6, 215, 185, 13, 41, 6, - 196, 196, 13, 41, 6, 214, 121, 13, 41, 6, 212, 219, 13, 41, 6, 210, 74, + 89, 13, 27, 6, 200, 28, 13, 27, 6, 212, 246, 13, 27, 6, 245, 75, 13, 27, + 6, 211, 238, 13, 27, 6, 214, 124, 13, 27, 217, 239, 13, 27, 4, 251, 134, + 13, 27, 4, 248, 206, 13, 27, 4, 234, 94, 13, 27, 4, 239, 212, 13, 27, 4, + 236, 174, 13, 27, 4, 195, 78, 13, 27, 4, 236, 126, 13, 27, 4, 202, 199, + 13, 27, 4, 226, 7, 13, 27, 4, 225, 2, 13, 27, 4, 222, 245, 13, 27, 4, + 218, 145, 13, 27, 4, 215, 186, 13, 27, 4, 196, 196, 13, 27, 4, 214, 122, + 13, 27, 4, 212, 220, 13, 27, 4, 210, 74, 13, 27, 4, 48, 206, 86, 13, 27, + 4, 206, 86, 13, 27, 4, 203, 89, 13, 27, 4, 200, 28, 13, 27, 4, 212, 246, + 13, 27, 4, 245, 75, 13, 27, 4, 211, 238, 13, 27, 4, 214, 124, 13, 27, + 213, 132, 239, 124, 13, 27, 236, 175, 105, 13, 27, 202, 200, 105, 13, 27, + 225, 3, 105, 13, 27, 212, 247, 105, 13, 27, 210, 75, 105, 13, 27, 212, + 221, 105, 13, 41, 6, 251, 134, 13, 41, 6, 248, 206, 13, 41, 6, 234, 94, + 13, 41, 6, 239, 212, 13, 41, 6, 236, 174, 13, 41, 6, 195, 78, 13, 41, 6, + 236, 126, 13, 41, 6, 202, 199, 13, 41, 6, 226, 7, 13, 41, 6, 225, 2, 13, + 41, 6, 222, 245, 13, 41, 6, 218, 145, 13, 41, 6, 215, 186, 13, 41, 6, + 196, 196, 13, 41, 6, 214, 122, 13, 41, 6, 212, 220, 13, 41, 6, 210, 74, 13, 41, 6, 202, 200, 105, 13, 41, 6, 206, 86, 13, 41, 6, 203, 89, 13, 41, - 6, 200, 28, 13, 41, 6, 212, 245, 13, 41, 6, 245, 74, 13, 41, 6, 211, 237, - 13, 41, 6, 214, 123, 13, 41, 217, 238, 13, 41, 4, 251, 133, 13, 41, 4, - 248, 205, 13, 41, 4, 234, 93, 13, 41, 4, 239, 211, 13, 41, 4, 236, 173, - 13, 41, 4, 195, 78, 13, 41, 4, 236, 125, 13, 41, 4, 202, 199, 13, 41, 4, - 226, 6, 13, 41, 4, 225, 1, 13, 41, 4, 222, 244, 13, 41, 4, 218, 144, 13, - 41, 4, 215, 185, 13, 41, 4, 196, 196, 13, 41, 4, 214, 121, 13, 41, 4, - 212, 219, 13, 41, 4, 210, 74, 13, 41, 4, 48, 206, 86, 13, 41, 4, 206, 86, - 13, 41, 4, 203, 89, 13, 41, 4, 200, 28, 13, 41, 4, 212, 245, 13, 41, 4, - 245, 74, 13, 41, 4, 211, 237, 13, 41, 4, 214, 123, 13, 41, 213, 131, 239, - 123, 13, 41, 236, 174, 105, 13, 41, 202, 200, 105, 13, 41, 225, 2, 105, - 13, 41, 212, 246, 105, 13, 41, 210, 75, 105, 13, 41, 212, 220, 105, 13, - 27, 41, 6, 251, 133, 13, 27, 41, 6, 248, 205, 13, 27, 41, 6, 234, 93, 13, - 27, 41, 6, 239, 211, 13, 27, 41, 6, 236, 173, 13, 27, 41, 6, 195, 78, 13, - 27, 41, 6, 236, 125, 13, 27, 41, 6, 202, 199, 13, 27, 41, 6, 226, 6, 13, - 27, 41, 6, 225, 1, 13, 27, 41, 6, 222, 244, 13, 27, 41, 6, 218, 144, 13, - 27, 41, 6, 215, 185, 13, 27, 41, 6, 196, 196, 13, 27, 41, 6, 214, 121, - 13, 27, 41, 6, 212, 219, 13, 27, 41, 6, 210, 74, 13, 27, 41, 6, 202, 200, + 6, 200, 28, 13, 41, 6, 212, 246, 13, 41, 6, 245, 75, 13, 41, 6, 211, 238, + 13, 41, 6, 214, 124, 13, 41, 217, 239, 13, 41, 4, 251, 134, 13, 41, 4, + 248, 206, 13, 41, 4, 234, 94, 13, 41, 4, 239, 212, 13, 41, 4, 236, 174, + 13, 41, 4, 195, 78, 13, 41, 4, 236, 126, 13, 41, 4, 202, 199, 13, 41, 4, + 226, 7, 13, 41, 4, 225, 2, 13, 41, 4, 222, 245, 13, 41, 4, 218, 145, 13, + 41, 4, 215, 186, 13, 41, 4, 196, 196, 13, 41, 4, 214, 122, 13, 41, 4, + 212, 220, 13, 41, 4, 210, 74, 13, 41, 4, 48, 206, 86, 13, 41, 4, 206, 86, + 13, 41, 4, 203, 89, 13, 41, 4, 200, 28, 13, 41, 4, 212, 246, 13, 41, 4, + 245, 75, 13, 41, 4, 211, 238, 13, 41, 4, 214, 124, 13, 41, 213, 132, 239, + 124, 13, 41, 236, 175, 105, 13, 41, 202, 200, 105, 13, 41, 225, 3, 105, + 13, 41, 212, 247, 105, 13, 41, 210, 75, 105, 13, 41, 212, 221, 105, 13, + 27, 41, 6, 251, 134, 13, 27, 41, 6, 248, 206, 13, 27, 41, 6, 234, 94, 13, + 27, 41, 6, 239, 212, 13, 27, 41, 6, 236, 174, 13, 27, 41, 6, 195, 78, 13, + 27, 41, 6, 236, 126, 13, 27, 41, 6, 202, 199, 13, 27, 41, 6, 226, 7, 13, + 27, 41, 6, 225, 2, 13, 27, 41, 6, 222, 245, 13, 27, 41, 6, 218, 145, 13, + 27, 41, 6, 215, 186, 13, 27, 41, 6, 196, 196, 13, 27, 41, 6, 214, 122, + 13, 27, 41, 6, 212, 220, 13, 27, 41, 6, 210, 74, 13, 27, 41, 6, 202, 200, 105, 13, 27, 41, 6, 206, 86, 13, 27, 41, 6, 203, 89, 13, 27, 41, 6, 200, - 28, 13, 27, 41, 6, 212, 245, 13, 27, 41, 6, 245, 74, 13, 27, 41, 6, 211, - 237, 13, 27, 41, 6, 214, 123, 13, 27, 41, 217, 238, 13, 27, 41, 4, 251, - 133, 13, 27, 41, 4, 248, 205, 13, 27, 41, 4, 234, 93, 13, 27, 41, 4, 239, - 211, 13, 27, 41, 4, 236, 173, 13, 27, 41, 4, 195, 78, 13, 27, 41, 4, 236, - 125, 13, 27, 41, 4, 202, 199, 13, 27, 41, 4, 226, 6, 13, 27, 41, 4, 225, - 1, 13, 27, 41, 4, 222, 244, 13, 27, 41, 4, 218, 144, 13, 27, 41, 4, 215, - 185, 13, 27, 41, 4, 196, 196, 13, 27, 41, 4, 214, 121, 13, 27, 41, 4, - 212, 219, 13, 27, 41, 4, 210, 74, 13, 27, 41, 4, 48, 206, 86, 13, 27, 41, + 28, 13, 27, 41, 6, 212, 246, 13, 27, 41, 6, 245, 75, 13, 27, 41, 6, 211, + 238, 13, 27, 41, 6, 214, 124, 13, 27, 41, 217, 239, 13, 27, 41, 4, 251, + 134, 13, 27, 41, 4, 248, 206, 13, 27, 41, 4, 234, 94, 13, 27, 41, 4, 239, + 212, 13, 27, 41, 4, 236, 174, 13, 27, 41, 4, 195, 78, 13, 27, 41, 4, 236, + 126, 13, 27, 41, 4, 202, 199, 13, 27, 41, 4, 226, 7, 13, 27, 41, 4, 225, + 2, 13, 27, 41, 4, 222, 245, 13, 27, 41, 4, 218, 145, 13, 27, 41, 4, 215, + 186, 13, 27, 41, 4, 196, 196, 13, 27, 41, 4, 214, 122, 13, 27, 41, 4, + 212, 220, 13, 27, 41, 4, 210, 74, 13, 27, 41, 4, 48, 206, 86, 13, 27, 41, 4, 206, 86, 13, 27, 41, 4, 203, 89, 13, 27, 41, 4, 200, 28, 13, 27, 41, - 4, 212, 245, 13, 27, 41, 4, 245, 74, 13, 27, 41, 4, 211, 237, 13, 27, 41, - 4, 214, 123, 13, 27, 41, 213, 131, 239, 123, 13, 27, 41, 236, 174, 105, - 13, 27, 41, 202, 200, 105, 13, 27, 41, 225, 2, 105, 13, 27, 41, 212, 246, - 105, 13, 27, 41, 210, 75, 105, 13, 27, 41, 212, 220, 105, 13, 45, 27, 6, - 251, 133, 13, 45, 27, 6, 248, 205, 13, 45, 27, 6, 234, 93, 13, 45, 27, 6, - 239, 211, 13, 45, 27, 6, 236, 173, 13, 45, 27, 6, 195, 78, 13, 45, 27, 6, - 236, 125, 13, 45, 27, 6, 202, 199, 13, 45, 27, 6, 226, 6, 13, 45, 27, 6, - 225, 1, 13, 45, 27, 6, 222, 244, 13, 45, 27, 6, 218, 144, 13, 45, 27, 6, - 215, 185, 13, 45, 27, 6, 196, 196, 13, 45, 27, 6, 214, 121, 13, 45, 27, - 6, 212, 219, 13, 45, 27, 6, 210, 74, 13, 45, 27, 6, 202, 200, 105, 13, + 4, 212, 246, 13, 27, 41, 4, 245, 75, 13, 27, 41, 4, 211, 238, 13, 27, 41, + 4, 214, 124, 13, 27, 41, 213, 132, 239, 124, 13, 27, 41, 236, 175, 105, + 13, 27, 41, 202, 200, 105, 13, 27, 41, 225, 3, 105, 13, 27, 41, 212, 247, + 105, 13, 27, 41, 210, 75, 105, 13, 27, 41, 212, 221, 105, 13, 45, 27, 6, + 251, 134, 13, 45, 27, 6, 248, 206, 13, 45, 27, 6, 234, 94, 13, 45, 27, 6, + 239, 212, 13, 45, 27, 6, 236, 174, 13, 45, 27, 6, 195, 78, 13, 45, 27, 6, + 236, 126, 13, 45, 27, 6, 202, 199, 13, 45, 27, 6, 226, 7, 13, 45, 27, 6, + 225, 2, 13, 45, 27, 6, 222, 245, 13, 45, 27, 6, 218, 145, 13, 45, 27, 6, + 215, 186, 13, 45, 27, 6, 196, 196, 13, 45, 27, 6, 214, 122, 13, 45, 27, + 6, 212, 220, 13, 45, 27, 6, 210, 74, 13, 45, 27, 6, 202, 200, 105, 13, 45, 27, 6, 206, 86, 13, 45, 27, 6, 203, 89, 13, 45, 27, 6, 200, 28, 13, - 45, 27, 6, 212, 245, 13, 45, 27, 6, 245, 74, 13, 45, 27, 6, 211, 237, 13, - 45, 27, 6, 214, 123, 13, 45, 27, 217, 238, 13, 45, 27, 4, 251, 133, 13, - 45, 27, 4, 248, 205, 13, 45, 27, 4, 234, 93, 13, 45, 27, 4, 239, 211, 13, - 45, 27, 4, 236, 173, 13, 45, 27, 4, 195, 78, 13, 45, 27, 4, 236, 125, 13, - 45, 27, 4, 202, 199, 13, 45, 27, 4, 226, 6, 13, 45, 27, 4, 225, 1, 13, - 45, 27, 4, 222, 244, 13, 45, 27, 4, 218, 144, 13, 45, 27, 4, 215, 185, - 13, 45, 27, 4, 196, 196, 13, 45, 27, 4, 214, 121, 13, 45, 27, 4, 212, - 219, 13, 45, 27, 4, 210, 74, 13, 45, 27, 4, 48, 206, 86, 13, 45, 27, 4, + 45, 27, 6, 212, 246, 13, 45, 27, 6, 245, 75, 13, 45, 27, 6, 211, 238, 13, + 45, 27, 6, 214, 124, 13, 45, 27, 217, 239, 13, 45, 27, 4, 251, 134, 13, + 45, 27, 4, 248, 206, 13, 45, 27, 4, 234, 94, 13, 45, 27, 4, 239, 212, 13, + 45, 27, 4, 236, 174, 13, 45, 27, 4, 195, 78, 13, 45, 27, 4, 236, 126, 13, + 45, 27, 4, 202, 199, 13, 45, 27, 4, 226, 7, 13, 45, 27, 4, 225, 2, 13, + 45, 27, 4, 222, 245, 13, 45, 27, 4, 218, 145, 13, 45, 27, 4, 215, 186, + 13, 45, 27, 4, 196, 196, 13, 45, 27, 4, 214, 122, 13, 45, 27, 4, 212, + 220, 13, 45, 27, 4, 210, 74, 13, 45, 27, 4, 48, 206, 86, 13, 45, 27, 4, 206, 86, 13, 45, 27, 4, 203, 89, 13, 45, 27, 4, 200, 28, 13, 45, 27, 4, - 212, 245, 13, 45, 27, 4, 245, 74, 13, 45, 27, 4, 211, 237, 13, 45, 27, 4, - 214, 123, 13, 45, 27, 213, 131, 239, 123, 13, 45, 27, 236, 174, 105, 13, - 45, 27, 202, 200, 105, 13, 45, 27, 225, 2, 105, 13, 45, 27, 212, 246, - 105, 13, 45, 27, 210, 75, 105, 13, 45, 27, 212, 220, 105, 13, 45, 27, 41, - 6, 251, 133, 13, 45, 27, 41, 6, 248, 205, 13, 45, 27, 41, 6, 234, 93, 13, - 45, 27, 41, 6, 239, 211, 13, 45, 27, 41, 6, 236, 173, 13, 45, 27, 41, 6, - 195, 78, 13, 45, 27, 41, 6, 236, 125, 13, 45, 27, 41, 6, 202, 199, 13, - 45, 27, 41, 6, 226, 6, 13, 45, 27, 41, 6, 225, 1, 13, 45, 27, 41, 6, 222, - 244, 13, 45, 27, 41, 6, 218, 144, 13, 45, 27, 41, 6, 215, 185, 13, 45, - 27, 41, 6, 196, 196, 13, 45, 27, 41, 6, 214, 121, 13, 45, 27, 41, 6, 212, - 219, 13, 45, 27, 41, 6, 210, 74, 13, 45, 27, 41, 6, 202, 200, 105, 13, + 212, 246, 13, 45, 27, 4, 245, 75, 13, 45, 27, 4, 211, 238, 13, 45, 27, 4, + 214, 124, 13, 45, 27, 213, 132, 239, 124, 13, 45, 27, 236, 175, 105, 13, + 45, 27, 202, 200, 105, 13, 45, 27, 225, 3, 105, 13, 45, 27, 212, 247, + 105, 13, 45, 27, 210, 75, 105, 13, 45, 27, 212, 221, 105, 13, 45, 27, 41, + 6, 251, 134, 13, 45, 27, 41, 6, 248, 206, 13, 45, 27, 41, 6, 234, 94, 13, + 45, 27, 41, 6, 239, 212, 13, 45, 27, 41, 6, 236, 174, 13, 45, 27, 41, 6, + 195, 78, 13, 45, 27, 41, 6, 236, 126, 13, 45, 27, 41, 6, 202, 199, 13, + 45, 27, 41, 6, 226, 7, 13, 45, 27, 41, 6, 225, 2, 13, 45, 27, 41, 6, 222, + 245, 13, 45, 27, 41, 6, 218, 145, 13, 45, 27, 41, 6, 215, 186, 13, 45, + 27, 41, 6, 196, 196, 13, 45, 27, 41, 6, 214, 122, 13, 45, 27, 41, 6, 212, + 220, 13, 45, 27, 41, 6, 210, 74, 13, 45, 27, 41, 6, 202, 200, 105, 13, 45, 27, 41, 6, 206, 86, 13, 45, 27, 41, 6, 203, 89, 13, 45, 27, 41, 6, - 200, 28, 13, 45, 27, 41, 6, 212, 245, 13, 45, 27, 41, 6, 245, 74, 13, 45, - 27, 41, 6, 211, 237, 13, 45, 27, 41, 6, 214, 123, 13, 45, 27, 41, 217, - 238, 13, 45, 27, 41, 4, 251, 133, 13, 45, 27, 41, 4, 248, 205, 13, 45, - 27, 41, 4, 234, 93, 13, 45, 27, 41, 4, 239, 211, 13, 45, 27, 41, 4, 236, - 173, 13, 45, 27, 41, 4, 195, 78, 13, 45, 27, 41, 4, 236, 125, 13, 45, 27, - 41, 4, 202, 199, 13, 45, 27, 41, 4, 226, 6, 13, 45, 27, 41, 4, 225, 1, - 13, 45, 27, 41, 4, 222, 244, 13, 45, 27, 41, 4, 218, 144, 13, 45, 27, 41, - 4, 215, 185, 13, 45, 27, 41, 4, 196, 196, 13, 45, 27, 41, 4, 214, 121, - 13, 45, 27, 41, 4, 212, 219, 13, 45, 27, 41, 4, 210, 74, 13, 45, 27, 41, + 200, 28, 13, 45, 27, 41, 6, 212, 246, 13, 45, 27, 41, 6, 245, 75, 13, 45, + 27, 41, 6, 211, 238, 13, 45, 27, 41, 6, 214, 124, 13, 45, 27, 41, 217, + 239, 13, 45, 27, 41, 4, 251, 134, 13, 45, 27, 41, 4, 248, 206, 13, 45, + 27, 41, 4, 234, 94, 13, 45, 27, 41, 4, 239, 212, 13, 45, 27, 41, 4, 236, + 174, 13, 45, 27, 41, 4, 195, 78, 13, 45, 27, 41, 4, 236, 126, 13, 45, 27, + 41, 4, 202, 199, 13, 45, 27, 41, 4, 226, 7, 13, 45, 27, 41, 4, 225, 2, + 13, 45, 27, 41, 4, 222, 245, 13, 45, 27, 41, 4, 218, 145, 13, 45, 27, 41, + 4, 215, 186, 13, 45, 27, 41, 4, 196, 196, 13, 45, 27, 41, 4, 214, 122, + 13, 45, 27, 41, 4, 212, 220, 13, 45, 27, 41, 4, 210, 74, 13, 45, 27, 41, 4, 48, 206, 86, 13, 45, 27, 41, 4, 206, 86, 13, 45, 27, 41, 4, 203, 89, - 13, 45, 27, 41, 4, 200, 28, 13, 45, 27, 41, 4, 212, 245, 13, 45, 27, 41, - 4, 245, 74, 13, 45, 27, 41, 4, 211, 237, 13, 45, 27, 41, 4, 214, 123, 13, - 45, 27, 41, 213, 131, 239, 123, 13, 45, 27, 41, 236, 174, 105, 13, 45, - 27, 41, 202, 200, 105, 13, 45, 27, 41, 225, 2, 105, 13, 45, 27, 41, 212, - 246, 105, 13, 45, 27, 41, 210, 75, 105, 13, 45, 27, 41, 212, 220, 105, - 13, 27, 6, 239, 117, 13, 27, 4, 239, 117, 13, 27, 17, 195, 79, 13, 27, + 13, 45, 27, 41, 4, 200, 28, 13, 45, 27, 41, 4, 212, 246, 13, 45, 27, 41, + 4, 245, 75, 13, 45, 27, 41, 4, 211, 238, 13, 45, 27, 41, 4, 214, 124, 13, + 45, 27, 41, 213, 132, 239, 124, 13, 45, 27, 41, 236, 175, 105, 13, 45, + 27, 41, 202, 200, 105, 13, 45, 27, 41, 225, 3, 105, 13, 45, 27, 41, 212, + 247, 105, 13, 45, 27, 41, 210, 75, 105, 13, 45, 27, 41, 212, 221, 105, + 13, 27, 6, 239, 118, 13, 27, 4, 239, 118, 13, 27, 17, 195, 79, 13, 27, 17, 100, 13, 27, 17, 102, 13, 27, 17, 134, 13, 27, 17, 136, 13, 27, 17, 146, 13, 27, 17, 167, 13, 27, 17, 178, 13, 27, 17, 171, 13, 27, 17, 182, - 13, 237, 240, 17, 195, 79, 13, 237, 240, 17, 100, 13, 237, 240, 17, 102, - 13, 237, 240, 17, 134, 13, 237, 240, 17, 136, 13, 237, 240, 17, 146, 13, - 237, 240, 17, 167, 13, 237, 240, 17, 178, 13, 237, 240, 17, 171, 13, 237, - 240, 17, 182, 13, 45, 17, 195, 79, 13, 45, 17, 100, 13, 45, 17, 102, 13, + 13, 237, 241, 17, 195, 79, 13, 237, 241, 17, 100, 13, 237, 241, 17, 102, + 13, 237, 241, 17, 134, 13, 237, 241, 17, 136, 13, 237, 241, 17, 146, 13, + 237, 241, 17, 167, 13, 237, 241, 17, 178, 13, 237, 241, 17, 171, 13, 237, + 241, 17, 182, 13, 45, 17, 195, 79, 13, 45, 17, 100, 13, 45, 17, 102, 13, 45, 17, 134, 13, 45, 17, 136, 13, 45, 17, 146, 13, 45, 17, 167, 13, 45, 17, 178, 13, 45, 17, 171, 13, 45, 17, 182, 13, 45, 27, 17, 195, 79, 13, 45, 27, 17, 100, 13, 45, 27, 17, 102, 13, 45, 27, 17, 134, 13, 45, 27, 17, 136, 13, 45, 27, 17, 146, 13, 45, 27, 17, 167, 13, 45, 27, 17, 178, - 13, 45, 27, 17, 171, 13, 45, 27, 17, 182, 13, 218, 200, 17, 195, 79, 13, - 218, 200, 17, 100, 13, 218, 200, 17, 102, 13, 218, 200, 17, 134, 13, 218, - 200, 17, 136, 13, 218, 200, 17, 146, 13, 218, 200, 17, 167, 13, 218, 200, - 17, 178, 13, 218, 200, 17, 171, 13, 218, 200, 17, 182, 23, 139, 226, 71, - 23, 232, 205, 226, 71, 23, 232, 201, 226, 71, 23, 232, 190, 226, 71, 23, - 232, 194, 226, 71, 23, 232, 207, 226, 71, 23, 139, 132, 248, 216, 23, - 232, 205, 132, 248, 216, 23, 139, 162, 200, 64, 132, 248, 216, 23, 139, - 132, 210, 214, 224, 13, 23, 139, 132, 241, 22, 23, 139, 132, 232, 36, 23, - 139, 132, 232, 37, 221, 207, 23, 232, 205, 132, 232, 38, 23, 139, 132, - 219, 62, 23, 232, 205, 132, 219, 62, 23, 139, 132, 112, 248, 216, 23, - 139, 132, 112, 210, 214, 224, 12, 23, 139, 132, 112, 232, 36, 23, 139, - 132, 124, 112, 232, 36, 23, 139, 132, 232, 37, 112, 200, 36, 23, 139, - 132, 112, 241, 143, 23, 139, 132, 112, 241, 144, 132, 248, 216, 23, 139, - 132, 112, 241, 144, 112, 248, 216, 23, 139, 132, 112, 241, 144, 241, 22, - 23, 139, 132, 112, 241, 144, 232, 36, 23, 139, 132, 112, 241, 57, 23, - 232, 205, 132, 112, 241, 57, 23, 139, 112, 248, 217, 127, 226, 71, 23, - 139, 132, 248, 217, 127, 219, 62, 23, 139, 132, 112, 202, 141, 23, 232, - 205, 132, 112, 202, 141, 23, 139, 132, 112, 204, 218, 162, 248, 216, 23, - 139, 132, 112, 248, 217, 162, 204, 217, 23, 139, 132, 112, 162, 248, 216, - 23, 139, 132, 112, 232, 37, 205, 103, 162, 206, 97, 23, 139, 132, 124, - 112, 232, 37, 162, 206, 97, 23, 139, 132, 124, 112, 232, 37, 162, 241, - 143, 23, 139, 132, 232, 37, 112, 124, 162, 206, 97, 23, 139, 132, 112, - 124, 205, 103, 162, 235, 10, 23, 139, 132, 112, 162, 241, 22, 23, 139, - 132, 112, 162, 244, 247, 23, 139, 132, 112, 162, 231, 162, 23, 139, 132, - 112, 162, 232, 36, 23, 139, 162, 248, 203, 132, 112, 204, 217, 23, 139, - 132, 112, 241, 144, 162, 206, 97, 23, 139, 132, 112, 241, 144, 162, 206, - 98, 241, 143, 23, 139, 132, 112, 241, 144, 162, 206, 98, 248, 216, 23, - 139, 112, 162, 231, 163, 132, 200, 36, 23, 139, 132, 162, 231, 163, 112, - 200, 36, 23, 139, 132, 112, 241, 144, 232, 37, 162, 206, 97, 23, 139, - 132, 112, 241, 58, 162, 206, 97, 23, 139, 132, 112, 241, 144, 162, 235, - 10, 23, 139, 132, 112, 241, 144, 241, 23, 162, 235, 10, 23, 139, 112, - 162, 241, 23, 132, 200, 36, 23, 139, 132, 162, 241, 23, 112, 200, 36, 23, - 139, 112, 162, 46, 132, 200, 36, 23, 139, 112, 162, 46, 132, 232, 36, 23, - 139, 132, 162, 251, 88, 214, 34, 112, 200, 36, 23, 139, 132, 162, 251, - 88, 226, 86, 112, 200, 36, 23, 139, 132, 162, 46, 112, 200, 36, 23, 139, - 132, 112, 162, 241, 144, 232, 36, 23, 139, 132, 112, 162, 251, 88, 214, - 33, 23, 139, 132, 112, 162, 251, 87, 23, 139, 112, 162, 251, 88, 214, 34, - 132, 200, 36, 23, 139, 112, 162, 251, 88, 214, 34, 132, 241, 57, 23, 139, - 112, 162, 251, 88, 132, 200, 36, 23, 139, 132, 162, 231, 163, 112, 232, - 36, 23, 232, 196, 235, 6, 235, 121, 23, 232, 196, 235, 6, 235, 122, 248, - 216, 23, 232, 196, 235, 6, 235, 122, 232, 36, 23, 232, 196, 235, 6, 235, - 122, 241, 143, 23, 232, 196, 235, 6, 235, 122, 241, 144, 205, 112, 23, - 232, 203, 235, 6, 235, 122, 241, 143, 23, 139, 235, 6, 235, 122, 241, - 144, 248, 216, 23, 232, 194, 235, 6, 235, 122, 241, 143, 23, 232, 196, - 235, 100, 235, 122, 205, 102, 23, 232, 196, 232, 115, 235, 100, 235, 122, - 205, 102, 23, 232, 196, 235, 100, 235, 122, 205, 103, 235, 6, 248, 216, - 23, 232, 196, 232, 115, 235, 100, 235, 122, 205, 103, 235, 6, 248, 216, - 23, 232, 196, 235, 100, 235, 122, 205, 103, 248, 216, 23, 232, 196, 232, - 115, 235, 100, 235, 122, 205, 103, 248, 216, 23, 232, 196, 235, 100, 235, - 122, 205, 103, 162, 235, 10, 23, 232, 201, 235, 100, 235, 122, 205, 102, - 23, 232, 201, 235, 100, 235, 122, 205, 103, 214, 91, 23, 232, 194, 235, - 100, 235, 122, 205, 103, 214, 91, 23, 232, 190, 235, 100, 235, 122, 205, - 102, 23, 232, 196, 235, 100, 235, 122, 205, 103, 232, 36, 23, 232, 196, - 235, 100, 235, 122, 205, 103, 232, 37, 162, 206, 97, 23, 232, 196, 235, - 100, 235, 122, 205, 103, 232, 37, 216, 50, 202, 141, 23, 232, 195, 23, - 232, 196, 248, 203, 213, 206, 235, 224, 23, 232, 196, 232, 114, 23, 232, - 196, 162, 206, 97, 23, 232, 196, 232, 115, 162, 206, 97, 23, 232, 196, - 162, 248, 216, 23, 232, 196, 162, 235, 10, 23, 232, 196, 205, 113, 132, - 162, 206, 97, 23, 232, 196, 205, 113, 247, 35, 23, 232, 196, 205, 113, - 247, 36, 162, 206, 97, 23, 232, 196, 205, 113, 247, 36, 162, 206, 98, - 248, 216, 23, 232, 196, 205, 113, 222, 45, 23, 232, 202, 23, 232, 203, - 162, 206, 97, 23, 232, 203, 216, 50, 202, 141, 23, 232, 203, 162, 235, - 10, 23, 232, 192, 241, 19, 23, 232, 191, 23, 232, 201, 214, 91, 23, 232, - 200, 23, 232, 201, 192, 162, 206, 97, 23, 232, 201, 162, 206, 97, 23, - 232, 201, 192, 216, 50, 202, 141, 23, 232, 201, 216, 50, 202, 141, 23, - 232, 201, 192, 162, 235, 10, 23, 232, 201, 162, 235, 10, 23, 232, 199, - 214, 91, 23, 232, 198, 23, 232, 204, 23, 232, 189, 23, 232, 190, 162, - 206, 97, 23, 232, 190, 216, 50, 202, 141, 23, 232, 190, 162, 235, 10, 23, - 232, 194, 214, 91, 23, 232, 194, 192, 162, 235, 10, 23, 232, 193, 23, - 232, 194, 205, 224, 23, 232, 194, 192, 162, 206, 97, 23, 232, 194, 162, - 206, 97, 23, 232, 194, 192, 216, 50, 202, 141, 23, 232, 194, 216, 50, - 202, 141, 23, 232, 194, 162, 206, 98, 201, 225, 226, 71, 23, 232, 194, - 162, 248, 203, 112, 210, 2, 23, 232, 206, 23, 139, 132, 112, 210, 2, 23, - 232, 205, 132, 112, 210, 2, 23, 232, 194, 132, 112, 210, 2, 23, 232, 207, - 132, 112, 210, 2, 23, 232, 194, 222, 45, 23, 139, 132, 112, 210, 3, 248, - 216, 23, 139, 132, 112, 210, 3, 241, 143, 23, 232, 194, 132, 112, 210, 3, - 241, 143, 23, 139, 222, 46, 237, 234, 23, 139, 222, 46, 135, 209, 253, - 204, 217, 23, 139, 222, 46, 135, 209, 253, 241, 8, 23, 139, 222, 46, 135, - 214, 44, 244, 247, 23, 139, 222, 46, 200, 36, 23, 139, 162, 200, 64, 222, - 46, 200, 36, 23, 232, 205, 222, 46, 200, 36, 23, 232, 190, 222, 46, 200, - 36, 23, 232, 207, 222, 46, 200, 36, 23, 139, 222, 46, 210, 214, 224, 13, - 23, 139, 222, 46, 248, 216, 23, 139, 222, 46, 201, 226, 202, 141, 23, - 139, 222, 46, 202, 141, 23, 232, 194, 222, 46, 202, 141, 23, 139, 222, - 46, 132, 202, 141, 23, 232, 194, 222, 46, 132, 202, 141, 23, 232, 207, - 222, 46, 132, 162, 132, 162, 214, 33, 23, 232, 207, 222, 46, 132, 162, - 132, 202, 141, 23, 139, 222, 46, 226, 71, 23, 232, 205, 222, 46, 226, 71, - 23, 232, 194, 222, 46, 226, 71, 23, 232, 207, 222, 46, 226, 71, 23, 139, - 132, 112, 222, 45, 23, 232, 205, 132, 112, 222, 45, 23, 232, 194, 132, - 112, 222, 45, 23, 232, 194, 210, 2, 23, 232, 207, 132, 112, 222, 45, 23, - 139, 132, 112, 241, 61, 222, 45, 23, 232, 205, 132, 112, 241, 61, 222, - 45, 23, 139, 210, 3, 237, 234, 23, 232, 194, 210, 3, 135, 132, 162, 231, - 164, 219, 62, 23, 232, 207, 210, 3, 135, 112, 162, 132, 241, 60, 23, 139, - 210, 3, 200, 36, 23, 139, 210, 3, 210, 214, 224, 13, 23, 139, 210, 3, - 222, 45, 23, 232, 205, 210, 3, 222, 45, 23, 232, 190, 210, 3, 222, 45, - 23, 232, 207, 210, 3, 222, 45, 23, 139, 210, 3, 219, 62, 23, 139, 210, 3, - 112, 241, 143, 23, 139, 210, 3, 112, 210, 214, 224, 12, 23, 139, 210, 3, - 226, 71, 23, 139, 210, 3, 202, 141, 23, 232, 192, 210, 3, 202, 141, 23, - 139, 132, 210, 3, 222, 45, 23, 232, 205, 132, 210, 3, 222, 45, 23, 232, - 199, 132, 210, 3, 222, 46, 214, 118, 23, 232, 192, 132, 210, 3, 222, 46, - 214, 33, 23, 232, 192, 132, 210, 3, 222, 46, 226, 85, 23, 232, 192, 132, - 210, 3, 222, 46, 200, 63, 23, 232, 201, 132, 210, 3, 222, 45, 23, 232, - 194, 132, 210, 3, 222, 45, 23, 232, 207, 132, 210, 3, 222, 46, 214, 33, - 23, 232, 207, 132, 210, 3, 222, 45, 23, 139, 112, 237, 234, 23, 232, 194, - 219, 62, 23, 139, 112, 200, 36, 23, 232, 205, 112, 200, 36, 23, 139, 112, - 210, 214, 224, 13, 23, 139, 112, 124, 162, 206, 97, 23, 232, 192, 112, - 202, 141, 23, 139, 112, 162, 222, 45, 23, 139, 112, 222, 45, 23, 139, - 112, 210, 3, 222, 45, 23, 232, 205, 112, 210, 3, 222, 45, 23, 232, 199, - 112, 210, 3, 222, 46, 214, 118, 23, 232, 201, 112, 210, 3, 222, 45, 23, - 232, 194, 112, 210, 3, 222, 45, 23, 232, 207, 112, 210, 3, 222, 46, 214, - 33, 23, 232, 207, 112, 210, 3, 222, 46, 226, 85, 23, 232, 207, 112, 210, - 3, 222, 45, 23, 232, 205, 112, 210, 3, 222, 46, 248, 216, 23, 232, 203, - 112, 210, 3, 222, 46, 241, 143, 23, 232, 203, 112, 210, 3, 222, 46, 241, - 144, 206, 97, 23, 232, 192, 112, 210, 3, 222, 46, 241, 144, 214, 33, 23, - 232, 192, 112, 210, 3, 222, 46, 241, 144, 226, 85, 23, 232, 192, 112, - 210, 3, 222, 46, 241, 143, 23, 232, 194, 132, 232, 36, 23, 139, 132, 162, - 206, 97, 23, 232, 194, 132, 162, 206, 97, 23, 139, 132, 162, 206, 98, - 162, 239, 145, 23, 139, 132, 162, 206, 98, 162, 241, 143, 23, 139, 132, - 162, 206, 98, 162, 248, 216, 23, 139, 132, 162, 206, 98, 132, 248, 216, - 23, 139, 132, 162, 206, 98, 248, 87, 248, 216, 23, 139, 132, 162, 206, - 98, 132, 232, 38, 23, 139, 132, 162, 235, 11, 132, 204, 217, 23, 139, - 132, 162, 235, 11, 132, 248, 216, 23, 139, 132, 162, 122, 23, 139, 132, - 162, 241, 19, 23, 139, 132, 162, 241, 11, 162, 226, 40, 23, 232, 203, - 132, 162, 241, 11, 162, 226, 40, 23, 139, 132, 162, 241, 11, 162, 200, - 63, 23, 139, 132, 162, 244, 248, 23, 232, 201, 132, 202, 141, 23, 232, - 201, 132, 162, 214, 91, 23, 232, 194, 132, 162, 214, 91, 23, 232, 194, - 132, 162, 222, 226, 23, 232, 194, 132, 202, 141, 23, 232, 194, 132, 162, - 205, 224, 23, 232, 207, 132, 162, 214, 33, 23, 232, 207, 132, 162, 226, - 85, 23, 232, 207, 132, 202, 141, 23, 139, 202, 141, 23, 139, 162, 232, - 114, 23, 139, 162, 206, 98, 239, 145, 23, 139, 162, 206, 98, 241, 143, - 23, 139, 162, 206, 98, 248, 216, 23, 139, 162, 235, 10, 23, 139, 162, - 248, 203, 132, 219, 62, 23, 139, 162, 248, 203, 112, 210, 2, 23, 139, - 162, 248, 203, 210, 3, 222, 45, 23, 139, 162, 200, 64, 99, 235, 121, 23, - 139, 162, 127, 99, 235, 121, 23, 139, 162, 200, 64, 115, 235, 121, 23, - 139, 162, 200, 64, 235, 6, 235, 121, 23, 139, 162, 127, 235, 6, 210, 214, - 224, 12, 23, 232, 197, 23, 139, 232, 114, 23, 201, 227, 206, 61, 23, 201, - 227, 218, 118, 23, 201, 227, 248, 202, 23, 233, 104, 206, 61, 23, 233, - 104, 218, 118, 23, 233, 104, 248, 202, 23, 204, 201, 206, 61, 23, 204, - 201, 218, 118, 23, 204, 201, 248, 202, 23, 248, 28, 206, 61, 23, 248, 28, - 218, 118, 23, 248, 28, 248, 202, 23, 209, 132, 206, 61, 23, 209, 132, - 218, 118, 23, 209, 132, 248, 202, 23, 204, 84, 203, 249, 23, 204, 84, - 248, 202, 23, 205, 90, 222, 227, 206, 61, 23, 205, 90, 4, 206, 61, 23, - 205, 90, 222, 227, 218, 118, 23, 205, 90, 4, 218, 118, 23, 205, 90, 207, - 86, 23, 235, 72, 222, 227, 206, 61, 23, 235, 72, 4, 206, 61, 23, 235, 72, - 222, 227, 218, 118, 23, 235, 72, 4, 218, 118, 23, 235, 72, 207, 86, 23, - 205, 90, 235, 72, 251, 127, 23, 218, 156, 124, 135, 222, 226, 23, 218, - 156, 124, 135, 205, 224, 23, 218, 156, 124, 207, 86, 23, 218, 156, 135, - 207, 86, 23, 218, 156, 124, 135, 251, 128, 222, 226, 23, 218, 156, 124, - 135, 251, 128, 205, 224, 23, 218, 156, 206, 98, 202, 30, 206, 98, 208, - 161, 23, 218, 155, 235, 127, 241, 133, 23, 218, 157, 235, 127, 241, 133, - 23, 218, 155, 206, 62, 204, 218, 205, 224, 23, 218, 155, 206, 62, 204, - 218, 219, 188, 23, 218, 155, 206, 62, 204, 218, 222, 226, 23, 218, 155, - 206, 62, 204, 218, 222, 224, 23, 218, 155, 206, 62, 196, 247, 235, 75, - 23, 218, 155, 52, 204, 217, 23, 218, 155, 52, 196, 247, 235, 75, 23, 218, - 155, 52, 251, 127, 23, 218, 155, 52, 251, 128, 196, 247, 235, 75, 23, - 218, 155, 241, 60, 23, 218, 155, 201, 165, 204, 218, 218, 159, 23, 218, - 155, 201, 165, 196, 247, 235, 75, 23, 218, 155, 201, 165, 251, 127, 23, - 218, 155, 201, 165, 251, 128, 196, 247, 235, 75, 23, 218, 155, 248, 221, - 205, 224, 23, 218, 155, 248, 221, 219, 188, 23, 218, 155, 248, 221, 222, - 226, 23, 218, 155, 241, 101, 205, 224, 23, 218, 155, 241, 101, 219, 188, - 23, 218, 155, 241, 101, 222, 226, 23, 218, 155, 241, 101, 209, 192, 23, - 218, 155, 245, 101, 205, 224, 23, 218, 155, 245, 101, 219, 188, 23, 218, - 155, 245, 101, 222, 226, 23, 218, 155, 111, 205, 224, 23, 218, 155, 111, - 219, 188, 23, 218, 155, 111, 222, 226, 23, 218, 155, 195, 24, 205, 224, - 23, 218, 155, 195, 24, 219, 188, 23, 218, 155, 195, 24, 222, 226, 23, - 218, 155, 213, 86, 205, 224, 23, 218, 155, 213, 86, 219, 188, 23, 218, - 155, 213, 86, 222, 226, 23, 201, 195, 209, 190, 206, 61, 23, 201, 195, - 209, 190, 237, 244, 23, 201, 195, 209, 190, 251, 127, 23, 201, 195, 209, - 191, 206, 61, 23, 201, 195, 209, 191, 237, 244, 23, 201, 195, 209, 191, - 251, 127, 23, 201, 195, 207, 30, 23, 201, 195, 250, 231, 205, 121, 206, - 61, 23, 201, 195, 250, 231, 205, 121, 237, 244, 23, 201, 195, 250, 231, - 205, 121, 201, 164, 23, 218, 158, 250, 125, 205, 224, 23, 218, 158, 250, - 125, 219, 188, 23, 218, 158, 250, 125, 222, 226, 23, 218, 158, 250, 125, - 222, 224, 23, 218, 158, 201, 221, 205, 224, 23, 218, 158, 201, 221, 219, - 188, 23, 218, 158, 201, 221, 222, 226, 23, 218, 158, 201, 221, 222, 224, - 23, 218, 158, 248, 203, 250, 125, 205, 224, 23, 218, 158, 248, 203, 250, - 125, 219, 188, 23, 218, 158, 248, 203, 250, 125, 222, 226, 23, 218, 158, - 248, 203, 250, 125, 222, 224, 23, 218, 158, 248, 203, 201, 221, 205, 224, - 23, 218, 158, 248, 203, 201, 221, 219, 188, 23, 218, 158, 248, 203, 201, - 221, 222, 226, 23, 218, 158, 248, 203, 201, 221, 222, 224, 23, 218, 157, - 206, 62, 204, 218, 205, 224, 23, 218, 157, 206, 62, 204, 218, 219, 188, - 23, 218, 157, 206, 62, 204, 218, 222, 226, 23, 218, 157, 206, 62, 204, - 218, 222, 224, 23, 218, 157, 206, 62, 196, 247, 235, 75, 23, 218, 157, - 52, 204, 217, 23, 218, 157, 52, 196, 247, 235, 75, 23, 218, 157, 52, 251, - 127, 23, 218, 157, 52, 251, 128, 196, 247, 235, 75, 23, 218, 157, 241, - 60, 23, 218, 157, 201, 165, 204, 218, 218, 159, 23, 218, 157, 201, 165, - 196, 247, 235, 75, 23, 218, 157, 201, 165, 251, 128, 218, 159, 23, 218, - 157, 201, 165, 251, 128, 196, 247, 235, 75, 23, 218, 157, 248, 220, 23, - 218, 157, 241, 101, 205, 224, 23, 218, 157, 241, 101, 219, 188, 23, 218, - 157, 241, 101, 222, 226, 23, 218, 157, 245, 100, 23, 218, 157, 111, 205, - 224, 23, 218, 157, 111, 219, 188, 23, 218, 157, 111, 222, 226, 23, 218, - 157, 195, 24, 205, 224, 23, 218, 157, 195, 24, 219, 188, 23, 218, 157, - 195, 24, 222, 226, 23, 218, 157, 213, 86, 205, 224, 23, 218, 157, 213, - 86, 219, 188, 23, 218, 157, 213, 86, 222, 226, 23, 201, 196, 209, 191, - 206, 61, 23, 201, 196, 209, 191, 237, 244, 23, 201, 196, 209, 191, 251, - 127, 23, 201, 196, 209, 190, 206, 61, 23, 201, 196, 209, 190, 237, 244, - 23, 201, 196, 209, 190, 251, 127, 23, 201, 196, 207, 30, 23, 218, 155, - 241, 11, 211, 87, 205, 224, 23, 218, 155, 241, 11, 211, 87, 219, 188, 23, - 218, 155, 241, 11, 211, 87, 222, 226, 23, 218, 155, 241, 11, 211, 87, - 222, 224, 23, 218, 155, 241, 11, 232, 221, 205, 224, 23, 218, 155, 241, - 11, 232, 221, 219, 188, 23, 218, 155, 241, 11, 232, 221, 222, 226, 23, - 218, 155, 241, 11, 232, 221, 222, 224, 23, 218, 155, 241, 11, 202, 147, - 244, 249, 205, 224, 23, 218, 155, 241, 11, 202, 147, 244, 249, 219, 188, - 23, 218, 155, 231, 59, 205, 224, 23, 218, 155, 231, 59, 219, 188, 23, - 218, 155, 231, 59, 222, 226, 23, 218, 155, 221, 225, 205, 224, 23, 218, - 155, 221, 225, 219, 188, 23, 218, 155, 221, 225, 222, 226, 23, 218, 155, - 221, 225, 4, 237, 244, 23, 218, 155, 197, 123, 241, 11, 52, 205, 224, 23, - 218, 155, 197, 123, 241, 11, 52, 219, 188, 23, 218, 155, 197, 123, 241, - 11, 52, 222, 226, 23, 218, 155, 197, 123, 241, 11, 201, 165, 205, 224, - 23, 218, 155, 197, 123, 241, 11, 201, 165, 219, 188, 23, 218, 155, 197, - 123, 241, 11, 201, 165, 222, 226, 23, 218, 155, 241, 11, 202, 209, 204, - 217, 23, 218, 155, 241, 9, 241, 61, 205, 224, 23, 218, 155, 241, 9, 241, - 61, 219, 188, 23, 209, 190, 206, 61, 23, 209, 190, 237, 244, 23, 209, - 190, 251, 129, 23, 218, 155, 207, 30, 23, 218, 155, 241, 11, 232, 29, - 234, 233, 197, 148, 23, 218, 155, 231, 59, 232, 29, 234, 233, 197, 148, - 23, 218, 155, 221, 225, 232, 29, 234, 233, 197, 148, 23, 218, 155, 197, - 123, 232, 29, 234, 233, 197, 148, 23, 209, 190, 206, 62, 232, 29, 234, - 233, 197, 148, 23, 209, 190, 52, 232, 29, 234, 233, 197, 148, 23, 209, - 190, 251, 128, 232, 29, 234, 233, 197, 148, 23, 218, 155, 241, 11, 232, - 29, 245, 81, 23, 218, 155, 231, 59, 232, 29, 245, 81, 23, 218, 155, 221, - 225, 232, 29, 245, 81, 23, 218, 155, 197, 123, 232, 29, 245, 81, 23, 209, - 190, 206, 62, 232, 29, 245, 81, 23, 209, 190, 52, 232, 29, 245, 81, 23, - 209, 190, 251, 128, 232, 29, 245, 81, 23, 218, 155, 197, 123, 239, 146, - 213, 112, 205, 224, 23, 218, 155, 197, 123, 239, 146, 213, 112, 219, 188, - 23, 218, 155, 197, 123, 239, 146, 213, 112, 222, 226, 23, 218, 157, 241, - 11, 232, 29, 247, 45, 205, 224, 23, 218, 157, 241, 11, 232, 29, 247, 45, - 222, 226, 23, 218, 157, 231, 59, 232, 29, 247, 45, 4, 237, 244, 23, 218, - 157, 231, 59, 232, 29, 247, 45, 222, 227, 237, 244, 23, 218, 157, 231, - 59, 232, 29, 247, 45, 4, 201, 164, 23, 218, 157, 231, 59, 232, 29, 247, - 45, 222, 227, 201, 164, 23, 218, 157, 221, 225, 232, 29, 247, 45, 4, 206, - 61, 23, 218, 157, 221, 225, 232, 29, 247, 45, 222, 227, 206, 61, 23, 218, - 157, 221, 225, 232, 29, 247, 45, 4, 237, 244, 23, 218, 157, 221, 225, - 232, 29, 247, 45, 222, 227, 237, 244, 23, 218, 157, 197, 123, 232, 29, - 247, 45, 205, 224, 23, 218, 157, 197, 123, 232, 29, 247, 45, 222, 226, - 23, 209, 191, 206, 62, 232, 29, 247, 44, 23, 209, 191, 52, 232, 29, 247, - 44, 23, 209, 191, 251, 128, 232, 29, 247, 44, 23, 218, 157, 241, 11, 232, - 29, 235, 69, 205, 224, 23, 218, 157, 241, 11, 232, 29, 235, 69, 222, 226, - 23, 218, 157, 231, 59, 232, 29, 235, 69, 4, 237, 244, 23, 218, 157, 231, - 59, 232, 29, 235, 69, 222, 227, 237, 244, 23, 218, 157, 231, 59, 232, 29, - 235, 69, 201, 165, 4, 201, 164, 23, 218, 157, 231, 59, 232, 29, 235, 69, - 201, 165, 222, 227, 201, 164, 23, 218, 157, 221, 225, 232, 29, 235, 69, - 4, 206, 61, 23, 218, 157, 221, 225, 232, 29, 235, 69, 222, 227, 206, 61, - 23, 218, 157, 221, 225, 232, 29, 235, 69, 4, 237, 244, 23, 218, 157, 221, - 225, 232, 29, 235, 69, 222, 227, 237, 244, 23, 218, 157, 197, 123, 232, - 29, 235, 69, 205, 224, 23, 218, 157, 197, 123, 232, 29, 235, 69, 222, - 226, 23, 209, 191, 206, 62, 232, 29, 235, 68, 23, 209, 191, 52, 232, 29, - 235, 68, 23, 209, 191, 251, 128, 232, 29, 235, 68, 23, 218, 157, 241, 11, - 205, 224, 23, 218, 157, 241, 11, 219, 188, 23, 218, 157, 241, 11, 222, - 226, 23, 218, 157, 241, 11, 222, 224, 23, 218, 157, 241, 11, 244, 162, - 23, 218, 157, 231, 59, 205, 224, 23, 218, 157, 221, 225, 205, 224, 23, - 218, 157, 197, 123, 205, 212, 23, 218, 157, 197, 123, 205, 224, 23, 218, - 157, 197, 123, 222, 226, 23, 209, 191, 206, 61, 23, 209, 191, 237, 244, - 23, 209, 191, 251, 127, 23, 218, 157, 207, 31, 213, 144, 23, 218, 155, - 250, 231, 244, 249, 4, 206, 61, 23, 218, 155, 250, 231, 244, 249, 219, - 189, 206, 61, 23, 218, 155, 250, 231, 244, 249, 4, 237, 244, 23, 218, - 155, 250, 231, 244, 249, 219, 189, 237, 244, 23, 218, 157, 250, 231, 244, - 249, 232, 29, 197, 149, 4, 206, 61, 23, 218, 157, 250, 231, 244, 249, - 232, 29, 197, 149, 219, 189, 206, 61, 23, 218, 157, 250, 231, 244, 249, - 232, 29, 197, 149, 222, 227, 206, 61, 23, 218, 157, 250, 231, 244, 249, - 232, 29, 197, 149, 4, 237, 244, 23, 218, 157, 250, 231, 244, 249, 232, - 29, 197, 149, 219, 189, 237, 244, 23, 218, 157, 250, 231, 244, 249, 232, - 29, 197, 149, 222, 227, 237, 244, 23, 218, 155, 196, 247, 244, 249, 234, - 233, 206, 61, 23, 218, 155, 196, 247, 244, 249, 234, 233, 237, 244, 23, - 218, 157, 196, 247, 244, 249, 232, 29, 197, 149, 206, 61, 23, 218, 157, - 196, 247, 244, 249, 232, 29, 197, 149, 237, 244, 23, 218, 155, 235, 127, - 244, 246, 206, 61, 23, 218, 155, 235, 127, 244, 246, 237, 244, 23, 218, - 157, 235, 127, 244, 246, 232, 29, 197, 149, 206, 61, 23, 218, 157, 235, - 127, 244, 246, 232, 29, 197, 149, 237, 244, 23, 237, 160, 250, 217, 205, - 224, 23, 237, 160, 250, 217, 222, 226, 23, 237, 160, 235, 202, 23, 237, - 160, 205, 227, 23, 237, 160, 203, 16, 23, 237, 160, 210, 134, 23, 237, - 160, 206, 67, 23, 237, 160, 206, 68, 251, 127, 23, 237, 160, 236, 98, - 214, 45, 202, 78, 23, 237, 160, 233, 114, 23, 232, 136, 23, 232, 137, - 210, 7, 23, 232, 137, 218, 155, 204, 217, 23, 232, 137, 218, 155, 202, - 81, 23, 232, 137, 218, 157, 204, 217, 23, 232, 137, 218, 155, 241, 10, - 23, 232, 137, 218, 157, 241, 10, 23, 232, 137, 218, 160, 244, 248, 23, - 235, 233, 239, 84, 212, 78, 216, 20, 235, 11, 202, 79, 23, 235, 233, 239, - 84, 212, 78, 216, 20, 124, 214, 72, 237, 234, 23, 235, 233, 239, 84, 212, - 78, 216, 20, 124, 214, 72, 135, 202, 79, 23, 236, 64, 204, 218, 200, 36, - 23, 236, 64, 204, 218, 217, 83, 23, 236, 64, 204, 218, 237, 234, 23, 237, - 218, 236, 64, 217, 84, 237, 234, 23, 237, 218, 236, 64, 135, 217, 83, 23, - 237, 218, 236, 64, 124, 217, 83, 23, 237, 218, 236, 64, 217, 84, 200, 36, - 23, 235, 28, 217, 83, 23, 235, 28, 241, 133, 23, 235, 28, 196, 250, 23, - 236, 59, 214, 91, 23, 236, 59, 205, 89, 23, 236, 59, 244, 201, 23, 236, - 67, 248, 126, 206, 61, 23, 236, 67, 248, 126, 218, 118, 23, 236, 59, 157, - 214, 91, 23, 236, 59, 197, 62, 214, 91, 23, 236, 59, 157, 244, 201, 23, - 236, 59, 197, 60, 218, 159, 23, 236, 67, 197, 43, 23, 236, 60, 200, 36, - 23, 236, 60, 237, 234, 23, 236, 60, 235, 55, 23, 236, 62, 204, 217, 23, - 236, 62, 204, 218, 237, 244, 23, 236, 62, 204, 218, 251, 127, 23, 236, - 63, 204, 217, 23, 236, 63, 204, 218, 237, 244, 23, 236, 63, 204, 218, - 251, 127, 23, 236, 62, 241, 8, 23, 236, 63, 241, 8, 23, 236, 62, 244, - 243, 23, 245, 96, 211, 216, 23, 245, 96, 217, 83, 23, 245, 96, 204, 131, - 23, 203, 17, 245, 96, 232, 47, 23, 203, 17, 245, 96, 219, 62, 23, 203, - 17, 245, 96, 221, 207, 23, 237, 73, 23, 216, 20, 217, 83, 23, 216, 20, - 241, 133, 23, 216, 20, 196, 248, 23, 216, 20, 197, 57, 23, 251, 189, 248, - 119, 214, 33, 23, 251, 189, 204, 130, 226, 85, 23, 251, 189, 248, 121, 4, - 209, 189, 23, 251, 189, 204, 132, 4, 209, 189, 23, 248, 48, 226, 57, 23, - 248, 48, 236, 87, 23, 218, 164, 244, 202, 217, 83, 23, 218, 164, 244, - 202, 235, 10, 23, 218, 164, 244, 202, 241, 133, 23, 218, 164, 205, 219, - 23, 218, 164, 205, 220, 196, 250, 23, 218, 164, 205, 220, 214, 91, 23, - 218, 164, 234, 229, 23, 218, 164, 234, 230, 196, 250, 23, 218, 164, 234, - 230, 214, 91, 23, 218, 164, 192, 244, 248, 23, 218, 164, 192, 235, 10, - 23, 218, 164, 192, 196, 250, 23, 218, 164, 192, 214, 26, 23, 218, 164, - 192, 214, 27, 196, 250, 23, 218, 164, 192, 214, 27, 196, 77, 23, 218, - 164, 192, 210, 162, 23, 218, 164, 192, 210, 163, 196, 250, 23, 218, 164, - 192, 210, 163, 196, 77, 23, 218, 164, 224, 56, 23, 218, 164, 224, 57, - 235, 10, 23, 218, 164, 224, 57, 196, 250, 23, 218, 164, 203, 16, 23, 218, - 164, 203, 17, 235, 10, 23, 218, 164, 203, 17, 204, 131, 23, 222, 59, 212, - 22, 202, 19, 23, 222, 61, 221, 202, 127, 200, 32, 23, 222, 61, 200, 33, - 127, 221, 201, 23, 218, 164, 241, 99, 23, 218, 164, 196, 249, 206, 61, - 23, 218, 164, 196, 249, 237, 244, 23, 201, 250, 204, 237, 214, 34, 235, - 204, 23, 201, 250, 222, 104, 222, 58, 23, 201, 250, 202, 68, 248, 203, - 222, 58, 23, 201, 250, 202, 68, 201, 225, 226, 41, 218, 163, 23, 201, - 250, 226, 41, 218, 164, 210, 134, 23, 201, 250, 218, 154, 251, 214, 245, - 97, 23, 201, 250, 247, 36, 204, 237, 214, 33, 23, 201, 250, 247, 36, 226, - 41, 218, 163, 23, 203, 44, 23, 203, 45, 218, 159, 23, 203, 45, 214, 119, - 201, 249, 23, 203, 45, 214, 119, 201, 250, 218, 159, 23, 203, 45, 214, - 119, 222, 58, 23, 203, 45, 214, 119, 222, 59, 218, 159, 23, 203, 45, 248, - 142, 222, 58, 23, 218, 155, 225, 196, 23, 218, 157, 225, 196, 23, 217, - 108, 23, 232, 232, 23, 236, 90, 23, 206, 164, 232, 35, 205, 122, 23, 206, - 164, 232, 35, 212, 76, 23, 197, 147, 206, 164, 232, 35, 218, 162, 23, - 235, 67, 206, 164, 232, 35, 218, 162, 23, 206, 164, 202, 80, 234, 234, - 197, 153, 23, 201, 232, 204, 218, 204, 205, 23, 201, 232, 241, 9, 248, - 220, 23, 201, 233, 200, 218, 23, 200, 33, 248, 110, 202, 80, 234, 234, - 232, 35, 225, 122, 23, 222, 86, 244, 163, 23, 222, 86, 222, 156, 23, 222, - 86, 222, 155, 23, 222, 86, 222, 154, 23, 222, 86, 222, 153, 23, 222, 86, - 222, 152, 23, 222, 86, 222, 151, 23, 222, 86, 222, 150, 23, 235, 126, 23, - 222, 0, 205, 148, 23, 222, 1, 205, 148, 23, 222, 3, 232, 110, 23, 222, 3, - 197, 58, 23, 222, 3, 239, 198, 23, 222, 3, 232, 137, 217, 108, 23, 222, - 3, 201, 234, 23, 222, 3, 222, 85, 239, 116, 23, 244, 158, 23, 234, 216, - 204, 226, 23, 207, 105, 23, 244, 167, 23, 213, 139, 23, 235, 136, 218, - 226, 23, 235, 136, 218, 225, 23, 235, 136, 218, 224, 23, 235, 136, 218, - 223, 23, 235, 136, 218, 222, 23, 209, 193, 218, 226, 23, 209, 193, 218, - 225, 23, 209, 193, 218, 224, 23, 209, 193, 218, 223, 23, 209, 193, 218, - 222, 23, 209, 193, 218, 221, 23, 209, 193, 218, 220, 23, 209, 193, 218, - 219, 23, 209, 193, 218, 233, 23, 209, 193, 218, 232, 23, 209, 193, 218, - 231, 23, 209, 193, 218, 230, 23, 209, 193, 218, 229, 23, 209, 193, 218, - 228, 23, 209, 193, 218, 227, 38, 125, 1, 250, 112, 38, 125, 1, 248, 8, - 38, 125, 1, 199, 116, 38, 125, 1, 233, 158, 38, 125, 1, 239, 22, 38, 125, - 1, 196, 38, 38, 125, 1, 195, 58, 38, 125, 1, 195, 84, 38, 125, 1, 225, - 220, 38, 125, 1, 84, 225, 220, 38, 125, 1, 68, 38, 125, 1, 239, 43, 38, - 125, 1, 225, 22, 38, 125, 1, 222, 38, 38, 125, 1, 218, 58, 38, 125, 1, - 217, 205, 38, 125, 1, 214, 103, 38, 125, 1, 212, 103, 38, 125, 1, 209, - 249, 38, 125, 1, 205, 229, 38, 125, 1, 200, 246, 38, 125, 1, 200, 83, 38, - 125, 1, 234, 237, 38, 125, 1, 232, 90, 38, 125, 1, 206, 154, 38, 125, 1, - 201, 92, 38, 125, 1, 245, 35, 38, 125, 1, 207, 50, 38, 125, 1, 196, 47, - 38, 125, 1, 196, 49, 38, 125, 1, 196, 82, 38, 125, 1, 195, 217, 38, 125, - 1, 4, 195, 182, 38, 125, 1, 196, 3, 38, 125, 1, 226, 5, 4, 195, 182, 38, - 125, 1, 248, 170, 195, 182, 38, 125, 1, 226, 5, 248, 170, 195, 182, 38, - 125, 1, 235, 102, 215, 87, 211, 223, 86, 1, 166, 215, 87, 211, 223, 86, - 1, 201, 113, 215, 87, 211, 223, 86, 1, 215, 206, 215, 87, 211, 223, 86, - 1, 189, 215, 87, 211, 223, 86, 1, 142, 215, 87, 211, 223, 86, 1, 176, - 215, 87, 211, 223, 86, 1, 196, 208, 215, 87, 211, 223, 86, 1, 216, 117, - 215, 87, 211, 223, 86, 1, 247, 173, 215, 87, 211, 223, 86, 1, 172, 215, - 87, 211, 223, 86, 1, 183, 215, 87, 211, 223, 86, 1, 195, 115, 215, 87, - 211, 223, 86, 1, 217, 162, 215, 87, 211, 223, 86, 1, 215, 193, 215, 87, - 211, 223, 86, 1, 155, 215, 87, 211, 223, 86, 1, 240, 135, 215, 87, 211, - 223, 86, 1, 215, 108, 215, 87, 211, 223, 86, 1, 215, 251, 215, 87, 211, - 223, 86, 1, 199, 152, 215, 87, 211, 223, 86, 1, 215, 187, 215, 87, 211, - 223, 86, 1, 200, 210, 215, 87, 211, 223, 86, 1, 235, 238, 215, 87, 211, - 223, 86, 1, 169, 215, 87, 211, 223, 86, 1, 211, 158, 215, 87, 211, 223, - 86, 1, 164, 215, 87, 211, 223, 86, 1, 215, 253, 215, 87, 211, 223, 86, 1, - 161, 215, 87, 211, 223, 86, 1, 196, 164, 215, 87, 211, 223, 86, 1, 215, - 255, 215, 87, 211, 223, 86, 1, 239, 39, 215, 87, 211, 223, 86, 1, 215, - 254, 215, 87, 211, 223, 86, 1, 232, 235, 215, 87, 211, 223, 86, 1, 219, - 1, 215, 87, 211, 223, 86, 1, 212, 149, 215, 87, 211, 223, 86, 1, 234, - 122, 215, 87, 211, 223, 86, 1, 209, 181, 215, 87, 211, 223, 86, 1, 63, - 215, 87, 211, 223, 86, 1, 252, 167, 215, 87, 211, 223, 86, 1, 68, 215, - 87, 211, 223, 86, 1, 66, 215, 87, 211, 223, 86, 1, 72, 215, 87, 211, 223, - 86, 1, 214, 101, 215, 87, 211, 223, 86, 1, 69, 215, 87, 211, 223, 86, 1, - 237, 53, 215, 87, 211, 223, 86, 1, 197, 199, 215, 87, 211, 223, 86, 202, - 2, 215, 87, 211, 223, 86, 201, 254, 215, 87, 211, 223, 86, 201, 255, 215, - 87, 211, 223, 86, 201, 252, 215, 87, 211, 223, 86, 201, 253, 215, 87, - 211, 223, 86, 202, 0, 215, 87, 211, 223, 86, 202, 1, 215, 87, 211, 223, - 86, 2, 36, 213, 27, 215, 87, 211, 223, 86, 2, 36, 202, 187, 215, 87, 211, - 223, 86, 2, 36, 222, 2, 215, 87, 211, 223, 86, 2, 36, 251, 80, 215, 87, - 211, 223, 86, 2, 36, 226, 17, 215, 87, 211, 223, 86, 2, 196, 172, 196, - 171, 215, 87, 211, 223, 86, 5, 222, 149, 215, 87, 211, 223, 86, 17, 195, - 79, 215, 87, 211, 223, 86, 17, 100, 215, 87, 211, 223, 86, 17, 102, 215, - 87, 211, 223, 86, 17, 134, 215, 87, 211, 223, 86, 17, 136, 215, 87, 211, - 223, 86, 17, 146, 215, 87, 211, 223, 86, 17, 167, 215, 87, 211, 223, 86, - 17, 178, 215, 87, 211, 223, 86, 17, 171, 215, 87, 211, 223, 86, 17, 182, - 215, 87, 211, 223, 86, 221, 247, 215, 103, 215, 87, 211, 223, 86, 46, - 247, 173, 197, 145, 1, 252, 167, 197, 145, 1, 63, 197, 145, 1, 249, 144, - 197, 145, 1, 247, 173, 197, 145, 1, 240, 135, 197, 145, 1, 234, 122, 197, - 145, 1, 164, 197, 145, 1, 213, 5, 197, 145, 1, 172, 197, 145, 1, 176, + 13, 45, 27, 17, 171, 13, 45, 27, 17, 182, 13, 218, 201, 17, 195, 79, 13, + 218, 201, 17, 100, 13, 218, 201, 17, 102, 13, 218, 201, 17, 134, 13, 218, + 201, 17, 136, 13, 218, 201, 17, 146, 13, 218, 201, 17, 167, 13, 218, 201, + 17, 178, 13, 218, 201, 17, 171, 13, 218, 201, 17, 182, 23, 139, 226, 72, + 23, 232, 206, 226, 72, 23, 232, 202, 226, 72, 23, 232, 191, 226, 72, 23, + 232, 195, 226, 72, 23, 232, 208, 226, 72, 23, 139, 132, 248, 217, 23, + 232, 206, 132, 248, 217, 23, 139, 162, 200, 64, 132, 248, 217, 23, 139, + 132, 210, 215, 224, 14, 23, 139, 132, 241, 23, 23, 139, 132, 232, 37, 23, + 139, 132, 232, 38, 221, 208, 23, 232, 206, 132, 232, 39, 23, 139, 132, + 219, 63, 23, 232, 206, 132, 219, 63, 23, 139, 132, 112, 248, 217, 23, + 139, 132, 112, 210, 215, 224, 13, 23, 139, 132, 112, 232, 37, 23, 139, + 132, 124, 112, 232, 37, 23, 139, 132, 232, 38, 112, 200, 36, 23, 139, + 132, 112, 241, 144, 23, 139, 132, 112, 241, 145, 132, 248, 217, 23, 139, + 132, 112, 241, 145, 112, 248, 217, 23, 139, 132, 112, 241, 145, 241, 23, + 23, 139, 132, 112, 241, 145, 232, 37, 23, 139, 132, 112, 241, 58, 23, + 232, 206, 132, 112, 241, 58, 23, 139, 112, 248, 218, 127, 226, 72, 23, + 139, 132, 248, 218, 127, 219, 63, 23, 139, 132, 112, 202, 141, 23, 232, + 206, 132, 112, 202, 141, 23, 139, 132, 112, 204, 218, 162, 248, 217, 23, + 139, 132, 112, 248, 218, 162, 204, 217, 23, 139, 132, 112, 162, 248, 217, + 23, 139, 132, 112, 232, 38, 205, 103, 162, 206, 97, 23, 139, 132, 124, + 112, 232, 38, 162, 206, 97, 23, 139, 132, 124, 112, 232, 38, 162, 241, + 144, 23, 139, 132, 232, 38, 112, 124, 162, 206, 97, 23, 139, 132, 112, + 124, 205, 103, 162, 235, 11, 23, 139, 132, 112, 162, 241, 23, 23, 139, + 132, 112, 162, 244, 248, 23, 139, 132, 112, 162, 231, 163, 23, 139, 132, + 112, 162, 232, 37, 23, 139, 162, 248, 204, 132, 112, 204, 217, 23, 139, + 132, 112, 241, 145, 162, 206, 97, 23, 139, 132, 112, 241, 145, 162, 206, + 98, 241, 144, 23, 139, 132, 112, 241, 145, 162, 206, 98, 248, 217, 23, + 139, 112, 162, 231, 164, 132, 200, 36, 23, 139, 132, 162, 231, 164, 112, + 200, 36, 23, 139, 132, 112, 241, 145, 232, 38, 162, 206, 97, 23, 139, + 132, 112, 241, 59, 162, 206, 97, 23, 139, 132, 112, 241, 145, 162, 235, + 11, 23, 139, 132, 112, 241, 145, 241, 24, 162, 235, 11, 23, 139, 112, + 162, 241, 24, 132, 200, 36, 23, 139, 132, 162, 241, 24, 112, 200, 36, 23, + 139, 112, 162, 46, 132, 200, 36, 23, 139, 112, 162, 46, 132, 232, 37, 23, + 139, 132, 162, 251, 89, 214, 35, 112, 200, 36, 23, 139, 132, 162, 251, + 89, 226, 87, 112, 200, 36, 23, 139, 132, 162, 46, 112, 200, 36, 23, 139, + 132, 112, 162, 241, 145, 232, 37, 23, 139, 132, 112, 162, 251, 89, 214, + 34, 23, 139, 132, 112, 162, 251, 88, 23, 139, 112, 162, 251, 89, 214, 35, + 132, 200, 36, 23, 139, 112, 162, 251, 89, 214, 35, 132, 241, 58, 23, 139, + 112, 162, 251, 89, 132, 200, 36, 23, 139, 132, 162, 231, 164, 112, 232, + 37, 23, 232, 197, 235, 7, 235, 122, 23, 232, 197, 235, 7, 235, 123, 248, + 217, 23, 232, 197, 235, 7, 235, 123, 232, 37, 23, 232, 197, 235, 7, 235, + 123, 241, 144, 23, 232, 197, 235, 7, 235, 123, 241, 145, 205, 112, 23, + 232, 204, 235, 7, 235, 123, 241, 144, 23, 139, 235, 7, 235, 123, 241, + 145, 248, 217, 23, 232, 195, 235, 7, 235, 123, 241, 144, 23, 232, 197, + 235, 101, 235, 123, 205, 102, 23, 232, 197, 232, 116, 235, 101, 235, 123, + 205, 102, 23, 232, 197, 235, 101, 235, 123, 205, 103, 235, 7, 248, 217, + 23, 232, 197, 232, 116, 235, 101, 235, 123, 205, 103, 235, 7, 248, 217, + 23, 232, 197, 235, 101, 235, 123, 205, 103, 248, 217, 23, 232, 197, 232, + 116, 235, 101, 235, 123, 205, 103, 248, 217, 23, 232, 197, 235, 101, 235, + 123, 205, 103, 162, 235, 11, 23, 232, 202, 235, 101, 235, 123, 205, 102, + 23, 232, 202, 235, 101, 235, 123, 205, 103, 214, 92, 23, 232, 195, 235, + 101, 235, 123, 205, 103, 214, 92, 23, 232, 191, 235, 101, 235, 123, 205, + 102, 23, 232, 197, 235, 101, 235, 123, 205, 103, 232, 37, 23, 232, 197, + 235, 101, 235, 123, 205, 103, 232, 38, 162, 206, 97, 23, 232, 197, 235, + 101, 235, 123, 205, 103, 232, 38, 216, 51, 202, 141, 23, 232, 196, 23, + 232, 197, 248, 204, 213, 207, 235, 225, 23, 232, 197, 232, 115, 23, 232, + 197, 162, 206, 97, 23, 232, 197, 232, 116, 162, 206, 97, 23, 232, 197, + 162, 248, 217, 23, 232, 197, 162, 235, 11, 23, 232, 197, 205, 113, 132, + 162, 206, 97, 23, 232, 197, 205, 113, 247, 36, 23, 232, 197, 205, 113, + 247, 37, 162, 206, 97, 23, 232, 197, 205, 113, 247, 37, 162, 206, 98, + 248, 217, 23, 232, 197, 205, 113, 222, 46, 23, 232, 203, 23, 232, 204, + 162, 206, 97, 23, 232, 204, 216, 51, 202, 141, 23, 232, 204, 162, 235, + 11, 23, 232, 193, 241, 20, 23, 232, 192, 23, 232, 202, 214, 92, 23, 232, + 201, 23, 232, 202, 192, 162, 206, 97, 23, 232, 202, 162, 206, 97, 23, + 232, 202, 192, 216, 51, 202, 141, 23, 232, 202, 216, 51, 202, 141, 23, + 232, 202, 192, 162, 235, 11, 23, 232, 202, 162, 235, 11, 23, 232, 200, + 214, 92, 23, 232, 199, 23, 232, 205, 23, 232, 190, 23, 232, 191, 162, + 206, 97, 23, 232, 191, 216, 51, 202, 141, 23, 232, 191, 162, 235, 11, 23, + 232, 195, 214, 92, 23, 232, 195, 192, 162, 235, 11, 23, 232, 194, 23, + 232, 195, 205, 224, 23, 232, 195, 192, 162, 206, 97, 23, 232, 195, 162, + 206, 97, 23, 232, 195, 192, 216, 51, 202, 141, 23, 232, 195, 216, 51, + 202, 141, 23, 232, 195, 162, 206, 98, 201, 225, 226, 72, 23, 232, 195, + 162, 248, 204, 112, 210, 2, 23, 232, 207, 23, 139, 132, 112, 210, 2, 23, + 232, 206, 132, 112, 210, 2, 23, 232, 195, 132, 112, 210, 2, 23, 232, 208, + 132, 112, 210, 2, 23, 232, 195, 222, 46, 23, 139, 132, 112, 210, 3, 248, + 217, 23, 139, 132, 112, 210, 3, 241, 144, 23, 232, 195, 132, 112, 210, 3, + 241, 144, 23, 139, 222, 47, 237, 235, 23, 139, 222, 47, 135, 209, 253, + 204, 217, 23, 139, 222, 47, 135, 209, 253, 241, 9, 23, 139, 222, 47, 135, + 214, 45, 244, 248, 23, 139, 222, 47, 200, 36, 23, 139, 162, 200, 64, 222, + 47, 200, 36, 23, 232, 206, 222, 47, 200, 36, 23, 232, 191, 222, 47, 200, + 36, 23, 232, 208, 222, 47, 200, 36, 23, 139, 222, 47, 210, 215, 224, 14, + 23, 139, 222, 47, 248, 217, 23, 139, 222, 47, 201, 226, 202, 141, 23, + 139, 222, 47, 202, 141, 23, 232, 195, 222, 47, 202, 141, 23, 139, 222, + 47, 132, 202, 141, 23, 232, 195, 222, 47, 132, 202, 141, 23, 232, 208, + 222, 47, 132, 162, 132, 162, 214, 34, 23, 232, 208, 222, 47, 132, 162, + 132, 202, 141, 23, 139, 222, 47, 226, 72, 23, 232, 206, 222, 47, 226, 72, + 23, 232, 195, 222, 47, 226, 72, 23, 232, 208, 222, 47, 226, 72, 23, 139, + 132, 112, 222, 46, 23, 232, 206, 132, 112, 222, 46, 23, 232, 195, 132, + 112, 222, 46, 23, 232, 195, 210, 2, 23, 232, 208, 132, 112, 222, 46, 23, + 139, 132, 112, 241, 62, 222, 46, 23, 232, 206, 132, 112, 241, 62, 222, + 46, 23, 139, 210, 3, 237, 235, 23, 232, 195, 210, 3, 135, 132, 162, 231, + 165, 219, 63, 23, 232, 208, 210, 3, 135, 112, 162, 132, 241, 61, 23, 139, + 210, 3, 200, 36, 23, 139, 210, 3, 210, 215, 224, 14, 23, 139, 210, 3, + 222, 46, 23, 232, 206, 210, 3, 222, 46, 23, 232, 191, 210, 3, 222, 46, + 23, 232, 208, 210, 3, 222, 46, 23, 139, 210, 3, 219, 63, 23, 139, 210, 3, + 112, 241, 144, 23, 139, 210, 3, 112, 210, 215, 224, 13, 23, 139, 210, 3, + 226, 72, 23, 139, 210, 3, 202, 141, 23, 232, 193, 210, 3, 202, 141, 23, + 139, 132, 210, 3, 222, 46, 23, 232, 206, 132, 210, 3, 222, 46, 23, 232, + 200, 132, 210, 3, 222, 47, 214, 119, 23, 232, 193, 132, 210, 3, 222, 47, + 214, 34, 23, 232, 193, 132, 210, 3, 222, 47, 226, 86, 23, 232, 193, 132, + 210, 3, 222, 47, 200, 63, 23, 232, 202, 132, 210, 3, 222, 46, 23, 232, + 195, 132, 210, 3, 222, 46, 23, 232, 208, 132, 210, 3, 222, 47, 214, 34, + 23, 232, 208, 132, 210, 3, 222, 46, 23, 139, 112, 237, 235, 23, 232, 195, + 219, 63, 23, 139, 112, 200, 36, 23, 232, 206, 112, 200, 36, 23, 139, 112, + 210, 215, 224, 14, 23, 139, 112, 124, 162, 206, 97, 23, 232, 193, 112, + 202, 141, 23, 139, 112, 162, 222, 46, 23, 139, 112, 222, 46, 23, 139, + 112, 210, 3, 222, 46, 23, 232, 206, 112, 210, 3, 222, 46, 23, 232, 200, + 112, 210, 3, 222, 47, 214, 119, 23, 232, 202, 112, 210, 3, 222, 46, 23, + 232, 195, 112, 210, 3, 222, 46, 23, 232, 208, 112, 210, 3, 222, 47, 214, + 34, 23, 232, 208, 112, 210, 3, 222, 47, 226, 86, 23, 232, 208, 112, 210, + 3, 222, 46, 23, 232, 206, 112, 210, 3, 222, 47, 248, 217, 23, 232, 204, + 112, 210, 3, 222, 47, 241, 144, 23, 232, 204, 112, 210, 3, 222, 47, 241, + 145, 206, 97, 23, 232, 193, 112, 210, 3, 222, 47, 241, 145, 214, 34, 23, + 232, 193, 112, 210, 3, 222, 47, 241, 145, 226, 86, 23, 232, 193, 112, + 210, 3, 222, 47, 241, 144, 23, 232, 195, 132, 232, 37, 23, 139, 132, 162, + 206, 97, 23, 232, 195, 132, 162, 206, 97, 23, 139, 132, 162, 206, 98, + 162, 239, 146, 23, 139, 132, 162, 206, 98, 162, 241, 144, 23, 139, 132, + 162, 206, 98, 162, 248, 217, 23, 139, 132, 162, 206, 98, 132, 248, 217, + 23, 139, 132, 162, 206, 98, 248, 88, 248, 217, 23, 139, 132, 162, 206, + 98, 132, 232, 39, 23, 139, 132, 162, 235, 12, 132, 204, 217, 23, 139, + 132, 162, 235, 12, 132, 248, 217, 23, 139, 132, 162, 122, 23, 139, 132, + 162, 241, 20, 23, 139, 132, 162, 241, 12, 162, 226, 41, 23, 232, 204, + 132, 162, 241, 12, 162, 226, 41, 23, 139, 132, 162, 241, 12, 162, 200, + 63, 23, 139, 132, 162, 244, 249, 23, 232, 202, 132, 202, 141, 23, 232, + 202, 132, 162, 214, 92, 23, 232, 195, 132, 162, 214, 92, 23, 232, 195, + 132, 162, 222, 227, 23, 232, 195, 132, 202, 141, 23, 232, 195, 132, 162, + 205, 224, 23, 232, 208, 132, 162, 214, 34, 23, 232, 208, 132, 162, 226, + 86, 23, 232, 208, 132, 202, 141, 23, 139, 202, 141, 23, 139, 162, 232, + 115, 23, 139, 162, 206, 98, 239, 146, 23, 139, 162, 206, 98, 241, 144, + 23, 139, 162, 206, 98, 248, 217, 23, 139, 162, 235, 11, 23, 139, 162, + 248, 204, 132, 219, 63, 23, 139, 162, 248, 204, 112, 210, 2, 23, 139, + 162, 248, 204, 210, 3, 222, 46, 23, 139, 162, 200, 64, 99, 235, 122, 23, + 139, 162, 127, 99, 235, 122, 23, 139, 162, 200, 64, 115, 235, 122, 23, + 139, 162, 200, 64, 235, 7, 235, 122, 23, 139, 162, 127, 235, 7, 210, 215, + 224, 13, 23, 232, 198, 23, 139, 232, 115, 23, 201, 227, 206, 61, 23, 201, + 227, 218, 119, 23, 201, 227, 248, 203, 23, 233, 105, 206, 61, 23, 233, + 105, 218, 119, 23, 233, 105, 248, 203, 23, 204, 201, 206, 61, 23, 204, + 201, 218, 119, 23, 204, 201, 248, 203, 23, 248, 29, 206, 61, 23, 248, 29, + 218, 119, 23, 248, 29, 248, 203, 23, 209, 132, 206, 61, 23, 209, 132, + 218, 119, 23, 209, 132, 248, 203, 23, 204, 84, 203, 249, 23, 204, 84, + 248, 203, 23, 205, 90, 222, 228, 206, 61, 23, 205, 90, 4, 206, 61, 23, + 205, 90, 222, 228, 218, 119, 23, 205, 90, 4, 218, 119, 23, 205, 90, 207, + 86, 23, 235, 73, 222, 228, 206, 61, 23, 235, 73, 4, 206, 61, 23, 235, 73, + 222, 228, 218, 119, 23, 235, 73, 4, 218, 119, 23, 235, 73, 207, 86, 23, + 205, 90, 235, 73, 251, 128, 23, 218, 157, 124, 135, 222, 227, 23, 218, + 157, 124, 135, 205, 224, 23, 218, 157, 124, 207, 86, 23, 218, 157, 135, + 207, 86, 23, 218, 157, 124, 135, 251, 129, 222, 227, 23, 218, 157, 124, + 135, 251, 129, 205, 224, 23, 218, 157, 206, 98, 202, 30, 206, 98, 208, + 161, 23, 218, 156, 235, 128, 241, 134, 23, 218, 158, 235, 128, 241, 134, + 23, 218, 156, 206, 62, 204, 218, 205, 224, 23, 218, 156, 206, 62, 204, + 218, 219, 189, 23, 218, 156, 206, 62, 204, 218, 222, 227, 23, 218, 156, + 206, 62, 204, 218, 222, 225, 23, 218, 156, 206, 62, 196, 247, 235, 76, + 23, 218, 156, 52, 204, 217, 23, 218, 156, 52, 196, 247, 235, 76, 23, 218, + 156, 52, 251, 128, 23, 218, 156, 52, 251, 129, 196, 247, 235, 76, 23, + 218, 156, 241, 61, 23, 218, 156, 201, 165, 204, 218, 218, 160, 23, 218, + 156, 201, 165, 196, 247, 235, 76, 23, 218, 156, 201, 165, 251, 128, 23, + 218, 156, 201, 165, 251, 129, 196, 247, 235, 76, 23, 218, 156, 248, 222, + 205, 224, 23, 218, 156, 248, 222, 219, 189, 23, 218, 156, 248, 222, 222, + 227, 23, 218, 156, 241, 102, 205, 224, 23, 218, 156, 241, 102, 219, 189, + 23, 218, 156, 241, 102, 222, 227, 23, 218, 156, 241, 102, 209, 192, 23, + 218, 156, 245, 102, 205, 224, 23, 218, 156, 245, 102, 219, 189, 23, 218, + 156, 245, 102, 222, 227, 23, 218, 156, 111, 205, 224, 23, 218, 156, 111, + 219, 189, 23, 218, 156, 111, 222, 227, 23, 218, 156, 195, 24, 205, 224, + 23, 218, 156, 195, 24, 219, 189, 23, 218, 156, 195, 24, 222, 227, 23, + 218, 156, 213, 87, 205, 224, 23, 218, 156, 213, 87, 219, 189, 23, 218, + 156, 213, 87, 222, 227, 23, 201, 195, 209, 190, 206, 61, 23, 201, 195, + 209, 190, 237, 245, 23, 201, 195, 209, 190, 251, 128, 23, 201, 195, 209, + 191, 206, 61, 23, 201, 195, 209, 191, 237, 245, 23, 201, 195, 209, 191, + 251, 128, 23, 201, 195, 207, 30, 23, 201, 195, 250, 232, 205, 121, 206, + 61, 23, 201, 195, 250, 232, 205, 121, 237, 245, 23, 201, 195, 250, 232, + 205, 121, 201, 164, 23, 218, 159, 250, 126, 205, 224, 23, 218, 159, 250, + 126, 219, 189, 23, 218, 159, 250, 126, 222, 227, 23, 218, 159, 250, 126, + 222, 225, 23, 218, 159, 201, 221, 205, 224, 23, 218, 159, 201, 221, 219, + 189, 23, 218, 159, 201, 221, 222, 227, 23, 218, 159, 201, 221, 222, 225, + 23, 218, 159, 248, 204, 250, 126, 205, 224, 23, 218, 159, 248, 204, 250, + 126, 219, 189, 23, 218, 159, 248, 204, 250, 126, 222, 227, 23, 218, 159, + 248, 204, 250, 126, 222, 225, 23, 218, 159, 248, 204, 201, 221, 205, 224, + 23, 218, 159, 248, 204, 201, 221, 219, 189, 23, 218, 159, 248, 204, 201, + 221, 222, 227, 23, 218, 159, 248, 204, 201, 221, 222, 225, 23, 218, 158, + 206, 62, 204, 218, 205, 224, 23, 218, 158, 206, 62, 204, 218, 219, 189, + 23, 218, 158, 206, 62, 204, 218, 222, 227, 23, 218, 158, 206, 62, 204, + 218, 222, 225, 23, 218, 158, 206, 62, 196, 247, 235, 76, 23, 218, 158, + 52, 204, 217, 23, 218, 158, 52, 196, 247, 235, 76, 23, 218, 158, 52, 251, + 128, 23, 218, 158, 52, 251, 129, 196, 247, 235, 76, 23, 218, 158, 241, + 61, 23, 218, 158, 201, 165, 204, 218, 218, 160, 23, 218, 158, 201, 165, + 196, 247, 235, 76, 23, 218, 158, 201, 165, 251, 129, 218, 160, 23, 218, + 158, 201, 165, 251, 129, 196, 247, 235, 76, 23, 218, 158, 248, 221, 23, + 218, 158, 241, 102, 205, 224, 23, 218, 158, 241, 102, 219, 189, 23, 218, + 158, 241, 102, 222, 227, 23, 218, 158, 245, 101, 23, 218, 158, 111, 205, + 224, 23, 218, 158, 111, 219, 189, 23, 218, 158, 111, 222, 227, 23, 218, + 158, 195, 24, 205, 224, 23, 218, 158, 195, 24, 219, 189, 23, 218, 158, + 195, 24, 222, 227, 23, 218, 158, 213, 87, 205, 224, 23, 218, 158, 213, + 87, 219, 189, 23, 218, 158, 213, 87, 222, 227, 23, 201, 196, 209, 191, + 206, 61, 23, 201, 196, 209, 191, 237, 245, 23, 201, 196, 209, 191, 251, + 128, 23, 201, 196, 209, 190, 206, 61, 23, 201, 196, 209, 190, 237, 245, + 23, 201, 196, 209, 190, 251, 128, 23, 201, 196, 207, 30, 23, 218, 156, + 241, 12, 211, 88, 205, 224, 23, 218, 156, 241, 12, 211, 88, 219, 189, 23, + 218, 156, 241, 12, 211, 88, 222, 227, 23, 218, 156, 241, 12, 211, 88, + 222, 225, 23, 218, 156, 241, 12, 232, 222, 205, 224, 23, 218, 156, 241, + 12, 232, 222, 219, 189, 23, 218, 156, 241, 12, 232, 222, 222, 227, 23, + 218, 156, 241, 12, 232, 222, 222, 225, 23, 218, 156, 241, 12, 202, 147, + 244, 250, 205, 224, 23, 218, 156, 241, 12, 202, 147, 244, 250, 219, 189, + 23, 218, 156, 231, 60, 205, 224, 23, 218, 156, 231, 60, 219, 189, 23, + 218, 156, 231, 60, 222, 227, 23, 218, 156, 221, 226, 205, 224, 23, 218, + 156, 221, 226, 219, 189, 23, 218, 156, 221, 226, 222, 227, 23, 218, 156, + 221, 226, 4, 237, 245, 23, 218, 156, 197, 123, 241, 12, 52, 205, 224, 23, + 218, 156, 197, 123, 241, 12, 52, 219, 189, 23, 218, 156, 197, 123, 241, + 12, 52, 222, 227, 23, 218, 156, 197, 123, 241, 12, 201, 165, 205, 224, + 23, 218, 156, 197, 123, 241, 12, 201, 165, 219, 189, 23, 218, 156, 197, + 123, 241, 12, 201, 165, 222, 227, 23, 218, 156, 241, 12, 202, 209, 204, + 217, 23, 218, 156, 241, 10, 241, 62, 205, 224, 23, 218, 156, 241, 10, + 241, 62, 219, 189, 23, 209, 190, 206, 61, 23, 209, 190, 237, 245, 23, + 209, 190, 251, 130, 23, 218, 156, 207, 30, 23, 218, 156, 241, 12, 232, + 30, 234, 234, 197, 148, 23, 218, 156, 231, 60, 232, 30, 234, 234, 197, + 148, 23, 218, 156, 221, 226, 232, 30, 234, 234, 197, 148, 23, 218, 156, + 197, 123, 232, 30, 234, 234, 197, 148, 23, 209, 190, 206, 62, 232, 30, + 234, 234, 197, 148, 23, 209, 190, 52, 232, 30, 234, 234, 197, 148, 23, + 209, 190, 251, 129, 232, 30, 234, 234, 197, 148, 23, 218, 156, 241, 12, + 232, 30, 245, 82, 23, 218, 156, 231, 60, 232, 30, 245, 82, 23, 218, 156, + 221, 226, 232, 30, 245, 82, 23, 218, 156, 197, 123, 232, 30, 245, 82, 23, + 209, 190, 206, 62, 232, 30, 245, 82, 23, 209, 190, 52, 232, 30, 245, 82, + 23, 209, 190, 251, 129, 232, 30, 245, 82, 23, 218, 156, 197, 123, 239, + 147, 213, 113, 205, 224, 23, 218, 156, 197, 123, 239, 147, 213, 113, 219, + 189, 23, 218, 156, 197, 123, 239, 147, 213, 113, 222, 227, 23, 218, 158, + 241, 12, 232, 30, 247, 46, 205, 224, 23, 218, 158, 241, 12, 232, 30, 247, + 46, 222, 227, 23, 218, 158, 231, 60, 232, 30, 247, 46, 4, 237, 245, 23, + 218, 158, 231, 60, 232, 30, 247, 46, 222, 228, 237, 245, 23, 218, 158, + 231, 60, 232, 30, 247, 46, 4, 201, 164, 23, 218, 158, 231, 60, 232, 30, + 247, 46, 222, 228, 201, 164, 23, 218, 158, 221, 226, 232, 30, 247, 46, 4, + 206, 61, 23, 218, 158, 221, 226, 232, 30, 247, 46, 222, 228, 206, 61, 23, + 218, 158, 221, 226, 232, 30, 247, 46, 4, 237, 245, 23, 218, 158, 221, + 226, 232, 30, 247, 46, 222, 228, 237, 245, 23, 218, 158, 197, 123, 232, + 30, 247, 46, 205, 224, 23, 218, 158, 197, 123, 232, 30, 247, 46, 222, + 227, 23, 209, 191, 206, 62, 232, 30, 247, 45, 23, 209, 191, 52, 232, 30, + 247, 45, 23, 209, 191, 251, 129, 232, 30, 247, 45, 23, 218, 158, 241, 12, + 232, 30, 235, 70, 205, 224, 23, 218, 158, 241, 12, 232, 30, 235, 70, 222, + 227, 23, 218, 158, 231, 60, 232, 30, 235, 70, 4, 237, 245, 23, 218, 158, + 231, 60, 232, 30, 235, 70, 222, 228, 237, 245, 23, 218, 158, 231, 60, + 232, 30, 235, 70, 201, 165, 4, 201, 164, 23, 218, 158, 231, 60, 232, 30, + 235, 70, 201, 165, 222, 228, 201, 164, 23, 218, 158, 221, 226, 232, 30, + 235, 70, 4, 206, 61, 23, 218, 158, 221, 226, 232, 30, 235, 70, 222, 228, + 206, 61, 23, 218, 158, 221, 226, 232, 30, 235, 70, 4, 237, 245, 23, 218, + 158, 221, 226, 232, 30, 235, 70, 222, 228, 237, 245, 23, 218, 158, 197, + 123, 232, 30, 235, 70, 205, 224, 23, 218, 158, 197, 123, 232, 30, 235, + 70, 222, 227, 23, 209, 191, 206, 62, 232, 30, 235, 69, 23, 209, 191, 52, + 232, 30, 235, 69, 23, 209, 191, 251, 129, 232, 30, 235, 69, 23, 218, 158, + 241, 12, 205, 224, 23, 218, 158, 241, 12, 219, 189, 23, 218, 158, 241, + 12, 222, 227, 23, 218, 158, 241, 12, 222, 225, 23, 218, 158, 241, 12, + 244, 163, 23, 218, 158, 231, 60, 205, 224, 23, 218, 158, 221, 226, 205, + 224, 23, 218, 158, 197, 123, 205, 212, 23, 218, 158, 197, 123, 205, 224, + 23, 218, 158, 197, 123, 222, 227, 23, 209, 191, 206, 61, 23, 209, 191, + 237, 245, 23, 209, 191, 251, 128, 23, 218, 158, 207, 31, 213, 145, 23, + 218, 156, 250, 232, 244, 250, 4, 206, 61, 23, 218, 156, 250, 232, 244, + 250, 219, 190, 206, 61, 23, 218, 156, 250, 232, 244, 250, 4, 237, 245, + 23, 218, 156, 250, 232, 244, 250, 219, 190, 237, 245, 23, 218, 158, 250, + 232, 244, 250, 232, 30, 197, 149, 4, 206, 61, 23, 218, 158, 250, 232, + 244, 250, 232, 30, 197, 149, 219, 190, 206, 61, 23, 218, 158, 250, 232, + 244, 250, 232, 30, 197, 149, 222, 228, 206, 61, 23, 218, 158, 250, 232, + 244, 250, 232, 30, 197, 149, 4, 237, 245, 23, 218, 158, 250, 232, 244, + 250, 232, 30, 197, 149, 219, 190, 237, 245, 23, 218, 158, 250, 232, 244, + 250, 232, 30, 197, 149, 222, 228, 237, 245, 23, 218, 156, 196, 247, 244, + 250, 234, 234, 206, 61, 23, 218, 156, 196, 247, 244, 250, 234, 234, 237, + 245, 23, 218, 158, 196, 247, 244, 250, 232, 30, 197, 149, 206, 61, 23, + 218, 158, 196, 247, 244, 250, 232, 30, 197, 149, 237, 245, 23, 218, 156, + 235, 128, 244, 247, 206, 61, 23, 218, 156, 235, 128, 244, 247, 237, 245, + 23, 218, 158, 235, 128, 244, 247, 232, 30, 197, 149, 206, 61, 23, 218, + 158, 235, 128, 244, 247, 232, 30, 197, 149, 237, 245, 23, 237, 161, 250, + 218, 205, 224, 23, 237, 161, 250, 218, 222, 227, 23, 237, 161, 235, 203, + 23, 237, 161, 205, 227, 23, 237, 161, 203, 16, 23, 237, 161, 210, 134, + 23, 237, 161, 206, 67, 23, 237, 161, 206, 68, 251, 128, 23, 237, 161, + 236, 99, 214, 46, 202, 78, 23, 237, 161, 233, 115, 23, 232, 137, 23, 232, + 138, 210, 7, 23, 232, 138, 218, 156, 204, 217, 23, 232, 138, 218, 156, + 202, 81, 23, 232, 138, 218, 158, 204, 217, 23, 232, 138, 218, 156, 241, + 11, 23, 232, 138, 218, 158, 241, 11, 23, 232, 138, 218, 161, 244, 249, + 23, 235, 234, 239, 85, 212, 79, 216, 21, 235, 12, 202, 79, 23, 235, 234, + 239, 85, 212, 79, 216, 21, 124, 214, 73, 237, 235, 23, 235, 234, 239, 85, + 212, 79, 216, 21, 124, 214, 73, 135, 202, 79, 23, 236, 65, 204, 218, 200, + 36, 23, 236, 65, 204, 218, 217, 84, 23, 236, 65, 204, 218, 237, 235, 23, + 237, 219, 236, 65, 217, 85, 237, 235, 23, 237, 219, 236, 65, 135, 217, + 84, 23, 237, 219, 236, 65, 124, 217, 84, 23, 237, 219, 236, 65, 217, 85, + 200, 36, 23, 235, 29, 217, 84, 23, 235, 29, 241, 134, 23, 235, 29, 196, + 250, 23, 236, 60, 214, 92, 23, 236, 60, 205, 89, 23, 236, 60, 244, 202, + 23, 236, 68, 248, 127, 206, 61, 23, 236, 68, 248, 127, 218, 119, 23, 236, + 60, 157, 214, 92, 23, 236, 60, 197, 62, 214, 92, 23, 236, 60, 157, 244, + 202, 23, 236, 60, 197, 60, 218, 160, 23, 236, 68, 197, 43, 23, 236, 61, + 200, 36, 23, 236, 61, 237, 235, 23, 236, 61, 235, 56, 23, 236, 63, 204, + 217, 23, 236, 63, 204, 218, 237, 245, 23, 236, 63, 204, 218, 251, 128, + 23, 236, 64, 204, 217, 23, 236, 64, 204, 218, 237, 245, 23, 236, 64, 204, + 218, 251, 128, 23, 236, 63, 241, 9, 23, 236, 64, 241, 9, 23, 236, 63, + 244, 244, 23, 245, 97, 211, 217, 23, 245, 97, 217, 84, 23, 245, 97, 204, + 131, 23, 203, 17, 245, 97, 232, 48, 23, 203, 17, 245, 97, 219, 63, 23, + 203, 17, 245, 97, 221, 208, 23, 237, 74, 23, 216, 21, 217, 84, 23, 216, + 21, 241, 134, 23, 216, 21, 196, 248, 23, 216, 21, 197, 57, 23, 251, 190, + 248, 120, 214, 34, 23, 251, 190, 204, 130, 226, 86, 23, 251, 190, 248, + 122, 4, 209, 189, 23, 251, 190, 204, 132, 4, 209, 189, 23, 248, 49, 226, + 58, 23, 248, 49, 236, 88, 23, 218, 165, 244, 203, 217, 84, 23, 218, 165, + 244, 203, 235, 11, 23, 218, 165, 244, 203, 241, 134, 23, 218, 165, 205, + 219, 23, 218, 165, 205, 220, 196, 250, 23, 218, 165, 205, 220, 214, 92, + 23, 218, 165, 234, 230, 23, 218, 165, 234, 231, 196, 250, 23, 218, 165, + 234, 231, 214, 92, 23, 218, 165, 192, 244, 249, 23, 218, 165, 192, 235, + 11, 23, 218, 165, 192, 196, 250, 23, 218, 165, 192, 214, 27, 23, 218, + 165, 192, 214, 28, 196, 250, 23, 218, 165, 192, 214, 28, 196, 77, 23, + 218, 165, 192, 210, 163, 23, 218, 165, 192, 210, 164, 196, 250, 23, 218, + 165, 192, 210, 164, 196, 77, 23, 218, 165, 224, 57, 23, 218, 165, 224, + 58, 235, 11, 23, 218, 165, 224, 58, 196, 250, 23, 218, 165, 203, 16, 23, + 218, 165, 203, 17, 235, 11, 23, 218, 165, 203, 17, 204, 131, 23, 222, 60, + 212, 23, 202, 19, 23, 222, 62, 221, 203, 127, 200, 32, 23, 222, 62, 200, + 33, 127, 221, 202, 23, 218, 165, 241, 100, 23, 218, 165, 196, 249, 206, + 61, 23, 218, 165, 196, 249, 237, 245, 23, 201, 250, 204, 237, 214, 35, + 235, 205, 23, 201, 250, 222, 105, 222, 59, 23, 201, 250, 202, 68, 248, + 204, 222, 59, 23, 201, 250, 202, 68, 201, 225, 226, 42, 218, 164, 23, + 201, 250, 226, 42, 218, 165, 210, 134, 23, 201, 250, 218, 155, 251, 215, + 245, 98, 23, 201, 250, 247, 37, 204, 237, 214, 34, 23, 201, 250, 247, 37, + 226, 42, 218, 164, 23, 203, 44, 23, 203, 45, 218, 160, 23, 203, 45, 214, + 120, 201, 249, 23, 203, 45, 214, 120, 201, 250, 218, 160, 23, 203, 45, + 214, 120, 222, 59, 23, 203, 45, 214, 120, 222, 60, 218, 160, 23, 203, 45, + 248, 143, 222, 59, 23, 218, 156, 225, 197, 23, 218, 158, 225, 197, 23, + 217, 109, 23, 232, 233, 23, 236, 91, 23, 206, 164, 232, 36, 205, 122, 23, + 206, 164, 232, 36, 212, 77, 23, 197, 147, 206, 164, 232, 36, 218, 163, + 23, 235, 68, 206, 164, 232, 36, 218, 163, 23, 206, 164, 202, 80, 234, + 235, 197, 153, 23, 201, 232, 204, 218, 204, 205, 23, 201, 232, 241, 10, + 248, 221, 23, 201, 233, 200, 218, 23, 200, 33, 248, 111, 202, 80, 234, + 235, 232, 36, 225, 123, 23, 222, 87, 244, 164, 23, 222, 87, 222, 157, 23, + 222, 87, 222, 156, 23, 222, 87, 222, 155, 23, 222, 87, 222, 154, 23, 222, + 87, 222, 153, 23, 222, 87, 222, 152, 23, 222, 87, 222, 151, 23, 235, 127, + 23, 222, 1, 205, 148, 23, 222, 2, 205, 148, 23, 222, 4, 232, 111, 23, + 222, 4, 197, 58, 23, 222, 4, 239, 199, 23, 222, 4, 232, 138, 217, 109, + 23, 222, 4, 201, 234, 23, 222, 4, 222, 86, 239, 117, 23, 244, 159, 23, + 234, 217, 204, 226, 23, 207, 105, 23, 244, 168, 23, 213, 140, 23, 235, + 137, 218, 227, 23, 235, 137, 218, 226, 23, 235, 137, 218, 225, 23, 235, + 137, 218, 224, 23, 235, 137, 218, 223, 23, 209, 193, 218, 227, 23, 209, + 193, 218, 226, 23, 209, 193, 218, 225, 23, 209, 193, 218, 224, 23, 209, + 193, 218, 223, 23, 209, 193, 218, 222, 23, 209, 193, 218, 221, 23, 209, + 193, 218, 220, 23, 209, 193, 218, 234, 23, 209, 193, 218, 233, 23, 209, + 193, 218, 232, 23, 209, 193, 218, 231, 23, 209, 193, 218, 230, 23, 209, + 193, 218, 229, 23, 209, 193, 218, 228, 38, 125, 1, 250, 113, 38, 125, 1, + 248, 9, 38, 125, 1, 199, 116, 38, 125, 1, 233, 159, 38, 125, 1, 239, 23, + 38, 125, 1, 196, 38, 38, 125, 1, 195, 58, 38, 125, 1, 195, 84, 38, 125, + 1, 225, 221, 38, 125, 1, 84, 225, 221, 38, 125, 1, 68, 38, 125, 1, 239, + 44, 38, 125, 1, 225, 23, 38, 125, 1, 222, 39, 38, 125, 1, 218, 59, 38, + 125, 1, 217, 206, 38, 125, 1, 214, 104, 38, 125, 1, 212, 104, 38, 125, 1, + 209, 249, 38, 125, 1, 205, 229, 38, 125, 1, 200, 246, 38, 125, 1, 200, + 83, 38, 125, 1, 234, 238, 38, 125, 1, 232, 91, 38, 125, 1, 206, 154, 38, + 125, 1, 201, 92, 38, 125, 1, 245, 36, 38, 125, 1, 207, 50, 38, 125, 1, + 196, 47, 38, 125, 1, 196, 49, 38, 125, 1, 196, 82, 38, 125, 1, 195, 217, + 38, 125, 1, 4, 195, 182, 38, 125, 1, 196, 3, 38, 125, 1, 226, 6, 4, 195, + 182, 38, 125, 1, 248, 171, 195, 182, 38, 125, 1, 226, 6, 248, 171, 195, + 182, 38, 125, 1, 235, 103, 215, 88, 211, 224, 86, 1, 166, 215, 88, 211, + 224, 86, 1, 201, 113, 215, 88, 211, 224, 86, 1, 215, 207, 215, 88, 211, + 224, 86, 1, 189, 215, 88, 211, 224, 86, 1, 142, 215, 88, 211, 224, 86, 1, + 176, 215, 88, 211, 224, 86, 1, 196, 208, 215, 88, 211, 224, 86, 1, 216, + 118, 215, 88, 211, 224, 86, 1, 247, 174, 215, 88, 211, 224, 86, 1, 172, + 215, 88, 211, 224, 86, 1, 183, 215, 88, 211, 224, 86, 1, 195, 115, 215, + 88, 211, 224, 86, 1, 217, 163, 215, 88, 211, 224, 86, 1, 215, 194, 215, + 88, 211, 224, 86, 1, 155, 215, 88, 211, 224, 86, 1, 240, 136, 215, 88, + 211, 224, 86, 1, 215, 109, 215, 88, 211, 224, 86, 1, 215, 252, 215, 88, + 211, 224, 86, 1, 199, 152, 215, 88, 211, 224, 86, 1, 215, 188, 215, 88, + 211, 224, 86, 1, 200, 210, 215, 88, 211, 224, 86, 1, 235, 239, 215, 88, + 211, 224, 86, 1, 169, 215, 88, 211, 224, 86, 1, 211, 159, 215, 88, 211, + 224, 86, 1, 164, 215, 88, 211, 224, 86, 1, 215, 254, 215, 88, 211, 224, + 86, 1, 161, 215, 88, 211, 224, 86, 1, 196, 164, 215, 88, 211, 224, 86, 1, + 216, 0, 215, 88, 211, 224, 86, 1, 239, 40, 215, 88, 211, 224, 86, 1, 215, + 255, 215, 88, 211, 224, 86, 1, 232, 236, 215, 88, 211, 224, 86, 1, 219, + 2, 215, 88, 211, 224, 86, 1, 212, 150, 215, 88, 211, 224, 86, 1, 234, + 123, 215, 88, 211, 224, 86, 1, 209, 181, 215, 88, 211, 224, 86, 1, 63, + 215, 88, 211, 224, 86, 1, 252, 168, 215, 88, 211, 224, 86, 1, 68, 215, + 88, 211, 224, 86, 1, 66, 215, 88, 211, 224, 86, 1, 72, 215, 88, 211, 224, + 86, 1, 214, 102, 215, 88, 211, 224, 86, 1, 69, 215, 88, 211, 224, 86, 1, + 237, 54, 215, 88, 211, 224, 86, 1, 197, 199, 215, 88, 211, 224, 86, 202, + 2, 215, 88, 211, 224, 86, 201, 254, 215, 88, 211, 224, 86, 201, 255, 215, + 88, 211, 224, 86, 201, 252, 215, 88, 211, 224, 86, 201, 253, 215, 88, + 211, 224, 86, 202, 0, 215, 88, 211, 224, 86, 202, 1, 215, 88, 211, 224, + 86, 2, 36, 213, 28, 215, 88, 211, 224, 86, 2, 36, 202, 187, 215, 88, 211, + 224, 86, 2, 36, 222, 3, 215, 88, 211, 224, 86, 2, 36, 251, 81, 215, 88, + 211, 224, 86, 2, 36, 226, 18, 215, 88, 211, 224, 86, 2, 196, 172, 196, + 171, 215, 88, 211, 224, 86, 5, 222, 150, 215, 88, 211, 224, 86, 17, 195, + 79, 215, 88, 211, 224, 86, 17, 100, 215, 88, 211, 224, 86, 17, 102, 215, + 88, 211, 224, 86, 17, 134, 215, 88, 211, 224, 86, 17, 136, 215, 88, 211, + 224, 86, 17, 146, 215, 88, 211, 224, 86, 17, 167, 215, 88, 211, 224, 86, + 17, 178, 215, 88, 211, 224, 86, 17, 171, 215, 88, 211, 224, 86, 17, 182, + 215, 88, 211, 224, 86, 221, 248, 215, 104, 215, 88, 211, 224, 86, 46, + 247, 174, 197, 145, 1, 252, 168, 197, 145, 1, 63, 197, 145, 1, 249, 145, + 197, 145, 1, 247, 174, 197, 145, 1, 240, 136, 197, 145, 1, 234, 123, 197, + 145, 1, 164, 197, 145, 1, 213, 6, 197, 145, 1, 172, 197, 145, 1, 176, 197, 145, 1, 161, 197, 145, 1, 189, 197, 145, 1, 202, 233, 197, 145, 1, - 235, 238, 197, 145, 1, 183, 197, 145, 1, 207, 50, 197, 145, 1, 225, 213, + 235, 239, 197, 145, 1, 183, 197, 145, 1, 207, 50, 197, 145, 1, 225, 214, 197, 145, 1, 195, 115, 197, 145, 1, 197, 166, 197, 145, 1, 199, 152, 197, - 145, 1, 155, 197, 145, 1, 72, 197, 145, 1, 250, 149, 197, 145, 1, 169, - 197, 145, 1, 166, 197, 145, 1, 224, 145, 197, 145, 1, 142, 197, 145, 1, - 69, 197, 145, 1, 68, 197, 145, 1, 217, 70, 197, 145, 1, 66, 197, 145, 1, - 222, 29, 197, 145, 1, 201, 113, 197, 145, 1, 201, 217, 197, 145, 1, 214, - 108, 197, 145, 1, 252, 126, 197, 145, 1, 251, 96, 197, 145, 1, 226, 59, - 197, 145, 1, 214, 118, 197, 145, 1, 236, 229, 197, 145, 1, 252, 127, 197, - 145, 1, 215, 108, 197, 145, 1, 200, 95, 197, 145, 1, 196, 15, 197, 145, - 152, 201, 13, 197, 145, 152, 201, 12, 197, 145, 152, 223, 254, 197, 145, - 152, 223, 253, 197, 145, 17, 195, 79, 197, 145, 17, 100, 197, 145, 17, + 145, 1, 155, 197, 145, 1, 72, 197, 145, 1, 250, 150, 197, 145, 1, 169, + 197, 145, 1, 166, 197, 145, 1, 224, 146, 197, 145, 1, 142, 197, 145, 1, + 69, 197, 145, 1, 68, 197, 145, 1, 217, 71, 197, 145, 1, 66, 197, 145, 1, + 222, 30, 197, 145, 1, 201, 113, 197, 145, 1, 201, 217, 197, 145, 1, 214, + 109, 197, 145, 1, 252, 127, 197, 145, 1, 251, 97, 197, 145, 1, 226, 60, + 197, 145, 1, 214, 119, 197, 145, 1, 236, 230, 197, 145, 1, 252, 128, 197, + 145, 1, 215, 109, 197, 145, 1, 200, 95, 197, 145, 1, 196, 15, 197, 145, + 152, 201, 13, 197, 145, 152, 201, 12, 197, 145, 152, 223, 255, 197, 145, + 152, 223, 254, 197, 145, 17, 195, 79, 197, 145, 17, 100, 197, 145, 17, 102, 197, 145, 17, 134, 197, 145, 17, 136, 197, 145, 17, 146, 197, 145, 17, 167, 197, 145, 17, 178, 197, 145, 17, 171, 197, 145, 17, 182, 197, - 145, 216, 234, 55, 81, 80, 5, 221, 134, 224, 100, 81, 80, 5, 221, 130, - 155, 81, 80, 5, 221, 128, 223, 186, 81, 80, 5, 221, 4, 224, 199, 81, 80, - 5, 220, 230, 224, 208, 81, 80, 5, 220, 249, 223, 241, 81, 80, 5, 221, 21, - 224, 10, 81, 80, 5, 220, 146, 223, 173, 81, 80, 5, 221, 125, 197, 70, 81, - 80, 5, 221, 123, 197, 166, 81, 80, 5, 221, 121, 196, 243, 81, 80, 5, 220, - 199, 197, 98, 81, 80, 5, 220, 207, 197, 109, 81, 80, 5, 220, 211, 197, - 15, 81, 80, 5, 221, 24, 197, 34, 81, 80, 5, 220, 131, 196, 239, 81, 80, - 5, 220, 182, 197, 96, 81, 80, 5, 221, 8, 196, 227, 81, 80, 5, 221, 20, - 196, 229, 81, 80, 5, 220, 186, 196, 228, 81, 80, 5, 221, 119, 219, 22, - 81, 80, 5, 221, 117, 220, 61, 81, 80, 5, 221, 115, 218, 112, 81, 80, 5, - 221, 10, 219, 163, 81, 80, 5, 220, 231, 218, 214, 81, 80, 5, 220, 171, - 218, 137, 81, 80, 5, 220, 136, 218, 131, 81, 80, 5, 221, 113, 248, 183, - 81, 80, 5, 221, 110, 249, 144, 81, 80, 5, 221, 108, 248, 20, 81, 80, 5, - 220, 175, 248, 250, 81, 80, 5, 220, 228, 249, 8, 81, 80, 5, 220, 222, - 248, 102, 81, 80, 5, 220, 187, 248, 115, 81, 80, 5, 221, 98, 68, 81, 80, - 5, 221, 96, 63, 81, 80, 5, 221, 94, 66, 81, 80, 5, 220, 162, 237, 53, 81, - 80, 5, 220, 225, 69, 81, 80, 5, 220, 160, 214, 101, 81, 80, 5, 220, 178, - 72, 81, 80, 5, 220, 188, 237, 32, 81, 80, 5, 220, 194, 226, 85, 81, 80, - 5, 220, 190, 226, 85, 81, 80, 5, 220, 130, 251, 105, 81, 80, 5, 220, 147, - 236, 229, 81, 80, 5, 221, 83, 206, 112, 81, 80, 5, 221, 81, 183, 81, 80, - 5, 221, 79, 204, 172, 81, 80, 5, 220, 163, 208, 129, 81, 80, 5, 220, 209, - 208, 147, 81, 80, 5, 220, 189, 205, 171, 81, 80, 5, 220, 246, 205, 200, - 81, 80, 5, 220, 129, 206, 105, 81, 80, 5, 221, 69, 222, 108, 81, 80, 5, - 221, 67, 172, 81, 80, 5, 221, 65, 221, 190, 81, 80, 5, 220, 241, 222, - 187, 81, 80, 5, 220, 252, 222, 196, 81, 80, 5, 221, 15, 221, 228, 81, 80, - 5, 220, 172, 222, 6, 81, 80, 5, 220, 215, 181, 222, 196, 81, 80, 5, 221, - 91, 239, 151, 81, 80, 5, 221, 88, 240, 135, 81, 80, 5, 221, 85, 237, 200, - 81, 80, 5, 220, 236, 239, 236, 81, 80, 5, 220, 145, 239, 2, 81, 80, 5, - 220, 144, 239, 27, 81, 80, 5, 221, 77, 202, 122, 81, 80, 5, 221, 74, 189, - 81, 80, 5, 221, 72, 201, 40, 81, 80, 5, 220, 234, 203, 48, 81, 80, 5, - 221, 14, 203, 68, 81, 80, 5, 220, 221, 201, 247, 81, 80, 5, 221, 0, 149, - 81, 80, 5, 221, 63, 225, 171, 81, 80, 5, 221, 60, 225, 213, 81, 80, 5, - 221, 58, 225, 109, 81, 80, 5, 220, 168, 225, 190, 81, 80, 5, 220, 212, - 225, 192, 81, 80, 5, 220, 165, 225, 118, 81, 80, 5, 221, 6, 225, 128, 81, - 80, 5, 220, 150, 181, 225, 128, 81, 80, 5, 221, 56, 196, 24, 81, 80, 5, - 221, 53, 164, 81, 80, 5, 221, 51, 195, 217, 81, 80, 5, 220, 216, 196, 66, - 81, 80, 5, 220, 245, 196, 69, 81, 80, 5, 220, 184, 195, 237, 81, 80, 5, - 220, 204, 196, 3, 81, 80, 5, 221, 47, 235, 152, 81, 80, 5, 221, 45, 235, - 238, 81, 80, 5, 221, 43, 234, 222, 81, 80, 5, 220, 247, 235, 181, 81, 80, - 5, 220, 250, 235, 188, 81, 80, 5, 220, 192, 235, 39, 81, 80, 5, 220, 237, - 235, 50, 81, 80, 5, 220, 128, 234, 221, 81, 80, 5, 220, 224, 235, 209, - 81, 80, 5, 221, 41, 216, 182, 81, 80, 5, 221, 39, 217, 220, 81, 80, 5, - 221, 37, 215, 137, 81, 80, 5, 220, 208, 217, 100, 81, 80, 5, 220, 156, - 216, 37, 81, 80, 5, 220, 149, 232, 70, 81, 80, 5, 221, 32, 142, 81, 80, - 5, 220, 139, 231, 74, 81, 80, 5, 221, 35, 232, 117, 81, 80, 5, 220, 229, - 232, 146, 81, 80, 5, 221, 30, 231, 165, 81, 80, 5, 220, 185, 231, 192, - 81, 80, 5, 220, 242, 232, 116, 81, 80, 5, 220, 197, 231, 158, 81, 80, 5, - 221, 16, 232, 40, 81, 80, 5, 220, 195, 232, 211, 81, 80, 5, 220, 238, - 231, 58, 81, 80, 5, 221, 17, 232, 100, 81, 80, 5, 220, 132, 231, 168, 81, - 80, 5, 221, 23, 231, 70, 81, 80, 5, 220, 235, 217, 35, 81, 80, 5, 221, - 28, 217, 49, 81, 80, 5, 220, 243, 217, 32, 81, 80, 5, 220, 210, 217, 43, - 81, 80, 5, 220, 179, 217, 44, 81, 80, 5, 220, 169, 217, 33, 81, 80, 5, - 220, 205, 217, 34, 81, 80, 5, 220, 166, 217, 48, 81, 80, 5, 220, 198, - 217, 31, 81, 80, 5, 220, 239, 181, 217, 44, 81, 80, 5, 220, 219, 181, - 217, 33, 81, 80, 5, 220, 142, 181, 217, 34, 81, 80, 5, 220, 170, 233, - 191, 81, 80, 5, 220, 214, 234, 122, 81, 80, 5, 220, 157, 233, 75, 81, 80, - 5, 220, 135, 234, 39, 81, 80, 5, 220, 159, 233, 61, 81, 80, 5, 220, 158, - 233, 71, 81, 80, 5, 220, 141, 217, 54, 81, 80, 5, 221, 12, 216, 247, 81, - 80, 5, 220, 148, 216, 236, 81, 80, 5, 221, 1, 212, 219, 81, 80, 5, 220, - 226, 161, 81, 80, 5, 221, 19, 211, 226, 81, 80, 5, 220, 244, 213, 78, 81, - 80, 5, 221, 18, 213, 91, 81, 80, 5, 220, 223, 212, 90, 81, 80, 5, 221, 3, - 212, 116, 81, 80, 5, 220, 180, 219, 225, 81, 80, 5, 221, 7, 219, 240, 81, - 80, 5, 220, 203, 219, 219, 81, 80, 5, 221, 22, 219, 232, 81, 80, 5, 220, - 137, 219, 232, 81, 80, 5, 220, 253, 219, 233, 81, 80, 5, 220, 153, 219, - 220, 81, 80, 5, 220, 151, 219, 221, 81, 80, 5, 220, 138, 219, 213, 81, - 80, 5, 220, 164, 181, 219, 233, 81, 80, 5, 220, 220, 181, 219, 220, 81, - 80, 5, 220, 183, 181, 219, 221, 81, 80, 5, 220, 193, 223, 214, 81, 80, 5, - 220, 233, 223, 222, 81, 80, 5, 220, 251, 223, 210, 81, 80, 5, 221, 26, - 223, 217, 81, 80, 5, 220, 217, 223, 218, 81, 80, 5, 220, 213, 223, 212, - 81, 80, 5, 220, 167, 223, 213, 81, 80, 5, 220, 201, 234, 56, 81, 80, 5, - 221, 13, 234, 64, 81, 80, 5, 220, 177, 234, 51, 81, 80, 5, 220, 232, 234, - 60, 81, 80, 5, 220, 218, 234, 61, 81, 80, 5, 220, 254, 234, 52, 81, 80, - 5, 220, 255, 234, 54, 81, 80, 5, 220, 154, 169, 81, 80, 5, 220, 202, 217, - 143, 81, 80, 5, 220, 196, 217, 158, 81, 80, 5, 220, 200, 217, 125, 81, - 80, 5, 220, 134, 217, 149, 81, 80, 5, 220, 206, 217, 150, 81, 80, 5, 221, - 2, 217, 130, 81, 80, 5, 221, 5, 217, 134, 81, 80, 5, 220, 173, 216, 163, - 81, 80, 5, 220, 133, 216, 133, 81, 80, 5, 220, 176, 216, 154, 81, 80, 5, - 220, 191, 216, 137, 81, 80, 5, 220, 143, 199, 34, 81, 80, 5, 220, 140, - 199, 152, 81, 80, 5, 220, 174, 197, 220, 81, 80, 5, 220, 152, 199, 113, - 81, 80, 5, 220, 240, 199, 118, 81, 80, 5, 220, 181, 198, 233, 81, 80, 5, - 220, 248, 198, 248, 81, 80, 5, 220, 161, 215, 81, 81, 80, 5, 221, 11, - 215, 101, 81, 80, 5, 220, 155, 215, 63, 81, 80, 5, 220, 227, 215, 93, 81, - 80, 5, 221, 9, 215, 70, 81, 80, 17, 100, 81, 80, 17, 102, 81, 80, 17, + 145, 216, 235, 55, 81, 80, 5, 221, 135, 224, 101, 81, 80, 5, 221, 131, + 155, 81, 80, 5, 221, 129, 223, 187, 81, 80, 5, 221, 5, 224, 200, 81, 80, + 5, 220, 231, 224, 209, 81, 80, 5, 220, 250, 223, 242, 81, 80, 5, 221, 22, + 224, 11, 81, 80, 5, 220, 147, 223, 174, 81, 80, 5, 221, 126, 197, 70, 81, + 80, 5, 221, 124, 197, 166, 81, 80, 5, 221, 122, 196, 243, 81, 80, 5, 220, + 200, 197, 98, 81, 80, 5, 220, 208, 197, 109, 81, 80, 5, 220, 212, 197, + 15, 81, 80, 5, 221, 25, 197, 34, 81, 80, 5, 220, 132, 196, 239, 81, 80, + 5, 220, 183, 197, 96, 81, 80, 5, 221, 9, 196, 227, 81, 80, 5, 221, 21, + 196, 229, 81, 80, 5, 220, 187, 196, 228, 81, 80, 5, 221, 120, 219, 23, + 81, 80, 5, 221, 118, 220, 62, 81, 80, 5, 221, 116, 218, 113, 81, 80, 5, + 221, 11, 219, 164, 81, 80, 5, 220, 232, 218, 215, 81, 80, 5, 220, 172, + 218, 138, 81, 80, 5, 220, 137, 218, 132, 81, 80, 5, 221, 114, 248, 184, + 81, 80, 5, 221, 111, 249, 145, 81, 80, 5, 221, 109, 248, 21, 81, 80, 5, + 220, 176, 248, 251, 81, 80, 5, 220, 229, 249, 9, 81, 80, 5, 220, 223, + 248, 103, 81, 80, 5, 220, 188, 248, 116, 81, 80, 5, 221, 99, 68, 81, 80, + 5, 221, 97, 63, 81, 80, 5, 221, 95, 66, 81, 80, 5, 220, 163, 237, 54, 81, + 80, 5, 220, 226, 69, 81, 80, 5, 220, 161, 214, 102, 81, 80, 5, 220, 179, + 72, 81, 80, 5, 220, 189, 237, 33, 81, 80, 5, 220, 195, 226, 86, 81, 80, + 5, 220, 191, 226, 86, 81, 80, 5, 220, 131, 251, 106, 81, 80, 5, 220, 148, + 236, 230, 81, 80, 5, 221, 84, 206, 112, 81, 80, 5, 221, 82, 183, 81, 80, + 5, 221, 80, 204, 172, 81, 80, 5, 220, 164, 208, 129, 81, 80, 5, 220, 210, + 208, 147, 81, 80, 5, 220, 190, 205, 171, 81, 80, 5, 220, 247, 205, 200, + 81, 80, 5, 220, 130, 206, 105, 81, 80, 5, 221, 70, 222, 109, 81, 80, 5, + 221, 68, 172, 81, 80, 5, 221, 66, 221, 191, 81, 80, 5, 220, 242, 222, + 188, 81, 80, 5, 220, 253, 222, 197, 81, 80, 5, 221, 16, 221, 229, 81, 80, + 5, 220, 173, 222, 7, 81, 80, 5, 220, 216, 181, 222, 197, 81, 80, 5, 221, + 92, 239, 152, 81, 80, 5, 221, 89, 240, 136, 81, 80, 5, 221, 86, 237, 201, + 81, 80, 5, 220, 237, 239, 237, 81, 80, 5, 220, 146, 239, 3, 81, 80, 5, + 220, 145, 239, 28, 81, 80, 5, 221, 78, 202, 122, 81, 80, 5, 221, 75, 189, + 81, 80, 5, 221, 73, 201, 40, 81, 80, 5, 220, 235, 203, 48, 81, 80, 5, + 221, 15, 203, 68, 81, 80, 5, 220, 222, 201, 247, 81, 80, 5, 221, 1, 149, + 81, 80, 5, 221, 64, 225, 172, 81, 80, 5, 221, 61, 225, 214, 81, 80, 5, + 221, 59, 225, 110, 81, 80, 5, 220, 169, 225, 191, 81, 80, 5, 220, 213, + 225, 193, 81, 80, 5, 220, 166, 225, 119, 81, 80, 5, 221, 7, 225, 129, 81, + 80, 5, 220, 151, 181, 225, 129, 81, 80, 5, 221, 57, 196, 24, 81, 80, 5, + 221, 54, 164, 81, 80, 5, 221, 52, 195, 217, 81, 80, 5, 220, 217, 196, 66, + 81, 80, 5, 220, 246, 196, 69, 81, 80, 5, 220, 185, 195, 237, 81, 80, 5, + 220, 205, 196, 3, 81, 80, 5, 221, 48, 235, 153, 81, 80, 5, 221, 46, 235, + 239, 81, 80, 5, 221, 44, 234, 223, 81, 80, 5, 220, 248, 235, 182, 81, 80, + 5, 220, 251, 235, 189, 81, 80, 5, 220, 193, 235, 40, 81, 80, 5, 220, 238, + 235, 51, 81, 80, 5, 220, 129, 234, 222, 81, 80, 5, 220, 225, 235, 210, + 81, 80, 5, 221, 42, 216, 183, 81, 80, 5, 221, 40, 217, 221, 81, 80, 5, + 221, 38, 215, 138, 81, 80, 5, 220, 209, 217, 101, 81, 80, 5, 220, 157, + 216, 38, 81, 80, 5, 220, 150, 232, 71, 81, 80, 5, 221, 33, 142, 81, 80, + 5, 220, 140, 231, 75, 81, 80, 5, 221, 36, 232, 118, 81, 80, 5, 220, 230, + 232, 147, 81, 80, 5, 221, 31, 231, 166, 81, 80, 5, 220, 186, 231, 193, + 81, 80, 5, 220, 243, 232, 117, 81, 80, 5, 220, 198, 231, 159, 81, 80, 5, + 221, 17, 232, 41, 81, 80, 5, 220, 196, 232, 212, 81, 80, 5, 220, 239, + 231, 59, 81, 80, 5, 221, 18, 232, 101, 81, 80, 5, 220, 133, 231, 169, 81, + 80, 5, 221, 24, 231, 71, 81, 80, 5, 220, 236, 217, 36, 81, 80, 5, 221, + 29, 217, 50, 81, 80, 5, 220, 244, 217, 33, 81, 80, 5, 220, 211, 217, 44, + 81, 80, 5, 220, 180, 217, 45, 81, 80, 5, 220, 170, 217, 34, 81, 80, 5, + 220, 206, 217, 35, 81, 80, 5, 220, 167, 217, 49, 81, 80, 5, 220, 199, + 217, 32, 81, 80, 5, 220, 240, 181, 217, 45, 81, 80, 5, 220, 220, 181, + 217, 34, 81, 80, 5, 220, 143, 181, 217, 35, 81, 80, 5, 220, 171, 233, + 192, 81, 80, 5, 220, 215, 234, 123, 81, 80, 5, 220, 158, 233, 76, 81, 80, + 5, 220, 136, 234, 40, 81, 80, 5, 220, 160, 233, 62, 81, 80, 5, 220, 159, + 233, 72, 81, 80, 5, 220, 142, 217, 55, 81, 80, 5, 221, 13, 216, 248, 81, + 80, 5, 220, 149, 216, 237, 81, 80, 5, 221, 2, 212, 220, 81, 80, 5, 220, + 227, 161, 81, 80, 5, 221, 20, 211, 227, 81, 80, 5, 220, 245, 213, 79, 81, + 80, 5, 221, 19, 213, 92, 81, 80, 5, 220, 224, 212, 91, 81, 80, 5, 221, 4, + 212, 117, 81, 80, 5, 220, 181, 219, 226, 81, 80, 5, 221, 8, 219, 241, 81, + 80, 5, 220, 204, 219, 220, 81, 80, 5, 221, 23, 219, 233, 81, 80, 5, 220, + 138, 219, 233, 81, 80, 5, 220, 254, 219, 234, 81, 80, 5, 220, 154, 219, + 221, 81, 80, 5, 220, 152, 219, 222, 81, 80, 5, 220, 139, 219, 214, 81, + 80, 5, 220, 165, 181, 219, 234, 81, 80, 5, 220, 221, 181, 219, 221, 81, + 80, 5, 220, 184, 181, 219, 222, 81, 80, 5, 220, 194, 223, 215, 81, 80, 5, + 220, 234, 223, 223, 81, 80, 5, 220, 252, 223, 211, 81, 80, 5, 221, 27, + 223, 218, 81, 80, 5, 220, 218, 223, 219, 81, 80, 5, 220, 214, 223, 213, + 81, 80, 5, 220, 168, 223, 214, 81, 80, 5, 220, 202, 234, 57, 81, 80, 5, + 221, 14, 234, 65, 81, 80, 5, 220, 178, 234, 52, 81, 80, 5, 220, 233, 234, + 61, 81, 80, 5, 220, 219, 234, 62, 81, 80, 5, 220, 255, 234, 53, 81, 80, + 5, 221, 0, 234, 55, 81, 80, 5, 220, 155, 169, 81, 80, 5, 220, 203, 217, + 144, 81, 80, 5, 220, 197, 217, 159, 81, 80, 5, 220, 201, 217, 126, 81, + 80, 5, 220, 135, 217, 150, 81, 80, 5, 220, 207, 217, 151, 81, 80, 5, 221, + 3, 217, 131, 81, 80, 5, 221, 6, 217, 135, 81, 80, 5, 220, 174, 216, 164, + 81, 80, 5, 220, 134, 216, 134, 81, 80, 5, 220, 177, 216, 155, 81, 80, 5, + 220, 192, 216, 138, 81, 80, 5, 220, 144, 199, 34, 81, 80, 5, 220, 141, + 199, 152, 81, 80, 5, 220, 175, 197, 220, 81, 80, 5, 220, 153, 199, 113, + 81, 80, 5, 220, 241, 199, 118, 81, 80, 5, 220, 182, 198, 233, 81, 80, 5, + 220, 249, 198, 248, 81, 80, 5, 220, 162, 215, 82, 81, 80, 5, 221, 12, + 215, 102, 81, 80, 5, 220, 156, 215, 64, 81, 80, 5, 220, 228, 215, 94, 81, + 80, 5, 221, 10, 215, 71, 81, 80, 17, 100, 81, 80, 17, 102, 81, 80, 17, 134, 81, 80, 17, 136, 81, 80, 17, 146, 81, 80, 17, 167, 81, 80, 17, 178, 81, 80, 17, 171, 81, 80, 17, 182, 81, 80, 38, 31, 203, 46, 81, 80, 38, - 31, 203, 18, 81, 80, 38, 31, 231, 54, 81, 80, 38, 31, 202, 157, 81, 80, - 38, 31, 203, 24, 202, 157, 81, 80, 38, 31, 231, 57, 202, 157, 81, 80, 38, - 31, 219, 25, 251, 252, 6, 1, 251, 151, 251, 252, 6, 1, 240, 132, 251, - 252, 6, 1, 223, 79, 251, 252, 6, 1, 219, 38, 251, 252, 6, 1, 249, 144, - 251, 252, 6, 1, 206, 56, 251, 252, 6, 1, 213, 91, 251, 252, 6, 1, 248, - 191, 251, 252, 6, 1, 169, 251, 252, 6, 1, 69, 251, 252, 6, 1, 235, 238, - 251, 252, 6, 1, 68, 251, 252, 6, 1, 72, 251, 252, 6, 1, 239, 175, 251, - 252, 6, 1, 196, 25, 251, 252, 6, 1, 197, 117, 251, 252, 6, 1, 215, 137, - 251, 252, 6, 1, 225, 34, 251, 252, 6, 1, 164, 251, 252, 6, 1, 66, 251, - 252, 6, 1, 225, 162, 251, 252, 6, 1, 245, 74, 251, 252, 6, 1, 142, 251, - 252, 6, 1, 211, 156, 251, 252, 6, 1, 234, 122, 251, 252, 6, 1, 215, 108, - 251, 252, 6, 1, 201, 40, 251, 252, 6, 1, 216, 226, 251, 252, 6, 1, 199, - 152, 251, 252, 6, 1, 224, 145, 251, 252, 6, 1, 234, 61, 251, 252, 6, 1, - 195, 104, 251, 252, 6, 1, 223, 213, 251, 252, 6, 1, 207, 50, 251, 252, 4, - 1, 251, 151, 251, 252, 4, 1, 240, 132, 251, 252, 4, 1, 223, 79, 251, 252, - 4, 1, 219, 38, 251, 252, 4, 1, 249, 144, 251, 252, 4, 1, 206, 56, 251, - 252, 4, 1, 213, 91, 251, 252, 4, 1, 248, 191, 251, 252, 4, 1, 169, 251, - 252, 4, 1, 69, 251, 252, 4, 1, 235, 238, 251, 252, 4, 1, 68, 251, 252, 4, - 1, 72, 251, 252, 4, 1, 239, 175, 251, 252, 4, 1, 196, 25, 251, 252, 4, 1, - 197, 117, 251, 252, 4, 1, 215, 137, 251, 252, 4, 1, 225, 34, 251, 252, 4, - 1, 164, 251, 252, 4, 1, 66, 251, 252, 4, 1, 225, 162, 251, 252, 4, 1, - 245, 74, 251, 252, 4, 1, 142, 251, 252, 4, 1, 211, 156, 251, 252, 4, 1, - 234, 122, 251, 252, 4, 1, 215, 108, 251, 252, 4, 1, 201, 40, 251, 252, 4, - 1, 216, 226, 251, 252, 4, 1, 199, 152, 251, 252, 4, 1, 224, 145, 251, - 252, 4, 1, 234, 61, 251, 252, 4, 1, 195, 104, 251, 252, 4, 1, 223, 213, - 251, 252, 4, 1, 207, 50, 251, 252, 251, 152, 222, 149, 251, 252, 18, 222, - 149, 251, 252, 234, 35, 78, 251, 252, 232, 212, 251, 252, 108, 218, 234, - 251, 252, 234, 36, 108, 218, 234, 251, 252, 215, 148, 251, 252, 217, 207, - 78, 251, 252, 17, 195, 79, 251, 252, 17, 100, 251, 252, 17, 102, 251, - 252, 17, 134, 251, 252, 17, 136, 251, 252, 17, 146, 251, 252, 17, 167, - 251, 252, 17, 178, 251, 252, 17, 171, 251, 252, 17, 182, 251, 252, 84, - 236, 89, 78, 251, 252, 84, 211, 78, 78, 226, 69, 128, 31, 100, 226, 69, - 128, 31, 102, 226, 69, 128, 31, 134, 226, 69, 128, 31, 136, 226, 69, 128, - 31, 146, 226, 69, 128, 31, 167, 226, 69, 128, 31, 178, 226, 69, 128, 31, - 171, 226, 69, 128, 31, 182, 226, 69, 128, 31, 203, 23, 226, 69, 128, 31, - 200, 234, 226, 69, 128, 31, 202, 177, 226, 69, 128, 31, 235, 13, 226, 69, - 128, 31, 235, 144, 226, 69, 128, 31, 206, 13, 226, 69, 128, 31, 207, 65, - 226, 69, 128, 31, 237, 19, 226, 69, 128, 31, 216, 173, 226, 69, 128, 31, - 97, 231, 56, 226, 69, 128, 31, 99, 231, 56, 226, 69, 128, 31, 115, 231, - 56, 226, 69, 128, 31, 235, 6, 231, 56, 226, 69, 128, 31, 235, 100, 231, - 56, 226, 69, 128, 31, 206, 29, 231, 56, 226, 69, 128, 31, 207, 71, 231, - 56, 226, 69, 128, 31, 237, 30, 231, 56, 226, 69, 128, 31, 216, 178, 231, - 56, 226, 69, 128, 31, 97, 170, 226, 69, 128, 31, 99, 170, 226, 69, 128, - 31, 115, 170, 226, 69, 128, 31, 235, 6, 170, 226, 69, 128, 31, 235, 100, - 170, 226, 69, 128, 31, 206, 29, 170, 226, 69, 128, 31, 207, 71, 170, 226, - 69, 128, 31, 237, 30, 170, 226, 69, 128, 31, 216, 178, 170, 226, 69, 128, - 31, 203, 24, 170, 226, 69, 128, 31, 200, 235, 170, 226, 69, 128, 31, 202, - 178, 170, 226, 69, 128, 31, 235, 14, 170, 226, 69, 128, 31, 235, 145, - 170, 226, 69, 128, 31, 206, 14, 170, 226, 69, 128, 31, 207, 66, 170, 226, - 69, 128, 31, 237, 20, 170, 226, 69, 128, 31, 216, 174, 170, 226, 69, 128, - 31, 222, 254, 226, 69, 128, 31, 222, 253, 226, 69, 128, 222, 255, 78, - 226, 69, 128, 31, 224, 245, 226, 69, 128, 31, 224, 244, 226, 69, 128, 31, - 212, 30, 100, 226, 69, 128, 31, 212, 30, 102, 226, 69, 128, 31, 212, 30, - 134, 226, 69, 128, 31, 212, 30, 136, 226, 69, 128, 31, 212, 30, 146, 226, - 69, 128, 31, 212, 30, 167, 226, 69, 128, 31, 212, 30, 178, 226, 69, 128, - 31, 212, 30, 171, 226, 69, 128, 31, 212, 30, 182, 226, 69, 128, 212, 146, - 226, 69, 128, 191, 97, 211, 86, 226, 69, 128, 191, 97, 232, 224, 226, 69, - 128, 191, 115, 211, 84, 226, 69, 128, 209, 108, 78, 226, 69, 128, 31, - 251, 130, 100, 226, 69, 128, 31, 251, 130, 102, 226, 69, 128, 31, 251, - 130, 203, 24, 170, 226, 69, 128, 251, 130, 222, 255, 78, 214, 40, 128, - 31, 100, 214, 40, 128, 31, 102, 214, 40, 128, 31, 134, 214, 40, 128, 31, - 136, 214, 40, 128, 31, 146, 214, 40, 128, 31, 167, 214, 40, 128, 31, 178, - 214, 40, 128, 31, 171, 214, 40, 128, 31, 182, 214, 40, 128, 31, 203, 23, - 214, 40, 128, 31, 200, 234, 214, 40, 128, 31, 202, 177, 214, 40, 128, 31, - 235, 13, 214, 40, 128, 31, 235, 144, 214, 40, 128, 31, 206, 13, 214, 40, - 128, 31, 207, 65, 214, 40, 128, 31, 237, 19, 214, 40, 128, 31, 216, 173, - 214, 40, 128, 31, 97, 231, 56, 214, 40, 128, 31, 99, 231, 56, 214, 40, - 128, 31, 115, 231, 56, 214, 40, 128, 31, 235, 6, 231, 56, 214, 40, 128, - 31, 235, 100, 231, 56, 214, 40, 128, 31, 206, 29, 231, 56, 214, 40, 128, - 31, 207, 71, 231, 56, 214, 40, 128, 31, 237, 30, 231, 56, 214, 40, 128, - 31, 216, 178, 231, 56, 214, 40, 128, 31, 97, 170, 214, 40, 128, 31, 99, - 170, 214, 40, 128, 31, 115, 170, 214, 40, 128, 31, 235, 6, 170, 214, 40, - 128, 31, 235, 100, 170, 214, 40, 128, 31, 206, 29, 170, 214, 40, 128, 31, - 207, 71, 170, 214, 40, 128, 31, 237, 30, 170, 214, 40, 128, 31, 216, 178, - 170, 214, 40, 128, 31, 203, 24, 170, 214, 40, 128, 31, 200, 235, 170, - 214, 40, 128, 31, 202, 178, 170, 214, 40, 128, 31, 235, 14, 170, 214, 40, - 128, 31, 235, 145, 170, 214, 40, 128, 31, 206, 14, 170, 214, 40, 128, 31, - 207, 66, 170, 214, 40, 128, 31, 237, 20, 170, 214, 40, 128, 31, 216, 174, - 170, 214, 40, 128, 220, 21, 214, 40, 128, 251, 130, 31, 102, 214, 40, - 128, 251, 130, 31, 134, 214, 40, 128, 251, 130, 31, 136, 214, 40, 128, - 251, 130, 31, 146, 214, 40, 128, 251, 130, 31, 167, 214, 40, 128, 251, - 130, 31, 178, 214, 40, 128, 251, 130, 31, 171, 214, 40, 128, 251, 130, - 31, 182, 214, 40, 128, 251, 130, 31, 203, 23, 214, 40, 128, 251, 130, 31, - 235, 6, 231, 56, 214, 40, 128, 251, 130, 31, 206, 29, 231, 56, 214, 40, - 128, 251, 130, 31, 99, 170, 214, 40, 128, 251, 130, 31, 203, 24, 170, - 214, 40, 128, 191, 97, 232, 224, 214, 40, 128, 191, 97, 206, 17, 9, 13, - 251, 163, 9, 13, 248, 238, 9, 13, 225, 188, 9, 13, 240, 106, 9, 13, 197, - 117, 9, 13, 195, 106, 9, 13, 232, 235, 9, 13, 203, 139, 9, 13, 196, 64, - 9, 13, 225, 34, 9, 13, 222, 248, 9, 13, 219, 184, 9, 13, 216, 30, 9, 13, - 208, 125, 9, 13, 251, 193, 9, 13, 235, 175, 9, 13, 209, 8, 9, 13, 211, - 151, 9, 13, 210, 141, 9, 13, 206, 251, 9, 13, 203, 41, 9, 13, 202, 213, - 9, 13, 224, 141, 9, 13, 202, 225, 9, 13, 240, 129, 9, 13, 195, 109, 9, - 13, 233, 224, 9, 13, 238, 251, 248, 238, 9, 13, 238, 251, 216, 30, 9, 13, - 238, 251, 235, 175, 9, 13, 238, 251, 211, 151, 9, 13, 84, 248, 238, 9, - 13, 84, 225, 188, 9, 13, 84, 232, 112, 9, 13, 84, 232, 235, 9, 13, 84, - 196, 64, 9, 13, 84, 225, 34, 9, 13, 84, 222, 248, 9, 13, 84, 219, 184, 9, - 13, 84, 216, 30, 9, 13, 84, 208, 125, 9, 13, 84, 251, 193, 9, 13, 84, - 235, 175, 9, 13, 84, 209, 8, 9, 13, 84, 211, 151, 9, 13, 84, 206, 251, 9, - 13, 84, 203, 41, 9, 13, 84, 202, 213, 9, 13, 84, 224, 141, 9, 13, 84, - 240, 129, 9, 13, 84, 233, 224, 9, 13, 203, 134, 225, 188, 9, 13, 203, - 134, 232, 235, 9, 13, 203, 134, 196, 64, 9, 13, 203, 134, 222, 248, 9, - 13, 203, 134, 216, 30, 9, 13, 203, 134, 208, 125, 9, 13, 203, 134, 251, - 193, 9, 13, 203, 134, 209, 8, 9, 13, 203, 134, 211, 151, 9, 13, 203, 134, - 206, 251, 9, 13, 203, 134, 224, 141, 9, 13, 203, 134, 240, 129, 9, 13, - 203, 134, 233, 224, 9, 13, 203, 134, 238, 251, 216, 30, 9, 13, 203, 134, - 238, 251, 211, 151, 9, 13, 204, 204, 248, 238, 9, 13, 204, 204, 225, 188, - 9, 13, 204, 204, 232, 112, 9, 13, 204, 204, 232, 235, 9, 13, 204, 204, - 203, 139, 9, 13, 204, 204, 196, 64, 9, 13, 204, 204, 225, 34, 9, 13, 204, - 204, 219, 184, 9, 13, 204, 204, 216, 30, 9, 13, 204, 204, 208, 125, 9, - 13, 204, 204, 251, 193, 9, 13, 204, 204, 235, 175, 9, 13, 204, 204, 209, - 8, 9, 13, 204, 204, 211, 151, 9, 13, 204, 204, 206, 251, 9, 13, 204, 204, - 203, 41, 9, 13, 204, 204, 202, 213, 9, 13, 204, 204, 224, 141, 9, 13, - 204, 204, 240, 129, 9, 13, 204, 204, 195, 109, 9, 13, 204, 204, 233, 224, - 9, 13, 204, 204, 238, 251, 248, 238, 9, 13, 204, 204, 238, 251, 235, 175, - 9, 13, 221, 223, 251, 163, 9, 13, 221, 223, 248, 238, 9, 13, 221, 223, - 225, 188, 9, 13, 221, 223, 240, 106, 9, 13, 221, 223, 232, 112, 9, 13, - 221, 223, 197, 117, 9, 13, 221, 223, 195, 106, 9, 13, 221, 223, 232, 235, - 9, 13, 221, 223, 203, 139, 9, 13, 221, 223, 196, 64, 9, 13, 221, 223, - 222, 248, 9, 13, 221, 223, 219, 184, 9, 13, 221, 223, 216, 30, 9, 13, - 221, 223, 208, 125, 9, 13, 221, 223, 251, 193, 9, 13, 221, 223, 235, 175, - 9, 13, 221, 223, 209, 8, 9, 13, 221, 223, 211, 151, 9, 13, 221, 223, 210, - 141, 9, 13, 221, 223, 206, 251, 9, 13, 221, 223, 203, 41, 9, 13, 221, - 223, 202, 213, 9, 13, 221, 223, 224, 141, 9, 13, 221, 223, 202, 225, 9, - 13, 221, 223, 240, 129, 9, 13, 221, 223, 195, 109, 9, 13, 221, 223, 233, - 224, 9, 13, 237, 240, 248, 238, 9, 13, 237, 240, 225, 188, 9, 13, 237, - 240, 240, 106, 9, 13, 237, 240, 197, 117, 9, 13, 237, 240, 195, 106, 9, - 13, 237, 240, 232, 235, 9, 13, 237, 240, 203, 139, 9, 13, 237, 240, 196, - 64, 9, 13, 237, 240, 222, 248, 9, 13, 237, 240, 219, 184, 9, 13, 237, - 240, 216, 30, 9, 13, 237, 240, 208, 125, 9, 13, 237, 240, 251, 193, 9, - 13, 237, 240, 235, 175, 9, 13, 237, 240, 209, 8, 9, 13, 237, 240, 211, - 151, 9, 13, 237, 240, 210, 141, 9, 13, 237, 240, 206, 251, 9, 13, 237, - 240, 203, 41, 9, 13, 237, 240, 202, 213, 9, 13, 237, 240, 224, 141, 9, - 13, 237, 240, 202, 225, 9, 13, 237, 240, 240, 129, 9, 13, 237, 240, 195, - 109, 9, 13, 237, 240, 233, 224, 9, 13, 214, 82, 87, 3, 168, 3, 203, 91, - 9, 13, 214, 82, 168, 3, 240, 106, 220, 82, 113, 237, 68, 197, 50, 220, - 82, 113, 205, 159, 197, 50, 220, 82, 113, 197, 89, 197, 50, 220, 82, 113, - 173, 197, 50, 220, 82, 113, 210, 157, 237, 222, 220, 82, 113, 233, 90, - 237, 222, 220, 82, 113, 59, 237, 222, 220, 82, 113, 97, 77, 245, 113, - 220, 82, 113, 99, 77, 245, 113, 220, 82, 113, 115, 77, 245, 113, 220, 82, - 113, 235, 6, 77, 245, 113, 220, 82, 113, 235, 100, 77, 245, 113, 220, 82, - 113, 206, 29, 77, 245, 113, 220, 82, 113, 207, 71, 77, 245, 113, 220, 82, - 113, 237, 30, 77, 245, 113, 220, 82, 113, 216, 178, 77, 245, 113, 220, - 82, 113, 97, 77, 249, 93, 220, 82, 113, 99, 77, 249, 93, 220, 82, 113, - 115, 77, 249, 93, 220, 82, 113, 235, 6, 77, 249, 93, 220, 82, 113, 235, - 100, 77, 249, 93, 220, 82, 113, 206, 29, 77, 249, 93, 220, 82, 113, 207, - 71, 77, 249, 93, 220, 82, 113, 237, 30, 77, 249, 93, 220, 82, 113, 216, - 178, 77, 249, 93, 220, 82, 113, 97, 77, 244, 245, 220, 82, 113, 99, 77, - 244, 245, 220, 82, 113, 115, 77, 244, 245, 220, 82, 113, 235, 6, 77, 244, - 245, 220, 82, 113, 235, 100, 77, 244, 245, 220, 82, 113, 206, 29, 77, - 244, 245, 220, 82, 113, 207, 71, 77, 244, 245, 220, 82, 113, 237, 30, 77, - 244, 245, 220, 82, 113, 216, 178, 77, 244, 245, 220, 82, 113, 212, 127, - 220, 82, 113, 214, 68, 220, 82, 113, 249, 94, 220, 82, 113, 245, 30, 220, - 82, 113, 205, 100, 220, 82, 113, 204, 113, 220, 82, 113, 250, 135, 220, - 82, 113, 197, 41, 220, 82, 113, 225, 121, 220, 82, 113, 249, 137, 185, - 113, 231, 154, 249, 137, 185, 113, 231, 152, 185, 113, 231, 151, 185, - 113, 231, 150, 185, 113, 231, 149, 185, 113, 231, 148, 185, 113, 231, - 147, 185, 113, 231, 146, 185, 113, 231, 145, 185, 113, 231, 144, 185, - 113, 231, 143, 185, 113, 231, 142, 185, 113, 231, 141, 185, 113, 231, - 140, 185, 113, 231, 139, 185, 113, 231, 138, 185, 113, 231, 137, 185, - 113, 231, 136, 185, 113, 231, 135, 185, 113, 231, 134, 185, 113, 231, - 133, 185, 113, 231, 132, 185, 113, 231, 131, 185, 113, 231, 130, 185, - 113, 231, 129, 185, 113, 231, 128, 185, 113, 231, 127, 185, 113, 231, - 126, 185, 113, 231, 125, 185, 113, 231, 124, 185, 113, 231, 123, 185, - 113, 231, 122, 185, 113, 231, 121, 185, 113, 231, 120, 185, 113, 231, - 119, 185, 113, 231, 118, 185, 113, 231, 117, 185, 113, 231, 116, 185, - 113, 231, 115, 185, 113, 231, 114, 185, 113, 231, 113, 185, 113, 231, - 112, 185, 113, 231, 111, 185, 113, 231, 110, 185, 113, 231, 109, 185, - 113, 231, 108, 185, 113, 231, 107, 185, 113, 231, 106, 185, 113, 231, - 105, 185, 113, 231, 104, 185, 113, 83, 249, 137, 185, 113, 199, 99, 185, + 31, 203, 18, 81, 80, 38, 31, 231, 55, 81, 80, 38, 31, 202, 157, 81, 80, + 38, 31, 203, 24, 202, 157, 81, 80, 38, 31, 231, 58, 202, 157, 81, 80, 38, + 31, 219, 26, 251, 253, 6, 1, 251, 152, 251, 253, 6, 1, 240, 133, 251, + 253, 6, 1, 223, 80, 251, 253, 6, 1, 219, 39, 251, 253, 6, 1, 249, 145, + 251, 253, 6, 1, 206, 56, 251, 253, 6, 1, 213, 92, 251, 253, 6, 1, 248, + 192, 251, 253, 6, 1, 169, 251, 253, 6, 1, 69, 251, 253, 6, 1, 235, 239, + 251, 253, 6, 1, 68, 251, 253, 6, 1, 72, 251, 253, 6, 1, 239, 176, 251, + 253, 6, 1, 196, 25, 251, 253, 6, 1, 197, 117, 251, 253, 6, 1, 215, 138, + 251, 253, 6, 1, 225, 35, 251, 253, 6, 1, 164, 251, 253, 6, 1, 66, 251, + 253, 6, 1, 225, 163, 251, 253, 6, 1, 245, 75, 251, 253, 6, 1, 142, 251, + 253, 6, 1, 211, 157, 251, 253, 6, 1, 234, 123, 251, 253, 6, 1, 215, 109, + 251, 253, 6, 1, 201, 40, 251, 253, 6, 1, 216, 227, 251, 253, 6, 1, 199, + 152, 251, 253, 6, 1, 224, 146, 251, 253, 6, 1, 234, 62, 251, 253, 6, 1, + 195, 104, 251, 253, 6, 1, 223, 214, 251, 253, 6, 1, 207, 50, 251, 253, 4, + 1, 251, 152, 251, 253, 4, 1, 240, 133, 251, 253, 4, 1, 223, 80, 251, 253, + 4, 1, 219, 39, 251, 253, 4, 1, 249, 145, 251, 253, 4, 1, 206, 56, 251, + 253, 4, 1, 213, 92, 251, 253, 4, 1, 248, 192, 251, 253, 4, 1, 169, 251, + 253, 4, 1, 69, 251, 253, 4, 1, 235, 239, 251, 253, 4, 1, 68, 251, 253, 4, + 1, 72, 251, 253, 4, 1, 239, 176, 251, 253, 4, 1, 196, 25, 251, 253, 4, 1, + 197, 117, 251, 253, 4, 1, 215, 138, 251, 253, 4, 1, 225, 35, 251, 253, 4, + 1, 164, 251, 253, 4, 1, 66, 251, 253, 4, 1, 225, 163, 251, 253, 4, 1, + 245, 75, 251, 253, 4, 1, 142, 251, 253, 4, 1, 211, 157, 251, 253, 4, 1, + 234, 123, 251, 253, 4, 1, 215, 109, 251, 253, 4, 1, 201, 40, 251, 253, 4, + 1, 216, 227, 251, 253, 4, 1, 199, 152, 251, 253, 4, 1, 224, 146, 251, + 253, 4, 1, 234, 62, 251, 253, 4, 1, 195, 104, 251, 253, 4, 1, 223, 214, + 251, 253, 4, 1, 207, 50, 251, 253, 251, 153, 222, 150, 251, 253, 18, 222, + 150, 251, 253, 234, 36, 78, 251, 253, 232, 213, 251, 253, 108, 218, 235, + 251, 253, 234, 37, 108, 218, 235, 251, 253, 215, 149, 251, 253, 217, 208, + 78, 251, 253, 17, 195, 79, 251, 253, 17, 100, 251, 253, 17, 102, 251, + 253, 17, 134, 251, 253, 17, 136, 251, 253, 17, 146, 251, 253, 17, 167, + 251, 253, 17, 178, 251, 253, 17, 171, 251, 253, 17, 182, 251, 253, 84, + 236, 90, 78, 251, 253, 84, 211, 79, 78, 226, 70, 128, 31, 100, 226, 70, + 128, 31, 102, 226, 70, 128, 31, 134, 226, 70, 128, 31, 136, 226, 70, 128, + 31, 146, 226, 70, 128, 31, 167, 226, 70, 128, 31, 178, 226, 70, 128, 31, + 171, 226, 70, 128, 31, 182, 226, 70, 128, 31, 203, 23, 226, 70, 128, 31, + 200, 234, 226, 70, 128, 31, 202, 177, 226, 70, 128, 31, 235, 14, 226, 70, + 128, 31, 235, 145, 226, 70, 128, 31, 206, 13, 226, 70, 128, 31, 207, 65, + 226, 70, 128, 31, 237, 20, 226, 70, 128, 31, 216, 174, 226, 70, 128, 31, + 97, 231, 57, 226, 70, 128, 31, 99, 231, 57, 226, 70, 128, 31, 115, 231, + 57, 226, 70, 128, 31, 235, 7, 231, 57, 226, 70, 128, 31, 235, 101, 231, + 57, 226, 70, 128, 31, 206, 29, 231, 57, 226, 70, 128, 31, 207, 71, 231, + 57, 226, 70, 128, 31, 237, 31, 231, 57, 226, 70, 128, 31, 216, 179, 231, + 57, 226, 70, 128, 31, 97, 170, 226, 70, 128, 31, 99, 170, 226, 70, 128, + 31, 115, 170, 226, 70, 128, 31, 235, 7, 170, 226, 70, 128, 31, 235, 101, + 170, 226, 70, 128, 31, 206, 29, 170, 226, 70, 128, 31, 207, 71, 170, 226, + 70, 128, 31, 237, 31, 170, 226, 70, 128, 31, 216, 179, 170, 226, 70, 128, + 31, 203, 24, 170, 226, 70, 128, 31, 200, 235, 170, 226, 70, 128, 31, 202, + 178, 170, 226, 70, 128, 31, 235, 15, 170, 226, 70, 128, 31, 235, 146, + 170, 226, 70, 128, 31, 206, 14, 170, 226, 70, 128, 31, 207, 66, 170, 226, + 70, 128, 31, 237, 21, 170, 226, 70, 128, 31, 216, 175, 170, 226, 70, 128, + 31, 222, 255, 226, 70, 128, 31, 222, 254, 226, 70, 128, 223, 0, 78, 226, + 70, 128, 31, 224, 246, 226, 70, 128, 31, 224, 245, 226, 70, 128, 31, 212, + 31, 100, 226, 70, 128, 31, 212, 31, 102, 226, 70, 128, 31, 212, 31, 134, + 226, 70, 128, 31, 212, 31, 136, 226, 70, 128, 31, 212, 31, 146, 226, 70, + 128, 31, 212, 31, 167, 226, 70, 128, 31, 212, 31, 178, 226, 70, 128, 31, + 212, 31, 171, 226, 70, 128, 31, 212, 31, 182, 226, 70, 128, 212, 147, + 226, 70, 128, 191, 97, 211, 87, 226, 70, 128, 191, 97, 232, 225, 226, 70, + 128, 191, 115, 211, 85, 226, 70, 128, 209, 108, 78, 226, 70, 128, 31, + 251, 131, 100, 226, 70, 128, 31, 251, 131, 102, 226, 70, 128, 31, 251, + 131, 203, 24, 170, 226, 70, 128, 251, 131, 223, 0, 78, 214, 41, 128, 31, + 100, 214, 41, 128, 31, 102, 214, 41, 128, 31, 134, 214, 41, 128, 31, 136, + 214, 41, 128, 31, 146, 214, 41, 128, 31, 167, 214, 41, 128, 31, 178, 214, + 41, 128, 31, 171, 214, 41, 128, 31, 182, 214, 41, 128, 31, 203, 23, 214, + 41, 128, 31, 200, 234, 214, 41, 128, 31, 202, 177, 214, 41, 128, 31, 235, + 14, 214, 41, 128, 31, 235, 145, 214, 41, 128, 31, 206, 13, 214, 41, 128, + 31, 207, 65, 214, 41, 128, 31, 237, 20, 214, 41, 128, 31, 216, 174, 214, + 41, 128, 31, 97, 231, 57, 214, 41, 128, 31, 99, 231, 57, 214, 41, 128, + 31, 115, 231, 57, 214, 41, 128, 31, 235, 7, 231, 57, 214, 41, 128, 31, + 235, 101, 231, 57, 214, 41, 128, 31, 206, 29, 231, 57, 214, 41, 128, 31, + 207, 71, 231, 57, 214, 41, 128, 31, 237, 31, 231, 57, 214, 41, 128, 31, + 216, 179, 231, 57, 214, 41, 128, 31, 97, 170, 214, 41, 128, 31, 99, 170, + 214, 41, 128, 31, 115, 170, 214, 41, 128, 31, 235, 7, 170, 214, 41, 128, + 31, 235, 101, 170, 214, 41, 128, 31, 206, 29, 170, 214, 41, 128, 31, 207, + 71, 170, 214, 41, 128, 31, 237, 31, 170, 214, 41, 128, 31, 216, 179, 170, + 214, 41, 128, 31, 203, 24, 170, 214, 41, 128, 31, 200, 235, 170, 214, 41, + 128, 31, 202, 178, 170, 214, 41, 128, 31, 235, 15, 170, 214, 41, 128, 31, + 235, 146, 170, 214, 41, 128, 31, 206, 14, 170, 214, 41, 128, 31, 207, 66, + 170, 214, 41, 128, 31, 237, 21, 170, 214, 41, 128, 31, 216, 175, 170, + 214, 41, 128, 220, 22, 214, 41, 128, 251, 131, 31, 102, 214, 41, 128, + 251, 131, 31, 134, 214, 41, 128, 251, 131, 31, 136, 214, 41, 128, 251, + 131, 31, 146, 214, 41, 128, 251, 131, 31, 167, 214, 41, 128, 251, 131, + 31, 178, 214, 41, 128, 251, 131, 31, 171, 214, 41, 128, 251, 131, 31, + 182, 214, 41, 128, 251, 131, 31, 203, 23, 214, 41, 128, 251, 131, 31, + 235, 7, 231, 57, 214, 41, 128, 251, 131, 31, 206, 29, 231, 57, 214, 41, + 128, 251, 131, 31, 99, 170, 214, 41, 128, 251, 131, 31, 203, 24, 170, + 214, 41, 128, 191, 97, 232, 225, 214, 41, 128, 191, 97, 206, 17, 9, 13, + 251, 164, 9, 13, 248, 239, 9, 13, 225, 189, 9, 13, 240, 107, 9, 13, 197, + 117, 9, 13, 195, 106, 9, 13, 232, 236, 9, 13, 203, 139, 9, 13, 196, 64, + 9, 13, 225, 35, 9, 13, 222, 249, 9, 13, 219, 185, 9, 13, 216, 31, 9, 13, + 208, 125, 9, 13, 251, 194, 9, 13, 235, 176, 9, 13, 209, 8, 9, 13, 211, + 152, 9, 13, 210, 142, 9, 13, 206, 251, 9, 13, 203, 41, 9, 13, 202, 213, + 9, 13, 224, 142, 9, 13, 202, 225, 9, 13, 240, 130, 9, 13, 195, 109, 9, + 13, 233, 225, 9, 13, 238, 252, 248, 239, 9, 13, 238, 252, 216, 31, 9, 13, + 238, 252, 235, 176, 9, 13, 238, 252, 211, 152, 9, 13, 84, 248, 239, 9, + 13, 84, 225, 189, 9, 13, 84, 232, 113, 9, 13, 84, 232, 236, 9, 13, 84, + 196, 64, 9, 13, 84, 225, 35, 9, 13, 84, 222, 249, 9, 13, 84, 219, 185, 9, + 13, 84, 216, 31, 9, 13, 84, 208, 125, 9, 13, 84, 251, 194, 9, 13, 84, + 235, 176, 9, 13, 84, 209, 8, 9, 13, 84, 211, 152, 9, 13, 84, 206, 251, 9, + 13, 84, 203, 41, 9, 13, 84, 202, 213, 9, 13, 84, 224, 142, 9, 13, 84, + 240, 130, 9, 13, 84, 233, 225, 9, 13, 203, 134, 225, 189, 9, 13, 203, + 134, 232, 236, 9, 13, 203, 134, 196, 64, 9, 13, 203, 134, 222, 249, 9, + 13, 203, 134, 216, 31, 9, 13, 203, 134, 208, 125, 9, 13, 203, 134, 251, + 194, 9, 13, 203, 134, 209, 8, 9, 13, 203, 134, 211, 152, 9, 13, 203, 134, + 206, 251, 9, 13, 203, 134, 224, 142, 9, 13, 203, 134, 240, 130, 9, 13, + 203, 134, 233, 225, 9, 13, 203, 134, 238, 252, 216, 31, 9, 13, 203, 134, + 238, 252, 211, 152, 9, 13, 204, 204, 248, 239, 9, 13, 204, 204, 225, 189, + 9, 13, 204, 204, 232, 113, 9, 13, 204, 204, 232, 236, 9, 13, 204, 204, + 203, 139, 9, 13, 204, 204, 196, 64, 9, 13, 204, 204, 225, 35, 9, 13, 204, + 204, 219, 185, 9, 13, 204, 204, 216, 31, 9, 13, 204, 204, 208, 125, 9, + 13, 204, 204, 251, 194, 9, 13, 204, 204, 235, 176, 9, 13, 204, 204, 209, + 8, 9, 13, 204, 204, 211, 152, 9, 13, 204, 204, 206, 251, 9, 13, 204, 204, + 203, 41, 9, 13, 204, 204, 202, 213, 9, 13, 204, 204, 224, 142, 9, 13, + 204, 204, 240, 130, 9, 13, 204, 204, 195, 109, 9, 13, 204, 204, 233, 225, + 9, 13, 204, 204, 238, 252, 248, 239, 9, 13, 204, 204, 238, 252, 235, 176, + 9, 13, 221, 224, 251, 164, 9, 13, 221, 224, 248, 239, 9, 13, 221, 224, + 225, 189, 9, 13, 221, 224, 240, 107, 9, 13, 221, 224, 232, 113, 9, 13, + 221, 224, 197, 117, 9, 13, 221, 224, 195, 106, 9, 13, 221, 224, 232, 236, + 9, 13, 221, 224, 203, 139, 9, 13, 221, 224, 196, 64, 9, 13, 221, 224, + 222, 249, 9, 13, 221, 224, 219, 185, 9, 13, 221, 224, 216, 31, 9, 13, + 221, 224, 208, 125, 9, 13, 221, 224, 251, 194, 9, 13, 221, 224, 235, 176, + 9, 13, 221, 224, 209, 8, 9, 13, 221, 224, 211, 152, 9, 13, 221, 224, 210, + 142, 9, 13, 221, 224, 206, 251, 9, 13, 221, 224, 203, 41, 9, 13, 221, + 224, 202, 213, 9, 13, 221, 224, 224, 142, 9, 13, 221, 224, 202, 225, 9, + 13, 221, 224, 240, 130, 9, 13, 221, 224, 195, 109, 9, 13, 221, 224, 233, + 225, 9, 13, 237, 241, 248, 239, 9, 13, 237, 241, 225, 189, 9, 13, 237, + 241, 240, 107, 9, 13, 237, 241, 197, 117, 9, 13, 237, 241, 195, 106, 9, + 13, 237, 241, 232, 236, 9, 13, 237, 241, 203, 139, 9, 13, 237, 241, 196, + 64, 9, 13, 237, 241, 222, 249, 9, 13, 237, 241, 219, 185, 9, 13, 237, + 241, 216, 31, 9, 13, 237, 241, 208, 125, 9, 13, 237, 241, 251, 194, 9, + 13, 237, 241, 235, 176, 9, 13, 237, 241, 209, 8, 9, 13, 237, 241, 211, + 152, 9, 13, 237, 241, 210, 142, 9, 13, 237, 241, 206, 251, 9, 13, 237, + 241, 203, 41, 9, 13, 237, 241, 202, 213, 9, 13, 237, 241, 224, 142, 9, + 13, 237, 241, 202, 225, 9, 13, 237, 241, 240, 130, 9, 13, 237, 241, 195, + 109, 9, 13, 237, 241, 233, 225, 9, 13, 214, 83, 87, 3, 168, 3, 203, 91, + 9, 13, 214, 83, 168, 3, 240, 107, 220, 83, 113, 237, 69, 197, 50, 220, + 83, 113, 205, 159, 197, 50, 220, 83, 113, 197, 89, 197, 50, 220, 83, 113, + 173, 197, 50, 220, 83, 113, 210, 158, 237, 223, 220, 83, 113, 233, 91, + 237, 223, 220, 83, 113, 59, 237, 223, 220, 83, 113, 97, 77, 245, 114, + 220, 83, 113, 99, 77, 245, 114, 220, 83, 113, 115, 77, 245, 114, 220, 83, + 113, 235, 7, 77, 245, 114, 220, 83, 113, 235, 101, 77, 245, 114, 220, 83, + 113, 206, 29, 77, 245, 114, 220, 83, 113, 207, 71, 77, 245, 114, 220, 83, + 113, 237, 31, 77, 245, 114, 220, 83, 113, 216, 179, 77, 245, 114, 220, + 83, 113, 97, 77, 249, 94, 220, 83, 113, 99, 77, 249, 94, 220, 83, 113, + 115, 77, 249, 94, 220, 83, 113, 235, 7, 77, 249, 94, 220, 83, 113, 235, + 101, 77, 249, 94, 220, 83, 113, 206, 29, 77, 249, 94, 220, 83, 113, 207, + 71, 77, 249, 94, 220, 83, 113, 237, 31, 77, 249, 94, 220, 83, 113, 216, + 179, 77, 249, 94, 220, 83, 113, 97, 77, 244, 246, 220, 83, 113, 99, 77, + 244, 246, 220, 83, 113, 115, 77, 244, 246, 220, 83, 113, 235, 7, 77, 244, + 246, 220, 83, 113, 235, 101, 77, 244, 246, 220, 83, 113, 206, 29, 77, + 244, 246, 220, 83, 113, 207, 71, 77, 244, 246, 220, 83, 113, 237, 31, 77, + 244, 246, 220, 83, 113, 216, 179, 77, 244, 246, 220, 83, 113, 212, 128, + 220, 83, 113, 214, 69, 220, 83, 113, 249, 95, 220, 83, 113, 245, 31, 220, + 83, 113, 205, 100, 220, 83, 113, 204, 113, 220, 83, 113, 250, 136, 220, + 83, 113, 197, 41, 220, 83, 113, 225, 122, 220, 83, 113, 249, 138, 185, + 113, 231, 155, 249, 138, 185, 113, 231, 153, 185, 113, 231, 152, 185, + 113, 231, 151, 185, 113, 231, 150, 185, 113, 231, 149, 185, 113, 231, + 148, 185, 113, 231, 147, 185, 113, 231, 146, 185, 113, 231, 145, 185, + 113, 231, 144, 185, 113, 231, 143, 185, 113, 231, 142, 185, 113, 231, + 141, 185, 113, 231, 140, 185, 113, 231, 139, 185, 113, 231, 138, 185, + 113, 231, 137, 185, 113, 231, 136, 185, 113, 231, 135, 185, 113, 231, + 134, 185, 113, 231, 133, 185, 113, 231, 132, 185, 113, 231, 131, 185, + 113, 231, 130, 185, 113, 231, 129, 185, 113, 231, 128, 185, 113, 231, + 127, 185, 113, 231, 126, 185, 113, 231, 125, 185, 113, 231, 124, 185, + 113, 231, 123, 185, 113, 231, 122, 185, 113, 231, 121, 185, 113, 231, + 120, 185, 113, 231, 119, 185, 113, 231, 118, 185, 113, 231, 117, 185, + 113, 231, 116, 185, 113, 231, 115, 185, 113, 231, 114, 185, 113, 231, + 113, 185, 113, 231, 112, 185, 113, 231, 111, 185, 113, 231, 110, 185, + 113, 231, 109, 185, 113, 231, 108, 185, 113, 231, 107, 185, 113, 231, + 106, 185, 113, 231, 105, 185, 113, 83, 249, 138, 185, 113, 199, 99, 185, 113, 199, 98, 185, 113, 199, 97, 185, 113, 199, 96, 185, 113, 199, 95, 185, 113, 199, 94, 185, 113, 199, 93, 185, 113, 199, 92, 185, 113, 199, 91, 185, 113, 199, 90, 185, 113, 199, 89, 185, 113, 199, 88, 185, 113, @@ -17911,896 +17915,896 @@ static const unsigned char phrasebook[] = { 185, 113, 199, 64, 185, 113, 199, 63, 185, 113, 199, 62, 185, 113, 199, 61, 185, 113, 199, 60, 185, 113, 199, 59, 185, 113, 199, 58, 185, 113, 199, 57, 185, 113, 199, 56, 185, 113, 199, 55, 185, 113, 199, 54, 185, - 113, 199, 53, 185, 113, 199, 52, 185, 113, 199, 51, 212, 137, 247, 114, - 249, 137, 212, 137, 247, 114, 252, 15, 77, 205, 145, 212, 137, 247, 114, - 99, 77, 205, 145, 212, 137, 247, 114, 115, 77, 205, 145, 212, 137, 247, - 114, 235, 6, 77, 205, 145, 212, 137, 247, 114, 235, 100, 77, 205, 145, - 212, 137, 247, 114, 206, 29, 77, 205, 145, 212, 137, 247, 114, 207, 71, - 77, 205, 145, 212, 137, 247, 114, 237, 30, 77, 205, 145, 212, 137, 247, - 114, 216, 178, 77, 205, 145, 212, 137, 247, 114, 203, 24, 77, 205, 145, - 212, 137, 247, 114, 225, 211, 77, 205, 145, 212, 137, 247, 114, 224, 19, - 77, 205, 145, 212, 137, 247, 114, 211, 80, 77, 205, 145, 212, 137, 247, - 114, 224, 73, 77, 205, 145, 212, 137, 247, 114, 252, 15, 77, 232, 123, - 212, 137, 247, 114, 99, 77, 232, 123, 212, 137, 247, 114, 115, 77, 232, - 123, 212, 137, 247, 114, 235, 6, 77, 232, 123, 212, 137, 247, 114, 235, - 100, 77, 232, 123, 212, 137, 247, 114, 206, 29, 77, 232, 123, 212, 137, - 247, 114, 207, 71, 77, 232, 123, 212, 137, 247, 114, 237, 30, 77, 232, - 123, 212, 137, 247, 114, 216, 178, 77, 232, 123, 212, 137, 247, 114, 203, - 24, 77, 232, 123, 212, 137, 247, 114, 225, 211, 77, 232, 123, 212, 137, - 247, 114, 224, 19, 77, 232, 123, 212, 137, 247, 114, 211, 80, 77, 232, - 123, 212, 137, 247, 114, 224, 73, 77, 232, 123, 212, 137, 247, 114, 210, - 157, 225, 121, 212, 137, 247, 114, 252, 15, 77, 239, 138, 212, 137, 247, - 114, 99, 77, 239, 138, 212, 137, 247, 114, 115, 77, 239, 138, 212, 137, - 247, 114, 235, 6, 77, 239, 138, 212, 137, 247, 114, 235, 100, 77, 239, - 138, 212, 137, 247, 114, 206, 29, 77, 239, 138, 212, 137, 247, 114, 207, - 71, 77, 239, 138, 212, 137, 247, 114, 237, 30, 77, 239, 138, 212, 137, - 247, 114, 216, 178, 77, 239, 138, 212, 137, 247, 114, 203, 24, 77, 239, - 138, 212, 137, 247, 114, 225, 211, 77, 239, 138, 212, 137, 247, 114, 224, - 19, 77, 239, 138, 212, 137, 247, 114, 211, 80, 77, 239, 138, 212, 137, - 247, 114, 224, 73, 77, 239, 138, 212, 137, 247, 114, 58, 225, 121, 212, - 137, 247, 114, 252, 15, 77, 244, 187, 212, 137, 247, 114, 99, 77, 244, - 187, 212, 137, 247, 114, 115, 77, 244, 187, 212, 137, 247, 114, 235, 6, - 77, 244, 187, 212, 137, 247, 114, 235, 100, 77, 244, 187, 212, 137, 247, - 114, 206, 29, 77, 244, 187, 212, 137, 247, 114, 207, 71, 77, 244, 187, - 212, 137, 247, 114, 237, 30, 77, 244, 187, 212, 137, 247, 114, 216, 178, - 77, 244, 187, 212, 137, 247, 114, 203, 24, 77, 244, 187, 212, 137, 247, - 114, 225, 211, 77, 244, 187, 212, 137, 247, 114, 224, 19, 77, 244, 187, - 212, 137, 247, 114, 211, 80, 77, 244, 187, 212, 137, 247, 114, 224, 73, - 77, 244, 187, 212, 137, 247, 114, 59, 225, 121, 212, 137, 247, 114, 235, - 37, 212, 137, 247, 114, 201, 141, 212, 137, 247, 114, 201, 130, 212, 137, - 247, 114, 201, 127, 212, 137, 247, 114, 201, 126, 212, 137, 247, 114, - 201, 125, 212, 137, 247, 114, 201, 124, 212, 137, 247, 114, 201, 123, - 212, 137, 247, 114, 201, 122, 212, 137, 247, 114, 201, 121, 212, 137, - 247, 114, 201, 140, 212, 137, 247, 114, 201, 139, 212, 137, 247, 114, - 201, 138, 212, 137, 247, 114, 201, 137, 212, 137, 247, 114, 201, 136, - 212, 137, 247, 114, 201, 135, 212, 137, 247, 114, 201, 134, 212, 137, - 247, 114, 201, 133, 212, 137, 247, 114, 201, 132, 212, 137, 247, 114, - 201, 131, 212, 137, 247, 114, 201, 129, 212, 137, 247, 114, 201, 128, 17, - 195, 80, 234, 216, 204, 226, 17, 195, 80, 244, 158, 17, 97, 244, 158, 17, - 99, 244, 158, 17, 115, 244, 158, 17, 235, 6, 244, 158, 17, 235, 100, 244, - 158, 17, 206, 29, 244, 158, 17, 207, 71, 244, 158, 17, 237, 30, 244, 158, - 17, 216, 178, 244, 158, 239, 92, 46, 45, 17, 195, 79, 239, 92, 217, 103, - 46, 45, 17, 195, 79, 119, 8, 6, 1, 63, 119, 8, 6, 1, 250, 111, 119, 8, 6, - 1, 247, 206, 119, 8, 6, 1, 240, 230, 119, 8, 6, 1, 69, 119, 8, 6, 1, 236, - 48, 119, 8, 6, 1, 234, 189, 119, 8, 6, 1, 233, 14, 119, 8, 6, 1, 68, 119, - 8, 6, 1, 225, 216, 119, 8, 6, 1, 225, 79, 119, 8, 6, 1, 159, 119, 8, 6, - 1, 221, 135, 119, 8, 6, 1, 218, 54, 119, 8, 6, 1, 72, 119, 8, 6, 1, 214, - 2, 119, 8, 6, 1, 211, 166, 119, 8, 6, 1, 144, 119, 8, 6, 1, 209, 80, 119, + 113, 199, 53, 185, 113, 199, 52, 185, 113, 199, 51, 212, 138, 247, 115, + 249, 138, 212, 138, 247, 115, 252, 16, 77, 205, 145, 212, 138, 247, 115, + 99, 77, 205, 145, 212, 138, 247, 115, 115, 77, 205, 145, 212, 138, 247, + 115, 235, 7, 77, 205, 145, 212, 138, 247, 115, 235, 101, 77, 205, 145, + 212, 138, 247, 115, 206, 29, 77, 205, 145, 212, 138, 247, 115, 207, 71, + 77, 205, 145, 212, 138, 247, 115, 237, 31, 77, 205, 145, 212, 138, 247, + 115, 216, 179, 77, 205, 145, 212, 138, 247, 115, 203, 24, 77, 205, 145, + 212, 138, 247, 115, 225, 212, 77, 205, 145, 212, 138, 247, 115, 224, 20, + 77, 205, 145, 212, 138, 247, 115, 211, 81, 77, 205, 145, 212, 138, 247, + 115, 224, 74, 77, 205, 145, 212, 138, 247, 115, 252, 16, 77, 232, 124, + 212, 138, 247, 115, 99, 77, 232, 124, 212, 138, 247, 115, 115, 77, 232, + 124, 212, 138, 247, 115, 235, 7, 77, 232, 124, 212, 138, 247, 115, 235, + 101, 77, 232, 124, 212, 138, 247, 115, 206, 29, 77, 232, 124, 212, 138, + 247, 115, 207, 71, 77, 232, 124, 212, 138, 247, 115, 237, 31, 77, 232, + 124, 212, 138, 247, 115, 216, 179, 77, 232, 124, 212, 138, 247, 115, 203, + 24, 77, 232, 124, 212, 138, 247, 115, 225, 212, 77, 232, 124, 212, 138, + 247, 115, 224, 20, 77, 232, 124, 212, 138, 247, 115, 211, 81, 77, 232, + 124, 212, 138, 247, 115, 224, 74, 77, 232, 124, 212, 138, 247, 115, 210, + 158, 225, 122, 212, 138, 247, 115, 252, 16, 77, 239, 139, 212, 138, 247, + 115, 99, 77, 239, 139, 212, 138, 247, 115, 115, 77, 239, 139, 212, 138, + 247, 115, 235, 7, 77, 239, 139, 212, 138, 247, 115, 235, 101, 77, 239, + 139, 212, 138, 247, 115, 206, 29, 77, 239, 139, 212, 138, 247, 115, 207, + 71, 77, 239, 139, 212, 138, 247, 115, 237, 31, 77, 239, 139, 212, 138, + 247, 115, 216, 179, 77, 239, 139, 212, 138, 247, 115, 203, 24, 77, 239, + 139, 212, 138, 247, 115, 225, 212, 77, 239, 139, 212, 138, 247, 115, 224, + 20, 77, 239, 139, 212, 138, 247, 115, 211, 81, 77, 239, 139, 212, 138, + 247, 115, 224, 74, 77, 239, 139, 212, 138, 247, 115, 58, 225, 122, 212, + 138, 247, 115, 252, 16, 77, 244, 188, 212, 138, 247, 115, 99, 77, 244, + 188, 212, 138, 247, 115, 115, 77, 244, 188, 212, 138, 247, 115, 235, 7, + 77, 244, 188, 212, 138, 247, 115, 235, 101, 77, 244, 188, 212, 138, 247, + 115, 206, 29, 77, 244, 188, 212, 138, 247, 115, 207, 71, 77, 244, 188, + 212, 138, 247, 115, 237, 31, 77, 244, 188, 212, 138, 247, 115, 216, 179, + 77, 244, 188, 212, 138, 247, 115, 203, 24, 77, 244, 188, 212, 138, 247, + 115, 225, 212, 77, 244, 188, 212, 138, 247, 115, 224, 20, 77, 244, 188, + 212, 138, 247, 115, 211, 81, 77, 244, 188, 212, 138, 247, 115, 224, 74, + 77, 244, 188, 212, 138, 247, 115, 59, 225, 122, 212, 138, 247, 115, 235, + 38, 212, 138, 247, 115, 201, 141, 212, 138, 247, 115, 201, 130, 212, 138, + 247, 115, 201, 127, 212, 138, 247, 115, 201, 126, 212, 138, 247, 115, + 201, 125, 212, 138, 247, 115, 201, 124, 212, 138, 247, 115, 201, 123, + 212, 138, 247, 115, 201, 122, 212, 138, 247, 115, 201, 121, 212, 138, + 247, 115, 201, 140, 212, 138, 247, 115, 201, 139, 212, 138, 247, 115, + 201, 138, 212, 138, 247, 115, 201, 137, 212, 138, 247, 115, 201, 136, + 212, 138, 247, 115, 201, 135, 212, 138, 247, 115, 201, 134, 212, 138, + 247, 115, 201, 133, 212, 138, 247, 115, 201, 132, 212, 138, 247, 115, + 201, 131, 212, 138, 247, 115, 201, 129, 212, 138, 247, 115, 201, 128, 17, + 195, 80, 234, 217, 204, 226, 17, 195, 80, 244, 159, 17, 97, 244, 159, 17, + 99, 244, 159, 17, 115, 244, 159, 17, 235, 7, 244, 159, 17, 235, 101, 244, + 159, 17, 206, 29, 244, 159, 17, 207, 71, 244, 159, 17, 237, 31, 244, 159, + 17, 216, 179, 244, 159, 239, 93, 46, 45, 17, 195, 79, 239, 93, 217, 104, + 46, 45, 17, 195, 79, 119, 8, 6, 1, 63, 119, 8, 6, 1, 250, 112, 119, 8, 6, + 1, 247, 207, 119, 8, 6, 1, 240, 231, 119, 8, 6, 1, 69, 119, 8, 6, 1, 236, + 49, 119, 8, 6, 1, 234, 190, 119, 8, 6, 1, 233, 15, 119, 8, 6, 1, 68, 119, + 8, 6, 1, 225, 217, 119, 8, 6, 1, 225, 80, 119, 8, 6, 1, 159, 119, 8, 6, + 1, 221, 136, 119, 8, 6, 1, 218, 55, 119, 8, 6, 1, 72, 119, 8, 6, 1, 214, + 3, 119, 8, 6, 1, 211, 167, 119, 8, 6, 1, 144, 119, 8, 6, 1, 209, 80, 119, 8, 6, 1, 203, 216, 119, 8, 6, 1, 66, 119, 8, 6, 1, 199, 230, 119, 8, 6, 1, 197, 199, 119, 8, 6, 1, 196, 222, 119, 8, 6, 1, 196, 148, 119, 8, 6, - 1, 195, 158, 201, 231, 206, 245, 248, 60, 8, 6, 1, 209, 80, 46, 41, 8, 6, - 1, 247, 206, 46, 41, 8, 6, 1, 144, 46, 247, 57, 46, 196, 224, 241, 105, - 105, 103, 8, 6, 1, 63, 103, 8, 6, 1, 250, 111, 103, 8, 6, 1, 247, 206, - 103, 8, 6, 1, 240, 230, 103, 8, 6, 1, 69, 103, 8, 6, 1, 236, 48, 103, 8, - 6, 1, 234, 189, 103, 8, 6, 1, 233, 14, 103, 8, 6, 1, 68, 103, 8, 6, 1, - 225, 216, 103, 8, 6, 1, 225, 79, 103, 8, 6, 1, 159, 103, 8, 6, 1, 221, - 135, 103, 8, 6, 1, 218, 54, 103, 8, 6, 1, 72, 103, 8, 6, 1, 214, 2, 103, - 8, 6, 1, 211, 166, 103, 8, 6, 1, 144, 103, 8, 6, 1, 209, 80, 103, 8, 6, + 1, 195, 158, 201, 231, 206, 245, 248, 61, 8, 6, 1, 209, 80, 46, 41, 8, 6, + 1, 247, 207, 46, 41, 8, 6, 1, 144, 46, 247, 58, 46, 196, 224, 241, 106, + 105, 103, 8, 6, 1, 63, 103, 8, 6, 1, 250, 112, 103, 8, 6, 1, 247, 207, + 103, 8, 6, 1, 240, 231, 103, 8, 6, 1, 69, 103, 8, 6, 1, 236, 49, 103, 8, + 6, 1, 234, 190, 103, 8, 6, 1, 233, 15, 103, 8, 6, 1, 68, 103, 8, 6, 1, + 225, 217, 103, 8, 6, 1, 225, 80, 103, 8, 6, 1, 159, 103, 8, 6, 1, 221, + 136, 103, 8, 6, 1, 218, 55, 103, 8, 6, 1, 72, 103, 8, 6, 1, 214, 3, 103, + 8, 6, 1, 211, 167, 103, 8, 6, 1, 144, 103, 8, 6, 1, 209, 80, 103, 8, 6, 1, 203, 216, 103, 8, 6, 1, 66, 103, 8, 6, 1, 199, 230, 103, 8, 6, 1, 197, 199, 103, 8, 6, 1, 196, 222, 103, 8, 6, 1, 196, 148, 103, 8, 6, 1, 195, - 158, 103, 231, 43, 103, 218, 78, 103, 208, 149, 103, 205, 83, 103, 212, - 51, 103, 197, 110, 217, 103, 46, 8, 6, 1, 63, 217, 103, 46, 8, 6, 1, 250, - 111, 217, 103, 46, 8, 6, 1, 247, 206, 217, 103, 46, 8, 6, 1, 240, 230, - 217, 103, 46, 8, 6, 1, 69, 217, 103, 46, 8, 6, 1, 236, 48, 217, 103, 46, - 8, 6, 1, 234, 189, 217, 103, 46, 8, 6, 1, 233, 14, 217, 103, 46, 8, 6, 1, - 68, 217, 103, 46, 8, 6, 1, 225, 216, 217, 103, 46, 8, 6, 1, 225, 79, 217, - 103, 46, 8, 6, 1, 159, 217, 103, 46, 8, 6, 1, 221, 135, 217, 103, 46, 8, - 6, 1, 218, 54, 217, 103, 46, 8, 6, 1, 72, 217, 103, 46, 8, 6, 1, 214, 2, - 217, 103, 46, 8, 6, 1, 211, 166, 217, 103, 46, 8, 6, 1, 144, 217, 103, - 46, 8, 6, 1, 209, 80, 217, 103, 46, 8, 6, 1, 203, 216, 217, 103, 46, 8, - 6, 1, 66, 217, 103, 46, 8, 6, 1, 199, 230, 217, 103, 46, 8, 6, 1, 197, - 199, 217, 103, 46, 8, 6, 1, 196, 222, 217, 103, 46, 8, 6, 1, 196, 148, - 217, 103, 46, 8, 6, 1, 195, 158, 210, 214, 219, 212, 55, 210, 214, 219, - 209, 55, 210, 214, 218, 149, 55, 217, 103, 103, 8, 6, 1, 63, 217, 103, - 103, 8, 6, 1, 250, 111, 217, 103, 103, 8, 6, 1, 247, 206, 217, 103, 103, - 8, 6, 1, 240, 230, 217, 103, 103, 8, 6, 1, 69, 217, 103, 103, 8, 6, 1, - 236, 48, 217, 103, 103, 8, 6, 1, 234, 189, 217, 103, 103, 8, 6, 1, 233, - 14, 217, 103, 103, 8, 6, 1, 68, 217, 103, 103, 8, 6, 1, 225, 216, 217, - 103, 103, 8, 6, 1, 225, 79, 217, 103, 103, 8, 6, 1, 159, 217, 103, 103, - 8, 6, 1, 221, 135, 217, 103, 103, 8, 6, 1, 218, 54, 217, 103, 103, 8, 6, - 1, 72, 217, 103, 103, 8, 6, 1, 214, 2, 217, 103, 103, 8, 6, 1, 211, 166, - 217, 103, 103, 8, 6, 1, 144, 217, 103, 103, 8, 6, 1, 209, 80, 217, 103, - 103, 8, 6, 1, 203, 216, 217, 103, 103, 8, 6, 1, 66, 217, 103, 103, 8, 6, - 1, 199, 230, 217, 103, 103, 8, 6, 1, 197, 199, 217, 103, 103, 8, 6, 1, - 196, 222, 217, 103, 103, 8, 6, 1, 196, 148, 217, 103, 103, 8, 6, 1, 195, - 158, 241, 58, 217, 103, 103, 8, 6, 1, 214, 2, 217, 103, 103, 230, 202, - 217, 103, 103, 161, 217, 103, 103, 183, 217, 103, 103, 252, 116, 217, - 103, 103, 197, 110, 47, 239, 47, 103, 244, 229, 103, 241, 112, 103, 234, - 244, 103, 230, 193, 103, 217, 81, 103, 217, 72, 103, 214, 138, 103, 205, - 166, 103, 124, 3, 236, 89, 78, 103, 198, 223, 103, 115, 240, 230, 103, - 208, 136, 208, 154, 103, 99, 225, 79, 103, 235, 6, 225, 79, 103, 237, 30, - 225, 79, 103, 235, 100, 212, 110, 100, 103, 207, 71, 212, 110, 100, 103, - 200, 223, 212, 110, 102, 103, 206, 14, 214, 2, 103, 97, 231, 57, 200, - 235, 214, 2, 103, 8, 4, 1, 240, 230, 103, 232, 149, 103, 232, 148, 103, - 232, 62, 103, 221, 216, 103, 206, 131, 103, 200, 91, 103, 198, 245, 210, - 149, 226, 68, 16, 1, 63, 210, 149, 226, 68, 16, 1, 250, 111, 210, 149, - 226, 68, 16, 1, 247, 206, 210, 149, 226, 68, 16, 1, 240, 230, 210, 149, - 226, 68, 16, 1, 69, 210, 149, 226, 68, 16, 1, 236, 48, 210, 149, 226, 68, - 16, 1, 234, 189, 210, 149, 226, 68, 16, 1, 233, 14, 210, 149, 226, 68, - 16, 1, 68, 210, 149, 226, 68, 16, 1, 225, 216, 210, 149, 226, 68, 16, 1, - 225, 79, 210, 149, 226, 68, 16, 1, 159, 210, 149, 226, 68, 16, 1, 221, - 135, 210, 149, 226, 68, 16, 1, 218, 54, 210, 149, 226, 68, 16, 1, 72, - 210, 149, 226, 68, 16, 1, 214, 2, 210, 149, 226, 68, 16, 1, 211, 166, - 210, 149, 226, 68, 16, 1, 144, 210, 149, 226, 68, 16, 1, 209, 80, 210, - 149, 226, 68, 16, 1, 203, 216, 210, 149, 226, 68, 16, 1, 66, 210, 149, - 226, 68, 16, 1, 199, 230, 210, 149, 226, 68, 16, 1, 197, 199, 210, 149, - 226, 68, 16, 1, 196, 222, 210, 149, 226, 68, 16, 1, 196, 148, 210, 149, - 226, 68, 16, 1, 195, 158, 47, 188, 231, 178, 103, 71, 223, 249, 103, 71, - 183, 103, 12, 200, 54, 228, 137, 103, 12, 200, 54, 228, 141, 103, 12, - 200, 54, 228, 149, 103, 71, 239, 251, 103, 12, 200, 54, 228, 156, 103, - 12, 200, 54, 228, 143, 103, 12, 200, 54, 228, 115, 103, 12, 200, 54, 228, - 142, 103, 12, 200, 54, 228, 155, 103, 12, 200, 54, 228, 129, 103, 12, - 200, 54, 228, 122, 103, 12, 200, 54, 228, 131, 103, 12, 200, 54, 228, - 152, 103, 12, 200, 54, 228, 138, 103, 12, 200, 54, 228, 154, 103, 12, - 200, 54, 228, 130, 103, 12, 200, 54, 228, 153, 103, 12, 200, 54, 228, - 116, 103, 12, 200, 54, 228, 121, 103, 12, 200, 54, 228, 114, 103, 12, - 200, 54, 228, 144, 103, 12, 200, 54, 228, 146, 103, 12, 200, 54, 228, - 124, 103, 12, 200, 54, 228, 135, 103, 12, 200, 54, 228, 133, 103, 12, - 200, 54, 228, 159, 103, 12, 200, 54, 228, 158, 103, 12, 200, 54, 228, - 112, 103, 12, 200, 54, 228, 139, 103, 12, 200, 54, 228, 157, 103, 12, - 200, 54, 228, 148, 103, 12, 200, 54, 228, 134, 103, 12, 200, 54, 228, - 113, 103, 12, 200, 54, 228, 136, 103, 12, 200, 54, 228, 118, 103, 12, - 200, 54, 228, 117, 103, 12, 200, 54, 228, 147, 103, 12, 200, 54, 228, - 125, 103, 12, 200, 54, 228, 127, 103, 12, 200, 54, 228, 128, 103, 12, - 200, 54, 228, 120, 103, 12, 200, 54, 228, 151, 103, 12, 200, 54, 228, - 145, 103, 12, 200, 54, 228, 111, 201, 231, 206, 245, 248, 60, 12, 200, - 54, 228, 126, 201, 231, 206, 245, 248, 60, 12, 200, 54, 228, 158, 201, - 231, 206, 245, 248, 60, 12, 200, 54, 228, 156, 201, 231, 206, 245, 248, - 60, 12, 200, 54, 228, 140, 201, 231, 206, 245, 248, 60, 12, 200, 54, 228, - 123, 201, 231, 206, 245, 248, 60, 12, 200, 54, 228, 136, 201, 231, 206, - 245, 248, 60, 12, 200, 54, 228, 119, 201, 231, 206, 245, 248, 60, 12, - 200, 54, 228, 150, 201, 231, 206, 245, 248, 60, 12, 200, 54, 228, 132, - 46, 230, 190, 251, 246, 46, 230, 190, 252, 19, 209, 185, 16, 36, 234, - 222, 209, 185, 16, 36, 221, 190, 209, 185, 16, 36, 206, 165, 209, 185, - 16, 36, 196, 196, 209, 185, 16, 36, 206, 148, 209, 185, 16, 36, 247, 161, - 240, 241, 235, 48, 244, 202, 200, 76, 216, 194, 3, 205, 4, 204, 106, 127, - 218, 167, 204, 105, 244, 233, 250, 168, 237, 173, 204, 104, 127, 248, 9, - 210, 215, 248, 39, 250, 168, 216, 193, 197, 128, 197, 122, 198, 239, 219, - 30, 197, 112, 237, 72, 233, 152, 236, 105, 237, 72, 233, 152, 251, 113, - 237, 72, 233, 152, 250, 187, 233, 152, 3, 219, 154, 217, 82, 218, 189, - 105, 197, 114, 241, 71, 218, 189, 105, 235, 112, 211, 87, 218, 189, 105, - 197, 114, 233, 187, 218, 189, 105, 234, 216, 218, 189, 105, 197, 142, - 233, 187, 218, 189, 105, 222, 220, 211, 87, 218, 189, 105, 197, 142, 241, - 71, 218, 189, 105, 241, 71, 218, 188, 217, 82, 218, 189, 3, 235, 232, - 235, 112, 211, 87, 218, 189, 3, 235, 232, 222, 220, 211, 87, 218, 189, 3, - 235, 232, 234, 216, 218, 189, 3, 235, 232, 204, 112, 3, 235, 232, 233, - 148, 205, 7, 206, 187, 205, 7, 202, 205, 58, 237, 208, 59, 204, 111, 59, - 204, 112, 3, 4, 244, 193, 59, 204, 112, 248, 235, 244, 193, 59, 204, 112, - 248, 235, 244, 194, 3, 210, 216, 244, 194, 3, 210, 216, 244, 194, 3, 205, - 206, 244, 194, 3, 222, 91, 244, 194, 3, 201, 235, 235, 49, 197, 51, 248, - 119, 235, 232, 231, 95, 239, 16, 203, 146, 247, 241, 245, 80, 208, 127, - 236, 99, 201, 190, 239, 244, 201, 190, 213, 206, 201, 190, 247, 166, 231, - 95, 213, 46, 201, 24, 245, 84, 248, 122, 209, 198, 232, 61, 204, 109, - 248, 122, 237, 76, 77, 220, 71, 237, 76, 77, 210, 60, 232, 95, 235, 6, - 222, 192, 244, 192, 220, 40, 222, 191, 235, 213, 222, 191, 222, 192, 235, - 56, 226, 86, 197, 50, 218, 89, 202, 15, 250, 148, 233, 107, 219, 172, - 197, 126, 203, 108, 222, 160, 249, 89, 212, 171, 210, 157, 251, 26, 233, - 90, 251, 26, 213, 84, 213, 88, 245, 85, 204, 209, 232, 217, 205, 240, 77, - 212, 151, 219, 199, 214, 119, 248, 103, 212, 63, 222, 171, 210, 61, 241, - 77, 210, 61, 249, 102, 241, 115, 210, 60, 241, 13, 26, 210, 60, 204, 246, - 248, 73, 205, 144, 248, 52, 234, 242, 234, 238, 209, 222, 204, 59, 212, - 65, 240, 84, 214, 165, 204, 78, 234, 239, 206, 157, 235, 111, 247, 160, - 3, 204, 51, 239, 187, 205, 186, 230, 201, 241, 75, 207, 7, 230, 200, 230, - 201, 241, 75, 237, 237, 241, 114, 245, 46, 154, 247, 131, 221, 243, 241, - 4, 231, 167, 212, 67, 206, 171, 248, 215, 248, 69, 212, 68, 77, 235, 38, - 241, 113, 235, 27, 26, 224, 20, 203, 57, 197, 37, 232, 186, 208, 248, - 248, 86, 26, 241, 26, 197, 47, 233, 156, 244, 177, 233, 156, 201, 145, - 237, 215, 248, 246, 218, 129, 244, 209, 248, 246, 218, 128, 249, 140, - 248, 85, 235, 27, 26, 224, 21, 3, 212, 138, 248, 86, 3, 212, 83, 241, - 102, 212, 85, 210, 62, 196, 254, 212, 25, 248, 152, 247, 159, 225, 210, - 245, 37, 201, 190, 235, 196, 245, 36, 235, 114, 235, 115, 205, 142, 249, - 100, 213, 128, 212, 84, 241, 151, 249, 102, 203, 112, 201, 190, 241, 58, - 235, 86, 212, 172, 239, 241, 225, 201, 239, 8, 247, 103, 204, 208, 197, - 51, 245, 62, 218, 189, 199, 21, 247, 22, 208, 167, 208, 197, 233, 113, - 247, 124, 232, 126, 3, 202, 68, 214, 119, 202, 218, 222, 183, 248, 79, - 77, 235, 60, 219, 32, 219, 195, 210, 129, 210, 62, 34, 224, 151, 3, 225, - 209, 204, 179, 219, 66, 222, 127, 205, 238, 241, 120, 224, 14, 249, 4, - 250, 197, 34, 216, 7, 249, 4, 239, 193, 34, 216, 7, 235, 130, 234, 248, - 251, 250, 202, 109, 247, 104, 231, 97, 235, 162, 197, 77, 209, 211, 244, - 179, 235, 106, 212, 101, 26, 235, 110, 219, 66, 218, 153, 247, 145, 244, - 252, 232, 132, 250, 206, 213, 210, 201, 243, 232, 164, 244, 238, 203, 15, - 202, 110, 244, 224, 248, 112, 213, 39, 250, 204, 199, 30, 234, 96, 239, - 85, 232, 30, 205, 231, 220, 115, 248, 165, 234, 97, 239, 131, 248, 72, - 235, 62, 212, 137, 247, 112, 34, 216, 12, 218, 119, 34, 216, 7, 208, 181, - 233, 58, 34, 224, 150, 201, 120, 199, 9, 34, 208, 159, 209, 114, 206, - 202, 3, 208, 200, 203, 20, 210, 235, 26, 249, 102, 206, 3, 26, 206, 3, - 248, 96, 249, 59, 26, 231, 160, 245, 86, 235, 92, 205, 205, 209, 115, - 204, 83, 205, 106, 219, 195, 201, 146, 231, 98, 210, 236, 251, 114, 235, - 35, 209, 128, 235, 35, 204, 54, 197, 94, 222, 96, 233, 133, 210, 237, - 218, 175, 210, 237, 247, 115, 241, 68, 249, 56, 26, 249, 102, 198, 238, - 235, 151, 231, 181, 204, 238, 26, 249, 102, 230, 201, 231, 181, 204, 238, - 26, 211, 218, 203, 153, 203, 20, 213, 229, 26, 249, 102, 205, 207, 247, - 120, 218, 168, 247, 143, 249, 7, 3, 200, 76, 248, 11, 241, 134, 231, 87, - 248, 9, 244, 232, 239, 197, 231, 87, 248, 10, 244, 222, 248, 10, 239, - 189, 239, 190, 225, 240, 217, 203, 213, 135, 205, 18, 231, 87, 248, 10, - 231, 87, 3, 234, 80, 214, 156, 248, 10, 225, 201, 212, 73, 214, 155, 236, - 104, 212, 73, 214, 155, 231, 96, 249, 83, 250, 137, 203, 29, 220, 115, - 231, 92, 221, 208, 231, 92, 241, 118, 204, 222, 208, 166, 239, 200, 204, - 222, 235, 221, 225, 221, 222, 232, 225, 201, 247, 93, 236, 104, 247, 93, - 59, 213, 58, 58, 213, 58, 197, 120, 59, 235, 92, 197, 120, 58, 235, 92, - 209, 197, 58, 209, 197, 223, 73, 249, 123, 210, 235, 26, 206, 134, 248, - 77, 26, 51, 251, 109, 236, 235, 73, 235, 101, 200, 199, 236, 235, 73, - 235, 101, 200, 196, 236, 235, 73, 235, 101, 200, 194, 236, 235, 73, 235, - 101, 200, 192, 236, 235, 73, 235, 101, 200, 190, 210, 197, 218, 165, 214, - 12, 197, 128, 248, 15, 241, 82, 202, 102, 222, 144, 210, 239, 247, 91, - 237, 222, 241, 66, 197, 80, 205, 214, 205, 212, 231, 97, 210, 209, 233, - 139, 206, 249, 218, 208, 209, 201, 245, 72, 239, 16, 212, 183, 248, 113, - 236, 254, 214, 168, 205, 121, 206, 244, 248, 14, 251, 68, 231, 166, 223, - 65, 248, 244, 235, 110, 201, 145, 235, 110, 248, 120, 201, 1, 232, 162, - 245, 73, 249, 140, 245, 73, 234, 232, 249, 140, 245, 73, 248, 155, 213, - 60, 224, 4, 212, 89, 237, 212, 247, 147, 249, 128, 247, 147, 239, 7, 218, - 166, 235, 232, 241, 83, 235, 232, 202, 103, 235, 232, 210, 240, 235, 232, - 247, 92, 235, 232, 237, 223, 235, 232, 205, 104, 197, 80, 231, 98, 235, - 232, 218, 209, 235, 232, 239, 17, 235, 232, 212, 184, 235, 232, 234, 236, - 235, 232, 232, 214, 235, 232, 197, 24, 235, 232, 249, 2, 235, 232, 213, - 186, 235, 232, 212, 184, 216, 19, 213, 104, 212, 11, 245, 57, 236, 58, - 236, 66, 237, 75, 216, 19, 218, 163, 201, 249, 59, 124, 212, 106, 249, - 135, 226, 71, 59, 135, 212, 106, 249, 135, 226, 71, 59, 50, 212, 106, - 249, 135, 226, 71, 59, 53, 212, 106, 249, 135, 226, 71, 235, 104, 232, - 209, 55, 197, 120, 232, 209, 55, 214, 139, 232, 209, 55, 202, 140, 124, - 55, 202, 140, 135, 55, 244, 223, 232, 184, 55, 192, 232, 184, 55, 241, - 52, 197, 20, 232, 164, 236, 61, 217, 107, 203, 214, 225, 191, 237, 217, - 224, 76, 248, 168, 197, 20, 244, 195, 211, 198, 232, 188, 212, 64, 220, - 49, 206, 194, 250, 163, 206, 194, 232, 46, 206, 194, 197, 20, 208, 216, - 197, 20, 248, 95, 235, 33, 247, 233, 226, 86, 206, 78, 247, 232, 226, 86, - 206, 78, 248, 67, 233, 168, 220, 61, 197, 21, 235, 210, 220, 62, 26, 197, - 22, 231, 175, 232, 183, 99, 219, 164, 231, 175, 232, 183, 99, 197, 19, - 231, 175, 232, 183, 212, 98, 214, 154, 197, 22, 3, 247, 251, 237, 73, - 248, 40, 3, 199, 109, 213, 28, 3, 248, 124, 232, 232, 220, 62, 3, 233, - 72, 212, 220, 220, 44, 220, 62, 3, 201, 9, 214, 131, 220, 61, 214, 131, - 197, 21, 249, 139, 241, 135, 197, 5, 212, 16, 225, 201, 214, 149, 225, - 201, 233, 138, 233, 199, 249, 140, 251, 94, 236, 71, 251, 153, 251, 154, - 218, 198, 226, 91, 205, 254, 226, 60, 239, 186, 213, 27, 233, 66, 240, - 89, 222, 57, 217, 228, 212, 97, 235, 233, 220, 6, 232, 231, 249, 77, 212, - 100, 203, 235, 212, 176, 224, 57, 78, 221, 208, 222, 134, 210, 2, 234, - 37, 204, 228, 224, 56, 248, 78, 241, 86, 3, 232, 125, 197, 101, 248, 254, - 232, 125, 248, 32, 232, 125, 99, 232, 123, 205, 140, 232, 125, 233, 82, - 232, 125, 232, 126, 3, 51, 248, 118, 232, 125, 233, 90, 232, 125, 196, - 62, 232, 125, 211, 199, 232, 125, 232, 126, 3, 210, 62, 210, 83, 232, - 123, 232, 126, 239, 241, 239, 140, 207, 21, 3, 39, 76, 226, 40, 237, 1, - 175, 248, 7, 251, 93, 105, 248, 104, 205, 243, 105, 244, 169, 105, 205, - 115, 204, 61, 105, 237, 208, 240, 65, 105, 212, 177, 77, 212, 90, 235, - 74, 248, 180, 239, 48, 105, 205, 132, 249, 100, 202, 160, 249, 100, 59, - 235, 61, 231, 57, 212, 104, 105, 218, 213, 249, 121, 241, 16, 236, 91, - 85, 239, 9, 55, 241, 73, 247, 113, 249, 82, 3, 196, 60, 55, 249, 82, 3, - 239, 9, 55, 249, 82, 3, 236, 107, 55, 249, 82, 3, 212, 62, 55, 218, 213, - 3, 197, 45, 245, 110, 3, 200, 24, 201, 186, 26, 196, 60, 55, 208, 139, - 213, 26, 241, 156, 248, 38, 219, 20, 235, 66, 239, 72, 214, 75, 239, 77, - 237, 168, 235, 137, 235, 46, 192, 235, 137, 235, 46, 213, 227, 3, 241, - 20, 213, 227, 235, 225, 200, 36, 247, 153, 203, 56, 247, 153, 247, 114, - 226, 71, 245, 110, 3, 200, 24, 201, 185, 245, 110, 3, 237, 230, 201, 185, - 249, 79, 245, 109, 244, 208, 211, 194, 209, 187, 211, 194, 213, 159, 204, - 218, 209, 122, 201, 177, 209, 122, 248, 100, 203, 151, 222, 188, 216, 10, - 216, 11, 3, 239, 240, 241, 85, 244, 202, 248, 101, 192, 248, 101, 233, - 90, 248, 101, 248, 118, 248, 101, 214, 70, 248, 101, 248, 98, 217, 222, - 249, 125, 208, 152, 219, 165, 203, 34, 210, 171, 213, 225, 235, 193, 220, - 115, 208, 196, 251, 65, 211, 219, 252, 2, 221, 210, 245, 94, 219, 177, - 214, 32, 201, 194, 226, 82, 201, 194, 213, 234, 237, 128, 105, 226, 79, - 236, 193, 236, 194, 3, 237, 230, 61, 57, 244, 202, 220, 77, 3, 221, 200, - 235, 92, 244, 202, 220, 77, 3, 210, 214, 235, 92, 192, 220, 77, 3, 210, - 214, 235, 92, 192, 220, 77, 3, 221, 200, 235, 92, 212, 70, 212, 71, 231, - 101, 217, 77, 218, 242, 212, 228, 218, 242, 212, 229, 3, 91, 61, 250, - 168, 222, 183, 199, 33, 218, 241, 218, 242, 212, 229, 214, 157, 216, 50, - 218, 242, 212, 227, 251, 66, 3, 249, 67, 247, 145, 247, 146, 3, 235, 83, - 199, 30, 247, 145, 203, 31, 210, 230, 199, 29, 235, 130, 211, 253, 212, - 80, 204, 240, 212, 39, 249, 6, 200, 219, 91, 250, 213, 244, 204, 91, 26, - 107, 192, 244, 249, 250, 213, 244, 204, 91, 26, 107, 192, 244, 249, 250, - 214, 3, 46, 97, 214, 19, 244, 204, 237, 230, 26, 200, 24, 192, 244, 249, - 250, 213, 251, 64, 237, 230, 26, 200, 24, 192, 244, 249, 250, 213, 126, - 248, 36, 105, 130, 248, 36, 105, 205, 137, 3, 247, 138, 106, 205, 136, - 205, 137, 3, 97, 205, 162, 197, 122, 205, 137, 3, 115, 205, 162, 197, - 121, 249, 49, 237, 1, 212, 129, 222, 178, 220, 89, 233, 156, 210, 17, - 220, 89, 233, 156, 221, 254, 3, 226, 52, 213, 64, 244, 202, 221, 254, 3, - 224, 152, 224, 152, 221, 253, 192, 221, 253, 248, 228, 248, 229, 3, 247, - 138, 106, 248, 99, 222, 65, 105, 210, 231, 247, 226, 249, 138, 3, 107, - 61, 57, 236, 221, 3, 107, 61, 57, 214, 119, 3, 236, 89, 117, 3, 50, 53, - 61, 57, 205, 170, 3, 91, 61, 57, 201, 243, 3, 200, 24, 61, 57, 216, 50, - 97, 200, 64, 237, 28, 105, 224, 149, 203, 23, 226, 46, 16, 36, 8, 6, 222, - 133, 226, 46, 16, 36, 8, 4, 222, 133, 226, 46, 16, 36, 215, 142, 226, 46, - 16, 36, 203, 249, 226, 46, 16, 36, 8, 222, 133, 235, 117, 237, 1, 201, - 238, 196, 252, 232, 215, 215, 125, 26, 248, 106, 231, 182, 212, 157, 219, - 65, 203, 32, 241, 42, 249, 102, 206, 29, 212, 108, 205, 8, 3, 112, 238, - 252, 225, 201, 16, 36, 248, 241, 201, 175, 236, 237, 58, 47, 247, 226, - 59, 47, 247, 226, 222, 227, 210, 157, 244, 248, 222, 227, 248, 118, 244, - 248, 222, 227, 214, 70, 239, 139, 222, 227, 248, 118, 239, 139, 4, 214, - 70, 239, 139, 4, 248, 118, 239, 139, 200, 35, 210, 157, 201, 180, 237, - 233, 210, 157, 201, 180, 200, 35, 4, 210, 157, 201, 180, 237, 233, 4, - 210, 157, 201, 180, 221, 202, 53, 207, 37, 59, 244, 248, 200, 33, 53, - 207, 37, 59, 244, 248, 46, 241, 61, 212, 94, 241, 61, 212, 95, 3, 232, - 221, 60, 241, 61, 212, 94, 216, 14, 50, 207, 108, 3, 115, 238, 249, 216, - 14, 53, 207, 108, 3, 115, 238, 249, 16, 36, 220, 22, 247, 0, 59, 8, 241, - 60, 85, 8, 241, 60, 247, 40, 241, 60, 214, 127, 105, 237, 236, 77, 213, - 89, 225, 52, 218, 181, 203, 243, 219, 160, 3, 216, 178, 248, 55, 248, 74, - 77, 231, 8, 244, 206, 235, 233, 97, 214, 174, 244, 206, 235, 233, 99, - 214, 174, 244, 206, 235, 233, 115, 214, 174, 244, 206, 235, 233, 235, 6, - 214, 174, 244, 206, 235, 233, 235, 100, 214, 174, 244, 206, 235, 233, - 206, 29, 214, 174, 244, 206, 235, 233, 207, 71, 214, 174, 244, 206, 235, - 233, 237, 30, 214, 174, 244, 206, 235, 233, 216, 178, 214, 174, 244, 206, - 235, 233, 203, 24, 214, 174, 244, 206, 235, 233, 236, 252, 214, 174, 244, - 206, 235, 233, 200, 240, 214, 174, 244, 206, 235, 233, 214, 111, 244, - 206, 235, 233, 200, 213, 244, 206, 235, 233, 202, 146, 244, 206, 235, - 233, 235, 2, 244, 206, 235, 233, 235, 98, 244, 206, 235, 233, 206, 25, - 244, 206, 235, 233, 207, 70, 244, 206, 235, 233, 237, 29, 244, 206, 235, - 233, 216, 177, 244, 206, 235, 233, 203, 22, 244, 206, 235, 233, 236, 250, - 244, 206, 235, 233, 200, 238, 53, 205, 136, 53, 205, 137, 3, 97, 205, - 162, 197, 122, 53, 205, 137, 3, 115, 205, 162, 197, 121, 248, 2, 248, 3, - 3, 205, 162, 197, 121, 210, 0, 248, 228, 248, 101, 247, 136, 220, 46, - 244, 205, 58, 205, 255, 26, 241, 59, 216, 50, 212, 163, 231, 174, 220, - 62, 226, 86, 247, 235, 204, 125, 222, 126, 205, 241, 214, 72, 205, 95, - 240, 70, 204, 107, 205, 124, 205, 125, 197, 102, 225, 110, 220, 62, 240, - 88, 50, 232, 209, 203, 34, 210, 171, 203, 34, 210, 172, 3, 213, 226, 53, - 232, 209, 203, 34, 210, 171, 59, 201, 224, 203, 33, 58, 201, 224, 203, - 33, 203, 34, 214, 119, 201, 243, 77, 218, 238, 244, 227, 218, 242, 212, - 228, 249, 138, 77, 236, 193, 205, 14, 236, 193, 236, 194, 3, 222, 91, - 235, 53, 236, 193, 213, 65, 127, 205, 14, 236, 193, 222, 64, 213, 158, - 58, 211, 194, 221, 202, 50, 213, 63, 221, 202, 50, 249, 96, 213, 64, 221, - 202, 50, 235, 8, 213, 64, 221, 202, 50, 213, 219, 221, 202, 50, 241, 76, - 50, 196, 246, 232, 208, 163, 214, 139, 232, 209, 55, 210, 214, 232, 209, - 3, 235, 122, 205, 114, 210, 89, 210, 214, 232, 209, 3, 235, 122, 205, - 114, 210, 89, 202, 140, 124, 55, 210, 89, 202, 140, 135, 55, 210, 89, - 199, 32, 232, 208, 210, 89, 232, 209, 3, 112, 235, 127, 236, 77, 210, - 214, 232, 209, 3, 213, 133, 248, 203, 112, 26, 210, 3, 235, 121, 59, 135, - 212, 106, 50, 232, 209, 226, 71, 206, 96, 59, 50, 212, 106, 226, 71, 206, - 96, 59, 53, 212, 106, 226, 71, 206, 96, 58, 50, 212, 106, 226, 71, 206, - 96, 58, 53, 212, 106, 226, 71, 58, 50, 212, 106, 249, 135, 226, 71, 58, - 53, 212, 106, 249, 135, 226, 71, 206, 96, 59, 124, 212, 106, 226, 71, - 206, 96, 59, 135, 212, 106, 226, 71, 206, 96, 58, 124, 212, 106, 226, 71, - 206, 96, 58, 135, 212, 106, 226, 71, 58, 124, 212, 106, 249, 135, 226, - 71, 58, 135, 212, 106, 249, 135, 226, 71, 58, 232, 125, 239, 185, 241, - 156, 224, 151, 26, 218, 165, 115, 217, 86, 241, 155, 212, 12, 212, 114, - 247, 155, 58, 232, 172, 206, 245, 235, 66, 239, 72, 59, 232, 172, 206, - 245, 235, 66, 239, 72, 205, 186, 206, 245, 235, 66, 239, 72, 203, 104, - 247, 97, 197, 40, 224, 150, 97, 247, 227, 218, 165, 99, 247, 227, 218, - 165, 115, 247, 227, 218, 165, 201, 215, 37, 213, 26, 241, 156, 232, 172, - 239, 72, 208, 154, 212, 13, 230, 194, 235, 193, 230, 194, 214, 75, 239, - 78, 230, 194, 239, 21, 3, 202, 237, 239, 21, 3, 202, 238, 26, 212, 213, - 239, 21, 3, 212, 213, 234, 250, 3, 212, 213, 234, 250, 3, 202, 82, 234, - 250, 3, 251, 106, 196, 222, 58, 235, 46, 235, 46, 192, 235, 46, 247, 114, - 132, 239, 57, 247, 114, 235, 137, 248, 69, 235, 137, 247, 168, 236, 231, - 216, 12, 236, 231, 216, 13, 213, 226, 236, 231, 216, 13, 213, 232, 216, - 12, 216, 13, 213, 226, 216, 13, 213, 232, 236, 231, 239, 20, 236, 231, - 213, 226, 236, 231, 213, 224, 239, 20, 213, 226, 213, 224, 197, 132, 205, - 121, 216, 13, 213, 232, 205, 121, 247, 154, 213, 232, 239, 185, 197, 49, - 219, 17, 219, 251, 214, 22, 244, 204, 53, 26, 50, 207, 108, 250, 213, - 247, 138, 196, 222, 226, 77, 235, 40, 206, 9, 105, 239, 239, 235, 40, - 206, 9, 105, 241, 157, 37, 224, 152, 209, 212, 217, 77, 213, 227, 3, 46, - 202, 237, 204, 230, 245, 109, 240, 118, 224, 20, 222, 58, 205, 135, 232, - 137, 226, 86, 206, 78, 115, 210, 188, 57, 115, 210, 188, 60, 115, 210, - 188, 222, 183, 115, 210, 188, 210, 22, 50, 205, 132, 248, 19, 53, 205, - 132, 248, 19, 99, 205, 132, 248, 18, 115, 205, 132, 248, 18, 50, 202, - 160, 248, 19, 53, 202, 160, 248, 19, 50, 251, 93, 248, 19, 53, 251, 93, - 248, 19, 218, 193, 248, 19, 222, 92, 218, 193, 248, 19, 222, 92, 218, - 192, 249, 98, 111, 3, 249, 97, 249, 98, 145, 196, 222, 249, 98, 111, 3, - 145, 196, 222, 249, 98, 27, 145, 196, 222, 249, 98, 111, 3, 27, 145, 196, - 222, 175, 245, 101, 78, 249, 98, 111, 3, 27, 245, 100, 197, 4, 220, 42, - 218, 170, 234, 217, 202, 17, 201, 220, 204, 253, 77, 222, 106, 206, 79, - 77, 225, 202, 218, 151, 233, 86, 235, 232, 233, 86, 235, 233, 3, 205, - 218, 236, 58, 235, 233, 3, 203, 52, 77, 225, 112, 205, 218, 235, 233, 3, - 192, 218, 163, 205, 218, 235, 233, 3, 192, 218, 164, 26, 205, 218, 236, - 58, 205, 218, 235, 233, 3, 192, 218, 164, 26, 244, 171, 204, 60, 205, - 218, 235, 233, 3, 192, 218, 164, 26, 202, 100, 236, 58, 205, 218, 235, - 233, 3, 232, 220, 205, 218, 235, 233, 3, 231, 100, 197, 42, 235, 232, - 205, 218, 235, 233, 3, 205, 218, 236, 58, 235, 233, 208, 186, 239, 219, - 235, 38, 210, 132, 235, 232, 205, 218, 235, 233, 3, 232, 124, 236, 58, - 205, 218, 235, 233, 3, 204, 107, 205, 217, 235, 232, 217, 84, 235, 232, - 236, 79, 235, 232, 200, 70, 235, 232, 235, 233, 3, 244, 171, 204, 60, - 213, 56, 235, 232, 241, 148, 235, 232, 241, 149, 235, 232, 224, 55, 235, - 232, 235, 233, 202, 143, 39, 224, 56, 224, 55, 235, 233, 3, 205, 218, - 236, 58, 224, 55, 235, 233, 3, 244, 202, 236, 58, 235, 233, 3, 204, 180, - 201, 249, 235, 233, 3, 204, 180, 201, 250, 26, 197, 42, 236, 66, 235, - 233, 3, 204, 180, 201, 250, 26, 202, 100, 236, 58, 239, 79, 235, 232, - 197, 3, 235, 232, 251, 85, 235, 232, 212, 61, 235, 232, 241, 44, 235, - 232, 213, 30, 235, 232, 235, 233, 3, 221, 227, 77, 201, 157, 239, 79, - 247, 231, 210, 132, 235, 232, 234, 228, 235, 233, 3, 192, 218, 163, 251, - 83, 235, 232, 235, 186, 235, 232, 197, 103, 235, 232, 205, 242, 235, 232, - 202, 62, 235, 232, 233, 87, 235, 232, 221, 211, 241, 44, 235, 232, 235, - 233, 3, 192, 218, 163, 231, 46, 235, 232, 235, 233, 3, 192, 218, 164, 26, - 244, 171, 204, 60, 235, 233, 208, 156, 226, 86, 235, 187, 250, 175, 235, - 232, 235, 58, 235, 232, 205, 243, 235, 232, 239, 48, 235, 232, 235, 233, - 197, 37, 218, 163, 235, 233, 3, 219, 192, 220, 8, 233, 86, 247, 92, 235, - 233, 3, 205, 218, 236, 58, 247, 92, 235, 233, 3, 203, 52, 77, 225, 112, - 205, 218, 247, 92, 235, 233, 3, 192, 218, 163, 205, 218, 247, 92, 235, - 233, 3, 232, 124, 236, 58, 247, 92, 235, 233, 3, 196, 244, 205, 219, 224, - 55, 247, 92, 235, 233, 3, 244, 202, 236, 58, 212, 61, 247, 92, 235, 232, - 241, 44, 247, 92, 235, 232, 197, 103, 247, 92, 235, 232, 205, 236, 234, - 228, 235, 232, 205, 236, 205, 218, 235, 232, 200, 30, 235, 232, 235, 233, - 3, 209, 210, 236, 58, 235, 233, 3, 216, 50, 233, 130, 234, 14, 235, 233, - 3, 214, 139, 234, 14, 213, 28, 248, 75, 239, 234, 208, 128, 218, 208, - 232, 128, 218, 208, 205, 138, 218, 208, 232, 175, 213, 28, 210, 212, 97, - 232, 208, 213, 28, 210, 212, 248, 87, 232, 184, 226, 86, 247, 42, 213, - 28, 234, 227, 213, 28, 3, 212, 61, 235, 232, 213, 28, 3, 235, 47, 232, - 183, 173, 197, 89, 212, 106, 222, 191, 205, 159, 197, 89, 212, 106, 222, - 191, 173, 237, 68, 212, 106, 222, 191, 205, 159, 237, 68, 212, 106, 222, - 191, 163, 173, 197, 89, 212, 106, 222, 191, 163, 205, 159, 197, 89, 212, - 106, 222, 191, 163, 173, 237, 68, 212, 106, 222, 191, 163, 205, 159, 237, - 68, 212, 106, 222, 191, 173, 197, 89, 212, 106, 199, 15, 222, 191, 205, - 159, 197, 89, 212, 106, 199, 15, 222, 191, 173, 237, 68, 212, 106, 199, - 15, 222, 191, 205, 159, 237, 68, 212, 106, 199, 15, 222, 191, 85, 173, - 197, 89, 212, 106, 199, 15, 222, 191, 85, 205, 159, 197, 89, 212, 106, - 199, 15, 222, 191, 85, 173, 237, 68, 212, 106, 199, 15, 222, 191, 85, - 205, 159, 237, 68, 212, 106, 199, 15, 222, 191, 173, 197, 89, 212, 106, - 248, 16, 205, 159, 197, 89, 212, 106, 248, 16, 173, 237, 68, 212, 106, - 248, 16, 205, 159, 237, 68, 212, 106, 248, 16, 85, 173, 197, 89, 212, - 106, 248, 16, 85, 205, 159, 197, 89, 212, 106, 248, 16, 85, 173, 237, 68, - 212, 106, 248, 16, 85, 205, 159, 237, 68, 212, 106, 248, 16, 231, 173, - 211, 71, 47, 214, 58, 231, 173, 211, 71, 47, 214, 59, 226, 86, 58, 205, - 94, 205, 179, 211, 71, 47, 214, 58, 205, 179, 211, 71, 47, 214, 59, 226, - 86, 58, 205, 94, 107, 209, 217, 200, 24, 209, 217, 91, 209, 217, 237, - 230, 209, 217, 145, 33, 236, 128, 214, 58, 85, 145, 33, 236, 128, 214, - 58, 33, 192, 236, 128, 214, 58, 85, 33, 192, 236, 128, 214, 58, 85, 251, - 111, 214, 58, 204, 63, 251, 111, 214, 58, 45, 85, 52, 163, 244, 159, 211, - 61, 117, 214, 58, 45, 85, 52, 244, 159, 211, 61, 117, 214, 58, 45, 85, - 126, 52, 244, 159, 211, 61, 117, 214, 58, 85, 226, 26, 214, 58, 45, 226, - 26, 214, 58, 85, 45, 226, 26, 214, 58, 199, 48, 85, 205, 177, 199, 48, - 85, 210, 90, 205, 177, 245, 99, 248, 112, 210, 90, 245, 99, 248, 112, - 209, 217, 232, 107, 204, 248, 221, 251, 210, 219, 247, 115, 232, 43, 201, - 207, 232, 43, 201, 208, 3, 248, 5, 216, 19, 201, 207, 219, 135, 175, 210, - 220, 204, 254, 201, 205, 201, 206, 247, 115, 247, 236, 214, 115, 247, - 236, 201, 153, 247, 237, 204, 226, 219, 21, 251, 115, 235, 118, 236, 213, - 212, 98, 247, 115, 214, 115, 212, 98, 247, 115, 203, 78, 214, 115, 203, - 78, 250, 136, 214, 115, 250, 136, 210, 164, 199, 110, 239, 215, 201, 144, - 250, 207, 221, 218, 201, 214, 218, 201, 218, 169, 210, 218, 204, 77, 210, - 218, 218, 169, 247, 167, 251, 230, 201, 204, 206, 207, 209, 184, 205, - 130, 231, 154, 201, 211, 222, 94, 83, 201, 211, 222, 94, 241, 135, 55, - 212, 98, 247, 99, 210, 83, 222, 94, 201, 177, 235, 93, 214, 119, 212, 72, - 239, 0, 216, 50, 236, 199, 55, 205, 216, 105, 216, 50, 205, 216, 105, - 211, 193, 222, 47, 226, 86, 225, 230, 212, 148, 105, 239, 28, 216, 18, - 222, 47, 105, 212, 66, 197, 128, 105, 216, 34, 197, 128, 105, 248, 179, - 216, 50, 248, 178, 248, 177, 218, 169, 248, 177, 213, 80, 216, 50, 213, - 79, 245, 64, 241, 53, 219, 159, 105, 197, 18, 105, 210, 99, 249, 140, - 105, 202, 18, 197, 128, 244, 199, 206, 162, 249, 52, 249, 50, 213, 117, - 241, 119, 241, 2, 249, 117, 244, 228, 50, 221, 180, 201, 181, 3, 209, - 185, 241, 99, 212, 0, 55, 46, 226, 60, 205, 160, 248, 66, 105, 233, 167, - 105, 241, 91, 26, 222, 238, 205, 243, 252, 18, 206, 185, 249, 116, 248, - 227, 248, 228, 248, 251, 212, 148, 77, 197, 2, 214, 171, 55, 206, 185, - 201, 154, 204, 176, 213, 223, 232, 39, 203, 26, 232, 216, 26, 196, 252, - 206, 220, 214, 144, 237, 205, 218, 173, 210, 219, 201, 216, 218, 176, - 248, 111, 200, 35, 219, 32, 251, 186, 200, 35, 251, 186, 200, 35, 4, 251, - 186, 4, 251, 186, 216, 23, 251, 186, 251, 187, 239, 199, 251, 187, 250, - 219, 208, 195, 214, 115, 235, 118, 236, 213, 239, 129, 221, 251, 213, - 121, 206, 207, 208, 160, 218, 176, 208, 160, 247, 126, 205, 245, 235, 53, - 208, 190, 206, 5, 250, 138, 210, 58, 150, 16, 36, 211, 67, 150, 16, 36, - 251, 188, 150, 16, 36, 235, 117, 150, 16, 36, 237, 71, 150, 16, 36, 197, - 127, 150, 16, 36, 251, 15, 150, 16, 36, 251, 16, 210, 151, 150, 16, 36, - 251, 16, 210, 150, 150, 16, 36, 251, 16, 198, 254, 150, 16, 36, 251, 16, + 158, 103, 231, 44, 103, 218, 79, 103, 208, 149, 103, 205, 83, 103, 212, + 52, 103, 197, 110, 217, 104, 46, 8, 6, 1, 63, 217, 104, 46, 8, 6, 1, 250, + 112, 217, 104, 46, 8, 6, 1, 247, 207, 217, 104, 46, 8, 6, 1, 240, 231, + 217, 104, 46, 8, 6, 1, 69, 217, 104, 46, 8, 6, 1, 236, 49, 217, 104, 46, + 8, 6, 1, 234, 190, 217, 104, 46, 8, 6, 1, 233, 15, 217, 104, 46, 8, 6, 1, + 68, 217, 104, 46, 8, 6, 1, 225, 217, 217, 104, 46, 8, 6, 1, 225, 80, 217, + 104, 46, 8, 6, 1, 159, 217, 104, 46, 8, 6, 1, 221, 136, 217, 104, 46, 8, + 6, 1, 218, 55, 217, 104, 46, 8, 6, 1, 72, 217, 104, 46, 8, 6, 1, 214, 3, + 217, 104, 46, 8, 6, 1, 211, 167, 217, 104, 46, 8, 6, 1, 144, 217, 104, + 46, 8, 6, 1, 209, 80, 217, 104, 46, 8, 6, 1, 203, 216, 217, 104, 46, 8, + 6, 1, 66, 217, 104, 46, 8, 6, 1, 199, 230, 217, 104, 46, 8, 6, 1, 197, + 199, 217, 104, 46, 8, 6, 1, 196, 222, 217, 104, 46, 8, 6, 1, 196, 148, + 217, 104, 46, 8, 6, 1, 195, 158, 210, 215, 219, 213, 55, 210, 215, 219, + 210, 55, 210, 215, 218, 150, 55, 217, 104, 103, 8, 6, 1, 63, 217, 104, + 103, 8, 6, 1, 250, 112, 217, 104, 103, 8, 6, 1, 247, 207, 217, 104, 103, + 8, 6, 1, 240, 231, 217, 104, 103, 8, 6, 1, 69, 217, 104, 103, 8, 6, 1, + 236, 49, 217, 104, 103, 8, 6, 1, 234, 190, 217, 104, 103, 8, 6, 1, 233, + 15, 217, 104, 103, 8, 6, 1, 68, 217, 104, 103, 8, 6, 1, 225, 217, 217, + 104, 103, 8, 6, 1, 225, 80, 217, 104, 103, 8, 6, 1, 159, 217, 104, 103, + 8, 6, 1, 221, 136, 217, 104, 103, 8, 6, 1, 218, 55, 217, 104, 103, 8, 6, + 1, 72, 217, 104, 103, 8, 6, 1, 214, 3, 217, 104, 103, 8, 6, 1, 211, 167, + 217, 104, 103, 8, 6, 1, 144, 217, 104, 103, 8, 6, 1, 209, 80, 217, 104, + 103, 8, 6, 1, 203, 216, 217, 104, 103, 8, 6, 1, 66, 217, 104, 103, 8, 6, + 1, 199, 230, 217, 104, 103, 8, 6, 1, 197, 199, 217, 104, 103, 8, 6, 1, + 196, 222, 217, 104, 103, 8, 6, 1, 196, 148, 217, 104, 103, 8, 6, 1, 195, + 158, 241, 59, 217, 104, 103, 8, 6, 1, 214, 3, 217, 104, 103, 230, 203, + 217, 104, 103, 161, 217, 104, 103, 183, 217, 104, 103, 252, 117, 217, + 104, 103, 197, 110, 47, 239, 48, 103, 244, 230, 103, 241, 113, 103, 234, + 245, 103, 230, 194, 103, 217, 82, 103, 217, 73, 103, 214, 139, 103, 205, + 166, 103, 124, 3, 236, 90, 78, 103, 198, 223, 103, 115, 240, 231, 103, + 208, 136, 208, 154, 103, 99, 225, 80, 103, 235, 7, 225, 80, 103, 237, 31, + 225, 80, 103, 235, 101, 212, 111, 100, 103, 207, 71, 212, 111, 100, 103, + 200, 223, 212, 111, 102, 103, 206, 14, 214, 3, 103, 97, 231, 58, 200, + 235, 214, 3, 103, 8, 4, 1, 240, 231, 103, 232, 150, 103, 232, 149, 103, + 232, 63, 103, 221, 217, 103, 206, 131, 103, 200, 91, 103, 198, 245, 210, + 150, 226, 69, 16, 1, 63, 210, 150, 226, 69, 16, 1, 250, 112, 210, 150, + 226, 69, 16, 1, 247, 207, 210, 150, 226, 69, 16, 1, 240, 231, 210, 150, + 226, 69, 16, 1, 69, 210, 150, 226, 69, 16, 1, 236, 49, 210, 150, 226, 69, + 16, 1, 234, 190, 210, 150, 226, 69, 16, 1, 233, 15, 210, 150, 226, 69, + 16, 1, 68, 210, 150, 226, 69, 16, 1, 225, 217, 210, 150, 226, 69, 16, 1, + 225, 80, 210, 150, 226, 69, 16, 1, 159, 210, 150, 226, 69, 16, 1, 221, + 136, 210, 150, 226, 69, 16, 1, 218, 55, 210, 150, 226, 69, 16, 1, 72, + 210, 150, 226, 69, 16, 1, 214, 3, 210, 150, 226, 69, 16, 1, 211, 167, + 210, 150, 226, 69, 16, 1, 144, 210, 150, 226, 69, 16, 1, 209, 80, 210, + 150, 226, 69, 16, 1, 203, 216, 210, 150, 226, 69, 16, 1, 66, 210, 150, + 226, 69, 16, 1, 199, 230, 210, 150, 226, 69, 16, 1, 197, 199, 210, 150, + 226, 69, 16, 1, 196, 222, 210, 150, 226, 69, 16, 1, 196, 148, 210, 150, + 226, 69, 16, 1, 195, 158, 47, 188, 231, 179, 103, 71, 223, 250, 103, 71, + 183, 103, 12, 200, 54, 228, 138, 103, 12, 200, 54, 228, 142, 103, 12, + 200, 54, 228, 150, 103, 71, 239, 252, 103, 12, 200, 54, 228, 157, 103, + 12, 200, 54, 228, 144, 103, 12, 200, 54, 228, 116, 103, 12, 200, 54, 228, + 143, 103, 12, 200, 54, 228, 156, 103, 12, 200, 54, 228, 130, 103, 12, + 200, 54, 228, 123, 103, 12, 200, 54, 228, 132, 103, 12, 200, 54, 228, + 153, 103, 12, 200, 54, 228, 139, 103, 12, 200, 54, 228, 155, 103, 12, + 200, 54, 228, 131, 103, 12, 200, 54, 228, 154, 103, 12, 200, 54, 228, + 117, 103, 12, 200, 54, 228, 122, 103, 12, 200, 54, 228, 115, 103, 12, + 200, 54, 228, 145, 103, 12, 200, 54, 228, 147, 103, 12, 200, 54, 228, + 125, 103, 12, 200, 54, 228, 136, 103, 12, 200, 54, 228, 134, 103, 12, + 200, 54, 228, 160, 103, 12, 200, 54, 228, 159, 103, 12, 200, 54, 228, + 113, 103, 12, 200, 54, 228, 140, 103, 12, 200, 54, 228, 158, 103, 12, + 200, 54, 228, 149, 103, 12, 200, 54, 228, 135, 103, 12, 200, 54, 228, + 114, 103, 12, 200, 54, 228, 137, 103, 12, 200, 54, 228, 119, 103, 12, + 200, 54, 228, 118, 103, 12, 200, 54, 228, 148, 103, 12, 200, 54, 228, + 126, 103, 12, 200, 54, 228, 128, 103, 12, 200, 54, 228, 129, 103, 12, + 200, 54, 228, 121, 103, 12, 200, 54, 228, 152, 103, 12, 200, 54, 228, + 146, 103, 12, 200, 54, 228, 112, 201, 231, 206, 245, 248, 61, 12, 200, + 54, 228, 127, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, 159, 201, + 231, 206, 245, 248, 61, 12, 200, 54, 228, 157, 201, 231, 206, 245, 248, + 61, 12, 200, 54, 228, 141, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, + 124, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, 137, 201, 231, 206, + 245, 248, 61, 12, 200, 54, 228, 120, 201, 231, 206, 245, 248, 61, 12, + 200, 54, 228, 151, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, 133, + 46, 230, 191, 251, 247, 46, 230, 191, 252, 20, 209, 185, 16, 36, 234, + 223, 209, 185, 16, 36, 221, 191, 209, 185, 16, 36, 206, 165, 209, 185, + 16, 36, 196, 196, 209, 185, 16, 36, 206, 148, 209, 185, 16, 36, 247, 162, + 240, 242, 235, 49, 244, 203, 200, 76, 216, 195, 3, 205, 4, 204, 106, 127, + 218, 168, 204, 105, 244, 234, 250, 169, 237, 174, 204, 104, 127, 248, 10, + 210, 216, 248, 40, 250, 169, 216, 194, 197, 128, 197, 122, 198, 239, 219, + 31, 197, 112, 237, 73, 233, 153, 236, 106, 237, 73, 233, 153, 251, 114, + 237, 73, 233, 153, 250, 188, 233, 153, 3, 219, 155, 217, 83, 218, 190, + 105, 197, 114, 241, 72, 218, 190, 105, 235, 113, 211, 88, 218, 190, 105, + 197, 114, 233, 188, 218, 190, 105, 234, 217, 218, 190, 105, 197, 142, + 233, 188, 218, 190, 105, 222, 221, 211, 88, 218, 190, 105, 197, 142, 241, + 72, 218, 190, 105, 241, 72, 218, 189, 217, 83, 218, 190, 3, 235, 233, + 235, 113, 211, 88, 218, 190, 3, 235, 233, 222, 221, 211, 88, 218, 190, 3, + 235, 233, 234, 217, 218, 190, 3, 235, 233, 204, 112, 3, 235, 233, 233, + 149, 205, 7, 206, 187, 205, 7, 202, 205, 58, 237, 209, 59, 204, 111, 59, + 204, 112, 3, 4, 244, 194, 59, 204, 112, 248, 236, 244, 194, 59, 204, 112, + 248, 236, 244, 195, 3, 210, 217, 244, 195, 3, 210, 217, 244, 195, 3, 205, + 206, 244, 195, 3, 222, 92, 244, 195, 3, 201, 235, 235, 50, 197, 51, 248, + 120, 235, 233, 231, 96, 239, 17, 203, 146, 247, 242, 245, 81, 208, 127, + 236, 100, 201, 190, 239, 245, 201, 190, 213, 207, 201, 190, 247, 167, + 231, 96, 213, 47, 201, 24, 245, 85, 248, 123, 209, 198, 232, 62, 204, + 109, 248, 123, 237, 77, 77, 220, 72, 237, 77, 77, 210, 60, 232, 96, 235, + 7, 222, 193, 244, 193, 220, 41, 222, 192, 235, 214, 222, 192, 222, 193, + 235, 57, 226, 87, 197, 50, 218, 90, 202, 15, 250, 149, 233, 108, 219, + 173, 197, 126, 203, 108, 222, 161, 249, 90, 212, 172, 210, 158, 251, 27, + 233, 91, 251, 27, 213, 85, 213, 89, 245, 86, 204, 209, 232, 218, 205, + 240, 77, 212, 152, 219, 200, 214, 120, 248, 104, 212, 64, 222, 172, 210, + 61, 241, 78, 210, 61, 249, 103, 241, 116, 210, 60, 241, 14, 26, 210, 60, + 204, 246, 248, 74, 205, 144, 248, 53, 234, 243, 234, 239, 209, 222, 204, + 59, 212, 66, 240, 85, 214, 166, 204, 78, 234, 240, 206, 157, 235, 112, + 247, 161, 3, 204, 51, 239, 188, 205, 186, 230, 202, 241, 76, 207, 7, 230, + 201, 230, 202, 241, 76, 237, 238, 241, 115, 245, 47, 154, 247, 132, 221, + 244, 241, 5, 231, 168, 212, 68, 206, 171, 248, 216, 248, 70, 212, 69, 77, + 235, 39, 241, 114, 235, 28, 26, 224, 21, 203, 57, 197, 37, 232, 187, 208, + 248, 248, 87, 26, 241, 27, 197, 47, 233, 157, 244, 178, 233, 157, 201, + 145, 237, 216, 248, 247, 218, 130, 244, 210, 248, 247, 218, 129, 249, + 141, 248, 86, 235, 28, 26, 224, 22, 3, 212, 139, 248, 87, 3, 212, 84, + 241, 103, 212, 86, 210, 62, 196, 254, 212, 26, 248, 153, 247, 160, 225, + 211, 245, 38, 201, 190, 235, 197, 245, 37, 235, 115, 235, 116, 205, 142, + 249, 101, 213, 129, 212, 85, 241, 152, 249, 103, 203, 112, 201, 190, 241, + 59, 235, 87, 212, 173, 239, 242, 225, 202, 239, 9, 247, 104, 204, 208, + 197, 51, 245, 63, 218, 190, 199, 21, 247, 23, 208, 167, 208, 197, 233, + 114, 247, 125, 232, 127, 3, 202, 68, 214, 120, 202, 218, 222, 184, 248, + 80, 77, 235, 61, 219, 33, 219, 196, 210, 129, 210, 62, 34, 224, 152, 3, + 225, 210, 204, 179, 219, 67, 222, 128, 205, 238, 241, 121, 224, 15, 249, + 5, 250, 198, 34, 216, 8, 249, 5, 239, 194, 34, 216, 8, 235, 131, 234, + 249, 251, 251, 202, 109, 247, 105, 231, 98, 235, 163, 197, 77, 209, 211, + 244, 180, 235, 107, 212, 102, 26, 235, 111, 219, 67, 218, 154, 247, 146, + 244, 253, 232, 133, 250, 207, 213, 211, 201, 243, 232, 165, 244, 239, + 203, 15, 202, 110, 244, 225, 248, 113, 213, 40, 250, 205, 199, 30, 234, + 97, 239, 86, 232, 31, 205, 231, 220, 116, 248, 166, 234, 98, 239, 132, + 248, 73, 235, 63, 212, 138, 247, 113, 34, 216, 13, 218, 120, 34, 216, 8, + 208, 181, 233, 59, 34, 224, 151, 201, 120, 199, 9, 34, 208, 159, 209, + 114, 206, 202, 3, 208, 200, 203, 20, 210, 236, 26, 249, 103, 206, 3, 26, + 206, 3, 248, 97, 249, 60, 26, 231, 161, 245, 87, 235, 93, 205, 205, 209, + 115, 204, 83, 205, 106, 219, 196, 201, 146, 231, 99, 210, 237, 251, 115, + 235, 36, 209, 128, 235, 36, 204, 54, 197, 94, 222, 97, 233, 134, 210, + 238, 218, 176, 210, 238, 247, 116, 241, 69, 249, 57, 26, 249, 103, 198, + 238, 235, 152, 231, 182, 204, 238, 26, 249, 103, 230, 202, 231, 182, 204, + 238, 26, 211, 219, 203, 153, 203, 20, 213, 230, 26, 249, 103, 205, 207, + 247, 121, 218, 169, 247, 144, 249, 8, 3, 200, 76, 248, 12, 241, 135, 231, + 88, 248, 10, 244, 233, 239, 198, 231, 88, 248, 11, 244, 223, 248, 11, + 239, 190, 239, 191, 225, 241, 217, 204, 213, 136, 205, 18, 231, 88, 248, + 11, 231, 88, 3, 234, 81, 214, 157, 248, 11, 225, 202, 212, 74, 214, 156, + 236, 105, 212, 74, 214, 156, 231, 97, 249, 84, 250, 138, 203, 29, 220, + 116, 231, 93, 221, 209, 231, 93, 241, 119, 204, 222, 208, 166, 239, 201, + 204, 222, 235, 222, 225, 222, 222, 233, 225, 202, 247, 94, 236, 105, 247, + 94, 59, 213, 59, 58, 213, 59, 197, 120, 59, 235, 93, 197, 120, 58, 235, + 93, 209, 197, 58, 209, 197, 223, 74, 249, 124, 210, 236, 26, 206, 134, + 248, 78, 26, 51, 251, 110, 236, 236, 73, 235, 102, 200, 199, 236, 236, + 73, 235, 102, 200, 196, 236, 236, 73, 235, 102, 200, 194, 236, 236, 73, + 235, 102, 200, 192, 236, 236, 73, 235, 102, 200, 190, 210, 198, 218, 166, + 214, 13, 197, 128, 248, 16, 241, 83, 202, 102, 222, 145, 210, 240, 247, + 92, 237, 223, 241, 67, 197, 80, 205, 214, 205, 212, 231, 98, 210, 210, + 233, 140, 206, 249, 218, 209, 209, 201, 245, 73, 239, 17, 212, 184, 248, + 114, 236, 255, 214, 169, 205, 121, 206, 244, 248, 15, 251, 69, 231, 167, + 223, 66, 248, 245, 235, 111, 201, 145, 235, 111, 248, 121, 201, 1, 232, + 163, 245, 74, 249, 141, 245, 74, 234, 233, 249, 141, 245, 74, 248, 156, + 213, 61, 224, 5, 212, 90, 237, 213, 247, 148, 249, 129, 247, 148, 239, 8, + 218, 167, 235, 233, 241, 84, 235, 233, 202, 103, 235, 233, 210, 241, 235, + 233, 247, 93, 235, 233, 237, 224, 235, 233, 205, 104, 197, 80, 231, 99, + 235, 233, 218, 210, 235, 233, 239, 18, 235, 233, 212, 185, 235, 233, 234, + 237, 235, 233, 232, 215, 235, 233, 197, 24, 235, 233, 249, 3, 235, 233, + 213, 187, 235, 233, 212, 185, 216, 20, 213, 105, 212, 12, 245, 58, 236, + 59, 236, 67, 237, 76, 216, 20, 218, 164, 201, 249, 59, 124, 212, 107, + 249, 136, 226, 72, 59, 135, 212, 107, 249, 136, 226, 72, 59, 50, 212, + 107, 249, 136, 226, 72, 59, 53, 212, 107, 249, 136, 226, 72, 235, 105, + 232, 210, 55, 197, 120, 232, 210, 55, 214, 140, 232, 210, 55, 202, 140, + 124, 55, 202, 140, 135, 55, 244, 224, 232, 185, 55, 192, 232, 185, 55, + 241, 53, 197, 20, 232, 165, 236, 62, 217, 108, 203, 214, 225, 192, 237, + 218, 224, 77, 248, 169, 197, 20, 244, 196, 211, 199, 232, 189, 212, 65, + 220, 50, 206, 194, 250, 164, 206, 194, 232, 47, 206, 194, 197, 20, 208, + 216, 197, 20, 248, 96, 235, 34, 247, 234, 226, 87, 206, 78, 247, 233, + 226, 87, 206, 78, 248, 68, 233, 169, 220, 62, 197, 21, 235, 211, 220, 63, + 26, 197, 22, 231, 176, 232, 184, 99, 219, 165, 231, 176, 232, 184, 99, + 197, 19, 231, 176, 232, 184, 212, 99, 214, 155, 197, 22, 3, 247, 252, + 237, 74, 248, 41, 3, 199, 109, 213, 29, 3, 248, 125, 232, 233, 220, 63, + 3, 233, 73, 212, 221, 220, 45, 220, 63, 3, 201, 9, 214, 132, 220, 62, + 214, 132, 197, 21, 249, 140, 241, 136, 197, 5, 212, 17, 225, 202, 214, + 150, 225, 202, 233, 139, 233, 200, 249, 141, 251, 95, 236, 72, 251, 154, + 251, 155, 218, 199, 226, 92, 205, 254, 226, 61, 239, 187, 213, 28, 233, + 67, 240, 90, 222, 58, 217, 229, 212, 98, 235, 234, 220, 7, 232, 232, 249, + 78, 212, 101, 203, 235, 212, 177, 224, 58, 78, 221, 209, 222, 135, 210, + 2, 234, 38, 204, 228, 224, 57, 248, 79, 241, 87, 3, 232, 126, 197, 101, + 248, 255, 232, 126, 248, 33, 232, 126, 99, 232, 124, 205, 140, 232, 126, + 233, 83, 232, 126, 232, 127, 3, 51, 248, 119, 232, 126, 233, 91, 232, + 126, 196, 62, 232, 126, 211, 200, 232, 126, 232, 127, 3, 210, 62, 210, + 83, 232, 124, 232, 127, 239, 242, 239, 141, 207, 21, 3, 39, 76, 226, 41, + 237, 2, 175, 248, 8, 251, 94, 105, 248, 105, 205, 243, 105, 244, 170, + 105, 205, 115, 204, 61, 105, 237, 209, 240, 66, 105, 212, 178, 77, 212, + 91, 235, 75, 248, 181, 239, 49, 105, 205, 132, 249, 101, 202, 160, 249, + 101, 59, 235, 62, 231, 58, 212, 105, 105, 218, 214, 249, 122, 241, 17, + 236, 92, 85, 239, 10, 55, 241, 74, 247, 114, 249, 83, 3, 196, 60, 55, + 249, 83, 3, 239, 10, 55, 249, 83, 3, 236, 108, 55, 249, 83, 3, 212, 63, + 55, 218, 214, 3, 197, 45, 245, 111, 3, 200, 24, 201, 186, 26, 196, 60, + 55, 208, 139, 213, 27, 241, 157, 248, 39, 219, 21, 235, 67, 239, 73, 214, + 76, 239, 78, 237, 169, 235, 138, 235, 47, 192, 235, 138, 235, 47, 213, + 228, 3, 241, 21, 213, 228, 235, 226, 200, 36, 247, 154, 203, 56, 247, + 154, 247, 115, 226, 72, 245, 111, 3, 200, 24, 201, 185, 245, 111, 3, 237, + 231, 201, 185, 249, 80, 245, 110, 244, 209, 211, 195, 209, 187, 211, 195, + 213, 160, 204, 218, 209, 122, 201, 177, 209, 122, 248, 101, 203, 151, + 222, 189, 216, 11, 216, 12, 3, 239, 241, 241, 86, 244, 203, 248, 102, + 192, 248, 102, 233, 91, 248, 102, 248, 119, 248, 102, 214, 71, 248, 102, + 248, 99, 217, 223, 249, 126, 208, 152, 219, 166, 203, 34, 210, 172, 213, + 226, 235, 194, 220, 116, 208, 196, 251, 66, 211, 220, 252, 3, 221, 211, + 245, 95, 219, 178, 214, 33, 201, 194, 226, 83, 201, 194, 213, 235, 237, + 129, 105, 226, 80, 236, 194, 236, 195, 3, 237, 231, 61, 57, 244, 203, + 220, 78, 3, 221, 201, 235, 93, 244, 203, 220, 78, 3, 210, 215, 235, 93, + 192, 220, 78, 3, 210, 215, 235, 93, 192, 220, 78, 3, 221, 201, 235, 93, + 212, 71, 212, 72, 231, 102, 217, 78, 218, 243, 212, 229, 218, 243, 212, + 230, 3, 91, 61, 250, 169, 222, 184, 199, 33, 218, 242, 218, 243, 212, + 230, 214, 158, 216, 51, 218, 243, 212, 228, 251, 67, 3, 249, 68, 247, + 146, 247, 147, 3, 235, 84, 199, 30, 247, 146, 203, 31, 210, 231, 199, 29, + 235, 131, 211, 254, 212, 81, 204, 240, 212, 40, 249, 7, 200, 219, 91, + 250, 214, 244, 205, 91, 26, 107, 192, 244, 250, 250, 214, 244, 205, 91, + 26, 107, 192, 244, 250, 250, 215, 3, 46, 97, 214, 20, 244, 205, 237, 231, + 26, 200, 24, 192, 244, 250, 250, 214, 251, 65, 237, 231, 26, 200, 24, + 192, 244, 250, 250, 214, 126, 248, 37, 105, 130, 248, 37, 105, 205, 137, + 3, 247, 139, 106, 205, 136, 205, 137, 3, 97, 205, 162, 197, 122, 205, + 137, 3, 115, 205, 162, 197, 121, 249, 50, 237, 2, 212, 130, 222, 179, + 220, 90, 233, 157, 210, 17, 220, 90, 233, 157, 221, 255, 3, 226, 53, 213, + 65, 244, 203, 221, 255, 3, 224, 153, 224, 153, 221, 254, 192, 221, 254, + 248, 229, 248, 230, 3, 247, 139, 106, 248, 100, 222, 66, 105, 210, 232, + 247, 227, 249, 139, 3, 107, 61, 57, 236, 222, 3, 107, 61, 57, 214, 120, + 3, 236, 90, 117, 3, 50, 53, 61, 57, 205, 170, 3, 91, 61, 57, 201, 243, 3, + 200, 24, 61, 57, 216, 51, 97, 200, 64, 237, 29, 105, 224, 150, 203, 23, + 226, 47, 16, 36, 8, 6, 222, 134, 226, 47, 16, 36, 8, 4, 222, 134, 226, + 47, 16, 36, 215, 143, 226, 47, 16, 36, 203, 249, 226, 47, 16, 36, 8, 222, + 134, 235, 118, 237, 2, 201, 238, 196, 252, 232, 216, 215, 126, 26, 248, + 107, 231, 183, 212, 158, 219, 66, 203, 32, 241, 43, 249, 103, 206, 29, + 212, 109, 205, 8, 3, 112, 238, 253, 225, 202, 16, 36, 248, 242, 201, 175, + 236, 238, 58, 47, 247, 227, 59, 47, 247, 227, 222, 228, 210, 158, 244, + 249, 222, 228, 248, 119, 244, 249, 222, 228, 214, 71, 239, 140, 222, 228, + 248, 119, 239, 140, 4, 214, 71, 239, 140, 4, 248, 119, 239, 140, 200, 35, + 210, 158, 201, 180, 237, 234, 210, 158, 201, 180, 200, 35, 4, 210, 158, + 201, 180, 237, 234, 4, 210, 158, 201, 180, 221, 203, 53, 207, 37, 59, + 244, 249, 200, 33, 53, 207, 37, 59, 244, 249, 46, 241, 62, 212, 95, 241, + 62, 212, 96, 3, 232, 222, 60, 241, 62, 212, 95, 216, 15, 50, 207, 108, 3, + 115, 238, 250, 216, 15, 53, 207, 108, 3, 115, 238, 250, 16, 36, 220, 23, + 247, 1, 59, 8, 241, 61, 85, 8, 241, 61, 247, 41, 241, 61, 214, 128, 105, + 237, 237, 77, 213, 90, 225, 53, 218, 182, 203, 243, 219, 161, 3, 216, + 179, 248, 56, 248, 75, 77, 231, 9, 244, 207, 235, 234, 97, 214, 175, 244, + 207, 235, 234, 99, 214, 175, 244, 207, 235, 234, 115, 214, 175, 244, 207, + 235, 234, 235, 7, 214, 175, 244, 207, 235, 234, 235, 101, 214, 175, 244, + 207, 235, 234, 206, 29, 214, 175, 244, 207, 235, 234, 207, 71, 214, 175, + 244, 207, 235, 234, 237, 31, 214, 175, 244, 207, 235, 234, 216, 179, 214, + 175, 244, 207, 235, 234, 203, 24, 214, 175, 244, 207, 235, 234, 236, 253, + 214, 175, 244, 207, 235, 234, 200, 240, 214, 175, 244, 207, 235, 234, + 214, 112, 244, 207, 235, 234, 200, 213, 244, 207, 235, 234, 202, 146, + 244, 207, 235, 234, 235, 3, 244, 207, 235, 234, 235, 99, 244, 207, 235, + 234, 206, 25, 244, 207, 235, 234, 207, 70, 244, 207, 235, 234, 237, 30, + 244, 207, 235, 234, 216, 178, 244, 207, 235, 234, 203, 22, 244, 207, 235, + 234, 236, 251, 244, 207, 235, 234, 200, 238, 53, 205, 136, 53, 205, 137, + 3, 97, 205, 162, 197, 122, 53, 205, 137, 3, 115, 205, 162, 197, 121, 248, + 3, 248, 4, 3, 205, 162, 197, 121, 210, 0, 248, 229, 248, 102, 247, 137, + 220, 47, 244, 206, 58, 205, 255, 26, 241, 60, 216, 51, 212, 164, 231, + 175, 220, 63, 226, 87, 247, 236, 204, 125, 222, 127, 205, 241, 214, 73, + 205, 95, 240, 71, 204, 107, 205, 124, 205, 125, 197, 102, 225, 111, 220, + 63, 240, 89, 50, 232, 210, 203, 34, 210, 172, 203, 34, 210, 173, 3, 213, + 227, 53, 232, 210, 203, 34, 210, 172, 59, 201, 224, 203, 33, 58, 201, + 224, 203, 33, 203, 34, 214, 120, 201, 243, 77, 218, 239, 244, 228, 218, + 243, 212, 229, 249, 139, 77, 236, 194, 205, 14, 236, 194, 236, 195, 3, + 222, 92, 235, 54, 236, 194, 213, 66, 127, 205, 14, 236, 194, 222, 65, + 213, 159, 58, 211, 195, 221, 203, 50, 213, 64, 221, 203, 50, 249, 97, + 213, 65, 221, 203, 50, 235, 9, 213, 65, 221, 203, 50, 213, 220, 221, 203, + 50, 241, 77, 50, 196, 246, 232, 209, 163, 214, 140, 232, 210, 55, 210, + 215, 232, 210, 3, 235, 123, 205, 114, 210, 89, 210, 215, 232, 210, 3, + 235, 123, 205, 114, 210, 89, 202, 140, 124, 55, 210, 89, 202, 140, 135, + 55, 210, 89, 199, 32, 232, 209, 210, 89, 232, 210, 3, 112, 235, 128, 236, + 78, 210, 215, 232, 210, 3, 213, 134, 248, 204, 112, 26, 210, 3, 235, 122, + 59, 135, 212, 107, 50, 232, 210, 226, 72, 206, 96, 59, 50, 212, 107, 226, + 72, 206, 96, 59, 53, 212, 107, 226, 72, 206, 96, 58, 50, 212, 107, 226, + 72, 206, 96, 58, 53, 212, 107, 226, 72, 58, 50, 212, 107, 249, 136, 226, + 72, 58, 53, 212, 107, 249, 136, 226, 72, 206, 96, 59, 124, 212, 107, 226, + 72, 206, 96, 59, 135, 212, 107, 226, 72, 206, 96, 58, 124, 212, 107, 226, + 72, 206, 96, 58, 135, 212, 107, 226, 72, 58, 124, 212, 107, 249, 136, + 226, 72, 58, 135, 212, 107, 249, 136, 226, 72, 58, 232, 126, 239, 186, + 241, 157, 224, 152, 26, 218, 166, 115, 217, 87, 241, 156, 212, 13, 212, + 115, 247, 156, 58, 232, 173, 206, 245, 235, 67, 239, 73, 59, 232, 173, + 206, 245, 235, 67, 239, 73, 205, 186, 206, 245, 235, 67, 239, 73, 203, + 104, 247, 98, 197, 40, 224, 151, 97, 247, 228, 218, 166, 99, 247, 228, + 218, 166, 115, 247, 228, 218, 166, 201, 215, 37, 213, 27, 241, 157, 232, + 173, 239, 73, 208, 154, 212, 14, 230, 195, 235, 194, 230, 195, 214, 76, + 239, 79, 230, 195, 239, 22, 3, 202, 237, 239, 22, 3, 202, 238, 26, 212, + 214, 239, 22, 3, 212, 214, 234, 251, 3, 212, 214, 234, 251, 3, 202, 82, + 234, 251, 3, 251, 107, 196, 222, 58, 235, 47, 235, 47, 192, 235, 47, 247, + 115, 132, 239, 58, 247, 115, 235, 138, 248, 70, 235, 138, 247, 169, 236, + 232, 216, 13, 236, 232, 216, 14, 213, 227, 236, 232, 216, 14, 213, 233, + 216, 13, 216, 14, 213, 227, 216, 14, 213, 233, 236, 232, 239, 21, 236, + 232, 213, 227, 236, 232, 213, 225, 239, 21, 213, 227, 213, 225, 197, 132, + 205, 121, 216, 14, 213, 233, 205, 121, 247, 155, 213, 233, 239, 186, 197, + 49, 219, 18, 219, 252, 214, 23, 244, 205, 53, 26, 50, 207, 108, 250, 214, + 247, 139, 196, 222, 226, 78, 235, 41, 206, 9, 105, 239, 240, 235, 41, + 206, 9, 105, 241, 158, 37, 224, 153, 209, 212, 217, 78, 213, 228, 3, 46, + 202, 237, 204, 230, 245, 110, 240, 119, 224, 21, 222, 59, 205, 135, 232, + 138, 226, 87, 206, 78, 115, 210, 189, 57, 115, 210, 189, 60, 115, 210, + 189, 222, 184, 115, 210, 189, 210, 22, 50, 205, 132, 248, 20, 53, 205, + 132, 248, 20, 99, 205, 132, 248, 19, 115, 205, 132, 248, 19, 50, 202, + 160, 248, 20, 53, 202, 160, 248, 20, 50, 251, 94, 248, 20, 53, 251, 94, + 248, 20, 218, 194, 248, 20, 222, 93, 218, 194, 248, 20, 222, 93, 218, + 193, 249, 99, 111, 3, 249, 98, 249, 99, 145, 196, 222, 249, 99, 111, 3, + 145, 196, 222, 249, 99, 27, 145, 196, 222, 249, 99, 111, 3, 27, 145, 196, + 222, 175, 245, 102, 78, 249, 99, 111, 3, 27, 245, 101, 197, 4, 220, 43, + 218, 171, 234, 218, 202, 17, 201, 220, 204, 253, 77, 222, 107, 206, 79, + 77, 225, 203, 218, 152, 233, 87, 235, 233, 233, 87, 235, 234, 3, 205, + 218, 236, 59, 235, 234, 3, 203, 52, 77, 225, 113, 205, 218, 235, 234, 3, + 192, 218, 164, 205, 218, 235, 234, 3, 192, 218, 165, 26, 205, 218, 236, + 59, 205, 218, 235, 234, 3, 192, 218, 165, 26, 244, 172, 204, 60, 205, + 218, 235, 234, 3, 192, 218, 165, 26, 202, 100, 236, 59, 205, 218, 235, + 234, 3, 232, 221, 205, 218, 235, 234, 3, 231, 101, 197, 42, 235, 233, + 205, 218, 235, 234, 3, 205, 218, 236, 59, 235, 234, 208, 186, 239, 220, + 235, 39, 210, 132, 235, 233, 205, 218, 235, 234, 3, 232, 125, 236, 59, + 205, 218, 235, 234, 3, 204, 107, 205, 217, 235, 233, 217, 85, 235, 233, + 236, 80, 235, 233, 200, 70, 235, 233, 235, 234, 3, 244, 172, 204, 60, + 213, 57, 235, 233, 241, 149, 235, 233, 241, 150, 235, 233, 224, 56, 235, + 233, 235, 234, 202, 143, 39, 224, 57, 224, 56, 235, 234, 3, 205, 218, + 236, 59, 224, 56, 235, 234, 3, 244, 203, 236, 59, 235, 234, 3, 204, 180, + 201, 249, 235, 234, 3, 204, 180, 201, 250, 26, 197, 42, 236, 67, 235, + 234, 3, 204, 180, 201, 250, 26, 202, 100, 236, 59, 239, 80, 235, 233, + 197, 3, 235, 233, 251, 86, 235, 233, 212, 62, 235, 233, 241, 45, 235, + 233, 213, 31, 235, 233, 235, 234, 3, 221, 228, 77, 201, 157, 239, 80, + 247, 232, 210, 132, 235, 233, 234, 229, 235, 234, 3, 192, 218, 164, 251, + 84, 235, 233, 235, 187, 235, 233, 197, 103, 235, 233, 205, 242, 235, 233, + 202, 62, 235, 233, 233, 88, 235, 233, 221, 212, 241, 45, 235, 233, 235, + 234, 3, 192, 218, 164, 231, 47, 235, 233, 235, 234, 3, 192, 218, 165, 26, + 244, 172, 204, 60, 235, 234, 208, 156, 226, 87, 235, 188, 250, 176, 235, + 233, 235, 59, 235, 233, 205, 243, 235, 233, 239, 49, 235, 233, 235, 234, + 197, 37, 218, 164, 235, 234, 3, 219, 193, 220, 9, 233, 87, 247, 93, 235, + 234, 3, 205, 218, 236, 59, 247, 93, 235, 234, 3, 203, 52, 77, 225, 113, + 205, 218, 247, 93, 235, 234, 3, 192, 218, 164, 205, 218, 247, 93, 235, + 234, 3, 232, 125, 236, 59, 247, 93, 235, 234, 3, 196, 244, 205, 219, 224, + 56, 247, 93, 235, 234, 3, 244, 203, 236, 59, 212, 62, 247, 93, 235, 233, + 241, 45, 247, 93, 235, 233, 197, 103, 247, 93, 235, 233, 205, 236, 234, + 229, 235, 233, 205, 236, 205, 218, 235, 233, 200, 30, 235, 233, 235, 234, + 3, 209, 210, 236, 59, 235, 234, 3, 216, 51, 233, 131, 234, 15, 235, 234, + 3, 214, 140, 234, 15, 213, 29, 248, 76, 239, 235, 208, 128, 218, 209, + 232, 129, 218, 209, 205, 138, 218, 209, 232, 176, 213, 29, 210, 213, 97, + 232, 209, 213, 29, 210, 213, 248, 88, 232, 185, 226, 87, 247, 43, 213, + 29, 234, 228, 213, 29, 3, 212, 62, 235, 233, 213, 29, 3, 235, 48, 232, + 184, 173, 197, 89, 212, 107, 222, 192, 205, 159, 197, 89, 212, 107, 222, + 192, 173, 237, 69, 212, 107, 222, 192, 205, 159, 237, 69, 212, 107, 222, + 192, 163, 173, 197, 89, 212, 107, 222, 192, 163, 205, 159, 197, 89, 212, + 107, 222, 192, 163, 173, 237, 69, 212, 107, 222, 192, 163, 205, 159, 237, + 69, 212, 107, 222, 192, 173, 197, 89, 212, 107, 199, 15, 222, 192, 205, + 159, 197, 89, 212, 107, 199, 15, 222, 192, 173, 237, 69, 212, 107, 199, + 15, 222, 192, 205, 159, 237, 69, 212, 107, 199, 15, 222, 192, 85, 173, + 197, 89, 212, 107, 199, 15, 222, 192, 85, 205, 159, 197, 89, 212, 107, + 199, 15, 222, 192, 85, 173, 237, 69, 212, 107, 199, 15, 222, 192, 85, + 205, 159, 237, 69, 212, 107, 199, 15, 222, 192, 173, 197, 89, 212, 107, + 248, 17, 205, 159, 197, 89, 212, 107, 248, 17, 173, 237, 69, 212, 107, + 248, 17, 205, 159, 237, 69, 212, 107, 248, 17, 85, 173, 197, 89, 212, + 107, 248, 17, 85, 205, 159, 197, 89, 212, 107, 248, 17, 85, 173, 237, 69, + 212, 107, 248, 17, 85, 205, 159, 237, 69, 212, 107, 248, 17, 231, 174, + 211, 72, 47, 214, 59, 231, 174, 211, 72, 47, 214, 60, 226, 87, 58, 205, + 94, 205, 179, 211, 72, 47, 214, 59, 205, 179, 211, 72, 47, 214, 60, 226, + 87, 58, 205, 94, 107, 209, 217, 200, 24, 209, 217, 91, 209, 217, 237, + 231, 209, 217, 145, 33, 236, 129, 214, 59, 85, 145, 33, 236, 129, 214, + 59, 33, 192, 236, 129, 214, 59, 85, 33, 192, 236, 129, 214, 59, 85, 251, + 112, 214, 59, 204, 63, 251, 112, 214, 59, 45, 85, 52, 163, 244, 160, 211, + 62, 117, 214, 59, 45, 85, 52, 244, 160, 211, 62, 117, 214, 59, 45, 85, + 126, 52, 244, 160, 211, 62, 117, 214, 59, 85, 226, 27, 214, 59, 45, 226, + 27, 214, 59, 85, 45, 226, 27, 214, 59, 199, 48, 85, 205, 177, 199, 48, + 85, 210, 90, 205, 177, 245, 100, 248, 113, 210, 90, 245, 100, 248, 113, + 209, 217, 232, 108, 204, 248, 221, 252, 210, 220, 247, 116, 232, 44, 201, + 207, 232, 44, 201, 208, 3, 248, 6, 216, 20, 201, 207, 219, 136, 175, 210, + 221, 204, 254, 201, 205, 201, 206, 247, 116, 247, 237, 214, 116, 247, + 237, 201, 153, 247, 238, 204, 226, 219, 22, 251, 116, 235, 119, 236, 214, + 212, 99, 247, 116, 214, 116, 212, 99, 247, 116, 203, 78, 214, 116, 203, + 78, 250, 137, 214, 116, 250, 137, 210, 165, 199, 110, 239, 216, 201, 144, + 250, 208, 221, 219, 201, 214, 218, 202, 218, 170, 210, 219, 204, 77, 210, + 219, 218, 170, 247, 168, 251, 231, 201, 204, 206, 207, 209, 184, 205, + 130, 231, 155, 201, 211, 222, 95, 83, 201, 211, 222, 95, 241, 136, 55, + 212, 99, 247, 100, 210, 83, 222, 95, 201, 177, 235, 94, 214, 120, 212, + 73, 239, 1, 216, 51, 236, 200, 55, 205, 216, 105, 216, 51, 205, 216, 105, + 211, 194, 222, 48, 226, 87, 225, 231, 212, 149, 105, 239, 29, 216, 19, + 222, 48, 105, 212, 67, 197, 128, 105, 216, 35, 197, 128, 105, 248, 180, + 216, 51, 248, 179, 248, 178, 218, 170, 248, 178, 213, 81, 216, 51, 213, + 80, 245, 65, 241, 54, 219, 160, 105, 197, 18, 105, 210, 99, 249, 141, + 105, 202, 18, 197, 128, 244, 200, 206, 162, 249, 53, 249, 51, 213, 118, + 241, 120, 241, 3, 249, 118, 244, 229, 50, 221, 181, 201, 181, 3, 209, + 185, 241, 100, 212, 1, 55, 46, 226, 61, 205, 160, 248, 67, 105, 233, 168, + 105, 241, 92, 26, 222, 239, 205, 243, 252, 19, 206, 185, 249, 117, 248, + 228, 248, 229, 248, 252, 212, 149, 77, 197, 2, 214, 172, 55, 206, 185, + 201, 154, 204, 176, 213, 224, 232, 40, 203, 26, 232, 217, 26, 196, 252, + 206, 220, 214, 145, 237, 206, 218, 174, 210, 220, 201, 216, 218, 177, + 248, 112, 200, 35, 219, 33, 251, 187, 200, 35, 251, 187, 200, 35, 4, 251, + 187, 4, 251, 187, 216, 24, 251, 187, 251, 188, 239, 200, 251, 188, 250, + 220, 208, 195, 214, 116, 235, 119, 236, 214, 239, 130, 221, 252, 213, + 122, 206, 207, 208, 160, 218, 177, 208, 160, 247, 127, 205, 245, 235, 54, + 208, 190, 206, 5, 250, 139, 210, 58, 150, 16, 36, 211, 68, 150, 16, 36, + 251, 189, 150, 16, 36, 235, 118, 150, 16, 36, 237, 72, 150, 16, 36, 197, + 127, 150, 16, 36, 251, 16, 150, 16, 36, 251, 17, 210, 152, 150, 16, 36, + 251, 17, 210, 151, 150, 16, 36, 251, 17, 198, 254, 150, 16, 36, 251, 17, 198, 253, 150, 16, 36, 199, 12, 150, 16, 36, 199, 11, 150, 16, 36, 199, - 10, 150, 16, 36, 204, 118, 150, 16, 36, 212, 237, 204, 118, 150, 16, 36, - 58, 204, 118, 150, 16, 36, 219, 158, 204, 149, 150, 16, 36, 219, 158, - 204, 148, 150, 16, 36, 219, 158, 204, 147, 150, 16, 36, 244, 251, 150, - 16, 36, 208, 233, 150, 16, 36, 216, 166, 150, 16, 36, 198, 252, 150, 16, + 10, 150, 16, 36, 204, 118, 150, 16, 36, 212, 238, 204, 118, 150, 16, 36, + 58, 204, 118, 150, 16, 36, 219, 159, 204, 149, 150, 16, 36, 219, 159, + 204, 148, 150, 16, 36, 219, 159, 204, 147, 150, 16, 36, 244, 252, 150, + 16, 36, 208, 233, 150, 16, 36, 216, 167, 150, 16, 36, 198, 252, 150, 16, 36, 198, 251, 150, 16, 36, 209, 218, 208, 233, 150, 16, 36, 209, 218, - 208, 232, 150, 16, 36, 233, 134, 150, 16, 36, 206, 75, 150, 16, 36, 225, - 253, 214, 65, 150, 16, 36, 225, 253, 214, 64, 150, 16, 36, 241, 65, 77, - 225, 252, 150, 16, 36, 210, 147, 77, 225, 252, 150, 16, 36, 241, 110, - 214, 65, 150, 16, 36, 225, 251, 214, 65, 150, 16, 36, 204, 150, 77, 241, - 109, 150, 16, 36, 241, 65, 77, 241, 109, 150, 16, 36, 241, 65, 77, 241, - 108, 150, 16, 36, 241, 110, 251, 58, 150, 16, 36, 208, 234, 77, 241, 110, - 251, 58, 150, 16, 36, 204, 150, 77, 208, 234, 77, 241, 109, 150, 16, 36, - 199, 104, 150, 16, 36, 202, 75, 214, 65, 150, 16, 36, 222, 195, 214, 65, - 150, 16, 36, 251, 57, 214, 65, 150, 16, 36, 204, 150, 77, 251, 56, 150, - 16, 36, 208, 234, 77, 251, 56, 150, 16, 36, 204, 150, 77, 208, 234, 77, - 251, 56, 150, 16, 36, 199, 13, 77, 251, 56, 150, 16, 36, 210, 147, 77, - 251, 56, 150, 16, 36, 210, 147, 77, 251, 55, 150, 16, 36, 210, 146, 150, - 16, 36, 210, 145, 150, 16, 36, 210, 144, 150, 16, 36, 210, 143, 150, 16, - 36, 251, 148, 150, 16, 36, 251, 147, 150, 16, 36, 220, 33, 150, 16, 36, - 208, 240, 150, 16, 36, 250, 212, 150, 16, 36, 210, 175, 150, 16, 36, 210, - 174, 150, 16, 36, 250, 140, 150, 16, 36, 248, 145, 214, 65, 150, 16, 36, - 203, 99, 150, 16, 36, 203, 98, 150, 16, 36, 211, 73, 222, 83, 150, 16, - 36, 248, 92, 150, 16, 36, 248, 91, 150, 16, 36, 248, 90, 150, 16, 36, - 251, 124, 150, 16, 36, 214, 143, 150, 16, 36, 205, 117, 150, 16, 36, 202, - 73, 150, 16, 36, 233, 54, 150, 16, 36, 197, 115, 150, 16, 36, 212, 60, - 150, 16, 36, 247, 150, 150, 16, 36, 200, 252, 150, 16, 36, 247, 117, 218, - 182, 150, 16, 36, 208, 170, 77, 225, 114, 150, 16, 36, 247, 164, 150, 16, - 36, 201, 174, 150, 16, 36, 205, 5, 201, 174, 150, 16, 36, 221, 250, 150, - 16, 36, 205, 191, 150, 16, 36, 200, 13, 150, 16, 36, 231, 98, 237, 183, - 150, 16, 36, 250, 189, 150, 16, 36, 212, 68, 250, 189, 150, 16, 36, 248, - 41, 150, 16, 36, 212, 59, 248, 41, 150, 16, 36, 251, 121, 150, 16, 36, + 208, 232, 150, 16, 36, 233, 135, 150, 16, 36, 206, 75, 150, 16, 36, 225, + 254, 214, 66, 150, 16, 36, 225, 254, 214, 65, 150, 16, 36, 241, 66, 77, + 225, 253, 150, 16, 36, 210, 148, 77, 225, 253, 150, 16, 36, 241, 111, + 214, 66, 150, 16, 36, 225, 252, 214, 66, 150, 16, 36, 204, 150, 77, 241, + 110, 150, 16, 36, 241, 66, 77, 241, 110, 150, 16, 36, 241, 66, 77, 241, + 109, 150, 16, 36, 241, 111, 251, 59, 150, 16, 36, 208, 234, 77, 241, 111, + 251, 59, 150, 16, 36, 204, 150, 77, 208, 234, 77, 241, 110, 150, 16, 36, + 199, 104, 150, 16, 36, 202, 75, 214, 66, 150, 16, 36, 222, 196, 214, 66, + 150, 16, 36, 251, 58, 214, 66, 150, 16, 36, 204, 150, 77, 251, 57, 150, + 16, 36, 208, 234, 77, 251, 57, 150, 16, 36, 204, 150, 77, 208, 234, 77, + 251, 57, 150, 16, 36, 199, 13, 77, 251, 57, 150, 16, 36, 210, 148, 77, + 251, 57, 150, 16, 36, 210, 148, 77, 251, 56, 150, 16, 36, 210, 147, 150, + 16, 36, 210, 146, 150, 16, 36, 210, 145, 150, 16, 36, 210, 144, 150, 16, + 36, 251, 149, 150, 16, 36, 251, 148, 150, 16, 36, 220, 34, 150, 16, 36, + 208, 240, 150, 16, 36, 250, 213, 150, 16, 36, 210, 176, 150, 16, 36, 210, + 175, 150, 16, 36, 250, 141, 150, 16, 36, 248, 146, 214, 66, 150, 16, 36, + 203, 99, 150, 16, 36, 203, 98, 150, 16, 36, 211, 74, 222, 84, 150, 16, + 36, 248, 93, 150, 16, 36, 248, 92, 150, 16, 36, 248, 91, 150, 16, 36, + 251, 125, 150, 16, 36, 214, 144, 150, 16, 36, 205, 117, 150, 16, 36, 202, + 73, 150, 16, 36, 233, 55, 150, 16, 36, 197, 115, 150, 16, 36, 212, 61, + 150, 16, 36, 247, 151, 150, 16, 36, 200, 252, 150, 16, 36, 247, 118, 218, + 183, 150, 16, 36, 208, 170, 77, 225, 115, 150, 16, 36, 247, 165, 150, 16, + 36, 201, 174, 150, 16, 36, 205, 5, 201, 174, 150, 16, 36, 221, 251, 150, + 16, 36, 205, 191, 150, 16, 36, 200, 13, 150, 16, 36, 231, 99, 237, 184, + 150, 16, 36, 250, 190, 150, 16, 36, 212, 69, 250, 190, 150, 16, 36, 248, + 42, 150, 16, 36, 212, 60, 248, 42, 150, 16, 36, 251, 122, 150, 16, 36, 204, 213, 204, 99, 204, 212, 150, 16, 36, 204, 213, 204, 99, 204, 211, - 150, 16, 36, 204, 146, 150, 16, 36, 212, 32, 150, 16, 36, 239, 67, 150, - 16, 36, 239, 69, 150, 16, 36, 239, 68, 150, 16, 36, 211, 202, 150, 16, - 36, 211, 191, 150, 16, 36, 241, 51, 150, 16, 36, 241, 50, 150, 16, 36, - 241, 49, 150, 16, 36, 241, 48, 150, 16, 36, 241, 47, 150, 16, 36, 251, - 162, 150, 16, 36, 249, 53, 77, 220, 14, 150, 16, 36, 249, 53, 77, 199, - 138, 150, 16, 36, 210, 97, 150, 16, 36, 231, 90, 150, 16, 36, 216, 193, - 150, 16, 36, 240, 52, 150, 16, 36, 218, 196, 150, 16, 36, 157, 237, 220, - 150, 16, 36, 157, 214, 36, 58, 222, 178, 225, 236, 53, 201, 180, 58, 200, - 35, 225, 236, 53, 201, 180, 58, 210, 17, 225, 236, 53, 201, 180, 58, 237, - 233, 225, 236, 53, 201, 180, 58, 205, 236, 4, 244, 248, 219, 189, 27, 59, - 244, 248, 27, 59, 244, 248, 85, 59, 244, 248, 199, 48, 85, 59, 244, 248, - 236, 70, 85, 59, 244, 248, 59, 244, 249, 241, 131, 58, 4, 244, 248, 209, + 150, 16, 36, 204, 146, 150, 16, 36, 212, 33, 150, 16, 36, 239, 68, 150, + 16, 36, 239, 70, 150, 16, 36, 239, 69, 150, 16, 36, 211, 203, 150, 16, + 36, 211, 192, 150, 16, 36, 241, 52, 150, 16, 36, 241, 51, 150, 16, 36, + 241, 50, 150, 16, 36, 241, 49, 150, 16, 36, 241, 48, 150, 16, 36, 251, + 163, 150, 16, 36, 249, 54, 77, 220, 15, 150, 16, 36, 249, 54, 77, 199, + 138, 150, 16, 36, 210, 97, 150, 16, 36, 231, 91, 150, 16, 36, 216, 194, + 150, 16, 36, 240, 53, 150, 16, 36, 218, 197, 150, 16, 36, 157, 237, 221, + 150, 16, 36, 157, 214, 37, 58, 222, 179, 225, 237, 53, 201, 180, 58, 200, + 35, 225, 237, 53, 201, 180, 58, 210, 17, 225, 237, 53, 201, 180, 58, 237, + 234, 225, 237, 53, 201, 180, 58, 205, 236, 4, 244, 249, 219, 190, 27, 59, + 244, 249, 27, 59, 244, 249, 85, 59, 244, 249, 199, 48, 85, 59, 244, 249, + 236, 71, 85, 59, 244, 249, 59, 244, 250, 241, 132, 58, 4, 244, 249, 209, 187, 203, 100, 58, 202, 70, 205, 94, 58, 205, 236, 4, 205, 94, 175, 59, - 205, 94, 219, 189, 59, 205, 94, 27, 59, 205, 94, 85, 59, 205, 94, 199, - 48, 85, 59, 205, 94, 236, 70, 85, 59, 205, 94, 59, 47, 241, 131, 58, 199, - 48, 4, 205, 94, 59, 47, 241, 131, 58, 219, 189, 205, 94, 47, 203, 100, - 58, 202, 70, 239, 139, 58, 199, 48, 4, 239, 139, 58, 219, 189, 4, 239, - 139, 59, 239, 140, 241, 131, 58, 199, 48, 4, 239, 139, 59, 239, 140, 241, - 131, 58, 219, 189, 239, 139, 239, 140, 203, 100, 58, 202, 70, 221, 197, - 58, 199, 48, 4, 221, 197, 58, 219, 189, 4, 221, 197, 59, 221, 198, 241, - 131, 58, 4, 221, 197, 202, 188, 32, 241, 60, 175, 32, 241, 60, 219, 189, - 32, 241, 60, 27, 32, 241, 60, 199, 48, 27, 32, 241, 60, 199, 48, 85, 32, - 241, 60, 236, 70, 85, 32, 241, 60, 202, 188, 208, 230, 175, 208, 230, - 219, 189, 208, 230, 27, 208, 230, 85, 208, 230, 199, 48, 85, 208, 230, - 236, 70, 85, 208, 230, 175, 235, 100, 205, 110, 250, 178, 219, 189, 235, - 100, 205, 110, 250, 178, 27, 235, 100, 205, 110, 250, 178, 85, 235, 100, - 205, 110, 250, 178, 199, 48, 85, 235, 100, 205, 110, 250, 178, 236, 70, - 85, 235, 100, 205, 110, 250, 178, 175, 206, 29, 205, 110, 250, 178, 219, - 189, 206, 29, 205, 110, 250, 178, 27, 206, 29, 205, 110, 250, 178, 85, - 206, 29, 205, 110, 250, 178, 199, 48, 85, 206, 29, 205, 110, 250, 178, - 236, 70, 85, 206, 29, 205, 110, 250, 178, 175, 237, 30, 205, 110, 250, - 178, 219, 189, 237, 30, 205, 110, 250, 178, 27, 237, 30, 205, 110, 250, - 178, 85, 237, 30, 205, 110, 250, 178, 199, 48, 85, 237, 30, 205, 110, - 250, 178, 175, 115, 212, 108, 58, 205, 7, 219, 189, 115, 212, 108, 58, - 205, 7, 115, 212, 108, 58, 205, 7, 219, 189, 115, 212, 108, 212, 169, - 205, 7, 175, 235, 6, 212, 108, 58, 205, 7, 219, 189, 235, 6, 212, 108, - 58, 205, 7, 235, 6, 212, 108, 58, 205, 7, 219, 189, 235, 6, 212, 108, - 212, 169, 205, 7, 210, 90, 175, 235, 6, 212, 108, 212, 169, 205, 7, 175, - 235, 100, 212, 108, 58, 205, 7, 85, 235, 100, 212, 108, 58, 205, 7, 219, - 189, 206, 29, 212, 108, 58, 205, 7, 85, 206, 29, 212, 108, 58, 205, 7, - 206, 29, 212, 108, 212, 169, 205, 7, 219, 189, 237, 30, 212, 108, 58, - 205, 7, 85, 237, 30, 212, 108, 58, 205, 7, 199, 48, 85, 237, 30, 212, - 108, 58, 205, 7, 85, 237, 30, 212, 108, 212, 169, 205, 7, 175, 200, 240, - 212, 108, 58, 205, 7, 85, 200, 240, 212, 108, 58, 205, 7, 85, 200, 240, - 212, 108, 212, 169, 205, 7, 46, 201, 180, 217, 103, 46, 201, 180, 46, - 205, 94, 217, 103, 46, 205, 94, 222, 227, 214, 70, 244, 248, 222, 227, - 196, 62, 244, 248, 222, 227, 233, 90, 244, 248, 222, 227, 211, 199, 244, - 248, 222, 227, 248, 29, 244, 248, 222, 227, 210, 157, 205, 94, 222, 227, - 248, 118, 205, 94, 222, 227, 214, 70, 205, 94, 222, 227, 196, 62, 205, - 94, 222, 227, 233, 90, 205, 94, 222, 227, 211, 199, 205, 94, 222, 227, - 248, 29, 205, 94, 107, 61, 3, 4, 201, 181, 250, 216, 200, 24, 61, 3, 4, - 201, 181, 250, 216, 91, 61, 3, 4, 201, 181, 250, 216, 237, 230, 61, 3, 4, - 201, 181, 250, 216, 107, 61, 3, 219, 189, 201, 181, 250, 216, 200, 24, - 61, 3, 219, 189, 201, 181, 250, 216, 91, 61, 3, 219, 189, 201, 181, 250, - 216, 237, 230, 61, 3, 219, 189, 201, 181, 250, 216, 107, 61, 3, 222, 227, - 201, 181, 250, 216, 200, 24, 61, 3, 222, 227, 201, 181, 250, 216, 91, 61, - 3, 222, 227, 201, 181, 250, 216, 237, 230, 61, 3, 222, 227, 201, 181, - 250, 216, 107, 61, 3, 4, 236, 165, 250, 216, 200, 24, 61, 3, 4, 236, 165, - 250, 216, 91, 61, 3, 4, 236, 165, 250, 216, 237, 230, 61, 3, 4, 236, 165, - 250, 216, 107, 61, 3, 236, 165, 250, 216, 200, 24, 61, 3, 236, 165, 250, - 216, 91, 61, 3, 236, 165, 250, 216, 237, 230, 61, 3, 236, 165, 250, 216, - 85, 107, 61, 3, 236, 165, 250, 216, 85, 200, 24, 61, 3, 236, 165, 250, - 216, 85, 91, 61, 3, 236, 165, 250, 216, 85, 237, 230, 61, 3, 236, 165, - 250, 216, 85, 107, 61, 3, 222, 227, 236, 165, 250, 216, 85, 200, 24, 61, - 3, 222, 227, 236, 165, 250, 216, 85, 91, 61, 3, 222, 227, 236, 165, 250, - 216, 85, 237, 230, 61, 3, 222, 227, 236, 165, 250, 216, 107, 201, 179, - 61, 3, 217, 209, 207, 35, 200, 24, 201, 179, 61, 3, 217, 209, 207, 35, - 91, 201, 179, 61, 3, 217, 209, 207, 35, 237, 230, 201, 179, 61, 3, 217, - 209, 207, 35, 107, 201, 179, 61, 3, 219, 189, 207, 35, 200, 24, 201, 179, - 61, 3, 219, 189, 207, 35, 91, 201, 179, 61, 3, 219, 189, 207, 35, 237, - 230, 201, 179, 61, 3, 219, 189, 207, 35, 107, 201, 179, 61, 3, 27, 207, + 205, 94, 219, 190, 59, 205, 94, 27, 59, 205, 94, 85, 59, 205, 94, 199, + 48, 85, 59, 205, 94, 236, 71, 85, 59, 205, 94, 59, 47, 241, 132, 58, 199, + 48, 4, 205, 94, 59, 47, 241, 132, 58, 219, 190, 205, 94, 47, 203, 100, + 58, 202, 70, 239, 140, 58, 199, 48, 4, 239, 140, 58, 219, 190, 4, 239, + 140, 59, 239, 141, 241, 132, 58, 199, 48, 4, 239, 140, 59, 239, 141, 241, + 132, 58, 219, 190, 239, 140, 239, 141, 203, 100, 58, 202, 70, 221, 198, + 58, 199, 48, 4, 221, 198, 58, 219, 190, 4, 221, 198, 59, 221, 199, 241, + 132, 58, 4, 221, 198, 202, 188, 32, 241, 61, 175, 32, 241, 61, 219, 190, + 32, 241, 61, 27, 32, 241, 61, 199, 48, 27, 32, 241, 61, 199, 48, 85, 32, + 241, 61, 236, 71, 85, 32, 241, 61, 202, 188, 208, 230, 175, 208, 230, + 219, 190, 208, 230, 27, 208, 230, 85, 208, 230, 199, 48, 85, 208, 230, + 236, 71, 85, 208, 230, 175, 235, 101, 205, 110, 250, 179, 219, 190, 235, + 101, 205, 110, 250, 179, 27, 235, 101, 205, 110, 250, 179, 85, 235, 101, + 205, 110, 250, 179, 199, 48, 85, 235, 101, 205, 110, 250, 179, 236, 71, + 85, 235, 101, 205, 110, 250, 179, 175, 206, 29, 205, 110, 250, 179, 219, + 190, 206, 29, 205, 110, 250, 179, 27, 206, 29, 205, 110, 250, 179, 85, + 206, 29, 205, 110, 250, 179, 199, 48, 85, 206, 29, 205, 110, 250, 179, + 236, 71, 85, 206, 29, 205, 110, 250, 179, 175, 237, 31, 205, 110, 250, + 179, 219, 190, 237, 31, 205, 110, 250, 179, 27, 237, 31, 205, 110, 250, + 179, 85, 237, 31, 205, 110, 250, 179, 199, 48, 85, 237, 31, 205, 110, + 250, 179, 175, 115, 212, 109, 58, 205, 7, 219, 190, 115, 212, 109, 58, + 205, 7, 115, 212, 109, 58, 205, 7, 219, 190, 115, 212, 109, 212, 170, + 205, 7, 175, 235, 7, 212, 109, 58, 205, 7, 219, 190, 235, 7, 212, 109, + 58, 205, 7, 235, 7, 212, 109, 58, 205, 7, 219, 190, 235, 7, 212, 109, + 212, 170, 205, 7, 210, 90, 175, 235, 7, 212, 109, 212, 170, 205, 7, 175, + 235, 101, 212, 109, 58, 205, 7, 85, 235, 101, 212, 109, 58, 205, 7, 219, + 190, 206, 29, 212, 109, 58, 205, 7, 85, 206, 29, 212, 109, 58, 205, 7, + 206, 29, 212, 109, 212, 170, 205, 7, 219, 190, 237, 31, 212, 109, 58, + 205, 7, 85, 237, 31, 212, 109, 58, 205, 7, 199, 48, 85, 237, 31, 212, + 109, 58, 205, 7, 85, 237, 31, 212, 109, 212, 170, 205, 7, 175, 200, 240, + 212, 109, 58, 205, 7, 85, 200, 240, 212, 109, 58, 205, 7, 85, 200, 240, + 212, 109, 212, 170, 205, 7, 46, 201, 180, 217, 104, 46, 201, 180, 46, + 205, 94, 217, 104, 46, 205, 94, 222, 228, 214, 71, 244, 249, 222, 228, + 196, 62, 244, 249, 222, 228, 233, 91, 244, 249, 222, 228, 211, 200, 244, + 249, 222, 228, 248, 30, 244, 249, 222, 228, 210, 158, 205, 94, 222, 228, + 248, 119, 205, 94, 222, 228, 214, 71, 205, 94, 222, 228, 196, 62, 205, + 94, 222, 228, 233, 91, 205, 94, 222, 228, 211, 200, 205, 94, 222, 228, + 248, 30, 205, 94, 107, 61, 3, 4, 201, 181, 250, 217, 200, 24, 61, 3, 4, + 201, 181, 250, 217, 91, 61, 3, 4, 201, 181, 250, 217, 237, 231, 61, 3, 4, + 201, 181, 250, 217, 107, 61, 3, 219, 190, 201, 181, 250, 217, 200, 24, + 61, 3, 219, 190, 201, 181, 250, 217, 91, 61, 3, 219, 190, 201, 181, 250, + 217, 237, 231, 61, 3, 219, 190, 201, 181, 250, 217, 107, 61, 3, 222, 228, + 201, 181, 250, 217, 200, 24, 61, 3, 222, 228, 201, 181, 250, 217, 91, 61, + 3, 222, 228, 201, 181, 250, 217, 237, 231, 61, 3, 222, 228, 201, 181, + 250, 217, 107, 61, 3, 4, 236, 166, 250, 217, 200, 24, 61, 3, 4, 236, 166, + 250, 217, 91, 61, 3, 4, 236, 166, 250, 217, 237, 231, 61, 3, 4, 236, 166, + 250, 217, 107, 61, 3, 236, 166, 250, 217, 200, 24, 61, 3, 236, 166, 250, + 217, 91, 61, 3, 236, 166, 250, 217, 237, 231, 61, 3, 236, 166, 250, 217, + 85, 107, 61, 3, 236, 166, 250, 217, 85, 200, 24, 61, 3, 236, 166, 250, + 217, 85, 91, 61, 3, 236, 166, 250, 217, 85, 237, 231, 61, 3, 236, 166, + 250, 217, 85, 107, 61, 3, 222, 228, 236, 166, 250, 217, 85, 200, 24, 61, + 3, 222, 228, 236, 166, 250, 217, 85, 91, 61, 3, 222, 228, 236, 166, 250, + 217, 85, 237, 231, 61, 3, 222, 228, 236, 166, 250, 217, 107, 201, 179, + 61, 3, 217, 210, 207, 35, 200, 24, 201, 179, 61, 3, 217, 210, 207, 35, + 91, 201, 179, 61, 3, 217, 210, 207, 35, 237, 231, 201, 179, 61, 3, 217, + 210, 207, 35, 107, 201, 179, 61, 3, 219, 190, 207, 35, 200, 24, 201, 179, + 61, 3, 219, 190, 207, 35, 91, 201, 179, 61, 3, 219, 190, 207, 35, 237, + 231, 201, 179, 61, 3, 219, 190, 207, 35, 107, 201, 179, 61, 3, 27, 207, 35, 200, 24, 201, 179, 61, 3, 27, 207, 35, 91, 201, 179, 61, 3, 27, 207, - 35, 237, 230, 201, 179, 61, 3, 27, 207, 35, 107, 201, 179, 61, 3, 85, + 35, 237, 231, 201, 179, 61, 3, 27, 207, 35, 107, 201, 179, 61, 3, 85, 207, 35, 200, 24, 201, 179, 61, 3, 85, 207, 35, 91, 201, 179, 61, 3, 85, - 207, 35, 237, 230, 201, 179, 61, 3, 85, 207, 35, 107, 201, 179, 61, 3, + 207, 35, 237, 231, 201, 179, 61, 3, 85, 207, 35, 107, 201, 179, 61, 3, 199, 48, 85, 207, 35, 200, 24, 201, 179, 61, 3, 199, 48, 85, 207, 35, 91, - 201, 179, 61, 3, 199, 48, 85, 207, 35, 237, 230, 201, 179, 61, 3, 199, - 48, 85, 207, 35, 107, 235, 125, 51, 200, 24, 235, 125, 51, 91, 235, 125, - 51, 237, 230, 235, 125, 51, 107, 103, 51, 200, 24, 103, 51, 91, 103, 51, - 237, 230, 103, 51, 107, 241, 158, 51, 200, 24, 241, 158, 51, 91, 241, - 158, 51, 237, 230, 241, 158, 51, 107, 85, 241, 158, 51, 200, 24, 85, 241, - 158, 51, 91, 85, 241, 158, 51, 237, 230, 85, 241, 158, 51, 107, 85, 51, - 200, 24, 85, 51, 91, 85, 51, 237, 230, 85, 51, 107, 45, 51, 200, 24, 45, - 51, 91, 45, 51, 237, 230, 45, 51, 173, 197, 89, 45, 51, 173, 237, 68, 45, - 51, 205, 159, 237, 68, 45, 51, 205, 159, 197, 89, 45, 51, 50, 53, 45, 51, + 201, 179, 61, 3, 199, 48, 85, 207, 35, 237, 231, 201, 179, 61, 3, 199, + 48, 85, 207, 35, 107, 235, 126, 51, 200, 24, 235, 126, 51, 91, 235, 126, + 51, 237, 231, 235, 126, 51, 107, 103, 51, 200, 24, 103, 51, 91, 103, 51, + 237, 231, 103, 51, 107, 241, 159, 51, 200, 24, 241, 159, 51, 91, 241, + 159, 51, 237, 231, 241, 159, 51, 107, 85, 241, 159, 51, 200, 24, 85, 241, + 159, 51, 91, 85, 241, 159, 51, 237, 231, 85, 241, 159, 51, 107, 85, 51, + 200, 24, 85, 51, 91, 85, 51, 237, 231, 85, 51, 107, 45, 51, 200, 24, 45, + 51, 91, 45, 51, 237, 231, 45, 51, 173, 197, 89, 45, 51, 173, 237, 69, 45, + 51, 205, 159, 237, 69, 45, 51, 205, 159, 197, 89, 45, 51, 50, 53, 45, 51, 124, 135, 45, 51, 197, 61, 107, 175, 165, 51, 197, 61, 200, 24, 175, 165, - 51, 197, 61, 91, 175, 165, 51, 197, 61, 237, 230, 175, 165, 51, 197, 61, - 173, 197, 89, 175, 165, 51, 197, 61, 173, 237, 68, 175, 165, 51, 197, 61, - 205, 159, 237, 68, 175, 165, 51, 197, 61, 205, 159, 197, 89, 175, 165, + 51, 197, 61, 91, 175, 165, 51, 197, 61, 237, 231, 175, 165, 51, 197, 61, + 173, 197, 89, 175, 165, 51, 197, 61, 173, 237, 69, 175, 165, 51, 197, 61, + 205, 159, 237, 69, 175, 165, 51, 197, 61, 205, 159, 197, 89, 175, 165, 51, 197, 61, 107, 165, 51, 197, 61, 200, 24, 165, 51, 197, 61, 91, 165, - 51, 197, 61, 237, 230, 165, 51, 197, 61, 173, 197, 89, 165, 51, 197, 61, - 173, 237, 68, 165, 51, 197, 61, 205, 159, 237, 68, 165, 51, 197, 61, 205, - 159, 197, 89, 165, 51, 197, 61, 107, 219, 189, 165, 51, 197, 61, 200, 24, - 219, 189, 165, 51, 197, 61, 91, 219, 189, 165, 51, 197, 61, 237, 230, - 219, 189, 165, 51, 197, 61, 173, 197, 89, 219, 189, 165, 51, 197, 61, - 173, 237, 68, 219, 189, 165, 51, 197, 61, 205, 159, 237, 68, 219, 189, - 165, 51, 197, 61, 205, 159, 197, 89, 219, 189, 165, 51, 197, 61, 107, 85, + 51, 197, 61, 237, 231, 165, 51, 197, 61, 173, 197, 89, 165, 51, 197, 61, + 173, 237, 69, 165, 51, 197, 61, 205, 159, 237, 69, 165, 51, 197, 61, 205, + 159, 197, 89, 165, 51, 197, 61, 107, 219, 190, 165, 51, 197, 61, 200, 24, + 219, 190, 165, 51, 197, 61, 91, 219, 190, 165, 51, 197, 61, 237, 231, + 219, 190, 165, 51, 197, 61, 173, 197, 89, 219, 190, 165, 51, 197, 61, + 173, 237, 69, 219, 190, 165, 51, 197, 61, 205, 159, 237, 69, 219, 190, + 165, 51, 197, 61, 205, 159, 197, 89, 219, 190, 165, 51, 197, 61, 107, 85, 165, 51, 197, 61, 200, 24, 85, 165, 51, 197, 61, 91, 85, 165, 51, 197, - 61, 237, 230, 85, 165, 51, 197, 61, 173, 197, 89, 85, 165, 51, 197, 61, - 173, 237, 68, 85, 165, 51, 197, 61, 205, 159, 237, 68, 85, 165, 51, 197, + 61, 237, 231, 85, 165, 51, 197, 61, 173, 197, 89, 85, 165, 51, 197, 61, + 173, 237, 69, 85, 165, 51, 197, 61, 205, 159, 237, 69, 85, 165, 51, 197, 61, 205, 159, 197, 89, 85, 165, 51, 197, 61, 107, 199, 48, 85, 165, 51, 197, 61, 200, 24, 199, 48, 85, 165, 51, 197, 61, 91, 199, 48, 85, 165, - 51, 197, 61, 237, 230, 199, 48, 85, 165, 51, 197, 61, 173, 197, 89, 199, - 48, 85, 165, 51, 197, 61, 173, 237, 68, 199, 48, 85, 165, 51, 197, 61, - 205, 159, 237, 68, 199, 48, 85, 165, 51, 197, 61, 205, 159, 197, 89, 199, - 48, 85, 165, 51, 107, 201, 181, 250, 216, 200, 24, 201, 181, 250, 216, - 91, 201, 181, 250, 216, 237, 230, 201, 181, 250, 216, 107, 59, 61, 197, - 39, 201, 181, 250, 216, 200, 24, 59, 61, 197, 39, 201, 181, 250, 216, 91, - 59, 61, 197, 39, 201, 181, 250, 216, 237, 230, 59, 61, 197, 39, 201, 181, - 250, 216, 107, 61, 3, 216, 14, 203, 135, 200, 24, 61, 3, 216, 14, 203, - 135, 91, 61, 3, 216, 14, 203, 135, 237, 230, 61, 3, 216, 14, 203, 135, + 51, 197, 61, 237, 231, 199, 48, 85, 165, 51, 197, 61, 173, 197, 89, 199, + 48, 85, 165, 51, 197, 61, 173, 237, 69, 199, 48, 85, 165, 51, 197, 61, + 205, 159, 237, 69, 199, 48, 85, 165, 51, 197, 61, 205, 159, 197, 89, 199, + 48, 85, 165, 51, 107, 201, 181, 250, 217, 200, 24, 201, 181, 250, 217, + 91, 201, 181, 250, 217, 237, 231, 201, 181, 250, 217, 107, 59, 61, 197, + 39, 201, 181, 250, 217, 200, 24, 59, 61, 197, 39, 201, 181, 250, 217, 91, + 59, 61, 197, 39, 201, 181, 250, 217, 237, 231, 59, 61, 197, 39, 201, 181, + 250, 217, 107, 61, 3, 216, 15, 203, 135, 200, 24, 61, 3, 216, 15, 203, + 135, 91, 61, 3, 216, 15, 203, 135, 237, 231, 61, 3, 216, 15, 203, 135, 85, 61, 207, 36, 197, 59, 100, 85, 61, 207, 36, 197, 59, 99, 202, 181, - 85, 61, 207, 36, 197, 59, 97, 232, 224, 85, 61, 207, 36, 197, 59, 97, - 202, 184, 107, 248, 81, 59, 51, 91, 248, 84, 207, 38, 59, 51, 107, 201, - 243, 207, 38, 59, 51, 91, 201, 243, 207, 38, 59, 51, 107, 222, 177, 59, - 51, 91, 210, 16, 59, 51, 107, 210, 16, 59, 51, 91, 222, 177, 59, 51, 107, - 249, 136, 207, 37, 59, 51, 91, 249, 136, 207, 37, 59, 51, 107, 234, 231, - 207, 37, 59, 51, 91, 234, 231, 207, 37, 59, 51, 59, 61, 207, 36, 197, 59, - 100, 59, 61, 207, 36, 197, 59, 99, 202, 181, 46, 241, 61, 235, 20, 3, - 235, 6, 238, 249, 46, 241, 61, 235, 20, 3, 99, 238, 249, 46, 241, 61, - 235, 19, 50, 157, 244, 249, 3, 235, 6, 238, 249, 50, 157, 244, 249, 3, - 115, 238, 249, 50, 157, 244, 249, 3, 99, 238, 249, 50, 157, 244, 249, 3, - 238, 252, 50, 157, 244, 248, 237, 231, 235, 225, 122, 237, 231, 235, 225, - 216, 14, 122, 237, 231, 235, 225, 231, 164, 3, 238, 252, 237, 231, 235, - 225, 216, 14, 231, 164, 3, 238, 252, 59, 232, 125, 248, 29, 232, 125, - 212, 173, 232, 208, 195, 20, 235, 232, 218, 212, 235, 232, 235, 233, 3, - 202, 205, 217, 91, 235, 232, 202, 186, 235, 232, 235, 233, 3, 232, 135, - 209, 220, 235, 232, 231, 65, 235, 232, 2, 77, 202, 218, 231, 100, 247, - 152, 219, 207, 232, 208, 210, 214, 249, 138, 77, 232, 208, 222, 182, 235, - 105, 210, 21, 235, 105, 232, 182, 232, 209, 3, 132, 26, 112, 235, 122, - 241, 57, 230, 248, 221, 208, 195, 231, 232, 209, 55, 235, 233, 3, 241, - 81, 232, 164, 244, 191, 235, 232, 217, 198, 235, 232, 209, 210, 214, 119, - 202, 218, 235, 69, 222, 213, 237, 211, 235, 232, 221, 145, 235, 232, 235, - 233, 213, 205, 205, 210, 235, 232, 235, 233, 3, 97, 236, 65, 210, 213, - 233, 86, 235, 233, 3, 205, 8, 236, 58, 233, 86, 235, 233, 3, 97, 222, - 227, 26, 97, 4, 236, 66, 235, 233, 3, 235, 127, 241, 84, 244, 202, 222, - 58, 207, 82, 235, 233, 3, 203, 250, 241, 84, 218, 163, 205, 218, 235, - 233, 3, 205, 218, 236, 59, 26, 232, 209, 241, 84, 218, 163, 235, 233, 3, - 192, 218, 164, 198, 234, 206, 196, 235, 233, 3, 236, 81, 232, 136, 212, - 29, 197, 21, 248, 49, 213, 204, 124, 202, 19, 207, 111, 212, 17, 220, 62, - 226, 86, 200, 248, 218, 178, 245, 36, 206, 155, 213, 28, 239, 13, 247, - 96, 225, 104, 235, 167, 218, 237, 213, 51, 196, 251, 197, 128, 212, 96, - 232, 187, 239, 54, 220, 8, 197, 53, 235, 61, 237, 206, 3, 237, 204, 244, - 209, 233, 155, 201, 20, 233, 156, 205, 107, 233, 141, 217, 87, 210, 23, - 235, 112, 212, 148, 219, 195, 208, 136, 212, 148, 219, 195, 202, 185, - 212, 148, 219, 195, 248, 68, 233, 150, 220, 18, 250, 205, 200, 53, 241, - 18, 204, 228, 223, 66, 204, 238, 26, 249, 102, 205, 185, 235, 53, 239, - 77, 241, 64, 250, 127, 241, 33, 249, 129, 212, 65, 247, 100, 249, 115, - 248, 52, 233, 90, 208, 238, 207, 28, 213, 191, 77, 235, 38, 204, 177, - 235, 80, 237, 44, 233, 157, 77, 219, 31, 213, 85, 224, 50, 213, 187, 237, - 188, 235, 15, 241, 114, 203, 127, 248, 69, 245, 42, 248, 74, 3, 205, 107, - 241, 27, 3, 204, 210, 244, 176, 248, 33, 212, 212, 212, 21, 241, 1, 77, - 219, 198, 208, 214, 247, 128, 235, 38, 222, 190, 233, 89, 220, 53, 218, - 189, 247, 159, 249, 118, 205, 218, 235, 233, 3, 205, 218, 236, 59, 26, - 115, 232, 123, 196, 76, 235, 232, 235, 233, 3, 213, 128, 231, 102, 26, - 213, 128, 232, 164, 235, 233, 3, 200, 57, 236, 59, 26, 197, 119, 218, - 163, 214, 24, 235, 232, 234, 243, 235, 232, 235, 233, 3, 212, 135, 236, - 58, 208, 202, 223, 75, 244, 178, 233, 137, 232, 41, 248, 96, 235, 82, - 206, 194, 241, 78, 222, 62, 235, 232, 208, 158, 201, 8, 200, 55, 235, - 232, 237, 78, 237, 196, 249, 55, 207, 14, 214, 14, 234, 254, 235, 232, - 247, 228, 239, 233, 233, 123, 222, 41, 210, 76, 206, 157, 205, 88, 233, - 169, 235, 232, 195, 86, 235, 232, 232, 118, 208, 187, 203, 215, 241, 67, - 225, 11, 222, 33, 213, 87, 232, 33, 213, 134, 210, 238, 222, 4, 218, 180, - 219, 67, 249, 124, 204, 65, 205, 230, 214, 41, 214, 69, 205, 253, 235, - 84, 214, 4, 233, 59, 239, 16, 212, 6, 247, 130, 236, 235, 244, 148, 210, - 157, 232, 232, 236, 235, 244, 148, 241, 17, 232, 232, 236, 235, 244, 148, - 249, 104, 236, 235, 244, 148, 59, 232, 232, 248, 103, 222, 171, 235, 36, - 201, 244, 204, 97, 204, 92, 209, 4, 199, 46, 237, 76, 3, 232, 127, 251, - 198, 218, 174, 197, 75, 220, 45, 197, 75, 219, 197, 250, 230, 219, 197, - 222, 171, 245, 93, 197, 100, 241, 25, 208, 234, 207, 32, 248, 201, 248, - 69, 234, 79, 214, 107, 235, 214, 197, 155, 247, 229, 220, 2, 237, 215, - 230, 201, 241, 35, 205, 10, 213, 27, 224, 22, 213, 27, 239, 249, 213, 27, - 235, 233, 3, 218, 207, 251, 248, 245, 65, 214, 131, 251, 248, 249, 0, - 213, 27, 213, 28, 3, 232, 131, 213, 28, 226, 86, 204, 245, 209, 202, 213, - 28, 244, 211, 213, 28, 226, 86, 221, 213, 212, 77, 220, 91, 235, 216, - 199, 141, 219, 151, 236, 249, 234, 30, 195, 9, 248, 59, 214, 70, 232, - 125, 248, 166, 247, 124, 208, 171, 233, 149, 244, 178, 205, 188, 210, - 157, 233, 181, 236, 193, 235, 116, 225, 165, 211, 187, 212, 211, 203, 3, - 201, 30, 213, 12, 239, 74, 239, 29, 52, 232, 106, 244, 153, 252, 32, 235, - 118, 236, 75, 201, 246, 248, 41, 220, 90, 221, 180, 221, 214, 248, 85, - 205, 108, 77, 202, 156, 249, 103, 77, 196, 89, 209, 4, 212, 175, 203, 51, - 249, 1, 248, 30, 249, 60, 209, 213, 77, 213, 160, 249, 79, 77, 205, 191, - 205, 109, 210, 173, 217, 192, 251, 107, 217, 84, 245, 82, 224, 72, 217, - 84, 245, 82, 211, 79, 217, 84, 245, 82, 209, 203, 217, 84, 245, 82, 248, - 147, 217, 84, 245, 82, 224, 18, 217, 84, 245, 82, 213, 102, 59, 245, 82, - 224, 19, 209, 194, 235, 12, 239, 229, 58, 245, 82, 224, 19, 209, 194, - 235, 12, 239, 229, 217, 84, 245, 82, 224, 19, 209, 194, 235, 12, 239, - 229, 59, 245, 82, 224, 73, 209, 194, 216, 174, 239, 229, 59, 245, 82, - 211, 80, 209, 194, 216, 174, 239, 229, 59, 245, 82, 209, 204, 209, 194, - 216, 174, 239, 229, 59, 245, 82, 248, 148, 209, 194, 216, 174, 239, 229, - 59, 245, 82, 224, 19, 209, 194, 216, 174, 239, 229, 59, 245, 82, 213, - 103, 209, 194, 216, 174, 239, 229, 58, 245, 82, 224, 73, 209, 194, 216, - 174, 239, 229, 58, 245, 82, 211, 80, 209, 194, 216, 174, 239, 229, 58, - 245, 82, 209, 204, 209, 194, 216, 174, 239, 229, 58, 245, 82, 248, 148, - 209, 194, 216, 174, 239, 229, 58, 245, 82, 224, 19, 209, 194, 216, 174, - 239, 229, 58, 245, 82, 213, 103, 209, 194, 216, 174, 239, 229, 217, 84, - 245, 82, 224, 73, 209, 194, 216, 174, 239, 229, 217, 84, 245, 82, 211, - 80, 209, 194, 216, 174, 239, 229, 217, 84, 245, 82, 209, 204, 209, 194, - 216, 174, 239, 229, 217, 84, 245, 82, 248, 148, 209, 194, 216, 174, 239, - 229, 217, 84, 245, 82, 224, 19, 209, 194, 216, 174, 239, 229, 217, 84, - 245, 82, 213, 103, 209, 194, 216, 174, 239, 229, 59, 245, 82, 224, 19, - 209, 194, 97, 231, 57, 202, 176, 239, 229, 58, 245, 82, 224, 19, 209, - 194, 97, 231, 57, 202, 176, 239, 229, 217, 84, 245, 82, 224, 19, 209, - 194, 97, 231, 57, 202, 176, 239, 229, 59, 245, 82, 163, 224, 72, 59, 245, - 82, 163, 211, 79, 59, 245, 82, 163, 209, 203, 59, 245, 82, 163, 248, 147, - 59, 245, 82, 163, 224, 18, 59, 245, 82, 163, 213, 102, 58, 245, 82, 163, - 224, 72, 58, 245, 82, 163, 211, 79, 58, 245, 82, 163, 209, 203, 58, 245, - 82, 163, 248, 147, 58, 245, 82, 163, 224, 18, 58, 245, 82, 163, 213, 102, - 217, 84, 245, 82, 163, 224, 72, 217, 84, 245, 82, 163, 211, 79, 217, 84, - 245, 82, 163, 209, 203, 217, 84, 245, 82, 163, 248, 147, 217, 84, 245, - 82, 163, 224, 18, 217, 84, 245, 82, 163, 213, 102, 59, 245, 82, 224, 19, - 209, 194, 99, 231, 57, 200, 231, 239, 229, 58, 245, 82, 224, 19, 209, - 194, 99, 231, 57, 200, 231, 239, 229, 217, 84, 245, 82, 224, 19, 209, - 194, 99, 231, 57, 200, 231, 239, 229, 59, 245, 82, 224, 73, 209, 194, 99, - 231, 57, 207, 66, 239, 229, 59, 245, 82, 211, 80, 209, 194, 99, 231, 57, - 207, 66, 239, 229, 59, 245, 82, 209, 204, 209, 194, 99, 231, 57, 207, 66, - 239, 229, 59, 245, 82, 248, 148, 209, 194, 99, 231, 57, 207, 66, 239, - 229, 59, 245, 82, 224, 19, 209, 194, 99, 231, 57, 207, 66, 239, 229, 59, - 245, 82, 213, 103, 209, 194, 99, 231, 57, 207, 66, 239, 229, 58, 245, 82, - 224, 73, 209, 194, 99, 231, 57, 207, 66, 239, 229, 58, 245, 82, 211, 80, - 209, 194, 99, 231, 57, 207, 66, 239, 229, 58, 245, 82, 209, 204, 209, - 194, 99, 231, 57, 207, 66, 239, 229, 58, 245, 82, 248, 148, 209, 194, 99, - 231, 57, 207, 66, 239, 229, 58, 245, 82, 224, 19, 209, 194, 99, 231, 57, - 207, 66, 239, 229, 58, 245, 82, 213, 103, 209, 194, 99, 231, 57, 207, 66, - 239, 229, 217, 84, 245, 82, 224, 73, 209, 194, 99, 231, 57, 207, 66, 239, - 229, 217, 84, 245, 82, 211, 80, 209, 194, 99, 231, 57, 207, 66, 239, 229, - 217, 84, 245, 82, 209, 204, 209, 194, 99, 231, 57, 207, 66, 239, 229, - 217, 84, 245, 82, 248, 148, 209, 194, 99, 231, 57, 207, 66, 239, 229, - 217, 84, 245, 82, 224, 19, 209, 194, 99, 231, 57, 207, 66, 239, 229, 217, - 84, 245, 82, 213, 103, 209, 194, 99, 231, 57, 207, 66, 239, 229, 59, 245, - 82, 224, 19, 209, 194, 115, 231, 57, 235, 149, 239, 229, 58, 245, 82, - 224, 19, 209, 194, 115, 231, 57, 235, 149, 239, 229, 217, 84, 245, 82, - 224, 19, 209, 194, 115, 231, 57, 235, 149, 239, 229, 59, 245, 82, 236, - 166, 58, 245, 82, 236, 166, 217, 84, 245, 82, 236, 166, 59, 245, 82, 236, - 167, 209, 194, 216, 174, 239, 229, 58, 245, 82, 236, 167, 209, 194, 216, - 174, 239, 229, 217, 84, 245, 82, 236, 167, 209, 194, 216, 174, 239, 229, - 59, 245, 82, 224, 16, 59, 245, 82, 224, 15, 59, 245, 82, 224, 17, 58, - 245, 82, 224, 16, 58, 245, 82, 224, 15, 58, 245, 82, 224, 17, 196, 194, - 210, 157, 234, 32, 196, 194, 210, 157, 220, 55, 196, 194, 210, 157, 236, - 254, 196, 194, 210, 157, 231, 97, 196, 194, 210, 157, 245, 111, 196, 194, - 210, 157, 247, 127, 196, 194, 210, 157, 205, 180, 196, 194, 58, 234, 32, - 196, 194, 58, 220, 55, 196, 194, 58, 236, 254, 196, 194, 58, 231, 97, - 196, 194, 58, 245, 111, 196, 194, 58, 247, 127, 196, 194, 58, 205, 180, - 249, 101, 206, 193, 214, 112, 204, 52, 248, 37, 206, 167, 237, 210, 77, - 248, 123, 251, 254, 249, 87, 204, 239, 195, 244, 224, 53, 213, 154, 210, - 1, 212, 140, 247, 10, 210, 186, 250, 122, 239, 49, 222, 238, 249, 85, 12, - 15, 230, 189, 12, 15, 230, 188, 12, 15, 230, 187, 12, 15, 230, 186, 12, - 15, 230, 185, 12, 15, 230, 184, 12, 15, 230, 183, 12, 15, 230, 182, 12, - 15, 230, 181, 12, 15, 230, 180, 12, 15, 230, 179, 12, 15, 230, 178, 12, - 15, 230, 177, 12, 15, 230, 176, 12, 15, 230, 175, 12, 15, 230, 174, 12, - 15, 230, 173, 12, 15, 230, 172, 12, 15, 230, 171, 12, 15, 230, 170, 12, - 15, 230, 169, 12, 15, 230, 168, 12, 15, 230, 167, 12, 15, 230, 166, 12, - 15, 230, 165, 12, 15, 230, 164, 12, 15, 230, 163, 12, 15, 230, 162, 12, - 15, 230, 161, 12, 15, 230, 160, 12, 15, 230, 159, 12, 15, 230, 158, 12, - 15, 230, 157, 12, 15, 230, 156, 12, 15, 230, 155, 12, 15, 230, 154, 12, - 15, 230, 153, 12, 15, 230, 152, 12, 15, 230, 151, 12, 15, 230, 150, 12, - 15, 230, 149, 12, 15, 230, 148, 12, 15, 230, 147, 12, 15, 230, 146, 12, - 15, 230, 145, 12, 15, 230, 144, 12, 15, 230, 143, 12, 15, 230, 142, 12, - 15, 230, 141, 12, 15, 230, 140, 12, 15, 230, 139, 12, 15, 230, 138, 12, - 15, 230, 137, 12, 15, 230, 136, 12, 15, 230, 135, 12, 15, 230, 134, 12, - 15, 230, 133, 12, 15, 230, 132, 12, 15, 230, 131, 12, 15, 230, 130, 12, - 15, 230, 129, 12, 15, 230, 128, 12, 15, 230, 127, 12, 15, 230, 126, 12, - 15, 230, 125, 12, 15, 230, 124, 12, 15, 230, 123, 12, 15, 230, 122, 12, - 15, 230, 121, 12, 15, 230, 120, 12, 15, 230, 119, 12, 15, 230, 118, 12, - 15, 230, 117, 12, 15, 230, 116, 12, 15, 230, 115, 12, 15, 230, 114, 12, - 15, 230, 113, 12, 15, 230, 112, 12, 15, 230, 111, 12, 15, 230, 110, 12, - 15, 230, 109, 12, 15, 230, 108, 12, 15, 230, 107, 12, 15, 230, 106, 12, - 15, 230, 105, 12, 15, 230, 104, 12, 15, 230, 103, 12, 15, 230, 102, 12, - 15, 230, 101, 12, 15, 230, 100, 12, 15, 230, 99, 12, 15, 230, 98, 12, 15, - 230, 97, 12, 15, 230, 96, 12, 15, 230, 95, 12, 15, 230, 94, 12, 15, 230, - 93, 12, 15, 230, 92, 12, 15, 230, 91, 12, 15, 230, 90, 12, 15, 230, 89, - 12, 15, 230, 88, 12, 15, 230, 87, 12, 15, 230, 86, 12, 15, 230, 85, 12, - 15, 230, 84, 12, 15, 230, 83, 12, 15, 230, 82, 12, 15, 230, 81, 12, 15, - 230, 80, 12, 15, 230, 79, 12, 15, 230, 78, 12, 15, 230, 77, 12, 15, 230, - 76, 12, 15, 230, 75, 12, 15, 230, 74, 12, 15, 230, 73, 12, 15, 230, 72, - 12, 15, 230, 71, 12, 15, 230, 70, 12, 15, 230, 69, 12, 15, 230, 68, 12, - 15, 230, 67, 12, 15, 230, 66, 12, 15, 230, 65, 12, 15, 230, 64, 12, 15, - 230, 63, 12, 15, 230, 62, 12, 15, 230, 61, 12, 15, 230, 60, 12, 15, 230, - 59, 12, 15, 230, 58, 12, 15, 230, 57, 12, 15, 230, 56, 12, 15, 230, 55, - 12, 15, 230, 54, 12, 15, 230, 53, 12, 15, 230, 52, 12, 15, 230, 51, 12, - 15, 230, 50, 12, 15, 230, 49, 12, 15, 230, 48, 12, 15, 230, 47, 12, 15, - 230, 46, 12, 15, 230, 45, 12, 15, 230, 44, 12, 15, 230, 43, 12, 15, 230, - 42, 12, 15, 230, 41, 12, 15, 230, 40, 12, 15, 230, 39, 12, 15, 230, 38, - 12, 15, 230, 37, 12, 15, 230, 36, 12, 15, 230, 35, 12, 15, 230, 34, 12, - 15, 230, 33, 12, 15, 230, 32, 12, 15, 230, 31, 12, 15, 230, 30, 12, 15, - 230, 29, 12, 15, 230, 28, 12, 15, 230, 27, 12, 15, 230, 26, 12, 15, 230, - 25, 12, 15, 230, 24, 12, 15, 230, 23, 12, 15, 230, 22, 12, 15, 230, 21, - 12, 15, 230, 20, 12, 15, 230, 19, 12, 15, 230, 18, 12, 15, 230, 17, 12, - 15, 230, 16, 12, 15, 230, 15, 12, 15, 230, 14, 12, 15, 230, 13, 12, 15, - 230, 12, 12, 15, 230, 11, 12, 15, 230, 10, 12, 15, 230, 9, 12, 15, 230, - 8, 12, 15, 230, 7, 12, 15, 230, 6, 12, 15, 230, 5, 12, 15, 230, 4, 12, - 15, 230, 3, 12, 15, 230, 2, 12, 15, 230, 1, 12, 15, 230, 0, 12, 15, 229, - 255, 12, 15, 229, 254, 12, 15, 229, 253, 12, 15, 229, 252, 12, 15, 229, - 251, 12, 15, 229, 250, 12, 15, 229, 249, 12, 15, 229, 248, 12, 15, 229, - 247, 12, 15, 229, 246, 12, 15, 229, 245, 12, 15, 229, 244, 12, 15, 229, - 243, 12, 15, 229, 242, 12, 15, 229, 241, 12, 15, 229, 240, 12, 15, 229, - 239, 12, 15, 229, 238, 12, 15, 229, 237, 12, 15, 229, 236, 12, 15, 229, - 235, 12, 15, 229, 234, 12, 15, 229, 233, 12, 15, 229, 232, 12, 15, 229, - 231, 12, 15, 229, 230, 12, 15, 229, 229, 12, 15, 229, 228, 12, 15, 229, - 227, 12, 15, 229, 226, 12, 15, 229, 225, 12, 15, 229, 224, 12, 15, 229, - 223, 12, 15, 229, 222, 12, 15, 229, 221, 12, 15, 229, 220, 12, 15, 229, - 219, 12, 15, 229, 218, 12, 15, 229, 217, 12, 15, 229, 216, 12, 15, 229, - 215, 12, 15, 229, 214, 12, 15, 229, 213, 12, 15, 229, 212, 12, 15, 229, - 211, 12, 15, 229, 210, 12, 15, 229, 209, 12, 15, 229, 208, 12, 15, 229, - 207, 12, 15, 229, 206, 12, 15, 229, 205, 12, 15, 229, 204, 12, 15, 229, - 203, 12, 15, 229, 202, 12, 15, 229, 201, 12, 15, 229, 200, 12, 15, 229, - 199, 12, 15, 229, 198, 12, 15, 229, 197, 12, 15, 229, 196, 12, 15, 229, - 195, 12, 15, 229, 194, 12, 15, 229, 193, 12, 15, 229, 192, 12, 15, 229, - 191, 12, 15, 229, 190, 12, 15, 229, 189, 12, 15, 229, 188, 12, 15, 229, - 187, 12, 15, 229, 186, 12, 15, 229, 185, 12, 15, 229, 184, 12, 15, 229, - 183, 12, 15, 229, 182, 12, 15, 229, 181, 12, 15, 229, 180, 12, 15, 229, - 179, 12, 15, 229, 178, 12, 15, 229, 177, 12, 15, 229, 176, 12, 15, 229, - 175, 12, 15, 229, 174, 12, 15, 229, 173, 12, 15, 229, 172, 12, 15, 229, - 171, 12, 15, 229, 170, 12, 15, 229, 169, 12, 15, 229, 168, 12, 15, 229, - 167, 12, 15, 229, 166, 12, 15, 229, 165, 12, 15, 229, 164, 12, 15, 229, - 163, 12, 15, 229, 162, 12, 15, 229, 161, 12, 15, 229, 160, 12, 15, 229, - 159, 12, 15, 229, 158, 12, 15, 229, 157, 12, 15, 229, 156, 12, 15, 229, - 155, 12, 15, 229, 154, 12, 15, 229, 153, 12, 15, 229, 152, 12, 15, 229, - 151, 12, 15, 229, 150, 12, 15, 229, 149, 12, 15, 229, 148, 12, 15, 229, - 147, 12, 15, 229, 146, 12, 15, 229, 145, 12, 15, 229, 144, 12, 15, 229, - 143, 12, 15, 229, 142, 12, 15, 229, 141, 12, 15, 229, 140, 12, 15, 229, - 139, 12, 15, 229, 138, 12, 15, 229, 137, 12, 15, 229, 136, 12, 15, 229, - 135, 12, 15, 229, 134, 12, 15, 229, 133, 12, 15, 229, 132, 12, 15, 229, - 131, 12, 15, 229, 130, 12, 15, 229, 129, 12, 15, 229, 128, 12, 15, 229, - 127, 12, 15, 229, 126, 12, 15, 229, 125, 12, 15, 229, 124, 12, 15, 229, - 123, 12, 15, 229, 122, 12, 15, 229, 121, 12, 15, 229, 120, 12, 15, 229, - 119, 12, 15, 229, 118, 12, 15, 229, 117, 12, 15, 229, 116, 12, 15, 229, - 115, 12, 15, 229, 114, 12, 15, 229, 113, 12, 15, 229, 112, 12, 15, 229, - 111, 12, 15, 229, 110, 12, 15, 229, 109, 12, 15, 229, 108, 12, 15, 229, - 107, 12, 15, 229, 106, 12, 15, 229, 105, 12, 15, 229, 104, 12, 15, 229, - 103, 12, 15, 229, 102, 12, 15, 229, 101, 12, 15, 229, 100, 12, 15, 229, - 99, 12, 15, 229, 98, 12, 15, 229, 97, 12, 15, 229, 96, 12, 15, 229, 95, - 12, 15, 229, 94, 12, 15, 229, 93, 12, 15, 229, 92, 12, 15, 229, 91, 12, - 15, 229, 90, 12, 15, 229, 89, 12, 15, 229, 88, 12, 15, 229, 87, 12, 15, - 229, 86, 12, 15, 229, 85, 12, 15, 229, 84, 12, 15, 229, 83, 12, 15, 229, - 82, 12, 15, 229, 81, 12, 15, 229, 80, 12, 15, 229, 79, 12, 15, 229, 78, - 12, 15, 229, 77, 12, 15, 229, 76, 12, 15, 229, 75, 12, 15, 229, 74, 12, - 15, 229, 73, 12, 15, 229, 72, 12, 15, 229, 71, 12, 15, 229, 70, 12, 15, - 229, 69, 12, 15, 229, 68, 12, 15, 229, 67, 12, 15, 229, 66, 12, 15, 229, - 65, 12, 15, 229, 64, 12, 15, 229, 63, 12, 15, 229, 62, 12, 15, 229, 61, - 12, 15, 229, 60, 12, 15, 229, 59, 12, 15, 229, 58, 12, 15, 229, 57, 12, - 15, 229, 56, 12, 15, 229, 55, 12, 15, 229, 54, 12, 15, 229, 53, 12, 15, - 229, 52, 12, 15, 229, 51, 12, 15, 229, 50, 12, 15, 229, 49, 12, 15, 229, - 48, 12, 15, 229, 47, 12, 15, 229, 46, 12, 15, 229, 45, 12, 15, 229, 44, - 12, 15, 229, 43, 12, 15, 229, 42, 12, 15, 229, 41, 12, 15, 229, 40, 12, - 15, 229, 39, 12, 15, 229, 38, 12, 15, 229, 37, 12, 15, 229, 36, 12, 15, - 229, 35, 12, 15, 229, 34, 12, 15, 229, 33, 12, 15, 229, 32, 12, 15, 229, - 31, 12, 15, 229, 30, 12, 15, 229, 29, 12, 15, 229, 28, 12, 15, 229, 27, - 12, 15, 229, 26, 12, 15, 229, 25, 12, 15, 229, 24, 12, 15, 229, 23, 12, - 15, 229, 22, 12, 15, 229, 21, 12, 15, 229, 20, 12, 15, 229, 19, 12, 15, - 229, 18, 12, 15, 229, 17, 12, 15, 229, 16, 12, 15, 229, 15, 12, 15, 229, - 14, 12, 15, 229, 13, 12, 15, 229, 12, 12, 15, 229, 11, 12, 15, 229, 10, - 12, 15, 229, 9, 12, 15, 229, 8, 12, 15, 229, 7, 12, 15, 229, 6, 12, 15, - 229, 5, 12, 15, 229, 4, 12, 15, 229, 3, 12, 15, 229, 2, 12, 15, 229, 1, - 12, 15, 229, 0, 12, 15, 228, 255, 12, 15, 228, 254, 12, 15, 228, 253, 12, - 15, 228, 252, 12, 15, 228, 251, 12, 15, 228, 250, 12, 15, 228, 249, 12, - 15, 228, 248, 12, 15, 228, 247, 12, 15, 228, 246, 12, 15, 228, 245, 12, - 15, 228, 244, 12, 15, 228, 243, 12, 15, 228, 242, 12, 15, 228, 241, 12, - 15, 228, 240, 12, 15, 228, 239, 12, 15, 228, 238, 12, 15, 228, 237, 12, - 15, 228, 236, 12, 15, 228, 235, 12, 15, 228, 234, 12, 15, 228, 233, 12, - 15, 228, 232, 12, 15, 228, 231, 12, 15, 228, 230, 12, 15, 228, 229, 12, - 15, 228, 228, 12, 15, 228, 227, 12, 15, 228, 226, 12, 15, 228, 225, 12, - 15, 228, 224, 12, 15, 228, 223, 12, 15, 228, 222, 12, 15, 228, 221, 12, - 15, 228, 220, 12, 15, 228, 219, 12, 15, 228, 218, 12, 15, 228, 217, 12, - 15, 228, 216, 12, 15, 228, 215, 12, 15, 228, 214, 12, 15, 228, 213, 12, - 15, 228, 212, 12, 15, 228, 211, 12, 15, 228, 210, 12, 15, 228, 209, 12, - 15, 228, 208, 12, 15, 228, 207, 12, 15, 228, 206, 12, 15, 228, 205, 12, - 15, 228, 204, 12, 15, 228, 203, 12, 15, 228, 202, 12, 15, 228, 201, 12, - 15, 228, 200, 12, 15, 228, 199, 12, 15, 228, 198, 12, 15, 228, 197, 12, - 15, 228, 196, 12, 15, 228, 195, 12, 15, 228, 194, 12, 15, 228, 193, 12, - 15, 228, 192, 12, 15, 228, 191, 12, 15, 228, 190, 12, 15, 228, 189, 12, - 15, 228, 188, 12, 15, 228, 187, 12, 15, 228, 186, 12, 15, 228, 185, 12, - 15, 228, 184, 12, 15, 228, 183, 12, 15, 228, 182, 12, 15, 228, 181, 12, - 15, 228, 180, 12, 15, 228, 179, 12, 15, 228, 178, 12, 15, 228, 177, 12, - 15, 228, 176, 12, 15, 228, 175, 12, 15, 228, 174, 12, 15, 228, 173, 12, - 15, 228, 172, 12, 15, 228, 171, 12, 15, 228, 170, 12, 15, 228, 169, 12, - 15, 228, 168, 12, 15, 228, 167, 12, 15, 228, 166, 12, 15, 228, 165, 12, - 15, 228, 164, 12, 15, 228, 163, 12, 15, 228, 162, 12, 15, 228, 161, 12, - 15, 228, 160, 222, 233, 203, 143, 184, 205, 148, 184, 236, 89, 78, 184, - 211, 61, 78, 184, 31, 55, 184, 239, 9, 55, 184, 213, 44, 55, 184, 251, - 110, 184, 251, 29, 184, 50, 213, 139, 184, 53, 213, 139, 184, 250, 178, - 184, 98, 55, 184, 244, 158, 184, 231, 5, 184, 234, 216, 204, 226, 184, - 205, 177, 184, 17, 195, 79, 184, 17, 100, 184, 17, 102, 184, 17, 134, - 184, 17, 136, 184, 17, 146, 184, 17, 167, 184, 17, 178, 184, 17, 171, - 184, 17, 182, 184, 244, 167, 184, 207, 105, 184, 222, 139, 55, 184, 236, - 171, 55, 184, 233, 93, 55, 184, 211, 78, 78, 184, 244, 156, 250, 167, - 184, 8, 6, 1, 63, 184, 8, 6, 1, 250, 111, 184, 8, 6, 1, 247, 206, 184, 8, - 6, 1, 240, 230, 184, 8, 6, 1, 69, 184, 8, 6, 1, 236, 48, 184, 8, 6, 1, - 234, 189, 184, 8, 6, 1, 233, 14, 184, 8, 6, 1, 68, 184, 8, 6, 1, 225, - 216, 184, 8, 6, 1, 225, 79, 184, 8, 6, 1, 159, 184, 8, 6, 1, 221, 135, - 184, 8, 6, 1, 218, 54, 184, 8, 6, 1, 72, 184, 8, 6, 1, 214, 2, 184, 8, 6, - 1, 211, 166, 184, 8, 6, 1, 144, 184, 8, 6, 1, 209, 80, 184, 8, 6, 1, 203, - 216, 184, 8, 6, 1, 66, 184, 8, 6, 1, 199, 230, 184, 8, 6, 1, 197, 199, - 184, 8, 6, 1, 196, 222, 184, 8, 6, 1, 196, 148, 184, 8, 6, 1, 195, 158, - 184, 50, 47, 179, 184, 210, 90, 205, 177, 184, 53, 47, 179, 184, 244, - 240, 252, 21, 184, 126, 222, 74, 184, 233, 100, 252, 21, 184, 8, 4, 1, - 63, 184, 8, 4, 1, 250, 111, 184, 8, 4, 1, 247, 206, 184, 8, 4, 1, 240, - 230, 184, 8, 4, 1, 69, 184, 8, 4, 1, 236, 48, 184, 8, 4, 1, 234, 189, - 184, 8, 4, 1, 233, 14, 184, 8, 4, 1, 68, 184, 8, 4, 1, 225, 216, 184, 8, - 4, 1, 225, 79, 184, 8, 4, 1, 159, 184, 8, 4, 1, 221, 135, 184, 8, 4, 1, - 218, 54, 184, 8, 4, 1, 72, 184, 8, 4, 1, 214, 2, 184, 8, 4, 1, 211, 166, + 85, 61, 207, 36, 197, 59, 97, 232, 225, 85, 61, 207, 36, 197, 59, 97, + 202, 184, 107, 248, 82, 59, 51, 91, 248, 85, 207, 38, 59, 51, 107, 201, + 243, 207, 38, 59, 51, 91, 201, 243, 207, 38, 59, 51, 107, 222, 178, 59, + 51, 91, 210, 16, 59, 51, 107, 210, 16, 59, 51, 91, 222, 178, 59, 51, 107, + 249, 137, 207, 37, 59, 51, 91, 249, 137, 207, 37, 59, 51, 107, 234, 232, + 207, 37, 59, 51, 91, 234, 232, 207, 37, 59, 51, 59, 61, 207, 36, 197, 59, + 100, 59, 61, 207, 36, 197, 59, 99, 202, 181, 46, 241, 62, 235, 21, 3, + 235, 7, 238, 250, 46, 241, 62, 235, 21, 3, 99, 238, 250, 46, 241, 62, + 235, 20, 50, 157, 244, 250, 3, 235, 7, 238, 250, 50, 157, 244, 250, 3, + 115, 238, 250, 50, 157, 244, 250, 3, 99, 238, 250, 50, 157, 244, 250, 3, + 238, 253, 50, 157, 244, 249, 237, 232, 235, 226, 122, 237, 232, 235, 226, + 216, 15, 122, 237, 232, 235, 226, 231, 165, 3, 238, 253, 237, 232, 235, + 226, 216, 15, 231, 165, 3, 238, 253, 59, 232, 126, 248, 30, 232, 126, + 212, 174, 232, 209, 195, 20, 235, 233, 218, 213, 235, 233, 235, 234, 3, + 202, 205, 217, 92, 235, 233, 202, 186, 235, 233, 235, 234, 3, 232, 136, + 209, 220, 235, 233, 231, 66, 235, 233, 2, 77, 202, 218, 231, 101, 247, + 153, 219, 208, 232, 209, 210, 215, 249, 139, 77, 232, 209, 222, 183, 235, + 106, 210, 21, 235, 106, 232, 183, 232, 210, 3, 132, 26, 112, 235, 123, + 241, 58, 230, 249, 221, 209, 195, 231, 232, 210, 55, 235, 234, 3, 241, + 82, 232, 165, 244, 192, 235, 233, 217, 199, 235, 233, 209, 210, 214, 120, + 202, 218, 235, 70, 222, 214, 237, 212, 235, 233, 221, 146, 235, 233, 235, + 234, 213, 206, 205, 210, 235, 233, 235, 234, 3, 97, 236, 66, 210, 214, + 233, 87, 235, 234, 3, 205, 8, 236, 59, 233, 87, 235, 234, 3, 97, 222, + 228, 26, 97, 4, 236, 67, 235, 234, 3, 235, 128, 241, 85, 244, 203, 222, + 59, 207, 82, 235, 234, 3, 203, 250, 241, 85, 218, 164, 205, 218, 235, + 234, 3, 205, 218, 236, 60, 26, 232, 210, 241, 85, 218, 164, 235, 234, 3, + 192, 218, 165, 198, 234, 206, 196, 235, 234, 3, 236, 82, 232, 137, 212, + 30, 197, 21, 248, 50, 213, 205, 124, 202, 19, 207, 111, 212, 18, 220, 63, + 226, 87, 200, 248, 218, 179, 245, 37, 206, 155, 213, 29, 239, 14, 247, + 97, 225, 105, 235, 168, 218, 238, 213, 52, 196, 251, 197, 128, 212, 97, + 232, 188, 239, 55, 220, 9, 197, 53, 235, 62, 237, 207, 3, 237, 205, 244, + 210, 233, 156, 201, 20, 233, 157, 205, 107, 233, 142, 217, 88, 210, 23, + 235, 113, 212, 149, 219, 196, 208, 136, 212, 149, 219, 196, 202, 185, + 212, 149, 219, 196, 248, 69, 233, 151, 220, 19, 250, 206, 200, 53, 241, + 19, 204, 228, 223, 67, 204, 238, 26, 249, 103, 205, 185, 235, 54, 239, + 78, 241, 65, 250, 128, 241, 34, 249, 130, 212, 66, 247, 101, 249, 116, + 248, 53, 233, 91, 208, 238, 207, 28, 213, 192, 77, 235, 39, 204, 177, + 235, 81, 237, 45, 233, 158, 77, 219, 32, 213, 86, 224, 51, 213, 188, 237, + 189, 235, 16, 241, 115, 203, 127, 248, 70, 245, 43, 248, 75, 3, 205, 107, + 241, 28, 3, 204, 210, 244, 177, 248, 34, 212, 213, 212, 22, 241, 2, 77, + 219, 199, 208, 214, 247, 129, 235, 39, 222, 191, 233, 90, 220, 54, 218, + 190, 247, 160, 249, 119, 205, 218, 235, 234, 3, 205, 218, 236, 60, 26, + 115, 232, 124, 196, 76, 235, 233, 235, 234, 3, 213, 129, 231, 103, 26, + 213, 129, 232, 165, 235, 234, 3, 200, 57, 236, 60, 26, 197, 119, 218, + 164, 214, 25, 235, 233, 234, 244, 235, 233, 235, 234, 3, 212, 136, 236, + 59, 208, 202, 223, 76, 244, 179, 233, 138, 232, 42, 248, 97, 235, 83, + 206, 194, 241, 79, 222, 63, 235, 233, 208, 158, 201, 8, 200, 55, 235, + 233, 237, 79, 237, 197, 249, 56, 207, 14, 214, 15, 234, 255, 235, 233, + 247, 229, 239, 234, 233, 124, 222, 42, 210, 76, 206, 157, 205, 88, 233, + 170, 235, 233, 195, 86, 235, 233, 232, 119, 208, 187, 203, 215, 241, 68, + 225, 12, 222, 34, 213, 88, 232, 34, 213, 135, 210, 239, 222, 5, 218, 181, + 219, 68, 249, 125, 204, 65, 205, 230, 214, 42, 214, 70, 205, 253, 235, + 85, 214, 5, 233, 60, 239, 17, 212, 7, 247, 131, 236, 236, 244, 149, 210, + 158, 232, 233, 236, 236, 244, 149, 241, 18, 232, 233, 236, 236, 244, 149, + 249, 105, 236, 236, 244, 149, 59, 232, 233, 248, 104, 222, 172, 235, 37, + 201, 244, 204, 97, 204, 92, 209, 4, 199, 46, 237, 77, 3, 232, 128, 251, + 199, 218, 175, 197, 75, 220, 46, 197, 75, 219, 198, 250, 231, 219, 198, + 222, 172, 245, 94, 197, 100, 241, 26, 208, 234, 207, 32, 248, 202, 248, + 70, 234, 80, 214, 108, 235, 215, 197, 155, 247, 230, 220, 3, 237, 216, + 230, 202, 241, 36, 205, 10, 213, 28, 224, 23, 213, 28, 239, 250, 213, 28, + 235, 234, 3, 218, 208, 251, 249, 245, 66, 214, 132, 251, 249, 249, 1, + 213, 28, 213, 29, 3, 232, 132, 213, 29, 226, 87, 204, 245, 209, 202, 213, + 29, 244, 212, 213, 29, 226, 87, 221, 214, 212, 78, 220, 92, 235, 217, + 199, 141, 219, 152, 236, 250, 234, 31, 195, 9, 248, 60, 214, 71, 232, + 126, 248, 167, 247, 125, 208, 171, 233, 150, 244, 179, 205, 188, 210, + 158, 233, 182, 236, 194, 235, 117, 225, 166, 211, 188, 212, 212, 203, 3, + 201, 30, 213, 13, 239, 75, 239, 30, 52, 232, 107, 244, 154, 252, 33, 235, + 119, 236, 76, 201, 246, 248, 42, 220, 91, 221, 181, 221, 215, 248, 86, + 205, 108, 77, 202, 156, 249, 104, 77, 196, 89, 209, 4, 212, 176, 203, 51, + 249, 2, 248, 31, 249, 61, 209, 213, 77, 213, 161, 249, 80, 77, 205, 191, + 205, 109, 210, 174, 217, 193, 251, 108, 217, 85, 245, 83, 224, 73, 217, + 85, 245, 83, 211, 80, 217, 85, 245, 83, 209, 203, 217, 85, 245, 83, 248, + 148, 217, 85, 245, 83, 224, 19, 217, 85, 245, 83, 213, 103, 59, 245, 83, + 224, 20, 209, 194, 235, 13, 239, 230, 58, 245, 83, 224, 20, 209, 194, + 235, 13, 239, 230, 217, 85, 245, 83, 224, 20, 209, 194, 235, 13, 239, + 230, 59, 245, 83, 224, 74, 209, 194, 216, 175, 239, 230, 59, 245, 83, + 211, 81, 209, 194, 216, 175, 239, 230, 59, 245, 83, 209, 204, 209, 194, + 216, 175, 239, 230, 59, 245, 83, 248, 149, 209, 194, 216, 175, 239, 230, + 59, 245, 83, 224, 20, 209, 194, 216, 175, 239, 230, 59, 245, 83, 213, + 104, 209, 194, 216, 175, 239, 230, 58, 245, 83, 224, 74, 209, 194, 216, + 175, 239, 230, 58, 245, 83, 211, 81, 209, 194, 216, 175, 239, 230, 58, + 245, 83, 209, 204, 209, 194, 216, 175, 239, 230, 58, 245, 83, 248, 149, + 209, 194, 216, 175, 239, 230, 58, 245, 83, 224, 20, 209, 194, 216, 175, + 239, 230, 58, 245, 83, 213, 104, 209, 194, 216, 175, 239, 230, 217, 85, + 245, 83, 224, 74, 209, 194, 216, 175, 239, 230, 217, 85, 245, 83, 211, + 81, 209, 194, 216, 175, 239, 230, 217, 85, 245, 83, 209, 204, 209, 194, + 216, 175, 239, 230, 217, 85, 245, 83, 248, 149, 209, 194, 216, 175, 239, + 230, 217, 85, 245, 83, 224, 20, 209, 194, 216, 175, 239, 230, 217, 85, + 245, 83, 213, 104, 209, 194, 216, 175, 239, 230, 59, 245, 83, 224, 20, + 209, 194, 97, 231, 58, 202, 176, 239, 230, 58, 245, 83, 224, 20, 209, + 194, 97, 231, 58, 202, 176, 239, 230, 217, 85, 245, 83, 224, 20, 209, + 194, 97, 231, 58, 202, 176, 239, 230, 59, 245, 83, 163, 224, 73, 59, 245, + 83, 163, 211, 80, 59, 245, 83, 163, 209, 203, 59, 245, 83, 163, 248, 148, + 59, 245, 83, 163, 224, 19, 59, 245, 83, 163, 213, 103, 58, 245, 83, 163, + 224, 73, 58, 245, 83, 163, 211, 80, 58, 245, 83, 163, 209, 203, 58, 245, + 83, 163, 248, 148, 58, 245, 83, 163, 224, 19, 58, 245, 83, 163, 213, 103, + 217, 85, 245, 83, 163, 224, 73, 217, 85, 245, 83, 163, 211, 80, 217, 85, + 245, 83, 163, 209, 203, 217, 85, 245, 83, 163, 248, 148, 217, 85, 245, + 83, 163, 224, 19, 217, 85, 245, 83, 163, 213, 103, 59, 245, 83, 224, 20, + 209, 194, 99, 231, 58, 200, 231, 239, 230, 58, 245, 83, 224, 20, 209, + 194, 99, 231, 58, 200, 231, 239, 230, 217, 85, 245, 83, 224, 20, 209, + 194, 99, 231, 58, 200, 231, 239, 230, 59, 245, 83, 224, 74, 209, 194, 99, + 231, 58, 207, 66, 239, 230, 59, 245, 83, 211, 81, 209, 194, 99, 231, 58, + 207, 66, 239, 230, 59, 245, 83, 209, 204, 209, 194, 99, 231, 58, 207, 66, + 239, 230, 59, 245, 83, 248, 149, 209, 194, 99, 231, 58, 207, 66, 239, + 230, 59, 245, 83, 224, 20, 209, 194, 99, 231, 58, 207, 66, 239, 230, 59, + 245, 83, 213, 104, 209, 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, + 224, 74, 209, 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, 211, 81, + 209, 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, 209, 204, 209, + 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, 248, 149, 209, 194, 99, + 231, 58, 207, 66, 239, 230, 58, 245, 83, 224, 20, 209, 194, 99, 231, 58, + 207, 66, 239, 230, 58, 245, 83, 213, 104, 209, 194, 99, 231, 58, 207, 66, + 239, 230, 217, 85, 245, 83, 224, 74, 209, 194, 99, 231, 58, 207, 66, 239, + 230, 217, 85, 245, 83, 211, 81, 209, 194, 99, 231, 58, 207, 66, 239, 230, + 217, 85, 245, 83, 209, 204, 209, 194, 99, 231, 58, 207, 66, 239, 230, + 217, 85, 245, 83, 248, 149, 209, 194, 99, 231, 58, 207, 66, 239, 230, + 217, 85, 245, 83, 224, 20, 209, 194, 99, 231, 58, 207, 66, 239, 230, 217, + 85, 245, 83, 213, 104, 209, 194, 99, 231, 58, 207, 66, 239, 230, 59, 245, + 83, 224, 20, 209, 194, 115, 231, 58, 235, 150, 239, 230, 58, 245, 83, + 224, 20, 209, 194, 115, 231, 58, 235, 150, 239, 230, 217, 85, 245, 83, + 224, 20, 209, 194, 115, 231, 58, 235, 150, 239, 230, 59, 245, 83, 236, + 167, 58, 245, 83, 236, 167, 217, 85, 245, 83, 236, 167, 59, 245, 83, 236, + 168, 209, 194, 216, 175, 239, 230, 58, 245, 83, 236, 168, 209, 194, 216, + 175, 239, 230, 217, 85, 245, 83, 236, 168, 209, 194, 216, 175, 239, 230, + 59, 245, 83, 224, 17, 59, 245, 83, 224, 16, 59, 245, 83, 224, 18, 58, + 245, 83, 224, 17, 58, 245, 83, 224, 16, 58, 245, 83, 224, 18, 196, 194, + 210, 158, 234, 33, 196, 194, 210, 158, 220, 56, 196, 194, 210, 158, 236, + 255, 196, 194, 210, 158, 231, 98, 196, 194, 210, 158, 245, 112, 196, 194, + 210, 158, 247, 128, 196, 194, 210, 158, 205, 180, 196, 194, 58, 234, 33, + 196, 194, 58, 220, 56, 196, 194, 58, 236, 255, 196, 194, 58, 231, 98, + 196, 194, 58, 245, 112, 196, 194, 58, 247, 128, 196, 194, 58, 205, 180, + 249, 102, 206, 193, 214, 113, 204, 52, 248, 38, 206, 167, 237, 211, 77, + 248, 124, 251, 255, 249, 88, 204, 239, 195, 244, 224, 54, 213, 155, 210, + 1, 212, 141, 247, 11, 210, 187, 250, 123, 239, 50, 222, 239, 249, 86, 12, + 15, 230, 190, 12, 15, 230, 189, 12, 15, 230, 188, 12, 15, 230, 187, 12, + 15, 230, 186, 12, 15, 230, 185, 12, 15, 230, 184, 12, 15, 230, 183, 12, + 15, 230, 182, 12, 15, 230, 181, 12, 15, 230, 180, 12, 15, 230, 179, 12, + 15, 230, 178, 12, 15, 230, 177, 12, 15, 230, 176, 12, 15, 230, 175, 12, + 15, 230, 174, 12, 15, 230, 173, 12, 15, 230, 172, 12, 15, 230, 171, 12, + 15, 230, 170, 12, 15, 230, 169, 12, 15, 230, 168, 12, 15, 230, 167, 12, + 15, 230, 166, 12, 15, 230, 165, 12, 15, 230, 164, 12, 15, 230, 163, 12, + 15, 230, 162, 12, 15, 230, 161, 12, 15, 230, 160, 12, 15, 230, 159, 12, + 15, 230, 158, 12, 15, 230, 157, 12, 15, 230, 156, 12, 15, 230, 155, 12, + 15, 230, 154, 12, 15, 230, 153, 12, 15, 230, 152, 12, 15, 230, 151, 12, + 15, 230, 150, 12, 15, 230, 149, 12, 15, 230, 148, 12, 15, 230, 147, 12, + 15, 230, 146, 12, 15, 230, 145, 12, 15, 230, 144, 12, 15, 230, 143, 12, + 15, 230, 142, 12, 15, 230, 141, 12, 15, 230, 140, 12, 15, 230, 139, 12, + 15, 230, 138, 12, 15, 230, 137, 12, 15, 230, 136, 12, 15, 230, 135, 12, + 15, 230, 134, 12, 15, 230, 133, 12, 15, 230, 132, 12, 15, 230, 131, 12, + 15, 230, 130, 12, 15, 230, 129, 12, 15, 230, 128, 12, 15, 230, 127, 12, + 15, 230, 126, 12, 15, 230, 125, 12, 15, 230, 124, 12, 15, 230, 123, 12, + 15, 230, 122, 12, 15, 230, 121, 12, 15, 230, 120, 12, 15, 230, 119, 12, + 15, 230, 118, 12, 15, 230, 117, 12, 15, 230, 116, 12, 15, 230, 115, 12, + 15, 230, 114, 12, 15, 230, 113, 12, 15, 230, 112, 12, 15, 230, 111, 12, + 15, 230, 110, 12, 15, 230, 109, 12, 15, 230, 108, 12, 15, 230, 107, 12, + 15, 230, 106, 12, 15, 230, 105, 12, 15, 230, 104, 12, 15, 230, 103, 12, + 15, 230, 102, 12, 15, 230, 101, 12, 15, 230, 100, 12, 15, 230, 99, 12, + 15, 230, 98, 12, 15, 230, 97, 12, 15, 230, 96, 12, 15, 230, 95, 12, 15, + 230, 94, 12, 15, 230, 93, 12, 15, 230, 92, 12, 15, 230, 91, 12, 15, 230, + 90, 12, 15, 230, 89, 12, 15, 230, 88, 12, 15, 230, 87, 12, 15, 230, 86, + 12, 15, 230, 85, 12, 15, 230, 84, 12, 15, 230, 83, 12, 15, 230, 82, 12, + 15, 230, 81, 12, 15, 230, 80, 12, 15, 230, 79, 12, 15, 230, 78, 12, 15, + 230, 77, 12, 15, 230, 76, 12, 15, 230, 75, 12, 15, 230, 74, 12, 15, 230, + 73, 12, 15, 230, 72, 12, 15, 230, 71, 12, 15, 230, 70, 12, 15, 230, 69, + 12, 15, 230, 68, 12, 15, 230, 67, 12, 15, 230, 66, 12, 15, 230, 65, 12, + 15, 230, 64, 12, 15, 230, 63, 12, 15, 230, 62, 12, 15, 230, 61, 12, 15, + 230, 60, 12, 15, 230, 59, 12, 15, 230, 58, 12, 15, 230, 57, 12, 15, 230, + 56, 12, 15, 230, 55, 12, 15, 230, 54, 12, 15, 230, 53, 12, 15, 230, 52, + 12, 15, 230, 51, 12, 15, 230, 50, 12, 15, 230, 49, 12, 15, 230, 48, 12, + 15, 230, 47, 12, 15, 230, 46, 12, 15, 230, 45, 12, 15, 230, 44, 12, 15, + 230, 43, 12, 15, 230, 42, 12, 15, 230, 41, 12, 15, 230, 40, 12, 15, 230, + 39, 12, 15, 230, 38, 12, 15, 230, 37, 12, 15, 230, 36, 12, 15, 230, 35, + 12, 15, 230, 34, 12, 15, 230, 33, 12, 15, 230, 32, 12, 15, 230, 31, 12, + 15, 230, 30, 12, 15, 230, 29, 12, 15, 230, 28, 12, 15, 230, 27, 12, 15, + 230, 26, 12, 15, 230, 25, 12, 15, 230, 24, 12, 15, 230, 23, 12, 15, 230, + 22, 12, 15, 230, 21, 12, 15, 230, 20, 12, 15, 230, 19, 12, 15, 230, 18, + 12, 15, 230, 17, 12, 15, 230, 16, 12, 15, 230, 15, 12, 15, 230, 14, 12, + 15, 230, 13, 12, 15, 230, 12, 12, 15, 230, 11, 12, 15, 230, 10, 12, 15, + 230, 9, 12, 15, 230, 8, 12, 15, 230, 7, 12, 15, 230, 6, 12, 15, 230, 5, + 12, 15, 230, 4, 12, 15, 230, 3, 12, 15, 230, 2, 12, 15, 230, 1, 12, 15, + 230, 0, 12, 15, 229, 255, 12, 15, 229, 254, 12, 15, 229, 253, 12, 15, + 229, 252, 12, 15, 229, 251, 12, 15, 229, 250, 12, 15, 229, 249, 12, 15, + 229, 248, 12, 15, 229, 247, 12, 15, 229, 246, 12, 15, 229, 245, 12, 15, + 229, 244, 12, 15, 229, 243, 12, 15, 229, 242, 12, 15, 229, 241, 12, 15, + 229, 240, 12, 15, 229, 239, 12, 15, 229, 238, 12, 15, 229, 237, 12, 15, + 229, 236, 12, 15, 229, 235, 12, 15, 229, 234, 12, 15, 229, 233, 12, 15, + 229, 232, 12, 15, 229, 231, 12, 15, 229, 230, 12, 15, 229, 229, 12, 15, + 229, 228, 12, 15, 229, 227, 12, 15, 229, 226, 12, 15, 229, 225, 12, 15, + 229, 224, 12, 15, 229, 223, 12, 15, 229, 222, 12, 15, 229, 221, 12, 15, + 229, 220, 12, 15, 229, 219, 12, 15, 229, 218, 12, 15, 229, 217, 12, 15, + 229, 216, 12, 15, 229, 215, 12, 15, 229, 214, 12, 15, 229, 213, 12, 15, + 229, 212, 12, 15, 229, 211, 12, 15, 229, 210, 12, 15, 229, 209, 12, 15, + 229, 208, 12, 15, 229, 207, 12, 15, 229, 206, 12, 15, 229, 205, 12, 15, + 229, 204, 12, 15, 229, 203, 12, 15, 229, 202, 12, 15, 229, 201, 12, 15, + 229, 200, 12, 15, 229, 199, 12, 15, 229, 198, 12, 15, 229, 197, 12, 15, + 229, 196, 12, 15, 229, 195, 12, 15, 229, 194, 12, 15, 229, 193, 12, 15, + 229, 192, 12, 15, 229, 191, 12, 15, 229, 190, 12, 15, 229, 189, 12, 15, + 229, 188, 12, 15, 229, 187, 12, 15, 229, 186, 12, 15, 229, 185, 12, 15, + 229, 184, 12, 15, 229, 183, 12, 15, 229, 182, 12, 15, 229, 181, 12, 15, + 229, 180, 12, 15, 229, 179, 12, 15, 229, 178, 12, 15, 229, 177, 12, 15, + 229, 176, 12, 15, 229, 175, 12, 15, 229, 174, 12, 15, 229, 173, 12, 15, + 229, 172, 12, 15, 229, 171, 12, 15, 229, 170, 12, 15, 229, 169, 12, 15, + 229, 168, 12, 15, 229, 167, 12, 15, 229, 166, 12, 15, 229, 165, 12, 15, + 229, 164, 12, 15, 229, 163, 12, 15, 229, 162, 12, 15, 229, 161, 12, 15, + 229, 160, 12, 15, 229, 159, 12, 15, 229, 158, 12, 15, 229, 157, 12, 15, + 229, 156, 12, 15, 229, 155, 12, 15, 229, 154, 12, 15, 229, 153, 12, 15, + 229, 152, 12, 15, 229, 151, 12, 15, 229, 150, 12, 15, 229, 149, 12, 15, + 229, 148, 12, 15, 229, 147, 12, 15, 229, 146, 12, 15, 229, 145, 12, 15, + 229, 144, 12, 15, 229, 143, 12, 15, 229, 142, 12, 15, 229, 141, 12, 15, + 229, 140, 12, 15, 229, 139, 12, 15, 229, 138, 12, 15, 229, 137, 12, 15, + 229, 136, 12, 15, 229, 135, 12, 15, 229, 134, 12, 15, 229, 133, 12, 15, + 229, 132, 12, 15, 229, 131, 12, 15, 229, 130, 12, 15, 229, 129, 12, 15, + 229, 128, 12, 15, 229, 127, 12, 15, 229, 126, 12, 15, 229, 125, 12, 15, + 229, 124, 12, 15, 229, 123, 12, 15, 229, 122, 12, 15, 229, 121, 12, 15, + 229, 120, 12, 15, 229, 119, 12, 15, 229, 118, 12, 15, 229, 117, 12, 15, + 229, 116, 12, 15, 229, 115, 12, 15, 229, 114, 12, 15, 229, 113, 12, 15, + 229, 112, 12, 15, 229, 111, 12, 15, 229, 110, 12, 15, 229, 109, 12, 15, + 229, 108, 12, 15, 229, 107, 12, 15, 229, 106, 12, 15, 229, 105, 12, 15, + 229, 104, 12, 15, 229, 103, 12, 15, 229, 102, 12, 15, 229, 101, 12, 15, + 229, 100, 12, 15, 229, 99, 12, 15, 229, 98, 12, 15, 229, 97, 12, 15, 229, + 96, 12, 15, 229, 95, 12, 15, 229, 94, 12, 15, 229, 93, 12, 15, 229, 92, + 12, 15, 229, 91, 12, 15, 229, 90, 12, 15, 229, 89, 12, 15, 229, 88, 12, + 15, 229, 87, 12, 15, 229, 86, 12, 15, 229, 85, 12, 15, 229, 84, 12, 15, + 229, 83, 12, 15, 229, 82, 12, 15, 229, 81, 12, 15, 229, 80, 12, 15, 229, + 79, 12, 15, 229, 78, 12, 15, 229, 77, 12, 15, 229, 76, 12, 15, 229, 75, + 12, 15, 229, 74, 12, 15, 229, 73, 12, 15, 229, 72, 12, 15, 229, 71, 12, + 15, 229, 70, 12, 15, 229, 69, 12, 15, 229, 68, 12, 15, 229, 67, 12, 15, + 229, 66, 12, 15, 229, 65, 12, 15, 229, 64, 12, 15, 229, 63, 12, 15, 229, + 62, 12, 15, 229, 61, 12, 15, 229, 60, 12, 15, 229, 59, 12, 15, 229, 58, + 12, 15, 229, 57, 12, 15, 229, 56, 12, 15, 229, 55, 12, 15, 229, 54, 12, + 15, 229, 53, 12, 15, 229, 52, 12, 15, 229, 51, 12, 15, 229, 50, 12, 15, + 229, 49, 12, 15, 229, 48, 12, 15, 229, 47, 12, 15, 229, 46, 12, 15, 229, + 45, 12, 15, 229, 44, 12, 15, 229, 43, 12, 15, 229, 42, 12, 15, 229, 41, + 12, 15, 229, 40, 12, 15, 229, 39, 12, 15, 229, 38, 12, 15, 229, 37, 12, + 15, 229, 36, 12, 15, 229, 35, 12, 15, 229, 34, 12, 15, 229, 33, 12, 15, + 229, 32, 12, 15, 229, 31, 12, 15, 229, 30, 12, 15, 229, 29, 12, 15, 229, + 28, 12, 15, 229, 27, 12, 15, 229, 26, 12, 15, 229, 25, 12, 15, 229, 24, + 12, 15, 229, 23, 12, 15, 229, 22, 12, 15, 229, 21, 12, 15, 229, 20, 12, + 15, 229, 19, 12, 15, 229, 18, 12, 15, 229, 17, 12, 15, 229, 16, 12, 15, + 229, 15, 12, 15, 229, 14, 12, 15, 229, 13, 12, 15, 229, 12, 12, 15, 229, + 11, 12, 15, 229, 10, 12, 15, 229, 9, 12, 15, 229, 8, 12, 15, 229, 7, 12, + 15, 229, 6, 12, 15, 229, 5, 12, 15, 229, 4, 12, 15, 229, 3, 12, 15, 229, + 2, 12, 15, 229, 1, 12, 15, 229, 0, 12, 15, 228, 255, 12, 15, 228, 254, + 12, 15, 228, 253, 12, 15, 228, 252, 12, 15, 228, 251, 12, 15, 228, 250, + 12, 15, 228, 249, 12, 15, 228, 248, 12, 15, 228, 247, 12, 15, 228, 246, + 12, 15, 228, 245, 12, 15, 228, 244, 12, 15, 228, 243, 12, 15, 228, 242, + 12, 15, 228, 241, 12, 15, 228, 240, 12, 15, 228, 239, 12, 15, 228, 238, + 12, 15, 228, 237, 12, 15, 228, 236, 12, 15, 228, 235, 12, 15, 228, 234, + 12, 15, 228, 233, 12, 15, 228, 232, 12, 15, 228, 231, 12, 15, 228, 230, + 12, 15, 228, 229, 12, 15, 228, 228, 12, 15, 228, 227, 12, 15, 228, 226, + 12, 15, 228, 225, 12, 15, 228, 224, 12, 15, 228, 223, 12, 15, 228, 222, + 12, 15, 228, 221, 12, 15, 228, 220, 12, 15, 228, 219, 12, 15, 228, 218, + 12, 15, 228, 217, 12, 15, 228, 216, 12, 15, 228, 215, 12, 15, 228, 214, + 12, 15, 228, 213, 12, 15, 228, 212, 12, 15, 228, 211, 12, 15, 228, 210, + 12, 15, 228, 209, 12, 15, 228, 208, 12, 15, 228, 207, 12, 15, 228, 206, + 12, 15, 228, 205, 12, 15, 228, 204, 12, 15, 228, 203, 12, 15, 228, 202, + 12, 15, 228, 201, 12, 15, 228, 200, 12, 15, 228, 199, 12, 15, 228, 198, + 12, 15, 228, 197, 12, 15, 228, 196, 12, 15, 228, 195, 12, 15, 228, 194, + 12, 15, 228, 193, 12, 15, 228, 192, 12, 15, 228, 191, 12, 15, 228, 190, + 12, 15, 228, 189, 12, 15, 228, 188, 12, 15, 228, 187, 12, 15, 228, 186, + 12, 15, 228, 185, 12, 15, 228, 184, 12, 15, 228, 183, 12, 15, 228, 182, + 12, 15, 228, 181, 12, 15, 228, 180, 12, 15, 228, 179, 12, 15, 228, 178, + 12, 15, 228, 177, 12, 15, 228, 176, 12, 15, 228, 175, 12, 15, 228, 174, + 12, 15, 228, 173, 12, 15, 228, 172, 12, 15, 228, 171, 12, 15, 228, 170, + 12, 15, 228, 169, 12, 15, 228, 168, 12, 15, 228, 167, 12, 15, 228, 166, + 12, 15, 228, 165, 12, 15, 228, 164, 12, 15, 228, 163, 12, 15, 228, 162, + 12, 15, 228, 161, 222, 234, 203, 143, 184, 205, 148, 184, 236, 90, 78, + 184, 211, 62, 78, 184, 31, 55, 184, 239, 10, 55, 184, 213, 45, 55, 184, + 251, 111, 184, 251, 30, 184, 50, 213, 140, 184, 53, 213, 140, 184, 250, + 179, 184, 98, 55, 184, 244, 159, 184, 231, 6, 184, 234, 217, 204, 226, + 184, 205, 177, 184, 17, 195, 79, 184, 17, 100, 184, 17, 102, 184, 17, + 134, 184, 17, 136, 184, 17, 146, 184, 17, 167, 184, 17, 178, 184, 17, + 171, 184, 17, 182, 184, 244, 168, 184, 207, 105, 184, 222, 140, 55, 184, + 236, 172, 55, 184, 233, 94, 55, 184, 211, 79, 78, 184, 244, 157, 250, + 168, 184, 8, 6, 1, 63, 184, 8, 6, 1, 250, 112, 184, 8, 6, 1, 247, 207, + 184, 8, 6, 1, 240, 231, 184, 8, 6, 1, 69, 184, 8, 6, 1, 236, 49, 184, 8, + 6, 1, 234, 190, 184, 8, 6, 1, 233, 15, 184, 8, 6, 1, 68, 184, 8, 6, 1, + 225, 217, 184, 8, 6, 1, 225, 80, 184, 8, 6, 1, 159, 184, 8, 6, 1, 221, + 136, 184, 8, 6, 1, 218, 55, 184, 8, 6, 1, 72, 184, 8, 6, 1, 214, 3, 184, + 8, 6, 1, 211, 167, 184, 8, 6, 1, 144, 184, 8, 6, 1, 209, 80, 184, 8, 6, + 1, 203, 216, 184, 8, 6, 1, 66, 184, 8, 6, 1, 199, 230, 184, 8, 6, 1, 197, + 199, 184, 8, 6, 1, 196, 222, 184, 8, 6, 1, 196, 148, 184, 8, 6, 1, 195, + 158, 184, 50, 47, 179, 184, 210, 90, 205, 177, 184, 53, 47, 179, 184, + 244, 241, 252, 22, 184, 126, 222, 75, 184, 233, 101, 252, 22, 184, 8, 4, + 1, 63, 184, 8, 4, 1, 250, 112, 184, 8, 4, 1, 247, 207, 184, 8, 4, 1, 240, + 231, 184, 8, 4, 1, 69, 184, 8, 4, 1, 236, 49, 184, 8, 4, 1, 234, 190, + 184, 8, 4, 1, 233, 15, 184, 8, 4, 1, 68, 184, 8, 4, 1, 225, 217, 184, 8, + 4, 1, 225, 80, 184, 8, 4, 1, 159, 184, 8, 4, 1, 221, 136, 184, 8, 4, 1, + 218, 55, 184, 8, 4, 1, 72, 184, 8, 4, 1, 214, 3, 184, 8, 4, 1, 211, 167, 184, 8, 4, 1, 144, 184, 8, 4, 1, 209, 80, 184, 8, 4, 1, 203, 216, 184, 8, 4, 1, 66, 184, 8, 4, 1, 199, 230, 184, 8, 4, 1, 197, 199, 184, 8, 4, 1, 196, 222, 184, 8, 4, 1, 196, 148, 184, 8, 4, 1, 195, 158, 184, 50, 241, - 17, 179, 184, 83, 222, 74, 184, 53, 241, 17, 179, 184, 202, 84, 247, 140, + 18, 179, 184, 83, 222, 75, 184, 53, 241, 18, 179, 184, 202, 84, 247, 141, 203, 143, 62, 208, 35, 62, 208, 24, 62, 208, 13, 62, 208, 1, 62, 207, 246, 62, 207, 235, 62, 207, 224, 62, 207, 213, 62, 207, 202, 62, 207, 194, 62, 207, 193, 62, 207, 192, 62, 207, 191, 62, 207, 189, 62, 207, @@ -18846,60 +18850,60 @@ static const unsigned char phrasebook[] = { 207, 215, 62, 207, 214, 62, 207, 212, 62, 207, 211, 62, 207, 210, 62, 207, 209, 62, 207, 208, 62, 207, 207, 62, 207, 206, 62, 207, 205, 62, 207, 204, 62, 207, 203, 62, 207, 201, 62, 207, 200, 62, 207, 199, 62, - 207, 198, 62, 207, 197, 62, 207, 196, 62, 207, 195, 215, 145, 215, 147, - 205, 3, 77, 232, 133, 205, 181, 205, 3, 77, 202, 237, 204, 174, 236, 221, - 77, 202, 237, 236, 117, 236, 221, 77, 201, 202, 236, 183, 236, 207, 236, - 208, 252, 13, 252, 14, 251, 160, 248, 231, 249, 131, 248, 26, 190, 203, - 149, 231, 154, 203, 149, 231, 79, 203, 154, 222, 75, 235, 179, 217, 82, - 222, 74, 236, 221, 77, 222, 74, 222, 123, 216, 111, 236, 186, 222, 75, - 203, 149, 83, 203, 149, 197, 222, 235, 23, 235, 179, 235, 156, 247, 101, - 210, 93, 241, 79, 206, 219, 214, 33, 221, 252, 100, 205, 200, 206, 219, - 226, 85, 221, 252, 195, 79, 206, 112, 240, 59, 222, 65, 236, 142, 239, - 38, 239, 182, 241, 120, 100, 240, 48, 239, 182, 241, 120, 102, 240, 47, - 239, 182, 241, 120, 134, 240, 46, 239, 182, 241, 120, 136, 240, 45, 217, - 103, 252, 13, 217, 226, 203, 242, 226, 148, 203, 246, 236, 221, 77, 201, - 203, 248, 125, 236, 124, 247, 139, 247, 141, 236, 221, 77, 219, 188, 236, - 184, 204, 139, 204, 157, 236, 142, 236, 143, 226, 60, 207, 91, 136, 235, - 137, 207, 90, 234, 226, 226, 60, 207, 91, 134, 233, 83, 207, 90, 233, 80, - 226, 60, 207, 91, 102, 210, 168, 207, 90, 209, 146, 226, 60, 207, 91, - 100, 200, 50, 207, 90, 200, 4, 205, 151, 239, 221, 239, 223, 213, 230, - 246, 254, 213, 232, 130, 214, 170, 212, 23, 231, 157, 248, 51, 213, 34, - 232, 94, 248, 65, 216, 50, 248, 51, 232, 94, 217, 187, 226, 71, 226, 73, - 217, 75, 222, 74, 217, 101, 205, 3, 77, 208, 116, 250, 244, 205, 80, 236, - 221, 77, 208, 116, 250, 244, 236, 145, 190, 203, 150, 207, 76, 231, 154, - 203, 150, 207, 76, 231, 76, 190, 203, 150, 3, 225, 91, 231, 154, 203, - 150, 3, 225, 91, 231, 77, 222, 75, 203, 150, 207, 76, 83, 203, 150, 207, - 76, 197, 221, 213, 131, 222, 75, 235, 10, 213, 131, 222, 75, 237, 234, - 212, 136, 213, 131, 222, 75, 249, 130, 213, 131, 222, 75, 200, 36, 212, - 130, 210, 90, 222, 75, 235, 179, 210, 90, 226, 71, 210, 72, 206, 62, 206, + 207, 198, 62, 207, 197, 62, 207, 196, 62, 207, 195, 215, 146, 215, 148, + 205, 3, 77, 232, 134, 205, 181, 205, 3, 77, 202, 237, 204, 174, 236, 222, + 77, 202, 237, 236, 118, 236, 222, 77, 201, 202, 236, 184, 236, 208, 236, + 209, 252, 14, 252, 15, 251, 161, 248, 232, 249, 132, 248, 27, 190, 203, + 149, 231, 155, 203, 149, 231, 80, 203, 154, 222, 76, 235, 180, 217, 83, + 222, 75, 236, 222, 77, 222, 75, 222, 124, 216, 112, 236, 187, 222, 76, + 203, 149, 83, 203, 149, 197, 222, 235, 24, 235, 180, 235, 157, 247, 102, + 210, 93, 241, 80, 206, 219, 214, 34, 221, 253, 100, 205, 200, 206, 219, + 226, 86, 221, 253, 195, 79, 206, 112, 240, 60, 222, 66, 236, 143, 239, + 39, 239, 183, 241, 121, 100, 240, 49, 239, 183, 241, 121, 102, 240, 48, + 239, 183, 241, 121, 134, 240, 47, 239, 183, 241, 121, 136, 240, 46, 217, + 104, 252, 14, 217, 227, 203, 242, 226, 149, 203, 246, 236, 222, 77, 201, + 203, 248, 126, 236, 125, 247, 140, 247, 142, 236, 222, 77, 219, 189, 236, + 185, 204, 139, 204, 157, 236, 143, 236, 144, 226, 61, 207, 91, 136, 235, + 138, 207, 90, 234, 227, 226, 61, 207, 91, 134, 233, 84, 207, 90, 233, 81, + 226, 61, 207, 91, 102, 210, 169, 207, 90, 209, 146, 226, 61, 207, 91, + 100, 200, 50, 207, 90, 200, 4, 205, 151, 239, 222, 239, 224, 213, 231, + 246, 255, 213, 233, 130, 214, 171, 212, 24, 231, 158, 248, 52, 213, 35, + 232, 95, 248, 66, 216, 51, 248, 52, 232, 95, 217, 188, 226, 72, 226, 74, + 217, 76, 222, 75, 217, 102, 205, 3, 77, 208, 116, 250, 245, 205, 80, 236, + 222, 77, 208, 116, 250, 245, 236, 146, 190, 203, 150, 207, 76, 231, 155, + 203, 150, 207, 76, 231, 77, 190, 203, 150, 3, 225, 92, 231, 155, 203, + 150, 3, 225, 92, 231, 78, 222, 76, 203, 150, 207, 76, 83, 203, 150, 207, + 76, 197, 221, 213, 132, 222, 76, 235, 11, 213, 132, 222, 76, 237, 235, + 212, 137, 213, 132, 222, 76, 249, 131, 213, 132, 222, 76, 200, 36, 212, + 131, 210, 90, 222, 76, 235, 180, 210, 90, 226, 72, 210, 72, 206, 62, 206, 219, 102, 206, 59, 205, 82, 206, 62, 206, 219, 134, 206, 58, 205, 81, - 239, 182, 241, 120, 204, 198, 240, 43, 212, 8, 200, 3, 100, 212, 8, 200, - 1, 211, 225, 212, 8, 200, 3, 102, 212, 8, 200, 0, 211, 224, 207, 77, 201, - 201, 205, 0, 204, 181, 247, 140, 246, 254, 247, 75, 219, 146, 197, 152, - 218, 72, 205, 3, 77, 233, 68, 250, 244, 205, 3, 77, 211, 243, 250, 244, - 205, 150, 236, 221, 77, 233, 68, 250, 244, 236, 221, 77, 211, 243, 250, - 244, 236, 181, 205, 3, 77, 204, 198, 205, 166, 206, 62, 233, 105, 190, - 226, 19, 207, 55, 206, 62, 190, 226, 19, 208, 162, 241, 120, 207, 87, - 226, 19, 241, 41, 204, 199, 203, 8, 205, 23, 214, 83, 203, 231, 244, 157, - 214, 50, 212, 9, 219, 145, 212, 119, 251, 25, 212, 2, 244, 157, 251, 42, - 217, 175, 206, 121, 8, 6, 1, 233, 229, 8, 4, 1, 233, 229, 247, 18, 251, - 139, 203, 236, 204, 145, 244, 168, 206, 4, 222, 183, 225, 10, 1, 222, 25, - 222, 231, 1, 235, 51, 235, 42, 222, 231, 1, 235, 51, 235, 191, 222, 231, - 1, 209, 232, 222, 231, 1, 222, 6, 82, 117, 248, 137, 206, 192, 233, 192, - 219, 95, 210, 80, 29, 116, 196, 43, 29, 116, 196, 39, 29, 116, 205, 58, - 29, 116, 196, 44, 234, 203, 234, 202, 234, 201, 218, 74, 194, 236, 194, - 237, 194, 239, 221, 194, 209, 240, 221, 196, 209, 242, 213, 94, 221, 193, - 209, 239, 216, 81, 218, 254, 197, 36, 221, 195, 209, 241, 234, 225, 213, - 93, 197, 95, 236, 245, 234, 213, 219, 69, 214, 119, 200, 5, 105, 219, 69, - 240, 65, 105, 107, 201, 179, 61, 3, 52, 83, 106, 91, 201, 179, 61, 3, 52, - 83, 106, 11, 5, 225, 231, 78, 198, 222, 198, 111, 198, 43, 198, 32, 198, + 239, 183, 241, 121, 204, 198, 240, 44, 212, 9, 200, 3, 100, 212, 9, 200, + 1, 211, 226, 212, 9, 200, 3, 102, 212, 9, 200, 0, 211, 225, 207, 77, 201, + 201, 205, 0, 204, 181, 247, 141, 246, 255, 247, 76, 219, 147, 197, 152, + 218, 73, 205, 3, 77, 233, 69, 250, 245, 205, 3, 77, 211, 244, 250, 245, + 205, 150, 236, 222, 77, 233, 69, 250, 245, 236, 222, 77, 211, 244, 250, + 245, 236, 182, 205, 3, 77, 204, 198, 205, 166, 206, 62, 233, 106, 190, + 226, 20, 207, 55, 206, 62, 190, 226, 20, 208, 162, 241, 121, 207, 87, + 226, 20, 241, 42, 204, 199, 203, 8, 205, 23, 214, 84, 203, 231, 244, 158, + 214, 51, 212, 10, 219, 146, 212, 120, 251, 26, 212, 3, 244, 158, 251, 43, + 217, 176, 206, 121, 8, 6, 1, 233, 230, 8, 4, 1, 233, 230, 247, 19, 251, + 140, 203, 236, 204, 145, 244, 169, 206, 4, 222, 184, 225, 11, 1, 222, 26, + 222, 232, 1, 235, 52, 235, 43, 222, 232, 1, 235, 52, 235, 192, 222, 232, + 1, 209, 232, 222, 232, 1, 222, 7, 82, 117, 248, 138, 206, 192, 233, 193, + 219, 96, 210, 80, 29, 116, 196, 43, 29, 116, 196, 39, 29, 116, 205, 58, + 29, 116, 196, 44, 234, 204, 234, 203, 234, 202, 218, 75, 194, 236, 194, + 237, 194, 239, 221, 195, 209, 240, 221, 197, 209, 242, 213, 95, 221, 194, + 209, 239, 216, 82, 218, 255, 197, 36, 221, 196, 209, 241, 234, 226, 213, + 94, 197, 95, 236, 246, 234, 214, 219, 70, 214, 120, 200, 5, 105, 219, 70, + 240, 66, 105, 107, 201, 179, 61, 3, 52, 83, 106, 91, 201, 179, 61, 3, 52, + 83, 106, 11, 5, 225, 232, 78, 198, 222, 198, 111, 198, 43, 198, 32, 198, 21, 198, 10, 197, 255, 197, 244, 197, 233, 198, 221, 198, 210, 198, 199, - 198, 188, 198, 177, 198, 166, 198, 155, 212, 24, 235, 23, 36, 83, 53, 59, - 222, 146, 179, 247, 211, 214, 67, 78, 248, 105, 194, 238, 10, 2, 215, - 155, 203, 12, 10, 2, 215, 155, 127, 215, 155, 247, 244, 127, 247, 243, - 219, 194, 6, 1, 233, 14, 219, 194, 6, 1, 217, 72, 219, 194, 4, 1, 233, - 14, 219, 194, 4, 1, 217, 72, 56, 1, 237, 134, 67, 34, 16, 234, 224, 206, - 0, 245, 33, 199, 128, 198, 144, 198, 133, 198, 122, 198, 110, 198, 99, + 198, 188, 198, 177, 198, 166, 198, 155, 212, 25, 235, 24, 36, 83, 53, 59, + 222, 147, 179, 247, 212, 214, 68, 78, 248, 106, 194, 238, 10, 2, 215, + 156, 203, 12, 10, 2, 215, 156, 127, 215, 156, 247, 245, 127, 247, 244, + 219, 195, 6, 1, 233, 15, 219, 195, 6, 1, 217, 73, 219, 195, 4, 1, 233, + 15, 219, 195, 4, 1, 217, 73, 56, 1, 237, 135, 67, 34, 16, 234, 225, 206, + 0, 245, 34, 199, 128, 198, 144, 198, 133, 198, 122, 198, 110, 198, 99, 198, 88, 198, 77, 198, 66, 198, 55, 198, 47, 198, 46, 198, 45, 198, 44, 198, 42, 198, 41, 198, 40, 198, 39, 198, 38, 198, 37, 198, 36, 198, 35, 198, 34, 198, 33, 198, 31, 198, 30, 198, 29, 198, 28, 198, 27, 198, 26, @@ -18931,146 +18935,146 @@ static const unsigned char phrasebook[] = { 80, 198, 79, 198, 78, 198, 76, 198, 75, 198, 74, 198, 73, 198, 72, 198, 71, 198, 70, 198, 69, 198, 68, 198, 67, 198, 65, 198, 64, 198, 63, 198, 62, 198, 61, 198, 60, 198, 59, 198, 58, 198, 57, 198, 56, 198, 54, 198, - 53, 198, 52, 198, 51, 198, 50, 198, 49, 198, 48, 224, 149, 31, 55, 224, - 149, 250, 178, 224, 149, 17, 195, 79, 224, 149, 17, 100, 224, 149, 17, - 102, 224, 149, 17, 134, 224, 149, 17, 136, 224, 149, 17, 146, 224, 149, - 17, 167, 224, 149, 17, 178, 224, 149, 17, 171, 224, 149, 17, 182, 8, 6, - 1, 39, 3, 220, 114, 26, 233, 99, 8, 4, 1, 39, 3, 220, 114, 26, 233, 99, - 8, 6, 1, 237, 135, 3, 83, 222, 75, 60, 8, 4, 1, 237, 135, 3, 83, 222, 75, - 60, 8, 6, 1, 237, 135, 3, 83, 222, 75, 248, 226, 26, 233, 99, 8, 4, 1, - 237, 135, 3, 83, 222, 75, 248, 226, 26, 233, 99, 8, 6, 1, 237, 135, 3, - 83, 222, 75, 248, 226, 26, 186, 8, 4, 1, 237, 135, 3, 83, 222, 75, 248, - 226, 26, 186, 8, 6, 1, 237, 135, 3, 244, 240, 26, 220, 113, 8, 4, 1, 237, - 135, 3, 244, 240, 26, 220, 113, 8, 6, 1, 237, 135, 3, 244, 240, 26, 247, - 105, 8, 4, 1, 237, 135, 3, 244, 240, 26, 247, 105, 8, 6, 1, 230, 248, 3, - 220, 114, 26, 233, 99, 8, 4, 1, 230, 248, 3, 220, 114, 26, 233, 99, 8, 4, - 1, 230, 248, 3, 76, 90, 26, 186, 8, 4, 1, 217, 73, 3, 202, 85, 57, 8, 6, - 1, 177, 3, 83, 222, 75, 60, 8, 4, 1, 177, 3, 83, 222, 75, 60, 8, 6, 1, - 177, 3, 83, 222, 75, 248, 226, 26, 233, 99, 8, 4, 1, 177, 3, 83, 222, 75, - 248, 226, 26, 233, 99, 8, 6, 1, 177, 3, 83, 222, 75, 248, 226, 26, 186, - 8, 4, 1, 177, 3, 83, 222, 75, 248, 226, 26, 186, 8, 6, 1, 209, 81, 3, 83, - 222, 75, 60, 8, 4, 1, 209, 81, 3, 83, 222, 75, 60, 8, 6, 1, 118, 3, 220, - 114, 26, 233, 99, 8, 4, 1, 118, 3, 220, 114, 26, 233, 99, 8, 6, 1, 39, 3, - 214, 151, 26, 186, 8, 4, 1, 39, 3, 214, 151, 26, 186, 8, 6, 1, 39, 3, - 214, 151, 26, 202, 84, 8, 4, 1, 39, 3, 214, 151, 26, 202, 84, 8, 6, 1, - 237, 135, 3, 214, 151, 26, 186, 8, 4, 1, 237, 135, 3, 214, 151, 26, 186, - 8, 6, 1, 237, 135, 3, 214, 151, 26, 202, 84, 8, 4, 1, 237, 135, 3, 214, - 151, 26, 202, 84, 8, 6, 1, 237, 135, 3, 76, 90, 26, 186, 8, 4, 1, 237, - 135, 3, 76, 90, 26, 186, 8, 6, 1, 237, 135, 3, 76, 90, 26, 202, 84, 8, 4, - 1, 237, 135, 3, 76, 90, 26, 202, 84, 8, 4, 1, 230, 248, 3, 76, 90, 26, - 233, 99, 8, 4, 1, 230, 248, 3, 76, 90, 26, 202, 84, 8, 6, 1, 230, 248, 3, - 214, 151, 26, 186, 8, 4, 1, 230, 248, 3, 214, 151, 26, 76, 90, 26, 186, - 8, 6, 1, 230, 248, 3, 214, 151, 26, 202, 84, 8, 4, 1, 230, 248, 3, 214, - 151, 26, 76, 90, 26, 202, 84, 8, 6, 1, 225, 217, 3, 202, 84, 8, 4, 1, - 225, 217, 3, 76, 90, 26, 202, 84, 8, 6, 1, 223, 99, 3, 202, 84, 8, 4, 1, - 223, 99, 3, 202, 84, 8, 6, 1, 221, 136, 3, 202, 84, 8, 4, 1, 221, 136, 3, - 202, 84, 8, 6, 1, 211, 31, 3, 202, 84, 8, 4, 1, 211, 31, 3, 202, 84, 8, - 6, 1, 118, 3, 214, 151, 26, 186, 8, 4, 1, 118, 3, 214, 151, 26, 186, 8, - 6, 1, 118, 3, 214, 151, 26, 202, 84, 8, 4, 1, 118, 3, 214, 151, 26, 202, - 84, 8, 6, 1, 118, 3, 220, 114, 26, 186, 8, 4, 1, 118, 3, 220, 114, 26, - 186, 8, 6, 1, 118, 3, 220, 114, 26, 202, 84, 8, 4, 1, 118, 3, 220, 114, - 26, 202, 84, 8, 4, 1, 251, 245, 3, 233, 99, 8, 4, 1, 192, 177, 3, 233, - 99, 8, 4, 1, 192, 177, 3, 186, 8, 4, 1, 163, 199, 231, 3, 233, 99, 8, 4, - 1, 163, 199, 231, 3, 186, 8, 4, 1, 208, 164, 3, 233, 99, 8, 4, 1, 208, - 164, 3, 186, 8, 4, 1, 231, 163, 208, 164, 3, 233, 99, 8, 4, 1, 231, 163, - 208, 164, 3, 186, 9, 207, 87, 93, 3, 232, 213, 90, 3, 251, 163, 9, 207, - 87, 93, 3, 232, 213, 90, 3, 197, 117, 9, 207, 87, 93, 3, 232, 213, 90, 3, - 151, 220, 68, 9, 207, 87, 93, 3, 232, 213, 90, 3, 214, 163, 9, 207, 87, - 93, 3, 232, 213, 90, 3, 66, 9, 207, 87, 93, 3, 232, 213, 90, 3, 195, 217, - 9, 207, 87, 93, 3, 232, 213, 90, 3, 69, 9, 207, 87, 93, 3, 232, 213, 90, - 3, 251, 244, 9, 207, 87, 216, 31, 3, 224, 190, 248, 218, 1, 224, 120, 42, - 108, 225, 79, 42, 108, 217, 72, 42, 108, 247, 206, 42, 108, 215, 110, 42, - 108, 201, 81, 42, 108, 216, 86, 42, 108, 203, 216, 42, 108, 218, 54, 42, - 108, 214, 2, 42, 108, 221, 135, 42, 108, 196, 148, 42, 108, 144, 42, 108, - 159, 42, 108, 199, 230, 42, 108, 222, 26, 42, 108, 222, 37, 42, 108, 209, - 182, 42, 108, 216, 68, 42, 108, 225, 216, 42, 108, 207, 52, 42, 108, 205, - 83, 42, 108, 209, 80, 42, 108, 233, 14, 42, 108, 223, 201, 42, 5, 225, - 54, 42, 5, 224, 100, 42, 5, 224, 79, 42, 5, 223, 186, 42, 5, 223, 143, - 42, 5, 224, 208, 42, 5, 224, 199, 42, 5, 225, 30, 42, 5, 224, 10, 42, 5, - 223, 241, 42, 5, 224, 227, 42, 5, 217, 69, 42, 5, 217, 18, 42, 5, 217, - 14, 42, 5, 216, 239, 42, 5, 216, 230, 42, 5, 217, 57, 42, 5, 217, 55, 42, - 5, 217, 66, 42, 5, 216, 251, 42, 5, 216, 246, 42, 5, 217, 59, 42, 5, 247, - 172, 42, 5, 245, 10, 42, 5, 245, 0, 42, 5, 241, 40, 42, 5, 240, 255, 42, - 5, 247, 56, 42, 5, 247, 48, 42, 5, 247, 161, 42, 5, 244, 181, 42, 5, 241, - 116, 42, 5, 247, 89, 42, 5, 215, 107, 42, 5, 215, 88, 42, 5, 215, 82, 42, - 5, 215, 65, 42, 5, 215, 57, 42, 5, 215, 97, 42, 5, 215, 96, 42, 5, 215, - 104, 42, 5, 215, 72, 42, 5, 215, 69, 42, 5, 215, 100, 42, 5, 201, 77, 42, - 5, 201, 57, 42, 5, 201, 56, 42, 5, 201, 45, 42, 5, 201, 42, 42, 5, 201, - 73, 42, 5, 201, 72, 42, 5, 201, 76, 42, 5, 201, 55, 42, 5, 201, 54, 42, - 5, 201, 75, 42, 5, 216, 84, 42, 5, 216, 70, 42, 5, 216, 69, 42, 5, 216, - 53, 42, 5, 216, 52, 42, 5, 216, 80, 42, 5, 216, 79, 42, 5, 216, 83, 42, - 5, 216, 55, 42, 5, 216, 54, 42, 5, 216, 82, 42, 5, 203, 162, 42, 5, 202, - 122, 42, 5, 202, 99, 42, 5, 201, 40, 42, 5, 200, 251, 42, 5, 203, 68, 42, - 5, 203, 48, 42, 5, 203, 137, 42, 5, 149, 42, 5, 201, 247, 42, 5, 203, 89, - 42, 5, 217, 243, 42, 5, 216, 222, 42, 5, 216, 189, 42, 5, 215, 185, 42, - 5, 215, 122, 42, 5, 217, 117, 42, 5, 217, 106, 42, 5, 217, 229, 42, 5, - 216, 49, 42, 5, 216, 32, 42, 5, 217, 201, 42, 5, 213, 242, 42, 5, 212, - 219, 42, 5, 212, 181, 42, 5, 211, 226, 42, 5, 211, 190, 42, 5, 213, 91, - 42, 5, 213, 78, 42, 5, 213, 220, 42, 5, 212, 116, 42, 5, 212, 90, 42, 5, - 213, 107, 42, 5, 220, 118, 42, 5, 219, 77, 42, 5, 219, 39, 42, 5, 218, - 144, 42, 5, 218, 84, 42, 5, 219, 206, 42, 5, 219, 187, 42, 5, 220, 80, - 42, 5, 218, 250, 42, 5, 218, 194, 42, 5, 219, 254, 42, 5, 196, 129, 42, - 5, 196, 24, 42, 5, 196, 14, 42, 5, 195, 217, 42, 5, 195, 180, 42, 5, 196, - 69, 42, 5, 196, 66, 42, 5, 196, 108, 42, 5, 196, 3, 42, 5, 195, 237, 42, - 5, 196, 80, 42, 5, 210, 243, 42, 5, 210, 72, 42, 5, 210, 9, 42, 5, 209, - 140, 42, 5, 209, 101, 42, 5, 210, 182, 42, 5, 210, 154, 42, 5, 210, 223, - 42, 5, 209, 232, 42, 5, 209, 206, 42, 5, 210, 192, 42, 5, 223, 81, 42, 5, - 222, 108, 42, 5, 222, 90, 42, 5, 221, 190, 42, 5, 221, 161, 42, 5, 222, - 196, 42, 5, 222, 187, 42, 5, 223, 53, 42, 5, 222, 6, 42, 5, 221, 228, 42, - 5, 222, 214, 42, 5, 199, 151, 42, 5, 199, 34, 42, 5, 199, 18, 42, 5, 197, - 220, 42, 5, 197, 212, 42, 5, 199, 118, 42, 5, 199, 113, 42, 5, 199, 147, - 42, 5, 198, 248, 42, 5, 198, 233, 42, 5, 199, 124, 42, 5, 222, 24, 42, 5, - 222, 19, 42, 5, 222, 18, 42, 5, 222, 15, 42, 5, 222, 14, 42, 5, 222, 21, - 42, 5, 222, 20, 42, 5, 222, 23, 42, 5, 222, 17, 42, 5, 222, 16, 42, 5, - 222, 22, 42, 5, 222, 35, 42, 5, 222, 28, 42, 5, 222, 27, 42, 5, 222, 11, - 42, 5, 222, 10, 42, 5, 222, 31, 42, 5, 222, 30, 42, 5, 222, 34, 42, 5, - 222, 13, 42, 5, 222, 12, 42, 5, 222, 32, 42, 5, 209, 180, 42, 5, 209, - 169, 42, 5, 209, 168, 42, 5, 209, 161, 42, 5, 209, 154, 42, 5, 209, 176, - 42, 5, 209, 175, 42, 5, 209, 179, 42, 5, 209, 167, 42, 5, 209, 166, 42, - 5, 209, 178, 42, 5, 216, 66, 42, 5, 216, 61, 42, 5, 216, 60, 42, 5, 216, - 57, 42, 5, 216, 56, 42, 5, 216, 63, 42, 5, 216, 62, 42, 5, 216, 65, 42, - 5, 216, 59, 42, 5, 216, 58, 42, 5, 216, 64, 42, 5, 225, 212, 42, 5, 225, - 171, 42, 5, 225, 163, 42, 5, 225, 109, 42, 5, 225, 89, 42, 5, 225, 192, - 42, 5, 225, 190, 42, 5, 225, 206, 42, 5, 225, 128, 42, 5, 225, 118, 42, - 5, 225, 199, 42, 5, 207, 45, 42, 5, 206, 223, 42, 5, 206, 218, 42, 5, - 206, 151, 42, 5, 206, 133, 42, 5, 206, 255, 42, 5, 206, 253, 42, 5, 207, - 34, 42, 5, 206, 198, 42, 5, 206, 190, 42, 5, 207, 8, 42, 5, 205, 79, 42, - 5, 205, 47, 42, 5, 205, 43, 42, 5, 205, 34, 42, 5, 205, 31, 42, 5, 205, - 53, 42, 5, 205, 52, 42, 5, 205, 78, 42, 5, 205, 39, 42, 5, 205, 38, 42, - 5, 205, 55, 42, 5, 209, 13, 42, 5, 206, 112, 42, 5, 206, 84, 42, 5, 204, - 172, 42, 5, 204, 74, 42, 5, 208, 147, 42, 5, 208, 129, 42, 5, 208, 253, - 42, 5, 205, 200, 42, 5, 205, 171, 42, 5, 208, 191, 42, 5, 232, 245, 42, - 5, 232, 70, 42, 5, 232, 42, 42, 5, 231, 74, 42, 5, 231, 45, 42, 5, 232, - 146, 42, 5, 232, 117, 42, 5, 232, 234, 42, 5, 231, 192, 42, 5, 231, 165, - 42, 5, 232, 157, 42, 5, 223, 200, 42, 5, 223, 199, 42, 5, 223, 194, 42, - 5, 223, 193, 42, 5, 223, 190, 42, 5, 223, 189, 42, 5, 223, 196, 42, 5, - 223, 195, 42, 5, 223, 198, 42, 5, 223, 192, 42, 5, 223, 191, 42, 5, 223, - 197, 42, 5, 206, 158, 153, 108, 2, 196, 94, 153, 108, 2, 210, 211, 153, - 108, 2, 210, 121, 94, 1, 200, 170, 89, 108, 2, 244, 174, 155, 89, 108, 2, - 244, 174, 224, 145, 89, 108, 2, 244, 174, 224, 10, 89, 108, 2, 244, 174, - 224, 116, 89, 108, 2, 244, 174, 216, 251, 89, 108, 2, 244, 174, 247, 173, - 89, 108, 2, 244, 174, 247, 15, 89, 108, 2, 244, 174, 244, 181, 89, 108, - 2, 244, 174, 245, 48, 89, 108, 2, 244, 174, 215, 72, 89, 108, 2, 244, - 174, 240, 135, 89, 108, 2, 244, 174, 201, 66, 89, 108, 2, 244, 174, 239, - 27, 89, 108, 2, 244, 174, 201, 61, 89, 108, 2, 244, 174, 176, 89, 108, 2, - 244, 174, 189, 89, 108, 2, 244, 174, 202, 233, 89, 108, 2, 244, 174, 149, - 89, 108, 2, 244, 174, 202, 169, 89, 108, 2, 244, 174, 216, 49, 89, 108, - 2, 244, 174, 249, 144, 89, 108, 2, 244, 174, 213, 5, 89, 108, 2, 244, - 174, 212, 116, 89, 108, 2, 244, 174, 212, 233, 89, 108, 2, 244, 174, 218, - 250, 89, 108, 2, 244, 174, 196, 3, 89, 108, 2, 244, 174, 209, 232, 89, - 108, 2, 244, 174, 222, 6, 89, 108, 2, 244, 174, 198, 248, 89, 108, 2, - 244, 174, 207, 50, 89, 108, 2, 244, 174, 205, 80, 89, 108, 2, 244, 174, - 183, 89, 108, 2, 244, 174, 142, 89, 108, 2, 244, 174, 172, 89, 18, 2, - 244, 174, 211, 158, 89, 226, 72, 18, 2, 244, 174, 211, 96, 89, 226, 72, - 18, 2, 244, 174, 209, 89, 89, 226, 72, 18, 2, 244, 174, 209, 82, 89, 226, - 72, 18, 2, 244, 174, 211, 138, 89, 18, 2, 214, 126, 89, 18, 2, 252, 128, - 188, 1, 248, 176, 217, 70, 188, 1, 248, 176, 217, 18, 188, 1, 248, 176, - 216, 239, 188, 1, 248, 176, 217, 57, 188, 1, 248, 176, 216, 251, 71, 1, - 248, 176, 217, 70, 71, 1, 248, 176, 217, 18, 71, 1, 248, 176, 216, 239, - 71, 1, 248, 176, 217, 57, 71, 1, 248, 176, 216, 251, 71, 1, 251, 191, - 247, 56, 71, 1, 251, 191, 201, 40, 71, 1, 251, 191, 149, 71, 1, 251, 191, - 214, 2, 73, 1, 236, 73, 236, 72, 241, 124, 152, 154, 73, 1, 236, 72, 236, - 73, 241, 124, 152, 154, + 53, 198, 52, 198, 51, 198, 50, 198, 49, 198, 48, 224, 150, 31, 55, 224, + 150, 250, 179, 224, 150, 17, 195, 79, 224, 150, 17, 100, 224, 150, 17, + 102, 224, 150, 17, 134, 224, 150, 17, 136, 224, 150, 17, 146, 224, 150, + 17, 167, 224, 150, 17, 178, 224, 150, 17, 171, 224, 150, 17, 182, 8, 6, + 1, 39, 3, 220, 115, 26, 233, 100, 8, 4, 1, 39, 3, 220, 115, 26, 233, 100, + 8, 6, 1, 237, 136, 3, 83, 222, 76, 60, 8, 4, 1, 237, 136, 3, 83, 222, 76, + 60, 8, 6, 1, 237, 136, 3, 83, 222, 76, 248, 227, 26, 233, 100, 8, 4, 1, + 237, 136, 3, 83, 222, 76, 248, 227, 26, 233, 100, 8, 6, 1, 237, 136, 3, + 83, 222, 76, 248, 227, 26, 186, 8, 4, 1, 237, 136, 3, 83, 222, 76, 248, + 227, 26, 186, 8, 6, 1, 237, 136, 3, 244, 241, 26, 220, 114, 8, 4, 1, 237, + 136, 3, 244, 241, 26, 220, 114, 8, 6, 1, 237, 136, 3, 244, 241, 26, 247, + 106, 8, 4, 1, 237, 136, 3, 244, 241, 26, 247, 106, 8, 6, 1, 230, 249, 3, + 220, 115, 26, 233, 100, 8, 4, 1, 230, 249, 3, 220, 115, 26, 233, 100, 8, + 4, 1, 230, 249, 3, 76, 90, 26, 186, 8, 4, 1, 217, 74, 3, 202, 85, 57, 8, + 6, 1, 177, 3, 83, 222, 76, 60, 8, 4, 1, 177, 3, 83, 222, 76, 60, 8, 6, 1, + 177, 3, 83, 222, 76, 248, 227, 26, 233, 100, 8, 4, 1, 177, 3, 83, 222, + 76, 248, 227, 26, 233, 100, 8, 6, 1, 177, 3, 83, 222, 76, 248, 227, 26, + 186, 8, 4, 1, 177, 3, 83, 222, 76, 248, 227, 26, 186, 8, 6, 1, 209, 81, + 3, 83, 222, 76, 60, 8, 4, 1, 209, 81, 3, 83, 222, 76, 60, 8, 6, 1, 118, + 3, 220, 115, 26, 233, 100, 8, 4, 1, 118, 3, 220, 115, 26, 233, 100, 8, 6, + 1, 39, 3, 214, 152, 26, 186, 8, 4, 1, 39, 3, 214, 152, 26, 186, 8, 6, 1, + 39, 3, 214, 152, 26, 202, 84, 8, 4, 1, 39, 3, 214, 152, 26, 202, 84, 8, + 6, 1, 237, 136, 3, 214, 152, 26, 186, 8, 4, 1, 237, 136, 3, 214, 152, 26, + 186, 8, 6, 1, 237, 136, 3, 214, 152, 26, 202, 84, 8, 4, 1, 237, 136, 3, + 214, 152, 26, 202, 84, 8, 6, 1, 237, 136, 3, 76, 90, 26, 186, 8, 4, 1, + 237, 136, 3, 76, 90, 26, 186, 8, 6, 1, 237, 136, 3, 76, 90, 26, 202, 84, + 8, 4, 1, 237, 136, 3, 76, 90, 26, 202, 84, 8, 4, 1, 230, 249, 3, 76, 90, + 26, 233, 100, 8, 4, 1, 230, 249, 3, 76, 90, 26, 202, 84, 8, 6, 1, 230, + 249, 3, 214, 152, 26, 186, 8, 4, 1, 230, 249, 3, 214, 152, 26, 76, 90, + 26, 186, 8, 6, 1, 230, 249, 3, 214, 152, 26, 202, 84, 8, 4, 1, 230, 249, + 3, 214, 152, 26, 76, 90, 26, 202, 84, 8, 6, 1, 225, 218, 3, 202, 84, 8, + 4, 1, 225, 218, 3, 76, 90, 26, 202, 84, 8, 6, 1, 223, 100, 3, 202, 84, 8, + 4, 1, 223, 100, 3, 202, 84, 8, 6, 1, 221, 137, 3, 202, 84, 8, 4, 1, 221, + 137, 3, 202, 84, 8, 6, 1, 211, 32, 3, 202, 84, 8, 4, 1, 211, 32, 3, 202, + 84, 8, 6, 1, 118, 3, 214, 152, 26, 186, 8, 4, 1, 118, 3, 214, 152, 26, + 186, 8, 6, 1, 118, 3, 214, 152, 26, 202, 84, 8, 4, 1, 118, 3, 214, 152, + 26, 202, 84, 8, 6, 1, 118, 3, 220, 115, 26, 186, 8, 4, 1, 118, 3, 220, + 115, 26, 186, 8, 6, 1, 118, 3, 220, 115, 26, 202, 84, 8, 4, 1, 118, 3, + 220, 115, 26, 202, 84, 8, 4, 1, 251, 246, 3, 233, 100, 8, 4, 1, 192, 177, + 3, 233, 100, 8, 4, 1, 192, 177, 3, 186, 8, 4, 1, 163, 199, 231, 3, 233, + 100, 8, 4, 1, 163, 199, 231, 3, 186, 8, 4, 1, 208, 164, 3, 233, 100, 8, + 4, 1, 208, 164, 3, 186, 8, 4, 1, 231, 164, 208, 164, 3, 233, 100, 8, 4, + 1, 231, 164, 208, 164, 3, 186, 9, 207, 87, 93, 3, 232, 214, 90, 3, 251, + 164, 9, 207, 87, 93, 3, 232, 214, 90, 3, 197, 117, 9, 207, 87, 93, 3, + 232, 214, 90, 3, 151, 220, 69, 9, 207, 87, 93, 3, 232, 214, 90, 3, 214, + 164, 9, 207, 87, 93, 3, 232, 214, 90, 3, 66, 9, 207, 87, 93, 3, 232, 214, + 90, 3, 195, 217, 9, 207, 87, 93, 3, 232, 214, 90, 3, 69, 9, 207, 87, 93, + 3, 232, 214, 90, 3, 251, 245, 9, 207, 87, 216, 32, 3, 224, 191, 248, 219, + 1, 224, 121, 42, 108, 225, 80, 42, 108, 217, 73, 42, 108, 247, 207, 42, + 108, 215, 111, 42, 108, 201, 81, 42, 108, 216, 87, 42, 108, 203, 216, 42, + 108, 218, 55, 42, 108, 214, 3, 42, 108, 221, 136, 42, 108, 196, 148, 42, + 108, 144, 42, 108, 159, 42, 108, 199, 230, 42, 108, 222, 27, 42, 108, + 222, 38, 42, 108, 209, 182, 42, 108, 216, 69, 42, 108, 225, 217, 42, 108, + 207, 52, 42, 108, 205, 83, 42, 108, 209, 80, 42, 108, 233, 15, 42, 108, + 223, 202, 42, 5, 225, 55, 42, 5, 224, 101, 42, 5, 224, 80, 42, 5, 223, + 187, 42, 5, 223, 144, 42, 5, 224, 209, 42, 5, 224, 200, 42, 5, 225, 31, + 42, 5, 224, 11, 42, 5, 223, 242, 42, 5, 224, 228, 42, 5, 217, 70, 42, 5, + 217, 19, 42, 5, 217, 15, 42, 5, 216, 240, 42, 5, 216, 231, 42, 5, 217, + 58, 42, 5, 217, 56, 42, 5, 217, 67, 42, 5, 216, 252, 42, 5, 216, 247, 42, + 5, 217, 60, 42, 5, 247, 173, 42, 5, 245, 11, 42, 5, 245, 1, 42, 5, 241, + 41, 42, 5, 241, 0, 42, 5, 247, 57, 42, 5, 247, 49, 42, 5, 247, 162, 42, + 5, 244, 182, 42, 5, 241, 117, 42, 5, 247, 90, 42, 5, 215, 108, 42, 5, + 215, 89, 42, 5, 215, 83, 42, 5, 215, 66, 42, 5, 215, 58, 42, 5, 215, 98, + 42, 5, 215, 97, 42, 5, 215, 105, 42, 5, 215, 73, 42, 5, 215, 70, 42, 5, + 215, 101, 42, 5, 201, 77, 42, 5, 201, 57, 42, 5, 201, 56, 42, 5, 201, 45, + 42, 5, 201, 42, 42, 5, 201, 73, 42, 5, 201, 72, 42, 5, 201, 76, 42, 5, + 201, 55, 42, 5, 201, 54, 42, 5, 201, 75, 42, 5, 216, 85, 42, 5, 216, 71, + 42, 5, 216, 70, 42, 5, 216, 54, 42, 5, 216, 53, 42, 5, 216, 81, 42, 5, + 216, 80, 42, 5, 216, 84, 42, 5, 216, 56, 42, 5, 216, 55, 42, 5, 216, 83, + 42, 5, 203, 162, 42, 5, 202, 122, 42, 5, 202, 99, 42, 5, 201, 40, 42, 5, + 200, 251, 42, 5, 203, 68, 42, 5, 203, 48, 42, 5, 203, 137, 42, 5, 149, + 42, 5, 201, 247, 42, 5, 203, 89, 42, 5, 217, 244, 42, 5, 216, 223, 42, 5, + 216, 190, 42, 5, 215, 186, 42, 5, 215, 123, 42, 5, 217, 118, 42, 5, 217, + 107, 42, 5, 217, 230, 42, 5, 216, 50, 42, 5, 216, 33, 42, 5, 217, 202, + 42, 5, 213, 243, 42, 5, 212, 220, 42, 5, 212, 182, 42, 5, 211, 227, 42, + 5, 211, 191, 42, 5, 213, 92, 42, 5, 213, 79, 42, 5, 213, 221, 42, 5, 212, + 117, 42, 5, 212, 91, 42, 5, 213, 108, 42, 5, 220, 119, 42, 5, 219, 78, + 42, 5, 219, 40, 42, 5, 218, 145, 42, 5, 218, 85, 42, 5, 219, 207, 42, 5, + 219, 188, 42, 5, 220, 81, 42, 5, 218, 251, 42, 5, 218, 195, 42, 5, 219, + 255, 42, 5, 196, 129, 42, 5, 196, 24, 42, 5, 196, 14, 42, 5, 195, 217, + 42, 5, 195, 180, 42, 5, 196, 69, 42, 5, 196, 66, 42, 5, 196, 108, 42, 5, + 196, 3, 42, 5, 195, 237, 42, 5, 196, 80, 42, 5, 210, 244, 42, 5, 210, 72, + 42, 5, 210, 9, 42, 5, 209, 140, 42, 5, 209, 101, 42, 5, 210, 183, 42, 5, + 210, 155, 42, 5, 210, 224, 42, 5, 209, 232, 42, 5, 209, 206, 42, 5, 210, + 193, 42, 5, 223, 82, 42, 5, 222, 109, 42, 5, 222, 91, 42, 5, 221, 191, + 42, 5, 221, 162, 42, 5, 222, 197, 42, 5, 222, 188, 42, 5, 223, 54, 42, 5, + 222, 7, 42, 5, 221, 229, 42, 5, 222, 215, 42, 5, 199, 151, 42, 5, 199, + 34, 42, 5, 199, 18, 42, 5, 197, 220, 42, 5, 197, 212, 42, 5, 199, 118, + 42, 5, 199, 113, 42, 5, 199, 147, 42, 5, 198, 248, 42, 5, 198, 233, 42, + 5, 199, 124, 42, 5, 222, 25, 42, 5, 222, 20, 42, 5, 222, 19, 42, 5, 222, + 16, 42, 5, 222, 15, 42, 5, 222, 22, 42, 5, 222, 21, 42, 5, 222, 24, 42, + 5, 222, 18, 42, 5, 222, 17, 42, 5, 222, 23, 42, 5, 222, 36, 42, 5, 222, + 29, 42, 5, 222, 28, 42, 5, 222, 12, 42, 5, 222, 11, 42, 5, 222, 32, 42, + 5, 222, 31, 42, 5, 222, 35, 42, 5, 222, 14, 42, 5, 222, 13, 42, 5, 222, + 33, 42, 5, 209, 180, 42, 5, 209, 169, 42, 5, 209, 168, 42, 5, 209, 161, + 42, 5, 209, 154, 42, 5, 209, 176, 42, 5, 209, 175, 42, 5, 209, 179, 42, + 5, 209, 167, 42, 5, 209, 166, 42, 5, 209, 178, 42, 5, 216, 67, 42, 5, + 216, 62, 42, 5, 216, 61, 42, 5, 216, 58, 42, 5, 216, 57, 42, 5, 216, 64, + 42, 5, 216, 63, 42, 5, 216, 66, 42, 5, 216, 60, 42, 5, 216, 59, 42, 5, + 216, 65, 42, 5, 225, 213, 42, 5, 225, 172, 42, 5, 225, 164, 42, 5, 225, + 110, 42, 5, 225, 90, 42, 5, 225, 193, 42, 5, 225, 191, 42, 5, 225, 207, + 42, 5, 225, 129, 42, 5, 225, 119, 42, 5, 225, 200, 42, 5, 207, 45, 42, 5, + 206, 223, 42, 5, 206, 218, 42, 5, 206, 151, 42, 5, 206, 133, 42, 5, 206, + 255, 42, 5, 206, 253, 42, 5, 207, 34, 42, 5, 206, 198, 42, 5, 206, 190, + 42, 5, 207, 8, 42, 5, 205, 79, 42, 5, 205, 47, 42, 5, 205, 43, 42, 5, + 205, 34, 42, 5, 205, 31, 42, 5, 205, 53, 42, 5, 205, 52, 42, 5, 205, 78, + 42, 5, 205, 39, 42, 5, 205, 38, 42, 5, 205, 55, 42, 5, 209, 13, 42, 5, + 206, 112, 42, 5, 206, 84, 42, 5, 204, 172, 42, 5, 204, 74, 42, 5, 208, + 147, 42, 5, 208, 129, 42, 5, 208, 253, 42, 5, 205, 200, 42, 5, 205, 171, + 42, 5, 208, 191, 42, 5, 232, 246, 42, 5, 232, 71, 42, 5, 232, 43, 42, 5, + 231, 75, 42, 5, 231, 46, 42, 5, 232, 147, 42, 5, 232, 118, 42, 5, 232, + 235, 42, 5, 231, 193, 42, 5, 231, 166, 42, 5, 232, 158, 42, 5, 223, 201, + 42, 5, 223, 200, 42, 5, 223, 195, 42, 5, 223, 194, 42, 5, 223, 191, 42, + 5, 223, 190, 42, 5, 223, 197, 42, 5, 223, 196, 42, 5, 223, 199, 42, 5, + 223, 193, 42, 5, 223, 192, 42, 5, 223, 198, 42, 5, 206, 158, 153, 108, 2, + 196, 94, 153, 108, 2, 210, 212, 153, 108, 2, 210, 121, 94, 1, 200, 170, + 89, 108, 2, 244, 175, 155, 89, 108, 2, 244, 175, 224, 146, 89, 108, 2, + 244, 175, 224, 11, 89, 108, 2, 244, 175, 224, 117, 89, 108, 2, 244, 175, + 216, 252, 89, 108, 2, 244, 175, 247, 174, 89, 108, 2, 244, 175, 247, 16, + 89, 108, 2, 244, 175, 244, 182, 89, 108, 2, 244, 175, 245, 49, 89, 108, + 2, 244, 175, 215, 73, 89, 108, 2, 244, 175, 240, 136, 89, 108, 2, 244, + 175, 201, 66, 89, 108, 2, 244, 175, 239, 28, 89, 108, 2, 244, 175, 201, + 61, 89, 108, 2, 244, 175, 176, 89, 108, 2, 244, 175, 189, 89, 108, 2, + 244, 175, 202, 233, 89, 108, 2, 244, 175, 149, 89, 108, 2, 244, 175, 202, + 169, 89, 108, 2, 244, 175, 216, 50, 89, 108, 2, 244, 175, 249, 145, 89, + 108, 2, 244, 175, 213, 6, 89, 108, 2, 244, 175, 212, 117, 89, 108, 2, + 244, 175, 212, 234, 89, 108, 2, 244, 175, 218, 251, 89, 108, 2, 244, 175, + 196, 3, 89, 108, 2, 244, 175, 209, 232, 89, 108, 2, 244, 175, 222, 7, 89, + 108, 2, 244, 175, 198, 248, 89, 108, 2, 244, 175, 207, 50, 89, 108, 2, + 244, 175, 205, 80, 89, 108, 2, 244, 175, 183, 89, 108, 2, 244, 175, 142, + 89, 108, 2, 244, 175, 172, 89, 18, 2, 244, 175, 211, 159, 89, 226, 73, + 18, 2, 244, 175, 211, 97, 89, 226, 73, 18, 2, 244, 175, 209, 89, 89, 226, + 73, 18, 2, 244, 175, 209, 82, 89, 226, 73, 18, 2, 244, 175, 211, 139, 89, + 18, 2, 214, 127, 89, 18, 2, 252, 129, 188, 1, 248, 177, 217, 71, 188, 1, + 248, 177, 217, 19, 188, 1, 248, 177, 216, 240, 188, 1, 248, 177, 217, 58, + 188, 1, 248, 177, 216, 252, 71, 1, 248, 177, 217, 71, 71, 1, 248, 177, + 217, 19, 71, 1, 248, 177, 216, 240, 71, 1, 248, 177, 217, 58, 71, 1, 248, + 177, 216, 252, 71, 1, 251, 192, 247, 57, 71, 1, 251, 192, 201, 40, 71, 1, + 251, 192, 149, 71, 1, 251, 192, 214, 3, 73, 1, 236, 74, 236, 73, 241, + 125, 152, 154, 73, 1, 236, 73, 236, 74, 241, 125, 152, 154, }; static const unsigned short phrasebook_offset1[] = { @@ -20895,33 +20899,33 @@ static const unsigned int phrasebook_offset2[] = { 66787, 66791, 66794, 66798, 66802, 66806, 66810, 66813, 66817, 66821, 66825, 66828, 66831, 66835, 66839, 66843, 66847, 66850, 66854, 66858, 66862, 66866, 66869, 66873, 66877, 66881, 66885, 66888, 66892, 66896, - 66899, 66903, 66907, 66911, 66915, 66919, 66923, 66927, 0, 66931, 66934, - 66937, 66940, 66943, 66946, 66949, 66952, 66955, 66958, 66961, 66964, - 66967, 66970, 66973, 66976, 66979, 66982, 66985, 66988, 66991, 66994, - 66997, 67000, 67003, 67006, 67009, 67012, 67015, 67018, 67021, 67024, - 67027, 67030, 67033, 67036, 67039, 67042, 67045, 67048, 67051, 67054, - 67057, 67060, 67063, 67066, 67069, 67072, 67075, 67078, 67081, 67084, - 67087, 67090, 67093, 67096, 67099, 67102, 67105, 67108, 67111, 67114, - 67117, 67120, 67123, 67126, 67129, 67132, 67135, 67138, 67141, 67144, - 67147, 67150, 67153, 67156, 67159, 67162, 67165, 67168, 67171, 67174, - 67177, 67180, 67183, 67186, 67189, 67192, 67195, 67204, 67212, 67220, - 67228, 67236, 67244, 67252, 67260, 67268, 67276, 67285, 67294, 67303, - 67312, 67321, 67330, 67339, 67348, 67357, 67366, 67375, 67384, 67393, - 67402, 67411, 67414, 67417, 67420, 67422, 67425, 67428, 67431, 67436, - 67441, 67444, 67451, 67458, 67465, 67472, 67475, 67480, 67482, 67486, - 67488, 67490, 67493, 67496, 67499, 67502, 67505, 67508, 67511, 67516, - 67521, 67524, 67527, 67530, 67533, 67536, 67539, 67542, 67546, 67549, - 67552, 67555, 67558, 67561, 67566, 67569, 67572, 67575, 67580, 67585, - 67590, 67595, 67600, 67605, 67610, 67615, 67621, 67629, 67631, 67634, - 67637, 67640, 67643, 67649, 67657, 67660, 67663, 67668, 67671, 67674, - 67677, 67682, 67685, 67688, 67693, 67696, 67699, 67704, 67707, 67710, - 67715, 67720, 67725, 67728, 67731, 67734, 67737, 67743, 67746, 67749, - 67752, 67754, 67757, 67760, 67763, 67768, 67771, 67774, 67777, 67780, - 67783, 67788, 67791, 67794, 67797, 67800, 67803, 67806, 67809, 67812, - 67815, 67821, 67826, 67834, 67842, 67850, 67858, 67866, 67874, 67882, - 67890, 67898, 67907, 67916, 67925, 67934, 67943, 67952, 67961, 67970, - 67979, 67988, 67997, 68006, 68015, 68024, 68033, 68042, 68051, 68060, - 68069, 68078, 68087, 68096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66899, 66903, 66907, 66911, 66915, 66919, 66923, 66927, 66931, 66938, + 66941, 66944, 66947, 66950, 66953, 66956, 66959, 66962, 66965, 66968, + 66971, 66974, 66977, 66980, 66983, 66986, 66989, 66992, 66995, 66998, + 67001, 67004, 67007, 67010, 67013, 67016, 67019, 67022, 67025, 67028, + 67031, 67034, 67037, 67040, 67043, 67046, 67049, 67052, 67055, 67058, + 67061, 67064, 67067, 67070, 67073, 67076, 67079, 67082, 67085, 67088, + 67091, 67094, 67097, 67100, 67103, 67106, 67109, 67112, 67115, 67118, + 67121, 67124, 67127, 67130, 67133, 67136, 67139, 67142, 67145, 67148, + 67151, 67154, 67157, 67160, 67163, 67166, 67169, 67172, 67175, 67178, + 67181, 67184, 67187, 67190, 67193, 67196, 67199, 67202, 67211, 67219, + 67227, 67235, 67243, 67251, 67259, 67267, 67275, 67283, 67292, 67301, + 67310, 67319, 67328, 67337, 67346, 67355, 67364, 67373, 67382, 67391, + 67400, 67409, 67418, 67421, 67424, 67427, 67429, 67432, 67435, 67438, + 67443, 67448, 67451, 67458, 67465, 67472, 67479, 67482, 67487, 67489, + 67493, 67495, 67497, 67500, 67503, 67506, 67509, 67512, 67515, 67518, + 67523, 67528, 67531, 67534, 67537, 67540, 67543, 67546, 67549, 67553, + 67556, 67559, 67562, 67565, 67568, 67573, 67576, 67579, 67582, 67587, + 67592, 67597, 67602, 67607, 67612, 67617, 67622, 67628, 67636, 67638, + 67641, 67644, 67647, 67650, 67656, 67664, 67667, 67670, 67675, 67678, + 67681, 67684, 67689, 67692, 67695, 67700, 67703, 67706, 67711, 67714, + 67717, 67722, 67727, 67732, 67735, 67738, 67741, 67744, 67750, 67753, + 67756, 67759, 67761, 67764, 67767, 67770, 67775, 67778, 67781, 67784, + 67787, 67790, 67795, 67798, 67801, 67804, 67807, 67810, 67813, 67816, + 67819, 67822, 67828, 67833, 67841, 67849, 67857, 67865, 67873, 67881, + 67889, 67897, 67905, 67914, 67923, 67932, 67941, 67950, 67959, 67968, + 67977, 67986, 67995, 68004, 68013, 68022, 68031, 68040, 68049, 68058, + 68067, 68076, 68085, 68094, 68103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -20929,1032 +20933,1032 @@ static const unsigned int phrasebook_offset2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 68099, 68108, 68117, 68128, 68135, 68140, - 68145, 68152, 68159, 68165, 68170, 68175, 68180, 68185, 68192, 68197, - 68202, 68207, 68218, 68223, 68228, 68235, 68240, 68247, 68252, 68257, - 68264, 68271, 68278, 68287, 68296, 68301, 68306, 68311, 68318, 68323, - 68333, 68340, 68345, 68350, 68355, 68360, 68365, 68370, 68379, 68386, - 68393, 68398, 68405, 68410, 68417, 68426, 68437, 68442, 68451, 68456, - 68463, 68472, 68481, 68486, 68491, 68498, 68504, 68511, 68518, 68522, - 68526, 68529, 68533, 68537, 68541, 68545, 68549, 68553, 68557, 68560, - 68564, 68568, 68572, 68576, 68580, 68584, 68587, 68591, 68595, 68598, - 68602, 68606, 68610, 68614, 68618, 68622, 68626, 68630, 68634, 68638, - 68642, 68646, 68650, 68654, 68658, 68662, 68666, 68670, 68674, 68678, - 68682, 68686, 68690, 68694, 68698, 68702, 68706, 68710, 68714, 68718, - 68722, 68726, 68730, 68734, 68738, 68742, 68746, 68750, 68754, 68758, - 68762, 68766, 68770, 68774, 68777, 68781, 68785, 68789, 68793, 68797, - 68801, 68805, 68809, 68813, 68817, 68821, 68825, 68829, 68833, 68837, - 68841, 68845, 68849, 68853, 68857, 68861, 68865, 68869, 68873, 68877, - 68881, 68885, 68889, 68893, 68897, 68901, 68905, 68909, 68913, 68917, - 68921, 68925, 68929, 68933, 68937, 68941, 68945, 68949, 68953, 68957, - 68961, 68965, 68969, 68973, 68977, 68981, 68985, 68989, 68993, 68997, - 69001, 69005, 69009, 69013, 69017, 69021, 69025, 69029, 69033, 69037, - 69041, 69045, 69049, 69053, 69057, 69061, 69065, 69069, 69073, 69077, - 69081, 69085, 69089, 69093, 69097, 69101, 69105, 69109, 69113, 69117, - 69121, 69125, 69129, 69133, 69137, 69141, 69145, 69149, 69153, 69157, - 69161, 69165, 69169, 69173, 69177, 69181, 69185, 69189, 69193, 69197, - 69201, 69205, 69209, 69213, 69217, 69221, 69225, 69229, 69233, 69237, - 69241, 69245, 69248, 69252, 69256, 69260, 69264, 69268, 69272, 69276, - 69280, 69284, 69288, 69292, 69296, 69300, 69304, 69308, 69312, 69316, - 69320, 69324, 69328, 69332, 69336, 69340, 69344, 69348, 69352, 69356, - 69360, 69364, 69368, 69372, 69376, 69380, 69384, 69388, 69392, 69396, - 69400, 69404, 69408, 69412, 69416, 69420, 69424, 69428, 69432, 69436, - 69440, 69444, 69448, 69452, 69456, 69460, 69464, 69468, 69472, 69476, - 69480, 69484, 69488, 69492, 69496, 69500, 69504, 69508, 69512, 69516, - 69520, 69524, 69528, 69532, 69536, 69540, 69544, 69548, 69552, 69556, - 69560, 69564, 69568, 69572, 69576, 69580, 69584, 69588, 69592, 69596, - 69600, 69604, 69608, 69612, 69616, 69620, 69624, 69628, 69632, 69636, - 69640, 69644, 69648, 69652, 69656, 69660, 69664, 69668, 69672, 69676, - 69679, 69683, 69687, 69691, 69695, 69699, 69703, 69707, 69710, 69714, - 69718, 69722, 69726, 69730, 69734, 69738, 69742, 69746, 69750, 69754, - 69758, 69762, 69766, 69770, 69774, 69778, 69782, 69786, 69790, 69794, - 69798, 69802, 69806, 69810, 69814, 69818, 69822, 69826, 69830, 69834, - 69838, 69842, 69846, 69850, 69854, 69858, 69862, 69866, 69870, 69874, - 69878, 69882, 69886, 69890, 69894, 69898, 69902, 69906, 69910, 69914, - 69918, 69922, 69926, 69930, 69934, 69938, 69942, 69946, 69950, 69954, - 69958, 69962, 69966, 69970, 69974, 69978, 69982, 69986, 69990, 69994, - 69998, 70002, 70006, 70010, 70014, 70018, 70022, 70026, 70030, 70034, - 70038, 70042, 70046, 70050, 70054, 70058, 70062, 70066, 70069, 70073, - 70077, 70081, 70085, 70089, 70093, 70097, 70101, 70105, 70109, 70113, - 70117, 70121, 70125, 70129, 70133, 70137, 70141, 70145, 70149, 70153, - 70157, 70161, 70165, 70169, 70173, 70177, 70181, 70185, 70189, 70193, - 70197, 70201, 70205, 70209, 70213, 70217, 70221, 70225, 70229, 70233, - 70237, 70241, 70245, 70249, 70253, 70257, 70261, 70265, 70269, 70273, - 70277, 70281, 70285, 70289, 70293, 70297, 70301, 70305, 70308, 70312, - 70316, 70320, 70324, 70328, 70332, 70336, 70340, 70344, 70348, 70352, - 70356, 70360, 70364, 70368, 70372, 70376, 70380, 70384, 70388, 70392, - 70396, 70400, 70404, 70408, 70412, 70416, 70420, 70424, 70428, 70432, - 70436, 70440, 70444, 70448, 70452, 70456, 70460, 70464, 70468, 70472, - 70476, 70480, 70484, 70488, 70492, 70496, 70500, 70504, 70508, 70512, - 70516, 70520, 70524, 70528, 70532, 70536, 70540, 70544, 70548, 70552, - 70556, 70560, 70563, 70567, 70571, 70575, 70579, 70583, 70587, 70591, - 70595, 70599, 70603, 70607, 70611, 70615, 70619, 70623, 70627, 70631, - 70635, 70639, 70643, 70647, 70651, 70655, 70659, 70663, 70667, 70671, - 70675, 70679, 70683, 70687, 70691, 70695, 70699, 70703, 70707, 70711, - 70715, 70719, 70723, 70727, 70731, 70735, 70739, 70743, 70747, 70751, - 70755, 70759, 70763, 70767, 70771, 70775, 70779, 70783, 70787, 70791, - 70795, 70799, 70803, 70807, 70811, 70815, 70819, 70823, 70827, 70831, - 70835, 70839, 70843, 70847, 70851, 70855, 70859, 70863, 70867, 70871, - 70875, 70879, 70883, 70887, 70891, 70895, 70899, 70903, 70907, 70911, - 70915, 70919, 70923, 70927, 70931, 70935, 70939, 70943, 70947, 70951, - 70955, 70959, 70963, 70967, 70971, 70975, 70979, 70983, 70987, 70991, - 70995, 70999, 71003, 71007, 71011, 71015, 71018, 71022, 71026, 71030, - 71034, 71038, 71042, 71046, 71050, 71054, 71058, 71062, 71066, 71070, - 71074, 71078, 71082, 71086, 71090, 71094, 71098, 71102, 71106, 71110, - 71114, 71118, 71122, 71126, 71130, 71134, 71138, 71142, 71146, 71150, - 71154, 71158, 71162, 71166, 71170, 71174, 71178, 71182, 71186, 71190, - 71194, 71198, 71202, 71206, 71210, 71214, 71218, 71222, 71226, 71230, - 71234, 71238, 71242, 71246, 71250, 71254, 71258, 71262, 71266, 71270, - 71274, 71278, 71282, 71286, 71290, 71294, 71298, 71302, 71306, 71310, - 71314, 71318, 71322, 71326, 71330, 71334, 71338, 71342, 71346, 71350, - 71354, 71358, 71362, 71366, 71370, 71374, 71378, 71382, 71386, 71390, - 71394, 71398, 71402, 71406, 71410, 71414, 71418, 71422, 71426, 71430, - 71434, 71438, 71442, 71446, 71450, 71454, 71458, 71462, 71466, 71470, - 71474, 71478, 71482, 71486, 71490, 71494, 71498, 71502, 71506, 71510, - 71514, 71518, 71522, 71526, 71530, 71534, 71538, 71542, 71546, 71550, - 71554, 71558, 71562, 71566, 71570, 71574, 71578, 71582, 71586, 71590, - 71594, 71598, 71602, 71606, 71610, 71614, 71618, 71621, 71625, 71629, - 71633, 71637, 71641, 71645, 71649, 71652, 71656, 71660, 71664, 71668, - 71672, 71676, 71680, 71684, 71688, 71692, 71696, 71700, 71704, 71708, - 71712, 71716, 71720, 71724, 71728, 71732, 71736, 71740, 71744, 71748, - 71752, 71756, 71760, 71764, 71768, 71772, 71776, 71780, 71784, 71788, - 71792, 71796, 71800, 71804, 71808, 71812, 71816, 71820, 71824, 71828, - 71832, 71836, 71840, 71844, 71848, 71852, 71856, 71860, 71864, 71868, - 71872, 71876, 71880, 71884, 71888, 71892, 71896, 71900, 71904, 71908, - 71912, 71916, 71920, 71924, 71928, 71932, 71936, 71940, 71944, 71948, - 71952, 71956, 71960, 71964, 71968, 71972, 71976, 71980, 71984, 71988, - 71992, 71996, 72000, 72004, 72008, 72012, 72016, 72020, 72024, 72028, - 72032, 72036, 72040, 72044, 72048, 72052, 72056, 72060, 72064, 72068, - 72072, 72076, 72080, 72084, 72088, 72092, 72096, 72100, 72104, 72108, - 72112, 72116, 72120, 72124, 72128, 72132, 72136, 72140, 72144, 72148, - 72152, 72156, 72160, 72164, 72168, 72172, 72176, 72180, 72184, 72188, - 72192, 72196, 72200, 72204, 72208, 72212, 72216, 72220, 72224, 72228, - 72232, 72236, 72240, 72244, 72248, 72252, 72256, 72260, 72264, 72268, - 72272, 72276, 72280, 72284, 72288, 72292, 72296, 72300, 72304, 72308, - 72312, 72316, 72320, 72324, 72328, 72332, 72336, 72340, 72344, 72348, - 72352, 72356, 72360, 72364, 72368, 72372, 72376, 72379, 72383, 72387, - 72391, 72395, 72399, 72403, 72407, 72411, 72415, 72419, 72423, 72427, - 72431, 72435, 72439, 72443, 72447, 72451, 72455, 72459, 72463, 72467, - 72471, 72475, 72479, 72483, 72487, 72491, 72495, 72499, 72503, 72507, - 72511, 72515, 72519, 72523, 72527, 72531, 72535, 72539, 72543, 72547, - 72551, 72555, 72559, 72563, 72567, 72571, 72575, 72579, 72583, 72587, - 72591, 72595, 72599, 72603, 72607, 72611, 72615, 72619, 72623, 72627, - 72631, 72635, 72639, 72643, 72647, 72651, 72655, 72659, 72663, 72667, - 72671, 72675, 72679, 72683, 72687, 72691, 72695, 72699, 72703, 72707, - 72711, 72715, 72719, 72723, 72727, 72731, 72735, 72739, 72743, 72747, - 72751, 72755, 72759, 72763, 72767, 72771, 72775, 72779, 72783, 72787, - 72791, 72795, 72799, 72803, 72807, 72811, 72815, 72819, 72823, 72827, - 72831, 72835, 72839, 72843, 72847, 72851, 72855, 72859, 72863, 72867, - 72871, 72875, 72879, 72883, 72887, 72891, 72895, 72899, 72903, 72907, - 72911, 72915, 72919, 72923, 72927, 72931, 72935, 72939, 72943, 72947, - 72951, 72955, 72959, 72963, 72967, 72971, 72975, 72979, 72983, 72987, - 72991, 72995, 72999, 73003, 73007, 73011, 73015, 73019, 73023, 73027, - 73031, 73035, 73039, 73043, 73047, 73051, 73055, 73059, 73063, 73067, - 73071, 73075, 73079, 73083, 73087, 73091, 73095, 73099, 73103, 73107, - 73111, 73115, 73119, 73123, 73127, 73131, 73135, 73139, 73143, 73147, - 73151, 73155, 73159, 0, 0, 0, 73163, 73167, 73171, 73175, 73179, 73183, - 73187, 73191, 73195, 73199, 73203, 73207, 73211, 73215, 73219, 73223, - 73227, 73231, 73235, 73239, 73243, 73247, 73251, 73255, 73259, 73263, - 73267, 73271, 73275, 73279, 73283, 73287, 73291, 73295, 73299, 73303, - 73307, 73311, 73315, 73319, 73323, 73327, 73331, 73335, 73339, 73343, - 73347, 73351, 73355, 73359, 73363, 73367, 73371, 73375, 73379, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 73383, 73388, 73392, 73397, 73402, 73406, 73411, 73416, - 73420, 73425, 73430, 73435, 73440, 73445, 73450, 73455, 73459, 73463, - 73467, 73471, 73476, 73481, 73486, 73490, 73495, 73500, 73505, 73510, - 73515, 73519, 73524, 73528, 73533, 73537, 73542, 73546, 73550, 73554, - 73559, 73564, 73569, 73577, 73585, 73593, 73601, 73608, 73616, 73622, - 73630, 73634, 73638, 73642, 73646, 73650, 73654, 73658, 73662, 73666, - 73670, 73674, 73678, 73682, 73686, 73690, 73694, 73698, 73702, 73706, - 73710, 73714, 73718, 73722, 73726, 73730, 73734, 73738, 73742, 73746, - 73750, 73754, 73758, 73762, 73766, 73770, 73774, 73777, 73781, 73785, - 73789, 73793, 73797, 73801, 73805, 73809, 73813, 73817, 73821, 73825, - 73829, 73833, 73837, 73841, 73845, 73849, 73853, 73857, 73861, 73865, - 73869, 73873, 73877, 73881, 73885, 73889, 73893, 73897, 73901, 73905, - 73909, 73913, 73917, 73921, 73924, 73928, 73932, 73935, 73939, 73943, - 73947, 73950, 73954, 73958, 73962, 73966, 73970, 73974, 73978, 73982, - 73986, 73989, 73993, 73997, 74001, 74004, 74007, 74011, 74015, 74018, - 74022, 74026, 74030, 74034, 74038, 74042, 74045, 74048, 74052, 74056, - 74060, 74063, 74066, 74070, 74074, 74078, 74082, 74086, 74090, 74094, - 74098, 74102, 74106, 74110, 74114, 74118, 74122, 74126, 74130, 74134, - 74138, 74142, 74146, 74150, 74154, 74158, 74162, 74166, 74170, 74174, - 74178, 74182, 74186, 74190, 74194, 74198, 74202, 74206, 74210, 74214, - 74217, 74221, 74225, 74229, 74233, 74237, 74241, 74245, 74249, 74253, - 74257, 74261, 74265, 74269, 74273, 74277, 74281, 74285, 74289, 74293, - 74297, 74301, 74305, 74309, 74313, 74317, 74321, 74325, 74329, 74333, - 74337, 74341, 74345, 74349, 74353, 74357, 74361, 74364, 74368, 74372, - 74376, 74380, 74384, 74388, 74392, 74396, 74400, 74404, 74408, 74412, - 74416, 74420, 74424, 74428, 74431, 74435, 74439, 74443, 74447, 74451, - 74455, 74459, 74463, 74467, 74471, 74475, 74479, 74483, 74487, 74491, - 74495, 74499, 74503, 74507, 74511, 74515, 74518, 74522, 74526, 74530, - 74534, 74538, 74542, 74546, 74550, 74554, 74558, 74562, 74566, 74570, - 74574, 74578, 74582, 74586, 74590, 74594, 74598, 74602, 74606, 74610, - 74614, 74618, 74622, 74626, 74630, 74634, 74638, 74642, 74646, 74650, - 74654, 74658, 74662, 74666, 74670, 74674, 74678, 74682, 74686, 74690, - 74693, 74698, 74702, 74708, 74713, 74719, 74723, 74727, 74731, 74735, - 74739, 74743, 74747, 74751, 74755, 74759, 74763, 74767, 74771, 74775, - 74778, 74781, 74784, 74787, 74790, 74793, 74796, 74799, 74802, 74807, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74813, 74818, - 74823, 74828, 74833, 74840, 74847, 74852, 74857, 74862, 74867, 74874, - 74881, 74888, 74895, 74902, 74909, 74919, 74929, 74936, 74943, 74950, - 74957, 74963, 74969, 74978, 74987, 74994, 75001, 75012, 75023, 75028, - 75033, 75040, 75047, 75054, 75061, 75068, 75075, 75082, 75089, 75095, - 75101, 75107, 75113, 75120, 75127, 75132, 75136, 75143, 75150, 75157, - 75161, 75168, 75172, 75177, 75181, 75187, 75192, 75198, 75203, 75207, - 75211, 75214, 75217, 75222, 75227, 75232, 75237, 75242, 75247, 75252, - 75257, 75262, 75267, 75275, 75283, 75288, 75293, 75298, 75303, 75308, - 75313, 75318, 75323, 75328, 75333, 75338, 75343, 75348, 75353, 75359, - 75365, 75371, 75377, 75382, 75388, 75391, 75394, 75397, 75401, 75405, - 75409, 75413, 75416, 75420, 75423, 75426, 75429, 75433, 75437, 75441, - 75445, 75449, 75453, 75457, 75461, 75465, 75469, 75473, 75477, 75481, - 75485, 75489, 75493, 75497, 75501, 75505, 75509, 75513, 75517, 75520, - 75524, 75528, 75532, 75536, 75540, 75544, 75548, 75552, 75556, 75560, - 75564, 75568, 75572, 75576, 75580, 75584, 75588, 75592, 75596, 75600, - 75604, 75608, 75612, 75616, 75619, 75623, 75627, 75631, 75635, 75639, - 75643, 75647, 75650, 75654, 75658, 75662, 75666, 75670, 75674, 75678, - 75682, 75686, 75690, 75694, 75698, 75703, 75708, 75711, 75716, 75719, - 75722, 75725, 0, 0, 0, 0, 0, 0, 0, 0, 75729, 75738, 75747, 75756, 75765, - 75774, 75783, 75792, 75801, 75809, 75816, 75824, 75831, 75839, 75849, - 75858, 75868, 75877, 75887, 75895, 75902, 75910, 75917, 75925, 75930, - 75935, 75941, 75950, 75956, 75962, 75969, 75978, 75986, 75994, 76002, - 76009, 76016, 76023, 76030, 76035, 76040, 76045, 76050, 76055, 76060, - 76065, 76070, 76078, 76086, 76092, 76098, 76103, 76108, 76113, 76118, - 76123, 76128, 76133, 76138, 76147, 76156, 76161, 76166, 76176, 76186, - 76193, 76200, 76209, 76218, 76230, 76242, 76248, 76254, 76262, 76270, - 76280, 76290, 76297, 76304, 76309, 76314, 76326, 76338, 76346, 76354, - 76364, 76374, 76386, 76398, 76407, 76416, 76423, 76430, 76437, 76444, - 76453, 76462, 76467, 76472, 76479, 76486, 76493, 76500, 76512, 76524, - 76529, 76534, 76539, 76544, 76549, 76554, 76559, 76564, 76568, 76573, - 76578, 76583, 76588, 76593, 76599, 76604, 76609, 76616, 76623, 76630, - 76637, 76644, 76652, 76660, 76665, 76670, 76676, 76682, 76689, 76696, - 76703, 76710, 76717, 76721, 76728, 76733, 76738, 76744, 76757, 76763, - 76771, 76779, 76786, 76793, 76802, 76811, 76818, 76825, 76832, 76839, - 76846, 76853, 76860, 76867, 76874, 76881, 76890, 76899, 76908, 76917, - 76926, 76935, 76944, 76953, 76962, 76971, 76978, 76985, 76991, 76999, - 77005, 77011, 77017, 77023, 77031, 77036, 77041, 77046, 77051, 77056, - 77062, 77068, 77074, 77080, 77086, 77092, 77098, 0, 0, 77104, 77111, - 77118, 77127, 77134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68106, 68115, 68124, 68135, 68142, + 68147, 68152, 68159, 68166, 68172, 68177, 68182, 68187, 68192, 68199, + 68204, 68209, 68214, 68225, 68230, 68235, 68242, 68247, 68254, 68259, + 68264, 68271, 68278, 68285, 68294, 68303, 68308, 68313, 68318, 68325, + 68330, 68340, 68347, 68352, 68357, 68362, 68367, 68372, 68377, 68386, + 68393, 68400, 68405, 68412, 68417, 68424, 68433, 68444, 68449, 68458, + 68463, 68470, 68479, 68488, 68493, 68498, 68505, 68511, 68518, 68525, + 68529, 68533, 68536, 68540, 68544, 68548, 68552, 68556, 68560, 68564, + 68567, 68571, 68575, 68579, 68583, 68587, 68591, 68594, 68598, 68602, + 68605, 68609, 68613, 68617, 68621, 68625, 68629, 68633, 68637, 68641, + 68645, 68649, 68653, 68657, 68661, 68665, 68669, 68673, 68677, 68681, + 68685, 68689, 68693, 68697, 68701, 68705, 68709, 68713, 68717, 68721, + 68725, 68729, 68733, 68737, 68741, 68745, 68749, 68753, 68757, 68761, + 68765, 68769, 68773, 68777, 68781, 68784, 68788, 68792, 68796, 68800, + 68804, 68808, 68812, 68816, 68820, 68824, 68828, 68832, 68836, 68840, + 68844, 68848, 68852, 68856, 68860, 68864, 68868, 68872, 68876, 68880, + 68884, 68888, 68892, 68896, 68900, 68904, 68908, 68912, 68916, 68920, + 68924, 68928, 68932, 68936, 68940, 68944, 68948, 68952, 68956, 68960, + 68964, 68968, 68972, 68976, 68980, 68984, 68988, 68992, 68996, 69000, + 69004, 69008, 69012, 69016, 69020, 69024, 69028, 69032, 69036, 69040, + 69044, 69048, 69052, 69056, 69060, 69064, 69068, 69072, 69076, 69080, + 69084, 69088, 69092, 69096, 69100, 69104, 69108, 69112, 69116, 69120, + 69124, 69128, 69132, 69136, 69140, 69144, 69148, 69152, 69156, 69160, + 69164, 69168, 69172, 69176, 69180, 69184, 69188, 69192, 69196, 69200, + 69204, 69208, 69212, 69216, 69220, 69224, 69228, 69232, 69236, 69240, + 69244, 69248, 69252, 69255, 69259, 69263, 69267, 69271, 69275, 69279, + 69283, 69287, 69291, 69295, 69299, 69303, 69307, 69311, 69315, 69319, + 69323, 69327, 69331, 69335, 69339, 69343, 69347, 69351, 69355, 69359, + 69363, 69367, 69371, 69375, 69379, 69383, 69387, 69391, 69395, 69399, + 69403, 69407, 69411, 69415, 69419, 69423, 69427, 69431, 69435, 69439, + 69443, 69447, 69451, 69455, 69459, 69463, 69467, 69471, 69475, 69479, + 69483, 69487, 69491, 69495, 69499, 69503, 69507, 69511, 69515, 69519, + 69523, 69527, 69531, 69535, 69539, 69543, 69547, 69551, 69555, 69559, + 69563, 69567, 69571, 69575, 69579, 69583, 69587, 69591, 69595, 69599, + 69603, 69607, 69611, 69615, 69619, 69623, 69627, 69631, 69635, 69639, + 69643, 69647, 69651, 69655, 69659, 69663, 69667, 69671, 69675, 69679, + 69683, 69686, 69690, 69694, 69698, 69702, 69706, 69710, 69714, 69717, + 69721, 69725, 69729, 69733, 69737, 69741, 69745, 69749, 69753, 69757, + 69761, 69765, 69769, 69773, 69777, 69781, 69785, 69789, 69793, 69797, + 69801, 69805, 69809, 69813, 69817, 69821, 69825, 69829, 69833, 69837, + 69841, 69845, 69849, 69853, 69857, 69861, 69865, 69869, 69873, 69877, + 69881, 69885, 69889, 69893, 69897, 69901, 69905, 69909, 69913, 69917, + 69921, 69925, 69929, 69933, 69937, 69941, 69945, 69949, 69953, 69957, + 69961, 69965, 69969, 69973, 69977, 69981, 69985, 69989, 69993, 69997, + 70001, 70005, 70009, 70013, 70017, 70021, 70025, 70029, 70033, 70037, + 70041, 70045, 70049, 70053, 70057, 70061, 70065, 70069, 70073, 70076, + 70080, 70084, 70088, 70092, 70096, 70100, 70104, 70108, 70112, 70116, + 70120, 70124, 70128, 70132, 70136, 70140, 70144, 70148, 70152, 70156, + 70160, 70164, 70168, 70172, 70176, 70180, 70184, 70188, 70192, 70196, + 70200, 70204, 70208, 70212, 70216, 70220, 70224, 70228, 70232, 70236, + 70240, 70244, 70248, 70252, 70256, 70260, 70264, 70268, 70272, 70276, + 70280, 70284, 70288, 70292, 70296, 70300, 70304, 70308, 70312, 70315, + 70319, 70323, 70327, 70331, 70335, 70339, 70343, 70347, 70351, 70355, + 70359, 70363, 70367, 70371, 70375, 70379, 70383, 70387, 70391, 70395, + 70399, 70403, 70407, 70411, 70415, 70419, 70423, 70427, 70431, 70435, + 70439, 70443, 70447, 70451, 70455, 70459, 70463, 70467, 70471, 70475, + 70479, 70483, 70487, 70491, 70495, 70499, 70503, 70507, 70511, 70515, + 70519, 70523, 70527, 70531, 70535, 70539, 70543, 70547, 70551, 70555, + 70559, 70563, 70567, 70570, 70574, 70578, 70582, 70586, 70590, 70594, + 70598, 70602, 70606, 70610, 70614, 70618, 70622, 70626, 70630, 70634, + 70638, 70642, 70646, 70650, 70654, 70658, 70662, 70666, 70670, 70674, + 70678, 70682, 70686, 70690, 70694, 70698, 70702, 70706, 70710, 70714, + 70718, 70722, 70726, 70730, 70734, 70738, 70742, 70746, 70750, 70754, + 70758, 70762, 70766, 70770, 70774, 70778, 70782, 70786, 70790, 70794, + 70798, 70802, 70806, 70810, 70814, 70818, 70822, 70826, 70830, 70834, + 70838, 70842, 70846, 70850, 70854, 70858, 70862, 70866, 70870, 70874, + 70878, 70882, 70886, 70890, 70894, 70898, 70902, 70906, 70910, 70914, + 70918, 70922, 70926, 70930, 70934, 70938, 70942, 70946, 70950, 70954, + 70958, 70962, 70966, 70970, 70974, 70978, 70982, 70986, 70990, 70994, + 70998, 71002, 71006, 71010, 71014, 71018, 71022, 71025, 71029, 71033, + 71037, 71041, 71045, 71049, 71053, 71057, 71061, 71065, 71069, 71073, + 71077, 71081, 71085, 71089, 71093, 71097, 71101, 71105, 71109, 71113, + 71117, 71121, 71125, 71129, 71133, 71137, 71141, 71145, 71149, 71153, + 71157, 71161, 71165, 71169, 71173, 71177, 71181, 71185, 71189, 71193, + 71197, 71201, 71205, 71209, 71213, 71217, 71221, 71225, 71229, 71233, + 71237, 71241, 71245, 71249, 71253, 71257, 71261, 71265, 71269, 71273, + 71277, 71281, 71285, 71289, 71293, 71297, 71301, 71305, 71309, 71313, + 71317, 71321, 71325, 71329, 71333, 71337, 71341, 71345, 71349, 71353, + 71357, 71361, 71365, 71369, 71373, 71377, 71381, 71385, 71389, 71393, + 71397, 71401, 71405, 71409, 71413, 71417, 71421, 71425, 71429, 71433, + 71437, 71441, 71445, 71449, 71453, 71457, 71461, 71465, 71469, 71473, + 71477, 71481, 71485, 71489, 71493, 71497, 71501, 71505, 71509, 71513, + 71517, 71521, 71525, 71529, 71533, 71537, 71541, 71545, 71549, 71553, + 71557, 71561, 71565, 71569, 71573, 71577, 71581, 71585, 71589, 71593, + 71597, 71601, 71605, 71609, 71613, 71617, 71621, 71625, 71628, 71632, + 71636, 71640, 71644, 71648, 71652, 71656, 71659, 71663, 71667, 71671, + 71675, 71679, 71683, 71687, 71691, 71695, 71699, 71703, 71707, 71711, + 71715, 71719, 71723, 71727, 71731, 71735, 71739, 71743, 71747, 71751, + 71755, 71759, 71763, 71767, 71771, 71775, 71779, 71783, 71787, 71791, + 71795, 71799, 71803, 71807, 71811, 71815, 71819, 71823, 71827, 71831, + 71835, 71839, 71843, 71847, 71851, 71855, 71859, 71863, 71867, 71871, + 71875, 71879, 71883, 71887, 71891, 71895, 71899, 71903, 71907, 71911, + 71915, 71919, 71923, 71927, 71931, 71935, 71939, 71943, 71947, 71951, + 71955, 71959, 71963, 71967, 71971, 71975, 71979, 71983, 71987, 71991, + 71995, 71999, 72003, 72007, 72011, 72015, 72019, 72023, 72027, 72031, + 72035, 72039, 72043, 72047, 72051, 72055, 72059, 72063, 72067, 72071, + 72075, 72079, 72083, 72087, 72091, 72095, 72099, 72103, 72107, 72111, + 72115, 72119, 72123, 72127, 72131, 72135, 72139, 72143, 72147, 72151, + 72155, 72159, 72163, 72167, 72171, 72175, 72179, 72183, 72187, 72191, + 72195, 72199, 72203, 72207, 72211, 72215, 72219, 72223, 72227, 72231, + 72235, 72239, 72243, 72247, 72251, 72255, 72259, 72263, 72267, 72271, + 72275, 72279, 72283, 72287, 72291, 72295, 72299, 72303, 72307, 72311, + 72315, 72319, 72323, 72327, 72331, 72335, 72339, 72343, 72347, 72351, + 72355, 72359, 72363, 72367, 72371, 72375, 72379, 72383, 72386, 72390, + 72394, 72398, 72402, 72406, 72410, 72414, 72418, 72422, 72426, 72430, + 72434, 72438, 72442, 72446, 72450, 72454, 72458, 72462, 72466, 72470, + 72474, 72478, 72482, 72486, 72490, 72494, 72498, 72502, 72506, 72510, + 72514, 72518, 72522, 72526, 72530, 72534, 72538, 72542, 72546, 72550, + 72554, 72558, 72562, 72566, 72570, 72574, 72578, 72582, 72586, 72590, + 72594, 72598, 72602, 72606, 72610, 72614, 72618, 72622, 72626, 72630, + 72634, 72638, 72642, 72646, 72650, 72654, 72658, 72662, 72666, 72670, + 72674, 72678, 72682, 72686, 72690, 72694, 72698, 72702, 72706, 72710, + 72714, 72718, 72722, 72726, 72730, 72734, 72738, 72742, 72746, 72750, + 72754, 72758, 72762, 72766, 72770, 72774, 72778, 72782, 72786, 72790, + 72794, 72798, 72802, 72806, 72810, 72814, 72818, 72822, 72826, 72830, + 72834, 72838, 72842, 72846, 72850, 72854, 72858, 72862, 72866, 72870, + 72874, 72878, 72882, 72886, 72890, 72894, 72898, 72902, 72906, 72910, + 72914, 72918, 72922, 72926, 72930, 72934, 72938, 72942, 72946, 72950, + 72954, 72958, 72962, 72966, 72970, 72974, 72978, 72982, 72986, 72990, + 72994, 72998, 73002, 73006, 73010, 73014, 73018, 73022, 73026, 73030, + 73034, 73038, 73042, 73046, 73050, 73054, 73058, 73062, 73066, 73070, + 73074, 73078, 73082, 73086, 73090, 73094, 73098, 73102, 73106, 73110, + 73114, 73118, 73122, 73126, 73130, 73134, 73138, 73142, 73146, 73150, + 73154, 73158, 73162, 73166, 0, 0, 0, 73170, 73174, 73178, 73182, 73186, + 73190, 73194, 73198, 73202, 73206, 73210, 73214, 73218, 73222, 73226, + 73230, 73234, 73238, 73242, 73246, 73250, 73254, 73258, 73262, 73266, + 73270, 73274, 73278, 73282, 73286, 73290, 73294, 73298, 73302, 73306, + 73310, 73314, 73318, 73322, 73326, 73330, 73334, 73338, 73342, 73346, + 73350, 73354, 73358, 73362, 73366, 73370, 73374, 73378, 73382, 73386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 73390, 73395, 73399, 73404, 73409, 73413, 73418, + 73423, 73427, 73432, 73437, 73442, 73447, 73452, 73457, 73462, 73466, + 73470, 73474, 73478, 73483, 73488, 73493, 73497, 73502, 73507, 73512, + 73517, 73522, 73526, 73531, 73535, 73540, 73544, 73549, 73553, 73557, + 73561, 73566, 73571, 73576, 73584, 73592, 73600, 73608, 73615, 73623, + 73629, 73637, 73641, 73645, 73649, 73653, 73657, 73661, 73665, 73669, + 73673, 73677, 73681, 73685, 73689, 73693, 73697, 73701, 73705, 73709, + 73713, 73717, 73721, 73725, 73729, 73733, 73737, 73741, 73745, 73749, + 73753, 73757, 73761, 73765, 73769, 73773, 73777, 73781, 73784, 73788, + 73792, 73796, 73800, 73804, 73808, 73812, 73816, 73820, 73824, 73828, + 73832, 73836, 73840, 73844, 73848, 73852, 73856, 73860, 73864, 73868, + 73872, 73876, 73880, 73884, 73888, 73892, 73896, 73900, 73904, 73908, + 73912, 73916, 73920, 73924, 73928, 73931, 73935, 73939, 73942, 73946, + 73950, 73954, 73957, 73961, 73965, 73969, 73973, 73977, 73981, 73985, + 73989, 73993, 73996, 74000, 74004, 74008, 74011, 74014, 74018, 74022, + 74025, 74029, 74033, 74037, 74041, 74045, 74049, 74052, 74055, 74059, + 74063, 74067, 74070, 74073, 74077, 74081, 74085, 74089, 74093, 74097, + 74101, 74105, 74109, 74113, 74117, 74121, 74125, 74129, 74133, 74137, + 74141, 74145, 74149, 74153, 74157, 74161, 74165, 74169, 74173, 74177, + 74181, 74185, 74189, 74193, 74197, 74201, 74205, 74209, 74213, 74217, + 74221, 74224, 74228, 74232, 74236, 74240, 74244, 74248, 74252, 74256, + 74260, 74264, 74268, 74272, 74276, 74280, 74284, 74288, 74292, 74296, + 74300, 74304, 74308, 74312, 74316, 74320, 74324, 74328, 74332, 74336, + 74340, 74344, 74348, 74352, 74356, 74360, 74364, 74368, 74371, 74375, + 74379, 74383, 74387, 74391, 74395, 74399, 74403, 74407, 74411, 74415, + 74419, 74423, 74427, 74431, 74435, 74438, 74442, 74446, 74450, 74454, + 74458, 74462, 74466, 74470, 74474, 74478, 74482, 74486, 74490, 74494, + 74498, 74502, 74506, 74510, 74514, 74518, 74522, 74525, 74529, 74533, + 74537, 74541, 74545, 74549, 74553, 74557, 74561, 74565, 74569, 74573, + 74577, 74581, 74585, 74589, 74593, 74597, 74601, 74605, 74609, 74613, + 74617, 74621, 74625, 74629, 74633, 74637, 74641, 74645, 74649, 74653, + 74657, 74661, 74665, 74669, 74673, 74677, 74681, 74685, 74689, 74693, + 74697, 74700, 74705, 74709, 74715, 74720, 74726, 74730, 74734, 74738, + 74742, 74746, 74750, 74754, 74758, 74762, 74766, 74770, 74774, 74778, + 74782, 74785, 74788, 74791, 74794, 74797, 74800, 74803, 74806, 74809, + 74814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74820, + 74825, 74830, 74835, 74840, 74847, 74854, 74859, 74864, 74869, 74874, + 74881, 74888, 74895, 74902, 74909, 74916, 74926, 74936, 74943, 74950, + 74957, 74964, 74970, 74976, 74985, 74994, 75001, 75008, 75019, 75030, + 75035, 75040, 75047, 75054, 75061, 75068, 75075, 75082, 75089, 75096, + 75102, 75108, 75114, 75120, 75127, 75134, 75139, 75143, 75150, 75157, + 75164, 75168, 75175, 75179, 75184, 75188, 75194, 75199, 75205, 75210, + 75214, 75218, 75221, 75224, 75229, 75234, 75239, 75244, 75249, 75254, + 75259, 75264, 75269, 75274, 75282, 75290, 75295, 75300, 75305, 75310, + 75315, 75320, 75325, 75330, 75335, 75340, 75345, 75350, 75355, 75360, + 75366, 75372, 75378, 75384, 75389, 75395, 75398, 75401, 75404, 75408, + 75412, 75416, 75420, 75423, 75427, 75430, 75433, 75436, 75440, 75444, + 75448, 75452, 75456, 75460, 75464, 75468, 75472, 75476, 75480, 75484, + 75488, 75492, 75496, 75500, 75504, 75508, 75512, 75516, 75520, 75524, + 75527, 75531, 75535, 75539, 75543, 75547, 75551, 75555, 75559, 75563, + 75567, 75571, 75575, 75579, 75583, 75587, 75591, 75595, 75599, 75603, + 75607, 75611, 75615, 75619, 75623, 75626, 75630, 75634, 75638, 75642, + 75646, 75650, 75654, 75657, 75661, 75665, 75669, 75673, 75677, 75681, + 75685, 75689, 75693, 75697, 75701, 75705, 75710, 75715, 75718, 75723, + 75726, 75729, 75732, 0, 0, 0, 0, 0, 0, 0, 0, 75736, 75745, 75754, 75763, + 75772, 75781, 75790, 75799, 75808, 75816, 75823, 75831, 75838, 75846, + 75856, 75865, 75875, 75884, 75894, 75902, 75909, 75917, 75924, 75932, + 75937, 75942, 75948, 75957, 75963, 75969, 75976, 75985, 75993, 76001, + 76009, 76016, 76023, 76030, 76037, 76042, 76047, 76052, 76057, 76062, + 76067, 76072, 76077, 76085, 76093, 76099, 76105, 76110, 76115, 76120, + 76125, 76130, 76135, 76140, 76145, 76154, 76163, 76168, 76173, 76183, + 76193, 76200, 76207, 76216, 76225, 76237, 76249, 76255, 76261, 76269, + 76277, 76287, 76297, 76304, 76311, 76316, 76321, 76333, 76345, 76353, + 76361, 76371, 76381, 76393, 76405, 76414, 76423, 76430, 76437, 76444, + 76451, 76460, 76469, 76474, 76479, 76486, 76493, 76500, 76507, 76519, + 76531, 76536, 76541, 76546, 76551, 76556, 76561, 76566, 76571, 76575, + 76580, 76585, 76590, 76595, 76600, 76606, 76611, 76616, 76623, 76630, + 76637, 76644, 76651, 76659, 76667, 76672, 76677, 76683, 76689, 76696, + 76703, 76710, 76717, 76724, 76728, 76735, 76740, 76745, 76751, 76764, + 76770, 76778, 76786, 76793, 76800, 76809, 76818, 76825, 76832, 76839, + 76846, 76853, 76860, 76867, 76874, 76881, 76888, 76897, 76906, 76915, + 76924, 76933, 76942, 76951, 76960, 76969, 76978, 76985, 76992, 76998, + 77006, 77012, 77018, 77024, 77030, 77038, 77043, 77048, 77053, 77058, + 77063, 77069, 77075, 77081, 77087, 77093, 77099, 77105, 0, 0, 77111, + 77118, 77125, 77134, 77141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 77143, 77150, 77157, 77163, 77170, 77178, 77186, - 77194, 77202, 77210, 77216, 77222, 77229, 77235, 77241, 77247, 77254, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 77150, 77157, 77164, 77170, 77177, 77185, + 77193, 77201, 77209, 77217, 77223, 77229, 77236, 77242, 77248, 77254, 77261, 77268, 77275, 77282, 77289, 77296, 77303, 77310, 77317, 77324, - 77331, 77338, 77345, 77351, 77358, 77365, 77372, 77379, 77386, 77393, + 77331, 77338, 77345, 77352, 77358, 77365, 77372, 77379, 77386, 77393, 77400, 77407, 77414, 77421, 77428, 77435, 77442, 77449, 77456, 77463, - 77470, 77477, 77485, 77493, 77501, 77509, 0, 0, 0, 0, 77517, 77524, - 77531, 77538, 77545, 77552, 77559, 77565, 77571, 77577, 0, 0, 0, 0, 0, 0, - 77583, 77587, 77592, 77597, 77602, 77607, 77612, 77617, 77622, 77626, - 77631, 77636, 77640, 77644, 77649, 77654, 77658, 77663, 77668, 77673, - 77678, 77683, 77688, 77693, 77697, 77701, 77705, 77710, 77714, 77718, - 77722, 77726, 77730, 77734, 77738, 77743, 77748, 77753, 77758, 77763, - 77770, 77776, 77781, 77786, 77791, 77796, 77802, 77809, 77815, 77822, - 77828, 77834, 77839, 77846, 77852, 77857, 0, 0, 0, 0, 0, 0, 0, 0, 77863, - 77868, 77873, 77877, 77882, 77886, 77891, 77895, 77900, 77905, 77911, - 77916, 77922, 77926, 77931, 77936, 77940, 77945, 77950, 77954, 77959, - 77964, 77969, 77974, 77979, 77984, 77989, 77994, 77999, 78004, 78009, - 78014, 78019, 78024, 78028, 78033, 78038, 78043, 78047, 78051, 78056, - 78061, 78066, 78070, 78074, 78078, 78082, 78087, 78092, 78097, 78101, - 78105, 78110, 78116, 78122, 78127, 78133, 78138, 78144, 78150, 78157, - 78163, 78170, 78175, 78181, 78187, 78192, 78198, 78204, 78209, 0, 0, 0, - 0, 0, 0, 0, 0, 78214, 78218, 78223, 78228, 78232, 78236, 78240, 78244, - 78248, 78252, 78256, 78260, 0, 0, 0, 0, 0, 0, 78264, 78269, 78273, 78277, - 78281, 78285, 78289, 78293, 78297, 78301, 78305, 78309, 78313, 78317, - 78321, 78325, 78329, 78334, 78339, 78345, 78351, 78358, 78363, 78368, - 78374, 78378, 78383, 78386, 78389, 78393, 78398, 78402, 78407, 78414, - 78420, 78426, 78432, 78438, 78444, 78450, 78456, 78462, 78468, 78474, - 78481, 78488, 78495, 78501, 78508, 78515, 78522, 78528, 78535, 78541, - 78547, 78554, 78560, 78567, 78574, 78580, 78586, 78592, 78599, 78606, - 78612, 78619, 78626, 78632, 78639, 78645, 78652, 78659, 78665, 78671, - 78678, 78684, 78691, 78698, 78707, 78714, 78721, 78725, 78730, 78735, - 78739, 78744, 78748, 78752, 78757, 78761, 78766, 78771, 78776, 78780, - 78784, 78788, 78792, 78797, 78801, 78806, 78811, 78816, 78821, 78825, - 78830, 78835, 78840, 78846, 78851, 78857, 78863, 78869, 78875, 78881, - 78886, 78892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78896, 78901, 78905, - 78909, 78913, 78917, 78921, 78925, 78929, 78933, 78937, 78941, 78945, - 78949, 78953, 78957, 78961, 78965, 78969, 78973, 78977, 78981, 78985, - 78989, 78993, 78997, 79001, 79005, 79009, 79013, 0, 0, 0, 79017, 79022, - 79027, 79032, 79037, 79041, 79048, 79052, 79057, 79061, 79068, 79075, - 79084, 79088, 79093, 79097, 79101, 79108, 79115, 79120, 79127, 79132, - 79137, 79144, 79149, 79156, 79163, 79168, 79173, 79180, 79185, 79192, - 79199, 79203, 79210, 79215, 79222, 79226, 79230, 79237, 79242, 79249, - 79253, 79257, 79261, 79268, 79272, 79277, 79284, 79291, 79295, 79299, - 79306, 79312, 79318, 79324, 79332, 79338, 79346, 79352, 79360, 79366, - 79372, 79378, 79384, 79388, 79393, 79398, 79404, 79410, 79416, 79422, - 79428, 79434, 79440, 79446, 79454, 79460, 0, 79467, 79471, 79476, 79480, - 79484, 79488, 79492, 79496, 79500, 79504, 79508, 0, 0, 0, 0, 79512, - 79520, 79526, 79532, 79538, 79544, 79550, 79556, 79562, 79569, 79576, - 79583, 79590, 79597, 79604, 79611, 79618, 79625, 79632, 79639, 79645, - 79651, 79657, 79663, 79669, 79675, 79681, 79687, 79693, 79700, 79707, - 79714, 79721, 0, 79728, 79732, 79736, 79740, 79744, 79749, 79753, 79757, - 79762, 79767, 79772, 79777, 79782, 79787, 79792, 79797, 79802, 79807, - 79812, 79817, 79821, 79826, 79831, 79836, 79841, 79845, 79850, 79854, - 79859, 79864, 79869, 79874, 79879, 79883, 79888, 79892, 79896, 79900, - 79905, 79910, 79914, 79918, 79924, 79929, 79935, 79941, 79946, 79952, - 79957, 79963, 79969, 79975, 79980, 79985, 79990, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 79996, 80002, 80008, 80014, 80021, 80027, 80033, 80039, 80045, 80051, - 80056, 80061, 80067, 80074, 0, 0, 80081, 80086, 80090, 80094, 80098, - 80102, 80106, 80110, 80114, 80118, 0, 0, 80122, 80128, 80134, 80141, - 80149, 80155, 80161, 80167, 80173, 80179, 80185, 80191, 80197, 80203, - 80209, 80215, 80220, 80225, 80230, 80236, 80242, 80249, 80255, 80261, - 80266, 80273, 80280, 80287, 80293, 80298, 80303, 80308, 80316, 80323, - 80330, 80338, 80346, 80353, 80360, 80367, 80374, 80381, 80388, 80395, + 77470, 77477, 77484, 77492, 77500, 77508, 77516, 0, 0, 0, 0, 77524, + 77531, 77538, 77545, 77552, 77559, 77566, 77572, 77578, 77584, 0, 0, 0, + 0, 0, 0, 77590, 77594, 77599, 77604, 77609, 77614, 77619, 77624, 77629, + 77633, 77638, 77643, 77647, 77651, 77656, 77661, 77665, 77670, 77675, + 77680, 77685, 77690, 77695, 77700, 77704, 77708, 77712, 77717, 77721, + 77725, 77729, 77733, 77737, 77741, 77745, 77750, 77755, 77760, 77765, + 77770, 77777, 77783, 77788, 77793, 77798, 77803, 77809, 77816, 77822, + 77829, 77835, 77841, 77846, 77853, 77859, 77864, 0, 0, 0, 0, 0, 0, 0, 0, + 77870, 77875, 77880, 77884, 77889, 77893, 77898, 77902, 77907, 77912, + 77918, 77923, 77929, 77933, 77938, 77943, 77947, 77952, 77957, 77961, + 77966, 77971, 77976, 77981, 77986, 77991, 77996, 78001, 78006, 78011, + 78016, 78021, 78026, 78031, 78035, 78040, 78045, 78050, 78054, 78058, + 78063, 78068, 78073, 78077, 78081, 78085, 78089, 78094, 78099, 78104, + 78108, 78112, 78117, 78123, 78129, 78134, 78140, 78145, 78151, 78157, + 78164, 78170, 78177, 78182, 78188, 78194, 78199, 78205, 78211, 78216, 0, + 0, 0, 0, 0, 0, 0, 0, 78221, 78225, 78230, 78235, 78239, 78243, 78247, + 78251, 78255, 78259, 78263, 78267, 0, 0, 0, 0, 0, 0, 78271, 78276, 78280, + 78284, 78288, 78292, 78296, 78300, 78304, 78308, 78312, 78316, 78320, + 78324, 78328, 78332, 78336, 78341, 78346, 78352, 78358, 78365, 78370, + 78375, 78381, 78385, 78390, 78393, 78396, 78400, 78405, 78409, 78414, + 78421, 78427, 78433, 78439, 78445, 78451, 78457, 78463, 78469, 78475, + 78481, 78488, 78495, 78502, 78508, 78515, 78522, 78529, 78535, 78542, + 78548, 78554, 78561, 78567, 78574, 78581, 78587, 78593, 78599, 78606, + 78613, 78619, 78626, 78633, 78639, 78646, 78652, 78659, 78666, 78672, + 78678, 78685, 78691, 78698, 78705, 78714, 78721, 78728, 78732, 78737, + 78742, 78746, 78751, 78755, 78759, 78764, 78768, 78773, 78778, 78783, + 78787, 78791, 78795, 78799, 78804, 78808, 78813, 78818, 78823, 78828, + 78832, 78837, 78842, 78847, 78853, 78858, 78864, 78870, 78876, 78882, + 78888, 78893, 78899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78903, 78908, + 78912, 78916, 78920, 78924, 78928, 78932, 78936, 78940, 78944, 78948, + 78952, 78956, 78960, 78964, 78968, 78972, 78976, 78980, 78984, 78988, + 78992, 78996, 79000, 79004, 79008, 79012, 79016, 79020, 0, 0, 0, 79024, + 79029, 79034, 79039, 79044, 79048, 79055, 79059, 79064, 79068, 79075, + 79082, 79091, 79095, 79100, 79104, 79108, 79115, 79122, 79127, 79134, + 79139, 79144, 79151, 79156, 79163, 79170, 79175, 79180, 79187, 79192, + 79199, 79206, 79210, 79217, 79222, 79229, 79233, 79237, 79244, 79249, + 79256, 79260, 79264, 79268, 79275, 79279, 79284, 79291, 79298, 79302, + 79306, 79313, 79319, 79325, 79331, 79339, 79345, 79353, 79359, 79367, + 79373, 79379, 79385, 79391, 79395, 79400, 79405, 79411, 79417, 79423, + 79429, 79435, 79441, 79447, 79453, 79461, 79467, 0, 79474, 79478, 79483, + 79487, 79491, 79495, 79499, 79503, 79507, 79511, 79515, 0, 0, 0, 0, + 79519, 79527, 79533, 79539, 79545, 79551, 79557, 79563, 79569, 79576, + 79583, 79590, 79597, 79604, 79611, 79618, 79625, 79632, 79639, 79646, + 79652, 79658, 79664, 79670, 79676, 79682, 79688, 79694, 79700, 79707, + 79714, 79721, 79728, 0, 79735, 79739, 79743, 79747, 79751, 79756, 79760, + 79764, 79769, 79774, 79779, 79784, 79789, 79794, 79799, 79804, 79809, + 79814, 79819, 79824, 79828, 79833, 79838, 79843, 79848, 79852, 79857, + 79861, 79866, 79871, 79876, 79881, 79886, 79890, 79895, 79899, 79903, + 79907, 79912, 79917, 79921, 79925, 79931, 79936, 79942, 79948, 79953, + 79959, 79964, 79970, 79976, 79982, 79987, 79992, 79997, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 80003, 80009, 80015, 80021, 80028, 80034, 80040, 80046, 80052, + 80058, 80063, 80068, 80074, 80081, 0, 0, 80088, 80093, 80097, 80101, + 80105, 80109, 80113, 80117, 80121, 80125, 0, 0, 80129, 80135, 80141, + 80148, 80156, 80162, 80168, 80174, 80180, 80186, 80192, 80198, 80204, + 80210, 80216, 80222, 80227, 80232, 80237, 80243, 80249, 80256, 80262, + 80268, 80273, 80280, 80287, 80294, 80300, 80305, 80310, 80315, 80323, + 80330, 80337, 80345, 80353, 80360, 80367, 80374, 80381, 80388, 80395, 80402, 80409, 80416, 80423, 80430, 80437, 80444, 80451, 80458, 80465, - 80472, 80479, 80486, 80492, 80498, 80505, 80512, 80519, 80526, 80533, + 80472, 80479, 80486, 80493, 80499, 80505, 80512, 80519, 80526, 80533, 80540, 80547, 80554, 80561, 80568, 80575, 80582, 80589, 80596, 80603, - 80610, 80617, 80624, 80631, 80638, 80645, 80652, 80659, 80666, 80672, - 80678, 80685, 80691, 80696, 80702, 80707, 80712, 80717, 80724, 80730, - 80736, 80742, 80748, 80754, 80760, 80766, 80774, 80782, 80790, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80798, - 80804, 80810, 80816, 80824, 80832, 80838, 80844, 80851, 80858, 80865, - 80872, 80879, 80886, 80893, 80900, 80907, 80915, 80923, 80931, 80939, - 80947, 80953, 80961, 80967, 80975, 80984, 80992, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 80998, 81002, 81006, 81010, 81014, 81018, 0, 0, 81022, 81026, - 81030, 81034, 81038, 81042, 0, 0, 81046, 81050, 81054, 81058, 81062, - 81066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81070, 81074, 81078, 81082, 81086, - 81090, 81094, 0, 81098, 81102, 81106, 81110, 81114, 81118, 81122, 0, - 81126, 81133, 81139, 81145, 81151, 81159, 81166, 81175, 81187, 81197, - 81206, 81214, 81222, 81230, 81236, 81244, 81251, 81258, 81266, 81276, - 81283, 81292, 81298, 81308, 81317, 81322, 81330, 81339, 81344, 81353, - 81360, 81370, 81382, 81387, 81393, 81400, 81405, 81415, 81425, 81435, - 81445, 81460, 81473, 81484, 81492, 81497, 81509, 81518, 81525, 81532, - 81538, 81544, 81549, 81556, 81562, 81573, 0, 0, 0, 0, 0, 0, 0, 0, 81584, - 81588, 81592, 81596, 81600, 81604, 81609, 81614, 81618, 81623, 81628, - 81633, 81638, 81643, 81647, 81652, 81657, 81662, 81667, 81672, 81676, - 81681, 81686, 81691, 81696, 81701, 81705, 81710, 81715, 81720, 81725, - 81729, 81734, 81739, 81744, 81749, 81754, 81759, 81764, 81769, 81774, - 81779, 81784, 81789, 81794, 81798, 81803, 81808, 81813, 81818, 81823, - 81828, 81833, 81837, 81842, 81847, 81852, 81857, 81862, 81867, 81872, - 81877, 81882, 81887, 81892, 81897, 81902, 81907, 81912, 81917, 81922, - 81927, 81932, 81937, 81942, 81947, 81952, 81957, 81962, 81967, 81971, - 81978, 81985, 81992, 81999, 82005, 82011, 82018, 82025, 82032, 82039, - 82046, 82053, 82060, 82067, 82074, 82080, 82087, 82094, 82101, 82108, - 82115, 82122, 82129, 82136, 82143, 82150, 82157, 82166, 82175, 82184, - 82193, 82202, 82211, 82220, 82229, 82237, 82245, 82253, 82261, 82269, - 82277, 82285, 82293, 82299, 82307, 0, 0, 82315, 82322, 82328, 82334, - 82340, 82346, 82352, 82358, 82364, 82370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80610, 80617, 80624, 80631, 80638, 80645, 80652, 80659, 80666, 80673, + 80679, 80685, 80692, 80698, 80703, 80709, 80714, 80719, 80724, 80731, + 80737, 80743, 80749, 80755, 80761, 80767, 80773, 80781, 80789, 80797, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80805, 80811, 80817, 80823, 80831, 80839, 80845, 80851, 80858, 80865, + 80872, 80879, 80886, 80893, 80900, 80907, 80914, 80922, 80930, 80938, + 80946, 80954, 80960, 80968, 80974, 80982, 80991, 80999, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81005, 81009, 81013, 81017, 81021, 81025, 0, 0, 81029, 81033, + 81037, 81041, 81045, 81049, 0, 0, 81053, 81057, 81061, 81065, 81069, + 81073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81077, 81081, 81085, 81089, 81093, + 81097, 81101, 0, 81105, 81109, 81113, 81117, 81121, 81125, 81129, 0, + 81133, 81140, 81146, 81152, 81158, 81166, 81173, 81182, 81194, 81204, + 81213, 81221, 81229, 81237, 81243, 81251, 81258, 81265, 81273, 81283, + 81290, 81299, 81305, 81315, 81324, 81329, 81337, 81346, 81351, 81360, + 81367, 81377, 81389, 81394, 81400, 81407, 81412, 81422, 81432, 81442, + 81452, 81467, 81480, 81491, 81499, 81504, 81516, 81525, 81532, 81539, + 81545, 81551, 81556, 81563, 81569, 81580, 0, 0, 0, 0, 0, 0, 0, 0, 81591, + 81595, 81599, 81603, 81607, 81611, 81616, 81621, 81625, 81630, 81635, + 81640, 81645, 81650, 81654, 81659, 81664, 81669, 81674, 81679, 81683, + 81688, 81693, 81698, 81703, 81708, 81712, 81717, 81722, 81727, 81732, + 81736, 81741, 81746, 81751, 81756, 81761, 81766, 81771, 81776, 81781, + 81786, 81791, 81796, 81801, 81805, 81810, 81815, 81820, 81825, 81830, + 81835, 81840, 81844, 81849, 81854, 81859, 81864, 81869, 81874, 81879, + 81884, 81889, 81894, 81899, 81904, 81909, 81914, 81919, 81924, 81929, + 81934, 81939, 81944, 81949, 81954, 81959, 81964, 81969, 81974, 81978, + 81985, 81992, 81999, 82006, 82012, 82018, 82025, 82032, 82039, 82046, + 82053, 82060, 82067, 82074, 82081, 82087, 82094, 82101, 82108, 82115, + 82122, 82129, 82136, 82143, 82150, 82157, 82164, 82173, 82182, 82191, + 82200, 82209, 82218, 82227, 82236, 82244, 82252, 82260, 82268, 82276, + 82284, 82292, 82300, 82306, 82314, 0, 0, 82322, 82329, 82335, 82341, + 82347, 82353, 82359, 82365, 82371, 82377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82376, 82381, - 82386, 82391, 82396, 82401, 82406, 82411, 82416, 82421, 82426, 82431, - 82436, 82441, 82446, 82451, 82456, 82461, 82466, 82471, 82476, 82481, - 82486, 0, 0, 0, 0, 82491, 82495, 82499, 82503, 82507, 82511, 82515, - 82519, 82523, 82527, 82531, 82535, 82539, 82543, 82547, 82551, 82555, - 82559, 82563, 82567, 82571, 82575, 82579, 82583, 82587, 82591, 82595, - 82599, 82603, 82607, 82611, 82615, 82619, 82623, 82627, 82631, 82635, - 82639, 82643, 82647, 82651, 82655, 82659, 82663, 82667, 82671, 82675, - 82679, 82683, 0, 0, 0, 0, 82687, 82691, 82695, 82699, 82703, 82707, - 82711, 82715, 82719, 82723, 82727, 82731, 82735, 82739, 82743, 82747, - 82751, 82755, 82759, 82763, 82767, 82771, 82775, 82779, 82783, 82787, - 82791, 82795, 82799, 82803, 82807, 82811, 82815, 82819, 82823, 82827, - 82831, 82835, 82839, 82843, 82847, 82851, 82855, 82859, 82863, 82867, - 82871, 82875, 82879, 82883, 82887, 82891, 82895, 82899, 82903, 82907, - 82911, 82915, 82919, 82923, 82927, 82931, 82935, 82939, 82943, 82947, - 82951, 82955, 82959, 82963, 82967, 82971, 82975, 82979, 82983, 82987, - 82991, 82995, 82999, 83003, 83007, 83011, 83015, 83019, 83023, 83027, - 83031, 83035, 83039, 83043, 83047, 83051, 83055, 83059, 83063, 83067, - 83071, 83075, 83079, 83083, 83087, 83091, 83095, 83099, 83103, 83107, - 83111, 83115, 83119, 83123, 83127, 83131, 83135, 83139, 83143, 83147, - 83151, 83155, 83159, 83163, 83167, 83171, 83175, 83179, 83183, 83187, - 83191, 83195, 83199, 83203, 83207, 83211, 83215, 83219, 83223, 83227, - 83231, 83235, 83239, 83243, 83247, 83251, 83255, 83259, 83263, 83267, - 83271, 83275, 83279, 83283, 83287, 83291, 83295, 83299, 83303, 83307, - 83311, 83315, 83319, 83323, 83327, 83331, 83335, 83339, 83343, 83347, - 83351, 83355, 83359, 83363, 83367, 83371, 83375, 83379, 83383, 83387, - 83391, 83395, 83399, 83403, 83407, 83411, 83415, 83419, 83423, 83427, - 83431, 83435, 83439, 83443, 83447, 83451, 83455, 83459, 83463, 83467, - 83471, 83475, 83479, 83483, 83487, 83491, 83495, 83499, 83503, 83507, - 83511, 83515, 83519, 83523, 83527, 83531, 83535, 83539, 83543, 83547, - 83551, 83555, 83559, 83563, 83567, 83571, 83575, 83579, 83583, 83587, - 83591, 83595, 83599, 83603, 83607, 83611, 83615, 83619, 83623, 83627, - 83631, 83635, 83639, 83643, 83647, 83651, 83655, 83659, 83663, 83667, - 83671, 83675, 83679, 83683, 83687, 83691, 83695, 83699, 83703, 83707, - 83711, 83715, 83719, 83723, 83727, 83731, 83735, 83739, 83743, 83747, - 83751, 83755, 83759, 83763, 83767, 83771, 83775, 83779, 83783, 83787, - 83791, 83795, 83799, 83803, 83807, 83811, 83815, 83819, 83823, 83827, - 83831, 83835, 83839, 83843, 83847, 83851, 83855, 83859, 83863, 83867, - 83871, 83875, 83879, 83883, 83887, 83891, 83895, 83899, 83903, 83907, - 83911, 83915, 83919, 83923, 83927, 83931, 83935, 83939, 83943, 83947, - 83951, 83955, 83959, 83963, 83967, 83971, 83975, 83979, 83983, 83987, - 83991, 83995, 83999, 84003, 84007, 84011, 84015, 84019, 84023, 84027, - 84031, 84035, 84039, 84043, 84047, 84051, 84055, 84059, 84063, 84067, - 84071, 84075, 84079, 84083, 84087, 84091, 84095, 84099, 84103, 84107, - 84111, 84115, 84119, 84123, 84127, 84131, 84135, 84139, 84143, 84147, 0, - 0, 84151, 84155, 84159, 84163, 84167, 84171, 84175, 84179, 84183, 84187, - 84191, 84195, 84199, 84203, 84207, 84211, 84215, 84219, 84223, 84227, - 84231, 84235, 84239, 84243, 84247, 84251, 84255, 84259, 84263, 84267, - 84271, 84275, 84279, 84283, 84287, 84291, 84295, 84299, 84303, 84307, - 84311, 84315, 84319, 84323, 84327, 84331, 84335, 84339, 84343, 84347, - 84351, 84355, 84359, 84363, 84367, 84371, 84375, 84379, 84383, 84387, - 84391, 84395, 84399, 84403, 84407, 84411, 84415, 84419, 84423, 84427, - 84431, 84435, 84439, 84443, 84447, 84451, 84455, 84459, 84463, 84467, - 84471, 84475, 84479, 84483, 84487, 84491, 84495, 84499, 84503, 84507, - 84511, 84515, 84519, 84523, 84527, 84531, 84535, 84539, 84543, 84547, - 84551, 84555, 84559, 84563, 84567, 84571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82383, 82388, + 82393, 82398, 82403, 82408, 82413, 82418, 82423, 82428, 82433, 82438, + 82443, 82448, 82453, 82458, 82463, 82468, 82473, 82478, 82483, 82488, + 82493, 0, 0, 0, 0, 82498, 82502, 82506, 82510, 82514, 82518, 82522, + 82526, 82530, 82534, 82538, 82542, 82546, 82550, 82554, 82558, 82562, + 82566, 82570, 82574, 82578, 82582, 82586, 82590, 82594, 82598, 82602, + 82606, 82610, 82614, 82618, 82622, 82626, 82630, 82634, 82638, 82642, + 82646, 82650, 82654, 82658, 82662, 82666, 82670, 82674, 82678, 82682, + 82686, 82690, 0, 0, 0, 0, 82694, 82698, 82702, 82706, 82710, 82714, + 82718, 82722, 82726, 82730, 82734, 82738, 82742, 82746, 82750, 82754, + 82758, 82762, 82766, 82770, 82774, 82778, 82782, 82786, 82790, 82794, + 82798, 82802, 82806, 82810, 82814, 82818, 82822, 82826, 82830, 82834, + 82838, 82842, 82846, 82850, 82854, 82858, 82862, 82866, 82870, 82874, + 82878, 82882, 82886, 82890, 82894, 82898, 82902, 82906, 82910, 82914, + 82918, 82922, 82926, 82930, 82934, 82938, 82942, 82946, 82950, 82954, + 82958, 82962, 82966, 82970, 82974, 82978, 82982, 82986, 82990, 82994, + 82998, 83002, 83006, 83010, 83014, 83018, 83022, 83026, 83030, 83034, + 83038, 83042, 83046, 83050, 83054, 83058, 83062, 83066, 83070, 83074, + 83078, 83082, 83086, 83090, 83094, 83098, 83102, 83106, 83110, 83114, + 83118, 83122, 83126, 83130, 83134, 83138, 83142, 83146, 83150, 83154, + 83158, 83162, 83166, 83170, 83174, 83178, 83182, 83186, 83190, 83194, + 83198, 83202, 83206, 83210, 83214, 83218, 83222, 83226, 83230, 83234, + 83238, 83242, 83246, 83250, 83254, 83258, 83262, 83266, 83270, 83274, + 83278, 83282, 83286, 83290, 83294, 83298, 83302, 83306, 83310, 83314, + 83318, 83322, 83326, 83330, 83334, 83338, 83342, 83346, 83350, 83354, + 83358, 83362, 83366, 83370, 83374, 83378, 83382, 83386, 83390, 83394, + 83398, 83402, 83406, 83410, 83414, 83418, 83422, 83426, 83430, 83434, + 83438, 83442, 83446, 83450, 83454, 83458, 83462, 83466, 83470, 83474, + 83478, 83482, 83486, 83490, 83494, 83498, 83502, 83506, 83510, 83514, + 83518, 83522, 83526, 83530, 83534, 83538, 83542, 83546, 83550, 83554, + 83558, 83562, 83566, 83570, 83574, 83578, 83582, 83586, 83590, 83594, + 83598, 83602, 83606, 83610, 83614, 83618, 83622, 83626, 83630, 83634, + 83638, 83642, 83646, 83650, 83654, 83658, 83662, 83666, 83670, 83674, + 83678, 83682, 83686, 83690, 83694, 83698, 83702, 83706, 83710, 83714, + 83718, 83722, 83726, 83730, 83734, 83738, 83742, 83746, 83750, 83754, + 83758, 83762, 83766, 83770, 83774, 83778, 83782, 83786, 83790, 83794, + 83798, 83802, 83806, 83810, 83814, 83818, 83822, 83826, 83830, 83834, + 83838, 83842, 83846, 83850, 83854, 83858, 83862, 83866, 83870, 83874, + 83878, 83882, 83886, 83890, 83894, 83898, 83902, 83906, 83910, 83914, + 83918, 83922, 83926, 83930, 83934, 83938, 83942, 83946, 83950, 83954, + 83958, 83962, 83966, 83970, 83974, 83978, 83982, 83986, 83990, 83994, + 83998, 84002, 84006, 84010, 84014, 84018, 84022, 84026, 84030, 84034, + 84038, 84042, 84046, 84050, 84054, 84058, 84062, 84066, 84070, 84074, + 84078, 84082, 84086, 84090, 84094, 84098, 84102, 84106, 84110, 84114, + 84118, 84122, 84126, 84130, 84134, 84138, 84142, 84146, 84150, 84154, 0, + 0, 84158, 84162, 84166, 84170, 84174, 84178, 84182, 84186, 84190, 84194, + 84198, 84202, 84206, 84210, 84214, 84218, 84222, 84226, 84230, 84234, + 84238, 84242, 84246, 84250, 84254, 84258, 84262, 84266, 84270, 84274, + 84278, 84282, 84286, 84290, 84294, 84298, 84302, 84306, 84310, 84314, + 84318, 84322, 84326, 84330, 84334, 84338, 84342, 84346, 84350, 84354, + 84358, 84362, 84366, 84370, 84374, 84378, 84382, 84386, 84390, 84394, + 84398, 84402, 84406, 84410, 84414, 84418, 84422, 84426, 84430, 84434, + 84438, 84442, 84446, 84450, 84454, 84458, 84462, 84466, 84470, 84474, + 84478, 84482, 84486, 84490, 84494, 84498, 84502, 84506, 84510, 84514, + 84518, 84522, 84526, 84530, 84534, 84538, 84542, 84546, 84550, 84554, + 84558, 84562, 84566, 84570, 84574, 84578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84575, 84580, 84585, 84590, 84595, 84600, 84608, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84613, 84621, 84629, 84637, 84645, 0, 0, 0, 0, 0, - 84653, 84660, 84667, 84677, 84683, 84689, 84695, 84701, 84707, 84713, - 84720, 84726, 84732, 84738, 84747, 84756, 84768, 84780, 84786, 84792, - 84798, 84805, 84812, 84819, 84826, 84833, 0, 84840, 84847, 84854, 84862, - 84869, 0, 84876, 0, 84883, 84890, 0, 84897, 84905, 0, 84912, 84919, - 84926, 84933, 84940, 84947, 84954, 84961, 84968, 84975, 84980, 84987, - 84994, 85000, 85006, 85012, 85019, 85025, 85031, 85037, 85044, 85050, - 85056, 85062, 85069, 85075, 85081, 85087, 85094, 85100, 85106, 85112, - 85119, 85125, 85131, 85137, 85144, 85150, 85156, 85162, 85169, 85175, - 85181, 85187, 85194, 85200, 85206, 85212, 85219, 85225, 85231, 85237, - 85244, 85250, 85256, 85262, 85269, 85275, 85281, 85287, 85294, 85300, - 85306, 85312, 85318, 85324, 85330, 85336, 85342, 85348, 85354, 85360, - 85366, 85372, 85378, 85384, 85391, 85397, 85403, 85409, 85416, 85422, - 85428, 85434, 85441, 85447, 85453, 85459, 85466, 85474, 85482, 85488, - 85494, 85500, 85507, 85516, 85525, 85533, 85541, 85549, 85558, 85566, - 85574, 85582, 85591, 85598, 85605, 85616, 85627, 85631, 85635, 85641, - 85647, 85653, 85659, 85669, 85679, 85686, 85693, 85700, 85708, 85716, - 85720, 85726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85732, - 85738, 85744, 85750, 85757, 85762, 85767, 85773, 85779, 85785, 85791, - 85800, 85806, 85812, 85820, 85828, 85836, 85844, 85850, 85856, 85862, - 85869, 85882, 85896, 85907, 85918, 85930, 85942, 85954, 85966, 85977, - 85988, 86000, 86012, 86024, 86036, 86048, 86060, 86072, 86089, 86106, - 86123, 86130, 86137, 86144, 86152, 86164, 86175, 86186, 86199, 86210, - 86219, 86227, 86236, 86244, 86254, 86262, 86271, 86279, 86288, 86296, - 86306, 86314, 86323, 86331, 86341, 86349, 86357, 86365, 86373, 86380, - 86389, 86397, 86405, 86414, 86422, 86431, 86439, 86447, 86455, 86464, - 86472, 86481, 86489, 86497, 86505, 86513, 86522, 86530, 86539, 86547, - 86556, 86564, 86573, 86581, 86591, 86599, 86607, 86615, 86625, 86633, - 86641, 86650, 86658, 86667, 86676, 86684, 86694, 86702, 86711, 86719, - 86728, 86736, 86746, 86754, 86762, 86769, 86777, 86784, 86793, 86800, - 86809, 86817, 86826, 86834, 86844, 86852, 86861, 86869, 86879, 86887, - 86895, 86902, 86910, 86917, 86926, 86933, 86943, 86953, 86964, 86973, - 86982, 86991, 87000, 87009, 87019, 87031, 87043, 87054, 87066, 87079, - 87090, 87099, 87108, 87116, 87125, 87135, 87143, 87152, 87161, 87169, - 87178, 87188, 87196, 87205, 87214, 87222, 87231, 87241, 87249, 87259, - 87267, 87277, 87285, 87293, 87302, 87310, 87320, 87328, 87336, 87346, - 87354, 87361, 87368, 87377, 87386, 87394, 87403, 87413, 87421, 87432, - 87440, 87448, 87455, 87463, 87472, 87479, 87491, 87502, 87514, 87525, - 87537, 87546, 87554, 87563, 87571, 87580, 87589, 87597, 87606, 87614, - 87623, 87631, 87639, 87647, 87655, 87662, 87671, 87679, 87688, 87696, - 87705, 87713, 87721, 87730, 87738, 87747, 87755, 87764, 87772, 87780, - 87788, 87797, 87805, 87814, 87822, 87831, 87839, 87848, 87856, 87864, - 87872, 87881, 87889, 87898, 87907, 87915, 87924, 87932, 87941, 87949, - 87958, 87966, 87973, 87981, 87988, 87997, 88005, 88014, 88022, 88031, - 88040, 88048, 88058, 88066, 88073, 88081, 88088, 88096, 88108, 88121, - 88130, 88140, 88149, 88159, 88168, 88178, 88187, 88197, 88206, 88216, - 88226, 88235, 88244, 88253, 88263, 88271, 88280, 88290, 88300, 88310, - 88320, 88328, 88338, 88346, 88356, 88364, 88374, 88382, 88392, 88400, - 88409, 88416, 88426, 88434, 88444, 88452, 88462, 88470, 88480, 88488, - 88497, 88505, 88514, 88522, 88531, 88540, 88549, 88558, 88568, 88576, - 88586, 88594, 88604, 88612, 88622, 88630, 88640, 88648, 88657, 88664, - 88674, 88682, 88692, 88700, 88710, 88718, 88728, 88736, 88745, 88753, - 88762, 88770, 88779, 88788, 88797, 88806, 88815, 88823, 88832, 88840, - 88849, 88858, 88866, 88876, 88885, 88895, 88905, 88914, 88924, 88933, - 88942, 88950, 88958, 88963, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 88968, 88979, 88990, 89001, 89011, 89022, 89033, 89043, 89054, 89064, - 89074, 89083, 89094, 89105, 89116, 89129, 89139, 89149, 89160, 89170, - 89180, 89190, 89200, 89210, 89220, 89230, 89241, 89252, 89263, 89273, - 89283, 89295, 89306, 89317, 89327, 89337, 89347, 89357, 89368, 89378, - 89388, 89400, 89410, 89420, 89432, 89443, 89454, 89464, 89474, 89484, - 89494, 89506, 89518, 89530, 89541, 89552, 89562, 89572, 89582, 89591, - 89600, 89610, 89620, 89631, 0, 0, 89641, 89652, 89663, 89673, 89683, - 89695, 89706, 89717, 89730, 89740, 89752, 89761, 89770, 89781, 89792, - 89805, 89816, 89829, 89839, 89851, 89861, 89873, 89885, 89898, 89908, - 89918, 89928, 89939, 89949, 89958, 89968, 89977, 89986, 89996, 90006, - 90016, 90026, 90036, 90046, 90057, 90067, 90078, 90088, 90099, 90110, - 90120, 90130, 90140, 90150, 90160, 90170, 90181, 90191, 90202, 0, 0, 0, + 0, 0, 0, 0, 84582, 84587, 84592, 84597, 84602, 84607, 84615, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 84620, 84628, 84636, 84644, 84652, 0, 0, 0, 0, 0, + 84660, 84667, 84674, 84684, 84690, 84696, 84702, 84708, 84714, 84720, + 84727, 84733, 84739, 84745, 84754, 84763, 84775, 84787, 84793, 84799, + 84805, 84812, 84819, 84826, 84833, 84840, 0, 84847, 84854, 84861, 84869, + 84876, 0, 84883, 0, 84890, 84897, 0, 84904, 84912, 0, 84919, 84926, + 84933, 84940, 84947, 84954, 84961, 84968, 84975, 84982, 84987, 84994, + 85001, 85007, 85013, 85019, 85026, 85032, 85038, 85044, 85051, 85057, + 85063, 85069, 85076, 85082, 85088, 85094, 85101, 85107, 85113, 85119, + 85126, 85132, 85138, 85144, 85151, 85157, 85163, 85169, 85176, 85182, + 85188, 85194, 85201, 85207, 85213, 85219, 85226, 85232, 85238, 85244, + 85251, 85257, 85263, 85269, 85276, 85282, 85288, 85294, 85301, 85307, + 85313, 85319, 85325, 85331, 85337, 85343, 85349, 85355, 85361, 85367, + 85373, 85379, 85385, 85391, 85398, 85404, 85410, 85416, 85423, 85429, + 85435, 85441, 85448, 85454, 85460, 85466, 85473, 85481, 85489, 85495, + 85501, 85507, 85514, 85523, 85532, 85540, 85548, 85556, 85565, 85573, + 85581, 85589, 85598, 85605, 85612, 85623, 85634, 85638, 85642, 85648, + 85654, 85660, 85666, 85676, 85686, 85693, 85700, 85707, 85715, 85723, + 85727, 85733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85739, + 85745, 85751, 85757, 85764, 85769, 85774, 85780, 85786, 85792, 85798, + 85807, 85813, 85819, 85827, 85835, 85843, 85851, 85857, 85863, 85869, + 85876, 85889, 85903, 85914, 85925, 85937, 85949, 85961, 85973, 85984, + 85995, 86007, 86019, 86031, 86043, 86055, 86067, 86079, 86096, 86113, + 86130, 86137, 86144, 86151, 86159, 86171, 86182, 86193, 86206, 86217, + 86226, 86234, 86243, 86251, 86261, 86269, 86278, 86286, 86295, 86303, + 86313, 86321, 86330, 86338, 86348, 86356, 86364, 86372, 86380, 86387, + 86396, 86404, 86412, 86421, 86429, 86438, 86446, 86454, 86462, 86471, + 86479, 86488, 86496, 86504, 86512, 86520, 86529, 86537, 86546, 86554, + 86563, 86571, 86580, 86588, 86598, 86606, 86614, 86622, 86632, 86640, + 86648, 86657, 86665, 86674, 86683, 86691, 86701, 86709, 86718, 86726, + 86735, 86743, 86753, 86761, 86769, 86776, 86784, 86791, 86800, 86807, + 86816, 86824, 86833, 86841, 86851, 86859, 86868, 86876, 86886, 86894, + 86902, 86909, 86917, 86924, 86933, 86940, 86950, 86960, 86971, 86980, + 86989, 86998, 87007, 87016, 87026, 87038, 87050, 87061, 87073, 87086, + 87097, 87106, 87115, 87123, 87132, 87142, 87150, 87159, 87168, 87176, + 87185, 87195, 87203, 87212, 87221, 87229, 87238, 87248, 87256, 87266, + 87274, 87284, 87292, 87300, 87309, 87317, 87327, 87335, 87343, 87353, + 87361, 87368, 87375, 87384, 87393, 87401, 87410, 87420, 87428, 87439, + 87447, 87455, 87462, 87470, 87479, 87486, 87498, 87509, 87521, 87532, + 87544, 87553, 87561, 87570, 87578, 87587, 87596, 87604, 87613, 87621, + 87630, 87638, 87646, 87654, 87662, 87669, 87678, 87686, 87695, 87703, + 87712, 87720, 87728, 87737, 87745, 87754, 87762, 87771, 87779, 87787, + 87795, 87804, 87812, 87821, 87829, 87838, 87846, 87855, 87863, 87871, + 87879, 87888, 87896, 87905, 87914, 87922, 87931, 87939, 87948, 87956, + 87965, 87973, 87980, 87988, 87995, 88004, 88012, 88021, 88029, 88038, + 88047, 88055, 88065, 88073, 88080, 88088, 88095, 88103, 88115, 88128, + 88137, 88147, 88156, 88166, 88175, 88185, 88194, 88204, 88213, 88223, + 88233, 88242, 88251, 88260, 88270, 88278, 88287, 88297, 88307, 88317, + 88327, 88335, 88345, 88353, 88363, 88371, 88381, 88389, 88399, 88407, + 88416, 88423, 88433, 88441, 88451, 88459, 88469, 88477, 88487, 88495, + 88504, 88512, 88521, 88529, 88538, 88547, 88556, 88565, 88575, 88583, + 88593, 88601, 88611, 88619, 88629, 88637, 88647, 88655, 88664, 88671, + 88681, 88689, 88699, 88707, 88717, 88725, 88735, 88743, 88752, 88760, + 88769, 88777, 88786, 88795, 88804, 88813, 88822, 88830, 88839, 88847, + 88856, 88865, 88873, 88883, 88892, 88902, 88912, 88921, 88931, 88940, + 88949, 88957, 88965, 88970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 88975, 88986, 88997, 89008, 89018, 89029, 89040, 89050, 89061, 89071, + 89081, 89090, 89101, 89112, 89123, 89136, 89146, 89156, 89167, 89177, + 89187, 89197, 89207, 89217, 89227, 89237, 89248, 89259, 89270, 89280, + 89290, 89302, 89313, 89324, 89334, 89344, 89354, 89364, 89375, 89385, + 89395, 89407, 89417, 89427, 89439, 89450, 89461, 89471, 89481, 89491, + 89501, 89513, 89525, 89537, 89548, 89559, 89569, 89579, 89589, 89598, + 89607, 89617, 89627, 89638, 0, 0, 89648, 89659, 89670, 89680, 89690, + 89702, 89713, 89724, 89737, 89747, 89759, 89768, 89777, 89788, 89799, + 89812, 89823, 89836, 89846, 89858, 89868, 89880, 89892, 89905, 89915, + 89925, 89935, 89946, 89956, 89965, 89975, 89984, 89993, 90003, 90013, + 90023, 90033, 90043, 90053, 90064, 90074, 90085, 90095, 90106, 90117, + 90127, 90137, 90147, 90157, 90167, 90177, 90188, 90198, 90209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90213, 90228, 90243, 90249, 90255, - 90261, 90267, 90273, 90279, 90285, 90291, 90299, 90303, 90306, 0, 0, - 90314, 90317, 90320, 90323, 90326, 90329, 90332, 90335, 90338, 90341, - 90344, 90347, 90350, 90353, 90356, 90359, 90362, 90370, 90379, 90390, - 90398, 90406, 90415, 90424, 90435, 90447, 0, 0, 0, 0, 0, 0, 90457, 90462, - 90467, 90474, 90481, 90487, 90493, 90498, 90503, 90508, 90514, 90520, - 90526, 90532, 90538, 90545, 90552, 90562, 90572, 90582, 90591, 90602, - 90611, 90620, 90630, 90640, 90652, 90664, 90675, 90686, 90697, 90708, - 90718, 90728, 90738, 90748, 90759, 90770, 90774, 90779, 90788, 90797, - 90801, 90805, 90809, 90814, 90819, 90824, 90829, 90832, 90836, 0, 90841, - 90844, 90847, 90851, 90855, 90860, 90864, 90868, 90873, 90878, 90885, - 90892, 90895, 90898, 90901, 90904, 90907, 90911, 90915, 0, 90919, 90924, - 90928, 90932, 0, 0, 0, 0, 90937, 90942, 90949, 90954, 90959, 0, 90964, - 90969, 90975, 90980, 90986, 90991, 90997, 91002, 91008, 91013, 91019, - 91025, 91034, 91043, 91052, 91061, 91071, 91081, 91091, 91101, 91110, - 91119, 91128, 91138, 91143, 91148, 91154, 91160, 91166, 91173, 91181, - 91189, 91195, 91201, 91207, 91214, 91220, 91226, 91232, 91239, 91245, - 91251, 91257, 91264, 91269, 91274, 91279, 91285, 91291, 91297, 91303, - 91310, 91316, 91322, 91328, 91334, 91340, 91346, 91352, 91358, 91364, - 91370, 91376, 91383, 91389, 91395, 91401, 91408, 91414, 91420, 91426, - 91433, 91439, 91445, 91451, 91458, 91464, 91470, 91476, 91483, 91489, - 91495, 91501, 91508, 91514, 91520, 91526, 91533, 91539, 91545, 91551, - 91558, 91564, 91570, 91576, 91583, 91589, 91595, 91601, 91608, 91614, - 91620, 91626, 91633, 91639, 91645, 91651, 91658, 91663, 91668, 91673, - 91679, 91685, 91691, 91697, 91704, 91710, 91716, 91722, 91729, 91735, - 91741, 91748, 91755, 91760, 91765, 91770, 91776, 91788, 91800, 91812, - 91824, 91837, 91850, 91858, 0, 0, 91866, 0, 91874, 91878, 91882, 91885, - 91889, 91893, 91896, 91899, 91903, 91907, 91910, 91913, 91916, 91919, - 91924, 91927, 91931, 91934, 91937, 91940, 91943, 91946, 91949, 91952, - 91955, 91958, 91961, 91964, 91968, 91972, 91976, 91980, 91985, 91990, - 91996, 92002, 92008, 92013, 92019, 92025, 92031, 92036, 92042, 92048, - 92053, 92059, 92065, 92070, 92076, 92082, 92087, 92093, 92099, 92104, - 92110, 92116, 92122, 92128, 92134, 92138, 92143, 92147, 92152, 92156, - 92161, 92166, 92172, 92178, 92184, 92189, 92195, 92201, 92207, 92212, - 92218, 92224, 92229, 92235, 92241, 92246, 92252, 92258, 92263, 92269, - 92275, 92280, 92286, 92292, 92298, 92304, 92310, 92315, 92319, 92324, - 92327, 92332, 92337, 92343, 92348, 92353, 92357, 92362, 92367, 92372, - 92377, 92382, 92387, 92392, 92397, 92403, 92409, 92415, 92423, 92427, - 92431, 92435, 92439, 92443, 92447, 92452, 92457, 92462, 92467, 92471, - 92476, 92481, 92486, 92491, 92495, 92500, 92505, 92510, 92514, 92518, - 92523, 92528, 92533, 92538, 92542, 92547, 92552, 92557, 92562, 92566, - 92571, 92576, 92581, 92586, 92590, 92595, 92600, 92604, 92609, 92614, - 92619, 92624, 92629, 92634, 92641, 92648, 92652, 92657, 92662, 92667, - 92672, 92677, 92682, 92687, 92692, 92697, 92702, 92707, 92712, 92717, - 92722, 92727, 92732, 92737, 92742, 92747, 92752, 92757, 92762, 92767, - 92772, 92777, 92782, 92787, 92792, 92797, 0, 0, 0, 92802, 92806, 92811, - 92815, 92820, 92825, 0, 0, 92829, 92834, 92839, 92843, 92848, 92853, 0, - 0, 92858, 92863, 92867, 92872, 92877, 92882, 0, 0, 92887, 92892, 92897, - 0, 0, 0, 92901, 92905, 92909, 92913, 92916, 92920, 92924, 0, 92928, - 92934, 92937, 92941, 92944, 92948, 92952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92956, 92962, 92968, 92974, 92980, 0, 0, 92984, 92990, 92996, 93002, - 93008, 93014, 93021, 93028, 93035, 93042, 93049, 93056, 0, 93063, 93070, - 93077, 93083, 93090, 93097, 93104, 93111, 93117, 93124, 93131, 93138, - 93145, 93151, 93158, 93165, 93172, 93179, 93185, 93192, 93199, 93206, - 93213, 93220, 93227, 93234, 0, 93241, 93247, 93254, 93261, 93268, 93275, - 93281, 93288, 93295, 93302, 93309, 93315, 93322, 93329, 93335, 93342, - 93349, 93356, 93363, 0, 93370, 93377, 0, 93384, 93391, 93398, 93405, - 93412, 93419, 93426, 93433, 93440, 93447, 93454, 93461, 93468, 93475, - 93482, 0, 0, 93488, 93493, 93498, 93503, 93508, 93513, 93518, 93523, - 93528, 93533, 93538, 93543, 93548, 93553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90220, 90235, 90250, 90256, 90262, + 90268, 90274, 90280, 90286, 90292, 90298, 90306, 90310, 90313, 0, 0, + 90321, 90324, 90327, 90330, 90333, 90336, 90339, 90342, 90345, 90348, + 90351, 90354, 90357, 90360, 90363, 90366, 90369, 90377, 90386, 90397, + 90405, 90413, 90422, 90431, 90442, 90454, 0, 0, 0, 0, 0, 0, 90464, 90469, + 90474, 90481, 90488, 90494, 90500, 90505, 90510, 90515, 90521, 90527, + 90533, 90539, 90545, 90552, 90559, 90569, 90579, 90589, 90598, 90609, + 90618, 90627, 90637, 90647, 90659, 90671, 90682, 90693, 90704, 90715, + 90725, 90735, 90745, 90755, 90766, 90777, 90781, 90786, 90795, 90804, + 90808, 90812, 90816, 90821, 90826, 90831, 90836, 90839, 90843, 0, 90848, + 90851, 90854, 90858, 90862, 90867, 90871, 90875, 90880, 90885, 90892, + 90899, 90902, 90905, 90908, 90911, 90914, 90918, 90922, 0, 90926, 90931, + 90935, 90939, 0, 0, 0, 0, 90944, 90949, 90956, 90961, 90966, 0, 90971, + 90976, 90982, 90987, 90993, 90998, 91004, 91009, 91015, 91020, 91026, + 91032, 91041, 91050, 91059, 91068, 91078, 91088, 91098, 91108, 91117, + 91126, 91135, 91145, 91150, 91155, 91161, 91167, 91173, 91180, 91188, + 91196, 91202, 91208, 91214, 91221, 91227, 91233, 91239, 91246, 91252, + 91258, 91264, 91271, 91276, 91281, 91286, 91292, 91298, 91304, 91310, + 91317, 91323, 91329, 91335, 91341, 91347, 91353, 91359, 91365, 91371, + 91377, 91383, 91390, 91396, 91402, 91408, 91415, 91421, 91427, 91433, + 91440, 91446, 91452, 91458, 91465, 91471, 91477, 91483, 91490, 91496, + 91502, 91508, 91515, 91521, 91527, 91533, 91540, 91546, 91552, 91558, + 91565, 91571, 91577, 91583, 91590, 91596, 91602, 91608, 91615, 91621, + 91627, 91633, 91640, 91646, 91652, 91658, 91665, 91670, 91675, 91680, + 91686, 91692, 91698, 91704, 91711, 91717, 91723, 91729, 91736, 91742, + 91748, 91755, 91762, 91767, 91772, 91777, 91783, 91795, 91807, 91819, + 91831, 91844, 91857, 91865, 0, 0, 91873, 0, 91881, 91885, 91889, 91892, + 91896, 91900, 91903, 91906, 91910, 91914, 91917, 91920, 91923, 91926, + 91931, 91934, 91938, 91941, 91944, 91947, 91950, 91953, 91956, 91959, + 91962, 91965, 91968, 91971, 91975, 91979, 91983, 91987, 91992, 91997, + 92003, 92009, 92015, 92020, 92026, 92032, 92038, 92043, 92049, 92055, + 92060, 92066, 92072, 92077, 92083, 92089, 92094, 92100, 92106, 92111, + 92117, 92123, 92129, 92135, 92141, 92145, 92150, 92154, 92159, 92163, + 92168, 92173, 92179, 92185, 92191, 92196, 92202, 92208, 92214, 92219, + 92225, 92231, 92236, 92242, 92248, 92253, 92259, 92265, 92270, 92276, + 92282, 92287, 92293, 92299, 92305, 92311, 92317, 92322, 92326, 92331, + 92334, 92339, 92344, 92350, 92355, 92360, 92364, 92369, 92374, 92379, + 92384, 92389, 92394, 92399, 92404, 92410, 92416, 92422, 92430, 92434, + 92438, 92442, 92446, 92450, 92454, 92459, 92464, 92469, 92474, 92478, + 92483, 92488, 92493, 92498, 92502, 92507, 92512, 92517, 92521, 92525, + 92530, 92535, 92540, 92545, 92549, 92554, 92559, 92564, 92569, 92573, + 92578, 92583, 92588, 92593, 92597, 92602, 92607, 92611, 92616, 92621, + 92626, 92631, 92636, 92641, 92648, 92655, 92659, 92664, 92669, 92674, + 92679, 92684, 92689, 92694, 92699, 92704, 92709, 92714, 92719, 92724, + 92729, 92734, 92739, 92744, 92749, 92754, 92759, 92764, 92769, 92774, + 92779, 92784, 92789, 92794, 92799, 92804, 0, 0, 0, 92809, 92813, 92818, + 92822, 92827, 92832, 0, 0, 92836, 92841, 92846, 92850, 92855, 92860, 0, + 0, 92865, 92870, 92874, 92879, 92884, 92889, 0, 0, 92894, 92899, 92904, + 0, 0, 0, 92908, 92912, 92916, 92920, 92923, 92927, 92931, 0, 92935, + 92941, 92944, 92948, 92951, 92955, 92959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92963, 92969, 92975, 92981, 92987, 0, 0, 92991, 92997, 93003, 93009, + 93015, 93021, 93028, 93035, 93042, 93049, 93056, 93063, 0, 93070, 93077, + 93084, 93090, 93097, 93104, 93111, 93118, 93124, 93131, 93138, 93145, + 93152, 93158, 93165, 93172, 93179, 93186, 93192, 93199, 93206, 93213, + 93220, 93227, 93234, 93241, 0, 93248, 93254, 93261, 93268, 93275, 93282, + 93288, 93295, 93302, 93309, 93316, 93322, 93329, 93336, 93342, 93349, + 93356, 93363, 93370, 0, 93377, 93384, 0, 93391, 93398, 93405, 93412, + 93419, 93426, 93433, 93440, 93447, 93454, 93461, 93468, 93475, 93482, + 93489, 0, 0, 93495, 93500, 93505, 93510, 93515, 93520, 93525, 93530, + 93535, 93540, 93545, 93550, 93555, 93560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 93558, 93565, 93572, 93579, 93586, 93593, 93600, 93607, 93614, 93621, - 93628, 93635, 93642, 93649, 93656, 93663, 93670, 93677, 93684, 93691, - 93699, 93707, 93714, 93721, 93726, 93734, 93742, 93749, 93756, 93761, - 93768, 93773, 93778, 93785, 93790, 93795, 93800, 93808, 93813, 93818, - 93825, 93830, 93835, 93842, 93849, 93854, 93859, 93864, 93869, 93874, - 93879, 93884, 93889, 93894, 93901, 93906, 93913, 93918, 93923, 93928, - 93933, 93938, 93943, 93948, 93953, 93958, 93963, 93968, 93975, 93982, - 93989, 93996, 94002, 94007, 94014, 94019, 94024, 94033, 94040, 94049, - 94056, 94061, 94066, 94074, 94079, 94084, 94089, 94094, 94099, 94106, - 94111, 94116, 94121, 94126, 94131, 94138, 94145, 94152, 94159, 94166, - 94173, 94180, 94187, 94194, 94201, 94208, 94215, 94222, 94229, 94236, - 94243, 94250, 94257, 94264, 94271, 94278, 94285, 94292, 94299, 94306, - 94313, 94320, 94327, 0, 0, 0, 0, 0, 94334, 94342, 94350, 0, 0, 0, 0, - 94355, 94359, 94363, 94367, 94371, 94375, 94379, 94383, 94387, 94391, - 94396, 94401, 94406, 94411, 94416, 94421, 94426, 94431, 94436, 94442, - 94448, 94454, 94461, 94468, 94475, 94482, 94489, 94496, 94501, 94506, - 94511, 94517, 94523, 94529, 94535, 94541, 94547, 94553, 94559, 94565, - 94571, 94577, 94583, 94589, 94595, 0, 0, 0, 94601, 94609, 94617, 94625, - 94633, 94641, 94651, 94661, 94669, 94677, 94685, 94693, 94701, 94707, - 94714, 94723, 94731, 94739, 94748, 94757, 94766, 94776, 94787, 94797, - 94808, 94817, 94826, 94835, 94845, 94856, 94866, 94877, 94888, 94897, - 94905, 94911, 94917, 94923, 94929, 94937, 94945, 94951, 94958, 94968, - 94975, 94982, 94989, 94996, 95003, 95013, 95020, 95027, 95035, 95043, - 95052, 95061, 95070, 95079, 95088, 95095, 95103, 95112, 95121, 95125, - 95132, 95137, 95142, 95146, 95150, 95154, 95158, 95163, 95168, 95174, - 95180, 95184, 95190, 95194, 95198, 95202, 95206, 95210, 95214, 95220, - 95224, 95229, 95233, 95237, 0, 95240, 95245, 95250, 95255, 95260, 95267, - 95272, 95277, 95282, 95287, 95292, 95297, 0, 0, 0, 0, 95302, 0, 0, 0, 0, + 93565, 93572, 93579, 93586, 93593, 93600, 93607, 93614, 93621, 93628, + 93635, 93642, 93649, 93656, 93663, 93670, 93677, 93684, 93691, 93698, + 93706, 93714, 93721, 93728, 93733, 93741, 93749, 93756, 93763, 93768, + 93775, 93780, 93785, 93792, 93797, 93802, 93807, 93815, 93820, 93825, + 93832, 93837, 93842, 93849, 93856, 93861, 93866, 93871, 93876, 93881, + 93886, 93891, 93896, 93901, 93908, 93913, 93920, 93925, 93930, 93935, + 93940, 93945, 93950, 93955, 93960, 93965, 93970, 93975, 93982, 93989, + 93996, 94003, 94009, 94014, 94021, 94026, 94031, 94040, 94047, 94056, + 94063, 94068, 94073, 94081, 94086, 94091, 94096, 94101, 94106, 94113, + 94118, 94123, 94128, 94133, 94138, 94145, 94152, 94159, 94166, 94173, + 94180, 94187, 94194, 94201, 94208, 94215, 94222, 94229, 94236, 94243, + 94250, 94257, 94264, 94271, 94278, 94285, 94292, 94299, 94306, 94313, + 94320, 94327, 94334, 0, 0, 0, 0, 0, 94341, 94349, 94357, 0, 0, 0, 0, + 94362, 94366, 94370, 94374, 94378, 94382, 94386, 94390, 94394, 94398, + 94403, 94408, 94413, 94418, 94423, 94428, 94433, 94438, 94443, 94449, + 94455, 94461, 94468, 94475, 94482, 94489, 94496, 94503, 94508, 94513, + 94518, 94524, 94530, 94536, 94542, 94548, 94554, 94560, 94566, 94572, + 94578, 94584, 94590, 94596, 94602, 0, 0, 0, 94608, 94616, 94624, 94632, + 94640, 94648, 94658, 94668, 94676, 94684, 94692, 94700, 94708, 94714, + 94721, 94730, 94738, 94746, 94755, 94764, 94773, 94783, 94794, 94804, + 94815, 94824, 94833, 94842, 94852, 94863, 94873, 94884, 94895, 94904, + 94912, 94918, 94924, 94930, 94936, 94944, 94952, 94958, 94965, 94975, + 94982, 94989, 94996, 95003, 95010, 95020, 95027, 95034, 95042, 95050, + 95059, 95068, 95077, 95086, 95095, 95102, 95110, 95119, 95128, 95132, + 95139, 95144, 95149, 95153, 95157, 95161, 95165, 95170, 95175, 95181, + 95187, 95191, 95197, 95201, 95205, 95209, 95213, 95217, 95221, 95227, + 95231, 95236, 95240, 95244, 0, 95247, 95252, 95257, 95262, 95267, 95274, + 95279, 95284, 95289, 95294, 95299, 95304, 0, 0, 0, 0, 95309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95308, 95315, - 95324, 95333, 95340, 95347, 95354, 95361, 95368, 95375, 95381, 95388, - 95395, 95402, 95409, 95416, 95423, 95430, 95437, 95446, 95453, 95460, - 95467, 95474, 95481, 95488, 95495, 95502, 95511, 95518, 95525, 95532, - 95539, 95546, 95553, 95562, 95569, 95576, 95583, 95590, 95599, 95606, - 95613, 95620, 95628, 95637, 0, 0, 95646, 95650, 95654, 95659, 95664, - 95669, 95674, 95678, 95683, 95688, 95693, 95698, 95703, 95708, 95712, - 95717, 95722, 95727, 95732, 95736, 95741, 95746, 95750, 95755, 95760, - 95765, 95770, 95775, 95780, 0, 0, 0, 95785, 95789, 95794, 95799, 95803, - 95808, 95812, 95817, 95822, 95827, 95832, 95837, 95841, 95846, 95851, - 95856, 95861, 95866, 95871, 95875, 95880, 95885, 95890, 95895, 95900, - 95905, 95909, 95913, 95918, 95923, 95928, 95933, 95938, 95943, 95948, - 95953, 95958, 95963, 95968, 95973, 95978, 95983, 95988, 95993, 95998, - 96003, 96008, 96013, 96018, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96023, 96029, 96034, 96039, 96044, 96049, 96054, 96059, 96064, 96069, - 96074, 96080, 96086, 96092, 96098, 96104, 96110, 96116, 96122, 96128, - 96135, 96142, 96149, 96157, 96165, 96173, 96181, 96189, 0, 0, 0, 0, - 96197, 96201, 96206, 96211, 96216, 96220, 96225, 96230, 96235, 96240, - 96244, 96248, 96253, 96258, 96263, 96268, 96272, 96277, 96282, 96287, - 96292, 96297, 96302, 96306, 96311, 96316, 96321, 96326, 96331, 96336, - 96341, 96346, 96351, 96356, 96361, 96367, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96373, 96378, 96385, 96392, 96397, 96402, 96407, 96412, 96417, 96422, - 96427, 96432, 96437, 96442, 96447, 96452, 96457, 96462, 96467, 96472, - 96477, 96482, 96487, 96492, 96497, 96502, 96507, 96512, 96517, 96522, 0, - 0, 0, 0, 0, 96529, 96535, 96541, 96547, 96553, 96558, 96564, 96570, - 96576, 96582, 96587, 96593, 96599, 96605, 96611, 96617, 96623, 96629, - 96635, 96641, 96646, 96652, 96658, 96664, 96670, 96676, 96681, 96687, - 96693, 96698, 96704, 96710, 96716, 96722, 96728, 96734, 96740, 96745, - 96751, 96758, 96765, 96772, 96779, 0, 0, 0, 0, 0, 96786, 96791, 96796, - 96801, 96806, 96811, 96816, 96821, 96826, 96831, 96836, 96841, 96846, - 96851, 96856, 96861, 96866, 96871, 96876, 96881, 96886, 96891, 96896, - 96901, 96906, 96911, 96916, 96920, 96924, 96928, 0, 96933, 96939, 96944, - 96949, 96954, 96959, 96965, 96971, 96977, 96983, 96989, 96995, 97001, - 97006, 97012, 97018, 97024, 97030, 97036, 97041, 97047, 97053, 97058, - 97064, 97069, 97075, 97081, 97086, 97092, 97098, 97103, 97109, 97114, - 97119, 97125, 97131, 97137, 0, 0, 0, 0, 97142, 97148, 97154, 97160, - 97166, 97172, 97178, 97184, 97190, 97197, 97202, 97207, 97213, 97219, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95315, 95322, + 95331, 95340, 95347, 95354, 95361, 95368, 95375, 95382, 95388, 95395, + 95402, 95409, 95416, 95423, 95430, 95437, 95444, 95453, 95460, 95467, + 95474, 95481, 95488, 95495, 95502, 95509, 95518, 95525, 95532, 95539, + 95546, 95553, 95560, 95569, 95576, 95583, 95590, 95597, 95606, 95613, + 95620, 95627, 95635, 95644, 0, 0, 95653, 95657, 95661, 95666, 95671, + 95676, 95681, 95685, 95690, 95695, 95700, 95705, 95710, 95715, 95719, + 95724, 95729, 95734, 95739, 95743, 95748, 95753, 95757, 95762, 95767, + 95772, 95777, 95782, 95787, 0, 0, 0, 95792, 95796, 95801, 95806, 95810, + 95815, 95819, 95824, 95829, 95834, 95839, 95844, 95848, 95853, 95858, + 95863, 95868, 95873, 95878, 95882, 95887, 95892, 95897, 95902, 95907, + 95912, 95916, 95920, 95925, 95930, 95935, 95940, 95945, 95950, 95955, + 95960, 95965, 95970, 95975, 95980, 95985, 95990, 95995, 96000, 96005, + 96010, 96015, 96020, 96025, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96030, 96036, 96041, 96046, 96051, 96056, 96061, 96066, 96071, 96076, + 96081, 96087, 96093, 96099, 96105, 96111, 96117, 96123, 96129, 96135, + 96142, 96149, 96156, 96164, 96172, 96180, 96188, 96196, 0, 0, 0, 0, + 96204, 96208, 96213, 96218, 96223, 96227, 96232, 96237, 96242, 96247, + 96251, 96255, 96260, 96265, 96270, 96275, 96279, 96284, 96289, 96294, + 96299, 96304, 96309, 96313, 96318, 96323, 96328, 96333, 96338, 96343, + 96348, 96353, 96358, 96363, 96368, 96374, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96380, 96385, 96392, 96399, 96404, 96409, 96414, 96419, 96424, 96429, + 96434, 96439, 96444, 96449, 96454, 96459, 96464, 96469, 96474, 96479, + 96484, 96489, 96494, 96499, 96504, 96509, 96514, 96519, 96524, 96529, 0, + 0, 0, 0, 0, 96536, 96542, 96548, 96554, 96560, 96565, 96571, 96577, + 96583, 96589, 96594, 96600, 96606, 96612, 96618, 96624, 96630, 96636, + 96642, 96648, 96653, 96659, 96665, 96671, 96677, 96683, 96688, 96694, + 96700, 96705, 96711, 96717, 96723, 96729, 96735, 96741, 96747, 96752, + 96758, 96765, 96772, 96779, 96786, 0, 0, 0, 0, 0, 96793, 96798, 96803, + 96808, 96813, 96818, 96823, 96828, 96833, 96838, 96843, 96848, 96853, + 96858, 96863, 96868, 96873, 96878, 96883, 96888, 96893, 96898, 96903, + 96908, 96913, 96918, 96923, 96927, 96931, 96935, 0, 96940, 96946, 96951, + 96956, 96961, 96966, 96972, 96978, 96984, 96990, 96996, 97002, 97008, + 97013, 97019, 97025, 97031, 97037, 97043, 97048, 97054, 97060, 97065, + 97071, 97076, 97082, 97088, 97093, 97099, 97105, 97110, 97116, 97121, + 97126, 97132, 97138, 97144, 0, 0, 0, 0, 97149, 97155, 97161, 97167, + 97173, 97179, 97185, 97191, 97197, 97204, 97209, 97214, 97220, 97226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97225, 97231, 97237, - 97243, 97250, 97256, 97263, 97270, 97277, 97284, 97292, 97299, 97307, - 97313, 97319, 97325, 97331, 97337, 97343, 97349, 97355, 97361, 97367, - 97373, 97379, 97385, 97391, 97397, 97403, 97409, 97415, 97421, 97427, - 97433, 97439, 97445, 97451, 97457, 97463, 97469, 97475, 97481, 97487, - 97493, 97500, 97506, 97513, 97520, 97527, 97534, 97542, 97549, 97557, - 97563, 97569, 97575, 97581, 97587, 97593, 97599, 97605, 97611, 97617, - 97623, 97629, 97635, 97641, 97647, 97653, 97659, 97665, 97671, 97677, - 97683, 97689, 97695, 97701, 97707, 97713, 97719, 97725, 97730, 97735, - 97740, 97745, 97750, 97755, 97760, 97765, 97770, 97775, 97780, 97785, - 97790, 97795, 97800, 97805, 97810, 97815, 97820, 97825, 97830, 97835, - 97840, 97845, 97850, 97855, 97860, 97865, 97870, 97875, 97880, 97885, - 97890, 97895, 97900, 97905, 97910, 97915, 97920, 97925, 97930, 97935, - 97940, 97945, 97950, 97955, 97960, 97965, 97970, 97975, 97979, 97984, - 97989, 97994, 97999, 98003, 98007, 98012, 98017, 98022, 98027, 98032, - 98037, 98042, 98047, 98052, 98057, 98062, 98066, 98070, 98074, 98078, - 98082, 98086, 98090, 98095, 98100, 0, 0, 98105, 98110, 98114, 98118, - 98122, 98126, 98130, 98134, 98138, 98142, 0, 0, 0, 0, 0, 0, 98146, 98151, - 98157, 98163, 98169, 98175, 98181, 98187, 98192, 98198, 98203, 98209, - 98214, 98219, 98225, 98231, 98236, 98241, 98246, 98251, 98257, 98262, - 98268, 98273, 98279, 98284, 98290, 98296, 98302, 98308, 98314, 98319, - 98325, 98331, 98337, 98343, 0, 0, 0, 0, 98349, 98354, 98360, 98366, - 98372, 98378, 98384, 98390, 98395, 98401, 98406, 98412, 98417, 98422, - 98428, 98434, 98439, 98444, 98449, 98454, 98460, 98465, 98471, 98476, - 98482, 98487, 98493, 98499, 98505, 98511, 98517, 98522, 98528, 98534, - 98540, 98546, 0, 0, 0, 0, 98552, 98556, 98561, 98566, 98571, 98576, - 98581, 98586, 98591, 98595, 98600, 98605, 98610, 98615, 98619, 98624, - 98629, 98634, 98639, 98644, 98649, 98653, 98658, 98662, 98667, 98672, - 98677, 98682, 98687, 98692, 98697, 98702, 98706, 98711, 98716, 98721, - 98726, 98731, 98736, 98741, 0, 0, 0, 0, 0, 0, 0, 0, 98746, 98753, 98760, - 98767, 98774, 98781, 98788, 98795, 98802, 98809, 98816, 98823, 98830, - 98837, 98844, 98851, 98858, 98865, 98872, 98879, 98886, 98893, 98900, - 98907, 98914, 98921, 98928, 98935, 98942, 98949, 98956, 98963, 98970, - 98977, 98984, 98991, 98998, 99005, 99012, 99019, 99026, 99033, 99040, - 99047, 99054, 99061, 99068, 99075, 99082, 99089, 99096, 99103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99117, 99122, 99127, 99132, 99137, 99142, 99147, 99152, 99157, - 99162, 99167, 99172, 99177, 99182, 99187, 99192, 99197, 99202, 99207, - 99212, 99217, 99222, 99227, 99232, 99237, 99242, 99247, 99252, 99257, - 99262, 99267, 99272, 99277, 99282, 99287, 99292, 99297, 99302, 99307, - 99312, 99317, 99322, 99327, 99332, 99337, 99342, 99347, 99352, 99357, - 99362, 99367, 99372, 99377, 99382, 99387, 99392, 99397, 99402, 99407, - 99412, 99417, 99422, 99427, 99432, 99437, 99442, 99447, 99452, 99457, - 99462, 99467, 99472, 99477, 99482, 99487, 99492, 99497, 99502, 99507, - 99512, 99517, 99522, 99527, 99532, 99537, 99542, 99547, 99552, 99557, - 99562, 99567, 99572, 99577, 99582, 99587, 99592, 99597, 99602, 99607, - 99612, 99617, 99622, 99627, 99632, 99637, 99642, 99647, 99652, 99657, - 99662, 99667, 99672, 99677, 99682, 99687, 99692, 99697, 99702, 99707, - 99712, 99717, 99722, 99727, 99732, 99737, 99742, 99747, 99752, 99757, - 99762, 99767, 99772, 99777, 99782, 99787, 99792, 99797, 99802, 99807, - 99812, 99817, 99822, 99827, 99832, 99837, 99842, 99847, 99852, 99857, - 99862, 99867, 99872, 99877, 99882, 99887, 99892, 99897, 99902, 99907, - 99912, 99917, 99922, 99927, 99932, 99937, 99942, 99947, 99952, 99957, - 99962, 99967, 99972, 99977, 99982, 99987, 99992, 99997, 100002, 100007, - 100012, 100017, 100022, 100027, 100032, 100037, 100042, 100047, 100052, - 100057, 100062, 100067, 100072, 100077, 100082, 100087, 100092, 100097, - 100102, 100107, 100112, 100117, 100122, 100127, 100132, 100137, 100142, - 100147, 100152, 100157, 100162, 100167, 100172, 100177, 100182, 100187, - 100192, 100197, 100202, 100207, 100212, 100217, 100222, 100227, 100232, - 100237, 100242, 100247, 100252, 100257, 100262, 100267, 100272, 100277, - 100282, 100287, 100292, 100297, 100302, 100307, 100312, 100317, 100322, - 100327, 100332, 100337, 100342, 100347, 100352, 100357, 100362, 100367, - 100372, 100377, 100382, 100387, 100392, 100397, 100402, 100407, 100412, - 100417, 100422, 100427, 100432, 100437, 100442, 100447, 100452, 100457, - 100462, 100467, 100472, 100477, 100482, 100487, 100492, 100497, 100502, - 100507, 100512, 100517, 100522, 100527, 100532, 100537, 100542, 100547, - 100552, 100557, 100562, 100567, 100572, 100577, 100582, 100587, 100592, - 100597, 100602, 100607, 100612, 100617, 100622, 100627, 100632, 100637, - 100642, 100647, 100652, 100657, 100662, 100667, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 100672, 100678, 100685, 100692, 100698, 100705, 100712, 100719, - 100726, 100732, 100739, 100746, 100753, 100760, 100767, 100774, 100781, - 100788, 100795, 100802, 100809, 100816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 100823, 100828, 100833, 100838, 100843, 100848, 100853, 100858, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100863, - 100867, 100871, 100875, 100879, 100883, 0, 0, 100888, 0, 100893, 100897, - 100902, 100907, 100912, 100917, 100921, 100926, 100931, 100936, 100941, - 100945, 100950, 100955, 100960, 100965, 100969, 100974, 100979, 100984, - 100989, 100993, 100998, 101003, 101008, 101013, 101017, 101022, 101027, - 101032, 101037, 101041, 101046, 101051, 101056, 101061, 101065, 101070, - 101075, 101079, 101084, 101089, 101094, 101099, 0, 101104, 101109, 0, 0, - 0, 101114, 0, 0, 101119, 101124, 101131, 101138, 101145, 101152, 101159, - 101166, 101173, 101180, 101187, 101194, 101201, 101208, 101215, 101222, - 101229, 101236, 101243, 101250, 101257, 101264, 101271, 0, 101278, - 101285, 101291, 101297, 101303, 101310, 101317, 101325, 101332, 101340, - 101345, 101350, 101355, 101360, 101365, 101370, 101375, 101380, 101385, - 101390, 101395, 101400, 101405, 101411, 101416, 101421, 101426, 101431, - 101436, 101441, 101446, 101451, 101456, 101462, 101468, 101472, 101476, - 101480, 101484, 101488, 101493, 101498, 101504, 101509, 101515, 101520, - 101525, 101530, 101536, 101541, 101546, 101551, 101556, 101561, 101567, - 101572, 101578, 101583, 101589, 101594, 101600, 101605, 101611, 101616, - 101621, 101626, 101631, 101636, 101641, 101646, 101652, 101657, 0, 0, 0, - 0, 0, 0, 0, 0, 101662, 101666, 101670, 101674, 101678, 101684, 101688, - 101693, 101698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97232, 97238, 97244, + 97250, 97257, 97263, 97270, 97277, 97284, 97291, 97299, 97306, 97314, + 97320, 97326, 97332, 97338, 97344, 97350, 97356, 97362, 97368, 97374, + 97380, 97386, 97392, 97398, 97404, 97410, 97416, 97422, 97428, 97434, + 97440, 97446, 97452, 97458, 97464, 97470, 97476, 97482, 97488, 97494, + 97500, 97507, 97513, 97520, 97527, 97534, 97541, 97549, 97556, 97564, + 97570, 97576, 97582, 97588, 97594, 97600, 97606, 97612, 97618, 97624, + 97630, 97636, 97642, 97648, 97654, 97660, 97666, 97672, 97678, 97684, + 97690, 97696, 97702, 97708, 97714, 97720, 97726, 97732, 97737, 97742, + 97747, 97752, 97757, 97762, 97767, 97772, 97777, 97782, 97787, 97792, + 97797, 97802, 97807, 97812, 97817, 97822, 97827, 97832, 97837, 97842, + 97847, 97852, 97857, 97862, 97867, 97872, 97877, 97882, 97887, 97892, + 97897, 97902, 97907, 97912, 97917, 97922, 97927, 97932, 97937, 97942, + 97947, 97952, 97957, 97962, 97967, 97972, 97977, 97982, 97986, 97991, + 97996, 98001, 98006, 98010, 98014, 98019, 98024, 98029, 98034, 98039, + 98044, 98049, 98054, 98059, 98064, 98069, 98073, 98077, 98081, 98085, + 98089, 98093, 98097, 98102, 98107, 0, 0, 98112, 98117, 98121, 98125, + 98129, 98133, 98137, 98141, 98145, 98149, 0, 0, 0, 0, 0, 0, 98153, 98158, + 98164, 98170, 98176, 98182, 98188, 98194, 98199, 98205, 98210, 98216, + 98221, 98226, 98232, 98238, 98243, 98248, 98253, 98258, 98264, 98269, + 98275, 98280, 98286, 98291, 98297, 98303, 98309, 98315, 98321, 98326, + 98332, 98338, 98344, 98350, 0, 0, 0, 0, 98356, 98361, 98367, 98373, + 98379, 98385, 98391, 98397, 98402, 98408, 98413, 98419, 98424, 98429, + 98435, 98441, 98446, 98451, 98456, 98461, 98467, 98472, 98478, 98483, + 98489, 98494, 98500, 98506, 98512, 98518, 98524, 98529, 98535, 98541, + 98547, 98553, 0, 0, 0, 0, 98559, 98563, 98568, 98573, 98578, 98583, + 98588, 98593, 98598, 98602, 98607, 98612, 98617, 98622, 98626, 98631, + 98636, 98641, 98646, 98651, 98656, 98660, 98665, 98669, 98674, 98679, + 98684, 98689, 98694, 98699, 98704, 98709, 98713, 98718, 98723, 98728, + 98733, 98738, 98743, 98748, 0, 0, 0, 0, 0, 0, 0, 0, 98753, 98760, 98767, + 98774, 98781, 98788, 98795, 98802, 98809, 98816, 98823, 98830, 98837, + 98844, 98851, 98858, 98865, 98872, 98879, 98886, 98893, 98900, 98907, + 98914, 98921, 98928, 98935, 98942, 98949, 98956, 98963, 98970, 98977, + 98984, 98991, 98998, 99005, 99012, 99019, 99026, 99033, 99040, 99047, + 99054, 99061, 99068, 99075, 99082, 99089, 99096, 99103, 99110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 99117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 99124, 99129, 99134, 99139, 99144, 99149, 99154, 99159, 99164, + 99169, 99174, 99179, 99184, 99189, 99194, 99199, 99204, 99209, 99214, + 99219, 99224, 99229, 99234, 99239, 99244, 99249, 99254, 99259, 99264, + 99269, 99274, 99279, 99284, 99289, 99294, 99299, 99304, 99309, 99314, + 99319, 99324, 99329, 99334, 99339, 99344, 99349, 99354, 99359, 99364, + 99369, 99374, 99379, 99384, 99389, 99394, 99399, 99404, 99409, 99414, + 99419, 99424, 99429, 99434, 99439, 99444, 99449, 99454, 99459, 99464, + 99469, 99474, 99479, 99484, 99489, 99494, 99499, 99504, 99509, 99514, + 99519, 99524, 99529, 99534, 99539, 99544, 99549, 99554, 99559, 99564, + 99569, 99574, 99579, 99584, 99589, 99594, 99599, 99604, 99609, 99614, + 99619, 99624, 99629, 99634, 99639, 99644, 99649, 99654, 99659, 99664, + 99669, 99674, 99679, 99684, 99689, 99694, 99699, 99704, 99709, 99714, + 99719, 99724, 99729, 99734, 99739, 99744, 99749, 99754, 99759, 99764, + 99769, 99774, 99779, 99784, 99789, 99794, 99799, 99804, 99809, 99814, + 99819, 99824, 99829, 99834, 99839, 99844, 99849, 99854, 99859, 99864, + 99869, 99874, 99879, 99884, 99889, 99894, 99899, 99904, 99909, 99914, + 99919, 99924, 99929, 99934, 99939, 99944, 99949, 99954, 99959, 99964, + 99969, 99974, 99979, 99984, 99989, 99994, 99999, 100004, 100009, 100014, + 100019, 100024, 100029, 100034, 100039, 100044, 100049, 100054, 100059, + 100064, 100069, 100074, 100079, 100084, 100089, 100094, 100099, 100104, + 100109, 100114, 100119, 100124, 100129, 100134, 100139, 100144, 100149, + 100154, 100159, 100164, 100169, 100174, 100179, 100184, 100189, 100194, + 100199, 100204, 100209, 100214, 100219, 100224, 100229, 100234, 100239, + 100244, 100249, 100254, 100259, 100264, 100269, 100274, 100279, 100284, + 100289, 100294, 100299, 100304, 100309, 100314, 100319, 100324, 100329, + 100334, 100339, 100344, 100349, 100354, 100359, 100364, 100369, 100374, + 100379, 100384, 100389, 100394, 100399, 100404, 100409, 100414, 100419, + 100424, 100429, 100434, 100439, 100444, 100449, 100454, 100459, 100464, + 100469, 100474, 100479, 100484, 100489, 100494, 100499, 100504, 100509, + 100514, 100519, 100524, 100529, 100534, 100539, 100544, 100549, 100554, + 100559, 100564, 100569, 100574, 100579, 100584, 100589, 100594, 100599, + 100604, 100609, 100614, 100619, 100624, 100629, 100634, 100639, 100644, + 100649, 100654, 100659, 100664, 100669, 100674, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 100679, 100685, 100692, 100699, 100705, 100712, 100719, 100726, + 100733, 100739, 100746, 100753, 100760, 100767, 100774, 100781, 100788, + 100795, 100802, 100809, 100816, 100823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100830, 100835, 100840, 100845, 100850, 100855, 100860, 100865, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100870, + 100874, 100878, 100882, 100886, 100890, 0, 0, 100895, 0, 100900, 100904, + 100909, 100914, 100919, 100924, 100928, 100933, 100938, 100943, 100948, + 100952, 100957, 100962, 100967, 100972, 100976, 100981, 100986, 100991, + 100996, 101000, 101005, 101010, 101015, 101020, 101024, 101029, 101034, + 101039, 101044, 101048, 101053, 101058, 101063, 101068, 101072, 101077, + 101082, 101086, 101091, 101096, 101101, 101106, 0, 101111, 101116, 0, 0, + 0, 101121, 0, 0, 101126, 101131, 101138, 101145, 101152, 101159, 101166, + 101173, 101180, 101187, 101194, 101201, 101208, 101215, 101222, 101229, + 101236, 101243, 101250, 101257, 101264, 101271, 101278, 0, 101285, + 101292, 101298, 101304, 101310, 101317, 101324, 101332, 101339, 101347, + 101352, 101357, 101362, 101367, 101372, 101377, 101382, 101387, 101392, + 101397, 101402, 101407, 101412, 101418, 101423, 101428, 101433, 101438, + 101443, 101448, 101453, 101458, 101463, 101469, 101475, 101479, 101483, + 101487, 101491, 101495, 101500, 101505, 101511, 101516, 101522, 101527, + 101532, 101537, 101543, 101548, 101553, 101558, 101563, 101568, 101574, + 101579, 101585, 101590, 101596, 101601, 101607, 101612, 101618, 101623, + 101628, 101633, 101638, 101643, 101648, 101653, 101659, 101664, 0, 0, 0, + 0, 0, 0, 0, 0, 101669, 101673, 101677, 101681, 101685, 101691, 101695, + 101700, 101705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 101704, 101709, 101714, 101719, 101724, 101729, 101734, - 101739, 101744, 101749, 101754, 101759, 101764, 101769, 101774, 101779, - 101784, 101789, 101794, 0, 101799, 101804, 0, 0, 0, 0, 0, 101809, 101813, - 101817, 101822, 101827, 101833, 101838, 101843, 101848, 101853, 101858, - 101863, 101868, 101873, 101878, 101883, 101888, 101893, 101898, 101903, - 101908, 101913, 101918, 101923, 101928, 101933, 101938, 101943, 101947, - 101952, 101957, 101963, 101967, 0, 0, 0, 101971, 101977, 101981, 101986, - 101991, 101996, 102000, 102005, 102009, 102014, 102019, 102023, 102028, - 102033, 102037, 102041, 102046, 102051, 102055, 102060, 102065, 102070, - 102075, 102080, 102085, 102090, 102095, 0, 0, 0, 0, 0, 102100, 0, 0, 0, + 0, 0, 0, 0, 0, 101711, 101716, 101721, 101726, 101731, 101736, 101741, + 101746, 101751, 101756, 101761, 101766, 101771, 101776, 101781, 101786, + 101791, 101796, 101801, 0, 101806, 101811, 0, 0, 0, 0, 0, 101816, 101820, + 101824, 101829, 101834, 101840, 101845, 101850, 101855, 101860, 101865, + 101870, 101875, 101880, 101885, 101890, 101895, 101900, 101905, 101910, + 101915, 101920, 101925, 101930, 101935, 101940, 101945, 101950, 101954, + 101959, 101964, 101970, 101974, 0, 0, 0, 101978, 101984, 101988, 101993, + 101998, 102003, 102007, 102012, 102016, 102021, 102026, 102030, 102035, + 102040, 102044, 102048, 102053, 102058, 102062, 102067, 102072, 102077, + 102082, 102087, 102092, 102097, 102102, 0, 0, 0, 0, 0, 102107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102105, 102110, 102115, 102120, - 102125, 102130, 102136, 102142, 102148, 102153, 102158, 102163, 102169, - 102175, 102181, 102186, 102192, 102197, 102203, 102209, 102214, 102220, - 102226, 102231, 102237, 102242, 102248, 102254, 102260, 102265, 102271, - 102277, 102283, 102288, 102293, 102298, 102303, 102308, 102314, 102320, - 102325, 102330, 102335, 102341, 102346, 102351, 102357, 102363, 102368, - 102375, 102381, 102386, 102392, 102397, 102403, 102408, 0, 0, 0, 0, - 102414, 102422, 102429, 102436, 102443, 102448, 102453, 102458, 102463, - 102468, 102473, 102478, 102483, 102488, 102494, 102500, 102506, 102512, - 102518, 102524, 0, 0, 102530, 102537, 102544, 102551, 102559, 102567, - 102575, 102583, 102591, 102599, 102605, 102611, 102617, 102624, 102631, - 102638, 102645, 102652, 102659, 102666, 102673, 102680, 102687, 102694, - 102701, 102708, 102715, 102722, 102730, 102738, 102746, 102755, 102764, - 102773, 102782, 102791, 102800, 102807, 102814, 102821, 102829, 102837, - 102845, 102853, 102861, 102869, 102877, 102881, 102886, 102891, 0, - 102897, 102902, 0, 0, 0, 0, 0, 102907, 102913, 102920, 102925, 102930, - 102934, 102939, 102944, 0, 102949, 102954, 102959, 0, 102964, 102969, - 102974, 102979, 102984, 102989, 102994, 102998, 103003, 103008, 103013, - 103017, 103021, 103026, 103031, 103036, 103040, 103044, 103048, 103052, - 103057, 103062, 103067, 103071, 103076, 103080, 103085, 103090, 103095, - 0, 0, 103100, 103106, 103111, 0, 0, 0, 0, 103116, 103120, 103124, 103128, - 103132, 103136, 103141, 103146, 103152, 103157, 0, 0, 0, 0, 0, 0, 0, - 103163, 103169, 103176, 103182, 103189, 103195, 103201, 103207, 103214, - 0, 0, 0, 0, 0, 0, 0, 103220, 103228, 103236, 103244, 103252, 103260, - 103268, 103276, 103284, 103292, 103300, 103308, 103316, 103324, 103332, - 103340, 103348, 103356, 103364, 103372, 103380, 103388, 103396, 103404, - 103412, 103420, 103428, 103436, 103444, 103452, 103459, 103467, 103475, - 103482, 103489, 103496, 103503, 103510, 103517, 103524, 103531, 103538, - 103545, 103552, 103559, 103566, 103573, 103580, 103587, 103594, 103601, - 103608, 103615, 103622, 103629, 103636, 103643, 103650, 103657, 103664, - 103671, 103678, 103684, 103691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103698, 103703, - 103708, 103713, 103718, 103723, 103728, 103733, 103738, 103743, 103748, - 103753, 103758, 103763, 103768, 103773, 103778, 103783, 103788, 103793, - 103798, 103803, 103808, 103813, 103818, 103823, 103828, 103833, 103838, - 103843, 103848, 103853, 103858, 103863, 103868, 103873, 103878, 103883, - 103889, 0, 0, 0, 0, 103895, 103899, 103903, 103908, 103913, 103919, - 103925, 103931, 103941, 103950, 103956, 103963, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 103971, 103975, 103980, 103985, 103990, 103995, 104000, 104005, - 104010, 104014, 104019, 104023, 104028, 104032, 104037, 104041, 104046, - 104051, 104056, 104061, 104066, 104071, 104076, 104081, 104086, 104091, - 104096, 104101, 104106, 104111, 104116, 104121, 104126, 104131, 104136, - 104141, 104146, 104151, 104156, 104161, 104166, 104171, 104176, 104181, - 104186, 104191, 104196, 104201, 104206, 104211, 104216, 104221, 104226, - 104231, 0, 0, 0, 104236, 104241, 104251, 104260, 104270, 104280, 104291, - 104302, 104309, 104316, 104323, 104330, 104337, 104344, 104351, 104358, - 104365, 104372, 104379, 104386, 104393, 104400, 104407, 104414, 104421, - 104428, 104435, 104442, 104449, 0, 0, 104456, 104462, 104468, 104474, - 104480, 104487, 104494, 104502, 104509, 104516, 104523, 104530, 104537, - 104544, 104551, 104558, 104565, 104572, 104579, 104586, 104593, 104600, - 104607, 104614, 104621, 104628, 104635, 0, 0, 0, 0, 0, 104642, 104648, - 104654, 104660, 104666, 104673, 104680, 104688, 104695, 104702, 104709, - 104716, 104723, 104730, 104737, 104744, 104751, 104758, 104765, 104772, - 104779, 104786, 104793, 104800, 104807, 104814, 0, 0, 0, 0, 0, 0, 0, - 104821, 104828, 104836, 104847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 104858, 104864, 104870, 104876, 104882, 104889, 104896, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102112, 102117, 102122, 102127, + 102132, 102137, 102143, 102149, 102155, 102160, 102165, 102170, 102176, + 102182, 102188, 102193, 102199, 102204, 102210, 102216, 102221, 102227, + 102233, 102238, 102244, 102249, 102255, 102261, 102267, 102272, 102278, + 102284, 102290, 102295, 102300, 102305, 102310, 102315, 102321, 102327, + 102332, 102337, 102342, 102348, 102353, 102358, 102364, 102370, 102375, + 102382, 102388, 102393, 102399, 102404, 102410, 102415, 0, 0, 0, 0, + 102421, 102429, 102436, 102443, 102450, 102455, 102460, 102465, 102470, + 102475, 102480, 102485, 102490, 102495, 102501, 102507, 102513, 102519, + 102525, 102531, 0, 0, 102537, 102544, 102551, 102558, 102566, 102574, + 102582, 102590, 102598, 102606, 102612, 102618, 102624, 102631, 102638, + 102645, 102652, 102659, 102666, 102673, 102680, 102687, 102694, 102701, + 102708, 102715, 102722, 102729, 102737, 102745, 102753, 102762, 102771, + 102780, 102789, 102798, 102807, 102814, 102821, 102828, 102836, 102844, + 102852, 102860, 102868, 102876, 102884, 102888, 102893, 102898, 0, + 102904, 102909, 0, 0, 0, 0, 0, 102914, 102920, 102927, 102932, 102937, + 102941, 102946, 102951, 0, 102956, 102961, 102966, 0, 102971, 102976, + 102981, 102986, 102991, 102996, 103001, 103005, 103010, 103015, 103020, + 103024, 103028, 103033, 103038, 103043, 103047, 103051, 103055, 103059, + 103064, 103069, 103074, 103078, 103083, 103087, 103092, 103097, 103102, + 0, 0, 103107, 103113, 103118, 0, 0, 0, 0, 103123, 103127, 103131, 103135, + 103139, 103143, 103148, 103153, 103159, 103164, 0, 0, 0, 0, 0, 0, 0, + 103170, 103176, 103183, 103189, 103196, 103202, 103208, 103214, 103221, + 0, 0, 0, 0, 0, 0, 0, 103227, 103235, 103243, 103251, 103259, 103267, + 103275, 103283, 103291, 103299, 103307, 103315, 103323, 103331, 103339, + 103347, 103355, 103363, 103371, 103379, 103387, 103395, 103403, 103411, + 103419, 103427, 103435, 103443, 103451, 103459, 103466, 103474, 103482, + 103489, 103496, 103503, 103510, 103517, 103524, 103531, 103538, 103545, + 103552, 103559, 103566, 103573, 103580, 103587, 103594, 103601, 103608, + 103615, 103622, 103629, 103636, 103643, 103650, 103657, 103664, 103671, + 103678, 103685, 103691, 103698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103705, 103710, + 103715, 103720, 103725, 103730, 103735, 103740, 103745, 103750, 103755, + 103760, 103765, 103770, 103775, 103780, 103785, 103790, 103795, 103800, + 103805, 103810, 103815, 103820, 103825, 103830, 103835, 103840, 103845, + 103850, 103855, 103860, 103865, 103870, 103875, 103880, 103885, 103890, + 103896, 0, 0, 0, 0, 103902, 103906, 103910, 103915, 103920, 103926, + 103932, 103938, 103948, 103957, 103963, 103970, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 103978, 103982, 103987, 103992, 103997, 104002, 104007, 104012, + 104017, 104021, 104026, 104030, 104035, 104039, 104044, 104048, 104053, + 104058, 104063, 104068, 104073, 104078, 104083, 104088, 104093, 104098, + 104103, 104108, 104113, 104118, 104123, 104128, 104133, 104138, 104143, + 104148, 104153, 104158, 104163, 104168, 104173, 104178, 104183, 104188, + 104193, 104198, 104203, 104208, 104213, 104218, 104223, 104228, 104233, + 104238, 0, 0, 0, 104243, 104248, 104258, 104267, 104277, 104287, 104298, + 104309, 104316, 104323, 104330, 104337, 104344, 104351, 104358, 104365, + 104372, 104379, 104386, 104393, 104400, 104407, 104414, 104421, 104428, + 104435, 104442, 104449, 104456, 0, 0, 104463, 104469, 104475, 104481, + 104487, 104494, 104501, 104509, 104516, 104523, 104530, 104537, 104544, + 104551, 104558, 104565, 104572, 104579, 104586, 104593, 104600, 104607, + 104614, 104621, 104628, 104635, 104642, 0, 0, 0, 0, 0, 104649, 104655, + 104661, 104667, 104673, 104680, 104687, 104695, 104702, 104709, 104716, + 104723, 104730, 104737, 104744, 104751, 104758, 104765, 104772, 104779, + 104786, 104793, 104800, 104807, 104814, 104821, 0, 0, 0, 0, 0, 0, 0, + 104828, 104835, 104843, 104854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 104865, 104871, 104877, 104883, 104889, 104896, 104903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 104904, 104911, 104918, 104926, 104933, 104940, 104947, 104954, - 104962, 104970, 104978, 104986, 104994, 105002, 105010, 105018, 105026, - 105034, 105042, 105050, 105058, 105066, 105074, 105082, 105090, 105098, - 105106, 105114, 105122, 105130, 105138, 105146, 105154, 105162, 105170, - 105178, 105186, 105194, 105202, 105210, 105218, 105226, 105234, 105242, - 105250, 105258, 105266, 105274, 105282, 105290, 105298, 105306, 105314, - 105322, 105330, 105338, 105346, 105354, 105362, 105370, 105378, 105386, - 105394, 105402, 105410, 105418, 105426, 105434, 105442, 105450, 105458, - 105466, 105474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 104911, 104918, 104925, 104933, 104940, 104947, 104954, 104961, + 104969, 104977, 104985, 104993, 105001, 105009, 105017, 105025, 105033, + 105041, 105049, 105057, 105065, 105073, 105081, 105089, 105097, 105105, + 105113, 105121, 105129, 105137, 105145, 105153, 105161, 105169, 105177, + 105185, 105193, 105201, 105209, 105217, 105225, 105233, 105241, 105249, + 105257, 105265, 105273, 105281, 105289, 105297, 105305, 105313, 105321, + 105329, 105337, 105345, 105353, 105361, 105369, 105377, 105385, 105393, + 105401, 105409, 105417, 105425, 105433, 105441, 105449, 105457, 105465, + 105473, 105481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105482, 105487, 105493, 105499, - 105505, 105511, 105517, 105523, 105529, 105535, 105540, 105547, 105553, - 105559, 105565, 105571, 105577, 105582, 105588, 105594, 105600, 105606, - 105612, 105618, 105624, 105630, 105636, 105642, 105647, 105653, 105661, - 105669, 105675, 105681, 105687, 105693, 105701, 105707, 105713, 105719, - 105725, 105731, 105737, 105742, 105748, 105756, 105764, 105770, 105776, - 105782, 105789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105795, 105800, - 105806, 105812, 105818, 105824, 105830, 105836, 105842, 105848, 105853, - 105860, 105866, 105872, 105878, 105884, 105890, 105895, 105901, 105907, - 105913, 105919, 105925, 105931, 105937, 105943, 105949, 105955, 105960, - 105966, 105974, 105982, 105988, 105994, 106000, 106006, 106014, 106020, - 106026, 106032, 106038, 106044, 106050, 106055, 106061, 106069, 106077, - 106083, 106089, 106095, 106102, 0, 0, 0, 0, 0, 0, 0, 106108, 106112, - 106116, 106121, 106126, 106132, 106137, 106143, 106150, 106156, 106162, - 106169, 106176, 106183, 106189, 106196, 106203, 106210, 106217, 106223, - 106230, 106237, 106243, 106250, 106256, 106263, 106269, 106275, 106281, - 106288, 106297, 106303, 106311, 106318, 106325, 106332, 106338, 106344, - 106350, 106356, 106362, 106369, 106378, 106385, 106392, 106399, 0, 0, 0, - 0, 0, 0, 0, 0, 106406, 106413, 106419, 106425, 106431, 106437, 106443, - 106449, 106455, 106461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105489, 105494, 105500, 105506, + 105512, 105518, 105524, 105530, 105536, 105542, 105547, 105554, 105560, + 105566, 105572, 105578, 105584, 105589, 105595, 105601, 105607, 105613, + 105619, 105625, 105631, 105637, 105643, 105649, 105654, 105660, 105668, + 105676, 105682, 105688, 105694, 105700, 105708, 105714, 105720, 105726, + 105732, 105738, 105744, 105749, 105755, 105763, 105771, 105777, 105783, + 105789, 105796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105802, 105807, + 105813, 105819, 105825, 105831, 105837, 105843, 105849, 105855, 105860, + 105867, 105873, 105879, 105885, 105891, 105897, 105902, 105908, 105914, + 105920, 105926, 105932, 105938, 105944, 105950, 105956, 105962, 105967, + 105973, 105981, 105989, 105995, 106001, 106007, 106013, 106021, 106027, + 106033, 106039, 106045, 106051, 106057, 106062, 106068, 106076, 106084, + 106090, 106096, 106102, 106109, 0, 0, 0, 0, 0, 0, 0, 106115, 106119, + 106123, 106128, 106133, 106139, 106144, 106150, 106157, 106163, 106169, + 106176, 106183, 106190, 106196, 106203, 106210, 106217, 106224, 106230, + 106237, 106244, 106250, 106257, 106263, 106270, 106276, 106282, 106288, + 106295, 106304, 106310, 106318, 106325, 106332, 106339, 106345, 106351, + 106357, 106363, 106369, 106376, 106385, 106392, 106399, 106406, 0, 0, 0, + 0, 0, 0, 0, 0, 106413, 106420, 106426, 106432, 106438, 106444, 106450, + 106456, 106462, 106468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 106467, 106471, 106475, 106479, 106483, 106487, 106491, - 106495, 106499, 106503, 106508, 106513, 106518, 106523, 106528, 106533, - 106538, 106543, 106548, 106554, 106560, 106566, 106573, 106580, 106587, - 106594, 106601, 106608, 106614, 106620, 106626, 0, 106632, 106638, - 106645, 106651, 106658, 106664, 106670, 106677, 106683, 106689, 106695, - 106701, 106707, 106713, 106719, 106725, 106732, 106743, 106749, 106755, - 106763, 106769, 106775, 106782, 106793, 106799, 106805, 106811, 106818, - 106829, 106834, 106839, 106844, 106849, 106854, 106860, 106866, 106872, - 106879, 106886, 0, 0, 0, 0, 0, 0, 0, 0, 106892, 106897, 106902, 106907, - 106912, 106917, 106922, 106927, 106932, 106937, 106942, 106947, 106952, - 106957, 106962, 106967, 106972, 106977, 106982, 106987, 106992, 106997, - 107003, 107008, 107015, 107020, 107027, 107033, 107039, 107045, 107051, - 107058, 107064, 107070, 107074, 107079, 107084, 107090, 107098, 107109, - 107118, 107128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 106474, 106478, 106482, 106486, 106490, 106494, 106498, + 106502, 106506, 106510, 106515, 106520, 106525, 106530, 106535, 106540, + 106545, 106550, 106555, 106561, 106567, 106573, 106580, 106587, 106594, + 106601, 106608, 106615, 106621, 106627, 106633, 0, 106639, 106645, + 106652, 106658, 106665, 106671, 106677, 106684, 106690, 106696, 106702, + 106708, 106714, 106720, 106726, 106732, 106739, 106750, 106756, 106762, + 106770, 106776, 106782, 106789, 106800, 106806, 106812, 106818, 106825, + 106836, 106841, 106846, 106851, 106856, 106861, 106867, 106873, 106879, + 106886, 106893, 0, 0, 0, 0, 0, 0, 0, 0, 106899, 106904, 106909, 106914, + 106919, 106924, 106929, 106934, 106939, 106944, 106949, 106954, 106959, + 106964, 106969, 106974, 106979, 106984, 106989, 106994, 106999, 107004, + 107010, 107015, 107022, 107027, 107034, 107040, 107046, 107052, 107058, + 107065, 107071, 107077, 107081, 107086, 107091, 107097, 107105, 107116, + 107125, 107135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107138, 107143, - 107148, 107153, 107158, 107163, 107168, 107173, 107178, 107183, 107188, - 107193, 107198, 107203, 107208, 107213, 107218, 107223, 107228, 107233, - 107238, 107243, 107248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107253, 107257, - 107261, 107265, 107269, 107273, 107276, 107280, 107283, 107287, 107290, - 107294, 107298, 107303, 107307, 107312, 107315, 107319, 107322, 107326, - 107329, 107333, 107337, 107341, 107345, 107349, 107353, 107357, 107361, - 107365, 107369, 107373, 107377, 107381, 107385, 107388, 107392, 107396, - 107400, 107403, 107406, 107410, 107414, 107418, 107421, 107424, 107427, - 107430, 107434, 107438, 107442, 107445, 107448, 107452, 107458, 107464, - 107470, 107475, 107482, 107486, 107491, 107495, 107500, 107505, 107511, - 107516, 107522, 107526, 107531, 107535, 107540, 107543, 107546, 107550, - 107555, 107561, 107566, 107572, 0, 0, 0, 0, 107577, 107580, 107583, - 107586, 107589, 107592, 107595, 107598, 107601, 107604, 107608, 107612, - 107616, 107620, 107624, 107628, 107632, 107636, 107640, 107645, 107649, - 107653, 107656, 107659, 107662, 107665, 107668, 107671, 107674, 107677, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107680, 107684, 107689, - 107694, 107699, 107703, 107708, 107712, 107717, 107721, 107726, 107730, - 107735, 107739, 107744, 107748, 107753, 107758, 107763, 107768, 107773, - 107778, 107783, 107788, 107793, 107798, 107803, 107808, 107813, 107818, - 107823, 107828, 107832, 107837, 107842, 107847, 107851, 107855, 107860, - 107865, 107870, 107874, 107878, 107882, 107886, 107891, 107896, 107901, - 107905, 107909, 107915, 107920, 107926, 107931, 107937, 107942, 107948, - 107953, 107959, 107964, 107969, 107974, 107979, 107983, 107988, 107994, - 107998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108003, 0, 0, 108008, 108015, - 108022, 108029, 108036, 108043, 108050, 108057, 108064, 108071, 108078, - 108085, 108092, 108099, 108106, 108113, 108120, 108127, 108134, 108141, - 108148, 108155, 108162, 108169, 108176, 0, 0, 0, 0, 0, 0, 0, 108183, - 108190, 108196, 108202, 108208, 108214, 108220, 108226, 108232, 108238, - 0, 0, 0, 0, 0, 0, 108244, 108249, 108254, 108259, 108264, 108268, 108272, - 108276, 108281, 108286, 108291, 108296, 108301, 108306, 108311, 108316, - 108321, 108326, 108331, 108336, 108341, 108346, 108351, 108356, 108361, - 108366, 108371, 108376, 108381, 108386, 108391, 108396, 108401, 108406, - 108411, 108416, 108421, 108426, 108431, 108436, 108441, 108446, 108452, - 108457, 108463, 108468, 108474, 108479, 108485, 108491, 108495, 108500, - 108504, 0, 108508, 108513, 108517, 108521, 108525, 108529, 108533, - 108537, 108541, 108545, 108549, 108554, 108558, 108563, 108568, 108573, - 108579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108585, 108589, 108593, 108597, - 108601, 108605, 108609, 108614, 108619, 108624, 108629, 108634, 108639, - 108644, 108649, 108654, 108659, 108664, 108669, 108674, 108678, 108683, - 108688, 108693, 108697, 108701, 108706, 108711, 108716, 108720, 108724, - 108728, 108733, 108737, 108741, 108746, 108751, 108756, 108761, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 108766, 108771, 108776, 108781, 108785, 108790, 108794, - 108799, 108803, 108808, 108813, 108819, 108824, 108830, 108834, 108839, - 108843, 108848, 108852, 108857, 108862, 108867, 108872, 108877, 108882, - 108887, 108892, 108897, 108902, 108907, 108912, 108917, 108922, 108926, - 108931, 108936, 108941, 108945, 108949, 108954, 108959, 108964, 108968, - 108972, 108976, 108980, 108985, 108990, 108995, 109000, 109004, 109008, - 109014, 109019, 109025, 109030, 109036, 109042, 109049, 109055, 109062, - 109067, 109073, 109078, 109084, 109089, 109094, 109099, 109104, 109108, - 109112, 109117, 109122, 109126, 109131, 109136, 109141, 109149, 0, 0, - 109154, 109159, 109163, 109167, 109171, 109175, 109179, 109183, 109187, - 109191, 109195, 109199, 109204, 109208, 109213, 109219, 0, 109225, - 109230, 109235, 109240, 109245, 109250, 109255, 109260, 109265, 109270, - 109276, 109282, 109288, 109294, 109300, 109306, 109312, 109318, 109324, - 109331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109337, 109341, 109346, 109350, - 109354, 109358, 109363, 109367, 109372, 109376, 109381, 109386, 109391, - 109396, 109401, 109406, 109411, 109416, 0, 109421, 109426, 109431, - 109436, 109441, 109446, 109451, 109455, 109460, 109465, 109470, 109475, - 109479, 109483, 109488, 109493, 109498, 109503, 109507, 109511, 109515, - 109519, 109524, 109528, 109532, 109537, 109543, 109548, 109554, 109559, - 109564, 109570, 109575, 109581, 109586, 109591, 109596, 109601, 109605, - 109610, 109616, 109621, 109627, 109632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107145, 107150, + 107155, 107160, 107165, 107170, 107175, 107180, 107185, 107190, 107195, + 107200, 107205, 107210, 107215, 107220, 107225, 107230, 107235, 107240, + 107245, 107250, 107255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107260, 107264, + 107268, 107272, 107276, 107280, 107283, 107287, 107290, 107294, 107297, + 107301, 107305, 107310, 107314, 107319, 107322, 107326, 107329, 107333, + 107336, 107340, 107344, 107348, 107352, 107356, 107360, 107364, 107368, + 107372, 107376, 107380, 107384, 107388, 107392, 107395, 107399, 107403, + 107407, 107410, 107413, 107417, 107421, 107425, 107428, 107431, 107434, + 107437, 107441, 107445, 107449, 107452, 107455, 107459, 107465, 107471, + 107477, 107482, 107489, 107493, 107498, 107502, 107507, 107512, 107518, + 107523, 107529, 107533, 107538, 107542, 107547, 107550, 107553, 107557, + 107562, 107568, 107573, 107579, 0, 0, 0, 0, 107584, 107587, 107590, + 107593, 107596, 107599, 107602, 107605, 107608, 107611, 107615, 107619, + 107623, 107627, 107631, 107635, 107639, 107643, 107647, 107652, 107656, + 107660, 107663, 107666, 107669, 107672, 107675, 107678, 107681, 107684, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107687, 107691, 107696, + 107701, 107706, 107710, 107715, 107719, 107724, 107728, 107733, 107737, + 107742, 107746, 107751, 107755, 107760, 107765, 107770, 107775, 107780, + 107785, 107790, 107795, 107800, 107805, 107810, 107815, 107820, 107825, + 107830, 107835, 107839, 107844, 107849, 107854, 107858, 107862, 107867, + 107872, 107877, 107881, 107885, 107889, 107893, 107898, 107903, 107908, + 107912, 107916, 107922, 107927, 107933, 107938, 107944, 107949, 107955, + 107960, 107966, 107971, 107976, 107981, 107986, 107990, 107995, 108001, + 108005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108010, 0, 0, 108015, 108022, + 108029, 108036, 108043, 108050, 108057, 108064, 108071, 108078, 108085, + 108092, 108099, 108106, 108113, 108120, 108127, 108134, 108141, 108148, + 108155, 108162, 108169, 108176, 108183, 0, 0, 0, 0, 0, 0, 0, 108190, + 108197, 108203, 108209, 108215, 108221, 108227, 108233, 108239, 108245, + 0, 0, 0, 0, 0, 0, 108251, 108256, 108261, 108266, 108271, 108275, 108279, + 108283, 108288, 108293, 108298, 108303, 108308, 108313, 108318, 108323, + 108328, 108333, 108338, 108343, 108348, 108353, 108358, 108363, 108368, + 108373, 108378, 108383, 108388, 108393, 108398, 108403, 108408, 108413, + 108418, 108423, 108428, 108433, 108438, 108443, 108448, 108453, 108459, + 108464, 108470, 108475, 108481, 108486, 108492, 108498, 108502, 108507, + 108511, 0, 108515, 108520, 108524, 108528, 108532, 108536, 108540, + 108544, 108548, 108552, 108556, 108561, 108565, 108570, 108575, 108580, + 108586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108592, 108596, 108600, 108604, + 108608, 108612, 108616, 108621, 108626, 108631, 108636, 108641, 108646, + 108651, 108656, 108661, 108666, 108671, 108676, 108681, 108685, 108690, + 108695, 108700, 108704, 108708, 108713, 108718, 108723, 108727, 108731, + 108735, 108740, 108744, 108748, 108753, 108758, 108763, 108768, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 108773, 108778, 108783, 108788, 108792, 108797, 108801, + 108806, 108810, 108815, 108820, 108826, 108831, 108837, 108841, 108846, + 108850, 108855, 108859, 108864, 108869, 108874, 108879, 108884, 108889, + 108894, 108899, 108904, 108909, 108914, 108919, 108924, 108929, 108933, + 108938, 108943, 108948, 108952, 108956, 108961, 108966, 108971, 108975, + 108979, 108983, 108987, 108992, 108997, 109002, 109007, 109011, 109015, + 109021, 109026, 109032, 109037, 109043, 109049, 109056, 109062, 109069, + 109074, 109080, 109085, 109091, 109096, 109101, 109106, 109111, 109115, + 109119, 109124, 109129, 109133, 109138, 109143, 109148, 109156, 0, 0, + 109161, 109166, 109170, 109174, 109178, 109182, 109186, 109190, 109194, + 109198, 109202, 109206, 109211, 109215, 109220, 109226, 0, 109232, + 109237, 109242, 109247, 109252, 109257, 109262, 109267, 109272, 109277, + 109283, 109289, 109295, 109301, 109307, 109313, 109319, 109325, 109331, + 109338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109344, 109348, 109353, 109357, + 109361, 109365, 109370, 109374, 109379, 109383, 109388, 109393, 109398, + 109403, 109408, 109413, 109418, 109423, 0, 109428, 109433, 109438, + 109443, 109448, 109453, 109458, 109462, 109467, 109472, 109477, 109482, + 109486, 109490, 109495, 109500, 109505, 109510, 109514, 109518, 109522, + 109526, 109531, 109535, 109539, 109544, 109550, 109555, 109561, 109566, + 109571, 109577, 109582, 109588, 109593, 109598, 109603, 109608, 109612, + 109617, 109623, 109628, 109634, 109639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 109637, 109641, 109645, 109649, 109653, 109657, 109662, - 0, 109667, 0, 109672, 109677, 109682, 109687, 0, 109692, 109697, 109702, - 109707, 109712, 109717, 109722, 109727, 109731, 109736, 109741, 109746, - 109750, 109754, 109759, 0, 109764, 109769, 109773, 109777, 109781, - 109785, 109790, 109794, 109798, 109803, 109808, 0, 0, 0, 0, 0, 0, 109813, - 109817, 109822, 109826, 109831, 109835, 109840, 109844, 109849, 109853, - 109858, 109862, 109867, 109872, 109877, 109882, 109887, 109892, 109897, - 109902, 109907, 109912, 109917, 109922, 109927, 109932, 109937, 109942, - 109947, 109952, 109956, 109961, 109966, 109971, 109975, 109979, 109984, - 109989, 109994, 109999, 110003, 110007, 110011, 110015, 110020, 110025, - 110029, 110033, 110038, 110044, 110049, 110055, 110060, 110066, 110071, - 110077, 110082, 110088, 110093, 0, 0, 0, 0, 0, 110098, 110103, 110107, - 110111, 110115, 110119, 110123, 110127, 110131, 110135, 0, 0, 0, 0, 0, 0, - 110139, 110146, 110151, 110156, 0, 110161, 110165, 110170, 110174, - 110179, 110183, 110188, 110193, 0, 0, 110198, 110203, 0, 0, 110208, - 110213, 110218, 110222, 110227, 110232, 110237, 110242, 110247, 110252, - 110257, 110262, 110267, 110272, 110277, 110282, 110287, 110292, 110296, - 110301, 110306, 110311, 0, 110315, 110319, 110324, 110329, 110334, - 110338, 110342, 0, 110346, 110350, 0, 110355, 110360, 110365, 110370, - 110374, 0, 110378, 110382, 110387, 110392, 110398, 110403, 110409, - 110414, 110420, 110426, 0, 0, 110433, 110439, 0, 0, 110445, 110451, - 110457, 0, 0, 110462, 0, 0, 0, 0, 0, 0, 110466, 0, 0, 0, 0, 0, 110473, - 110478, 110485, 110493, 110499, 110505, 110511, 0, 0, 110518, 110524, - 110529, 110534, 110539, 110544, 110549, 0, 0, 0, 110554, 110559, 110564, - 110569, 110575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110580, 110584, 110589, - 110593, 110598, 110602, 110607, 110612, 110618, 110623, 110629, 110633, - 110638, 110642, 110647, 110651, 110656, 110661, 110666, 110671, 110676, - 110681, 110686, 110691, 110696, 110701, 110706, 110711, 110716, 110721, - 110726, 110731, 110735, 110740, 110745, 110750, 110754, 110759, 110763, - 110768, 110773, 110778, 110782, 110787, 110791, 110795, 110800, 110804, - 110809, 110814, 110819, 110824, 110828, 110832, 110838, 110843, 110849, - 110854, 110860, 110866, 110873, 110879, 110886, 110891, 110897, 110902, - 110908, 110913, 110918, 110923, 110928, 110933, 110938, 110944, 110948, - 110952, 110956, 110961, 110965, 110971, 110976, 110981, 110985, 110989, - 110993, 110997, 111001, 111005, 111009, 111013, 0, 111017, 0, 111022, - 111027, 111032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111039, 111043, 111047, 111052, - 111056, 111061, 111065, 111070, 111075, 111081, 111086, 111092, 111096, - 111101, 111105, 111110, 111114, 111119, 111124, 111129, 111134, 111139, - 111144, 111149, 111154, 111159, 111164, 111169, 111174, 111179, 111184, - 111188, 111193, 111198, 111203, 111207, 111211, 111216, 111221, 111226, - 111230, 111234, 111238, 111242, 111247, 111252, 111257, 111261, 111265, - 111271, 111276, 111282, 111287, 111293, 111299, 111306, 111312, 111319, - 111324, 111331, 111337, 111342, 111349, 111355, 111360, 111365, 111370, - 111375, 111380, 111385, 111389, 111394, 0, 0, 0, 0, 0, 0, 0, 0, 111398, - 111403, 111407, 111411, 111415, 111419, 111423, 111427, 111431, 111435, + 0, 0, 0, 0, 0, 0, 109644, 109648, 109652, 109656, 109660, 109664, 109669, + 0, 109674, 0, 109679, 109684, 109689, 109694, 0, 109699, 109704, 109709, + 109714, 109719, 109724, 109729, 109734, 109738, 109743, 109748, 109753, + 109757, 109761, 109766, 0, 109771, 109776, 109780, 109784, 109788, + 109792, 109797, 109801, 109805, 109810, 109815, 0, 0, 0, 0, 0, 0, 109820, + 109824, 109829, 109833, 109838, 109842, 109847, 109851, 109856, 109860, + 109865, 109869, 109874, 109879, 109884, 109889, 109894, 109899, 109904, + 109909, 109914, 109919, 109924, 109929, 109934, 109939, 109944, 109949, + 109954, 109959, 109963, 109968, 109973, 109978, 109982, 109986, 109991, + 109996, 110001, 110006, 110010, 110014, 110018, 110022, 110027, 110032, + 110036, 110040, 110045, 110051, 110056, 110062, 110067, 110073, 110078, + 110084, 110089, 110095, 110100, 0, 0, 0, 0, 0, 110105, 110110, 110114, + 110118, 110122, 110126, 110130, 110134, 110138, 110142, 0, 0, 0, 0, 0, 0, + 110146, 110153, 110158, 110163, 0, 110168, 110172, 110177, 110181, + 110186, 110190, 110195, 110200, 0, 0, 110205, 110210, 0, 0, 110215, + 110220, 110225, 110229, 110234, 110239, 110244, 110249, 110254, 110259, + 110264, 110269, 110274, 110279, 110284, 110289, 110294, 110299, 110303, + 110308, 110313, 110318, 0, 110322, 110326, 110331, 110336, 110341, + 110345, 110349, 0, 110353, 110357, 0, 110362, 110367, 110372, 110377, + 110381, 0, 110385, 110389, 110394, 110399, 110405, 110410, 110416, + 110421, 110427, 110433, 0, 0, 110440, 110446, 0, 0, 110452, 110458, + 110464, 0, 0, 110469, 0, 0, 0, 0, 0, 0, 110473, 0, 0, 0, 0, 0, 110480, + 110485, 110492, 110500, 110506, 110512, 110518, 0, 0, 110525, 110531, + 110536, 110541, 110546, 110551, 110556, 0, 0, 0, 110561, 110566, 110571, + 110576, 110582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110587, 110591, 110596, + 110600, 110605, 110609, 110614, 110619, 110625, 110630, 110636, 110640, + 110645, 110649, 110654, 110658, 110663, 110668, 110673, 110678, 110683, + 110688, 110693, 110698, 110703, 110708, 110713, 110718, 110723, 110728, + 110733, 110738, 110742, 110747, 110752, 110757, 110761, 110766, 110770, + 110775, 110780, 110785, 110789, 110794, 110798, 110802, 110807, 110811, + 110816, 110821, 110826, 110831, 110835, 110839, 110845, 110850, 110856, + 110861, 110867, 110873, 110880, 110886, 110893, 110898, 110904, 110909, + 110915, 110920, 110925, 110930, 110935, 110940, 110945, 110951, 110955, + 110959, 110963, 110968, 110972, 110978, 110983, 110988, 110992, 110996, + 111000, 111004, 111008, 111012, 111016, 111020, 0, 111024, 0, 111029, + 111034, 111039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111046, 111050, 111054, 111059, + 111063, 111068, 111072, 111077, 111082, 111088, 111093, 111099, 111103, + 111108, 111112, 111117, 111121, 111126, 111131, 111136, 111141, 111146, + 111151, 111156, 111161, 111166, 111171, 111176, 111181, 111186, 111191, + 111195, 111200, 111205, 111210, 111214, 111218, 111223, 111228, 111233, + 111237, 111241, 111245, 111249, 111254, 111259, 111264, 111268, 111272, + 111278, 111283, 111289, 111294, 111300, 111306, 111313, 111319, 111326, + 111331, 111338, 111344, 111349, 111356, 111362, 111367, 111372, 111377, + 111382, 111387, 111392, 111396, 111401, 0, 0, 0, 0, 0, 0, 0, 0, 111405, + 111410, 111414, 111418, 111422, 111426, 111430, 111434, 111438, 111442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111439, 111443, 111448, 111452, - 111457, 111461, 111466, 111471, 111477, 111482, 111488, 111492, 111497, - 111501, 111506, 111510, 111515, 111520, 111525, 111530, 111535, 111540, - 111545, 111550, 111555, 111560, 111565, 111570, 111575, 111580, 111584, - 111589, 111594, 111599, 111603, 111607, 111612, 111617, 111622, 111626, - 111630, 111634, 111638, 111643, 111648, 111653, 111657, 111661, 111667, - 111672, 111678, 111683, 111689, 111695, 0, 0, 111702, 111707, 111713, - 111718, 111724, 111729, 111734, 111739, 111744, 111749, 111754, 111758, - 111763, 111769, 111774, 111780, 111786, 111792, 111800, 111813, 111826, - 111839, 111853, 111868, 111876, 111887, 111896, 111906, 111916, 111926, - 111937, 111949, 111962, 111970, 111978, 111987, 111993, 112000, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111446, 111450, 111455, 111459, + 111464, 111468, 111473, 111478, 111484, 111489, 111495, 111499, 111504, + 111508, 111513, 111517, 111522, 111527, 111532, 111537, 111542, 111547, + 111552, 111557, 111562, 111567, 111572, 111577, 111582, 111587, 111591, + 111596, 111601, 111606, 111610, 111614, 111619, 111624, 111629, 111633, + 111637, 111641, 111645, 111650, 111655, 111660, 111664, 111668, 111674, + 111679, 111685, 111690, 111696, 111702, 0, 0, 111709, 111714, 111720, + 111725, 111731, 111736, 111741, 111746, 111751, 111756, 111761, 111765, + 111770, 111776, 111781, 111787, 111793, 111799, 111807, 111820, 111833, + 111846, 111860, 111875, 111883, 111894, 111903, 111913, 111923, 111933, + 111944, 111956, 111969, 111977, 111985, 111994, 112000, 112007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 112008, 112012, 112017, 112021, 112026, 112030, - 112035, 112040, 112046, 112051, 112057, 112061, 112066, 112070, 112075, - 112079, 112084, 112089, 112094, 112099, 112104, 112109, 112114, 112119, - 112124, 112129, 112134, 112139, 112144, 112149, 112153, 112158, 112163, - 112168, 112172, 112176, 112181, 112186, 112191, 112195, 112199, 112203, - 112207, 112212, 112217, 112222, 112226, 112230, 112235, 112241, 112246, - 112252, 112257, 112263, 112269, 112276, 112282, 112289, 112294, 112300, - 112305, 112311, 112316, 112321, 112326, 112331, 112335, 112340, 112345, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112350, 112355, 112359, 112363, 112367, - 112371, 112375, 112379, 112383, 112387, 0, 0, 0, 0, 0, 0, 112391, 112397, - 112402, 112409, 112417, 112424, 112432, 112441, 112446, 112455, 112460, - 112468, 112477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 112487, 112491, 112496, 112500, 112505, 112509, 112514, 112518, 112523, - 112527, 112532, 112536, 112541, 112546, 112551, 112556, 112561, 112566, - 112571, 112576, 112581, 112586, 112591, 112596, 112601, 112606, 112610, - 112615, 112620, 112625, 112629, 112633, 112638, 112643, 112648, 112652, - 112656, 112660, 112664, 112669, 112674, 112678, 112682, 112687, 112692, - 112697, 112703, 112708, 112714, 112719, 112725, 112730, 112736, 112741, - 112747, 112752, 112757, 0, 0, 0, 0, 0, 0, 0, 112764, 112769, 112773, - 112777, 112781, 112785, 112789, 112793, 112797, 112801, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 112015, 112019, 112024, 112028, 112033, 112037, + 112042, 112047, 112053, 112058, 112064, 112068, 112073, 112077, 112082, + 112086, 112091, 112096, 112101, 112106, 112111, 112116, 112121, 112126, + 112131, 112136, 112141, 112146, 112151, 112156, 112160, 112165, 112170, + 112175, 112179, 112183, 112188, 112193, 112198, 112202, 112206, 112210, + 112214, 112219, 112224, 112229, 112233, 112237, 112242, 112248, 112253, + 112259, 112264, 112270, 112276, 112283, 112289, 112296, 112301, 112307, + 112312, 112318, 112323, 112328, 112333, 112338, 112342, 112347, 112352, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112357, 112362, 112366, 112370, 112374, + 112378, 112382, 112386, 112390, 112394, 0, 0, 0, 0, 0, 0, 112398, 112404, + 112409, 112416, 112424, 112431, 112439, 112448, 112453, 112462, 112467, + 112475, 112484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112494, 112498, 112503, 112507, 112512, 112516, 112521, 112525, 112530, + 112534, 112539, 112543, 112548, 112553, 112558, 112563, 112568, 112573, + 112578, 112583, 112588, 112593, 112598, 112603, 112608, 112613, 112617, + 112622, 112627, 112632, 112636, 112640, 112645, 112650, 112655, 112659, + 112663, 112667, 112671, 112676, 112681, 112685, 112689, 112694, 112699, + 112704, 112710, 112715, 112721, 112726, 112732, 112737, 112743, 112748, + 112754, 112759, 112764, 0, 0, 0, 0, 0, 0, 0, 112771, 112776, 112780, + 112784, 112788, 112792, 112796, 112800, 112804, 112808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 112805, 112809, 112814, 112819, 112823, 112827, 112833, 112837, 112842, - 112847, 112851, 112856, 112861, 112866, 112870, 112874, 112878, 112883, - 112887, 112891, 112896, 112901, 112906, 112913, 112918, 112923, 112928, - 0, 0, 112935, 112942, 112949, 112958, 112963, 112969, 112974, 112980, - 112985, 112991, 112996, 113002, 113007, 113013, 113019, 0, 0, 0, 0, - 113024, 113029, 113033, 113037, 113041, 113045, 113049, 113053, 113057, - 113061, 113065, 113070, 113075, 113081, 113086, 113091, 0, 0, 0, 0, 0, 0, + 112812, 112816, 112821, 112826, 112830, 112834, 112840, 112844, 112849, + 112854, 112858, 112863, 112868, 112873, 112877, 112881, 112885, 112890, + 112894, 112898, 112903, 112908, 112913, 112920, 112925, 112930, 112935, + 0, 0, 112942, 112949, 112956, 112965, 112970, 112976, 112981, 112987, + 112992, 112998, 113003, 113009, 113014, 113020, 113026, 0, 0, 0, 0, + 113031, 113036, 113040, 113044, 113048, 113052, 113056, 113060, 113064, + 113068, 113072, 113077, 113082, 113088, 113093, 113098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113096, 113100, 113105, 113109, 113114, - 113118, 113123, 113127, 113132, 113136, 113141, 113145, 113150, 113155, - 113160, 113165, 113170, 113175, 113180, 113185, 113190, 113195, 113200, - 113205, 113210, 113215, 113219, 113224, 113229, 113234, 113238, 113242, - 113247, 113252, 113257, 113261, 113265, 113269, 113273, 113278, 113283, - 113288, 113292, 113296, 113301, 113307, 113312, 113318, 113323, 113329, - 113335, 113342, 113347, 113353, 113358, 113364, 113369, 113374, 113379, - 113384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113103, 113107, 113112, 113116, 113121, + 113125, 113130, 113134, 113139, 113143, 113148, 113152, 113157, 113162, + 113167, 113172, 113177, 113182, 113187, 113192, 113197, 113202, 113207, + 113212, 113217, 113222, 113226, 113231, 113236, 113241, 113245, 113249, + 113254, 113259, 113264, 113268, 113272, 113276, 113280, 113285, 113290, + 113295, 113299, 113303, 113308, 113314, 113319, 113325, 113330, 113336, + 113342, 113349, 113354, 113360, 113365, 113371, 113376, 113381, 113386, + 113391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 113389, 113397, 113404, 113412, 113420, 113427, 113435, - 113443, 113451, 113458, 113465, 113473, 113481, 113489, 113497, 113505, - 113513, 113521, 113529, 113537, 113545, 113553, 113561, 113569, 113577, - 113585, 113593, 113601, 113609, 113617, 113625, 113633, 113641, 113649, - 113656, 113664, 113672, 113679, 113687, 113695, 113703, 113710, 113717, - 113725, 113733, 113741, 113749, 113757, 113765, 113773, 113781, 113789, - 113797, 113805, 113813, 113821, 113829, 113837, 113845, 113853, 113861, - 113869, 113877, 113885, 113893, 113900, 113906, 113912, 113918, 113924, - 113930, 113936, 113942, 113948, 113954, 113961, 113968, 113975, 113982, - 113989, 113996, 114003, 114010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 114017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114023, 114027, 114032, 114036, 114041, - 114045, 114050, 114055, 0, 0, 114061, 114065, 114070, 114074, 114079, - 114083, 114088, 114093, 114098, 114103, 114108, 114113, 114118, 114123, - 114128, 114133, 114138, 114143, 114148, 114153, 114157, 114162, 114167, - 114172, 114176, 114180, 114185, 114190, 114195, 114199, 114203, 114207, - 114211, 114216, 114221, 114226, 114230, 114234, 114239, 114244, 114250, - 114255, 114261, 114266, 114272, 114278, 0, 0, 114285, 114290, 114296, - 114301, 114307, 114312, 114317, 114322, 114327, 114332, 114336, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 113396, 113404, 113411, 113419, 113427, 113434, 113442, + 113450, 113458, 113465, 113472, 113480, 113488, 113496, 113504, 113512, + 113520, 113528, 113536, 113544, 113552, 113560, 113568, 113576, 113584, + 113592, 113600, 113608, 113616, 113624, 113632, 113640, 113648, 113656, + 113663, 113671, 113679, 113686, 113694, 113702, 113710, 113717, 113724, + 113732, 113740, 113748, 113756, 113764, 113772, 113780, 113788, 113796, + 113804, 113812, 113820, 113828, 113836, 113844, 113852, 113860, 113868, + 113876, 113884, 113892, 113900, 113907, 113913, 113919, 113925, 113931, + 113937, 113943, 113949, 113955, 113961, 113968, 113975, 113982, 113989, + 113996, 114003, 114010, 114017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 114024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114030, 114034, 114039, 114043, 114048, + 114052, 114057, 114062, 0, 0, 114068, 114072, 114077, 114081, 114086, + 114090, 114095, 114100, 114105, 114110, 114115, 114120, 114125, 114130, + 114135, 114140, 114145, 114150, 114155, 114160, 114164, 114169, 114174, + 114179, 114183, 114187, 114192, 114197, 114202, 114206, 114210, 114214, + 114218, 114223, 114228, 114233, 114237, 114241, 114246, 114251, 114257, + 114262, 114268, 114273, 114279, 114285, 0, 0, 114292, 114297, 114303, + 114308, 114314, 114319, 114324, 114329, 114334, 114339, 114343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 114343, 114348, 114354, 114361, 114367, 114373, 114380, 114386, 114393, - 114400, 114408, 114415, 114420, 114426, 114432, 114438, 114444, 114450, - 114456, 114462, 114468, 114474, 114480, 114486, 114492, 114498, 114503, - 114509, 114515, 114521, 114526, 114531, 114537, 114543, 114549, 114554, - 114560, 114566, 114572, 114578, 114584, 114590, 114596, 114601, 114606, - 114611, 114617, 114623, 114629, 114634, 114639, 114645, 114651, 114657, - 114663, 114672, 114681, 114687, 114693, 114700, 114707, 114714, 114721, - 114729, 114736, 114744, 114750, 114756, 114763, 114770, 114779, 114789, - 0, 0, 0, 0, 0, 0, 0, 0, 114794, 114798, 114803, 114809, 114814, 114819, - 114824, 114830, 114836, 114842, 114848, 114854, 114860, 114864, 114869, - 114874, 114879, 114884, 114889, 114894, 114899, 114904, 114909, 114914, - 114919, 114924, 114929, 114934, 114938, 114943, 114948, 114953, 114957, - 114961, 114966, 114971, 114976, 114980, 114985, 114990, 114995, 115000, - 115005, 115010, 115014, 115018, 115022, 115027, 115032, 115037, 115041, - 115045, 115050, 115055, 115060, 115066, 115072, 115079, 115085, 115092, - 115099, 115106, 115113, 115120, 115127, 115134, 115140, 115146, 115153, - 115160, 115167, 115172, 115177, 115182, 115186, 115191, 115196, 115202, - 115207, 115223, 115237, 115248, 115254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115260, 115268, - 115276, 115284, 115292, 115301, 115310, 115319, 115328, 115336, 115345, - 115354, 115362, 115371, 115380, 115388, 115397, 115405, 115414, 115422, - 115431, 115440, 115448, 115456, 115464, 115472, 115480, 115489, 115498, - 115508, 115518, 115528, 115538, 115548, 115557, 115567, 115577, 115587, - 115598, 115608, 115620, 115632, 115643, 115657, 115668, 115678, 115690, - 115701, 115711, 115723, 115735, 115746, 115757, 115767, 115777, 115789, - 115800, 0, 0, 0, 0, 0, 0, 0, 115812, 115816, 115821, 115825, 115830, - 115834, 115839, 115844, 115850, 0, 115855, 115859, 115864, 115868, - 115873, 115877, 115882, 115887, 115892, 115897, 115902, 115907, 115912, - 115917, 115922, 115927, 115932, 115937, 115942, 115947, 115951, 115956, - 115961, 115966, 115970, 115974, 115979, 115984, 115989, 115993, 115997, - 116001, 116005, 116010, 116015, 116020, 116024, 116028, 116034, 116039, - 116045, 116050, 116056, 116062, 116069, 0, 116075, 116080, 116086, - 116091, 116097, 116102, 116107, 116112, 116117, 116122, 116126, 116131, - 116137, 116143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116149, 116154, 116158, - 116162, 116166, 116170, 116174, 116178, 116182, 116186, 116190, 116194, - 116198, 116202, 116206, 116210, 116214, 116218, 116222, 116226, 116231, - 116236, 116241, 116246, 116251, 116256, 116261, 116266, 116271, 0, 0, 0, - 116278, 116283, 116288, 116292, 116297, 116302, 116307, 116312, 116317, - 116322, 116327, 116331, 116336, 116341, 116345, 116349, 116354, 116359, - 116363, 116368, 116373, 116378, 116383, 116388, 116393, 116398, 116402, - 116406, 116410, 116415, 116419, 116423, 0, 0, 116427, 116433, 116440, - 116447, 116454, 116461, 116468, 116475, 116482, 116488, 116495, 116502, - 116508, 116514, 116521, 116528, 116534, 116541, 116548, 116555, 116562, - 116569, 0, 116576, 116582, 116588, 116594, 116601, 116607, 116613, - 116619, 116625, 116630, 116635, 116640, 116645, 116650, 0, 0, 0, 0, 0, 0, + 114350, 114355, 114361, 114368, 114374, 114380, 114387, 114393, 114400, + 114407, 114415, 114422, 114427, 114433, 114439, 114445, 114451, 114457, + 114463, 114469, 114475, 114481, 114487, 114493, 114499, 114505, 114510, + 114516, 114522, 114528, 114533, 114538, 114544, 114550, 114556, 114561, + 114567, 114573, 114579, 114585, 114591, 114597, 114603, 114608, 114613, + 114618, 114624, 114630, 114636, 114641, 114646, 114652, 114658, 114664, + 114670, 114679, 114688, 114694, 114700, 114707, 114714, 114721, 114728, + 114736, 114743, 114751, 114757, 114763, 114770, 114777, 114786, 114796, + 0, 0, 0, 0, 0, 0, 0, 0, 114801, 114805, 114810, 114816, 114821, 114826, + 114831, 114837, 114843, 114849, 114855, 114861, 114867, 114871, 114876, + 114881, 114886, 114891, 114896, 114901, 114906, 114911, 114916, 114921, + 114926, 114931, 114936, 114941, 114945, 114950, 114955, 114960, 114964, + 114968, 114973, 114978, 114983, 114987, 114992, 114997, 115002, 115007, + 115012, 115017, 115021, 115025, 115029, 115034, 115039, 115044, 115048, + 115052, 115057, 115062, 115067, 115073, 115079, 115086, 115092, 115099, + 115106, 115113, 115120, 115127, 115134, 115141, 115147, 115153, 115160, + 115167, 115174, 115179, 115184, 115189, 115193, 115198, 115203, 115209, + 115214, 115230, 115244, 115255, 115261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115267, 115275, + 115283, 115291, 115299, 115308, 115317, 115326, 115335, 115343, 115352, + 115361, 115369, 115378, 115387, 115395, 115404, 115412, 115421, 115429, + 115438, 115447, 115455, 115463, 115471, 115479, 115487, 115496, 115505, + 115515, 115525, 115535, 115545, 115555, 115564, 115574, 115584, 115594, + 115605, 115615, 115627, 115639, 115650, 115664, 115675, 115685, 115697, + 115708, 115718, 115730, 115742, 115753, 115764, 115774, 115784, 115796, + 115807, 0, 0, 0, 0, 0, 0, 0, 115819, 115823, 115828, 115832, 115837, + 115841, 115846, 115851, 115857, 0, 115862, 115866, 115871, 115875, + 115880, 115884, 115889, 115894, 115899, 115904, 115909, 115914, 115919, + 115924, 115929, 115934, 115939, 115944, 115949, 115954, 115958, 115963, + 115968, 115973, 115977, 115981, 115986, 115991, 115996, 116000, 116004, + 116008, 116012, 116017, 116022, 116027, 116031, 116035, 116041, 116046, + 116052, 116057, 116063, 116069, 116076, 0, 116082, 116087, 116093, + 116098, 116104, 116109, 116114, 116119, 116124, 116129, 116133, 116138, + 116144, 116150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116156, 116161, 116165, + 116169, 116173, 116177, 116181, 116185, 116189, 116193, 116197, 116201, + 116205, 116209, 116213, 116217, 116221, 116225, 116229, 116233, 116238, + 116243, 116248, 116253, 116258, 116263, 116268, 116273, 116278, 0, 0, 0, + 116285, 116290, 116295, 116299, 116304, 116309, 116314, 116319, 116324, + 116329, 116334, 116338, 116343, 116348, 116352, 116356, 116361, 116366, + 116370, 116375, 116380, 116385, 116390, 116395, 116400, 116405, 116409, + 116413, 116417, 116422, 116426, 116430, 0, 0, 116434, 116440, 116447, + 116454, 116461, 116468, 116475, 116482, 116489, 116495, 116502, 116509, + 116515, 116521, 116528, 116535, 116541, 116548, 116555, 116562, 116569, + 116576, 0, 116583, 116589, 116595, 116601, 116608, 116614, 116620, + 116626, 116632, 116637, 116642, 116647, 116652, 116657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116655, 116660, - 116666, 116671, 116677, 116682, 116688, 0, 116693, 116699, 0, 116704, - 116710, 116715, 116721, 116727, 116733, 116739, 116745, 116751, 116757, - 116763, 116769, 116775, 116781, 116787, 116793, 116799, 116804, 116810, - 116816, 116822, 116827, 116832, 116838, 116844, 116850, 116855, 116860, - 116865, 116870, 116876, 116882, 116888, 116893, 116898, 116904, 116910, - 116916, 116922, 116929, 116935, 116942, 116948, 116955, 0, 0, 0, 116962, - 0, 116968, 116975, 0, 116981, 116988, 116994, 117000, 117006, 117012, - 117018, 117023, 117028, 0, 0, 0, 0, 0, 0, 0, 0, 117033, 117039, 117044, - 117049, 117054, 117059, 117064, 117069, 117074, 117079, 0, 0, 0, 0, 0, 0, - 117084, 117089, 117095, 117100, 117106, 117111, 0, 117117, 117123, 0, - 117129, 117135, 117141, 117146, 117152, 117158, 117164, 117169, 117174, - 117180, 117185, 117191, 117196, 117202, 117208, 117214, 117220, 117225, - 117231, 117237, 117243, 117249, 117255, 117261, 117267, 117273, 117279, - 117285, 117290, 117296, 117301, 117306, 117311, 117318, 117324, 117331, - 117337, 0, 117344, 117351, 0, 117358, 117365, 117372, 117378, 117384, - 117389, 0, 0, 0, 0, 0, 0, 0, 117394, 117400, 117405, 117410, 117415, - 117420, 117425, 117430, 117435, 117440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116662, 116667, + 116673, 116678, 116684, 116689, 116695, 0, 116700, 116706, 0, 116711, + 116717, 116722, 116728, 116734, 116740, 116746, 116752, 116758, 116764, + 116770, 116776, 116782, 116788, 116794, 116800, 116806, 116811, 116817, + 116823, 116829, 116834, 116839, 116845, 116851, 116857, 116862, 116867, + 116872, 116877, 116883, 116889, 116895, 116900, 116905, 116911, 116917, + 116923, 116929, 116936, 116942, 116949, 116955, 116962, 0, 0, 0, 116969, + 0, 116975, 116982, 0, 116988, 116995, 117001, 117007, 117013, 117019, + 117025, 117030, 117035, 0, 0, 0, 0, 0, 0, 0, 0, 117040, 117046, 117051, + 117056, 117061, 117066, 117071, 117076, 117081, 117086, 0, 0, 0, 0, 0, 0, + 117091, 117096, 117102, 117107, 117113, 117118, 0, 117124, 117130, 0, + 117136, 117142, 117148, 117153, 117159, 117165, 117171, 117176, 117181, + 117187, 117192, 117198, 117203, 117209, 117215, 117221, 117227, 117232, + 117238, 117244, 117250, 117256, 117262, 117268, 117274, 117280, 117286, + 117292, 117297, 117303, 117308, 117313, 117318, 117325, 117331, 117338, + 117344, 0, 117351, 117358, 0, 117365, 117372, 117379, 117385, 117391, + 117396, 0, 0, 0, 0, 0, 0, 0, 117401, 117407, 117412, 117417, 117422, + 117427, 117432, 117437, 117442, 117447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -21962,445 +21966,445 @@ static const unsigned int phrasebook_offset2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117445, 117449, 117454, 117459, 117463, 117468, 117472, 117476, - 117481, 117485, 117490, 117495, 117500, 117504, 117508, 117512, 117517, - 117521, 117525, 117529, 117534, 117539, 117544, 117549, 117553, 0, 0, 0, + 0, 0, 0, 117452, 117456, 117461, 117466, 117470, 117475, 117479, 117483, + 117488, 117492, 117497, 117502, 117507, 117511, 117515, 117519, 117524, + 117528, 117532, 117536, 117541, 117546, 117551, 117556, 117560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117560, - 117565, 117570, 117575, 117580, 117585, 117590, 117595, 117600, 117605, - 117610, 117615, 117620, 117625, 117630, 117635, 117640, 117645, 117650, - 117655, 117660, 117668, 117672, 117676, 117680, 117684, 117688, 117692, - 117696, 117700, 117704, 117708, 117712, 117716, 117720, 117724, 117728, - 117734, 117740, 117744, 117750, 117756, 117761, 117765, 117770, 117774, - 117778, 117784, 117790, 117794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117798, 117806, 117809, 117814, 117820, 117828, 117833, 117839, 117847, - 117853, 117859, 117863, 117867, 117874, 117883, 117890, 117899, 117905, - 117914, 117921, 117928, 117935, 117945, 117951, 117955, 117962, 117971, - 117981, 117988, 117995, 117999, 118003, 118010, 118020, 118024, 118031, - 118038, 118045, 118051, 118058, 118065, 118072, 118079, 118083, 118087, - 118091, 118098, 118102, 118109, 118116, 118130, 118139, 118143, 118147, - 118151, 118158, 118162, 118166, 118170, 118178, 118186, 118205, 118215, - 118235, 118239, 118243, 118247, 118251, 118255, 118259, 118263, 118270, - 118274, 118277, 118281, 118285, 118291, 118298, 118307, 118311, 118320, - 118329, 118337, 118341, 118348, 118352, 118356, 118360, 118364, 118375, - 118384, 118393, 118402, 118411, 118423, 118432, 118441, 118450, 118458, - 118467, 118479, 118488, 118496, 118505, 118517, 118526, 118535, 118547, - 118556, 118565, 118577, 118586, 118590, 118594, 118598, 118602, 118606, - 118610, 118614, 118621, 118625, 118629, 118640, 118644, 118648, 118655, - 118661, 118667, 118671, 118678, 118682, 118686, 118690, 118694, 118698, - 118702, 118708, 118716, 118720, 118724, 118727, 118734, 118746, 118750, - 118762, 118769, 118776, 118783, 118790, 118796, 118800, 118804, 118808, - 118812, 118819, 118828, 118835, 118843, 118851, 118857, 118861, 118865, - 118869, 118873, 118879, 118888, 118900, 118907, 118914, 118923, 118934, - 118940, 118949, 118958, 118965, 118974, 118981, 118987, 118997, 119004, - 119011, 119018, 119025, 119029, 119035, 119039, 119050, 119058, 119067, - 119079, 119086, 119093, 119103, 119110, 119119, 119126, 119135, 119142, - 119149, 119159, 119166, 119173, 119182, 119189, 119201, 119210, 119217, - 119224, 119231, 119240, 119250, 119263, 119270, 119279, 119289, 119296, - 119305, 119318, 119325, 119332, 119339, 119349, 119359, 119365, 119375, - 119382, 119389, 119399, 119405, 119412, 119419, 119426, 119436, 119443, - 119450, 119457, 119463, 119470, 119480, 119487, 119491, 119499, 119503, - 119515, 119519, 119533, 119537, 119541, 119545, 119549, 119555, 119562, - 119570, 119574, 119578, 119582, 119586, 119593, 119597, 119603, 119609, - 119617, 119621, 119628, 119636, 119640, 119644, 119650, 119654, 119663, - 119672, 119679, 119689, 119695, 119699, 119703, 119711, 119718, 119725, - 119731, 119735, 119743, 119747, 119754, 119766, 119773, 119783, 119789, - 119793, 119802, 119809, 119818, 119822, 119826, 119833, 119837, 119841, - 119845, 119849, 119852, 119858, 119864, 119868, 119872, 119879, 119886, - 119893, 119900, 119907, 119914, 119921, 119928, 119934, 119938, 119942, - 119949, 119956, 119963, 119970, 119977, 119981, 119984, 119989, 119993, - 119997, 120006, 120015, 120019, 120023, 120029, 120035, 120052, 120058, - 120062, 120071, 120075, 120079, 120086, 120094, 120102, 120108, 120112, - 120116, 120120, 120124, 120127, 120133, 120140, 120150, 120157, 120164, - 120171, 120177, 120184, 120191, 120198, 120205, 120212, 120221, 120228, - 120240, 120247, 120254, 120264, 120275, 120282, 120289, 120296, 120303, - 120310, 120317, 120324, 120331, 120338, 120345, 120355, 120365, 120375, - 120382, 120392, 120399, 120406, 120413, 120420, 120426, 120433, 120440, - 120447, 120454, 120461, 120468, 120475, 120482, 120488, 120495, 120502, - 120511, 120518, 120525, 120529, 120537, 120541, 120545, 120549, 120553, - 120557, 120564, 120568, 120577, 120581, 120588, 120596, 120600, 120604, - 120608, 120621, 120637, 120641, 120645, 120652, 120658, 120665, 120669, - 120673, 120677, 120681, 120685, 120692, 120696, 120714, 120718, 120722, - 120729, 120733, 120737, 120743, 120747, 120751, 120759, 120763, 120767, - 120770, 120774, 120780, 120791, 120800, 120809, 120816, 120823, 120834, - 120841, 120848, 120855, 120862, 120869, 120876, 120883, 120893, 120899, - 120906, 120916, 120925, 120932, 120941, 120951, 120958, 120965, 120972, - 120979, 120991, 120998, 121005, 121012, 121019, 121026, 121036, 121043, - 121050, 121060, 121073, 121085, 121092, 121102, 121109, 121116, 121123, - 121137, 121143, 121151, 121161, 121171, 121178, 121185, 121191, 121195, - 121202, 121212, 121218, 121231, 121235, 121239, 121246, 121250, 121257, - 121267, 121271, 121275, 121279, 121283, 121287, 121294, 121298, 121305, - 121312, 121319, 121328, 121337, 121347, 121354, 121361, 121368, 121378, - 121385, 121395, 121402, 121412, 121419, 121426, 121436, 121446, 121453, - 121459, 121467, 121475, 121481, 121487, 121491, 121495, 121502, 121510, - 121516, 121520, 121524, 121528, 121535, 121547, 121550, 121557, 121563, - 121567, 121571, 121575, 121579, 121583, 121587, 121591, 121595, 121599, - 121603, 121610, 121614, 121620, 121624, 121628, 121632, 121638, 121645, - 121652, 121659, 121670, 121678, 121682, 121688, 121697, 121704, 121710, - 121713, 121717, 121721, 121727, 121736, 121744, 121748, 121754, 121758, - 121762, 121766, 121772, 121779, 121785, 121789, 121795, 121799, 121803, - 121812, 121824, 121828, 121835, 121842, 121852, 121859, 121871, 121878, - 121885, 121892, 121903, 121913, 121926, 121936, 121943, 121947, 121951, - 121955, 121959, 121968, 121977, 121986, 122003, 122012, 122018, 122025, - 122033, 122046, 122050, 122059, 122068, 122077, 122086, 122097, 122106, - 122114, 122123, 122132, 122141, 122150, 122160, 122163, 122167, 122171, - 122175, 122179, 122183, 122189, 122196, 122203, 122210, 122216, 122222, - 122229, 122235, 122242, 122250, 122254, 122261, 122268, 122275, 122283, - 122286, 122290, 122294, 122298, 122301, 122307, 122311, 122317, 122324, - 122331, 122337, 122344, 122351, 122358, 122365, 122372, 122379, 122386, - 122393, 122400, 122407, 122414, 122421, 122428, 122435, 122441, 122445, - 122454, 122458, 122462, 122466, 122470, 122476, 122483, 122490, 122497, - 122504, 122511, 122517, 122525, 122529, 122533, 122537, 122541, 122547, - 122564, 122581, 122585, 122589, 122593, 122597, 122601, 122605, 122611, - 122618, 122622, 122628, 122635, 122642, 122649, 122656, 122663, 122672, - 122679, 122686, 122693, 122700, 122704, 122708, 122714, 122726, 122730, - 122734, 122743, 122747, 122751, 122755, 122761, 122765, 122769, 122778, - 122782, 122786, 122790, 122797, 122801, 122805, 122809, 122813, 122817, - 122821, 122825, 122828, 122834, 122841, 122848, 122854, 122858, 122875, - 122881, 122885, 122891, 122897, 122903, 122909, 122915, 122921, 122925, - 122929, 122933, 122939, 122943, 122949, 122953, 122957, 122964, 122971, - 122988, 122992, 122996, 123000, 123004, 123008, 123020, 123023, 123028, - 123033, 123048, 123058, 123070, 123074, 123078, 123082, 123088, 123095, - 123102, 123112, 123124, 123130, 123136, 123145, 123149, 123153, 123160, - 123170, 123177, 123183, 123187, 123191, 123198, 123204, 123208, 123214, - 123218, 123226, 123232, 123236, 123244, 123252, 123259, 123265, 123272, - 123279, 123289, 123299, 123303, 123307, 123311, 123315, 123321, 123328, - 123334, 123341, 123348, 123355, 123364, 123371, 123378, 123384, 123391, - 123398, 123405, 123412, 123419, 123426, 123432, 123439, 123446, 123453, - 123462, 123469, 123476, 123480, 123486, 123490, 123496, 123503, 123510, - 123517, 123521, 123525, 123529, 123533, 123537, 123544, 123548, 123552, - 123558, 123566, 123570, 123574, 123578, 123582, 123589, 123593, 123597, - 123605, 123609, 123613, 123617, 123621, 123627, 123631, 123635, 123641, - 123648, 123654, 123661, 123673, 123677, 123684, 123691, 123698, 123705, - 123717, 123724, 123728, 123732, 123736, 123743, 123750, 123757, 123764, - 123774, 123781, 123787, 123794, 123801, 123808, 123815, 123824, 123834, - 123841, 123845, 123852, 123856, 123860, 123864, 123871, 123878, 123888, - 123894, 123898, 123907, 123911, 123918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117567, + 117572, 117577, 117582, 117587, 117592, 117597, 117602, 117607, 117612, + 117617, 117622, 117627, 117632, 117637, 117642, 117647, 117652, 117657, + 117662, 117667, 117675, 117679, 117683, 117687, 117691, 117695, 117699, + 117703, 117707, 117711, 117715, 117719, 117723, 117727, 117731, 117735, + 117741, 117747, 117751, 117757, 117763, 117768, 117772, 117777, 117781, + 117785, 117791, 117797, 117801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117805, 117813, 117816, 117821, 117827, 117835, 117840, 117846, 117854, + 117860, 117866, 117870, 117874, 117881, 117890, 117897, 117906, 117912, + 117921, 117928, 117935, 117942, 117952, 117958, 117962, 117969, 117978, + 117988, 117995, 118002, 118006, 118010, 118017, 118027, 118031, 118038, + 118045, 118052, 118058, 118065, 118072, 118079, 118086, 118090, 118094, + 118098, 118105, 118109, 118116, 118123, 118137, 118146, 118150, 118154, + 118158, 118165, 118169, 118173, 118177, 118185, 118193, 118212, 118222, + 118242, 118246, 118250, 118254, 118258, 118262, 118266, 118270, 118277, + 118281, 118284, 118288, 118292, 118298, 118305, 118314, 118318, 118327, + 118336, 118344, 118348, 118355, 118359, 118363, 118367, 118371, 118382, + 118391, 118400, 118409, 118418, 118430, 118439, 118448, 118457, 118465, + 118474, 118486, 118495, 118503, 118512, 118524, 118533, 118542, 118554, + 118563, 118572, 118584, 118593, 118597, 118601, 118605, 118609, 118613, + 118617, 118621, 118628, 118632, 118636, 118647, 118651, 118655, 118662, + 118668, 118674, 118678, 118685, 118689, 118693, 118697, 118701, 118705, + 118709, 118715, 118723, 118727, 118731, 118734, 118741, 118753, 118757, + 118769, 118776, 118783, 118790, 118797, 118803, 118807, 118811, 118815, + 118819, 118826, 118835, 118842, 118850, 118858, 118864, 118868, 118872, + 118876, 118880, 118886, 118895, 118907, 118914, 118921, 118930, 118941, + 118947, 118956, 118965, 118972, 118981, 118988, 118994, 119004, 119011, + 119018, 119025, 119032, 119036, 119042, 119046, 119057, 119065, 119074, + 119086, 119093, 119100, 119110, 119117, 119126, 119133, 119142, 119149, + 119156, 119166, 119173, 119180, 119189, 119196, 119208, 119217, 119224, + 119231, 119238, 119247, 119257, 119270, 119277, 119286, 119296, 119303, + 119312, 119325, 119332, 119339, 119346, 119356, 119366, 119372, 119382, + 119389, 119396, 119406, 119412, 119419, 119426, 119433, 119443, 119450, + 119457, 119464, 119470, 119477, 119487, 119494, 119498, 119506, 119510, + 119522, 119526, 119540, 119544, 119548, 119552, 119556, 119562, 119569, + 119577, 119581, 119585, 119589, 119593, 119600, 119604, 119610, 119616, + 119624, 119628, 119635, 119643, 119647, 119651, 119657, 119661, 119670, + 119679, 119686, 119696, 119702, 119706, 119710, 119718, 119725, 119732, + 119738, 119742, 119750, 119754, 119761, 119773, 119780, 119790, 119796, + 119800, 119809, 119816, 119825, 119829, 119833, 119840, 119844, 119848, + 119852, 119856, 119859, 119865, 119871, 119875, 119879, 119886, 119893, + 119900, 119907, 119914, 119921, 119928, 119935, 119941, 119945, 119949, + 119956, 119963, 119970, 119977, 119984, 119988, 119991, 119996, 120000, + 120004, 120013, 120022, 120026, 120030, 120036, 120042, 120059, 120065, + 120069, 120078, 120082, 120086, 120093, 120101, 120109, 120115, 120119, + 120123, 120127, 120131, 120134, 120140, 120147, 120157, 120164, 120171, + 120178, 120184, 120191, 120198, 120205, 120212, 120219, 120228, 120235, + 120247, 120254, 120261, 120271, 120282, 120289, 120296, 120303, 120310, + 120317, 120324, 120331, 120338, 120345, 120352, 120362, 120372, 120382, + 120389, 120399, 120406, 120413, 120420, 120427, 120433, 120440, 120447, + 120454, 120461, 120468, 120475, 120482, 120489, 120495, 120502, 120509, + 120518, 120525, 120532, 120536, 120544, 120548, 120552, 120556, 120560, + 120564, 120571, 120575, 120584, 120588, 120595, 120603, 120607, 120611, + 120615, 120628, 120644, 120648, 120652, 120659, 120665, 120672, 120676, + 120680, 120684, 120688, 120692, 120699, 120703, 120721, 120725, 120729, + 120736, 120740, 120744, 120750, 120754, 120758, 120766, 120770, 120774, + 120777, 120781, 120787, 120798, 120807, 120816, 120823, 120830, 120841, + 120848, 120855, 120862, 120869, 120876, 120883, 120890, 120900, 120906, + 120913, 120923, 120932, 120939, 120948, 120958, 120965, 120972, 120979, + 120986, 120998, 121005, 121012, 121019, 121026, 121033, 121043, 121050, + 121057, 121067, 121080, 121092, 121099, 121109, 121116, 121123, 121130, + 121144, 121150, 121158, 121168, 121178, 121185, 121192, 121198, 121202, + 121209, 121219, 121225, 121238, 121242, 121246, 121253, 121257, 121264, + 121274, 121278, 121282, 121286, 121290, 121294, 121301, 121305, 121312, + 121319, 121326, 121335, 121344, 121354, 121361, 121368, 121375, 121385, + 121392, 121402, 121409, 121419, 121426, 121433, 121443, 121453, 121460, + 121466, 121474, 121482, 121488, 121494, 121498, 121502, 121509, 121517, + 121523, 121527, 121531, 121535, 121542, 121554, 121557, 121564, 121570, + 121574, 121578, 121582, 121586, 121590, 121594, 121598, 121602, 121606, + 121610, 121617, 121621, 121627, 121631, 121635, 121639, 121645, 121652, + 121659, 121666, 121677, 121685, 121689, 121695, 121704, 121711, 121717, + 121720, 121724, 121728, 121734, 121743, 121751, 121755, 121761, 121765, + 121769, 121773, 121779, 121786, 121792, 121796, 121802, 121806, 121810, + 121819, 121831, 121835, 121842, 121849, 121859, 121866, 121878, 121885, + 121892, 121899, 121910, 121920, 121933, 121943, 121950, 121954, 121958, + 121962, 121966, 121975, 121984, 121993, 122010, 122019, 122025, 122032, + 122040, 122053, 122057, 122066, 122075, 122084, 122093, 122104, 122113, + 122121, 122130, 122139, 122148, 122157, 122167, 122170, 122174, 122178, + 122182, 122186, 122190, 122196, 122203, 122210, 122217, 122223, 122229, + 122236, 122242, 122249, 122257, 122261, 122268, 122275, 122282, 122290, + 122293, 122297, 122301, 122305, 122308, 122314, 122318, 122324, 122331, + 122338, 122344, 122351, 122358, 122365, 122372, 122379, 122386, 122393, + 122400, 122407, 122414, 122421, 122428, 122435, 122442, 122448, 122452, + 122461, 122465, 122469, 122473, 122477, 122483, 122490, 122497, 122504, + 122511, 122518, 122524, 122532, 122536, 122540, 122544, 122548, 122554, + 122571, 122588, 122592, 122596, 122600, 122604, 122608, 122612, 122618, + 122625, 122629, 122635, 122642, 122649, 122656, 122663, 122670, 122679, + 122686, 122693, 122700, 122707, 122711, 122715, 122721, 122733, 122737, + 122741, 122750, 122754, 122758, 122762, 122768, 122772, 122776, 122785, + 122789, 122793, 122797, 122804, 122808, 122812, 122816, 122820, 122824, + 122828, 122832, 122835, 122841, 122848, 122855, 122861, 122865, 122882, + 122888, 122892, 122898, 122904, 122910, 122916, 122922, 122928, 122932, + 122936, 122940, 122946, 122950, 122956, 122960, 122964, 122971, 122978, + 122995, 122999, 123003, 123007, 123011, 123015, 123027, 123030, 123035, + 123040, 123055, 123065, 123077, 123081, 123085, 123089, 123095, 123102, + 123109, 123119, 123131, 123137, 123143, 123152, 123156, 123160, 123167, + 123177, 123184, 123190, 123194, 123198, 123205, 123211, 123215, 123221, + 123225, 123233, 123239, 123243, 123251, 123259, 123266, 123272, 123279, + 123286, 123296, 123306, 123310, 123314, 123318, 123322, 123328, 123335, + 123341, 123348, 123355, 123362, 123371, 123378, 123385, 123391, 123398, + 123405, 123412, 123419, 123426, 123433, 123439, 123446, 123453, 123460, + 123469, 123476, 123483, 123487, 123493, 123497, 123503, 123510, 123517, + 123524, 123528, 123532, 123536, 123540, 123544, 123551, 123555, 123559, + 123565, 123573, 123577, 123581, 123585, 123589, 123596, 123600, 123604, + 123612, 123616, 123620, 123624, 123628, 123634, 123638, 123642, 123648, + 123655, 123661, 123668, 123680, 123684, 123691, 123698, 123705, 123712, + 123724, 123731, 123735, 123739, 123743, 123750, 123757, 123764, 123771, + 123781, 123788, 123794, 123801, 123808, 123815, 123822, 123831, 123841, + 123848, 123852, 123859, 123863, 123867, 123871, 123878, 123885, 123895, + 123901, 123905, 123914, 123918, 123925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123922, 123928, - 123934, 123941, 123948, 123955, 123962, 123969, 123976, 123982, 123989, - 123996, 124003, 124010, 124017, 124024, 124030, 124036, 124042, 124048, - 124054, 124060, 124066, 124072, 124078, 124085, 124092, 124099, 124106, - 124113, 124120, 124126, 124132, 124138, 124145, 124152, 124158, 124164, - 124173, 124180, 124187, 124194, 124201, 124208, 124215, 124221, 124227, - 124233, 124242, 124249, 124256, 124267, 124278, 124284, 124290, 124296, - 124305, 124312, 124319, 124329, 124339, 124350, 124361, 124373, 124386, - 124397, 124408, 124420, 124433, 124444, 124455, 124466, 124477, 124488, - 124500, 124508, 124516, 124525, 124534, 124543, 124549, 124555, 124561, - 124568, 124578, 124585, 124595, 124600, 124605, 124611, 124617, 124625, - 124633, 124642, 124653, 124664, 124672, 124680, 124689, 124698, 124706, - 124713, 124721, 124729, 124736, 124743, 124752, 124761, 124770, 124779, - 124788, 0, 124797, 124808, 124815, 124823, 124831, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 124839, 124848, 124855, 124862, 124871, 124878, 124885, - 124892, 124902, 124909, 124916, 124923, 124931, 124938, 124945, 124952, - 124963, 124970, 124977, 124984, 124991, 124998, 125007, 125014, 125020, - 125027, 125036, 125043, 125050, 125057, 125067, 125074, 125081, 125091, - 125101, 125108, 125115, 125122, 125129, 125136, 125143, 125152, 125159, - 125166, 125172, 125180, 125189, 125198, 125209, 125217, 125226, 125235, - 125244, 125253, 125260, 125267, 125276, 125288, 125298, 125305, 125312, - 125322, 125332, 125341, 125351, 125358, 125368, 125375, 125382, 125389, - 125399, 125409, 125416, 125423, 125433, 125439, 125450, 125459, 125469, - 125477, 125490, 125497, 125503, 125511, 125518, 125528, 125532, 125536, - 125540, 125544, 125548, 125552, 125556, 125565, 125569, 125576, 125580, - 125584, 125588, 125592, 125596, 125600, 125604, 125608, 125612, 125616, - 125620, 125624, 125628, 125632, 125636, 125640, 125644, 125648, 125652, - 125659, 125666, 125676, 125689, 125699, 125703, 125707, 125711, 125715, - 125719, 125723, 125727, 125731, 125735, 125739, 125743, 125750, 125757, - 125768, 125775, 125781, 125788, 125795, 125802, 125809, 125816, 125820, - 125824, 125831, 125838, 125845, 125854, 125861, 125874, 125884, 125891, - 125898, 125902, 125906, 125915, 125922, 125929, 125936, 125949, 125956, - 125963, 125973, 125983, 125992, 125999, 126006, 126013, 126020, 126027, - 126034, 126044, 126050, 126058, 126065, 126073, 126080, 126091, 126098, - 126104, 126111, 126118, 126125, 126132, 126142, 126152, 126159, 126166, - 126175, 126183, 126189, 126196, 126203, 126210, 126217, 126221, 126231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123929, 123935, + 123941, 123948, 123955, 123962, 123969, 123976, 123983, 123989, 123996, + 124003, 124010, 124017, 124024, 124031, 124037, 124043, 124049, 124055, + 124061, 124067, 124073, 124079, 124085, 124092, 124099, 124106, 124113, + 124120, 124127, 124133, 124139, 124145, 124152, 124159, 124165, 124171, + 124180, 124187, 124194, 124201, 124208, 124215, 124222, 124228, 124234, + 124240, 124249, 124256, 124263, 124274, 124285, 124291, 124297, 124303, + 124312, 124319, 124326, 124336, 124346, 124357, 124368, 124380, 124393, + 124404, 124415, 124427, 124440, 124451, 124462, 124473, 124484, 124495, + 124507, 124515, 124523, 124532, 124541, 124550, 124556, 124562, 124568, + 124575, 124585, 124592, 124602, 124607, 124612, 124618, 124624, 124632, + 124640, 124649, 124660, 124671, 124679, 124687, 124696, 124705, 124713, + 124720, 124728, 124736, 124743, 124750, 124759, 124768, 124777, 124786, + 124795, 0, 124804, 124815, 124822, 124830, 124838, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 124846, 124855, 124862, 124869, 124878, 124885, 124892, + 124899, 124909, 124916, 124923, 124930, 124938, 124945, 124952, 124959, + 124970, 124977, 124984, 124991, 124998, 125005, 125014, 125021, 125027, + 125034, 125043, 125050, 125057, 125064, 125074, 125081, 125088, 125098, + 125108, 125115, 125122, 125129, 125136, 125143, 125150, 125159, 125166, + 125173, 125179, 125187, 125196, 125205, 125216, 125224, 125233, 125242, + 125251, 125260, 125267, 125274, 125283, 125295, 125305, 125312, 125319, + 125329, 125339, 125348, 125358, 125365, 125375, 125382, 125389, 125396, + 125406, 125416, 125423, 125430, 125440, 125446, 125457, 125466, 125476, + 125484, 125497, 125504, 125510, 125518, 125525, 125535, 125539, 125543, + 125547, 125551, 125555, 125559, 125563, 125572, 125576, 125583, 125587, + 125591, 125595, 125599, 125603, 125607, 125611, 125615, 125619, 125623, + 125627, 125631, 125635, 125639, 125643, 125647, 125651, 125655, 125659, + 125666, 125673, 125683, 125696, 125706, 125710, 125714, 125718, 125722, + 125726, 125730, 125734, 125738, 125742, 125746, 125750, 125757, 125764, + 125775, 125782, 125788, 125795, 125802, 125809, 125816, 125823, 125827, + 125831, 125838, 125845, 125852, 125861, 125868, 125881, 125891, 125898, + 125905, 125909, 125913, 125922, 125929, 125936, 125943, 125956, 125963, + 125970, 125980, 125990, 125999, 126006, 126013, 126020, 126027, 126034, + 126041, 126051, 126057, 126065, 126072, 126080, 126087, 126098, 126105, + 126111, 126118, 126125, 126132, 126139, 126149, 126159, 126166, 126173, + 126182, 126190, 126196, 126203, 126210, 126217, 126224, 126228, 126238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126241, 126245, 126249, 126253, - 126257, 126261, 126265, 126269, 126273, 126277, 126281, 126285, 126289, - 126293, 126297, 126301, 126305, 126309, 126313, 126317, 126321, 126325, - 126329, 126333, 126337, 126341, 126345, 126349, 126353, 126357, 126361, - 126365, 126369, 126373, 126377, 126381, 126385, 126389, 126393, 126397, - 126401, 126405, 126409, 126413, 126417, 126421, 126425, 126429, 126433, - 126437, 126441, 126445, 126449, 126453, 126457, 126461, 126465, 126469, - 126473, 126477, 126481, 126485, 126489, 126493, 126497, 126501, 126505, - 126509, 126513, 126517, 126521, 126525, 126529, 126533, 126537, 126541, - 126545, 126549, 126553, 126557, 126561, 126565, 126569, 126573, 126577, - 126581, 126585, 126589, 126593, 126597, 126601, 126605, 126609, 126613, - 126617, 126621, 126625, 126629, 126633, 126637, 126641, 126645, 126649, - 126653, 126657, 126661, 126665, 126669, 126673, 126677, 126681, 126685, - 126689, 126693, 126697, 126701, 126705, 126709, 126713, 126717, 126721, - 126725, 126729, 126733, 126737, 126741, 126745, 126749, 126753, 126757, - 126761, 126765, 126769, 126773, 126777, 126781, 126785, 126789, 126793, - 126797, 126801, 126805, 126809, 126813, 126817, 126821, 126825, 126829, - 126833, 126837, 126841, 126845, 126849, 126853, 126857, 126861, 126865, - 126869, 126873, 126877, 126881, 126885, 126889, 126893, 126897, 126901, - 126905, 126909, 126913, 126917, 126921, 126925, 126929, 126933, 126937, - 126941, 126945, 126949, 126953, 126957, 126961, 126965, 126969, 126973, - 126977, 126981, 126985, 126989, 126993, 126997, 127001, 127005, 127009, - 127013, 127017, 127021, 127025, 127029, 127033, 127037, 127041, 127045, - 127049, 127053, 127057, 127061, 127065, 127069, 127073, 127077, 127081, - 127085, 127089, 127093, 127097, 127101, 127105, 127109, 127113, 127117, - 127121, 127125, 127129, 127133, 127137, 127141, 127145, 127149, 127153, - 127157, 127161, 127165, 127169, 127173, 127177, 127181, 127185, 127189, - 127193, 127197, 127201, 127205, 127209, 127213, 127217, 127221, 127225, - 127229, 127233, 127237, 127241, 127245, 127249, 127253, 127257, 127261, - 127265, 127269, 127273, 127277, 127281, 127285, 127289, 127293, 127297, - 127301, 127305, 127309, 127313, 127317, 127321, 127325, 127329, 127333, - 127337, 127341, 127345, 127349, 127353, 127357, 127361, 127365, 127369, - 127373, 127377, 127381, 127385, 127389, 127393, 127397, 127401, 127405, - 127409, 127413, 127417, 127421, 127425, 127429, 127433, 127437, 127441, - 127445, 127449, 127453, 127457, 127461, 127465, 127469, 127473, 127477, - 127481, 127485, 127489, 127493, 127497, 127501, 127505, 127509, 127513, - 127517, 127521, 127525, 127529, 127533, 127537, 127541, 127545, 127549, - 127553, 127557, 127561, 127565, 127569, 127573, 127577, 127581, 127585, - 127589, 127593, 127597, 127601, 127605, 127609, 127613, 127617, 127621, - 127625, 127629, 127633, 127637, 127641, 127645, 127649, 127653, 127657, - 127661, 127665, 127669, 127673, 127677, 127681, 127685, 127689, 127693, - 127697, 127701, 127705, 127709, 127713, 127717, 127721, 127725, 127729, - 127733, 127737, 127741, 127745, 127749, 127753, 127757, 127761, 127765, - 127769, 127773, 127777, 127781, 127785, 127789, 127793, 127797, 127801, - 127805, 127809, 127813, 127817, 127821, 127825, 127829, 127833, 127837, - 127841, 127845, 127849, 127853, 127857, 127861, 127865, 127869, 127873, - 127877, 127881, 127885, 127889, 127893, 127897, 127901, 127905, 127909, - 127913, 127917, 127921, 127925, 127929, 127933, 127937, 127941, 127945, - 127949, 127953, 127957, 127961, 127965, 127969, 127973, 127977, 127981, - 127985, 127989, 127993, 127997, 128001, 128005, 128009, 128013, 128017, - 128021, 128025, 128029, 128033, 128037, 128041, 128045, 128049, 128053, - 128057, 128061, 128065, 128069, 128073, 128077, 128081, 128085, 128089, - 128093, 128097, 128101, 128105, 128109, 128113, 128117, 128121, 128125, - 128129, 128133, 128137, 128141, 128145, 128149, 128153, 128157, 128161, - 128165, 128169, 128173, 128177, 128181, 128185, 128189, 128193, 128197, - 128201, 128205, 128209, 128213, 128217, 128221, 128225, 128229, 128233, - 128237, 128241, 128245, 128249, 128253, 128257, 128261, 128265, 128269, - 128273, 128277, 128281, 128285, 128289, 128293, 128297, 128301, 128305, - 128309, 128313, 128317, 128321, 128325, 128329, 128333, 128337, 128341, - 128345, 128349, 128353, 128357, 128361, 128365, 128369, 128373, 128377, - 128381, 128385, 128389, 128393, 128397, 128401, 128405, 128409, 128413, - 128417, 128421, 128425, 128429, 128433, 128437, 128441, 128445, 128449, - 128453, 128457, 128461, 128465, 128469, 128473, 128477, 128481, 128485, - 128489, 128493, 128497, 128501, 128505, 128509, 128513, 128517, 128521, - 128525, 128529, 128533, 128537, 128541, 128545, 128549, 128553, 128557, - 128561, 128565, 128569, 128573, 128577, 128581, 128585, 128589, 128593, - 128597, 128601, 128605, 128609, 128613, 128617, 128621, 128625, 128629, - 128633, 128637, 128641, 128645, 128649, 128653, 128657, 128661, 128665, - 128669, 128673, 128677, 128681, 128685, 128689, 128693, 128697, 128701, - 128705, 128709, 128713, 128717, 128721, 128725, 128729, 128733, 128737, - 128741, 128745, 128749, 128753, 128757, 128761, 128765, 128769, 128773, - 128777, 128781, 128785, 128789, 128793, 128797, 128801, 128805, 128809, - 128813, 128817, 128821, 128825, 128829, 128833, 128837, 128841, 128845, - 128849, 128853, 128857, 128861, 128865, 128869, 128873, 128877, 128881, - 128885, 128889, 128893, 128897, 128901, 128905, 128909, 128913, 128917, - 128921, 128925, 128929, 128933, 128937, 128941, 128945, 128949, 128953, - 128957, 128961, 128965, 128969, 128973, 128977, 128981, 128985, 128989, - 128993, 128997, 129001, 129005, 129009, 129013, 129017, 129021, 129025, - 129029, 129033, 129037, 129041, 129045, 129049, 129053, 129057, 129061, - 129065, 129069, 129073, 129077, 129081, 129085, 129089, 129093, 129097, - 129101, 129105, 129109, 129113, 129117, 129121, 129125, 129129, 129133, - 129137, 129141, 129145, 129149, 129153, 129157, 129161, 129165, 129169, - 129173, 129177, 129181, 129185, 129189, 129193, 129197, 129201, 129205, - 129209, 129213, 129217, 129221, 129225, 129229, 129233, 129237, 129241, - 129245, 129249, 129253, 129257, 129261, 129265, 129269, 129273, 129277, - 129281, 129285, 129289, 129293, 129297, 129301, 129305, 129309, 129313, - 129317, 129321, 129325, 129329, 129333, 129337, 129341, 129345, 129349, - 129353, 129357, 129361, 129365, 129369, 129373, 129377, 129381, 129385, - 129389, 129393, 129397, 129401, 129405, 129409, 129413, 129417, 129421, - 129425, 129429, 129433, 129437, 129441, 129445, 129449, 129453, 129457, - 129461, 129465, 129469, 129473, 129477, 129481, 129485, 129489, 129493, - 129497, 129501, 129505, 129509, 129513, 129517, 129521, 129525, 129529, - 129533, 129537, 129541, 129545, 129549, 129553, 129557, 129561, 129565, - 129569, 129573, 129577, 129581, 129585, 129589, 129593, 129597, 129601, - 129605, 129609, 129613, 129617, 129621, 129625, 129629, 129633, 129637, - 129641, 129645, 129649, 129653, 129657, 129661, 129665, 129669, 129673, - 129677, 129681, 129685, 129689, 129693, 129697, 129701, 129705, 129709, - 129713, 129717, 129721, 129725, 129729, 129733, 129737, 129741, 129745, - 129749, 129753, 129757, 129761, 129765, 129769, 129773, 129777, 129781, - 129785, 129789, 129793, 129797, 129801, 129805, 129809, 129813, 129817, - 129821, 129825, 129829, 129833, 129837, 129841, 129845, 129849, 129853, - 129857, 129861, 129865, 129869, 129873, 129877, 129881, 129885, 129889, - 129893, 129897, 129901, 129905, 129909, 129913, 129917, 129921, 129925, - 129929, 129933, 129937, 129941, 129945, 129949, 129953, 129957, 129961, - 129965, 129969, 129973, 129977, 129981, 129985, 129989, 129993, 129997, - 130001, 130005, 130009, 130013, 130017, 130021, 130025, 130029, 130033, - 130037, 130041, 130045, 130049, 130053, 130057, 130061, 130065, 130069, - 130073, 130077, 130081, 130085, 130089, 130093, 130097, 130101, 130105, - 130109, 130113, 130117, 130121, 130125, 130129, 130133, 130137, 130141, - 130145, 130149, 130153, 130157, 130161, 130165, 130169, 130173, 130177, - 130181, 130185, 130189, 130193, 130197, 130201, 130205, 130209, 130213, - 130217, 130221, 130225, 130229, 130233, 130237, 130241, 130245, 130249, - 130253, 130257, 130261, 130265, 130269, 130273, 130277, 130281, 130285, - 130289, 130293, 130297, 130301, 130305, 130309, 130313, 130317, 130321, - 130325, 130329, 130333, 130337, 130341, 130345, 130349, 130353, 130357, - 130361, 130365, 130369, 130373, 130377, 130381, 130385, 130389, 130393, - 130397, 130401, 130405, 130409, 130413, 130417, 130421, 130425, 130429, - 130433, 130437, 130441, 130445, 130449, 130453, 130457, 130461, 130465, - 130469, 130473, 130477, 130481, 130485, 130489, 130493, 130497, 130501, - 130505, 130509, 130513, 130517, 130521, 0, 130525, 130530, 130536, - 130546, 130556, 130566, 130576, 130582, 130588, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126248, 126252, 126256, 126260, + 126264, 126268, 126272, 126276, 126280, 126284, 126288, 126292, 126296, + 126300, 126304, 126308, 126312, 126316, 126320, 126324, 126328, 126332, + 126336, 126340, 126344, 126348, 126352, 126356, 126360, 126364, 126368, + 126372, 126376, 126380, 126384, 126388, 126392, 126396, 126400, 126404, + 126408, 126412, 126416, 126420, 126424, 126428, 126432, 126436, 126440, + 126444, 126448, 126452, 126456, 126460, 126464, 126468, 126472, 126476, + 126480, 126484, 126488, 126492, 126496, 126500, 126504, 126508, 126512, + 126516, 126520, 126524, 126528, 126532, 126536, 126540, 126544, 126548, + 126552, 126556, 126560, 126564, 126568, 126572, 126576, 126580, 126584, + 126588, 126592, 126596, 126600, 126604, 126608, 126612, 126616, 126620, + 126624, 126628, 126632, 126636, 126640, 126644, 126648, 126652, 126656, + 126660, 126664, 126668, 126672, 126676, 126680, 126684, 126688, 126692, + 126696, 126700, 126704, 126708, 126712, 126716, 126720, 126724, 126728, + 126732, 126736, 126740, 126744, 126748, 126752, 126756, 126760, 126764, + 126768, 126772, 126776, 126780, 126784, 126788, 126792, 126796, 126800, + 126804, 126808, 126812, 126816, 126820, 126824, 126828, 126832, 126836, + 126840, 126844, 126848, 126852, 126856, 126860, 126864, 126868, 126872, + 126876, 126880, 126884, 126888, 126892, 126896, 126900, 126904, 126908, + 126912, 126916, 126920, 126924, 126928, 126932, 126936, 126940, 126944, + 126948, 126952, 126956, 126960, 126964, 126968, 126972, 126976, 126980, + 126984, 126988, 126992, 126996, 127000, 127004, 127008, 127012, 127016, + 127020, 127024, 127028, 127032, 127036, 127040, 127044, 127048, 127052, + 127056, 127060, 127064, 127068, 127072, 127076, 127080, 127084, 127088, + 127092, 127096, 127100, 127104, 127108, 127112, 127116, 127120, 127124, + 127128, 127132, 127136, 127140, 127144, 127148, 127152, 127156, 127160, + 127164, 127168, 127172, 127176, 127180, 127184, 127188, 127192, 127196, + 127200, 127204, 127208, 127212, 127216, 127220, 127224, 127228, 127232, + 127236, 127240, 127244, 127248, 127252, 127256, 127260, 127264, 127268, + 127272, 127276, 127280, 127284, 127288, 127292, 127296, 127300, 127304, + 127308, 127312, 127316, 127320, 127324, 127328, 127332, 127336, 127340, + 127344, 127348, 127352, 127356, 127360, 127364, 127368, 127372, 127376, + 127380, 127384, 127388, 127392, 127396, 127400, 127404, 127408, 127412, + 127416, 127420, 127424, 127428, 127432, 127436, 127440, 127444, 127448, + 127452, 127456, 127460, 127464, 127468, 127472, 127476, 127480, 127484, + 127488, 127492, 127496, 127500, 127504, 127508, 127512, 127516, 127520, + 127524, 127528, 127532, 127536, 127540, 127544, 127548, 127552, 127556, + 127560, 127564, 127568, 127572, 127576, 127580, 127584, 127588, 127592, + 127596, 127600, 127604, 127608, 127612, 127616, 127620, 127624, 127628, + 127632, 127636, 127640, 127644, 127648, 127652, 127656, 127660, 127664, + 127668, 127672, 127676, 127680, 127684, 127688, 127692, 127696, 127700, + 127704, 127708, 127712, 127716, 127720, 127724, 127728, 127732, 127736, + 127740, 127744, 127748, 127752, 127756, 127760, 127764, 127768, 127772, + 127776, 127780, 127784, 127788, 127792, 127796, 127800, 127804, 127808, + 127812, 127816, 127820, 127824, 127828, 127832, 127836, 127840, 127844, + 127848, 127852, 127856, 127860, 127864, 127868, 127872, 127876, 127880, + 127884, 127888, 127892, 127896, 127900, 127904, 127908, 127912, 127916, + 127920, 127924, 127928, 127932, 127936, 127940, 127944, 127948, 127952, + 127956, 127960, 127964, 127968, 127972, 127976, 127980, 127984, 127988, + 127992, 127996, 128000, 128004, 128008, 128012, 128016, 128020, 128024, + 128028, 128032, 128036, 128040, 128044, 128048, 128052, 128056, 128060, + 128064, 128068, 128072, 128076, 128080, 128084, 128088, 128092, 128096, + 128100, 128104, 128108, 128112, 128116, 128120, 128124, 128128, 128132, + 128136, 128140, 128144, 128148, 128152, 128156, 128160, 128164, 128168, + 128172, 128176, 128180, 128184, 128188, 128192, 128196, 128200, 128204, + 128208, 128212, 128216, 128220, 128224, 128228, 128232, 128236, 128240, + 128244, 128248, 128252, 128256, 128260, 128264, 128268, 128272, 128276, + 128280, 128284, 128288, 128292, 128296, 128300, 128304, 128308, 128312, + 128316, 128320, 128324, 128328, 128332, 128336, 128340, 128344, 128348, + 128352, 128356, 128360, 128364, 128368, 128372, 128376, 128380, 128384, + 128388, 128392, 128396, 128400, 128404, 128408, 128412, 128416, 128420, + 128424, 128428, 128432, 128436, 128440, 128444, 128448, 128452, 128456, + 128460, 128464, 128468, 128472, 128476, 128480, 128484, 128488, 128492, + 128496, 128500, 128504, 128508, 128512, 128516, 128520, 128524, 128528, + 128532, 128536, 128540, 128544, 128548, 128552, 128556, 128560, 128564, + 128568, 128572, 128576, 128580, 128584, 128588, 128592, 128596, 128600, + 128604, 128608, 128612, 128616, 128620, 128624, 128628, 128632, 128636, + 128640, 128644, 128648, 128652, 128656, 128660, 128664, 128668, 128672, + 128676, 128680, 128684, 128688, 128692, 128696, 128700, 128704, 128708, + 128712, 128716, 128720, 128724, 128728, 128732, 128736, 128740, 128744, + 128748, 128752, 128756, 128760, 128764, 128768, 128772, 128776, 128780, + 128784, 128788, 128792, 128796, 128800, 128804, 128808, 128812, 128816, + 128820, 128824, 128828, 128832, 128836, 128840, 128844, 128848, 128852, + 128856, 128860, 128864, 128868, 128872, 128876, 128880, 128884, 128888, + 128892, 128896, 128900, 128904, 128908, 128912, 128916, 128920, 128924, + 128928, 128932, 128936, 128940, 128944, 128948, 128952, 128956, 128960, + 128964, 128968, 128972, 128976, 128980, 128984, 128988, 128992, 128996, + 129000, 129004, 129008, 129012, 129016, 129020, 129024, 129028, 129032, + 129036, 129040, 129044, 129048, 129052, 129056, 129060, 129064, 129068, + 129072, 129076, 129080, 129084, 129088, 129092, 129096, 129100, 129104, + 129108, 129112, 129116, 129120, 129124, 129128, 129132, 129136, 129140, + 129144, 129148, 129152, 129156, 129160, 129164, 129168, 129172, 129176, + 129180, 129184, 129188, 129192, 129196, 129200, 129204, 129208, 129212, + 129216, 129220, 129224, 129228, 129232, 129236, 129240, 129244, 129248, + 129252, 129256, 129260, 129264, 129268, 129272, 129276, 129280, 129284, + 129288, 129292, 129296, 129300, 129304, 129308, 129312, 129316, 129320, + 129324, 129328, 129332, 129336, 129340, 129344, 129348, 129352, 129356, + 129360, 129364, 129368, 129372, 129376, 129380, 129384, 129388, 129392, + 129396, 129400, 129404, 129408, 129412, 129416, 129420, 129424, 129428, + 129432, 129436, 129440, 129444, 129448, 129452, 129456, 129460, 129464, + 129468, 129472, 129476, 129480, 129484, 129488, 129492, 129496, 129500, + 129504, 129508, 129512, 129516, 129520, 129524, 129528, 129532, 129536, + 129540, 129544, 129548, 129552, 129556, 129560, 129564, 129568, 129572, + 129576, 129580, 129584, 129588, 129592, 129596, 129600, 129604, 129608, + 129612, 129616, 129620, 129624, 129628, 129632, 129636, 129640, 129644, + 129648, 129652, 129656, 129660, 129664, 129668, 129672, 129676, 129680, + 129684, 129688, 129692, 129696, 129700, 129704, 129708, 129712, 129716, + 129720, 129724, 129728, 129732, 129736, 129740, 129744, 129748, 129752, + 129756, 129760, 129764, 129768, 129772, 129776, 129780, 129784, 129788, + 129792, 129796, 129800, 129804, 129808, 129812, 129816, 129820, 129824, + 129828, 129832, 129836, 129840, 129844, 129848, 129852, 129856, 129860, + 129864, 129868, 129872, 129876, 129880, 129884, 129888, 129892, 129896, + 129900, 129904, 129908, 129912, 129916, 129920, 129924, 129928, 129932, + 129936, 129940, 129944, 129948, 129952, 129956, 129960, 129964, 129968, + 129972, 129976, 129980, 129984, 129988, 129992, 129996, 130000, 130004, + 130008, 130012, 130016, 130020, 130024, 130028, 130032, 130036, 130040, + 130044, 130048, 130052, 130056, 130060, 130064, 130068, 130072, 130076, + 130080, 130084, 130088, 130092, 130096, 130100, 130104, 130108, 130112, + 130116, 130120, 130124, 130128, 130132, 130136, 130140, 130144, 130148, + 130152, 130156, 130160, 130164, 130168, 130172, 130176, 130180, 130184, + 130188, 130192, 130196, 130200, 130204, 130208, 130212, 130216, 130220, + 130224, 130228, 130232, 130236, 130240, 130244, 130248, 130252, 130256, + 130260, 130264, 130268, 130272, 130276, 130280, 130284, 130288, 130292, + 130296, 130300, 130304, 130308, 130312, 130316, 130320, 130324, 130328, + 130332, 130336, 130340, 130344, 130348, 130352, 130356, 130360, 130364, + 130368, 130372, 130376, 130380, 130384, 130388, 130392, 130396, 130400, + 130404, 130408, 130412, 130416, 130420, 130424, 130428, 130432, 130436, + 130440, 130444, 130448, 130452, 130456, 130460, 130464, 130468, 130472, + 130476, 130480, 130484, 130488, 130492, 130496, 130500, 130504, 130508, + 130512, 130516, 130520, 130524, 130528, 0, 130532, 130537, 130543, + 130553, 130563, 130573, 130583, 130589, 130595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130594, 130598, 130602, - 130606, 130610, 130614, 130618, 130622, 130626, 130630, 130634, 130638, - 130642, 130646, 130650, 130654, 130658, 130662, 130666, 130670, 130674, - 130678, 130682, 130686, 130690, 130694, 130698, 130702, 130706, 130710, - 130714, 130718, 130722, 130726, 130730, 130734, 130738, 130742, 130746, - 130750, 130754, 130758, 130762, 130766, 130770, 130774, 130778, 130782, - 130786, 130790, 130794, 130798, 130802, 130806, 130810, 130814, 130818, - 130822, 130826, 130830, 130834, 130838, 130842, 130846, 130850, 130854, - 130858, 130862, 130866, 130870, 130874, 130878, 130882, 130886, 130890, - 130894, 130898, 130902, 130906, 130910, 130914, 130918, 130922, 130926, - 130930, 130934, 130938, 130942, 130946, 130950, 130954, 130958, 130962, - 130966, 130970, 130974, 130978, 130982, 130986, 130990, 130994, 130998, - 131002, 131006, 131010, 131014, 131018, 131022, 131026, 131030, 131034, - 131038, 131042, 131046, 131050, 131054, 131058, 131062, 131066, 131070, - 131074, 131078, 131082, 131086, 131090, 131094, 131098, 131102, 131106, - 131110, 131114, 131118, 131122, 131126, 131130, 131134, 131138, 131142, - 131146, 131150, 131154, 131158, 131162, 131166, 131170, 131174, 131178, - 131182, 131186, 131190, 131194, 131198, 131202, 131206, 131210, 131214, - 131218, 131222, 131226, 131230, 131234, 131238, 131242, 131246, 131250, - 131254, 131258, 131262, 131266, 131270, 131274, 131278, 131282, 131286, - 131290, 131294, 131298, 131302, 131306, 131310, 131314, 131318, 131322, - 131326, 131330, 131334, 131338, 131342, 131346, 131350, 131354, 131358, - 131362, 131366, 131370, 131374, 131378, 131382, 131386, 131390, 131394, - 131398, 131402, 131406, 131410, 131414, 131418, 131422, 131426, 131430, - 131434, 131438, 131442, 131446, 131450, 131454, 131458, 131462, 131466, - 131470, 131474, 131478, 131482, 131486, 131490, 131494, 131498, 131502, - 131506, 131510, 131514, 131518, 131522, 131526, 131530, 131534, 131538, - 131542, 131546, 131550, 131554, 131558, 131562, 131566, 131570, 131574, - 131578, 131582, 131586, 131590, 131594, 131598, 131602, 131606, 131610, - 131614, 131618, 131622, 131626, 131630, 131634, 131638, 131642, 131646, - 131650, 131654, 131658, 131662, 131666, 131670, 131674, 131678, 131682, - 131686, 131690, 131694, 131698, 131702, 131706, 131710, 131714, 131718, - 131722, 131726, 131730, 131734, 131738, 131742, 131746, 131750, 131754, - 131758, 131762, 131766, 131770, 131774, 131778, 131782, 131786, 131790, - 131794, 131798, 131802, 131806, 131810, 131814, 131818, 131822, 131826, - 131830, 131834, 131838, 131842, 131846, 131850, 131854, 131858, 131862, - 131866, 131870, 131874, 131878, 131882, 131886, 131890, 131894, 131898, - 131902, 131906, 131910, 131914, 131918, 131922, 131926, 131930, 131934, - 131938, 131942, 131946, 131950, 131954, 131958, 131962, 131966, 131970, - 131974, 131978, 131982, 131986, 131990, 131994, 131998, 132002, 132006, - 132010, 132014, 132018, 132022, 132026, 132030, 132034, 132038, 132042, - 132046, 132050, 132054, 132058, 132062, 132066, 132070, 132074, 132078, - 132082, 132086, 132090, 132094, 132098, 132102, 132106, 132110, 132114, - 132118, 132122, 132126, 132130, 132134, 132138, 132142, 132146, 132150, - 132154, 132158, 132162, 132166, 132170, 132174, 132178, 132182, 132186, - 132190, 132194, 132198, 132202, 132206, 132210, 132214, 132218, 132222, - 132226, 132230, 132234, 132238, 132242, 132246, 132250, 132254, 132258, - 132262, 132266, 132270, 132274, 132278, 132282, 132286, 132290, 132294, - 132298, 132302, 132306, 132310, 132314, 132318, 132322, 132326, 132336, - 132340, 132344, 132348, 132352, 132356, 132360, 132364, 132368, 132372, - 132376, 132380, 132385, 132389, 132393, 132397, 132401, 132405, 132409, - 132413, 132417, 132421, 132425, 132429, 132433, 132437, 132441, 132445, - 132449, 132458, 132467, 132471, 132475, 132479, 132483, 132487, 132491, - 132495, 132499, 132503, 132507, 132511, 132515, 132519, 132523, 132527, - 132531, 132535, 132539, 132543, 132547, 132551, 132555, 132559, 132563, - 132567, 132571, 132575, 132579, 132583, 132587, 132591, 132595, 132599, - 132603, 132607, 132611, 132615, 132619, 132623, 132627, 132631, 132635, - 132639, 132643, 132647, 132651, 132655, 132659, 132663, 132667, 132671, - 132675, 132679, 132683, 132687, 132691, 132695, 132699, 132703, 132707, - 132711, 132715, 132719, 132723, 132727, 132731, 132735, 132739, 132743, - 132747, 132751, 132755, 132759, 132763, 132767, 132771, 132775, 132779, - 132783, 132787, 132791, 132795, 132799, 132803, 132807, 132811, 132815, - 132819, 132823, 132827, 132831, 132835, 132839, 132843, 132847, 132851, - 132855, 132859, 132863, 132867, 132871, 132875, 132879, 132883, 132887, - 132891, 132895, 132899, 132903, 132907, 132911, 132915, 132919, 132923, - 132927, 132931, 132935, 132939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130601, 130605, 130609, + 130613, 130617, 130621, 130625, 130629, 130633, 130637, 130641, 130645, + 130649, 130653, 130657, 130661, 130665, 130669, 130673, 130677, 130681, + 130685, 130689, 130693, 130697, 130701, 130705, 130709, 130713, 130717, + 130721, 130725, 130729, 130733, 130737, 130741, 130745, 130749, 130753, + 130757, 130761, 130765, 130769, 130773, 130777, 130781, 130785, 130789, + 130793, 130797, 130801, 130805, 130809, 130813, 130817, 130821, 130825, + 130829, 130833, 130837, 130841, 130845, 130849, 130853, 130857, 130861, + 130865, 130869, 130873, 130877, 130881, 130885, 130889, 130893, 130897, + 130901, 130905, 130909, 130913, 130917, 130921, 130925, 130929, 130933, + 130937, 130941, 130945, 130949, 130953, 130957, 130961, 130965, 130969, + 130973, 130977, 130981, 130985, 130989, 130993, 130997, 131001, 131005, + 131009, 131013, 131017, 131021, 131025, 131029, 131033, 131037, 131041, + 131045, 131049, 131053, 131057, 131061, 131065, 131069, 131073, 131077, + 131081, 131085, 131089, 131093, 131097, 131101, 131105, 131109, 131113, + 131117, 131121, 131125, 131129, 131133, 131137, 131141, 131145, 131149, + 131153, 131157, 131161, 131165, 131169, 131173, 131177, 131181, 131185, + 131189, 131193, 131197, 131201, 131205, 131209, 131213, 131217, 131221, + 131225, 131229, 131233, 131237, 131241, 131245, 131249, 131253, 131257, + 131261, 131265, 131269, 131273, 131277, 131281, 131285, 131289, 131293, + 131297, 131301, 131305, 131309, 131313, 131317, 131321, 131325, 131329, + 131333, 131337, 131341, 131345, 131349, 131353, 131357, 131361, 131365, + 131369, 131373, 131377, 131381, 131385, 131389, 131393, 131397, 131401, + 131405, 131409, 131413, 131417, 131421, 131425, 131429, 131433, 131437, + 131441, 131445, 131449, 131453, 131457, 131461, 131465, 131469, 131473, + 131477, 131481, 131485, 131489, 131493, 131497, 131501, 131505, 131509, + 131513, 131517, 131521, 131525, 131529, 131533, 131537, 131541, 131545, + 131549, 131553, 131557, 131561, 131565, 131569, 131573, 131577, 131581, + 131585, 131589, 131593, 131597, 131601, 131605, 131609, 131613, 131617, + 131621, 131625, 131629, 131633, 131637, 131641, 131645, 131649, 131653, + 131657, 131661, 131665, 131669, 131673, 131677, 131681, 131685, 131689, + 131693, 131697, 131701, 131705, 131709, 131713, 131717, 131721, 131725, + 131729, 131733, 131737, 131741, 131745, 131749, 131753, 131757, 131761, + 131765, 131769, 131773, 131777, 131781, 131785, 131789, 131793, 131797, + 131801, 131805, 131809, 131813, 131817, 131821, 131825, 131829, 131833, + 131837, 131841, 131845, 131849, 131853, 131857, 131861, 131865, 131869, + 131873, 131877, 131881, 131885, 131889, 131893, 131897, 131901, 131905, + 131909, 131913, 131917, 131921, 131925, 131929, 131933, 131937, 131941, + 131945, 131949, 131953, 131957, 131961, 131965, 131969, 131973, 131977, + 131981, 131985, 131989, 131993, 131997, 132001, 132005, 132009, 132013, + 132017, 132021, 132025, 132029, 132033, 132037, 132041, 132045, 132049, + 132053, 132057, 132061, 132065, 132069, 132073, 132077, 132081, 132085, + 132089, 132093, 132097, 132101, 132105, 132109, 132113, 132117, 132121, + 132125, 132129, 132133, 132137, 132141, 132145, 132149, 132153, 132157, + 132161, 132165, 132169, 132173, 132177, 132181, 132185, 132189, 132193, + 132197, 132201, 132205, 132209, 132213, 132217, 132221, 132225, 132229, + 132233, 132237, 132241, 132245, 132249, 132253, 132257, 132261, 132265, + 132269, 132273, 132277, 132281, 132285, 132289, 132293, 132297, 132301, + 132305, 132309, 132313, 132317, 132321, 132325, 132329, 132333, 132343, + 132347, 132351, 132355, 132359, 132363, 132367, 132371, 132375, 132379, + 132383, 132387, 132392, 132396, 132400, 132404, 132408, 132412, 132416, + 132420, 132424, 132428, 132432, 132436, 132440, 132444, 132448, 132452, + 132456, 132465, 132474, 132478, 132482, 132486, 132490, 132494, 132498, + 132502, 132506, 132510, 132514, 132518, 132522, 132526, 132530, 132534, + 132538, 132542, 132546, 132550, 132554, 132558, 132562, 132566, 132570, + 132574, 132578, 132582, 132586, 132590, 132594, 132598, 132602, 132606, + 132610, 132614, 132618, 132622, 132626, 132630, 132634, 132638, 132642, + 132646, 132650, 132654, 132658, 132662, 132666, 132670, 132674, 132678, + 132682, 132686, 132690, 132694, 132698, 132702, 132706, 132710, 132714, + 132718, 132722, 132726, 132730, 132734, 132738, 132742, 132746, 132750, + 132754, 132758, 132762, 132766, 132770, 132774, 132778, 132782, 132786, + 132790, 132794, 132798, 132802, 132806, 132810, 132814, 132818, 132822, + 132826, 132830, 132834, 132838, 132842, 132846, 132850, 132854, 132858, + 132862, 132866, 132870, 132874, 132878, 132882, 132886, 132890, 132894, + 132898, 132902, 132906, 132910, 132914, 132918, 132922, 132926, 132930, + 132934, 132938, 132942, 132946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132943, 132951, - 132959, 132969, 132979, 132987, 132993, 133001, 133009, 133019, 133031, - 133043, 133049, 133057, 133063, 133069, 133075, 133081, 133087, 133093, - 133099, 133105, 133111, 133117, 133123, 133131, 133139, 133145, 133151, - 133157, 133163, 133171, 133179, 133188, 133194, 133202, 133208, 133214, - 133220, 133226, 133232, 133240, 133248, 133254, 133260, 133266, 133272, - 133278, 133284, 133290, 133296, 133302, 133308, 133314, 133320, 133326, - 133332, 133338, 133344, 133350, 133356, 133362, 133370, 133376, 133382, - 133392, 133400, 133406, 133412, 133418, 133424, 133430, 133436, 133442, - 133448, 133454, 133460, 133466, 133472, 133478, 133484, 133490, 133496, - 133502, 133508, 133514, 133520, 133526, 133532, 133540, 133546, 133554, - 133562, 133570, 133576, 133582, 133588, 133594, 133600, 133608, 133618, - 133626, 133634, 133640, 133646, 133654, 133662, 133668, 133676, 133684, - 133692, 133698, 133704, 133710, 133716, 133722, 133728, 133736, 133744, - 133750, 133756, 133762, 133768, 133774, 133782, 133788, 133794, 133800, - 133806, 133812, 133818, 133826, 133832, 133838, 133844, 133850, 133858, - 133866, 133872, 133878, 133884, 133889, 133895, 133901, 133908, 133913, - 133918, 133923, 133928, 133933, 133938, 133943, 133948, 133953, 133962, - 133969, 133974, 133979, 133984, 133991, 133996, 134001, 134006, 134013, - 134018, 134023, 134028, 134033, 134038, 134043, 134048, 134053, 134058, - 134063, 134068, 134075, 134080, 134087, 134092, 134097, 134104, 134109, - 134114, 134119, 134124, 134129, 134134, 134139, 134144, 134149, 134154, - 134159, 134164, 134169, 134174, 134179, 134184, 134189, 134194, 134199, - 134206, 134211, 134216, 134221, 134226, 134231, 134236, 134241, 134246, - 134251, 134256, 134261, 134266, 134271, 134278, 134283, 134288, 134295, - 134300, 134305, 134310, 134315, 134320, 134325, 134330, 134335, 134340, - 134345, 134352, 134357, 134362, 134367, 134372, 134377, 134384, 134391, - 134396, 134401, 134406, 134411, 134416, 134421, 134426, 134431, 134436, - 134441, 134446, 134451, 134456, 134461, 134466, 134471, 134476, 134481, - 134486, 134491, 134496, 134501, 134506, 134511, 134516, 134521, 134526, - 134531, 134536, 134541, 134546, 134551, 134556, 134561, 134566, 134571, - 134578, 134583, 134588, 134593, 134598, 134603, 134608, 134613, 134618, - 134623, 134628, 134633, 134638, 134643, 134648, 134653, 134658, 134663, - 134668, 134673, 134678, 134683, 134688, 134693, 134698, 134703, 134708, - 134713, 134718, 134723, 134728, 134733, 134738, 134743, 134748, 134753, - 134758, 134763, 134768, 134773, 134778, 134783, 134788, 134793, 134798, - 134803, 134808, 134813, 134818, 134823, 134828, 134833, 134838, 134843, - 134848, 134853, 134858, 134863, 134868, 134875, 134880, 134885, 134890, - 134895, 134900, 134905, 134910, 134915, 134920, 134925, 134930, 134935, - 134940, 134945, 134950, 134955, 134960, 134965, 134970, 134975, 134980, - 134987, 134992, 134997, 135003, 135008, 135013, 135018, 135023, 135028, - 135033, 135038, 135043, 135048, 135053, 135058, 135063, 135068, 135073, - 135078, 135083, 135088, 135093, 135098, 135103, 135108, 135113, 135118, - 135123, 135128, 135133, 135138, 135143, 135148, 135153, 135158, 135163, - 135168, 135173, 135178, 135183, 135188, 135193, 135198, 135203, 135208, - 135213, 135218, 135225, 135230, 135235, 135242, 135249, 135254, 135259, - 135264, 135269, 135274, 135279, 135284, 135289, 135294, 135299, 135304, - 135309, 135314, 135319, 135324, 135329, 135334, 135339, 135344, 135349, - 135354, 135359, 135364, 135369, 135374, 135381, 135386, 135391, 135396, - 135401, 135406, 135411, 135416, 135421, 135426, 135431, 135436, 135441, - 135446, 135451, 135456, 135461, 135466, 135471, 135478, 135483, 135488, - 135493, 135498, 135503, 135508, 135513, 135519, 135524, 135529, 135534, - 135539, 135544, 135549, 135554, 135559, 135566, 135573, 135578, 135583, - 135587, 135592, 135596, 135600, 135605, 135612, 135617, 135622, 135631, - 135636, 135641, 135646, 135651, 135658, 135665, 135670, 135675, 135680, - 135685, 135692, 135697, 135702, 135707, 135712, 135717, 135722, 135727, - 135732, 135737, 135742, 135747, 135752, 135759, 135763, 135768, 135773, - 135778, 135783, 135787, 135792, 135797, 135802, 135807, 135812, 135817, - 135822, 135827, 135832, 135838, 135844, 135850, 135856, 135862, 135867, - 135873, 135879, 135885, 135891, 135897, 135903, 135909, 135915, 135921, - 135927, 135933, 135939, 135945, 135951, 135957, 135963, 135969, 135975, - 135980, 135986, 135992, 135998, 136004, 136010, 136016, 136022, 136028, - 136034, 136040, 136046, 136052, 136058, 136064, 136070, 136076, 136082, - 136088, 136094, 136100, 136105, 136111, 136117, 136123, 136129, 136135, - 0, 0, 0, 0, 0, 0, 0, 136141, 136145, 136150, 136155, 136160, 136165, - 136170, 136174, 136179, 136184, 136189, 136194, 136199, 136204, 136209, - 136214, 136219, 136223, 136228, 136232, 136237, 136242, 136247, 136252, - 136257, 136261, 136266, 136271, 136275, 136280, 136285, 0, 136290, - 136295, 136299, 136303, 136307, 136311, 136315, 136319, 136323, 136327, - 0, 0, 0, 0, 136331, 136335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132950, 132958, + 132966, 132976, 132986, 132994, 133000, 133008, 133016, 133026, 133038, + 133050, 133056, 133064, 133070, 133076, 133082, 133088, 133094, 133100, + 133106, 133112, 133118, 133124, 133130, 133138, 133146, 133152, 133158, + 133164, 133170, 133178, 133186, 133195, 133201, 133209, 133215, 133221, + 133227, 133233, 133239, 133247, 133255, 133261, 133267, 133273, 133279, + 133285, 133291, 133297, 133303, 133309, 133315, 133321, 133327, 133333, + 133339, 133345, 133351, 133357, 133363, 133369, 133377, 133383, 133389, + 133399, 133407, 133413, 133419, 133425, 133431, 133437, 133443, 133449, + 133455, 133461, 133467, 133473, 133479, 133485, 133491, 133497, 133503, + 133509, 133515, 133521, 133527, 133533, 133539, 133547, 133553, 133561, + 133569, 133577, 133583, 133589, 133595, 133601, 133607, 133615, 133625, + 133633, 133641, 133647, 133653, 133661, 133669, 133675, 133683, 133691, + 133699, 133705, 133711, 133717, 133723, 133729, 133735, 133743, 133751, + 133757, 133763, 133769, 133775, 133781, 133789, 133795, 133801, 133807, + 133813, 133819, 133825, 133833, 133839, 133845, 133851, 133857, 133865, + 133873, 133879, 133885, 133891, 133896, 133902, 133908, 133915, 133920, + 133925, 133930, 133935, 133940, 133945, 133950, 133955, 133960, 133969, + 133976, 133981, 133986, 133991, 133998, 134003, 134008, 134013, 134020, + 134025, 134030, 134035, 134040, 134045, 134050, 134055, 134060, 134065, + 134070, 134075, 134082, 134087, 134094, 134099, 134104, 134111, 134116, + 134121, 134126, 134131, 134136, 134141, 134146, 134151, 134156, 134161, + 134166, 134171, 134176, 134181, 134186, 134191, 134196, 134201, 134206, + 134213, 134218, 134223, 134228, 134233, 134238, 134243, 134248, 134253, + 134258, 134263, 134268, 134273, 134278, 134285, 134290, 134295, 134302, + 134307, 134312, 134317, 134322, 134327, 134332, 134337, 134342, 134347, + 134352, 134359, 134364, 134369, 134374, 134379, 134384, 134391, 134398, + 134403, 134408, 134413, 134418, 134423, 134428, 134433, 134438, 134443, + 134448, 134453, 134458, 134463, 134468, 134473, 134478, 134483, 134488, + 134493, 134498, 134503, 134508, 134513, 134518, 134523, 134528, 134533, + 134538, 134543, 134548, 134553, 134558, 134563, 134568, 134573, 134578, + 134585, 134590, 134595, 134600, 134605, 134610, 134615, 134620, 134625, + 134630, 134635, 134640, 134645, 134650, 134655, 134660, 134665, 134670, + 134675, 134680, 134685, 134690, 134695, 134700, 134705, 134710, 134715, + 134720, 134725, 134730, 134735, 134740, 134745, 134750, 134755, 134760, + 134765, 134770, 134775, 134780, 134785, 134790, 134795, 134800, 134805, + 134810, 134815, 134820, 134825, 134830, 134835, 134840, 134845, 134850, + 134855, 134860, 134865, 134870, 134875, 134882, 134887, 134892, 134897, + 134902, 134907, 134912, 134917, 134922, 134927, 134932, 134937, 134942, + 134947, 134952, 134957, 134962, 134967, 134972, 134977, 134982, 134987, + 134994, 134999, 135004, 135010, 135015, 135020, 135025, 135030, 135035, + 135040, 135045, 135050, 135055, 135060, 135065, 135070, 135075, 135080, + 135085, 135090, 135095, 135100, 135105, 135110, 135115, 135120, 135125, + 135130, 135135, 135140, 135145, 135150, 135155, 135160, 135165, 135170, + 135175, 135180, 135185, 135190, 135195, 135200, 135205, 135210, 135215, + 135220, 135225, 135232, 135237, 135242, 135249, 135256, 135261, 135266, + 135271, 135276, 135281, 135286, 135291, 135296, 135301, 135306, 135311, + 135316, 135321, 135326, 135331, 135336, 135341, 135346, 135351, 135356, + 135361, 135366, 135371, 135376, 135381, 135388, 135393, 135398, 135403, + 135408, 135413, 135418, 135423, 135428, 135433, 135438, 135443, 135448, + 135453, 135458, 135463, 135468, 135473, 135478, 135485, 135490, 135495, + 135500, 135505, 135510, 135515, 135520, 135526, 135531, 135536, 135541, + 135546, 135551, 135556, 135561, 135566, 135573, 135580, 135585, 135590, + 135594, 135599, 135603, 135607, 135612, 135619, 135624, 135629, 135638, + 135643, 135648, 135653, 135658, 135665, 135672, 135677, 135682, 135687, + 135692, 135699, 135704, 135709, 135714, 135719, 135724, 135729, 135734, + 135739, 135744, 135749, 135754, 135759, 135766, 135770, 135775, 135780, + 135785, 135790, 135794, 135799, 135804, 135809, 135814, 135819, 135824, + 135829, 135834, 135839, 135845, 135851, 135857, 135863, 135869, 135874, + 135880, 135886, 135892, 135898, 135904, 135910, 135916, 135922, 135928, + 135934, 135940, 135946, 135952, 135958, 135964, 135970, 135976, 135982, + 135987, 135993, 135999, 136005, 136011, 136017, 136023, 136029, 136035, + 136041, 136047, 136053, 136059, 136065, 136071, 136077, 136083, 136089, + 136095, 136101, 136107, 136112, 136118, 136124, 136130, 136136, 136142, + 0, 0, 0, 0, 0, 0, 0, 136148, 136152, 136157, 136162, 136167, 136172, + 136177, 136181, 136186, 136191, 136196, 136201, 136206, 136211, 136216, + 136221, 136226, 136230, 136235, 136239, 136244, 136249, 136254, 136259, + 136264, 136268, 136273, 136278, 136282, 136287, 136292, 0, 136297, + 136302, 136306, 136310, 136314, 136318, 136322, 136326, 136330, 136334, + 0, 0, 0, 0, 136338, 136342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 136340, 136347, 136353, 136360, 136367, - 136374, 136381, 136388, 136395, 136402, 136409, 136416, 136423, 136430, - 136437, 136444, 136451, 136458, 136464, 136471, 136478, 136485, 136491, - 136498, 136504, 136510, 136517, 136523, 136530, 136536, 0, 0, 136542, - 136550, 136558, 136567, 136576, 136585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 136593, 136598, 136603, 136608, 136613, 136618, 136623, 136628, 136633, - 136638, 136643, 136648, 136653, 136658, 136663, 136668, 136673, 136678, - 136683, 136688, 136693, 136698, 136703, 136708, 136713, 136718, 136723, - 136728, 136733, 136738, 136743, 136748, 136753, 136758, 136763, 136768, - 136773, 136778, 136783, 136788, 136793, 136798, 136803, 136808, 136813, - 136818, 136823, 136828, 136833, 136840, 136847, 136854, 136861, 136868, - 136875, 136882, 136889, 136898, 136905, 136912, 136919, 136926, 136933, - 136940, 136947, 136954, 136961, 136968, 136975, 136980, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 136989, 136994, 136998, 137002, 137006, 137010, 137014, - 137018, 137022, 137026, 0, 137030, 137035, 137040, 137047, 137052, - 137059, 137066, 0, 137071, 137078, 137083, 137088, 137095, 137102, - 137107, 137112, 137117, 137122, 137127, 137134, 137141, 137146, 137151, - 137156, 137169, 137178, 137185, 137194, 137203, 0, 0, 0, 0, 0, 137212, - 137219, 137226, 137233, 137240, 137247, 137254, 137261, 137268, 137275, - 137282, 137289, 137296, 137303, 137310, 137317, 137324, 137331, 137338, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 136347, 136354, 136360, 136367, 136374, + 136381, 136388, 136395, 136402, 136409, 136416, 136423, 136430, 136437, + 136444, 136451, 136458, 136465, 136471, 136478, 136485, 136492, 136498, + 136505, 136511, 136517, 136524, 136530, 136537, 136543, 0, 0, 136549, + 136557, 136565, 136574, 136583, 136592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 136600, 136605, 136610, 136615, 136620, 136625, 136630, 136635, 136640, + 136645, 136650, 136655, 136660, 136665, 136670, 136675, 136680, 136685, + 136690, 136695, 136700, 136705, 136710, 136715, 136720, 136725, 136730, + 136735, 136740, 136745, 136750, 136755, 136760, 136765, 136770, 136775, + 136780, 136785, 136790, 136795, 136800, 136805, 136810, 136815, 136820, + 136825, 136830, 136835, 136840, 136847, 136854, 136861, 136868, 136875, + 136882, 136889, 136896, 136905, 136912, 136919, 136926, 136933, 136940, + 136947, 136954, 136961, 136968, 136975, 136982, 136987, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 136996, 137001, 137005, 137009, 137013, 137017, 137021, + 137025, 137029, 137033, 0, 137037, 137042, 137047, 137054, 137059, + 137066, 137073, 0, 137078, 137085, 137090, 137095, 137102, 137109, + 137114, 137119, 137124, 137129, 137134, 137141, 137148, 137153, 137158, + 137163, 137176, 137185, 137192, 137201, 137210, 0, 0, 0, 0, 0, 137219, + 137226, 137233, 137240, 137247, 137254, 137261, 137268, 137275, 137282, + 137289, 137296, 137303, 137310, 137317, 137324, 137331, 137338, 137345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -22408,1088 +22412,1088 @@ static const unsigned int phrasebook_offset2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 137345, 137351, 137357, 137363, 137369, 137375, - 137381, 137387, 137393, 137399, 137405, 137411, 137416, 137422, 137427, - 137433, 137438, 137444, 137450, 137455, 137461, 137466, 137472, 137478, - 137484, 137490, 137496, 137502, 137508, 137513, 137518, 137524, 137530, - 137536, 137542, 137548, 137554, 137560, 137566, 137572, 137578, 137584, - 137590, 137596, 137601, 137607, 137612, 137618, 137623, 137629, 137635, - 137640, 137646, 137651, 137657, 137663, 137669, 137675, 137681, 137687, - 137693, 137698, 137703, 137709, 137715, 137720, 137724, 137728, 137732, - 137736, 137740, 137744, 137748, 137752, 137756, 137761, 137766, 137771, - 137776, 137781, 137786, 137791, 137796, 137801, 137806, 137813, 137820, - 137827, 137831, 137837, 137842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 137352, 137358, 137364, 137370, 137376, 137382, + 137388, 137394, 137400, 137406, 137412, 137418, 137423, 137429, 137434, + 137440, 137445, 137451, 137457, 137462, 137468, 137473, 137479, 137485, + 137491, 137497, 137503, 137509, 137515, 137520, 137525, 137531, 137537, + 137543, 137549, 137555, 137561, 137567, 137573, 137579, 137585, 137591, + 137597, 137603, 137608, 137614, 137619, 137625, 137630, 137636, 137642, + 137647, 137653, 137658, 137664, 137670, 137676, 137682, 137688, 137694, + 137700, 137705, 137710, 137716, 137722, 137727, 137731, 137735, 137739, + 137743, 137747, 137751, 137755, 137759, 137763, 137768, 137773, 137778, + 137783, 137788, 137793, 137798, 137803, 137808, 137813, 137820, 137827, + 137834, 137838, 137844, 137849, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137848, 137851, 137855, - 137859, 137863, 137866, 137870, 137875, 137879, 137883, 137887, 137890, - 137894, 137899, 137903, 137907, 137911, 137914, 137918, 137923, 137928, - 137932, 137936, 137939, 137943, 137947, 137951, 137955, 137959, 137963, - 137967, 137970, 137974, 137978, 137982, 137986, 137990, 137994, 138000, - 138003, 138007, 138011, 138015, 138019, 138023, 138027, 138031, 138035, - 138039, 138044, 138049, 138055, 138059, 138063, 138067, 138071, 138075, - 138079, 138084, 138087, 138091, 138095, 138099, 138103, 138109, 138113, - 138117, 138121, 138125, 138129, 138133, 138137, 138141, 138145, 138149, - 0, 0, 0, 0, 138153, 138158, 138162, 138166, 138172, 138178, 138182, - 138187, 138192, 138197, 138202, 138206, 138211, 138216, 138221, 138225, - 138230, 138235, 138240, 138244, 138249, 138254, 138259, 138264, 138269, - 138274, 138279, 138284, 138288, 138293, 138298, 138303, 138308, 138313, - 138318, 138323, 138328, 138333, 138338, 138343, 138350, 138355, 138362, - 138367, 138372, 138377, 138382, 138387, 138392, 138397, 138402, 138407, - 138412, 138417, 138422, 138427, 138432, 0, 0, 0, 0, 0, 0, 0, 138437, - 138441, 138447, 138450, 138453, 138457, 138461, 138465, 138469, 138473, - 138477, 138481, 138487, 138493, 138499, 138505, 138511, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137855, 137858, 137862, + 137866, 137870, 137873, 137877, 137882, 137886, 137890, 137894, 137897, + 137901, 137906, 137910, 137914, 137918, 137921, 137925, 137930, 137935, + 137939, 137943, 137946, 137950, 137954, 137958, 137962, 137966, 137970, + 137974, 137977, 137981, 137985, 137989, 137993, 137997, 138001, 138007, + 138010, 138014, 138018, 138022, 138026, 138030, 138034, 138038, 138042, + 138046, 138051, 138056, 138062, 138066, 138070, 138074, 138078, 138082, + 138086, 138091, 138094, 138098, 138102, 138106, 138110, 138116, 138120, + 138124, 138128, 138132, 138136, 138140, 138144, 138148, 138152, 138156, + 0, 0, 0, 0, 138160, 138165, 138169, 138173, 138179, 138185, 138189, + 138194, 138199, 138204, 138209, 138213, 138218, 138223, 138228, 138232, + 138237, 138242, 138247, 138251, 138256, 138261, 138266, 138271, 138276, + 138281, 138286, 138291, 138295, 138300, 138305, 138310, 138315, 138320, + 138325, 138330, 138335, 138340, 138345, 138350, 138357, 138362, 138369, + 138374, 138379, 138384, 138389, 138394, 138399, 138404, 138409, 138414, + 138419, 138424, 138429, 138434, 138439, 0, 0, 0, 0, 0, 0, 0, 138444, + 138448, 138454, 138457, 138460, 138464, 138468, 138472, 138476, 138480, + 138484, 138488, 138494, 138500, 138506, 138512, 138518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138517, 138521, 138525, 138531, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138524, 138528, 138532, 138538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 138537, 138540, 138543, 138546, 138549, 138552, 138555, 138558, 138561, - 138564, 138567, 138570, 138573, 138576, 138579, 138582, 138585, 138588, - 138591, 138594, 138597, 138600, 138603, 138606, 138609, 138612, 138615, - 138618, 138621, 138624, 138627, 138630, 138633, 138636, 138639, 138642, - 138645, 138648, 138651, 138654, 138657, 138660, 138663, 138666, 138669, - 138672, 138675, 138678, 138681, 138684, 138687, 138690, 138693, 138696, - 138699, 138702, 138705, 138708, 138711, 138714, 138717, 138720, 138723, - 138726, 138729, 138732, 138735, 138738, 138741, 138744, 138747, 138750, - 138753, 138756, 138759, 138762, 138765, 138768, 138771, 138774, 138777, - 138780, 138783, 138786, 138789, 138792, 138795, 138798, 138801, 138804, - 138807, 138810, 138813, 138816, 138819, 138822, 138825, 138828, 138831, - 138834, 138837, 138840, 138843, 138846, 138849, 138852, 138855, 138858, - 138861, 138864, 138867, 138870, 138873, 138876, 138879, 138882, 138885, - 138888, 138891, 138894, 138897, 138900, 138903, 138906, 138909, 138912, - 138915, 138918, 138921, 138924, 138927, 138930, 138933, 138936, 138939, - 138942, 138945, 138948, 138951, 138954, 138957, 138960, 138963, 138966, - 138969, 138972, 138975, 138978, 138981, 138984, 138987, 138990, 138993, - 138996, 138999, 139002, 139005, 139008, 139011, 139014, 139017, 139020, - 139023, 139026, 139029, 139032, 139035, 139038, 139041, 139044, 139047, - 139050, 139053, 139056, 139059, 139062, 139065, 139068, 139071, 139074, - 139077, 139080, 139083, 139086, 139089, 139092, 139095, 139098, 139101, - 139104, 139107, 139110, 139113, 139116, 139119, 139122, 139125, 139128, - 139131, 139134, 139137, 139140, 139143, 139146, 139149, 139152, 139155, - 139158, 139161, 139164, 139167, 139170, 139173, 139176, 139179, 139182, - 139185, 139188, 139191, 139194, 139197, 139200, 139203, 139206, 139209, - 139212, 139215, 139218, 139221, 139224, 139227, 139230, 139233, 139236, - 139239, 139242, 139245, 139248, 139251, 139254, 139257, 139260, 139263, - 139266, 139269, 139272, 139275, 139278, 139281, 139284, 139287, 139290, - 139293, 139296, 139299, 139302, 139305, 139308, 139311, 139314, 139317, - 139320, 139323, 139326, 139329, 139332, 139335, 139338, 139341, 139344, - 139347, 139350, 139353, 139356, 139359, 139362, 139365, 139368, 139371, - 139374, 139377, 139380, 139383, 139386, 139389, 139392, 139395, 139398, - 139401, 139404, 139407, 139410, 139413, 139416, 139419, 139422, 139425, - 139428, 139431, 139434, 139437, 139440, 139443, 139446, 139449, 139452, - 139455, 139458, 139461, 139464, 139467, 139470, 139473, 139476, 139479, - 139482, 139485, 139488, 139491, 139494, 139497, 139500, 139503, 139506, - 139509, 139512, 139515, 139518, 139521, 139524, 139527, 139530, 139533, - 139536, 139539, 139542, 139545, 139548, 139551, 139554, 139557, 139560, - 139563, 139566, 139569, 139572, 139575, 139578, 139581, 139584, 139587, - 139590, 139593, 139596, 139599, 139602, 139605, 139608, 139611, 139614, - 139617, 139620, 139623, 139626, 139629, 139632, 139635, 139638, 139641, - 139644, 139647, 139650, 139653, 139656, 139659, 139662, 139665, 139668, - 139671, 139674, 139677, 139680, 139683, 139686, 139689, 139692, 139695, - 139698, 139701, 139704, 139707, 139710, 139713, 139716, 139719, 139722, - 139725, 139728, 139731, 139734, 139737, 139740, 139743, 139746, 139749, - 139752, 139755, 139758, 139761, 139764, 139767, 139770, 139773, 139776, - 139779, 139782, 139785, 139788, 139791, 139794, 139797, 139800, 139803, - 139806, 139809, 139812, 139815, 139818, 139821, 139824, 139827, 139830, - 139833, 139836, 139839, 139842, 139845, 139848, 139851, 139854, 139857, - 139860, 139863, 139866, 139869, 139872, 139875, 139878, 139881, 139884, - 139887, 139890, 139893, 139896, 139899, 139902, 139905, 139908, 139911, - 139914, 139917, 139920, 139923, 139926, 139929, 139932, 139935, 139938, - 139941, 139944, 139947, 139950, 139953, 139956, 139959, 139962, 139965, - 139968, 139971, 139974, 139977, 139980, 139983, 139986, 139989, 139992, - 139995, 139998, 140001, 140004, 140007, 140010, 140013, 140016, 140019, - 140022, 140025, 140028, 140031, 140034, 140037, 140040, 140043, 140046, - 140049, 140052, 140055, 140058, 140061, 140064, 140067, 140070, 140073, - 140076, 140079, 140082, 140085, 140088, 140091, 140094, 140097, 140100, - 140103, 140106, 140109, 140112, 140115, 140118, 140121, 140124, 140127, - 140130, 140133, 140136, 140139, 140142, 140145, 140148, 140151, 140154, - 140157, 140160, 140163, 140166, 140169, 140172, 140175, 140178, 140181, - 140184, 140187, 140190, 140193, 140196, 140199, 140202, 140205, 140208, - 140211, 140214, 140217, 140220, 140223, 140226, 140229, 140232, 140235, - 140238, 140241, 140244, 140247, 140250, 140253, 140256, 140259, 140262, - 140265, 140268, 140271, 140274, 140277, 140280, 140283, 140286, 140289, - 140292, 140295, 140298, 140301, 140304, 140307, 140310, 140313, 140316, - 140319, 140322, 140325, 140328, 140331, 140334, 140337, 140340, 140343, - 140346, 140349, 140352, 140355, 140358, 140361, 140364, 140367, 140370, - 140373, 140376, 140379, 140382, 140385, 140388, 140391, 140394, 140397, - 140400, 140403, 140406, 140409, 140412, 140415, 140418, 140421, 140424, - 140427, 140430, 140433, 140436, 140439, 140442, 140445, 140448, 140451, - 140454, 140457, 140460, 140463, 140466, 140469, 140472, 140475, 140478, - 140481, 140484, 140487, 140490, 140493, 140496, 140499, 140502, 140505, - 140508, 140511, 140514, 140517, 140520, 140523, 140526, 140529, 140532, - 140535, 140538, 140541, 140544, 140547, 140550, 140553, 140556, 140559, - 140562, 140565, 140568, 140571, 140574, 140577, 140580, 140583, 140586, - 140589, 140592, 140595, 140598, 140601, 140604, 140607, 140610, 140613, - 140616, 140619, 140622, 140625, 140628, 140631, 140634, 140637, 140640, - 140643, 140646, 140649, 140652, 140655, 140658, 140661, 140664, 140667, - 140670, 140673, 140676, 140679, 140682, 140685, 140688, 140691, 140694, - 140697, 140700, 140703, 140706, 140709, 140712, 140715, 140718, 140721, - 140724, 140727, 140730, 140733, 140736, 140739, 140742, 140745, 140748, - 140751, 140754, 140757, 140760, 140763, 140766, 140769, 140772, 140775, - 140778, 140781, 140784, 140787, 140790, 140793, 140796, 140799, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140802, 140807, 140813, 140817, 140821, - 140825, 140829, 140833, 140837, 140841, 140845, 140849, 140853, 140857, - 140861, 140865, 140869, 140873, 140877, 140881, 140885, 140889, 140893, - 140897, 140901, 140905, 140909, 140913, 140917, 140921, 140925, 140929, - 140933, 140937, 140941, 140945, 140949, 140953, 140957, 140961, 140965, - 140969, 140973, 140977, 140981, 140985, 140989, 140993, 140997, 141001, - 141005, 141009, 141013, 141017, 141021, 141025, 141029, 141033, 141037, - 141041, 141045, 141049, 141053, 141057, 141061, 141065, 141069, 141073, - 141077, 141081, 141085, 141089, 141093, 141097, 141101, 141105, 141109, - 141113, 141117, 141121, 141125, 141129, 141133, 141137, 141141, 141145, - 141149, 141153, 141157, 141161, 141165, 141169, 141173, 141177, 141181, - 141185, 141189, 141193, 141197, 141201, 141205, 141209, 141213, 141217, - 141221, 141225, 141229, 141233, 141237, 141241, 141245, 141249, 141253, - 141257, 141261, 141265, 141269, 141273, 141277, 141281, 141285, 141289, - 141293, 141297, 141301, 141305, 141309, 141313, 141317, 141321, 141325, - 141329, 141333, 141337, 141341, 141345, 141349, 141353, 141357, 141361, - 141365, 141369, 141373, 141377, 141381, 141385, 141389, 141393, 141397, - 141401, 141405, 141409, 141413, 141417, 141421, 141425, 141429, 141433, - 141437, 141441, 141445, 141449, 141453, 141457, 141461, 141465, 141469, - 141473, 141477, 141481, 141485, 141489, 141493, 141497, 141501, 141505, - 141509, 141513, 141517, 141521, 141525, 141529, 141533, 141537, 141541, - 141545, 141549, 141553, 141557, 141561, 141565, 141569, 141573, 141577, - 141581, 141585, 141589, 141593, 141597, 141601, 141605, 141609, 141613, - 141617, 141621, 141625, 141629, 141633, 141637, 141641, 141645, 141649, - 141653, 141657, 141661, 141665, 141669, 141673, 141677, 141681, 141685, - 141689, 141693, 141697, 141701, 141705, 141709, 141713, 141717, 141721, - 141725, 141729, 141733, 141737, 141741, 141745, 141749, 141753, 141757, - 141761, 141765, 141769, 141773, 141777, 141781, 141785, 141789, 141793, - 141797, 141801, 141805, 141809, 141813, 141817, 141821, 141825, 141829, - 141833, 141837, 141841, 141845, 141849, 141853, 141857, 141861, 141865, - 141869, 141873, 141877, 141881, 141885, 141889, 141893, 141897, 141901, - 141905, 141909, 141913, 141917, 141921, 141925, 141929, 141933, 141937, - 141941, 141945, 141949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 138544, 138547, 138550, 138553, 138556, 138559, 138562, 138565, 138568, + 138571, 138574, 138577, 138580, 138583, 138586, 138589, 138592, 138595, + 138598, 138601, 138604, 138607, 138610, 138613, 138616, 138619, 138622, + 138625, 138628, 138631, 138634, 138637, 138640, 138643, 138646, 138649, + 138652, 138655, 138658, 138661, 138664, 138667, 138670, 138673, 138676, + 138679, 138682, 138685, 138688, 138691, 138694, 138697, 138700, 138703, + 138706, 138709, 138712, 138715, 138718, 138721, 138724, 138727, 138730, + 138733, 138736, 138739, 138742, 138745, 138748, 138751, 138754, 138757, + 138760, 138763, 138766, 138769, 138772, 138775, 138778, 138781, 138784, + 138787, 138790, 138793, 138796, 138799, 138802, 138805, 138808, 138811, + 138814, 138817, 138820, 138823, 138826, 138829, 138832, 138835, 138838, + 138841, 138844, 138847, 138850, 138853, 138856, 138859, 138862, 138865, + 138868, 138871, 138874, 138877, 138880, 138883, 138886, 138889, 138892, + 138895, 138898, 138901, 138904, 138907, 138910, 138913, 138916, 138919, + 138922, 138925, 138928, 138931, 138934, 138937, 138940, 138943, 138946, + 138949, 138952, 138955, 138958, 138961, 138964, 138967, 138970, 138973, + 138976, 138979, 138982, 138985, 138988, 138991, 138994, 138997, 139000, + 139003, 139006, 139009, 139012, 139015, 139018, 139021, 139024, 139027, + 139030, 139033, 139036, 139039, 139042, 139045, 139048, 139051, 139054, + 139057, 139060, 139063, 139066, 139069, 139072, 139075, 139078, 139081, + 139084, 139087, 139090, 139093, 139096, 139099, 139102, 139105, 139108, + 139111, 139114, 139117, 139120, 139123, 139126, 139129, 139132, 139135, + 139138, 139141, 139144, 139147, 139150, 139153, 139156, 139159, 139162, + 139165, 139168, 139171, 139174, 139177, 139180, 139183, 139186, 139189, + 139192, 139195, 139198, 139201, 139204, 139207, 139210, 139213, 139216, + 139219, 139222, 139225, 139228, 139231, 139234, 139237, 139240, 139243, + 139246, 139249, 139252, 139255, 139258, 139261, 139264, 139267, 139270, + 139273, 139276, 139279, 139282, 139285, 139288, 139291, 139294, 139297, + 139300, 139303, 139306, 139309, 139312, 139315, 139318, 139321, 139324, + 139327, 139330, 139333, 139336, 139339, 139342, 139345, 139348, 139351, + 139354, 139357, 139360, 139363, 139366, 139369, 139372, 139375, 139378, + 139381, 139384, 139387, 139390, 139393, 139396, 139399, 139402, 139405, + 139408, 139411, 139414, 139417, 139420, 139423, 139426, 139429, 139432, + 139435, 139438, 139441, 139444, 139447, 139450, 139453, 139456, 139459, + 139462, 139465, 139468, 139471, 139474, 139477, 139480, 139483, 139486, + 139489, 139492, 139495, 139498, 139501, 139504, 139507, 139510, 139513, + 139516, 139519, 139522, 139525, 139528, 139531, 139534, 139537, 139540, + 139543, 139546, 139549, 139552, 139555, 139558, 139561, 139564, 139567, + 139570, 139573, 139576, 139579, 139582, 139585, 139588, 139591, 139594, + 139597, 139600, 139603, 139606, 139609, 139612, 139615, 139618, 139621, + 139624, 139627, 139630, 139633, 139636, 139639, 139642, 139645, 139648, + 139651, 139654, 139657, 139660, 139663, 139666, 139669, 139672, 139675, + 139678, 139681, 139684, 139687, 139690, 139693, 139696, 139699, 139702, + 139705, 139708, 139711, 139714, 139717, 139720, 139723, 139726, 139729, + 139732, 139735, 139738, 139741, 139744, 139747, 139750, 139753, 139756, + 139759, 139762, 139765, 139768, 139771, 139774, 139777, 139780, 139783, + 139786, 139789, 139792, 139795, 139798, 139801, 139804, 139807, 139810, + 139813, 139816, 139819, 139822, 139825, 139828, 139831, 139834, 139837, + 139840, 139843, 139846, 139849, 139852, 139855, 139858, 139861, 139864, + 139867, 139870, 139873, 139876, 139879, 139882, 139885, 139888, 139891, + 139894, 139897, 139900, 139903, 139906, 139909, 139912, 139915, 139918, + 139921, 139924, 139927, 139930, 139933, 139936, 139939, 139942, 139945, + 139948, 139951, 139954, 139957, 139960, 139963, 139966, 139969, 139972, + 139975, 139978, 139981, 139984, 139987, 139990, 139993, 139996, 139999, + 140002, 140005, 140008, 140011, 140014, 140017, 140020, 140023, 140026, + 140029, 140032, 140035, 140038, 140041, 140044, 140047, 140050, 140053, + 140056, 140059, 140062, 140065, 140068, 140071, 140074, 140077, 140080, + 140083, 140086, 140089, 140092, 140095, 140098, 140101, 140104, 140107, + 140110, 140113, 140116, 140119, 140122, 140125, 140128, 140131, 140134, + 140137, 140140, 140143, 140146, 140149, 140152, 140155, 140158, 140161, + 140164, 140167, 140170, 140173, 140176, 140179, 140182, 140185, 140188, + 140191, 140194, 140197, 140200, 140203, 140206, 140209, 140212, 140215, + 140218, 140221, 140224, 140227, 140230, 140233, 140236, 140239, 140242, + 140245, 140248, 140251, 140254, 140257, 140260, 140263, 140266, 140269, + 140272, 140275, 140278, 140281, 140284, 140287, 140290, 140293, 140296, + 140299, 140302, 140305, 140308, 140311, 140314, 140317, 140320, 140323, + 140326, 140329, 140332, 140335, 140338, 140341, 140344, 140347, 140350, + 140353, 140356, 140359, 140362, 140365, 140368, 140371, 140374, 140377, + 140380, 140383, 140386, 140389, 140392, 140395, 140398, 140401, 140404, + 140407, 140410, 140413, 140416, 140419, 140422, 140425, 140428, 140431, + 140434, 140437, 140440, 140443, 140446, 140449, 140452, 140455, 140458, + 140461, 140464, 140467, 140470, 140473, 140476, 140479, 140482, 140485, + 140488, 140491, 140494, 140497, 140500, 140503, 140506, 140509, 140512, + 140515, 140518, 140521, 140524, 140527, 140530, 140533, 140536, 140539, + 140542, 140545, 140548, 140551, 140554, 140557, 140560, 140563, 140566, + 140569, 140572, 140575, 140578, 140581, 140584, 140587, 140590, 140593, + 140596, 140599, 140602, 140605, 140608, 140611, 140614, 140617, 140620, + 140623, 140626, 140629, 140632, 140635, 140638, 140641, 140644, 140647, + 140650, 140653, 140656, 140659, 140662, 140665, 140668, 140671, 140674, + 140677, 140680, 140683, 140686, 140689, 140692, 140695, 140698, 140701, + 140704, 140707, 140710, 140713, 140716, 140719, 140722, 140725, 140728, + 140731, 140734, 140737, 140740, 140743, 140746, 140749, 140752, 140755, + 140758, 140761, 140764, 140767, 140770, 140773, 140776, 140779, 140782, + 140785, 140788, 140791, 140794, 140797, 140800, 140803, 140806, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140809, 140814, 140820, 140824, 140828, + 140832, 140836, 140840, 140844, 140848, 140852, 140856, 140860, 140864, + 140868, 140872, 140876, 140880, 140884, 140888, 140892, 140896, 140900, + 140904, 140908, 140912, 140916, 140920, 140924, 140928, 140932, 140936, + 140940, 140944, 140948, 140952, 140956, 140960, 140964, 140968, 140972, + 140976, 140980, 140984, 140988, 140992, 140996, 141000, 141004, 141008, + 141012, 141016, 141020, 141024, 141028, 141032, 141036, 141040, 141044, + 141048, 141052, 141056, 141060, 141064, 141068, 141072, 141076, 141080, + 141084, 141088, 141092, 141096, 141100, 141104, 141108, 141112, 141116, + 141120, 141124, 141128, 141132, 141136, 141140, 141144, 141148, 141152, + 141156, 141160, 141164, 141168, 141172, 141176, 141180, 141184, 141188, + 141192, 141196, 141200, 141204, 141208, 141212, 141216, 141220, 141224, + 141228, 141232, 141236, 141240, 141244, 141248, 141252, 141256, 141260, + 141264, 141268, 141272, 141276, 141280, 141284, 141288, 141292, 141296, + 141300, 141304, 141308, 141312, 141316, 141320, 141324, 141328, 141332, + 141336, 141340, 141344, 141348, 141352, 141356, 141360, 141364, 141368, + 141372, 141376, 141380, 141384, 141388, 141392, 141396, 141400, 141404, + 141408, 141412, 141416, 141420, 141424, 141428, 141432, 141436, 141440, + 141444, 141448, 141452, 141456, 141460, 141464, 141468, 141472, 141476, + 141480, 141484, 141488, 141492, 141496, 141500, 141504, 141508, 141512, + 141516, 141520, 141524, 141528, 141532, 141536, 141540, 141544, 141548, + 141552, 141556, 141560, 141564, 141568, 141572, 141576, 141580, 141584, + 141588, 141592, 141596, 141600, 141604, 141608, 141612, 141616, 141620, + 141624, 141628, 141632, 141636, 141640, 141644, 141648, 141652, 141656, + 141660, 141664, 141668, 141672, 141676, 141680, 141684, 141688, 141692, + 141696, 141700, 141704, 141708, 141712, 141716, 141720, 141724, 141728, + 141732, 141736, 141740, 141744, 141748, 141752, 141756, 141760, 141764, + 141768, 141772, 141776, 141780, 141784, 141788, 141792, 141796, 141800, + 141804, 141808, 141812, 141816, 141820, 141824, 141828, 141832, 141836, + 141840, 141844, 141848, 141852, 141856, 141860, 141864, 141868, 141872, + 141876, 141880, 141884, 141888, 141892, 141896, 141900, 141904, 141908, + 141912, 141916, 141920, 141924, 141928, 141932, 141936, 141940, 141944, + 141948, 141952, 141956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 141953, 141958, 141963, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141968, 141973, 141978, 141983, 0, 0, 0, 0, - 0, 0, 0, 0, 141988, 141991, 141994, 141997, 142000, 142003, 142006, - 142009, 142012, 142015, 142018, 142021, 142024, 142027, 142030, 142033, - 142036, 142039, 142042, 142045, 142048, 142051, 142054, 142057, 142060, - 142063, 142066, 142069, 142072, 142075, 142078, 142081, 142084, 142087, - 142090, 142093, 142096, 142099, 142102, 142105, 142108, 142111, 142114, - 142117, 142120, 142123, 142126, 142129, 142132, 142135, 142138, 142141, - 142144, 142147, 142150, 142153, 142156, 142159, 142162, 142165, 142168, - 142171, 142174, 142177, 142180, 142183, 142186, 142189, 142192, 142195, - 142198, 142201, 142204, 142207, 142210, 142213, 142216, 142219, 142222, - 142225, 142228, 142231, 142234, 142237, 142240, 142243, 142246, 142249, - 142252, 142255, 142258, 142261, 142264, 142267, 142270, 142273, 142276, - 142279, 142282, 142285, 142288, 142291, 142294, 142297, 142300, 142303, - 142306, 142309, 142312, 142315, 142318, 142321, 142324, 142327, 142330, - 142333, 142336, 142339, 142342, 142345, 142348, 142351, 142354, 142357, - 142360, 142363, 142366, 142369, 142372, 142375, 142378, 142381, 142384, - 142387, 142390, 142393, 142396, 142399, 142402, 142405, 142408, 142411, - 142414, 142417, 142420, 142423, 142426, 142429, 142432, 142435, 142438, - 142441, 142444, 142447, 142450, 142453, 142456, 142459, 142462, 142465, - 142468, 142471, 142474, 142477, 142480, 142483, 142486, 142489, 142492, - 142495, 142498, 142501, 142504, 142507, 142510, 142513, 142516, 142519, - 142522, 142525, 142528, 142531, 142534, 142537, 142540, 142543, 142546, - 142549, 142552, 142555, 142558, 142561, 142564, 142567, 142570, 142573, - 142576, 142579, 142582, 142585, 142588, 142591, 142594, 142597, 142600, - 142603, 142606, 142609, 142612, 142615, 142618, 142621, 142624, 142627, - 142630, 142633, 142636, 142639, 142642, 142645, 142648, 142651, 142654, - 142657, 142660, 142663, 142666, 142669, 142672, 142675, 142678, 142681, - 142684, 142687, 142690, 142693, 142696, 142699, 142702, 142705, 142708, - 142711, 142714, 142717, 142720, 142723, 142726, 142729, 142732, 142735, - 142738, 142741, 142744, 142747, 142750, 142753, 142756, 142759, 142762, - 142765, 142768, 142771, 142774, 142777, 142780, 142783, 142786, 142789, - 142792, 142795, 142798, 142801, 142804, 142807, 142810, 142813, 142816, - 142819, 142822, 142825, 142828, 142831, 142834, 142837, 142840, 142843, - 142846, 142849, 142852, 142855, 142858, 142861, 142864, 142867, 142870, - 142873, 142876, 142879, 142882, 142885, 142888, 142891, 142894, 142897, - 142900, 142903, 142906, 142909, 142912, 142915, 142918, 142921, 142924, - 142927, 142930, 142933, 142936, 142939, 142942, 142945, 142948, 142951, - 142954, 142957, 142960, 142963, 142966, 142969, 142972, 142975, 142978, - 142981, 142984, 142987, 142990, 142993, 142996, 142999, 143002, 143005, - 143008, 143011, 143014, 143017, 143020, 143023, 143026, 143029, 143032, - 143035, 143038, 143041, 143044, 143047, 143050, 143053, 143056, 143059, - 143062, 143065, 143068, 143071, 143074, 143077, 143080, 143083, 143086, - 143089, 143092, 143095, 143098, 143101, 143104, 143107, 143110, 143113, - 143116, 143119, 143122, 143125, 143128, 143131, 143134, 143137, 143140, - 143143, 143146, 143149, 143152, 143155, 143158, 143161, 143164, 143167, - 143170, 143173, 0, 0, 0, 0, 143176, 143180, 143184, 143188, 143192, - 143196, 143200, 143203, 143207, 143211, 143215, 143219, 143222, 143228, - 143234, 143240, 143246, 143252, 143256, 143262, 143266, 143270, 143276, - 143280, 143284, 143288, 143292, 143296, 143300, 143304, 143310, 143316, - 143322, 143328, 143335, 143342, 143349, 143360, 143367, 143374, 143380, - 143386, 143392, 143398, 143406, 143414, 143422, 143430, 143439, 143445, - 143453, 143459, 143466, 143472, 143479, 143485, 143493, 143497, 143501, - 143506, 143512, 143518, 143526, 143534, 143540, 143547, 143550, 143556, - 143560, 143563, 143567, 143570, 143573, 143577, 143582, 143586, 143590, - 143596, 143601, 143607, 143611, 143615, 143618, 143622, 143626, 143631, - 143635, 143640, 143644, 143649, 143653, 143657, 143661, 143665, 143669, - 143673, 143677, 143681, 143686, 143691, 143696, 143701, 143707, 143713, - 143719, 143725, 143731, 0, 0, 0, 0, 0, 143736, 143744, 143753, 143761, - 143768, 143776, 143783, 143790, 143799, 143806, 143813, 143821, 143829, - 0, 0, 0, 143837, 143842, 143849, 143855, 143862, 143868, 143874, 143880, - 143886, 0, 0, 0, 0, 0, 0, 0, 143892, 143897, 143904, 143910, 143917, - 143923, 143929, 143935, 143941, 143947, 0, 0, 143952, 143958, 143964, - 143967, 143976, 143983, 143991, 143998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 141960, 141965, 141970, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141975, 141980, 141985, 141990, 0, 0, 0, 0, + 0, 0, 0, 0, 141995, 141998, 142001, 142004, 142007, 142010, 142013, + 142016, 142019, 142022, 142025, 142028, 142031, 142034, 142037, 142040, + 142043, 142046, 142049, 142052, 142055, 142058, 142061, 142064, 142067, + 142070, 142073, 142076, 142079, 142082, 142085, 142088, 142091, 142094, + 142097, 142100, 142103, 142106, 142109, 142112, 142115, 142118, 142121, + 142124, 142127, 142130, 142133, 142136, 142139, 142142, 142145, 142148, + 142151, 142154, 142157, 142160, 142163, 142166, 142169, 142172, 142175, + 142178, 142181, 142184, 142187, 142190, 142193, 142196, 142199, 142202, + 142205, 142208, 142211, 142214, 142217, 142220, 142223, 142226, 142229, + 142232, 142235, 142238, 142241, 142244, 142247, 142250, 142253, 142256, + 142259, 142262, 142265, 142268, 142271, 142274, 142277, 142280, 142283, + 142286, 142289, 142292, 142295, 142298, 142301, 142304, 142307, 142310, + 142313, 142316, 142319, 142322, 142325, 142328, 142331, 142334, 142337, + 142340, 142343, 142346, 142349, 142352, 142355, 142358, 142361, 142364, + 142367, 142370, 142373, 142376, 142379, 142382, 142385, 142388, 142391, + 142394, 142397, 142400, 142403, 142406, 142409, 142412, 142415, 142418, + 142421, 142424, 142427, 142430, 142433, 142436, 142439, 142442, 142445, + 142448, 142451, 142454, 142457, 142460, 142463, 142466, 142469, 142472, + 142475, 142478, 142481, 142484, 142487, 142490, 142493, 142496, 142499, + 142502, 142505, 142508, 142511, 142514, 142517, 142520, 142523, 142526, + 142529, 142532, 142535, 142538, 142541, 142544, 142547, 142550, 142553, + 142556, 142559, 142562, 142565, 142568, 142571, 142574, 142577, 142580, + 142583, 142586, 142589, 142592, 142595, 142598, 142601, 142604, 142607, + 142610, 142613, 142616, 142619, 142622, 142625, 142628, 142631, 142634, + 142637, 142640, 142643, 142646, 142649, 142652, 142655, 142658, 142661, + 142664, 142667, 142670, 142673, 142676, 142679, 142682, 142685, 142688, + 142691, 142694, 142697, 142700, 142703, 142706, 142709, 142712, 142715, + 142718, 142721, 142724, 142727, 142730, 142733, 142736, 142739, 142742, + 142745, 142748, 142751, 142754, 142757, 142760, 142763, 142766, 142769, + 142772, 142775, 142778, 142781, 142784, 142787, 142790, 142793, 142796, + 142799, 142802, 142805, 142808, 142811, 142814, 142817, 142820, 142823, + 142826, 142829, 142832, 142835, 142838, 142841, 142844, 142847, 142850, + 142853, 142856, 142859, 142862, 142865, 142868, 142871, 142874, 142877, + 142880, 142883, 142886, 142889, 142892, 142895, 142898, 142901, 142904, + 142907, 142910, 142913, 142916, 142919, 142922, 142925, 142928, 142931, + 142934, 142937, 142940, 142943, 142946, 142949, 142952, 142955, 142958, + 142961, 142964, 142967, 142970, 142973, 142976, 142979, 142982, 142985, + 142988, 142991, 142994, 142997, 143000, 143003, 143006, 143009, 143012, + 143015, 143018, 143021, 143024, 143027, 143030, 143033, 143036, 143039, + 143042, 143045, 143048, 143051, 143054, 143057, 143060, 143063, 143066, + 143069, 143072, 143075, 143078, 143081, 143084, 143087, 143090, 143093, + 143096, 143099, 143102, 143105, 143108, 143111, 143114, 143117, 143120, + 143123, 143126, 143129, 143132, 143135, 143138, 143141, 143144, 143147, + 143150, 143153, 143156, 143159, 143162, 143165, 143168, 143171, 143174, + 143177, 143180, 0, 0, 0, 0, 143183, 143187, 143191, 143195, 143199, + 143203, 143207, 143210, 143214, 143218, 143222, 143226, 143229, 143235, + 143241, 143247, 143253, 143259, 143263, 143269, 143273, 143277, 143283, + 143287, 143291, 143295, 143299, 143303, 143307, 143311, 143317, 143323, + 143329, 143335, 143342, 143349, 143356, 143367, 143374, 143381, 143387, + 143393, 143399, 143405, 143413, 143421, 143429, 143437, 143446, 143452, + 143460, 143466, 143473, 143479, 143486, 143492, 143500, 143504, 143508, + 143513, 143519, 143525, 143533, 143541, 143547, 143554, 143557, 143563, + 143567, 143570, 143574, 143577, 143580, 143584, 143589, 143593, 143597, + 143603, 143608, 143614, 143618, 143622, 143625, 143629, 143633, 143638, + 143642, 143647, 143651, 143656, 143660, 143664, 143668, 143672, 143676, + 143680, 143684, 143688, 143693, 143698, 143703, 143708, 143714, 143720, + 143726, 143732, 143738, 0, 0, 0, 0, 0, 143743, 143751, 143760, 143768, + 143775, 143783, 143790, 143797, 143806, 143813, 143820, 143828, 143836, + 0, 0, 0, 143844, 143849, 143856, 143862, 143869, 143875, 143881, 143887, + 143893, 0, 0, 0, 0, 0, 0, 0, 143899, 143904, 143911, 143917, 143924, + 143930, 143936, 143942, 143948, 143954, 0, 0, 143959, 143965, 143971, + 143974, 143983, 143990, 143998, 144005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 144005, 144010, 144015, 144020, 144027, - 144034, 144041, 144048, 144053, 144058, 144063, 144068, 144075, 144080, - 144087, 144094, 144099, 144104, 144109, 144116, 144121, 144126, 144133, - 144140, 144145, 144150, 144155, 144162, 144169, 144176, 144181, 144186, - 144193, 144200, 144207, 144214, 144219, 144224, 144229, 144236, 144241, - 144246, 144251, 144258, 144267, 144274, 144279, 144284, 144289, 144294, - 144299, 144304, 144313, 144320, 144325, 144332, 144339, 144344, 144349, - 144354, 144361, 144366, 144373, 144380, 144385, 144390, 144395, 144402, - 144409, 144414, 144419, 144426, 144433, 144440, 144445, 144450, 144455, - 144460, 144467, 144476, 144485, 144490, 144497, 144506, 144511, 144516, - 144521, 144526, 144533, 144540, 144547, 144554, 144559, 144564, 144569, - 144576, 144583, 144590, 144595, 144600, 144607, 144612, 144619, 144624, - 144631, 144636, 144643, 144650, 144655, 144660, 144665, 144670, 144675, - 144680, 144685, 144690, 144695, 144702, 144709, 144716, 144723, 144730, - 144739, 144744, 144749, 144756, 144763, 144768, 144775, 144782, 144789, - 144796, 144803, 144810, 144815, 144820, 144825, 144830, 144835, 144844, - 144853, 144862, 144871, 144880, 144889, 144898, 144907, 144912, 144923, - 144934, 144943, 144948, 144953, 144958, 144963, 144972, 144979, 144986, - 144993, 145000, 145007, 145014, 145023, 145032, 145043, 145052, 145063, - 145072, 145079, 145088, 145099, 145108, 145117, 145126, 145135, 145142, - 145149, 145156, 145165, 145174, 145185, 145194, 145203, 145214, 145219, - 145224, 145235, 145243, 145252, 145261, 145270, 145281, 145290, 145299, - 145310, 145321, 145332, 145343, 145354, 145365, 145372, 145379, 145386, - 145393, 145404, 145413, 145420, 145427, 145434, 145445, 145456, 145467, - 145478, 145489, 145500, 145511, 145522, 145529, 145536, 145545, 145554, - 145561, 145568, 145575, 145584, 145593, 145602, 145609, 145618, 145627, - 145636, 145643, 145650, 145655, 145661, 145668, 145675, 145682, 145689, - 145696, 145703, 145712, 145721, 145730, 145739, 145746, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 145755, 145761, 145766, 145771, 145778, 145784, 145790, - 145796, 145802, 145808, 145814, 145820, 145824, 145828, 145834, 145840, - 145846, 145850, 145855, 145860, 145864, 145868, 145871, 145877, 145883, - 145889, 145895, 145901, 145907, 145913, 145919, 145925, 145935, 145945, - 145951, 145957, 145967, 145977, 145983, 0, 0, 145989, 145997, 146002, - 146007, 146013, 146019, 146025, 146031, 146037, 146043, 146050, 146057, - 146063, 146069, 146075, 146081, 146087, 146093, 146099, 146105, 146110, - 146116, 146122, 146128, 146134, 146140, 146149, 146155, 146160, 146168, - 146175, 146182, 146191, 146200, 146209, 146218, 146227, 146236, 146245, - 146254, 146264, 146274, 146282, 146290, 146299, 146308, 146314, 146320, - 146326, 146332, 146340, 146348, 146352, 146358, 146363, 146369, 146375, - 146381, 146387, 146393, 146402, 146407, 146414, 146419, 146424, 146429, - 146435, 146441, 146447, 146454, 146459, 146464, 146469, 146474, 146479, - 146485, 146491, 146497, 146503, 146509, 146515, 146521, 146527, 146532, - 146537, 146542, 146547, 146552, 146557, 146562, 146567, 146573, 146579, - 146584, 146589, 146594, 146599, 146604, 146610, 146617, 146621, 146625, - 146629, 146633, 146637, 146641, 146645, 146649, 146657, 146667, 146671, - 146675, 146681, 146687, 146693, 146699, 146705, 146711, 146717, 146723, - 146729, 146735, 146741, 146747, 146753, 146759, 146763, 146767, 146774, - 146780, 146786, 146792, 146797, 146804, 146809, 146815, 146821, 146827, - 146833, 146838, 146842, 146848, 146852, 146856, 146860, 146866, 146872, - 146876, 146882, 146888, 146894, 146900, 146906, 146914, 146922, 146928, - 146934, 146940, 146946, 146958, 146970, 146984, 146996, 147008, 147022, - 147036, 147050, 147054, 147062, 147070, 147075, 147079, 147083, 147087, - 147091, 147095, 147099, 147103, 147109, 147115, 147121, 147127, 147135, - 147144, 147151, 147158, 147166, 147173, 147185, 147197, 147209, 147221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 144012, 144017, 144022, 144027, 144034, + 144041, 144048, 144055, 144060, 144065, 144070, 144075, 144082, 144087, + 144094, 144101, 144106, 144111, 144116, 144123, 144128, 144133, 144140, + 144147, 144152, 144157, 144162, 144169, 144176, 144183, 144188, 144193, + 144200, 144207, 144214, 144221, 144226, 144231, 144236, 144243, 144248, + 144253, 144258, 144265, 144274, 144281, 144286, 144291, 144296, 144301, + 144306, 144311, 144320, 144327, 144332, 144339, 144346, 144351, 144356, + 144361, 144368, 144373, 144380, 144387, 144392, 144397, 144402, 144409, + 144416, 144421, 144426, 144433, 144440, 144447, 144452, 144457, 144462, + 144467, 144474, 144483, 144492, 144497, 144504, 144513, 144518, 144523, + 144528, 144533, 144540, 144547, 144554, 144561, 144566, 144571, 144576, + 144583, 144590, 144597, 144602, 144607, 144614, 144619, 144626, 144631, + 144638, 144643, 144650, 144657, 144662, 144667, 144672, 144677, 144682, + 144687, 144692, 144697, 144702, 144709, 144716, 144723, 144730, 144737, + 144746, 144751, 144756, 144763, 144770, 144775, 144782, 144789, 144796, + 144803, 144810, 144817, 144822, 144827, 144832, 144837, 144842, 144851, + 144860, 144869, 144878, 144887, 144896, 144905, 144914, 144919, 144930, + 144941, 144950, 144955, 144960, 144965, 144970, 144979, 144986, 144993, + 145000, 145007, 145014, 145021, 145030, 145039, 145050, 145059, 145070, + 145079, 145086, 145095, 145106, 145115, 145124, 145133, 145142, 145149, + 145156, 145163, 145172, 145181, 145192, 145201, 145210, 145221, 145226, + 145231, 145242, 145250, 145259, 145268, 145277, 145288, 145297, 145306, + 145317, 145328, 145339, 145350, 145361, 145372, 145379, 145386, 145393, + 145400, 145411, 145420, 145427, 145434, 145441, 145452, 145463, 145474, + 145485, 145496, 145507, 145518, 145529, 145536, 145543, 145552, 145561, + 145568, 145575, 145582, 145591, 145600, 145609, 145616, 145625, 145634, + 145643, 145650, 145657, 145662, 145668, 145675, 145682, 145689, 145696, + 145703, 145710, 145719, 145728, 145737, 145746, 145753, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 145762, 145768, 145773, 145778, 145785, 145791, 145797, + 145803, 145809, 145815, 145821, 145827, 145831, 145835, 145841, 145847, + 145853, 145857, 145862, 145867, 145871, 145875, 145878, 145884, 145890, + 145896, 145902, 145908, 145914, 145920, 145926, 145932, 145942, 145952, + 145958, 145964, 145974, 145984, 145990, 0, 0, 145996, 146004, 146009, + 146014, 146020, 146026, 146032, 146038, 146044, 146050, 146057, 146064, + 146070, 146076, 146082, 146088, 146094, 146100, 146106, 146112, 146117, + 146123, 146129, 146135, 146141, 146147, 146156, 146162, 146167, 146175, + 146182, 146189, 146198, 146207, 146216, 146225, 146234, 146243, 146252, + 146261, 146271, 146281, 146289, 146297, 146306, 146315, 146321, 146327, + 146333, 146339, 146347, 146355, 146359, 146365, 146370, 146376, 146382, + 146388, 146394, 146400, 146409, 146414, 146421, 146426, 146431, 146436, + 146442, 146448, 146454, 146461, 146466, 146471, 146476, 146481, 146486, + 146492, 146498, 146504, 146510, 146516, 146522, 146528, 146534, 146539, + 146544, 146549, 146554, 146559, 146564, 146569, 146574, 146580, 146586, + 146591, 146596, 146601, 146606, 146611, 146617, 146624, 146628, 146632, + 146636, 146640, 146644, 146648, 146652, 146656, 146664, 146674, 146678, + 146682, 146688, 146694, 146700, 146706, 146712, 146718, 146724, 146730, + 146736, 146742, 146748, 146754, 146760, 146766, 146770, 146774, 146781, + 146787, 146793, 146799, 146804, 146811, 146816, 146822, 146828, 146834, + 146840, 146845, 146849, 146855, 146859, 146863, 146867, 146873, 146879, + 146883, 146889, 146895, 146901, 146907, 146913, 146921, 146929, 146935, + 146941, 146947, 146953, 146965, 146977, 146991, 147003, 147015, 147029, + 147043, 147057, 147061, 147069, 147077, 147082, 147086, 147090, 147094, + 147098, 147102, 147106, 147110, 147116, 147122, 147128, 147134, 147142, + 147151, 147158, 147165, 147173, 147180, 147192, 147204, 147216, 147228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 147228, 147235, 147242, 147249, 147256, 147263, 147270, 147277, 147284, - 147291, 147298, 147305, 147312, 147319, 147326, 147333, 147340, 147347, - 147354, 147361, 147368, 147375, 147382, 147389, 147396, 147403, 147410, - 147417, 147424, 147431, 147438, 147445, 147452, 147459, 147466, 147473, - 147480, 147487, 147494, 147501, 147508, 147515, 147522, 147529, 147536, - 147543, 147550, 147557, 147564, 147571, 147578, 147585, 147592, 147599, - 147606, 147613, 147620, 147627, 147634, 147641, 147648, 147655, 147662, - 147669, 147676, 147683, 147690, 147695, 147700, 147705, 0, 0, 0, 0, 0, 0, + 147235, 147242, 147249, 147256, 147263, 147270, 147277, 147284, 147291, + 147298, 147305, 147312, 147319, 147326, 147333, 147340, 147347, 147354, + 147361, 147368, 147375, 147382, 147389, 147396, 147403, 147410, 147417, + 147424, 147431, 147438, 147445, 147452, 147459, 147466, 147473, 147480, + 147487, 147494, 147501, 147508, 147515, 147522, 147529, 147536, 147543, + 147550, 147557, 147564, 147571, 147578, 147585, 147592, 147599, 147606, + 147613, 147620, 147627, 147634, 147641, 147648, 147655, 147662, 147669, + 147676, 147683, 147690, 147697, 147702, 147707, 147712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 147709, 147715, 147720, 147725, 147730, 147735, 147740, - 147745, 147750, 147755, 147760, 147766, 147772, 147778, 147784, 147790, - 147796, 147802, 147808, 147814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 147820, 147825, 147832, 147839, 147846, 147853, 147858, 147863, 147870, - 147875, 147880, 147887, 147892, 147897, 147902, 147909, 147918, 147923, - 147928, 147933, 147938, 147943, 147948, 147955, 147960, 147965, 147970, - 147975, 147980, 147985, 147990, 147995, 148000, 148005, 148010, 148015, - 148021, 148026, 148031, 148036, 148041, 148046, 148051, 148056, 148061, - 148066, 148075, 148080, 148089, 148094, 148099, 148104, 148109, 148114, - 148119, 148124, 148133, 148138, 148143, 148148, 148153, 148158, 148165, - 148170, 148177, 148182, 148187, 148192, 148197, 148202, 148207, 148212, - 148217, 148222, 148227, 148232, 148237, 148242, 148247, 148252, 148257, - 148262, 148267, 148272, 148281, 148286, 148291, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 148296, 148304, 148312, 148320, 148328, 148336, 148344, 148352, - 148360, 148368, 148376, 148384, 148392, 148400, 148408, 148416, 148424, - 148432, 148440, 148445, 148450, 148455, 148460, 148465, 148469, 0, 0, 0, - 0, 0, 0, 0, 148473, 148477, 148482, 148487, 148492, 148496, 148501, - 148506, 148511, 148515, 148520, 148525, 148529, 148534, 148539, 148543, - 148548, 148553, 148557, 148562, 148567, 148571, 148576, 148581, 148586, - 148591, 148596, 148600, 148605, 148610, 148615, 148619, 148624, 148629, - 148634, 148638, 148643, 148648, 148652, 148657, 148662, 148666, 148671, - 148676, 148680, 148685, 148690, 148694, 148699, 148704, 148709, 148714, - 148719, 148723, 148728, 148733, 148738, 148742, 148747, 148752, 148757, - 148761, 148766, 148771, 148775, 148780, 148785, 148789, 148794, 148799, - 148803, 148808, 148813, 148817, 148822, 148827, 148832, 148837, 148842, - 148846, 148851, 148856, 148861, 148865, 148870, 0, 148875, 148879, - 148884, 148889, 148893, 148898, 148903, 148907, 148912, 148917, 148921, - 148926, 148931, 148935, 148940, 148945, 148950, 148955, 148960, 148965, - 148971, 148977, 148983, 148988, 148994, 149000, 149006, 149011, 149017, - 149023, 149028, 149034, 149040, 149045, 149051, 149057, 149062, 149068, - 149074, 149079, 149085, 149091, 149097, 149103, 149109, 149114, 149120, - 149126, 149132, 149137, 149143, 149149, 149155, 149160, 149166, 149172, - 149177, 149183, 149189, 149194, 149200, 149206, 149211, 149217, 149223, - 149228, 149234, 149240, 149246, 149252, 149258, 0, 149262, 149267, 0, 0, - 149272, 0, 0, 149277, 149282, 0, 0, 149287, 149292, 149296, 149301, 0, - 149306, 149311, 149316, 149320, 149325, 149330, 149335, 149340, 149345, - 149349, 149354, 149359, 0, 149364, 0, 149369, 149374, 149378, 149383, - 149388, 149392, 149397, 0, 149402, 149407, 149412, 149416, 149421, - 149426, 149430, 149435, 149440, 149445, 149450, 149455, 149460, 149466, - 149472, 149478, 149483, 149489, 149495, 149501, 149506, 149512, 149518, - 149523, 149529, 149535, 149540, 149546, 149552, 149557, 149563, 149569, - 149574, 149580, 149586, 149592, 149598, 149604, 149609, 149615, 149621, - 149627, 149632, 149638, 149644, 149650, 149655, 149661, 149667, 149672, - 149678, 149684, 149689, 149695, 149701, 149706, 149712, 149718, 149723, - 149729, 149735, 149741, 149747, 149753, 149757, 0, 149762, 149767, - 149771, 149776, 0, 0, 149781, 149786, 149791, 149795, 149800, 149805, - 149809, 149814, 0, 149819, 149824, 149829, 149833, 149838, 149843, - 149848, 0, 149853, 149857, 149862, 149867, 149872, 149876, 149881, - 149886, 149891, 149895, 149900, 149905, 149909, 149914, 149919, 149923, - 149928, 149933, 149937, 149942, 149947, 149951, 149956, 149961, 149966, - 149971, 149976, 149981, 0, 149987, 149993, 149998, 150004, 0, 150010, - 150015, 150021, 150027, 150032, 0, 150038, 0, 0, 0, 150043, 150049, - 150055, 150060, 150066, 150072, 150078, 0, 150084, 150089, 150095, - 150101, 150107, 150112, 150118, 150124, 150130, 150135, 150141, 150147, - 150152, 150158, 150164, 150169, 150175, 150181, 150186, 150192, 150198, - 150203, 150209, 150215, 150221, 150227, 150233, 150238, 150244, 150250, - 150256, 150261, 150267, 150273, 150279, 150284, 150290, 150296, 150301, - 150307, 150313, 150318, 150324, 150330, 150335, 150341, 150347, 150352, - 150358, 150364, 150370, 150376, 150382, 150387, 150393, 150399, 150405, - 150410, 150416, 150422, 150428, 150433, 150439, 150445, 150450, 150456, - 150462, 150467, 150473, 150479, 150484, 150490, 150496, 150501, 150507, - 150513, 150519, 150525, 150531, 150535, 150540, 150545, 150550, 150554, - 150559, 150564, 150569, 150573, 150578, 150583, 150587, 150592, 150597, - 150601, 150606, 150611, 150615, 150620, 150625, 150629, 150634, 150639, - 150644, 150649, 150654, 150658, 150663, 150668, 150673, 150677, 150682, - 150687, 150692, 150696, 150701, 150706, 150710, 150715, 150720, 150724, - 150729, 150734, 150738, 150743, 150748, 150752, 150757, 150762, 150767, - 150772, 150777, 150782, 150788, 150794, 150800, 150805, 150811, 150817, - 150823, 150828, 150834, 150840, 150845, 150851, 150857, 150862, 150868, - 150874, 150879, 150885, 150891, 150896, 150902, 150908, 150914, 150920, - 150926, 150931, 150937, 150943, 150949, 150954, 150960, 150966, 150972, - 150977, 150983, 150989, 150994, 151000, 151006, 151011, 151017, 151023, - 151028, 151034, 151040, 151045, 151051, 151057, 151063, 151069, 151075, - 151080, 151086, 151092, 151098, 151103, 151109, 151115, 151121, 151126, - 151132, 151138, 151143, 151149, 151155, 151160, 151166, 151172, 151177, - 151183, 151189, 151194, 151200, 151206, 151212, 151218, 151224, 151229, - 151235, 151241, 151247, 151252, 151258, 151264, 151270, 151275, 151281, - 151287, 151292, 151298, 151304, 151309, 151315, 151321, 151326, 151332, - 151338, 151343, 151349, 151355, 151361, 151367, 151373, 151379, 151386, - 151393, 151400, 151406, 151413, 151420, 151427, 151433, 151440, 151447, - 151453, 151460, 151467, 151473, 151480, 151487, 151493, 151500, 151507, - 151513, 151520, 151527, 151534, 151541, 151548, 151554, 151561, 151568, - 151575, 151581, 151588, 151595, 151602, 151608, 151615, 151622, 151628, - 151635, 151642, 151648, 151655, 151662, 151668, 151675, 151682, 151688, - 151695, 151702, 151709, 151716, 151723, 151728, 151734, 151740, 151746, - 151751, 151757, 151763, 151769, 151774, 151780, 151786, 151791, 151797, - 151803, 151808, 151814, 151820, 151825, 151831, 151837, 151842, 151848, - 151854, 151860, 151866, 151872, 151877, 151883, 151889, 151895, 151900, - 151906, 151912, 151918, 151923, 151929, 151935, 151940, 151946, 151952, - 151957, 151963, 151969, 151974, 151980, 151986, 151991, 151997, 152003, - 152009, 152015, 152021, 152027, 0, 0, 152034, 152039, 152044, 152049, - 152054, 152059, 152064, 152069, 152074, 152079, 152084, 152089, 152094, - 152099, 152104, 152109, 152114, 152119, 152125, 152130, 152135, 152140, - 152145, 152150, 152155, 152160, 152164, 152169, 152174, 152179, 152184, - 152189, 152194, 152199, 152204, 152209, 152214, 152219, 152224, 152229, - 152234, 152239, 152244, 152249, 152255, 152260, 152265, 152270, 152275, - 152280, 152285, 152290, 152296, 152301, 152306, 152311, 152316, 152321, - 152326, 152331, 152336, 152341, 152346, 152351, 152356, 152361, 152366, - 152371, 152376, 152381, 152386, 152391, 152396, 152401, 152406, 152411, - 152417, 152422, 152427, 152432, 152437, 152442, 152447, 152452, 152456, - 152461, 152466, 152471, 152476, 152481, 152486, 152491, 152496, 152501, - 152506, 152511, 152516, 152521, 152526, 152531, 152536, 152541, 152547, - 152552, 152557, 152562, 152567, 152572, 152577, 152582, 152588, 152593, - 152598, 152603, 152608, 152613, 152618, 152624, 152630, 152636, 152642, - 152648, 152654, 152660, 152666, 152672, 152678, 152684, 152690, 152696, - 152702, 152708, 152714, 152720, 152727, 152733, 152739, 152745, 152751, - 152757, 152763, 152769, 152774, 152780, 152786, 152792, 152798, 152804, - 152810, 152816, 152822, 152828, 152834, 152840, 152846, 152852, 152858, - 152864, 152870, 152876, 152883, 152889, 152895, 152901, 152907, 152913, - 152919, 152925, 152932, 152938, 152944, 152950, 152956, 152962, 152968, - 152974, 152980, 152986, 152992, 152998, 153004, 153010, 153016, 153022, - 153028, 153034, 153040, 153046, 153052, 153058, 153064, 153070, 153077, - 153083, 153089, 153095, 153101, 153107, 153113, 153119, 153124, 153130, - 153136, 153142, 153148, 153154, 153160, 153166, 153172, 153178, 153184, - 153190, 153196, 153202, 153208, 153214, 153220, 153226, 153233, 153239, - 153245, 153251, 153257, 153263, 153269, 153275, 153282, 153288, 153294, - 153300, 153306, 153312, 153318, 153325, 153332, 153339, 153346, 153353, - 153360, 153367, 153374, 153381, 153388, 153395, 153402, 153409, 153416, - 153423, 153430, 153437, 153445, 153452, 153459, 153466, 153473, 153480, - 153487, 153494, 153500, 153507, 153514, 153521, 153528, 153535, 153542, - 153549, 153556, 153563, 153570, 153577, 153584, 153591, 153598, 153605, - 153612, 153619, 153627, 153634, 153641, 153648, 153655, 153662, 153669, - 153676, 153684, 153691, 153698, 153705, 153712, 153719, 153726, 153731, - 0, 0, 153736, 153741, 153745, 153749, 153753, 153757, 153761, 153765, - 153769, 153773, 153777, 153783, 153788, 153793, 153798, 153803, 153808, - 153813, 153818, 153823, 153828, 153833, 153837, 153841, 153845, 153849, - 153853, 153857, 153861, 153865, 153869, 153875, 153880, 153885, 153890, - 153895, 153900, 153905, 153910, 153915, 153920, 153926, 153931, 153936, - 153941, 153946, 153951, 153956, 153961, 153966, 153971, 153975, 153980, - 153985, 153990, 153995, 154000, 154005, 154011, 154019, 154026, 154031, - 154036, 154043, 154049, 154054, 154060, 154066, 154074, 154080, 154087, - 154095, 154101, 154110, 154119, 154127, 154135, 154141, 154148, 154156, - 154164, 154170, 154177, 154186, 154195, 154202, 154213, 154223, 154233, - 154243, 154253, 154260, 154267, 154274, 154281, 154290, 154299, 154310, - 154321, 154330, 154339, 154350, 154359, 154368, 154379, 154388, 154397, - 154405, 154413, 154424, 154435, 154443, 154452, 154461, 154468, 154479, - 154490, 154499, 154508, 154515, 154524, 154533, 154542, 154553, 154562, - 154572, 154581, 154590, 154601, 154614, 154629, 154640, 154653, 154665, - 154674, 154685, 154696, 154705, 154716, 154730, 154745, 154748, 154757, - 154762, 154768, 154776, 154782, 154788, 154797, 154804, 154814, 154826, - 154833, 154836, 154842, 154849, 154855, 154860, 154863, 154868, 154871, - 154878, 154884, 154892, 154899, 154906, 154912, 154917, 154920, 154923, - 154926, 154932, 154939, 154945, 154950, 154957, 154960, 154965, 154972, - 154978, 154986, 154993, 155003, 155012, 155015, 155021, 155028, 155035, - 155042, 155047, 155055, 155063, 155072, 155078, 155087, 155096, 155105, - 155111, 155120, 155127, 155134, 155141, 155149, 155155, 155163, 155169, - 155176, 155183, 155191, 155202, 155212, 155218, 155225, 155232, 155239, - 155245, 155252, 155259, 155264, 155271, 155279, 155288, 155294, 155306, - 155317, 155323, 155331, 155337, 155344, 155351, 155358, 155364, 155371, - 155380, 155386, 155392, 155399, 155406, 155414, 155424, 155434, 155444, - 155454, 155462, 155470, 155480, 155488, 155493, 155498, 155503, 155509, - 155516, 155523, 155529, 155535, 155540, 155547, 155555, 155565, 155573, - 155581, 155591, 155601, 155609, 155619, 155629, 155641, 155653, 155665, - 155675, 155681, 155687, 155694, 155703, 155712, 155721, 155730, 155740, - 155749, 155758, 155767, 155772, 155778, 155787, 155797, 155806, 155812, - 155818, 155825, 155832, 155839, 155845, 155852, 155859, 155866, 155872, - 155876, 155881, 155888, 155895, 155902, 155907, 155915, 155923, 155932, - 155940, 155947, 155955, 155964, 155974, 155977, 155981, 155986, 155991, - 155996, 156001, 156006, 156011, 156016, 156021, 156026, 156031, 156036, - 156041, 156046, 156051, 156056, 156061, 156066, 156073, 156079, 156086, - 156092, 156097, 156104, 156110, 156117, 156123, 156128, 156135, 156142, - 156149, 156155, 156161, 156170, 156179, 156190, 156197, 156204, 156213, - 156222, 156231, 156240, 156249, 156255, 156263, 156269, 156279, 156284, - 156293, 156302, 156309, 156320, 156327, 156334, 156341, 156348, 156355, - 156362, 156369, 156376, 156383, 156390, 156396, 156402, 156408, 156415, - 156422, 156429, 156436, 156443, 156450, 156457, 156464, 156471, 156478, - 156485, 156492, 156497, 156506, 156515, 156524, 156531, 156538, 156545, - 156552, 156559, 156566, 156573, 156580, 156589, 156598, 156607, 156616, - 156625, 156634, 156643, 156652, 156661, 156670, 156679, 156688, 156697, - 156703, 156711, 156717, 156727, 156732, 156741, 156750, 156759, 156770, - 156775, 156782, 156789, 156796, 156801, 156807, 156813, 156819, 156826, - 156833, 156840, 156847, 156854, 156861, 156868, 156875, 156882, 156889, - 156896, 156903, 156908, 156917, 156926, 156935, 156944, 156953, 156962, - 156971, 156980, 156991, 157002, 157009, 157016, 157023, 157030, 157037, - 157044, 157052, 157062, 157072, 157082, 157093, 157104, 157115, 157124, - 157133, 157142, 157147, 157152, 157157, 157162, 157173, 157184, 157195, - 157206, 157217, 157227, 157238, 157247, 157256, 157265, 157274, 157283, - 157291, 157300, 157311, 157322, 157333, 157344, 157355, 157367, 157380, - 157392, 157405, 157417, 157430, 157442, 157455, 157466, 157477, 157486, - 157494, 157503, 157514, 157525, 157537, 157550, 157564, 157579, 157591, - 157604, 157616, 157629, 157640, 157651, 157660, 157668, 157677, 157684, - 157691, 157698, 157705, 157712, 157719, 157726, 157733, 157740, 157747, - 157752, 157757, 157762, 157769, 157779, 157790, 157800, 157811, 157825, - 157840, 157855, 157869, 157884, 157899, 157910, 157921, 157934, 157947, - 157956, 157965, 157978, 157991, 157998, 158005, 158010, 158015, 158020, - 158025, 158030, 158037, 158046, 158051, 158054, 158059, 158066, 158073, - 158080, 158087, 158094, 158101, 158114, 158128, 158143, 158150, 158157, - 158164, 158173, 158181, 158189, 158198, 158203, 158208, 158213, 158218, - 158223, 158228, 158235, 158242, 158248, 158255, 158261, 158268, 158273, - 158278, 158283, 158288, 158293, 158300, 158307, 158312, 158319, 158326, - 158331, 158336, 158341, 158346, 158351, 158356, 158363, 158370, 158377, - 158380, 158385, 158390, 158395, 158400, 158407, 158414, 158422, 158430, - 158435, 158440, 158447, 158454, 158461, 158466, 158473, 158480, 158485, - 158492, 158499, 158505, 158511, 158517, 158523, 158531, 158539, 158545, - 158553, 158561, 158566, 158573, 158580, 158585, 158592, 158599, 158606, - 158614, 158622, 158627, 158634, 158641, 158650, 158657, 158666, 158677, - 158686, 158695, 158704, 158713, 158716, 158721, 158728, 158737, 158744, - 158753, 158760, 158765, 158770, 158773, 158776, 158779, 158786, 158793, - 158802, 158811, 158820, 158827, 158834, 158839, 158852, 158857, 158862, - 158867, 158872, 158877, 158882, 158887, 158892, 158895, 158900, 158905, - 158910, 158915, 158920, 158927, 158932, 158939, 158942, 158947, 158950, - 158953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158956, 158961, - 158966, 158971, 158976, 0, 158981, 158986, 158991, 158996, 159001, - 159006, 159011, 159016, 159021, 159026, 159031, 159036, 159041, 159046, - 159051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 147716, 147722, 147727, 147732, 147737, 147742, 147747, + 147752, 147757, 147762, 147767, 147773, 147779, 147785, 147791, 147797, + 147803, 147809, 147815, 147821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 147827, 147832, 147839, 147846, 147853, 147860, 147865, 147870, 147877, + 147882, 147887, 147894, 147899, 147904, 147909, 147916, 147925, 147930, + 147935, 147940, 147945, 147950, 147955, 147962, 147967, 147972, 147977, + 147982, 147987, 147992, 147997, 148002, 148007, 148012, 148017, 148022, + 148028, 148033, 148038, 148043, 148048, 148053, 148058, 148063, 148068, + 148073, 148082, 148087, 148096, 148101, 148106, 148111, 148116, 148121, + 148126, 148131, 148140, 148145, 148150, 148155, 148160, 148165, 148172, + 148177, 148184, 148189, 148194, 148199, 148204, 148209, 148214, 148219, + 148224, 148229, 148234, 148239, 148244, 148249, 148254, 148259, 148264, + 148269, 148274, 148279, 148288, 148293, 148298, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 148303, 148311, 148319, 148327, 148335, 148343, 148351, 148359, + 148367, 148375, 148383, 148391, 148399, 148407, 148415, 148423, 148431, + 148439, 148447, 148452, 148457, 148462, 148467, 148472, 148476, 0, 0, 0, + 0, 0, 0, 0, 148480, 148484, 148489, 148494, 148499, 148503, 148508, + 148513, 148518, 148522, 148527, 148532, 148536, 148541, 148546, 148550, + 148555, 148560, 148564, 148569, 148574, 148578, 148583, 148588, 148593, + 148598, 148603, 148607, 148612, 148617, 148622, 148626, 148631, 148636, + 148641, 148645, 148650, 148655, 148659, 148664, 148669, 148673, 148678, + 148683, 148687, 148692, 148697, 148701, 148706, 148711, 148716, 148721, + 148726, 148730, 148735, 148740, 148745, 148749, 148754, 148759, 148764, + 148768, 148773, 148778, 148782, 148787, 148792, 148796, 148801, 148806, + 148810, 148815, 148820, 148824, 148829, 148834, 148839, 148844, 148849, + 148853, 148858, 148863, 148868, 148872, 148877, 0, 148882, 148886, + 148891, 148896, 148900, 148905, 148910, 148914, 148919, 148924, 148928, + 148933, 148938, 148942, 148947, 148952, 148957, 148962, 148967, 148972, + 148978, 148984, 148990, 148995, 149001, 149007, 149013, 149018, 149024, + 149030, 149035, 149041, 149047, 149052, 149058, 149064, 149069, 149075, + 149081, 149086, 149092, 149098, 149104, 149110, 149116, 149121, 149127, + 149133, 149139, 149144, 149150, 149156, 149162, 149167, 149173, 149179, + 149184, 149190, 149196, 149201, 149207, 149213, 149218, 149224, 149230, + 149235, 149241, 149247, 149253, 149259, 149265, 0, 149269, 149274, 0, 0, + 149279, 0, 0, 149284, 149289, 0, 0, 149294, 149299, 149303, 149308, 0, + 149313, 149318, 149323, 149327, 149332, 149337, 149342, 149347, 149352, + 149356, 149361, 149366, 0, 149371, 0, 149376, 149381, 149385, 149390, + 149395, 149399, 149404, 0, 149409, 149414, 149419, 149423, 149428, + 149433, 149437, 149442, 149447, 149452, 149457, 149462, 149467, 149473, + 149479, 149485, 149490, 149496, 149502, 149508, 149513, 149519, 149525, + 149530, 149536, 149542, 149547, 149553, 149559, 149564, 149570, 149576, + 149581, 149587, 149593, 149599, 149605, 149611, 149616, 149622, 149628, + 149634, 149639, 149645, 149651, 149657, 149662, 149668, 149674, 149679, + 149685, 149691, 149696, 149702, 149708, 149713, 149719, 149725, 149730, + 149736, 149742, 149748, 149754, 149760, 149764, 0, 149769, 149774, + 149778, 149783, 0, 0, 149788, 149793, 149798, 149802, 149807, 149812, + 149816, 149821, 0, 149826, 149831, 149836, 149840, 149845, 149850, + 149855, 0, 149860, 149864, 149869, 149874, 149879, 149883, 149888, + 149893, 149898, 149902, 149907, 149912, 149916, 149921, 149926, 149930, + 149935, 149940, 149944, 149949, 149954, 149958, 149963, 149968, 149973, + 149978, 149983, 149988, 0, 149994, 150000, 150005, 150011, 0, 150017, + 150022, 150028, 150034, 150039, 0, 150045, 0, 0, 0, 150050, 150056, + 150062, 150067, 150073, 150079, 150085, 0, 150091, 150096, 150102, + 150108, 150114, 150119, 150125, 150131, 150137, 150142, 150148, 150154, + 150159, 150165, 150171, 150176, 150182, 150188, 150193, 150199, 150205, + 150210, 150216, 150222, 150228, 150234, 150240, 150245, 150251, 150257, + 150263, 150268, 150274, 150280, 150286, 150291, 150297, 150303, 150308, + 150314, 150320, 150325, 150331, 150337, 150342, 150348, 150354, 150359, + 150365, 150371, 150377, 150383, 150389, 150394, 150400, 150406, 150412, + 150417, 150423, 150429, 150435, 150440, 150446, 150452, 150457, 150463, + 150469, 150474, 150480, 150486, 150491, 150497, 150503, 150508, 150514, + 150520, 150526, 150532, 150538, 150542, 150547, 150552, 150557, 150561, + 150566, 150571, 150576, 150580, 150585, 150590, 150594, 150599, 150604, + 150608, 150613, 150618, 150622, 150627, 150632, 150636, 150641, 150646, + 150651, 150656, 150661, 150665, 150670, 150675, 150680, 150684, 150689, + 150694, 150699, 150703, 150708, 150713, 150717, 150722, 150727, 150731, + 150736, 150741, 150745, 150750, 150755, 150759, 150764, 150769, 150774, + 150779, 150784, 150789, 150795, 150801, 150807, 150812, 150818, 150824, + 150830, 150835, 150841, 150847, 150852, 150858, 150864, 150869, 150875, + 150881, 150886, 150892, 150898, 150903, 150909, 150915, 150921, 150927, + 150933, 150938, 150944, 150950, 150956, 150961, 150967, 150973, 150979, + 150984, 150990, 150996, 151001, 151007, 151013, 151018, 151024, 151030, + 151035, 151041, 151047, 151052, 151058, 151064, 151070, 151076, 151082, + 151087, 151093, 151099, 151105, 151110, 151116, 151122, 151128, 151133, + 151139, 151145, 151150, 151156, 151162, 151167, 151173, 151179, 151184, + 151190, 151196, 151201, 151207, 151213, 151219, 151225, 151231, 151236, + 151242, 151248, 151254, 151259, 151265, 151271, 151277, 151282, 151288, + 151294, 151299, 151305, 151311, 151316, 151322, 151328, 151333, 151339, + 151345, 151350, 151356, 151362, 151368, 151374, 151380, 151386, 151393, + 151400, 151407, 151413, 151420, 151427, 151434, 151440, 151447, 151454, + 151460, 151467, 151474, 151480, 151487, 151494, 151500, 151507, 151514, + 151520, 151527, 151534, 151541, 151548, 151555, 151561, 151568, 151575, + 151582, 151588, 151595, 151602, 151609, 151615, 151622, 151629, 151635, + 151642, 151649, 151655, 151662, 151669, 151675, 151682, 151689, 151695, + 151702, 151709, 151716, 151723, 151730, 151735, 151741, 151747, 151753, + 151758, 151764, 151770, 151776, 151781, 151787, 151793, 151798, 151804, + 151810, 151815, 151821, 151827, 151832, 151838, 151844, 151849, 151855, + 151861, 151867, 151873, 151879, 151884, 151890, 151896, 151902, 151907, + 151913, 151919, 151925, 151930, 151936, 151942, 151947, 151953, 151959, + 151964, 151970, 151976, 151981, 151987, 151993, 151998, 152004, 152010, + 152016, 152022, 152028, 152034, 0, 0, 152041, 152046, 152051, 152056, + 152061, 152066, 152071, 152076, 152081, 152086, 152091, 152096, 152101, + 152106, 152111, 152116, 152121, 152126, 152132, 152137, 152142, 152147, + 152152, 152157, 152162, 152167, 152171, 152176, 152181, 152186, 152191, + 152196, 152201, 152206, 152211, 152216, 152221, 152226, 152231, 152236, + 152241, 152246, 152251, 152256, 152262, 152267, 152272, 152277, 152282, + 152287, 152292, 152297, 152303, 152308, 152313, 152318, 152323, 152328, + 152333, 152338, 152343, 152348, 152353, 152358, 152363, 152368, 152373, + 152378, 152383, 152388, 152393, 152398, 152403, 152408, 152413, 152418, + 152424, 152429, 152434, 152439, 152444, 152449, 152454, 152459, 152463, + 152468, 152473, 152478, 152483, 152488, 152493, 152498, 152503, 152508, + 152513, 152518, 152523, 152528, 152533, 152538, 152543, 152548, 152554, + 152559, 152564, 152569, 152574, 152579, 152584, 152589, 152595, 152600, + 152605, 152610, 152615, 152620, 152625, 152631, 152637, 152643, 152649, + 152655, 152661, 152667, 152673, 152679, 152685, 152691, 152697, 152703, + 152709, 152715, 152721, 152727, 152734, 152740, 152746, 152752, 152758, + 152764, 152770, 152776, 152781, 152787, 152793, 152799, 152805, 152811, + 152817, 152823, 152829, 152835, 152841, 152847, 152853, 152859, 152865, + 152871, 152877, 152883, 152890, 152896, 152902, 152908, 152914, 152920, + 152926, 152932, 152939, 152945, 152951, 152957, 152963, 152969, 152975, + 152981, 152987, 152993, 152999, 153005, 153011, 153017, 153023, 153029, + 153035, 153041, 153047, 153053, 153059, 153065, 153071, 153077, 153084, + 153090, 153096, 153102, 153108, 153114, 153120, 153126, 153131, 153137, + 153143, 153149, 153155, 153161, 153167, 153173, 153179, 153185, 153191, + 153197, 153203, 153209, 153215, 153221, 153227, 153233, 153240, 153246, + 153252, 153258, 153264, 153270, 153276, 153282, 153289, 153295, 153301, + 153307, 153313, 153319, 153325, 153332, 153339, 153346, 153353, 153360, + 153367, 153374, 153381, 153388, 153395, 153402, 153409, 153416, 153423, + 153430, 153437, 153444, 153452, 153459, 153466, 153473, 153480, 153487, + 153494, 153501, 153507, 153514, 153521, 153528, 153535, 153542, 153549, + 153556, 153563, 153570, 153577, 153584, 153591, 153598, 153605, 153612, + 153619, 153626, 153634, 153641, 153648, 153655, 153662, 153669, 153676, + 153683, 153691, 153698, 153705, 153712, 153719, 153726, 153733, 153738, + 0, 0, 153743, 153748, 153752, 153756, 153760, 153764, 153768, 153772, + 153776, 153780, 153784, 153790, 153795, 153800, 153805, 153810, 153815, + 153820, 153825, 153830, 153835, 153840, 153844, 153848, 153852, 153856, + 153860, 153864, 153868, 153872, 153876, 153882, 153887, 153892, 153897, + 153902, 153907, 153912, 153917, 153922, 153927, 153933, 153938, 153943, + 153948, 153953, 153958, 153963, 153968, 153973, 153978, 153982, 153987, + 153992, 153997, 154002, 154007, 154012, 154018, 154026, 154033, 154038, + 154043, 154050, 154056, 154061, 154067, 154073, 154081, 154087, 154094, + 154102, 154108, 154117, 154126, 154134, 154142, 154148, 154155, 154163, + 154171, 154177, 154184, 154193, 154202, 154209, 154220, 154230, 154240, + 154250, 154260, 154267, 154274, 154281, 154288, 154297, 154306, 154317, + 154328, 154337, 154346, 154357, 154366, 154375, 154386, 154395, 154404, + 154412, 154420, 154431, 154442, 154450, 154459, 154468, 154475, 154486, + 154497, 154506, 154515, 154522, 154531, 154540, 154549, 154560, 154569, + 154579, 154588, 154597, 154608, 154621, 154636, 154647, 154660, 154672, + 154681, 154692, 154703, 154712, 154723, 154737, 154752, 154755, 154764, + 154769, 154775, 154783, 154789, 154795, 154804, 154811, 154821, 154833, + 154840, 154843, 154849, 154856, 154862, 154867, 154870, 154875, 154878, + 154885, 154891, 154899, 154906, 154913, 154919, 154924, 154927, 154930, + 154933, 154939, 154946, 154952, 154957, 154964, 154967, 154972, 154979, + 154985, 154993, 155000, 155010, 155019, 155022, 155028, 155035, 155042, + 155049, 155054, 155062, 155070, 155079, 155085, 155094, 155103, 155112, + 155118, 155127, 155134, 155141, 155148, 155156, 155162, 155170, 155176, + 155183, 155190, 155198, 155209, 155219, 155225, 155232, 155239, 155246, + 155252, 155259, 155266, 155271, 155278, 155286, 155295, 155301, 155313, + 155324, 155330, 155338, 155344, 155351, 155358, 155365, 155371, 155378, + 155387, 155393, 155399, 155406, 155413, 155421, 155431, 155441, 155451, + 155461, 155469, 155477, 155487, 155495, 155500, 155505, 155510, 155516, + 155523, 155530, 155536, 155542, 155547, 155554, 155562, 155572, 155580, + 155588, 155598, 155608, 155616, 155626, 155636, 155648, 155660, 155672, + 155682, 155688, 155694, 155701, 155710, 155719, 155728, 155737, 155747, + 155756, 155765, 155774, 155779, 155785, 155794, 155804, 155813, 155819, + 155825, 155832, 155839, 155846, 155852, 155859, 155866, 155873, 155879, + 155883, 155888, 155895, 155902, 155909, 155914, 155922, 155930, 155939, + 155947, 155954, 155962, 155971, 155981, 155984, 155988, 155993, 155998, + 156003, 156008, 156013, 156018, 156023, 156028, 156033, 156038, 156043, + 156048, 156053, 156058, 156063, 156068, 156073, 156080, 156086, 156093, + 156099, 156104, 156111, 156117, 156124, 156130, 156135, 156142, 156149, + 156156, 156162, 156168, 156177, 156186, 156197, 156204, 156211, 156220, + 156229, 156238, 156247, 156256, 156262, 156270, 156276, 156286, 156291, + 156300, 156309, 156316, 156327, 156334, 156341, 156348, 156355, 156362, + 156369, 156376, 156383, 156390, 156397, 156403, 156409, 156415, 156422, + 156429, 156436, 156443, 156450, 156457, 156464, 156471, 156478, 156485, + 156492, 156499, 156504, 156513, 156522, 156531, 156538, 156545, 156552, + 156559, 156566, 156573, 156580, 156587, 156596, 156605, 156614, 156623, + 156632, 156641, 156650, 156659, 156668, 156677, 156686, 156695, 156704, + 156710, 156718, 156724, 156734, 156739, 156748, 156757, 156766, 156777, + 156782, 156789, 156796, 156803, 156808, 156814, 156820, 156826, 156833, + 156840, 156847, 156854, 156861, 156868, 156875, 156882, 156889, 156896, + 156903, 156910, 156915, 156924, 156933, 156942, 156951, 156960, 156969, + 156978, 156987, 156998, 157009, 157016, 157023, 157030, 157037, 157044, + 157051, 157059, 157069, 157079, 157089, 157100, 157111, 157122, 157131, + 157140, 157149, 157154, 157159, 157164, 157169, 157180, 157191, 157202, + 157213, 157224, 157234, 157245, 157254, 157263, 157272, 157281, 157290, + 157298, 157307, 157318, 157329, 157340, 157351, 157362, 157374, 157387, + 157399, 157412, 157424, 157437, 157449, 157462, 157473, 157484, 157493, + 157501, 157510, 157521, 157532, 157544, 157557, 157571, 157586, 157598, + 157611, 157623, 157636, 157647, 157658, 157667, 157675, 157684, 157691, + 157698, 157705, 157712, 157719, 157726, 157733, 157740, 157747, 157754, + 157759, 157764, 157769, 157776, 157786, 157797, 157807, 157818, 157832, + 157847, 157862, 157876, 157891, 157906, 157917, 157928, 157941, 157954, + 157963, 157972, 157985, 157998, 158005, 158012, 158017, 158022, 158027, + 158032, 158037, 158044, 158053, 158058, 158061, 158066, 158073, 158080, + 158087, 158094, 158101, 158108, 158121, 158135, 158150, 158157, 158164, + 158171, 158180, 158188, 158196, 158205, 158210, 158215, 158220, 158225, + 158230, 158235, 158242, 158249, 158255, 158262, 158268, 158275, 158280, + 158285, 158290, 158295, 158300, 158307, 158314, 158319, 158326, 158333, + 158338, 158343, 158348, 158353, 158358, 158363, 158370, 158377, 158384, + 158387, 158392, 158397, 158402, 158407, 158414, 158421, 158429, 158437, + 158442, 158447, 158454, 158461, 158468, 158473, 158480, 158487, 158492, + 158499, 158506, 158512, 158518, 158524, 158530, 158538, 158546, 158552, + 158560, 158568, 158573, 158580, 158587, 158592, 158599, 158606, 158613, + 158621, 158629, 158634, 158641, 158648, 158657, 158664, 158673, 158684, + 158693, 158702, 158711, 158720, 158723, 158728, 158735, 158744, 158751, + 158760, 158767, 158772, 158777, 158780, 158783, 158786, 158793, 158800, + 158809, 158818, 158827, 158834, 158841, 158846, 158859, 158864, 158869, + 158874, 158879, 158884, 158889, 158894, 158899, 158902, 158907, 158912, + 158917, 158922, 158927, 158934, 158939, 158946, 158949, 158954, 158957, + 158960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158963, 158968, + 158973, 158978, 158983, 0, 158988, 158993, 158998, 159003, 159008, + 159013, 159018, 159023, 159028, 159033, 159038, 159043, 159048, 159053, + 159058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159056, 159061, 159066, 159071, 159076, - 159081, 159086, 0, 159091, 159096, 159101, 159107, 159111, 159116, - 159121, 159126, 159131, 159136, 159141, 159146, 159151, 159156, 159161, - 159166, 159171, 0, 0, 159176, 159181, 159186, 159191, 159196, 159201, - 159206, 0, 159211, 159216, 0, 159222, 159227, 159235, 159242, 159251, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159063, 159068, 159073, 159078, 159083, + 159088, 159093, 0, 159098, 159103, 159108, 159114, 159118, 159123, + 159128, 159133, 159138, 159143, 159148, 159153, 159158, 159163, 159168, + 159173, 159178, 0, 0, 159183, 159188, 159193, 159198, 159203, 159208, + 159213, 0, 159218, 159223, 0, 159229, 159234, 159242, 159249, 159258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159256, 159263, 159271, 159279, - 159286, 159293, 159300, 159308, 159316, 159324, 159331, 159338, 159346, - 159354, 159362, 159369, 159377, 159385, 159393, 159401, 159409, 159417, - 159425, 159432, 159440, 159447, 159455, 159462, 159470, 159478, 159486, - 159494, 159502, 159510, 159518, 159526, 159534, 159541, 159549, 159556, - 159563, 159570, 159578, 159585, 159593, 0, 0, 0, 159601, 159608, 159615, - 159622, 159629, 159636, 159643, 159650, 159659, 159668, 159677, 159686, - 159695, 159705, 0, 0, 159713, 159721, 159728, 159735, 159742, 159749, - 159756, 159763, 159770, 159777, 0, 0, 0, 0, 159784, 159793, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159263, 159270, 159278, 159286, + 159293, 159300, 159307, 159315, 159323, 159331, 159338, 159345, 159353, + 159361, 159369, 159376, 159384, 159392, 159400, 159408, 159416, 159424, + 159432, 159439, 159447, 159454, 159462, 159469, 159477, 159485, 159493, + 159501, 159509, 159517, 159525, 159533, 159541, 159548, 159556, 159563, + 159570, 159577, 159585, 159592, 159600, 0, 0, 0, 159608, 159615, 159622, + 159629, 159636, 159643, 159650, 159657, 159666, 159675, 159684, 159693, + 159702, 159712, 0, 0, 159720, 159728, 159735, 159742, 159749, 159756, + 159763, 159770, 159777, 159784, 0, 0, 0, 0, 159791, 159800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159801, 159806, 159810, 159815, - 159820, 159825, 159830, 159834, 159839, 159843, 159847, 159851, 159855, - 159860, 159865, 159869, 159874, 159879, 159884, 159889, 159894, 159898, - 159902, 159907, 159911, 159915, 159920, 159924, 159928, 159932, 159937, - 159941, 159946, 159951, 159956, 159961, 159966, 159971, 159976, 159981, - 159986, 159991, 159996, 160001, 160006, 160011, 160016, 160021, 160026, - 160031, 160035, 160039, 160043, 160047, 160051, 160055, 160059, 160063, - 0, 0, 0, 0, 0, 160067, 160072, 160079, 160085, 160092, 160099, 160106, - 160113, 160120, 160127, 160134, 160141, 160148, 160155, 160162, 160169, - 160176, 160183, 160190, 160197, 160204, 160211, 160218, 160225, 160232, - 160239, 160246, 160253, 160260, 160267, 160274, 160281, 160288, 160295, - 160302, 160309, 160315, 160321, 160327, 160334, 160340, 160347, 160353, - 160360, 160367, 160374, 160381, 160388, 160395, 160401, 160408, 160415, - 160422, 160429, 160436, 160443, 160450, 160456, 160463, 160470, 160477, - 160484, 160491, 160499, 160506, 160513, 160520, 160527, 160534, 160541, - 160548, 160554, 160561, 160568, 160575, 160582, 160588, 160595, 160602, - 160609, 160616, 160623, 160630, 160637, 160645, 160652, 160658, 160665, - 160672, 160679, 160686, 160693, 160700, 160707, 160714, 160721, 160728, - 160735, 160742, 160749, 160756, 160763, 160770, 160777, 160784, 160791, - 160798, 160804, 160811, 160818, 160825, 160832, 160839, 160846, 160853, - 160860, 160867, 160874, 160881, 160888, 160895, 160902, 160909, 160916, - 160923, 160930, 160937, 160944, 160951, 160958, 160966, 160974, 160982, - 160989, 160996, 161003, 161010, 161017, 161024, 161031, 161038, 161045, - 161052, 161058, 161065, 161072, 161079, 161086, 161093, 161100, 161107, - 161114, 161121, 161128, 161135, 161142, 161149, 161156, 161164, 161172, - 161180, 161187, 161194, 161201, 161208, 161215, 161222, 161229, 161236, - 161243, 161250, 161257, 161264, 161271, 161278, 161284, 161291, 161298, - 161305, 161312, 161319, 161326, 161333, 161340, 161347, 161354, 161361, - 161368, 161375, 161382, 161389, 161396, 161403, 161410, 161417, 161424, - 161431, 161438, 0, 0, 161445, 161449, 161453, 161457, 161461, 161465, - 161469, 161473, 161477, 161481, 161487, 161493, 161499, 161505, 161513, - 161521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161527, 161533, - 161539, 161545, 161551, 161557, 161563, 161569, 161575, 161580, 161585, - 161591, 161596, 161601, 161607, 161613, 161619, 161625, 161631, 161636, - 161641, 161647, 161653, 161658, 161664, 161670, 161676, 161682, 161688, - 161694, 161700, 161706, 161712, 161718, 161724, 161730, 161736, 161742, - 161748, 161754, 161760, 161766, 161772, 161777, 161782, 161788, 161793, - 161798, 161804, 161810, 161816, 161822, 161828, 161833, 161838, 161844, - 161850, 161855, 161861, 161867, 161873, 161879, 161885, 161891, 161897, - 161903, 161909, 161915, 161921, 161927, 161932, 161937, 161941, 161946, - 161953, 161957, 0, 0, 0, 0, 161962, 161967, 161971, 161975, 161979, - 161983, 161987, 161991, 161995, 161999, 0, 0, 0, 0, 162003, 162009, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159808, 159813, 159817, 159822, + 159827, 159832, 159837, 159841, 159846, 159850, 159854, 159858, 159862, + 159867, 159872, 159876, 159881, 159886, 159891, 159896, 159901, 159905, + 159909, 159914, 159918, 159922, 159927, 159931, 159935, 159939, 159944, + 159948, 159953, 159958, 159963, 159968, 159973, 159978, 159983, 159988, + 159993, 159998, 160003, 160008, 160013, 160018, 160023, 160028, 160033, + 160038, 160042, 160046, 160050, 160054, 160058, 160062, 160066, 160070, + 0, 0, 0, 0, 0, 160074, 160079, 160086, 160092, 160099, 160106, 160113, + 160120, 160127, 160134, 160141, 160148, 160155, 160162, 160169, 160176, + 160183, 160190, 160197, 160204, 160211, 160218, 160225, 160232, 160239, + 160246, 160253, 160260, 160267, 160274, 160281, 160288, 160295, 160302, + 160309, 160316, 160322, 160328, 160334, 160341, 160347, 160354, 160360, + 160367, 160374, 160381, 160388, 160395, 160402, 160408, 160415, 160422, + 160429, 160436, 160443, 160450, 160457, 160463, 160470, 160477, 160484, + 160491, 160498, 160506, 160513, 160520, 160527, 160534, 160541, 160548, + 160555, 160561, 160568, 160575, 160582, 160589, 160595, 160602, 160609, + 160616, 160623, 160630, 160637, 160644, 160652, 160659, 160665, 160672, + 160679, 160686, 160693, 160700, 160707, 160714, 160721, 160728, 160735, + 160742, 160749, 160756, 160763, 160770, 160777, 160784, 160791, 160798, + 160805, 160811, 160818, 160825, 160832, 160839, 160846, 160853, 160860, + 160867, 160874, 160881, 160888, 160895, 160902, 160909, 160916, 160923, + 160930, 160937, 160944, 160951, 160958, 160965, 160973, 160981, 160989, + 160996, 161003, 161010, 161017, 161024, 161031, 161038, 161045, 161052, + 161059, 161065, 161072, 161079, 161086, 161093, 161100, 161107, 161114, + 161121, 161128, 161135, 161142, 161149, 161156, 161163, 161171, 161179, + 161187, 161194, 161201, 161208, 161215, 161222, 161229, 161236, 161243, + 161250, 161257, 161264, 161271, 161278, 161285, 161291, 161298, 161305, + 161312, 161319, 161326, 161333, 161340, 161347, 161354, 161361, 161368, + 161375, 161382, 161389, 161396, 161403, 161410, 161417, 161424, 161431, + 161438, 161445, 0, 0, 161452, 161456, 161460, 161464, 161468, 161472, + 161476, 161480, 161484, 161488, 161494, 161500, 161506, 161512, 161520, + 161528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161534, 161540, + 161546, 161552, 161558, 161564, 161570, 161576, 161582, 161587, 161592, + 161598, 161603, 161608, 161614, 161620, 161626, 161632, 161638, 161643, + 161648, 161654, 161660, 161665, 161671, 161677, 161683, 161689, 161695, + 161701, 161707, 161713, 161719, 161725, 161731, 161737, 161743, 161749, + 161755, 161761, 161767, 161773, 161779, 161784, 161789, 161795, 161800, + 161805, 161811, 161817, 161823, 161829, 161835, 161840, 161845, 161851, + 161857, 161862, 161868, 161874, 161880, 161886, 161892, 161898, 161904, + 161910, 161916, 161922, 161928, 161934, 161939, 161944, 161948, 161953, + 161960, 161964, 0, 0, 0, 0, 161969, 161974, 161978, 161982, 161986, + 161990, 161994, 161998, 162002, 162006, 0, 0, 0, 0, 162010, 162016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 162015, 162020, 162025, 162030, 162035, 162040, 162045, 162050, 162055, - 162060, 162066, 162072, 162078, 162084, 162090, 162096, 162102, 162108, - 162114, 162121, 162128, 162135, 162143, 162151, 162159, 162167, 162175, - 162183, 162189, 162195, 162201, 162208, 162215, 162222, 162229, 162236, - 162243, 162250, 162257, 162264, 162271, 162278, 162285, 162292, 162299, - 162306, 162312, 162318, 162324, 162330, 162336, 162343, 162350, 162357, - 162364, 162371, 162378, 162385, 162392, 162399, 162404, 162411, 162418, - 162425, 162431, 162438, 162445, 162454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 162022, 162027, 162032, 162037, 162042, 162047, 162052, 162057, 162062, + 162067, 162073, 162079, 162085, 162091, 162097, 162103, 162109, 162115, + 162121, 162128, 162135, 162142, 162150, 162158, 162166, 162174, 162182, + 162190, 162196, 162202, 162208, 162215, 162222, 162229, 162236, 162243, + 162250, 162257, 162264, 162271, 162278, 162285, 162292, 162299, 162306, + 162313, 162319, 162325, 162331, 162337, 162343, 162350, 162357, 162364, + 162371, 162378, 162385, 162392, 162399, 162406, 162411, 162418, 162425, + 162432, 162438, 162445, 162452, 162461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162462, 162467, - 162472, 162477, 162482, 162487, 162492, 162497, 162502, 162507, 162513, - 162519, 162525, 162531, 162537, 162543, 162549, 162555, 162561, 162568, - 162575, 162582, 162590, 162598, 162606, 162614, 162622, 162630, 162636, - 162642, 162648, 162655, 162662, 162669, 162676, 162683, 162690, 162697, - 162704, 162711, 162718, 162725, 162732, 162739, 162746, 162753, 162758, - 162765, 162772, 162779, 162786, 162793, 162800, 162807, 162814, 162822, - 162832, 162842, 162850, 162859, 162866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162469, 162474, + 162479, 162484, 162489, 162494, 162499, 162504, 162509, 162514, 162520, + 162526, 162532, 162538, 162544, 162550, 162556, 162562, 162568, 162575, + 162582, 162589, 162597, 162605, 162613, 162621, 162629, 162637, 162643, + 162649, 162655, 162662, 162669, 162676, 162683, 162690, 162697, 162704, + 162711, 162718, 162725, 162732, 162739, 162746, 162753, 162760, 162765, + 162772, 162779, 162786, 162793, 162800, 162807, 162814, 162821, 162829, + 162839, 162849, 162857, 162866, 162873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 162873, 162877, 162881, 162885, 0, 162889, 162893, - 162897, 162901, 162905, 162909, 162913, 162917, 162921, 162925, 162929, - 162933, 162937, 162941, 162945, 162949, 162953, 162957, 162961, 162965, - 162969, 162973, 162977, 162981, 162987, 162993, 162999, 0, 163005, - 163010, 0, 163015, 0, 0, 163020, 0, 163025, 163030, 163035, 163040, - 163045, 163050, 163055, 163060, 163065, 163070, 0, 163075, 163080, - 163085, 163090, 0, 163095, 0, 163100, 0, 0, 0, 0, 0, 0, 163105, 0, 0, 0, - 0, 163111, 0, 163117, 0, 163123, 0, 163129, 163135, 163141, 0, 163147, - 163153, 0, 163159, 0, 0, 163165, 0, 163171, 0, 163177, 0, 163183, 0, - 163191, 0, 163199, 163205, 0, 163211, 0, 0, 163217, 163223, 163229, - 163235, 0, 163241, 163247, 163253, 163259, 163265, 163271, 163277, 0, - 163283, 163289, 163295, 163301, 0, 163307, 163313, 163319, 163325, 0, - 163333, 0, 163341, 163347, 163353, 163359, 163365, 163371, 163377, - 163383, 163389, 163395, 0, 163401, 163407, 163413, 163419, 163425, - 163431, 163437, 163443, 163449, 163455, 163461, 163467, 163473, 163479, - 163485, 163491, 163497, 0, 0, 0, 0, 0, 163503, 163509, 163515, 0, 163521, - 163527, 163533, 163539, 163545, 0, 163551, 163557, 163563, 163569, - 163575, 163581, 163587, 163593, 163599, 163605, 163611, 163617, 163623, - 163629, 163635, 163641, 163647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 162880, 162884, 162888, 162892, 0, 162896, 162900, + 162904, 162908, 162912, 162916, 162920, 162924, 162928, 162932, 162936, + 162940, 162944, 162948, 162952, 162956, 162960, 162964, 162968, 162972, + 162976, 162980, 162984, 162988, 162994, 163000, 163006, 0, 163012, + 163017, 0, 163022, 0, 0, 163027, 0, 163032, 163037, 163042, 163047, + 163052, 163057, 163062, 163067, 163072, 163077, 0, 163082, 163087, + 163092, 163097, 0, 163102, 0, 163107, 0, 0, 0, 0, 0, 0, 163112, 0, 0, 0, + 0, 163118, 0, 163124, 0, 163130, 0, 163136, 163142, 163148, 0, 163154, + 163160, 0, 163166, 0, 0, 163172, 0, 163178, 0, 163184, 0, 163190, 0, + 163198, 0, 163206, 163212, 0, 163218, 0, 0, 163224, 163230, 163236, + 163242, 0, 163248, 163254, 163260, 163266, 163272, 163278, 163284, 0, + 163290, 163296, 163302, 163308, 0, 163314, 163320, 163326, 163332, 0, + 163340, 0, 163348, 163354, 163360, 163366, 163372, 163378, 163384, + 163390, 163396, 163402, 0, 163408, 163414, 163420, 163426, 163432, + 163438, 163444, 163450, 163456, 163462, 163468, 163474, 163480, 163486, + 163492, 163498, 163504, 0, 0, 0, 0, 0, 163510, 163516, 163522, 0, 163528, + 163534, 163540, 163546, 163552, 0, 163558, 163564, 163570, 163576, + 163582, 163588, 163594, 163600, 163606, 163612, 163618, 163624, 163630, + 163636, 163642, 163648, 163654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163653, 163663, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 163671, 163678, 163685, 163692, 163698, - 163705, 163712, 163718, 163725, 163732, 163739, 163747, 163755, 163763, - 163771, 163779, 163787, 163794, 163801, 163808, 163816, 163824, 163832, - 163840, 163848, 163856, 163863, 163870, 163877, 163885, 163893, 163901, - 163909, 163917, 163925, 163930, 163935, 163940, 163945, 163950, 163955, - 163960, 163965, 163970, 0, 0, 0, 0, 163975, 163981, 163985, 163989, - 163993, 163997, 164001, 164005, 164009, 164013, 164017, 164021, 164025, - 164029, 164033, 164037, 164041, 164045, 164049, 164053, 164057, 164061, - 164065, 164069, 164073, 164077, 164081, 164085, 164089, 164093, 164097, - 164101, 164105, 164109, 164113, 164117, 164121, 164125, 164129, 164133, - 164137, 164141, 164145, 164149, 164153, 164157, 164161, 164165, 164169, - 164173, 164177, 164182, 164186, 164190, 164194, 164198, 164202, 164206, - 164210, 164214, 164218, 164222, 164226, 164230, 164234, 164238, 164242, - 164246, 164250, 164254, 164258, 164262, 164266, 164270, 164274, 164278, - 164282, 164286, 164290, 164294, 164298, 164302, 164306, 164310, 164314, - 164318, 164322, 164326, 164330, 164334, 164338, 164342, 164346, 164350, - 164354, 164358, 164362, 164366, 164370, 164374, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 164378, 164384, 164393, 164401, 164409, 164418, 164427, - 164436, 164445, 164454, 164463, 164472, 164481, 164490, 164499, 0, 0, - 164508, 164517, 164525, 164533, 164542, 164551, 164560, 164569, 164578, - 164587, 164596, 164605, 164614, 164623, 164632, 0, 164640, 164649, - 164657, 164665, 164674, 164683, 164692, 164701, 164710, 164719, 164728, - 164737, 164746, 164755, 164764, 0, 164771, 164780, 164788, 164796, - 164805, 164814, 164823, 164832, 164841, 164850, 164859, 164868, 164877, - 164886, 164895, 164902, 164908, 164914, 164920, 164926, 164932, 164938, - 164944, 164950, 164956, 164962, 164968, 164974, 164980, 164986, 164992, - 164998, 165004, 165010, 165016, 165022, 165028, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 165034, 165041, 165046, 165050, 165054, 165058, 165063, 165068, - 165073, 165078, 165083, 165088, 165095, 0, 0, 0, 165104, 165109, 165115, - 165121, 165127, 165132, 165138, 165144, 165150, 165155, 165161, 165167, - 165172, 165178, 165184, 165189, 165195, 165201, 165206, 165212, 165218, - 165223, 165229, 165235, 165241, 165247, 165253, 165264, 165271, 165277, - 165280, 165283, 165286, 165291, 165297, 165303, 165309, 165314, 165320, - 165326, 165332, 165337, 165343, 165349, 165354, 165360, 165366, 165371, - 165377, 165383, 165388, 165394, 165400, 165405, 165411, 165417, 165423, - 165429, 165435, 165438, 165441, 165444, 165447, 165450, 165453, 165460, - 165468, 165476, 165484, 165491, 165499, 165507, 165515, 165522, 165530, - 165538, 165545, 165553, 165561, 165568, 165576, 165584, 165591, 165599, - 165607, 165614, 165622, 165630, 165638, 165646, 165654, 165659, 165664, - 0, 0, 0, 165669, 165676, 165684, 165692, 165700, 165707, 165715, 165723, - 165731, 165738, 165746, 165754, 165761, 165769, 165777, 165784, 165792, - 165800, 165807, 165815, 165823, 165830, 165838, 165846, 165854, 165862, - 165870, 165880, 165885, 165889, 165893, 165898, 165903, 165906, 165909, - 165912, 165915, 165918, 165921, 165924, 165927, 165930, 165936, 165939, - 165943, 165948, 165952, 165957, 165962, 165968, 165974, 165980, 165985, - 165993, 165999, 166002, 166005, 166008, 166011, 166014, 166017, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163660, 163670, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 163678, 163685, 163692, 163699, 163705, + 163712, 163719, 163725, 163732, 163739, 163746, 163754, 163762, 163770, + 163778, 163786, 163794, 163801, 163808, 163815, 163823, 163831, 163839, + 163847, 163855, 163863, 163870, 163877, 163884, 163892, 163900, 163908, + 163916, 163924, 163932, 163937, 163942, 163947, 163952, 163957, 163962, + 163967, 163972, 163977, 0, 0, 0, 0, 163982, 163988, 163992, 163996, + 164000, 164004, 164008, 164012, 164016, 164020, 164024, 164028, 164032, + 164036, 164040, 164044, 164048, 164052, 164056, 164060, 164064, 164068, + 164072, 164076, 164080, 164084, 164088, 164092, 164096, 164100, 164104, + 164108, 164112, 164116, 164120, 164124, 164128, 164132, 164136, 164140, + 164144, 164148, 164152, 164156, 164160, 164164, 164168, 164172, 164176, + 164180, 164184, 164189, 164193, 164197, 164201, 164205, 164209, 164213, + 164217, 164221, 164225, 164229, 164233, 164237, 164241, 164245, 164249, + 164253, 164257, 164261, 164265, 164269, 164273, 164277, 164281, 164285, + 164289, 164293, 164297, 164301, 164305, 164309, 164313, 164317, 164321, + 164325, 164329, 164333, 164337, 164341, 164345, 164349, 164353, 164357, + 164361, 164365, 164369, 164373, 164377, 164381, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 164385, 164391, 164400, 164408, 164416, 164425, 164434, + 164443, 164452, 164461, 164470, 164479, 164488, 164497, 164506, 0, 0, + 164515, 164524, 164532, 164540, 164549, 164558, 164567, 164576, 164585, + 164594, 164603, 164612, 164621, 164630, 164639, 0, 164647, 164656, + 164664, 164672, 164681, 164690, 164699, 164708, 164717, 164726, 164735, + 164744, 164753, 164762, 164771, 0, 164778, 164787, 164795, 164803, + 164812, 164821, 164830, 164839, 164848, 164857, 164866, 164875, 164884, + 164893, 164902, 164909, 164915, 164921, 164927, 164933, 164939, 164945, + 164951, 164957, 164963, 164969, 164975, 164981, 164987, 164993, 164999, + 165005, 165011, 165017, 165023, 165029, 165035, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 165041, 165048, 165053, 165057, 165061, 165065, 165070, 165075, + 165080, 165085, 165090, 165095, 165102, 0, 0, 0, 165111, 165116, 165122, + 165128, 165134, 165139, 165145, 165151, 165157, 165162, 165168, 165174, + 165179, 165185, 165191, 165196, 165202, 165208, 165213, 165219, 165225, + 165230, 165236, 165242, 165248, 165254, 165260, 165271, 165278, 165284, + 165287, 165290, 165293, 165298, 165304, 165310, 165316, 165321, 165327, + 165333, 165339, 165344, 165350, 165356, 165361, 165367, 165373, 165378, + 165384, 165390, 165395, 165401, 165407, 165412, 165418, 165424, 165430, + 165436, 165442, 165445, 165448, 165451, 165454, 165457, 165460, 165467, + 165475, 165483, 165491, 165498, 165506, 165514, 165522, 165529, 165537, + 165545, 165552, 165560, 165568, 165575, 165583, 165591, 165598, 165606, + 165614, 165621, 165629, 165637, 165645, 165653, 165661, 165666, 165671, + 0, 0, 0, 165676, 165683, 165691, 165699, 165707, 165714, 165722, 165730, + 165738, 165745, 165753, 165761, 165768, 165776, 165784, 165791, 165799, + 165807, 165814, 165822, 165830, 165837, 165845, 165853, 165861, 165869, + 165877, 165887, 165892, 165896, 165900, 165905, 165910, 165913, 165916, + 165919, 165922, 165925, 165928, 165931, 165934, 165937, 165943, 165946, + 165950, 165955, 165959, 165964, 165969, 165975, 165981, 165987, 165992, + 166000, 166006, 166009, 166012, 166015, 166018, 166021, 166024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 166020, 166027, 166035, 166043, 166051, 166058, 166066, - 166074, 166082, 166089, 166097, 166105, 166112, 166120, 166128, 166135, - 166143, 166151, 166158, 166166, 166174, 166181, 166189, 166197, 166205, - 166213, 166221, 166225, 166229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 166232, 166238, 166244, 166250, 166254, 166260, 166266, 166272, 166278, - 166284, 166290, 166296, 166302, 166308, 166314, 166320, 166326, 166332, - 166338, 166344, 166350, 166356, 166362, 166368, 166374, 166380, 166386, - 166392, 166398, 166404, 166410, 166416, 166422, 166428, 166434, 166440, - 166446, 166452, 166458, 166464, 166470, 166476, 166482, 166488, 0, 0, 0, - 0, 166494, 166505, 166516, 166527, 166538, 166549, 166560, 166571, - 166582, 0, 0, 0, 0, 0, 0, 0, 166593, 166598, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 166603, 166609, 166615, 166621, 166627, 166633, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 166027, 166034, 166042, 166050, 166058, 166065, 166073, + 166081, 166089, 166096, 166104, 166112, 166119, 166127, 166135, 166142, + 166150, 166158, 166165, 166173, 166181, 166188, 166196, 166204, 166212, + 166220, 166228, 166232, 166236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 166239, 166245, 166251, 166257, 166261, 166267, 166273, 166279, 166285, + 166291, 166297, 166303, 166309, 166315, 166321, 166327, 166333, 166339, + 166345, 166351, 166357, 166363, 166369, 166375, 166381, 166387, 166393, + 166399, 166405, 166411, 166417, 166423, 166429, 166435, 166441, 166447, + 166453, 166459, 166465, 166471, 166477, 166483, 166489, 166495, 0, 0, 0, + 0, 166501, 166512, 166523, 166534, 166545, 166556, 166567, 166578, + 166589, 0, 0, 0, 0, 0, 0, 0, 166600, 166605, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 166610, 166616, 166622, 166628, 166634, 166640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 166639, 166641, 166643, 166647, 166652, 166657, 166659, 166665, 166670, - 166672, 166678, 166682, 166684, 166688, 166694, 166700, 166706, 166711, - 166716, 166723, 166730, 166737, 166742, 166749, 166756, 166763, 166767, - 166774, 166783, 166792, 166799, 166804, 166808, 166812, 166814, 166817, - 166820, 166827, 166834, 166844, 166849, 166854, 166859, 166864, 166866, - 166872, 166876, 166878, 166880, 166882, 166884, 166888, 166892, 166896, - 166898, 166902, 166904, 166908, 166910, 166912, 166914, 166916, 166921, - 166926, 166928, 166934, 166938, 166942, 166950, 166952, 166954, 166956, - 166958, 166960, 166962, 166964, 166966, 166968, 166970, 166974, 166978, - 166980, 166982, 166984, 166986, 166988, 166993, 166999, 167003, 167007, - 167011, 167015, 167020, 167024, 167026, 167028, 167032, 167038, 167040, - 167042, 167044, 167048, 167057, 167063, 167067, 167071, 167073, 167075, - 167078, 167080, 167082, 167084, 167088, 167090, 167094, 167099, 167101, - 167106, 167112, 167119, 167123, 167127, 167131, 167135, 167141, 167145, - 167153, 167160, 167162, 167164, 167168, 167172, 167174, 167178, 167182, - 167184, 167188, 167190, 167194, 167198, 167202, 167206, 167210, 167214, - 167218, 167222, 167228, 167232, 167236, 167247, 167252, 167256, 167260, - 167266, 167270, 167274, 167278, 167285, 167292, 167296, 167300, 167304, - 167308, 167312, 167319, 167321, 167325, 167327, 167329, 167333, 167337, - 167341, 167343, 167347, 167351, 167355, 167359, 167363, 167365, 167369, - 167371, 167377, 167380, 167385, 167387, 167389, 167392, 167394, 167396, - 167399, 167406, 167413, 167420, 167425, 167429, 167431, 167433, 167435, - 167439, 167441, 167445, 167449, 167453, 167455, 167459, 167461, 167465, - 167469, 167476, 167478, 167487, 167496, 167505, 167511, 167513, 167518, - 167522, 167526, 167528, 167534, 167538, 167540, 167544, 167548, 167550, - 167554, 167559, 167563, 167569, 167575, 167577, 167579, 167585, 167587, - 167591, 167595, 167597, 167601, 167603, 167607, 167611, 167615, 167618, - 167621, 167626, 167631, 167633, 167636, 167638, 167645, 167649, 167651, - 167658, 167665, 167672, 167679, 167686, 167688, 167690, 167692, 167696, - 167698, 167700, 167702, 167704, 167706, 167708, 167710, 167712, 167714, - 167716, 167718, 167720, 167722, 167724, 167726, 167728, 167730, 167732, - 167734, 167736, 167738, 167740, 167744, 167746, 167748, 167750, 167754, - 167756, 167760, 167762, 167764, 167768, 167772, 167778, 167780, 167782, - 167784, 167786, 167790, 167794, 167796, 167800, 167804, 167808, 167812, - 167816, 167820, 167824, 167828, 167832, 167836, 167840, 167844, 167848, - 167852, 167856, 167860, 167864, 167868, 167870, 167872, 167874, 167876, - 167878, 167880, 167882, 167890, 167898, 167906, 167914, 167919, 167924, - 167929, 167933, 167937, 167942, 167946, 167948, 167952, 167954, 167956, - 167958, 167960, 167962, 167964, 167966, 167970, 167972, 167974, 167976, - 167980, 167984, 167988, 167992, 167996, 167998, 168004, 168010, 168012, - 168014, 168016, 168018, 168020, 168029, 168036, 168043, 168047, 168054, - 168059, 168066, 168075, 168080, 168084, 168088, 168090, 168094, 168096, - 168100, 168104, 168106, 168110, 168114, 168118, 168120, 168122, 168128, - 168130, 168132, 168134, 168138, 168142, 168144, 168148, 168150, 168152, - 168155, 168159, 168161, 168165, 168167, 168169, 168174, 168176, 168180, - 168184, 168187, 168191, 168195, 168199, 168203, 168207, 168211, 168215, - 168220, 168224, 168228, 168237, 168242, 168245, 168247, 168250, 168253, - 168258, 168260, 168263, 168268, 168272, 168275, 168279, 168283, 168286, - 168291, 168295, 168299, 168303, 168307, 168313, 168319, 168325, 168331, - 168336, 168347, 168349, 168353, 168355, 168357, 168361, 168365, 168367, - 168371, 168376, 168381, 168387, 168389, 168393, 168397, 168404, 168411, - 168415, 168417, 168419, 168423, 168425, 168429, 168433, 168437, 168439, - 168441, 168448, 168452, 168455, 168459, 168463, 168467, 168469, 168473, - 168475, 168477, 168481, 168483, 168487, 168491, 168497, 168501, 168505, - 168509, 168511, 168514, 168518, 168525, 168534, 168543, 168551, 168559, - 168561, 168565, 168567, 168571, 168582, 168586, 168592, 168598, 168603, - 168605, 168610, 168614, 168616, 168618, 168620, 168624, 168628, 168632, - 168637, 168647, 168662, 168674, 168686, 168690, 168694, 168700, 168702, - 168710, 168718, 168720, 168724, 168730, 168736, 168743, 168750, 168752, - 168754, 168757, 168759, 168765, 168767, 168770, 168774, 168780, 168786, - 168797, 168803, 168810, 168818, 168822, 168830, 168838, 168844, 168850, - 168857, 168859, 168863, 168865, 168867, 168872, 168874, 168876, 168878, - 168880, 168884, 168894, 168900, 168904, 168908, 168912, 168918, 168924, - 168930, 168936, 168941, 168946, 168952, 168958, 168965, 168972, 168980, - 168988, 168993, 169001, 169005, 169014, 169023, 169029, 169033, 169037, - 169041, 169044, 169049, 169051, 169053, 169055, 169062, 169067, 169074, - 169081, 169088, 169096, 169104, 169112, 169120, 169128, 169136, 169144, - 169152, 169160, 169166, 169172, 169178, 169184, 169190, 169196, 169202, - 169208, 169214, 169220, 169226, 169232, 169235, 169244, 169253, 169255, - 169262, 169266, 169268, 169270, 169274, 169280, 169284, 169286, 169296, - 169302, 169306, 169308, 169312, 169314, 169318, 169325, 169332, 169339, - 169344, 169349, 169358, 169364, 169369, 169373, 169378, 169382, 169389, - 169393, 169396, 169401, 169408, 169415, 169420, 169425, 169430, 169436, - 169445, 169456, 169462, 169468, 169474, 169484, 169499, 169508, 169516, - 169524, 169532, 169540, 169548, 169556, 169564, 169572, 169580, 169588, - 169596, 169604, 169607, 169611, 169616, 169621, 169623, 169627, 169636, - 169645, 169653, 169657, 169661, 169666, 169671, 169676, 169678, 169683, - 169687, 169689, 169693, 169697, 169703, 169708, 169716, 169721, 169726, - 169731, 169738, 169741, 169743, 169746, 169751, 169757, 169761, 169765, - 169771, 169777, 169779, 169783, 169787, 169791, 169795, 169799, 169801, - 169803, 169805, 169807, 169813, 169819, 169823, 169825, 169827, 169829, - 169838, 169842, 169849, 169856, 169858, 169861, 169865, 169871, 169875, - 169879, 169881, 169889, 169893, 169897, 169902, 169907, 169912, 169917, - 169922, 169927, 169932, 169937, 169942, 169947, 169951, 169957, 169961, - 169967, 169972, 169979, 169985, 169993, 169997, 170004, 170008, 170012, - 170016, 170021, 170026, 170028, 170032, 170041, 170049, 170057, 170070, - 170083, 170096, 170103, 170110, 170114, 170123, 170131, 170135, 170144, - 170151, 170155, 170159, 170163, 170167, 170174, 170178, 170182, 170186, - 170190, 170197, 170206, 170215, 170222, 170234, 170246, 170250, 170254, - 170258, 170262, 170266, 170270, 170278, 170286, 170294, 170298, 170302, - 170306, 170310, 170314, 170318, 170324, 170330, 170334, 170345, 170353, - 170357, 170361, 170365, 170369, 170375, 170382, 170393, 170403, 170413, - 170424, 170433, 170444, 170450, 170456, 170462, 170468, 170474, 170478, - 170485, 170494, 170501, 170507, 170511, 170515, 170519, 170528, 170540, - 170544, 170551, 170558, 170565, 170573, 170580, 170588, 170596, 170605, - 170613, 170622, 170631, 170641, 170650, 170660, 170670, 170681, 170691, - 170702, 170709, 170717, 170724, 170732, 170740, 170749, 170757, 170766, - 170773, 170785, 170792, 170804, 170807, 170811, 170814, 170818, 170824, - 170831, 170837, 170844, 170849, 170855, 170866, 170876, 170887, 170892, - 170897, 170903, 170908, 170915, 170919, 170925, 170927, 170929, 170933, - 170937, 170941, 170950, 170952, 170954, 170957, 170959, 170961, 170965, - 170967, 170971, 170973, 170977, 170979, 170981, 170985, 170989, 170995, - 170997, 171001, 171003, 171007, 171011, 171015, 171019, 171021, 171023, - 171027, 171031, 171035, 171039, 171041, 171043, 171045, 171051, 171056, - 171059, 171067, 171075, 171077, 171082, 171085, 171090, 171101, 171108, - 171113, 171118, 171120, 171124, 171126, 171130, 171132, 171136, 171140, - 171143, 171146, 171148, 171151, 171153, 171157, 171159, 171161, 171163, - 171167, 171169, 171173, 171176, 171183, 171186, 171191, 171194, 171197, - 171202, 171206, 171210, 171214, 171216, 171221, 171224, 171228, 171230, - 171232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171236, 171241, 171243, 171247, - 171249, 171253, 171257, 171263, 171267, 171272, 171275, 171279, 171283, - 0, 0, 0, 171287, 171289, 171295, 171299, 171303, 171305, 171309, 171311, - 171313, 171317, 171319, 0, 0, 0, 0, 0, 171323, 171328, 171333, 171338, - 171343, 171348, 171353, 171360, 171367, 171374, 171381, 171386, 171391, - 171396, 171401, 171408, 171414, 171421, 171428, 171435, 171440, 171445, - 171450, 171455, 171460, 171467, 171474, 171479, 171484, 171491, 171498, - 171506, 171514, 171521, 171528, 171536, 171544, 171552, 171559, 171569, - 171580, 171585, 171592, 171599, 171606, 171614, 171622, 171633, 171641, - 171649, 171657, 171662, 171667, 171672, 171677, 171682, 171687, 171692, - 171697, 171702, 171707, 171712, 171717, 171724, 171729, 171734, 171741, - 171746, 171751, 171756, 171761, 171766, 171771, 171776, 171781, 171786, - 171791, 171796, 171801, 171808, 171816, 171821, 171826, 171833, 171838, - 171843, 171848, 171855, 171860, 171867, 171872, 171879, 171884, 171893, - 171902, 171907, 171912, 171917, 171922, 171927, 171932, 171937, 171942, - 171947, 171952, 171957, 171962, 171967, 171975, 171983, 171988, 171993, - 171998, 172003, 172008, 172014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 172020, 172028, 172036, 172044, 172052, 172058, 172064, 172068, 172072, - 172078, 172084, 172093, 172097, 172102, 172108, 172112, 172117, 172121, - 172125, 172131, 172137, 172147, 172156, 172159, 172164, 172170, 172176, - 172187, 172197, 172201, 172206, 172212, 172218, 172227, 172232, 172236, - 172241, 172245, 172251, 172257, 172263, 172267, 172270, 172274, 172277, - 172280, 172285, 172290, 172297, 172305, 172312, 172319, 172328, 172337, - 172344, 172352, 172359, 172366, 172375, 172384, 172391, 172399, 172406, - 172413, 172422, 172429, 172437, 172443, 172452, 172460, 172469, 172476, - 172486, 172497, 172505, 172513, 172522, 172530, 172538, 172547, 172555, - 172565, 172574, 172582, 172590, 172599, 172602, 172607, 172610, 0, 0, 0, - 0, 0, 0, 0, 172615, 172621, 172627, 172633, 172639, 172645, 172651, - 172657, 172663, 172669, 172675, 172681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 172687, 172695, 172704, 172712, 172721, - 172730, 172740, 172749, 172759, 172768, 172778, 172787, 0, 0, 0, 0, - 172797, 172805, 172814, 172822, 172831, 172838, 172846, 172853, 172861, - 172869, 172878, 172886, 172895, 172905, 172916, 172926, 172937, 172946, - 172956, 172965, 172975, 172984, 172994, 173003, 173013, 173021, 173030, - 173038, 173047, 173055, 173064, 173072, 173081, 173091, 173102, 173112, - 173123, 173127, 173132, 173136, 173141, 173144, 173148, 173151, 173155, - 173159, 173164, 173168, 173173, 173178, 173184, 173189, 173195, 173198, - 173202, 173205, 0, 0, 0, 0, 0, 0, 0, 0, 173209, 173212, 173216, 173219, - 173223, 173228, 173233, 173239, 173245, 173249, 0, 0, 0, 0, 0, 0, 173253, - 173259, 173266, 173272, 173279, 173287, 173295, 173304, 173313, 173318, - 173324, 173329, 173335, 173342, 173349, 173357, 173365, 173372, 173380, - 173387, 173395, 173404, 173413, 173423, 173433, 173439, 173446, 173452, - 173459, 173467, 173475, 173484, 173493, 173501, 173510, 173518, 173527, - 173537, 173547, 173558, 0, 0, 0, 0, 0, 0, 0, 0, 173569, 173574, 173580, - 173585, 173591, 173600, 173610, 173619, 173629, 173636, 173644, 173651, - 173659, 173666, 173675, 173684, 173693, 173698, 173705, 173712, 173719, - 173724, 173729, 173734, 173739, 173746, 173753, 173760, 173767, 173774, + 166646, 166648, 166650, 166654, 166659, 166664, 166666, 166672, 166677, + 166679, 166685, 166689, 166691, 166695, 166701, 166707, 166713, 166718, + 166723, 166730, 166737, 166744, 166749, 166756, 166763, 166770, 166774, + 166781, 166790, 166799, 166806, 166811, 166815, 166819, 166821, 166824, + 166827, 166834, 166841, 166851, 166856, 166861, 166866, 166871, 166873, + 166879, 166883, 166885, 166887, 166889, 166891, 166895, 166899, 166903, + 166905, 166909, 166911, 166915, 166917, 166919, 166921, 166923, 166928, + 166933, 166935, 166941, 166945, 166949, 166957, 166959, 166961, 166963, + 166965, 166967, 166969, 166971, 166973, 166975, 166977, 166981, 166985, + 166987, 166989, 166991, 166993, 166995, 167000, 167006, 167010, 167014, + 167018, 167022, 167027, 167031, 167033, 167035, 167039, 167045, 167047, + 167049, 167051, 167055, 167064, 167070, 167074, 167078, 167080, 167082, + 167085, 167087, 167089, 167091, 167095, 167097, 167101, 167106, 167108, + 167113, 167119, 167126, 167130, 167134, 167138, 167142, 167148, 167152, + 167160, 167167, 167169, 167171, 167175, 167179, 167181, 167185, 167189, + 167191, 167195, 167197, 167201, 167205, 167209, 167213, 167217, 167221, + 167225, 167229, 167235, 167239, 167243, 167254, 167259, 167263, 167267, + 167273, 167277, 167281, 167285, 167292, 167299, 167303, 167307, 167311, + 167315, 167319, 167326, 167328, 167332, 167334, 167336, 167340, 167344, + 167348, 167350, 167354, 167358, 167362, 167366, 167370, 167372, 167376, + 167378, 167384, 167387, 167392, 167394, 167396, 167399, 167401, 167403, + 167406, 167413, 167420, 167427, 167432, 167436, 167438, 167440, 167442, + 167446, 167448, 167452, 167456, 167460, 167462, 167466, 167468, 167472, + 167476, 167483, 167485, 167494, 167503, 167512, 167518, 167520, 167525, + 167529, 167533, 167535, 167541, 167545, 167547, 167551, 167555, 167557, + 167561, 167566, 167570, 167576, 167582, 167584, 167586, 167592, 167594, + 167598, 167602, 167604, 167608, 167610, 167614, 167618, 167622, 167625, + 167628, 167633, 167638, 167640, 167643, 167645, 167652, 167656, 167658, + 167665, 167672, 167679, 167686, 167693, 167695, 167697, 167699, 167703, + 167705, 167707, 167709, 167711, 167713, 167715, 167717, 167719, 167721, + 167723, 167725, 167727, 167729, 167731, 167733, 167735, 167737, 167739, + 167741, 167743, 167745, 167747, 167751, 167753, 167755, 167757, 167761, + 167763, 167767, 167769, 167771, 167775, 167779, 167785, 167787, 167789, + 167791, 167793, 167797, 167801, 167803, 167807, 167811, 167815, 167819, + 167823, 167827, 167831, 167835, 167839, 167843, 167847, 167851, 167855, + 167859, 167863, 167867, 167871, 167875, 167877, 167879, 167881, 167883, + 167885, 167887, 167889, 167897, 167905, 167913, 167921, 167926, 167931, + 167936, 167940, 167944, 167949, 167953, 167955, 167959, 167961, 167963, + 167965, 167967, 167969, 167971, 167973, 167977, 167979, 167981, 167983, + 167987, 167991, 167995, 167999, 168003, 168005, 168011, 168017, 168019, + 168021, 168023, 168025, 168027, 168036, 168043, 168050, 168054, 168061, + 168066, 168073, 168082, 168087, 168091, 168095, 168097, 168101, 168103, + 168107, 168111, 168113, 168117, 168121, 168125, 168127, 168129, 168135, + 168137, 168139, 168141, 168145, 168149, 168151, 168155, 168157, 168159, + 168162, 168166, 168168, 168172, 168174, 168176, 168181, 168183, 168187, + 168191, 168194, 168198, 168202, 168206, 168210, 168214, 168218, 168222, + 168227, 168231, 168235, 168244, 168249, 168252, 168254, 168257, 168260, + 168265, 168267, 168270, 168275, 168279, 168282, 168286, 168290, 168293, + 168298, 168302, 168306, 168310, 168314, 168320, 168326, 168332, 168338, + 168343, 168354, 168356, 168360, 168362, 168364, 168368, 168372, 168374, + 168378, 168383, 168388, 168394, 168396, 168400, 168404, 168411, 168418, + 168422, 168424, 168426, 168430, 168432, 168436, 168440, 168444, 168446, + 168448, 168455, 168459, 168462, 168466, 168470, 168474, 168476, 168480, + 168482, 168484, 168488, 168490, 168494, 168498, 168504, 168508, 168512, + 168516, 168518, 168521, 168525, 168532, 168541, 168550, 168558, 168566, + 168568, 168572, 168574, 168578, 168589, 168593, 168599, 168605, 168610, + 168612, 168617, 168621, 168623, 168625, 168627, 168631, 168635, 168639, + 168644, 168654, 168669, 168681, 168693, 168697, 168701, 168707, 168709, + 168717, 168725, 168727, 168731, 168737, 168743, 168750, 168757, 168759, + 168761, 168764, 168766, 168772, 168774, 168777, 168781, 168787, 168793, + 168804, 168810, 168817, 168825, 168829, 168837, 168845, 168851, 168857, + 168864, 168866, 168870, 168872, 168874, 168879, 168881, 168883, 168885, + 168887, 168891, 168901, 168907, 168911, 168915, 168919, 168925, 168931, + 168937, 168943, 168948, 168953, 168959, 168965, 168972, 168979, 168987, + 168995, 169000, 169008, 169012, 169021, 169030, 169036, 169040, 169044, + 169048, 169051, 169056, 169058, 169060, 169062, 169069, 169074, 169081, + 169088, 169095, 169103, 169111, 169119, 169127, 169135, 169143, 169151, + 169159, 169167, 169173, 169179, 169185, 169191, 169197, 169203, 169209, + 169215, 169221, 169227, 169233, 169239, 169242, 169251, 169260, 169262, + 169269, 169273, 169275, 169277, 169281, 169287, 169291, 169293, 169303, + 169309, 169313, 169315, 169319, 169321, 169325, 169332, 169339, 169346, + 169351, 169356, 169365, 169371, 169376, 169380, 169385, 169389, 169396, + 169400, 169403, 169408, 169415, 169422, 169427, 169432, 169437, 169443, + 169452, 169463, 169469, 169475, 169481, 169491, 169506, 169515, 169523, + 169531, 169539, 169547, 169555, 169563, 169571, 169579, 169587, 169595, + 169603, 169611, 169614, 169618, 169623, 169628, 169630, 169634, 169643, + 169652, 169660, 169664, 169668, 169673, 169678, 169683, 169685, 169690, + 169694, 169696, 169700, 169704, 169710, 169715, 169723, 169728, 169733, + 169738, 169745, 169748, 169750, 169753, 169758, 169764, 169768, 169772, + 169778, 169784, 169786, 169790, 169794, 169798, 169802, 169806, 169808, + 169810, 169812, 169814, 169820, 169826, 169830, 169832, 169834, 169836, + 169845, 169849, 169856, 169863, 169865, 169868, 169872, 169878, 169882, + 169886, 169888, 169896, 169900, 169904, 169909, 169914, 169919, 169924, + 169929, 169934, 169939, 169944, 169949, 169954, 169958, 169964, 169968, + 169974, 169979, 169986, 169992, 170000, 170004, 170011, 170015, 170019, + 170023, 170028, 170033, 170035, 170039, 170048, 170056, 170064, 170077, + 170090, 170103, 170110, 170117, 170121, 170130, 170138, 170142, 170151, + 170158, 170162, 170166, 170170, 170174, 170181, 170185, 170189, 170193, + 170197, 170204, 170213, 170222, 170229, 170241, 170253, 170257, 170261, + 170265, 170269, 170273, 170277, 170285, 170293, 170301, 170305, 170309, + 170313, 170317, 170321, 170325, 170331, 170337, 170341, 170352, 170360, + 170364, 170368, 170372, 170376, 170382, 170389, 170400, 170410, 170420, + 170431, 170440, 170451, 170457, 170463, 170469, 170475, 170481, 170485, + 170492, 170501, 170508, 170514, 170518, 170522, 170526, 170535, 170547, + 170551, 170558, 170565, 170572, 170580, 170587, 170595, 170603, 170612, + 170620, 170629, 170638, 170648, 170657, 170667, 170677, 170688, 170698, + 170709, 170716, 170724, 170731, 170739, 170747, 170756, 170764, 170773, + 170780, 170792, 170799, 170811, 170814, 170818, 170821, 170825, 170831, + 170838, 170844, 170851, 170856, 170862, 170873, 170883, 170894, 170899, + 170904, 170910, 170915, 170922, 170926, 170932, 170934, 170936, 170940, + 170944, 170948, 170957, 170959, 170961, 170964, 170966, 170968, 170972, + 170974, 170978, 170980, 170984, 170986, 170988, 170992, 170996, 171002, + 171004, 171008, 171010, 171014, 171018, 171022, 171026, 171028, 171030, + 171034, 171038, 171042, 171046, 171048, 171050, 171052, 171058, 171063, + 171066, 171074, 171082, 171084, 171089, 171092, 171097, 171108, 171115, + 171120, 171125, 171127, 171131, 171133, 171137, 171139, 171143, 171147, + 171150, 171153, 171155, 171158, 171160, 171164, 171166, 171168, 171170, + 171174, 171176, 171180, 171183, 171190, 171193, 171198, 171201, 171204, + 171209, 171213, 171217, 171221, 171223, 171228, 171231, 171235, 171237, + 171239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171243, 171248, 171250, 171254, + 171256, 171260, 171264, 171270, 171274, 171279, 171282, 171286, 171290, + 0, 0, 0, 171294, 171296, 171302, 171306, 171310, 171312, 171316, 171318, + 171320, 171324, 171326, 0, 0, 0, 0, 0, 171330, 171335, 171340, 171345, + 171350, 171355, 171360, 171367, 171374, 171381, 171388, 171393, 171398, + 171403, 171408, 171415, 171421, 171428, 171435, 171442, 171447, 171452, + 171457, 171462, 171467, 171474, 171481, 171486, 171491, 171498, 171505, + 171513, 171521, 171528, 171535, 171543, 171551, 171559, 171566, 171576, + 171587, 171592, 171599, 171606, 171613, 171621, 171629, 171640, 171648, + 171656, 171664, 171669, 171674, 171679, 171684, 171689, 171694, 171699, + 171704, 171709, 171714, 171719, 171724, 171731, 171736, 171741, 171748, + 171753, 171758, 171763, 171768, 171773, 171778, 171783, 171788, 171793, + 171798, 171803, 171808, 171815, 171823, 171828, 171833, 171840, 171845, + 171850, 171855, 171862, 171867, 171874, 171879, 171886, 171891, 171900, + 171909, 171914, 171919, 171924, 171929, 171934, 171939, 171944, 171949, + 171954, 171959, 171964, 171969, 171974, 171982, 171990, 171995, 172000, + 172005, 172010, 172015, 172021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 172027, 172035, 172043, 172051, 172059, 172065, 172071, 172075, 172079, + 172085, 172091, 172100, 172104, 172109, 172115, 172119, 172124, 172128, + 172132, 172138, 172144, 172154, 172163, 172166, 172171, 172177, 172183, + 172194, 172204, 172208, 172213, 172219, 172225, 172234, 172239, 172243, + 172248, 172252, 172258, 172264, 172270, 172274, 172277, 172281, 172284, + 172287, 172292, 172297, 172304, 172312, 172319, 172326, 172335, 172344, + 172351, 172359, 172366, 172373, 172382, 172391, 172398, 172406, 172413, + 172420, 172429, 172436, 172444, 172450, 172459, 172467, 172476, 172483, + 172493, 172504, 172512, 172520, 172529, 172537, 172545, 172554, 172562, + 172572, 172581, 172589, 172597, 172606, 172609, 172614, 172617, 0, 0, 0, + 0, 0, 0, 0, 172622, 172628, 172634, 172640, 172646, 172652, 172658, + 172664, 172670, 172676, 172682, 172688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 172694, 172702, 172711, 172719, 172728, + 172737, 172747, 172756, 172766, 172775, 172785, 172794, 0, 0, 0, 0, + 172804, 172812, 172821, 172829, 172838, 172845, 172853, 172860, 172868, + 172876, 172885, 172893, 172902, 172912, 172923, 172933, 172944, 172953, + 172963, 172972, 172982, 172991, 173001, 173010, 173020, 173028, 173037, + 173045, 173054, 173062, 173071, 173079, 173088, 173098, 173109, 173119, + 173130, 173134, 173139, 173143, 173148, 173151, 173155, 173158, 173162, + 173166, 173171, 173175, 173180, 173185, 173191, 173196, 173202, 173205, + 173209, 173212, 0, 0, 0, 0, 0, 0, 0, 0, 173216, 173219, 173223, 173226, + 173230, 173235, 173240, 173246, 173252, 173256, 0, 0, 0, 0, 0, 0, 173260, + 173266, 173273, 173279, 173286, 173294, 173302, 173311, 173320, 173325, + 173331, 173336, 173342, 173349, 173356, 173364, 173372, 173379, 173387, + 173394, 173402, 173411, 173420, 173430, 173440, 173446, 173453, 173459, + 173466, 173474, 173482, 173491, 173500, 173508, 173517, 173525, 173534, + 173544, 173554, 173565, 0, 0, 0, 0, 0, 0, 0, 0, 173576, 173581, 173587, + 173592, 173598, 173607, 173617, 173626, 173636, 173643, 173651, 173658, + 173666, 173673, 173682, 173691, 173700, 173705, 173712, 173719, 173726, + 173731, 173736, 173741, 173746, 173753, 173760, 173767, 173774, 173781, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173783, 173793, 173802, 173807, 173816, - 173824, 173832, 173839, 173843, 173848, 173855, 173864, 0, 173875, - 173878, 173882, 173886, 173890, 173894, 173899, 173903, 173907, 173912, - 173916, 173920, 173926, 173932, 173939, 173943, 173947, 173949, 173959, - 173968, 173975, 173979, 173983, 173993, 173997, 174001, 174005, 174009, - 174017, 174026, 174039, 174050, 174061, 174077, 174085, 174094, 174098, - 174100, 174105, 174107, 174109, 174115, 174119, 174121, 174127, 174129, - 174131, 174135, 174137, 174141, 174143, 174147, 174151, 174156, 174160, - 174164, 174166, 174170, 174172, 174178, 174184, 174190, 174194, 174200, - 174204, 174211, 174213, 174217, 174219, 174221, 174223, 174225, 174227, - 174229, 174233, 174237, 174244, 174248, 174250, 174255, 174257, 174259, - 174261, 174263, 174267, 174271, 174273, 174278, 174283, 174285, 174287, - 174289, 174291, 174296, 174298, 174302, 174306, 174308, 174312, 174314, - 174327, 0, 174331, 174343, 174355, 174359, 0, 0, 0, 174363, 174370, - 174372, 174376, 174378, 174382, 174386, 174388, 174392, 174394, 174396, - 174400, 174402, 174404, 174406, 174408, 174410, 174414, 174416, 174418, - 174420, 174422, 174424, 174426, 174428, 174432, 174436, 174438, 174440, - 174442, 174444, 174446, 174448, 174450, 174452, 174454, 174456, 174458, - 174460, 174462, 174464, 0, 0, 174466, 174468, 174470, 174472, 174474, - 174476, 0, 0, 0, 174478, 174482, 174486, 174494, 174502, 174508, 174515, - 174517, 174519, 174521, 174523, 174525, 174527, 174531, 174538, 174542, - 174546, 174550, 174554, 174558, 174560, 174564, 174568, 174570, 174572, - 174574, 174576, 174578, 174582, 0, 0, 174586, 174590, 174594, 174598, - 174603, 174605, 174607, 174611, 174615, 174620, 174628, 174632, 174640, - 174642, 174644, 174646, 174648, 174650, 174652, 174654, 174656, 174660, - 174664, 174666, 174668, 174670, 174672, 174678, 174680, 174686, 174690, - 174694, 174699, 174701, 174703, 174707, 174709, 174711, 174713, 174715, - 174719, 174724, 174729, 174733, 174737, 174739, 174741, 174746, 174751, - 174753, 174755, 174759, 174765, 174771, 174777, 174783, 174789, 174795, - 174806, 174817, 174829, 174840, 174851, 174862, 174873, 174884, 174895, - 174906, 174917, 174928, 174939, 174950, 174961, 174973, 174985, 174997, - 175009, 175021, 175033, 175047, 175061, 175076, 175082, 175088, 175094, - 175100, 175106, 175112, 175118, 175124, 175130, 175136, 175142, 175148, - 175155, 175162, 175169, 175176, 175183, 175190, 175204, 175218, 175233, - 175247, 175261, 175275, 175289, 175303, 175317, 175331, 175345, 175359, - 175373, 175387, 175401, 175416, 175431, 175446, 175461, 175476, 175491, - 175505, 175519, 175534, 175539, 175544, 175550, 175561, 175572, 175584, - 175589, 175594, 175599, 175604, 175609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 175614, 175620, 175626, 175632, 175638, 175644, 175650, 175656, - 175661, 175666, 175671, 175676, 175681, 175686, 0, 0, 175691, 175695, - 175699, 175701, 0, 0, 0, 0, 175703, 175708, 175712, 0, 0, 0, 0, 0, - 175714, 175716, 175718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175720, - 175724, 175726, 175728, 175730, 175734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173790, 173800, 173809, 173814, 173823, + 173831, 173839, 173846, 173850, 173855, 173862, 173871, 0, 173882, + 173885, 173889, 173893, 173897, 173901, 173906, 173910, 173914, 173919, + 173923, 173927, 173933, 173939, 173946, 173950, 173954, 173956, 173966, + 173975, 173982, 173986, 173990, 174000, 174004, 174008, 174012, 174016, + 174024, 174033, 174046, 174057, 174068, 174084, 174092, 174101, 174105, + 174107, 174112, 174114, 174116, 174122, 174126, 174128, 174134, 174136, + 174138, 174142, 174144, 174148, 174150, 174154, 174158, 174163, 174167, + 174171, 174173, 174177, 174179, 174185, 174191, 174197, 174201, 174207, + 174211, 174218, 174220, 174224, 174226, 174228, 174230, 174232, 174234, + 174236, 174240, 174244, 174251, 174255, 174257, 174262, 174264, 174266, + 174268, 174270, 174274, 174278, 174280, 174285, 174290, 174292, 174294, + 174296, 174298, 174303, 174305, 174309, 174313, 174315, 174319, 174321, + 174334, 0, 174338, 174350, 174362, 174366, 0, 0, 0, 174370, 174377, + 174379, 174383, 174385, 174389, 174393, 174395, 174399, 174401, 174403, + 174407, 174409, 174411, 174413, 174415, 174417, 174421, 174423, 174425, + 174427, 174429, 174431, 174433, 174435, 174439, 174443, 174445, 174447, + 174449, 174451, 174453, 174455, 174457, 174459, 174461, 174463, 174465, + 174467, 174469, 174471, 0, 0, 174473, 174475, 174477, 174479, 174481, + 174483, 0, 0, 0, 174485, 174489, 174493, 174501, 174509, 174515, 174522, + 174524, 174526, 174528, 174530, 174532, 174534, 174538, 174545, 174549, + 174553, 174557, 174561, 174565, 174567, 174571, 174575, 174577, 174579, + 174581, 174583, 174585, 174589, 0, 0, 174593, 174597, 174601, 174605, + 174610, 174612, 174614, 174618, 174622, 174627, 174635, 174639, 174647, + 174649, 174651, 174653, 174655, 174657, 174659, 174661, 174663, 174667, + 174671, 174673, 174675, 174677, 174679, 174685, 174687, 174693, 174697, + 174701, 174706, 174708, 174710, 174714, 174716, 174718, 174720, 174722, + 174726, 174731, 174736, 174740, 174744, 174746, 174748, 174753, 174758, + 174760, 174762, 174766, 174772, 174778, 174784, 174790, 174796, 174802, + 174813, 174824, 174836, 174847, 174858, 174869, 174880, 174891, 174902, + 174913, 174924, 174935, 174946, 174957, 174968, 174980, 174992, 175004, + 175016, 175028, 175040, 175054, 175068, 175083, 175089, 175095, 175101, + 175107, 175113, 175119, 175125, 175131, 175137, 175143, 175149, 175155, + 175162, 175169, 175176, 175183, 175190, 175197, 175211, 175225, 175240, + 175254, 175268, 175282, 175296, 175310, 175324, 175338, 175352, 175366, + 175380, 175394, 175408, 175423, 175438, 175453, 175468, 175483, 175498, + 175512, 175526, 175541, 175546, 175551, 175557, 175568, 175579, 175591, + 175596, 175601, 175606, 175611, 175616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 175621, 175627, 175633, 175639, 175645, 175651, 175657, 175663, + 175668, 175673, 175678, 175683, 175688, 175693, 0, 0, 175698, 175702, + 175706, 175708, 0, 0, 0, 0, 175710, 175715, 175719, 0, 0, 0, 0, 0, + 175721, 175723, 175725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175727, + 175731, 175733, 175735, 175737, 175741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 175736, 175740, 175744, 175748, 175752, 175756, 175760, 175764, 175768, - 175772, 175776, 175780, 175784, 175788, 175792, 175796, 175800, 175804, - 175808, 175812, 175816, 175820, 175824, 175828, 175832, 175836, 175840, - 175844, 175848, 175852, 175856, 175860, 175864, 175868, 175872, 175876, - 175880, 175884, 175888, 175892, 175896, 175900, 175904, 175908, 175912, - 175916, 175920, 175924, 175928, 175932, 175936, 175940, 175944, 175948, - 175952, 175956, 175960, 175964, 175968, 175972, 175976, 175980, 175984, - 175988, 175992, 175996, 176000, 176004, 176008, 176012, 176016, 176020, - 176024, 176028, 176032, 176036, 176040, 176044, 176048, 176052, 176056, - 176060, 176064, 176068, 176072, 176076, 176080, 176084, 176088, 176092, - 176096, 176100, 176104, 176108, 176112, 176116, 176120, 176124, 176128, - 176132, 176136, 176140, 176144, 176148, 176152, 176156, 176160, 176164, - 176168, 176172, 176176, 176180, 176184, 176188, 176192, 176196, 176200, - 176204, 176208, 176212, 176216, 176220, 176224, 176228, 176232, 176236, - 176240, 176244, 176248, 176252, 176256, 176260, 176264, 176268, 176272, - 176276, 176280, 176284, 176288, 176292, 176296, 176300, 176304, 176308, - 176312, 176316, 176320, 176324, 176328, 176332, 176336, 176340, 176344, - 176348, 176352, 176356, 176360, 176364, 176368, 176372, 176376, 176380, - 176384, 176388, 176392, 176396, 176400, 176404, 176408, 176412, 176416, - 176420, 176424, 176428, 176432, 176436, 176440, 176444, 176448, 176452, - 176456, 176460, 176464, 176468, 176472, 176476, 176480, 176484, 176488, - 176492, 176496, 176500, 176504, 176508, 176512, 176516, 176520, 176524, - 176528, 176532, 176536, 176540, 176544, 176548, 176552, 176556, 176560, - 176564, 176568, 176572, 176576, 176580, 176584, 176588, 176592, 176596, - 176600, 176604, 176608, 176612, 176616, 176620, 176624, 176628, 176632, - 176636, 176640, 176644, 176648, 176652, 176656, 176660, 176664, 176668, - 176672, 176676, 176680, 176684, 176688, 176692, 176696, 176700, 176704, - 176708, 176712, 176716, 176720, 176724, 176728, 176732, 176736, 176740, - 176744, 176748, 176752, 176756, 176760, 176764, 176768, 176772, 176776, - 176780, 176784, 176788, 176792, 176796, 176800, 176804, 176808, 176812, - 176816, 176820, 176824, 176828, 176832, 176836, 176840, 176844, 176848, - 176852, 176856, 176860, 176864, 176868, 176872, 176876, 176880, 176884, - 176888, 176892, 176896, 176900, 176904, 176908, 176912, 176916, 176920, - 176924, 176928, 176932, 176936, 176940, 176944, 176948, 176952, 176956, - 176960, 176964, 176968, 176972, 176976, 176980, 176984, 176988, 176992, - 176996, 177000, 177004, 177008, 177012, 177016, 177020, 177024, 177028, - 177032, 177036, 177040, 177044, 177048, 177052, 177056, 177060, 177064, - 177068, 177072, 177076, 177080, 177084, 177088, 177092, 177096, 177100, - 177104, 177108, 177112, 177116, 177120, 177124, 177128, 177132, 177136, - 177140, 177144, 177148, 177152, 177156, 177160, 177164, 177168, 177172, - 177176, 177180, 177184, 177188, 177192, 177196, 177200, 177204, 177208, - 177212, 177216, 177220, 177224, 177228, 177232, 177236, 177240, 177244, - 177248, 177252, 177256, 177260, 177264, 177268, 177272, 177276, 177280, - 177284, 177288, 177292, 177296, 177300, 177304, 177308, 177312, 177316, - 177320, 177324, 177328, 177332, 177336, 177340, 177344, 177348, 177352, - 177356, 177360, 177364, 177368, 177372, 177376, 177380, 177384, 177388, - 177392, 177396, 177400, 177404, 177408, 177412, 177416, 177420, 177424, - 177428, 177432, 177436, 177440, 177444, 177448, 177452, 177456, 177460, - 177464, 177468, 177472, 177476, 177480, 177484, 177488, 177492, 177496, - 177500, 177504, 177508, 177512, 177516, 177520, 177524, 177528, 177532, - 177536, 177540, 177544, 177548, 177552, 177556, 177560, 177564, 177568, - 177572, 177576, 177580, 177584, 177588, 177592, 177596, 177600, 177604, - 177608, 177612, 177616, 177620, 177624, 177628, 177632, 177636, 177640, - 177644, 177648, 177652, 177656, 177660, 177664, 177668, 177672, 177676, - 177680, 177684, 177688, 177692, 177696, 177700, 177704, 177708, 177712, - 177716, 177720, 177724, 177728, 177732, 177736, 177740, 177744, 177748, - 177752, 177756, 177760, 177764, 177768, 177772, 177776, 177780, 177784, - 177788, 177792, 177796, 177800, 177804, 177808, 177812, 177816, 177820, - 177824, 177828, 177832, 177836, 177840, 177844, 177848, 177852, 177856, - 177860, 177864, 177868, 177872, 177876, 177880, 177884, 177888, 177892, - 177896, 177900, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 175743, 175747, 175751, 175755, 175759, 175763, 175767, 175771, 175775, + 175779, 175783, 175787, 175791, 175795, 175799, 175803, 175807, 175811, + 175815, 175819, 175823, 175827, 175831, 175835, 175839, 175843, 175847, + 175851, 175855, 175859, 175863, 175867, 175871, 175875, 175879, 175883, + 175887, 175891, 175895, 175899, 175903, 175907, 175911, 175915, 175919, + 175923, 175927, 175931, 175935, 175939, 175943, 175947, 175951, 175955, + 175959, 175963, 175967, 175971, 175975, 175979, 175983, 175987, 175991, + 175995, 175999, 176003, 176007, 176011, 176015, 176019, 176023, 176027, + 176031, 176035, 176039, 176043, 176047, 176051, 176055, 176059, 176063, + 176067, 176071, 176075, 176079, 176083, 176087, 176091, 176095, 176099, + 176103, 176107, 176111, 176115, 176119, 176123, 176127, 176131, 176135, + 176139, 176143, 176147, 176151, 176155, 176159, 176163, 176167, 176171, + 176175, 176179, 176183, 176187, 176191, 176195, 176199, 176203, 176207, + 176211, 176215, 176219, 176223, 176227, 176231, 176235, 176239, 176243, + 176247, 176251, 176255, 176259, 176263, 176267, 176271, 176275, 176279, + 176283, 176287, 176291, 176295, 176299, 176303, 176307, 176311, 176315, + 176319, 176323, 176327, 176331, 176335, 176339, 176343, 176347, 176351, + 176355, 176359, 176363, 176367, 176371, 176375, 176379, 176383, 176387, + 176391, 176395, 176399, 176403, 176407, 176411, 176415, 176419, 176423, + 176427, 176431, 176435, 176439, 176443, 176447, 176451, 176455, 176459, + 176463, 176467, 176471, 176475, 176479, 176483, 176487, 176491, 176495, + 176499, 176503, 176507, 176511, 176515, 176519, 176523, 176527, 176531, + 176535, 176539, 176543, 176547, 176551, 176555, 176559, 176563, 176567, + 176571, 176575, 176579, 176583, 176587, 176591, 176595, 176599, 176603, + 176607, 176611, 176615, 176619, 176623, 176627, 176631, 176635, 176639, + 176643, 176647, 176651, 176655, 176659, 176663, 176667, 176671, 176675, + 176679, 176683, 176687, 176691, 176695, 176699, 176703, 176707, 176711, + 176715, 176719, 176723, 176727, 176731, 176735, 176739, 176743, 176747, + 176751, 176755, 176759, 176763, 176767, 176771, 176775, 176779, 176783, + 176787, 176791, 176795, 176799, 176803, 176807, 176811, 176815, 176819, + 176823, 176827, 176831, 176835, 176839, 176843, 176847, 176851, 176855, + 176859, 176863, 176867, 176871, 176875, 176879, 176883, 176887, 176891, + 176895, 176899, 176903, 176907, 176911, 176915, 176919, 176923, 176927, + 176931, 176935, 176939, 176943, 176947, 176951, 176955, 176959, 176963, + 176967, 176971, 176975, 176979, 176983, 176987, 176991, 176995, 176999, + 177003, 177007, 177011, 177015, 177019, 177023, 177027, 177031, 177035, + 177039, 177043, 177047, 177051, 177055, 177059, 177063, 177067, 177071, + 177075, 177079, 177083, 177087, 177091, 177095, 177099, 177103, 177107, + 177111, 177115, 177119, 177123, 177127, 177131, 177135, 177139, 177143, + 177147, 177151, 177155, 177159, 177163, 177167, 177171, 177175, 177179, + 177183, 177187, 177191, 177195, 177199, 177203, 177207, 177211, 177215, + 177219, 177223, 177227, 177231, 177235, 177239, 177243, 177247, 177251, + 177255, 177259, 177263, 177267, 177271, 177275, 177279, 177283, 177287, + 177291, 177295, 177299, 177303, 177307, 177311, 177315, 177319, 177323, + 177327, 177331, 177335, 177339, 177343, 177347, 177351, 177355, 177359, + 177363, 177367, 177371, 177375, 177379, 177383, 177387, 177391, 177395, + 177399, 177403, 177407, 177411, 177415, 177419, 177423, 177427, 177431, + 177435, 177439, 177443, 177447, 177451, 177455, 177459, 177463, 177467, + 177471, 177475, 177479, 177483, 177487, 177491, 177495, 177499, 177503, + 177507, 177511, 177515, 177519, 177523, 177527, 177531, 177535, 177539, + 177543, 177547, 177551, 177555, 177559, 177563, 177567, 177571, 177575, + 177579, 177583, 177587, 177591, 177595, 177599, 177603, 177607, 177611, + 177615, 177619, 177623, 177627, 177631, 177635, 177639, 177643, 177647, + 177651, 177655, 177659, 177663, 177667, 177671, 177675, 177679, 177683, + 177687, 177691, 177695, 177699, 177703, 177707, 177711, 177715, 177719, + 177723, 177727, 177731, 177735, 177739, 177743, 177747, 177751, 177755, + 177759, 177763, 177767, 177771, 177775, 177779, 177783, 177787, 177791, + 177795, 177799, 177803, 177807, 177811, 177815, 177819, 177823, 177827, + 177831, 177835, 177839, 177843, 177847, 177851, 177855, 177859, 177863, + 177867, 177871, 177875, 177879, 177883, 177887, 177891, 177895, 177899, + 177903, 177907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 177904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177908, 177911, 177915, - 177919, 177922, 177926, 177930, 177933, 177936, 177940, 177944, 177947, - 177950, 177953, 177956, 177961, 177964, 177968, 177971, 177974, 177977, - 177980, 177983, 177986, 177989, 177992, 177995, 177998, 178001, 178005, - 178009, 178013, 178017, 178022, 178027, 178033, 178039, 178045, 178050, - 178056, 178062, 178068, 178073, 178079, 178085, 178090, 178096, 178102, - 178107, 178113, 178119, 178124, 178130, 178136, 178141, 178147, 178153, - 178159, 178165, 178171, 178175, 178180, 178184, 178189, 178193, 178198, - 178203, 178209, 178215, 178221, 178226, 178232, 178238, 178244, 178249, - 178255, 178261, 178266, 178272, 178278, 178283, 178289, 178295, 178300, - 178306, 178312, 178317, 178323, 178329, 178335, 178341, 178347, 178352, - 178356, 178361, 178364, 178368, 178371, 178374, 178377, 178380, 178383, - 178386, 178389, 178392, 178395, 178398, 178401, 178404, 178407, 178410, - 178413, 178416, 178419, 178422, 178425, 178428, 178431, 178434, 178437, - 178440, 178443, 178446, 178449, 178452, 178455, 178458, 178461, 178464, - 178467, 178470, 178473, 178476, 178479, 178482, 178485, 178488, 178491, - 178494, 178497, 178500, 178503, 178506, 178509, 178512, 178515, 178518, - 178521, 178524, 178527, 178530, 178533, 178536, 178539, 178542, 178545, - 178548, 178551, 178554, 178557, 178560, 178563, 178566, 178569, 178572, - 178575, 178578, 178581, 178584, 178587, 178590, 178593, 178596, 178599, - 178602, 178605, 178608, 178611, 178614, 178617, 178620, 178623, 178626, - 178629, 178632, 178635, 178638, 178641, 178644, 178647, 178650, 178653, - 178656, 178659, 178662, 178665, 178668, 178671, 178674, 178677, 178680, - 178683, 178686, 178689, 178692, 178695, 178698, 178701, 178704, 178707, - 178710, 178713, 178716, 178719, 178722, 178725, 178728, 178731, 178734, - 178737, 178740, 178743, 178746, 178749, 178752, 178755, 178758, 178761, - 178764, 178767, 178770, 178773, 178776, 178779, 178782, 178785, 178788, - 178791, 178794, 178797, 178800, 178803, 178806, 178809, 178812, 178815, - 178818, 178821, 178824, 178827, 178830, 178833, 178836, 178839, 178842, - 178845, 178848, 178851, 178854, 178857, 178860, 178863, 178866, 178869, - 178872, 178875, 178878, 178881, 178884, 178887, 178890, 178893, 178896, - 178899, 178902, 178905, 178908, 178911, 178914, 178917, 178920, 178923, - 178926, 178929, 178932, 178935, 178938, 178941, 178944, 178947, 178950, - 178953, 178956, 178959, 178962, 178965, 178968, 178971, 178974, 178977, - 178980, 178983, 178986, 178989, 178992, 178995, 178998, 179001, 179004, - 179007, 179010, 179013, 179016, 179019, 179022, 179025, 179028, 179031, - 179034, 179037, 179040, 179043, 179046, 179049, 179052, 179055, 179058, - 179061, 179064, 179067, 179070, 179073, 179076, 179079, 179082, 179085, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179088, 179090, 179092, - 179097, 179099, 179104, 179106, 179111, 179113, 179118, 179120, 179122, - 179124, 179126, 179128, 179130, 179132, 179134, 179136, 179139, 179143, - 179145, 179147, 179151, 179155, 179160, 179162, 179164, 179166, 179170, - 179173, 179175, 179179, 179181, 179185, 179187, 179191, 179194, 179196, - 179200, 179204, 179206, 179212, 179214, 179219, 179221, 179226, 179228, - 179233, 179235, 179240, 179242, 179246, 179248, 179252, 179254, 179261, - 179263, 179265, 179267, 179272, 179274, 179276, 179278, 179280, 179282, - 179287, 179291, 179293, 179298, 179302, 179304, 179309, 179313, 179315, - 179320, 179324, 179326, 179328, 179330, 179332, 179336, 179338, 179343, - 179345, 179351, 179353, 179359, 179361, 179363, 179365, 179369, 179371, - 179378, 179380, 179387, 179389, 179394, 179400, 179402, 179408, 179415, - 179417, 179423, 179428, 179430, 179436, 179442, 179444, 179450, 179456, - 179458, 179464, 179468, 179470, 179475, 179477, 179479, 179484, 179486, - 179488, 179494, 179496, 179501, 179505, 179507, 179512, 179516, 179518, - 179524, 179526, 179530, 179532, 179536, 179538, 179545, 179552, 179554, - 179561, 179568, 179570, 179575, 179577, 179584, 179586, 179591, 179593, - 179599, 179601, 179605, 179607, 179613, 179615, 179619, 179621, 179627, - 179629, 179631, 179633, 179638, 179643, 179645, 179647, 179657, 179662, - 179669, 179676, 179681, 179686, 179698, 179702, 179706, 179710, 179714, - 179716, 179718, 179720, 179722, 179724, 179726, 179728, 179730, 179732, - 179734, 179736, 179738, 179740, 179742, 179744, 179746, 179748, 179750, - 179752, 179754, 179756, 179762, 179769, 179774, 179782, 179790, 179795, - 179797, 179799, 179801, 179803, 179805, 179807, 179809, 179811, 179813, - 179815, 179817, 179819, 179821, 179823, 179825, 179827, 179838, 179843, - 179845, 179847, 179853, 179865, 179871, 179877, 179883, 179889, 179893, - 179904, 179906, 179908, 179910, 179912, 179914, 179916, 179918, 179920, - 179922, 179924, 179926, 179928, 179930, 179932, 179934, 179936, 179938, - 179940, 179942, 179944, 179946, 179948, 179950, 179952, 179954, 179956, - 179958, 179960, 179962, 179964, 179966, 179968, 179970, 179972, 179974, - 179976, 179978, 179980, 179982, 179984, 179986, 179988, 179990, 179992, - 179994, 179996, 179998, 180000, 180002, 180004, 180006, 180008, 180010, - 180012, 180014, 180016, 180018, 180020, 180022, 180024, 180026, 180028, - 180030, 180032, 180034, 180036, 180038, 180040, 180042, 180044, 180046, - 180048, 180050, 180052, 180054, 180056, 180058, 180060, 180062, 180064, - 180066, 180068, 180070, 180072, 180074, 180076, 180078, 180080, 180082, - 180084, 180086, 180088, 180090, 180092, 180094, 180096, 180098, 180100, - 180102, 180104, 180106, 180108, 180110, 180112, 180114, 180116, 180118, - 180120, 180122, 180124, 180126, 180128, 180130, 180132, 180134, 180136, - 180138, 180140, 180142, 180144, 180146, 180148, 180150, 180152, 180154, - 180156, 180158, 180160, 180162, 180164, 180166, 180168, 180170, 180172, - 180174, 180176, 180178, 180180, 180182, 180184, 180186, 180188, 180190, - 180192, 180194, 180196, 180198, 180200, 180202, 180204, 180206, 180208, - 180210, 180212, 180214, 180216, 180218, 180220, 180222, 180224, 180226, - 180228, 180230, 180232, 180234, 180236, 180238, 180240, 180242, 180244, - 180246, 180248, 180250, 180252, 180254, 180256, 180258, 180260, 180262, - 180264, 180266, 180268, 180270, 180272, 180274, 180276, 180278, 180280, - 180282, 180284, 180286, 180288, 180290, 180292, 180294, 180296, 180298, - 180300, 180302, 180304, 180306, 180308, 180310, 180312, 180314, 180316, - 180318, 180320, 180322, 180324, 180326, 180328, 180330, 180332, 180334, - 180336, 180338, 180340, 180342, 180344, 180346, 180348, 180350, 180352, - 180354, 180356, 180358, 180360, 180362, 180364, 180366, 180368, 180370, - 180372, 180374, 180376, 180378, 180380, 180382, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177911, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177915, 177918, 177922, + 177926, 177929, 177933, 177937, 177940, 177943, 177947, 177951, 177954, + 177957, 177960, 177963, 177968, 177971, 177975, 177978, 177981, 177984, + 177987, 177990, 177993, 177996, 177999, 178002, 178005, 178008, 178012, + 178016, 178020, 178024, 178029, 178034, 178040, 178046, 178052, 178057, + 178063, 178069, 178075, 178080, 178086, 178092, 178097, 178103, 178109, + 178114, 178120, 178126, 178131, 178137, 178143, 178148, 178154, 178160, + 178166, 178172, 178178, 178182, 178187, 178191, 178196, 178200, 178205, + 178210, 178216, 178222, 178228, 178233, 178239, 178245, 178251, 178256, + 178262, 178268, 178273, 178279, 178285, 178290, 178296, 178302, 178307, + 178313, 178319, 178324, 178330, 178336, 178342, 178348, 178354, 178359, + 178363, 178368, 178371, 178375, 178378, 178381, 178384, 178387, 178390, + 178393, 178396, 178399, 178402, 178405, 178408, 178411, 178414, 178417, + 178420, 178423, 178426, 178429, 178432, 178435, 178438, 178441, 178444, + 178447, 178450, 178453, 178456, 178459, 178462, 178465, 178468, 178471, + 178474, 178477, 178480, 178483, 178486, 178489, 178492, 178495, 178498, + 178501, 178504, 178507, 178510, 178513, 178516, 178519, 178522, 178525, + 178528, 178531, 178534, 178537, 178540, 178543, 178546, 178549, 178552, + 178555, 178558, 178561, 178564, 178567, 178570, 178573, 178576, 178579, + 178582, 178585, 178588, 178591, 178594, 178597, 178600, 178603, 178606, + 178609, 178612, 178615, 178618, 178621, 178624, 178627, 178630, 178633, + 178636, 178639, 178642, 178645, 178648, 178651, 178654, 178657, 178660, + 178663, 178666, 178669, 178672, 178675, 178678, 178681, 178684, 178687, + 178690, 178693, 178696, 178699, 178702, 178705, 178708, 178711, 178714, + 178717, 178720, 178723, 178726, 178729, 178732, 178735, 178738, 178741, + 178744, 178747, 178750, 178753, 178756, 178759, 178762, 178765, 178768, + 178771, 178774, 178777, 178780, 178783, 178786, 178789, 178792, 178795, + 178798, 178801, 178804, 178807, 178810, 178813, 178816, 178819, 178822, + 178825, 178828, 178831, 178834, 178837, 178840, 178843, 178846, 178849, + 178852, 178855, 178858, 178861, 178864, 178867, 178870, 178873, 178876, + 178879, 178882, 178885, 178888, 178891, 178894, 178897, 178900, 178903, + 178906, 178909, 178912, 178915, 178918, 178921, 178924, 178927, 178930, + 178933, 178936, 178939, 178942, 178945, 178948, 178951, 178954, 178957, + 178960, 178963, 178966, 178969, 178972, 178975, 178978, 178981, 178984, + 178987, 178990, 178993, 178996, 178999, 179002, 179005, 179008, 179011, + 179014, 179017, 179020, 179023, 179026, 179029, 179032, 179035, 179038, + 179041, 179044, 179047, 179050, 179053, 179056, 179059, 179062, 179065, + 179068, 179071, 179074, 179077, 179080, 179083, 179086, 179089, 179092, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179095, 179097, 179099, + 179104, 179106, 179111, 179113, 179118, 179120, 179125, 179127, 179129, + 179131, 179133, 179135, 179137, 179139, 179141, 179143, 179146, 179150, + 179152, 179154, 179158, 179162, 179167, 179169, 179171, 179173, 179177, + 179180, 179182, 179186, 179188, 179192, 179194, 179198, 179201, 179203, + 179207, 179211, 179213, 179219, 179221, 179226, 179228, 179233, 179235, + 179240, 179242, 179247, 179249, 179253, 179255, 179259, 179261, 179268, + 179270, 179272, 179274, 179279, 179281, 179283, 179285, 179287, 179289, + 179294, 179298, 179300, 179305, 179309, 179311, 179316, 179320, 179322, + 179327, 179331, 179333, 179335, 179337, 179339, 179343, 179345, 179350, + 179352, 179358, 179360, 179366, 179368, 179370, 179372, 179376, 179378, + 179385, 179387, 179394, 179396, 179401, 179407, 179409, 179415, 179422, + 179424, 179430, 179435, 179437, 179443, 179449, 179451, 179457, 179463, + 179465, 179471, 179475, 179477, 179482, 179484, 179486, 179491, 179493, + 179495, 179501, 179503, 179508, 179512, 179514, 179519, 179523, 179525, + 179531, 179533, 179537, 179539, 179543, 179545, 179552, 179559, 179561, + 179568, 179575, 179577, 179582, 179584, 179591, 179593, 179598, 179600, + 179606, 179608, 179612, 179614, 179620, 179622, 179626, 179628, 179634, + 179636, 179638, 179640, 179645, 179650, 179652, 179654, 179664, 179669, + 179676, 179683, 179688, 179693, 179705, 179709, 179713, 179717, 179721, + 179723, 179725, 179727, 179729, 179731, 179733, 179735, 179737, 179739, + 179741, 179743, 179745, 179747, 179749, 179751, 179753, 179755, 179757, + 179759, 179761, 179763, 179769, 179776, 179781, 179789, 179797, 179802, + 179804, 179806, 179808, 179810, 179812, 179814, 179816, 179818, 179820, + 179822, 179824, 179826, 179828, 179830, 179832, 179834, 179845, 179850, + 179852, 179854, 179860, 179872, 179878, 179884, 179890, 179896, 179900, + 179911, 179913, 179915, 179917, 179919, 179921, 179923, 179925, 179927, + 179929, 179931, 179933, 179935, 179937, 179939, 179941, 179943, 179945, + 179947, 179949, 179951, 179953, 179955, 179957, 179959, 179961, 179963, + 179965, 179967, 179969, 179971, 179973, 179975, 179977, 179979, 179981, + 179983, 179985, 179987, 179989, 179991, 179993, 179995, 179997, 179999, + 180001, 180003, 180005, 180007, 180009, 180011, 180013, 180015, 180017, + 180019, 180021, 180023, 180025, 180027, 180029, 180031, 180033, 180035, + 180037, 180039, 180041, 180043, 180045, 180047, 180049, 180051, 180053, + 180055, 180057, 180059, 180061, 180063, 180065, 180067, 180069, 180071, + 180073, 180075, 180077, 180079, 180081, 180083, 180085, 180087, 180089, + 180091, 180093, 180095, 180097, 180099, 180101, 180103, 180105, 180107, + 180109, 180111, 180113, 180115, 180117, 180119, 180121, 180123, 180125, + 180127, 180129, 180131, 180133, 180135, 180137, 180139, 180141, 180143, + 180145, 180147, 180149, 180151, 180153, 180155, 180157, 180159, 180161, + 180163, 180165, 180167, 180169, 180171, 180173, 180175, 180177, 180179, + 180181, 180183, 180185, 180187, 180189, 180191, 180193, 180195, 180197, + 180199, 180201, 180203, 180205, 180207, 180209, 180211, 180213, 180215, + 180217, 180219, 180221, 180223, 180225, 180227, 180229, 180231, 180233, + 180235, 180237, 180239, 180241, 180243, 180245, 180247, 180249, 180251, + 180253, 180255, 180257, 180259, 180261, 180263, 180265, 180267, 180269, + 180271, 180273, 180275, 180277, 180279, 180281, 180283, 180285, 180287, + 180289, 180291, 180293, 180295, 180297, 180299, 180301, 180303, 180305, + 180307, 180309, 180311, 180313, 180315, 180317, 180319, 180321, 180323, + 180325, 180327, 180329, 180331, 180333, 180335, 180337, 180339, 180341, + 180343, 180345, 180347, 180349, 180351, 180353, 180355, 180357, 180359, + 180361, 180363, 180365, 180367, 180369, 180371, 180373, 180375, 180377, + 180379, 180381, 180383, 180385, 180387, 180389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180384, 180388, 180392, 180397, - 180401, 180405, 180409, 180413, 180417, 180421, 180425, 180429, 180433, - 180443, 180453, 180463, 180473, 180487, 180501, 180514, 180527, 180538, - 180549, 180560, 180571, 180582, 180593, 180603, 180612, 180621, 180630, - 180643, 180656, 180668, 180680, 180690, 180700, 180710, 180720, 180729, - 180738, 180748, 180758, 180768, 180778, 180789, 180800, 180810, 180820, - 180831, 180842, 180853, 180864, 180874, 180887, 180898, 180912, 180920, - 180931, 180939, 180947, 180955, 180963, 180971, 180979, 180988, 180997, - 181007, 181017, 181026, 181035, 181045, 181055, 181063, 181071, 181078, - 181087, 181095, 181103, 181110, 181120, 181129, 181140, 181151, 181163, - 181174, 181184, 181195, 181205, 181216, 181224, 181229, 181233, 181237, - 181241, 181245, 181249, 181253, 181257, 181261, 181265, 181269, 181273, - 181276, 181279, 181283, 181287, 181291, 181295, 181299, 181303, 181307, - 181311, 181315, 181319, 181323, 181327, 181331, 181335, 181339, 181343, - 181347, 181351, 181355, 181359, 181363, 181367, 181371, 181375, 181379, - 181383, 181387, 181391, 181395, 181399, 181403, 181407, 181411, 181415, - 181419, 181423, 181427, 181431, 181435, 181439, 181443, 181447, 181451, - 181455, 181459, 181463, 181467, 181471, 181475, 181479, 181483, 181487, - 181491, 181495, 181499, 181503, 181507, 181511, 181515, 181519, 181523, - 181527, 181531, 181535, 181539, 181543, 181547, 181551, 181555, 181559, - 181563, 181567, 181571, 181575, 181579, 181583, 181587, 181591, 181595, - 181599, 181603, 181607, 181611, 181615, 181619, 181622, 181626, 181630, - 181634, 181638, 181642, 181646, 181650, 181654, 181658, 181662, 181666, - 181670, 181674, 181678, 181682, 181686, 181690, 181694, 181698, 181702, - 181706, 181710, 181714, 181718, 181722, 181726, 181730, 181734, 181738, - 181742, 181746, 181750, 181754, 181758, 181762, 181766, 181770, 181774, - 181778, 181782, 181786, 181790, 181794, 181798, 181802, 181806, 181810, - 181814, 181818, 181822, 181826, 181830, 181834, 181838, 181842, 181846, - 181850, 181854, 181858, 181862, 181866, 181870, 181874, 181878, 181882, - 181886, 181890, 181894, 181898, 181902, 181906, 181910, 181914, 181918, - 181922, 181926, 181930, 181934, 181938, 181942, 181946, 181950, 181954, - 181958, 181962, 181966, 181970, 181974, 181978, 181982, 181986, 181990, - 181994, 181998, 182002, 182006, 182010, 182014, 182018, 182022, 182026, - 182030, 182034, 182038, 182042, 182046, 182050, 182054, 182058, 182062, - 182066, 182070, 182074, 182078, 182082, 182086, 182090, 182094, 182098, - 182102, 182106, 182110, 182114, 182118, 182122, 182126, 182130, 182134, - 182138, 182142, 182146, 182150, 182154, 182158, 182162, 182166, 182170, - 182174, 182178, 182182, 182186, 182190, 182194, 182198, 182202, 182206, - 182210, 182214, 182218, 182222, 182226, 182230, 182234, 182238, 182242, - 182246, 182250, 182254, 182258, 182262, 182266, 182270, 182274, 182278, - 182282, 182286, 182290, 182294, 182298, 182302, 182306, 182310, 182314, - 182318, 182322, 182326, 182330, 182334, 182338, 182342, 182346, 182350, - 182354, 182358, 182362, 182366, 182370, 182374, 182378, 182382, 182386, - 182391, 182396, 182401, 182405, 182411, 182418, 182425, 182432, 182439, - 182446, 182453, 182460, 182467, 182474, 182481, 182488, 182495, 182502, - 182508, 182514, 182521, 182527, 182534, 182541, 182548, 182555, 182562, - 182569, 182576, 182583, 182590, 182597, 182604, 182611, 182618, 182624, - 182630, 182636, 182643, 182652, 182661, 182670, 182679, 182684, 182689, - 182695, 182701, 182707, 182713, 182719, 182725, 182731, 182737, 182743, - 182749, 182755, 182761, 182766, 182772, 182782, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180391, 180395, 180399, 180404, + 180408, 180412, 180416, 180420, 180424, 180428, 180432, 180436, 180440, + 180450, 180460, 180470, 180480, 180494, 180508, 180521, 180534, 180545, + 180556, 180567, 180578, 180589, 180600, 180610, 180619, 180628, 180637, + 180650, 180663, 180675, 180687, 180697, 180707, 180717, 180727, 180736, + 180745, 180755, 180765, 180775, 180785, 180796, 180807, 180817, 180827, + 180838, 180849, 180860, 180871, 180881, 180894, 180905, 180919, 180927, + 180938, 180946, 180954, 180962, 180970, 180978, 180986, 180995, 181004, + 181014, 181024, 181033, 181042, 181052, 181062, 181070, 181078, 181085, + 181094, 181102, 181110, 181117, 181127, 181136, 181147, 181158, 181170, + 181181, 181191, 181202, 181212, 181223, 181231, 181236, 181240, 181244, + 181248, 181252, 181256, 181260, 181264, 181268, 181272, 181276, 181280, + 181283, 181286, 181290, 181294, 181298, 181302, 181306, 181310, 181314, + 181318, 181322, 181326, 181330, 181334, 181338, 181342, 181346, 181350, + 181354, 181358, 181362, 181366, 181370, 181374, 181378, 181382, 181386, + 181390, 181394, 181398, 181402, 181406, 181410, 181414, 181418, 181422, + 181426, 181430, 181434, 181438, 181442, 181446, 181450, 181454, 181458, + 181462, 181466, 181470, 181474, 181478, 181482, 181486, 181490, 181494, + 181498, 181502, 181506, 181510, 181514, 181518, 181522, 181526, 181530, + 181534, 181538, 181542, 181546, 181550, 181554, 181558, 181562, 181566, + 181570, 181574, 181578, 181582, 181586, 181590, 181594, 181598, 181602, + 181606, 181610, 181614, 181618, 181622, 181626, 181629, 181633, 181637, + 181641, 181645, 181649, 181653, 181657, 181661, 181665, 181669, 181673, + 181677, 181681, 181685, 181689, 181693, 181697, 181701, 181705, 181709, + 181713, 181717, 181721, 181725, 181729, 181733, 181737, 181741, 181745, + 181749, 181753, 181757, 181761, 181765, 181769, 181773, 181777, 181781, + 181785, 181789, 181793, 181797, 181801, 181805, 181809, 181813, 181817, + 181821, 181825, 181829, 181833, 181837, 181841, 181845, 181849, 181853, + 181857, 181861, 181865, 181869, 181873, 181877, 181881, 181885, 181889, + 181893, 181897, 181901, 181905, 181909, 181913, 181917, 181921, 181925, + 181929, 181933, 181937, 181941, 181945, 181949, 181953, 181957, 181961, + 181965, 181969, 181973, 181977, 181981, 181985, 181989, 181993, 181997, + 182001, 182005, 182009, 182013, 182017, 182021, 182025, 182029, 182033, + 182037, 182041, 182045, 182049, 182053, 182057, 182061, 182065, 182069, + 182073, 182077, 182081, 182085, 182089, 182093, 182097, 182101, 182105, + 182109, 182113, 182117, 182121, 182125, 182129, 182133, 182137, 182141, + 182145, 182149, 182153, 182157, 182161, 182165, 182169, 182173, 182177, + 182181, 182185, 182189, 182193, 182197, 182201, 182205, 182209, 182213, + 182217, 182221, 182225, 182229, 182233, 182237, 182241, 182245, 182249, + 182253, 182257, 182261, 182265, 182269, 182273, 182277, 182281, 182285, + 182289, 182293, 182297, 182301, 182305, 182309, 182313, 182317, 182321, + 182325, 182329, 182333, 182337, 182341, 182345, 182349, 182353, 182357, + 182361, 182365, 182369, 182373, 182377, 182381, 182385, 182389, 182393, + 182398, 182403, 182408, 182412, 182418, 182425, 182432, 182439, 182446, + 182453, 182460, 182467, 182474, 182481, 182488, 182495, 182502, 182509, + 182515, 182521, 182528, 182534, 182541, 182548, 182555, 182562, 182569, + 182576, 182583, 182590, 182597, 182604, 182611, 182618, 182625, 182631, + 182637, 182643, 182650, 182659, 182668, 182677, 182686, 182691, 182696, + 182702, 182708, 182714, 182720, 182726, 182732, 182738, 182744, 182750, + 182756, 182762, 182768, 182773, 182779, 182789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -24463,7 +24467,7 @@ static const unsigned int code_hash[] = { 0, 0, 9902, 0, 67988, 64785, 82995, 128822, 42631, 983040, 71890, 0, 74164, 41238, 10049, 11405, 0, 64368, 0, 120925, 0, 397, 12299, 42139, 0, 9590, 0, 0, 43661, 43819, 0, 6651, 3544, 0, 0, 9620, 0, 0, 0, 92229, - 1333, 7104, 0, 6425, 0, 0, 0, 0, 0, 0, 11976, 8554, 0, 0, 110733, 0, + 1333, 7104, 0, 6425, 0, 0, 0, 0, 0, 0, 11976, 8554, 13055, 0, 110733, 0, 110731, 41218, 0, 0, 128673, 1883, 0, 0, 70443, 41225, 70788, 42419, 983688, 129450, 0, 127896, 0, 65809, 11837, 0, 129104, 7141, 0, 0, 0, 0, 0, 42363, 0, 0, 0, 0, 69949, 119157, 64732, 0, 0, 126983, 0, 0, 983678, diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h index 957bd4c62126..693e0b3ef0b4 100644 --- a/Objects/unicodetype_db.h +++ b/Objects/unicodetype_db.h @@ -2925,7 +2925,7 @@ static const unsigned short index2[] = { 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55, 55, 55, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py index 2550b8f940c2..5418eec588c8 100644 --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -41,7 +41,7 @@ # * Doc/library/stdtypes.rst, and # * Doc/library/unicodedata.rst # * Doc/reference/lexical_analysis.rst (two occurrences) -UNIDATA_VERSION = "12.0.0" +UNIDATA_VERSION = "12.1.0" UNICODE_DATA = "UnicodeData%s.txt" COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" EASTASIAN_WIDTH = "EastAsianWidth%s.txt" From webhook-mailer at python.org Thu May 9 01:22:54 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Thu, 09 May 2019 05:22:54 -0000 Subject: [Python-checkins] bpo-36831: Do not apply default namespace to unprefixed attributes in ElementPath. (#13201) Message-ID: https://github.com/python/cpython/commit/88db8bd0648588c67eeab16d0bc72ec5c206e3ad commit: 88db8bd0648588c67eeab16d0bc72ec5c206e3ad branch: master author: Stefan Behnel committer: GitHub date: 2019-05-09T07:22:47+02:00 summary: bpo-36831: Do not apply default namespace to unprefixed attributes in ElementPath. (#13201) Also provide better grouping of the tokenizer tests. files: M Lib/test/test_xml_etree.py M Lib/xml/etree/ElementPath.py diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index ca6862cae44a..61737493a904 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1144,14 +1144,9 @@ def check(p, expected, namespaces=None): # tests from the xml specification check("*", ['*']) - check("{ns}*", ['{ns}*']) - check("{}*", ['{}*']) - check("{*}tag", ['{*}tag']) - check("{*}*", ['{*}*']) check("text()", ['text', '()']) check("@name", ['@', 'name']) check("@*", ['@', '*']) - check("@{ns}attr", ['@', '{ns}attr']) check("para[1]", ['para', '[', '1', ']']) check("para[last()]", ['para', '[', 'last', '()', ']']) check("*/para", ['*', '/', 'para']) @@ -1163,7 +1158,6 @@ def check(p, expected, namespaces=None): check("//olist/item", ['//', 'olist', '/', 'item']) check(".", ['.']) check(".//para", ['.', '//', 'para']) - check(".//{*}tag", ['.', '//', '{*}tag']) check("..", ['..']) check("../@lang", ['..', '/', '@', 'lang']) check("chapter[title]", ['chapter', '[', 'title', ']']) @@ -1171,11 +1165,32 @@ def check(p, expected, namespaces=None): '[', '@', 'secretary', '', 'and', '', '@', 'assistant', ']']) # additional tests + check("@{ns}attr", ['@', '{ns}attr']) check("{http://spam}egg", ['{http://spam}egg']) check("./spam.egg", ['.', '/', 'spam.egg']) check(".//{http://spam}egg", ['.', '//', '{http://spam}egg']) + + # wildcard tags + check("{ns}*", ['{ns}*']) + check("{}*", ['{}*']) + check("{*}tag", ['{*}tag']) + check("{*}*", ['{*}*']) + check(".//{*}tag", ['.', '//', '{*}tag']) + + # namespace prefix resolution check("./xsd:type", ['.', '/', '{http://www.w3.org/2001/XMLSchema}type'], {'xsd': 'http://www.w3.org/2001/XMLSchema'}) + check("type", ['{http://www.w3.org/2001/XMLSchema}type'], + {'': 'http://www.w3.org/2001/XMLSchema'}) + check("@xsd:type", ['@', '{http://www.w3.org/2001/XMLSchema}type'], + {'xsd': 'http://www.w3.org/2001/XMLSchema'}) + check("@type", ['@', 'type'], + {'': 'http://www.w3.org/2001/XMLSchema'}) + check("@{*}type", ['@', '{*}type'], + {'': 'http://www.w3.org/2001/XMLSchema'}) + check("@{ns}attr", ['@', '{ns}attr'], + {'': 'http://www.w3.org/2001/XMLSchema', + 'ns': 'http://www.w3.org/2001/XMLSchema'}) def test_processinginstruction(self): # Test ProcessingInstruction directly diff --git a/Lib/xml/etree/ElementPath.py b/Lib/xml/etree/ElementPath.py index cfe72f2f9d42..d318e65d84a4 100644 --- a/Lib/xml/etree/ElementPath.py +++ b/Lib/xml/etree/ElementPath.py @@ -72,23 +72,27 @@ def xpath_tokenizer(pattern, namespaces=None): default_namespace = namespaces.get('') if namespaces else None + parsing_attribute = False for token in xpath_tokenizer_re.findall(pattern): - tag = token[1] + ttype, tag = token if tag and tag[0] != "{": if ":" in tag: prefix, uri = tag.split(":", 1) try: if not namespaces: raise KeyError - yield token[0], "{%s}%s" % (namespaces[prefix], uri) + yield ttype, "{%s}%s" % (namespaces[prefix], uri) except KeyError: raise SyntaxError("prefix %r not found in prefix map" % prefix) from None - elif default_namespace: - yield token[0], "{%s}%s" % (default_namespace, tag) + elif default_namespace and not parsing_attribute: + yield ttype, "{%s}%s" % (default_namespace, tag) else: yield token + parsing_attribute = False else: yield token + parsing_attribute = ttype == '@' + def get_parent_map(context): parent_map = context.parent_map @@ -100,7 +104,6 @@ def get_parent_map(context): return parent_map - def _is_wildcard_tag(tag): return tag[:3] == '{*}' or tag[-2:] == '}*' From webhook-mailer at python.org Thu May 9 10:22:34 2019 From: webhook-mailer at python.org (Julien Palard) Date: Thu, 09 May 2019 14:22:34 -0000 Subject: [Python-checkins] bpo-36239: Skip comments in gettext infos (GH-12255) Message-ID: https://github.com/python/cpython/commit/afd1e6d2f0f5aaf4030d13342809ec0915dedf81 commit: afd1e6d2f0f5aaf4030d13342809ec0915dedf81 branch: master author: Julien Palard committer: GitHub date: 2019-05-09T16:22:15+02:00 summary: bpo-36239: Skip comments in gettext infos (GH-12255) files: A Misc/NEWS.d/next/Library/2019-03-09-23-51-27.bpo-36239.BHJ3Ln.rst M Lib/gettext.py M Lib/test/test_gettext.py diff --git a/Lib/gettext.py b/Lib/gettext.py index 72a313a08562..b98f501884b7 100644 --- a/Lib/gettext.py +++ b/Lib/gettext.py @@ -417,6 +417,9 @@ def _parse(self, fp): item = b_item.decode().strip() if not item: continue + # Skip over comment lines: + if item.startswith('#-#-#-#-#') and item.endswith('#-#-#-#-#'): + continue k = v = None if ':' in item: k, v = item.split(':', 1) diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py index 8c0250eea1e7..9d1a96b8b0d1 100644 --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -684,6 +684,19 @@ def test_plural_form_error_issue17898(self): # If this runs cleanly, the bug is fixed. t = gettext.GNUTranslations(fp) + def test_ignore_comments_in_headers_issue36239(self): + """Checks that comments like: + + #-#-#-#-# messages.po (EdX Studio) #-#-#-#-# + + are ignored. + """ + with open(MOFILE, 'wb') as fp: + fp.write(base64.decodebytes(GNU_MO_DATA_ISSUE_17898)) + with open(MOFILE, 'rb') as fp: + t = gettext.GNUTranslations(fp) + self.assertEqual(t.info()["plural-forms"], "nplurals=2; plural=(n != 1);") + class UnicodeTranslationsTest(GettextBaseTest): def setUp(self): diff --git a/Misc/NEWS.d/next/Library/2019-03-09-23-51-27.bpo-36239.BHJ3Ln.rst b/Misc/NEWS.d/next/Library/2019-03-09-23-51-27.bpo-36239.BHJ3Ln.rst new file mode 100644 index 000000000000..3a7420291513 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-09-23-51-27.bpo-36239.BHJ3Ln.rst @@ -0,0 +1 @@ +Parsing .mo files now ignores comments starting and ending with #-#-#-#-#. From webhook-mailer at python.org Thu May 9 11:34:42 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Thu, 09 May 2019 15:34:42 -0000 Subject: [Python-checkins] Add support for .parent and .joinpath in zipfile.Path (#13213) Message-ID: https://github.com/python/cpython/commit/33e067d6a237ced8fd2ead70a461025fd91239be commit: 33e067d6a237ced8fd2ead70a461025fd91239be branch: master author: Jason R. Coombs committer: Barry Warsaw date: 2019-05-09T11:34:35-04:00 summary: Add support for .parent and .joinpath in zipfile.Path (#13213) files: M Lib/test/test_zipfile.py M Lib/zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 538d4ee55dfb..bf5bb4d0f13e 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -2481,6 +2481,14 @@ def test_read(self): assert a.read_text() == "content of a" assert a.read_bytes() == b"content of a" + def test_joinpath(self): + for zipfile_abcde in self.zipfile_abcde(): + root = zipfile.Path(zipfile_abcde) + a = root.joinpath("a") + assert a.is_file() + e = root.joinpath("b").joinpath("d").joinpath("e.txt") + assert e.read_text() == "content of e" + def test_traverse_truediv(self): for zipfile_abcde in self.zipfile_abcde(): root = zipfile.Path(zipfile_abcde) @@ -2502,5 +2510,11 @@ def test_traverse_pathlike(self): root = zipfile.Path(zipfile_abcde) root / pathlib.Path("a") + def test_parent(self): + for zipfile_abcde in self.zipfile_abcde(): + root = zipfile.Path(zipfile_abcde) + assert (root / 'a').parent.at == '' + assert (root / 'a' / 'b').parent.at == 'a/' + if __name__ == "__main__": unittest.main() diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 62475c701f50..8f8cb863b003 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -2218,12 +2218,14 @@ def __str__(self): def __repr__(self): return self.__repr.format(self=self) - def __truediv__(self, add): + def joinpath(self, add): next = posixpath.join(self.at, add) next_dir = posixpath.join(self.at, add, "") names = self._names() return self._next(next_dir if next not in names and next_dir in names else next) + __truediv__ = joinpath + @staticmethod def _add_implied_dirs(names): return names + [ @@ -2232,6 +2234,13 @@ def _add_implied_dirs(names): if name and name + "/" not in names ] + @property + def parent(self): + parent_at = posixpath.dirname(self.at) + if parent_at: + parent_at += '/' + return self._next(parent_at) + def _names(self): return self._add_implied_dirs(self.root.namelist()) From webhook-mailer at python.org Thu May 9 11:52:07 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 09 May 2019 15:52:07 -0000 Subject: [Python-checkins] bpo-36851: Clean the frame stack if the execution ends with a return and the stack is not empty (GH-13191) Message-ID: https://github.com/python/cpython/commit/f00828a742d2e88c910bdfd00f08fcd998554ba5 commit: f00828a742d2e88c910bdfd00f08fcd998554ba5 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-09T16:52:02+01:00 summary: bpo-36851: Clean the frame stack if the execution ends with a return and the stack is not empty (GH-13191) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-08-11-42-06.bpo-36851.J7DiCW.rst M Lib/test/test_code.py M Python/ceval.c diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index e49121ef1698..9bf290d8d5a1 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -130,6 +130,7 @@ import threading import unittest import weakref +import opcode try: import ctypes except ImportError: @@ -379,6 +380,43 @@ def run(self): tt.join() self.assertEqual(LAST_FREED, 500) + @cpython_only + def test_clean_stack_on_return(self): + + def f(x): + return x + + code = f.__code__ + ct = type(f.__code__) + + # Insert an extra LOAD_FAST, this duplicates the value of + # 'x' in the stack, leaking it if the frame is not properly + # cleaned up upon exit. + + bytecode = list(code.co_code) + bytecode.insert(-2, opcode.opmap['LOAD_FAST']) + bytecode.insert(-2, 0) + + c = ct(code.co_argcount, code.co_posonlyargcount, + code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize+1, + code.co_flags, bytes(bytecode), + code.co_consts, code.co_names, code.co_varnames, + code.co_filename, code.co_name, code.co_firstlineno, + code.co_lnotab, code.co_freevars, code.co_cellvars) + new_function = type(f)(c, f.__globals__, 'nf', f.__defaults__, f.__closure__) + + class Var: + pass + the_object = Var() + var = weakref.ref(the_object) + + new_function(the_object) + + # Check if the_object is leaked + del the_object + assert var() is None + + def test_main(verbose=None): from test import test_code run_doctest(test_code, verbose) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-11-42-06.bpo-36851.J7DiCW.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-11-42-06.bpo-36851.J7DiCW.rst new file mode 100644 index 000000000000..9973e4ee7161 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-11-42-06.bpo-36851.J7DiCW.rst @@ -0,0 +1,2 @@ +The ``FrameType`` stack is now correctly cleaned up if the execution ends +with a return and the stack is not empty. diff --git a/Python/ceval.c b/Python/ceval.c index 4e43df2713d8..07db1d378b6c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1755,7 +1755,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) case TARGET(RETURN_VALUE): { retval = POP(); assert(f->f_iblock == 0); - goto return_or_yield; + goto exit_returning; } case TARGET(GET_AITER): { @@ -1924,7 +1924,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* and repeat... */ assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT)); f->f_lasti -= sizeof(_Py_CODEUNIT); - goto return_or_yield; + goto exit_yielding; } case TARGET(YIELD_VALUE): { @@ -1941,7 +1941,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } f->f_stacktop = stack_pointer; - goto return_or_yield; + goto exit_yielding; } case TARGET(POP_EXCEPT): { @@ -3581,16 +3581,18 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) break; } /* main loop */ + assert(retval == NULL); + assert(PyErr_Occurred()); + +exit_returning: + /* Pop remaining stack entries. */ while (!EMPTY()) { PyObject *o = POP(); Py_XDECREF(o); } - assert(retval == NULL); - assert(PyErr_Occurred()); - -return_or_yield: +exit_yielding: if (tstate->use_tracing) { if (tstate->c_tracefunc) { if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj, From webhook-mailer at python.org Thu May 9 14:06:12 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Thu, 09 May 2019 18:06:12 -0000 Subject: [Python-checkins] bpo-30262: Don't expose private objects in sqlite3 (GH-1440) Message-ID: https://github.com/python/cpython/commit/e6576248e5174ca5daa362cfd610c07e7eb3a2ae commit: e6576248e5174ca5daa362cfd610c07e7eb3a2ae branch: master author: Aviv Palivoda committer: Berker Peksag date: 2019-05-09T21:05:45+03:00 summary: bpo-30262: Don't expose private objects in sqlite3 (GH-1440) The Cache and Statement objects are undocumented and implementation details of the sqlite3 module. They aren't usable from pure Python code. files: A Misc/NEWS.d/next/Library/2019-05-09-12-38-40.bpo-30262.Tu74ak.rst M Doc/whatsnew/3.8.rst M Modules/_sqlite/module.c diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index d21a4c7944af..49a6cb0788a1 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -796,6 +796,10 @@ The following features and APIs have been removed from Python 3.8: * "unicode_internal" codec is removed. (Contributed by Inada Naoki in :issue:`36297`.) +* The ``Cache`` and ``Statement`` objects of the :mod:`sqlite3` module are not + exposed to the user. + (Contributed by Aviv Palivoda in :issue:`30262`.) + Porting to Python 3.8 ===================== diff --git a/Misc/NEWS.d/next/Library/2019-05-09-12-38-40.bpo-30262.Tu74ak.rst b/Misc/NEWS.d/next/Library/2019-05-09-12-38-40.bpo-30262.Tu74ak.rst new file mode 100644 index 000000000000..059bd717837f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-09-12-38-40.bpo-30262.Tu74ak.rst @@ -0,0 +1,2 @@ +The ``Cache`` and ``Statement`` objects of the :mod:`sqlite3` module are not +exposed to the user. Patch by Aviv Palivoda. diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 274ee13c375e..c487ba98908b 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -366,10 +366,6 @@ PyMODINIT_FUNC PyInit__sqlite3(void) PyModule_AddObject(module, "Connection", (PyObject*) &pysqlite_ConnectionType); Py_INCREF(&pysqlite_CursorType); PyModule_AddObject(module, "Cursor", (PyObject*) &pysqlite_CursorType); - Py_INCREF(&pysqlite_CacheType); - PyModule_AddObject(module, "Statement", (PyObject*)&pysqlite_StatementType); - Py_INCREF(&pysqlite_StatementType); - PyModule_AddObject(module, "Cache", (PyObject*) &pysqlite_CacheType); Py_INCREF(&pysqlite_PrepareProtocolType); PyModule_AddObject(module, "PrepareProtocol", (PyObject*) &pysqlite_PrepareProtocolType); Py_INCREF(&pysqlite_RowType); From webhook-mailer at python.org Thu May 9 14:33:35 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Thu, 09 May 2019 18:33:35 -0000 Subject: [Python-checkins] Fix a possible crash due to PyType_FromSpecWithBases() (GH-10304) Message-ID: https://github.com/python/cpython/commit/0613c1e481440aa8f54ba7f6056924c175fbcc13 commit: 0613c1e481440aa8f54ba7f6056924c175fbcc13 branch: master author: Zackery Spytz committer: Petr Viktorin date: 2019-05-09T14:33:31-04:00 summary: Fix a possible crash due to PyType_FromSpecWithBases() (GH-10304) If the PyObject_MALLOC() call failed in PyType_FromSpecWithBases(), PyObject_Free() would be called on a static string in type_dealloc(). files: M Objects/typeobject.c diff --git a/Objects/typeobject.c b/Objects/typeobject.c index eeaae1f9f789..b28f494962ec 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2995,6 +2995,7 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) size_t len = strlen(old_doc)+1; char *tp_doc = PyObject_MALLOC(len); if (tp_doc == NULL) { + type->tp_doc = NULL; PyErr_NoMemory(); goto fail; } From webhook-mailer at python.org Thu May 9 15:13:47 2019 From: webhook-mailer at python.org (Kushal Das) Date: Thu, 09 May 2019 19:13:47 -0000 Subject: [Python-checkins] doc: fix broken link on howto/unicode page (#13160) Message-ID: https://github.com/python/cpython/commit/3b2f9ab31db81405650325920465378532ab2d78 commit: 3b2f9ab31db81405650325920465378532ab2d78 branch: master author: redshiftzero committer: Kushal Das date: 2019-05-10T00:43:39+05:30 summary: doc: fix broken link on howto/unicode page (#13160) Thank you @redshiftzero on the first PR :clap: files: M Doc/howto/unicode.rst diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index 5339bf45bf0e..7b2d7b8abf87 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -157,7 +157,7 @@ difficult reading. `A chronology `_ of the origin and development of Unicode is also available on the site. On the Computerphile Youtube channel, Tom Scott briefly -`discusses the history of Unicode and UTF-8 ` +`discusses the history of Unicode and UTF-8 `_ (9 minutes 36 seconds). To help understand the standard, Jukka Korpela has written `an introductory From webhook-mailer at python.org Thu May 9 15:15:04 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Thu, 09 May 2019 19:15:04 -0000 Subject: [Python-checkins] bpo-36802: Drop awrite()/aclose(), support await write() and await close() instead (#13099) Message-ID: https://github.com/python/cpython/commit/a076e4f5e42b85664693191d04cfb33e2f9acfa5 commit: a076e4f5e42b85664693191d04cfb33e2f9acfa5 branch: master author: Andrew Svetlov committer: GitHub date: 2019-05-09T15:14:58-04:00 summary: bpo-36802: Drop awrite()/aclose(), support await write() and await close() instead (#13099) files: A Misc/NEWS.d/next/Library/2019-05-05-10-12-23.bpo-36802.HYMc8P.rst M Doc/library/asyncio-stream.rst M Lib/asyncio/streams.py M Lib/test/test_asyncio/test_streams.py diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index e686a6a1c4cd..e735b81f234d 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -22,13 +22,13 @@ streams:: '127.0.0.1', 8888) print(f'Send: {message!r}') - await writer.awrite(message.encode()) + await writer.write(message.encode()) data = await reader.read(100) print(f'Received: {data.decode()!r}') print('Close the connection') - await writer.aclose() + await writer.close() asyncio.run(tcp_echo_client('Hello World!')) @@ -226,23 +226,70 @@ StreamWriter directly; use :func:`open_connection` and :func:`start_server` instead. - .. coroutinemethod:: awrite(data) + .. method:: write(data) + + The method attempts to write the *data* to the underlying socket immediately. + If that fails, the data is queued in an internal write buffer until it can be + sent. + + Starting with Python 3.8, it is possible to directly await on the `write()` + method:: + + await stream.write(data) + + The ``await`` pauses the current coroutine until the data is written to the + socket. + + Below is an equivalent code that works with Python <= 3.7:: + + stream.write(data) + await stream.drain() + + .. versionchanged:: 3.8 + Support ``await stream.write(...)`` syntax. + + .. method:: writelines(data) + + The method writes a list (or any iterable) of bytes to the underlying socket + immediately. + If that fails, the data is queued in an internal write buffer until it can be + sent. + + Starting with Python 3.8, it is possible to directly await on the `write()` + method:: + + await stream.writelines(lines) + + The ``await`` pauses the current coroutine until the data is written to the + socket. + + Below is an equivalent code that works with Python <= 3.7:: - Write *data* to the stream. + stream.writelines(lines) + await stream.drain() - The method respects flow control, execution is paused if the write - buffer reaches the high watermark. + .. versionchanged:: 3.8 + Support ``await stream.writelines()`` syntax. - .. versionadded:: 3.8 + .. method:: close() + + The method closes the stream and the underlying socket. + + Starting with Python 3.8, it is possible to directly await on the `close()` + method:: + + await stream.close() - .. coroutinemethod:: aclose() + The ``await`` pauses the current coroutine until the stream and the underlying + socket are closed (and SSL shutdown is performed for a secure connection). - Close the stream. + Below is an equivalent code that works with Python <= 3.7:: - Wait until all closing actions are complete, e.g. SSL shutdown for - secure sockets. + stream.close() + await stream.wait_closed() - .. versionadded:: 3.8 + .. versionchanged:: 3.8 + Support ``await stream.close()`` syntax. .. method:: can_write_eof() @@ -263,21 +310,6 @@ StreamWriter Access optional transport information; see :meth:`BaseTransport.get_extra_info` for details. - .. method:: write(data) - - Write *data* to the stream. - - This method is not subject to flow control. Calls to ``write()`` should - be followed by :meth:`drain`. The :meth:`awrite` method is a - recommended alternative the applies flow control automatically. - - .. method:: writelines(data) - - Write a list (or any iterable) of bytes to the stream. - - This method is not subject to flow control. Calls to ``writelines()`` - should be followed by :meth:`drain`. - .. coroutinemethod:: drain() Wait until it is appropriate to resume writing to the stream. @@ -293,10 +325,6 @@ StreamWriter be resumed. When there is nothing to wait for, the :meth:`drain` returns immediately. - .. method:: close() - - Close the stream. - .. method:: is_closing() Return ``True`` if the stream is closed or in the process of diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 79adf028212f..d9a9f5e72d3b 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -352,6 +352,8 @@ def __init__(self, transport, protocol, reader, loop, assert reader is None or isinstance(reader, StreamReader) self._reader = reader self._loop = loop + self._complete_fut = self._loop.create_future() + self._complete_fut.set_result(None) def __repr__(self): info = [self.__class__.__name__, f'transport={self._transport!r}'] @@ -365,9 +367,33 @@ def transport(self): def write(self, data): self._transport.write(data) + return self._fast_drain() def writelines(self, data): self._transport.writelines(data) + return self._fast_drain() + + def _fast_drain(self): + # The helper tries to use fast-path to return already existing complete future + # object if underlying transport is not paused and actual waiting for writing + # resume is not needed + if self._reader is not None: + # this branch will be simplified after merging reader with writer + exc = self._reader.exception() + if exc is not None: + fut = self._loop.create_future() + fut.set_exception(exc) + return fut + if not self._transport.is_closing(): + if self._protocol._connection_lost: + fut = self._loop.create_future() + fut.set_exception(ConnectionResetError('Connection lost')) + return fut + if not self._protocol._paused: + # fast path, the stream is not paused + # no need to wait for resume signal + return self._complete_fut + return self._loop.create_task(self.drain()) def write_eof(self): return self._transport.write_eof() @@ -377,6 +403,7 @@ def can_write_eof(self): def close(self): self._transport.close() + return self._protocol._get_close_waiter(self) def is_closing(self): return self._transport.is_closing() @@ -408,14 +435,6 @@ def get_extra_info(self, name, default=None): raise ConnectionResetError('Connection lost') await self._protocol._drain_helper() - async def aclose(self): - self.close() - await self.wait_closed() - - async def awrite(self, data): - self.write(data) - await self.drain() - class StreamReader: diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 905141ca89c7..bf93f30e1aaf 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -1035,24 +1035,42 @@ def test_del_stream_before_connection_made(self): messages[0]['message']) def test_async_writer_api(self): + async def inner(httpd): + rd, wr = await asyncio.open_connection(*httpd.address) + + await wr.write(b'GET / HTTP/1.0\r\n\r\n') + data = await rd.readline() + self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') + data = await rd.read() + self.assertTrue(data.endswith(b'\r\n\r\nTest message')) + await wr.close() + messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: - rd, wr = self.loop.run_until_complete( - asyncio.open_connection(*httpd.address, - loop=self.loop)) + self.loop.run_until_complete(inner(httpd)) - f = wr.awrite(b'GET / HTTP/1.0\r\n\r\n') - self.loop.run_until_complete(f) - f = rd.readline() - data = self.loop.run_until_complete(f) + self.assertEqual(messages, []) + + def test_async_writer_api(self): + async def inner(httpd): + rd, wr = await asyncio.open_connection(*httpd.address) + + await wr.write(b'GET / HTTP/1.0\r\n\r\n') + data = await rd.readline() self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') - f = rd.read() - data = self.loop.run_until_complete(f) + data = await rd.read() self.assertTrue(data.endswith(b'\r\n\r\nTest message')) - f = wr.aclose() - self.loop.run_until_complete(f) + wr.close() + with self.assertRaises(ConnectionResetError): + await wr.write(b'data') + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + + with test_utils.run_test_server() as httpd: + self.loop.run_until_complete(inner(httpd)) self.assertEqual(messages, []) @@ -1066,7 +1084,7 @@ def test_eof_feed_when_closing_writer(self): asyncio.open_connection(*httpd.address, loop=self.loop)) - f = wr.aclose() + f = wr.close() self.loop.run_until_complete(f) assert rd.at_eof() f = rd.read() diff --git a/Misc/NEWS.d/next/Library/2019-05-05-10-12-23.bpo-36802.HYMc8P.rst b/Misc/NEWS.d/next/Library/2019-05-05-10-12-23.bpo-36802.HYMc8P.rst new file mode 100644 index 000000000000..f59863b7b7a8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-05-10-12-23.bpo-36802.HYMc8P.rst @@ -0,0 +1,2 @@ +Provide both sync and async calls for StreamWriter.write() and +StreamWriter.close() From webhook-mailer at python.org Thu May 9 15:52:38 2019 From: webhook-mailer at python.org (Julien Palard) Date: Thu, 09 May 2019 19:52:38 -0000 Subject: [Python-checkins] bpo-32523: Simplifying news entries with multiple paragraphs. (GH-8154) Message-ID: https://github.com/python/cpython/commit/137be34180a20dba53948d126b961069f299f153 commit: 137be34180a20dba53948d126b961069f299f153 branch: master author: Julien Palard committer: GitHub date: 2019-05-09T21:52:32+02:00 summary: bpo-32523: Simplifying news entries with multiple paragraphs. (GH-8154) Having multiple paragraphs in a few news entry lead to inconsistent spacing while rendered in HTML by mixing "visually compact lists" (when no entry of the whole list contains multiple paragraphs) and "sparse lists" (when at least one do). files: M Misc/NEWS.d/3.5.0a2.rst M Misc/NEWS.d/3.5.2rc1.rst M Misc/NEWS.d/3.5.3rc1.rst M Misc/NEWS.d/3.5.4rc1.rst M Misc/NEWS.d/3.5.5rc1.rst M Misc/NEWS.d/3.6.0a1.rst M Misc/NEWS.d/3.6.0b2.rst M Misc/NEWS.d/3.6.2rc1.rst M Misc/NEWS.d/3.6.3rc1.rst M Misc/NEWS.d/3.6.4rc1.rst M Misc/NEWS.d/3.6.5rc1.rst M Misc/NEWS.d/3.7.0a1.rst M Misc/NEWS.d/3.7.0a2.rst M Misc/NEWS.d/3.7.0a3.rst M Misc/NEWS.d/3.7.0a4.rst M Misc/NEWS.d/3.7.0b1.rst M Misc/NEWS.d/3.7.0b2.rst M Misc/NEWS.d/3.7.0b4.rst diff --git a/Misc/NEWS.d/3.5.0a2.rst b/Misc/NEWS.d/3.5.0a2.rst index 861b23ede395..ebce66742ca6 100644 --- a/Misc/NEWS.d/3.5.0a2.rst +++ b/Misc/NEWS.d/3.5.0a2.rst @@ -112,7 +112,6 @@ Lawrence. .. section: Library Corrected pure python implementation of timedelta division. - Eliminated OverflowError from ``timedelta * float`` for some floats; Corrected rounding in timedelta true division. diff --git a/Misc/NEWS.d/3.5.2rc1.rst b/Misc/NEWS.d/3.5.2rc1.rst index b37ec096241e..3036625d7358 100644 --- a/Misc/NEWS.d/3.5.2rc1.rst +++ b/Misc/NEWS.d/3.5.2rc1.rst @@ -678,7 +678,6 @@ Fixed the comparison of plistlib.Data with other types. .. section: Library Fix an uninitialized variable in `ctypes.util`. - The bug only occurs on SunOS when the ctypes implementation searches for the `crle` program. Patch by Xiang Zhang. Tested on SunOS by Kees Bos. diff --git a/Misc/NEWS.d/3.5.3rc1.rst b/Misc/NEWS.d/3.5.3rc1.rst index 21ee2b524fc6..037cfe416510 100644 --- a/Misc/NEWS.d/3.5.3rc1.rst +++ b/Misc/NEWS.d/3.5.3rc1.rst @@ -751,7 +751,6 @@ command. .. section: Library Fixed calendar functions for extreme months: 0001-01 and 9999-12. - Methods itermonthdays() and itermonthdays2() are reimplemented so that they don't call itermonthdates() which can cause datetime.date under/overflow. diff --git a/Misc/NEWS.d/3.5.4rc1.rst b/Misc/NEWS.d/3.5.4rc1.rst index 5af08cbe4ce0..f261ddb3a2d3 100644 --- a/Misc/NEWS.d/3.5.4rc1.rst +++ b/Misc/NEWS.d/3.5.4rc1.rst @@ -250,7 +250,6 @@ by Nir Soffer. .. section: Library signal.setitimer() may disable the timer when passed a tiny value. - Tiny values (such as 1e-6) are valid non-zero values for setitimer(), which is specified as taking microsecond-resolution intervals. However, on some platform, our conversion routine could convert 1e-6 into a zero interval, @@ -1001,15 +1000,12 @@ test_zipfile64. .. section: Tests regrtest: Enhance regrtest and backport features from the master branch. - Add options: --coverage, --testdir, --list-tests (list test files, don't run them), --list-cases (list test identifiers, don't run them, :issue:`30523`), --matchfile (load a list of test filters from a text file, :issue:`30540`), --slowest (alias to --slow). - Enhance output: add timestamp, test result, currently running tests, "Tests result: xxx" summary with total duration, etc. - Fix reference leak hunting in regrtest, --huntrleaks: regrtest now warms up caches, create explicitly all internal singletons which are created on demand to prevent false positives when checking for reference leaks. diff --git a/Misc/NEWS.d/3.5.5rc1.rst b/Misc/NEWS.d/3.5.5rc1.rst index 879f6c4d912e..9ccbf7b8060c 100644 --- a/Misc/NEWS.d/3.5.5rc1.rst +++ b/Misc/NEWS.d/3.5.5rc1.rst @@ -10,7 +10,6 @@ by revealing an inconsistency in how sys.path is initialized when executing considered a potential security issue, as it may lead to privileged processes unexpectedly loading code from user controlled directories in situations where that was not previously the case. - The interpreter now consistently avoids ever adding the import location's parent directory to ``sys.path``, and ensures no other ``sys.path`` entries are inadvertently modified when inserting the import location named on the @@ -56,11 +55,10 @@ Fix potential crash during GC caused by ``tp_dealloc`` which doesn't call .. section: Library Fixed issues with binary plists: - -* Fixed saving bytearrays. -* Identical objects will be saved only once. -* Equal references will be load as identical objects. -* Added support for saving and loading recursive data structures. +Fixed saving bytearrays. +Identical objects will be saved only once. +Equal references will be load as identical objects. +Added support for saving and loading recursive data structures. .. diff --git a/Misc/NEWS.d/3.6.0a1.rst b/Misc/NEWS.d/3.6.0a1.rst index 2e259c59c168..dc08e42fb7e1 100644 --- a/Misc/NEWS.d/3.6.0a1.rst +++ b/Misc/NEWS.d/3.6.0a1.rst @@ -1081,7 +1081,6 @@ Fixed the comparison of plistlib.Data with other types. .. section: Library Fix an uninitialized variable in `ctypes.util`. - The bug only occurs on SunOS when the ctypes implementation searches for the `crle` program. Patch by Xiang Zhang. Tested on SunOS by Kees Bos. diff --git a/Misc/NEWS.d/3.6.0b2.rst b/Misc/NEWS.d/3.6.0b2.rst index ebf4a96e6355..627465e887bc 100644 --- a/Misc/NEWS.d/3.6.0b2.rst +++ b/Misc/NEWS.d/3.6.0b2.rst @@ -378,7 +378,6 @@ xml.etree.ElementTree.Element. .. section: Library Stop using localtime() and gmtime() in the time module. - Introduced platform independent _PyTime_localtime API that is similar to POSIX localtime_r, but available on all platforms. Patch by Ed Schouten. @@ -390,7 +389,6 @@ POSIX localtime_r, but available on all platforms. Patch by Ed Schouten. .. section: Library Fixed calendar functions for extreme months: 0001-01 and 9999-12. - Methods itermonthdays() and itermonthdays2() are reimplemented so that they don't call itermonthdates() which can cause datetime.date under/overflow. diff --git a/Misc/NEWS.d/3.6.2rc1.rst b/Misc/NEWS.d/3.6.2rc1.rst index 0a21ae7622e0..20cabb05fa3b 100644 --- a/Misc/NEWS.d/3.6.2rc1.rst +++ b/Misc/NEWS.d/3.6.2rc1.rst @@ -872,7 +872,6 @@ the link targets for :func:`bytes` and :func:`bytearray` are now their respective type definitions, rather than the corresponding builtin function entries. Use :ref:`bytes ` and :ref:`bytearray ` to reference the latter. - In order to ensure this and future cross-reference updates are applied automatically, the daily documentation builds now disable the default output caching features in Sphinx. diff --git a/Misc/NEWS.d/3.6.3rc1.rst b/Misc/NEWS.d/3.6.3rc1.rst index 9c9eac635261..759436028b66 100644 --- a/Misc/NEWS.d/3.6.3rc1.rst +++ b/Misc/NEWS.d/3.6.3rc1.rst @@ -196,7 +196,6 @@ ImportError rather than SystemError. .. section: Core and Builtins Improve signal delivery. - Avoid using Py_AddPendingCall from signal handler, to avoid calling signal-unsafe functions. The tests I'm adding here fail without the rest of the patch, on Linux and OS X. This means our signal delivery logic had @@ -596,7 +595,6 @@ Fix out of bounds write in `asyncio.CFuture.remove_done_callback()`. .. section: Library signal.setitimer() may disable the timer when passed a tiny value. - Tiny values (such as 1e-6) are valid non-zero values for setitimer(), which is specified as taking microsecond-resolution intervals. However, on some platform, our conversion routine could convert 1e-6 into a zero interval, @@ -774,7 +772,6 @@ Add a missing xmlns to python.manifest so that it matches the schema. .. section: IDLE IDLE code context -- fix code update and font update timers. - Canceling timers prevents a warning message when test_idle completes. .. @@ -817,7 +814,6 @@ IDLE - make tests pass with zzdummy extension disabled by default. Document how IDLE runs tkinter programs. IDLE calls tcl/tk update in the background in order to make live - interaction and experimentation with tkinter applications much easier. .. @@ -847,7 +843,6 @@ Rearrange IDLE configdialog GenPage into Window, Editor, and Help sections. .. section: IDLE IDLE - Add docstrings and tests for outwin subclass of editor. - Move some data and functions from the class to module level. Patch by Cheryl Sabella. @@ -868,24 +863,20 @@ IDLE - Do not modify tkinter.message in test_configdialog. .. section: IDLE Convert IDLE's built-in 'extensions' to regular features. - About 10 IDLE features were implemented as supposedly optional extensions. Their different behavior could be confusing or worse for users and not good for maintenance. Hence the conversion. - The main difference for users is that user configurable key bindings for builtin features are now handled uniformly. Now, editing a binding in a keyset only affects its value in the keyset. All bindings are defined together in the system-specific default keysets in config-extensions.def. All custom keysets are saved as a whole in config-extension.cfg. All take effect as soon as one clicks Apply or Ok. - The affected events are '<>', '<>', '<>', '<>', '<>', '<>', '<>', and '<>'. Any (global) customizations made before 3.6.3 will not affect their keyset-specific customization after 3.6.3. and vice versa. - Inital patch by Charles Wohlganger. .. @@ -974,7 +965,6 @@ continue to pass. Patch by Cheryl Sabella. .. section: IDLE IDLE - Factor FontPage(Frame) class from ConfigDialog. - Slightly modified tests continue to pass. Fix General tests. Patch mostly by Cheryl Sabella. @@ -1007,7 +997,6 @@ the tabs and will enable splitting the groups into classes. .. section: IDLE IDLE -- Factor a VarTrace class out of ConfigDialog. - Instance tracers manages pairs consisting of a tk variable and a callback function. When tracing is turned on, setting the variable calls the function. Test coverage for the new class is 100%. @@ -1029,12 +1018,10 @@ IDLE: Add more tests for General tab. .. section: IDLE IDLE - Improve configdialog font page and tests. - In configdialog: Document causal pathways in create_font_tab docstring. Simplify some attribute names. Move set_samples calls to var_changed_font (idea from Cheryl Sabella). Move related functions to positions after the create widgets function. - In test_configdialog: Fix test_font_set so not order dependent. Fix renamed test_indent_scale so it tests the widget. Adjust tests for movement of set_samples call. Add tests for load functions. Put all font tests in one @@ -1077,12 +1064,9 @@ Patch by Louie Lu. .. section: IDLE Document coverage details for idlelib tests. - -* Add section to idlelib/idle-test/README.txt. - -* Include check that branches are taken both ways. - -* Exclude IDLE-specific code that does not run during unit tests. +Add section to idlelib/idle-test/README.txt. +Include check that branches are taken both ways. +Exclude IDLE-specific code that does not run during unit tests. .. diff --git a/Misc/NEWS.d/3.6.4rc1.rst b/Misc/NEWS.d/3.6.4rc1.rst index ff7110f88b23..36dfadda0fe1 100644 --- a/Misc/NEWS.d/3.6.4rc1.rst +++ b/Misc/NEWS.d/3.6.4rc1.rst @@ -18,14 +18,13 @@ function. .. section: Core and Builtins Fixed several issues in printing tracebacks (PyTraceBack_Print()). - -* Setting sys.tracebacklimit to 0 or less now suppresses printing tracebacks. -* Setting sys.tracebacklimit to None now causes using the default limit. -* Setting sys.tracebacklimit to an integer larger than LONG_MAX now means using - the limit LONG_MAX rather than the default limit. -* Fixed integer overflows in the case of more than 2**31 traceback items on - Windows. -* Fixed output errors handling. +Setting sys.tracebacklimit to 0 or less now suppresses printing tracebacks. +Setting sys.tracebacklimit to None now causes using the default limit. +Setting sys.tracebacklimit to an integer larger than LONG_MAX now means using +the limit LONG_MAX rather than the default limit. +Fixed integer overflows in the case of more than 2**31 traceback items on +Windows. +Fixed output errors handling. .. @@ -308,7 +307,6 @@ value of property is ``VT_EMPTY``. Initial patch by Mark Mc Mahon. Fix wrong usage of :func:`collections.namedtuple` in the :meth:`RobotFileParser.parse() ` method. - Initial patch by Robin Wellner. .. @@ -340,11 +338,10 @@ characters/bytes for non-negative *n*. This makes it compatible with .. section: Library Fixed issues with binary plists: - -* Fixed saving bytearrays. -* Identical objects will be saved only once. -* Equal references will be load as identical objects. -* Added support for saving and loading recursive data structures. +Fixed saving bytearrays. +Identical objects will be saved only once. +Equal references will be load as identical objects. +Added support for saving and loading recursive data structures. .. @@ -392,10 +389,8 @@ Reduce performance overhead of asyncio debug mode. .. section: Library Fixed determining the MAC address in the uuid module: - -* Using ifconfig on NetBSD and OpenBSD. -* Using arp on Linux, FreeBSD, NetBSD and OpenBSD. - +Using ifconfig on NetBSD and OpenBSD. +Using arp on Linux, FreeBSD, NetBSD and OpenBSD. Based on patch by Takayuki Shimizukawa. .. @@ -913,7 +908,6 @@ Avoid wholesale rebuild after `make regen-all` if nothing changed. Return ``None`` when ``View.Fetch()`` returns ``ERROR_NO_MORE_ITEMS`` instead of raising ``MSIError``. - Initial patch by Anthony Tuininga. .. @@ -997,7 +991,6 @@ persist while IDLE remains open .. section: IDLE Test_code_module now passes if run after test_idle, which sets ps1. - The code module uses sys.ps1 if present or sets it to '>>> ' if not. Test_code_module now properly tests both behaviors. Ditto for ps2. @@ -1034,7 +1027,6 @@ a bit about the additions. .. section: IDLE Simplify the API of IDLE's Module Browser. - Passing a widget instead of an flist with a root widget opens the option of creating a browser frame that is only part of a window. Passing a full file name instead of pieces assumed to come from a .py file opens the possibility @@ -1099,10 +1091,8 @@ for code and tests by Guilherme Polo and Cheryl Sabella, respectively. .. section: Tools/Demos Make redemo work with Python 3.6 and newer versions. - Also, remove the ``LOCALE`` option since it doesn't work with string patterns in Python 3. - Patch by Christoph Sarnowski. .. diff --git a/Misc/NEWS.d/3.6.5rc1.rst b/Misc/NEWS.d/3.6.5rc1.rst index 7790a9e3d104..448baed5413e 100644 --- a/Misc/NEWS.d/3.6.5rc1.rst +++ b/Misc/NEWS.d/3.6.5rc1.rst @@ -539,7 +539,6 @@ locale to the ``LC_NUMERIC`` locale to decode ``decimal_point`` and ``thousands_sep`` byte strings if they are non-ASCII or longer than 1 byte, and the ``LC_NUMERIC`` locale is different than the ``LC_CTYPE`` locale. This temporary change affects other threads. - Same change for the :meth:`str.format` method when formatting a number (:class:`int`, :class:`float`, :class:`float` and subclasses) with the ``n`` type (ex: ``'{:n}'.format(1234)``). diff --git a/Misc/NEWS.d/3.7.0a1.rst b/Misc/NEWS.d/3.7.0a1.rst index c8d061ee6b00..f9cd59c8d4bd 100644 --- a/Misc/NEWS.d/3.7.0a1.rst +++ b/Misc/NEWS.d/3.7.0a1.rst @@ -335,7 +335,6 @@ ImportError rather than SystemError. .. section: Core and Builtins Improve signal delivery. - Avoid using Py_AddPendingCall from signal handler, to avoid calling signal-unsafe functions. The tests I'm adding here fail without the rest of the patch, on Linux and OS X. This means our signal delivery logic had defects @@ -2051,7 +2050,6 @@ Support tzinfo objects with sub-minute offsets. .. section: Library Fix shared memory performance regression in multiprocessing in 3.x. - Shared memory used anonymous memory mappings in 2.x, while 3.x mmaps actual files. Try to be careful to do as little disk I/O as possible. @@ -2063,7 +2061,6 @@ files. Try to be careful to do as little disk I/O as possible. .. section: Library Fix too many fds in processes started with the "forkserver" method. - A child process would inherit as many fds as the number of still-running children. @@ -2181,7 +2178,6 @@ Use keywords in the ``repr`` of ``datetime.timedelta``. .. section: Library signal.setitimer() may disable the timer when passed a tiny value. - Tiny values (such as 1e-6) are valid non-zero values for setitimer(), which is specified as taking microsecond-resolution intervals. However, on some platform, our conversion routine could convert 1e-6 into a zero interval, @@ -2214,7 +2210,6 @@ startup is about 5% faster on Linux and 30% faster on macOS. .. section: Library Add missing parameter "n" on multiprocessing.Condition.notify(). - The doc claims multiprocessing.Condition behaves like threading.Condition, but its notify() method lacked the optional "n" argument (to specify the number of sleepers to wake up) that threading.Condition.notify() accepts. @@ -4376,7 +4371,6 @@ xml.etree.ElementTree.Element. .. section: Library Stop using localtime() and gmtime() in the time module. - Introduced platform independent _PyTime_localtime API that is similar to POSIX localtime_r, but available on all platforms. Patch by Ed Schouten. @@ -4388,7 +4382,6 @@ POSIX localtime_r, but available on all platforms. Patch by Ed Schouten. .. section: Library Fixed calendar functions for extreme months: 0001-01 and 9999-12. - Methods itermonthdays() and itermonthdays2() are reimplemented so that they don't call itermonthdates() which can cause datetime.date under/overflow. @@ -4805,7 +4798,6 @@ the link targets for :func:`bytes` and :func:`bytearray` are now their respective type definitions, rather than the corresponding builtin function entries. Use :ref:`bytes ` and :ref:`bytearray ` to reference the latter. - In order to ensure this and future cross-reference updates are applied automatically, the daily documentation builds now disable the default output caching features in Sphinx. @@ -5094,7 +5086,6 @@ Allow --with-lto to be used on all builds, not just `make profile-opt`. .. section: Build Remove support for building --without-threads. - This option is not really useful anymore in the 21st century. Removing lots of conditional paths allows us to simplify the code base, including in difficult to maintain low-level internal code. @@ -5667,7 +5658,6 @@ Windows ._pth file should allow import site .. section: IDLE IDLE code context -- fix code update and font update timers. - Canceling timers prevents a warning message when test_idle completes. .. @@ -5710,7 +5700,6 @@ IDLE - make tests pass with zzdummy extension disabled by default. Document how IDLE runs tkinter programs. IDLE calls tcl/tk update in the background in order to make live - interaction and experimentation with tkinter applications much easier. .. @@ -5740,7 +5729,6 @@ Rearrange IDLE configdialog GenPage into Window, Editor, and Help sections. .. section: IDLE IDLE - Add docstrings and tests for outwin subclass of editor. - Move some data and functions from the class to module level. Patch by Cheryl Sabella. @@ -5761,24 +5749,20 @@ IDLE - Do not modify tkinter.message in test_configdialog. .. section: IDLE Convert IDLE's built-in 'extensions' to regular features. - About 10 IDLE features were implemented as supposedly optional extensions. Their different behavior could be confusing or worse for users and not good for maintenance. Hence the conversion. - The main difference for users is that user configurable key bindings for builtin features are now handled uniformly. Now, editing a binding in a keyset only affects its value in the keyset. All bindings are defined together in the system-specific default keysets in config-extensions.def. All custom keysets are saved as a whole in config-extension.cfg. All take effect as soon as one clicks Apply or Ok. - The affected events are '<>', '<>', '<>', '<>', '<>', '<>', '<>', and '<>'. Any (global) customizations made before 3.6.3 will not affect their keyset-specific customization after 3.6.3. and vice versa. - Initial patch by Charles Wohlganger. .. @@ -5867,7 +5851,6 @@ continue to pass. Patch by Cheryl Sabella. .. section: IDLE IDLE - Factor FontPage(Frame) class from ConfigDialog. - Slightly modified tests continue to pass. Fix General tests. Patch mostly by Cheryl Sabella. @@ -5900,7 +5883,6 @@ the tabs and will enable splitting the groups into classes. .. section: IDLE IDLE -- Factor a VarTrace class out of ConfigDialog. - Instance tracers manages pairs consisting of a tk variable and a callback function. When tracing is turned on, setting the variable calls the function. Test coverage for the new class is 100%. @@ -5922,12 +5904,10 @@ IDLE: Add more tests for General tab. .. section: IDLE IDLE - Improve configdialog font page and tests. - In configdialog: Document causal pathways in create_font_tab docstring. Simplify some attribute names. Move set_samples calls to var_changed_font (idea from Cheryl Sabella). Move related functions to positions after the create widgets function. - In test_configdialog: Fix test_font_set so not order dependent. Fix renamed test_indent_scale so it tests the widget. Adjust tests for movement of set_samples call. Add tests for load functions. Put all font tests in one @@ -5970,12 +5950,9 @@ Patch by Louie Lu. .. section: IDLE Document coverage details for idlelib tests. - -* Add section to idlelib/idle-test/README.txt. - -* Include check that branches are taken both ways. - -* Exclude IDLE-specific code that does not run during unit tests. +Add section to idlelib/idle-test/README.txt. +Include check that branches are taken both ways. +Exclude IDLE-specific code that does not run during unit tests. .. @@ -6311,7 +6288,6 @@ C API manual. .. section: C API Remove own implementation for thread-local storage. - CPython has provided the own implementation for thread-local storage (TLS) on Python/thread.c, it's used in the case which a platform has not supplied native TLS. However, currently all supported platforms (Windows and diff --git a/Misc/NEWS.d/3.7.0a2.rst b/Misc/NEWS.d/3.7.0a2.rst index b1b7c92f66a6..0f107d8c5f5a 100644 --- a/Misc/NEWS.d/3.7.0a2.rst +++ b/Misc/NEWS.d/3.7.0a2.rst @@ -337,10 +337,8 @@ Fixed typo in the name of Tkinter's method adderrorinfo(). .. section: Library Improvements to path predicates in ElementTree: - -* Allow whitespace around predicate parts, i.e. "[a = 'text']" instead of requiring the less readable "[a='text']". -* Add support for text comparison of the current node, like "[.='text']". - +Allow whitespace around predicate parts, i.e. "[a = 'text']" instead of requiring the less readable "[a='text']". +Add support for text comparison of the current node, like "[.='text']". Patch by Stefan Behnel. .. @@ -596,7 +594,6 @@ Avoid wholesale rebuild after `make regen-all` if nothing changed. .. section: IDLE Simplify the API of IDLE's Module Browser. - Passing a widget instead of an flist with a root widget opens the option of creating a browser frame that is only part of a window. Passing a full file name instead of pieces assumed to come from a .py file opens the possibility diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst index 307ea543051e..8ef7a5118a1f 100644 --- a/Misc/NEWS.d/3.7.0a3.rst +++ b/Misc/NEWS.d/3.7.0a3.rst @@ -96,14 +96,13 @@ from the environment by default). .. section: Core and Builtins Fixed several issues in printing tracebacks (PyTraceBack_Print()). - -* Setting sys.tracebacklimit to 0 or less now suppresses printing tracebacks. -* Setting sys.tracebacklimit to None now causes using the default limit. -* Setting sys.tracebacklimit to an integer larger than LONG_MAX now means using - the limit LONG_MAX rather than the default limit. -* Fixed integer overflows in the case of more than 2**31 traceback items on - Windows. -* Fixed output errors handling. +Setting sys.tracebacklimit to 0 or less now suppresses printing tracebacks. +Setting sys.tracebacklimit to None now causes using the default limit. +Setting sys.tracebacklimit to an integer larger than LONG_MAX now means using +the limit LONG_MAX rather than the default limit. +Fixed integer overflows in the case of more than 2**31 traceback items on +Windows. +Fixed output errors handling. .. @@ -388,7 +387,6 @@ argument to ``Traceback.format()``. (Patch by Jesse Bakker.) Fix wrong usage of :func:`collections.namedtuple` in the :meth:`RobotFileParser.parse() ` method. - Initial patch by Robin Wellner. .. @@ -409,7 +407,6 @@ couldn't open or create an MSI file. Initial patch by William Tis?ter. .. section: Library ``setup()`` now warns about invalid types for some fields. - The ``distutils.dist.Distribution`` class now warns when ``classifiers``, ``keywords`` and ``platforms`` fields are not specified as a list or a string. @@ -510,11 +507,10 @@ Added support of splitting on a pattern that could match an empty string. .. section: Library Fixed issues with binary plists: - -* Fixed saving bytearrays. -* Identical objects will be saved only once. -* Equal references will be load as identical objects. -* Added support for saving and loading recursive data structures. +Fixed saving bytearrays. +Identical objects will be saved only once. +Equal references will be load as identical objects. +Added support for saving and loading recursive data structures. .. @@ -697,10 +693,8 @@ Sharafutdinov. .. section: Library Fixed determining the MAC address in the uuid module: - -* Using ifconfig on NetBSD and OpenBSD. -* Using arp on Linux, FreeBSD, NetBSD and OpenBSD. - +Using ifconfig on NetBSD and OpenBSD. +Using arp on Linux, FreeBSD, NetBSD and OpenBSD. Based on patch by Takayuki Shimizukawa. .. @@ -820,7 +814,6 @@ windows .. section: Library Remove year (1-9999) limits on the Calendar.weekday() function. - Patch by Mark Gollahon. .. @@ -1413,7 +1406,6 @@ Finish removing support for AtheOS. Return ``None`` when ``View.Fetch()`` returns ``ERROR_NO_MORE_ITEMS`` instead of raising ``MSIError``. - Initial patch by Anthony Tuininga. .. @@ -1517,7 +1509,6 @@ persist while IDLE remains open .. section: IDLE Test_code_module now passes if run after test_idle, which sets ps1. - The code module uses sys.ps1 if present or sets it to '>>> ' if not. Test_code_module now properly tests both behaviors. Ditto for ps2. @@ -1543,7 +1534,6 @@ selects a font that defines a limited subset of the unicode Basic Multilingual Plane, tcl/tk will use other fonts that define a character. The expanded example give users of non-Latin characters a better idea of what they might see in IDLE's shell and editors. - To make room for the expanded sample, frames on the Font tab are re-arranged. The Font/Tabs help explains a bit about the additions. @@ -1566,10 +1556,8 @@ and Subversion are no longer used to develop CPython. .. section: Tools/Demos Make redemo work with Python 3.6 and newer versions. - Also, remove the ``LOCALE`` option since it doesn't work with string patterns in Python 3. - Patch by Christoph Sarnowski. .. diff --git a/Misc/NEWS.d/3.7.0a4.rst b/Misc/NEWS.d/3.7.0a4.rst index 5c3da97fa9d9..af9cf4d29f90 100644 --- a/Misc/NEWS.d/3.7.0a4.rst +++ b/Misc/NEWS.d/3.7.0a4.rst @@ -343,7 +343,6 @@ AssertionError. Optimize asyncio.iscoroutine() and loop.create_task() for non-native coroutines (e.g. async/await compiled with Cython). - 'loop.create_task(python_coroutine)' used to be 20% faster than 'loop.create_task(cython_coroutine)'. Now, the latter is as fast. diff --git a/Misc/NEWS.d/3.7.0b1.rst b/Misc/NEWS.d/3.7.0b1.rst index db4adfb78879..d1beec9cdcc3 100644 --- a/Misc/NEWS.d/3.7.0b1.rst +++ b/Misc/NEWS.d/3.7.0b1.rst @@ -77,7 +77,6 @@ used to test that string contains only ASCII characters. .. section: Core and Builtins Enforce :pep:`479` for all code. - This means that manually raising a StopIteration exception from a generator is prohibited for all code, regardless of whether 'from __future__ import generator_stop' was used or not. @@ -648,7 +647,6 @@ locale to the ``LC_NUMERIC`` locale to decode ``decimal_point`` and ``thousands_sep`` byte strings if they are non-ASCII or longer than 1 byte, and the ``LC_NUMERIC`` locale is different than the ``LC_CTYPE`` locale. This temporary change affects other threads. - Same change for the :meth:`str.format` method when formatting a number (:class:`int`, :class:`float`, :class:`float` and subclasses) with the ``n`` type (ex: ``'{:n}'.format(1234)``). @@ -747,7 +745,6 @@ Add a new "_xxsubinterpreters" extension module that exposes the existing subinterpreter C-API and a new cross-interpreter data sharing mechanism. The module is primarily intended for more thorough testing of the existing subinterpreter support. - Note that the _xxsubinterpreters module has been removed in 3.7.0rc1. .. diff --git a/Misc/NEWS.d/3.7.0b2.rst b/Misc/NEWS.d/3.7.0b2.rst index 10d00a5033a4..b2ade206bd5f 100644 --- a/Misc/NEWS.d/3.7.0b2.rst +++ b/Misc/NEWS.d/3.7.0b2.rst @@ -201,7 +201,6 @@ Make sure sys.argv remains as a list when running trace. various functions and methods in ``abc``. Creating an ABC subclass and calling ``isinstance`` or ``issubclass`` with an ABC subclass are up to 1.5x faster. In addition, this makes Python start-up up to 10% faster. - Note that the new implementation hides internal registry and caches, previously accessible via private attributes ``_abc_registry``, ``_abc_cache``, and ``_abc_negative_cache``. There are three debugging diff --git a/Misc/NEWS.d/3.7.0b4.rst b/Misc/NEWS.d/3.7.0b4.rst index 55c606864943..1d4fc921406f 100644 --- a/Misc/NEWS.d/3.7.0b4.rst +++ b/Misc/NEWS.d/3.7.0b4.rst @@ -174,7 +174,6 @@ Patch by St?phane Blondon. Fixed regression when running pydoc with the :option:`-m` switch. (The regression was introduced in 3.7.0b3 by the resolution of :issue:`33053`) - This fix also changed pydoc to add ``os.getcwd()`` to :data:`sys.path` when necessary, rather than adding ``"."``. From webhook-mailer at python.org Thu May 9 16:26:15 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 09 May 2019 20:26:15 -0000 Subject: [Python-checkins] [3.7] bpo-10536: Enhancements to gettext docs (GH-10324) (GH-13224) Message-ID: https://github.com/python/cpython/commit/98b360e27b0be4646ed24c5a7ac07112ca020982 commit: 98b360e27b0be4646ed24c5a7ac07112ca020982 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-09T13:26:09-07:00 summary: [3.7] bpo-10536: Enhancements to gettext docs (GH-10324) (GH-13224) (cherry picked from commit 55f3317e984cc35bd18ba0326ed98766a2750ffd) Co-authored-by: St?phane Wirtel https://bugs.python.org/issue10536 files: A Misc/NEWS.d/next/Documentation/2018-11-04-22-03-56.bpo-10536.a0IsfE.rst M Doc/library/gettext.rst diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst index c98c5e7de19f..94ed340a22f2 100644 --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -13,7 +13,7 @@ The :mod:`gettext` module provides internationalization (I18N) and localization (L10N) services for your Python modules and applications. It supports both the -GNU ``gettext`` message catalog API and a higher level, class-based API that may +GNU :program:`gettext` message catalog API and a higher level, class-based API that may be more appropriate for Python files. The interface described below allows you to write your module and application messages in one natural language, and provide a catalog of translated messages for running under different natural @@ -38,7 +38,7 @@ class-based API instead. Bind the *domain* to the locale directory *localedir*. More concretely, :mod:`gettext` will look for binary :file:`.mo` files for the given domain using - the path (on Unix): :file:`localedir/language/LC_MESSAGES/domain.mo`, where + the path (on Unix): :file:`{localedir}/{language}/LC_MESSAGES/{domain}.mo`, where *languages* is searched for in the environment variables :envvar:`LANGUAGE`, :envvar:`LC_ALL`, :envvar:`LC_MESSAGES`, and :envvar:`LANG` respectively. @@ -136,17 +136,16 @@ Class-based API The class-based API of the :mod:`gettext` module gives you more flexibility and greater convenience than the GNU :program:`gettext` API. It is the recommended way of localizing your Python applications and modules. :mod:`!gettext` defines -a "translations" class which implements the parsing of GNU :file:`.mo` format -files, and has methods for returning strings. Instances of this "translations" -class can also install themselves in the built-in namespace as the function -:func:`_`. +a :class:`GNUTranslations` class which implements the parsing of GNU :file:`.mo` format +files, and has methods for returning strings. Instances of this class can also +install themselves in the built-in namespace as the function :func:`_`. .. function:: find(domain, localedir=None, languages=None, all=False) This function implements the standard :file:`.mo` file search algorithm. It takes a *domain*, identical to what :func:`textdomain` takes. Optional - *localedir* is as in :func:`bindtextdomain` Optional *languages* is a list of + *localedir* is as in :func:`bindtextdomain`. Optional *languages* is a list of strings, where each string is a language code. If *localedir* is not given, then the default system locale directory is used. @@ -170,10 +169,10 @@ class can also install themselves in the built-in namespace as the function .. function:: translation(domain, localedir=None, languages=None, class_=None, fallback=False, codeset=None) - Return a :class:`Translations` instance based on the *domain*, *localedir*, + Return a :class:`*Translations` instance based on the *domain*, *localedir*, and *languages*, which are first passed to :func:`find` to get a list of the associated :file:`.mo` file paths. Instances with identical :file:`.mo` file - names are cached. The actual class instantiated is either *class_* if + names are cached. The actual class instantiated is *class_* if provided, otherwise :class:`GNUTranslations`. The class's constructor must take a single :term:`file object` argument. If provided, *codeset* will change the charset used to encode translated strings in the @@ -233,7 +232,7 @@ are the methods of :class:`!NullTranslations`: .. method:: _parse(fp) - No-op'd in the base class, this method takes file object *fp*, and reads + No-op in the base class, this method takes file object *fp*, and reads the data from the file, initializing its message catalog. If you have an unsupported message catalog file format, you should override this method to parse your format. @@ -275,7 +274,8 @@ are the methods of :class:`!NullTranslations`: .. method:: info() - Return the "protected" :attr:`_info` variable. + Return the "protected" :attr:`_info` variable, a dictionary containing + the metadata found in the message catalog file. .. method:: charset() @@ -326,15 +326,15 @@ The :mod:`gettext` module provides one additional class derived from :meth:`_parse` to enable reading GNU :program:`gettext` format :file:`.mo` files in both big-endian and little-endian format. -:class:`GNUTranslations` parses optional meta-data out of the translation -catalog. It is convention with GNU :program:`gettext` to include meta-data as -the translation for the empty string. This meta-data is in :rfc:`822`\ -style +:class:`GNUTranslations` parses optional metadata out of the translation +catalog. It is convention with GNU :program:`gettext` to include metadata as +the translation for the empty string. This metadata is in :rfc:`822`\ -style ``key: value`` pairs, and should contain the ``Project-Id-Version`` key. If the key ``Content-Type`` is found, then the ``charset`` property is used to initialize the "protected" :attr:`_charset` instance variable, defaulting to ``None`` if not found. If the charset encoding is specified, then all message ids and message strings read from the catalog are converted to Unicode using -this encoding, else ASCII encoding is assumed. +this encoding, else ASCII is assumed. Since message ids are read as Unicode strings too, all :meth:`*gettext` methods will assume message ids as Unicode strings, not byte strings. @@ -436,7 +436,7 @@ take the following steps: #. run a suite of tools over your marked files to generate raw messages catalogs -#. create language specific translations of the message catalogs +#. create language-specific translations of the message catalogs #. use the :mod:`gettext` module so that message strings are properly translated @@ -446,9 +446,8 @@ it in ``_('...')`` --- that is, a call to the function :func:`_`. For example:: filename = 'mylog.txt' message = _('writing a log message') - fp = open(filename, 'w') - fp.write(message) - fp.close() + with open(filename, 'w') as fp: + fp.write(message) In this example, the string ``'writing a log message'`` is marked as a candidate for translation, while the strings ``'mylog.txt'`` and ``'w'`` are not. @@ -499,7 +498,7 @@ Localizing your module ^^^^^^^^^^^^^^^^^^^^^^ If you are localizing your module, you must take care not to make global -changes, e.g. to the built-in namespace. You should not use the GNU ``gettext`` +changes, e.g. to the built-in namespace. You should not use the GNU :program:`gettext` API but instead the class-based API. Let's say your module is called "spam" and the module's various natural language @@ -653,8 +652,9 @@ implementations, and valuable experience to the creation of this module: .. [#] The default locale directory is system dependent; for example, on RedHat Linux it is :file:`/usr/share/locale`, but on Solaris it is :file:`/usr/lib/locale`. The :mod:`gettext` module does not try to support these system dependent - defaults; instead its default is :file:`sys.prefix/share/locale`. For this - reason, it is always best to call :func:`bindtextdomain` with an explicit - absolute path at the start of your application. + defaults; instead its default is :file:`{sys.prefix}/share/locale` (see + :data:`sys.prefix`). For this reason, it is always best to call + :func:`bindtextdomain` with an explicit absolute path at the start of your + application. .. [#] See the footnote for :func:`bindtextdomain` above. diff --git a/Misc/NEWS.d/next/Documentation/2018-11-04-22-03-56.bpo-10536.a0IsfE.rst b/Misc/NEWS.d/next/Documentation/2018-11-04-22-03-56.bpo-10536.a0IsfE.rst new file mode 100644 index 000000000000..b5036481fb65 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-11-04-22-03-56.bpo-10536.a0IsfE.rst @@ -0,0 +1 @@ +Enhance the gettext docs. Patch by ?ric Araujo From webhook-mailer at python.org Thu May 9 21:19:57 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 10 May 2019 01:19:57 -0000 Subject: [Python-checkins] bpo-36778: cp65001 encoding becomes an alias to utf_8 (GH-13230) Message-ID: https://github.com/python/cpython/commit/d267ac20c309e37d85a986b4417aa8ab4d05dabc commit: d267ac20c309e37d85a986b4417aa8ab4d05dabc branch: master author: Victor Stinner committer: GitHub date: 2019-05-10T03:19:54+02:00 summary: bpo-36778: cp65001 encoding becomes an alias to utf_8 (GH-13230) files: A Misc/NEWS.d/next/Library/2019-05-10-01-06-36.bpo-36778.GRqeiS.rst D Lib/encodings/cp65001.py M Doc/library/codecs.rst M Lib/encodings/aliases.py M Lib/test/test_codecs.py diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index b3246376846d..8d3daa35d153 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1106,8 +1106,7 @@ particular, the following variants typically exist: +-----------------+--------------------------------+--------------------------------+ | cp1258 | windows-1258 | Vietnamese | +-----------------+--------------------------------+--------------------------------+ -| cp65001 | | Windows only: Windows UTF-8 | -| | | (``CP_UTF8``) | +| cp65001 | | Alias to ``utf_8`` encoding | | | | | | | | .. versionadded:: 3.3 | +-----------------+--------------------------------+--------------------------------+ diff --git a/Lib/encodings/aliases.py b/Lib/encodings/aliases.py index 2e63c2f9495e..5ef40a3438b9 100644 --- a/Lib/encodings/aliases.py +++ b/Lib/encodings/aliases.py @@ -534,6 +534,7 @@ 'utf8' : 'utf_8', 'utf8_ucs2' : 'utf_8', 'utf8_ucs4' : 'utf_8', + 'cp65001' : 'utf_8', # uu_codec codec 'uu' : 'uu_codec', diff --git a/Lib/encodings/cp65001.py b/Lib/encodings/cp65001.py deleted file mode 100644 index 95cb2aecf0cc..000000000000 --- a/Lib/encodings/cp65001.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -Code page 65001: Windows UTF-8 (CP_UTF8). -""" - -import codecs -import functools - -if not hasattr(codecs, 'code_page_encode'): - raise LookupError("cp65001 encoding is only available on Windows") - -### Codec APIs - -encode = functools.partial(codecs.code_page_encode, 65001) -_decode = functools.partial(codecs.code_page_decode, 65001) - -def decode(input, errors='strict'): - return codecs.code_page_decode(65001, input, errors, True) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - _buffer_decode = _decode - -class StreamWriter(codecs.StreamWriter): - encode = encode - -class StreamReader(codecs.StreamReader): - decode = _decode - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='cp65001', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 027a84e275e3..8c14f5981d0b 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -875,95 +875,6 @@ def test_surrogatepass_handler(self): b"abc\xed\xa0z".decode(self.encoding, "surrogatepass") - at unittest.skipUnless(sys.platform == 'win32', - 'cp65001 is a Windows-only codec') -class CP65001Test(ReadTest, unittest.TestCase): - encoding = "cp65001" - - def test_encode(self): - tests = [ - ('abc', 'strict', b'abc'), - ('\xe9\u20ac', 'strict', b'\xc3\xa9\xe2\x82\xac'), - ('\U0010ffff', 'strict', b'\xf4\x8f\xbf\xbf'), - ('\udc80', 'strict', None), - ('\udc80', 'ignore', b''), - ('\udc80', 'replace', b'?'), - ('\udc80', 'backslashreplace', b'\\udc80'), - ('\udc80', 'namereplace', b'\\udc80'), - ('\udc80', 'surrogatepass', b'\xed\xb2\x80'), - ] - for text, errors, expected in tests: - if expected is not None: - try: - encoded = text.encode('cp65001', errors) - except UnicodeEncodeError as err: - self.fail('Unable to encode %a to cp65001 with ' - 'errors=%r: %s' % (text, errors, err)) - self.assertEqual(encoded, expected, - '%a.encode("cp65001", %r)=%a != %a' - % (text, errors, encoded, expected)) - else: - self.assertRaises(UnicodeEncodeError, - text.encode, "cp65001", errors) - - def test_decode(self): - tests = [ - (b'abc', 'strict', 'abc'), - (b'\xc3\xa9\xe2\x82\xac', 'strict', '\xe9\u20ac'), - (b'\xf4\x8f\xbf\xbf', 'strict', '\U0010ffff'), - (b'\xef\xbf\xbd', 'strict', '\ufffd'), - (b'[\xc3\xa9]', 'strict', '[\xe9]'), - # invalid bytes - (b'[\xff]', 'strict', None), - (b'[\xff]', 'ignore', '[]'), - (b'[\xff]', 'replace', '[\ufffd]'), - (b'[\xff]', 'surrogateescape', '[\udcff]'), - (b'[\xed\xb2\x80]', 'strict', None), - (b'[\xed\xb2\x80]', 'ignore', '[]'), - (b'[\xed\xb2\x80]', 'replace', '[\ufffd\ufffd\ufffd]'), - ] - for raw, errors, expected in tests: - if expected is not None: - try: - decoded = raw.decode('cp65001', errors) - except UnicodeDecodeError as err: - self.fail('Unable to decode %a from cp65001 with ' - 'errors=%r: %s' % (raw, errors, err)) - self.assertEqual(decoded, expected, - '%a.decode("cp65001", %r)=%a != %a' - % (raw, errors, decoded, expected)) - else: - self.assertRaises(UnicodeDecodeError, - raw.decode, 'cp65001', errors) - - def test_lone_surrogates(self): - self.assertRaises(UnicodeEncodeError, "\ud800".encode, "cp65001") - self.assertRaises(UnicodeDecodeError, b"\xed\xa0\x80".decode, "cp65001") - self.assertEqual("[\uDC80]".encode("cp65001", "backslashreplace"), - b'[\\udc80]') - self.assertEqual("[\uDC80]".encode("cp65001", "namereplace"), - b'[\\udc80]') - self.assertEqual("[\uDC80]".encode("cp65001", "xmlcharrefreplace"), - b'[�]') - self.assertEqual("[\uDC80]".encode("cp65001", "surrogateescape"), - b'[\x80]') - self.assertEqual("[\uDC80]".encode("cp65001", "ignore"), - b'[]') - self.assertEqual("[\uDC80]".encode("cp65001", "replace"), - b'[?]') - - def test_surrogatepass_handler(self): - self.assertEqual("abc\ud800def".encode("cp65001", "surrogatepass"), - b"abc\xed\xa0\x80def") - self.assertEqual(b"abc\xed\xa0\x80def".decode("cp65001", "surrogatepass"), - "abc\ud800def") - self.assertEqual("\U00010fff\uD800".encode("cp65001", "surrogatepass"), - b"\xf0\x90\xbf\xbf\xed\xa0\x80") - self.assertEqual(b"\xf0\x90\xbf\xbf\xed\xa0\x80".decode("cp65001", "surrogatepass"), - "\U00010fff\uD800") - self.assertTrue(codecs.lookup_error("surrogatepass")) - - class UTF7Test(ReadTest, unittest.TestCase): encoding = "utf-7" diff --git a/Misc/NEWS.d/next/Library/2019-05-10-01-06-36.bpo-36778.GRqeiS.rst b/Misc/NEWS.d/next/Library/2019-05-10-01-06-36.bpo-36778.GRqeiS.rst new file mode 100644 index 000000000000..5e594a33447c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-10-01-06-36.bpo-36778.GRqeiS.rst @@ -0,0 +1,2 @@ +``cp65001`` encoding (Windows code page 65001) becomes an alias to ``utf_8`` +encoding. From webhook-mailer at python.org Thu May 9 21:29:00 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 10 May 2019 01:29:00 -0000 Subject: [Python-checkins] bpo-36601: clarify signal handler comment and remove unnecessary pid check. (GH-12784) Message-ID: https://github.com/python/cpython/commit/d237b3f0f61990c972b84c45eb4fe137db51a6a7 commit: d237b3f0f61990c972b84c45eb4fe137db51a6a7 branch: master author: Jeroen Demeyer committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-09T18:28:56-07:00 summary: bpo-36601: clarify signal handler comment and remove unnecessary pid check. (GH-12784) https://bugs.python.org/issue36601 files: A Misc/NEWS.d/next/Core and Builtins/2019-04-13-16-14-16.bpo-36601.mIgS7t.rst M Modules/signalmodule.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-13-16-14-16.bpo-36601.mIgS7t.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-13-16-14-16.bpo-36601.mIgS7t.rst new file mode 100644 index 000000000000..0159aae65d75 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-13-16-14-16.bpo-36601.mIgS7t.rst @@ -0,0 +1,2 @@ +A long-since-meaningless check for ``getpid() == main_pid`` was removed +from Python's internal C signal handler. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 8c5a0d044ab6..43a4da1a627e 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -73,11 +73,12 @@ class sigset_t_converter(CConverter): /* NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS - When threads are supported, we want the following semantics: + We want the following semantics: - only the main thread can set a signal handler + - only the main thread runs the signal handler + - signals can be delivered to any thread - any thread can get a signal handler - - signals are only delivered to the main thread I.e. we don't support "synchronous signals" like SIGFPE (catching this doesn't make much sense in Python anyway) nor do we support @@ -88,17 +89,17 @@ class sigset_t_converter(CConverter): We still have the problem that in some implementations signals generated by the keyboard (e.g. SIGINT) are delivered to all threads (e.g. SGI), while in others (e.g. Solaris) such signals are - delivered to one random thread (an intermediate possibility would - be to deliver it to the main thread -- POSIX?). For now, we have - a working implementation that works in all three cases -- the - handler ignores signals if getpid() isn't the same as in the main - thread. XXX This is a hack. + delivered to one random thread. On Linux, signals are delivered to + the main thread (unless the main thread is blocking the signal, for + example because it's already handling the same signal). Since we + allow signals to be delivered to any thread, this works fine. The + only oddity is that the thread executing the Python signal handler + may not be the thread that received the signal. */ #include /* For pid_t */ #include "pythread.h" static unsigned long main_thread; -static pid_t main_pid; static PyInterpreterState *main_interp; static volatile struct { @@ -326,11 +327,7 @@ signal_handler(int sig_num) { int save_errno = errno; - /* See NOTES section above */ - if (getpid() == main_pid) - { - trip_signal(sig_num); - } + trip_signal(sig_num); #ifndef HAVE_SIGACTION #ifdef SIGCHLD @@ -1328,7 +1325,6 @@ PyInit__signal(void) int i; main_thread = PyThread_get_thread_ident(); - main_pid = getpid(); main_interp = _PyInterpreterState_Get(); /* Create the module and add the functions */ @@ -1739,7 +1735,6 @@ _PySignal_AfterFork(void) * the interpreter had an opportunity to call the handlers. issue9535. */ _clear_pending_signals(); main_thread = PyThread_get_thread_ident(); - main_pid = getpid(); main_interp = _PyInterpreterState_Get(); } From webhook-mailer at python.org Thu May 9 21:50:15 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 10 May 2019 01:50:15 -0000 Subject: [Python-checkins] bpo-27497: Add return value to csv.DictWriter.writeheader (GH-12306) Message-ID: https://github.com/python/cpython/commit/fce5ff1e18b522cf52379934a6560583d840e7f9 commit: fce5ff1e18b522cf52379934a6560583d840e7f9 branch: master author: R?mi Lapeyre committer: Victor Stinner date: 2019-05-10T03:50:11+02:00 summary: bpo-27497: Add return value to csv.DictWriter.writeheader (GH-12306) csv.DictWriter.writeheader() now returns the return value of the underlying csv.Writer.writerow() method. Patch contributed by Ashish Nitin Patil. files: A Misc/NEWS.d/next/Library/2019-03-13-10-57-41.bpo-27497.JDmIe_.rst M Doc/library/csv.rst M Lib/csv.py M Lib/test/test_csv.py diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst index 17534fcc4615..49e22fa73ed2 100644 --- a/Doc/library/csv.rst +++ b/Doc/library/csv.rst @@ -443,7 +443,8 @@ read CSV files (assuming they support complex numbers at all). .. method:: csvwriter.writerow(row) Write the *row* parameter to the writer's file object, formatted according to - the current dialect. + the current dialect. Return the return value of the call to the *write* method + of the underlying file object. .. versionchanged:: 3.5 Added support of arbitrary iterables. @@ -467,9 +468,14 @@ DictWriter objects have the following public method: .. method:: DictWriter.writeheader() - Write a row with the field names (as specified in the constructor). + Write a row with the field names (as specified in the constructor) to + the writer's file object, formatted according to the current dialect. Return + the return value of the :meth:`csvwriter.writerow` call used internally. .. versionadded:: 3.2 + .. versionchanged:: 3.8 + :meth:`writeheader` now also returns the value returned by + the :meth:`csvwriter.writerow` method it uses internally. .. _csv-examples: diff --git a/Lib/csv.py b/Lib/csv.py index eeeedabc6bb8..dc85077f3ec6 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -140,7 +140,7 @@ def __init__(self, f, fieldnames, restval="", extrasaction="raise", def writeheader(self): header = dict(zip(self.fieldnames, self.fieldnames)) - self.writerow(header) + return self.writerow(header) def _dict_to_list(self, rowdict): if self.extrasaction == "raise": diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 7a333139b5ea..a16d14019f34 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -608,6 +608,12 @@ def test_read_escape_fieldsep(self): class TestDictFields(unittest.TestCase): ### "long" means the row is longer than the number of fieldnames ### "short" means there are fewer elements in the row than fieldnames + def test_writeheader_return_value(self): + with TemporaryFile("w+", newline='') as fileobj: + writer = csv.DictWriter(fileobj, fieldnames = ["f1", "f2", "f3"]) + writeheader_return_value = writer.writeheader() + self.assertEqual(writeheader_return_value, 10) + def test_write_simple_dict(self): with TemporaryFile("w+", newline='') as fileobj: writer = csv.DictWriter(fileobj, fieldnames = ["f1", "f2", "f3"]) diff --git a/Misc/NEWS.d/next/Library/2019-03-13-10-57-41.bpo-27497.JDmIe_.rst b/Misc/NEWS.d/next/Library/2019-03-13-10-57-41.bpo-27497.JDmIe_.rst new file mode 100644 index 000000000000..f6da1143681a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-13-10-57-41.bpo-27497.JDmIe_.rst @@ -0,0 +1,3 @@ +:meth:`csv.DictWriter.writeheader` now returns the return value of the +underlying :meth:`csv.Writer.writerow` method. Patch contributed by Ashish +Nitin Patil. From webhook-mailer at python.org Thu May 9 22:00:11 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 10 May 2019 02:00:11 -0000 Subject: [Python-checkins] bpo-36814: ensure os.posix_spawn() handles None (GH-13144) Message-ID: https://github.com/python/cpython/commit/948ed8c96b6912541a608591efe3e00fb520429a commit: 948ed8c96b6912541a608591efe3e00fb520429a branch: master author: Anthony Shaw committer: Victor Stinner date: 2019-05-10T04:00:06+02:00 summary: bpo-36814: ensure os.posix_spawn() handles None (GH-13144) Fix an issue where os.posix_spawn() would incorrectly raise a TypeError when file_actions is None. files: A Misc/NEWS.d/next/Library/2019-05-06-23-13-26.bpo-36814.dSeMz_.rst M Lib/test/test_posix.py M Modules/posixmodule.c diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 843402930ffc..5c93d0d507d2 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1550,6 +1550,15 @@ def test_specify_environment(self): with open(envfile) as f: self.assertEqual(f.read(), 'bar') + def test_none_file_actions(self): + pid = self.spawn_func( + self.NOOP_PROGRAM[0], + self.NOOP_PROGRAM, + os.environ, + file_actions=None + ) + self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + def test_empty_file_actions(self): pid = self.spawn_func( self.NOOP_PROGRAM[0], diff --git a/Misc/NEWS.d/next/Library/2019-05-06-23-13-26.bpo-36814.dSeMz_.rst b/Misc/NEWS.d/next/Library/2019-05-06-23-13-26.bpo-36814.dSeMz_.rst new file mode 100644 index 000000000000..3f40011b2650 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-23-13-26.bpo-36814.dSeMz_.rst @@ -0,0 +1 @@ +Fix an issue where os.posix_spawnp() would incorrectly raise a TypeError when file_actions is None. \ No newline at end of file diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 221f7101b213..aa77094da06a 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5465,7 +5465,7 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a goto exit; } - if (file_actions != NULL) { + if (file_actions != NULL && file_actions != Py_None) { /* There is a bug in old versions of glibc that makes some of the * helper functions for manipulating file actions not copy the provided * buffers. The problem is that posix_spawn_file_actions_addopen does not From webhook-mailer at python.org Thu May 9 23:22:25 2019 From: webhook-mailer at python.org (Giampaolo Rodola) Date: Fri, 10 May 2019 03:22:25 -0000 Subject: [Python-checkins] bpo-24538: Fix bug in shutil involving the copying of xattrs to read-only files. (PR-13212) Message-ID: https://github.com/python/cpython/commit/79efbb719383386051c72f2ee932eeca8e033e6b commit: 79efbb719383386051c72f2ee932eeca8e033e6b branch: master author: Olexa Bilaniuk committer: Giampaolo Rodola date: 2019-05-10T11:22:06+08:00 summary: bpo-24538: Fix bug in shutil involving the copying of xattrs to read-only files. (PR-13212) Extended attributes can only be set on user-writeable files, but shutil previously first chmod()ed the destination file to the source's permissions and then tried to copy xattrs. This will cause failures if attempting to copy read-only files with xattrs, as occurs with Git clones on Lustre FS. files: A Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst M Lib/shutil.py M Lib/test/test_shutil.py M Misc/ACKS diff --git a/Lib/shutil.py b/Lib/shutil.py index 6cfe3738f6eb..b2e8f5fd759b 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -359,6 +359,9 @@ def lookup(name): mode = stat.S_IMODE(st.st_mode) lookup("utime")(dst, ns=(st.st_atime_ns, st.st_mtime_ns), follow_symlinks=follow) + # We must copy extended attributes before the file is (potentially) + # chmod()'ed read-only, otherwise setxattr() will error with -EACCES. + _copyxattr(src, dst, follow_symlinks=follow) try: lookup("chmod")(dst, mode, follow_symlinks=follow) except NotImplementedError: @@ -382,7 +385,6 @@ def lookup(name): break else: raise - _copyxattr(src, dst, follow_symlinks=follow) def copy(src, dst, *, follow_symlinks=True): """Copy data and mode bits ("cp src dst"). Return the file's destination. diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index e709a5661bf3..eeebb97ff692 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -531,12 +531,20 @@ def _raise_on_src(fname, *, follow_symlinks=True): # test that shutil.copystat copies xattrs src = os.path.join(tmp_dir, 'the_original') + srcro = os.path.join(tmp_dir, 'the_original_ro') write_file(src, src) + write_file(srcro, srcro) os.setxattr(src, 'user.the_value', b'fiddly') + os.setxattr(srcro, 'user.the_value', b'fiddly') + os.chmod(srcro, 0o444) dst = os.path.join(tmp_dir, 'the_copy') + dstro = os.path.join(tmp_dir, 'the_copy_ro') write_file(dst, dst) + write_file(dstro, dstro) shutil.copystat(src, dst) + shutil.copystat(srcro, dstro) self.assertEqual(os.getxattr(dst, 'user.the_value'), b'fiddly') + self.assertEqual(os.getxattr(dstro, 'user.the_value'), b'fiddly') @support.skip_unless_symlink @support.skip_unless_xattr diff --git a/Misc/ACKS b/Misc/ACKS index 300e78894078..dfb963753608 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -149,6 +149,7 @@ Stephen Bevan Ron Bickers Natalia B. Bidart Adrian von Bidder +Olexa Bilaniuk David Binger Dominic Binks Philippe Biondi diff --git a/Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst b/Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst new file mode 100644 index 000000000000..e799f931bcec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst @@ -0,0 +1,3 @@ +In `shutil.copystat()`, first copy extended file attributes and then file +permissions, since extended attributes can only be set on the destination +while it is still writeable. From webhook-mailer at python.org Fri May 10 04:25:35 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Fri, 10 May 2019 08:25:35 -0000 Subject: [Python-checkins] bpo-36676: Update what's new document. (#13226) Message-ID: https://github.com/python/cpython/commit/e9a465f3ea22c61e05ffe7b44a69102b25f57db4 commit: e9a465f3ea22c61e05ffe7b44a69102b25f57db4 branch: master author: Stefan Behnel committer: GitHub date: 2019-05-10T10:25:13+02:00 summary: bpo-36676: Update what's new document. (#13226) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 49a6cb0788a1..6bb03422c6bc 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -558,6 +558,13 @@ xml :func:`?xml.etree.ElementTree.canonicalize()` that implements C14N 2.0. (Contributed by Stefan Behnel in :issue:`13611`.) +* The target object of :class:`xml.etree.ElementTree.XMLParser` can + receive namespace declaration events through the new callback methods + ``start_ns()`` and ``end_ns()``. Additionally, the + :class:`xml.etree.ElementTree.TreeBuilder` target can be configured + to process events about comments and processing instructions to include + them in the generated tree. + (Contributed by Stefan Behnel in :issue:`36676` and :issue:`36673`.) Optimizations ============= From webhook-mailer at python.org Fri May 10 04:45:25 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Fri, 10 May 2019 08:45:25 -0000 Subject: [Python-checkins] bpo-33071: remove outdated PyPI docs (GH-13087) Message-ID: https://github.com/python/cpython/commit/1b4abcf302ff2c8f4d4881294510d48ba5186b53 commit: 1b4abcf302ff2c8f4d4881294510d48ba5186b53 branch: master author: Kojo Idrissa committer: Nick Coghlan date: 2019-05-10T04:45:09-04:00 summary: bpo-33071: remove outdated PyPI docs (GH-13087) Patch by Kojo Idrissa. files: M Doc/distutils/packageindex.rst M Doc/distutils/setupscript.rst diff --git a/Doc/distutils/packageindex.rst b/Doc/distutils/packageindex.rst index 50cb74f2b6ca..f74c4396e545 100644 --- a/Doc/distutils/packageindex.rst +++ b/Doc/distutils/packageindex.rst @@ -8,246 +8,10 @@ The Python Package Index (PyPI) ******************************* -The `Python Package Index (PyPI)`_ stores :ref:`meta-data ` -describing distributions packaged with distutils, as well as package data like -distribution files if a package author wishes. - -Distutils provides the :command:`register` and :command:`upload` commands for -pushing meta-data and distribution files to PyPI, respectively. See -:ref:`package-commands` for information on these commands. - - -PyPI overview -============= - -PyPI lets you submit any number of versions of your distribution to the index. -If you alter the meta-data for a particular version, you can submit it again -and the index will be updated. - -PyPI holds a record for each (name, version) combination submitted. The first -user to submit information for a given name is designated the Owner of that -name. Changes can be submitted through the :command:`register` command or -through the web interface. Owners can designate other users as Owners or -Maintainers. Maintainers can edit the package information, but not designate -new Owners or Maintainers. - -By default PyPI displays only the newest version of a given package. The web -interface lets one change this default behavior and manually select which -versions to display and hide. - -For each version, PyPI displays a home page. The home page is created from -the ``long_description`` which can be submitted via the :command:`register` -command. See :ref:`package-display` for more information. - - -.. _package-commands: - -Distutils commands -================== - -Distutils exposes two commands for submitting package data to PyPI: the -:ref:`register ` command for submitting meta-data to PyPI -and the :ref:`upload ` command for submitting distribution -files. Both commands read configuration data from a special file called a -:ref:`.pypirc file `. - - -.. _package-register: - -The ``register`` command ------------------------- - -The distutils command :command:`register` is used to submit your distribution's -meta-data to an index server. It is invoked as follows:: - - python setup.py register - -Distutils will respond with the following prompt:: - - running register - We need to know who you are, so please choose either: - 1. use your existing login, - 2. register as a new user, - 3. have the server generate a new password for you (and email it to you), or - 4. quit - Your selection [default 1]: - -Note: if your username and password are saved locally, you will not see this -menu. Also, refer to :ref:`pypirc` for how to store your credentials in a -:file:`.pypirc` file. - -If you have not registered with PyPI, then you will need to do so now. You -should choose option 2, and enter your details as required. Soon after -submitting your details, you will receive an email which will be used to confirm -your registration. - -Once you are registered, you may choose option 1 from the menu. You will be -prompted for your PyPI username and password, and :command:`register` will then -submit your meta-data to the index. - -See :ref:`package-cmdoptions` for options to the :command:`register` command. - - -.. _package-upload: - -The ``upload`` command ----------------------- - -The distutils command :command:`upload` pushes the distribution files to PyPI. - -The command is invoked immediately after building one or more distribution -files. For example, the command :: - - python setup.py sdist bdist_wininst upload - -will cause the source distribution and the Windows installer to be uploaded to -PyPI. Note that these will be uploaded even if they are built using an earlier -invocation of :file:`setup.py`, but that only distributions named on the command -line for the invocation including the :command:`upload` command are uploaded. - -If a :command:`register` command was previously called in the same command, -and if the password was entered in the prompt, :command:`upload` will reuse the -entered password. This is useful if you do not want to store a password in -clear text in a :file:`.pypirc` file. - -You can use the ``--sign`` option to tell :command:`upload` to sign each -uploaded file using GPG (GNU Privacy Guard). The :program:`gpg` program must -be available for execution on the system :envvar:`PATH`. You can also specify -which key to use for signing using the ``--identity=name`` option. - -See :ref:`package-cmdoptions` for additional options to the :command:`upload` -command. - - -.. _package-cmdoptions: - -Additional command options --------------------------- - -This section describes options common to both the :command:`register` and -:command:`upload` commands. - -The ``--repository`` or ``-r`` option lets you specify a PyPI server -different from the default. For example:: - - python setup.py sdist bdist_wininst upload -r https://example.com/pypi - -For convenience, a name can be used in place of the URL when the -:file:`.pypirc` file is configured to do so. For example:: - - python setup.py register -r other - -See :ref:`pypirc` for more information on defining alternate servers. - -The ``--show-response`` option displays the full response text from the PyPI -server, which is useful when debugging problems with registering and uploading. - - -.. index:: - single: .pypirc file - single: Python Package Index (PyPI); .pypirc file - -.. _pypirc: - -The ``.pypirc`` file --------------------- - -The :command:`register` and :command:`upload` commands both check for the -existence of a :file:`.pypirc` file at the location :file:`$HOME/.pypirc`. -If this file exists, the command uses the username, password, and repository -URL configured in the file. The format of a :file:`.pypirc` file is as -follows: - -.. code-block:: ini - - [distutils] - index-servers = - pypi - - [pypi] - repository: - username: - password: - -The *distutils* section defines an *index-servers* variable that lists the -name of all sections describing a repository. - -Each section describing a repository defines three variables: - -- *repository*, that defines the url of the PyPI server. Defaults to - ``https://upload.pypi.org/legacy/``. -- *username*, which is the registered username on the PyPI server. -- *password*, that will be used to authenticate. If omitted the user - will be prompt to type it when needed. - -If you want to define another server a new section can be created and -listed in the *index-servers* variable: - -.. code-block:: ini - - [distutils] - index-servers = - pypi - other - - [pypi] - repository: - username: - password: - - [other] - repository: https://example.com/pypi - username: - password: - -This allows the :command:`register` and :command:`upload` commands to be -called with the ``--repository`` option as described in -:ref:`package-cmdoptions`. - -Specifically, you might want to add the `PyPI Test Repository -`_ to your ``.pypirc`` to facilitate -testing before doing your first upload to ``PyPI`` itself. - - -.. _package-display: - -PyPI package display -==================== - -The ``long_description`` field plays a special role at PyPI. It is used by -the server to display a home page for the registered package. - -If you use the `reStructuredText `_ -syntax for this field, PyPI will parse it and display an HTML output for -the package home page. - -The ``long_description`` field can be attached to a text file located -in the package:: - - from distutils.core import setup - - with open('README.txt') as file: - long_description = file.read() - - setup(name='Distutils', - long_description=long_description) - -In that case, :file:`README.txt` is a regular reStructuredText text file located -in the root of the package besides :file:`setup.py`. - -To prevent registering broken reStructuredText content, you can use the -:program:`rst2html` program that is provided by the :mod:`docutils` package and -check the ``long_description`` from the command line: - -.. code-block:: shell-session - - $ python setup.py --long-description | rst2html.py > output.html - -:mod:`docutils` will display a warning if there's something wrong with your -syntax. Because PyPI applies additional checks (e.g. by passing ``--no-raw`` -to ``rst2html.py`` in the command above), being able to run the command above -without warnings does not guarantee that PyPI will convert the content -successfully. +The `Python Package Index (PyPI)`_ stores metadata describing distributions +packaged with distutils and other publishing tools, as well the distribution +archives themselves. +Detailed instructions on using PyPI at :ref:`distributing-index`. .. _Python Package Index (PyPI): https://pypi.org diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst index a65a26ac57fa..1f99f62f6aff 100644 --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -612,9 +612,8 @@ Notes: provided, distutils lists it as the author in :file:`PKG-INFO`. (4) - The ``long_description`` field is used by PyPI when you are - :ref:`registering ` a package, to - :ref:`build its home page `. + The ``long_description`` field is used by PyPI when you publish a package, + to build its project page. (5) The ``license`` field is a text indicating the license covering the From webhook-mailer at python.org Fri May 10 04:50:59 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 10 May 2019 08:50:59 -0000 Subject: [Python-checkins] bpo-33071: remove outdated PyPI docs (GH-13087) Message-ID: https://github.com/python/cpython/commit/069a5b48334a795d3abe3a512dd41aad7a532a73 commit: 069a5b48334a795d3abe3a512dd41aad7a532a73 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-10T01:50:54-07:00 summary: bpo-33071: remove outdated PyPI docs (GH-13087) Patch by Kojo Idrissa. (cherry picked from commit 1b4abcf302ff2c8f4d4881294510d48ba5186b53) Co-authored-by: Kojo Idrissa files: M Doc/distutils/packageindex.rst M Doc/distutils/setupscript.rst diff --git a/Doc/distutils/packageindex.rst b/Doc/distutils/packageindex.rst index 50cb74f2b6ca..f74c4396e545 100644 --- a/Doc/distutils/packageindex.rst +++ b/Doc/distutils/packageindex.rst @@ -8,246 +8,10 @@ The Python Package Index (PyPI) ******************************* -The `Python Package Index (PyPI)`_ stores :ref:`meta-data ` -describing distributions packaged with distutils, as well as package data like -distribution files if a package author wishes. - -Distutils provides the :command:`register` and :command:`upload` commands for -pushing meta-data and distribution files to PyPI, respectively. See -:ref:`package-commands` for information on these commands. - - -PyPI overview -============= - -PyPI lets you submit any number of versions of your distribution to the index. -If you alter the meta-data for a particular version, you can submit it again -and the index will be updated. - -PyPI holds a record for each (name, version) combination submitted. The first -user to submit information for a given name is designated the Owner of that -name. Changes can be submitted through the :command:`register` command or -through the web interface. Owners can designate other users as Owners or -Maintainers. Maintainers can edit the package information, but not designate -new Owners or Maintainers. - -By default PyPI displays only the newest version of a given package. The web -interface lets one change this default behavior and manually select which -versions to display and hide. - -For each version, PyPI displays a home page. The home page is created from -the ``long_description`` which can be submitted via the :command:`register` -command. See :ref:`package-display` for more information. - - -.. _package-commands: - -Distutils commands -================== - -Distutils exposes two commands for submitting package data to PyPI: the -:ref:`register ` command for submitting meta-data to PyPI -and the :ref:`upload ` command for submitting distribution -files. Both commands read configuration data from a special file called a -:ref:`.pypirc file `. - - -.. _package-register: - -The ``register`` command ------------------------- - -The distutils command :command:`register` is used to submit your distribution's -meta-data to an index server. It is invoked as follows:: - - python setup.py register - -Distutils will respond with the following prompt:: - - running register - We need to know who you are, so please choose either: - 1. use your existing login, - 2. register as a new user, - 3. have the server generate a new password for you (and email it to you), or - 4. quit - Your selection [default 1]: - -Note: if your username and password are saved locally, you will not see this -menu. Also, refer to :ref:`pypirc` for how to store your credentials in a -:file:`.pypirc` file. - -If you have not registered with PyPI, then you will need to do so now. You -should choose option 2, and enter your details as required. Soon after -submitting your details, you will receive an email which will be used to confirm -your registration. - -Once you are registered, you may choose option 1 from the menu. You will be -prompted for your PyPI username and password, and :command:`register` will then -submit your meta-data to the index. - -See :ref:`package-cmdoptions` for options to the :command:`register` command. - - -.. _package-upload: - -The ``upload`` command ----------------------- - -The distutils command :command:`upload` pushes the distribution files to PyPI. - -The command is invoked immediately after building one or more distribution -files. For example, the command :: - - python setup.py sdist bdist_wininst upload - -will cause the source distribution and the Windows installer to be uploaded to -PyPI. Note that these will be uploaded even if they are built using an earlier -invocation of :file:`setup.py`, but that only distributions named on the command -line for the invocation including the :command:`upload` command are uploaded. - -If a :command:`register` command was previously called in the same command, -and if the password was entered in the prompt, :command:`upload` will reuse the -entered password. This is useful if you do not want to store a password in -clear text in a :file:`.pypirc` file. - -You can use the ``--sign`` option to tell :command:`upload` to sign each -uploaded file using GPG (GNU Privacy Guard). The :program:`gpg` program must -be available for execution on the system :envvar:`PATH`. You can also specify -which key to use for signing using the ``--identity=name`` option. - -See :ref:`package-cmdoptions` for additional options to the :command:`upload` -command. - - -.. _package-cmdoptions: - -Additional command options --------------------------- - -This section describes options common to both the :command:`register` and -:command:`upload` commands. - -The ``--repository`` or ``-r`` option lets you specify a PyPI server -different from the default. For example:: - - python setup.py sdist bdist_wininst upload -r https://example.com/pypi - -For convenience, a name can be used in place of the URL when the -:file:`.pypirc` file is configured to do so. For example:: - - python setup.py register -r other - -See :ref:`pypirc` for more information on defining alternate servers. - -The ``--show-response`` option displays the full response text from the PyPI -server, which is useful when debugging problems with registering and uploading. - - -.. index:: - single: .pypirc file - single: Python Package Index (PyPI); .pypirc file - -.. _pypirc: - -The ``.pypirc`` file --------------------- - -The :command:`register` and :command:`upload` commands both check for the -existence of a :file:`.pypirc` file at the location :file:`$HOME/.pypirc`. -If this file exists, the command uses the username, password, and repository -URL configured in the file. The format of a :file:`.pypirc` file is as -follows: - -.. code-block:: ini - - [distutils] - index-servers = - pypi - - [pypi] - repository: - username: - password: - -The *distutils* section defines an *index-servers* variable that lists the -name of all sections describing a repository. - -Each section describing a repository defines three variables: - -- *repository*, that defines the url of the PyPI server. Defaults to - ``https://upload.pypi.org/legacy/``. -- *username*, which is the registered username on the PyPI server. -- *password*, that will be used to authenticate. If omitted the user - will be prompt to type it when needed. - -If you want to define another server a new section can be created and -listed in the *index-servers* variable: - -.. code-block:: ini - - [distutils] - index-servers = - pypi - other - - [pypi] - repository: - username: - password: - - [other] - repository: https://example.com/pypi - username: - password: - -This allows the :command:`register` and :command:`upload` commands to be -called with the ``--repository`` option as described in -:ref:`package-cmdoptions`. - -Specifically, you might want to add the `PyPI Test Repository -`_ to your ``.pypirc`` to facilitate -testing before doing your first upload to ``PyPI`` itself. - - -.. _package-display: - -PyPI package display -==================== - -The ``long_description`` field plays a special role at PyPI. It is used by -the server to display a home page for the registered package. - -If you use the `reStructuredText `_ -syntax for this field, PyPI will parse it and display an HTML output for -the package home page. - -The ``long_description`` field can be attached to a text file located -in the package:: - - from distutils.core import setup - - with open('README.txt') as file: - long_description = file.read() - - setup(name='Distutils', - long_description=long_description) - -In that case, :file:`README.txt` is a regular reStructuredText text file located -in the root of the package besides :file:`setup.py`. - -To prevent registering broken reStructuredText content, you can use the -:program:`rst2html` program that is provided by the :mod:`docutils` package and -check the ``long_description`` from the command line: - -.. code-block:: shell-session - - $ python setup.py --long-description | rst2html.py > output.html - -:mod:`docutils` will display a warning if there's something wrong with your -syntax. Because PyPI applies additional checks (e.g. by passing ``--no-raw`` -to ``rst2html.py`` in the command above), being able to run the command above -without warnings does not guarantee that PyPI will convert the content -successfully. +The `Python Package Index (PyPI)`_ stores metadata describing distributions +packaged with distutils and other publishing tools, as well the distribution +archives themselves. +Detailed instructions on using PyPI at :ref:`distributing-index`. .. _Python Package Index (PyPI): https://pypi.org diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst index a65a26ac57fa..1f99f62f6aff 100644 --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -612,9 +612,8 @@ Notes: provided, distutils lists it as the author in :file:`PKG-INFO`. (4) - The ``long_description`` field is used by PyPI when you are - :ref:`registering ` a package, to - :ref:`build its home page `. + The ``long_description`` field is used by PyPI when you publish a package, + to build its project page. (5) The ``license`` field is a text indicating the license covering the From webhook-mailer at python.org Fri May 10 06:08:14 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Fri, 10 May 2019 10:08:14 -0000 Subject: [Python-checkins] bpo-36869: fix warning of unused variables (GH-13182) Message-ID: https://github.com/python/cpython/commit/a2fedd8c910cb5f5b9bd568d6fd44d63f8f5cfa5 commit: a2fedd8c910cb5f5b9bd568d6fd44d63f8f5cfa5 branch: master author: Emmanuel Arias committer: Inada Naoki date: 2019-05-10T19:08:08+09:00 summary: bpo-36869: fix warning of unused variables (GH-13182) files: M Objects/dictobject.c diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 9b5c0a3be9ab..c8c88d2c0fc5 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -459,6 +459,7 @@ static PyObject *empty_values[1] = { NULL }; int _PyDict_CheckConsistency(PyObject *op, int check_content) { +#ifndef NDEBUG _PyObject_ASSERT(op, PyDict_Check(op)); PyDictObject *mp = (PyDictObject *)op; @@ -517,7 +518,7 @@ _PyDict_CheckConsistency(PyObject *op, int check_content) } } } - +#endif return 1; } From webhook-mailer at python.org Fri May 10 13:21:34 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Fri, 10 May 2019 17:21:34 -0000 Subject: [Python-checkins] bpo-35983: skip trashcan for subclasses (GH-11841) Message-ID: https://github.com/python/cpython/commit/351c67416ba4451eb3928fa0b2e933c2f25df1a3 commit: 351c67416ba4451eb3928fa0b2e933c2f25df1a3 branch: master author: Jeroen Demeyer committer: Antoine Pitrou date: 2019-05-10T19:21:10+02:00 summary: bpo-35983: skip trashcan for subclasses (GH-11841) Add new trashcan macros to deal with a double deallocation that could occur when the `tp_dealloc` of a subclass calls the `tp_dealloc` of a base class and that base class uses the trashcan mechanism. Patch by Jeroen Demeyer. files: A Misc/NEWS.d/next/Core and Builtins/2019-02-13-16-47-19.bpo-35983.bNxsXv.rst M Include/object.h M Lib/test/test_capi.py M Lib/test/test_ordered_dict.py M Modules/_elementtree.c M Modules/_testcapimodule.c M Objects/descrobject.c M Objects/dictobject.c M Objects/listobject.c M Objects/odictobject.c M Objects/setobject.c M Objects/tupleobject.c M Objects/typeobject.c M Python/hamt.c M Python/traceback.c diff --git a/Include/object.h b/Include/object.h index 13e88a6dc6f0..6464f33be491 100644 --- a/Include/object.h +++ b/Include/object.h @@ -649,11 +649,11 @@ times. When deallocating a container object, it's possible to trigger an unbounded chain of deallocations, as each Py_DECREF in turn drops the refcount on "the -next" object in the chain to 0. This can easily lead to stack faults, and +next" object in the chain to 0. This can easily lead to stack overflows, especially in threads (which typically have less stack space to work with). -A container object that participates in cyclic gc can avoid this by -bracketing the body of its tp_dealloc function with a pair of macros: +A container object can avoid this by bracketing the body of its tp_dealloc +function with a pair of macros: static void mytype_dealloc(mytype *p) @@ -661,14 +661,14 @@ mytype_dealloc(mytype *p) ... declarations go here ... PyObject_GC_UnTrack(p); // must untrack first - Py_TRASHCAN_SAFE_BEGIN(p) + Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... The body of the deallocator goes here, including all calls ... ... to Py_DECREF on contained objects. ... - Py_TRASHCAN_SAFE_END(p) + Py_TRASHCAN_END // there should be no code after this } CAUTION: Never return from the middle of the body! If the body needs to -"get out early", put a label immediately before the Py_TRASHCAN_SAFE_END +"get out early", put a label immediately before the Py_TRASHCAN_END call, and goto it. Else the call-depth counter (see below) will stay above 0 forever, and the trashcan will never get emptied. @@ -684,6 +684,12 @@ notices this, and calls another routine to deallocate all the objects that may have been added to the list of deferred deallocations. In effect, a chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces, with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. + +Since the tp_dealloc of a subclass typically calls the tp_dealloc of the base +class, we need to ensure that the trashcan is only triggered on the tp_dealloc +of the actual class being deallocated. Otherwise we might end up with a +partially-deallocated object. To check this, the tp_dealloc function must be +passed as second argument to Py_TRASHCAN_BEGIN(). */ /* The new thread-safe private API, invoked by the macros below. */ @@ -692,21 +698,38 @@ PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); #define PyTrash_UNWIND_LEVEL 50 -#define Py_TRASHCAN_SAFE_BEGIN(op) \ +#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \ do { \ - PyThreadState *_tstate = PyThreadState_GET(); \ - if (_tstate->trash_delete_nesting < PyTrash_UNWIND_LEVEL) { \ - ++_tstate->trash_delete_nesting; - /* The body of the deallocator is here. */ -#define Py_TRASHCAN_SAFE_END(op) \ + PyThreadState *_tstate = NULL; \ + /* If "cond" is false, then _tstate remains NULL and the deallocator \ + * is run normally without involving the trashcan */ \ + if (cond) { \ + _tstate = PyThreadState_GET(); \ + if (_tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) { \ + /* Store the object (to be deallocated later) and jump past \ + * Py_TRASHCAN_END, skipping the body of the deallocator */ \ + _PyTrash_thread_deposit_object(_PyObject_CAST(op)); \ + break; \ + } \ + ++_tstate->trash_delete_nesting; \ + } + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_END \ + if (_tstate) { \ --_tstate->trash_delete_nesting; \ if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \ _PyTrash_thread_destroy_chain(); \ } \ - else \ - _PyTrash_thread_deposit_object(_PyObject_CAST(op)); \ } while (0); +#define Py_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN_CONDITION(op, \ + Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) + +/* For backwards compatibility, these macros enable the trashcan + * unconditionally */ +#define Py_TRASHCAN_SAFE_BEGIN(op) Py_TRASHCAN_BEGIN_CONDITION(op, 1) +#define Py_TRASHCAN_SAFE_END(op) Py_TRASHCAN_END + #ifndef Py_LIMITED_API # define Py_CPYTHON_OBJECT_H diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 31dab6a423e2..8bcbd82b2d9d 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -333,6 +333,49 @@ def test_negative_refcount(self): br'_Py_NegativeRefcount: Assertion failed: ' br'object has negative ref count') + def test_trashcan_subclass(self): + # bpo-35983: Check that the trashcan mechanism for "list" is NOT + # activated when its tp_dealloc is being called by a subclass + from _testcapi import MyList + L = None + for i in range(1000): + L = MyList((L,)) + + def test_trashcan_python_class1(self): + self.do_test_trashcan_python_class(list) + + def test_trashcan_python_class2(self): + from _testcapi import MyList + self.do_test_trashcan_python_class(MyList) + + def do_test_trashcan_python_class(self, base): + # Check that the trashcan mechanism works properly for a Python + # subclass of a class using the trashcan (this specific test assumes + # that the base class "base" behaves like list) + class PyList(base): + # Count the number of PyList instances to verify that there is + # no memory leak + num = 0 + def __init__(self, *args): + __class__.num += 1 + super().__init__(*args) + def __del__(self): + __class__.num -= 1 + + for parity in (0, 1): + L = None + # We need in the order of 2**20 iterations here such that a + # typical 8MB stack would overflow without the trashcan. + for i in range(2**20): + L = PyList((L,)) + L.attr = i + if parity: + # Add one additional nesting layer + L = (L,) + self.assertGreater(PyList.num, 0) + del L + self.assertEqual(PyList.num, 0) + class TestPendingCalls(unittest.TestCase): diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py index b1d7f86a6760..148a9bdc35ee 100644 --- a/Lib/test/test_ordered_dict.py +++ b/Lib/test/test_ordered_dict.py @@ -459,7 +459,9 @@ def update(self, *args, **kwds): self.assertEqual(list(MyOD(items).items()), items) def test_highly_nested(self): - # Issue 25395: crashes during garbage collection + # Issues 25395 and 35983: test that the trashcan mechanism works + # correctly for OrderedDict: deleting a highly nested OrderDict + # should not crash Python. OrderedDict = self.OrderedDict obj = None for _ in range(1000): @@ -468,7 +470,9 @@ def test_highly_nested(self): support.gc_collect() def test_highly_nested_subclass(self): - # Issue 25395: crashes during garbage collection + # Issues 25395 and 35983: test that the trashcan mechanism works + # correctly for OrderedDict: deleting a highly nested OrderDict + # should not crash Python. OrderedDict = self.OrderedDict deleted = [] class MyOD(OrderedDict): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-13-16-47-19.bpo-35983.bNxsXv.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-13-16-47-19.bpo-35983.bNxsXv.rst new file mode 100644 index 000000000000..1138df635dbb --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-13-16-47-19.bpo-35983.bNxsXv.rst @@ -0,0 +1,3 @@ +Added new trashcan macros to deal with a double deallocation that could occur +when the `tp_dealloc` of a subclass calls the `tp_dealloc` of a base class +and that base class uses the trashcan mechanism. Patch by Jeroen Demeyer. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index e9a0ea21b292..f5fc4437deb5 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -669,7 +669,7 @@ element_dealloc(ElementObject* self) { /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(self); - Py_TRASHCAN_SAFE_BEGIN(self) + Py_TRASHCAN_BEGIN(self, element_dealloc) if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) self); @@ -680,7 +680,7 @@ element_dealloc(ElementObject* self) RELEASE(sizeof(ElementObject), "destroy element"); Py_TYPE(self)->tp_free((PyObject *)self); - Py_TRASHCAN_SAFE_END(self) + Py_TRASHCAN_END } /* -------------------------------------------------------------------- */ diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index c52e34996385..04d75ace6ecf 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5451,6 +5451,76 @@ recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds) } +/* Test bpo-35983: create a subclass of "list" which checks that instances + * are not deallocated twice */ + +typedef struct { + PyListObject list; + int deallocated; +} MyListObject; + +static PyObject * +MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyObject* op = PyList_Type.tp_new(type, args, kwds); + ((MyListObject*)op)->deallocated = 0; + return op; +} + +void +MyList_dealloc(MyListObject* op) +{ + if (op->deallocated) { + /* We cannot raise exceptions here but we still want the testsuite + * to fail when we hit this */ + Py_FatalError("MyList instance deallocated twice"); + } + op->deallocated = 1; + PyList_Type.tp_dealloc((PyObject *)op); +} + +static PyTypeObject MyList_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MyList", + sizeof(MyListObject), + 0, + (destructor)MyList_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_reserved */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* &PyList_Type */ /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + MyList_new, /* tp_new */ +}; + + /* Test PEP 560 */ typedef struct { @@ -5564,6 +5634,12 @@ PyInit__testcapi(void) Py_INCREF(&awaitType); PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType); + MyList_Type.tp_base = &PyList_Type; + if (PyType_Ready(&MyList_Type) < 0) + return NULL; + Py_INCREF(&MyList_Type); + PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type); + if (PyType_Ready(&GenericAlias_Type) < 0) return NULL; Py_INCREF(&GenericAlias_Type); diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 0fe9a441b82c..8f1a823768f3 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1021,11 +1021,11 @@ static void wrapper_dealloc(wrapperobject *wp) { PyObject_GC_UnTrack(wp); - Py_TRASHCAN_SAFE_BEGIN(wp) + Py_TRASHCAN_BEGIN(wp, wrapper_dealloc) Py_XDECREF(wp->descr); Py_XDECREF(wp->self); PyObject_GC_Del(wp); - Py_TRASHCAN_SAFE_END(wp) + Py_TRASHCAN_END } static PyObject * diff --git a/Objects/dictobject.c b/Objects/dictobject.c index c8c88d2c0fc5..88ac1a9dcd0f 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1978,7 +1978,7 @@ dict_dealloc(PyDictObject *mp) /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(mp); - Py_TRASHCAN_SAFE_BEGIN(mp) + Py_TRASHCAN_BEGIN(mp, dict_dealloc) if (values != NULL) { if (values != empty_values) { for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) { @@ -1996,7 +1996,7 @@ dict_dealloc(PyDictObject *mp) free_list[numfree++] = mp; else Py_TYPE(mp)->tp_free((PyObject *)mp); - Py_TRASHCAN_SAFE_END(mp) + Py_TRASHCAN_END } diff --git a/Objects/listobject.c b/Objects/listobject.c index c29954283c48..08b3e89a957f 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -361,7 +361,7 @@ list_dealloc(PyListObject *op) { Py_ssize_t i; PyObject_GC_UnTrack(op); - Py_TRASHCAN_SAFE_BEGIN(op) + Py_TRASHCAN_BEGIN(op, list_dealloc) if (op->ob_item != NULL) { /* Do it backwards, for Christian Tismer. There's a simple test case where somehow this reduces @@ -377,7 +377,7 @@ list_dealloc(PyListObject *op) free_list[numfree++] = op; else Py_TYPE(op)->tp_free((PyObject *)op); - Py_TRASHCAN_SAFE_END(op) + Py_TRASHCAN_END } static PyObject * diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 6c75a42f4ee7..773827d85b3a 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1356,28 +1356,17 @@ static PyGetSetDef odict_getset[] = { static void odict_dealloc(PyODictObject *self) { - PyThreadState *tstate = _PyThreadState_GET(); - PyObject_GC_UnTrack(self); - Py_TRASHCAN_SAFE_BEGIN(self) + Py_TRASHCAN_BEGIN(self, odict_dealloc) Py_XDECREF(self->od_inst_dict); if (self->od_weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *)self); _odict_clear_nodes(self); - - /* Call the base tp_dealloc(). Since it too uses the trashcan mechanism, - * temporarily decrement trash_delete_nesting to prevent triggering it - * and putting the partially deallocated object on the trashcan's - * to-be-deleted-later list. - */ - --tstate->trash_delete_nesting; - assert(_tstate->trash_delete_nesting < PyTrash_UNWIND_LEVEL); PyDict_Type.tp_dealloc((PyObject *)self); - ++tstate->trash_delete_nesting; - Py_TRASHCAN_SAFE_END(self) + Py_TRASHCAN_END } /* tp_repr */ diff --git a/Objects/setobject.c b/Objects/setobject.c index a43ecd52853a..82e9639d2884 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -559,7 +559,7 @@ set_dealloc(PySetObject *so) /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(so); - Py_TRASHCAN_SAFE_BEGIN(so) + Py_TRASHCAN_BEGIN(so, set_dealloc) if (so->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) so); @@ -572,7 +572,7 @@ set_dealloc(PySetObject *so) if (so->table != so->smalltable) PyMem_DEL(so->table); Py_TYPE(so)->tp_free(so); - Py_TRASHCAN_SAFE_END(so) + Py_TRASHCAN_END } static PyObject * diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 75d2bf95e668..9f0fc1cc2c3f 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -240,7 +240,7 @@ tupledealloc(PyTupleObject *op) Py_ssize_t i; Py_ssize_t len = Py_SIZE(op); PyObject_GC_UnTrack(op); - Py_TRASHCAN_SAFE_BEGIN(op) + Py_TRASHCAN_BEGIN(op, tupledealloc) if (len > 0) { i = len; while (--i >= 0) @@ -259,7 +259,7 @@ tupledealloc(PyTupleObject *op) } Py_TYPE(op)->tp_free((PyObject *)op); done: - Py_TRASHCAN_SAFE_END(op) + Py_TRASHCAN_END } static PyObject * diff --git a/Objects/typeobject.c b/Objects/typeobject.c index b28f494962ec..bfbd320b1f54 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1120,7 +1120,6 @@ subtype_dealloc(PyObject *self) { PyTypeObject *type, *base; destructor basedealloc; - PyThreadState *tstate = _PyThreadState_GET(); int has_finalizer; /* Extract the type; we expect it to be a heap type */ @@ -1174,11 +1173,7 @@ subtype_dealloc(PyObject *self) /* UnTrack and re-Track around the trashcan macro, alas */ /* See explanation at end of function for full disclosure */ PyObject_GC_UnTrack(self); - ++_PyRuntime.gc.trash_delete_nesting; - ++ tstate->trash_delete_nesting; - Py_TRASHCAN_SAFE_BEGIN(self); - --_PyRuntime.gc.trash_delete_nesting; - -- tstate->trash_delete_nesting; + Py_TRASHCAN_BEGIN(self, subtype_dealloc); /* Find the nearest base with a different tp_dealloc */ base = type; @@ -1271,11 +1266,7 @@ subtype_dealloc(PyObject *self) Py_DECREF(type); endlabel: - ++_PyRuntime.gc.trash_delete_nesting; - ++ tstate->trash_delete_nesting; - Py_TRASHCAN_SAFE_END(self); - --_PyRuntime.gc.trash_delete_nesting; - -- tstate->trash_delete_nesting; + Py_TRASHCAN_END /* Explanation of the weirdness around the trashcan macros: @@ -1312,67 +1303,6 @@ subtype_dealloc(PyObject *self) looks like trash to gc too, and gc also tries to delete self then. But we're already deleting self. Double deallocation is a subtle disaster. - - Q. Why the bizarre (net-zero) manipulation of - _PyRuntime.trash_delete_nesting around the trashcan macros? - - A. Some base classes (e.g. list) also use the trashcan mechanism. - The following scenario used to be possible: - - - suppose the trashcan level is one below the trashcan limit - - - subtype_dealloc() is called - - - the trashcan limit is not yet reached, so the trashcan level - is incremented and the code between trashcan begin and end is - executed - - - this destroys much of the object's contents, including its - slots and __dict__ - - - basedealloc() is called; this is really list_dealloc(), or - some other type which also uses the trashcan macros - - - the trashcan limit is now reached, so the object is put on the - trashcan's to-be-deleted-later list - - - basedealloc() returns - - - subtype_dealloc() decrefs the object's type - - - subtype_dealloc() returns - - - later, the trashcan code starts deleting the objects from its - to-be-deleted-later list - - - subtype_dealloc() is called *AGAIN* for the same object - - - at the very least (if the destroyed slots and __dict__ don't - cause problems) the object's type gets decref'ed a second - time, which is *BAD*!!! - - The remedy is to make sure that if the code between trashcan - begin and end in subtype_dealloc() is called, the code between - trashcan begin and end in basedealloc() will also be called. - This is done by decrementing the level after passing into the - trashcan block, and incrementing it just before leaving the - block. - - But now it's possible that a chain of objects consisting solely - of objects whose deallocator is subtype_dealloc() will defeat - the trashcan mechanism completely: the decremented level means - that the effective level never reaches the limit. Therefore, we - *increment* the level *before* entering the trashcan block, and - matchingly decrement it after leaving. This means the trashcan - code will trigger a little early, but that's no big deal. - - Q. Are there any live examples of code in need of all this - complexity? - - A. Yes. See SF bug 668433 for code that crashed (when Python was - compiled in debug mode) before the trashcan level manipulations - were added. For more discussion, see SF patches 581742, 575073 - and bug 574207. */ } diff --git a/Python/hamt.c b/Python/hamt.c index 67af04c4377c..b3cbf9ac8208 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -1176,7 +1176,7 @@ hamt_node_bitmap_dealloc(PyHamtNode_Bitmap *self) Py_ssize_t i; PyObject_GC_UnTrack(self); - Py_TRASHCAN_SAFE_BEGIN(self) + Py_TRASHCAN_BEGIN(self, hamt_node_bitmap_dealloc) if (len > 0) { i = len; @@ -1186,7 +1186,7 @@ hamt_node_bitmap_dealloc(PyHamtNode_Bitmap *self) } Py_TYPE(self)->tp_free((PyObject *)self); - Py_TRASHCAN_SAFE_END(self) + Py_TRASHCAN_END } #ifdef Py_DEBUG @@ -1584,7 +1584,7 @@ hamt_node_collision_dealloc(PyHamtNode_Collision *self) Py_ssize_t len = Py_SIZE(self); PyObject_GC_UnTrack(self); - Py_TRASHCAN_SAFE_BEGIN(self) + Py_TRASHCAN_BEGIN(self, hamt_node_collision_dealloc) if (len > 0) { @@ -1594,7 +1594,7 @@ hamt_node_collision_dealloc(PyHamtNode_Collision *self) } Py_TYPE(self)->tp_free((PyObject *)self); - Py_TRASHCAN_SAFE_END(self) + Py_TRASHCAN_END } #ifdef Py_DEBUG @@ -1969,14 +1969,14 @@ hamt_node_array_dealloc(PyHamtNode_Array *self) Py_ssize_t i; PyObject_GC_UnTrack(self); - Py_TRASHCAN_SAFE_BEGIN(self) + Py_TRASHCAN_BEGIN(self, hamt_node_array_dealloc) for (i = 0; i < HAMT_ARRAY_NODE_SIZE; i++) { Py_XDECREF(self->a_array[i]); } Py_TYPE(self)->tp_free((PyObject *)self); - Py_TRASHCAN_SAFE_END(self) + Py_TRASHCAN_END } #ifdef Py_DEBUG diff --git a/Python/traceback.c b/Python/traceback.c index bd1061ed43b1..18bd0bf7341f 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -163,11 +163,11 @@ static void tb_dealloc(PyTracebackObject *tb) { PyObject_GC_UnTrack(tb); - Py_TRASHCAN_SAFE_BEGIN(tb) + Py_TRASHCAN_BEGIN(tb, tb_dealloc) Py_XDECREF(tb->tb_next); Py_XDECREF(tb->tb_frame); PyObject_GC_Del(tb); - Py_TRASHCAN_SAFE_END(tb) + Py_TRASHCAN_END } static int From webhook-mailer at python.org Fri May 10 13:29:58 2019 From: webhook-mailer at python.org (Eric Snow) Date: Fri, 10 May 2019 17:29:58 -0000 Subject: [Python-checkins] bpo-36737: Use the module state C-API for warnings. (gh-13159) Message-ID: https://github.com/python/cpython/commit/86ea58149c3e83f402cecd17e6a536865fb06ce1 commit: 86ea58149c3e83f402cecd17e6a536865fb06ce1 branch: master author: Eric Snow committer: GitHub date: 2019-05-10T13:29:55-04:00 summary: bpo-36737: Use the module state C-API for warnings. (gh-13159) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-07-12-18-11.bpo-36737.XAo6LY.rst M Include/internal/pycore_pylifecycle.h M Include/internal/pycore_pystate.h M Python/_warnings.c M Python/pylifecycle.c M Python/pystate.c diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index adb1f5d90a59..7144bbcda7cb 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -81,7 +81,7 @@ extern void PyLong_Fini(void); extern void _PyFaulthandler_Fini(void); extern void _PyHash_Fini(void); extern int _PyTraceMalloc_Fini(void); -extern void _PyWarnings_Fini(_PyRuntimeState *runtime); +extern void _PyWarnings_Fini(PyInterpreterState *interp); extern void _PyGILState_Init( _PyRuntimeState *runtime, diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 67bcd147e282..69ceecba40da 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -90,6 +90,8 @@ struct _is { PyObject *pyexitmodule; uint64_t tstate_next_unique_id; + + struct _warnings_runtime_state warnings; }; PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T); @@ -179,7 +181,6 @@ typedef struct pyruntimestate { int nexitfuncs; struct _gc_runtime_state gc; - struct _warnings_runtime_state warnings; struct _ceval_runtime_state ceval; struct _gilstate_runtime_state gilstate; diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-12-18-11.bpo-36737.XAo6LY.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-12-18-11.bpo-36737.XAo6LY.rst new file mode 100644 index 000000000000..7a2c647dbff3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-12-18-11.bpo-36737.XAo6LY.rst @@ -0,0 +1,2 @@ +Move PyRuntimeState.warnings into per-interpreter state (via "module +state"). diff --git a/Python/_warnings.c b/Python/_warnings.c index 388b29954081..0b192580e107 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -15,6 +15,134 @@ _Py_IDENTIFIER(default); _Py_IDENTIFIER(ignore); #endif + +/*************************************************************************/ + +typedef struct _warnings_runtime_state WarningsState; + +/* Forward declaration of the _warnings module definition. */ +static struct PyModuleDef warningsmodule; + +/* Given a module object, get its per-module state. */ +static WarningsState * +_Warnings_GetState() +{ + PyThreadState *tstate = PyThreadState_GET(); + if (tstate == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "_Warnings_GetState: could not identify current interpreter"); + return NULL; + } + return &tstate->interp->warnings; +} + +/* Clear the given warnings module state. */ +static void +_Warnings_ClearState(WarningsState *st) +{ + Py_CLEAR(st->filters); + Py_CLEAR(st->once_registry); + Py_CLEAR(st->default_action); +} + +#ifndef Py_DEBUG +static PyObject * +create_filter(PyObject *category, _Py_Identifier *id, const char *modname) +{ + PyObject *modname_obj = NULL; + PyObject *action_str = _PyUnicode_FromId(id); + if (action_str == NULL) { + return NULL; + } + + /* Default to "no module name" for initial filter set */ + if (modname != NULL) { + modname_obj = PyUnicode_InternFromString(modname); + if (modname_obj == NULL) { + return NULL; + } + } else { + modname_obj = Py_None; + } + + /* This assumes the line number is zero for now. */ + return PyTuple_Pack(5, action_str, Py_None, + category, modname_obj, _PyLong_Zero); +} +#endif + +static PyObject * +init_filters(void) +{ +#ifdef Py_DEBUG + /* Py_DEBUG builds show all warnings by default */ + return PyList_New(0); +#else + /* Other builds ignore a number of warning categories by default */ + PyObject *filters = PyList_New(5); + if (filters == NULL) { + return NULL; + } + + size_t pos = 0; /* Post-incremented in each use. */ + PyList_SET_ITEM(filters, pos++, + create_filter(PyExc_DeprecationWarning, &PyId_default, "__main__")); + PyList_SET_ITEM(filters, pos++, + create_filter(PyExc_DeprecationWarning, &PyId_ignore, NULL)); + PyList_SET_ITEM(filters, pos++, + create_filter(PyExc_PendingDeprecationWarning, &PyId_ignore, NULL)); + PyList_SET_ITEM(filters, pos++, + create_filter(PyExc_ImportWarning, &PyId_ignore, NULL)); + PyList_SET_ITEM(filters, pos++, + create_filter(PyExc_ResourceWarning, &PyId_ignore, NULL)); + + for (size_t x = 0; x < pos; x++) { + if (PyList_GET_ITEM(filters, x) == NULL) { + Py_DECREF(filters); + return NULL; + } + } + return filters; +#endif +} + +/* Initialize the given warnings module state. */ +static int +_Warnings_InitState(WarningsState *st) +{ + if (st->filters == NULL) { + st->filters = init_filters(); + if (st->filters == NULL) { + goto error; + } + } + + if (st->once_registry == NULL) { + st->once_registry = PyDict_New(); + if (st->once_registry == NULL) { + goto error; + } + } + + if (st->default_action == NULL) { + st->default_action = PyUnicode_FromString("default"); + if (st->default_action == NULL) { + goto error; + } + } + + st->filters_version = 0; + + return 0; + +error: + _Warnings_ClearState(st); + return -1; +} + + +/*************************************************************************/ + static int check_matched(PyObject *obj, PyObject *arg) { @@ -93,7 +221,7 @@ get_warnings_attr(_Py_Identifier *attr_id, int try_import) static PyObject * -get_once_registry(void) +get_once_registry(WarningsState *st) { PyObject *registry; _Py_IDENTIFIER(onceregistry); @@ -102,8 +230,8 @@ get_once_registry(void) if (registry == NULL) { if (PyErr_Occurred()) return NULL; - assert(_PyRuntime.warnings.once_registry); - return _PyRuntime.warnings.once_registry; + assert(st->once_registry); + return st->once_registry; } if (!PyDict_Check(registry)) { PyErr_Format(PyExc_TypeError, @@ -113,13 +241,13 @@ get_once_registry(void) Py_DECREF(registry); return NULL; } - Py_SETREF(_PyRuntime.warnings.once_registry, registry); + Py_SETREF(st->once_registry, registry); return registry; } static PyObject * -get_default_action(void) +get_default_action(WarningsState *st) { PyObject *default_action; _Py_IDENTIFIER(defaultaction); @@ -129,8 +257,8 @@ get_default_action(void) if (PyErr_Occurred()) { return NULL; } - assert(_PyRuntime.warnings.default_action); - return _PyRuntime.warnings.default_action; + assert(st->default_action); + return st->default_action; } if (!PyUnicode_Check(default_action)) { PyErr_Format(PyExc_TypeError, @@ -140,7 +268,7 @@ get_default_action(void) Py_DECREF(default_action); return NULL; } - Py_SETREF(_PyRuntime.warnings.default_action, default_action); + Py_SETREF(st->default_action, default_action); return default_action; } @@ -154,6 +282,10 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, Py_ssize_t i; PyObject *warnings_filters; _Py_IDENTIFIER(filters); + WarningsState *st = _Warnings_GetState(); + if (st == NULL) { + return NULL; + } warnings_filters = get_warnings_attr(&PyId_filters, 0); if (warnings_filters == NULL) { @@ -161,17 +293,17 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, return NULL; } else { - Py_SETREF(_PyRuntime.warnings.filters, warnings_filters); + Py_SETREF(st->filters, warnings_filters); } - PyObject *filters = _PyRuntime.warnings.filters; + PyObject *filters = st->filters; if (filters == NULL || !PyList_Check(filters)) { PyErr_SetString(PyExc_ValueError, MODULE_NAME ".filters must be a list"); return NULL; } - /* _PyRuntime.warnings.filters could change while we are iterating over it. */ + /* WarningsState.filters could change while we are iterating over it. */ for (i = 0; i < PyList_GET_SIZE(filters); i++) { PyObject *tmp_item, *action, *msg, *cat, *mod, *ln_obj; Py_ssize_t ln; @@ -232,7 +364,7 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, Py_DECREF(tmp_item); } - action = get_default_action(); + action = get_default_action(st); if (action != NULL) { Py_INCREF(Py_None); *item = Py_None; @@ -252,16 +384,20 @@ already_warned(PyObject *registry, PyObject *key, int should_set) if (key == NULL) return -1; + WarningsState *st = _Warnings_GetState(); + if (st == NULL) { + return -1; + } version_obj = _PyDict_GetItemIdWithError(registry, &PyId_version); if (version_obj == NULL || !PyLong_CheckExact(version_obj) - || PyLong_AsLong(version_obj) != _PyRuntime.warnings.filters_version) + || PyLong_AsLong(version_obj) != st->filters_version) { if (PyErr_Occurred()) { return -1; } PyDict_Clear(registry); - version_obj = PyLong_FromLong(_PyRuntime.warnings.filters_version); + version_obj = PyLong_FromLong(st->filters_version); if (version_obj == NULL) return -1; if (_PyDict_SetItemId(registry, &PyId_version, version_obj) < 0) { @@ -567,11 +703,15 @@ warn_explicit(PyObject *category, PyObject *message, if (_PyUnicode_EqualToASCIIString(action, "once")) { if (registry == NULL || registry == Py_None) { - registry = get_once_registry(); + WarningsState *st = _Warnings_GetState(); + if (st == NULL) { + goto cleanup; + } + registry = get_once_registry(st); if (registry == NULL) goto cleanup; } - /* _PyRuntime.warnings.once_registry[(text, category)] = 1 */ + /* WarningsState.once_registry[(text, category)] = 1 */ rc = update_registry(registry, text, category, 0); } else if (_PyUnicode_EqualToASCIIString(action, "module")) { @@ -925,7 +1065,11 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * warnings_filters_mutated(PyObject *self, PyObject *args) { - _PyRuntime.warnings.filters_version++; + WarningsState *st = _Warnings_GetState(); + if (st == NULL) { + return NULL; + } + st->filters_version++; Py_RETURN_NONE; } @@ -1175,78 +1319,16 @@ static PyMethodDef warnings_functions[] = { }; -#ifndef Py_DEBUG -static PyObject * -create_filter(PyObject *category, _Py_Identifier *id, const char *modname) -{ - PyObject *modname_obj = NULL; - PyObject *action_str = _PyUnicode_FromId(id); - if (action_str == NULL) { - return NULL; - } - - /* Default to "no module name" for initial filter set */ - if (modname != NULL) { - modname_obj = PyUnicode_InternFromString(modname); - if (modname_obj == NULL) { - return NULL; - } - } else { - modname_obj = Py_None; - } - - /* This assumes the line number is zero for now. */ - return PyTuple_Pack(5, action_str, Py_None, - category, modname_obj, _PyLong_Zero); -} -#endif - - -static PyObject * -init_filters(void) -{ -#ifdef Py_DEBUG - /* Py_DEBUG builds show all warnings by default */ - return PyList_New(0); -#else - /* Other builds ignore a number of warning categories by default */ - PyObject *filters = PyList_New(5); - if (filters == NULL) { - return NULL; - } - - size_t pos = 0; /* Post-incremented in each use. */ - PyList_SET_ITEM(filters, pos++, - create_filter(PyExc_DeprecationWarning, &PyId_default, "__main__")); - PyList_SET_ITEM(filters, pos++, - create_filter(PyExc_DeprecationWarning, &PyId_ignore, NULL)); - PyList_SET_ITEM(filters, pos++, - create_filter(PyExc_PendingDeprecationWarning, &PyId_ignore, NULL)); - PyList_SET_ITEM(filters, pos++, - create_filter(PyExc_ImportWarning, &PyId_ignore, NULL)); - PyList_SET_ITEM(filters, pos++, - create_filter(PyExc_ResourceWarning, &PyId_ignore, NULL)); - - for (size_t x = 0; x < pos; x++) { - if (PyList_GET_ITEM(filters, x) == NULL) { - Py_DECREF(filters); - return NULL; - } - } - return filters; -#endif -} - static struct PyModuleDef warningsmodule = { PyModuleDef_HEAD_INIT, - MODULE_NAME, - warnings__doc__, - 0, - warnings_functions, - NULL, - NULL, - NULL, - NULL + MODULE_NAME, /* m_name */ + warnings__doc__, /* m_doc */ + 0, /* m_size */ + warnings_functions, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ }; @@ -1256,49 +1338,46 @@ _PyWarnings_Init(void) PyObject *m; m = PyModule_Create(&warningsmodule); - if (m == NULL) + if (m == NULL) { return NULL; + } - struct _warnings_runtime_state *state = &_PyRuntime.warnings; - if (state->filters == NULL) { - state->filters = init_filters(); - if (state->filters == NULL) - return NULL; + WarningsState *st = _Warnings_GetState(); + if (st == NULL) { + goto error; + } + if (_Warnings_InitState(st) < 0) { + goto error; } - Py_INCREF(state->filters); - if (PyModule_AddObject(m, "filters", state->filters) < 0) - return NULL; - if (state->once_registry == NULL) { - state->once_registry = PyDict_New(); - if (state->once_registry == NULL) - return NULL; + Py_INCREF(st->filters); + if (PyModule_AddObject(m, "filters", st->filters) < 0) { + goto error; } - Py_INCREF(state->once_registry); - if (PyModule_AddObject(m, "_onceregistry", - state->once_registry) < 0) - return NULL; - if (state->default_action == NULL) { - state->default_action = PyUnicode_FromString("default"); - if (state->default_action == NULL) - return NULL; + Py_INCREF(st->once_registry); + if (PyModule_AddObject(m, "_onceregistry", st->once_registry) < 0) { + goto error; + } + + Py_INCREF(st->default_action); + if (PyModule_AddObject(m, "_defaultaction", st->default_action) < 0) { + goto error; } - Py_INCREF(state->default_action); - if (PyModule_AddObject(m, "_defaultaction", - state->default_action) < 0) - return NULL; - state->filters_version = 0; return m; -} +error: + if (st != NULL) { + _Warnings_ClearState(st); + } + Py_DECREF(m); + return NULL; +} +// We need this to ensure that warnings still work until late in finalization. void -_PyWarnings_Fini(_PyRuntimeState *runtime) +_PyWarnings_Fini(PyInterpreterState *interp) { - struct _warnings_runtime_state *state = &runtime->warnings; - Py_CLEAR(state->filters); - Py_CLEAR(state->once_registry); - Py_CLEAR(state->default_action); + _Warnings_ClearState(&interp->warnings); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index bd4d1d92662a..32902aa0d597 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1288,7 +1288,7 @@ Py_FinalizeEx(void) PyDict_Fini(); PySlice_Fini(); _PyGC_Fini(runtime); - _PyWarnings_Fini(runtime); + _PyWarnings_Fini(interp); _Py_HashRandomization_Fini(); _PyArg_Fini(); PyAsyncGen_Fini(); diff --git a/Python/pystate.c b/Python/pystate.c index e9c4c7d8376b..44acfed6b983 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -5,6 +5,7 @@ #include "pycore_coreconfig.h" #include "pycore_pymem.h" #include "pycore_pystate.h" +#include "pycore_pylifecycle.h" /* -------------------------------------------------------------------------- CAUTION @@ -257,6 +258,9 @@ _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) Py_CLEAR(interp->after_forkers_parent); Py_CLEAR(interp->after_forkers_child); #endif + if (runtime->finalizing == NULL) { + _PyWarnings_Fini(interp); + } // XXX Once we have one allocator per interpreter (i.e. // per-interpreter GC) we must ensure that all of the interpreter's // objects have been cleaned up at the point. From webhook-mailer at python.org Fri May 10 14:42:40 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Fri, 10 May 2019 18:42:40 -0000 Subject: [Python-checkins] bpo-36368: Ignore SIGINT in SharedMemoryManager servers. (GH-12483) Message-ID: https://github.com/python/cpython/commit/d0d64ad1f5f1dc1630004091d7f8209546c1220a commit: d0d64ad1f5f1dc1630004091d7f8209546c1220a branch: master author: Pierre Glaser committer: Antoine Pitrou date: 2019-05-10T20:42:35+02:00 summary: bpo-36368: Ignore SIGINT in SharedMemoryManager servers. (GH-12483) Fix a bug crashing SharedMemoryManager instances in interactive sessions after a Ctrl-C (KeyboardInterrupt) was sent. files: A Misc/NEWS.d/next/Library/2019-03-21-16-00-00.bpo-36368.zsRT1.rst M Lib/multiprocessing/managers.py M Lib/test/_test_multiprocessing.py diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 22abd47fb1f2..2bad636855fe 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -17,6 +17,7 @@ import sys import threading +import signal import array import queue import time @@ -596,6 +597,9 @@ def _run_server(cls, registry, address, authkey, serializer, writer, ''' Create a server, report its address and run it ''' + # bpo-36368: protect server process from KeyboardInterrupt signals + signal.signal(signal.SIGINT, signal.SIG_IGN) + if initializer is not None: initializer(*initargs) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 836fde88cd26..d97e4232f7ac 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3734,6 +3734,30 @@ def test_shared_memory_across_processes(self): sms.close() + @unittest.skipIf(os.name != "posix", "not feasible in non-posix platforms") + def test_shared_memory_SharedMemoryServer_ignores_sigint(self): + # bpo-36368: protect SharedMemoryManager server process from + # KeyboardInterrupt signals. + smm = multiprocessing.managers.SharedMemoryManager() + smm.start() + + # make sure the manager works properly at the beginning + sl = smm.ShareableList(range(10)) + + # the manager's server should ignore KeyboardInterrupt signals, and + # maintain its connection with the current process, and success when + # asked to deliver memory segments. + os.kill(smm._process.pid, signal.SIGINT) + + sl2 = smm.ShareableList(range(10)) + + # test that the custom signal handler registered in the Manager does + # not affect signal handling in the parent process. + with self.assertRaises(KeyboardInterrupt): + os.kill(os.getpid(), signal.SIGINT) + + smm.shutdown() + def test_shared_memory_SharedMemoryManager_basics(self): smm1 = multiprocessing.managers.SharedMemoryManager() with self.assertRaises(ValueError): diff --git a/Misc/NEWS.d/next/Library/2019-03-21-16-00-00.bpo-36368.zsRT1.rst b/Misc/NEWS.d/next/Library/2019-03-21-16-00-00.bpo-36368.zsRT1.rst new file mode 100644 index 000000000000..d8426827cedf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-21-16-00-00.bpo-36368.zsRT1.rst @@ -0,0 +1,2 @@ +Fix a bug crashing SharedMemoryManager instances in interactive sessions after +a ctrl-c (KeyboardInterrupt) was sent From webhook-mailer at python.org Fri May 10 16:16:26 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 10 May 2019 20:16:26 -0000 Subject: [Python-checkins] [3.7] bpo-34408: Prevent a null pointer dereference and resource leakage in `PyInterpreterState_New()` (GH-8767) (GH-13237) Message-ID: https://github.com/python/cpython/commit/34ed40f2e56703de04241cbacb306113b59a84f9 commit: 34ed40f2e56703de04241cbacb306113b59a84f9 branch: 3.7 author: Pablo Galindo committer: GitHub date: 2019-05-10T21:16:19+01:00 summary: [3.7] bpo-34408: Prevent a null pointer dereference and resource leakage in `PyInterpreterState_New()` (GH-8767) (GH-13237) * A pointer in `PyInterpreterState_New()` could have been `NULL` when being dereferenced. * Memory was leaked in `PyInterpreterState_New()` when taking some error-handling code path. (cherry picked from commit 95d630e) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2018-08-14-22-35-19.bpo-34408.aomWYW.rst M Python/pystate.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-08-14-22-35-19.bpo-34408.aomWYW.rst b/Misc/NEWS.d/next/Core and Builtins/2018-08-14-22-35-19.bpo-34408.aomWYW.rst new file mode 100644 index 000000000000..aacafd0d4c27 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-08-14-22-35-19.bpo-34408.aomWYW.rst @@ -0,0 +1 @@ +Prevent a null pointer dereference and resource leakage in ``PyInterpreterState_New()``. diff --git a/Python/pystate.c b/Python/pystate.c index 8077a3ee7ab0..fc695c62a330 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -167,23 +167,27 @@ PyInterpreterState_New(void) interp->pyexitmodule = NULL; HEAD_LOCK(); - interp->next = _PyRuntime.interpreters.head; - if (_PyRuntime.interpreters.main == NULL) { - _PyRuntime.interpreters.main = interp; - } - _PyRuntime.interpreters.head = interp; if (_PyRuntime.interpreters.next_id < 0) { /* overflow or Py_Initialize() not called! */ PyErr_SetString(PyExc_RuntimeError, "failed to get an interpreter ID"); - /* XXX deallocate! */ + PyMem_RawFree(interp); interp = NULL; } else { interp->id = _PyRuntime.interpreters.next_id; _PyRuntime.interpreters.next_id += 1; + interp->next = _PyRuntime.interpreters.head; + if (_PyRuntime.interpreters.main == NULL) { + _PyRuntime.interpreters.main = interp; + } + _PyRuntime.interpreters.head = interp; } HEAD_UNLOCK(); + if (interp == NULL) { + return NULL; + } + interp->tstate_next_unique_id = 0; return interp; From webhook-mailer at python.org Fri May 10 16:59:13 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Fri, 10 May 2019 20:59:13 -0000 Subject: [Python-checkins] bpo-36867: Make semaphore_tracker track other system resources (GH-13222) Message-ID: https://github.com/python/cpython/commit/f22cc69b012f52882d434a5c44a004bc3aa5c33c commit: f22cc69b012f52882d434a5c44a004bc3aa5c33c branch: master author: Pierre Glaser committer: Antoine Pitrou date: 2019-05-10T22:59:08+02:00 summary: bpo-36867: Make semaphore_tracker track other system resources (GH-13222) The multiprocessing.resource_tracker replaces the multiprocessing.semaphore_tracker module. Other than semaphores, resource_tracker also tracks shared_memory segments. Patch by Pierre Glaser. files: A Lib/multiprocessing/resource_tracker.py A Misc/NEWS.d/next/Library/2019-05-09-18-12-55.bpo-36867.FuwVTi.rst D Lib/multiprocessing/semaphore_tracker.py M Lib/multiprocessing/forkserver.py M Lib/multiprocessing/popen_spawn_posix.py M Lib/multiprocessing/shared_memory.py M Lib/multiprocessing/spawn.py M Lib/multiprocessing/synchronize.py M Lib/test/_test_multiprocessing.py M PCbuild/lib.pyproj diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index 040b46e66a03..dabf7bcbe6d7 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -11,7 +11,7 @@ from . import connection from . import process from .context import reduction -from . import semaphore_tracker +from . import resource_tracker from . import spawn from . import util @@ -69,7 +69,7 @@ def connect_to_new_process(self, fds): parent_r, child_w = os.pipe() child_r, parent_w = os.pipe() allfds = [child_r, child_w, self._forkserver_alive_fd, - semaphore_tracker.getfd()] + resource_tracker.getfd()] allfds += fds try: reduction.sendfds(client, allfds) @@ -90,7 +90,7 @@ def ensure_running(self): ensure_running() will do nothing. ''' with self._lock: - semaphore_tracker.ensure_running() + resource_tracker.ensure_running() if self._forkserver_pid is not None: # forkserver was launched before, is it still running? pid, status = os.waitpid(self._forkserver_pid, os.WNOHANG) @@ -290,7 +290,7 @@ def _serve_one(child_r, fds, unused_fds, handlers): os.close(fd) (_forkserver._forkserver_alive_fd, - semaphore_tracker._semaphore_tracker._fd, + resource_tracker._resource_tracker._fd, *_forkserver._inherited_fds) = fds # Run process object received over pipe diff --git a/Lib/multiprocessing/popen_spawn_posix.py b/Lib/multiprocessing/popen_spawn_posix.py index 38151060efa2..59f8e452cae1 100644 --- a/Lib/multiprocessing/popen_spawn_posix.py +++ b/Lib/multiprocessing/popen_spawn_posix.py @@ -36,8 +36,8 @@ def duplicate_for_child(self, fd): return fd def _launch(self, process_obj): - from . import semaphore_tracker - tracker_fd = semaphore_tracker.getfd() + from . import resource_tracker + tracker_fd = resource_tracker.getfd() self._fds.append(tracker_fd) prep_data = spawn.get_preparation_data(process_obj._name) fp = io.BytesIO() diff --git a/Lib/multiprocessing/semaphore_tracker.py b/Lib/multiprocessing/resource_tracker.py similarity index 53% rename from Lib/multiprocessing/semaphore_tracker.py rename to Lib/multiprocessing/resource_tracker.py index 3c2c3ad61aee..e67e0b213eb9 100644 --- a/Lib/multiprocessing/semaphore_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -1,15 +1,19 @@ +############################################################################### +# Server process to keep track of unlinked resources (like shared memory +# segments, semaphores etc.) and clean them. # # On Unix we run a server process which keeps track of unlinked -# semaphores. The server ignores SIGINT and SIGTERM and reads from a +# resources. The server ignores SIGINT and SIGTERM and reads from a # pipe. Every other process of the program has a copy of the writable # end of the pipe, so we get EOF when all other processes have exited. -# Then the server process unlinks any remaining semaphore names. -# -# This is important because the system only supports a limited number -# of named semaphores, and they will not be automatically removed till -# the next reboot. Without this semaphore tracker process, "killall -# python" would probably leave unlinked semaphores. +# Then the server process unlinks any remaining resource names. # +# This is important because there may be system limits for such resources: for +# instance, the system only supports a limited number of named semaphores, and +# shared-memory segments live in the RAM. If a python process leaks such a +# resource, this resource will not be removed till the next reboot. Without +# this resource tracker process, "killall python" would probably leave unlinked +# resources. import os import signal @@ -17,6 +21,7 @@ import threading import warnings import _multiprocessing +import _posixshmem from . import spawn from . import util @@ -26,8 +31,14 @@ _HAVE_SIGMASK = hasattr(signal, 'pthread_sigmask') _IGNORED_SIGNALS = (signal.SIGINT, signal.SIGTERM) +_CLEANUP_FUNCS = { + 'noop': lambda: None, + 'semaphore': _multiprocessing.sem_unlink, + 'shared_memory': _posixshmem.shm_unlink +} + -class SemaphoreTracker(object): +class ResourceTracker(object): def __init__(self): self._lock = threading.Lock() @@ -39,13 +50,13 @@ def getfd(self): return self._fd def ensure_running(self): - '''Make sure that semaphore tracker process is running. + '''Make sure that resource tracker process is running. This can be run from any process. Usually a child process will use - the semaphore created by its parent.''' + the resource created by its parent.''' with self._lock: if self._fd is not None: - # semaphore tracker was launched before, is it still running? + # resource tracker was launched before, is it still running? if self._check_alive(): # => still alive return @@ -55,24 +66,24 @@ def ensure_running(self): # Clean-up to avoid dangling processes. try: # _pid can be None if this process is a child from another - # python process, which has started the semaphore_tracker. + # python process, which has started the resource_tracker. if self._pid is not None: os.waitpid(self._pid, 0) except ChildProcessError: - # The semaphore_tracker has already been terminated. + # The resource_tracker has already been terminated. pass self._fd = None self._pid = None - warnings.warn('semaphore_tracker: process died unexpectedly, ' - 'relaunching. Some semaphores might leak.') + warnings.warn('resource_tracker: process died unexpectedly, ' + 'relaunching. Some resources might leak.') fds_to_pass = [] try: fds_to_pass.append(sys.stderr.fileno()) except Exception: pass - cmd = 'from multiprocessing.semaphore_tracker import main;main(%d)' + cmd = 'from multiprocessing.resource_tracker import main;main(%d)' r, w = os.pipe() try: fds_to_pass.append(r) @@ -107,23 +118,23 @@ def _check_alive(self): try: # We cannot use send here as it calls ensure_running, creating # a cycle. - os.write(self._fd, b'PROBE:0\n') + os.write(self._fd, b'PROBE:0:noop\n') except OSError: return False else: return True - def register(self, name): - '''Register name of semaphore with semaphore tracker.''' - self._send('REGISTER', name) + def register(self, name, rtype): + '''Register name of resource with resource tracker.''' + self._send('REGISTER', name, rtype) - def unregister(self, name): - '''Unregister name of semaphore with semaphore tracker.''' - self._send('UNREGISTER', name) + def unregister(self, name, rtype): + '''Unregister name of resource with resource tracker.''' + self._send('UNREGISTER', name, rtype) - def _send(self, cmd, name): + def _send(self, cmd, name, rtype): self.ensure_running() - msg = '{0}:{1}\n'.format(cmd, name).encode('ascii') + msg = '{0}:{1}:{2}\n'.format(cmd, name, rtype).encode('ascii') if len(name) > 512: # posix guarantees that writes to a pipe of less than PIPE_BUF # bytes are atomic, and that PIPE_BUF >= 512 @@ -133,14 +144,14 @@ def _send(self, cmd, name): nbytes, len(msg)) -_semaphore_tracker = SemaphoreTracker() -ensure_running = _semaphore_tracker.ensure_running -register = _semaphore_tracker.register -unregister = _semaphore_tracker.unregister -getfd = _semaphore_tracker.getfd +_resource_tracker = ResourceTracker() +ensure_running = _resource_tracker.ensure_running +register = _resource_tracker.register +unregister = _resource_tracker.unregister +getfd = _resource_tracker.getfd def main(fd): - '''Run semaphore tracker.''' + '''Run resource tracker.''' # protect the process from ^C and "killall python" etc signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGTERM, signal.SIG_IGN) @@ -153,18 +164,24 @@ def main(fd): except Exception: pass - cache = set() + cache = {rtype: set() for rtype in _CLEANUP_FUNCS.keys()} try: - # keep track of registered/unregistered semaphores + # keep track of registered/unregistered resources with open(fd, 'rb') as f: for line in f: try: - cmd, name = line.strip().split(b':') - if cmd == b'REGISTER': - cache.add(name) - elif cmd == b'UNREGISTER': - cache.remove(name) - elif cmd == b'PROBE': + cmd, name, rtype = line.strip().decode('ascii').split(':') + cleanup_func = _CLEANUP_FUNCS.get(rtype, None) + if cleanup_func is None: + raise ValueError( + f'Cannot register {name} for automatic cleanup: ' + f'unknown resource type {rtype}') + + if cmd == 'REGISTER': + cache[rtype].add(name) + elif cmd == 'UNREGISTER': + cache[rtype].remove(name) + elif cmd == 'PROBE': pass else: raise RuntimeError('unrecognized command %r' % cmd) @@ -174,23 +191,23 @@ def main(fd): except: pass finally: - # all processes have terminated; cleanup any remaining semaphores - if cache: - try: - warnings.warn('semaphore_tracker: There appear to be %d ' - 'leaked semaphores to clean up at shutdown' % - len(cache)) - except Exception: - pass - for name in cache: - # For some reason the process which created and registered this - # semaphore has failed to unregister it. Presumably it has died. - # We therefore unlink it. - try: - name = name.decode('ascii') + # all processes have terminated; cleanup any remaining resources + for rtype, rtype_cache in cache.items(): + if rtype_cache: try: - _multiprocessing.sem_unlink(name) - except Exception as e: - warnings.warn('semaphore_tracker: %r: %s' % (name, e)) - finally: - pass + warnings.warn('resource_tracker: There appear to be %d ' + 'leaked %s objects to clean up at shutdown' % + (len(rtype_cache), rtype)) + except Exception: + pass + for name in rtype_cache: + # For some reason the process which created and registered this + # resource has failed to unregister it. Presumably it has + # died. We therefore unlink it. + try: + try: + _CLEANUP_FUNCS[rtype](name) + except Exception as e: + warnings.warn('resource_tracker: %r: %s' % (name, e)) + finally: + pass diff --git a/Lib/multiprocessing/shared_memory.py b/Lib/multiprocessing/shared_memory.py index ebc88858762e..184e36704baa 100644 --- a/Lib/multiprocessing/shared_memory.py +++ b/Lib/multiprocessing/shared_memory.py @@ -113,6 +113,9 @@ def __init__(self, name=None, create=False, size=0): self.unlink() raise + from .resource_tracker import register + register(self._name, "shared_memory") + else: # Windows Named Shared Memory @@ -231,7 +234,9 @@ def unlink(self): called once (and only once) across all processes which have access to the shared memory block.""" if _USE_POSIX and self._name: + from .resource_tracker import unregister _posixshmem.shm_unlink(self._name) + unregister(self._name, "shared_memory") _encoding = "utf8" diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py index 6759351f13ab..f66b5aa9267b 100644 --- a/Lib/multiprocessing/spawn.py +++ b/Lib/multiprocessing/spawn.py @@ -111,8 +111,8 @@ def spawn_main(pipe_handle, parent_pid=None, tracker_fd=None): _winapi.CloseHandle(source_process) fd = msvcrt.open_osfhandle(new_handle, os.O_RDONLY) else: - from . import semaphore_tracker - semaphore_tracker._semaphore_tracker._fd = tracker_fd + from . import resource_tracker + resource_tracker._resource_tracker._fd = tracker_fd fd = pipe_handle exitcode = _main(fd) sys.exit(exitcode) diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py index 5137c49c1b6c..4fcbefc8bbef 100644 --- a/Lib/multiprocessing/synchronize.py +++ b/Lib/multiprocessing/synchronize.py @@ -76,16 +76,16 @@ def _after_fork(obj): # We only get here if we are on Unix with forking # disabled. When the object is garbage collected or the # process shuts down we unlink the semaphore name - from .semaphore_tracker import register - register(self._semlock.name) + from .resource_tracker import register + register(self._semlock.name, "semaphore") util.Finalize(self, SemLock._cleanup, (self._semlock.name,), exitpriority=0) @staticmethod def _cleanup(name): - from .semaphore_tracker import unregister + from .resource_tracker import unregister sem_unlink(name) - unregister(name) + unregister(name, "semaphore") def _make_methods(self): self.acquire = self._semlock.acquire diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index d97e4232f7ac..a50293c7616f 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -88,6 +88,13 @@ def join_process(process): support.join_thread(process, timeout=TIMEOUT) +if os.name == "posix": + from multiprocessing import resource_tracker + + def _resource_unlink(name, rtype): + resource_tracker._CLEANUP_FUNCS[rtype](name) + + # # Constants # @@ -3896,6 +3903,32 @@ def test_shared_memory_ShareableList_pickling(self): deserialized_sl.shm.close() sl.shm.close() + def test_shared_memory_cleaned_after_process_termination(self): + import subprocess + from multiprocessing import shared_memory + cmd = '''if 1: + import os, time, sys + from multiprocessing import shared_memory + + # Create a shared_memory segment, and send the segment name + sm = shared_memory.SharedMemory(create=True, size=10) + sys.stdout.write(sm._name + '\\n') + sys.stdout.flush() + time.sleep(100) + ''' + p = subprocess.Popen([sys.executable, '-E', '-c', cmd], + stdout=subprocess.PIPE) + name = p.stdout.readline().strip().decode() + + # killing abruptly processes holding reference to a shared memory + # segment should not leak the given memory segment. + p.terminate() + p.wait() + time.sleep(1.0) # wait for the OS to collect the segment + + with self.assertRaises(FileNotFoundError): + smm = shared_memory.SharedMemory(name, create=False) + # # # @@ -4827,57 +4860,86 @@ def test_preload_resources(self): @unittest.skipIf(sys.platform == "win32", "test semantics don't make sense on Windows") -class TestSemaphoreTracker(unittest.TestCase): +class TestResourceTracker(unittest.TestCase): - def test_semaphore_tracker(self): + def test_resource_tracker(self): # # Check that killing process does not leak named semaphores # import subprocess cmd = '''if 1: - import multiprocessing as mp, time, os + import time, os, tempfile + import multiprocessing as mp + from multiprocessing import resource_tracker + from multiprocessing.shared_memory import SharedMemory + mp.set_start_method("spawn") - lock1 = mp.Lock() - lock2 = mp.Lock() - os.write(%d, lock1._semlock.name.encode("ascii") + b"\\n") - os.write(%d, lock2._semlock.name.encode("ascii") + b"\\n") + rand = tempfile._RandomNameSequence() + + + def create_and_register_resource(rtype): + if rtype == "semaphore": + lock = mp.Lock() + return lock, lock._semlock.name + elif rtype == "shared_memory": + sm = SharedMemory(create=True, size=10) + return sm, sm._name + else: + raise ValueError( + "Resource type {{}} not understood".format(rtype)) + + + resource1, rname1 = create_and_register_resource("{rtype}") + resource2, rname2 = create_and_register_resource("{rtype}") + + os.write({w}, rname1.encode("ascii") + b"\\n") + os.write({w}, rname2.encode("ascii") + b"\\n") + time.sleep(10) ''' - r, w = os.pipe() - p = subprocess.Popen([sys.executable, - '-E', '-c', cmd % (w, w)], - pass_fds=[w], - stderr=subprocess.PIPE) - os.close(w) - with open(r, 'rb', closefd=True) as f: - name1 = f.readline().rstrip().decode('ascii') - name2 = f.readline().rstrip().decode('ascii') - _multiprocessing.sem_unlink(name1) - p.terminate() - p.wait() - time.sleep(2.0) - with self.assertRaises(OSError) as ctx: - _multiprocessing.sem_unlink(name2) - # docs say it should be ENOENT, but OSX seems to give EINVAL - self.assertIn(ctx.exception.errno, (errno.ENOENT, errno.EINVAL)) - err = p.stderr.read().decode('utf-8') - p.stderr.close() - expected = 'semaphore_tracker: There appear to be 2 leaked semaphores' - self.assertRegex(err, expected) - self.assertRegex(err, r'semaphore_tracker: %r: \[Errno' % name1) - - def check_semaphore_tracker_death(self, signum, should_die): + for rtype in resource_tracker._CLEANUP_FUNCS: + with self.subTest(rtype=rtype): + if rtype == "noop": + # Artefact resource type used by the resource_tracker + continue + r, w = os.pipe() + p = subprocess.Popen([sys.executable, + '-E', '-c', cmd.format(w=w, rtype=rtype)], + pass_fds=[w], + stderr=subprocess.PIPE) + os.close(w) + with open(r, 'rb', closefd=True) as f: + name1 = f.readline().rstrip().decode('ascii') + name2 = f.readline().rstrip().decode('ascii') + _resource_unlink(name1, rtype) + p.terminate() + p.wait() + time.sleep(2.0) + with self.assertRaises(OSError) as ctx: + _resource_unlink(name2, rtype) + # docs say it should be ENOENT, but OSX seems to give EINVAL + self.assertIn( + ctx.exception.errno, (errno.ENOENT, errno.EINVAL)) + err = p.stderr.read().decode('utf-8') + p.stderr.close() + expected = ('resource_tracker: There appear to be 2 leaked {} ' + 'objects'.format( + rtype)) + self.assertRegex(err, expected) + self.assertRegex(err, r'resource_tracker: %r: \[Errno' % name1) + + def check_resource_tracker_death(self, signum, should_die): # bpo-31310: if the semaphore tracker process has died, it should # be restarted implicitly. - from multiprocessing.semaphore_tracker import _semaphore_tracker - pid = _semaphore_tracker._pid + from multiprocessing.resource_tracker import _resource_tracker + pid = _resource_tracker._pid if pid is not None: os.kill(pid, signal.SIGKILL) os.waitpid(pid, 0) with warnings.catch_warnings(): warnings.simplefilter("ignore") - _semaphore_tracker.ensure_running() - pid = _semaphore_tracker._pid + _resource_tracker.ensure_running() + pid = _resource_tracker._pid os.kill(pid, signum) time.sleep(1.0) # give it time to die @@ -4898,50 +4960,50 @@ def check_semaphore_tracker_death(self, signum, should_die): self.assertEqual(len(all_warn), 1) the_warn = all_warn[0] self.assertTrue(issubclass(the_warn.category, UserWarning)) - self.assertTrue("semaphore_tracker: process died" + self.assertTrue("resource_tracker: process died" in str(the_warn.message)) else: self.assertEqual(len(all_warn), 0) - def test_semaphore_tracker_sigint(self): + def test_resource_tracker_sigint(self): # Catchable signal (ignored by semaphore tracker) - self.check_semaphore_tracker_death(signal.SIGINT, False) + self.check_resource_tracker_death(signal.SIGINT, False) - def test_semaphore_tracker_sigterm(self): + def test_resource_tracker_sigterm(self): # Catchable signal (ignored by semaphore tracker) - self.check_semaphore_tracker_death(signal.SIGTERM, False) + self.check_resource_tracker_death(signal.SIGTERM, False) - def test_semaphore_tracker_sigkill(self): + def test_resource_tracker_sigkill(self): # Uncatchable signal. - self.check_semaphore_tracker_death(signal.SIGKILL, True) + self.check_resource_tracker_death(signal.SIGKILL, True) @staticmethod - def _is_semaphore_tracker_reused(conn, pid): - from multiprocessing.semaphore_tracker import _semaphore_tracker - _semaphore_tracker.ensure_running() + def _is_resource_tracker_reused(conn, pid): + from multiprocessing.resource_tracker import _resource_tracker + _resource_tracker.ensure_running() # The pid should be None in the child process, expect for the fork # context. It should not be a new value. - reused = _semaphore_tracker._pid in (None, pid) - reused &= _semaphore_tracker._check_alive() + reused = _resource_tracker._pid in (None, pid) + reused &= _resource_tracker._check_alive() conn.send(reused) - def test_semaphore_tracker_reused(self): - from multiprocessing.semaphore_tracker import _semaphore_tracker - _semaphore_tracker.ensure_running() - pid = _semaphore_tracker._pid + def test_resource_tracker_reused(self): + from multiprocessing.resource_tracker import _resource_tracker + _resource_tracker.ensure_running() + pid = _resource_tracker._pid r, w = multiprocessing.Pipe(duplex=False) - p = multiprocessing.Process(target=self._is_semaphore_tracker_reused, + p = multiprocessing.Process(target=self._is_resource_tracker_reused, args=(w, pid)) p.start() - is_semaphore_tracker_reused = r.recv() + is_resource_tracker_reused = r.recv() # Clean up p.join() w.close() r.close() - self.assertTrue(is_semaphore_tracker_reused) + self.assertTrue(is_resource_tracker_reused) class TestSimpleQueue(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2019-05-09-18-12-55.bpo-36867.FuwVTi.rst b/Misc/NEWS.d/next/Library/2019-05-09-18-12-55.bpo-36867.FuwVTi.rst new file mode 100644 index 000000000000..5eaf0a032cc3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-09-18-12-55.bpo-36867.FuwVTi.rst @@ -0,0 +1 @@ +The multiprocessing.resource_tracker replaces the multiprocessing.semaphore_tracker module. Other than semaphores, resource_tracker also tracks shared_memory segments. \ No newline at end of file diff --git a/PCbuild/lib.pyproj b/PCbuild/lib.pyproj index ffb95c6efcdb..7ed71bd819cb 100644 --- a/PCbuild/lib.pyproj +++ b/PCbuild/lib.pyproj @@ -678,7 +678,7 @@ - + From webhook-mailer at python.org Fri May 10 17:39:13 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 10 May 2019 21:39:13 -0000 Subject: [Python-checkins] bpo-36710: Add 'ceval' local variable to ceval.c (GH-12934) Message-ID: https://github.com/python/cpython/commit/09532feeece39d5ba68a0d47115ce1967bfbd58e commit: 09532feeece39d5ba68a0d47115ce1967bfbd58e branch: master author: Victor Stinner committer: GitHub date: 2019-05-10T23:39:09+02:00 summary: bpo-36710: Add 'ceval' local variable to ceval.c (GH-12934) Add "struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;" local variables to function to better highlight the dependency on the global variable _PyRuntime and to point directly to _PyRuntime.ceval field rather than on the larger _PyRuntime. Changes: * Add _PyRuntimeState_GetThreadState(runtime) macro. * Add _PyEval_AddPendingCall(ceval, ...) and _PyThreadState_Swap(gilstate, ...) functions. * _PyThreadState_GET() macro now calls _PyRuntimeState_GetThreadState() using &_PyRuntime. * Add 'ceval' parameter to COMPUTE_EVAL_BREAKER(), SIGNAL_PENDING_SIGNALS(), _PyEval_SignalAsyncExc(), _PyEval_SignalReceived() and _PyEval_FiniThreads() macros and functions. * Add 'tstate' parameter to call_function(), do_call_core() and do_raise(). * Add 'runtime' parameter to _Py_CURRENTLY_FINALIZING(), _Py_FinishPendingCalls() and _PyThreadState_DeleteExcept() macros and functions. * Declare 'runtime', 'tstate', 'ceval' and 'eval_breaker' variables as constant. files: M Include/ceval.h M Include/internal/pycore_ceval.h M Include/internal/pycore_pystate.h M Modules/signalmodule.c M Python/ceval.c M Python/ceval_gil.h M Python/pylifecycle.c M Python/pystate.c diff --git a/Include/ceval.h b/Include/ceval.h index 11283c0a570b..2d4b67d092bc 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -58,7 +58,6 @@ PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); #endif PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); -PyAPI_FUNC(void) _PyEval_SignalReceived(void); PyAPI_FUNC(int) Py_MakePendingCalls(void); /* Protection against deeply nested recursive calls @@ -192,9 +191,6 @@ PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); PyAPI_FUNC(void) PyEval_InitThreads(void); -#ifndef Py_LIMITED_API -PyAPI_FUNC(void) _PyEval_FiniThreads(void); -#endif /* !Py_LIMITED_API */ PyAPI_FUNC(void) PyEval_AcquireLock(void) Py_DEPRECATED(3.2); PyAPI_FUNC(void) PyEval_ReleaseLock(void) /* Py_DEPRECATED(3.2) */; PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); @@ -221,7 +217,6 @@ PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); #ifndef Py_LIMITED_API PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); -PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void); #endif /* Masks and values used by FORMAT_VALUE opcode. */ diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 0bb19f1aa3b6..cdc73a36e5bc 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -9,50 +9,21 @@ extern "C" { #endif #include "pycore_atomic.h" +#include "pycore_pystate.h" #include "pythread.h" -PyAPI_FUNC(void) _Py_FinishPendingCalls(void); - -struct _pending_calls { - int finishing; - PyThread_type_lock lock; - /* Request for running pending calls. */ - _Py_atomic_int calls_to_do; - /* Request for looking at the `async_exc` field of the current - thread state. - Guarded by the GIL. */ - int async_exc; -#define NPENDINGCALLS 32 - struct { - int (*func)(void *); - void *arg; - } calls[NPENDINGCALLS]; - int first; - int last; -}; - -#include "pycore_gil.h" - -struct _ceval_runtime_state { - int recursion_limit; - /* Records whether tracing is on for any thread. Counts the number - of threads for which tstate->c_tracefunc is non-NULL, so if the - value is 0, we know we don't have to check this thread's - c_tracefunc. This speeds up the if statement in - PyEval_EvalFrameEx() after fast_next_opcode. */ - int tracing_possible; - /* This single variable consolidates all requests to break out of - the fast path in the eval loop. */ - _Py_atomic_int eval_breaker; - /* Request for dropping the GIL */ - _Py_atomic_int gil_drop_request; - struct _pending_calls pending; - /* Request for checking signals. */ - _Py_atomic_int signals_pending; - struct _gil_runtime_state gil; -}; - +PyAPI_FUNC(void) _Py_FinishPendingCalls(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *); +PyAPI_FUNC(void) _PyEval_FiniThreads( + struct _ceval_runtime_state *ceval); +PyAPI_FUNC(void) _PyEval_SignalReceived( + struct _ceval_runtime_state *ceval); +PyAPI_FUNC(int) _PyEval_AddPendingCall( + struct _ceval_runtime_state *ceval, + int (*func)(void *), + void *arg); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc( + struct _ceval_runtime_state *ceval); #ifdef __cplusplus } diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 69ceecba40da..1561328e6079 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -12,12 +12,51 @@ extern "C" { #include "pystate.h" #include "pythread.h" -#include "pycore_ceval.h" +#include "pycore_gil.h" /* _gil_runtime_state */ #include "pycore_pathconfig.h" #include "pycore_pymem.h" #include "pycore_warnings.h" +/* ceval state */ + +struct _pending_calls { + int finishing; + PyThread_type_lock lock; + /* Request for running pending calls. */ + _Py_atomic_int calls_to_do; + /* Request for looking at the `async_exc` field of the current + thread state. + Guarded by the GIL. */ + int async_exc; +#define NPENDINGCALLS 32 + struct { + int (*func)(void *); + void *arg; + } calls[NPENDINGCALLS]; + int first; + int last; +}; + +struct _ceval_runtime_state { + int recursion_limit; + /* Records whether tracing is on for any thread. Counts the number + of threads for which tstate->c_tracefunc is non-NULL, so if the + value is 0, we know we don't have to check this thread's + c_tracefunc. This speeds up the if statement in + PyEval_EvalFrameEx() after fast_next_opcode. */ + int tracing_possible; + /* This single variable consolidates all requests to break out of + the fast path in the eval loop. */ + _Py_atomic_int eval_breaker; + /* Request for dropping the GIL */ + _Py_atomic_int gil_drop_request; + struct _pending_calls pending; + /* Request for checking signals. */ + _Py_atomic_int signals_pending; + struct _gil_runtime_state gil; +}; + /* interpreter state */ typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int); @@ -203,13 +242,16 @@ PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void); PyAPI_FUNC(void) _PyRuntime_Finalize(void); -#define _Py_CURRENTLY_FINALIZING(tstate) \ - (_PyRuntime.finalizing == tstate) +#define _Py_CURRENTLY_FINALIZING(runtime, tstate) \ + (runtime->finalizing == tstate) /* Variable and macro for in-line access to current thread and interpreter state */ +#define _PyRuntimeState_GetThreadState(runtime) \ + ((PyThreadState*)_Py_atomic_load_relaxed(&(runtime)->gilstate.tstate_current)) + /* Get the current Python thread state. Efficient macro reading directly the 'gilstate.tstate_current' atomic @@ -219,8 +261,7 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void); The caller must hold the GIL. See also PyThreadState_Get() and PyThreadState_GET(). */ -#define _PyThreadState_GET() \ - ((PyThreadState*)_Py_atomic_load_relaxed(&_PyRuntime.gilstate.tstate_current)) +#define _PyThreadState_GET() _PyRuntimeState_GetThreadState(&_PyRuntime) /* Redefine PyThreadState_GET() as an alias to _PyThreadState_GET() */ #undef PyThreadState_GET @@ -242,7 +283,13 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void); PyAPI_FUNC(void) _PyThreadState_Init( _PyRuntimeState *runtime, PyThreadState *tstate); -PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate); +PyAPI_FUNC(void) _PyThreadState_DeleteExcept( + _PyRuntimeState *runtime, + PyThreadState *tstate); + +PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap( + struct _gilstate_runtime_state *gilstate, + PyThreadState *newts); PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime); diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 43a4da1a627e..b5e6250b1b40 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -5,6 +5,8 @@ #include "Python.h" #include "pycore_atomic.h" +#include "pycore_ceval.h" +#include "pycore_pystate.h" #ifndef MS_WINDOWS #include "posixmodule.h" @@ -256,7 +258,8 @@ trip_signal(int sig_num) _Py_atomic_store(&is_tripped, 1); /* Notify ceval.c */ - _PyEval_SignalReceived(); + _PyRuntimeState *runtime = &_PyRuntime; + _PyEval_SignalReceived(&runtime->ceval); /* And then write to the wakeup fd *after* setting all the globals and doing the _PyEval_SignalReceived. We used to write to the wakeup fd @@ -296,8 +299,9 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - Py_AddPendingCall(report_wakeup_send_error, - (void *)(intptr_t) last_error); + _PyEval_AddPendingCall(&runtime->ceval, + report_wakeup_send_error, + (void *)(intptr_t) last_error); } } } @@ -314,8 +318,9 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - Py_AddPendingCall(report_wakeup_write_error, - (void *)(intptr_t)errno); + _PyEval_AddPendingCall(&runtime->ceval, + report_wakeup_write_error, + (void *)(intptr_t)errno); } } } @@ -420,7 +425,7 @@ signal_raise_signal_impl(PyObject *module, int signalnum) err = raise(signalnum); _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS - + if (err) { return PyErr_SetFromErrno(PyExc_OSError); } @@ -1076,18 +1081,18 @@ fill_siginfo(siginfo_t *si) PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo))); PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code))); -#ifdef __VXWORKS__ +#ifdef __VXWORKS__ PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(0L)); PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(0L)); PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(0L)); PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong(0L)); -#else +#else PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno))); PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid)); PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid)); PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong((long)(si->si_status))); -#endif +#endif #ifdef HAVE_SIGINFO_T_SI_BAND PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band)); #else diff --git a/Python/ceval.c b/Python/ceval.c index 07db1d378b6c..17439533a3f2 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -10,6 +10,7 @@ #define PY_LOCAL_AGGRESSIVE #include "Python.h" +#include "pycore_ceval.h" #include "pycore_object.h" #include "pycore_pystate.h" #include "pycore_tupleobject.h" @@ -40,9 +41,12 @@ extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **); typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *); /* Forward declarations */ -Py_LOCAL_INLINE(PyObject *) call_function(PyObject ***, Py_ssize_t, - PyObject *); -static PyObject * do_call_core(PyObject *, PyObject *, PyObject *); +Py_LOCAL_INLINE(PyObject *) call_function( + PyThreadState *tstate, PyObject ***pp_stack, + Py_ssize_t oparg, PyObject *kwnames); +static PyObject * do_call_core( + PyThreadState *tstate, PyObject *func, + PyObject *callargs, PyObject *kwdict); #ifdef LLTRACE static int lltrace; @@ -76,7 +80,6 @@ static PyObject * special_lookup(PyObject *, _Py_Identifier *); static int check_args_iterable(PyObject *func, PyObject *vararg); static void format_kwargs_error(PyObject *func, PyObject *kwargs); static void format_awaitable_error(PyTypeObject *, int); -static inline void exit_thread_if_finalizing(PyThreadState *); #define NAME_ERROR_MSG \ "name '%.200s' is not defined" @@ -96,66 +99,66 @@ static long dxp[256]; #endif #endif -#define GIL_REQUEST _Py_atomic_load_relaxed(&_PyRuntime.ceval.gil_drop_request) +#define GIL_REQUEST _Py_atomic_load_relaxed(&ceval->gil_drop_request) /* This can set eval_breaker to 0 even though gil_drop_request became 1. We believe this is all right because the eval loop will release the GIL eventually anyway. */ -#define COMPUTE_EVAL_BREAKER() \ +#define COMPUTE_EVAL_BREAKER(ceval) \ _Py_atomic_store_relaxed( \ - &_PyRuntime.ceval.eval_breaker, \ + &(ceval)->eval_breaker, \ GIL_REQUEST | \ - _Py_atomic_load_relaxed(&_PyRuntime.ceval.signals_pending) | \ - _Py_atomic_load_relaxed(&_PyRuntime.ceval.pending.calls_to_do) | \ - _PyRuntime.ceval.pending.async_exc) + _Py_atomic_load_relaxed(&(ceval)->signals_pending) | \ + _Py_atomic_load_relaxed(&(ceval)->pending.calls_to_do) | \ + (ceval)->pending.async_exc) -#define SET_GIL_DROP_REQUEST() \ +#define SET_GIL_DROP_REQUEST(ceval) \ do { \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.gil_drop_request, 1); \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.eval_breaker, 1); \ + _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 1); \ + _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ } while (0) -#define RESET_GIL_DROP_REQUEST() \ +#define RESET_GIL_DROP_REQUEST(ceval) \ do { \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.gil_drop_request, 0); \ - COMPUTE_EVAL_BREAKER(); \ + _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 0); \ + COMPUTE_EVAL_BREAKER(ceval); \ } while (0) /* Pending calls are only modified under pending_lock */ -#define SIGNAL_PENDING_CALLS() \ +#define SIGNAL_PENDING_CALLS(ceval) \ do { \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.pending.calls_to_do, 1); \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.eval_breaker, 1); \ + _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \ + _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ } while (0) -#define UNSIGNAL_PENDING_CALLS() \ +#define UNSIGNAL_PENDING_CALLS(ceval) \ do { \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.pending.calls_to_do, 0); \ - COMPUTE_EVAL_BREAKER(); \ + _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 0); \ + COMPUTE_EVAL_BREAKER(ceval); \ } while (0) -#define SIGNAL_PENDING_SIGNALS() \ +#define SIGNAL_PENDING_SIGNALS(ceval) \ do { \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.signals_pending, 1); \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.eval_breaker, 1); \ + _Py_atomic_store_relaxed(&(ceval)->signals_pending, 1); \ + _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ } while (0) -#define UNSIGNAL_PENDING_SIGNALS() \ +#define UNSIGNAL_PENDING_SIGNALS(ceval) \ do { \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.signals_pending, 0); \ - COMPUTE_EVAL_BREAKER(); \ + _Py_atomic_store_relaxed(&(ceval)->signals_pending, 0); \ + COMPUTE_EVAL_BREAKER(ceval); \ } while (0) -#define SIGNAL_ASYNC_EXC() \ +#define SIGNAL_ASYNC_EXC(ceval) \ do { \ - _PyRuntime.ceval.pending.async_exc = 1; \ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.eval_breaker, 1); \ + (ceval)->pending.async_exc = 1; \ + _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ } while (0) -#define UNSIGNAL_ASYNC_EXC() \ +#define UNSIGNAL_ASYNC_EXC(ceval) \ do { \ - _PyRuntime.ceval.pending.async_exc = 0; \ - COMPUTE_EVAL_BREAKER(); \ + (ceval)->pending.async_exc = 0; \ + COMPUTE_EVAL_BREAKER(ceval); \ } while (0) @@ -168,48 +171,55 @@ static long dxp[256]; int PyEval_ThreadsInitialized(void) { - return gil_created(); + return gil_created(&_PyRuntime.ceval.gil); } void PyEval_InitThreads(void) { - if (gil_created()) { + _PyRuntimeState *runtime = &_PyRuntime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _gil_runtime_state *gil = &ceval->gil; + if (gil_created(gil)) { return; } PyThread_init_thread(); - create_gil(); - take_gil(_PyThreadState_GET()); + create_gil(gil); + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + take_gil(ceval, tstate); - _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); - if (_PyRuntime.ceval.pending.lock == NULL) { + struct _pending_calls *pending = &ceval->pending; + pending->lock = PyThread_allocate_lock(); + if (pending->lock == NULL) { Py_FatalError("Can't initialize threads for pending calls"); } } void -_PyEval_FiniThreads(void) +_PyEval_FiniThreads(struct _ceval_runtime_state *ceval) { - if (!gil_created()) { + struct _gil_runtime_state *gil = &ceval->gil; + if (!gil_created(gil)) { return; } - destroy_gil(); - assert(!gil_created()); + destroy_gil(gil); + assert(!gil_created(gil)); - if (_PyRuntime.ceval.pending.lock != NULL) { - PyThread_free_lock(_PyRuntime.ceval.pending.lock); - _PyRuntime.ceval.pending.lock = NULL; + struct _pending_calls *pending = &ceval->pending; + if (pending->lock != NULL) { + PyThread_free_lock(pending->lock); + pending->lock = NULL; } } static inline void -exit_thread_if_finalizing(PyThreadState *tstate) +exit_thread_if_finalizing(_PyRuntimeState *runtime, PyThreadState *tstate) { /* _Py_Finalizing is protected by the GIL */ - if (_Py_IsFinalizing() && !_Py_CURRENTLY_FINALIZING(tstate)) { - drop_gil(tstate); + if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) { + drop_gil(&runtime->ceval, tstate); PyThread_exit_thread(); } } @@ -217,45 +227,60 @@ exit_thread_if_finalizing(PyThreadState *tstate) void PyEval_AcquireLock(void) { - PyThreadState *tstate = _PyThreadState_GET(); - if (tstate == NULL) + _PyRuntimeState *runtime = &_PyRuntime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + if (tstate == NULL) { Py_FatalError("PyEval_AcquireLock: current thread state is NULL"); - take_gil(tstate); - exit_thread_if_finalizing(tstate); + } + take_gil(ceval, tstate); + exit_thread_if_finalizing(runtime, tstate); } void PyEval_ReleaseLock(void) { + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); /* This function must succeed when the current thread state is NULL. We therefore avoid PyThreadState_Get() which dumps a fatal error in debug mode. */ - drop_gil(_PyThreadState_GET()); + drop_gil(&runtime->ceval, tstate); } void PyEval_AcquireThread(PyThreadState *tstate) { - if (tstate == NULL) + if (tstate == NULL) { Py_FatalError("PyEval_AcquireThread: NULL new thread state"); + } + + _PyRuntimeState *runtime = &_PyRuntime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + /* Check someone has called PyEval_InitThreads() to create the lock */ - assert(gil_created()); - take_gil(tstate); - exit_thread_if_finalizing(tstate); - if (PyThreadState_Swap(tstate) != NULL) - Py_FatalError( - "PyEval_AcquireThread: non-NULL old thread state"); + assert(gil_created(&ceval->gil)); + take_gil(ceval, tstate); + exit_thread_if_finalizing(runtime, tstate); + if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { + Py_FatalError("PyEval_AcquireThread: non-NULL old thread state"); + } } void PyEval_ReleaseThread(PyThreadState *tstate) { - if (tstate == NULL) + if (tstate == NULL) { Py_FatalError("PyEval_ReleaseThread: NULL thread state"); - if (PyThreadState_Swap(NULL) != tstate) + } + + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); + if (new_tstate != tstate) { Py_FatalError("PyEval_ReleaseThread: wrong thread state"); - drop_gil(tstate); + } + drop_gil(&runtime->ceval, tstate); } /* This function is called from PyOS_AfterFork_Child to destroy all threads @@ -266,55 +291,65 @@ PyEval_ReleaseThread(PyThreadState *tstate) void PyEval_ReInitThreads(void) { - PyThreadState *current_tstate = _PyThreadState_GET(); - - if (!gil_created()) + _PyRuntimeState *runtime = &_PyRuntime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + if (!gil_created(&ceval->gil)) { return; - recreate_gil(); - take_gil(current_tstate); + } + recreate_gil(&ceval->gil); + PyThreadState *current_tstate = _PyRuntimeState_GetThreadState(runtime); + take_gil(ceval, current_tstate); - _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); - if (_PyRuntime.ceval.pending.lock == NULL) { + struct _pending_calls *pending = &ceval->pending; + pending->lock = PyThread_allocate_lock(); + if (pending->lock == NULL) { Py_FatalError("Can't initialize threads for pending calls"); } /* Destroy all threads except the current one */ - _PyThreadState_DeleteExcept(current_tstate); + _PyThreadState_DeleteExcept(runtime, current_tstate); } /* This function is used to signal that async exceptions are waiting to be raised. */ void -_PyEval_SignalAsyncExc(void) +_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval) { - SIGNAL_ASYNC_EXC(); + SIGNAL_ASYNC_EXC(ceval); } PyThreadState * PyEval_SaveThread(void) { - PyThreadState *tstate = PyThreadState_Swap(NULL); - if (tstate == NULL) + _PyRuntimeState *runtime = &_PyRuntime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); + if (tstate == NULL) { Py_FatalError("PyEval_SaveThread: NULL tstate"); - assert(gil_created()); - drop_gil(tstate); + } + assert(gil_created(&ceval->gil)); + drop_gil(ceval, tstate); return tstate; } void PyEval_RestoreThread(PyThreadState *tstate) { - if (tstate == NULL) + _PyRuntimeState *runtime = &_PyRuntime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + + if (tstate == NULL) { Py_FatalError("PyEval_RestoreThread: NULL tstate"); - assert(gil_created()); + } + assert(gil_created(&ceval->gil)); int err = errno; - take_gil(tstate); - exit_thread_if_finalizing(tstate); + take_gil(ceval, tstate); + exit_thread_if_finalizing(runtime, tstate); errno = err; - PyThreadState_Swap(tstate); + _PyThreadState_Swap(&runtime->gilstate, tstate); } @@ -341,12 +376,12 @@ PyEval_RestoreThread(PyThreadState *tstate) */ void -_PyEval_SignalReceived(void) +_PyEval_SignalReceived(struct _ceval_runtime_state *ceval) { /* bpo-30703: Function called when the C signal handler of Python gets a signal. We cannot queue a callback using Py_AddPendingCall() since that function is not async-signal-safe. */ - SIGNAL_PENDING_SIGNALS(); + SIGNAL_PENDING_SIGNALS(ceval); } /* Push one item onto the queue while holding the lock. */ @@ -386,9 +421,10 @@ _pop_pending_call(struct _pending_calls *pending, */ int -Py_AddPendingCall(int (*func)(void *), void *arg) +_PyEval_AddPendingCall(struct _ceval_runtime_state *ceval, + int (*func)(void *), void *arg) { - struct _pending_calls *pending = &_PyRuntime.ceval.pending; + struct _pending_calls *pending = &ceval->pending; PyThread_acquire_lock(pending->lock, WAIT_LOCK); if (pending->finishing) { @@ -407,42 +443,50 @@ Py_AddPendingCall(int (*func)(void *), void *arg) PyThread_release_lock(pending->lock); /* signal main loop */ - SIGNAL_PENDING_CALLS(); + SIGNAL_PENDING_CALLS(ceval); return result; } +int +Py_AddPendingCall(int (*func)(void *), void *arg) +{ + return _PyEval_AddPendingCall(&_PyRuntime.ceval, func, arg); +} + static int -handle_signals(void) +handle_signals(_PyRuntimeState *runtime) { /* Only handle signals on main thread. PyEval_InitThreads must * have been called already. */ - if (PyThread_get_thread_ident() != _PyRuntime.main_thread) { + if (PyThread_get_thread_ident() != runtime->main_thread) { return 0; } /* * Ensure that the thread isn't currently running some other * interpreter. */ - if (_PyInterpreterState_GET_UNSAFE() != _PyRuntime.interpreters.main) { + PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; + if (interp != runtime->interpreters.main) { return 0; } - UNSIGNAL_PENDING_SIGNALS(); + struct _ceval_runtime_state *ceval = &runtime->ceval; + UNSIGNAL_PENDING_SIGNALS(ceval); if (_PyErr_CheckSignals() < 0) { - SIGNAL_PENDING_SIGNALS(); /* We're not done yet */ + SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */ return -1; } return 0; } static int -make_pending_calls(struct _pending_calls* pending) +make_pending_calls(_PyRuntimeState *runtime) { static int busy = 0; /* only service pending calls on main thread */ - if (PyThread_get_thread_ident() != _PyRuntime.main_thread) { + if (PyThread_get_thread_ident() != runtime->main_thread) { return 0; } @@ -451,12 +495,14 @@ make_pending_calls(struct _pending_calls* pending) return 0; } busy = 1; + struct _ceval_runtime_state *ceval = &runtime->ceval; /* unsignal before starting to call callbacks, so that any callback added in-between re-signals */ - UNSIGNAL_PENDING_CALLS(); + UNSIGNAL_PENDING_CALLS(ceval); int res = 0; /* perform a bounded number of calls, in case of recursion */ + struct _pending_calls *pending = &ceval->pending; for (int i=0; iceval.pending; + PyThread_acquire_lock(pending->lock, WAIT_LOCK); pending->finishing = 1; PyThread_release_lock(pending->lock); @@ -500,7 +546,7 @@ _Py_FinishPendingCalls(void) return; } - if (make_pending_calls(pending) < 0) { + if (make_pending_calls(runtime) < 0) { PyObject *exc, *val, *tb; PyErr_Fetch(&exc, &val, &tb); PyErr_BadInternalCall(); @@ -518,12 +564,13 @@ Py_MakePendingCalls(void) /* Python signal handler doesn't really queue a callback: it only signals that a signal was received, see _PyEval_SignalReceived(). */ - int res = handle_signals(); + _PyRuntimeState *runtime = &_PyRuntime; + int res = handle_signals(runtime); if (res != 0) { return res; } - res = make_pending_calls(&_PyRuntime.ceval.pending); + res = make_pending_calls(runtime); if (res != 0) { return res; } @@ -556,8 +603,9 @@ Py_GetRecursionLimit(void) void Py_SetRecursionLimit(int new_limit) { - _PyRuntime.ceval.recursion_limit = new_limit; - _Py_CheckRecursionLimit = _PyRuntime.ceval.recursion_limit; + struct _ceval_runtime_state *ceval = &_PyRuntime.ceval; + ceval->recursion_limit = new_limit; + _Py_CheckRecursionLimit = ceval->recursion_limit; } /* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() @@ -568,8 +616,9 @@ Py_SetRecursionLimit(int new_limit) int _Py_CheckRecursiveCall(const char *where) { - PyThreadState *tstate = _PyThreadState_GET(); - int recursion_limit = _PyRuntime.ceval.recursion_limit; + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + int recursion_limit = runtime->ceval.recursion_limit; #ifdef USE_STACKCHECK tstate->stackcheck_counter = 0; @@ -602,10 +651,10 @@ _Py_CheckRecursiveCall(const char *where) return 0; } -static int do_raise(PyObject *, PyObject *); +static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause); static int unpack_iterable(PyObject *, int, int, PyObject **); -#define _Py_TracingPossible _PyRuntime.ceval.tracing_possible +#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible) PyObject * @@ -649,8 +698,10 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) int oparg; /* Current opcode argument, if any */ PyObject **fastlocals, **freevars; PyObject *retval = NULL; /* Return value */ - PyThreadState *tstate = _PyThreadState_GET(); - _Py_atomic_int *eval_breaker = &_PyRuntime.ceval.eval_breaker; + _PyRuntimeState * const runtime = &_PyRuntime; + PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime); + struct _ceval_runtime_state * const ceval = &runtime->ceval; + _Py_atomic_int * const eval_breaker = &ceval->eval_breaker; PyCodeObject *co; /* when tracing we set things up so that @@ -734,18 +785,10 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) op: \ TARGET_##op -#define DISPATCH() \ - { \ - if (!_Py_atomic_load_relaxed(eval_breaker)) { \ - FAST_DISPATCH(); \ - } \ - continue; \ - } - #ifdef LLTRACE #define FAST_DISPATCH() \ { \ - if (!lltrace && !_Py_TracingPossible && !PyDTrace_LINE_ENABLED()) { \ + if (!lltrace && !_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -755,7 +798,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #else #define FAST_DISPATCH() \ { \ - if (!_Py_TracingPossible && !PyDTrace_LINE_ENABLED()) { \ + if (!_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -764,11 +807,18 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } #endif +#define DISPATCH() \ + { \ + if (!_Py_atomic_load_relaxed(eval_breaker)) { \ + FAST_DISPATCH(); \ + } \ + continue; \ + } + #else #define TARGET(op) op - -#define DISPATCH() continue #define FAST_DISPATCH() goto fast_next_opcode +#define DISPATCH() continue #endif @@ -1063,44 +1113,40 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) goto fast_next_opcode; } - if (_Py_atomic_load_relaxed( - &_PyRuntime.ceval.signals_pending)) - { - if (handle_signals() != 0) { + if (_Py_atomic_load_relaxed(&ceval->signals_pending)) { + if (handle_signals(runtime) != 0) { goto error; } } - if (_Py_atomic_load_relaxed( - &_PyRuntime.ceval.pending.calls_to_do)) - { - if (make_pending_calls(&_PyRuntime.ceval.pending) != 0) { + if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) { + if (make_pending_calls(runtime) != 0) { goto error; } } - if (_Py_atomic_load_relaxed( - &_PyRuntime.ceval.gil_drop_request)) - { + if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { /* Give another thread a chance */ - if (PyThreadState_Swap(NULL) != tstate) + if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) { Py_FatalError("ceval: tstate mix-up"); - drop_gil(tstate); + } + drop_gil(ceval, tstate); /* Other threads may run now */ - take_gil(tstate); + take_gil(ceval, tstate); /* Check if we should make a quick exit. */ - exit_thread_if_finalizing(tstate); + exit_thread_if_finalizing(runtime, tstate); - if (PyThreadState_Swap(tstate) != NULL) + if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("ceval: orphan tstate"); + } } /* Check for asynchronous exceptions. */ if (tstate->async_exc != NULL) { PyObject *exc = tstate->async_exc; tstate->async_exc = NULL; - UNSIGNAL_ASYNC_EXC(); + UNSIGNAL_ASYNC_EXC(ceval); PyErr_SetNone(exc); Py_DECREF(exc); goto error; @@ -1115,7 +1161,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* line-by-line tracing support */ - if (_Py_TracingPossible && + if (_Py_TracingPossible(ceval) && tstate->c_tracefunc != NULL && !tstate->tracing) { int err; /* see maybe_call_line_trace @@ -1740,7 +1786,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) exc = POP(); /* exc */ /* fall through */ case 0: - if (do_raise(exc, cause)) { + if (do_raise(tstate, exc, cause)) { goto exception_unwind; } break; @@ -3268,7 +3314,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) `callable` will be POPed by call_function. NULL will will be POPed manually later. */ - res = call_function(&sp, oparg, NULL); + res = call_function(tstate, &sp, oparg, NULL); stack_pointer = sp; (void)POP(); /* POP the NULL. */ } @@ -3285,7 +3331,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) We'll be passing `oparg + 1` to call_function, to make it accept the `self` as a first argument. */ - res = call_function(&sp, oparg + 1, NULL); + res = call_function(tstate, &sp, oparg + 1, NULL); stack_pointer = sp; } @@ -3299,7 +3345,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PREDICTED(CALL_FUNCTION); PyObject **sp, *res; sp = stack_pointer; - res = call_function(&sp, oparg, NULL); + res = call_function(tstate, &sp, oparg, NULL); stack_pointer = sp; PUSH(res); if (res == NULL) { @@ -3314,7 +3360,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) names = POP(); assert(PyTuple_CheckExact(names) && PyTuple_GET_SIZE(names) <= oparg); sp = stack_pointer; - res = call_function(&sp, oparg, names); + res = call_function(tstate, &sp, oparg, names); stack_pointer = sp; PUSH(res); Py_DECREF(names); @@ -3358,7 +3404,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } assert(PyTuple_CheckExact(callargs)); - result = do_call_core(func, callargs, kwargs); + result = do_call_core(tstate, func, callargs, kwargs); Py_DECREF(func); Py_DECREF(callargs); Py_XDECREF(kwargs); @@ -3855,7 +3901,6 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, PyFrameObject *f; PyObject *retval = NULL; PyObject **fastlocals, **freevars; - PyThreadState *tstate; PyObject *x, *u; const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount + co->co_posonlyargcount; Py_ssize_t i, j, n; @@ -3868,7 +3913,7 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, } /* Create the frame */ - tstate = _PyThreadState_GET(); + PyThreadState *tstate = _PyThreadState_GET(); assert(tstate != NULL); f = _PyFrame_New_NoTrack(tstate, co, globals, locals); if (f == NULL) { @@ -4180,13 +4225,12 @@ special_lookup(PyObject *o, _Py_Identifier *id) /* Logic for the raise statement (too complicated for inlining). This *consumes* a reference count to each of its arguments. */ static int -do_raise(PyObject *exc, PyObject *cause) +do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) { PyObject *type = NULL, *value = NULL; if (exc == NULL) { /* Reraise */ - PyThreadState *tstate = _PyThreadState_GET(); _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate); PyObject *tb; type = exc_info->exc_type; @@ -4529,9 +4573,10 @@ PyEval_SetProfile(Py_tracefunc func, PyObject *arg) void PyEval_SetTrace(Py_tracefunc func, PyObject *arg) { - PyThreadState *tstate = _PyThreadState_GET(); + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); PyObject *temp = tstate->c_traceobj; - _Py_TracingPossible += (func != NULL) - (tstate->c_tracefunc != NULL); + runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL); Py_XINCREF(arg); tstate->c_tracefunc = NULL; tstate->c_traceobj = NULL; @@ -4564,7 +4609,6 @@ void _PyEval_SetCoroutineWrapper(PyObject *wrapper) { PyThreadState *tstate = _PyThreadState_GET(); - Py_XINCREF(wrapper); Py_XSETREF(tstate->coroutine_wrapper, wrapper); } @@ -4580,7 +4624,6 @@ void _PyEval_SetAsyncGenFirstiter(PyObject *firstiter) { PyThreadState *tstate = _PyThreadState_GET(); - Py_XINCREF(firstiter); Py_XSETREF(tstate->async_gen_firstiter, firstiter); } @@ -4596,7 +4639,6 @@ void _PyEval_SetAsyncGenFinalizer(PyObject *finalizer) { PyThreadState *tstate = _PyThreadState_GET(); - Py_XINCREF(finalizer); Py_XSETREF(tstate->async_gen_finalizer, finalizer); } @@ -4662,8 +4704,9 @@ PyEval_GetGlobals(void) PyFrameObject * PyEval_GetFrame(void) { - PyThreadState *tstate = _PyThreadState_GET(); - return _PyThreadState_GetFrame(tstate); + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + return runtime->gilstate.getframe(tstate); } int @@ -4750,7 +4793,7 @@ if (tstate->use_tracing && tstate->c_profilefunc) { \ /* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault() to reduce the stack consumption. */ Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION -call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames) +call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames) { PyObject **pfunc = (*pp_stack) - oparg - 1; PyObject *func = *pfunc; @@ -4763,11 +4806,9 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames) presumed to be the most frequent callable object. */ if (PyCFunction_Check(func)) { - PyThreadState *tstate = _PyThreadState_GET(); C_TRACE(x, _PyCFunction_FastCallKeywords(func, stack, nargs, kwnames)); } else if (Py_TYPE(func) == &PyMethodDescr_Type) { - PyThreadState *tstate = _PyThreadState_GET(); if (nargs > 0 && tstate->use_tracing) { /* We need to create a temporary bound method as argument for profiling. @@ -4832,17 +4873,15 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames) } static PyObject * -do_call_core(PyObject *func, PyObject *callargs, PyObject *kwdict) +do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict) { PyObject *result; if (PyCFunction_Check(func)) { - PyThreadState *tstate = _PyThreadState_GET(); C_TRACE(result, PyCFunction_Call(func, callargs, kwdict)); return result; } else if (Py_TYPE(func) == &PyMethodDescr_Type) { - PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyTuple_GET_SIZE(callargs); if (nargs > 0 && tstate->use_tracing) { /* We need to create a temporary bound method as argument diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index f2d5fdba0153..34d48c990c44 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -7,10 +7,6 @@ #include "pycore_atomic.h" -/* First some general settings */ - -#define INTERVAL (_PyRuntime.ceval.gil.interval >= 1 ? _PyRuntime.ceval.gil.interval : 1) - /* Notes about the implementation: @@ -94,158 +90,156 @@ #define DEFAULT_INTERVAL 5000 -static void _gil_initialize(struct _gil_runtime_state *state) +static void _gil_initialize(struct _gil_runtime_state *gil) { _Py_atomic_int uninitialized = {-1}; - state->locked = uninitialized; - state->interval = DEFAULT_INTERVAL; + gil->locked = uninitialized; + gil->interval = DEFAULT_INTERVAL; } -static int gil_created(void) +static int gil_created(struct _gil_runtime_state *gil) { - return (_Py_atomic_load_explicit(&_PyRuntime.ceval.gil.locked, - _Py_memory_order_acquire) - ) >= 0; + return (_Py_atomic_load_explicit(&gil->locked, _Py_memory_order_acquire) >= 0); } -static void create_gil(void) +static void create_gil(struct _gil_runtime_state *gil) { - MUTEX_INIT(_PyRuntime.ceval.gil.mutex); + MUTEX_INIT(gil->mutex); #ifdef FORCE_SWITCHING - MUTEX_INIT(_PyRuntime.ceval.gil.switch_mutex); + MUTEX_INIT(gil->switch_mutex); #endif - COND_INIT(_PyRuntime.ceval.gil.cond); + COND_INIT(gil->cond); #ifdef FORCE_SWITCHING - COND_INIT(_PyRuntime.ceval.gil.switch_cond); + COND_INIT(gil->switch_cond); #endif - _Py_atomic_store_relaxed(&_PyRuntime.ceval.gil.last_holder, 0); - _Py_ANNOTATE_RWLOCK_CREATE(&_PyRuntime.ceval.gil.locked); - _Py_atomic_store_explicit(&_PyRuntime.ceval.gil.locked, 0, - _Py_memory_order_release); + _Py_atomic_store_relaxed(&gil->last_holder, 0); + _Py_ANNOTATE_RWLOCK_CREATE(&gil->locked); + _Py_atomic_store_explicit(&gil->locked, 0, _Py_memory_order_release); } -static void destroy_gil(void) +static void destroy_gil(struct _gil_runtime_state *gil) { /* some pthread-like implementations tie the mutex to the cond * and must have the cond destroyed first. */ - COND_FINI(_PyRuntime.ceval.gil.cond); - MUTEX_FINI(_PyRuntime.ceval.gil.mutex); + COND_FINI(gil->cond); + MUTEX_FINI(gil->mutex); #ifdef FORCE_SWITCHING - COND_FINI(_PyRuntime.ceval.gil.switch_cond); - MUTEX_FINI(_PyRuntime.ceval.gil.switch_mutex); + COND_FINI(gil->switch_cond); + MUTEX_FINI(gil->switch_mutex); #endif - _Py_atomic_store_explicit(&_PyRuntime.ceval.gil.locked, -1, + _Py_atomic_store_explicit(&gil->locked, -1, _Py_memory_order_release); - _Py_ANNOTATE_RWLOCK_DESTROY(&_PyRuntime.ceval.gil.locked); + _Py_ANNOTATE_RWLOCK_DESTROY(&gil->locked); } -static void recreate_gil(void) +static void recreate_gil(struct _gil_runtime_state *gil) { - _Py_ANNOTATE_RWLOCK_DESTROY(&_PyRuntime.ceval.gil.locked); + _Py_ANNOTATE_RWLOCK_DESTROY(&gil->locked); /* XXX should we destroy the old OS resources here? */ - create_gil(); + create_gil(gil); } -static void drop_gil(PyThreadState *tstate) +static void +drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) { - if (!_Py_atomic_load_relaxed(&_PyRuntime.ceval.gil.locked)) + struct _gil_runtime_state *gil = &ceval->gil; + if (!_Py_atomic_load_relaxed(&gil->locked)) { Py_FatalError("drop_gil: GIL is not locked"); + } + /* tstate is allowed to be NULL (early interpreter init) */ if (tstate != NULL) { /* Sub-interpreter support: threads might have been switched under our feet using PyThreadState_Swap(). Fix the GIL last holder variable so that our heuristics work. */ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.gil.last_holder, - (uintptr_t)tstate); + _Py_atomic_store_relaxed(&gil->last_holder, (uintptr_t)tstate); } - MUTEX_LOCK(_PyRuntime.ceval.gil.mutex); - _Py_ANNOTATE_RWLOCK_RELEASED(&_PyRuntime.ceval.gil.locked, /*is_write=*/1); - _Py_atomic_store_relaxed(&_PyRuntime.ceval.gil.locked, 0); - COND_SIGNAL(_PyRuntime.ceval.gil.cond); - MUTEX_UNLOCK(_PyRuntime.ceval.gil.mutex); + MUTEX_LOCK(gil->mutex); + _Py_ANNOTATE_RWLOCK_RELEASED(&gil->locked, /*is_write=*/1); + _Py_atomic_store_relaxed(&gil->locked, 0); + COND_SIGNAL(gil->cond); + MUTEX_UNLOCK(gil->mutex); #ifdef FORCE_SWITCHING - if (_Py_atomic_load_relaxed(&_PyRuntime.ceval.gil_drop_request) && - tstate != NULL) - { - MUTEX_LOCK(_PyRuntime.ceval.gil.switch_mutex); + if (_Py_atomic_load_relaxed(&ceval->gil_drop_request) && tstate != NULL) { + MUTEX_LOCK(gil->switch_mutex); /* Not switched yet => wait */ - if (((PyThreadState*)_Py_atomic_load_relaxed( - &_PyRuntime.ceval.gil.last_holder) - ) == tstate) + if (((PyThreadState*)_Py_atomic_load_relaxed(&gil->last_holder)) == tstate) { - RESET_GIL_DROP_REQUEST(); + RESET_GIL_DROP_REQUEST(ceval); /* NOTE: if COND_WAIT does not atomically start waiting when releasing the mutex, another thread can run through, take the GIL and drop it again, and reset the condition before we even had a chance to wait for it. */ - COND_WAIT(_PyRuntime.ceval.gil.switch_cond, - _PyRuntime.ceval.gil.switch_mutex); - } - MUTEX_UNLOCK(_PyRuntime.ceval.gil.switch_mutex); + COND_WAIT(gil->switch_cond, gil->switch_mutex); + } + MUTEX_UNLOCK(gil->switch_mutex); } #endif } -static void take_gil(PyThreadState *tstate) +static void +take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) { - int err; - if (tstate == NULL) + if (tstate == NULL) { Py_FatalError("take_gil: NULL tstate"); + } - err = errno; - MUTEX_LOCK(_PyRuntime.ceval.gil.mutex); + struct _gil_runtime_state *gil = &ceval->gil; + int err = errno; + MUTEX_LOCK(gil->mutex); - if (!_Py_atomic_load_relaxed(&_PyRuntime.ceval.gil.locked)) + if (!_Py_atomic_load_relaxed(&gil->locked)) { goto _ready; + } - while (_Py_atomic_load_relaxed(&_PyRuntime.ceval.gil.locked)) { + while (_Py_atomic_load_relaxed(&gil->locked)) { int timed_out = 0; unsigned long saved_switchnum; - saved_switchnum = _PyRuntime.ceval.gil.switch_number; - COND_TIMED_WAIT(_PyRuntime.ceval.gil.cond, _PyRuntime.ceval.gil.mutex, - INTERVAL, timed_out); + saved_switchnum = gil->switch_number; + + + unsigned long interval = (gil->interval >= 1 ? gil->interval : 1); + COND_TIMED_WAIT(gil->cond, gil->mutex, interval, timed_out); /* If we timed out and no switch occurred in the meantime, it is time to ask the GIL-holding thread to drop it. */ if (timed_out && - _Py_atomic_load_relaxed(&_PyRuntime.ceval.gil.locked) && - _PyRuntime.ceval.gil.switch_number == saved_switchnum) { - SET_GIL_DROP_REQUEST(); + _Py_atomic_load_relaxed(&gil->locked) && + gil->switch_number == saved_switchnum) + { + SET_GIL_DROP_REQUEST(ceval); } } _ready: #ifdef FORCE_SWITCHING - /* This mutex must be taken before modifying - _PyRuntime.ceval.gil.last_holder (see drop_gil()). */ - MUTEX_LOCK(_PyRuntime.ceval.gil.switch_mutex); + /* This mutex must be taken before modifying gil->last_holder: + see drop_gil(). */ + MUTEX_LOCK(gil->switch_mutex); #endif /* We now hold the GIL */ - _Py_atomic_store_relaxed(&_PyRuntime.ceval.gil.locked, 1); - _Py_ANNOTATE_RWLOCK_ACQUIRED(&_PyRuntime.ceval.gil.locked, /*is_write=*/1); - - if (tstate != (PyThreadState*)_Py_atomic_load_relaxed( - &_PyRuntime.ceval.gil.last_holder)) - { - _Py_atomic_store_relaxed(&_PyRuntime.ceval.gil.last_holder, - (uintptr_t)tstate); - ++_PyRuntime.ceval.gil.switch_number; + _Py_atomic_store_relaxed(&gil->locked, 1); + _Py_ANNOTATE_RWLOCK_ACQUIRED(&gil->locked, /*is_write=*/1); + + if (tstate != (PyThreadState*)_Py_atomic_load_relaxed(&gil->last_holder)) { + _Py_atomic_store_relaxed(&gil->last_holder, (uintptr_t)tstate); + ++gil->switch_number; } #ifdef FORCE_SWITCHING - COND_SIGNAL(_PyRuntime.ceval.gil.switch_cond); - MUTEX_UNLOCK(_PyRuntime.ceval.gil.switch_mutex); + COND_SIGNAL(gil->switch_cond); + MUTEX_UNLOCK(gil->switch_mutex); #endif - if (_Py_atomic_load_relaxed(&_PyRuntime.ceval.gil_drop_request)) { - RESET_GIL_DROP_REQUEST(); + if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { + RESET_GIL_DROP_REQUEST(ceval); } if (tstate->async_exc != NULL) { - _PyEval_SignalAsyncExc(); + _PyEval_SignalAsyncExc(ceval); } - MUTEX_UNLOCK(_PyRuntime.ceval.gil.mutex); + MUTEX_UNLOCK(gil->mutex); errno = err; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 32902aa0d597..de8595ccb581 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -4,8 +4,9 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ -#include "pycore_coreconfig.h" +#include "pycore_ceval.h" #include "pycore_context.h" +#include "pycore_coreconfig.h" #include "pycore_fileutils.h" #include "pycore_hamt.h" #include "pycore_pathconfig.h" @@ -527,7 +528,7 @@ pycore_create_interpreter(_PyRuntimeState *runtime, another running thread (see issue #9901). Instead we destroy the previously created GIL here, which ensures that we can call Py_Initialize / Py_FinalizeEx multiple times. */ - _PyEval_FiniThreads(); + _PyEval_FiniThreads(&runtime->ceval); /* Auto-thread-state API */ _PyGILState_Init(runtime, interp, tstate); @@ -1135,10 +1136,10 @@ Py_FinalizeEx(void) wait_for_thread_shutdown(); // Make any remaining pending calls. - _Py_FinishPendingCalls(); + _Py_FinishPendingCalls(runtime); /* Get current thread state and interpreter pointer */ - PyThreadState *tstate = _PyThreadState_GET(); + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); PyInterpreterState *interp = tstate->interp; /* The interpreter is still entirely intact at this point, and the diff --git a/Python/pystate.c b/Python/pystate.c index 44acfed6b983..67315756ab70 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -2,6 +2,7 @@ /* Thread and interpreter state structures and their interfaces */ #include "Python.h" +#include "pycore_ceval.h" #include "pycore_coreconfig.h" #include "pycore_pymem.h" #include "pycore_pystate.h" @@ -39,7 +40,6 @@ extern "C" { /* Forward declarations */ static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate); static void _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate); -static PyThreadState *_PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts); static _PyInitError @@ -867,9 +867,8 @@ PyThreadState_DeleteCurrent() * be kept in those other interpreteres. */ void -_PyThreadState_DeleteExcept(PyThreadState *tstate) +_PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate) { - _PyRuntimeState *runtime = &_PyRuntime; PyInterpreterState *interp = tstate->interp; PyThreadState *p, *next, *garbage; HEAD_LOCK(runtime); @@ -915,7 +914,7 @@ PyThreadState_Get(void) } -static PyThreadState * +PyThreadState * _PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts) { PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate); @@ -980,8 +979,8 @@ PyThreadState_GetDict(void) int PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - PyThreadState *p; + _PyRuntimeState *runtime = &_PyRuntime; + PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; /* Although the GIL is held, a few C API functions can be called * without the GIL held, and in particular some that create and @@ -989,9 +988,8 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) * list of thread states we're traversing, so to prevent that we lock * head_mutex for the duration. */ - _PyRuntimeState *runtime = &_PyRuntime; HEAD_LOCK(runtime); - for (p = interp->tstate_head; p != NULL; p = p->next) { + for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) { if (p->thread_id == id) { /* Tricky: we need to decref the current value * (if any) in p->async_exc, but that can in turn @@ -1005,7 +1003,7 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) p->async_exc = exc; HEAD_UNLOCK(runtime); Py_XDECREF(old_exc); - _PyEval_SignalAsyncExc(); + _PyEval_SignalAsyncExc(&runtime->ceval); return 1; } } From webhook-mailer at python.org Fri May 10 17:58:23 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 10 May 2019 21:58:23 -0000 Subject: [Python-checkins] Fix sphinx deprecation warning about env.note_versionchange() (GH-13236) Message-ID: https://github.com/python/cpython/commit/960bb883769e5c64a63b014590d75654db87ffb0 commit: 960bb883769e5c64a63b014590d75654db87ffb0 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-10T22:58:17+01:00 summary: Fix sphinx deprecation warning about env.note_versionchange() (GH-13236) files: M Doc/tools/extensions/pyspecific.py diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 66317430881b..e097c13eab5f 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -271,7 +271,7 @@ def run(self): translatable=False) node.append(para) env = self.state.document.settings.env - env.note_versionchange('deprecated', version[0], node, self.lineno) + env.get_domain('changeset').note_changeset(node) return [node] + messages From webhook-mailer at python.org Fri May 10 22:10:07 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 11 May 2019 02:10:07 -0000 Subject: [Python-checkins] bpo-21536: Update What's New in Python 3.8 entry (GH-13242) Message-ID: https://github.com/python/cpython/commit/4ebcd7e2980d650c711d21b93447af39a8604554 commit: 4ebcd7e2980d650c711d21b93447af39a8604554 branch: master author: Victor Stinner committer: GitHub date: 2019-05-11T04:10:03+02:00 summary: bpo-21536: Update What's New in Python 3.8 entry (GH-13242) Android still links to libpython. files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 6bb03422c6bc..58b23211cc67 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -138,7 +138,8 @@ environment variable, can be set using the new ``./configure --with-trace-refs`` build option. (Contributed by Victor Stinner in :issue:`36465`.) -On Unix, C extensions are no longer linked to libpython. It is now possible +On Unix, C extensions are no longer linked to libpython except on Android. +It is now possible for a statically linked Python to load a C extension built using a shared library Python. (Contributed by Victor Stinner in :issue:`21536`.) From webhook-mailer at python.org Fri May 10 22:51:51 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 11 May 2019 02:51:51 -0000 Subject: [Python-checkins] Hide module name from local (anchor) links in shutil docs (GH-6695) Message-ID: https://github.com/python/cpython/commit/f6e17ddffd3ba52a08e977bd9c6c0d6f2fffa905 commit: f6e17ddffd3ba52a08e977bd9c6c0d6f2fffa905 branch: master author: Aurelio Jargas committer: Cheryl Sabella date: 2019-05-10T22:51:45-04:00 summary: Hide module name from local (anchor) links in shutil docs (GH-6695) files: M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 2dc872fd0777..4af5a1680608 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -54,7 +54,7 @@ Directory and files operations *dst* and return *dst* in the most efficient way possible. *src* and *dst* are path names given as strings. - *dst* must be the complete target file name; look at :func:`shutil.copy` + *dst* must be the complete target file name; look at :func:`~shutil.copy` for a copy that accepts a target directory path. If *src* and *dst* specify the same file, :exc:`SameFileError` is raised. @@ -218,7 +218,7 @@ Directory and files operations already exists. Permissions and times of directories are copied with :func:`copystat`, - individual files are copied using :func:`shutil.copy2`. + individual files are copied using :func:`~shutil.copy2`. If *symlinks* is true, symbolic links in the source tree are represented as symbolic links in the new tree and the metadata of the original links will @@ -246,8 +246,8 @@ Directory and files operations If *copy_function* is given, it must be a callable that will be used to copy each file. It will be called with the source path and the destination path - as arguments. By default, :func:`shutil.copy2` is used, but any function - that supports the same signature (like :func:`shutil.copy`) can be used. + ? as arguments. By default, :func:`~shutil.copy2` is used, but any function + ? that supports the same signature (like :func:`~shutil.copy`) can be used. .. versionchanged:: 3.3 Copy metadata when *symlinks* is false. From webhook-mailer at python.org Sat May 11 04:45:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 11 May 2019 08:45:32 -0000 Subject: [Python-checkins] bpo-36884: Fix DeprecationWarning in test_asyncio StreamReader instantiation (GH-13243) Message-ID: https://github.com/python/cpython/commit/79972f1fad5247ade34ef98ad987162a9a78401d commit: 79972f1fad5247ade34ef98ad987162a9a78401d branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-11T01:45:16-07:00 summary: bpo-36884: Fix DeprecationWarning in test_asyncio StreamReader instantiation (GH-13243) https://bugs.python.org/issue36884 files: M Lib/test/test_asyncio/test_pep492.py diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py index 95ed79185867..558e268415cd 100644 --- a/Lib/test/test_asyncio/test_pep492.py +++ b/Lib/test/test_asyncio/test_pep492.py @@ -94,7 +94,7 @@ class StreamReaderTests(BaseTest): def test_readline(self): DATA = b'line1\nline2\nline3' - stream = asyncio.StreamReader(loop=self.loop) + stream = asyncio.StreamReader(loop=self.loop, _asyncio_internal=True) stream.feed_data(DATA) stream.feed_eof() From webhook-mailer at python.org Sat May 11 13:13:27 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 11 May 2019 17:13:27 -0000 Subject: [Python-checkins] bpo-36856: Handle possible overflow in faulthandler_stack_overflow (GH-13205) Message-ID: https://github.com/python/cpython/commit/6236c9823ef3e8e2229b0598d3d8189adf5e00f2 commit: 6236c9823ef3e8e2229b0598d3d8189adf5e00f2 branch: master author: Xi Ruoyao committer: Victor Stinner date: 2019-05-11T19:13:23+02:00 summary: bpo-36856: Handle possible overflow in faulthandler_stack_overflow (GH-13205) files: M Modules/faulthandler.c diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index d45b8660ee65..63a9b91ac469 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1121,13 +1121,26 @@ faulthandler_stack_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) { size_t depth, size; uintptr_t sp = (uintptr_t)&depth; - uintptr_t stop; + uintptr_t stop, lower_limit, upper_limit; faulthandler_suppress_crash_report(); depth = 0; - stop = stack_overflow(sp - STACK_OVERFLOW_MAX_SIZE, - sp + STACK_OVERFLOW_MAX_SIZE, - &depth); + + if (STACK_OVERFLOW_MAX_SIZE <= sp) { + lower_limit = sp - STACK_OVERFLOW_MAX_SIZE; + } + else { + lower_limit = 0; + } + + if (UINTPTR_MAX - STACK_OVERFLOW_MAX_SIZE >= sp) { + upper_limit = sp + STACK_OVERFLOW_MAX_SIZE; + } + else { + upper_limit = UINTPTR_MAX; + } + + stop = stack_overflow(lower_limit, upper_limit, &depth); if (sp < stop) size = stop - sp; else From webhook-mailer at python.org Sat May 11 14:17:27 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Sat, 11 May 2019 18:17:27 -0000 Subject: [Python-checkins] bpo-36878: Allow extra text after `# type: ignore` comments (GH-13238) Message-ID: https://github.com/python/cpython/commit/d8320ecb86da8df7c13d8bf8582507f736aa2924 commit: d8320ecb86da8df7c13d8bf8582507f736aa2924 branch: master author: Michael J. Sullivan committer: Ivan Levkivskyi date: 2019-05-11T19:17:24+01:00 summary: bpo-36878: Allow extra text after `# type: ignore` comments (GH-13238) In the parser, when using the type_comments=True option, recognize a TYPE_IGNORE as anything containing `# type: ignore` followed by a non-alphanumeric character. This is to allow ignores such as `# type: ignore[E1000]`. files: A Misc/NEWS.d/next/Library/2019-05-10-22-00-06.bpo-36878.iigeqk.rst M Lib/test/test_type_comments.py M Parser/tokenizer.c diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 69a48a104036..b4318902ee34 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -76,6 +76,12 @@ def foo(): def bar(): x = 1 # type: ignore + +def baz(): + pass # type: ignore[excuse] + pass # type: ignore=excuse + pass # type: ignore [excuse] + x = 1 # type: ignore whatever """ # Test for long-form type-comments in arguments. A test function @@ -266,7 +272,7 @@ def test_vardecl(self): def test_ignores(self): for tree in self.parse_all(ignores): - self.assertEqual([ti.lineno for ti in tree.type_ignores], [2, 5]) + self.assertEqual([ti.lineno for ti in tree.type_ignores], [2, 5, 8, 9, 10, 11]) tree = self.classic_parse(ignores) self.assertEqual(tree.type_ignores, []) @@ -318,6 +324,7 @@ def check_both_ways(source): check_both_ways("while True:\n continue # type: int\n") check_both_ways("try: # type: int\n pass\nfinally:\n pass\n") check_both_ways("try:\n pass\nfinally: # type: int\n pass\n") + check_both_ways("pass # type: ignorewhatever\n") def test_func_type_input(self): diff --git a/Misc/NEWS.d/next/Library/2019-05-10-22-00-06.bpo-36878.iigeqk.rst b/Misc/NEWS.d/next/Library/2019-05-10-22-00-06.bpo-36878.iigeqk.rst new file mode 100644 index 000000000000..20b44dcbf13f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-10-22-00-06.bpo-36878.iigeqk.rst @@ -0,0 +1,4 @@ +When using `type_comments=True` in `ast.parse`, treat `# type: ignore` followed by +a non-alphanumeric character and then arbitrary text as a type ignore, instead of +requiring nothing but whitespace or another comment. This is to permit formations +such as `# type: ignore[E1000]`. \ No newline at end of file diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index e8068f268074..5dc2ae65c42d 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1272,14 +1272,11 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) type_start = p; - is_type_ignore = tok->cur >= p + 6 && memcmp(p, "ignore", 6) == 0; - p += 6; - while (is_type_ignore && p < tok->cur) { - if (*p == '#') - break; - is_type_ignore = is_type_ignore && (*p == ' ' || *p == '\t'); - p++; - } + /* A TYPE_IGNORE is "type: ignore" followed by the end of the token + * or anything non-alphanumeric. */ + is_type_ignore = ( + tok->cur >= p + 6 && memcmp(p, "ignore", 6) == 0 + && !(tok->cur > p + 6 && isalnum(p[6]))); if (is_type_ignore) { /* If this type ignore is the only thing on the line, consume the newline also. */ From webhook-mailer at python.org Sat May 11 15:04:14 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 11 May 2019 19:04:14 -0000 Subject: [Python-checkins] bpo-36822: Fix minor grammatical error in glossary.rst (GH-13145) Message-ID: https://github.com/python/cpython/commit/90fb04c1e23c0fddd438bd0f73e7c018cacef4bc commit: 90fb04c1e23c0fddd438bd0f73e7c018cacef4bc branch: master author: Sanyam Khurana <8039608+CuriousLearner at users.noreply.github.com> committer: Pablo Galindo date: 2019-05-11T20:04:10+01:00 summary: bpo-36822: Fix minor grammatical error in glossary.rst (GH-13145) files: M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 5810a6b79978..9c64e4886319 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -15,10 +15,10 @@ Glossary ``...`` Can refer to: - * The default Python prompt of the interactive shell when entering code for - an indented code block, when within a pair of matching left and right - delimiters (parentheses, square brackets, curly braces or triple quotes), - or after specifying a decorator. + * The default Python prompt of the interactive shell when entering the + code for an indented code block, when within a pair of matching left and + right delimiters (parentheses, square brackets, curly braces or triple + quotes), or after specifying a decorator. * The :const:`Ellipsis` built-in constant. From webhook-mailer at python.org Sat May 11 15:54:40 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 11 May 2019 19:54:40 -0000 Subject: [Python-checkins] bpo-36817: Fix reference leak for expr_text in f-string = parsing (GH-13249) Message-ID: https://github.com/python/cpython/commit/5833e94d8615ea18b14e4830ecdb868aec81b378 commit: 5833e94d8615ea18b14e4830ecdb868aec81b378 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-11T20:54:37+01:00 summary: bpo-36817: Fix reference leak for expr_text in f-string = parsing (GH-13249) files: M Python/ast.c diff --git a/Python/ast.c b/Python/ast.c index 21abd7e88d84..585f8b3fba4c 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -5228,10 +5228,15 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, } if (equal_flag) { - Py_ssize_t len = expr_text_end-expr_start; + Py_ssize_t len = expr_text_end - expr_start; expr_text = PyUnicode_FromStringAndSize(expr_start, len); - if (!expr_text) + if (!expr_text) { goto error; + } + if (PyArena_AddPyObject(c->c_arena, expr_text) < 0) { + Py_DECREF(expr_text); + goto error; + } } /* Check for the format spec, if present. */ From webhook-mailer at python.org Sat May 11 20:43:08 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 12 May 2019 00:43:08 -0000 Subject: [Python-checkins] bpo-36817: Do not decrement reference for expr_text on fstring = parsing failure (GH-13256) Message-ID: https://github.com/python/cpython/commit/26f55c29f2316648939ad12a9d3730a2118da2ea commit: 26f55c29f2316648939ad12a9d3730a2118da2ea branch: master author: Pablo Galindo committer: GitHub date: 2019-05-12T01:43:04+01:00 summary: bpo-36817: Do not decrement reference for expr_text on fstring = parsing failure (GH-13256) files: M Lib/test/test_fstring.py M Python/ast.c diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index a0fae50d1720..3484fcecf1c5 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1148,6 +1148,8 @@ def __repr__(self): self.assertEqual(f'{C()=:x}', 'C()=FORMAT-x') self.assertEqual(f'{C()=!r:*^20}', 'C()=********REPR********') + self.assertRaises(SyntaxError, eval, "f'{C=]'") + def test_walrus(self): x = 20 # This isn't an assignment expression, it's 'x', with a format diff --git a/Python/ast.c b/Python/ast.c index 585f8b3fba4c..03da4e7f7f9a 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -5283,7 +5283,6 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, /* Falls through to error. */ error: - Py_XDECREF(expr_text); return -1; } From webhook-mailer at python.org Sat May 11 23:33:38 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sun, 12 May 2019 03:33:38 -0000 Subject: [Python-checkins] bpo-36684: Split out gcc and test coverage builds (GH-13146) Message-ID: https://github.com/python/cpython/commit/87068ed00927bdeaa2ae556e4241c16cf8a845eb commit: 87068ed00927bdeaa2ae556e4241c16cf8a845eb branch: master author: Gordon P. Hemsley committer: Inada Naoki date: 2019-05-12T12:33:34+09:00 summary: bpo-36684: Split out gcc and test coverage builds (GH-13146) The combined Python and C coverage test runs now exceed Travis's 50-minute time limit. Splitting them into separate runs gives more leeway. Also, adding branch coverage to Python testing and ensure that coverage is reported even if tests fail. (The primary builds are for tracking test failures.) files: M .travis.yml diff --git a/.travis.yml b/.travis.yml index 6d57ebb1d2fb..207649730c21 100644 --- a/.travis.yml +++ b/.travis.yml @@ -86,22 +86,36 @@ matrix: addons: apt: packages: - - lcov - xvfb before_script: - ./configure - - make coverage -s -j4 + - make -j4 # Need a venv that can parse covered code. - ./python -m venv venv - ./venv/bin/python -m pip install -U coverage - ./venv/bin/python -m test.pythoninfo script: # Skip tests that re-run the entire test suite. - - xvfb-run ./venv/bin/python -m coverage run --pylib -m test --fail-env-changed -uall,-cpu -x test_multiprocessing_fork -x test_multiprocessing_forkserver -x test_multiprocessing_spawn -x test_concurrent_futures + - xvfb-run ./venv/bin/python -m coverage run --branch --pylib -m test --fail-env-changed -uall,-cpu -x test_multiprocessing_fork -x test_multiprocessing_forkserver -x test_multiprocessing_spawn -x test_concurrent_futures || true after_script: # Probably should be after_success once test suite updated to run under coverage.py. # Make the `coverage` command available to Codecov w/ a version of Python that can parse all source files. - source ./venv/bin/activate - - make coverage-lcov + - bash <(curl -s https://codecov.io/bash) + - os: linux + language: c + compiler: gcc + env: OPTIONAL=true + addons: + apt: + packages: + - lcov + - xvfb + before_script: + - ./configure + script: + - xvfb-run make -j4 coverage-report + after_script: # Probably should be after_success once test suite updated to run under coverage.py. + - make pythoninfo - bash <(curl -s https://codecov.io/bash) From webhook-mailer at python.org Sat May 11 23:53:06 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 12 May 2019 03:53:06 -0000 Subject: [Python-checkins] [3.7] bpo-36822: Fix minor grammatical error in glossary.rst (GH-13145). (GH-13260) Message-ID: https://github.com/python/cpython/commit/4f5febdf955240b6064bb5647dec084feaa98376 commit: 4f5febdf955240b6064bb5647dec084feaa98376 branch: 3.7 author: Sanyam Khurana <8039608+CuriousLearner at users.noreply.github.com> committer: Pablo Galindo date: 2019-05-12T04:53:02+01:00 summary: [3.7] bpo-36822: Fix minor grammatical error in glossary.rst (GH-13145). (GH-13260) (cherry picked from commit 90fb04c1e23c0fddd438bd0f73e7c018cacef4bc) Co-authored-by: Sanyam Khurana <8039608+CuriousLearner at users.noreply.github.com> files: M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 472351b485ac..9ca46222ad9b 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -13,10 +13,10 @@ Glossary examples which can be executed interactively in the interpreter. ``...`` - The default Python prompt of the interactive shell when entering code for - an indented code block, when within a pair of matching left and right - delimiters (parentheses, square brackets, curly braces or triple quotes), - or after specifying a decorator. + The default Python prompt of the interactive shell when entering the + code for an indented code block, when within a pair of matching left and + right delimiters (parentheses, square brackets, curly braces or triple + quotes), or after specifying a decorator. 2to3 A tool that tries to convert Python 2.x code to Python 3.x code by From webhook-mailer at python.org Sun May 12 05:37:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 May 2019 09:37:20 -0000 Subject: [Python-checkins] bpo-36791: Safer detection of integer overflow in sum(). (GH-13080) Message-ID: https://github.com/python/cpython/commit/b7e483b6d07081d5f81860258e95785975a7cbf8 commit: b7e483b6d07081d5f81860258e95785975a7cbf8 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-12T02:37:15-07:00 summary: bpo-36791: Safer detection of integer overflow in sum(). (GH-13080) (cherry picked from commit 29500737d45cbca9604d9ce845fb2acc3f531401) Co-authored-by: Serhiy Storchaka files: M Python/bltinmodule.c diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 6306c3ac5641..8083ac961feb 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2374,9 +2374,11 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) } if (PyLong_CheckExact(item)) { long b = PyLong_AsLongAndOverflow(item, &overflow); - long x = i_result + b; - if (overflow == 0 && ((x^i_result) >= 0 || (x^b) >= 0)) { - i_result = x; + if (overflow == 0 && + (i_result >= 0 ? (b <= LONG_MAX - i_result) + : (b >= LONG_MIN - i_result))) + { + i_result += b; Py_DECREF(item); continue; } From webhook-mailer at python.org Sun May 12 13:08:28 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Sun, 12 May 2019 17:08:28 -0000 Subject: [Python-checkins] bpo-36084: Add native thread ID to threading.Thread objects (GH-11993) Message-ID: https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0 commit: 4959c33d2555b89b494c678d99be81a65ee864b0 branch: master author: Jake Tesler committer: Antoine Pitrou date: 2019-05-12T19:08:24+02:00 summary: bpo-36084: Add native thread ID to threading.Thread objects (GH-11993) files: A Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst M Doc/library/_thread.rst M Doc/library/threading.rst M Include/pythread.h M Lib/_dummy_thread.py M Lib/test/test_threading.py M Lib/threading.py M Modules/_threadmodule.c M Python/thread_nt.h M Python/thread_pthread.h diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index acffabf24bad..d7814f218b50 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -85,6 +85,18 @@ This module defines the following constants and functions: may be recycled when a thread exits and another thread is created. +.. function:: get_native_id() + + Return the native integral Thread ID of the current thread assigned by the kernel. + This is a non-negative integer. + Its value may be used to uniquely identify this particular thread system-wide + (until the thread terminates, after which the value may be recycled by the OS). + + .. availability:: Windows, FreeBSD, Linux, macOS. + + .. versionadded:: 3.8 + + .. function:: stack_size([size]) Return the thread stack size used when creating new threads. The optional diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index c58a6ad75d08..99dd7fff0d2f 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -49,6 +49,18 @@ This module defines the following functions: .. versionadded:: 3.3 +.. function:: get_native_id() + + Return the native integral Thread ID of the current thread assigned by the kernel. + This is a non-negative integer. + Its value may be used to uniquely identify this particular thread system-wide + (until the thread terminates, after which the value may be recycled by the OS). + + .. availability:: Windows, FreeBSD, Linux, macOS. + + .. versionadded:: 3.8 + + .. function:: enumerate() Return a list of all :class:`Thread` objects currently alive. The list @@ -297,6 +309,25 @@ since it is impossible to detect the termination of alien threads. another thread is created. The identifier is available even after the thread has exited. + .. attribute:: native_id + + The native integral thread ID of this thread or ``0`` if the thread has not + been started. This is a non-negative integer. See the + :func:`get_native_id` function. + This represents the Thread ID (``TID``) as assigned to the + thread by the OS (kernel). Its value may be used to uniquely identify + this particular thread system-wide. + + .. note:: + + Similar to Process IDs, Thread IDs are only valid (guaranteed unique + system-wide) from the time the thread is created until the thread + has been terminated. + + .. availability:: Windows, FreeBSD, Linux, macOS. + + .. versionadded:: 3.8 + .. method:: is_alive() Return whether the thread is alive. diff --git a/Include/pythread.h b/Include/pythread.h index bc1d92cd1ff1..e083383af80b 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -25,6 +25,7 @@ PyAPI_FUNC(void) PyThread_init_thread(void); PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); +PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py index a2cae54b0580..0a877e1fa169 100644 --- a/Lib/_dummy_thread.py +++ b/Lib/_dummy_thread.py @@ -71,6 +71,10 @@ def get_ident(): """ return 1 +def get_native_id(): + """Dummy implementation of _thread.get_native_id().""" + return 0 + def allocate_lock(): """Dummy implementation of _thread.allocate_lock().""" return LockType() diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 2ddc77b266b5..6ac6e9de7a5d 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -104,6 +104,10 @@ def test_various_ops(self): self.assertRegex(repr(t), r'^$') t.start() + native_ids = set(t.native_id for t in threads) | {threading.get_native_id()} + self.assertNotIn(None, native_ids) + self.assertEqual(len(native_ids), NUMTASKS + 1) + if verbose: print('waiting for all tasks to complete') for t in threads: diff --git a/Lib/threading.py b/Lib/threading.py index 0ebbd6776ef4..3137e495b250 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -23,8 +23,8 @@ # with the multiprocessing module, which doesn't provide the old # Java inspired names. -__all__ = ['get_ident', 'active_count', 'Condition', 'current_thread', - 'enumerate', 'main_thread', 'TIMEOUT_MAX', +__all__ = ['get_ident', 'get_native_id', 'active_count', 'Condition', + 'current_thread', 'enumerate', 'main_thread', 'TIMEOUT_MAX', 'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError', 'setprofile', 'settrace', 'local', 'stack_size'] @@ -34,6 +34,7 @@ _allocate_lock = _thread.allocate_lock _set_sentinel = _thread._set_sentinel get_ident = _thread.get_ident +get_native_id = _thread.get_native_id ThreadError = _thread.error try: _CRLock = _thread.RLock @@ -790,6 +791,7 @@ class is implemented. else: self._daemonic = current_thread().daemon self._ident = None + self._native_id = 0 self._tstate_lock = None self._started = Event() self._is_stopped = False @@ -891,6 +893,9 @@ def _bootstrap(self): def _set_ident(self): self._ident = get_ident() + def _set_native_id(self): + self._native_id = get_native_id() + def _set_tstate_lock(self): """ Set a lock object which will be released by the interpreter when @@ -903,6 +908,7 @@ def _bootstrap_inner(self): try: self._set_ident() self._set_tstate_lock() + self._set_native_id() self._started.set() with _active_limbo_lock: _active[self._ident] = self @@ -1077,6 +1083,17 @@ def ident(self): assert self._initialized, "Thread.__init__() not called" return self._ident + @property + def native_id(self): + """Native integral thread ID of this thread or 0 if it has not been started. + + This is a non-negative integer. See the get_native_id() function. + This represents the Thread ID as reported by the kernel. + + """ + assert self._initialized, "Thread.__init__() not called" + return self._native_id + def is_alive(self): """Return whether the thread is alive. @@ -1176,6 +1193,7 @@ def __init__(self): self._set_tstate_lock() self._started.set() self._set_ident() + self._set_native_id() with _active_limbo_lock: _active[self._ident] = self @@ -1195,6 +1213,7 @@ def __init__(self): self._started.set() self._set_ident() + self._set_native_id() with _active_limbo_lock: _active[self._ident] = self diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst new file mode 100644 index 000000000000..4a612964de0f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst @@ -0,0 +1 @@ +Add native thread ID (TID) to threading.Thread objects \ No newline at end of file diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 3c02d8dd5145..a123cd0efd62 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1159,6 +1159,20 @@ allocated consecutive numbers starting at 1, this behavior should not\n\ be relied upon, and the number should be seen purely as a magic cookie.\n\ A thread's identity may be reused for another thread after it exits."); +static PyObject * +thread_get_native_id(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + unsigned long native_id = PyThread_get_thread_native_id(); + return PyLong_FromUnsignedLong(native_id); +} + +PyDoc_STRVAR(get_native_id_doc, +"get_native_id() -> integer\n\ +\n\ +Return a non-negative integer identifying the thread as reported\n\ +by the OS (kernel). This may be used to uniquely identify a\n\ +particular thread within a system."); + static PyObject * thread__count(PyObject *self, PyObject *Py_UNUSED(ignored)) { @@ -1310,6 +1324,8 @@ static PyMethodDef thread_methods[] = { METH_NOARGS, interrupt_doc}, {"get_ident", thread_get_ident, METH_NOARGS, get_ident_doc}, + {"get_native_id", thread_get_native_id, + METH_NOARGS, get_native_id_doc}, {"_count", thread__count, METH_NOARGS, _count_doc}, {"stack_size", (PyCFunction)thread_stack_size, diff --git a/Python/thread_nt.h b/Python/thread_nt.h index 5e00c3511460..d3dc2bec6ffe 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -143,6 +143,8 @@ LeaveNonRecursiveMutex(PNRMUTEX mutex) unsigned long PyThread_get_thread_ident(void); +unsigned long PyThread_get_thread_native_id(void); + /* * Initialization of the C package, should not be needed. */ @@ -227,6 +229,20 @@ PyThread_get_thread_ident(void) return GetCurrentThreadId(); } +/* + * Return the native Thread ID (TID) of the calling thread. + * The native ID of a thread is valid and guaranteed to be unique system-wide + * from the time the thread is created until the thread has been terminated. + */ +unsigned long +PyThread_get_thread_native_id(void) +{ + if (!initialized) + PyThread_init_thread(); + + return GetCurrentThreadId(); +} + void _Py_NO_RETURN PyThread_exit_thread(void) { diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 4c106d9959c1..87c98d3e93cb 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -12,6 +12,12 @@ #endif #include +#if defined(__linux__) +#include +#elif defined(__FreeBSD__) +#include +#endif + /* The POSIX spec requires that use of pthread_attr_setstacksize be conditional on _POSIX_THREAD_ATTR_STACKSIZE being defined. */ #ifdef _POSIX_THREAD_ATTR_STACKSIZE @@ -302,6 +308,27 @@ PyThread_get_thread_ident(void) return (unsigned long) threadid; } +unsigned long +PyThread_get_thread_native_id(void) +{ + if (!initialized) + PyThread_init_thread(); +#ifdef __APPLE__ + uint64_t native_id; + pthread_threadid_np(NULL, &native_id); +#elif defined(__linux__) + pid_t native_id; + native_id = syscall(__NR_gettid); +#elif defined(__FreeBSD__) + pid_t native_id; + native_id = pthread_getthreadid_np(); +#else + unsigned long native_id; + native_id = 0; +#endif + return (unsigned long) native_id; +} + void _Py_NO_RETURN PyThread_exit_thread(void) { From webhook-mailer at python.org Sun May 12 16:47:29 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Sun, 12 May 2019 20:47:29 -0000 Subject: [Python-checkins] [2.7] closes bpo-14353: Fix detection of bind_textdomain_codeset in libintl. (GH-13265) Message-ID: https://github.com/python/cpython/commit/24ff9a44ac5f0653df4c1d92c2a99fab286fcc15 commit: 24ff9a44ac5f0653df4c1d92c2a99fab286fcc15 branch: 2.7 author: Toshio Kuratomi committer: Benjamin Peterson date: 2019-05-12T13:47:18-07:00 summary: [2.7] closes bpo-14353: Fix detection of bind_textdomain_codeset in libintl. (GH-13265) In Python-2.7, we were only searching for bind_textdomain_codeset in libc. We should have also checked for it in libintl. This change from Mel Flynn https://bugs.python.org/file24918/python27-configure.in.patch fixes that. files: A Misc/NEWS.d/next/Build/2019-05-12-10-52-37.bpo-14353.LK1qWM.rst M configure M configure.ac M pyconfig.h.in diff --git a/Misc/NEWS.d/next/Build/2019-05-12-10-52-37.bpo-14353.LK1qWM.rst b/Misc/NEWS.d/next/Build/2019-05-12-10-52-37.bpo-14353.LK1qWM.rst new file mode 100644 index 000000000000..00ff22893812 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-05-12-10-52-37.bpo-14353.LK1qWM.rst @@ -0,0 +1,2 @@ +Fix detection of the bind_textdomain_codeset function for building gettext +support into the locale module. diff --git a/configure b/configure index aa361aa4c9ff..67300fe2b6e1 100755 --- a/configure +++ b/configure @@ -9051,6 +9051,64 @@ $as_echo "#define WITH_LIBINTL 1" >>confdefs.h fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing bind_textdomain_codeset" >&5 +$as_echo_n "checking for library containing bind_textdomain_codeset... " >&6; } +if ${ac_cv_search_bind_textdomain_codeset+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char bind_textdomain_codeset (); +int +main () +{ +return bind_textdomain_codeset (); + ; + return 0; +} +_ACEOF +for ac_lib in '' intl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_bind_textdomain_codeset=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_bind_textdomain_codeset+:} false; then : + break +fi +done +if ${ac_cv_search_bind_textdomain_codeset+:} false; then : + +else + ac_cv_search_bind_textdomain_codeset=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_bind_textdomain_codeset" >&5 +$as_echo "$ac_cv_search_bind_textdomain_codeset" >&6; } +ac_res=$ac_cv_search_bind_textdomain_codeset +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +$as_echo "#define HAVE_BIND_TEXTDOMAIN_CODESET 1" >>confdefs.h + +fi + # checks for system dependent C++ extensions support case "$ac_sys_system" in @@ -10588,7 +10646,7 @@ fi $as_echo "MACHDEP_OBJS" >&6; } # checks for library functions -for ac_func in alarm setitimer getitimer bind_textdomain_codeset chown \ +for ac_func in alarm setitimer getitimer chown \ clock confstr ctermid execv fchmod fchown fork fpathconf ftime ftruncate \ gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ getentropy \ diff --git a/configure.ac b/configure.ac index 344bc7a8bba6..36df3d02a2d8 100644 --- a/configure.ac +++ b/configure.ac @@ -2440,6 +2440,9 @@ fi AC_CHECK_LIB(intl, textdomain, AC_DEFINE(WITH_LIBINTL, 1, [Define to 1 if libintl is needed for locale functions.])) +AC_SEARCH_LIBS(bind_textdomain_codeset, intl, + AC_DEFINE(HAVE_BIND_TEXTDOMAIN_CODESET, 1, + [Define to 1 if bind_textdomain_codeset is available.])) # checks for system dependent C++ extensions support case "$ac_sys_system" in @@ -3117,7 +3120,7 @@ fi AC_MSG_RESULT(MACHDEP_OBJS) # checks for library functions -AC_CHECK_FUNCS(alarm setitimer getitimer bind_textdomain_codeset chown \ +AC_CHECK_FUNCS(alarm setitimer getitimer chown \ clock confstr ctermid execv fchmod fchown fork fpathconf ftime ftruncate \ gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ getentropy \ diff --git a/pyconfig.h.in b/pyconfig.h.in index 11c4a66873c1..4da6e7104ab3 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -73,7 +73,7 @@ /* Define if GCC supports __attribute__((format(PyArg_ParseTuple, 2, 3))) */ #undef HAVE_ATTRIBUTE_FORMAT_PARSETUPLE -/* Define to 1 if you have the `bind_textdomain_codeset' function. */ +/* Define to 1 if bind_textdomain_codeset is available. */ #undef HAVE_BIND_TEXTDOMAIN_CODESET /* Define to 1 if you have the header file. */ From webhook-mailer at python.org Sun May 12 17:45:56 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 12 May 2019 21:45:56 -0000 Subject: [Python-checkins] bpo-36886: Document changes in code object in What's new section (GH-13255) Message-ID: https://github.com/python/cpython/commit/5d23e282af69d404a3430bb95aefe371112817b3 commit: 5d23e282af69d404a3430bb95aefe371112817b3 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-12T22:45:52+01:00 summary: bpo-36886: Document changes in code object in What's new section (GH-13255) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 58b23211cc67..2cfb110b3d50 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -977,6 +977,10 @@ Changes in the Python API replacement by a pure Python implementation. (Contributed by Pablo Galindo in :issue:`36623`.) +* :class:`types.CodeType` has a new parameter in the second position of the + constructor (*posonlyargcount*) to support positional-only arguments defined + in :pep:`570`. + Changes in the C API -------------------- From webhook-mailer at python.org Sun May 12 21:34:57 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Mon, 13 May 2019 01:34:57 -0000 Subject: [Python-checkins] bpo-36895: remove time.clock() as per removal notice. (GH-13270) Message-ID: https://github.com/python/cpython/commit/e2500610c62673f42371b54fb0e4de83e4b33146 commit: e2500610c62673f42371b54fb0e4de83e4b33146 branch: master author: Matthias Bussonnier committer: Gregory P. Smith date: 2019-05-12T18:34:44-07:00 summary: bpo-36895: remove time.clock() as per removal notice. (GH-13270) `time.clock()` was deprecated in 3.3, and marked for removal removal in 3.8; this thus remove it from the time module. files: A Misc/NEWS.d/next/Library/2019-05-12-14-49-13.bpo-36895.ZZuuY7.rst M Doc/library/time.rst M Lib/test/test_time.py M Modules/timemodule.c diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 170f8dc629bf..cad4afda38b8 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -155,7 +155,7 @@ Functions .. availability:: Windows, Unix. Not available on VxWorks. - .. deprecated:: 3.3 + .. deprecated-removed:: 3.3 3.8 The behaviour of this function depends on the platform: use :func:`perf_counter` or :func:`process_time` instead, depending on your requirements, to have a well defined behaviour. diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index 42799b2a21ca..f790d43b6f47 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -88,17 +88,6 @@ def check_ns(sec, ns): check_ns(time.clock_gettime(time.CLOCK_REALTIME), time.clock_gettime_ns(time.CLOCK_REALTIME)) - @unittest.skipUnless(hasattr(time, 'clock'), - 'need time.clock()') - def test_clock(self): - with self.assertWarns(DeprecationWarning): - time.clock() - - with self.assertWarns(DeprecationWarning): - info = time.get_clock_info('clock') - self.assertTrue(info.monotonic) - self.assertFalse(info.adjustable) - @unittest.skipUnless(hasattr(time, 'clock_gettime'), 'need time.clock_gettime()') def test_clock_realtime(self): @@ -553,15 +542,9 @@ def test_localtime_failure(self): def test_get_clock_info(self): clocks = ['monotonic', 'perf_counter', 'process_time', 'time'] - if hasattr(time, 'clock'): - clocks.append('clock') for name in clocks: - if name == 'clock': - with self.assertWarns(DeprecationWarning): - info = time.get_clock_info('clock') - else: - info = time.get_clock_info(name) + info = time.get_clock_info(name) #self.assertIsInstance(info, dict) self.assertIsInstance(info.implementation, str) diff --git a/Misc/NEWS.d/next/Library/2019-05-12-14-49-13.bpo-36895.ZZuuY7.rst b/Misc/NEWS.d/next/Library/2019-05-12-14-49-13.bpo-36895.ZZuuY7.rst new file mode 100644 index 000000000000..f6708abfc860 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-12-14-49-13.bpo-36895.ZZuuY7.rst @@ -0,0 +1,2 @@ +The function ``time.clock()`` was deprecated in 3.3 in favor of +``time.perf_counter()`` and marked for removal in 3.8, it has removed. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 3df17ac4fb68..f991f31ee15e 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -145,44 +145,6 @@ perf_counter(_Py_clock_info_t *info) return _PyFloat_FromPyTime(t); } -#if (defined(MS_WINDOWS) || defined(HAVE_CLOCK)) && !defined(__VXWORKS__) -#define PYCLOCK -static PyObject* -pyclock(_Py_clock_info_t *info) -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "time.clock has been deprecated in Python 3.3 and will " - "be removed from Python 3.8: " - "use time.perf_counter or time.process_time " - "instead", 1) < 0) { - return NULL; - } - -#ifdef MS_WINDOWS - return perf_counter(info); -#else - _PyTime_t t; - if (_PyTime_GetClockWithInfo(&t, info) < 0) { - return NULL; - } - return _PyFloat_FromPyTime(t); -#endif -} - -static PyObject * -time_clock(PyObject *self, PyObject *unused) -{ - return pyclock(NULL); -} - -PyDoc_STRVAR(clock_doc, -"clock() -> floating point number\n\ -\n\ -Return the CPU time or real time since the start of the process or since\n\ -the first call to clock(). This has as much precision as the system\n\ -records."); -#endif - #ifdef HAVE_CLOCK_GETTIME static PyObject * time_clock_gettime(PyObject *self, PyObject *args) @@ -1477,15 +1439,6 @@ time_get_clock_info(PyObject *self, PyObject *args) return NULL; } } -#ifdef PYCLOCK - else if (strcmp(name, "clock") == 0) { - obj = pyclock(&info); - if (obj == NULL) { - return NULL; - } - Py_DECREF(obj); - } -#endif else if (strcmp(name, "monotonic") == 0) { if (_PyTime_GetMonotonicClockWithInfo(&t, &info) < 0) { return NULL; @@ -1700,9 +1653,6 @@ init_timezone(PyObject *m) static PyMethodDef time_methods[] = { {"time", time_time, METH_NOARGS, time_doc}, {"time_ns", time_time_ns, METH_NOARGS, time_ns_doc}, -#ifdef PYCLOCK - {"clock", time_clock, METH_NOARGS, clock_doc}, -#endif #ifdef HAVE_CLOCK_GETTIME {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc}, {"clock_gettime_ns",time_clock_gettime_ns, METH_VARARGS, clock_gettime_ns_doc}, From webhook-mailer at python.org Sun May 12 23:39:35 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Mon, 13 May 2019 03:39:35 -0000 Subject: [Python-checkins] Correct misspelling (GH-11470) Message-ID: https://github.com/python/cpython/commit/4ef9b8e5054d8bf9e1fcd4c3ba245a16265dc298 commit: 4ef9b8e5054d8bf9e1fcd4c3ba245a16265dc298 branch: master author: Johnny G?rard <36079566+johnnygerard at users.noreply.github.com> committer: Cheryl Sabella date: 2019-05-12T23:39:32-04:00 summary: Correct misspelling (GH-11470) files: M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index cf7d05eef674..79ba4568a54b 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -196,7 +196,7 @@ the comprehension is executed in a separate implicitly nested scope. This ensure that names assigned to in the target list don't "leak" into the enclosing scope. The iterable expression in the leftmost :keyword:`!for` clause is evaluated -directly in the enclosing scope and then passed as an argument to the implictly +directly in the enclosing scope and then passed as an argument to the implicitly nested scope. Subsequent :keyword:`!for` clauses and any filter condition in the leftmost :keyword:`!for` clause cannot be evaluated in the enclosing scope as they may depend on the values obtained from the leftmost iterable. For example: From webhook-mailer at python.org Mon May 13 00:18:30 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 13 May 2019 04:18:30 -0000 Subject: [Python-checkins] Name individual Travis CI jobs (GH-13268) Message-ID: https://github.com/python/cpython/commit/af070c12970db34f004adf2e20306a285f06f3a9 commit: af070c12970db34f004adf2e20306a285f06f3a9 branch: master author: Gordon P. Hemsley committer: Inada Naoki date: 2019-05-13T13:18:19+09:00 summary: Name individual Travis CI jobs (GH-13268) files: M .travis.yml diff --git a/.travis.yml b/.travis.yml index 207649730c21..c1efe24b646b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,8 @@ matrix: allow_failures: - env: OPTIONAL=true include: - - os: linux + - name: "CPython tests" + os: linux language: c compiler: clang # gcc also works, but to keep the # of concurrent builds down, we use one C @@ -43,7 +44,8 @@ matrix: apt: packages: - xvfb - - os: linux + - name: "Documentation build" + os: linux language: python # Build the docs against a stable version of Python so code bugs don't hold up doc-related PRs. python: 3.6 @@ -56,7 +58,8 @@ matrix: - python -m pip install sphinx==1.8.2 blurb python-docs-theme script: - make check suspicious html SPHINXOPTS="-q -W -j4" - - os: linux + - name: "Documentation tests" + os: linux language: c compiler: clang env: TESTING=doctest @@ -70,7 +73,8 @@ matrix: - make -C Doc/ PYTHON=../python venv script: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W -j4" doctest - - os: osx + - name: "Mac OS X tests" + os: osx language: c compiler: clang # Testing under macOS is optional until testing stability has been demonstrated. @@ -79,7 +83,8 @@ matrix: # Python 3 is needed for Argument Clinic and multissl - HOMEBREW_NO_AUTO_UPDATE=1 brew install xz python3 - export PATH=$(brew --prefix)/bin:$(brew --prefix)/sbin:$PATH - - os: linux + - name: "Test code coverage (Python)" + os: linux language: c compiler: gcc env: OPTIONAL=true @@ -101,7 +106,8 @@ matrix: # Make the `coverage` command available to Codecov w/ a version of Python that can parse all source files. - source ./venv/bin/activate - bash <(curl -s https://codecov.io/bash) - - os: linux + - name: "Test code coverage (C)" + os: linux language: c compiler: gcc env: OPTIONAL=true From webhook-mailer at python.org Mon May 13 03:23:44 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Mon, 13 May 2019 07:23:44 -0000 Subject: [Python-checkins] bpo-36783: Add new references for C API Documentation changes (GH-13204) Message-ID: https://github.com/python/cpython/commit/d28772ab6967fea136c0707f0207673ebad66f61 commit: d28772ab6967fea136c0707f0207673ebad66f61 branch: master author: Edison A <20975616+SimiCode at users.noreply.github.com> committer: St?phane Wirtel date: 2019-05-13T09:23:38+02:00 summary: bpo-36783: Add new references for C API Documentation changes (GH-13204) files: M Doc/c-api/datetime.rst M Doc/data/refcounts.dat diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index b7949e235005..77b1b216744b 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -106,6 +106,12 @@ Macros to create objects: .. versionadded:: 3.6 +.. c:function:: PyObject* PyTime_FromTime(int hour, int minute, int second, int usecond) + + Return a :class:`datetime.time` object with the specified hour, minute, second and + microsecond. + + .. c:function:: PyObject* PyTime_FromTimeAndFold(int hour, int minute, int second, int usecond, int fold) Return a :class:`datetime.time` object with the specified hour, minute, second, @@ -114,12 +120,6 @@ Macros to create objects: .. versionadded:: 3.6 -.. c:function:: PyObject* PyTime_FromTime(int hour, int minute, int second, int usecond) - - Return a :class:`datetime.time` object with the specified hour, minute, second and - microsecond. - - .. c:function:: PyObject* PyDelta_FromDSU(int days, int seconds, int useconds) Return a :class:`datetime.timedelta` object representing the given number diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 35527c179f34..213ddcb61fae 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -413,6 +413,16 @@ PyDateTime_FromDateAndTime:int:minute:: PyDateTime_FromDateAndTime:int:second:: PyDateTime_FromDateAndTime:int:usecond:: +PyDateTime_FromDateAndTimeAndFold:PyObject*::+1: +PyDateTime_FromDateAndTimeAndFold:int:year:: +PyDateTime_FromDateAndTimeAndFold:int:month:: +PyDateTime_FromDateAndTimeAndFold:int:day:: +PyDateTime_FromDateAndTimeAndFold:int:hour:: +PyDateTime_FromDateAndTimeAndFold:int:minute:: +PyDateTime_FromDateAndTimeAndFold:int:second:: +PyDateTime_FromDateAndTimeAndFold:int:usecond:: +PyDateTime_FromDateAndTimeAndFold:int:fold:: + PyDateTime_FromTimestamp:PyObject*::+1: PyDateTime_FromTimestamp:PyObject*:args:0: @@ -2210,6 +2220,13 @@ PyTime_FromTime:int:minute:: PyTime_FromTime:int:second:: PyTime_FromTime:int:usecond:: +PyTime_FromTimeAndFold:PyObject*::+1: +PyTime_FromTimeAndFold:int:hour:: +PyTime_FromTimeAndFold:int:minute:: +PyTime_FromTimeAndFold:int:second:: +PyTime_FromTimeAndFold:int:usecond:: +PyTime_FromTimeAndFold:int:fold:: + PyTraceMalloc_Track:int::: PyTraceMalloc_Track:unsigned int:domain:: PyTraceMalloc_Track:uintptr_t:ptr:: From webhook-mailer at python.org Mon May 13 03:51:02 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 13 May 2019 07:51:02 -0000 Subject: [Python-checkins] bpo-6584: Add a BadGzipFile exception to the gzip module. (GH-13022) Message-ID: https://github.com/python/cpython/commit/cf599f6f6f1c392d8f12936982a370d533782195 commit: cf599f6f6f1c392d8f12936982a370d533782195 branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-05-13T10:50:52+03:00 summary: bpo-6584: Add a BadGzipFile exception to the gzip module. (GH-13022) Co-Authored-By: Filip Gruszczy?ski Co-Authored-By: Michele Orr? files: A Misc/NEWS.d/next/Library/2019-04-30-04-34-53.bpo-6584.Hzp9-P.rst M Doc/library/gzip.rst M Doc/whatsnew/3.8.rst M Lib/gzip.py M Lib/test/test_gzip.py diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst index 8850a33f4abb..3349a94446d0 100644 --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -59,6 +59,14 @@ The module defines the following items: .. versionchanged:: 3.6 Accepts a :term:`path-like object`. +.. exception:: BadGzipFile + + An exception raised for invalid gzip files. It inherits :exc:`OSError`. + :exc:`EOFError` and :exc:`zlib.error` can also be raised for invalid gzip + files. + + .. versionadded:: 3.8 + .. class:: GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None) Constructor for the :class:`GzipFile` class, which simulates most of the diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 2cfb110b3d50..684656fc2a58 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -304,6 +304,11 @@ gzip Added the *mtime* parameter to :func:`gzip.compress` for reproducible output. (Contributed by Guo Ci Teo in :issue:`34898`.) +A :exc:`~gzip.BadGzipFile` exception is now raised instead of :exc:`OSError` +for certain types of invalid or corrupt gzip files. +(Contributed by Filip Gruszczy?ski, Michele Orr?, and Zackery Spytz in +:issue:`6584`.) + idlelib and IDLE ---------------- diff --git a/Lib/gzip.py b/Lib/gzip.py index 7c8618741988..2968f475efad 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -11,7 +11,7 @@ import io import _compression -__all__ = ["GzipFile", "open", "compress", "decompress"] +__all__ = ["BadGzipFile", "GzipFile", "open", "compress", "decompress"] FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16 @@ -112,6 +112,11 @@ def seek(self, off): def seekable(self): return True # Allows fast-forwarding even in unseekable streams + +class BadGzipFile(OSError): + """Exception raised in some cases for invalid gzip files.""" + + class GzipFile(_compression.BaseStream): """The GzipFile class simulates most of the methods of a file object with the exception of the truncate() method. @@ -413,12 +418,12 @@ def _read_gzip_header(self): return False if magic != b'\037\213': - raise OSError('Not a gzipped file (%r)' % magic) + raise BadGzipFile('Not a gzipped file (%r)' % magic) (method, flag, self._last_mtime) = struct.unpack(" https://github.com/python/cpython/commit/3aef48e3157f52a8bcdbacf47a35d0016348735e commit: 3aef48e3157f52a8bcdbacf47a35d0016348735e branch: master author: Victor Stinner committer: GitHub date: 2019-05-13T10:42:31+02:00 summary: bpo-36778: Update cp65001 codec documentation (GH-13240) Remove cp65001 from the codecs table, list it as an alias of utf_8 and add a versionchanged markup. files: M Doc/library/codecs.rst diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 8d3daa35d153..2e9314e0fab7 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1106,10 +1106,6 @@ particular, the following variants typically exist: +-----------------+--------------------------------+--------------------------------+ | cp1258 | windows-1258 | Vietnamese | +-----------------+--------------------------------+--------------------------------+ -| cp65001 | | Alias to ``utf_8`` encoding | -| | | | -| | | .. versionadded:: 3.3 | -+-----------------+--------------------------------+--------------------------------+ | euc_jp | eucjp, ujis, u-jis | Japanese | +-----------------+--------------------------------+--------------------------------+ | euc_jis_2004 | jisx0213, eucjis2004 | Japanese | @@ -1234,7 +1230,7 @@ particular, the following variants typically exist: +-----------------+--------------------------------+--------------------------------+ | utf_7 | U7, unicode-1-1-utf-7 | all languages | +-----------------+--------------------------------+--------------------------------+ -| utf_8 | U8, UTF, utf8 | all languages | +| utf_8 | U8, UTF, utf8, cp65001 | all languages | +-----------------+--------------------------------+--------------------------------+ | utf_8_sig | | all languages | +-----------------+--------------------------------+--------------------------------+ @@ -1245,6 +1241,9 @@ particular, the following variants typically exist: The utf-32\* decoders no longer decode byte sequences that correspond to surrogate code points. +.. versionchanged:: 3.8 + ``cp65001`` is now an alias to ``utf_8``. + Python Specific Encodings ------------------------- From webhook-mailer at python.org Mon May 13 06:35:43 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 May 2019 10:35:43 -0000 Subject: [Python-checkins] bpo-36728: Remove PyEval_ReInitThreads() from C API (GH-13241) Message-ID: https://github.com/python/cpython/commit/d5d9e81ce9a7efc5bc14a5c21398d1ef6f626884 commit: d5d9e81ce9a7efc5bc14a5c21398d1ef6f626884 branch: master author: Victor Stinner committer: GitHub date: 2019-05-13T12:35:37+02:00 summary: bpo-36728: Remove PyEval_ReInitThreads() from C API (GH-13241) Remove the PyEval_ReInitThreads() function from the Python C API. It should not be called explicitly: use PyOS_AfterFork_Child() instead. Rename PyEval_ReInitThreads() to _PyEval_ReInitThreads() and add a 'runtime' parameter. files: A Misc/NEWS.d/next/C API/2019-05-11-03-56-23.bpo-36728.FR-dMP.rst M Doc/whatsnew/3.8.rst M Include/ceval.h M Include/internal/pycore_ceval.h M Modules/posixmodule.c M Python/ceval.c diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 684656fc2a58..ac253059f328 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -990,6 +990,11 @@ Changes in the Python API Changes in the C API -------------------- +* The :c:func:`PyEval_ReInitThreads` function has been removed from the C API. + It should not be called explicitly: use :c:func:`PyOS_AfterFork_Child` + instead. + (Contributed by Victor Stinner in :issue:`36728`.) + * On Unix, C extensions are no longer linked to libpython except on Android. When Python is embedded, ``libpython`` must not be loaded with ``RTLD_LOCAL``, but ``RTLD_GLOBAL`` instead. Previously, using diff --git a/Include/ceval.h b/Include/ceval.h index 2d4b67d092bc..8cdf353b05fd 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -195,7 +195,6 @@ PyAPI_FUNC(void) PyEval_AcquireLock(void) Py_DEPRECATED(3.2); PyAPI_FUNC(void) PyEval_ReleaseLock(void) /* Py_DEPRECATED(3.2) */; PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); -PyAPI_FUNC(void) PyEval_ReInitThreads(void); #ifndef Py_LIMITED_API PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds); diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index cdc73a36e5bc..7a3166e86dab 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -24,6 +24,8 @@ PyAPI_FUNC(int) _PyEval_AddPendingCall( void *arg); PyAPI_FUNC(void) _PyEval_SignalAsyncExc( struct _ceval_runtime_state *ceval); +PyAPI_FUNC(void) _PyEval_ReInitThreads( + _PyRuntimeState *runtime); #ifdef __cplusplus } diff --git a/Misc/NEWS.d/next/C API/2019-05-11-03-56-23.bpo-36728.FR-dMP.rst b/Misc/NEWS.d/next/C API/2019-05-11-03-56-23.bpo-36728.FR-dMP.rst new file mode 100644 index 000000000000..c691cc412c21 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-05-11-03-56-23.bpo-36728.FR-dMP.rst @@ -0,0 +1,2 @@ +The :c:func:`PyEval_ReInitThreads` function has been removed from the C API. +It should not be called explicitly: use :c:func:`PyOS_AfterFork_Child` instead. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index aa77094da06a..aca64efeb1e3 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -25,14 +25,25 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#ifdef MS_WINDOWS + /* include early to avoid conflict with pycore_condvar.h: + + #define WIN32_LEAN_AND_MEAN + #include + + FSCTL_GET_REPARSE_POINT is not exported with WIN32_LEAN_AND_MEAN. */ +# include +#endif + +#include "pycore_ceval.h" /* _PyEval_ReInitThreads() */ +#include "pycore_pystate.h" /* _PyRuntime */ #include "pythread.h" #include "structmember.h" #ifndef MS_WINDOWS -#include "posixmodule.h" +# include "posixmodule.h" #else -#include "winreparse.h" +# include "winreparse.h" #endif -#include "pycore_pystate.h" /* On android API level 21, 'AT_EACCESS' is not declared although * HAVE_FACCESSAT is defined. */ @@ -424,7 +435,7 @@ PyOS_AfterFork_Child(void) _PyRuntimeState *runtime = &_PyRuntime; _PyGILState_Reinit(runtime); _PyInterpreterState_DeleteExceptMain(runtime); - PyEval_ReInitThreads(); + _PyEval_ReInitThreads(runtime); _PyImport_ReInitLock(); _PySignal_AfterFork(); _PyRuntimeState_ReInitThreads(runtime); diff --git a/Python/ceval.c b/Python/ceval.c index 17439533a3f2..1bb4704572b4 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -289,9 +289,8 @@ PyEval_ReleaseThread(PyThreadState *tstate) */ void -PyEval_ReInitThreads(void) +_PyEval_ReInitThreads(_PyRuntimeState *runtime) { - _PyRuntimeState *runtime = &_PyRuntime; struct _ceval_runtime_state *ceval = &runtime->ceval; if (!gil_created(&ceval->gil)) { return; From webhook-mailer at python.org Mon May 13 07:38:27 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Mon, 13 May 2019 11:38:27 -0000 Subject: [Python-checkins] Changes to the documentation of normcase (GH-4725) Message-ID: https://github.com/python/cpython/commit/32d1458b2e2e00eeb29022179eeb04b83fb7f3c4 commit: 32d1458b2e2e00eeb29022179eeb04b83fb7f3c4 branch: master author: Kexuan Sun committer: Cheryl Sabella date: 2019-05-13T07:38:20-04:00 summary: Changes to the documentation of normcase (GH-4725) files: M Doc/library/os.path.rst diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index a167e3b885fd..8e7ee8bfe784 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -87,7 +87,7 @@ the :mod:`glob` module.) .. function:: commonpath(paths) Return the longest common sub-path of each pathname in the sequence - *paths*. Raise ValueError if *paths* contains both absolute and relative + *paths*. Raise :exc:`ValueError` if *paths* contains both absolute and relative pathnames, or if *paths* is empty. Unlike :func:`commonprefix`, this returns a valid path. @@ -324,9 +324,9 @@ the :mod:`glob` module.) .. function:: normcase(path) - Normalize the case of a pathname. On Unix and Mac OS X, this returns the - path unchanged; on case-insensitive filesystems, it converts the path to - lowercase. On Windows, it also converts forward slashes to backward slashes. + Normalize the case of a pathname. On Windows, convert all characters in the + pathname to lowercase, and also convert forward slashes to backward slashes. + On other operating systems, return the path unchanged. Raise a :exc:`TypeError` if the type of *path* is not ``str`` or ``bytes`` (directly or indirectly through the :class:`os.PathLike` interface). From webhook-mailer at python.org Mon May 13 08:29:43 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Mon, 13 May 2019 12:29:43 -0000 Subject: [Python-checkins] bpo-36008: Doc update for 3.8 migration (GH-12887) Message-ID: https://github.com/python/cpython/commit/3e2afd78babe5bd270e7f3b9df8796eeabc79865 commit: 3e2afd78babe5bd270e7f3b9df8796eeabc79865 branch: master author: Utkarsh Gupta committer: Cheryl Sabella date: 2019-05-13T08:29:39-04:00 summary: bpo-36008: Doc update for 3.8 migration (GH-12887) files: M Doc/tutorial/interpreter.rst M Doc/using/cmdline.rst M Doc/using/windows.rst diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst index ab92af044e7c..dddfd850cd29 100644 --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -24,11 +24,11 @@ Python guru or system administrator. (E.g., :file:`/usr/local/python` is a popular alternative location.) On Windows machines, the Python installation is usually placed in -:file:`C:\\Python36`, though you can change this when you're running the +:file:`C:\\Python38`, though you can change this when you're running the installer. To add this directory to your path, you can type the following command into :ref:`a command prompt window `:: - set path=%path%;C:\python36 + set path=%path%;C:\python38 Typing an end-of-file character (:kbd:`Control-D` on Unix, :kbd:`Control-Z` on Windows) at the primary prompt causes the interpreter to exit with a zero exit diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index fd47ce2ab538..5ae3cc808b34 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -182,13 +182,13 @@ Generic options .. code-block:: none - Python 3.6.0b2+ + Python 3.8.0b2+ When given twice, print more information about the build, like: .. code-block:: none - Python 3.6.0b2+ (3.6:84a3c5003510+, Oct 26 2016, 02:33:55) + Python 3.8.0b2+ (3.8:0c076caaa8, Apr 20 2019, 21:55:00) [GCC 6.2.0 20161005] .. versionadded:: 3.6 diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 2f3eb0ea3f06..1f8eb16e5054 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -214,13 +214,13 @@ of available options is shown below. For example, to silently install a default, system-wide Python installation, you could use the following command (from an elevated command prompt):: - python-3.6.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 + python-3.8.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 To allow users to easily install a personal copy of Python without the test suite, you could provide a shortcut with the following command. This will display a simplified initial page and disallow customization:: - python-3.6.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0 + python-3.8.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0 SimpleInstall=1 SimpleInstallDescription="Just for me, no test suite." (Note that omitting the launcher also omits file associations, and is only @@ -257,13 +257,13 @@ where a large number of installations are going to be performed it is very useful to have a locally cached copy. Execute the following command from Command Prompt to download all possible -required files. Remember to substitute ``python-3.6.0.exe`` for the actual +required files. Remember to substitute ``python-3.8.0.exe`` for the actual name of your installer, and to create layouts in their own directories to avoid collisions between files with the same name. :: - python-3.6.0.exe /layout [optional target directory] + python-3.8.0.exe /layout [optional target directory] You may also specify the ``/quiet`` option to hide the progress display. @@ -530,7 +530,7 @@ To temporarily set environment variables, open Command Prompt and use the .. code-block:: doscon - C:\>set PATH=C:\Program Files\Python 3.6;%PATH% + C:\>set PATH=C:\Program Files\Python 3.8;%PATH% C:\>set PYTHONPATH=%PYTHONPATH%;C:\My_python_lib C:\>python @@ -603,7 +603,7 @@ of your Python installation, delimited by a semicolon from other entries. An example variable could look like this (assuming the first two entries already existed):: - C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.6 + C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.8 .. _launcher: From webhook-mailer at python.org Mon May 13 08:31:34 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 13 May 2019 12:31:34 -0000 Subject: [Python-checkins] bpo-36807: When saving a file in IDLE, call flush and fsync (#13102) Message-ID: https://github.com/python/cpython/commit/4f098b35f58e911639f8e9adc393d5cf5c792e7f commit: 4f098b35f58e911639f8e9adc393d5cf5c792e7f branch: master author: Guido van Rossum committer: Terry Jan Reedy date: 2019-05-13T08:31:29-04:00 summary: bpo-36807: When saving a file in IDLE, call flush and fsync (#13102) files: A Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst M Lib/idlelib/iomenu.py diff --git a/Lib/idlelib/iomenu.py b/Lib/idlelib/iomenu.py index f5bced597aa8..b9e813be0630 100644 --- a/Lib/idlelib/iomenu.py +++ b/Lib/idlelib/iomenu.py @@ -384,6 +384,8 @@ def writefile(self, filename): try: with open(filename, "wb") as f: f.write(chars) + f.flush() + os.fsync(f.fileno()) return True except OSError as msg: tkMessageBox.showerror("I/O Error", str(msg), diff --git a/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst b/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst new file mode 100644 index 000000000000..18b31b1fe505 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst @@ -0,0 +1 @@ +When saving a file, call os.flush() so bits are flushed to e.g. USB drive. From webhook-mailer at python.org Mon May 13 09:03:14 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Mon, 13 May 2019 13:03:14 -0000 Subject: [Python-checkins] bpo-33882: mention breakpoint() in debugger-related FAQ (GH-7759) (GH-13077) Message-ID: https://github.com/python/cpython/commit/af5ef3e1077bc2ed177a7c8598f8ecc756ecf6f9 commit: af5ef3e1077bc2ed177a7c8598f8ecc756ecf6f9 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: St?phane Wirtel date: 2019-05-13T15:03:10+02:00 summary: bpo-33882: mention breakpoint() in debugger-related FAQ (GH-7759) (GH-13077) (cherry picked from commit cf48e55f7f7718482fa712552f0cbc0aea1c826f) Co-authored-by: Andre Delfino files: M Doc/faq/programming.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 31614189a62d..f14e8cc824ef 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -16,6 +16,9 @@ Is there a source code level debugger with breakpoints, single-stepping, etc.? Yes. +Several debuggers for Python are described below, and the built-in function +:func:`breakpoint` allows you to drop into any of them. + The pdb module is a simple but adequate console-mode debugger for Python. It is part of the standard Python library, and is :mod:`documented in the Library Reference Manual `. You can also write your own debugger by using the code From webhook-mailer at python.org Mon May 13 09:05:23 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 13 May 2019 13:05:23 -0000 Subject: [Python-checkins] bpo-34682: Wording and grammatical changes to the doc(https://docs.python.org/3) (GH-13120) Message-ID: https://github.com/python/cpython/commit/778a9107586e29421af3a08209cf0b557c1fe5bc commit: 778a9107586e29421af3a08209cf0b557c1fe5bc branch: master author: divyag9 committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-13T06:05:20-07:00 summary: bpo-34682: Wording and grammatical changes to the doc(https://docs.python.org/3) (GH-13120) https://bugs.python.org/issue34682 files: M Doc/reference/executionmodel.rst M Doc/reference/expressions.rst M Doc/reference/lexical_analysis.rst diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index ba7130d63621..49cb86b56084 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -243,7 +243,7 @@ re-entering the offending piece of code from the top). When an exception is not handled at all, the interpreter terminates execution of the program, or returns to its interactive main loop. In either case, it prints -a stack backtrace, except when the exception is :exc:`SystemExit`. +a stack traceback, except when the exception is :exc:`SystemExit`. Exceptions are identified by class instances. The :keyword:`except` clause is selected depending on the class of the instance: it must reference the class of diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 79ba4568a54b..52b41929d7bc 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -144,7 +144,7 @@ the single expression that makes up the expression list. .. index:: pair: empty; tuple An empty pair of parentheses yields an empty tuple object. Since tuples are -immutable, the rules for literals apply (i.e., two occurrences of the empty +immutable, the same rules as for literals apply (i.e., two occurrences of the empty tuple may or may not yield the same object). .. index:: @@ -479,8 +479,8 @@ will raise :exc:`AttributeError` or :exc:`TypeError`, while When the underlying iterator is complete, the :attr:`~StopIteration.value` attribute of the raised :exc:`StopIteration` instance becomes the value of the yield expression. It can be either set explicitly when raising -:exc:`StopIteration`, or automatically when the sub-iterator is a generator -(by returning a value from the sub-generator). +:exc:`StopIteration`, or automatically when the subiterator is a generator +(by returning a value from the subgenerator). .. versionchanged:: 3.3 Added ``yield from `` to delegate control flow to a subiterator. @@ -499,7 +499,7 @@ on the right hand side of an assignment statement. :pep:`380` - Syntax for Delegating to a Subgenerator The proposal to introduce the :token:`yield_from` syntax, making delegation - to sub-generators easy. + to subgenerators easy. :pep:`525` - Asynchronous Generators The proposal that expanded on :pep:`492` by adding generator capabilities to @@ -608,7 +608,7 @@ Asynchronous generator functions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The presence of a yield expression in a function or method defined using -:keyword:`async def` further defines the function as a +:keyword:`async def` further defines the function as an :term:`asynchronous generator` function. When an asynchronous generator function is called, it returns an @@ -673,13 +673,13 @@ which are used to control the execution of a generator function. Returns an awaitable which when run starts to execute the asynchronous generator or resumes it at the last executed yield expression. When an - asynchronous generator function is resumed with a :meth:`~agen.__anext__` + asynchronous generator function is resumed with an :meth:`~agen.__anext__` method, the current yield expression always evaluates to :const:`None` in the returned awaitable, which when run will continue to the next yield expression. The value of the :token:`expression_list` of the yield expression is the value of the :exc:`StopIteration` exception raised by the completing coroutine. If the asynchronous generator exits without - yielding another value, the awaitable instead raises an + yielding another value, the awaitable instead raises a :exc:`StopAsyncIteration` exception, signalling that the asynchronous iteration has completed. @@ -707,7 +707,7 @@ which are used to control the execution of a generator function. where the asynchronous generator was paused, and returns the next value yielded by the generator function as the value of the raised :exc:`StopIteration` exception. If the asynchronous generator exits - without yielding another value, an :exc:`StopAsyncIteration` exception is + without yielding another value, a :exc:`StopAsyncIteration` exception is raised by the awaitable. If the generator function does not catch the passed-in exception, or raises a different exception, then when the awaitable is run that exception @@ -1579,7 +1579,7 @@ if :keyword:`in` raised that exception). pair: membership; test object: sequence -The operator :keyword:`not in` is defined to have the inverse true value of +The operator :keyword:`not in` is defined to have the inverse truth value of :keyword:`in`. .. index:: @@ -1594,8 +1594,8 @@ The operator :keyword:`not in` is defined to have the inverse true value of Identity comparisons -------------------- -The operators :keyword:`is` and :keyword:`is not` test for object identity: ``x -is y`` is true if and only if *x* and *y* are the same object. Object identity +The operators :keyword:`is` and :keyword:`is not` test for an object's identity: ``x +is y`` is true if and only if *x* and *y* are the same object. An Object's identity is determined using the :meth:`id` function. ``x is not y`` yields the inverse truth value. [#]_ diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 1cbe421ded98..cc1b2f57a70e 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -70,7 +70,7 @@ Comments A comment starts with a hash character (``#``) that is not part of a string literal, and ends at the end of the physical line. A comment signifies the end of the logical line unless the implicit line joining rules are invoked. Comments -are ignored by the syntax; they are not tokens. +are ignored by the syntax. .. _encodings: From webhook-mailer at python.org Mon May 13 09:48:56 2019 From: webhook-mailer at python.org (Julien Palard) Date: Mon, 13 May 2019 13:48:56 -0000 Subject: [Python-checkins] [3.7] bpo-34682: Wording and grammatical changes to the doc(https://docs.python.org/3) (GH-13120) (GH-13281) Message-ID: https://github.com/python/cpython/commit/074d7c44a474680122ed869bb6be89c1f4f18f12 commit: 074d7c44a474680122ed869bb6be89c1f4f18f12 branch: 3.7 author: St?phane Wirtel committer: Julien Palard date: 2019-05-13T15:48:49+02:00 summary: [3.7] bpo-34682: Wording and grammatical changes to the doc(https://docs.python.org/3) (GH-13120) (GH-13281) https://bugs.python.org/issue34682 (cherry picked from commit 778a9107586e29421af3a08209cf0b557c1fe5bc) Co-authored-by: divyag9 files: M Doc/reference/executionmodel.rst M Doc/reference/expressions.rst M Doc/reference/lexical_analysis.rst diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index ba7130d63621..49cb86b56084 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -243,7 +243,7 @@ re-entering the offending piece of code from the top). When an exception is not handled at all, the interpreter terminates execution of the program, or returns to its interactive main loop. In either case, it prints -a stack backtrace, except when the exception is :exc:`SystemExit`. +a stack traceback, except when the exception is :exc:`SystemExit`. Exceptions are identified by class instances. The :keyword:`except` clause is selected depending on the class of the instance: it must reference the class of diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index d7da7ad4b8b2..3fb27c8a8031 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -144,7 +144,7 @@ the single expression that makes up the expression list. .. index:: pair: empty; tuple An empty pair of parentheses yields an empty tuple object. Since tuples are -immutable, the rules for literals apply (i.e., two occurrences of the empty +immutable, the same rules as for literals apply (i.e., two occurrences of the empty tuple may or may not yield the same object). .. index:: @@ -484,8 +484,8 @@ will raise :exc:`AttributeError` or :exc:`TypeError`, while When the underlying iterator is complete, the :attr:`~StopIteration.value` attribute of the raised :exc:`StopIteration` instance becomes the value of the yield expression. It can be either set explicitly when raising -:exc:`StopIteration`, or automatically when the sub-iterator is a generator -(by returning a value from the sub-generator). +:exc:`StopIteration`, or automatically when the subiterator is a generator +(by returning a value from the subgenerator). .. versionchanged:: 3.3 Added ``yield from `` to delegate control flow to a subiterator. @@ -504,7 +504,7 @@ on the right hand side of an assignment statement. :pep:`380` - Syntax for Delegating to a Subgenerator The proposal to introduce the :token:`yield_from` syntax, making delegation - to sub-generators easy. + to subgenerators easy. :pep:`525` - Asynchronous Generators The proposal that expanded on :pep:`492` by adding generator capabilities to @@ -613,7 +613,7 @@ Asynchronous generator functions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The presence of a yield expression in a function or method defined using -:keyword:`async def` further defines the function as a +:keyword:`async def` further defines the function as an :term:`asynchronous generator` function. When an asynchronous generator function is called, it returns an @@ -678,13 +678,13 @@ which are used to control the execution of a generator function. Returns an awaitable which when run starts to execute the asynchronous generator or resumes it at the last executed yield expression. When an - asynchronous generator function is resumed with a :meth:`~agen.__anext__` + asynchronous generator function is resumed with an :meth:`~agen.__anext__` method, the current yield expression always evaluates to :const:`None` in the returned awaitable, which when run will continue to the next yield expression. The value of the :token:`expression_list` of the yield expression is the value of the :exc:`StopIteration` exception raised by the completing coroutine. If the asynchronous generator exits without - yielding another value, the awaitable instead raises an + yielding another value, the awaitable instead raises a :exc:`StopAsyncIteration` exception, signalling that the asynchronous iteration has completed. @@ -712,7 +712,7 @@ which are used to control the execution of a generator function. where the asynchronous generator was paused, and returns the next value yielded by the generator function as the value of the raised :exc:`StopIteration` exception. If the asynchronous generator exits - without yielding another value, an :exc:`StopAsyncIteration` exception is + without yielding another value, a :exc:`StopAsyncIteration` exception is raised by the awaitable. If the generator function does not catch the passed-in exception, or raises a different exception, then when the awaitable is run that exception @@ -1584,7 +1584,7 @@ if :keyword:`in` raised that exception). pair: membership; test object: sequence -The operator :keyword:`not in` is defined to have the inverse true value of +The operator :keyword:`not in` is defined to have the inverse truth value of :keyword:`in`. .. index:: @@ -1599,8 +1599,8 @@ The operator :keyword:`not in` is defined to have the inverse true value of Identity comparisons -------------------- -The operators :keyword:`is` and :keyword:`is not` test for object identity: ``x -is y`` is true if and only if *x* and *y* are the same object. Object identity +The operators :keyword:`is` and :keyword:`is not` test for an object's identity: ``x +is y`` is true if and only if *x* and *y* are the same object. An Object's identity is determined using the :meth:`id` function. ``x is not y`` yields the inverse truth value. [#]_ diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index b3c3215a9841..7b90f3b31c37 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -70,7 +70,7 @@ Comments A comment starts with a hash character (``#``) that is not part of a string literal, and ends at the end of the physical line. A comment signifies the end of the logical line unless the implicit line joining rules are invoked. Comments -are ignored by the syntax; they are not tokens. +are ignored by the syntax. .. _encodings: From webhook-mailer at python.org Mon May 13 10:22:57 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 May 2019 14:22:57 -0000 Subject: [Python-checkins] bpo-36728: Remove PyEval_ReInitThreads documentation (GH-13282) Message-ID: https://github.com/python/cpython/commit/c1f7262f7013074613805347db2276f8b5e0e3a4 commit: c1f7262f7013074613805347db2276f8b5e0e3a4 branch: master author: Victor Stinner committer: GitHub date: 2019-05-13T16:22:51+02:00 summary: bpo-36728: Remove PyEval_ReInitThreads documentation (GH-13282) files: M Doc/c-api/init.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 367c069a7ff4..b30649498a92 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -877,13 +877,6 @@ code, or when embedding the Python interpreter: and is not released. -.. c:function:: void PyEval_ReInitThreads() - - This function is called from :c:func:`PyOS_AfterFork_Child` to ensure - that newly created child processes don't hold locks referring to threads - which are not running in the child process. - - The following functions use thread-local storage, and are not compatible with sub-interpreters: From webhook-mailer at python.org Mon May 13 10:48:56 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 May 2019 14:48:56 -0000 Subject: [Python-checkins] bpo-36903: Fix ResourceWarning in test_logging (GH-13283) Message-ID: https://github.com/python/cpython/commit/2c10538d11fa9be9a1a9f21605861e10ec4fa207 commit: 2c10538d11fa9be9a1a9f21605861e10ec4fa207 branch: master author: Xtreak committer: Victor Stinner date: 2019-05-13T16:48:51+02:00 summary: bpo-36903: Fix ResourceWarning in test_logging (GH-13283) files: M Lib/test/test_logging.py diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index bc99c3adbe34..b884753ad397 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -684,6 +684,7 @@ def emit(self, record): self.assertEqual(len(logging._handlers), 0) refed_h = _OurHandler() + self.addCleanup(refed_h.sub_handler.stream.close) refed_h.name = 'because we need at least one for this test' self.assertGreater(len(logging._handlers), 0) self.assertGreater(len(logging._at_fork_reinit_lock_weakset), 1) From webhook-mailer at python.org Mon May 13 11:12:54 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 May 2019 15:12:54 -0000 Subject: [Python-checkins] bpo-36900: import.c uses PyInterpreterState.core_config (GH-13278) Message-ID: https://github.com/python/cpython/commit/410b85a7f701be280eb15b0ca4fe116e86f1d008 commit: 410b85a7f701be280eb15b0ca4fe116e86f1d008 branch: master author: Victor Stinner committer: GitHub date: 2019-05-13T17:12:45+02:00 summary: bpo-36900: import.c uses PyInterpreterState.core_config (GH-13278) Move _PyImportZip_Init() to the internal C API and add an 'interp' parameter. files: M Include/import.h M Include/internal/pycore_pylifecycle.h M Python/import.c M Python/pylifecycle.c diff --git a/Include/import.h b/Include/import.h index c664803478a5..13c614933c7c 100644 --- a/Include/import.h +++ b/Include/import.h @@ -8,8 +8,6 @@ extern "C" { #endif #ifndef Py_LIMITED_API -PyAPI_FUNC(_PyInitError) _PyImportZip_Init(void); - PyMODINIT_FUNC PyInit__imp(void); #endif /* !Py_LIMITED_API */ PyAPI_FUNC(long) PyImport_GetMagicNumber(void); diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 7144bbcda7cb..0d83acdf28aa 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -54,6 +54,8 @@ extern int _PyFloat_Init(void); extern _PyInitError _Py_HashRandomization_Init(const _PyCoreConfig *); extern _PyInitError _PyTypes_Init(void); +extern _PyInitError _PyImportZip_Init(PyInterpreterState *interp); + /* Various internal finalizers */ diff --git a/Python/import.c b/Python/import.c index 9290f39c0ae2..c634edb4c7fc 100644 --- a/Python/import.c +++ b/Python/import.c @@ -91,7 +91,7 @@ _PyImportHooks_Init(void) } _PyInitError -_PyImportZip_Init(void) +_PyImportZip_Init(PyInterpreterState *interp) { PyObject *path_hooks, *zipimport; int err = 0; @@ -102,14 +102,17 @@ _PyImportZip_Init(void) goto error; } - if (Py_VerboseFlag) + int verbose = interp->core_config.verbose; + if (verbose) { PySys_WriteStderr("# installing zipimport hook\n"); + } zipimport = PyImport_ImportModule("zipimport"); if (zipimport == NULL) { PyErr_Clear(); /* No zip import module -- okay */ - if (Py_VerboseFlag) + if (verbose) { PySys_WriteStderr("# can't import zipimport\n"); + } } else { _Py_IDENTIFIER(zipimporter); @@ -118,9 +121,9 @@ _PyImportZip_Init(void) Py_DECREF(zipimport); if (zipimporter == NULL) { PyErr_Clear(); /* No zipimporter object -- okay */ - if (Py_VerboseFlag) - PySys_WriteStderr( - "# can't import zipimport.zipimporter\n"); + if (verbose) { + PySys_WriteStderr("# can't import zipimport.zipimporter\n"); + } } else { /* sys.path_hooks.insert(0, zipimporter) */ @@ -129,9 +132,9 @@ _PyImportZip_Init(void) if (err < 0) { goto error; } - if (Py_VerboseFlag) - PySys_WriteStderr( - "# installed zipimport hook\n"); + if (verbose) { + PySys_WriteStderr("# installed zipimport hook\n"); + } } } @@ -415,22 +418,26 @@ PyImport_Cleanup(void) /* XXX Perhaps these precautions are obsolete. Who knows? */ - if (Py_VerboseFlag) + int verbose = interp->core_config.verbose; + if (verbose) { PySys_WriteStderr("# clear builtins._\n"); + } if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) { PyErr_WriteUnraisable(NULL); } for (p = sys_deletes; *p != NULL; p++) { - if (Py_VerboseFlag) + if (verbose) { PySys_WriteStderr("# clear sys.%s\n", *p); + } if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) { PyErr_WriteUnraisable(NULL); } } for (p = sys_files; *p != NULL; p+=2) { - if (Py_VerboseFlag) + if (verbose) { PySys_WriteStderr("# restore sys.%s\n", *p); + } value = _PyDict_GetItemStringWithError(interp->sysdict, *(p+1)); if (value == NULL) { if (PyErr_Occurred()) { @@ -469,8 +476,9 @@ PyImport_Cleanup(void) } #define CLEAR_MODULE(name, mod) \ if (PyModule_Check(mod)) { \ - if (Py_VerboseFlag && PyUnicode_Check(name)) \ + if (verbose && PyUnicode_Check(name)) { \ PySys_FormatStderr("# cleanup[2] removing %U\n", name); \ + } \ STORE_MODULE_WEAKREF(name, mod); \ if (PyObject_SetItem(modules, name, Py_None) < 0) { \ PyErr_WriteUnraisable(NULL); \ @@ -563,8 +571,9 @@ PyImport_Cleanup(void) if (dict == interp->builtins || dict == interp->sysdict) continue; Py_INCREF(mod); - if (Py_VerboseFlag && PyUnicode_Check(name)) + if (verbose && PyUnicode_Check(name)) { PySys_FormatStderr("# cleanup[3] wiping %U\n", name); + } _PyModule_Clear(mod); Py_DECREF(mod); } @@ -572,11 +581,13 @@ PyImport_Cleanup(void) } /* Next, delete sys and builtins (in that order) */ - if (Py_VerboseFlag) + if (verbose) { PySys_FormatStderr("# cleanup[3] wiping sys\n"); + } _PyModule_ClearDict(interp->sysdict); - if (Py_VerboseFlag) + if (verbose) { PySys_FormatStderr("# cleanup[3] wiping builtins\n"); + } _PyModule_ClearDict(interp->builtins); /* Clear and delete the modules directory. Actual modules will @@ -755,9 +766,11 @@ _PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename, PyMapping_DelItem(modules, name); return NULL; } - if (Py_VerboseFlag) + int verbose = _PyInterpreterState_Get()->core_config.verbose; + if (verbose) { PySys_FormatStderr("import %U # previously loaded (%R)\n", - name, filename); + name, filename); + } return mod; } @@ -1427,7 +1440,7 @@ PyImport_ImportModuleNoBlock(const char *name) /* Remove importlib frames from the traceback, * except in Verbose mode. */ static void -remove_importlib_frames(void) +remove_importlib_frames(PyInterpreterState *interp) { const char *importlib_filename = ""; const char *external_filename = ""; @@ -1442,8 +1455,10 @@ remove_importlib_frames(void) which end with a call to "_call_with_frames_removed". */ PyErr_Fetch(&exception, &value, &base_tb); - if (!exception || Py_VerboseFlag) + if (!exception || interp->core_config.verbose) { goto done; + } + if (PyType_IsSubtype((PyTypeObject *) exception, (PyTypeObject *) PyExc_ImportError)) always_trim = 1; @@ -1853,8 +1868,9 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, Py_XDECREF(abs_name); Py_XDECREF(mod); Py_XDECREF(package); - if (final_mod == NULL) - remove_importlib_frames(); + if (final_mod == NULL) { + remove_importlib_frames(interp); + } return final_mod; } @@ -2303,13 +2319,16 @@ PyInit__imp(void) PyObject *m, *d; m = PyModule_Create(&impmodule); - if (m == NULL) + if (m == NULL) { goto failure; + } d = PyModule_GetDict(m); - if (d == NULL) + if (d == NULL) { goto failure; - _PyCoreConfig *config = &_PyInterpreterState_Get()->core_config; - PyObject *pyc_mode = PyUnicode_FromWideChar(config->check_hash_pycs_mode, -1); + } + + const wchar_t *mode = _PyInterpreterState_Get()->core_config.check_hash_pycs_mode; + PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1); if (pyc_mode == NULL) { goto failure; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index de8595ccb581..014b19aa8aa5 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -205,7 +205,7 @@ init_importlib_external(PyInterpreterState *interp) return _Py_INIT_ERR("external importer setup failed"); } Py_DECREF(value); - return _PyImportZip_Init(); + return _PyImportZip_Init(interp); } /* Helper functions to better handle the legacy C locale From webhook-mailer at python.org Mon May 13 11:39:54 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 May 2019 15:39:54 -0000 Subject: [Python-checkins] bpo-36903: Fix ResourceWarning in test_logging (GH-13283) (GH-13285) Message-ID: https://github.com/python/cpython/commit/744129db5d4e7706fd7d46dfc691aa47fabd66fa commit: 744129db5d4e7706fd7d46dfc691aa47fabd66fa branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-05-13T17:39:50+02:00 summary: bpo-36903: Fix ResourceWarning in test_logging (GH-13283) (GH-13285) (cherry picked from commit 2c10538d11fa9be9a1a9f21605861e10ec4fa207) Co-authored-by: Xtreak files: M Lib/test/test_logging.py diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 42746d40d2cd..14277369be47 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -689,6 +689,7 @@ def emit(self, record): self.assertEqual(len(logging._handlers), 0) refed_h = _OurHandler() + self.addCleanup(refed_h.sub_handler.stream.close) refed_h.name = 'because we need at least one for this test' self.assertGreater(len(logging._handlers), 0) self.assertGreater(len(logging._at_fork_reinit_lock_weakset), 1) From webhook-mailer at python.org Mon May 13 12:01:05 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 13 May 2019 16:01:05 -0000 Subject: [Python-checkins] Fix typo in NEWS item about IDLE (os.flush() should be os.fsync()) (#13284) Message-ID: https://github.com/python/cpython/commit/85c69d5c4c5682a70201612128e838d438c01499 commit: 85c69d5c4c5682a70201612128e838d438c01499 branch: master author: Guido van Rossum committer: Terry Jan Reedy date: 2019-05-13T12:00:53-04:00 summary: Fix typo in NEWS item about IDLE (os.flush() should be os.fsync()) (#13284) files: M Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst diff --git a/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst b/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst index 18b31b1fe505..2a905bf0eecf 100644 --- a/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst +++ b/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst @@ -1 +1 @@ -When saving a file, call os.flush() so bits are flushed to e.g. USB drive. +When saving a file, call os.fsync() so bits are flushed to e.g. USB drive. From webhook-mailer at python.org Mon May 13 12:08:53 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 May 2019 16:08:53 -0000 Subject: [Python-checkins] [3.7] bpo-36895: document time.clock() has been removed in 3.8 (GH-13287) Message-ID: https://github.com/python/cpython/commit/24482bd0ae203116fd7e41ec3219fb2857fb3ac7 commit: 24482bd0ae203116fd7e41ec3219fb2857fb3ac7 branch: 3.7 author: Matthias Bussonnier committer: Victor Stinner date: 2019-05-13T18:08:48+02:00 summary: [3.7] bpo-36895: document time.clock() has been removed in 3.8 (GH-13287) files: M Doc/library/time.rst diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 8c6813bb7361..4230c19faf10 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -153,7 +153,7 @@ Functions :c:func:`QueryPerformanceCounter`. The resolution is typically better than one microsecond. - .. deprecated:: 3.3 + .. deprecated-removed:: 3.3 3.8 The behaviour of this function depends on the platform: use :func:`perf_counter` or :func:`process_time` instead, depending on your requirements, to have a well defined behaviour. From webhook-mailer at python.org Mon May 13 12:58:49 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 13 May 2019 16:58:49 -0000 Subject: [Python-checkins] [3.7] bpo-36807: When saving a file in IDLE, call flush and fsync (GH-13102) (#13288) Message-ID: https://github.com/python/cpython/commit/68a11b6e6a73cd2e9b49e5df9973877b2fed6277 commit: 68a11b6e6a73cd2e9b49e5df9973877b2fed6277 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Terry Jan Reedy date: 2019-05-13T12:58:42-04:00 summary: [3.7] bpo-36807: When saving a file in IDLE, call flush and fsync (GH-13102) (#13288) Includes blurb fix in 85c69d5 (cherry picked from commit 4f098b35f58e911639f8e9adc393d5cf5c792e7f) files: A Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst M Lib/idlelib/iomenu.py diff --git a/Lib/idlelib/iomenu.py b/Lib/idlelib/iomenu.py index f5bced597aa8..b9e813be0630 100644 --- a/Lib/idlelib/iomenu.py +++ b/Lib/idlelib/iomenu.py @@ -384,6 +384,8 @@ def writefile(self, filename): try: with open(filename, "wb") as f: f.write(chars) + f.flush() + os.fsync(f.fileno()) return True except OSError as msg: tkMessageBox.showerror("I/O Error", str(msg), diff --git a/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst b/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst new file mode 100644 index 000000000000..2a905bf0eecf --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst @@ -0,0 +1 @@ +When saving a file, call os.fsync() so bits are flushed to e.g. USB drive. From webhook-mailer at python.org Mon May 13 13:17:58 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 May 2019 17:17:58 -0000 Subject: [Python-checkins] bpo-36719: regrtest -jN no longer stops on crash (GH-13231) Message-ID: https://github.com/python/cpython/commit/b0917df329ba14b7bc6fa782c1b61e7a2163af0b commit: b0917df329ba14b7bc6fa782c1b61e7a2163af0b branch: master author: Victor Stinner committer: GitHub date: 2019-05-13T19:17:54+02:00 summary: bpo-36719: regrtest -jN no longer stops on crash (GH-13231) "python3 -m test -jN ..." now continues the execution of next tests when a worker process crash (CHILD_ERROR state). Previously, the test suite stopped immediately. Use --failfast to stop at the first error. Moreover, --forever now also implies --failfast. files: A Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst M Lib/test/libregrtest/cmdline.py M Lib/test/libregrtest/main.py M Lib/test/libregrtest/runtest.py M Lib/test/libregrtest/runtest_mp.py diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index cb09ee0e03b3..dc0d88071946 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -256,7 +256,7 @@ def _create_parser(): help='suppress error message boxes on Windows') group.add_argument('-F', '--forever', action='store_true', help='run the specified tests in a loop, until an ' - 'error happens') + 'error happens; imply --failfast') group.add_argument('--list-tests', action='store_true', help="only write the name of tests that will be run, " "don't execute them") @@ -389,5 +389,8 @@ def _parse_args(args, **kwargs): with open(ns.match_filename) as fp: for line in fp: ns.match_tests.append(line.strip()) + if ns.forever: + # --forever implies --failfast + ns.failfast = True return ns diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index c19ea44db9b2..02717d8c7b13 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -16,7 +16,7 @@ findtests, runtest, get_abs_module, STDTESTS, NOTTESTS, PASSED, FAILED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED, INTERRUPTED, CHILD_ERROR, TEST_DID_NOT_RUN, - PROGRESS_MIN_TIME, format_test_result) + PROGRESS_MIN_TIME, format_test_result, is_failed) from test.libregrtest.setup import setup_tests from test.libregrtest.utils import removepy, count, format_duration, printlist from test import support @@ -404,7 +404,7 @@ def run_tests_sequential(self): test_time = time.monotonic() - start_time if test_time >= PROGRESS_MIN_TIME: previous_test = "%s in %s" % (previous_test, format_duration(test_time)) - elif result[0] == PASSED: + elif result.result == PASSED: # be quiet: say nothing if the test passed shortly previous_test = None @@ -413,6 +413,9 @@ def run_tests_sequential(self): if module not in save_modules and module.startswith("test."): support.unload(module) + if self.ns.failfast and is_failed(result, self.ns): + break + if previous_test: print(previous_test) diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index a9574929a4cd..a43b7666cd1e 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -24,7 +24,7 @@ RESOURCE_DENIED = -3 INTERRUPTED = -4 CHILD_ERROR = -5 # error in a child process -TEST_DID_NOT_RUN = -6 # error in a child process +TEST_DID_NOT_RUN = -6 _FORMAT_TEST_RESULT = { PASSED: '%s passed', @@ -64,6 +64,15 @@ FOUND_GARBAGE = [] +def is_failed(result, ns): + ok = result.result + if ok in (PASSED, RESOURCE_DENIED, SKIPPED, TEST_DID_NOT_RUN): + return False + if ok == ENV_CHANGED: + return ns.fail_env_changed + return True + + def format_test_result(result): fmt = _FORMAT_TEST_RESULT.get(result.result, "%s") return fmt % result.test_name diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index dbab6954de86..ced7f866a899 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -13,7 +13,7 @@ from test.libregrtest.runtest import ( runtest, INTERRUPTED, CHILD_ERROR, PROGRESS_MIN_TIME, - format_test_result, TestResult) + format_test_result, TestResult, is_failed) from test.libregrtest.setup import setup_tests from test.libregrtest.utils import format_duration @@ -22,8 +22,12 @@ PROGRESS_UPDATE = 30.0 # seconds -def must_stop(result): - return result.result in (INTERRUPTED, CHILD_ERROR) +def must_stop(result, ns): + if result.result == INTERRUPTED: + return True + if ns.failfast and is_failed(result, ns): + return True + return False def run_test_in_subprocess(testname, ns): @@ -66,16 +70,22 @@ class MultiprocessIterator: """A thread-safe iterator over tests for multiprocess mode.""" - def __init__(self, tests): + def __init__(self, tests_iter): self.lock = threading.Lock() - self.tests = tests + self.tests_iter = tests_iter def __iter__(self): return self def __next__(self): with self.lock: - return next(self.tests) + if self.tests_iter is None: + raise StopIteration + return next(self.tests_iter) + + def stop(self): + with self.lock: + self.tests_iter = None MultiprocessResult = collections.namedtuple('MultiprocessResult', @@ -92,23 +102,24 @@ def __init__(self, pending, output, ns): self._popen = None def kill(self): - if not self.is_alive(): + popen = self._popen + if popen is None: return - if self._popen is not None: - self._popen.kill() + print("Kill regrtest worker process %s" % popen.pid) + popen.kill() def _runtest(self, test_name): try: self.start_time = time.monotonic() self.current_test_name = test_name - popen = run_test_in_subprocess(test_name, self.ns) - self._popen = popen + self._popen = run_test_in_subprocess(test_name, self.ns) + popen = self._popen with popen: try: stdout, stderr = popen.communicate() except: - popen.kill() + self.kill() popen.wait() raise @@ -153,7 +164,7 @@ def run(self): mp_result = self._runtest(test_name) self.output.put((False, mp_result)) - if must_stop(mp_result.result): + if must_stop(mp_result.result, self.ns): break except BaseException: self.output.put((True, traceback.format_exc())) @@ -255,7 +266,7 @@ def _process_result(self, item): if mp_result.stderr and not self.ns.pgo: print(mp_result.stderr, file=sys.stderr, flush=True) - if must_stop(mp_result.result): + if must_stop(mp_result.result, self.ns): return True return False @@ -280,6 +291,8 @@ def run_tests(self): if self.test_timeout is not None: faulthandler.cancel_dump_traceback_later() + # a test failed (and --failfast is set) or all tests completed + self.pending.stop() self.wait_workers() diff --git a/Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst b/Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst new file mode 100644 index 000000000000..9f60145975fe --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst @@ -0,0 +1,3 @@ +"python3 -m test -jN ..." now continues the execution of next tests when a +worker process crash (CHILD_ERROR state). Previously, the test suite stopped +immediately. Use --failfast to stop at the first error. From webhook-mailer at python.org Mon May 13 13:20:54 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Mon, 13 May 2019 17:20:54 -0000 Subject: [Python-checkins] bpo-36867: DOC update multiprocessing.rst (GH-13289) Message-ID: https://github.com/python/cpython/commit/50466c66509de556a8579172f82d1abb1560d8e4 commit: 50466c66509de556a8579172f82d1abb1560d8e4 branch: master author: Pierre Glaser committer: Antoine Pitrou date: 2019-05-13T19:20:48+02:00 summary: bpo-36867: DOC update multiprocessing.rst (GH-13289) Followup to bpo-36867. files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index a5ecfa6cc1c7..c6ffb00819c3 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -131,13 +131,17 @@ to start a process. These *start methods* are handles on Windows. On Unix using the *spawn* or *forkserver* start methods will also -start a *semaphore tracker* process which tracks the unlinked named -semaphores created by processes of the program. When all processes -have exited the semaphore tracker unlinks any remaining semaphores. +start a *resource tracker* process which tracks the unlinked named +system resources (such as named semaphores or +:class:`~multiprocessing.shared_memory.SharedMemory` objects) created +by processes of the program. When all processes +have exited the resource tracker unlinks any remaining tracked object. Usually there should be none, but if a process was killed by a signal -there may be some "leaked" semaphores. (Unlinking the named semaphores -is a serious matter since the system allows only a limited number, and -they will not be automatically unlinked until the next reboot.) +there may be some "leaked" resources. (Neither leaked semaphores nor shared +memory segments will be automatically unlinked until the next reboot. This is +problematic for both objects because the system allows only a limited number of +named semaphores, and shared memory segments occupy some space in the main +memory.) To select a start method you use the :func:`set_start_method` in the ``if __name__ == '__main__'`` clause of the main module. For From webhook-mailer at python.org Mon May 13 13:55:13 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 13 May 2019 17:55:13 -0000 Subject: [Python-checkins] bpo-36719: regrtest -jN no longer stops on crash (GH-13231) Message-ID: https://github.com/python/cpython/commit/19464bcd97436cd8d5d9e32b70faf3e1e5f2a712 commit: 19464bcd97436cd8d5d9e32b70faf3e1e5f2a712 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-13T10:55:07-07:00 summary: bpo-36719: regrtest -jN no longer stops on crash (GH-13231) "python3 -m test -jN ..." now continues the execution of next tests when a worker process crash (CHILD_ERROR state). Previously, the test suite stopped immediately. Use --failfast to stop at the first error. Moreover, --forever now also implies --failfast. (cherry picked from commit b0917df329ba14b7bc6fa782c1b61e7a2163af0b) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst M Lib/test/libregrtest/cmdline.py M Lib/test/libregrtest/main.py M Lib/test/libregrtest/runtest.py M Lib/test/libregrtest/runtest_mp.py diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index cb09ee0e03b3..dc0d88071946 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -256,7 +256,7 @@ def _create_parser(): help='suppress error message boxes on Windows') group.add_argument('-F', '--forever', action='store_true', help='run the specified tests in a loop, until an ' - 'error happens') + 'error happens; imply --failfast') group.add_argument('--list-tests', action='store_true', help="only write the name of tests that will be run, " "don't execute them") @@ -389,5 +389,8 @@ def _parse_args(args, **kwargs): with open(ns.match_filename) as fp: for line in fp: ns.match_tests.append(line.strip()) + if ns.forever: + # --forever implies --failfast + ns.failfast = True return ns diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index c19ea44db9b2..02717d8c7b13 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -16,7 +16,7 @@ findtests, runtest, get_abs_module, STDTESTS, NOTTESTS, PASSED, FAILED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED, INTERRUPTED, CHILD_ERROR, TEST_DID_NOT_RUN, - PROGRESS_MIN_TIME, format_test_result) + PROGRESS_MIN_TIME, format_test_result, is_failed) from test.libregrtest.setup import setup_tests from test.libregrtest.utils import removepy, count, format_duration, printlist from test import support @@ -404,7 +404,7 @@ def run_tests_sequential(self): test_time = time.monotonic() - start_time if test_time >= PROGRESS_MIN_TIME: previous_test = "%s in %s" % (previous_test, format_duration(test_time)) - elif result[0] == PASSED: + elif result.result == PASSED: # be quiet: say nothing if the test passed shortly previous_test = None @@ -413,6 +413,9 @@ def run_tests_sequential(self): if module not in save_modules and module.startswith("test."): support.unload(module) + if self.ns.failfast and is_failed(result, self.ns): + break + if previous_test: print(previous_test) diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index a9574929a4cd..a43b7666cd1e 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -24,7 +24,7 @@ RESOURCE_DENIED = -3 INTERRUPTED = -4 CHILD_ERROR = -5 # error in a child process -TEST_DID_NOT_RUN = -6 # error in a child process +TEST_DID_NOT_RUN = -6 _FORMAT_TEST_RESULT = { PASSED: '%s passed', @@ -64,6 +64,15 @@ FOUND_GARBAGE = [] +def is_failed(result, ns): + ok = result.result + if ok in (PASSED, RESOURCE_DENIED, SKIPPED, TEST_DID_NOT_RUN): + return False + if ok == ENV_CHANGED: + return ns.fail_env_changed + return True + + def format_test_result(result): fmt = _FORMAT_TEST_RESULT.get(result.result, "%s") return fmt % result.test_name diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index dbab6954de86..ced7f866a899 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -13,7 +13,7 @@ from test.libregrtest.runtest import ( runtest, INTERRUPTED, CHILD_ERROR, PROGRESS_MIN_TIME, - format_test_result, TestResult) + format_test_result, TestResult, is_failed) from test.libregrtest.setup import setup_tests from test.libregrtest.utils import format_duration @@ -22,8 +22,12 @@ PROGRESS_UPDATE = 30.0 # seconds -def must_stop(result): - return result.result in (INTERRUPTED, CHILD_ERROR) +def must_stop(result, ns): + if result.result == INTERRUPTED: + return True + if ns.failfast and is_failed(result, ns): + return True + return False def run_test_in_subprocess(testname, ns): @@ -66,16 +70,22 @@ class MultiprocessIterator: """A thread-safe iterator over tests for multiprocess mode.""" - def __init__(self, tests): + def __init__(self, tests_iter): self.lock = threading.Lock() - self.tests = tests + self.tests_iter = tests_iter def __iter__(self): return self def __next__(self): with self.lock: - return next(self.tests) + if self.tests_iter is None: + raise StopIteration + return next(self.tests_iter) + + def stop(self): + with self.lock: + self.tests_iter = None MultiprocessResult = collections.namedtuple('MultiprocessResult', @@ -92,23 +102,24 @@ def __init__(self, pending, output, ns): self._popen = None def kill(self): - if not self.is_alive(): + popen = self._popen + if popen is None: return - if self._popen is not None: - self._popen.kill() + print("Kill regrtest worker process %s" % popen.pid) + popen.kill() def _runtest(self, test_name): try: self.start_time = time.monotonic() self.current_test_name = test_name - popen = run_test_in_subprocess(test_name, self.ns) - self._popen = popen + self._popen = run_test_in_subprocess(test_name, self.ns) + popen = self._popen with popen: try: stdout, stderr = popen.communicate() except: - popen.kill() + self.kill() popen.wait() raise @@ -153,7 +164,7 @@ def run(self): mp_result = self._runtest(test_name) self.output.put((False, mp_result)) - if must_stop(mp_result.result): + if must_stop(mp_result.result, self.ns): break except BaseException: self.output.put((True, traceback.format_exc())) @@ -255,7 +266,7 @@ def _process_result(self, item): if mp_result.stderr and not self.ns.pgo: print(mp_result.stderr, file=sys.stderr, flush=True) - if must_stop(mp_result.result): + if must_stop(mp_result.result, self.ns): return True return False @@ -280,6 +291,8 @@ def run_tests(self): if self.test_timeout is not None: faulthandler.cancel_dump_traceback_later() + # a test failed (and --failfast is set) or all tests completed + self.pending.stop() self.wait_workers() diff --git a/Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst b/Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst new file mode 100644 index 000000000000..9f60145975fe --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst @@ -0,0 +1,3 @@ +"python3 -m test -jN ..." now continues the execution of next tests when a +worker process crash (CHILD_ERROR state). Previously, the test suite stopped +immediately. Use --failfast to stop at the first error. From webhook-mailer at python.org Mon May 13 14:02:53 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Mon, 13 May 2019 18:02:53 -0000 Subject: [Python-checkins] bpo-36894: Fix regression in test_multiprocessing_spawn (no tests run on Windows) (GH-13290) Message-ID: https://github.com/python/cpython/commit/95da83d9bac698d420cc308e8699ef6e4fae2aca commit: 95da83d9bac698d420cc308e8699ef6e4fae2aca branch: master author: Antoine Pitrou committer: GitHub date: 2019-05-13T20:02:46+02:00 summary: bpo-36894: Fix regression in test_multiprocessing_spawn (no tests run on Windows) (GH-13290) files: M Lib/multiprocessing/resource_tracker.py diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index e67e0b213eb9..61a6dd66e72e 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -20,8 +20,6 @@ import sys import threading import warnings -import _multiprocessing -import _posixshmem from . import spawn from . import util @@ -33,10 +31,17 @@ _CLEANUP_FUNCS = { 'noop': lambda: None, - 'semaphore': _multiprocessing.sem_unlink, - 'shared_memory': _posixshmem.shm_unlink } +if os.name == 'posix': + import _multiprocessing + import _posixshmem + + _CLEANUP_FUNCS.update({ + 'semaphore': _multiprocessing.sem_unlink, + 'shared_memory': _posixshmem.shm_unlink, + }) + class ResourceTracker(object): From webhook-mailer at python.org Mon May 13 14:10:05 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Mon, 13 May 2019 18:10:05 -0000 Subject: [Python-checkins] Docs: Add bz2 usage examples (GH-13258) Message-ID: https://github.com/python/cpython/commit/be6939fb02e65b56c45377940b339d150b124d05 commit: be6939fb02e65b56c45377940b339d150b124d05 branch: master author: Brad committer: Gregory P. Smith date: 2019-05-13T11:09:49-07:00 summary: Docs: Add bz2 usage examples (GH-13258) * Docs: Add bz2 usage examples - Adds an "Examples of usage" section inspired by the one found in the gzip docs - Corrects the descriptions for ``compresslevel`` and ``data``: - ``compresslevel`` must be an `int`, not any number. For instance, passing a float will raise ``TypeError`` - Notes that `data` must be bytes-like files: M Doc/library/bz2.rst diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index 946cc67dd301..277de601cb7b 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -83,7 +83,7 @@ All of the classes in this module may safely be accessed from multiple threads. The *buffering* argument is ignored. Its use is deprecated since Python 3.0. - If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be a number between + If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be an integer between ``1`` and ``9`` specifying the level of compression: ``1`` produces the least compression, and ``9`` (default) produces the most compression. @@ -148,7 +148,7 @@ Incremental (de)compression incrementally. For one-shot compression, use the :func:`compress` function instead. - *compresslevel*, if given, must be a number between ``1`` and ``9``. The + *compresslevel*, if given, must be an integer between ``1`` and ``9``. The default is ``9``. .. method:: compress(data) @@ -234,9 +234,9 @@ One-shot (de)compression .. function:: compress(data, compresslevel=9) - Compress *data*. + Compress *data*, a :term:`bytes-like object `. - *compresslevel*, if given, must be a number between ``1`` and ``9``. The + *compresslevel*, if given, must be an integer between ``1`` and ``9``. The default is ``9``. For incremental compression, use a :class:`BZ2Compressor` instead. @@ -244,7 +244,7 @@ One-shot (de)compression .. function:: decompress(data) - Decompress *data*. + Decompress *data*, a :term:`bytes-like object `. If *data* is the concatenation of multiple compressed streams, decompress all of the streams. @@ -254,3 +254,77 @@ One-shot (de)compression .. versionchanged:: 3.3 Support for multi-stream inputs was added. +.. _bz2-usage-examples: + +Examples of usage +----------------- + +Below are some examples of typical usage of the :mod:`bz2` module. + +Using :func:`compress` and :func:`decompress` to demonstrate round-trip compression: + + >>> import bz2 + + >>> data = b"""\ + ... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue + ... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem, + ... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus + ... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat. + ... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo + ... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum + ... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum.""" + + >>> c = bz2.compress(data) + >>> len(data) / len(c) # Data compression ratio + 1.513595166163142 + + >>> d = bz2.decompress(c) + >>> data == d # Check equality to original object after round-trip + True + +Using :class:`BZ2Compressor` for incremental compression: + + >>> import bz2 + + >>> def gen_data(chunks=10, chunksize=1000): + ... """Yield incremental blocks of chunksize bytes.""" + ... for _ in range(chunks): + ... yield b"z" * chunksize + ... + >>> comp = bz2.BZ2Compressor() + >>> out = b"" + >>> for chunk in gen_data(): + ... # Provide data to the compressor object + ... out = out + comp.compress(chunk) + ... + >>> # Finish the compression process. Call this once you have + >>> # finished providing data to the compressor. + >>> out = out + comp.flush() + +The example above uses a very "nonrandom" stream of data +(a stream of `b"z"` chunks). Random data tends to compress poorly, +while ordered, repetitive data usually yields a high compression ratio. + +Writing and reading a bzip2-compressed file in binary mode: + + >>> import bz2 + + >>> data = b"""\ + ... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue + ... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem, + ... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus + ... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat. + ... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo + ... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum + ... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum.""" + + >>> with bz2.open("myfile.bz2", "wb") as f: + ... # Write compressed data to file + ... unused = f.write(data) + + >>> with bz2.open("myfile.bz2", "rb") as f: + ... # Decompress data from file + ... content = f.read() + + >>> content == data # Check equality to original object after round-trip + True From webhook-mailer at python.org Mon May 13 14:50:23 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 13 May 2019 18:50:23 -0000 Subject: [Python-checkins] Docs: Add bz2 usage examples (GH-13258) Message-ID: https://github.com/python/cpython/commit/ee9b5ce3903542a55e7f55817538d355bb260518 commit: ee9b5ce3903542a55e7f55817538d355bb260518 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-13T11:50:16-07:00 summary: Docs: Add bz2 usage examples (GH-13258) * Docs: Add bz2 usage examples - Adds an "Examples of usage" section inspired by the one found in the gzip docs - Corrects the descriptions for ``compresslevel`` and ``data``: - ``compresslevel`` must be an `int`, not any number. For instance, passing a float will raise ``TypeError`` - Notes that `data` must be bytes-like (cherry picked from commit be6939fb02e65b56c45377940b339d150b124d05) Co-authored-by: Brad files: M Doc/library/bz2.rst diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index d5f622515a40..b247de6dfc85 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -83,7 +83,7 @@ All of the classes in this module may safely be accessed from multiple threads. The *buffering* argument is ignored. Its use is deprecated. - If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be a number between + If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be an integer between ``1`` and ``9`` specifying the level of compression: ``1`` produces the least compression, and ``9`` (default) produces the most compression. @@ -144,7 +144,7 @@ Incremental (de)compression incrementally. For one-shot compression, use the :func:`compress` function instead. - *compresslevel*, if given, must be a number between ``1`` and ``9``. The + *compresslevel*, if given, must be an integer between ``1`` and ``9``. The default is ``9``. .. method:: compress(data) @@ -230,9 +230,9 @@ One-shot (de)compression .. function:: compress(data, compresslevel=9) - Compress *data*. + Compress *data*, a :term:`bytes-like object `. - *compresslevel*, if given, must be a number between ``1`` and ``9``. The + *compresslevel*, if given, must be an integer between ``1`` and ``9``. The default is ``9``. For incremental compression, use a :class:`BZ2Compressor` instead. @@ -240,7 +240,7 @@ One-shot (de)compression .. function:: decompress(data) - Decompress *data*. + Decompress *data*, a :term:`bytes-like object `. If *data* is the concatenation of multiple compressed streams, decompress all of the streams. @@ -250,3 +250,77 @@ One-shot (de)compression .. versionchanged:: 3.3 Support for multi-stream inputs was added. +.. _bz2-usage-examples: + +Examples of usage +----------------- + +Below are some examples of typical usage of the :mod:`bz2` module. + +Using :func:`compress` and :func:`decompress` to demonstrate round-trip compression: + + >>> import bz2 + + >>> data = b"""\ + ... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue + ... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem, + ... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus + ... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat. + ... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo + ... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum + ... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum.""" + + >>> c = bz2.compress(data) + >>> len(data) / len(c) # Data compression ratio + 1.513595166163142 + + >>> d = bz2.decompress(c) + >>> data == d # Check equality to original object after round-trip + True + +Using :class:`BZ2Compressor` for incremental compression: + + >>> import bz2 + + >>> def gen_data(chunks=10, chunksize=1000): + ... """Yield incremental blocks of chunksize bytes.""" + ... for _ in range(chunks): + ... yield b"z" * chunksize + ... + >>> comp = bz2.BZ2Compressor() + >>> out = b"" + >>> for chunk in gen_data(): + ... # Provide data to the compressor object + ... out = out + comp.compress(chunk) + ... + >>> # Finish the compression process. Call this once you have + >>> # finished providing data to the compressor. + >>> out = out + comp.flush() + +The example above uses a very "nonrandom" stream of data +(a stream of `b"z"` chunks). Random data tends to compress poorly, +while ordered, repetitive data usually yields a high compression ratio. + +Writing and reading a bzip2-compressed file in binary mode: + + >>> import bz2 + + >>> data = b"""\ + ... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue + ... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem, + ... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus + ... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat. + ... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo + ... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum + ... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum.""" + + >>> with bz2.open("myfile.bz2", "wb") as f: + ... # Write compressed data to file + ... unused = f.write(data) + + >>> with bz2.open("myfile.bz2", "rb") as f: + ... # Decompress data from file + ... content = f.read() + + >>> content == data # Check equality to original object after round-trip + True From webhook-mailer at python.org Mon May 13 15:15:51 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Mon, 13 May 2019 19:15:51 -0000 Subject: [Python-checkins] bpo-36867: Create the resource_tracker before launching SharedMemoryManagers (GH-13276) Message-ID: https://github.com/python/cpython/commit/b1dfcad6f0d3a52c9ac31fb9763fc7962a84b27c commit: b1dfcad6f0d3a52c9ac31fb9763fc7962a84b27c branch: master author: Pierre Glaser committer: Antoine Pitrou date: 2019-05-13T21:15:32+02:00 summary: bpo-36867: Create the resource_tracker before launching SharedMemoryManagers (GH-13276) files: A Misc/NEWS.d/next/Library/2019-05-13-13-02-43.bpo-36867.Qh-6mX.rst M Lib/multiprocessing/managers.py M Lib/test/_test_multiprocessing.py diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 2bad636855fe..514152298b09 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -21,6 +21,7 @@ import array import queue import time +import os from os import getpid from traceback import format_exc @@ -1349,6 +1350,14 @@ class SharedMemoryManager(BaseManager): _Server = SharedMemoryServer def __init__(self, *args, **kwargs): + if os.name == "posix": + # bpo-36867: Ensure the resource_tracker is running before + # launching the manager process, so that concurrent + # shared_memory manipulation both in the manager and in the + # current process does not create two resource_tracker + # processes. + from . import resource_tracker + resource_tracker.ensure_running() BaseManager.__init__(self, *args, **kwargs) util.debug(f"{self.__class__.__name__} created by pid {getpid()}") diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index a50293c7616f..772c9638337a 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -17,6 +17,7 @@ import socket import random import logging +import subprocess import struct import operator import pickle @@ -3765,6 +3766,27 @@ def test_shared_memory_SharedMemoryServer_ignores_sigint(self): smm.shutdown() + @unittest.skipIf(os.name != "posix", "resource_tracker is posix only") + def test_shared_memory_SharedMemoryManager_reuses_resource_tracker(self): + # bpo-36867: test that a SharedMemoryManager uses the + # same resource_tracker process as its parent. + cmd = '''if 1: + from multiprocessing.managers import SharedMemoryManager + + + smm = SharedMemoryManager() + smm.start() + sl = smm.ShareableList(range(10)) + smm.shutdown() + ''' + rc, out, err = test.support.script_helper.assert_python_ok('-c', cmd) + + # Before bpo-36867 was fixed, a SharedMemoryManager not using the same + # resource_tracker process as its parent would make the parent's + # tracker complain about sl being leaked even though smm.shutdown() + # properly released sl. + self.assertFalse(err) + def test_shared_memory_SharedMemoryManager_basics(self): smm1 = multiprocessing.managers.SharedMemoryManager() with self.assertRaises(ValueError): @@ -3904,8 +3926,6 @@ def test_shared_memory_ShareableList_pickling(self): sl.shm.close() def test_shared_memory_cleaned_after_process_termination(self): - import subprocess - from multiprocessing import shared_memory cmd = '''if 1: import os, time, sys from multiprocessing import shared_memory @@ -3916,18 +3936,29 @@ def test_shared_memory_cleaned_after_process_termination(self): sys.stdout.flush() time.sleep(100) ''' - p = subprocess.Popen([sys.executable, '-E', '-c', cmd], - stdout=subprocess.PIPE) - name = p.stdout.readline().strip().decode() + with subprocess.Popen([sys.executable, '-E', '-c', cmd], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) as p: + name = p.stdout.readline().strip().decode() - # killing abruptly processes holding reference to a shared memory - # segment should not leak the given memory segment. - p.terminate() - p.wait() - time.sleep(1.0) # wait for the OS to collect the segment + # killing abruptly processes holding reference to a shared memory + # segment should not leak the given memory segment. + p.terminate() + p.wait() + time.sleep(1.0) # wait for the OS to collect the segment - with self.assertRaises(FileNotFoundError): - smm = shared_memory.SharedMemory(name, create=False) + # The shared memory file was deleted. + with self.assertRaises(FileNotFoundError): + smm = shared_memory.SharedMemory(name, create=False) + + if os.name == 'posix': + # A warning was emitted by the subprocess' own + # resource_tracker (on Windows, shared memory segments + # are released automatically by the OS). + err = p.stderr.read().decode() + self.assertIn( + "resource_tracker: There appear to be 1 leaked " + "shared_memory objects to clean up at shutdown", err) # # @@ -4560,7 +4591,7 @@ def run_in_child(cls): print(json.dumps(flags)) def test_flags(self): - import json, subprocess + import json # start child process using unusual flags prog = ('from test._test_multiprocessing import TestFlags; ' + 'TestFlags.run_in_child()') @@ -4866,7 +4897,6 @@ def test_resource_tracker(self): # # Check that killing process does not leak named semaphores # - import subprocess cmd = '''if 1: import time, os, tempfile import multiprocessing as mp diff --git a/Misc/NEWS.d/next/Library/2019-05-13-13-02-43.bpo-36867.Qh-6mX.rst b/Misc/NEWS.d/next/Library/2019-05-13-13-02-43.bpo-36867.Qh-6mX.rst new file mode 100644 index 000000000000..ce925d0594bb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-13-13-02-43.bpo-36867.Qh-6mX.rst @@ -0,0 +1 @@ +Fix a bug making a SharedMemoryManager instance and its parent process use two separate resource_tracker processes. \ No newline at end of file From webhook-mailer at python.org Mon May 13 15:23:21 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 May 2019 19:23:21 -0000 Subject: [Python-checkins] bpo-36895: Undocument removed time.clock (GH-13286) Message-ID: https://github.com/python/cpython/commit/b6a09ae287e253e4146a5a224b75d4dbfd38cb63 commit: b6a09ae287e253e4146a5a224b75d4dbfd38cb63 branch: master author: Matthias Bussonnier committer: Victor Stinner date: 2019-05-13T21:23:07+02:00 summary: bpo-36895: Undocument removed time.clock (GH-13286) files: M Doc/library/time.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/library/time.rst b/Doc/library/time.rst index cad4afda38b8..6d0ceafa522a 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -136,30 +136,6 @@ Functions Unlike the C function of the same name, :func:`asctime` does not add a trailing newline. - -.. function:: clock() - - .. index:: - single: CPU time - single: processor time - single: benchmarking - - On Unix, return the current processor time as a floating point number expressed - in seconds. The precision, and in fact the very definition of the meaning of - "processor time", depends on that of the C function of the same name. - - On Windows, this function returns wall-clock seconds elapsed since the first - call to this function, as a floating point number, based on the Win32 function - :c:func:`QueryPerformanceCounter`. The resolution is typically better than one - microsecond. - - .. availability:: Windows, Unix. Not available on VxWorks. - - .. deprecated-removed:: 3.3 3.8 - The behaviour of this function depends on the platform: use - :func:`perf_counter` or :func:`process_time` instead, depending on your - requirements, to have a well defined behaviour. - .. function:: pthread_getcpuclockid(thread_id) Return the *clk_id* of the thread-specific CPU-time clock for the specified *thread_id*. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index ac253059f328..a2af201215c2 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -788,6 +788,10 @@ The following features and APIs have been removed from Python 3.8: * The function :func:`platform.popen` has been removed, it was deprecated since Python 3.3: use :func:`os.popen` instead. +* The function :func:`time.clock` has been removed, it was deprecated since Python + 3.3: use :func:`time.perf_counter` or :func:`time.process_time` instead, depending + on your requirements, to have a well defined behavior. + * The ``pyvenv`` script has been removed in favor of ``python3.8 -m venv`` to help eliminate confusion as to what Python interpreter the ``pyvenv`` script is tied to. (Contributed by Brett Cannon in :issue:`25427`.) From webhook-mailer at python.org Mon May 13 15:27:24 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 May 2019 19:27:24 -0000 Subject: [Python-checkins] bpo-35138: Added an example for timeit.timeit with callable arguments (GH-9787) Message-ID: https://github.com/python/cpython/commit/8da5ebe11e0cb6599af682b22f7c2b2b7b9debd8 commit: 8da5ebe11e0cb6599af682b22f7c2b2b7b9debd8 branch: master author: Anders Hovm?ller committer: Victor Stinner date: 2019-05-13T21:27:17+02:00 summary: bpo-35138: Added an example for timeit.timeit with callable arguments (GH-9787) * Update timeit.rst files: M Doc/library/timeit.rst diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst index 8ca37034f79b..ef7a4e40be65 100644 --- a/Doc/library/timeit.rst +++ b/Doc/library/timeit.rst @@ -44,8 +44,12 @@ This can be achieved from the :ref:`python-interface` with:: >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.23702679807320237 +A callable can also be passed from the :ref:`python-interface`:: -Note however that :mod:`timeit` will automatically determine the number of + >>> timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000) + 0.19665591977536678 + +Note however that :func:`.timeit` will automatically determine the number of repetitions only when the command-line interface is used. In the :ref:`timeit-examples` section you can find more advanced examples. From webhook-mailer at python.org Mon May 13 15:41:35 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 13 May 2019 19:41:35 -0000 Subject: [Python-checkins] bpo-35138: Added an example for timeit.timeit with callable arguments (GH-9787) Message-ID: https://github.com/python/cpython/commit/7f485ea4fc17c5afb38cd0478ff15326fb5a47fc commit: 7f485ea4fc17c5afb38cd0478ff15326fb5a47fc branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-13T12:41:31-07:00 summary: bpo-35138: Added an example for timeit.timeit with callable arguments (GH-9787) * Update timeit.rst (cherry picked from commit 8da5ebe11e0cb6599af682b22f7c2b2b7b9debd8) Co-authored-by: Anders Hovm?ller files: M Doc/library/timeit.rst diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst index 8ca37034f79b..ef7a4e40be65 100644 --- a/Doc/library/timeit.rst +++ b/Doc/library/timeit.rst @@ -44,8 +44,12 @@ This can be achieved from the :ref:`python-interface` with:: >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.23702679807320237 +A callable can also be passed from the :ref:`python-interface`:: -Note however that :mod:`timeit` will automatically determine the number of + >>> timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000) + 0.19665591977536678 + +Note however that :func:`.timeit` will automatically determine the number of repetitions only when the command-line interface is used. In the :ref:`timeit-examples` section you can find more advanced examples. From webhook-mailer at python.org Mon May 13 16:16:47 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Mon, 13 May 2019 20:16:47 -0000 Subject: [Python-checkins] [2.7] bpo-35925: Skip SSL tests that fail due to weak external certs or old TLS (GH-13124) (GH-13253) Message-ID: https://github.com/python/cpython/commit/7346a16ed584fd1e85359154820d286370b68648 commit: 7346a16ed584fd1e85359154820d286370b68648 branch: 2.7 author: Gregory P. Smith committer: GitHub date: 2019-05-13T13:16:34-07:00 summary: [2.7] bpo-35925: Skip SSL tests that fail due to weak external certs or old TLS (GH-13124) (GH-13253) Modern Linux distros such as Debian Buster have default OpenSSL system configurations that reject connections to servers with weak certificates by default. This causes our test suite run with external networking resources enabled to skip these tests when they encounter such a failure. Fixing the network servers is a separate issue. (cherry picked from commit 2cc0223) Changes to test_ssl.py required as 2.7 has legacy protocol tests. The test_httplib.py change is omitted from this backport as self-signed.pythontest.net's certificate was updated and the test_nntplib.py change is not applicable on 2.7. Authored-by: Gregory P. Smith greg at krypto.org files: A Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst M Lib/test/test_ssl.py diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 0eecc781d9e6..ef2e59c1d15d 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -19,6 +19,7 @@ import traceback import weakref import platform +import re import functools from contextlib import closing @@ -159,6 +160,36 @@ def f(*args, **kwargs): else: return func +def skip_if_openssl_cnf_minprotocol_gt_tls1(func): + """Skip a test if the OpenSSL config MinProtocol is > TLSv1. + OS distros with an /etc/ssl/openssl.cnf and MinProtocol set often do so to + require TLSv1.2 or higher (Debian Buster). Some of our tests for older + protocol versions will fail under such a config. + Alternative workaround: Run this test in a process with + OPENSSL_CONF=/dev/null in the environment. + """ + @functools.wraps(func) + def f(*args, **kwargs): + openssl_cnf = os.environ.get("OPENSSL_CONF", "/etc/ssl/openssl.cnf") + try: + with open(openssl_cnf, "r") as config: + for line in config: + match = re.match(r"MinProtocol\s*=\s*(TLSv\d+\S*)", line) + if match: + tls_ver = match.group(1) + if tls_ver > "TLSv1": + raise unittest.SkipTest( + "%s has MinProtocol = %s which is > TLSv1." % + (openssl_cnf, tls_ver)) + except (EnvironmentError, UnicodeDecodeError) as err: + # no config file found, etc. + if support.verbose: + sys.stdout.write("\n Could not scan %s for MinProtocol: %s\n" + % (openssl_cnf, err)) + return func(*args, **kwargs) + return f + + needs_sni = unittest.skipUnless(ssl.HAS_SNI, "SNI support needed for this test") @@ -2351,6 +2382,7 @@ def test_protocol_sslv2(self): client_options=ssl.OP_NO_TLSv1) @skip_if_broken_ubuntu_ssl + @skip_if_openssl_cnf_minprotocol_gt_tls1 def test_protocol_sslv23(self): """Connecting to an SSLv23 server with various client options""" if support.verbose: @@ -2428,6 +2460,7 @@ def test_protocol_tlsv1(self): @skip_if_broken_ubuntu_ssl @unittest.skipUnless(hasattr(ssl, "PROTOCOL_TLSv1_1"), "TLS version 1.1 not supported.") + @skip_if_openssl_cnf_minprotocol_gt_tls1 def test_protocol_tlsv1_1(self): """Connecting to a TLSv1.1 server with various client options. Testing against older TLS versions.""" diff --git a/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst new file mode 100644 index 000000000000..428326cdfe5b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst @@ -0,0 +1 @@ +Skip specific nntplib and ssl networking tests when they would otherwise fail due to a modern OS or distro with a default OpenSSL policy of rejecting connections to servers with weak certificates or disabling TLS below TLSv1.2. From webhook-mailer at python.org Mon May 13 18:29:19 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 13 May 2019 22:29:19 -0000 Subject: [Python-checkins] [2.7] bpo-36807: When saving a file in IDLE, call flush and fsync (GH-13102) (GH-13293) Message-ID: https://github.com/python/cpython/commit/353f8d2282b1a48376f8813fd1170445a0cda873 commit: 353f8d2282b1a48376f8813fd1170445a0cda873 branch: 2.7 author: Terry Jan Reedy committer: GitHub date: 2019-05-13T18:29:15-04:00 summary: [2.7] bpo-36807: When saving a file in IDLE, call flush and fsync (GH-13102) (GH-13293) files: A Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst M Lib/idlelib/IOBinding.py diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py index 2aba46e0df46..872bece47674 100644 --- a/Lib/idlelib/IOBinding.py +++ b/Lib/idlelib/IOBinding.py @@ -383,6 +383,8 @@ def writefile(self, filename): try: with open(filename, "wb") as f: f.write(chars) + f.flush() + os.fsync(f.fileno()) return True except IOError as msg: tkMessageBox.showerror("I/O Error", str(msg), diff --git a/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst b/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst new file mode 100644 index 000000000000..2a905bf0eecf --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst @@ -0,0 +1 @@ +When saving a file, call os.fsync() so bits are flushed to e.g. USB drive. From webhook-mailer at python.org Mon May 13 21:07:50 2019 From: webhook-mailer at python.org (R. David Murray) Date: Tue, 14 May 2019 01:07:50 -0000 Subject: [Python-checkins] bpo-34424: Handle different policy.linesep lengths correctly. (#8803) Message-ID: https://github.com/python/cpython/commit/45b2f8893c1b7ab3b3981a966f82e42beea82106 commit: 45b2f8893c1b7ab3b3981a966f82e42beea82106 branch: master author: Jens Troeger committer: R. David Murray date: 2019-05-13T21:07:39-04:00 summary: bpo-34424: Handle different policy.linesep lengths correctly. (#8803) files: A Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_generator.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 922daa2560f0..bb26d5a556db 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2625,7 +2625,7 @@ def _refold_parse_tree(parse_tree, *, policy): want_encoding = False last_ew = None if part.syntactic_break: - encoded_part = part.fold(policy=policy)[:-1] # strip nl + encoded_part = part.fold(policy=policy)[:-len(policy.linesep)] if policy.linesep not in encoded_part: # It fits on a single line if len(encoded_part) > maxlen - len(lines[-1]): diff --git a/Lib/test/test_email/test_generator.py b/Lib/test/test_email/test_generator.py index c1aeaefab775..89e7edeb63a8 100644 --- a/Lib/test/test_email/test_generator.py +++ b/Lib/test/test_email/test_generator.py @@ -4,6 +4,7 @@ from email import message_from_string, message_from_bytes from email.message import EmailMessage from email.generator import Generator, BytesGenerator +from email.headerregistry import Address from email import policy from test.test_email import TestEmailBase, parameterize @@ -291,6 +292,27 @@ def test_smtputf8_policy(self): g.flatten(msg) self.assertEqual(s.getvalue(), expected) + def test_smtp_policy(self): + msg = EmailMessage() + msg["From"] = Address(addr_spec="foo at bar.com", display_name="P?olo") + msg["To"] = Address(addr_spec="bar at foo.com", display_name="Dinsdale") + msg["Subject"] = "Nudge nudge, wink, wink" + msg.set_content("oh boy, know what I mean, know what I mean?") + expected = textwrap.dedent("""\ + From: =?utf-8?q?P=C3=A1olo?= + To: Dinsdale + Subject: Nudge nudge, wink, wink + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + + oh boy, know what I mean, know what I mean? + """).encode().replace(b"\n", b"\r\n") + s = io.BytesIO() + g = BytesGenerator(s, policy=policy.SMTP) + g.flatten(msg) + self.assertEqual(s.getvalue(), expected) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst b/Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst new file mode 100644 index 000000000000..2b384cd5513f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst @@ -0,0 +1,2 @@ +Fix serialization of messages containing encoded strings when the +policy.linesep is set to a multi-character string. Patch by Jens Troeger. From webhook-mailer at python.org Mon May 13 21:10:18 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 14 May 2019 01:10:18 -0000 Subject: [Python-checkins] Simplify the ``LastUpdatedOrderedDict`` example recipe (GH-13296) Message-ID: https://github.com/python/cpython/commit/1a10a6b980dbddb59a054f273dbd97ea5e7ccda4 commit: 1a10a6b980dbddb59a054f273dbd97ea5e7ccda4 branch: master author: wim glenn committer: Raymond Hettinger date: 2019-05-13T18:10:13-07:00 summary: Simplify the ``LastUpdatedOrderedDict`` example recipe (GH-13296) files: M Doc/library/collections.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 64de970fec94..e0469c208100 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -1141,7 +1141,7 @@ original insertion position is changed and moved to the end:: def __setitem__(self, key, value): super().__setitem__(key, value) - super().move_to_end(key) + self.move_to_end(key) An :class:`OrderedDict` would also be useful for implementing variants of :func:`functools.lru_cache`:: From webhook-mailer at python.org Mon May 13 21:47:36 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 01:47:36 -0000 Subject: [Python-checkins] bpo-36719: Fix regrtest MultiprocessThread (GH-13301) Message-ID: https://github.com/python/cpython/commit/c923c3449f825021b13521b2380e67ba35a36f55 commit: c923c3449f825021b13521b2380e67ba35a36f55 branch: master author: Victor Stinner committer: GitHub date: 2019-05-14T03:47:32+02:00 summary: bpo-36719: Fix regrtest MultiprocessThread (GH-13301) MultiprocessThread.kill() now closes stdout and stderr to prevent popen.communicate() to hang. files: M Lib/test/libregrtest/runtest_mp.py diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index ced7f866a899..42178471ef1d 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -21,6 +21,9 @@ # Display the running tests if nothing happened last N seconds PROGRESS_UPDATE = 30.0 # seconds +# Time to wait until a worker completes: should be immediate +JOIN_TIMEOUT = 30.0 # seconds + def must_stop(result, ns): if result.result == INTERRUPTED: @@ -91,6 +94,10 @@ def stop(self): MultiprocessResult = collections.namedtuple('MultiprocessResult', 'result stdout stderr error_msg') +class ExitThread(Exception): + pass + + class MultiprocessThread(threading.Thread): def __init__(self, pending, output, ns): super().__init__() @@ -100,13 +107,31 @@ def __init__(self, pending, output, ns): self.current_test_name = None self.start_time = None self._popen = None + self._killed = False + + def __repr__(self): + info = ['MultiprocessThread'] + test = self.current_test_name + if self.is_alive(): + info.append('alive') + if test: + info.append(f'test={test}') + popen = self._popen + if popen: + info.append(f'pid={popen.pid}') + return '<%s>' % ' '.join(info) def kill(self): + self._killed = True + popen = self._popen if popen is None: return - print("Kill regrtest worker process %s" % popen.pid) popen.kill() + # stdout and stderr must be closed to ensure that communicate() + # does not hang + popen.stdout.close() + popen.stderr.close() def _runtest(self, test_name): try: @@ -117,7 +142,21 @@ def _runtest(self, test_name): popen = self._popen with popen: try: - stdout, stderr = popen.communicate() + if self._killed: + # If kill() has been called before self._popen is set, + # self._popen is still running. Call again kill() + # to ensure that the process is killed. + self.kill() + raise ExitThread + + try: + stdout, stderr = popen.communicate() + except OSError: + if self._killed: + # kill() has been called: communicate() fails + # on reading closed stdout/stderr + raise ExitThread + raise except: self.kill() popen.wait() @@ -154,7 +193,7 @@ def _runtest(self, test_name): return MultiprocessResult(result, stdout, stderr, err_msg) def run(self): - while True: + while not self._killed: try: try: test_name = next(self.pending) @@ -166,6 +205,8 @@ def run(self): if must_stop(mp_result.result, self.ns): break + except ExitThread: + break except BaseException: self.output.put((True, traceback.format_exc())) break @@ -205,10 +246,20 @@ def start_workers(self): worker.start() def wait_workers(self): + start_time = time.monotonic() for worker in self.workers: worker.kill() for worker in self.workers: - worker.join() + while True: + worker.join(1.0) + if not worker.is_alive(): + break + dt = time.monotonic() - start_time + print("Wait for regrtest worker %r for %.1f sec" % (worker, dt)) + if dt > JOIN_TIMEOUT: + print("Warning -- failed to join a regrtest worker %s" + % worker) + break def _get_result(self): if not any(worker.is_alive() for worker in self.workers): From webhook-mailer at python.org Mon May 13 22:02:51 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 May 2019 02:02:51 -0000 Subject: [Python-checkins] bpo-34424: Handle different policy.linesep lengths correctly. (GH-8803) Message-ID: https://github.com/python/cpython/commit/c0abd0c8e9b62bc008fc74cfbfbbab36ef7d7617 commit: c0abd0c8e9b62bc008fc74cfbfbbab36ef7d7617 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-13T19:02:46-07:00 summary: bpo-34424: Handle different policy.linesep lengths correctly. (GH-8803) (cherry picked from commit 45b2f8893c1b7ab3b3981a966f82e42beea82106) Co-authored-by: Jens Troeger files: A Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_generator.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 416da1a80d9c..517652a3f67b 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2626,7 +2626,7 @@ def _refold_parse_tree(parse_tree, *, policy): want_encoding = False last_ew = None if part.syntactic_break: - encoded_part = part.fold(policy=policy)[:-1] # strip nl + encoded_part = part.fold(policy=policy)[:-len(policy.linesep)] if policy.linesep not in encoded_part: # It fits on a single line if len(encoded_part) > maxlen - len(lines[-1]): diff --git a/Lib/test/test_email/test_generator.py b/Lib/test/test_email/test_generator.py index c1aeaefab775..89e7edeb63a8 100644 --- a/Lib/test/test_email/test_generator.py +++ b/Lib/test/test_email/test_generator.py @@ -4,6 +4,7 @@ from email import message_from_string, message_from_bytes from email.message import EmailMessage from email.generator import Generator, BytesGenerator +from email.headerregistry import Address from email import policy from test.test_email import TestEmailBase, parameterize @@ -291,6 +292,27 @@ def test_smtputf8_policy(self): g.flatten(msg) self.assertEqual(s.getvalue(), expected) + def test_smtp_policy(self): + msg = EmailMessage() + msg["From"] = Address(addr_spec="foo at bar.com", display_name="P?olo") + msg["To"] = Address(addr_spec="bar at foo.com", display_name="Dinsdale") + msg["Subject"] = "Nudge nudge, wink, wink" + msg.set_content("oh boy, know what I mean, know what I mean?") + expected = textwrap.dedent("""\ + From: =?utf-8?q?P=C3=A1olo?= + To: Dinsdale + Subject: Nudge nudge, wink, wink + Content-Type: text/plain; charset="utf-8" + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + + oh boy, know what I mean, know what I mean? + """).encode().replace(b"\n", b"\r\n") + s = io.BytesIO() + g = BytesGenerator(s, policy=policy.SMTP) + g.flatten(msg) + self.assertEqual(s.getvalue(), expected) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst b/Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst new file mode 100644 index 000000000000..2b384cd5513f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst @@ -0,0 +1,2 @@ +Fix serialization of messages containing encoded strings when the +policy.linesep is set to a multi-character string. Patch by Jens Troeger. From webhook-mailer at python.org Mon May 13 22:21:29 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 May 2019 02:21:29 -0000 Subject: [Python-checkins] Changes to the documentation of normcase (GH-4725) Message-ID: https://github.com/python/cpython/commit/da86bf7396c6509534a94407fe83e7106c9d5959 commit: da86bf7396c6509534a94407fe83e7106c9d5959 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-13T19:21:25-07:00 summary: Changes to the documentation of normcase (GH-4725) (cherry picked from commit 32d1458b2e2e00eeb29022179eeb04b83fb7f3c4) Co-authored-by: Kexuan Sun files: M Doc/library/os.path.rst diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index d78ab068a31e..ef0e35d99867 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -81,7 +81,7 @@ the :mod:`glob` module.) .. function:: commonpath(paths) Return the longest common sub-path of each pathname in the sequence - *paths*. Raise ValueError if *paths* contains both absolute and relative + *paths*. Raise :exc:`ValueError` if *paths* contains both absolute and relative pathnames, or if *paths* is empty. Unlike :func:`commonprefix`, this returns a valid path. @@ -315,9 +315,9 @@ the :mod:`glob` module.) .. function:: normcase(path) - Normalize the case of a pathname. On Unix and Mac OS X, this returns the - path unchanged; on case-insensitive filesystems, it converts the path to - lowercase. On Windows, it also converts forward slashes to backward slashes. + Normalize the case of a pathname. On Windows, convert all characters in the + pathname to lowercase, and also convert forward slashes to backward slashes. + On other operating systems, return the path unchanged. Raise a :exc:`TypeError` if the type of *path* is not ``str`` or ``bytes`` (directly or indirectly through the :class:`os.PathLike` interface). From webhook-mailer at python.org Tue May 14 01:30:29 2019 From: webhook-mailer at python.org (Giampaolo Rodola) Date: Tue, 14 May 2019 05:30:29 -0000 Subject: [Python-checkins] bpo-24538: Fix bug in shutil involving the copying of xattrs to read-only files. (PR-13212) (#13234) Message-ID: https://github.com/python/cpython/commit/0a5b88e7f23b671d63896619b13148b0e4e2b5dd commit: 0a5b88e7f23b671d63896619b13148b0e4e2b5dd branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Giampaolo Rodola date: 2019-05-14T13:30:22+08:00 summary: bpo-24538: Fix bug in shutil involving the copying of xattrs to read-only files. (PR-13212) (#13234) Extended attributes can only be set on user-writeable files, but shutil previously first chmod()ed the destination file to the source's permissions and then tried to copy xattrs. This will cause failures if attempting to copy read-only files with xattrs, as occurs with Git clones on Lustre FS. (cherry picked from commit 79efbb719383386051c72f2ee932eeca8e033e6b) Co-authored-by: Olexa Bilaniuk files: A Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst M Lib/shutil.py M Lib/test/test_shutil.py M Misc/ACKS diff --git a/Lib/shutil.py b/Lib/shutil.py index b0a53dba3a34..4c6fdd7d33d4 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -203,6 +203,9 @@ def lookup(name): mode = stat.S_IMODE(st.st_mode) lookup("utime")(dst, ns=(st.st_atime_ns, st.st_mtime_ns), follow_symlinks=follow) + # We must copy extended attributes before the file is (potentially) + # chmod()'ed read-only, otherwise setxattr() will error with -EACCES. + _copyxattr(src, dst, follow_symlinks=follow) try: lookup("chmod")(dst, mode, follow_symlinks=follow) except NotImplementedError: @@ -226,7 +229,6 @@ def lookup(name): break else: raise - _copyxattr(src, dst, follow_symlinks=follow) def copy(src, dst, *, follow_symlinks=True): """Copy data and mode bits ("cp src dst"). Return the file's destination. diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 197dd130a964..ef9323962cae 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -464,12 +464,20 @@ def _raise_on_src(fname, *, follow_symlinks=True): # test that shutil.copystat copies xattrs src = os.path.join(tmp_dir, 'the_original') + srcro = os.path.join(tmp_dir, 'the_original_ro') write_file(src, src) + write_file(srcro, srcro) os.setxattr(src, 'user.the_value', b'fiddly') + os.setxattr(srcro, 'user.the_value', b'fiddly') + os.chmod(srcro, 0o444) dst = os.path.join(tmp_dir, 'the_copy') + dstro = os.path.join(tmp_dir, 'the_copy_ro') write_file(dst, dst) + write_file(dstro, dstro) shutil.copystat(src, dst) + shutil.copystat(srcro, dstro) self.assertEqual(os.getxattr(dst, 'user.the_value'), b'fiddly') + self.assertEqual(os.getxattr(dstro, 'user.the_value'), b'fiddly') @support.skip_unless_symlink @support.skip_unless_xattr diff --git a/Misc/ACKS b/Misc/ACKS index 4581f32dd5f8..8998c7bf6b61 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -147,6 +147,7 @@ Stephen Bevan Ron Bickers Natalia B. Bidart Adrian von Bidder +Olexa Bilaniuk David Binger Dominic Binks Philippe Biondi diff --git a/Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst b/Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst new file mode 100644 index 000000000000..e799f931bcec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst @@ -0,0 +1,3 @@ +In `shutil.copystat()`, first copy extended file attributes and then file +permissions, since extended attributes can only be set on the destination +while it is still writeable. From webhook-mailer at python.org Tue May 14 05:51:21 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 14 May 2019 09:51:21 -0000 Subject: [Python-checkins] bpo-27987: pymalloc: align by 16bytes on 64bit platform (GH-12850) Message-ID: https://github.com/python/cpython/commit/f0be4bbb9b3cee876249c23f2ae6f38f43fa7495 commit: f0be4bbb9b3cee876249c23f2ae6f38f43fa7495 branch: master author: Inada Naoki committer: GitHub date: 2019-05-14T18:51:15+09:00 summary: bpo-27987: pymalloc: align by 16bytes on 64bit platform (GH-12850) files: A Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst M Objects/obmalloc.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst new file mode 100644 index 000000000000..b0f32a5c6c3f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst @@ -0,0 +1,3 @@ +pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on +64-bit platforms to conform x86-64 ABI. Recent compilers assume this alignment +more often. Patch by Inada Naoki. diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 7cfd28965967..bd15bcf1363b 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -795,8 +795,14 @@ static int running_on_valgrind = -1; * * You shouldn't change this unless you know what you are doing. */ + +#if SIZEOF_VOID_P > 4 +#define ALIGNMENT 16 /* must be 2^N */ +#define ALIGNMENT_SHIFT 4 +#else #define ALIGNMENT 8 /* must be 2^N */ #define ALIGNMENT_SHIFT 3 +#endif /* Return the number of bytes in size class I, as a uint. */ #define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT) From webhook-mailer at python.org Tue May 14 06:33:05 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 14 May 2019 10:33:05 -0000 Subject: [Python-checkins] bpo-36845: validate integer network prefix when constructing IP networks (GH-13298) Message-ID: https://github.com/python/cpython/commit/5e48e3db6f5a937023e99d89cef8884d22bd8533 commit: 5e48e3db6f5a937023e99d89cef8884d22bd8533 branch: master author: Nicolai Moore committer: Inada Naoki date: 2019-05-14T19:32:59+09:00 summary: bpo-36845: validate integer network prefix when constructing IP networks (GH-13298) files: A Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst M Lib/ipaddress.py M Lib/test/test_ipaddress.py M Misc/ACKS diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 662d73738907..873c7644081a 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1108,6 +1108,8 @@ def _make_netmask(cls, arg): if arg not in cls._netmask_cache: if isinstance(arg, int): prefixlen = arg + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen) else: try: # Check for a netmask in prefix length form @@ -1538,6 +1540,8 @@ def _make_netmask(cls, arg): if arg not in cls._netmask_cache: if isinstance(arg, int): prefixlen = arg + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen) else: prefixlen = cls._prefix_from_prefix_string(arg) netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index 20316f15f8cf..9e17ea0c7aac 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -466,6 +466,14 @@ def assertBadNetmask(addr, netmask): assertBadNetmask("1.1.1.1", "pudding") assertBadNetmask("1.1.1.1", "::") + def test_netmask_in_tuple_errors(self): + def assertBadNetmask(addr, netmask): + msg = "%r is not a valid netmask" % netmask + with self.assertNetmaskError(re.escape(msg)): + self.factory((addr, netmask)) + assertBadNetmask("1.1.1.1", -1) + assertBadNetmask("1.1.1.1", 33) + def test_pickle(self): self.pickle_test('192.0.2.0/27') self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1 @@ -588,6 +596,14 @@ def assertBadNetmask(addr, netmask): assertBadNetmask("::1", "pudding") assertBadNetmask("::", "::") + def test_netmask_in_tuple_errors(self): + def assertBadNetmask(addr, netmask): + msg = "%r is not a valid netmask" % netmask + with self.assertNetmaskError(re.escape(msg)): + self.factory((addr, netmask)) + assertBadNetmask("::1", -1) + assertBadNetmask("::1", 129) + def test_pickle(self): self.pickle_test('2001:db8::1000/124') self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1 diff --git a/Misc/ACKS b/Misc/ACKS index dfb963753608..ec5b017d515a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1108,6 +1108,7 @@ Bastien Montagne Skip Montanaro Peter Moody Alan D. Moore +Nicolai Moore Paul Moore Ross Moore Ben Morgan diff --git a/Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst b/Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst new file mode 100644 index 000000000000..c819dce3a57c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst @@ -0,0 +1,2 @@ +Added validation of integer prefixes to the construction of IP networks and +interfaces in the ipaddress module. From webhook-mailer at python.org Tue May 14 07:00:21 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 14 May 2019 11:00:21 -0000 Subject: [Python-checkins] bpo-36845: validate integer network prefix when constructing IP networks (GH-13298) Message-ID: https://github.com/python/cpython/commit/30cccf084d1560d9e3382e69d828b3be8cdb0286 commit: 30cccf084d1560d9e3382e69d828b3be8cdb0286 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Inada Naoki date: 2019-05-14T20:00:16+09:00 summary: bpo-36845: validate integer network prefix when constructing IP networks (GH-13298) (cherry picked from commit 5e48e3db6f5a937023e99d89cef8884d22bd8533) Co-authored-by: Nicolai Moore files: A Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst M Lib/ipaddress.py M Lib/test/test_ipaddress.py M Misc/ACKS diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index cc9ae7118d67..4eec1f337c13 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1101,6 +1101,8 @@ def _make_netmask(cls, arg): if arg not in cls._netmask_cache: if isinstance(arg, int): prefixlen = arg + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen) else: try: # Check for a netmask in prefix length form @@ -1622,6 +1624,8 @@ def _make_netmask(cls, arg): if arg not in cls._netmask_cache: if isinstance(arg, int): prefixlen = arg + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen) else: prefixlen = cls._prefix_from_prefix_string(arg) netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index 0e0753f34c49..3c50eec456ab 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -466,6 +466,14 @@ def assertBadNetmask(addr, netmask): assertBadNetmask("1.1.1.1", "pudding") assertBadNetmask("1.1.1.1", "::") + def test_netmask_in_tuple_errors(self): + def assertBadNetmask(addr, netmask): + msg = "%r is not a valid netmask" % netmask + with self.assertNetmaskError(re.escape(msg)): + self.factory((addr, netmask)) + assertBadNetmask("1.1.1.1", -1) + assertBadNetmask("1.1.1.1", 33) + def test_pickle(self): self.pickle_test('192.0.2.0/27') self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1 @@ -579,6 +587,14 @@ def assertBadNetmask(addr, netmask): assertBadNetmask("::1", "pudding") assertBadNetmask("::", "::") + def test_netmask_in_tuple_errors(self): + def assertBadNetmask(addr, netmask): + msg = "%r is not a valid netmask" % netmask + with self.assertNetmaskError(re.escape(msg)): + self.factory((addr, netmask)) + assertBadNetmask("::1", -1) + assertBadNetmask("::1", 129) + def test_pickle(self): self.pickle_test('2001:db8::1000/124') self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1 diff --git a/Misc/ACKS b/Misc/ACKS index 8998c7bf6b61..025944f318f9 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1093,6 +1093,7 @@ Bastien Montagne Skip Montanaro Peter Moody Alan D. Moore +Nicolai Moore Paul Moore Ross Moore Ben Morgan diff --git a/Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst b/Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst new file mode 100644 index 000000000000..c819dce3a57c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst @@ -0,0 +1,2 @@ +Added validation of integer prefixes to the construction of IP networks and +interfaces in the ipaddress module. From webhook-mailer at python.org Tue May 14 07:49:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 May 2019 11:49:56 -0000 Subject: [Python-checkins] Doc: Update pip and setuptools when creating the virtual environment (GH-13307) Message-ID: https://github.com/python/cpython/commit/0a52d73ddeeac23f73c919d636e7008ddde5c72b commit: 0a52d73ddeeac23f73c919d636e7008ddde5c72b branch: master author: St?phane Wirtel committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-14T04:49:49-07:00 summary: Doc: Update pip and setuptools when creating the virtual environment (GH-13307) Add a new pip install before `sphinx` etc.. because we should use the last version of `pip` and `setuptools` files: M Doc/Makefile diff --git a/Doc/Makefile b/Doc/Makefile index cf1bb88b0b8e..6f86728ea834 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -132,6 +132,7 @@ clean: venv: $(PYTHON) -m venv $(VENVDIR) + $(VENVDIR)/bin/python3 -m pip install -U pip setuptools $(VENVDIR)/bin/python3 -m pip install -U Sphinx blurb python-docs-theme @echo "The venv has been created in the $(VENVDIR) directory" From webhook-mailer at python.org Tue May 14 08:04:44 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Tue, 14 May 2019 12:04:44 -0000 Subject: [Python-checkins] bpo-36797: Prune more legacy distutils documentation (GH-13092) Message-ID: https://github.com/python/cpython/commit/dae1229729920e3aa2be015453b7f702dff9b375 commit: dae1229729920e3aa2be015453b7f702dff9b375 branch: master author: Nick Coghlan committer: GitHub date: 2019-05-14T22:04:30+10:00 summary: bpo-36797: Prune more legacy distutils documentation (GH-13092) Removes more legacy distutils documentation, and more clearly marks what is left as potentially outdated, with references to setuptools as a replacement. files: A Doc/distutils/_setuptools_disclaimer.rst A Misc/NEWS.d/next/Documentation/2019-05-05-07-58-50.bpo-36797.W1X4On.rst M Doc/distutils/apiref.rst M Doc/distutils/builtdist.rst M Doc/distutils/commandref.rst M Doc/distutils/configfile.rst M Doc/distutils/examples.rst M Doc/distutils/extending.rst M Doc/distutils/index.rst M Doc/distutils/introduction.rst M Doc/distutils/setupscript.rst M Doc/distutils/sourcedist.rst M Doc/install/index.rst M Doc/tools/susp-ignored.csv diff --git a/Doc/distutils/_setuptools_disclaimer.rst b/Doc/distutils/_setuptools_disclaimer.rst new file mode 100644 index 000000000000..cc75858326d4 --- /dev/null +++ b/Doc/distutils/_setuptools_disclaimer.rst @@ -0,0 +1,5 @@ +.. note:: + + This document is being retained solely until the ``setuptools`` documentation + at https://setuptools.readthedocs.io/en/latest/setuptools.html + independently covers all of the relevant information currently included here. diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst index 1facc0408d5b..cbeedab5bb12 100644 --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -4,6 +4,16 @@ API Reference ************* +.. seealso:: + + `New and changed setup.py arguments in setuptools `_ + The ``setuptools`` project adds new capabilities to the ``setup`` function + and other APIs, makes the API consistent across different Python versions, + and is hence recommended over using ``distutils`` directly. + +.. _setuptools-setup-py: https://setuptools.readthedocs.io/en/latest/setuptools.html#new-and-changed-setup-keywords + +.. include:: ./_setuptools_disclaimer.rst :mod:`distutils.core` --- Core Distutils functionality ====================================================== diff --git a/Doc/distutils/builtdist.rst b/Doc/distutils/builtdist.rst index f1f347126160..f44d0d039f45 100644 --- a/Doc/distutils/builtdist.rst +++ b/Doc/distutils/builtdist.rst @@ -4,6 +4,8 @@ Creating Built Distributions **************************** +.. include:: ./_setuptools_disclaimer.rst + A "built distribution" is what you're probably used to thinking of either as a "binary package" or an "installer" (depending on your background). It's not necessarily binary, though, because it might contain only Python source code diff --git a/Doc/distutils/commandref.rst b/Doc/distutils/commandref.rst index 6a2ac960f1e1..0f6fe2aba865 100644 --- a/Doc/distutils/commandref.rst +++ b/Doc/distutils/commandref.rst @@ -4,6 +4,8 @@ Command Reference ***************** +.. include:: ./_setuptools_disclaimer.rst + .. % \section{Building modules: the \protect\command{build} command family} .. % \label{build-cmds} .. % \subsubsection{\protect\command{build}} diff --git a/Doc/distutils/configfile.rst b/Doc/distutils/configfile.rst index 0874d05fe703..2a5c8329e318 100644 --- a/Doc/distutils/configfile.rst +++ b/Doc/distutils/configfile.rst @@ -4,6 +4,8 @@ Writing the Setup Configuration File ************************************ +.. include:: ./_setuptools_disclaimer.rst + Often, it's not possible to write down everything needed to build a distribution *a priori*: you may need to get some information from the user, or from the user's system, in order to proceed. As long as that information is fairly diff --git a/Doc/distutils/examples.rst b/Doc/distutils/examples.rst index f81e06b5e605..4ac552c7c699 100644 --- a/Doc/distutils/examples.rst +++ b/Doc/distutils/examples.rst @@ -4,6 +4,8 @@ Examples ******** +.. include:: ./_setuptools_disclaimer.rst + This chapter provides a number of basic examples to help get started with distutils. Additional information about using distutils can be found in the Distutils Cookbook. diff --git a/Doc/distutils/extending.rst b/Doc/distutils/extending.rst index 501fd7c564c6..1075e81779a7 100644 --- a/Doc/distutils/extending.rst +++ b/Doc/distutils/extending.rst @@ -4,6 +4,8 @@ Extending Distutils ******************* +.. include:: ./_setuptools_disclaimer.rst + Distutils can be extended in various ways. Most extensions take the form of new commands or replacements for existing commands. New commands may be written to support new types of platform-specific packaging, for example, while diff --git a/Doc/distutils/index.rst b/Doc/distutils/index.rst index d6f7640fcb68..c56fafd68d8f 100644 --- a/Doc/distutils/index.rst +++ b/Doc/distutils/index.rst @@ -12,10 +12,7 @@ :ref:`distributing-index` The up to date module distribution documentations -This document describes the Python Distribution Utilities ("Distutils") from -the module developer's point of view, describing how to use the Distutils to -make Python modules and extensions easily available to a wider audience with -very little overhead for build/release/install mechanics. +.. include:: ./_setuptools_disclaimer.rst .. note:: @@ -25,6 +22,11 @@ very little overhead for build/release/install mechanics. recommendations section `__ in the Python Packaging User Guide for more information. +This document describes the Python Distribution Utilities ("Distutils") from +the module developer's point of view, describing the underlying capabilities +that ``setuptools`` builds on to allow Python developers to make Python modules +and extensions readily available to a wider audience. + .. toctree:: :maxdepth: 2 :numbered: diff --git a/Doc/distutils/introduction.rst b/Doc/distutils/introduction.rst index 7721484fe737..1f8a560e1386 100644 --- a/Doc/distutils/introduction.rst +++ b/Doc/distutils/introduction.rst @@ -4,6 +4,8 @@ An Introduction to Distutils **************************** +.. include:: ./_setuptools_disclaimer.rst + This document covers using the Distutils to distribute your Python modules, concentrating on the role of developer/distributor: if you're looking for information on installing Python modules, you should refer to the diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst index 1f99f62f6aff..4386a60b664b 100644 --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -4,6 +4,8 @@ Writing the Setup Script ************************ +.. include:: ./_setuptools_disclaimer.rst + The setup script is the centre of all activity in building, distributing, and installing modules using the Distutils. The main purpose of the setup script is to describe your module distribution to the Distutils, so that the various diff --git a/Doc/distutils/sourcedist.rst b/Doc/distutils/sourcedist.rst index 0ac8ef41ddc2..0600663d00e9 100644 --- a/Doc/distutils/sourcedist.rst +++ b/Doc/distutils/sourcedist.rst @@ -4,6 +4,8 @@ Creating a Source Distribution ****************************** +.. include:: ./_setuptools_disclaimer.rst + As shown in section :ref:`distutils-simple-example`, you use the :command:`sdist` command to create a source distribution. In the simplest case, :: diff --git a/Doc/install/index.rst b/Doc/install/index.rst index f6a8cd6833a9..e14232415be6 100644 --- a/Doc/install/index.rst +++ b/Doc/install/index.rst @@ -13,23 +13,10 @@ .. seealso:: :ref:`installing-index` - The up to date module installation documentations - -.. The audience for this document includes people who don't know anything - about Python and aren't about to learn the language just in order to - install and maintain it for their users, i.e. system administrators. - Thus, I have to be sure to explain the basics at some point: - sys.path and PYTHONPATH at least. Should probably give pointers to - other docs on "import site", PYTHONSTARTUP, PYTHONHOME, etc. - - Finally, it might be useful to include all the material from my "Care - and Feeding of a Python Installation" talk in here somewhere. Yow! - -This document describes the Python Distribution Utilities ("Distutils") from the -end-user's point-of-view, describing how to extend the capabilities of a -standard Python installation by building and installing third-party Python -modules and extensions. + The up to date module installation documentation. For regular Python + usage, you almost certainly want that document rather than this one. +.. include:: ../distutils/_setuptools_disclaimer.rst .. note:: @@ -46,59 +33,26 @@ modules and extensions. Introduction ============ -Although Python's extensive standard library covers many programming needs, -there often comes a time when you need to add some new functionality to your -Python installation in the form of third-party modules. This might be necessary -to support your own programming, or to support an application that you want to -use and that happens to be written in Python. - -In the past, there has been little support for adding third-party modules to an -existing Python installation. With the introduction of the Python Distribution -Utilities (Distutils for short) in Python 2.0, this changed. - -This document is aimed primarily at the people who need to install third-party -Python modules: end-users and system administrators who just need to get some -Python application running, and existing Python programmers who want to add some -new goodies to their toolbox. You don't need to know Python to read this -document; there will be some brief forays into using Python's interactive mode -to explore your installation, but that's it. If you're looking for information -on how to distribute your own Python modules so that others may use them, see -the :ref:`distutils-index` manual. :ref:`debug-setup-script` may also be of -interest. - - -.. _inst-trivial-install: - -Best case: trivial installation -------------------------------- - -In the best case, someone will have prepared a special version of the module -distribution you want to install that is targeted specifically at your platform -and is installed just like any other software on your platform. For example, -the module developer might make an executable installer available for Windows -users, an RPM package for users of RPM-based Linux systems (Red Hat, SuSE, -Mandrake, and many others), a Debian package for users of Debian-based Linux -systems, and so forth. - -In that case, you would download the installer appropriate to your platform and -do the obvious thing with it: run it if it's an executable installer, ``rpm ---install`` it if it's an RPM, etc. You don't need to run Python or a setup -script, you don't need to compile anything---you might not even need to read any -instructions (although it's always a good idea to do so anyway). - -Of course, things will not always be that easy. You might be interested in a -module distribution that doesn't have an easy-to-use installer for your -platform. In that case, you'll have to start with the source distribution -released by the module's author/maintainer. Installing from a source -distribution is not too hard, as long as the modules are packaged in the -standard way. The bulk of this document is about building and installing -modules from standard source distributions. +In Python 2.0, the ``distutils`` API was first added to the standard library. +This provided Linux distro maintainers with a standard way of converting +Python projects into Linux distro packages, and system administrators with a +standard way of installing them directly onto target systems. + +In the many years since Python 2.0 was released, tightly coupling the build +system and package installer to the language runtime release cycle has turned +out to be problematic, and it is now recommended that projects use the +``pip`` package installer and the ``setuptools`` build system, rather than +using ``distutils`` directly. + +See :ref:`installing-index` and :ref:`distributing-index` for more details. +This legacy documentation is being retained only until we're confident that the +``setuptools`` documentation covers everything needed. .. _inst-new-standard: -The new standard: Distutils ---------------------------- +Distutils based source distributions +------------------------------------ If you download a module source distribution, you can tell pretty quickly if it was packaged and distributed in the standard way, i.e. using the Distutils. diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 3672955bf55b..31b22665eca4 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -4,7 +4,7 @@ c-api/sequence,,:i2,del o[i1:i2] c-api/sequence,,:i2,o[i1:i2] c-api/unicode,,:end,str[start:end] c-api/unicode,,:start,unicode[start:start+length] -distutils/examples,267,`,This is the description of the ``foobar`` package. +distutils/examples,274,`,This is the description of the ``foobar`` package. distutils/setupscript,,::, extending/embedding,,:numargs,"if(!PyArg_ParseTuple(args, "":numargs""))" extending/extending,,:myfunction,"PyArg_ParseTuple(args, ""D:myfunction"", &c);" diff --git a/Misc/NEWS.d/next/Documentation/2019-05-05-07-58-50.bpo-36797.W1X4On.rst b/Misc/NEWS.d/next/Documentation/2019-05-05-07-58-50.bpo-36797.W1X4On.rst new file mode 100644 index 000000000000..5ca55556c887 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-05-07-58-50.bpo-36797.W1X4On.rst @@ -0,0 +1,3 @@ +More of the legacy distutils documentation has been either pruned, or else +more clearly marked as being retained solely until the setuptools +documentation covers it independently. From webhook-mailer at python.org Tue May 14 08:11:46 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Tue, 14 May 2019 12:11:46 -0000 Subject: [Python-checkins] bpo-32995 - Added context variable in glossary (GH-9741) Message-ID: https://github.com/python/cpython/commit/c0a1a07c7e9814cad79cce3580c16284b2df7f52 commit: c0a1a07c7e9814cad79cce3580c16284b2df7f52 branch: master author: Vinodhini Balusamy committer: Cheryl Sabella date: 2019-05-14T08:11:41-04:00 summary: bpo-32995 - Added context variable in glossary (GH-9741) files: A Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 9c64e4886319..d3ce36525519 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -225,6 +225,15 @@ Glossary statement by defining :meth:`__enter__` and :meth:`__exit__` methods. See :pep:`343`. + context variable + A variable which can have different values depending on its context. + This is similar to Thread-Local Storage in which each execution + thread may have a different value for a variable. However, with context + variables, there may be several contexts in one execution thread and the + main usage for context variables is to keep track of variables in + concurrent asynchronous tasks. + See :mod:`contextvars`. + contiguous .. index:: C-contiguous, Fortran contiguous diff --git a/Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst b/Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst new file mode 100644 index 000000000000..1df5eeaa965a --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst @@ -0,0 +1 @@ +Added the context variable in glossary. From webhook-mailer at python.org Tue May 14 08:12:52 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 12:12:52 -0000 Subject: [Python-checkins] bpo-36719: Fix regrtest MultiprocessThread (GH-13301) (GH-13303) Message-ID: https://github.com/python/cpython/commit/d8e123a48f1666227abdb90d84c58efe7bb4f3d8 commit: d8e123a48f1666227abdb90d84c58efe7bb4f3d8 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-05-14T14:12:49+02:00 summary: bpo-36719: Fix regrtest MultiprocessThread (GH-13301) (GH-13303) MultiprocessThread.kill() now closes stdout and stderr to prevent popen.communicate() to hang. (cherry picked from commit c923c3449f825021b13521b2380e67ba35a36f55) Co-authored-by: Victor Stinner files: M Lib/test/libregrtest/runtest_mp.py diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index ced7f866a899..42178471ef1d 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -21,6 +21,9 @@ # Display the running tests if nothing happened last N seconds PROGRESS_UPDATE = 30.0 # seconds +# Time to wait until a worker completes: should be immediate +JOIN_TIMEOUT = 30.0 # seconds + def must_stop(result, ns): if result.result == INTERRUPTED: @@ -91,6 +94,10 @@ def stop(self): MultiprocessResult = collections.namedtuple('MultiprocessResult', 'result stdout stderr error_msg') +class ExitThread(Exception): + pass + + class MultiprocessThread(threading.Thread): def __init__(self, pending, output, ns): super().__init__() @@ -100,13 +107,31 @@ def __init__(self, pending, output, ns): self.current_test_name = None self.start_time = None self._popen = None + self._killed = False + + def __repr__(self): + info = ['MultiprocessThread'] + test = self.current_test_name + if self.is_alive(): + info.append('alive') + if test: + info.append(f'test={test}') + popen = self._popen + if popen: + info.append(f'pid={popen.pid}') + return '<%s>' % ' '.join(info) def kill(self): + self._killed = True + popen = self._popen if popen is None: return - print("Kill regrtest worker process %s" % popen.pid) popen.kill() + # stdout and stderr must be closed to ensure that communicate() + # does not hang + popen.stdout.close() + popen.stderr.close() def _runtest(self, test_name): try: @@ -117,7 +142,21 @@ def _runtest(self, test_name): popen = self._popen with popen: try: - stdout, stderr = popen.communicate() + if self._killed: + # If kill() has been called before self._popen is set, + # self._popen is still running. Call again kill() + # to ensure that the process is killed. + self.kill() + raise ExitThread + + try: + stdout, stderr = popen.communicate() + except OSError: + if self._killed: + # kill() has been called: communicate() fails + # on reading closed stdout/stderr + raise ExitThread + raise except: self.kill() popen.wait() @@ -154,7 +193,7 @@ def _runtest(self, test_name): return MultiprocessResult(result, stdout, stderr, err_msg) def run(self): - while True: + while not self._killed: try: try: test_name = next(self.pending) @@ -166,6 +205,8 @@ def run(self): if must_stop(mp_result.result, self.ns): break + except ExitThread: + break except BaseException: self.output.put((True, traceback.format_exc())) break @@ -205,10 +246,20 @@ def start_workers(self): worker.start() def wait_workers(self): + start_time = time.monotonic() for worker in self.workers: worker.kill() for worker in self.workers: - worker.join() + while True: + worker.join(1.0) + if not worker.is_alive(): + break + dt = time.monotonic() - start_time + print("Wait for regrtest worker %r for %.1f sec" % (worker, dt)) + if dt > JOIN_TIMEOUT: + print("Warning -- failed to join a regrtest worker %s" + % worker) + break def _get_result(self): if not any(worker.is_alive() for worker in self.workers): From webhook-mailer at python.org Tue May 14 08:24:51 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 May 2019 12:24:51 -0000 Subject: [Python-checkins] bpo-32995 - Added context variable in glossary (GH-9741) Message-ID: https://github.com/python/cpython/commit/8b3823ae16d68cf17ad037e46d7e49d26929a13b commit: 8b3823ae16d68cf17ad037e46d7e49d26929a13b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-14T05:24:42-07:00 summary: bpo-32995 - Added context variable in glossary (GH-9741) (cherry picked from commit c0a1a07c7e9814cad79cce3580c16284b2df7f52) Co-authored-by: Vinodhini Balusamy files: A Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 9ca46222ad9b..b6ab28617d14 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -221,6 +221,15 @@ Glossary statement by defining :meth:`__enter__` and :meth:`__exit__` methods. See :pep:`343`. + context variable + A variable which can have different values depending on its context. + This is similar to Thread-Local Storage in which each execution + thread may have a different value for a variable. However, with context + variables, there may be several contexts in one execution thread and the + main usage for context variables is to keep track of variables in + concurrent asynchronous tasks. + See :mod:`contextvars`. + contiguous .. index:: C-contiguous, Fortran contiguous diff --git a/Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst b/Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst new file mode 100644 index 000000000000..1df5eeaa965a --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst @@ -0,0 +1 @@ +Added the context variable in glossary. From webhook-mailer at python.org Tue May 14 09:45:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 May 2019 13:45:32 -0000 Subject: [Python-checkins] Change WriterObj.writeline to WriterObj.write (GH-12344) Message-ID: https://github.com/python/cpython/commit/2bc158fefe89db8dfdd6d03ae6b3f2caa2f0cd6c commit: 2bc158fefe89db8dfdd6d03ae6b3f2caa2f0cd6c branch: master author: R?mi Lapeyre committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-14T06:45:14-07:00 summary: Change WriterObj.writeline to WriterObj.write (GH-12344) This cleans the csv module a bit, I don't think it requires a bpo issue or a news entry. files: M Modules/_csv.c diff --git a/Modules/_csv.c b/Modules/_csv.c index d86f63ef5976..e31b158c601e 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -111,7 +111,7 @@ static PyTypeObject Reader_Type; typedef struct { PyObject_HEAD - PyObject *writeline; /* write output lines to this file */ + PyObject *write; /* write output lines to this file */ DialectObj *dialect; /* parsing dialect */ @@ -1231,14 +1231,16 @@ csv_writerow(WriterObj *self, PyObject *seq) /* Add line terminator. */ - if (!join_append_lineterminator(self)) + if (!join_append_lineterminator(self)) { return NULL; + } line = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, (void *) self->rec, self->rec_len); - if (line == NULL) + if (line == NULL) { return NULL; - result = PyObject_CallFunctionObjArgs(self->writeline, line, NULL); + } + result = PyObject_CallFunctionObjArgs(self->write, line, NULL); Py_DECREF(line); return result; } @@ -1294,7 +1296,7 @@ Writer_dealloc(WriterObj *self) { PyObject_GC_UnTrack(self); Py_XDECREF(self->dialect); - Py_XDECREF(self->writeline); + Py_XDECREF(self->write); if (self->rec != NULL) PyMem_Free(self->rec); PyObject_GC_Del(self); @@ -1304,7 +1306,7 @@ static int Writer_traverse(WriterObj *self, visitproc visit, void *arg) { Py_VISIT(self->dialect); - Py_VISIT(self->writeline); + Py_VISIT(self->write); return 0; } @@ -1312,7 +1314,7 @@ static int Writer_clear(WriterObj *self) { Py_CLEAR(self->dialect); - Py_CLEAR(self->writeline); + Py_CLEAR(self->write); return 0; } @@ -1369,7 +1371,7 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args) return NULL; self->dialect = NULL; - self->writeline = NULL; + self->write = NULL; self->rec = NULL; self->rec_size = 0; @@ -1380,8 +1382,8 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args) Py_DECREF(self); return NULL; } - self->writeline = _PyObject_GetAttrId(output_file, &PyId_write); - if (self->writeline == NULL || !PyCallable_Check(self->writeline)) { + self->write = _PyObject_GetAttrId(output_file, &PyId_write); + if (self->write == NULL || !PyCallable_Check(self->write)) { PyErr_SetString(PyExc_TypeError, "argument 1 must have a \"write\" method"); Py_DECREF(self); From webhook-mailer at python.org Tue May 14 09:49:23 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 13:49:23 -0000 Subject: [Python-checkins] bpo-36915: regrtest always remove tempdir of worker processes (GH-13312) Message-ID: https://github.com/python/cpython/commit/3c93153f7db5dd9b06f229e61978fd9199b3c097 commit: 3c93153f7db5dd9b06f229e61978fd9199b3c097 branch: master author: Victor Stinner committer: GitHub date: 2019-05-14T15:49:16+02:00 summary: bpo-36915: regrtest always remove tempdir of worker processes (GH-13312) When using multiprocessing (-jN option), worker processes now create their temporary directory inside the temporary directory of the main process. So the main process is able to remove temporary directories of worker processes even if they crash or when they are killed by regrtest on KeyboardInterrupt (CTRL+c). Rework also how multiprocessing arguments are parsed in main.py. files: A Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst M Lib/test/libregrtest/main.py M Lib/test/libregrtest/runtest_mp.py diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 02717d8c7b13..a9b2b352d120 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -1,6 +1,5 @@ import datetime import faulthandler -import json import locale import os import platform @@ -22,22 +21,6 @@ from test import support -# When tests are run from the Python build directory, it is best practice -# to keep the test files in a subfolder. This eases the cleanup of leftover -# files using the "make distclean" command. -if sysconfig.is_python_build(): - TEMPDIR = sysconfig.get_config_var('abs_builddir') - if TEMPDIR is None: - # bpo-30284: On Windows, only srcdir is available. Using abs_builddir - # mostly matters on UNIX when building Python out of the source tree, - # especially when the source tree is read only. - TEMPDIR = sysconfig.get_config_var('srcdir') - TEMPDIR = os.path.join(TEMPDIR, 'build') -else: - TEMPDIR = tempfile.gettempdir() -TEMPDIR = os.path.abspath(TEMPDIR) - - class Regrtest: """Execute a test suite. @@ -98,7 +81,10 @@ def __init__(self): # used by --junit-xml self.testsuite_xml = None + # misc self.win_load_tracker = None + self.tmp_dir = None + self.worker_test_name = None def get_executed(self): return (set(self.good) | set(self.bad) | set(self.skipped) @@ -177,6 +163,13 @@ def parse_args(self, kwargs): if ns.xmlpath: support.junit_xml_list = self.testsuite_xml = [] + worker_args = ns.worker_args + if worker_args is not None: + from test.libregrtest.runtest_mp import parse_worker_args + ns, test_name = parse_worker_args(ns.worker_args) + ns.worker_args = worker_args + self.worker_test_name = test_name + # Strip .py extensions. removepy(ns.args) @@ -186,7 +179,7 @@ def find_tests(self, tests): self.tests = tests if self.ns.single: - self.next_single_filename = os.path.join(TEMPDIR, 'pynexttest') + self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') try: with open(self.next_single_filename, 'r') as fp: next_test = fp.read().strip() @@ -544,29 +537,54 @@ def save_xml_result(self): for s in ET.tostringlist(root): f.write(s) - def main(self, tests=None, **kwargs): - global TEMPDIR - self.ns = self.parse_args(kwargs) - + def create_temp_dir(self): if self.ns.tempdir: - TEMPDIR = self.ns.tempdir - elif self.ns.worker_args: - ns_dict, _ = json.loads(self.ns.worker_args) - TEMPDIR = ns_dict.get("tempdir") or TEMPDIR + self.tmp_dir = self.ns.tempdir + + if not self.tmp_dir: + # When tests are run from the Python build directory, it is best practice + # to keep the test files in a subfolder. This eases the cleanup of leftover + # files using the "make distclean" command. + if sysconfig.is_python_build(): + self.tmp_dir = sysconfig.get_config_var('abs_builddir') + if self.tmp_dir is None: + # bpo-30284: On Windows, only srcdir is available. Using + # abs_builddir mostly matters on UNIX when building Python + # out of the source tree, especially when the source tree + # is read only. + self.tmp_dir = sysconfig.get_config_var('srcdir') + self.tmp_dir = os.path.join(self.tmp_dir, 'build') + else: + self.tmp_dir = tempfile.gettempdir() - os.makedirs(TEMPDIR, exist_ok=True) + self.tmp_dir = os.path.abspath(self.tmp_dir) + os.makedirs(self.tmp_dir, exist_ok=True) # Define a writable temp dir that will be used as cwd while running # the tests. The name of the dir includes the pid to allow parallel # testing (see the -j option). - test_cwd = 'test_python_{}'.format(os.getpid()) - test_cwd = os.path.join(TEMPDIR, test_cwd) + pid = os.getpid() + if self.worker_test_name is not None: + test_cwd = 'worker_{}'.format(pid) + else: + test_cwd = 'test_python_{}'.format(pid) + test_cwd = os.path.join(self.tmp_dir, test_cwd) + return test_cwd + + def main(self, tests=None, **kwargs): + self.ns = self.parse_args(kwargs) + + test_cwd = self.create_temp_dir() - # Run the tests in a context manager that temporarily changes the CWD to a - # temporary and writable directory. If it's not possible to create or - # change the CWD, the original CWD will be used. The original CWD is - # available from support.SAVEDCWD. + # Run the tests in a context manager that temporarily changes the CWD + # to a temporary and writable directory. If it's not possible to + # create or change the CWD, the original CWD will be used. + # The original CWD is available from support.SAVEDCWD. with support.temp_cwd(test_cwd, quiet=True): + # When using multiprocessing, worker processes will use test_cwd + # as their parent temporary directory. So when the main process + # exit, it removes also subdirectories of worker processes. + self.ns.tempdir = test_cwd self._main(tests, kwargs) def getloadavg(self): @@ -588,9 +606,9 @@ def _main(self, tests, kwargs): print(msg, file=sys.stderr, flush=True) sys.exit(2) - if self.ns.worker_args is not None: + if self.worker_test_name is not None: from test.libregrtest.runtest_mp import run_tests_worker - run_tests_worker(self.ns.worker_args) + run_tests_worker(self.ns, self.worker_test_name) if self.ns.wait: input("Press any key to continue...") @@ -611,7 +629,7 @@ def _main(self, tests, kwargs): # If we're on windows and this is the parent runner (not a worker), # track the load average. - if sys.platform == 'win32' and (self.ns.worker_args is None): + if sys.platform == 'win32' and self.worker_test_name is None: from test.libregrtest.win_utils import WindowsLoadTracker try: diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 42178471ef1d..aa2409b4ef79 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -33,6 +33,12 @@ def must_stop(result, ns): return False +def parse_worker_args(worker_args): + ns_dict, test_name = json.loads(worker_args) + ns = types.SimpleNamespace(**ns_dict) + return (ns, test_name) + + def run_test_in_subprocess(testname, ns): ns_dict = vars(ns) worker_args = (ns_dict, testname) @@ -42,8 +48,6 @@ def run_test_in_subprocess(testname, ns): '-u', # Unbuffered stdout and stderr '-m', 'test.regrtest', '--worker-args', worker_args] - if ns.pgo: - cmd += ['--pgo'] # Running the child from the same working directory as regrtest's original # invocation ensures that TEMPDIR for the child is the same when @@ -56,15 +60,15 @@ def run_test_in_subprocess(testname, ns): cwd=support.SAVEDCWD) -def run_tests_worker(worker_args): - ns_dict, testname = json.loads(worker_args) - ns = types.SimpleNamespace(**ns_dict) - +def run_tests_worker(ns, test_name): setup_tests(ns) - result = runtest(ns, testname) + result = runtest(ns, test_name) + print() # Force a newline (just in case) - print(json.dumps(result), flush=True) + + # Serialize TestResult as list in JSON + print(json.dumps(list(result)), flush=True) sys.exit(0) diff --git a/Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst b/Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst new file mode 100644 index 000000000000..4eebfb483251 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst @@ -0,0 +1,3 @@ +The main regrtest process now always removes all temporary directories of +worker processes even if they crash or if they are killed on +KeyboardInterrupt (CTRL+c). From webhook-mailer at python.org Tue May 14 11:25:12 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 May 2019 15:25:12 -0000 Subject: [Python-checkins] bpo-36915: regrtest always remove tempdir of worker processes (GH-13312) Message-ID: https://github.com/python/cpython/commit/ecd668d6d99ff03166427f02347454cfdf904a6c commit: ecd668d6d99ff03166427f02347454cfdf904a6c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-14T08:25:06-07:00 summary: bpo-36915: regrtest always remove tempdir of worker processes (GH-13312) When using multiprocessing (-jN option), worker processes now create their temporary directory inside the temporary directory of the main process. So the main process is able to remove temporary directories of worker processes even if they crash or when they are killed by regrtest on KeyboardInterrupt (CTRL+c). Rework also how multiprocessing arguments are parsed in main.py. (cherry picked from commit 3c93153f7db5dd9b06f229e61978fd9199b3c097) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst M Lib/test/libregrtest/main.py M Lib/test/libregrtest/runtest_mp.py diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 02717d8c7b13..a9b2b352d120 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -1,6 +1,5 @@ import datetime import faulthandler -import json import locale import os import platform @@ -22,22 +21,6 @@ from test import support -# When tests are run from the Python build directory, it is best practice -# to keep the test files in a subfolder. This eases the cleanup of leftover -# files using the "make distclean" command. -if sysconfig.is_python_build(): - TEMPDIR = sysconfig.get_config_var('abs_builddir') - if TEMPDIR is None: - # bpo-30284: On Windows, only srcdir is available. Using abs_builddir - # mostly matters on UNIX when building Python out of the source tree, - # especially when the source tree is read only. - TEMPDIR = sysconfig.get_config_var('srcdir') - TEMPDIR = os.path.join(TEMPDIR, 'build') -else: - TEMPDIR = tempfile.gettempdir() -TEMPDIR = os.path.abspath(TEMPDIR) - - class Regrtest: """Execute a test suite. @@ -98,7 +81,10 @@ def __init__(self): # used by --junit-xml self.testsuite_xml = None + # misc self.win_load_tracker = None + self.tmp_dir = None + self.worker_test_name = None def get_executed(self): return (set(self.good) | set(self.bad) | set(self.skipped) @@ -177,6 +163,13 @@ def parse_args(self, kwargs): if ns.xmlpath: support.junit_xml_list = self.testsuite_xml = [] + worker_args = ns.worker_args + if worker_args is not None: + from test.libregrtest.runtest_mp import parse_worker_args + ns, test_name = parse_worker_args(ns.worker_args) + ns.worker_args = worker_args + self.worker_test_name = test_name + # Strip .py extensions. removepy(ns.args) @@ -186,7 +179,7 @@ def find_tests(self, tests): self.tests = tests if self.ns.single: - self.next_single_filename = os.path.join(TEMPDIR, 'pynexttest') + self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') try: with open(self.next_single_filename, 'r') as fp: next_test = fp.read().strip() @@ -544,29 +537,54 @@ def save_xml_result(self): for s in ET.tostringlist(root): f.write(s) - def main(self, tests=None, **kwargs): - global TEMPDIR - self.ns = self.parse_args(kwargs) - + def create_temp_dir(self): if self.ns.tempdir: - TEMPDIR = self.ns.tempdir - elif self.ns.worker_args: - ns_dict, _ = json.loads(self.ns.worker_args) - TEMPDIR = ns_dict.get("tempdir") or TEMPDIR + self.tmp_dir = self.ns.tempdir + + if not self.tmp_dir: + # When tests are run from the Python build directory, it is best practice + # to keep the test files in a subfolder. This eases the cleanup of leftover + # files using the "make distclean" command. + if sysconfig.is_python_build(): + self.tmp_dir = sysconfig.get_config_var('abs_builddir') + if self.tmp_dir is None: + # bpo-30284: On Windows, only srcdir is available. Using + # abs_builddir mostly matters on UNIX when building Python + # out of the source tree, especially when the source tree + # is read only. + self.tmp_dir = sysconfig.get_config_var('srcdir') + self.tmp_dir = os.path.join(self.tmp_dir, 'build') + else: + self.tmp_dir = tempfile.gettempdir() - os.makedirs(TEMPDIR, exist_ok=True) + self.tmp_dir = os.path.abspath(self.tmp_dir) + os.makedirs(self.tmp_dir, exist_ok=True) # Define a writable temp dir that will be used as cwd while running # the tests. The name of the dir includes the pid to allow parallel # testing (see the -j option). - test_cwd = 'test_python_{}'.format(os.getpid()) - test_cwd = os.path.join(TEMPDIR, test_cwd) + pid = os.getpid() + if self.worker_test_name is not None: + test_cwd = 'worker_{}'.format(pid) + else: + test_cwd = 'test_python_{}'.format(pid) + test_cwd = os.path.join(self.tmp_dir, test_cwd) + return test_cwd + + def main(self, tests=None, **kwargs): + self.ns = self.parse_args(kwargs) + + test_cwd = self.create_temp_dir() - # Run the tests in a context manager that temporarily changes the CWD to a - # temporary and writable directory. If it's not possible to create or - # change the CWD, the original CWD will be used. The original CWD is - # available from support.SAVEDCWD. + # Run the tests in a context manager that temporarily changes the CWD + # to a temporary and writable directory. If it's not possible to + # create or change the CWD, the original CWD will be used. + # The original CWD is available from support.SAVEDCWD. with support.temp_cwd(test_cwd, quiet=True): + # When using multiprocessing, worker processes will use test_cwd + # as their parent temporary directory. So when the main process + # exit, it removes also subdirectories of worker processes. + self.ns.tempdir = test_cwd self._main(tests, kwargs) def getloadavg(self): @@ -588,9 +606,9 @@ def _main(self, tests, kwargs): print(msg, file=sys.stderr, flush=True) sys.exit(2) - if self.ns.worker_args is not None: + if self.worker_test_name is not None: from test.libregrtest.runtest_mp import run_tests_worker - run_tests_worker(self.ns.worker_args) + run_tests_worker(self.ns, self.worker_test_name) if self.ns.wait: input("Press any key to continue...") @@ -611,7 +629,7 @@ def _main(self, tests, kwargs): # If we're on windows and this is the parent runner (not a worker), # track the load average. - if sys.platform == 'win32' and (self.ns.worker_args is None): + if sys.platform == 'win32' and self.worker_test_name is None: from test.libregrtest.win_utils import WindowsLoadTracker try: diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 42178471ef1d..aa2409b4ef79 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -33,6 +33,12 @@ def must_stop(result, ns): return False +def parse_worker_args(worker_args): + ns_dict, test_name = json.loads(worker_args) + ns = types.SimpleNamespace(**ns_dict) + return (ns, test_name) + + def run_test_in_subprocess(testname, ns): ns_dict = vars(ns) worker_args = (ns_dict, testname) @@ -42,8 +48,6 @@ def run_test_in_subprocess(testname, ns): '-u', # Unbuffered stdout and stderr '-m', 'test.regrtest', '--worker-args', worker_args] - if ns.pgo: - cmd += ['--pgo'] # Running the child from the same working directory as regrtest's original # invocation ensures that TEMPDIR for the child is the same when @@ -56,15 +60,15 @@ def run_test_in_subprocess(testname, ns): cwd=support.SAVEDCWD) -def run_tests_worker(worker_args): - ns_dict, testname = json.loads(worker_args) - ns = types.SimpleNamespace(**ns_dict) - +def run_tests_worker(ns, test_name): setup_tests(ns) - result = runtest(ns, testname) + result = runtest(ns, test_name) + print() # Force a newline (just in case) - print(json.dumps(result), flush=True) + + # Serialize TestResult as list in JSON + print(json.dumps(list(result)), flush=True) sys.exit(0) diff --git a/Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst b/Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst new file mode 100644 index 000000000000..4eebfb483251 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst @@ -0,0 +1,3 @@ +The main regrtest process now always removes all temporary directories of +worker processes even if they crash or if they are killed on +KeyboardInterrupt (CTRL+c). From webhook-mailer at python.org Tue May 14 11:35:13 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 15:35:13 -0000 Subject: [Python-checkins] bpo-36900: Replace global conf vars with config (GH-13299) Message-ID: https://github.com/python/cpython/commit/c96be811fa7da8ddcea18cc7abcae94e0f5ff966 commit: c96be811fa7da8ddcea18cc7abcae94e0f5ff966 branch: master author: Victor Stinner committer: GitHub date: 2019-05-14T17:34:56+02:00 summary: bpo-36900: Replace global conf vars with config (GH-13299) Replace global configuration variables with core_config read from the current interpreter. Cleanup dynload_hpux.c. files: M Modules/_io/_iomodule.c M Modules/main.c M Objects/bytearrayobject.c M Objects/bytesobject.c M Objects/moduleobject.c M Python/compile.c M Python/dynload_hpux.c M Python/pylifecycle.c M Python/pythonrun.c diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index d482142d0804..590d6ce9f1e5 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -9,6 +9,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */ #include "structmember.h" #include "_iomodule.h" @@ -376,7 +377,8 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, { PyObject *RawIO_class = (PyObject *)&PyFileIO_Type; #ifdef MS_WINDOWS - if (!Py_LegacyWindowsStdioFlag && _PyIO_get_console_type(path_or_fd) != '\0') { + _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + if (!config->legacy_windows_stdio && _PyIO_get_console_type(path_or_fd) != '\0') { RawIO_class = (PyObject *)&PyWindowsConsoleIO_Type; encoding = "utf-8"; } diff --git a/Modules/main.c b/Modules/main.c index e117ef29e54d..0f99e2af5db1 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -403,8 +403,8 @@ static int pymain_run_stdin(_PyCoreConfig *config, PyCompilerFlags *cf) { if (stdin_is_interactive(config)) { - Py_InspectFlag = 0; /* do exit on SystemExit */ config->inspect = 0; + Py_InspectFlag = 0; /* do exit on SystemExit */ pymain_run_startup(config, cf); pymain_run_interactive_hook(); } @@ -425,17 +425,17 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) { /* Check this environment variable at the end, to give programs the opportunity to set it from Python. */ - if (!Py_InspectFlag && _Py_GetEnv(config->use_environment, "PYTHONINSPECT")) { - Py_InspectFlag = 1; + if (!config->inspect && _Py_GetEnv(config->use_environment, "PYTHONINSPECT")) { config->inspect = 1; + Py_InspectFlag = 1; } - if (!(Py_InspectFlag && stdin_is_interactive(config) && RUN_CODE(config))) { + if (!(config->inspect && stdin_is_interactive(config) && RUN_CODE(config))) { return; } - Py_InspectFlag = 0; config->inspect = 0; + Py_InspectFlag = 0; pymain_run_interactive_hook(); int res = PyRun_AnyFileFlags(stdin, "", cf); diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 667213619344..eaf5dceb03a4 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -998,7 +998,8 @@ bytearray_repr(PyByteArrayObject *self) static PyObject * bytearray_str(PyObject *op) { - if (Py_BytesWarningFlag) { + _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + if (config->bytes_warning) { if (PyErr_WarnEx(PyExc_BytesWarning, "str() on a bytearray instance", 1)) { return NULL; @@ -1023,7 +1024,8 @@ bytearray_richcompare(PyObject *self, PyObject *other, int op) if (rc < 0) return NULL; if (rc) { - if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) { + _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + if (config->bytes_warning && (op == Py_EQ || op == Py_NE)) { if (PyErr_WarnEx(PyExc_BytesWarning, "Comparison between bytearray and string", 1)) return NULL; diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 0b46ceedf00c..b7c5b75283ee 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1421,7 +1421,8 @@ bytes_repr(PyObject *op) static PyObject * bytes_str(PyObject *op) { - if (Py_BytesWarningFlag) { + _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + if (config->bytes_warning) { if (PyErr_WarnEx(PyExc_BytesWarning, "str() on a bytes instance", 1)) { return NULL; @@ -1578,7 +1579,8 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) /* Make sure both arguments are strings. */ if (!(PyBytes_Check(a) && PyBytes_Check(b))) { - if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) { + _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + if (config->bytes_warning && (op == Py_EQ || op == Py_NE)) { rc = PyObject_IsInstance((PyObject*)a, (PyObject*)&PyUnicode_Type); if (!rc) diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 9d6533257bb1..e570107cedfb 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -590,13 +590,15 @@ _PyModule_ClearDict(PyObject *d) Py_ssize_t pos; PyObject *key, *value; + int verbose = _PyInterpreterState_GET_UNSAFE()->core_config.verbose; + /* First, clear only names starting with a single underscore */ pos = 0; while (PyDict_Next(d, &pos, &key, &value)) { if (value != Py_None && PyUnicode_Check(key)) { if (PyUnicode_READ_CHAR(key, 0) == '_' && PyUnicode_READ_CHAR(key, 1) != '_') { - if (Py_VerboseFlag > 1) { + if (verbose > 1) { const char *s = PyUnicode_AsUTF8(key); if (s != NULL) PySys_WriteStderr("# clear[1] %s\n", s); @@ -617,7 +619,7 @@ _PyModule_ClearDict(PyObject *d) if (PyUnicode_READ_CHAR(key, 0) != '_' || !_PyUnicode_EqualToASCIIString(key, "__builtins__")) { - if (Py_VerboseFlag > 1) { + if (verbose > 1) { const char *s = PyUnicode_AsUTF8(key); if (s != NULL) PySys_WriteStderr("# clear[2] %s\n", s); @@ -675,8 +677,10 @@ module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc) static void module_dealloc(PyModuleObject *m) { + int verbose = _PyInterpreterState_GET_UNSAFE()->core_config.verbose; + PyObject_GC_UnTrack(m); - if (Py_VerboseFlag && m->md_name) { + if (verbose && m->md_name) { PySys_FormatStderr("# destroy %S\n", m->md_name); } if (m->md_weaklist != NULL) diff --git a/Python/compile.c b/Python/compile.c index dd27ba840f75..91ce04b02e53 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -24,6 +24,7 @@ #include "Python.h" #include "Python-ast.h" +#include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */ #include "ast.h" #include "code.h" #include "symtable.h" @@ -310,6 +311,7 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, PyCodeObject *co = NULL; PyCompilerFlags local_flags; int merged; + _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; if (!__doc__) { __doc__ = PyUnicode_InternFromString("__doc__"); @@ -338,7 +340,7 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, c.c_future->ff_features = merged; flags->cf_flags = merged; c.c_flags = flags; - c.c_optimize = (optimize == -1) ? Py_OptimizeFlag : optimize; + c.c_optimize = (optimize == -1) ? config->optimization_level : optimize; c.c_nestlevel = 0; if (!_PyAST_Optimize(mod, arena, c.c_optimize)) { diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c index 4967afc39c12..f275e534588a 100644 --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -19,48 +19,47 @@ dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix, const char *shortname, const char *pathname, FILE *fp) { - dl_funcptr p; - shl_t lib; - int flags; - char funcname[258]; - - flags = BIND_FIRST | BIND_DEFERRED; - if (Py_VerboseFlag) { + int flags = BIND_FIRST | BIND_DEFERRED; + int verbose = _PyInterpreterState_GET_UNSAFE()->core_config.verbose; + if (verbose) { flags = BIND_FIRST | BIND_IMMEDIATE | BIND_NONFATAL | BIND_VERBOSE; printf("shl_load %s\n",pathname); } - lib = shl_load(pathname, flags, 0); + + shl_t lib = shl_load(pathname, flags, 0); /* XXX Chuck Blake once wrote that 0 should be BIND_NOSTART? */ if (lib == NULL) { - char buf[256]; - PyObject *pathname_ob = NULL; - PyObject *buf_ob = NULL; - PyObject *shortname_ob = NULL; - - if (Py_VerboseFlag) + if (verbose) { perror(pathname); + } + char buf[256]; PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s", pathname); - buf_ob = PyUnicode_FromString(buf); - shortname_ob = PyUnicode_FromString(shortname); - pathname_ob = PyUnicode_FromString(pathname); + PyObject *buf_ob = PyUnicode_FromString(buf); + PyObject *shortname_ob = PyUnicode_FromString(shortname); + PyObject *pathname_ob = PyUnicode_FromString(pathname); PyErr_SetImportError(buf_ob, shortname_ob, pathname_ob); Py_DECREF(buf_ob); Py_DECREF(shortname_ob); Py_DECREF(pathname_ob); return NULL; } + + char funcname[258]; PyOS_snprintf(funcname, sizeof(funcname), FUNCNAME_PATTERN, prefix, shortname); - if (Py_VerboseFlag) + if (verbose) { printf("shl_findsym %s\n", funcname); + } + + dl_funcptr p; if (shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p) == -1) { shl_unload(lib); p = NULL; } - if (p == NULL && Py_VerboseFlag) + if (p == NULL && verbose) { perror(funcname); - + } return p; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 014b19aa8aa5..4e74e0b80c8f 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -150,12 +150,13 @@ init_importlib(PyInterpreterState *interp, PyObject *sysmod) PyObject *importlib; PyObject *impmod; PyObject *value; + int verbose = interp->core_config.verbose; /* Import _importlib through its frozen version, _frozen_importlib. */ if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) { return _Py_INIT_ERR("can't import _frozen_importlib"); } - else if (Py_VerboseFlag) { + else if (verbose) { PySys_FormatStderr("import _frozen_importlib # frozen\n"); } importlib = PyImport_AddModule("_frozen_importlib"); @@ -175,7 +176,7 @@ init_importlib(PyInterpreterState *interp, PyObject *sysmod) if (impmod == NULL) { return _Py_INIT_ERR("can't import _imp"); } - else if (Py_VerboseFlag) { + else if (verbose) { PySys_FormatStderr("import _imp # builtin\n"); } if (_PyImport_SetModuleString("_imp", impmod) < 0) { diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 199ea82434e9..3d83044af9af 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -591,10 +591,12 @@ handle_system_exit(void) PyObject *exception, *value, *tb; int exitcode = 0; - if (Py_InspectFlag) + int inspect = _PyInterpreterState_GET_UNSAFE()->core_config.inspect; + if (inspect) { /* Don't exit if -i flag was given. This flag is set to 0 * when entering interactive mode for inspecting. */ return; + } PyErr_Fetch(&exception, &value, &tb); fflush(stdout); From webhook-mailer at python.org Tue May 14 12:09:55 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 16:09:55 -0000 Subject: [Python-checkins] bpo-36916: asyncio: Swallow unhandled write() exception (GH-13313) Message-ID: https://github.com/python/cpython/commit/f12ba7cd0a7370631214ac0b337ab5455ce717b2 commit: f12ba7cd0a7370631214ac0b337ab5455ce717b2 branch: master author: Andrew Svetlov committer: Victor Stinner date: 2019-05-14T18:09:44+02:00 summary: bpo-36916: asyncio: Swallow unhandled write() exception (GH-13313) files: A Misc/NEWS.d/next/Library/2019-05-14-15-39-34.bpo-36916._GPsTt.rst M Lib/asyncio/streams.py M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index d9a9f5e72d3b..146a33818d95 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -329,6 +329,13 @@ def __del__(self): closed.exception() +def _swallow_unhandled_exception(task): + # Do a trick to suppress unhandled exception + # if stream.write() was used without await and + # stream.drain() was paused and resumed with an exception + task.exception() + + class StreamWriter: """Wraps a Transport. @@ -393,7 +400,9 @@ def _fast_drain(self): # fast path, the stream is not paused # no need to wait for resume signal return self._complete_fut - return self._loop.create_task(self.drain()) + ret = self._loop.create_task(self.drain()) + ret.add_done_callback(_swallow_unhandled_exception) + return ret def write_eof(self): return self._transport.write_eof() diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index bf93f30e1aaf..8d6a1d26ac19 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -851,6 +851,8 @@ def test_drain_raises(self): # where it never gives up the event loop but the socket is # closed on the server side. + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) q = queue.Queue() def server(): @@ -883,6 +885,7 @@ def server(): # Clean up the thread. (Only on success; on failure, it may # be stuck in accept().) thread.join() + self.assertEqual([], messages) def test___repr__(self): stream = asyncio.StreamReader(loop=self.loop, diff --git a/Misc/NEWS.d/next/Library/2019-05-14-15-39-34.bpo-36916._GPsTt.rst b/Misc/NEWS.d/next/Library/2019-05-14-15-39-34.bpo-36916._GPsTt.rst new file mode 100644 index 000000000000..8726bb241f23 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-14-15-39-34.bpo-36916._GPsTt.rst @@ -0,0 +1,2 @@ +Remove a message about an unhandled exception in a task when writer.write() +is used without await and writer.drain() fails with an exception. From webhook-mailer at python.org Tue May 14 12:52:50 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 16:52:50 -0000 Subject: [Python-checkins] json.tool: use stdin and stdout in default cmdlne arguments (GH-11992) Message-ID: https://github.com/python/cpython/commit/4d45a3b1107977baba9dce868e80d1d95bce4085 commit: 4d45a3b1107977baba9dce868e80d1d95bce4085 branch: master author: Herv? Beraud committer: Victor Stinner date: 2019-05-14T18:52:42+02:00 summary: json.tool: use stdin and stdout in default cmdlne arguments (GH-11992) Argparse can handle default value as stdin and stdout for parameters as file type (infile, outfile). files: M Lib/json/tool.py diff --git a/Lib/json/tool.py b/Lib/json/tool.py index 1d82bc824236..b3ef9923e314 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -21,17 +21,19 @@ def main(): 'to validate and pretty-print JSON objects.') parser = argparse.ArgumentParser(prog=prog, description=description) parser.add_argument('infile', nargs='?', type=argparse.FileType(), - help='a JSON file to be validated or pretty-printed') + help='a JSON file to be validated or pretty-printed', + default=sys.stdin) parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), - help='write the output of infile to outfile') + help='write the output of infile to outfile', + default=sys.stdout) parser.add_argument('--sort-keys', action='store_true', default=False, help='sort the output of dictionaries alphabetically by key') parser.add_argument('--json-lines', action='store_true', default=False, help='parse input using the jsonlines format') options = parser.parse_args() - infile = options.infile or sys.stdin - outfile = options.outfile or sys.stdout + infile = options.infile + outfile = options.outfile sort_keys = options.sort_keys json_lines = options.json_lines with infile, outfile: From webhook-mailer at python.org Tue May 14 12:55:28 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 16:55:28 -0000 Subject: [Python-checkins] bpo-33529, email: Fix infinite loop in email header encoding (GH-12020) Message-ID: https://github.com/python/cpython/commit/c1f5667be1e3ec5871560c677402c1252c6018a6 commit: c1f5667be1e3ec5871560c677402c1252c6018a6 branch: master author: Krzysztof Wojcik committer: Victor Stinner date: 2019-05-14T18:55:23+02:00 summary: bpo-33529, email: Fix infinite loop in email header encoding (GH-12020) files: A Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_headerregistry.py M Lib/test/test_email/test_policy.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index bb26d5a556db..60d0d32059f0 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2723,16 +2723,19 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): lines.append(' ') # XXX We'll get an infinite loop here if maxlen is <= 7 continue - first_part = to_encode[:text_space] - ew = _ew.encode(first_part, charset=encode_as) - excess = len(ew) - remaining_space - if excess > 0: - # encode always chooses the shortest encoding, so this - # is guaranteed to fit at this point. - first_part = first_part[:-excess] - ew = _ew.encode(first_part) - lines[-1] += ew - to_encode = to_encode[len(first_part):] + + to_encode_word = to_encode[:text_space] + encoded_word = _ew.encode(to_encode_word, charset=encode_as) + excess = len(encoded_word) - remaining_space + while excess > 0: + # Since the chunk to encode is guaranteed to fit into less than 100 characters, + # shrinking it by one at a time shouldn't take long. + to_encode_word = to_encode_word[:-1] + encoded_word = _ew.encode(to_encode_word, charset=encode_as) + excess = len(encoded_word) - remaining_space + lines[-1] += encoded_word + to_encode = to_encode[len(to_encode_word):] + if to_encode: lines.append(' ') new_last_ew = len(lines[-1]) diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index 30ce0ba54e47..d1007099f666 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -1643,10 +1643,10 @@ def test_fold_overlong_words_using_RFC2047(self): self.assertEqual( h.fold(policy=policy.default), 'X-Report-Abuse: =?utf-8?q?=3Chttps=3A//www=2Emailitapp=2E' - 'com/report=5F?=\n' - ' =?utf-8?q?abuse=2Ephp=3Fmid=3Dxxx-xxx-xxxx' - 'xxxxxxxxxxxxxxxxxxxx=3D=3D-xxx-?=\n' - ' =?utf-8?q?xx-xx=3E?=\n') + 'com/report=5Fabuse?=\n' + ' =?utf-8?q?=2Ephp=3Fmid=3Dxxx-xxx-xxxx' + 'xxxxxxxxxxxxxxxxxxxx=3D=3D-xxx-xx-xx?=\n' + ' =?utf-8?q?=3E?=\n') if __name__ == '__main__': diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py index 8fecb8a5fcd5..c2c437e6ac26 100644 --- a/Lib/test/test_email/test_policy.py +++ b/Lib/test/test_email/test_policy.py @@ -237,6 +237,14 @@ def test_adding_default_policies_preserves_default_factory(self): email.policy.EmailPolicy.header_factory) self.assertEqual(newpolicy.__dict__, {'raise_on_defect': True}) + def test_non_ascii_chars_do_not_cause_inf_loop(self): + policy = email.policy.default.clone(max_line_length=20) + actual = policy.fold('Subject', '?' * 12) + self.assertEqual( + actual, + 'Subject: \n' + + 12 * ' =?utf-8?q?=C4=85?=\n') + # XXX: Need subclassing tests. # For adding subclassed objects, make sure the usual rules apply (subclass # wins), but that the order still works (right overrides left). diff --git a/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst b/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst new file mode 100644 index 000000000000..84d16f5a56ae --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst @@ -0,0 +1,2 @@ +Prevent fold function used in email header encoding from entering infinite +loop when there are too many non-ASCII characters in a header. From webhook-mailer at python.org Tue May 14 13:29:56 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 17:29:56 -0000 Subject: [Python-checkins] bpo-36618: Don't add -fmax-type-align=8 flag for clang (GH-13320) Message-ID: https://github.com/python/cpython/commit/d97adfb409290a1e4ad549e4af58cacea86d3358 commit: d97adfb409290a1e4ad549e4af58cacea86d3358 branch: master author: Victor Stinner committer: GitHub date: 2019-05-14T19:29:53+02:00 summary: bpo-36618: Don't add -fmax-type-align=8 flag for clang (GH-13320) Python 3.8 now respects the x86-64 ABI: memory allocations are aligned on 16 bytes. The clang flag was only used as a temporary workaround. files: M configure M configure.ac diff --git a/configure b/configure index e6e400735159..6da65ddbba50 100755 --- a/configure +++ b/configure @@ -6905,26 +6905,6 @@ then esac fi -if test -n "${cc_is_clang}" -then - # bpo-36618: Add -fmax-type-align=8 to CFLAGS when clang compiler is - # detected. The pymalloc memory allocator aligns memory on 8 bytes. On - # x86-64, clang expects alignment on 16 bytes by default and so uses MOVAPS - # instruction which can lead to segmentation fault. Instruct clang that - # Python is limited to alignemnt on 8 bytes to use MOVUPS instruction - # instead: slower but don't trigger a SIGSEGV if the memory is not aligned - # on 16 bytes. - # - # Sadly, the flag must be added to CFLAGS and not just CFLAGS_NODIST, - # since third party C extensions can have the same issue. - # - # Check if -fmax-type-align flag is supported (it's not supported by old - # clang versions): - if "$CC" -v --help 2>/dev/null |grep -- -fmax-type-align > /dev/null; then - CFLAGS="$CFLAGS -fmax-type-align=8" - fi -fi - diff --git a/configure.ac b/configure.ac index a02597da2db5..e673e136be8a 100644 --- a/configure.ac +++ b/configure.ac @@ -1543,26 +1543,6 @@ then esac fi -if test -n "${cc_is_clang}" -then - # bpo-36618: Add -fmax-type-align=8 to CFLAGS when clang compiler is - # detected. The pymalloc memory allocator aligns memory on 8 bytes. On - # x86-64, clang expects alignment on 16 bytes by default and so uses MOVAPS - # instruction which can lead to segmentation fault. Instruct clang that - # Python is limited to alignemnt on 8 bytes to use MOVUPS instruction - # instead: slower but don't trigger a SIGSEGV if the memory is not aligned - # on 16 bytes. - # - # Sadly, the flag must be added to CFLAGS and not just CFLAGS_NODIST, - # since third party C extensions can have the same issue. - # - # Check if -fmax-type-align flag is supported (it's not supported by old - # clang versions): - if "$CC" -v --help 2>/dev/null |grep -- -fmax-type-align > /dev/null; then - CFLAGS="$CFLAGS -fmax-type-align=8" - fi -fi - AC_SUBST(BASECFLAGS) AC_SUBST(CFLAGS_NODIST) AC_SUBST(LDFLAGS_NODIST) From webhook-mailer at python.org Tue May 14 15:33:39 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Tue, 14 May 2019 19:33:39 -0000 Subject: [Python-checkins] bpo-36760: Clarify subprocess capture_output docs. (GH-13322) Message-ID: https://github.com/python/cpython/commit/e883091abf7ca84a88e956fe5202e75c53bd4128 commit: e883091abf7ca84a88e956fe5202e75c53bd4128 branch: master author: Gregory P. Smith committer: GitHub date: 2019-05-14T12:33:17-07:00 summary: bpo-36760: Clarify subprocess capture_output docs. (GH-13322) Clarify how to capture stdout and stderr combined into one stream. files: M Doc/library/subprocess.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 3280c95cacbb..d840b461f98c 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -55,7 +55,9 @@ compatibility with older versions, see the :ref:`call-function-trio` section. If *capture_output* is true, stdout and stderr will be captured. When used, the internal :class:`Popen` object is automatically created with ``stdout=PIPE`` and ``stderr=PIPE``. The *stdout* and *stderr* arguments may - not be supplied at the same time as *capture_output*. + not be supplied at the same time as *capture_output*. If you wish to capture + and combine both streams into one, use ``stdout=PIPE`` and ``stderr=STDOUT`` + instead of *capture_output*. The *timeout* argument is passed to :meth:`Popen.communicate`. If the timeout expires, the child process will be killed and waited for. The From webhook-mailer at python.org Tue May 14 15:39:24 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 May 2019 19:39:24 -0000 Subject: [Python-checkins] bpo-36760: Clarify subprocess capture_output docs. (GH-13322) Message-ID: https://github.com/python/cpython/commit/822683238c36e15f59d289075917ff7dedb5f4e6 commit: 822683238c36e15f59d289075917ff7dedb5f4e6 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-14T12:39:17-07:00 summary: bpo-36760: Clarify subprocess capture_output docs. (GH-13322) Clarify how to capture stdout and stderr combined into one stream. (cherry picked from commit e883091abf7ca84a88e956fe5202e75c53bd4128) Co-authored-by: Gregory P. Smith files: M Doc/library/subprocess.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 0c1d892a34d8..f9ace6629521 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -55,7 +55,9 @@ compatibility with older versions, see the :ref:`call-function-trio` section. If *capture_output* is true, stdout and stderr will be captured. When used, the internal :class:`Popen` object is automatically created with ``stdout=PIPE`` and ``stderr=PIPE``. The *stdout* and *stderr* arguments may - not be supplied at the same time as *capture_output*. + not be supplied at the same time as *capture_output*. If you wish to capture + and combine both streams into one, use ``stdout=PIPE`` and ``stderr=STDOUT`` + instead of *capture_output*. The *timeout* argument is passed to :meth:`Popen.communicate`. If the timeout expires, the child process will be killed and waited for. The From webhook-mailer at python.org Tue May 14 16:02:05 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 20:02:05 -0000 Subject: [Python-checkins] bpo-36763: Add test for _PyCoreConfig_SetString() (GH-13275) Message-ID: https://github.com/python/cpython/commit/91c99873d115b9796377d5056785f2abc987520f commit: 91c99873d115b9796377d5056785f2abc987520f branch: master author: Victor Stinner committer: GitHub date: 2019-05-14T22:01:51+02:00 summary: bpo-36763: Add test for _PyCoreConfig_SetString() (GH-13275) test_embed: add test_init_read_set() to test newly added APIs: test module_search_paths and executable. files: M Lib/test/test_embed.py M Programs/_testembed.c diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index fdf5793789df..ca06f3c3dbcc 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -273,7 +273,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): UNTESTED_CORE_CONFIG = ( # FIXME: untested core configuration variables 'dll_path', - 'executable', 'module_search_paths', ) # Mark config which should be get by get_default_config() @@ -310,7 +309,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'filesystem_errors': GET_DEFAULT_CONFIG, 'pycache_prefix': None, - 'program_name': './_testembed', + 'program_name': GET_DEFAULT_CONFIG, 'argv': [""], 'program': '', @@ -319,6 +318,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'module_search_path_env': None, 'home': None, + 'executable': GET_DEFAULT_CONFIG, 'prefix': GET_DEFAULT_CONFIG, 'base_prefix': GET_DEFAULT_CONFIG, @@ -404,7 +404,7 @@ def main_xoptions(self, xoptions_list): xoptions[opt] = True return xoptions - def get_expected_config(self, expected, env): + def get_expected_config(self, expected, env, add_path=None): expected = dict(self.DEFAULT_CORE_CONFIG, **expected) code = textwrap.dedent(''' @@ -420,6 +420,7 @@ def get_expected_config(self, expected, env): 'base_exec_prefix': sys.base_exec_prefix, 'filesystem_encoding': sys.getfilesystemencoding(), 'filesystem_errors': sys.getfilesystemencodeerrors(), + 'module_search_paths': sys.path, } data = json.dumps(data) @@ -447,9 +448,21 @@ def get_expected_config(self, expected, env): except json.JSONDecodeError: self.fail(f"fail to decode stdout: {stdout!r}") + if expected['executable'] is self.GET_DEFAULT_CONFIG: + if sys.platform == 'win32': + expected['executable'] = self.test_exe + else: + if expected['program_name'] is not self.GET_DEFAULT_CONFIG: + expected['executable'] = os.path.abspath(expected['program_name']) + else: + expected['executable'] = os.path.join(os.getcwd(), '_testembed') + if expected['program_name'] is self.GET_DEFAULT_CONFIG: + expected['program_name'] = './_testembed' + for key, value in expected.items(): if value is self.GET_DEFAULT_CONFIG: expected[key] = config[key] + expected['module_search_paths'] = config['module_search_paths'] return expected def check_pre_config(self, config, expected): @@ -457,10 +470,16 @@ def check_pre_config(self, config, expected): core_config = dict(config['core_config']) self.assertEqual(pre_config, expected) - def check_core_config(self, config, expected): + def check_core_config(self, config, expected, add_path=None): core_config = dict(config['core_config']) + if add_path is not None: + paths = [*expected['module_search_paths'], add_path] + if not paths[0]: + del paths[0] + self.assertEqual(core_config['module_search_paths'], paths) for key in self.UNTESTED_CORE_CONFIG: core_config.pop(key, None) + expected.pop(key, None) self.assertEqual(core_config, expected) def check_global_config(self, config): @@ -485,7 +504,7 @@ def check_global_config(self, config): self.assertEqual(config['global_config'], expected) - def check_config(self, testname, expected_config, expected_preconfig): + def check_config(self, testname, expected_config, expected_preconfig, add_path=None): env = dict(os.environ) # Remove PYTHON* environment variables to get deterministic environment for key in list(env): @@ -504,13 +523,13 @@ def check_config(self, testname, expected_config, expected_preconfig): self.fail(f"fail to decode stdout: {out!r}") expected_preconfig = dict(self.DEFAULT_PRE_CONFIG, **expected_preconfig) - expected_config = self.get_expected_config(expected_config, env) + expected_config = self.get_expected_config(expected_config, env, add_path) for key in self.COPY_PRE_CONFIG: if key not in expected_preconfig: expected_preconfig[key] = expected_config[key] self.check_pre_config(config, expected_preconfig) - self.check_core_config(config, expected_config) + self.check_core_config(config, expected_config, add_path) self.check_global_config(config) def test_init_default_config(self): @@ -665,6 +684,15 @@ def test_preinit_isolated2(self): } self.check_config("preinit_isolated2", config, preconfig) + def test_init_read_set(self): + preconfig = {} + core_config = { + 'program_name': './init_read_set', + 'executable': 'my_executable', + } + self.check_config("init_read_set", core_config, preconfig, + add_path="init_read_set_path") + if __name__ == "__main__": unittest.main() diff --git a/Programs/_testembed.c b/Programs/_testembed.c index b12594799bfc..73b37c5f1f3b 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1,4 +1,10 @@ +/* FIXME: PEP 587 makes these functions public */ +#ifndef Py_BUILD_CORE_MODULE +# define Py_BUILD_CORE_MODULE +#endif + #include +#include "pycore_coreconfig.h" /* FIXME: PEP 587 makes these functions public */ #include "pythread.h" #include #include @@ -679,6 +685,47 @@ static int test_init_dev_mode(void) } +static int test_init_read_set(void) +{ + _PyInitError err; + _PyCoreConfig config = _PyCoreConfig_INIT; + + err = _PyCoreConfig_DecodeLocale(&config.program_name, "./init_read_set"); + if (_Py_INIT_FAILED(err)) { + goto fail; + } + + err = _PyCoreConfig_Read(&config); + if (_Py_INIT_FAILED(err)) { + goto fail; + } + + if (_PyWstrList_Append(&config.module_search_paths, + L"init_read_set_path") < 0) { + err = _Py_INIT_NO_MEMORY(); + goto fail; + } + + /* override executable computed by _PyCoreConfig_Read() */ + err = _PyCoreConfig_SetString(&config.executable, L"my_executable"); + if (_Py_INIT_FAILED(err)) { + goto fail; + } + + err = _Py_InitializeFromConfig(&config); + _PyCoreConfig_Clear(&config); + if (_Py_INIT_FAILED(err)) { + goto fail; + } + dump_config(); + Py_Finalize(); + return 0; + +fail: + _Py_ExitInitError(err); +} + + static int test_run_main(void) { _PyCoreConfig config = _PyCoreConfig_INIT; @@ -736,6 +783,7 @@ static struct TestCase TestCases[] = { { "init_isolated", test_init_isolated }, { "preinit_isolated1", test_preinit_isolated1 }, { "preinit_isolated2", test_preinit_isolated2 }, + { "init_read_set", test_init_read_set }, { "run_main", test_run_main }, { NULL, NULL } }; From webhook-mailer at python.org Tue May 14 16:12:50 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 20:12:50 -0000 Subject: [Python-checkins] bpo-33529, email: Fix infinite loop in email header encoding (GH-12020) (GH-13321) Message-ID: https://github.com/python/cpython/commit/2fef5b01e36a17e36fd7e65c4b51f5ede8880dda commit: 2fef5b01e36a17e36fd7e65c4b51f5ede8880dda branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-05-14T22:12:46+02:00 summary: bpo-33529, email: Fix infinite loop in email header encoding (GH-12020) (GH-13321) (cherry picked from commit c1f5667be1e3ec5871560c677402c1252c6018a6) Co-authored-by: Krzysztof Wojcik files: A Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_headerregistry.py M Lib/test/test_email/test_policy.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 517652a3f67b..faf8755171e3 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2724,16 +2724,19 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): lines.append(' ') # XXX We'll get an infinite loop here if maxlen is <= 7 continue - first_part = to_encode[:text_space] - ew = _ew.encode(first_part, charset=encode_as) - excess = len(ew) - remaining_space - if excess > 0: - # encode always chooses the shortest encoding, so this - # is guaranteed to fit at this point. - first_part = first_part[:-excess] - ew = _ew.encode(first_part) - lines[-1] += ew - to_encode = to_encode[len(first_part):] + + to_encode_word = to_encode[:text_space] + encoded_word = _ew.encode(to_encode_word, charset=encode_as) + excess = len(encoded_word) - remaining_space + while excess > 0: + # Since the chunk to encode is guaranteed to fit into less than 100 characters, + # shrinking it by one at a time shouldn't take long. + to_encode_word = to_encode_word[:-1] + encoded_word = _ew.encode(to_encode_word, charset=encode_as) + excess = len(encoded_word) - remaining_space + lines[-1] += encoded_word + to_encode = to_encode[len(to_encode_word):] + if to_encode: lines.append(' ') new_last_ew = len(lines[-1]) diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index 30ce0ba54e47..d1007099f666 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -1643,10 +1643,10 @@ def test_fold_overlong_words_using_RFC2047(self): self.assertEqual( h.fold(policy=policy.default), 'X-Report-Abuse: =?utf-8?q?=3Chttps=3A//www=2Emailitapp=2E' - 'com/report=5F?=\n' - ' =?utf-8?q?abuse=2Ephp=3Fmid=3Dxxx-xxx-xxxx' - 'xxxxxxxxxxxxxxxxxxxx=3D=3D-xxx-?=\n' - ' =?utf-8?q?xx-xx=3E?=\n') + 'com/report=5Fabuse?=\n' + ' =?utf-8?q?=2Ephp=3Fmid=3Dxxx-xxx-xxxx' + 'xxxxxxxxxxxxxxxxxxxx=3D=3D-xxx-xx-xx?=\n' + ' =?utf-8?q?=3E?=\n') if __name__ == '__main__': diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py index 8fecb8a5fcd5..c2c437e6ac26 100644 --- a/Lib/test/test_email/test_policy.py +++ b/Lib/test/test_email/test_policy.py @@ -237,6 +237,14 @@ def test_adding_default_policies_preserves_default_factory(self): email.policy.EmailPolicy.header_factory) self.assertEqual(newpolicy.__dict__, {'raise_on_defect': True}) + def test_non_ascii_chars_do_not_cause_inf_loop(self): + policy = email.policy.default.clone(max_line_length=20) + actual = policy.fold('Subject', '?' * 12) + self.assertEqual( + actual, + 'Subject: \n' + + 12 * ' =?utf-8?q?=C4=85?=\n') + # XXX: Need subclassing tests. # For adding subclassed objects, make sure the usual rules apply (subclass # wins), but that the order still works (right overrides left). diff --git a/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst b/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst new file mode 100644 index 000000000000..84d16f5a56ae --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst @@ -0,0 +1,2 @@ +Prevent fold function used in email header encoding from entering infinite +loop when there are too many non-ASCII characters in a header. From webhook-mailer at python.org Tue May 14 16:30:06 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 May 2019 20:30:06 -0000 Subject: [Python-checkins] Revert "bpo-36801: Fix waiting in StreamWriter.drain for closing SSL transport (GH-13098)" (GH-13328) Message-ID: https://github.com/python/cpython/commit/c647ad9b51c59f71c02cd90c5e67d1b2768323ca commit: c647ad9b51c59f71c02cd90c5e67d1b2768323ca branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-05-14T22:29:54+02:00 summary: Revert "bpo-36801: Fix waiting in StreamWriter.drain for closing SSL transport (GH-13098)" (GH-13328) This reverts commit 93aa57ac6594d1cc30d147720fc8a7a4e1ca2d3e. files: D Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst M Lib/asyncio/streams.py M Lib/asyncio/subprocess.py M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 50badd6b2479..d6531f88a74d 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -208,9 +208,6 @@ def connection_lost(self, exc): self._drain_waiter = waiter await waiter - def _get_close_waiter(self, stream): - raise NotImplementedError - class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): """Helper class to adapt between Protocol and StreamReader. @@ -268,9 +265,6 @@ def eof_received(self): return False return True - def _get_close_waiter(self, stream): - return self._closed - def __del__(self): # Prevent reports about unhandled exceptions. # Better than self._closed._log_traceback = False hack @@ -326,7 +320,7 @@ def is_closing(self): return self._transport.is_closing() async def wait_closed(self): - await self._protocol._get_close_waiter(self) + await self._protocol._closed def get_extra_info(self, name, default=None): return self._transport.get_extra_info(name, default) @@ -344,12 +338,13 @@ def get_extra_info(self, name, default=None): if exc is not None: raise exc if self._transport.is_closing(): - # Wait for protocol.connection_lost() call - # Raise connection closing error if any, - # ConnectionResetError otherwise - fut = self._protocol._get_close_waiter(self) - await fut - raise ConnectionResetError('Connection lost') + # Yield to the event loop so connection_lost() may be + # called. Without this, _drain_helper() would return + # immediately, and code that calls + # write(...); await drain() + # in a loop would never call connection_lost(), so it + # would not see an error when the socket is closed. + await sleep(0, loop=self._loop) await self._protocol._drain_helper() diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index ecacc1a66dbf..90fc00de8339 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -25,7 +25,6 @@ def __init__(self, limit, loop): self._transport = None self._process_exited = False self._pipe_fds = [] - self._stdin_closed = self._loop.create_future() def __repr__(self): info = [self.__class__.__name__] @@ -77,10 +76,6 @@ def pipe_connection_lost(self, fd, exc): if pipe is not None: pipe.close() self.connection_lost(exc) - if exc is None: - self._stdin_closed.set_result(None) - else: - self._stdin_closed.set_exception(exc) return if fd == 1: reader = self.stdout @@ -107,10 +102,6 @@ def _maybe_close_transport(self): self._transport.close() self._transport = None - def _get_close_waiter(self, stream): - if stream is self.stdin: - return self._stdin_closed - class Process: def __init__(self, transport, protocol, loop): diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 2e5fc61bce2b..63fa13f79e28 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -99,29 +99,6 @@ def test_open_unix_connection_no_loop_ssl(self): self._basetest_open_connection_no_loop_ssl(conn_fut) - @unittest.skipIf(ssl is None, 'No ssl module') - def test_drain_on_closed_writer_ssl(self): - - async def inner(httpd): - reader, writer = await asyncio.open_connection( - *httpd.address, - ssl=test_utils.dummy_ssl_context()) - - messages = [] - self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - writer.write(b'GET / HTTP/1.0\r\n\r\n') - data = await reader.read() - self.assertTrue(data.endswith(b'\r\n\r\nTest message')) - - writer.close() - with self.assertRaises(ConnectionResetError): - await writer.drain() - - self.assertEqual(messages, []) - - with test_utils.run_test_server(use_ssl=True) as httpd: - self.loop.run_until_complete(inner(httpd)) - def _basetest_open_connection_error(self, open_connection_fut): reader, writer = self.loop.run_until_complete(open_connection_fut) writer._protocol.connection_lost(ZeroDivisionError()) diff --git a/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst b/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst deleted file mode 100644 index 43e51fe5ca94..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst +++ /dev/null @@ -1 +0,0 @@ -Properly handle SSL connection closing in asyncio StreamWriter.drain() call. From webhook-mailer at python.org Tue May 14 17:39:19 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Tue, 14 May 2019 21:39:19 -0000 Subject: [Python-checkins] bpo-36801: Temporarily fix regression in writer.drain() (#13330) Message-ID: https://github.com/python/cpython/commit/54b74fe9df89f0e5646736f1f60376b4e37c422c commit: 54b74fe9df89f0e5646736f1f60376b4e37c422c branch: master author: Andrew Svetlov committer: GitHub date: 2019-05-15T00:39:13+03:00 summary: bpo-36801: Temporarily fix regression in writer.drain() (#13330) files: M Lib/asyncio/streams.py M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 146a33818d95..2f0cbfdbe852 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -439,9 +439,7 @@ def get_extra_info(self, name, default=None): # Wait for protocol.connection_lost() call # Raise connection closing error if any, # ConnectionResetError otherwise - fut = self._protocol._get_close_waiter(self) - await fut - raise ConnectionResetError('Connection lost') + await sleep(0) await self._protocol._drain_helper() diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 8d6a1d26ac19..258d8a7f7fdf 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -109,29 +109,6 @@ def test_open_unix_connection_no_loop_ssl(self): self._basetest_open_connection_no_loop_ssl(conn_fut) - @unittest.skipIf(ssl is None, 'No ssl module') - def test_drain_on_closed_writer_ssl(self): - - async def inner(httpd): - reader, writer = await asyncio.open_connection( - *httpd.address, - ssl=test_utils.dummy_ssl_context()) - - messages = [] - self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - writer.write(b'GET / HTTP/1.0\r\n\r\n') - data = await reader.read() - self.assertTrue(data.endswith(b'\r\n\r\nTest message')) - - writer.close() - with self.assertRaises(ConnectionResetError): - await writer.drain() - - self.assertEqual(messages, []) - - with test_utils.run_test_server(use_ssl=True) as httpd: - self.loop.run_until_complete(inner(httpd)) - def _basetest_open_connection_error(self, open_connection_fut): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) From webhook-mailer at python.org Tue May 14 20:13:00 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 15 May 2019 00:13:00 -0000 Subject: [Python-checkins] bpo-36763: InitConfigTests tests all core config (GH-13331) Message-ID: https://github.com/python/cpython/commit/5eb8b07f87c66a9ca54fcb90737753ce76a3054d commit: 5eb8b07f87c66a9ca54fcb90737753ce76a3054d branch: master author: Victor Stinner committer: GitHub date: 2019-05-15T02:12:48+02:00 summary: bpo-36763: InitConfigTests tests all core config (GH-13331) Remove UNTESTED_CORE_CONFIG from test_embed.InitConfigTests: all core config fields are now tested! Changes: * Test also dll_path on Windows * Add run_main_config unit test: test config using _Py_RunMain(). files: M Lib/test/test_embed.py M Programs/_testembed.c diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index ca06f3c3dbcc..8f40e9fdb184 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -269,12 +269,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): maxDiff = 4096 UTF8_MODE_ERRORS = ('surrogatepass' if MS_WINDOWS else 'surrogateescape') - # core config - UNTESTED_CORE_CONFIG = ( - # FIXME: untested core configuration variables - 'dll_path', - 'module_search_paths', - ) # Mark config which should be get by get_default_config() GET_DEFAULT_CONFIG = object() DEFAULT_PRE_CONFIG = { @@ -324,6 +318,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'base_prefix': GET_DEFAULT_CONFIG, 'exec_prefix': GET_DEFAULT_CONFIG, 'base_exec_prefix': GET_DEFAULT_CONFIG, + 'module_search_paths': GET_DEFAULT_CONFIG, 'site_import': 1, 'bytes_warning': 0, @@ -354,6 +349,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'legacy_windows_fs_encoding': 0, }) DEFAULT_CORE_CONFIG.update({ + 'dll_path': GET_DEFAULT_CONFIG, 'legacy_windows_stdio': 0, }) @@ -410,7 +406,10 @@ def get_expected_config(self, expected, env, add_path=None): code = textwrap.dedent(''' import json import sys + import _testinternalcapi + configs = _testinternalcapi.get_configs() + core_config = configs['core_config'] data = { 'stdio_encoding': sys.stdout.encoding, 'stdio_errors': sys.stdout.errors, @@ -420,8 +419,10 @@ def get_expected_config(self, expected, env, add_path=None): 'base_exec_prefix': sys.base_exec_prefix, 'filesystem_encoding': sys.getfilesystemencoding(), 'filesystem_errors': sys.getfilesystemencodeerrors(), - 'module_search_paths': sys.path, + 'module_search_paths': core_config['module_search_paths'], } + if sys.platform == 'win32': + data['dll_path'] = core_config['dll_path'] data = json.dumps(data) data = data.encode('utf-8') @@ -431,7 +432,7 @@ def get_expected_config(self, expected, env, add_path=None): # Use -S to not import the site module: get the proper configuration # when test_embed is run from a venv (bpo-35313) - args = (sys.executable, '-S', '-c', code) + args = [sys.executable, '-S', '-c', code] env = dict(env) if not expected['isolated']: env['PYTHONCOERCECLOCALE'] = '0' @@ -462,7 +463,9 @@ def get_expected_config(self, expected, env, add_path=None): for key, value in expected.items(): if value is self.GET_DEFAULT_CONFIG: expected[key] = config[key] - expected['module_search_paths'] = config['module_search_paths'] + + if add_path is not None: + expected['module_search_paths'].append(add_path) return expected def check_pre_config(self, config, expected): @@ -470,16 +473,8 @@ def check_pre_config(self, config, expected): core_config = dict(config['core_config']) self.assertEqual(pre_config, expected) - def check_core_config(self, config, expected, add_path=None): + def check_core_config(self, config, expected): core_config = dict(config['core_config']) - if add_path is not None: - paths = [*expected['module_search_paths'], add_path] - if not paths[0]: - del paths[0] - self.assertEqual(core_config['module_search_paths'], paths) - for key in self.UNTESTED_CORE_CONFIG: - core_config.pop(key, None) - expected.pop(key, None) self.assertEqual(core_config, expected) def check_global_config(self, config): @@ -529,7 +524,7 @@ def check_config(self, testname, expected_config, expected_preconfig, add_path=N expected_preconfig[key] = expected_config[key] self.check_pre_config(config, expected_preconfig) - self.check_core_config(config, expected_config, add_path) + self.check_core_config(config, expected_config) self.check_global_config(config) def test_init_default_config(self): @@ -693,6 +688,18 @@ def test_init_read_set(self): self.check_config("init_read_set", core_config, preconfig, add_path="init_read_set_path") + def test_run_main_config(self): + preconfig = {} + code = ('import _testinternalcapi, json; ' + 'print(json.dumps(_testinternalcapi.get_configs()))') + core_config = { + 'argv': ['-c', 'arg2'], + 'program': 'python3', + 'program_name': './python3', + 'run_command': code + '\n', + } + self.check_config("run_main_config", core_config, preconfig) + if __name__ == "__main__": unittest.main() diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 73b37c5f1f3b..2560bfc62bb8 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -747,6 +747,27 @@ static int test_run_main(void) } +static int test_run_main_config(void) +{ + _PyCoreConfig config = _PyCoreConfig_INIT; + + wchar_t *argv[] = {L"python3", L"-c", + (L"import _testinternalcapi, json; " + L"print(json.dumps(_testinternalcapi.get_configs()))"), + L"arg2"}; + config.argv.length = Py_ARRAY_LENGTH(argv); + config.argv.items = argv; + config.program_name = L"./python3"; + + _PyInitError err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + return _Py_RunMain(); +} + + /* ********************************************************* * List of test cases and the function that implements it. * @@ -785,6 +806,7 @@ static struct TestCase TestCases[] = { { "preinit_isolated2", test_preinit_isolated2 }, { "init_read_set", test_init_read_set }, { "run_main", test_run_main }, + { "run_main_config", test_run_main_config }, { NULL, NULL } }; From webhook-mailer at python.org Wed May 15 10:31:35 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 15 May 2019 14:31:35 -0000 Subject: [Python-checkins] bpo-27987: pymalloc: align by 16bytes on 64bit platform (GH-12850) (GH-13319) Message-ID: https://github.com/python/cpython/commit/f24a9f3bf42709fb97b954b6dd6f90853967712e commit: f24a9f3bf42709fb97b954b6dd6f90853967712e branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-05-15T16:31:10+02:00 summary: bpo-27987: pymalloc: align by 16bytes on 64bit platform (GH-12850) (GH-13319) (cherry picked from commit f0be4bbb9b3cee876249c23f2ae6f38f43fa7495) files: A Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst M Objects/obmalloc.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst new file mode 100644 index 000000000000..b0f32a5c6c3f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst @@ -0,0 +1,3 @@ +pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on +64-bit platforms to conform x86-64 ABI. Recent compilers assume this alignment +more often. Patch by Inada Naoki. diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 0778c851faf0..2067cf54e747 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -154,8 +154,14 @@ static int running_on_valgrind = -1; * * You shouldn't change this unless you know what you are doing. */ + +#if SIZEOF_VOID_P > 4 +#define ALIGNMENT 16 /* must be 2^N */ +#define ALIGNMENT_SHIFT 4 +#else #define ALIGNMENT 8 /* must be 2^N */ #define ALIGNMENT_SHIFT 3 +#endif #define ALIGNMENT_MASK (ALIGNMENT - 1) /* Return the number of bytes in size class I, as a uint. */ From webhook-mailer at python.org Wed May 15 11:02:30 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Wed, 15 May 2019 15:02:30 -0000 Subject: [Python-checkins] bpo-36799: Fix typo in ctypes.rst (GH-13104) Message-ID: https://github.com/python/cpython/commit/133fc89ca02b51b8d5b87556d94f1382c4ed72c1 commit: 133fc89ca02b51b8d5b87556d94f1382c4ed72c1 branch: master author: Yavor Konstantinov <7553015+sehnsucht13 at users.noreply.github.com> committer: St?phane Wirtel date: 2019-05-15T17:02:13+02:00 summary: bpo-36799: Fix typo in ctypes.rst (GH-13104) files: M Doc/library/ctypes.rst diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index baab0de8f8ac..1c60b4bbda13 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -2376,7 +2376,7 @@ other data types containing pointer type fields. and so on). Later assignments to the :attr:`_fields_` class variable will raise an AttributeError. - It is possible to defined sub-subclasses of structure types, they inherit + It is possible to define sub-subclasses of structure types, they inherit the fields of the base class plus the :attr:`_fields_` defined in the sub-subclass, if any. @@ -2424,7 +2424,7 @@ other data types containing pointer type fields. td.lptdesc = POINTER(some_type) td.u.lptdesc = POINTER(some_type) - It is possible to defined sub-subclasses of structures, they inherit the + It is possible to define sub-subclasses of structures, they inherit the fields of the base class. If the subclass definition has a separate :attr:`_fields_` variable, the fields specified in this are appended to the fields of the base class. From webhook-mailer at python.org Wed May 15 11:53:30 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Wed, 15 May 2019 15:53:30 -0000 Subject: [Python-checkins] [3.7] bpo-36799: Fix typo in ctypes.rst (GH-13104) (GH-13341) Message-ID: https://github.com/python/cpython/commit/4fd7f56ee78a07ebadf034affc2e36db14c85c00 commit: 4fd7f56ee78a07ebadf034affc2e36db14c85c00 branch: 3.7 author: St?phane Wirtel committer: GitHub date: 2019-05-15T17:53:25+02:00 summary: [3.7] bpo-36799: Fix typo in ctypes.rst (GH-13104) (GH-13341) (cherry picked from commit 133fc89ca) Co-authored-by: Yavor Konstantinov <7553015+sehnsucht13 at users.noreply.github.com> files: M Doc/library/ctypes.rst diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 500aad8858f2..60a2ec1c5e89 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -2365,7 +2365,7 @@ other data types containing pointer type fields. and so on). Later assignments to the :attr:`_fields_` class variable will raise an AttributeError. - It is possible to defined sub-subclasses of structure types, they inherit + It is possible to define sub-subclasses of structure types, they inherit the fields of the base class plus the :attr:`_fields_` defined in the sub-subclass, if any. @@ -2413,7 +2413,7 @@ other data types containing pointer type fields. td.lptdesc = POINTER(some_type) td.u.lptdesc = POINTER(some_type) - It is possible to defined sub-subclasses of structures, they inherit the + It is possible to define sub-subclasses of structures, they inherit the fields of the base class. If the subclass definition has a separate :attr:`_fields_` variable, the fields specified in this are appended to the fields of the base class. From webhook-mailer at python.org Wed May 15 12:18:41 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 15 May 2019 16:18:41 -0000 Subject: [Python-checkins] Reference zipimport source code from docs. (GH-13310) Message-ID: https://github.com/python/cpython/commit/e307e5cd06f60e11e4e4f126fae412b9ec66a005 commit: e307e5cd06f60e11e4e4f126fae412b9ec66a005 branch: master author: Xtreak committer: Serhiy Storchaka date: 2019-05-15T19:18:35+03:00 summary: Reference zipimport source code from docs. (GH-13310) files: M Doc/library/zipimport.rst diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst index aa1831dbc60d..2138697ff064 100644 --- a/Doc/library/zipimport.rst +++ b/Doc/library/zipimport.rst @@ -6,6 +6,8 @@ .. moduleauthor:: Just van Rossum +**Source code:** :source:`Lib/zipimport.py` + -------------- This module adds the ability to import Python modules (:file:`\*.py`, From webhook-mailer at python.org Wed May 15 14:06:42 2019 From: webhook-mailer at python.org (Vinay Sajip) Date: Wed, 15 May 2019 18:06:42 -0000 Subject: [Python-checkins] bpo-36015: Handle StreamHandler representaton of stream with an integer name (GH-11908) (GH-13183) Message-ID: https://github.com/python/cpython/commit/78dd781ef4d41dfefad53aa3bc52c39b0d443b19 commit: 78dd781ef4d41dfefad53aa3bc52c39b0d443b19 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Vinay Sajip date: 2019-05-15T19:06:29+01:00 summary: bpo-36015: Handle StreamHandler representaton of stream with an integer name (GH-11908) (GH-13183) (cherry picked from commit ca87eebb22d202c33f3317cbf85059cadc64fa9f) Co-authored-by: Riccardo Magliocchetti files: M Lib/logging/__init__.py M Lib/test/test_logging.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index cd80d5cccc6e..6e017148861d 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1055,6 +1055,8 @@ def setStream(self, stream): def __repr__(self): level = getLevelName(self.level) name = getattr(self.stream, 'name', '') + # bpo-36015: name can be an int + name = str(name) if name: name += ' ' return '<%s %s(%s)>' % (self.__class__.__name__, name, level) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 14277369be47..d12e1e57455d 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -766,6 +766,10 @@ class TestStreamHandler(logging.StreamHandler): def handleError(self, record): self.error_record = record +class StreamWithIntName(object): + level = logging.NOTSET + name = 2 + class StreamHandlerTest(BaseTest): def test_error_handling(self): h = TestStreamHandler(BadStream()) @@ -803,6 +807,10 @@ def test_stream_setting(self): actual = h.setStream(old) self.assertIsNone(actual) + def test_can_represent_stream_with_int_name(self): + h = logging.StreamHandler(StreamWithIntName()) + self.assertEqual(repr(h), '') + # -- The following section could be moved into a server_helper.py module # -- if it proves to be of wider utility than just test_logging From webhook-mailer at python.org Wed May 15 16:14:50 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 15 May 2019 20:14:50 -0000 Subject: [Python-checkins] bpo-26707: Enable plistlib to read UID keys. (GH-12153) Message-ID: https://github.com/python/cpython/commit/c981ad16b0f9740bd3381c96b4227a1faa1a88d9 commit: c981ad16b0f9740bd3381c96b4227a1faa1a88d9 branch: master author: Jon Janzen committer: Serhiy Storchaka date: 2019-05-15T23:14:38+03:00 summary: bpo-26707: Enable plistlib to read UID keys. (GH-12153) Plistlib currently throws an exception when asked to decode a valid .plist file that was generated by Apple's NSKeyedArchiver. Specifically, this is caused by a byte 0x80 (signifying a UID) not being understood. This fixes the problem by enabling the binary plist reader and writer to read and write plistlib.UID objects. files: A Misc/NEWS.d/next/Library/2019-03-04-01-28-33.bpo-26707.QY4kRZ.rst M Doc/library/plistlib.rst M Doc/whatsnew/3.8.rst M Lib/plistlib.py M Lib/test/test_plistlib.py M Mac/Tools/plistlib_generate_testdata.py M Misc/ACKS diff --git a/Doc/library/plistlib.rst b/Doc/library/plistlib.rst index 8bd6b63a8ee5..d84fcac0ef23 100644 --- a/Doc/library/plistlib.rst +++ b/Doc/library/plistlib.rst @@ -36,6 +36,10 @@ or :class:`datetime.datetime` objects. .. versionchanged:: 3.4 New API, old API deprecated. Support for binary format plists added. +.. versionchanged:: 3.8 + Support added for reading and writing :class:`UID` tokens in binary plists as used + by NSKeyedArchiver and NSKeyedUnarchiver. + .. seealso:: `PList manual page `_ @@ -179,6 +183,16 @@ The following classes are available: .. deprecated:: 3.4 Use a :class:`bytes` object instead. +.. class:: UID(data) + + Wraps an :class:`int`. This is used when reading or writing NSKeyedArchiver + encoded data, which contains UID (see PList manual). + + It has one attribute, :attr:`data` which can be used to retrieve the int value + of the UID. :attr:`data` must be in the range `0 <= data <= 2**64`. + + .. versionadded:: 3.8 + The following constants are available: diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index a2af201215c2..c135183095ca 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -394,6 +394,14 @@ to a path. (Contributed by Joannah Nanjekye in :issue:`26978`) +plistlib +-------- + +Added new :class:`plistlib.UID` and enabled support for reading and writing +NSKeyedArchiver-encoded binary plists. +(Contributed by Jon Janzen in :issue:`26707`.) + + socket ------ diff --git a/Lib/plistlib.py b/Lib/plistlib.py index 248f5143f4ed..0133c89bdc66 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -48,7 +48,7 @@ __all__ = [ "readPlist", "writePlist", "readPlistFromBytes", "writePlistToBytes", "Data", "InvalidFileException", "FMT_XML", "FMT_BINARY", - "load", "dump", "loads", "dumps" + "load", "dump", "loads", "dumps", "UID" ] import binascii @@ -175,6 +175,34 @@ def __repr__(self): # +class UID: + def __init__(self, data): + if not isinstance(data, int): + raise TypeError("data must be an int") + if data >= 1 << 64: + raise ValueError("UIDs cannot be >= 2**64") + if data < 0: + raise ValueError("UIDs must be positive") + self.data = data + + def __index__(self): + return self.data + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self.data)) + + def __reduce__(self): + return self.__class__, (self.data,) + + def __eq__(self, other): + if not isinstance(other, UID): + return NotImplemented + return self.data == other.data + + def __hash__(self): + return hash(self.data) + + # # XML support # @@ -649,8 +677,9 @@ def _read_object(self, ref): s = self._get_size(tokenL) result = self._fp.read(s * 2).decode('utf-16be') - # tokenH == 0x80 is documented as 'UID' and appears to be used for - # keyed-archiving, not in plists. + elif tokenH == 0x80: # UID + # used by Key-Archiver plist files + result = UID(int.from_bytes(self._fp.read(1 + tokenL), 'big')) elif tokenH == 0xA0: # array s = self._get_size(tokenL) @@ -874,6 +903,20 @@ def _write_object(self, value): self._fp.write(t) + elif isinstance(value, UID): + if value.data < 0: + raise ValueError("UIDs must be positive") + elif value.data < 1 << 8: + self._fp.write(struct.pack('>BB', 0x80, value)) + elif value.data < 1 << 16: + self._fp.write(struct.pack('>BH', 0x81, value)) + elif value.data < 1 << 32: + self._fp.write(struct.pack('>BL', 0x83, value)) + elif value.data < 1 << 64: + self._fp.write(struct.pack('>BQ', 0x87, value)) + else: + raise OverflowError(value) + elif isinstance(value, (list, tuple)): refs = [self._getrefnum(o) for o in value] s = len(refs) diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index 8d8e0a750a22..5c2d0265079a 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -1,5 +1,7 @@ # Copyright (C) 2003-2013 Python Software Foundation - +import copy +import operator +import pickle import unittest import plistlib import os @@ -10,6 +12,8 @@ from test import support from io import BytesIO +from plistlib import UID + ALL_FORMATS=(plistlib.FMT_XML, plistlib.FMT_BINARY) # The testdata is generated using Mac/Tools/plistlib_generate_testdata.py @@ -88,6 +92,17 @@ ZwB0AHwAiACUAJoApQCuALsAygDTAOQA7QD4AQQBDwEdASsBNgE3ATgBTwFn AW4BcAFyAXQBdgF/AYMBhQGHAYwBlQGbAZ0BnwGhAaUBpwGwAbkBwAHBAcIB xQHHAsQC0gAAAAAAAAIBAAAAAAAAADkAAAAAAAAAAAAAAAAAAALs'''), + 'KEYED_ARCHIVE': binascii.a2b_base64(b''' + YnBsaXN0MDDUAQIDBAUGHB1YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVy + VCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVnB5dHlwZVYkY2xhc3NZTlMu + c3RyaW5nEAGAAl8QE0tleUFyY2hpdmUgVUlEIFRlc3TTEBESExQZWiRjbGFz + c25hbWVYJGNsYXNzZXNbJGNsYXNzaGludHNfEBdPQ19CdWlsdGluUHl0aG9u + VW5pY29kZaQVFhcYXxAXT0NfQnVpbHRpblB5dGhvblVuaWNvZGVfEBBPQ19Q + eXRob25Vbmljb2RlWE5TU3RyaW5nWE5TT2JqZWN0ohobXxAPT0NfUHl0aG9u + U3RyaW5nWE5TU3RyaW5nXxAPTlNLZXllZEFyY2hpdmVy0R4fVHJvb3SAAQAI + ABEAGgAjAC0AMgA3ADsAQQBIAE8AVgBgAGIAZAB6AIEAjACVAKEAuwDAANoA + 7QD2AP8BAgEUAR0BLwEyATcAAAAAAAACAQAAAAAAAAAgAAAAAAAAAAAAAAAA + AAABOQ=='''), } @@ -151,6 +166,14 @@ def test_invalid_type(self): with self.subTest(fmt=fmt): self.assertRaises(TypeError, plistlib.dumps, pl, fmt=fmt) + def test_invalid_uid(self): + with self.assertRaises(TypeError): + UID("not an int") + with self.assertRaises(ValueError): + UID(2 ** 64) + with self.assertRaises(ValueError): + UID(-19) + def test_int(self): for pl in [0, 2**8-1, 2**8, 2**16-1, 2**16, 2**32-1, 2**32, 2**63-1, 2**64-1, 1, -2**63]: @@ -200,6 +223,45 @@ def test_indentation_dict_mix(self): data = {'1': {'2': [{'3': [[[[[{'test': b'aaaaaa'}]]]]]}]}} self.assertEqual(plistlib.loads(plistlib.dumps(data)), data) + def test_uid(self): + data = UID(1) + self.assertEqual(plistlib.loads(plistlib.dumps(data, fmt=plistlib.FMT_BINARY)), data) + dict_data = { + 'uid0': UID(0), + 'uid2': UID(2), + 'uid8': UID(2 ** 8), + 'uid16': UID(2 ** 16), + 'uid32': UID(2 ** 32), + 'uid63': UID(2 ** 63) + } + self.assertEqual(plistlib.loads(plistlib.dumps(dict_data, fmt=plistlib.FMT_BINARY)), dict_data) + + def test_uid_data(self): + uid = UID(1) + self.assertEqual(uid.data, 1) + + def test_uid_eq(self): + self.assertEqual(UID(1), UID(1)) + self.assertNotEqual(UID(1), UID(2)) + self.assertNotEqual(UID(1), "not uid") + + def test_uid_hash(self): + self.assertEqual(hash(UID(1)), hash(UID(1))) + + def test_uid_repr(self): + self.assertEqual(repr(UID(1)), "UID(1)") + + def test_uid_index(self): + self.assertEqual(operator.index(UID(1)), 1) + + def test_uid_pickle(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + self.assertEqual(pickle.loads(pickle.dumps(UID(19), protocol=proto)), UID(19)) + + def test_uid_copy(self): + self.assertEqual(copy.copy(UID(1)), UID(1)) + self.assertEqual(copy.deepcopy(UID(1)), UID(1)) + def test_appleformatting(self): for use_builtin_types in (True, False): for fmt in ALL_FORMATS: @@ -648,6 +710,38 @@ def test_dataobject_deprecated(self): self.assertEqual(cur, in_data) +class TestKeyedArchive(unittest.TestCase): + def test_keyed_archive_data(self): + # This is the structure of a NSKeyedArchive packed plist + data = { + '$version': 100000, + '$objects': [ + '$null', { + 'pytype': 1, + '$class': UID(2), + 'NS.string': 'KeyArchive UID Test' + }, + { + '$classname': 'OC_BuiltinPythonUnicode', + '$classes': [ + 'OC_BuiltinPythonUnicode', + 'OC_PythonUnicode', + 'NSString', + 'NSObject' + ], + '$classhints': [ + 'OC_PythonString', 'NSString' + ] + } + ], + '$archiver': 'NSKeyedArchiver', + '$top': { + 'root': UID(1) + } + } + self.assertEqual(plistlib.loads(TESTDATA["KEYED_ARCHIVE"]), data) + + class MiscTestCase(unittest.TestCase): def test__all__(self): blacklist = {"PlistFormat", "PLISTHEADER"} @@ -655,7 +749,7 @@ def test__all__(self): def test_main(): - support.run_unittest(TestPlistlib, TestPlistlibDeprecated, MiscTestCase) + support.run_unittest(TestPlistlib, TestPlistlibDeprecated, TestKeyedArchive, MiscTestCase) if __name__ == '__main__': diff --git a/Mac/Tools/plistlib_generate_testdata.py b/Mac/Tools/plistlib_generate_testdata.py index 057b61765b8a..3349c604a37a 100755 --- a/Mac/Tools/plistlib_generate_testdata.py +++ b/Mac/Tools/plistlib_generate_testdata.py @@ -5,6 +5,7 @@ from Cocoa import NSPropertyListXMLFormat_v1_0, NSPropertyListBinaryFormat_v1_0 from Cocoa import CFUUIDCreateFromString, NSNull, NSUUID, CFPropertyListCreateData from Cocoa import NSURL +from Cocoa import NSKeyedArchiver import datetime from collections import OrderedDict @@ -89,6 +90,8 @@ def main(): else: print(" %s: binascii.a2b_base64(b'''\n %s'''),"%(fmt_name, _encode_base64(bytes(data)).decode('ascii')[:-1])) + keyed_archive_data = NSKeyedArchiver.archivedDataWithRootObject_("KeyArchive UID Test") + print(" 'KEYED_ARCHIVE': binascii.a2b_base64(b'''\n %s''')," % (_encode_base64(bytes(keyed_archive_data)).decode('ascii')[:-1])) print("}") print() diff --git a/Misc/ACKS b/Misc/ACKS index ec5b017d515a..f5a31a878c52 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -754,6 +754,7 @@ Geert Jansen Jack Jansen Hans-Peter Jansen Bill Janssen +Jon Janzen Thomas Jarosch Juhana Jauhiainen Rajagopalasarma Jayakrishnan diff --git a/Misc/NEWS.d/next/Library/2019-03-04-01-28-33.bpo-26707.QY4kRZ.rst b/Misc/NEWS.d/next/Library/2019-03-04-01-28-33.bpo-26707.QY4kRZ.rst new file mode 100644 index 000000000000..ab76540c9eec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-04-01-28-33.bpo-26707.QY4kRZ.rst @@ -0,0 +1 @@ +Enable plistlib to read and write binary plist files that were created as a KeyedArchive file. Specifically, this allows the plistlib to process 0x80 tokens as UID objects. \ No newline at end of file From webhook-mailer at python.org Wed May 15 17:45:22 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Wed, 15 May 2019 21:45:22 -0000 Subject: [Python-checkins] bpo-36786: Run compileall in parallel during "make install" (GH-13078) Message-ID: https://github.com/python/cpython/commit/1a2dd82f56bd813aacc570e172cefe55a8a41504 commit: 1a2dd82f56bd813aacc570e172cefe55a8a41504 branch: master author: Antoine Pitrou committer: GitHub date: 2019-05-15T23:45:18+02:00 summary: bpo-36786: Run compileall in parallel during "make install" (GH-13078) files: A Misc/NEWS.d/next/Build/2019-05-03-21-08-06.bpo-36786.gOLFbD.rst M Doc/library/compileall.rst M Lib/compileall.py M Lib/test/test_compileall.py M Makefile.pre.in diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 5e08616e9347..bb5000a0736c 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -158,7 +158,8 @@ Public functions The argument *workers* specifies how many workers are used to compile files in parallel. The default is to not use multiple workers. If the platform can't use multiple workers and *workers* argument is given, - then sequential compilation will be used as a fallback. If *workers* is + then sequential compilation will be used as a fallback. If *workers* + is 0, the number of cores in the system is used. If *workers* is lower than ``0``, a :exc:`ValueError` will be raised. *invalidation_mode* should be a member of the @@ -184,6 +185,9 @@ Public functions .. versionchanged:: 3.7 The *invalidation_mode* parameter was added. + .. versionchanged:: 3.8 + Setting *workers* to 0 now chooses the optimal number of cores. + .. function:: compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, invalidation_mode=py_compile.PycInvalidationMode.TIMESTAMP) Compile the file with path *fullname*. Return a true value if the file diff --git a/Lib/compileall.py b/Lib/compileall.py index aa65c6b904e7..49306d9dabbc 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -67,20 +67,20 @@ def compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, invalidation_mode: how the up-to-dateness of the pyc will be checked """ ProcessPoolExecutor = None - if workers is not None: - if workers < 0: - raise ValueError('workers must be greater or equal to 0') - elif workers != 1: - try: - # Only import when needed, as low resource platforms may - # fail to import it - from concurrent.futures import ProcessPoolExecutor - except ImportError: - workers = 1 + if workers < 0: + raise ValueError('workers must be greater or equal to 0') + if workers != 1: + try: + # Only import when needed, as low resource platforms may + # fail to import it + from concurrent.futures import ProcessPoolExecutor + except ImportError: + workers = 1 files = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels, ddir=ddir) success = True - if workers is not None and workers != 1 and ProcessPoolExecutor is not None: + if workers != 1 and ProcessPoolExecutor is not None: + # If workers == 0, let ProcessPoolExecutor choose workers = workers or None with ProcessPoolExecutor(max_workers=workers) as executor: results = executor.map(partial(compile_file, @@ -290,9 +290,6 @@ def main(): print("Error reading file list {}".format(args.flist)) return False - if args.workers is not None: - args.workers = args.workers or None - if args.invalidation_mode: ivl_mode = args.invalidation_mode.replace('-', '_').upper() invalidation_mode = py_compile.PycInvalidationMode[ivl_mode] diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index 8e584602de36..04f6e1e049dd 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -575,7 +575,7 @@ def test_workers_available_cores(self, compile_dir): new=[sys.executable, self.directory, "-j0"]): compileall.main() self.assertTrue(compile_dir.called) - self.assertEqual(compile_dir.call_args[-1]['workers'], None) + self.assertEqual(compile_dir.call_args[-1]['workers'], 0) class CommmandLineTestsWithSourceEpoch(CommandLineTestsBase, diff --git a/Makefile.pre.in b/Makefile.pre.in index 75eb66be3c01..4924dedc357c 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1432,30 +1432,30 @@ libinstall: build_all $(srcdir)/Modules/xxmodule.c fi -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ - -d $(LIBDEST) -f \ + -j0 -d $(LIBDEST) -f \ -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \ $(DESTDIR)$(LIBDEST) -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \ - -d $(LIBDEST) -f \ + -j0 -d $(LIBDEST) -f \ -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \ $(DESTDIR)$(LIBDEST) -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \ - -d $(LIBDEST) -f \ + -j0 -d $(LIBDEST) -f \ -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \ $(DESTDIR)$(LIBDEST) -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ - -d $(LIBDEST)/site-packages -f \ + -j0 -d $(LIBDEST)/site-packages -f \ -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \ - -d $(LIBDEST)/site-packages -f \ + -j0 -d $(LIBDEST)/site-packages -f \ -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \ - -d $(LIBDEST)/site-packages -f \ + -j0 -d $(LIBDEST)/site-packages -f \ -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt diff --git a/Misc/NEWS.d/next/Build/2019-05-03-21-08-06.bpo-36786.gOLFbD.rst b/Misc/NEWS.d/next/Build/2019-05-03-21-08-06.bpo-36786.gOLFbD.rst new file mode 100644 index 000000000000..0fcda434a799 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-05-03-21-08-06.bpo-36786.gOLFbD.rst @@ -0,0 +1 @@ +"make install" now runs compileall in parallel. From webhook-mailer at python.org Wed May 15 18:02:15 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 15 May 2019 22:02:15 -0000 Subject: [Python-checkins] bpo-33123: pathlib: Add missing_ok parameter to Path.unlink (GH-6191) Message-ID: https://github.com/python/cpython/commit/d9e006bcefe6fac859b1b5d741725b9a91991044 commit: d9e006bcefe6fac859b1b5d741725b9a91991044 branch: master author: ?zlohhcuB treboR committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-15T15:02:11-07:00 summary: bpo-33123: pathlib: Add missing_ok parameter to Path.unlink (GH-6191) Similarly to how several pathlib file creation functions have an "exists_ok" parameter, we should introduce "missing_ok" that makes removal functions not raise an exception when a file or directory is already absent. IMHO, this should cover Path.unlink and Path.rmdir. Note, Path.resolve() has a "strict" parameter since 3.6 that does the same thing. Naming this of this new parameter tries to be consistent with the "exists_ok" parameter as that is more explicit about what it does (as opposed to "strict"). https://bugs.python.org/issue33123 files: A Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst M Doc/library/pathlib.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 41aebc4f61c8..166de8de1f06 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1048,11 +1048,20 @@ call fails (for example because the path doesn't exist). otherwise :exc:`FileExistsError` is raised. -.. method:: Path.unlink() +.. method:: Path.unlink(missing_ok=False) Remove this file or symbolic link. If the path points to a directory, use :func:`Path.rmdir` instead. + If *missing_ok* is false (the default), :exc:`FileNotFoundError` is + raised if the path does not exist. + + If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be + ignored (same behavior as the POSIX ``rm -f`` command). + + .. versionchanged:: 3.8 + The *missing_ok* parameter was added. + .. method:: Path.link_to(target) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 952cd94921e4..b5bab1fe8f5a 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1279,14 +1279,18 @@ def lchmod(self, mode): self._raise_closed() self._accessor.lchmod(self, mode) - def unlink(self): + def unlink(self, missing_ok=False): """ Remove this file or link. If the path is a directory, use rmdir() instead. """ if self._closed: self._raise_closed() - self._accessor.unlink(self) + try: + self._accessor.unlink(self) + except FileNotFoundError: + if not missing_ok: + raise def rmdir(self): """ diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 990207b9c4e4..caad1c23876a 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1635,6 +1635,11 @@ def test_unlink(self): self.assertFileNotFound(p.stat) self.assertFileNotFound(p.unlink) + def test_unlink_missing_ok(self): + p = self.cls(BASE) / 'fileAAA' + self.assertFileNotFound(p.unlink) + p.unlink(missing_ok=True) + def test_rmdir(self): p = self.cls(BASE) / 'dirA' for q in p.iterdir(): diff --git a/Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst b/Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst new file mode 100644 index 000000000000..8803ca843131 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst @@ -0,0 +1,2 @@ +:class:`pathlib.Path.unlink` now accepts a *missing_ok* parameter to avoid a +:exc:`FileNotFoundError` from being raised. Patch by Robert Buchholz. From webhook-mailer at python.org Wed May 15 18:39:00 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 15 May 2019 22:39:00 -0000 Subject: [Python-checkins] bpo-35926: Add support for OpenSSL 1.1.1b on Windows (GH-11779) Message-ID: https://github.com/python/cpython/commit/fb7e7505ed1337bf40fa7b8b68317d1e86675a86 commit: fb7e7505ed1337bf40fa7b8b68317d1e86675a86 branch: master author: Paul Monson committer: Steve Dower date: 2019-05-15T15:38:55-07:00 summary: bpo-35926: Add support for OpenSSL 1.1.1b on Windows (GH-11779) files: A Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst M .azure-pipelines/ci.yml M Lib/test/test_asyncio/test_sslproto.py M Lib/test/test_ssl.py M Misc/ACKS M Modules/_ssl.c M PCbuild/get_externals.bat M PCbuild/openssl.props M PCbuild/openssl.vcxproj M PCbuild/prepare_ssl.bat M PCbuild/python.props M PCbuild/readme.txt diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 15a83dd0370e..1576599379c4 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -59,7 +59,7 @@ jobs: variables: testRunTitle: '$(build.sourceBranchName)-linux' testRunPlatform: linux - openssl_version: 1.1.0j + openssl_version: 1.1.1b steps: - template: ./posix-steps.yml @@ -116,7 +116,7 @@ jobs: variables: testRunTitle: '$(Build.SourceBranchName)-linux-coverage' testRunPlatform: linux-coverage - openssl_version: 1.1.0j + openssl_version: 1.1.1b steps: - template: ./posix-steps.yml diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 7bc2ccf0bddc..079b25585566 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -497,8 +497,8 @@ def test_start_tls_server_1(self): server_context = test_utils.simple_server_sslcontext() client_context = test_utils.simple_client_sslcontext() - if sys.platform.startswith('freebsd'): - # bpo-35031: Some FreeBSD buildbots fail to run this test + if sys.platform.startswith('freebsd') or sys.platform.startswith('win'): + # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test # as the eof was not being received by the server if the payload # size is not big enough. This behaviour only appears if the # client is using TLS1.3. diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 5b53b8250f68..d48d6e5569fc 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2188,7 +2188,7 @@ def wrap_conn(self): self.sock, server_side=True) self.server.selected_npn_protocols.append(self.sslconn.selected_npn_protocol()) self.server.selected_alpn_protocols.append(self.sslconn.selected_alpn_protocol()) - except (ConnectionResetError, BrokenPipeError) as e: + except (ConnectionResetError, BrokenPipeError, ConnectionAbortedError) as e: # We treat ConnectionResetError as though it were an # SSLError - OpenSSL on Ubuntu abruptly closes the # connection when asked to use an unsupported protocol. @@ -2196,6 +2196,9 @@ def wrap_conn(self): # BrokenPipeError is raised in TLS 1.3 mode, when OpenSSL # tries to send session tickets after handshake. # https://github.com/openssl/openssl/issues/6342 + # + # ConnectionAbortedError is raised in TLS 1.3 mode, when OpenSSL + # tries to send session tickets after handshake when using WinSock. self.server.conn_errors.append(str(e)) if self.server.chatty: handle_error("\n server: bad connection attempt from " + repr(self.addr) + ":\n") @@ -2326,7 +2329,7 @@ def run(self): sys.stdout.write(" server: read %r (%s), sending back %r (%s)...\n" % (msg, ctype, msg.lower(), ctype)) self.write(msg.lower()) - except ConnectionResetError: + except (ConnectionResetError, ConnectionAbortedError): # XXX: OpenSSL 1.1.1 sometimes raises ConnectionResetError # when connection is not shut down gracefully. if self.server.chatty and support.verbose: @@ -2336,6 +2339,18 @@ def run(self): ) self.close() self.running = False + except ssl.SSLError as err: + # On Windows sometimes test_pha_required_nocert receives the + # PEER_DID_NOT_RETURN_A_CERTIFICATE exception + # before the 'tlsv13 alert certificate required' exception. + # If the server is stopped when PEER_DID_NOT_RETURN_A_CERTIFICATE + # is received test_pha_required_nocert fails with ConnectionResetError + # because the underlying socket is closed + if 'PEER_DID_NOT_RETURN_A_CERTIFICATE' == err.reason: + if self.server.chatty and support.verbose: + sys.stdout.write(err.args[1]) + # test_pha_required_nocert is expecting this exception + raise ssl.SSLError('tlsv13 alert certificate required') except OSError: if self.server.chatty: handle_error("Test server failure:\n") diff --git a/Misc/ACKS b/Misc/ACKS index f5a31a878c52..06e288dfcb2f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1104,6 +1104,7 @@ Florian Mladitsch Doug Moen Jakub Molinski Juliette Monsel +Paul Monson The Dragon De Monsyne Bastien Montagne Skip Montanaro diff --git a/Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst b/Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst new file mode 100644 index 000000000000..03249c6a168a --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst @@ -0,0 +1 @@ +Update to OpenSSL 1.1.1b for Windows. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index e75e3466dd3f..390a1af1e59d 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -669,7 +669,7 @@ fill_and_set_sslerror(PySSLSocket *sslsock, PyObject *type, int ssl_errno, if (msg == NULL) goto fail; - init_value = Py_BuildValue("iN", ssl_errno, msg); + init_value = Py_BuildValue("iN", ERR_GET_REASON(ssl_errno), msg); if (init_value == NULL) goto fail; diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index b82b6e6588e6..42ffe6f485fa 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -53,7 +53,7 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.6 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.3.0-rc0-r1 -if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.0j +if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1b set libraries=%libraries% sqlite-3.21.0.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.9.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.9.0 @@ -77,7 +77,7 @@ echo.Fetching external binaries... set binaries= if NOT "%IncludeLibffi%"=="false" set binaries=%binaries% libffi -if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.0j +if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.1b if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.9.0 if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 diff --git a/PCbuild/openssl.props b/PCbuild/openssl.props index 8c78cd4ab108..a7e16793c7f2 100644 --- a/PCbuild/openssl.props +++ b/PCbuild/openssl.props @@ -11,7 +11,8 @@ <_DLLSuffix>-1_1 - <_DLLSuffix Condition="$(Platform) == 'x64'">$(_DLLSuffix)-x64 + <_DLLSuffix Condition="$(Platform) == 'ARM'">$(_DLLSuffix)-arm + <_DLLSuffix Condition="$(Platform) == 'ARM64'">$(_DLLSuffix)-arm64 <_SSLDLL Include="$(opensslOutDir)\libcrypto$(_DLLSuffix).dll" /> diff --git a/PCbuild/openssl.vcxproj b/PCbuild/openssl.vcxproj index 1a36d08ec06c..0da6f6749584 100644 --- a/PCbuild/openssl.vcxproj +++ b/PCbuild/openssl.vcxproj @@ -1,37 +1,21 @@ ? - - Debug - Win32 - Release Win32 - - PGInstrument - Win32 - - - PGInstrument - x64 - - - PGUpdate - Win32 - - - PGUpdate + + Release x64 - - Debug - x64 + + Release + ARM - + Release - x64 + ARM64 @@ -40,15 +24,36 @@ - - + + Makefile 32 - 64 x86 - amd64 VC-WIN32 - VC-WIN64A + true + + + + Makefile + 64 + amd64 + VC-WIN64A-masm + true + + + + Makefile + ARM + ARM + VC-WIN32-ARM + true + + + + Makefile + ARM64 + ARM64 + VC-WIN64-ARM true diff --git a/PCbuild/prepare_ssl.bat b/PCbuild/prepare_ssl.bat index bd4b548528c5..88fd0225f5ea 100644 --- a/PCbuild/prepare_ssl.bat +++ b/PCbuild/prepare_ssl.bat @@ -42,7 +42,7 @@ if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & call "%PCBUILD%\find_python.bat" "%PYTHON%" if ERRORLEVEL 1 (echo Cannot locate python.exe on PATH or as PYTHON variable & exit /b 3) -call "%PCBUILD%\get_externals.bat" --openssl-src %ORG_SETTING% +call "%PCBUILD%\get_externals.bat" --openssl-src --no-openssl %ORG_SETTING% if "%PERL%" == "" where perl > "%TEMP%\perl.loc" 2> nul && set /P PERL= <"%TEMP%\perl.loc" & del "%TEMP%\perl.loc" if "%PERL%" == "" (echo Cannot locate perl.exe on PATH or as PERL variable & exit /b 4) @@ -51,4 +51,8 @@ if "%PERL%" == "" (echo Cannot locate perl.exe on PATH or as PERL variable & exi if errorlevel 1 exit /b %MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=x64 if errorlevel 1 exit /b +%MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=ARM +if errorlevel 1 exit /b +%MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=ARM64 +if errorlevel 1 exit /b diff --git a/PCbuild/python.props b/PCbuild/python.props index 52bc99e0560c..b3e5b92f2923 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -26,6 +26,7 @@ --> amd64 arm32 + arm64 win32 @@ -56,8 +57,8 @@ $(ExternalsDir)libffi\ $(ExternalsDir)libffi\$(ArchName)\ $(libffiOutDir)include - $(ExternalsDir)openssl-1.1.0j\ - $(ExternalsDir)openssl-bin-1.1.0j\$(ArchName)\ + $(ExternalsDir)openssl-1.1.1b\ + $(ExternalsDir)openssl-bin-1.1.1b\$(ArchName)\ $(opensslOutDir)include $(ExternalsDir)\nasm-2.11.06\ $(ExternalsDir)\zlib-1.2.11\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index c84732861191..cf4aa4c91754 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -165,7 +165,7 @@ _lzma Homepage: http://tukaani.org/xz/ _ssl - Python wrapper for version 1.1.0h of the OpenSSL secure sockets + Python wrapper for version 1.1.1b of the OpenSSL secure sockets library, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. From webhook-mailer at python.org Wed May 15 18:42:33 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 15 May 2019 22:42:33 -0000 Subject: [Python-checkins] bpo-36511: Windows ARM32 buildbot changes (GH-12917) Message-ID: https://github.com/python/cpython/commit/67ff6a103a1184b572750c30e231968c963e72f8 commit: 67ff6a103a1184b572750c30e231968c963e72f8 branch: master author: Paul Monson committer: Steve Dower date: 2019-05-15T15:42:29-07:00 summary: bpo-36511: Windows ARM32 buildbot changes (GH-12917) files: M PCbuild/rt.bat M Tools/buildbot/test.bat diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index 212befc95b06..e603de6d5174 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -39,6 +39,7 @@ if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts if "%1"=="-x64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts +if "%1"=="-arm32" (set prefix=%pcbuild%arm32) & shift & goto CheckOpts if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts if not defined prefix set prefix=%pcbuild%win32 diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index 40ffc7efdd2d..7815c55c152b 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -5,9 +5,11 @@ setlocal set here=%~dp0 set rt_opts=-q -d set regrtest_args=-j1 +set arm32_ssh= :CheckOpts if "%1"=="-x64" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts +if "%1"=="-arm32" (set rt_opts=%rt_opts% %1) & (set arm32_ssh=true) & shift & goto CheckOpts if "%1"=="-d" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts if "%1"=="-O" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts if "%1"=="-q" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts @@ -16,4 +18,37 @@ if "%1"=="+q" (set rt_opts=%rt_opts:-q=%) & shift & goto CheckOpts if NOT "%1"=="" (set regrtest_args=%regrtest_args% %1) & shift & goto CheckOpts echo on +if "%arm32_ssh%"=="true" goto :Arm32Ssh + call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% +exit /b 0 + +:Arm32Ssh +set dashU=-unetwork,decimal,subprocess,urlfetch,tzdata +if "%SSH_SERVER%"=="" goto :Arm32SshHelp +if "%PYTHON_SOURCE%"=="" (set PYTHON_SOURCE=%here%..\..\) +if "%REMOTE_PYTHON_DIR%"=="" (set REMOTE_PYTHON_DIR=C:\python\) +set TEMP_ARGS=--temp %REMOTE_PYTHON_DIR%temp +ssh %SSH_SERVER% "if EXIST %REMOTE_PYTHON_DIR% (rd %REMOTE_PYTHON_DIR% /s/q)" +ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%PCBuild\arm32" +ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%temp" +for /f "USEBACKQ" %%i in (`dir PCbuild\*.bat /b`) do @scp PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild" +for /f "USEBACKQ" %%i in (`dir PCbuild\*.py /b`) do @scp PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild" +for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.exe /b`) do @scp PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32" +for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.pyd /b`) do @scp PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32" +for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.dll /b`) do @scp PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32" +scp -r "%PYTHON_SOURCE%Include" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Include" +scp -r "%PYTHON_SOURCE%Lib" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Lib" + +set rt_args=%rt_opts% %dashU% -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% %TEMP_ARGS% +ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp & %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% +exit /b 0 + +:Arm32SshHelp +echo SSH_SERVER environment variable must be set to administrator@[ip address] +echo where [ip address] is the address of a Windows IoT Core ARM32 device. +echo. +echo The test worker should have the SSH agent running. +echo Also a key must be created with ssh-keygen and added to both the buildbot worker machine +echo and the ARM32 worker device: see https://docs.microsoft.com/en-us/windows/iot-core/connect-your-device/ssh +exit /b 127 From webhook-mailer at python.org Wed May 15 19:10:45 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 15 May 2019 23:10:45 -0000 Subject: [Python-checkins] bpo-36511: Windows arm32 buildbot changes (remove extra space) (GH-13351) Message-ID: https://github.com/python/cpython/commit/4f820723c86c94f857d8d8de47a3c28f985946bd commit: 4f820723c86c94f857d8d8de47a3c28f985946bd branch: master author: Paul Monson committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-15T16:10:39-07:00 summary: bpo-36511: Windows arm32 buildbot changes (remove extra space) (GH-13351) @zooba I just realized that this whitespace fix didn't get pushed. https://bugs.python.org/issue36511 files: M Tools/buildbot/test.bat diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index 7815c55c152b..b84e8e255672 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -41,7 +41,7 @@ scp -r "%PYTHON_SOURCE%Include" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Include" scp -r "%PYTHON_SOURCE%Lib" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Lib" set rt_args=%rt_opts% %dashU% -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% %TEMP_ARGS% -ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp & %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% +ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% exit /b 0 :Arm32SshHelp From webhook-mailer at python.org Thu May 16 00:34:28 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Thu, 16 May 2019 04:34:28 -0000 Subject: [Python-checkins] Fix typos in documentation (#13344) Message-ID: https://github.com/python/cpython/commit/9b5a0efcdc5b6d23b6e05bb3d30263983b7da308 commit: 9b5a0efcdc5b6d23b6e05bb3d30263983b7da308 branch: master author: Xtreak committer: Terry Jan Reedy date: 2019-05-16T00:34:24-04:00 summary: Fix typos in documentation (#13344) files: M Doc/faq/programming.rst M Doc/library/pickle.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index f14e8cc824ef..9660a701427f 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -792,7 +792,7 @@ Its documentation looks like this:: invoked using the three argument form. The slash at the end of the parameter list means that all three parameters are -positional-only. Thus, calling :func:`pow` with keyword aguments would lead to +positional-only. Thus, calling :func:`pow` with keyword arguments would lead to an error:: >>> pow(x=3, y=4) diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index 55005f009431..27721e698826 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -642,7 +642,7 @@ or both. by other classes as long as they implement :meth:`__setitem__`. * Optionally, a callable with a ``(obj, state)`` signature. This - callable allows the user to programatically control the state-updating + callable allows the user to programmatically control the state-updating behavior of a specific object, instead of using ``obj``'s static :meth:`__setstate__` method. If not ``None``, this callable will have priority over ``obj``'s :meth:`__setstate__`. From webhook-mailer at python.org Thu May 16 01:20:41 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Thu, 16 May 2019 05:20:41 -0000 Subject: [Python-checkins] Fix typos in documentation. Patch by tirkarthi. (GH-13354) Message-ID: https://github.com/python/cpython/commit/8a533ffb499b168ed4bdb707c9919290631e267d commit: 8a533ffb499b168ed4bdb707c9919290631e267d branch: master author: Terry Jan Reedy committer: GitHub date: 2019-05-16T01:20:37-04:00 summary: Fix typos in documentation. Patch by tirkarthi. (GH-13354) files: M Doc/library/idle.rst M Lib/idlelib/help.html diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index ad4491128326..f511d64b550b 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -50,7 +50,7 @@ default title and context menu. On macOS, there is one application menu. It dynamically changes according to the window currently selected. It has an IDLE menu, and some entries -described below are moved around to conform to Apple guidlines. +described below are moved around to conform to Apple guidelines. File menu (Shell and Editor) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -769,7 +769,7 @@ facilitate development of tkinter programs. Enter ``import tkinter as tk; root = tk.Tk()`` in standard Python and nothing appears. Enter the same in IDLE and a tk window appears. In standard Python, one must also enter ``root.update()`` to see the window. IDLE does the equivalent in the -background, about 20 times a second, which is about every 50 milleseconds. +background, about 20 times a second, which is about every 50 milliseconds. Next enter ``b = tk.Button(root, text='button'); b.pack()``. Again, nothing visibly changes in standard Python until one enters ``root.update()``. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index ba44331e87b2..56f9ca503daa 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -6,7 +6,7 @@ - IDLE — Python 3.8.0a3 documentation + IDLE — Python 3.8.0a4 documentation @@ -19,7 +19,7 @@ @@ -72,7 +72,7 @@

Navigation

  • - 3.8.0a3 Documentation » + 3.8.0a4 Documentation »
  • @@ -130,7 +130,7 @@

    Menus default title and context menu.

    On macOS, there is one application menu. It dynamically changes according to the window currently selected. It has an IDLE menu, and some entries -described below are moved around to conform to Apple guidlines.

    +described below are moved around to conform to Apple guidelines.

    File menu (Shell and Editor)?

    @@ -910,7 +910,7 @@

    Navigation

  • - 3.8.0a3 Documentation » + 3.8.0a4 Documentation »
  • @@ -941,7 +941,7 @@

    Navigation



    - Last updated on Apr 26, 2019. + Last updated on May 16, 2019. Found a bug?
    From webhook-mailer at python.org Thu May 16 01:38:34 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 16 May 2019 05:38:34 -0000 Subject: [Python-checkins] Fix typos in documentation. Patch by tirkarthi. (GH-13354) Message-ID: https://github.com/python/cpython/commit/876756e4a1a4480eb94ea4312577070078e4b923 commit: 876756e4a1a4480eb94ea4312577070078e4b923 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-15T22:38:31-07:00 summary: Fix typos in documentation. Patch by tirkarthi. (GH-13354) (cherry picked from commit 8a533ffb499b168ed4bdb707c9919290631e267d) Co-authored-by: Terry Jan Reedy files: M Doc/library/idle.rst M Lib/idlelib/help.html diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index ad4491128326..f511d64b550b 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -50,7 +50,7 @@ default title and context menu. On macOS, there is one application menu. It dynamically changes according to the window currently selected. It has an IDLE menu, and some entries -described below are moved around to conform to Apple guidlines. +described below are moved around to conform to Apple guidelines. File menu (Shell and Editor) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -769,7 +769,7 @@ facilitate development of tkinter programs. Enter ``import tkinter as tk; root = tk.Tk()`` in standard Python and nothing appears. Enter the same in IDLE and a tk window appears. In standard Python, one must also enter ``root.update()`` to see the window. IDLE does the equivalent in the -background, about 20 times a second, which is about every 50 milleseconds. +background, about 20 times a second, which is about every 50 milliseconds. Next enter ``b = tk.Button(root, text='button'); b.pack()``. Again, nothing visibly changes in standard Python until one enters ``root.update()``. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index ba44331e87b2..56f9ca503daa 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -6,7 +6,7 @@ - IDLE — Python 3.8.0a3 documentation + IDLE — Python 3.8.0a4 documentation @@ -19,7 +19,7 @@ @@ -72,7 +72,7 @@

    Navigation

  • - 3.8.0a3 Documentation » + 3.8.0a4 Documentation »
  • @@ -130,7 +130,7 @@

    Menus default title and context menu.

    On macOS, there is one application menu. It dynamically changes according to the window currently selected. It has an IDLE menu, and some entries -described below are moved around to conform to Apple guidlines.

    +described below are moved around to conform to Apple guidelines.

    File menu (Shell and Editor)?

    @@ -910,7 +910,7 @@

    Navigation

  • - 3.8.0a3 Documentation » + 3.8.0a4 Documentation »
  • @@ -941,7 +941,7 @@

    Navigation



    - Last updated on Apr 26, 2019. + Last updated on May 16, 2019. Found a bug?
    From webhook-mailer at python.org Thu May 16 02:03:27 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Thu, 16 May 2019 06:03:27 -0000 Subject: [Python-checkins] bpo-36748: optimize TextIOWrapper.write() for ASCII string (GH-13002) Message-ID: https://github.com/python/cpython/commit/bfba8c373e362d48d4ee0e0cf55b8d9c169344ae commit: bfba8c373e362d48d4ee0e0cf55b8d9c169344ae branch: master author: Inada Naoki committer: GitHub date: 2019-05-16T15:03:20+09:00 summary: bpo-36748: optimize TextIOWrapper.write() for ASCII string (GH-13002) files: A Misc/NEWS.d/next/Library/2019-04-29-15-18-13.bpo-36748.YBKWps.rst M Modules/_io/textio.c diff --git a/Misc/NEWS.d/next/Library/2019-04-29-15-18-13.bpo-36748.YBKWps.rst b/Misc/NEWS.d/next/Library/2019-04-29-15-18-13.bpo-36748.YBKWps.rst new file mode 100644 index 000000000000..0eacc3c99cd9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-29-15-18-13.bpo-36748.YBKWps.rst @@ -0,0 +1,3 @@ +Optimized write buffering in C implementation of ``TextIOWrapper``. Writing +ASCII string to ``TextIOWrapper`` with ascii, latin1, or utf-8 encoding is +about 20% faster. Patch by Inada Naoki. diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 8c391659ecd8..a08ab5b0e27f 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -674,8 +674,8 @@ typedef struct */ PyObject *decoded_chars; /* buffer for text returned from decoder */ Py_ssize_t decoded_chars_used; /* offset into _decoded_chars for read() */ - PyObject *pending_bytes; /* list of bytes objects waiting to be - written, or NULL */ + PyObject *pending_bytes; // data waiting to be written. + // ascii unicode, bytes, or list of them. Py_ssize_t pending_bytes_count; /* snapshot is either NULL, or a tuple (dec_flags, next_input) where @@ -777,6 +777,15 @@ latin1_encode(textio *self, PyObject *text) return _PyUnicode_AsLatin1String(text, PyUnicode_AsUTF8(self->errors)); } +// Return true when encoding can be skipped when text is ascii. +static inline int +is_asciicompat_encoding(encodefunc_t f) +{ + return f == (encodefunc_t) ascii_encode + || f == (encodefunc_t) latin1_encode + || f == (encodefunc_t) utf8_encode; +} + /* Map normalized encoding names onto the specialized encoding funcs */ typedef struct { @@ -1489,21 +1498,62 @@ _io_TextIOWrapper_detach_impl(textio *self) static int _textiowrapper_writeflush(textio *self) { - PyObject *pending, *b, *ret; - if (self->pending_bytes == NULL) return 0; - pending = self->pending_bytes; - Py_INCREF(pending); - self->pending_bytes_count = 0; - Py_CLEAR(self->pending_bytes); + PyObject *pending = self->pending_bytes; + PyObject *b; - b = _PyBytes_Join(_PyIO_empty_bytes, pending); + if (PyBytes_Check(pending)) { + b = pending; + Py_INCREF(b); + } + else if (PyUnicode_Check(pending)) { + assert(PyUnicode_IS_ASCII(pending)); + assert(PyUnicode_GET_LENGTH(pending) == self->pending_bytes_count); + b = PyBytes_FromStringAndSize( + PyUnicode_DATA(pending), PyUnicode_GET_LENGTH(pending)); + if (b == NULL) { + return -1; + } + } + else { + assert(PyList_Check(pending)); + b = PyBytes_FromStringAndSize(NULL, self->pending_bytes_count); + if (b == NULL) { + return -1; + } + + char *buf = PyBytes_AsString(b); + Py_ssize_t pos = 0; + + for (Py_ssize_t i = 0; i < PyList_GET_SIZE(pending); i++) { + PyObject *obj = PyList_GET_ITEM(pending, i); + char *src; + Py_ssize_t len; + if (PyUnicode_Check(obj)) { + assert(PyUnicode_IS_ASCII(obj)); + src = PyUnicode_DATA(obj); + len = PyUnicode_GET_LENGTH(obj); + } + else { + assert(PyBytes_Check(obj)); + if (PyBytes_AsStringAndSize(obj, &src, &len) < 0) { + Py_DECREF(b); + return -1; + } + } + memcpy(buf + pos, src, len); + pos += len; + } + assert(pos == self->pending_bytes_count); + } + + self->pending_bytes_count = 0; + self->pending_bytes = NULL; Py_DECREF(pending); - if (b == NULL) - return -1; - ret = NULL; + + PyObject *ret; do { ret = PyObject_CallMethodObjArgs(self->buffer, _PyIO_str_write, b, NULL); @@ -1566,16 +1616,23 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) /* XXX What if we were just reading? */ if (self->encodefunc != NULL) { - b = (*self->encodefunc)((PyObject *) self, text); + if (PyUnicode_IS_ASCII(text) && is_asciicompat_encoding(self->encodefunc)) { + b = text; + Py_INCREF(b); + } + else { + b = (*self->encodefunc)((PyObject *) self, text); + } self->encoding_start_of_stream = 0; } else b = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_encode, text, NULL); + Py_DECREF(text); if (b == NULL) return NULL; - if (!PyBytes_Check(b)) { + if (b != text && !PyBytes_Check(b)) { PyErr_Format(PyExc_TypeError, "encoder should return a bytes object, not '%.200s'", Py_TYPE(b)->tp_name); @@ -1583,20 +1640,37 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) return NULL; } + Py_ssize_t bytes_len; + if (b == text) { + bytes_len = PyUnicode_GET_LENGTH(b); + } + else { + bytes_len = PyBytes_GET_SIZE(b); + } + if (self->pending_bytes == NULL) { - self->pending_bytes = PyList_New(0); - if (self->pending_bytes == NULL) { + self->pending_bytes_count = 0; + self->pending_bytes = b; + } + else if (!PyList_CheckExact(self->pending_bytes)) { + PyObject *list = PyList_New(2); + if (list == NULL) { Py_DECREF(b); return NULL; } - self->pending_bytes_count = 0; + PyList_SET_ITEM(list, 0, self->pending_bytes); + PyList_SET_ITEM(list, 1, b); + self->pending_bytes = list; } - if (PyList_Append(self->pending_bytes, b) < 0) { + else { + if (PyList_Append(self->pending_bytes, b) < 0) { + Py_DECREF(b); + return NULL; + } Py_DECREF(b); - return NULL; } - self->pending_bytes_count += PyBytes_GET_SIZE(b); - Py_DECREF(b); + + self->pending_bytes_count += bytes_len; if (self->pending_bytes_count > self->chunk_size || needflush || text_needflush) { if (_textiowrapper_writeflush(self) < 0) From webhook-mailer at python.org Thu May 16 09:30:23 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 16 May 2019 13:30:23 -0000 Subject: [Python-checkins] bpo-35589: Prevent buffer copy in sock_sendall() (GH-11418) Message-ID: https://github.com/python/cpython/commit/6e7890028213b30939327e7cf885bf097fc14472 commit: 6e7890028213b30939327e7cf885bf097fc14472 branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-16T06:30:16-07:00 summary: bpo-35589: Prevent buffer copy in sock_sendall() (GH-11418) No NEWs is needed since the problem was introduced on master only and never released. https://bugs.python.org/issue35589 files: M Lib/asyncio/selector_events.py diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 29968214f8ed..6461d3077633 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -428,32 +428,35 @@ def _sock_recv_into(self, fut, sock, buf): if n == len(data): # all data sent return - else: - data = bytearray(memoryview(data)[n:]) fut = self.create_future() fd = sock.fileno() fut.add_done_callback( functools.partial(self._sock_write_done, fd)) - self.add_writer(fd, self._sock_sendall, fut, sock, data) + # use a trick with a list in closure to store a mutable state + self.add_writer(fd, self._sock_sendall, fut, sock, + memoryview(data), [n]) return await fut - def _sock_sendall(self, fut, sock, data): + def _sock_sendall(self, fut, sock, view, pos): if fut.done(): # Future cancellation can be scheduled on previous loop iteration return + start = pos[0] try: - n = sock.send(data) + n = sock.send(view[start:]) except (BlockingIOError, InterruptedError): return except Exception as exc: fut.set_exception(exc) return - if n == len(data): + start += n + + if start == len(view): fut.set_result(None) else: - del data[:n] + pos[0] = start async def sock_connect(self, sock, address): """Connect to a remote socket at address. From webhook-mailer at python.org Thu May 16 10:39:42 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 16 May 2019 14:39:42 -0000 Subject: [Python-checkins] bpo-36763: _PyInitError always use int for exitcode (GH-13360) Message-ID: https://github.com/python/cpython/commit/dbacfc227381fbc7b3c886ea0bd7806ab3dc62c2 commit: dbacfc227381fbc7b3c886ea0bd7806ab3dc62c2 branch: master author: Victor Stinner committer: GitHub date: 2019-05-16T16:39:26+02:00 summary: bpo-36763: _PyInitError always use int for exitcode (GH-13360) We cannot use "unsigned int" for exitcode on Windows, since Py_Main() and _Py_RunMain() always return an "int". Changes: * _PyPathConfig_ComputeSysPath0() now returns -1 if an exception is raised. * pymain_run_python() no longer uses _PyInitError but display the exception and set exitcode to 1 in case of error. * Fix _Py_RunMain(): return an exitcode rather than calling exit() on pymain_run_python() failure. * _Py_ExitInitError() no longer uses ExitProcess() on Windows, use exit() on all platforms. * _Py_ExitInitError() now fails with a fatal error if 'err' is not an error not an exit. files: M Include/cpython/coreconfig.h M Modules/main.c M Python/pathconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 47a6baa1118f..f9bde1492dbd 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -15,11 +15,7 @@ typedef struct { } _type; const char *_func; const char *err_msg; -#ifdef MS_WINDOWS - unsigned int exitcode; -#else int exitcode; -#endif } _PyInitError; /* Almost all errors causing Python initialization to fail */ diff --git a/Modules/main.c b/Modules/main.c index 0f99e2af5db1..47d0574648a9 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -130,7 +130,7 @@ pymain_sys_path_add_path0(PyInterpreterState *interp, PyObject *path0) if (sysdict != NULL) { sys_path = _PyDict_GetItemIdWithError(sysdict, &PyId_path); if (sys_path == NULL && PyErr_Occurred()) { - goto error; + return -1; } } else { @@ -138,17 +138,13 @@ pymain_sys_path_add_path0(PyInterpreterState *interp, PyObject *path0) } if (sys_path == NULL) { PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path"); - goto error; + return -1; } if (PyList_Insert(sys_path, 0, path0)) { - goto error; + return -1; } return 0; - -error: - PyErr_Print(); - return -1; } @@ -443,11 +439,9 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) } -static _PyInitError +static void pymain_run_python(int *exitcode) { - _PyInitError err; - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); /* pymain_run_stdin() modify the config */ _PyCoreConfig *config = &interp->core_config; @@ -464,22 +458,20 @@ pymain_run_python(int *exitcode) if (main_importer_path != NULL) { if (pymain_sys_path_add_path0(interp, main_importer_path) < 0) { - err = _Py_INIT_EXIT(1); - goto done; + goto error; } } else if (!config->isolated) { PyObject *path0 = NULL; - if (_PyPathConfig_ComputeSysPath0(&config->argv, &path0)) { - if (path0 == NULL) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } + int res = _PyPathConfig_ComputeSysPath0(&config->argv, &path0); + if (res < 0) { + goto error; + } + if (res > 0) { if (pymain_sys_path_add_path0(interp, path0) < 0) { Py_DECREF(path0); - err = _Py_INIT_EXIT(1); - goto done; + goto error; } Py_DECREF(path0); } @@ -508,11 +500,14 @@ pymain_run_python(int *exitcode) } pymain_repl(config, &cf, exitcode); - err = _Py_INIT_OK(); + goto done; + +error: + PyErr_Print(); + *exitcode = 1; done: Py_XDECREF(main_importer_path); - return err; } @@ -578,17 +573,14 @@ _Py_RunMain(void) { int exitcode = 0; - _PyInitError err = pymain_run_python(&exitcode); - if (_Py_INIT_FAILED(err)) { - pymain_exit_error(err); - } - + pymain_run_python(&exitcode); if (Py_FinalizeEx() < 0) { /* Value unlikely to be confused with a non-error exit status or other special meaning */ exitcode = 120; } +done: pymain_free(); if (_Py_UnhandledKeyboardInterrupt) { @@ -603,6 +595,10 @@ static int pymain_main(_PyArgv *args) { _PyInitError err = pymain_init(args); + if (_Py_INIT_IS_EXIT(err)) { + pymain_free(); + return err.exitcode; + } if (_Py_INIT_FAILED(err)) { pymain_exit_error(err); } diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 7fea7c366786..2fcb81605805 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -570,18 +570,17 @@ Py_GetProgramName(void) directory ("-m module" case) which will be prepended to sys.argv: sys.path[0]. - Return 1 if the path is correctly resolved, but *path0_p can be NULL - if the Unicode object fail to be created. + Return 1 if the path is correctly resolved and written into *path0_p. - Return 0 if it fails to resolve the full path (and *path0_p will be NULL). - For example, return 0 if the current working directory has been removed - (bpo-36236) or if argv is empty. + Return 0 if it fails to resolve the full path. For example, return 0 if the + current working directory has been removed (bpo-36236) or if argv is empty. + + Raise an exception and return -1 on error. */ int _PyPathConfig_ComputeSysPath0(const _PyWstrList *argv, PyObject **path0_p) { assert(_PyWstrList_CheckConsistency(argv)); - assert(*path0_p == NULL); if (argv->length == 0) { /* Leave sys.path unchanged if sys.argv is empty */ @@ -697,7 +696,12 @@ _PyPathConfig_ComputeSysPath0(const _PyWstrList *argv, PyObject **path0_p) } #endif /* All others */ - *path0_p = PyUnicode_FromWideChar(path0, n); + PyObject *path0_obj = PyUnicode_FromWideChar(path0, n); + if (path0_obj == NULL) { + return -1; + } + + *path0_p = path0_obj; return 1; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 4e74e0b80c8f..a173eb380a52 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2124,18 +2124,15 @@ Py_FatalError(const char *msg) void _Py_NO_RETURN _Py_ExitInitError(_PyInitError err) { - assert(_Py_INIT_FAILED(err)); if (_Py_INIT_IS_EXIT(err)) { -#ifdef MS_WINDOWS - ExitProcess(err.exitcode); -#else exit(err.exitcode); -#endif } - else { - assert(_Py_INIT_IS_ERROR(err)); + else if (_Py_INIT_IS_ERROR(err)) { fatal_error(err._func, err.err_msg, 1); } + else { + Py_FatalError("_Py_ExitInitError() must not be called on success"); + } } /* Clean up and exit */ From webhook-mailer at python.org Thu May 16 10:52:19 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 16 May 2019 14:52:19 -0000 Subject: [Python-checkins] bpo-36921: Deprecate @coroutine for sake of async def (GH-13346) Message-ID: https://github.com/python/cpython/commit/68b34a720485f399e8699235b8f4e08f227dd43b commit: 68b34a720485f399e8699235b8f4e08f227dd43b branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-16T07:52:10-07:00 summary: bpo-36921: Deprecate @coroutine for sake of async def (GH-13346) The second attempt. Now deprecate `@coroutine` only, keep `yield from fut` as is. https://bugs.python.org/issue36921 files: A Misc/NEWS.d/next/Library/2019-05-15-21-35-23.bpo-36921.kA1306.rst M Doc/library/asyncio-task.rst M Lib/asyncio/coroutines.py M Lib/asyncio/locks.py M Lib/asyncio/tasks.py M Lib/test/test_asyncio/test_base_events.py M Lib/test/test_asyncio/test_events.py M Lib/test/test_asyncio/test_locks.py M Lib/test/test_asyncio/test_pep492.py M Lib/test/test_asyncio/test_streams.py M Lib/test/test_asyncio/test_tasks.py M Lib/test/test_typing.py diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index a1297f5fb7fc..e7cf39b2bccd 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -916,12 +916,13 @@ enforced. async def main(): await old_style_coroutine() - This decorator is **deprecated** and is scheduled for removal in - Python 3.10. - This decorator should not be used for :keyword:`async def` coroutines. + .. deprecated-removed:: 3.8 3.10 + + Use :keyword:`async def` instead. + .. function:: iscoroutine(obj) Return ``True`` if *obj* is a :ref:`coroutine object `. diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py index c665ebe33ee1..9664ea74d751 100644 --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -7,6 +7,7 @@ import sys import traceback import types +import warnings from . import base_futures from . import constants @@ -107,6 +108,9 @@ def coroutine(func): If the coroutine is not yielded from before it is destroyed, an error message is logged. """ + warnings.warn('"@coroutine" decorator is deprecated since Python 3.8, use "async def" instead', + DeprecationWarning, + stacklevel=2) if inspect.iscoroutinefunction(func): # In Python 3.5 that's all we need to do for coroutines # defined with "async def". diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index 639bd11bd068..d59eb8f210c7 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -3,12 +3,13 @@ __all__ = ('Lock', 'Event', 'Condition', 'Semaphore', 'BoundedSemaphore') import collections +import types import warnings from . import events from . import futures from . import exceptions -from .coroutines import coroutine +from .import coroutines class _ContextManager: @@ -55,7 +56,7 @@ def __exit__(self, *args): # always raises; that's how the with-statement works. pass - @coroutine + @types.coroutine def __iter__(self): # This is not a coroutine. It is meant to enable the idiom: # @@ -78,6 +79,9 @@ def __iter__(self): yield from self.acquire() return _ContextManager(self) + # The flag is needed for legacy asyncio.iscoroutine() + __iter__._is_coroutine = coroutines._is_coroutine + async def __acquire_ctx(self): await self.acquire() return _ContextManager(self) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 211b9126b011..b274b9bd3329 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -23,7 +23,7 @@ from . import events from . import exceptions from . import futures -from .coroutines import coroutine +from .coroutines import _is_coroutine # Helper to generate new task names # This uses itertools.count() instead of a "+= 1" operation because the latter @@ -638,7 +638,7 @@ def ensure_future(coro_or_future, *, loop=None): 'required') - at coroutine + at types.coroutine def _wrap_awaitable(awaitable): """Helper for asyncio.ensure_future(). @@ -647,6 +647,8 @@ def _wrap_awaitable(awaitable): """ return (yield from awaitable.__await__()) +_wrap_awaitable._is_coroutine = _is_coroutine + class _GatheringFuture(futures.Future): """Helper for gather(). diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 25420b2ff6fa..27e21b33d360 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -575,9 +575,8 @@ def zero_error(fut): def test_default_exc_handler_coro(self): self.loop._process_events = mock.Mock() - @asyncio.coroutine - def zero_error_coro(): - yield from asyncio.sleep(0.01) + async def zero_error_coro(): + await asyncio.sleep(0.01) 1/0 # Test Future.__del__ @@ -723,8 +722,7 @@ def test_set_task_factory(self): class MyTask(asyncio.Task): pass - @asyncio.coroutine - def coro(): + async def coro(): pass factory = lambda loop, coro: MyTask(coro, loop=loop) @@ -779,8 +777,7 @@ def test_create_task(self): class MyTask(asyncio.Task): pass - @asyncio.coroutine - def test(): + async def test(): pass class EventLoop(base_events.BaseEventLoop): @@ -830,8 +827,7 @@ def test_run_forever_keyboard_interrupt(self): # Python issue #22601: ensure that the temporary task created by # run_forever() consumes the KeyboardInterrupt and so don't log # a warning - @asyncio.coroutine - def raise_keyboard_interrupt(): + async def raise_keyboard_interrupt(): raise KeyboardInterrupt self.loop._process_events = mock.Mock() @@ -849,8 +845,7 @@ def raise_keyboard_interrupt(): def test_run_until_complete_baseexception(self): # Python issue #22429: run_until_complete() must not schedule a pending # call to stop() if the future raised a BaseException - @asyncio.coroutine - def raise_keyboard_interrupt(): + async def raise_keyboard_interrupt(): raise KeyboardInterrupt self.loop._process_events = mock.Mock() @@ -1070,9 +1065,7 @@ def test_create_connection_multiple_errors(self, m_socket): class MyProto(asyncio.Protocol): pass - @asyncio.coroutine - def getaddrinfo(*args, **kw): - yield from [] + async def getaddrinfo(*args, **kw): return [(2, 1, 6, '', ('107.6.106.82', 80)), (2, 1, 6, '', ('107.6.106.82', 80))] @@ -1191,9 +1184,8 @@ def test_create_connection_no_host_port_sock(self): self.assertRaises(ValueError, self.loop.run_until_complete, coro) def test_create_connection_no_getaddrinfo(self): - @asyncio.coroutine - def getaddrinfo(*args, **kw): - yield from [] + async def getaddrinfo(*args, **kw): + return [] def getaddrinfo_task(*args, **kwds): return asyncio.Task(getaddrinfo(*args, **kwds), loop=self.loop) @@ -1219,8 +1211,7 @@ def getaddrinfo_task(*args, **kwds): OSError, self.loop.run_until_complete, coro) def test_create_connection_multiple(self): - @asyncio.coroutine - def getaddrinfo(*args, **kw): + async def getaddrinfo(*args, **kw): return [(2, 1, 6, '', ('0.0.0.1', 80)), (2, 1, 6, '', ('0.0.0.2', 80))] @@ -1247,8 +1238,7 @@ def bind(addr): m_socket.socket.return_value.bind = bind - @asyncio.coroutine - def getaddrinfo(*args, **kw): + async def getaddrinfo(*args, **kw): return [(2, 1, 6, '', ('0.0.0.1', 80)), (2, 1, 6, '', ('0.0.0.2', 80))] @@ -1349,8 +1339,7 @@ def test_create_connection_service_name(self, m_socket): self.loop.run_until_complete(coro) def test_create_connection_no_local_addr(self): - @asyncio.coroutine - def getaddrinfo(host, *args, **kw): + async def getaddrinfo(host, *args, **kw): if host == 'example.com': return [(2, 1, 6, '', ('107.6.106.82', 80)), (2, 1, 6, '', ('107.6.106.82', 80))] @@ -1488,11 +1477,10 @@ def test_create_server_empty_host(self): # if host is empty string use None instead host = object() - @asyncio.coroutine - def getaddrinfo(*args, **kw): + async def getaddrinfo(*args, **kw): nonlocal host host = args[0] - yield from [] + return [] def getaddrinfo_task(*args, **kwds): return asyncio.Task(getaddrinfo(*args, **kwds), loop=self.loop) @@ -1854,9 +1842,10 @@ def test_accept_connection_exception(self, m_log): MyProto, sock, None, None, mock.ANY, mock.ANY) def test_call_coroutine(self): - @asyncio.coroutine - def simple_coroutine(): - pass + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def simple_coroutine(): + pass self.loop.set_debug(True) coro_func = simple_coroutine @@ -1880,9 +1869,7 @@ def test_log_slow_callbacks(self, m_logger): def stop_loop_cb(loop): loop.stop() - @asyncio.coroutine - def stop_loop_coro(loop): - yield from () + async def stop_loop_coro(loop): loop.stop() asyncio.set_event_loop(self.loop) @@ -1909,8 +1896,7 @@ def stop_loop_coro(loop): class RunningLoopTests(unittest.TestCase): def test_running_loop_within_a_loop(self): - @asyncio.coroutine - def runner(loop): + async def runner(loop): loop.run_forever() loop = asyncio.new_event_loop() diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index b46b614e556e..0ae6eab1e1e4 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -253,12 +253,10 @@ def tearDown(self): super().tearDown() def test_run_until_complete_nesting(self): - @asyncio.coroutine - def coro1(): - yield + async def coro1(): + await asyncio.sleep(0) - @asyncio.coroutine - def coro2(): + async def coro2(): self.assertTrue(self.loop.is_running()) self.loop.run_until_complete(coro1()) @@ -735,8 +733,7 @@ def test_connect_accepted_socket_ssl_timeout_for_plain_socket(self): @mock.patch('asyncio.base_events.socket') def create_server_multiple_hosts(self, family, hosts, mock_sock): - @asyncio.coroutine - def getaddrinfo(host, port, *args, **kw): + async def getaddrinfo(host, port, *args, **kw): if family == socket.AF_INET: return [(family, socket.SOCK_STREAM, 6, '', (host, port))] else: @@ -1662,8 +1659,7 @@ def test_add_fds_after_closing(self): loop.add_writer(w, callback) def test_close_running_event_loop(self): - @asyncio.coroutine - def close_loop(loop): + async def close_loop(loop): self.loop.close() coro = close_loop(self.loop) @@ -1673,8 +1669,7 @@ def close_loop(loop): def test_close(self): self.loop.close() - @asyncio.coroutine - def test(): + async def test(): pass func = lambda: False @@ -2142,7 +2137,8 @@ def test_handle_repr(self): '') # decorated function - cb = asyncio.coroutine(noop) + with self.assertWarns(DeprecationWarning): + cb = asyncio.coroutine(noop) h = asyncio.Handle(cb, (), self.loop) self.assertEqual(repr(h), '' diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py index b61cf743c3c5..5063a1da448e 100644 --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -44,10 +44,11 @@ def test_repr(self): self.assertTrue(repr(lock).endswith('[unlocked]>')) self.assertTrue(RGX_REPR.match(repr(lock))) - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - yield from lock + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def acquire_lock(): + with self.assertWarns(DeprecationWarning): + yield from lock self.loop.run_until_complete(acquire_lock()) self.assertTrue(repr(lock).endswith('[locked]>')) @@ -56,10 +57,11 @@ def acquire_lock(): def test_lock(self): lock = asyncio.Lock(loop=self.loop) - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def acquire_lock(): + with self.assertWarns(DeprecationWarning): + return (yield from lock) res = self.loop.run_until_complete(acquire_lock()) @@ -79,17 +81,18 @@ def test_lock_by_with_statement(self): asyncio.BoundedSemaphore(loop=loop), ] - @asyncio.coroutine - def test(lock): - yield from asyncio.sleep(0.01) - self.assertFalse(lock.locked()) - with self.assertWarns(DeprecationWarning): - with (yield from lock) as _lock: - self.assertIs(_lock, None) - self.assertTrue(lock.locked()) - yield from asyncio.sleep(0.01) - self.assertTrue(lock.locked()) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def test(lock): + yield from asyncio.sleep(0.01) self.assertFalse(lock.locked()) + with self.assertWarns(DeprecationWarning): + with (yield from lock) as _lock: + self.assertIs(_lock, None) + self.assertTrue(lock.locked()) + yield from asyncio.sleep(0.01) + self.assertTrue(lock.locked()) + self.assertFalse(lock.locked()) for primitive in primitives: loop.run_until_complete(test(primitive)) @@ -290,10 +293,11 @@ def test_release_no_waiters(self): def test_context_manager(self): lock = asyncio.Lock(loop=self.loop) - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def acquire_lock(): + with self.assertWarns(DeprecationWarning): + return (yield from lock) with self.loop.run_until_complete(acquire_lock()): self.assertTrue(lock.locked()) @@ -303,10 +307,11 @@ def acquire_lock(): def test_context_manager_cant_reuse(self): lock = asyncio.Lock(loop=self.loop) - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def acquire_lock(): + with self.assertWarns(DeprecationWarning): + return (yield from lock) # This spells "yield from lock" outside a generator. cm = self.loop.run_until_complete(acquire_lock()) @@ -773,10 +778,11 @@ def test_repr(self): def test_context_manager(self): cond = asyncio.Condition(loop=self.loop) - @asyncio.coroutine - def acquire_cond(): - with self.assertWarns(DeprecationWarning): - return (yield from cond) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def acquire_cond(): + with self.assertWarns(DeprecationWarning): + return (yield from cond) with self.loop.run_until_complete(acquire_cond()): self.assertTrue(cond.locked()) @@ -869,10 +875,11 @@ def test_semaphore(self): sem = asyncio.Semaphore(loop=self.loop) self.assertEqual(1, sem._value) - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from sem) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def acquire_lock(): + with self.assertWarns(DeprecationWarning): + return (yield from sem) res = self.loop.run_until_complete(acquire_lock()) @@ -1012,10 +1019,11 @@ def test_release_no_waiters(self): def test_context_manager(self): sem = asyncio.Semaphore(2, loop=self.loop) - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from sem) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def acquire_lock(): + with self.assertWarns(DeprecationWarning): + return (yield from sem) with self.loop.run_until_complete(acquire_lock()): self.assertFalse(sem.locked()) diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py index 558e268415cd..297a3b3901d6 100644 --- a/Lib/test/test_asyncio/test_pep492.py +++ b/Lib/test/test_asyncio/test_pep492.py @@ -130,9 +130,10 @@ class Awaitable: def __await__(self): return ('spam',) - @asyncio.coroutine - def func(): - return Awaitable() + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def func(): + return Awaitable() coro = func() self.assertEqual(coro.send(None), 'spam') diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 258d8a7f7fdf..fed609816dac 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -588,8 +588,7 @@ def test_exception_waiter(self): stream = asyncio.StreamReader(loop=self.loop, _asyncio_internal=True) - @asyncio.coroutine - def set_err(): + async def set_err(): stream.set_exception(ValueError()) t1 = asyncio.Task(stream.readline(), loop=self.loop) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index fa9783f2ff21..1c1f912ff8af 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -28,8 +28,7 @@ def tearDownModule(): asyncio.set_event_loop_policy(None) - at asyncio.coroutine -def coroutine_function(): +async def coroutine_function(): pass @@ -103,8 +102,7 @@ class Evil: def __del__(self): gc.collect() - @asyncio.coroutine - def run(): + async def run(): return Evil() self.loop.run_until_complete( @@ -138,8 +136,7 @@ def test_task_awaits_on_itself(self): self.loop.run_until_complete(task) def test_task_class(self): - @asyncio.coroutine - def notmuch(): + async def notmuch(): return 'ok' t = self.new_task(self.loop, notmuch()) self.loop.run_until_complete(t) @@ -156,9 +153,10 @@ def notmuch(): loop.close() def test_ensure_future_coroutine(self): - @asyncio.coroutine - def notmuch(): - return 'ok' + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def notmuch(): + return 'ok' t = asyncio.ensure_future(notmuch(), loop=self.loop) self.loop.run_until_complete(t) self.assertTrue(t.done()) @@ -194,8 +192,7 @@ def test_ensure_future_future(self): self.assertIs(f, f_orig) def test_ensure_future_task(self): - @asyncio.coroutine - def notmuch(): + async def notmuch(): return 'ok' t_orig = self.new_task(self.loop, notmuch()) t = asyncio.ensure_future(t_orig) @@ -222,9 +219,10 @@ def __init__(self, coro): def __await__(self): return (yield from self.coro) - @asyncio.coroutine - def coro(): - return 'ok' + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro(): + return 'ok' loop = asyncio.new_event_loop() self.set_event_loop(loop) @@ -276,9 +274,7 @@ def test_get_stack(self): def test_task_repr(self): self.loop.set_debug(False) - @asyncio.coroutine - def notmuch(): - yield from [] + async def notmuch(): return 'abc' # test coroutine function @@ -327,8 +323,7 @@ def notmuch(): "" % coro) def test_task_repr_autogenerated(self): - @asyncio.coroutine - def notmuch(): + async def notmuch(): return 123 t1 = self.new_task(self.loop, notmuch(), None) @@ -346,8 +341,7 @@ def notmuch(): self.loop.run_until_complete(t2) def test_task_repr_name_not_str(self): - @asyncio.coroutine - def notmuch(): + async def notmuch(): return 123 t = self.new_task(self.loop, notmuch()) @@ -358,11 +352,12 @@ def notmuch(): def test_task_repr_coro_decorator(self): self.loop.set_debug(False) - @asyncio.coroutine - def notmuch(): - # notmuch() function doesn't use yield from: it will be wrapped by - # @coroutine decorator - return 123 + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def notmuch(): + # notmuch() function doesn't use yield from: it will be wrapped by + # @coroutine decorator + return 123 # test coroutine function self.assertEqual(notmuch.__name__, 'notmuch') @@ -440,7 +435,8 @@ def test_task_repr_partial_corowrapper(self): async def func(x, y): await asyncio.sleep(0) - partial_func = asyncio.coroutine(functools.partial(func, 1)) + with self.assertWarns(DeprecationWarning): + partial_func = asyncio.coroutine(functools.partial(func, 1)) task = self.loop.create_task(partial_func(2)) # make warnings quiet @@ -492,11 +488,12 @@ def gen(): self.assertFalse(t.cancel()) def test_cancel_yield(self): - @asyncio.coroutine - def task(): - yield - yield - return 12 + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def task(): + yield + yield + return 12 t = self.new_task(self.loop, task()) test_utils.run_briefly(self.loop) # start coro @@ -618,8 +615,7 @@ def test_cancel_at_end(self): loop = asyncio.new_event_loop() self.set_event_loop(loop) - @asyncio.coroutine - def task(): + async def task(): t.cancel() self.assertTrue(t._must_cancel) # White-box test. return 12 @@ -736,8 +732,7 @@ def gen(): foo_started = False - @asyncio.coroutine - def foo(): + async def foo(): nonlocal foo_started foo_started = True @@ -814,8 +809,7 @@ def gen(): def test_wait_for_blocking(self): loop = self.new_test_loop() - @asyncio.coroutine - def coro(): + async def coro(): return 'done' res = loop.run_until_complete(asyncio.wait_for(coro(), timeout=None)) @@ -976,9 +970,10 @@ def gen(): def test_wait_duplicate_coroutines(self): - @asyncio.coroutine - def coro(s): - return s + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro(s): + return s c = coro('test') task =self.new_task( @@ -1036,14 +1031,12 @@ def test_wait_really_done(self): # there is possibility that some tasks in the pending list # became done but their callbacks haven't all been called yet - @asyncio.coroutine - def coro1(): - yield + async def coro1(): + await asyncio.sleep(0) - @asyncio.coroutine - def coro2(): - yield - yield + async def coro2(): + await asyncio.sleep(0) + await asyncio.sleep(0) a = self.new_task(self.loop, coro1()) b = self.new_task(self.loop, coro2()) @@ -1070,8 +1063,7 @@ def gen(): # first_exception, task already has exception a = self.new_task(loop, asyncio.sleep(10.0)) - @asyncio.coroutine - def exc(): + async def exc(): raise ZeroDivisionError('err') b = self.new_task(loop, exc()) @@ -1131,9 +1123,8 @@ def gen(): a = self.new_task(loop, asyncio.sleep(0.1)) - @asyncio.coroutine - def sleeper(): - yield from asyncio.sleep(0.15) + async def sleeper(): + await asyncio.sleep(0.15) raise ZeroDivisionError('really') b = self.new_task(loop, sleeper()) @@ -1220,25 +1211,25 @@ def gen(): completed = set() time_shifted = False - @asyncio.coroutine - def sleeper(dt, x): - nonlocal time_shifted - yield from asyncio.sleep(dt) - completed.add(x) - if not time_shifted and 'a' in completed and 'b' in completed: - time_shifted = True - loop.advance_time(0.14) - return x + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def sleeper(dt, x): + nonlocal time_shifted + yield from asyncio.sleep(dt) + completed.add(x) + if not time_shifted and 'a' in completed and 'b' in completed: + time_shifted = True + loop.advance_time(0.14) + return x a = sleeper(0.01, 'a') b = sleeper(0.01, 'b') c = sleeper(0.15, 'c') - @asyncio.coroutine - def foo(): + async def foo(): values = [] for f in asyncio.as_completed([b, c, a], loop=loop): - values.append((yield from f)) + values.append(await f) return values res = loop.run_until_complete(self.new_task(loop, foo())) @@ -1350,18 +1341,20 @@ def gen(): def test_as_completed_duplicate_coroutines(self): - @asyncio.coroutine - def coro(s): - return s + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro(s): + return s - @asyncio.coroutine - def runner(): - result = [] - c = coro('ham') - for f in asyncio.as_completed([c, c, coro('spam')], - loop=self.loop): - result.append((yield from f)) - return result + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def runner(): + result = [] + c = coro('ham') + for f in asyncio.as_completed([c, c, coro('spam')], + loop=self.loop): + result.append((yield from f)) + return result fut = self.new_task(self.loop, runner()) self.loop.run_until_complete(fut) @@ -1380,10 +1373,9 @@ def gen(): loop = self.new_test_loop(gen) - @asyncio.coroutine - def sleeper(dt, arg): - yield from asyncio.sleep(dt/2) - res = yield from asyncio.sleep(dt/2, arg) + async def sleeper(dt, arg): + await asyncio.sleep(dt/2) + res = await asyncio.sleep(dt/2, arg) return res t = self.new_task(loop, sleeper(0.1, 'yeah')) @@ -1431,16 +1423,14 @@ def gen(): loop = self.new_test_loop(gen) - @asyncio.coroutine - def sleep(dt): - yield from asyncio.sleep(dt) + async def sleep(dt): + await asyncio.sleep(dt) - @asyncio.coroutine - def doit(): + async def doit(): sleeper = self.new_task(loop, sleep(5000)) loop.call_later(0.1, sleeper.cancel) try: - yield from sleeper + await sleeper except asyncio.CancelledError: return 'cancelled' else: @@ -1453,9 +1443,8 @@ def doit(): def test_task_cancel_waiter_future(self): fut = self.new_future(self.loop) - @asyncio.coroutine - def coro(): - yield from fut + async def coro(): + await fut task = self.new_task(self.loop, coro()) test_utils.run_briefly(self.loop) @@ -1469,8 +1458,7 @@ def coro(): self.assertTrue(fut.cancelled()) def test_task_set_methods(self): - @asyncio.coroutine - def notmuch(): + async def notmuch(): return 'ko' gen = notmuch() @@ -1487,11 +1475,12 @@ def notmuch(): 'ko') def test_step_result(self): - @asyncio.coroutine - def notmuch(): - yield None - yield 1 - return 'ko' + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def notmuch(): + yield None + yield 1 + return 'ko' self.assertRaises( RuntimeError, self.loop.run_until_complete, notmuch()) @@ -1511,10 +1500,9 @@ def add_done_callback(self, *args, **kwargs): fut = Fut(loop=self.loop) result = None - @asyncio.coroutine - def wait_for_future(): + async def wait_for_future(): nonlocal result - result = yield from fut + result = await fut t = self.new_task(self.loop, wait_for_future()) test_utils.run_briefly(self.loop) @@ -1536,16 +1524,14 @@ def gen(): loop = self.new_test_loop(gen) - @asyncio.coroutine - def sleeper(): - yield from asyncio.sleep(10) + async def sleeper(): + await asyncio.sleep(10) base_exc = BaseException() - @asyncio.coroutine - def notmutch(): + async def notmutch(): try: - yield from sleeper() + await sleeper() except asyncio.CancelledError: raise base_exc @@ -1571,9 +1557,10 @@ def fn1(): yield self.assertFalse(asyncio.iscoroutinefunction(fn1)) - @asyncio.coroutine - def fn2(): - yield + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def fn2(): + yield self.assertTrue(asyncio.iscoroutinefunction(fn2)) self.assertFalse(asyncio.iscoroutinefunction(mock.Mock())) @@ -1581,9 +1568,10 @@ def fn2(): def test_yield_vs_yield_from(self): fut = self.new_future(self.loop) - @asyncio.coroutine - def wait_for_future(): - yield fut + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def wait_for_future(): + yield fut task = wait_for_future() with self.assertRaises(RuntimeError): @@ -1592,17 +1580,19 @@ def wait_for_future(): self.assertFalse(fut.done()) def test_yield_vs_yield_from_generator(self): - @asyncio.coroutine - def coro(): - yield + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro(): + yield - @asyncio.coroutine - def wait_for_future(): - gen = coro() - try: - yield gen - finally: - gen.close() + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def wait_for_future(): + gen = coro() + try: + yield gen + finally: + gen.close() task = wait_for_future() self.assertRaises( @@ -1610,9 +1600,10 @@ def wait_for_future(): self.loop.run_until_complete, task) def test_coroutine_non_gen_function(self): - @asyncio.coroutine - def func(): - return 'test' + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def func(): + return 'test' self.assertTrue(asyncio.iscoroutinefunction(func)) @@ -1625,12 +1616,12 @@ def func(): def test_coroutine_non_gen_function_return_future(self): fut = self.new_future(self.loop) - @asyncio.coroutine - def func(): - return fut + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def func(): + return fut - @asyncio.coroutine - def coro(): + async def coro(): fut.set_result('test') t1 = self.new_task(self.loop, func()) @@ -1887,11 +1878,12 @@ def check(): # A function that asserts various things. # Called twice, with different debug flag values. - @asyncio.coroutine - def coro(): - # The actual coroutine. - self.assertTrue(gen.gi_running) - yield from fut + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro(): + # The actual coroutine. + self.assertTrue(gen.gi_running) + yield from fut # A completed Future used to run the coroutine. fut = self.new_future(self.loop) @@ -1922,19 +1914,22 @@ def coro(): def test_yield_from_corowrapper(self): with set_coroutine_debug(True): - @asyncio.coroutine - def t1(): - return (yield from t2()) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def t1(): + return (yield from t2()) - @asyncio.coroutine - def t2(): - f = self.new_future(self.loop) - self.new_task(self.loop, t3(f)) - return (yield from f) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def t2(): + f = self.new_future(self.loop) + self.new_task(self.loop, t3(f)) + return (yield from f) - @asyncio.coroutine - def t3(f): - f.set_result((1, 2, 3)) + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def t3(f): + f.set_result((1, 2, 3)) task = self.new_task(self.loop, t1()) val = self.loop.run_until_complete(task) @@ -2009,13 +2004,14 @@ def test_all_tasks_deprecated(self): def test_log_destroyed_pending_task(self): Task = self.__class__.Task - @asyncio.coroutine - def kill_me(loop): - future = self.new_future(loop) - yield from future - # at this point, the only reference to kill_me() task is - # the Task._wakeup() method in future._callbacks - raise Exception("code never reached") + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def kill_me(loop): + future = self.new_future(loop) + yield from future + # at this point, the only reference to kill_me() task is + # the Task._wakeup() method in future._callbacks + raise Exception("code never reached") mock_handler = mock.Mock() self.loop.set_debug(True) @@ -2064,14 +2060,12 @@ def test_tb_logger_not_called_after_cancel(self, m_log): loop = asyncio.new_event_loop() self.set_event_loop(loop) - @asyncio.coroutine - def coro(): + async def coro(): raise TypeError - @asyncio.coroutine - def runner(): + async def runner(): task = self.new_task(loop, coro()) - yield from asyncio.sleep(0.05) + await asyncio.sleep(0.05) task.cancel() task = None @@ -2081,9 +2075,10 @@ def runner(): @mock.patch('asyncio.coroutines.logger') def test_coroutine_never_yielded(self, m_log): with set_coroutine_debug(True): - @asyncio.coroutine - def coro_noop(): - pass + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro_noop(): + pass tb_filename = __file__ tb_lineno = sys._getframe().f_lineno + 2 @@ -2112,13 +2107,15 @@ def test_return_coroutine_from_coroutine(self): from @asyncio.coroutine()-wrapped function should have same effect as returning generator object or Future.""" def check(): - @asyncio.coroutine - def outer_coro(): + with self.assertWarns(DeprecationWarning): @asyncio.coroutine - def inner_coro(): - return 1 + def outer_coro(): + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def inner_coro(): + return 1 - return inner_coro() + return inner_coro() result = self.loop.run_until_complete(outer_coro()) self.assertEqual(result, 1) @@ -2147,11 +2144,10 @@ def _test_cancel_wait_for(self, timeout): loop = asyncio.new_event_loop() self.addCleanup(loop.close) - @asyncio.coroutine - def blocking_coroutine(): + async def blocking_coroutine(): fut = self.new_future(loop) # Block: fut result is never set - yield from fut + await fut task = loop.create_task(blocking_coroutine()) @@ -2230,14 +2226,12 @@ def test_cancel_gather_2(self): def test_exception_traceback(self): # See http://bugs.python.org/issue28843 - @asyncio.coroutine - def foo(): + async def foo(): 1 / 0 - @asyncio.coroutine - def main(): + async def main(): task = self.new_task(self.loop, foo()) - yield # skip one loop iteration + await asyncio.sleep(0) # skip one loop iteration self.assertIsNotNone(task.exception().__traceback__) self.loop.run_until_complete(main()) @@ -2248,9 +2242,10 @@ def call_soon(callback, *args, **kwargs): raise ValueError self.loop.call_soon = call_soon - @asyncio.coroutine - def coro(): - pass + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro(): + pass self.assertFalse(m_log.error.called) @@ -2280,9 +2275,10 @@ def test_create_task_with_noncoroutine(self): def test_create_task_with_oldstyle_coroutine(self): - @asyncio.coroutine - def coro(): - pass + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro(): + pass task = self.new_task(self.loop, coro()) self.assertIsInstance(task, self.Task) @@ -2553,8 +2549,7 @@ class CTask_CFuture_Tests(BaseTaskTests, SetMethodsTest, @support.refcount_test def test_refleaks_in_task___init__(self): gettotalrefcount = support.get_attribute(sys, 'gettotalrefcount') - @asyncio.coroutine - def coro(): + async def coro(): pass task = self.new_task(self.loop, coro()) self.loop.run_until_complete(task) @@ -2565,8 +2560,7 @@ def coro(): self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10) def test_del__log_destroy_pending_segfault(self): - @asyncio.coroutine - def coro(): + async def coro(): pass task = self.new_task(self.loop, coro()) self.loop.run_until_complete(task) @@ -3054,15 +3048,13 @@ def setUp(self): def wrap_futures(self, *futures): coros = [] for fut in futures: - @asyncio.coroutine - def coro(fut=fut): - return (yield from fut) + async def coro(fut=fut): + return await fut coros.append(coro()) return coros def test_constructor_loop_selection(self): - @asyncio.coroutine - def coro(): + async def coro(): return 'abc' gen1 = coro() gen2 = coro() @@ -3078,9 +3070,10 @@ def coro(): self.other_loop.run_until_complete(fut2) def test_duplicate_coroutines(self): - @asyncio.coroutine - def coro(s): - return s + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro(s): + return s c = coro('abc') fut = asyncio.gather(c, c, coro('def'), c, loop=self.one_loop) self._run_loop(self.one_loop) @@ -3091,21 +3084,19 @@ def test_cancellation_broadcast(self): proof = 0 waiter = asyncio.Future(loop=self.one_loop) - @asyncio.coroutine - def inner(): + async def inner(): nonlocal proof - yield from waiter + await waiter proof += 1 child1 = asyncio.ensure_future(inner(), loop=self.one_loop) child2 = asyncio.ensure_future(inner(), loop=self.one_loop) gatherer = None - @asyncio.coroutine - def outer(): + async def outer(): nonlocal proof, gatherer gatherer = asyncio.gather(child1, child2, loop=self.one_loop) - yield from gatherer + await gatherer proof += 100 f = asyncio.ensure_future(outer(), loop=self.one_loop) @@ -3123,17 +3114,15 @@ def outer(): def test_exception_marking(self): # Test for the first line marked "Mark exception retrieved." - @asyncio.coroutine - def inner(f): - yield from f + async def inner(f): + await f raise RuntimeError('should not be ignored') a = asyncio.Future(loop=self.one_loop) b = asyncio.Future(loop=self.one_loop) - @asyncio.coroutine - def outer(): - yield from asyncio.gather(inner(a), inner(b), loop=self.one_loop) + async def outer(): + await asyncio.gather(inner(a), inner(b), loop=self.one_loop) f = asyncio.ensure_future(outer(), loop=self.one_loop) test_utils.run_briefly(self.one_loop) @@ -3152,15 +3141,14 @@ def setUp(self): self.loop = asyncio.new_event_loop() self.set_event_loop(self.loop) # Will cleanup properly - @asyncio.coroutine - def add(self, a, b, fail=False, cancel=False): + async def add(self, a, b, fail=False, cancel=False): """Wait 0.05 second and return a + b.""" - yield from asyncio.sleep(0.05) + await asyncio.sleep(0.05) if fail: raise RuntimeError("Fail!") if cancel: asyncio.current_task(self.loop).cancel() - yield + await asyncio.sleep(0) return a + b def target(self, fail=False, cancel=False, timeout=None, @@ -3261,11 +3249,10 @@ def inc_result(num): nonlocal result result += num - @asyncio.coroutine - def coro(): + async def coro(): self.loop.call_soon(inc_result, 1) self.assertEqual(result, 0) - num = yield from asyncio.sleep(0, result=10) + num = await asyncio.sleep(0, result=10) self.assertEqual(result, 1) # inc'ed by call_soon inc_result(num) # num should be 11 @@ -3318,24 +3305,27 @@ def tearDown(self): def test_yield_from_awaitable(self): - @asyncio.coroutine - def coro(): - yield from asyncio.sleep(0) - return 'ok' + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro(): + yield from asyncio.sleep(0) + return 'ok' result = self.loop.run_until_complete(coro()) self.assertEqual('ok', result) def test_await_old_style_coro(self): - @asyncio.coroutine - def coro1(): - return 'ok1' + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro1(): + return 'ok1' - @asyncio.coroutine - def coro2(): - yield from asyncio.sleep(0) - return 'ok2' + with self.assertWarns(DeprecationWarning): + @asyncio.coroutine + def coro2(): + yield from asyncio.sleep(0) + return 'ok2' async def inner(): return await asyncio.gather(coro1(), coro2(), loop=self.loop) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 0d66ebbd1845..a547fe274c87 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -1708,9 +1708,8 @@ def __init__(self, value: typing.Iterable[T_a]): def __aiter__(self) -> typing.AsyncIterator[T_a]: return self - @asyncio.coroutine - def __anext__(self) -> T_a: - data = yield from self.value + async def __anext__(self) -> T_a: + data = await self.value if data: return data else: diff --git a/Misc/NEWS.d/next/Library/2019-05-15-21-35-23.bpo-36921.kA1306.rst b/Misc/NEWS.d/next/Library/2019-05-15-21-35-23.bpo-36921.kA1306.rst new file mode 100644 index 000000000000..b443b379d8f7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-15-21-35-23.bpo-36921.kA1306.rst @@ -0,0 +1 @@ +Deprecate ``@coroutine`` for sake of ``async def``. From webhook-mailer at python.org Thu May 16 11:03:09 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 16 May 2019 15:03:09 -0000 Subject: [Python-checkins] bpo-36763: Add _PyCoreConfig.parse_argv (GH-13361) Message-ID: https://github.com/python/cpython/commit/ae239f6b0626e926613a4a1dbafa323bd41fec32 commit: ae239f6b0626e926613a4a1dbafa323bd41fec32 branch: master author: Victor Stinner committer: GitHub date: 2019-05-16T17:02:56+02:00 summary: bpo-36763: Add _PyCoreConfig.parse_argv (GH-13361) * _PyCoreConfig_Read() doesn't parse nor update argv if parse_argv is 0. * Move path configuration fields in _PyCoreConfig. * Add an unit test for parse_argv=0. * Remove unused "done": label in _Py_RunMain(). files: M Include/cpython/coreconfig.h M Lib/test/test_embed.py M Modules/main.c M Programs/_testembed.c M Python/coreconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index f9bde1492dbd..a04342ea9809 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -207,31 +207,25 @@ typedef struct { wchar_t *filesystem_errors; wchar_t *pycache_prefix; /* PYTHONPYCACHEPREFIX, -X pycache_prefix=PATH */ - wchar_t *program_name; /* Program name, see also Py_GetProgramName() */ - _PyWstrList argv; /* Command line arguments */ - wchar_t *program; /* argv[0] or "" */ - _PyWstrList xoptions; /* Command line -X options */ - _PyWstrList warnoptions; /* Warnings options */ + int parse_argv; /* Parse argv command line arguments? */ - /* Path configuration inputs */ - wchar_t *module_search_path_env; /* PYTHONPATH environment variable */ - wchar_t *home; /* PYTHONHOME environment variable, - see also Py_SetPythonHome(). */ + /* Command line arguments (sys.argv). - /* Path configuration outputs */ - int use_module_search_paths; /* If non-zero, use module_search_paths */ - _PyWstrList module_search_paths; /* sys.path paths. Computed if - use_module_search_paths is equal - to zero. */ + By default, Python command line arguments are parsed and then stripped + from argv. Set parse_argv to 0 to avoid that. - wchar_t *executable; /* sys.executable */ - wchar_t *prefix; /* sys.prefix */ - wchar_t *base_prefix; /* sys.base_prefix */ - wchar_t *exec_prefix; /* sys.exec_prefix */ - wchar_t *base_exec_prefix; /* sys.base_exec_prefix */ -#ifdef MS_WINDOWS - wchar_t *dll_path; /* Windows DLL path */ -#endif + If argv is empty, an empty string is added to ensure that sys.argv + always exists and is never empty. */ + _PyWstrList argv; + + /* Program: argv[0] or "". + Used to display Python usage if parsing command line arguments fails. + Used to initialize the default value of program_name */ + wchar_t *program; + wchar_t *program_name; /* Program name, see also Py_GetProgramName() */ + + _PyWstrList xoptions; /* Command line -X options */ + _PyWstrList warnoptions; /* Warnings options */ /* If equal to zero, disable the import of the module site and the site-dependent manipulations of sys.path that it entails. Also disable @@ -350,6 +344,28 @@ typedef struct { int legacy_windows_stdio; #endif + /* --- Path configuration inputs ------------ */ + + wchar_t *module_search_path_env; /* PYTHONPATH environment variable */ + wchar_t *home; /* PYTHONHOME environment variable, + see also Py_SetPythonHome(). */ + + /* --- Path configuration outputs ----------- */ + + int use_module_search_paths; /* If non-zero, use module_search_paths */ + _PyWstrList module_search_paths; /* sys.path paths. Computed if + use_module_search_paths is equal + to zero. */ + + wchar_t *executable; /* sys.executable */ + wchar_t *prefix; /* sys.prefix */ + wchar_t *base_prefix; /* sys.base_prefix */ + wchar_t *exec_prefix; /* sys.exec_prefix */ + wchar_t *base_exec_prefix; /* sys.base_exec_prefix */ +#ifdef MS_WINDOWS + wchar_t *dll_path; /* Windows DLL path */ +#endif + /* --- Parameter only used by Py_Main() ---------- */ /* Skip the first line of the source ('run_filename' parameter), allowing use of non-Unix forms of @@ -408,6 +424,7 @@ typedef struct { .faulthandler = -1, \ .tracemalloc = -1, \ .use_module_search_paths = 0, \ + .parse_argv = 1, \ .site_import = -1, \ .bytes_warning = -1, \ .inspect = -1, \ diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 8f40e9fdb184..3fabe5f9b256 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -304,6 +304,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'pycache_prefix': None, 'program_name': GET_DEFAULT_CONFIG, + 'parse_argv': 1, 'argv': [""], 'program': '', @@ -700,6 +701,14 @@ def test_run_main_config(self): } self.check_config("run_main_config", core_config, preconfig) + def test_init_dont_parse_argv(self): + core_config = { + 'argv': ['-v', '-c', 'arg1', '-W', 'arg2'], + 'parse_argv': 0, + 'program': 'program', + } + self.check_config("init_dont_parse_argv", core_config, {}) + if __name__ == "__main__": unittest.main() diff --git a/Modules/main.c b/Modules/main.c index 47d0574648a9..b47ac70d62cf 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -574,13 +574,13 @@ _Py_RunMain(void) int exitcode = 0; pymain_run_python(&exitcode); + if (Py_FinalizeEx() < 0) { /* Value unlikely to be confused with a non-error exit status or other special meaning */ exitcode = 120; } -done: pymain_free(); if (_Py_UnhandledKeyboardInterrupt) { diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 2560bfc62bb8..6eee2e8bd3ea 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -511,6 +511,37 @@ static int test_init_from_config(void) } +static int test_init_dont_parse_argv(void) +{ + _PyInitError err; + + _PyCoreConfig config = _PyCoreConfig_INIT; + + static wchar_t* argv[] = { + L"-v", + L"-c", + L"arg1", + L"-W", + L"arg2", + }; + + config.program = L"program"; + config.program_name = L"./_testembed"; + + config.argv.length = Py_ARRAY_LENGTH(argv); + config.argv.items = argv; + config.parse_argv = 0; + + err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + dump_config(); + Py_Finalize(); + return 0; +} + + static void test_init_env_putenvs(void) { putenv("PYTHONHASHSEED=42"); @@ -797,6 +828,7 @@ static struct TestCase TestCases[] = { { "init_default_config", test_init_default_config }, { "init_global_config", test_init_global_config }, { "init_from_config", test_init_from_config }, + { "init_dont_parse_argv", test_init_dont_parse_argv }, { "init_env", test_init_env }, { "init_env_dev_mode", test_init_env_dev_mode }, { "init_env_dev_mode_alloc", test_init_env_dev_mode_alloc }, diff --git a/Python/coreconfig.c b/Python/coreconfig.c index ac01712127ac..2b13c5f0f9e3 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -628,6 +628,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_WSTR_ATTR(program_name); COPY_WSTR_ATTR(program); + COPY_ATTR(parse_argv); COPY_WSTRLIST(argv); COPY_WSTRLIST(warnoptions); COPY_WSTRLIST(xoptions); @@ -727,6 +728,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_WSTR(filesystem_errors); SET_ITEM_WSTR(pycache_prefix); SET_ITEM_WSTR(program_name); + SET_ITEM_INT(parse_argv); SET_ITEM_WSTRLIST(argv); SET_ITEM_WSTR(program); SET_ITEM_WSTRLIST(xoptions); @@ -1490,6 +1492,8 @@ config_read(_PyCoreConfig *config, _PyPreCmdline *cmdline) } if (config->isolated > 0) { + /* _PyPreCmdline_Read() sets use_environment to 0 if isolated is set, + _PyPreCmdline_SetCoreConfig() overrides config->use_environment. */ config->user_site_directory = 0; } @@ -1660,7 +1664,7 @@ config_usage(int error, const wchar_t* program) /* Parse the command line arguments */ static _PyInitError config_parse_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline, - _PyWstrList *warnoptions) + _PyWstrList *warnoptions, int *opt_index) { _PyInitError err; const _PyWstrList *argv = &precmdline->argv; @@ -1833,8 +1837,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline, _PyOS_optind--; } - /* -c and -m options are exclusive */ - assert(!(config->run_command != NULL && config->run_module != NULL)); + *opt_index = _PyOS_optind; return _Py_INIT_OK(); } @@ -1978,13 +1981,14 @@ config_init_warnoptions(_PyCoreConfig *config, static _PyInitError -config_init_argv(_PyCoreConfig *config, const _PyPreCmdline *cmdline) +config_update_argv(_PyCoreConfig *config, const _PyPreCmdline *cmdline, + int opt_index) { const _PyWstrList *cmdline_argv = &cmdline->argv; _PyWstrList config_argv = _PyWstrList_INIT; /* Copy argv to be able to modify it (to force -c/-m) */ - if (cmdline_argv->length <= _PyOS_optind) { + if (cmdline_argv->length <= opt_index) { /* Ensure at least one (empty) argument is seen */ if (_PyWstrList_Append(&config_argv, L"") < 0) { return _Py_INIT_NO_MEMORY(); @@ -1992,8 +1996,8 @@ config_init_argv(_PyCoreConfig *config, const _PyPreCmdline *cmdline) } else { _PyWstrList slice; - slice.length = cmdline_argv->length - _PyOS_optind; - slice.items = &cmdline_argv->items[_PyOS_optind]; + slice.length = cmdline_argv->length - opt_index; + slice.items = &cmdline_argv->items[opt_index]; if (_PyWstrList_Copy(&config_argv, &slice) < 0) { return _Py_INIT_NO_MEMORY(); } @@ -2058,14 +2062,22 @@ config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) _PyWstrList cmdline_warnoptions = _PyWstrList_INIT; _PyWstrList env_warnoptions = _PyWstrList_INIT; - err = config_parse_cmdline(config, precmdline, &cmdline_warnoptions); - if (_Py_INIT_FAILED(err)) { - goto done; + if (config->parse_argv < 0) { + config->parse_argv = 1; } - err = config_init_argv(config, precmdline); - if (_Py_INIT_FAILED(err)) { - goto done; + if (config->parse_argv) { + int opt_index; + err = config_parse_cmdline(config, precmdline, &cmdline_warnoptions, + &opt_index); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + err = config_update_argv(config, precmdline, opt_index); + if (_Py_INIT_FAILED(err)) { + goto done; + } } err = config_read(config, precmdline); @@ -2212,6 +2224,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config) assert(config->verbose >= 0); assert(config->quiet >= 0); assert(config->user_site_directory >= 0); + assert(config->parse_argv >= 0); assert(config->buffered_stdio >= 0); assert(config->program_name != NULL); assert(config->program != NULL); @@ -2236,6 +2249,8 @@ _PyCoreConfig_Read(_PyCoreConfig *config) #ifdef MS_WINDOWS assert(config->legacy_windows_stdio >= 0); #endif + /* -c and -m options are exclusive */ + assert(!(config->run_command != NULL && config->run_module != NULL)); assert(config->check_hash_pycs_mode != NULL); assert(config->_install_importlib >= 0); assert(config->_frozen >= 0); From webhook-mailer at python.org Thu May 16 11:38:24 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 16 May 2019 15:38:24 -0000 Subject: [Python-checkins] bpo-36763: Add _Py_InitializeMain() (GH-13362) Message-ID: https://github.com/python/cpython/commit/9ef5dcaa0b3c7c7ba28dbb3ec0c9507d9d05e3a9 commit: 9ef5dcaa0b3c7c7ba28dbb3ec0c9507d9d05e3a9 branch: master author: Victor Stinner committer: GitHub date: 2019-05-16T17:38:16+02:00 summary: bpo-36763: Add _Py_InitializeMain() (GH-13362) * Add a private _Py_InitializeMain() function. * Add again _PyCoreConfig._init_main. * _Py_InitializeFromConfig() now uses _init_main to decide if _Py_InitializeMainInterpreter() should be called. * _PyCoreConfig: rename _frozen to pathconfig_warnings, its value is now the opposite of Py_FrozenFlag. * Add an unit test for _init_main=0 and _Py_InitializeMain(). files: M Include/cpython/coreconfig.h M Include/cpython/pylifecycle.h M Lib/test/test_embed.py M Modules/getpath.c M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/coreconfig.c M Python/frozenmain.c M Python/pylifecycle.c M Python/pythonrun.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index a04342ea9809..c2c556684068 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -398,10 +398,14 @@ typedef struct { See PEP 552 "Deterministic pycs" for more details. */ wchar_t *check_hash_pycs_mode; - /* If greater than 0, suppress _PyPathConfig_Calculate() warnings. + /* If greater than 0, suppress _PyPathConfig_Calculate() warnings on Unix. + The parameter has no effect on Windows. - If set to -1 (default), inherit Py_FrozenFlag value. */ - int _frozen; + If set to -1 (default), inherit !Py_FrozenFlag value. */ + int pathconfig_warnings; + + /* If equal to 0, stop Python initialization before the "main" phase */ + int _init_main; } _PyCoreConfig; @@ -438,7 +442,8 @@ typedef struct { .buffered_stdio = -1, \ ._install_importlib = 1, \ .check_hash_pycs_mode = NULL, \ - ._frozen = -1} + .pathconfig_warnings = -1, \ + ._init_main = 1} /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ #ifdef __cplusplus diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 2366c774e7fa..a3ab6c915ef9 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -40,6 +40,7 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeFromWideArgs( const _PyCoreConfig *config, int argc, wchar_t **argv); +PyAPI_FUNC(_PyInitError) _Py_InitializeMain(void); PyAPI_FUNC(int) _Py_RunMain(void); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 3fabe5f9b256..c3c1a3e3bacd 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -343,7 +343,8 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_install_importlib': 1, 'check_hash_pycs_mode': 'default', - '_frozen': 0, + 'pathconfig_warnings': 1, + '_init_main': 1, } if MS_WINDOWS: DEFAULT_PRE_CONFIG.update({ @@ -371,7 +372,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_DontWriteBytecodeFlag', 'write_bytecode', True), ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), - ('Py_FrozenFlag', '_frozen'), + ('Py_FrozenFlag', 'pathconfig_warnings', True), ('Py_IgnoreEnvironmentFlag', 'use_environment', True), ('Py_InspectFlag', 'inspect'), ('Py_InteractiveFlag', 'interactive'), @@ -500,7 +501,8 @@ def check_global_config(self, config): self.assertEqual(config['global_config'], expected) - def check_config(self, testname, expected_config, expected_preconfig, add_path=None): + def check_config(self, testname, expected_config, expected_preconfig, + add_path=None, stderr=None): env = dict(os.environ) # Remove PYTHON* environment variables to get deterministic environment for key in list(env): @@ -511,19 +513,22 @@ def check_config(self, testname, expected_config, expected_preconfig, add_path=N env['PYTHONCOERCECLOCALE'] = '0' env['PYTHONUTF8'] = '0' - out, err = self.run_embedded_interpreter(testname, env=env) - # Ignore err - try: - config = json.loads(out) - except json.JSONDecodeError: - self.fail(f"fail to decode stdout: {out!r}") - expected_preconfig = dict(self.DEFAULT_PRE_CONFIG, **expected_preconfig) expected_config = self.get_expected_config(expected_config, env, add_path) for key in self.COPY_PRE_CONFIG: if key not in expected_preconfig: expected_preconfig[key] = expected_config[key] + out, err = self.run_embedded_interpreter(testname, env=env) + if stderr is None and not expected_config['verbose']: + stderr = "" + if stderr is not None: + self.assertEqual(err.rstrip(), stderr) + try: + config = json.loads(out) + except json.JSONDecodeError: + self.fail(f"fail to decode stdout: {out!r}") + self.check_pre_config(config, expected_preconfig) self.check_core_config(config, expected_config) self.check_global_config(config) @@ -689,7 +694,19 @@ def test_init_read_set(self): self.check_config("init_read_set", core_config, preconfig, add_path="init_read_set_path") - def test_run_main_config(self): + def test_init_run_main(self): + preconfig = {} + code = ('import _testinternalcapi, json; ' + 'print(json.dumps(_testinternalcapi.get_configs()))') + core_config = { + 'argv': ['-c', 'arg2'], + 'program': 'python3', + 'program_name': './python3', + 'run_command': code + '\n', + } + self.check_config("init_run_main", core_config, preconfig) + + def test_init_main(self): preconfig = {} code = ('import _testinternalcapi, json; ' 'print(json.dumps(_testinternalcapi.get_configs()))') @@ -698,8 +715,10 @@ def test_run_main_config(self): 'program': 'python3', 'program_name': './python3', 'run_command': code + '\n', + '_init_main': 0, } - self.check_config("run_main_config", core_config, preconfig) + self.check_config("init_main", core_config, preconfig, + stderr="Run Python code before _Py_InitializeMain") def test_init_dont_parse_argv(self): core_config = { diff --git a/Modules/getpath.c b/Modules/getpath.c index 3991ad719c1e..34357e47bc23 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -493,7 +493,7 @@ calculate_prefix(const _PyCoreConfig *core_config, } if (!calculate->prefix_found) { - if (!core_config->_frozen) { + if (core_config->pathconfig_warnings) { fprintf(stderr, "Could not find platform independent libraries \n"); } @@ -681,7 +681,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config, } if (!calculate->exec_prefix_found) { - if (!core_config->_frozen) { + if (core_config->pathconfig_warnings) { fprintf(stderr, "Could not find platform dependent libraries \n"); } @@ -1206,7 +1206,7 @@ calculate_path_impl(const _PyCoreConfig *core_config, } if ((!calculate->prefix_found || !calculate->exec_prefix_found) && - !core_config->_frozen) + core_config->pathconfig_warnings) { fprintf(stderr, "Consider setting $PYTHONHOME to [:]\n"); diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 4b2ed70de97c..8cbbe17cfaf1 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -83,7 +83,8 @@ main(int argc, char *argv[]) config.program_name = L"./_freeze_importlib"; /* Don't install importlib, since it could execute outdated bytecode. */ config._install_importlib = 0; - config._frozen = 1; + config.pathconfig_warnings = 0; + config._init_main = 0; _PyInitError err = _Py_InitializeFromConfig(&config); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 6eee2e8bd3ea..4ee2cd1b4070 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -757,34 +757,71 @@ static int test_init_read_set(void) } -static int test_run_main(void) +wchar_t *init_main_argv[] = { + L"python3", L"-c", + (L"import _testinternalcapi, json; " + L"print(json.dumps(_testinternalcapi.get_configs()))"), + L"arg2"}; + + +static void configure_init_main(_PyCoreConfig *config) +{ + config->argv.length = Py_ARRAY_LENGTH(init_main_argv); + config->argv.items = init_main_argv; + config->program_name = L"./python3"; +} + + +static int test_init_run_main(void) { _PyCoreConfig config = _PyCoreConfig_INIT; + configure_init_main(&config); + + _PyInitError err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + return _Py_RunMain(); +} - wchar_t *argv[] = {L"python3", L"-c", - (L"import sys; " - L"print(f'_Py_RunMain(): sys.argv={sys.argv}')"), - L"arg2"}; - config.argv.length = Py_ARRAY_LENGTH(argv); - config.argv.items = argv; - config.program_name = L"./python3"; + +static int test_init_main(void) +{ + _PyCoreConfig config = _PyCoreConfig_INIT; + configure_init_main(&config); + config._init_main = 0; _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } + /* sys.stdout don't exist yet: it is created by _Py_InitializeMain() */ + int res = PyRun_SimpleString( + "import sys; " + "print('Run Python code before _Py_InitializeMain', " + "file=sys.stderr)"); + if (res < 0) { + exit(1); + } + + err = _Py_InitializeMain(); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + return _Py_RunMain(); } -static int test_run_main_config(void) +static int test_run_main(void) { _PyCoreConfig config = _PyCoreConfig_INIT; wchar_t *argv[] = {L"python3", L"-c", - (L"import _testinternalcapi, json; " - L"print(json.dumps(_testinternalcapi.get_configs()))"), + (L"import sys; " + L"print(f'_Py_RunMain(): sys.argv={sys.argv}')"), L"arg2"}; config.argv.length = Py_ARRAY_LENGTH(argv); config.argv.items = argv; @@ -837,8 +874,9 @@ static struct TestCase TestCases[] = { { "preinit_isolated1", test_preinit_isolated1 }, { "preinit_isolated2", test_preinit_isolated2 }, { "init_read_set", test_init_read_set }, + { "init_run_main", test_init_run_main }, + { "init_main", test_init_main }, { "run_main", test_run_main }, - { "run_main_config", test_run_main_config }, { NULL, NULL } }; diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 2b13c5f0f9e3..8a5e5d509cbc 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -667,7 +667,8 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_WSTR_ATTR(run_module); COPY_WSTR_ATTR(run_filename); COPY_WSTR_ATTR(check_hash_pycs_mode); - COPY_ATTR(_frozen); + COPY_ATTR(pathconfig_warnings); + COPY_ATTR(_init_main); #undef COPY_ATTR #undef COPY_WSTR_ATTR @@ -766,7 +767,8 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_WSTR(run_filename); SET_ITEM_INT(_install_importlib); SET_ITEM_WSTR(check_hash_pycs_mode); - SET_ITEM_INT(_frozen); + SET_ITEM_INT(pathconfig_warnings); + SET_ITEM_INT(_init_main); return dict; @@ -855,7 +857,7 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif - COPY_FLAG(_frozen, Py_FrozenFlag); + COPY_NOT_FLAG(pathconfig_warnings, Py_FrozenFlag); COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); COPY_NOT_FLAG(site_import, Py_NoSiteFlag); @@ -892,7 +894,7 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif - COPY_FLAG(_frozen, Py_FrozenFlag); + COPY_NOT_FLAG(pathconfig_warnings, Py_FrozenFlag); COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); COPY_NOT_FLAG(site_import, Py_NoSiteFlag); @@ -2253,7 +2255,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config) assert(!(config->run_command != NULL && config->run_module != NULL)); assert(config->check_hash_pycs_mode != NULL); assert(config->_install_importlib >= 0); - assert(config->_frozen >= 0); + assert(config->pathconfig_warnings >= 0); err = _Py_INIT_OK(); diff --git a/Python/frozenmain.c b/Python/frozenmain.c index a777576ad78c..f2499ef84cd9 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -40,7 +40,7 @@ Py_FrozenMain(int argc, char **argv) } _PyCoreConfig config = _PyCoreConfig_INIT; - config._frozen = 1; /* Suppress errors from getpath.c */ + config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */ if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') inspect = 1; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index a173eb380a52..e89152637fe1 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -970,6 +970,21 @@ _Py_InitializeMainInterpreter(_PyRuntimeState *runtime, return _Py_INIT_OK(); } + +_PyInitError +_Py_InitializeMain(void) +{ + _PyInitError err = _PyRuntime_Initialize(); + if (_Py_INIT_FAILED(err)) { + return err; + } + _PyRuntimeState *runtime = &_PyRuntime; + PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; + + return _Py_InitializeMainInterpreter(runtime, interp); +} + + #undef _INIT_DEBUG_PRINT static _PyInitError @@ -990,7 +1005,7 @@ init_python(const _PyCoreConfig *config, const _PyArgv *args) } config = &interp->core_config; - if (!config->_frozen) { + if (config->_init_main) { err = _Py_InitializeMainInterpreter(runtime, interp); if (_Py_INIT_FAILED(err)) { return err; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 3d83044af9af..bc131fd7e5ec 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1046,6 +1046,15 @@ run_eval_code_obj(PyCodeObject *co, PyObject *globals, PyObject *locals) * Py_Main() based one. */ _Py_UnhandledKeyboardInterrupt = 0; + + /* Set globals['__builtins__'] if it doesn't exist */ + if (globals != NULL && PyDict_GetItemString(globals, "__builtins__") == NULL) { + PyInterpreterState *interp = _PyInterpreterState_Get(); + if (PyDict_SetItemString(globals, "__builtins__", interp->builtins) < 0) { + return NULL; + } + } + v = PyEval_EvalCode((PyObject*)co, globals, locals); if (!v && PyErr_Occurred() == PyExc_KeyboardInterrupt) { _Py_UnhandledKeyboardInterrupt = 1; From webhook-mailer at python.org Thu May 16 12:30:29 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 16 May 2019 16:30:29 -0000 Subject: [Python-checkins] bpo-36763: Add _PyCoreConfig.configure_c_stdio (GH-13363) Message-ID: https://github.com/python/cpython/commit/54b43bb3bb88339b63182b3515cda3efa530ed62 commit: 54b43bb3bb88339b63182b3515cda3efa530ed62 branch: master author: Victor Stinner committer: GitHub date: 2019-05-16T18:30:15+02:00 summary: bpo-36763: Add _PyCoreConfig.configure_c_stdio (GH-13363) Add tests for configure_c_stdio and pathconfig_warnings parameters. files: M Include/cpython/coreconfig.h M Lib/test/test_embed.py M Programs/_testembed.c M Python/coreconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index c2c556684068..b531118ea3cf 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -312,6 +312,14 @@ typedef struct { !Py_NoUserSiteDirectory. */ int user_site_directory; + /* If non-zero, configure C standard steams (stdio, stdout, + stderr): + + - Set O_BINARY mode on Windows. + - If buffered_stdio is equal to zero, make streams unbuffered. + Otherwise, enable streams buffering if interactive is non-zero. */ + int configure_c_stdio; + /* If equal to 0, enable unbuffered mode: force the stdout and stderr streams to be unbuffered. @@ -439,6 +447,7 @@ typedef struct { .verbose = -1, \ .quiet = -1, \ .user_site_directory = -1, \ + .configure_c_stdio = 1, \ .buffered_stdio = -1, \ ._install_importlib = 1, \ .check_hash_pycs_mode = NULL, \ diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index c3c1a3e3bacd..b1872ace8a60 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -331,6 +331,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'verbose': 0, 'quiet': 0, 'user_site_directory': 1, + 'configure_c_stdio': 1, 'buffered_stdio': 1, 'stdio_encoding': GET_DEFAULT_CONFIG, @@ -558,6 +559,7 @@ def test_init_global_config(self): 'filesystem_encoding': 'utf-8', 'filesystem_errors': self.UTF8_MODE_ERRORS, 'user_site_directory': 0, + 'pathconfig_warnings': 0, } self.check_config("init_global_config", config, preconfig) @@ -597,11 +599,13 @@ def test_init_from_config(self): 'write_bytecode': 0, 'verbose': 1, 'quiet': 1, + 'configure_c_stdio': 0, 'buffered_stdio': 0, 'user_site_directory': 0, 'faulthandler': 1, 'check_hash_pycs_mode': 'always', + 'pathconfig_warnings': 0, } self.check_config("init_from_config", config, preconfig) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 4ee2cd1b4070..87d159fe7219 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -360,6 +360,8 @@ static int test_init_global_config(void) putenv("PYTHONUNBUFFERED="); Py_UnbufferedStdioFlag = 1; + Py_FrozenFlag = 1; + /* FIXME: test Py_LegacyWindowsFSEncodingFlag */ /* FIXME: test Py_LegacyWindowsStdioFlag */ @@ -481,6 +483,8 @@ static int test_init_from_config(void) Py_QuietFlag = 0; config.quiet = 1; + config.configure_c_stdio = 0; + putenv("PYTHONUNBUFFERED="); Py_UnbufferedStdioFlag = 0; config.buffered_stdio = 0; @@ -501,6 +505,9 @@ static int test_init_from_config(void) config.check_hash_pycs_mode = L"always"; + Py_FrozenFlag = 0; + config.pathconfig_warnings = 0; + err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 8a5e5d509cbc..e51bf9424a30 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -654,6 +654,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_ATTR(verbose); COPY_ATTR(quiet); COPY_ATTR(user_site_directory); + COPY_ATTR(configure_c_stdio); COPY_ATTR(buffered_stdio); COPY_WSTR_ATTR(filesystem_encoding); COPY_WSTR_ATTR(filesystem_errors); @@ -755,6 +756,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_INT(verbose); SET_ITEM_INT(quiet); SET_ITEM_INT(user_site_directory); + SET_ITEM_INT(configure_c_stdio); SET_ITEM_INT(buffered_stdio); SET_ITEM_WSTR(stdio_encoding); SET_ITEM_WSTR(stdio_errors); @@ -1582,7 +1584,6 @@ config_read(_PyCoreConfig *config, _PyPreCmdline *cmdline) return _Py_INIT_NO_MEMORY(); } } - return _Py_INIT_OK(); } @@ -1632,7 +1633,10 @@ void _PyCoreConfig_Write(const _PyCoreConfig *config, _PyRuntimeState *runtime) { _PyCoreConfig_SetGlobalConfig(config); - config_init_stdio(config); + + if (config->configure_c_stdio) { + config_init_stdio(config); + } /* Write the new pre-configuration into _PyRuntime */ _PyPreConfig *preconfig = &runtime->preconfig; @@ -2067,6 +2071,9 @@ config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) if (config->parse_argv < 0) { config->parse_argv = 1; } + if (config->configure_c_stdio < 0) { + config->configure_c_stdio = 1; + } if (config->parse_argv) { int opt_index; @@ -2171,7 +2178,9 @@ _PyCoreConfig_SetWideArgv(_PyCoreConfig *config, int argc, wchar_t **argv) * Command line arguments * Environment variables - * Py_xxx global configuration variables */ + * Py_xxx global configuration variables + + The only side effects are to modify config and to call _Py_SetArgcArgv(). */ _PyInitError _PyCoreConfig_Read(_PyCoreConfig *config) { @@ -2227,14 +2236,19 @@ _PyCoreConfig_Read(_PyCoreConfig *config) assert(config->quiet >= 0); assert(config->user_site_directory >= 0); assert(config->parse_argv >= 0); + assert(config->configure_c_stdio >= 0); assert(config->buffered_stdio >= 0); assert(config->program_name != NULL); assert(config->program != NULL); assert(_PyWstrList_CheckConsistency(&config->argv)); + /* sys.argv must be non-empty: empty argv is replaced with [''] */ + assert(config->argv.length >= 1); assert(_PyWstrList_CheckConsistency(&config->xoptions)); assert(_PyWstrList_CheckConsistency(&config->warnoptions)); assert(_PyWstrList_CheckConsistency(&config->module_search_paths)); if (config->_install_importlib) { + assert(config->use_module_search_paths != 0); + /* don't check config->module_search_paths */ assert(config->executable != NULL); assert(config->prefix != NULL); assert(config->base_prefix != NULL); From webhook-mailer at python.org Thu May 16 12:41:41 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 16 May 2019 16:41:41 -0000 Subject: [Python-checkins] bpo-35926: Add support for OpenSSL 1.1.1b on Windows (GH-11779) Message-ID: https://github.com/python/cpython/commit/aa73841a8fdded4a462d045d1eb03899cbeecd65 commit: aa73841a8fdded4a462d045d1eb03899cbeecd65 branch: 3.7 author: Steve Dower committer: GitHub date: 2019-05-16T09:41:36-07:00 summary: bpo-35926: Add support for OpenSSL 1.1.1b on Windows (GH-11779) files: A Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst M .azure-pipelines/ci.yml M Lib/test/test_asyncio/test_sslproto.py M Lib/test/test_ssl.py M Misc/ACKS M Modules/_ssl.c M PCbuild/get_externals.bat M PCbuild/openssl.props M PCbuild/openssl.vcxproj M PCbuild/prepare_ssl.bat M PCbuild/python.props M PCbuild/readme.txt diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 15a83dd0370e..1576599379c4 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -59,7 +59,7 @@ jobs: variables: testRunTitle: '$(build.sourceBranchName)-linux' testRunPlatform: linux - openssl_version: 1.1.0j + openssl_version: 1.1.1b steps: - template: ./posix-steps.yml @@ -116,7 +116,7 @@ jobs: variables: testRunTitle: '$(Build.SourceBranchName)-linux-coverage' testRunPlatform: linux-coverage - openssl_version: 1.1.0j + openssl_version: 1.1.1b steps: - template: ./posix-steps.yml diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 6c0b0e2a0187..6d085f303546 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -494,8 +494,8 @@ def test_start_tls_server_1(self): server_context = test_utils.simple_server_sslcontext() client_context = test_utils.simple_client_sslcontext() - if sys.platform.startswith('freebsd'): - # bpo-35031: Some FreeBSD buildbots fail to run this test + if sys.platform.startswith('freebsd') or sys.platform.startswith('win'): + # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test # as the eof was not being received by the server if the payload # size is not big enough. This behaviour only appears if the # client is using TLS1.3. diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 422d6f2f445a..73b6bdf01e7f 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2214,7 +2214,7 @@ def wrap_conn(self): self.sock, server_side=True) self.server.selected_npn_protocols.append(self.sslconn.selected_npn_protocol()) self.server.selected_alpn_protocols.append(self.sslconn.selected_alpn_protocol()) - except (ConnectionResetError, BrokenPipeError) as e: + except (ConnectionResetError, BrokenPipeError, ConnectionAbortedError) as e: # We treat ConnectionResetError as though it were an # SSLError - OpenSSL on Ubuntu abruptly closes the # connection when asked to use an unsupported protocol. @@ -2222,6 +2222,9 @@ def wrap_conn(self): # BrokenPipeError is raised in TLS 1.3 mode, when OpenSSL # tries to send session tickets after handshake. # https://github.com/openssl/openssl/issues/6342 + # + # ConnectionAbortedError is raised in TLS 1.3 mode, when OpenSSL + # tries to send session tickets after handshake when using WinSock. self.server.conn_errors.append(str(e)) if self.server.chatty: handle_error("\n server: bad connection attempt from " + repr(self.addr) + ":\n") @@ -2352,7 +2355,7 @@ def run(self): sys.stdout.write(" server: read %r (%s), sending back %r (%s)...\n" % (msg, ctype, msg.lower(), ctype)) self.write(msg.lower()) - except ConnectionResetError: + except (ConnectionResetError, ConnectionAbortedError): # XXX: OpenSSL 1.1.1 sometimes raises ConnectionResetError # when connection is not shut down gracefully. if self.server.chatty and support.verbose: @@ -2362,6 +2365,18 @@ def run(self): ) self.close() self.running = False + except ssl.SSLError as err: + # On Windows sometimes test_pha_required_nocert receives the + # PEER_DID_NOT_RETURN_A_CERTIFICATE exception + # before the 'tlsv13 alert certificate required' exception. + # If the server is stopped when PEER_DID_NOT_RETURN_A_CERTIFICATE + # is received test_pha_required_nocert fails with ConnectionResetError + # because the underlying socket is closed + if 'PEER_DID_NOT_RETURN_A_CERTIFICATE' == err.reason: + if self.server.chatty and support.verbose: + sys.stdout.write(err.args[1]) + # test_pha_required_nocert is expecting this exception + raise ssl.SSLError('tlsv13 alert certificate required') except OSError: if self.server.chatty: handle_error("Test server failure:\n") diff --git a/Misc/ACKS b/Misc/ACKS index 025944f318f9..2d887bcb6a0f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1088,6 +1088,7 @@ Tim Mitchell Zubin Mithra Florian Mladitsch Doug Moen +Paul Monson The Dragon De Monsyne Bastien Montagne Skip Montanaro diff --git a/Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst b/Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst new file mode 100644 index 000000000000..03249c6a168a --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst @@ -0,0 +1 @@ +Update to OpenSSL 1.1.1b for Windows. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index fff1a28843d0..30c91f59310f 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -669,7 +669,7 @@ fill_and_set_sslerror(PySSLSocket *sslsock, PyObject *type, int ssl_errno, if (msg == NULL) goto fail; - init_value = Py_BuildValue("iN", ssl_errno, msg); + init_value = Py_BuildValue("iN", ERR_GET_REASON(ssl_errno), msg); if (init_value == NULL) goto fail; diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 887fdc941171..27722bb9c4d6 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -49,7 +49,7 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.6 -if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.0j +if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1b set libraries=%libraries% sqlite-3.21.0.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.9.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.9.0 @@ -72,7 +72,7 @@ for %%e in (%libraries%) do ( echo.Fetching external binaries... set binaries= -if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.0j +if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.1b if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.9.0 if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 diff --git a/PCbuild/openssl.props b/PCbuild/openssl.props index 8c78cd4ab108..a7e16793c7f2 100644 --- a/PCbuild/openssl.props +++ b/PCbuild/openssl.props @@ -11,7 +11,8 @@ <_DLLSuffix>-1_1 - <_DLLSuffix Condition="$(Platform) == 'x64'">$(_DLLSuffix)-x64 + <_DLLSuffix Condition="$(Platform) == 'ARM'">$(_DLLSuffix)-arm + <_DLLSuffix Condition="$(Platform) == 'ARM64'">$(_DLLSuffix)-arm64 <_SSLDLL Include="$(opensslOutDir)\libcrypto$(_DLLSuffix).dll" /> diff --git a/PCbuild/openssl.vcxproj b/PCbuild/openssl.vcxproj index 1a36d08ec06c..0da6f6749584 100644 --- a/PCbuild/openssl.vcxproj +++ b/PCbuild/openssl.vcxproj @@ -1,37 +1,21 @@ ? - - Debug - Win32 - Release Win32 - - PGInstrument - Win32 - - - PGInstrument - x64 - - - PGUpdate - Win32 - - - PGUpdate + + Release x64 - - Debug - x64 + + Release + ARM - + Release - x64 + ARM64 @@ -40,15 +24,36 @@ - - + + Makefile 32 - 64 x86 - amd64 VC-WIN32 - VC-WIN64A + true + + + + Makefile + 64 + amd64 + VC-WIN64A-masm + true + + + + Makefile + ARM + ARM + VC-WIN32-ARM + true + + + + Makefile + ARM64 + ARM64 + VC-WIN64-ARM true diff --git a/PCbuild/prepare_ssl.bat b/PCbuild/prepare_ssl.bat index bd4b548528c5..88fd0225f5ea 100644 --- a/PCbuild/prepare_ssl.bat +++ b/PCbuild/prepare_ssl.bat @@ -42,7 +42,7 @@ if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & call "%PCBUILD%\find_python.bat" "%PYTHON%" if ERRORLEVEL 1 (echo Cannot locate python.exe on PATH or as PYTHON variable & exit /b 3) -call "%PCBUILD%\get_externals.bat" --openssl-src %ORG_SETTING% +call "%PCBUILD%\get_externals.bat" --openssl-src --no-openssl %ORG_SETTING% if "%PERL%" == "" where perl > "%TEMP%\perl.loc" 2> nul && set /P PERL= <"%TEMP%\perl.loc" & del "%TEMP%\perl.loc" if "%PERL%" == "" (echo Cannot locate perl.exe on PATH or as PERL variable & exit /b 4) @@ -51,4 +51,8 @@ if "%PERL%" == "" (echo Cannot locate perl.exe on PATH or as PERL variable & exi if errorlevel 1 exit /b %MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=x64 if errorlevel 1 exit /b +%MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=ARM +if errorlevel 1 exit /b +%MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=ARM64 +if errorlevel 1 exit /b diff --git a/PCbuild/python.props b/PCbuild/python.props index 683fbb6e6f84..58877ee06698 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -49,8 +49,8 @@ $(ExternalsDir)sqlite-3.21.0.0\ $(ExternalsDir)bzip2-1.0.6\ $(ExternalsDir)xz-5.2.2\ - $(ExternalsDir)openssl-1.1.0j\ - $(ExternalsDir)openssl-bin-1.1.0j\$(ArchName)\ + $(ExternalsDir)openssl-1.1.1b\ + $(ExternalsDir)openssl-bin-1.1.1b\$(ArchName)\ $(opensslOutDir)include $(ExternalsDir)\nasm-2.11.06\ $(ExternalsDir)\zlib-1.2.11\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 1f2fb929efd9..c44722b98887 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -165,7 +165,7 @@ _lzma Homepage: http://tukaani.org/xz/ _ssl - Python wrapper for version 1.1.0h of the OpenSSL secure sockets + Python wrapper for version 1.1.1b of the OpenSSL secure sockets library, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. From webhook-mailer at python.org Thu May 16 16:08:32 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 16 May 2019 20:08:32 -0000 Subject: [Python-checkins] bpo-36751: Undeprecate getfullargspec (GH-13245) Message-ID: https://github.com/python/cpython/commit/aee19f54f6fe45f6b3c906987941e5a8af4468e9 commit: aee19f54f6fe45f6b3c906987941e5a8af4468e9 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-16T21:08:15+01:00 summary: bpo-36751: Undeprecate getfullargspec (GH-13245) files: M Doc/library/inspect.rst M Doc/whatsnew/3.8.rst M Lib/inspect.py M Lib/test/test_inspect.py M Misc/NEWS.d/3.8.0a4.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index d12f122a57b5..81824ddc1e54 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -948,11 +948,6 @@ Classes and functions APIs. This function is retained primarily for use in code that needs to maintain compatibility with the Python 2 ``inspect`` module API. - .. deprecated:: 3.8 - Use :func:`signature` and - :ref:`Signature Object `, which provide a - better introspecting API for callables. - .. versionchanged:: 3.4 This function is now based on :func:`signature`, but still ignores ``__wrapped__`` attributes and includes the already bound first diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index c135183095ca..d47993bf1129 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -780,10 +780,6 @@ Deprecated `. (Contributed by Serhiy Storchaka in :issue:`36492`.) -* The function :func:`~inspect.getfullargspec` in the :mod:`inspect` - module is deprecated in favor of the :func:`inspect.signature` - API. (Contributed by Pablo Galindo in :issue:`36751`.) - API and Feature Removals ======================== diff --git a/Lib/inspect.py b/Lib/inspect.py index 6c3027987b30..a4f28f755705 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1103,16 +1103,10 @@ def getfullargspec(func): 'kwonlydefaults' is a dictionary mapping names from kwonlyargs to defaults. 'annotations' is a dictionary mapping parameter names to annotations. - .. deprecated:: 3.8 - Use inspect.signature() instead of inspect.getfullargspec(). - Notable differences from inspect.signature(): - the "self" parameter is always reported, even for bound methods - wrapper chains defined by __wrapped__ *not* unwrapped automatically """ - - warnings.warn("Use inspect.signature() instead of inspect.getfullargspec()", - DeprecationWarning, stacklevel=2) try: # Re: `skip_bound_arg=False` # diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index c54cdb23c242..be52b389e62d 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -750,25 +750,22 @@ class D(B, C): pass def assertArgSpecEquals(self, routine, args_e, varargs_e=None, varkw_e=None, defaults_e=None, formatted=None): - with self.assertWarns(DeprecationWarning): - args, varargs, varkw, defaults = inspect.getargspec(routine) + args, varargs, varkw, defaults = inspect.getargspec(routine) self.assertEqual(args, args_e) self.assertEqual(varargs, varargs_e) self.assertEqual(varkw, varkw_e) self.assertEqual(defaults, defaults_e) if formatted is not None: - with self.assertWarns(DeprecationWarning): - self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults), - formatted) + self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults), + formatted) def assertFullArgSpecEquals(self, routine, args_e, varargs_e=None, varkw_e=None, defaults_e=None, posonlyargs_e=[], kwonlyargs_e=[], kwonlydefaults_e=None, ann_e={}, formatted=None): - with self.assertWarns(DeprecationWarning): - args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \ - inspect.getfullargspec(routine) + args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \ + inspect.getfullargspec(routine) self.assertEqual(args, args_e) self.assertEqual(varargs, varargs_e) self.assertEqual(varkw, varkw_e) @@ -777,9 +774,8 @@ def assertFullArgSpecEquals(self, routine, args_e, varargs_e=None, self.assertEqual(kwonlydefaults, kwonlydefaults_e) self.assertEqual(ann, ann_e) if formatted is not None: - with self.assertWarns(DeprecationWarning): - self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults, - kwonlyargs, kwonlydefaults, ann), + self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults, + kwonlyargs, kwonlydefaults, ann), formatted) def test_getargspec(self): @@ -879,13 +875,11 @@ def test(): def test_getfullargspec_signature_annos(self): def test(a:'spam') -> 'ham': pass - with self.assertWarns(DeprecationWarning): - spec = inspect.getfullargspec(test) + spec = inspect.getfullargspec(test) self.assertEqual(test.__annotations__, spec.annotations) def test(): pass - with self.assertWarns(DeprecationWarning): - spec = inspect.getfullargspec(test) + spec = inspect.getfullargspec(test) self.assertEqual(test.__annotations__, spec.annotations) @unittest.skipIf(MISSING_C_DOCSTRINGS, @@ -910,8 +904,7 @@ def test_getfullargspec_builtin_methods(self): def test_getfullargspec_builtin_func(self): import _testcapi builtin = _testcapi.docstring_with_signature_with_defaults - with self.assertWarns(DeprecationWarning): - spec = inspect.getfullargspec(builtin) + spec = inspect.getfullargspec(builtin) self.assertEqual(spec.defaults[0], 'avocado') @cpython_only @@ -920,20 +913,17 @@ def test_getfullargspec_builtin_func(self): def test_getfullargspec_builtin_func_no_signature(self): import _testcapi builtin = _testcapi.docstring_no_signature - with self.assertWarns(DeprecationWarning): - with self.assertRaises(TypeError): - inspect.getfullargspec(builtin) + with self.assertRaises(TypeError): + inspect.getfullargspec(builtin) def test_getfullargspec_definition_order_preserved_on_kwonly(self): for fn in signatures_with_lexicographic_keyword_only_parameters(): - with self.assertWarns(DeprecationWarning): - signature = inspect.getfullargspec(fn) + signature = inspect.getfullargspec(fn) l = list(signature.kwonlyargs) sorted_l = sorted(l) self.assertTrue(l) self.assertEqual(l, sorted_l) - with self.assertWarns(DeprecationWarning): - signature = inspect.getfullargspec(unsorted_keyword_only_parameters_fn) + signature = inspect.getfullargspec(unsorted_keyword_only_parameters_fn) l = list(signature.kwonlyargs) self.assertEqual(l, unsorted_keyword_only_parameters) @@ -1390,9 +1380,8 @@ class TestGetcallargsFunctions(unittest.TestCase): def assertEqualCallArgs(self, func, call_params_string, locs=None): locs = dict(locs or {}, func=func) r1 = eval('func(%s)' % call_params_string, None, locs) - with self.assertWarns(DeprecationWarning): - r2 = eval('inspect.getcallargs(func, %s)' % call_params_string, None, - locs) + r2 = eval('inspect.getcallargs(func, %s)' % call_params_string, None, + locs) self.assertEqual(r1, r2) def assertEqualException(self, func, call_param_string, locs=None): @@ -1404,9 +1393,8 @@ def assertEqualException(self, func, call_param_string, locs=None): else: self.fail('Exception not raised') try: - with self.assertWarns(DeprecationWarning): - eval('inspect.getcallargs(func, %s)' % call_param_string, None, - locs) + eval('inspect.getcallargs(func, %s)' % call_param_string, None, + locs) except Exception as e: ex2 = e else: @@ -1564,16 +1552,14 @@ def test_errors(self): def f5(*, a): pass with self.assertRaisesRegex(TypeError, 'missing 1 required keyword-only'): - with self.assertWarns(DeprecationWarning): - inspect.getcallargs(f5) + inspect.getcallargs(f5) # issue20817: def f6(a, b, c): pass with self.assertRaisesRegex(TypeError, "'a', 'b' and 'c'"): - with self.assertWarns(DeprecationWarning): - inspect.getcallargs(f6) + inspect.getcallargs(f6) # bpo-33197 with self.assertRaisesRegex(ValueError, diff --git a/Misc/NEWS.d/3.8.0a4.rst b/Misc/NEWS.d/3.8.0a4.rst index 76bb4970ff85..b92e60a92691 100644 --- a/Misc/NEWS.d/3.8.0a4.rst +++ b/Misc/NEWS.d/3.8.0a4.rst @@ -33,17 +33,6 @@ directory if the :envvar:`PATH` environment variable is not set. .. -.. bpo: 36751 -.. date: 2019-04-29-23-30-21 -.. nonce: 3NCRbm -.. section: Core and Builtins - -The :func:`~inspect.getfullargspec` function in the :mod:`inspect` module is -deprecated in favor of the :func:`inspect.signature` API. Contributed by -Pablo Galindo. - -.. - .. bpo: 36722 .. date: 2019-04-25-21-02-40 .. nonce: 8NApVM From webhook-mailer at python.org Thu May 16 21:15:18 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 01:15:18 -0000 Subject: [Python-checkins] bpo-36763: Cleanup precmdline in _PyCoreConfig_Read() (GH-13371) Message-ID: https://github.com/python/cpython/commit/870b035bc6da96689b59dd6f79782ec6f1873617 commit: 870b035bc6da96689b59dd6f79782ec6f1873617 branch: master author: Victor Stinner committer: GitHub date: 2019-05-17T03:15:12+02:00 summary: bpo-36763: Cleanup precmdline in _PyCoreConfig_Read() (GH-13371) precmdline is only needed in _PyCoreConfig_Read(), not in config_read_cmdline(). Reorganize _PyCoreConfig_Read(). files: M Include/internal/pycore_getopt.h M Python/coreconfig.c M Python/getopt.c M Python/preconfig.c diff --git a/Include/internal/pycore_getopt.h b/Include/internal/pycore_getopt.h index 834b8c8a1409..7f0dd13ae577 100644 --- a/Include/internal/pycore_getopt.h +++ b/Include/internal/pycore_getopt.h @@ -17,6 +17,6 @@ typedef struct { int val; } _PyOS_LongOption; -extern int _PyOS_GetOpt(Py_ssize_t argc, wchar_t **argv, int *longindex); +extern int _PyOS_GetOpt(Py_ssize_t argc, wchar_t * const *argv, int *longindex); #endif /* !Py_INTERNAL_PYGETOPT_H */ diff --git a/Python/coreconfig.c b/Python/coreconfig.c index e51bf9424a30..ce778a640d3c 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1486,21 +1486,11 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) static _PyInitError -config_read(_PyCoreConfig *config, _PyPreCmdline *cmdline) +config_read(_PyCoreConfig *config) { _PyInitError err; const _PyPreConfig *preconfig = &_PyRuntime.preconfig; - if (_PyPreCmdline_SetCoreConfig(cmdline, config) < 0) { - return _Py_INIT_NO_MEMORY(); - } - - if (config->isolated > 0) { - /* _PyPreCmdline_Read() sets use_environment to 0 if isolated is set, - _PyPreCmdline_SetCoreConfig() overrides config->use_environment. */ - config->user_site_directory = 0; - } - if (config->use_environment) { err = config_read_env_vars(config); if (_Py_INIT_FAILED(err)) { @@ -1584,6 +1574,19 @@ config_read(_PyCoreConfig *config, _PyPreCmdline *cmdline) return _Py_INIT_NO_MEMORY(); } } + + if (config->check_hash_pycs_mode == NULL) { + err = _PyCoreConfig_SetString(&config->check_hash_pycs_mode, + L"default"); + if (_Py_INIT_FAILED(err)) { + return err; + } + } + + if (config->configure_c_stdio < 0) { + config->configure_c_stdio = 1; + } + return _Py_INIT_OK(); } @@ -1669,11 +1672,11 @@ config_usage(int error, const wchar_t* program) /* Parse the command line arguments */ static _PyInitError -config_parse_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline, - _PyWstrList *warnoptions, int *opt_index) +config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, + int *opt_index) { _PyInitError err; - const _PyWstrList *argv = &precmdline->argv; + const _PyWstrList *argv = &config->argv; int print_version = 0; _PyOS_ResetGetOpt(); @@ -1890,9 +1893,9 @@ config_init_env_warnoptions(const _PyCoreConfig *config, _PyWstrList *warnoption static _PyInitError -config_init_program(_PyCoreConfig *config, const _PyPreCmdline *cmdline) +config_init_program(_PyCoreConfig *config) { - const _PyWstrList *argv = &cmdline->argv; + const _PyWstrList *argv = &config->argv; wchar_t *program; if (argv->length >= 1) { program = argv->items[0]; @@ -1987,10 +1990,9 @@ config_init_warnoptions(_PyCoreConfig *config, static _PyInitError -config_update_argv(_PyCoreConfig *config, const _PyPreCmdline *cmdline, - int opt_index) +config_update_argv(_PyCoreConfig *config, int opt_index) { - const _PyWstrList *cmdline_argv = &cmdline->argv; + const _PyWstrList *cmdline_argv = &config->argv; _PyWstrList config_argv = _PyWstrList_INIT; /* Copy argv to be able to modify it (to force -c/-m) */ @@ -2054,6 +2056,16 @@ core_read_precmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) _PyCoreConfig_GetCoreConfig(&preconfig, config); err = _PyPreCmdline_Read(precmdline, &preconfig); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + if (_PyPreCmdline_SetCoreConfig(precmdline, config) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + + err = _Py_INIT_OK(); done: _PyPreConfig_Clear(&preconfig); @@ -2062,7 +2074,7 @@ core_read_precmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) static _PyInitError -config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) +config_read_cmdline(_PyCoreConfig *config) { _PyInitError err; _PyWstrList cmdline_warnoptions = _PyWstrList_INIT; @@ -2071,29 +2083,27 @@ config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) if (config->parse_argv < 0) { config->parse_argv = 1; } - if (config->configure_c_stdio < 0) { - config->configure_c_stdio = 1; + + if (config->program == NULL) { + err = config_init_program(config); + if (_Py_INIT_FAILED(err)) { + goto done; + } } if (config->parse_argv) { int opt_index; - err = config_parse_cmdline(config, precmdline, &cmdline_warnoptions, - &opt_index); + err = config_parse_cmdline(config, &cmdline_warnoptions, &opt_index); if (_Py_INIT_FAILED(err)) { goto done; } - err = config_update_argv(config, precmdline, opt_index); + err = config_update_argv(config, opt_index); if (_Py_INIT_FAILED(err)) { goto done; } } - err = config_read(config, precmdline); - if (_Py_INIT_FAILED(err)) { - goto done; - } - if (config->use_environment) { err = config_init_env_warnoptions(config, &env_warnoptions); if (_Py_INIT_FAILED(err)) { @@ -2107,13 +2117,6 @@ config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) goto done; } - if (config->check_hash_pycs_mode == NULL) { - err = _PyCoreConfig_SetString(&config->check_hash_pycs_mode, L"default"); - if (_Py_INIT_FAILED(err)) { - goto done; - } - } - err = _Py_INIT_OK(); done: @@ -2199,14 +2202,18 @@ _PyCoreConfig_Read(_PyCoreConfig *config) goto done; } - if (config->program == NULL) { - err = config_init_program(config, &precmdline); - if (_Py_INIT_FAILED(err)) { - goto done; - } + assert(config->isolated >= 0); + if (config->isolated) { + config->use_environment = 0; + config->user_site_directory = 0; + } + + err = config_read_cmdline(config); + if (_Py_INIT_FAILED(err)) { + goto done; } - err = config_read_cmdline(config, &precmdline); + err = config_read(config); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/getopt.c b/Python/getopt.c index 10bd1d49d7d1..1a7db3fce888 100644 --- a/Python/getopt.c +++ b/Python/getopt.c @@ -41,7 +41,7 @@ int _PyOS_opterr = 1; /* generate error messages */ Py_ssize_t _PyOS_optind = 1; /* index into argv array */ const wchar_t *_PyOS_optarg = NULL; /* optional argument */ -static wchar_t *opt_ptr = L""; +static const wchar_t *opt_ptr = L""; /* Python command line short and long options */ @@ -61,7 +61,7 @@ void _PyOS_ResetGetOpt(void) opt_ptr = L""; } -int _PyOS_GetOpt(Py_ssize_t argc, wchar_t **argv, int *longindex) +int _PyOS_GetOpt(Py_ssize_t argc, wchar_t * const *argv, int *longindex) { wchar_t *ptr; wchar_t option; diff --git a/Python/preconfig.c b/Python/preconfig.c index 48b9e8383aae..2d0ace5df295 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -174,7 +174,7 @@ _PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config) static _PyInitError precmdline_parse_cmdline(_PyPreCmdline *cmdline) { - _PyWstrList *argv = &cmdline->argv; + const _PyWstrList *argv = &cmdline->argv; _PyOS_ResetGetOpt(); /* Don't log parsing errors into stderr here: _PyCoreConfig_Read() From webhook-mailer at python.org Fri May 17 03:13:27 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Fri, 17 May 2019 07:13:27 -0000 Subject: [Python-checkins] bpo-36946: Fix possible signed integer overflow when handling slices. (GH-13375) Message-ID: https://github.com/python/cpython/commit/14514d9084a40f599c57da853a305aa264562a43 commit: 14514d9084a40f599c57da853a305aa264562a43 branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-05-17T10:13:03+03:00 summary: bpo-36946: Fix possible signed integer overflow when handling slices. (GH-13375) The final addition (cur += step) may overflow, so use size_t for "cur". "cur" is always positive (even for negative steps), so it is safe to use size_t here. Co-Authored-By: Martin Panter files: A Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst M Lib/ctypes/test/test_arrays.py M Lib/test/seq_tests.py M Lib/test/string_tests.py M Lib/test/test_array.py M Lib/test/test_bytes.py M Lib/test/test_mmap.py M Modules/_ctypes/_ctypes.c M Modules/_elementtree.c M Modules/arraymodule.c M Modules/mmapmodule.c M Objects/bytearrayobject.c M Objects/bytesobject.c M Objects/tupleobject.c M Objects/unicodeobject.c diff --git a/Lib/ctypes/test/test_arrays.py b/Lib/ctypes/test/test_arrays.py index 0fc5d7ebf841..87ecbf04e7ed 100644 --- a/Lib/ctypes/test/test_arrays.py +++ b/Lib/ctypes/test/test_arrays.py @@ -69,6 +69,17 @@ def test_simple(self): from operator import delitem self.assertRaises(TypeError, delitem, ca, 0) + def test_step_overflow(self): + a = (c_int * 5)() + a[3::sys.maxsize] = (1,) + self.assertListEqual(a[3::sys.maxsize], [1]) + a = (c_char * 5)() + a[3::sys.maxsize] = b"A" + self.assertEqual(a[3::sys.maxsize], b"A") + a = (c_wchar * 5)() + a[3::sys.maxsize] = u"X" + self.assertEqual(a[3::sys.maxsize], u"X") + def test_numeric_arrays(self): alen = 5 diff --git a/Lib/test/seq_tests.py b/Lib/test/seq_tests.py index 6aedd2be94db..65b110ef7818 100644 --- a/Lib/test/seq_tests.py +++ b/Lib/test/seq_tests.py @@ -209,6 +209,7 @@ def test_getslice(self): a = self.type2test([0,1,2,3,4]) self.assertEqual(a[ -pow(2,128): 3 ], self.type2test([0,1,2])) self.assertEqual(a[ 3: pow(2,145) ], self.type2test([3,4])) + self.assertEqual(a[3::sys.maxsize], self.type2test([3])) def test_contains(self): u = self.type2test([0, 1, 2]) diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index 836a43b81dd6..38da941f7f50 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -1135,7 +1135,7 @@ def test_slice(self): def test_extended_getslice(self): # Test extended slicing by comparing with list slicing. s = string.ascii_letters + string.digits - indices = (0, None, 1, 3, 41, -1, -2, -37) + indices = (0, None, 1, 3, 41, sys.maxsize, -1, -2, -37) for start in indices: for stop in indices: # Skip step 0 (invalid) diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 57c396d610b7..c2439579e8ee 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -746,7 +746,7 @@ def test_extended_getslice(self): # Test extended slicing by comparing with list slicing # (Assumes list conversion works correctly, too) a = array.array(self.typecode, self.example) - indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) + indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100) for start in indices: for stop in indices: # Everything except the initial 0 (invalid step) @@ -844,7 +844,7 @@ def test_setslice(self): self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b) def test_extended_set_del_slice(self): - indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) + indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100) for start in indices: for stop in indices: # Everything except the initial 0 (invalid step) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index a0913603e737..9502a8f974bd 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -285,7 +285,7 @@ def test_extended_getslice(self): # Test extended slicing by comparing with list slicing. L = list(range(255)) b = self.type2test(L) - indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) + indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100) for start in indices: for stop in indices: # Skip step 0 (invalid) @@ -1242,7 +1242,8 @@ def test_del_expand(self): self.assertLessEqual(sys.getsizeof(b), size) def test_extended_set_del_slice(self): - indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize, + -1, -2, -31, -300) for start in indices: for stop in indices: # Skip invalid step 0 diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index dd857a0632ae..495d24ad8077 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -439,7 +439,7 @@ def test_extended_getslice(self): m = mmap.mmap(-1, len(s)) m[:] = s self.assertEqual(m[:], s) - indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, sys.maxsize, -1, -2, -31, -300) for start in indices: for stop in indices: # Skip step 0 (invalid) @@ -451,7 +451,7 @@ def test_extended_set_del_slice(self): # Test extended slicing by comparing with list slicing. s = bytes(reversed(range(256))) m = mmap.mmap(-1, len(s)) - indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, sys.maxsize, -1, -2, -31, -300) for start in indices: for stop in indices: # Skip invalid step 0 diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst new file mode 100644 index 000000000000..aa5de80a2943 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst @@ -0,0 +1 @@ +Fix possible signed integer overflow when handling slices. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 13cf76a16d76..7b5115359ed7 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -4487,7 +4487,8 @@ Array_subscript(PyObject *myself, PyObject *item) StgDictObject *stgdict, *itemdict; PyObject *proto; PyObject *np; - Py_ssize_t start, stop, step, slicelen, cur, i; + Py_ssize_t start, stop, step, slicelen, i; + size_t cur; if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; @@ -4627,7 +4628,8 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value) return Array_ass_item(myself, i, value); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelen, otherlen, i, cur; + Py_ssize_t start, stop, step, slicelen, otherlen, i; + size_t cur; if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index f5fc4437deb5..b1fb3eeffb11 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1809,7 +1809,8 @@ element_subscr(PyObject* self_, PyObject* item) return element_getitem(self_, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelen, cur, i; + Py_ssize_t start, stop, step, slicelen, i; + size_t cur; PyObject* list; if (!self->extra) @@ -1861,7 +1862,8 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) return element_setitem(self_, i, value); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelen, newlen, cur, i; + Py_ssize_t start, stop, step, slicelen, newlen, i; + size_t cur; PyObject* recycle = NULL; PyObject* seq; diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 4be3beb29ccb..523afb99e8ae 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2343,7 +2343,8 @@ array_subscr(arrayobject* self, PyObject* item) return array_item(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject* result; arrayobject* ar; int itemsize = self->ob_descr->itemsize; @@ -2527,7 +2528,8 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) return 0; } else { - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; if (needed != slicelength) { PyErr_Format(PyExc_ValueError, diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 6ddbf70d9a97..33366b2d9331 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -806,7 +806,8 @@ mmap_subscript(mmap_object *self, PyObject *item) slicelen); else { char *result_buf = (char *)PyMem_Malloc(slicelen); - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; PyObject *result; if (result_buf == NULL) @@ -926,7 +927,8 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) memcpy(self->data + start, vbuf.buf, slicelen); } else { - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; for (cur = start, i = 0; i < slicelen; diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index eaf5dceb03a4..8d5ba540120f 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -410,7 +410,8 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index) return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i])); } else if (PySlice_Check(index)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; if (PySlice_Unpack(index, &start, &stop, &step) < 0) { return NULL; } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index b7c5b75283ee..ebbdb7c3c164 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1677,7 +1677,8 @@ bytes_subscript(PyBytesObject* self, PyObject* item) return PyLong_FromLong((unsigned char)self->ob_sval[i]); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; char* source_buf; char* result_buf; PyObject* result; diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 9f0fc1cc2c3f..dc1d0e5ad0d4 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -753,7 +753,8 @@ tuplesubscript(PyTupleObject* self, PyObject* item) return tupleitem(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject* result; PyObject* it; PyObject **src, **dest; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index eaba5836cb1c..0aa5e4ad18dd 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -13991,7 +13991,8 @@ unicode_subscript(PyObject* self, PyObject* item) i += PyUnicode_GET_LENGTH(self); return unicode_getitem(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject *result; void *src_data, *dest_data; int src_kind, dest_kind; From webhook-mailer at python.org Fri May 17 03:33:14 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 17 May 2019 07:33:14 -0000 Subject: [Python-checkins] bpo-36946: Fix possible signed integer overflow when handling slices. (GH-13375) Message-ID: https://github.com/python/cpython/commit/f02d1a43c6be658cd279edb90e8e96c99e1127e7 commit: f02d1a43c6be658cd279edb90e8e96c99e1127e7 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-17T00:33:10-07:00 summary: bpo-36946: Fix possible signed integer overflow when handling slices. (GH-13375) The final addition (cur += step) may overflow, so use size_t for "cur". "cur" is always positive (even for negative steps), so it is safe to use size_t here. Co-Authored-By: Martin Panter (cherry picked from commit 14514d9084a40f599c57da853a305aa264562a43) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst M Lib/ctypes/test/test_arrays.py M Lib/test/seq_tests.py M Lib/test/string_tests.py M Lib/test/test_array.py M Lib/test/test_bytes.py M Lib/test/test_mmap.py M Modules/_ctypes/_ctypes.c M Modules/_elementtree.c M Modules/arraymodule.c M Modules/mmapmodule.c M Objects/bytearrayobject.c M Objects/bytesobject.c M Objects/tupleobject.c M Objects/unicodeobject.c diff --git a/Lib/ctypes/test/test_arrays.py b/Lib/ctypes/test/test_arrays.py index ca271341ed9a..37719399e277 100644 --- a/Lib/ctypes/test/test_arrays.py +++ b/Lib/ctypes/test/test_arrays.py @@ -69,6 +69,17 @@ def test_simple(self): from operator import delitem self.assertRaises(TypeError, delitem, ca, 0) + def test_step_overflow(self): + a = (c_int * 5)() + a[3::sys.maxsize] = (1,) + self.assertListEqual(a[3::sys.maxsize], [1]) + a = (c_char * 5)() + a[3::sys.maxsize] = b"A" + self.assertEqual(a[3::sys.maxsize], b"A") + a = (c_wchar * 5)() + a[3::sys.maxsize] = u"X" + self.assertEqual(a[3::sys.maxsize], u"X") + def test_numeric_arrays(self): alen = 5 diff --git a/Lib/test/seq_tests.py b/Lib/test/seq_tests.py index 6aedd2be94db..65b110ef7818 100644 --- a/Lib/test/seq_tests.py +++ b/Lib/test/seq_tests.py @@ -209,6 +209,7 @@ def test_getslice(self): a = self.type2test([0,1,2,3,4]) self.assertEqual(a[ -pow(2,128): 3 ], self.type2test([0,1,2])) self.assertEqual(a[ 3: pow(2,145) ], self.type2test([3,4])) + self.assertEqual(a[3::sys.maxsize], self.type2test([3])) def test_contains(self): u = self.type2test([0, 1, 2]) diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index 561b09a2d5ee..329246d3307b 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -1135,7 +1135,7 @@ def test_slice(self): def test_extended_getslice(self): # Test extended slicing by comparing with list slicing. s = string.ascii_letters + string.digits - indices = (0, None, 1, 3, 41, -1, -2, -37) + indices = (0, None, 1, 3, 41, sys.maxsize, -1, -2, -37) for start in indices: for stop in indices: # Skip step 0 (invalid) diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index e9218f3dd68c..5fd0238f4fc3 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -745,7 +745,7 @@ def test_extended_getslice(self): # Test extended slicing by comparing with list slicing # (Assumes list conversion works correctly, too) a = array.array(self.typecode, self.example) - indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) + indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100) for start in indices: for stop in indices: # Everything except the initial 0 (invalid step) @@ -843,7 +843,7 @@ def test_setslice(self): self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b) def test_extended_set_del_slice(self): - indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) + indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100) for start in indices: for stop in indices: # Everything except the initial 0 (invalid step) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 274616bf998d..3387a1b118fe 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -283,7 +283,7 @@ def test_extended_getslice(self): # Test extended slicing by comparing with list slicing. L = list(range(255)) b = self.type2test(L) - indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) + indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100) for start in indices: for stop in indices: # Skip step 0 (invalid) @@ -1238,7 +1238,8 @@ def test_del_expand(self): self.assertLessEqual(sys.getsizeof(b), size) def test_extended_set_del_slice(self): - indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize, + -1, -2, -31, -300) for start in indices: for stop in indices: # Skip invalid step 0 diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 355af8cd5893..e6284cb98914 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -452,7 +452,7 @@ def test_extended_getslice(self): m = mmap.mmap(-1, len(s)) m[:] = s self.assertEqual(m[:], s) - indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, sys.maxsize, -1, -2, -31, -300) for start in indices: for stop in indices: # Skip step 0 (invalid) @@ -464,7 +464,7 @@ def test_extended_set_del_slice(self): # Test extended slicing by comparing with list slicing. s = bytes(reversed(range(256))) m = mmap.mmap(-1, len(s)) - indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) + indices = (0, None, 1, 3, 19, 300, sys.maxsize, -1, -2, -31, -300) for start in indices: for stop in indices: # Skip invalid step 0 diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst new file mode 100644 index 000000000000..aa5de80a2943 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst @@ -0,0 +1 @@ +Fix possible signed integer overflow when handling slices. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 153990309b7a..0692b458354c 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -4372,7 +4372,8 @@ Array_subscript(PyObject *myself, PyObject *item) StgDictObject *stgdict, *itemdict; PyObject *proto; PyObject *np; - Py_ssize_t start, stop, step, slicelen, cur, i; + Py_ssize_t start, stop, step, slicelen, i; + size_t cur; if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; @@ -4512,7 +4513,8 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value) return Array_ass_item(myself, i, value); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelen, otherlen, i, cur; + Py_ssize_t start, stop, step, slicelen, otherlen, i; + size_t cur; if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 79f1ccd68565..1b8f81234df4 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1771,7 +1771,8 @@ element_subscr(PyObject* self_, PyObject* item) return element_getitem(self_, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelen, cur, i; + Py_ssize_t start, stop, step, slicelen, i; + size_t cur; PyObject* list; if (!self->extra) @@ -1823,7 +1824,8 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) return element_setitem(self_, i, value); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelen, newlen, cur, i; + Py_ssize_t start, stop, step, slicelen, newlen, i; + size_t cur; PyObject* recycle = NULL; PyObject* seq; diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index ee7ae54661b3..e6175e7dd904 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2343,7 +2343,8 @@ array_subscr(arrayobject* self, PyObject* item) return array_item(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject* result; arrayobject* ar; int itemsize = self->ob_descr->itemsize; @@ -2527,7 +2528,8 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) return 0; } else { - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; if (needed != slicelength) { PyErr_Format(PyExc_ValueError, diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index f957e2c45ef5..223afacf3140 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -790,7 +790,8 @@ mmap_subscript(mmap_object *self, PyObject *item) slicelen); else { char *result_buf = (char *)PyMem_Malloc(slicelen); - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; PyObject *result; if (result_buf == NULL) @@ -910,7 +911,8 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) memcpy(self->data + start, vbuf.buf, slicelen); } else { - Py_ssize_t cur, i; + size_t cur; + Py_ssize_t i; for (cur = start, i = 0; i < slicelen; diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 3f3e6bcf0cb8..8a0994ffa4ab 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -420,7 +420,8 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index) return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i])); } else if (PySlice_Check(index)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; if (PySlice_Unpack(index, &start, &stop, &step) < 0) { return NULL; } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index a5319da48daa..b4ba1a01ab16 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1673,7 +1673,8 @@ bytes_subscript(PyBytesObject* self, PyObject* item) return PyLong_FromLong((unsigned char)self->ob_sval[i]); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; char* source_buf; char* result_buf; PyObject* result; diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 9bb91a5e65a0..7ee06e20e4a9 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -730,7 +730,8 @@ tuplesubscript(PyTupleObject* self, PyObject* item) return tupleitem(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject* result; PyObject* it; PyObject **src, **dest; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index e18937981bb7..ed1e4a4dd556 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -13989,7 +13989,8 @@ unicode_subscript(PyObject* self, PyObject* item) i += PyUnicode_GET_LENGTH(self); return unicode_getitem(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject *result; void *src_data, *dest_data; int src_kind, dest_kind; From webhook-mailer at python.org Fri May 17 04:29:01 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 17 May 2019 08:29:01 -0000 Subject: [Python-checkins] bpo-35545: Fix asyncio discarding IPv6 scopes (GH-11271) Message-ID: https://github.com/python/cpython/commit/ac8eb8f36bf7ca636f8d886eb65a3b532f4725d5 commit: ac8eb8f36bf7ca636f8d886eb65a3b532f4725d5 branch: master author: Erwan Le Pape committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-17T01:28:39-07:00 summary: bpo-35545: Fix asyncio discarding IPv6 scopes (GH-11271) This PR proposes a solution to [bpo-35545](https://bugs.python.org/issue35545) by adding an optional `flowinfo` and `scopeid` to `asyncio.base_events._ipaddr_info` to carry the full address information into `_ipaddr_info` and avoid discarding IPv6 specific information. Changelog entry & regression tests to come. https://bugs.python.org/issue35545 files: A Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst M Lib/asyncio/base_events.py M Lib/test/test_asyncio/test_base_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 9613ac2a114f..de9fa4f4f7f3 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -102,7 +102,7 @@ def _set_reuseport(sock): 'SO_REUSEPORT defined but not implemented.') -def _ipaddr_info(host, port, family, type, proto): +def _ipaddr_info(host, port, family, type, proto, flowinfo=0, scopeid=0): # Try to skip getaddrinfo if "host" is already an IP. Users might have # handled name resolution in their own code and pass in resolved IPs. if not hasattr(socket, 'inet_pton'): @@ -151,7 +151,7 @@ def _ipaddr_info(host, port, family, type, proto): socket.inet_pton(af, host) # The host has already been resolved. if _HAS_IPv6 and af == socket.AF_INET6: - return af, type, proto, '', (host, port, 0, 0) + return af, type, proto, '', (host, port, flowinfo, scopeid) else: return af, type, proto, '', (host, port) except OSError: @@ -1348,7 +1348,7 @@ def _check_sendfile_params(self, sock, file, offset, count): family=0, type=socket.SOCK_STREAM, proto=0, flags=0, loop): host, port = address[:2] - info = _ipaddr_info(host, port, family, type, proto) + info = _ipaddr_info(host, port, family, type, proto, *address[2:]) if info is not None: # "host" is already a resolved IP. return [info] diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 27e21b33d360..f068fc781f5d 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1299,6 +1299,28 @@ def _test_create_connection_ip_addr(self, m_socket, allow_inet_pton): t.close() test_utils.run_briefly(self.loop) # allow transport to close + @patch_socket + def test_create_connection_ipv6_scope(self, m_socket): + m_socket.getaddrinfo = socket.getaddrinfo + sock = m_socket.socket.return_value + sock.family = socket.AF_INET6 + + self.loop._add_reader = mock.Mock() + self.loop._add_reader._is_coroutine = False + self.loop._add_writer = mock.Mock() + self.loop._add_writer._is_coroutine = False + + coro = self.loop.create_connection(asyncio.Protocol, 'fe80::1%1', 80) + t, p = self.loop.run_until_complete(coro) + try: + sock.connect.assert_called_with(('fe80::1', 80, 0, 1)) + _, kwargs = m_socket.socket.call_args + self.assertEqual(kwargs['family'], m_socket.AF_INET6) + self.assertEqual(kwargs['type'], m_socket.SOCK_STREAM) + finally: + t.close() + test_utils.run_briefly(self.loop) # allow transport to close + @patch_socket def test_create_connection_ip_addr(self, m_socket): self._test_create_connection_ip_addr(m_socket, True) diff --git a/Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst b/Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst new file mode 100644 index 000000000000..f4349afefcd8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst @@ -0,0 +1,2 @@ +Fix asyncio discarding IPv6 scopes when ensuring hostname resolutions +internally From webhook-mailer at python.org Fri May 17 04:50:17 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Fri, 17 May 2019 08:50:17 -0000 Subject: [Python-checkins] Doc: Add link threading.settrace to sys.settrace (GH-13345) Message-ID: https://github.com/python/cpython/commit/245f528a92d7748dbd7acf9cba860153c143bbfe commit: 245f528a92d7748dbd7acf9cba860153c143bbfe branch: master author: Stefan Hoelzl committer: St?phane Wirtel date: 2019-05-17T10:50:03+02:00 summary: Doc: Add link threading.settrace to sys.settrace (GH-13345) files: M Doc/library/sys.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 591972e9b783..5039ffa933ac 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1204,8 +1204,8 @@ always available. Set the system's trace function, which allows you to implement a Python source code debugger in Python. The function is thread-specific; for a - debugger to support multiple threads, it must be registered using - :func:`settrace` for each thread being debugged. + debugger to support multiple threads, it must register a trace function using + :func:`settrace` for each thread being debugged or use :func:`threading.settrace`. Trace functions should have three arguments: *frame*, *event*, and *arg*. *frame* is the current stack frame. *event* is a string: ``'call'``, From webhook-mailer at python.org Fri May 17 05:02:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 17 May 2019 09:02:57 -0000 Subject: [Python-checkins] Doc: Add link threading.settrace to sys.settrace (GH-13345) Message-ID: https://github.com/python/cpython/commit/4be0720beb1b4ea778c943c4cb1b6a514e08753d commit: 4be0720beb1b4ea778c943c4cb1b6a514e08753d branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-17T02:02:51-07:00 summary: Doc: Add link threading.settrace to sys.settrace (GH-13345) (cherry picked from commit 245f528a92d7748dbd7acf9cba860153c143bbfe) Co-authored-by: Stefan Hoelzl files: M Doc/library/sys.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index c2c653e00beb..9a8c2ca0c5d0 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1171,8 +1171,8 @@ always available. Set the system's trace function, which allows you to implement a Python source code debugger in Python. The function is thread-specific; for a - debugger to support multiple threads, it must be registered using - :func:`settrace` for each thread being debugged. + debugger to support multiple threads, it must register a trace function using + :func:`settrace` for each thread being debugged or use :func:`threading.settrace`. Trace functions should have three arguments: *frame*, *event*, and *arg*. *frame* is the current stack frame. *event* is a string: ``'call'``, From webhook-mailer at python.org Fri May 17 05:05:26 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 17 May 2019 09:05:26 -0000 Subject: [Python-checkins] bpo-35545: Fix asyncio discarding IPv6 scopes (GH-11271) Message-ID: https://github.com/python/cpython/commit/94704048e2467dbb4c53ca02d103eab5671e84b3 commit: 94704048e2467dbb4c53ca02d103eab5671e84b3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-17T02:05:19-07:00 summary: bpo-35545: Fix asyncio discarding IPv6 scopes (GH-11271) This PR proposes a solution to [bpo-35545](https://bugs.python.org/issue35545) by adding an optional `flowinfo` and `scopeid` to `asyncio.base_events._ipaddr_info` to carry the full address information into `_ipaddr_info` and avoid discarding IPv6 specific information. Changelog entry & regression tests to come. https://bugs.python.org/issue35545 (cherry picked from commit ac8eb8f36bf7ca636f8d886eb65a3b532f4725d5) Co-authored-by: Erwan Le Pape files: A Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst M Lib/asyncio/base_events.py M Lib/test/test_asyncio/test_base_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 1252e9dda4ac..7bd20bbf006b 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -96,7 +96,7 @@ def _set_reuseport(sock): 'SO_REUSEPORT defined but not implemented.') -def _ipaddr_info(host, port, family, type, proto): +def _ipaddr_info(host, port, family, type, proto, flowinfo=0, scopeid=0): # Try to skip getaddrinfo if "host" is already an IP. Users might have # handled name resolution in their own code and pass in resolved IPs. if not hasattr(socket, 'inet_pton'): @@ -145,7 +145,7 @@ def _ipaddr_info(host, port, family, type, proto): socket.inet_pton(af, host) # The host has already been resolved. if _HAS_IPv6 and af == socket.AF_INET6: - return af, type, proto, '', (host, port, 0, 0) + return af, type, proto, '', (host, port, flowinfo, scopeid) else: return af, type, proto, '', (host, port) except OSError: @@ -1271,7 +1271,7 @@ def _check_sendfile_params(self, sock, file, offset, count): family=0, type=socket.SOCK_STREAM, proto=0, flags=0, loop): host, port = address[:2] - info = _ipaddr_info(host, port, family, type, proto) + info = _ipaddr_info(host, port, family, type, proto, *address[2:]) if info is not None: # "host" is already a resolved IP. return [info] diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 24d3356d159b..178ffa69d4a3 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1292,6 +1292,28 @@ def _test_create_connection_ip_addr(self, m_socket, allow_inet_pton): t.close() test_utils.run_briefly(self.loop) # allow transport to close + @patch_socket + def test_create_connection_ipv6_scope(self, m_socket): + m_socket.getaddrinfo = socket.getaddrinfo + sock = m_socket.socket.return_value + sock.family = socket.AF_INET6 + + self.loop._add_reader = mock.Mock() + self.loop._add_reader._is_coroutine = False + self.loop._add_writer = mock.Mock() + self.loop._add_writer._is_coroutine = False + + coro = self.loop.create_connection(asyncio.Protocol, 'fe80::1%1', 80) + t, p = self.loop.run_until_complete(coro) + try: + sock.connect.assert_called_with(('fe80::1', 80, 0, 1)) + _, kwargs = m_socket.socket.call_args + self.assertEqual(kwargs['family'], m_socket.AF_INET6) + self.assertEqual(kwargs['type'], m_socket.SOCK_STREAM) + finally: + t.close() + test_utils.run_briefly(self.loop) # allow transport to close + @patch_socket def test_create_connection_ip_addr(self, m_socket): self._test_create_connection_ip_addr(m_socket, True) diff --git a/Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst b/Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst new file mode 100644 index 000000000000..f4349afefcd8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst @@ -0,0 +1,2 @@ +Fix asyncio discarding IPv6 scopes when ensuring hostname resolutions +internally From webhook-mailer at python.org Fri May 17 05:12:16 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 09:12:16 -0000 Subject: [Python-checkins] bpo-36763: Remove _PyCoreConfig.program (GH-13373) Message-ID: https://github.com/python/cpython/commit/fed02e15b39b6f1521ea21654be5fc0757a8720a commit: fed02e15b39b6f1521ea21654be5fc0757a8720a branch: master author: Victor Stinner committer: GitHub date: 2019-05-17T11:12:09+02:00 summary: bpo-36763: Remove _PyCoreConfig.program (GH-13373) Use _PyCoreConfig.program_name instead. files: M Include/cpython/coreconfig.h M Lib/test/test_embed.py M Modules/main.c M Programs/_testembed.c M Python/coreconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index b531118ea3cf..1ba2663c9667 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -218,11 +218,15 @@ typedef struct { always exists and is never empty. */ _PyWstrList argv; - /* Program: argv[0] or "". - Used to display Python usage if parsing command line arguments fails. - Used to initialize the default value of program_name */ - wchar_t *program; - wchar_t *program_name; /* Program name, see also Py_GetProgramName() */ + /* Program name: + + - If Py_SetProgramName() was called, use its value. + - On macOS, use PYTHONEXECUTABLE environment variable if set. + - If WITH_NEXT_FRAMEWORK macro is defined, use __PYVENV_LAUNCHER__ + environment variable is set. + - Use argv[0] if available and non-empty. + - Use "python" on Windows, or "python3 on other platforms. */ + wchar_t *program_name; _PyWstrList xoptions; /* Command line -X options */ _PyWstrList warnoptions; /* Warnings options */ diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index b1872ace8a60..4012a389d750 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -306,7 +306,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'program_name': GET_DEFAULT_CONFIG, 'parse_argv': 1, 'argv': [""], - 'program': '', 'xoptions': [], 'warnoptions': [], @@ -586,7 +585,6 @@ def test_init_from_config(self): 'pycache_prefix': 'conf_pycache_prefix', 'program_name': './conf_program_name', 'argv': ['-c', 'arg2'], - 'program': 'conf_program', 'xoptions': ['core_xoption1=3', 'core_xoption2=', 'core_xoption3'], 'warnoptions': ['error::ResourceWarning', 'default::BytesWarning'], 'run_command': 'pass\n', @@ -704,7 +702,6 @@ def test_init_run_main(self): 'print(json.dumps(_testinternalcapi.get_configs()))') core_config = { 'argv': ['-c', 'arg2'], - 'program': 'python3', 'program_name': './python3', 'run_command': code + '\n', } @@ -716,7 +713,6 @@ def test_init_main(self): 'print(json.dumps(_testinternalcapi.get_configs()))') core_config = { 'argv': ['-c', 'arg2'], - 'program': 'python3', 'program_name': './python3', 'run_command': code + '\n', '_init_main': 0, @@ -728,7 +724,6 @@ def test_init_dont_parse_argv(self): core_config = { 'argv': ['-v', '-c', 'arg1', '-W', 'arg2'], 'parse_argv': 0, - 'program': 'program', } self.check_config("init_dont_parse_argv", core_config, {}) diff --git a/Modules/main.c b/Modules/main.c index b47ac70d62cf..bb103c28a3e2 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -283,7 +283,7 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) else cfilename = ""; fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n", - config->program, cfilename, err, strerror(err)); + config->program_name, cfilename, err, strerror(err)); PyMem_RawFree(cfilename_buffer); return 2; } @@ -303,7 +303,7 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) if (_Py_fstat_noraise(fileno(fp), &sb) == 0 && S_ISDIR(sb.st_mode)) { fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", - config->program, filename); + config->program_name, filename); fclose(fp); return 1; } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 87d159fe7219..b1b7c6e0ffc3 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -433,8 +433,6 @@ static int test_init_from_config(void) config.argv.length = Py_ARRAY_LENGTH(argv); config.argv.items = argv; - config.program = L"conf_program"; - static wchar_t* xoptions[3] = { L"core_xoption1=3", L"core_xoption2=", @@ -532,7 +530,6 @@ static int test_init_dont_parse_argv(void) L"arg2", }; - config.program = L"program"; config.program_name = L"./_testembed"; config.argv.length = Py_ARRAY_LENGTH(argv); diff --git a/Python/coreconfig.c b/Python/coreconfig.c index ce778a640d3c..c20ae2151c9c 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -492,7 +492,6 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) CLEAR(config->module_search_path_env); CLEAR(config->home); CLEAR(config->program_name); - CLEAR(config->program); _PyWstrList_Clear(&config->argv); _PyWstrList_Clear(&config->warnoptions); @@ -626,7 +625,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_WSTR_ATTR(module_search_path_env); COPY_WSTR_ATTR(home); COPY_WSTR_ATTR(program_name); - COPY_WSTR_ATTR(program); COPY_ATTR(parse_argv); COPY_WSTRLIST(argv); @@ -732,7 +730,6 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_WSTR(program_name); SET_ITEM_INT(parse_argv); SET_ITEM_WSTRLIST(argv); - SET_ITEM_WSTR(program); SET_ITEM_WSTRLIST(xoptions); SET_ITEM_WSTRLIST(warnoptions); SET_ITEM_WSTR(module_search_path_env); @@ -918,7 +915,6 @@ static _PyInitError config_init_program_name(_PyCoreConfig *config) { _PyInitError err; - assert(config->program_name == NULL); /* If Py_SetProgramName() was called, use its value */ const wchar_t *program_name = _Py_path_config.program_name; @@ -967,16 +963,17 @@ config_init_program_name(_PyCoreConfig *config) #endif /* WITH_NEXT_FRAMEWORK */ #endif /* __APPLE__ */ - /* Use argv[0] by default, if available */ - if (config->program != NULL) { - err = _PyCoreConfig_SetString(&config->program_name, config->program); - if (_Py_INIT_FAILED(err)) { - return err; + /* Use argv[0] if available and non-empty */ + const _PyWstrList *argv = &config->argv; + if (argv->length >= 1 && argv->items[0][0] != L'\0') { + config->program_name = _PyMem_RawWcsdup(argv->items[0]); + if (config->program_name == NULL) { + return _Py_INIT_NO_MEMORY(); } return _Py_INIT_OK(); } - /* Last fall back: hardcoded string */ + /* Last fall back: hardcoded name */ #ifdef MS_WINDOWS const wchar_t *default_program_name = L"python"; #else @@ -1518,13 +1515,6 @@ config_read(_PyCoreConfig *config) } } - if (config->program_name == NULL) { - err = config_init_program_name(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - if (config->executable == NULL) { err = config_init_executable(config); if (_Py_INIT_FAILED(err)) { @@ -1678,6 +1668,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, _PyInitError err; const _PyWstrList *argv = &config->argv; int print_version = 0; + const wchar_t* program = config->program_name; _PyOS_ResetGetOpt(); do { @@ -1734,7 +1725,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, } else { fprintf(stderr, "--check-hash-based-pycs must be one of " "'default', 'always', or 'never'\n"); - config_usage(1, config->program); + config_usage(1, program); return _Py_INIT_EXIT(2); } break; @@ -1794,7 +1785,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, case 'h': case '?': - config_usage(0, config->program); + config_usage(0, program); return _Py_INIT_EXIT(0); case 'V': @@ -1819,7 +1810,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, default: /* unknown argument: parsing failed */ - config_usage(1, config->program); + config_usage(1, program); return _Py_INIT_EXIT(2); } } while (1); @@ -1892,26 +1883,6 @@ config_init_env_warnoptions(const _PyCoreConfig *config, _PyWstrList *warnoption } -static _PyInitError -config_init_program(_PyCoreConfig *config) -{ - const _PyWstrList *argv = &config->argv; - wchar_t *program; - if (argv->length >= 1) { - program = argv->items[0]; - } - else { - program = L""; - } - config->program = _PyMem_RawWcsdup(program); - if (config->program == NULL) { - return _Py_INIT_NO_MEMORY(); - } - - return _Py_INIT_OK(); -} - - static int config_add_warnoption(_PyCoreConfig *config, const wchar_t *option) { @@ -2084,10 +2055,10 @@ config_read_cmdline(_PyCoreConfig *config) config->parse_argv = 1; } - if (config->program == NULL) { - err = config_init_program(config); + if (config->program_name == NULL) { + err = config_init_program_name(config); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } } @@ -2218,6 +2189,8 @@ _PyCoreConfig_Read(_PyCoreConfig *config) goto done; } + /* precmdline.argv is a copy of config.argv which is modified + by config_read_cmdline() */ const _PyWstrList *argv = &precmdline.argv; if (_Py_SetArgcArgv(argv->length, argv->items) < 0) { err = _Py_INIT_NO_MEMORY(); @@ -2246,7 +2219,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config) assert(config->configure_c_stdio >= 0); assert(config->buffered_stdio >= 0); assert(config->program_name != NULL); - assert(config->program != NULL); assert(_PyWstrList_CheckConsistency(&config->argv)); /* sys.argv must be non-empty: empty argv is replaced with [''] */ assert(config->argv.length >= 1); From webhook-mailer at python.org Fri May 17 05:55:41 2019 From: webhook-mailer at python.org (Kushal Das) Date: Fri, 17 May 2019 09:55:41 -0000 Subject: [Python-checkins] Doc: Replace the deprecated highlightlang directive by highlight. (#13377) Message-ID: https://github.com/python/cpython/commit/cbb6484573ae2058e55614b28d73b0c8478f9a70 commit: cbb6484573ae2058e55614b28d73b0c8478f9a70 branch: master author: St?phane Wirtel committer: Kushal Das date: 2019-05-17T15:25:34+05:30 summary: Doc: Replace the deprecated highlightlang directive by highlight. (#13377) highlightlang is deprecated since April 2018 in Sphinx. See https://github.com/sphinx-doc/sphinx/pull/4845 files: M Doc/c-api/abstract.rst M Doc/c-api/allocation.rst M Doc/c-api/apiabiversion.rst M Doc/c-api/arg.rst M Doc/c-api/bool.rst M Doc/c-api/buffer.rst M Doc/c-api/bytearray.rst M Doc/c-api/bytes.rst M Doc/c-api/capsule.rst M Doc/c-api/cell.rst M Doc/c-api/code.rst M Doc/c-api/complex.rst M Doc/c-api/concrete.rst M Doc/c-api/contextvars.rst M Doc/c-api/conversion.rst M Doc/c-api/coro.rst M Doc/c-api/datetime.rst M Doc/c-api/descriptor.rst M Doc/c-api/dict.rst M Doc/c-api/exceptions.rst M Doc/c-api/file.rst M Doc/c-api/float.rst M Doc/c-api/function.rst M Doc/c-api/gcsupport.rst M Doc/c-api/gen.rst M Doc/c-api/import.rst M Doc/c-api/init.rst M Doc/c-api/intro.rst M Doc/c-api/iter.rst M Doc/c-api/iterator.rst M Doc/c-api/list.rst M Doc/c-api/long.rst M Doc/c-api/mapping.rst M Doc/c-api/marshal.rst M Doc/c-api/memory.rst M Doc/c-api/memoryview.rst M Doc/c-api/method.rst M Doc/c-api/module.rst M Doc/c-api/none.rst M Doc/c-api/number.rst M Doc/c-api/objbuffer.rst M Doc/c-api/object.rst M Doc/c-api/objimpl.rst M Doc/c-api/refcounting.rst M Doc/c-api/reflection.rst M Doc/c-api/sequence.rst M Doc/c-api/set.rst M Doc/c-api/slice.rst M Doc/c-api/stable.rst M Doc/c-api/structures.rst M Doc/c-api/sys.rst M Doc/c-api/tuple.rst M Doc/c-api/type.rst M Doc/c-api/typeobj.rst M Doc/c-api/unicode.rst M Doc/c-api/utilities.rst M Doc/c-api/veryhigh.rst M Doc/c-api/weakref.rst M Doc/extending/building.rst M Doc/extending/embedding.rst M Doc/extending/extending.rst M Doc/extending/newtypes.rst M Doc/extending/newtypes_tutorial.rst M Doc/extending/windows.rst M Doc/faq/windows.rst M Doc/howto/clinic.rst M Doc/howto/cporting.rst M Doc/install/index.rst M Doc/installing/index.rst M Doc/library/site.rst M Doc/license.rst M Doc/using/cmdline.rst M Doc/using/unix.rst M Doc/using/windows.rst diff --git a/Doc/c-api/abstract.rst b/Doc/c-api/abstract.rst index ad538811127d..0edd1d5f6240 100644 --- a/Doc/c-api/abstract.rst +++ b/Doc/c-api/abstract.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _abstract: diff --git a/Doc/c-api/allocation.rst b/Doc/c-api/allocation.rst index 25a867f139cc..8e8a92003c5a 100644 --- a/Doc/c-api/allocation.rst +++ b/Doc/c-api/allocation.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _allocating-objects: diff --git a/Doc/c-api/apiabiversion.rst b/Doc/c-api/apiabiversion.rst index 890a03839319..b8a8f2ff8862 100644 --- a/Doc/c-api/apiabiversion.rst +++ b/Doc/c-api/apiabiversion.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _apiabiversion: diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index b41130ede416..ba9ca5e0d30b 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _arg-parsing: diff --git a/Doc/c-api/bool.rst b/Doc/c-api/bool.rst index a9fb342f7c0f..ce8de6e22f44 100644 --- a/Doc/c-api/bool.rst +++ b/Doc/c-api/bool.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _boolobjects: diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index c7c1e3cc745a..72d965053cfd 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. index:: single: buffer protocol diff --git a/Doc/c-api/bytearray.rst b/Doc/c-api/bytearray.rst index 41b6e3c71be5..b4a9660a9169 100644 --- a/Doc/c-api/bytearray.rst +++ b/Doc/c-api/bytearray.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _bytearrayobjects: diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index 5b9ebf6b6af5..9a62fb682d68 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _bytesobjects: diff --git a/Doc/c-api/capsule.rst b/Doc/c-api/capsule.rst index 8eb6695e22de..3c921bbde348 100644 --- a/Doc/c-api/capsule.rst +++ b/Doc/c-api/capsule.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _capsules: diff --git a/Doc/c-api/cell.rst b/Doc/c-api/cell.rst index 427259cc24d8..8514afe928e7 100644 --- a/Doc/c-api/cell.rst +++ b/Doc/c-api/cell.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _cell-objects: diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 10d89f297c84..27d3f76d7a3d 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _codeobjects: diff --git a/Doc/c-api/complex.rst b/Doc/c-api/complex.rst index fc63b57a8552..675bd013e892 100644 --- a/Doc/c-api/complex.rst +++ b/Doc/c-api/complex.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _complexobjects: diff --git a/Doc/c-api/concrete.rst b/Doc/c-api/concrete.rst index 9558a4a583cb..f83d711795c2 100644 --- a/Doc/c-api/concrete.rst +++ b/Doc/c-api/concrete.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _concrete: diff --git a/Doc/c-api/contextvars.rst b/Doc/c-api/contextvars.rst index c344c8d71ae3..a7cde7fb1958 100644 --- a/Doc/c-api/contextvars.rst +++ b/Doc/c-api/contextvars.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _contextvarsobjects: diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index c46722d782a2..ed101c791ec7 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _string-conversion: diff --git a/Doc/c-api/coro.rst b/Doc/c-api/coro.rst index 2fe50b5d8c44..50428c7eb43e 100644 --- a/Doc/c-api/coro.rst +++ b/Doc/c-api/coro.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _coro-objects: diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index 77b1b216744b..44a04373d196 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _datetimeobjects: diff --git a/Doc/c-api/descriptor.rst b/Doc/c-api/descriptor.rst index c8f6fa5bcd7f..1005140c7acb 100644 --- a/Doc/c-api/descriptor.rst +++ b/Doc/c-api/descriptor.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _descriptor-objects: diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index 0ced5a5fd001..e970771893eb 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _dictobjects: diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 13f0aff1cf99..00ef00526bc5 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _exceptionhandling: diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst index 6f2ecee51fd8..defc859dd5c4 100644 --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _fileobjects: diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index 27a75e3e0c2e..8a996422ce48 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _floatobjects: diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst index 17279c732ae0..02c4ebdbed45 100644 --- a/Doc/c-api/function.rst +++ b/Doc/c-api/function.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _function-objects: diff --git a/Doc/c-api/gcsupport.rst b/Doc/c-api/gcsupport.rst index b739aacea8d3..b3f30b2ed9e9 100644 --- a/Doc/c-api/gcsupport.rst +++ b/Doc/c-api/gcsupport.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _supporting-cycle-detection: diff --git a/Doc/c-api/gen.rst b/Doc/c-api/gen.rst index 1efbae4fcba0..8d54021c1814 100644 --- a/Doc/c-api/gen.rst +++ b/Doc/c-api/gen.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _gen-objects: diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst index 8cdc256e7c9e..86cc4031610b 100644 --- a/Doc/c-api/import.rst +++ b/Doc/c-api/import.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _importing: diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index b30649498a92..a0ac4d21d139 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _initialization: diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 69aef0da04f3..b003bbaeff2f 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _api-intro: diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst index 2ba444d1de6d..546efb518a7a 100644 --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _iterator: diff --git a/Doc/c-api/iterator.rst b/Doc/c-api/iterator.rst index 82cb4eba8ab7..4d91e4a224fe 100644 --- a/Doc/c-api/iterator.rst +++ b/Doc/c-api/iterator.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _iterator-objects: diff --git a/Doc/c-api/list.rst b/Doc/c-api/list.rst index 5b263a7b1cdf..279783a243a1 100644 --- a/Doc/c-api/list.rst +++ b/Doc/c-api/list.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _listobjects: diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 8093f4b627a2..6be29f9cd32e 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _longobjects: diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst index e37dec9949ab..4244b47af75f 100644 --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _mapping: diff --git a/Doc/c-api/marshal.rst b/Doc/c-api/marshal.rst index 17ec621610b5..b086830feb14 100644 --- a/Doc/c-api/marshal.rst +++ b/Doc/c-api/marshal.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _marshalling-utils: diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst index 65a207691b8a..ab49e48782d7 100644 --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _memory: diff --git a/Doc/c-api/memoryview.rst b/Doc/c-api/memoryview.rst index 9f6bfd751ade..77afb020405a 100644 --- a/Doc/c-api/memoryview.rst +++ b/Doc/c-api/memoryview.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _memoryview-objects: diff --git a/Doc/c-api/method.rst b/Doc/c-api/method.rst index 7a2a84fe110d..1ad805e269aa 100644 --- a/Doc/c-api/method.rst +++ b/Doc/c-api/method.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _instancemethod-objects: diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index 017b656854a8..68cbda2938f3 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _moduleobjects: diff --git a/Doc/c-api/none.rst b/Doc/c-api/none.rst index 45568fe657b9..26d2b7aab201 100644 --- a/Doc/c-api/none.rst +++ b/Doc/c-api/none.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _noneobject: diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 9fb220b192b9..74932f6e7445 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _number: diff --git a/Doc/c-api/objbuffer.rst b/Doc/c-api/objbuffer.rst index 3572564b13e9..6b82a642d7ee 100644 --- a/Doc/c-api/objbuffer.rst +++ b/Doc/c-api/objbuffer.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c Old Buffer Protocol ------------------- diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index a64ff2e6b58b..ffc35241e7a4 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _object: diff --git a/Doc/c-api/objimpl.rst b/Doc/c-api/objimpl.rst index 7023e519eda7..8bd8c107c98b 100644 --- a/Doc/c-api/objimpl.rst +++ b/Doc/c-api/objimpl.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _newtypes: diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index 225a1feb2506..6b07c87d62ed 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _countingrefs: diff --git a/Doc/c-api/reflection.rst b/Doc/c-api/reflection.rst index 96893652f730..080ea3222cfb 100644 --- a/Doc/c-api/reflection.rst +++ b/Doc/c-api/reflection.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _reflection: diff --git a/Doc/c-api/sequence.rst b/Doc/c-api/sequence.rst index 6d22f35e22b1..d11a2dde54dd 100644 --- a/Doc/c-api/sequence.rst +++ b/Doc/c-api/sequence.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _sequence: diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst index 64b6dde3b748..074fcb877e1d 100644 --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _setobjects: diff --git a/Doc/c-api/slice.rst b/Doc/c-api/slice.rst index 8ad9a29b256e..d924308890b8 100644 --- a/Doc/c-api/slice.rst +++ b/Doc/c-api/slice.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _slice-objects: diff --git a/Doc/c-api/stable.rst b/Doc/c-api/stable.rst index 5b771dd4adce..9c05cb3c82df 100644 --- a/Doc/c-api/stable.rst +++ b/Doc/c-api/stable.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _stable: diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index da45da1d3c70..5e0cfd0264f9 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _common-structs: diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index c8ea78363dfa..04e169a00dc6 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _os: diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst index 20bf9f0b0804..259ec4fb4851 100644 --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _tupleobjects: diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 4dfd53fb9f07..2474df2c90ba 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _typeobjects: diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 0647a493303d..b1d96db7f53d 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _type-structs: diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 724c798456f9..a150a9c39d88 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _unicodeobjects: diff --git a/Doc/c-api/utilities.rst b/Doc/c-api/utilities.rst index d4484fb27128..a805b564763c 100644 --- a/Doc/c-api/utilities.rst +++ b/Doc/c-api/utilities.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _utilities: diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 317093e95615..a7ff08cfb6bd 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _veryhigh: diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst index 6cb3e33fe843..7a4f8615b9c3 100644 --- a/Doc/c-api/weakref.rst +++ b/Doc/c-api/weakref.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _weakrefobjects: diff --git a/Doc/extending/building.rst b/Doc/extending/building.rst index 9bfad7fc3187..753b5511ed9d 100644 --- a/Doc/extending/building.rst +++ b/Doc/extending/building.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _building: @@ -20,7 +20,7 @@ The initialization function has the signature: It returns either a fully-initialized module, or a :c:type:`PyModuleDef` instance. See :ref:`initializing-modules` for details. -.. highlightlang:: python +.. highlight:: python For modules with ASCII-only names, the function must be named ``PyInit_``, with ```` replaced by the name of the @@ -43,7 +43,7 @@ function corresponding to the filename is found. See the *"Multiple modules in one library"* section in :pep:`489` for details. -.. highlightlang:: c +.. highlight:: c Building C and C++ Extensions with distutils ============================================ diff --git a/Doc/extending/embedding.rst b/Doc/extending/embedding.rst index 13d83b72f82a..483bc852f6c7 100644 --- a/Doc/extending/embedding.rst +++ b/Doc/extending/embedding.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _embedding: diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst index 433178ab64d8..e459514b2b58 100644 --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _extending-intro: diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst index 8b9549d7e39e..308c06705e8d 100644 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _new-types-topics: diff --git a/Doc/extending/newtypes_tutorial.rst b/Doc/extending/newtypes_tutorial.rst index b4bf9b9e6f75..59c8cc01222b 100644 --- a/Doc/extending/newtypes_tutorial.rst +++ b/Doc/extending/newtypes_tutorial.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _defining-new-types: diff --git a/Doc/extending/windows.rst b/Doc/extending/windows.rst index 67bdd475aeb6..c7b92c6ea24c 100644 --- a/Doc/extending/windows.rst +++ b/Doc/extending/windows.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _building-on-windows: diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index ad97cd0932ac..a181086e9ce6 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -1,6 +1,6 @@ :tocdepth: 2 -.. highlightlang:: none +.. highlight:: none .. _windows-faq: diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index 5b2457a1682b..cfd9f2e4075c 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c ********************** Argument Clinic How-To diff --git a/Doc/howto/cporting.rst b/Doc/howto/cporting.rst index b638e32f5d0e..ce7700fc5990 100644 --- a/Doc/howto/cporting.rst +++ b/Doc/howto/cporting.rst @@ -1,4 +1,4 @@ -.. highlightlang:: c +.. highlight:: c .. _cporting-howto: diff --git a/Doc/install/index.rst b/Doc/install/index.rst index e14232415be6..a91606c0f38e 100644 --- a/Doc/install/index.rst +++ b/Doc/install/index.rst @@ -1,4 +1,4 @@ -.. highlightlang:: none +.. highlight:: none .. _install-index: diff --git a/Doc/installing/index.rst b/Doc/installing/index.rst index 747b9223b62c..dc44aa64b8e0 100644 --- a/Doc/installing/index.rst +++ b/Doc/installing/index.rst @@ -1,4 +1,4 @@ -.. highlightlang:: none +.. highlight:: none .. _installing-index: diff --git a/Doc/library/site.rst b/Doc/library/site.rst index dfc40d179443..9e4d402c1f5e 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -8,7 +8,7 @@ -------------- -.. highlightlang:: none +.. highlight:: none **This module is automatically imported during initialization.** The automatic import can be suppressed using the interpreter's :option:`-S` option. diff --git a/Doc/license.rst b/Doc/license.rst index bf2e4c522ce1..d877f4567754 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -1,4 +1,4 @@ -.. highlightlang:: none +.. highlight:: none .. _history-and-license: diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 5ae3cc808b34..87af7e8be133 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -1,4 +1,4 @@ -.. highlightlang:: sh +.. highlight:: sh .. ATTENTION: You probably should update Misc/python.man, too, if you modify this file. diff --git a/Doc/using/unix.rst b/Doc/using/unix.rst index 31cf87c66f5f..021f0d35a8ee 100644 --- a/Doc/using/unix.rst +++ b/Doc/using/unix.rst @@ -1,4 +1,4 @@ -.. highlightlang:: sh +.. highlight:: sh .. _using-on-unix: diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 1f8eb16e5054..44b646fddfc4 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -1,4 +1,4 @@ -.. highlightlang:: none +.. highlight:: none .. _using-on-windows: From webhook-mailer at python.org Fri May 17 05:59:18 2019 From: webhook-mailer at python.org (Kushal Das) Date: Fri, 17 May 2019 09:59:18 -0000 Subject: [Python-checkins] bpo-36908: 'This module is always available' isn't helpful. (#13297) Message-ID: https://github.com/python/cpython/commit/6faad355db6c2bd4a0ade7868f245b42c04f5337 commit: 6faad355db6c2bd4a0ade7868f245b42c04f5337 branch: master author: Ned Batchelder committer: Kushal Das date: 2019-05-17T15:29:13+05:30 summary: bpo-36908: 'This module is always available' isn't helpful. (#13297) Makes the documentation of math and cmath module more helpful for the beginners. files: M Doc/library/cmath.rst M Doc/library/math.rst M Modules/cmathmodule.c M Modules/mathmodule.c diff --git a/Doc/library/cmath.rst b/Doc/library/cmath.rst index 9d81730f2012..28cd96b0e12d 100644 --- a/Doc/library/cmath.rst +++ b/Doc/library/cmath.rst @@ -6,13 +6,12 @@ -------------- -This module is always available. It provides access to mathematical functions -for complex numbers. The functions in this module accept integers, -floating-point numbers or complex numbers as arguments. They will also accept -any Python object that has either a :meth:`__complex__` or a :meth:`__float__` -method: these methods are used to convert the object to a complex or -floating-point number, respectively, and the function is then applied to the -result of the conversion. +This module provides access to mathematical functions for complex numbers. The +functions in this module accept integers, floating-point numbers or complex +numbers as arguments. They will also accept any Python object that has either a +:meth:`__complex__` or a :meth:`__float__` method: these methods are used to +convert the object to a complex or floating-point number, respectively, and +the function is then applied to the result of the conversion. .. note:: diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 7129525c7887..49f932d03845 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -10,8 +10,8 @@ -------------- -This module is always available. It provides access to the mathematical -functions defined by the C standard. +This module provides access to the mathematical functions defined by the C +standard. These functions cannot be used with complex numbers; use the functions of the same name from the :mod:`cmath` module if you require support for complex diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 8319767b8a9e..b421f04fa605 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -1232,8 +1232,8 @@ cmath_isclose_impl(PyObject *module, Py_complex a, Py_complex b, } PyDoc_STRVAR(module_doc, -"This module is always available. It provides access to mathematical\n" -"functions for complex numbers."); +"This module provides access to mathematical functions for complex\n" +"numbers."); static PyMethodDef cmath_methods[] = { CMATH_ACOS_METHODDEF diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index ba8423211c2b..8f6a303cc4de 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2759,8 +2759,8 @@ static PyMethodDef math_methods[] = { PyDoc_STRVAR(module_doc, -"This module is always available. It provides access to the\n" -"mathematical functions defined by the C standard."); +"This module provides access to the mathematical functions\n" +"defined by the C standard."); static struct PyModuleDef mathmodule = { From webhook-mailer at python.org Fri May 17 06:21:51 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Fri, 17 May 2019 10:21:51 -0000 Subject: [Python-checkins] Fix typo in _PyMethodDef_RawFastCallKeywords error message (GH-13343) Message-ID: https://github.com/python/cpython/commit/a8b46944d72bba6dc76260ed61da5c78d3f9d9c0 commit: a8b46944d72bba6dc76260ed61da5c78d3f9d9c0 branch: master author: Jeroen Demeyer committer: St?phane Wirtel date: 2019-05-17T12:21:35+02:00 summary: Fix typo in _PyMethodDef_RawFastCallKeywords error message (GH-13343) files: M Objects/call.c diff --git a/Objects/call.c b/Objects/call.c index 68f9e879fa76..337ca8110809 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -701,7 +701,7 @@ _PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self, default: PyErr_SetString(PyExc_SystemError, - "Bad call flags in _PyCFunction_FastCallKeywords. " + "Bad call flags in _PyMethodDef_RawFastCallKeywords. " "METH_OLDARGS is no longer supported!"); goto exit; } From webhook-mailer at python.org Fri May 17 06:37:13 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 17 May 2019 10:37:13 -0000 Subject: [Python-checkins] bpo-1875: Raise SyntaxError in invalid blocks that will be optimised away (GH-13332) Message-ID: https://github.com/python/cpython/commit/af8646c8054d0f4180a2013383039b6a472f9698 commit: af8646c8054d0f4180a2013383039b6a472f9698 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-17T11:37:08+01:00 summary: bpo-1875: Raise SyntaxError in invalid blocks that will be optimised away (GH-13332) Move the check for dead conditionals (if 0) to the peephole optimizer and make sure that the code block is still compiled to report any existing syntax errors within. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst M Lib/test/test_syntax.py M Python/compile.c M Python/peephole.c diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 4a2899ebca30..8451c072f642 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -696,6 +696,20 @@ def error2(): def test_break_outside_loop(self): self._check_error("break", "outside loop") + def test_yield_outside_function(self): + self._check_error("if 0: yield", "outside function") + self._check_error("class C:\n if 0: yield", "outside function") + + def test_return_outside_function(self): + self._check_error("if 0: return", "outside function") + self._check_error("class C:\n if 0: return", "outside function") + + def test_break_outside_loop(self): + self._check_error("if 0: break", "outside loop") + + def test_continue_outside_loop(self): + self._check_error("if 0: continue", "not properly in loop") + def test_unexpected_indent(self): self._check_error("foo()\n bar()\n", "unexpected indent", subclass=IndentationError) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst new file mode 100644 index 000000000000..8f095ed9f16b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst @@ -0,0 +1,3 @@ +A :exc:`SyntaxError` is now raised if a code blocks that will be optimized +away (e.g. if conditions that are always false) contains syntax errors. +Patch by Pablo Galindo. diff --git a/Python/compile.c b/Python/compile.c index 91ce04b02e53..2a086a509f45 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2546,13 +2546,12 @@ compiler_if(struct compiler *c, stmt_ty s) return 0; constant = expr_constant(s->v.If.test); - /* constant = 0: "if 0" + /* constant = 0: "if 0" Leave the optimizations to + * the pephole optimizer to check for syntax errors + * in the block. * constant = 1: "if 1", "if 2", ... * constant = -1: rest */ - if (constant == 0) { - if (s->v.If.orelse) - VISIT_SEQ(c, stmt, s->v.If.orelse); - } else if (constant == 1) { + if (constant == 1) { VISIT_SEQ(c, stmt, s->v.If.body); } else { if (asdl_seq_LEN(s->v.If.orelse)) { diff --git a/Python/peephole.c b/Python/peephole.c index cc244aa433ee..1ce3535626e9 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -302,11 +302,19 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case LOAD_CONST: cumlc = lastlc + 1; if (nextop != POP_JUMP_IF_FALSE || - !ISBASICBLOCK(blocks, op_start, i + 1) || - !PyObject_IsTrue(PyList_GET_ITEM(consts, get_arg(codestr, i)))) + !ISBASICBLOCK(blocks, op_start, i + 1)) { break; - fill_nops(codestr, op_start, nexti + 1); - cumlc = 0; + } + PyObject* cnt = PyList_GET_ITEM(consts, get_arg(codestr, i)); + int is_true = PyObject_IsTrue(cnt); + if (is_true == 1) { + fill_nops(codestr, op_start, nexti + 1); + cumlc = 0; + } else if (is_true == 0) { + h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT); + tgt = find_op(codestr, codelen, h); + fill_nops(codestr, op_start, tgt); + } break; /* Try to fold tuples of constants. From webhook-mailer at python.org Fri May 17 06:44:22 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 17 May 2019 10:44:22 -0000 Subject: [Python-checkins] docs 36789: resolve incorrect note regarding UTF-8 (GH-13111) Message-ID: https://github.com/python/cpython/commit/f98c3c59c0930ee41175d8935f72bfeed5fee17a commit: f98c3c59c0930ee41175d8935f72bfeed5fee17a branch: master author: redshiftzero committer: Cheryl Sabella date: 2019-05-17T06:44:17-04:00 summary: docs 36789: resolve incorrect note regarding UTF-8 (GH-13111) files: M Doc/howto/unicode.rst diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index 7b2d7b8abf87..24c3235e4add 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -135,17 +135,22 @@ used than UTF-8.) UTF-8 uses the following rules: UTF-8 has several convenient properties: 1. It can handle any Unicode code point. -2. A Unicode string is turned into a sequence of bytes containing no embedded zero - bytes. This avoids byte-ordering issues, and means UTF-8 strings can be - processed by C functions such as ``strcpy()`` and sent through protocols that - can't handle zero bytes. +2. A Unicode string is turned into a sequence of bytes that contains embedded + zero bytes only where they represent the null character (U+0000). This means + that UTF-8 strings can be processed by C functions such as ``strcpy()`` and sent + through protocols that can't handle zero bytes for anything other than + end-of-string markers. 3. A string of ASCII text is also valid UTF-8 text. 4. UTF-8 is fairly compact; the majority of commonly used characters can be represented with one or two bytes. 5. If bytes are corrupted or lost, it's possible to determine the start of the next UTF-8-encoded code point and resynchronize. It's also unlikely that random 8-bit data will look like valid UTF-8. - +6. UTF-8 is a byte oriented encoding. The encoding specifies that each + character is represented by a specific sequence of one or more bytes. This + avoids the byte-ordering issues that can occur with integer and word oriented + encodings, like UTF-16 and UTF-32, where the sequence of bytes varies depending + on the hardware on which the string was encoded. References From webhook-mailer at python.org Fri May 17 06:59:54 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 17 May 2019 10:59:54 -0000 Subject: [Python-checkins] bpo-1875: Raise SyntaxError in invalid blocks that will be optimised away (GH-13332) Message-ID: https://github.com/python/cpython/commit/85ed1712e428f93408f56fc684816f9a85b0ebc0 commit: 85ed1712e428f93408f56fc684816f9a85b0ebc0 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-17T03:59:48-07:00 summary: bpo-1875: Raise SyntaxError in invalid blocks that will be optimised away (GH-13332) Move the check for dead conditionals (if 0) to the peephole optimizer and make sure that the code block is still compiled to report any existing syntax errors within. (cherry picked from commit af8646c8054d0f4180a2013383039b6a472f9698) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst M Lib/test/test_syntax.py M Python/compile.c M Python/peephole.c diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 2b96a94401a8..4918e5c4c428 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -650,6 +650,20 @@ def error2(): def test_break_outside_loop(self): self._check_error("break", "outside loop") + def test_yield_outside_function(self): + self._check_error("if 0: yield", "outside function") + self._check_error("class C:\n if 0: yield", "outside function") + + def test_return_outside_function(self): + self._check_error("if 0: return", "outside function") + self._check_error("class C:\n if 0: return", "outside function") + + def test_break_outside_loop(self): + self._check_error("if 0: break", "outside loop") + + def test_continue_outside_loop(self): + self._check_error("if 0: continue", "not properly in loop") + def test_unexpected_indent(self): self._check_error("foo()\n bar()\n", "unexpected indent", subclass=IndentationError) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst new file mode 100644 index 000000000000..8f095ed9f16b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst @@ -0,0 +1,3 @@ +A :exc:`SyntaxError` is now raised if a code blocks that will be optimized +away (e.g. if conditions that are always false) contains syntax errors. +Patch by Pablo Galindo. diff --git a/Python/compile.c b/Python/compile.c index 5688ef8479c0..d2729d4c6ca3 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2301,13 +2301,12 @@ compiler_if(struct compiler *c, stmt_ty s) return 0; constant = expr_constant(s->v.If.test); - /* constant = 0: "if 0" + /* constant = 0: "if 0" Leave the optimizations to + * the pephole optimizer to check for syntax errors + * in the block. * constant = 1: "if 1", "if 2", ... * constant = -1: rest */ - if (constant == 0) { - if (s->v.If.orelse) - VISIT_SEQ(c, stmt, s->v.If.orelse); - } else if (constant == 1) { + if (constant == 1) { VISIT_SEQ(c, stmt, s->v.If.body); } else { if (asdl_seq_LEN(s->v.If.orelse)) { diff --git a/Python/peephole.c b/Python/peephole.c index 95b3dbb6bf51..1ae62fa39a27 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -304,11 +304,19 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case LOAD_CONST: cumlc = lastlc + 1; if (nextop != POP_JUMP_IF_FALSE || - !ISBASICBLOCK(blocks, op_start, i + 1) || - !PyObject_IsTrue(PyList_GET_ITEM(consts, get_arg(codestr, i)))) + !ISBASICBLOCK(blocks, op_start, i + 1)) { break; - fill_nops(codestr, op_start, nexti + 1); - cumlc = 0; + } + PyObject* cnt = PyList_GET_ITEM(consts, get_arg(codestr, i)); + int is_true = PyObject_IsTrue(cnt); + if (is_true == 1) { + fill_nops(codestr, op_start, nexti + 1); + cumlc = 0; + } else if (is_true == 0) { + h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT); + tgt = find_op(codestr, codelen, h); + fill_nops(codestr, op_start, tgt); + } break; /* Try to fold tuples of constants. From webhook-mailer at python.org Fri May 17 07:01:51 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 17 May 2019 11:01:51 -0000 Subject: [Python-checkins] docs 36789: resolve incorrect note regarding UTF-8 (GH-13111) Message-ID: https://github.com/python/cpython/commit/a22c42fea6df2af54d347e1297fa6c738192d952 commit: a22c42fea6df2af54d347e1297fa6c738192d952 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-17T04:01:47-07:00 summary: docs 36789: resolve incorrect note regarding UTF-8 (GH-13111) (cherry picked from commit f98c3c59c0930ee41175d8935f72bfeed5fee17a) Co-authored-by: redshiftzero files: M Doc/howto/unicode.rst diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index 5339bf45bf0e..d4b1b2a70726 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -135,17 +135,22 @@ used than UTF-8.) UTF-8 uses the following rules: UTF-8 has several convenient properties: 1. It can handle any Unicode code point. -2. A Unicode string is turned into a sequence of bytes containing no embedded zero - bytes. This avoids byte-ordering issues, and means UTF-8 strings can be - processed by C functions such as ``strcpy()`` and sent through protocols that - can't handle zero bytes. +2. A Unicode string is turned into a sequence of bytes that contains embedded + zero bytes only where they represent the null character (U+0000). This means + that UTF-8 strings can be processed by C functions such as ``strcpy()`` and sent + through protocols that can't handle zero bytes for anything other than + end-of-string markers. 3. A string of ASCII text is also valid UTF-8 text. 4. UTF-8 is fairly compact; the majority of commonly used characters can be represented with one or two bytes. 5. If bytes are corrupted or lost, it's possible to determine the start of the next UTF-8-encoded code point and resynchronize. It's also unlikely that random 8-bit data will look like valid UTF-8. - +6. UTF-8 is a byte oriented encoding. The encoding specifies that each + character is represented by a specific sequence of one or more bytes. This + avoids the byte-ordering issues that can occur with integer and word oriented + encodings, like UTF-16 and UTF-32, where the sequence of bytes varies depending + on the hardware on which the string was encoded. References From webhook-mailer at python.org Fri May 17 07:08:30 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Fri, 17 May 2019 11:08:30 -0000 Subject: [Python-checkins] Simplify SSLSocket / SSLObject doc string (GH-9972) Message-ID: https://github.com/python/cpython/commit/80ed353329ef01ca6ab2056051fb999818a86215 commit: 80ed353329ef01ca6ab2056051fb999818a86215 branch: master author: Christian Heimes committer: St?phane Wirtel date: 2019-05-17T13:08:14+02:00 summary: Simplify SSLSocket / SSLObject doc string (GH-9972) Instead of maintaining the same doc string two times, let's copy common doc strings from SSLObject methods and properties to SSLSocket. Signed-off-by: Christian Heimes files: M Lib/ssl.py diff --git a/Lib/ssl.py b/Lib/ssl.py index e6e3a6d0fa8d..793ed496c77a 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -781,6 +781,12 @@ def verify_client_post_handshake(self): return self._sslobj.verify_client_post_handshake() +def _sslcopydoc(func): + """Copy docstring from SSLObject to SSLSocket""" + func.__doc__ = getattr(SSLObject, func.__name__).__doc__ + return func + + class SSLSocket(socket): """This class implements a subtype of socket.socket that wraps the underlying OS socket in an SSL context when necessary, and @@ -857,6 +863,7 @@ def _create(cls, sock, server_side=False, do_handshake_on_connect=True, return self @property + @_sslcopydoc def context(self): return self._context @@ -866,8 +873,8 @@ def context(self, ctx): self._sslobj.context = ctx @property + @_sslcopydoc def session(self): - """The SSLSession for client socket.""" if self._sslobj is not None: return self._sslobj.session @@ -878,8 +885,8 @@ def session(self, session): self._sslobj.session = session @property + @_sslcopydoc def session_reused(self): - """Was the client session reused during handshake""" if self._sslobj is not None: return self._sslobj.session_reused @@ -929,16 +936,13 @@ def write(self, data): raise ValueError("Write on closed or unwrapped SSL socket.") return self._sslobj.write(data) + @_sslcopydoc def getpeercert(self, binary_form=False): - """Returns a formatted version of the data in the - certificate provided by the other end of the SSL channel. - Return None if no certificate was provided, {} if a - certificate was provided, but not validated.""" - self._checkClosed() self._check_connected() return self._sslobj.getpeercert(binary_form) + @_sslcopydoc def selected_npn_protocol(self): self._checkClosed() if self._sslobj is None or not _ssl.HAS_NPN: @@ -946,6 +950,7 @@ def selected_npn_protocol(self): else: return self._sslobj.selected_npn_protocol() + @_sslcopydoc def selected_alpn_protocol(self): self._checkClosed() if self._sslobj is None or not _ssl.HAS_ALPN: @@ -953,6 +958,7 @@ def selected_alpn_protocol(self): else: return self._sslobj.selected_alpn_protocol() + @_sslcopydoc def cipher(self): self._checkClosed() if self._sslobj is None: @@ -960,6 +966,7 @@ def cipher(self): else: return self._sslobj.cipher() + @_sslcopydoc def shared_ciphers(self): self._checkClosed() if self._sslobj is None: @@ -967,6 +974,7 @@ def shared_ciphers(self): else: return self._sslobj.shared_ciphers() + @_sslcopydoc def compression(self): self._checkClosed() if self._sslobj is None: @@ -1077,6 +1085,7 @@ def recvmsg_into(self, *args, **kwargs): raise NotImplementedError("recvmsg_into not allowed on instances of " "%s" % self.__class__) + @_sslcopydoc def pending(self): self._checkClosed() if self._sslobj is not None: @@ -1089,6 +1098,7 @@ def shutdown(self, how): self._sslobj = None super().shutdown(how) + @_sslcopydoc def unwrap(self): if self._sslobj: s = self._sslobj.shutdown() @@ -1097,6 +1107,7 @@ def unwrap(self): else: raise ValueError("No SSL wrapper around " + str(self)) + @_sslcopydoc def verify_client_post_handshake(self): if self._sslobj: return self._sslobj.verify_client_post_handshake() @@ -1107,8 +1118,8 @@ def _real_close(self): self._sslobj = None super()._real_close() + @_sslcopydoc def do_handshake(self, block=False): - """Perform a TLS/SSL handshake.""" self._check_connected() timeout = self.gettimeout() try: @@ -1166,11 +1177,8 @@ def accept(self): server_side=True) return newsock, addr + @_sslcopydoc def get_channel_binding(self, cb_type="tls-unique"): - """Get channel binding data for current connection. Raise ValueError - if the requested `cb_type` is not supported. Return bytes of the data - or None if the data is not available (e.g. before the handshake). - """ if self._sslobj is not None: return self._sslobj.get_channel_binding(cb_type) else: @@ -1180,11 +1188,8 @@ def get_channel_binding(self, cb_type="tls-unique"): ) return None + @_sslcopydoc def version(self): - """ - Return a string identifying the protocol version used by the - current SSL channel, or None if there is no established channel. - """ if self._sslobj is not None: return self._sslobj.version() else: From webhook-mailer at python.org Fri May 17 07:29:41 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Fri, 17 May 2019 11:29:41 -0000 Subject: [Python-checkins] Simplify SSLSocket / SSLObject doc string (GH-9972) (GH-13384) Message-ID: https://github.com/python/cpython/commit/ced80d8ce2379cb3c8f4b90255633e6fa9efeff7 commit: ced80d8ce2379cb3c8f4b90255633e6fa9efeff7 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: St?phane Wirtel date: 2019-05-17T13:29:35+02:00 summary: Simplify SSLSocket / SSLObject doc string (GH-9972) (GH-13384) Instead of maintaining the same docstring two times, let's copy common docstrings from SSLObject methods and properties to SSLSocket. (cherry picked from commit 80ed353329ef01ca6ab2056051fb999818a86215) Co-authored-by: Christian Heimes files: M Lib/ssl.py diff --git a/Lib/ssl.py b/Lib/ssl.py index d1d986682035..b12f8a1be60c 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -781,6 +781,12 @@ def verify_client_post_handshake(self): return self._sslobj.verify_client_post_handshake() +def _sslcopydoc(func): + """Copy docstring from SSLObject to SSLSocket""" + func.__doc__ = getattr(SSLObject, func.__name__).__doc__ + return func + + class SSLSocket(socket): """This class implements a subtype of socket.socket that wraps the underlying OS socket in an SSL context when necessary, and @@ -857,6 +863,7 @@ def _create(cls, sock, server_side=False, do_handshake_on_connect=True, return self @property + @_sslcopydoc def context(self): return self._context @@ -866,8 +873,8 @@ def context(self, ctx): self._sslobj.context = ctx @property + @_sslcopydoc def session(self): - """The SSLSession for client socket.""" if self._sslobj is not None: return self._sslobj.session @@ -878,8 +885,8 @@ def session(self, session): self._sslobj.session = session @property + @_sslcopydoc def session_reused(self): - """Was the client session reused during handshake""" if self._sslobj is not None: return self._sslobj.session_reused @@ -929,16 +936,13 @@ def write(self, data): raise ValueError("Write on closed or unwrapped SSL socket.") return self._sslobj.write(data) + @_sslcopydoc def getpeercert(self, binary_form=False): - """Returns a formatted version of the data in the - certificate provided by the other end of the SSL channel. - Return None if no certificate was provided, {} if a - certificate was provided, but not validated.""" - self._checkClosed() self._check_connected() return self._sslobj.getpeercert(binary_form) + @_sslcopydoc def selected_npn_protocol(self): self._checkClosed() if self._sslobj is None or not _ssl.HAS_NPN: @@ -946,6 +950,7 @@ def selected_npn_protocol(self): else: return self._sslobj.selected_npn_protocol() + @_sslcopydoc def selected_alpn_protocol(self): self._checkClosed() if self._sslobj is None or not _ssl.HAS_ALPN: @@ -953,6 +958,7 @@ def selected_alpn_protocol(self): else: return self._sslobj.selected_alpn_protocol() + @_sslcopydoc def cipher(self): self._checkClosed() if self._sslobj is None: @@ -960,6 +966,7 @@ def cipher(self): else: return self._sslobj.cipher() + @_sslcopydoc def shared_ciphers(self): self._checkClosed() if self._sslobj is None: @@ -967,6 +974,7 @@ def shared_ciphers(self): else: return self._sslobj.shared_ciphers() + @_sslcopydoc def compression(self): self._checkClosed() if self._sslobj is None: @@ -1077,6 +1085,7 @@ def recvmsg_into(self, *args, **kwargs): raise NotImplementedError("recvmsg_into not allowed on instances of " "%s" % self.__class__) + @_sslcopydoc def pending(self): self._checkClosed() if self._sslobj is not None: @@ -1089,6 +1098,7 @@ def shutdown(self, how): self._sslobj = None super().shutdown(how) + @_sslcopydoc def unwrap(self): if self._sslobj: s = self._sslobj.shutdown() @@ -1097,6 +1107,7 @@ def unwrap(self): else: raise ValueError("No SSL wrapper around " + str(self)) + @_sslcopydoc def verify_client_post_handshake(self): if self._sslobj: return self._sslobj.verify_client_post_handshake() @@ -1107,8 +1118,8 @@ def _real_close(self): self._sslobj = None super()._real_close() + @_sslcopydoc def do_handshake(self, block=False): - """Perform a TLS/SSL handshake.""" self._check_connected() timeout = self.gettimeout() try: @@ -1166,11 +1177,8 @@ def accept(self): server_side=True) return newsock, addr + @_sslcopydoc def get_channel_binding(self, cb_type="tls-unique"): - """Get channel binding data for current connection. Raise ValueError - if the requested `cb_type` is not supported. Return bytes of the data - or None if the data is not available (e.g. before the handshake). - """ if self._sslobj is not None: return self._sslobj.get_channel_binding(cb_type) else: @@ -1180,11 +1188,8 @@ def get_channel_binding(self, cb_type="tls-unique"): ) return None + @_sslcopydoc def version(self): - """ - Return a string identifying the protocol version used by the - current SSL channel, or None if there is no established channel. - """ if self._sslobj is not None: return self._sslobj.version() else: From webhook-mailer at python.org Fri May 17 07:34:52 2019 From: webhook-mailer at python.org (=?utf-8?q?St=C3=A9phane?= Wirtel) Date: Fri, 17 May 2019 11:34:52 -0000 Subject: [Python-checkins] [3.7] Fix typo in _PyMethodDef_RawFastCallKeywords error message (GH-13343) (GH-13385) Message-ID: https://github.com/python/cpython/commit/9050aaf6eef422e16de9707f981697c668d433db commit: 9050aaf6eef422e16de9707f981697c668d433db branch: 3.7 author: St?phane Wirtel committer: GitHub date: 2019-05-17T13:34:47+02:00 summary: [3.7] Fix typo in _PyMethodDef_RawFastCallKeywords error message (GH-13343) (GH-13385) (cherry picked from commit a8b46944d72bba6dc76260ed61da5c78d3f9d9c0) Co-authored-by: Jeroen Demeyer files: M Objects/call.c diff --git a/Objects/call.c b/Objects/call.c index b53a98c76b0e..e6076e7005e9 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -699,7 +699,7 @@ _PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self, default: PyErr_SetString(PyExc_SystemError, - "Bad call flags in _PyCFunction_FastCallKeywords. " + "Bad call flags in _PyMethodDef_RawFastCallKeywords. " "METH_OLDARGS is no longer supported!"); goto exit; } From webhook-mailer at python.org Fri May 17 09:21:08 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 13:21:08 -0000 Subject: [Python-checkins] bpo-36763: Add PyMemAllocatorName (GH-13387) Message-ID: https://github.com/python/cpython/commit/b16b4e45923f4e4dfd8e970ae4e6a934faf73b79 commit: b16b4e45923f4e4dfd8e970ae4e6a934faf73b79 branch: master author: Victor Stinner committer: GitHub date: 2019-05-17T15:20:52+02:00 summary: bpo-36763: Add PyMemAllocatorName (GH-13387) * Add PyMemAllocatorName enum * _PyPreConfig.allocator type becomes PyMemAllocatorName, instead of char* * Remove _PyPreConfig_Clear() * Add _PyMem_GetAllocatorName() * Rename _PyMem_GetAllocatorsName() to _PyMem_GetCurrentAllocatorName() * Remove _PyPreConfig_SetAllocator(): just call _PyMem_SetupAllocators() directly, we don't have do reallocate the configuration with the new allocator anymore! * _PyPreConfig_Write() parameter becomes const, as it should be in the first place! files: M Include/cpython/coreconfig.h M Include/cpython/pymem.h M Include/internal/pycore_coreconfig.h M Include/internal/pycore_pymem.h M Lib/test/test_embed.py M Modules/_testcapimodule.c M Objects/obmalloc.c M Programs/_testembed.c M Python/coreconfig.c M Python/preconfig.c M Python/pylifecycle.c M Python/pystate.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 1ba2663c9667..dca41341dfe4 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -120,7 +120,9 @@ typedef struct { int utf8_mode; int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ - char *allocator; /* Memory allocator: PYTHONMALLOC */ + + /* Memory allocator: PYTHONMALLOC env var */ + PyMemAllocatorName allocator; } _PyPreConfig; #ifdef MS_WINDOWS @@ -137,7 +139,7 @@ typedef struct { .isolated = -1, \ .use_environment = -1, \ .dev_mode = -1, \ - .allocator = NULL} + .allocator = PYMEM_ALLOCATOR_NOT_SET} /* --- _PyCoreConfig ---------------------------------------------- */ diff --git a/Include/cpython/pymem.h b/Include/cpython/pymem.h index bd66506639ab..79f063b12175 100644 --- a/Include/cpython/pymem.h +++ b/Include/cpython/pymem.h @@ -11,12 +11,8 @@ PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); PyAPI_FUNC(void) PyMem_RawFree(void *ptr); -/* Configure the Python memory allocators. Pass NULL to use default - allocators. */ -PyAPI_FUNC(int) _PyMem_SetupAllocators(const char *opt); - /* Try to get the allocators name set by _PyMem_SetupAllocators(). */ -PyAPI_FUNC(const char*) _PyMem_GetAllocatorsName(void); +PyAPI_FUNC(const char*) _PyMem_GetCurrentAllocatorName(void); PyAPI_FUNC(void *) PyMem_Calloc(size_t nelem, size_t elsize); @@ -41,6 +37,19 @@ typedef enum { PYMEM_DOMAIN_OBJ } PyMemAllocatorDomain; +typedef enum { + PYMEM_ALLOCATOR_NOT_SET = 0, + PYMEM_ALLOCATOR_DEFAULT = 1, + PYMEM_ALLOCATOR_DEBUG = 2, + PYMEM_ALLOCATOR_MALLOC = 3, + PYMEM_ALLOCATOR_MALLOC_DEBUG = 4, +#ifdef WITH_PYMALLOC + PYMEM_ALLOCATOR_PYMALLOC = 5, + PYMEM_ALLOCATOR_PYMALLOC_DEBUG = 6, +#endif +} PyMemAllocatorName; + + typedef struct { /* user context passed as the first argument to the 4 functions */ void *ctx; diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index d48904e482a4..ccb7948ef4d4 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -88,7 +88,6 @@ PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, /* --- _PyPreConfig ----------------------------------------------- */ -PyAPI_FUNC(void) _PyPreConfig_Clear(_PyPreConfig *config); PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2); PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); @@ -96,7 +95,7 @@ PyAPI_FUNC(void) _PyCoreConfig_GetCoreConfig(_PyPreConfig *config, const _PyCoreConfig *core_config); PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args); -PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(_PyPreConfig *config); +PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(const _PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 20f3b5e40067..dcc492af0170 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -179,6 +179,15 @@ static inline int _PyMem_IsPtrFreed(void *ptr) #endif } +PyAPI_FUNC(int) _PyMem_GetAllocatorName( + const char *name, + PyMemAllocatorName *allocator); + +/* Configure the Python memory allocators. + Pass PYMEM_ALLOCATOR_DEFAULT to use default allocators. + PYMEM_ALLOCATOR_NOT_SET does nothing. */ +PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator); + #ifdef __cplusplus } #endif diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 4012a389d750..92cc405859c9 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -13,6 +13,9 @@ MS_WINDOWS = (os.name == 'nt') +PYMEM_ALLOCATOR_NOT_SET = 0 +PYMEM_ALLOCATOR_DEBUG = 2 +PYMEM_ALLOCATOR_MALLOC = 3 class EmbeddingTestsMixin: @@ -272,7 +275,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): # Mark config which should be get by get_default_config() GET_DEFAULT_CONFIG = object() DEFAULT_PRE_CONFIG = { - 'allocator': None, + 'allocator': PYMEM_ALLOCATOR_NOT_SET, 'coerce_c_locale': 0, 'coerce_c_locale_warn': 0, 'utf8_mode': 0, @@ -564,7 +567,7 @@ def test_init_global_config(self): def test_init_from_config(self): preconfig = { - 'allocator': 'malloc', + 'allocator': PYMEM_ALLOCATOR_MALLOC, 'utf8_mode': 1, } config = { @@ -608,7 +611,7 @@ def test_init_from_config(self): self.check_config("init_from_config", config, preconfig) INIT_ENV_PRECONFIG = { - 'allocator': 'malloc', + 'allocator': PYMEM_ALLOCATOR_MALLOC, } INIT_ENV_CONFIG = { 'use_hash_seed': 1, @@ -633,7 +636,7 @@ def test_init_env(self): def test_init_env_dev_mode(self): preconfig = dict(self.INIT_ENV_PRECONFIG, - allocator='debug') + allocator=PYMEM_ALLOCATOR_DEBUG) config = dict(self.INIT_ENV_CONFIG, dev_mode=1, warnoptions=['default']) @@ -641,7 +644,7 @@ def test_init_env_dev_mode(self): def test_init_env_dev_mode_alloc(self): preconfig = dict(self.INIT_ENV_PRECONFIG, - allocator='malloc') + allocator=PYMEM_ALLOCATOR_MALLOC) config = dict(self.INIT_ENV_CONFIG, dev_mode=1, warnoptions=['default']) @@ -649,7 +652,7 @@ def test_init_env_dev_mode_alloc(self): def test_init_dev_mode(self): preconfig = { - 'allocator': 'debug', + 'allocator': PYMEM_ALLOCATOR_DEBUG, } config = { 'faulthandler': 1, diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 04d75ace6ecf..59b42df279c4 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4297,7 +4297,7 @@ pymem_malloc_without_gil(PyObject *self, PyObject *args) static PyObject* test_pymem_getallocatorsname(PyObject *self, PyObject *args) { - const char *name = _PyMem_GetAllocatorsName(); + const char *name = _PyMem_GetCurrentAllocatorName(); if (name == NULL) { PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name"); return NULL; diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index bd15bcf1363b..f54856dcfe71 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -268,26 +268,65 @@ _PyMem_SetDefaultAllocator(PyMemAllocatorDomain domain, int -_PyMem_SetupAllocators(const char *opt) +_PyMem_GetAllocatorName(const char *name, PyMemAllocatorName *allocator) { - if (opt == NULL || *opt == '\0') { + if (name == NULL || *name == '\0') { /* PYTHONMALLOC is empty or is not set or ignored (-E/-I command line - options): use default memory allocators */ - opt = "default"; + nameions): use default memory allocators */ + *allocator = PYMEM_ALLOCATOR_DEFAULT; } + else if (strcmp(name, "default") == 0) { + *allocator = PYMEM_ALLOCATOR_DEFAULT; + } + else if (strcmp(name, "debug") == 0) { + *allocator = PYMEM_ALLOCATOR_DEBUG; + } +#ifdef WITH_PYMALLOC + else if (strcmp(name, "pymalloc") == 0) { + *allocator = PYMEM_ALLOCATOR_PYMALLOC; + } + else if (strcmp(name, "pymalloc_debug") == 0) { + *allocator = PYMEM_ALLOCATOR_PYMALLOC_DEBUG; + } +#endif + else if (strcmp(name, "malloc") == 0) { + *allocator = PYMEM_ALLOCATOR_MALLOC; + } + else if (strcmp(name, "malloc_debug") == 0) { + *allocator = PYMEM_ALLOCATOR_MALLOC_DEBUG; + } + else { + /* unknown allocator */ + return -1; + } + return 0; +} + - if (strcmp(opt, "default") == 0) { +int +_PyMem_SetupAllocators(PyMemAllocatorName allocator) +{ + switch (allocator) { + case PYMEM_ALLOCATOR_NOT_SET: + /* do nothing */ + break; + + case PYMEM_ALLOCATOR_DEFAULT: (void)_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, NULL); (void)_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_MEM, NULL); (void)_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_OBJ, NULL); - } - else if (strcmp(opt, "debug") == 0) { + break; + + case PYMEM_ALLOCATOR_DEBUG: (void)pymem_set_default_allocator(PYMEM_DOMAIN_RAW, 1, NULL); (void)pymem_set_default_allocator(PYMEM_DOMAIN_MEM, 1, NULL); (void)pymem_set_default_allocator(PYMEM_DOMAIN_OBJ, 1, NULL); - } + break; + #ifdef WITH_PYMALLOC - else if (strcmp(opt, "pymalloc") == 0 || strcmp(opt, "pymalloc_debug") == 0) { + case PYMEM_ALLOCATOR_PYMALLOC: + case PYMEM_ALLOCATOR_PYMALLOC_DEBUG: + { PyMemAllocatorEx malloc_alloc = MALLOC_ALLOC; PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &malloc_alloc); @@ -295,22 +334,28 @@ _PyMem_SetupAllocators(const char *opt) PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &pymalloc); PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &pymalloc); - if (strcmp(opt, "pymalloc_debug") == 0) { + if (allocator == PYMEM_ALLOCATOR_PYMALLOC_DEBUG) { PyMem_SetupDebugHooks(); } + break; } #endif - else if (strcmp(opt, "malloc") == 0 || strcmp(opt, "malloc_debug") == 0) { + + case PYMEM_ALLOCATOR_MALLOC: + case PYMEM_ALLOCATOR_MALLOC_DEBUG: + { PyMemAllocatorEx malloc_alloc = MALLOC_ALLOC; PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &malloc_alloc); PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &malloc_alloc); PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &malloc_alloc); - if (strcmp(opt, "malloc_debug") == 0) { + if (allocator == PYMEM_ALLOCATOR_MALLOC_DEBUG) { PyMem_SetupDebugHooks(); } + break; } - else { + + default: /* unknown allocator */ return -1; } @@ -326,7 +371,7 @@ pymemallocator_eq(PyMemAllocatorEx *a, PyMemAllocatorEx *b) const char* -_PyMem_GetAllocatorsName(void) +_PyMem_GetCurrentAllocatorName(void) { PyMemAllocatorEx malloc_alloc = MALLOC_ALLOC; #ifdef WITH_PYMALLOC diff --git a/Programs/_testembed.c b/Programs/_testembed.c index b1b7c6e0ffc3..3327c8ce6639 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -379,7 +379,7 @@ static int test_init_from_config(void) _PyPreConfig preconfig = _PyPreConfig_INIT; putenv("PYTHONMALLOC=malloc_debug"); - preconfig.allocator = "malloc"; + preconfig.allocator = PYMEM_ALLOCATOR_MALLOC; putenv("PYTHONUTF8=0"); Py_UTF8Mode = 0; diff --git a/Python/coreconfig.c b/Python/coreconfig.c index c20ae2151c9c..634891ed2146 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -2021,26 +2021,22 @@ core_read_precmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) _PyPreConfig preconfig = _PyPreConfig_INIT; if (_PyPreConfig_Copy(&preconfig, &_PyRuntime.preconfig) < 0) { err = _Py_INIT_NO_MEMORY(); - goto done; + return err; } _PyCoreConfig_GetCoreConfig(&preconfig, config); err = _PyPreCmdline_Read(precmdline, &preconfig); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } if (_PyPreCmdline_SetCoreConfig(precmdline, config) < 0) { err = _Py_INIT_NO_MEMORY(); - goto done; + return err; } - err = _Py_INIT_OK(); - -done: - _PyPreConfig_Clear(&preconfig); - return err; + return _Py_INIT_OK(); } diff --git a/Python/preconfig.c b/Python/preconfig.c index 2d0ace5df295..2bbf8e6fb7fb 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -260,19 +260,9 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline, /* --- _PyPreConfig ----------------------------------------------- */ -void -_PyPreConfig_Clear(_PyPreConfig *config) -{ - PyMem_RawFree(config->allocator); - config->allocator = NULL; -} - - int _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) { - _PyPreConfig_Clear(config); - #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR #define COPY_STR_ATTR(ATTR) \ do { \ @@ -293,7 +283,7 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) COPY_ATTR(legacy_windows_fs_encoding); #endif COPY_ATTR(utf8_mode); - COPY_STR_ATTR(allocator); + COPY_ATTR(allocator); #undef COPY_ATTR #undef COPY_STR_ATTR @@ -341,7 +331,7 @@ _PyPreConfig_AsDict(const _PyPreConfig *config) SET_ITEM_INT(legacy_windows_fs_encoding); #endif SET_ITEM_INT(dev_mode); - SET_ITEM_STR(allocator); + SET_ITEM_INT(allocator); return dict; fail: @@ -616,25 +606,21 @@ preconfig_init_coerce_c_locale(_PyPreConfig *config) static _PyInitError preconfig_init_allocator(_PyPreConfig *config) { - if (config->allocator == NULL) { + if (config->allocator == PYMEM_ALLOCATOR_NOT_SET) { /* bpo-34247. The PYTHONMALLOC environment variable has the priority over PYTHONDEV env var and "-X dev" command line option. For example, PYTHONMALLOC=malloc PYTHONDEVMODE=1 sets the memory allocators to "malloc" (and not to "debug"). */ - const char *allocator = _Py_GetEnv(config->use_environment, "PYTHONMALLOC"); - if (allocator) { - config->allocator = _PyMem_RawStrdup(allocator); - if (config->allocator == NULL) { - return _Py_INIT_NO_MEMORY(); + const char *envvar = _Py_GetEnv(config->use_environment, "PYTHONMALLOC"); + if (envvar) { + if (_PyMem_GetAllocatorName(envvar, &config->allocator) < 0) { + return _Py_INIT_ERR("PYTHONMALLOC: unknown allocator"); } } } - if (config->dev_mode && config->allocator == NULL) { - config->allocator = _PyMem_RawStrdup("debug"); - if (config->allocator == NULL) { - return _Py_INIT_NO_MEMORY(); - } + if (config->dev_mode && config->allocator == PYMEM_ALLOCATOR_NOT_SET) { + config->allocator = PYMEM_ALLOCATOR_DEBUG; } return _Py_INIT_OK(); } @@ -815,7 +801,6 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) setlocale(LC_CTYPE, init_ctype_locale); PyMem_RawFree(init_ctype_locale); } - _PyPreConfig_Clear(&save_config); Py_UTF8Mode = init_utf8_mode ; #ifdef MS_WINDOWS Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; @@ -825,40 +810,6 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) } -static _PyInitError -_PyPreConfig_SetAllocator(_PyPreConfig *config) -{ - assert(!_PyRuntime.core_initialized); - - PyMemAllocatorEx old_alloc; - PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - - if (_PyMem_SetupAllocators(config->allocator) < 0) { - return _Py_INIT_ERR("Unknown PYTHONMALLOC allocator"); - } - - /* Copy the pre-configuration with the new allocator */ - _PyPreConfig config2 = _PyPreConfig_INIT; - if (_PyPreConfig_Copy(&config2, config) < 0) { - _PyPreConfig_Clear(&config2); - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - return _Py_INIT_NO_MEMORY(); - } - - /* Free the old config and replace config with config2. Since config now - owns the data, don't free config2. */ - PyMemAllocatorEx new_alloc; - PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &new_alloc); - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyPreConfig_Clear(config); - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &new_alloc); - - *config = config2; - - return _Py_INIT_OK(); -} - - /* Write the pre-configuration: - set the memory allocators @@ -872,7 +823,7 @@ _PyPreConfig_SetAllocator(_PyPreConfig *config) Do nothing if called after Py_Initialize(): ignore the new pre-configuration. */ _PyInitError -_PyPreConfig_Write(_PyPreConfig *config) +_PyPreConfig_Write(const _PyPreConfig *config) { if (_PyRuntime.core_initialized) { /* bpo-34008: Calling this functions after Py_Initialize() ignores @@ -880,10 +831,9 @@ _PyPreConfig_Write(_PyPreConfig *config) return _Py_INIT_OK(); } - if (config->allocator != NULL) { - _PyInitError err = _PyPreConfig_SetAllocator(config); - if (_Py_INIT_FAILED(err)) { - return err; + if (config->allocator != PYMEM_ALLOCATOR_NOT_SET) { + if (_PyMem_SetupAllocators(config->allocator) < 0) { + return _Py_INIT_ERR("Unknown PYTHONMALLOC allocator"); } } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index e89152637fe1..eecb439a11d7 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -706,26 +706,22 @@ _Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args) if (src_config) { if (_PyPreConfig_Copy(&config, src_config) < 0) { err = _Py_INIT_NO_MEMORY(); - goto done; + return err; } } err = _PyPreConfig_Read(&config, args); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } err = _PyPreConfig_Write(&config); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } runtime->pre_initialized = 1; - err = _Py_INIT_OK(); - -done: - _PyPreConfig_Clear(&config); - return err; + return _Py_INIT_OK(); } diff --git a/Python/pystate.c b/Python/pystate.c index 67315756ab70..8c906ce87ad4 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -106,8 +106,6 @@ _PyRuntimeState_Fini(_PyRuntimeState *runtime) runtime->xidregistry.mutex = NULL; } - _PyPreConfig_Clear(&runtime->preconfig); - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } From webhook-mailer at python.org Fri May 17 13:01:23 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 17:01:23 -0000 Subject: [Python-checkins] bpo-36763: Add _PyCoreConfig_InitPythonConfig() (GH-13388) Message-ID: https://github.com/python/cpython/commit/cab5d0741ee6adf2ae9ff5aaafe06b75b4b5bca3 commit: cab5d0741ee6adf2ae9ff5aaafe06b75b4b5bca3 branch: master author: Victor Stinner committer: GitHub date: 2019-05-17T19:01:14+02:00 summary: bpo-36763: Add _PyCoreConfig_InitPythonConfig() (GH-13388) Add new functions to get the Python interpreter behavior: * _PyPreConfig_InitPythonConfig() * _PyCoreConfig_InitPythonConfig() Add new functions to get an isolated configuration: * _PyPreConfig_InitIsolatedConfig() * _PyCoreConfig_InitIsolatedConfig() Replace _PyPreConfig_INIT and _PyCoreConfig_INIT with new functions _PyPreConfig_Init() and _PyCoreConfig_Init(). _PyCoreConfig: set configure_c_stdio and parse_argv to 0 by default to behave as Python 3.6 in the default configuration. _PyCoreConfig_Read() no longer sets coerce_c_locale_warn to 1 if it's equal to 0. coerce_c_locale_warn must now be set to -1 (ex: using _PyCoreConfig_InitPythonConfig()) to enable C locale coercion warning. Add unit tests for _PyCoreConfig_InitPythonConfig() and _PyCoreConfig_InitIsolatedConfig(). Changes: * Rename _PyCoreConfig_GetCoreConfig() to _PyPreConfig_GetCoreConfig() * Fix core_read_precmdline(): handle parse_argv=0 * Fix _Py_PreInitializeFromCoreConfig(): pass coreconfig.argv to _Py_PreInitializeFromPyArgv(), except if parse_argv=0 files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Lib/test/test_embed.py M Modules/main.c M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/coreconfig.c M Python/frozenmain.c M Python/pathconfig.c M Python/preconfig.c M Python/pylifecycle.c M Python/pystate.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index dca41341dfe4..7d561ceb3eec 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -86,12 +86,18 @@ typedef struct { If it is equal to 1, LC_CTYPE locale is read to decide it it should be coerced or not (ex: PYTHONCOERCECLOCALE=1). Internally, it is set to 2 - if the LC_CTYPE locale must be coerced. */ + if the LC_CTYPE locale must be coerced. + + Disable by default (set to 0). Set it to -1 to let Python decides if it + should be enabled or not. */ int coerce_c_locale; /* Emit a warning if the LC_CTYPE locale is coerced? - Disabled by default. Set to 1 by PYTHONCOERCECLOCALE=warn. */ + Set to 1 by PYTHONCOERCECLOCALE=warn. + + Disable by default (set to 0). Set it to -1 to let Python decides if it + should be enabled or not. */ int coerce_c_locale_warn; #ifdef MS_WINDOWS @@ -116,7 +122,10 @@ typedef struct { Set to 0 by "-X utf8=0" and PYTHONUTF8=0. If equals to -1, it is set to 1 if the LC_CTYPE locale is "C" or - "POSIX", otherwise inherit Py_UTF8Mode value. */ + "POSIX", otherwise it is set to 0. + + If equals to -2, inherit Py_UTF8Mode value value (which is equal to 0 + by default). */ int utf8_mode; int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ @@ -138,9 +147,14 @@ typedef struct { ._config_version = _Py_CONFIG_VERSION, \ .isolated = -1, \ .use_environment = -1, \ + .utf8_mode = -2, \ .dev_mode = -1, \ .allocator = PYMEM_ALLOCATOR_NOT_SET} +PyAPI_FUNC(void) _PyPreConfig_Init(_PyPreConfig *config); +PyAPI_FUNC(void) _PyPreConfig_InitPythonConfig(_PyPreConfig *config); +PyAPI_FUNC(void) _PyPreConfig_InitIsolateConfig(_PyPreConfig *config); + /* --- _PyCoreConfig ---------------------------------------------- */ @@ -213,8 +227,8 @@ typedef struct { /* Command line arguments (sys.argv). - By default, Python command line arguments are parsed and then stripped - from argv. Set parse_argv to 0 to avoid that. + Set parse_argv to 1 to parse argv as Python command line arguments + and then strip Python arguments from argv. If argv is empty, an empty string is added to ensure that sys.argv always exists and is never empty. */ @@ -442,7 +456,7 @@ typedef struct { .faulthandler = -1, \ .tracemalloc = -1, \ .use_module_search_paths = 0, \ - .parse_argv = 1, \ + .parse_argv = 0, \ .site_import = -1, \ .bytes_warning = -1, \ .inspect = -1, \ @@ -453,7 +467,7 @@ typedef struct { .verbose = -1, \ .quiet = -1, \ .user_site_directory = -1, \ - .configure_c_stdio = 1, \ + .configure_c_stdio = 0, \ .buffered_stdio = -1, \ ._install_importlib = 1, \ .check_hash_pycs_mode = NULL, \ @@ -461,6 +475,10 @@ typedef struct { ._init_main = 1} /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ +PyAPI_FUNC(void) _PyCoreConfig_Init(_PyCoreConfig *config); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitIsolateConfig(_PyCoreConfig *config); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index ccb7948ef4d4..e9c6d9fee817 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -88,10 +88,13 @@ PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, /* --- _PyPreConfig ----------------------------------------------- */ +PyAPI_FUNC(void) _PyPreConfig_Init(_PyPreConfig *config); +PyAPI_FUNC(void) _PyPreConfig_InitPythonConfig(_PyPreConfig *config); +PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config); PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2); PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); -PyAPI_FUNC(void) _PyCoreConfig_GetCoreConfig(_PyPreConfig *config, +PyAPI_FUNC(void) _PyPreConfig_GetCoreConfig(_PyPreConfig *config, const _PyCoreConfig *core_config); PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args); @@ -101,6 +104,8 @@ PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(const _PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_Copy( _PyCoreConfig *config, const _PyCoreConfig *config2); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 92cc405859c9..50badd8e585c 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -307,7 +307,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'pycache_prefix': None, 'program_name': GET_DEFAULT_CONFIG, - 'parse_argv': 1, + 'parse_argv': 0, 'argv': [""], 'xoptions': [], @@ -333,7 +333,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'verbose': 0, 'quiet': 0, 'user_site_directory': 1, - 'configure_c_stdio': 1, + 'configure_c_stdio': 0, 'buffered_stdio': 1, 'stdio_encoding': GET_DEFAULT_CONFIG, @@ -588,6 +588,7 @@ def test_init_from_config(self): 'pycache_prefix': 'conf_pycache_prefix', 'program_name': './conf_program_name', 'argv': ['-c', 'arg2'], + 'parse_argv': 1, 'xoptions': ['core_xoption1=3', 'core_xoption2=', 'core_xoption3'], 'warnoptions': ['error::ResourceWarning', 'default::BytesWarning'], 'run_command': 'pass\n', @@ -600,7 +601,7 @@ def test_init_from_config(self): 'write_bytecode': 0, 'verbose': 1, 'quiet': 1, - 'configure_c_stdio': 0, + 'configure_c_stdio': 1, 'buffered_stdio': 0, 'user_site_directory': 0, 'faulthandler': 1, @@ -661,14 +662,14 @@ def test_init_dev_mode(self): } self.check_config("init_dev_mode", config, preconfig) - def test_init_isolated(self): + def test_init_isolated_flag(self): preconfig = {} config = { 'isolated': 1, 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("init_isolated", config, preconfig) + self.check_config("init_isolated_flag", config, preconfig) def test_preinit_isolated1(self): # _PyPreConfig.isolated=1, _PyCoreConfig.isolated not set @@ -690,6 +691,25 @@ def test_preinit_isolated2(self): } self.check_config("preinit_isolated2", config, preconfig) + def test_init_isolated_config(self): + preconfig = {} + config = { + 'isolated': 1, + 'use_environment': 0, + 'user_site_directory': 0, + 'install_signal_handlers': 0, + 'pathconfig_warnings': 0, + } + self.check_config("init_isolated_config", config, preconfig) + + def test_init_python_config(self): + preconfig = {} + config = { + 'configure_c_stdio': 1, + 'parse_argv': 1, + } + self.check_config("init_python_config", config, preconfig) + def test_init_read_set(self): preconfig = {} core_config = { @@ -707,6 +727,7 @@ def test_init_run_main(self): 'argv': ['-c', 'arg2'], 'program_name': './python3', 'run_command': code + '\n', + 'parse_argv': 1, } self.check_config("init_run_main", core_config, preconfig) @@ -718,15 +739,26 @@ def test_init_main(self): 'argv': ['-c', 'arg2'], 'program_name': './python3', 'run_command': code + '\n', + 'parse_argv': 1, '_init_main': 0, } self.check_config("init_main", core_config, preconfig, stderr="Run Python code before _Py_InitializeMain") + def test_init_parse_argv(self): + core_config = { + 'argv': ['-c', 'arg1', '-v', 'arg3'], + 'program_name': './argv0', + 'parse_argv': 1, + 'run_command': 'pass\n', + 'use_environment': 0, + } + self.check_config("init_parse_argv", core_config, {}) + def test_init_dont_parse_argv(self): core_config = { - 'argv': ['-v', '-c', 'arg1', '-W', 'arg2'], - 'parse_argv': 0, + 'argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], + 'program_name': './argv0', } self.check_config("init_dont_parse_argv", core_config, {}) diff --git a/Modules/main.c b/Modules/main.c index bb103c28a3e2..72546a21cac4 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -52,23 +52,28 @@ pymain_init(const _PyArgv *args) fedisableexcept(FE_OVERFLOW); #endif - _PyPreConfig preconfig = _PyPreConfig_INIT; - /* Set to -1 to enable them depending on the LC_CTYPE locale and the - environment variables (PYTHONUTF8 and PYTHONCOERCECLOCALE) */ - preconfig.coerce_c_locale = -1; - preconfig.utf8_mode = -1; + _PyPreConfig preconfig; + _PyPreConfig_InitPythonConfig(&preconfig); err = _Py_PreInitializeFromPyArgv(&preconfig, args); if (_Py_INIT_FAILED(err)) { return err; } + _PyCoreConfig config; + err = _PyCoreConfig_InitPythonConfig(&config); + if (_Py_INIT_FAILED(err)) { + return err; + } + /* pass NULL as the config: config is read from command line arguments, environment variables, configuration files */ if (args->use_bytes_argv) { - return _Py_InitializeFromArgs(NULL, args->argc, args->bytes_argv); + return _Py_InitializeFromArgs(&config, + args->argc, args->bytes_argv); } else { - return _Py_InitializeFromWideArgs(NULL, args->argc, args->wchar_argv); + return _Py_InitializeFromWideArgs(&config, + args->argc, args->wchar_argv); } } diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 8cbbe17cfaf1..bc29297a6b9d 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -76,7 +76,8 @@ main(int argc, char *argv[]) } text[text_size] = '\0'; - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); config.use_environment = 0; config.user_site_directory = 0; config.site_import = 0; diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3327c8ce6639..e6896966f53b 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -291,7 +291,9 @@ static int test_initialize_twice(void) static int test_initialize_pymain(void) { wchar_t *argv[] = {L"PYTHON", L"-c", - L"import sys; print(f'Py_Main() after Py_Initialize: sys.argv={sys.argv}')", + (L"import sys; " + L"print(f'Py_Main() after Py_Initialize: " + L"sys.argv={sys.argv}')"), L"arg2"}; _testembed_Py_Initialize(); @@ -376,7 +378,8 @@ static int test_init_from_config(void) { _PyInitError err; - _PyPreConfig preconfig = _PyPreConfig_INIT; + _PyPreConfig preconfig; + _PyPreConfig_Init(&preconfig); putenv("PYTHONMALLOC=malloc_debug"); preconfig.allocator = PYMEM_ALLOCATOR_MALLOC; @@ -391,7 +394,8 @@ static int test_init_from_config(void) } /* Test _Py_InitializeFromConfig() */ - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); config.install_signal_handlers = 0; /* FIXME: test use_environment */ @@ -400,7 +404,7 @@ static int test_init_from_config(void) config.use_hash_seed = 1; config.hash_seed = 123; - /* dev_mode=1 is tested in test_init_dev_mode() */ + /* dev_mode=1 is tested in init_dev_mode() */ putenv("PYTHONFAULTHANDLER="); config.faulthandler = 1; @@ -432,6 +436,7 @@ static int test_init_from_config(void) }; config.argv.length = Py_ARRAY_LENGTH(argv); config.argv.items = argv; + config.parse_argv = 1; static wchar_t* xoptions[3] = { L"core_xoption1=3", @@ -481,7 +486,7 @@ static int test_init_from_config(void) Py_QuietFlag = 0; config.quiet = 1; - config.configure_c_stdio = 0; + config.configure_c_stdio = 1; putenv("PYTHONUNBUFFERED="); Py_UnbufferedStdioFlag = 0; @@ -516,25 +521,26 @@ static int test_init_from_config(void) } -static int test_init_dont_parse_argv(void) +static int test_init_parse_argv(int parse_argv) { _PyInitError err; - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); static wchar_t* argv[] = { - L"-v", + L"./argv0", + L"-E", L"-c", + L"pass", L"arg1", - L"-W", - L"arg2", + L"-v", + L"arg3", }; - config.program_name = L"./_testembed"; - config.argv.length = Py_ARRAY_LENGTH(argv); config.argv.items = argv; - config.parse_argv = 0; + config.parse_argv = parse_argv; err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { @@ -546,6 +552,18 @@ static int test_init_dont_parse_argv(void) } +static int init_parse_argv(void) +{ + return test_init_parse_argv(1); +} + + +static int init_dont_parse_argv(void) +{ + return test_init_parse_argv(0); +} + + static void test_init_env_putenvs(void) { putenv("PYTHONHASHSEED=42"); @@ -619,12 +637,13 @@ static int test_init_env_dev_mode_alloc(void) } -static int test_init_isolated(void) +static int init_isolated_flag(void) { _PyInitError err; /* Test _PyCoreConfig.isolated=1 */ - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); Py_IsolatedFlag = 0; config.isolated = 1; @@ -648,7 +667,8 @@ static int test_preinit_isolated1(void) { _PyInitError err; - _PyPreConfig preconfig = _PyPreConfig_INIT; + _PyPreConfig preconfig; + _PyPreConfig_Init(&preconfig); preconfig.isolated = 1; err = _Py_PreInitialize(&preconfig); @@ -656,7 +676,8 @@ static int test_preinit_isolated1(void) _Py_ExitInitError(err); } - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); config.program_name = L"./_testembed"; test_init_env_dev_mode_putenvs(); @@ -675,7 +696,8 @@ static int test_preinit_isolated2(void) { _PyInitError err; - _PyPreConfig preconfig = _PyPreConfig_INIT; + _PyPreConfig preconfig; + _PyPreConfig_Init(&preconfig); preconfig.isolated = 0; err = _Py_PreInitialize(&preconfig); @@ -684,7 +706,8 @@ static int test_preinit_isolated2(void) } /* Test _PyCoreConfig.isolated=1 */ - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); Py_IsolatedFlag = 0; config.isolated = 1; @@ -703,9 +726,72 @@ static int test_preinit_isolated2(void) } -static int test_init_dev_mode(void) +static int init_isolated_config(void) +{ + _PyInitError err; + + _PyPreConfig preconfig; + _PyPreConfig_InitIsolatedConfig(&preconfig); + + err = _Py_PreInitialize(&preconfig); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + _PyPreConfig *rt_preconfig = &_PyRuntime.preconfig; + assert(rt_preconfig->isolated == 1); + assert(rt_preconfig->use_environment == 0); + + _PyCoreConfig config; + err = _PyCoreConfig_InitIsolatedConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + config.program_name = L"./_testembed"; + + err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + dump_config(); + Py_Finalize(); + return 0; +} + + +static int init_python_config(void) +{ + _PyInitError err; + + _PyPreConfig preconfig; + _PyPreConfig_InitPythonConfig(&preconfig); + + err = _Py_PreInitialize(&preconfig); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + _PyCoreConfig config; + err = _PyCoreConfig_InitPythonConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + config.program_name = L"./_testembed"; + + err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + dump_config(); + Py_Finalize(); + return 0; +} + + +static int init_dev_mode(void) { - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); putenv("PYTHONFAULTHANDLER="); putenv("PYTHONMALLOC="); config.dev_mode = 1; @@ -723,7 +809,8 @@ static int test_init_dev_mode(void) static int test_init_read_set(void) { _PyInitError err; - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); err = _PyCoreConfig_DecodeLocale(&config.program_name, "./init_read_set"); if (_Py_INIT_FAILED(err)) { @@ -772,13 +859,15 @@ static void configure_init_main(_PyCoreConfig *config) { config->argv.length = Py_ARRAY_LENGTH(init_main_argv); config->argv.items = init_main_argv; + config->parse_argv = 1; config->program_name = L"./python3"; } static int test_init_run_main(void) { - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); configure_init_main(&config); _PyInitError err = _Py_InitializeFromConfig(&config); @@ -792,7 +881,8 @@ static int test_init_run_main(void) static int test_init_main(void) { - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); configure_init_main(&config); config._init_main = 0; @@ -821,7 +911,8 @@ static int test_init_main(void) static int test_run_main(void) { - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); wchar_t *argv[] = {L"python3", L"-c", (L"import sys; " @@ -829,6 +920,7 @@ static int test_run_main(void) L"arg2"}; config.argv.length = Py_ARRAY_LENGTH(argv); config.argv.items = argv; + config.parse_argv = 1; config.program_name = L"./python3"; _PyInitError err = _Py_InitializeFromConfig(&config); @@ -869,12 +961,15 @@ static struct TestCase TestCases[] = { { "init_default_config", test_init_default_config }, { "init_global_config", test_init_global_config }, { "init_from_config", test_init_from_config }, - { "init_dont_parse_argv", test_init_dont_parse_argv }, + { "init_parse_argv", init_parse_argv }, + { "init_dont_parse_argv", init_dont_parse_argv }, { "init_env", test_init_env }, { "init_env_dev_mode", test_init_env_dev_mode }, { "init_env_dev_mode_alloc", test_init_env_dev_mode_alloc }, - { "init_dev_mode", test_init_dev_mode }, - { "init_isolated", test_init_isolated }, + { "init_dev_mode", init_dev_mode }, + { "init_isolated_flag", init_isolated_flag }, + { "init_isolated_config", init_isolated_config }, + { "init_python_config", init_python_config }, { "preinit_isolated1", test_preinit_isolated1 }, { "preinit_isolated2", test_preinit_isolated2 }, { "init_read_set", test_init_read_set }, diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 634891ed2146..2e8f4cf6f102 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -109,7 +109,7 @@ static const char usage_6[] = /* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change stdin and stdout error handler to "surrogateescape". It is equal to -1 by default: unknown, will be set by Py_Main() */ -int Py_UTF8Mode = -1; +int Py_UTF8Mode = 0; int Py_DebugFlag = 0; /* Needed by parser.c */ int Py_VerboseFlag = 0; /* Needed by import.c */ int Py_QuietFlag = 0; /* Needed by sysmodule.c */ @@ -520,6 +520,61 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) } +void +_PyCoreConfig_Init(_PyCoreConfig *config) +{ + *config = _PyCoreConfig_INIT; +} + + +_PyInitError +_PyCoreConfig_InitPythonConfig(_PyCoreConfig *config) +{ + _PyCoreConfig_Init(config); + + config->configure_c_stdio = 1; + config->parse_argv = 1; + + return _Py_INIT_OK(); +} + + +_PyInitError +_PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config) +{ + _PyCoreConfig_Init(config); + + /* set to 1 */ + config->isolated = 1; + config->site_import = 1; + config->write_bytecode = 1; + config->buffered_stdio = 1; + + /* set to 0 */ + config->use_environment = 0; + config->dev_mode = 0; + config->install_signal_handlers = 0; + config->use_hash_seed = 0; + config->faulthandler = 0; + config->tracemalloc = 0; + config->bytes_warning = 0; + config->inspect = 0; + config->interactive = 0; + config->optimization_level = 0; + config->parser_debug = 0; + config->verbose = 0; + config->quiet = 0; + config->user_site_directory = 0; + config->configure_c_stdio = 0; + config->pathconfig_warnings = 0; +#ifdef MS_WINDOWS + config->legacy_windows_stdio = 0; +#endif + + return _Py_INIT_OK(); +} + + /* Copy str into *config_str (duplicate the string) */ _PyInitError _PyCoreConfig_SetString(wchar_t **config_str, const wchar_t *str) @@ -2014,17 +2069,20 @@ core_read_precmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) { _PyInitError err; - if (_PyWstrList_Copy(&precmdline->argv, &config->argv) < 0) { - return _Py_INIT_NO_MEMORY(); + if (config->parse_argv) { + if (_PyWstrList_Copy(&precmdline->argv, &config->argv) < 0) { + return _Py_INIT_NO_MEMORY(); + } } - _PyPreConfig preconfig = _PyPreConfig_INIT; + _PyPreConfig preconfig; + _PyPreConfig_Init(&preconfig); if (_PyPreConfig_Copy(&preconfig, &_PyRuntime.preconfig) < 0) { err = _Py_INIT_NO_MEMORY(); return err; } - _PyCoreConfig_GetCoreConfig(&preconfig, config); + _PyPreConfig_GetCoreConfig(&preconfig, config); err = _PyPreCmdline_Read(precmdline, &preconfig); if (_Py_INIT_FAILED(err)) { @@ -2155,6 +2213,7 @@ _PyInitError _PyCoreConfig_Read(_PyCoreConfig *config) { _PyInitError err; + _PyWstrList orig_argv = _PyWstrList_INIT; err = _Py_PreInitializeFromCoreConfig(config, NULL); if (_Py_INIT_FAILED(err)) { @@ -2163,6 +2222,10 @@ _PyCoreConfig_Read(_PyCoreConfig *config) _PyCoreConfig_GetGlobalConfig(config); + if (_PyWstrList_Copy(&orig_argv, &config->argv) < 0) { + return _Py_INIT_NO_MEMORY(); + } + _PyPreCmdline precmdline = _PyPreCmdline_INIT; err = core_read_precmdline(config, &precmdline); if (_Py_INIT_FAILED(err)) { @@ -2185,10 +2248,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config) goto done; } - /* precmdline.argv is a copy of config.argv which is modified - by config_read_cmdline() */ - const _PyWstrList *argv = &precmdline.argv; - if (_Py_SetArgcArgv(argv->length, argv->items) < 0) { + if (_Py_SetArgcArgv(orig_argv.length, orig_argv.items) < 0) { err = _Py_INIT_NO_MEMORY(); goto done; } @@ -2249,6 +2309,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config) err = _Py_INIT_OK(); done: + _PyWstrList_Clear(&orig_argv); _PyPreCmdline_Clear(&precmdline); return err; } diff --git a/Python/frozenmain.c b/Python/frozenmain.c index f2499ef84cd9..0175e42596b8 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -39,7 +39,8 @@ Py_FrozenMain(int argc, char **argv) } } - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */ if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 2fcb81605805..c8c69ebad6a0 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -392,7 +392,8 @@ pathconfig_global_init(void) } _PyInitError err; - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); err = _PyCoreConfig_Read(&config); if (_Py_INIT_FAILED(err)) { diff --git a/Python/preconfig.c b/Python/preconfig.c index 2bbf8e6fb7fb..7814ee08a63f 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -260,6 +260,42 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline, /* --- _PyPreConfig ----------------------------------------------- */ +void +_PyPreConfig_Init(_PyPreConfig *config) +{ + *config = _PyPreConfig_INIT; +} + + +void +_PyPreConfig_InitPythonConfig(_PyPreConfig *config) +{ + _PyPreConfig_Init(config); + + /* Set to -1 to enable C locale coercion (PEP 538) and UTF-8 Mode (PEP 540) + depending on the LC_CTYPE locale, PYTHONUTF8 and PYTHONCOERCECLOCALE + environment variables. */ + config->coerce_c_locale = -1; + config->coerce_c_locale_warn = -1; + config->utf8_mode = -1; +} + + +void +_PyPreConfig_InitIsolatedConfig(_PyPreConfig *config) +{ + _PyPreConfig_Init(config); + + config->isolated = 1; + config->use_environment = 0; +#ifdef MS_WINDOWS + config->legacy_windows_fs_encoding = 0; +#endif + config->utf8_mode = 0; + config->dev_mode = 0; +} + + int _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) { @@ -346,7 +382,7 @@ _PyPreConfig_AsDict(const _PyPreConfig *config) void -_PyCoreConfig_GetCoreConfig(_PyPreConfig *config, +_PyPreConfig_GetCoreConfig(_PyPreConfig *config, const _PyCoreConfig *core_config) { #define COPY_ATTR(ATTR) \ @@ -366,11 +402,11 @@ static void _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) { #define COPY_FLAG(ATTR, VALUE) \ - if (config->ATTR == -1) { \ + if (config->ATTR < 0) { \ config->ATTR = VALUE; \ } #define COPY_NOT_FLAG(ATTR, VALUE) \ - if (config->ATTR == -1) { \ + if (config->ATTR < 0) { \ config->ATTR = !(VALUE); \ } @@ -379,8 +415,8 @@ _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); #endif - if (Py_UTF8Mode > 0) { - config->utf8_mode = 1; + if (config->utf8_mode == -2) { + config->utf8_mode = Py_UTF8Mode; } #undef COPY_FLAG @@ -392,11 +428,11 @@ static void _PyPreConfig_SetGlobalConfig(const _PyPreConfig *config) { #define COPY_FLAG(ATTR, VAR) \ - if (config->ATTR != -1) { \ + if (config->ATTR >= 0) { \ VAR = config->ATTR; \ } #define COPY_NOT_FLAG(ATTR, VAR) \ - if (config->ATTR != -1) { \ + if (config->ATTR >= 0) { \ VAR = !config->ATTR; \ } @@ -575,7 +611,9 @@ preconfig_init_coerce_c_locale(_PyPreConfig *config) } } else if (strcmp(env, "warn") == 0) { - config->coerce_c_locale_warn = 1; + if (config->coerce_c_locale_warn < 0) { + config->coerce_c_locale_warn = 1; + } } else { if (config->coerce_c_locale < 0) { @@ -587,19 +625,19 @@ preconfig_init_coerce_c_locale(_PyPreConfig *config) /* Test if coerce_c_locale equals to -1 or equals to 1: PYTHONCOERCECLOCALE=1 doesn't imply that the C locale is always coerced. It is only coerced if if the LC_CTYPE locale is "C". */ - if (config->coerce_c_locale == 0 || config->coerce_c_locale == 2) { - return; + if (config->coerce_c_locale < 0 || config->coerce_c_locale == 1) { + /* The C locale enables the C locale coercion (PEP 538) */ + if (_Py_LegacyLocaleDetected()) { + config->coerce_c_locale = 2; + } + else { + config->coerce_c_locale = 0; + } } - /* The C locale enables the C locale coercion (PEP 538) */ - if (_Py_LegacyLocaleDetected()) { - config->coerce_c_locale = 2; + if (config->coerce_c_locale_warn < 0) { + config->coerce_c_locale_warn = 0; } - else { - config->coerce_c_locale = 0; - } - - assert(config->coerce_c_locale >= 0); } @@ -659,6 +697,7 @@ preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) } assert(config->coerce_c_locale >= 0); + assert(config->coerce_c_locale_warn >= 0); #ifdef MS_WINDOWS assert(config->legacy_windows_fs_encoding >= 0); #endif @@ -700,7 +739,8 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) } /* Save the config to be able to restore it if encodings change */ - _PyPreConfig save_config = _PyPreConfig_INIT; + _PyPreConfig save_config; + _PyPreConfig_Init(&save_config); if (_PyPreConfig_Copy(&save_config, config) < 0) { return _Py_INIT_NO_MEMORY(); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index eecb439a11d7..231706d2ab60 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -701,7 +701,8 @@ _Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args) return _Py_INIT_OK(); } - _PyPreConfig config = _PyPreConfig_INIT; + _PyPreConfig config; + _PyPreConfig_Init(&config); if (src_config) { if (_PyPreConfig_Copy(&config, src_config) < 0) { @@ -752,13 +753,22 @@ _PyInitError _Py_PreInitializeFromCoreConfig(const _PyCoreConfig *coreconfig, const _PyArgv *args) { - _PyPreConfig config = _PyPreConfig_INIT; + _PyPreConfig config; + _PyPreConfig_Init(&config); if (coreconfig != NULL) { - _PyCoreConfig_GetCoreConfig(&config, coreconfig); + _PyPreConfig_GetCoreConfig(&config, coreconfig); + } + + if (args == NULL && coreconfig != NULL && coreconfig->parse_argv) { + _PyArgv config_args = { + .use_bytes_argv = 0, + .argc = coreconfig->argv.length, + .wchar_argv = coreconfig->argv.items}; + return _Py_PreInitializeFromPyArgv(&config, &config_args); + } + else { + return _Py_PreInitializeFromPyArgv(&config, args); } - return _Py_PreInitializeFromPyArgv(&config, args); - /* No need to clear config: - _PyCoreConfig_GetCoreConfig() doesn't allocate memory */ } @@ -829,7 +839,8 @@ _Py_InitializeCore(_PyRuntimeState *runtime, return err; } - _PyCoreConfig local_config = _PyCoreConfig_INIT; + _PyCoreConfig local_config; + _PyCoreConfig_Init(&local_config); err = pyinit_coreconfig(runtime, &local_config, src_config, args, interp_p); _PyCoreConfig_Clear(&local_config); return err; @@ -1051,7 +1062,8 @@ Py_InitializeEx(int install_sigs) return; } - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_Init(&config); config.install_signal_handlers = install_sigs; err = _Py_InitializeFromConfig(&config); diff --git a/Python/pystate.c b/Python/pystate.c index 8c906ce87ad4..2f80aa253b5a 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -49,7 +49,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) _PyGC_Initialize(&runtime->gc); _PyEval_Initialize(&runtime->ceval); - runtime->preconfig = _PyPreConfig_INIT; + _PyPreConfig_Init(&runtime->preconfig); runtime->gilstate.check_enabled = 1; @@ -189,7 +189,7 @@ PyInterpreterState_New(void) memset(interp, 0, sizeof(*interp)); interp->id_refcount = -1; interp->check_interval = 100; - interp->core_config = _PyCoreConfig_INIT; + _PyCoreConfig_Init(&interp->core_config); interp->eval_frame = _PyEval_EvalFrameDefault; #ifdef HAVE_DLOPEN #if HAVE_DECL_RTLD_NOW From webhook-mailer at python.org Fri May 17 13:07:29 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 17 May 2019 17:07:29 -0000 Subject: [Python-checkins] bpo-36941: Windows build changes for Windows ARM64 (GH-13365) Message-ID: https://github.com/python/cpython/commit/f96e7fd9240c1ce13f52bd3ba81f58b2511d89c3 commit: f96e7fd9240c1ce13f52bd3ba81f58b2511d89c3 branch: master author: Paul Monson committer: Steve Dower date: 2019-05-17T10:07:24-07:00 summary: bpo-36941: Windows build changes for Windows ARM64 (GH-13365) files: M .gitignore M PCbuild/_asyncio.vcxproj M PCbuild/_bz2.vcxproj M PCbuild/_ctypes.vcxproj M PCbuild/_ctypes_test.vcxproj M PCbuild/_decimal.vcxproj M PCbuild/_elementtree.vcxproj M PCbuild/_freeze_importlib.vcxproj M PCbuild/_hashlib.vcxproj M PCbuild/_lzma.vcxproj M PCbuild/_msi.vcxproj M PCbuild/_multiprocessing.vcxproj M PCbuild/_overlapped.vcxproj M PCbuild/_queue.vcxproj M PCbuild/_socket.vcxproj M PCbuild/_sqlite3.vcxproj M PCbuild/_ssl.vcxproj M PCbuild/_testbuffer.vcxproj M PCbuild/_testcapi.vcxproj M PCbuild/_testconsole.vcxproj M PCbuild/_testembed.vcxproj M PCbuild/_testimportmultiple.vcxproj M PCbuild/_testinternalcapi.vcxproj M PCbuild/_testmultiphase.vcxproj M PCbuild/_tkinter.vcxproj M PCbuild/build.bat M PCbuild/liblzma.vcxproj M PCbuild/pcbuild.proj M PCbuild/pcbuild.sln M PCbuild/prepare_libffi.bat M PCbuild/pyexpat.vcxproj M PCbuild/pylauncher.vcxproj M PCbuild/pyproject.props M PCbuild/pyshellext.vcxproj M PCbuild/python.props M PCbuild/python.vcxproj M PCbuild/python3dll.vcxproj M PCbuild/pythoncore.vcxproj M PCbuild/pythonw.vcxproj M PCbuild/pywlauncher.vcxproj M PCbuild/select.vcxproj M PCbuild/sqlite3.vcxproj M PCbuild/unicodedata.vcxproj M PCbuild/venvlauncher.vcxproj M PCbuild/venvwlauncher.vcxproj M PCbuild/winsound.vcxproj M PCbuild/xxlimited.vcxproj diff --git a/.gitignore b/.gitignore index 9e60f5a20690..e3c580957923 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,7 @@ PCbuild/*.VC.opendb PCbuild/.vs/ PCbuild/amd64/ PCbuild/arm32/ +PCbuild/arm64/ PCbuild/obj/ PCbuild/win32/ .purify diff --git a/PCbuild/_asyncio.vcxproj b/PCbuild/_asyncio.vcxproj index 86590dd2a8c8..ed1e1bc0a420 100644 --- a/PCbuild/_asyncio.vcxproj +++ b/PCbuild/_asyncio.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_bz2.vcxproj b/PCbuild/_bz2.vcxproj index 4d6683807d12..3fe95fbf8399 100644 --- a/PCbuild/_bz2.vcxproj +++ b/PCbuild/_bz2.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_ctypes.vcxproj b/PCbuild/_ctypes.vcxproj index a265427a6568..69e4271a9bd8 100644 --- a/PCbuild/_ctypes.vcxproj +++ b/PCbuild/_ctypes.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_ctypes_test.vcxproj b/PCbuild/_ctypes_test.vcxproj index 97a45ebbb30c..8a01e743a4d8 100644 --- a/PCbuild/_ctypes_test.vcxproj +++ b/PCbuild/_ctypes_test.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_decimal.vcxproj b/PCbuild/_decimal.vcxproj index fa4bb8d03160..465a7ade9a01 100644 --- a/PCbuild/_decimal.vcxproj +++ b/PCbuild/_decimal.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 @@ -80,6 +96,7 @@ _CRT_SECURE_NO_WARNINGS;MASM;%(PreprocessorDefinitions) CONFIG_32;PPRO;%(PreprocessorDefinitions) CONFIG_32;ANSI;%(PreprocessorDefinitions) + CONFIG_64;ANSI;%(PreprocessorDefinitions) CONFIG_64;%(PreprocessorDefinitions) ..\Modules\_decimal;..\Modules\_decimal\libmpdec;%(AdditionalIncludeDirectories) @@ -124,6 +141,7 @@ true true + true ml64 /nologo /c /Zi /Fo "$(IntDir)vcdiv64.obj" "%(FullPath)" $(IntDir)vcdiv64.obj;%(Outputs) diff --git a/PCbuild/_elementtree.vcxproj b/PCbuild/_elementtree.vcxproj index 46259913bc00..33a017327189 100644 --- a/PCbuild/_elementtree.vcxproj +++ b/PCbuild/_elementtree.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_freeze_importlib.vcxproj b/PCbuild/_freeze_importlib.vcxproj index 76885d8b354a..a0fe49c464d5 100644 --- a/PCbuild/_freeze_importlib.vcxproj +++ b/PCbuild/_freeze_importlib.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_hashlib.vcxproj b/PCbuild/_hashlib.vcxproj index 0f0223a5ff93..6dad8183c57a 100644 --- a/PCbuild/_hashlib.vcxproj +++ b/PCbuild/_hashlib.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_lzma.vcxproj b/PCbuild/_lzma.vcxproj index 61fe6b7601b3..fe076a6fc571 100644 --- a/PCbuild/_lzma.vcxproj +++ b/PCbuild/_lzma.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_msi.vcxproj b/PCbuild/_msi.vcxproj index 1362902d9916..9f089ac7f52f 100644 --- a/PCbuild/_msi.vcxproj +++ b/PCbuild/_msi.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM4 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_multiprocessing.vcxproj b/PCbuild/_multiprocessing.vcxproj index 0c8d06d11359..77b6bfc8e1e4 100644 --- a/PCbuild/_multiprocessing.vcxproj +++ b/PCbuild/_multiprocessing.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_overlapped.vcxproj b/PCbuild/_overlapped.vcxproj index 66e976b216c2..9e60d3b5db33 100644 --- a/PCbuild/_overlapped.vcxproj +++ b/PCbuild/_overlapped.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_queue.vcxproj b/PCbuild/_queue.vcxproj index 095de0aa459a..8065b2358516 100644 --- a/PCbuild/_queue.vcxproj +++ b/PCbuild/_queue.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_socket.vcxproj b/PCbuild/_socket.vcxproj index adeaf60b5706..9498abf8fb5e 100644 --- a/PCbuild/_socket.vcxproj +++ b/PCbuild/_socket.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_sqlite3.vcxproj b/PCbuild/_sqlite3.vcxproj index 558dc4750451..7e0062692b8f 100644 --- a/PCbuild/_sqlite3.vcxproj +++ b/PCbuild/_sqlite3.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_ssl.vcxproj b/PCbuild/_ssl.vcxproj index 522f80ab02f2..4907f49b6628 100644 --- a/PCbuild/_ssl.vcxproj +++ b/PCbuild/_ssl.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_testbuffer.vcxproj b/PCbuild/_testbuffer.vcxproj index 17f47e7134fe..917d7ae50feb 100644 --- a/PCbuild/_testbuffer.vcxproj +++ b/PCbuild/_testbuffer.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_testcapi.vcxproj b/PCbuild/_testcapi.vcxproj index 68149a9a5f01..c1a19437253b 100644 --- a/PCbuild/_testcapi.vcxproj +++ b/PCbuild/_testcapi.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_testconsole.vcxproj b/PCbuild/_testconsole.vcxproj index c457e8e6bd2d..5d7e14eff102 100644 --- a/PCbuild/_testconsole.vcxproj +++ b/PCbuild/_testconsole.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_testembed.vcxproj b/PCbuild/_testembed.vcxproj index 668acbe3647a..a7ea8787e0cc 100644 --- a/PCbuild/_testembed.vcxproj +++ b/PCbuild/_testembed.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_testimportmultiple.vcxproj b/PCbuild/_testimportmultiple.vcxproj index 5d825b39761d..6d80d5779f24 100644 --- a/PCbuild/_testimportmultiple.vcxproj +++ b/PCbuild/_testimportmultiple.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_testinternalcapi.vcxproj b/PCbuild/_testinternalcapi.vcxproj index 116d193a39cf..6c5b12cd40e9 100644 --- a/PCbuild/_testinternalcapi.vcxproj +++ b/PCbuild/_testinternalcapi.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_testmultiphase.vcxproj b/PCbuild/_testmultiphase.vcxproj index 8a185435f364..430eb528cc39 100644 --- a/PCbuild/_testmultiphase.vcxproj +++ b/PCbuild/_testmultiphase.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/_tkinter.vcxproj b/PCbuild/_tkinter.vcxproj index 2e2a3ecb4131..fdfa59648aa9 100644 --- a/PCbuild/_tkinter.vcxproj +++ b/PCbuild/_tkinter.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/build.bat b/PCbuild/build.bat index cd0c07abbf35..6f0c85e4a45a 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -35,13 +35,14 @@ echo. --test-marker Enable the test marker within the build. echo. echo.Available flags to avoid building certain modules. echo.These flags have no effect if '-e' is not given: +echo. --no-ctypes Do not attempt to build _ctypes echo. --no-ssl Do not attempt to build _ssl echo. --no-tkinter Do not attempt to build Tkinter echo. echo.Available arguments: echo. -c Release ^| Debug ^| PGInstrument ^| PGUpdate echo. Set the configuration (default: Release) -echo. -p x64 ^| Win32 ^| ARM +echo. -p x64 ^| Win32 ^| ARM ^| ARM64 echo. Set the platform (default: Win32) echo. -t Build ^| Rebuild ^| Clean ^| CleanAll echo. Set the target manually @@ -81,10 +82,12 @@ rem them in through the environment, but we specify them on the command line rem anyway for visibility so set defaults after this if "%~1"=="-e" (set IncludeExternals=true) & shift & goto CheckOpts if "%~1"=="-E" (set IncludeExternals=false) & shift & goto CheckOpts +if "%~1"=="--no-ctypes" (set IncludeCTypes=false) & shift & goto CheckOpts if "%~1"=="--no-ssl" (set IncludeSSL=false) & shift & goto CheckOpts if "%~1"=="--no-tkinter" (set IncludeTkinter=false) & shift & goto CheckOpts if "%IncludeExternals%"=="" set IncludeExternals=true +if "%IncludeCTypes%"=="" set IncludeCTypes=true if "%IncludeSSL%"=="" set IncludeSSL=true if "%IncludeTkinter%"=="" set IncludeTkinter=true @@ -139,6 +142,7 @@ echo on %MSBUILD% "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^ /p:Configuration=%conf% /p:Platform=%platf%^ /p:IncludeExternals=%IncludeExternals%^ + /p:IncludeCTypes=%IncludeCTypes%^ /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^ /p:UseTestMarker=%UseTestMarker% %GITProperty%^ %1 %2 %3 %4 %5 %6 %7 %8 %9 diff --git a/PCbuild/liblzma.vcxproj b/PCbuild/liblzma.vcxproj index c2a4a720d1f4..9ec062e5255f 100644 --- a/PCbuild/liblzma.vcxproj +++ b/PCbuild/liblzma.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -21,6 +25,18 @@ Release ARM + + PGInstrument + ARM64 + + + PGUpdate + ARM64 + + + Release + ARM64 + Release Win32 diff --git a/PCbuild/pcbuild.proj b/PCbuild/pcbuild.proj index d16ddef89f62..35f173ff864e 100644 --- a/PCbuild/pcbuild.proj +++ b/PCbuild/pcbuild.proj @@ -7,6 +7,7 @@ true true true + true true true false @@ -50,7 +51,8 @@ - + + @@ -70,7 +72,7 @@ - + diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln index 66be9ac7a4ad..dea6799a5e55 100644 --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -106,981 +106,1323 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 PGInstrument|ARM = PGInstrument|ARM + PGInstrument|ARM64 = PGInstrument|ARM64 PGInstrument|Win32 = PGInstrument|Win32 PGInstrument|x64 = PGInstrument|x64 PGUpdate|ARM = PGUpdate|ARM + PGUpdate|ARM64 = PGUpdate|ARM64 PGUpdate|Win32 = PGUpdate|Win32 PGUpdate|x64 = PGUpdate|x64 Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|ARM.ActiveCfg = Debug|ARM {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|ARM.Build.0 = Debug|ARM + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|ARM64.Build.0 = Debug|ARM64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.ActiveCfg = Debug|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.Build.0 = Debug|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.ActiveCfg = Debug|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.Build.0 = Debug|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.Build.0 = PGInstrument|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.Build.0 = PGUpdate|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|ARM.ActiveCfg = Release|ARM {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|ARM.Build.0 = Release|ARM + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|ARM64.ActiveCfg = Release|ARM64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|ARM64.Build.0 = Release|ARM64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.ActiveCfg = Release|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.Build.0 = Release|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.ActiveCfg = Release|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.Build.0 = Release|x64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|ARM.ActiveCfg = Debug|ARM {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|ARM.Build.0 = Debug|ARM + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|ARM64.Build.0 = Debug|ARM64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|Win32.ActiveCfg = Debug|Win32 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|Win32.Build.0 = Debug|Win32 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|x64.ActiveCfg = Debug|x64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|x64.Build.0 = Debug|x64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|x64.Build.0 = PGInstrument|x64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|x64.Build.0 = PGUpdate|x64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|ARM.ActiveCfg = Release|ARM {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|ARM.Build.0 = Release|ARM + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|ARM64.ActiveCfg = Release|ARM64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|ARM64.Build.0 = Release|ARM64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|Win32.ActiveCfg = Release|Win32 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|Win32.Build.0 = Release|Win32 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|x64.ActiveCfg = Release|x64 {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|x64.Build.0 = Release|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|ARM.ActiveCfg = Debug|ARM {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|ARM.Build.0 = Debug|ARM + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|ARM64.Build.0 = Debug|ARM64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|Win32.ActiveCfg = Debug|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|Win32.Build.0 = Debug|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|x64.ActiveCfg = Debug|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|x64.Build.0 = Debug|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|Win32.ActiveCfg = Release|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|Win32.Build.0 = Release|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|x64.ActiveCfg = Release|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|x64.Build.0 = Release|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|Win32.ActiveCfg = Release|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|Win32.Build.0 = Release|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|x64.ActiveCfg = Release|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|x64.Build.0 = Release|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|ARM.ActiveCfg = Release|ARM {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|ARM.Build.0 = Release|ARM + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|ARM64.ActiveCfg = Release|ARM64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|ARM64.Build.0 = Release|ARM64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.ActiveCfg = Release|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.Build.0 = Release|Win32 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.ActiveCfg = Release|x64 {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.Build.0 = Release|x64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|ARM.ActiveCfg = Debug|ARM {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|ARM.Build.0 = Debug|ARM + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|ARM64.Build.0 = Debug|ARM64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|Win32.ActiveCfg = Debug|Win32 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|Win32.Build.0 = Debug|Win32 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|x64.ActiveCfg = Debug|x64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|x64.Build.0 = Debug|x64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|x64.Build.0 = PGInstrument|x64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|x64.Build.0 = PGUpdate|x64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|ARM.ActiveCfg = Release|ARM {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|ARM.Build.0 = Release|ARM + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|ARM64.ActiveCfg = Release|ARM64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|ARM64.Build.0 = Release|ARM64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|Win32.ActiveCfg = Release|Win32 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|Win32.Build.0 = Release|Win32 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.ActiveCfg = Release|x64 {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.Build.0 = Release|x64 {0E9791DB-593A-465F-98BC-681011311617}.Debug|ARM.ActiveCfg = Debug|ARM {0E9791DB-593A-465F-98BC-681011311617}.Debug|ARM.Build.0 = Debug|ARM + {0E9791DB-593A-465F-98BC-681011311617}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {0E9791DB-593A-465F-98BC-681011311617}.Debug|ARM64.Build.0 = Debug|ARM64 {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.ActiveCfg = Debug|Win32 {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.Build.0 = Debug|Win32 {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.ActiveCfg = Debug|x64 {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.Build.0 = Debug|x64 {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.Build.0 = PGInstrument|x64 {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.Build.0 = PGUpdate|x64 {0E9791DB-593A-465F-98BC-681011311617}.Release|ARM.ActiveCfg = Release|ARM {0E9791DB-593A-465F-98BC-681011311617}.Release|ARM.Build.0 = Release|ARM + {0E9791DB-593A-465F-98BC-681011311617}.Release|ARM64.ActiveCfg = Release|ARM64 + {0E9791DB-593A-465F-98BC-681011311617}.Release|ARM64.Build.0 = Release|ARM64 {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.ActiveCfg = Release|Win32 {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.Build.0 = Release|Win32 {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.ActiveCfg = Release|x64 {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.Build.0 = Release|x64 {0E9791DB-593A-465F-98BC-681011311618}.Debug|ARM.ActiveCfg = Debug|ARM {0E9791DB-593A-465F-98BC-681011311618}.Debug|ARM.Build.0 = Debug|ARM + {0E9791DB-593A-465F-98BC-681011311618}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {0E9791DB-593A-465F-98BC-681011311618}.Debug|ARM64.Build.0 = Debug|ARM64 {0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.ActiveCfg = Debug|Win32 {0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.Build.0 = Debug|Win32 {0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.ActiveCfg = Debug|x64 {0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.Build.0 = Debug|x64 {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|x64.Build.0 = PGInstrument|x64 {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.Build.0 = PGUpdate|x64 {0E9791DB-593A-465F-98BC-681011311618}.Release|ARM.ActiveCfg = Release|ARM {0E9791DB-593A-465F-98BC-681011311618}.Release|ARM.Build.0 = Release|ARM + {0E9791DB-593A-465F-98BC-681011311618}.Release|ARM64.ActiveCfg = Release|ARM64 + {0E9791DB-593A-465F-98BC-681011311618}.Release|ARM64.Build.0 = Release|ARM64 {0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.ActiveCfg = Release|Win32 {0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.Build.0 = Release|Win32 {0E9791DB-593A-465F-98BC-681011311618}.Release|x64.ActiveCfg = Release|x64 {0E9791DB-593A-465F-98BC-681011311618}.Release|x64.Build.0 = Release|x64 {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|ARM.ActiveCfg = Debug|ARM {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|ARM.Build.0 = Debug|ARM + {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|ARM64.Build.0 = Debug|ARM64 {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|Win32.ActiveCfg = Debug|Win32 {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|Win32.Build.0 = Debug|Win32 {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|x64.ActiveCfg = Debug|x64 {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|x64.Build.0 = Debug|x64 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|Win32.ActiveCfg = Release|Win32 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|Win32.Build.0 = Release|Win32 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|x64.ActiveCfg = Release|x64 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|x64.Build.0 = Release|x64 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|Win32.ActiveCfg = Release|Win32 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|Win32.Build.0 = Release|Win32 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|x64.ActiveCfg = Release|x64 {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|x64.Build.0 = Release|x64 {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|ARM.ActiveCfg = Release|ARM {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|ARM.Build.0 = Release|ARM + {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|ARM64.ActiveCfg = Release|ARM64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|ARM64.Build.0 = Release|ARM64 {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|Win32.ActiveCfg = Release|Win32 {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|Win32.Build.0 = Release|Win32 {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|x64.ActiveCfg = Release|x64 {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|x64.Build.0 = Release|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|ARM.ActiveCfg = Debug|ARM {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|ARM.Build.0 = Debug|ARM + {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|ARM64.Build.0 = Debug|ARM64 {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.ActiveCfg = Debug|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.Build.0 = Debug|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.ActiveCfg = Debug|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.Build.0 = Debug|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.Build.0 = PGInstrument|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.Build.0 = PGUpdate|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|ARM.ActiveCfg = Release|ARM {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|ARM.Build.0 = Release|ARM + {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|ARM64.ActiveCfg = Release|ARM64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|ARM64.Build.0 = Release|ARM64 {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.ActiveCfg = Release|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.Build.0 = Release|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.ActiveCfg = Release|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.Build.0 = Release|x64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|ARM.ActiveCfg = Debug|ARM {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|ARM.Build.0 = Debug|ARM + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|ARM64.Build.0 = Debug|ARM64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.ActiveCfg = Debug|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.Build.0 = Debug|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|x64.ActiveCfg = Debug|x64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|x64.Build.0 = Debug|x64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|x64.Build.0 = PGInstrument|x64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|x64.Build.0 = PGUpdate|x64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|ARM.ActiveCfg = Release|ARM {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|ARM.Build.0 = Release|ARM + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|ARM64.ActiveCfg = Release|ARM64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|ARM64.Build.0 = Release|ARM64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|Win32.ActiveCfg = Release|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|Win32.Build.0 = Release|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|x64.ActiveCfg = Release|x64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|x64.Build.0 = Release|x64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|ARM.ActiveCfg = Debug|ARM {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|ARM.Build.0 = Debug|ARM + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|ARM64.Build.0 = Debug|ARM64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|Win32.ActiveCfg = Debug|Win32 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|Win32.Build.0 = Debug|Win32 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|x64.ActiveCfg = Debug|x64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|x64.Build.0 = Debug|x64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|x64.Build.0 = PGInstrument|x64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|x64.Build.0 = PGUpdate|x64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|ARM.ActiveCfg = Release|ARM {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|ARM.Build.0 = Release|ARM + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|ARM64.ActiveCfg = Release|ARM64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|ARM64.Build.0 = Release|ARM64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|Win32.ActiveCfg = Release|Win32 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|Win32.Build.0 = Release|Win32 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|x64.ActiveCfg = Release|x64 {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|x64.Build.0 = Release|x64 {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|ARM.ActiveCfg = Debug|ARM {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|ARM.Build.0 = Debug|ARM + {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|ARM64.Build.0 = Debug|ARM64 {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|Win32.ActiveCfg = Debug|Win32 {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|Win32.Build.0 = Debug|Win32 {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|x64.ActiveCfg = Debug|x64 {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|x64.Build.0 = Debug|x64 {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|x64.Build.0 = PGInstrument|x64 {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|x64.Build.0 = PGUpdate|x64 {13CECB97-4119-4316-9D42-8534019A5A44}.Release|ARM.ActiveCfg = Release|ARM {13CECB97-4119-4316-9D42-8534019A5A44}.Release|ARM.Build.0 = Release|ARM + {13CECB97-4119-4316-9D42-8534019A5A44}.Release|ARM64.ActiveCfg = Release|ARM64 + {13CECB97-4119-4316-9D42-8534019A5A44}.Release|ARM64.Build.0 = Release|ARM64 {13CECB97-4119-4316-9D42-8534019A5A44}.Release|Win32.ActiveCfg = Release|Win32 {13CECB97-4119-4316-9D42-8534019A5A44}.Release|Win32.Build.0 = Release|Win32 {13CECB97-4119-4316-9D42-8534019A5A44}.Release|x64.ActiveCfg = Release|x64 {13CECB97-4119-4316-9D42-8534019A5A44}.Release|x64.Build.0 = Release|x64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|ARM.ActiveCfg = Debug|ARM {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|ARM.Build.0 = Debug|ARM + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.ActiveCfg = Debug|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.Build.0 = Debug|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|x64.ActiveCfg = Debug|x64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|x64.Build.0 = Debug|x64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|x64.Build.0 = PGInstrument|x64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|x64.Build.0 = PGUpdate|x64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|ARM.ActiveCfg = Release|ARM {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|ARM.Build.0 = Release|ARM + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|ARM64.ActiveCfg = Release|ARM64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.ActiveCfg = Release|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.Build.0 = Release|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|x64.ActiveCfg = Release|x64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|x64.Build.0 = Release|x64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|ARM.ActiveCfg = Debug|ARM {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|ARM.Build.0 = Debug|ARM + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|ARM64.Build.0 = Debug|ARM64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|Win32.ActiveCfg = Debug|Win32 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|Win32.Build.0 = Debug|Win32 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|x64.ActiveCfg = Debug|x64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|x64.Build.0 = Debug|x64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|x64.Build.0 = PGInstrument|x64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|x64.Build.0 = PGUpdate|x64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|ARM.ActiveCfg = Release|ARM {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|ARM.Build.0 = Release|ARM + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|ARM64.ActiveCfg = Release|ARM64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|ARM64.Build.0 = Release|ARM64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|Win32.ActiveCfg = Release|Win32 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|Win32.Build.0 = Release|Win32 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|x64.ActiveCfg = Release|x64 {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|x64.Build.0 = Release|x64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|ARM.ActiveCfg = Debug|ARM + {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|ARM.Build.0 = Debug|ARM + {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|ARM64.ActiveCfg = Debug|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|Win32.ActiveCfg = Debug|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|Win32.Build.0 = Debug|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|x64.ActiveCfg = Debug|x64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|x64.Build.0 = Debug|x64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|ARM64.ActiveCfg = PGInstrument|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|ARM64.ActiveCfg = PGUpdate|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|ARM.ActiveCfg = Release|ARM + {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|ARM.Build.0 = Release|ARM + {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|ARM64.ActiveCfg = Release|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|Win32.ActiveCfg = Release|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|Win32.Build.0 = Release|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|x64.ActiveCfg = Release|x64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|x64.Build.0 = Release|x64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|ARM.ActiveCfg = Debug|ARM {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|ARM.Build.0 = Debug|ARM + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|ARM64.Build.0 = Debug|ARM64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|Win32.ActiveCfg = Debug|Win32 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|Win32.Build.0 = Debug|Win32 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|x64.ActiveCfg = Debug|x64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|x64.Build.0 = Debug|x64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|Win32.ActiveCfg = Release|Win32 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|Win32.Build.0 = Release|Win32 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|x64.ActiveCfg = Release|x64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|x64.Build.0 = Release|x64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|Win32.ActiveCfg = Release|Win32 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|Win32.Build.0 = Release|Win32 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|x64.ActiveCfg = Release|x64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|x64.Build.0 = Release|x64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|ARM.ActiveCfg = Release|ARM {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|ARM.Build.0 = Release|ARM + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|ARM64.ActiveCfg = Release|ARM64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|ARM64.Build.0 = Release|ARM64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|Win32.ActiveCfg = Release|Win32 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|Win32.Build.0 = Release|Win32 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|x64.ActiveCfg = Release|x64 {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|x64.Build.0 = Release|x64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|ARM.ActiveCfg = Debug|ARM + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|Win32.ActiveCfg = Debug|Win32 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|Win32.Build.0 = Debug|Win32 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|x64.ActiveCfg = Debug|x64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|x64.Build.0 = Debug|x64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|x64.Build.0 = PGInstrument|x64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|x64.Build.0 = PGUpdate|x64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|ARM.ActiveCfg = Release|ARM + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|ARM64.ActiveCfg = Release|ARM64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|Win32.ActiveCfg = Release|Win32 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|Win32.Build.0 = Release|Win32 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|x64.ActiveCfg = Release|x64 {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|x64.Build.0 = Release|x64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|ARM.ActiveCfg = Debug|ARM {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|ARM.Build.0 = Debug|ARM + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|ARM64.Build.0 = Debug|ARM64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|Win32.ActiveCfg = Debug|Win32 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|Win32.Build.0 = Debug|Win32 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|x64.ActiveCfg = Debug|x64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|x64.Build.0 = Debug|x64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|x64.Build.0 = PGInstrument|x64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|x64.Build.0 = PGUpdate|x64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|ARM.ActiveCfg = Release|ARM {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|ARM.Build.0 = Release|ARM + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|ARM64.ActiveCfg = Release|ARM64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|ARM64.Build.0 = Release|ARM64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|Win32.ActiveCfg = Release|Win32 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|Win32.Build.0 = Release|Win32 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|x64.ActiveCfg = Release|x64 {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|x64.Build.0 = Release|x64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|ARM.ActiveCfg = Debug|ARM {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|ARM.Build.0 = Debug|ARM + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|ARM64.Build.0 = Debug|ARM64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|Win32.ActiveCfg = Debug|Win32 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|Win32.Build.0 = Debug|Win32 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|x64.ActiveCfg = Debug|x64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|x64.Build.0 = Debug|x64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|x64.Build.0 = PGInstrument|x64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|x64.Build.0 = PGUpdate|x64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|ARM.ActiveCfg = Release|ARM {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|ARM.Build.0 = Release|ARM + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|ARM64.ActiveCfg = Release|ARM64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|ARM64.Build.0 = Release|ARM64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|Win32.ActiveCfg = Release|Win32 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|Win32.Build.0 = Release|Win32 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.ActiveCfg = Release|x64 {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.Build.0 = Release|x64 {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|ARM.ActiveCfg = Debug|ARM {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|ARM.Build.0 = Debug|ARM + {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|ARM64.Build.0 = Debug|ARM64 {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32 {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32 {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.ActiveCfg = Debug|x64 {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.Build.0 = Debug|x64 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.Build.0 = PGInstrument|x64 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.Build.0 = PGUpdate|x64 {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|ARM.ActiveCfg = Release|ARM {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|ARM.Build.0 = Release|ARM + {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|ARM64.ActiveCfg = Release|ARM64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|ARM64.Build.0 = Release|ARM64 {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32 {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.Build.0 = Release|Win32 {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.ActiveCfg = Release|x64 {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.Build.0 = Release|x64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|ARM.ActiveCfg = Debug|ARM {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|ARM.Build.0 = Debug|ARM + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|ARM64.Build.0 = Debug|ARM64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.ActiveCfg = Debug|Win32 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.Build.0 = Debug|Win32 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|x64.ActiveCfg = Debug|x64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|x64.Build.0 = Debug|x64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|x64.Build.0 = PGInstrument|x64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|x64.Build.0 = PGUpdate|x64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|ARM.ActiveCfg = Release|ARM {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|ARM.Build.0 = Release|ARM + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|ARM64.ActiveCfg = Release|ARM64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|ARM64.Build.0 = Release|ARM64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|Win32.ActiveCfg = Release|Win32 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|Win32.Build.0 = Release|Win32 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|x64.ActiveCfg = Release|x64 {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|x64.Build.0 = Release|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|ARM.ActiveCfg = Debug|ARM {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|ARM.Build.0 = Debug|ARM + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|ARM64.Build.0 = Debug|ARM64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|Win32.ActiveCfg = Debug|Win32 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|Win32.Build.0 = Debug|Win32 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|x64.ActiveCfg = Debug|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|x64.Build.0 = Debug|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|x64.Build.0 = PGInstrument|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|x64.Build.0 = PGUpdate|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|ARM.ActiveCfg = Release|ARM {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|ARM.Build.0 = Release|ARM + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|ARM64.ActiveCfg = Release|ARM64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|ARM64.Build.0 = Release|ARM64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|Win32.ActiveCfg = Release|Win32 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|Win32.Build.0 = Release|Win32 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.ActiveCfg = Release|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.Build.0 = Release|x64 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|ARM.ActiveCfg = Debug|ARM + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|ARM64.ActiveCfg = Debug|Win32 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|Win32.ActiveCfg = Debug|Win32 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|x64.ActiveCfg = Release|x64 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|ARM64.ActiveCfg = PGInstrument|Win32 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|Win32.ActiveCfg = Release|Win32 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|x64.ActiveCfg = Release|x64 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|ARM64.ActiveCfg = PGUpdate|Win32 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|Win32.ActiveCfg = Release|Win32 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|x64.ActiveCfg = Release|x64 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|ARM.ActiveCfg = Release|ARM + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|ARM64.ActiveCfg = Release|Win32 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|Win32.ActiveCfg = Release|Win32 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|x64.ActiveCfg = Release|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|ARM.ActiveCfg = Debug|ARM {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|ARM.Build.0 = Debug|ARM + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|ARM64.Build.0 = Debug|ARM64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.ActiveCfg = Debug|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.Build.0 = Debug|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.ActiveCfg = Debug|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.Build.0 = Debug|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|x64.Build.0 = PGInstrument|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|x64.Build.0 = PGUpdate|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|ARM.ActiveCfg = Release|ARM {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|ARM.Build.0 = Release|ARM + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|ARM64.ActiveCfg = Release|ARM64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|ARM64.Build.0 = Release|ARM64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|Win32.ActiveCfg = Release|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|Win32.Build.0 = Release|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|x64.ActiveCfg = Release|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|x64.Build.0 = Release|x64 {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|ARM.ActiveCfg = Debug|ARM {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|ARM.Build.0 = Debug|ARM + {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|ARM64.Build.0 = Debug|ARM64 {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|Win32.ActiveCfg = Debug|Win32 {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|Win32.Build.0 = Debug|Win32 {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|x64.ActiveCfg = Debug|x64 {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|x64.Build.0 = Debug|x64 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|x64.Build.0 = PGInstrument|x64 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|x64.Build.0 = PGUpdate|x64 {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|ARM.ActiveCfg = Release|ARM {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|ARM.Build.0 = Release|ARM + {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|ARM64.ActiveCfg = Release|ARM64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|ARM64.Build.0 = Release|ARM64 {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|Win32.ActiveCfg = Release|Win32 {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|Win32.Build.0 = Release|Win32 {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.ActiveCfg = Release|x64 {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.Build.0 = Release|x64 {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|ARM.ActiveCfg = Debug|ARM {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|ARM.Build.0 = Debug|ARM + {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|ARM64.Build.0 = Debug|ARM64 {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|Win32.ActiveCfg = Debug|Win32 {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|Win32.Build.0 = Debug|Win32 {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|x64.ActiveCfg = Debug|x64 {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|x64.Build.0 = Debug|x64 {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|x64.Build.0 = PGInstrument|x64 {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|x64.Build.0 = PGUpdate|x64 {9E48B300-37D1-11DD-8C41-005056C00008}.Release|ARM.ActiveCfg = Release|ARM {9E48B300-37D1-11DD-8C41-005056C00008}.Release|ARM.Build.0 = Release|ARM + {9E48B300-37D1-11DD-8C41-005056C00008}.Release|ARM64.ActiveCfg = Release|ARM64 + {9E48B300-37D1-11DD-8C41-005056C00008}.Release|ARM64.Build.0 = Release|ARM64 {9E48B300-37D1-11DD-8C41-005056C00008}.Release|Win32.ActiveCfg = Release|Win32 {9E48B300-37D1-11DD-8C41-005056C00008}.Release|Win32.Build.0 = Release|Win32 {9E48B300-37D1-11DD-8C41-005056C00008}.Release|x64.ActiveCfg = Release|x64 {9E48B300-37D1-11DD-8C41-005056C00008}.Release|x64.Build.0 = Release|x64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|ARM.ActiveCfg = Debug|ARM {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|ARM.Build.0 = Debug|ARM + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|ARM64.Build.0 = Debug|ARM64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|Win32.ActiveCfg = Debug|Win32 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|Win32.Build.0 = Debug|Win32 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.ActiveCfg = Debug|x64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.Build.0 = Debug|x64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.ActiveCfg = Debug|Win32 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.Build.0 = Debug|Win32 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.ActiveCfg = Debug|x64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.Build.0 = Debug|x64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.ActiveCfg = Debug|Win32 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.Build.0 = Debug|Win32 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.ActiveCfg = Debug|x64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.Build.0 = Debug|x64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|ARM.ActiveCfg = Release|ARM {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|ARM.Build.0 = Release|ARM + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|ARM64.ActiveCfg = Release|ARM64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|ARM64.Build.0 = Release|ARM64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.ActiveCfg = Release|Win32 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.Build.0 = Release|Win32 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.ActiveCfg = Release|x64 {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.Build.0 = Release|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|ARM.ActiveCfg = Debug|ARM + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|Win32.ActiveCfg = Release|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|x64.ActiveCfg = Release|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.Build.0 = PGInstrument|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.ActiveCfg = Release|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.Build.0 = Release|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|ARM.ActiveCfg = Release|ARM + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|ARM64.ActiveCfg = Release|ARM64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.ActiveCfg = Release|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.Build.0 = Release|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.ActiveCfg = Release|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.Build.0 = Release|x64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|ARM.ActiveCfg = Debug|ARM {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|ARM.Build.0 = Debug|ARM + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|ARM64.Build.0 = Debug|ARM64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.ActiveCfg = Debug|Win32 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.Build.0 = Debug|Win32 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.ActiveCfg = Debug|x64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.Build.0 = Debug|x64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.ActiveCfg = Release|Win32 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.Build.0 = Release|Win32 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.ActiveCfg = Release|x64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.Build.0 = Release|x64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.ActiveCfg = Release|Win32 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.Build.0 = Release|Win32 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.ActiveCfg = Release|x64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.Build.0 = Release|x64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|ARM.ActiveCfg = Release|ARM {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|ARM.Build.0 = Release|ARM + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|ARM64.ActiveCfg = Release|ARM64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|ARM64.Build.0 = Release|ARM64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.ActiveCfg = Release|Win32 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.Build.0 = Release|Win32 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.ActiveCfg = Release|x64 {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.Build.0 = Release|x64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|ARM.ActiveCfg = Debug|ARM {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|ARM.Build.0 = Debug|ARM + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|ARM64.Build.0 = Debug|ARM64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|Win32.ActiveCfg = Debug|Win32 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|Win32.Build.0 = Debug|Win32 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|x64.ActiveCfg = Debug|x64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|x64.Build.0 = Debug|x64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|Win32.ActiveCfg = Release|Win32 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|Win32.Build.0 = Release|Win32 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|x64.ActiveCfg = Release|x64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|x64.Build.0 = Release|x64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|Win32.ActiveCfg = Release|Win32 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|Win32.Build.0 = Release|Win32 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|x64.ActiveCfg = Release|x64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|x64.Build.0 = Release|x64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|ARM.ActiveCfg = Release|ARM {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|ARM.Build.0 = Release|ARM + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|ARM64.ActiveCfg = Release|ARM64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|ARM64.Build.0 = Release|ARM64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|Win32.ActiveCfg = Release|Win32 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|Win32.Build.0 = Release|Win32 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|x64.ActiveCfg = Release|x64 {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|x64.Build.0 = Release|x64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|ARM.ActiveCfg = Debug|ARM {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|ARM.Build.0 = Debug|ARM + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|ARM64.Build.0 = Debug|ARM64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|Win32.ActiveCfg = Debug|Win32 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|Win32.Build.0 = Debug|Win32 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|x64.ActiveCfg = Debug|x64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|x64.Build.0 = Debug|x64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|Win32.ActiveCfg = Release|Win32 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|Win32.Build.0 = Release|Win32 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|x64.ActiveCfg = Release|x64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|x64.Build.0 = Release|x64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|Win32.ActiveCfg = Release|Win32 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|Win32.Build.0 = Release|Win32 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|x64.ActiveCfg = Release|x64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|x64.Build.0 = Release|x64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|ARM.ActiveCfg = Release|ARM {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|ARM.Build.0 = Release|ARM + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|ARM64.ActiveCfg = Release|ARM64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|ARM64.Build.0 = Release|ARM64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.ActiveCfg = Release|Win32 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.Build.0 = Release|Win32 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.ActiveCfg = Release|x64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.Build.0 = Release|x64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|ARM.ActiveCfg = Debug|ARM + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|ARM64.ActiveCfg = Debug|ARM64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|Win32.ActiveCfg = Debug|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|x64.ActiveCfg = Debug|x64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|Win32.ActiveCfg = Release|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|x64.ActiveCfg = Release|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|Win32.ActiveCfg = Release|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|x64.ActiveCfg = Release|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|ARM.ActiveCfg = Release|ARM + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|ARM64.ActiveCfg = Release|ARM64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|Win32.ActiveCfg = Release|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|Win32.Build.0 = Release|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|x64.ActiveCfg = Release|x64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|x64.Build.0 = Release|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|ARM.ActiveCfg = Debug|ARM {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|ARM.Build.0 = Debug|ARM + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|ARM64.Build.0 = Debug|ARM64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.ActiveCfg = Debug|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.Build.0 = Debug|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.ActiveCfg = Debug|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.Build.0 = Debug|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.Build.0 = PGInstrument|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.Build.0 = PGUpdate|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|ARM.ActiveCfg = Release|ARM {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|ARM.Build.0 = Release|ARM + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|ARM64.ActiveCfg = Release|ARM64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|ARM64.Build.0 = Release|ARM64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.ActiveCfg = Release|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.Build.0 = Release|Win32 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.ActiveCfg = Release|x64 {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.Build.0 = Release|x64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|ARM.ActiveCfg = Debug|ARM {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|ARM.Build.0 = Debug|ARM + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|ARM64.Build.0 = Debug|ARM64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|Win32.ActiveCfg = Debug|Win32 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|Win32.Build.0 = Debug|Win32 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|x64.ActiveCfg = Debug|x64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|x64.Build.0 = Debug|x64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|Win32.ActiveCfg = Release|Win32 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|x64.ActiveCfg = Release|x64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|Win32.ActiveCfg = Release|Win32 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|Win32.Build.0 = Release|Win32 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|x64.ActiveCfg = Release|x64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|x64.Build.0 = Release|x64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|ARM.ActiveCfg = Release|ARM {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|ARM.Build.0 = Release|ARM + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|ARM64.ActiveCfg = Release|ARM64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|ARM64.Build.0 = Release|ARM64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|Win32.ActiveCfg = Release|Win32 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|Win32.Build.0 = Release|Win32 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|x64.ActiveCfg = Release|x64 {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|x64.Build.0 = Release|x64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|ARM.ActiveCfg = Debug|ARM {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|ARM.Build.0 = Debug|ARM + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|ARM64.Build.0 = Debug|ARM64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|Win32.ActiveCfg = Debug|Win32 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|Win32.Build.0 = Debug|Win32 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|x64.ActiveCfg = Debug|x64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|x64.Build.0 = Debug|x64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|Win32.ActiveCfg = Release|Win32 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|x64.ActiveCfg = Release|x64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|Win32.ActiveCfg = Release|Win32 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|Win32.Build.0 = Release|Win32 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|x64.ActiveCfg = Release|x64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|x64.Build.0 = Release|x64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|ARM.ActiveCfg = Release|ARM {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|ARM.Build.0 = Release|ARM + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|ARM64.ActiveCfg = Release|ARM64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|ARM64.Build.0 = Release|ARM64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|Win32.ActiveCfg = Release|Win32 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|Win32.Build.0 = Release|Win32 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|x64.ActiveCfg = Release|x64 {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|x64.Build.0 = Release|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|ARM.ActiveCfg = Debug|ARM {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|ARM.Build.0 = Debug|ARM + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|ARM64.Build.0 = Debug|ARM64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|Win32.ActiveCfg = Debug|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|Win32.Build.0 = Debug|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|x64.ActiveCfg = Debug|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|x64.Build.0 = Debug|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|x64.Build.0 = PGInstrument|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|x64.Build.0 = PGUpdate|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|ARM.ActiveCfg = Release|ARM - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|ARM.Build.0 = Release|ARM + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|ARM64.ActiveCfg = Release|ARM64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|Win32.ActiveCfg = Release|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|Win32.Build.0 = Release|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|x64.ActiveCfg = Release|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|x64.Build.0 = Release|x64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|ARM.ActiveCfg = Debug|ARM {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|ARM.Build.0 = Debug|ARM + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|ARM64.Build.0 = Debug|ARM64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|Win32.ActiveCfg = Debug|Win32 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|Win32.Build.0 = Debug|Win32 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|x64.ActiveCfg = Debug|x64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|x64.Build.0 = Debug|x64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|Win32.ActiveCfg = Release|Win32 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|Win32.Build.0 = Release|Win32 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|x64.ActiveCfg = Release|x64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|x64.Build.0 = Release|x64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|Win32.ActiveCfg = Release|Win32 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|Win32.Build.0 = Release|Win32 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|x64.ActiveCfg = Release|x64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|x64.Build.0 = Release|x64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|ARM.ActiveCfg = Release|ARM {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|ARM.Build.0 = Release|ARM + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|ARM64.ActiveCfg = Release|ARM64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|ARM64.Build.0 = Release|ARM64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|Win32.ActiveCfg = Release|Win32 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|Win32.Build.0 = Release|Win32 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|x64.ActiveCfg = Release|x64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|x64.Build.0 = Release|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|ARM.ActiveCfg = Debug|ARM {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|ARM.Build.0 = Debug|ARM + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|ARM64.Build.0 = Debug|ARM64 {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|Win32.ActiveCfg = Debug|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|Win32.Build.0 = Debug|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|x64.ActiveCfg = Debug|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|x64.Build.0 = Debug|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|x64.Build.0 = PGInstrument|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|x64.Build.0 = PGUpdate|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.Release|ARM.ActiveCfg = Release|ARM {384C224A-7474-476E-A01B-750EA7DE918C}.Release|ARM.Build.0 = Release|ARM + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|ARM64.ActiveCfg = Release|ARM64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|ARM64.Build.0 = Release|ARM64 {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.ActiveCfg = Release|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.Build.0 = Release|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.ActiveCfg = Release|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.Build.0 = Release|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM.ActiveCfg = Debug|ARM {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM.Build.0 = Debug|ARM + {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM64.Build.0 = Debug|ARM64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|Win32.ActiveCfg = Debug|Win32 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|Win32.Build.0 = Debug|Win32 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|x64.ActiveCfg = Debug|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|x64.Build.0 = Debug|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGInstrument|x64.Build.0 = PGInstrument|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.PGUpdate|x64.Build.0 = PGUpdate|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Release|ARM.ActiveCfg = Release|ARM {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Release|ARM.Build.0 = Release|ARM + {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Release|ARM64.ActiveCfg = Release|ARM64 + {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Release|ARM64.Build.0 = Release|ARM64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Release|Win32.ActiveCfg = Release|Win32 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Release|Win32.Build.0 = Release|Win32 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Release|x64.ActiveCfg = Release|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Release|x64.Build.0 = Release|x64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|ARM.ActiveCfg = Debug|ARM {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|ARM.Build.0 = Debug|ARM + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|ARM64.Build.0 = Debug|ARM64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|Win32.ActiveCfg = Debug|Win32 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|Win32.Build.0 = Debug|Win32 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|x64.ActiveCfg = Debug|x64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|x64.Build.0 = Debug|x64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|x64.Build.0 = PGInstrument|x64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|x64.Build.0 = PGUpdate|x64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|ARM.ActiveCfg = Release|ARM {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|ARM.Build.0 = Release|ARM + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|ARM64.ActiveCfg = Release|ARM64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|ARM64.Build.0 = Release|ARM64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|Win32.ActiveCfg = Release|Win32 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|Win32.Build.0 = Release|Win32 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|x64.ActiveCfg = Release|x64 {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|x64.Build.0 = Release|x64 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Debug|ARM.ActiveCfg = Debug|Win32 + {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Debug|ARM64.ActiveCfg = Debug|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Debug|Win32.ActiveCfg = Debug|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Debug|Win32.Build.0 = Debug|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Debug|x64.ActiveCfg = Debug|x64 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Debug|x64.Build.0 = Debug|x64 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGInstrument|ARM.ActiveCfg = PGInstrument|Win32 + {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGInstrument|ARM64.ActiveCfg = PGInstrument|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGInstrument|x64.Build.0 = PGInstrument|x64 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGUpdate|ARM.ActiveCfg = PGUpdate|Win32 + {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGUpdate|ARM64.ActiveCfg = PGUpdate|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.PGUpdate|x64.Build.0 = PGUpdate|x64 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Release|ARM.ActiveCfg = Release|Win32 + {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Release|ARM64.ActiveCfg = Release|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Release|Win32.ActiveCfg = Release|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Release|Win32.Build.0 = Release|Win32 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Release|x64.ActiveCfg = Release|x64 {9DE9E23D-C8D4-4817-92A9-920A8B1FE5FF}.Release|x64.Build.0 = Release|x64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Debug|ARM.ActiveCfg = Debug|ARM {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Debug|ARM.Build.0 = Debug|ARM + {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Debug|ARM64.Build.0 = Debug|ARM64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Debug|Win32.ActiveCfg = Debug|Win32 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Debug|Win32.Build.0 = Debug|Win32 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Debug|x64.ActiveCfg = Debug|x64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Debug|x64.Build.0 = Debug|x64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGInstrument|x64.Build.0 = PGInstrument|x64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.PGUpdate|x64.Build.0 = PGUpdate|x64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Release|ARM.ActiveCfg = Release|ARM {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Release|ARM.Build.0 = Release|ARM + {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Release|ARM64.ActiveCfg = Release|ARM64 + {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Release|ARM64.Build.0 = Release|ARM64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Release|Win32.ActiveCfg = Release|Win32 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Release|Win32.Build.0 = Release|Win32 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Release|x64.ActiveCfg = Release|x64 {494BAC80-A60C-43A9-99E7-ACB691CE2C4D}.Release|x64.Build.0 = Release|x64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Debug|ARM.ActiveCfg = Debug|ARM {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Debug|ARM.Build.0 = Debug|ARM + {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Debug|ARM64.Build.0 = Debug|ARM64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Debug|Win32.ActiveCfg = Debug|Win32 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Debug|Win32.Build.0 = Debug|Win32 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Debug|x64.ActiveCfg = Debug|x64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Debug|x64.Build.0 = Debug|x64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGInstrument|x64.Build.0 = PGInstrument|x64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.PGUpdate|x64.Build.0 = PGUpdate|x64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|ARM.ActiveCfg = Release|ARM {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|ARM.Build.0 = Release|ARM + {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|ARM64.ActiveCfg = Release|ARM64 + {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|ARM64.Build.0 = Release|ARM64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|Win32.ActiveCfg = Release|Win32 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|Win32.Build.0 = Release|Win32 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|x64.ActiveCfg = Release|x64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|x64.Build.0 = Release|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|ARM.ActiveCfg = Debug|Win32 + {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|ARM64.ActiveCfg = Debug|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|Win32.ActiveCfg = Debug|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|Win32.Build.0 = Debug|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|x64.ActiveCfg = Debug|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|x64.Build.0 = Debug|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.PGInstrument|ARM.ActiveCfg = PGInstrument|Win32 + {AB603547-1E2A-45B3-9E09-B04596006393}.PGInstrument|ARM64.ActiveCfg = PGInstrument|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.PGInstrument|x64.Build.0 = PGInstrument|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.PGUpdate|ARM.ActiveCfg = PGUpdate|Win32 + {AB603547-1E2A-45B3-9E09-B04596006393}.PGUpdate|ARM64.ActiveCfg = PGUpdate|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.PGUpdate|x64.Build.0 = PGUpdate|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.Release|ARM.ActiveCfg = Release|Win32 + {AB603547-1E2A-45B3-9E09-B04596006393}.Release|ARM64.ActiveCfg = Release|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Release|Win32.ActiveCfg = Release|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Release|Win32.Build.0 = Release|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Release|x64.ActiveCfg = Release|x64 diff --git a/PCbuild/prepare_libffi.bat b/PCbuild/prepare_libffi.bat index 307739d874a2..c65a5f7010bd 100644 --- a/PCbuild/prepare_libffi.bat +++ b/PCbuild/prepare_libffi.bat @@ -25,6 +25,7 @@ echo.Available flags: echo. -x64 build for x64 echo. -x86 build for x86 echo. -arm32 build for arm32 +echo. -arm64 build for arm64 echo. -? this help echo. --install-cygwin install cygwin to c:\cygwin exit /b 127 @@ -34,6 +35,9 @@ exit /b 127 set BUILD_X64= set BUILD_X86= set BUILD_ARM32= +set BUILD_ARM64= +set BUILD_PDB= +set BUILD_NOOPT= set INSTALL_CYGWIN= :CheckOpts @@ -41,16 +45,20 @@ if "%1"=="" goto :CheckOptsDone if /I "%1"=="-x64" (set BUILD_X64=1) & shift & goto :CheckOpts if /I "%1"=="-x86" (set BUILD_X86=1) & shift & goto :CheckOpts if /I "%1"=="-arm32" (set BUILD_ARM32=1) & shift & goto :CheckOpts +if /I "%1"=="-arm64" (set BUILD_ARM64=1) & shift & goto :CheckOpts +if /I "%1"=="-pdb" (set BUILD_PDB=-g) & shift & goto :CheckOpts +if /I "%1"=="-noopt" (set BUILD_NOOPT=CFLAGS='-Od -warn all') & shift & goto :CheckOpts if /I "%1"=="-?" goto :Usage if /I "%1"=="--install-cygwin" (set INSTALL_CYGWIN=1) & shift & goto :CheckOpts goto :Usage :CheckOptsDone -if NOT DEFINED BUILD_X64 if NOT DEFINED BUILD_X86 if NOT DEFINED BUILD_ARM32 ( +if NOT DEFINED BUILD_X64 if NOT DEFINED BUILD_X86 if NOT DEFINED BUILD_ARM32 if NOT DEFINED BUILD_ARM64 ( set BUILD_X64=1 set BUILD_X86=1 set BUILD_ARM32=1 + set BUILD_ARM64=1 ) if "%INSTALL_CYGWIN%"=="1" call :InstallCygwin @@ -90,6 +98,7 @@ if not exist Makefile.in (%SH% -lc "(cd $LIBFFI_SOURCE; ./autogen.sh;)") if "%BUILD_X64%"=="1" call :BuildOne x64 x86_64-w64-cygwin x86_64-w64-cygwin if "%BUILD_X86%"=="1" call :BuildOne x86 i686-pc-cygwin i686-pc-cygwin if "%BUILD_ARM32%"=="1" call :BuildOne x86_arm i686-pc-cygwin arm-w32-cygwin +if "%BUILD_ARM64%"=="1" call :BuildOne x86_arm64 i686-pc-cygwin aarch64-w64-cygwin popd endlocal @@ -129,6 +138,12 @@ if /I "%VCVARS_PLATFORM%" EQU "x86_arm" ( set ASSEMBLER=-marm set SRC_ARCHITECTURE=ARM ) +if /I "%VCVARS_PLATFORM%" EQU "x86_arm64" ( + set ARCH=arm64 + set ARTIFACTS=%LIBFFI_SOURCE%\aarch64-w64-cygwin + set ASSEMBLER=-marm64 + set SRC_ARCHITECTURE=aarch64 +) if NOT DEFINED LIBFFI_OUT set LIBFFI_OUT=%~dp0\..\externals\libffi set _LIBFFI_OUT=%LIBFFI_OUT%\%ARCH% @@ -139,10 +154,14 @@ call %VCVARSALL% %VCVARS_PLATFORM% echo clean %_LIBFFI_OUT% if exist %_LIBFFI_OUT% (rd %_LIBFFI_OUT% /s/q) +echo ================================================================ echo Configure the build to generate fficonfig.h and ffi.h -%SH% -lc "(cd $OLDPWD; ./configure CC='%MSVCC% %ASSEMBLER%' CXX='%MSVCC% %ASSEMBLER%' LD='link' CPP='cl -nologo -EP' CXXCPP='cl -nologo -EP' CPPFLAGS='-DFFI_BUILDING_DLL' NM='dumpbin -symbols' STRIP=':' --build=$BUILD --host=$HOST;)" +echo ================================================================ +%SH% -lc "(cd $OLDPWD; ./configure CC='%MSVCC% %ASSEMBLER% %BUILD_PDB%' CXX='%MSVCC% %ASSEMBLER% %BUILD_PDB%' LD='link' CPP='cl -nologo -EP' CXXCPP='cl -nologo -EP' CPPFLAGS='-DFFI_BUILDING_DLL' %BUILD_NOOPT% NM='dumpbin -symbols' STRIP=':' --build=$BUILD --host=$HOST;)" +echo ================================================================ echo Building libffi +echo ================================================================ %SH% -lc "(cd $OLDPWD; export PATH=/usr/bin:$PATH; cp src/%SRC_ARCHITECTURE%/ffitarget.h include; make; find .;)" REM Tests are not needed to produce artifacts @@ -158,6 +177,7 @@ echo copying files to %_LIBFFI_OUT% if not exist %_LIBFFI_OUT%\include (md %_LIBFFI_OUT%\include) copy %ARTIFACTS%\.libs\libffi-7.dll %_LIBFFI_OUT% copy %ARTIFACTS%\.libs\libffi-7.lib %_LIBFFI_OUT% +copy %ARTIFACTS%\.libs\libffi-7.pdb %_LIBFFI_OUT% copy %ARTIFACTS%\fficonfig.h %_LIBFFI_OUT%\include copy %ARTIFACTS%\include\*.h %_LIBFFI_OUT%\include diff --git a/PCbuild/pyexpat.vcxproj b/PCbuild/pyexpat.vcxproj index 5503b6a5e9ad..28a11a82936e 100644 --- a/PCbuild/pyexpat.vcxproj +++ b/PCbuild/pyexpat.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/pylauncher.vcxproj b/PCbuild/pylauncher.vcxproj index aebbfbd36b34..550e0842300f 100644 --- a/PCbuild/pylauncher.vcxproj +++ b/PCbuild/pylauncher.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 847e5f57c4b9..12f07dd51287 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -65,6 +65,7 @@ MachineX86 MachineX64 MachineARM + MachineARM64 $(OutDir)$(TargetName).pgd UseLinkTimeCodeGeneration PGInstrument diff --git a/PCbuild/pyshellext.vcxproj b/PCbuild/pyshellext.vcxproj index 5b7320b1b817..655054e3723b 100644 --- a/PCbuild/pyshellext.vcxproj +++ b/PCbuild/pyshellext.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/python.props b/PCbuild/python.props index b3e5b92f2923..11638fe348c8 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -40,9 +40,12 @@ $(Py_OutDir)\amd64\ $(PySourcePath)PCbuild\arm32\ $(Py_OutDir)\arm32\ + $(PySourcePath)PCbuild\arm64\ + $(Py_OutDir)\arm64\ $(BuildPath32) $(BuildPath64) $(BuildPathArm32) + $(BuildPathArm64) $(PySourcePath)PCbuild\$(ArchName)\ $(BuildPath)\ $(BuildPath)instrumented\ @@ -72,6 +75,7 @@ -32 -arm32 + -arm64 $(BuildPath)python$(PyDebugExt).exe @@ -81,6 +85,10 @@ true + + true + + .cp$(MajorVersionNumber)$(MinorVersionNumber)-win32 .cp$(MajorVersionNumber)$(MinorVersionNumber)-win_arm32 + .cp$(MajorVersionNumber)$(MinorVersionNumber)-win_arm64 .cp$(MajorVersionNumber)$(MinorVersionNumber)-win_amd64 diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj index 77d22ecdabf9..919b79d986d0 100644 --- a/PCbuild/python.vcxproj +++ b/PCbuild/python.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM + Release Win32 @@ -98,7 +114,7 @@ - + ucrtbase ucrtbased diff --git a/PCbuild/python3dll.vcxproj b/PCbuild/python3dll.vcxproj index 65afcd38c1d7..ef344bed49e9 100644 --- a/PCbuild/python3dll.vcxproj +++ b/PCbuild/python3dll.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 @@ -75,6 +91,7 @@ <_Machine>X86 <_Machine Condition="$(Platform) == 'x64'">X64 <_Machine Condition="$(Platform) == 'ARM'">ARM + <_Machine Condition="$(Platform) == 'ARM64'">ARM64 $(ExtensionsToDeleteOnClean);$(IntDir)python3_d.def;$(IntDir)python3stub.def diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 5c5a720ba0c8..a71fce6bb609 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/pythonw.vcxproj b/PCbuild/pythonw.vcxproj index bd711a448600..e7216dec3a1a 100644 --- a/PCbuild/pythonw.vcxproj +++ b/PCbuild/pythonw.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/pywlauncher.vcxproj b/PCbuild/pywlauncher.vcxproj index d15366cfd727..44e3fc292723 100644 --- a/PCbuild/pywlauncher.vcxproj +++ b/PCbuild/pywlauncher.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/select.vcxproj b/PCbuild/select.vcxproj index d264d9ff0d4e..750a71394991 100644 --- a/PCbuild/select.vcxproj +++ b/PCbuild/select.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/sqlite3.vcxproj b/PCbuild/sqlite3.vcxproj index 8d2d47713894..90b4d3108fa5 100644 --- a/PCbuild/sqlite3.vcxproj +++ b/PCbuild/sqlite3.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/unicodedata.vcxproj b/PCbuild/unicodedata.vcxproj index f90cccb82d97..addef753359e 100644 --- a/PCbuild/unicodedata.vcxproj +++ b/PCbuild/unicodedata.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/venvlauncher.vcxproj b/PCbuild/venvlauncher.vcxproj index d8b1b661fdaa..123e84ec4e36 100644 --- a/PCbuild/venvlauncher.vcxproj +++ b/PCbuild/venvlauncher.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/venvwlauncher.vcxproj b/PCbuild/venvwlauncher.vcxproj index 0c7664bf70b0..b8504d5d08e5 100644 --- a/PCbuild/venvwlauncher.vcxproj +++ b/PCbuild/venvwlauncher.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/winsound.vcxproj b/PCbuild/winsound.vcxproj index 557160424aea..56da96a85528 100644 --- a/PCbuild/winsound.vcxproj +++ b/PCbuild/winsound.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 diff --git a/PCbuild/xxlimited.vcxproj b/PCbuild/xxlimited.vcxproj index cb1be299a6b0..776335a15cb0 100644 --- a/PCbuild/xxlimited.vcxproj +++ b/PCbuild/xxlimited.vcxproj @@ -5,6 +5,10 @@ Debug ARM + + Debug + ARM64 + Debug Win32 @@ -17,6 +21,10 @@ PGInstrument ARM + + PGInstrument + ARM64 + PGInstrument Win32 @@ -29,6 +37,10 @@ PGUpdate ARM + + PGUpdate + ARM64 + PGUpdate Win32 @@ -41,6 +53,10 @@ Release ARM + + Release + ARM64 + Release Win32 From webhook-mailer at python.org Fri May 17 13:08:59 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 17 May 2019 17:08:59 -0000 Subject: [Python-checkins] bpo-36942 Windows build changes for Windows ARM64 (GH-13366) Message-ID: https://github.com/python/cpython/commit/3ea702eca17c4ab5209d823fac2463307dde0633 commit: 3ea702eca17c4ab5209d823fac2463307dde0633 branch: master author: Paul Monson committer: Steve Dower date: 2019-05-17T10:08:55-07:00 summary: bpo-36942 Windows build changes for Windows ARM64 (GH-13366) files: M PC/pyconfig.h diff --git a/PC/pyconfig.h b/PC/pyconfig.h index 6f8fda66237c..a74ee98a753d 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -122,6 +122,9 @@ WIN32 is still required for the locale module. #if defined(_M_X64) || defined(_M_AMD64) #if defined(__INTEL_COMPILER) #define COMPILER ("[ICC v." _Py_STRINGIZE(__INTEL_COMPILER) " 64 bit (amd64) with MSC v." _Py_STRINGIZE(_MSC_VER) " CRT]") +#elif defined(_M_ARM64) +#define COMPILER _Py_PASTE_VERSION("64 bit (ARM)") +#define PYD_PLATFORM_TAG "win_arm64" #else #define COMPILER _Py_PASTE_VERSION("64 bit (AMD64)") #endif /* __INTEL_COMPILER */ From webhook-mailer at python.org Fri May 17 14:20:31 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 18:20:31 -0000 Subject: [Python-checkins] bpo-36867: _test_multiprocessing: avoid weak sync primitive (GH-13292) Message-ID: https://github.com/python/cpython/commit/cbe72d842646ded2454784679231e3d1e6252e72 commit: cbe72d842646ded2454784679231e3d1e6252e72 branch: master author: Pierre Glaser committer: Victor Stinner date: 2019-05-17T20:20:07+02:00 summary: bpo-36867: _test_multiprocessing: avoid weak sync primitive (GH-13292) Avoid weak sync primitive in multiprocessing resource_tracker test. files: M Lib/test/_test_multiprocessing.py diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 772c9638337a..78ec53beb0f0 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3945,11 +3945,19 @@ def test_shared_memory_cleaned_after_process_termination(self): # segment should not leak the given memory segment. p.terminate() p.wait() - time.sleep(1.0) # wait for the OS to collect the segment - # The shared memory file was deleted. - with self.assertRaises(FileNotFoundError): - smm = shared_memory.SharedMemory(name, create=False) + deadline = time.monotonic() + 60 + t = 0.1 + while time.monotonic() < deadline: + time.sleep(t) + t = min(t*2, 5) + try: + smm = shared_memory.SharedMemory(name, create=False) + except FileNotFoundError: + break + else: + raise AssertionError("A SharedMemory segment was leaked after" + " a process was abruptly terminated.") if os.name == 'posix': # A warning was emitted by the subprocess' own From webhook-mailer at python.org Fri May 17 14:29:42 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Fri, 17 May 2019 18:29:42 -0000 Subject: [Python-checkins] closes bpo-36755: Suppress noisy error output in test HTTPS server by default. (GH-13370) Message-ID: https://github.com/python/cpython/commit/951af2d7f140be7beb9cda2bcdd54f820c905e45 commit: 951af2d7f140be7beb9cda2bcdd54f820c905e45 branch: 2.7 author: Benjamin Peterson committer: GitHub date: 2019-05-17T11:29:38-07:00 summary: closes bpo-36755: Suppress noisy error output in test HTTPS server by default. (GH-13370) TLS 1.3 has a more efficient handshake protocol. The client can reject the server's credentials and close the connection before the server has even finished writing out all of its initial data. Depending on whether the server finishes writing the rest of its handshake before the it sees the connection is reset, the server will read an empty line or see a ECONNRESET OSError. Nothing is really wrong here with the server or client, so just suppress the error output in the OSError case to fix the test. This fix isn't required in Python 3 because clients that reject the server's certificate will shut down the TLS layer before closing the TCP connection. files: M Lib/test/ssl_servers.py diff --git a/Lib/test/ssl_servers.py b/Lib/test/ssl_servers.py index a312e28573ea..a5023052d3b6 100644 --- a/Lib/test/ssl_servers.py +++ b/Lib/test/ssl_servers.py @@ -42,6 +42,11 @@ def get_request(self): raise return sslconn, addr + def handle_error(self, request, client_address): + "Suppose noisy error output by default." + if support.verbose: + _HTTPServer.handle_error(self, request, client_address) + class RootedHTTPRequestHandler(SimpleHTTPRequestHandler): # need to override translate_path to get a known root, # instead of using os.curdir, since the test could be From webhook-mailer at python.org Fri May 17 15:28:48 2019 From: webhook-mailer at python.org (R. David Murray) Date: Fri, 17 May 2019 19:28:48 -0000 Subject: [Python-checkins] bpo-33524: Fix the folding of email header when max_line_length is 0 or None (#13391) Message-ID: https://github.com/python/cpython/commit/feac6cd7753425fba006e97e2d9b74a0c0c75894 commit: feac6cd7753425fba006e97e2d9b74a0c0c75894 branch: master author: Abhilash Raj committer: R. David Murray date: 2019-05-17T15:28:44-04:00 summary: bpo-33524: Fix the folding of email header when max_line_length is 0 or None (#13391) and there are non-ascii characters in the header. files: A Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst M Lib/email/_header_value_parser.py M Lib/email/policy.py M Lib/test/test_email/test_policy.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 60d0d32059f0..649f1539fa02 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -68,6 +68,7 @@ """ import re +import sys import urllib # For urllib.parse.unquote from string import hexdigits from operator import itemgetter @@ -2590,7 +2591,7 @@ def _refold_parse_tree(parse_tree, *, policy): """ # max_line_length 0/None means no limit, ie: infinitely long. - maxlen = policy.max_line_length or float("+inf") + maxlen = policy.max_line_length or sys.maxsize encoding = 'utf-8' if policy.utf8 else 'us-ascii' lines = [''] last_ew = None diff --git a/Lib/email/policy.py b/Lib/email/policy.py index 5131311ac5ef..611deb50bb52 100644 --- a/Lib/email/policy.py +++ b/Lib/email/policy.py @@ -3,6 +3,7 @@ """ import re +import sys from email._policybase import Policy, Compat32, compat32, _extend_docstrings from email.utils import _has_surrogates from email.headerregistry import HeaderRegistry as HeaderRegistry @@ -203,7 +204,7 @@ def fold_binary(self, name, value): def _fold(self, name, value, refold_binary=False): if hasattr(value, 'name'): return value.fold(policy=self) - maxlen = self.max_line_length if self.max_line_length else float('inf') + maxlen = self.max_line_length if self.max_line_length else sys.maxsize lines = value.splitlines() refold = (self.refold_source == 'all' or self.refold_source == 'long' and diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py index c2c437e6ac26..0aea934df434 100644 --- a/Lib/test/test_email/test_policy.py +++ b/Lib/test/test_email/test_policy.py @@ -1,4 +1,5 @@ import io +import sys import types import textwrap import unittest @@ -134,6 +135,18 @@ def test_policy_addition(self): for attr, value in expected.items(): self.assertEqual(getattr(added, attr), value) + def test_fold_zero_max_line_length(self): + expected = 'Subject: =?utf-8?q?=C3=A1?=\n' + + msg = email.message.EmailMessage() + msg['Subject'] = '?' + + p1 = email.policy.default.clone(max_line_length=0) + p2 = email.policy.default.clone(max_line_length=None) + + self.assertEqual(p1.fold('Subject', msg['Subject']), expected) + self.assertEqual(p2.fold('Subject', msg['Subject']), expected) + def test_register_defect(self): class Dummy: def __init__(self): diff --git a/Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst b/Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst new file mode 100644 index 000000000000..bfeab7231bdb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst @@ -0,0 +1,3 @@ +Fix the folding of email header when the max_line_length is 0 or None and the +header contains non-ascii characters. Contributed by Licht Takeuchi +(@Licht-T). From webhook-mailer at python.org Fri May 17 16:28:49 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 20:28:49 -0000 Subject: [Python-checkins] bpo-36782: Created C API wrappers and added missing tests for functions in the PyDateTimeAPI. (#13088) Message-ID: https://github.com/python/cpython/commit/98ff4d5fb6a9d01b0176b7786db61346952e5295 commit: 98ff4d5fb6a9d01b0176b7786db61346952e5295 branch: master author: Edison A <20975616+SimiCode at users.noreply.github.com> committer: Victor Stinner date: 2019-05-17T22:28:42+02:00 summary: bpo-36782: Created C API wrappers and added missing tests for functions in the PyDateTimeAPI. (#13088) * created a c API wrapper for pyDate_FromDate and added the test * ?? Added by blurb_it. * fixed auto-alignment by vscode * made changes as per PEP7 * Update 2019-05-04-21-25-19.bpo-36782.h3oPIb.rst * Refactored code as per requested changes * Remove Whitespace to Fix failed travis build * Update 2019-05-04-21-25-19.bpo-36782.h3oPIb.rst * Add a new line at end of ACKS * Added C API function for PyDateTime_FromDateAndTime * Added a test for the C API wrapper of PyDateTime_FromDateAndTime * Added C API function for PyDateTime_FromDateAndTime * Added a test for the C API wrapper of PyDateTime_FromDateAndTimeAndFold * Remove Whitespace using patchcheck * Added a C API function for PyTime_FromTime * Added a test for the C API wrapper of PyTime_FromTime * Added a C API function for PyTime_FromTimeAndFold * Added a test for the C API wrapper of PyTime_FromTimeAndFold * Added a C API function for PyDelta_FromDSU * Added a test for the C API wrapper of PyDelta_FromDSU * Refactor code, re-edit lines longer than 80 chars * Fix Whitespace issues in DatetimeTester * List all tests that were added in this PR * Update 2019-05-04-21-25-19.bpo-36782.h3oPIb.rst * Reformat code as per PEP7 guidelines * Remove unused varibles from another function * Added specific tests for the Fold Attribute * Update 2019-05-04-21-25-19.bpo-36782.h3oPIb.rst * Reformat code according to requested changes * Reformat code to PEP7 Guidelines * Reformat code to PEP7 Guidelines * Re-add name to blurb * Added a backtick to blurb file * Update 2019-05-04-21-25-19.bpo-36782.h3oPIb.rst * Remove the need to initialize mandatory parameters * Make the macro parameter mandatory * Re-arrange the order of unit-test args * Removed the need to initialize macro change all the int macro = 0 to int macro; now that macro is required Co-Authored-By: Paul Ganssle * Removed the need to initialize macro change all the `int macro = 0` to `int macro`; now that macro is required Co-Authored-By: Paul Ganssle * Removed the need to initialize macro change all the `int macro = 0` to `int macro`; now that macro is required Co-Authored-By: Paul Ganssle * Removed the need to initialize macro change all the `int macro = 0` to `int macro`; now that macro is required Co-Authored-By: Paul Ganssle * Removed the need to initialize macro change all the `int macro = 0` to `int macro`; now that macro is required Co-Authored-By: Paul Ganssle * Removed the need to initialize macro change all the `int macro = 0` to `int macro`; now that macro is required Co-Authored-By: Paul Ganssle files: A Misc/NEWS.d/next/Tests/2019-05-04-21-25-19.bpo-36782.h3oPIb.rst M Lib/test/datetimetester.py M Misc/ACKS M Modules/_testcapimodule.c diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index af0047fafd87..239a0b5ac830 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -6018,6 +6018,100 @@ class TZInfoSubclass(tzinfo): with self.subTest(arg=arg, exact=exact): self.assertFalse(is_tzinfo(arg, exact)) + def test_date_from_date(self): + exp_date = date(1993, 8, 26) + + for macro in [0, 1]: + with self.subTest(macro=macro): + c_api_date = _testcapi.get_date_fromdate( + macro, + exp_date.year, + exp_date.month, + exp_date.day) + + self.assertEqual(c_api_date, exp_date) + + def test_datetime_from_dateandtime(self): + exp_date = datetime(1993, 8, 26, 22, 12, 55, 99999) + + for macro in [0, 1]: + with self.subTest(macro=macro): + c_api_date = _testcapi.get_datetime_fromdateandtime( + macro, + exp_date.year, + exp_date.month, + exp_date.day, + exp_date.hour, + exp_date.minute, + exp_date.second, + exp_date.microsecond) + + self.assertEqual(c_api_date, exp_date) + + def test_datetime_from_dateandtimeandfold(self): + exp_date = datetime(1993, 8, 26, 22, 12, 55, 99999) + + for fold in [0, 1]: + for macro in [0, 1]: + with self.subTest(macro=macro, fold=fold): + c_api_date = _testcapi.get_datetime_fromdateandtimeandfold( + macro, + exp_date.year, + exp_date.month, + exp_date.day, + exp_date.hour, + exp_date.minute, + exp_date.second, + exp_date.microsecond, + exp_date.fold) + + self.assertEqual(c_api_date, exp_date) + self.assertEqual(c_api_date.fold, exp_date.fold) + + def test_time_from_time(self): + exp_time = time(22, 12, 55, 99999) + + for macro in [0, 1]: + with self.subTest(macro=macro): + c_api_time = _testcapi.get_time_fromtime( + macro, + exp_time.hour, + exp_time.minute, + exp_time.second, + exp_time.microsecond) + + self.assertEqual(c_api_time, exp_time) + + def test_time_from_timeandfold(self): + exp_time = time(22, 12, 55, 99999) + + for fold in [0, 1]: + for macro in [0, 1]: + with self.subTest(macro=macro, fold=fold): + c_api_time = _testcapi.get_time_fromtimeandfold( + macro, + exp_time.hour, + exp_time.minute, + exp_time.second, + exp_time.microsecond, + exp_time.fold) + + self.assertEqual(c_api_time, exp_time) + self.assertEqual(c_api_time.fold, exp_time.fold) + + def test_delta_from_dsu(self): + exp_delta = timedelta(26, 55, 99999) + + for macro in [0, 1]: + with self.subTest(macro=macro): + c_api_delta = _testcapi.get_delta_fromdsu( + macro, + exp_delta.days, + exp_delta.seconds, + exp_delta.microseconds) + + self.assertEqual(c_api_delta, exp_delta) + def test_date_from_timestamp(self): ts = datetime(1995, 4, 12).timestamp() @@ -6028,9 +6122,6 @@ def test_date_from_timestamp(self): self.assertEqual(d, date(1995, 4, 12)) def test_datetime_from_timestamp(self): - ts0 = datetime(1995, 4, 12).timestamp() - ts1 = datetime(1995, 4, 12, 12, 30).timestamp() - cases = [ ((1995, 4, 12), None, False), ((1995, 4, 12), None, True), diff --git a/Misc/ACKS b/Misc/ACKS index 06e288dfcb2f..8b3232551e1b 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1857,3 +1857,4 @@ Peter ?strand Zheao Li Carsten Klein Diego Rojas +Edison Abahurire diff --git a/Misc/NEWS.d/next/Tests/2019-05-04-21-25-19.bpo-36782.h3oPIb.rst b/Misc/NEWS.d/next/Tests/2019-05-04-21-25-19.bpo-36782.h3oPIb.rst new file mode 100644 index 000000000000..222fb386ca7b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-04-21-25-19.bpo-36782.h3oPIb.rst @@ -0,0 +1 @@ +Add tests for several C API functions in the :mod:`datetime` module. Patch by Edison Abahurire. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 59b42df279c4..2af553960cc7 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2340,6 +2340,168 @@ get_timezone_utc_capi(PyObject* self, PyObject *args) { } } +static PyObject * +get_date_fromdate(PyObject *self, PyObject *args) +{ + PyObject *rv = NULL; + int macro; + int year, month, day; + + if (!PyArg_ParseTuple(args, "piii", ¯o, &year, &month, &day)) { + return NULL; + } + + if (macro) { + rv = PyDate_FromDate(year, month, day); + } + else { + rv = PyDateTimeAPI->Date_FromDate( + year, month, day, + PyDateTimeAPI->DateType); + } + return rv; +} + +static PyObject * +get_datetime_fromdateandtime(PyObject *self, PyObject *args) +{ + PyObject *rv = NULL; + int macro; + int year, month, day; + int hour, minute, second, microsecond; + + if (!PyArg_ParseTuple(args, "piiiiiii", + ¯o, + &year, &month, &day, + &hour, &minute, &second, µsecond)) { + return NULL; + } + + if (macro) { + rv = PyDateTime_FromDateAndTime( + year, month, day, + hour, minute, second, microsecond); + } + else { + rv = PyDateTimeAPI->DateTime_FromDateAndTime( + year, month, day, + hour, minute, second, microsecond, + Py_None, + PyDateTimeAPI->DateTimeType); + } + return rv; +} + +static PyObject * +get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args) +{ + PyObject *rv = NULL; + int macro; + int year, month, day; + int hour, minute, second, microsecond, fold; + + if (!PyArg_ParseTuple(args, "piiiiiiii", + ¯o, + &year, &month, &day, + &hour, &minute, &second, µsecond, + &fold)) { + return NULL; + } + + if (macro) { + rv = PyDateTime_FromDateAndTimeAndFold( + year, month, day, + hour, minute, second, microsecond, + fold); + } + else { + rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold( + year, month, day, + hour, minute, second, microsecond, + Py_None, + fold, + PyDateTimeAPI->DateTimeType); + } + return rv; +} + +static PyObject * +get_time_fromtime(PyObject *self, PyObject *args) +{ + PyObject *rv = NULL; + int macro; + int hour, minute, second, microsecond; + + if (!PyArg_ParseTuple(args, "piiii", + ¯o, + &hour, &minute, &second, µsecond)) { + return NULL; + } + + if (macro) { + rv = PyTime_FromTime(hour, minute, second, microsecond); + } + else { + rv = PyDateTimeAPI->Time_FromTime( + hour, minute, second, microsecond, + Py_None, + PyDateTimeAPI->TimeType); + } + return rv; +} + +static PyObject * +get_time_fromtimeandfold(PyObject *self, PyObject *args) +{ + PyObject *rv = NULL; + int macro; + int hour, minute, second, microsecond, fold; + + if (!PyArg_ParseTuple(args, "piiiii", + ¯o, + &hour, &minute, &second, µsecond, + &fold)) { + return NULL; + } + + if (macro) { + rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold); + } + else { + rv = PyDateTimeAPI->Time_FromTimeAndFold( + hour, minute, second, microsecond, + Py_None, + fold, + PyDateTimeAPI->TimeType); + } + return rv; +} + +static PyObject * +get_delta_fromdsu(PyObject *self, PyObject *args) +{ + PyObject *rv = NULL; + int macro; + int days, seconds, microseconds; + + if (!PyArg_ParseTuple(args, "piii", + ¯o, + &days, &seconds, µseconds)) { + return NULL; + } + + if (macro) { + rv = PyDelta_FromDSU(days, seconds, microseconds); + } + else { + rv = PyDateTimeAPI->Delta_FromDelta( + days, seconds, microseconds, 1, + PyDateTimeAPI->DeltaType); + } + + return rv; +} + static PyObject * get_date_fromtimestamp(PyObject* self, PyObject *args) { @@ -4826,7 +4988,7 @@ static PyMethodDef TestMethods[] = { {"set_errno", set_errno, METH_VARARGS}, {"test_config", test_config, METH_NOARGS}, {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS}, - {"test_datetime_capi", test_datetime_capi, METH_NOARGS}, + {"test_datetime_capi", test_datetime_capi, METH_NOARGS}, {"datetime_check_date", datetime_check_date, METH_VARARGS}, {"datetime_check_time", datetime_check_time, METH_VARARGS}, {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS}, @@ -4835,6 +4997,12 @@ static PyMethodDef TestMethods[] = { {"make_timezones_capi", make_timezones_capi, METH_NOARGS}, {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS}, {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS}, + {"get_date_fromdate", get_date_fromdate, METH_VARARGS}, + {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS}, + {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS}, + {"get_time_fromtime", get_time_fromtime, METH_VARARGS}, + {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS}, + {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS}, {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS}, {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS}, {"test_list_api", test_list_api, METH_NOARGS}, From webhook-mailer at python.org Fri May 17 16:44:28 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 20:44:28 -0000 Subject: [Python-checkins] bpo-36945: Add _PyPreConfig.configure_locale (GH-13368) Message-ID: https://github.com/python/cpython/commit/bcfbbd704646622e919c1306a91fba61d603483d commit: bcfbbd704646622e919c1306a91fba61d603483d branch: master author: Victor Stinner committer: GitHub date: 2019-05-17T22:44:16+02:00 summary: bpo-36945: Add _PyPreConfig.configure_locale (GH-13368) _PyPreConfig_InitIsolatedConfig() sets configure_locale to 0 to prevent Python to modify the LC_CTYPE locale. In that case, coerce_c_locale an coerce_c_locale_warn are set to 0 as well. files: M Include/cpython/coreconfig.h M Lib/test/test_embed.py M Programs/_testembed.c M Python/preconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 7d561ceb3eec..73861a96d777 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -79,6 +79,10 @@ typedef struct { set to !Py_IgnoreEnvironmentFlag. */ int use_environment; + /* Set the LC_CTYPE locale to the user preferred locale? If equals to 0, + set coerce_c_locale and coerce_c_locale_warn to 0. */ + int configure_locale; + /* Coerce the LC_CTYPE locale if it's equal to "C"? (PEP 538) Set to 0 by PYTHONCOERCECLOCALE=0. Set to 1 by PYTHONCOERCECLOCALE=1. @@ -147,6 +151,7 @@ typedef struct { ._config_version = _Py_CONFIG_VERSION, \ .isolated = -1, \ .use_environment = -1, \ + .configure_locale = 1, \ .utf8_mode = -2, \ .dev_mode = -1, \ .allocator = PYMEM_ALLOCATOR_NOT_SET} diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 50badd8e585c..c389df85fb6c 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -272,10 +272,15 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): maxDiff = 4096 UTF8_MODE_ERRORS = ('surrogatepass' if MS_WINDOWS else 'surrogateescape') - # Mark config which should be get by get_default_config() + # Marker to read the default configuration: get_default_config() GET_DEFAULT_CONFIG = object() + + # Marker to ignore a configuration parameter + IGNORE_CONFIG = object() + DEFAULT_PRE_CONFIG = { 'allocator': PYMEM_ALLOCATOR_NOT_SET, + 'configure_locale': 1, 'coerce_c_locale': 0, 'coerce_c_locale_warn': 0, 'utf8_mode': 0, @@ -405,7 +410,7 @@ def main_xoptions(self, xoptions_list): xoptions[opt] = True return xoptions - def get_expected_config(self, expected, env, add_path=None): + def get_expected_config(self, expected_preconfig, expected, env, add_path=None): expected = dict(self.DEFAULT_CORE_CONFIG, **expected) code = textwrap.dedent(''' @@ -471,6 +476,14 @@ def get_expected_config(self, expected, env, add_path=None): if add_path is not None: expected['module_search_paths'].append(add_path) + + if not expected_preconfig['configure_locale']: + # there is no easy way to get the locale encoding before + # setlocale(LC_CTYPE, "") is called: don't test encodings + for key in ('filesystem_encoding', 'filesystem_errors', + 'stdio_encoding', 'stdio_errors'): + expected[key] = self.IGNORE_CONFIG + return expected def check_pre_config(self, config, expected): @@ -480,6 +493,10 @@ def check_pre_config(self, config, expected): def check_core_config(self, config, expected): core_config = dict(config['core_config']) + for key, value in list(expected.items()): + if value is self.IGNORE_CONFIG: + del core_config[key] + del expected[key] self.assertEqual(core_config, expected) def check_global_config(self, config): @@ -517,7 +534,7 @@ def check_config(self, testname, expected_config, expected_preconfig, env['PYTHONUTF8'] = '0' expected_preconfig = dict(self.DEFAULT_PRE_CONFIG, **expected_preconfig) - expected_config = self.get_expected_config(expected_config, env, add_path) + expected_config = self.get_expected_config(expected_preconfig, expected_config, env, add_path) for key in self.COPY_PRE_CONFIG: if key not in expected_preconfig: expected_preconfig[key] = expected_config[key] @@ -692,7 +709,9 @@ def test_preinit_isolated2(self): self.check_config("preinit_isolated2", config, preconfig) def test_init_isolated_config(self): - preconfig = {} + preconfig = { + 'configure_locale': 0, + } config = { 'isolated': 1, 'use_environment': 0, @@ -710,6 +729,13 @@ def test_init_python_config(self): } self.check_config("init_python_config", config, preconfig) + def test_init_dont_configure_locale(self): + # _PyPreConfig.configure_locale=0 + preconfig = { + 'configure_locale': 0, + } + self.check_config("init_dont_configure_locale", {}, preconfig) + def test_init_read_set(self): preconfig = {} core_config = { diff --git a/Programs/_testembed.c b/Programs/_testembed.c index e6896966f53b..000b2fcec984 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -788,6 +788,33 @@ static int init_python_config(void) } +static int init_dont_configure_locale(void) +{ + _PyInitError err; + + _PyPreConfig preconfig = _PyPreConfig_INIT; + preconfig.configure_locale = 0; + preconfig.coerce_c_locale = 1; + preconfig.coerce_c_locale_warn = 1; + + err = _Py_PreInitialize(&preconfig); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + _PyCoreConfig config = _PyCoreConfig_INIT; + config.program_name = L"./_testembed"; + err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + dump_config(); + Py_Finalize(); + return 0; +} + + static int init_dev_mode(void) { _PyCoreConfig config; @@ -966,6 +993,7 @@ static struct TestCase TestCases[] = { { "init_env", test_init_env }, { "init_env_dev_mode", test_init_env_dev_mode }, { "init_env_dev_mode_alloc", test_init_env_dev_mode_alloc }, + { "init_dont_configure_locale", init_dont_configure_locale }, { "init_dev_mode", init_dev_mode }, { "init_isolated_flag", init_isolated_flag }, { "init_isolated_config", init_isolated_config }, diff --git a/Python/preconfig.c b/Python/preconfig.c index 7814ee08a63f..985af39cb00d 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -286,6 +286,7 @@ _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config) { _PyPreConfig_Init(config); + config->configure_locale = 0; config->isolated = 1; config->use_environment = 0; #ifdef MS_WINDOWS @@ -312,6 +313,7 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) COPY_ATTR(isolated); COPY_ATTR(use_environment); + COPY_ATTR(configure_locale); COPY_ATTR(dev_mode); COPY_ATTR(coerce_c_locale); COPY_ATTR(coerce_c_locale_warn); @@ -360,6 +362,7 @@ _PyPreConfig_AsDict(const _PyPreConfig *config) SET_ITEM_INT(isolated); SET_ITEM_INT(use_environment); + SET_ITEM_INT(configure_locale); SET_ITEM_INT(coerce_c_locale); SET_ITEM_INT(coerce_c_locale_warn); SET_ITEM_INT(utf8_mode); @@ -603,6 +606,12 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) static void preconfig_init_coerce_c_locale(_PyPreConfig *config) { + if (!config->configure_locale) { + config->coerce_c_locale = 0; + config->coerce_c_locale_warn = 0; + return; + } + const char *env = _Py_GetEnv(config->use_environment, "PYTHONCOERCECLOCALE"); if (env) { if (strcmp(env, "0") == 0) { @@ -746,7 +755,9 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) } /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); + if (config->configure_locale) { + _Py_SetLocaleFromEnv(LC_CTYPE); + } _PyPreCmdline cmdline = _PyPreCmdline_INIT; int init_utf8_mode = Py_UTF8Mode; @@ -879,12 +890,14 @@ _PyPreConfig_Write(const _PyPreConfig *config) _PyPreConfig_SetGlobalConfig(config); - if (config->coerce_c_locale) { - _Py_CoerceLegacyLocale(config->coerce_c_locale_warn); - } + if (config->configure_locale) { + if (config->coerce_c_locale) { + _Py_CoerceLegacyLocale(config->coerce_c_locale_warn); + } - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); + /* Set LC_CTYPE to the user preferred locale */ + _Py_SetLocaleFromEnv(LC_CTYPE); + } /* Write the new pre-configuration into _PyRuntime */ PyMemAllocatorEx old_alloc; From webhook-mailer at python.org Fri May 17 16:47:17 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 17 May 2019 20:47:17 -0000 Subject: [Python-checkins] bpo-33524: Fix the folding of email header when max_line_length is 0 or None (GH-13391) Message-ID: https://github.com/python/cpython/commit/5386aaf07835889e90fb33e95b6d37197f8cfea0 commit: 5386aaf07835889e90fb33e95b6d37197f8cfea0 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-17T13:47:12-07:00 summary: bpo-33524: Fix the folding of email header when max_line_length is 0 or None (GH-13391) and there are non-ascii characters in the header. (cherry picked from commit feac6cd7753425fba006e97e2d9b74a0c0c75894) Co-authored-by: Abhilash Raj files: A Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst M Lib/email/_header_value_parser.py M Lib/email/policy.py M Lib/test/test_email/test_policy.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index faf8755171e3..958ef5018c25 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -68,6 +68,7 @@ """ import re +import sys import urllib # For urllib.parse.unquote from string import hexdigits from collections import OrderedDict @@ -2591,7 +2592,7 @@ def _refold_parse_tree(parse_tree, *, policy): """ # max_line_length 0/None means no limit, ie: infinitely long. - maxlen = policy.max_line_length or float("+inf") + maxlen = policy.max_line_length or sys.maxsize encoding = 'utf-8' if policy.utf8 else 'us-ascii' lines = [''] last_ew = None diff --git a/Lib/email/policy.py b/Lib/email/policy.py index 5131311ac5ef..611deb50bb52 100644 --- a/Lib/email/policy.py +++ b/Lib/email/policy.py @@ -3,6 +3,7 @@ """ import re +import sys from email._policybase import Policy, Compat32, compat32, _extend_docstrings from email.utils import _has_surrogates from email.headerregistry import HeaderRegistry as HeaderRegistry @@ -203,7 +204,7 @@ def fold_binary(self, name, value): def _fold(self, name, value, refold_binary=False): if hasattr(value, 'name'): return value.fold(policy=self) - maxlen = self.max_line_length if self.max_line_length else float('inf') + maxlen = self.max_line_length if self.max_line_length else sys.maxsize lines = value.splitlines() refold = (self.refold_source == 'all' or self.refold_source == 'long' and diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py index c2c437e6ac26..0aea934df434 100644 --- a/Lib/test/test_email/test_policy.py +++ b/Lib/test/test_email/test_policy.py @@ -1,4 +1,5 @@ import io +import sys import types import textwrap import unittest @@ -134,6 +135,18 @@ def test_policy_addition(self): for attr, value in expected.items(): self.assertEqual(getattr(added, attr), value) + def test_fold_zero_max_line_length(self): + expected = 'Subject: =?utf-8?q?=C3=A1?=\n' + + msg = email.message.EmailMessage() + msg['Subject'] = '?' + + p1 = email.policy.default.clone(max_line_length=0) + p2 = email.policy.default.clone(max_line_length=None) + + self.assertEqual(p1.fold('Subject', msg['Subject']), expected) + self.assertEqual(p2.fold('Subject', msg['Subject']), expected) + def test_register_defect(self): class Dummy: def __init__(self): diff --git a/Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst b/Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst new file mode 100644 index 000000000000..bfeab7231bdb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst @@ -0,0 +1,3 @@ +Fix the folding of email header when the max_line_length is 0 or None and the +header contains non-ascii characters. Contributed by Licht Takeuchi +(@Licht-T). From webhook-mailer at python.org Fri May 17 17:05:36 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 21:05:36 -0000 Subject: [Python-checkins] bpo-36763: _Py_RunMain() doesn't call Py_Exit() anymore (GH-13390) Message-ID: https://github.com/python/cpython/commit/12083284c54be25abadd85781d36b63731dc1f0c commit: 12083284c54be25abadd85781d36b63731dc1f0c branch: master author: Victor Stinner committer: GitHub date: 2019-05-17T23:05:29+02:00 summary: bpo-36763: _Py_RunMain() doesn't call Py_Exit() anymore (GH-13390) Py_Main() and _Py_RunMain() now return the exitcode rather than calling Py_Exit(exitcode) when calling PyErr_Print() if the current exception type is SystemExit. * Add _Py_HandleSystemExit(). * Add pymain_exit_err_print(). * Add pymain_exit_print(). files: A Misc/NEWS.d/next/C API/2019-05-17-19-23-24.bpo-36763.TswmDy.rst M Include/internal/pycore_pylifecycle.h M Modules/main.c M Python/pythonrun.c diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 0d83acdf28aa..4684ebea44a6 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -100,6 +100,8 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromCoreConfig( const _PyCoreConfig *coreconfig, const _PyArgv *args); +PyAPI_FUNC(int) _Py_HandleSystemExit(int *exitcode_p); + #ifdef __cplusplus } #endif diff --git a/Misc/NEWS.d/next/C API/2019-05-17-19-23-24.bpo-36763.TswmDy.rst b/Misc/NEWS.d/next/C API/2019-05-17-19-23-24.bpo-36763.TswmDy.rst new file mode 100644 index 000000000000..29c016600dbf --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-05-17-19-23-24.bpo-36763.TswmDy.rst @@ -0,0 +1,3 @@ +``Py_Main()`` now returns the exitcode rather than calling +``Py_Exit(exitcode)`` when calling ``PyErr_Print()`` if the current +exception type is ``SystemExit``. diff --git a/Modules/main.c b/Modules/main.c index 72546a21cac4..6d4b351e5e17 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -94,8 +94,34 @@ stdin_is_interactive(const _PyCoreConfig *config) } -static PyObject * -pymain_get_importer(const wchar_t *filename) +/* Display the current Python exception and return an exitcode */ +static int +pymain_err_print(int *exitcode_p) +{ + int exitcode; + if (_Py_HandleSystemExit(&exitcode)) { + *exitcode_p = exitcode; + return 1; + } + + PyErr_Print(); + return 0; +} + + +static int +pymain_exit_err_print(void) +{ + int exitcode = 1; + pymain_err_print(&exitcode); + return exitcode; +} + + +/* Write an exitcode into *exitcode and return 1 if we have to exit Python. + Return 0 otherwise. */ +static int +pymain_get_importer(const wchar_t *filename, PyObject **importer_p, int *exitcode) { PyObject *sys_path0 = NULL, *importer; @@ -112,17 +138,18 @@ pymain_get_importer(const wchar_t *filename) if (importer == Py_None) { Py_DECREF(sys_path0); Py_DECREF(importer); - return NULL; + return 0; } Py_DECREF(importer); - return sys_path0; + *importer_p = sys_path0; + return 0; error: Py_XDECREF(sys_path0); + PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n"); - PyErr_Print(); - return NULL; + return pymain_err_print(exitcode); } @@ -217,8 +244,7 @@ pymain_run_command(wchar_t *command, PyCompilerFlags *cf) error: PySys_WriteStderr("Unable to decode the command from the command line:\n"); - PyErr_Print(); - return 1; + return pymain_exit_err_print(); } @@ -229,44 +255,37 @@ pymain_run_module(const wchar_t *modname, int set_argv0) runpy = PyImport_ImportModule("runpy"); if (runpy == NULL) { fprintf(stderr, "Could not import runpy module\n"); - PyErr_Print(); - return -1; + return pymain_exit_err_print(); } runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main"); if (runmodule == NULL) { fprintf(stderr, "Could not access runpy._run_module_as_main\n"); - PyErr_Print(); Py_DECREF(runpy); - return -1; + return pymain_exit_err_print(); } module = PyUnicode_FromWideChar(modname, wcslen(modname)); if (module == NULL) { fprintf(stderr, "Could not convert module name to unicode\n"); - PyErr_Print(); Py_DECREF(runpy); Py_DECREF(runmodule); - return -1; + return pymain_exit_err_print(); } runargs = Py_BuildValue("(Oi)", module, set_argv0); if (runargs == NULL) { fprintf(stderr, "Could not create arguments for runpy._run_module_as_main\n"); - PyErr_Print(); Py_DECREF(runpy); Py_DECREF(runmodule); Py_DECREF(module); - return -1; + return pymain_exit_err_print(); } result = PyObject_Call(runmodule, runargs, NULL); - if (result == NULL) { - PyErr_Print(); - } Py_DECREF(runpy); Py_DECREF(runmodule); Py_DECREF(module); Py_DECREF(runargs); if (result == NULL) { - return -1; + return pymain_exit_err_print(); } Py_DECREF(result); return 0; @@ -315,9 +334,8 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) /* call pending calls like signal handlers (SIGINT) */ if (Py_MakePendingCalls() == -1) { - PyErr_Print(); fclose(fp); - return 1; + return pymain_exit_err_print(); } PyObject *unicode, *bytes = NULL; @@ -343,34 +361,36 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) } -static void -pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf) +static int +pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) { const char *startup = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP"); if (startup == NULL) { - return; + return 0; } FILE *fp = _Py_fopen(startup, "r"); if (fp == NULL) { int save_errno = errno; PySys_WriteStderr("Could not open PYTHONSTARTUP\n"); + errno = save_errno; + PyErr_SetFromErrnoWithFilename(PyExc_OSError, startup); - PyErr_SetFromErrnoWithFilename(PyExc_OSError, - startup); - PyErr_Print(); - return; + return pymain_err_print(exitcode); } (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); PyErr_Clear(); fclose(fp); + return 0; } -static void -pymain_run_interactive_hook(void) +/* Write an exitcode into *exitcode and return 1 if we have to exit Python. + Return 0 otherwise. */ +static int +pymain_run_interactive_hook(int *exitcode) { PyObject *sys, *hook, *result; sys = PyImport_ImportModule("sys"); @@ -382,7 +402,7 @@ pymain_run_interactive_hook(void) Py_DECREF(sys); if (hook == NULL) { PyErr_Clear(); - return; + return 0; } result = _PyObject_CallNoArg(hook); @@ -392,11 +412,11 @@ pymain_run_interactive_hook(void) } Py_DECREF(result); - return; + return 0; error: PySys_WriteStderr("Failed calling sys.__interactivehook__\n"); - PyErr_Print(); + return pymain_err_print(exitcode); } @@ -406,14 +426,20 @@ pymain_run_stdin(_PyCoreConfig *config, PyCompilerFlags *cf) if (stdin_is_interactive(config)) { config->inspect = 0; Py_InspectFlag = 0; /* do exit on SystemExit */ - pymain_run_startup(config, cf); - pymain_run_interactive_hook(); + + int exitcode; + if (pymain_run_startup(config, cf, &exitcode)) { + return exitcode; + } + + if (pymain_run_interactive_hook(&exitcode)) { + return exitcode; + } } /* call pending calls like signal handlers (SIGINT) */ if (Py_MakePendingCalls() == -1) { - PyErr_Print(); - return 1; + return pymain_exit_err_print(); } int run = PyRun_AnyFileExFlags(stdin, "", 0, cf); @@ -437,7 +463,9 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) config->inspect = 0; Py_InspectFlag = 0; - pymain_run_interactive_hook(); + if (pymain_run_interactive_hook(exitcode)) { + return; + } int res = PyRun_AnyFileFlags(stdin, "", cf); *exitcode = (res != 0); @@ -457,8 +485,11 @@ pymain_run_python(int *exitcode) __main__.py, main_importer_path is set to filename and will be prepended to sys.path. - Otherwise, main_importer_path is set to NULL. */ - main_importer_path = pymain_get_importer(config->run_filename); + Otherwise, main_importer_path is left unchanged. */ + if (pymain_get_importer(config->run_filename, &main_importer_path, + exitcode)) { + return; + } } if (main_importer_path != NULL) { @@ -491,11 +522,10 @@ pymain_run_python(int *exitcode) *exitcode = pymain_run_command(config->run_command, &cf); } else if (config->run_module) { - *exitcode = (pymain_run_module(config->run_module, 1) != 0); + *exitcode = pymain_run_module(config->run_module, 1); } else if (main_importer_path != NULL) { - int sts = pymain_run_module(L"__main__", 0); - *exitcode = (sts != 0); + *exitcode = pymain_run_module(L"__main__", 0); } else if (config->run_filename != NULL) { *exitcode = pymain_run_file(config, &cf); @@ -508,8 +538,7 @@ pymain_run_python(int *exitcode) goto done; error: - PyErr_Print(); - *exitcode = 1; + *exitcode = pymain_exit_err_print(); done: Py_XDECREF(main_importer_path); diff --git a/Python/pythonrun.c b/Python/pythonrun.c index bc131fd7e5ec..d2b27615903f 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -585,23 +585,31 @@ print_error_text(PyObject *f, int offset, PyObject *text_obj) PyFile_WriteString("^\n", f); } -static void -handle_system_exit(void) -{ - PyObject *exception, *value, *tb; - int exitcode = 0; +int +_Py_HandleSystemExit(int *exitcode_p) +{ int inspect = _PyInterpreterState_GET_UNSAFE()->core_config.inspect; if (inspect) { /* Don't exit if -i flag was given. This flag is set to 0 * when entering interactive mode for inspecting. */ - return; + return 0; } + if (!PyErr_ExceptionMatches(PyExc_SystemExit)) { + return 0; + } + + PyObject *exception, *value, *tb; PyErr_Fetch(&exception, &value, &tb); + fflush(stdout); - if (value == NULL || value == Py_None) + + int exitcode = 0; + if (value == NULL || value == Py_None) { goto done; + } + if (PyExceptionInstance_Check(value)) { /* The error code should be in the `code' attribute. */ _Py_IDENTIFIER(code); @@ -615,8 +623,10 @@ handle_system_exit(void) /* If we failed to dig out the 'code' attribute, just let the else clause below print the error. */ } - if (PyLong_Check(value)) + + if (PyLong_Check(value)) { exitcode = (int)PyLong_AsLong(value); + } else { PyObject *sys_stderr = _PySys_GetObjectId(&PyId_stderr); /* We clear the exception here to avoid triggering the assertion @@ -633,6 +643,7 @@ handle_system_exit(void) PySys_WriteStderr("\n"); exitcode = 1; } + done: /* Restore and clear the exception info, in order to properly decref * the exception, value, and traceback. If we just exit instead, @@ -641,18 +652,28 @@ handle_system_exit(void) */ PyErr_Restore(exception, value, tb); PyErr_Clear(); - Py_Exit(exitcode); - /* NOTREACHED */ + *exitcode_p = exitcode; + return 1; } + +static void +handle_system_exit(void) +{ + int exitcode; + if (_Py_HandleSystemExit(&exitcode)) { + Py_Exit(exitcode); + } +} + + void PyErr_PrintEx(int set_sys_last_vars) { PyObject *exception, *v, *tb, *hook; - if (PyErr_ExceptionMatches(PyExc_SystemExit)) { - handle_system_exit(); - } + handle_system_exit(); + PyErr_Fetch(&exception, &v, &tb); if (exception == NULL) return; @@ -686,10 +707,9 @@ PyErr_PrintEx(int set_sys_last_vars) stack[2] = tb; result = _PyObject_FastCall(hook, stack, 3); if (result == NULL) { + handle_system_exit(); + PyObject *exception2, *v2, *tb2; - if (PyErr_ExceptionMatches(PyExc_SystemExit)) { - handle_system_exit(); - } PyErr_Fetch(&exception2, &v2, &tb2); PyErr_NormalizeException(&exception2, &v2, &tb2); /* It should not be possible for exception2 or v2 From webhook-mailer at python.org Fri May 17 17:08:25 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 17 May 2019 21:08:25 -0000 Subject: [Python-checkins] bpo-36908: 'This module is always available' isn't helpful. (GH-13297) Message-ID: https://github.com/python/cpython/commit/740a7cde9c0af5a237a7f6525b38d65a83f4fbf1 commit: 740a7cde9c0af5a237a7f6525b38d65a83f4fbf1 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-17T14:08:21-07:00 summary: bpo-36908: 'This module is always available' isn't helpful. (GH-13297) Makes the documentation of math and cmath module more helpful for the beginners. (cherry picked from commit 6faad355db6c2bd4a0ade7868f245b42c04f5337) Co-authored-by: Ned Batchelder files: M Doc/library/cmath.rst M Doc/library/math.rst M Modules/cmathmodule.c M Modules/mathmodule.c diff --git a/Doc/library/cmath.rst b/Doc/library/cmath.rst index 9d81730f2012..28cd96b0e12d 100644 --- a/Doc/library/cmath.rst +++ b/Doc/library/cmath.rst @@ -6,13 +6,12 @@ -------------- -This module is always available. It provides access to mathematical functions -for complex numbers. The functions in this module accept integers, -floating-point numbers or complex numbers as arguments. They will also accept -any Python object that has either a :meth:`__complex__` or a :meth:`__float__` -method: these methods are used to convert the object to a complex or -floating-point number, respectively, and the function is then applied to the -result of the conversion. +This module provides access to mathematical functions for complex numbers. The +functions in this module accept integers, floating-point numbers or complex +numbers as arguments. They will also accept any Python object that has either a +:meth:`__complex__` or a :meth:`__float__` method: these methods are used to +convert the object to a complex or floating-point number, respectively, and +the function is then applied to the result of the conversion. .. note:: diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 33aec573a1f2..b06b054d516a 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -10,8 +10,8 @@ -------------- -This module is always available. It provides access to the mathematical -functions defined by the C standard. +This module provides access to the mathematical functions defined by the C +standard. These functions cannot be used with complex numbers; use the functions of the same name from the :mod:`cmath` module if you require support for complex diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 8319767b8a9e..b421f04fa605 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -1232,8 +1232,8 @@ cmath_isclose_impl(PyObject *module, Py_complex a, Py_complex b, } PyDoc_STRVAR(module_doc, -"This module is always available. It provides access to mathematical\n" -"functions for complex numbers."); +"This module provides access to mathematical functions for complex\n" +"numbers."); static PyMethodDef cmath_methods[] = { CMATH_ACOS_METHODDEF diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 9eaeff11597f..8eedca8a30b9 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2371,8 +2371,8 @@ static PyMethodDef math_methods[] = { PyDoc_STRVAR(module_doc, -"This module is always available. It provides access to the\n" -"mathematical functions defined by the C standard."); +"This module provides access to the mathematical functions\n" +"defined by the C standard."); static struct PyModuleDef mathmodule = { From webhook-mailer at python.org Fri May 17 17:54:06 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 21:54:06 -0000 Subject: [Python-checkins] bpo-36763: Add _PyInitError functions (GH-13395) Message-ID: https://github.com/python/cpython/commit/871ff77c1cd334a141d52b0d003c080a1928731e commit: 871ff77c1cd334a141d52b0d003c080a1928731e branch: master author: Victor Stinner committer: GitHub date: 2019-05-17T23:54:00+02:00 summary: bpo-36763: Add _PyInitError functions (GH-13395) * Add _PyInitError functions: * _PyInitError_Ok() * _PyInitError_Error() * _PyInitError_NoMemory() * _PyInitError_Exit() * _PyInitError_IsError() * _PyInitError_IsExit() * _PyInitError_Failed() * frozenmain.c and _testembed.c now use functions rather than macros. * Move _Py_INIT_xxx() macros to the internal API. * Move _PyWstrList_INIT macro to the internal API. files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Modules/faulthandler.c M Modules/getpath.c M Objects/exceptions.c M Objects/object.c M PC/getpathp.c M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/bootstrap_hash.c M Python/coreconfig.c M Python/frozenmain.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 73861a96d777..f05eddad912f 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -18,34 +18,13 @@ typedef struct { int exitcode; } _PyInitError; -/* Almost all errors causing Python initialization to fail */ -#ifdef _MSC_VER - /* Visual Studio 2015 doesn't implement C99 __func__ in C */ -# define _Py_INIT_GET_FUNC() __FUNCTION__ -#else -# define _Py_INIT_GET_FUNC() __func__ -#endif - -#define _Py_INIT_OK() \ - (_PyInitError){._type = _Py_INIT_ERR_TYPE_OK,} - /* other fields are set to 0 */ -#define _Py_INIT_ERR(ERR_MSG) \ - (_PyInitError){ \ - ._type = _Py_INIT_ERR_TYPE_ERROR, \ - ._func = _Py_INIT_GET_FUNC(), \ - .err_msg = (ERR_MSG)} - /* other fields are set to 0 */ -#define _Py_INIT_NO_MEMORY() _Py_INIT_ERR("memory allocation failed") -#define _Py_INIT_EXIT(EXITCODE) \ - (_PyInitError){ \ - ._type = _Py_INIT_ERR_TYPE_EXIT, \ - .exitcode = (EXITCODE)} -#define _Py_INIT_IS_ERROR(err) \ - (err._type == _Py_INIT_ERR_TYPE_ERROR) -#define _Py_INIT_IS_EXIT(err) \ - (err._type == _Py_INIT_ERR_TYPE_EXIT) -#define _Py_INIT_FAILED(err) \ - (err._type != _Py_INIT_ERR_TYPE_OK) +PyAPI_FUNC(_PyInitError) _PyInitError_Ok(void); +PyAPI_FUNC(_PyInitError) _PyInitError_Error(const char *err_msg); +PyAPI_FUNC(_PyInitError) _PyInitError_NoMemory(void); +PyAPI_FUNC(_PyInitError) _PyInitError_Exit(int exitcode); +PyAPI_FUNC(int) _PyInitError_IsError(_PyInitError err); +PyAPI_FUNC(int) _PyInitError_IsExit(_PyInitError err); +PyAPI_FUNC(int) _PyInitError_Failed(_PyInitError err); /* --- _PyWstrList ------------------------------------------------ */ @@ -56,8 +35,6 @@ typedef struct { wchar_t **items; } _PyWstrList; -#define _PyWstrList_INIT (_PyWstrList){.length = 0, .items = NULL} - /* --- _PyPreConfig ----------------------------------------------- */ diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index e9c6d9fee817..80aec21f2c80 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -10,9 +10,41 @@ extern "C" { #include "pycore_pystate.h" /* _PyRuntimeState */ +/* --- _PyInitError ----------------------------------------------- */ + +/* Almost all errors causing Python initialization to fail */ +#ifdef _MSC_VER + /* Visual Studio 2015 doesn't implement C99 __func__ in C */ +# define _Py_INIT_GET_FUNC() __FUNCTION__ +#else +# define _Py_INIT_GET_FUNC() __func__ +#endif + +#define _Py_INIT_OK() \ + (_PyInitError){._type = _Py_INIT_ERR_TYPE_OK,} + /* other fields are set to 0 */ +#define _Py_INIT_ERR(ERR_MSG) \ + (_PyInitError){ \ + ._type = _Py_INIT_ERR_TYPE_ERROR, \ + ._func = _Py_INIT_GET_FUNC(), \ + .err_msg = (ERR_MSG)} + /* other fields are set to 0 */ +#define _Py_INIT_NO_MEMORY() _Py_INIT_ERR("memory allocation failed") +#define _Py_INIT_EXIT(EXITCODE) \ + (_PyInitError){ \ + ._type = _Py_INIT_ERR_TYPE_EXIT, \ + .exitcode = (EXITCODE)} +#define _Py_INIT_IS_ERROR(err) \ + (err._type == _Py_INIT_ERR_TYPE_ERROR) +#define _Py_INIT_IS_EXIT(err) \ + (err._type == _Py_INIT_ERR_TYPE_EXIT) +#define _Py_INIT_FAILED(err) \ + (err._type != _Py_INIT_ERR_TYPE_OK) /* --- _PyWstrList ------------------------------------------------ */ +#define _PyWstrList_INIT (_PyWstrList){.length = 0, .items = NULL} + #ifndef NDEBUG PyAPI_FUNC(int) _PyWstrList_CheckConsistency(const _PyWstrList *list); #endif diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 63a9b91ac469..2083a03198fe 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_coreconfig.h" #include "pythread.h" #include #include diff --git a/Modules/getpath.c b/Modules/getpath.c index 34357e47bc23..3dcfcef7bd78 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -1,6 +1,7 @@ /* Return the initial module search path. */ #include "Python.h" +#include "pycore_coreconfig.h" #include "osdefs.h" #include "pycore_fileutils.h" #include "pycore_pathconfig.h" diff --git a/Objects/exceptions.c b/Objects/exceptions.c index b40ecb78d456..4dad0b24cee8 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -6,6 +6,7 @@ #define PY_SSIZE_T_CLEAN #include +#include "pycore_coreconfig.h" #include "pycore_object.h" #include "pycore_pymem.h" #include "pycore_pystate.h" diff --git a/Objects/object.c b/Objects/object.c index cb727943cb34..604f5e0d4882 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2,6 +2,7 @@ /* Generic object operations; and implementation of None */ #include "Python.h" +#include "pycore_coreconfig.h" #include "pycore_object.h" #include "pycore_pystate.h" #include "pycore_context.h" diff --git a/PC/getpathp.c b/PC/getpathp.c index 76d3a081b363..64aa1e0d141f 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -80,6 +80,7 @@ #include "Python.h" +#include "pycore_coreconfig.h" #include "pycore_pystate.h" #include "osdefs.h" #include diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index bc29297a6b9d..d89d66abee73 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -90,7 +90,7 @@ main(int argc, char *argv[]) _PyInitError err = _Py_InitializeFromConfig(&config); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any memory: program_name is a constant string. */ - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 000b2fcec984..2352179cc6fc 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -389,7 +389,7 @@ static int test_init_from_config(void) preconfig.utf8_mode = 1; err = _Py_PreInitialize(&preconfig); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -512,7 +512,7 @@ static int test_init_from_config(void) config.pathconfig_warnings = 0; err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } dump_config(); @@ -543,7 +543,7 @@ static int test_init_parse_argv(int parse_argv) config.parse_argv = parse_argv; err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } dump_config(); @@ -653,7 +653,7 @@ static int init_isolated_flag(void) test_init_env_dev_mode_putenvs(); err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } dump_config(); @@ -672,7 +672,7 @@ static int test_preinit_isolated1(void) preconfig.isolated = 1; err = _Py_PreInitialize(&preconfig); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -682,7 +682,7 @@ static int test_preinit_isolated1(void) test_init_env_dev_mode_putenvs(); err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } dump_config(); @@ -701,7 +701,7 @@ static int test_preinit_isolated2(void) preconfig.isolated = 0; err = _Py_PreInitialize(&preconfig); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -717,7 +717,7 @@ static int test_preinit_isolated2(void) test_init_env_dev_mode_putenvs(); err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } dump_config(); @@ -734,7 +734,7 @@ static int init_isolated_config(void) _PyPreConfig_InitIsolatedConfig(&preconfig); err = _Py_PreInitialize(&preconfig); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -744,13 +744,13 @@ static int init_isolated_config(void) _PyCoreConfig config; err = _PyCoreConfig_InitIsolatedConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } config.program_name = L"./_testembed"; err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } dump_config(); @@ -767,19 +767,19 @@ static int init_python_config(void) _PyPreConfig_InitPythonConfig(&preconfig); err = _Py_PreInitialize(&preconfig); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } _PyCoreConfig config; err = _PyCoreConfig_InitPythonConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } config.program_name = L"./_testembed"; err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } dump_config(); @@ -798,14 +798,14 @@ static int init_dont_configure_locale(void) preconfig.coerce_c_locale_warn = 1; err = _Py_PreInitialize(&preconfig); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } _PyCoreConfig config = _PyCoreConfig_INIT; config.program_name = L"./_testembed"; err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -824,7 +824,7 @@ static int init_dev_mode(void) config.dev_mode = 1; config.program_name = L"./_testembed"; _PyInitError err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } dump_config(); @@ -840,30 +840,30 @@ static int test_init_read_set(void) _PyCoreConfig_Init(&config); err = _PyCoreConfig_DecodeLocale(&config.program_name, "./init_read_set"); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { goto fail; } err = _PyCoreConfig_Read(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { goto fail; } if (_PyWstrList_Append(&config.module_search_paths, L"init_read_set_path") < 0) { - err = _Py_INIT_NO_MEMORY(); + err = _PyInitError_NoMemory(); goto fail; } /* override executable computed by _PyCoreConfig_Read() */ err = _PyCoreConfig_SetString(&config.executable, L"my_executable"); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { goto fail; } err = _Py_InitializeFromConfig(&config); _PyCoreConfig_Clear(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { goto fail; } dump_config(); @@ -898,7 +898,7 @@ static int test_init_run_main(void) configure_init_main(&config); _PyInitError err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -914,7 +914,7 @@ static int test_init_main(void) config._init_main = 0; _PyInitError err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -928,7 +928,7 @@ static int test_init_main(void) } err = _Py_InitializeMain(); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -951,7 +951,7 @@ static int test_run_main(void) config.program_name = L"./python3"; _PyInitError err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c index dd752b86094d..fe71cc388a07 100644 --- a/Python/bootstrap_hash.c +++ b/Python/bootstrap_hash.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_coreconfig.h" #ifdef MS_WINDOWS # include /* All sample MSDN wincrypt programs include the header below. It is at least diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 2e8f4cf6f102..3c17e3536d83 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -203,6 +203,34 @@ _Py_GetGlobalVariablesAsDict(void) } +/* --- _PyInitError ----------------------------------------------- */ + +_PyInitError _PyInitError_Ok(void) +{ return _Py_INIT_OK(); } + +_PyInitError _PyInitError_Error(const char *err_msg) +{ + return (_PyInitError){._type = _Py_INIT_ERR_TYPE_ERROR, + .err_msg = err_msg}; +} + +_PyInitError _PyInitError_NoMemory(void) +{ return _PyInitError_Error("memory allocation failed"); } + +_PyInitError _PyInitError_Exit(int exitcode) +{ return _Py_INIT_EXIT(exitcode); } + + +int _PyInitError_IsError(_PyInitError err) +{ return _Py_INIT_IS_ERROR(err); } + +int _PyInitError_IsExit(_PyInitError err) +{ return _Py_INIT_IS_EXIT(err); } + +int _PyInitError_Failed(_PyInitError err) +{ return _Py_INIT_FAILED(err); } + + /* --- _PyWstrList ------------------------------------------------ */ #ifndef NDEBUG diff --git a/Python/frozenmain.c b/Python/frozenmain.c index 0175e42596b8..7b232bb8023f 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -17,7 +17,7 @@ int Py_FrozenMain(int argc, char **argv) { _PyInitError err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -84,7 +84,7 @@ Py_FrozenMain(int argc, char **argv) err = _Py_InitializeFromConfig(&config); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any memory: program_name is a constant string. */ - if (_Py_INIT_FAILED(err)) { + if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } From webhook-mailer at python.org Fri May 17 18:32:51 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 17 May 2019 22:32:51 -0000 Subject: [Python-checkins] bpo-27268: Fix incorrect error message on float('') (GH-2745) Message-ID: https://github.com/python/cpython/commit/4fa7504ee3184cff064e23fe6799e717ed0f9357 commit: 4fa7504ee3184cff064e23fe6799e717ed0f9357 branch: master author: Pedro Lacerda committer: Cheryl Sabella date: 2019-05-17T18:32:44-04:00 summary: bpo-27268: Fix incorrect error message on float('') (GH-2745) files: M Python/pystrtod.c diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 02a3fb57805c..4aa99d546caf 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -353,15 +353,15 @@ PyOS_string_to_double(const char *s, else if (!endptr && (fail_pos == s || *fail_pos != '\0')) PyErr_Format(PyExc_ValueError, "could not convert string to float: " - "%.200s", s); + "'%.200s'", s); else if (fail_pos == s) PyErr_Format(PyExc_ValueError, "could not convert string to float: " - "%.200s", s); + "'%.200s'", s); else if (errno == ERANGE && fabs(x) >= 1.0 && overflow_exception) PyErr_Format(overflow_exception, "value too large to convert to float: " - "%.200s", s); + "'%.200s'", s); else result = x; From webhook-mailer at python.org Fri May 17 18:38:20 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 May 2019 22:38:20 -0000 Subject: [Python-checkins] bpo-36763: _Py_InitializeFromArgs() argc becomes Py_ssize_t (GH-13396) Message-ID: https://github.com/python/cpython/commit/b594784272d4907b1c40d3c40d17cb081aa9cf9b commit: b594784272d4907b1c40d3c40d17cb081aa9cf9b branch: master author: Victor Stinner committer: GitHub date: 2019-05-18T00:38:16+02:00 summary: bpo-36763: _Py_InitializeFromArgs() argc becomes Py_ssize_t (GH-13396) * The type of initlization function 'argc' parameters becomes Py_ssize_t, instead of int. * Change _PyPreConfig_Copy() return type to void, instead of int. The function cannot fail anymore. * Fix compilation warnings on Windows. files: M Include/cpython/pylifecycle.h M Include/internal/pycore_coreconfig.h M Python/coreconfig.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index a3ab6c915ef9..8fc809d30d82 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -18,11 +18,11 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitialize( const _PyPreConfig *src_config); PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromArgs( const _PyPreConfig *src_config, - int argc, + Py_ssize_t argc, char **argv); PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromWideArgs( const _PyPreConfig *src_config, - int argc, + Py_ssize_t argc, wchar_t **argv); PyAPI_FUNC(int) _Py_IsCoreInitialized(void); @@ -34,11 +34,11 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig( const _PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _Py_InitializeFromArgs( const _PyCoreConfig *config, - int argc, + Py_ssize_t argc, char **argv); PyAPI_FUNC(_PyInitError) _Py_InitializeFromWideArgs( const _PyCoreConfig *config, - int argc, + Py_ssize_t argc, wchar_t **argv); PyAPI_FUNC(_PyInitError) _Py_InitializeMain(void); diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 80aec21f2c80..ea4418f5061c 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -61,7 +61,7 @@ PyAPI_FUNC(int) _PyWstrList_Extend(_PyWstrList *list, /* --- _PyArgv ---------------------------------------------------- */ typedef struct { - int argc; + Py_ssize_t argc; int use_bytes_argv; char **bytes_argv; wchar_t **wchar_argv; @@ -123,7 +123,7 @@ PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, PyAPI_FUNC(void) _PyPreConfig_Init(_PyPreConfig *config); PyAPI_FUNC(void) _PyPreConfig_InitPythonConfig(_PyPreConfig *config); PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config); -PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config, +PyAPI_FUNC(void) _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2); PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); PyAPI_FUNC(void) _PyPreConfig_GetCoreConfig(_PyPreConfig *config, @@ -158,10 +158,10 @@ PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPyArgv( const _PyArgv *args); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetArgv( _PyCoreConfig *config, - int argc, + Py_ssize_t argc, char **argv); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideArgv(_PyCoreConfig *config, - int argc, + Py_ssize_t argc, wchar_t **argv); diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 3c17e3536d83..fd457262a824 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1746,7 +1746,7 @@ config_usage(int error, const wchar_t* program) /* Parse the command line arguments */ static _PyInitError config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, - int *opt_index) + Py_ssize_t *opt_index) { _PyInitError err; const _PyWstrList *argv = &config->argv; @@ -2044,7 +2044,7 @@ config_init_warnoptions(_PyCoreConfig *config, static _PyInitError -config_update_argv(_PyCoreConfig *config, int opt_index) +config_update_argv(_PyCoreConfig *config, Py_ssize_t opt_index) { const _PyWstrList *cmdline_argv = &config->argv; _PyWstrList config_argv = _PyWstrList_INIT; @@ -2105,10 +2105,7 @@ core_read_precmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) _PyPreConfig preconfig; _PyPreConfig_Init(&preconfig); - if (_PyPreConfig_Copy(&preconfig, &_PyRuntime.preconfig) < 0) { - err = _Py_INIT_NO_MEMORY(); - return err; - } + _PyPreConfig_Copy(&preconfig, &_PyRuntime.preconfig); _PyPreConfig_GetCoreConfig(&preconfig, config); @@ -2145,7 +2142,7 @@ config_read_cmdline(_PyCoreConfig *config) } if (config->parse_argv) { - int opt_index; + Py_ssize_t opt_index; err = config_parse_cmdline(config, &cmdline_warnoptions, &opt_index); if (_Py_INIT_FAILED(err)) { goto done; @@ -2207,7 +2204,7 @@ _PyCoreConfig_SetPyArgv(_PyCoreConfig *config, const _PyArgv *args) /* Set config.argv: decode argv using Py_DecodeLocale(). Pre-initialize Python if needed to ensure that encodings are properly configured. */ _PyInitError -_PyCoreConfig_SetArgv(_PyCoreConfig *config, int argc, char **argv) +_PyCoreConfig_SetArgv(_PyCoreConfig *config, Py_ssize_t argc, char **argv) { _PyArgv args = { .argc = argc, @@ -2219,7 +2216,7 @@ _PyCoreConfig_SetArgv(_PyCoreConfig *config, int argc, char **argv) _PyInitError -_PyCoreConfig_SetWideArgv(_PyCoreConfig *config, int argc, wchar_t **argv) +_PyCoreConfig_SetWideArgv(_PyCoreConfig *config, Py_ssize_t argc, wchar_t **argv) { _PyArgv args = { .argc = argc, diff --git a/Python/preconfig.c b/Python/preconfig.c index 985af39cb00d..b7bcfeb9b2f6 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -297,19 +297,10 @@ _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config) } -int +void _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) { #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR -#define COPY_STR_ATTR(ATTR) \ - do { \ - if (config2->ATTR != NULL) { \ - config->ATTR = _PyMem_RawStrdup(config2->ATTR); \ - if (config->ATTR == NULL) { \ - return -1; \ - } \ - } \ - } while (0) COPY_ATTR(isolated); COPY_ATTR(use_environment); @@ -317,15 +308,13 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) COPY_ATTR(dev_mode); COPY_ATTR(coerce_c_locale); COPY_ATTR(coerce_c_locale_warn); + COPY_ATTR(utf8_mode); + COPY_ATTR(allocator); #ifdef MS_WINDOWS COPY_ATTR(legacy_windows_fs_encoding); #endif - COPY_ATTR(utf8_mode); - COPY_ATTR(allocator); #undef COPY_ATTR -#undef COPY_STR_ATTR - return 0; } @@ -750,9 +739,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) /* Save the config to be able to restore it if encodings change */ _PyPreConfig save_config; _PyPreConfig_Init(&save_config); - if (_PyPreConfig_Copy(&save_config, config) < 0) { - return _Py_INIT_NO_MEMORY(); - } + _PyPreConfig_Copy(&save_config, config); /* Set LC_CTYPE to the user preferred locale */ if (config->configure_locale) { @@ -835,10 +822,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) just keep UTF-8 Mode value. */ int new_utf8_mode = config->utf8_mode; int new_coerce_c_locale = config->coerce_c_locale; - if (_PyPreConfig_Copy(config, &save_config) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } + _PyPreConfig_Copy(config, &save_config); config->utf8_mode = new_utf8_mode; config->coerce_c_locale = new_coerce_c_locale; @@ -900,13 +884,7 @@ _PyPreConfig_Write(const _PyPreConfig *config) } /* Write the new pre-configuration into _PyRuntime */ - PyMemAllocatorEx old_alloc; - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - int res = _PyPreConfig_Copy(&_PyRuntime.preconfig, config); - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - if (res < 0) { - return _Py_INIT_NO_MEMORY(); - } + _PyPreConfig_Copy(&_PyRuntime.preconfig, config); return _Py_INIT_OK(); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 231706d2ab60..d29b293b79eb 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -705,10 +705,7 @@ _Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args) _PyPreConfig_Init(&config); if (src_config) { - if (_PyPreConfig_Copy(&config, src_config) < 0) { - err = _Py_INIT_NO_MEMORY(); - return err; - } + _PyPreConfig_Copy(&config, src_config); } err = _PyPreConfig_Read(&config, args); @@ -727,7 +724,7 @@ _Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args) _PyInitError -_Py_PreInitializeFromArgs(const _PyPreConfig *src_config, int argc, char **argv) +_Py_PreInitializeFromArgs(const _PyPreConfig *src_config, Py_ssize_t argc, char **argv) { _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv}; return _Py_PreInitializeFromPyArgv(src_config, &args); @@ -735,7 +732,7 @@ _Py_PreInitializeFromArgs(const _PyPreConfig *src_config, int argc, char **argv) _PyInitError -_Py_PreInitializeFromWideArgs(const _PyPreConfig *src_config, int argc, wchar_t **argv) +_Py_PreInitializeFromWideArgs(const _PyPreConfig *src_config, Py_ssize_t argc, wchar_t **argv) { _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv}; return _Py_PreInitializeFromPyArgv(src_config, &args); @@ -1024,7 +1021,7 @@ init_python(const _PyCoreConfig *config, const _PyArgv *args) _PyInitError -_Py_InitializeFromArgs(const _PyCoreConfig *config, int argc, char **argv) +_Py_InitializeFromArgs(const _PyCoreConfig *config, Py_ssize_t argc, char **argv) { _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv}; return init_python(config, &args); @@ -1032,7 +1029,7 @@ _Py_InitializeFromArgs(const _PyCoreConfig *config, int argc, char **argv) _PyInitError -_Py_InitializeFromWideArgs(const _PyCoreConfig *config, int argc, wchar_t **argv) +_Py_InitializeFromWideArgs(const _PyCoreConfig *config, Py_ssize_t argc, wchar_t **argv) { _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv}; return init_python(config, &args); From webhook-mailer at python.org Fri May 17 18:45:00 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 17 May 2019 22:45:00 -0000 Subject: [Python-checkins] Correct typos in the Barrier specification (GH-9395) Message-ID: https://github.com/python/cpython/commit/51a860ee01a9e96f8013fe6ca836ec95e7eb3010 commit: 51a860ee01a9e96f8013fe6ca836ec95e7eb3010 branch: master author: G?ry Ogam committer: Cheryl Sabella date: 2019-05-17T18:44:57-04:00 summary: Correct typos in the Barrier specification (GH-9395) files: M Doc/library/threading.rst diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 99dd7fff0d2f..715940c1c52b 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -968,7 +968,7 @@ As an example, here is a simple way to synchronize a client and server thread:: Return the barrier to the default, empty state. Any threads waiting on it will receive the :class:`BrokenBarrierError` exception. - Note that using this function may can require some external + Note that using this function may require some external synchronization if there are other threads whose state is unknown. If a barrier is broken it may be better to just leave it and create a new one. @@ -976,7 +976,7 @@ As an example, here is a simple way to synchronize a client and server thread:: Put the barrier into a broken state. This causes any active or future calls to :meth:`wait` to fail with the :class:`BrokenBarrierError`. Use - this for example if one of the needs to abort, to avoid deadlocking the + this for example if one of the threads needs to abort, to avoid deadlocking the application. It may be preferable to simply create the barrier with a sensible From webhook-mailer at python.org Fri May 17 18:54:06 2019 From: webhook-mailer at python.org (Lisa Roach) Date: Fri, 17 May 2019 22:54:06 -0000 Subject: [Python-checkins] Document a workaround for a curses bug (GH-13209) Message-ID: https://github.com/python/cpython/commit/e7b1136ec3b40d174d71f2195cceaadf4fe9539c commit: e7b1136ec3b40d174d71f2195cceaadf4fe9539c branch: master author: Toshio Kuratomi committer: Lisa Roach date: 2019-05-17T15:54:02-07:00 summary: Document a workaround for a curses bug (GH-13209) files: A Misc/NEWS.d/next/Documentation/2019-05-08-13-17-44.bpo-35924.lqbNpW.rst M Doc/library/curses.rst diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index 2a4d9ce8a35a..7d1e7538a292 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -708,9 +708,16 @@ the following methods and attributes: .. note:: - Writing outside the window, subwindow, or pad raises :exc:`curses.error`. - Attempting to write to the lower right corner of a window, subwindow, - or pad will cause an exception to be raised after the string is printed. + * Writing outside the window, subwindow, or pad raises :exc:`curses.error`. + Attempting to write to the lower right corner of a window, subwindow, + or pad will cause an exception to be raised after the string is printed. + + * A `bug in ncurses `_, the backend + for this Python module, can cause SegFaults when resizing windows. This + is fixed in ncurses-6.1-20190511. If you are stuck with an earlier + ncurses, you can avoid triggering this if you do not call :func:`addstr` + with a *str* that has embedded newlines. Instead, call :func:`addstr` + separately for each line. .. method:: window.attroff(attr) diff --git a/Misc/NEWS.d/next/Documentation/2019-05-08-13-17-44.bpo-35924.lqbNpW.rst b/Misc/NEWS.d/next/Documentation/2019-05-08-13-17-44.bpo-35924.lqbNpW.rst new file mode 100644 index 000000000000..a88778f85cce --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-08-13-17-44.bpo-35924.lqbNpW.rst @@ -0,0 +1,2 @@ +Add a note to the ``curses.addstr()`` documentation to warn that multiline +strings can cause segfaults because of an ncurses bug. From webhook-mailer at python.org Fri May 17 19:46:28 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 17 May 2019 23:46:28 -0000 Subject: [Python-checkins] Fix couple of dead code paths (GH-7418) Message-ID: https://github.com/python/cpython/commit/27ee0f8551a6d576a65e20da90acf9f3cb412c35 commit: 27ee0f8551a6d576a65e20da90acf9f3cb412c35 branch: master author: David Carlier committer: Cheryl Sabella date: 2019-05-17T19:46:22-04:00 summary: Fix couple of dead code paths (GH-7418) files: M Objects/bytesobject.c M Objects/stringlib/fastsearch.h M Python/ast.c M Python/compile.c diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index ebbdb7c3c164..41453b2d14e9 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1617,12 +1617,10 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) case Py_GE: /* a string is equal to itself */ Py_RETURN_TRUE; - break; case Py_NE: case Py_LT: case Py_GT: Py_RETURN_FALSE; - break; default: PyErr_BadArgument(); return NULL; diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h index a8a51d577f3f..46fcf356d0d0 100644 --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -192,7 +192,6 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n, } return count; } - return -1; } mlast = m - 1; diff --git a/Python/ast.c b/Python/ast.c index 03da4e7f7f9a..abc8d89c8a38 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -2971,7 +2971,6 @@ ast_for_expr(struct compiling *c, const node *n) return Compare(expression, ops, cmps, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); } - break; case star_expr: return ast_for_starred(c, n); @@ -3618,7 +3617,6 @@ alias_for_import_name(struct compiling *c, const node *n, int store) return NULL; return a; } - break; case dotted_name: if (NCH(n) == 1) { node *name_node = CHILD(n, 0); @@ -3669,7 +3667,6 @@ alias_for_import_name(struct compiling *c, const node *n, int store) } return alias(str, NULL, c->c_arena); } - break; case STAR: str = PyUnicode_InternFromString("*"); if (!str) diff --git a/Python/compile.c b/Python/compile.c index 2a086a509f45..b20548c77724 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -4868,7 +4868,6 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) return compiler_error(c, "can't use starred expression here"); } - break; case Name_kind: return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx); /* child nodes of List and Tuple will have expr_context set */ From webhook-mailer at python.org Fri May 17 21:21:32 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 18 May 2019 01:21:32 -0000 Subject: [Python-checkins] bpo-36763: Use _PyCoreConfig_InitPythonConfig() (GH-13398) Message-ID: https://github.com/python/cpython/commit/bab0db6076900cd828588be8595b3cdfade7e7e9 commit: bab0db6076900cd828588be8595b3cdfade7e7e9 branch: master author: Victor Stinner committer: GitHub date: 2019-05-18T03:21:27+02:00 summary: bpo-36763: Use _PyCoreConfig_InitPythonConfig() (GH-13398) _PyPreConfig_InitPythonConfig() and _PyCoreConfig_InitPythonConfig() no longer inherit their values from global configuration variables. Changes: * _PyPreCmdline_Read() now ignores -X dev and PYTHONDEVMODE if dev_mode is already set. * Inline _PyPreConfig_INIT macro into _PyPreConfig_Init() function. * Inline _PyCoreConfig_INIT macro into _PyCoreConfig_Init() function. * Replace _PyCoreConfig_Init() with _PyCoreConfig_InitPythonConfig() in most tests of _testembed.c. * Replace _PyCoreConfig_Init() with _PyCoreConfig_InitIsolatedConfig() in _freeze_importlib.c. * Move some initialization functions from the internal to the private API. files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Lib/test/test_embed.py M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/coreconfig.c M Python/frozenmain.c M Python/preconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index f05eddad912f..ca71c15b67d6 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -115,27 +115,8 @@ typedef struct { PyMemAllocatorName allocator; } _PyPreConfig; -#ifdef MS_WINDOWS -# define _PyPreConfig_WINDOWS_INIT \ - .legacy_windows_fs_encoding = -1, -#else -# define _PyPreConfig_WINDOWS_INIT -#endif - -#define _PyPreConfig_INIT \ - (_PyPreConfig){ \ - _PyPreConfig_WINDOWS_INIT \ - ._config_version = _Py_CONFIG_VERSION, \ - .isolated = -1, \ - .use_environment = -1, \ - .configure_locale = 1, \ - .utf8_mode = -2, \ - .dev_mode = -1, \ - .allocator = PYMEM_ALLOCATOR_NOT_SET} - -PyAPI_FUNC(void) _PyPreConfig_Init(_PyPreConfig *config); PyAPI_FUNC(void) _PyPreConfig_InitPythonConfig(_PyPreConfig *config); -PyAPI_FUNC(void) _PyPreConfig_InitIsolateConfig(_PyPreConfig *config); +PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ @@ -419,47 +400,23 @@ typedef struct { } _PyCoreConfig; -#ifdef MS_WINDOWS -# define _PyCoreConfig_WINDOWS_INIT \ - .legacy_windows_stdio = -1, -#else -# define _PyCoreConfig_WINDOWS_INIT -#endif - -#define _PyCoreConfig_INIT \ - (_PyCoreConfig){ \ - _PyCoreConfig_WINDOWS_INIT \ - ._config_version = _Py_CONFIG_VERSION, \ - .isolated = -1, \ - .use_environment = -1, \ - .dev_mode = -1, \ - .install_signal_handlers = 1, \ - .use_hash_seed = -1, \ - .faulthandler = -1, \ - .tracemalloc = -1, \ - .use_module_search_paths = 0, \ - .parse_argv = 0, \ - .site_import = -1, \ - .bytes_warning = -1, \ - .inspect = -1, \ - .interactive = -1, \ - .optimization_level = -1, \ - .parser_debug= -1, \ - .write_bytecode = -1, \ - .verbose = -1, \ - .quiet = -1, \ - .user_site_directory = -1, \ - .configure_c_stdio = 0, \ - .buffered_stdio = -1, \ - ._install_importlib = 1, \ - .check_hash_pycs_mode = NULL, \ - .pathconfig_warnings = -1, \ - ._init_main = 1} -/* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ - -PyAPI_FUNC(void) _PyCoreConfig_Init(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitIsolateConfig(_PyCoreConfig *config); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config); +PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetString( + wchar_t **config_str, + const wchar_t *str); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_DecodeLocale( + wchar_t **config_str, + const char *str); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetArgv( + _PyCoreConfig *config, + Py_ssize_t argc, + char **argv); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideArgv(_PyCoreConfig *config, + Py_ssize_t argc, + wchar_t **argv); #ifdef __cplusplus } diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index ea4418f5061c..edde7b1d8d88 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -121,8 +121,6 @@ PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, /* --- _PyPreConfig ----------------------------------------------- */ PyAPI_FUNC(void) _PyPreConfig_Init(_PyPreConfig *config); -PyAPI_FUNC(void) _PyPreConfig_InitPythonConfig(_PyPreConfig *config); -PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config); PyAPI_FUNC(void) _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2); PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); @@ -135,34 +133,18 @@ PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(const _PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ -PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config); +PyAPI_FUNC(void) _PyCoreConfig_Init(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_Copy( _PyCoreConfig *config, const _PyCoreConfig *config2); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetString( - wchar_t **config_str, - const wchar_t *str); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_DecodeLocale( - wchar_t **config_str, - const char *str); PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPathConfig(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPathConfig( const _PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config, _PyRuntimeState *runtime); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPyArgv( _PyCoreConfig *config, const _PyArgv *args); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetArgv( - _PyCoreConfig *config, - Py_ssize_t argc, - char **argv); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideArgv(_PyCoreConfig *config, - Py_ssize_t argc, - wchar_t **argv); /* --- Function used for testing ---------------------------------- */ diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index c389df85fb6c..6b77a2d1fd8d 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -285,6 +285,16 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'coerce_c_locale_warn': 0, 'utf8_mode': 0, } + ISOLATED_PRE_CONFIG = dict(DEFAULT_PRE_CONFIG, + configure_locale=0, + isolated=1, + use_environment=0, + utf8_mode=0, + dev_mode=0, + ) + if MS_WINDOWS: + ISOLATED_PRE_CONFIG['legacy_windows_fs_encoding'] = 0 + COPY_PRE_CONFIG = [ 'dev_mode', 'isolated', @@ -363,6 +373,24 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'legacy_windows_stdio': 0, }) + PYTHON_CORE_CONFIG = dict(DEFAULT_CORE_CONFIG, + configure_c_stdio=1, + parse_argv=1, + ) + ISOLATED_CORE_CONFIG = dict(DEFAULT_CORE_CONFIG, + isolated=1, + use_environment=0, + user_site_directory=0, + dev_mode=0, + install_signal_handlers=0, + use_hash_seed=0, + faulthandler=0, + tracemalloc=0, + pathconfig_warnings=0, + ) + if MS_WINDOWS: + ISOLATED_CORE_CONFIG['legacy_windows_stdio'] = 0 + # global config DEFAULT_GLOBAL_CONFIG = { 'Py_HasFileSystemDefaultEncoding': 0, @@ -410,8 +438,15 @@ def main_xoptions(self, xoptions_list): xoptions[opt] = True return xoptions - def get_expected_config(self, expected_preconfig, expected, env, add_path=None): - expected = dict(self.DEFAULT_CORE_CONFIG, **expected) + def get_expected_config(self, expected_preconfig, expected, env, api, + add_path=None): + if api == "python": + default_config = self.PYTHON_CORE_CONFIG + elif api == "isolated": + default_config = self.ISOLATED_CORE_CONFIG + else: + default_config = self.DEFAULT_CORE_CONFIG + expected = dict(default_config, **expected) code = textwrap.dedent(''' import json @@ -521,8 +556,8 @@ def check_global_config(self, config): self.assertEqual(config['global_config'], expected) - def check_config(self, testname, expected_config, expected_preconfig, - add_path=None, stderr=None): + def check_config(self, testname, expected_config=None, expected_preconfig=None, + add_path=None, stderr=None, api="default"): env = dict(os.environ) # Remove PYTHON* environment variables to get deterministic environment for key in list(env): @@ -533,8 +568,18 @@ def check_config(self, testname, expected_config, expected_preconfig, env['PYTHONCOERCECLOCALE'] = '0' env['PYTHONUTF8'] = '0' - expected_preconfig = dict(self.DEFAULT_PRE_CONFIG, **expected_preconfig) - expected_config = self.get_expected_config(expected_preconfig, expected_config, env, add_path) + if api == "isolated": + default_preconfig = self.ISOLATED_PRE_CONFIG + else: + default_preconfig = self.DEFAULT_PRE_CONFIG + if expected_preconfig is None: + expected_preconfig = {} + expected_preconfig = dict(default_preconfig, **expected_preconfig) + if expected_config is None: + expected_config = {} + expected_config = self.get_expected_config(expected_preconfig, + expected_config, env, + api, add_path) for key in self.COPY_PRE_CONFIG: if key not in expected_preconfig: expected_preconfig[key] = expected_config[key] @@ -677,76 +722,56 @@ def test_init_dev_mode(self): 'dev_mode': 1, 'warnoptions': ['default'], } - self.check_config("init_dev_mode", config, preconfig) + self.check_config("init_dev_mode", config, preconfig, api="python") def test_init_isolated_flag(self): - preconfig = {} config = { 'isolated': 1, 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("init_isolated_flag", config, preconfig) + self.check_config("init_isolated_flag", config, api="python") def test_preinit_isolated1(self): # _PyPreConfig.isolated=1, _PyCoreConfig.isolated not set - preconfig = {} config = { 'isolated': 1, 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("preinit_isolated1", config, preconfig) + self.check_config("preinit_isolated1", config) def test_preinit_isolated2(self): # _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 - preconfig = {} config = { 'isolated': 1, 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("preinit_isolated2", config, preconfig) + self.check_config("preinit_isolated2", config) def test_init_isolated_config(self): - preconfig = { - 'configure_locale': 0, - } - config = { - 'isolated': 1, - 'use_environment': 0, - 'user_site_directory': 0, - 'install_signal_handlers': 0, - 'pathconfig_warnings': 0, - } - self.check_config("init_isolated_config", config, preconfig) + self.check_config("init_isolated_config", api="isolated") def test_init_python_config(self): - preconfig = {} - config = { - 'configure_c_stdio': 1, - 'parse_argv': 1, - } - self.check_config("init_python_config", config, preconfig) + self.check_config("init_python_config", api="python") def test_init_dont_configure_locale(self): # _PyPreConfig.configure_locale=0 preconfig = { 'configure_locale': 0, } - self.check_config("init_dont_configure_locale", {}, preconfig) + self.check_config("init_dont_configure_locale", {}, preconfig, api="python") def test_init_read_set(self): - preconfig = {} core_config = { 'program_name': './init_read_set', 'executable': 'my_executable', } - self.check_config("init_read_set", core_config, preconfig, + self.check_config("init_read_set", core_config, api="python", add_path="init_read_set_path") def test_init_run_main(self): - preconfig = {} code = ('import _testinternalcapi, json; ' 'print(json.dumps(_testinternalcapi.get_configs()))') core_config = { @@ -755,10 +780,9 @@ def test_init_run_main(self): 'run_command': code + '\n', 'parse_argv': 1, } - self.check_config("init_run_main", core_config, preconfig) + self.check_config("init_run_main", core_config, api="python") def test_init_main(self): - preconfig = {} code = ('import _testinternalcapi, json; ' 'print(json.dumps(_testinternalcapi.get_configs()))') core_config = { @@ -768,25 +792,26 @@ def test_init_main(self): 'parse_argv': 1, '_init_main': 0, } - self.check_config("init_main", core_config, preconfig, + self.check_config("init_main", core_config, api="python", stderr="Run Python code before _Py_InitializeMain") def test_init_parse_argv(self): core_config = { + 'parse_argv': 1, 'argv': ['-c', 'arg1', '-v', 'arg3'], 'program_name': './argv0', - 'parse_argv': 1, 'run_command': 'pass\n', 'use_environment': 0, } - self.check_config("init_parse_argv", core_config, {}) + self.check_config("init_parse_argv", core_config, api="python") def test_init_dont_parse_argv(self): core_config = { + 'parse_argv': 0, 'argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], 'program_name': './argv0', } - self.check_config("init_dont_parse_argv", core_config, {}) + self.check_config("init_dont_parse_argv", core_config, api="python") if __name__ == "__main__": diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index d89d66abee73..1a719e2f9673 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -77,14 +77,12 @@ main(int argc, char *argv[]) text[text_size] = '\0'; _PyCoreConfig config; - _PyCoreConfig_Init(&config); - config.use_environment = 0; - config.user_site_directory = 0; + _PyCoreConfig_InitIsolatedConfig(&config); + config.site_import = 0; config.program_name = L"./_freeze_importlib"; /* Don't install importlib, since it could execute outdated bytecode. */ config._install_importlib = 0; - config.pathconfig_warnings = 0; config._init_main = 0; _PyInitError err = _Py_InitializeFromConfig(&config); diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 2352179cc6fc..f1bb731dcba2 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -5,6 +5,7 @@ #include #include "pycore_coreconfig.h" /* FIXME: PEP 587 makes these functions public */ +#include #include "pythread.h" #include #include @@ -404,7 +405,7 @@ static int test_init_from_config(void) config.use_hash_seed = 1; config.hash_seed = 123; - /* dev_mode=1 is tested in init_dev_mode() */ + /* dev_mode=1 is tested in test_init_dev_mode() */ putenv("PYTHONFAULTHANDLER="); config.faulthandler = 1; @@ -521,12 +522,12 @@ static int test_init_from_config(void) } -static int test_init_parse_argv(int parse_argv) +static int check_init_parse_argv(int parse_argv) { _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitPythonConfig(&config); static wchar_t* argv[] = { L"./argv0", @@ -552,15 +553,15 @@ static int test_init_parse_argv(int parse_argv) } -static int init_parse_argv(void) +static int test_init_parse_argv(void) { - return test_init_parse_argv(1); + return check_init_parse_argv(1); } -static int init_dont_parse_argv(void) +static int test_init_dont_parse_argv(void) { - return test_init_parse_argv(0); + return check_init_parse_argv(0); } @@ -603,7 +604,7 @@ static int test_init_env(void) } -static void test_init_env_dev_mode_putenvs(void) +static void set_all_env_vars(void) { test_init_env_putenvs(); putenv("PYTHONMALLOC="); @@ -616,7 +617,7 @@ static int test_init_env_dev_mode(void) { /* Test initialization from environment variables */ Py_IgnoreEnvironmentFlag = 0; - test_init_env_dev_mode_putenvs(); + set_all_env_vars(); _testembed_Py_Initialize(); dump_config(); Py_Finalize(); @@ -628,7 +629,7 @@ static int test_init_env_dev_mode_alloc(void) { /* Test initialization from environment variables */ Py_IgnoreEnvironmentFlag = 0; - test_init_env_dev_mode_putenvs(); + set_all_env_vars(); putenv("PYTHONMALLOC=malloc"); _testembed_Py_Initialize(); dump_config(); @@ -637,13 +638,13 @@ static int test_init_env_dev_mode_alloc(void) } -static int init_isolated_flag(void) +static int test_init_isolated_flag(void) { _PyInitError err; /* Test _PyCoreConfig.isolated=1 */ _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitPythonConfig(&config); Py_IsolatedFlag = 0; config.isolated = 1; @@ -651,7 +652,7 @@ static int init_isolated_flag(void) /* Use path starting with "./" avoids a search along the PATH */ config.program_name = L"./_testembed"; - test_init_env_dev_mode_putenvs(); + set_all_env_vars(); err = _Py_InitializeFromConfig(&config); if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); @@ -680,7 +681,7 @@ static int test_preinit_isolated1(void) _PyCoreConfig_Init(&config); config.program_name = L"./_testembed"; - test_init_env_dev_mode_putenvs(); + set_all_env_vars(); err = _Py_InitializeFromConfig(&config); if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); @@ -715,7 +716,7 @@ static int test_preinit_isolated2(void) /* Use path starting with "./" avoids a search along the PATH */ config.program_name = L"./_testembed"; - test_init_env_dev_mode_putenvs(); + set_all_env_vars(); err = _Py_InitializeFromConfig(&config); if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); @@ -726,10 +727,38 @@ static int test_preinit_isolated2(void) } -static int init_isolated_config(void) +static void set_all_global_config_variables(void) +{ + Py_IsolatedFlag = 0; + Py_IgnoreEnvironmentFlag = 0; + Py_BytesWarningFlag = 2; + Py_InspectFlag = 1; + Py_InteractiveFlag = 1; + Py_OptimizeFlag = 1; + Py_DebugFlag = 1; + Py_VerboseFlag = 1; + Py_QuietFlag = 1; + Py_FrozenFlag = 0; + Py_UnbufferedStdioFlag = 1; + Py_NoSiteFlag = 1; + Py_DontWriteBytecodeFlag = 1; + Py_NoUserSiteDirectory = 1; +#ifdef MS_WINDOWS + Py_LegacyWindowsStdioFlag = 1; +#endif +} + + +static int test_init_isolated_config(void) { _PyInitError err; + /* environment variables must be ignored */ + set_all_env_vars(); + + /* global configuration variables must be ignored */ + set_all_global_config_variables(); + _PyPreConfig preconfig; _PyPreConfig_InitIsolatedConfig(&preconfig); @@ -759,10 +788,23 @@ static int init_isolated_config(void) } -static int init_python_config(void) +static int test_init_python_config(void) { _PyInitError err; + /* global configuration variables must be ignored */ + set_all_global_config_variables(); + Py_IsolatedFlag = 1; + Py_IgnoreEnvironmentFlag = 1; + Py_FrozenFlag = 1; + Py_UnbufferedStdioFlag = 1; + Py_NoSiteFlag = 1; + Py_DontWriteBytecodeFlag = 1; + Py_NoUserSiteDirectory = 1; +#ifdef MS_WINDOWS + Py_LegacyWindowsStdioFlag = 1; +#endif + _PyPreConfig preconfig; _PyPreConfig_InitPythonConfig(&preconfig); @@ -788,11 +830,12 @@ static int init_python_config(void) } -static int init_dont_configure_locale(void) +static int test_init_dont_configure_locale(void) { _PyInitError err; - _PyPreConfig preconfig = _PyPreConfig_INIT; + _PyPreConfig preconfig; + _PyPreConfig_InitPythonConfig(&preconfig); preconfig.configure_locale = 0; preconfig.coerce_c_locale = 1; preconfig.coerce_c_locale_warn = 1; @@ -802,7 +845,8 @@ static int init_dont_configure_locale(void) _Py_ExitInitError(err); } - _PyCoreConfig config = _PyCoreConfig_INIT; + _PyCoreConfig config; + _PyCoreConfig_InitPythonConfig(&config); config.program_name = L"./_testembed"; err = _Py_InitializeFromConfig(&config); if (_PyInitError_Failed(err)) { @@ -815,10 +859,10 @@ static int init_dont_configure_locale(void) } -static int init_dev_mode(void) +static int test_init_dev_mode(void) { _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitPythonConfig(&config); putenv("PYTHONFAULTHANDLER="); putenv("PYTHONMALLOC="); config.dev_mode = 1; @@ -837,7 +881,7 @@ static int test_init_read_set(void) { _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitPythonConfig(&config); err = _PyCoreConfig_DecodeLocale(&config.program_name, "./init_read_set"); if (_PyInitError_Failed(err)) { @@ -894,7 +938,7 @@ static void configure_init_main(_PyCoreConfig *config) static int test_init_run_main(void) { _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitPythonConfig(&config); configure_init_main(&config); _PyInitError err = _Py_InitializeFromConfig(&config); @@ -909,7 +953,7 @@ static int test_init_run_main(void) static int test_init_main(void) { _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitPythonConfig(&config); configure_init_main(&config); config._init_main = 0; @@ -939,7 +983,7 @@ static int test_init_main(void) static int test_run_main(void) { _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitPythonConfig(&config); wchar_t *argv[] = {L"python3", L"-c", (L"import sys; " @@ -947,7 +991,6 @@ static int test_run_main(void) L"arg2"}; config.argv.length = Py_ARRAY_LENGTH(argv); config.argv.items = argv; - config.parse_argv = 1; config.program_name = L"./python3"; _PyInitError err = _Py_InitializeFromConfig(&config); @@ -988,16 +1031,16 @@ static struct TestCase TestCases[] = { { "init_default_config", test_init_default_config }, { "init_global_config", test_init_global_config }, { "init_from_config", test_init_from_config }, - { "init_parse_argv", init_parse_argv }, - { "init_dont_parse_argv", init_dont_parse_argv }, + { "init_parse_argv", test_init_parse_argv }, + { "init_dont_parse_argv", test_init_dont_parse_argv }, { "init_env", test_init_env }, { "init_env_dev_mode", test_init_env_dev_mode }, { "init_env_dev_mode_alloc", test_init_env_dev_mode_alloc }, - { "init_dont_configure_locale", init_dont_configure_locale }, - { "init_dev_mode", init_dev_mode }, - { "init_isolated_flag", init_isolated_flag }, - { "init_isolated_config", init_isolated_config }, - { "init_python_config", init_python_config }, + { "init_dont_configure_locale", test_init_dont_configure_locale }, + { "init_dev_mode", test_init_dev_mode }, + { "init_isolated_flag", test_init_isolated_flag }, + { "init_isolated_config", test_init_isolated_config }, + { "init_python_config", test_init_python_config }, { "preinit_isolated1", test_preinit_isolated1 }, { "preinit_isolated2", test_preinit_isolated2 }, { "init_read_set", test_init_read_set }, diff --git a/Python/coreconfig.c b/Python/coreconfig.c index fd457262a824..3678d1240671 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -551,14 +551,69 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) void _PyCoreConfig_Init(_PyCoreConfig *config) { - *config = _PyCoreConfig_INIT; + memset(config, 0, sizeof(*config)); + + config->_config_version = _Py_CONFIG_VERSION; + config->isolated = -1; + config->use_environment = -1; + config->dev_mode = -1; + config->install_signal_handlers = 1; + config->use_hash_seed = -1; + config->faulthandler = -1; + config->tracemalloc = -1; + config->use_module_search_paths = 0; + config->parse_argv = 0; + config->site_import = -1; + config->bytes_warning = -1; + config->inspect = -1; + config->interactive = -1; + config->optimization_level = -1; + config->parser_debug= -1; + config->write_bytecode = -1; + config->verbose = -1; + config->quiet = -1; + config->user_site_directory = -1; + config->configure_c_stdio = 0; + config->buffered_stdio = -1; + config->_install_importlib = 1; + config->check_hash_pycs_mode = NULL; + config->pathconfig_warnings = -1; + config->_init_main = 1; +#ifdef MS_WINDOWS + config->legacy_windows_stdio = -1; +#endif +} + + +static void +_PyCoreConfig_InitDefaults(_PyCoreConfig *config) +{ + _PyCoreConfig_Init(config); + + config->isolated = 0; + config->use_environment = 1; + config->site_import = 1; + config->bytes_warning = 0; + config->inspect = 0; + config->interactive = 0; + config->optimization_level = 0; + config->parser_debug= 0; + config->write_bytecode = 1; + config->verbose = 0; + config->quiet = 0; + config->user_site_directory = 1; + config->buffered_stdio = 1; + config->pathconfig_warnings = 1; +#ifdef MS_WINDOWS + config->legacy_windows_stdio = 0; +#endif } _PyInitError _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config) { - _PyCoreConfig_Init(config); + _PyCoreConfig_InitDefaults(config); config->configure_c_stdio = 1; config->parse_argv = 1; @@ -570,30 +625,16 @@ _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config) _PyInitError _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config) { - _PyCoreConfig_Init(config); + _PyCoreConfig_InitDefaults(config); - /* set to 1 */ config->isolated = 1; - config->site_import = 1; - config->write_bytecode = 1; - config->buffered_stdio = 1; - - /* set to 0 */ config->use_environment = 0; + config->user_site_directory = 0; config->dev_mode = 0; config->install_signal_handlers = 0; config->use_hash_seed = 0; config->faulthandler = 0; config->tracemalloc = 0; - config->bytes_warning = 0; - config->inspect = 0; - config->interactive = 0; - config->optimization_level = 0; - config->parser_debug = 0; - config->verbose = 0; - config->quiet = 0; - config->user_site_directory = 0; - config->configure_c_stdio = 0; config->pathconfig_warnings = 0; #ifdef MS_WINDOWS config->legacy_windows_stdio = 0; diff --git a/Python/frozenmain.c b/Python/frozenmain.c index 7b232bb8023f..a51fb5800127 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -40,7 +40,7 @@ Py_FrozenMain(int argc, char **argv) } _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitPythonConfig(&config); config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */ if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') diff --git a/Python/preconfig.c b/Python/preconfig.c index b7bcfeb9b2f6..0f4bd8ece534 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -241,8 +241,9 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline, } /* dev_mode */ - if ((cmdline && _Py_get_xoption(&cmdline->xoptions, L"dev")) - || _Py_GetEnv(cmdline->use_environment, "PYTHONDEVMODE")) + if ((cmdline->dev_mode < 0) + && (_Py_get_xoption(&cmdline->xoptions, L"dev") + || _Py_GetEnv(cmdline->use_environment, "PYTHONDEVMODE"))) { cmdline->dev_mode = 1; } @@ -260,10 +261,22 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline, /* --- _PyPreConfig ----------------------------------------------- */ + void _PyPreConfig_Init(_PyPreConfig *config) { - *config = _PyPreConfig_INIT; + memset(config, 0, sizeof(*config)); + + config->_config_version = _Py_CONFIG_VERSION; + config->isolated = -1; + config->use_environment = -1; + config->configure_locale = 1; + config->utf8_mode = -2; + config->dev_mode = -1; + config->allocator = PYMEM_ALLOCATOR_NOT_SET; +#ifdef MS_WINDOWS + config->legacy_windows_fs_encoding = -1; +#endif } @@ -289,11 +302,11 @@ _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config) config->configure_locale = 0; config->isolated = 1; config->use_environment = 0; + config->utf8_mode = 0; + config->dev_mode = 0; #ifdef MS_WINDOWS config->legacy_windows_fs_encoding = 0; #endif - config->utf8_mode = 0; - config->dev_mode = 0; } From webhook-mailer at python.org Fri May 17 22:17:06 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 18 May 2019 02:17:06 -0000 Subject: [Python-checkins] bpo-36763: Remove _PyCoreConfig.dll_path (GH-13402) Message-ID: https://github.com/python/cpython/commit/410759fba80aded5247b693c60745aa16906f3bb commit: 410759fba80aded5247b693c60745aa16906f3bb branch: master author: Victor Stinner committer: GitHub date: 2019-05-18T04:17:01+02:00 summary: bpo-36763: Remove _PyCoreConfig.dll_path (GH-13402) files: M Include/cpython/coreconfig.h M Include/internal/pycore_pathconfig.h M Lib/test/test_embed.py M PC/getpathp.c M Python/coreconfig.c M Python/pathconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index ca71c15b67d6..a71f16171b73 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -353,9 +353,6 @@ typedef struct { wchar_t *base_prefix; /* sys.base_prefix */ wchar_t *exec_prefix; /* sys.exec_prefix */ wchar_t *base_exec_prefix; /* sys.base_exec_prefix */ -#ifdef MS_WINDOWS - wchar_t *dll_path; /* Windows DLL path */ -#endif /* --- Parameter only used by Py_Main() ---------- */ diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index 9eb8e88df767..bee391187cc9 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -53,6 +53,10 @@ PyAPI_FUNC(int) _Py_FindEnvConfigValue( wchar_t *value, size_t value_size); +#ifdef MS_WINDOWS +extern wchar_t* _Py_GetDLLPath(void); +#endif + #ifdef __cplusplus } #endif diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 6b77a2d1fd8d..5a5419dcfcf5 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -369,7 +369,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'legacy_windows_fs_encoding': 0, }) DEFAULT_CORE_CONFIG.update({ - 'dll_path': GET_DEFAULT_CONFIG, 'legacy_windows_stdio': 0, }) @@ -466,8 +465,6 @@ def get_expected_config(self, expected_preconfig, expected, env, api, 'filesystem_errors': sys.getfilesystemencodeerrors(), 'module_search_paths': core_config['module_search_paths'], } - if sys.platform == 'win32': - data['dll_path'] = core_config['dll_path'] data = json.dumps(data) data = data.encode('utf-8') diff --git a/PC/getpathp.c b/PC/getpathp.c index 64aa1e0d141f..62c42ecefe9e 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -508,8 +508,8 @@ getpythonregpath(HKEY keyBase, int skipcore) #endif /* Py_ENABLE_SHARED */ -static _PyInitError -get_dll_path(PyCalculatePath *calculate, _PyPathConfig *config) +wchar_t* +_Py_GetDLLPath(void) { wchar_t dll_path[MAXPATHLEN+1]; memset(dll_path, 0, sizeof(dll_path)); @@ -525,11 +525,7 @@ get_dll_path(PyCalculatePath *calculate, _PyPathConfig *config) dll_path[0] = 0; #endif - config->dll_path = _PyMem_RawWcsdup(dll_path); - if (config->dll_path == NULL) { - return _Py_INIT_NO_MEMORY(); - } - return _Py_INIT_OK(); + return _PyMem_RawWcsdup(dll_path); } @@ -956,9 +952,11 @@ calculate_path_impl(const _PyCoreConfig *core_config, { _PyInitError err; - err = get_dll_path(calculate, config); - if (_Py_INIT_FAILED(err)) { - return err; + assert(config->dll_path == NULL); + + config->dll_path = _Py_GetDLLPath(); + if (config->dll_path == NULL) { + return _Py_INIT_NO_MEMORY(); } err = get_program_full_path(core_config, calculate, config); diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 3678d1240671..470bda870288 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -531,9 +531,6 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) CLEAR(config->prefix); CLEAR(config->base_prefix); CLEAR(config->exec_prefix); -#ifdef MS_WINDOWS - CLEAR(config->dll_path); -#endif CLEAR(config->base_exec_prefix); CLEAR(config->filesystem_encoding); @@ -761,9 +758,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_WSTR_ATTR(prefix); COPY_WSTR_ATTR(base_prefix); COPY_WSTR_ATTR(exec_prefix); -#ifdef MS_WINDOWS - COPY_WSTR_ATTR(dll_path); -#endif COPY_WSTR_ATTR(base_exec_prefix); COPY_ATTR(site_import); @@ -864,9 +858,6 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_WSTR(base_prefix); SET_ITEM_WSTR(exec_prefix); SET_ITEM_WSTR(base_exec_prefix); -#ifdef MS_WINDOWS - SET_ITEM_WSTR(dll_path); -#endif SET_ITEM_INT(site_import); SET_ITEM_INT(bytes_warning); SET_ITEM_INT(inspect); @@ -2355,9 +2346,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config) assert(config->base_prefix != NULL); assert(config->exec_prefix != NULL); assert(config->base_exec_prefix != NULL); -#ifdef MS_WINDOWS - assert(config->dll_path != NULL); -#endif } assert(config->filesystem_encoding != NULL); assert(config->filesystem_errors != NULL); diff --git a/Python/pathconfig.c b/Python/pathconfig.c index c8c69ebad6a0..3d9d3b1b205f 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -214,7 +214,8 @@ _PyCoreConfig_SetPathConfig(const _PyCoreConfig *core_config) goto no_memory; } #ifdef MS_WINDOWS - if (copy_wstr(&path_config.dll_path, core_config->dll_path) < 0) { + path_config.dll_path = _Py_GetDLLPath(); + if (path_config.dll_path == NULL) { goto no_memory; } #endif @@ -322,14 +323,6 @@ _PyCoreConfig_CalculatePathConfig(_PyCoreConfig *config) } } -#ifdef MS_WINDOWS - if (config->dll_path == NULL) { - if (copy_wstr(&config->dll_path, path_config.dll_path) < 0) { - goto no_memory; - } - } -#endif - if (path_config.isolated != -1) { config->isolated = path_config.isolated; } @@ -356,9 +349,6 @@ _PyCoreConfig_InitPathConfig(_PyCoreConfig *config) if (!config->use_module_search_paths || (config->executable == NULL) || (config->prefix == NULL) -#ifdef MS_WINDOWS - || (config->dll_path == NULL) -#endif || (config->exec_prefix == NULL)) { _PyInitError err = _PyCoreConfig_CalculatePathConfig(config); @@ -435,7 +425,7 @@ Py_SetPath(const wchar_t *path) new_config.exec_prefix = _PyMem_RawWcsdup(L""); alloc_error |= (new_config.exec_prefix == NULL); #ifdef MS_WINDOWS - new_config.dll_path = _PyMem_RawWcsdup(L""); + new_config.dll_path = _Py_GetDLLPath(); alloc_error |= (new_config.dll_path == NULL); #endif new_config.module_search_path = _PyMem_RawWcsdup(path); From webhook-mailer at python.org Sat May 18 05:48:53 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 18 May 2019 09:48:53 -0000 Subject: [Python-checkins] Fixed typo (GH-11522) Message-ID: https://github.com/python/cpython/commit/561c63cd70727e92179018188a9a9c33587fbd3f commit: 561c63cd70727e92179018188a9a9c33587fbd3f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-18T02:48:47-07:00 summary: Fixed typo (GH-11522) Given example does not run, loop variable is missing. Secondly, this is bad example how to handle shutdown signal, because it would cause `RuntimeError: Event loop stopped before Future completed.` Perhaps it would be better to cancel all tasks instead of closing loop directly? Did not create issue, because question is quite simple. (cherry picked from commit ceb842e155f5fa0109fa88d52da3d1f5e73490ad) Co-authored-by: Alexander Vasin files: M Doc/library/asyncio-eventloop.rst diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index b9a8b8941a46..7e1d571ef59d 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -1605,7 +1605,7 @@ using the :meth:`loop.add_signal_handler` method:: import os import signal - def ask_exit(signame): + def ask_exit(signame, loop): print("got signal %s: exit" % signame) loop.stop() @@ -1615,7 +1615,7 @@ using the :meth:`loop.add_signal_handler` method:: for signame in {'SIGINT', 'SIGTERM'}: loop.add_signal_handler( getattr(signal, signame), - functools.partial(ask_exit, signame)) + functools.partial(ask_exit, signame, loop)) await asyncio.sleep(3600) From webhook-mailer at python.org Sat May 18 07:29:56 2019 From: webhook-mailer at python.org (Mark Dickinson) Date: Sat, 18 May 2019 11:29:56 -0000 Subject: [Python-checkins] bpo-36887: add math.isqrt (GH-13244) Message-ID: https://github.com/python/cpython/commit/73934b9da07daefb203e7d26089e7486a1ce4fdf commit: 73934b9da07daefb203e7d26089e7486a1ce4fdf branch: master author: Mark Dickinson committer: GitHub date: 2019-05-18T12:29:50+01:00 summary: bpo-36887: add math.isqrt (GH-13244) * Add math.isqrt function computing the integer square root. * Code cleanup: remove redundant comments, rename some variables. * Tighten up code a bit more; use Py_XDECREF to simplify error handling. * Update Modules/mathmodule.c Co-Authored-By: Serhiy Storchaka * Update Modules/mathmodule.c Use real argument clinic type instead of an alias Co-Authored-By: Serhiy Storchaka * Add proof sketch * Updates from review. * Correct and expand documentation. * Fix bad reference handling on error; make some variables block-local; other tidying. * Style and consistency fixes. * Add missing error check; don't try to DECREF a NULL a * Simplify some error returns. * Another two test cases: - clarify that floats are rejected even if they happen to be squares of small integers - TypeError beats ValueError for a negative float * Documentation and markup improvements; thanks Serhiy for the suggestions! * Cleaner Misc/NEWS entry wording. * Clean up (with one fix) to the algorithm explanation and proof. files: A Misc/NEWS.d/next/Library/2019-05-11-14-50-59.bpo-36887.XD3f22.rst M Doc/library/math.rst M Doc/whatsnew/3.8.rst M Lib/test/test_math.py M Modules/clinic/mathmodule.c.h M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 49f932d03845..bf660ae9defa 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -166,6 +166,20 @@ Number-theoretic and representation functions Return ``True`` if *x* is a NaN (not a number), and ``False`` otherwise. +.. function:: isqrt(n) + + Return the integer square root of the nonnegative integer *n*. This is the + floor of the exact square root of *n*, or equivalently the greatest integer + *a* such that *a*\ ? |nbsp| ? |nbsp| *n*. + + For some applications, it may be more convenient to have the least integer + *a* such that *n* |nbsp| ? |nbsp| *a*\ ?, or in other words the ceiling of + the exact square root of *n*. For positive *n*, this can be computed using + ``a = 1 + isqrt(n - 1)``. + + .. versionadded:: 3.8 + + .. function:: ldexp(x, i) Return ``x * (2**i)``. This is essentially the inverse of function @@ -538,3 +552,6 @@ Constants Module :mod:`cmath` Complex number versions of many of these functions. + +.. |nbsp| unicode:: 0xA0 + :trim: diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index d47993bf1129..07da4047a383 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -344,6 +344,9 @@ Added new function, :func:`math.prod`, as analogous function to :func:`sum` that returns the product of a 'start' value (default: 1) times an iterable of numbers. (Contributed by Pablo Galindo in :issue:`35606`) +Added new function :func:`math.isqrt` for computing integer square roots. +(Contributed by Mark Dickinson in :issue:`36887`.) + os -- diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index cb05dee0e0fd..a11a34478564 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -912,6 +912,57 @@ class T(tuple): self.assertEqual(math.dist(p, q), 5*scale) self.assertEqual(math.dist(q, p), 5*scale) + def testIsqrt(self): + # Test a variety of inputs, large and small. + test_values = ( + list(range(1000)) + + list(range(10**6 - 1000, 10**6 + 1000)) + + [3**9999, 10**5001] + ) + + for value in test_values: + with self.subTest(value=value): + s = math.isqrt(value) + self.assertIs(type(s), int) + self.assertLessEqual(s*s, value) + self.assertLess(value, (s+1)*(s+1)) + + # Negative values + with self.assertRaises(ValueError): + math.isqrt(-1) + + # Integer-like things + s = math.isqrt(True) + self.assertIs(type(s), int) + self.assertEqual(s, 1) + + s = math.isqrt(False) + self.assertIs(type(s), int) + self.assertEqual(s, 0) + + class IntegerLike(object): + def __init__(self, value): + self.value = value + + def __index__(self): + return self.value + + s = math.isqrt(IntegerLike(1729)) + self.assertIs(type(s), int) + self.assertEqual(s, 41) + + with self.assertRaises(ValueError): + math.isqrt(IntegerLike(-3)) + + # Non-integer-like things + bad_values = [ + 3.5, "a string", decimal.Decimal("3.5"), 3.5j, + 100.0, -4.0, + ] + for value in bad_values: + with self.subTest(value=value): + with self.assertRaises(TypeError): + math.isqrt(value) def testLdexp(self): self.assertRaises(TypeError, math.ldexp) diff --git a/Misc/NEWS.d/next/Library/2019-05-11-14-50-59.bpo-36887.XD3f22.rst b/Misc/NEWS.d/next/Library/2019-05-11-14-50-59.bpo-36887.XD3f22.rst new file mode 100644 index 000000000000..fe2929cea85a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-11-14-50-59.bpo-36887.XD3f22.rst @@ -0,0 +1 @@ +Add new function :func:`math.isqrt` to compute integer square roots. diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index 1806a01588c5..e677bd896cd8 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -65,6 +65,15 @@ PyDoc_STRVAR(math_fsum__doc__, #define MATH_FSUM_METHODDEF \ {"fsum", (PyCFunction)math_fsum, METH_O, math_fsum__doc__}, +PyDoc_STRVAR(math_isqrt__doc__, +"isqrt($module, n, /)\n" +"--\n" +"\n" +"Return the integer part of the square root of the input."); + +#define MATH_ISQRT_METHODDEF \ + {"isqrt", (PyCFunction)math_isqrt, METH_O, math_isqrt__doc__}, + PyDoc_STRVAR(math_factorial__doc__, "factorial($module, x, /)\n" "--\n" @@ -628,4 +637,4 @@ math_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k exit: return return_value; } -/*[clinic end generated code: output=96e71135dce41c48 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=aeed62f403b90199 input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 8f6a303cc4de..821309221f82 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1476,6 +1476,266 @@ count_set_bits(unsigned long n) return count; } +/* Integer square root + +Given a nonnegative integer `n`, we want to compute the largest integer +`a` for which `a * a <= n`, or equivalently the integer part of the exact +square root of `n`. + +We use an adaptive-precision pure-integer version of Newton's iteration. Given +a positive integer `n`, the algorithm produces at each iteration an integer +approximation `a` to the square root of `n >> s` for some even integer `s`, +with `s` decreasing as the iterations progress. On the final iteration, `s` is +zero and we have an approximation to the square root of `n` itself. + +At every step, the approximation `a` is strictly within 1.0 of the true square +root, so we have + + (a - 1)**2 < (n >> s) < (a + 1)**2 + +After the final iteration, a check-and-correct step is needed to determine +whether `a` or `a - 1` gives the desired integer square root of `n`. + +The algorithm is remarkable in its simplicity. There's no need for a +per-iteration check-and-correct step, and termination is straightforward: the +number of iterations is known in advance (it's exactly `floor(log2(log2(n)))` +for `n > 1`). The only tricky part of the correctness proof is in establishing +that the bound `(a - 1)**2 < (n >> s) < (a + 1)**2` is maintained from one +iteration to the next. A sketch of the proof of this is given below. + +In addition to the proof sketch, a formal, computer-verified proof +of correctness (using Lean) of an equivalent recursive algorithm can be found +here: + + https://github.com/mdickinson/snippets/blob/master/proofs/isqrt/src/isqrt.lean + + +Here's Python code equivalent to the C implementation below: + + def isqrt(n): + """ + Return the integer part of the square root of the input. + """ + n = operator.index(n) + + if n < 0: + raise ValueError("isqrt() argument must be nonnegative") + if n == 0: + return 0 + + c = (n.bit_length() - 1) // 2 + a = 1 + d = 0 + for s in reversed(range(c.bit_length())): + e = d + d = c >> s + a = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a + assert (a-1)**2 < n >> 2*(c - d) < (a+1)**2 + + return a - (a*a > n) + + +Sketch of proof of correctness +------------------------------ + +The delicate part of the correctness proof is showing that the loop invariant +is preserved from one iteration to the next. That is, just before the line + + a = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a + +is executed in the above code, we know that + + (1) (a - 1)**2 < (n >> 2*(c - e)) < (a + 1)**2. + +(since `e` is always the value of `d` from the previous iteration). We must +prove that after that line is executed, we have + + (a - 1)**2 < (n >> 2*(c - d)) < (a + 1)**2 + +To faciliate the proof, we make some changes of notation. Write `m` for +`n >> 2*(c-d)`, and write `b` for the new value of `a`, so + + b = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a + +or equivalently: + + (2) b = (a << d - e - 1) + (m >> d - e + 1) // a + +Then we can rewrite (1) as: + + (3) (a - 1)**2 < (m >> 2*(d - e)) < (a + 1)**2 + +and we must show that (b - 1)**2 < m < (b + 1)**2. + +From this point on, we switch to mathematical notation, so `/` means exact +division rather than integer division and `^` is used for exponentiation. We +use the `?` symbol for the exact square root. In (3), we can remove the +implicit floor operation to give: + + (4) (a - 1)^2 < m / 4^(d - e) < (a + 1)^2 + +Taking square roots throughout (4), scaling by `2^(d-e)`, and rearranging gives + + (5) 0 <= | 2^(d-e)a - ?m | < 2^(d-e) + +Squaring and dividing through by `2^(d-e+1) a` gives + + (6) 0 <= 2^(d-e-1) a + m / (2^(d-e+1) a) - ?m < 2^(d-e-1) / a + +We'll show below that `2^(d-e-1) <= a`. Given that, we can replace the +right-hand side of (6) with `1`, and now replacing the central +term `m / (2^(d-e+1) a)` with its floor in (6) gives + + (7) -1 < 2^(d-e-1) a + m // 2^(d-e+1) a - ?m < 1 + +Or equivalently, from (2): + + (7) -1 < b - ?m < 1 + +and rearranging gives that `(b-1)^2 < m < (b+1)^2`, which is what we needed +to prove. + +We're not quite done: we still have to prove the inequality `2^(d - e - 1) <= +a` that was used to get line (7) above. From the definition of `c`, we have +`4^c <= n`, which implies + + (8) 4^d <= m + +also, since `e == d >> 1`, `d` is at most `2e + 1`, from which it follows +that `2d - 2e - 1 <= d` and hence that + + (9) 4^(2d - 2e - 1) <= m + +Dividing both sides by `4^(d - e)` gives + + (10) 4^(d - e - 1) <= m / 4^(d - e) + +But we know from (4) that `m / 4^(d-e) < (a + 1)^2`, hence + + (11) 4^(d - e - 1) < (a + 1)^2 + +Now taking square roots of both sides and observing that both `2^(d-e-1)` and +`a` are integers gives `2^(d - e - 1) <= a`, which is what we needed. This +completes the proof sketch. + +*/ + +/*[clinic input] +math.isqrt + + n: object + / + +Return the integer part of the square root of the input. +[clinic start generated code]*/ + +static PyObject * +math_isqrt(PyObject *module, PyObject *n) +/*[clinic end generated code: output=35a6f7f980beab26 input=5b6e7ae4fa6c43d6]*/ +{ + int a_too_large, s; + size_t c, d; + PyObject *a = NULL, *b; + + n = PyNumber_Index(n); + if (n == NULL) { + return NULL; + } + + if (_PyLong_Sign(n) < 0) { + PyErr_SetString( + PyExc_ValueError, + "isqrt() argument must be nonnegative"); + goto error; + } + if (_PyLong_Sign(n) == 0) { + Py_DECREF(n); + return PyLong_FromLong(0); + } + + c = _PyLong_NumBits(n); + if (c == (size_t)(-1)) { + goto error; + } + c = (c - 1U) / 2U; + + /* s = c.bit_length() */ + s = 0; + while ((c >> s) > 0) { + ++s; + } + + a = PyLong_FromLong(1); + if (a == NULL) { + goto error; + } + d = 0; + while (--s >= 0) { + PyObject *q, *shift; + size_t e = d; + + d = c >> s; + + /* q = (n >> 2*c - e - d + 1) // a */ + shift = PyLong_FromSize_t(2U*c - d - e + 1U); + if (shift == NULL) { + goto error; + } + q = PyNumber_Rshift(n, shift); + Py_DECREF(shift); + if (q == NULL) { + goto error; + } + Py_SETREF(q, PyNumber_FloorDivide(q, a)); + if (q == NULL) { + goto error; + } + + /* a = (a << d - 1 - e) + q */ + shift = PyLong_FromSize_t(d - 1U - e); + if (shift == NULL) { + Py_DECREF(q); + goto error; + } + Py_SETREF(a, PyNumber_Lshift(a, shift)); + Py_DECREF(shift); + if (a == NULL) { + Py_DECREF(q); + goto error; + } + Py_SETREF(a, PyNumber_Add(a, q)); + Py_DECREF(q); + if (a == NULL) { + goto error; + } + } + + /* The correct result is either a or a - 1. Figure out which, and + decrement a if necessary. */ + + /* a_too_large = n < a * a */ + b = PyNumber_Multiply(a, a); + if (b == NULL) { + goto error; + } + a_too_large = PyObject_RichCompareBool(n, b, Py_LT); + Py_DECREF(b); + if (a_too_large == -1) { + goto error; + } + + if (a_too_large) { + Py_SETREF(a, PyNumber_Subtract(a, _PyLong_One)); + } + Py_DECREF(n); + return a; + + error: + Py_XDECREF(a); + Py_DECREF(n); + return NULL; +} + /* Divide-and-conquer factorial algorithm * * Based on the formula and pseudo-code provided at: @@ -2737,6 +2997,7 @@ static PyMethodDef math_methods[] = { MATH_ISFINITE_METHODDEF MATH_ISINF_METHODDEF MATH_ISNAN_METHODDEF + MATH_ISQRT_METHODDEF MATH_LDEXP_METHODDEF {"lgamma", math_lgamma, METH_O, math_lgamma_doc}, MATH_LOG_METHODDEF From webhook-mailer at python.org Sat May 18 13:18:33 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 18 May 2019 17:18:33 -0000 Subject: [Python-checkins] bpo-36546: Add more tests and expand docs (#13406) Message-ID: https://github.com/python/cpython/commit/e917f2ed9af044fe808fc9b4ddc6c5eb99003500 commit: e917f2ed9af044fe808fc9b4ddc6c5eb99003500 branch: master author: Raymond Hettinger committer: GitHub date: 2019-05-18T10:18:29-07:00 summary: bpo-36546: Add more tests and expand docs (#13406) files: M Doc/library/statistics.rst M Lib/test/test_statistics.py diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index fb7df4e7188a..bc841fda72f8 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -511,22 +511,33 @@ However, for reading convenience, most of the examples show sorted sequences. is not least 1. The *dist* can be any iterable containing sample data or it can be an - instance of a class that defines an :meth:`~inv_cdf` method. + instance of a class that defines an :meth:`~inv_cdf` method. For meaningful + results, the number of data points in *dist* should be larger than *n*. Raises :exc:`StatisticsError` if there are not at least two data points. For sample data, the cut points are linearly interpolated from the two nearest data points. For example, if a cut point falls one-third of the distance between two sample values, ``100`` and ``112``, the - cut-point will evaluate to ``104``. Other selection methods may be - offered in the future (for example choose ``100`` as the nearest - value or compute ``106`` as the midpoint). This might matter if - there are too few samples for a given number of cut points. - - If *method* is set to *inclusive*, *dist* is treated as population data. - The minimum value is treated as the 0th percentile and the maximum - value is treated as the 100th percentile. If *dist* is an instance of - a class that defines an :meth:`~inv_cdf` method, setting *method* - has no effect. + cut-point will evaluate to ``104``. + + The *method* for computing quantiles can be varied depending on + whether the data in *dist* includes or excludes the lowest and + highest possible values from the population. + + The default *method* is "exclusive" and is used for data sampled from + a population that can have more extreme values than found in the + samples. The portion of the population falling below the *i-th* of + *m* data points is computed as ``i / (m + 1)``. + + Setting the *method* to "inclusive" is used for describing population + data or for samples that include the extreme points. The minimum + value in *dist* is treated as the 0th percentile and the maximum + value is treated as the 100th percentile. The portion of the + population falling below the *i-th* of *m* data points is computed as + ``(i - 1) / (m - 1)``. + + If *dist* is an instance of a class that defines an + :meth:`~inv_cdf` method, setting *method* has no effect. .. doctest:: diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 1922de5df4b0..946c7428c613 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2161,17 +2161,18 @@ def test_specific_cases(self): # Quantiles should be idempotent if len(expected) >= 2: self.assertEqual(quantiles(expected, n=n), expected) - # Cross-check against other methods - if len(data) >= n: - # After end caps are added, method='inclusive' should - # give the same result as method='exclusive' whenever - # there are more data points than desired cut points. - padded_data = [min(data) - 1000] + data + [max(data) + 1000] - self.assertEqual( - quantiles(data, n=n), - quantiles(padded_data, n=n, method='inclusive'), - (n, data), - ) + # Cross-check against method='inclusive' which should give + # the same result after adding in minimum and maximum values + # extrapolated from the two lowest and two highest points. + sdata = sorted(data) + lo = 2 * sdata[0] - sdata[1] + hi = 2 * sdata[-1] - sdata[-2] + padded_data = data + [lo, hi] + self.assertEqual( + quantiles(data, n=n), + quantiles(padded_data, n=n, method='inclusive'), + (n, data), + ) # Invariant under tranlation and scaling def f(x): return 3.5 * x - 1234.675 @@ -2188,6 +2189,11 @@ def f(x): actual = quantiles(statistics.NormalDist(), n=n) self.assertTrue(all(math.isclose(e, a, abs_tol=0.0001) for e, a in zip(expected, actual))) + # Q2 agrees with median() + for k in range(2, 60): + data = random.choices(range(100), k=k) + q1, q2, q3 = quantiles(data) + self.assertEqual(q2, statistics.median(data)) def test_specific_cases_inclusive(self): # Match results computed by hand and cross-checked @@ -2233,6 +2239,11 @@ def f(x): actual = quantiles(statistics.NormalDist(), n=n, method="inclusive") self.assertTrue(all(math.isclose(e, a, abs_tol=0.0001) for e, a in zip(expected, actual))) + # Natural deciles + self.assertEqual(quantiles([0, 100], n=10, method='inclusive'), + [10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0]) + self.assertEqual(quantiles(range(0, 101), n=10, method='inclusive'), + [10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0]) # Whenever n is smaller than the number of data points, running # method='inclusive' should give the same result as method='exclusive' # after the two included extreme points are removed. @@ -2242,6 +2253,11 @@ def f(x): data.remove(max(data)) expected = quantiles(data, n=32) self.assertEqual(expected, actual) + # Q2 agrees with median() + for k in range(2, 60): + data = random.choices(range(100), k=k) + q1, q2, q3 = quantiles(data, method='inclusive') + self.assertEqual(q2, statistics.median(data)) def test_equal_inputs(self): quantiles = statistics.quantiles From webhook-mailer at python.org Sat May 18 14:27:30 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 18 May 2019 18:27:30 -0000 Subject: [Python-checkins] bpo-2180: Treat line continuation at EOF as a `SyntaxError` (GH-13401) Message-ID: https://github.com/python/cpython/commit/abea73bf4a320ff658c9a98fef3d948a142e61a9 commit: abea73bf4a320ff658c9a98fef3d948a142e61a9 branch: master author: Anthony Sottile committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-18T11:27:16-07:00 summary: bpo-2180: Treat line continuation at EOF as a `SyntaxError` (GH-13401) This makes the parser consistent with the tokenize module (already the case in `pypy`). sample ------ ```python x = 5\ ``` before ------ ```console $ python3 t.py $ python3 -mtokenize t.py t.py:2:0: error: EOF in multi-line statement ``` after ----- ```console $ ./python t.py File "t.py", line 3 x = 5\ ^ SyntaxError: unexpected EOF while parsing $ ./python -m tokenize t.py t.py:2:0: error: EOF in multi-line statement ``` https://bugs.python.org/issue2180 files: A Misc/NEWS.d/next/Core and Builtins/2019-05-17-18-34-30.bpo-2180.aBqHeW.rst M Lib/test/test_eof.py M Parser/tokenizer.c diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index 7baa7ae57c6f..a091ceaa25bc 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -1,7 +1,9 @@ """test script for a few new invalid token catches""" -import unittest +import sys from test import support +from test.support import script_helper +import unittest class EOFTestCase(unittest.TestCase): def test_EOFC(self): @@ -24,5 +26,27 @@ def test_EOFS(self): else: raise support.TestFailed + def test_line_continuation_EOF(self): + """A contination at the end of input must be an error; bpo2180.""" + expect = 'unexpected EOF while parsing (, line 1)' + with self.assertRaises(SyntaxError) as excinfo: + exec('x = 5\\') + self.assertEqual(str(excinfo.exception), expect) + with self.assertRaises(SyntaxError) as excinfo: + exec('\\') + self.assertEqual(str(excinfo.exception), expect) + + @unittest.skipIf(not sys.executable, "sys.executable required") + def test_line_continuation_EOF_from_file_bpo2180(self): + """Ensure tok_nextc() does not add too many ending newlines.""" + with support.temp_dir() as temp_dir: + file_name = script_helper.make_script(temp_dir, 'foo', '\\') + rc, out, err = script_helper.assert_python_failure(file_name) + self.assertIn(b'unexpected EOF while parsing', err) + + file_name = script_helper.make_script(temp_dir, 'foo', 'y = 6\\') + rc, out, err = script_helper.assert_python_failure(file_name) + self.assertIn(b'unexpected EOF while parsing', err) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-17-18-34-30.bpo-2180.aBqHeW.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-17-18-34-30.bpo-2180.aBqHeW.rst new file mode 100644 index 000000000000..a2207c17aea0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-17-18-34-30.bpo-2180.aBqHeW.rst @@ -0,0 +1 @@ +Treat line continuation at EOF as a ``SyntaxError`` by Anthony Sottile. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 5dc2ae65c42d..e52d498d5542 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -983,7 +983,8 @@ tok_nextc(struct tok_state *tok) return EOF; /* Last line does not end in \n, fake one */ - strcpy(tok->inp, "\n"); + if (tok->inp[-1] != '\n') + strcpy(tok->inp, "\n"); } tok->inp = strchr(tok->inp, '\0'); done = tok->inp[-1] == '\n'; @@ -1674,6 +1675,14 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) tok->cur = tok->inp; return ERRORTOKEN; } + c = tok_nextc(tok); + if (c == EOF) { + tok->done = E_EOF; + tok->cur = tok->inp; + return ERRORTOKEN; + } else { + tok_backup(tok, c); + } tok->cont_line = 1; goto again; /* Read next line */ } From webhook-mailer at python.org Sat May 18 16:36:23 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 18 May 2019 20:36:23 -0000 Subject: [Python-checkins] bpo-19376: Added doc mentioning `datetime.strptime()` without a year fails for Feb 29. (GH-10243) Message-ID: https://github.com/python/cpython/commit/56027ccd6b9dab4a090e4fef8574933fb9a36ff2 commit: 56027ccd6b9dab4a090e4fef8574933fb9a36ff2 branch: master author: Abhishek Kumar Singh committer: Cheryl Sabella date: 2019-05-18T16:36:19-04:00 summary: bpo-19376: Added doc mentioning `datetime.strptime()` without a year fails for Feb 29. (GH-10243) files: M Doc/library/datetime.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index abdc97735480..3c45e56b5f4f 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -2048,6 +2048,9 @@ For :class:`date` objects, the format codes for hours, minutes, seconds, and microseconds should not be used, as :class:`date` objects have no such values. If they're used anyway, ``0`` is substituted for them. +For the :meth:`datetime.strptime` class method, the default value is ``1900-01-01T00:00:00.000``: +any components not specified in the format string will be pulled from the default value. [#]_ + The full set of format codes supported varies across platforms, because Python calls the platform C library's :func:`strftime` function, and platform variations are common. To see the full set of format codes supported on your @@ -2282,3 +2285,4 @@ Notes: .. rubric:: Footnotes .. [#] If, that is, we ignore the effects of Relativity +.. [#] Passing ``datetime.strptime('Feb 29', '%b %d')`` will fail since ``1900`` is not a leap year. From webhook-mailer at python.org Sat May 18 17:53:57 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Sat, 18 May 2019 21:53:57 -0000 Subject: [Python-checkins] bpo-36567: Use manpages_url to create links for man pages (GH-13339) Message-ID: https://github.com/python/cpython/commit/eab99650799699f766c2660f4cfa8ff3f9e8457f commit: eab99650799699f766c2660f4cfa8ff3f9e8457f branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: Berker Peksag date: 2019-05-19T00:53:53+03:00 summary: bpo-36567: Use manpages_url to create links for man pages (GH-13339) files: M Doc/conf.py diff --git a/Doc/conf.py b/Doc/conf.py index afe66270c10e..e85ea5b2d2ff 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -23,6 +23,9 @@ except ImportError: _tkinter = None ''' + +manpages_url = 'https://manpages.debian.org/{path}' + # General substitutions. project = 'Python' copyright = '2001-%s, Python Software Foundation' % time.strftime('%Y') From webhook-mailer at python.org Sat May 18 18:10:24 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 18 May 2019 22:10:24 -0000 Subject: [Python-checkins] Add support for PEP572 in ast_unparse.c (GH-13337) Message-ID: https://github.com/python/cpython/commit/fa19a25c238d0769e6a5aa63ce05133d66043556 commit: fa19a25c238d0769e6a5aa63ce05133d66043556 branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: Pablo Galindo date: 2019-05-18T23:10:20+01:00 summary: Add support for PEP572 in ast_unparse.c (GH-13337) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-15-14-01-09.bpo-36826.GLrO3W.rst M Lib/test/test_future.py M Python/ast_unparse.c diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py index 38de3dfdafcd..cd320a266a87 100644 --- a/Lib/test/test_future.py +++ b/Lib/test/test_future.py @@ -275,6 +275,8 @@ def test_annotations(self): eq('f((x for x in a), 2)') eq('(((a)))', 'a') eq('(((a, b)))', '(a, b)') + eq("(x:=10)") + eq("f'{(x:=10):=10}'") if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-14-01-09.bpo-36826.GLrO3W.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-14-01-09.bpo-36826.GLrO3W.rst new file mode 100644 index 000000000000..5a1b51999f26 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-14-01-09.bpo-36826.GLrO3W.rst @@ -0,0 +1 @@ +Add NamedExpression kind support to ast_unparse.c diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index 25a5c698a1db..5f366a188b36 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -809,6 +809,17 @@ append_ast_await(_PyUnicodeWriter *writer, expr_ty e, int level) return 0; } +static int +append_named_expr(_PyUnicodeWriter *writer, expr_ty e, int level) +{ + APPEND_STR_IF(level > PR_TUPLE, "("); + APPEND_EXPR(e->v.NamedExpr.target, PR_ATOM); + APPEND_STR(":="); + APPEND_EXPR(e->v.NamedExpr.value, PR_ATOM); + APPEND_STR_IF(level > PR_TUPLE, ")"); + return 0; +} + static int append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level) { @@ -867,6 +878,8 @@ append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level) return append_ast_list(writer, e); case Tuple_kind: return append_ast_tuple(writer, e, level); + case NamedExpr_kind: + return append_named_expr(writer, e, level); default: PyErr_SetString(PyExc_SystemError, "unknown expression kind"); From webhook-mailer at python.org Sat May 18 18:40:25 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 18 May 2019 22:40:25 -0000 Subject: [Python-checkins] bpo-36961: Handle positional-only arguments in uparse.c (GH-13412) Message-ID: https://github.com/python/cpython/commit/da6129e821099c1372d511a11d18af83d6d5d128 commit: da6129e821099c1372d511a11d18af83d6d5d128 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-18T23:40:22+01:00 summary: bpo-36961: Handle positional-only arguments in uparse.c (GH-13412) files: M Lib/test/test_future.py M Python/ast_unparse.c diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py index cd320a266a87..dd148b629562 100644 --- a/Lib/test/test_future.py +++ b/Lib/test/test_future.py @@ -183,6 +183,18 @@ def test_annotations(self): eq('lambda a, b, c=True: a') eq("lambda a, b, c=True, *, d=1 << v2, e='str': a") eq("lambda a, b, c=True, *vararg, d, e='str', **kwargs: a + b") + eq("lambda a, /, b, c=True, *vararg, d, e='str', **kwargs: a + b") + eq('lambda x, /: x') + eq('lambda x=1, /: x') + eq('lambda x, /, y: x + y') + eq('lambda x=1, /, y=2: x + y') + eq('lambda x, /, y=1: x + y') + eq('lambda x, /, y=1, *, z=3: x + y + z') + eq('lambda x=1, /, y=2, *, z=3: x + y + z') + eq('lambda x=1, /, y=2, *, z: x + y + z') + eq('lambda x=1, y=2, z=3, /, w=4, *, l, l2: x + y + z + w + l + l2') + eq('lambda x=1, y=2, z=3, /, w=4, *, l, l2, **kwargs: x + y + z + w + l + l2') + eq('lambda x, /, y=1, *, z: x + y + z') eq('lambda x: lambda y: x + y') eq('1 if True else 2') eq('str or None if int or True else str or bytes or None') diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index 5f366a188b36..f1b991a7c387 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -193,22 +193,30 @@ static int append_ast_args(_PyUnicodeWriter *writer, arguments_ty args) { bool first; - Py_ssize_t i, di, arg_count, default_count; + Py_ssize_t i, di, arg_count, posonlyarg_count, default_count; first = true; - /* positional arguments with defaults */ + /* positional-only and positional arguments with defaults */ + posonlyarg_count = asdl_seq_LEN(args->posonlyargs); arg_count = asdl_seq_LEN(args->args); default_count = asdl_seq_LEN(args->defaults); - for (i = 0; i < arg_count; i++) { + for (i = 0; i < posonlyarg_count + arg_count; i++) { APPEND_STR_IF_NOT_FIRST(", "); - APPEND(arg, (arg_ty)asdl_seq_GET(args->args, i)); + if (i < posonlyarg_count){ + APPEND(arg, (arg_ty)asdl_seq_GET(args->posonlyargs, i)); + } else { + APPEND(arg, (arg_ty)asdl_seq_GET(args->args, i-posonlyarg_count)); + } - di = i - arg_count + default_count; + di = i - posonlyarg_count - arg_count + default_count; if (di >= 0) { APPEND_STR("="); APPEND_EXPR((expr_ty)asdl_seq_GET(args->defaults, di), PR_TEST); } + if (posonlyarg_count && i + 1 == posonlyarg_count) { + APPEND_STR(", /"); + } } /* vararg, or bare '*' if no varargs but keyword-only arguments present */ @@ -251,7 +259,9 @@ static int append_ast_lambda(_PyUnicodeWriter *writer, expr_ty e, int level) { APPEND_STR_IF(level > PR_TEST, "("); - APPEND_STR(asdl_seq_LEN(e->v.Lambda.args->args) ? "lambda " : "lambda"); + Py_ssize_t n_positional = (asdl_seq_LEN(e->v.Lambda.args->args) + + asdl_seq_LEN(e->v.Lambda.args->posonlyargs)); + APPEND_STR(n_positional ? "lambda " : "lambda"); APPEND(args, e->v.Lambda.args); APPEND_STR(": "); APPEND_EXPR(e->v.Lambda.body, PR_TEST); From webhook-mailer at python.org Sat May 18 20:18:09 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sun, 19 May 2019 00:18:09 -0000 Subject: [Python-checkins] bpo-33519: clarify that .copy() is not part of the MutableSequence ABC (GH-6965) Message-ID: https://github.com/python/cpython/commit/9892f454d11b7ea9ba394a115b3e6f48ef6f78fe commit: 9892f454d11b7ea9ba394a115b3e6f48ef6f78fe branch: master author: Jelle Zijlstra committer: Cheryl Sabella date: 2019-05-18T20:17:56-04:00 summary: bpo-33519: clarify that .copy() is not part of the MutableSequence ABC (GH-6965) files: A Misc/NEWS.d/next/Documentation/2018-05-17-21-02-00.bpo-33519.Q7s2FB.rst M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 53337291dd39..293a1ab6a0d9 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1114,7 +1114,7 @@ Notes: item is removed and returned. (3) - ``remove`` raises :exc:`ValueError` when *x* is not found in *s*. + :meth:`remove` raises :exc:`ValueError` when *x* is not found in *s*. (4) The :meth:`reverse` method modifies the sequence in place for economy of @@ -1124,7 +1124,9 @@ Notes: (5) :meth:`clear` and :meth:`!copy` are included for consistency with the interfaces of mutable containers that don't support slicing operations - (such as :class:`dict` and :class:`set`) + (such as :class:`dict` and :class:`set`). :meth:`!copy` is not part of the + :class:`collections.abc.MutableSequence` ABC, but most concrete + mutable sequence classes provide it. .. versionadded:: 3.3 :meth:`clear` and :meth:`!copy` methods. diff --git a/Misc/NEWS.d/next/Documentation/2018-05-17-21-02-00.bpo-33519.Q7s2FB.rst b/Misc/NEWS.d/next/Documentation/2018-05-17-21-02-00.bpo-33519.Q7s2FB.rst new file mode 100644 index 000000000000..0ee6c0d5f8ea --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-05-17-21-02-00.bpo-33519.Q7s2FB.rst @@ -0,0 +1 @@ +Clarify that `copy()` is not part of the `MutableSequence` ABC. From webhook-mailer at python.org Sat May 18 21:17:52 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sun, 19 May 2019 01:17:52 -0000 Subject: [Python-checkins] Fix typo in test comment (GH-11442) Message-ID: https://github.com/python/cpython/commit/f665b96e92a6a6943e312e2c606f348db95939ab commit: f665b96e92a6a6943e312e2c606f348db95939ab branch: master author: Ashwin Ramaswami committer: Cheryl Sabella date: 2019-05-18T21:17:47-04:00 summary: Fix typo in test comment (GH-11442) files: M Lib/unittest/test/test_case.py diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index 687fe5b65f10..c2401c39b917 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -620,7 +620,7 @@ def AllSnakesCreatedEqual(a, b, msg=None): self.addTypeEqualityFunc(SadSnake, AllSnakesCreatedEqual) self.assertEqual(s1, s2) # No this doesn't clean up and remove the SadSnake equality func - # from this TestCase instance but since its a local nothing else + # from this TestCase instance but since it's local nothing else # will ever notice that. def testAssertIs(self): From webhook-mailer at python.org Sat May 18 22:12:05 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 May 2019 02:12:05 -0000 Subject: [Python-checkins] bpo-36783: Add new references for C API Documentation changes (GH-13204) Message-ID: https://github.com/python/cpython/commit/951b161857a840d4d14de0a5a6610e212d78ab68 commit: 951b161857a840d4d14de0a5a6610e212d78ab68 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-18T19:12:01-07:00 summary: bpo-36783: Add new references for C API Documentation changes (GH-13204) (cherry picked from commit d28772ab6967fea136c0707f0207673ebad66f61) Co-authored-by: Edison A <20975616+SimiCode at users.noreply.github.com> files: M Doc/c-api/datetime.rst M Doc/data/refcounts.dat diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index b7949e235005..77b1b216744b 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -106,6 +106,12 @@ Macros to create objects: .. versionadded:: 3.6 +.. c:function:: PyObject* PyTime_FromTime(int hour, int minute, int second, int usecond) + + Return a :class:`datetime.time` object with the specified hour, minute, second and + microsecond. + + .. c:function:: PyObject* PyTime_FromTimeAndFold(int hour, int minute, int second, int usecond, int fold) Return a :class:`datetime.time` object with the specified hour, minute, second, @@ -114,12 +120,6 @@ Macros to create objects: .. versionadded:: 3.6 -.. c:function:: PyObject* PyTime_FromTime(int hour, int minute, int second, int usecond) - - Return a :class:`datetime.time` object with the specified hour, minute, second and - microsecond. - - .. c:function:: PyObject* PyDelta_FromDSU(int days, int seconds, int useconds) Return a :class:`datetime.timedelta` object representing the given number diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 35527c179f34..213ddcb61fae 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -413,6 +413,16 @@ PyDateTime_FromDateAndTime:int:minute:: PyDateTime_FromDateAndTime:int:second:: PyDateTime_FromDateAndTime:int:usecond:: +PyDateTime_FromDateAndTimeAndFold:PyObject*::+1: +PyDateTime_FromDateAndTimeAndFold:int:year:: +PyDateTime_FromDateAndTimeAndFold:int:month:: +PyDateTime_FromDateAndTimeAndFold:int:day:: +PyDateTime_FromDateAndTimeAndFold:int:hour:: +PyDateTime_FromDateAndTimeAndFold:int:minute:: +PyDateTime_FromDateAndTimeAndFold:int:second:: +PyDateTime_FromDateAndTimeAndFold:int:usecond:: +PyDateTime_FromDateAndTimeAndFold:int:fold:: + PyDateTime_FromTimestamp:PyObject*::+1: PyDateTime_FromTimestamp:PyObject*:args:0: @@ -2210,6 +2220,13 @@ PyTime_FromTime:int:minute:: PyTime_FromTime:int:second:: PyTime_FromTime:int:usecond:: +PyTime_FromTimeAndFold:PyObject*::+1: +PyTime_FromTimeAndFold:int:hour:: +PyTime_FromTimeAndFold:int:minute:: +PyTime_FromTimeAndFold:int:second:: +PyTime_FromTimeAndFold:int:usecond:: +PyTime_FromTimeAndFold:int:fold:: + PyTraceMalloc_Track:int::: PyTraceMalloc_Track:unsigned int:domain:: PyTraceMalloc_Track:uintptr_t:ptr:: From webhook-mailer at python.org Sun May 19 05:01:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 May 2019 09:01:43 -0000 Subject: [Python-checkins] Orthographical fix (GH-13418) Message-ID: https://github.com/python/cpython/commit/1d5bdef550d4395211fbe5f3c1444d7ea5bb54a2 commit: 1d5bdef550d4395211fbe5f3c1444d7ea5bb54a2 branch: master author: Bo?tjan Mejak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-19T02:01:36-07:00 summary: Orthographical fix (GH-13418) Add a missing comma. files: M Doc/library/asyncio-task.rst diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index e7cf39b2bccd..bb064bd93dea 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -40,7 +40,7 @@ be executed:: >>> main() -To actually run a coroutine asyncio provides three main mechanisms: +To actually run a coroutine, asyncio provides three main mechanisms: * The :func:`asyncio.run` function to run the top-level entry point "main()" function (see the above example.) From webhook-mailer at python.org Sun May 19 05:13:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 May 2019 09:13:32 -0000 Subject: [Python-checkins] Orthographical fix (GH-13418) Message-ID: https://github.com/python/cpython/commit/f81b33badab5d83afc7ee32c37e65a5cf60ad757 commit: f81b33badab5d83afc7ee32c37e65a5cf60ad757 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-19T02:13:28-07:00 summary: Orthographical fix (GH-13418) Add a missing comma. (cherry picked from commit 1d5bdef550d4395211fbe5f3c1444d7ea5bb54a2) Co-authored-by: Bo?tjan Mejak files: M Doc/library/asyncio-task.rst diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 9e685b176486..29ccafee908b 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -40,7 +40,7 @@ be executed:: >>> main() -To actually run a coroutine asyncio provides three main mechanisms: +To actually run a coroutine, asyncio provides three main mechanisms: * The :func:`asyncio.run` function to run the top-level entry point "main()" function (see the above example.) From webhook-mailer at python.org Sun May 19 07:14:48 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 19 May 2019 11:14:48 -0000 Subject: [Python-checkins] bpo-36957: Add _PyLong_Rshift() and _PyLong_Lshift(). (GH-13416) Message-ID: https://github.com/python/cpython/commit/a5119e7d75c9729fc36c059d05f3d7132e7f6bb4 commit: a5119e7d75c9729fc36c059d05f3d7132e7f6bb4 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-05-19T14:14:38+03:00 summary: bpo-36957: Add _PyLong_Rshift() and _PyLong_Lshift(). (GH-13416) files: M Include/longobject.h M Modules/mathmodule.c M Objects/floatobject.c M Objects/longobject.c diff --git a/Include/longobject.h b/Include/longobject.h index b696f544b9c1..a24bbea3a904 100644 --- a/Include/longobject.h +++ b/Include/longobject.h @@ -230,6 +230,9 @@ PyAPI_FUNC(PyObject *) _PyLong_GCD(PyObject *, PyObject *); #ifndef Py_LIMITED_API PyAPI_DATA(PyObject *) _PyLong_Zero; PyAPI_DATA(PyObject *) _PyLong_One; + +PyAPI_FUNC(PyObject *) _PyLong_Rshift(PyObject *, size_t); +PyAPI_FUNC(PyObject *) _PyLong_Lshift(PyObject *, size_t); #endif #ifdef __cplusplus diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 821309221f82..7a0044a9fcf0 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1671,18 +1671,13 @@ math_isqrt(PyObject *module, PyObject *n) } d = 0; while (--s >= 0) { - PyObject *q, *shift; + PyObject *q; size_t e = d; d = c >> s; /* q = (n >> 2*c - e - d + 1) // a */ - shift = PyLong_FromSize_t(2U*c - d - e + 1U); - if (shift == NULL) { - goto error; - } - q = PyNumber_Rshift(n, shift); - Py_DECREF(shift); + q = _PyLong_Rshift(n, 2U*c - d - e + 1U); if (q == NULL) { goto error; } @@ -1692,13 +1687,7 @@ math_isqrt(PyObject *module, PyObject *n) } /* a = (a << d - 1 - e) + q */ - shift = PyLong_FromSize_t(d - 1U - e); - if (shift == NULL) { - Py_DECREF(q); - goto error; - } - Py_SETREF(a, PyNumber_Lshift(a, shift)); - Py_DECREF(shift); + Py_SETREF(a, _PyLong_Lshift(a, d - 1U - e)); if (a == NULL) { Py_DECREF(q); goto error; @@ -1939,9 +1928,9 @@ static PyObject * math_factorial(PyObject *module, PyObject *arg) /*[clinic end generated code: output=6686f26fae00e9ca input=6d1c8105c0d91fb4]*/ { - long x; + long x, two_valuation; int overflow; - PyObject *result, *odd_part, *two_valuation, *pyint_form; + PyObject *result, *odd_part, *pyint_form; if (PyFloat_Check(arg)) { PyObject *lx; @@ -1990,13 +1979,8 @@ math_factorial(PyObject *module, PyObject *arg) odd_part = factorial_odd_part(x); if (odd_part == NULL) return NULL; - two_valuation = PyLong_FromLong(x - count_set_bits(x)); - if (two_valuation == NULL) { - Py_DECREF(odd_part); - return NULL; - } - result = PyNumber_Lshift(odd_part, two_valuation); - Py_DECREF(two_valuation); + two_valuation = x - count_set_bits(x); + result = _PyLong_Lshift(odd_part, two_valuation); Py_DECREF(odd_part); return result; } diff --git a/Objects/floatobject.c b/Objects/floatobject.c index adb9b80c2713..4ff43bb338f9 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -463,13 +463,13 @@ float_richcompare(PyObject *v, PyObject *w, int op) */ PyObject *temp; - temp = PyNumber_Lshift(ww, _PyLong_One); + temp = _PyLong_Lshift(ww, 1); if (temp == NULL) goto Error; Py_DECREF(ww); ww = temp; - temp = PyNumber_Lshift(vv, _PyLong_One); + temp = _PyLong_Lshift(vv, 1); if (temp == NULL) goto Error; Py_DECREF(vv); diff --git a/Objects/longobject.c b/Objects/longobject.c index 9fb1fb02c276..1934328820c0 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -4416,9 +4416,9 @@ long_bool(PyLongObject *v) /* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */ static int -divmod_shift(PyLongObject *shiftby, Py_ssize_t *wordshift, digit *remshift) +divmod_shift(PyObject *shiftby, Py_ssize_t *wordshift, digit *remshift) { - assert(PyLong_Check((PyObject *)shiftby)); + assert(PyLong_Check(shiftby)); assert(Py_SIZE(shiftby) >= 0); Py_ssize_t lshiftby = PyLong_AsSsize_t((PyObject *)shiftby); if (lshiftby >= 0) { @@ -4430,7 +4430,7 @@ divmod_shift(PyLongObject *shiftby, Py_ssize_t *wordshift, digit *remshift) be that PyLong_AsSsize_t raised an OverflowError. */ assert(PyErr_ExceptionMatches(PyExc_OverflowError)); PyErr_Clear(); - PyLongObject *wordshift_obj = divrem1(shiftby, PyLong_SHIFT, remshift); + PyLongObject *wordshift_obj = divrem1((PyLongObject *)shiftby, PyLong_SHIFT, remshift); if (wordshift_obj == NULL) { return -1; } @@ -4448,19 +4448,11 @@ divmod_shift(PyLongObject *shiftby, Py_ssize_t *wordshift, digit *remshift) } static PyObject * -long_rshift(PyLongObject *a, PyLongObject *b) +long_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift) { PyLongObject *z = NULL; - Py_ssize_t newsize, wordshift, hishift, i, j; - digit loshift, lomask, himask; - - CHECK_BINOP(a, b); - - if (Py_SIZE(b) < 0) { - PyErr_SetString(PyExc_ValueError, - "negative shift count"); - return NULL; - } + Py_ssize_t newsize, hishift, i, j; + digit lomask, himask; if (Py_SIZE(a) < 0) { /* Right shifting negative numbers is harder */ @@ -4468,7 +4460,7 @@ long_rshift(PyLongObject *a, PyLongObject *b) a1 = (PyLongObject *) long_invert(a); if (a1 == NULL) return NULL; - a2 = (PyLongObject *) long_rshift(a1, b); + a2 = (PyLongObject *) long_rshift1(a1, wordshift, remshift); Py_DECREF(a1); if (a2 == NULL) return NULL; @@ -4476,19 +4468,17 @@ long_rshift(PyLongObject *a, PyLongObject *b) Py_DECREF(a2); } else { - if (divmod_shift(b, &wordshift, &loshift) < 0) - return NULL; newsize = Py_SIZE(a) - wordshift; if (newsize <= 0) return PyLong_FromLong(0); - hishift = PyLong_SHIFT - loshift; + hishift = PyLong_SHIFT - remshift; lomask = ((digit)1 << hishift) - 1; himask = PyLong_MASK ^ lomask; z = _PyLong_New(newsize); if (z == NULL) return NULL; for (i = 0, j = wordshift; i < newsize; i++, j++) { - z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask; + z->ob_digit[i] = (a->ob_digit[j] >> remshift) & lomask; if (i+1 < newsize) z->ob_digit[i] |= (a->ob_digit[j+1] << hishift) & himask; } @@ -4498,15 +4488,10 @@ long_rshift(PyLongObject *a, PyLongObject *b) } static PyObject * -long_lshift(PyObject *v, PyObject *w) +long_rshift(PyObject *a, PyObject *b) { - /* This version due to Tim Peters */ - PyLongObject *a = (PyLongObject*)v; - PyLongObject *b = (PyLongObject*)w; - PyLongObject *z = NULL; - Py_ssize_t oldsize, newsize, wordshift, i, j; + Py_ssize_t wordshift; digit remshift; - twodigits accum; CHECK_BINOP(a, b); @@ -4517,9 +4502,35 @@ long_lshift(PyObject *v, PyObject *w) if (Py_SIZE(a) == 0) { return PyLong_FromLong(0); } - if (divmod_shift(b, &wordshift, &remshift) < 0) return NULL; + return long_rshift1((PyLongObject *)a, wordshift, remshift); +} + +/* Return a >> shiftby. */ +PyObject * +_PyLong_Rshift(PyObject *a, size_t shiftby) +{ + Py_ssize_t wordshift; + digit remshift; + + assert(PyLong_Check(a)); + if (Py_SIZE(a) == 0) { + return PyLong_FromLong(0); + } + wordshift = shiftby / PyLong_SHIFT; + remshift = shiftby % PyLong_SHIFT; + return long_rshift1((PyLongObject *)a, wordshift, remshift); +} + +static PyObject * +long_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift) +{ + /* This version due to Tim Peters */ + PyLongObject *z = NULL; + Py_ssize_t oldsize, newsize, i, j; + twodigits accum; + oldsize = Py_ABS(Py_SIZE(a)); newsize = oldsize + wordshift; if (remshift) @@ -4547,6 +4558,42 @@ long_lshift(PyObject *v, PyObject *w) return (PyObject *) maybe_small_long(z); } +static PyObject * +long_lshift(PyObject *a, PyObject *b) +{ + Py_ssize_t wordshift; + digit remshift; + + CHECK_BINOP(a, b); + + if (Py_SIZE(b) < 0) { + PyErr_SetString(PyExc_ValueError, "negative shift count"); + return NULL; + } + if (Py_SIZE(a) == 0) { + return PyLong_FromLong(0); + } + if (divmod_shift(b, &wordshift, &remshift) < 0) + return NULL; + return long_lshift1((PyLongObject *)a, wordshift, remshift); +} + +/* Return a << shiftby. */ +PyObject * +_PyLong_Lshift(PyObject *a, size_t shiftby) +{ + Py_ssize_t wordshift; + digit remshift; + + assert(PyLong_Check(a)); + if (Py_SIZE(a) == 0) { + return PyLong_FromLong(0); + } + wordshift = shiftby / PyLong_SHIFT; + remshift = shiftby % PyLong_SHIFT; + return long_lshift1((PyLongObject *)a, wordshift, remshift); +} + /* Compute two's complement of digit vector a[0:m], writing result to z[0:m]. The digit vector a need not be normalized, but should not be entirely zero. a and z may point to the same digit vector. */ @@ -5552,7 +5599,7 @@ static PyNumberMethods long_as_number = { (inquiry)long_bool, /*tp_bool*/ (unaryfunc)long_invert, /*nb_invert*/ long_lshift, /*nb_lshift*/ - (binaryfunc)long_rshift, /*nb_rshift*/ + long_rshift, /*nb_rshift*/ long_and, /*nb_and*/ long_xor, /*nb_xor*/ long_or, /*nb_or*/ From webhook-mailer at python.org Sun May 19 09:40:11 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Sun, 19 May 2019 13:40:11 -0000 Subject: [Python-checkins] bpo-36948: Fix NameError in urllib.request.URLopener.retrieve (GH-13389) Message-ID: https://github.com/python/cpython/commit/c661b30f89ffe7a7995538d3b1649469b184bee4 commit: c661b30f89ffe7a7995538d3b1649469b184bee4 branch: master author: Xtreak committer: Berker Peksag date: 2019-05-19T16:40:05+03:00 summary: bpo-36948: Fix NameError in urllib.request.URLopener.retrieve (GH-13389) files: A Misc/NEWS.d/next/Library/2019-05-17-21-42-58.bpo-36948.vnUDvk.rst M Lib/test/test_urllib.py M Lib/urllib/request.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 7214492eca9d..74b19fbdcd8d 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1445,7 +1445,7 @@ def test_thishost(self): self.assertIsInstance(urllib.request.thishost(), tuple) -class URLopener_Tests(unittest.TestCase): +class URLopener_Tests(FakeHTTPMixin, unittest.TestCase): """Testcase to test the open method of URLopener class.""" def test_quoted_open(self): @@ -1463,6 +1463,24 @@ def open_spam(self, url): "spam://c:|windows%/:=&?~#+!$,;'@()*[]|/path/"), "//c:|windows%/:=&?~#+!$,;'@()*[]|/path/") + @support.ignore_warnings(category=DeprecationWarning) + def test_urlopener_retrieve_file(self): + with support.temp_dir() as tmpdir: + fd, tmpfile = tempfile.mkstemp(dir=tmpdir) + os.close(fd) + fileurl = "file:" + urllib.request.pathname2url(tmpfile) + filename, _ = urllib.request.URLopener().retrieve(fileurl) + self.assertEqual(filename, tmpfile) + + @support.ignore_warnings(category=DeprecationWarning) + def test_urlopener_retrieve_remote(self): + url = "http://www.python.org/file.txt" + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello!") + self.addCleanup(self.unfakehttp) + filename, _ = urllib.request.URLopener().retrieve(url) + self.assertEqual(os.path.splitext(filename)[1], ".txt") + + # Just commented them out. # Can't really tell why keep failing in windows and sparc. # Everywhere else they work ok, but on those machines, sometimes diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index df2ff06f0fc9..230ac390abb3 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1783,7 +1783,7 @@ def retrieve(self, url, filename=None, reporthook=None, data=None): fp = self.open_local_file(url1) hdrs = fp.info() fp.close() - return url2pathname(splithost(url1)[1]), hdrs + return url2pathname(_splithost(url1)[1]), hdrs except OSError as msg: pass fp = self.open(url, data) @@ -1792,10 +1792,10 @@ def retrieve(self, url, filename=None, reporthook=None, data=None): if filename: tfp = open(filename, 'wb') else: - garbage, path = splittype(url) - garbage, path = splithost(path or "") - path, garbage = splitquery(path or "") - path, garbage = splitattr(path or "") + garbage, path = _splittype(url) + garbage, path = _splithost(path or "") + path, garbage = _splitquery(path or "") + path, garbage = _splitattr(path or "") suffix = os.path.splitext(path)[1] (fd, filename) = tempfile.mkstemp(suffix) self.__tempfiles.append(filename) diff --git a/Misc/NEWS.d/next/Library/2019-05-17-21-42-58.bpo-36948.vnUDvk.rst b/Misc/NEWS.d/next/Library/2019-05-17-21-42-58.bpo-36948.vnUDvk.rst new file mode 100644 index 000000000000..c8cfa54067fd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-17-21-42-58.bpo-36948.vnUDvk.rst @@ -0,0 +1,2 @@ +Fix :exc:`NameError` in :meth:`urllib.request.URLopener.retrieve`. Patch by +Karthikeyan Singaravelan. From webhook-mailer at python.org Sun May 19 09:57:20 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 19 May 2019 13:57:20 -0000 Subject: [Python-checkins] bpo-27141: Fix collections.UserList and UserDict shallow copy. (GH-4094) Message-ID: https://github.com/python/cpython/commit/f4e1babf44792bdeb0c01da96821ba0800a51fd8 commit: f4e1babf44792bdeb0c01da96821ba0800a51fd8 branch: master author: Bar Harel committer: Serhiy Storchaka date: 2019-05-19T16:57:13+03:00 summary: bpo-27141: Fix collections.UserList and UserDict shallow copy. (GH-4094) files: A Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst M Lib/collections/__init__.py M Lib/test/test_collections.py diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 706907ad4a28..960d82a5dcfb 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1038,6 +1038,13 @@ def __contains__(self, key): # Now, add the methods in dicts but not in MutableMapping def __repr__(self): return repr(self.data) + def __copy__(self): + inst = self.__class__.__new__(self.__class__) + inst.__dict__.update(self.__dict__) + # Create a copy and avoid triggering descriptors + inst.__dict__["data"] = self.__dict__["data"].copy() + return inst + def copy(self): if self.__class__ is UserDict: return UserDict(self.data.copy()) @@ -1050,6 +1057,7 @@ def copy(self): self.data = data c.update(self) return c + @classmethod def fromkeys(cls, iterable, value=None): d = cls() @@ -1118,6 +1126,12 @@ def __mul__(self, n): def __imul__(self, n): self.data *= n return self + def __copy__(self): + inst = self.__class__.__new__(self.__class__) + inst.__dict__.update(self.__dict__) + # Create a copy and avoid triggering descriptors + inst.__dict__["data"] = self.__dict__["data"][:] + return inst def append(self, item): self.data.append(item) def insert(self, i, item): self.data.insert(i, item) def pop(self, i=-1): return self.data.pop(i) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 1f619bcdac92..e2d04d5b4761 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -37,6 +37,20 @@ def _superset_test(self, a, b): b=b.__name__, ), ) + + def _copy_test(self, obj): + # Test internal copy + obj_copy = obj.copy() + self.assertIsNot(obj.data, obj_copy.data) + self.assertEqual(obj.data, obj_copy.data) + + # Test copy.copy + obj.test = [1234] # Make sure instance vars are also copied. + obj_copy = copy.copy(obj) + self.assertIsNot(obj.data, obj_copy.data) + self.assertEqual(obj.data, obj_copy.data) + self.assertIs(obj.test, obj_copy.test) + def test_str_protocol(self): self._superset_test(UserString, str) @@ -46,6 +60,16 @@ def test_list_protocol(self): def test_dict_protocol(self): self._superset_test(UserDict, dict) + def test_list_copy(self): + obj = UserList() + obj.append(123) + self._copy_test(obj) + + def test_dict_copy(self): + obj = UserDict() + obj[123] = "abc" + self._copy_test(obj) + ################################################################################ ### ChainMap (helper class for configparser and the string module) diff --git a/Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst b/Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst new file mode 100644 index 000000000000..76c2abbf82d6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst @@ -0,0 +1,3 @@ +Added a ``__copy__()`` to ``collections.UserList`` and +``collections.UserDict`` in order to correctly implement shallow copying of +the objects. Patch by Bar Harel. From webhook-mailer at python.org Sun May 19 10:26:41 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 May 2019 14:26:41 -0000 Subject: [Python-checkins] bpo-27141: Fix collections.UserList and UserDict shallow copy. (GH-4094) Message-ID: https://github.com/python/cpython/commit/3645d29a1dc2102fdb0f5f0c0129ff2295bcd768 commit: 3645d29a1dc2102fdb0f5f0c0129ff2295bcd768 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-19T07:26:35-07:00 summary: bpo-27141: Fix collections.UserList and UserDict shallow copy. (GH-4094) (cherry picked from commit f4e1babf44792bdeb0c01da96821ba0800a51fd8) Co-authored-by: Bar Harel files: A Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst M Lib/collections/__init__.py M Lib/test/test_collections.py diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 1c69b1b50961..b4592f983921 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1036,6 +1036,13 @@ def __contains__(self, key): # Now, add the methods in dicts but not in MutableMapping def __repr__(self): return repr(self.data) + def __copy__(self): + inst = self.__class__.__new__(self.__class__) + inst.__dict__.update(self.__dict__) + # Create a copy and avoid triggering descriptors + inst.__dict__["data"] = self.__dict__["data"].copy() + return inst + def copy(self): if self.__class__ is UserDict: return UserDict(self.data.copy()) @@ -1048,6 +1055,7 @@ def copy(self): self.data = data c.update(self) return c + @classmethod def fromkeys(cls, iterable, value=None): d = cls() @@ -1112,6 +1120,12 @@ def __mul__(self, n): def __imul__(self, n): self.data *= n return self + def __copy__(self): + inst = self.__class__.__new__(self.__class__) + inst.__dict__.update(self.__dict__) + # Create a copy and avoid triggering descriptors + inst.__dict__["data"] = self.__dict__["data"][:] + return inst def append(self, item): self.data.append(item) def insert(self, i, item): self.data.insert(i, item) def pop(self, i=-1): return self.data.pop(i) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 00b33ce27674..16735b815e53 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -38,6 +38,20 @@ def _superset_test(self, a, b): b=b.__name__, ), ) + + def _copy_test(self, obj): + # Test internal copy + obj_copy = obj.copy() + self.assertIsNot(obj.data, obj_copy.data) + self.assertEqual(obj.data, obj_copy.data) + + # Test copy.copy + obj.test = [1234] # Make sure instance vars are also copied. + obj_copy = copy.copy(obj) + self.assertIsNot(obj.data, obj_copy.data) + self.assertEqual(obj.data, obj_copy.data) + self.assertIs(obj.test, obj_copy.test) + def test_str_protocol(self): self._superset_test(UserString, str) @@ -47,6 +61,16 @@ def test_list_protocol(self): def test_dict_protocol(self): self._superset_test(UserDict, dict) + def test_list_copy(self): + obj = UserList() + obj.append(123) + self._copy_test(obj) + + def test_dict_copy(self): + obj = UserDict() + obj[123] = "abc" + self._copy_test(obj) + ################################################################################ ### ChainMap (helper class for configparser and the string module) diff --git a/Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst b/Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst new file mode 100644 index 000000000000..76c2abbf82d6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst @@ -0,0 +1,3 @@ +Added a ``__copy__()`` to ``collections.UserList`` and +``collections.UserDict`` in order to correctly implement shallow copying of +the objects. Patch by Bar Harel. From webhook-mailer at python.org Sun May 19 11:56:31 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Sun, 19 May 2019 15:56:31 -0000 Subject: [Python-checkins] bpo-29183: Fix double exceptions in wsgiref.handlers.BaseHandler (GH-12914) Message-ID: https://github.com/python/cpython/commit/7c59362a15dfce538512ff1fce4e07d33a925cfb commit: 7c59362a15dfce538512ff1fce4e07d33a925cfb branch: master author: Berker Peksag committer: GitHub date: 2019-05-19T18:56:15+03:00 summary: bpo-29183: Fix double exceptions in wsgiref.handlers.BaseHandler (GH-12914) files: A Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst M Lib/test/test_wsgiref.py M Lib/wsgiref/handlers.py diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index 46f88a94434b..42432bfbd260 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -806,6 +806,31 @@ def write(self, b): self.assertFalse(stderr.getvalue()) + def testDontResetInternalStateOnException(self): + class CustomException(ValueError): + pass + + # We are raising CustomException here to trigger an exception + # during the execution of SimpleHandler.finish_response(), so + # we can easily test that the internal state of the handler is + # preserved in case of an exception. + class AbortingWriter: + def write(self, b): + raise CustomException + + stderr = StringIO() + environ = {"SERVER_PROTOCOL": "HTTP/1.0"} + h = SimpleHandler(BytesIO(), AbortingWriter(), stderr, environ) + h.run(hello_app) + + self.assertIn("CustomException", stderr.getvalue()) + + # Test that the internal state of the handler is preserved. + self.assertIsNotNone(h.result) + self.assertIsNotNone(h.headers) + self.assertIsNotNone(h.status) + self.assertIsNotNone(h.environ) + if __name__ == "__main__": unittest.main() diff --git a/Lib/wsgiref/handlers.py b/Lib/wsgiref/handlers.py index 834073d50091..31360e58785a 100644 --- a/Lib/wsgiref/handlers.py +++ b/Lib/wsgiref/handlers.py @@ -183,7 +183,16 @@ def finish_response(self): for data in self.result: self.write(data) self.finish_content() - finally: + except: + # Call close() on the iterable returned by the WSGI application + # in case of an exception. + if hasattr(self.result, 'close'): + self.result.close() + raise + else: + # We only call close() when no exception is raised, because it + # will set status, result, headers, and environ fields to None. + # See bpo-29183 for more details. self.close() diff --git a/Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst b/Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst new file mode 100644 index 000000000000..1d19f191eede --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst @@ -0,0 +1,3 @@ +Fix double exceptions in :class:`wsgiref.handlers.BaseHandler` by calling +its :meth:`~wsgiref.handlers.BaseHandler.close` method only when no +exception is raised. From webhook-mailer at python.org Sun May 19 12:28:42 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Sun, 19 May 2019 16:28:42 -0000 Subject: [Python-checkins] bpo-29183: Fix double exceptions in wsgiref.handlers.BaseHandler (GH-12914) Message-ID: https://github.com/python/cpython/commit/f393e8eb463d60ce559982613429568c518ab8d9 commit: f393e8eb463d60ce559982613429568c518ab8d9 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Berker Peksag date: 2019-05-19T19:28:38+03:00 summary: bpo-29183: Fix double exceptions in wsgiref.handlers.BaseHandler (GH-12914) (cherry picked from commit 7c59362a15dfce538512ff1fce4e07d33a925cfb) Co-authored-by: Berker Peksag files: A Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst M Lib/test/test_wsgiref.py M Lib/wsgiref/handlers.py diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index 5502ece576f4..7650e1392c57 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -798,6 +798,31 @@ def write(self, b): self.assertFalse(stderr.getvalue()) + def testDontResetInternalStateOnException(self): + class CustomException(ValueError): + pass + + # We are raising CustomException here to trigger an exception + # during the execution of SimpleHandler.finish_response(), so + # we can easily test that the internal state of the handler is + # preserved in case of an exception. + class AbortingWriter: + def write(self, b): + raise CustomException + + stderr = StringIO() + environ = {"SERVER_PROTOCOL": "HTTP/1.0"} + h = SimpleHandler(BytesIO(), AbortingWriter(), stderr, environ) + h.run(hello_app) + + self.assertIn("CustomException", stderr.getvalue()) + + # Test that the internal state of the handler is preserved. + self.assertIsNotNone(h.result) + self.assertIsNotNone(h.headers) + self.assertIsNotNone(h.status) + self.assertIsNotNone(h.environ) + if __name__ == "__main__": unittest.main() diff --git a/Lib/wsgiref/handlers.py b/Lib/wsgiref/handlers.py index f04cef9b9d06..eee3f948c723 100644 --- a/Lib/wsgiref/handlers.py +++ b/Lib/wsgiref/handlers.py @@ -183,7 +183,16 @@ def finish_response(self): for data in self.result: self.write(data) self.finish_content() - finally: + except: + # Call close() on the iterable returned by the WSGI application + # in case of an exception. + if hasattr(self.result, 'close'): + self.result.close() + raise + else: + # We only call close() when no exception is raised, because it + # will set status, result, headers, and environ fields to None. + # See bpo-29183 for more details. self.close() diff --git a/Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst b/Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst new file mode 100644 index 000000000000..1d19f191eede --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst @@ -0,0 +1,3 @@ +Fix double exceptions in :class:`wsgiref.handlers.BaseHandler` by calling +its :meth:`~wsgiref.handlers.BaseHandler.close` method only when no +exception is raised. From webhook-mailer at python.org Sun May 19 12:52:00 2019 From: webhook-mailer at python.org (Mark Dickinson) Date: Sun, 19 May 2019 16:52:00 -0000 Subject: [Python-checkins] bpo-36957: Speed up math.isqrt (#13405) Message-ID: https://github.com/python/cpython/commit/5c08ce9bf712acbb3f05a3a57baf51fcb534cdf0 commit: 5c08ce9bf712acbb3f05a3a57baf51fcb534cdf0 branch: master author: Mark Dickinson committer: GitHub date: 2019-05-19T17:51:56+01:00 summary: bpo-36957: Speed up math.isqrt (#13405) * Add math.isqrt function computing the integer square root. * Code cleanup: remove redundant comments, rename some variables. * Tighten up code a bit more; use Py_XDECREF to simplify error handling. * Update Modules/mathmodule.c Co-Authored-By: Serhiy Storchaka * Update Modules/mathmodule.c Use real argument clinic type instead of an alias Co-Authored-By: Serhiy Storchaka * Add proof sketch * Updates from review. * Correct and expand documentation. * Fix bad reference handling on error; make some variables block-local; other tidying. * Style and consistency fixes. * Add missing error check; don't try to DECREF a NULL a * Simplify some error returns. * Another two test cases: - clarify that floats are rejected even if they happen to be squares of small integers - TypeError beats ValueError for a negative float * Add fast path for small inputs. Needs tests. * Speed up isqrt for n >= 2**64 as well; add extra tests. * Reduce number of test-cases to avoid dominating the run-time of test_math. * Don't perform unnecessary extra iterations when computing c_bit_length. * Abstract common uint64_t code out into a separate function. * Cleanup. * Add a missing Py_DECREF in an error branch. More cleanup. * Update Modules/mathmodule.c Add missing `static` declaration to helper function. Co-Authored-By: Serhiy Storchaka * Add missing backtick. files: M Lib/test/test_math.py M Modules/mathmodule.c diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index a11a34478564..853a0e62f823 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -917,6 +917,7 @@ def testIsqrt(self): test_values = ( list(range(1000)) + list(range(10**6 - 1000, 10**6 + 1000)) + + [2**e + i for e in range(60, 200) for i in range(-40, 40)] + [3**9999, 10**5001] ) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 7a0044a9fcf0..a153e984ca59 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1620,6 +1620,22 @@ completes the proof sketch. */ + +/* Approximate square root of a large 64-bit integer. + + Given `n` satisfying `2**62 <= n < 2**64`, return `a` + satisfying `(a - 1)**2 < n < (a + 1)**2`. */ + +static uint64_t +_approximate_isqrt(uint64_t n) +{ + uint32_t u = 1U + (n >> 62); + u = (u << 1) + (n >> 59) / u; + u = (u << 3) + (n >> 53) / u; + u = (u << 7) + (n >> 41) / u; + return (u << 15) + (n >> 17) / u; +} + /*[clinic input] math.isqrt @@ -1633,8 +1649,9 @@ static PyObject * math_isqrt(PyObject *module, PyObject *n) /*[clinic end generated code: output=35a6f7f980beab26 input=5b6e7ae4fa6c43d6]*/ { - int a_too_large, s; + int a_too_large, c_bit_length; size_t c, d; + uint64_t m, u; PyObject *a = NULL, *b; n = PyNumber_Index(n); @@ -1653,24 +1670,55 @@ math_isqrt(PyObject *module, PyObject *n) return PyLong_FromLong(0); } + /* c = (n.bit_length() - 1) // 2 */ c = _PyLong_NumBits(n); if (c == (size_t)(-1)) { goto error; } c = (c - 1U) / 2U; - /* s = c.bit_length() */ - s = 0; - while ((c >> s) > 0) { - ++s; + /* Fast path: if c <= 31 then n < 2**64 and we can compute directly with a + fast, almost branch-free algorithm. In the final correction, we use `u*u + - 1 >= m` instead of the simpler `u*u > m` in order to get the correct + result in the corner case where `u=2**32`. */ + if (c <= 31U) { + m = (uint64_t)PyLong_AsUnsignedLongLong(n); + Py_DECREF(n); + if (m == (uint64_t)(-1) && PyErr_Occurred()) { + return NULL; + } + u = _approximate_isqrt(m << (62U - 2U*c)) >> (31U - c); + u -= u * u - 1U >= m; + return PyLong_FromUnsignedLongLong((unsigned long long)u); } - a = PyLong_FromLong(1); + /* Slow path: n >= 2**64. We perform the first five iterations in C integer + arithmetic, then switch to using Python long integers. */ + + /* From n >= 2**64 it follows that c.bit_length() >= 6. */ + c_bit_length = 6; + while ((c >> c_bit_length) > 0U) { + ++c_bit_length; + } + + /* Initialise d and a. */ + d = c >> (c_bit_length - 5); + b = _PyLong_Rshift(n, 2U*c - 62U); + if (b == NULL) { + goto error; + } + m = (uint64_t)PyLong_AsUnsignedLongLong(b); + Py_DECREF(b); + if (m == (uint64_t)(-1) && PyErr_Occurred()) { + goto error; + } + u = _approximate_isqrt(m) >> (31U - d); + a = PyLong_FromUnsignedLongLong((unsigned long long)u); if (a == NULL) { goto error; } - d = 0; - while (--s >= 0) { + + for (int s = c_bit_length - 6; s >= 0; --s) { PyObject *q; size_t e = d; From webhook-mailer at python.org Sun May 19 17:52:24 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Sun, 19 May 2019 21:52:24 -0000 Subject: [Python-checkins] bpo-34580: Update sqlite3 examples to call close() explicitly (GH-9079) Message-ID: https://github.com/python/cpython/commit/287b84de939db47aa8c6f30734ceb8aba9d1db29 commit: 287b84de939db47aa8c6f30734ceb8aba9d1db29 branch: master author: Xtreak committer: Berker Peksag date: 2019-05-20T00:52:20+03:00 summary: bpo-34580: Update sqlite3 examples to call close() explicitly (GH-9079) The sqlit3.Connection object doesn't call its close() method when it's used as a context manager. files: D Doc/includes/sqlite3/connect_db_1.py D Doc/includes/sqlite3/connect_db_2.py D Doc/includes/sqlite3/execute_3.py M Doc/includes/sqlite3/adapter_datetime.py M Doc/includes/sqlite3/adapter_point_1.py M Doc/includes/sqlite3/adapter_point_2.py M Doc/includes/sqlite3/countcursors.py M Doc/includes/sqlite3/ctx_manager.py M Doc/includes/sqlite3/execsql_fetchonerow.py M Doc/includes/sqlite3/execsql_printall_1.py M Doc/includes/sqlite3/execute_1.py M Doc/includes/sqlite3/executemany_1.py M Doc/includes/sqlite3/executemany_2.py M Doc/includes/sqlite3/executescript.py M Doc/includes/sqlite3/insert_more_people.py M Doc/includes/sqlite3/load_extension.py M Doc/includes/sqlite3/md5func.py M Doc/includes/sqlite3/mysumaggr.py M Doc/includes/sqlite3/parse_colnames.py M Doc/includes/sqlite3/pysqlite_datetime.py M Doc/includes/sqlite3/row_factory.py M Doc/includes/sqlite3/rowclass.py M Doc/includes/sqlite3/shortcut_methods.py M Doc/includes/sqlite3/simple_tableprinter.py M Doc/includes/sqlite3/text_factory.py M Doc/library/sqlite3.rst diff --git a/Doc/includes/sqlite3/adapter_datetime.py b/Doc/includes/sqlite3/adapter_datetime.py index be33395100c3..d5221d80c35c 100644 --- a/Doc/includes/sqlite3/adapter_datetime.py +++ b/Doc/includes/sqlite3/adapter_datetime.py @@ -13,3 +13,5 @@ def adapt_datetime(ts): now = datetime.datetime.now() cur.execute("select ?", (now,)) print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/adapter_point_1.py b/Doc/includes/sqlite3/adapter_point_1.py index 6b1af8415648..77daf8f16d22 100644 --- a/Doc/includes/sqlite3/adapter_point_1.py +++ b/Doc/includes/sqlite3/adapter_point_1.py @@ -14,3 +14,5 @@ def __conform__(self, protocol): p = Point(4.0, -3.2) cur.execute("select ?", (p,)) print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/adapter_point_2.py b/Doc/includes/sqlite3/adapter_point_2.py index d670700f0491..cb86331692b6 100644 --- a/Doc/includes/sqlite3/adapter_point_2.py +++ b/Doc/includes/sqlite3/adapter_point_2.py @@ -15,3 +15,5 @@ def adapt_point(point): p = Point(4.0, -3.2) cur.execute("select ?", (p,)) print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/connect_db_1.py b/Doc/includes/sqlite3/connect_db_1.py deleted file mode 100644 index 1b975232865a..000000000000 --- a/Doc/includes/sqlite3/connect_db_1.py +++ /dev/null @@ -1,3 +0,0 @@ -import sqlite3 - -con = sqlite3.connect("mydb") diff --git a/Doc/includes/sqlite3/connect_db_2.py b/Doc/includes/sqlite3/connect_db_2.py deleted file mode 100644 index f9728b36135e..000000000000 --- a/Doc/includes/sqlite3/connect_db_2.py +++ /dev/null @@ -1,3 +0,0 @@ -import sqlite3 - -con = sqlite3.connect(":memory:") diff --git a/Doc/includes/sqlite3/countcursors.py b/Doc/includes/sqlite3/countcursors.py index ef3e70a2a9cf..112f47703a2f 100644 --- a/Doc/includes/sqlite3/countcursors.py +++ b/Doc/includes/sqlite3/countcursors.py @@ -13,3 +13,5 @@ def cursor(self, *args, **kwargs): cur1 = con.cursor() cur2 = con.cursor() print(con.numcursors) + +con.close() diff --git a/Doc/includes/sqlite3/ctx_manager.py b/Doc/includes/sqlite3/ctx_manager.py index 7af4ad1ecfbc..6db77d45046e 100644 --- a/Doc/includes/sqlite3/ctx_manager.py +++ b/Doc/includes/sqlite3/ctx_manager.py @@ -14,3 +14,7 @@ con.execute("insert into person(firstname) values (?)", ("Joe",)) except sqlite3.IntegrityError: print("couldn't add Joe twice") + +# Connection object used as context manager only commits or rollbacks transactions, +# so the connection object should be closed manually +con.close() diff --git a/Doc/includes/sqlite3/execsql_fetchonerow.py b/Doc/includes/sqlite3/execsql_fetchonerow.py index 078873bfc979..115bcb50c7c7 100644 --- a/Doc/includes/sqlite3/execsql_fetchonerow.py +++ b/Doc/includes/sqlite3/execsql_fetchonerow.py @@ -15,3 +15,5 @@ cur.execute(SELECT) for row in cur: print('%s is %d years old.' % (row[0], row[1])) + +con.close() diff --git a/Doc/includes/sqlite3/execsql_printall_1.py b/Doc/includes/sqlite3/execsql_printall_1.py index a4ce5c528149..19306e6e3ca7 100644 --- a/Doc/includes/sqlite3/execsql_printall_1.py +++ b/Doc/includes/sqlite3/execsql_printall_1.py @@ -11,3 +11,5 @@ # Retrieve all rows as a sequence and print that sequence: print(cur.fetchall()) + +con.close() diff --git a/Doc/includes/sqlite3/execute_1.py b/Doc/includes/sqlite3/execute_1.py index f864a8984e4e..3466b1265a5b 100644 --- a/Doc/includes/sqlite3/execute_1.py +++ b/Doc/includes/sqlite3/execute_1.py @@ -14,3 +14,5 @@ cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age}) print(cur.fetchone()) + +con.close() diff --git a/Doc/includes/sqlite3/execute_3.py b/Doc/includes/sqlite3/execute_3.py deleted file mode 100644 index 0353683fc704..000000000000 --- a/Doc/includes/sqlite3/execute_3.py +++ /dev/null @@ -1,12 +0,0 @@ -import sqlite3 - -con = sqlite3.connect("mydb") - -cur = con.cursor() - -who = "Yeltsin" -age = 72 - -cur.execute("select name_last, age from people where name_last=:who and age=:age", - locals()) -print(cur.fetchone()) diff --git a/Doc/includes/sqlite3/executemany_1.py b/Doc/includes/sqlite3/executemany_1.py index efae10637c7e..edf6f8b7ebe6 100644 --- a/Doc/includes/sqlite3/executemany_1.py +++ b/Doc/includes/sqlite3/executemany_1.py @@ -22,3 +22,5 @@ def __next__(self): cur.execute("select c from characters") print(cur.fetchall()) + +con.close() diff --git a/Doc/includes/sqlite3/executemany_2.py b/Doc/includes/sqlite3/executemany_2.py index 527358ebc28e..02a594c861e1 100644 --- a/Doc/includes/sqlite3/executemany_2.py +++ b/Doc/includes/sqlite3/executemany_2.py @@ -13,3 +13,5 @@ def char_generator(): cur.execute("select c from characters") print(cur.fetchall()) + +con.close() diff --git a/Doc/includes/sqlite3/executescript.py b/Doc/includes/sqlite3/executescript.py index 7e5358178d4c..aea8943fbee5 100644 --- a/Doc/includes/sqlite3/executescript.py +++ b/Doc/includes/sqlite3/executescript.py @@ -22,3 +22,4 @@ 1987 ); """) +con.close() diff --git a/Doc/includes/sqlite3/insert_more_people.py b/Doc/includes/sqlite3/insert_more_people.py index edbc79e7e5b6..10cf937243f6 100644 --- a/Doc/includes/sqlite3/insert_more_people.py +++ b/Doc/includes/sqlite3/insert_more_people.py @@ -14,3 +14,5 @@ # The changes will not be saved unless the transaction is committed explicitly: con.commit() + +con.close() diff --git a/Doc/includes/sqlite3/load_extension.py b/Doc/includes/sqlite3/load_extension.py index b997c70668ac..624cfe262f38 100644 --- a/Doc/includes/sqlite3/load_extension.py +++ b/Doc/includes/sqlite3/load_extension.py @@ -24,3 +24,5 @@ """) for row in con.execute("select rowid, name, ingredients from recipe where name match 'pie'"): print(row) + +con.close() diff --git a/Doc/includes/sqlite3/md5func.py b/Doc/includes/sqlite3/md5func.py index 0056b2d6ce84..16dc348bf001 100644 --- a/Doc/includes/sqlite3/md5func.py +++ b/Doc/includes/sqlite3/md5func.py @@ -9,3 +9,5 @@ def md5sum(t): cur = con.cursor() cur.execute("select md5(?)", (b"foo",)) print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/mysumaggr.py b/Doc/includes/sqlite3/mysumaggr.py index d2dfd2c0b98d..11f96395b6c4 100644 --- a/Doc/includes/sqlite3/mysumaggr.py +++ b/Doc/includes/sqlite3/mysumaggr.py @@ -18,3 +18,5 @@ def finalize(self): cur.execute("insert into test(i) values (2)") cur.execute("select mysum(i) from test") print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/parse_colnames.py b/Doc/includes/sqlite3/parse_colnames.py index cc68c76459ec..5f01dbfe1cb5 100644 --- a/Doc/includes/sqlite3/parse_colnames.py +++ b/Doc/includes/sqlite3/parse_colnames.py @@ -6,3 +6,5 @@ cur.execute('select ? as "x [timestamp]"', (datetime.datetime.now(),)) dt = cur.fetchone()[0] print(dt, type(dt)) + +con.close() diff --git a/Doc/includes/sqlite3/pysqlite_datetime.py b/Doc/includes/sqlite3/pysqlite_datetime.py index 68d49358a578..5d843f906b30 100644 --- a/Doc/includes/sqlite3/pysqlite_datetime.py +++ b/Doc/includes/sqlite3/pysqlite_datetime.py @@ -18,3 +18,5 @@ row = cur.fetchone() print("current_date", row[0], type(row[0])) print("current_timestamp", row[1], type(row[1])) + +con.close() diff --git a/Doc/includes/sqlite3/row_factory.py b/Doc/includes/sqlite3/row_factory.py index e436ffc6c802..9de6e7b1b905 100644 --- a/Doc/includes/sqlite3/row_factory.py +++ b/Doc/includes/sqlite3/row_factory.py @@ -11,3 +11,5 @@ def dict_factory(cursor, row): cur = con.cursor() cur.execute("select 1 as a") print(cur.fetchone()["a"]) + +con.close() diff --git a/Doc/includes/sqlite3/rowclass.py b/Doc/includes/sqlite3/rowclass.py index 92b5ad60cb57..fc60287069a8 100644 --- a/Doc/includes/sqlite3/rowclass.py +++ b/Doc/includes/sqlite3/rowclass.py @@ -10,3 +10,5 @@ assert row["name"] == row["nAmE"] assert row[1] == row["age"] assert row[1] == row["AgE"] + +con.close() diff --git a/Doc/includes/sqlite3/shortcut_methods.py b/Doc/includes/sqlite3/shortcut_methods.py index 71600d4f60c5..98a39411495c 100644 --- a/Doc/includes/sqlite3/shortcut_methods.py +++ b/Doc/includes/sqlite3/shortcut_methods.py @@ -18,3 +18,7 @@ print(row) print("I just deleted", con.execute("delete from person").rowcount, "rows") + +# close is not a shortcut method and it's not called automatically, +# so the connection object should be closed manually +con.close() diff --git a/Doc/includes/sqlite3/simple_tableprinter.py b/Doc/includes/sqlite3/simple_tableprinter.py index 231d8726cd43..148a1707f948 100644 --- a/Doc/includes/sqlite3/simple_tableprinter.py +++ b/Doc/includes/sqlite3/simple_tableprinter.py @@ -24,3 +24,5 @@ print(fieldValue.ljust(FIELD_MAX_WIDTH), end=' ') print() # Finish the row with a newline. + +con.close() diff --git a/Doc/includes/sqlite3/text_factory.py b/Doc/includes/sqlite3/text_factory.py index 5f96cdb58da1..a857a155cdd4 100644 --- a/Doc/includes/sqlite3/text_factory.py +++ b/Doc/includes/sqlite3/text_factory.py @@ -25,3 +25,5 @@ cur.execute("select ?", ("bar",)) row = cur.fetchone() assert row[0] == "barfoo" + +con.close() diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 37087ac5af49..20fca54aab14 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -537,6 +537,7 @@ Connection Objects with open('dump.sql', 'w') as f: for line in con.iterdump(): f.write('%s\n' % line) + con.close() .. method:: backup(target, *, pages=0, progress=None, name="main", sleep=0.250) @@ -573,8 +574,11 @@ Connection Objects print(f'Copied {total-remaining} of {total} pages...') con = sqlite3.connect('existing_db.db') - with sqlite3.connect('backup.db') as bck: + bck = sqlite3.connect('backup.db') + with bck: con.backup(bck, pages=1, progress=progress) + bck.close() + con.close() Example 2, copy an existing database into a transient copy:: From webhook-mailer at python.org Sun May 19 18:11:25 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Sun, 19 May 2019 22:11:25 -0000 Subject: [Python-checkins] bpo-35252: Remove FIXME from test_functools (GH-10551) Message-ID: https://github.com/python/cpython/commit/d673810b9d9df6fbd29f5b7db3973d5adae10fd3 commit: d673810b9d9df6fbd29f5b7db3973d5adae10fd3 branch: master author: Lysandros Nikolaou committer: ?ukasz Langa date: 2019-05-19T15:11:20-07:00 summary: bpo-35252: Remove FIXME from test_functools (GH-10551) files: A Misc/NEWS.d/next/Library/2019-04-02-19-23-12.bpo-35252.VooTVv.rst M Lib/functools.py M Lib/test/test_functools.py diff --git a/Lib/functools.py b/Lib/functools.py index 28d9f6f75fdb..c863341eec5f 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -861,9 +861,11 @@ def register(cls, func=None): # only import typing if annotation parsing is necessary from typing import get_type_hints argname, cls = next(iter(get_type_hints(func).items())) - assert isinstance(cls, type), ( - f"Invalid annotation for {argname!r}. {cls!r} is not a class." - ) + if not isinstance(cls, type): + raise TypeError( + f"Invalid annotation for {argname!r}. " + f"{cls!r} is not a class." + ) registry[cls] = func if cache_token is None and hasattr(cls, '__abstractmethods__'): cache_token = get_cache_token() diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 85c65d183260..b89d77967a0d 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -2355,9 +2355,6 @@ def _(arg): )) self.assertTrue(str(exc.exception).endswith(msg_suffix)) - # FIXME: The following will only work after PEP 560 is implemented. - return - with self.assertRaises(TypeError) as exc: @i.register def _(arg: typing.Iterable[str]): @@ -2366,10 +2363,12 @@ def _(arg: typing.Iterable[str]): # types from `typing`. Instead, annotate with regular types # or ABCs. return "I annotated with a generic collection" - self.assertTrue(str(exc.exception).startswith(msg_prefix + - "._" + self.assertTrue(str(exc.exception).startswith( + "Invalid annotation for 'arg'." + )) + self.assertTrue(str(exc.exception).endswith( + 'typing.Iterable[str] is not a class.' )) - self.assertTrue(str(exc.exception).endswith(msg_suffix)) def test_invalid_positional_argument(self): @functools.singledispatch diff --git a/Misc/NEWS.d/next/Library/2019-04-02-19-23-12.bpo-35252.VooTVv.rst b/Misc/NEWS.d/next/Library/2019-04-02-19-23-12.bpo-35252.VooTVv.rst new file mode 100644 index 000000000000..c8f3e7d5f5fb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-02-19-23-12.bpo-35252.VooTVv.rst @@ -0,0 +1 @@ +Throw a TypeError instead of an AssertionError when using an invalid type annotation with singledispatch. From webhook-mailer at python.org Sun May 19 18:15:01 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sun, 19 May 2019 22:15:01 -0000 Subject: [Python-checkins] bpo-35134: Split traceback.h header (GH-13430) Message-ID: https://github.com/python/cpython/commit/ed48866c55b8e4ee14faa8b5ad97819e8e74c98b commit: ed48866c55b8e4ee14faa8b5ad97819e8e74c98b branch: master author: Victor Stinner committer: GitHub date: 2019-05-20T00:14:57+02:00 summary: bpo-35134: Split traceback.h header (GH-13430) Add new Include/cpython/traceback.h and Include/internal/traceback.h header files. files: A Include/cpython/traceback.h A Include/internal/pycore_traceback.h M Include/frameobject.h M Include/genobject.h M Include/traceback.h M Modules/_tracemalloc.c M Modules/faulthandler.c M Python/pylifecycle.c diff --git a/Include/cpython/traceback.h b/Include/cpython/traceback.h new file mode 100644 index 000000000000..746097daaf94 --- /dev/null +++ b/Include/cpython/traceback.h @@ -0,0 +1,22 @@ +#ifndef Py_CPYTHON_TRACEBACK_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _traceback { + PyObject_HEAD + struct _traceback *tb_next; + struct _frame *tb_frame; + int tb_lasti; + int tb_lineno; +} PyTracebackObject; + +PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int); +PyAPI_FUNC(void) _PyTraceback_Add(const char *, const char *, int); + +#ifdef __cplusplus +} +#endif diff --git a/Include/frameobject.h b/Include/frameobject.h index a95baf8867a3..3bad86a66f75 100644 --- a/Include/frameobject.h +++ b/Include/frameobject.h @@ -1,4 +1,3 @@ - /* Frame object interface */ #ifndef Py_LIMITED_API diff --git a/Include/genobject.h b/Include/genobject.h index 16b983339cc6..6755963f332f 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -8,6 +8,8 @@ extern "C" { #endif +#include "pystate.h" /* _PyErr_StackItem */ + struct _frame; /* Avoid including frameobject.h */ /* _PyGenObject_HEAD defines the initial segment of generator diff --git a/Include/internal/pycore_traceback.h b/Include/internal/pycore_traceback.h new file mode 100644 index 000000000000..a96199bda5f9 --- /dev/null +++ b/Include/internal/pycore_traceback.h @@ -0,0 +1,92 @@ +#ifndef Py_INTERNAL_TRACEBACK_H +#define Py_INTERNAL_TRACEBACK_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pystate.h" /* PyInterpreterState */ + +/* Write the Python traceback into the file 'fd'. For example: + + Traceback (most recent call first): + File "xxx", line xxx in + File "xxx", line xxx in + ... + File "xxx", line xxx in + + This function is written for debug purpose only, to dump the traceback in + the worst case: after a segmentation fault, at fatal error, etc. That's why, + it is very limited. Strings are truncated to 100 characters and encoded to + ASCII with backslashreplace. It doesn't write the source code, only the + function name, filename and line number of each frame. Write only the first + 100 frames: if the traceback is truncated, write the line " ...". + + This function is signal safe. */ + +PyAPI_FUNC(void) _Py_DumpTraceback( + int fd, + PyThreadState *tstate); + +/* Write the traceback of all threads into the file 'fd'. current_thread can be + NULL. + + Return NULL on success, or an error message on error. + + This function is written for debug purpose only. It calls + _Py_DumpTraceback() for each thread, and so has the same limitations. It + only write the traceback of the first 100 threads: write "..." if there are + more threads. + + If current_tstate is NULL, the function tries to get the Python thread state + of the current thread. It is not an error if the function is unable to get + the current Python thread state. + + If interp is NULL, the function tries to get the interpreter state from + the current Python thread state, or from + _PyGILState_GetInterpreterStateUnsafe() in last resort. + + It is better to pass NULL to interp and current_tstate, the function tries + different options to retrieve these informations. + + This function is signal safe. */ + +PyAPI_FUNC(const char*) _Py_DumpTracebackThreads( + int fd, + PyInterpreterState *interp, + PyThreadState *current_tstate); + +/* Write a Unicode object into the file descriptor fd. Encode the string to + ASCII using the backslashreplace error handler. + + Do nothing if text is not a Unicode object. The function accepts Unicode + string which is not ready (PyUnicode_WCHAR_KIND). + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpASCII(int fd, PyObject *text); + +/* Format an integer as decimal into the file descriptor fd. + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpDecimal( + int fd, + unsigned long value); + +/* Format an integer as hexadecimal into the file descriptor fd with at least + width digits. + + The maximum width is sizeof(unsigned long)*2 digits. + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpHexadecimal( + int fd, + unsigned long value, + Py_ssize_t width); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_TRACEBACK_H */ diff --git a/Include/traceback.h b/Include/traceback.h index b5874100f477..b451927fafa3 100644 --- a/Include/traceback.h +++ b/Include/traceback.h @@ -1,117 +1,26 @@ - #ifndef Py_TRACEBACK_H #define Py_TRACEBACK_H #ifdef __cplusplus extern "C" { #endif -#include "pystate.h" - struct _frame; /* Traceback interface */ -#ifndef Py_LIMITED_API -typedef struct _traceback { - PyObject_HEAD - struct _traceback *tb_next; - struct _frame *tb_frame; - int tb_lasti; - int tb_lineno; -} PyTracebackObject; -#endif PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int); -PyAPI_FUNC(void) _PyTraceback_Add(const char *, const char *, int); -#endif /* Reveal traceback type so we can typecheck traceback objects */ PyAPI_DATA(PyTypeObject) PyTraceBack_Type; #define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type) -#ifndef Py_LIMITED_API -/* Write the Python traceback into the file 'fd'. For example: - - Traceback (most recent call first): - File "xxx", line xxx in - File "xxx", line xxx in - ... - File "xxx", line xxx in - - This function is written for debug purpose only, to dump the traceback in - the worst case: after a segmentation fault, at fatal error, etc. That's why, - it is very limited. Strings are truncated to 100 characters and encoded to - ASCII with backslashreplace. It doesn't write the source code, only the - function name, filename and line number of each frame. Write only the first - 100 frames: if the traceback is truncated, write the line " ...". - - This function is signal safe. */ - -PyAPI_FUNC(void) _Py_DumpTraceback( - int fd, - PyThreadState *tstate); - -/* Write the traceback of all threads into the file 'fd'. current_thread can be - NULL. - - Return NULL on success, or an error message on error. - - This function is written for debug purpose only. It calls - _Py_DumpTraceback() for each thread, and so has the same limitations. It - only write the traceback of the first 100 threads: write "..." if there are - more threads. - - If current_tstate is NULL, the function tries to get the Python thread state - of the current thread. It is not an error if the function is unable to get - the current Python thread state. - - If interp is NULL, the function tries to get the interpreter state from - the current Python thread state, or from - _PyGILState_GetInterpreterStateUnsafe() in last resort. - - It is better to pass NULL to interp and current_tstate, the function tries - different options to retrieve these informations. - - This function is signal safe. */ - -PyAPI_FUNC(const char*) _Py_DumpTracebackThreads( - int fd, - PyInterpreterState *interp, - PyThreadState *current_tstate); -#endif /* !Py_LIMITED_API */ #ifndef Py_LIMITED_API - -/* Write a Unicode object into the file descriptor fd. Encode the string to - ASCII using the backslashreplace error handler. - - Do nothing if text is not a Unicode object. The function accepts Unicode - string which is not ready (PyUnicode_WCHAR_KIND). - - This function is signal safe. */ -PyAPI_FUNC(void) _Py_DumpASCII(int fd, PyObject *text); - -/* Format an integer as decimal into the file descriptor fd. - - This function is signal safe. */ -PyAPI_FUNC(void) _Py_DumpDecimal( - int fd, - unsigned long value); - -/* Format an integer as hexadecimal into the file descriptor fd with at least - width digits. - - The maximum width is sizeof(unsigned long)*2 digits. - - This function is signal safe. */ -PyAPI_FUNC(void) _Py_DumpHexadecimal( - int fd, - unsigned long value, - Py_ssize_t width); - -#endif /* !Py_LIMITED_API */ +# define Py_CPYTHON_TRACEBACK_H +# include "cpython/traceback.h" +# undef Py_CPYTHON_TRACEBACK_H +#endif #ifdef __cplusplus } diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c index c5d5671032eb..ee32ac29b7ee 100644 --- a/Modules/_tracemalloc.c +++ b/Modules/_tracemalloc.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_traceback.h" #include "hashtable.h" #include "frameobject.h" #include "pythread.h" diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 2083a03198fe..aa466c46ccff 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1,5 +1,6 @@ #include "Python.h" #include "pycore_coreconfig.h" +#include "pycore_traceback.h" #include "pythread.h" #include #include diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index d29b293b79eb..0781dc8046b1 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -13,6 +13,7 @@ #include "pycore_pylifecycle.h" #include "pycore_pymem.h" #include "pycore_pystate.h" +#include "pycore_traceback.h" #include "grammar.h" #include "node.h" #include "token.h" From webhook-mailer at python.org Sun May 19 18:36:52 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Sun, 19 May 2019 22:36:52 -0000 Subject: [Python-checkins] bpo-34580: Update sqlite3 examples to call close() explicitly (GH-9079) Message-ID: https://github.com/python/cpython/commit/205c1f0e36e00e6e7cb7fbabaab4f52732859f9e commit: 205c1f0e36e00e6e7cb7fbabaab4f52732859f9e branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Berker Peksag date: 2019-05-20T01:36:32+03:00 summary: bpo-34580: Update sqlite3 examples to call close() explicitly (GH-9079) The sqlite3.Connection object doesn't call its close() method when it's used as a context manager. (cherry picked from commit 287b84de939db47aa8c6f30734ceb8aba9d1db29) Co-authored-by: Xtreak files: D Doc/includes/sqlite3/connect_db_1.py D Doc/includes/sqlite3/connect_db_2.py D Doc/includes/sqlite3/execute_3.py M Doc/includes/sqlite3/adapter_datetime.py M Doc/includes/sqlite3/adapter_point_1.py M Doc/includes/sqlite3/adapter_point_2.py M Doc/includes/sqlite3/countcursors.py M Doc/includes/sqlite3/ctx_manager.py M Doc/includes/sqlite3/execsql_fetchonerow.py M Doc/includes/sqlite3/execsql_printall_1.py M Doc/includes/sqlite3/execute_1.py M Doc/includes/sqlite3/executemany_1.py M Doc/includes/sqlite3/executemany_2.py M Doc/includes/sqlite3/executescript.py M Doc/includes/sqlite3/insert_more_people.py M Doc/includes/sqlite3/load_extension.py M Doc/includes/sqlite3/md5func.py M Doc/includes/sqlite3/mysumaggr.py M Doc/includes/sqlite3/parse_colnames.py M Doc/includes/sqlite3/pysqlite_datetime.py M Doc/includes/sqlite3/row_factory.py M Doc/includes/sqlite3/rowclass.py M Doc/includes/sqlite3/shortcut_methods.py M Doc/includes/sqlite3/simple_tableprinter.py M Doc/includes/sqlite3/text_factory.py M Doc/library/sqlite3.rst diff --git a/Doc/includes/sqlite3/adapter_datetime.py b/Doc/includes/sqlite3/adapter_datetime.py index be33395100c3..d5221d80c35c 100644 --- a/Doc/includes/sqlite3/adapter_datetime.py +++ b/Doc/includes/sqlite3/adapter_datetime.py @@ -13,3 +13,5 @@ def adapt_datetime(ts): now = datetime.datetime.now() cur.execute("select ?", (now,)) print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/adapter_point_1.py b/Doc/includes/sqlite3/adapter_point_1.py index 6b1af8415648..77daf8f16d22 100644 --- a/Doc/includes/sqlite3/adapter_point_1.py +++ b/Doc/includes/sqlite3/adapter_point_1.py @@ -14,3 +14,5 @@ def __conform__(self, protocol): p = Point(4.0, -3.2) cur.execute("select ?", (p,)) print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/adapter_point_2.py b/Doc/includes/sqlite3/adapter_point_2.py index d670700f0491..cb86331692b6 100644 --- a/Doc/includes/sqlite3/adapter_point_2.py +++ b/Doc/includes/sqlite3/adapter_point_2.py @@ -15,3 +15,5 @@ def adapt_point(point): p = Point(4.0, -3.2) cur.execute("select ?", (p,)) print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/connect_db_1.py b/Doc/includes/sqlite3/connect_db_1.py deleted file mode 100644 index 1b975232865a..000000000000 --- a/Doc/includes/sqlite3/connect_db_1.py +++ /dev/null @@ -1,3 +0,0 @@ -import sqlite3 - -con = sqlite3.connect("mydb") diff --git a/Doc/includes/sqlite3/connect_db_2.py b/Doc/includes/sqlite3/connect_db_2.py deleted file mode 100644 index f9728b36135e..000000000000 --- a/Doc/includes/sqlite3/connect_db_2.py +++ /dev/null @@ -1,3 +0,0 @@ -import sqlite3 - -con = sqlite3.connect(":memory:") diff --git a/Doc/includes/sqlite3/countcursors.py b/Doc/includes/sqlite3/countcursors.py index ef3e70a2a9cf..112f47703a2f 100644 --- a/Doc/includes/sqlite3/countcursors.py +++ b/Doc/includes/sqlite3/countcursors.py @@ -13,3 +13,5 @@ def cursor(self, *args, **kwargs): cur1 = con.cursor() cur2 = con.cursor() print(con.numcursors) + +con.close() diff --git a/Doc/includes/sqlite3/ctx_manager.py b/Doc/includes/sqlite3/ctx_manager.py index 7af4ad1ecfbc..6db77d45046e 100644 --- a/Doc/includes/sqlite3/ctx_manager.py +++ b/Doc/includes/sqlite3/ctx_manager.py @@ -14,3 +14,7 @@ con.execute("insert into person(firstname) values (?)", ("Joe",)) except sqlite3.IntegrityError: print("couldn't add Joe twice") + +# Connection object used as context manager only commits or rollbacks transactions, +# so the connection object should be closed manually +con.close() diff --git a/Doc/includes/sqlite3/execsql_fetchonerow.py b/Doc/includes/sqlite3/execsql_fetchonerow.py index 078873bfc979..115bcb50c7c7 100644 --- a/Doc/includes/sqlite3/execsql_fetchonerow.py +++ b/Doc/includes/sqlite3/execsql_fetchonerow.py @@ -15,3 +15,5 @@ cur.execute(SELECT) for row in cur: print('%s is %d years old.' % (row[0], row[1])) + +con.close() diff --git a/Doc/includes/sqlite3/execsql_printall_1.py b/Doc/includes/sqlite3/execsql_printall_1.py index a4ce5c528149..19306e6e3ca7 100644 --- a/Doc/includes/sqlite3/execsql_printall_1.py +++ b/Doc/includes/sqlite3/execsql_printall_1.py @@ -11,3 +11,5 @@ # Retrieve all rows as a sequence and print that sequence: print(cur.fetchall()) + +con.close() diff --git a/Doc/includes/sqlite3/execute_1.py b/Doc/includes/sqlite3/execute_1.py index f864a8984e4e..3466b1265a5b 100644 --- a/Doc/includes/sqlite3/execute_1.py +++ b/Doc/includes/sqlite3/execute_1.py @@ -14,3 +14,5 @@ cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age}) print(cur.fetchone()) + +con.close() diff --git a/Doc/includes/sqlite3/execute_3.py b/Doc/includes/sqlite3/execute_3.py deleted file mode 100644 index 0353683fc704..000000000000 --- a/Doc/includes/sqlite3/execute_3.py +++ /dev/null @@ -1,12 +0,0 @@ -import sqlite3 - -con = sqlite3.connect("mydb") - -cur = con.cursor() - -who = "Yeltsin" -age = 72 - -cur.execute("select name_last, age from people where name_last=:who and age=:age", - locals()) -print(cur.fetchone()) diff --git a/Doc/includes/sqlite3/executemany_1.py b/Doc/includes/sqlite3/executemany_1.py index efae10637c7e..edf6f8b7ebe6 100644 --- a/Doc/includes/sqlite3/executemany_1.py +++ b/Doc/includes/sqlite3/executemany_1.py @@ -22,3 +22,5 @@ def __next__(self): cur.execute("select c from characters") print(cur.fetchall()) + +con.close() diff --git a/Doc/includes/sqlite3/executemany_2.py b/Doc/includes/sqlite3/executemany_2.py index 527358ebc28e..02a594c861e1 100644 --- a/Doc/includes/sqlite3/executemany_2.py +++ b/Doc/includes/sqlite3/executemany_2.py @@ -13,3 +13,5 @@ def char_generator(): cur.execute("select c from characters") print(cur.fetchall()) + +con.close() diff --git a/Doc/includes/sqlite3/executescript.py b/Doc/includes/sqlite3/executescript.py index 7e5358178d4c..aea8943fbee5 100644 --- a/Doc/includes/sqlite3/executescript.py +++ b/Doc/includes/sqlite3/executescript.py @@ -22,3 +22,4 @@ 1987 ); """) +con.close() diff --git a/Doc/includes/sqlite3/insert_more_people.py b/Doc/includes/sqlite3/insert_more_people.py index edbc79e7e5b6..10cf937243f6 100644 --- a/Doc/includes/sqlite3/insert_more_people.py +++ b/Doc/includes/sqlite3/insert_more_people.py @@ -14,3 +14,5 @@ # The changes will not be saved unless the transaction is committed explicitly: con.commit() + +con.close() diff --git a/Doc/includes/sqlite3/load_extension.py b/Doc/includes/sqlite3/load_extension.py index b997c70668ac..624cfe262f38 100644 --- a/Doc/includes/sqlite3/load_extension.py +++ b/Doc/includes/sqlite3/load_extension.py @@ -24,3 +24,5 @@ """) for row in con.execute("select rowid, name, ingredients from recipe where name match 'pie'"): print(row) + +con.close() diff --git a/Doc/includes/sqlite3/md5func.py b/Doc/includes/sqlite3/md5func.py index 0056b2d6ce84..16dc348bf001 100644 --- a/Doc/includes/sqlite3/md5func.py +++ b/Doc/includes/sqlite3/md5func.py @@ -9,3 +9,5 @@ def md5sum(t): cur = con.cursor() cur.execute("select md5(?)", (b"foo",)) print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/mysumaggr.py b/Doc/includes/sqlite3/mysumaggr.py index d2dfd2c0b98d..11f96395b6c4 100644 --- a/Doc/includes/sqlite3/mysumaggr.py +++ b/Doc/includes/sqlite3/mysumaggr.py @@ -18,3 +18,5 @@ def finalize(self): cur.execute("insert into test(i) values (2)") cur.execute("select mysum(i) from test") print(cur.fetchone()[0]) + +con.close() diff --git a/Doc/includes/sqlite3/parse_colnames.py b/Doc/includes/sqlite3/parse_colnames.py index cc68c76459ec..5f01dbfe1cb5 100644 --- a/Doc/includes/sqlite3/parse_colnames.py +++ b/Doc/includes/sqlite3/parse_colnames.py @@ -6,3 +6,5 @@ cur.execute('select ? as "x [timestamp]"', (datetime.datetime.now(),)) dt = cur.fetchone()[0] print(dt, type(dt)) + +con.close() diff --git a/Doc/includes/sqlite3/pysqlite_datetime.py b/Doc/includes/sqlite3/pysqlite_datetime.py index 68d49358a578..5d843f906b30 100644 --- a/Doc/includes/sqlite3/pysqlite_datetime.py +++ b/Doc/includes/sqlite3/pysqlite_datetime.py @@ -18,3 +18,5 @@ row = cur.fetchone() print("current_date", row[0], type(row[0])) print("current_timestamp", row[1], type(row[1])) + +con.close() diff --git a/Doc/includes/sqlite3/row_factory.py b/Doc/includes/sqlite3/row_factory.py index e436ffc6c802..9de6e7b1b905 100644 --- a/Doc/includes/sqlite3/row_factory.py +++ b/Doc/includes/sqlite3/row_factory.py @@ -11,3 +11,5 @@ def dict_factory(cursor, row): cur = con.cursor() cur.execute("select 1 as a") print(cur.fetchone()["a"]) + +con.close() diff --git a/Doc/includes/sqlite3/rowclass.py b/Doc/includes/sqlite3/rowclass.py index 92b5ad60cb57..fc60287069a8 100644 --- a/Doc/includes/sqlite3/rowclass.py +++ b/Doc/includes/sqlite3/rowclass.py @@ -10,3 +10,5 @@ assert row["name"] == row["nAmE"] assert row[1] == row["age"] assert row[1] == row["AgE"] + +con.close() diff --git a/Doc/includes/sqlite3/shortcut_methods.py b/Doc/includes/sqlite3/shortcut_methods.py index 71600d4f60c5..98a39411495c 100644 --- a/Doc/includes/sqlite3/shortcut_methods.py +++ b/Doc/includes/sqlite3/shortcut_methods.py @@ -18,3 +18,7 @@ print(row) print("I just deleted", con.execute("delete from person").rowcount, "rows") + +# close is not a shortcut method and it's not called automatically, +# so the connection object should be closed manually +con.close() diff --git a/Doc/includes/sqlite3/simple_tableprinter.py b/Doc/includes/sqlite3/simple_tableprinter.py index 231d8726cd43..148a1707f948 100644 --- a/Doc/includes/sqlite3/simple_tableprinter.py +++ b/Doc/includes/sqlite3/simple_tableprinter.py @@ -24,3 +24,5 @@ print(fieldValue.ljust(FIELD_MAX_WIDTH), end=' ') print() # Finish the row with a newline. + +con.close() diff --git a/Doc/includes/sqlite3/text_factory.py b/Doc/includes/sqlite3/text_factory.py index 5f96cdb58da1..a857a155cdd4 100644 --- a/Doc/includes/sqlite3/text_factory.py +++ b/Doc/includes/sqlite3/text_factory.py @@ -25,3 +25,5 @@ cur.execute("select ?", ("bar",)) row = cur.fetchone() assert row[0] == "barfoo" + +con.close() diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 569bfced3802..e20b4b3db370 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -530,6 +530,7 @@ Connection Objects with open('dump.sql', 'w') as f: for line in con.iterdump(): f.write('%s\n' % line) + con.close() .. method:: backup(target, *, pages=0, progress=None, name="main", sleep=0.250) @@ -566,8 +567,11 @@ Connection Objects print(f'Copied {total-remaining} of {total} pages...') con = sqlite3.connect('existing_db.db') - with sqlite3.connect('backup.db') as bck: + bck = sqlite3.connect('backup.db') + with bck: con.backup(bck, pages=1, progress=progress) + bck.close() + con.close() Example 2, copy an existing database into a transient copy:: From webhook-mailer at python.org Sun May 19 20:22:36 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 20 May 2019 00:22:36 -0000 Subject: [Python-checkins] bpo-35134: Register new traceback.h header files (GH-13431) Message-ID: https://github.com/python/cpython/commit/fd1e0e93b15af018184476ea0b3af0eabef37d89 commit: fd1e0e93b15af018184476ea0b3af0eabef37d89 branch: master author: Victor Stinner committer: GitHub date: 2019-05-20T02:22:32+02:00 summary: bpo-35134: Register new traceback.h header files (GH-13431) Add new cpython/traceback.h and pycore_traceback.h header files to Makefile.pre.in and PCbuild/ project. files: M Makefile.pre.in M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters diff --git a/Makefile.pre.in b/Makefile.pre.in index 4924dedc357c..9f70cd515eba 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1059,6 +1059,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/pylifecycle.h \ $(srcdir)/Include/cpython/pymem.h \ $(srcdir)/Include/cpython/pystate.h \ + $(srcdir)/Include/cpython/traceback.h \ $(srcdir)/Include/cpython/tupleobject.h \ $(srcdir)/Include/cpython/unicodeobject.h \ \ @@ -1078,6 +1079,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_pylifecycle.h \ $(srcdir)/Include/internal/pycore_pymem.h \ $(srcdir)/Include/internal/pycore_pystate.h \ + $(srcdir)/Include/internal/pycore_traceback.h \ $(srcdir)/Include/internal/pycore_tupleobject.h \ $(srcdir)/Include/internal/pycore_warnings.h \ $(DTRACE_HEADERS) diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index a71fce6bb609..df57adcfd605 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -135,6 +135,7 @@ + @@ -169,6 +170,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 913464656795..5515d9bedeb1 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -108,6 +108,9 @@ Include + + Include + Include @@ -210,6 +213,9 @@ Include + + Include + Include From webhook-mailer at python.org Sun May 19 20:26:39 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Mon, 20 May 2019 00:26:39 -0000 Subject: [Python-checkins] closes bpo-36951: Correct some types in the type_members struct in typeobject.c. (GH-13403) Message-ID: https://github.com/python/cpython/commit/53d378c81286644138415cb56da52a7351e1a477 commit: 53d378c81286644138415cb56da52a7351e1a477 branch: master author: Zackery Spytz committer: Benjamin Peterson date: 2019-05-19T17:26:35-07:00 summary: closes bpo-36951: Correct some types in the type_members struct in typeobject.c. (GH-13403) files: M Objects/typeobject.c diff --git a/Objects/typeobject.c b/Objects/typeobject.c index bfbd320b1f54..c086f182aa95 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -369,11 +369,11 @@ assign_version_tag(PyTypeObject *type) static PyMemberDef type_members[] = { {"__basicsize__", T_PYSSIZET, offsetof(PyTypeObject,tp_basicsize),READONLY}, {"__itemsize__", T_PYSSIZET, offsetof(PyTypeObject, tp_itemsize), READONLY}, - {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY}, - {"__weakrefoffset__", T_LONG, + {"__flags__", T_ULONG, offsetof(PyTypeObject, tp_flags), READONLY}, + {"__weakrefoffset__", T_PYSSIZET, offsetof(PyTypeObject, tp_weaklistoffset), READONLY}, {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY}, - {"__dictoffset__", T_LONG, + {"__dictoffset__", T_PYSSIZET, offsetof(PyTypeObject, tp_dictoffset), READONLY}, {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY}, {0} From webhook-mailer at python.org Sun May 19 20:49:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 May 2019 00:49:56 -0000 Subject: [Python-checkins] closes bpo-36951: Correct some types in the type_members struct in typeobject.c. (GH-13403) Message-ID: https://github.com/python/cpython/commit/eda691dd9d076e175c396dc6f85dee2795572f6c commit: eda691dd9d076e175c396dc6f85dee2795572f6c branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-19T17:49:50-07:00 summary: closes bpo-36951: Correct some types in the type_members struct in typeobject.c. (GH-13403) (cherry picked from commit 53d378c81286644138415cb56da52a7351e1a477) Co-authored-by: Zackery Spytz files: M Objects/typeobject.c diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 844fb0074920..56277cfc35ec 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -210,11 +210,11 @@ assign_version_tag(PyTypeObject *type) static PyMemberDef type_members[] = { {"__basicsize__", T_PYSSIZET, offsetof(PyTypeObject,tp_basicsize),READONLY}, {"__itemsize__", T_PYSSIZET, offsetof(PyTypeObject, tp_itemsize), READONLY}, - {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY}, - {"__weakrefoffset__", T_LONG, + {"__flags__", T_ULONG, offsetof(PyTypeObject, tp_flags), READONLY}, + {"__weakrefoffset__", T_PYSSIZET, offsetof(PyTypeObject, tp_weaklistoffset), READONLY}, {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY}, - {"__dictoffset__", T_LONG, + {"__dictoffset__", T_PYSSIZET, offsetof(PyTypeObject, tp_dictoffset), READONLY}, {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY}, {0} From webhook-mailer at python.org Sun May 19 20:54:13 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 May 2019 00:54:13 -0000 Subject: [Python-checkins] closes bpo-36951: Correct some types in the type_members struct in typeobject.c. (GH-13403) Message-ID: https://github.com/python/cpython/commit/64b0bdba7ee30ecc5c4c5ad46fb6afd6c0ddd487 commit: 64b0bdba7ee30ecc5c4c5ad46fb6afd6c0ddd487 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-19T17:54:08-07:00 summary: closes bpo-36951: Correct some types in the type_members struct in typeobject.c. (GH-13403) (cherry picked from commit 53d378c81286644138415cb56da52a7351e1a477) Co-authored-by: Zackery Spytz files: M Objects/typeobject.c diff --git a/Objects/typeobject.c b/Objects/typeobject.c index c578d6e93545..8adae49a7f27 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -363,11 +363,11 @@ assign_version_tag(PyTypeObject *type) static PyMemberDef type_members[] = { {"__basicsize__", T_PYSSIZET, offsetof(PyTypeObject,tp_basicsize),READONLY}, {"__itemsize__", T_PYSSIZET, offsetof(PyTypeObject, tp_itemsize), READONLY}, - {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY}, - {"__weakrefoffset__", T_LONG, + {"__flags__", T_ULONG, offsetof(PyTypeObject, tp_flags), READONLY}, + {"__weakrefoffset__", T_PYSSIZET, offsetof(PyTypeObject, tp_weaklistoffset), READONLY}, {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY}, - {"__dictoffset__", T_LONG, + {"__dictoffset__", T_PYSSIZET, offsetof(PyTypeObject, tp_dictoffset), READONLY}, {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY}, {0} From webhook-mailer at python.org Sun May 19 22:35:24 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 20 May 2019 02:35:24 -0000 Subject: [Python-checkins] [2.7] Update idlelib NEWS.txt for 2.7 (GH-13436) Message-ID: https://github.com/python/cpython/commit/c841a30879b14e40db93bd4aca56bdcec7a83133 commit: c841a30879b14e40db93bd4aca56bdcec7a83133 branch: 2.7 author: Terry Jan Reedy committer: GitHub date: 2019-05-19T22:35:21-04:00 summary: [2.7] Update idlelib NEWS.txt for 2.7 (GH-13436) files: M Lib/idlelib/NEWS.txt diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 7eb30a1b4fc0..d4560b8c2be0 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -1,8 +1,16 @@ Since 2.7.13, only severe bugs are fixed on the 2.7 branch. +What's New in IDLE 2.7.17? +========================== +*Release date: 2019-07-??* + +bpo-36807: When saving a file, call file.flush() and os.fsync() +so bits are flushed to e.g. a USB drive. + + What's New in IDLE 2.7.16? ========================== -*Release date: 2019-01-01?* +*Release date: 2019-03-02* bpo-31500: Default fonts now are scaled on HiDPI displays. From webhook-mailer at python.org Sun May 19 22:52:26 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 20 May 2019 02:52:26 -0000 Subject: [Python-checkins] bpo-36958: In IDLE, print exit message (GH-13435) Message-ID: https://github.com/python/cpython/commit/6d965b39b7a486dd9e96a60b19ee92382d668299 commit: 6d965b39b7a486dd9e96a60b19ee92382d668299 branch: master author: Terry Jan Reedy committer: GitHub date: 2019-05-19T22:52:22-04:00 summary: bpo-36958: In IDLE, print exit message (GH-13435) Print any argument other than None or int passed to SystemExit or sys.exit(). files: A Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst M Doc/library/idle.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/help.html M Lib/idlelib/run.py diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index f511d64b550b..c51cf19e97bd 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -700,6 +700,9 @@ If ``sys`` is reset by user code, such as with ``importlib.reload(sys)``, IDLE's changes are lost and input from the keyboard and output to the screen will not work correctly. +When user code raises SystemExit either directly or by calling sys.exit, IDLE +returns to a Shell prompt instead of exiting. + User output in Shell ^^^^^^^^^^^^^^^^^^^^ diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index be855bc46718..3f19ce737396 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,12 @@ Released on 2019-10-20? ====================================== +bpo-36958: Print any argument other than None or int passed to +SystemExit or sys.exit(). + +bpo-36807: When saving a file, call file.flush() and os.fsync() +so bits are flushed to e.g. a USB drive. + bpo-36429: Fix starting IDLE with pyshell. Add idlelib.pyshell alias at top; remove pyshell alias at bottom. Remove obsolete __name__=='__main__' command. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 56f9ca503daa..bc287d637ab7 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -659,6 +659,8 @@

    Running user codesys is reset by user code, such as with importlib.reload(sys), IDLE?s changes are lost and input from the keyboard and output to the screen will not work correctly.

    +

    When user code raises SystemExit either directly or by calling sys.exit, IDLE +returns to a Shell prompt instead of exiting.

    User output in Shell?

    @@ -941,7 +943,7 @@

    Navigation



    - Last updated on May 16, 2019. + Last updated on May 19, 2019. Found a bug?
    diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 6fa373f2584c..b4a2b54a33c8 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -474,15 +474,16 @@ def runcode(self, code): exec(code, self.locals) finally: interruptable = False - except SystemExit: - # Scripts that raise SystemExit should just - # return to the interactive prompt - pass + except SystemExit as e: + if e.args: # SystemExit called with an argument. + ob = e.args[0] + if not isinstance(ob, (type(None), int)): + print('SystemExit: ' + str(ob), file=sys.stderr) + # Return to the interactive prompt. except: self.usr_exc_info = sys.exc_info() if quitting: exit() - # even print a user code SystemExit exception, continue print_exception() jit = self.rpchandler.console.getvar("<>") if jit: diff --git a/Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst b/Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst new file mode 100644 index 000000000000..c5a675d6781a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst @@ -0,0 +1,2 @@ +Print any argument other than None or int passed to SystemExit or +sys.exit(). From webhook-mailer at python.org Mon May 20 03:17:08 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 May 2019 07:17:08 -0000 Subject: [Python-checkins] bpo-36958: In IDLE, print exit message (GH-13435) Message-ID: https://github.com/python/cpython/commit/2d94d4f1a5f54f73450d2982eab54a6301741a32 commit: 2d94d4f1a5f54f73450d2982eab54a6301741a32 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-20T00:16:53-07:00 summary: bpo-36958: In IDLE, print exit message (GH-13435) Print any argument other than None or int passed to SystemExit or sys.exit(). (cherry picked from commit 6d965b39b7a486dd9e96a60b19ee92382d668299) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst M Doc/library/idle.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/help.html M Lib/idlelib/run.py diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index f511d64b550b..c51cf19e97bd 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -700,6 +700,9 @@ If ``sys`` is reset by user code, such as with ``importlib.reload(sys)``, IDLE's changes are lost and input from the keyboard and output to the screen will not work correctly. +When user code raises SystemExit either directly or by calling sys.exit, IDLE +returns to a Shell prompt instead of exiting. + User output in Shell ^^^^^^^^^^^^^^^^^^^^ diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 3f0480e0acab..512ee8b32f54 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,12 @@ Released on 2019-06-24? ====================================== +bpo-36958: Print any argument other than None or int passed to +SystemExit or sys.exit(). + +bpo-36807: When saving a file, call file.flush() and os.fsync() +so bits are flushed to e.g. a USB drive. + bpo-36429: Fix starting IDLE with pyshell. Add idlelib.pyshell alias at top; remove pyshell alias at bottom. Remove obsolete __name__=='__main__' command. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 56f9ca503daa..bc287d637ab7 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -659,6 +659,8 @@

    Running user codesys is reset by user code, such as with importlib.reload(sys), IDLE?s changes are lost and input from the keyboard and output to the screen will not work correctly.

    +

    When user code raises SystemExit either directly or by calling sys.exit, IDLE +returns to a Shell prompt instead of exiting.

    User output in Shell?

    @@ -941,7 +943,7 @@

    Navigation



    - Last updated on May 16, 2019. + Last updated on May 19, 2019. Found a bug?
    diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 6fa373f2584c..b4a2b54a33c8 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -474,15 +474,16 @@ def runcode(self, code): exec(code, self.locals) finally: interruptable = False - except SystemExit: - # Scripts that raise SystemExit should just - # return to the interactive prompt - pass + except SystemExit as e: + if e.args: # SystemExit called with an argument. + ob = e.args[0] + if not isinstance(ob, (type(None), int)): + print('SystemExit: ' + str(ob), file=sys.stderr) + # Return to the interactive prompt. except: self.usr_exc_info = sys.exc_info() if quitting: exit() - # even print a user code SystemExit exception, continue print_exception() jit = self.rpchandler.console.getvar("<>") if jit: diff --git a/Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst b/Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst new file mode 100644 index 000000000000..c5a675d6781a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst @@ -0,0 +1,2 @@ +Print any argument other than None or int passed to SystemExit or +sys.exit(). From webhook-mailer at python.org Mon May 20 05:02:13 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 20 May 2019 09:02:13 -0000 Subject: [Python-checkins] bpo-36763: Fix Python preinitialization (GH-13432) Message-ID: https://github.com/python/cpython/commit/6d1c46746e17367caf8a24623cb5c9a9c4e3e036 commit: 6d1c46746e17367caf8a24623cb5c9a9c4e3e036 branch: master author: Victor Stinner committer: GitHub date: 2019-05-20T11:02:00+02:00 summary: bpo-36763: Fix Python preinitialization (GH-13432) * Add _PyPreConfig.parse_argv * Add _PyCoreConfig._config_init field and _PyCoreConfigInitEnum enum type * Initialization functions: reject preconfig=NULL and config=NULL * Add config parameter to _PyCoreConfig_DecodeLocaleErr(): pass config->argv to _Py_PreInitializeFromPyArgv(), to parse config command line arguments in preinitialization. * Add config parameter to _PyCoreConfig_SetString(). It now preinitializes Python. * _PyCoreConfig_SetPyArgv() now also preinitializes Python for wide argv * Fix _Py_PreInitializeFromCoreConfig(): don't pass args to _Py_PreInitializeFromPyArgv() if config.parse_argv=0. * Use "char * const *" and "wchar_t * const *" types for 'argv' parameters and _PyArgv.argv. * Add unit test on preinitialization from argv. * _PyPreConfig.allocator type becomes int * Add _PyPreConfig_InitFromPreConfig() and _PyPreConfig_InitFromCoreConfig() helper functions files: M Include/cpython/coreconfig.h M Include/cpython/pylifecycle.h M Include/internal/pycore_coreconfig.h M Lib/test/test_embed.py M Programs/_testembed.c M Python/coreconfig.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index a71f16171b73..decfb70e7345 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -44,6 +44,10 @@ typedef struct { int _config_version; /* Internal configuration version, used for ABI compatibility */ + /* Parse _Py_PreInitializeFromArgs() arguments? + See _PyCoreConfig.parse_argv */ + int parse_argv; + /* If greater than 0, enable isolated mode: sys.path contains neither the script's directory nor the user's site-packages directory. @@ -111,8 +115,9 @@ typedef struct { int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ - /* Memory allocator: PYTHONMALLOC env var */ - PyMemAllocatorName allocator; + /* Memory allocator: PYTHONMALLOC env var. + See PyMemAllocatorName for valid values. */ + int allocator; } _PyPreConfig; PyAPI_FUNC(void) _PyPreConfig_InitPythonConfig(_PyPreConfig *config); @@ -121,9 +126,16 @@ PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ +typedef enum { + _PyCoreConfig_INIT = 0, + _PyCoreConfig_INIT_PYTHON = 1, + _PyCoreConfig_INIT_ISOLATED = 2 +} _PyCoreConfigInitEnum; + typedef struct { int _config_version; /* Internal configuration version, used for ABI compatibility */ + int _config_init; /* _PyCoreConfigInitEnum value */ int isolated; /* Isolated mode? see _PyPreConfig.isolated */ int use_environment; /* Use environment variables? see _PyPreConfig.use_environment */ @@ -401,19 +413,21 @@ PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetString( + _PyCoreConfig *config, wchar_t **config_str, const wchar_t *str); PyAPI_FUNC(_PyInitError) _PyCoreConfig_DecodeLocale( + _PyCoreConfig *config, wchar_t **config_str, const char *str); PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetArgv( _PyCoreConfig *config, Py_ssize_t argc, - char **argv); + char * const *argv); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideArgv(_PyCoreConfig *config, Py_ssize_t argc, - wchar_t **argv); + wchar_t * const *argv); #ifdef __cplusplus } diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 8fc809d30d82..1e1dabe59ff5 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -35,11 +35,11 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig( PyAPI_FUNC(_PyInitError) _Py_InitializeFromArgs( const _PyCoreConfig *config, Py_ssize_t argc, - char **argv); + char * const *argv); PyAPI_FUNC(_PyInitError) _Py_InitializeFromWideArgs( const _PyCoreConfig *config, Py_ssize_t argc, - wchar_t **argv); + wchar_t * const *argv); PyAPI_FUNC(_PyInitError) _Py_InitializeMain(void); PyAPI_FUNC(int) _Py_RunMain(void); diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index edde7b1d8d88..324e0b82b90c 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -63,8 +63,8 @@ PyAPI_FUNC(int) _PyWstrList_Extend(_PyWstrList *list, typedef struct { Py_ssize_t argc; int use_bytes_argv; - char **bytes_argv; - wchar_t **wchar_argv; + char * const *bytes_argv; + wchar_t * const *wchar_argv; } _PyArgv; PyAPI_FUNC(_PyInitError) _PyArgv_AsWstrList(const _PyArgv *args, @@ -121,6 +121,12 @@ PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, /* --- _PyPreConfig ----------------------------------------------- */ PyAPI_FUNC(void) _PyPreConfig_Init(_PyPreConfig *config); +PyAPI_FUNC(void) _PyPreConfig_InitFromCoreConfig( + _PyPreConfig *config, + const _PyCoreConfig *coreconfig); +PyAPI_FUNC(void) _PyPreConfig_InitFromPreConfig( + _PyPreConfig *config, + const _PyPreConfig *config2); PyAPI_FUNC(void) _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2); PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 5a5419dcfcf5..5be179a266ba 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -17,6 +17,10 @@ PYMEM_ALLOCATOR_DEBUG = 2 PYMEM_ALLOCATOR_MALLOC = 3 +CONFIG_INIT = 0 +CONFIG_INIT_PYTHON = 1 +CONFIG_INIT_ISOLATED = 2 + class EmbeddingTestsMixin: def setUp(self): @@ -280,11 +284,19 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): DEFAULT_PRE_CONFIG = { 'allocator': PYMEM_ALLOCATOR_NOT_SET, + 'parse_argv': 0, 'configure_locale': 1, 'coerce_c_locale': 0, 'coerce_c_locale_warn': 0, 'utf8_mode': 0, } + if MS_WINDOWS: + DEFAULT_PRE_CONFIG.update({ + 'legacy_windows_fs_encoding': 0, + }) + PYTHON_PRE_CONFIG = dict(DEFAULT_PRE_CONFIG, + parse_argv=1, + ) ISOLATED_PRE_CONFIG = dict(DEFAULT_PRE_CONFIG, configure_locale=0, isolated=1, @@ -292,8 +304,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): utf8_mode=0, dev_mode=0, ) - if MS_WINDOWS: - ISOLATED_PRE_CONFIG['legacy_windows_fs_encoding'] = 0 COPY_PRE_CONFIG = [ 'dev_mode', @@ -302,6 +312,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ] DEFAULT_CORE_CONFIG = { + '_config_init': CONFIG_INIT, 'isolated': 0, 'use_environment': 1, 'dev_mode': 0, @@ -365,9 +376,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_init_main': 1, } if MS_WINDOWS: - DEFAULT_PRE_CONFIG.update({ - 'legacy_windows_fs_encoding': 0, - }) DEFAULT_CORE_CONFIG.update({ 'legacy_windows_stdio': 0, }) @@ -439,13 +447,14 @@ def main_xoptions(self, xoptions_list): def get_expected_config(self, expected_preconfig, expected, env, api, add_path=None): - if api == "python": + if api == CONFIG_INIT_PYTHON: default_config = self.PYTHON_CORE_CONFIG - elif api == "isolated": + elif api == CONFIG_INIT_ISOLATED: default_config = self.ISOLATED_CORE_CONFIG else: default_config = self.DEFAULT_CORE_CONFIG expected = dict(default_config, **expected) + expected['_config_init'] = api code = textwrap.dedent(''' import json @@ -519,9 +528,7 @@ def get_expected_config(self, expected_preconfig, expected, env, api, return expected def check_pre_config(self, config, expected): - pre_config = dict(config['pre_config']) - core_config = dict(config['core_config']) - self.assertEqual(pre_config, expected) + self.assertEqual(config['pre_config'], expected) def check_core_config(self, config, expected): core_config = dict(config['core_config']) @@ -554,7 +561,7 @@ def check_global_config(self, config): self.assertEqual(config['global_config'], expected) def check_config(self, testname, expected_config=None, expected_preconfig=None, - add_path=None, stderr=None, api="default"): + add_path=None, stderr=None, api=CONFIG_INIT): env = dict(os.environ) # Remove PYTHON* environment variables to get deterministic environment for key in list(env): @@ -565,8 +572,10 @@ def check_config(self, testname, expected_config=None, expected_preconfig=None, env['PYTHONCOERCECLOCALE'] = '0' env['PYTHONUTF8'] = '0' - if api == "isolated": + if api == CONFIG_INIT_ISOLATED: default_preconfig = self.ISOLATED_PRE_CONFIG + elif api == CONFIG_INIT_PYTHON: + default_preconfig = self.PYTHON_PRE_CONFIG else: default_preconfig = self.DEFAULT_PRE_CONFIG if expected_preconfig is None: @@ -719,7 +728,38 @@ def test_init_dev_mode(self): 'dev_mode': 1, 'warnoptions': ['default'], } - self.check_config("init_dev_mode", config, preconfig, api="python") + self.check_config("init_dev_mode", config, preconfig, + api=CONFIG_INIT_PYTHON) + + def test_preinit_parse_argv(self): + # Pre-initialize implicitly using argv: make sure that -X dev + # is used to configure the allocation in preinitialization + preconfig = { + 'allocator': PYMEM_ALLOCATOR_DEBUG, + } + config = { + 'argv': ['script.py'], + 'run_filename': 'script.py', + 'dev_mode': 1, + 'faulthandler': 1, + 'warnoptions': ['default'], + 'xoptions': ['dev'], + } + self.check_config("preinit_parse_argv", config, preconfig, + api=CONFIG_INIT_PYTHON) + + def test_preinit_dont_parse_argv(self): + # -X dev must be ignored by isolated preconfiguration + preconfig = { + 'isolated': 0, + } + config = { + 'argv': ["python3", "-E", "-I", + "-X", "dev", "-X", "utf8", "script.py"], + 'isolated': 0, + } + self.check_config("preinit_dont_parse_argv", config, preconfig, + api=CONFIG_INIT_ISOLATED) def test_init_isolated_flag(self): config = { @@ -727,7 +767,7 @@ def test_init_isolated_flag(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("init_isolated_flag", config, api="python") + self.check_config("init_isolated_flag", config, api=CONFIG_INIT_PYTHON) def test_preinit_isolated1(self): # _PyPreConfig.isolated=1, _PyCoreConfig.isolated not set @@ -747,25 +787,30 @@ def test_preinit_isolated2(self): } self.check_config("preinit_isolated2", config) + def test_preinit_isolated_config(self): + self.check_config("preinit_isolated_config", api=CONFIG_INIT_ISOLATED) + def test_init_isolated_config(self): - self.check_config("init_isolated_config", api="isolated") + self.check_config("init_isolated_config", api=CONFIG_INIT_ISOLATED) def test_init_python_config(self): - self.check_config("init_python_config", api="python") + self.check_config("init_python_config", api=CONFIG_INIT_PYTHON) def test_init_dont_configure_locale(self): # _PyPreConfig.configure_locale=0 preconfig = { 'configure_locale': 0, } - self.check_config("init_dont_configure_locale", {}, preconfig, api="python") + self.check_config("init_dont_configure_locale", {}, preconfig, + api=CONFIG_INIT_PYTHON) def test_init_read_set(self): core_config = { 'program_name': './init_read_set', 'executable': 'my_executable', } - self.check_config("init_read_set", core_config, api="python", + self.check_config("init_read_set", core_config, + api=CONFIG_INIT_PYTHON, add_path="init_read_set_path") def test_init_run_main(self): @@ -777,7 +822,8 @@ def test_init_run_main(self): 'run_command': code + '\n', 'parse_argv': 1, } - self.check_config("init_run_main", core_config, api="python") + self.check_config("init_run_main", core_config, + api=CONFIG_INIT_PYTHON) def test_init_main(self): code = ('import _testinternalcapi, json; ' @@ -789,7 +835,8 @@ def test_init_main(self): 'parse_argv': 1, '_init_main': 0, } - self.check_config("init_main", core_config, api="python", + self.check_config("init_main", core_config, + api=CONFIG_INIT_PYTHON, stderr="Run Python code before _Py_InitializeMain") def test_init_parse_argv(self): @@ -800,15 +847,20 @@ def test_init_parse_argv(self): 'run_command': 'pass\n', 'use_environment': 0, } - self.check_config("init_parse_argv", core_config, api="python") + self.check_config("init_parse_argv", core_config, + api=CONFIG_INIT_PYTHON) def test_init_dont_parse_argv(self): + pre_config = { + 'parse_argv': 0, + } core_config = { 'parse_argv': 0, 'argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], 'program_name': './argv0', } - self.check_config("init_dont_parse_argv", core_config, api="python") + self.check_config("init_dont_parse_argv", core_config, pre_config, + api=CONFIG_INIT_PYTHON) if __name__ == "__main__": diff --git a/Programs/_testembed.c b/Programs/_testembed.c index f1bb731dcba2..3dabf66de15a 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -527,7 +527,10 @@ static int check_init_parse_argv(int parse_argv) _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_InitPythonConfig(&config); + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } static wchar_t* argv[] = { L"./argv0", @@ -565,7 +568,7 @@ static int test_init_dont_parse_argv(void) } -static void test_init_env_putenvs(void) +static void set_all_env_vars(void) { putenv("PYTHONHASHSEED=42"); putenv("PYTHONMALLOC=malloc"); @@ -596,7 +599,7 @@ static int test_init_env(void) { /* Test initialization from environment variables */ Py_IgnoreEnvironmentFlag = 0; - test_init_env_putenvs(); + set_all_env_vars(); _testembed_Py_Initialize(); dump_config(); Py_Finalize(); @@ -604,9 +607,9 @@ static int test_init_env(void) } -static void set_all_env_vars(void) +static void set_all_env_vars_dev_mode(void) { - test_init_env_putenvs(); + set_all_env_vars(); putenv("PYTHONMALLOC="); putenv("PYTHONFAULTHANDLER="); putenv("PYTHONDEVMODE=1"); @@ -617,7 +620,7 @@ static int test_init_env_dev_mode(void) { /* Test initialization from environment variables */ Py_IgnoreEnvironmentFlag = 0; - set_all_env_vars(); + set_all_env_vars_dev_mode(); _testembed_Py_Initialize(); dump_config(); Py_Finalize(); @@ -629,7 +632,7 @@ static int test_init_env_dev_mode_alloc(void) { /* Test initialization from environment variables */ Py_IgnoreEnvironmentFlag = 0; - set_all_env_vars(); + set_all_env_vars_dev_mode(); putenv("PYTHONMALLOC=malloc"); _testembed_Py_Initialize(); dump_config(); @@ -644,7 +647,10 @@ static int test_init_isolated_flag(void) /* Test _PyCoreConfig.isolated=1 */ _PyCoreConfig config; - _PyCoreConfig_InitPythonConfig(&config); + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } Py_IsolatedFlag = 0; config.isolated = 1; @@ -727,6 +733,107 @@ static int test_preinit_isolated2(void) } +static int test_preinit_dont_parse_argv(void) +{ + _PyInitError err; + + _PyPreConfig preconfig; + _PyPreConfig_InitIsolatedConfig(&preconfig); + + preconfig.isolated = 0; + + /* -X dev must be ignored by isolated preconfiguration */ + wchar_t *argv[] = {L"python3", + L"-E", + L"-I", + L"-X", L"dev", + L"-X", L"utf8", + L"script.py"}; + err = _Py_PreInitializeFromWideArgs(&preconfig, Py_ARRAY_LENGTH(argv), argv); + if (_PyInitError_Failed(err)) { + goto failed; + } + + _PyCoreConfig config; + + err = _PyCoreConfig_InitIsolatedConfig(&config); + if (_PyInitError_Failed(err)) { + goto failed; + } + + config.isolated = 0; + + /* Pre-initialize implicitly using argv: make sure that -X dev + is used to configure the allocation in preinitialization */ + err = _PyCoreConfig_SetWideArgv(&config, Py_ARRAY_LENGTH(argv), argv); + if (_PyInitError_Failed(err)) { + goto failed; + } + + err = _PyCoreConfig_SetString(&config, &config.program_name, + L"./_testembed"); + if (_PyInitError_Failed(err)) { + goto failed; + } + + err = _Py_InitializeFromConfig(&config); + if (_PyInitError_Failed(err)) { + goto failed; + } + _PyCoreConfig_Clear(&config); + + dump_config(); + Py_Finalize(); + return 0; + +failed: + _PyCoreConfig_Clear(&config); + _Py_ExitInitError(err); +} + + +static int test_preinit_parse_argv(void) +{ + _PyInitError err; + _PyCoreConfig config; + + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + goto failed; + } + + /* Pre-initialize implicitly using argv: make sure that -X dev + is used to configure the allocation in preinitialization */ + wchar_t *argv[] = {L"python3", L"-X", L"dev", L"script.py"}; + err = _PyCoreConfig_SetWideArgv(&config, Py_ARRAY_LENGTH(argv), argv); + if (_PyInitError_Failed(err)) { + goto failed; + } + + err = _PyCoreConfig_SetString(&config, &config.program_name, + L"./_testembed"); + if (_PyInitError_Failed(err)) { + goto failed; + } + + err = _Py_InitializeFromConfig(&config); + if (_PyInitError_Failed(err)) { + goto failed; + } + _PyCoreConfig_Clear(&config); + + dump_config(); + Py_Finalize(); + return 0; + +failed: + _PyCoreConfig_Clear(&config); + _Py_ExitInitError(err); +} + + + + static void set_all_global_config_variables(void) { Py_IsolatedFlag = 0; @@ -749,9 +856,10 @@ static void set_all_global_config_variables(void) } -static int test_init_isolated_config(void) +static int check_preinit_isolated_config(int preinit) { _PyInitError err; + _PyPreConfig *rt_preconfig; /* environment variables must be ignored */ set_all_env_vars(); @@ -759,17 +867,19 @@ static int test_init_isolated_config(void) /* global configuration variables must be ignored */ set_all_global_config_variables(); - _PyPreConfig preconfig; - _PyPreConfig_InitIsolatedConfig(&preconfig); + if (preinit) { + _PyPreConfig preconfig; + _PyPreConfig_InitIsolatedConfig(&preconfig); - err = _Py_PreInitialize(&preconfig); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); - } + err = _Py_PreInitialize(&preconfig); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } - _PyPreConfig *rt_preconfig = &_PyRuntime.preconfig; - assert(rt_preconfig->isolated == 1); - assert(rt_preconfig->use_environment == 0); + rt_preconfig = &_PyRuntime.preconfig; + assert(rt_preconfig->isolated == 1); + assert(rt_preconfig->use_environment == 0); + } _PyCoreConfig config; err = _PyCoreConfig_InitIsolatedConfig(&config); @@ -782,13 +892,30 @@ static int test_init_isolated_config(void) if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } + + rt_preconfig = &_PyRuntime.preconfig; + assert(rt_preconfig->isolated == 1); + assert(rt_preconfig->use_environment == 0); + dump_config(); Py_Finalize(); return 0; } -static int test_init_python_config(void) +static int test_preinit_isolated_config(void) +{ + return check_preinit_isolated_config(1); +} + + +static int test_init_isolated_config(void) +{ + return check_preinit_isolated_config(0); +} + + +static int check_init_python_config(int preinit) { _PyInitError err; @@ -805,12 +932,14 @@ static int test_init_python_config(void) Py_LegacyWindowsStdioFlag = 1; #endif - _PyPreConfig preconfig; - _PyPreConfig_InitPythonConfig(&preconfig); + if (preinit) { + _PyPreConfig preconfig; + _PyPreConfig_InitPythonConfig(&preconfig); - err = _Py_PreInitialize(&preconfig); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + err = _Py_PreInitialize(&preconfig); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } } _PyCoreConfig config; @@ -830,6 +959,18 @@ static int test_init_python_config(void) } +static int test_preinit_python_config(void) +{ + return check_init_python_config(1); +} + + +static int test_init_python_config(void) +{ + return check_init_python_config(0); +} + + static int test_init_dont_configure_locale(void) { _PyInitError err; @@ -846,7 +987,10 @@ static int test_init_dont_configure_locale(void) } _PyCoreConfig config; - _PyCoreConfig_InitPythonConfig(&config); + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } config.program_name = L"./_testembed"; err = _Py_InitializeFromConfig(&config); if (_PyInitError_Failed(err)) { @@ -861,13 +1005,17 @@ static int test_init_dont_configure_locale(void) static int test_init_dev_mode(void) { + _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_InitPythonConfig(&config); + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } putenv("PYTHONFAULTHANDLER="); putenv("PYTHONMALLOC="); config.dev_mode = 1; config.program_name = L"./_testembed"; - _PyInitError err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config); if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -881,9 +1029,13 @@ static int test_init_read_set(void) { _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_InitPythonConfig(&config); + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } - err = _PyCoreConfig_DecodeLocale(&config.program_name, "./init_read_set"); + err = _PyCoreConfig_DecodeLocale(&config, &config.program_name, + "./init_read_set"); if (_PyInitError_Failed(err)) { goto fail; } @@ -900,7 +1052,7 @@ static int test_init_read_set(void) } /* override executable computed by _PyCoreConfig_Read() */ - err = _PyCoreConfig_SetString(&config.executable, L"my_executable"); + err = _PyCoreConfig_SetString(&config, &config.executable, L"my_executable"); if (_PyInitError_Failed(err)) { goto fail; } @@ -937,11 +1089,15 @@ static void configure_init_main(_PyCoreConfig *config) static int test_init_run_main(void) { + _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_InitPythonConfig(&config); + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } configure_init_main(&config); - _PyInitError err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config); if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -952,12 +1108,17 @@ static int test_init_run_main(void) static int test_init_main(void) { + _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_InitPythonConfig(&config); + + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } configure_init_main(&config); config._init_main = 0; - _PyInitError err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config); if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } @@ -982,23 +1143,40 @@ static int test_init_main(void) static int test_run_main(void) { + _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_InitPythonConfig(&config); + + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + goto failed; + } wchar_t *argv[] = {L"python3", L"-c", (L"import sys; " L"print(f'_Py_RunMain(): sys.argv={sys.argv}')"), L"arg2"}; - config.argv.length = Py_ARRAY_LENGTH(argv); - config.argv.items = argv; - config.program_name = L"./python3"; + err = _PyCoreConfig_SetWideArgv(&config, Py_ARRAY_LENGTH(argv), argv); + if (_PyInitError_Failed(err)) { + goto failed; + } - _PyInitError err = _Py_InitializeFromConfig(&config); + err = _PyCoreConfig_SetString(&config, &config.program_name, + L"./python3"); if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + goto failed; + } + + err = _Py_InitializeFromConfig(&config); + if (_PyInitError_Failed(err)) { + goto failed; } + _PyCoreConfig_Clear(&config); return _Py_RunMain(); + +failed: + _PyCoreConfig_Clear(&config); + _Py_ExitInitError(err); } @@ -1039,10 +1217,14 @@ static struct TestCase TestCases[] = { { "init_dont_configure_locale", test_init_dont_configure_locale }, { "init_dev_mode", test_init_dev_mode }, { "init_isolated_flag", test_init_isolated_flag }, + { "preinit_isolated_config", test_preinit_isolated_config }, { "init_isolated_config", test_init_isolated_config }, + { "preinit_python_config", test_preinit_python_config }, { "init_python_config", test_init_python_config }, { "preinit_isolated1", test_preinit_isolated1 }, { "preinit_isolated2", test_preinit_isolated2 }, + { "preinit_parse_argv", test_preinit_parse_argv }, + { "preinit_dont_parse_argv", test_preinit_dont_parse_argv }, { "init_read_set", test_init_read_set }, { "init_run_main", test_init_run_main }, { "init_main", test_init_main }, diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 470bda870288..958845e488d7 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -551,6 +551,7 @@ _PyCoreConfig_Init(_PyCoreConfig *config) memset(config, 0, sizeof(*config)); config->_config_version = _Py_CONFIG_VERSION; + config->_config_init = (int)_PyCoreConfig_INIT; config->isolated = -1; config->use_environment = -1; config->dev_mode = -1; @@ -612,6 +613,7 @@ _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config) { _PyCoreConfig_InitDefaults(config); + config->_config_init = (int)_PyCoreConfig_INIT_PYTHON; config->configure_c_stdio = 1; config->parse_argv = 1; @@ -624,6 +626,7 @@ _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config) { _PyCoreConfig_InitDefaults(config); + config->_config_init = (int)_PyCoreConfig_INIT_ISOLATED; config->isolated = 1; config->use_environment = 0; config->user_site_directory = 0; @@ -643,8 +646,14 @@ _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config) /* Copy str into *config_str (duplicate the string) */ _PyInitError -_PyCoreConfig_SetString(wchar_t **config_str, const wchar_t *str) +_PyCoreConfig_SetString(_PyCoreConfig *config, wchar_t **config_str, + const wchar_t *str) { + _PyInitError err = _Py_PreInitializeFromCoreConfig(config, NULL); + if (_Py_INIT_FAILED(err)) { + return err; + } + wchar_t *str2; if (str != NULL) { str2 = _PyMem_RawWcsdup(str); @@ -662,10 +671,10 @@ _PyCoreConfig_SetString(wchar_t **config_str, const wchar_t *str) static _PyInitError -_PyCoreConfig_DecodeLocaleErr(wchar_t **config_str, const char *str, - const char *decode_err_msg) +_PyCoreConfig_DecodeLocaleErr(_PyCoreConfig *config, wchar_t **config_str, + const char *str, const char *decode_err_msg) { - _PyInitError err = _Py_PreInitialize(NULL); + _PyInitError err = _Py_PreInitializeFromCoreConfig(config, NULL); if (_Py_INIT_FAILED(err)) { return err; } @@ -692,17 +701,18 @@ _PyCoreConfig_DecodeLocaleErr(wchar_t **config_str, const char *str, } -#define CONFIG_DECODE_LOCALE(config_str, str, NAME) \ - _PyCoreConfig_DecodeLocaleErr(config_str, str, "cannot decode " NAME) +#define CONFIG_DECODE_LOCALE(config, config_str, str, NAME) \ + _PyCoreConfig_DecodeLocaleErr(config, config_str, str, "cannot decode " NAME) /* Decode str using Py_DecodeLocale() and set the result into *config_str. Pre-initialize Python if needed to ensure that encodings are properly configured. */ _PyInitError -_PyCoreConfig_DecodeLocale(wchar_t **config_str, const char *str) +_PyCoreConfig_DecodeLocale(_PyCoreConfig *config, wchar_t **config_str, + const char *str) { - return CONFIG_DECODE_LOCALE(config_str, str, "string"); + return CONFIG_DECODE_LOCALE(config, config_str, str, "string"); } @@ -715,7 +725,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR #define COPY_WSTR_ATTR(ATTR) \ do { \ - err = _PyCoreConfig_SetString(&config->ATTR, config2->ATTR); \ + err = _PyCoreConfig_SetString(config, &config->ATTR, config2->ATTR); \ if (_Py_INIT_FAILED(err)) { \ return err; \ } \ @@ -727,6 +737,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) } \ } while (0) + COPY_ATTR(_config_init); COPY_ATTR(isolated); COPY_ATTR(use_environment); COPY_ATTR(dev_mode); @@ -829,6 +840,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) #define SET_ITEM_WSTRLIST(LIST) \ SET_ITEM(#LIST, _PyWstrList_AsList(&config->LIST)) + SET_ITEM_INT(_config_init); SET_ITEM_INT(isolated); SET_ITEM_INT(use_environment); SET_ITEM_INT(dev_mode); @@ -910,7 +922,7 @@ _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) Return 0 on success, but *dest can be NULL. Return -1 on memory allocation failure. Return -2 on decoding error. */ static _PyInitError -_PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, +_PyCoreConfig_GetEnvDup(_PyCoreConfig *config, wchar_t **dest, wchar_t *wname, char *name, const char *decode_err_msg) @@ -930,7 +942,7 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, return _Py_INIT_OK(); } - return _PyCoreConfig_SetString(dest, var); + return _PyCoreConfig_SetString(config, dest, var); #else const char *var = getenv(name); if (!var || var[0] == '\0') { @@ -938,7 +950,7 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, return _Py_INIT_OK(); } - return _PyCoreConfig_DecodeLocaleErr(dest, var, decode_err_msg); + return _PyCoreConfig_DecodeLocaleErr(config, dest, var, decode_err_msg); #endif } @@ -1053,7 +1065,7 @@ config_init_program_name(_PyCoreConfig *config) script. */ const char *p = _PyCoreConfig_GetEnv(config, "PYTHONEXECUTABLE"); if (p != NULL) { - err = CONFIG_DECODE_LOCALE(&config->program_name, p, + err = CONFIG_DECODE_LOCALE(config, &config->program_name, p, "PYTHONEXECUTABLE environment variable"); if (_Py_INIT_FAILED(err)) { return err; @@ -1067,7 +1079,8 @@ config_init_program_name(_PyCoreConfig *config) /* Used by Mac/Tools/pythonw.c to forward * the argv0 of the stub executable */ - err = CONFIG_DECODE_LOCALE(&config->program_name, pyvenv_launcher, + err = CONFIG_DECODE_LOCALE(config, + &config->program_name, pyvenv_launcher, "__PYVENV_LAUNCHER__ environment variable"); if (_Py_INIT_FAILED(err)) { return err; @@ -1094,7 +1107,8 @@ config_init_program_name(_PyCoreConfig *config) #else const wchar_t *default_program_name = L"python3"; #endif - err = _PyCoreConfig_SetString(&config->program_name, default_program_name); + err = _PyCoreConfig_SetString(config, &config->program_name, + default_program_name); if (_Py_INIT_FAILED(err)) { return err; } @@ -1109,7 +1123,8 @@ config_init_executable(_PyCoreConfig *config) /* If Py_SetProgramFullPath() was called, use its value */ const wchar_t *program_full_path = _Py_path_config.program_full_path; if (program_full_path != NULL) { - _PyInitError err = _PyCoreConfig_SetString(&config->executable, + _PyInitError err = _PyCoreConfig_SetString(config, + &config->executable, program_full_path); if (_Py_INIT_FAILED(err)) { return err; @@ -1135,7 +1150,7 @@ config_init_home(_PyCoreConfig *config) /* If Py_SetPythonHome() was called, use its value */ wchar_t *home = _Py_path_config.home; if (home) { - _PyInitError err = _PyCoreConfig_SetString(&config->home, home); + _PyInitError err = _PyCoreConfig_SetString(config, &config->home, home); if (_Py_INIT_FAILED(err)) { return err; } @@ -1392,14 +1407,14 @@ config_get_stdio_errors(const _PyCoreConfig *config) static _PyInitError -config_get_locale_encoding(wchar_t **locale_encoding) +config_get_locale_encoding(_PyCoreConfig *config, wchar_t **locale_encoding) { #ifdef MS_WINDOWS char encoding[20]; PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); - return _PyCoreConfig_DecodeLocale(locale_encoding, encoding); + return _PyCoreConfig_DecodeLocale(config, locale_encoding, encoding); #elif defined(_Py_FORCE_UTF8_LOCALE) - return _PyCoreConfig_SetString(locale_encoding, L"utf-8"); + return _PyCoreConfig_SetString(config, locale_encoding, L"utf-8"); #else const char *encoding = nl_langinfo(CODESET); if (!encoding || encoding[0] == '\0') { @@ -1407,7 +1422,8 @@ config_get_locale_encoding(wchar_t **locale_encoding) "nl_langinfo(CODESET) failed"); } /* nl_langinfo(CODESET) is decoded by Py_DecodeLocale() */ - return CONFIG_DECODE_LOCALE(locale_encoding, encoding, + return CONFIG_DECODE_LOCALE(config, + locale_encoding, encoding, "nl_langinfo(CODESET)"); #endif } @@ -1422,7 +1438,7 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* If Py_SetStandardStreamEncoding() have been called, use these parameters. */ if (config->stdio_encoding == NULL && _Py_StandardStreamEncoding != NULL) { - err = CONFIG_DECODE_LOCALE(&config->stdio_encoding, + err = CONFIG_DECODE_LOCALE(config, &config->stdio_encoding, _Py_StandardStreamEncoding, "_Py_StandardStreamEncoding"); if (_Py_INIT_FAILED(err)) { @@ -1431,7 +1447,7 @@ config_init_stdio_encoding(_PyCoreConfig *config, } if (config->stdio_errors == NULL && _Py_StandardStreamErrors != NULL) { - err = CONFIG_DECODE_LOCALE(&config->stdio_errors, + err = CONFIG_DECODE_LOCALE(config, &config->stdio_errors, _Py_StandardStreamErrors, "_Py_StandardStreamErrors"); if (_Py_INIT_FAILED(err)) { @@ -1463,7 +1479,7 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* Does PYTHONIOENCODING contain an encoding? */ if (pythonioencoding[0]) { if (config->stdio_encoding == NULL) { - err = CONFIG_DECODE_LOCALE(&config->stdio_encoding, + err = CONFIG_DECODE_LOCALE(config, &config->stdio_encoding, pythonioencoding, "PYTHONIOENCODING environment variable"); if (_Py_INIT_FAILED(err)) { @@ -1482,7 +1498,7 @@ config_init_stdio_encoding(_PyCoreConfig *config, } if (config->stdio_errors == NULL && errors != NULL) { - err = CONFIG_DECODE_LOCALE(&config->stdio_errors, + err = CONFIG_DECODE_LOCALE(config, &config->stdio_errors, errors, "PYTHONIOENCODING environment variable"); if (_Py_INIT_FAILED(err)) { @@ -1497,13 +1513,13 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* UTF-8 Mode uses UTF-8/surrogateescape */ if (preconfig->utf8_mode) { if (config->stdio_encoding == NULL) { - err = _PyCoreConfig_SetString(&config->stdio_encoding, L"utf-8"); + err = _PyCoreConfig_SetString(config, &config->stdio_encoding, L"utf-8"); if (_Py_INIT_FAILED(err)) { return err; } } if (config->stdio_errors == NULL) { - err = _PyCoreConfig_SetString(&config->stdio_errors, + err = _PyCoreConfig_SetString(config, &config->stdio_errors, L"surrogateescape"); if (_Py_INIT_FAILED(err)) { return err; @@ -1513,7 +1529,7 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* Choose the default error handler based on the current locale. */ if (config->stdio_encoding == NULL) { - err = config_get_locale_encoding(&config->stdio_encoding); + err = config_get_locale_encoding(config, &config->stdio_encoding); if (_Py_INIT_FAILED(err)) { return err; } @@ -1522,7 +1538,7 @@ config_init_stdio_encoding(_PyCoreConfig *config, const wchar_t *errors = config_get_stdio_errors(config); assert(errors != NULL); - err = _PyCoreConfig_SetString(&config->stdio_errors, errors); + err = _PyCoreConfig_SetString(config, &config->stdio_errors, errors); if (_Py_INIT_FAILED(err)) { return err; } @@ -1539,34 +1555,35 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) if (config->filesystem_encoding == NULL) { #ifdef _Py_FORCE_UTF8_FS_ENCODING - err = _PyCoreConfig_SetString(&config->filesystem_encoding, L"utf-8"); + err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, L"utf-8"); #else #ifdef MS_WINDOWS if (preconfig->legacy_windows_fs_encoding) { /* Legacy Windows filesystem encoding: mbcs/replace */ - err = _PyCoreConfig_SetString(&config->filesystem_encoding, + err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, L"mbcs"); } else #endif if (preconfig->utf8_mode) { - err = _PyCoreConfig_SetString(&config->filesystem_encoding, + err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, L"utf-8"); } #ifndef MS_WINDOWS else if (_Py_GetForceASCII()) { - err = _PyCoreConfig_SetString(&config->filesystem_encoding, + err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, L"ascii"); } #endif else { #ifdef MS_WINDOWS /* Windows defaults to utf-8/surrogatepass (PEP 529). */ - err = _PyCoreConfig_SetString(&config->filesystem_encoding, + err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, L"utf-8"); #else - err = config_get_locale_encoding(&config->filesystem_encoding); + err = config_get_locale_encoding(config, + &config->filesystem_encoding); #endif } #endif /* !_Py_FORCE_UTF8_FS_ENCODING */ @@ -1588,7 +1605,7 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) #else errors = L"surrogateescape"; #endif - err = _PyCoreConfig_SetString(&config->filesystem_errors, errors); + err = _PyCoreConfig_SetString(config, &config->filesystem_errors, errors); if (_Py_INIT_FAILED(err)) { return err; } @@ -1681,7 +1698,7 @@ config_read(_PyCoreConfig *config) } if (config->check_hash_pycs_mode == NULL) { - err = _PyCoreConfig_SetString(&config->check_hash_pycs_mode, + err = _PyCoreConfig_SetString(config, &config->check_hash_pycs_mode, L"default"); if (_Py_INIT_FAILED(err)) { return err; @@ -1832,7 +1849,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, || wcscmp(_PyOS_optarg, L"never") == 0 || wcscmp(_PyOS_optarg, L"default") == 0) { - err = _PyCoreConfig_SetString(&config->check_hash_pycs_mode, + err = _PyCoreConfig_SetString(config, &config->check_hash_pycs_mode, _PyOS_optarg); if (_Py_INIT_FAILED(err)) { return err; @@ -1966,7 +1983,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, /* Get warning options from PYTHONWARNINGS environment variable. */ static _PyInitError -config_init_env_warnoptions(const _PyCoreConfig *config, _PyWstrList *warnoptions) +config_init_env_warnoptions(_PyCoreConfig *config, _PyWstrList *warnoptions) { _PyInitError err; /* CONFIG_GET_ENV_DUP requires dest to be initialized to NULL */ @@ -2136,8 +2153,7 @@ core_read_precmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) } _PyPreConfig preconfig; - _PyPreConfig_Init(&preconfig); - _PyPreConfig_Copy(&preconfig, &_PyRuntime.preconfig); + _PyPreConfig_InitFromPreConfig(&preconfig, &_PyRuntime.preconfig); _PyPreConfig_GetCoreConfig(&preconfig, config); @@ -2211,24 +2227,11 @@ config_read_cmdline(_PyCoreConfig *config) _PyInitError _PyCoreConfig_SetPyArgv(_PyCoreConfig *config, const _PyArgv *args) { - if (args->use_bytes_argv) { - _PyInitError err; - - err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; - } - _PyRuntimeState *runtime = &_PyRuntime; - - /* do nothing if Python is already pre-initialized: - _PyCoreConfig_Write() will update _PyRuntime.preconfig later */ - if (!runtime->pre_initialized) { - err = _Py_PreInitializeFromCoreConfig(config, args); - if (_Py_INIT_FAILED(err)) { - return err; - } - } + _PyInitError err = _Py_PreInitializeFromCoreConfig(config, args); + if (_Py_INIT_FAILED(err)) { + return err; } + return _PyArgv_AsWstrList(args, &config->argv); } @@ -2236,7 +2239,7 @@ _PyCoreConfig_SetPyArgv(_PyCoreConfig *config, const _PyArgv *args) /* Set config.argv: decode argv using Py_DecodeLocale(). Pre-initialize Python if needed to ensure that encodings are properly configured. */ _PyInitError -_PyCoreConfig_SetArgv(_PyCoreConfig *config, Py_ssize_t argc, char **argv) +_PyCoreConfig_SetArgv(_PyCoreConfig *config, Py_ssize_t argc, char * const *argv) { _PyArgv args = { .argc = argc, @@ -2248,7 +2251,7 @@ _PyCoreConfig_SetArgv(_PyCoreConfig *config, Py_ssize_t argc, char **argv) _PyInitError -_PyCoreConfig_SetWideArgv(_PyCoreConfig *config, Py_ssize_t argc, wchar_t **argv) +_PyCoreConfig_SetWideArgv(_PyCoreConfig *config, Py_ssize_t argc, wchar_t * const *argv) { _PyArgv args = { .argc = argc, diff --git a/Python/preconfig.c b/Python/preconfig.c index 0f4bd8ece534..71a6ee6c072e 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -95,7 +95,7 @@ _PyArgv_AsWstrList(const _PyArgv *args, _PyWstrList *list) } else { wargv.length = args->argc; - wargv.items = args->wchar_argv; + wargv.items = (wchar_t **)args->wchar_argv; if (_PyWstrList_Copy(list, &wargv) < 0) { return _Py_INIT_NO_MEMORY(); } @@ -217,16 +217,15 @@ precmdline_parse_cmdline(_PyPreCmdline *cmdline) _PyInitError -_PyPreCmdline_Read(_PyPreCmdline *cmdline, - const _PyPreConfig *preconfig) +_PyPreCmdline_Read(_PyPreCmdline *cmdline, const _PyPreConfig *preconfig) { - if (preconfig) { - _PyPreCmdline_GetPreConfig(cmdline, preconfig); - } + _PyPreCmdline_GetPreConfig(cmdline, preconfig); - _PyInitError err = precmdline_parse_cmdline(cmdline); - if (_Py_INIT_FAILED(err)) { - return err; + if (preconfig->parse_argv) { + _PyInitError err = precmdline_parse_cmdline(cmdline); + if (_Py_INIT_FAILED(err)) { + return err; + } } /* isolated, use_environment */ @@ -268,6 +267,7 @@ _PyPreConfig_Init(_PyPreConfig *config) memset(config, 0, sizeof(*config)); config->_config_version = _Py_CONFIG_VERSION; + config->parse_argv = 0; config->isolated = -1; config->use_environment = -1; config->configure_locale = 1; @@ -285,6 +285,7 @@ _PyPreConfig_InitPythonConfig(_PyPreConfig *config) { _PyPreConfig_Init(config); + config->parse_argv = 1; /* Set to -1 to enable C locale coercion (PEP 538) and UTF-8 Mode (PEP 540) depending on the LC_CTYPE locale, PYTHONUTF8 and PYTHONCOERCECLOCALE environment variables. */ @@ -310,11 +311,41 @@ _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config) } +void +_PyPreConfig_InitFromPreConfig(_PyPreConfig *config, + const _PyPreConfig *config2) +{ + _PyPreConfig_Init(config); + _PyPreConfig_Copy(config, config2); +} + + +void +_PyPreConfig_InitFromCoreConfig(_PyPreConfig *config, + const _PyCoreConfig *coreconfig) +{ + _PyCoreConfigInitEnum config_init = (_PyCoreConfigInitEnum)coreconfig->_config_init; + switch (config_init) { + case _PyCoreConfig_INIT_PYTHON: + _PyPreConfig_InitPythonConfig(config); + break; + case _PyCoreConfig_INIT_ISOLATED: + _PyPreConfig_InitIsolatedConfig(config); + break; + case _PyCoreConfig_INIT: + default: + _PyPreConfig_Init(config); + } + _PyPreConfig_GetCoreConfig(config, coreconfig); +} + + void _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) { #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR + COPY_ATTR(parse_argv); COPY_ATTR(isolated); COPY_ATTR(use_environment); COPY_ATTR(configure_locale); @@ -341,27 +372,20 @@ _PyPreConfig_AsDict(const _PyPreConfig *config) return NULL; } -#define SET_ITEM(KEY, EXPR) \ +#define SET_ITEM_INT(ATTR) \ do { \ - PyObject *obj = (EXPR); \ + PyObject *obj = PyLong_FromLong(config->ATTR); \ if (obj == NULL) { \ goto fail; \ } \ - int res = PyDict_SetItemString(dict, (KEY), obj); \ + int res = PyDict_SetItemString(dict, #ATTR, obj); \ Py_DECREF(obj); \ if (res < 0) { \ goto fail; \ } \ } while (0) -#define SET_ITEM_INT(ATTR) \ - SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR)) -#define FROM_STRING(STR) \ - ((STR != NULL) ? \ - PyUnicode_FromString(STR) \ - : (Py_INCREF(Py_None), Py_None)) -#define SET_ITEM_STR(ATTR) \ - SET_ITEM(#ATTR, FROM_STRING(config->ATTR)) + SET_ITEM_INT(parse_argv); SET_ITEM_INT(isolated); SET_ITEM_INT(use_environment); SET_ITEM_INT(configure_locale); @@ -379,10 +403,7 @@ _PyPreConfig_AsDict(const _PyPreConfig *config) Py_DECREF(dict); return NULL; -#undef FROM_STRING -#undef SET_ITEM #undef SET_ITEM_INT -#undef SET_ITEM_STR } @@ -395,6 +416,7 @@ _PyPreConfig_GetCoreConfig(_PyPreConfig *config, config->ATTR = core_config->ATTR; \ } + COPY_ATTR(parse_argv); COPY_ATTR(isolated); COPY_ATTR(use_environment); COPY_ATTR(dev_mode); @@ -662,9 +684,11 @@ preconfig_init_allocator(_PyPreConfig *config) allocators to "malloc" (and not to "debug"). */ const char *envvar = _Py_GetEnv(config->use_environment, "PYTHONMALLOC"); if (envvar) { - if (_PyMem_GetAllocatorName(envvar, &config->allocator) < 0) { + PyMemAllocatorName name; + if (_PyMem_GetAllocatorName(envvar, &name) < 0) { return _Py_INIT_ERR("PYTHONMALLOC: unknown allocator"); } + config->allocator = (int)name; } } @@ -751,8 +775,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) /* Save the config to be able to restore it if encodings change */ _PyPreConfig save_config; - _PyPreConfig_Init(&save_config); - _PyPreConfig_Copy(&save_config, config); + _PyPreConfig_InitFromPreConfig(&save_config, config); /* Set LC_CTYPE to the user preferred locale */ if (config->configure_locale) { @@ -879,8 +902,9 @@ _PyPreConfig_Write(const _PyPreConfig *config) return _Py_INIT_OK(); } - if (config->allocator != PYMEM_ALLOCATOR_NOT_SET) { - if (_PyMem_SetupAllocators(config->allocator) < 0) { + PyMemAllocatorName name = (PyMemAllocatorName)config->allocator; + if (name != PYMEM_ALLOCATOR_NOT_SET) { + if (_PyMem_SetupAllocators(name) < 0) { return _Py_INIT_ERR("Unknown PYTHONMALLOC allocator"); } } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 0781dc8046b1..01f725f8f45a 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -691,6 +691,10 @@ _Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args) { _PyInitError err; + if (src_config == NULL) { + return _Py_INIT_ERR("preinitialization config is NULL"); + } + err = _PyRuntime_Initialize(); if (_Py_INIT_FAILED(err)) { return err; @@ -703,11 +707,7 @@ _Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args) } _PyPreConfig config; - _PyPreConfig_Init(&config); - - if (src_config) { - _PyPreConfig_Copy(&config, src_config); - } + _PyPreConfig_InitFromPreConfig(&config, src_config); err = _PyPreConfig_Read(&config, args); if (_Py_INIT_FAILED(err)) { @@ -751,21 +751,34 @@ _PyInitError _Py_PreInitializeFromCoreConfig(const _PyCoreConfig *coreconfig, const _PyArgv *args) { - _PyPreConfig config; - _PyPreConfig_Init(&config); - if (coreconfig != NULL) { - _PyPreConfig_GetCoreConfig(&config, coreconfig); + assert(coreconfig != NULL); + + _PyInitError err = _PyRuntime_Initialize(); + if (_Py_INIT_FAILED(err)) { + return err; + } + _PyRuntimeState *runtime = &_PyRuntime; + + if (runtime->pre_initialized) { + /* Already initialized: do nothing */ + return _Py_INIT_OK(); } - if (args == NULL && coreconfig != NULL && coreconfig->parse_argv) { + _PyPreConfig preconfig; + _PyPreConfig_InitFromCoreConfig(&preconfig, coreconfig); + + if (!coreconfig->parse_argv) { + return _Py_PreInitialize(&preconfig); + } + else if (args == NULL) { _PyArgv config_args = { .use_bytes_argv = 0, .argc = coreconfig->argv.length, .wchar_argv = coreconfig->argv.items}; - return _Py_PreInitializeFromPyArgv(&config, &config_args); + return _Py_PreInitializeFromPyArgv(&preconfig, &config_args); } else { - return _Py_PreInitializeFromPyArgv(&config, args); + return _Py_PreInitializeFromPyArgv(&preconfig, args); } } @@ -777,13 +790,11 @@ pyinit_coreconfig(_PyRuntimeState *runtime, const _PyArgv *args, PyInterpreterState **interp_p) { - _PyInitError err; + assert(src_config != NULL); - if (src_config) { - err = _PyCoreConfig_Copy(config, src_config); - if (_Py_INIT_FAILED(err)) { - return err; - } + _PyInitError err = _PyCoreConfig_Copy(config, src_config); + if (_Py_INIT_FAILED(err)) { + return err; } if (args) { @@ -995,6 +1006,10 @@ _Py_InitializeMain(void) static _PyInitError init_python(const _PyCoreConfig *config, const _PyArgv *args) { + if (config == NULL) { + return _Py_INIT_ERR("initialization config is NULL"); + } + _PyInitError err; err = _PyRuntime_Initialize(); @@ -1022,7 +1037,8 @@ init_python(const _PyCoreConfig *config, const _PyArgv *args) _PyInitError -_Py_InitializeFromArgs(const _PyCoreConfig *config, Py_ssize_t argc, char **argv) +_Py_InitializeFromArgs(const _PyCoreConfig *config, + Py_ssize_t argc, char * const *argv) { _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv}; return init_python(config, &args); @@ -1030,7 +1046,8 @@ _Py_InitializeFromArgs(const _PyCoreConfig *config, Py_ssize_t argc, char **argv _PyInitError -_Py_InitializeFromWideArgs(const _PyCoreConfig *config, Py_ssize_t argc, wchar_t **argv) +_Py_InitializeFromWideArgs(const _PyCoreConfig *config, + Py_ssize_t argc, wchar_t * const *argv) { _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv}; return init_python(config, &args); From webhook-mailer at python.org Mon May 20 08:02:22 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 May 2019 12:02:22 -0000 Subject: [Python-checkins] bpo-35721: Close socket pair if Popen in _UnixSubprocessTransport fails (GH-11553) Message-ID: https://github.com/python/cpython/commit/9932fd91e878b740704ff599522e945a4bbe2ae1 commit: 9932fd91e878b740704ff599522e945a4bbe2ae1 branch: master author: Niklas Fiekas committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-20T05:02:16-07:00 summary: bpo-35721: Close socket pair if Popen in _UnixSubprocessTransport fails (GH-11553) This slightly expands an existing test case `test_popen_error` to trigger a `ResourceWarning` and fixes it. https://bugs.python.org/issue35721 files: A Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst M Lib/asyncio/unix_events.py M Lib/test/test_asyncio/test_subprocess.py M Misc/ACKS diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 73d4bda7c234..1aa3b396086c 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -757,12 +757,18 @@ def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs): # other end). Notably this is needed on AIX, and works # just fine on other platforms. stdin, stdin_w = socket.socketpair() - self._proc = subprocess.Popen( - args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, - universal_newlines=False, bufsize=bufsize, **kwargs) - if stdin_w is not None: - stdin.close() - self._proc.stdin = open(stdin_w.detach(), 'wb', buffering=bufsize) + try: + self._proc = subprocess.Popen( + args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, + universal_newlines=False, bufsize=bufsize, **kwargs) + if stdin_w is not None: + stdin.close() + self._proc.stdin = open(stdin_w.detach(), 'wb', buffering=bufsize) + stdin_w = None + finally: + if stdin_w is not None: + stdin.close() + stdin_w.close() class AbstractChildWatcher: diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 3908aabf5a13..551974a1806a 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -468,9 +468,7 @@ def test_close_dont_kill_finished(self): isinstance(self, SubprocessFastWatcherTests)): asyncio.get_child_watcher()._callbacks.clear() - def test_popen_error(self): - # Issue #24763: check that the subprocess transport is closed - # when BaseSubprocessTransport fails + def _test_popen_error(self, stdin): if sys.platform == 'win32': target = 'asyncio.windows_utils.Popen' else: @@ -480,12 +478,23 @@ def test_popen_error(self): popen.side_effect = exc create = asyncio.create_subprocess_exec(sys.executable, '-c', - 'pass', loop=self.loop) + 'pass', stdin=stdin, + loop=self.loop) with warnings.catch_warnings(record=True) as warns: with self.assertRaises(exc): self.loop.run_until_complete(create) self.assertEqual(warns, []) + def test_popen_error(self): + # Issue #24763: check that the subprocess transport is closed + # when BaseSubprocessTransport fails + self._test_popen_error(stdin=None) + + def test_popen_error_with_stdin_pipe(self): + # Issue #35721: check that newly created socket pair is closed when + # Popen fails + self._test_popen_error(stdin=subprocess.PIPE) + def test_read_stdout_after_process_exit(self): async def execute(): diff --git a/Misc/ACKS b/Misc/ACKS index 8b3232551e1b..77f19909b300 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -486,6 +486,7 @@ Florian Festi John Feuerstein Carl Feynman Vincent Fiack +Niklas Fiekas Anastasia Filatova Tomer Filiba Segev Finer diff --git a/Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst b/Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst new file mode 100644 index 000000000000..5af4b1b89994 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst @@ -0,0 +1,3 @@ +Fix :meth:`asyncio.SelectorEventLoop.subprocess_exec()` leaks file descriptors +if ``Popen`` fails and called with ``stdin=subprocess.PIPE``. +Patch by Niklas Fiekas. From webhook-mailer at python.org Mon May 20 08:36:02 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 May 2019 12:36:02 -0000 Subject: [Python-checkins] bpo-35721: Close socket pair if Popen in _UnixSubprocessTransport fails (GH-11553) Message-ID: https://github.com/python/cpython/commit/3887932e1099931801876d53d05e25a43c3473b7 commit: 3887932e1099931801876d53d05e25a43c3473b7 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-20T05:35:56-07:00 summary: bpo-35721: Close socket pair if Popen in _UnixSubprocessTransport fails (GH-11553) This slightly expands an existing test case `test_popen_error` to trigger a `ResourceWarning` and fixes it. https://bugs.python.org/issue35721 (cherry picked from commit 9932fd91e878b740704ff599522e945a4bbe2ae1) Co-authored-by: Niklas Fiekas files: A Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst M Lib/asyncio/unix_events.py M Lib/test/test_asyncio/test_subprocess.py M Misc/ACKS diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 639300f976ab..a05ebfd51ba2 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -758,12 +758,18 @@ def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs): # other end). Notably this is needed on AIX, and works # just fine on other platforms. stdin, stdin_w = socket.socketpair() - self._proc = subprocess.Popen( - args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, - universal_newlines=False, bufsize=bufsize, **kwargs) - if stdin_w is not None: - stdin.close() - self._proc.stdin = open(stdin_w.detach(), 'wb', buffering=bufsize) + try: + self._proc = subprocess.Popen( + args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, + universal_newlines=False, bufsize=bufsize, **kwargs) + if stdin_w is not None: + stdin.close() + self._proc.stdin = open(stdin_w.detach(), 'wb', buffering=bufsize) + stdin_w = None + finally: + if stdin_w is not None: + stdin.close() + stdin_w.close() class AbstractChildWatcher: diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 235813aa977c..eeb6a73ffdad 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -463,9 +463,7 @@ def test_close_dont_kill_finished(self): isinstance(self, SubprocessFastWatcherTests)): asyncio.get_child_watcher()._callbacks.clear() - def test_popen_error(self): - # Issue #24763: check that the subprocess transport is closed - # when BaseSubprocessTransport fails + def _test_popen_error(self, stdin): if sys.platform == 'win32': target = 'asyncio.windows_utils.Popen' else: @@ -475,12 +473,23 @@ def test_popen_error(self): popen.side_effect = exc create = asyncio.create_subprocess_exec(sys.executable, '-c', - 'pass', loop=self.loop) + 'pass', stdin=stdin, + loop=self.loop) with warnings.catch_warnings(record=True) as warns: with self.assertRaises(exc): self.loop.run_until_complete(create) self.assertEqual(warns, []) + def test_popen_error(self): + # Issue #24763: check that the subprocess transport is closed + # when BaseSubprocessTransport fails + self._test_popen_error(stdin=None) + + def test_popen_error_with_stdin_pipe(self): + # Issue #35721: check that newly created socket pair is closed when + # Popen fails + self._test_popen_error(stdin=subprocess.PIPE) + def test_read_stdout_after_process_exit(self): async def execute(): diff --git a/Misc/ACKS b/Misc/ACKS index 2d887bcb6a0f..5ca2ccf0b252 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -479,6 +479,7 @@ Florian Festi John Feuerstein Carl Feynman Vincent Fiack +Niklas Fiekas Anastasia Filatova Tomer Filiba Segev Finer diff --git a/Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst b/Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst new file mode 100644 index 000000000000..5af4b1b89994 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst @@ -0,0 +1,3 @@ +Fix :meth:`asyncio.SelectorEventLoop.subprocess_exec()` leaks file descriptors +if ``Popen`` fails and called with ``stdin=subprocess.PIPE``. +Patch by Niklas Fiekas. From webhook-mailer at python.org Mon May 20 10:38:54 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 20 May 2019 14:38:54 -0000 Subject: [Python-checkins] bpo-36763: Fix encoding/locale tests in test_embed (GH-13443) Message-ID: https://github.com/python/cpython/commit/425717fee1c72df464c9f85b9a8d32b9197d1035 commit: 425717fee1c72df464c9f85b9a8d32b9197d1035 branch: master author: Victor Stinner committer: GitHub date: 2019-05-20T16:38:48+02:00 summary: bpo-36763: Fix encoding/locale tests in test_embed (GH-13443) * Fix encoding and locale tests in test_embed.InitConfigTests. * InitConfigTests now only computes EXPECTED_CONFIG once. * Add tests for PYTHONWARNINGS and PYTHONPATH env vars files: M Lib/test/test_embed.py M Programs/_testembed.c diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 5be179a266ba..4fe005dfa130 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -296,6 +296,8 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): }) PYTHON_PRE_CONFIG = dict(DEFAULT_PRE_CONFIG, parse_argv=1, + coerce_c_locale=GET_DEFAULT_CONFIG, + utf8_mode=GET_DEFAULT_CONFIG, ) ISOLATED_PRE_CONFIG = dict(DEFAULT_PRE_CONFIG, configure_locale=0, @@ -303,6 +305,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): use_environment=0, utf8_mode=0, dev_mode=0, + coerce_c_locale=0, ) COPY_PRE_CONFIG = [ @@ -435,6 +438,8 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_LegacyWindowsStdioFlag', 'legacy_windows_stdio'), )) + EXPECTED_CONFIG = None + def main_xoptions(self, xoptions_list): xoptions = {} for opt in xoptions_list: @@ -445,37 +450,15 @@ def main_xoptions(self, xoptions_list): xoptions[opt] = True return xoptions - def get_expected_config(self, expected_preconfig, expected, env, api, - add_path=None): - if api == CONFIG_INIT_PYTHON: - default_config = self.PYTHON_CORE_CONFIG - elif api == CONFIG_INIT_ISOLATED: - default_config = self.ISOLATED_CORE_CONFIG - else: - default_config = self.DEFAULT_CORE_CONFIG - expected = dict(default_config, **expected) - expected['_config_init'] = api - + def _get_expected_config(self, env): code = textwrap.dedent(''' import json import sys import _testinternalcapi configs = _testinternalcapi.get_configs() - core_config = configs['core_config'] - data = { - 'stdio_encoding': sys.stdout.encoding, - 'stdio_errors': sys.stdout.errors, - 'prefix': sys.prefix, - 'base_prefix': sys.base_prefix, - 'exec_prefix': sys.exec_prefix, - 'base_exec_prefix': sys.base_exec_prefix, - 'filesystem_encoding': sys.getfilesystemencoding(), - 'filesystem_errors': sys.getfilesystemencodeerrors(), - 'module_search_paths': core_config['module_search_paths'], - } - - data = json.dumps(data) + + data = json.dumps(configs) data = data.encode('utf-8') sys.stdout.buffer.write(data) sys.stdout.buffer.flush() @@ -484,10 +467,6 @@ def get_expected_config(self, expected_preconfig, expected, env, api, # Use -S to not import the site module: get the proper configuration # when test_embed is run from a venv (bpo-35313) args = [sys.executable, '-S', '-c', code] - env = dict(env) - if not expected['isolated']: - env['PYTHONCOERCECLOCALE'] = '0' - env['PYTHONUTF8'] = '0' proc = subprocess.run(args, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) @@ -496,10 +475,46 @@ def get_expected_config(self, expected_preconfig, expected, env, api, f"stdout={proc.stdout!r} stderr={proc.stderr!r}") stdout = proc.stdout.decode('utf-8') try: - config = json.loads(stdout) + return json.loads(stdout) except json.JSONDecodeError: self.fail(f"fail to decode stdout: {stdout!r}") + def get_expected_config(self, expected_preconfig, expected, env, api, + add_path=None): + cls = self.__class__ + if cls.EXPECTED_CONFIG is None: + cls.EXPECTED_CONFIG = self._get_expected_config(env) + configs = {key: dict(value) + for key, value in self.EXPECTED_CONFIG.items()} + + pre_config = configs['pre_config'] + for key, value in expected_preconfig.items(): + if value is self.GET_DEFAULT_CONFIG: + expected_preconfig[key] = pre_config[key] + + if not expected_preconfig['configure_locale'] or api == CONFIG_INIT: + # there is no easy way to get the locale encoding before + # setlocale(LC_CTYPE, "") is called: don't test encodings + for key in ('filesystem_encoding', 'filesystem_errors', + 'stdio_encoding', 'stdio_errors'): + expected[key] = self.IGNORE_CONFIG + + if not expected_preconfig['configure_locale']: + # UTF-8 Mode depends on the locale. There is no easy way + # to guess if UTF-8 Mode will be enabled or not if the locale + # is not configured. + expected_preconfig['utf8_mode'] = self.IGNORE_CONFIG + + if expected_preconfig['utf8_mode'] == 1: + if expected['filesystem_encoding'] is self.GET_DEFAULT_CONFIG: + expected['filesystem_encoding'] = 'utf-8' + if expected['filesystem_errors'] is self.GET_DEFAULT_CONFIG: + expected['filesystem_errors'] = self.UTF8_MODE_ERRORS + if expected['stdio_encoding'] is self.GET_DEFAULT_CONFIG: + expected['stdio_encoding'] = 'utf-8' + if expected['stdio_errors'] is self.GET_DEFAULT_CONFIG: + expected['stdio_errors'] = 'surrogateescape' + if expected['executable'] is self.GET_DEFAULT_CONFIG: if sys.platform == 'win32': expected['executable'] = self.test_exe @@ -511,24 +526,28 @@ def get_expected_config(self, expected_preconfig, expected, env, api, if expected['program_name'] is self.GET_DEFAULT_CONFIG: expected['program_name'] = './_testembed' + core_config = configs['core_config'] for key, value in expected.items(): if value is self.GET_DEFAULT_CONFIG: - expected[key] = config[key] + expected[key] = core_config[key] + prepend_path = expected['module_search_path_env'] + if prepend_path is not None: + expected['module_search_paths'] = [prepend_path, *expected['module_search_paths']] if add_path is not None: - expected['module_search_paths'].append(add_path) - - if not expected_preconfig['configure_locale']: - # there is no easy way to get the locale encoding before - # setlocale(LC_CTYPE, "") is called: don't test encodings - for key in ('filesystem_encoding', 'filesystem_errors', - 'stdio_encoding', 'stdio_errors'): - expected[key] = self.IGNORE_CONFIG + expected['module_search_paths'] = [*expected['module_search_paths'], add_path] - return expected + for key in self.COPY_PRE_CONFIG: + if key not in expected_preconfig: + expected_preconfig[key] = expected[key] def check_pre_config(self, config, expected): - self.assertEqual(config['pre_config'], expected) + pre_config = dict(config['pre_config']) + for key, value in list(expected.items()): + if value is self.IGNORE_CONFIG: + del pre_config[key] + del expected[key] + self.assertEqual(pre_config, expected) def check_core_config(self, config, expected): core_config = dict(config['core_config']) @@ -567,10 +586,6 @@ def check_config(self, testname, expected_config=None, expected_preconfig=None, for key in list(env): if key.startswith('PYTHON'): del env[key] - # Disable C locale coercion and UTF-8 mode to not depend - # on the current locale - env['PYTHONCOERCECLOCALE'] = '0' - env['PYTHONUTF8'] = '0' if api == CONFIG_INIT_ISOLATED: default_preconfig = self.ISOLATED_PRE_CONFIG @@ -583,12 +598,19 @@ def check_config(self, testname, expected_config=None, expected_preconfig=None, expected_preconfig = dict(default_preconfig, **expected_preconfig) if expected_config is None: expected_config = {} - expected_config = self.get_expected_config(expected_preconfig, - expected_config, env, - api, add_path) - for key in self.COPY_PRE_CONFIG: - if key not in expected_preconfig: - expected_preconfig[key] = expected_config[key] + + if api == CONFIG_INIT_PYTHON: + default_config = self.PYTHON_CORE_CONFIG + elif api == CONFIG_INIT_ISOLATED: + default_config = self.ISOLATED_CORE_CONFIG + else: + default_config = self.DEFAULT_CORE_CONFIG + expected_config = dict(default_config, **expected_config) + expected_config['_config_init'] = api + + self.get_expected_config(expected_preconfig, + expected_config, env, + api, add_path) out, err = self.run_embedded_interpreter(testname, env=env) if stderr is None and not expected_config['verbose']: @@ -624,10 +646,6 @@ def test_init_global_config(self): 'quiet': 1, 'buffered_stdio': 0, - 'stdio_encoding': 'utf-8', - 'stdio_errors': 'surrogateescape', - 'filesystem_encoding': 'utf-8', - 'filesystem_errors': self.UTF8_MODE_ERRORS, 'user_site_directory': 0, 'pathconfig_warnings': 0, } @@ -650,8 +668,6 @@ def test_init_from_config(self): 'stdio_encoding': 'iso8859-1', 'stdio_errors': 'replace', - 'filesystem_encoding': 'utf-8', - 'filesystem_errors': self.UTF8_MODE_ERRORS, 'pycache_prefix': 'conf_pycache_prefix', 'program_name': './conf_program_name', @@ -679,43 +695,42 @@ def test_init_from_config(self): } self.check_config("init_from_config", config, preconfig) - INIT_ENV_PRECONFIG = { - 'allocator': PYMEM_ALLOCATOR_MALLOC, - } - INIT_ENV_CONFIG = { - 'use_hash_seed': 1, - 'hash_seed': 42, - 'tracemalloc': 2, - 'import_time': 1, - 'malloc_stats': 1, - 'inspect': 1, - 'optimization_level': 2, - 'pycache_prefix': 'env_pycache_prefix', - 'write_bytecode': 0, - 'verbose': 1, - 'buffered_stdio': 0, - 'stdio_encoding': 'iso8859-1', - 'stdio_errors': 'replace', - 'user_site_directory': 0, - 'faulthandler': 1, - } - def test_init_env(self): - self.check_config("init_env", self.INIT_ENV_CONFIG, self.INIT_ENV_PRECONFIG) + preconfig = { + 'allocator': PYMEM_ALLOCATOR_MALLOC, + } + config = { + 'use_hash_seed': 1, + 'hash_seed': 42, + 'tracemalloc': 2, + 'import_time': 1, + 'malloc_stats': 1, + 'inspect': 1, + 'optimization_level': 2, + 'module_search_path_env': '/my/path', + 'pycache_prefix': 'env_pycache_prefix', + 'write_bytecode': 0, + 'verbose': 1, + 'buffered_stdio': 0, + 'stdio_encoding': 'iso8859-1', + 'stdio_errors': 'replace', + 'user_site_directory': 0, + 'faulthandler': 1, + 'warnoptions': ['EnvVar'], + } + self.check_config("init_env", config, preconfig) def test_init_env_dev_mode(self): - preconfig = dict(self.INIT_ENV_PRECONFIG, - allocator=PYMEM_ALLOCATOR_DEBUG) - config = dict(self.INIT_ENV_CONFIG, - dev_mode=1, + preconfig = dict(allocator=PYMEM_ALLOCATOR_DEBUG) + config = dict(dev_mode=1, + faulthandler=1, warnoptions=['default']) self.check_config("init_env_dev_mode", config, preconfig) def test_init_env_dev_mode_alloc(self): - preconfig = dict(self.INIT_ENV_PRECONFIG, - allocator=PYMEM_ALLOCATOR_MALLOC) - config = dict(self.INIT_ENV_CONFIG, - dev_mode=1, + preconfig = dict(allocator=PYMEM_ALLOCATOR_MALLOC) + config = dict(dev_mode=1, + faulthandler=1, warnoptions=['default']) self.check_config("init_env_dev_mode_alloc", config, preconfig) @@ -800,6 +815,7 @@ def test_init_dont_configure_locale(self): # _PyPreConfig.configure_locale=0 preconfig = { 'configure_locale': 0, + 'coerce_c_locale': 0, } self.check_config("init_dont_configure_locale", {}, preconfig, api=CONFIG_INIT_PYTHON) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3dabf66de15a..bc549369393f 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -568,7 +568,7 @@ static int test_init_dont_parse_argv(void) } -static void set_all_env_vars(void) +static void set_most_env_vars(void) { putenv("PYTHONHASHSEED=42"); putenv("PYTHONMALLOC=malloc"); @@ -585,13 +585,15 @@ static void set_all_env_vars(void) putenv("PYTHONNOUSERSITE=1"); putenv("PYTHONFAULTHANDLER=1"); putenv("PYTHONIOENCODING=iso8859-1:replace"); - /* FIXME: test PYTHONWARNINGS */ - /* FIXME: test PYTHONEXECUTABLE */ - /* FIXME: test PYTHONHOME */ - /* FIXME: test PYTHONDEBUG */ - /* FIXME: test PYTHONDUMPREFS */ - /* FIXME: test PYTHONCOERCECLOCALE */ - /* FIXME: test PYTHONPATH */ +} + + +static void set_all_env_vars(void) +{ + set_most_env_vars(); + + putenv("PYTHONWARNINGS=EnvVar"); + putenv("PYTHONPATH=/my/path"); } @@ -609,7 +611,6 @@ static int test_init_env(void) static void set_all_env_vars_dev_mode(void) { - set_all_env_vars(); putenv("PYTHONMALLOC="); putenv("PYTHONFAULTHANDLER="); putenv("PYTHONDEVMODE=1"); From webhook-mailer at python.org Mon May 20 10:39:00 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Mon, 20 May 2019 14:39:00 -0000 Subject: [Python-checkins] Pass _asyncio_internal=True into stream tests on windows (#13442) Message-ID: https://github.com/python/cpython/commit/45a24b85f328ad07296123ebc994553983c7a915 commit: 45a24b85f328ad07296123ebc994553983c7a915 branch: master author: Andrew Svetlov committer: GitHub date: 2019-05-20T17:38:57+03:00 summary: Pass _asyncio_internal=True into stream tests on windows (#13442) files: M Lib/test/test_asyncio/test_windows_events.py diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py index 05f85159be0c..e201a0696796 100644 --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -100,9 +100,11 @@ def test_pipe(self): clients = [] for i in range(5): - stream_reader = asyncio.StreamReader(loop=self.loop) + stream_reader = asyncio.StreamReader(loop=self.loop, + _asyncio_internal=True) protocol = asyncio.StreamReaderProtocol(stream_reader, - loop=self.loop) + loop=self.loop, + _asyncio_internal=True) trans, proto = await self.loop.create_pipe_connection( lambda: protocol, ADDRESS) self.assertIsInstance(trans, asyncio.Transport) From webhook-mailer at python.org Mon May 20 11:06:33 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 20 May 2019 15:06:33 -0000 Subject: [Python-checkins] bpo-22865: Expand on documentation for the pty.spawn function (GH-11980) Message-ID: https://github.com/python/cpython/commit/522ccef8690970fc4f78f51a3adb995f2547871a commit: 522ccef8690970fc4f78f51a3adb995f2547871a branch: master author: Geoff Shannon committer: Victor Stinner date: 2019-05-20T17:06:16+02:00 summary: bpo-22865: Expand on documentation for the pty.spawn function (GH-11980) files: A Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst M Doc/library/pty.rst M Misc/ACKS diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst index 0ab766065d6e..12268437d07e 100644 --- a/Doc/library/pty.rst +++ b/Doc/library/pty.rst @@ -43,11 +43,32 @@ The :mod:`pty` module defines the following functions: Spawn a process, and connect its controlling terminal with the current process's standard io. This is often used to baffle programs which insist on - reading from the controlling terminal. + reading from the controlling terminal. It is expected that the process + spawned behind the pty will eventually terminate, and when it does *spawn* + will return. + + The functions *master_read* and *stdin_read* are passed a file descriptor + which they should read from, and they should always return a byte string. In + order to force spawn to return before the child process exits an + :exc:`OSError` should be thrown. + + The default implementation for both functions will read and return up to 1024 + bytes each time the function is called. The *master_read* callback is passed + the pseudoterminal?s master file descriptor to read output from the child + process, and *stdin_read* is passed file descriptor 0, to read from the + parent process's standard input. + + Returning an empty byte string from either callback is interpreted as an + end-of-file (EOF) condition, and that callback will not be called after + that. If *stdin_read* signals EOF the controlling terminal can no longer + communicate with the parent process OR the child process. Unless the child + process will quit without any input, *spawn* will then loop forever. If + *master_read* signals EOF the same behavior results (on linux at least). + + If both callbacks signal EOF then *spawn* will probably never return, unless + *select* throws an error on your platform when passed three empty lists. This + is a bug, documented in `issue 26228 `_. - The functions *master_read* and *stdin_read* should be functions which read from - a file descriptor. The defaults try to read 1024 bytes each time they are - called. .. versionchanged:: 3.4 :func:`spawn` now returns the status value from :func:`os.waitpid` diff --git a/Misc/ACKS b/Misc/ACKS index 77f19909b300..f9d01d008679 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1859,3 +1859,4 @@ Zheao Li Carsten Klein Diego Rojas Edison Abahurire +Geoff Shannon diff --git a/Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst b/Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst new file mode 100644 index 000000000000..67a4ed26bede --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst @@ -0,0 +1 @@ +Add detail to the documentation on the `pty.spawn` function. \ No newline at end of file From webhook-mailer at python.org Mon May 20 11:16:55 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 20 May 2019 15:16:55 -0000 Subject: [Python-checkins] bpo-36763: Fix _PyRuntime.preconfig.coerce_c_locale (GH-13444) Message-ID: https://github.com/python/cpython/commit/0f72147ce2b3d65235b41eddc6a57be40237b5c7 commit: 0f72147ce2b3d65235b41eddc6a57be40237b5c7 branch: master author: Victor Stinner committer: GitHub date: 2019-05-20T17:16:38+02:00 summary: bpo-36763: Fix _PyRuntime.preconfig.coerce_c_locale (GH-13444) _PyRuntime.preconfig.coerce_c_locale can now be used to check if the C locale has been coerced. * Fix _Py_LegacyLocaleDetected(): don't attempt to coerce the C locale if LC_ALL environment variable is set. Add 'warn' parameter: emit_stderr_warning_for_legacy_locale() must not the LC_ALL env var. * _PyPreConfig_Write() sets coerce_c_locale to 0 if _Py_CoerceLegacyLocale() fails. files: M Include/cpython/pylifecycle.h M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 1e1dabe59ff5..ba5666465d7e 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -69,8 +69,8 @@ PyAPI_FUNC(int) _PyOS_URandom(void *buffer, Py_ssize_t size); PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size); /* Legacy locale support */ -PyAPI_FUNC(void) _Py_CoerceLegacyLocale(int warn); -PyAPI_FUNC(int) _Py_LegacyLocaleDetected(void); +PyAPI_FUNC(int) _Py_CoerceLegacyLocale(int warn); +PyAPI_FUNC(int) _Py_LegacyLocaleDetected(int warn); PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category); #ifdef __cplusplus diff --git a/Python/preconfig.c b/Python/preconfig.c index 71a6ee6c072e..4df6208cadb8 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -660,7 +660,7 @@ preconfig_init_coerce_c_locale(_PyPreConfig *config) It is only coerced if if the LC_CTYPE locale is "C". */ if (config->coerce_c_locale < 0 || config->coerce_c_locale == 1) { /* The C locale enables the C locale coercion (PEP 538) */ - if (_Py_LegacyLocaleDetected()) { + if (_Py_LegacyLocaleDetected(0)) { config->coerce_c_locale = 2; } else { @@ -888,32 +888,38 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) - set the LC_CTYPE locale (coerce C locale, PEP 538) and set the UTF-8 mode (PEP 540) - If the memory allocator is changed, config is re-allocated with new - allocator. So calling _PyPreConfig_Clear(config) is safe after this call. + The applied configuration is written into _PyRuntime.preconfig. + If the C locale cannot be coerced, set coerce_c_locale to 0. Do nothing if called after Py_Initialize(): ignore the new pre-configuration. */ _PyInitError -_PyPreConfig_Write(const _PyPreConfig *config) +_PyPreConfig_Write(const _PyPreConfig *src_config) { + _PyPreConfig config; + _PyPreConfig_InitFromPreConfig(&config, src_config); + if (_PyRuntime.core_initialized) { /* bpo-34008: Calling this functions after Py_Initialize() ignores the new configuration. */ return _Py_INIT_OK(); } - PyMemAllocatorName name = (PyMemAllocatorName)config->allocator; + PyMemAllocatorName name = (PyMemAllocatorName)config.allocator; if (name != PYMEM_ALLOCATOR_NOT_SET) { if (_PyMem_SetupAllocators(name) < 0) { return _Py_INIT_ERR("Unknown PYTHONMALLOC allocator"); } } - _PyPreConfig_SetGlobalConfig(config); + _PyPreConfig_SetGlobalConfig(&config); - if (config->configure_locale) { - if (config->coerce_c_locale) { - _Py_CoerceLegacyLocale(config->coerce_c_locale_warn); + if (config.configure_locale) { + if (config.coerce_c_locale) { + if (!_Py_CoerceLegacyLocale(config.coerce_c_locale_warn)) { + /* C locale not coerced */ + config.coerce_c_locale = 0; + } } /* Set LC_CTYPE to the user preferred locale */ @@ -921,7 +927,7 @@ _PyPreConfig_Write(const _PyPreConfig *config) } /* Write the new pre-configuration into _PyRuntime */ - _PyPreConfig_Copy(&_PyRuntime.preconfig, config); + _PyPreConfig_Copy(&_PyRuntime.preconfig, &config); return _Py_INIT_OK(); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 01f725f8f45a..01344db410a0 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -231,9 +231,18 @@ init_importlib_external(PyInterpreterState *interp) */ int -_Py_LegacyLocaleDetected(void) +_Py_LegacyLocaleDetected(int warn) { #ifndef MS_WINDOWS + if (!warn) { + const char *locale_override = getenv("LC_ALL"); + if (locale_override != NULL && *locale_override != '\0') { + /* Don't coerce C locale if the LC_ALL environment variable + is set */ + return 0; + } + } + /* On non-Windows systems, the C locale is considered a legacy locale */ /* XXX (ncoghlan): some platforms (notably Mac OS X) don't appear to treat * the POSIX locale as a simple alias for the C locale, so @@ -257,7 +266,7 @@ static void emit_stderr_warning_for_legacy_locale(_PyRuntimeState *runtime) { const _PyPreConfig *preconfig = &runtime->preconfig; - if (preconfig->coerce_c_locale_warn && _Py_LegacyLocaleDetected()) { + if (preconfig->coerce_c_locale_warn && _Py_LegacyLocaleDetected(1)) { PySys_FormatStderr("%s", _C_LOCALE_WARNING); } } @@ -292,7 +301,7 @@ static const char C_LOCALE_COERCION_WARNING[] = "Python detected LC_CTYPE=C: LC_CTYPE coerced to %.20s (set another locale " "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior).\n"; -static void +static int _coerce_default_locale_settings(int warn, const _LocaleCoercionTarget *target) { const char *newloc = target->locale_name; @@ -304,7 +313,7 @@ _coerce_default_locale_settings(int warn, const _LocaleCoercionTarget *target) if (setenv("LC_CTYPE", newloc, 1)) { fprintf(stderr, "Error setting LC_CTYPE, skipping C locale coercion\n"); - return; + return 0; } if (warn) { fprintf(stderr, C_LOCALE_COERCION_WARNING, newloc); @@ -312,18 +321,20 @@ _coerce_default_locale_settings(int warn, const _LocaleCoercionTarget *target) /* Reconfigure with the overridden environment variables */ _Py_SetLocaleFromEnv(LC_ALL); + return 1; } #endif -void +int _Py_CoerceLegacyLocale(int warn) { + int coerced = 0; #ifdef PY_COERCE_C_LOCALE char *oldloc = NULL; oldloc = _PyMem_RawStrdup(setlocale(LC_CTYPE, NULL)); if (oldloc == NULL) { - return; + return coerced; } const char *locale_override = getenv("LC_ALL"); @@ -345,7 +356,7 @@ _Py_CoerceLegacyLocale(int warn) } #endif /* Successfully configured locale, so make it the default */ - _coerce_default_locale_settings(warn, target); + coerced = _coerce_default_locale_settings(warn, target); goto done; } } @@ -357,6 +368,7 @@ _Py_CoerceLegacyLocale(int warn) done: PyMem_RawFree(oldloc); #endif + return coerced; } /* _Py_SetLocaleFromEnv() is a wrapper around setlocale(category, "") to From webhook-mailer at python.org Mon May 20 12:19:59 2019 From: webhook-mailer at python.org (Lisa Roach) Date: Mon, 20 May 2019 16:19:59 -0000 Subject: [Python-checkins] bpo-26467: Adds AsyncMock for asyncio Mock library support (GH-9296) Message-ID: https://github.com/python/cpython/commit/77b3b7701a34ecf6316469e05b79bb91de2addfa commit: 77b3b7701a34ecf6316469e05b79bb91de2addfa branch: master author: Lisa Roach committer: GitHub date: 2019-05-20T09:19:53-07:00 summary: bpo-26467: Adds AsyncMock for asyncio Mock library support (GH-9296) files: A Lib/unittest/test/testmock/testasync.py A Misc/NEWS.d/next/Library/2018-09-13-20-33-24.bpo-26467.cahAk3.rst M Doc/library/unittest.mock.rst M Doc/whatsnew/3.8.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index ed00ee6d0c2d..21e4709f8160 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -201,9 +201,11 @@ The Mock Class .. testsetup:: + import asyncio + import inspect import unittest from unittest.mock import sentinel, DEFAULT, ANY - from unittest.mock import patch, call, Mock, MagicMock, PropertyMock + from unittest.mock import patch, call, Mock, MagicMock, PropertyMock, AsyncMock from unittest.mock import mock_open :class:`Mock` is a flexible mock object intended to replace the use of stubs and @@ -851,6 +853,217 @@ object:: >>> p.assert_called_once_with() +.. class:: AsyncMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs) + + An asynchronous version of :class:`Mock`. The :class:`AsyncMock` object will + behave so the object is recognized as an async function, and the result of a + call is an awaitable. + + >>> mock = AsyncMock() + >>> asyncio.iscoroutinefunction(mock) + True + >>> inspect.isawaitable(mock()) + True + + The result of ``mock()`` is an async function which will have the outcome + of ``side_effect`` or ``return_value``: + + - if ``side_effect`` is a function, the async function will return the + result of that function, + - if ``side_effect`` is an exception, the async function will raise the + exception, + - if ``side_effect`` is an iterable, the async function will return the + next value of the iterable, however, if the sequence of result is + exhausted, ``StopIteration`` is raised immediately, + - if ``side_effect`` is not defined, the async function will return the + value defined by ``return_value``, hence, by default, the async function + returns a new :class:`AsyncMock` object. + + + Setting the *spec* of a :class:`Mock` or :class:`MagicMock` to an async function + will result in a coroutine object being returned after calling. + + >>> async def async_func(): pass + ... + >>> mock = MagicMock(async_func) + >>> mock + + >>> mock() + + + .. method:: assert_awaited() + + Assert that the mock was awaited at least once. + + >>> mock = AsyncMock() + >>> async def main(): + ... await mock() + ... + >>> asyncio.run(main()) + >>> mock.assert_awaited() + >>> mock_2 = AsyncMock() + >>> mock_2.assert_awaited() + Traceback (most recent call last): + ... + AssertionError: Expected mock to have been awaited. + + .. method:: assert_awaited_once() + + Assert that the mock was awaited exactly once. + + >>> mock = AsyncMock() + >>> async def main(): + ... await mock() + ... + >>> asyncio.run(main()) + >>> mock.assert_awaited_once() + >>> asyncio.run(main()) + >>> mock.method.assert_awaited_once() + Traceback (most recent call last): + ... + AssertionError: Expected mock to have been awaited once. Awaited 2 times. + + .. method:: assert_awaited_with(*args, **kwargs) + + Assert that the last await was with the specified arguments. + + >>> mock = AsyncMock() + >>> async def main(*args, **kwargs): + ... await mock(*args, **kwargs) + ... + >>> asyncio.run(main('foo', bar='bar')) + >>> mock.assert_awaited_with('foo', bar='bar') + >>> mock.assert_awaited_with('other') + Traceback (most recent call last): + ... + AssertionError: expected call not found. + Expected: mock('other') + Actual: mock('foo', bar='bar') + + .. method:: assert_awaited_once_with(*args, **kwargs) + + Assert that the mock was awaited exactly once and with the specified + arguments. + + >>> mock = AsyncMock() + >>> async def main(*args, **kwargs): + ... await mock(*args, **kwargs) + ... + >>> asyncio.run(main('foo', bar='bar')) + >>> mock.assert_awaited_once_with('foo', bar='bar') + >>> asyncio.run(main('foo', bar='bar')) + >>> mock.assert_awaited_once_with('foo', bar='bar') + Traceback (most recent call last): + ... + AssertionError: Expected mock to have been awaited once. Awaited 2 times. + + .. method:: assert_any_await(*args, **kwargs) + + Assert the mock has ever been awaited with the specified arguments. + + >>> mock = AsyncMock() + >>> async def main(*args, **kwargs): + ... await mock(*args, **kwargs) + ... + >>> asyncio.run(main('foo', bar='bar')) + >>> asyncio.run(main('hello')) + >>> mock.assert_any_await('foo', bar='bar') + >>> mock.assert_any_await('other') + Traceback (most recent call last): + ... + AssertionError: mock('other') await not found + + .. method:: assert_has_awaits(calls, any_order=False) + + Assert the mock has been awaited with the specified calls. + The :attr:`await_args_list` list is checked for the awaits. + + If *any_order* is False (the default) then the awaits must be + sequential. There can be extra calls before or after the + specified awaits. + + If *any_order* is True then the awaits can be in any order, but + they must all appear in :attr:`await_args_list`. + + >>> mock = AsyncMock() + >>> async def main(*args, **kwargs): + ... await mock(*args, **kwargs) + ... + >>> calls = [call("foo"), call("bar")] + >>> mock.assert_has_calls(calls) + Traceback (most recent call last): + ... + AssertionError: Calls not found. + Expected: [call('foo'), call('bar')] + >>> asyncio.run(main('foo')) + >>> asyncio.run(main('bar')) + >>> mock.assert_has_calls(calls) + + .. method:: assert_not_awaited() + + Assert that the mock was never awaited. + + >>> mock = AsyncMock() + >>> mock.assert_not_awaited() + + .. method:: reset_mock(*args, **kwargs) + + See :func:`Mock.reset_mock`. Also sets :attr:`await_count` to 0, + :attr:`await_args` to None, and clears the :attr:`await_args_list`. + + .. attribute:: await_count + + An integer keeping track of how many times the mock object has been awaited. + + >>> mock = AsyncMock() + >>> async def main(): + ... await mock() + ... + >>> asyncio.run(main()) + >>> mock.await_count + 1 + >>> asyncio.run(main()) + >>> mock.await_count + 2 + + .. attribute:: await_args + + This is either ``None`` (if the mock hasn?t been awaited), or the arguments that + the mock was last awaited with. Functions the same as :attr:`Mock.call_args`. + + >>> mock = AsyncMock() + >>> async def main(*args): + ... await mock(*args) + ... + >>> mock.await_args + >>> asyncio.run(main('foo')) + >>> mock.await_args + call('foo') + >>> asyncio.run(main('bar')) + >>> mock.await_args + call('bar') + + + .. attribute:: await_args_list + + This is a list of all the awaits made to the mock object in sequence (so the + length of the list is the number of times it has been awaited). Before any + awaits have been made it is an empty list. + + >>> mock = AsyncMock() + >>> async def main(*args): + ... await mock(*args) + ... + >>> mock.await_args_list + [] + >>> asyncio.run(main('foo')) + >>> mock.await_args_list + [call('foo')] + >>> asyncio.run(main('bar')) + >>> mock.await_args_list + [call('foo'), call('bar')] + + Calling ~~~~~~~ diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 07da4047a383..0a79b6ce1a65 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -538,6 +538,10 @@ unicodedata unittest -------- +* XXX Added :class:`AsyncMock` to support an asynchronous version of :class:`Mock`. + Appropriate new assert functions for testing have been added as well. + (Contributed by Lisa Roach in :issue:`26467`). + * Added :func:`~unittest.addModuleCleanup()` and :meth:`~unittest.TestCase.addClassCleanup()` to unittest to support cleanups for :func:`~unittest.setUpModule()` and diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 47ed06c6f486..166c10037698 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -13,6 +13,7 @@ 'ANY', 'call', 'create_autospec', + 'AsyncMock', 'FILTER_DIR', 'NonCallableMock', 'NonCallableMagicMock', @@ -24,13 +25,13 @@ __version__ = '1.0' - +import asyncio import io import inspect import pprint import sys import builtins -from types import ModuleType, MethodType +from types import CodeType, ModuleType, MethodType from unittest.util import safe_repr from functools import wraps, partial @@ -43,6 +44,13 @@ # Without this, the __class__ properties wouldn't be set correctly _safe_super = super +def _is_async_obj(obj): + if getattr(obj, '__code__', None): + return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj) + else: + return False + + def _is_instance_mock(obj): # can't use isinstance on Mock objects because they override __class__ # The base class for all mocks is NonCallableMock @@ -355,7 +363,20 @@ def __new__(cls, *args, **kw): # every instance has its own class # so we can create magic methods on the # class without stomping on other mocks - new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__}) + bases = (cls,) + if not issubclass(cls, AsyncMock): + # Check if spec is an async object or function + sig = inspect.signature(NonCallableMock.__init__) + bound_args = sig.bind_partial(cls, *args, **kw).arguments + spec_arg = [ + arg for arg in bound_args.keys() + if arg.startswith('spec') + ] + if spec_arg: + # what if spec_set is different than spec? + if _is_async_obj(bound_args[spec_arg[0]]): + bases = (AsyncMockMixin, cls,) + new = type(cls.__name__, bases, {'__doc__': cls.__doc__}) instance = object.__new__(new) return instance @@ -431,6 +452,11 @@ def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False, _eat_self=False): _spec_class = None _spec_signature = None + _spec_asyncs = [] + + for attr in dir(spec): + if asyncio.iscoroutinefunction(getattr(spec, attr, None)): + _spec_asyncs.append(attr) if spec is not None and not _is_list(spec): if isinstance(spec, type): @@ -448,7 +474,7 @@ def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False, __dict__['_spec_set'] = spec_set __dict__['_spec_signature'] = _spec_signature __dict__['_mock_methods'] = spec - + __dict__['_spec_asyncs'] = _spec_asyncs def __get_return_value(self): ret = self._mock_return_value @@ -886,7 +912,15 @@ def _get_child_mock(self, **kw): For non-callable mocks the callable variant will be used (rather than any custom subclass).""" + _new_name = kw.get("_new_name") + if _new_name in self.__dict__['_spec_asyncs']: + return AsyncMock(**kw) + _type = type(self) + if issubclass(_type, MagicMock) and _new_name in _async_method_magics: + klass = AsyncMock + if issubclass(_type, AsyncMockMixin): + klass = MagicMock if not issubclass(_type, CallableMixin): if issubclass(_type, NonCallableMagicMock): klass = MagicMock @@ -932,14 +966,12 @@ def _try_iter(obj): return obj - class CallableMixin(Base): def __init__(self, spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, parent=None, _spec_state=None, _new_name='', _new_parent=None, **kwargs): self.__dict__['_mock_return_value'] = return_value - _safe_super(CallableMixin, self).__init__( spec, wraps, name, spec_set, parent, _spec_state, _new_name, _new_parent, **kwargs @@ -1081,7 +1113,6 @@ class or instance) that acts as the specification for the mock object. If """ - def _dot_lookup(thing, comp, import_path): try: return getattr(thing, comp) @@ -1279,8 +1310,10 @@ def __enter__(self): if isinstance(original, type): # If we're patching out a class and there is a spec inherit = True - - Klass = MagicMock + if spec is None and _is_async_obj(original): + Klass = AsyncMock + else: + Klass = MagicMock _kwargs = {} if new_callable is not None: Klass = new_callable @@ -1292,7 +1325,9 @@ def __enter__(self): not_callable = '__call__' not in this_spec else: not_callable = not callable(this_spec) - if not_callable: + if _is_async_obj(this_spec): + Klass = AsyncMock + elif not_callable: Klass = NonCallableMagicMock if spec is not None: @@ -1733,7 +1768,7 @@ def _patch_stopall(): '__reduce__', '__reduce_ex__', '__getinitargs__', '__getnewargs__', '__getstate__', '__setstate__', '__getformat__', '__setformat__', '__repr__', '__dir__', '__subclasses__', '__format__', - '__getnewargs_ex__', + '__getnewargs_ex__', '__aenter__', '__aexit__', '__anext__', '__aiter__', } @@ -1750,6 +1785,11 @@ def method(self, *args, **kw): ' '.join([magic_methods, numerics, inplace, right]).split() } +# Magic methods used for async `with` statements +_async_method_magics = {"__aenter__", "__aexit__", "__anext__"} +# `__aiter__` is a plain function but used with async calls +_async_magics = _async_method_magics | {"__aiter__"} + _all_magics = _magics | _non_defaults _unsupported_magics = { @@ -1779,6 +1819,7 @@ def method(self, *args, **kw): '__float__': 1.0, '__bool__': True, '__index__': 1, + '__aexit__': False, } @@ -1811,10 +1852,19 @@ def __iter__(): return iter(ret_val) return __iter__ +def _get_async_iter(self): + def __aiter__(): + ret_val = self.__aiter__._mock_return_value + if ret_val is DEFAULT: + return _AsyncIterator(iter([])) + return _AsyncIterator(iter(ret_val)) + return __aiter__ + _side_effect_methods = { '__eq__': _get_eq, '__ne__': _get_ne, '__iter__': _get_iter, + '__aiter__': _get_async_iter } @@ -1879,8 +1929,33 @@ def mock_add_spec(self, spec, spec_set=False): self._mock_set_magics() +class AsyncMagicMixin: + def __init__(self, *args, **kw): + self._mock_set_async_magics() # make magic work for kwargs in init + _safe_super(AsyncMagicMixin, self).__init__(*args, **kw) + self._mock_set_async_magics() # fix magic broken by upper level init + + def _mock_set_async_magics(self): + these_magics = _async_magics -class MagicMock(MagicMixin, Mock): + if getattr(self, "_mock_methods", None) is not None: + these_magics = _async_magics.intersection(self._mock_methods) + remove_magics = _async_magics - these_magics + + for entry in remove_magics: + if entry in type(self).__dict__: + # remove unneeded magic methods + delattr(self, entry) + + # don't overwrite existing attributes if called a second time + these_magics = these_magics - set(type(self).__dict__) + + _type = type(self) + for entry in these_magics: + setattr(_type, entry, MagicProxy(entry, self)) + + +class MagicMock(MagicMixin, AsyncMagicMixin, Mock): """ MagicMock is a subclass of Mock with default implementations of most of the magic methods. You can use MagicMock without having to @@ -1920,6 +1995,218 @@ def __get__(self, obj, _type=None): return self.create_mock() +class AsyncMockMixin(Base): + awaited = _delegating_property('awaited') + await_count = _delegating_property('await_count') + await_args = _delegating_property('await_args') + await_args_list = _delegating_property('await_args_list') + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # asyncio.iscoroutinefunction() checks _is_coroutine property to say if an + # object is a coroutine. Without this check it looks to see if it is a + # function/method, which in this case it is not (since it is an + # AsyncMock). + # It is set through __dict__ because when spec_set is True, this + # attribute is likely undefined. + self.__dict__['_is_coroutine'] = asyncio.coroutines._is_coroutine + self.__dict__['_mock_awaited'] = _AwaitEvent(self) + self.__dict__['_mock_await_count'] = 0 + self.__dict__['_mock_await_args'] = None + self.__dict__['_mock_await_args_list'] = _CallList() + code_mock = NonCallableMock(spec_set=CodeType) + code_mock.co_flags = inspect.CO_COROUTINE + self.__dict__['__code__'] = code_mock + + async def _mock_call(_mock_self, *args, **kwargs): + self = _mock_self + try: + result = super()._mock_call(*args, **kwargs) + except (BaseException, StopIteration) as e: + side_effect = self.side_effect + if side_effect is not None and not callable(side_effect): + raise + return await _raise(e) + + _call = self.call_args + + async def proxy(): + try: + if inspect.isawaitable(result): + return await result + else: + return result + finally: + self.await_count += 1 + self.await_args = _call + self.await_args_list.append(_call) + await self.awaited._notify() + + return await proxy() + + def assert_awaited(_mock_self): + """ + Assert that the mock was awaited at least once. + """ + self = _mock_self + if self.await_count == 0: + msg = f"Expected {self._mock_name or 'mock'} to have been awaited." + raise AssertionError(msg) + + def assert_awaited_once(_mock_self): + """ + Assert that the mock was awaited exactly once. + """ + self = _mock_self + if not self.await_count == 1: + msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once." + f" Awaited {self.await_count} times.") + raise AssertionError(msg) + + def assert_awaited_with(_mock_self, *args, **kwargs): + """ + Assert that the last await was with the specified arguments. + """ + self = _mock_self + if self.await_args is None: + expected = self._format_mock_call_signature(args, kwargs) + raise AssertionError(f'Expected await: {expected}\nNot awaited') + + def _error_message(): + msg = self._format_mock_failure_message(args, kwargs) + return msg + + expected = self._call_matcher((args, kwargs)) + actual = self._call_matcher(self.await_args) + if expected != actual: + cause = expected if isinstance(expected, Exception) else None + raise AssertionError(_error_message()) from cause + + def assert_awaited_once_with(_mock_self, *args, **kwargs): + """ + Assert that the mock was awaited exactly once and with the specified + arguments. + """ + self = _mock_self + if not self.await_count == 1: + msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once." + f" Awaited {self.await_count} times.") + raise AssertionError(msg) + return self.assert_awaited_with(*args, **kwargs) + + def assert_any_await(_mock_self, *args, **kwargs): + """ + Assert the mock has ever been awaited with the specified arguments. + """ + self = _mock_self + expected = self._call_matcher((args, kwargs)) + actual = [self._call_matcher(c) for c in self.await_args_list] + if expected not in actual: + cause = expected if isinstance(expected, Exception) else None + expected_string = self._format_mock_call_signature(args, kwargs) + raise AssertionError( + '%s await not found' % expected_string + ) from cause + + def assert_has_awaits(_mock_self, calls, any_order=False): + """ + Assert the mock has been awaited with the specified calls. + The :attr:`await_args_list` list is checked for the awaits. + + If `any_order` is False (the default) then the awaits must be + sequential. There can be extra calls before or after the + specified awaits. + + If `any_order` is True then the awaits can be in any order, but + they must all appear in :attr:`await_args_list`. + """ + self = _mock_self + expected = [self._call_matcher(c) for c in calls] + cause = expected if isinstance(expected, Exception) else None + all_awaits = _CallList(self._call_matcher(c) for c in self.await_args_list) + if not any_order: + if expected not in all_awaits: + raise AssertionError( + f'Awaits not found.\nExpected: {_CallList(calls)}\n', + f'Actual: {self.await_args_list}' + ) from cause + return + + all_awaits = list(all_awaits) + + not_found = [] + for kall in expected: + try: + all_awaits.remove(kall) + except ValueError: + not_found.append(kall) + if not_found: + raise AssertionError( + '%r not all found in await list' % (tuple(not_found),) + ) from cause + + def assert_not_awaited(_mock_self): + """ + Assert that the mock was never awaited. + """ + self = _mock_self + if self.await_count != 0: + msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once." + f" Awaited {self.await_count} times.") + raise AssertionError(msg) + + def reset_mock(self, *args, **kwargs): + """ + See :func:`.Mock.reset_mock()` + """ + super().reset_mock(*args, **kwargs) + self.await_count = 0 + self.await_args = None + self.await_args_list = _CallList() + + +class AsyncMock(AsyncMockMixin, AsyncMagicMixin, Mock): + """ + Enhance :class:`Mock` with features allowing to mock + an async function. + + The :class:`AsyncMock` object will behave so the object is + recognized as an async function, and the result of a call is an awaitable: + + >>> mock = AsyncMock() + >>> asyncio.iscoroutinefunction(mock) + True + >>> inspect.isawaitable(mock()) + True + + + The result of ``mock()`` is an async function which will have the outcome + of ``side_effect`` or ``return_value``: + + - if ``side_effect`` is a function, the async function will return the + result of that function, + - if ``side_effect`` is an exception, the async function will raise the + exception, + - if ``side_effect`` is an iterable, the async function will return the + next value of the iterable, however, if the sequence of result is + exhausted, ``StopIteration`` is raised immediately, + - if ``side_effect`` is not defined, the async function will return the + value defined by ``return_value``, hence, by default, the async function + returns a new :class:`AsyncMock` object. + + If the outcome of ``side_effect`` or ``return_value`` is an async function, + the mock async function obtained when the mock object is called will be this + async function itself (and not an async function returning an async + function). + + The test author can also specify a wrapped object with ``wraps``. In this + case, the :class:`Mock` object behavior is the same as with an + :class:`.Mock` object: the wrapped object may have methods + defined as async function functions. + + Based on Martin Richard's asyntest project. + """ + class _ANY(object): "A helper object that compares equal to everything." @@ -2145,7 +2432,6 @@ def call_list(self): call = _Call(from_kall=False) - def create_autospec(spec, spec_set=False, instance=False, _parent=None, _name=None, **kwargs): """Create a mock object using another object as a spec. Attributes on the @@ -2171,7 +2457,10 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, spec = type(spec) is_type = isinstance(spec, type) - + if getattr(spec, '__code__', None): + is_async_func = asyncio.iscoroutinefunction(spec) + else: + is_async_func = False _kwargs = {'spec': spec} if spec_set: _kwargs = {'spec_set': spec} @@ -2188,6 +2477,11 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, # descriptors don't have a spec # because we don't know what type they return _kwargs = {} + elif is_async_func: + if instance: + raise RuntimeError("Instance can not be True when create_autospec " + "is mocking an async function") + Klass = AsyncMock elif not _callable(spec): Klass = NonCallableMagicMock elif is_type and instance and not _instance_callable(spec): @@ -2204,9 +2498,26 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, name=_name, **_kwargs) if isinstance(spec, FunctionTypes): + wrapped_mock = mock # should only happen at the top level because we don't # recurse for functions mock = _set_signature(mock, spec) + if is_async_func: + mock._is_coroutine = asyncio.coroutines._is_coroutine + mock.await_count = 0 + mock.await_args = None + mock.await_args_list = _CallList() + + for a in ('assert_awaited', + 'assert_awaited_once', + 'assert_awaited_with', + 'assert_awaited_once_with', + 'assert_any_await', + 'assert_has_awaits', + 'assert_not_awaited'): + def f(*args, **kwargs): + return getattr(wrapped_mock, a)(*args, **kwargs) + setattr(mock, a, f) else: _check_signature(spec, mock, is_type, instance) @@ -2250,9 +2561,13 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, skipfirst = _must_skip(spec, entry, is_type) kwargs['_eat_self'] = skipfirst - new = MagicMock(parent=parent, name=entry, _new_name=entry, - _new_parent=parent, - **kwargs) + if asyncio.iscoroutinefunction(original): + child_klass = AsyncMock + else: + child_klass = MagicMock + new = child_klass(parent=parent, name=entry, _new_name=entry, + _new_parent=parent, + **kwargs) mock._mock_children[entry] = new _check_signature(original, new, skipfirst=skipfirst) @@ -2438,3 +2753,60 @@ def seal(mock): continue if m._mock_new_parent is mock: seal(m) + + +async def _raise(exception): + raise exception + + +class _AsyncIterator: + """ + Wraps an iterator in an asynchronous iterator. + """ + def __init__(self, iterator): + self.iterator = iterator + code_mock = NonCallableMock(spec_set=CodeType) + code_mock.co_flags = inspect.CO_ITERABLE_COROUTINE + self.__dict__['__code__'] = code_mock + + def __aiter__(self): + return self + + async def __anext__(self): + try: + return next(self.iterator) + except StopIteration: + pass + raise StopAsyncIteration + + +class _AwaitEvent: + def __init__(self, mock): + self._mock = mock + self._condition = None + + async def _notify(self): + condition = self._get_condition() + try: + await condition.acquire() + condition.notify_all() + finally: + condition.release() + + def _get_condition(self): + """ + Creation of condition is delayed, to minimize the chance of using the + wrong loop. + A user may create a mock with _AwaitEvent before selecting the + execution loop. Requiring a user to delay creation is error-prone and + inflexible. Instead, condition is created when user actually starts to + use the mock. + """ + # No synchronization is needed: + # - asyncio is thread unsafe + # - there are no awaits here, method will be executed without + # switching asyncio context. + if self._condition is None: + self._condition = asyncio.Condition() + + return self._condition diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py new file mode 100644 index 000000000000..a9aa1434b963 --- /dev/null +++ b/Lib/unittest/test/testmock/testasync.py @@ -0,0 +1,549 @@ +import asyncio +import inspect +import unittest + +from unittest.mock import call, AsyncMock, patch, MagicMock, create_autospec + + +def tearDownModule(): + asyncio.set_event_loop_policy(None) + + +class AsyncClass: + def __init__(self): + pass + async def async_method(self): + pass + def normal_method(self): + pass + +async def async_func(): + pass + +def normal_func(): + pass + +class NormalClass(object): + def a(self): + pass + + +async_foo_name = f'{__name__}.AsyncClass' +normal_foo_name = f'{__name__}.NormalClass' + + +class AsyncPatchDecoratorTest(unittest.TestCase): + def test_is_coroutine_function_patch(self): + @patch.object(AsyncClass, 'async_method') + def test_async(mock_method): + self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + test_async() + + def test_is_async_patch(self): + @patch.object(AsyncClass, 'async_method') + def test_async(mock_method): + m = mock_method() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + + @patch(f'{async_foo_name}.async_method') + def test_no_parent_attribute(mock_method): + m = mock_method() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + + test_async() + test_no_parent_attribute() + + def test_is_AsyncMock_patch(self): + @patch.object(AsyncClass, 'async_method') + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + + +class AsyncPatchCMTest(unittest.TestCase): + def test_is_async_function_cm(self): + def test_async(): + with patch.object(AsyncClass, 'async_method') as mock_method: + self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + + test_async() + + def test_is_async_cm(self): + def test_async(): + with patch.object(AsyncClass, 'async_method') as mock_method: + m = mock_method() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + + test_async() + + def test_is_AsyncMock_cm(self): + def test_async(): + with patch.object(AsyncClass, 'async_method') as mock_method: + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + + +class AsyncMockTest(unittest.TestCase): + def test_iscoroutinefunction_default(self): + mock = AsyncMock() + self.assertTrue(asyncio.iscoroutinefunction(mock)) + + def test_iscoroutinefunction_function(self): + async def foo(): pass + mock = AsyncMock(foo) + self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(inspect.iscoroutinefunction(mock)) + + def test_isawaitable(self): + mock = AsyncMock() + m = mock() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + self.assertIn('assert_awaited', dir(mock)) + + def test_iscoroutinefunction_normal_function(self): + def foo(): pass + mock = AsyncMock(foo) + self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(inspect.iscoroutinefunction(mock)) + + def test_future_isfuture(self): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + fut = asyncio.Future() + loop.stop() + loop.close() + mock = AsyncMock(fut) + self.assertIsInstance(mock, asyncio.Future) + + +class AsyncAutospecTest(unittest.TestCase): + def test_is_AsyncMock_patch(self): + @patch(async_foo_name, autospec=True) + def test_async(mock_method): + self.assertIsInstance(mock_method.async_method, AsyncMock) + self.assertIsInstance(mock_method, MagicMock) + + @patch(async_foo_name, autospec=True) + def test_normal_method(mock_method): + self.assertIsInstance(mock_method.normal_method, MagicMock) + + test_async() + test_normal_method() + + def test_create_autospec_instance(self): + with self.assertRaises(RuntimeError): + create_autospec(async_func, instance=True) + + def test_create_autospec(self): + spec = create_autospec(async_func) + self.assertTrue(asyncio.iscoroutinefunction(spec)) + + +class AsyncSpecTest(unittest.TestCase): + def test_spec_as_async_positional_magicmock(self): + mock = MagicMock(async_func) + self.assertIsInstance(mock, MagicMock) + m = mock() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + + def test_spec_as_async_kw_magicmock(self): + mock = MagicMock(spec=async_func) + self.assertIsInstance(mock, MagicMock) + m = mock() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + + def test_spec_as_async_kw_AsyncMock(self): + mock = AsyncMock(spec=async_func) + self.assertIsInstance(mock, AsyncMock) + m = mock() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + + def test_spec_as_async_positional_AsyncMock(self): + mock = AsyncMock(async_func) + self.assertIsInstance(mock, AsyncMock) + m = mock() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + + def test_spec_as_normal_kw_AsyncMock(self): + mock = AsyncMock(spec=normal_func) + self.assertIsInstance(mock, AsyncMock) + m = mock() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + + def test_spec_as_normal_positional_AsyncMock(self): + mock = AsyncMock(normal_func) + self.assertIsInstance(mock, AsyncMock) + m = mock() + self.assertTrue(inspect.isawaitable(m)) + asyncio.run(m) + + def test_spec_async_mock(self): + @patch.object(AsyncClass, 'async_method', spec=True) + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + + def test_spec_parent_not_async_attribute_is(self): + @patch(async_foo_name, spec=True) + def test_async(mock_method): + self.assertIsInstance(mock_method, MagicMock) + self.assertIsInstance(mock_method.async_method, AsyncMock) + + test_async() + + def test_target_async_spec_not(self): + @patch.object(AsyncClass, 'async_method', spec=NormalClass.a) + def test_async_attribute(mock_method): + self.assertIsInstance(mock_method, MagicMock) + self.assertFalse(inspect.iscoroutine(mock_method)) + self.assertFalse(inspect.isawaitable(mock_method)) + + test_async_attribute() + + def test_target_not_async_spec_is(self): + @patch.object(NormalClass, 'a', spec=async_func) + def test_attribute_not_async_spec_is(mock_async_func): + self.assertIsInstance(mock_async_func, AsyncMock) + test_attribute_not_async_spec_is() + + def test_spec_async_attributes(self): + @patch(normal_foo_name, spec=AsyncClass) + def test_async_attributes_coroutines(MockNormalClass): + self.assertIsInstance(MockNormalClass.async_method, AsyncMock) + self.assertIsInstance(MockNormalClass, MagicMock) + + test_async_attributes_coroutines() + + +class AsyncSpecSetTest(unittest.TestCase): + def test_is_AsyncMock_patch(self): + @patch.object(AsyncClass, 'async_method', spec_set=True) + def test_async(async_method): + self.assertIsInstance(async_method, AsyncMock) + + def test_is_async_AsyncMock(self): + mock = AsyncMock(spec_set=AsyncClass.async_method) + self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertIsInstance(mock, AsyncMock) + + def test_is_child_AsyncMock(self): + mock = MagicMock(spec_set=AsyncClass) + self.assertTrue(asyncio.iscoroutinefunction(mock.async_method)) + self.assertFalse(asyncio.iscoroutinefunction(mock.normal_method)) + self.assertIsInstance(mock.async_method, AsyncMock) + self.assertIsInstance(mock.normal_method, MagicMock) + self.assertIsInstance(mock, MagicMock) + + +class AsyncArguments(unittest.TestCase): + def test_add_return_value(self): + async def addition(self, var): + return var + 1 + + mock = AsyncMock(addition, return_value=10) + output = asyncio.run(mock(5)) + + self.assertEqual(output, 10) + + def test_add_side_effect_exception(self): + async def addition(var): + return var + 1 + mock = AsyncMock(addition, side_effect=Exception('err')) + with self.assertRaises(Exception): + asyncio.run(mock(5)) + + def test_add_side_effect_function(self): + async def addition(var): + return var + 1 + mock = AsyncMock(side_effect=addition) + result = asyncio.run(mock(5)) + self.assertEqual(result, 6) + + def test_add_side_effect_iterable(self): + vals = [1, 2, 3] + mock = AsyncMock(side_effect=vals) + for item in vals: + self.assertEqual(item, asyncio.run(mock())) + + with self.assertRaises(RuntimeError) as e: + asyncio.run(mock()) + self.assertEqual( + e.exception, + RuntimeError('coroutine raised StopIteration') + ) + + +class AsyncContextManagerTest(unittest.TestCase): + class WithAsyncContextManager: + def __init__(self): + self.entered = False + self.exited = False + + async def __aenter__(self, *args, **kwargs): + self.entered = True + return self + + async def __aexit__(self, *args, **kwargs): + self.exited = True + + def test_magic_methods_are_async_mocks(self): + mock = MagicMock(self.WithAsyncContextManager()) + self.assertIsInstance(mock.__aenter__, AsyncMock) + self.assertIsInstance(mock.__aexit__, AsyncMock) + + def test_mock_supports_async_context_manager(self): + called = False + instance = self.WithAsyncContextManager() + mock_instance = MagicMock(instance) + + async def use_context_manager(): + nonlocal called + async with mock_instance as result: + called = True + return result + + result = asyncio.run(use_context_manager()) + self.assertFalse(instance.entered) + self.assertFalse(instance.exited) + self.assertTrue(called) + self.assertTrue(mock_instance.entered) + self.assertTrue(mock_instance.exited) + self.assertTrue(mock_instance.__aenter__.called) + self.assertTrue(mock_instance.__aexit__.called) + self.assertIsNot(mock_instance, result) + self.assertIsInstance(result, AsyncMock) + + def test_mock_customize_async_context_manager(self): + instance = self.WithAsyncContextManager() + mock_instance = MagicMock(instance) + + expected_result = object() + mock_instance.__aenter__.return_value = expected_result + + async def use_context_manager(): + async with mock_instance as result: + return result + + self.assertIs(asyncio.run(use_context_manager()), expected_result) + + def test_mock_customize_async_context_manager_with_coroutine(self): + enter_called = False + exit_called = False + + async def enter_coroutine(*args): + nonlocal enter_called + enter_called = True + + async def exit_coroutine(*args): + nonlocal exit_called + exit_called = True + + instance = self.WithAsyncContextManager() + mock_instance = MagicMock(instance) + + mock_instance.__aenter__ = enter_coroutine + mock_instance.__aexit__ = exit_coroutine + + async def use_context_manager(): + async with mock_instance: + pass + + asyncio.run(use_context_manager()) + self.assertTrue(enter_called) + self.assertTrue(exit_called) + + def test_context_manager_raise_exception_by_default(self): + async def raise_in(context_manager): + async with context_manager: + raise TypeError() + + instance = self.WithAsyncContextManager() + mock_instance = MagicMock(instance) + with self.assertRaises(TypeError): + asyncio.run(raise_in(mock_instance)) + + +class AsyncIteratorTest(unittest.TestCase): + class WithAsyncIterator(object): + def __init__(self): + self.items = ["foo", "NormalFoo", "baz"] + + def __aiter__(self): + return self + + async def __anext__(self): + try: + return self.items.pop() + except IndexError: + pass + + raise StopAsyncIteration + + def test_mock_aiter_and_anext(self): + instance = self.WithAsyncIterator() + mock_instance = MagicMock(instance) + + self.assertEqual(asyncio.iscoroutine(instance.__aiter__), + asyncio.iscoroutine(mock_instance.__aiter__)) + self.assertEqual(asyncio.iscoroutine(instance.__anext__), + asyncio.iscoroutine(mock_instance.__anext__)) + + iterator = instance.__aiter__() + if asyncio.iscoroutine(iterator): + iterator = asyncio.run(iterator) + + mock_iterator = mock_instance.__aiter__() + if asyncio.iscoroutine(mock_iterator): + mock_iterator = asyncio.run(mock_iterator) + + self.assertEqual(asyncio.iscoroutine(iterator.__aiter__), + asyncio.iscoroutine(mock_iterator.__aiter__)) + self.assertEqual(asyncio.iscoroutine(iterator.__anext__), + asyncio.iscoroutine(mock_iterator.__anext__)) + + def test_mock_async_for(self): + async def iterate(iterator): + accumulator = [] + async for item in iterator: + accumulator.append(item) + + return accumulator + + expected = ["FOO", "BAR", "BAZ"] + with self.subTest("iterate through default value"): + mock_instance = MagicMock(self.WithAsyncIterator()) + self.assertEqual([], asyncio.run(iterate(mock_instance))) + + with self.subTest("iterate through set return_value"): + mock_instance = MagicMock(self.WithAsyncIterator()) + mock_instance.__aiter__.return_value = expected[:] + self.assertEqual(expected, asyncio.run(iterate(mock_instance))) + + with self.subTest("iterate through set return_value iterator"): + mock_instance = MagicMock(self.WithAsyncIterator()) + mock_instance.__aiter__.return_value = iter(expected[:]) + self.assertEqual(expected, asyncio.run(iterate(mock_instance))) + + +class AsyncMockAssert(unittest.TestCase): + def setUp(self): + self.mock = AsyncMock() + + async def _runnable_test(self, *args): + if not args: + await self.mock() + else: + await self.mock(*args) + + def test_assert_awaited(self): + with self.assertRaises(AssertionError): + self.mock.assert_awaited() + + asyncio.run(self._runnable_test()) + self.mock.assert_awaited() + + def test_assert_awaited_once(self): + with self.assertRaises(AssertionError): + self.mock.assert_awaited_once() + + asyncio.run(self._runnable_test()) + self.mock.assert_awaited_once() + + asyncio.run(self._runnable_test()) + with self.assertRaises(AssertionError): + self.mock.assert_awaited_once() + + def test_assert_awaited_with(self): + asyncio.run(self._runnable_test()) + with self.assertRaises(AssertionError): + self.mock.assert_awaited_with('foo') + + asyncio.run(self._runnable_test('foo')) + self.mock.assert_awaited_with('foo') + + asyncio.run(self._runnable_test('SomethingElse')) + with self.assertRaises(AssertionError): + self.mock.assert_awaited_with('foo') + + def test_assert_awaited_once_with(self): + with self.assertRaises(AssertionError): + self.mock.assert_awaited_once_with('foo') + + asyncio.run(self._runnable_test('foo')) + self.mock.assert_awaited_once_with('foo') + + asyncio.run(self._runnable_test('foo')) + with self.assertRaises(AssertionError): + self.mock.assert_awaited_once_with('foo') + + def test_assert_any_wait(self): + with self.assertRaises(AssertionError): + self.mock.assert_any_await('NormalFoo') + + asyncio.run(self._runnable_test('foo')) + with self.assertRaises(AssertionError): + self.mock.assert_any_await('NormalFoo') + + asyncio.run(self._runnable_test('NormalFoo')) + self.mock.assert_any_await('NormalFoo') + + asyncio.run(self._runnable_test('SomethingElse')) + self.mock.assert_any_await('NormalFoo') + + def test_assert_has_awaits_no_order(self): + calls = [call('NormalFoo'), call('baz')] + + with self.assertRaises(AssertionError): + self.mock.assert_has_awaits(calls) + + asyncio.run(self._runnable_test('foo')) + with self.assertRaises(AssertionError): + self.mock.assert_has_awaits(calls) + + asyncio.run(self._runnable_test('NormalFoo')) + with self.assertRaises(AssertionError): + self.mock.assert_has_awaits(calls) + + asyncio.run(self._runnable_test('baz')) + self.mock.assert_has_awaits(calls) + + asyncio.run(self._runnable_test('SomethingElse')) + self.mock.assert_has_awaits(calls) + + def test_assert_has_awaits_ordered(self): + calls = [call('NormalFoo'), call('baz')] + with self.assertRaises(AssertionError): + self.mock.assert_has_awaits(calls, any_order=True) + + asyncio.run(self._runnable_test('baz')) + with self.assertRaises(AssertionError): + self.mock.assert_has_awaits(calls, any_order=True) + + asyncio.run(self._runnable_test('foo')) + with self.assertRaises(AssertionError): + self.mock.assert_has_awaits(calls, any_order=True) + + asyncio.run(self._runnable_test('NormalFoo')) + self.mock.assert_has_awaits(calls, any_order=True) + + asyncio.run(self._runnable_test('qux')) + self.mock.assert_has_awaits(calls, any_order=True) + + def test_assert_not_awaited(self): + self.mock.assert_not_awaited() + + asyncio.run(self._runnable_test()) + with self.assertRaises(AssertionError): + self.mock.assert_not_awaited() diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index b20b8e20e7e6..307b8b7657af 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -9,7 +9,7 @@ from unittest.mock import ( call, DEFAULT, patch, sentinel, MagicMock, Mock, NonCallableMock, - NonCallableMagicMock, _Call, _CallList, + NonCallableMagicMock, AsyncMock, _Call, _CallList, create_autospec ) @@ -1618,7 +1618,8 @@ def test_mock_add_spec_magic_methods(self): def test_adding_child_mock(self): - for Klass in NonCallableMock, Mock, MagicMock, NonCallableMagicMock: + for Klass in (NonCallableMock, Mock, MagicMock, NonCallableMagicMock, + AsyncMock): mock = Klass() mock.foo = Mock() diff --git a/Misc/NEWS.d/next/Library/2018-09-13-20-33-24.bpo-26467.cahAk3.rst b/Misc/NEWS.d/next/Library/2018-09-13-20-33-24.bpo-26467.cahAk3.rst new file mode 100644 index 000000000000..4cf3f2ae7ef7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-13-20-33-24.bpo-26467.cahAk3.rst @@ -0,0 +1,2 @@ +Added AsyncMock to support using unittest to mock asyncio coroutines. +Patch by Lisa Roach. From webhook-mailer at python.org Mon May 20 13:01:11 2019 From: webhook-mailer at python.org (Steve Dower) Date: Mon, 20 May 2019 17:01:11 -0000 Subject: [Python-checkins] bpo-36949: Implement __repr__ on WeakSet (GH-13415) Message-ID: https://github.com/python/cpython/commit/5ae1c84bcd13b766989fc3f1e1c851e7bd4c1faa commit: 5ae1c84bcd13b766989fc3f1e1c851e7bd4c1faa branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: Steve Dower date: 2019-05-20T10:01:07-07:00 summary: bpo-36949: Implement __repr__ on WeakSet (GH-13415) files: A Misc/NEWS.d/next/Library/2019-05-19-06-54-26.bpo-36949.jBlG9F.rst M Lib/_weakrefset.py M Lib/test/test_weakset.py diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py index 304c66f59bd1..7a84823622ee 100644 --- a/Lib/_weakrefset.py +++ b/Lib/_weakrefset.py @@ -194,3 +194,6 @@ def union(self, other): def isdisjoint(self, other): return len(self.intersection(other)) == 0 + + def __repr__(self): + return repr(self.data) diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py index 691b95e77c6a..569facdd30c1 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -434,6 +434,9 @@ def test_len_race(self): self.assertGreaterEqual(n2, 0) self.assertLessEqual(n2, n1) + def test_repr(self): + assert repr(self.s) == repr(self.s.data) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-05-19-06-54-26.bpo-36949.jBlG9F.rst b/Misc/NEWS.d/next/Library/2019-05-19-06-54-26.bpo-36949.jBlG9F.rst new file mode 100644 index 000000000000..e4eeb4010a23 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-19-06-54-26.bpo-36949.jBlG9F.rst @@ -0,0 +1 @@ +Implement __repr__ for WeakSet objects. From webhook-mailer at python.org Mon May 20 15:37:11 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Mon, 20 May 2019 19:37:11 -0000 Subject: [Python-checkins] bpo-36888: Add multiprocessing.parent_process() (GH-13247) Message-ID: https://github.com/python/cpython/commit/c09a9f56c08d80567454cae6f78f738a89e1ae94 commit: c09a9f56c08d80567454cae6f78f738a89e1ae94 branch: master author: Thomas Moreau committer: Antoine Pitrou date: 2019-05-20T21:37:05+02:00 summary: bpo-36888: Add multiprocessing.parent_process() (GH-13247) files: A Misc/NEWS.d/next/Library/2019-05-16-18-02-08.bpo-36888.-H2Dkm.rst M Doc/library/multiprocessing.rst M Lib/multiprocessing/context.py M Lib/multiprocessing/forkserver.py M Lib/multiprocessing/popen_fork.py M Lib/multiprocessing/popen_forkserver.py M Lib/multiprocessing/popen_spawn_posix.py M Lib/multiprocessing/process.py M Lib/multiprocessing/spawn.py M Lib/multiprocessing/util.py M Lib/test/_test_multiprocessing.py M Modules/_winapi.c diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index c6ffb00819c3..cc6dd4e9d702 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -944,6 +944,14 @@ Miscellaneous An analogue of :func:`threading.current_thread`. +.. function:: parent_process() + + Return the :class:`Process` object corresponding to the parent process of + the :func:`current_process`. For the main process, ``parent_process`` will + be ``None``. + + .. versionadded:: 3.8 + .. function:: freeze_support() Add support for when a program which uses :mod:`multiprocessing` has been diff --git a/Lib/multiprocessing/context.py b/Lib/multiprocessing/context.py index 871746b1a047..5a4865751c22 100644 --- a/Lib/multiprocessing/context.py +++ b/Lib/multiprocessing/context.py @@ -35,6 +35,7 @@ class BaseContext(object): AuthenticationError = AuthenticationError current_process = staticmethod(process.current_process) + parent_process = staticmethod(process.parent_process) active_children = staticmethod(process.active_children) def cpu_count(self): diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index dabf7bcbe6d7..9b6398671dbc 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -294,7 +294,8 @@ def _serve_one(child_r, fds, unused_fds, handlers): *_forkserver._inherited_fds) = fds # Run process object received over pipe - code = spawn._main(child_r) + parent_sentinel = os.dup(child_r) + code = spawn._main(child_r, parent_sentinel) return code diff --git a/Lib/multiprocessing/popen_fork.py b/Lib/multiprocessing/popen_fork.py index 685e8daf77ca..11e216072d09 100644 --- a/Lib/multiprocessing/popen_fork.py +++ b/Lib/multiprocessing/popen_fork.py @@ -66,16 +66,20 @@ def kill(self): def _launch(self, process_obj): code = 1 parent_r, child_w = os.pipe() + child_r, parent_w = os.pipe() self.pid = os.fork() if self.pid == 0: try: os.close(parent_r) - code = process_obj._bootstrap() + os.close(parent_w) + code = process_obj._bootstrap(parent_sentinel=child_r) finally: os._exit(code) else: os.close(child_w) - self.finalizer = util.Finalize(self, os.close, (parent_r,)) + os.close(child_r) + self.finalizer = util.Finalize(self, util.close_fds, + (parent_r, parent_w,)) self.sentinel = parent_r def close(self): diff --git a/Lib/multiprocessing/popen_forkserver.py b/Lib/multiprocessing/popen_forkserver.py index a51a2771aed8..a56eb9bf1108 100644 --- a/Lib/multiprocessing/popen_forkserver.py +++ b/Lib/multiprocessing/popen_forkserver.py @@ -49,7 +49,11 @@ def _launch(self, process_obj): set_spawning_popen(None) self.sentinel, w = forkserver.connect_to_new_process(self._fds) - self.finalizer = util.Finalize(self, os.close, (self.sentinel,)) + # Keep a duplicate of the data pipe's write end as a sentinel of the + # parent process used by the child process. + _parent_w = os.dup(w) + self.finalizer = util.Finalize(self, util.close_fds, + (_parent_w, self.sentinel)) with open(w, 'wb', closefd=True) as f: f.write(buf.getbuffer()) self.pid = forkserver.read_signed(self.sentinel) diff --git a/Lib/multiprocessing/popen_spawn_posix.py b/Lib/multiprocessing/popen_spawn_posix.py index 59f8e452cae1..24b8634523e5 100644 --- a/Lib/multiprocessing/popen_spawn_posix.py +++ b/Lib/multiprocessing/popen_spawn_posix.py @@ -61,8 +61,12 @@ def _launch(self, process_obj): with open(parent_w, 'wb', closefd=False) as f: f.write(fp.getbuffer()) finally: - if parent_r is not None: - self.finalizer = util.Finalize(self, os.close, (parent_r,)) - for fd in (child_r, child_w, parent_w): + fds_to_close = [] + for fd in (parent_r, parent_w): + if fd is not None: + fds_to_close.append(fd) + self.finalizer = util.Finalize(self, util.close_fds, fds_to_close) + + for fd in (child_r, child_w): if fd is not None: os.close(fd) diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py index 780f2d0c2734..c62c826cff95 100644 --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -7,7 +7,8 @@ # Licensed to PSF under a Contributor Agreement. # -__all__ = ['BaseProcess', 'current_process', 'active_children'] +__all__ = ['BaseProcess', 'current_process', 'active_children', + 'parent_process'] # # Imports @@ -46,6 +47,13 @@ def active_children(): _cleanup() return list(_children) + +def parent_process(): + ''' + Return process object representing the parent process + ''' + return _parent_process + # # # @@ -76,6 +84,7 @@ def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, self._identity = _current_process._identity + (count,) self._config = _current_process._config.copy() self._parent_pid = os.getpid() + self._parent_name = _current_process.name self._popen = None self._closed = False self._target = target @@ -278,9 +287,9 @@ def __repr__(self): ## - def _bootstrap(self): + def _bootstrap(self, parent_sentinel=None): from . import util, context - global _current_process, _process_counter, _children + global _current_process, _parent_process, _process_counter, _children try: if self._start_method is not None: @@ -290,6 +299,8 @@ def _bootstrap(self): util._close_stdin() old_process = _current_process _current_process = self + _parent_process = _ParentProcess( + self._parent_name, self._parent_pid, parent_sentinel) try: util._finalizer_registry.clear() util._run_after_forkers() @@ -337,6 +348,40 @@ def __reduce__(self): ) return AuthenticationString, (bytes(self),) + +# +# Create object representing the parent process +# + +class _ParentProcess(BaseProcess): + + def __init__(self, name, pid, sentinel): + self._identity = () + self._name = name + self._pid = pid + self._parent_pid = None + self._popen = None + self._closed = False + self._sentinel = sentinel + self._config = {} + + def is_alive(self): + from multiprocessing.connection import wait + return not wait([self._sentinel], timeout=0) + + @property + def ident(self): + return self._pid + + def join(self, timeout=None): + ''' + Wait until parent process terminates + ''' + from multiprocessing.connection import wait + wait([self._sentinel], timeout=timeout) + + pid = ident + # # Create object representing the main process # @@ -365,6 +410,7 @@ def close(self): pass +_parent_process = None _current_process = _MainProcess() _process_counter = itertools.count(1) _children = set() diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py index f66b5aa9267b..7cc129e26107 100644 --- a/Lib/multiprocessing/spawn.py +++ b/Lib/multiprocessing/spawn.py @@ -100,25 +100,24 @@ def spawn_main(pipe_handle, parent_pid=None, tracker_fd=None): if parent_pid is not None: source_process = _winapi.OpenProcess( - _winapi.PROCESS_DUP_HANDLE, False, parent_pid) + _winapi.SYNCHRONIZE | _winapi.PROCESS_DUP_HANDLE, + False, parent_pid) else: source_process = None - try: - new_handle = reduction.duplicate(pipe_handle, - source_process=source_process) - finally: - if source_process is not None: - _winapi.CloseHandle(source_process) + new_handle = reduction.duplicate(pipe_handle, + source_process=source_process) fd = msvcrt.open_osfhandle(new_handle, os.O_RDONLY) + parent_sentinel = source_process else: from . import resource_tracker resource_tracker._resource_tracker._fd = tracker_fd fd = pipe_handle - exitcode = _main(fd) + parent_sentinel = os.dup(pipe_handle) + exitcode = _main(fd, parent_sentinel) sys.exit(exitcode) -def _main(fd): +def _main(fd, parent_sentinel): with os.fdopen(fd, 'rb', closefd=True) as from_parent: process.current_process()._inheriting = True try: @@ -127,7 +126,7 @@ def _main(fd): self = reduction.pickle.load(from_parent) finally: del process.current_process()._inheriting - return self._bootstrap() + return self._bootstrap(parent_sentinel) def _check_not_importing_main(): diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index 0c4eb2473273..5674ad773f97 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -421,3 +421,9 @@ def spawnv_passfds(path, args, passfds): finally: os.close(errpipe_read) os.close(errpipe_write) + + +def close_fds(*fds): + """Close each file descriptor given as an argument""" + for fd in fds: + os.close(fd) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 78ec53beb0f0..071b54a713e2 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -269,6 +269,64 @@ def _test(cls, q, *args, **kwds): q.put(bytes(current.authkey)) q.put(current.pid) + def test_parent_process_attributes(self): + if self.TYPE == "threads": + self.skipTest('test not appropriate for {}'.format(self.TYPE)) + + self.assertIsNone(self.parent_process()) + + rconn, wconn = self.Pipe(duplex=False) + p = self.Process(target=self._test_send_parent_process, args=(wconn,)) + p.start() + p.join() + parent_pid, parent_name = rconn.recv() + self.assertEqual(parent_pid, self.current_process().pid) + self.assertEqual(parent_pid, os.getpid()) + self.assertEqual(parent_name, self.current_process().name) + + @classmethod + def _test_send_parent_process(cls, wconn): + from multiprocessing.process import parent_process + wconn.send([parent_process().pid, parent_process().name]) + + def test_parent_process(self): + if self.TYPE == "threads": + self.skipTest('test not appropriate for {}'.format(self.TYPE)) + + # Launch a child process. Make it launch a grandchild process. Kill the + # child process and make sure that the grandchild notices the death of + # its parent (a.k.a the child process). + rconn, wconn = self.Pipe(duplex=False) + p = self.Process( + target=self._test_create_grandchild_process, args=(wconn, )) + p.start() + + if not rconn.poll(timeout=5): + raise AssertionError("Could not communicate with child process") + parent_process_status = rconn.recv() + self.assertEqual(parent_process_status, "alive") + + p.terminate() + p.join() + + if not rconn.poll(timeout=5): + raise AssertionError("Could not communicate with child process") + parent_process_status = rconn.recv() + self.assertEqual(parent_process_status, "not alive") + + @classmethod + def _test_create_grandchild_process(cls, wconn): + p = cls.Process(target=cls._test_report_parent_status, args=(wconn, )) + p.start() + time.sleep(100) + + @classmethod + def _test_report_parent_status(cls, wconn): + from multiprocessing.process import parent_process + wconn.send("alive" if parent_process().is_alive() else "not alive") + parent_process().join(timeout=5) + wconn.send("alive" if parent_process().is_alive() else "not alive") + def test_process(self): q = self.Queue(1) e = self.Event() @@ -5398,6 +5456,7 @@ class ProcessesMixin(BaseMixin): Process = multiprocessing.Process connection = multiprocessing.connection current_process = staticmethod(multiprocessing.current_process) + parent_process = staticmethod(multiprocessing.parent_process) active_children = staticmethod(multiprocessing.active_children) Pool = staticmethod(multiprocessing.Pool) Pipe = staticmethod(multiprocessing.Pipe) diff --git a/Misc/NEWS.d/next/Library/2019-05-16-18-02-08.bpo-36888.-H2Dkm.rst b/Misc/NEWS.d/next/Library/2019-05-16-18-02-08.bpo-36888.-H2Dkm.rst new file mode 100644 index 000000000000..e7b54677280c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-16-18-02-08.bpo-36888.-H2Dkm.rst @@ -0,0 +1,2 @@ +Python child processes can now access the status of their parent process +using multiprocessing.process.parent_process diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 2eb708e9073e..8873519e6ce5 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -1955,6 +1955,7 @@ PyInit__winapi(void) WINAPI_CONSTANT(F_DWORD, PIPE_UNLIMITED_INSTANCES); WINAPI_CONSTANT(F_DWORD, PIPE_WAIT); WINAPI_CONSTANT(F_DWORD, PROCESS_ALL_ACCESS); + WINAPI_CONSTANT(F_DWORD, SYNCHRONIZE); WINAPI_CONSTANT(F_DWORD, PROCESS_DUP_HANDLE); WINAPI_CONSTANT(F_DWORD, SEC_COMMIT); WINAPI_CONSTANT(F_DWORD, SEC_IMAGE); From webhook-mailer at python.org Mon May 20 16:27:14 2019 From: webhook-mailer at python.org (Guido van Rossum) Date: Mon, 20 May 2019 20:27:14 -0000 Subject: [Python-checkins] bpo-23896: Add a grammar where exec isn't a stmt (#13272) Message-ID: https://github.com/python/cpython/commit/4011d865d0572a3dd9988f2935cd835cc8fb792a commit: 4011d865d0572a3dd9988f2935cd835cc8fb792a branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: Guido van Rossum date: 2019-05-20T13:27:10-07:00 summary: bpo-23896: Add a grammar where exec isn't a stmt (#13272) https://bugs.python.org/issue23896 files: A Misc/NEWS.d/next/Library/2019-05-13-05-49-15.bpo-23896.8TtUKo.rst M Lib/lib2to3/pygram.py M Misc/ACKS diff --git a/Lib/lib2to3/pygram.py b/Lib/lib2to3/pygram.py index 919624eb3997..24d9db9217f1 100644 --- a/Lib/lib2to3/pygram.py +++ b/Lib/lib2to3/pygram.py @@ -36,5 +36,8 @@ def __init__(self, grammar): python_grammar_no_print_statement = python_grammar.copy() del python_grammar_no_print_statement.keywords["print"] +python_grammar_no_print_and_exec_statement = python_grammar_no_print_statement.copy() +del python_grammar_no_print_and_exec_statement.keywords["exec"] + pattern_grammar = driver.load_packaged_grammar("lib2to3", _PATTERN_GRAMMAR_FILE) pattern_symbols = Symbols(pattern_grammar) diff --git a/Misc/ACKS b/Misc/ACKS index f9d01d008679..87107b9cfc7d 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1860,3 +1860,4 @@ Carsten Klein Diego Rojas Edison Abahurire Geoff Shannon +Batuhan Taskaya diff --git a/Misc/NEWS.d/next/Library/2019-05-13-05-49-15.bpo-23896.8TtUKo.rst b/Misc/NEWS.d/next/Library/2019-05-13-05-49-15.bpo-23896.8TtUKo.rst new file mode 100644 index 000000000000..3c154822c9ac --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-13-05-49-15.bpo-23896.8TtUKo.rst @@ -0,0 +1,2 @@ +Adds a grammar to lib2to3.pygram that contains exec as a function not as +statement. From webhook-mailer at python.org Mon May 20 16:44:16 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 20 May 2019 20:44:16 -0000 Subject: [Python-checkins] bpo-36952: Remove the bufsize parameter in fileinput.input(). (GH-13400) Message-ID: https://github.com/python/cpython/commit/1a3faf9d9740a8c7505c61839ef09929a7ff9e35 commit: 1a3faf9d9740a8c7505c61839ef09929a7ff9e35 branch: master author: Matthias Bussonnier committer: Serhiy Storchaka date: 2019-05-20T23:44:11+03:00 summary: bpo-36952: Remove the bufsize parameter in fileinput.input(). (GH-13400) This parameter is marked as deprecated since 3.6 and for removal in 3.8. It already had no effects. files: A Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst M Doc/library/fileinput.rst M Doc/whatsnew/3.8.rst M Lib/fileinput.py M Lib/test/test_fileinput.py diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst index af9dff34a808..14be492f55a6 100644 --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -54,7 +54,7 @@ provided by this module. The following function is the primary interface of this module: -.. function:: input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None) +.. function:: input(files=None, inplace=False, backup='', *, mode='r', openhook=None) Create an instance of the :class:`FileInput` class. The instance will be used as global state for the functions of this module, and is also returned to use @@ -72,8 +72,9 @@ The following function is the primary interface of this module: .. versionchanged:: 3.2 Can be used as a context manager. - .. deprecated-removed:: 3.6 3.8 - The *bufsize* parameter. + .. versionchanged:: 3.8 + The keyword parameters *mode* and *openhook* are now keyword-only. + The following functions use the global state created by :func:`fileinput.input`; if there is no active state, :exc:`RuntimeError` is raised. @@ -135,7 +136,7 @@ The class which implements the sequence behavior provided by the module is available for subclassing as well: -.. class:: FileInput(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None) +.. class:: FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None) Class :class:`FileInput` is the implementation; its methods :meth:`filename`, :meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`, @@ -160,18 +161,20 @@ available for subclassing as well: with FileInput(files=('spam.txt', 'eggs.txt')) as input: process(input) + .. versionchanged:: 3.2 Can be used as a context manager. .. deprecated:: 3.4 The ``'rU'`` and ``'U'`` modes. - .. deprecated-removed:: 3.6 3.8 - The *bufsize* parameter. - .. deprecated:: 3.8 Support for :meth:`__getitem__` method is deprecated. + .. versionchanged:: 3.8 + The keyword parameter *mode* and *openhook* are now keyword-only. + + **Optional in-place filtering:** if the keyword argument ``inplace=True`` is passed to :func:`fileinput.input` or to the :class:`FileInput` constructor, the diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 0a79b6ce1a65..5f8208d5bf4a 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -828,6 +828,10 @@ The following features and APIs have been removed from Python 3.8: exposed to the user. (Contributed by Aviv Palivoda in :issue:`30262`.) +* The ``bufsize`` keyword argument of :func:`fileinput.input` and + :func:`fileinput.FileInput` which was ignored and deprecated since Python 3.6 + has been removed. :issue:`36952` (Contributed by Matthias Bussonnier) + Porting to Python 3.8 ===================== diff --git a/Lib/fileinput.py b/Lib/fileinput.py index 0764aa5e4d24..d868e74cd5e9 100644 --- a/Lib/fileinput.py +++ b/Lib/fileinput.py @@ -80,8 +80,7 @@ _state = None -def input(files=None, inplace=False, backup="", bufsize=0, - mode="r", openhook=None): +def input(files=None, inplace=False, backup="", *, mode="r", openhook=None): """Return an instance of the FileInput class, which can be iterated. The parameters are passed to the constructor of the FileInput class. @@ -91,7 +90,7 @@ def input(files=None, inplace=False, backup="", bufsize=0, global _state if _state and _state._file: raise RuntimeError("input() already active") - _state = FileInput(files, inplace, backup, bufsize, mode, openhook) + _state = FileInput(files, inplace, backup, mode=mode, openhook=openhook) return _state def close(): @@ -173,7 +172,7 @@ def isstdin(): return _state.isstdin() class FileInput: - """FileInput([files[, inplace[, backup[, bufsize, [, mode[, openhook]]]]]]) + """FileInput([files[, inplace[, backup]]], *, mode=None, openhook=None) Class FileInput is the implementation of the module; its methods filename(), lineno(), fileline(), isfirstline(), isstdin(), fileno(), @@ -185,7 +184,7 @@ class FileInput: sequential order; random access and readline() cannot be mixed. """ - def __init__(self, files=None, inplace=False, backup="", bufsize=0, + def __init__(self, files=None, inplace=False, backup="", *, mode="r", openhook=None): if isinstance(files, str): files = (files,) @@ -201,10 +200,6 @@ def __init__(self, files=None, inplace=False, backup="", bufsize=0, self._files = files self._inplace = inplace self._backup = backup - if bufsize: - import warnings - warnings.warn('bufsize is deprecated and ignored', - DeprecationWarning, stacklevel=2) self._savestdout = None self._output = None self._filename = None diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py index 8b7577b0205c..014f19e6cbdb 100644 --- a/Lib/test/test_fileinput.py +++ b/Lib/test/test_fileinput.py @@ -82,25 +82,17 @@ def close(self): class BufferSizesTests(BaseTests, unittest.TestCase): def test_buffer_sizes(self): - # First, run the tests with default and teeny buffer size. - for round, bs in (0, 0), (1, 30): - t1 = self.writeTmp(''.join("Line %s of file 1\n" % (i+1) for i in range(15))) - t2 = self.writeTmp(''.join("Line %s of file 2\n" % (i+1) for i in range(10))) - t3 = self.writeTmp(''.join("Line %s of file 3\n" % (i+1) for i in range(5))) - t4 = self.writeTmp(''.join("Line %s of file 4\n" % (i+1) for i in range(1))) - if bs: - with self.assertWarns(DeprecationWarning): - self.buffer_size_test(t1, t2, t3, t4, bs, round) - else: - self.buffer_size_test(t1, t2, t3, t4, bs, round) - - def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0): + + t1 = self.writeTmp(''.join("Line %s of file 1\n" % (i+1) for i in range(15))) + t2 = self.writeTmp(''.join("Line %s of file 2\n" % (i+1) for i in range(10))) + t3 = self.writeTmp(''.join("Line %s of file 3\n" % (i+1) for i in range(5))) + t4 = self.writeTmp(''.join("Line %s of file 4\n" % (i+1) for i in range(1))) + pat = re.compile(r'LINE (\d+) OF FILE (\d+)') - start = 1 + round*6 if verbose: - print('%s. Simple iteration (bs=%s)' % (start+0, bs)) - fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs) + print('1. Simple iteration') + fi = FileInput(files=(t1, t2, t3, t4)) lines = list(fi) fi.close() self.assertEqual(len(lines), 31) @@ -110,8 +102,8 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0): self.assertEqual(fi.filename(), t4) if verbose: - print('%s. Status variables (bs=%s)' % (start+1, bs)) - fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs) + print('2. Status variables') + fi = FileInput(files=(t1, t2, t3, t4)) s = "x" while s and s != 'Line 6 of file 2\n': s = fi.readline() @@ -122,15 +114,15 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0): self.assertFalse(fi.isstdin()) if verbose: - print('%s. Nextfile (bs=%s)' % (start+2, bs)) + print('3. Nextfile') fi.nextfile() self.assertEqual(fi.readline(), 'Line 1 of file 3\n') self.assertEqual(fi.lineno(), 22) fi.close() if verbose: - print('%s. Stdin (bs=%s)' % (start+3, bs)) - fi = FileInput(files=(t1, t2, t3, t4, '-'), bufsize=bs) + print('4. Stdin') + fi = FileInput(files=(t1, t2, t3, t4, '-')) savestdin = sys.stdin try: sys.stdin = StringIO("Line 1 of stdin\nLine 2 of stdin\n") @@ -143,8 +135,8 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0): sys.stdin = savestdin if verbose: - print('%s. Boundary conditions (bs=%s)' % (start+4, bs)) - fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs) + print('5. Boundary conditions') + fi = FileInput(files=(t1, t2, t3, t4)) self.assertEqual(fi.lineno(), 0) self.assertEqual(fi.filename(), None) fi.nextfile() @@ -152,10 +144,10 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0): self.assertEqual(fi.filename(), None) if verbose: - print('%s. Inplace (bs=%s)' % (start+5, bs)) + print('6. Inplace') savestdout = sys.stdout try: - fi = FileInput(files=(t1, t2, t3, t4), inplace=1, bufsize=bs) + fi = FileInput(files=(t1, t2, t3, t4), inplace=1) for line in fi: line = line[:-1].upper() print(line) @@ -163,7 +155,7 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0): finally: sys.stdout = savestdout - fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs) + fi = FileInput(files=(t1, t2, t3, t4)) for line in fi: self.assertEqual(line[-1], '\n') m = pat.match(line[:-1]) @@ -533,12 +525,11 @@ def test_pathlib_file_inplace(self): class MockFileInput: """A class that mocks out fileinput.FileInput for use during unit tests""" - def __init__(self, files=None, inplace=False, backup="", bufsize=0, + def __init__(self, files=None, inplace=False, backup="", *, mode="r", openhook=None): self.files = files self.inplace = inplace self.backup = backup - self.bufsize = bufsize self.mode = mode self.openhook = openhook self._file = None @@ -641,13 +632,11 @@ def do_test_call_input(self): files = object() inplace = object() backup = object() - bufsize = object() mode = object() openhook = object() # call fileinput.input() with different values for each argument result = fileinput.input(files=files, inplace=inplace, backup=backup, - bufsize=bufsize, mode=mode, openhook=openhook) # ensure fileinput._state was set to the returned object @@ -658,7 +647,6 @@ def do_test_call_input(self): self.assertIs(files, result.files, "files") self.assertIs(inplace, result.inplace, "inplace") self.assertIs(backup, result.backup, "backup") - self.assertIs(bufsize, result.bufsize, "bufsize") self.assertIs(mode, result.mode, "mode") self.assertIs(openhook, result.openhook, "openhook") diff --git a/Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst b/Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst new file mode 100644 index 000000000000..f5ce2aadf4a1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst @@ -0,0 +1,4 @@ +:func:`fileinput.input` and :class:`fileinput.FileInput` **bufsize** +argument has been removed (was deprecated and ignored since Python 3.6), +and as a result the **mode** and **openhook** arguments have been made +keyword-only. From webhook-mailer at python.org Mon May 20 18:17:33 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 20 May 2019 22:17:33 -0000 Subject: [Python-checkins] bpo-36969: Make PDB args command display keyword only arguments (GH-13452) Message-ID: https://github.com/python/cpython/commit/bf457c7d8224179a023957876e757f2a7ffc3d9d commit: bf457c7d8224179a023957876e757f2a7ffc3d9d branch: master author: R?mi Lapeyre committer: Pablo Galindo date: 2019-05-20T23:17:30+01:00 summary: bpo-36969: Make PDB args command display keyword only arguments (GH-13452) files: A Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst M Lib/pdb.py M Lib/test/test_pdb.py diff --git a/Lib/pdb.py b/Lib/pdb.py index f5d33c27fc1d..0e7609e43d4e 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1132,9 +1132,9 @@ def do_args(self, arg): """ co = self.curframe.f_code dict = self.curframe_locals - n = co.co_argcount - if co.co_flags & 4: n = n+1 - if co.co_flags & 8: n = n+1 + n = co.co_argcount + co.co_kwonlyargcount + if co.co_flags & inspect.CO_VARARGS: n = n+1 + if co.co_flags & inspect.CO_VARKEYWORDS: n = n+1 for i in range(n): name = co.co_varnames[i] if name in dict: diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 56d823249544..a33494d6d878 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -77,9 +77,13 @@ def test_pdb_basic_commands(): ... print('...') ... return foo.upper() + >>> def test_function3(arg=None, *, kwonly=None): + ... pass + >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... ret = test_function_2('baz') + ... test_function3(kwonly=True) ... print(ret) >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE @@ -97,10 +101,13 @@ def test_pdb_basic_commands(): ... 'jump 8', # jump over second for loop ... 'return', # return out of function ... 'retval', # display return value + ... 'next', # step to test_function3() + ... 'step', # stepping into test_function3() + ... 'args', # display function args ... 'continue', ... ]): ... test_function() - > (3)test_function() + > (3)test_function() -> ret = test_function_2('baz') (Pdb) step --Call-- @@ -123,14 +130,14 @@ def test_pdb_basic_commands(): [EOF] (Pdb) bt ... - (18)() + (21)() -> test_function() - (3)test_function() + (3)test_function() -> ret = test_function_2('baz') > (1)test_function_2() -> def test_function_2(foo, bar='default'): (Pdb) up - > (3)test_function() + > (3)test_function() -> ret = test_function_2('baz') (Pdb) down > (1)test_function_2() @@ -168,6 +175,16 @@ def test_pdb_basic_commands(): -> return foo.upper() (Pdb) retval 'BAZ' + (Pdb) next + > (4)test_function() + -> test_function3(kwonly=True) + (Pdb) step + --Call-- + > (1)test_function3() + -> def test_function3(arg=None, *, kwonly=None): + (Pdb) args + arg = None + kwonly = True (Pdb) continue BAZ """ diff --git a/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst b/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst new file mode 100644 index 000000000000..9253ab92f1fb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst @@ -0,0 +1,2 @@ +PDB command `args` now display keyword only arguments. Patch contributed by +R?mi Lapeyre. From webhook-mailer at python.org Mon May 20 18:34:27 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 May 2019 22:34:27 -0000 Subject: [Python-checkins] bpo-36969: Make PDB args command display keyword only arguments (GH-13452) Message-ID: https://github.com/python/cpython/commit/50b3f205d82d88eec69f18a0ad4bb2440ba73501 commit: 50b3f205d82d88eec69f18a0ad4bb2440ba73501 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-20T15:34:23-07:00 summary: bpo-36969: Make PDB args command display keyword only arguments (GH-13452) (cherry picked from commit bf457c7d8224179a023957876e757f2a7ffc3d9d) Co-authored-by: R?mi Lapeyre files: A Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst M Lib/pdb.py M Lib/test/test_pdb.py diff --git a/Lib/pdb.py b/Lib/pdb.py index bf3219af3985..59b23dfc8bea 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1133,9 +1133,9 @@ def do_args(self, arg): """ co = self.curframe.f_code dict = self.curframe_locals - n = co.co_argcount - if co.co_flags & 4: n = n+1 - if co.co_flags & 8: n = n+1 + n = co.co_argcount + co.co_kwonlyargcount + if co.co_flags & inspect.CO_VARARGS: n = n+1 + if co.co_flags & inspect.CO_VARKEYWORDS: n = n+1 for i in range(n): name = co.co_varnames[i] if name in dict: diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index c2c4ca248d1b..de6c651b370a 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -77,9 +77,13 @@ def test_pdb_basic_commands(): ... print('...') ... return foo.upper() + >>> def test_function3(arg=None, *, kwonly=None): + ... pass + >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... ret = test_function_2('baz') + ... test_function3(kwonly=True) ... print(ret) >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE @@ -97,10 +101,13 @@ def test_pdb_basic_commands(): ... 'jump 8', # jump over second for loop ... 'return', # return out of function ... 'retval', # display return value + ... 'next', # step to test_function3() + ... 'step', # stepping into test_function3() + ... 'args', # display function args ... 'continue', ... ]): ... test_function() - > (3)test_function() + > (3)test_function() -> ret = test_function_2('baz') (Pdb) step --Call-- @@ -123,14 +130,14 @@ def test_pdb_basic_commands(): [EOF] (Pdb) bt ... - (18)() + (21)() -> test_function() - (3)test_function() + (3)test_function() -> ret = test_function_2('baz') > (1)test_function_2() -> def test_function_2(foo, bar='default'): (Pdb) up - > (3)test_function() + > (3)test_function() -> ret = test_function_2('baz') (Pdb) down > (1)test_function_2() @@ -168,6 +175,16 @@ def test_pdb_basic_commands(): -> return foo.upper() (Pdb) retval 'BAZ' + (Pdb) next + > (4)test_function() + -> test_function3(kwonly=True) + (Pdb) step + --Call-- + > (1)test_function3() + -> def test_function3(arg=None, *, kwonly=None): + (Pdb) args + arg = None + kwonly = True (Pdb) continue BAZ """ diff --git a/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst b/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst new file mode 100644 index 000000000000..9253ab92f1fb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst @@ -0,0 +1,2 @@ +PDB command `args` now display keyword only arguments. Patch contributed by +R?mi Lapeyre. From webhook-mailer at python.org Mon May 20 18:45:09 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Mon, 20 May 2019 22:45:09 -0000 Subject: [Python-checkins] bpo-35563: Add reference links to warnings.rst (GH-11289) Message-ID: https://github.com/python/cpython/commit/6220c02e09e9f3a7458d32ad774ada0ba1571cb8 commit: 6220c02e09e9f3a7458d32ad774ada0ba1571cb8 branch: master author: Cheryl Sabella committer: GitHub date: 2019-05-20T18:45:05-04:00 summary: bpo-35563: Add reference links to warnings.rst (GH-11289) files: M Doc/library/warnings.rst diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index d121f320d6a3..a481a3509d4e 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -19,10 +19,10 @@ Python programmers issue warnings by calling the :func:`warn` function defined in this module. (C programmers use :c:func:`PyErr_WarnEx`; see :ref:`exceptionhandling` for details). -Warning messages are normally written to ``sys.stderr``, but their disposition +Warning messages are normally written to :data:`sys.stderr`, but their disposition can be changed flexibly, from ignoring all warnings to turning them into -exceptions. The disposition of warnings can vary based on the warning category -(see below), the text of the warning message, and the source location where it +exceptions. The disposition of warnings can vary based on the :ref:`warning category +`, the text of the warning message, and the source location where it is issued. Repetitions of a particular warning for the same source location are typically suppressed. @@ -31,7 +31,7 @@ determination is made whether a message should be issued or not; next, if a message is to be issued, it is formatted and printed using a user-settable hook. The determination whether to issue a warning message is controlled by the -warning filter, which is a sequence of matching rules and actions. Rules can be +:ref:`warning filter `, which is a sequence of matching rules and actions. Rules can be added to the filter by calling :func:`filterwarnings` and reset to its default state by calling :func:`resetwarnings`. @@ -181,9 +181,9 @@ Describing Warning Filters The warnings filter is initialized by :option:`-W` options passed to the Python interpreter command line and the :envvar:`PYTHONWARNINGS` environment variable. The interpreter saves the arguments for all supplied entries without -interpretation in ``sys.warnoptions``; the :mod:`warnings` module parses these +interpretation in :data:`sys.warnoptions`; the :mod:`warnings` module parses these when it is first imported (invalid options are ignored, after printing a -message to ``sys.stderr``). +message to :data:`sys.stderr`). Individual warnings filters are specified as a sequence of fields separated by colons:: @@ -192,7 +192,7 @@ colons:: The meaning of each of these fields is as described in :ref:`warning-filter`. When listing multiple filters on a single line (as for -:envvar:`PYTHONWARNINGS`), the individual filters are separated by commas,and +:envvar:`PYTHONWARNINGS`), the individual filters are separated by commas and the filters listed later take precedence over those listed before them (as they're applied left-to-right, and the most recently applied filters take precedence over earlier ones). @@ -395,12 +395,12 @@ Available Functions .. function:: warn(message, category=None, stacklevel=1, source=None) Issue a warning, or maybe ignore it or raise an exception. The *category* - argument, if given, must be a warning category class (see above); it defaults to - :exc:`UserWarning`. Alternatively *message* can be a :exc:`Warning` instance, + argument, if given, must be a :ref:`warning category class `; it + defaults to :exc:`UserWarning`. Alternatively, *message* can be a :exc:`Warning` instance, in which case *category* will be ignored and ``message.__class__`` will be used. - In this case the message text will be ``str(message)``. This function raises an + In this case, the message text will be ``str(message)``. This function raises an exception if the particular warning issued is changed into an error by the - warnings filter see above. The *stacklevel* argument can be used by wrapper + :ref:`warnings filter `. The *stacklevel* argument can be used by wrapper functions written in Python, like this:: def deprecation(message): @@ -444,7 +444,7 @@ Available Functions Write a warning to a file. The default implementation calls ``formatwarning(message, category, filename, lineno, line)`` and writes the - resulting string to *file*, which defaults to ``sys.stderr``. You may replace + resulting string to *file*, which defaults to :data:`sys.stderr`. You may replace this function with any callable by assigning to ``warnings.showwarning``. *line* is a line of source code to be included in the warning message; if *line* is not supplied, :func:`showwarning` will From webhook-mailer at python.org Mon May 20 20:52:41 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Tue, 21 May 2019 00:52:41 -0000 Subject: [Python-checkins] Remove workaround for defaults in namedtuple now that we have the defaults parameter (GH-13263) Message-ID: https://github.com/python/cpython/commit/3099ae407541b63249657b971fb35ff217508d86 commit: 3099ae407541b63249657b971fb35ff217508d86 branch: master author: Andre Delfino committer: Cheryl Sabella date: 2019-05-20T20:52:17-04:00 summary: Remove workaround for defaults in namedtuple now that we have the defaults parameter (GH-13263) files: M Doc/library/collections.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index e0469c208100..ae21db216fde 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -1017,15 +1017,6 @@ fields: .. versionchanged:: 3.5 Property docstrings became writeable. -Default values can be implemented by using :meth:`~somenamedtuple._replace` to -customize a prototype instance: - - >>> Account = namedtuple('Account', 'owner balance transaction_count') - >>> default_account = Account('', 0.0, 0) - >>> johns_account = default_account._replace(owner='John') - >>> janes_account = default_account._replace(owner='Jane') - - .. seealso:: * See :class:`typing.NamedTuple` for a way to add type hints for named From webhook-mailer at python.org Tue May 21 02:20:26 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 May 2019 06:20:26 -0000 Subject: [Python-checkins] bpo-36932: use proper deprecation-removed directive (GH-13349) Message-ID: https://github.com/python/cpython/commit/d0ebf13e50dd736cdb355fa42c23837abbb88127 commit: d0ebf13e50dd736cdb355fa42c23837abbb88127 branch: master author: Matthias Bussonnier committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-20T23:20:10-07:00 summary: bpo-36932: use proper deprecation-removed directive (GH-13349) .. And update some deprecation warnings with version numbers. https://bugs.python.org/issue36932 files: M Doc/library/asyncio-task.rst M Doc/library/sys.rst M Lib/asyncio/tasks.py diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index bb064bd93dea..d94fa587cd3a 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -279,8 +279,8 @@ Sleeping ``sleep()`` always suspends the current task, allowing other tasks to run. - The *loop* argument is deprecated and scheduled for removal - in Python 3.10. + .. deprecated-removed:: 3.8 3.10 + The *loop* parameter. .. _asyncio_example_sleep: @@ -437,8 +437,8 @@ Timeouts If the wait is cancelled, the future *aw* is also cancelled. - The *loop* argument is deprecated and scheduled for removal - in Python 3.10. + .. deprecated-removed:: 3.8 3.10 + The *loop* parameter. .. _asyncio_example_waitfor: @@ -478,10 +478,12 @@ Waiting Primitives set concurrently and block until the condition specified by *return_when*. - If any awaitable in *aws* is a coroutine, it is automatically - scheduled as a Task. Passing coroutines objects to - ``wait()`` directly is deprecated as it leads to - :ref:`confusing behavior `. + .. deprecated:: 3.8 + + If any awaitable in *aws* is a coroutine, it is automatically + scheduled as a Task. Passing coroutines objects to + ``wait()`` directly is deprecated as it leads to + :ref:`confusing behavior `. Returns two sets of Tasks/Futures: ``(done, pending)``. @@ -489,8 +491,8 @@ Waiting Primitives done, pending = await asyncio.wait(aws) - The *loop* argument is deprecated and scheduled for removal - in Python 3.10. + .. deprecated-removed:: 3.8 3.10 + The *loop* parameter. *timeout* (a float or int), if specified, can be used to control the maximum number of seconds to wait before returning. @@ -550,6 +552,8 @@ Waiting Primitives if task in done: # Everything will work as expected now. + .. deprecated:: 3.8 + Passing coroutine objects to ``wait()`` directly is deprecated. @@ -868,8 +872,10 @@ Task Object If *loop* is ``None``, the :func:`get_event_loop` function is used to get the current loop. - This method is **deprecated** and will be removed in - Python 3.9. Use the :func:`asyncio.all_tasks` function instead. + .. deprecated-removed:: 3.7 3.9 + + Do not call this as a task method. Use the :func:`asyncio.all_tasks` + function instead. .. classmethod:: current_task(loop=None) @@ -878,9 +884,10 @@ Task Object If *loop* is ``None``, the :func:`get_event_loop` function is used to get the current loop. - This method is **deprecated** and will be removed in - Python 3.9. Use the :func:`asyncio.current_task` function - instead. + .. deprecated-removed:: 3.7 3.9 + + Do not call this as a task method. Use the + :func:`asyncio.current_task` function instead. .. _asyncio_generator_based_coro: diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 5039ffa933ac..7d27c89fac95 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1353,7 +1353,7 @@ always available. This function has been added on a provisional basis (see :pep:`411` for details.) Use it only for debugging purposes. - .. deprecated:: 3.7 + .. deprecated-removed:: 3.7 3.8 The coroutine wrapper functionality has been deprecated, and will be removed in 3.8. See :issue:`32591` for details. diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index b274b9bd3329..1dc595298c55 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -95,7 +95,7 @@ def current_task(cls, loop=None): None is returned when called not in the context of a Task. """ - warnings.warn("Task.current_task() is deprecated, " + warnings.warn("Task.current_task() is deprecated since Python 3.7, " "use asyncio.current_task() instead", DeprecationWarning, stacklevel=2) @@ -109,7 +109,7 @@ def all_tasks(cls, loop=None): By default all tasks for the current event loop are returned. """ - warnings.warn("Task.all_tasks() is deprecated, " + warnings.warn("Task.all_tasks() is deprecated since Python 3.7, " "use asyncio.all_tasks() instead", DeprecationWarning, stacklevel=2) @@ -388,8 +388,8 @@ def create_task(coro, *, name=None): if loop is None: loop = events.get_running_loop() else: - warnings.warn("The loop argument is deprecated and scheduled for " - "removal in Python 3.10.", + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", DeprecationWarning, stacklevel=2) fs = {ensure_future(f, loop=loop) for f in set(fs)} @@ -418,8 +418,8 @@ def _release_waiter(waiter, *args): if loop is None: loop = events.get_running_loop() else: - warnings.warn("The loop argument is deprecated and scheduled for " - "removal in Python 3.10.", + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", DeprecationWarning, stacklevel=2) if timeout is None: @@ -600,8 +600,8 @@ def __sleep0(): if loop is None: loop = events.get_running_loop() else: - warnings.warn("The loop argument is deprecated and scheduled for " - "removal in Python 3.10.", + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", DeprecationWarning, stacklevel=2) future = loop.create_future() From webhook-mailer at python.org Tue May 21 04:47:24 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 May 2019 08:47:24 -0000 Subject: [Python-checkins] Fix RuntimeWarning in unittest.mock asyncio example (GH-13449) Message-ID: https://github.com/python/cpython/commit/e7cb23bf2079087068a08502f96fdf20b317d69c commit: e7cb23bf2079087068a08502f96fdf20b317d69c branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-21T01:47:17-07:00 summary: Fix RuntimeWarning in unittest.mock asyncio example (GH-13449) * This PR fixes the `RuntimeWarning` in `inspect.isawaitable(mock())` where `mock()` was not awaited. * Fix typo in asynctest project. files: M Doc/library/unittest.mock.rst M Lib/unittest/mock.py diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 21e4709f8160..163da9aecdbb 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -862,7 +862,7 @@ object:: >>> mock = AsyncMock() >>> asyncio.iscoroutinefunction(mock) True - >>> inspect.isawaitable(mock()) + >>> inspect.isawaitable(mock()) # doctest: +SKIP True The result of ``mock()`` is an async function which will have the outcome @@ -888,7 +888,7 @@ object:: >>> mock = MagicMock(async_func) >>> mock - >>> mock() + >>> mock() # doctest: +SKIP .. method:: assert_awaited() diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 166c10037698..654462cbf7e7 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2204,7 +2204,7 @@ class AsyncMock(AsyncMockMixin, AsyncMagicMixin, Mock): :class:`.Mock` object: the wrapped object may have methods defined as async function functions. - Based on Martin Richard's asyntest project. + Based on Martin Richard's asynctest project. """ From webhook-mailer at python.org Tue May 21 05:37:16 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 May 2019 09:37:16 -0000 Subject: [Python-checkins] [3.7] bpo-22865: Expand on documentation for the pty.spawn function (GH-11980) (GH-13455) Message-ID: https://github.com/python/cpython/commit/cdb2dbfe92b95dcd19ccab1a1e9b8c39263c54b0 commit: cdb2dbfe92b95dcd19ccab1a1e9b8c39263c54b0 branch: 3.7 author: Geoff Shannon committer: Victor Stinner date: 2019-05-21T11:36:57+02:00 summary: [3.7] bpo-22865: Expand on documentation for the pty.spawn function (GH-11980) (GH-13455) (cherry picked from commit 522ccef8690970fc4f78f51a3adb995f2547871a) Co-authored-by: Geoff Shannon files: A Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst M Doc/library/pty.rst M Misc/ACKS diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst index 0ab766065d6e..12268437d07e 100644 --- a/Doc/library/pty.rst +++ b/Doc/library/pty.rst @@ -43,11 +43,32 @@ The :mod:`pty` module defines the following functions: Spawn a process, and connect its controlling terminal with the current process's standard io. This is often used to baffle programs which insist on - reading from the controlling terminal. + reading from the controlling terminal. It is expected that the process + spawned behind the pty will eventually terminate, and when it does *spawn* + will return. + + The functions *master_read* and *stdin_read* are passed a file descriptor + which they should read from, and they should always return a byte string. In + order to force spawn to return before the child process exits an + :exc:`OSError` should be thrown. + + The default implementation for both functions will read and return up to 1024 + bytes each time the function is called. The *master_read* callback is passed + the pseudoterminal?s master file descriptor to read output from the child + process, and *stdin_read* is passed file descriptor 0, to read from the + parent process's standard input. + + Returning an empty byte string from either callback is interpreted as an + end-of-file (EOF) condition, and that callback will not be called after + that. If *stdin_read* signals EOF the controlling terminal can no longer + communicate with the parent process OR the child process. Unless the child + process will quit without any input, *spawn* will then loop forever. If + *master_read* signals EOF the same behavior results (on linux at least). + + If both callbacks signal EOF then *spawn* will probably never return, unless + *select* throws an error on your platform when passed three empty lists. This + is a bug, documented in `issue 26228 `_. - The functions *master_read* and *stdin_read* should be functions which read from - a file descriptor. The defaults try to read 1024 bytes each time they are - called. .. versionchanged:: 3.4 :func:`spawn` now returns the status value from :func:`os.waitpid` diff --git a/Misc/ACKS b/Misc/ACKS index 5ca2ccf0b252..8468d5ffd5b7 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1829,3 +1829,4 @@ Gennadiy Zlobin Doug Zongker Peter ?strand Zheao Li +Geoff Shannon diff --git a/Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst b/Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst new file mode 100644 index 000000000000..67a4ed26bede --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst @@ -0,0 +1 @@ +Add detail to the documentation on the `pty.spawn` function. \ No newline at end of file From webhook-mailer at python.org Tue May 21 06:11:16 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 May 2019 10:11:16 -0000 Subject: [Python-checkins] bpo-36965: Fix includes in main.c on Windows with non-MSC compilers (GH-13421) Message-ID: https://github.com/python/cpython/commit/925af1d99b69bf3e229411022ad840c5a0cfdcf8 commit: 925af1d99b69bf3e229411022ad840c5a0cfdcf8 branch: master author: Erik Janssens committer: Victor Stinner date: 2019-05-21T12:11:11+02:00 summary: bpo-36965: Fix includes in main.c on Windows with non-MSC compilers (GH-13421) Include windows.h rather than crtdbg.h to get STATUS_CONTROL_C_EXIT constant. Moreover, include windows.h on Windows, not only when MSC is used. files: A Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst M Modules/main.c diff --git a/Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst b/Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst new file mode 100644 index 000000000000..2a531d2c14d9 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst @@ -0,0 +1 @@ +include of STATUS_CONTROL_C_EXIT without depending on MSC compiler diff --git a/Modules/main.c b/Modules/main.c index 6d4b351e5e17..08fb0e0417d0 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -18,8 +18,8 @@ #if defined(HAVE_GETPID) && defined(HAVE_UNISTD_H) # include /* getpid() */ #endif -#ifdef _MSC_VER -# include /* STATUS_CONTROL_C_EXIT */ +#ifdef MS_WINDOWS +# include /* STATUS_CONTROL_C_EXIT */ #endif /* End of includes for exit_sigint() */ From webhook-mailer at python.org Tue May 21 06:45:01 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 May 2019 10:45:01 -0000 Subject: [Python-checkins] Revert "bpo-36084: Add native thread ID to threading.Thread objects (GH-11993)" (GH-13458) Message-ID: https://github.com/python/cpython/commit/d12e75734d46ecde588c5de65e6d64146911d20c commit: d12e75734d46ecde588c5de65e6d64146911d20c branch: master author: Victor Stinner committer: GitHub date: 2019-05-21T12:44:57+02:00 summary: Revert "bpo-36084: Add native thread ID to threading.Thread objects (GH-11993)" (GH-13458) This reverts commit 4959c33d2555b89b494c678d99be81a65ee864b0. files: D Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst M Doc/library/_thread.rst M Doc/library/threading.rst M Include/pythread.h M Lib/_dummy_thread.py M Lib/test/test_threading.py M Lib/threading.py M Modules/_threadmodule.c M Python/thread_nt.h M Python/thread_pthread.h diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index d7814f218b50..acffabf24bad 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -85,18 +85,6 @@ This module defines the following constants and functions: may be recycled when a thread exits and another thread is created. -.. function:: get_native_id() - - Return the native integral Thread ID of the current thread assigned by the kernel. - This is a non-negative integer. - Its value may be used to uniquely identify this particular thread system-wide - (until the thread terminates, after which the value may be recycled by the OS). - - .. availability:: Windows, FreeBSD, Linux, macOS. - - .. versionadded:: 3.8 - - .. function:: stack_size([size]) Return the thread stack size used when creating new threads. The optional diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 715940c1c52b..22342803e5e6 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -49,18 +49,6 @@ This module defines the following functions: .. versionadded:: 3.3 -.. function:: get_native_id() - - Return the native integral Thread ID of the current thread assigned by the kernel. - This is a non-negative integer. - Its value may be used to uniquely identify this particular thread system-wide - (until the thread terminates, after which the value may be recycled by the OS). - - .. availability:: Windows, FreeBSD, Linux, macOS. - - .. versionadded:: 3.8 - - .. function:: enumerate() Return a list of all :class:`Thread` objects currently alive. The list @@ -309,25 +297,6 @@ since it is impossible to detect the termination of alien threads. another thread is created. The identifier is available even after the thread has exited. - .. attribute:: native_id - - The native integral thread ID of this thread or ``0`` if the thread has not - been started. This is a non-negative integer. See the - :func:`get_native_id` function. - This represents the Thread ID (``TID``) as assigned to the - thread by the OS (kernel). Its value may be used to uniquely identify - this particular thread system-wide. - - .. note:: - - Similar to Process IDs, Thread IDs are only valid (guaranteed unique - system-wide) from the time the thread is created until the thread - has been terminated. - - .. availability:: Windows, FreeBSD, Linux, macOS. - - .. versionadded:: 3.8 - .. method:: is_alive() Return whether the thread is alive. diff --git a/Include/pythread.h b/Include/pythread.h index e083383af80b..bc1d92cd1ff1 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -25,7 +25,6 @@ PyAPI_FUNC(void) PyThread_init_thread(void); PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); -PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py index 0a877e1fa169..a2cae54b0580 100644 --- a/Lib/_dummy_thread.py +++ b/Lib/_dummy_thread.py @@ -71,10 +71,6 @@ def get_ident(): """ return 1 -def get_native_id(): - """Dummy implementation of _thread.get_native_id().""" - return 0 - def allocate_lock(): """Dummy implementation of _thread.allocate_lock().""" return LockType() diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 6ac6e9de7a5d..2ddc77b266b5 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -104,10 +104,6 @@ def test_various_ops(self): self.assertRegex(repr(t), r'^$') t.start() - native_ids = set(t.native_id for t in threads) | {threading.get_native_id()} - self.assertNotIn(None, native_ids) - self.assertEqual(len(native_ids), NUMTASKS + 1) - if verbose: print('waiting for all tasks to complete') for t in threads: diff --git a/Lib/threading.py b/Lib/threading.py index 3137e495b250..0ebbd6776ef4 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -23,8 +23,8 @@ # with the multiprocessing module, which doesn't provide the old # Java inspired names. -__all__ = ['get_ident', 'get_native_id', 'active_count', 'Condition', - 'current_thread', 'enumerate', 'main_thread', 'TIMEOUT_MAX', +__all__ = ['get_ident', 'active_count', 'Condition', 'current_thread', + 'enumerate', 'main_thread', 'TIMEOUT_MAX', 'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError', 'setprofile', 'settrace', 'local', 'stack_size'] @@ -34,7 +34,6 @@ _allocate_lock = _thread.allocate_lock _set_sentinel = _thread._set_sentinel get_ident = _thread.get_ident -get_native_id = _thread.get_native_id ThreadError = _thread.error try: _CRLock = _thread.RLock @@ -791,7 +790,6 @@ class is implemented. else: self._daemonic = current_thread().daemon self._ident = None - self._native_id = 0 self._tstate_lock = None self._started = Event() self._is_stopped = False @@ -893,9 +891,6 @@ def _bootstrap(self): def _set_ident(self): self._ident = get_ident() - def _set_native_id(self): - self._native_id = get_native_id() - def _set_tstate_lock(self): """ Set a lock object which will be released by the interpreter when @@ -908,7 +903,6 @@ def _bootstrap_inner(self): try: self._set_ident() self._set_tstate_lock() - self._set_native_id() self._started.set() with _active_limbo_lock: _active[self._ident] = self @@ -1083,17 +1077,6 @@ def ident(self): assert self._initialized, "Thread.__init__() not called" return self._ident - @property - def native_id(self): - """Native integral thread ID of this thread or 0 if it has not been started. - - This is a non-negative integer. See the get_native_id() function. - This represents the Thread ID as reported by the kernel. - - """ - assert self._initialized, "Thread.__init__() not called" - return self._native_id - def is_alive(self): """Return whether the thread is alive. @@ -1193,7 +1176,6 @@ def __init__(self): self._set_tstate_lock() self._started.set() self._set_ident() - self._set_native_id() with _active_limbo_lock: _active[self._ident] = self @@ -1213,7 +1195,6 @@ def __init__(self): self._started.set() self._set_ident() - self._set_native_id() with _active_limbo_lock: _active[self._ident] = self diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst deleted file mode 100644 index 4a612964de0f..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst +++ /dev/null @@ -1 +0,0 @@ -Add native thread ID (TID) to threading.Thread objects \ No newline at end of file diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index a123cd0efd62..3c02d8dd5145 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1159,20 +1159,6 @@ allocated consecutive numbers starting at 1, this behavior should not\n\ be relied upon, and the number should be seen purely as a magic cookie.\n\ A thread's identity may be reused for another thread after it exits."); -static PyObject * -thread_get_native_id(PyObject *self, PyObject *Py_UNUSED(ignored)) -{ - unsigned long native_id = PyThread_get_thread_native_id(); - return PyLong_FromUnsignedLong(native_id); -} - -PyDoc_STRVAR(get_native_id_doc, -"get_native_id() -> integer\n\ -\n\ -Return a non-negative integer identifying the thread as reported\n\ -by the OS (kernel). This may be used to uniquely identify a\n\ -particular thread within a system."); - static PyObject * thread__count(PyObject *self, PyObject *Py_UNUSED(ignored)) { @@ -1324,8 +1310,6 @@ static PyMethodDef thread_methods[] = { METH_NOARGS, interrupt_doc}, {"get_ident", thread_get_ident, METH_NOARGS, get_ident_doc}, - {"get_native_id", thread_get_native_id, - METH_NOARGS, get_native_id_doc}, {"_count", thread__count, METH_NOARGS, _count_doc}, {"stack_size", (PyCFunction)thread_stack_size, diff --git a/Python/thread_nt.h b/Python/thread_nt.h index d3dc2bec6ffe..5e00c3511460 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -143,8 +143,6 @@ LeaveNonRecursiveMutex(PNRMUTEX mutex) unsigned long PyThread_get_thread_ident(void); -unsigned long PyThread_get_thread_native_id(void); - /* * Initialization of the C package, should not be needed. */ @@ -229,20 +227,6 @@ PyThread_get_thread_ident(void) return GetCurrentThreadId(); } -/* - * Return the native Thread ID (TID) of the calling thread. - * The native ID of a thread is valid and guaranteed to be unique system-wide - * from the time the thread is created until the thread has been terminated. - */ -unsigned long -PyThread_get_thread_native_id(void) -{ - if (!initialized) - PyThread_init_thread(); - - return GetCurrentThreadId(); -} - void _Py_NO_RETURN PyThread_exit_thread(void) { diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 87c98d3e93cb..4c106d9959c1 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -12,12 +12,6 @@ #endif #include -#if defined(__linux__) -#include -#elif defined(__FreeBSD__) -#include -#endif - /* The POSIX spec requires that use of pthread_attr_setstacksize be conditional on _POSIX_THREAD_ATTR_STACKSIZE being defined. */ #ifdef _POSIX_THREAD_ATTR_STACKSIZE @@ -308,27 +302,6 @@ PyThread_get_thread_ident(void) return (unsigned long) threadid; } -unsigned long -PyThread_get_thread_native_id(void) -{ - if (!initialized) - PyThread_init_thread(); -#ifdef __APPLE__ - uint64_t native_id; - pthread_threadid_np(NULL, &native_id); -#elif defined(__linux__) - pid_t native_id; - native_id = syscall(__NR_gettid); -#elif defined(__FreeBSD__) - pid_t native_id; - native_id = pthread_getthreadid_np(); -#else - unsigned long native_id; - native_id = 0; -#endif - return (unsigned long) native_id; -} - void _Py_NO_RETURN PyThread_exit_thread(void) { From webhook-mailer at python.org Tue May 21 06:46:41 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 May 2019 10:46:41 -0000 Subject: [Python-checkins] bpo-31904: Add posix module support for VxWorks (GH-12118) Message-ID: https://github.com/python/cpython/commit/f2d7ac7e5bd821e29e0fcb78a760a282059ae000 commit: f2d7ac7e5bd821e29e0fcb78a760a282059ae000 branch: master author: pxinwr committer: Victor Stinner date: 2019-05-21T12:46:37+02:00 summary: bpo-31904: Add posix module support for VxWorks (GH-12118) files: A Misc/NEWS.d/next/Library/2019-03-01-17-59-39.bpo-31904.38djdk.rst M Doc/library/os.rst M Lib/test/test_os.py M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c M configure M configure.ac M pyconfig.h.in diff --git a/Doc/library/os.rst b/Doc/library/os.rst index e77a8fed377a..0bbfce97c54b 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -32,6 +32,7 @@ Notes on the availability of these functions: objects, and result in an object of the same type, if a path or file name is returned. +* On VxWorks, os.fork, os.execv and os.spawn*p* are not supported. .. note:: @@ -3578,6 +3579,9 @@ written in Python, such as a mail server's external command delivery program. process. On Windows, the process id will actually be the process handle, so can be used with the :func:`waitpid` function. + Note on VxWorks, this function doesn't return ``-signal`` when the new process is + killed. Instead it raises OSError exception. + The "l" and "v" variants of the :func:`spawn\* ` functions differ in how command-line arguments are passed. The "l" variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index a2021b1eba06..353b9a50a2b7 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1407,6 +1407,8 @@ def test_getrandom_value(self): @unittest.skipIf(OS_URANDOM_DONT_USE_FD , "os.random() does not use a file descriptor") + at unittest.skipIf(sys.platform == "vxworks", + "VxWorks can't set RLIMIT_NOFILE to 1") class URandomFDTests(unittest.TestCase): @unittest.skipUnless(resource, "test requires the resource module") def test_urandom_failure(self): @@ -1517,7 +1519,8 @@ def mock_execve(name, *args): os.execve = orig_execve os.defpath = orig_defpath - + at unittest.skipUnless(hasattr(os, 'execv'), + "need os.execv()") class ExecTests(unittest.TestCase): @unittest.skipIf(USING_LINUXTHREADS, "avoid triggering a linuxthreads bug: see issue #4970") diff --git a/Misc/NEWS.d/next/Library/2019-03-01-17-59-39.bpo-31904.38djdk.rst b/Misc/NEWS.d/next/Library/2019-03-01-17-59-39.bpo-31904.38djdk.rst new file mode 100644 index 000000000000..319c0a319f8c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-01-17-59-39.bpo-31904.38djdk.rst @@ -0,0 +1 @@ +Add posix module support for VxWorks. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 43f8ba6b4e61..f2745591b235 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -2491,7 +2491,7 @@ os_posix_spawnp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj #endif /* defined(HAVE_POSIX_SPAWNP) */ -#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV)) +#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) PyDoc_STRVAR(os_spawnv__doc__, "spawnv($module, mode, path, argv, /)\n" @@ -2545,9 +2545,9 @@ os_spawnv(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV)) */ +#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) */ -#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV)) +#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) PyDoc_STRVAR(os_spawnve__doc__, "spawnve($module, mode, path, argv, env, /)\n" @@ -2606,7 +2606,7 @@ os_spawnve(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV)) */ +#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) */ #if defined(HAVE_FORK) @@ -8576,4 +8576,4 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=ab36ec0376a422ae input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5ee9420fb2e7aa2c input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index aca64efeb1e3..9f15866d9d3d 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -191,11 +191,13 @@ corresponding Unix manual entries for more information on calls."); #define fsync _commit #else /* Unix functions that the configure script doesn't check for */ +#ifndef __VXWORKS__ #define HAVE_EXECV 1 #define HAVE_FORK 1 #if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */ #define HAVE_FORK1 1 #endif +#endif #define HAVE_GETEGID 1 #define HAVE_GETEUID 1 #define HAVE_GETGID 1 @@ -227,6 +229,18 @@ extern char *ctermid_r(char *); #endif /* !_MSC_VER */ +#if defined(__VXWORKS__) +#include +#include +#include +#include +#ifndef _P_WAIT +#define _P_WAIT 0 +#define _P_NOWAIT 1 +#define _P_NOWAITO 1 +#endif +#endif /* __VXWORKS__ */ + #ifdef HAVE_POSIX_SPAWN #include #endif @@ -1353,7 +1367,7 @@ win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag) */ #include static char **environ; -#elif !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) ) +#elif !defined(_MSC_VER) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__)) extern char **environ; #endif /* !_MSC_VER */ @@ -4870,7 +4884,7 @@ os__exit_impl(PyObject *module, int status) #define EXECV_CHAR char #endif -#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV) +#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV) || defined(HAVE_RTPSPAWN) static void free_string_array(EXECV_CHAR **array, Py_ssize_t count) { @@ -4908,7 +4922,7 @@ fsconvert_strdup(PyObject *o, EXECV_CHAR **out) } #endif -#if defined(HAVE_EXECV) || defined (HAVE_FEXECVE) +#if defined(HAVE_EXECV) || defined (HAVE_FEXECVE) || defined(HAVE_RTPSPAWN) static EXECV_CHAR** parse_envlist(PyObject* env, Py_ssize_t *envc_ptr) { @@ -5632,8 +5646,41 @@ os_posix_spawnp_impl(PyObject *module, path_t *path, PyObject *argv, } #endif /* HAVE_POSIX_SPAWNP */ - -#if defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) +#ifdef HAVE_RTPSPAWN +static intptr_t +_rtp_spawn(int mode, const char *rtpFileName, const char *argv[], + const char *envp[]) +{ + RTP_ID rtpid; + int status; + pid_t res; + int async_err = 0; + + /* Set priority=100 and uStackSize=16 MiB (0x1000000) for new processes. + uStackSize=0 cannot be used, the default stack size is too small for + Python. */ + if (envp) { + rtpid = rtpSpawn(rtpFileName, argv, envp, + 100, 0x1000000, 0, VX_FP_TASK); + } + else { + rtpid = rtpSpawn(rtpFileName, argv, (const char **)environ, + 100, 0x1000000, 0, VX_FP_TASK); + } + if ((rtpid != RTP_ID_ERROR) && (mode == _P_WAIT)) { + do { + res = waitpid((pid_t)rtpid, &status, 0); + } while (res < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + + if (res < 0) + return RTP_ID_ERROR; + return ((intptr_t)status); + } + return ((intptr_t)rtpid); +} +#endif + +#if defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN) /*[clinic input] os.spawnv @@ -5703,13 +5750,17 @@ os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv) } argvlist[argc] = NULL; +#if !defined(HAVE_RTPSPAWN) if (mode == _OLD_P_OVERLAY) mode = _P_OVERLAY; +#endif Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_WSPAWNV spawnval = _wspawnv(mode, path->wide, argvlist); +#elif defined(HAVE_RTPSPAWN) + spawnval = _rtp_spawn(mode, path->narrow, (const char **)argvlist, NULL); #else spawnval = _spawnv(mode, path->narrow, argvlist); #endif @@ -5808,13 +5859,18 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, if (envlist == NULL) goto fail_1; +#if !defined(HAVE_RTPSPAWN) if (mode == _OLD_P_OVERLAY) mode = _P_OVERLAY; +#endif Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_WSPAWNV spawnval = _wspawnve(mode, path->wide, argvlist, envlist); +#elif defined(HAVE_RTPSPAWN) + spawnval = _rtp_spawn(mode, path->narrow, (const char **)argvlist, + (const char **)envlist); #else spawnval = _spawnve(mode, path->narrow, argvlist, envlist); #endif @@ -13844,11 +13900,13 @@ all_ins(PyObject *m) if (PyModule_AddIntConstant(m, "POSIX_SPAWN_DUP2", POSIX_SPAWN_DUP2)) return -1; #endif -#ifdef HAVE_SPAWNV +#if defined(HAVE_SPAWNV) || defined (HAVE_RTPSPAWN) if (PyModule_AddIntConstant(m, "P_WAIT", _P_WAIT)) return -1; if (PyModule_AddIntConstant(m, "P_NOWAIT", _P_NOWAIT)) return -1; - if (PyModule_AddIntConstant(m, "P_OVERLAY", _OLD_P_OVERLAY)) return -1; if (PyModule_AddIntConstant(m, "P_NOWAITO", _P_NOWAITO)) return -1; +#endif +#ifdef HAVE_SPAWNV + if (PyModule_AddIntConstant(m, "P_OVERLAY", _OLD_P_OVERLAY)) return -1; if (PyModule_AddIntConstant(m, "P_DETACH", _P_DETACH)) return -1; #endif diff --git a/configure b/configure index 6da65ddbba50..a0767b971363 100755 --- a/configure +++ b/configure @@ -11484,7 +11484,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ - wcscoll wcsftime wcsxfrm wmemcmp writev _getpty + wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/configure.ac b/configure.ac index e673e136be8a..3a915eb5577c 100644 --- a/configure.ac +++ b/configure.ac @@ -3541,7 +3541,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ - wcscoll wcsftime wcsxfrm wmemcmp writev _getpty) + wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn) # Force lchmod off for Linux. Linux disallows changing the mode of symbolic # links. Some libc implementations have a stub lchmod implementation that always diff --git a/pyconfig.h.in b/pyconfig.h.in index 4b7796147274..1cafb9ae42dd 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -835,6 +835,9 @@ /* Define to 1 if you have the `round' function. */ #undef HAVE_ROUND +/* Define to 1 if you have the `rtpSpawn' function. */ +#undef HAVE_RTPSPAWN + /* Define to 1 if you have the `sched_get_priority_max' function. */ #undef HAVE_SCHED_GET_PRIORITY_MAX From webhook-mailer at python.org Tue May 21 06:50:18 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 May 2019 10:50:18 -0000 Subject: [Python-checkins] bpo-36648: fix mmap issue for VxWorks (GH-12394) Message-ID: https://github.com/python/cpython/commit/4fb15021890d327023aefd95f5a84ac33b037d19 commit: 4fb15021890d327023aefd95f5a84ac33b037d19 branch: master author: Lihua Zhao <44661095+LihuaZhao at users.noreply.github.com> committer: Victor Stinner date: 2019-05-21T12:50:14+02:00 summary: bpo-36648: fix mmap issue for VxWorks (GH-12394) The mmap module set MAP_SHARED flag when map anonymous memory, however VxWorks only support MAP_PRIVATE when map anonymous memory, this commit clear MAP_SHARED and set MAP_PRIVATE. files: A Misc/NEWS.d/next/Library/2019-03-18-14-25-36.bpo-31904.ds3d67.rst M Modules/mmapmodule.c diff --git a/Misc/NEWS.d/next/Library/2019-03-18-14-25-36.bpo-31904.ds3d67.rst b/Misc/NEWS.d/next/Library/2019-03-18-14-25-36.bpo-31904.ds3d67.rst new file mode 100644 index 000000000000..fd82fe086f06 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-18-14-25-36.bpo-31904.ds3d67.rst @@ -0,0 +1 @@ +Fix mmap fail for VxWorks diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 33366b2d9331..917c6362c11d 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -1164,6 +1164,13 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) #ifdef MAP_ANONYMOUS /* BSD way to map anonymous memory */ flags |= MAP_ANONYMOUS; + + /* VxWorks only supports MAP_ANONYMOUS with MAP_PRIVATE flag */ +#ifdef __VXWORKS__ + flags &= ~MAP_SHARED; + flags |= MAP_PRIVATE; +#endif + #else /* SVR4 method to map anonymous memory is to open /dev/zero */ fd = devzero = _Py_open("/dev/zero", O_RDWR); From webhook-mailer at python.org Tue May 21 09:12:40 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 May 2019 13:12:40 -0000 Subject: [Python-checkins] bpo-30458: Disallow control chars in http URLs (GH-12755) (GH-13154) (GH-13315) Message-ID: https://github.com/python/cpython/commit/bb8071a4cae5ab3fe321481dd3d73662ffb26052 commit: bb8071a4cae5ab3fe321481dd3d73662ffb26052 branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-05-21T15:12:33+02:00 summary: bpo-30458: Disallow control chars in http URLs (GH-12755) (GH-13154) (GH-13315) Disallow control chars in http URLs in urllib2.urlopen. This addresses a potential security problem for applications that do not sanity check their URLs where http request headers could be injected. Disable https related urllib tests on a build without ssl (GH-13032) These tests require an SSL enabled build. Skip these tests when python is built without SSL to fix test failures. Use httplib.InvalidURL instead of ValueError as the new error case's exception. (GH-13044) Backport Co-Authored-By: Miro Hron?ok (cherry picked from commit 7e200e0763f5b71c199aaf98bd5588f291585619) Notes on backport to Python 2.7: * test_urllib tests urllib.urlopen() which quotes the URL and so is not vulerable to HTTP Header Injection. * Add tests to test_urllib2 on urllib2.urlopen(). * Reject non-ASCII characters: range 0x80-0xff. files: A Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst M Lib/httplib.py M Lib/test/test_urllib.py M Lib/test/test_urllib2.py M Lib/test/test_xmlrpc.py diff --git a/Lib/httplib.py b/Lib/httplib.py index 60a8fb4e355f..1b41c346e090 100644 --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -247,6 +247,16 @@ _is_legal_header_name = re.compile(r'\A[^:\s][^:\r\n]*\Z').match _is_illegal_header_value = re.compile(r'\n(?![ \t])|\r(?![ \t\n])').search +# These characters are not allowed within HTTP URL paths. +# See https://tools.ietf.org/html/rfc3986#section-3.3 and the +# https://tools.ietf.org/html/rfc3986#appendix-A pchar definition. +# Prevents CVE-2019-9740. Includes control characters such as \r\n. +# Restrict non-ASCII characters above \x7f (0x80-0xff). +_contains_disallowed_url_pchar_re = re.compile('[\x00-\x20\x7f-\xff]') +# Arguably only these _should_ allowed: +# _is_allowed_url_pchars_re = re.compile(r"^[/!$&'()*+,;=:@%a-zA-Z0-9._~-]+$") +# We are more lenient for assumed real world compatibility purposes. + # We always set the Content-Length header for these methods because some # servers will otherwise respond with a 411 _METHODS_EXPECTING_BODY = {'PATCH', 'POST', 'PUT'} @@ -927,6 +937,12 @@ def putrequest(self, method, url, skip_host=0, skip_accept_encoding=0): self._method = method if not url: url = '/' + # Prevent CVE-2019-9740. + match = _contains_disallowed_url_pchar_re.search(url) + if match: + raise InvalidURL("URL can't contain control characters. %r " + "(found at least %r)" + % (url, match.group())) hdr = '%s %s %s' % (method, url, self._http_vsn_str) self._output(hdr) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 1ce9201c0693..d7778d4194f3 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -257,6 +257,31 @@ def test_url_fragment(self): finally: self.unfakehttp() + def test_url_with_control_char_rejected(self): + for char_no in range(0, 0x21) + range(0x7f, 0x100): + char = chr(char_no) + schemeless_url = "//localhost:7777/test%s/" % char + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + try: + # urllib quotes the URL so there is no injection. + resp = urllib.urlopen("http:" + schemeless_url) + self.assertNotIn(char, resp.geturl()) + finally: + self.unfakehttp() + + def test_url_with_newline_header_injection_rejected(self): + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + host = "localhost:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123" + schemeless_url = "//" + host + ":8080/test/?test=a" + try: + # urllib quotes the URL so there is no injection. + resp = urllib.urlopen("http:" + schemeless_url) + self.assertNotIn(' ', resp.geturl()) + self.assertNotIn('\r', resp.geturl()) + self.assertNotIn('\n', resp.geturl()) + finally: + self.unfakehttp() + def test_read_bogus(self): # urlopen() should raise IOError for many error codes. self.fakehttp('''HTTP/1.1 401 Authentication Required diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 6d24d5ddf83c..9531818e16b2 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -15,6 +15,9 @@ except ImportError: ssl = None +from test.test_urllib import FakeHTTPMixin + + # XXX # Request # CacheFTPHandler (hard to write) @@ -1262,7 +1265,7 @@ def _test_basic_auth(self, opener, auth_handler, auth_header, self.assertEqual(len(http_handler.requests), 1) self.assertFalse(http_handler.requests[0].has_header(auth_header)) -class MiscTests(unittest.TestCase): +class MiscTests(unittest.TestCase, FakeHTTPMixin): def test_build_opener(self): class MyHTTPHandler(urllib2.HTTPHandler): pass @@ -1317,6 +1320,52 @@ def test_unsupported_algorithm(self): "Unsupported digest authentication algorithm 'invalid'" ) + @unittest.skipUnless(ssl, "ssl module required") + def test_url_with_control_char_rejected(self): + for char_no in range(0, 0x21) + range(0x7f, 0x100): + char = chr(char_no) + schemeless_url = "//localhost:7777/test%s/" % char + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + try: + # We explicitly test urllib.request.urlopen() instead of the top + # level 'def urlopen()' function defined in this... (quite ugly) + # test suite. They use different url opening codepaths. Plain + # urlopen uses FancyURLOpener which goes via a codepath that + # calls urllib.parse.quote() on the URL which makes all of the + # above attempts at injection within the url _path_ safe. + escaped_char_repr = repr(char).replace('\\', r'\\') + InvalidURL = httplib.InvalidURL + with self.assertRaisesRegexp( + InvalidURL, "contain control.*" + escaped_char_repr): + urllib2.urlopen("http:" + schemeless_url) + with self.assertRaisesRegexp( + InvalidURL, "contain control.*" + escaped_char_repr): + urllib2.urlopen("https:" + schemeless_url) + finally: + self.unfakehttp() + + @unittest.skipUnless(ssl, "ssl module required") + def test_url_with_newline_header_injection_rejected(self): + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + host = "localhost:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123" + schemeless_url = "//" + host + ":8080/test/?test=a" + try: + # We explicitly test urllib2.urlopen() instead of the top + # level 'def urlopen()' function defined in this... (quite ugly) + # test suite. They use different url opening codepaths. Plain + # urlopen uses FancyURLOpener which goes via a codepath that + # calls urllib.parse.quote() on the URL which makes all of the + # above attempts at injection within the url _path_ safe. + InvalidURL = httplib.InvalidURL + with self.assertRaisesRegexp( + InvalidURL, r"contain control.*\\r.*(found at least . .)"): + urllib2.urlopen("http:" + schemeless_url) + with self.assertRaisesRegexp(InvalidURL, r"contain control.*\\n"): + urllib2.urlopen("https:" + schemeless_url) + finally: + self.unfakehttp() + + class RequestTests(unittest.TestCase): diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 36b3be67fd6b..90ccb30716ff 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -659,7 +659,13 @@ def test_dotted_attribute(self): def test_partial_post(self): # Check that a partial POST doesn't make the server loop: issue #14001. conn = httplib.HTTPConnection(ADDR, PORT) - conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') + conn.send('POST /RPC2 HTTP/1.0\r\n' + 'Content-Length: 100\r\n\r\n' + 'bye HTTP/1.1\r\n' + 'Host: %s:%s\r\n' + 'Accept-Encoding: identity\r\n' + 'Content-Length: 0\r\n\r\n' + % (ADDR, PORT)) conn.close() class SimpleServerEncodingTestCase(BaseServerTestCase): diff --git a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst new file mode 100644 index 000000000000..47cb899df1af --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst @@ -0,0 +1 @@ +Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause an httplib.InvalidURL exception to be raised. From webhook-mailer at python.org Tue May 21 09:34:42 2019 From: webhook-mailer at python.org (Eric V. Smith) Date: Tue, 21 May 2019 13:34:42 -0000 Subject: [Python-checkins] Annotate the unexplained assignment in exception unbinding (GH-11448) Message-ID: https://github.com/python/cpython/commit/ad098b6750f4d74387ac21c8e23ae1ee7ff13571 commit: ad098b6750f4d74387ac21c8e23ae1ee7ff13571 branch: master author: Chris Angelico committer: Eric V. Smith date: 2019-05-21T09:34:19-04:00 summary: Annotate the unexplained assignment in exception unbinding (GH-11448) files: M Python/compile.c diff --git a/Python/compile.c b/Python/compile.c index b20548c77724..63b2456bb3e8 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2931,7 +2931,7 @@ compiler_try_except(struct compiler *c, stmt_ty s) try: # body finally: - name = None + name = None # in case body contains "del name" del name */ From webhook-mailer at python.org Tue May 21 11:41:48 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 May 2019 15:41:48 -0000 Subject: [Python-checkins] bpo-34144: Fix of venv acvtivate.bat for win 10 (GH-8321) Message-ID: https://github.com/python/cpython/commit/3c9c2dc8dde709a5f27c74aff1614d6ed3456964 commit: 3c9c2dc8dde709a5f27c74aff1614d6ed3456964 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-21T08:41:44-07:00 summary: bpo-34144: Fix of venv acvtivate.bat for win 10 (GH-8321) The script needs to be updated to support win 10/ 1803 chcp.com command (output has trailing dot) https://bugs.python.org/issue34144 (cherry picked from commit 6955d44b41058e3bcc59ff41860bd4cc8948c441) Co-authored-by: Lorenz Mende files: A Misc/NEWS.d/next/Windows/2019-04-10-04-35-31.bpo-34144._KzB5z.rst M Lib/venv/scripts/nt/activate.bat diff --git a/Lib/venv/scripts/nt/activate.bat b/Lib/venv/scripts/nt/activate.bat index 126049f495fe..da831bb42c79 100644 --- a/Lib/venv/scripts/nt/activate.bat +++ b/Lib/venv/scripts/nt/activate.bat @@ -1,7 +1,7 @@ @echo off rem This file is UTF-8 encoded, so we need to update the current code page while executing it -for /f "tokens=2 delims=:" %%a in ('"%SystemRoot%\System32\chcp.com"') do ( +for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( set "_OLD_CODEPAGE=%%a" ) if defined _OLD_CODEPAGE ( diff --git a/Misc/NEWS.d/next/Windows/2019-04-10-04-35-31.bpo-34144._KzB5z.rst b/Misc/NEWS.d/next/Windows/2019-04-10-04-35-31.bpo-34144._KzB5z.rst new file mode 100644 index 000000000000..7b8ca821b401 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-04-10-04-35-31.bpo-34144._KzB5z.rst @@ -0,0 +1,2 @@ +Fixed activate.bat to correctly update codepage when chcp.com returns dots in output. +Patch by Lorenz Mende. From webhook-mailer at python.org Tue May 21 13:09:47 2019 From: webhook-mailer at python.org (Dino Viehland) Date: Tue, 21 May 2019 17:09:47 -0000 Subject: [Python-checkins] bpo-36929: Modify io/re tests to allow for missing mod name (#13392) Message-ID: https://github.com/python/cpython/commit/ccb7ca728e09b307f9e9fd36ec40353137e68a3b commit: ccb7ca728e09b307f9e9fd36ec40353137e68a3b branch: master author: Max Bernstein committer: Dino Viehland date: 2019-05-21T10:09:21-07:00 summary: bpo-36929: Modify io/re tests to allow for missing mod name (#13392) * bpo-36929: Modify io/re tests to allow for missing mod name For a vanishingly small number of internal types, CPython sets the tp_name slot to mod_name.type_name, either in the PyTypeObject or the PyType_Spec. There are a few minor places where this surfaces: * Custom repr functions for those types (some of which ignore the tp_name in favor of using a string literal, such as _io.TextIOWrapper) * Pickling error messages The test suite only tests the former. This commit modifies the test suite to allow Python implementations to omit the module prefix. https://bugs.python.org/issue36929 files: M Lib/test/test_io.py M Lib/test/test_re.py M Misc/ACKS diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 5406a2891bb2..dc44e506b1d0 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1119,12 +1119,12 @@ def f(): def test_repr(self): raw = self.MockRawIO() b = self.tp(raw) - clsname = "%s.%s" % (self.tp.__module__, self.tp.__qualname__) - self.assertEqual(repr(b), "<%s>" % clsname) + clsname = r"(%s\.)?%s" % (self.tp.__module__, self.tp.__qualname__) + self.assertRegex(repr(b), "<%s>" % clsname) raw.name = "dummy" - self.assertEqual(repr(b), "<%s name='dummy'>" % clsname) + self.assertRegex(repr(b), "<%s name='dummy'>" % clsname) raw.name = b"dummy" - self.assertEqual(repr(b), "<%s name=b'dummy'>" % clsname) + self.assertRegex(repr(b), "<%s name=b'dummy'>" % clsname) def test_recursive_repr(self): # Issue #25455 @@ -2598,17 +2598,17 @@ def test_repr(self): b = self.BufferedReader(raw) t = self.TextIOWrapper(b, encoding="utf-8") modname = self.TextIOWrapper.__module__ - self.assertEqual(repr(t), - "<%s.TextIOWrapper encoding='utf-8'>" % modname) + self.assertRegex(repr(t), + r"<(%s\.)?TextIOWrapper encoding='utf-8'>" % modname) raw.name = "dummy" - self.assertEqual(repr(t), - "<%s.TextIOWrapper name='dummy' encoding='utf-8'>" % modname) + self.assertRegex(repr(t), + r"<(%s\.)?TextIOWrapper name='dummy' encoding='utf-8'>" % modname) t.mode = "r" - self.assertEqual(repr(t), - "<%s.TextIOWrapper name='dummy' mode='r' encoding='utf-8'>" % modname) + self.assertRegex(repr(t), + r"<(%s\.)?TextIOWrapper name='dummy' mode='r' encoding='utf-8'>" % modname) raw.name = b"dummy" - self.assertEqual(repr(t), - "<%s.TextIOWrapper name=b'dummy' mode='r' encoding='utf-8'>" % modname) + self.assertRegex(repr(t), + r"<(%s\.)?TextIOWrapper name=b'dummy' mode='r' encoding='utf-8'>" % modname) t.buffer.detach() repr(t) # Should not raise an exception @@ -4174,11 +4174,11 @@ def run(): err = res.err.decode() if res.rc != 0: # Failure: should be a fatal error - self.assertIn("Fatal Python error: could not acquire lock " - "for <_io.BufferedWriter name='<{stream_name}>'> " - "at interpreter shutdown, possibly due to " - "daemon threads".format_map(locals()), - err) + pattern = (r"Fatal Python error: could not acquire lock " + r"for <(_io\.)?BufferedWriter name='<{stream_name}>'> " + r"at interpreter shutdown, possibly due to " + r"daemon threads".format_map(locals())) + self.assertRegex(err, pattern) else: self.assertFalse(err.strip('.!')) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 0a77e6fe9edc..137c31de59ae 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1761,24 +1761,28 @@ def test_issue17998(self): def test_match_repr(self): for string in '[abracadabra]', S('[abracadabra]'): m = re.search(r'(.+)(.*?)\1', string) - self.assertEqual(repr(m), "<%s.%s object; " - "span=(1, 12), match='abracadabra'>" % - (type(m).__module__, type(m).__qualname__)) + pattern = r"<(%s\.)?%s object; span=\(1, 12\), match='abracadabra'>" % ( + type(m).__module__, type(m).__qualname__ + ) + self.assertRegex(repr(m), pattern) for string in (b'[abracadabra]', B(b'[abracadabra]'), bytearray(b'[abracadabra]'), memoryview(b'[abracadabra]')): m = re.search(br'(.+)(.*?)\1', string) - self.assertEqual(repr(m), "<%s.%s object; " - "span=(1, 12), match=b'abracadabra'>" % - (type(m).__module__, type(m).__qualname__)) + pattern = r"<(%s\.)?%s object; span=\(1, 12\), match=b'abracadabra'>" % ( + type(m).__module__, type(m).__qualname__ + ) + self.assertRegex(repr(m), pattern) first, second = list(re.finditer("(aa)|(bb)", "aa bb")) - self.assertEqual(repr(first), "<%s.%s object; " - "span=(0, 2), match='aa'>" % - (type(second).__module__, type(first).__qualname__)) - self.assertEqual(repr(second), "<%s.%s object; " - "span=(3, 5), match='bb'>" % - (type(second).__module__, type(second).__qualname__)) + pattern = r"<(%s\.)?%s object; span=\(0, 2\), match='aa'>" % ( + type(second).__module__, type(second).__qualname__ + ) + self.assertRegex(repr(first), pattern) + pattern = r"<(%s\.)?%s object; span=\(3, 5\), match='bb'>" % ( + type(second).__module__, type(second).__qualname__ + ) + self.assertRegex(repr(second), pattern) def test_zerowidth(self): # Issues 852532, 1647489, 3262, 25054. diff --git a/Misc/ACKS b/Misc/ACKS index 87107b9cfc7d..6b1fdbc37fa9 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -143,6 +143,7 @@ Michel Van den Bergh Julian Berman Brice Berna Olivier Bernard +Maxwell Bernstein Eric Beser Steven Bethard Stephen Bevan From webhook-mailer at python.org Tue May 21 13:44:57 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Tue, 21 May 2019 17:44:57 -0000 Subject: [Python-checkins] bpo-36035: fix Path.rglob for broken links (GH-11988) Message-ID: https://github.com/python/cpython/commit/d5c120f7eb6f2a9cdab282a5d588afed307a23df commit: d5c120f7eb6f2a9cdab282a5d588afed307a23df branch: master author: J?rg Stucke committer: Antoine Pitrou date: 2019-05-21T19:44:40+02:00 summary: bpo-36035: fix Path.rglob for broken links (GH-11988) Links creating an infinite symlink loop would raise an exception. files: A Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Lib/pathlib.py b/Lib/pathlib.py index b5bab1fe8f5a..6369c4b2218d 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -7,7 +7,7 @@ import re import sys from _collections_abc import Sequence -from errno import EINVAL, ENOENT, ENOTDIR, EBADF +from errno import EINVAL, ENOENT, ENOTDIR, EBADF, ELOOP from operator import attrgetter from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO from urllib.parse import quote_from_bytes as urlquote_from_bytes @@ -35,10 +35,11 @@ # # EBADF - guard against macOS `stat` throwing EBADF -_IGNORED_ERROS = (ENOENT, ENOTDIR, EBADF) +_IGNORED_ERROS = (ENOENT, ENOTDIR, EBADF, ELOOP) _IGNORED_WINERRORS = ( 21, # ERROR_NOT_READY - drive exists but is not accessible + 1921, # ERROR_CANT_RESOLVE_FILENAME - fix for broken symlink pointing to itself ) def _ignore_error(exception): @@ -520,7 +521,13 @@ def _select_from(self, parent_path, is_dir, exists, scandir): cf = parent_path._flavour.casefold entries = list(scandir(parent_path)) for entry in entries: - if not self.dironly or entry.is_dir(): + entry_is_dir = False + try: + entry_is_dir = entry.is_dir() + except OSError as e: + if not _ignore_error(e): + raise + if not self.dironly or entry_is_dir: name = entry.name casefolded = cf(name) if self.pat.match(casefolded): diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index caad1c23876a..069467a8459f 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1221,7 +1221,8 @@ class _BasePathTest(object): # |-- dirE # No permissions # |-- fileA # |-- linkA -> fileA - # `-- linkB -> dirB + # |-- linkB -> dirB + # `-- brokenLinkLoop -> brokenLinkLoop # def setUp(self): @@ -1252,6 +1253,8 @@ def cleanup(): self.dirlink(os.path.join('..', 'dirB'), join('dirA', 'linkC')) # This one goes upwards, creating a loop. self.dirlink(os.path.join('..', 'dirB'), join('dirB', 'linkD')) + # Broken symlink (pointing to itself). + os.symlink('brokenLinkLoop', join('brokenLinkLoop')) if os.name == 'nt': # Workaround for http://bugs.python.org/issue13772. @@ -1384,7 +1387,7 @@ def test_iterdir(self): paths = set(it) expected = ['dirA', 'dirB', 'dirC', 'dirE', 'fileA'] if support.can_symlink(): - expected += ['linkA', 'linkB', 'brokenLink'] + expected += ['linkA', 'linkB', 'brokenLink', 'brokenLinkLoop'] self.assertEqual(paths, { P(BASE, q) for q in expected }) @support.skip_unless_symlink @@ -1465,6 +1468,7 @@ def test_rglob_symlink_loop(self): 'fileA', 'linkA', 'linkB', + 'brokenLinkLoop', } self.assertEqual(given, {p / x for x in expect}) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst new file mode 100644 index 000000000000..1e4f7ac71f33 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst @@ -0,0 +1 @@ +Added fix for broken symlinks in combination with pathlib \ No newline at end of file From webhook-mailer at python.org Tue May 21 13:47:46 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 May 2019 17:47:46 -0000 Subject: [Python-checkins] bpo-23378: Add an extend action to argparse (GH-13305) Message-ID: https://github.com/python/cpython/commit/aa32a7e1116f7aaaef9fec453db910e90ab7b101 commit: aa32a7e1116f7aaaef9fec453db910e90ab7b101 branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-21T10:47:42-07:00 summary: bpo-23378: Add an extend action to argparse (GH-13305) Add an extend action to argparse https://bugs.python.org/issue23378 files: A Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst M Doc/library/argparse.rst M Lib/argparse.py M Lib/test/test_argparse.py diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index cef197f30555..b77a38ccd485 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -797,6 +797,15 @@ how the command-line arguments should be handled. The supplied actions are: >>> parser.parse_args(['--version']) PROG 2.0 +* ``'extend'`` - This stores a list, and extends each argument value to the + list. + Example usage:: + + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument("--foo", action="extend", nargs="+", type=str) + >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"]) + Namespace(foo=['f1', 'f2', 'f3', 'f4']) + You may also specify an arbitrary action by passing an Action subclass or other object that implements the same interface. The recommended way to do this is to extend :class:`Action`, overriding the ``__call__`` method diff --git a/Lib/argparse.py b/Lib/argparse.py index 798766f6c408..ef888f063b32 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1154,6 +1154,12 @@ def __call__(self, parser, namespace, values, option_string=None): vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, []) getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings) +class _ExtendAction(_AppendAction): + def __call__(self, parser, namespace, values, option_string=None): + items = getattr(namespace, self.dest, None) + items = _copy_items(items) + items.extend(values) + setattr(namespace, self.dest, items) # ============== # Type classes @@ -1262,6 +1268,7 @@ def __init__(self, self.register('action', 'help', _HelpAction) self.register('action', 'version', _VersionAction) self.register('action', 'parsers', _SubParsersAction) + self.register('action', 'extend', _ExtendAction) # raise an exception if the conflict handler is invalid self._get_handler() diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index e849c7ba49bc..9d68f40571fe 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -1786,6 +1786,15 @@ def test(self): self.assertEqual(parser.parse_args(['42']), NS(badger='foo[42]')) +class TestActionExtend(ParserTestCase): + argument_signatures = [ + Sig('--foo', action="extend", nargs="+", type=str), + ] + failures = () + successes = [ + ('--foo f1 --foo f2 f3 f4', NS(foo=['f1', 'f2', 'f3', 'f4'])), + ] + # ================ # Subparsers tests # ================ diff --git a/Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst b/Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst new file mode 100644 index 000000000000..c7c3f174d637 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst @@ -0,0 +1 @@ +Add an extend action to argparser. From webhook-mailer at python.org Tue May 21 13:52:00 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 May 2019 17:52:00 -0000 Subject: [Python-checkins] bpo-36929: Modify io/re tests to allow for missing mod name (GH-13392) Message-ID: https://github.com/python/cpython/commit/6b48e658bf80b0e30fddd9dfe80021313e57fb6a commit: 6b48e658bf80b0e30fddd9dfe80021313e57fb6a branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-21T10:51:56-07:00 summary: bpo-36929: Modify io/re tests to allow for missing mod name (GH-13392) * bpo-36929: Modify io/re tests to allow for missing mod name For a vanishingly small number of internal types, CPython sets the tp_name slot to mod_name.type_name, either in the PyTypeObject or the PyType_Spec. There are a few minor places where this surfaces: * Custom repr functions for those types (some of which ignore the tp_name in favor of using a string literal, such as _io.TextIOWrapper) * Pickling error messages The test suite only tests the former. This commit modifies the test suite to allow Python implementations to omit the module prefix. https://bugs.python.org/issue36929 (cherry picked from commit ccb7ca728e09b307f9e9fd36ec40353137e68a3b) Co-authored-by: Max Bernstein files: M Lib/test/test_io.py M Lib/test/test_re.py M Misc/ACKS diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 6655576b6d4b..d6bf43d0a0c1 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1104,12 +1104,12 @@ def f(): def test_repr(self): raw = self.MockRawIO() b = self.tp(raw) - clsname = "%s.%s" % (self.tp.__module__, self.tp.__qualname__) - self.assertEqual(repr(b), "<%s>" % clsname) + clsname = r"(%s\.)?%s" % (self.tp.__module__, self.tp.__qualname__) + self.assertRegex(repr(b), "<%s>" % clsname) raw.name = "dummy" - self.assertEqual(repr(b), "<%s name='dummy'>" % clsname) + self.assertRegex(repr(b), "<%s name='dummy'>" % clsname) raw.name = b"dummy" - self.assertEqual(repr(b), "<%s name=b'dummy'>" % clsname) + self.assertRegex(repr(b), "<%s name=b'dummy'>" % clsname) def test_recursive_repr(self): # Issue #25455 @@ -2565,17 +2565,17 @@ def test_repr(self): b = self.BufferedReader(raw) t = self.TextIOWrapper(b, encoding="utf-8") modname = self.TextIOWrapper.__module__ - self.assertEqual(repr(t), - "<%s.TextIOWrapper encoding='utf-8'>" % modname) + self.assertRegex(repr(t), + r"<(%s\.)?TextIOWrapper encoding='utf-8'>" % modname) raw.name = "dummy" - self.assertEqual(repr(t), - "<%s.TextIOWrapper name='dummy' encoding='utf-8'>" % modname) + self.assertRegex(repr(t), + r"<(%s\.)?TextIOWrapper name='dummy' encoding='utf-8'>" % modname) t.mode = "r" - self.assertEqual(repr(t), - "<%s.TextIOWrapper name='dummy' mode='r' encoding='utf-8'>" % modname) + self.assertRegex(repr(t), + r"<(%s\.)?TextIOWrapper name='dummy' mode='r' encoding='utf-8'>" % modname) raw.name = b"dummy" - self.assertEqual(repr(t), - "<%s.TextIOWrapper name=b'dummy' mode='r' encoding='utf-8'>" % modname) + self.assertRegex(repr(t), + r"<(%s\.)?TextIOWrapper name=b'dummy' mode='r' encoding='utf-8'>" % modname) t.buffer.detach() repr(t) # Should not raise an exception @@ -4098,11 +4098,11 @@ def run(): err = res.err.decode() if res.rc != 0: # Failure: should be a fatal error - self.assertIn("Fatal Python error: could not acquire lock " - "for <_io.BufferedWriter name='<{stream_name}>'> " - "at interpreter shutdown, possibly due to " - "daemon threads".format_map(locals()), - err) + pattern = (r"Fatal Python error: could not acquire lock " + r"for <(_io\.)?BufferedWriter name='<{stream_name}>'> " + r"at interpreter shutdown, possibly due to " + r"daemon threads".format_map(locals())) + self.assertRegex(err, pattern) else: self.assertFalse(err.strip('.!')) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 5ef6d7b12c50..cdccc7814f68 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1736,24 +1736,28 @@ def test_issue17998(self): def test_match_repr(self): for string in '[abracadabra]', S('[abracadabra]'): m = re.search(r'(.+)(.*?)\1', string) - self.assertEqual(repr(m), "<%s.%s object; " - "span=(1, 12), match='abracadabra'>" % - (type(m).__module__, type(m).__qualname__)) + pattern = r"<(%s\.)?%s object; span=\(1, 12\), match='abracadabra'>" % ( + type(m).__module__, type(m).__qualname__ + ) + self.assertRegex(repr(m), pattern) for string in (b'[abracadabra]', B(b'[abracadabra]'), bytearray(b'[abracadabra]'), memoryview(b'[abracadabra]')): m = re.search(br'(.+)(.*?)\1', string) - self.assertEqual(repr(m), "<%s.%s object; " - "span=(1, 12), match=b'abracadabra'>" % - (type(m).__module__, type(m).__qualname__)) + pattern = r"<(%s\.)?%s object; span=\(1, 12\), match=b'abracadabra'>" % ( + type(m).__module__, type(m).__qualname__ + ) + self.assertRegex(repr(m), pattern) first, second = list(re.finditer("(aa)|(bb)", "aa bb")) - self.assertEqual(repr(first), "<%s.%s object; " - "span=(0, 2), match='aa'>" % - (type(second).__module__, type(first).__qualname__)) - self.assertEqual(repr(second), "<%s.%s object; " - "span=(3, 5), match='bb'>" % - (type(second).__module__, type(second).__qualname__)) + pattern = r"<(%s\.)?%s object; span=\(0, 2\), match='aa'>" % ( + type(second).__module__, type(second).__qualname__ + ) + self.assertRegex(repr(first), pattern) + pattern = r"<(%s\.)?%s object; span=\(3, 5\), match='bb'>" % ( + type(second).__module__, type(second).__qualname__ + ) + self.assertRegex(repr(second), pattern) def test_zerowidth(self): # Issues 852532, 1647489, 3262, 25054. diff --git a/Misc/ACKS b/Misc/ACKS index 8468d5ffd5b7..6664f711f63e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -141,6 +141,7 @@ Michel Van den Bergh Julian Berman Brice Berna Olivier Bernard +Maxwell Bernstein Eric Beser Steven Bethard Stephen Bevan From webhook-mailer at python.org Tue May 21 15:04:02 2019 From: webhook-mailer at python.org (Tal Einat) Date: Tue, 21 May 2019 19:04:02 -0000 Subject: [Python-checkins] [3.7] bpo-19376: Added doc mentioning `datetime.strptime()` without a year fails for Feb 29. (GH-10243) Message-ID: https://github.com/python/cpython/commit/390d88e49c55c15fac7cdf60b649a4b9b15d189b commit: 390d88e49c55c15fac7cdf60b649a4b9b15d189b branch: 3.7 author: Tal Einat committer: GitHub date: 2019-05-21T22:03:58+03:00 summary: [3.7] bpo-19376: Added doc mentioning `datetime.strptime()` without a year fails for Feb 29. (GH-10243) (cherry picked from commit 56027ccd6b9dab4a090e4fef8574933fb9a36ff2) Co-authored-by: Abhishek Kumar Singh files: M Doc/library/datetime.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 1ee23c2175a2..00cfaeb66f5a 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -2031,6 +2031,9 @@ For :class:`date` objects, the format codes for hours, minutes, seconds, and microseconds should not be used, as :class:`date` objects have no such values. If they're used anyway, ``0`` is substituted for them. +For the :meth:`datetime.strptime` class method, the default value is ``1900-01-01T00:00:00.000``: +any components not specified in the format string will be pulled from the default value. [#]_ + The full set of format codes supported varies across platforms, because Python calls the platform C library's :func:`strftime` function, and platform variations are common. To see the full set of format codes supported on your @@ -2265,3 +2268,4 @@ Notes: .. rubric:: Footnotes .. [#] If, that is, we ignore the effects of Relativity +.. [#] Passing ``datetime.strptime('Feb 29', '%b %d')`` will fail since ``1900`` is not a leap year. From webhook-mailer at python.org Tue May 21 15:05:13 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 May 2019 19:05:13 -0000 Subject: [Python-checkins] [3.7] bpo-36035: fix Path.rglob for broken links (GH-11988) (GH-13469) Message-ID: https://github.com/python/cpython/commit/aea49b18752880e5d0260f16ca7ff2c6dce78515 commit: aea49b18752880e5d0260f16ca7ff2c6dce78515 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-21T12:05:08-07:00 summary: [3.7] bpo-36035: fix Path.rglob for broken links (GH-11988) (GH-13469) Links creating an infinite symlink loop would raise an exception. (cherry picked from commit d5c120f7eb6f2a9cdab282a5d588afed307a23df) Co-authored-by: J?rg Stucke https://bugs.python.org/issue36035 files: A Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Lib/pathlib.py b/Lib/pathlib.py index e6e718166283..24437f8f95d1 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -7,7 +7,7 @@ import re import sys from _collections_abc import Sequence -from errno import EINVAL, ENOENT, ENOTDIR, EBADF +from errno import EINVAL, ENOENT, ENOTDIR, EBADF, ELOOP from operator import attrgetter from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO from urllib.parse import quote_from_bytes as urlquote_from_bytes @@ -35,10 +35,11 @@ # # EBADF - guard against macOS `stat` throwing EBADF -_IGNORED_ERROS = (ENOENT, ENOTDIR, EBADF) +_IGNORED_ERROS = (ENOENT, ENOTDIR, EBADF, ELOOP) _IGNORED_WINERRORS = ( 21, # ERROR_NOT_READY - drive exists but is not accessible + 1921, # ERROR_CANT_RESOLVE_FILENAME - fix for broken symlink pointing to itself ) def _ignore_error(exception): @@ -518,7 +519,13 @@ def _select_from(self, parent_path, is_dir, exists, scandir): cf = parent_path._flavour.casefold entries = list(scandir(parent_path)) for entry in entries: - if not self.dironly or entry.is_dir(): + entry_is_dir = False + try: + entry_is_dir = entry.is_dir() + except OSError as e: + if not _ignore_error(e): + raise + if not self.dironly or entry_is_dir: name = entry.name casefolded = cf(name) if self.pat.match(casefolded): diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 056507ef6fe8..f7ed1d1e48fb 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1218,7 +1218,8 @@ class _BasePathTest(object): # |-- dirE # No permissions # |-- fileA # |-- linkA -> fileA - # `-- linkB -> dirB + # |-- linkB -> dirB + # `-- brokenLinkLoop -> brokenLinkLoop # def setUp(self): @@ -1249,6 +1250,8 @@ def cleanup(): self.dirlink(os.path.join('..', 'dirB'), join('dirA', 'linkC')) # This one goes upwards, creating a loop self.dirlink(os.path.join('..', 'dirB'), join('dirB', 'linkD')) + # Broken symlink (pointing to itself). + os.symlink('brokenLinkLoop', join('brokenLinkLoop')) if os.name == 'nt': # Workaround for http://bugs.python.org/issue13772 @@ -1379,7 +1382,7 @@ def test_iterdir(self): paths = set(it) expected = ['dirA', 'dirB', 'dirC', 'dirE', 'fileA'] if support.can_symlink(): - expected += ['linkA', 'linkB', 'brokenLink'] + expected += ['linkA', 'linkB', 'brokenLink', 'brokenLinkLoop'] self.assertEqual(paths, { P(BASE, q) for q in expected }) @support.skip_unless_symlink @@ -1460,6 +1463,7 @@ def test_rglob_symlink_loop(self): 'fileA', 'linkA', 'linkB', + 'brokenLinkLoop', } self.assertEqual(given, {p / x for x in expect}) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst new file mode 100644 index 000000000000..1e4f7ac71f33 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst @@ -0,0 +1 @@ +Added fix for broken symlinks in combination with pathlib \ No newline at end of file From webhook-mailer at python.org Tue May 21 16:12:08 2019 From: webhook-mailer at python.org (Yury Selivanov) Date: Tue, 21 May 2019 20:12:08 -0000 Subject: [Python-checkins] bpo-34616: Add PyCF_ALLOW_TOP_LEVEL_AWAIT to allow top-level await (GH-13148) Message-ID: https://github.com/python/cpython/commit/565b4f1ac7304d1e690c404ca8316f383ba60862 commit: 565b4f1ac7304d1e690c404ca8316f383ba60862 branch: master author: Matthias Bussonnier committer: Yury Selivanov date: 2019-05-21T16:12:02-04:00 summary: bpo-34616: Add PyCF_ALLOW_TOP_LEVEL_AWAIT to allow top-level await (GH-13148) Co-Authored-By: Yury Selivanov files: A Misc/NEWS.d/next/Core and Builtins/2019-05-07-17-12-37.bpo-34616.0Y0_9r.rst M Doc/library/functions.rst M Include/compile.h M Lib/test/test_builtin.py M Parser/asdl_c.py M Python/Python-ast.c M Python/compile.c diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 613e4f74ac41..1a9a8b5beeee 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -257,6 +257,12 @@ are always available. They are listed here in alphabetical order. can be found as the :attr:`~__future__._Feature.compiler_flag` attribute on the :class:`~__future__._Feature` instance in the :mod:`__future__` module. + The optional argument *flags* also controls whether the compiled source is + allowed to contain top-level ``await``, ``async for`` and ``async with``. + When the bit ``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` is set, the return code + object has ``CO_COROUTINE`` set in ``co_code``, and can be interactively + executed via ``await eval(code_object)``. + The argument *optimize* specifies the optimization level of the compiler; the default value of ``-1`` selects the optimization level of the interpreter as given by :option:`-O` options. Explicit levels are ``0`` (no optimization; @@ -290,6 +296,10 @@ are always available. They are listed here in alphabetical order. Previously, :exc:`TypeError` was raised when null bytes were encountered in *source*. + .. versionadded:: 3.8 + ``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` can now be passed in flags to enable + support for top-level ``await``, ``async for``, and ``async with``. + .. class:: complex([real[, imag]]) diff --git a/Include/compile.h b/Include/compile.h index 13708678675f..a833caa06b9d 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -23,6 +23,7 @@ PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); #define PyCF_ONLY_AST 0x0400 #define PyCF_IGNORE_COOKIE 0x0800 #define PyCF_TYPE_COMMENTS 0x1000 +#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000 #ifndef Py_LIMITED_API typedef struct { diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 5674ea89b1c4..4a358e89d1c2 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1,6 +1,7 @@ # Python test set -- built-in functions import ast +import asyncio import builtins import collections import decimal @@ -18,9 +19,14 @@ import unittest import warnings from contextlib import ExitStack +from inspect import CO_COROUTINE +from itertools import product +from textwrap import dedent +from types import AsyncGeneratorType, FunctionType from operator import neg from test.support import ( - EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink) + EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink, + maybe_get_event_loop_policy) from test.support.script_helper import assert_python_ok from unittest.mock import MagicMock, patch try: @@ -358,6 +364,71 @@ def f(): """doc""" rv = ns['f']() self.assertEqual(rv, tuple(expected)) + def test_compile_top_level_await(self): + """Test whether code some top level await can be compiled. + + Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag set, + and make sure the generated code object has the CO_COROUTINE flag set in + order to execute it with `await eval(.....)` instead of exec, or via a + FunctionType. + """ + + # helper function just to check we can run top=level async-for + async def arange(n): + for i in range(n): + yield i + + modes = ('single', 'exec') + code_samples = ['''a = await asyncio.sleep(0, result=1)''', + '''async for i in arange(1): + a = 1''', + '''async with asyncio.Lock() as l: + a = 1'''] + policy = maybe_get_event_loop_policy() + try: + for mode, code_sample in product(modes,code_samples): + source = dedent(code_sample) + with self.assertRaises(SyntaxError, msg=f"{source=} {mode=}"): + compile(source, '?' , mode) + + co = compile(source, + '?', + mode, + flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT) + + self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE, + msg=f"{source=} {mode=}") + + + # test we can create and advance a function type + globals_ = {'asyncio': asyncio, 'a':0, 'arange': arange} + async_f = FunctionType(co, globals_) + asyncio.run(async_f()) + self.assertEqual(globals_['a'], 1) + + # test we can await-eval, + globals_ = {'asyncio': asyncio, 'a':0, 'arange': arange} + asyncio.run(eval(co, globals_)) + self.assertEqual(globals_['a'], 1) + finally: + asyncio.set_event_loop_policy(policy) + + def test_compile_async_generator(self): + """ + With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to + make sure AsyncGenerators are still properly not marked with CO_COROUTINE + """ + code = dedent("""async def ticker(): + for i in range(10): + yield i + await asyncio.sleep(0)""") + + co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT) + glob = {} + exec(co, glob) + self.assertEqual(type(glob['ticker']()), AsyncGeneratorType) + + def test_delattr(self): sys.spam = 1 delattr(sys, 'spam') diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-17-12-37.bpo-34616.0Y0_9r.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-17-12-37.bpo-34616.0Y0_9r.rst new file mode 100644 index 000000000000..c264d21bd016 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-17-12-37.bpo-34616.0Y0_9r.rst @@ -0,0 +1 @@ +The ``compile()`` builtin functions now support the ``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag, which allow to compile sources that contains top-level ``await``, ``async with`` or ``async for``. This is useful to evaluate async-code from with an already async functions; for example in a custom REPL. \ No newline at end of file diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 4091b6db638c..cb0e6d7f9df2 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1000,6 +1000,8 @@ def visitModule(self, mod): self.emit("if (!m) return NULL;", 1) self.emit("d = PyModule_GetDict(m);", 1) self.emit('if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;', 1) + self.emit('if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0)', 1) + self.emit("return NULL;", 2) self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)', 1) self.emit("return NULL;", 2) self.emit('if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0)', 1) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index cb53a41cdf35..552750584480 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -8776,6 +8776,8 @@ PyInit__ast(void) if (!m) return NULL; d = PyModule_GetDict(m); if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL; + if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) + return NULL; if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) return NULL; if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) diff --git a/Python/compile.c b/Python/compile.c index 63b2456bb3e8..734e8401ff02 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2609,7 +2609,9 @@ static int compiler_async_for(struct compiler *c, stmt_ty s) { basicblock *start, *except, *end; - if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) { + if (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT){ + c->u->u_ste->ste_coroutine = 1; + } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) { return compiler_error(c, "'async for' outside async function"); } @@ -4564,7 +4566,9 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos); assert(s->kind == AsyncWith_kind); - if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) { + if (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT){ + c->u->u_ste->ste_coroutine = 1; + } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){ return compiler_error(c, "'async with' outside async function"); } @@ -4773,12 +4777,16 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) ADDOP(c, YIELD_FROM); break; case Await_kind: - if (c->u->u_ste->ste_type != FunctionBlock) - return compiler_error(c, "'await' outside function"); + if (!(c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT)){ + if (c->u->u_ste->ste_type != FunctionBlock){ + return compiler_error(c, "'await' outside function"); + } - if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION && - c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION) - return compiler_error(c, "'await' outside async function"); + if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION && + c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){ + return compiler_error(c, "'await' outside async function"); + } + } VISIT(c, expr, e->v.Await.value); ADDOP(c, GET_AWAITABLE); @@ -5712,6 +5720,12 @@ compute_code_flags(struct compiler *c) /* (Only) inherit compilerflags in PyCF_MASK */ flags |= (c->c_flags->cf_flags & PyCF_MASK); + if ((c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) && + ste->ste_coroutine && + !ste->ste_generator) { + flags |= CO_COROUTINE; + } + return flags; } From webhook-mailer at python.org Tue May 21 16:27:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 May 2019 20:27:43 -0000 Subject: [Python-checkins] bpo-25652: Fix __rmod__ of UserString (GH-13326) Message-ID: https://github.com/python/cpython/commit/7abf8c60819d5749e6225b371df51a9c5f1ea8e9 commit: 7abf8c60819d5749e6225b371df51a9c5f1ea8e9 branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-21T13:27:36-07:00 summary: bpo-25652: Fix __rmod__ of UserString (GH-13326) The ``__rmod__`` method of ``collections.UserString`` class had a bug that made it unusable. https://bugs.python.org/issue25652 files: A Misc/NEWS.d/next/Library/2019-05-14-21-39-52.bpo-25652.xLw42k.rst M Lib/collections/__init__.py M Lib/test/test_userstring.py diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 960d82a5dcfb..cb7f1bb1fcfe 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1214,9 +1214,8 @@ def __mul__(self, n): __rmul__ = __mul__ def __mod__(self, args): return self.__class__(self.data % args) - def __rmod__(self, format): - return self.__class__(format % args) - + def __rmod__(self, template): + return self.__class__(str(template) % self) # the following methods are defined in alphabetical order: def capitalize(self): return self.__class__(self.data.capitalize()) def casefold(self): diff --git a/Lib/test/test_userstring.py b/Lib/test/test_userstring.py index 71528223d35b..19b0acfc760f 100644 --- a/Lib/test/test_userstring.py +++ b/Lib/test/test_userstring.py @@ -39,6 +39,18 @@ def checkcall(self, object, methodname, *args): # we don't fix the arguments, because UserString can't cope with it getattr(object, methodname)(*args) + def test_rmod(self): + class ustr2(UserString): + pass + + class ustr3(ustr2): + def __rmod__(self, other): + return super().__rmod__(other) + + fmt2 = ustr2('value is %s') + str3 = ustr3('TEST') + self.assertEqual(fmt2 % str3, 'value is TEST') + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-05-14-21-39-52.bpo-25652.xLw42k.rst b/Misc/NEWS.d/next/Library/2019-05-14-21-39-52.bpo-25652.xLw42k.rst new file mode 100644 index 000000000000..421fccfe8c73 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-14-21-39-52.bpo-25652.xLw42k.rst @@ -0,0 +1 @@ +Fix bug in ``__rmod__`` of ``UserString`` - by Batuhan Taskaya. From webhook-mailer at python.org Tue May 21 17:12:45 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 May 2019 21:12:45 -0000 Subject: [Python-checkins] bpo-35907, CVE-2019-9948: urllib rejects local_file:// scheme (GH-11842) Message-ID: https://github.com/python/cpython/commit/b15bde8058e821b383d81fcae68b335a752083ca commit: b15bde8058e821b383d81fcae68b335a752083ca branch: 2.7 author: SH committer: Victor Stinner date: 2019-05-21T23:12:23+02:00 summary: bpo-35907, CVE-2019-9948: urllib rejects local_file:// scheme (GH-11842) CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in urllib.urlopen(). files: A Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst M Lib/test/test_urllib.py M Lib/urllib.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index d7778d4194f3..ae1f6c0b29f0 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1048,6 +1048,13 @@ def open_spam(self, url): "spam://c:|windows%/:=&?~#+!$,;'@()*[]|/path/"), "//c:|windows%/:=&?~#+!$,;'@()*[]|/path/") + def test_local_file_open(self): + class DummyURLopener(urllib.URLopener): + def open_local_file(self, url): + return url + for url in ('local_file://example', 'local-file://example'): + self.assertRaises(IOError, DummyURLopener().open, url) + self.assertRaises(IOError, urllib.urlopen, url) # Just commented them out. # Can't really tell why keep failing in windows and sparc. diff --git a/Lib/urllib.py b/Lib/urllib.py index d85504a5cb7e..156879dd0a14 100644 --- a/Lib/urllib.py +++ b/Lib/urllib.py @@ -203,7 +203,9 @@ def open(self, fullurl, data=None): name = 'open_' + urltype self.type = urltype name = name.replace('-', '_') - if not hasattr(self, name): + + # bpo-35907: disallow the file reading with the type not allowed + if not hasattr(self, name) or name == 'open_local_file': if proxy: return self.open_unknown_proxy(proxy, fullurl, data) else: diff --git a/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst b/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst new file mode 100644 index 000000000000..bb187d8d65a5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst @@ -0,0 +1 @@ +CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in urllib.urlopen From webhook-mailer at python.org Tue May 21 17:20:25 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 21 May 2019 21:20:25 -0000 Subject: [Python-checkins] bpo-34616: Fix code style and unbreak buildbots (GH-13473) Message-ID: https://github.com/python/cpython/commit/eca18aac7b5952d23854d27dc8e502dfb0bb0505 commit: eca18aac7b5952d23854d27dc8e502dfb0bb0505 branch: master author: Yury Selivanov committer: Ned Deily date: 2019-05-21T17:20:21-04:00 summary: bpo-34616: Fix code style and unbreak buildbots (GH-13473) See also PR GH-13148. files: M Lib/test/test_builtin.py diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 4a358e89d1c2..e32fb75d8191 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -367,10 +367,10 @@ def f(): """doc""" def test_compile_top_level_await(self): """Test whether code some top level await can be compiled. - Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag set, - and make sure the generated code object has the CO_COROUTINE flag set in - order to execute it with `await eval(.....)` instead of exec, or via a - FunctionType. + Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag + set, and make sure the generated code object has the CO_COROUTINE flag + set in order to execute it with `await eval(.....)` instead of exec, + or via a FunctionType. """ # helper function just to check we can run top=level async-for @@ -379,17 +379,20 @@ def test_compile_top_level_await(self): yield i modes = ('single', 'exec') - code_samples = ['''a = await asyncio.sleep(0, result=1)''', - '''async for i in arange(1): - a = 1''', - '''async with asyncio.Lock() as l: - a = 1'''] + code_samples = [ + '''a = await asyncio.sleep(0, result=1)''', + '''async for i in arange(1): + a = 1''', + '''async with asyncio.Lock() as l: + a = 1''' + ] policy = maybe_get_event_loop_policy() try: - for mode, code_sample in product(modes,code_samples): + for mode, code_sample in product(modes, code_samples): source = dedent(code_sample) - with self.assertRaises(SyntaxError, msg=f"{source=} {mode=}"): - compile(source, '?' , mode) + with self.assertRaises( + SyntaxError, msg=f"source={source} mode={mode}"): + compile(source, '?', mode) co = compile(source, '?', @@ -397,17 +400,16 @@ def test_compile_top_level_await(self): flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT) self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE, - msg=f"{source=} {mode=}") - + msg=f"source={source} mode={mode}") # test we can create and advance a function type - globals_ = {'asyncio': asyncio, 'a':0, 'arange': arange} + globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange} async_f = FunctionType(co, globals_) asyncio.run(async_f()) self.assertEqual(globals_['a'], 1) # test we can await-eval, - globals_ = {'asyncio': asyncio, 'a':0, 'arange': arange} + globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange} asyncio.run(eval(co, globals_)) self.assertEqual(globals_['a'], 1) finally: @@ -416,7 +418,8 @@ def test_compile_top_level_await(self): def test_compile_async_generator(self): """ With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to - make sure AsyncGenerators are still properly not marked with CO_COROUTINE + make sure AsyncGenerators are still properly not marked with the + CO_COROUTINE flag. """ code = dedent("""async def ticker(): for i in range(10): @@ -428,7 +431,6 @@ def test_compile_async_generator(self): exec(co, glob) self.assertEqual(type(glob['ticker']()), AsyncGeneratorType) - def test_delattr(self): sys.spam = 1 delattr(sys, 'spam') From webhook-mailer at python.org Tue May 21 19:00:39 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Tue, 21 May 2019 23:00:39 -0000 Subject: [Python-checkins] bpo-36948: Fix test_urlopener_retrieve_file on Windows (GH-13476) Message-ID: https://github.com/python/cpython/commit/2725cb01d7cbf5caecb51cc20d97ba324b09ce96 commit: 2725cb01d7cbf5caecb51cc20d97ba324b09ce96 branch: master author: Berker Peksag committer: GitHub date: 2019-05-22T02:00:35+03:00 summary: bpo-36948: Fix test_urlopener_retrieve_file on Windows (GH-13476) files: M Lib/test/test_urllib.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 74b19fbdcd8d..6b995fef8cb5 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1470,7 +1470,8 @@ def test_urlopener_retrieve_file(self): os.close(fd) fileurl = "file:" + urllib.request.pathname2url(tmpfile) filename, _ = urllib.request.URLopener().retrieve(fileurl) - self.assertEqual(filename, tmpfile) + # Some buildbots have TEMP folder that uses a lowercase drive letter. + self.assertEqual(os.path.normcase(filename), os.path.normcase(tmpfile)) @support.ignore_warnings(category=DeprecationWarning) def test_urlopener_retrieve_remote(self): From webhook-mailer at python.org Wed May 22 05:28:39 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 09:28:39 -0000 Subject: [Python-checkins] bpo-36829: Add sys.unraisablehook() (GH-13187) Message-ID: https://github.com/python/cpython/commit/ef9d9b63129a2f243591db70e9a2dd53fab95d86 commit: ef9d9b63129a2f243591db70e9a2dd53fab95d86 branch: master author: Victor Stinner committer: GitHub date: 2019-05-22T11:28:22+02:00 summary: bpo-36829: Add sys.unraisablehook() (GH-13187) Add new sys.unraisablehook() function which can be overridden to control how "unraisable exceptions" are handled. It is called when an exception has occurred but there is no way for Python to handle it. For example, when a destructor raises an exception or during garbage collection (gc.collect()). Changes: * Add an internal UnraisableHookArgs type used to pass arguments to sys.unraisablehook. * Add _PyErr_WriteUnraisableDefaultHook(). * The default hook now ignores exception on writing the traceback. * test_sys now uses unittest.main() to automatically discover tests: remove test_main(). * Add _PyErr_Init(). * Fix PyErr_WriteUnraisable(): hold a strong reference to sys.stderr while using it files: A Misc/NEWS.d/next/Library/2019-05-08-12-51-37.bpo-36829.8enFMA.rst M Doc/c-api/exceptions.rst M Doc/library/sys.rst M Doc/whatsnew/3.8.rst M Include/internal/pycore_pylifecycle.h M Lib/test/test_sys.py M Modules/_testcapimodule.c M Python/clinic/sysmodule.c.h M Python/errors.c M Python/importlib.h M Python/pylifecycle.c M Python/sysmodule.c diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 00ef00526bc5..18ff697a2325 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -72,6 +72,9 @@ Printing and clearing .. c:function:: void PyErr_WriteUnraisable(PyObject *obj) + Call :func:`sys.unraisablehook` using the current exception and *obj* + argument. + This utility function prints a warning message to ``sys.stderr`` when an exception has been set but it is impossible for the interpreter to actually raise the exception. It is used, for example, when an exception occurs in an @@ -81,6 +84,8 @@ Printing and clearing in which the unraisable exception occurred. If possible, the repr of *obj* will be printed in the warning message. + An exception must be set when calling this function. + Raising exceptions ================== diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 7d27c89fac95..3b754bd4e276 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -248,16 +248,19 @@ always available. before the program exits. The handling of such top-level exceptions can be customized by assigning another three-argument function to ``sys.excepthook``. + See also :func:`unraisablehook` which handles unraisable exceptions. + .. data:: __breakpointhook__ __displayhook__ __excepthook__ + __unraisablehook__ These objects contain the original values of ``breakpointhook``, - ``displayhook``, and ``excepthook`` at the start of the program. They are - saved so that ``breakpointhook``, ``displayhook`` and ``excepthook`` can be - restored in case they happen to get replaced with broken or alternative - objects. + ``displayhook``, ``excepthook``, and ``unraisablehook`` at the start of the + program. They are saved so that ``breakpointhook``, ``displayhook`` and + ``excepthook``, ``unraisablehook`` can be restored in case they happen to + get replaced with broken or alternative objects. .. versionadded:: 3.7 __breakpointhook__ @@ -1487,6 +1490,28 @@ always available. is suppressed and only the exception type and value are printed. +.. function:: unraisablehook(unraisable, /) + + Handle an unraisable exception. + + Called when an exception has occurred but there is no way for Python to + handle it. For example, when a destructor raises an exception or during + garbage collection (:func:`gc.collect`). + + The *unraisable* argument has the following attributes: + + * *exc_type*: Exception type. + * *exc_value*: Exception value, can be ``None``. + * *exc_traceback*: Exception traceback, can be ``None``. + * *object*: Object causing the exception, can be ``None``. + + :func:`sys.unraisablehook` can be overridden to control how unraisable + exceptions are handled. + + See also :func:`excepthook` which handles uncaught exceptions. + + .. versionadded:: 3.8 + .. data:: version A string containing the version number of the Python interpreter plus additional diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 5f8208d5bf4a..63b8200a1528 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -481,6 +481,16 @@ and manipulating normal distributions of a random variable. [7.672102882379219, 12.000027119750287, 4.647488369766392] +sys +--- + +Add new :func:`sys.unraisablehook` function which can be overridden to control +how "unraisable exceptions" are handled. It is called when an exception has +occurred but there is no way for Python to handle it. For example, when a +destructor raises an exception or during garbage collection +(:func:`gc.collect`). + + tarfile ------- diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 4684ebea44a6..07cf815363b7 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -48,6 +48,7 @@ extern int _PySys_InitMain( PyInterpreterState *interp); extern _PyInitError _PyImport_Init(PyInterpreterState *interp); extern _PyInitError _PyExc_Init(void); +extern _PyInitError _PyErr_Init(void); extern _PyInitError _PyBuiltins_AddExceptions(PyObject * bltinmod); extern _PyInitError _PyImportHooks_Init(void); extern int _PyFloat_Init(void); @@ -100,8 +101,11 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromCoreConfig( const _PyCoreConfig *coreconfig, const _PyArgv *args); + PyAPI_FUNC(int) _Py_HandleSystemExit(int *exitcode_p); +PyAPI_FUNC(PyObject*) _PyErr_WriteUnraisableDefaultHook(PyObject *unraisable); + #ifdef __cplusplus } #endif diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index d1c7daad7bba..2b358ca0466e 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -876,6 +876,81 @@ def test__enablelegacywindowsfsencoding(self): self.assertEqual(out, 'mbcs replace') + at test.support.cpython_only +class UnraisableHookTest(unittest.TestCase): + def write_unraisable_exc(self, exc, obj): + import _testcapi + import types + try: + # raise the exception to get a traceback in the except block + try: + raise exc + except Exception as exc2: + _testcapi.write_unraisable_exc(exc2, obj) + return types.SimpleNamespace(exc_type=type(exc2), + exc_value=exc2, + exc_traceback=exc2.__traceback__, + object=obj) + finally: + # Explicitly break any reference cycle + exc = None + exc2 = None + + def test_original_unraisablehook(self): + obj = "an object" + + with test.support.captured_output("stderr") as stderr: + with test.support.swap_attr(sys, 'unraisablehook', + sys.__unraisablehook__): + self.write_unraisable_exc(ValueError(42), obj) + + err = stderr.getvalue() + self.assertIn(f'Exception ignored in: {obj!r}\n', err) + self.assertIn('Traceback (most recent call last):\n', err) + self.assertIn('ValueError: 42\n', err) + + def test_original_unraisablehook_wrong_type(self): + exc = ValueError(42) + with test.support.swap_attr(sys, 'unraisablehook', + sys.__unraisablehook__): + with self.assertRaises(TypeError): + sys.unraisablehook(exc) + + def test_custom_unraisablehook(self): + hook_args = None + + def hook_func(args): + nonlocal hook_args + hook_args = args + + obj = object() + try: + with test.support.swap_attr(sys, 'unraisablehook', hook_func): + expected = self.write_unraisable_exc(ValueError(42), obj) + for attr in "exc_type exc_value exc_traceback object".split(): + self.assertEqual(getattr(hook_args, attr), + getattr(expected, attr), + (hook_args, expected)) + finally: + # expected and hook_args contain an exception: break reference cycle + expected = None + hook_args = None + + def test_custom_unraisablehook_fail(self): + def hook_func(*args): + raise Exception("hook_func failed") + + with test.support.captured_output("stderr") as stderr: + with test.support.swap_attr(sys, 'unraisablehook', hook_func): + self.write_unraisable_exc(ValueError(42), None) + + err = stderr.getvalue() + self.assertIn(f'Exception ignored in: {hook_func!r}\n', + err) + self.assertIn('Traceback (most recent call last):\n', err) + self.assertIn('Exception: hook_func failed\n', err) + + @test.support.cpython_only class SizeofTest(unittest.TestCase): @@ -1277,8 +1352,5 @@ def test_asyncgen_hooks(self): self.assertIsNone(cur.finalizer) -def test_main(): - test.support.run_unittest(SysModuleTest, SizeofTest) - if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-05-08-12-51-37.bpo-36829.8enFMA.rst b/Misc/NEWS.d/next/Library/2019-05-08-12-51-37.bpo-36829.8enFMA.rst new file mode 100644 index 000000000000..0b04efcb7e2f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-08-12-51-37.bpo-36829.8enFMA.rst @@ -0,0 +1,5 @@ +Add new :func:`sys.unraisablehook` function which can be overridden to +control how "unraisable exceptions" are handled. It is called when an +exception has occurred but there is no way for Python to handle it. For +example, when a destructor raises an exception or during garbage collection +(:func:`gc.collect`). diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 2af553960cc7..7945f498f9e2 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4982,6 +4982,20 @@ negative_refcount(PyObject *self, PyObject *Py_UNUSED(args)) #endif +static PyObject* +test_write_unraisable_exc(PyObject *self, PyObject *args) +{ + PyObject *exc, *obj; + if (!PyArg_ParseTuple(args, "OO", &exc, &obj)) { + return NULL; + } + + PyErr_SetObject((PyObject *)Py_TYPE(exc), exc); + PyErr_WriteUnraisable(obj); + Py_RETURN_NONE; +} + + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, {"raise_memoryerror", raise_memoryerror, METH_NOARGS}, @@ -5221,6 +5235,7 @@ static PyMethodDef TestMethods[] = { #ifdef Py_REF_DEBUG {"negative_refcount", negative_refcount, METH_NOARGS}, #endif + {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index c70b721983c1..aede60ac85b5 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -65,6 +65,22 @@ sys_exc_info(PyObject *module, PyObject *Py_UNUSED(ignored)) return sys_exc_info_impl(module); } +PyDoc_STRVAR(sys_unraisablehook__doc__, +"unraisablehook($module, unraisable, /)\n" +"--\n" +"\n" +"Handle an unraisable exception.\n" +"\n" +"The unraisable argument has the following attributes:\n" +"\n" +"* exc_type: Exception type.\n" +"* exc_value: Exception value.\n" +"* exc_tb: Exception traceback, can be None.\n" +"* obj: Object causing the exception, can be None."); + +#define SYS_UNRAISABLEHOOK_METHODDEF \ + {"unraisablehook", (PyCFunction)sys_unraisablehook, METH_O, sys_unraisablehook__doc__}, + PyDoc_STRVAR(sys_exit__doc__, "exit($module, status=None, /)\n" "--\n" @@ -1060,4 +1076,4 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=3ba4c194d00f1866 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=603e4d5a453dc769 input=a9049054013a1b77]*/ diff --git a/Python/errors.c b/Python/errors.c index b8af1df4161d..9622b5a1067d 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -2,6 +2,7 @@ /* Error handling */ #include "Python.h" +#include "pycore_coreconfig.h" #include "pycore_pystate.h" #ifndef __STDC__ @@ -944,90 +945,271 @@ PyErr_NewExceptionWithDoc(const char *name, const char *doc, } -/* Call when an exception has occurred but there is no way for Python - to handle it. Examples: exception in __del__ or during GC. */ -void -PyErr_WriteUnraisable(PyObject *obj) +PyDoc_STRVAR(UnraisableHookArgs__doc__, +"UnraisableHookArgs\n\ +\n\ +Type used to pass arguments to sys.unraisablehook."); + +static PyTypeObject UnraisableHookArgsType; + +static PyStructSequence_Field UnraisableHookArgs_fields[] = { + {"exc_type", "Exception type"}, + {"exc_value", "Exception value"}, + {"exc_traceback", "Exception traceback"}, + {"object", "Object causing the exception"}, + {0} +}; + +static PyStructSequence_Desc UnraisableHookArgs_desc = { + .name = "UnraisableHookArgs", + .doc = UnraisableHookArgs__doc__, + .fields = UnraisableHookArgs_fields, + .n_in_sequence = 4 +}; + + +_PyInitError +_PyErr_Init(void) { - _Py_IDENTIFIER(__module__); - PyObject *f, *t, *v, *tb; - PyObject *moduleName = NULL; - const char *className; + if (UnraisableHookArgsType.tp_name == NULL) { + if (PyStructSequence_InitType2(&UnraisableHookArgsType, + &UnraisableHookArgs_desc) < 0) { + return _Py_INIT_ERR("failed to initialize UnraisableHookArgs type"); + } + } + return _Py_INIT_OK(); +} - PyErr_Fetch(&t, &v, &tb); - f = _PySys_GetObjectId(&PyId_stderr); - if (f == NULL || f == Py_None) - goto done; +static PyObject * +make_unraisable_hook_args(PyObject *exc_type, PyObject *exc_value, + PyObject *exc_tb, PyObject *obj) +{ + PyObject *args = PyStructSequence_New(&UnraisableHookArgsType); + if (args == NULL) { + return NULL; + } + + Py_ssize_t pos = 0; +#define ADD_ITEM(exc_type) \ + do { \ + if (exc_type == NULL) { \ + exc_type = Py_None; \ + } \ + Py_INCREF(exc_type); \ + PyStructSequence_SET_ITEM(args, pos++, exc_type); \ + } while (0) + + + ADD_ITEM(exc_type); + ADD_ITEM(exc_value); + ADD_ITEM(exc_tb); + ADD_ITEM(obj); +#undef ADD_ITEM + + if (PyErr_Occurred()) { + Py_DECREF(args); + return NULL; + } + return args; +} + + + +/* Default implementation of sys.unraisablehook. + + It can be called to log the exception of a custom sys.unraisablehook. - if (obj) { - if (PyFile_WriteString("Exception ignored in: ", f) < 0) - goto done; - if (PyFile_WriteObject(obj, f, 0) < 0) { + Do nothing if sys.stderr attribute doesn't exist or is set to None. */ +static int +write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, + PyObject *exc_tb, PyObject *obj, PyObject *file) +{ + if (obj != NULL && obj != Py_None) { + if (PyFile_WriteString("Exception ignored in: ", file) < 0) { + return -1; + } + + if (PyFile_WriteObject(obj, file, 0) < 0) { PyErr_Clear(); - if (PyFile_WriteString("", f) < 0) { - goto done; + if (PyFile_WriteString("", file) < 0) { + return -1; } } - if (PyFile_WriteString("\n", f) < 0) - goto done; + if (PyFile_WriteString("\n", file) < 0) { + return -1; + } } - if (PyTraceBack_Print(tb, f) < 0) - goto done; + if (exc_tb != NULL && exc_tb != Py_None) { + if (PyTraceBack_Print(exc_tb, file) < 0) { + /* continue even if writing the traceback failed */ + PyErr_Clear(); + } + } - if (!t) - goto done; + if (!exc_type) { + return -1; + } - assert(PyExceptionClass_Check(t)); - className = PyExceptionClass_Name(t); + assert(PyExceptionClass_Check(exc_type)); + const char *className = PyExceptionClass_Name(exc_type); if (className != NULL) { const char *dot = strrchr(className, '.'); if (dot != NULL) className = dot+1; } - moduleName = _PyObject_GetAttrId(t, &PyId___module__); + _Py_IDENTIFIER(__module__); + PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__); if (moduleName == NULL || !PyUnicode_Check(moduleName)) { + Py_XDECREF(moduleName); PyErr_Clear(); - if (PyFile_WriteString("", f) < 0) - goto done; + if (PyFile_WriteString("", file) < 0) { + return -1; + } } else { if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) { - if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0) - goto done; - if (PyFile_WriteString(".", f) < 0) - goto done; + if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) { + Py_DECREF(moduleName); + return -1; + } + Py_DECREF(moduleName); + if (PyFile_WriteString(".", file) < 0) { + return -1; + } + } + else { + Py_DECREF(moduleName); } } if (className == NULL) { - if (PyFile_WriteString("", f) < 0) - goto done; + if (PyFile_WriteString("", file) < 0) { + return -1; + } } else { - if (PyFile_WriteString(className, f) < 0) - goto done; + if (PyFile_WriteString(className, file) < 0) { + return -1; + } } - if (v && v != Py_None) { - if (PyFile_WriteString(": ", f) < 0) - goto done; - if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) { + if (exc_value && exc_value != Py_None) { + if (PyFile_WriteString(": ", file) < 0) { + return -1; + } + if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) { PyErr_Clear(); - if (PyFile_WriteString("", f) < 0) { + if (PyFile_WriteString("", file) < 0) { + return -1; + } + } + } + if (PyFile_WriteString("\n", file) < 0) { + return -1; + } + return 0; +} + + +static int +write_unraisable_exc(PyObject *exc_type, PyObject *exc_value, + PyObject *exc_tb, PyObject *obj) +{ + PyObject *file = _PySys_GetObjectId(&PyId_stderr); + if (file == NULL || file == Py_None) { + return 0; + } + + /* Hold a strong reference to ensure that sys.stderr doesn't go away + while we use it */ + Py_INCREF(file); + int res = write_unraisable_exc_file(exc_type, exc_value, exc_tb, + obj, file); + Py_DECREF(file); + + return res; +} + + +PyObject* +_PyErr_WriteUnraisableDefaultHook(PyObject *args) +{ + if (Py_TYPE(args) != &UnraisableHookArgsType) { + PyErr_SetString(PyExc_TypeError, + "sys.unraisablehook argument type " + "must be UnraisableHookArgs"); + return NULL; + } + + /* Borrowed references */ + PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0); + PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1); + PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2); + PyObject *obj = PyStructSequence_GET_ITEM(args, 3); + + if (write_unraisable_exc(exc_type, exc_value, exc_tb, obj) < 0) { + return NULL; + } + Py_RETURN_NONE; +} + + +/* Call sys.unraisablehook(). + + This function can be used when an exception has occurred but there is no way + for Python to handle it. For example, when a destructor raises an exception + or during garbage collection (gc.collect()). + + An exception must be set when calling this function. */ +void +PyErr_WriteUnraisable(PyObject *obj) +{ + PyObject *exc_type, *exc_value, *exc_tb; + + PyErr_Fetch(&exc_type, &exc_value, &exc_tb); + + assert(exc_type != NULL); + + if (exc_type == NULL) { + /* sys.unraisablehook requires that at least exc_type is set */ + goto default_hook; + } + + _Py_IDENTIFIER(unraisablehook); + PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook); + if (hook != NULL && hook != Py_None) { + PyObject *hook_args; + + hook_args = make_unraisable_hook_args(exc_type, exc_value, exc_tb, obj); + if (hook_args != NULL) { + PyObject *args[1] = {hook_args}; + PyObject *res = _PyObject_FastCall(hook, args, 1); + Py_DECREF(hook_args); + if (res != NULL) { + Py_DECREF(res); goto done; } } + + /* sys.unraisablehook failed: log its error using default hook */ + Py_XDECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); + PyErr_Fetch(&exc_type, &exc_value, &exc_tb); + + obj = hook; } - if (PyFile_WriteString("\n", f) < 0) - goto done; + +default_hook: + /* Call the default unraisable hook (ignore failure) */ + (void)write_unraisable_exc(exc_type, exc_value, exc_tb, obj); done: - Py_XDECREF(moduleName); - Py_XDECREF(t); - Py_XDECREF(v); - Py_XDECREF(tb); + Py_XDECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); PyErr_Clear(); /* Just in case */ } diff --git a/Python/importlib.h b/Python/importlib.h index 694984af8060..5bd1d179e2f0 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1326,8 +1326,8 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 97,114,100,108,101,115,115,32,111,102,32,97,110,121,32,114, 97,105,115,101,100,32,101,120,99,101,112,116,105,111,110,115, 46,78,41,2,114,57,0,0,0,114,60,0,0,0,41,4, - 114,30,0,0,0,90,8,101,120,99,95,116,121,112,101,90, - 9,101,120,99,95,118,97,108,117,101,90,13,101,120,99,95, + 114,30,0,0,0,218,8,101,120,99,95,116,121,112,101,218, + 9,101,120,99,95,118,97,108,117,101,218,13,101,120,99,95, 116,114,97,99,101,98,97,99,107,114,10,0,0,0,114,10, 0,0,0,114,11,0,0,0,114,56,0,0,0,99,3,0, 0,115,2,0,0,0,0,2,122,27,95,73,109,112,111,114, @@ -1358,7 +1358,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 98,97,115,101,114,10,0,0,0,114,10,0,0,0,114,11, 0,0,0,218,13,95,114,101,115,111,108,118,101,95,110,97, 109,101,104,3,0,0,115,10,0,0,0,0,2,16,1,12, - 1,8,1,8,1,114,185,0,0,0,99,3,0,0,0,0, + 1,8,1,8,1,114,188,0,0,0,99,3,0,0,0,0, 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, 0,0,0,115,34,0,0,0,124,0,160,0,124,1,124,2, 161,2,125,3,124,3,100,0,107,8,114,24,100,0,83,0, @@ -1368,7 +1368,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 109,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, 0,0,0,218,17,95,102,105,110,100,95,115,112,101,99,95, 108,101,103,97,99,121,113,3,0,0,115,8,0,0,0,0, - 3,12,1,8,1,4,1,114,187,0,0,0,99,3,0,0, + 3,12,1,8,1,4,1,114,190,0,0,0,99,3,0,0, 0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0, 0,67,0,0,0,115,12,1,0,0,116,0,106,1,125,3, 124,3,100,1,107,8,114,22,116,2,100,2,131,1,130,1, @@ -1398,17 +1398,17 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 104,114,79,0,0,0,218,9,95,119,97,114,110,105,110,103, 115,218,4,119,97,114,110,218,13,73,109,112,111,114,116,87, 97,114,110,105,110,103,114,92,0,0,0,114,178,0,0,0, - 114,166,0,0,0,114,106,0,0,0,114,187,0,0,0,114, + 114,166,0,0,0,114,106,0,0,0,114,190,0,0,0,114, 105,0,0,0,41,10,114,17,0,0,0,114,164,0,0,0, - 114,165,0,0,0,114,188,0,0,0,90,9,105,115,95,114, - 101,108,111,97,100,114,186,0,0,0,114,166,0,0,0,114, + 114,165,0,0,0,114,191,0,0,0,90,9,105,115,95,114, + 101,108,111,97,100,114,189,0,0,0,114,166,0,0,0,114, 95,0,0,0,114,96,0,0,0,114,105,0,0,0,114,10, 0,0,0,114,10,0,0,0,114,11,0,0,0,218,10,95, 102,105,110,100,95,115,112,101,99,122,3,0,0,115,54,0, 0,0,0,2,6,1,8,2,8,3,4,1,12,5,10,1, 8,1,8,1,2,1,10,1,14,1,12,1,8,1,20,2, 22,1,8,2,18,1,10,1,2,1,10,1,14,4,14,2, - 8,1,8,2,10,2,10,2,114,192,0,0,0,99,3,0, + 8,1,8,2,10,2,10,2,114,195,0,0,0,99,3,0, 0,0,0,0,0,0,0,0,0,0,3,0,0,0,5,0, 0,0,67,0,0,0,115,108,0,0,0,116,0,124,0,116, 1,131,2,115,28,116,2,100,1,160,3,116,4,124,0,131, @@ -1432,12 +1432,12 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 121,32,109,111,100,117,108,101,32,110,97,109,101,78,41,7, 218,10,105,115,105,110,115,116,97,110,99,101,218,3,115,116, 114,218,9,84,121,112,101,69,114,114,111,114,114,45,0,0, - 0,114,14,0,0,0,114,182,0,0,0,114,79,0,0,0, - 169,3,114,17,0,0,0,114,183,0,0,0,114,184,0,0, + 0,114,14,0,0,0,114,185,0,0,0,114,79,0,0,0, + 169,3,114,17,0,0,0,114,186,0,0,0,114,187,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, 218,13,95,115,97,110,105,116,121,95,99,104,101,99,107,169, 3,0,0,115,22,0,0,0,0,2,10,1,18,1,8,1, - 8,1,8,1,10,1,10,1,4,1,8,2,12,1,114,197, + 8,1,8,1,10,1,10,1,4,1,8,2,12,1,114,200, 0,0,0,122,16,78,111,32,109,111,100,117,108,101,32,110, 97,109,101,100,32,122,4,123,33,114,125,99,2,0,0,0, 0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0, @@ -1462,7 +1462,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,114,92,0,0,0,114,67,0,0,0,114,141,0,0,0, 114,106,0,0,0,218,8,95,69,82,82,95,77,83,71,114, 45,0,0,0,218,19,77,111,100,117,108,101,78,111,116,70, - 111,117,110,100,69,114,114,111,114,114,192,0,0,0,114,159, + 111,117,110,100,69,114,114,111,114,114,195,0,0,0,114,159, 0,0,0,114,5,0,0,0,41,8,114,17,0,0,0,218, 7,105,109,112,111,114,116,95,114,164,0,0,0,114,130,0, 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, @@ -1472,7 +1472,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 117,110,108,111,99,107,101,100,188,3,0,0,115,42,0,0, 0,0,1,4,1,14,1,4,1,10,1,10,2,10,1,10, 1,10,1,2,1,10,1,14,1,16,1,20,1,10,1,8, - 1,20,2,8,1,4,2,10,1,22,1,114,202,0,0,0, + 1,20,2,8,1,4,2,10,1,22,1,114,205,0,0,0, 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, 0,10,0,0,0,67,0,0,0,115,106,0,0,0,116,0, 124,0,131,1,143,50,1,0,116,1,106,2,160,3,124,0, @@ -1488,14 +1488,14 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 101,32,105,110,32,115,121,115,46,109,111,100,117,108,101,115, 114,16,0,0,0,41,9,114,50,0,0,0,114,15,0,0, 0,114,92,0,0,0,114,34,0,0,0,218,14,95,78,69, - 69,68,83,95,76,79,65,68,73,78,71,114,202,0,0,0, - 114,45,0,0,0,114,200,0,0,0,114,65,0,0,0,41, - 4,114,17,0,0,0,114,201,0,0,0,114,96,0,0,0, + 69,68,83,95,76,79,65,68,73,78,71,114,205,0,0,0, + 114,45,0,0,0,114,203,0,0,0,114,65,0,0,0,41, + 4,114,17,0,0,0,114,204,0,0,0,114,96,0,0,0, 114,75,0,0,0,114,10,0,0,0,114,10,0,0,0,114, 11,0,0,0,218,14,95,102,105,110,100,95,97,110,100,95, 108,111,97,100,218,3,0,0,115,22,0,0,0,0,2,10, 1,14,1,8,1,32,2,8,1,4,1,2,255,4,2,12, - 2,8,1,114,204,0,0,0,114,22,0,0,0,99,3,0, + 2,8,1,114,207,0,0,0,114,22,0,0,0,99,3,0, 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, 0,0,67,0,0,0,115,42,0,0,0,116,0,124,0,124, 1,124,2,131,3,1,0,124,2,100,1,107,4,114,32,116, @@ -1520,11 +1520,11 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 103,32,95,95,112,97,99,107,97,103,101,95,95,32,105,102, 10,32,32,32,32,116,104,101,32,108,111,97,100,101,114,32, 100,105,100,32,110,111,116,46,10,10,32,32,32,32,114,22, - 0,0,0,41,4,114,197,0,0,0,114,185,0,0,0,114, - 204,0,0,0,218,11,95,103,99,100,95,105,109,112,111,114, - 116,114,196,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,205,0,0,0,234,3,0,0,115,8, - 0,0,0,0,9,12,1,8,1,12,1,114,205,0,0,0, + 0,0,0,41,4,114,200,0,0,0,114,188,0,0,0,114, + 207,0,0,0,218,11,95,103,99,100,95,105,109,112,111,114, + 116,114,199,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,208,0,0,0,234,3,0,0,115,8, + 0,0,0,0,9,12,1,8,1,12,1,114,208,0,0,0, 169,1,218,9,114,101,99,117,114,115,105,118,101,99,3,0, 0,0,0,0,0,0,1,0,0,0,8,0,0,0,11,0, 0,0,67,0,0,0,115,226,0,0,0,124,1,68,0,93, @@ -1561,21 +1561,21 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 109,32,108,105,115,116,39,39,122,8,73,116,101,109,32,105, 110,32,122,18,32,109,117,115,116,32,98,101,32,115,116,114, 44,32,110,111,116,32,250,1,42,218,7,95,95,97,108,108, - 95,95,84,114,206,0,0,0,114,179,0,0,0,78,41,16, - 114,193,0,0,0,114,194,0,0,0,114,1,0,0,0,114, - 195,0,0,0,114,14,0,0,0,114,4,0,0,0,218,16, + 95,95,84,114,209,0,0,0,114,182,0,0,0,78,41,16, + 114,196,0,0,0,114,197,0,0,0,114,1,0,0,0,114, + 198,0,0,0,114,14,0,0,0,114,4,0,0,0,218,16, 95,104,97,110,100,108,101,95,102,114,111,109,108,105,115,116, - 114,209,0,0,0,114,45,0,0,0,114,67,0,0,0,114, - 200,0,0,0,114,17,0,0,0,114,15,0,0,0,114,92, - 0,0,0,114,34,0,0,0,114,203,0,0,0,41,8,114, - 96,0,0,0,218,8,102,114,111,109,108,105,115,116,114,201, - 0,0,0,114,207,0,0,0,218,1,120,90,5,119,104,101, + 114,212,0,0,0,114,45,0,0,0,114,67,0,0,0,114, + 203,0,0,0,114,17,0,0,0,114,15,0,0,0,114,92, + 0,0,0,114,34,0,0,0,114,206,0,0,0,41,8,114, + 96,0,0,0,218,8,102,114,111,109,108,105,115,116,114,204, + 0,0,0,114,210,0,0,0,218,1,120,90,5,119,104,101, 114,101,90,9,102,114,111,109,95,110,97,109,101,90,3,101, 120,99,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,210,0,0,0,249,3,0,0,115,44,0,0,0,0, + 0,114,213,0,0,0,249,3,0,0,115,44,0,0,0,0, 10,8,1,10,1,4,1,12,2,4,1,28,2,8,1,14, 1,10,1,2,255,8,2,10,1,14,1,2,1,14,1,16, - 4,10,1,16,255,2,2,8,1,22,1,114,210,0,0,0, + 4,10,1,16,255,2,2,8,1,22,1,114,213,0,0,0, 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, 0,6,0,0,0,67,0,0,0,115,146,0,0,0,124,0, 160,0,100,1,161,1,125,1,124,0,160,0,100,2,161,1, @@ -1610,14 +1610,14 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 95,95,32,97,110,100,32,95,95,112,97,116,104,95,95,114, 1,0,0,0,114,141,0,0,0,114,128,0,0,0,114,22, 0,0,0,41,6,114,34,0,0,0,114,130,0,0,0,114, - 189,0,0,0,114,190,0,0,0,114,191,0,0,0,114,129, - 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,183, + 192,0,0,0,114,193,0,0,0,114,194,0,0,0,114,129, + 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,186, 0,0,0,114,95,0,0,0,114,10,0,0,0,114,10,0, 0,0,114,11,0,0,0,218,17,95,99,97,108,99,95,95, 95,112,97,99,107,97,103,101,95,95,30,4,0,0,115,38, 0,0,0,0,7,10,1,10,1,8,1,18,1,22,2,2, 0,2,254,6,3,4,1,8,1,6,2,6,2,2,0,2, - 254,6,3,8,1,8,1,14,1,114,216,0,0,0,114,10, + 254,6,3,8,1,8,1,14,1,114,219,0,0,0,114,10, 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, 9,0,0,0,5,0,0,0,67,0,0,0,115,180,0,0, 0,124,4,100,1,107,2,114,18,116,0,124,0,131,1,125, @@ -1662,18 +1662,18 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 96,32,119,111,117,108,100,32,104,97,118,101,32,97,32,39, 108,101,118,101,108,39,32,111,102,32,50,41,46,10,10,32, 32,32,32,114,22,0,0,0,78,114,128,0,0,0,114,141, - 0,0,0,41,9,114,205,0,0,0,114,216,0,0,0,218, - 9,112,97,114,116,105,116,105,111,110,114,181,0,0,0,114, + 0,0,0,41,9,114,208,0,0,0,114,219,0,0,0,218, + 9,112,97,114,116,105,116,105,111,110,114,184,0,0,0,114, 15,0,0,0,114,92,0,0,0,114,1,0,0,0,114,4, - 0,0,0,114,210,0,0,0,41,9,114,17,0,0,0,114, - 215,0,0,0,218,6,108,111,99,97,108,115,114,211,0,0, - 0,114,184,0,0,0,114,96,0,0,0,90,8,103,108,111, - 98,97,108,115,95,114,183,0,0,0,90,7,99,117,116,95, + 0,0,0,114,213,0,0,0,41,9,114,17,0,0,0,114, + 218,0,0,0,218,6,108,111,99,97,108,115,114,214,0,0, + 0,114,187,0,0,0,114,96,0,0,0,90,8,103,108,111, + 98,97,108,115,95,114,186,0,0,0,90,7,99,117,116,95, 111,102,102,114,10,0,0,0,114,10,0,0,0,114,11,0, 0,0,218,10,95,95,105,109,112,111,114,116,95,95,57,4, 0,0,115,30,0,0,0,0,11,8,1,10,2,16,1,8, 1,12,1,4,3,8,1,18,1,4,1,4,4,26,3,32, - 1,10,1,12,2,114,219,0,0,0,99,1,0,0,0,0, + 1,10,1,12,2,114,222,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, 0,0,0,115,38,0,0,0,116,0,160,1,124,0,161,1, 125,1,124,1,100,0,107,8,114,30,116,2,100,1,124,0, @@ -1685,7 +1685,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,114,10,0,0,0,114,11,0,0,0,218,18,95, 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, 101,94,4,0,0,115,8,0,0,0,0,1,10,1,8,1, - 12,1,114,220,0,0,0,99,2,0,0,0,0,0,0,0, + 12,1,114,223,0,0,0,99,2,0,0,0,0,0,0,0, 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, 115,166,0,0,0,124,1,97,0,124,0,97,1,116,2,116, 1,131,1,125,2,116,1,106,3,160,4,161,0,68,0,93, @@ -1714,12 +1714,12 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 100,117,108,101,115,32,109,117,115,116,32,98,101,32,101,120, 112,108,105,99,105,116,108,121,32,112,97,115,115,101,100,32, 105,110,46,10,10,32,32,32,32,41,3,114,23,0,0,0, - 114,189,0,0,0,114,64,0,0,0,78,41,15,114,57,0, + 114,192,0,0,0,114,64,0,0,0,78,41,15,114,57,0, 0,0,114,15,0,0,0,114,14,0,0,0,114,92,0,0, - 0,218,5,105,116,101,109,115,114,193,0,0,0,114,78,0, + 0,218,5,105,116,101,109,115,114,196,0,0,0,114,78,0, 0,0,114,160,0,0,0,114,88,0,0,0,114,173,0,0, 0,114,142,0,0,0,114,148,0,0,0,114,1,0,0,0, - 114,220,0,0,0,114,5,0,0,0,41,10,218,10,115,121, + 114,223,0,0,0,114,5,0,0,0,41,10,218,10,115,121, 115,95,109,111,100,117,108,101,218,11,95,105,109,112,95,109, 111,100,117,108,101,90,11,109,111,100,117,108,101,95,116,121, 112,101,114,17,0,0,0,114,96,0,0,0,114,109,0,0, @@ -1730,7 +1730,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 218,6,95,115,101,116,117,112,101,4,0,0,115,36,0,0, 0,0,9,4,1,4,3,8,1,18,1,10,1,10,1,6, 1,10,1,6,2,2,1,10,1,12,3,10,1,8,1,10, - 1,10,2,10,1,114,224,0,0,0,99,2,0,0,0,0, + 1,10,2,10,1,114,227,0,0,0,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, 0,0,0,115,38,0,0,0,116,0,124,0,124,1,131,2, 1,0,116,1,106,2,160,3,116,4,161,1,1,0,116,1, @@ -1738,12 +1738,12 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 122,48,73,110,115,116,97,108,108,32,105,109,112,111,114,116, 101,114,115,32,102,111,114,32,98,117,105,108,116,105,110,32, 97,110,100,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,115,78,41,6,114,224,0,0,0,114,15,0,0,0,114, - 188,0,0,0,114,120,0,0,0,114,160,0,0,0,114,173, - 0,0,0,41,2,114,222,0,0,0,114,223,0,0,0,114, + 101,115,78,41,6,114,227,0,0,0,114,15,0,0,0,114, + 191,0,0,0,114,120,0,0,0,114,160,0,0,0,114,173, + 0,0,0,41,2,114,225,0,0,0,114,226,0,0,0,114, 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, 95,105,110,115,116,97,108,108,136,4,0,0,115,6,0,0, - 0,0,2,10,2,12,1,114,225,0,0,0,99,0,0,0, + 0,0,2,10,2,12,1,114,228,0,0,0,99,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, 0,67,0,0,0,115,32,0,0,0,100,1,100,2,108,0, 125,0,124,0,97,1,124,0,160,2,116,3,106,4,116,5, @@ -1754,12 +1754,12 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 32,97,99,99,101,115,115,114,22,0,0,0,78,41,6,218, 26,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, 105,98,95,101,120,116,101,114,110,97,108,114,126,0,0,0, - 114,225,0,0,0,114,15,0,0,0,114,92,0,0,0,114, - 1,0,0,0,41,1,114,226,0,0,0,114,10,0,0,0, + 114,228,0,0,0,114,15,0,0,0,114,92,0,0,0,114, + 1,0,0,0,41,1,114,229,0,0,0,114,10,0,0,0, 114,10,0,0,0,114,11,0,0,0,218,27,95,105,110,115, 116,97,108,108,95,101,120,116,101,114,110,97,108,95,105,109, 112,111,114,116,101,114,115,144,4,0,0,115,6,0,0,0, - 0,3,8,1,4,1,114,227,0,0,0,41,2,78,78,41, + 0,3,8,1,4,1,114,230,0,0,0,41,2,78,78,41, 1,78,41,2,78,114,22,0,0,0,41,4,78,78,114,10, 0,0,0,114,22,0,0,0,41,50,114,3,0,0,0,114, 126,0,0,0,114,12,0,0,0,114,18,0,0,0,114,59, @@ -1771,13 +1771,13 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,114,142,0,0,0,114,148,0,0,0,114,152,0, 0,0,114,107,0,0,0,114,93,0,0,0,114,158,0,0, 0,114,159,0,0,0,114,94,0,0,0,114,160,0,0,0, - 114,173,0,0,0,114,178,0,0,0,114,185,0,0,0,114, - 187,0,0,0,114,192,0,0,0,114,197,0,0,0,90,15, + 114,173,0,0,0,114,178,0,0,0,114,188,0,0,0,114, + 190,0,0,0,114,195,0,0,0,114,200,0,0,0,90,15, 95,69,82,82,95,77,83,71,95,80,82,69,70,73,88,114, - 199,0,0,0,114,202,0,0,0,218,6,111,98,106,101,99, - 116,114,203,0,0,0,114,204,0,0,0,114,205,0,0,0, - 114,210,0,0,0,114,216,0,0,0,114,219,0,0,0,114, - 220,0,0,0,114,224,0,0,0,114,225,0,0,0,114,227, + 202,0,0,0,114,205,0,0,0,218,6,111,98,106,101,99, + 116,114,206,0,0,0,114,207,0,0,0,114,208,0,0,0, + 114,213,0,0,0,114,219,0,0,0,114,222,0,0,0,114, + 223,0,0,0,114,227,0,0,0,114,228,0,0,0,114,230, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, 0,0,114,11,0,0,0,218,8,60,109,111,100,117,108,101, 62,1,0,0,0,115,94,0,0,0,4,24,4,2,8,8, diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 01344db410a0..6dc684bfcebb 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -587,6 +587,12 @@ pycore_init_types(void) if (!_PyContext_Init()) { return _Py_INIT_ERR("can't init context"); } + + err = _PyErr_Init(); + if (_Py_INIT_FAILED(err)) { + return err; + } + return _Py_INIT_OK(); } @@ -1462,6 +1468,12 @@ new_interpreter(PyThreadState **tstate_p) return err; } + err = _PyErr_Init(); + if (_Py_INIT_FAILED(err)) { + return err; + } + + /* XXX The following is lax in error checking */ PyObject *modules = PyDict_New(); if (modules == NULL) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 1290164edbf6..1735b90b33b9 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -374,6 +374,30 @@ sys_exc_info_impl(PyObject *module) } +/*[clinic input] +sys.unraisablehook + + unraisable: object + / + +Handle an unraisable exception. + +The unraisable argument has the following attributes: + +* exc_type: Exception type. +* exc_value: Exception value. +* exc_tb: Exception traceback, can be None. +* obj: Object causing the exception, can be None. +[clinic start generated code]*/ + +static PyObject * +sys_unraisablehook(PyObject *module, PyObject *unraisable) +/*[clinic end generated code: output=bb92838b32abaa14 input=fdbdb47fdd0bee06]*/ +{ + return _PyErr_WriteUnraisableDefaultHook(unraisable); +} + + /*[clinic input] sys.exit @@ -1672,6 +1696,7 @@ static PyMethodDef sys_methods[] = { METH_VARARGS | METH_KEYWORDS, set_asyncgen_hooks_doc}, SYS_GET_ASYNCGEN_HOOKS_METHODDEF SYS_GETANDROIDAPILEVEL_METHODDEF + SYS_UNRAISABLEHOOK_METHODDEF {NULL, NULL} /* sentinel */ }; @@ -2369,6 +2394,9 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, SET_SYS_FROM_STRING_BORROW( "__breakpointhook__", PyDict_GetItemString(sysdict, "breakpointhook")); + SET_SYS_FROM_STRING_BORROW("__unraisablehook__", + PyDict_GetItemString(sysdict, "unraisablehook")); + SET_SYS_FROM_STRING("version", PyUnicode_FromString(Py_GetVersion())); SET_SYS_FROM_STRING("hexversion", From webhook-mailer at python.org Wed May 22 06:05:15 2019 From: webhook-mailer at python.org (Robert Collins) Date: Wed, 22 May 2019 10:05:15 -0000 Subject: [Python-checkins] bpo-36994: add test for profiling method_descriptor with **kwargs (GH-13461) Message-ID: https://github.com/python/cpython/commit/b892d3ea468101d35e2fb081002fa693bd86eca9 commit: b892d3ea468101d35e2fb081002fa693bd86eca9 branch: master author: Jeroen Demeyer committer: Robert Collins date: 2019-05-22T22:05:02+12:00 summary: bpo-36994: add test for profiling method_descriptor with **kwargs (GH-13461) It adds a missing testcase for bpo-34125. This is testing code which is affected by PEP 590, so missing this test might accidentally break CPython if we screw up with implementing PEP 590. files: M Lib/test/test_sys_setprofile.py diff --git a/Lib/test/test_sys_setprofile.py b/Lib/test/test_sys_setprofile.py index b64bcbc5b686..21a09b51926e 100644 --- a/Lib/test/test_sys_setprofile.py +++ b/Lib/test/test_sys_setprofile.py @@ -334,6 +334,15 @@ def j(p): (1, 'return', j_ident), ]) + # bpo-34125: profiling method_descriptor with **kwargs + def test_unbound_method(self): + kwargs = {} + def f(p): + dict.get({}, 42, **kwargs) + f_ident = ident(f) + self.check_events(f, [(1, 'call', f_ident), + (1, 'return', f_ident)]) + # Test an invalid call (bpo-34126) def test_unbound_method_no_args(self): def f(p): From webhook-mailer at python.org Wed May 22 07:04:10 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 11:04:10 -0000 Subject: [Python-checkins] bpo-36965: Fix includes in main.c on Windows with non-MSC compilers (GH-13421) (GH-13471) Message-ID: https://github.com/python/cpython/commit/791e5fcbab9e444b62d13d08707cbbbeb9406297 commit: 791e5fcbab9e444b62d13d08707cbbbeb9406297 branch: 3.7 author: Erik Janssens committer: Victor Stinner date: 2019-05-22T13:04:06+02:00 summary: bpo-36965: Fix includes in main.c on Windows with non-MSC compilers (GH-13421) (GH-13471) Include windows.h rather than crtdbg.h to get STATUS_CONTROL_C_EXIT constant. Moreover, include windows.h on Windows, not only when MSC is used. (cherry picked from commit 925af1d99b69bf3e229411022ad840c5a0cfdcf8) files: A Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst M Modules/main.c diff --git a/Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst b/Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst new file mode 100644 index 000000000000..2a531d2c14d9 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst @@ -0,0 +1 @@ +include of STATUS_CONTROL_C_EXIT without depending on MSC compiler diff --git a/Modules/main.c b/Modules/main.c index e3683b941754..acc59c6c40a9 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -18,8 +18,8 @@ # endif #endif -#ifdef _MSC_VER -# include +#ifdef MS_WINDOWS +# include /* STATUS_CONTROL_C_EXIT */ #endif #ifdef __FreeBSD__ From webhook-mailer at python.org Wed May 22 07:09:41 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Wed, 22 May 2019 11:09:41 -0000 Subject: [Python-checkins] bpo-36907: fix refcount bug in _PyStack_UnpackDict() (GH-13381) Message-ID: https://github.com/python/cpython/commit/77aa396bb9415428de09112ddf6b34bb843811eb commit: 77aa396bb9415428de09112ddf6b34bb843811eb branch: master author: Jeroen Demeyer committer: Petr Viktorin date: 2019-05-22T13:09:35+02:00 summary: bpo-36907: fix refcount bug in _PyStack_UnpackDict() (GH-13381) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst M Lib/test/test_call.py M Objects/call.c diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index 0da0719457f5..e4ab33cbc16b 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -8,6 +8,7 @@ import struct import collections import itertools +import gc class FunctionCalls(unittest.TestCase): @@ -457,6 +458,22 @@ def test_fastcall_keywords(self): result = _testcapi.pyobject_fastcallkeywords(func, args, kwnames) self.check_result(result, expected) + def test_fastcall_clearing_dict(self): + # Test bpo-36907: the point of the test is just checking that this + # does not crash. + class IntWithDict: + __slots__ = ["kwargs"] + def __init__(self, **kwargs): + self.kwargs = kwargs + def __index__(self): + self.kwargs.clear() + gc.collect() + return 0 + x = IntWithDict(dont_inherit=IntWithDict()) + # We test the argument handling of "compile" here, the compilation + # itself is not relevant. When we pass flags=x below, x.__index__() is + # called, which changes the keywords dict. + compile("pass", "", "exec", x, **x.kwargs) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst new file mode 100644 index 000000000000..ae502e83ef68 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst @@ -0,0 +1,2 @@ +Fix a crash when calling a C function with a keyword dict (``f(**kwargs)``) +and changing the dict ``kwargs`` while that function is running. diff --git a/Objects/call.c b/Objects/call.c index 337ca8110809..cb9ccd9c2cae 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -544,10 +544,14 @@ _PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, } result = (*fastmeth) (self, stack, nargs, kwnames); - if (stack != args) { + if (kwnames != NULL) { + Py_ssize_t i, n = nargs + PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) { + Py_DECREF(stack[i]); + } PyMem_Free((PyObject **)stack); + Py_DECREF(kwnames); } - Py_XDECREF(kwnames); break; } @@ -1334,8 +1338,11 @@ _PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs, return -1; } - /* Copy position arguments (borrowed references) */ - memcpy(stack, args, nargs * sizeof(stack[0])); + /* Copy positional arguments */ + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + stack[i] = args[i]; + } kwstack = stack + nargs; pos = i = 0; @@ -1344,8 +1351,8 @@ _PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs, called in the performance critical hot code. */ while (PyDict_Next(kwargs, &pos, &key, &value)) { Py_INCREF(key); + Py_INCREF(value); PyTuple_SET_ITEM(kwnames, i, key); - /* The stack contains borrowed references */ kwstack[i] = value; i++; } From webhook-mailer at python.org Wed May 22 07:51:37 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Wed, 22 May 2019 11:51:37 -0000 Subject: [Python-checkins] bpo-31862: Port binascii to PEP 489 multiphase initialization (GH-4108) Message-ID: https://github.com/python/cpython/commit/33e71e01e95506cf8d93fd68251fc56352bc7b39 commit: 33e71e01e95506cf8d93fd68251fc56352bc7b39 branch: master author: Marcel Plch committer: Petr Viktorin date: 2019-05-22T13:51:25+02:00 summary: bpo-31862: Port binascii to PEP 489 multiphase initialization (GH-4108) files: A Misc/NEWS.d/next/Core and Builtins/2017-10-24-17-26-58.bpo-31862.5Gea8L.rst M Lib/test/test_capi.py M Modules/binascii.c diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 8bcbd82b2d9d..a062a6563fa2 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -473,6 +473,19 @@ def test_subinterps(self): self.assertNotEqual(pickle.load(f), id(sys.modules)) self.assertNotEqual(pickle.load(f), id(builtins)) + def test_mutate_exception(self): + """ + Exceptions saved in global module state get shared between + individual module instances. This test checks whether or not + a change in one interpreter's module gets reflected into the + other ones. + """ + import binascii + + support.run_in_subinterp("import binascii; binascii.Error.foobar = 'foobar'") + + self.assertFalse(hasattr(binascii.Error, "foobar")) + class TestThreadState(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-10-24-17-26-58.bpo-31862.5Gea8L.rst b/Misc/NEWS.d/next/Core and Builtins/2017-10-24-17-26-58.bpo-31862.5Gea8L.rst new file mode 100644 index 000000000000..0e80cdc6924f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2017-10-24-17-26-58.bpo-31862.5Gea8L.rst @@ -0,0 +1,2 @@ +Port binascii to PEP 489 multiphase initialization. +Patch by Marcel Plch. diff --git a/Modules/binascii.c b/Modules/binascii.c index 2e71ab97b05a..d22ab7b46838 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -61,8 +61,10 @@ #include "zlib.h" #endif -static PyObject *Error; -static PyObject *Incomplete; +typedef struct binascii_state { + PyObject *Error; + PyObject *Incomplete; +} binascii_state; /* ** hqx lookup table, ascii->binary. @@ -263,6 +265,7 @@ binascii_a2b_uu_impl(PyObject *module, Py_buffer *data) unsigned int leftchar = 0; PyObject *rv; Py_ssize_t ascii_len, bin_len; + binascii_state *state; ascii_data = data->buf; ascii_len = data->len; @@ -294,7 +297,11 @@ binascii_a2b_uu_impl(PyObject *module, Py_buffer *data) ** '`' as zero instead of space. */ if ( this_ch < ' ' || this_ch > (' ' + 64)) { - PyErr_SetString(Error, "Illegal char"); + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + PyErr_SetString(state->Error, "Illegal char"); Py_DECREF(rv); return NULL; } @@ -322,7 +329,11 @@ binascii_a2b_uu_impl(PyObject *module, Py_buffer *data) /* Extra '`' may be written as padding in some cases */ if ( this_ch != ' ' && this_ch != ' '+64 && this_ch != '\n' && this_ch != '\r' ) { - PyErr_SetString(Error, "Trailing garbage"); + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + PyErr_SetString(state->Error, "Trailing garbage"); Py_DECREF(rv); return NULL; } @@ -350,6 +361,7 @@ binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick) int leftbits = 0; unsigned char this_ch; unsigned int leftchar = 0; + binascii_state *state; Py_ssize_t bin_len, out_len; _PyBytesWriter writer; @@ -358,7 +370,11 @@ binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick) bin_len = data->len; if ( bin_len > 45 ) { /* The 45 is a limit that appears in all uuencode's */ - PyErr_SetString(Error, "At most 45 bytes at once"); + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + PyErr_SetString(state->Error, "At most 45 bytes at once"); return NULL; } @@ -445,6 +461,7 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data) Py_ssize_t ascii_len, bin_len; int quad_pos = 0; _PyBytesWriter writer; + binascii_state *state; ascii_data = data->buf; ascii_len = data->len; @@ -512,19 +529,23 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data) } if (leftbits != 0) { + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } if (leftbits == 6) { /* ** There is exactly one extra valid, non-padding, base64 character. ** This is an invalid length, as there is no possible input that ** could encoded into such a base64 string. */ - PyErr_Format(Error, + PyErr_Format(state->Error, "Invalid base64-encoded string: " "number of data characters (%zd) cannot be 1 more " "than a multiple of 4", (bin_data - bin_data_start) / 3 * 4 + 1); } else { - PyErr_SetString(Error, "Incorrect padding"); + PyErr_SetString(state->Error, "Incorrect padding"); } _PyBytesWriter_Dealloc(&writer); return NULL; @@ -556,6 +577,7 @@ binascii_b2a_base64_impl(PyObject *module, Py_buffer *data, int newline) unsigned int leftchar = 0; Py_ssize_t bin_len, out_len; _PyBytesWriter writer; + binascii_state *state; bin_data = data->buf; bin_len = data->len; @@ -564,7 +586,11 @@ binascii_b2a_base64_impl(PyObject *module, Py_buffer *data, int newline) assert(bin_len >= 0); if ( bin_len > BASE64_MAXBIN ) { - PyErr_SetString(Error, "Too much data for base64 line"); + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + PyErr_SetString(state->Error, "Too much data for base64 line"); return NULL; } @@ -626,6 +652,7 @@ binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data) Py_ssize_t len; int done = 0; _PyBytesWriter writer; + binascii_state *state; ascii_data = data->buf; len = data->len; @@ -649,7 +676,11 @@ binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data) if ( this_ch == SKIP ) continue; if ( this_ch == FAIL ) { - PyErr_SetString(Error, "Illegal char"); + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + PyErr_SetString(state->Error, "Illegal char"); _PyBytesWriter_Dealloc(&writer); return NULL; } @@ -670,7 +701,11 @@ binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data) } if ( leftbits && !done ) { - PyErr_SetString(Incomplete, + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + PyErr_SetString(state->Incomplete, "String has incomplete number of bytes"); _PyBytesWriter_Dealloc(&writer); return NULL; @@ -822,6 +857,7 @@ binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data) in_data = data->buf; in_len = data->len; _PyBytesWriter_Init(&writer); + binascii_state *state; assert(in_len >= 0); @@ -846,7 +882,11 @@ binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data) #define INBYTE(b) \ do { \ if ( --in_len < 0 ) { \ - PyErr_SetString(Incomplete, ""); \ + state = PyModule_GetState(module); \ + if (state == NULL) { \ + return NULL; \ + } \ + PyErr_SetString(state->Incomplete, ""); \ goto error; \ } \ b = *in_data++; \ @@ -868,7 +908,11 @@ binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data) /* Note Error, not Incomplete (which is at the end ** of the string only). This is a programmer error. */ - PyErr_SetString(Error, "Orphaned RLE code at start"); + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + PyErr_SetString(state->Error, "Orphaned RLE code at start"); goto error; } *out_data++ = RUNCHAR; @@ -1166,6 +1210,7 @@ binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr) PyObject *retval; char* retbuf; Py_ssize_t i, j; + binascii_state *state; argbuf = hexstr->buf; arglen = hexstr->len; @@ -1177,7 +1222,11 @@ binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr) * raise an exception. */ if (arglen % 2) { - PyErr_SetString(Error, "Odd-length string"); + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + PyErr_SetString(state->Error, "Odd-length string"); return NULL; } @@ -1190,7 +1239,11 @@ binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr) unsigned int top = _PyLong_DigitValue[Py_CHARMASK(argbuf[i])]; unsigned int bot = _PyLong_DigitValue[Py_CHARMASK(argbuf[i+1])]; if (top >= 16 || bot >= 16) { - PyErr_SetString(Error, + state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + PyErr_SetString(state->Error, "Non-hexadecimal digit found"); goto finally; } @@ -1545,14 +1598,47 @@ static struct PyMethodDef binascii_module_methods[] = { /* Initialization function for the module (*must* be called PyInit_binascii) */ PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII"); +static int +binascii_exec(PyObject *m) { + int result; + binascii_state *state = PyModule_GetState(m); + if (state == NULL) { + return -1; + } + + state->Error = PyErr_NewException("binascii.Error", PyExc_ValueError, NULL); + if (state->Error == NULL) { + return -1; + } + result = PyModule_AddObject(m, "Error", state->Error); + if (result == -1) { + return -1; + } + + state->Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL); + if (state->Incomplete == NULL) { + return -1; + } + result = PyModule_AddObject(m, "Incomplete", state->Incomplete); + if (result == -1) { + return -1; + } + + return 0; +} + +static PyModuleDef_Slot binascii_slots[] = { + {Py_mod_exec, binascii_exec}, + {0, NULL} +}; static struct PyModuleDef binasciimodule = { PyModuleDef_HEAD_INIT, "binascii", doc_binascii, - -1, + sizeof(binascii_state), binascii_module_methods, - NULL, + binascii_slots, NULL, NULL, NULL @@ -1561,22 +1647,5 @@ static struct PyModuleDef binasciimodule = { PyMODINIT_FUNC PyInit_binascii(void) { - PyObject *m, *d; - - /* Create the module and add the functions */ - m = PyModule_Create(&binasciimodule); - if (m == NULL) - return NULL; - - d = PyModule_GetDict(m); - - Error = PyErr_NewException("binascii.Error", PyExc_ValueError, NULL); - PyDict_SetItemString(d, "Error", Error); - Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL); - PyDict_SetItemString(d, "Incomplete", Incomplete); - if (PyErr_Occurred()) { - Py_DECREF(m); - m = NULL; - } - return m; + return PyModuleDef_Init(&binasciimodule); } From webhook-mailer at python.org Wed May 22 08:52:19 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Wed, 22 May 2019 12:52:19 -0000 Subject: [Python-checkins] bpo-36907: fix refcount bug in _PyStack_UnpackDict() (GH-13381) (GH-13493) Message-ID: https://github.com/python/cpython/commit/d092caf096fa48baadfc0900792206bb5aa0192d commit: d092caf096fa48baadfc0900792206bb5aa0192d branch: 3.7 author: Jeroen Demeyer committer: Petr Viktorin date: 2019-05-22T14:52:13+02:00 summary: bpo-36907: fix refcount bug in _PyStack_UnpackDict() (GH-13381) (GH-13493) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst M Lib/test/test_call.py M Objects/call.c diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index 362c31c40c4a..1e6740244b42 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -8,6 +8,7 @@ import struct import collections import itertools +import gc class FunctionCalls(unittest.TestCase): @@ -438,6 +439,22 @@ def test_fastcall_keywords(self): result = _testcapi.pyobject_fastcallkeywords(func, args, kwnames) self.check_result(result, expected) + def test_fastcall_clearing_dict(self): + # Test bpo-36907: the point of the test is just checking that this + # does not crash. + class IntWithDict: + __slots__ = ["kwargs"] + def __init__(self, **kwargs): + self.kwargs = kwargs + def __int__(self): + self.kwargs.clear() + gc.collect() + return 0 + x = IntWithDict(dont_inherit=IntWithDict()) + # We test the argument handling of "compile" here, the compilation + # itself is not relevant. When we pass flags=x below, x.__int__() is + # called, which changes the keywords dict. + compile("pass", "", "exec", x, **x.kwargs) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst new file mode 100644 index 000000000000..ae502e83ef68 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst @@ -0,0 +1,2 @@ +Fix a crash when calling a C function with a keyword dict (``f(**kwargs)``) +and changing the dict ``kwargs`` while that function is running. diff --git a/Objects/call.c b/Objects/call.c index e6076e7005e9..1209ed3977c7 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -542,10 +542,14 @@ _PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, } result = (*fastmeth) (self, stack, nargs, kwnames); - if (stack != args) { + if (kwnames != NULL) { + Py_ssize_t i, n = nargs + PyTuple_GET_SIZE(kwnames); + for (i = 0; i < n; i++) { + Py_DECREF(stack[i]); + } PyMem_Free((PyObject **)stack); + Py_DECREF(kwnames); } - Py_XDECREF(kwnames); break; } @@ -1379,8 +1383,11 @@ _PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs, return -1; } - /* Copy position arguments (borrowed references) */ - memcpy(stack, args, nargs * sizeof(stack[0])); + /* Copy positional arguments */ + for (i = 0; i < nargs; i++) { + Py_INCREF(args[i]); + stack[i] = args[i]; + } kwstack = stack + nargs; pos = i = 0; @@ -1389,8 +1396,8 @@ _PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs, called in the performance critical hot code. */ while (PyDict_Next(kwargs, &pos, &key, &value)) { Py_INCREF(key); + Py_INCREF(value); PyTuple_SET_ITEM(kwnames, i, key); - /* The stack contains borrowed references */ kwstack[i] = value; i++; } From webhook-mailer at python.org Wed May 22 10:23:13 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Wed, 22 May 2019 14:23:13 -0000 Subject: [Python-checkins] bpo-36972: Add SupportsIndex (GH-13448) Message-ID: https://github.com/python/cpython/commit/4c7a46eb3c009c85ddf2eb315d94d804745187d4 commit: 4c7a46eb3c009c85ddf2eb315d94d804745187d4 branch: master author: Paul Dagnelie committer: Ivan Levkivskyi date: 2019-05-22T15:23:01+01:00 summary: bpo-36972: Add SupportsIndex (GH-13448) In order to support typing checks calling hex(), oct() and bin() on user-defined classes, a SupportIndex protocol is required. The ability to check these at runtime would be good to add for completeness sake. This is pretty much just a copy of SupportsInt with the names tweaked. files: A Misc/NEWS.d/next/Library/2019-05-20-17-08-26.bpo-36972.3l3SGc.rst M Doc/library/typing.rst M Lib/test/test_typing.py M Lib/typing.py M Misc/ACKS diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index c2523ed52960..86a3db8467ec 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -529,6 +529,12 @@ The module defines the following classes, functions and decorators: An ABC with one abstract method ``__bytes__``. +.. class:: SupportsIndex + + An ABC with one abstract method ``__index__``. + + .. versionadded:: 3.8 + .. class:: SupportsAbs An ABC with one abstract method ``__abs__`` that is covariant diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index a547fe274c87..c9bfd0c7ed72 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -568,6 +568,10 @@ def test_reversible(self): self.assertIsSubclass(list, typing.Reversible) self.assertNotIsSubclass(int, typing.Reversible) + def test_supports_index(self): + self.assertIsSubclass(int, typing.SupportsIndex) + self.assertNotIsSubclass(str, typing.SupportsIndex) + def test_protocol_instance_type_error(self): with self.assertRaises(TypeError): isinstance(0, typing.SupportsAbs) diff --git a/Lib/typing.py b/Lib/typing.py index 530d4633fe4c..7aab1628a319 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -74,6 +74,7 @@ 'SupportsBytes', 'SupportsComplex', 'SupportsFloat', + 'SupportsIndex', 'SupportsInt', 'SupportsRound', @@ -1304,6 +1305,14 @@ def __bytes__(self) -> bytes: pass +class SupportsIndex(_Protocol): + __slots__ = () + + @abstractmethod + def __index__(self) -> int: + pass + + class SupportsAbs(_Protocol[T_co]): __slots__ = () diff --git a/Misc/ACKS b/Misc/ACKS index 6b1fdbc37fa9..8f0ecb7f1c37 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -355,6 +355,7 @@ Tom Culliton Ra?l Cumplido Antonio Cuni Brian Curtin +Paul Dagnelie Lisandro Dalcin Darren Dale Andrew Dalke diff --git a/Misc/NEWS.d/next/Library/2019-05-20-17-08-26.bpo-36972.3l3SGc.rst b/Misc/NEWS.d/next/Library/2019-05-20-17-08-26.bpo-36972.3l3SGc.rst new file mode 100644 index 000000000000..da650e8944df --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-20-17-08-26.bpo-36972.3l3SGc.rst @@ -0,0 +1 @@ +Add SupportsIndex protocol to the typing module to allow type checking to detect classes that can be passed to `hex()`, `oct()` and `bin()`. From webhook-mailer at python.org Wed May 22 10:54:34 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Wed, 22 May 2019 14:54:34 -0000 Subject: [Python-checkins] bpo-36878: Track extra text added to 'type: ignore' in the AST (GH-13479) Message-ID: https://github.com/python/cpython/commit/933e1509ec6efa8e6ab8c8c7ce02059ce2b6d9b9 commit: 933e1509ec6efa8e6ab8c8c7ce02059ce2b6d9b9 branch: master author: Michael J. Sullivan committer: Ivan Levkivskyi date: 2019-05-22T15:54:20+01:00 summary: bpo-36878: Track extra text added to 'type: ignore' in the AST (GH-13479) GH-13238 made extra text after a # type: ignore accepted by the parser. This finishes the job and actually plumbs the extra text through the parser and makes it available in the AST. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-21-16-21-22.bpo-36878.EFRHZ3.rst M Include/Python-ast.h M Lib/test/test_type_comments.py M Misc/ACKS M Parser/Python.asdl M Parser/parsetok.c M Parser/tokenizer.c M Python/Python-ast.c M Python/ast.c diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 08d50ffcddf6..2fc50e3f53a2 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -467,6 +467,7 @@ struct _type_ignore { union { struct { int lineno; + string tag; } TypeIgnore; } v; @@ -702,8 +703,8 @@ alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena); #define withitem(a0, a1, a2) _Py_withitem(a0, a1, a2) withitem_ty _Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena); -#define TypeIgnore(a0, a1) _Py_TypeIgnore(a0, a1) -type_ignore_ty _Py_TypeIgnore(int lineno, PyArena *arena); +#define TypeIgnore(a0, a1, a2) _Py_TypeIgnore(a0, a1, a2) +type_ignore_ty _Py_TypeIgnore(int lineno, string tag, PyArena *arena); PyObject* PyAST_mod2obj(mod_ty t); mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index b4318902ee34..c62894fa4255 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -272,7 +272,16 @@ def test_vardecl(self): def test_ignores(self): for tree in self.parse_all(ignores): - self.assertEqual([ti.lineno for ti in tree.type_ignores], [2, 5, 8, 9, 10, 11]) + self.assertEqual( + [(ti.lineno, ti.tag) for ti in tree.type_ignores], + [ + (2, ''), + (5, ''), + (8, '[excuse]'), + (9, '=excuse'), + (10, ' [excuse]'), + (11, ' whatever'), + ]) tree = self.classic_parse(ignores) self.assertEqual(tree.type_ignores, []) diff --git a/Misc/ACKS b/Misc/ACKS index 8f0ecb7f1c37..fbed14684b31 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1594,6 +1594,7 @@ Daniel Stutzbach Andreas St?hrk Colin Su Pal Subbiah +Michael J. Sullivan Nathan Sullivan Mark Summerfield Reuben Sumner diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-21-16-21-22.bpo-36878.EFRHZ3.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-21-16-21-22.bpo-36878.EFRHZ3.rst new file mode 100644 index 000000000000..00c8b904ac2a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-21-16-21-22.bpo-36878.EFRHZ3.rst @@ -0,0 +1,3 @@ +Store text appearing after a `# type: ignore` comment in the AST. For +example a type ignore like `# type: ignore[E1000]` will have the string +`"[E1000]"` stored in its AST node. diff --git a/Parser/Python.asdl b/Parser/Python.asdl index 626fa4fede47..882f5d1eba35 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -125,6 +125,5 @@ module Python withitem = (expr context_expr, expr? optional_vars) - type_ignore = TypeIgnore(int lineno) + type_ignore = TypeIgnore(int lineno, string tag) } - diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 31be0ebbde2d..55fd7f7db3da 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -16,13 +16,16 @@ static node *parsetok(struct tok_state *, grammar *, int, perrdetail *, int *); static int initerr(perrdetail *err_ret, PyObject * filename); typedef struct { - int *items; + struct { + int lineno; + char *comment; + } *items; size_t size; size_t num_items; -} growable_int_array; +} growable_comment_array; static int -growable_int_array_init(growable_int_array *arr, size_t initial_size) { +growable_comment_array_init(growable_comment_array *arr, size_t initial_size) { assert(initial_size > 0); arr->items = malloc(initial_size * sizeof(*arr->items)); arr->size = initial_size; @@ -32,7 +35,7 @@ growable_int_array_init(growable_int_array *arr, size_t initial_size) { } static int -growable_int_array_add(growable_int_array *arr, int item) { +growable_comment_array_add(growable_comment_array *arr, int lineno, char *comment) { if (arr->num_items >= arr->size) { arr->size *= 2; arr->items = realloc(arr->items, arr->size * sizeof(*arr->items)); @@ -41,13 +44,17 @@ growable_int_array_add(growable_int_array *arr, int item) { } } - arr->items[arr->num_items] = item; + arr->items[arr->num_items].lineno = lineno; + arr->items[arr->num_items].comment = comment; arr->num_items++; return 1; } static void -growable_int_array_deallocate(growable_int_array *arr) { +growable_comment_array_deallocate(growable_comment_array *arr) { + for (unsigned i = 0; i < arr->num_items; i++) { + PyObject_FREE(arr->items[i].comment); + } free(arr->items); } @@ -220,9 +227,9 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, node *n; int started = 0; int col_offset, end_col_offset; - growable_int_array type_ignores; + growable_comment_array type_ignores; - if (!growable_int_array_init(&type_ignores, 10)) { + if (!growable_comment_array_init(&type_ignores, 10)) { err_ret->error = E_NOMEM; PyTokenizer_Free(tok); return NULL; @@ -320,8 +327,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, } if (type == TYPE_IGNORE) { - PyObject_FREE(str); - if (!growable_int_array_add(&type_ignores, tok->lineno)) { + if (!growable_comment_array_add(&type_ignores, tok->lineno, str)) { err_ret->error = E_NOMEM; break; } @@ -355,9 +361,16 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, REQ(ch, ENDMARKER); for (i = 0; i < type_ignores.num_items; i++) { - PyNode_AddChild(ch, TYPE_IGNORE, NULL, - type_ignores.items[i], 0, - type_ignores.items[i], 0); + int res = PyNode_AddChild(ch, TYPE_IGNORE, type_ignores.items[i].comment, + type_ignores.items[i].lineno, 0, + type_ignores.items[i].lineno, 0); + if (res != 0) { + err_ret->error = res; + PyNode_Free(n); + n = NULL; + break; + } + type_ignores.items[i].comment = NULL; } } @@ -365,7 +378,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, is a single statement by looking at what is left in the buffer after parsing. Trailing whitespace and comments are OK. */ - if (start == single_input) { + if (err_ret->error == E_DONE && start == single_input) { char *cur = tok->cur; char c = *tok->cur; @@ -392,7 +405,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, else n = NULL; - growable_int_array_deallocate(&type_ignores); + growable_comment_array_deallocate(&type_ignores); #ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD *flags = ps->p_flags; diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index e52d498d5542..9b269afc429b 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1269,6 +1269,7 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) /* This is a type comment if we matched all of type_comment_prefix. */ if (!*prefix) { int is_type_ignore = 1; + const char *ignore_end = p + 6; tok_backup(tok, c); /* don't eat the newline or EOF */ type_start = p; @@ -1276,10 +1277,13 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) /* A TYPE_IGNORE is "type: ignore" followed by the end of the token * or anything non-alphanumeric. */ is_type_ignore = ( - tok->cur >= p + 6 && memcmp(p, "ignore", 6) == 0 - && !(tok->cur > p + 6 && isalnum(p[6]))); + tok->cur >= ignore_end && memcmp(p, "ignore", 6) == 0 + && !(tok->cur > ignore_end && isalnum(p[6]))); if (is_type_ignore) { + *p_start = (char *) ignore_end; + *p_end = tok->cur; + /* If this type ignore is the only thing on the line, consume the newline also. */ if (blankline) { tok_nextc(tok); diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 552750584480..e84a7586a707 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -524,8 +524,10 @@ static char *withitem_fields[]={ static PyTypeObject *type_ignore_type; static PyObject* ast2obj_type_ignore(void*); static PyTypeObject *TypeIgnore_type; +_Py_IDENTIFIER(tag); static char *TypeIgnore_fields[]={ "lineno", + "tag", }; @@ -1164,7 +1166,7 @@ static int init_types(void) if (!type_ignore_type) return 0; if (!add_attributes(type_ignore_type, NULL, 0)) return 0; TypeIgnore_type = make_type("TypeIgnore", type_ignore_type, - TypeIgnore_fields, 1); + TypeIgnore_fields, 2); if (!TypeIgnore_type) return 0; initialized = 1; return 1; @@ -2667,14 +2669,20 @@ withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena) } type_ignore_ty -TypeIgnore(int lineno, PyArena *arena) +TypeIgnore(int lineno, string tag, PyArena *arena) { type_ignore_ty p; + if (!tag) { + PyErr_SetString(PyExc_ValueError, + "field tag is required for TypeIgnore"); + return NULL; + } p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) return NULL; p->kind = TypeIgnore_kind; p->v.TypeIgnore.lineno = lineno; + p->v.TypeIgnore.tag = tag; return p; } @@ -4158,6 +4166,11 @@ ast2obj_type_ignore(void* _o) if (_PyObject_SetAttrId(result, &PyId_lineno, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.TypeIgnore.tag); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_tag, value) == -1) + goto failed; + Py_DECREF(value); break; } return result; @@ -8738,6 +8751,7 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) } if (isinstance) { int lineno; + string tag; if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { return 1; @@ -8752,7 +8766,20 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = TypeIgnore(lineno, arena); + if (_PyObject_LookupAttrId(obj, &PyId_tag, &tmp) < 0) { + return 1; + } + if (tmp == NULL) { + PyErr_SetString(PyExc_TypeError, "required field \"tag\" missing from TypeIgnore"); + return 1; + } + else { + int res; + res = obj2ast_string(tmp, &tag, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = TypeIgnore(lineno, tag, arena); if (*out == NULL) goto failed; return 0; } diff --git a/Python/ast.c b/Python/ast.c index abc8d89c8a38..625982735775 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -830,7 +830,10 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, goto out; for (i = 0; i < num; i++) { - type_ignore_ty ti = TypeIgnore(LINENO(CHILD(ch, i)), arena); + string type_comment = new_type_comment(STR(CHILD(ch, i)), &c); + if (!type_comment) + goto out; + type_ignore_ty ti = TypeIgnore(LINENO(CHILD(ch, i)), type_comment, arena); if (!ti) goto out; asdl_seq_SET(type_ignores, i, ti); From webhook-mailer at python.org Wed May 22 11:18:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 22 May 2019 15:18:32 -0000 Subject: [Python-checkins] bpo-33482: fix codecs.StreamRecoder.writelines (GH-6779) Message-ID: https://github.com/python/cpython/commit/b3be4072888a4ce054993c2801802721466ea02d commit: b3be4072888a4ce054993c2801802721466ea02d branch: master author: Jelle Zijlstra committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-22T08:18:26-07:00 summary: bpo-33482: fix codecs.StreamRecoder.writelines (GH-6779) A very simple fix. I found this while writing typeshed stubs for StreamRecoder. https://bugs.python.org/issue33482 files: A Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst M Lib/codecs.py M Lib/test/test_codecs.py diff --git a/Lib/codecs.py b/Lib/codecs.py index 6b028adb1d28..884be0b2c02e 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -838,7 +838,7 @@ def write(self, data): def writelines(self, list): - data = ''.join(list) + data = b''.join(list) data, bytesdecoded = self.decode(data, self.errors) return self.writer.write(data) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 8c14f5981d0b..f665febfc90a 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3146,6 +3146,27 @@ def test_decode(self): self.assertEqual(data.decode('latin1'), expected) +class StreamRecoderTest(unittest.TestCase): + def test_writelines(self): + bio = io.BytesIO() + codec = codecs.lookup('ascii') + sr = codecs.StreamRecoder(bio, codec.encode, codec.decode, + encodings.ascii.StreamReader, encodings.ascii.StreamWriter) + sr.writelines([b'a', b'b']) + self.assertEqual(bio.getvalue(), b'ab') + + def test_write(self): + bio = io.BytesIO() + codec = codecs.lookup('latin1') + # Recode from Latin-1 to utf-8. + sr = codecs.StreamRecoder(bio, codec.encode, codec.decode, + encodings.utf_8.StreamReader, encodings.utf_8.StreamWriter) + + text = '???' + sr.write(text.encode('latin1')) + self.assertEqual(bio.getvalue(), text.encode('utf-8')) + + @unittest.skipIf(_testcapi is None, 'need _testcapi module') class LocaleCodecTest(unittest.TestCase): """ diff --git a/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst b/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst new file mode 100644 index 000000000000..bda5be87723d --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst @@ -0,0 +1 @@ +Make `codecs.StreamRecoder.writelines` take a list of bytes. From webhook-mailer at python.org Wed May 22 11:43:22 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 15:43:22 -0000 Subject: [Python-checkins] bpo-36084: Add native thread ID (TID) to threading.Thread (GH-13463) Message-ID: https://github.com/python/cpython/commit/b121f63155d8e3c7c42ab6122e36eaf7f5e9f7f5 commit: b121f63155d8e3c7c42ab6122e36eaf7f5e9f7f5 branch: master author: Jake Tesler committer: Victor Stinner date: 2019-05-22T17:43:16+02:00 summary: bpo-36084: Add native thread ID (TID) to threading.Thread (GH-13463) Add native thread ID (TID) to threading.Thread objects (supported platforms: Windows, FreeBSD, Linux, macOS). files: A Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst M Doc/library/_thread.rst M Doc/library/threading.rst M Include/pythread.h M Lib/test/test_threading.py M Lib/threading.py M Modules/_threadmodule.c M Python/thread_nt.h M Python/thread_pthread.h diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index acffabf24bad..d7814f218b50 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -85,6 +85,18 @@ This module defines the following constants and functions: may be recycled when a thread exits and another thread is created. +.. function:: get_native_id() + + Return the native integral Thread ID of the current thread assigned by the kernel. + This is a non-negative integer. + Its value may be used to uniquely identify this particular thread system-wide + (until the thread terminates, after which the value may be recycled by the OS). + + .. availability:: Windows, FreeBSD, Linux, macOS. + + .. versionadded:: 3.8 + + .. function:: stack_size([size]) Return the thread stack size used when creating new threads. The optional diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 22342803e5e6..1df512f1d632 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -49,6 +49,18 @@ This module defines the following functions: .. versionadded:: 3.3 +.. function:: get_native_id() + + Return the native integral Thread ID of the current thread assigned by the kernel. + This is a non-negative integer. + Its value may be used to uniquely identify this particular thread system-wide + (until the thread terminates, after which the value may be recycled by the OS). + + .. availability:: Windows, FreeBSD, Linux, macOS. + + .. versionadded:: 3.8 + + .. function:: enumerate() Return a list of all :class:`Thread` objects currently alive. The list @@ -297,6 +309,26 @@ since it is impossible to detect the termination of alien threads. another thread is created. The identifier is available even after the thread has exited. + .. attribute:: native_id + + The native integral thread ID of this thread. + This is a non-negative integer, or ``None`` if the thread has not + been started. See the :func:`get_native_id` function. + This represents the Thread ID (``TID``) as assigned to the + thread by the OS (kernel). Its value may be used to uniquely identify + this particular thread system-wide (until the thread terminates, + after which the value may be recycled by the OS). + + .. note:: + + Similar to Process IDs, Thread IDs are only valid (guaranteed unique + system-wide) from the time the thread is created until the thread + has been terminated. + + .. availability:: Windows, FreeBSD, Linux, macOS. + + .. versionadded:: 3.8 + .. method:: is_alive() Return whether the thread is alive. diff --git a/Include/pythread.h b/Include/pythread.h index bc1d92cd1ff1..40f12d257c14 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -26,6 +26,11 @@ PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); +#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(_WIN32) +#define PY_HAVE_THREAD_NATIVE_ID +PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); +#endif + PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 2ddc77b266b5..33a25f3b9d23 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -104,6 +104,11 @@ def test_various_ops(self): self.assertRegex(repr(t), r'^$') t.start() + if hasattr(threading, 'get_native_id'): + native_ids = set(t.native_id for t in threads) | {threading.get_native_id()} + self.assertNotIn(None, native_ids) + self.assertEqual(len(native_ids), NUMTASKS + 1) + if verbose: print('waiting for all tasks to complete') for t in threads: diff --git a/Lib/threading.py b/Lib/threading.py index 0ebbd6776ef4..77a2baec2acc 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -34,6 +34,12 @@ _allocate_lock = _thread.allocate_lock _set_sentinel = _thread._set_sentinel get_ident = _thread.get_ident +try: + get_native_id = _thread.get_native_id + _HAVE_THREAD_NATIVE_ID = True + __all__.append('get_native_id') +except AttributeError: + _HAVE_THREAD_NATIVE_ID = False ThreadError = _thread.error try: _CRLock = _thread.RLock @@ -790,6 +796,8 @@ class is implemented. else: self._daemonic = current_thread().daemon self._ident = None + if _HAVE_THREAD_NATIVE_ID: + self._native_id = None self._tstate_lock = None self._started = Event() self._is_stopped = False @@ -891,6 +899,10 @@ def _bootstrap(self): def _set_ident(self): self._ident = get_ident() + if _HAVE_THREAD_NATIVE_ID: + def _set_native_id(self): + self._native_id = get_native_id() + def _set_tstate_lock(self): """ Set a lock object which will be released by the interpreter when @@ -903,6 +915,8 @@ def _bootstrap_inner(self): try: self._set_ident() self._set_tstate_lock() + if _HAVE_THREAD_NATIVE_ID: + self._set_native_id() self._started.set() with _active_limbo_lock: _active[self._ident] = self @@ -1077,6 +1091,18 @@ def ident(self): assert self._initialized, "Thread.__init__() not called" return self._ident + if _HAVE_THREAD_NATIVE_ID: + @property + def native_id(self): + """Native integral thread ID of this thread, or None if it has not been started. + + This is a non-negative integer. See the get_native_id() function. + This represents the Thread ID as reported by the kernel. + + """ + assert self._initialized, "Thread.__init__() not called" + return self._native_id + def is_alive(self): """Return whether the thread is alive. @@ -1176,6 +1202,8 @@ def __init__(self): self._set_tstate_lock() self._started.set() self._set_ident() + if _HAVE_THREAD_NATIVE_ID: + self._set_native_id() with _active_limbo_lock: _active[self._ident] = self @@ -1195,6 +1223,8 @@ def __init__(self): self._started.set() self._set_ident() + if _HAVE_THREAD_NATIVE_ID: + self._set_native_id() with _active_limbo_lock: _active[self._ident] = self diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst new file mode 100644 index 000000000000..fb28a6fec77a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst @@ -0,0 +1 @@ +Add native thread ID (TID) to threading.Thread objects (supported platforms: Windows, FreeBSD, Linux, macOS) \ No newline at end of file diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 3c02d8dd5145..fee25abe283a 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1159,6 +1159,22 @@ allocated consecutive numbers starting at 1, this behavior should not\n\ be relied upon, and the number should be seen purely as a magic cookie.\n\ A thread's identity may be reused for another thread after it exits."); +#ifdef PY_HAVE_THREAD_NATIVE_ID +static PyObject * +thread_get_native_id(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + unsigned long native_id = PyThread_get_thread_native_id(); + return PyLong_FromUnsignedLong(native_id); +} + +PyDoc_STRVAR(get_native_id_doc, +"get_native_id() -> integer\n\ +\n\ +Return a non-negative integer identifying the thread as reported\n\ +by the OS (kernel). This may be used to uniquely identify a\n\ +particular thread within a system."); +#endif + static PyObject * thread__count(PyObject *self, PyObject *Py_UNUSED(ignored)) { @@ -1310,6 +1326,10 @@ static PyMethodDef thread_methods[] = { METH_NOARGS, interrupt_doc}, {"get_ident", thread_get_ident, METH_NOARGS, get_ident_doc}, +#ifdef PY_HAVE_THREAD_NATIVE_ID + {"get_native_id", thread_get_native_id, + METH_NOARGS, get_native_id_doc}, +#endif {"_count", thread__count, METH_NOARGS, _count_doc}, {"stack_size", (PyCFunction)thread_stack_size, diff --git a/Python/thread_nt.h b/Python/thread_nt.h index 5e00c3511460..a5246dd0504d 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -143,6 +143,10 @@ LeaveNonRecursiveMutex(PNRMUTEX mutex) unsigned long PyThread_get_thread_ident(void); +#ifdef PY_HAVE_THREAD_NATIVE_ID +unsigned long PyThread_get_thread_native_id(void); +#endif + /* * Initialization of the C package, should not be needed. */ @@ -227,6 +231,25 @@ PyThread_get_thread_ident(void) return GetCurrentThreadId(); } +#ifdef PY_HAVE_THREAD_NATIVE_ID +/* + * Return the native Thread ID (TID) of the calling thread. + * The native ID of a thread is valid and guaranteed to be unique system-wide + * from the time the thread is created until the thread has been terminated. + */ +unsigned long +PyThread_get_thread_native_id(void) +{ + if (!initialized) { + PyThread_init_thread(); + } + + DWORD native_id; + native_id = GetCurrentThreadId(); + return (unsigned long) native_id; +} +#endif + void _Py_NO_RETURN PyThread_exit_thread(void) { diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 4c106d9959c1..f57a1e7bb78b 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -12,6 +12,12 @@ #endif #include +#if defined(__linux__) +# include /* syscall(SYS_gettid) */ +#elif defined(__FreeBSD__) +# include /* pthread_getthreadid_np() */ +#endif + /* The POSIX spec requires that use of pthread_attr_setstacksize be conditional on _POSIX_THREAD_ATTR_STACKSIZE being defined. */ #ifdef _POSIX_THREAD_ATTR_STACKSIZE @@ -302,6 +308,26 @@ PyThread_get_thread_ident(void) return (unsigned long) threadid; } +#ifdef PY_HAVE_THREAD_NATIVE_ID +unsigned long +PyThread_get_thread_native_id(void) +{ + if (!initialized) + PyThread_init_thread(); +#ifdef __APPLE__ + uint64_t native_id; + (void) pthread_threadid_np(NULL, &native_id); +#elif defined(__linux__) + pid_t native_id; + native_id = syscall(SYS_gettid); +#elif defined(__FreeBSD__) + int native_id; + native_id = pthread_getthreadid_np(); +#endif + return (unsigned long) native_id; +} +#endif + void _Py_NO_RETURN PyThread_exit_thread(void) { From webhook-mailer at python.org Wed May 22 12:23:34 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 16:23:34 -0000 Subject: [Python-checkins] bpo-36829: Enhance PyErr_WriteUnraisable() (GH-13487) Message-ID: https://github.com/python/cpython/commit/a58db9628d0c96cc5b863137fed4e432238f8027 commit: a58db9628d0c96cc5b863137fed4e432238f8027 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-05-22T18:23:28+02:00 summary: bpo-36829: Enhance PyErr_WriteUnraisable() (GH-13487) PyErr_WriteUnraisable() now displays the exception even if displaying the traceback failed. Moreover, hold a strong reference to sys.stderr while using it. Document that an exception must be set when calling PyErr_WriteUnraisable(), but don't add an assertion to check it at runtime. Cleanup: use longer names for variables and create write_unraisable_exc_file() subfunction. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-44-41.bpo-36829.ZmpHR9.rst M Doc/c-api/exceptions.rst M Python/errors.c diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index cd06096ef7bb..79e6f97a44c7 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -81,6 +81,8 @@ Printing and clearing in which the unraisable exception occurred. If possible, the repr of *obj* will be printed in the warning message. + An exception must be set when calling this function. + Raising exceptions ================== diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-44-41.bpo-36829.ZmpHR9.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-44-41.bpo-36829.ZmpHR9.rst new file mode 100644 index 000000000000..790dc47ad064 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-44-41.bpo-36829.ZmpHR9.rst @@ -0,0 +1,4 @@ +:c:func:`PyErr_WriteUnraisable` now displays the exception even if +displaying the traceback failed. Moreover, hold a strong reference to +:data:`sys.stderr` while using it. Document that an exception must be set when +calling :c:func:`PyErr_WriteUnraisable`. diff --git a/Python/errors.c b/Python/errors.c index 8c8ea1cd5772..6b8bac2fe172 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -940,90 +940,121 @@ PyErr_NewExceptionWithDoc(const char *name, const char *doc, } -/* Call when an exception has occurred but there is no way for Python - to handle it. Examples: exception in __del__ or during GC. */ -void -PyErr_WriteUnraisable(PyObject *obj) +static void +write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, + PyObject *exc_tb, PyObject *obj, PyObject *file) { - _Py_IDENTIFIER(__module__); - PyObject *f, *t, *v, *tb; - PyObject *moduleName = NULL; - char* className; - - PyErr_Fetch(&t, &v, &tb); - - f = _PySys_GetObjectId(&PyId_stderr); - if (f == NULL || f == Py_None) - goto done; - if (obj) { - if (PyFile_WriteString("Exception ignored in: ", f) < 0) - goto done; - if (PyFile_WriteObject(obj, f, 0) < 0) { + if (PyFile_WriteString("Exception ignored in: ", file) < 0) { + return; + } + if (PyFile_WriteObject(obj, file, 0) < 0) { PyErr_Clear(); - if (PyFile_WriteString("", f) < 0) { - goto done; + if (PyFile_WriteString("", file) < 0) { + return; } } - if (PyFile_WriteString("\n", f) < 0) - goto done; + if (PyFile_WriteString("\n", file) < 0) { + return; + } } - if (PyTraceBack_Print(tb, f) < 0) - goto done; + if (exc_tb != NULL) { + if (PyTraceBack_Print(exc_tb, file) < 0) { + /* continue even if writing the traceback failed */ + PyErr_Clear(); + } + } - if (!t) - goto done; + if (!exc_type) { + return; + } - assert(PyExceptionClass_Check(t)); - className = PyExceptionClass_Name(t); + assert(PyExceptionClass_Check(exc_type)); + char* className = PyExceptionClass_Name(exc_type); if (className != NULL) { char *dot = strrchr(className, '.'); - if (dot != NULL) + if (dot != NULL) { className = dot+1; + } } - moduleName = _PyObject_GetAttrId(t, &PyId___module__); + _Py_IDENTIFIER(__module__); + PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__); if (moduleName == NULL || !PyUnicode_Check(moduleName)) { + Py_XDECREF(moduleName); PyErr_Clear(); - if (PyFile_WriteString("", f) < 0) - goto done; + if (PyFile_WriteString("", file) < 0) { + return; + } } else { if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) { - if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0) - goto done; - if (PyFile_WriteString(".", f) < 0) - goto done; + if (PyFile_WriteObject(moduleName, file, Py_PRINT_RAW) < 0) { + Py_DECREF(moduleName); + return; + } + Py_DECREF(moduleName); + if (PyFile_WriteString(".", file) < 0) { + return; + } + } + else { + Py_DECREF(moduleName); } } + if (className == NULL) { - if (PyFile_WriteString("", f) < 0) - goto done; + if (PyFile_WriteString("", file) < 0) { + return; + } } else { - if (PyFile_WriteString(className, f) < 0) - goto done; + if (PyFile_WriteString(className, file) < 0) { + return; + } } - if (v && v != Py_None) { - if (PyFile_WriteString(": ", f) < 0) - goto done; - if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) { + if (exc_value && exc_value != Py_None) { + if (PyFile_WriteString(": ", file) < 0) { + return; + } + if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) { PyErr_Clear(); - if (PyFile_WriteString("", f) < 0) { - goto done; + if (PyFile_WriteString("", file) < 0) { + return; } } } - if (PyFile_WriteString("\n", f) < 0) - goto done; + if (PyFile_WriteString("\n", file) < 0) { + return; + } +} -done: - Py_XDECREF(moduleName); - Py_XDECREF(t); - Py_XDECREF(v); - Py_XDECREF(tb); + +/* Display an unraisable exception into sys.stderr. + + Called when an exception has occurred but there is no way for Python to + handle it. For example, when a destructor raises an exception or during + garbage collection (gc.collect()). + + An exception must be set when calling this function. */ +void +PyErr_WriteUnraisable(PyObject *obj) +{ + PyObject *f, *exc_type, *exc_value, *exc_tb; + + PyErr_Fetch(&exc_type, &exc_value, &exc_tb); + + f = _PySys_GetObjectId(&PyId_stderr); + /* Do nothing if sys.stderr is not available or set to None */ + if (f != NULL && f != Py_None) { + write_unraisable_exc_file(exc_type, exc_value, exc_tb, obj, f); + } + + Py_XDECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); PyErr_Clear(); /* Just in case */ } From webhook-mailer at python.org Wed May 22 12:28:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 22 May 2019 16:28:43 -0000 Subject: [Python-checkins] [3.7] bpo-33482: fix codecs.StreamRecoder.writelines (GH-6779) (GH-13502) Message-ID: https://github.com/python/cpython/commit/81c5ec9e417aebfe92945a05771006e4241f4e08 commit: 81c5ec9e417aebfe92945a05771006e4241f4e08 branch: 3.7 author: Jelle Zijlstra committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-22T09:28:38-07:00 summary: [3.7] bpo-33482: fix codecs.StreamRecoder.writelines (GH-6779) (GH-13502) A very simple fix. I found this while writing typeshed stubs for StreamRecoder. https://bugs.python.org/issue33482. (cherry picked from commit b3be4072888a4ce054993c2801802721466ea02d) Co-authored-by: Jelle Zijlstra https://bugs.python.org/issue33482 files: A Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst M Lib/codecs.py M Lib/test/test_codecs.py diff --git a/Lib/codecs.py b/Lib/codecs.py index a70ed20f2bc7..3cd78fc9f197 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -838,7 +838,7 @@ def write(self, data): def writelines(self, list): - data = ''.join(list) + data = b''.join(list) data, bytesdecoded = self.decode(data, self.errors) return self.writer.write(data) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 5ba2c7bdc5f8..a3a2f6563a1f 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3298,5 +3298,26 @@ def test_decode(self): self.assertEqual(data.decode('latin1'), expected) +class StreamRecoderTest(unittest.TestCase): + def test_writelines(self): + bio = io.BytesIO() + codec = codecs.lookup('ascii') + sr = codecs.StreamRecoder(bio, codec.encode, codec.decode, + encodings.ascii.StreamReader, encodings.ascii.StreamWriter) + sr.writelines([b'a', b'b']) + self.assertEqual(bio.getvalue(), b'ab') + + def test_write(self): + bio = io.BytesIO() + codec = codecs.lookup('latin1') + # Recode from Latin-1 to utf-8. + sr = codecs.StreamRecoder(bio, codec.encode, codec.decode, + encodings.utf_8.StreamReader, encodings.utf_8.StreamWriter) + + text = '???' + sr.write(text.encode('latin1')) + self.assertEqual(bio.getvalue(), text.encode('utf-8')) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst b/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst new file mode 100644 index 000000000000..bda5be87723d --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst @@ -0,0 +1 @@ +Make `codecs.StreamRecoder.writelines` take a list of bytes. From webhook-mailer at python.org Wed May 22 15:38:52 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 22 May 2019 19:38:52 -0000 Subject: [Python-checkins] bpo-34616: Document top level async in whatsnew/3.8. (GH-13484) Message-ID: https://github.com/python/cpython/commit/2ddbd21aec7f0e2f237a1073d3e0b313e673413f commit: 2ddbd21aec7f0e2f237a1073d3e0b313e673413f branch: master author: Matthias Bussonnier committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-22T12:07:45-07:00 summary: bpo-34616: Document top level async in whatsnew/3.8. (GH-13484) https://bugs.python.org/issue34616 files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 63b8200a1528..68843e2d9ed1 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -237,6 +237,16 @@ asyncio On Windows, the default event loop is now :class:`~asyncio.ProactorEventLoop`. +builtins +-------- + +The :func:`compile` built-in has been improved to accept the +``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag. With this new flag passed, +:func:`compile` will allow top-level ``await``, ``async for`` and ``async with`` +constructs that are usually considered invalid syntax. Asynchronous code object +marked with the ``CO_COROUTINE`` flag may then be returned. + +(Contributed by Matthias Bussonnier in :issue:`34616`) collections ----------- From webhook-mailer at python.org Wed May 22 16:15:19 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 20:15:19 -0000 Subject: [Python-checkins] bpo-35907, CVE-2019-9948: urllib rejects local_file:// scheme (GH-13474) Message-ID: https://github.com/python/cpython/commit/0c2b6a3943aa7b022e8eb4bfd9bffcddebf9a587 commit: 0c2b6a3943aa7b022e8eb4bfd9bffcddebf9a587 branch: master author: Victor Stinner committer: GitHub date: 2019-05-22T22:15:01+02:00 summary: bpo-35907, CVE-2019-9948: urllib rejects local_file:// scheme (GH-13474) CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in URLopener().open() and URLopener().retrieve() of urllib.request. Co-Authored-By: SH files: A Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst M Lib/test/test_urllib.py M Lib/urllib/request.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 6b995fef8cb5..f9b2799d25bf 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1481,6 +1481,19 @@ def test_urlopener_retrieve_remote(self): filename, _ = urllib.request.URLopener().retrieve(url) self.assertEqual(os.path.splitext(filename)[1], ".txt") + @support.ignore_warnings(category=DeprecationWarning) + def test_local_file_open(self): + # bpo-35907, CVE-2019-9948: urllib must reject local_file:// scheme + class DummyURLopener(urllib.request.URLopener): + def open_local_file(self, url): + return url + for url in ('local_file://example', 'local-file://example'): + self.assertRaises(OSError, urllib.request.urlopen, url) + self.assertRaises(OSError, urllib.request.URLopener().open, url) + self.assertRaises(OSError, urllib.request.URLopener().retrieve, url) + self.assertRaises(OSError, DummyURLopener().open, url) + self.assertRaises(OSError, DummyURLopener().retrieve, url) + # Just commented them out. # Can't really tell why keep failing in windows and sparc. diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 230ac390abb3..9b21afb74e6e 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1745,7 +1745,7 @@ def open(self, fullurl, data=None): name = 'open_' + urltype self.type = urltype name = name.replace('-', '_') - if not hasattr(self, name): + if not hasattr(self, name) or name == 'open_local_file': if proxy: return self.open_unknown_proxy(proxy, fullurl, data) else: diff --git a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst new file mode 100644 index 000000000000..42aca0bbd1b7 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst @@ -0,0 +1,2 @@ +CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in +``URLopener().open()`` ``URLopener().retrieve()`` of :mod:`urllib.request`. From webhook-mailer at python.org Wed May 22 16:43:44 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 22 May 2019 20:43:44 -0000 Subject: [Python-checkins] bpo-36878: Only allow text after `# type: ignore` if first character ASCII (GH-13504) Message-ID: https://github.com/python/cpython/commit/d8a82e2897b735e2b7e9e086f1d709365a2ad72c commit: d8a82e2897b735e2b7e9e086f1d709365a2ad72c branch: master author: Michael J. Sullivan committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-22T13:43:36-07:00 summary: bpo-36878: Only allow text after `# type: ignore` if first character ASCII (GH-13504) This disallows things like `# type: ignore?`, which seems wrong. Also switch to using Py_ISALNUM for the alnum check, for consistency with other code (and maybe correctness re: locale issues?). https://bugs.python.org/issue36878 files: A Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-16-16.bpo-36878.QwLa3P.rst M Lib/test/test_type_comments.py M Parser/tokenizer.c diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index c62894fa4255..83d8717247aa 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -334,6 +334,7 @@ def check_both_ways(source): check_both_ways("try: # type: int\n pass\nfinally:\n pass\n") check_both_ways("try:\n pass\nfinally: # type: int\n pass\n") check_both_ways("pass # type: ignorewhatever\n") + check_both_ways("pass # type: ignore?\n") def test_func_type_input(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-16-16.bpo-36878.QwLa3P.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-16-16.bpo-36878.QwLa3P.rst new file mode 100644 index 000000000000..2d9f014119db --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-16-16.bpo-36878.QwLa3P.rst @@ -0,0 +1,2 @@ +Only accept text after `# type: ignore` if the first character is ASCII. +This is to disallow things like `# type: ignore?`. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 9b269afc429b..c2ec659fed88 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1275,10 +1275,11 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) type_start = p; /* A TYPE_IGNORE is "type: ignore" followed by the end of the token - * or anything non-alphanumeric. */ + * or anything ASCII and non-alphanumeric. */ is_type_ignore = ( tok->cur >= ignore_end && memcmp(p, "ignore", 6) == 0 - && !(tok->cur > ignore_end && isalnum(p[6]))); + && !(tok->cur > ignore_end + && ((unsigned char)ignore_end[0] >= 128 || Py_ISALNUM(ignore_end[0])))); if (is_type_ignore) { *p_start = (char *) ignore_end; From webhook-mailer at python.org Wed May 22 17:28:07 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 21:28:07 -0000 Subject: [Python-checkins] bpo-35907: Complete test_urllib.test_local_file_open() (GH-13506) Message-ID: https://github.com/python/cpython/commit/942c31dffbe886ff02e25a319cc3891220b8c641 commit: 942c31dffbe886ff02e25a319cc3891220b8c641 branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-05-22T23:28:03+02:00 summary: bpo-35907: Complete test_urllib.test_local_file_open() (GH-13506) Test also URLopener().open(), URLopener().retrieve(), and DummyURLopener().retrieve(). files: M Lib/test/test_urllib.py M Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index ae1f6c0b29f0..22b0874a9281 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1049,12 +1049,16 @@ def open_spam(self, url): "//c:|windows%/:=&?~#+!$,;'@()*[]|/path/") def test_local_file_open(self): + # bpo-35907, CVE-2019-9948: urllib must reject local_file:// scheme class DummyURLopener(urllib.URLopener): def open_local_file(self, url): return url for url in ('local_file://example', 'local-file://example'): - self.assertRaises(IOError, DummyURLopener().open, url) self.assertRaises(IOError, urllib.urlopen, url) + self.assertRaises(IOError, urllib.URLopener().open, url) + self.assertRaises(IOError, urllib.URLopener().retrieve, url) + self.assertRaises(IOError, DummyURLopener().open, url) + self.assertRaises(IOError, DummyURLopener().retrieve, url) # Just commented them out. # Can't really tell why keep failing in windows and sparc. diff --git a/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst b/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst index bb187d8d65a5..6a448ce6261c 100644 --- a/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst +++ b/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst @@ -1 +1,3 @@ -CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in urllib.urlopen +CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in +:func:`urllib.urlopen`, :meth:`urllib.URLopener.open` and +:meth:`urllib.URLopener.retrieve`. From webhook-mailer at python.org Wed May 22 17:28:31 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 21:28:31 -0000 Subject: [Python-checkins] bpo-35907, CVE-2019-9948: urllib rejects local_file:// scheme (GH-13474) (GH-13505) Message-ID: https://github.com/python/cpython/commit/34bab215596671d0dec2066ae7d7450cd73f638b commit: 34bab215596671d0dec2066ae7d7450cd73f638b branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-05-22T23:28:28+02:00 summary: bpo-35907, CVE-2019-9948: urllib rejects local_file:// scheme (GH-13474) (GH-13505) CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in URLopener().open() and URLopener().retrieve() of urllib.request. Co-Authored-By: SH (cherry picked from commit 0c2b6a3943aa7b022e8eb4bfd9bffcddebf9a587) files: A Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst M Lib/test/test_urllib.py M Lib/urllib/request.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 7214492eca9d..7ec365b928a5 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -16,6 +16,7 @@ ssl = None import sys import tempfile +import warnings from nturl2path import url2pathname, pathname2url from base64 import b64encode @@ -1463,6 +1464,23 @@ def open_spam(self, url): "spam://c:|windows%/:=&?~#+!$,;'@()*[]|/path/"), "//c:|windows%/:=&?~#+!$,;'@()*[]|/path/") + def test_local_file_open(self): + # bpo-35907, CVE-2019-9948: urllib must reject local_file:// scheme + class DummyURLopener(urllib.request.URLopener): + def open_local_file(self, url): + return url + + with warnings.catch_warnings(record=True): + warnings.simplefilter("ignore", DeprecationWarning) + + for url in ('local_file://example', 'local-file://example'): + self.assertRaises(OSError, urllib.request.urlopen, url) + self.assertRaises(OSError, urllib.request.URLopener().open, url) + self.assertRaises(OSError, urllib.request.URLopener().retrieve, url) + self.assertRaises(OSError, DummyURLopener().open, url) + self.assertRaises(OSError, DummyURLopener().retrieve, url) + + # Just commented them out. # Can't really tell why keep failing in windows and sparc. # Everywhere else they work ok, but on those machines, sometimes diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index d38f725d8e9f..37b254862887 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1746,7 +1746,7 @@ def open(self, fullurl, data=None): name = 'open_' + urltype self.type = urltype name = name.replace('-', '_') - if not hasattr(self, name): + if not hasattr(self, name) or name == 'open_local_file': if proxy: return self.open_unknown_proxy(proxy, fullurl, data) else: diff --git a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst new file mode 100644 index 000000000000..16adc7a94e2f --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst @@ -0,0 +1,2 @@ +CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in +``URLopener().open()`` and ``URLopener().retrieve()`` of :mod:`urllib.request`. From webhook-mailer at python.org Wed May 22 17:29:06 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Wed, 22 May 2019 21:29:06 -0000 Subject: [Python-checkins] bpo-33110: Catch errors raised when running add_done_callback on already completed futures (GH-13141) Message-ID: https://github.com/python/cpython/commit/2a3a2ece502c05ea33c95dd0db497189e0354bfd commit: 2a3a2ece502c05ea33c95dd0db497189e0354bfd branch: master author: Sam Martin committer: Antoine Pitrou date: 2019-05-22T23:29:02+02:00 summary: bpo-33110: Catch errors raised when running add_done_callback on already completed futures (GH-13141) Wrap the callback call within the `add_done_callback` function within concurrent.futures, in order to behave in an identical manner to callbacks added to a running future are triggered once it has completed. files: A Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst M Lib/concurrent/futures/_base.py M Lib/test/test_concurrent_futures.py diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index 8f155f0ea82b..6001e3bdb81b 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -404,7 +404,10 @@ def add_done_callback(self, fn): if self._state not in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED]: self._done_callbacks.append(fn) return - fn(self) + try: + fn(self) + except Exception: + LOGGER.exception('exception calling callback for %r', self) def result(self, timeout=None): """Return the result of the call that the future represents. diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 3c963dff1db2..212ccd8d5320 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -1087,6 +1087,22 @@ def fn(callback_future): f.add_done_callback(fn) self.assertTrue(was_cancelled) + def test_done_callback_raises_already_succeeded(self): + with test.support.captured_stderr() as stderr: + def raising_fn(callback_future): + raise Exception('doh!') + + f = Future() + + # Set the result first to simulate a future that runs instantly, + # effectively allowing the callback to be run immediately. + f.set_result(5) + f.add_done_callback(raising_fn) + + self.assertIn('exception calling callback for', stderr.getvalue()) + self.assertIn('doh!', stderr.getvalue()) + + def test_repr(self): self.assertRegex(repr(PENDING_FUTURE), '') diff --git a/Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst b/Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst new file mode 100644 index 000000000000..f1e2460c4927 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst @@ -0,0 +1 @@ +Handle exceptions raised by functions added by concurrent.futures add_done_callback correctly when the Future has already completed. From webhook-mailer at python.org Wed May 22 17:30:01 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Wed, 22 May 2019 21:30:01 -0000 Subject: [Python-checkins] bpo-24882: Let ThreadPoolExecutor reuse idle threads before creating new thread (#6375) Message-ID: https://github.com/python/cpython/commit/904e34d4e6b6007986dcc585d5c553ee8ae06f95 commit: 904e34d4e6b6007986dcc585d5c553ee8ae06f95 branch: master author: Sean committer: Antoine Pitrou date: 2019-05-22T23:29:58+02:00 summary: bpo-24882: Let ThreadPoolExecutor reuse idle threads before creating new thread (#6375) * Fixes issue 24882 * Add news file entry for change. * Change test_concurrent_futures.ThreadPoolShutdownTest Adjust the shutdown test so that, after submitting three jobs to the executor, the test checks for less than three threads, instead of looking for exactly three threads. If idle threads are being recycled properly, then we should have less than three threads. * Switched idle count to semaphor, Updated tests As suggested by reviewer tomMoral, swapped lock-protected counter with a semaphore to track the number of unused threads. Adjusted test_threads_terminate to wait for completiton of the previous future before submitting a new one (and checking the number of threads used). Also added a new test to confirm the thread pool can be saturated. * Updates tests as requested by pitrou. * Correct minor whitespace error. * Make test_saturation faster files: A Misc/NEWS.d/next/Library/2018-04-04-14-54-30.bpo-24882.urybpa.rst M Lib/concurrent/futures/thread.py M Lib/test/test_concurrent_futures.py diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 2af31a106dd9..ad6b4c20b566 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -80,7 +80,14 @@ def _worker(executor_reference, work_queue, initializer, initargs): work_item.run() # Delete references to object. See issue16284 del work_item + + # attempt to increment idle count + executor = executor_reference() + if executor is not None: + executor._idle_semaphore.release() + del executor continue + executor = executor_reference() # Exit if: # - The interpreter is shutting down OR @@ -133,6 +140,7 @@ def __init__(self, max_workers=None, thread_name_prefix='', self._max_workers = max_workers self._work_queue = queue.SimpleQueue() + self._idle_semaphore = threading.Semaphore(0) self._threads = set() self._broken = False self._shutdown = False @@ -178,12 +186,15 @@ def submit(*args, **kwargs): submit.__doc__ = _base.Executor.submit.__doc__ def _adjust_thread_count(self): + # if idle threads are available, don't spin new threads + if self._idle_semaphore.acquire(timeout=0): + return + # When the executor gets lost, the weakref callback will wake up # the worker threads. def weakref_cb(_, q=self._work_queue): q.put(None) - # TODO(bquinlan): Should avoid creating new threads if there are more - # idle threads than items in the work queue. + num_threads = len(self._threads) if num_threads < self._max_workers: thread_name = '%s_%d' % (self._thread_name_prefix or self, diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 212ccd8d5320..de6ad8f2aa12 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -346,10 +346,15 @@ def _prime_executor(self): pass def test_threads_terminate(self): - self.executor.submit(mul, 21, 2) - self.executor.submit(mul, 6, 7) - self.executor.submit(mul, 3, 14) + def acquire_lock(lock): + lock.acquire() + + sem = threading.Semaphore(0) + for i in range(3): + self.executor.submit(acquire_lock, sem) self.assertEqual(len(self.executor._threads), 3) + for i in range(3): + sem.release() self.executor.shutdown() for t in self.executor._threads: t.join() @@ -753,6 +758,27 @@ def test_default_workers(self): self.assertEqual(executor._max_workers, (os.cpu_count() or 1) * 5) + def test_saturation(self): + executor = self.executor_type(4) + def acquire_lock(lock): + lock.acquire() + + sem = threading.Semaphore(0) + for i in range(15 * executor._max_workers): + executor.submit(acquire_lock, sem) + self.assertEqual(len(executor._threads), executor._max_workers) + for i in range(15 * executor._max_workers): + sem.release() + executor.shutdown(wait=True) + + def test_idle_thread_reuse(self): + executor = self.executor_type() + executor.submit(mul, 21, 2).result() + executor.submit(mul, 6, 7).result() + executor.submit(mul, 3, 14).result() + self.assertEqual(len(executor._threads), 1) + executor.shutdown(wait=True) + class ProcessPoolExecutorTest(ExecutorTest): diff --git a/Misc/NEWS.d/next/Library/2018-04-04-14-54-30.bpo-24882.urybpa.rst b/Misc/NEWS.d/next/Library/2018-04-04-14-54-30.bpo-24882.urybpa.rst new file mode 100644 index 000000000000..8c418824a99d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-04-04-14-54-30.bpo-24882.urybpa.rst @@ -0,0 +1 @@ +Change ThreadPoolExecutor to use existing idle threads before spinning up new ones. \ No newline at end of file From webhook-mailer at python.org Wed May 22 17:44:06 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 21:44:06 -0000 Subject: [Python-checkins] bpo-36829: Add test.support.catch_unraisable_exception() (GH-13490) Message-ID: https://github.com/python/cpython/commit/e4d300e07c33a9a77549c62d8687d8fe130c53d5 commit: e4d300e07c33a9a77549c62d8687d8fe130c53d5 branch: master author: Victor Stinner committer: GitHub date: 2019-05-22T23:44:02+02:00 summary: bpo-36829: Add test.support.catch_unraisable_exception() (GH-13490) * Copy test_exceptions.test_unraisable() to test_sys.UnraisableHookTest(). * Use catch_unraisable_exception() in test_coroutines, test_exceptions, test_generators. files: A Misc/NEWS.d/next/Tests/2019-05-22-12-57-15.bpo-36829.e9mRWC.rst M Lib/test/support/__init__.py M Lib/test/test_coroutines.py M Lib/test/test_exceptions.py M Lib/test/test_generators.py M Lib/test/test_sys.py diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 9e60d960ab12..2fe9d9dc8099 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3034,3 +3034,36 @@ def collision_stats(nbins, nballs): collisions = k - occupied var = dn*(dn-1)*((dn-2)/dn)**k + meanempty * (1 - meanempty) return float(collisions), float(var.sqrt()) + + +class catch_unraisable_exception: + """ + Context manager catching unraisable exception using sys.unraisablehook. + + Usage: + + with support.catch_unraisable_exception() as cm: + ... + + # check the expected unraisable exception: use cm.unraisable + ... + + # cm.unraisable is None here (to break a reference cycle) + """ + + def __init__(self): + self.unraisable = None + self._old_hook = None + + def _hook(self, unraisable): + self.unraisable = unraisable + + def __enter__(self): + self._old_hook = sys.unraisablehook + sys.unraisablehook = self._hook + return self + + def __exit__(self, *exc_info): + # Clear the unraisable exception to explicitly break a reference cycle + self.unraisable = None + sys.unraisablehook = self._old_hook diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 8443e658a620..036f13fa50e9 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -2342,12 +2342,19 @@ def test_unawaited_warning_when_module_broken(self): orig_wuc = warnings._warn_unawaited_coroutine try: warnings._warn_unawaited_coroutine = lambda coro: 1/0 - with support.captured_stderr() as stream: - corofn() + with support.catch_unraisable_exception() as cm, \ + support.captured_stderr() as stream: + # only store repr() to avoid keeping the coroutine alive + coro = corofn() + coro_repr = repr(coro) + + # clear reference to the coroutine without awaiting for it + del coro support.gc_collect() - self.assertIn("Exception ignored in", stream.getvalue()) - self.assertIn("ZeroDivisionError", stream.getvalue()) - self.assertIn("was never awaited", stream.getvalue()) + + self.assertEqual(repr(cm.unraisable.object), coro_repr) + self.assertEqual(cm.unraisable.exc_type, ZeroDivisionError) + self.assertIn("was never awaited", stream.getvalue()) del warnings._warn_unawaited_coroutine with support.captured_stderr() as stream: diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 6ef529e2b015..d7e11d2d30a8 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -12,6 +12,9 @@ check_warnings, cpython_only, gc_collect, run_unittest, no_tracing, unlink, import_module, script_helper, SuppressCrashReport) +from test import support + + class NaiveException(Exception): def __init__(self, x): self.x = x @@ -1181,29 +1184,12 @@ def __del__(self): # The following line is included in the traceback report: raise exc - class BrokenExceptionDel: - def __del__(self): - exc = BrokenStrException() - # The following line is included in the traceback report: - raise exc + obj = BrokenDel() + with support.catch_unraisable_exception() as cm: + del obj - for test_class in (BrokenDel, BrokenExceptionDel): - with self.subTest(test_class): - obj = test_class() - with captured_stderr() as stderr: - del obj - report = stderr.getvalue() - self.assertIn("Exception ignored", report) - self.assertIn(test_class.__del__.__qualname__, report) - self.assertIn("test_exceptions.py", report) - self.assertIn("raise exc", report) - if test_class is BrokenExceptionDel: - self.assertIn("BrokenStrException", report) - self.assertIn("", report) - else: - self.assertIn("ValueError", report) - self.assertIn("del is broken", report) - self.assertTrue(report.endswith("\n")) + self.assertEqual(cm.unraisable.object, BrokenDel.__del__) + self.assertIsNotNone(cm.unraisable.exc_traceback) def test_unhandled(self): # Check for sensible reporting of unhandled exceptions diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index 320793c7dab6..7f1472fa03ac 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -2156,25 +2156,21 @@ def printsolution(self, x): printing warnings and to doublecheck that we actually tested what we wanted to test. ->>> import sys, io ->>> old = sys.stderr ->>> try: -... sys.stderr = io.StringIO() -... class Leaker: -... def __del__(self): -... def invoke(message): -... raise RuntimeError(message) -... invoke("test") +>>> from test import support +>>> class Leaker: +... def __del__(self): +... def invoke(message): +... raise RuntimeError(message) +... invoke("del failed") ... +>>> with support.catch_unraisable_exception() as cm: ... l = Leaker() ... del l -... err = sys.stderr.getvalue().strip() -... "Exception ignored in" in err -... "RuntimeError: test" in err -... "Traceback" in err -... "in invoke" in err -... finally: -... sys.stderr = old +... +... cm.unraisable.object == Leaker.__del__ +... cm.unraisable.exc_type == RuntimeError +... str(cm.unraisable.exc_value) == "del failed" +... cm.unraisable.exc_traceback is not None True True True diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 2b358ca0466e..67a952d9b454 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -909,6 +909,47 @@ def test_original_unraisablehook(self): self.assertIn('Traceback (most recent call last):\n', err) self.assertIn('ValueError: 42\n', err) + def test_original_unraisablehook_err(self): + # bpo-22836: PyErr_WriteUnraisable() should give sensible reports + class BrokenDel: + def __del__(self): + exc = ValueError("del is broken") + # The following line is included in the traceback report: + raise exc + + class BrokenStrException(Exception): + def __str__(self): + raise Exception("str() is broken") + + class BrokenExceptionDel: + def __del__(self): + exc = BrokenStrException() + # The following line is included in the traceback report: + raise exc + + for test_class in (BrokenDel, BrokenExceptionDel): + with self.subTest(test_class): + obj = test_class() + with test.support.captured_stderr() as stderr, \ + test.support.swap_attr(sys, 'unraisablehook', + sys.__unraisablehook__): + # Trigger obj.__del__() + del obj + + report = stderr.getvalue() + self.assertIn("Exception ignored", report) + self.assertIn(test_class.__del__.__qualname__, report) + self.assertIn("test_sys.py", report) + self.assertIn("raise exc", report) + if test_class is BrokenExceptionDel: + self.assertIn("BrokenStrException", report) + self.assertIn("", report) + else: + self.assertIn("ValueError", report) + self.assertIn("del is broken", report) + self.assertTrue(report.endswith("\n")) + + def test_original_unraisablehook_wrong_type(self): exc = ValueError(42) with test.support.swap_attr(sys, 'unraisablehook', diff --git a/Misc/NEWS.d/next/Tests/2019-05-22-12-57-15.bpo-36829.e9mRWC.rst b/Misc/NEWS.d/next/Tests/2019-05-22-12-57-15.bpo-36829.e9mRWC.rst new file mode 100644 index 000000000000..4ab342b8a2b3 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-22-12-57-15.bpo-36829.e9mRWC.rst @@ -0,0 +1,2 @@ +Add :func:`test.support.catch_unraisable_exception`: context manager +catching unraisable exception using :func:`sys.unraisablehook`. From webhook-mailer at python.org Wed May 22 17:59:03 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 21:59:03 -0000 Subject: [Python-checkins] bpo-36763: Add _PyPreConfig._config_init (GH-13481) Message-ID: https://github.com/python/cpython/commit/022be02dcfdfd9011415804bb4553a33fa7ec8f3 commit: 022be02dcfdfd9011415804bb4553a33fa7ec8f3 branch: master author: Victor Stinner committer: GitHub date: 2019-05-22T23:58:50+02:00 summary: bpo-36763: Add _PyPreConfig._config_init (GH-13481) * _PyPreConfig_GetGlobalConfig() and _PyCoreConfig_GetGlobalConfig() now do nothing if the configuration was not initialized with _PyPreConfig_InitCompatConfig() and _PyCoreConfig_InitCompatConfig() * Remove utf8_mode=-2 special case: use utf8_mode=-1 instead. * Fix _PyPreConfig_InitPythonConfig(): * isolated = 0 instead of -1 * use_environment = 1 instead of -1 * Rename _PyConfig_INIT to _PyConfig_INIT_COMPAT * Rename _PyPreConfig_Init() to _PyPreConfig_InitCompatConfig() * Rename _PyCoreConfig_Init() to _PyCoreConfig_InitCompatConfig() * PyInterpreterState_New() now uses _PyCoreConfig_InitPythonConfig() as default configuration, but it's very quickly overriden anyway. * _freeze_importlib.c uses _PyCoreConfig_SetString() to set program_name. * Cleanup preconfig_init_utf8_mode(): cmdline is always non-NULL. files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Lib/test/test_embed.py M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/coreconfig.c M Python/frozenmain.c M Python/pathconfig.c M Python/preconfig.c M Python/pylifecycle.c M Python/pystate.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index decfb70e7345..ef5fde20e88d 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -40,9 +40,18 @@ typedef struct { #define _Py_CONFIG_VERSION 1 +typedef enum { + /* Py_Initialize() API: backward compatibility with Python 3.6 and 3.7 */ + _PyConfig_INIT_COMPAT = 1, + _PyConfig_INIT_PYTHON = 2, + _PyConfig_INIT_ISOLATED = 3 +} _PyConfigInitEnum; + + typedef struct { int _config_version; /* Internal configuration version, used for ABI compatibility */ + int _config_init; /* _PyConfigInitEnum value */ /* Parse _Py_PreInitializeFromArgs() arguments? See _PyCoreConfig.parse_argv */ @@ -107,10 +116,7 @@ typedef struct { Set to 0 by "-X utf8=0" and PYTHONUTF8=0. If equals to -1, it is set to 1 if the LC_CTYPE locale is "C" or - "POSIX", otherwise it is set to 0. - - If equals to -2, inherit Py_UTF8Mode value value (which is equal to 0 - by default). */ + "POSIX", otherwise it is set to 0. Inherit Py_UTF8Mode value value. */ int utf8_mode; int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ @@ -126,16 +132,10 @@ PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ -typedef enum { - _PyCoreConfig_INIT = 0, - _PyCoreConfig_INIT_PYTHON = 1, - _PyCoreConfig_INIT_ISOLATED = 2 -} _PyCoreConfigInitEnum; - typedef struct { int _config_version; /* Internal configuration version, used for ABI compatibility */ - int _config_init; /* _PyCoreConfigInitEnum value */ + int _config_init; /* _PyConfigInitEnum value */ int isolated; /* Isolated mode? see _PyPreConfig.isolated */ int use_environment; /* Use environment variables? see _PyPreConfig.use_environment */ diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 324e0b82b90c..b17737a90ba3 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -120,7 +120,7 @@ PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, /* --- _PyPreConfig ----------------------------------------------- */ -PyAPI_FUNC(void) _PyPreConfig_Init(_PyPreConfig *config); +PyAPI_FUNC(void) _PyPreConfig_InitCompatConfig(_PyPreConfig *config); PyAPI_FUNC(void) _PyPreConfig_InitFromCoreConfig( _PyPreConfig *config, const _PyCoreConfig *coreconfig); @@ -139,7 +139,7 @@ PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(const _PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ -PyAPI_FUNC(void) _PyCoreConfig_Init(_PyCoreConfig *config); +PyAPI_FUNC(void) _PyCoreConfig_InitCompatConfig(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_Copy( _PyCoreConfig *config, const _PyCoreConfig *config2); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 4fe005dfa130..8101e70f9bc9 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -13,13 +13,17 @@ MS_WINDOWS = (os.name == 'nt') + PYMEM_ALLOCATOR_NOT_SET = 0 PYMEM_ALLOCATOR_DEBUG = 2 PYMEM_ALLOCATOR_MALLOC = 3 -CONFIG_INIT = 0 -CONFIG_INIT_PYTHON = 1 -CONFIG_INIT_ISOLATED = 2 +# _PyCoreConfig_InitCompatConfig() +API_COMPAT = 1 +# _PyCoreConfig_InitPythonConfig() +API_PYTHON = 2 +# _PyCoreConfig_InitIsolatedConfig() +API_ISOLATED = 3 class EmbeddingTestsMixin: @@ -282,7 +286,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): # Marker to ignore a configuration parameter IGNORE_CONFIG = object() - DEFAULT_PRE_CONFIG = { + PRE_CONFIG_COMPAT = { 'allocator': PYMEM_ALLOCATOR_NOT_SET, 'parse_argv': 0, 'configure_locale': 1, @@ -291,15 +295,15 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'utf8_mode': 0, } if MS_WINDOWS: - DEFAULT_PRE_CONFIG.update({ + PRE_CONFIG_COMPAT.update({ 'legacy_windows_fs_encoding': 0, }) - PYTHON_PRE_CONFIG = dict(DEFAULT_PRE_CONFIG, + PRE_CONFIG_PYTHON = dict(PRE_CONFIG_COMPAT, parse_argv=1, coerce_c_locale=GET_DEFAULT_CONFIG, utf8_mode=GET_DEFAULT_CONFIG, ) - ISOLATED_PRE_CONFIG = dict(DEFAULT_PRE_CONFIG, + PRE_CONFIG_ISOLATED = dict(PRE_CONFIG_COMPAT, configure_locale=0, isolated=1, use_environment=0, @@ -314,8 +318,8 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'use_environment', ] - DEFAULT_CORE_CONFIG = { - '_config_init': CONFIG_INIT, + CORE_CONFIG_COMPAT = { + '_config_init': API_COMPAT, 'isolated': 0, 'use_environment': 1, 'dev_mode': 0, @@ -379,15 +383,15 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_init_main': 1, } if MS_WINDOWS: - DEFAULT_CORE_CONFIG.update({ + CORE_CONFIG_COMPAT.update({ 'legacy_windows_stdio': 0, }) - PYTHON_CORE_CONFIG = dict(DEFAULT_CORE_CONFIG, + CORE_CONFIG_PYTHON = dict(CORE_CONFIG_COMPAT, configure_c_stdio=1, parse_argv=1, ) - ISOLATED_CORE_CONFIG = dict(DEFAULT_CORE_CONFIG, + CORE_CONFIG_ISOLATED = dict(CORE_CONFIG_COMPAT, isolated=1, use_environment=0, user_site_directory=0, @@ -399,7 +403,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): pathconfig_warnings=0, ) if MS_WINDOWS: - ISOLATED_CORE_CONFIG['legacy_windows_stdio'] = 0 + CORE_CONFIG_ISOLATED['legacy_windows_stdio'] = 0 # global config DEFAULT_GLOBAL_CONFIG = { @@ -492,7 +496,7 @@ def get_expected_config(self, expected_preconfig, expected, env, api, if value is self.GET_DEFAULT_CONFIG: expected_preconfig[key] = pre_config[key] - if not expected_preconfig['configure_locale'] or api == CONFIG_INIT: + if not expected_preconfig['configure_locale'] or api == API_COMPAT: # there is no easy way to get the locale encoding before # setlocale(LC_CTYPE, "") is called: don't test encodings for key in ('filesystem_encoding', 'filesystem_errors', @@ -579,32 +583,33 @@ def check_global_config(self, config): self.assertEqual(config['global_config'], expected) - def check_config(self, testname, expected_config=None, expected_preconfig=None, - add_path=None, stderr=None, api=CONFIG_INIT): + def check_config(self, testname, expected_config=None, + expected_preconfig=None, add_path=None, stderr=None, + *, api): env = dict(os.environ) # Remove PYTHON* environment variables to get deterministic environment for key in list(env): if key.startswith('PYTHON'): del env[key] - if api == CONFIG_INIT_ISOLATED: - default_preconfig = self.ISOLATED_PRE_CONFIG - elif api == CONFIG_INIT_PYTHON: - default_preconfig = self.PYTHON_PRE_CONFIG + if api == API_ISOLATED: + default_preconfig = self.PRE_CONFIG_ISOLATED + elif api == API_PYTHON: + default_preconfig = self.PRE_CONFIG_PYTHON else: - default_preconfig = self.DEFAULT_PRE_CONFIG + default_preconfig = self.PRE_CONFIG_COMPAT if expected_preconfig is None: expected_preconfig = {} expected_preconfig = dict(default_preconfig, **expected_preconfig) if expected_config is None: expected_config = {} - if api == CONFIG_INIT_PYTHON: - default_config = self.PYTHON_CORE_CONFIG - elif api == CONFIG_INIT_ISOLATED: - default_config = self.ISOLATED_CORE_CONFIG + if api == API_PYTHON: + default_config = self.CORE_CONFIG_PYTHON + elif api == API_ISOLATED: + default_config = self.CORE_CONFIG_ISOLATED else: - default_config = self.DEFAULT_CORE_CONFIG + default_config = self.CORE_CONFIG_COMPAT expected_config = dict(default_config, **expected_config) expected_config['_config_init'] = api @@ -627,7 +632,13 @@ def check_config(self, testname, expected_config=None, expected_preconfig=None, self.check_global_config(config) def test_init_default_config(self): - self.check_config("init_default_config", {}, {}) + self.check_config("init_initialize_config", api=API_COMPAT) + + def test_preinit_compat_config(self): + self.check_config("preinit_compat_config", api=API_COMPAT) + + def test_init_compat_config(self): + self.check_config("init_compat_config", api=API_COMPAT) def test_init_global_config(self): preconfig = { @@ -649,7 +660,8 @@ def test_init_global_config(self): 'user_site_directory': 0, 'pathconfig_warnings': 0, } - self.check_config("init_global_config", config, preconfig) + self.check_config("init_global_config", config, preconfig, + api=API_COMPAT) def test_init_from_config(self): preconfig = { @@ -693,11 +705,13 @@ def test_init_from_config(self): 'check_hash_pycs_mode': 'always', 'pathconfig_warnings': 0, } - self.check_config("init_from_config", config, preconfig) + self.check_config("init_from_config", config, preconfig, + api=API_COMPAT) def test_init_env(self): preconfig = { 'allocator': PYMEM_ALLOCATOR_MALLOC, + 'utf8_mode': 1, } config = { 'use_hash_seed': 1, @@ -718,21 +732,24 @@ def test_init_env(self): 'faulthandler': 1, 'warnoptions': ['EnvVar'], } - self.check_config("init_env", config, preconfig) + self.check_config("init_env", config, preconfig, + api=API_COMPAT) def test_init_env_dev_mode(self): preconfig = dict(allocator=PYMEM_ALLOCATOR_DEBUG) config = dict(dev_mode=1, faulthandler=1, warnoptions=['default']) - self.check_config("init_env_dev_mode", config, preconfig) + self.check_config("init_env_dev_mode", config, preconfig, + api=API_COMPAT) def test_init_env_dev_mode_alloc(self): preconfig = dict(allocator=PYMEM_ALLOCATOR_MALLOC) config = dict(dev_mode=1, faulthandler=1, warnoptions=['default']) - self.check_config("init_env_dev_mode_alloc", config, preconfig) + self.check_config("init_env_dev_mode_alloc", config, preconfig, + api=API_COMPAT) def test_init_dev_mode(self): preconfig = { @@ -744,7 +761,7 @@ def test_init_dev_mode(self): 'warnoptions': ['default'], } self.check_config("init_dev_mode", config, preconfig, - api=CONFIG_INIT_PYTHON) + api=API_PYTHON) def test_preinit_parse_argv(self): # Pre-initialize implicitly using argv: make sure that -X dev @@ -761,7 +778,7 @@ def test_preinit_parse_argv(self): 'xoptions': ['dev'], } self.check_config("preinit_parse_argv", config, preconfig, - api=CONFIG_INIT_PYTHON) + api=API_PYTHON) def test_preinit_dont_parse_argv(self): # -X dev must be ignored by isolated preconfiguration @@ -774,7 +791,7 @@ def test_preinit_dont_parse_argv(self): 'isolated': 0, } self.check_config("preinit_dont_parse_argv", config, preconfig, - api=CONFIG_INIT_ISOLATED) + api=API_ISOLATED) def test_init_isolated_flag(self): config = { @@ -782,7 +799,7 @@ def test_init_isolated_flag(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("init_isolated_flag", config, api=CONFIG_INIT_PYTHON) + self.check_config("init_isolated_flag", config, api=API_PYTHON) def test_preinit_isolated1(self): # _PyPreConfig.isolated=1, _PyCoreConfig.isolated not set @@ -791,7 +808,7 @@ def test_preinit_isolated1(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("preinit_isolated1", config) + self.check_config("preinit_isolated1", config, api=API_COMPAT) def test_preinit_isolated2(self): # _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 @@ -800,16 +817,16 @@ def test_preinit_isolated2(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("preinit_isolated2", config) + self.check_config("preinit_isolated2", config, api=API_COMPAT) def test_preinit_isolated_config(self): - self.check_config("preinit_isolated_config", api=CONFIG_INIT_ISOLATED) + self.check_config("preinit_isolated_config", api=API_ISOLATED) def test_init_isolated_config(self): - self.check_config("init_isolated_config", api=CONFIG_INIT_ISOLATED) + self.check_config("init_isolated_config", api=API_ISOLATED) def test_init_python_config(self): - self.check_config("init_python_config", api=CONFIG_INIT_PYTHON) + self.check_config("init_python_config", api=API_PYTHON) def test_init_dont_configure_locale(self): # _PyPreConfig.configure_locale=0 @@ -818,7 +835,7 @@ def test_init_dont_configure_locale(self): 'coerce_c_locale': 0, } self.check_config("init_dont_configure_locale", {}, preconfig, - api=CONFIG_INIT_PYTHON) + api=API_PYTHON) def test_init_read_set(self): core_config = { @@ -826,7 +843,7 @@ def test_init_read_set(self): 'executable': 'my_executable', } self.check_config("init_read_set", core_config, - api=CONFIG_INIT_PYTHON, + api=API_PYTHON, add_path="init_read_set_path") def test_init_run_main(self): @@ -838,8 +855,7 @@ def test_init_run_main(self): 'run_command': code + '\n', 'parse_argv': 1, } - self.check_config("init_run_main", core_config, - api=CONFIG_INIT_PYTHON) + self.check_config("init_run_main", core_config, api=API_PYTHON) def test_init_main(self): code = ('import _testinternalcapi, json; ' @@ -852,7 +868,7 @@ def test_init_main(self): '_init_main': 0, } self.check_config("init_main", core_config, - api=CONFIG_INIT_PYTHON, + api=API_PYTHON, stderr="Run Python code before _Py_InitializeMain") def test_init_parse_argv(self): @@ -863,8 +879,7 @@ def test_init_parse_argv(self): 'run_command': 'pass\n', 'use_environment': 0, } - self.check_config("init_parse_argv", core_config, - api=CONFIG_INIT_PYTHON) + self.check_config("init_parse_argv", core_config, api=API_PYTHON) def test_init_dont_parse_argv(self): pre_config = { @@ -876,7 +891,7 @@ def test_init_dont_parse_argv(self): 'program_name': './argv0', } self.check_config("init_dont_parse_argv", core_config, pre_config, - api=CONFIG_INIT_PYTHON) + api=API_PYTHON) if __name__ == "__main__": diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 1a719e2f9673..8cf44d33bc02 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -76,18 +76,30 @@ main(int argc, char *argv[]) } text[text_size] = '\0'; + _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_InitIsolatedConfig(&config); + + err = _PyCoreConfig_InitIsolatedConfig(&config); + if (_PyInitError_Failed(err)) { + _PyCoreConfig_Clear(&config); + _Py_ExitInitError(err); + } config.site_import = 0; - config.program_name = L"./_freeze_importlib"; + + err = _PyCoreConfig_SetString(&config, &config.program_name, + L"./_freeze_importlib"); + if (_PyInitError_Failed(err)) { + _PyCoreConfig_Clear(&config); + _Py_ExitInitError(err); + } + /* Don't install importlib, since it could execute outdated bytecode. */ config._install_importlib = 0; config._init_main = 0; - _PyInitError err = _Py_InitializeFromConfig(&config); - /* No need to call _PyCoreConfig_Clear() since we didn't allocate any - memory: program_name is a constant string. */ + err = _Py_InitializeFromConfig(&config); + _PyCoreConfig_Clear(&config); if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index bc549369393f..a273930e10ae 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -317,7 +317,7 @@ dump_config(void) } -static int test_init_default_config(void) +static int test_init_initialize_config(void) { _testembed_Py_Initialize(); dump_config(); @@ -326,6 +326,47 @@ static int test_init_default_config(void) } +static int check_init_compat_config(int preinit) +{ + _PyInitError err; + + if (preinit) { + _PyPreConfig preconfig; + _PyPreConfig_InitCompatConfig(&preconfig); + + err = _Py_PreInitialize(&preconfig); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } + } + + _PyCoreConfig config; + _PyCoreConfig_InitCompatConfig(&config); + config.program_name = L"./_testembed"; + + err = _Py_InitializeFromConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } + + dump_config(); + Py_Finalize(); + return 0; +} + + +static int test_preinit_compat_config(void) +{ + return check_init_compat_config(1); +} + + +static int test_init_compat_config(void) +{ + return check_init_compat_config(0); +} + + static int test_init_global_config(void) { /* FIXME: test Py_IgnoreEnvironmentFlag */ @@ -380,7 +421,7 @@ static int test_init_from_config(void) _PyInitError err; _PyPreConfig preconfig; - _PyPreConfig_Init(&preconfig); + _PyPreConfig_InitCompatConfig(&preconfig); putenv("PYTHONMALLOC=malloc_debug"); preconfig.allocator = PYMEM_ALLOCATOR_MALLOC; @@ -396,7 +437,7 @@ static int test_init_from_config(void) /* Test _Py_InitializeFromConfig() */ _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitCompatConfig(&config); config.install_signal_handlers = 0; /* FIXME: test use_environment */ @@ -676,7 +717,7 @@ static int test_preinit_isolated1(void) _PyInitError err; _PyPreConfig preconfig; - _PyPreConfig_Init(&preconfig); + _PyPreConfig_InitCompatConfig(&preconfig); preconfig.isolated = 1; err = _Py_PreInitialize(&preconfig); @@ -685,7 +726,7 @@ static int test_preinit_isolated1(void) } _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitCompatConfig(&config); config.program_name = L"./_testembed"; set_all_env_vars(); @@ -705,7 +746,7 @@ static int test_preinit_isolated2(void) _PyInitError err; _PyPreConfig preconfig; - _PyPreConfig_Init(&preconfig); + _PyPreConfig_InitCompatConfig(&preconfig); preconfig.isolated = 0; err = _Py_PreInitialize(&preconfig); @@ -715,7 +756,7 @@ static int test_preinit_isolated2(void) /* Test _PyCoreConfig.isolated=1 */ _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitCompatConfig(&config); Py_IsolatedFlag = 0; config.isolated = 1; @@ -885,12 +926,14 @@ static int check_preinit_isolated_config(int preinit) _PyCoreConfig config; err = _PyCoreConfig_InitIsolatedConfig(&config); if (_PyInitError_Failed(err)) { + _PyCoreConfig_Clear(&config); _Py_ExitInitError(err); } config.program_name = L"./_testembed"; err = _Py_InitializeFromConfig(&config); if (_PyInitError_Failed(err)) { + _PyCoreConfig_Clear(&config); _Py_ExitInitError(err); } @@ -1207,7 +1250,9 @@ static struct TestCase TestCases[] = { { "bpo20891", test_bpo20891 }, { "initialize_twice", test_initialize_twice }, { "initialize_pymain", test_initialize_pymain }, - { "init_default_config", test_init_default_config }, + { "init_initialize_config", test_init_initialize_config }, + { "preinit_compat_config", test_preinit_compat_config }, + { "init_compat_config", test_init_compat_config }, { "init_global_config", test_init_global_config }, { "init_from_config", test_init_from_config }, { "init_parse_argv", test_init_parse_argv }, diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 958845e488d7..40dba4ee5e5e 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -109,7 +109,7 @@ static const char usage_6[] = /* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change stdin and stdout error handler to "surrogateescape". It is equal to -1 by default: unknown, will be set by Py_Main() */ -int Py_UTF8Mode = 0; +int Py_UTF8Mode = -1; int Py_DebugFlag = 0; /* Needed by parser.c */ int Py_VerboseFlag = 0; /* Needed by import.c */ int Py_QuietFlag = 0; /* Needed by sysmodule.c */ @@ -546,12 +546,12 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) void -_PyCoreConfig_Init(_PyCoreConfig *config) +_PyCoreConfig_InitCompatConfig(_PyCoreConfig *config) { memset(config, 0, sizeof(*config)); config->_config_version = _Py_CONFIG_VERSION; - config->_config_init = (int)_PyCoreConfig_INIT; + config->_config_init = (int)_PyConfig_INIT_COMPAT; config->isolated = -1; config->use_environment = -1; config->dev_mode = -1; @@ -586,7 +586,7 @@ _PyCoreConfig_Init(_PyCoreConfig *config) static void _PyCoreConfig_InitDefaults(_PyCoreConfig *config) { - _PyCoreConfig_Init(config); + _PyCoreConfig_InitCompatConfig(config); config->isolated = 0; config->use_environment = 1; @@ -613,7 +613,7 @@ _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config) { _PyCoreConfig_InitDefaults(config); - config->_config_init = (int)_PyCoreConfig_INIT_PYTHON; + config->_config_init = (int)_PyConfig_INIT_PYTHON; config->configure_c_stdio = 1; config->parse_argv = 1; @@ -626,7 +626,7 @@ _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config) { _PyCoreConfig_InitDefaults(config); - config->_config_init = (int)_PyCoreConfig_INIT_ISOLATED; + config->_config_init = (int)_PyConfig_INIT_ISOLATED; config->isolated = 1; config->use_environment = 0; config->user_site_directory = 0; @@ -962,6 +962,11 @@ _PyCoreConfig_GetEnvDup(_PyCoreConfig *config, static void _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) { + if (config->_config_init != _PyConfig_INIT_COMPAT) { + /* Python and Isolated configuration ignore global variables */ + return; + } + #define COPY_FLAG(ATTR, VALUE) \ if (config->ATTR == -1) { \ config->ATTR = VALUE; \ diff --git a/Python/frozenmain.c b/Python/frozenmain.c index a51fb5800127..c3af080401e9 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -40,7 +40,11 @@ Py_FrozenMain(int argc, char **argv) } _PyCoreConfig config; - _PyCoreConfig_InitPythonConfig(&config); + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + _PyCoreConfig_Clear(&config); + _Py_ExitInitError(err); + } config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */ if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') @@ -82,8 +86,7 @@ Py_FrozenMain(int argc, char **argv) Py_SetProgramName(argv_copy[0]); err = _Py_InitializeFromConfig(&config); - /* No need to call _PyCoreConfig_Clear() since we didn't allocate any - memory: program_name is a constant string. */ + _PyCoreConfig_Clear(&config); if (_PyInitError_Failed(err)) { _Py_ExitInitError(err); } diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 3d9d3b1b205f..bbf29b2fa598 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -383,7 +383,7 @@ pathconfig_global_init(void) _PyInitError err; _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitCompatConfig(&config); err = _PyCoreConfig_Read(&config); if (_Py_INIT_FAILED(err)) { diff --git a/Python/preconfig.c b/Python/preconfig.c index 4df6208cadb8..392324ff201a 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -262,16 +262,17 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline, const _PyPreConfig *preconfig) void -_PyPreConfig_Init(_PyPreConfig *config) +_PyPreConfig_InitCompatConfig(_PyPreConfig *config) { memset(config, 0, sizeof(*config)); config->_config_version = _Py_CONFIG_VERSION; + config->_config_init = (int)_PyConfig_INIT_COMPAT; config->parse_argv = 0; config->isolated = -1; config->use_environment = -1; config->configure_locale = 1; - config->utf8_mode = -2; + config->utf8_mode = -1; config->dev_mode = -1; config->allocator = PYMEM_ALLOCATOR_NOT_SET; #ifdef MS_WINDOWS @@ -283,23 +284,30 @@ _PyPreConfig_Init(_PyPreConfig *config) void _PyPreConfig_InitPythonConfig(_PyPreConfig *config) { - _PyPreConfig_Init(config); + _PyPreConfig_InitCompatConfig(config); + config->_config_init = (int)_PyConfig_INIT_PYTHON; + config->isolated = 0; config->parse_argv = 1; + config->use_environment = 1; /* Set to -1 to enable C locale coercion (PEP 538) and UTF-8 Mode (PEP 540) depending on the LC_CTYPE locale, PYTHONUTF8 and PYTHONCOERCECLOCALE environment variables. */ config->coerce_c_locale = -1; config->coerce_c_locale_warn = -1; config->utf8_mode = -1; +#ifdef MS_WINDOWS + config->legacy_windows_fs_encoding = 0; +#endif } void _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config) { - _PyPreConfig_Init(config); + _PyPreConfig_InitCompatConfig(config); + config->_config_init = (int)_PyConfig_INIT_ISOLATED; config->configure_locale = 0; config->isolated = 1; config->use_environment = 0; @@ -315,7 +323,7 @@ void _PyPreConfig_InitFromPreConfig(_PyPreConfig *config, const _PyPreConfig *config2) { - _PyPreConfig_Init(config); + _PyPreConfig_InitCompatConfig(config); _PyPreConfig_Copy(config, config2); } @@ -324,17 +332,17 @@ void _PyPreConfig_InitFromCoreConfig(_PyPreConfig *config, const _PyCoreConfig *coreconfig) { - _PyCoreConfigInitEnum config_init = (_PyCoreConfigInitEnum)coreconfig->_config_init; + _PyConfigInitEnum config_init = (_PyConfigInitEnum)coreconfig->_config_init; switch (config_init) { - case _PyCoreConfig_INIT_PYTHON: + case _PyConfig_INIT_PYTHON: _PyPreConfig_InitPythonConfig(config); break; - case _PyCoreConfig_INIT_ISOLATED: + case _PyConfig_INIT_ISOLATED: _PyPreConfig_InitIsolatedConfig(config); break; - case _PyCoreConfig_INIT: + case _PyConfig_INIT_COMPAT: default: - _PyPreConfig_Init(config); + _PyPreConfig_InitCompatConfig(config); } _PyPreConfig_GetCoreConfig(config, coreconfig); } @@ -428,6 +436,11 @@ _PyPreConfig_GetCoreConfig(_PyPreConfig *config, static void _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) { + if (config->_config_init != _PyConfig_INIT_COMPAT) { + /* Python and Isolated configuration ignore global variables */ + return; + } + #define COPY_FLAG(ATTR, VALUE) \ if (config->ATTR < 0) { \ config->ATTR = VALUE; \ @@ -439,12 +452,10 @@ _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); + COPY_FLAG(utf8_mode, Py_UTF8Mode); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); #endif - if (config->utf8_mode == -2) { - config->utf8_mode = Py_UTF8Mode; - } #undef COPY_FLAG #undef COPY_NOT_FLAG @@ -565,12 +576,7 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) } const wchar_t *xopt; - if (cmdline) { - xopt = _Py_get_xoption(&cmdline->xoptions, L"utf8"); - } - else { - xopt = NULL; - } + xopt = _Py_get_xoption(&cmdline->xoptions, L"utf8"); if (xopt) { wchar_t *sep = wcschr(xopt, L'='); if (sep) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 6dc684bfcebb..21c386bb4a3e 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -867,7 +867,7 @@ _Py_InitializeCore(_PyRuntimeState *runtime, } _PyCoreConfig local_config; - _PyCoreConfig_Init(&local_config); + _PyCoreConfig_InitCompatConfig(&local_config); err = pyinit_coreconfig(runtime, &local_config, src_config, args, interp_p); _PyCoreConfig_Clear(&local_config); return err; @@ -1096,7 +1096,7 @@ Py_InitializeEx(int install_sigs) } _PyCoreConfig config; - _PyCoreConfig_Init(&config); + _PyCoreConfig_InitCompatConfig(&config); config.install_signal_handlers = install_sigs; err = _Py_InitializeFromConfig(&config); diff --git a/Python/pystate.c b/Python/pystate.c index 2f80aa253b5a..879a5a91f8a3 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -49,7 +49,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) _PyGC_Initialize(&runtime->gc); _PyEval_Initialize(&runtime->ceval); - _PyPreConfig_Init(&runtime->preconfig); + _PyPreConfig_InitPythonConfig(&runtime->preconfig); runtime->gilstate.check_enabled = 1; @@ -189,7 +189,13 @@ PyInterpreterState_New(void) memset(interp, 0, sizeof(*interp)); interp->id_refcount = -1; interp->check_interval = 100; - _PyCoreConfig_Init(&interp->core_config); + + _PyInitError err = _PyCoreConfig_InitPythonConfig(&interp->core_config); + if (_Py_INIT_FAILED(err)) { + PyMem_RawFree(interp); + return NULL; + } + interp->eval_frame = _PyEval_EvalFrameDefault; #ifdef HAVE_DLOPEN #if HAVE_DECL_RTLD_NOW From webhook-mailer at python.org Wed May 22 18:02:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 22 May 2019 22:02:28 -0000 Subject: [Python-checkins] bpo-33110: Catch errors raised when running add_done_callback on already completed futures (GH-13141) Message-ID: https://github.com/python/cpython/commit/b73c21c0be7b42de6a88d67408249c8ec46e28f7 commit: b73c21c0be7b42de6a88d67408249c8ec46e28f7 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-22T15:02:24-07:00 summary: bpo-33110: Catch errors raised when running add_done_callback on already completed futures (GH-13141) Wrap the callback call within the `add_done_callback` function within concurrent.futures, in order to behave in an identical manner to callbacks added to a running future are triggered once it has completed. (cherry picked from commit 2a3a2ece502c05ea33c95dd0db497189e0354bfd) Co-authored-by: Sam Martin files: A Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst M Lib/concurrent/futures/_base.py M Lib/test/test_concurrent_futures.py diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index 0b847307a328..46d30a50065e 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -400,7 +400,10 @@ def add_done_callback(self, fn): if self._state not in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED]: self._done_callbacks.append(fn) return - fn(self) + try: + fn(self) + except Exception: + LOGGER.exception('exception calling callback for %r', self) def result(self, timeout=None): """Return the result of the call that the future represents. diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 59aa0f46f59f..add2bfdd5abe 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -1079,6 +1079,22 @@ def fn(callback_future): f.add_done_callback(fn) self.assertTrue(was_cancelled) + def test_done_callback_raises_already_succeeded(self): + with test.support.captured_stderr() as stderr: + def raising_fn(callback_future): + raise Exception('doh!') + + f = Future() + + # Set the result first to simulate a future that runs instantly, + # effectively allowing the callback to be run immediately. + f.set_result(5) + f.add_done_callback(raising_fn) + + self.assertIn('exception calling callback for', stderr.getvalue()) + self.assertIn('doh!', stderr.getvalue()) + + def test_repr(self): self.assertRegex(repr(PENDING_FUTURE), '') diff --git a/Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst b/Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst new file mode 100644 index 000000000000..f1e2460c4927 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst @@ -0,0 +1 @@ +Handle exceptions raised by functions added by concurrent.futures add_done_callback correctly when the Future has already completed. From webhook-mailer at python.org Wed May 22 18:16:24 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 22 May 2019 22:16:24 -0000 Subject: [Python-checkins] bpo-36941: Project file fixups for Windows ARM64 (GH-13477) Message-ID: https://github.com/python/cpython/commit/cfb241bd29a94fd825a317a78322e3cdba0e75a7 commit: cfb241bd29a94fd825a317a78322e3cdba0e75a7 branch: master author: Paul Monson committer: Steve Dower date: 2019-05-22T15:16:21-07:00 summary: bpo-36941: Project file fixups for Windows ARM64 (GH-13477) files: M PCbuild/pcbuild.sln M PCbuild/python.vcxproj diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln index dea6799a5e55..6dc0139bc42a 100644 --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -478,6 +478,7 @@ Global {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|ARM.ActiveCfg = Debug|ARM {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|ARM.Build.0 = Debug|ARM {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|ARM64.Build.0 = Debug|ARM64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.ActiveCfg = Debug|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.Build.0 = Debug|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|x64.ActiveCfg = Debug|x64 @@ -501,6 +502,7 @@ Global {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|ARM.ActiveCfg = Release|ARM {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|ARM.Build.0 = Release|ARM {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|ARM64.ActiveCfg = Release|ARM64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|ARM64.Build.0 = Release|ARM64 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.ActiveCfg = Release|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.Build.0 = Release|Win32 {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|x64.ActiveCfg = Release|x64 @@ -539,28 +541,32 @@ Global {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|x64.Build.0 = Release|x64 {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|ARM.ActiveCfg = Debug|ARM {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|ARM.Build.0 = Debug|ARM - {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|ARM64.ActiveCfg = Debug|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|ARM64.Build.0 = Debug|ARM64 {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|Win32.ActiveCfg = Debug|Win32 {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|Win32.Build.0 = Debug|Win32 {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|x64.ActiveCfg = Debug|x64 {900342D7-516A-4469-B1AD-59A66E49A25F}.Debug|x64.Build.0 = Debug|x64 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|ARM.Build.0 = PGInstrument|ARM - {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|ARM64.ActiveCfg = PGInstrument|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGInstrument|x64.Build.0 = PGInstrument|x64 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|ARM.Build.0 = PGUpdate|ARM - {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|ARM64.ActiveCfg = PGUpdate|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {900342D7-516A-4469-B1AD-59A66E49A25F}.PGUpdate|x64.Build.0 = PGUpdate|x64 {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|ARM.ActiveCfg = Release|ARM {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|ARM.Build.0 = Release|ARM - {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|ARM64.ActiveCfg = Release|Win32 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|ARM64.ActiveCfg = Release|ARM64 + {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|ARM64.Build.0 = Release|ARM64 {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|Win32.ActiveCfg = Release|Win32 {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|Win32.Build.0 = Release|Win32 {900342D7-516A-4469-B1AD-59A66E49A25F}.Release|x64.ActiveCfg = Release|x64 @@ -934,13 +940,17 @@ Global {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|Win32.ActiveCfg = Release|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|x64.ActiveCfg = Release|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|ARM.Build.0 = PGInstrument|ARM {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.Build.0 = PGInstrument|x64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|ARM.Build.0 = PGUpdate|ARM {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.ActiveCfg = Release|x64 @@ -1182,7 +1192,9 @@ Global {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|x64.Build.0 = PGUpdate|x64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|ARM.ActiveCfg = Release|ARM + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|ARM.Build.0 = Release|ARM {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|ARM64.ActiveCfg = Release|ARM64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|ARM64.Build.0 = Release|ARM64 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|Win32.ActiveCfg = Release|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|Win32.Build.0 = Release|Win32 {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|x64.ActiveCfg = Release|x64 @@ -1404,6 +1416,7 @@ Global {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|x64.ActiveCfg = Release|x64 {FDB84CBB-2FB6-47C8-A2D6-091E0833239D}.Release|x64.Build.0 = Release|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|ARM.ActiveCfg = Debug|Win32 + {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|ARM.Build.0 = Debug|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|ARM64.ActiveCfg = Debug|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|Win32.ActiveCfg = Debug|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Debug|Win32.Build.0 = Debug|Win32 diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj index 919b79d986d0..bd051461e9cd 100644 --- a/PCbuild/python.vcxproj +++ b/PCbuild/python.vcxproj @@ -55,7 +55,7 @@ Release - ARM + ARM64 Release From webhook-mailer at python.org Wed May 22 18:58:01 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 22:58:01 -0000 Subject: [Python-checkins] bpo-36763: Rename private Python initialization functions (GH-13511) Message-ID: https://github.com/python/cpython/commit/5edcf263581c70f6a6c2206db679e51e9418bb38 commit: 5edcf263581c70f6a6c2206db679e51e9418bb38 branch: master author: Victor Stinner committer: GitHub date: 2019-05-23T00:57:57+02:00 summary: bpo-36763: Rename private Python initialization functions (GH-13511) * Rename private C functions: * _Py_Initialize_ReconfigureCore => pyinit_core_reconfigure * _Py_InitializeCore_impl => pyinit_core_config * _Py_InitializeCore = > pyinit_core * _Py_InitializeMainInterpreter => pyinit_main * init_python => pyinit_python * Rename _testembed.c commands: add "test_" prefix. files: M Lib/test/test_embed.py M Programs/_testembed.c M Python/pylifecycle.c diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 8101e70f9bc9..bd0451a43b95 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -82,7 +82,7 @@ def run_embedded_interpreter(self, *args, env=None): return out, err def run_repeated_init_and_subinterpreters(self): - out, err = self.run_embedded_interpreter("repeated_init_and_subinterpreters") + out, err = self.run_embedded_interpreter("test_repeated_init_and_subinterpreters") self.assertEqual(err, "") # The output from _testembed looks like this: @@ -172,7 +172,7 @@ def test_subinterps_distinct_state(self): def test_forced_io_encoding(self): # Checks forced configuration of embedded interpreter IO streams env = dict(os.environ, PYTHONIOENCODING="utf-8:surrogateescape") - out, err = self.run_embedded_interpreter("forced_io_encoding", env=env) + out, err = self.run_embedded_interpreter("test_forced_io_encoding", env=env) if support.verbose > 1: print() print(out) @@ -218,7 +218,7 @@ def test_pre_initialization_api(self): is initialized (via Py_Initialize()). """ env = dict(os.environ, PYTHONPATH=os.pathsep.join(sys.path)) - out, err = self.run_embedded_interpreter("pre_initialization_api", env=env) + out, err = self.run_embedded_interpreter("test_pre_initialization_api", env=env) if MS_WINDOWS: expected_path = self.test_exe else: @@ -234,7 +234,7 @@ def test_pre_initialization_sys_options(self): """ env = dict(os.environ, PYTHONPATH=os.pathsep.join(sys.path)) out, err = self.run_embedded_interpreter( - "pre_initialization_sys_options", env=env) + "test_pre_initialization_sys_options", env=env) expected_output = ( "sys.warnoptions: ['once', 'module', 'default']\n" "sys._xoptions: {'not_an_option': '1', 'also_not_an_option': '2'}\n" @@ -249,7 +249,7 @@ def test_bpo20891(self): calling PyEval_InitThreads() must not crash. PyGILState_Ensure() must call PyEval_InitThreads() for us in this case. """ - out, err = self.run_embedded_interpreter("bpo20891") + out, err = self.run_embedded_interpreter("test_bpo20891") self.assertEqual(out, '') self.assertEqual(err, '') @@ -258,7 +258,7 @@ def test_initialize_twice(self): bpo-33932: Calling Py_Initialize() twice should do nothing (and not crash!). """ - out, err = self.run_embedded_interpreter("initialize_twice") + out, err = self.run_embedded_interpreter("test_initialize_twice") self.assertEqual(out, '') self.assertEqual(err, '') @@ -266,12 +266,12 @@ def test_initialize_pymain(self): """ bpo-34008: Calling Py_Main() after Py_Initialize() must not fail. """ - out, err = self.run_embedded_interpreter("initialize_pymain") + out, err = self.run_embedded_interpreter("test_initialize_pymain") self.assertEqual(out.rstrip(), "Py_Main() after Py_Initialize: sys.argv=['-c', 'arg2']") self.assertEqual(err, '') def test_run_main(self): - out, err = self.run_embedded_interpreter("run_main") + out, err = self.run_embedded_interpreter("test_run_main") self.assertEqual(out.rstrip(), "_Py_RunMain(): sys.argv=['-c', 'arg2']") self.assertEqual(err, '') @@ -632,13 +632,13 @@ def check_config(self, testname, expected_config=None, self.check_global_config(config) def test_init_default_config(self): - self.check_config("init_initialize_config", api=API_COMPAT) + self.check_config("test_init_initialize_config", api=API_COMPAT) def test_preinit_compat_config(self): - self.check_config("preinit_compat_config", api=API_COMPAT) + self.check_config("test_preinit_compat_config", api=API_COMPAT) def test_init_compat_config(self): - self.check_config("init_compat_config", api=API_COMPAT) + self.check_config("test_init_compat_config", api=API_COMPAT) def test_init_global_config(self): preconfig = { @@ -660,7 +660,7 @@ def test_init_global_config(self): 'user_site_directory': 0, 'pathconfig_warnings': 0, } - self.check_config("init_global_config", config, preconfig, + self.check_config("test_init_global_config", config, preconfig, api=API_COMPAT) def test_init_from_config(self): @@ -705,7 +705,7 @@ def test_init_from_config(self): 'check_hash_pycs_mode': 'always', 'pathconfig_warnings': 0, } - self.check_config("init_from_config", config, preconfig, + self.check_config("test_init_from_config", config, preconfig, api=API_COMPAT) def test_init_env(self): @@ -732,7 +732,7 @@ def test_init_env(self): 'faulthandler': 1, 'warnoptions': ['EnvVar'], } - self.check_config("init_env", config, preconfig, + self.check_config("test_init_env", config, preconfig, api=API_COMPAT) def test_init_env_dev_mode(self): @@ -740,7 +740,7 @@ def test_init_env_dev_mode(self): config = dict(dev_mode=1, faulthandler=1, warnoptions=['default']) - self.check_config("init_env_dev_mode", config, preconfig, + self.check_config("test_init_env_dev_mode", config, preconfig, api=API_COMPAT) def test_init_env_dev_mode_alloc(self): @@ -748,7 +748,7 @@ def test_init_env_dev_mode_alloc(self): config = dict(dev_mode=1, faulthandler=1, warnoptions=['default']) - self.check_config("init_env_dev_mode_alloc", config, preconfig, + self.check_config("test_init_env_dev_mode_alloc", config, preconfig, api=API_COMPAT) def test_init_dev_mode(self): @@ -760,7 +760,7 @@ def test_init_dev_mode(self): 'dev_mode': 1, 'warnoptions': ['default'], } - self.check_config("init_dev_mode", config, preconfig, + self.check_config("test_init_dev_mode", config, preconfig, api=API_PYTHON) def test_preinit_parse_argv(self): @@ -777,7 +777,7 @@ def test_preinit_parse_argv(self): 'warnoptions': ['default'], 'xoptions': ['dev'], } - self.check_config("preinit_parse_argv", config, preconfig, + self.check_config("test_preinit_parse_argv", config, preconfig, api=API_PYTHON) def test_preinit_dont_parse_argv(self): @@ -790,7 +790,7 @@ def test_preinit_dont_parse_argv(self): "-X", "dev", "-X", "utf8", "script.py"], 'isolated': 0, } - self.check_config("preinit_dont_parse_argv", config, preconfig, + self.check_config("test_preinit_dont_parse_argv", config, preconfig, api=API_ISOLATED) def test_init_isolated_flag(self): @@ -799,7 +799,7 @@ def test_init_isolated_flag(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("init_isolated_flag", config, api=API_PYTHON) + self.check_config("test_init_isolated_flag", config, api=API_PYTHON) def test_preinit_isolated1(self): # _PyPreConfig.isolated=1, _PyCoreConfig.isolated not set @@ -808,7 +808,7 @@ def test_preinit_isolated1(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("preinit_isolated1", config, api=API_COMPAT) + self.check_config("test_preinit_isolated1", config, api=API_COMPAT) def test_preinit_isolated2(self): # _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 @@ -817,16 +817,19 @@ def test_preinit_isolated2(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("preinit_isolated2", config, api=API_COMPAT) + self.check_config("test_preinit_isolated2", config, api=API_COMPAT) def test_preinit_isolated_config(self): - self.check_config("preinit_isolated_config", api=API_ISOLATED) + self.check_config("test_preinit_isolated_config", api=API_ISOLATED) def test_init_isolated_config(self): - self.check_config("init_isolated_config", api=API_ISOLATED) + self.check_config("test_init_isolated_config", api=API_ISOLATED) + + def test_preinit_python_config(self): + self.check_config("test_preinit_python_config", api=API_PYTHON) def test_init_python_config(self): - self.check_config("init_python_config", api=API_PYTHON) + self.check_config("test_init_python_config", api=API_PYTHON) def test_init_dont_configure_locale(self): # _PyPreConfig.configure_locale=0 @@ -834,7 +837,7 @@ def test_init_dont_configure_locale(self): 'configure_locale': 0, 'coerce_c_locale': 0, } - self.check_config("init_dont_configure_locale", {}, preconfig, + self.check_config("test_init_dont_configure_locale", {}, preconfig, api=API_PYTHON) def test_init_read_set(self): @@ -842,7 +845,7 @@ def test_init_read_set(self): 'program_name': './init_read_set', 'executable': 'my_executable', } - self.check_config("init_read_set", core_config, + self.check_config("test_init_read_set", core_config, api=API_PYTHON, add_path="init_read_set_path") @@ -855,7 +858,7 @@ def test_init_run_main(self): 'run_command': code + '\n', 'parse_argv': 1, } - self.check_config("init_run_main", core_config, api=API_PYTHON) + self.check_config("test_init_run_main", core_config, api=API_PYTHON) def test_init_main(self): code = ('import _testinternalcapi, json; ' @@ -867,7 +870,7 @@ def test_init_main(self): 'parse_argv': 1, '_init_main': 0, } - self.check_config("init_main", core_config, + self.check_config("test_init_main", core_config, api=API_PYTHON, stderr="Run Python code before _Py_InitializeMain") @@ -879,7 +882,7 @@ def test_init_parse_argv(self): 'run_command': 'pass\n', 'use_environment': 0, } - self.check_config("init_parse_argv", core_config, api=API_PYTHON) + self.check_config("test_init_parse_argv", core_config, api=API_PYTHON) def test_init_dont_parse_argv(self): pre_config = { @@ -890,7 +893,7 @@ def test_init_dont_parse_argv(self): 'argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], 'program_name': './argv0', } - self.check_config("init_dont_parse_argv", core_config, pre_config, + self.check_config("test_init_dont_parse_argv", core_config, pre_config, api=API_PYTHON) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index a273930e10ae..7f8ea07ee3e2 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1243,39 +1243,39 @@ struct TestCase }; static struct TestCase TestCases[] = { - { "forced_io_encoding", test_forced_io_encoding }, - { "repeated_init_and_subinterpreters", test_repeated_init_and_subinterpreters }, - { "pre_initialization_api", test_pre_initialization_api }, - { "pre_initialization_sys_options", test_pre_initialization_sys_options }, - { "bpo20891", test_bpo20891 }, - { "initialize_twice", test_initialize_twice }, - { "initialize_pymain", test_initialize_pymain }, - { "init_initialize_config", test_init_initialize_config }, - { "preinit_compat_config", test_preinit_compat_config }, - { "init_compat_config", test_init_compat_config }, - { "init_global_config", test_init_global_config }, - { "init_from_config", test_init_from_config }, - { "init_parse_argv", test_init_parse_argv }, - { "init_dont_parse_argv", test_init_dont_parse_argv }, - { "init_env", test_init_env }, - { "init_env_dev_mode", test_init_env_dev_mode }, - { "init_env_dev_mode_alloc", test_init_env_dev_mode_alloc }, - { "init_dont_configure_locale", test_init_dont_configure_locale }, - { "init_dev_mode", test_init_dev_mode }, - { "init_isolated_flag", test_init_isolated_flag }, - { "preinit_isolated_config", test_preinit_isolated_config }, - { "init_isolated_config", test_init_isolated_config }, - { "preinit_python_config", test_preinit_python_config }, - { "init_python_config", test_init_python_config }, - { "preinit_isolated1", test_preinit_isolated1 }, - { "preinit_isolated2", test_preinit_isolated2 }, - { "preinit_parse_argv", test_preinit_parse_argv }, - { "preinit_dont_parse_argv", test_preinit_dont_parse_argv }, - { "init_read_set", test_init_read_set }, - { "init_run_main", test_init_run_main }, - { "init_main", test_init_main }, - { "run_main", test_run_main }, - { NULL, NULL } + {"test_forced_io_encoding", test_forced_io_encoding}, + {"test_repeated_init_and_subinterpreters", test_repeated_init_and_subinterpreters}, + {"test_pre_initialization_api", test_pre_initialization_api}, + {"test_pre_initialization_sys_options", test_pre_initialization_sys_options}, + {"test_bpo20891", test_bpo20891}, + {"test_initialize_twice", test_initialize_twice}, + {"test_initialize_pymain", test_initialize_pymain}, + {"test_init_initialize_config", test_init_initialize_config}, + {"test_preinit_compat_config", test_preinit_compat_config}, + {"test_init_compat_config", test_init_compat_config}, + {"test_init_global_config", test_init_global_config}, + {"test_init_from_config", test_init_from_config}, + {"test_init_parse_argv", test_init_parse_argv}, + {"test_init_dont_parse_argv", test_init_dont_parse_argv}, + {"test_init_env", test_init_env}, + {"test_init_env_dev_mode", test_init_env_dev_mode}, + {"test_init_env_dev_mode_alloc", test_init_env_dev_mode_alloc}, + {"test_init_dont_configure_locale", test_init_dont_configure_locale}, + {"test_init_dev_mode", test_init_dev_mode}, + {"test_init_isolated_flag", test_init_isolated_flag}, + {"test_preinit_isolated_config", test_preinit_isolated_config}, + {"test_init_isolated_config", test_init_isolated_config}, + {"test_preinit_python_config", test_preinit_python_config}, + {"test_init_python_config", test_init_python_config}, + {"test_preinit_isolated1", test_preinit_isolated1}, + {"test_preinit_isolated2", test_preinit_isolated2}, + {"test_preinit_parse_argv", test_preinit_parse_argv}, + {"test_preinit_dont_parse_argv", test_preinit_dont_parse_argv}, + {"test_init_read_set", test_init_read_set}, + {"test_init_run_main", test_init_run_main}, + {"test_init_main", test_init_main}, + {"test_run_main", test_run_main}, + {NULL, NULL} }; int main(int argc, char *argv[]) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 21c386bb4a3e..1084def9ce03 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -447,9 +447,9 @@ _Py_SetLocaleFromEnv(int category) */ static _PyInitError -_Py_Initialize_ReconfigureCore(_PyRuntimeState *runtime, - PyInterpreterState **interp_p, - const _PyCoreConfig *core_config) +pyinit_core_reconfigure(_PyRuntimeState *runtime, + PyInterpreterState **interp_p, + const _PyCoreConfig *core_config) { _PyInitError err; PyThreadState *tstate = _PyThreadState_GET(); @@ -657,9 +657,9 @@ pycore_init_import_warnings(PyInterpreterState *interp, PyObject *sysmod) static _PyInitError -_Py_InitializeCore_impl(_PyRuntimeState *runtime, - PyInterpreterState **interp_p, - const _PyCoreConfig *core_config) +pyinit_core_config(_PyRuntimeState *runtime, + PyInterpreterState **interp_p, + const _PyCoreConfig *core_config) { PyInterpreterState *interp; @@ -801,41 +801,6 @@ _Py_PreInitializeFromCoreConfig(const _PyCoreConfig *coreconfig, } -static _PyInitError -pyinit_coreconfig(_PyRuntimeState *runtime, - _PyCoreConfig *config, - const _PyCoreConfig *src_config, - const _PyArgv *args, - PyInterpreterState **interp_p) -{ - assert(src_config != NULL); - - _PyInitError err = _PyCoreConfig_Copy(config, src_config); - if (_Py_INIT_FAILED(err)) { - return err; - } - - if (args) { - err = _PyCoreConfig_SetPyArgv(config, args); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - - err = _PyCoreConfig_Read(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - - if (!runtime->core_initialized) { - return _Py_InitializeCore_impl(runtime, interp_p, config); - } - else { - return _Py_Initialize_ReconfigureCore(runtime, interp_p, config); - } -} - - /* Begin interpreter initialization * * On return, the first thread and interpreter state have been created, @@ -854,10 +819,10 @@ pyinit_coreconfig(_PyRuntimeState *runtime, * safe to call without calling Py_Initialize first) */ static _PyInitError -_Py_InitializeCore(_PyRuntimeState *runtime, - const _PyCoreConfig *src_config, - const _PyArgv *args, - PyInterpreterState **interp_p) +pyinit_core(_PyRuntimeState *runtime, + const _PyCoreConfig *src_config, + const _PyArgv *args, + PyInterpreterState **interp_p) { _PyInitError err; @@ -866,10 +831,38 @@ _Py_InitializeCore(_PyRuntimeState *runtime, return err; } - _PyCoreConfig local_config; - _PyCoreConfig_InitCompatConfig(&local_config); - err = pyinit_coreconfig(runtime, &local_config, src_config, args, interp_p); - _PyCoreConfig_Clear(&local_config); + _PyCoreConfig config; + _PyCoreConfig_InitCompatConfig(&config); + + err = _PyCoreConfig_Copy(&config, src_config); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + if (args) { + err = _PyCoreConfig_SetPyArgv(&config, args); + if (_Py_INIT_FAILED(err)) { + goto done; + } + } + + err = _PyCoreConfig_Read(&config); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + if (!runtime->core_initialized) { + err = pyinit_core_config(runtime, interp_p, &config); + } + else { + err = pyinit_core_reconfigure(runtime, interp_p, &config); + } + if (_Py_INIT_FAILED(err)) { + goto done; + } + +done: + _PyCoreConfig_Clear(&config); return err; } @@ -907,8 +900,7 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) * non-zero return code. */ static _PyInitError -_Py_InitializeMainInterpreter(_PyRuntimeState *runtime, - PyInterpreterState *interp) +pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) { if (!runtime->core_initialized) { return _Py_INIT_ERR("runtime core not initialized"); @@ -1015,14 +1007,14 @@ _Py_InitializeMain(void) _PyRuntimeState *runtime = &_PyRuntime; PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - return _Py_InitializeMainInterpreter(runtime, interp); + return pyinit_main(runtime, interp); } #undef _INIT_DEBUG_PRINT static _PyInitError -init_python(const _PyCoreConfig *config, const _PyArgv *args) +pyinit_python(const _PyCoreConfig *config, const _PyArgv *args) { if (config == NULL) { return _Py_INIT_ERR("initialization config is NULL"); @@ -1037,14 +1029,14 @@ init_python(const _PyCoreConfig *config, const _PyArgv *args) _PyRuntimeState *runtime = &_PyRuntime; PyInterpreterState *interp = NULL; - err = _Py_InitializeCore(runtime, config, args, &interp); + err = pyinit_core(runtime, config, args, &interp); if (_Py_INIT_FAILED(err)) { return err; } config = &interp->core_config; if (config->_init_main) { - err = _Py_InitializeMainInterpreter(runtime, interp); + err = pyinit_main(runtime, interp); if (_Py_INIT_FAILED(err)) { return err; } @@ -1059,7 +1051,7 @@ _Py_InitializeFromArgs(const _PyCoreConfig *config, Py_ssize_t argc, char * const *argv) { _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv}; - return init_python(config, &args); + return pyinit_python(config, &args); } @@ -1068,14 +1060,14 @@ _Py_InitializeFromWideArgs(const _PyCoreConfig *config, Py_ssize_t argc, wchar_t * const *argv) { _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv}; - return init_python(config, &args); + return pyinit_python(config, &args); } _PyInitError _Py_InitializeFromConfig(const _PyCoreConfig *config) { - return init_python(config, NULL); + return pyinit_python(config, NULL); } From webhook-mailer at python.org Wed May 22 19:01:02 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 May 2019 23:01:02 -0000 Subject: [Python-checkins] bpo-36829: PyErr_WriteUnraisable() normalizes exception (GH-13507) Message-ID: https://github.com/python/cpython/commit/df22c03b93ea4620fdf4a0b3cbbbfa7c645af783 commit: df22c03b93ea4620fdf4a0b3cbbbfa7c645af783 branch: master author: Victor Stinner committer: GitHub date: 2019-05-23T01:00:58+02:00 summary: bpo-36829: PyErr_WriteUnraisable() normalizes exception (GH-13507) PyErr_WriteUnraisable() now creates a traceback object if there is no current traceback. Moreover, call PyErr_NormalizeException() and PyException_SetTraceback() to normalize the exception value. Ignore silently any error. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-22-23-01-29.bpo-36829.MfOcUg.rst M Include/internal/pycore_traceback.h M Lib/test/test_sys.py M Python/errors.c M Python/traceback.c diff --git a/Include/internal/pycore_traceback.h b/Include/internal/pycore_traceback.h index a96199bda5f9..bf4d7fe5851f 100644 --- a/Include/internal/pycore_traceback.h +++ b/Include/internal/pycore_traceback.h @@ -86,6 +86,10 @@ PyAPI_FUNC(void) _Py_DumpHexadecimal( unsigned long value, Py_ssize_t width); +PyAPI_FUNC(PyObject*) _PyTraceBack_FromFrame( + PyObject *tb_next, + struct _frame *frame); + #ifdef __cplusplus } #endif diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 67a952d9b454..1e5f168f30bd 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -882,19 +882,14 @@ def write_unraisable_exc(self, exc, obj): import _testcapi import types try: - # raise the exception to get a traceback in the except block - try: - raise exc - except Exception as exc2: - _testcapi.write_unraisable_exc(exc2, obj) - return types.SimpleNamespace(exc_type=type(exc2), - exc_value=exc2, - exc_traceback=exc2.__traceback__, - object=obj) + _testcapi.write_unraisable_exc(exc, obj) + return types.SimpleNamespace(exc_type=type(exc), + exc_value=exc, + exc_traceback=exc.__traceback__, + object=obj) finally: # Explicitly break any reference cycle exc = None - exc2 = None def test_original_unraisablehook(self): obj = "an object" diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-22-23-01-29.bpo-36829.MfOcUg.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-22-23-01-29.bpo-36829.MfOcUg.rst new file mode 100644 index 000000000000..957a4857e408 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-22-23-01-29.bpo-36829.MfOcUg.rst @@ -0,0 +1,4 @@ +:c:func:`PyErr_WriteUnraisable` now creates a traceback object if there is +no current traceback. Moreover, call :c:func:`PyErr_NormalizeException` and +:c:func:`PyException_SetTraceback` to normalize the exception value. Ignore any +error. diff --git a/Python/errors.c b/Python/errors.c index 9622b5a1067d..1b8b7eeb0e74 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -4,6 +4,7 @@ #include "Python.h" #include "pycore_coreconfig.h" #include "pycore_pystate.h" +#include "pycore_traceback.h" #ifndef __STDC__ #ifndef MS_WINDOWS @@ -1048,7 +1049,7 @@ write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, } } - if (!exc_type) { + if (exc_type == NULL || exc_type == Py_None) { return -1; } @@ -1106,6 +1107,7 @@ write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, } } } + if (PyFile_WriteString("\n", file) < 0) { return -1; } @@ -1177,6 +1179,24 @@ PyErr_WriteUnraisable(PyObject *obj) goto default_hook; } + if (exc_tb == NULL) { + struct _frame *frame = _PyThreadState_GET()->frame; + if (frame != NULL) { + exc_tb = _PyTraceBack_FromFrame(NULL, frame); + if (exc_tb == NULL) { + PyErr_Clear(); + } + } + } + + PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb); + + if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) { + if (PyException_SetTraceback(exc_value, exc_tb) < 0) { + PyErr_Clear(); + } + } + _Py_IDENTIFIER(unraisablehook); PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook); if (hook != NULL && hook != Py_None) { diff --git a/Python/traceback.c b/Python/traceback.c index 18bd0bf7341f..04b52ad7680a 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -227,13 +227,24 @@ PyTypeObject PyTraceBack_Type = { tb_new, /* tp_new */ }; + +PyObject* +_PyTraceBack_FromFrame(PyObject *tb_next, PyFrameObject *frame) +{ + assert(tb_next == NULL || PyTraceBack_Check(tb_next)); + assert(frame != NULL); + + return tb_create_raw((PyTracebackObject *)tb_next, frame, frame->f_lasti, + PyFrame_GetLineNumber(frame)); +} + + int PyTraceBack_Here(PyFrameObject *frame) { PyObject *exc, *val, *tb, *newtb; PyErr_Fetch(&exc, &val, &tb); - newtb = tb_create_raw((PyTracebackObject *)tb, frame, frame->f_lasti, - PyFrame_GetLineNumber(frame)); + newtb = _PyTraceBack_FromFrame(tb, frame); if (newtb == NULL) { _PyErr_ChainExceptions(exc, val, tb); return -1; From webhook-mailer at python.org Wed May 22 20:01:12 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 May 2019 00:01:12 -0000 Subject: [Python-checkins] =?utf-8?q?bpo-35091=3A_Objects/listobject=2Ec?= =?utf-8?q?=3A_Replace_overflow_checks_in_gallop_fu=E2=80=A6_=28GH-10202?= =?utf-8?q?=29?= Message-ID: https://github.com/python/cpython/commit/6bc5917903b722bdd0e5d3020949f26fec5dfe9a commit: 6bc5917903b722bdd0e5d3020949f26fec5dfe9a branch: master author: Alexey Izbyshev committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-22T17:01:08-07:00 summary: bpo-35091: Objects/listobject.c: Replace overflow checks in gallop fu? (GH-10202) ?nctions with asserts The actual overflow can never happen because of the following: * The size of a list can't be greater than PY_SSIZE_T_MAX / sizeof(PyObject*). * The size of a pointer on all supported plaftorms is at least 4 bytes. * ofs is positive and less than the list size at the beginning of each iteration. https://bugs.python.org/issue35091 files: M Objects/listobject.c diff --git a/Objects/listobject.c b/Objects/listobject.c index 08b3e89a957f..3185957453d7 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1380,9 +1380,8 @@ gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_ while (ofs < maxofs) { IFLT(a[ofs], key) { lastofs = ofs; + assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2); ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ - ofs = maxofs; } else /* key <= a[hint + ofs] */ break; @@ -1403,9 +1402,8 @@ gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_ break; /* key <= a[hint - ofs] */ lastofs = ofs; + assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2); ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ - ofs = maxofs; } if (ofs > maxofs) ofs = maxofs; @@ -1471,9 +1469,8 @@ gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize while (ofs < maxofs) { IFLT(key, *(a-ofs)) { lastofs = ofs; + assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2); ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ - ofs = maxofs; } else /* a[hint - ofs] <= key */ break; @@ -1495,9 +1492,8 @@ gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize break; /* a[hint + ofs] <= key */ lastofs = ofs; + assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2); ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ - ofs = maxofs; } if (ofs > maxofs) ofs = maxofs; From webhook-mailer at python.org Wed May 22 20:19:00 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 May 2019 00:19:00 -0000 Subject: [Python-checkins] =?utf-8?q?bpo-35091=3A_Objects/listobject=2Ec?= =?utf-8?q?=3A_Replace_overflow_checks_in_gallop_fu=E2=80=A6_=28GH-10202?= =?utf-8?q?=29?= Message-ID: https://github.com/python/cpython/commit/367fe5757a707c4e3602dee807a9315199ed0b5c commit: 367fe5757a707c4e3602dee807a9315199ed0b5c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-22T17:18:55-07:00 summary: bpo-35091: Objects/listobject.c: Replace overflow checks in gallop fu? (GH-10202) ?nctions with asserts The actual overflow can never happen because of the following: * The size of a list can't be greater than PY_SSIZE_T_MAX / sizeof(PyObject*). * The size of a pointer on all supported plaftorms is at least 4 bytes. * ofs is positive and less than the list size at the beginning of each iteration. https://bugs.python.org/issue35091 (cherry picked from commit 6bc5917903b722bdd0e5d3020949f26fec5dfe9a) Co-authored-by: Alexey Izbyshev files: M Objects/listobject.c diff --git a/Objects/listobject.c b/Objects/listobject.c index d795f66e6e05..78aa8dea08ac 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1324,9 +1324,8 @@ gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_ while (ofs < maxofs) { IFLT(a[ofs], key) { lastofs = ofs; + assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2); ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ - ofs = maxofs; } else /* key <= a[hint + ofs] */ break; @@ -1347,9 +1346,8 @@ gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_ break; /* key <= a[hint - ofs] */ lastofs = ofs; + assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2); ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ - ofs = maxofs; } if (ofs > maxofs) ofs = maxofs; @@ -1415,9 +1413,8 @@ gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize while (ofs < maxofs) { IFLT(key, *(a-ofs)) { lastofs = ofs; + assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2); ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ - ofs = maxofs; } else /* a[hint - ofs] <= key */ break; @@ -1439,9 +1436,8 @@ gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize break; /* a[hint + ofs] <= key */ lastofs = ofs; + assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2); ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ - ofs = maxofs; } if (ofs > maxofs) ofs = maxofs; From webhook-mailer at python.org Wed May 22 21:13:31 2019 From: webhook-mailer at python.org (R. David Murray) Date: Thu, 23 May 2019 01:13:31 -0000 Subject: [Python-checkins] bpo-27737: Allow whitespace only headers encoding (#13478) Message-ID: https://github.com/python/cpython/commit/ef5bb25e2d6147cd44be9c9b166525fb30485be0 commit: ef5bb25e2d6147cd44be9c9b166525fb30485be0 branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: R. David Murray date: 2019-05-22T21:13:16-04:00 summary: bpo-27737: Allow whitespace only headers encoding (#13478) files: A Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst M Lib/email/header.py M Lib/test/test_email/test_email.py diff --git a/Lib/email/header.py b/Lib/email/header.py index 7b30a039da1c..4ab0032bc661 100644 --- a/Lib/email/header.py +++ b/Lib/email/header.py @@ -431,7 +431,7 @@ def newline(self): if end_of_line != (' ', ''): self._current_line.push(*end_of_line) if len(self._current_line) > 0: - if self._current_line.is_onlyws(): + if self._current_line.is_onlyws() and self._lines: self._lines[-1] += str(self._current_line) else: self._lines.append(str(self._current_line)) diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 621754cf753d..dfb3be84384a 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -4964,6 +4964,9 @@ def test_encode_preserves_leading_ws_on_value(self): msg['SomeHeader'] = ' value with leading ws' self.assertEqual(str(msg), "SomeHeader: value with leading ws\n\n") + def test_whitespace_header(self): + self.assertEqual(Header(' ').encode(), ' ') + # Test RFC 2231 header parameters (en/de)coding diff --git a/Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst b/Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst new file mode 100644 index 000000000000..02d0ef891bec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst @@ -0,0 +1,2 @@ +Allow whitespace only header encoding in ``email.header`` - by Batuhan +Taskaya From webhook-mailer at python.org Wed May 22 21:30:29 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 23 May 2019 01:30:29 -0000 Subject: [Python-checkins] bpo-36721: Add --embed option to python-config (GH-13500) Message-ID: https://github.com/python/cpython/commit/0a8e57248b913851640c64375600f05157c997df commit: 0a8e57248b913851640c64375600f05157c997df branch: master author: Victor Stinner committer: GitHub date: 2019-05-23T03:30:23+02:00 summary: bpo-36721: Add --embed option to python-config (GH-13500) To embed Python into an application, a new --embed option must be passed to "python3-config --libs --embed" to get "-lpython3.8" (link the application to libpython). To support both 3.8 and older, try "python3-config --libs --embed" first and fallback to "python3-config --libs" (without --embed) if the previous command fails. Add a pkg-config "python-3.8-embed" module to embed Python into an application: "pkg-config python-3.8-embed --libs" includes "-lpython3.8". To support both 3.8 and older, try "pkg-config python-X.Y-embed --libs" first and fallback to "pkg-config python-X.Y --libs" (without --embed) if the previous command fails (replace "X.Y" with the Python version). On the other hand, "pkg-config python3.8 --libs" no longer contains "-lpython3.8". C extensions must not be linked to libpython (except on Android, case handled by the script); this change is backward incompatible on purpose. "make install" now also installs "python-3.8-embed.pc". files: A Misc/NEWS.d/next/Build/2019-05-22-16-19-18.bpo-36721.9aRwfZ.rst A Misc/python-embed.pc.in M .gitignore M Doc/whatsnew/3.8.rst M Makefile.pre.in M Misc/python-config.in M Misc/python-config.sh.in M Misc/python.pc.in M configure M configure.ac diff --git a/.gitignore b/.gitignore index e3c580957923..9445ef1e2c52 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ Lib/test/data/* Makefile Makefile.pre Misc/python.pc +Misc/python-embed.pc Misc/python-config.sh Modules/Setup Modules/Setup.config diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 68843e2d9ed1..8c2b40de1142 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -149,6 +149,24 @@ extensions compiled in release mode and for C extensions compiled with the stable ABI. (Contributed by Victor Stinner in :issue:`36722`.) +To embed Python into an application, a new ``--embed`` option must be passed to +``python3-config --libs --embed`` to get ``-lpython3.8`` (link the application +to libpython). To support both 3.8 and older, try ``python3-config --libs +--embed`` first and fallback to ``python3-config --libs`` (without ``--embed``) +if the previous command fails. + +Add a pkg-config ``python-3.8-embed`` module to embed Python into an +application: ``pkg-config python-3.8-embed --libs`` includes ``-lpython3.8``. +To support both 3.8 and older, try ``pkg-config python-X.Y-embed --libs`` first +and fallback to ``pkg-config python-X.Y --libs`` (without ``--embed``) if the +previous command fails (replace ``X.Y`` with the Python version). + +On the other hand, ``pkg-config python3.8 --libs`` no longer contains +``-lpython3.8``. C extensions must not be linked to libpython (except on +Android, case handled by the script); this change is backward incompatible on +purpose. +(Contributed by Victor Stinner in :issue:`36721`.) + f-strings now support = for quick and easy debugging ----------------------------------------------------- diff --git a/Makefile.pre.in b/Makefile.pre.in index 9f70cd515eba..d006a73c38be 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1258,11 +1258,15 @@ bininstall: altbininstall (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(LDVERSION)-config python$(VERSION)-config); \ rm -f $(DESTDIR)$(LIBPC)/python-$(LDVERSION).pc; \ (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python-$(LDVERSION).pc); \ + rm -f $(DESTDIR)$(LIBPC)/python-embed-$(LDVERSION).pc; \ + (cd $(DESTDIR)$(LIBPC); $(LN) -s python-embed-$(VERSION).pc python-embed-$(LDVERSION).pc); \ fi -rm -f $(DESTDIR)$(BINDIR)/python3-config (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python3-config) -rm -f $(DESTDIR)$(LIBPC)/python3.pc (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python3.pc) + -rm -f $(DESTDIR)$(LIBPC)/python3-embed.pc + (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)-embed.pc python3-embed.pc) -rm -f $(DESTDIR)$(BINDIR)/idle3 (cd $(DESTDIR)$(BINDIR); $(LN) -s idle$(VERSION) idle3) -rm -f $(DESTDIR)$(BINDIR)/pydoc3 @@ -1552,6 +1556,7 @@ libainstall: @DEF_MAKE_RULE@ python-config $(INSTALL_DATA) $(srcdir)/Modules/Setup $(DESTDIR)$(LIBPL)/Setup $(INSTALL_DATA) Modules/Setup.local $(DESTDIR)$(LIBPL)/Setup.local $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION).pc + $(INSTALL_DATA) Misc/python-embed.pc $(DESTDIR)$(LIBPC)/python-$(VERSION)-embed.pc $(INSTALL_SCRIPT) $(srcdir)/Modules/makesetup $(DESTDIR)$(LIBPL)/makesetup $(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh $(INSTALL_SCRIPT) python-config.py $(DESTDIR)$(LIBPL)/python-config.py @@ -1766,7 +1771,7 @@ distclean: clobber done -rm -f core Makefile Makefile.pre config.status Modules/Setup.local \ Modules/ld_so_aix Modules/python.exp Misc/python.pc \ - Misc/python-config.sh + Misc/python-embed.pc Misc/python-config.sh -rm -f python*-gdb.py # Issue #28258: set LC_ALL to avoid issues with Estonian locale. # Expansion is performed here by shell (spawned by make) itself before diff --git a/Misc/NEWS.d/next/Build/2019-05-22-16-19-18.bpo-36721.9aRwfZ.rst b/Misc/NEWS.d/next/Build/2019-05-22-16-19-18.bpo-36721.9aRwfZ.rst new file mode 100644 index 000000000000..1c266586a33b --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-05-22-16-19-18.bpo-36721.9aRwfZ.rst @@ -0,0 +1,16 @@ +To embed Python into an application, a new ``--embed`` option must be passed to +``python3-config --libs --embed`` to get ``-lpython3.8`` (link the application +to libpython). To support both 3.8 and older, try ``python3-config --libs +--embed`` first and fallback to ``python3-config --libs`` (without ``--embed``) +if the previous command fails. + +Add a pkg-config ``python-3.8-embed`` module to embed Python into an +application: ``pkg-config python-3.8-embed --libs`` includes ``-lpython3.8``. +To support both 3.8 and older, try ``pkg-config python-X.Y-embed --libs`` first +and fallback to ``pkg-config python-X.Y --libs`` (without ``--embed``) if the +previous command fails (replace ``X.Y`` with the Python version). + +On the other hand, ``pkg-config python3.8 --libs`` no longer contains +``-lpython3.8``. C extensions must not be linked to libpython (except on +Android, case handled by the script); this change is backward incompatible on +purpose. diff --git a/Misc/python-config.in b/Misc/python-config.in index 1df30d261d8e..727c4a868227 100644 --- a/Misc/python-config.in +++ b/Misc/python-config.in @@ -9,7 +9,8 @@ import sys import sysconfig valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', - 'ldflags', 'extension-suffix', 'help', 'abiflags', 'configdir'] + 'ldflags', 'extension-suffix', 'help', 'abiflags', 'configdir', + 'embed'] def exit_with_usage(code=1): print("Usage: {0} [{1}]".format( @@ -47,8 +48,13 @@ for opt in opt_flags: print(' '.join(flags)) elif opt in ('--libs', '--ldflags'): - libpython = getvar('LIBPYTHON') - libs = [libpython] if libpython else [] + libs = [] + if '--embed' in opt_flags: + libs.append('-lpython' + pyver + sys.abiflags) + else: + libpython = getvar('LIBPYTHON') + if libpython: + libs.append(libpython) libs.extend(getvar('LIBS').split() + getvar('SYSLIBS').split()) # add the prefix/lib/pythonX.Y/config dir, but only if there is no diff --git a/Misc/python-config.sh.in b/Misc/python-config.sh.in index 33991ef0c5d4..59101d5a5580 100644 --- a/Misc/python-config.sh.in +++ b/Misc/python-config.sh.in @@ -42,6 +42,7 @@ LIBC="@LIBC@" SYSLIBS="$LIBM $LIBC" ABIFLAGS="@ABIFLAGS@" LIBS="@LIBPYTHON@ @LIBS@ $SYSLIBS" +LIBS_EMBED="-lpython${VERSION}${ABIFLAGS} @LIBS@ $SYSLIBS" BASECFLAGS="@BASECFLAGS@" LDLIBRARY="@LDLIBRARY@" OPT="@OPT@" @@ -53,6 +54,7 @@ SO="@EXT_SUFFIX@" PYTHONFRAMEWORK="@PYTHONFRAMEWORK@" INCDIR="-I$includedir/python${VERSION}${ABIFLAGS}" PLATINCDIR="-I$includedir/python${VERSION}${ABIFLAGS}" +PY_EMBED=0 # Scan for --help or unknown argument. for ARG in $* @@ -61,6 +63,9 @@ do --help) exit_with_usage 0 ;; + --embed) + PY_EMBED=1 + ;; --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--abiflags|--configdir) ;; *) @@ -69,6 +74,10 @@ do esac done +if [ $PY_EMBED = 1 ] ; then + LIBS="$LIBS_EMBED" +fi + for ARG in "$@" do case "$ARG" in diff --git a/Misc/python-embed.pc.in b/Misc/python-embed.pc.in new file mode 100644 index 000000000000..2be9df8143fa --- /dev/null +++ b/Misc/python-embed.pc.in @@ -0,0 +1,13 @@ +# See: man pkg-config +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Python +Description: Embed Python into an application +Requires: +Version: @VERSION@ +Libs.private: @LIBS@ +Libs: -L${libdir} -lpython at VERSION@@ABIFLAGS@ +Cflags: -I${includedir}/python at VERSION@@ABIFLAGS@ diff --git a/Misc/python.pc.in b/Misc/python.pc.in index ae698674bbc8..87e04decc2a2 100644 --- a/Misc/python.pc.in +++ b/Misc/python.pc.in @@ -5,9 +5,9 @@ libdir=@libdir@ includedir=@includedir@ Name: Python -Description: Python library -Requires: +Description: Build a C extension for Python +Requires: Version: @VERSION@ Libs.private: @LIBS@ -Libs: -L${libdir} -lpython at VERSION@@ABIFLAGS@ +Libs: Cflags: -I${includedir}/python at VERSION@@ABIFLAGS@ diff --git a/configure b/configure index a0767b971363..72889b9d2efc 100755 --- a/configure +++ b/configure @@ -17315,7 +17315,7 @@ fi # generate output files -ac_config_files="$ac_config_files Makefile.pre Misc/python.pc Misc/python-config.sh" +ac_config_files="$ac_config_files Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh" ac_config_files="$ac_config_files Modules/ld_so_aix" @@ -18018,6 +18018,7 @@ do "Mac/Resources/app/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/app/Info.plist" ;; "Makefile.pre") CONFIG_FILES="$CONFIG_FILES Makefile.pre" ;; "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc" ;; + "Misc/python-embed.pc") CONFIG_FILES="$CONFIG_FILES Misc/python-embed.pc" ;; "Misc/python-config.sh") CONFIG_FILES="$CONFIG_FILES Misc/python-config.sh" ;; "Modules/ld_so_aix") CONFIG_FILES="$CONFIG_FILES Modules/ld_so_aix" ;; diff --git a/configure.ac b/configure.ac index 3a915eb5577c..f548d644327a 100644 --- a/configure.ac +++ b/configure.ac @@ -5589,7 +5589,7 @@ AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 1) # generate output files -AC_CONFIG_FILES(Makefile.pre Misc/python.pc Misc/python-config.sh) +AC_CONFIG_FILES(Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh) AC_CONFIG_FILES([Modules/ld_so_aix], [chmod +x Modules/ld_so_aix]) AC_OUTPUT From webhook-mailer at python.org Wed May 22 21:41:48 2019 From: webhook-mailer at python.org (R. David Murray) Date: Thu, 23 May 2019 01:41:48 -0000 Subject: [Python-checkins] bpo-27737: Allow whitespace only headers encoding (GH-13478) (#13517) Message-ID: https://github.com/python/cpython/commit/0416d6f05a96e0f1b3751aa97abfffe6d3323976 commit: 0416d6f05a96e0f1b3751aa97abfffe6d3323976 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: R. David Murray date: 2019-05-22T21:41:43-04:00 summary: bpo-27737: Allow whitespace only headers encoding (GH-13478) (#13517) (cherry picked from commit ef5bb25e2d6147cd44be9c9b166525fb30485be0) Co-authored-by: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst M Lib/email/header.py M Lib/test/test_email/test_email.py diff --git a/Lib/email/header.py b/Lib/email/header.py index 7b30a039da1c..4ab0032bc661 100644 --- a/Lib/email/header.py +++ b/Lib/email/header.py @@ -431,7 +431,7 @@ def newline(self): if end_of_line != (' ', ''): self._current_line.push(*end_of_line) if len(self._current_line) > 0: - if self._current_line.is_onlyws(): + if self._current_line.is_onlyws() and self._lines: self._lines[-1] += str(self._current_line) else: self._lines.append(str(self._current_line)) diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 621754cf753d..dfb3be84384a 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -4964,6 +4964,9 @@ def test_encode_preserves_leading_ws_on_value(self): msg['SomeHeader'] = ' value with leading ws' self.assertEqual(str(msg), "SomeHeader: value with leading ws\n\n") + def test_whitespace_header(self): + self.assertEqual(Header(' ').encode(), ' ') + # Test RFC 2231 header parameters (en/de)coding diff --git a/Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst b/Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst new file mode 100644 index 000000000000..02d0ef891bec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst @@ -0,0 +1,2 @@ +Allow whitespace only header encoding in ``email.header`` - by Batuhan +Taskaya From webhook-mailer at python.org Wed May 22 21:45:12 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 23 May 2019 01:45:12 -0000 Subject: [Python-checkins] bpo-18748: _pyio.IOBase emits unraisable exception (GH-13512) Message-ID: https://github.com/python/cpython/commit/bc2aa816620c5e02ad8e94d8514b7e8f3f551ca1 commit: bc2aa816620c5e02ad8e94d8514b7e8f3f551ca1 branch: master author: Victor Stinner committer: GitHub date: 2019-05-23T03:45:09+02:00 summary: bpo-18748: _pyio.IOBase emits unraisable exception (GH-13512) In development (-X dev) mode and in a debug build, IOBase finalizer of the _pyio module now logs the exception if the close() method fails. The exception is ignored silently by default in release build. test_io: test_error_through_destructor() now uses support.catch_unraisable_exception() rather than capturing stderr. files: M Doc/whatsnew/3.8.rst M Lib/_pyio.py M Lib/test/test_io.py diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 8c2b40de1142..b91f7bca63c9 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -318,6 +318,15 @@ for :func:`property`, :func:`classmethod`, and :func:`staticmethod`:: self.bit_rate = round(bit_rate / 1000.0, 1) self.duration = ceil(duration) +io +-- + +In development mode (:option:`-X` ``env``) and in debug build, the +:class:`io.IOBase` finalizer now logs the exception if the ``close()`` method +fails. The exception is ignored silently by default in release build. +(Contributed by Victor Stinner in :issue:`18748`.) + + gc -- diff --git a/Lib/_pyio.py b/Lib/_pyio.py index af2ce30c2780..be5e4266daff 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -33,6 +33,10 @@ # Rebind for compatibility BlockingIOError = BlockingIOError +# Does io.IOBase finalizer log the exception if the close() method fails? +# The exception is ignored silently by default in release build. +_IOBASE_EMITS_UNRAISABLE = (hasattr(sys, "gettotalrefcount") or sys.flags.dev_mode) + def open(file, mode="r", buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None): @@ -378,15 +382,18 @@ def close(self): def __del__(self): """Destructor. Calls close().""" - # The try/except block is in case this is called at program - # exit time, when it's possible that globals have already been - # deleted, and then the close() call might fail. Since - # there's nothing we can do about such failures and they annoy - # the end users, we suppress the traceback. - try: + if _IOBASE_EMITS_UNRAISABLE: self.close() - except: - pass + else: + # The try/except block is in case this is called at program + # exit time, when it's possible that globals have already been + # deleted, and then the close() call might fail. Since + # there's nothing we can do about such failures and they annoy + # the end users, we suppress the traceback. + try: + self.close() + except: + pass ### Inquiries ### diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index dc44e506b1d0..2c3bf8906679 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -67,9 +67,9 @@ class EmptyStruct(ctypes.Structure): '--with-memory-sanitizer' in _config_args ) -# Does io.IOBase logs unhandled exceptions on calling close()? -# They are silenced by default in release build. -DESTRUCTOR_LOG_ERRORS = (hasattr(sys, "gettotalrefcount") or sys.flags.dev_mode) +# Does io.IOBase finalizer log the exception if the close() method fails? +# The exception is ignored silently by default in release build. +IOBASE_EMITS_UNRAISABLE = (hasattr(sys, "gettotalrefcount") or sys.flags.dev_mode) def _default_chunk_size(): @@ -1098,23 +1098,18 @@ def test_error_through_destructor(self): # Test that the exception state is not modified by a destructor, # even if close() fails. rawio = self.CloseFailureIO() - def f(): - self.tp(rawio).xyzzy - with support.captured_output("stderr") as s: - self.assertRaises(AttributeError, f) - s = s.getvalue().strip() - if s: - # The destructor *may* have printed an unraisable error, check it - lines = s.splitlines() - if DESTRUCTOR_LOG_ERRORS: - self.assertEqual(len(lines), 5) - self.assertTrue(lines[0].startswith("Exception ignored in: "), lines) - self.assertEqual(lines[1], "Traceback (most recent call last):", lines) - self.assertEqual(lines[4], 'OSError:', lines) - else: - self.assertEqual(len(lines), 1) - self.assertTrue(lines[-1].startswith("Exception OSError: "), lines) - self.assertTrue(lines[-1].endswith(" ignored"), lines) + try: + with support.catch_unraisable_exception() as cm: + with self.assertRaises(AttributeError): + self.tp(rawio).xyzzy + + if not IOBASE_EMITS_UNRAISABLE: + self.assertIsNone(cm.unraisable) + elif cm.unraisable is not None: + self.assertEqual(cm.unraisable.exc_type, OSError) + finally: + # Explicitly break reference cycle + cm = None def test_repr(self): raw = self.MockRawIO() @@ -2859,23 +2854,18 @@ def test_error_through_destructor(self): # Test that the exception state is not modified by a destructor, # even if close() fails. rawio = self.CloseFailureIO() - def f(): - self.TextIOWrapper(rawio).xyzzy - with support.captured_output("stderr") as s: - self.assertRaises(AttributeError, f) - s = s.getvalue().strip() - if s: - # The destructor *may* have printed an unraisable error, check it - lines = s.splitlines() - if DESTRUCTOR_LOG_ERRORS: - self.assertEqual(len(lines), 5) - self.assertTrue(lines[0].startswith("Exception ignored in: "), lines) - self.assertEqual(lines[1], "Traceback (most recent call last):", lines) - self.assertEqual(lines[4], 'OSError:', lines) - else: - self.assertEqual(len(lines), 1) - self.assertTrue(lines[-1].startswith("Exception OSError: "), lines) - self.assertTrue(lines[-1].endswith(" ignored"), lines) + try: + with support.catch_unraisable_exception() as cm: + with self.assertRaises(AttributeError): + self.TextIOWrapper(rawio).xyzzy + + if not IOBASE_EMITS_UNRAISABLE: + self.assertIsNone(cm.unraisable) + elif cm.unraisable is not None: + self.assertEqual(cm.unraisable.exc_type, OSError) + finally: + # Explicitly break reference cycle + cm = None # Systematic tests of the text I/O API From webhook-mailer at python.org Wed May 22 22:12:31 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 23 May 2019 02:12:31 -0000 Subject: [Python-checkins] bpo-36763: Fix _PyPreConfig_InitCompatConfig() utf8_mode (GH-13518) Message-ID: https://github.com/python/cpython/commit/20e1e2582e5e69e43af88ff58699c8883d146acb commit: 20e1e2582e5e69e43af88ff58699c8883d146acb branch: master author: Victor Stinner committer: GitHub date: 2019-05-23T04:12:27+02:00 summary: bpo-36763: Fix _PyPreConfig_InitCompatConfig() utf8_mode (GH-13518) * _PyPreConfig_InitCompatConfig() sets utf8_mode to 0. * Change Py_UTF8Mode default value to 0. * Fix _PyPreConfig_Copy(): copy also _config_init attrbibute. * _PyPreConfig_AsDict() exports _config_init * Fix _PyPreConfig_GetGlobalConfig(): use Py_UTF8Mode if it's greater than 0, even if utf8_mode >= 0. * Add unit tests on environment variables using Python API. files: M Lib/test/test_embed.py M Programs/_testembed.c M Python/coreconfig.c M Python/preconfig.c diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index bd0451a43b95..32aabe30a5c8 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -287,6 +287,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): IGNORE_CONFIG = object() PRE_CONFIG_COMPAT = { + '_config_init': API_COMPAT, 'allocator': PYMEM_ALLOCATOR_NOT_SET, 'parse_argv': 0, 'configure_locale': 1, @@ -299,11 +300,13 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'legacy_windows_fs_encoding': 0, }) PRE_CONFIG_PYTHON = dict(PRE_CONFIG_COMPAT, + _config_init=API_PYTHON, parse_argv=1, coerce_c_locale=GET_DEFAULT_CONFIG, utf8_mode=GET_DEFAULT_CONFIG, ) PRE_CONFIG_ISOLATED = dict(PRE_CONFIG_COMPAT, + _config_init=API_ISOLATED, configure_locale=0, isolated=1, use_environment=0, @@ -388,10 +391,12 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): }) CORE_CONFIG_PYTHON = dict(CORE_CONFIG_COMPAT, + _config_init=API_PYTHON, configure_c_stdio=1, parse_argv=1, ) CORE_CONFIG_ISOLATED = dict(CORE_CONFIG_COMPAT, + _config_init=API_ISOLATED, isolated=1, use_environment=0, user_site_directory=0, @@ -611,7 +616,6 @@ def check_config(self, testname, expected_config=None, else: default_config = self.CORE_CONFIG_COMPAT expected_config = dict(default_config, **expected_config) - expected_config['_config_init'] = api self.get_expected_config(expected_preconfig, expected_config, env, @@ -708,10 +712,9 @@ def test_init_from_config(self): self.check_config("test_init_from_config", config, preconfig, api=API_COMPAT) - def test_init_env(self): + def test_init_compat_env(self): preconfig = { 'allocator': PYMEM_ALLOCATOR_MALLOC, - 'utf8_mode': 1, } config = { 'use_hash_seed': 1, @@ -732,9 +735,36 @@ def test_init_env(self): 'faulthandler': 1, 'warnoptions': ['EnvVar'], } - self.check_config("test_init_env", config, preconfig, + self.check_config("test_init_compat_env", config, preconfig, api=API_COMPAT) + def test_init_python_env(self): + preconfig = { + 'allocator': PYMEM_ALLOCATOR_MALLOC, + 'utf8_mode': 1, + } + config = { + 'use_hash_seed': 1, + 'hash_seed': 42, + 'tracemalloc': 2, + 'import_time': 1, + 'malloc_stats': 1, + 'inspect': 1, + 'optimization_level': 2, + 'module_search_path_env': '/my/path', + 'pycache_prefix': 'env_pycache_prefix', + 'write_bytecode': 0, + 'verbose': 1, + 'buffered_stdio': 0, + 'stdio_encoding': 'iso8859-1', + 'stdio_errors': 'replace', + 'user_site_directory': 0, + 'faulthandler': 1, + 'warnoptions': ['EnvVar'], + } + self.check_config("test_init_python_env", config, preconfig, + api=API_PYTHON) + def test_init_env_dev_mode(self): preconfig = dict(allocator=PYMEM_ALLOCATOR_DEBUG) config = dict(dev_mode=1, diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 7f8ea07ee3e2..6bd55deab401 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -638,7 +638,7 @@ static void set_all_env_vars(void) } -static int test_init_env(void) +static int test_init_compat_env(void) { /* Test initialization from environment variables */ Py_IgnoreEnvironmentFlag = 0; @@ -650,6 +650,29 @@ static int test_init_env(void) } +static int test_init_python_env(void) +{ + _PyInitError err; + + set_all_env_vars(); + + _PyCoreConfig config; + err = _PyCoreConfig_InitPythonConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } + config.program_name = L"./_testembed"; + + err = _Py_InitializeFromConfig(&config); + if (_PyInitError_Failed(err)) { + _Py_ExitInitError(err); + } + dump_config(); + Py_Finalize(); + return 0; +} + + static void set_all_env_vars_dev_mode(void) { putenv("PYTHONMALLOC="); @@ -1257,7 +1280,8 @@ static struct TestCase TestCases[] = { {"test_init_from_config", test_init_from_config}, {"test_init_parse_argv", test_init_parse_argv}, {"test_init_dont_parse_argv", test_init_dont_parse_argv}, - {"test_init_env", test_init_env}, + {"test_init_compat_env", test_init_compat_env}, + {"test_init_python_env", test_init_python_env}, {"test_init_env_dev_mode", test_init_env_dev_mode}, {"test_init_env_dev_mode_alloc", test_init_env_dev_mode_alloc}, {"test_init_dont_configure_locale", test_init_dont_configure_locale}, diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 40dba4ee5e5e..89ccff4c9b76 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -107,9 +107,8 @@ static const char usage_6[] = /* --- Global configuration variables ----------------------------- */ /* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change - stdin and stdout error handler to "surrogateescape". It is equal to - -1 by default: unknown, will be set by Py_Main() */ -int Py_UTF8Mode = -1; + stdin and stdout error handler to "surrogateescape". */ +int Py_UTF8Mode = 0; int Py_DebugFlag = 0; /* Needed by parser.c */ int Py_VerboseFlag = 0; /* Needed by import.c */ int Py_QuietFlag = 0; /* Needed by sysmodule.c */ diff --git a/Python/preconfig.c b/Python/preconfig.c index 392324ff201a..a6d1346eb4e1 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -272,7 +272,16 @@ _PyPreConfig_InitCompatConfig(_PyPreConfig *config) config->isolated = -1; config->use_environment = -1; config->configure_locale = 1; - config->utf8_mode = -1; + + /* bpo-36443: C locale coercion (PEP 538) and UTF-8 Mode (PEP 540) + are disabled by default using the Compat configuration. + + Py_UTF8Mode=1 enables the UTF-8 mode. PYTHONUTF8 environment variable + is ignored (even if use_environment=1). */ + config->utf8_mode = 0; + config->coerce_c_locale = 0; + config->coerce_c_locale_warn = 0; + config->dev_mode = -1; config->allocator = PYMEM_ALLOCATOR_NOT_SET; #ifdef MS_WINDOWS @@ -353,6 +362,7 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) { #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR + COPY_ATTR(_config_init); COPY_ATTR(parse_argv); COPY_ATTR(isolated); COPY_ATTR(use_environment); @@ -393,6 +403,7 @@ _PyPreConfig_AsDict(const _PyPreConfig *config) } \ } while (0) + SET_ITEM_INT(_config_init); SET_ITEM_INT(parse_argv); SET_ITEM_INT(isolated); SET_ITEM_INT(use_environment); @@ -452,7 +463,9 @@ _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); - COPY_FLAG(utf8_mode, Py_UTF8Mode); + if (Py_UTF8Mode > 0) { + config->utf8_mode = Py_UTF8Mode; + } #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); #endif From webhook-mailer at python.org Thu May 23 00:32:53 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Thu, 23 May 2019 04:32:53 -0000 Subject: [Python-checkins] bpo-33164: update blake2 implementation (GH-6286) Message-ID: https://github.com/python/cpython/commit/51aa35e9e17eef60d04add9619fe2a7eb938358c commit: 51aa35e9e17eef60d04add9619fe2a7eb938358c branch: master author: David Carlier committer: Inada Naoki date: 2019-05-23T13:32:44+09:00 summary: bpo-33164: update blake2 implementation (GH-6286) files: A Misc/NEWS.d/next/Security/2018-03-30-12-26-47.bpo-33164.aO29Cx.rst A Modules/_blake2/impl/blake2-dispatch.c A Modules/_blake2/impl/blake2-kat.h A Modules/_blake2/impl/blake2b-test.c A Modules/_blake2/impl/blake2bp-test.c A Modules/_blake2/impl/blake2bp.c A Modules/_blake2/impl/blake2s-test.c A Modules/_blake2/impl/blake2sp-test.c A Modules/_blake2/impl/blake2sp.c M Modules/_blake2/impl/blake2-config.h M Modules/_blake2/impl/blake2-impl.h M Modules/_blake2/impl/blake2.h M Modules/_blake2/impl/blake2b-load-sse2.h M Modules/_blake2/impl/blake2b-load-sse41.h M Modules/_blake2/impl/blake2b-ref.c M Modules/_blake2/impl/blake2b-round.h M Modules/_blake2/impl/blake2b.c M Modules/_blake2/impl/blake2s-load-sse2.h M Modules/_blake2/impl/blake2s-load-sse41.h M Modules/_blake2/impl/blake2s-load-xop.h M Modules/_blake2/impl/blake2s-ref.c M Modules/_blake2/impl/blake2s-round.h M Modules/_blake2/impl/blake2s.c M aclocal.m4 M configure M configure.ac M pyconfig.h.in diff --git a/Misc/NEWS.d/next/Security/2018-03-30-12-26-47.bpo-33164.aO29Cx.rst b/Misc/NEWS.d/next/Security/2018-03-30-12-26-47.bpo-33164.aO29Cx.rst new file mode 100644 index 000000000000..654494cb3498 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2018-03-30-12-26-47.bpo-33164.aO29Cx.rst @@ -0,0 +1 @@ +Updated blake2 implementation which uses secure memset implementation provided by platform. diff --git a/Modules/_blake2/impl/blake2-config.h b/Modules/_blake2/impl/blake2-config.h index 40455b120ff0..f5dd6faa9e68 100644 --- a/Modules/_blake2/impl/blake2-config.h +++ b/Modules/_blake2/impl/blake2-config.h @@ -1,23 +1,20 @@ /* BLAKE2 reference source code package - optimized C implementations - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: + Written in 2012 by Samuel Neves - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. - More information about the BLAKE2 hash function can be found at - https://blake2.net. + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2_CONFIG_H__ #define __BLAKE2_CONFIG_H__ -/* These don't work everywhere */ -#if defined(__SSE2__) || defined(__x86_64__) || defined(__amd64__) +#if defined(__SSE2__) #define HAVE_SSE2 #endif @@ -26,7 +23,7 @@ #endif #if defined(__SSE4_1__) -#define HAVE_SSE41 +#define HAVE_SSE4_1 #endif #if defined(__AVX__) @@ -51,8 +48,8 @@ #endif #ifdef HAVE_AVX -#ifndef HAVE_SSE41 -#define HAVE_SSE41 +#ifndef HAVE_SSE4_1 +#define HAVE_SSE4_1 #endif #endif diff --git a/Modules/_blake2/impl/blake2-dispatch.c b/Modules/_blake2/impl/blake2-dispatch.c new file mode 100644 index 000000000000..96bb3408bb1e --- /dev/null +++ b/Modules/_blake2/impl/blake2-dispatch.c @@ -0,0 +1,577 @@ +/* + BLAKE2 reference source code package - optimized C implementations + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . +*/ +#include +#if defined(WIN32) +#include +#endif +#include "blake2.h" + +#if defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64) +#define HAVE_X86 +#endif + +typedef enum +{ + NONE = 0, +#if defined(HAVE_X86) + SSE2 = 1, + SSSE3 = 2, + SSE41 = 3, + AVX = 4, + XOP = 5, + /* AVX2 = 6, */ +#endif +} cpu_feature_t; + +static const char feature_names[][8] = +{ + "none", +#if defined(HAVE_X86) + "sse2", + "ssse3", + "sse41", + "avx", + "xop", + /* "avx2" */ +#endif +}; + +#if defined(HAVE_X86) + +#if defined(__GNUC__) +static inline void cpuid( uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx ) +{ + __asm__ __volatile__( +#if defined(__i386__) /* This is needed for -fPIC to work on i386 */ + "movl %%ebx, %%esi\n\t" +#endif + "cpuid\n\t" +#if defined(__i386__) + "xchgl %%ebx, %%esi\n\t" + : "=a"( *eax ), "=S"( *ebx ), "=c"( *ecx ), "=d"( *edx ) : "a"( *eax ) ); +#else + : "=a"( *eax ), "=b"( *ebx ), "=c"( *ecx ), "=d"( *edx ) : "a"( *eax ) ); +#endif +} + +static inline uint64_t xgetbv(uint32_t xcr) +{ + uint32_t a, d; + __asm__ __volatile__( + "xgetbv" + : "=a"(a),"=d"(d) + : "c"(xcr) + ); + return ((uint64_t)d << 32) | a; +} + +#elif defined(_MSC_VER) +#include +static inline void cpuid( uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx ) +{ + int regs[4]; + __cpuid( regs, *eax ); + *eax = regs[0]; + *ebx = regs[1]; + *ecx = regs[2]; + *edx = regs[3]; +} +#else +#error "Don't know how to call cpuid on this compiler!" +#endif + +#endif /* HAVE_X86 */ + +static inline cpu_feature_t get_cpu_features( void ) +{ +#if defined(HAVE_X86) + static volatile int initialized = 0; + static cpu_feature_t feature = NONE; // Safe default + uint32_t eax, ecx, edx, ebx; + + if( initialized ) + return feature; + + eax = 1; + cpuid( &eax, &ebx, &ecx, &edx ); + + if( 1 & ( edx >> 26 ) ) + feature = SSE2; + + if( 1 & ( ecx >> 9 ) ) + feature = SSSE3; + + if( 1 & ( ecx >> 19 ) ) + feature = SSE41; + +#if defined(WIN32) /* Work around the fact that Windows <7 does NOT support AVX... */ + if( IsProcessorFeaturePresent(17) ) /* Some environments don't know about PF_XSAVE_ENABLED */ +#endif + { + /* check for AVX and OSXSAVE bits */ + if( 1 & ( ecx >> 28 ) & (ecx >> 27) ) { +#if !defined(WIN32) /* Already checked for this in WIN32 */ + if( (xgetbv(0) & 6) == 6 ) /* XCR0 */ +#endif + feature = AVX; + } + + + eax = 0x80000001; + cpuid( &eax, &ebx, &ecx, &edx ); + + if( 1 & ( ecx >> 11 ) ) + feature = XOP; + } + + /* For future architectures */ + /* + eax = 7; ecx = 0; + cpuid(&eax, &ebx, &ecx, &edx); + + if(1&(ebx >> 5)) + feature = AVX2; + */ + /* fprintf( stderr, "Using %s engine\n", feature_names[feature] ); */ + initialized = 1; + return feature; +#else + return NONE; +#endif +} + + + +#if defined(__cplusplus) +extern "C" { +#endif + int blake2b_init_ref( blake2b_state *S, size_t outlen ); + int blake2b_init_key_ref( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_init_param_ref( blake2b_state *S, const blake2b_param *P ); + int blake2b_update_ref( blake2b_state *S, const uint8_t *in, size_t inlen ); + int blake2b_final_ref( blake2b_state *S, uint8_t *out, size_t outlen ); + int blake2b_ref( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + +#if defined(HAVE_X86) + + int blake2b_init_sse2( blake2b_state *S, size_t outlen ); + int blake2b_init_key_sse2( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_init_param_sse2( blake2b_state *S, const blake2b_param *P ); + int blake2b_update_sse2( blake2b_state *S, const uint8_t *in, size_t inlen ); + int blake2b_final_sse2( blake2b_state *S, uint8_t *out, size_t outlen ); + int blake2b_sse2( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + int blake2b_init_ssse3( blake2b_state *S, size_t outlen ); + int blake2b_init_key_ssse3( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_init_param_ssse3( blake2b_state *S, const blake2b_param *P ); + int blake2b_update_ssse3( blake2b_state *S, const uint8_t *in, size_t inlen ); + int blake2b_final_ssse3( blake2b_state *S, uint8_t *out, size_t outlen ); + int blake2b_ssse3( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + int blake2b_init_sse41( blake2b_state *S, size_t outlen ); + int blake2b_init_key_sse41( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_init_param_sse41( blake2b_state *S, const blake2b_param *P ); + int blake2b_update_sse41( blake2b_state *S, const uint8_t *in, size_t inlen ); + int blake2b_final_sse41( blake2b_state *S, uint8_t *out, size_t outlen ); + int blake2b_sse41( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + int blake2b_init_avx( blake2b_state *S, size_t outlen ); + int blake2b_init_key_avx( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_init_param_avx( blake2b_state *S, const blake2b_param *P ); + int blake2b_update_avx( blake2b_state *S, const uint8_t *in, size_t inlen ); + int blake2b_final_avx( blake2b_state *S, uint8_t *out, size_t outlen ); + int blake2b_avx( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + int blake2b_init_xop( blake2b_state *S, size_t outlen ); + int blake2b_init_key_xop( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_init_param_xop( blake2b_state *S, const blake2b_param *P ); + int blake2b_update_xop( blake2b_state *S, const uint8_t *in, size_t inlen ); + int blake2b_final_xop( blake2b_state *S, uint8_t *out, size_t outlen ); + int blake2b_xop( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + +#endif /* HAVE_X86 */ + + int blake2s_init_ref( blake2s_state *S, size_t outlen ); + int blake2s_init_key_ref( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_init_param_ref( blake2s_state *S, const blake2s_param *P ); + int blake2s_update_ref( blake2s_state *S, const uint8_t *in, size_t inlen ); + int blake2s_final_ref( blake2s_state *S, uint8_t *out, size_t outlen ); + int blake2s_ref( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + +#if defined(HAVE_X86) + + int blake2s_init_sse2( blake2s_state *S, size_t outlen ); + int blake2s_init_key_sse2( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_init_param_sse2( blake2s_state *S, const blake2s_param *P ); + int blake2s_update_sse2( blake2s_state *S, const uint8_t *in, size_t inlen ); + int blake2s_final_sse2( blake2s_state *S, uint8_t *out, size_t outlen ); + int blake2s_sse2( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + int blake2s_init_ssse3( blake2s_state *S, size_t outlen ); + int blake2s_init_key_ssse3( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_init_param_ssse3( blake2s_state *S, const blake2s_param *P ); + int blake2s_update_ssse3( blake2s_state *S, const uint8_t *in, size_t inlen ); + int blake2s_final_ssse3( blake2s_state *S, uint8_t *out, size_t outlen ); + int blake2s_ssse3( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + int blake2s_init_sse41( blake2s_state *S, size_t outlen ); + int blake2s_init_key_sse41( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_init_param_sse41( blake2s_state *S, const blake2s_param *P ); + int blake2s_update_sse41( blake2s_state *S, const uint8_t *in, size_t inlen ); + int blake2s_final_sse41( blake2s_state *S, uint8_t *out, size_t outlen ); + int blake2s_sse41( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + int blake2s_init_avx( blake2s_state *S, size_t outlen ); + int blake2s_init_key_avx( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_init_param_avx( blake2s_state *S, const blake2s_param *P ); + int blake2s_update_avx( blake2s_state *S, const uint8_t *in, size_t inlen ); + int blake2s_final_avx( blake2s_state *S, uint8_t *out, size_t outlen ); + int blake2s_avx( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + int blake2s_init_xop( blake2s_state *S, size_t outlen ); + int blake2s_init_key_xop( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_init_param_xop( blake2s_state *S, const blake2s_param *P ); + int blake2s_update_xop( blake2s_state *S, const uint8_t *in, size_t inlen ); + int blake2s_final_xop( blake2s_state *S, uint8_t *out, size_t outlen ); + int blake2s_xop( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + +#endif /* HAVE_X86 */ + +#if defined(__cplusplus) +} +#endif + +typedef int ( *blake2b_init_fn )( blake2b_state *, size_t ); +typedef int ( *blake2b_init_key_fn )( blake2b_state *, size_t, const void *, size_t ); +typedef int ( *blake2b_init_param_fn )( blake2b_state *, const blake2b_param * ); +typedef int ( *blake2b_update_fn )( blake2b_state *, const uint8_t *, size_t ); +typedef int ( *blake2b_final_fn )( blake2b_state *, uint8_t *, size_t ); +typedef int ( *blake2b_fn )( uint8_t *, const void *, const void *, size_t, size_t, size_t ); + +typedef int ( *blake2s_init_fn )( blake2s_state *, size_t ); +typedef int ( *blake2s_init_key_fn )( blake2s_state *, size_t, const void *, size_t ); +typedef int ( *blake2s_init_param_fn )( blake2s_state *, const blake2s_param * ); +typedef int ( *blake2s_update_fn )( blake2s_state *, const uint8_t *, size_t ); +typedef int ( *blake2s_final_fn )( blake2s_state *, uint8_t *, size_t ); +typedef int ( *blake2s_fn )( uint8_t *, const void *, const void *, size_t, size_t, size_t ); + +static const blake2b_init_fn blake2b_init_table[] = +{ + blake2b_init_ref, +#if defined(HAVE_X86) + blake2b_init_sse2, + blake2b_init_ssse3, + blake2b_init_sse41, + blake2b_init_avx, + blake2b_init_xop +#endif +}; + +static const blake2b_init_key_fn blake2b_init_key_table[] = +{ + blake2b_init_key_ref, +#if defined(HAVE_X86) + blake2b_init_key_sse2, + blake2b_init_key_ssse3, + blake2b_init_key_sse41, + blake2b_init_key_avx, + blake2b_init_key_xop +#endif +}; + +static const blake2b_init_param_fn blake2b_init_param_table[] = +{ + blake2b_init_param_ref, +#if defined(HAVE_X86) + blake2b_init_param_sse2, + blake2b_init_param_ssse3, + blake2b_init_param_sse41, + blake2b_init_param_avx, + blake2b_init_param_xop +#endif +}; + +static const blake2b_update_fn blake2b_update_table[] = +{ + blake2b_update_ref, +#if defined(HAVE_X86) + blake2b_update_sse2, + blake2b_update_ssse3, + blake2b_update_sse41, + blake2b_update_avx, + blake2b_update_xop +#endif +}; + +static const blake2b_final_fn blake2b_final_table[] = +{ + blake2b_final_ref, +#if defined(HAVE_X86) + blake2b_final_sse2, + blake2b_final_ssse3, + blake2b_final_sse41, + blake2b_final_avx, + blake2b_final_xop +#endif +}; + +static const blake2b_fn blake2b_table[] = +{ + blake2b_ref, +#if defined(HAVE_X86) + blake2b_sse2, + blake2b_ssse3, + blake2b_sse41, + blake2b_avx, + blake2b_xop +#endif +}; + +static const blake2s_init_fn blake2s_init_table[] = +{ + blake2s_init_ref, +#if defined(HAVE_X86) + blake2s_init_sse2, + blake2s_init_ssse3, + blake2s_init_sse41, + blake2s_init_avx, + blake2s_init_xop +#endif +}; + +static const blake2s_init_key_fn blake2s_init_key_table[] = +{ + blake2s_init_key_ref, +#if defined(HAVE_X86) + blake2s_init_key_sse2, + blake2s_init_key_ssse3, + blake2s_init_key_sse41, + blake2s_init_key_avx, + blake2s_init_key_xop +#endif +}; + +static const blake2s_init_param_fn blake2s_init_param_table[] = +{ + blake2s_init_param_ref, +#if defined(HAVE_X86) + blake2s_init_param_sse2, + blake2s_init_param_ssse3, + blake2s_init_param_sse41, + blake2s_init_param_avx, + blake2s_init_param_xop +#endif +}; + +static const blake2s_update_fn blake2s_update_table[] = +{ + blake2s_update_ref, +#if defined(HAVE_X86) + blake2s_update_sse2, + blake2s_update_ssse3, + blake2s_update_sse41, + blake2s_update_avx, + blake2s_update_xop +#endif +}; + +static const blake2s_final_fn blake2s_final_table[] = +{ + blake2s_final_ref, +#if defined(HAVE_X86) + blake2s_final_sse2, + blake2s_final_ssse3, + blake2s_final_sse41, + blake2s_final_avx, + blake2s_final_xop +#endif +}; + +static const blake2s_fn blake2s_table[] = +{ + blake2s_ref, +#if defined(HAVE_X86) + blake2s_sse2, + blake2s_ssse3, + blake2s_sse41, + blake2s_avx, + blake2s_xop +#endif +}; + +#if defined(__cplusplus) +extern "C" { +#endif + int blake2b_init_dispatch( blake2b_state *S, size_t outlen ); + int blake2b_init_key_dispatch( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_init_param_dispatch( blake2b_state *S, const blake2b_param *P ); + int blake2b_update_dispatch( blake2b_state *S, const uint8_t *in, size_t inlen ); + int blake2b_final_dispatch( blake2b_state *S, uint8_t *out, size_t outlen ); + int blake2b_dispatch( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + int blake2s_init_dispatch( blake2s_state *S, size_t outlen ); + int blake2s_init_key_dispatch( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_init_param_dispatch( blake2s_state *S, const blake2s_param *P ); + int blake2s_update_dispatch( blake2s_state *S, const uint8_t *in, size_t inlen ); + int blake2s_final_dispatch( blake2s_state *S, uint8_t *out, size_t outlen ); + int blake2s_dispatch( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); +#if defined(__cplusplus) +} +#endif + +static blake2b_init_fn blake2b_init_ptr = blake2b_init_dispatch; +static blake2b_init_key_fn blake2b_init_key_ptr = blake2b_init_key_dispatch; +static blake2b_init_param_fn blake2b_init_param_ptr = blake2b_init_param_dispatch; +static blake2b_update_fn blake2b_update_ptr = blake2b_update_dispatch; +static blake2b_final_fn blake2b_final_ptr = blake2b_final_dispatch; +static blake2b_fn blake2b_ptr = blake2b_dispatch; + +static blake2s_init_fn blake2s_init_ptr = blake2s_init_dispatch; +static blake2s_init_key_fn blake2s_init_key_ptr = blake2s_init_key_dispatch; +static blake2s_init_param_fn blake2s_init_param_ptr = blake2s_init_param_dispatch; +static blake2s_update_fn blake2s_update_ptr = blake2s_update_dispatch; +static blake2s_final_fn blake2s_final_ptr = blake2s_final_dispatch; +static blake2s_fn blake2s_ptr = blake2s_dispatch; + +int blake2b_init_dispatch( blake2b_state *S, size_t outlen ) +{ + blake2b_init_ptr = blake2b_init_table[get_cpu_features()]; + return blake2b_init_ptr( S, outlen ); +} + +int blake2b_init_key_dispatch( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) +{ + blake2b_init_key_ptr = blake2b_init_key_table[get_cpu_features()]; + return blake2b_init_key_ptr( S, outlen, key, keylen ); +} + +int blake2b_init_param_dispatch( blake2b_state *S, const blake2b_param *P ) +{ + blake2b_init_param_ptr = blake2b_init_param_table[get_cpu_features()]; + return blake2b_init_param_ptr( S, P ); +} + +int blake2b_update_dispatch( blake2b_state *S, const uint8_t *in, size_t inlen ) +{ + blake2b_update_ptr = blake2b_update_table[get_cpu_features()]; + return blake2b_update_ptr( S, in, inlen ); +} + +int blake2b_final_dispatch( blake2b_state *S, uint8_t *out, size_t outlen ) +{ + blake2b_final_ptr = blake2b_final_table[get_cpu_features()]; + return blake2b_final_ptr( S, out, outlen ); +} + +int blake2b_dispatch( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) +{ + blake2b_ptr = blake2b_table[get_cpu_features()]; + return blake2b_ptr( out, in, key, outlen, inlen, keylen ); +} + +BLAKE2_API int blake2b_init( blake2b_state *S, size_t outlen ) +{ + return blake2b_init_ptr( S, outlen ); +} + +BLAKE2_API int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) +{ + return blake2b_init_key_ptr( S, outlen, key, keylen ); +} + +BLAKE2_API int blake2b_init_param( blake2b_state *S, const blake2b_param *P ) +{ + return blake2b_init_param_ptr( S, P ); +} + +BLAKE2_API int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen ) +{ + return blake2b_update_ptr( S, in, inlen ); +} + +BLAKE2_API int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen ) +{ + return blake2b_final_ptr( S, out, outlen ); +} + +BLAKE2_API int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) +{ + return blake2b_ptr( out, in, key, outlen, inlen, keylen ); +} + +int blake2s_init_dispatch( blake2s_state *S, size_t outlen ) +{ + blake2s_init_ptr = blake2s_init_table[get_cpu_features()]; + return blake2s_init_ptr( S, outlen ); +} + +int blake2s_init_key_dispatch( blake2s_state *S, size_t outlen, const void *key, size_t keylen ) +{ + blake2s_init_key_ptr = blake2s_init_key_table[get_cpu_features()]; + return blake2s_init_key_ptr( S, outlen, key, keylen ); +} + +int blake2s_init_param_dispatch( blake2s_state *S, const blake2s_param *P ) +{ + blake2s_init_param_ptr = blake2s_init_param_table[get_cpu_features()]; + return blake2s_init_param_ptr( S, P ); +} + +int blake2s_update_dispatch( blake2s_state *S, const uint8_t *in, size_t inlen ) +{ + blake2s_update_ptr = blake2s_update_table[get_cpu_features()]; + return blake2s_update_ptr( S, in, inlen ); +} + +int blake2s_final_dispatch( blake2s_state *S, uint8_t *out, size_t outlen ) +{ + blake2s_final_ptr = blake2s_final_table[get_cpu_features()]; + return blake2s_final_ptr( S, out, outlen ); +} + +int blake2s_dispatch( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) +{ + blake2s_ptr = blake2s_table[get_cpu_features()]; + return blake2s_ptr( out, in, key, outlen, inlen, keylen ); +} + +BLAKE2_API int blake2s_init( blake2s_state *S, size_t outlen ) +{ + return blake2s_init_ptr( S, outlen ); +} + +BLAKE2_API int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ) +{ + return blake2s_init_key_ptr( S, outlen, key, keylen ); +} + +BLAKE2_API int blake2s_init_param( blake2s_state *S, const blake2s_param *P ) +{ + return blake2s_init_param_ptr( S, P ); +} + +BLAKE2_API int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen ) +{ + return blake2s_update_ptr( S, in, inlen ); +} + +BLAKE2_API int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen ) +{ + return blake2s_final_ptr( S, out, outlen ); +} + +BLAKE2_API int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) +{ + return blake2s_ptr( out, in, key, outlen, inlen, keylen ); +} + diff --git a/Modules/_blake2/impl/blake2-impl.h b/Modules/_blake2/impl/blake2-impl.h index bbe3c0f1cfcf..5bebd83a2b7d 100644 --- a/Modules/_blake2/impl/blake2-impl.h +++ b/Modules/_blake2/impl/blake2-impl.h @@ -1,32 +1,39 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2_IMPL_H__ #define __BLAKE2_IMPL_H__ +#if defined(_WIN32) || defined(WIN32) +#include +#endif + +#include #include #include -BLAKE2_LOCAL_INLINE(uint32_t) load32( const void *src ) +#define BLAKE2_IMPL_CAT(x,y) x ## y +#define BLAKE2_IMPL_EVAL(x,y) BLAKE2_IMPL_CAT(x,y) +#define BLAKE2_IMPL_NAME(fun) BLAKE2_IMPL_EVAL(fun, SUFFIX) + +static inline uint32_t load32( const void *src ) { #if defined(NATIVE_LITTLE_ENDIAN) uint32_t w; - memcpy(&w, src, sizeof w); + memcpy( &w, src, sizeof( w ) ); return w; #else - const uint8_t *p = ( const uint8_t * )src; + const uint8_t *p = ( uint8_t * )src; uint32_t w = *p++; w |= ( uint32_t )( *p++ ) << 8; w |= ( uint32_t )( *p++ ) << 16; @@ -35,14 +42,14 @@ BLAKE2_LOCAL_INLINE(uint32_t) load32( const void *src ) #endif } -BLAKE2_LOCAL_INLINE(uint64_t) load64( const void *src ) +static inline uint64_t load64( const void *src ) { #if defined(NATIVE_LITTLE_ENDIAN) uint64_t w; - memcpy(&w, src, sizeof w); + memcpy( &w, src, sizeof( w ) ); return w; #else - const uint8_t *p = ( const uint8_t * )src; + const uint8_t *p = ( uint8_t * )src; uint64_t w = *p++; w |= ( uint64_t )( *p++ ) << 8; w |= ( uint64_t )( *p++ ) << 16; @@ -55,10 +62,10 @@ BLAKE2_LOCAL_INLINE(uint64_t) load64( const void *src ) #endif } -BLAKE2_LOCAL_INLINE(void) store32( void *dst, uint32_t w ) +static inline void store32( void *dst, uint32_t w ) { #if defined(NATIVE_LITTLE_ENDIAN) - memcpy(dst, &w, sizeof w); + memcpy( dst, &w, sizeof( w ) ); #else uint8_t *p = ( uint8_t * )dst; *p++ = ( uint8_t )w; w >>= 8; @@ -68,10 +75,10 @@ BLAKE2_LOCAL_INLINE(void) store32( void *dst, uint32_t w ) #endif } -BLAKE2_LOCAL_INLINE(void) store64( void *dst, uint64_t w ) +static inline void store64( void *dst, uint64_t w ) { #if defined(NATIVE_LITTLE_ENDIAN) - memcpy(dst, &w, sizeof w); + memcpy( dst, &w, sizeof( w ) ); #else uint8_t *p = ( uint8_t * )dst; *p++ = ( uint8_t )w; w >>= 8; @@ -85,7 +92,7 @@ BLAKE2_LOCAL_INLINE(void) store64( void *dst, uint64_t w ) #endif } -BLAKE2_LOCAL_INLINE(uint64_t) load48( const void *src ) +static inline uint64_t load48( const void *src ) { const uint8_t *p = ( const uint8_t * )src; uint64_t w = *p++; @@ -97,7 +104,7 @@ BLAKE2_LOCAL_INLINE(uint64_t) load48( const void *src ) return w; } -BLAKE2_LOCAL_INLINE(void) store48( void *dst, uint64_t w ) +static inline void store48( void *dst, uint64_t w ) { uint8_t *p = ( uint8_t * )dst; *p++ = ( uint8_t )w; w >>= 8; @@ -108,31 +115,44 @@ BLAKE2_LOCAL_INLINE(void) store48( void *dst, uint64_t w ) *p++ = ( uint8_t )w; } -BLAKE2_LOCAL_INLINE(uint32_t) rotl32( const uint32_t w, const unsigned c ) +static inline uint32_t rotl32( const uint32_t w, const unsigned c ) { return ( w << c ) | ( w >> ( 32 - c ) ); } -BLAKE2_LOCAL_INLINE(uint64_t) rotl64( const uint64_t w, const unsigned c ) +static inline uint64_t rotl64( const uint64_t w, const unsigned c ) { return ( w << c ) | ( w >> ( 64 - c ) ); } -BLAKE2_LOCAL_INLINE(uint32_t) rotr32( const uint32_t w, const unsigned c ) +static inline uint32_t rotr32( const uint32_t w, const unsigned c ) { return ( w >> c ) | ( w << ( 32 - c ) ); } -BLAKE2_LOCAL_INLINE(uint64_t) rotr64( const uint64_t w, const unsigned c ) +static inline uint64_t rotr64( const uint64_t w, const unsigned c ) { return ( w >> c ) | ( w << ( 64 - c ) ); } /* prevents compiler optimizing out memset() */ -BLAKE2_LOCAL_INLINE(void) secure_zero_memory(void *v, size_t n) +static inline void secure_zero_memory(void *v, size_t n) { - static void *(*const volatile memset_v)(void *, int, size_t) = &memset; - memset_v(v, 0, n); +#if defined(_WIN32) || defined(WIN32) + SecureZeroMemory(v, n); +#else +// prioritize first the general C11 call +#if defined(HAVE_MEMSET_S) + memset_s(v, n, 0, n); +#elif defined(HAVE_EXPLICIT_BZERO) + explicit_bzero(v, n); +#elif defined(HAVE_EXPLICIT_MEMSET) + explicit_memset(v, 0, n); +#else + memset(v, 0, n); + __asm__ __volatile__("" :: "r"(v) : "memory"); +#endif +#endif } #endif diff --git a/Modules/_blake2/impl/blake2-kat.h b/Modules/_blake2/impl/blake2-kat.h new file mode 100644 index 000000000000..3d2072763aa9 --- /dev/null +++ b/Modules/_blake2/impl/blake2-kat.h @@ -0,0 +1,16467 @@ +/* + BLAKE2 reference source code package - optimized C implementations + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . +*/ +#pragma once +#ifndef __BLAKE2_KAT_H__ +#define __BLAKE2_KAT_H__ + + +#include + +#define KAT_LENGTH 256 + + + +static const uint8_t blake2s_kat[KAT_LENGTH][BLAKE2S_OUTBYTES] = +{ + { + 0x69, 0x21, 0x7A, 0x30, 0x79, 0x90, 0x80, 0x94, + 0xE1, 0x11, 0x21, 0xD0, 0x42, 0x35, 0x4A, 0x7C, + 0x1F, 0x55, 0xB6, 0x48, 0x2C, 0xA1, 0xA5, 0x1E, + 0x1B, 0x25, 0x0D, 0xFD, 0x1E, 0xD0, 0xEE, 0xF9 + }, + { + 0xE3, 0x4D, 0x74, 0xDB, 0xAF, 0x4F, 0xF4, 0xC6, + 0xAB, 0xD8, 0x71, 0xCC, 0x22, 0x04, 0x51, 0xD2, + 0xEA, 0x26, 0x48, 0x84, 0x6C, 0x77, 0x57, 0xFB, + 0xAA, 0xC8, 0x2F, 0xE5, 0x1A, 0xD6, 0x4B, 0xEA + }, + { + 0xDD, 0xAD, 0x9A, 0xB1, 0x5D, 0xAC, 0x45, 0x49, + 0xBA, 0x42, 0xF4, 0x9D, 0x26, 0x24, 0x96, 0xBE, + 0xF6, 0xC0, 0xBA, 0xE1, 0xDD, 0x34, 0x2A, 0x88, + 0x08, 0xF8, 0xEA, 0x26, 0x7C, 0x6E, 0x21, 0x0C + }, + { + 0xE8, 0xF9, 0x1C, 0x6E, 0xF2, 0x32, 0xA0, 0x41, + 0x45, 0x2A, 0xB0, 0xE1, 0x49, 0x07, 0x0C, 0xDD, + 0x7D, 0xD1, 0x76, 0x9E, 0x75, 0xB3, 0xA5, 0x92, + 0x1B, 0xE3, 0x78, 0x76, 0xC4, 0x5C, 0x99, 0x00 + }, + { + 0x0C, 0xC7, 0x0E, 0x00, 0x34, 0x8B, 0x86, 0xBA, + 0x29, 0x44, 0xD0, 0xC3, 0x20, 0x38, 0xB2, 0x5C, + 0x55, 0x58, 0x4F, 0x90, 0xDF, 0x23, 0x04, 0xF5, + 0x5F, 0xA3, 0x32, 0xAF, 0x5F, 0xB0, 0x1E, 0x20 + }, + { + 0xEC, 0x19, 0x64, 0x19, 0x10, 0x87, 0xA4, 0xFE, + 0x9D, 0xF1, 0xC7, 0x95, 0x34, 0x2A, 0x02, 0xFF, + 0xC1, 0x91, 0xA5, 0xB2, 0x51, 0x76, 0x48, 0x56, + 0xAE, 0x5B, 0x8B, 0x57, 0x69, 0xF0, 0xC6, 0xCD + }, + { + 0xE1, 0xFA, 0x51, 0x61, 0x8D, 0x7D, 0xF4, 0xEB, + 0x70, 0xCF, 0x0D, 0x5A, 0x9E, 0x90, 0x6F, 0x80, + 0x6E, 0x9D, 0x19, 0xF7, 0xF4, 0xF0, 0x1E, 0x3B, + 0x62, 0x12, 0x88, 0xE4, 0x12, 0x04, 0x05, 0xD6 + }, + { + 0x59, 0x80, 0x01, 0xFA, 0xFB, 0xE8, 0xF9, 0x4E, + 0xC6, 0x6D, 0xC8, 0x27, 0xD0, 0x12, 0xCF, 0xCB, + 0xBA, 0x22, 0x28, 0x56, 0x9F, 0x44, 0x8E, 0x89, + 0xEA, 0x22, 0x08, 0xC8, 0xBF, 0x76, 0x92, 0x93 + }, + { + 0xC7, 0xE8, 0x87, 0xB5, 0x46, 0x62, 0x36, 0x35, + 0xE9, 0x3E, 0x04, 0x95, 0x59, 0x8F, 0x17, 0x26, + 0x82, 0x19, 0x96, 0xC2, 0x37, 0x77, 0x05, 0xB9, + 0x3A, 0x1F, 0x63, 0x6F, 0x87, 0x2B, 0xFA, 0x2D + }, + { + 0xC3, 0x15, 0xA4, 0x37, 0xDD, 0x28, 0x06, 0x2A, + 0x77, 0x0D, 0x48, 0x19, 0x67, 0x13, 0x6B, 0x1B, + 0x5E, 0xB8, 0x8B, 0x21, 0xEE, 0x53, 0xD0, 0x32, + 0x9C, 0x58, 0x97, 0x12, 0x6E, 0x9D, 0xB0, 0x2C + }, + { + 0xBB, 0x47, 0x3D, 0xED, 0xDC, 0x05, 0x5F, 0xEA, + 0x62, 0x28, 0xF2, 0x07, 0xDA, 0x57, 0x53, 0x47, + 0xBB, 0x00, 0x40, 0x4C, 0xD3, 0x49, 0xD3, 0x8C, + 0x18, 0x02, 0x63, 0x07, 0xA2, 0x24, 0xCB, 0xFF + }, + { + 0x68, 0x7E, 0x18, 0x73, 0xA8, 0x27, 0x75, 0x91, + 0xBB, 0x33, 0xD9, 0xAD, 0xF9, 0xA1, 0x39, 0x12, + 0xEF, 0xEF, 0xE5, 0x57, 0xCA, 0xFC, 0x39, 0xA7, + 0x95, 0x26, 0x23, 0xE4, 0x72, 0x55, 0xF1, 0x6D + }, + { + 0x1A, 0xC7, 0xBA, 0x75, 0x4D, 0x6E, 0x2F, 0x94, + 0xE0, 0xE8, 0x6C, 0x46, 0xBF, 0xB2, 0x62, 0xAB, + 0xBB, 0x74, 0xF4, 0x50, 0xEF, 0x45, 0x6D, 0x6B, + 0x4D, 0x97, 0xAA, 0x80, 0xCE, 0x6D, 0xA7, 0x67 + }, + { + 0x01, 0x2C, 0x97, 0x80, 0x96, 0x14, 0x81, 0x6B, + 0x5D, 0x94, 0x94, 0x47, 0x7D, 0x4B, 0x68, 0x7D, + 0x15, 0xB9, 0x6E, 0xB6, 0x9C, 0x0E, 0x80, 0x74, + 0xA8, 0x51, 0x6F, 0x31, 0x22, 0x4B, 0x5C, 0x98 + }, + { + 0x91, 0xFF, 0xD2, 0x6C, 0xFA, 0x4D, 0xA5, 0x13, + 0x4C, 0x7E, 0xA2, 0x62, 0xF7, 0x88, 0x9C, 0x32, + 0x9F, 0x61, 0xF6, 0xA6, 0x57, 0x22, 0x5C, 0xC2, + 0x12, 0xF4, 0x00, 0x56, 0xD9, 0x86, 0xB3, 0xF4 + }, + { + 0xD9, 0x7C, 0x82, 0x8D, 0x81, 0x82, 0xA7, 0x21, + 0x80, 0xA0, 0x6A, 0x78, 0x26, 0x83, 0x30, 0x67, + 0x3F, 0x7C, 0x4E, 0x06, 0x35, 0x94, 0x7C, 0x04, + 0xC0, 0x23, 0x23, 0xFD, 0x45, 0xC0, 0xA5, 0x2D + }, + { + 0xEF, 0xC0, 0x4C, 0xDC, 0x39, 0x1C, 0x7E, 0x91, + 0x19, 0xBD, 0x38, 0x66, 0x8A, 0x53, 0x4E, 0x65, + 0xFE, 0x31, 0x03, 0x6D, 0x6A, 0x62, 0x11, 0x2E, + 0x44, 0xEB, 0xEB, 0x11, 0xF9, 0xC5, 0x70, 0x80 + }, + { + 0x99, 0x2C, 0xF5, 0xC0, 0x53, 0x44, 0x2A, 0x5F, + 0xBC, 0x4F, 0xAF, 0x58, 0x3E, 0x04, 0xE5, 0x0B, + 0xB7, 0x0D, 0x2F, 0x39, 0xFB, 0xB6, 0xA5, 0x03, + 0xF8, 0x9E, 0x56, 0xA6, 0x3E, 0x18, 0x57, 0x8A + }, + { + 0x38, 0x64, 0x0E, 0x9F, 0x21, 0x98, 0x3E, 0x67, + 0xB5, 0x39, 0xCA, 0xCC, 0xAE, 0x5E, 0xCF, 0x61, + 0x5A, 0xE2, 0x76, 0x4F, 0x75, 0xA0, 0x9C, 0x9C, + 0x59, 0xB7, 0x64, 0x83, 0xC1, 0xFB, 0xC7, 0x35 + }, + { + 0x21, 0x3D, 0xD3, 0x4C, 0x7E, 0xFE, 0x4F, 0xB2, + 0x7A, 0x6B, 0x35, 0xF6, 0xB4, 0x00, 0x0D, 0x1F, + 0xE0, 0x32, 0x81, 0xAF, 0x3C, 0x72, 0x3E, 0x5C, + 0x9F, 0x94, 0x74, 0x7A, 0x5F, 0x31, 0xCD, 0x3B + }, + { + 0xEC, 0x24, 0x6E, 0xEE, 0xB9, 0xCE, 0xD3, 0xF7, + 0xAD, 0x33, 0xED, 0x28, 0x66, 0x0D, 0xD9, 0xBB, + 0x07, 0x32, 0x51, 0x3D, 0xB4, 0xE2, 0xFA, 0x27, + 0x8B, 0x60, 0xCD, 0xE3, 0x68, 0x2A, 0x4C, 0xCD + }, + { + 0xAC, 0x9B, 0x61, 0xD4, 0x46, 0x64, 0x8C, 0x30, + 0x05, 0xD7, 0x89, 0x2B, 0xF3, 0xA8, 0x71, 0x9F, + 0x4C, 0x81, 0x81, 0xCF, 0xDC, 0xBC, 0x2B, 0x79, + 0xFE, 0xF1, 0x0A, 0x27, 0x9B, 0x91, 0x10, 0x95 + }, + { + 0x7B, 0xF8, 0xB2, 0x29, 0x59, 0xE3, 0x4E, 0x3A, + 0x43, 0xF7, 0x07, 0x92, 0x23, 0xE8, 0x3A, 0x97, + 0x54, 0x61, 0x7D, 0x39, 0x1E, 0x21, 0x3D, 0xFD, + 0x80, 0x8E, 0x41, 0xB9, 0xBE, 0xAD, 0x4C, 0xE7 + }, + { + 0x68, 0xD4, 0xB5, 0xD4, 0xFA, 0x0E, 0x30, 0x2B, + 0x64, 0xCC, 0xC5, 0xAF, 0x79, 0x29, 0x13, 0xAC, + 0x4C, 0x88, 0xEC, 0x95, 0xC0, 0x7D, 0xDF, 0x40, + 0x69, 0x42, 0x56, 0xEB, 0x88, 0xCE, 0x9F, 0x3D + }, + { + 0xB2, 0xC2, 0x42, 0x0F, 0x05, 0xF9, 0xAB, 0xE3, + 0x63, 0x15, 0x91, 0x93, 0x36, 0xB3, 0x7E, 0x4E, + 0x0F, 0xA3, 0x3F, 0xF7, 0xE7, 0x6A, 0x49, 0x27, + 0x67, 0x00, 0x6F, 0xDB, 0x5D, 0x93, 0x54, 0x62 + }, + { + 0x13, 0x4F, 0x61, 0xBB, 0xD0, 0xBB, 0xB6, 0x9A, + 0xED, 0x53, 0x43, 0x90, 0x45, 0x51, 0xA3, 0xE6, + 0xC1, 0xAA, 0x7D, 0xCD, 0xD7, 0x7E, 0x90, 0x3E, + 0x70, 0x23, 0xEB, 0x7C, 0x60, 0x32, 0x0A, 0xA7 + }, + { + 0x46, 0x93, 0xF9, 0xBF, 0xF7, 0xD4, 0xF3, 0x98, + 0x6A, 0x7D, 0x17, 0x6E, 0x6E, 0x06, 0xF7, 0x2A, + 0xD1, 0x49, 0x0D, 0x80, 0x5C, 0x99, 0xE2, 0x53, + 0x47, 0xB8, 0xDE, 0x77, 0xB4, 0xDB, 0x6D, 0x9B + }, + { + 0x85, 0x3E, 0x26, 0xF7, 0x41, 0x95, 0x3B, 0x0F, + 0xD5, 0xBD, 0xB4, 0x24, 0xE8, 0xAB, 0x9E, 0x8B, + 0x37, 0x50, 0xEA, 0xA8, 0xEF, 0x61, 0xE4, 0x79, + 0x02, 0xC9, 0x1E, 0x55, 0x4E, 0x9C, 0x73, 0xB9 + }, + { + 0xF7, 0xDE, 0x53, 0x63, 0x61, 0xAB, 0xAA, 0x0E, + 0x15, 0x81, 0x56, 0xCF, 0x0E, 0xA4, 0xF6, 0x3A, + 0x99, 0xB5, 0xE4, 0x05, 0x4F, 0x8F, 0xA4, 0xC9, + 0xD4, 0x5F, 0x62, 0x85, 0xCA, 0xD5, 0x56, 0x94 + }, + { + 0x4C, 0x23, 0x06, 0x08, 0x86, 0x0A, 0x99, 0xAE, + 0x8D, 0x7B, 0xD5, 0xC2, 0xCC, 0x17, 0xFA, 0x52, + 0x09, 0x6B, 0x9A, 0x61, 0xBE, 0xDB, 0x17, 0xCB, + 0x76, 0x17, 0x86, 0x4A, 0xD2, 0x9C, 0xA7, 0xA6 + }, + { + 0xAE, 0xB9, 0x20, 0xEA, 0x87, 0x95, 0x2D, 0xAD, + 0xB1, 0xFB, 0x75, 0x92, 0x91, 0xE3, 0x38, 0x81, + 0x39, 0xA8, 0x72, 0x86, 0x50, 0x01, 0x88, 0x6E, + 0xD8, 0x47, 0x52, 0xE9, 0x3C, 0x25, 0x0C, 0x2A + }, + { + 0xAB, 0xA4, 0xAD, 0x9B, 0x48, 0x0B, 0x9D, 0xF3, + 0xD0, 0x8C, 0xA5, 0xE8, 0x7B, 0x0C, 0x24, 0x40, + 0xD4, 0xE4, 0xEA, 0x21, 0x22, 0x4C, 0x2E, 0xB4, + 0x2C, 0xBA, 0xE4, 0x69, 0xD0, 0x89, 0xB9, 0x31 + }, + { + 0x05, 0x82, 0x56, 0x07, 0xD7, 0xFD, 0xF2, 0xD8, + 0x2E, 0xF4, 0xC3, 0xC8, 0xC2, 0xAE, 0xA9, 0x61, + 0xAD, 0x98, 0xD6, 0x0E, 0xDF, 0xF7, 0xD0, 0x18, + 0x98, 0x3E, 0x21, 0x20, 0x4C, 0x0D, 0x93, 0xD1 + }, + { + 0xA7, 0x42, 0xF8, 0xB6, 0xAF, 0x82, 0xD8, 0xA6, + 0xCA, 0x23, 0x57, 0xC5, 0xF1, 0xCF, 0x91, 0xDE, + 0xFB, 0xD0, 0x66, 0x26, 0x7D, 0x75, 0xC0, 0x48, + 0xB3, 0x52, 0x36, 0x65, 0x85, 0x02, 0x59, 0x62 + }, + { + 0x2B, 0xCA, 0xC8, 0x95, 0x99, 0x00, 0x0B, 0x42, + 0xC9, 0x5A, 0xE2, 0x38, 0x35, 0xA7, 0x13, 0x70, + 0x4E, 0xD7, 0x97, 0x89, 0xC8, 0x4F, 0xEF, 0x14, + 0x9A, 0x87, 0x4F, 0xF7, 0x33, 0xF0, 0x17, 0xA2 + }, + { + 0xAC, 0x1E, 0xD0, 0x7D, 0x04, 0x8F, 0x10, 0x5A, + 0x9E, 0x5B, 0x7A, 0xB8, 0x5B, 0x09, 0xA4, 0x92, + 0xD5, 0xBA, 0xFF, 0x14, 0xB8, 0xBF, 0xB0, 0xE9, + 0xFD, 0x78, 0x94, 0x86, 0xEE, 0xA2, 0xB9, 0x74 + }, + { + 0xE4, 0x8D, 0x0E, 0xCF, 0xAF, 0x49, 0x7D, 0x5B, + 0x27, 0xC2, 0x5D, 0x99, 0xE1, 0x56, 0xCB, 0x05, + 0x79, 0xD4, 0x40, 0xD6, 0xE3, 0x1F, 0xB6, 0x24, + 0x73, 0x69, 0x6D, 0xBF, 0x95, 0xE0, 0x10, 0xE4 + }, + { + 0x12, 0xA9, 0x1F, 0xAD, 0xF8, 0xB2, 0x16, 0x44, + 0xFD, 0x0F, 0x93, 0x4F, 0x3C, 0x4A, 0x8F, 0x62, + 0xBA, 0x86, 0x2F, 0xFD, 0x20, 0xE8, 0xE9, 0x61, + 0x15, 0x4C, 0x15, 0xC1, 0x38, 0x84, 0xED, 0x3D + }, + { + 0x7C, 0xBE, 0xE9, 0x6E, 0x13, 0x98, 0x97, 0xDC, + 0x98, 0xFB, 0xEF, 0x3B, 0xE8, 0x1A, 0xD4, 0xD9, + 0x64, 0xD2, 0x35, 0xCB, 0x12, 0x14, 0x1F, 0xB6, + 0x67, 0x27, 0xE6, 0xE5, 0xDF, 0x73, 0xA8, 0x78 + }, + { + 0xEB, 0xF6, 0x6A, 0xBB, 0x59, 0x7A, 0xE5, 0x72, + 0xA7, 0x29, 0x7C, 0xB0, 0x87, 0x1E, 0x35, 0x5A, + 0xCC, 0xAF, 0xAD, 0x83, 0x77, 0xB8, 0xE7, 0x8B, + 0xF1, 0x64, 0xCE, 0x2A, 0x18, 0xDE, 0x4B, 0xAF + }, + { + 0x71, 0xB9, 0x33, 0xB0, 0x7E, 0x4F, 0xF7, 0x81, + 0x8C, 0xE0, 0x59, 0xD0, 0x08, 0x82, 0x9E, 0x45, + 0x3C, 0x6F, 0xF0, 0x2E, 0xC0, 0xA7, 0xDB, 0x39, + 0x3F, 0xC2, 0xD8, 0x70, 0xF3, 0x7A, 0x72, 0x86 + }, + { + 0x7C, 0xF7, 0xC5, 0x13, 0x31, 0x22, 0x0B, 0x8D, + 0x3E, 0xBA, 0xED, 0x9C, 0x29, 0x39, 0x8A, 0x16, + 0xD9, 0x81, 0x56, 0xE2, 0x61, 0x3C, 0xB0, 0x88, + 0xF2, 0xB0, 0xE0, 0x8A, 0x1B, 0xE4, 0xCF, 0x4F + }, + { + 0x3E, 0x41, 0xA1, 0x08, 0xE0, 0xF6, 0x4A, 0xD2, + 0x76, 0xB9, 0x79, 0xE1, 0xCE, 0x06, 0x82, 0x79, + 0xE1, 0x6F, 0x7B, 0xC7, 0xE4, 0xAA, 0x1D, 0x21, + 0x1E, 0x17, 0xB8, 0x11, 0x61, 0xDF, 0x16, 0x02 + }, + { + 0x88, 0x65, 0x02, 0xA8, 0x2A, 0xB4, 0x7B, 0xA8, + 0xD8, 0x67, 0x10, 0xAA, 0x9D, 0xE3, 0xD4, 0x6E, + 0xA6, 0x5C, 0x47, 0xAF, 0x6E, 0xE8, 0xDE, 0x45, + 0x0C, 0xCE, 0xB8, 0xB1, 0x1B, 0x04, 0x5F, 0x50 + }, + { + 0xC0, 0x21, 0xBC, 0x5F, 0x09, 0x54, 0xFE, 0xE9, + 0x4F, 0x46, 0xEA, 0x09, 0x48, 0x7E, 0x10, 0xA8, + 0x48, 0x40, 0xD0, 0x2F, 0x64, 0x81, 0x0B, 0xC0, + 0x8D, 0x9E, 0x55, 0x1F, 0x7D, 0x41, 0x68, 0x14 + }, + { + 0x20, 0x30, 0x51, 0x6E, 0x8A, 0x5F, 0xE1, 0x9A, + 0xE7, 0x9C, 0x33, 0x6F, 0xCE, 0x26, 0x38, 0x2A, + 0x74, 0x9D, 0x3F, 0xD0, 0xEC, 0x91, 0xE5, 0x37, + 0xD4, 0xBD, 0x23, 0x58, 0xC1, 0x2D, 0xFB, 0x22 + }, + { + 0x55, 0x66, 0x98, 0xDA, 0xC8, 0x31, 0x7F, 0xD3, + 0x6D, 0xFB, 0xDF, 0x25, 0xA7, 0x9C, 0xB1, 0x12, + 0xD5, 0x42, 0x58, 0x60, 0x60, 0x5C, 0xBA, 0xF5, + 0x07, 0xF2, 0x3B, 0xF7, 0xE9, 0xF4, 0x2A, 0xFE + }, + { + 0x2F, 0x86, 0x7B, 0xA6, 0x77, 0x73, 0xFD, 0xC3, + 0xE9, 0x2F, 0xCE, 0xD9, 0x9A, 0x64, 0x09, 0xAD, + 0x39, 0xD0, 0xB8, 0x80, 0xFD, 0xE8, 0xF1, 0x09, + 0xA8, 0x17, 0x30, 0xC4, 0x45, 0x1D, 0x01, 0x78 + }, + { + 0x17, 0x2E, 0xC2, 0x18, 0xF1, 0x19, 0xDF, 0xAE, + 0x98, 0x89, 0x6D, 0xFF, 0x29, 0xDD, 0x98, 0x76, + 0xC9, 0x4A, 0xF8, 0x74, 0x17, 0xF9, 0xAE, 0x4C, + 0x70, 0x14, 0xBB, 0x4E, 0x4B, 0x96, 0xAF, 0xC7 + }, + { + 0x3F, 0x85, 0x81, 0x4A, 0x18, 0x19, 0x5F, 0x87, + 0x9A, 0xA9, 0x62, 0xF9, 0x5D, 0x26, 0xBD, 0x82, + 0xA2, 0x78, 0xF2, 0xB8, 0x23, 0x20, 0x21, 0x8F, + 0x6B, 0x3B, 0xD6, 0xF7, 0xF6, 0x67, 0xA6, 0xD9 + }, + { + 0x1B, 0x61, 0x8F, 0xBA, 0xA5, 0x66, 0xB3, 0xD4, + 0x98, 0xC1, 0x2E, 0x98, 0x2C, 0x9E, 0xC5, 0x2E, + 0x4D, 0xA8, 0x5A, 0x8C, 0x54, 0xF3, 0x8F, 0x34, + 0xC0, 0x90, 0x39, 0x4F, 0x23, 0xC1, 0x84, 0xC1 + }, + { + 0x0C, 0x75, 0x8F, 0xB5, 0x69, 0x2F, 0xFD, 0x41, + 0xA3, 0x57, 0x5D, 0x0A, 0xF0, 0x0C, 0xC7, 0xFB, + 0xF2, 0xCB, 0xE5, 0x90, 0x5A, 0x58, 0x32, 0x3A, + 0x88, 0xAE, 0x42, 0x44, 0xF6, 0xE4, 0xC9, 0x93 + }, + { + 0xA9, 0x31, 0x36, 0x0C, 0xAD, 0x62, 0x8C, 0x7F, + 0x12, 0xA6, 0xC1, 0xC4, 0xB7, 0x53, 0xB0, 0xF4, + 0x06, 0x2A, 0xEF, 0x3C, 0xE6, 0x5A, 0x1A, 0xE3, + 0xF1, 0x93, 0x69, 0xDA, 0xDF, 0x3A, 0xE2, 0x3D + }, + { + 0xCB, 0xAC, 0x7D, 0x77, 0x3B, 0x1E, 0x3B, 0x3C, + 0x66, 0x91, 0xD7, 0xAB, 0xB7, 0xE9, 0xDF, 0x04, + 0x5C, 0x8B, 0xA1, 0x92, 0x68, 0xDE, 0xD1, 0x53, + 0x20, 0x7F, 0x5E, 0x80, 0x43, 0x52, 0xEC, 0x5D + }, + { + 0x23, 0xA1, 0x96, 0xD3, 0x80, 0x2E, 0xD3, 0xC1, + 0xB3, 0x84, 0x01, 0x9A, 0x82, 0x32, 0x58, 0x40, + 0xD3, 0x2F, 0x71, 0x95, 0x0C, 0x45, 0x80, 0xB0, + 0x34, 0x45, 0xE0, 0x89, 0x8E, 0x14, 0x05, 0x3C + }, + { + 0xF4, 0x49, 0x54, 0x70, 0xF2, 0x26, 0xC8, 0xC2, + 0x14, 0xBE, 0x08, 0xFD, 0xFA, 0xD4, 0xBC, 0x4A, + 0x2A, 0x9D, 0xBE, 0xA9, 0x13, 0x6A, 0x21, 0x0D, + 0xF0, 0xD4, 0xB6, 0x49, 0x29, 0xE6, 0xFC, 0x14 + }, + { + 0xE2, 0x90, 0xDD, 0x27, 0x0B, 0x46, 0x7F, 0x34, + 0xAB, 0x1C, 0x00, 0x2D, 0x34, 0x0F, 0xA0, 0x16, + 0x25, 0x7F, 0xF1, 0x9E, 0x58, 0x33, 0xFD, 0xBB, + 0xF2, 0xCB, 0x40, 0x1C, 0x3B, 0x28, 0x17, 0xDE + }, + { + 0x9F, 0xC7, 0xB5, 0xDE, 0xD3, 0xC1, 0x50, 0x42, + 0xB2, 0xA6, 0x58, 0x2D, 0xC3, 0x9B, 0xE0, 0x16, + 0xD2, 0x4A, 0x68, 0x2D, 0x5E, 0x61, 0xAD, 0x1E, + 0xFF, 0x9C, 0x63, 0x30, 0x98, 0x48, 0xF7, 0x06 + }, + { + 0x8C, 0xCA, 0x67, 0xA3, 0x6D, 0x17, 0xD5, 0xE6, + 0x34, 0x1C, 0xB5, 0x92, 0xFD, 0x7B, 0xEF, 0x99, + 0x26, 0xC9, 0xE3, 0xAA, 0x10, 0x27, 0xEA, 0x11, + 0xA7, 0xD8, 0xBD, 0x26, 0x0B, 0x57, 0x6E, 0x04 + }, + { + 0x40, 0x93, 0x92, 0xF5, 0x60, 0xF8, 0x68, 0x31, + 0xDA, 0x43, 0x73, 0xEE, 0x5E, 0x00, 0x74, 0x26, + 0x05, 0x95, 0xD7, 0xBC, 0x24, 0x18, 0x3B, 0x60, + 0xED, 0x70, 0x0D, 0x45, 0x83, 0xD3, 0xF6, 0xF0 + }, + { + 0x28, 0x02, 0x16, 0x5D, 0xE0, 0x90, 0x91, 0x55, + 0x46, 0xF3, 0x39, 0x8C, 0xD8, 0x49, 0x16, 0x4A, + 0x19, 0xF9, 0x2A, 0xDB, 0xC3, 0x61, 0xAD, 0xC9, + 0x9B, 0x0F, 0x20, 0xC8, 0xEA, 0x07, 0x10, 0x54 + }, + { + 0xAD, 0x83, 0x91, 0x68, 0xD9, 0xF8, 0xA4, 0xBE, + 0x95, 0xBA, 0x9E, 0xF9, 0xA6, 0x92, 0xF0, 0x72, + 0x56, 0xAE, 0x43, 0xFE, 0x6F, 0x98, 0x64, 0xE2, + 0x90, 0x69, 0x1B, 0x02, 0x56, 0xCE, 0x50, 0xA9 + }, + { + 0x75, 0xFD, 0xAA, 0x50, 0x38, 0xC2, 0x84, 0xB8, + 0x6D, 0x6E, 0x8A, 0xFF, 0xE8, 0xB2, 0x80, 0x7E, + 0x46, 0x7B, 0x86, 0x60, 0x0E, 0x79, 0xAF, 0x36, + 0x89, 0xFB, 0xC0, 0x63, 0x28, 0xCB, 0xF8, 0x94 + }, + { + 0xE5, 0x7C, 0xB7, 0x94, 0x87, 0xDD, 0x57, 0x90, + 0x24, 0x32, 0xB2, 0x50, 0x73, 0x38, 0x13, 0xBD, + 0x96, 0xA8, 0x4E, 0xFC, 0xE5, 0x9F, 0x65, 0x0F, + 0xAC, 0x26, 0xE6, 0x69, 0x6A, 0xEF, 0xAF, 0xC3 + }, + { + 0x56, 0xF3, 0x4E, 0x8B, 0x96, 0x55, 0x7E, 0x90, + 0xC1, 0xF2, 0x4B, 0x52, 0xD0, 0xC8, 0x9D, 0x51, + 0x08, 0x6A, 0xCF, 0x1B, 0x00, 0xF6, 0x34, 0xCF, + 0x1D, 0xDE, 0x92, 0x33, 0xB8, 0xEA, 0xAA, 0x3E + }, + { + 0x1B, 0x53, 0xEE, 0x94, 0xAA, 0xF3, 0x4E, 0x4B, + 0x15, 0x9D, 0x48, 0xDE, 0x35, 0x2C, 0x7F, 0x06, + 0x61, 0xD0, 0xA4, 0x0E, 0xDF, 0xF9, 0x5A, 0x0B, + 0x16, 0x39, 0xB4, 0x09, 0x0E, 0x97, 0x44, 0x72 + }, + { + 0x05, 0x70, 0x5E, 0x2A, 0x81, 0x75, 0x7C, 0x14, + 0xBD, 0x38, 0x3E, 0xA9, 0x8D, 0xDA, 0x54, 0x4E, + 0xB1, 0x0E, 0x6B, 0xC0, 0x7B, 0xAE, 0x43, 0x5E, + 0x25, 0x18, 0xDB, 0xE1, 0x33, 0x52, 0x53, 0x75 + }, + { + 0xD8, 0xB2, 0x86, 0x6E, 0x8A, 0x30, 0x9D, 0xB5, + 0x3E, 0x52, 0x9E, 0xC3, 0x29, 0x11, 0xD8, 0x2F, + 0x5C, 0xA1, 0x6C, 0xFF, 0x76, 0x21, 0x68, 0x91, + 0xA9, 0x67, 0x6A, 0xA3, 0x1A, 0xAA, 0x6C, 0x42 + }, + { + 0xF5, 0x04, 0x1C, 0x24, 0x12, 0x70, 0xEB, 0x04, + 0xC7, 0x1E, 0xC2, 0xC9, 0x5D, 0x4C, 0x38, 0xD8, + 0x03, 0xB1, 0x23, 0x7B, 0x0F, 0x29, 0xFD, 0x4D, + 0xB3, 0xEB, 0x39, 0x76, 0x69, 0xE8, 0x86, 0x99 + }, + { + 0x9A, 0x4C, 0xE0, 0x77, 0xC3, 0x49, 0x32, 0x2F, + 0x59, 0x5E, 0x0E, 0xE7, 0x9E, 0xD0, 0xDA, 0x5F, + 0xAB, 0x66, 0x75, 0x2C, 0xBF, 0xEF, 0x8F, 0x87, + 0xD0, 0xE9, 0xD0, 0x72, 0x3C, 0x75, 0x30, 0xDD + }, + { + 0x65, 0x7B, 0x09, 0xF3, 0xD0, 0xF5, 0x2B, 0x5B, + 0x8F, 0x2F, 0x97, 0x16, 0x3A, 0x0E, 0xDF, 0x0C, + 0x04, 0xF0, 0x75, 0x40, 0x8A, 0x07, 0xBB, 0xEB, + 0x3A, 0x41, 0x01, 0xA8, 0x91, 0x99, 0x0D, 0x62 + }, + { + 0x1E, 0x3F, 0x7B, 0xD5, 0xA5, 0x8F, 0xA5, 0x33, + 0x34, 0x4A, 0xA8, 0xED, 0x3A, 0xC1, 0x22, 0xBB, + 0x9E, 0x70, 0xD4, 0xEF, 0x50, 0xD0, 0x04, 0x53, + 0x08, 0x21, 0x94, 0x8F, 0x5F, 0xE6, 0x31, 0x5A + }, + { + 0x80, 0xDC, 0xCF, 0x3F, 0xD8, 0x3D, 0xFD, 0x0D, + 0x35, 0xAA, 0x28, 0x58, 0x59, 0x22, 0xAB, 0x89, + 0xD5, 0x31, 0x39, 0x97, 0x67, 0x3E, 0xAF, 0x90, + 0x5C, 0xEA, 0x9C, 0x0B, 0x22, 0x5C, 0x7B, 0x5F + }, + { + 0x8A, 0x0D, 0x0F, 0xBF, 0x63, 0x77, 0xD8, 0x3B, + 0xB0, 0x8B, 0x51, 0x4B, 0x4B, 0x1C, 0x43, 0xAC, + 0xC9, 0x5D, 0x75, 0x17, 0x14, 0xF8, 0x92, 0x56, + 0x45, 0xCB, 0x6B, 0xC8, 0x56, 0xCA, 0x15, 0x0A + }, + { + 0x9F, 0xA5, 0xB4, 0x87, 0x73, 0x8A, 0xD2, 0x84, + 0x4C, 0xC6, 0x34, 0x8A, 0x90, 0x19, 0x18, 0xF6, + 0x59, 0xA3, 0xB8, 0x9E, 0x9C, 0x0D, 0xFE, 0xEA, + 0xD3, 0x0D, 0xD9, 0x4B, 0xCF, 0x42, 0xEF, 0x8E + }, + { + 0x80, 0x83, 0x2C, 0x4A, 0x16, 0x77, 0xF5, 0xEA, + 0x25, 0x60, 0xF6, 0x68, 0xE9, 0x35, 0x4D, 0xD3, + 0x69, 0x97, 0xF0, 0x37, 0x28, 0xCF, 0xA5, 0x5E, + 0x1B, 0x38, 0x33, 0x7C, 0x0C, 0x9E, 0xF8, 0x18 + }, + { + 0xAB, 0x37, 0xDD, 0xB6, 0x83, 0x13, 0x7E, 0x74, + 0x08, 0x0D, 0x02, 0x6B, 0x59, 0x0B, 0x96, 0xAE, + 0x9B, 0xB4, 0x47, 0x72, 0x2F, 0x30, 0x5A, 0x5A, + 0xC5, 0x70, 0xEC, 0x1D, 0xF9, 0xB1, 0x74, 0x3C + }, + { + 0x3E, 0xE7, 0x35, 0xA6, 0x94, 0xC2, 0x55, 0x9B, + 0x69, 0x3A, 0xA6, 0x86, 0x29, 0x36, 0x1E, 0x15, + 0xD1, 0x22, 0x65, 0xAD, 0x6A, 0x3D, 0xED, 0xF4, + 0x88, 0xB0, 0xB0, 0x0F, 0xAC, 0x97, 0x54, 0xBA + }, + { + 0xD6, 0xFC, 0xD2, 0x32, 0x19, 0xB6, 0x47, 0xE4, + 0xCB, 0xD5, 0xEB, 0x2D, 0x0A, 0xD0, 0x1E, 0xC8, + 0x83, 0x8A, 0x4B, 0x29, 0x01, 0xFC, 0x32, 0x5C, + 0xC3, 0x70, 0x19, 0x81, 0xCA, 0x6C, 0x88, 0x8B + }, + { + 0x05, 0x20, 0xEC, 0x2F, 0x5B, 0xF7, 0xA7, 0x55, + 0xDA, 0xCB, 0x50, 0xC6, 0xBF, 0x23, 0x3E, 0x35, + 0x15, 0x43, 0x47, 0x63, 0xDB, 0x01, 0x39, 0xCC, + 0xD9, 0xFA, 0xEF, 0xBB, 0x82, 0x07, 0x61, 0x2D + }, + { + 0xAF, 0xF3, 0xB7, 0x5F, 0x3F, 0x58, 0x12, 0x64, + 0xD7, 0x66, 0x16, 0x62, 0xB9, 0x2F, 0x5A, 0xD3, + 0x7C, 0x1D, 0x32, 0xBD, 0x45, 0xFF, 0x81, 0xA4, + 0xED, 0x8A, 0xDC, 0x9E, 0xF3, 0x0D, 0xD9, 0x89 + }, + { + 0xD0, 0xDD, 0x65, 0x0B, 0xEF, 0xD3, 0xBA, 0x63, + 0xDC, 0x25, 0x10, 0x2C, 0x62, 0x7C, 0x92, 0x1B, + 0x9C, 0xBE, 0xB0, 0xB1, 0x30, 0x68, 0x69, 0x35, + 0xB5, 0xC9, 0x27, 0xCB, 0x7C, 0xCD, 0x5E, 0x3B + }, + { + 0xE1, 0x14, 0x98, 0x16, 0xB1, 0x0A, 0x85, 0x14, + 0xFB, 0x3E, 0x2C, 0xAB, 0x2C, 0x08, 0xBE, 0xE9, + 0xF7, 0x3C, 0xE7, 0x62, 0x21, 0x70, 0x12, 0x46, + 0xA5, 0x89, 0xBB, 0xB6, 0x73, 0x02, 0xD8, 0xA9 + }, + { + 0x7D, 0xA3, 0xF4, 0x41, 0xDE, 0x90, 0x54, 0x31, + 0x7E, 0x72, 0xB5, 0xDB, 0xF9, 0x79, 0xDA, 0x01, + 0xE6, 0xBC, 0xEE, 0xBB, 0x84, 0x78, 0xEA, 0xE6, + 0xA2, 0x28, 0x49, 0xD9, 0x02, 0x92, 0x63, 0x5C + }, + { + 0x12, 0x30, 0xB1, 0xFC, 0x8A, 0x7D, 0x92, 0x15, + 0xED, 0xC2, 0xD4, 0xA2, 0xDE, 0xCB, 0xDD, 0x0A, + 0x6E, 0x21, 0x6C, 0x92, 0x42, 0x78, 0xC9, 0x1F, + 0xC5, 0xD1, 0x0E, 0x7D, 0x60, 0x19, 0x2D, 0x94 + }, + { + 0x57, 0x50, 0xD7, 0x16, 0xB4, 0x80, 0x8F, 0x75, + 0x1F, 0xEB, 0xC3, 0x88, 0x06, 0xBA, 0x17, 0x0B, + 0xF6, 0xD5, 0x19, 0x9A, 0x78, 0x16, 0xBE, 0x51, + 0x4E, 0x3F, 0x93, 0x2F, 0xBE, 0x0C, 0xB8, 0x71 + }, + { + 0x6F, 0xC5, 0x9B, 0x2F, 0x10, 0xFE, 0xBA, 0x95, + 0x4A, 0xA6, 0x82, 0x0B, 0x3C, 0xA9, 0x87, 0xEE, + 0x81, 0xD5, 0xCC, 0x1D, 0xA3, 0xC6, 0x3C, 0xE8, + 0x27, 0x30, 0x1C, 0x56, 0x9D, 0xFB, 0x39, 0xCE + }, + { + 0xC7, 0xC3, 0xFE, 0x1E, 0xEB, 0xDC, 0x7B, 0x5A, + 0x93, 0x93, 0x26, 0xE8, 0xDD, 0xB8, 0x3E, 0x8B, + 0xF2, 0xB7, 0x80, 0xB6, 0x56, 0x78, 0xCB, 0x62, + 0xF2, 0x08, 0xB0, 0x40, 0xAB, 0xDD, 0x35, 0xE2 + }, + { + 0x0C, 0x75, 0xC1, 0xA1, 0x5C, 0xF3, 0x4A, 0x31, + 0x4E, 0xE4, 0x78, 0xF4, 0xA5, 0xCE, 0x0B, 0x8A, + 0x6B, 0x36, 0x52, 0x8E, 0xF7, 0xA8, 0x20, 0x69, + 0x6C, 0x3E, 0x42, 0x46, 0xC5, 0xA1, 0x58, 0x64 + }, + { + 0x21, 0x6D, 0xC1, 0x2A, 0x10, 0x85, 0x69, 0xA3, + 0xC7, 0xCD, 0xDE, 0x4A, 0xED, 0x43, 0xA6, 0xC3, + 0x30, 0x13, 0x9D, 0xDA, 0x3C, 0xCC, 0x4A, 0x10, + 0x89, 0x05, 0xDB, 0x38, 0x61, 0x89, 0x90, 0x50 + }, + { + 0xA5, 0x7B, 0xE6, 0xAE, 0x67, 0x56, 0xF2, 0x8B, + 0x02, 0xF5, 0x9D, 0xAD, 0xF7, 0xE0, 0xD7, 0xD8, + 0x80, 0x7F, 0x10, 0xFA, 0x15, 0xCE, 0xD1, 0xAD, + 0x35, 0x85, 0x52, 0x1A, 0x1D, 0x99, 0x5A, 0x89 + }, + { + 0x81, 0x6A, 0xEF, 0x87, 0x59, 0x53, 0x71, 0x6C, + 0xD7, 0xA5, 0x81, 0xF7, 0x32, 0xF5, 0x3D, 0xD4, + 0x35, 0xDA, 0xB6, 0x6D, 0x09, 0xC3, 0x61, 0xD2, + 0xD6, 0x59, 0x2D, 0xE1, 0x77, 0x55, 0xD8, 0xA8 + }, + { + 0x9A, 0x76, 0x89, 0x32, 0x26, 0x69, 0x3B, 0x6E, + 0xA9, 0x7E, 0x6A, 0x73, 0x8F, 0x9D, 0x10, 0xFB, + 0x3D, 0x0B, 0x43, 0xAE, 0x0E, 0x8B, 0x7D, 0x81, + 0x23, 0xEA, 0x76, 0xCE, 0x97, 0x98, 0x9C, 0x7E + }, + { + 0x8D, 0xAE, 0xDB, 0x9A, 0x27, 0x15, 0x29, 0xDB, + 0xB7, 0xDC, 0x3B, 0x60, 0x7F, 0xE5, 0xEB, 0x2D, + 0x32, 0x11, 0x77, 0x07, 0x58, 0xDD, 0x3B, 0x0A, + 0x35, 0x93, 0xD2, 0xD7, 0x95, 0x4E, 0x2D, 0x5B + }, + { + 0x16, 0xDB, 0xC0, 0xAA, 0x5D, 0xD2, 0xC7, 0x74, + 0xF5, 0x05, 0x10, 0x0F, 0x73, 0x37, 0x86, 0xD8, + 0xA1, 0x75, 0xFC, 0xBB, 0xB5, 0x9C, 0x43, 0xE1, + 0xFB, 0xFF, 0x3E, 0x1E, 0xAF, 0x31, 0xCB, 0x4A + }, + { + 0x86, 0x06, 0xCB, 0x89, 0x9C, 0x6A, 0xEA, 0xF5, + 0x1B, 0x9D, 0xB0, 0xFE, 0x49, 0x24, 0xA9, 0xFD, + 0x5D, 0xAB, 0xC1, 0x9F, 0x88, 0x26, 0xF2, 0xBC, + 0x1C, 0x1D, 0x7D, 0xA1, 0x4D, 0x2C, 0x2C, 0x99 + }, + { + 0x84, 0x79, 0x73, 0x1A, 0xED, 0xA5, 0x7B, 0xD3, + 0x7E, 0xAD, 0xB5, 0x1A, 0x50, 0x7E, 0x30, 0x7F, + 0x3B, 0xD9, 0x5E, 0x69, 0xDB, 0xCA, 0x94, 0xF3, + 0xBC, 0x21, 0x72, 0x60, 0x66, 0xAD, 0x6D, 0xFD + }, + { + 0x58, 0x47, 0x3A, 0x9E, 0xA8, 0x2E, 0xFA, 0x3F, + 0x3B, 0x3D, 0x8F, 0xC8, 0x3E, 0xD8, 0x86, 0x31, + 0x27, 0xB3, 0x3A, 0xE8, 0xDE, 0xAE, 0x63, 0x07, + 0x20, 0x1E, 0xDB, 0x6D, 0xDE, 0x61, 0xDE, 0x29 + }, + { + 0x9A, 0x92, 0x55, 0xD5, 0x3A, 0xF1, 0x16, 0xDE, + 0x8B, 0xA2, 0x7C, 0xE3, 0x5B, 0x4C, 0x7E, 0x15, + 0x64, 0x06, 0x57, 0xA0, 0xFC, 0xB8, 0x88, 0xC7, + 0x0D, 0x95, 0x43, 0x1D, 0xAC, 0xD8, 0xF8, 0x30 + }, + { + 0x9E, 0xB0, 0x5F, 0xFB, 0xA3, 0x9F, 0xD8, 0x59, + 0x6A, 0x45, 0x49, 0x3E, 0x18, 0xD2, 0x51, 0x0B, + 0xF3, 0xEF, 0x06, 0x5C, 0x51, 0xD6, 0xE1, 0x3A, + 0xBE, 0x66, 0xAA, 0x57, 0xE0, 0x5C, 0xFD, 0xB7 + }, + { + 0x81, 0xDC, 0xC3, 0xA5, 0x05, 0xEA, 0xCE, 0x3F, + 0x87, 0x9D, 0x8F, 0x70, 0x27, 0x76, 0x77, 0x0F, + 0x9D, 0xF5, 0x0E, 0x52, 0x1D, 0x14, 0x28, 0xA8, + 0x5D, 0xAF, 0x04, 0xF9, 0xAD, 0x21, 0x50, 0xE0 + }, + { + 0xE3, 0xE3, 0xC4, 0xAA, 0x3A, 0xCB, 0xBC, 0x85, + 0x33, 0x2A, 0xF9, 0xD5, 0x64, 0xBC, 0x24, 0x16, + 0x5E, 0x16, 0x87, 0xF6, 0xB1, 0xAD, 0xCB, 0xFA, + 0xE7, 0x7A, 0x8F, 0x03, 0xC7, 0x2A, 0xC2, 0x8C + }, + { + 0x67, 0x46, 0xC8, 0x0B, 0x4E, 0xB5, 0x6A, 0xEA, + 0x45, 0xE6, 0x4E, 0x72, 0x89, 0xBB, 0xA3, 0xED, + 0xBF, 0x45, 0xEC, 0xF8, 0x20, 0x64, 0x81, 0xFF, + 0x63, 0x02, 0x12, 0x29, 0x84, 0xCD, 0x52, 0x6A + }, + { + 0x2B, 0x62, 0x8E, 0x52, 0x76, 0x4D, 0x7D, 0x62, + 0xC0, 0x86, 0x8B, 0x21, 0x23, 0x57, 0xCD, 0xD1, + 0x2D, 0x91, 0x49, 0x82, 0x2F, 0x4E, 0x98, 0x45, + 0xD9, 0x18, 0xA0, 0x8D, 0x1A, 0xE9, 0x90, 0xC0 + }, + { + 0xE4, 0xBF, 0xE8, 0x0D, 0x58, 0xC9, 0x19, 0x94, + 0x61, 0x39, 0x09, 0xDC, 0x4B, 0x1A, 0x12, 0x49, + 0x68, 0x96, 0xC0, 0x04, 0xAF, 0x7B, 0x57, 0x01, + 0x48, 0x3D, 0xE4, 0x5D, 0x28, 0x23, 0xD7, 0x8E + }, + { + 0xEB, 0xB4, 0xBA, 0x15, 0x0C, 0xEF, 0x27, 0x34, + 0x34, 0x5B, 0x5D, 0x64, 0x1B, 0xBE, 0xD0, 0x3A, + 0x21, 0xEA, 0xFA, 0xE9, 0x33, 0xC9, 0x9E, 0x00, + 0x92, 0x12, 0xEF, 0x04, 0x57, 0x4A, 0x85, 0x30 + }, + { + 0x39, 0x66, 0xEC, 0x73, 0xB1, 0x54, 0xAC, 0xC6, + 0x97, 0xAC, 0x5C, 0xF5, 0xB2, 0x4B, 0x40, 0xBD, + 0xB0, 0xDB, 0x9E, 0x39, 0x88, 0x36, 0xD7, 0x6D, + 0x4B, 0x88, 0x0E, 0x3B, 0x2A, 0xF1, 0xAA, 0x27 + }, + { + 0xEF, 0x7E, 0x48, 0x31, 0xB3, 0xA8, 0x46, 0x36, + 0x51, 0x8D, 0x6E, 0x4B, 0xFC, 0xE6, 0x4A, 0x43, + 0xDB, 0x2A, 0x5D, 0xDA, 0x9C, 0xCA, 0x2B, 0x44, + 0xF3, 0x90, 0x33, 0xBD, 0xC4, 0x0D, 0x62, 0x43 + }, + { + 0x7A, 0xBF, 0x6A, 0xCF, 0x5C, 0x8E, 0x54, 0x9D, + 0xDB, 0xB1, 0x5A, 0xE8, 0xD8, 0xB3, 0x88, 0xC1, + 0xC1, 0x97, 0xE6, 0x98, 0x73, 0x7C, 0x97, 0x85, + 0x50, 0x1E, 0xD1, 0xF9, 0x49, 0x30, 0xB7, 0xD9 + }, + { + 0x88, 0x01, 0x8D, 0xED, 0x66, 0x81, 0x3F, 0x0C, + 0xA9, 0x5D, 0xEF, 0x47, 0x4C, 0x63, 0x06, 0x92, + 0x01, 0x99, 0x67, 0xB9, 0xE3, 0x68, 0x88, 0xDA, + 0xDD, 0x94, 0x12, 0x47, 0x19, 0xB6, 0x82, 0xF6 + }, + { + 0x39, 0x30, 0x87, 0x6B, 0x9F, 0xC7, 0x52, 0x90, + 0x36, 0xB0, 0x08, 0xB1, 0xB8, 0xBB, 0x99, 0x75, + 0x22, 0xA4, 0x41, 0x63, 0x5A, 0x0C, 0x25, 0xEC, + 0x02, 0xFB, 0x6D, 0x90, 0x26, 0xE5, 0x5A, 0x97 + }, + { + 0x0A, 0x40, 0x49, 0xD5, 0x7E, 0x83, 0x3B, 0x56, + 0x95, 0xFA, 0xC9, 0x3D, 0xD1, 0xFB, 0xEF, 0x31, + 0x66, 0xB4, 0x4B, 0x12, 0xAD, 0x11, 0x24, 0x86, + 0x62, 0x38, 0x3A, 0xE0, 0x51, 0xE1, 0x58, 0x27 + }, + { + 0x81, 0xDC, 0xC0, 0x67, 0x8B, 0xB6, 0xA7, 0x65, + 0xE4, 0x8C, 0x32, 0x09, 0x65, 0x4F, 0xE9, 0x00, + 0x89, 0xCE, 0x44, 0xFF, 0x56, 0x18, 0x47, 0x7E, + 0x39, 0xAB, 0x28, 0x64, 0x76, 0xDF, 0x05, 0x2B + }, + { + 0xE6, 0x9B, 0x3A, 0x36, 0xA4, 0x46, 0x19, 0x12, + 0xDC, 0x08, 0x34, 0x6B, 0x11, 0xDD, 0xCB, 0x9D, + 0xB7, 0x96, 0xF8, 0x85, 0xFD, 0x01, 0x93, 0x6E, + 0x66, 0x2F, 0xE2, 0x92, 0x97, 0xB0, 0x99, 0xA4 + }, + { + 0x5A, 0xC6, 0x50, 0x3B, 0x0D, 0x8D, 0xA6, 0x91, + 0x76, 0x46, 0xE6, 0xDC, 0xC8, 0x7E, 0xDC, 0x58, + 0xE9, 0x42, 0x45, 0x32, 0x4C, 0xC2, 0x04, 0xF4, + 0xDD, 0x4A, 0xF0, 0x15, 0x63, 0xAC, 0xD4, 0x27 + }, + { + 0xDF, 0x6D, 0xDA, 0x21, 0x35, 0x9A, 0x30, 0xBC, + 0x27, 0x17, 0x80, 0x97, 0x1C, 0x1A, 0xBD, 0x56, + 0xA6, 0xEF, 0x16, 0x7E, 0x48, 0x08, 0x87, 0x88, + 0x8E, 0x73, 0xA8, 0x6D, 0x3B, 0xF6, 0x05, 0xE9 + }, + { + 0xE8, 0xE6, 0xE4, 0x70, 0x71, 0xE7, 0xB7, 0xDF, + 0x25, 0x80, 0xF2, 0x25, 0xCF, 0xBB, 0xED, 0xF8, + 0x4C, 0xE6, 0x77, 0x46, 0x62, 0x66, 0x28, 0xD3, + 0x30, 0x97, 0xE4, 0xB7, 0xDC, 0x57, 0x11, 0x07 + }, + { + 0x53, 0xE4, 0x0E, 0xAD, 0x62, 0x05, 0x1E, 0x19, + 0xCB, 0x9B, 0xA8, 0x13, 0x3E, 0x3E, 0x5C, 0x1C, + 0xE0, 0x0D, 0xDC, 0xAD, 0x8A, 0xCF, 0x34, 0x2A, + 0x22, 0x43, 0x60, 0xB0, 0xAC, 0xC1, 0x47, 0x77 + }, + { + 0x9C, 0xCD, 0x53, 0xFE, 0x80, 0xBE, 0x78, 0x6A, + 0xA9, 0x84, 0x63, 0x84, 0x62, 0xFB, 0x28, 0xAF, + 0xDF, 0x12, 0x2B, 0x34, 0xD7, 0x8F, 0x46, 0x87, + 0xEC, 0x63, 0x2B, 0xB1, 0x9D, 0xE2, 0x37, 0x1A + }, + { + 0xCB, 0xD4, 0x80, 0x52, 0xC4, 0x8D, 0x78, 0x84, + 0x66, 0xA3, 0xE8, 0x11, 0x8C, 0x56, 0xC9, 0x7F, + 0xE1, 0x46, 0xE5, 0x54, 0x6F, 0xAA, 0xF9, 0x3E, + 0x2B, 0xC3, 0xC4, 0x7E, 0x45, 0x93, 0x97, 0x53 + }, + { + 0x25, 0x68, 0x83, 0xB1, 0x4E, 0x2A, 0xF4, 0x4D, + 0xAD, 0xB2, 0x8E, 0x1B, 0x34, 0xB2, 0xAC, 0x0F, + 0x0F, 0x4C, 0x91, 0xC3, 0x4E, 0xC9, 0x16, 0x9E, + 0x29, 0x03, 0x61, 0x58, 0xAC, 0xAA, 0x95, 0xB9 + }, + { + 0x44, 0x71, 0xB9, 0x1A, 0xB4, 0x2D, 0xB7, 0xC4, + 0xDD, 0x84, 0x90, 0xAB, 0x95, 0xA2, 0xEE, 0x8D, + 0x04, 0xE3, 0xEF, 0x5C, 0x3D, 0x6F, 0xC7, 0x1A, + 0xC7, 0x4B, 0x2B, 0x26, 0x91, 0x4D, 0x16, 0x41 + }, + { + 0xA5, 0xEB, 0x08, 0x03, 0x8F, 0x8F, 0x11, 0x55, + 0xED, 0x86, 0xE6, 0x31, 0x90, 0x6F, 0xC1, 0x30, + 0x95, 0xF6, 0xBB, 0xA4, 0x1D, 0xE5, 0xD4, 0xE7, + 0x95, 0x75, 0x8E, 0xC8, 0xC8, 0xDF, 0x8A, 0xF1 + }, + { + 0xDC, 0x1D, 0xB6, 0x4E, 0xD8, 0xB4, 0x8A, 0x91, + 0x0E, 0x06, 0x0A, 0x6B, 0x86, 0x63, 0x74, 0xC5, + 0x78, 0x78, 0x4E, 0x9A, 0xC4, 0x9A, 0xB2, 0x77, + 0x40, 0x92, 0xAC, 0x71, 0x50, 0x19, 0x34, 0xAC + }, + { + 0x28, 0x54, 0x13, 0xB2, 0xF2, 0xEE, 0x87, 0x3D, + 0x34, 0x31, 0x9E, 0xE0, 0xBB, 0xFB, 0xB9, 0x0F, + 0x32, 0xDA, 0x43, 0x4C, 0xC8, 0x7E, 0x3D, 0xB5, + 0xED, 0x12, 0x1B, 0xB3, 0x98, 0xED, 0x96, 0x4B + }, + { + 0x02, 0x16, 0xE0, 0xF8, 0x1F, 0x75, 0x0F, 0x26, + 0xF1, 0x99, 0x8B, 0xC3, 0x93, 0x4E, 0x3E, 0x12, + 0x4C, 0x99, 0x45, 0xE6, 0x85, 0xA6, 0x0B, 0x25, + 0xE8, 0xFB, 0xD9, 0x62, 0x5A, 0xB6, 0xB5, 0x99 + }, + { + 0x38, 0xC4, 0x10, 0xF5, 0xB9, 0xD4, 0x07, 0x20, + 0x50, 0x75, 0x5B, 0x31, 0xDC, 0xA8, 0x9F, 0xD5, + 0x39, 0x5C, 0x67, 0x85, 0xEE, 0xB3, 0xD7, 0x90, + 0xF3, 0x20, 0xFF, 0x94, 0x1C, 0x5A, 0x93, 0xBF + }, + { + 0xF1, 0x84, 0x17, 0xB3, 0x9D, 0x61, 0x7A, 0xB1, + 0xC1, 0x8F, 0xDF, 0x91, 0xEB, 0xD0, 0xFC, 0x6D, + 0x55, 0x16, 0xBB, 0x34, 0xCF, 0x39, 0x36, 0x40, + 0x37, 0xBC, 0xE8, 0x1F, 0xA0, 0x4C, 0xEC, 0xB1 + }, + { + 0x1F, 0xA8, 0x77, 0xDE, 0x67, 0x25, 0x9D, 0x19, + 0x86, 0x3A, 0x2A, 0x34, 0xBC, 0xC6, 0x96, 0x2A, + 0x2B, 0x25, 0xFC, 0xBF, 0x5C, 0xBE, 0xCD, 0x7E, + 0xDE, 0x8F, 0x1F, 0xA3, 0x66, 0x88, 0xA7, 0x96 + }, + { + 0x5B, 0xD1, 0x69, 0xE6, 0x7C, 0x82, 0xC2, 0xC2, + 0xE9, 0x8E, 0xF7, 0x00, 0x8B, 0xDF, 0x26, 0x1F, + 0x2D, 0xDF, 0x30, 0xB1, 0xC0, 0x0F, 0x9E, 0x7F, + 0x27, 0x5B, 0xB3, 0xE8, 0xA2, 0x8D, 0xC9, 0xA2 + }, + { + 0xC8, 0x0A, 0xBE, 0xEB, 0xB6, 0x69, 0xAD, 0x5D, + 0xEE, 0xB5, 0xF5, 0xEC, 0x8E, 0xA6, 0xB7, 0xA0, + 0x5D, 0xDF, 0x7D, 0x31, 0xEC, 0x4C, 0x0A, 0x2E, + 0xE2, 0x0B, 0x0B, 0x98, 0xCA, 0xEC, 0x67, 0x46 + }, + { + 0xE7, 0x6D, 0x3F, 0xBD, 0xA5, 0xBA, 0x37, 0x4E, + 0x6B, 0xF8, 0xE5, 0x0F, 0xAD, 0xC3, 0xBB, 0xB9, + 0xBA, 0x5C, 0x20, 0x6E, 0xBD, 0xEC, 0x89, 0xA3, + 0xA5, 0x4C, 0xF3, 0xDD, 0x84, 0xA0, 0x70, 0x16 + }, + { + 0x7B, 0xBA, 0x9D, 0xC5, 0xB5, 0xDB, 0x20, 0x71, + 0xD1, 0x77, 0x52, 0xB1, 0x04, 0x4C, 0x1E, 0xCE, + 0xD9, 0x6A, 0xAF, 0x2D, 0xD4, 0x6E, 0x9B, 0x43, + 0x37, 0x50, 0xE8, 0xEA, 0x0D, 0xCC, 0x18, 0x70 + }, + { + 0xF2, 0x9B, 0x1B, 0x1A, 0xB9, 0xBA, 0xB1, 0x63, + 0x01, 0x8E, 0xE3, 0xDA, 0x15, 0x23, 0x2C, 0xCA, + 0x78, 0xEC, 0x52, 0xDB, 0xC3, 0x4E, 0xDA, 0x5B, + 0x82, 0x2E, 0xC1, 0xD8, 0x0F, 0xC2, 0x1B, 0xD0 + }, + { + 0x9E, 0xE3, 0xE3, 0xE7, 0xE9, 0x00, 0xF1, 0xE1, + 0x1D, 0x30, 0x8C, 0x4B, 0x2B, 0x30, 0x76, 0xD2, + 0x72, 0xCF, 0x70, 0x12, 0x4F, 0x9F, 0x51, 0xE1, + 0xDA, 0x60, 0xF3, 0x78, 0x46, 0xCD, 0xD2, 0xF4 + }, + { + 0x70, 0xEA, 0x3B, 0x01, 0x76, 0x92, 0x7D, 0x90, + 0x96, 0xA1, 0x85, 0x08, 0xCD, 0x12, 0x3A, 0x29, + 0x03, 0x25, 0x92, 0x0A, 0x9D, 0x00, 0xA8, 0x9B, + 0x5D, 0xE0, 0x42, 0x73, 0xFB, 0xC7, 0x6B, 0x85 + }, + { + 0x67, 0xDE, 0x25, 0xC0, 0x2A, 0x4A, 0xAB, 0xA2, + 0x3B, 0xDC, 0x97, 0x3C, 0x8B, 0xB0, 0xB5, 0x79, + 0x6D, 0x47, 0xCC, 0x06, 0x59, 0xD4, 0x3D, 0xFF, + 0x1F, 0x97, 0xDE, 0x17, 0x49, 0x63, 0xB6, 0x8E + }, + { + 0xB2, 0x16, 0x8E, 0x4E, 0x0F, 0x18, 0xB0, 0xE6, + 0x41, 0x00, 0xB5, 0x17, 0xED, 0x95, 0x25, 0x7D, + 0x73, 0xF0, 0x62, 0x0D, 0xF8, 0x85, 0xC1, 0x3D, + 0x2E, 0xCF, 0x79, 0x36, 0x7B, 0x38, 0x4C, 0xEE + }, + { + 0x2E, 0x7D, 0xEC, 0x24, 0x28, 0x85, 0x3B, 0x2C, + 0x71, 0x76, 0x07, 0x45, 0x54, 0x1F, 0x7A, 0xFE, + 0x98, 0x25, 0xB5, 0xDD, 0x77, 0xDF, 0x06, 0x51, + 0x1D, 0x84, 0x41, 0xA9, 0x4B, 0xAC, 0xC9, 0x27 + }, + { + 0xCA, 0x9F, 0xFA, 0xC4, 0xC4, 0x3F, 0x0B, 0x48, + 0x46, 0x1D, 0xC5, 0xC2, 0x63, 0xBE, 0xA3, 0xF6, + 0xF0, 0x06, 0x11, 0xCE, 0xAC, 0xAB, 0xF6, 0xF8, + 0x95, 0xBA, 0x2B, 0x01, 0x01, 0xDB, 0xB6, 0x8D + }, + { + 0x74, 0x10, 0xD4, 0x2D, 0x8F, 0xD1, 0xD5, 0xE9, + 0xD2, 0xF5, 0x81, 0x5C, 0xB9, 0x34, 0x17, 0x99, + 0x88, 0x28, 0xEF, 0x3C, 0x42, 0x30, 0xBF, 0xBD, + 0x41, 0x2D, 0xF0, 0xA4, 0xA7, 0xA2, 0x50, 0x7A + }, + { + 0x50, 0x10, 0xF6, 0x84, 0x51, 0x6D, 0xCC, 0xD0, + 0xB6, 0xEE, 0x08, 0x52, 0xC2, 0x51, 0x2B, 0x4D, + 0xC0, 0x06, 0x6C, 0xF0, 0xD5, 0x6F, 0x35, 0x30, + 0x29, 0x78, 0xDB, 0x8A, 0xE3, 0x2C, 0x6A, 0x81 + }, + { + 0xAC, 0xAA, 0xB5, 0x85, 0xF7, 0xB7, 0x9B, 0x71, + 0x99, 0x35, 0xCE, 0xB8, 0x95, 0x23, 0xDD, 0xC5, + 0x48, 0x27, 0xF7, 0x5C, 0x56, 0x88, 0x38, 0x56, + 0x15, 0x4A, 0x56, 0xCD, 0xCD, 0x5E, 0xE9, 0x88 + }, + { + 0x66, 0x6D, 0xE5, 0xD1, 0x44, 0x0F, 0xEE, 0x73, + 0x31, 0xAA, 0xF0, 0x12, 0x3A, 0x62, 0xEF, 0x2D, + 0x8B, 0xA5, 0x74, 0x53, 0xA0, 0x76, 0x96, 0x35, + 0xAC, 0x6C, 0xD0, 0x1E, 0x63, 0x3F, 0x77, 0x12 + }, + { + 0xA6, 0xF9, 0x86, 0x58, 0xF6, 0xEA, 0xBA, 0xF9, + 0x02, 0xD8, 0xB3, 0x87, 0x1A, 0x4B, 0x10, 0x1D, + 0x16, 0x19, 0x6E, 0x8A, 0x4B, 0x24, 0x1E, 0x15, + 0x58, 0xFE, 0x29, 0x96, 0x6E, 0x10, 0x3E, 0x8D + }, + { + 0x89, 0x15, 0x46, 0xA8, 0xB2, 0x9F, 0x30, 0x47, + 0xDD, 0xCF, 0xE5, 0xB0, 0x0E, 0x45, 0xFD, 0x55, + 0x75, 0x63, 0x73, 0x10, 0x5E, 0xA8, 0x63, 0x7D, + 0xFC, 0xFF, 0x54, 0x7B, 0x6E, 0xA9, 0x53, 0x5F + }, + { + 0x18, 0xDF, 0xBC, 0x1A, 0xC5, 0xD2, 0x5B, 0x07, + 0x61, 0x13, 0x7D, 0xBD, 0x22, 0xC1, 0x7C, 0x82, + 0x9D, 0x0F, 0x0E, 0xF1, 0xD8, 0x23, 0x44, 0xE9, + 0xC8, 0x9C, 0x28, 0x66, 0x94, 0xDA, 0x24, 0xE8 + }, + { + 0xB5, 0x4B, 0x9B, 0x67, 0xF8, 0xFE, 0xD5, 0x4B, + 0xBF, 0x5A, 0x26, 0x66, 0xDB, 0xDF, 0x4B, 0x23, + 0xCF, 0xF1, 0xD1, 0xB6, 0xF4, 0xAF, 0xC9, 0x85, + 0xB2, 0xE6, 0xD3, 0x30, 0x5A, 0x9F, 0xF8, 0x0F + }, + { + 0x7D, 0xB4, 0x42, 0xE1, 0x32, 0xBA, 0x59, 0xBC, + 0x12, 0x89, 0xAA, 0x98, 0xB0, 0xD3, 0xE8, 0x06, + 0x00, 0x4F, 0x8E, 0xC1, 0x28, 0x11, 0xAF, 0x1E, + 0x2E, 0x33, 0xC6, 0x9B, 0xFD, 0xE7, 0x29, 0xE1 + }, + { + 0x25, 0x0F, 0x37, 0xCD, 0xC1, 0x5E, 0x81, 0x7D, + 0x2F, 0x16, 0x0D, 0x99, 0x56, 0xC7, 0x1F, 0xE3, + 0xEB, 0x5D, 0xB7, 0x45, 0x56, 0xE4, 0xAD, 0xF9, + 0xA4, 0xFF, 0xAF, 0xBA, 0x74, 0x01, 0x03, 0x96 + }, + { + 0x4A, 0xB8, 0xA3, 0xDD, 0x1D, 0xDF, 0x8A, 0xD4, + 0x3D, 0xAB, 0x13, 0xA2, 0x7F, 0x66, 0xA6, 0x54, + 0x4F, 0x29, 0x05, 0x97, 0xFA, 0x96, 0x04, 0x0E, + 0x0E, 0x1D, 0xB9, 0x26, 0x3A, 0xA4, 0x79, 0xF8 + }, + { + 0xEE, 0x61, 0x72, 0x7A, 0x07, 0x66, 0xDF, 0x93, + 0x9C, 0xCD, 0xC8, 0x60, 0x33, 0x40, 0x44, 0xC7, + 0x9A, 0x3C, 0x9B, 0x15, 0x62, 0x00, 0xBC, 0x3A, + 0xA3, 0x29, 0x73, 0x48, 0x3D, 0x83, 0x41, 0xAE + }, + { + 0x3F, 0x68, 0xC7, 0xEC, 0x63, 0xAC, 0x11, 0xEB, + 0xB9, 0x8F, 0x94, 0xB3, 0x39, 0xB0, 0x5C, 0x10, + 0x49, 0x84, 0xFD, 0xA5, 0x01, 0x03, 0x06, 0x01, + 0x44, 0xE5, 0xA2, 0xBF, 0xCC, 0xC9, 0xDA, 0x95 + }, + { + 0x05, 0x6F, 0x29, 0x81, 0x6B, 0x8A, 0xF8, 0xF5, + 0x66, 0x82, 0xBC, 0x4D, 0x7C, 0xF0, 0x94, 0x11, + 0x1D, 0xA7, 0x73, 0x3E, 0x72, 0x6C, 0xD1, 0x3D, + 0x6B, 0x3E, 0x8E, 0xA0, 0x3E, 0x92, 0xA0, 0xD5 + }, + { + 0xF5, 0xEC, 0x43, 0xA2, 0x8A, 0xCB, 0xEF, 0xF1, + 0xF3, 0x31, 0x8A, 0x5B, 0xCA, 0xC7, 0xC6, 0x6D, + 0xDB, 0x52, 0x30, 0xB7, 0x9D, 0xB2, 0xD1, 0x05, + 0xBC, 0xBE, 0x15, 0xF3, 0xC1, 0x14, 0x8D, 0x69 + }, + { + 0x2A, 0x69, 0x60, 0xAD, 0x1D, 0x8D, 0xD5, 0x47, + 0x55, 0x5C, 0xFB, 0xD5, 0xE4, 0x60, 0x0F, 0x1E, + 0xAA, 0x1C, 0x8E, 0xDA, 0x34, 0xDE, 0x03, 0x74, + 0xEC, 0x4A, 0x26, 0xEA, 0xAA, 0xA3, 0x3B, 0x4E + }, + { + 0xDC, 0xC1, 0xEA, 0x7B, 0xAA, 0xB9, 0x33, 0x84, + 0xF7, 0x6B, 0x79, 0x68, 0x66, 0x19, 0x97, 0x54, + 0x74, 0x2F, 0x7B, 0x96, 0xD6, 0xB4, 0xC1, 0x20, + 0x16, 0x5C, 0x04, 0xA6, 0xC4, 0xF5, 0xCE, 0x10 + }, + { + 0x13, 0xD5, 0xDF, 0x17, 0x92, 0x21, 0x37, 0x9C, + 0x6A, 0x78, 0xC0, 0x7C, 0x79, 0x3F, 0xF5, 0x34, + 0x87, 0xCA, 0xE6, 0xBF, 0x9F, 0xE8, 0x82, 0x54, + 0x1A, 0xB0, 0xE7, 0x35, 0xE3, 0xEA, 0xDA, 0x3B + }, + { + 0x8C, 0x59, 0xE4, 0x40, 0x76, 0x41, 0xA0, 0x1E, + 0x8F, 0xF9, 0x1F, 0x99, 0x80, 0xDC, 0x23, 0x6F, + 0x4E, 0xCD, 0x6F, 0xCF, 0x52, 0x58, 0x9A, 0x09, + 0x9A, 0x96, 0x16, 0x33, 0x96, 0x77, 0x14, 0xE1 + }, + { + 0x83, 0x3B, 0x1A, 0xC6, 0xA2, 0x51, 0xFD, 0x08, + 0xFD, 0x6D, 0x90, 0x8F, 0xEA, 0x2A, 0x4E, 0xE1, + 0xE0, 0x40, 0xBC, 0xA9, 0x3F, 0xC1, 0xA3, 0x8E, + 0xC3, 0x82, 0x0E, 0x0C, 0x10, 0xBD, 0x82, 0xEA + }, + { + 0xA2, 0x44, 0xF9, 0x27, 0xF3, 0xB4, 0x0B, 0x8F, + 0x6C, 0x39, 0x15, 0x70, 0xC7, 0x65, 0x41, 0x8F, + 0x2F, 0x6E, 0x70, 0x8E, 0xAC, 0x90, 0x06, 0xC5, + 0x1A, 0x7F, 0xEF, 0xF4, 0xAF, 0x3B, 0x2B, 0x9E + }, + { + 0x3D, 0x99, 0xED, 0x95, 0x50, 0xCF, 0x11, 0x96, + 0xE6, 0xC4, 0xD2, 0x0C, 0x25, 0x96, 0x20, 0xF8, + 0x58, 0xC3, 0xD7, 0x03, 0x37, 0x4C, 0x12, 0x8C, + 0xE7, 0xB5, 0x90, 0x31, 0x0C, 0x83, 0x04, 0x6D + }, + { + 0x2B, 0x35, 0xC4, 0x7D, 0x7B, 0x87, 0x76, 0x1F, + 0x0A, 0xE4, 0x3A, 0xC5, 0x6A, 0xC2, 0x7B, 0x9F, + 0x25, 0x83, 0x03, 0x67, 0xB5, 0x95, 0xBE, 0x8C, + 0x24, 0x0E, 0x94, 0x60, 0x0C, 0x6E, 0x33, 0x12 + }, + { + 0x5D, 0x11, 0xED, 0x37, 0xD2, 0x4D, 0xC7, 0x67, + 0x30, 0x5C, 0xB7, 0xE1, 0x46, 0x7D, 0x87, 0xC0, + 0x65, 0xAC, 0x4B, 0xC8, 0xA4, 0x26, 0xDE, 0x38, + 0x99, 0x1F, 0xF5, 0x9A, 0xA8, 0x73, 0x5D, 0x02 + }, + { + 0xB8, 0x36, 0x47, 0x8E, 0x1C, 0xA0, 0x64, 0x0D, + 0xCE, 0x6F, 0xD9, 0x10, 0xA5, 0x09, 0x62, 0x72, + 0xC8, 0x33, 0x09, 0x90, 0xCD, 0x97, 0x86, 0x4A, + 0xC2, 0xBF, 0x14, 0xEF, 0x6B, 0x23, 0x91, 0x4A + }, + { + 0x91, 0x00, 0xF9, 0x46, 0xD6, 0xCC, 0xDE, 0x3A, + 0x59, 0x7F, 0x90, 0xD3, 0x9F, 0xC1, 0x21, 0x5B, + 0xAD, 0xDC, 0x74, 0x13, 0x64, 0x3D, 0x85, 0xC2, + 0x1C, 0x3E, 0xEE, 0x5D, 0x2D, 0xD3, 0x28, 0x94 + }, + { + 0xDA, 0x70, 0xEE, 0xDD, 0x23, 0xE6, 0x63, 0xAA, + 0x1A, 0x74, 0xB9, 0x76, 0x69, 0x35, 0xB4, 0x79, + 0x22, 0x2A, 0x72, 0xAF, 0xBA, 0x5C, 0x79, 0x51, + 0x58, 0xDA, 0xD4, 0x1A, 0x3B, 0xD7, 0x7E, 0x40 + }, + { + 0xF0, 0x67, 0xED, 0x6A, 0x0D, 0xBD, 0x43, 0xAA, + 0x0A, 0x92, 0x54, 0xE6, 0x9F, 0xD6, 0x6B, 0xDD, + 0x8A, 0xCB, 0x87, 0xDE, 0x93, 0x6C, 0x25, 0x8C, + 0xFB, 0x02, 0x28, 0x5F, 0x2C, 0x11, 0xFA, 0x79 + }, + { + 0x71, 0x5C, 0x99, 0xC7, 0xD5, 0x75, 0x80, 0xCF, + 0x97, 0x53, 0xB4, 0xC1, 0xD7, 0x95, 0xE4, 0x5A, + 0x83, 0xFB, 0xB2, 0x28, 0xC0, 0xD3, 0x6F, 0xBE, + 0x20, 0xFA, 0xF3, 0x9B, 0xDD, 0x6D, 0x4E, 0x85 + }, + { + 0xE4, 0x57, 0xD6, 0xAD, 0x1E, 0x67, 0xCB, 0x9B, + 0xBD, 0x17, 0xCB, 0xD6, 0x98, 0xFA, 0x6D, 0x7D, + 0xAE, 0x0C, 0x9B, 0x7A, 0xD6, 0xCB, 0xD6, 0x53, + 0x96, 0x34, 0xE3, 0x2A, 0x71, 0x9C, 0x84, 0x92 + }, + { + 0xEC, 0xE3, 0xEA, 0x81, 0x03, 0xE0, 0x24, 0x83, + 0xC6, 0x4A, 0x70, 0xA4, 0xBD, 0xCE, 0xE8, 0xCE, + 0xB6, 0x27, 0x8F, 0x25, 0x33, 0xF3, 0xF4, 0x8D, + 0xBE, 0xED, 0xFB, 0xA9, 0x45, 0x31, 0xD4, 0xAE + }, + { + 0x38, 0x8A, 0xA5, 0xD3, 0x66, 0x7A, 0x97, 0xC6, + 0x8D, 0x3D, 0x56, 0xF8, 0xF3, 0xEE, 0x8D, 0x3D, + 0x36, 0x09, 0x1F, 0x17, 0xFE, 0x5D, 0x1B, 0x0D, + 0x5D, 0x84, 0xC9, 0x3B, 0x2F, 0xFE, 0x40, 0xBD + }, + { + 0x8B, 0x6B, 0x31, 0xB9, 0xAD, 0x7C, 0x3D, 0x5C, + 0xD8, 0x4B, 0xF9, 0x89, 0x47, 0xB9, 0xCD, 0xB5, + 0x9D, 0xF8, 0xA2, 0x5F, 0xF7, 0x38, 0x10, 0x10, + 0x13, 0xBE, 0x4F, 0xD6, 0x5E, 0x1D, 0xD1, 0xA3 + }, + { + 0x06, 0x62, 0x91, 0xF6, 0xBB, 0xD2, 0x5F, 0x3C, + 0x85, 0x3D, 0xB7, 0xD8, 0xB9, 0x5C, 0x9A, 0x1C, + 0xFB, 0x9B, 0xF1, 0xC1, 0xC9, 0x9F, 0xB9, 0x5A, + 0x9B, 0x78, 0x69, 0xD9, 0x0F, 0x1C, 0x29, 0x03 + }, + { + 0xA7, 0x07, 0xEF, 0xBC, 0xCD, 0xCE, 0xED, 0x42, + 0x96, 0x7A, 0x66, 0xF5, 0x53, 0x9B, 0x93, 0xED, + 0x75, 0x60, 0xD4, 0x67, 0x30, 0x40, 0x16, 0xC4, + 0x78, 0x0D, 0x77, 0x55, 0xA5, 0x65, 0xD4, 0xC4 + }, + { + 0x38, 0xC5, 0x3D, 0xFB, 0x70, 0xBE, 0x7E, 0x79, + 0x2B, 0x07, 0xA6, 0xA3, 0x5B, 0x8A, 0x6A, 0x0A, + 0xBA, 0x02, 0xC5, 0xC5, 0xF3, 0x8B, 0xAF, 0x5C, + 0x82, 0x3F, 0xDF, 0xD9, 0xE4, 0x2D, 0x65, 0x7E + }, + { + 0xF2, 0x91, 0x13, 0x86, 0x50, 0x1D, 0x9A, 0xB9, + 0xD7, 0x20, 0xCF, 0x8A, 0xD1, 0x05, 0x03, 0xD5, + 0x63, 0x4B, 0xF4, 0xB7, 0xD1, 0x2B, 0x56, 0xDF, + 0xB7, 0x4F, 0xEC, 0xC6, 0xE4, 0x09, 0x3F, 0x68 + }, + { + 0xC6, 0xF2, 0xBD, 0xD5, 0x2B, 0x81, 0xE6, 0xE4, + 0xF6, 0x59, 0x5A, 0xBD, 0x4D, 0x7F, 0xB3, 0x1F, + 0x65, 0x11, 0x69, 0xD0, 0x0F, 0xF3, 0x26, 0x92, + 0x6B, 0x34, 0x94, 0x7B, 0x28, 0xA8, 0x39, 0x59 + }, + { + 0x29, 0x3D, 0x94, 0xB1, 0x8C, 0x98, 0xBB, 0x32, + 0x23, 0x36, 0x6B, 0x8C, 0xE7, 0x4C, 0x28, 0xFB, + 0xDF, 0x28, 0xE1, 0xF8, 0x4A, 0x33, 0x50, 0xB0, + 0xEB, 0x2D, 0x18, 0x04, 0xA5, 0x77, 0x57, 0x9B + }, + { + 0x2C, 0x2F, 0xA5, 0xC0, 0xB5, 0x15, 0x33, 0x16, + 0x5B, 0xC3, 0x75, 0xC2, 0x2E, 0x27, 0x81, 0x76, + 0x82, 0x70, 0xA3, 0x83, 0x98, 0x5D, 0x13, 0xBD, + 0x6B, 0x67, 0xB6, 0xFD, 0x67, 0xF8, 0x89, 0xEB + }, + { + 0xCA, 0xA0, 0x9B, 0x82, 0xB7, 0x25, 0x62, 0xE4, + 0x3F, 0x4B, 0x22, 0x75, 0xC0, 0x91, 0x91, 0x8E, + 0x62, 0x4D, 0x91, 0x16, 0x61, 0xCC, 0x81, 0x1B, + 0xB5, 0xFA, 0xEC, 0x51, 0xF6, 0x08, 0x8E, 0xF7 + }, + { + 0x24, 0x76, 0x1E, 0x45, 0xE6, 0x74, 0x39, 0x53, + 0x79, 0xFB, 0x17, 0x72, 0x9C, 0x78, 0xCB, 0x93, + 0x9E, 0x6F, 0x74, 0xC5, 0xDF, 0xFB, 0x9C, 0x96, + 0x1F, 0x49, 0x59, 0x82, 0xC3, 0xED, 0x1F, 0xE3 + }, + { + 0x55, 0xB7, 0x0A, 0x82, 0x13, 0x1E, 0xC9, 0x48, + 0x88, 0xD7, 0xAB, 0x54, 0xA7, 0xC5, 0x15, 0x25, + 0x5C, 0x39, 0x38, 0xBB, 0x10, 0xBC, 0x78, 0x4D, + 0xC9, 0xB6, 0x7F, 0x07, 0x6E, 0x34, 0x1A, 0x73 + }, + { + 0x6A, 0xB9, 0x05, 0x7B, 0x97, 0x7E, 0xBC, 0x3C, + 0xA4, 0xD4, 0xCE, 0x74, 0x50, 0x6C, 0x25, 0xCC, + 0xCD, 0xC5, 0x66, 0x49, 0x7C, 0x45, 0x0B, 0x54, + 0x15, 0xA3, 0x94, 0x86, 0xF8, 0x65, 0x7A, 0x03 + }, + { + 0x24, 0x06, 0x6D, 0xEE, 0xE0, 0xEC, 0xEE, 0x15, + 0xA4, 0x5F, 0x0A, 0x32, 0x6D, 0x0F, 0x8D, 0xBC, + 0x79, 0x76, 0x1E, 0xBB, 0x93, 0xCF, 0x8C, 0x03, + 0x77, 0xAF, 0x44, 0x09, 0x78, 0xFC, 0xF9, 0x94 + }, + { + 0x20, 0x00, 0x0D, 0x3F, 0x66, 0xBA, 0x76, 0x86, + 0x0D, 0x5A, 0x95, 0x06, 0x88, 0xB9, 0xAA, 0x0D, + 0x76, 0xCF, 0xEA, 0x59, 0xB0, 0x05, 0xD8, 0x59, + 0x91, 0x4B, 0x1A, 0x46, 0x65, 0x3A, 0x93, 0x9B + }, + { + 0xB9, 0x2D, 0xAA, 0x79, 0x60, 0x3E, 0x3B, 0xDB, + 0xC3, 0xBF, 0xE0, 0xF4, 0x19, 0xE4, 0x09, 0xB2, + 0xEA, 0x10, 0xDC, 0x43, 0x5B, 0xEE, 0xFE, 0x29, + 0x59, 0xDA, 0x16, 0x89, 0x5D, 0x5D, 0xCA, 0x1C + }, + { + 0xE9, 0x47, 0x94, 0x87, 0x05, 0xB2, 0x06, 0xD5, + 0x72, 0xB0, 0xE8, 0xF6, 0x2F, 0x66, 0xA6, 0x55, + 0x1C, 0xBD, 0x6B, 0xC3, 0x05, 0xD2, 0x6C, 0xE7, + 0x53, 0x9A, 0x12, 0xF9, 0xAA, 0xDF, 0x75, 0x71 + }, + { + 0x3D, 0x67, 0xC1, 0xB3, 0xF9, 0xB2, 0x39, 0x10, + 0xE3, 0xD3, 0x5E, 0x6B, 0x0F, 0x2C, 0xCF, 0x44, + 0xA0, 0xB5, 0x40, 0xA4, 0x5C, 0x18, 0xBA, 0x3C, + 0x36, 0x26, 0x4D, 0xD4, 0x8E, 0x96, 0xAF, 0x6A + }, + { + 0xC7, 0x55, 0x8B, 0xAB, 0xDA, 0x04, 0xBC, 0xCB, + 0x76, 0x4D, 0x0B, 0xBF, 0x33, 0x58, 0x42, 0x51, + 0x41, 0x90, 0x2D, 0x22, 0x39, 0x1D, 0x9F, 0x8C, + 0x59, 0x15, 0x9F, 0xEC, 0x9E, 0x49, 0xB1, 0x51 + }, + { + 0x0B, 0x73, 0x2B, 0xB0, 0x35, 0x67, 0x5A, 0x50, + 0xFF, 0x58, 0xF2, 0xC2, 0x42, 0xE4, 0x71, 0x0A, + 0xEC, 0xE6, 0x46, 0x70, 0x07, 0x9C, 0x13, 0x04, + 0x4C, 0x79, 0xC9, 0xB7, 0x49, 0x1F, 0x70, 0x00 + }, + { + 0xD1, 0x20, 0xB5, 0xEF, 0x6D, 0x57, 0xEB, 0xF0, + 0x6E, 0xAF, 0x96, 0xBC, 0x93, 0x3C, 0x96, 0x7B, + 0x16, 0xCB, 0xE6, 0xE2, 0xBF, 0x00, 0x74, 0x1C, + 0x30, 0xAA, 0x1C, 0x54, 0xBA, 0x64, 0x80, 0x1F + }, + { + 0x58, 0xD2, 0x12, 0xAD, 0x6F, 0x58, 0xAE, 0xF0, + 0xF8, 0x01, 0x16, 0xB4, 0x41, 0xE5, 0x7F, 0x61, + 0x95, 0xBF, 0xEF, 0x26, 0xB6, 0x14, 0x63, 0xED, + 0xEC, 0x11, 0x83, 0xCD, 0xB0, 0x4F, 0xE7, 0x6D + }, + { + 0xB8, 0x83, 0x6F, 0x51, 0xD1, 0xE2, 0x9B, 0xDF, + 0xDB, 0xA3, 0x25, 0x56, 0x53, 0x60, 0x26, 0x8B, + 0x8F, 0xAD, 0x62, 0x74, 0x73, 0xED, 0xEC, 0xEF, + 0x7E, 0xAE, 0xFE, 0xE8, 0x37, 0xC7, 0x40, 0x03 + }, + { + 0xC5, 0x47, 0xA3, 0xC1, 0x24, 0xAE, 0x56, 0x85, + 0xFF, 0xA7, 0xB8, 0xED, 0xAF, 0x96, 0xEC, 0x86, + 0xF8, 0xB2, 0xD0, 0xD5, 0x0C, 0xEE, 0x8B, 0xE3, + 0xB1, 0xF0, 0xC7, 0x67, 0x63, 0x06, 0x9D, 0x9C + }, + { + 0x5D, 0x16, 0x8B, 0x76, 0x9A, 0x2F, 0x67, 0x85, + 0x3D, 0x62, 0x95, 0xF7, 0x56, 0x8B, 0xE4, 0x0B, + 0xB7, 0xA1, 0x6B, 0x8D, 0x65, 0xBA, 0x87, 0x63, + 0x5D, 0x19, 0x78, 0xD2, 0xAB, 0x11, 0xBA, 0x2A + }, + { + 0xA2, 0xF6, 0x75, 0xDC, 0x73, 0x02, 0x63, 0x8C, + 0xB6, 0x02, 0x01, 0x06, 0x4C, 0xA5, 0x50, 0x77, + 0x71, 0x4D, 0x71, 0xFE, 0x09, 0x6A, 0x31, 0x5F, + 0x2F, 0xE7, 0x40, 0x12, 0x77, 0xCA, 0xA5, 0xAF + }, + { + 0xC8, 0xAA, 0xB5, 0xCD, 0x01, 0x60, 0xAE, 0x78, + 0xCD, 0x2E, 0x8A, 0xC5, 0xFB, 0x0E, 0x09, 0x3C, + 0xDB, 0x5C, 0x4B, 0x60, 0x52, 0xA0, 0xA9, 0x7B, + 0xB0, 0x42, 0x16, 0x82, 0x6F, 0xA7, 0xA4, 0x37 + }, + { + 0xFF, 0x68, 0xCA, 0x40, 0x35, 0xBF, 0xEB, 0x43, + 0xFB, 0xF1, 0x45, 0xFD, 0xDD, 0x5E, 0x43, 0xF1, + 0xCE, 0xA5, 0x4F, 0x11, 0xF7, 0xBE, 0xE1, 0x30, + 0x58, 0xF0, 0x27, 0x32, 0x9A, 0x4A, 0x5F, 0xA4 + }, + { + 0x1D, 0x4E, 0x54, 0x87, 0xAE, 0x3C, 0x74, 0x0F, + 0x2B, 0xA6, 0xE5, 0x41, 0xAC, 0x91, 0xBC, 0x2B, + 0xFC, 0xD2, 0x99, 0x9C, 0x51, 0x8D, 0x80, 0x7B, + 0x42, 0x67, 0x48, 0x80, 0x3A, 0x35, 0x0F, 0xD4 + }, + { + 0x6D, 0x24, 0x4E, 0x1A, 0x06, 0xCE, 0x4E, 0xF5, + 0x78, 0xDD, 0x0F, 0x63, 0xAF, 0xF0, 0x93, 0x67, + 0x06, 0x73, 0x51, 0x19, 0xCA, 0x9C, 0x8D, 0x22, + 0xD8, 0x6C, 0x80, 0x14, 0x14, 0xAB, 0x97, 0x41 + }, + { + 0xDE, 0xCF, 0x73, 0x29, 0xDB, 0xCC, 0x82, 0x7B, + 0x8F, 0xC5, 0x24, 0xC9, 0x43, 0x1E, 0x89, 0x98, + 0x02, 0x9E, 0xCE, 0x12, 0xCE, 0x93, 0xB7, 0xB2, + 0xF3, 0xE7, 0x69, 0xA9, 0x41, 0xFB, 0x8C, 0xEA + }, + { + 0x2F, 0xAF, 0xCC, 0x0F, 0x2E, 0x63, 0xCB, 0xD0, + 0x77, 0x55, 0xBE, 0x7B, 0x75, 0xEC, 0xEA, 0x0A, + 0xDF, 0xF9, 0xAA, 0x5E, 0xDE, 0x2A, 0x52, 0xFD, + 0xAB, 0x4D, 0xFD, 0x03, 0x74, 0xCD, 0x48, 0x3F + }, + { + 0xAA, 0x85, 0x01, 0x0D, 0xD4, 0x6A, 0x54, 0x6B, + 0x53, 0x5E, 0xF4, 0xCF, 0x5F, 0x07, 0xD6, 0x51, + 0x61, 0xE8, 0x98, 0x28, 0xF3, 0xA7, 0x7D, 0xB7, + 0xB9, 0xB5, 0x6F, 0x0D, 0xF5, 0x9A, 0xAE, 0x45 + }, + { + 0x07, 0xE8, 0xE1, 0xEE, 0x73, 0x2C, 0xB0, 0xD3, + 0x56, 0xC9, 0xC0, 0xD1, 0x06, 0x9C, 0x89, 0xD1, + 0x7A, 0xDF, 0x6A, 0x9A, 0x33, 0x4F, 0x74, 0x5E, + 0xC7, 0x86, 0x73, 0x32, 0x54, 0x8C, 0xA8, 0xE9 + }, + { + 0x0E, 0x01, 0xE8, 0x1C, 0xAD, 0xA8, 0x16, 0x2B, + 0xFD, 0x5F, 0x8A, 0x8C, 0x81, 0x8A, 0x6C, 0x69, + 0xFE, 0xDF, 0x02, 0xCE, 0xB5, 0x20, 0x85, 0x23, + 0xCB, 0xE5, 0x31, 0x3B, 0x89, 0xCA, 0x10, 0x53 + }, + { + 0x6B, 0xB6, 0xC6, 0x47, 0x26, 0x55, 0x08, 0x43, + 0x99, 0x85, 0x2E, 0x00, 0x24, 0x9F, 0x8C, 0xB2, + 0x47, 0x89, 0x6D, 0x39, 0x2B, 0x02, 0xD7, 0x3B, + 0x7F, 0x0D, 0xD8, 0x18, 0xE1, 0xE2, 0x9B, 0x07 + }, + { + 0x42, 0xD4, 0x63, 0x6E, 0x20, 0x60, 0xF0, 0x8F, + 0x41, 0xC8, 0x82, 0xE7, 0x6B, 0x39, 0x6B, 0x11, + 0x2E, 0xF6, 0x27, 0xCC, 0x24, 0xC4, 0x3D, 0xD5, + 0xF8, 0x3A, 0x1D, 0x1A, 0x7E, 0xAD, 0x71, 0x1A + }, + { + 0x48, 0x58, 0xC9, 0xA1, 0x88, 0xB0, 0x23, 0x4F, + 0xB9, 0xA8, 0xD4, 0x7D, 0x0B, 0x41, 0x33, 0x65, + 0x0A, 0x03, 0x0B, 0xD0, 0x61, 0x1B, 0x87, 0xC3, + 0x89, 0x2E, 0x94, 0x95, 0x1F, 0x8D, 0xF8, 0x52 + }, + { + 0x3F, 0xAB, 0x3E, 0x36, 0x98, 0x8D, 0x44, 0x5A, + 0x51, 0xC8, 0x78, 0x3E, 0x53, 0x1B, 0xE3, 0xA0, + 0x2B, 0xE4, 0x0C, 0xD0, 0x47, 0x96, 0xCF, 0xB6, + 0x1D, 0x40, 0x34, 0x74, 0x42, 0xD3, 0xF7, 0x94 + }, + { + 0xEB, 0xAB, 0xC4, 0x96, 0x36, 0xBD, 0x43, 0x3D, + 0x2E, 0xC8, 0xF0, 0xE5, 0x18, 0x73, 0x2E, 0xF8, + 0xFA, 0x21, 0xD4, 0xD0, 0x71, 0xCC, 0x3B, 0xC4, + 0x6C, 0xD7, 0x9F, 0xA3, 0x8A, 0x28, 0xB8, 0x10 + }, + { + 0xA1, 0xD0, 0x34, 0x35, 0x23, 0xB8, 0x93, 0xFC, + 0xA8, 0x4F, 0x47, 0xFE, 0xB4, 0xA6, 0x4D, 0x35, + 0x0A, 0x17, 0xD8, 0xEE, 0xF5, 0x49, 0x7E, 0xCE, + 0x69, 0x7D, 0x02, 0xD7, 0x91, 0x78, 0xB5, 0x91 + }, + { + 0x26, 0x2E, 0xBF, 0xD9, 0x13, 0x0B, 0x7D, 0x28, + 0x76, 0x0D, 0x08, 0xEF, 0x8B, 0xFD, 0x3B, 0x86, + 0xCD, 0xD3, 0xB2, 0x11, 0x3D, 0x2C, 0xAE, 0xF7, + 0xEA, 0x95, 0x1A, 0x30, 0x3D, 0xFA, 0x38, 0x46 + }, + { + 0xF7, 0x61, 0x58, 0xED, 0xD5, 0x0A, 0x15, 0x4F, + 0xA7, 0x82, 0x03, 0xED, 0x23, 0x62, 0x93, 0x2F, + 0xCB, 0x82, 0x53, 0xAA, 0xE3, 0x78, 0x90, 0x3E, + 0xDE, 0xD1, 0xE0, 0x3F, 0x70, 0x21, 0xA2, 0x57 + }, + { + 0x26, 0x17, 0x8E, 0x95, 0x0A, 0xC7, 0x22, 0xF6, + 0x7A, 0xE5, 0x6E, 0x57, 0x1B, 0x28, 0x4C, 0x02, + 0x07, 0x68, 0x4A, 0x63, 0x34, 0xA1, 0x77, 0x48, + 0xA9, 0x4D, 0x26, 0x0B, 0xC5, 0xF5, 0x52, 0x74 + }, + { + 0xC3, 0x78, 0xD1, 0xE4, 0x93, 0xB4, 0x0E, 0xF1, + 0x1F, 0xE6, 0xA1, 0x5D, 0x9C, 0x27, 0x37, 0xA3, + 0x78, 0x09, 0x63, 0x4C, 0x5A, 0xBA, 0xD5, 0xB3, + 0x3D, 0x7E, 0x39, 0x3B, 0x4A, 0xE0, 0x5D, 0x03 + }, + { + 0x98, 0x4B, 0xD8, 0x37, 0x91, 0x01, 0xBE, 0x8F, + 0xD8, 0x06, 0x12, 0xD8, 0xEA, 0x29, 0x59, 0xA7, + 0x86, 0x5E, 0xC9, 0x71, 0x85, 0x23, 0x55, 0x01, + 0x07, 0xAE, 0x39, 0x38, 0xDF, 0x32, 0x01, 0x1B + }, + { + 0xC6, 0xF2, 0x5A, 0x81, 0x2A, 0x14, 0x48, 0x58, + 0xAC, 0x5C, 0xED, 0x37, 0xA9, 0x3A, 0x9F, 0x47, + 0x59, 0xBA, 0x0B, 0x1C, 0x0F, 0xDC, 0x43, 0x1D, + 0xCE, 0x35, 0xF9, 0xEC, 0x1F, 0x1F, 0x4A, 0x99 + }, + { + 0x92, 0x4C, 0x75, 0xC9, 0x44, 0x24, 0xFF, 0x75, + 0xE7, 0x4B, 0x8B, 0x4E, 0x94, 0x35, 0x89, 0x58, + 0xB0, 0x27, 0xB1, 0x71, 0xDF, 0x5E, 0x57, 0x89, + 0x9A, 0xD0, 0xD4, 0xDA, 0xC3, 0x73, 0x53, 0xB6 + }, + { + 0x0A, 0xF3, 0x58, 0x92, 0xA6, 0x3F, 0x45, 0x93, + 0x1F, 0x68, 0x46, 0xED, 0x19, 0x03, 0x61, 0xCD, + 0x07, 0x30, 0x89, 0xE0, 0x77, 0x16, 0x57, 0x14, + 0xB5, 0x0B, 0x81, 0xA2, 0xE3, 0xDD, 0x9B, 0xA1 + }, + { + 0xCC, 0x80, 0xCE, 0xFB, 0x26, 0xC3, 0xB2, 0xB0, + 0xDA, 0xEF, 0x23, 0x3E, 0x60, 0x6D, 0x5F, 0xFC, + 0x80, 0xFA, 0x17, 0x42, 0x7D, 0x18, 0xE3, 0x04, + 0x89, 0x67, 0x3E, 0x06, 0xEF, 0x4B, 0x87, 0xF7 + }, + { + 0xC2, 0xF8, 0xC8, 0x11, 0x74, 0x47, 0xF3, 0x97, + 0x8B, 0x08, 0x18, 0xDC, 0xF6, 0xF7, 0x01, 0x16, + 0xAC, 0x56, 0xFD, 0x18, 0x4D, 0xD1, 0x27, 0x84, + 0x94, 0xE1, 0x03, 0xFC, 0x6D, 0x74, 0xA8, 0x87 + }, + { + 0xBD, 0xEC, 0xF6, 0xBF, 0xC1, 0xBA, 0x0D, 0xF6, + 0xE8, 0x62, 0xC8, 0x31, 0x99, 0x22, 0x07, 0x79, + 0x6A, 0xCC, 0x79, 0x79, 0x68, 0x35, 0x88, 0x28, + 0xC0, 0x6E, 0x7A, 0x51, 0xE0, 0x90, 0x09, 0x8F + }, + { + 0x24, 0xD1, 0xA2, 0x6E, 0x3D, 0xAB, 0x02, 0xFE, + 0x45, 0x72, 0xD2, 0xAA, 0x7D, 0xBD, 0x3E, 0xC3, + 0x0F, 0x06, 0x93, 0xDB, 0x26, 0xF2, 0x73, 0xD0, + 0xAB, 0x2C, 0xB0, 0xC1, 0x3B, 0x5E, 0x64, 0x51 + }, + { + 0xEC, 0x56, 0xF5, 0x8B, 0x09, 0x29, 0x9A, 0x30, + 0x0B, 0x14, 0x05, 0x65, 0xD7, 0xD3, 0xE6, 0x87, + 0x82, 0xB6, 0xE2, 0xFB, 0xEB, 0x4B, 0x7E, 0xA9, + 0x7A, 0xC0, 0x57, 0x98, 0x90, 0x61, 0xDD, 0x3F + }, + { + 0x11, 0xA4, 0x37, 0xC1, 0xAB, 0xA3, 0xC1, 0x19, + 0xDD, 0xFA, 0xB3, 0x1B, 0x3E, 0x8C, 0x84, 0x1D, + 0xEE, 0xEB, 0x91, 0x3E, 0xF5, 0x7F, 0x7E, 0x48, + 0xF2, 0xC9, 0xCF, 0x5A, 0x28, 0xFA, 0x42, 0xBC + }, + { + 0x53, 0xC7, 0xE6, 0x11, 0x4B, 0x85, 0x0A, 0x2C, + 0xB4, 0x96, 0xC9, 0xB3, 0xC6, 0x9A, 0x62, 0x3E, + 0xAE, 0xA2, 0xCB, 0x1D, 0x33, 0xDD, 0x81, 0x7E, + 0x47, 0x65, 0xED, 0xAA, 0x68, 0x23, 0xC2, 0x28 + }, + { + 0x15, 0x4C, 0x3E, 0x96, 0xFE, 0xE5, 0xDB, 0x14, + 0xF8, 0x77, 0x3E, 0x18, 0xAF, 0x14, 0x85, 0x79, + 0x13, 0x50, 0x9D, 0xA9, 0x99, 0xB4, 0x6C, 0xDD, + 0x3D, 0x4C, 0x16, 0x97, 0x60, 0xC8, 0x3A, 0xD2 + }, + { + 0x40, 0xB9, 0x91, 0x6F, 0x09, 0x3E, 0x02, 0x7A, + 0x87, 0x86, 0x64, 0x18, 0x18, 0x92, 0x06, 0x20, + 0x47, 0x2F, 0xBC, 0xF6, 0x8F, 0x70, 0x1D, 0x1B, + 0x68, 0x06, 0x32, 0xE6, 0x99, 0x6B, 0xDE, 0xD3 + }, + { + 0x24, 0xC4, 0xCB, 0xBA, 0x07, 0x11, 0x98, 0x31, + 0xA7, 0x26, 0xB0, 0x53, 0x05, 0xD9, 0x6D, 0xA0, + 0x2F, 0xF8, 0xB1, 0x48, 0xF0, 0xDA, 0x44, 0x0F, + 0xE2, 0x33, 0xBC, 0xAA, 0x32, 0xC7, 0x2F, 0x6F + }, + { + 0x5D, 0x20, 0x15, 0x10, 0x25, 0x00, 0x20, 0xB7, + 0x83, 0x68, 0x96, 0x88, 0xAB, 0xBF, 0x8E, 0xCF, + 0x25, 0x94, 0xA9, 0x6A, 0x08, 0xF2, 0xBF, 0xEC, + 0x6C, 0xE0, 0x57, 0x44, 0x65, 0xDD, 0xED, 0x71 + }, + { + 0x04, 0x3B, 0x97, 0xE3, 0x36, 0xEE, 0x6F, 0xDB, + 0xBE, 0x2B, 0x50, 0xF2, 0x2A, 0xF8, 0x32, 0x75, + 0xA4, 0x08, 0x48, 0x05, 0xD2, 0xD5, 0x64, 0x59, + 0x62, 0x45, 0x4B, 0x6C, 0x9B, 0x80, 0x53, 0xA0 + }, + { + 0x56, 0x48, 0x35, 0xCB, 0xAE, 0xA7, 0x74, 0x94, + 0x85, 0x68, 0xBE, 0x36, 0xCF, 0x52, 0xFC, 0xDD, + 0x83, 0x93, 0x4E, 0xB0, 0xA2, 0x75, 0x12, 0xDB, + 0xE3, 0xE2, 0xDB, 0x47, 0xB9, 0xE6, 0x63, 0x5A + }, + { + 0xF2, 0x1C, 0x33, 0xF4, 0x7B, 0xDE, 0x40, 0xA2, + 0xA1, 0x01, 0xC9, 0xCD, 0xE8, 0x02, 0x7A, 0xAF, + 0x61, 0xA3, 0x13, 0x7D, 0xE2, 0x42, 0x2B, 0x30, + 0x03, 0x5A, 0x04, 0xC2, 0x70, 0x89, 0x41, 0x83 + }, + { + 0x9D, 0xB0, 0xEF, 0x74, 0xE6, 0x6C, 0xBB, 0x84, + 0x2E, 0xB0, 0xE0, 0x73, 0x43, 0xA0, 0x3C, 0x5C, + 0x56, 0x7E, 0x37, 0x2B, 0x3F, 0x23, 0xB9, 0x43, + 0xC7, 0x88, 0xA4, 0xF2, 0x50, 0xF6, 0x78, 0x91 + }, + { + 0xAB, 0x8D, 0x08, 0x65, 0x5F, 0xF1, 0xD3, 0xFE, + 0x87, 0x58, 0xD5, 0x62, 0x23, 0x5F, 0xD2, 0x3E, + 0x7C, 0xF9, 0xDC, 0xAA, 0xD6, 0x58, 0x87, 0x2A, + 0x49, 0xE5, 0xD3, 0x18, 0x3B, 0x6C, 0xCE, 0xBD + }, + { + 0x6F, 0x27, 0xF7, 0x7E, 0x7B, 0xCF, 0x46, 0xA1, + 0xE9, 0x63, 0xAD, 0xE0, 0x30, 0x97, 0x33, 0x54, + 0x30, 0x31, 0xDC, 0xCD, 0xD4, 0x7C, 0xAA, 0xC1, + 0x74, 0xD7, 0xD2, 0x7C, 0xE8, 0x07, 0x7E, 0x8B + }, + { + 0xE3, 0xCD, 0x54, 0xDA, 0x7E, 0x44, 0x4C, 0xAA, + 0x62, 0x07, 0x56, 0x95, 0x25, 0xA6, 0x70, 0xEB, + 0xAE, 0x12, 0x78, 0xDE, 0x4E, 0x3F, 0xE2, 0x68, + 0x4B, 0x3E, 0x33, 0xF5, 0xEF, 0x90, 0xCC, 0x1B + }, + { + 0xB2, 0xC3, 0xE3, 0x3A, 0x51, 0xD2, 0x2C, 0x4C, + 0x08, 0xFC, 0x09, 0x89, 0xC8, 0x73, 0xC9, 0xCC, + 0x41, 0x50, 0x57, 0x9B, 0x1E, 0x61, 0x63, 0xFA, + 0x69, 0x4A, 0xD5, 0x1D, 0x53, 0xD7, 0x12, 0xDC + }, + { + 0xBE, 0x7F, 0xDA, 0x98, 0x3E, 0x13, 0x18, 0x9B, + 0x4C, 0x77, 0xE0, 0xA8, 0x09, 0x20, 0xB6, 0xE0, + 0xE0, 0xEA, 0x80, 0xC3, 0xB8, 0x4D, 0xBE, 0x7E, + 0x71, 0x17, 0xD2, 0x53, 0xF4, 0x81, 0x12, 0xF4 + }, + { + 0xB6, 0x00, 0x8C, 0x28, 0xFA, 0xE0, 0x8A, 0xA4, + 0x27, 0xE5, 0xBD, 0x3A, 0xAD, 0x36, 0xF1, 0x00, + 0x21, 0xF1, 0x6C, 0x77, 0xCF, 0xEA, 0xBE, 0xD0, + 0x7F, 0x97, 0xCC, 0x7D, 0xC1, 0xF1, 0x28, 0x4A + }, + { + 0x6E, 0x4E, 0x67, 0x60, 0xC5, 0x38, 0xF2, 0xE9, + 0x7B, 0x3A, 0xDB, 0xFB, 0xBC, 0xDE, 0x57, 0xF8, + 0x96, 0x6B, 0x7E, 0xA8, 0xFC, 0xB5, 0xBF, 0x7E, + 0xFE, 0xC9, 0x13, 0xFD, 0x2A, 0x2B, 0x0C, 0x55 + }, + { + 0x4A, 0xE5, 0x1F, 0xD1, 0x83, 0x4A, 0xA5, 0xBD, + 0x9A, 0x6F, 0x7E, 0xC3, 0x9F, 0xC6, 0x63, 0x33, + 0x8D, 0xC5, 0xD2, 0xE2, 0x07, 0x61, 0x56, 0x6D, + 0x90, 0xCC, 0x68, 0xB1, 0xCB, 0x87, 0x5E, 0xD8 + }, + { + 0xB6, 0x73, 0xAA, 0xD7, 0x5A, 0xB1, 0xFD, 0xB5, + 0x40, 0x1A, 0xBF, 0xA1, 0xBF, 0x89, 0xF3, 0xAD, + 0xD2, 0xEB, 0xC4, 0x68, 0xDF, 0x36, 0x24, 0xA4, + 0x78, 0xF4, 0xFE, 0x85, 0x9D, 0x8D, 0x55, 0xE2 + }, + { + 0x13, 0xC9, 0x47, 0x1A, 0x98, 0x55, 0x91, 0x35, + 0x39, 0x83, 0x66, 0x60, 0x39, 0x8D, 0xA0, 0xF3, + 0xF9, 0x9A, 0xDA, 0x08, 0x47, 0x9C, 0x69, 0xD1, + 0xB7, 0xFC, 0xAA, 0x34, 0x61, 0xDD, 0x7E, 0x59 + }, + { + 0x2C, 0x11, 0xF4, 0xA7, 0xF9, 0x9A, 0x1D, 0x23, + 0xA5, 0x8B, 0xB6, 0x36, 0x35, 0x0F, 0xE8, 0x49, + 0xF2, 0x9C, 0xBA, 0xC1, 0xB2, 0xA1, 0x11, 0x2D, + 0x9F, 0x1E, 0xD5, 0xBC, 0x5B, 0x31, 0x3C, 0xCD + }, + { + 0xC7, 0xD3, 0xC0, 0x70, 0x6B, 0x11, 0xAE, 0x74, + 0x1C, 0x05, 0xA1, 0xEF, 0x15, 0x0D, 0xD6, 0x5B, + 0x54, 0x94, 0xD6, 0xD5, 0x4C, 0x9A, 0x86, 0xE2, + 0x61, 0x78, 0x54, 0xE6, 0xAE, 0xEE, 0xBB, 0xD9 + }, + { + 0x19, 0x4E, 0x10, 0xC9, 0x38, 0x93, 0xAF, 0xA0, + 0x64, 0xC3, 0xAC, 0x04, 0xC0, 0xDD, 0x80, 0x8D, + 0x79, 0x1C, 0x3D, 0x4B, 0x75, 0x56, 0xE8, 0x9D, + 0x8D, 0x9C, 0xB2, 0x25, 0xC4, 0xB3, 0x33, 0x39 + }, + { + 0x6F, 0xC4, 0x98, 0x8B, 0x8F, 0x78, 0x54, 0x6B, + 0x16, 0x88, 0x99, 0x18, 0x45, 0x90, 0x8F, 0x13, + 0x4B, 0x6A, 0x48, 0x2E, 0x69, 0x94, 0xB3, 0xD4, + 0x83, 0x17, 0xBF, 0x08, 0xDB, 0x29, 0x21, 0x85 + }, + { + 0x56, 0x65, 0xBE, 0xB8, 0xB0, 0x95, 0x55, 0x25, + 0x81, 0x3B, 0x59, 0x81, 0xCD, 0x14, 0x2E, 0xD4, + 0xD0, 0x3F, 0xBA, 0x38, 0xA6, 0xF3, 0xE5, 0xAD, + 0x26, 0x8E, 0x0C, 0xC2, 0x70, 0xD1, 0xCD, 0x11 + }, + { + 0xB8, 0x83, 0xD6, 0x8F, 0x5F, 0xE5, 0x19, 0x36, + 0x43, 0x1B, 0xA4, 0x25, 0x67, 0x38, 0x05, 0x3B, + 0x1D, 0x04, 0x26, 0xD4, 0xCB, 0x64, 0xB1, 0x6E, + 0x83, 0xBA, 0xDC, 0x5E, 0x9F, 0xBE, 0x3B, 0x81 + }, + { + 0x53, 0xE7, 0xB2, 0x7E, 0xA5, 0x9C, 0x2F, 0x6D, + 0xBB, 0x50, 0x76, 0x9E, 0x43, 0x55, 0x4D, 0xF3, + 0x5A, 0xF8, 0x9F, 0x48, 0x22, 0xD0, 0x46, 0x6B, + 0x00, 0x7D, 0xD6, 0xF6, 0xDE, 0xAF, 0xFF, 0x02 + }, + { + 0x1F, 0x1A, 0x02, 0x29, 0xD4, 0x64, 0x0F, 0x01, + 0x90, 0x15, 0x88, 0xD9, 0xDE, 0xC2, 0x2D, 0x13, + 0xFC, 0x3E, 0xB3, 0x4A, 0x61, 0xB3, 0x29, 0x38, + 0xEF, 0xBF, 0x53, 0x34, 0xB2, 0x80, 0x0A, 0xFA + }, + { + 0xC2, 0xB4, 0x05, 0xAF, 0xA0, 0xFA, 0x66, 0x68, + 0x85, 0x2A, 0xEE, 0x4D, 0x88, 0x04, 0x08, 0x53, + 0xFA, 0xB8, 0x00, 0xE7, 0x2B, 0x57, 0x58, 0x14, + 0x18, 0xE5, 0x50, 0x6F, 0x21, 0x4C, 0x7D, 0x1F + }, + { + 0xC0, 0x8A, 0xA1, 0xC2, 0x86, 0xD7, 0x09, 0xFD, + 0xC7, 0x47, 0x37, 0x44, 0x97, 0x71, 0x88, 0xC8, + 0x95, 0xBA, 0x01, 0x10, 0x14, 0x24, 0x7E, 0x4E, + 0xFA, 0x8D, 0x07, 0xE7, 0x8F, 0xEC, 0x69, 0x5C + }, + { + 0xF0, 0x3F, 0x57, 0x89, 0xD3, 0x33, 0x6B, 0x80, + 0xD0, 0x02, 0xD5, 0x9F, 0xDF, 0x91, 0x8B, 0xDB, + 0x77, 0x5B, 0x00, 0x95, 0x6E, 0xD5, 0x52, 0x8E, + 0x86, 0xAA, 0x99, 0x4A, 0xCB, 0x38, 0xFE, 0x2D + }, +}; + + + + +static const uint8_t blake2s_keyed_kat[KAT_LENGTH][BLAKE2S_OUTBYTES] = +{ + { + 0x48, 0xA8, 0x99, 0x7D, 0xA4, 0x07, 0x87, 0x6B, + 0x3D, 0x79, 0xC0, 0xD9, 0x23, 0x25, 0xAD, 0x3B, + 0x89, 0xCB, 0xB7, 0x54, 0xD8, 0x6A, 0xB7, 0x1A, + 0xEE, 0x04, 0x7A, 0xD3, 0x45, 0xFD, 0x2C, 0x49 + }, + { + 0x40, 0xD1, 0x5F, 0xEE, 0x7C, 0x32, 0x88, 0x30, + 0x16, 0x6A, 0xC3, 0xF9, 0x18, 0x65, 0x0F, 0x80, + 0x7E, 0x7E, 0x01, 0xE1, 0x77, 0x25, 0x8C, 0xDC, + 0x0A, 0x39, 0xB1, 0x1F, 0x59, 0x80, 0x66, 0xF1 + }, + { + 0x6B, 0xB7, 0x13, 0x00, 0x64, 0x4C, 0xD3, 0x99, + 0x1B, 0x26, 0xCC, 0xD4, 0xD2, 0x74, 0xAC, 0xD1, + 0xAD, 0xEA, 0xB8, 0xB1, 0xD7, 0x91, 0x45, 0x46, + 0xC1, 0x19, 0x8B, 0xBE, 0x9F, 0xC9, 0xD8, 0x03 + }, + { + 0x1D, 0x22, 0x0D, 0xBE, 0x2E, 0xE1, 0x34, 0x66, + 0x1F, 0xDF, 0x6D, 0x9E, 0x74, 0xB4, 0x17, 0x04, + 0x71, 0x05, 0x56, 0xF2, 0xF6, 0xE5, 0xA0, 0x91, + 0xB2, 0x27, 0x69, 0x74, 0x45, 0xDB, 0xEA, 0x6B + }, + { + 0xF6, 0xC3, 0xFB, 0xAD, 0xB4, 0xCC, 0x68, 0x7A, + 0x00, 0x64, 0xA5, 0xBE, 0x6E, 0x79, 0x1B, 0xEC, + 0x63, 0xB8, 0x68, 0xAD, 0x62, 0xFB, 0xA6, 0x1B, + 0x37, 0x57, 0xEF, 0x9C, 0xA5, 0x2E, 0x05, 0xB2 + }, + { + 0x49, 0xC1, 0xF2, 0x11, 0x88, 0xDF, 0xD7, 0x69, + 0xAE, 0xA0, 0xE9, 0x11, 0xDD, 0x6B, 0x41, 0xF1, + 0x4D, 0xAB, 0x10, 0x9D, 0x2B, 0x85, 0x97, 0x7A, + 0xA3, 0x08, 0x8B, 0x5C, 0x70, 0x7E, 0x85, 0x98 + }, + { + 0xFD, 0xD8, 0x99, 0x3D, 0xCD, 0x43, 0xF6, 0x96, + 0xD4, 0x4F, 0x3C, 0xEA, 0x0F, 0xF3, 0x53, 0x45, + 0x23, 0x4E, 0xC8, 0xEE, 0x08, 0x3E, 0xB3, 0xCA, + 0xDA, 0x01, 0x7C, 0x7F, 0x78, 0xC1, 0x71, 0x43 + }, + { + 0xE6, 0xC8, 0x12, 0x56, 0x37, 0x43, 0x8D, 0x09, + 0x05, 0xB7, 0x49, 0xF4, 0x65, 0x60, 0xAC, 0x89, + 0xFD, 0x47, 0x1C, 0xF8, 0x69, 0x2E, 0x28, 0xFA, + 0xB9, 0x82, 0xF7, 0x3F, 0x01, 0x9B, 0x83, 0xA9 + }, + { + 0x19, 0xFC, 0x8C, 0xA6, 0x97, 0x9D, 0x60, 0xE6, + 0xED, 0xD3, 0xB4, 0x54, 0x1E, 0x2F, 0x96, 0x7C, + 0xED, 0x74, 0x0D, 0xF6, 0xEC, 0x1E, 0xAE, 0xBB, + 0xFE, 0x81, 0x38, 0x32, 0xE9, 0x6B, 0x29, 0x74 + }, + { + 0xA6, 0xAD, 0x77, 0x7C, 0xE8, 0x81, 0xB5, 0x2B, + 0xB5, 0xA4, 0x42, 0x1A, 0xB6, 0xCD, 0xD2, 0xDF, + 0xBA, 0x13, 0xE9, 0x63, 0x65, 0x2D, 0x4D, 0x6D, + 0x12, 0x2A, 0xEE, 0x46, 0x54, 0x8C, 0x14, 0xA7 + }, + { + 0xF5, 0xC4, 0xB2, 0xBA, 0x1A, 0x00, 0x78, 0x1B, + 0x13, 0xAB, 0xA0, 0x42, 0x52, 0x42, 0xC6, 0x9C, + 0xB1, 0x55, 0x2F, 0x3F, 0x71, 0xA9, 0xA3, 0xBB, + 0x22, 0xB4, 0xA6, 0xB4, 0x27, 0x7B, 0x46, 0xDD + }, + { + 0xE3, 0x3C, 0x4C, 0x9B, 0xD0, 0xCC, 0x7E, 0x45, + 0xC8, 0x0E, 0x65, 0xC7, 0x7F, 0xA5, 0x99, 0x7F, + 0xEC, 0x70, 0x02, 0x73, 0x85, 0x41, 0x50, 0x9E, + 0x68, 0xA9, 0x42, 0x38, 0x91, 0xE8, 0x22, 0xA3 + }, + { + 0xFB, 0xA1, 0x61, 0x69, 0xB2, 0xC3, 0xEE, 0x10, + 0x5B, 0xE6, 0xE1, 0xE6, 0x50, 0xE5, 0xCB, 0xF4, + 0x07, 0x46, 0xB6, 0x75, 0x3D, 0x03, 0x6A, 0xB5, + 0x51, 0x79, 0x01, 0x4A, 0xD7, 0xEF, 0x66, 0x51 + }, + { + 0xF5, 0xC4, 0xBE, 0xC6, 0xD6, 0x2F, 0xC6, 0x08, + 0xBF, 0x41, 0xCC, 0x11, 0x5F, 0x16, 0xD6, 0x1C, + 0x7E, 0xFD, 0x3F, 0xF6, 0xC6, 0x56, 0x92, 0xBB, + 0xE0, 0xAF, 0xFF, 0xB1, 0xFE, 0xDE, 0x74, 0x75 + }, + { + 0xA4, 0x86, 0x2E, 0x76, 0xDB, 0x84, 0x7F, 0x05, + 0xBA, 0x17, 0xED, 0xE5, 0xDA, 0x4E, 0x7F, 0x91, + 0xB5, 0x92, 0x5C, 0xF1, 0xAD, 0x4B, 0xA1, 0x27, + 0x32, 0xC3, 0x99, 0x57, 0x42, 0xA5, 0xCD, 0x6E + }, + { + 0x65, 0xF4, 0xB8, 0x60, 0xCD, 0x15, 0xB3, 0x8E, + 0xF8, 0x14, 0xA1, 0xA8, 0x04, 0x31, 0x4A, 0x55, + 0xBE, 0x95, 0x3C, 0xAA, 0x65, 0xFD, 0x75, 0x8A, + 0xD9, 0x89, 0xFF, 0x34, 0xA4, 0x1C, 0x1E, 0xEA + }, + { + 0x19, 0xBA, 0x23, 0x4F, 0x0A, 0x4F, 0x38, 0x63, + 0x7D, 0x18, 0x39, 0xF9, 0xD9, 0xF7, 0x6A, 0xD9, + 0x1C, 0x85, 0x22, 0x30, 0x71, 0x43, 0xC9, 0x7D, + 0x5F, 0x93, 0xF6, 0x92, 0x74, 0xCE, 0xC9, 0xA7 + }, + { + 0x1A, 0x67, 0x18, 0x6C, 0xA4, 0xA5, 0xCB, 0x8E, + 0x65, 0xFC, 0xA0, 0xE2, 0xEC, 0xBC, 0x5D, 0xDC, + 0x14, 0xAE, 0x38, 0x1B, 0xB8, 0xBF, 0xFE, 0xB9, + 0xE0, 0xA1, 0x03, 0x44, 0x9E, 0x3E, 0xF0, 0x3C + }, + { + 0xAF, 0xBE, 0xA3, 0x17, 0xB5, 0xA2, 0xE8, 0x9C, + 0x0B, 0xD9, 0x0C, 0xCF, 0x5D, 0x7F, 0xD0, 0xED, + 0x57, 0xFE, 0x58, 0x5E, 0x4B, 0xE3, 0x27, 0x1B, + 0x0A, 0x6B, 0xF0, 0xF5, 0x78, 0x6B, 0x0F, 0x26 + }, + { + 0xF1, 0xB0, 0x15, 0x58, 0xCE, 0x54, 0x12, 0x62, + 0xF5, 0xEC, 0x34, 0x29, 0x9D, 0x6F, 0xB4, 0x09, + 0x00, 0x09, 0xE3, 0x43, 0x4B, 0xE2, 0xF4, 0x91, + 0x05, 0xCF, 0x46, 0xAF, 0x4D, 0x2D, 0x41, 0x24 + }, + { + 0x13, 0xA0, 0xA0, 0xC8, 0x63, 0x35, 0x63, 0x5E, + 0xAA, 0x74, 0xCA, 0x2D, 0x5D, 0x48, 0x8C, 0x79, + 0x7B, 0xBB, 0x4F, 0x47, 0xDC, 0x07, 0x10, 0x50, + 0x15, 0xED, 0x6A, 0x1F, 0x33, 0x09, 0xEF, 0xCE + }, + { + 0x15, 0x80, 0xAF, 0xEE, 0xBE, 0xBB, 0x34, 0x6F, + 0x94, 0xD5, 0x9F, 0xE6, 0x2D, 0xA0, 0xB7, 0x92, + 0x37, 0xEA, 0xD7, 0xB1, 0x49, 0x1F, 0x56, 0x67, + 0xA9, 0x0E, 0x45, 0xED, 0xF6, 0xCA, 0x8B, 0x03 + }, + { + 0x20, 0xBE, 0x1A, 0x87, 0x5B, 0x38, 0xC5, 0x73, + 0xDD, 0x7F, 0xAA, 0xA0, 0xDE, 0x48, 0x9D, 0x65, + 0x5C, 0x11, 0xEF, 0xB6, 0xA5, 0x52, 0x69, 0x8E, + 0x07, 0xA2, 0xD3, 0x31, 0xB5, 0xF6, 0x55, 0xC3 + }, + { + 0xBE, 0x1F, 0xE3, 0xC4, 0xC0, 0x40, 0x18, 0xC5, + 0x4C, 0x4A, 0x0F, 0x6B, 0x9A, 0x2E, 0xD3, 0xC5, + 0x3A, 0xBE, 0x3A, 0x9F, 0x76, 0xB4, 0xD2, 0x6D, + 0xE5, 0x6F, 0xC9, 0xAE, 0x95, 0x05, 0x9A, 0x99 + }, + { + 0xE3, 0xE3, 0xAC, 0xE5, 0x37, 0xEB, 0x3E, 0xDD, + 0x84, 0x63, 0xD9, 0xAD, 0x35, 0x82, 0xE1, 0x3C, + 0xF8, 0x65, 0x33, 0xFF, 0xDE, 0x43, 0xD6, 0x68, + 0xDD, 0x2E, 0x93, 0xBB, 0xDB, 0xD7, 0x19, 0x5A + }, + { + 0x11, 0x0C, 0x50, 0xC0, 0xBF, 0x2C, 0x6E, 0x7A, + 0xEB, 0x7E, 0x43, 0x5D, 0x92, 0xD1, 0x32, 0xAB, + 0x66, 0x55, 0x16, 0x8E, 0x78, 0xA2, 0xDE, 0xCD, + 0xEC, 0x33, 0x30, 0x77, 0x76, 0x84, 0xD9, 0xC1 + }, + { + 0xE9, 0xBA, 0x8F, 0x50, 0x5C, 0x9C, 0x80, 0xC0, + 0x86, 0x66, 0xA7, 0x01, 0xF3, 0x36, 0x7E, 0x6C, + 0xC6, 0x65, 0xF3, 0x4B, 0x22, 0xE7, 0x3C, 0x3C, + 0x04, 0x17, 0xEB, 0x1C, 0x22, 0x06, 0x08, 0x2F + }, + { + 0x26, 0xCD, 0x66, 0xFC, 0xA0, 0x23, 0x79, 0xC7, + 0x6D, 0xF1, 0x23, 0x17, 0x05, 0x2B, 0xCA, 0xFD, + 0x6C, 0xD8, 0xC3, 0xA7, 0xB8, 0x90, 0xD8, 0x05, + 0xF3, 0x6C, 0x49, 0x98, 0x97, 0x82, 0x43, 0x3A + }, + { + 0x21, 0x3F, 0x35, 0x96, 0xD6, 0xE3, 0xA5, 0xD0, + 0xE9, 0x93, 0x2C, 0xD2, 0x15, 0x91, 0x46, 0x01, + 0x5E, 0x2A, 0xBC, 0x94, 0x9F, 0x47, 0x29, 0xEE, + 0x26, 0x32, 0xFE, 0x1E, 0xDB, 0x78, 0xD3, 0x37 + }, + { + 0x10, 0x15, 0xD7, 0x01, 0x08, 0xE0, 0x3B, 0xE1, + 0xC7, 0x02, 0xFE, 0x97, 0x25, 0x36, 0x07, 0xD1, + 0x4A, 0xEE, 0x59, 0x1F, 0x24, 0x13, 0xEA, 0x67, + 0x87, 0x42, 0x7B, 0x64, 0x59, 0xFF, 0x21, 0x9A + }, + { + 0x3C, 0xA9, 0x89, 0xDE, 0x10, 0xCF, 0xE6, 0x09, + 0x90, 0x94, 0x72, 0xC8, 0xD3, 0x56, 0x10, 0x80, + 0x5B, 0x2F, 0x97, 0x77, 0x34, 0xCF, 0x65, 0x2C, + 0xC6, 0x4B, 0x3B, 0xFC, 0x88, 0x2D, 0x5D, 0x89 + }, + { + 0xB6, 0x15, 0x6F, 0x72, 0xD3, 0x80, 0xEE, 0x9E, + 0xA6, 0xAC, 0xD1, 0x90, 0x46, 0x4F, 0x23, 0x07, + 0xA5, 0xC1, 0x79, 0xEF, 0x01, 0xFD, 0x71, 0xF9, + 0x9F, 0x2D, 0x0F, 0x7A, 0x57, 0x36, 0x0A, 0xEA + }, + { + 0xC0, 0x3B, 0xC6, 0x42, 0xB2, 0x09, 0x59, 0xCB, + 0xE1, 0x33, 0xA0, 0x30, 0x3E, 0x0C, 0x1A, 0xBF, + 0xF3, 0xE3, 0x1E, 0xC8, 0xE1, 0xA3, 0x28, 0xEC, + 0x85, 0x65, 0xC3, 0x6D, 0xEC, 0xFF, 0x52, 0x65 + }, + { + 0x2C, 0x3E, 0x08, 0x17, 0x6F, 0x76, 0x0C, 0x62, + 0x64, 0xC3, 0xA2, 0xCD, 0x66, 0xFE, 0xC6, 0xC3, + 0xD7, 0x8D, 0xE4, 0x3F, 0xC1, 0x92, 0x45, 0x7B, + 0x2A, 0x4A, 0x66, 0x0A, 0x1E, 0x0E, 0xB2, 0x2B + }, + { + 0xF7, 0x38, 0xC0, 0x2F, 0x3C, 0x1B, 0x19, 0x0C, + 0x51, 0x2B, 0x1A, 0x32, 0xDE, 0xAB, 0xF3, 0x53, + 0x72, 0x8E, 0x0E, 0x9A, 0xB0, 0x34, 0x49, 0x0E, + 0x3C, 0x34, 0x09, 0x94, 0x6A, 0x97, 0xAE, 0xEC + }, + { + 0x8B, 0x18, 0x80, 0xDF, 0x30, 0x1C, 0xC9, 0x63, + 0x41, 0x88, 0x11, 0x08, 0x89, 0x64, 0x83, 0x92, + 0x87, 0xFF, 0x7F, 0xE3, 0x1C, 0x49, 0xEA, 0x6E, + 0xBD, 0x9E, 0x48, 0xBD, 0xEE, 0xE4, 0x97, 0xC5 + }, + { + 0x1E, 0x75, 0xCB, 0x21, 0xC6, 0x09, 0x89, 0x02, + 0x03, 0x75, 0xF1, 0xA7, 0xA2, 0x42, 0x83, 0x9F, + 0x0B, 0x0B, 0x68, 0x97, 0x3A, 0x4C, 0x2A, 0x05, + 0xCF, 0x75, 0x55, 0xED, 0x5A, 0xAE, 0xC4, 0xC1 + }, + { + 0x62, 0xBF, 0x8A, 0x9C, 0x32, 0xA5, 0xBC, 0xCF, + 0x29, 0x0B, 0x6C, 0x47, 0x4D, 0x75, 0xB2, 0xA2, + 0xA4, 0x09, 0x3F, 0x1A, 0x9E, 0x27, 0x13, 0x94, + 0x33, 0xA8, 0xF2, 0xB3, 0xBC, 0xE7, 0xB8, 0xD7 + }, + { + 0x16, 0x6C, 0x83, 0x50, 0xD3, 0x17, 0x3B, 0x5E, + 0x70, 0x2B, 0x78, 0x3D, 0xFD, 0x33, 0xC6, 0x6E, + 0xE0, 0x43, 0x27, 0x42, 0xE9, 0xB9, 0x2B, 0x99, + 0x7F, 0xD2, 0x3C, 0x60, 0xDC, 0x67, 0x56, 0xCA + }, + { + 0x04, 0x4A, 0x14, 0xD8, 0x22, 0xA9, 0x0C, 0xAC, + 0xF2, 0xF5, 0xA1, 0x01, 0x42, 0x8A, 0xDC, 0x8F, + 0x41, 0x09, 0x38, 0x6C, 0xCB, 0x15, 0x8B, 0xF9, + 0x05, 0xC8, 0x61, 0x8B, 0x8E, 0xE2, 0x4E, 0xC3 + }, + { + 0x38, 0x7D, 0x39, 0x7E, 0xA4, 0x3A, 0x99, 0x4B, + 0xE8, 0x4D, 0x2D, 0x54, 0x4A, 0xFB, 0xE4, 0x81, + 0xA2, 0x00, 0x0F, 0x55, 0x25, 0x26, 0x96, 0xBB, + 0xA2, 0xC5, 0x0C, 0x8E, 0xBD, 0x10, 0x13, 0x47 + }, + { + 0x56, 0xF8, 0xCC, 0xF1, 0xF8, 0x64, 0x09, 0xB4, + 0x6C, 0xE3, 0x61, 0x66, 0xAE, 0x91, 0x65, 0x13, + 0x84, 0x41, 0x57, 0x75, 0x89, 0xDB, 0x08, 0xCB, + 0xC5, 0xF6, 0x6C, 0xA2, 0x97, 0x43, 0xB9, 0xFD + }, + { + 0x97, 0x06, 0xC0, 0x92, 0xB0, 0x4D, 0x91, 0xF5, + 0x3D, 0xFF, 0x91, 0xFA, 0x37, 0xB7, 0x49, 0x3D, + 0x28, 0xB5, 0x76, 0xB5, 0xD7, 0x10, 0x46, 0x9D, + 0xF7, 0x94, 0x01, 0x66, 0x22, 0x36, 0xFC, 0x03 + }, + { + 0x87, 0x79, 0x68, 0x68, 0x6C, 0x06, 0x8C, 0xE2, + 0xF7, 0xE2, 0xAD, 0xCF, 0xF6, 0x8B, 0xF8, 0x74, + 0x8E, 0xDF, 0x3C, 0xF8, 0x62, 0xCF, 0xB4, 0xD3, + 0x94, 0x7A, 0x31, 0x06, 0x95, 0x80, 0x54, 0xE3 + }, + { + 0x88, 0x17, 0xE5, 0x71, 0x98, 0x79, 0xAC, 0xF7, + 0x02, 0x47, 0x87, 0xEC, 0xCD, 0xB2, 0x71, 0x03, + 0x55, 0x66, 0xCF, 0xA3, 0x33, 0xE0, 0x49, 0x40, + 0x7C, 0x01, 0x78, 0xCC, 0xC5, 0x7A, 0x5B, 0x9F + }, + { + 0x89, 0x38, 0x24, 0x9E, 0x4B, 0x50, 0xCA, 0xDA, + 0xCC, 0xDF, 0x5B, 0x18, 0x62, 0x13, 0x26, 0xCB, + 0xB1, 0x52, 0x53, 0xE3, 0x3A, 0x20, 0xF5, 0x63, + 0x6E, 0x99, 0x5D, 0x72, 0x47, 0x8D, 0xE4, 0x72 + }, + { + 0xF1, 0x64, 0xAB, 0xBA, 0x49, 0x63, 0xA4, 0x4D, + 0x10, 0x72, 0x57, 0xE3, 0x23, 0x2D, 0x90, 0xAC, + 0xA5, 0xE6, 0x6A, 0x14, 0x08, 0x24, 0x8C, 0x51, + 0x74, 0x1E, 0x99, 0x1D, 0xB5, 0x22, 0x77, 0x56 + }, + { + 0xD0, 0x55, 0x63, 0xE2, 0xB1, 0xCB, 0xA0, 0xC4, + 0xA2, 0xA1, 0xE8, 0xBD, 0xE3, 0xA1, 0xA0, 0xD9, + 0xF5, 0xB4, 0x0C, 0x85, 0xA0, 0x70, 0xD6, 0xF5, + 0xFB, 0x21, 0x06, 0x6E, 0xAD, 0x5D, 0x06, 0x01 + }, + { + 0x03, 0xFB, 0xB1, 0x63, 0x84, 0xF0, 0xA3, 0x86, + 0x6F, 0x4C, 0x31, 0x17, 0x87, 0x76, 0x66, 0xEF, + 0xBF, 0x12, 0x45, 0x97, 0x56, 0x4B, 0x29, 0x3D, + 0x4A, 0xAB, 0x0D, 0x26, 0x9F, 0xAB, 0xDD, 0xFA + }, + { + 0x5F, 0xA8, 0x48, 0x6A, 0xC0, 0xE5, 0x29, 0x64, + 0xD1, 0x88, 0x1B, 0xBE, 0x33, 0x8E, 0xB5, 0x4B, + 0xE2, 0xF7, 0x19, 0x54, 0x92, 0x24, 0x89, 0x20, + 0x57, 0xB4, 0xDA, 0x04, 0xBA, 0x8B, 0x34, 0x75 + }, + { + 0xCD, 0xFA, 0xBC, 0xEE, 0x46, 0x91, 0x11, 0x11, + 0x23, 0x6A, 0x31, 0x70, 0x8B, 0x25, 0x39, 0xD7, + 0x1F, 0xC2, 0x11, 0xD9, 0xB0, 0x9C, 0x0D, 0x85, + 0x30, 0xA1, 0x1E, 0x1D, 0xBF, 0x6E, 0xED, 0x01 + }, + { + 0x4F, 0x82, 0xDE, 0x03, 0xB9, 0x50, 0x47, 0x93, + 0xB8, 0x2A, 0x07, 0xA0, 0xBD, 0xCD, 0xFF, 0x31, + 0x4D, 0x75, 0x9E, 0x7B, 0x62, 0xD2, 0x6B, 0x78, + 0x49, 0x46, 0xB0, 0xD3, 0x6F, 0x91, 0x6F, 0x52 + }, + { + 0x25, 0x9E, 0xC7, 0xF1, 0x73, 0xBC, 0xC7, 0x6A, + 0x09, 0x94, 0xC9, 0x67, 0xB4, 0xF5, 0xF0, 0x24, + 0xC5, 0x60, 0x57, 0xFB, 0x79, 0xC9, 0x65, 0xC4, + 0xFA, 0xE4, 0x18, 0x75, 0xF0, 0x6A, 0x0E, 0x4C + }, + { + 0x19, 0x3C, 0xC8, 0xE7, 0xC3, 0xE0, 0x8B, 0xB3, + 0x0F, 0x54, 0x37, 0xAA, 0x27, 0xAD, 0xE1, 0xF1, + 0x42, 0x36, 0x9B, 0x24, 0x6A, 0x67, 0x5B, 0x23, + 0x83, 0xE6, 0xDA, 0x9B, 0x49, 0xA9, 0x80, 0x9E + }, + { + 0x5C, 0x10, 0x89, 0x6F, 0x0E, 0x28, 0x56, 0xB2, + 0xA2, 0xEE, 0xE0, 0xFE, 0x4A, 0x2C, 0x16, 0x33, + 0x56, 0x5D, 0x18, 0xF0, 0xE9, 0x3E, 0x1F, 0xAB, + 0x26, 0xC3, 0x73, 0xE8, 0xF8, 0x29, 0x65, 0x4D + }, + { + 0xF1, 0x60, 0x12, 0xD9, 0x3F, 0x28, 0x85, 0x1A, + 0x1E, 0xB9, 0x89, 0xF5, 0xD0, 0xB4, 0x3F, 0x3F, + 0x39, 0xCA, 0x73, 0xC9, 0xA6, 0x2D, 0x51, 0x81, + 0xBF, 0xF2, 0x37, 0x53, 0x6B, 0xD3, 0x48, 0xC3 + }, + { + 0x29, 0x66, 0xB3, 0xCF, 0xAE, 0x1E, 0x44, 0xEA, + 0x99, 0x6D, 0xC5, 0xD6, 0x86, 0xCF, 0x25, 0xFA, + 0x05, 0x3F, 0xB6, 0xF6, 0x72, 0x01, 0xB9, 0xE4, + 0x6E, 0xAD, 0xE8, 0x5D, 0x0A, 0xD6, 0xB8, 0x06 + }, + { + 0xDD, 0xB8, 0x78, 0x24, 0x85, 0xE9, 0x00, 0xBC, + 0x60, 0xBC, 0xF4, 0xC3, 0x3A, 0x6F, 0xD5, 0x85, + 0x68, 0x0C, 0xC6, 0x83, 0xD5, 0x16, 0xEF, 0xA0, + 0x3E, 0xB9, 0x98, 0x5F, 0xAD, 0x87, 0x15, 0xFB + }, + { + 0x4C, 0x4D, 0x6E, 0x71, 0xAE, 0xA0, 0x57, 0x86, + 0x41, 0x31, 0x48, 0xFC, 0x7A, 0x78, 0x6B, 0x0E, + 0xCA, 0xF5, 0x82, 0xCF, 0xF1, 0x20, 0x9F, 0x5A, + 0x80, 0x9F, 0xBA, 0x85, 0x04, 0xCE, 0x66, 0x2C + }, + { + 0xFB, 0x4C, 0x5E, 0x86, 0xD7, 0xB2, 0x22, 0x9B, + 0x99, 0xB8, 0xBA, 0x6D, 0x94, 0xC2, 0x47, 0xEF, + 0x96, 0x4A, 0xA3, 0xA2, 0xBA, 0xE8, 0xED, 0xC7, + 0x75, 0x69, 0xF2, 0x8D, 0xBB, 0xFF, 0x2D, 0x4E + }, + { + 0xE9, 0x4F, 0x52, 0x6D, 0xE9, 0x01, 0x96, 0x33, + 0xEC, 0xD5, 0x4A, 0xC6, 0x12, 0x0F, 0x23, 0x95, + 0x8D, 0x77, 0x18, 0xF1, 0xE7, 0x71, 0x7B, 0xF3, + 0x29, 0x21, 0x1A, 0x4F, 0xAE, 0xED, 0x4E, 0x6D + }, + { + 0xCB, 0xD6, 0x66, 0x0A, 0x10, 0xDB, 0x3F, 0x23, + 0xF7, 0xA0, 0x3D, 0x4B, 0x9D, 0x40, 0x44, 0xC7, + 0x93, 0x2B, 0x28, 0x01, 0xAC, 0x89, 0xD6, 0x0B, + 0xC9, 0xEB, 0x92, 0xD6, 0x5A, 0x46, 0xC2, 0xA0 + }, + { + 0x88, 0x18, 0xBB, 0xD3, 0xDB, 0x4D, 0xC1, 0x23, + 0xB2, 0x5C, 0xBB, 0xA5, 0xF5, 0x4C, 0x2B, 0xC4, + 0xB3, 0xFC, 0xF9, 0xBF, 0x7D, 0x7A, 0x77, 0x09, + 0xF4, 0xAE, 0x58, 0x8B, 0x26, 0x7C, 0x4E, 0xCE + }, + { + 0xC6, 0x53, 0x82, 0x51, 0x3F, 0x07, 0x46, 0x0D, + 0xA3, 0x98, 0x33, 0xCB, 0x66, 0x6C, 0x5E, 0xD8, + 0x2E, 0x61, 0xB9, 0xE9, 0x98, 0xF4, 0xB0, 0xC4, + 0x28, 0x7C, 0xEE, 0x56, 0xC3, 0xCC, 0x9B, 0xCD + }, + { + 0x89, 0x75, 0xB0, 0x57, 0x7F, 0xD3, 0x55, 0x66, + 0xD7, 0x50, 0xB3, 0x62, 0xB0, 0x89, 0x7A, 0x26, + 0xC3, 0x99, 0x13, 0x6D, 0xF0, 0x7B, 0xAB, 0xAB, + 0xBD, 0xE6, 0x20, 0x3F, 0xF2, 0x95, 0x4E, 0xD4 + }, + { + 0x21, 0xFE, 0x0C, 0xEB, 0x00, 0x52, 0xBE, 0x7F, + 0xB0, 0xF0, 0x04, 0x18, 0x7C, 0xAC, 0xD7, 0xDE, + 0x67, 0xFA, 0x6E, 0xB0, 0x93, 0x8D, 0x92, 0x76, + 0x77, 0xF2, 0x39, 0x8C, 0x13, 0x23, 0x17, 0xA8 + }, + { + 0x2E, 0xF7, 0x3F, 0x3C, 0x26, 0xF1, 0x2D, 0x93, + 0x88, 0x9F, 0x3C, 0x78, 0xB6, 0xA6, 0x6C, 0x1D, + 0x52, 0xB6, 0x49, 0xDC, 0x9E, 0x85, 0x6E, 0x2C, + 0x17, 0x2E, 0xA7, 0xC5, 0x8A, 0xC2, 0xB5, 0xE3 + }, + { + 0x38, 0x8A, 0x3C, 0xD5, 0x6D, 0x73, 0x86, 0x7A, + 0xBB, 0x5F, 0x84, 0x01, 0x49, 0x2B, 0x6E, 0x26, + 0x81, 0xEB, 0x69, 0x85, 0x1E, 0x76, 0x7F, 0xD8, + 0x42, 0x10, 0xA5, 0x60, 0x76, 0xFB, 0x3D, 0xD3 + }, + { + 0xAF, 0x53, 0x3E, 0x02, 0x2F, 0xC9, 0x43, 0x9E, + 0x4E, 0x3C, 0xB8, 0x38, 0xEC, 0xD1, 0x86, 0x92, + 0x23, 0x2A, 0xDF, 0x6F, 0xE9, 0x83, 0x95, 0x26, + 0xD3, 0xC3, 0xDD, 0x1B, 0x71, 0x91, 0x0B, 0x1A + }, + { + 0x75, 0x1C, 0x09, 0xD4, 0x1A, 0x93, 0x43, 0x88, + 0x2A, 0x81, 0xCD, 0x13, 0xEE, 0x40, 0x81, 0x8D, + 0x12, 0xEB, 0x44, 0xC6, 0xC7, 0xF4, 0x0D, 0xF1, + 0x6E, 0x4A, 0xEA, 0x8F, 0xAB, 0x91, 0x97, 0x2A + }, + { + 0x5B, 0x73, 0xDD, 0xB6, 0x8D, 0x9D, 0x2B, 0x0A, + 0xA2, 0x65, 0xA0, 0x79, 0x88, 0xD6, 0xB8, 0x8A, + 0xE9, 0xAA, 0xC5, 0x82, 0xAF, 0x83, 0x03, 0x2F, + 0x8A, 0x9B, 0x21, 0xA2, 0xE1, 0xB7, 0xBF, 0x18 + }, + { + 0x3D, 0xA2, 0x91, 0x26, 0xC7, 0xC5, 0xD7, 0xF4, + 0x3E, 0x64, 0x24, 0x2A, 0x79, 0xFE, 0xAA, 0x4E, + 0xF3, 0x45, 0x9C, 0xDE, 0xCC, 0xC8, 0x98, 0xED, + 0x59, 0xA9, 0x7F, 0x6E, 0xC9, 0x3B, 0x9D, 0xAB + }, + { + 0x56, 0x6D, 0xC9, 0x20, 0x29, 0x3D, 0xA5, 0xCB, + 0x4F, 0xE0, 0xAA, 0x8A, 0xBD, 0xA8, 0xBB, 0xF5, + 0x6F, 0x55, 0x23, 0x13, 0xBF, 0xF1, 0x90, 0x46, + 0x64, 0x1E, 0x36, 0x15, 0xC1, 0xE3, 0xED, 0x3F + }, + { + 0x41, 0x15, 0xBE, 0xA0, 0x2F, 0x73, 0xF9, 0x7F, + 0x62, 0x9E, 0x5C, 0x55, 0x90, 0x72, 0x0C, 0x01, + 0xE7, 0xE4, 0x49, 0xAE, 0x2A, 0x66, 0x97, 0xD4, + 0xD2, 0x78, 0x33, 0x21, 0x30, 0x36, 0x92, 0xF9 + }, + { + 0x4C, 0xE0, 0x8F, 0x47, 0x62, 0x46, 0x8A, 0x76, + 0x70, 0x01, 0x21, 0x64, 0x87, 0x8D, 0x68, 0x34, + 0x0C, 0x52, 0xA3, 0x5E, 0x66, 0xC1, 0x88, 0x4D, + 0x5C, 0x86, 0x48, 0x89, 0xAB, 0xC9, 0x66, 0x77 + }, + { + 0x81, 0xEA, 0x0B, 0x78, 0x04, 0x12, 0x4E, 0x0C, + 0x22, 0xEA, 0x5F, 0xC7, 0x11, 0x04, 0xA2, 0xAF, + 0xCB, 0x52, 0xA1, 0xFA, 0x81, 0x6F, 0x3E, 0xCB, + 0x7D, 0xCB, 0x5D, 0x9D, 0xEA, 0x17, 0x86, 0xD0 + }, + { + 0xFE, 0x36, 0x27, 0x33, 0xB0, 0x5F, 0x6B, 0xED, + 0xAF, 0x93, 0x79, 0xD7, 0xF7, 0x93, 0x6E, 0xDE, + 0x20, 0x9B, 0x1F, 0x83, 0x23, 0xC3, 0x92, 0x25, + 0x49, 0xD9, 0xE7, 0x36, 0x81, 0xB5, 0xDB, 0x7B + }, + { + 0xEF, 0xF3, 0x7D, 0x30, 0xDF, 0xD2, 0x03, 0x59, + 0xBE, 0x4E, 0x73, 0xFD, 0xF4, 0x0D, 0x27, 0x73, + 0x4B, 0x3D, 0xF9, 0x0A, 0x97, 0xA5, 0x5E, 0xD7, + 0x45, 0x29, 0x72, 0x94, 0xCA, 0x85, 0xD0, 0x9F + }, + { + 0x17, 0x2F, 0xFC, 0x67, 0x15, 0x3D, 0x12, 0xE0, + 0xCA, 0x76, 0xA8, 0xB6, 0xCD, 0x5D, 0x47, 0x31, + 0x88, 0x5B, 0x39, 0xCE, 0x0C, 0xAC, 0x93, 0xA8, + 0x97, 0x2A, 0x18, 0x00, 0x6C, 0x8B, 0x8B, 0xAF + }, + { + 0xC4, 0x79, 0x57, 0xF1, 0xCC, 0x88, 0xE8, 0x3E, + 0xF9, 0x44, 0x58, 0x39, 0x70, 0x9A, 0x48, 0x0A, + 0x03, 0x6B, 0xED, 0x5F, 0x88, 0xAC, 0x0F, 0xCC, + 0x8E, 0x1E, 0x70, 0x3F, 0xFA, 0xAC, 0x13, 0x2C + }, + { + 0x30, 0xF3, 0x54, 0x83, 0x70, 0xCF, 0xDC, 0xED, + 0xA5, 0xC3, 0x7B, 0x56, 0x9B, 0x61, 0x75, 0xE7, + 0x99, 0xEE, 0xF1, 0xA6, 0x2A, 0xAA, 0x94, 0x32, + 0x45, 0xAE, 0x76, 0x69, 0xC2, 0x27, 0xA7, 0xB5 + }, + { + 0xC9, 0x5D, 0xCB, 0x3C, 0xF1, 0xF2, 0x7D, 0x0E, + 0xEF, 0x2F, 0x25, 0xD2, 0x41, 0x38, 0x70, 0x90, + 0x4A, 0x87, 0x7C, 0x4A, 0x56, 0xC2, 0xDE, 0x1E, + 0x83, 0xE2, 0xBC, 0x2A, 0xE2, 0xE4, 0x68, 0x21 + }, + { + 0xD5, 0xD0, 0xB5, 0xD7, 0x05, 0x43, 0x4C, 0xD4, + 0x6B, 0x18, 0x57, 0x49, 0xF6, 0x6B, 0xFB, 0x58, + 0x36, 0xDC, 0xDF, 0x6E, 0xE5, 0x49, 0xA2, 0xB7, + 0xA4, 0xAE, 0xE7, 0xF5, 0x80, 0x07, 0xCA, 0xAF + }, + { + 0xBB, 0xC1, 0x24, 0xA7, 0x12, 0xF1, 0x5D, 0x07, + 0xC3, 0x00, 0xE0, 0x5B, 0x66, 0x83, 0x89, 0xA4, + 0x39, 0xC9, 0x17, 0x77, 0xF7, 0x21, 0xF8, 0x32, + 0x0C, 0x1C, 0x90, 0x78, 0x06, 0x6D, 0x2C, 0x7E + }, + { + 0xA4, 0x51, 0xB4, 0x8C, 0x35, 0xA6, 0xC7, 0x85, + 0x4C, 0xFA, 0xAE, 0x60, 0x26, 0x2E, 0x76, 0x99, + 0x08, 0x16, 0x38, 0x2A, 0xC0, 0x66, 0x7E, 0x5A, + 0x5C, 0x9E, 0x1B, 0x46, 0xC4, 0x34, 0x2D, 0xDF + }, + { + 0xB0, 0xD1, 0x50, 0xFB, 0x55, 0xE7, 0x78, 0xD0, + 0x11, 0x47, 0xF0, 0xB5, 0xD8, 0x9D, 0x99, 0xEC, + 0xB2, 0x0F, 0xF0, 0x7E, 0x5E, 0x67, 0x60, 0xD6, + 0xB6, 0x45, 0xEB, 0x5B, 0x65, 0x4C, 0x62, 0x2B + }, + { + 0x34, 0xF7, 0x37, 0xC0, 0xAB, 0x21, 0x99, 0x51, + 0xEE, 0xE8, 0x9A, 0x9F, 0x8D, 0xAC, 0x29, 0x9C, + 0x9D, 0x4C, 0x38, 0xF3, 0x3F, 0xA4, 0x94, 0xC5, + 0xC6, 0xEE, 0xFC, 0x92, 0xB6, 0xDB, 0x08, 0xBC + }, + { + 0x1A, 0x62, 0xCC, 0x3A, 0x00, 0x80, 0x0D, 0xCB, + 0xD9, 0x98, 0x91, 0x08, 0x0C, 0x1E, 0x09, 0x84, + 0x58, 0x19, 0x3A, 0x8C, 0xC9, 0xF9, 0x70, 0xEA, + 0x99, 0xFB, 0xEF, 0xF0, 0x03, 0x18, 0xC2, 0x89 + }, + { + 0xCF, 0xCE, 0x55, 0xEB, 0xAF, 0xC8, 0x40, 0xD7, + 0xAE, 0x48, 0x28, 0x1C, 0x7F, 0xD5, 0x7E, 0xC8, + 0xB4, 0x82, 0xD4, 0xB7, 0x04, 0x43, 0x74, 0x95, + 0x49, 0x5A, 0xC4, 0x14, 0xCF, 0x4A, 0x37, 0x4B + }, + { + 0x67, 0x46, 0xFA, 0xCF, 0x71, 0x14, 0x6D, 0x99, + 0x9D, 0xAB, 0xD0, 0x5D, 0x09, 0x3A, 0xE5, 0x86, + 0x64, 0x8D, 0x1E, 0xE2, 0x8E, 0x72, 0x61, 0x7B, + 0x99, 0xD0, 0xF0, 0x08, 0x6E, 0x1E, 0x45, 0xBF + }, + { + 0x57, 0x1C, 0xED, 0x28, 0x3B, 0x3F, 0x23, 0xB4, + 0xE7, 0x50, 0xBF, 0x12, 0xA2, 0xCA, 0xF1, 0x78, + 0x18, 0x47, 0xBD, 0x89, 0x0E, 0x43, 0x60, 0x3C, + 0xDC, 0x59, 0x76, 0x10, 0x2B, 0x7B, 0xB1, 0x1B + }, + { + 0xCF, 0xCB, 0x76, 0x5B, 0x04, 0x8E, 0x35, 0x02, + 0x2C, 0x5D, 0x08, 0x9D, 0x26, 0xE8, 0x5A, 0x36, + 0xB0, 0x05, 0xA2, 0xB8, 0x04, 0x93, 0xD0, 0x3A, + 0x14, 0x4E, 0x09, 0xF4, 0x09, 0xB6, 0xAF, 0xD1 + }, + { + 0x40, 0x50, 0xC7, 0xA2, 0x77, 0x05, 0xBB, 0x27, + 0xF4, 0x20, 0x89, 0xB2, 0x99, 0xF3, 0xCB, 0xE5, + 0x05, 0x4E, 0xAD, 0x68, 0x72, 0x7E, 0x8E, 0xF9, + 0x31, 0x8C, 0xE6, 0xF2, 0x5C, 0xD6, 0xF3, 0x1D + }, + { + 0x18, 0x40, 0x70, 0xBD, 0x5D, 0x26, 0x5F, 0xBD, + 0xC1, 0x42, 0xCD, 0x1C, 0x5C, 0xD0, 0xD7, 0xE4, + 0x14, 0xE7, 0x03, 0x69, 0xA2, 0x66, 0xD6, 0x27, + 0xC8, 0xFB, 0xA8, 0x4F, 0xA5, 0xE8, 0x4C, 0x34 + }, + { + 0x9E, 0xDD, 0xA9, 0xA4, 0x44, 0x39, 0x02, 0xA9, + 0x58, 0x8C, 0x0D, 0x0C, 0xCC, 0x62, 0xB9, 0x30, + 0x21, 0x84, 0x79, 0xA6, 0x84, 0x1E, 0x6F, 0xE7, + 0xD4, 0x30, 0x03, 0xF0, 0x4B, 0x1F, 0xD6, 0x43 + }, + { + 0xE4, 0x12, 0xFE, 0xEF, 0x79, 0x08, 0x32, 0x4A, + 0x6D, 0xA1, 0x84, 0x16, 0x29, 0xF3, 0x5D, 0x3D, + 0x35, 0x86, 0x42, 0x01, 0x93, 0x10, 0xEC, 0x57, + 0xC6, 0x14, 0x83, 0x6B, 0x63, 0xD3, 0x07, 0x63 + }, + { + 0x1A, 0x2B, 0x8E, 0xDF, 0xF3, 0xF9, 0xAC, 0xC1, + 0x55, 0x4F, 0xCB, 0xAE, 0x3C, 0xF1, 0xD6, 0x29, + 0x8C, 0x64, 0x62, 0xE2, 0x2E, 0x5E, 0xB0, 0x25, + 0x96, 0x84, 0xF8, 0x35, 0x01, 0x2B, 0xD1, 0x3F + }, + { + 0x28, 0x8C, 0x4A, 0xD9, 0xB9, 0x40, 0x97, 0x62, + 0xEA, 0x07, 0xC2, 0x4A, 0x41, 0xF0, 0x4F, 0x69, + 0xA7, 0xD7, 0x4B, 0xEE, 0x2D, 0x95, 0x43, 0x53, + 0x74, 0xBD, 0xE9, 0x46, 0xD7, 0x24, 0x1C, 0x7B + }, + { + 0x80, 0x56, 0x91, 0xBB, 0x28, 0x67, 0x48, 0xCF, + 0xB5, 0x91, 0xD3, 0xAE, 0xBE, 0x7E, 0x6F, 0x4E, + 0x4D, 0xC6, 0xE2, 0x80, 0x8C, 0x65, 0x14, 0x3C, + 0xC0, 0x04, 0xE4, 0xEB, 0x6F, 0xD0, 0x9D, 0x43 + }, + { + 0xD4, 0xAC, 0x8D, 0x3A, 0x0A, 0xFC, 0x6C, 0xFA, + 0x7B, 0x46, 0x0A, 0xE3, 0x00, 0x1B, 0xAE, 0xB3, + 0x6D, 0xAD, 0xB3, 0x7D, 0xA0, 0x7D, 0x2E, 0x8A, + 0xC9, 0x18, 0x22, 0xDF, 0x34, 0x8A, 0xED, 0x3D + }, + { + 0xC3, 0x76, 0x61, 0x70, 0x14, 0xD2, 0x01, 0x58, + 0xBC, 0xED, 0x3D, 0x3B, 0xA5, 0x52, 0xB6, 0xEC, + 0xCF, 0x84, 0xE6, 0x2A, 0xA3, 0xEB, 0x65, 0x0E, + 0x90, 0x02, 0x9C, 0x84, 0xD1, 0x3E, 0xEA, 0x69 + }, + { + 0xC4, 0x1F, 0x09, 0xF4, 0x3C, 0xEC, 0xAE, 0x72, + 0x93, 0xD6, 0x00, 0x7C, 0xA0, 0xA3, 0x57, 0x08, + 0x7D, 0x5A, 0xE5, 0x9B, 0xE5, 0x00, 0xC1, 0xCD, + 0x5B, 0x28, 0x9E, 0xE8, 0x10, 0xC7, 0xB0, 0x82 + }, + { + 0x03, 0xD1, 0xCE, 0xD1, 0xFB, 0xA5, 0xC3, 0x91, + 0x55, 0xC4, 0x4B, 0x77, 0x65, 0xCB, 0x76, 0x0C, + 0x78, 0x70, 0x8D, 0xCF, 0xC8, 0x0B, 0x0B, 0xD8, + 0xAD, 0xE3, 0xA5, 0x6D, 0xA8, 0x83, 0x0B, 0x29 + }, + { + 0x09, 0xBD, 0xE6, 0xF1, 0x52, 0x21, 0x8D, 0xC9, + 0x2C, 0x41, 0xD7, 0xF4, 0x53, 0x87, 0xE6, 0x3E, + 0x58, 0x69, 0xD8, 0x07, 0xEC, 0x70, 0xB8, 0x21, + 0x40, 0x5D, 0xBD, 0x88, 0x4B, 0x7F, 0xCF, 0x4B + }, + { + 0x71, 0xC9, 0x03, 0x6E, 0x18, 0x17, 0x9B, 0x90, + 0xB3, 0x7D, 0x39, 0xE9, 0xF0, 0x5E, 0xB8, 0x9C, + 0xC5, 0xFC, 0x34, 0x1F, 0xD7, 0xC4, 0x77, 0xD0, + 0xD7, 0x49, 0x32, 0x85, 0xFA, 0xCA, 0x08, 0xA4 + }, + { + 0x59, 0x16, 0x83, 0x3E, 0xBB, 0x05, 0xCD, 0x91, + 0x9C, 0xA7, 0xFE, 0x83, 0xB6, 0x92, 0xD3, 0x20, + 0x5B, 0xEF, 0x72, 0x39, 0x2B, 0x2C, 0xF6, 0xBB, + 0x0A, 0x6D, 0x43, 0xF9, 0x94, 0xF9, 0x5F, 0x11 + }, + { + 0xF6, 0x3A, 0xAB, 0x3E, 0xC6, 0x41, 0xB3, 0xB0, + 0x24, 0x96, 0x4C, 0x2B, 0x43, 0x7C, 0x04, 0xF6, + 0x04, 0x3C, 0x4C, 0x7E, 0x02, 0x79, 0x23, 0x99, + 0x95, 0x40, 0x19, 0x58, 0xF8, 0x6B, 0xBE, 0x54 + }, + { + 0xF1, 0x72, 0xB1, 0x80, 0xBF, 0xB0, 0x97, 0x40, + 0x49, 0x31, 0x20, 0xB6, 0x32, 0x6C, 0xBD, 0xC5, + 0x61, 0xE4, 0x77, 0xDE, 0xF9, 0xBB, 0xCF, 0xD2, + 0x8C, 0xC8, 0xC1, 0xC5, 0xE3, 0x37, 0x9A, 0x31 + }, + { + 0xCB, 0x9B, 0x89, 0xCC, 0x18, 0x38, 0x1D, 0xD9, + 0x14, 0x1A, 0xDE, 0x58, 0x86, 0x54, 0xD4, 0xE6, + 0xA2, 0x31, 0xD5, 0xBF, 0x49, 0xD4, 0xD5, 0x9A, + 0xC2, 0x7D, 0x86, 0x9C, 0xBE, 0x10, 0x0C, 0xF3 + }, + { + 0x7B, 0xD8, 0x81, 0x50, 0x46, 0xFD, 0xD8, 0x10, + 0xA9, 0x23, 0xE1, 0x98, 0x4A, 0xAE, 0xBD, 0xCD, + 0xF8, 0x4D, 0x87, 0xC8, 0x99, 0x2D, 0x68, 0xB5, + 0xEE, 0xB4, 0x60, 0xF9, 0x3E, 0xB3, 0xC8, 0xD7 + }, + { + 0x60, 0x7B, 0xE6, 0x68, 0x62, 0xFD, 0x08, 0xEE, + 0x5B, 0x19, 0xFA, 0xCA, 0xC0, 0x9D, 0xFD, 0xBC, + 0xD4, 0x0C, 0x31, 0x21, 0x01, 0xD6, 0x6E, 0x6E, + 0xBD, 0x2B, 0x84, 0x1F, 0x1B, 0x9A, 0x93, 0x25 + }, + { + 0x9F, 0xE0, 0x3B, 0xBE, 0x69, 0xAB, 0x18, 0x34, + 0xF5, 0x21, 0x9B, 0x0D, 0xA8, 0x8A, 0x08, 0xB3, + 0x0A, 0x66, 0xC5, 0x91, 0x3F, 0x01, 0x51, 0x96, + 0x3C, 0x36, 0x05, 0x60, 0xDB, 0x03, 0x87, 0xB3 + }, + { + 0x90, 0xA8, 0x35, 0x85, 0x71, 0x7B, 0x75, 0xF0, + 0xE9, 0xB7, 0x25, 0xE0, 0x55, 0xEE, 0xEE, 0xB9, + 0xE7, 0xA0, 0x28, 0xEA, 0x7E, 0x6C, 0xBC, 0x07, + 0xB2, 0x09, 0x17, 0xEC, 0x03, 0x63, 0xE3, 0x8C + }, + { + 0x33, 0x6E, 0xA0, 0x53, 0x0F, 0x4A, 0x74, 0x69, + 0x12, 0x6E, 0x02, 0x18, 0x58, 0x7E, 0xBB, 0xDE, + 0x33, 0x58, 0xA0, 0xB3, 0x1C, 0x29, 0xD2, 0x00, + 0xF7, 0xDC, 0x7E, 0xB1, 0x5C, 0x6A, 0xAD, 0xD8 + }, + { + 0xA7, 0x9E, 0x76, 0xDC, 0x0A, 0xBC, 0xA4, 0x39, + 0x6F, 0x07, 0x47, 0xCD, 0x7B, 0x74, 0x8D, 0xF9, + 0x13, 0x00, 0x76, 0x26, 0xB1, 0xD6, 0x59, 0xDA, + 0x0C, 0x1F, 0x78, 0xB9, 0x30, 0x3D, 0x01, 0xA3 + }, + { + 0x44, 0xE7, 0x8A, 0x77, 0x37, 0x56, 0xE0, 0x95, + 0x15, 0x19, 0x50, 0x4D, 0x70, 0x38, 0xD2, 0x8D, + 0x02, 0x13, 0xA3, 0x7E, 0x0C, 0xE3, 0x75, 0x37, + 0x17, 0x57, 0xBC, 0x99, 0x63, 0x11, 0xE3, 0xB8 + }, + { + 0x77, 0xAC, 0x01, 0x2A, 0x3F, 0x75, 0x4D, 0xCF, + 0xEA, 0xB5, 0xEB, 0x99, 0x6B, 0xE9, 0xCD, 0x2D, + 0x1F, 0x96, 0x11, 0x1B, 0x6E, 0x49, 0xF3, 0x99, + 0x4D, 0xF1, 0x81, 0xF2, 0x85, 0x69, 0xD8, 0x25 + }, + { + 0xCE, 0x5A, 0x10, 0xDB, 0x6F, 0xCC, 0xDA, 0xF1, + 0x40, 0xAA, 0xA4, 0xDE, 0xD6, 0x25, 0x0A, 0x9C, + 0x06, 0xE9, 0x22, 0x2B, 0xC9, 0xF9, 0xF3, 0x65, + 0x8A, 0x4A, 0xFF, 0x93, 0x5F, 0x2B, 0x9F, 0x3A + }, + { + 0xEC, 0xC2, 0x03, 0xA7, 0xFE, 0x2B, 0xE4, 0xAB, + 0xD5, 0x5B, 0xB5, 0x3E, 0x6E, 0x67, 0x35, 0x72, + 0xE0, 0x07, 0x8D, 0xA8, 0xCD, 0x37, 0x5E, 0xF4, + 0x30, 0xCC, 0x97, 0xF9, 0xF8, 0x00, 0x83, 0xAF + }, + { + 0x14, 0xA5, 0x18, 0x6D, 0xE9, 0xD7, 0xA1, 0x8B, + 0x04, 0x12, 0xB8, 0x56, 0x3E, 0x51, 0xCC, 0x54, + 0x33, 0x84, 0x0B, 0x4A, 0x12, 0x9A, 0x8F, 0xF9, + 0x63, 0xB3, 0x3A, 0x3C, 0x4A, 0xFE, 0x8E, 0xBB + }, + { + 0x13, 0xF8, 0xEF, 0x95, 0xCB, 0x86, 0xE6, 0xA6, + 0x38, 0x93, 0x1C, 0x8E, 0x10, 0x76, 0x73, 0xEB, + 0x76, 0xBA, 0x10, 0xD7, 0xC2, 0xCD, 0x70, 0xB9, + 0xD9, 0x92, 0x0B, 0xBE, 0xED, 0x92, 0x94, 0x09 + }, + { + 0x0B, 0x33, 0x8F, 0x4E, 0xE1, 0x2F, 0x2D, 0xFC, + 0xB7, 0x87, 0x13, 0x37, 0x79, 0x41, 0xE0, 0xB0, + 0x63, 0x21, 0x52, 0x58, 0x1D, 0x13, 0x32, 0x51, + 0x6E, 0x4A, 0x2C, 0xAB, 0x19, 0x42, 0xCC, 0xA4 + }, + { + 0xEA, 0xAB, 0x0E, 0xC3, 0x7B, 0x3B, 0x8A, 0xB7, + 0x96, 0xE9, 0xF5, 0x72, 0x38, 0xDE, 0x14, 0xA2, + 0x64, 0xA0, 0x76, 0xF3, 0x88, 0x7D, 0x86, 0xE2, + 0x9B, 0xB5, 0x90, 0x6D, 0xB5, 0xA0, 0x0E, 0x02 + }, + { + 0x23, 0xCB, 0x68, 0xB8, 0xC0, 0xE6, 0xDC, 0x26, + 0xDC, 0x27, 0x76, 0x6D, 0xDC, 0x0A, 0x13, 0xA9, + 0x94, 0x38, 0xFD, 0x55, 0x61, 0x7A, 0xA4, 0x09, + 0x5D, 0x8F, 0x96, 0x97, 0x20, 0xC8, 0x72, 0xDF + }, + { + 0x09, 0x1D, 0x8E, 0xE3, 0x0D, 0x6F, 0x29, 0x68, + 0xD4, 0x6B, 0x68, 0x7D, 0xD6, 0x52, 0x92, 0x66, + 0x57, 0x42, 0xDE, 0x0B, 0xB8, 0x3D, 0xCC, 0x00, + 0x04, 0xC7, 0x2C, 0xE1, 0x00, 0x07, 0xA5, 0x49 + }, + { + 0x7F, 0x50, 0x7A, 0xBC, 0x6D, 0x19, 0xBA, 0x00, + 0xC0, 0x65, 0xA8, 0x76, 0xEC, 0x56, 0x57, 0x86, + 0x88, 0x82, 0xD1, 0x8A, 0x22, 0x1B, 0xC4, 0x6C, + 0x7A, 0x69, 0x12, 0x54, 0x1F, 0x5B, 0xC7, 0xBA + }, + { + 0xA0, 0x60, 0x7C, 0x24, 0xE1, 0x4E, 0x8C, 0x22, + 0x3D, 0xB0, 0xD7, 0x0B, 0x4D, 0x30, 0xEE, 0x88, + 0x01, 0x4D, 0x60, 0x3F, 0x43, 0x7E, 0x9E, 0x02, + 0xAA, 0x7D, 0xAF, 0xA3, 0xCD, 0xFB, 0xAD, 0x94 + }, + { + 0xDD, 0xBF, 0xEA, 0x75, 0xCC, 0x46, 0x78, 0x82, + 0xEB, 0x34, 0x83, 0xCE, 0x5E, 0x2E, 0x75, 0x6A, + 0x4F, 0x47, 0x01, 0xB7, 0x6B, 0x44, 0x55, 0x19, + 0xE8, 0x9F, 0x22, 0xD6, 0x0F, 0xA8, 0x6E, 0x06 + }, + { + 0x0C, 0x31, 0x1F, 0x38, 0xC3, 0x5A, 0x4F, 0xB9, + 0x0D, 0x65, 0x1C, 0x28, 0x9D, 0x48, 0x68, 0x56, + 0xCD, 0x14, 0x13, 0xDF, 0x9B, 0x06, 0x77, 0xF5, + 0x3E, 0xCE, 0x2C, 0xD9, 0xE4, 0x77, 0xC6, 0x0A + }, + { + 0x46, 0xA7, 0x3A, 0x8D, 0xD3, 0xE7, 0x0F, 0x59, + 0xD3, 0x94, 0x2C, 0x01, 0xDF, 0x59, 0x9D, 0xEF, + 0x78, 0x3C, 0x9D, 0xA8, 0x2F, 0xD8, 0x32, 0x22, + 0xCD, 0x66, 0x2B, 0x53, 0xDC, 0xE7, 0xDB, 0xDF + }, + { + 0xAD, 0x03, 0x8F, 0xF9, 0xB1, 0x4D, 0xE8, 0x4A, + 0x80, 0x1E, 0x4E, 0x62, 0x1C, 0xE5, 0xDF, 0x02, + 0x9D, 0xD9, 0x35, 0x20, 0xD0, 0xC2, 0xFA, 0x38, + 0xBF, 0xF1, 0x76, 0xA8, 0xB1, 0xD1, 0x69, 0x8C + }, + { + 0xAB, 0x70, 0xC5, 0xDF, 0xBD, 0x1E, 0xA8, 0x17, + 0xFE, 0xD0, 0xCD, 0x06, 0x72, 0x93, 0xAB, 0xF3, + 0x19, 0xE5, 0xD7, 0x90, 0x1C, 0x21, 0x41, 0xD5, + 0xD9, 0x9B, 0x23, 0xF0, 0x3A, 0x38, 0xE7, 0x48 + }, + { + 0x1F, 0xFF, 0xDA, 0x67, 0x93, 0x2B, 0x73, 0xC8, + 0xEC, 0xAF, 0x00, 0x9A, 0x34, 0x91, 0xA0, 0x26, + 0x95, 0x3B, 0xAB, 0xFE, 0x1F, 0x66, 0x3B, 0x06, + 0x97, 0xC3, 0xC4, 0xAE, 0x8B, 0x2E, 0x7D, 0xCB + }, + { + 0xB0, 0xD2, 0xCC, 0x19, 0x47, 0x2D, 0xD5, 0x7F, + 0x2B, 0x17, 0xEF, 0xC0, 0x3C, 0x8D, 0x58, 0xC2, + 0x28, 0x3D, 0xBB, 0x19, 0xDA, 0x57, 0x2F, 0x77, + 0x55, 0x85, 0x5A, 0xA9, 0x79, 0x43, 0x17, 0xA0 + }, + { + 0xA0, 0xD1, 0x9A, 0x6E, 0xE3, 0x39, 0x79, 0xC3, + 0x25, 0x51, 0x0E, 0x27, 0x66, 0x22, 0xDF, 0x41, + 0xF7, 0x15, 0x83, 0xD0, 0x75, 0x01, 0xB8, 0x70, + 0x71, 0x12, 0x9A, 0x0A, 0xD9, 0x47, 0x32, 0xA5 + }, + { + 0x72, 0x46, 0x42, 0xA7, 0x03, 0x2D, 0x10, 0x62, + 0xB8, 0x9E, 0x52, 0xBE, 0xA3, 0x4B, 0x75, 0xDF, + 0x7D, 0x8F, 0xE7, 0x72, 0xD9, 0xFE, 0x3C, 0x93, + 0xDD, 0xF3, 0xC4, 0x54, 0x5A, 0xB5, 0xA9, 0x9B + }, + { + 0xAD, 0xE5, 0xEA, 0xA7, 0xE6, 0x1F, 0x67, 0x2D, + 0x58, 0x7E, 0xA0, 0x3D, 0xAE, 0x7D, 0x7B, 0x55, + 0x22, 0x9C, 0x01, 0xD0, 0x6B, 0xC0, 0xA5, 0x70, + 0x14, 0x36, 0xCB, 0xD1, 0x83, 0x66, 0xA6, 0x26 + }, + { + 0x01, 0x3B, 0x31, 0xEB, 0xD2, 0x28, 0xFC, 0xDD, + 0xA5, 0x1F, 0xAB, 0xB0, 0x3B, 0xB0, 0x2D, 0x60, + 0xAC, 0x20, 0xCA, 0x21, 0x5A, 0xAF, 0xA8, 0x3B, + 0xDD, 0x85, 0x5E, 0x37, 0x55, 0xA3, 0x5F, 0x0B + }, + { + 0x33, 0x2E, 0xD4, 0x0B, 0xB1, 0x0D, 0xDE, 0x3C, + 0x95, 0x4A, 0x75, 0xD7, 0xB8, 0x99, 0x9D, 0x4B, + 0x26, 0xA1, 0xC0, 0x63, 0xC1, 0xDC, 0x6E, 0x32, + 0xC1, 0xD9, 0x1B, 0xAB, 0x7B, 0xBB, 0x7D, 0x16 + }, + { + 0xC7, 0xA1, 0x97, 0xB3, 0xA0, 0x5B, 0x56, 0x6B, + 0xCC, 0x9F, 0xAC, 0xD2, 0x0E, 0x44, 0x1D, 0x6F, + 0x6C, 0x28, 0x60, 0xAC, 0x96, 0x51, 0xCD, 0x51, + 0xD6, 0xB9, 0xD2, 0xCD, 0xEE, 0xEA, 0x03, 0x90 + }, + { + 0xBD, 0x9C, 0xF6, 0x4E, 0xA8, 0x95, 0x3C, 0x03, + 0x71, 0x08, 0xE6, 0xF6, 0x54, 0x91, 0x4F, 0x39, + 0x58, 0xB6, 0x8E, 0x29, 0xC1, 0x67, 0x00, 0xDC, + 0x18, 0x4D, 0x94, 0xA2, 0x17, 0x08, 0xFF, 0x60 + }, + { + 0x88, 0x35, 0xB0, 0xAC, 0x02, 0x11, 0x51, 0xDF, + 0x71, 0x64, 0x74, 0xCE, 0x27, 0xCE, 0x4D, 0x3C, + 0x15, 0xF0, 0xB2, 0xDA, 0xB4, 0x80, 0x03, 0xCF, + 0x3F, 0x3E, 0xFD, 0x09, 0x45, 0x10, 0x6B, 0x9A + }, + { + 0x3B, 0xFE, 0xFA, 0x33, 0x01, 0xAA, 0x55, 0xC0, + 0x80, 0x19, 0x0C, 0xFF, 0xDA, 0x8E, 0xAE, 0x51, + 0xD9, 0xAF, 0x48, 0x8B, 0x4C, 0x1F, 0x24, 0xC3, + 0xD9, 0xA7, 0x52, 0x42, 0xFD, 0x8E, 0xA0, 0x1D + }, + { + 0x08, 0x28, 0x4D, 0x14, 0x99, 0x3C, 0xD4, 0x7D, + 0x53, 0xEB, 0xAE, 0xCF, 0x0D, 0xF0, 0x47, 0x8C, + 0xC1, 0x82, 0xC8, 0x9C, 0x00, 0xE1, 0x85, 0x9C, + 0x84, 0x85, 0x16, 0x86, 0xDD, 0xF2, 0xC1, 0xB7 + }, + { + 0x1E, 0xD7, 0xEF, 0x9F, 0x04, 0xC2, 0xAC, 0x8D, + 0xB6, 0xA8, 0x64, 0xDB, 0x13, 0x10, 0x87, 0xF2, + 0x70, 0x65, 0x09, 0x8E, 0x69, 0xC3, 0xFE, 0x78, + 0x71, 0x8D, 0x9B, 0x94, 0x7F, 0x4A, 0x39, 0xD0 + }, + { + 0xC1, 0x61, 0xF2, 0xDC, 0xD5, 0x7E, 0x9C, 0x14, + 0x39, 0xB3, 0x1A, 0x9D, 0xD4, 0x3D, 0x8F, 0x3D, + 0x7D, 0xD8, 0xF0, 0xEB, 0x7C, 0xFA, 0xC6, 0xFB, + 0x25, 0xA0, 0xF2, 0x8E, 0x30, 0x6F, 0x06, 0x61 + }, + { + 0xC0, 0x19, 0x69, 0xAD, 0x34, 0xC5, 0x2C, 0xAF, + 0x3D, 0xC4, 0xD8, 0x0D, 0x19, 0x73, 0x5C, 0x29, + 0x73, 0x1A, 0xC6, 0xE7, 0xA9, 0x20, 0x85, 0xAB, + 0x92, 0x50, 0xC4, 0x8D, 0xEA, 0x48, 0xA3, 0xFC + }, + { + 0x17, 0x20, 0xB3, 0x65, 0x56, 0x19, 0xD2, 0xA5, + 0x2B, 0x35, 0x21, 0xAE, 0x0E, 0x49, 0xE3, 0x45, + 0xCB, 0x33, 0x89, 0xEB, 0xD6, 0x20, 0x8A, 0xCA, + 0xF9, 0xF1, 0x3F, 0xDA, 0xCC, 0xA8, 0xBE, 0x49 + }, + { + 0x75, 0x62, 0x88, 0x36, 0x1C, 0x83, 0xE2, 0x4C, + 0x61, 0x7C, 0xF9, 0x5C, 0x90, 0x5B, 0x22, 0xD0, + 0x17, 0xCD, 0xC8, 0x6F, 0x0B, 0xF1, 0xD6, 0x58, + 0xF4, 0x75, 0x6C, 0x73, 0x79, 0x87, 0x3B, 0x7F + }, + { + 0xE7, 0xD0, 0xED, 0xA3, 0x45, 0x26, 0x93, 0xB7, + 0x52, 0xAB, 0xCD, 0xA1, 0xB5, 0x5E, 0x27, 0x6F, + 0x82, 0x69, 0x8F, 0x5F, 0x16, 0x05, 0x40, 0x3E, + 0xFF, 0x83, 0x0B, 0xEA, 0x00, 0x71, 0xA3, 0x94 + }, + { + 0x2C, 0x82, 0xEC, 0xAA, 0x6B, 0x84, 0x80, 0x3E, + 0x04, 0x4A, 0xF6, 0x31, 0x18, 0xAF, 0xE5, 0x44, + 0x68, 0x7C, 0xB6, 0xE6, 0xC7, 0xDF, 0x49, 0xED, + 0x76, 0x2D, 0xFD, 0x7C, 0x86, 0x93, 0xA1, 0xBC + }, + { + 0x61, 0x36, 0xCB, 0xF4, 0xB4, 0x41, 0x05, 0x6F, + 0xA1, 0xE2, 0x72, 0x24, 0x98, 0x12, 0x5D, 0x6D, + 0xED, 0x45, 0xE1, 0x7B, 0x52, 0x14, 0x39, 0x59, + 0xC7, 0xF4, 0xD4, 0xE3, 0x95, 0x21, 0x8A, 0xC2 + }, + { + 0x72, 0x1D, 0x32, 0x45, 0xAA, 0xFE, 0xF2, 0x7F, + 0x6A, 0x62, 0x4F, 0x47, 0x95, 0x4B, 0x6C, 0x25, + 0x50, 0x79, 0x52, 0x6F, 0xFA, 0x25, 0xE9, 0xFF, + 0x77, 0xE5, 0xDC, 0xFF, 0x47, 0x3B, 0x15, 0x97 + }, + { + 0x9D, 0xD2, 0xFB, 0xD8, 0xCE, 0xF1, 0x6C, 0x35, + 0x3C, 0x0A, 0xC2, 0x11, 0x91, 0xD5, 0x09, 0xEB, + 0x28, 0xDD, 0x9E, 0x3E, 0x0D, 0x8C, 0xEA, 0x5D, + 0x26, 0xCA, 0x83, 0x93, 0x93, 0x85, 0x1C, 0x3A + }, + { + 0xB2, 0x39, 0x4C, 0xEA, 0xCD, 0xEB, 0xF2, 0x1B, + 0xF9, 0xDF, 0x2C, 0xED, 0x98, 0xE5, 0x8F, 0x1C, + 0x3A, 0x4B, 0xBB, 0xFF, 0x66, 0x0D, 0xD9, 0x00, + 0xF6, 0x22, 0x02, 0xD6, 0x78, 0x5C, 0xC4, 0x6E + }, + { + 0x57, 0x08, 0x9F, 0x22, 0x27, 0x49, 0xAD, 0x78, + 0x71, 0x76, 0x5F, 0x06, 0x2B, 0x11, 0x4F, 0x43, + 0xBA, 0x20, 0xEC, 0x56, 0x42, 0x2A, 0x8B, 0x1E, + 0x3F, 0x87, 0x19, 0x2C, 0x0E, 0xA7, 0x18, 0xC6 + }, + { + 0xE4, 0x9A, 0x94, 0x59, 0x96, 0x1C, 0xD3, 0x3C, + 0xDF, 0x4A, 0xAE, 0x1B, 0x10, 0x78, 0xA5, 0xDE, + 0xA7, 0xC0, 0x40, 0xE0, 0xFE, 0xA3, 0x40, 0xC9, + 0x3A, 0x72, 0x48, 0x72, 0xFC, 0x4A, 0xF8, 0x06 + }, + { + 0xED, 0xE6, 0x7F, 0x72, 0x0E, 0xFF, 0xD2, 0xCA, + 0x9C, 0x88, 0x99, 0x41, 0x52, 0xD0, 0x20, 0x1D, + 0xEE, 0x6B, 0x0A, 0x2D, 0x2C, 0x07, 0x7A, 0xCA, + 0x6D, 0xAE, 0x29, 0xF7, 0x3F, 0x8B, 0x63, 0x09 + }, + { + 0xE0, 0xF4, 0x34, 0xBF, 0x22, 0xE3, 0x08, 0x80, + 0x39, 0xC2, 0x1F, 0x71, 0x9F, 0xFC, 0x67, 0xF0, + 0xF2, 0xCB, 0x5E, 0x98, 0xA7, 0xA0, 0x19, 0x4C, + 0x76, 0xE9, 0x6B, 0xF4, 0xE8, 0xE1, 0x7E, 0x61 + }, + { + 0x27, 0x7C, 0x04, 0xE2, 0x85, 0x34, 0x84, 0xA4, + 0xEB, 0xA9, 0x10, 0xAD, 0x33, 0x6D, 0x01, 0xB4, + 0x77, 0xB6, 0x7C, 0xC2, 0x00, 0xC5, 0x9F, 0x3C, + 0x8D, 0x77, 0xEE, 0xF8, 0x49, 0x4F, 0x29, 0xCD + }, + { + 0x15, 0x6D, 0x57, 0x47, 0xD0, 0xC9, 0x9C, 0x7F, + 0x27, 0x09, 0x7D, 0x7B, 0x7E, 0x00, 0x2B, 0x2E, + 0x18, 0x5C, 0xB7, 0x2D, 0x8D, 0xD7, 0xEB, 0x42, + 0x4A, 0x03, 0x21, 0x52, 0x81, 0x61, 0x21, 0x9F + }, + { + 0x20, 0xDD, 0xD1, 0xED, 0x9B, 0x1C, 0xA8, 0x03, + 0x94, 0x6D, 0x64, 0xA8, 0x3A, 0xE4, 0x65, 0x9D, + 0xA6, 0x7F, 0xBA, 0x7A, 0x1A, 0x3E, 0xDD, 0xB1, + 0xE1, 0x03, 0xC0, 0xF5, 0xE0, 0x3E, 0x3A, 0x2C + }, + { + 0xF0, 0xAF, 0x60, 0x4D, 0x3D, 0xAB, 0xBF, 0x9A, + 0x0F, 0x2A, 0x7D, 0x3D, 0xDA, 0x6B, 0xD3, 0x8B, + 0xBA, 0x72, 0xC6, 0xD0, 0x9B, 0xE4, 0x94, 0xFC, + 0xEF, 0x71, 0x3F, 0xF1, 0x01, 0x89, 0xB6, 0xE6 + }, + { + 0x98, 0x02, 0xBB, 0x87, 0xDE, 0xF4, 0xCC, 0x10, + 0xC4, 0xA5, 0xFD, 0x49, 0xAA, 0x58, 0xDF, 0xE2, + 0xF3, 0xFD, 0xDB, 0x46, 0xB4, 0x70, 0x88, 0x14, + 0xEA, 0xD8, 0x1D, 0x23, 0xBA, 0x95, 0x13, 0x9B + }, + { + 0x4F, 0x8C, 0xE1, 0xE5, 0x1D, 0x2F, 0xE7, 0xF2, + 0x40, 0x43, 0xA9, 0x04, 0xD8, 0x98, 0xEB, 0xFC, + 0x91, 0x97, 0x54, 0x18, 0x75, 0x34, 0x13, 0xAA, + 0x09, 0x9B, 0x79, 0x5E, 0xCB, 0x35, 0xCE, 0xDB + }, + { + 0xBD, 0xDC, 0x65, 0x14, 0xD7, 0xEE, 0x6A, 0xCE, + 0x0A, 0x4A, 0xC1, 0xD0, 0xE0, 0x68, 0x11, 0x22, + 0x88, 0xCB, 0xCF, 0x56, 0x04, 0x54, 0x64, 0x27, + 0x05, 0x63, 0x01, 0x77, 0xCB, 0xA6, 0x08, 0xBD + }, + { + 0xD6, 0x35, 0x99, 0x4F, 0x62, 0x91, 0x51, 0x7B, + 0x02, 0x81, 0xFF, 0xDD, 0x49, 0x6A, 0xFA, 0x86, + 0x27, 0x12, 0xE5, 0xB3, 0xC4, 0xE5, 0x2E, 0x4C, + 0xD5, 0xFD, 0xAE, 0x8C, 0x0E, 0x72, 0xFB, 0x08 + }, + { + 0x87, 0x8D, 0x9C, 0xA6, 0x00, 0xCF, 0x87, 0xE7, + 0x69, 0xCC, 0x30, 0x5C, 0x1B, 0x35, 0x25, 0x51, + 0x86, 0x61, 0x5A, 0x73, 0xA0, 0xDA, 0x61, 0x3B, + 0x5F, 0x1C, 0x98, 0xDB, 0xF8, 0x12, 0x83, 0xEA + }, + { + 0xA6, 0x4E, 0xBE, 0x5D, 0xC1, 0x85, 0xDE, 0x9F, + 0xDD, 0xE7, 0x60, 0x7B, 0x69, 0x98, 0x70, 0x2E, + 0xB2, 0x34, 0x56, 0x18, 0x49, 0x57, 0x30, 0x7D, + 0x2F, 0xA7, 0x2E, 0x87, 0xA4, 0x77, 0x02, 0xD6 + }, + { + 0xCE, 0x50, 0xEA, 0xB7, 0xB5, 0xEB, 0x52, 0xBD, + 0xC9, 0xAD, 0x8E, 0x5A, 0x48, 0x0A, 0xB7, 0x80, + 0xCA, 0x93, 0x20, 0xE4, 0x43, 0x60, 0xB1, 0xFE, + 0x37, 0xE0, 0x3F, 0x2F, 0x7A, 0xD7, 0xDE, 0x01 + }, + { + 0xEE, 0xDD, 0xB7, 0xC0, 0xDB, 0x6E, 0x30, 0xAB, + 0xE6, 0x6D, 0x79, 0xE3, 0x27, 0x51, 0x1E, 0x61, + 0xFC, 0xEB, 0xBC, 0x29, 0xF1, 0x59, 0xB4, 0x0A, + 0x86, 0xB0, 0x46, 0xEC, 0xF0, 0x51, 0x38, 0x23 + }, + { + 0x78, 0x7F, 0xC9, 0x34, 0x40, 0xC1, 0xEC, 0x96, + 0xB5, 0xAD, 0x01, 0xC1, 0x6C, 0xF7, 0x79, 0x16, + 0xA1, 0x40, 0x5F, 0x94, 0x26, 0x35, 0x6E, 0xC9, + 0x21, 0xD8, 0xDF, 0xF3, 0xEA, 0x63, 0xB7, 0xE0 + }, + { + 0x7F, 0x0D, 0x5E, 0xAB, 0x47, 0xEE, 0xFD, 0xA6, + 0x96, 0xC0, 0xBF, 0x0F, 0xBF, 0x86, 0xAB, 0x21, + 0x6F, 0xCE, 0x46, 0x1E, 0x93, 0x03, 0xAB, 0xA6, + 0xAC, 0x37, 0x41, 0x20, 0xE8, 0x90, 0xE8, 0xDF + }, + { + 0xB6, 0x80, 0x04, 0xB4, 0x2F, 0x14, 0xAD, 0x02, + 0x9F, 0x4C, 0x2E, 0x03, 0xB1, 0xD5, 0xEB, 0x76, + 0xD5, 0x71, 0x60, 0xE2, 0x64, 0x76, 0xD2, 0x11, + 0x31, 0xBE, 0xF2, 0x0A, 0xDA, 0x7D, 0x27, 0xF4 + }, + { + 0xB0, 0xC4, 0xEB, 0x18, 0xAE, 0x25, 0x0B, 0x51, + 0xA4, 0x13, 0x82, 0xEA, 0xD9, 0x2D, 0x0D, 0xC7, + 0x45, 0x5F, 0x93, 0x79, 0xFC, 0x98, 0x84, 0x42, + 0x8E, 0x47, 0x70, 0x60, 0x8D, 0xB0, 0xFA, 0xEC + }, + { + 0xF9, 0x2B, 0x7A, 0x87, 0x0C, 0x05, 0x9F, 0x4D, + 0x46, 0x46, 0x4C, 0x82, 0x4E, 0xC9, 0x63, 0x55, + 0x14, 0x0B, 0xDC, 0xE6, 0x81, 0x32, 0x2C, 0xC3, + 0xA9, 0x92, 0xFF, 0x10, 0x3E, 0x3F, 0xEA, 0x52 + }, + { + 0x53, 0x64, 0x31, 0x26, 0x14, 0x81, 0x33, 0x98, + 0xCC, 0x52, 0x5D, 0x4C, 0x4E, 0x14, 0x6E, 0xDE, + 0xB3, 0x71, 0x26, 0x5F, 0xBA, 0x19, 0x13, 0x3A, + 0x2C, 0x3D, 0x21, 0x59, 0x29, 0x8A, 0x17, 0x42 + }, + { + 0xF6, 0x62, 0x0E, 0x68, 0xD3, 0x7F, 0xB2, 0xAF, + 0x50, 0x00, 0xFC, 0x28, 0xE2, 0x3B, 0x83, 0x22, + 0x97, 0xEC, 0xD8, 0xBC, 0xE9, 0x9E, 0x8B, 0xE4, + 0xD0, 0x4E, 0x85, 0x30, 0x9E, 0x3D, 0x33, 0x74 + }, + { + 0x53, 0x16, 0xA2, 0x79, 0x69, 0xD7, 0xFE, 0x04, + 0xFF, 0x27, 0xB2, 0x83, 0x96, 0x1B, 0xFF, 0xC3, + 0xBF, 0x5D, 0xFB, 0x32, 0xFB, 0x6A, 0x89, 0xD1, + 0x01, 0xC6, 0xC3, 0xB1, 0x93, 0x7C, 0x28, 0x71 + }, + { + 0x81, 0xD1, 0x66, 0x4F, 0xDF, 0x3C, 0xB3, 0x3C, + 0x24, 0xEE, 0xBA, 0xC0, 0xBD, 0x64, 0x24, 0x4B, + 0x77, 0xC4, 0xAB, 0xEA, 0x90, 0xBB, 0xE8, 0xB5, + 0xEE, 0x0B, 0x2A, 0xAF, 0xCF, 0x2D, 0x6A, 0x53 + }, + { + 0x34, 0x57, 0x82, 0xF2, 0x95, 0xB0, 0x88, 0x03, + 0x52, 0xE9, 0x24, 0xA0, 0x46, 0x7B, 0x5F, 0xBC, + 0x3E, 0x8F, 0x3B, 0xFB, 0xC3, 0xC7, 0xE4, 0x8B, + 0x67, 0x09, 0x1F, 0xB5, 0xE8, 0x0A, 0x94, 0x42 + }, + { + 0x79, 0x41, 0x11, 0xEA, 0x6C, 0xD6, 0x5E, 0x31, + 0x1F, 0x74, 0xEE, 0x41, 0xD4, 0x76, 0xCB, 0x63, + 0x2C, 0xE1, 0xE4, 0xB0, 0x51, 0xDC, 0x1D, 0x9E, + 0x9D, 0x06, 0x1A, 0x19, 0xE1, 0xD0, 0xBB, 0x49 + }, + { + 0x2A, 0x85, 0xDA, 0xF6, 0x13, 0x88, 0x16, 0xB9, + 0x9B, 0xF8, 0xD0, 0x8B, 0xA2, 0x11, 0x4B, 0x7A, + 0xB0, 0x79, 0x75, 0xA7, 0x84, 0x20, 0xC1, 0xA3, + 0xB0, 0x6A, 0x77, 0x7C, 0x22, 0xDD, 0x8B, 0xCB + }, + { + 0x89, 0xB0, 0xD5, 0xF2, 0x89, 0xEC, 0x16, 0x40, + 0x1A, 0x06, 0x9A, 0x96, 0x0D, 0x0B, 0x09, 0x3E, + 0x62, 0x5D, 0xA3, 0xCF, 0x41, 0xEE, 0x29, 0xB5, + 0x9B, 0x93, 0x0C, 0x58, 0x20, 0x14, 0x54, 0x55 + }, + { + 0xD0, 0xFD, 0xCB, 0x54, 0x39, 0x43, 0xFC, 0x27, + 0xD2, 0x08, 0x64, 0xF5, 0x21, 0x81, 0x47, 0x1B, + 0x94, 0x2C, 0xC7, 0x7C, 0xA6, 0x75, 0xBC, 0xB3, + 0x0D, 0xF3, 0x1D, 0x35, 0x8E, 0xF7, 0xB1, 0xEB + }, + { + 0xB1, 0x7E, 0xA8, 0xD7, 0x70, 0x63, 0xC7, 0x09, + 0xD4, 0xDC, 0x6B, 0x87, 0x94, 0x13, 0xC3, 0x43, + 0xE3, 0x79, 0x0E, 0x9E, 0x62, 0xCA, 0x85, 0xB7, + 0x90, 0x0B, 0x08, 0x6F, 0x6B, 0x75, 0xC6, 0x72 + }, + { + 0xE7, 0x1A, 0x3E, 0x2C, 0x27, 0x4D, 0xB8, 0x42, + 0xD9, 0x21, 0x14, 0xF2, 0x17, 0xE2, 0xC0, 0xEA, + 0xC8, 0xB4, 0x50, 0x93, 0xFD, 0xFD, 0x9D, 0xF4, + 0xCA, 0x71, 0x62, 0x39, 0x48, 0x62, 0xD5, 0x01 + }, + { + 0xC0, 0x47, 0x67, 0x59, 0xAB, 0x7A, 0xA3, 0x33, + 0x23, 0x4F, 0x6B, 0x44, 0xF5, 0xFD, 0x85, 0x83, + 0x90, 0xEC, 0x23, 0x69, 0x4C, 0x62, 0x2C, 0xB9, + 0x86, 0xE7, 0x69, 0xC7, 0x8E, 0xDD, 0x73, 0x3E + }, + { + 0x9A, 0xB8, 0xEA, 0xBB, 0x14, 0x16, 0x43, 0x4D, + 0x85, 0x39, 0x13, 0x41, 0xD5, 0x69, 0x93, 0xC5, + 0x54, 0x58, 0x16, 0x7D, 0x44, 0x18, 0xB1, 0x9A, + 0x0F, 0x2A, 0xD8, 0xB7, 0x9A, 0x83, 0xA7, 0x5B + }, + { + 0x79, 0x92, 0xD0, 0xBB, 0xB1, 0x5E, 0x23, 0x82, + 0x6F, 0x44, 0x3E, 0x00, 0x50, 0x5D, 0x68, 0xD3, + 0xED, 0x73, 0x72, 0x99, 0x5A, 0x5C, 0x3E, 0x49, + 0x86, 0x54, 0x10, 0x2F, 0xBC, 0xD0, 0x96, 0x4E + }, + { + 0xC0, 0x21, 0xB3, 0x00, 0x85, 0x15, 0x14, 0x35, + 0xDF, 0x33, 0xB0, 0x07, 0xCC, 0xEC, 0xC6, 0x9D, + 0xF1, 0x26, 0x9F, 0x39, 0xBA, 0x25, 0x09, 0x2B, + 0xED, 0x59, 0xD9, 0x32, 0xAC, 0x0F, 0xDC, 0x28 + }, + { + 0x91, 0xA2, 0x5E, 0xC0, 0xEC, 0x0D, 0x9A, 0x56, + 0x7F, 0x89, 0xC4, 0xBF, 0xE1, 0xA6, 0x5A, 0x0E, + 0x43, 0x2D, 0x07, 0x06, 0x4B, 0x41, 0x90, 0xE2, + 0x7D, 0xFB, 0x81, 0x90, 0x1F, 0xD3, 0x13, 0x9B + }, + { + 0x59, 0x50, 0xD3, 0x9A, 0x23, 0xE1, 0x54, 0x5F, + 0x30, 0x12, 0x70, 0xAA, 0x1A, 0x12, 0xF2, 0xE6, + 0xC4, 0x53, 0x77, 0x6E, 0x4D, 0x63, 0x55, 0xDE, + 0x42, 0x5C, 0xC1, 0x53, 0xF9, 0x81, 0x88, 0x67 + }, + { + 0xD7, 0x9F, 0x14, 0x72, 0x0C, 0x61, 0x0A, 0xF1, + 0x79, 0xA3, 0x76, 0x5D, 0x4B, 0x7C, 0x09, 0x68, + 0xF9, 0x77, 0x96, 0x2D, 0xBF, 0x65, 0x5B, 0x52, + 0x12, 0x72, 0xB6, 0xF1, 0xE1, 0x94, 0x48, 0x8E + }, + { + 0xE9, 0x53, 0x1B, 0xFC, 0x8B, 0x02, 0x99, 0x5A, + 0xEA, 0xA7, 0x5B, 0xA2, 0x70, 0x31, 0xFA, 0xDB, + 0xCB, 0xF4, 0xA0, 0xDA, 0xB8, 0x96, 0x1D, 0x92, + 0x96, 0xCD, 0x7E, 0x84, 0xD2, 0x5D, 0x60, 0x06 + }, + { + 0x34, 0xE9, 0xC2, 0x6A, 0x01, 0xD7, 0xF1, 0x61, + 0x81, 0xB4, 0x54, 0xA9, 0xD1, 0x62, 0x3C, 0x23, + 0x3C, 0xB9, 0x9D, 0x31, 0xC6, 0x94, 0x65, 0x6E, + 0x94, 0x13, 0xAC, 0xA3, 0xE9, 0x18, 0x69, 0x2F + }, + { + 0xD9, 0xD7, 0x42, 0x2F, 0x43, 0x7B, 0xD4, 0x39, + 0xDD, 0xD4, 0xD8, 0x83, 0xDA, 0xE2, 0xA0, 0x83, + 0x50, 0x17, 0x34, 0x14, 0xBE, 0x78, 0x15, 0x51, + 0x33, 0xFF, 0xF1, 0x96, 0x4C, 0x3D, 0x79, 0x72 + }, + { + 0x4A, 0xEE, 0x0C, 0x7A, 0xAF, 0x07, 0x54, 0x14, + 0xFF, 0x17, 0x93, 0xEA, 0xD7, 0xEA, 0xCA, 0x60, + 0x17, 0x75, 0xC6, 0x15, 0xDB, 0xD6, 0x0B, 0x64, + 0x0B, 0x0A, 0x9F, 0x0C, 0xE5, 0x05, 0xD4, 0x35 + }, + { + 0x6B, 0xFD, 0xD1, 0x54, 0x59, 0xC8, 0x3B, 0x99, + 0xF0, 0x96, 0xBF, 0xB4, 0x9E, 0xE8, 0x7B, 0x06, + 0x3D, 0x69, 0xC1, 0x97, 0x4C, 0x69, 0x28, 0xAC, + 0xFC, 0xFB, 0x40, 0x99, 0xF8, 0xC4, 0xEF, 0x67 + }, + { + 0x9F, 0xD1, 0xC4, 0x08, 0xFD, 0x75, 0xC3, 0x36, + 0x19, 0x3A, 0x2A, 0x14, 0xD9, 0x4F, 0x6A, 0xF5, + 0xAD, 0xF0, 0x50, 0xB8, 0x03, 0x87, 0xB4, 0xB0, + 0x10, 0xFB, 0x29, 0xF4, 0xCC, 0x72, 0x70, 0x7C + }, + { + 0x13, 0xC8, 0x84, 0x80, 0xA5, 0xD0, 0x0D, 0x6C, + 0x8C, 0x7A, 0xD2, 0x11, 0x0D, 0x76, 0xA8, 0x2D, + 0x9B, 0x70, 0xF4, 0xFA, 0x66, 0x96, 0xD4, 0xE5, + 0xDD, 0x42, 0xA0, 0x66, 0xDC, 0xAF, 0x99, 0x20 + }, + { + 0x82, 0x0E, 0x72, 0x5E, 0xE2, 0x5F, 0xE8, 0xFD, + 0x3A, 0x8D, 0x5A, 0xBE, 0x4C, 0x46, 0xC3, 0xBA, + 0x88, 0x9D, 0xE6, 0xFA, 0x91, 0x91, 0xAA, 0x22, + 0xBA, 0x67, 0xD5, 0x70, 0x54, 0x21, 0x54, 0x2B + }, + { + 0x32, 0xD9, 0x3A, 0x0E, 0xB0, 0x2F, 0x42, 0xFB, + 0xBC, 0xAF, 0x2B, 0xAD, 0x00, 0x85, 0xB2, 0x82, + 0xE4, 0x60, 0x46, 0xA4, 0xDF, 0x7A, 0xD1, 0x06, + 0x57, 0xC9, 0xD6, 0x47, 0x63, 0x75, 0xB9, 0x3E + }, + { + 0xAD, 0xC5, 0x18, 0x79, 0x05, 0xB1, 0x66, 0x9C, + 0xD8, 0xEC, 0x9C, 0x72, 0x1E, 0x19, 0x53, 0x78, + 0x6B, 0x9D, 0x89, 0xA9, 0xBA, 0xE3, 0x07, 0x80, + 0xF1, 0xE1, 0xEA, 0xB2, 0x4A, 0x00, 0x52, 0x3C + }, + { + 0xE9, 0x07, 0x56, 0xFF, 0x7F, 0x9A, 0xD8, 0x10, + 0xB2, 0x39, 0xA1, 0x0C, 0xED, 0x2C, 0xF9, 0xB2, + 0x28, 0x43, 0x54, 0xC1, 0xF8, 0xC7, 0xE0, 0xAC, + 0xCC, 0x24, 0x61, 0xDC, 0x79, 0x6D, 0x6E, 0x89 + }, + { + 0x12, 0x51, 0xF7, 0x6E, 0x56, 0x97, 0x84, 0x81, + 0x87, 0x53, 0x59, 0x80, 0x1D, 0xB5, 0x89, 0xA0, + 0xB2, 0x2F, 0x86, 0xD8, 0xD6, 0x34, 0xDC, 0x04, + 0x50, 0x6F, 0x32, 0x2E, 0xD7, 0x8F, 0x17, 0xE8 + }, + { + 0x3A, 0xFA, 0x89, 0x9F, 0xD9, 0x80, 0xE7, 0x3E, + 0xCB, 0x7F, 0x4D, 0x8B, 0x8F, 0x29, 0x1D, 0xC9, + 0xAF, 0x79, 0x6B, 0xC6, 0x5D, 0x27, 0xF9, 0x74, + 0xC6, 0xF1, 0x93, 0xC9, 0x19, 0x1A, 0x09, 0xFD + }, + { + 0xAA, 0x30, 0x5B, 0xE2, 0x6E, 0x5D, 0xED, 0xDC, + 0x3C, 0x10, 0x10, 0xCB, 0xC2, 0x13, 0xF9, 0x5F, + 0x05, 0x1C, 0x78, 0x5C, 0x5B, 0x43, 0x1E, 0x6A, + 0x7C, 0xD0, 0x48, 0xF1, 0x61, 0x78, 0x75, 0x28 + }, + { + 0x8E, 0xA1, 0x88, 0x4F, 0xF3, 0x2E, 0x9D, 0x10, + 0xF0, 0x39, 0xB4, 0x07, 0xD0, 0xD4, 0x4E, 0x7E, + 0x67, 0x0A, 0xBD, 0x88, 0x4A, 0xEE, 0xE0, 0xFB, + 0x75, 0x7A, 0xE9, 0x4E, 0xAA, 0x97, 0x37, 0x3D + }, + { + 0xD4, 0x82, 0xB2, 0x15, 0x5D, 0x4D, 0xEC, 0x6B, + 0x47, 0x36, 0xA1, 0xF1, 0x61, 0x7B, 0x53, 0xAA, + 0xA3, 0x73, 0x10, 0x27, 0x7D, 0x3F, 0xEF, 0x0C, + 0x37, 0xAD, 0x41, 0x76, 0x8F, 0xC2, 0x35, 0xB4 + }, + { + 0x4D, 0x41, 0x39, 0x71, 0x38, 0x7E, 0x7A, 0x88, + 0x98, 0xA8, 0xDC, 0x2A, 0x27, 0x50, 0x07, 0x78, + 0x53, 0x9E, 0xA2, 0x14, 0xA2, 0xDF, 0xE9, 0xB3, + 0xD7, 0xE8, 0xEB, 0xDC, 0xE5, 0xCF, 0x3D, 0xB3 + }, + { + 0x69, 0x6E, 0x5D, 0x46, 0xE6, 0xC5, 0x7E, 0x87, + 0x96, 0xE4, 0x73, 0x5D, 0x08, 0x91, 0x6E, 0x0B, + 0x79, 0x29, 0xB3, 0xCF, 0x29, 0x8C, 0x29, 0x6D, + 0x22, 0xE9, 0xD3, 0x01, 0x96, 0x53, 0x37, 0x1C + }, + { + 0x1F, 0x56, 0x47, 0xC1, 0xD3, 0xB0, 0x88, 0x22, + 0x88, 0x85, 0x86, 0x5C, 0x89, 0x40, 0x90, 0x8B, + 0xF4, 0x0D, 0x1A, 0x82, 0x72, 0x82, 0x19, 0x73, + 0xB1, 0x60, 0x00, 0x8E, 0x7A, 0x3C, 0xE2, 0xEB + }, + { + 0xB6, 0xE7, 0x6C, 0x33, 0x0F, 0x02, 0x1A, 0x5B, + 0xDA, 0x65, 0x87, 0x50, 0x10, 0xB0, 0xED, 0xF0, + 0x91, 0x26, 0xC0, 0xF5, 0x10, 0xEA, 0x84, 0x90, + 0x48, 0x19, 0x20, 0x03, 0xAE, 0xF4, 0xC6, 0x1C + }, + { + 0x3C, 0xD9, 0x52, 0xA0, 0xBE, 0xAD, 0xA4, 0x1A, + 0xBB, 0x42, 0x4C, 0xE4, 0x7F, 0x94, 0xB4, 0x2B, + 0xE6, 0x4E, 0x1F, 0xFB, 0x0F, 0xD0, 0x78, 0x22, + 0x76, 0x80, 0x79, 0x46, 0xD0, 0xD0, 0xBC, 0x55 + }, + { + 0x98, 0xD9, 0x26, 0x77, 0x43, 0x9B, 0x41, 0xB7, + 0xBB, 0x51, 0x33, 0x12, 0xAF, 0xB9, 0x2B, 0xCC, + 0x8E, 0xE9, 0x68, 0xB2, 0xE3, 0xB2, 0x38, 0xCE, + 0xCB, 0x9B, 0x0F, 0x34, 0xC9, 0xBB, 0x63, 0xD0 + }, + { + 0xEC, 0xBC, 0xA2, 0xCF, 0x08, 0xAE, 0x57, 0xD5, + 0x17, 0xAD, 0x16, 0x15, 0x8A, 0x32, 0xBF, 0xA7, + 0xDC, 0x03, 0x82, 0xEA, 0xED, 0xA1, 0x28, 0xE9, + 0x18, 0x86, 0x73, 0x4C, 0x24, 0xA0, 0xB2, 0x9D + }, + { + 0x94, 0x2C, 0xC7, 0xC0, 0xB5, 0x2E, 0x2B, 0x16, + 0xA4, 0xB8, 0x9F, 0xA4, 0xFC, 0x7E, 0x0B, 0xF6, + 0x09, 0xE2, 0x9A, 0x08, 0xC1, 0xA8, 0x54, 0x34, + 0x52, 0xB7, 0x7C, 0x7B, 0xFD, 0x11, 0xBB, 0x28 + }, + { + 0x8A, 0x06, 0x5D, 0x8B, 0x61, 0xA0, 0xDF, 0xFB, + 0x17, 0x0D, 0x56, 0x27, 0x73, 0x5A, 0x76, 0xB0, + 0xE9, 0x50, 0x60, 0x37, 0x80, 0x8C, 0xBA, 0x16, + 0xC3, 0x45, 0x00, 0x7C, 0x9F, 0x79, 0xCF, 0x8F + }, + { + 0x1B, 0x9F, 0xA1, 0x97, 0x14, 0x65, 0x9C, 0x78, + 0xFF, 0x41, 0x38, 0x71, 0x84, 0x92, 0x15, 0x36, + 0x10, 0x29, 0xAC, 0x80, 0x2B, 0x1C, 0xBC, 0xD5, + 0x4E, 0x40, 0x8B, 0xD8, 0x72, 0x87, 0xF8, 0x1F + }, + { + 0x8D, 0xAB, 0x07, 0x1B, 0xCD, 0x6C, 0x72, 0x92, + 0xA9, 0xEF, 0x72, 0x7B, 0x4A, 0xE0, 0xD8, 0x67, + 0x13, 0x30, 0x1D, 0xA8, 0x61, 0x8D, 0x9A, 0x48, + 0xAD, 0xCE, 0x55, 0xF3, 0x03, 0xA8, 0x69, 0xA1 + }, + { + 0x82, 0x53, 0xE3, 0xE7, 0xC7, 0xB6, 0x84, 0xB9, + 0xCB, 0x2B, 0xEB, 0x01, 0x4C, 0xE3, 0x30, 0xFF, + 0x3D, 0x99, 0xD1, 0x7A, 0xBB, 0xDB, 0xAB, 0xE4, + 0xF4, 0xD6, 0x74, 0xDE, 0xD5, 0x3F, 0xFC, 0x6B + }, + { + 0xF1, 0x95, 0xF3, 0x21, 0xE9, 0xE3, 0xD6, 0xBD, + 0x7D, 0x07, 0x45, 0x04, 0xDD, 0x2A, 0xB0, 0xE6, + 0x24, 0x1F, 0x92, 0xE7, 0x84, 0xB1, 0xAA, 0x27, + 0x1F, 0xF6, 0x48, 0xB1, 0xCA, 0xB6, 0xD7, 0xF6 + }, + { + 0x27, 0xE4, 0xCC, 0x72, 0x09, 0x0F, 0x24, 0x12, + 0x66, 0x47, 0x6A, 0x7C, 0x09, 0x49, 0x5F, 0x2D, + 0xB1, 0x53, 0xD5, 0xBC, 0xBD, 0x76, 0x19, 0x03, + 0xEF, 0x79, 0x27, 0x5E, 0xC5, 0x6B, 0x2E, 0xD8 + }, + { + 0x89, 0x9C, 0x24, 0x05, 0x78, 0x8E, 0x25, 0xB9, + 0x9A, 0x18, 0x46, 0x35, 0x5E, 0x64, 0x6D, 0x77, + 0xCF, 0x40, 0x00, 0x83, 0x41, 0x5F, 0x7D, 0xC5, + 0xAF, 0xE6, 0x9D, 0x6E, 0x17, 0xC0, 0x00, 0x23 + }, + { + 0xA5, 0x9B, 0x78, 0xC4, 0x90, 0x57, 0x44, 0x07, + 0x6B, 0xFE, 0xE8, 0x94, 0xDE, 0x70, 0x7D, 0x4F, + 0x12, 0x0B, 0x5C, 0x68, 0x93, 0xEA, 0x04, 0x00, + 0x29, 0x7D, 0x0B, 0xB8, 0x34, 0x72, 0x76, 0x32 + }, + { + 0x59, 0xDC, 0x78, 0xB1, 0x05, 0x64, 0x97, 0x07, + 0xA2, 0xBB, 0x44, 0x19, 0xC4, 0x8F, 0x00, 0x54, + 0x00, 0xD3, 0x97, 0x3D, 0xE3, 0x73, 0x66, 0x10, + 0x23, 0x04, 0x35, 0xB1, 0x04, 0x24, 0xB2, 0x4F + }, + { + 0xC0, 0x14, 0x9D, 0x1D, 0x7E, 0x7A, 0x63, 0x53, + 0xA6, 0xD9, 0x06, 0xEF, 0xE7, 0x28, 0xF2, 0xF3, + 0x29, 0xFE, 0x14, 0xA4, 0x14, 0x9A, 0x3E, 0xA7, + 0x76, 0x09, 0xBC, 0x42, 0xB9, 0x75, 0xDD, 0xFA + }, + { + 0xA3, 0x2F, 0x24, 0x14, 0x74, 0xA6, 0xC1, 0x69, + 0x32, 0xE9, 0x24, 0x3B, 0xE0, 0xCF, 0x09, 0xBC, + 0xDC, 0x7E, 0x0C, 0xA0, 0xE7, 0xA6, 0xA1, 0xB9, + 0xB1, 0xA0, 0xF0, 0x1E, 0x41, 0x50, 0x23, 0x77 + }, + { + 0xB2, 0x39, 0xB2, 0xE4, 0xF8, 0x18, 0x41, 0x36, + 0x1C, 0x13, 0x39, 0xF6, 0x8E, 0x2C, 0x35, 0x9F, + 0x92, 0x9A, 0xF9, 0xAD, 0x9F, 0x34, 0xE0, 0x1A, + 0xAB, 0x46, 0x31, 0xAD, 0x6D, 0x55, 0x00, 0xB0 + }, + { + 0x85, 0xFB, 0x41, 0x9C, 0x70, 0x02, 0xA3, 0xE0, + 0xB4, 0xB6, 0xEA, 0x09, 0x3B, 0x4C, 0x1A, 0xC6, + 0x93, 0x66, 0x45, 0xB6, 0x5D, 0xAC, 0x5A, 0xC1, + 0x5A, 0x85, 0x28, 0xB7, 0xB9, 0x4C, 0x17, 0x54 + }, + { + 0x96, 0x19, 0x72, 0x06, 0x25, 0xF1, 0x90, 0xB9, + 0x3A, 0x3F, 0xAD, 0x18, 0x6A, 0xB3, 0x14, 0x18, + 0x96, 0x33, 0xC0, 0xD3, 0xA0, 0x1E, 0x6F, 0x9B, + 0xC8, 0xC4, 0xA8, 0xF8, 0x2F, 0x38, 0x3D, 0xBF + }, + { + 0x7D, 0x62, 0x0D, 0x90, 0xFE, 0x69, 0xFA, 0x46, + 0x9A, 0x65, 0x38, 0x38, 0x89, 0x70, 0xA1, 0xAA, + 0x09, 0xBB, 0x48, 0xA2, 0xD5, 0x9B, 0x34, 0x7B, + 0x97, 0xE8, 0xCE, 0x71, 0xF4, 0x8C, 0x7F, 0x46 + }, + { + 0x29, 0x43, 0x83, 0x56, 0x85, 0x96, 0xFB, 0x37, + 0xC7, 0x5B, 0xBA, 0xCD, 0x97, 0x9C, 0x5F, 0xF6, + 0xF2, 0x0A, 0x55, 0x6B, 0xF8, 0x87, 0x9C, 0xC7, + 0x29, 0x24, 0x85, 0x5D, 0xF9, 0xB8, 0x24, 0x0E + }, + { + 0x16, 0xB1, 0x8A, 0xB3, 0x14, 0x35, 0x9C, 0x2B, + 0x83, 0x3C, 0x1C, 0x69, 0x86, 0xD4, 0x8C, 0x55, + 0xA9, 0xFC, 0x97, 0xCD, 0xE9, 0xA3, 0xC1, 0xF1, + 0x0A, 0x31, 0x77, 0x14, 0x0F, 0x73, 0xF7, 0x38 + }, + { + 0x8C, 0xBB, 0xDD, 0x14, 0xBC, 0x33, 0xF0, 0x4C, + 0xF4, 0x58, 0x13, 0xE4, 0xA1, 0x53, 0xA2, 0x73, + 0xD3, 0x6A, 0xDA, 0xD5, 0xCE, 0x71, 0xF4, 0x99, + 0xEE, 0xB8, 0x7F, 0xB8, 0xAC, 0x63, 0xB7, 0x29 + }, + { + 0x69, 0xC9, 0xA4, 0x98, 0xDB, 0x17, 0x4E, 0xCA, + 0xEF, 0xCC, 0x5A, 0x3A, 0xC9, 0xFD, 0xED, 0xF0, + 0xF8, 0x13, 0xA5, 0xBE, 0xC7, 0x27, 0xF1, 0xE7, + 0x75, 0xBA, 0xBD, 0xEC, 0x77, 0x18, 0x81, 0x6E + }, + { + 0xB4, 0x62, 0xC3, 0xBE, 0x40, 0x44, 0x8F, 0x1D, + 0x4F, 0x80, 0x62, 0x62, 0x54, 0xE5, 0x35, 0xB0, + 0x8B, 0xC9, 0xCD, 0xCF, 0xF5, 0x99, 0xA7, 0x68, + 0x57, 0x8D, 0x4B, 0x28, 0x81, 0xA8, 0xE3, 0xF0 + }, + { + 0x55, 0x3E, 0x9D, 0x9C, 0x5F, 0x36, 0x0A, 0xC0, + 0xB7, 0x4A, 0x7D, 0x44, 0xE5, 0xA3, 0x91, 0xDA, + 0xD4, 0xCE, 0xD0, 0x3E, 0x0C, 0x24, 0x18, 0x3B, + 0x7E, 0x8E, 0xCA, 0xBD, 0xF1, 0x71, 0x5A, 0x64 + }, + { + 0x7A, 0x7C, 0x55, 0xA5, 0x6F, 0xA9, 0xAE, 0x51, + 0xE6, 0x55, 0xE0, 0x19, 0x75, 0xD8, 0xA6, 0xFF, + 0x4A, 0xE9, 0xE4, 0xB4, 0x86, 0xFC, 0xBE, 0x4E, + 0xAC, 0x04, 0x45, 0x88, 0xF2, 0x45, 0xEB, 0xEA + }, + { + 0x2A, 0xFD, 0xF3, 0xC8, 0x2A, 0xBC, 0x48, 0x67, + 0xF5, 0xDE, 0x11, 0x12, 0x86, 0xC2, 0xB3, 0xBE, + 0x7D, 0x6E, 0x48, 0x65, 0x7B, 0xA9, 0x23, 0xCF, + 0xBF, 0x10, 0x1A, 0x6D, 0xFC, 0xF9, 0xDB, 0x9A + }, + { + 0x41, 0x03, 0x7D, 0x2E, 0xDC, 0xDC, 0xE0, 0xC4, + 0x9B, 0x7F, 0xB4, 0xA6, 0xAA, 0x09, 0x99, 0xCA, + 0x66, 0x97, 0x6C, 0x74, 0x83, 0xAF, 0xE6, 0x31, + 0xD4, 0xED, 0xA2, 0x83, 0x14, 0x4F, 0x6D, 0xFC + }, + { + 0xC4, 0x46, 0x6F, 0x84, 0x97, 0xCA, 0x2E, 0xEB, + 0x45, 0x83, 0xA0, 0xB0, 0x8E, 0x9D, 0x9A, 0xC7, + 0x43, 0x95, 0x70, 0x9F, 0xDA, 0x10, 0x9D, 0x24, + 0xF2, 0xE4, 0x46, 0x21, 0x96, 0x77, 0x9C, 0x5D + }, + { + 0x75, 0xF6, 0x09, 0x33, 0x8A, 0xA6, 0x7D, 0x96, + 0x9A, 0x2A, 0xE2, 0xA2, 0x36, 0x2B, 0x2D, 0xA9, + 0xD7, 0x7C, 0x69, 0x5D, 0xFD, 0x1D, 0xF7, 0x22, + 0x4A, 0x69, 0x01, 0xDB, 0x93, 0x2C, 0x33, 0x64 + }, + { + 0x68, 0x60, 0x6C, 0xEB, 0x98, 0x9D, 0x54, 0x88, + 0xFC, 0x7C, 0xF6, 0x49, 0xF3, 0xD7, 0xC2, 0x72, + 0xEF, 0x05, 0x5D, 0xA1, 0xA9, 0x3F, 0xAE, 0xCD, + 0x55, 0xFE, 0x06, 0xF6, 0x96, 0x70, 0x98, 0xCA + }, + { + 0x44, 0x34, 0x6B, 0xDE, 0xB7, 0xE0, 0x52, 0xF6, + 0x25, 0x50, 0x48, 0xF0, 0xD9, 0xB4, 0x2C, 0x42, + 0x5B, 0xAB, 0x9C, 0x3D, 0xD2, 0x41, 0x68, 0x21, + 0x2C, 0x3E, 0xCF, 0x1E, 0xBF, 0x34, 0xE6, 0xAE + }, + { + 0x8E, 0x9C, 0xF6, 0xE1, 0xF3, 0x66, 0x47, 0x1F, + 0x2A, 0xC7, 0xD2, 0xEE, 0x9B, 0x5E, 0x62, 0x66, + 0xFD, 0xA7, 0x1F, 0x8F, 0x2E, 0x41, 0x09, 0xF2, + 0x23, 0x7E, 0xD5, 0xF8, 0x81, 0x3F, 0xC7, 0x18 + }, + { + 0x84, 0xBB, 0xEB, 0x84, 0x06, 0xD2, 0x50, 0x95, + 0x1F, 0x8C, 0x1B, 0x3E, 0x86, 0xA7, 0xC0, 0x10, + 0x08, 0x29, 0x21, 0x83, 0x3D, 0xFD, 0x95, 0x55, + 0xA2, 0xF9, 0x09, 0xB1, 0x08, 0x6E, 0xB4, 0xB8 + }, + { + 0xEE, 0x66, 0x6F, 0x3E, 0xEF, 0x0F, 0x7E, 0x2A, + 0x9C, 0x22, 0x29, 0x58, 0xC9, 0x7E, 0xAF, 0x35, + 0xF5, 0x1C, 0xED, 0x39, 0x3D, 0x71, 0x44, 0x85, + 0xAB, 0x09, 0xA0, 0x69, 0x34, 0x0F, 0xDF, 0x88 + }, + { + 0xC1, 0x53, 0xD3, 0x4A, 0x65, 0xC4, 0x7B, 0x4A, + 0x62, 0xC5, 0xCA, 0xCF, 0x24, 0x01, 0x09, 0x75, + 0xD0, 0x35, 0x6B, 0x2F, 0x32, 0xC8, 0xF5, 0xDA, + 0x53, 0x0D, 0x33, 0x88, 0x16, 0xAD, 0x5D, 0xE6 + }, + { + 0x9F, 0xC5, 0x45, 0x01, 0x09, 0xE1, 0xB7, 0x79, + 0xF6, 0xC7, 0xAE, 0x79, 0xD5, 0x6C, 0x27, 0x63, + 0x5C, 0x8D, 0xD4, 0x26, 0xC5, 0xA9, 0xD5, 0x4E, + 0x25, 0x78, 0xDB, 0x98, 0x9B, 0x8C, 0x3B, 0x4E + }, + { + 0xD1, 0x2B, 0xF3, 0x73, 0x2E, 0xF4, 0xAF, 0x5C, + 0x22, 0xFA, 0x90, 0x35, 0x6A, 0xF8, 0xFC, 0x50, + 0xFC, 0xB4, 0x0F, 0x8F, 0x2E, 0xA5, 0xC8, 0x59, + 0x47, 0x37, 0xA3, 0xB3, 0xD5, 0xAB, 0xDB, 0xD7 + }, + { + 0x11, 0x03, 0x0B, 0x92, 0x89, 0xBB, 0xA5, 0xAF, + 0x65, 0x26, 0x06, 0x72, 0xAB, 0x6F, 0xEE, 0x88, + 0xB8, 0x74, 0x20, 0xAC, 0xEF, 0x4A, 0x17, 0x89, + 0xA2, 0x07, 0x3B, 0x7E, 0xC2, 0xF2, 0xA0, 0x9E + }, + { + 0x69, 0xCB, 0x19, 0x2B, 0x84, 0x44, 0x00, 0x5C, + 0x8C, 0x0C, 0xEB, 0x12, 0xC8, 0x46, 0x86, 0x07, + 0x68, 0x18, 0x8C, 0xDA, 0x0A, 0xEC, 0x27, 0xA9, + 0xC8, 0xA5, 0x5C, 0xDE, 0xE2, 0x12, 0x36, 0x32 + }, + { + 0xDB, 0x44, 0x4C, 0x15, 0x59, 0x7B, 0x5F, 0x1A, + 0x03, 0xD1, 0xF9, 0xED, 0xD1, 0x6E, 0x4A, 0x9F, + 0x43, 0xA6, 0x67, 0xCC, 0x27, 0x51, 0x75, 0xDF, + 0xA2, 0xB7, 0x04, 0xE3, 0xBB, 0x1A, 0x9B, 0x83 + }, + { + 0x3F, 0xB7, 0x35, 0x06, 0x1A, 0xBC, 0x51, 0x9D, + 0xFE, 0x97, 0x9E, 0x54, 0xC1, 0xEE, 0x5B, 0xFA, + 0xD0, 0xA9, 0xD8, 0x58, 0xB3, 0x31, 0x5B, 0xAD, + 0x34, 0xBD, 0xE9, 0x99, 0xEF, 0xD7, 0x24, 0xDD + }, +}; + + + + +static const uint8_t blake2b_kat[KAT_LENGTH][BLAKE2B_OUTBYTES] = +{ + { + 0x78, 0x6A, 0x02, 0xF7, 0x42, 0x01, 0x59, 0x03, + 0xC6, 0xC6, 0xFD, 0x85, 0x25, 0x52, 0xD2, 0x72, + 0x91, 0x2F, 0x47, 0x40, 0xE1, 0x58, 0x47, 0x61, + 0x8A, 0x86, 0xE2, 0x17, 0xF7, 0x1F, 0x54, 0x19, + 0xD2, 0x5E, 0x10, 0x31, 0xAF, 0xEE, 0x58, 0x53, + 0x13, 0x89, 0x64, 0x44, 0x93, 0x4E, 0xB0, 0x4B, + 0x90, 0x3A, 0x68, 0x5B, 0x14, 0x48, 0xB7, 0x55, + 0xD5, 0x6F, 0x70, 0x1A, 0xFE, 0x9B, 0xE2, 0xCE + }, + { + 0x2F, 0xA3, 0xF6, 0x86, 0xDF, 0x87, 0x69, 0x95, + 0x16, 0x7E, 0x7C, 0x2E, 0x5D, 0x74, 0xC4, 0xC7, + 0xB6, 0xE4, 0x8F, 0x80, 0x68, 0xFE, 0x0E, 0x44, + 0x20, 0x83, 0x44, 0xD4, 0x80, 0xF7, 0x90, 0x4C, + 0x36, 0x96, 0x3E, 0x44, 0x11, 0x5F, 0xE3, 0xEB, + 0x2A, 0x3A, 0xC8, 0x69, 0x4C, 0x28, 0xBC, 0xB4, + 0xF5, 0xA0, 0xF3, 0x27, 0x6F, 0x2E, 0x79, 0x48, + 0x7D, 0x82, 0x19, 0x05, 0x7A, 0x50, 0x6E, 0x4B + }, + { + 0x1C, 0x08, 0x79, 0x8D, 0xC6, 0x41, 0xAB, 0xA9, + 0xDE, 0xE4, 0x35, 0xE2, 0x25, 0x19, 0xA4, 0x72, + 0x9A, 0x09, 0xB2, 0xBF, 0xE0, 0xFF, 0x00, 0xEF, + 0x2D, 0xCD, 0x8E, 0xD6, 0xF8, 0xA0, 0x7D, 0x15, + 0xEA, 0xF4, 0xAE, 0xE5, 0x2B, 0xBF, 0x18, 0xAB, + 0x56, 0x08, 0xA6, 0x19, 0x0F, 0x70, 0xB9, 0x04, + 0x86, 0xC8, 0xA7, 0xD4, 0x87, 0x37, 0x10, 0xB1, + 0x11, 0x5D, 0x3D, 0xEB, 0xBB, 0x43, 0x27, 0xB5 + }, + { + 0x40, 0xA3, 0x74, 0x72, 0x73, 0x02, 0xD9, 0xA4, + 0x76, 0x9C, 0x17, 0xB5, 0xF4, 0x09, 0xFF, 0x32, + 0xF5, 0x8A, 0xA2, 0x4F, 0xF1, 0x22, 0xD7, 0x60, + 0x3E, 0x4F, 0xDA, 0x15, 0x09, 0xE9, 0x19, 0xD4, + 0x10, 0x7A, 0x52, 0xC5, 0x75, 0x70, 0xA6, 0xD9, + 0x4E, 0x50, 0x96, 0x7A, 0xEA, 0x57, 0x3B, 0x11, + 0xF8, 0x6F, 0x47, 0x3F, 0x53, 0x75, 0x65, 0xC6, + 0x6F, 0x70, 0x39, 0x83, 0x0A, 0x85, 0xD1, 0x86 + }, + { + 0x77, 0xDD, 0xF4, 0xB1, 0x44, 0x25, 0xEB, 0x3D, + 0x05, 0x3C, 0x1E, 0x84, 0xE3, 0x46, 0x9D, 0x92, + 0xC4, 0xCD, 0x91, 0x0E, 0xD2, 0x0F, 0x92, 0x03, + 0x5E, 0x0C, 0x99, 0xD8, 0xA7, 0xA8, 0x6C, 0xEC, + 0xAF, 0x69, 0xF9, 0x66, 0x3C, 0x20, 0xA7, 0xAA, + 0x23, 0x0B, 0xC8, 0x2F, 0x60, 0xD2, 0x2F, 0xB4, + 0xA0, 0x0B, 0x09, 0xD3, 0xEB, 0x8F, 0xC6, 0x5E, + 0xF5, 0x47, 0xFE, 0x63, 0xC8, 0xD3, 0xDD, 0xCE + }, + { + 0xCB, 0xAA, 0x0B, 0xA7, 0xD4, 0x82, 0xB1, 0xF3, + 0x01, 0x10, 0x9A, 0xE4, 0x10, 0x51, 0x99, 0x1A, + 0x32, 0x89, 0xBC, 0x11, 0x98, 0x00, 0x5A, 0xF2, + 0x26, 0xC5, 0xE4, 0xF1, 0x03, 0xB6, 0x65, 0x79, + 0xF4, 0x61, 0x36, 0x10, 0x44, 0xC8, 0xBA, 0x34, + 0x39, 0xFF, 0x12, 0xC5, 0x15, 0xFB, 0x29, 0xC5, + 0x21, 0x61, 0xB7, 0xEB, 0x9C, 0x28, 0x37, 0xB7, + 0x6A, 0x5D, 0xC3, 0x3F, 0x7C, 0xB2, 0xE2, 0xE8 + }, + { + 0xF9, 0x5D, 0x45, 0xCF, 0x69, 0xAF, 0x5C, 0x20, + 0x23, 0xBD, 0xB5, 0x05, 0x82, 0x1E, 0x62, 0xE8, + 0x5D, 0x7C, 0xAE, 0xDF, 0x7B, 0xED, 0xA1, 0x2C, + 0x02, 0x48, 0x77, 0x5B, 0x0C, 0x88, 0x20, 0x5E, + 0xEB, 0x35, 0xAF, 0x3A, 0x90, 0x81, 0x6F, 0x66, + 0x08, 0xCE, 0x7D, 0xD4, 0x4E, 0xC2, 0x8D, 0xB1, + 0x14, 0x06, 0x14, 0xE1, 0xDD, 0xEB, 0xF3, 0xAA, + 0x9C, 0xD1, 0x84, 0x3E, 0x0F, 0xAD, 0x2C, 0x36 + }, + { + 0x8F, 0x94, 0x5B, 0xA7, 0x00, 0xF2, 0x53, 0x0E, + 0x5C, 0x2A, 0x7D, 0xF7, 0xD5, 0xDC, 0xE0, 0xF8, + 0x3F, 0x9E, 0xFC, 0x78, 0xC0, 0x73, 0xFE, 0x71, + 0xAE, 0x1F, 0x88, 0x20, 0x4A, 0x4F, 0xD1, 0xCF, + 0x70, 0xA0, 0x73, 0xF5, 0xD1, 0xF9, 0x42, 0xED, + 0x62, 0x3A, 0xA1, 0x6E, 0x90, 0xA8, 0x71, 0x24, + 0x6C, 0x90, 0xC4, 0x5B, 0x62, 0x1B, 0x34, 0x01, + 0xA5, 0xDD, 0xBD, 0x9D, 0xF6, 0x26, 0x41, 0x65 + }, + { + 0xE9, 0x98, 0xE0, 0xDC, 0x03, 0xEC, 0x30, 0xEB, + 0x99, 0xBB, 0x6B, 0xFA, 0xAF, 0x66, 0x18, 0xAC, + 0xC6, 0x20, 0x32, 0x0D, 0x72, 0x20, 0xB3, 0xAF, + 0x2B, 0x23, 0xD1, 0x12, 0xD8, 0xE9, 0xCB, 0x12, + 0x62, 0xF3, 0xC0, 0xD6, 0x0D, 0x18, 0x3B, 0x1E, + 0xE7, 0xF0, 0x96, 0xD1, 0x2D, 0xAE, 0x42, 0xC9, + 0x58, 0x41, 0x86, 0x00, 0x21, 0x4D, 0x04, 0xF5, + 0xED, 0x6F, 0x5E, 0x71, 0x8B, 0xE3, 0x55, 0x66 + }, + { + 0x6A, 0x9A, 0x09, 0x0C, 0x61, 0xB3, 0x41, 0x0A, + 0xED, 0xE7, 0xEC, 0x91, 0x38, 0x14, 0x6C, 0xEB, + 0x2C, 0x69, 0x66, 0x2F, 0x46, 0x0C, 0x3D, 0xA5, + 0x3C, 0x65, 0x15, 0xC1, 0xEB, 0x31, 0xF4, 0x1C, + 0xA3, 0xD2, 0x80, 0xE5, 0x67, 0x88, 0x2F, 0x95, + 0xCF, 0x66, 0x4A, 0x94, 0x14, 0x7D, 0x78, 0xF4, + 0x2C, 0xFC, 0x71, 0x4A, 0x40, 0xD2, 0x2E, 0xF1, + 0x94, 0x70, 0xE0, 0x53, 0x49, 0x35, 0x08, 0xA2 + }, + { + 0x29, 0x10, 0x25, 0x11, 0xD7, 0x49, 0xDB, 0x3C, + 0xC9, 0xB4, 0xE3, 0x35, 0xFA, 0x1F, 0x5E, 0x8F, + 0xAC, 0xA8, 0x42, 0x1D, 0x55, 0x8F, 0x6A, 0x3F, + 0x33, 0x21, 0xD5, 0x0D, 0x04, 0x4A, 0x24, 0x8B, + 0xA5, 0x95, 0xCF, 0xC3, 0xEF, 0xD3, 0xD2, 0xAD, + 0xC9, 0x73, 0x34, 0xDA, 0x73, 0x24, 0x13, 0xF5, + 0xCB, 0xF4, 0x75, 0x1C, 0x36, 0x2B, 0xA1, 0xD5, + 0x38, 0x62, 0xAC, 0x1E, 0x8D, 0xAB, 0xEE, 0xE8 + }, + { + 0xC9, 0x7A, 0x47, 0x79, 0xD4, 0x7E, 0x6F, 0x77, + 0x72, 0x9B, 0x59, 0x17, 0xD0, 0x13, 0x8A, 0xBB, + 0x35, 0x98, 0x0A, 0xB6, 0x41, 0xBD, 0x73, 0xA8, + 0x85, 0x9E, 0xB1, 0xAC, 0x98, 0xC0, 0x53, 0x62, + 0xED, 0x7D, 0x60, 0x8F, 0x2E, 0x95, 0x87, 0xD6, + 0xBA, 0x9E, 0x27, 0x1D, 0x34, 0x31, 0x25, 0xD4, + 0x0D, 0x93, 0x3A, 0x8E, 0xD0, 0x4E, 0xC1, 0xFE, + 0x75, 0xEC, 0x40, 0x7C, 0x7A, 0x53, 0xC3, 0x4E + }, + { + 0x10, 0xF0, 0xDC, 0x91, 0xB9, 0xF8, 0x45, 0xFB, + 0x95, 0xFA, 0xD6, 0x86, 0x0E, 0x6C, 0xE1, 0xAD, + 0xFA, 0x00, 0x2C, 0x7F, 0xC3, 0x27, 0x11, 0x6D, + 0x44, 0xD0, 0x47, 0xCD, 0x7D, 0x58, 0x70, 0xD7, + 0x72, 0xBB, 0x12, 0xB5, 0xFA, 0xC0, 0x0E, 0x02, + 0xB0, 0x8A, 0xC2, 0xA0, 0x17, 0x4D, 0x04, 0x46, + 0xC3, 0x6A, 0xB3, 0x5F, 0x14, 0xCA, 0x31, 0x89, + 0x4C, 0xD6, 0x1C, 0x78, 0xC8, 0x49, 0xB4, 0x8A + }, + { + 0xDE, 0xA9, 0x10, 0x1C, 0xAC, 0x62, 0xB8, 0xF6, + 0xA3, 0xC6, 0x50, 0xF9, 0x0E, 0xEA, 0x5B, 0xFA, + 0xE2, 0x65, 0x3A, 0x4E, 0xAF, 0xD6, 0x3A, 0x6D, + 0x1F, 0x0F, 0x13, 0x2D, 0xB9, 0xE4, 0xF2, 0xB1, + 0xB6, 0x62, 0x43, 0x2E, 0xC8, 0x5B, 0x17, 0xBC, + 0xAC, 0x41, 0xE7, 0x75, 0x63, 0x78, 0x81, 0xF6, + 0xAA, 0xB3, 0x8D, 0xD6, 0x6D, 0xCB, 0xD0, 0x80, + 0xF0, 0x99, 0x0A, 0x7A, 0x6E, 0x98, 0x54, 0xFE + }, + { + 0x44, 0x1F, 0xFA, 0xA0, 0x8C, 0xD7, 0x9D, 0xFF, + 0x4A, 0xFC, 0x9B, 0x9E, 0x5B, 0x56, 0x20, 0xEE, + 0xC0, 0x86, 0x73, 0x0C, 0x25, 0xF6, 0x61, 0xB1, + 0xD6, 0xFB, 0xFB, 0xD1, 0xCE, 0xC3, 0x14, 0x8D, + 0xD7, 0x22, 0x58, 0xC6, 0x56, 0x41, 0xF2, 0xFC, + 0xA5, 0xEB, 0x15, 0x5F, 0xAD, 0xBC, 0xAB, 0xB1, + 0x3C, 0x6E, 0x21, 0xDC, 0x11, 0xFA, 0xF7, 0x2C, + 0x2A, 0x28, 0x1B, 0x7D, 0x56, 0x14, 0x5F, 0x19 + }, + { + 0x44, 0x4B, 0x24, 0x0F, 0xE3, 0xED, 0x86, 0xD0, + 0xE2, 0xEF, 0x4C, 0xE7, 0xD8, 0x51, 0xED, 0xDE, + 0x22, 0x15, 0x55, 0x82, 0xAA, 0x09, 0x14, 0x79, + 0x7B, 0x72, 0x6C, 0xD0, 0x58, 0xB6, 0xF4, 0x59, + 0x32, 0xE0, 0xE1, 0x29, 0x51, 0x68, 0x76, 0x52, + 0x7B, 0x1D, 0xD8, 0x8F, 0xC6, 0x6D, 0x71, 0x19, + 0xF4, 0xAB, 0x3B, 0xED, 0x93, 0xA6, 0x1A, 0x0E, + 0x2D, 0x2D, 0x2A, 0xEA, 0xC3, 0x36, 0xD9, 0x58 + }, + { + 0xBF, 0xBA, 0xBB, 0xEF, 0x45, 0x55, 0x4C, 0xCF, + 0xA0, 0xDC, 0x83, 0x75, 0x2A, 0x19, 0xCC, 0x35, + 0xD5, 0x92, 0x09, 0x56, 0xB3, 0x01, 0xD5, 0x58, + 0xD7, 0x72, 0x28, 0x2B, 0xC8, 0x67, 0x00, 0x91, + 0x68, 0xE9, 0xE9, 0x86, 0x06, 0xBB, 0x5B, 0xA7, + 0x3A, 0x38, 0x5D, 0xE5, 0x74, 0x92, 0x28, 0xC9, + 0x25, 0xA8, 0x50, 0x19, 0xB7, 0x1F, 0x72, 0xFE, + 0x29, 0xB3, 0xCD, 0x37, 0xCA, 0x52, 0xEF, 0xE6 + }, + { + 0x9C, 0x4D, 0x0C, 0x3E, 0x1C, 0xDB, 0xBF, 0x48, + 0x5B, 0xEC, 0x86, 0xF4, 0x1C, 0xEC, 0x7C, 0x98, + 0x37, 0x3F, 0x0E, 0x09, 0xF3, 0x92, 0x84, 0x9A, + 0xAA, 0x22, 0x9E, 0xBF, 0xBF, 0x39, 0x7B, 0x22, + 0x08, 0x55, 0x29, 0xCB, 0x7E, 0xF3, 0x9F, 0x9C, + 0x7C, 0x22, 0x22, 0xA5, 0x14, 0x18, 0x2B, 0x1E, + 0xFF, 0xAA, 0x17, 0x8C, 0xC3, 0x68, 0x7B, 0x1B, + 0x2B, 0x6C, 0xBC, 0xB6, 0xFD, 0xEB, 0x96, 0xF8 + }, + { + 0x47, 0x71, 0x76, 0xB3, 0xBF, 0xCB, 0xAD, 0xD7, + 0x65, 0x7C, 0x23, 0xC2, 0x46, 0x25, 0xE4, 0xD0, + 0xD6, 0x74, 0xD1, 0x86, 0x8F, 0x00, 0x60, 0x06, + 0x39, 0x8A, 0xF9, 0x7A, 0xA4, 0x18, 0x77, 0xC8, + 0xE7, 0x0D, 0x3D, 0x14, 0xC3, 0xBB, 0xC9, 0xBB, + 0xCD, 0xCE, 0xA8, 0x01, 0xBD, 0x0E, 0x15, 0x99, + 0xAF, 0x1F, 0x3E, 0xEC, 0x67, 0x40, 0x51, 0x70, + 0xF4, 0xE2, 0x6C, 0x96, 0x4A, 0x57, 0xA8, 0xB7 + }, + { + 0xA7, 0x8C, 0x49, 0x0E, 0xDA, 0x31, 0x73, 0xBB, + 0x3F, 0x10, 0xDE, 0xE5, 0x2F, 0x11, 0x0F, 0xB1, + 0xC0, 0x8E, 0x03, 0x02, 0x23, 0x0B, 0x85, 0xDD, + 0xD7, 0xC1, 0x12, 0x57, 0xD9, 0x2D, 0xE1, 0x48, + 0x78, 0x5E, 0xF0, 0x0C, 0x03, 0x9C, 0x0B, 0xB8, + 0xEB, 0x98, 0x08, 0xA3, 0x5B, 0x2D, 0x8C, 0x08, + 0x0F, 0x57, 0x28, 0x59, 0x71, 0x4C, 0x9D, 0x40, + 0x69, 0xC5, 0xBC, 0xAF, 0x09, 0x0E, 0x89, 0x8E + }, + { + 0x58, 0xD0, 0x23, 0x39, 0x7B, 0xEB, 0x5B, 0x41, + 0x45, 0xCB, 0x22, 0x55, 0xB0, 0x7D, 0x74, 0x29, + 0x0B, 0x36, 0xD9, 0xFD, 0x1E, 0x59, 0x4A, 0xFB, + 0xD8, 0xEE, 0xA4, 0x7C, 0x20, 0x5B, 0x2E, 0xFB, + 0xFE, 0x6F, 0x46, 0x19, 0x0F, 0xAF, 0x95, 0xAF, + 0x50, 0x4A, 0xB0, 0x72, 0xE3, 0x6F, 0x6C, 0x85, + 0xD7, 0x67, 0xA3, 0x21, 0xBF, 0xD7, 0xF2, 0x26, + 0x87, 0xA4, 0xAB, 0xBF, 0x49, 0x4A, 0x68, 0x9C + }, + { + 0x40, 0x01, 0xEC, 0x74, 0xD5, 0xA4, 0x6F, 0xD2, + 0x9C, 0x2C, 0x3C, 0xDB, 0xE5, 0xD1, 0xB9, 0xF2, + 0x0E, 0x51, 0xA9, 0x41, 0xBE, 0x98, 0xD2, 0xA4, + 0xE1, 0xE2, 0xFB, 0xF8, 0x66, 0xA6, 0x72, 0x12, + 0x1D, 0xB6, 0xF8, 0x1A, 0x51, 0x4C, 0xFD, 0x10, + 0xE7, 0x35, 0x8D, 0x57, 0x1B, 0xDB, 0xA4, 0x8E, + 0x4C, 0xE7, 0x08, 0xB9, 0xD1, 0x24, 0x89, 0x4B, + 0xC0, 0xB5, 0xED, 0x55, 0x49, 0x35, 0xF7, 0x3A + }, + { + 0xCC, 0xD1, 0xB2, 0x2D, 0xAB, 0x65, 0x11, 0x22, + 0x5D, 0x24, 0x01, 0xEA, 0x2D, 0x86, 0x25, 0xD2, + 0x06, 0xA1, 0x24, 0x73, 0xCC, 0x73, 0x2B, 0x61, + 0x5E, 0x56, 0x40, 0xCE, 0xFF, 0xF0, 0xA4, 0xAD, + 0xF9, 0x71, 0xB0, 0xE8, 0x27, 0xA6, 0x19, 0xE0, + 0xA8, 0x0F, 0x5D, 0xB9, 0xCC, 0xD0, 0x96, 0x23, + 0x29, 0x01, 0x0D, 0x07, 0xE3, 0x4A, 0x20, 0x64, + 0xE7, 0x31, 0xC5, 0x20, 0x81, 0x7B, 0x21, 0x83 + }, + { + 0xB4, 0xA0, 0xA9, 0xE3, 0x57, 0x4E, 0xDB, 0x9E, + 0x1E, 0x72, 0xAA, 0x31, 0xE3, 0x9C, 0xC5, 0xF3, + 0x0D, 0xBF, 0x94, 0x3F, 0x8C, 0xAB, 0xC4, 0x08, + 0x44, 0x96, 0x54, 0xA3, 0x91, 0x31, 0xE6, 0x6D, + 0x71, 0x8A, 0x18, 0x81, 0x91, 0x43, 0xE3, 0xEA, + 0x96, 0xB4, 0xA1, 0x89, 0x59, 0x88, 0xA1, 0xC0, + 0x05, 0x6C, 0xF2, 0xB6, 0xE0, 0x4F, 0x9A, 0xC1, + 0x9D, 0x65, 0x73, 0x83, 0xC2, 0x91, 0x0C, 0x44 + }, + { + 0x44, 0x7B, 0xEC, 0xAB, 0x16, 0x63, 0x06, 0x08, + 0xD3, 0x9F, 0x4F, 0x05, 0x8B, 0x16, 0xF7, 0xAF, + 0x95, 0xB8, 0x5A, 0x76, 0xAA, 0x0F, 0xA7, 0xCE, + 0xA2, 0xB8, 0x07, 0x55, 0xFB, 0x76, 0xE9, 0xC8, + 0x04, 0xF2, 0xCA, 0x78, 0xF0, 0x26, 0x43, 0xC9, + 0x15, 0xFB, 0xF2, 0xFC, 0xE5, 0xE1, 0x9D, 0xE8, + 0x60, 0x00, 0xDE, 0x03, 0xB1, 0x88, 0x61, 0x81, + 0x5A, 0x83, 0x12, 0x60, 0x71, 0xF8, 0xA3, 0x7B + }, + { + 0x54, 0xE6, 0xDA, 0xB9, 0x97, 0x73, 0x80, 0xA5, + 0x66, 0x58, 0x22, 0xDB, 0x93, 0x37, 0x4E, 0xDA, + 0x52, 0x8D, 0x9B, 0xEB, 0x62, 0x6F, 0x9B, 0x94, + 0x02, 0x70, 0x71, 0xCB, 0x26, 0x67, 0x5E, 0x11, + 0x2B, 0x4A, 0x7F, 0xEC, 0x94, 0x1E, 0xE6, 0x0A, + 0x81, 0xE4, 0xD2, 0xEA, 0x3F, 0xF7, 0xBC, 0x52, + 0xCF, 0xC4, 0x5D, 0xFB, 0xFE, 0x73, 0x5A, 0x1C, + 0x64, 0x6B, 0x2C, 0xF6, 0xD6, 0xA4, 0x9B, 0x62 + }, + { + 0x3E, 0xA6, 0x26, 0x25, 0x94, 0x9E, 0x36, 0x46, + 0x70, 0x4D, 0x7E, 0x3C, 0x90, 0x6F, 0x82, 0xF6, + 0xC0, 0x28, 0xF5, 0x40, 0xF5, 0xF7, 0x2A, 0x79, + 0x4B, 0x0C, 0x57, 0xBF, 0x97, 0xB7, 0x64, 0x9B, + 0xFE, 0xB9, 0x0B, 0x01, 0xD3, 0xCA, 0x3E, 0x82, + 0x9D, 0xE2, 0x1B, 0x38, 0x26, 0xE6, 0xF8, 0x70, + 0x14, 0xD3, 0xC7, 0x73, 0x50, 0xCB, 0x5A, 0x15, + 0xFF, 0x5D, 0x46, 0x8A, 0x81, 0xBE, 0xC1, 0x60 + }, + { + 0x21, 0x3C, 0xFE, 0x14, 0x5C, 0x54, 0xA3, 0x36, + 0x91, 0x56, 0x99, 0x80, 0xE5, 0x93, 0x8C, 0x88, + 0x83, 0xA4, 0x6D, 0x84, 0xD1, 0x49, 0xC8, 0xFF, + 0x1A, 0x67, 0xCD, 0x28, 0x7B, 0x4D, 0x49, 0xC6, + 0xDA, 0x69, 0xD3, 0xA0, 0x35, 0x44, 0x3D, 0xB0, + 0x85, 0x98, 0x3D, 0x0E, 0xFE, 0x63, 0x70, 0x6B, + 0xD5, 0xB6, 0xF1, 0x5A, 0x7D, 0xA4, 0x59, 0xE8, + 0xD5, 0x0A, 0x19, 0x09, 0x3D, 0xB5, 0x5E, 0x80 + }, + { + 0x57, 0x16, 0xC4, 0xA3, 0x8F, 0x38, 0xDB, 0x10, + 0x4E, 0x49, 0x4A, 0x0A, 0x27, 0xCB, 0xE8, 0x9A, + 0x26, 0xA6, 0xBB, 0x6F, 0x49, 0x9E, 0xC0, 0x1C, + 0x8C, 0x01, 0xAA, 0x7C, 0xB8, 0x84, 0x97, 0xE7, + 0x51, 0x48, 0xCD, 0x6E, 0xEE, 0x12, 0xA7, 0x16, + 0x8B, 0x6F, 0x78, 0xAB, 0x74, 0xE4, 0xBE, 0x74, + 0x92, 0x51, 0xA1, 0xA7, 0x4C, 0x38, 0xC8, 0x6D, + 0x61, 0x29, 0x17, 0x7E, 0x28, 0x89, 0xE0, 0xB6 + }, + { + 0x03, 0x04, 0x60, 0xA9, 0x8B, 0xDF, 0x9F, 0xF1, + 0x7C, 0xD9, 0x64, 0x04, 0xF2, 0x8F, 0xC3, 0x04, + 0xF2, 0xB7, 0xC0, 0x4E, 0xAA, 0xDE, 0x53, 0x67, + 0x7F, 0xD2, 0x8F, 0x78, 0x8C, 0xA2, 0x21, 0x86, + 0xB8, 0xBC, 0x80, 0xDD, 0x21, 0xD1, 0x7F, 0x85, + 0x49, 0xC7, 0x11, 0xAF, 0xF0, 0xE5, 0x14, 0xE1, + 0x9D, 0x4E, 0x15, 0xF5, 0x99, 0x02, 0x52, 0xA0, + 0x3E, 0x08, 0x2F, 0x28, 0xDC, 0x20, 0x52, 0xF6 + }, + { + 0x19, 0xE7, 0xF1, 0xCC, 0xEE, 0x88, 0xA1, 0x06, + 0x72, 0x33, 0x3E, 0x39, 0x0C, 0xF2, 0x20, 0x13, + 0xA8, 0xC7, 0x34, 0xC6, 0xCB, 0x9E, 0xAB, 0x41, + 0xF1, 0x7C, 0x3C, 0x80, 0x32, 0xA2, 0xE4, 0xAC, + 0xA0, 0x56, 0x9E, 0xA3, 0x6F, 0x08, 0x60, 0xC7, + 0xA1, 0xAF, 0x28, 0xFA, 0x47, 0x68, 0x40, 0xD6, + 0x60, 0x11, 0x16, 0x88, 0x59, 0x33, 0x4A, 0x9E, + 0x4E, 0xF9, 0xCC, 0x2E, 0x61, 0xA0, 0xE2, 0x9E + }, + { + 0x29, 0xF8, 0xB8, 0xC7, 0x8C, 0x80, 0xF2, 0xFC, + 0xB4, 0xBD, 0xF7, 0x82, 0x5E, 0xD9, 0x0A, 0x70, + 0xD6, 0x25, 0xFF, 0x78, 0x5D, 0x26, 0x26, 0x77, + 0xE2, 0x50, 0xC0, 0x4F, 0x37, 0x20, 0xC8, 0x88, + 0xD0, 0x3F, 0x80, 0x45, 0xE4, 0xED, 0xF3, 0xF5, + 0x28, 0x5B, 0xD3, 0x9D, 0x92, 0x8A, 0x10, 0xA7, + 0xD0, 0xA5, 0xDF, 0x00, 0xB8, 0x48, 0x4A, 0xC2, + 0x86, 0x81, 0x42, 0xA1, 0xE8, 0xBE, 0xA3, 0x51 + }, + { + 0x5C, 0x52, 0x92, 0x0A, 0x72, 0x63, 0xE3, 0x9D, + 0x57, 0x92, 0x0C, 0xA0, 0xCB, 0x75, 0x2A, 0xC6, + 0xD7, 0x9A, 0x04, 0xFE, 0xF8, 0xA7, 0xA2, 0x16, + 0xA1, 0xEC, 0xB7, 0x11, 0x5C, 0xE0, 0x6D, 0x89, + 0xFD, 0x7D, 0x73, 0x5B, 0xD6, 0xF4, 0x27, 0x25, + 0x55, 0xDB, 0xA2, 0x2C, 0x2D, 0x1C, 0x96, 0xE6, + 0x35, 0x23, 0x22, 0xC6, 0x2C, 0x56, 0x30, 0xFD, + 0xE0, 0xF4, 0x77, 0x7A, 0x76, 0xC3, 0xDE, 0x2C + }, + { + 0x83, 0xB0, 0x98, 0xF2, 0x62, 0x25, 0x1B, 0xF6, + 0x60, 0x06, 0x4A, 0x9D, 0x35, 0x11, 0xCE, 0x76, + 0x87, 0xA0, 0x9E, 0x6D, 0xFB, 0xB8, 0x78, 0x29, + 0x9C, 0x30, 0xE9, 0x3D, 0xFB, 0x43, 0xA9, 0x31, + 0x4D, 0xB9, 0xA6, 0x00, 0x33, 0x7D, 0xB2, 0x6E, + 0xBE, 0xED, 0xAF, 0x22, 0x56, 0xA9, 0x6D, 0xAB, + 0xE9, 0xB2, 0x9E, 0x75, 0x73, 0xAD, 0x11, 0xC3, + 0x52, 0x3D, 0x87, 0x4D, 0xDE, 0x5B, 0xE7, 0xED + }, + { + 0x94, 0x47, 0xD9, 0x8A, 0xA5, 0xC9, 0x33, 0x13, + 0x52, 0xF4, 0x3D, 0x3E, 0x56, 0xD0, 0xA9, 0xA9, + 0xF9, 0x58, 0x18, 0x65, 0x99, 0x8E, 0x28, 0x85, + 0xCC, 0x56, 0xDD, 0x0A, 0x0B, 0xD5, 0xA7, 0xB5, + 0x05, 0x95, 0xBD, 0x10, 0xF7, 0x52, 0x9B, 0xCD, + 0x31, 0xF3, 0x7D, 0xC1, 0x6A, 0x14, 0x65, 0xD5, + 0x94, 0x07, 0x96, 0x67, 0xDA, 0x2A, 0x3F, 0xCB, + 0x70, 0x40, 0x14, 0x98, 0x83, 0x7C, 0xED, 0xEB + }, + { + 0x86, 0x77, 0x32, 0xF2, 0xFE, 0xEB, 0x23, 0x89, + 0x30, 0x97, 0x56, 0x1A, 0xC7, 0x10, 0xA4, 0xBF, + 0xF4, 0x53, 0xBE, 0x9C, 0xFB, 0xED, 0xBA, 0x8B, + 0xA3, 0x24, 0xF9, 0xD3, 0x12, 0xA8, 0x2D, 0x73, + 0x2E, 0x1B, 0x83, 0xB8, 0x29, 0xFD, 0xCD, 0x17, + 0x7B, 0x88, 0x2C, 0xA0, 0xC1, 0xBF, 0x54, 0x4B, + 0x22, 0x3B, 0xE5, 0x29, 0x92, 0x4A, 0x24, 0x6A, + 0x63, 0xCF, 0x05, 0x9B, 0xFD, 0xC5, 0x0A, 0x1B + }, + { + 0xF1, 0x5A, 0xB2, 0x6D, 0x4C, 0xDF, 0xCF, 0x56, + 0xE1, 0x96, 0xBB, 0x6B, 0xA1, 0x70, 0xA8, 0xFC, + 0xCC, 0x41, 0x4D, 0xE9, 0x28, 0x5A, 0xFD, 0x98, + 0xA3, 0xD3, 0xCF, 0x2F, 0xB8, 0x8F, 0xCB, 0xC0, + 0xF1, 0x98, 0x32, 0xAC, 0x43, 0x3A, 0x5B, 0x2C, + 0xC2, 0x39, 0x2A, 0x4C, 0xE3, 0x43, 0x32, 0x98, + 0x7D, 0x8D, 0x2C, 0x2B, 0xEF, 0x6C, 0x34, 0x66, + 0x13, 0x8D, 0xB0, 0xC6, 0xE4, 0x2F, 0xA4, 0x7B + }, + { + 0x28, 0x13, 0x51, 0x6D, 0x68, 0xED, 0x4A, 0x08, + 0xB3, 0x9D, 0x64, 0x8A, 0xA6, 0xAA, 0xCD, 0x81, + 0xE9, 0xD6, 0x55, 0xEC, 0xD5, 0xF0, 0xC1, 0x35, + 0x56, 0xC6, 0x0F, 0xDF, 0x0D, 0x33, 0x3E, 0xA3, + 0x84, 0x64, 0xB3, 0x6C, 0x02, 0xBA, 0xCC, 0xD7, + 0x46, 0xE9, 0x57, 0x5E, 0x96, 0xC6, 0x30, 0x14, + 0xF0, 0x74, 0xAE, 0x34, 0xA0, 0xA2, 0x5B, 0x32, + 0x0F, 0x0F, 0xBE, 0xDD, 0x6A, 0xCF, 0x76, 0x65 + }, + { + 0xD3, 0x25, 0x9A, 0xFC, 0xA8, 0xA4, 0x89, 0x62, + 0xFA, 0x89, 0x2E, 0x14, 0x5A, 0xCF, 0x54, 0x7F, + 0x26, 0x92, 0x3A, 0xE8, 0xD4, 0x92, 0x4C, 0x8A, + 0x53, 0x15, 0x81, 0x52, 0x6B, 0x04, 0xB4, 0x4C, + 0x7A, 0xF8, 0x3C, 0x64, 0x3E, 0xF5, 0xA0, 0xBC, + 0x28, 0x2D, 0x36, 0xF3, 0xFB, 0x04, 0xC8, 0x4E, + 0x28, 0xB3, 0x51, 0xF4, 0x0C, 0x74, 0xB6, 0x9D, + 0xC7, 0x84, 0x0B, 0xC7, 0x17, 0xB6, 0xF1, 0x5F + }, + { + 0xF1, 0x4B, 0x06, 0x1A, 0xE3, 0x59, 0xFA, 0x31, + 0xB9, 0x89, 0xE3, 0x03, 0x32, 0xBF, 0xE8, 0xDE, + 0x8C, 0xC8, 0xCD, 0xB5, 0x68, 0xE1, 0x4B, 0xE2, + 0x14, 0xA2, 0x22, 0x3B, 0x84, 0xCA, 0xAB, 0x74, + 0x19, 0x54, 0x9E, 0xCF, 0xCC, 0x96, 0xCE, 0x2A, + 0xCE, 0xC1, 0x19, 0x48, 0x5D, 0x87, 0xD1, 0x57, + 0xD3, 0xA8, 0x73, 0x4F, 0xC4, 0x26, 0x59, 0x7D, + 0x64, 0xF3, 0x65, 0x70, 0xCE, 0xAF, 0x22, 0x4D + }, + { + 0x55, 0xE7, 0x0B, 0x01, 0xD1, 0xFB, 0xF8, 0xB2, + 0x3B, 0x57, 0xFB, 0x62, 0xE2, 0x6C, 0x2C, 0xE5, + 0x4F, 0x13, 0xF8, 0xFA, 0x24, 0x64, 0xE6, 0xEB, + 0x98, 0xD1, 0x6A, 0x61, 0x17, 0x02, 0x6D, 0x8B, + 0x90, 0x81, 0x90, 0x12, 0x49, 0x6D, 0x40, 0x71, + 0xEB, 0xE2, 0xE5, 0x95, 0x57, 0xEC, 0xE3, 0x51, + 0x9A, 0x7A, 0xA4, 0x58, 0x02, 0xF9, 0x61, 0x53, + 0x74, 0x87, 0x73, 0x32, 0xB7, 0x34, 0x90, 0xB3 + }, + { + 0x25, 0x26, 0x1E, 0xB2, 0x96, 0x97, 0x1D, 0x6E, + 0x4A, 0x71, 0xB2, 0x92, 0x8E, 0x64, 0x83, 0x9C, + 0x67, 0xD4, 0x22, 0x87, 0x2B, 0xF9, 0xF3, 0xC3, + 0x19, 0x93, 0x61, 0x52, 0x22, 0xDE, 0x9F, 0x8F, + 0x0B, 0x2C, 0x4B, 0xE8, 0x54, 0x85, 0x59, 0xB4, + 0xB3, 0x54, 0xE7, 0x36, 0x41, 0x6E, 0x32, 0x18, + 0xD4, 0xE8, 0xA1, 0xE2, 0x19, 0xA4, 0xA6, 0xD4, + 0x3E, 0x1A, 0x9A, 0x52, 0x1D, 0x0E, 0x75, 0xFC + }, + { + 0x08, 0x30, 0x7F, 0x34, 0x7C, 0x41, 0x29, 0x4E, + 0x34, 0xBB, 0x54, 0xCB, 0x42, 0xB1, 0x52, 0x2D, + 0x22, 0xF8, 0x24, 0xF7, 0xB6, 0xE5, 0xDB, 0x50, + 0xFD, 0xA0, 0x96, 0x79, 0x8E, 0x18, 0x1A, 0x8F, + 0x02, 0x6F, 0xA2, 0x7B, 0x4A, 0xE4, 0x5D, 0x52, + 0xA6, 0x2C, 0xAF, 0x9D, 0x51, 0x98, 0xE2, 0x4A, + 0x49, 0x13, 0xC6, 0x67, 0x17, 0x75, 0xB2, 0xD7, + 0x23, 0xC1, 0x23, 0x9B, 0xFB, 0xF0, 0x16, 0xD7 + }, + { + 0x1E, 0x5C, 0x62, 0xE7, 0xE9, 0xBF, 0xA1, 0xB1, + 0x18, 0x74, 0x7A, 0x2D, 0xE0, 0x8B, 0x3C, 0xA1, + 0x01, 0x12, 0xAF, 0x96, 0xA4, 0x6E, 0x4B, 0x22, + 0xC3, 0xFC, 0x06, 0xF9, 0xBF, 0xEE, 0x4E, 0xB5, + 0xC4, 0x9E, 0x05, 0x7A, 0x4A, 0x48, 0x86, 0x23, + 0x43, 0x24, 0x57, 0x25, 0x76, 0xBB, 0x9B, 0x5E, + 0xCF, 0xDE, 0x0D, 0x99, 0xB0, 0xDE, 0x4F, 0x98, + 0xEC, 0x16, 0xE4, 0xD1, 0xB8, 0x5F, 0xA9, 0x47 + }, + { + 0xC7, 0x4A, 0x77, 0x39, 0x5F, 0xB8, 0xBC, 0x12, + 0x64, 0x47, 0x45, 0x48, 0x38, 0xE5, 0x61, 0xE9, + 0x62, 0x85, 0x3D, 0xC7, 0xEB, 0x49, 0xA1, 0xE3, + 0xCB, 0x67, 0xC3, 0xD0, 0x85, 0x1F, 0x3E, 0x39, + 0x51, 0x7B, 0xE8, 0xC3, 0x50, 0xAC, 0x91, 0x09, + 0x03, 0xD4, 0x9C, 0xD2, 0xBF, 0xDF, 0x54, 0x5C, + 0x99, 0x31, 0x6D, 0x03, 0x46, 0x17, 0x0B, 0x73, + 0x9F, 0x0A, 0xDD, 0x5D, 0x53, 0x3C, 0x2C, 0xFC + }, + { + 0x0D, 0xD5, 0x7B, 0x42, 0x3C, 0xC0, 0x1E, 0xB2, + 0x86, 0x13, 0x91, 0xEB, 0x88, 0x6A, 0x0D, 0x17, + 0x07, 0x9B, 0x93, 0x3F, 0xC7, 0x6E, 0xB3, 0xFC, + 0x08, 0xA1, 0x9F, 0x8A, 0x74, 0x95, 0x2C, 0xB6, + 0x8F, 0x6B, 0xCD, 0xC6, 0x44, 0xF7, 0x73, 0x70, + 0x96, 0x6E, 0x4D, 0x13, 0xE8, 0x05, 0x60, 0xBC, + 0xF0, 0x82, 0xEF, 0x04, 0x79, 0xD4, 0x8F, 0xBB, + 0xAB, 0x4D, 0xF0, 0x3B, 0x53, 0xA4, 0xE1, 0x78 + }, + { + 0x4D, 0x8D, 0xC3, 0x92, 0x3E, 0xDC, 0xCD, 0xFC, + 0xE7, 0x00, 0x72, 0x39, 0x8B, 0x8A, 0x3D, 0xA5, + 0xC3, 0x1F, 0xCB, 0x3E, 0xE3, 0xB6, 0x45, 0xC8, + 0x5F, 0x71, 0x7C, 0xBA, 0xEB, 0x4B, 0x67, 0x3A, + 0x19, 0x39, 0x44, 0x25, 0xA5, 0x85, 0xBF, 0xB4, + 0x64, 0xD9, 0x2F, 0x15, 0x97, 0xD0, 0xB7, 0x54, + 0xD1, 0x63, 0xF9, 0x7C, 0xED, 0x34, 0x3B, 0x25, + 0xDB, 0x5A, 0x70, 0xEF, 0x48, 0xEB, 0xB3, 0x4F + }, + { + 0xF0, 0xA5, 0x05, 0x53, 0xE4, 0xDF, 0xB0, 0xC4, + 0xE3, 0xE3, 0xD3, 0xBA, 0x82, 0x03, 0x48, 0x57, + 0xE3, 0xB1, 0xE5, 0x09, 0x18, 0xF5, 0xB8, 0xA7, + 0xD6, 0x98, 0xE1, 0x0D, 0x24, 0x2B, 0x0F, 0xB5, + 0x44, 0xAF, 0x6C, 0x92, 0xD0, 0xC3, 0xAA, 0xF9, + 0x93, 0x22, 0x20, 0x41, 0x61, 0x17, 0xB4, 0xE7, + 0x8E, 0xCB, 0x8A, 0x8F, 0x43, 0x0E, 0x13, 0xB8, + 0x2A, 0x59, 0x15, 0x29, 0x0A, 0x58, 0x19, 0xC5 + }, + { + 0xB1, 0x55, 0x43, 0xF3, 0xF7, 0x36, 0x08, 0x66, + 0x27, 0xCC, 0x53, 0x65, 0xE7, 0xE8, 0x98, 0x8C, + 0x2E, 0xF1, 0x55, 0xC0, 0xFD, 0x4F, 0x42, 0x89, + 0x61, 0xB0, 0x0D, 0x15, 0x26, 0xF0, 0x4D, 0x6D, + 0x6A, 0x65, 0x8B, 0x4B, 0x8E, 0xD3, 0x2C, 0x5D, + 0x86, 0x21, 0xE7, 0xF4, 0xF8, 0xE8, 0xA9, 0x33, + 0xD9, 0xEC, 0xC9, 0xDD, 0x1B, 0x83, 0x33, 0xCB, + 0xE2, 0x8C, 0xFC, 0x37, 0xD9, 0x71, 0x9E, 0x1C + }, + { + 0x7B, 0x4F, 0xA1, 0x58, 0xE4, 0x15, 0xFE, 0xF0, + 0x23, 0x24, 0x72, 0x64, 0xCB, 0xBE, 0x15, 0xD1, + 0x6D, 0x91, 0xA4, 0x44, 0x24, 0xA8, 0xDB, 0x70, + 0x7E, 0xB1, 0xE2, 0x03, 0x3C, 0x30, 0xE9, 0xE1, + 0xE7, 0xC8, 0xC0, 0x86, 0x45, 0x95, 0xD2, 0xCB, + 0x8C, 0x58, 0x0E, 0xB4, 0x7E, 0x9D, 0x16, 0xAB, + 0xBD, 0x7E, 0x44, 0xE8, 0x24, 0xF7, 0xCE, 0xDB, + 0x7D, 0xEF, 0x57, 0x13, 0x0E, 0x52, 0xCF, 0xE9 + }, + { + 0x60, 0x42, 0x4F, 0xF2, 0x32, 0x34, 0xC3, 0x4D, + 0xC9, 0x68, 0x7A, 0xD5, 0x02, 0x86, 0x93, 0x72, + 0xCC, 0x31, 0xA5, 0x93, 0x80, 0x18, 0x6B, 0xC2, + 0x36, 0x1C, 0x83, 0x5D, 0x97, 0x2F, 0x49, 0x66, + 0x6E, 0xB1, 0xAC, 0x69, 0x62, 0x9D, 0xE6, 0x46, + 0xF0, 0x3F, 0x9B, 0x4D, 0xB9, 0xE2, 0xAC, 0xE0, + 0x93, 0xFB, 0xFD, 0xF8, 0xF2, 0x0A, 0xB5, 0xF9, + 0x85, 0x41, 0x97, 0x8B, 0xE8, 0xEF, 0x54, 0x9F + }, + { + 0x74, 0x06, 0x01, 0x8C, 0xE7, 0x04, 0xD8, 0x4F, + 0x5E, 0xB9, 0xC7, 0x9F, 0xEA, 0x97, 0xDA, 0x34, + 0x56, 0x99, 0x46, 0x8A, 0x35, 0x0E, 0xE0, 0xB2, + 0xD0, 0xF3, 0xA4, 0xBF, 0x20, 0x70, 0x30, 0x4E, + 0xA8, 0x62, 0xD7, 0x2A, 0x51, 0xC5, 0x7D, 0x30, + 0x64, 0x94, 0x72, 0x86, 0xF5, 0x31, 0xE0, 0xEA, + 0xF7, 0x56, 0x37, 0x02, 0x26, 0x2E, 0x6C, 0x72, + 0x4A, 0xBF, 0x5E, 0xD8, 0xC8, 0x39, 0x8D, 0x17 + }, + { + 0x14, 0xEF, 0x5C, 0x6D, 0x64, 0x7B, 0x3B, 0xD1, + 0xE6, 0xE3, 0x20, 0x06, 0xC2, 0x31, 0x19, 0x98, + 0x10, 0xDE, 0x5C, 0x4D, 0xC8, 0x8E, 0x70, 0x24, + 0x02, 0x73, 0xB0, 0xEA, 0x18, 0xE6, 0x51, 0xA3, + 0xEB, 0x4F, 0x5C, 0xA3, 0x11, 0x4B, 0x8A, 0x56, + 0x71, 0x69, 0x69, 0xC7, 0xCD, 0xA2, 0x7E, 0x0C, + 0x8D, 0xB8, 0x32, 0xAD, 0x5E, 0x89, 0xA2, 0xDC, + 0x6C, 0xB0, 0xAD, 0xBE, 0x7D, 0x93, 0xAB, 0xD1 + }, + { + 0x38, 0xCF, 0x6C, 0x24, 0xE3, 0xE0, 0x8B, 0xCF, + 0x1F, 0x6C, 0xF3, 0xD1, 0xB1, 0xF6, 0x5B, 0x90, + 0x52, 0x39, 0xA3, 0x11, 0x80, 0x33, 0x24, 0x9E, + 0x44, 0x81, 0x13, 0xEC, 0x63, 0x2E, 0xA6, 0xDC, + 0x34, 0x6F, 0xEE, 0xB2, 0x57, 0x1C, 0x38, 0xBD, + 0x9A, 0x73, 0x98, 0xB2, 0x22, 0x12, 0x80, 0x32, + 0x80, 0x02, 0xB2, 0x3E, 0x1A, 0x45, 0xAD, 0xAF, + 0xFE, 0x66, 0xD9, 0x3F, 0x65, 0x64, 0xEA, 0xA2 + }, + { + 0x6C, 0xD7, 0x20, 0x8A, 0x4B, 0xC7, 0xE7, 0xE5, + 0x62, 0x01, 0xBB, 0xBA, 0x02, 0xA0, 0xF4, 0x89, + 0xCD, 0x38, 0x4A, 0xBE, 0x40, 0xAF, 0xD4, 0x22, + 0x2F, 0x15, 0x8B, 0x3D, 0x98, 0x6E, 0xE7, 0x2A, + 0x54, 0xC5, 0x0F, 0xB6, 0x4F, 0xD4, 0xED, 0x25, + 0x30, 0xED, 0xA2, 0xC8, 0xAF, 0x29, 0x28, 0xA0, + 0xDA, 0x6D, 0x4F, 0x83, 0x0A, 0xE1, 0xC9, 0xDB, + 0x46, 0x9D, 0xFD, 0x97, 0x0F, 0x12, 0xA5, 0x6F + }, + { + 0x65, 0x98, 0x58, 0xF0, 0xB5, 0xC9, 0xED, 0xAB, + 0x5B, 0x94, 0xFD, 0x73, 0x2F, 0x6E, 0x6B, 0x17, + 0xC5, 0x1C, 0xC0, 0x96, 0x10, 0x4F, 0x09, 0xBE, + 0xB3, 0xAF, 0xC3, 0xAA, 0x46, 0x7C, 0x2E, 0xCF, + 0x88, 0x5C, 0x4C, 0x65, 0x41, 0xEF, 0xFA, 0x90, + 0x23, 0xD3, 0xB5, 0x73, 0x8A, 0xE5, 0xA1, 0x4D, + 0x86, 0x7E, 0x15, 0xDB, 0x06, 0xFE, 0x1F, 0x9D, + 0x11, 0x27, 0xB7, 0x7E, 0x1A, 0xAB, 0xB5, 0x16 + }, + { + 0x26, 0xCC, 0xA0, 0x12, 0x6F, 0x5D, 0x1A, 0x81, + 0x3C, 0x62, 0xE5, 0xC7, 0x10, 0x01, 0xC0, 0x46, + 0xF9, 0xC9, 0x20, 0x95, 0x70, 0x45, 0x50, 0xBE, + 0x58, 0x73, 0xA4, 0x95, 0xA9, 0x99, 0xAD, 0x01, + 0x0A, 0x4F, 0x79, 0x49, 0x1F, 0x24, 0xF2, 0x86, + 0x50, 0x0A, 0xDC, 0xE1, 0xA1, 0x37, 0xBC, 0x20, + 0x84, 0xE4, 0x94, 0x9F, 0x5B, 0x72, 0x94, 0xCE, + 0xFE, 0x51, 0xEC, 0xAF, 0xF8, 0xE9, 0x5C, 0xBA + }, + { + 0x41, 0x47, 0xC1, 0xF5, 0x51, 0x72, 0x78, 0x8C, + 0x55, 0x67, 0xC5, 0x61, 0xFE, 0xEF, 0x87, 0x6F, + 0x62, 0x1F, 0xFF, 0x1C, 0xE8, 0x77, 0x86, 0xB8, + 0x46, 0x76, 0x37, 0xE7, 0x0D, 0xFB, 0xCD, 0x0D, + 0xBD, 0xB6, 0x41, 0x5C, 0xB6, 0x00, 0x95, 0x4A, + 0xB9, 0xC0, 0x4C, 0x0E, 0x45, 0x7E, 0x62, 0x5B, + 0x40, 0x72, 0x22, 0xC0, 0xFE, 0x1A, 0xE2, 0x1B, + 0x21, 0x43, 0x68, 0x8A, 0xDA, 0x94, 0xDC, 0x58 + }, + { + 0x5B, 0x1B, 0xF1, 0x54, 0xC6, 0x2A, 0x8A, 0xF6, + 0xE9, 0x3D, 0x35, 0xF1, 0x8F, 0x7F, 0x90, 0xAB, + 0xB1, 0x6A, 0x6E, 0xF0, 0xE8, 0xD1, 0xAE, 0xCD, + 0x11, 0x8B, 0xF7, 0x01, 0x67, 0xBA, 0xB2, 0xAF, + 0x08, 0x93, 0x5C, 0x6F, 0xDC, 0x06, 0x63, 0xCE, + 0x74, 0x48, 0x2D, 0x17, 0xA8, 0xE5, 0x4B, 0x54, + 0x6D, 0x1C, 0x29, 0x66, 0x31, 0xC6, 0x5F, 0x3B, + 0x52, 0x2A, 0x51, 0x58, 0x39, 0xD4, 0x3D, 0x71 + }, + { + 0x9F, 0x60, 0x04, 0x19, 0xA4, 0xE8, 0xF4, 0xFB, + 0x83, 0x4C, 0x24, 0xB0, 0xF7, 0xFC, 0x13, 0xBF, + 0x4E, 0x27, 0x9D, 0x98, 0xE8, 0xA3, 0xC7, 0x65, + 0xEE, 0x93, 0x49, 0x17, 0x40, 0x3E, 0x3A, 0x66, + 0x09, 0x71, 0x82, 0xEA, 0x21, 0x45, 0x3C, 0xB6, + 0x3E, 0xBB, 0xE8, 0xB7, 0x3A, 0x9C, 0x21, 0x67, + 0x59, 0x64, 0x46, 0x43, 0x8C, 0x57, 0x62, 0x7F, + 0x33, 0x0B, 0xAD, 0xD4, 0xF5, 0x69, 0xF7, 0xD6 + }, + { + 0x45, 0x7E, 0xF6, 0x46, 0x6A, 0x89, 0x24, 0xFD, + 0x80, 0x11, 0xA3, 0x44, 0x71, 0xA5, 0xA1, 0xAC, + 0x8C, 0xCD, 0x9B, 0xD0, 0xD0, 0x7A, 0x97, 0x41, + 0x4A, 0xC9, 0x43, 0x02, 0x1C, 0xE4, 0xB9, 0xE4, + 0xB9, 0xC8, 0xDB, 0x0A, 0x28, 0xF0, 0x16, 0xED, + 0x43, 0xB1, 0x54, 0x24, 0x81, 0x99, 0x00, 0x22, + 0x14, 0x7B, 0x31, 0x3E, 0x19, 0x46, 0x71, 0x13, + 0x1E, 0x70, 0x8D, 0xD4, 0x3A, 0x3E, 0xD7, 0xDC + }, + { + 0x99, 0x97, 0xB2, 0x19, 0x4D, 0x9A, 0xF6, 0xDF, + 0xCB, 0x91, 0x43, 0xF4, 0x1C, 0x0E, 0xD8, 0x3D, + 0x3A, 0x3F, 0x43, 0x88, 0x36, 0x11, 0x03, 0xD3, + 0x8C, 0x2A, 0x49, 0xB2, 0x80, 0xA5, 0x81, 0x21, + 0x27, 0x15, 0xFD, 0x90, 0x8D, 0x41, 0xC6, 0x51, + 0xF5, 0xC7, 0x15, 0xCA, 0x38, 0xC0, 0xCE, 0x28, + 0x30, 0xA3, 0x7E, 0x00, 0xE5, 0x08, 0xCE, 0xD1, + 0xBC, 0xDC, 0x32, 0x0E, 0x5E, 0x4D, 0x1E, 0x2E + }, + { + 0x5C, 0x6B, 0xBF, 0x16, 0xBA, 0xA1, 0x80, 0xF9, + 0x86, 0xBD, 0x40, 0xA1, 0x28, 0x7E, 0xD4, 0xC5, + 0x49, 0x77, 0x0E, 0x72, 0x84, 0x85, 0x8F, 0xC4, + 0x7B, 0xC2, 0x1A, 0xB9, 0x5E, 0xBB, 0xF3, 0x37, + 0x4B, 0x4E, 0xE3, 0xFD, 0x9F, 0x2A, 0xF6, 0x0F, + 0x33, 0x95, 0x22, 0x1B, 0x2A, 0xCC, 0x76, 0xF2, + 0xD3, 0x4C, 0x13, 0x29, 0x54, 0x04, 0x9F, 0x8A, + 0x3A, 0x99, 0x6F, 0x1E, 0x32, 0xEC, 0x84, 0xE5 + }, + { + 0xD1, 0x0B, 0xF9, 0xA1, 0x5B, 0x1C, 0x9F, 0xC8, + 0xD4, 0x1F, 0x89, 0xBB, 0x14, 0x0B, 0xF0, 0xBE, + 0x08, 0xD2, 0xF3, 0x66, 0x61, 0x76, 0xD1, 0x3B, + 0xAA, 0xC4, 0xD3, 0x81, 0x35, 0x8A, 0xD0, 0x74, + 0xC9, 0xD4, 0x74, 0x8C, 0x30, 0x05, 0x20, 0xEB, + 0x02, 0x6D, 0xAE, 0xAE, 0xA7, 0xC5, 0xB1, 0x58, + 0x89, 0x2F, 0xDE, 0x4E, 0x8E, 0xC1, 0x7D, 0xC9, + 0x98, 0xDC, 0xD5, 0x07, 0xDF, 0x26, 0xEB, 0x63 + }, + { + 0x2F, 0xC6, 0xE6, 0x9F, 0xA2, 0x6A, 0x89, 0xA5, + 0xED, 0x26, 0x90, 0x92, 0xCB, 0x9B, 0x2A, 0x44, + 0x9A, 0x44, 0x09, 0xA7, 0xA4, 0x40, 0x11, 0xEE, + 0xCA, 0xD1, 0x3D, 0x7C, 0x4B, 0x04, 0x56, 0x60, + 0x2D, 0x40, 0x2F, 0xA5, 0x84, 0x4F, 0x1A, 0x7A, + 0x75, 0x81, 0x36, 0xCE, 0x3D, 0x5D, 0x8D, 0x0E, + 0x8B, 0x86, 0x92, 0x1F, 0xFF, 0xF4, 0xF6, 0x92, + 0xDD, 0x95, 0xBD, 0xC8, 0xE5, 0xFF, 0x00, 0x52 + }, + { + 0xFC, 0xBE, 0x8B, 0xE7, 0xDC, 0xB4, 0x9A, 0x32, + 0xDB, 0xDF, 0x23, 0x94, 0x59, 0xE2, 0x63, 0x08, + 0xB8, 0x4D, 0xFF, 0x1E, 0xA4, 0x80, 0xDF, 0x8D, + 0x10, 0x4E, 0xEF, 0xF3, 0x4B, 0x46, 0xFA, 0xE9, + 0x86, 0x27, 0xB4, 0x50, 0xC2, 0x26, 0x7D, 0x48, + 0xC0, 0x94, 0x6A, 0x69, 0x7C, 0x5B, 0x59, 0x53, + 0x14, 0x52, 0xAC, 0x04, 0x84, 0xF1, 0xC8, 0x4E, + 0x3A, 0x33, 0xD0, 0xC3, 0x39, 0xBB, 0x2E, 0x28 + }, + { + 0xA1, 0x90, 0x93, 0xA6, 0xE3, 0xBC, 0xF5, 0x95, + 0x2F, 0x85, 0x0F, 0x20, 0x30, 0xF6, 0x9B, 0x96, + 0x06, 0xF1, 0x47, 0xF9, 0x0B, 0x8B, 0xAE, 0xE3, + 0x36, 0x2D, 0xA7, 0x1D, 0x9F, 0x35, 0xB4, 0x4E, + 0xF9, 0xD8, 0xF0, 0xA7, 0x71, 0x2B, 0xA1, 0x87, + 0x7F, 0xDD, 0xCD, 0x2D, 0x8E, 0xA8, 0xF1, 0xE5, + 0xA7, 0x73, 0xD0, 0xB7, 0x45, 0xD4, 0x72, 0x56, + 0x05, 0x98, 0x3A, 0x2D, 0xE9, 0x01, 0xF8, 0x03 + }, + { + 0x3C, 0x20, 0x06, 0x42, 0x3F, 0x73, 0xE2, 0x68, + 0xFA, 0x59, 0xD2, 0x92, 0x03, 0x77, 0xEB, 0x29, + 0xA4, 0xF9, 0xA8, 0xB4, 0x62, 0xBE, 0x15, 0x98, + 0x3E, 0xE3, 0xB8, 0x5A, 0xE8, 0xA7, 0x8E, 0x99, + 0x26, 0x33, 0x58, 0x1A, 0x90, 0x99, 0x89, 0x3B, + 0x63, 0xDB, 0x30, 0x24, 0x1C, 0x34, 0xF6, 0x43, + 0x02, 0x7D, 0xC8, 0x78, 0x27, 0x9A, 0xF5, 0x85, + 0x0D, 0x7E, 0x2D, 0x4A, 0x26, 0x53, 0x07, 0x3A + }, + { + 0xD0, 0xF2, 0xF2, 0xE3, 0x78, 0x76, 0x53, 0xF7, + 0x7C, 0xCE, 0x2F, 0xA2, 0x48, 0x35, 0x78, 0x5B, + 0xBD, 0x0C, 0x43, 0x3F, 0xC7, 0x79, 0x46, 0x5A, + 0x11, 0x51, 0x49, 0x90, 0x5A, 0x9D, 0xD1, 0xCB, + 0x82, 0x7A, 0x62, 0x85, 0x06, 0xD4, 0x57, 0xFC, + 0xF1, 0x24, 0xA0, 0xC2, 0xAE, 0xF9, 0xCE, 0x2D, + 0x2A, 0x0A, 0x0F, 0x63, 0x54, 0x55, 0x70, 0xD8, + 0x66, 0x7F, 0xF9, 0xE2, 0xEB, 0xA0, 0x73, 0x34 + }, + { + 0x78, 0xA9, 0xFC, 0x04, 0x8E, 0x25, 0xC6, 0xDC, + 0xB5, 0xDE, 0x45, 0x66, 0x7D, 0xE8, 0xFF, 0xDD, + 0x3A, 0x93, 0x71, 0x11, 0x41, 0xD5, 0x94, 0xE9, + 0xFA, 0x62, 0xA9, 0x59, 0x47, 0x5D, 0xA6, 0x07, + 0x5E, 0xA8, 0xF0, 0x91, 0x6E, 0x84, 0xE4, 0x5A, + 0xD9, 0x11, 0xB7, 0x54, 0x67, 0x07, 0x7E, 0xE5, + 0x2D, 0x2C, 0x9A, 0xEB, 0xF4, 0xD5, 0x8F, 0x20, + 0xCE, 0x4A, 0x3A, 0x00, 0x45, 0x8B, 0x05, 0xD4 + }, + { + 0x45, 0x81, 0x3F, 0x44, 0x17, 0x69, 0xAB, 0x6E, + 0xD3, 0x7D, 0x34, 0x9F, 0xF6, 0xE7, 0x22, 0x67, + 0xD7, 0x6A, 0xE6, 0xBB, 0x3E, 0x3C, 0x61, 0x2E, + 0xC0, 0x5C, 0x6E, 0x02, 0xA1, 0x2A, 0xF5, 0xA3, + 0x7C, 0x91, 0x8B, 0x52, 0xBF, 0x74, 0x26, 0x7C, + 0x3F, 0x6A, 0x3F, 0x18, 0x3A, 0x80, 0x64, 0xFF, + 0x84, 0xC0, 0x7B, 0x19, 0x3D, 0x08, 0x06, 0x67, + 0x89, 0xA0, 0x1A, 0xCC, 0xDB, 0x6F, 0x93, 0x40 + }, + { + 0x95, 0x6D, 0xA1, 0xC6, 0x8D, 0x83, 0xA7, 0xB8, + 0x81, 0xE0, 0x1B, 0x9A, 0x96, 0x6C, 0x3C, 0x0B, + 0xF2, 0x7F, 0x68, 0x60, 0x6A, 0x8B, 0x71, 0xD4, + 0x57, 0xBD, 0x01, 0x6D, 0x4C, 0x41, 0xDD, 0x8A, + 0x38, 0x0C, 0x70, 0x9A, 0x29, 0x6C, 0xB4, 0xC6, + 0x54, 0x47, 0x92, 0x92, 0x0F, 0xD7, 0x88, 0x83, + 0x57, 0x71, 0xA0, 0x7D, 0x4A, 0x16, 0xFB, 0x52, + 0xED, 0x48, 0x05, 0x03, 0x31, 0xDC, 0x4C, 0x8B + }, + { + 0xDF, 0x18, 0x6C, 0x2D, 0xC0, 0x9C, 0xAA, 0x48, + 0xE1, 0x4E, 0x94, 0x2F, 0x75, 0xDE, 0x5A, 0xC1, + 0xB7, 0xA2, 0x1E, 0x4F, 0x9F, 0x07, 0x2A, 0x5B, + 0x37, 0x1E, 0x09, 0xE0, 0x73, 0x45, 0xB0, 0x74, + 0x0C, 0x76, 0x17, 0x7B, 0x01, 0x27, 0x88, 0x08, + 0xFE, 0xC0, 0x25, 0xED, 0xED, 0x98, 0x22, 0xC1, + 0x22, 0xAF, 0xD1, 0xC6, 0x3E, 0x6F, 0x0C, 0xE2, + 0xE3, 0x26, 0x31, 0x04, 0x10, 0x63, 0x14, 0x5C + }, + { + 0x87, 0x47, 0x56, 0x40, 0x96, 0x6A, 0x9F, 0xDC, + 0xD6, 0xD3, 0xA3, 0xB5, 0xA2, 0xCC, 0xA5, 0xC0, + 0x8F, 0x0D, 0x88, 0x2B, 0x10, 0x24, 0x3C, 0x0E, + 0xC1, 0xBF, 0x3C, 0x6B, 0x1C, 0x37, 0xF2, 0xCD, + 0x32, 0x12, 0xF1, 0x9A, 0x05, 0x78, 0x64, 0x47, + 0x7D, 0x5E, 0xAF, 0x8F, 0xAE, 0xD7, 0x3F, 0x29, + 0x37, 0xC7, 0x68, 0xA0, 0xAF, 0x41, 0x5E, 0x84, + 0xBB, 0xCE, 0x6B, 0xD7, 0xDE, 0x23, 0xB6, 0x60 + }, + { + 0xC3, 0xB5, 0x73, 0xBB, 0xE1, 0x09, 0x49, 0xA0, + 0xFB, 0xD4, 0xFF, 0x88, 0x4C, 0x44, 0x6F, 0x22, + 0x29, 0xB7, 0x69, 0x02, 0xF9, 0xDF, 0xDB, 0xB8, + 0xA0, 0x35, 0x3D, 0xA5, 0xC8, 0x3C, 0xA1, 0x4E, + 0x81, 0x51, 0xBB, 0xAA, 0xC8, 0x2F, 0xD1, 0x57, + 0x6A, 0x00, 0x9A, 0xDC, 0x6F, 0x19, 0x35, 0xCF, + 0x26, 0xED, 0xD4, 0xF1, 0xFB, 0x8D, 0xA4, 0x83, + 0xE6, 0xC5, 0xCD, 0x9D, 0x89, 0x23, 0xAD, 0xC3 + }, + { + 0xB0, 0x9D, 0x8D, 0x0B, 0xBA, 0x8A, 0x72, 0x86, + 0xE4, 0x35, 0x68, 0xF7, 0x90, 0x75, 0x50, 0xE4, + 0x20, 0x36, 0xD6, 0x74, 0xE3, 0xC8, 0xFC, 0x34, + 0xD8, 0xCA, 0x46, 0xF7, 0x71, 0xD6, 0x46, 0x6B, + 0x70, 0xFB, 0x60, 0x58, 0x75, 0xF6, 0xA8, 0x63, + 0xC8, 0x77, 0xD1, 0x2F, 0x07, 0x06, 0x3F, 0xDC, + 0x2E, 0x90, 0xCC, 0xD4, 0x59, 0xB1, 0x91, 0x0D, + 0xCD, 0x52, 0xD8, 0xF1, 0x0B, 0x2B, 0x0A, 0x15 + }, + { + 0xAF, 0x3A, 0x22, 0xBF, 0x75, 0xB2, 0x1A, 0xBF, + 0xB0, 0xAC, 0xD5, 0x44, 0x22, 0xBA, 0x1B, 0x73, + 0x00, 0xA9, 0x52, 0xEF, 0xF0, 0x2E, 0xBE, 0xB6, + 0x5B, 0x5C, 0x23, 0x44, 0x71, 0xA9, 0x8D, 0xF3, + 0x2F, 0x4F, 0x96, 0x43, 0xCE, 0x19, 0x04, 0x10, + 0x8A, 0x16, 0x87, 0x67, 0x92, 0x42, 0x80, 0xBD, + 0x76, 0xC8, 0x3F, 0x8C, 0x82, 0xD9, 0xA7, 0x9D, + 0x92, 0x59, 0xB1, 0x95, 0x36, 0x2A, 0x2A, 0x04 + }, + { + 0xBF, 0x4F, 0xF2, 0x22, 0x1B, 0x7E, 0x69, 0x57, + 0xA7, 0x24, 0xCD, 0x96, 0x4A, 0xA3, 0xD5, 0xD0, + 0xD9, 0x94, 0x1F, 0x54, 0x04, 0x13, 0x75, 0x2F, + 0x46, 0x99, 0xD8, 0x10, 0x1B, 0x3E, 0x53, 0x75, + 0x08, 0xBF, 0x09, 0xF8, 0x50, 0x8B, 0x31, 0x77, + 0x36, 0xFF, 0xD2, 0x65, 0xF2, 0x84, 0x7A, 0xA7, + 0xD8, 0x4B, 0xD2, 0xD9, 0x75, 0x69, 0xC4, 0x9D, + 0x63, 0x2A, 0xED, 0x99, 0x45, 0xE5, 0xFA, 0x5E + }, + { + 0x9C, 0x6B, 0x6B, 0x78, 0x19, 0x9B, 0x1B, 0xDA, + 0xCB, 0x43, 0x00, 0xE3, 0x14, 0x79, 0xFA, 0x62, + 0x2A, 0x6B, 0x5B, 0xC8, 0x0D, 0x46, 0x78, 0xA6, + 0x07, 0x8F, 0x88, 0xA8, 0x26, 0x8C, 0xD7, 0x20, + 0x6A, 0x27, 0x99, 0xE8, 0xD4, 0x62, 0x1A, 0x46, + 0x4E, 0xF6, 0xB4, 0x3D, 0xD8, 0xAD, 0xFF, 0xE9, + 0x7C, 0xAF, 0x22, 0x1B, 0x22, 0xB6, 0xB8, 0x77, + 0x8B, 0x14, 0x9A, 0x82, 0x2A, 0xEF, 0xBB, 0x09 + }, + { + 0x89, 0x06, 0x56, 0xF0, 0x9C, 0x99, 0xD2, 0x80, + 0xB5, 0xEC, 0xB3, 0x81, 0xF5, 0x64, 0x27, 0xB8, + 0x13, 0x75, 0x1B, 0xC6, 0x52, 0xC7, 0x82, 0x80, + 0x78, 0xB2, 0x3A, 0x4A, 0xF8, 0x3B, 0x4E, 0x3A, + 0x61, 0xFD, 0xBA, 0xC6, 0x1F, 0x89, 0xBE, 0xE8, + 0x4E, 0xA6, 0xBE, 0xE7, 0x60, 0xC0, 0x47, 0xF2, + 0x5C, 0x6B, 0x0A, 0x20, 0x1C, 0x69, 0xA3, 0x8F, + 0xD6, 0xFD, 0x97, 0x1A, 0xF1, 0x85, 0x88, 0xBB + }, + { + 0x31, 0xA0, 0x46, 0xF7, 0x88, 0x2F, 0xFE, 0x6F, + 0x83, 0xCE, 0x47, 0x2E, 0x9A, 0x07, 0x01, 0x83, + 0x2E, 0xC7, 0xB3, 0xF7, 0x6F, 0xBC, 0xFD, 0x1D, + 0xF6, 0x0F, 0xE3, 0xEA, 0x48, 0xFD, 0xE1, 0x65, + 0x12, 0x54, 0x24, 0x7C, 0x3F, 0xD9, 0x5E, 0x10, + 0x0F, 0x91, 0x72, 0x73, 0x1E, 0x17, 0xFD, 0x52, + 0x97, 0xC1, 0x1F, 0x4B, 0xB3, 0x28, 0x36, 0x3C, + 0xA3, 0x61, 0x62, 0x4A, 0x81, 0xAF, 0x79, 0x7C + }, + { + 0x27, 0xA6, 0x0B, 0x2D, 0x00, 0xE7, 0xA6, 0x71, + 0xD4, 0x7D, 0x0A, 0xEC, 0x2A, 0x68, 0x6A, 0x0A, + 0xC0, 0x4B, 0x52, 0xF4, 0x0A, 0xB6, 0x62, 0x90, + 0x28, 0xEB, 0x7D, 0x13, 0xF4, 0xBA, 0xA9, 0x9A, + 0xC0, 0xFE, 0x46, 0xEE, 0x6C, 0x81, 0x49, 0x44, + 0xF2, 0xF4, 0xB4, 0xD2, 0x0E, 0x93, 0x78, 0xE4, + 0x84, 0x7E, 0xA4, 0x4C, 0x13, 0x17, 0x80, 0x91, + 0xE2, 0x77, 0xB8, 0x7E, 0xA7, 0xA5, 0x57, 0x11 + }, + { + 0x8B, 0x5C, 0xCE, 0xF1, 0x94, 0x16, 0x2C, 0x1F, + 0x19, 0xD6, 0x8F, 0x91, 0xE0, 0xB0, 0x92, 0x8F, + 0x28, 0x9E, 0xC5, 0x28, 0x37, 0x20, 0x84, 0x0C, + 0x2F, 0x73, 0xD2, 0x53, 0x11, 0x12, 0x38, 0xDC, + 0xFE, 0x94, 0xAF, 0x2B, 0x59, 0xC2, 0xC1, 0xCA, + 0x25, 0x91, 0x90, 0x1A, 0x7B, 0xC0, 0x60, 0xE7, + 0x45, 0x9B, 0x6C, 0x47, 0xDF, 0x0F, 0x71, 0x70, + 0x1A, 0x35, 0xCC, 0x0A, 0xA8, 0x31, 0xB5, 0xB6 + }, + { + 0x57, 0xAB, 0x6C, 0x4B, 0x22, 0x29, 0xAE, 0xB3, + 0xB7, 0x04, 0x76, 0xD8, 0x03, 0xCD, 0x63, 0x81, + 0x2F, 0x10, 0x7C, 0xE6, 0xDA, 0x17, 0xFE, 0xD9, + 0xB1, 0x78, 0x75, 0xE8, 0xF8, 0x6C, 0x72, 0x4F, + 0x49, 0xE0, 0x24, 0xCB, 0xF3, 0xA1, 0xB8, 0xB1, + 0x19, 0xC5, 0x03, 0x57, 0x65, 0x2B, 0x81, 0x87, + 0x9D, 0x2A, 0xDE, 0x2D, 0x58, 0x8B, 0x9E, 0x4F, + 0x7C, 0xED, 0xBA, 0x0E, 0x46, 0x44, 0xC9, 0xEE + }, + { + 0x01, 0x90, 0xA8, 0xDA, 0xC3, 0x20, 0xA7, 0x39, + 0xF3, 0x22, 0xE1, 0x57, 0x31, 0xAA, 0x14, 0x0D, + 0xDA, 0xF5, 0xBE, 0xD2, 0x94, 0xD5, 0xC8, 0x2E, + 0x54, 0xFE, 0xF2, 0x9F, 0x21, 0x4E, 0x18, 0xAA, + 0xFA, 0xA8, 0x4F, 0x8B, 0xE9, 0x9A, 0xF6, 0x29, + 0x50, 0x26, 0x6B, 0x8F, 0x90, 0x1F, 0x15, 0xDD, + 0x4C, 0x5D, 0x35, 0x51, 0x6F, 0xC3, 0x5B, 0x4C, + 0xAB, 0x2E, 0x96, 0xE4, 0x69, 0x5B, 0xBE, 0x1C + }, + { + 0xD1, 0x4D, 0x7C, 0x4C, 0x41, 0x5E, 0xEB, 0x0E, + 0x10, 0xB1, 0x59, 0x22, 0x4B, 0xEA, 0x12, 0x7E, + 0xBD, 0x84, 0xF9, 0x59, 0x1C, 0x70, 0x2A, 0x33, + 0x0F, 0x5B, 0xB7, 0xBB, 0x7A, 0xA4, 0x4E, 0xA3, + 0x9D, 0xE6, 0xED, 0x01, 0xF1, 0x8D, 0xA7, 0xAD, + 0xF4, 0x0C, 0xFB, 0x97, 0xC5, 0xD1, 0x52, 0xC2, + 0x75, 0x28, 0x82, 0x4B, 0x21, 0xE2, 0x39, 0x52, + 0x6A, 0xF8, 0xF3, 0x6B, 0x21, 0x4E, 0x0C, 0xFB + }, + { + 0xBE, 0x28, 0xC4, 0xBE, 0x70, 0x69, 0x70, 0x48, + 0x8F, 0xAC, 0x7D, 0x29, 0xC3, 0xBD, 0x5C, 0x4E, + 0x98, 0x60, 0x85, 0xC4, 0xC3, 0x33, 0x2F, 0x1F, + 0x3F, 0xD3, 0x09, 0x73, 0xDB, 0x61, 0x41, 0x64, + 0xBA, 0x2F, 0x31, 0xA7, 0x88, 0x75, 0xFF, 0xDC, + 0x15, 0x03, 0x25, 0xC8, 0x83, 0x27, 0xA9, 0x44, + 0x3E, 0xD0, 0x4F, 0xDF, 0xE5, 0xBE, 0x93, 0x87, + 0x6D, 0x16, 0x28, 0x56, 0x0C, 0x76, 0x4A, 0x80 + }, + { + 0x03, 0x1D, 0xA1, 0x06, 0x9E, 0x3A, 0x2E, 0x9C, + 0x33, 0x82, 0xE4, 0x36, 0xFF, 0xD7, 0x9D, 0xF7, + 0x4B, 0x1C, 0xA6, 0xA8, 0xAD, 0xB2, 0xDE, 0xAB, + 0xE6, 0x76, 0xAB, 0x45, 0x99, 0x4C, 0xBC, 0x05, + 0x4F, 0x03, 0x7D, 0x2F, 0x0E, 0xAC, 0xE8, 0x58, + 0xD3, 0x2C, 0x14, 0xE2, 0xD1, 0xC8, 0xB4, 0x60, + 0x77, 0x30, 0x8E, 0x3B, 0xDC, 0x2C, 0x1B, 0x53, + 0x17, 0x2E, 0xCF, 0x7A, 0x8C, 0x14, 0xE3, 0x49 + }, + { + 0x46, 0x65, 0xCE, 0xF8, 0xBA, 0x4D, 0xB4, 0xD0, + 0xAC, 0xB1, 0x18, 0xF2, 0x98, 0x7F, 0x0B, 0xB0, + 0x9F, 0x8F, 0x86, 0xAA, 0x44, 0x5A, 0xA3, 0xD5, + 0xFC, 0x9A, 0x8B, 0x34, 0x68, 0x64, 0x78, 0x74, + 0x89, 0xE8, 0xFC, 0xEC, 0xC1, 0x25, 0xD1, 0x7E, + 0x9B, 0x56, 0xE1, 0x29, 0x88, 0xEA, 0xC5, 0xEC, + 0xC7, 0x28, 0x68, 0x83, 0xDB, 0x06, 0x61, 0xB8, + 0xFF, 0x05, 0xDA, 0x2A, 0xFF, 0xF3, 0x0F, 0xE4 + }, + { + 0x63, 0xB7, 0x03, 0x2E, 0x5F, 0x93, 0x0C, 0xC9, + 0x93, 0x95, 0x17, 0xF9, 0xE9, 0x86, 0x81, 0x6C, + 0xFB, 0xEC, 0x2B, 0xE5, 0x9B, 0x95, 0x68, 0xB1, + 0x3F, 0x2E, 0xAD, 0x05, 0xBA, 0xE7, 0x77, 0x7C, + 0xAB, 0x62, 0x0C, 0x66, 0x59, 0x40, 0x4F, 0x74, + 0x09, 0xE4, 0x19, 0x9A, 0x3B, 0xE5, 0xF7, 0x86, + 0x5A, 0xA7, 0xCB, 0xDF, 0x8C, 0x42, 0x53, 0xF7, + 0xE8, 0x21, 0x9B, 0x1B, 0xD5, 0xF4, 0x6F, 0xEA + }, + { + 0x9F, 0x09, 0xBF, 0x09, 0x3A, 0x2B, 0x0F, 0xF8, + 0xC2, 0x63, 0x4B, 0x49, 0xE3, 0x7F, 0x1B, 0x21, + 0x35, 0xB4, 0x47, 0xAA, 0x91, 0x44, 0xC9, 0x78, + 0x7D, 0xBF, 0xD9, 0x21, 0x29, 0x31, 0x6C, 0x99, + 0xE8, 0x8A, 0xAB, 0x8A, 0x21, 0xFD, 0xEF, 0x23, + 0x72, 0xD1, 0x18, 0x9A, 0xEC, 0x50, 0x0F, 0x95, + 0x77, 0x5F, 0x1F, 0x92, 0xBF, 0xB4, 0x55, 0x45, + 0xE4, 0x25, 0x9F, 0xB9, 0xB7, 0xB0, 0x2D, 0x14 + }, + { + 0xF9, 0xF8, 0x49, 0x3C, 0x68, 0x08, 0x88, 0x07, + 0xDF, 0x7F, 0x6A, 0x26, 0x93, 0xD6, 0x4E, 0xA5, + 0x9F, 0x03, 0xE9, 0xE0, 0x5A, 0x22, 0x3E, 0x68, + 0x52, 0x4C, 0xA3, 0x21, 0x95, 0xA4, 0x73, 0x4B, + 0x65, 0x4F, 0xCE, 0xA4, 0xD2, 0x73, 0x4C, 0x86, + 0x6C, 0xF9, 0x5C, 0x88, 0x9F, 0xB1, 0x0C, 0x49, + 0x15, 0x9B, 0xE2, 0xF5, 0x04, 0x3D, 0xC9, 0x8B, + 0xB5, 0x5E, 0x02, 0xEF, 0x7B, 0xDC, 0xB0, 0x82 + }, + { + 0x3C, 0x9A, 0x73, 0x59, 0xAB, 0x4F, 0xEB, 0xCE, + 0x07, 0xB2, 0x0A, 0xC4, 0x47, 0xB0, 0x6A, 0x24, + 0x0B, 0x7F, 0xE1, 0xDA, 0xE5, 0x43, 0x9C, 0x49, + 0xB6, 0x0B, 0x58, 0x19, 0xF7, 0x81, 0x2E, 0x4C, + 0x17, 0x24, 0x06, 0xC1, 0xAA, 0xC3, 0x16, 0x71, + 0x3C, 0xF0, 0xDD, 0xED, 0x10, 0x38, 0x07, 0x72, + 0x58, 0xE2, 0xEF, 0xF5, 0xB3, 0x39, 0x13, 0xD9, + 0xD9, 0x5C, 0xAE, 0xB4, 0xE6, 0xC6, 0xB9, 0x70 + }, + { + 0xAD, 0x6A, 0xAB, 0x80, 0x84, 0x51, 0x0E, 0x82, + 0x2C, 0xFC, 0xE8, 0x62, 0x5D, 0x62, 0xCF, 0x4D, + 0xE6, 0x55, 0xF4, 0x76, 0x38, 0x84, 0xC7, 0x1E, + 0x80, 0xBA, 0xB9, 0xAC, 0x9D, 0x53, 0x18, 0xDB, + 0xA4, 0xA6, 0x03, 0x3E, 0xD2, 0x90, 0x84, 0xE6, + 0x52, 0x16, 0xC0, 0x31, 0x60, 0x6C, 0xA1, 0x76, + 0x15, 0xDC, 0xFE, 0x3B, 0xA1, 0x1D, 0x26, 0x85, + 0x1A, 0xE0, 0x99, 0x9C, 0xA6, 0xE2, 0x32, 0xCF + }, + { + 0x15, 0x6E, 0x9E, 0x62, 0x61, 0x37, 0x4C, 0x9D, + 0xC8, 0x84, 0xF3, 0x6E, 0x70, 0xF0, 0xFE, 0x1A, + 0xB9, 0x29, 0x79, 0x97, 0xB8, 0x36, 0xFA, 0x7D, + 0x17, 0x0A, 0x9C, 0x9E, 0xBF, 0x57, 0x5B, 0x88, + 0x1E, 0x7B, 0xCE, 0xA4, 0x4D, 0x6C, 0x02, 0x48, + 0xD3, 0x55, 0x97, 0x90, 0x71, 0x54, 0x82, 0x89, + 0x55, 0xBE, 0x19, 0x13, 0x58, 0x52, 0xF9, 0x22, + 0x88, 0x15, 0xEC, 0xA0, 0x24, 0xA8, 0xAD, 0xFB + }, + { + 0x42, 0x15, 0x40, 0x76, 0x33, 0xF4, 0xCC, 0xA9, + 0xB6, 0x78, 0x8B, 0xE9, 0x3E, 0x6A, 0xA3, 0xD9, + 0x63, 0xC7, 0xD6, 0xCE, 0x4B, 0x14, 0x72, 0x47, + 0x09, 0x9F, 0x46, 0xA3, 0xAC, 0xB5, 0x00, 0xA3, + 0x00, 0x38, 0xCB, 0x3E, 0x78, 0x8C, 0x3D, 0x29, + 0xF1, 0x32, 0xAD, 0x84, 0x4E, 0x80, 0xE9, 0xE9, + 0x92, 0x51, 0xF6, 0xDB, 0x96, 0xAC, 0xD8, 0xA0, + 0x91, 0xCF, 0xC7, 0x70, 0xAF, 0x53, 0x84, 0x7B + }, + { + 0x1C, 0x07, 0x7E, 0x27, 0x9D, 0xE6, 0x54, 0x85, + 0x23, 0x50, 0x2B, 0x6D, 0xF8, 0x00, 0xFF, 0xDA, + 0xB5, 0xE2, 0xC3, 0xE9, 0x44, 0x2E, 0xB8, 0x38, + 0xF5, 0x8C, 0x29, 0x5F, 0x3B, 0x14, 0x7C, 0xEF, + 0x9D, 0x70, 0x1C, 0x41, 0xC3, 0x21, 0x28, 0x3F, + 0x00, 0xC7, 0x1A, 0xFF, 0xA0, 0x61, 0x93, 0x10, + 0x39, 0x91, 0x26, 0x29, 0x5B, 0x78, 0xDD, 0x4D, + 0x1A, 0x74, 0x57, 0x2E, 0xF9, 0xED, 0x51, 0x35 + }, + { + 0xF0, 0x7A, 0x55, 0x5F, 0x49, 0xFE, 0x48, 0x1C, + 0xF4, 0xCD, 0x0A, 0x87, 0xB7, 0x1B, 0x82, 0xE4, + 0xA9, 0x50, 0x64, 0xD0, 0x66, 0x77, 0xFD, 0xD9, + 0x0A, 0x0E, 0xB5, 0x98, 0x87, 0x7B, 0xA1, 0xC8, + 0x3D, 0x46, 0x77, 0xB3, 0x93, 0xC3, 0xA3, 0xB6, + 0x66, 0x1C, 0x42, 0x1F, 0x5B, 0x12, 0xCB, 0x99, + 0xD2, 0x03, 0x76, 0xBA, 0x72, 0x75, 0xC2, 0xF3, + 0xA8, 0xF5, 0xA9, 0xB7, 0x82, 0x17, 0x20, 0xDA + }, + { + 0xB5, 0x91, 0x1B, 0x38, 0x0D, 0x20, 0xC7, 0xB0, + 0x43, 0x23, 0xE4, 0x02, 0x6B, 0x38, 0xE2, 0x00, + 0xF5, 0x34, 0x25, 0x92, 0x33, 0xB5, 0x81, 0xE0, + 0x2C, 0x1E, 0x3E, 0x2D, 0x84, 0x38, 0xD6, 0xC6, + 0x6D, 0x5A, 0x4E, 0xB2, 0x01, 0xD5, 0xA8, 0xB7, + 0x50, 0x72, 0xC4, 0xEC, 0x29, 0x10, 0x63, 0x34, + 0xDA, 0x70, 0xBC, 0x79, 0x52, 0x1B, 0x0C, 0xED, + 0x2C, 0xFD, 0x53, 0x3F, 0x5F, 0xF8, 0x4F, 0x95 + }, + { + 0x01, 0xF0, 0x70, 0xA0, 0x9B, 0xAE, 0x91, 0x12, + 0x96, 0x36, 0x1F, 0x91, 0xAA, 0x0E, 0x8E, 0x0D, + 0x09, 0xA7, 0x72, 0x54, 0x78, 0x53, 0x6D, 0x9D, + 0x48, 0xC5, 0xFE, 0x1E, 0x5E, 0x7C, 0x3C, 0x5B, + 0x9B, 0x9D, 0x6E, 0xB0, 0x77, 0x96, 0xF6, 0xDA, + 0x57, 0xAE, 0x56, 0x2A, 0x7D, 0x70, 0xE8, 0x82, + 0xE3, 0x7A, 0xDF, 0xDE, 0x83, 0xF0, 0xC4, 0x33, + 0xC2, 0xCD, 0x36, 0x35, 0x36, 0xBB, 0x22, 0xC8 + }, + { + 0x6F, 0x79, 0x3E, 0xB4, 0x37, 0x4A, 0x48, 0xB0, + 0x77, 0x5A, 0xCA, 0xF9, 0xAD, 0xCF, 0x8E, 0x45, + 0xE5, 0x42, 0x70, 0xC9, 0x47, 0x5F, 0x00, 0x4A, + 0xD8, 0xD5, 0x97, 0x3E, 0x2A, 0xCA, 0x52, 0x74, + 0x7F, 0xF4, 0xED, 0x04, 0xAE, 0x96, 0x72, 0x75, + 0xB9, 0xF9, 0xEB, 0x0E, 0x1F, 0xF7, 0x5F, 0xB4, + 0xF7, 0x94, 0xFA, 0x8B, 0xE9, 0xAD, 0xD7, 0xA4, + 0x13, 0x04, 0x86, 0x8D, 0x10, 0x3F, 0xAB, 0x10 + }, + { + 0x96, 0x5F, 0x20, 0xF1, 0x39, 0x76, 0x5F, 0xCC, + 0x4C, 0xE4, 0xBA, 0x37, 0x94, 0x67, 0x58, 0x63, + 0xCA, 0xC2, 0x4D, 0xB4, 0x72, 0xCD, 0x2B, 0x79, + 0x9D, 0x03, 0x5B, 0xCE, 0x3D, 0xBE, 0xA5, 0x02, + 0xDA, 0x7B, 0x52, 0x48, 0x65, 0xF6, 0xB8, 0x11, + 0xD8, 0xC5, 0x82, 0x8D, 0x3A, 0x88, 0x96, 0x46, + 0xFE, 0x64, 0xA3, 0x80, 0xDA, 0x1A, 0xA7, 0xC7, + 0x04, 0x4E, 0x9F, 0x24, 0x5D, 0xCE, 0xD1, 0x28 + }, + { + 0xEC, 0x29, 0x5B, 0x57, 0x83, 0x60, 0x12, 0x44, + 0xC3, 0x0E, 0x46, 0x41, 0xE3, 0xB4, 0x5B, 0xE2, + 0x22, 0xC4, 0xDC, 0xE7, 0x7A, 0x58, 0x70, 0x0F, + 0x53, 0xBC, 0x8E, 0xC5, 0x2A, 0x94, 0x16, 0x90, + 0xB4, 0xD0, 0xB0, 0x87, 0xFB, 0x6F, 0xCB, 0x3F, + 0x39, 0x83, 0x2B, 0x9D, 0xE8, 0xF7, 0x5E, 0xC2, + 0x0B, 0xD4, 0x30, 0x79, 0x81, 0x17, 0x49, 0xCD, + 0xC9, 0x07, 0xED, 0xB9, 0x41, 0x57, 0xD1, 0x80 + }, + { + 0x61, 0xC7, 0x2F, 0x8C, 0xCC, 0x91, 0xDB, 0xB5, + 0x4C, 0xA6, 0x75, 0x0B, 0xC4, 0x89, 0x67, 0x2D, + 0xE0, 0x9F, 0xAE, 0xDB, 0x8F, 0xDD, 0x4F, 0x94, + 0xFF, 0x23, 0x20, 0x90, 0x9A, 0x30, 0x3F, 0x5D, + 0x5A, 0x98, 0x48, 0x1C, 0x0B, 0xC1, 0xA6, 0x25, + 0x41, 0x9F, 0xB4, 0xDE, 0xBF, 0xBF, 0x7F, 0x8A, + 0x53, 0xBB, 0x07, 0xEC, 0x3D, 0x98, 0x5E, 0x8E, + 0xA1, 0x1E, 0x72, 0xD5, 0x59, 0x94, 0x07, 0x80 + }, + { + 0xAF, 0xD8, 0x14, 0x5B, 0x25, 0x9E, 0xEF, 0xC8, + 0xD1, 0x26, 0x20, 0xC3, 0xC5, 0xB0, 0x3E, 0x1E, + 0xD8, 0xFD, 0x2C, 0xCE, 0xFE, 0x03, 0x65, 0x07, + 0x8C, 0x80, 0xFD, 0x42, 0xC1, 0x77, 0x0E, 0x28, + 0xB4, 0x49, 0x48, 0xF2, 0x7E, 0x65, 0xA1, 0x88, + 0x66, 0x90, 0x11, 0x0D, 0xB8, 0x14, 0x39, 0x7B, + 0x68, 0xE4, 0x3D, 0x80, 0xD1, 0xBA, 0x16, 0xDF, + 0xA3, 0x58, 0xE7, 0x39, 0xC8, 0x98, 0xCF, 0xA3 + }, + { + 0x55, 0x2F, 0xC7, 0x89, 0x3C, 0xF1, 0xCE, 0x93, + 0x3A, 0xDA, 0x35, 0xC0, 0xDA, 0x98, 0x84, 0x4E, + 0x41, 0x54, 0x5E, 0x24, 0x4C, 0x31, 0x57, 0xA1, + 0x42, 0x8D, 0x7B, 0x4C, 0x21, 0xF9, 0xCD, 0x7E, + 0x40, 0x71, 0xAE, 0xD7, 0x7B, 0x7C, 0xA9, 0xF1, + 0xC3, 0x8F, 0xBA, 0x32, 0x23, 0x74, 0x12, 0xEF, + 0x21, 0xA3, 0x42, 0x74, 0x2E, 0xC8, 0x32, 0x43, + 0x78, 0xF2, 0x1E, 0x50, 0x7F, 0xAF, 0xDD, 0x88 + }, + { + 0x46, 0x7A, 0x33, 0xFB, 0xAD, 0xF5, 0xEB, 0xC5, + 0x25, 0x96, 0xEF, 0x86, 0xAA, 0xAE, 0xFC, 0x6F, + 0xAB, 0xA8, 0xEE, 0x65, 0x1B, 0x1C, 0xE0, 0x4D, + 0xE3, 0x68, 0xA0, 0x3A, 0x5A, 0x90, 0x40, 0xEF, + 0x28, 0x35, 0xE0, 0x0A, 0xDB, 0x09, 0xAB, 0xB3, + 0xFB, 0xD2, 0xBC, 0xE8, 0x18, 0xA2, 0x41, 0x3D, + 0x0B, 0x02, 0x53, 0xB5, 0xBD, 0xA4, 0xFC, 0x5B, + 0x2F, 0x6F, 0x85, 0xF3, 0xFD, 0x5B, 0x55, 0xF2 + }, + { + 0x22, 0xEF, 0xF8, 0xE6, 0xDD, 0x52, 0x36, 0xF5, + 0xF5, 0x7D, 0x94, 0xED, 0xE8, 0x74, 0xD6, 0xC9, + 0x42, 0x8E, 0x8F, 0x5D, 0x56, 0x6F, 0x17, 0xCD, + 0x6D, 0x18, 0x48, 0xCD, 0x75, 0x2F, 0xE1, 0x3C, + 0x65, 0x5C, 0xB1, 0x0F, 0xBA, 0xAF, 0xF7, 0x68, + 0x72, 0xF2, 0xBF, 0x2D, 0xA9, 0x9E, 0x15, 0xDC, + 0x62, 0x40, 0x75, 0xE1, 0xEC, 0x2F, 0x58, 0xA3, + 0xF6, 0x40, 0x72, 0x12, 0x18, 0x38, 0x56, 0x9E + }, + { + 0x9C, 0xEC, 0x6B, 0xBF, 0x62, 0xC4, 0xBC, 0xE4, + 0x13, 0x8A, 0xBA, 0xE1, 0xCB, 0xEC, 0x8D, 0xAD, + 0x31, 0x95, 0x04, 0x44, 0xE9, 0x03, 0x21, 0xB1, + 0x34, 0x71, 0x96, 0x83, 0x4C, 0x11, 0x4B, 0x86, + 0x4A, 0xF3, 0xF3, 0xCC, 0x35, 0x08, 0xF8, 0x37, + 0x51, 0xFF, 0xB4, 0xED, 0xA7, 0xC8, 0x4D, 0x14, + 0x07, 0x34, 0xBB, 0x42, 0x63, 0xC3, 0x62, 0x5C, + 0x00, 0xF0, 0x4F, 0x4C, 0x80, 0x68, 0x98, 0x1B + }, + { + 0xA8, 0xB6, 0x0F, 0xA4, 0xFC, 0x24, 0x42, 0xF6, + 0xF1, 0x51, 0x4A, 0xD7, 0x40, 0x26, 0x26, 0x92, + 0x0C, 0xC7, 0xC2, 0xC9, 0xF7, 0x21, 0x24, 0xB8, + 0xCB, 0xA8, 0xEE, 0x2C, 0xB7, 0xC4, 0x58, 0x6F, + 0x65, 0x8A, 0x44, 0x10, 0xCF, 0xFC, 0xC0, 0xAB, + 0x88, 0x34, 0x39, 0x55, 0xE0, 0x94, 0xC6, 0xAF, + 0x0D, 0x20, 0xD0, 0xC7, 0x14, 0xFB, 0x0A, 0x98, + 0x8F, 0x54, 0x3F, 0x30, 0x0F, 0x58, 0xD3, 0x89 + }, + { + 0x82, 0x71, 0xCC, 0x45, 0xDF, 0xA5, 0xE4, 0x17, + 0x0E, 0x84, 0x7E, 0x86, 0x30, 0xB9, 0x52, 0xCF, + 0x9C, 0x2A, 0xA7, 0x77, 0xD0, 0x6F, 0x26, 0xA7, + 0x58, 0x5B, 0x83, 0x81, 0xF1, 0x88, 0xDA, 0xCC, + 0x73, 0x37, 0x39, 0x1C, 0xFC, 0xC9, 0x4B, 0x05, + 0x3D, 0xC4, 0xEC, 0x29, 0xCC, 0x17, 0xF0, 0x77, + 0x87, 0x04, 0x28, 0xF1, 0xAC, 0x23, 0xFD, 0xDD, + 0xA1, 0x65, 0xEF, 0x5A, 0x3F, 0x15, 0x5F, 0x39 + }, + { + 0xBF, 0x23, 0xC0, 0xC2, 0x5C, 0x80, 0x60, 0xE4, + 0xF6, 0x99, 0x5F, 0x16, 0x23, 0xA3, 0xBE, 0xBE, + 0xCA, 0xA9, 0x6E, 0x30, 0x86, 0x80, 0x00, 0x0A, + 0x8A, 0xA3, 0xCD, 0x56, 0xBB, 0x1A, 0x6D, 0xA0, + 0x99, 0xE1, 0x0D, 0x92, 0x31, 0xB3, 0x7F, 0x45, + 0x19, 0xB2, 0xEF, 0xD2, 0xC2, 0x4D, 0xE7, 0x2F, + 0x31, 0xA5, 0xF1, 0x95, 0x35, 0x24, 0x1B, 0x4A, + 0x59, 0xFA, 0x3C, 0x03, 0xCE, 0xB7, 0x90, 0xE7 + }, + { + 0x87, 0x7F, 0xD6, 0x52, 0xC0, 0x52, 0x81, 0x00, + 0x9C, 0x0A, 0x52, 0x50, 0xE7, 0xA3, 0xA6, 0x71, + 0xF8, 0xB1, 0x8C, 0x10, 0x88, 0x17, 0xFE, 0x4A, + 0x87, 0x4D, 0xE2, 0x2D, 0xA8, 0xE4, 0x5D, 0xB1, + 0x19, 0x58, 0xA6, 0x00, 0xC5, 0xF6, 0x2E, 0x67, + 0xD3, 0x6C, 0xBF, 0x84, 0x47, 0x4C, 0xF2, 0x44, + 0xA9, 0xC2, 0xB0, 0x3A, 0x9F, 0xB9, 0xDC, 0x71, + 0x1C, 0xD1, 0xA2, 0xCA, 0xB6, 0xF3, 0xFA, 0xE0 + }, + { + 0x29, 0xDF, 0x4D, 0x87, 0xEA, 0x44, 0x4B, 0xAF, + 0x5B, 0xCD, 0xF5, 0xF4, 0xE4, 0x15, 0x79, 0xE2, + 0x8A, 0x67, 0xDE, 0x84, 0x14, 0x9F, 0x06, 0xC0, + 0x3F, 0x11, 0x0E, 0xA8, 0x4F, 0x57, 0x2A, 0x9F, + 0x67, 0x6A, 0xDD, 0xD0, 0x4C, 0x48, 0x78, 0xF4, + 0x9C, 0x5C, 0x00, 0xAC, 0xCD, 0xA4, 0x41, 0xB1, + 0xA3, 0x87, 0xCA, 0xCE, 0xB2, 0xE9, 0x93, 0xBB, + 0x7A, 0x10, 0xCD, 0x8C, 0x2D, 0x67, 0x17, 0xE1 + }, + { + 0x71, 0x0D, 0xAC, 0xB1, 0x66, 0x84, 0x46, 0x39, + 0xCD, 0x7B, 0x63, 0x7C, 0x27, 0x42, 0x09, 0x42, + 0x4E, 0x24, 0x49, 0xDC, 0x35, 0xD7, 0x90, 0xBB, + 0xFA, 0x4F, 0x76, 0x17, 0x70, 0x54, 0xA3, 0x6B, + 0x3B, 0x76, 0xFA, 0xC0, 0xCA, 0x6E, 0x61, 0xDF, + 0x1E, 0x68, 0x70, 0x00, 0x67, 0x8A, 0xC0, 0x74, + 0x6D, 0xF7, 0x5D, 0x0A, 0x39, 0x54, 0x89, 0x76, + 0x81, 0xFD, 0x39, 0x3A, 0x15, 0x5A, 0x1B, 0xB4 + }, + { + 0xC1, 0xD5, 0xF9, 0x3B, 0x8D, 0xEA, 0x1F, 0x25, + 0x71, 0xBA, 0xBC, 0xCB, 0xC0, 0x17, 0x64, 0x54, + 0x1A, 0x0C, 0xDA, 0x87, 0xE4, 0x44, 0xD6, 0x73, + 0xC5, 0x09, 0x66, 0xCA, 0x55, 0x9C, 0x33, 0x35, + 0x4B, 0x3A, 0xCB, 0x26, 0xE5, 0xD5, 0x78, 0x1F, + 0xFB, 0x28, 0x84, 0x7A, 0x4B, 0x47, 0x54, 0xD7, + 0x70, 0x08, 0xC6, 0x2A, 0x83, 0x58, 0x35, 0xF5, + 0x00, 0xDE, 0xA7, 0xC3, 0xB5, 0x8B, 0xDA, 0xE2 + }, + { + 0xA4, 0x1E, 0x41, 0x27, 0x1C, 0xDA, 0xB8, 0xAF, + 0x4D, 0x72, 0xB1, 0x04, 0xBF, 0xB2, 0xAD, 0x04, + 0x1A, 0xC4, 0xDF, 0x14, 0x67, 0x7D, 0xA6, 0x71, + 0xD8, 0x56, 0x40, 0xC4, 0xB1, 0x87, 0xF5, 0x0C, + 0x2B, 0x66, 0x51, 0x3C, 0x46, 0x19, 0xFB, 0xD5, + 0xD5, 0xDC, 0x4F, 0xE6, 0x5D, 0xD3, 0x7B, 0x90, + 0x42, 0xE9, 0x84, 0x8D, 0xDA, 0x55, 0x6A, 0x50, + 0x4C, 0xAA, 0x2B, 0x1C, 0x6A, 0xFE, 0x47, 0x30 + }, + { + 0xE7, 0xBC, 0xBA, 0xCD, 0xC3, 0x79, 0xC4, 0x3D, + 0x81, 0xEB, 0xAD, 0xCB, 0x37, 0x78, 0x15, 0x52, + 0xFC, 0x1D, 0x75, 0x3E, 0x8C, 0xF3, 0x10, 0xD9, + 0x68, 0x39, 0x2D, 0x06, 0xC9, 0x1F, 0x1D, 0x64, + 0xCC, 0x9E, 0x90, 0xCE, 0x1D, 0x22, 0xC3, 0x2D, + 0x27, 0x7F, 0xC6, 0xCD, 0xA4, 0x33, 0xA4, 0xD4, + 0x42, 0xC7, 0x62, 0xE9, 0xEA, 0xCF, 0x2C, 0x25, + 0x9F, 0x32, 0xD6, 0x4C, 0xF9, 0xDA, 0x3A, 0x22 + }, + { + 0x51, 0x75, 0x5B, 0x4A, 0xC5, 0x45, 0x6B, 0x13, + 0x21, 0x8A, 0x19, 0xC5, 0xB9, 0x24, 0x2F, 0x57, + 0xC4, 0xA9, 0x81, 0xE4, 0xD4, 0xEC, 0xDC, 0xE0, + 0x9A, 0x31, 0x93, 0x36, 0x2B, 0x80, 0x8A, 0x57, + 0x93, 0x45, 0xD4, 0x88, 0x1C, 0x26, 0x07, 0xA5, + 0x65, 0x34, 0xDD, 0x7F, 0x21, 0x95, 0x6A, 0xFF, + 0x72, 0xC2, 0xF4, 0x17, 0x3A, 0x6E, 0x7B, 0x6C, + 0xC2, 0x21, 0x2B, 0xA0, 0xE3, 0xDA, 0xEE, 0x1F + }, + { + 0xDC, 0xC2, 0xC4, 0xBE, 0xB9, 0xC1, 0xF2, 0x60, + 0x7B, 0x78, 0x6C, 0x20, 0xC6, 0x31, 0x97, 0x23, + 0x47, 0x03, 0x4C, 0x1C, 0xC0, 0x2F, 0xCC, 0x7D, + 0x02, 0xFF, 0x01, 0x09, 0x9C, 0xFE, 0x1C, 0x69, + 0x89, 0x84, 0x0A, 0xC2, 0x13, 0x92, 0x36, 0x29, + 0x11, 0x3A, 0xA8, 0xBA, 0xD7, 0x13, 0xCC, 0xF0, + 0xFE, 0x4C, 0xE1, 0x32, 0x64, 0xFB, 0x32, 0xB8, + 0xB0, 0xFE, 0x37, 0x2D, 0xA3, 0x82, 0x54, 0x4A + }, + { + 0x3D, 0x55, 0x17, 0x6A, 0xCE, 0xA4, 0xA7, 0xE3, + 0xA6, 0x5F, 0xFA, 0x9F, 0xB1, 0x0A, 0x7A, 0x17, + 0x67, 0x19, 0x9C, 0xF0, 0x77, 0xCE, 0xE9, 0xF7, + 0x15, 0x32, 0xD6, 0x7C, 0xD7, 0xC7, 0x3C, 0x9F, + 0x93, 0xCF, 0xC3, 0x7C, 0xCD, 0xCC, 0x1F, 0xDE, + 0xF5, 0x0A, 0xAD, 0x46, 0xA5, 0x04, 0xA6, 0x50, + 0xD2, 0x98, 0xD5, 0x97, 0xA3, 0xA9, 0xFA, 0x95, + 0xC6, 0xC4, 0x0C, 0xB7, 0x1F, 0xA5, 0xE7, 0x25 + }, + { + 0xD0, 0x77, 0x13, 0xC0, 0x05, 0xDE, 0x96, 0xDD, + 0x21, 0xD2, 0xEB, 0x8B, 0xBE, 0xCA, 0x66, 0x74, + 0x6E, 0xA5, 0x1A, 0x31, 0xAE, 0x92, 0x2A, 0x3E, + 0x74, 0x86, 0x48, 0x89, 0x54, 0x0A, 0x48, 0xDB, + 0x27, 0xD7, 0xE4, 0xC9, 0x03, 0x11, 0x63, 0x8B, + 0x22, 0x4B, 0xF0, 0x20, 0x1B, 0x50, 0x18, 0x91, + 0x75, 0x48, 0x48, 0x11, 0x3C, 0x26, 0x61, 0x08, + 0xD0, 0xAD, 0xB1, 0x3D, 0xB7, 0x19, 0x09, 0xC7 + }, + { + 0x58, 0x98, 0x3C, 0x21, 0x43, 0x3D, 0x95, 0x0C, + 0xAA, 0x23, 0xE4, 0xBC, 0x18, 0x54, 0x3B, 0x8E, + 0x60, 0x1C, 0x20, 0x43, 0x18, 0x53, 0x21, 0x52, + 0xDA, 0xF5, 0xE1, 0x59, 0xA0, 0xCD, 0x14, 0x80, + 0x18, 0x3D, 0x29, 0x28, 0x5C, 0x05, 0xF1, 0x29, + 0xCB, 0x0C, 0xC3, 0x16, 0x46, 0x87, 0x92, 0x80, + 0x86, 0xFF, 0xE3, 0x80, 0x15, 0x8D, 0xF1, 0xD3, + 0x94, 0xC6, 0xAC, 0x0D, 0x42, 0x88, 0xBC, 0xA8 + }, + { + 0x81, 0x00, 0xA8, 0xDC, 0x52, 0x8D, 0x2B, 0x68, + 0x2A, 0xB4, 0x25, 0x08, 0x01, 0xBA, 0x33, 0xF0, + 0x2A, 0x3E, 0x94, 0xC5, 0x4D, 0xAC, 0x0A, 0xE1, + 0x48, 0x2A, 0xA2, 0x1F, 0x51, 0xEF, 0x3A, 0x82, + 0xF3, 0x80, 0x7E, 0x6F, 0xAC, 0xB0, 0xAE, 0xB0, + 0x59, 0x47, 0xBF, 0x7A, 0xA2, 0xAD, 0xCB, 0x03, + 0x43, 0x56, 0xF9, 0x0F, 0xA4, 0x56, 0x0E, 0xDE, + 0x02, 0x20, 0x1A, 0x37, 0xE4, 0x11, 0xEC, 0x1A + }, + { + 0x07, 0x02, 0x5F, 0x1B, 0xB6, 0xC7, 0x84, 0xF3, + 0xFE, 0x49, 0xDE, 0x5C, 0x14, 0xB9, 0x36, 0xA5, + 0xAC, 0xAC, 0xAC, 0xAA, 0xB3, 0x3F, 0x6A, 0xC4, + 0xD0, 0xE0, 0x0A, 0xB6, 0xA1, 0x24, 0x83, 0xD6, + 0xBE, 0xC0, 0x0B, 0x4F, 0xE6, 0x7C, 0x7C, 0xA5, + 0xCC, 0x50, 0x8C, 0x2A, 0x53, 0xEF, 0xB5, 0xBF, + 0xA5, 0x39, 0x87, 0x69, 0xD8, 0x43, 0xFF, 0x0D, + 0x9E, 0x8B, 0x14, 0xD3, 0x6A, 0x01, 0xA7, 0x7F + }, + { + 0xBA, 0x6A, 0xEF, 0xD9, 0x72, 0xB6, 0x18, 0x6E, + 0x02, 0x7A, 0x76, 0x27, 0x3A, 0x4A, 0x72, 0x33, + 0x21, 0xA3, 0xF5, 0x80, 0xCF, 0xA8, 0x94, 0xDA, + 0x5A, 0x9C, 0xE8, 0xE7, 0x21, 0xC8, 0x28, 0x55, + 0x2C, 0x64, 0xDA, 0xCE, 0xE3, 0xA7, 0xFD, 0x2D, + 0x74, 0x3B, 0x5C, 0x35, 0xAD, 0x0C, 0x8E, 0xFA, + 0x71, 0xF8, 0xCE, 0x99, 0xBF, 0x96, 0x33, 0x47, + 0x10, 0xE2, 0xC2, 0x34, 0x6E, 0x8F, 0x3C, 0x52 + }, + { + 0xE0, 0x72, 0x1E, 0x02, 0x51, 0x7A, 0xED, 0xFA, + 0x4E, 0x7E, 0x9B, 0xA5, 0x03, 0xE0, 0x25, 0xFD, + 0x46, 0xE7, 0x14, 0x56, 0x6D, 0xC8, 0x89, 0xA8, + 0x4C, 0xBF, 0xE5, 0x6A, 0x55, 0xDF, 0xBE, 0x2F, + 0xC4, 0x93, 0x8A, 0xC4, 0x12, 0x05, 0x88, 0x33, + 0x5D, 0xEA, 0xC8, 0xEF, 0x3F, 0xA2, 0x29, 0xAD, + 0xC9, 0x64, 0x7F, 0x54, 0xAD, 0x2E, 0x34, 0x72, + 0x23, 0x4F, 0x9B, 0x34, 0xEF, 0xC4, 0x65, 0x43 + }, + { + 0xB6, 0x29, 0x26, 0x69, 0xCC, 0xD3, 0x8D, 0x5F, + 0x01, 0xCA, 0xAE, 0x96, 0xBA, 0x27, 0x2C, 0x76, + 0xA8, 0x79, 0xA4, 0x57, 0x43, 0xAF, 0xA0, 0x72, + 0x5D, 0x83, 0xB9, 0xEB, 0xB2, 0x66, 0x65, 0xB7, + 0x31, 0xF1, 0x84, 0x8C, 0x52, 0xF1, 0x19, 0x72, + 0xB6, 0x64, 0x4F, 0x55, 0x4C, 0x06, 0x4F, 0xA9, + 0x07, 0x80, 0xDB, 0xBB, 0xF3, 0xA8, 0x9D, 0x4F, + 0xC3, 0x1F, 0x67, 0xDF, 0x3E, 0x58, 0x57, 0xEF + }, + { + 0x23, 0x19, 0xE3, 0x78, 0x9C, 0x47, 0xE2, 0xDA, + 0xA5, 0xFE, 0x80, 0x7F, 0x61, 0xBE, 0xC2, 0xA1, + 0xA6, 0x53, 0x7F, 0xA0, 0x3F, 0x19, 0xFF, 0x32, + 0xE8, 0x7E, 0xEC, 0xBF, 0xD6, 0x4B, 0x7E, 0x0E, + 0x8C, 0xCF, 0xF4, 0x39, 0xAC, 0x33, 0x3B, 0x04, + 0x0F, 0x19, 0xB0, 0xC4, 0xDD, 0xD1, 0x1A, 0x61, + 0xE2, 0x4A, 0xC1, 0xFE, 0x0F, 0x10, 0xA0, 0x39, + 0x80, 0x6C, 0x5D, 0xCC, 0x0D, 0xA3, 0xD1, 0x15 + }, + { + 0xF5, 0x97, 0x11, 0xD4, 0x4A, 0x03, 0x1D, 0x5F, + 0x97, 0xA9, 0x41, 0x3C, 0x06, 0x5D, 0x1E, 0x61, + 0x4C, 0x41, 0x7E, 0xDE, 0x99, 0x85, 0x90, 0x32, + 0x5F, 0x49, 0xBA, 0xD2, 0xFD, 0x44, 0x4D, 0x3E, + 0x44, 0x18, 0xBE, 0x19, 0xAE, 0xC4, 0xE1, 0x14, + 0x49, 0xAC, 0x1A, 0x57, 0x20, 0x78, 0x98, 0xBC, + 0x57, 0xD7, 0x6A, 0x1B, 0xCF, 0x35, 0x66, 0x29, + 0x2C, 0x20, 0xC6, 0x83, 0xA5, 0xC4, 0x64, 0x8F + }, + { + 0xDF, 0x0A, 0x9D, 0x0C, 0x21, 0x28, 0x43, 0xA6, + 0xA9, 0x34, 0xE3, 0x90, 0x2B, 0x2D, 0xD3, 0x0D, + 0x17, 0xFB, 0xA5, 0xF9, 0x69, 0xD2, 0x03, 0x0B, + 0x12, 0xA5, 0x46, 0xD8, 0xA6, 0xA4, 0x5E, 0x80, + 0xCF, 0x56, 0x35, 0xF0, 0x71, 0xF0, 0x45, 0x2E, + 0x9C, 0x91, 0x92, 0x75, 0xDA, 0x99, 0xBE, 0xD5, + 0x1E, 0xB1, 0x17, 0x3C, 0x1A, 0xF0, 0x51, 0x87, + 0x26, 0xB7, 0x5B, 0x0E, 0xC3, 0xBA, 0xE2, 0xB5 + }, + { + 0xA3, 0xEB, 0x6E, 0x6C, 0x7B, 0xF2, 0xFB, 0x8B, + 0x28, 0xBF, 0xE8, 0xB1, 0x5E, 0x15, 0xBB, 0x50, + 0x0F, 0x78, 0x1E, 0xCC, 0x86, 0xF7, 0x78, 0xC3, + 0xA4, 0xE6, 0x55, 0xFC, 0x58, 0x69, 0xBF, 0x28, + 0x46, 0xA2, 0x45, 0xD4, 0xE3, 0x3B, 0x7B, 0x14, + 0x43, 0x6A, 0x17, 0xE6, 0x3B, 0xE7, 0x9B, 0x36, + 0x65, 0x5C, 0x22, 0x6A, 0x50, 0xFF, 0xBC, 0x71, + 0x24, 0x20, 0x7B, 0x02, 0x02, 0x34, 0x2D, 0xB5 + }, + { + 0x56, 0xD4, 0xCB, 0xCD, 0x07, 0x05, 0x63, 0x42, + 0x6A, 0x01, 0x70, 0x69, 0x42, 0x5C, 0x2C, 0xD2, + 0xAE, 0x54, 0x06, 0x68, 0x28, 0x7A, 0x5F, 0xB9, + 0xDA, 0xC4, 0x32, 0xEB, 0x8A, 0xB1, 0xA3, 0x53, + 0xA3, 0x0F, 0x2F, 0xE1, 0xF4, 0x0D, 0x83, 0x33, + 0x3A, 0xFE, 0x69, 0x6A, 0x26, 0x77, 0x95, 0x40, + 0x8A, 0x92, 0xFE, 0x7D, 0xA0, 0x7A, 0x0C, 0x18, + 0x14, 0xCF, 0x77, 0xF3, 0x6E, 0x10, 0x5E, 0xE8 + }, + { + 0xE5, 0x9B, 0x99, 0x87, 0xD4, 0x28, 0xB3, 0xED, + 0xA3, 0x7D, 0x80, 0xAB, 0xDB, 0x16, 0xCD, 0x2B, + 0x0A, 0xEF, 0x67, 0x4C, 0x2B, 0x1D, 0xDA, 0x44, + 0x32, 0xEA, 0x91, 0xEE, 0x6C, 0x93, 0x5C, 0x68, + 0x4B, 0x48, 0xB4, 0x42, 0x8A, 0x8C, 0xC7, 0x40, + 0xE5, 0x79, 0xA3, 0x0D, 0xEF, 0xF3, 0x5A, 0x80, + 0x30, 0x13, 0x82, 0x0D, 0xD2, 0x3F, 0x14, 0xAE, + 0x1D, 0x84, 0x13, 0xB5, 0xC8, 0x67, 0x2A, 0xEC + }, + { + 0xCD, 0x9F, 0xCC, 0x99, 0xF9, 0x9D, 0x4C, 0xC1, + 0x6D, 0x03, 0x19, 0x00, 0xB2, 0xA7, 0x36, 0xE1, + 0x50, 0x8D, 0xB4, 0xB5, 0x86, 0x81, 0x4E, 0x63, + 0x45, 0x85, 0x7F, 0x35, 0x4A, 0x70, 0xCC, 0xEC, + 0xB1, 0xDF, 0x3B, 0x50, 0xA1, 0x9A, 0xDA, 0xF4, + 0x3C, 0x27, 0x8E, 0xFA, 0x42, 0x3F, 0xF4, 0xBB, + 0x6C, 0x52, 0x3E, 0xC7, 0xFD, 0x78, 0x59, 0xB9, + 0x7B, 0x16, 0x8A, 0x7E, 0xBF, 0xF8, 0x46, 0x7C + }, + { + 0x06, 0x02, 0x18, 0x5D, 0x8C, 0x3A, 0x78, 0x73, + 0x8B, 0x99, 0x16, 0x4B, 0x8B, 0xC6, 0xFF, 0xB2, + 0x1C, 0x7D, 0xEB, 0xEB, 0xBF, 0x80, 0x63, 0x72, + 0xE0, 0xDA, 0x44, 0xD1, 0x21, 0x54, 0x55, 0x97, + 0xB9, 0xC6, 0x62, 0xA2, 0x55, 0xDC, 0x31, 0x54, + 0x2C, 0xF9, 0x95, 0xEC, 0xBE, 0x6A, 0x50, 0xFB, + 0x5E, 0x6E, 0x0E, 0xE4, 0xEF, 0x24, 0x0F, 0xE5, + 0x57, 0xED, 0xED, 0x11, 0x88, 0x08, 0x7E, 0x86 + }, + { + 0xC0, 0x8A, 0xFA, 0x5B, 0x92, 0x7B, 0xF0, 0x80, + 0x97, 0xAF, 0xC5, 0xFF, 0xF9, 0xCA, 0x4E, 0x78, + 0x00, 0x12, 0x5C, 0x1F, 0x52, 0xF2, 0xAF, 0x35, + 0x53, 0xFA, 0x2B, 0x89, 0xE1, 0xE3, 0x01, 0x5C, + 0x4F, 0x87, 0xD5, 0xE0, 0xA4, 0x89, 0x56, 0xAD, + 0x31, 0x45, 0x0B, 0x08, 0x3D, 0xAD, 0x14, 0x7F, + 0xFB, 0x5E, 0xC0, 0x34, 0x34, 0xA2, 0x68, 0x30, + 0xCF, 0x37, 0xD1, 0x03, 0xAB, 0x50, 0xC5, 0xDA + }, + { + 0x36, 0xF1, 0xE1, 0xC1, 0x1D, 0x6E, 0xF6, 0xBC, + 0x3B, 0x53, 0x6D, 0x50, 0x5D, 0x54, 0x4A, 0x87, + 0x15, 0x22, 0xC5, 0xC2, 0xA2, 0x53, 0x06, 0x7E, + 0xC9, 0x93, 0x3B, 0x6E, 0xC2, 0x54, 0x64, 0xDA, + 0xF9, 0x85, 0x52, 0x5F, 0x5B, 0x95, 0x60, 0xA1, + 0x6D, 0x89, 0x02, 0x59, 0xAC, 0x1B, 0xB5, 0xCC, + 0x67, 0xC0, 0xC4, 0x69, 0xCD, 0xE1, 0x33, 0xDE, + 0xF0, 0x00, 0xEA, 0x1D, 0x68, 0x6F, 0x4F, 0x5D + }, + { + 0xBF, 0x2A, 0xB2, 0xE2, 0x47, 0x0F, 0x54, 0x38, + 0xC3, 0xB6, 0x89, 0xE6, 0x6E, 0x76, 0x86, 0xFF, + 0xFA, 0x0C, 0xB1, 0xE1, 0x79, 0x8A, 0xD3, 0xA8, + 0x6F, 0xF9, 0x90, 0x75, 0xBF, 0x61, 0x38, 0xE3, + 0x3D, 0x9C, 0x0C, 0xE5, 0x9A, 0xFB, 0x24, 0xAC, + 0x67, 0xA0, 0x2A, 0xF3, 0x44, 0x28, 0x19, 0x1A, + 0x9A, 0x0A, 0x60, 0x41, 0xC0, 0x74, 0x71, 0xB7, + 0xC3, 0xB1, 0xA7, 0x52, 0xD6, 0xFC, 0x0B, 0x8B + }, + { + 0xD4, 0x00, 0x60, 0x1F, 0x97, 0x28, 0xCC, 0xC4, + 0xC9, 0x23, 0x42, 0xD9, 0x78, 0x7D, 0x8D, 0x28, + 0xAB, 0x32, 0x3A, 0xF3, 0x75, 0xCA, 0x56, 0x24, + 0xB4, 0xBB, 0x91, 0xD1, 0x72, 0x71, 0xFB, 0xAE, + 0x86, 0x2E, 0x41, 0x3B, 0xE7, 0x3F, 0x1F, 0x68, + 0xE6, 0x15, 0xB8, 0xC5, 0xC3, 0x91, 0xBE, 0x0D, + 0xBD, 0x91, 0x44, 0x74, 0x6E, 0xB3, 0x39, 0xAD, + 0x54, 0x15, 0x47, 0xBA, 0x9C, 0x46, 0x8A, 0x17 + }, + { + 0x79, 0xFE, 0x2F, 0xE1, 0x57, 0xEB, 0x85, 0xA0, + 0x38, 0xAB, 0xB8, 0xEB, 0xBC, 0x64, 0x77, 0x31, + 0xD2, 0xC8, 0x3F, 0x51, 0xB0, 0xAC, 0x6E, 0xE1, + 0x4A, 0xA2, 0x84, 0xCB, 0x6A, 0x35, 0x49, 0xA4, + 0xDC, 0xCE, 0xB3, 0x00, 0x74, 0x0A, 0x82, 0x5F, + 0x52, 0xF5, 0xFB, 0x30, 0xB0, 0x3B, 0x8C, 0x4D, + 0x8B, 0x0F, 0x4A, 0xA6, 0x7A, 0x63, 0xF4, 0xA9, + 0x4E, 0x33, 0x03, 0xC4, 0xED, 0xA4, 0xC0, 0x2B + }, + { + 0x75, 0x35, 0x13, 0x13, 0xB5, 0x2A, 0x85, 0x29, + 0x29, 0x8D, 0x8C, 0x18, 0x6B, 0x17, 0x68, 0x66, + 0x6D, 0xCC, 0xA8, 0x59, 0x53, 0x17, 0xD7, 0xA4, + 0x81, 0x6E, 0xB8, 0x8C, 0x06, 0x20, 0x20, 0xC0, + 0xC8, 0xEF, 0xC5, 0x54, 0xBB, 0x34, 0x1B, 0x64, + 0x68, 0x8D, 0xB5, 0xCC, 0xAF, 0xC3, 0x5F, 0x3C, + 0x3C, 0xD0, 0x9D, 0x65, 0x64, 0xB3, 0x6D, 0x7B, + 0x04, 0xA2, 0x48, 0xE1, 0x46, 0x98, 0x0D, 0x4B + }, + { + 0xE3, 0x12, 0x8B, 0x1D, 0x31, 0x1D, 0x02, 0x17, + 0x9D, 0x7F, 0x25, 0xF9, 0x7A, 0x5A, 0x8B, 0xEE, + 0x2C, 0xC8, 0xC8, 0x63, 0x03, 0x64, 0x4F, 0xCD, + 0x66, 0x4E, 0x15, 0x7D, 0x1F, 0xEF, 0x00, 0xF2, + 0x3E, 0x46, 0xF9, 0xA5, 0xE8, 0xE5, 0xC8, 0x90, + 0xCE, 0x56, 0x5B, 0xB6, 0xAB, 0xD4, 0x30, 0x2C, + 0xE0, 0x64, 0x69, 0xD5, 0x2A, 0x5B, 0xD5, 0x3E, + 0x1C, 0x5A, 0x54, 0xD0, 0x46, 0x49, 0xDC, 0x03 + }, + { + 0xC2, 0x38, 0x2A, 0x72, 0xD2, 0xD3, 0xAC, 0xE9, + 0xD5, 0x93, 0x3D, 0x00, 0xB6, 0x08, 0x27, 0xED, + 0x38, 0x0C, 0xDA, 0x08, 0xD0, 0xBA, 0x5F, 0x6D, + 0xD4, 0x1E, 0x29, 0xEE, 0x6D, 0xBE, 0x8E, 0xCB, + 0x92, 0x35, 0xF0, 0x6B, 0xE9, 0x5D, 0x83, 0xB6, + 0x81, 0x6A, 0x2F, 0xB7, 0xA5, 0xAD, 0x47, 0x03, + 0x5E, 0x8A, 0x4B, 0x69, 0xA4, 0x88, 0x4B, 0x99, + 0xE4, 0xBE, 0xCE, 0x58, 0xCA, 0xB2, 0x5D, 0x44 + }, + { + 0x6B, 0x1C, 0x69, 0x46, 0x0B, 0xBD, 0x50, 0xAC, + 0x2E, 0xD6, 0xF3, 0x2E, 0x6E, 0x88, 0x7C, 0xFE, + 0xD4, 0x07, 0xD4, 0x7D, 0xCF, 0x0A, 0xAA, 0x60, + 0x38, 0x7F, 0xE3, 0x20, 0xD7, 0x80, 0xBD, 0x03, + 0xEA, 0xB6, 0xD7, 0xBA, 0xEB, 0x2A, 0x07, 0xD1, + 0x0C, 0xD5, 0x52, 0xA3, 0x00, 0x34, 0x13, 0x54, + 0xEA, 0x9A, 0x5F, 0x03, 0x18, 0x3A, 0x62, 0x3F, + 0x92, 0xA2, 0xD4, 0xD9, 0xF0, 0x09, 0x26, 0xAF + }, + { + 0x6C, 0xDA, 0x20, 0x6C, 0x80, 0xCD, 0xC9, 0xC4, + 0x4B, 0xA9, 0x90, 0xE0, 0x32, 0x8C, 0x31, 0x4F, + 0x81, 0x9B, 0x14, 0x2D, 0x00, 0x63, 0x04, 0x04, + 0xC4, 0x8C, 0x05, 0xDC, 0x76, 0xD1, 0xB0, 0x0C, + 0xE4, 0xD7, 0x2F, 0xC6, 0xA4, 0x8E, 0x14, 0x69, + 0xDD, 0xEF, 0x60, 0x94, 0x12, 0xC3, 0x64, 0x82, + 0x08, 0x54, 0x21, 0x4B, 0x48, 0x69, 0xAF, 0x09, + 0x0F, 0x00, 0xD3, 0xC1, 0xBA, 0x44, 0x3E, 0x1B + }, + { + 0x7F, 0xFC, 0x8C, 0x26, 0xFB, 0xD6, 0xA0, 0xF7, + 0xA6, 0x09, 0xE6, 0xE1, 0x93, 0x9F, 0x6A, 0x9E, + 0xDF, 0x1B, 0x0B, 0x06, 0x66, 0x41, 0xFB, 0x76, + 0xC4, 0xF9, 0x60, 0x2E, 0xD7, 0x48, 0xD1, 0x16, + 0x02, 0x49, 0x6B, 0x35, 0x35, 0x5B, 0x1A, 0xA2, + 0x55, 0x85, 0x0A, 0x50, 0x9D, 0x2F, 0x8E, 0xE1, + 0x8C, 0x8F, 0x3E, 0x1D, 0x7D, 0xCB, 0xC3, 0x7A, + 0x13, 0x65, 0x98, 0xF5, 0x6A, 0x59, 0xED, 0x17 + }, + { + 0x70, 0xDE, 0x1F, 0x08, 0xDD, 0x4E, 0x09, 0xD5, + 0xFC, 0x15, 0x1F, 0x17, 0xFC, 0x99, 0x1A, 0x23, + 0xAB, 0xFC, 0x05, 0x10, 0x42, 0x90, 0xD5, 0x04, + 0x68, 0x88, 0x2E, 0xFA, 0xF5, 0x82, 0xB6, 0xEC, + 0x2F, 0x14, 0xF5, 0x77, 0xC0, 0xD6, 0x8C, 0x3A, + 0xD0, 0x66, 0x26, 0x91, 0x6E, 0x3C, 0x86, 0xE6, + 0xDA, 0xAB, 0x6C, 0x53, 0xE5, 0x16, 0x3E, 0x82, + 0xB6, 0xBD, 0x0C, 0xE4, 0x9F, 0xC0, 0xD8, 0xDF + }, + { + 0x4F, 0x81, 0x93, 0x57, 0x56, 0xED, 0x35, 0xEE, + 0x20, 0x58, 0xEE, 0x0C, 0x6A, 0x61, 0x10, 0xD6, + 0xFA, 0xC5, 0xCB, 0x6A, 0x4F, 0x46, 0xAA, 0x94, + 0x11, 0x60, 0x3F, 0x99, 0x96, 0x58, 0x23, 0xB6, + 0xDA, 0x48, 0x38, 0x27, 0x6C, 0x5C, 0x06, 0xBC, + 0x78, 0x80, 0xE3, 0x76, 0xD9, 0x27, 0x58, 0x36, + 0x9E, 0xE7, 0x30, 0x5B, 0xCE, 0xC8, 0xD3, 0xCF, + 0xD2, 0x8C, 0xCA, 0xBB, 0x7B, 0x4F, 0x05, 0x79 + }, + { + 0xAB, 0xCB, 0x61, 0xCB, 0x36, 0x83, 0xD1, 0x8F, + 0x27, 0xAD, 0x52, 0x79, 0x08, 0xED, 0x2D, 0x32, + 0xA0, 0x42, 0x6C, 0xB7, 0xBB, 0x4B, 0xF1, 0x80, + 0x61, 0x90, 0x3A, 0x7D, 0xC4, 0x2E, 0x7E, 0x76, + 0xF9, 0x82, 0x38, 0x23, 0x04, 0xD1, 0x8A, 0xF8, + 0xC8, 0x0D, 0x91, 0xDD, 0x58, 0xDD, 0x47, 0xAF, + 0x76, 0xF8, 0xE2, 0xC3, 0x6E, 0x28, 0xAF, 0x24, + 0x76, 0xB4, 0xBC, 0xCF, 0x82, 0xE8, 0x9F, 0xDF + }, + { + 0x02, 0xD2, 0x61, 0xAD, 0x56, 0xA5, 0x26, 0x33, + 0x1B, 0x64, 0x3D, 0xD2, 0x18, 0x6D, 0xE9, 0xA8, + 0x2E, 0x72, 0xA5, 0x82, 0x23, 0xCD, 0x1E, 0x72, + 0x36, 0x86, 0xC5, 0x3D, 0x86, 0x9B, 0x83, 0xB9, + 0x46, 0x32, 0xB7, 0xB6, 0x47, 0xAB, 0x2A, 0xFC, + 0x0D, 0x52, 0x2E, 0x29, 0xDA, 0x3A, 0x56, 0x15, + 0xB7, 0x41, 0xD8, 0x28, 0x52, 0xE0, 0xDF, 0x41, + 0xB6, 0x60, 0x07, 0xDB, 0xCB, 0xA9, 0x05, 0x43 + }, + { + 0xC5, 0x83, 0x27, 0x41, 0xFA, 0x30, 0xC5, 0x43, + 0x68, 0x23, 0x01, 0x53, 0x83, 0xD2, 0x97, 0xFF, + 0x4C, 0x4A, 0x5D, 0x72, 0x76, 0xC3, 0xF9, 0x02, + 0x12, 0x20, 0x66, 0xE0, 0x4B, 0xE5, 0x43, 0x1B, + 0x1A, 0x85, 0xFA, 0xF7, 0x3B, 0x91, 0x84, 0x34, + 0xF9, 0x30, 0x09, 0x63, 0xD1, 0xDE, 0xA9, 0xE8, + 0xAC, 0x39, 0x24, 0xEF, 0x49, 0x02, 0x26, 0xED, + 0xEE, 0xA5, 0xF7, 0x43, 0xE4, 0x10, 0x66, 0x9F + }, + { + 0xCF, 0xAE, 0xAB, 0x26, 0x8C, 0xD0, 0x75, 0xA5, + 0xA6, 0xAE, 0xD5, 0x15, 0x02, 0x3A, 0x03, 0x2D, + 0x54, 0xF2, 0xF2, 0xFF, 0x73, 0x3C, 0xE0, 0xCB, + 0xC7, 0x8D, 0xB5, 0x1D, 0xB4, 0x50, 0x4D, 0x67, + 0x59, 0x23, 0xF8, 0x27, 0x46, 0xD6, 0x59, 0x46, + 0x06, 0xAD, 0x5D, 0x67, 0x73, 0x4B, 0x11, 0xA6, + 0x7C, 0xC6, 0xA4, 0x68, 0xC2, 0x03, 0x2E, 0x43, + 0xCA, 0x1A, 0x94, 0xC6, 0x27, 0x3A, 0x98, 0x5E + }, + { + 0x86, 0x08, 0x50, 0xF9, 0x2E, 0xB2, 0x68, 0x27, + 0x2B, 0x67, 0xD1, 0x33, 0x60, 0x9B, 0xD6, 0x4E, + 0x34, 0xF6, 0x1B, 0xF0, 0x3F, 0x4C, 0x17, 0x38, + 0x64, 0x5C, 0x17, 0xFE, 0xC8, 0x18, 0x46, 0x5D, + 0x7E, 0xCD, 0x2B, 0xE2, 0x90, 0x76, 0x41, 0x13, + 0x00, 0x25, 0xFD, 0xA7, 0x94, 0x70, 0xAB, 0x73, + 0x16, 0x46, 0xE7, 0xF6, 0x94, 0x40, 0xE8, 0x36, + 0x7E, 0xA7, 0x6A, 0xC4, 0xCE, 0xE8, 0xA1, 0xDF + }, + { + 0x84, 0xB1, 0x54, 0xED, 0x29, 0xBB, 0xED, 0xEF, + 0xA6, 0x48, 0x28, 0x68, 0x39, 0x04, 0x6F, 0x4B, + 0x5A, 0xA3, 0x44, 0x30, 0xE2, 0xD6, 0x7F, 0x74, + 0x96, 0xE4, 0xC3, 0x9F, 0x2C, 0x7E, 0xA7, 0x89, + 0x95, 0xF6, 0x9E, 0x12, 0x92, 0x20, 0x00, 0x16, + 0xF1, 0x6A, 0xC3, 0xB3, 0x77, 0x00, 0xE6, 0xC7, + 0xE7, 0x86, 0x1A, 0xFC, 0x39, 0x6B, 0x64, 0xA5, + 0x9A, 0x1D, 0xBF, 0x47, 0xA5, 0x5C, 0x4B, 0xBC + }, + { + 0xAE, 0xEE, 0xC2, 0x60, 0xA5, 0xD8, 0xEF, 0xF5, + 0xCC, 0xAB, 0x8B, 0x95, 0xDA, 0x43, 0x5A, 0x63, + 0xED, 0x7A, 0x21, 0xEA, 0x7F, 0xC7, 0x55, 0x94, + 0x13, 0xFD, 0x61, 0x7E, 0x33, 0x60, 0x9F, 0x8C, + 0x29, 0x0E, 0x64, 0xBB, 0xAC, 0xC5, 0x28, 0xF6, + 0xC0, 0x80, 0x26, 0x22, 0x88, 0xB0, 0xF0, 0xA3, + 0x21, 0x9B, 0xE2, 0x23, 0xC9, 0x91, 0xBE, 0xE9, + 0x2E, 0x72, 0x34, 0x95, 0x93, 0xE6, 0x76, 0x38 + }, + { + 0x8A, 0xD7, 0x8A, 0x9F, 0x26, 0x60, 0x1D, 0x12, + 0x7E, 0x8D, 0x2F, 0x2F, 0x97, 0x6E, 0x63, 0xD1, + 0x9A, 0x05, 0x4A, 0x17, 0xDC, 0xF5, 0x9E, 0x0F, + 0x01, 0x3A, 0xB5, 0x4A, 0x68, 0x87, 0xBB, 0xDF, + 0xFD, 0xE7, 0xAA, 0xAE, 0x11, 0x7E, 0x0F, 0xBF, + 0x32, 0x71, 0x01, 0x65, 0x95, 0xB9, 0xD9, 0xC7, + 0x12, 0xC0, 0x1B, 0x2C, 0x53, 0xE9, 0x65, 0x5A, + 0x38, 0x2B, 0xC4, 0x52, 0x2E, 0x61, 0x66, 0x45 + }, + { + 0x89, 0x34, 0x15, 0x9D, 0xAD, 0xE1, 0xAC, 0x74, + 0x14, 0x7D, 0xFA, 0x28, 0x2C, 0x75, 0x95, 0x4F, + 0xCE, 0xF4, 0x43, 0xEF, 0x25, 0xF8, 0x0D, 0xFE, + 0x9F, 0xB6, 0xEA, 0x63, 0x3B, 0x85, 0x45, 0x11, + 0x1D, 0x08, 0xB3, 0x4E, 0xF4, 0x3F, 0xFF, 0x17, + 0x02, 0x6C, 0x79, 0x64, 0xF5, 0xDE, 0xAC, 0x6D, + 0x2B, 0x3C, 0x29, 0xDA, 0xCF, 0x27, 0x47, 0xF0, + 0x22, 0xDF, 0x59, 0x67, 0xDF, 0xDC, 0x1A, 0x0A + }, + { + 0xCD, 0x36, 0xDD, 0x0B, 0x24, 0x06, 0x14, 0xCF, + 0x2F, 0xA2, 0xB9, 0xE9, 0x59, 0x67, 0x9D, 0xCD, + 0xD7, 0x2E, 0xC0, 0xCD, 0x58, 0xA4, 0x3D, 0xA3, + 0x79, 0x0A, 0x92, 0xF6, 0xCD, 0xEB, 0x9E, 0x1E, + 0x79, 0x5E, 0x47, 0x8A, 0x0A, 0x47, 0xD3, 0x71, + 0x10, 0x0D, 0x34, 0x0C, 0x5C, 0xED, 0xCD, 0xBB, + 0xC9, 0xE6, 0x8B, 0x3F, 0x46, 0x08, 0x18, 0xE5, + 0xBD, 0xFF, 0x7B, 0x4C, 0xDA, 0x4C, 0x27, 0x44 + }, + { + 0x00, 0xDF, 0x4E, 0x09, 0x9B, 0x80, 0x71, 0x37, + 0xA8, 0x59, 0x90, 0xF4, 0x9D, 0x3A, 0x94, 0x31, + 0x5E, 0x5A, 0x5F, 0x7F, 0x7A, 0x60, 0x76, 0xB3, + 0x03, 0xE9, 0x6B, 0x05, 0x6F, 0xB9, 0x38, 0x00, + 0x11, 0x1F, 0x47, 0x96, 0x28, 0xE2, 0xF8, 0xDB, + 0x59, 0xAE, 0xB6, 0xAC, 0x70, 0xC3, 0xB6, 0x1F, + 0x51, 0xF9, 0xB4, 0x6E, 0x80, 0xFF, 0xDE, 0xAE, + 0x25, 0xEB, 0xDD, 0xB4, 0xAF, 0x6C, 0xB4, 0xEE + }, + { + 0x2B, 0x9C, 0x95, 0x5E, 0x6C, 0xAE, 0xD4, 0xB7, + 0xC9, 0xE2, 0x46, 0xB8, 0x6F, 0x9A, 0x17, 0x26, + 0xE8, 0x10, 0xC5, 0x9D, 0x12, 0x6C, 0xEE, 0x66, + 0xED, 0x71, 0xBF, 0x01, 0x5B, 0x83, 0x55, 0x8A, + 0x4B, 0x6D, 0x84, 0xD1, 0x8D, 0xC3, 0xFF, 0x46, + 0x20, 0xC2, 0xFF, 0xB7, 0x22, 0x35, 0x9F, 0xDE, + 0xF8, 0x5B, 0xA0, 0xD4, 0xE2, 0xD2, 0x2E, 0xCB, + 0xE0, 0xED, 0x78, 0x4F, 0x99, 0xAF, 0xE5, 0x87 + }, + { + 0x18, 0x1D, 0xF0, 0xA2, 0x61, 0xA2, 0xF7, 0xD2, + 0x9E, 0xA5, 0xA1, 0x57, 0x72, 0x71, 0x51, 0x05, + 0xD4, 0x50, 0xA4, 0xB6, 0xC2, 0x36, 0xF6, 0x99, + 0xF4, 0x62, 0xD6, 0x0C, 0xA7, 0x64, 0x87, 0xFE, + 0xED, 0xFC, 0x9F, 0x5E, 0xB9, 0x2D, 0xF8, 0x38, + 0xE8, 0xFB, 0x5D, 0xC3, 0x69, 0x4E, 0x84, 0xC5, + 0xE0, 0xF4, 0xA1, 0x0B, 0x76, 0x1F, 0x50, 0x67, + 0x62, 0xBE, 0x05, 0x2C, 0x74, 0x5A, 0x6E, 0xE8 + }, + { + 0x21, 0xFB, 0x20, 0x34, 0x58, 0xBF, 0x3A, 0x7E, + 0x9A, 0x80, 0x43, 0x9F, 0x9A, 0x90, 0x28, 0x99, + 0xCD, 0x5D, 0xE0, 0x13, 0x9D, 0xFD, 0x56, 0xF7, + 0x11, 0x0C, 0x9D, 0xEC, 0x84, 0x37, 0xB2, 0x6B, + 0xDA, 0x63, 0xDE, 0x2F, 0x56, 0x59, 0x26, 0xD8, + 0x5E, 0xDB, 0x1D, 0x6C, 0x68, 0x25, 0x66, 0x97, + 0x43, 0xDD, 0x99, 0x92, 0x65, 0x3D, 0x13, 0x97, + 0x95, 0x44, 0xD5, 0xDC, 0x82, 0x28, 0xBF, 0xAA + }, + { + 0xEF, 0x02, 0x1F, 0x29, 0xC5, 0xFF, 0xB8, 0x30, + 0xE6, 0x4B, 0x9A, 0xA9, 0x05, 0x8D, 0xD6, 0x60, + 0xFD, 0x2F, 0xCB, 0x81, 0xC4, 0x97, 0xA7, 0xE6, + 0x98, 0xBC, 0xFB, 0xF5, 0x9D, 0xE5, 0xAD, 0x4A, + 0x86, 0xFF, 0x93, 0xC1, 0x0A, 0x4B, 0x9D, 0x1A, + 0xE5, 0x77, 0x47, 0x25, 0xF9, 0x07, 0x2D, 0xCD, + 0xE9, 0xE1, 0xF1, 0x99, 0xBA, 0xB9, 0x1F, 0x8B, + 0xFF, 0x92, 0x18, 0x64, 0xAA, 0x50, 0x2E, 0xEE + }, + { + 0xB3, 0xCF, 0xDA, 0x40, 0x52, 0x6B, 0x7F, 0x1D, + 0x37, 0x56, 0x9B, 0xDF, 0xCD, 0xF9, 0x11, 0xE5, + 0xA6, 0xEF, 0xE6, 0xB2, 0xEC, 0x90, 0xA0, 0x45, + 0x4C, 0x47, 0xB2, 0xC0, 0x46, 0xBF, 0x13, 0x0F, + 0xC3, 0xB3, 0x52, 0xB3, 0x4D, 0xF4, 0x81, 0x3D, + 0x48, 0xD3, 0x3A, 0xB8, 0xE2, 0x69, 0xB6, 0x9B, + 0x07, 0x56, 0x76, 0xCB, 0x6D, 0x00, 0xA8, 0xDC, + 0xF9, 0xE1, 0xF9, 0x67, 0xEC, 0x19, 0x1B, 0x2C + }, + { + 0xB4, 0xC6, 0xC3, 0xB2, 0x67, 0x07, 0x1E, 0xEF, + 0xB9, 0xC8, 0xC7, 0x2E, 0x0E, 0x2B, 0x94, 0x12, + 0x93, 0x64, 0x1F, 0x86, 0x73, 0xCB, 0x70, 0xC1, + 0xCC, 0x26, 0xAD, 0x1E, 0x73, 0xCF, 0x14, 0x17, + 0x55, 0x86, 0x0A, 0xD1, 0x9B, 0x34, 0xC2, 0xF3, + 0x4E, 0xD3, 0x5B, 0xB5, 0x2E, 0xC4, 0x50, 0x7C, + 0xC1, 0xFE, 0x59, 0x04, 0x77, 0x43, 0xA5, 0xF0, + 0xC6, 0xFE, 0xBD, 0xE6, 0x25, 0xE2, 0x60, 0x91 + }, + { + 0x57, 0xA3, 0x4F, 0x2B, 0xCC, 0xA6, 0x0D, 0x4B, + 0x85, 0x10, 0x3B, 0x83, 0x0C, 0x9D, 0x79, 0x52, + 0xA4, 0x16, 0xBE, 0x52, 0x63, 0xAE, 0x42, 0x9C, + 0x9E, 0x5E, 0x53, 0xFE, 0x85, 0x90, 0xA8, 0xF7, + 0x8E, 0xC6, 0x5A, 0x51, 0x10, 0x9E, 0xA8, 0x5D, + 0xCD, 0xF7, 0xB6, 0x22, 0x3F, 0x9F, 0x2B, 0x34, + 0x05, 0x39, 0xFA, 0xD8, 0x19, 0x23, 0xDB, 0xF8, + 0xED, 0xAB, 0xF9, 0x51, 0x29, 0xE4, 0xDF, 0xF6 + }, + { + 0x9C, 0xF4, 0x66, 0x62, 0xFC, 0xD6, 0x1A, 0x23, + 0x22, 0x77, 0xB6, 0x85, 0x66, 0x3B, 0x8B, 0x5D, + 0xA8, 0x32, 0xDF, 0xD9, 0xA3, 0xB8, 0xCC, 0xFE, + 0xEC, 0x99, 0x3E, 0xC6, 0xAC, 0x41, 0x5A, 0xD0, + 0x7E, 0x04, 0x8A, 0xDF, 0xE4, 0x14, 0xDF, 0x27, + 0x27, 0x70, 0xDB, 0xA8, 0x67, 0xDA, 0x5C, 0x12, + 0x24, 0xC6, 0xFD, 0x0A, 0xA0, 0xC2, 0x18, 0x7D, + 0x42, 0x6A, 0xC6, 0x47, 0xE9, 0x88, 0x73, 0x61 + }, + { + 0x5C, 0xE1, 0x04, 0x2A, 0xB4, 0xD5, 0x42, 0xC2, + 0xF9, 0xEE, 0x9D, 0x17, 0x26, 0x2A, 0xF8, 0x16, + 0x40, 0x98, 0x93, 0x5B, 0xEF, 0x17, 0x3D, 0x0E, + 0x18, 0x48, 0x9B, 0x04, 0x84, 0x17, 0x46, 0xCD, + 0x2F, 0x2D, 0xF8, 0x66, 0xBD, 0x7D, 0xA6, 0xE5, + 0xEF, 0x90, 0x24, 0xC6, 0x48, 0x02, 0x3E, 0xC7, + 0x23, 0xAB, 0x9C, 0x62, 0xFD, 0x80, 0x28, 0x57, + 0x39, 0xD8, 0x4F, 0x15, 0xD2, 0xAB, 0x51, 0x5A + }, + { + 0x84, 0x88, 0x39, 0x6B, 0xD4, 0xA8, 0x72, 0x9B, + 0x7A, 0x47, 0x31, 0x78, 0xF2, 0x32, 0xDA, 0xDF, + 0x3F, 0x0F, 0x8E, 0x22, 0x67, 0x8B, 0xA5, 0xA4, + 0x3E, 0x04, 0x1E, 0x72, 0xDA, 0x1E, 0x2C, 0xF8, + 0x21, 0x94, 0xC3, 0x07, 0x20, 0x7A, 0x54, 0xCB, + 0x81, 0x56, 0x29, 0x33, 0x39, 0xEA, 0xEC, 0x69, + 0x3F, 0xF6, 0x6B, 0xFC, 0xD5, 0xEF, 0xC6, 0x5E, + 0x95, 0xE4, 0xEC, 0xAF, 0x54, 0x53, 0x0A, 0xBD + }, + { + 0xF5, 0x98, 0xDA, 0x90, 0x1C, 0x38, 0x35, 0xBC, + 0xA5, 0x60, 0x77, 0x90, 0x37, 0xDF, 0xDE, 0x9F, + 0x0C, 0x51, 0xDC, 0x61, 0xC0, 0xB7, 0x60, 0xFC, + 0x15, 0x22, 0xD7, 0xB4, 0x70, 0xEE, 0x63, 0xF5, + 0xBD, 0xC6, 0x49, 0x84, 0x76, 0xE8, 0x60, 0x49, + 0xAD, 0x86, 0xE4, 0xE2, 0x1A, 0xF2, 0x85, 0x4A, + 0x98, 0x4C, 0xC9, 0x05, 0x42, 0x7D, 0x2F, 0x17, + 0xF6, 0x6B, 0x1F, 0x41, 0xC3, 0xDA, 0x6F, 0x61 + }, + { + 0x5F, 0x93, 0x26, 0x97, 0x98, 0xCF, 0x02, 0x13, + 0x21, 0x07, 0x33, 0x76, 0x60, 0xA8, 0xD7, 0xA1, + 0x77, 0x35, 0x4C, 0x02, 0x12, 0xEB, 0x93, 0xE5, + 0x55, 0xE7, 0xC3, 0x7A, 0x08, 0xAE, 0xF3, 0xD8, + 0xDC, 0xE0, 0x12, 0x17, 0x01, 0x1C, 0xD9, 0x65, + 0xC0, 0x4D, 0xD2, 0xC1, 0x05, 0xF2, 0xE2, 0xB6, + 0xCA, 0xE5, 0xE4, 0xE6, 0xBC, 0xAF, 0x09, 0xDF, + 0xBE, 0xE3, 0xE0, 0xA6, 0xA6, 0x35, 0x7C, 0x37 + }, + { + 0x0E, 0xCF, 0x58, 0x1D, 0x47, 0xBA, 0xC9, 0x23, + 0x09, 0x86, 0xFA, 0xAB, 0xD7, 0x0C, 0x2F, 0x5B, + 0x80, 0xE9, 0x10, 0x66, 0xF0, 0xEC, 0x55, 0xA8, + 0x42, 0x93, 0x78, 0x82, 0x28, 0x6D, 0x2C, 0xA0, + 0x07, 0xBB, 0x4E, 0x97, 0x3B, 0x0B, 0x09, 0x1D, + 0x52, 0x16, 0x7F, 0xF7, 0xC4, 0x00, 0x9C, 0x7A, + 0xB4, 0xAD, 0x38, 0xFF, 0xF1, 0xDC, 0xEA, 0xCD, + 0xB7, 0xBE, 0x81, 0xEF, 0x4A, 0x45, 0x29, 0x52 + }, + { + 0x5A, 0xEC, 0xA8, 0xAB, 0xE1, 0x52, 0x85, 0x82, + 0xB2, 0xA3, 0x07, 0xB4, 0x00, 0x95, 0x85, 0x49, + 0x8A, 0x3D, 0x46, 0x7C, 0xA6, 0x10, 0x1C, 0xB0, + 0xC5, 0x12, 0x6F, 0x99, 0x76, 0x05, 0x6E, 0x9F, + 0xFC, 0x12, 0x3C, 0xC2, 0x0C, 0x30, 0x2B, 0x2A, + 0x73, 0x7F, 0x49, 0x2C, 0x75, 0xD2, 0x1F, 0x01, + 0x51, 0x2C, 0x90, 0xCA, 0x05, 0x41, 0xDF, 0xA5, + 0x6E, 0x95, 0x0A, 0x32, 0x1D, 0xCB, 0x28, 0xD8 + }, + { + 0x73, 0x2F, 0xBF, 0x8F, 0x1C, 0xB2, 0xB8, 0x32, + 0x92, 0x63, 0xED, 0xE2, 0x78, 0x58, 0xFE, 0x46, + 0xF8, 0xD3, 0x35, 0x4D, 0x37, 0x6B, 0xCD, 0xA0, + 0x54, 0x8E, 0x7C, 0xE1, 0xFA, 0x9D, 0xD1, 0x1F, + 0x85, 0xEB, 0x66, 0x1F, 0xE9, 0x50, 0xB5, 0x43, + 0xAA, 0x63, 0x5C, 0xA4, 0xD3, 0xF0, 0x4E, 0xDE, + 0x5B, 0x32, 0xD6, 0xB6, 0x56, 0xE5, 0xCE, 0x1C, + 0x44, 0xD3, 0x5C, 0x4A, 0x6C, 0x56, 0xCF, 0xF8 + }, + { + 0xD5, 0xE9, 0x38, 0x73, 0x5D, 0x63, 0x78, 0x8C, + 0x80, 0x10, 0x0A, 0xEF, 0xD1, 0x86, 0x48, 0xD1, + 0x8C, 0xF2, 0x72, 0xF6, 0x9F, 0x20, 0xFF, 0x24, + 0xCF, 0xE2, 0x89, 0x5C, 0x08, 0x8A, 0xD0, 0x8B, + 0x01, 0x04, 0xDA, 0x16, 0x72, 0xA4, 0xEB, 0x26, + 0xFC, 0x52, 0x54, 0x5C, 0xC7, 0xD7, 0xA0, 0x1B, + 0x26, 0x6C, 0xF5, 0x46, 0xC4, 0x03, 0xC4, 0x5B, + 0xD1, 0x29, 0xEB, 0x41, 0xBD, 0xD9, 0x20, 0x0B + }, + { + 0x65, 0xA2, 0x45, 0xB4, 0x93, 0x52, 0xEE, 0x29, + 0x7D, 0x91, 0xAF, 0x8C, 0x8B, 0xE0, 0x05, 0x28, + 0xAC, 0x6E, 0x04, 0x6D, 0xD8, 0x3A, 0xC7, 0xBD, + 0x46, 0x5A, 0x98, 0x81, 0x6D, 0xD6, 0x8F, 0x3E, + 0x00, 0xE1, 0xAE, 0x8F, 0x89, 0x53, 0x27, 0xA7, + 0xE9, 0xA8, 0xC9, 0x32, 0x65, 0x98, 0x37, 0x9A, + 0x29, 0xC9, 0xFC, 0x91, 0xEC, 0x0C, 0x6E, 0xEF, + 0x08, 0xF3, 0xE2, 0xB2, 0x16, 0xC1, 0x10, 0x08 + }, + { + 0xC9, 0x56, 0x54, 0xB6, 0x30, 0x19, 0x13, 0x0A, + 0xB4, 0x5D, 0xD0, 0xFB, 0x49, 0x41, 0xB9, 0x8A, + 0xEB, 0x3A, 0xF2, 0xA1, 0x23, 0x91, 0x3E, 0xCA, + 0x2C, 0xE9, 0x9B, 0x3E, 0x97, 0x41, 0x0A, 0x7B, + 0xF8, 0x66, 0x1C, 0xC7, 0xFB, 0xAA, 0x2B, 0xC1, + 0xCF, 0x2B, 0x13, 0x11, 0x3B, 0x1E, 0xD4, 0x0A, + 0x01, 0x18, 0xB8, 0x8E, 0x5F, 0xFF, 0xC3, 0x54, + 0x27, 0x59, 0xEA, 0x00, 0x7E, 0xD4, 0xC5, 0x8D + }, + { + 0x1E, 0xB2, 0x62, 0xF3, 0x8F, 0xA4, 0x94, 0x43, + 0x1F, 0x01, 0x7D, 0xAD, 0x44, 0xC0, 0xDF, 0xB6, + 0x93, 0x24, 0xAC, 0x03, 0x2F, 0x04, 0xB6, 0x57, + 0xFC, 0x91, 0xA8, 0x86, 0x47, 0xBB, 0x74, 0x76, + 0x0F, 0x24, 0xE7, 0xC9, 0x56, 0x51, 0x4F, 0x0C, + 0xF0, 0x02, 0x99, 0x0B, 0x18, 0x2C, 0x16, 0x42, + 0xB9, 0xB2, 0x42, 0x6E, 0x96, 0xA6, 0x11, 0x87, + 0xE4, 0xE0, 0x12, 0xF0, 0x0E, 0x21, 0x7D, 0x84 + }, + { + 0x3B, 0x95, 0x5A, 0xEE, 0xBF, 0xA5, 0x15, 0x1A, + 0xC1, 0xAB, 0x8E, 0x3F, 0x5C, 0xC1, 0xE3, 0x76, + 0x70, 0x84, 0xC8, 0x42, 0xA5, 0x75, 0xD3, 0x62, + 0x69, 0x83, 0x6E, 0x97, 0x35, 0x3D, 0x41, 0x62, + 0x2B, 0x73, 0x1D, 0xDD, 0xCD, 0x5F, 0x26, 0x95, + 0x50, 0xA3, 0xA5, 0xB8, 0x7B, 0xE1, 0xE9, 0x03, + 0x26, 0x34, 0x0B, 0x6E, 0x0E, 0x62, 0x55, 0x58, + 0x15, 0xD9, 0x60, 0x05, 0x97, 0xAC, 0x6E, 0xF9 + }, + { + 0x68, 0x28, 0x9F, 0x66, 0x05, 0x47, 0x3B, 0xA0, + 0xE4, 0xF2, 0x41, 0xBA, 0xF7, 0x47, 0x7A, 0x98, + 0x85, 0x42, 0x6A, 0x85, 0x8F, 0x19, 0xEF, 0x2A, + 0x18, 0xB0, 0xD4, 0x0E, 0xF8, 0xE4, 0x12, 0x82, + 0xED, 0x55, 0x26, 0xB5, 0x19, 0x79, 0x9E, 0x27, + 0x0F, 0x13, 0x88, 0x13, 0x27, 0x91, 0x82, 0x78, + 0x75, 0x57, 0x11, 0x07, 0x1D, 0x85, 0x11, 0xFE, + 0x96, 0x3E, 0x3B, 0x56, 0x06, 0xAA, 0x37, 0x16 + }, + { + 0x80, 0xA3, 0x37, 0x87, 0x54, 0x26, 0x12, 0xC3, + 0x8F, 0x6B, 0xCD, 0x7C, 0xD8, 0x6C, 0xAB, 0x46, + 0x02, 0x27, 0x50, 0x9B, 0x1C, 0xBA, 0xD5, 0xEC, + 0x40, 0x8A, 0x91, 0x41, 0x3D, 0x51, 0x15, 0x5A, + 0x04, 0x76, 0xDA, 0xDB, 0xF3, 0xA2, 0x51, 0x8E, + 0x4A, 0x6E, 0x77, 0xCC, 0x34, 0x66, 0x22, 0xE3, + 0x47, 0xA4, 0x69, 0xBF, 0x8B, 0xAA, 0x5F, 0x04, + 0xEB, 0x2D, 0x98, 0x70, 0x53, 0x55, 0xD0, 0x63 + }, + { + 0x34, 0x62, 0x9B, 0xC6, 0xD8, 0x31, 0x39, 0x1C, + 0x4C, 0xDF, 0x8A, 0xF1, 0xB4, 0xB7, 0xB6, 0xB8, + 0xE8, 0xEE, 0x17, 0xCF, 0x98, 0xC7, 0x0E, 0x5D, + 0xD5, 0x86, 0xCD, 0x99, 0xF1, 0x4B, 0x11, 0xDF, + 0x94, 0x51, 0x66, 0x23, 0x6A, 0x95, 0x71, 0xE6, + 0xD5, 0x91, 0xBB, 0x83, 0xEE, 0x4D, 0x16, 0x4D, + 0x46, 0xF6, 0xB9, 0xD8, 0xEF, 0x86, 0xFF, 0x86, + 0x5A, 0x81, 0xBF, 0xB9, 0x1B, 0x00, 0x42, 0x4B + }, + { + 0x8B, 0x7C, 0xC3, 0x39, 0x16, 0x38, 0x63, 0xBB, + 0x43, 0x83, 0xE5, 0x42, 0xB0, 0xEF, 0x0E, 0x7C, + 0xF3, 0x6B, 0x84, 0xAD, 0x93, 0x2C, 0xDF, 0x5A, + 0x80, 0x41, 0x9E, 0xC9, 0xAD, 0x69, 0x2E, 0x7A, + 0x7E, 0x78, 0x4D, 0x2C, 0x7C, 0xB3, 0x79, 0x6A, + 0x18, 0xB8, 0xF8, 0x00, 0x03, 0x5F, 0x3A, 0xA0, + 0x6C, 0x82, 0x41, 0x00, 0x61, 0x11, 0x20, 0xA7, + 0xBD, 0xEB, 0x35, 0x61, 0x8C, 0xCB, 0x81, 0xB7 + }, + { + 0x4F, 0x08, 0x4E, 0x49, 0x39, 0xDD, 0x5A, 0x7F, + 0x5A, 0x65, 0x8F, 0xAD, 0x58, 0xA1, 0x8A, 0x15, + 0xC2, 0x5C, 0x32, 0xEC, 0x1C, 0x7F, 0xD5, 0xC5, + 0xC6, 0xC3, 0xE8, 0x92, 0xB3, 0x97, 0x1A, 0xEA, + 0xAC, 0x30, 0x83, 0x04, 0xEF, 0x17, 0xB1, 0xC4, + 0x72, 0x39, 0xEA, 0x4B, 0xB3, 0x98, 0xB3, 0xFD, + 0x6D, 0x45, 0x28, 0xD8, 0xDE, 0x8E, 0x76, 0x8A, + 0xE0, 0xF1, 0xA5, 0xA5, 0xC6, 0xB5, 0xC2, 0x97 + }, + { + 0x48, 0xF4, 0x07, 0xA1, 0xAF, 0x5B, 0x80, 0x09, + 0xB2, 0x05, 0x17, 0x42, 0xE8, 0xCF, 0x5C, 0xD5, + 0x65, 0x66, 0x69, 0xE7, 0xD7, 0x22, 0xEE, 0x8E, + 0x7B, 0xD2, 0x02, 0x06, 0x08, 0x49, 0x44, 0x21, + 0x68, 0xD8, 0xFA, 0xCC, 0x11, 0x7C, 0x01, 0x2B, + 0xFB, 0x7B, 0xF4, 0x49, 0xD9, 0x9B, 0xEF, 0xFF, + 0x6A, 0x34, 0xAE, 0xA2, 0x03, 0xF1, 0xD8, 0xD3, + 0x52, 0x72, 0x2B, 0xE5, 0x01, 0x4E, 0xC8, 0x18 + }, + { + 0xA6, 0xAA, 0x82, 0xCD, 0x1E, 0x42, 0x6F, 0x9A, + 0x73, 0xBF, 0xA3, 0x9A, 0x29, 0x03, 0x78, 0x76, + 0x11, 0x46, 0x55, 0xB8, 0xC2, 0x2D, 0x6D, 0x3F, + 0xF8, 0xB6, 0x38, 0xAE, 0x7D, 0xEA, 0x6B, 0x17, + 0x84, 0x3E, 0x09, 0xE5, 0x2E, 0xB6, 0x6F, 0xA1, + 0xE4, 0x75, 0xE4, 0xA8, 0xA3, 0xDE, 0x42, 0x9B, + 0x7D, 0x0F, 0x4A, 0x77, 0x6F, 0xCB, 0x8B, 0xDC, + 0x9B, 0x9F, 0xED, 0xE7, 0xD5, 0x2E, 0x81, 0x5F + }, + { + 0x58, 0x17, 0x02, 0x7D, 0x6B, 0xDD, 0x00, 0xC5, + 0xDD, 0x10, 0xAC, 0x59, 0x3C, 0xD5, 0x60, 0x37, + 0x22, 0x70, 0x77, 0x5A, 0x18, 0x52, 0x6D, 0x7E, + 0x6F, 0x13, 0x87, 0x2A, 0x2E, 0x20, 0xEA, 0xB6, + 0x64, 0x62, 0x5B, 0xE7, 0x16, 0x8A, 0xC4, 0xBD, + 0x7C, 0x9E, 0x0C, 0xE7, 0xFC, 0x40, 0x99, 0xE0, + 0xF4, 0x84, 0x42, 0xE2, 0xC7, 0x67, 0x19, 0x1C, + 0x6E, 0x12, 0x84, 0xE9, 0xB2, 0xCC, 0xEA, 0x8C + }, + { + 0x08, 0xE4, 0x10, 0x28, 0x34, 0x0A, 0x45, 0xC7, + 0x4E, 0x40, 0x52, 0xB3, 0xA8, 0xD6, 0x38, 0x9E, + 0x22, 0xE0, 0x43, 0xA1, 0xAD, 0xAB, 0x5E, 0x28, + 0xD9, 0x76, 0x19, 0x45, 0x0D, 0x72, 0x34, 0x69, + 0xB6, 0x20, 0xCA, 0xA5, 0x19, 0xB8, 0x1C, 0x14, + 0x52, 0x38, 0x54, 0xF6, 0x19, 0xFD, 0x30, 0x27, + 0xE3, 0x84, 0x7B, 0xD0, 0x32, 0x76, 0xE6, 0x06, + 0x04, 0xA8, 0x0D, 0xDB, 0x4D, 0xE8, 0x76, 0xD6 + }, + { + 0x13, 0x0B, 0x84, 0x20, 0x53, 0x7E, 0xB0, 0x7D, + 0x72, 0xAB, 0xDA, 0x07, 0xC8, 0x5A, 0xCB, 0xD8, + 0xB9, 0xA4, 0x4F, 0x16, 0x32, 0x1D, 0xD0, 0x42, + 0x21, 0x45, 0xF8, 0x09, 0x67, 0x3D, 0x30, 0xF2, + 0xB5, 0x32, 0x13, 0x26, 0xE2, 0xBF, 0xF3, 0x17, + 0xEF, 0x3F, 0xEF, 0x98, 0x3C, 0x51, 0xC4, 0xF8, + 0xAB, 0x24, 0xA3, 0x25, 0xD2, 0x98, 0xE3, 0x4A, + 0xFC, 0xE5, 0x69, 0xA8, 0x25, 0x55, 0x77, 0x4C + }, + { + 0xAC, 0x49, 0xB8, 0x44, 0xAF, 0xAA, 0x01, 0x2E, + 0x31, 0xC4, 0x74, 0xCA, 0x26, 0x36, 0x48, 0x84, + 0x4F, 0xD2, 0xF6, 0x30, 0x79, 0x92, 0xC2, 0xF7, + 0x52, 0xAC, 0xA0, 0x2C, 0x38, 0x28, 0x96, 0x51, + 0x75, 0x79, 0x4D, 0xEE, 0xE2, 0xD2, 0xEE, 0x95, + 0xC6, 0x1C, 0xD2, 0x84, 0xF6, 0xB5, 0xA2, 0xD7, + 0x5E, 0x2E, 0xF2, 0xB2, 0x9E, 0xE8, 0x14, 0x9E, + 0x77, 0xFB, 0x81, 0x44, 0x7B, 0x2F, 0xD0, 0x4B + }, + { + 0xB9, 0xD7, 0xCA, 0x81, 0xCC, 0x60, 0xBB, 0x95, + 0x78, 0xE4, 0x40, 0x24, 0xE5, 0xA0, 0xA0, 0xBE, + 0x80, 0xF2, 0x73, 0x36, 0xA6, 0xA9, 0xF4, 0xE5, + 0x3D, 0xF3, 0x99, 0x9C, 0xB1, 0x91, 0x28, 0x0B, + 0x09, 0x0E, 0x2A, 0xC2, 0xD2, 0x9C, 0x5B, 0xAA, + 0xD9, 0xD7, 0x14, 0x15, 0xBD, 0xC1, 0x29, 0xE6, + 0x9A, 0xA2, 0x66, 0x7A, 0xF6, 0xA7, 0xFD, 0x5E, + 0x18, 0x9F, 0xCC, 0xDC, 0xEE, 0x81, 0x73, 0x40 + }, + { + 0xA7, 0x55, 0xE1, 0x13, 0x38, 0x65, 0x72, 0xC7, + 0x5C, 0xED, 0x61, 0xD7, 0x19, 0x70, 0x60, 0x70, + 0xB9, 0x14, 0x60, 0x48, 0xE4, 0x2A, 0x9F, 0x8C, + 0xD3, 0x56, 0x67, 0xA0, 0x88, 0xB4, 0x2F, 0x08, + 0x80, 0x8A, 0xBD, 0xF7, 0x7E, 0x61, 0x8A, 0xBD, + 0x95, 0x9A, 0xFC, 0x75, 0x73, 0x79, 0xCA, 0x2C, + 0x00, 0xBC, 0xC1, 0xA4, 0x83, 0x90, 0xFA, 0x2B, + 0xFF, 0x61, 0x8B, 0x1E, 0x00, 0x78, 0xA6, 0x13 + }, + { + 0xA7, 0x3C, 0x7D, 0xEB, 0xED, 0x32, 0x6F, 0x1C, + 0x0D, 0xB0, 0x79, 0x5E, 0xE7, 0xD6, 0xE3, 0x94, + 0x68, 0x94, 0xB8, 0x26, 0xB1, 0xF8, 0x10, 0x1C, + 0x56, 0xC8, 0x23, 0xBA, 0x17, 0x16, 0x83, 0x12, + 0xE7, 0xF5, 0x3F, 0xC7, 0xDB, 0xE5, 0x2C, 0x3E, + 0x11, 0xE6, 0x98, 0x52, 0xC4, 0x04, 0x85, 0xE2, + 0xEF, 0x18, 0x24, 0x77, 0x86, 0x2E, 0xA6, 0xA3, + 0x4E, 0xC1, 0x36, 0xE2, 0xDF, 0xEE, 0xA6, 0xF4 + }, + { + 0x6C, 0xB8, 0xF9, 0xD5, 0x2C, 0x56, 0xD8, 0x2C, + 0xAC, 0x28, 0xF3, 0x9E, 0xA1, 0x59, 0x3E, 0x8B, + 0xB2, 0x50, 0x62, 0x93, 0xAC, 0x0D, 0x68, 0x37, + 0x6A, 0x17, 0x09, 0xB6, 0x2A, 0x46, 0xDF, 0x14, + 0xA4, 0xAE, 0x64, 0xB2, 0xD8, 0xFA, 0xB7, 0x67, + 0x33, 0xA1, 0xCE, 0xD2, 0xD5, 0x48, 0xE3, 0xF3, + 0xC6, 0xFC, 0xB4, 0x9D, 0x40, 0xC3, 0xD5, 0x80, + 0x8E, 0x44, 0x9C, 0xD8, 0x3D, 0x1C, 0x2A, 0xA2 + }, + { + 0x68, 0x3F, 0xA2, 0xB2, 0x36, 0x9A, 0x10, 0x16, + 0x2C, 0x1C, 0x1C, 0x7B, 0x24, 0xBC, 0x97, 0x0E, + 0xE6, 0x7D, 0xA2, 0x20, 0x56, 0x4F, 0x32, 0x20, + 0x3F, 0x62, 0x56, 0x96, 0xC0, 0x35, 0x2A, 0x0B, + 0x9A, 0xD9, 0x66, 0x24, 0x36, 0x2D, 0x95, 0x2D, + 0x84, 0x46, 0x3C, 0x11, 0x06, 0xA2, 0xDB, 0xA7, + 0xA0, 0x92, 0x59, 0x98, 0x84, 0xB3, 0x5A, 0x0B, + 0x89, 0xC8, 0xF1, 0xB6, 0xA9, 0xB5, 0xA6, 0x1E + }, + { + 0xAA, 0xD9, 0xAD, 0x44, 0x61, 0x01, 0x18, 0xB7, + 0x7D, 0x50, 0x8A, 0xEB, 0x1B, 0xBC, 0xD1, 0xC1, + 0xB7, 0xD0, 0x17, 0x13, 0x97, 0xFB, 0x51, 0x0A, + 0x40, 0x1B, 0xBC, 0x0E, 0xC3, 0x46, 0x23, 0x67, + 0x0D, 0x86, 0xA2, 0xDC, 0x3C, 0x8F, 0x3A, 0xB5, + 0xA2, 0x04, 0x4D, 0xF7, 0x30, 0x25, 0x67, 0x27, + 0x54, 0x5F, 0x08, 0x60, 0xCE, 0x21, 0xA1, 0xEA, + 0xC7, 0x17, 0xDF, 0xC4, 0x8F, 0x5D, 0x22, 0x8E + }, + { + 0xC4, 0x25, 0x78, 0xDE, 0x23, 0xB4, 0xC9, 0x87, + 0xD5, 0xE1, 0xAC, 0x4D, 0x68, 0x9E, 0xD5, 0xDE, + 0x4B, 0x04, 0x17, 0xF9, 0x70, 0x4B, 0xC6, 0xBC, + 0xE9, 0x69, 0xFA, 0x13, 0x47, 0x15, 0x85, 0xD6, + 0x2C, 0x2C, 0xB1, 0x21, 0x2A, 0x94, 0x4F, 0x39, + 0x7F, 0xC9, 0xCA, 0x2C, 0x37, 0x47, 0xC3, 0xBE, + 0xB6, 0x94, 0xEC, 0x4C, 0x5B, 0xE6, 0x88, 0x28, + 0xDD, 0xA5, 0x3E, 0xF4, 0x3F, 0xAE, 0xC6, 0xC0 + }, + { + 0x47, 0x0F, 0x00, 0x84, 0x1E, 0xE8, 0x24, 0x4E, + 0x63, 0xED, 0x2C, 0x7E, 0xA3, 0x0E, 0x2E, 0x41, + 0x98, 0x97, 0xC1, 0x97, 0x46, 0x2E, 0xCC, 0xCE, + 0xCF, 0x71, 0x3B, 0x42, 0xA5, 0x06, 0x5F, 0xFF, + 0x59, 0x14, 0xBC, 0x9B, 0x79, 0xAF, 0xFE, 0x8F, + 0x6B, 0x65, 0x78, 0x75, 0xE7, 0x89, 0xAE, 0x21, + 0x3B, 0xD9, 0x14, 0xCD, 0x35, 0xBD, 0x17, 0x4D, + 0x46, 0xE9, 0xD1, 0x8B, 0xD8, 0x43, 0x77, 0x3D + }, + { + 0x34, 0xFC, 0x42, 0x13, 0x73, 0x0F, 0x47, 0xA5, + 0xE9, 0xA3, 0x58, 0x0F, 0x64, 0x3E, 0x12, 0x94, + 0x5C, 0xFC, 0xB3, 0x1B, 0xF2, 0x06, 0xF6, 0xAD, + 0x45, 0x0C, 0xE5, 0x28, 0xDA, 0x3F, 0xA4, 0x32, + 0xE0, 0x05, 0xD6, 0xB0, 0xEC, 0xCE, 0x10, 0xDC, + 0xA7, 0xC5, 0x99, 0x5F, 0x6A, 0xAC, 0xC5, 0x15, + 0x0E, 0x1B, 0x00, 0x9E, 0x19, 0x75, 0x1E, 0x83, + 0x09, 0xF8, 0x85, 0x95, 0x31, 0x84, 0x43, 0x74 + }, + { + 0xFB, 0x3C, 0x1F, 0x0F, 0x56, 0xA5, 0x6F, 0x8E, + 0x31, 0x6F, 0xDF, 0x5D, 0x85, 0x3C, 0x8C, 0x87, + 0x2C, 0x39, 0x63, 0x5D, 0x08, 0x36, 0x34, 0xC3, + 0x90, 0x4F, 0xC3, 0xAC, 0x07, 0xD1, 0xB5, 0x78, + 0xE8, 0x5F, 0xF0, 0xE4, 0x80, 0xE9, 0x2D, 0x44, + 0xAD, 0xE3, 0x3B, 0x62, 0xE8, 0x93, 0xEE, 0x32, + 0x34, 0x3E, 0x79, 0xDD, 0xF6, 0xEF, 0x29, 0x2E, + 0x89, 0xB5, 0x82, 0xD3, 0x12, 0x50, 0x23, 0x14 + }, + { + 0xC7, 0xC9, 0x7F, 0xC6, 0x5D, 0xD2, 0xB9, 0xE3, + 0xD3, 0xD6, 0x07, 0xD3, 0x15, 0x98, 0xD3, 0xF8, + 0x42, 0x61, 0xE9, 0x91, 0x92, 0x51, 0xE9, 0xC8, + 0xE5, 0x7B, 0xB5, 0xF8, 0x29, 0x37, 0x7D, 0x5F, + 0x73, 0xEA, 0xBB, 0xED, 0x55, 0xC6, 0xC3, 0x81, + 0x18, 0x0F, 0x29, 0xAD, 0x02, 0xE5, 0xBE, 0x79, + 0x7F, 0xFE, 0xC7, 0xE5, 0x7B, 0xDE, 0xCB, 0xC5, + 0x0A, 0xD3, 0xD0, 0x62, 0xF0, 0x99, 0x3A, 0xB0 + }, + { + 0xA5, 0x7A, 0x49, 0xCD, 0xBE, 0x67, 0xAE, 0x7D, + 0x9F, 0x79, 0x7B, 0xB5, 0xCC, 0x7E, 0xFC, 0x2D, + 0xF0, 0x7F, 0x4E, 0x1B, 0x15, 0x95, 0x5F, 0x85, + 0xDA, 0xE7, 0x4B, 0x76, 0xE2, 0xEC, 0xB8, 0x5A, + 0xFB, 0x6C, 0xD9, 0xEE, 0xED, 0x88, 0x88, 0xD5, + 0xCA, 0x3E, 0xC5, 0xAB, 0x65, 0xD2, 0x7A, 0x7B, + 0x19, 0xE5, 0x78, 0x47, 0x57, 0x60, 0xA0, 0x45, + 0xAC, 0x3C, 0x92, 0xE1, 0x3A, 0x93, 0x8E, 0x77 + }, + { + 0xC7, 0x14, 0x3F, 0xCE, 0x96, 0x14, 0xA1, 0x7F, + 0xD6, 0x53, 0xAE, 0xB1, 0x40, 0x72, 0x6D, 0xC9, + 0xC3, 0xDB, 0xB1, 0xDE, 0x6C, 0xC5, 0x81, 0xB2, + 0x72, 0x68, 0x97, 0xEC, 0x24, 0xB7, 0xA5, 0x03, + 0x59, 0xAD, 0x49, 0x22, 0x43, 0xBE, 0x66, 0xD9, + 0xED, 0xD8, 0xC9, 0x33, 0xB5, 0xB8, 0x0E, 0x0B, + 0x91, 0xBB, 0x61, 0xEA, 0x98, 0x05, 0x60, 0x06, + 0x51, 0x69, 0x76, 0xFA, 0xE8, 0xD9, 0x9A, 0x35 + }, + { + 0x65, 0xBB, 0x58, 0xD0, 0x7F, 0x93, 0x7E, 0x2D, + 0x3C, 0x7E, 0x65, 0x38, 0x5F, 0x9C, 0x54, 0x73, + 0x0B, 0x70, 0x41, 0x05, 0xCC, 0xDB, 0x69, 0x1F, + 0x6E, 0x14, 0x6D, 0x4E, 0xE8, 0xF6, 0xC0, 0x86, + 0xF4, 0x95, 0x11, 0x03, 0x51, 0x10, 0xA9, 0xAD, + 0x60, 0x31, 0xFD, 0xCE, 0xB9, 0x43, 0xE0, 0xF9, + 0x61, 0x3B, 0xCB, 0x27, 0x6D, 0xD4, 0x0F, 0x06, + 0x24, 0xEF, 0x0F, 0x92, 0x4F, 0x80, 0x97, 0x83 + }, + { + 0xE5, 0x40, 0x27, 0x7F, 0x68, 0x3B, 0x11, 0x86, + 0xDD, 0x3B, 0x5B, 0x3F, 0x61, 0x43, 0x33, 0x96, + 0x58, 0x1A, 0x35, 0xFE, 0xB1, 0x20, 0x02, 0xBE, + 0x8C, 0x6A, 0x62, 0x31, 0xFC, 0x40, 0xFF, 0xA7, + 0x0F, 0x08, 0x08, 0x1B, 0xC5, 0x8B, 0x2D, 0x94, + 0xF7, 0x64, 0x95, 0x43, 0x61, 0x4A, 0x43, 0x5F, + 0xAA, 0x2D, 0x62, 0x11, 0x0E, 0x13, 0xDA, 0xBC, + 0x7B, 0x86, 0x62, 0x9B, 0x63, 0xAF, 0x9C, 0x24 + }, + { + 0x41, 0x85, 0x00, 0x87, 0x8C, 0x5F, 0xBC, 0xB5, + 0x84, 0xC4, 0x32, 0xF4, 0x28, 0x5E, 0x05, 0xE4, + 0x9F, 0x2E, 0x3E, 0x07, 0x53, 0x99, 0xA0, 0xDB, + 0xFC, 0xF8, 0x74, 0xEB, 0xF8, 0xC0, 0x3D, 0x02, + 0xBF, 0x16, 0xBC, 0x69, 0x89, 0xD1, 0x61, 0xC7, + 0x7C, 0xA0, 0x78, 0x6B, 0x05, 0x05, 0x3C, 0x6C, + 0x70, 0x94, 0x33, 0x71, 0x23, 0x19, 0x19, 0x21, + 0x28, 0x83, 0x5C, 0xF0, 0xB6, 0x60, 0x59, 0x5B + }, + { + 0x88, 0x90, 0x90, 0xDB, 0xB1, 0x94, 0x4B, 0xDC, + 0x94, 0x33, 0xEE, 0x5E, 0xF1, 0x01, 0x0C, 0x7A, + 0x4A, 0x24, 0xA8, 0xE7, 0x1E, 0xCE, 0xA8, 0xE1, + 0x2A, 0x31, 0x31, 0x8C, 0xE4, 0x9D, 0xCA, 0xB0, + 0xAC, 0xA5, 0xC3, 0x80, 0x23, 0x34, 0xAA, 0xB2, + 0xCC, 0x84, 0xB1, 0x4C, 0x6B, 0x93, 0x21, 0xFE, + 0x58, 0x6B, 0xF3, 0xF8, 0x76, 0xF1, 0x9C, 0xD4, + 0x06, 0xEB, 0x11, 0x27, 0xFB, 0x94, 0x48, 0x01 + }, + { + 0x53, 0xB6, 0xA2, 0x89, 0x10, 0xAA, 0x92, 0xE2, + 0x7E, 0x53, 0x6F, 0xB5, 0x49, 0xCF, 0x9B, 0x99, + 0x18, 0x79, 0x10, 0x60, 0x89, 0x8E, 0x0B, 0x9F, + 0xE1, 0x83, 0x57, 0x7F, 0xF4, 0x3B, 0x5E, 0x9C, + 0x76, 0x89, 0xC7, 0x45, 0xB3, 0x2E, 0x41, 0x22, + 0x69, 0x83, 0x7C, 0x31, 0xB8, 0x9E, 0x6C, 0xC1, + 0x2B, 0xF7, 0x6E, 0x13, 0xCA, 0xD3, 0x66, 0xB7, + 0x4E, 0xCE, 0x48, 0xBB, 0x85, 0xFD, 0x09, 0xE9 + }, + { + 0x7C, 0x09, 0x20, 0x80, 0xC6, 0xA8, 0x0D, 0x67, + 0x24, 0x09, 0xD0, 0x81, 0xD3, 0xD1, 0x77, 0x10, + 0x6B, 0xCD, 0x63, 0x56, 0x77, 0x85, 0x14, 0x07, + 0x19, 0x49, 0x09, 0x50, 0xAE, 0x07, 0xAE, 0x8F, + 0xCA, 0xAB, 0xBA, 0xAA, 0xB3, 0x30, 0xCF, 0xBC, + 0xF7, 0x37, 0x44, 0x82, 0xC2, 0x20, 0xAF, 0x2E, + 0xAD, 0xEE, 0xB7, 0x3D, 0xCB, 0xB3, 0x5E, 0xD8, + 0x23, 0x34, 0x4E, 0x14, 0x4E, 0x7D, 0x48, 0x99 + }, + { + 0x9C, 0xCD, 0xE5, 0x66, 0xD2, 0x40, 0x05, 0x09, + 0x18, 0x11, 0x11, 0xF3, 0x2D, 0xDE, 0x4C, 0xD6, + 0x32, 0x09, 0xFE, 0x59, 0xA3, 0x0C, 0x11, 0x45, + 0x46, 0xAD, 0x27, 0x76, 0xD8, 0x89, 0xA4, 0x1B, + 0xAD, 0x8F, 0xA1, 0xBB, 0x46, 0x8C, 0xB2, 0xF9, + 0xD4, 0x2C, 0xA9, 0x92, 0x8A, 0x77, 0x70, 0xFE, + 0xF8, 0xE8, 0xBA, 0x4D, 0x0C, 0x81, 0x2D, 0x9A, + 0x1E, 0x75, 0xC3, 0xD8, 0xD2, 0xCC, 0xD7, 0x5A + }, + { + 0x6E, 0x29, 0x3B, 0xF5, 0xD0, 0x3F, 0xE4, 0x39, + 0x77, 0xCF, 0xE3, 0xF5, 0x7C, 0xCD, 0xB3, 0xAE, + 0x28, 0x2A, 0x85, 0x45, 0x5D, 0xCA, 0x33, 0xF3, + 0x7F, 0x4B, 0x74, 0xF8, 0x39, 0x8C, 0xC6, 0x12, + 0x43, 0x3D, 0x75, 0x5C, 0xBE, 0xC4, 0x12, 0xF8, + 0xF8, 0x2A, 0x3B, 0xD3, 0xBC, 0x4A, 0x27, 0x8F, + 0x7E, 0xCD, 0x0D, 0xFA, 0x9B, 0xBD, 0xC4, 0x0B, + 0xE7, 0xA7, 0x87, 0xC8, 0xF1, 0x59, 0xB2, 0xDF + }, + { + 0xC5, 0x65, 0x46, 0xFB, 0x21, 0x78, 0x45, 0x6F, + 0x33, 0x61, 0x64, 0xC1, 0x8B, 0x90, 0xDE, 0xFF, + 0xC8, 0x3A, 0xE2, 0xB5, 0xA3, 0xAC, 0xA7, 0x7B, + 0x68, 0x84, 0xD3, 0x6D, 0x2C, 0x1D, 0xB3, 0x95, + 0x01, 0xB3, 0xE6, 0x5E, 0x36, 0xC7, 0x58, 0xC6, + 0x6E, 0x31, 0x88, 0x45, 0x1F, 0xDB, 0x35, 0x15, + 0xEE, 0x16, 0x2C, 0x00, 0x1F, 0x06, 0xC3, 0xE8, + 0xCB, 0x57, 0x3A, 0xDF, 0x30, 0xF7, 0xA1, 0x01 + }, + { + 0x6F, 0x82, 0xF8, 0x9F, 0x29, 0x9E, 0xBC, 0xA2, + 0xFE, 0x01, 0x4B, 0x59, 0xBF, 0xFE, 0x1A, 0xA8, + 0x4E, 0x88, 0xB1, 0x91, 0x5F, 0xE2, 0x56, 0xAF, + 0xB6, 0x46, 0xFD, 0x84, 0x48, 0xAF, 0x2B, 0x88, + 0x91, 0xA7, 0xFA, 0xB3, 0x7A, 0x4E, 0xA6, 0xF9, + 0xA5, 0x0E, 0x6C, 0x31, 0x70, 0x39, 0xD8, 0xCF, + 0x87, 0x8F, 0x4C, 0x8E, 0x1A, 0x0D, 0xD4, 0x64, + 0xF0, 0xB4, 0xD6, 0xFF, 0x1C, 0x7E, 0xA8, 0x53 + }, + { + 0x2B, 0x85, 0x99, 0xFF, 0x9C, 0x3D, 0x61, 0x98, + 0x63, 0x7A, 0xD5, 0x1E, 0x57, 0xD1, 0x99, 0x8B, + 0x0D, 0x75, 0x31, 0x3F, 0xE2, 0xDD, 0x61, 0xA5, + 0x33, 0xC9, 0x64, 0xA6, 0xDD, 0x96, 0x07, 0xC6, + 0xF7, 0x23, 0xE9, 0x45, 0x2C, 0xE4, 0x6E, 0x01, + 0x4B, 0x1C, 0x1D, 0x6D, 0xE7, 0x7B, 0xA5, 0xB8, + 0x8C, 0x91, 0x4D, 0x1C, 0x59, 0x7B, 0xF1, 0xEA, + 0xE1, 0x34, 0x74, 0xB4, 0x29, 0x0E, 0x89, 0xB2 + }, + { + 0x08, 0xBF, 0x34, 0x6D, 0x38, 0xE1, 0xDF, 0x06, + 0xC8, 0x26, 0x0E, 0xDB, 0x1D, 0xA7, 0x55, 0x79, + 0x27, 0x59, 0x48, 0xD5, 0xC0, 0xA0, 0xAA, 0x9E, + 0xD2, 0x88, 0x6F, 0x88, 0x56, 0xDE, 0x54, 0x17, + 0xA1, 0x56, 0x99, 0x87, 0x58, 0xF5, 0xB1, 0x7E, + 0x52, 0xF1, 0x01, 0xCA, 0x95, 0x7A, 0x71, 0x13, + 0x74, 0x73, 0xDF, 0xD1, 0x8D, 0x7D, 0x20, 0x9C, + 0x4C, 0x10, 0xD9, 0x23, 0x3C, 0x93, 0x69, 0x1D + }, + { + 0x6D, 0xF2, 0x15, 0x6D, 0x77, 0x31, 0x14, 0xD3, + 0x10, 0xB6, 0x3D, 0xB9, 0xEE, 0x53, 0x50, 0xD7, + 0x7E, 0x6B, 0xCF, 0x25, 0xB0, 0x5F, 0xCD, 0x91, + 0x0F, 0x9B, 0x31, 0xBC, 0x42, 0xBB, 0x13, 0xFE, + 0x82, 0x25, 0xEB, 0xCB, 0x2A, 0x23, 0xA6, 0x22, + 0x80, 0x77, 0x7B, 0x6B, 0xF7, 0x4E, 0x2C, 0xD0, + 0x91, 0x7C, 0x76, 0x40, 0xB4, 0x3D, 0xEF, 0xE4, + 0x68, 0xCD, 0x1E, 0x18, 0xC9, 0x43, 0xC6, 0x6A + }, + { + 0x7C, 0x70, 0x38, 0xBC, 0x13, 0xA9, 0x11, 0x51, + 0x82, 0x8A, 0x5B, 0xA8, 0x2B, 0x4A, 0x96, 0x04, + 0x0F, 0x25, 0x8A, 0x4D, 0xFB, 0x1B, 0x13, 0x73, + 0xF0, 0xD3, 0x59, 0x16, 0x8A, 0xFB, 0x05, 0x17, + 0xA2, 0x0B, 0x28, 0xA1, 0x2D, 0x36, 0x44, 0x04, + 0x6B, 0xE6, 0x6B, 0x8D, 0x08, 0xD8, 0xAE, 0x7F, + 0x6A, 0x92, 0x3E, 0xA1, 0xC0, 0x01, 0x87, 0xC6, + 0xD1, 0x1D, 0xC5, 0x02, 0xBA, 0xC7, 0x13, 0x05 + }, + { + 0xBC, 0xD1, 0xB3, 0x0D, 0x80, 0x8F, 0xB7, 0x39, + 0xB9, 0x87, 0xCB, 0xF1, 0x54, 0xBE, 0xA0, 0x0D, + 0xA9, 0xD4, 0x03, 0x80, 0xB8, 0x61, 0xD4, 0xC1, + 0xD6, 0x37, 0x71, 0x22, 0xDA, 0xDD, 0x61, 0xC0, + 0xE5, 0x90, 0x18, 0xB7, 0x19, 0x41, 0xCF, 0xB6, + 0x2E, 0x00, 0xDC, 0xD7, 0x0A, 0xEB, 0x9A, 0xBF, + 0x04, 0x73, 0xE8, 0x0F, 0x0A, 0x7E, 0xCA, 0x6B, + 0x6D, 0xEA, 0x24, 0x6A, 0xB2, 0x29, 0xDD, 0x2B + }, + { + 0x7E, 0xD4, 0x46, 0x8D, 0x96, 0x85, 0x30, 0xFE, + 0x7A, 0xB2, 0xC3, 0x35, 0x40, 0xB2, 0x6D, 0x8C, + 0x3B, 0xD3, 0xED, 0x44, 0xB3, 0x4F, 0xBE, 0x8C, + 0x2A, 0x9D, 0x7F, 0x80, 0x5B, 0x5A, 0xDA, 0x0E, + 0xA2, 0x52, 0xEE, 0xAD, 0xE4, 0xFC, 0xE9, 0x7F, + 0x89, 0x72, 0x8A, 0xD8, 0x5B, 0xC8, 0xBB, 0x24, + 0x30, 0xB1, 0xBE, 0xF2, 0xCD, 0xDD, 0x32, 0xC8, + 0x44, 0x6E, 0x59, 0xB8, 0xE8, 0xBA, 0x3C, 0x67 + }, + { + 0x6D, 0x30, 0xB7, 0xC6, 0xCE, 0x8A, 0x32, 0x36, + 0xC0, 0xCA, 0x2F, 0x8D, 0x72, 0x8B, 0x10, 0x88, + 0xCA, 0x06, 0x98, 0x3A, 0x80, 0x43, 0xE6, 0x21, + 0xD5, 0xDC, 0xF0, 0xC5, 0x37, 0xD1, 0x3B, 0x08, + 0x79, 0x1E, 0xDE, 0xB0, 0x1A, 0x3C, 0xF0, 0x94, + 0x3E, 0xC1, 0xC8, 0x90, 0xAB, 0x6E, 0x29, 0xB1, + 0x46, 0xA2, 0x36, 0xCD, 0x46, 0xBC, 0xB9, 0xD9, + 0x3B, 0xF5, 0x16, 0xFB, 0x67, 0xC6, 0x3F, 0xE5 + }, + { + 0x97, 0xFE, 0x03, 0xCE, 0xF3, 0x14, 0x38, 0x50, + 0x89, 0x11, 0xBD, 0xED, 0x97, 0x59, 0x80, 0xA6, + 0x60, 0x29, 0x30, 0x5D, 0xC5, 0xE3, 0xFA, 0x8A, + 0xD1, 0xB4, 0xFB, 0x22, 0xFC, 0xDF, 0x5A, 0x19, + 0xA7, 0x33, 0x32, 0x03, 0x27, 0xD8, 0xF7, 0x1C, + 0xCF, 0x49, 0x6C, 0xB3, 0xA4, 0x4A, 0x77, 0xAF, + 0x56, 0xE3, 0xDD, 0xE7, 0x3D, 0x3A, 0x5F, 0x17, + 0x68, 0x96, 0xCC, 0x57, 0xC9, 0xA5, 0xAD, 0x99 + }, + { + 0x78, 0x5A, 0x9D, 0x0F, 0xBD, 0x21, 0x13, 0x6D, + 0xBC, 0xE8, 0xFA, 0x7E, 0xAF, 0xD6, 0x3C, 0x9D, + 0xAD, 0x22, 0x00, 0x52, 0x97, 0x84, 0x16, 0xB3, + 0x1D, 0x97, 0x53, 0xEA, 0xA1, 0x49, 0x09, 0x78, + 0x47, 0xED, 0x9B, 0x30, 0xA6, 0x5C, 0x70, 0x50, + 0x7E, 0xFF, 0x01, 0x87, 0x91, 0x49, 0xED, 0x5C, + 0xF0, 0x47, 0x1D, 0x37, 0x79, 0x8E, 0xDC, 0x05, + 0xAB, 0xD5, 0x6A, 0xD4, 0xA2, 0xCC, 0xCB, 0x1D + }, + { + 0xAD, 0x40, 0x8D, 0x2A, 0xBD, 0xDF, 0xD3, 0x7B, + 0x3B, 0xF3, 0x47, 0x94, 0xC1, 0xA3, 0x37, 0x1D, + 0x92, 0x8E, 0xD7, 0xFC, 0x8D, 0x96, 0x62, 0x25, + 0x33, 0x35, 0x84, 0xC5, 0x66, 0x58, 0x17, 0x83, + 0x2A, 0x37, 0xC0, 0x7F, 0x0D, 0xC7, 0xCB, 0x5A, + 0xA8, 0x74, 0xCD, 0x7D, 0x20, 0xFE, 0x8F, 0xAB, + 0x8E, 0xAB, 0xCB, 0x9B, 0x33, 0xD2, 0xE0, 0x84, + 0x1F, 0x6E, 0x20, 0x09, 0x60, 0x89, 0x9D, 0x95 + }, + { + 0x97, 0x66, 0x8F, 0x74, 0x5B, 0x60, 0x32, 0xFC, + 0x81, 0x5D, 0x95, 0x79, 0x32, 0x27, 0x69, 0xDC, + 0xCD, 0x95, 0x01, 0xA5, 0x08, 0x00, 0x29, 0xB8, + 0xAE, 0x82, 0x6B, 0xEF, 0xB6, 0x74, 0x23, 0x31, + 0xBD, 0x9F, 0x76, 0xEF, 0xEB, 0x3E, 0x2B, 0x8E, + 0x81, 0xA9, 0x78, 0x6B, 0x28, 0x2F, 0x50, 0x68, + 0xA3, 0xA2, 0x42, 0x46, 0x97, 0xA7, 0x7C, 0x41, + 0x87, 0x6B, 0x7E, 0x75, 0x3F, 0x4C, 0x77, 0x67 + }, + { + 0x26, 0xBB, 0x98, 0x5F, 0x47, 0xE7, 0xFE, 0xE0, + 0xCF, 0xD2, 0x52, 0xD4, 0xEF, 0x96, 0xBE, 0xD4, + 0x2B, 0x9C, 0x37, 0x0C, 0x1C, 0x6A, 0x3E, 0x8C, + 0x9E, 0xB0, 0x4E, 0xF7, 0xF7, 0x81, 0x8B, 0x83, + 0x3A, 0x0D, 0x1F, 0x04, 0x3E, 0xBA, 0xFB, 0x91, + 0x1D, 0xC7, 0x79, 0xE0, 0x27, 0x40, 0xA0, 0x2A, + 0x44, 0xD3, 0xA1, 0xEA, 0x45, 0xED, 0x4A, 0xD5, + 0x5E, 0x68, 0x6C, 0x92, 0x7C, 0xAF, 0xE9, 0x7E + }, + { + 0x5B, 0xFE, 0x2B, 0x1D, 0xCF, 0x7F, 0xE9, 0xB9, + 0x50, 0x88, 0xAC, 0xED, 0xB5, 0x75, 0xC1, 0x90, + 0x16, 0xC7, 0x43, 0xB2, 0xE7, 0x63, 0xBF, 0x58, + 0x51, 0xAC, 0x40, 0x7C, 0x9E, 0xDA, 0x43, 0x71, + 0x5E, 0xDF, 0xA4, 0x8B, 0x48, 0x25, 0x49, 0x2C, + 0x51, 0x79, 0x59, 0x3F, 0xFF, 0x21, 0x35, 0x1B, + 0x76, 0xE8, 0xB7, 0xE0, 0x34, 0xE4, 0xC5, 0x3C, + 0x79, 0xF6, 0x1F, 0x29, 0xC4, 0x79, 0xBD, 0x08 + }, + { + 0xC7, 0x65, 0x09, 0xEF, 0x72, 0xF4, 0xA6, 0xF9, + 0xC9, 0xC4, 0x06, 0x18, 0xED, 0x52, 0xB2, 0x08, + 0x4F, 0x83, 0x50, 0x22, 0x32, 0xE0, 0xAC, 0x8B, + 0xDA, 0xF3, 0x26, 0x43, 0x68, 0xE4, 0xD0, 0x18, + 0x0F, 0x68, 0x54, 0xC4, 0xAB, 0xF4, 0xF6, 0x50, + 0x9C, 0x79, 0xCA, 0xAF, 0xC4, 0x4C, 0xF3, 0x19, + 0x4A, 0xFC, 0x57, 0xBD, 0x07, 0x7B, 0xD7, 0xB3, + 0xC9, 0xBD, 0xA3, 0xD4, 0xB8, 0x77, 0x58, 0x16 + }, + { + 0xD6, 0x6F, 0x2B, 0xEA, 0xB9, 0x90, 0xE3, 0x54, + 0xCC, 0xB9, 0x10, 0xE4, 0xE9, 0xC7, 0xAC, 0x61, + 0x8C, 0x7B, 0x63, 0xEF, 0x29, 0x2A, 0x96, 0xB5, + 0x52, 0x34, 0x1D, 0xE7, 0x8D, 0xC4, 0x6D, 0x3E, + 0xC8, 0xCF, 0xAB, 0xC6, 0x99, 0xB5, 0x0A, 0xF4, + 0x1F, 0xDA, 0x39, 0xCF, 0x1B, 0x01, 0x73, 0x66, + 0x09, 0x23, 0x51, 0x0A, 0xD6, 0x7F, 0xAE, 0xDE, + 0xF5, 0x20, 0x7C, 0xFF, 0xE8, 0x64, 0x1D, 0x20 + }, + { + 0x7D, 0x8F, 0x06, 0x72, 0x99, 0x2B, 0x79, 0xBE, + 0x3A, 0x36, 0x4D, 0x8E, 0x59, 0x04, 0xF4, 0xAB, + 0x71, 0x3B, 0xBC, 0x8A, 0xB0, 0x1B, 0x4F, 0x30, + 0x9A, 0xD8, 0xCC, 0xF2, 0x23, 0xCE, 0x10, 0x34, + 0xA8, 0x60, 0xDC, 0xB0, 0xB0, 0x05, 0x50, 0x61, + 0x2C, 0xC2, 0xFA, 0x17, 0xF2, 0x96, 0x9E, 0x18, + 0xF2, 0x2E, 0x14, 0x27, 0xD2, 0x54, 0xB4, 0xA8, + 0x2B, 0x3A, 0x03, 0xA3, 0xEB, 0x39, 0x4A, 0xDF + }, + { + 0xA5, 0x6D, 0x67, 0x25, 0xBF, 0xB3, 0xDE, 0x47, + 0xC1, 0x41, 0x4A, 0xDF, 0x25, 0xFC, 0x8F, 0x0F, + 0xC9, 0x84, 0x6F, 0x69, 0x87, 0x72, 0x2B, 0xC0, + 0x63, 0x66, 0xD5, 0xCA, 0x4E, 0x89, 0x72, 0x29, + 0x25, 0xEB, 0xBC, 0x88, 0x14, 0x18, 0x84, 0x40, + 0x75, 0x39, 0x7A, 0x0C, 0xA8, 0x98, 0x42, 0xC7, + 0xB9, 0xE9, 0xE0, 0x7E, 0x1D, 0x9D, 0x18, 0x3E, + 0xBE, 0xB3, 0x9E, 0x12, 0x0B, 0x48, 0x3B, 0xF7 + }, + { + 0xAF, 0x5E, 0x03, 0xD7, 0xFE, 0x60, 0xC6, 0x7E, + 0x10, 0x31, 0x33, 0x44, 0x43, 0x4E, 0x79, 0x48, + 0x5A, 0x03, 0xA7, 0x58, 0xD6, 0xDC, 0xE9, 0x85, + 0x57, 0x47, 0x45, 0x76, 0x3C, 0x1C, 0x5C, 0x77, + 0xD4, 0xFB, 0x3E, 0x6F, 0xB1, 0x22, 0x30, 0x36, + 0x83, 0x70, 0x99, 0x3B, 0xF9, 0x0F, 0xEE, 0xD0, + 0xC5, 0xD1, 0x60, 0x75, 0x24, 0x56, 0x2D, 0x7C, + 0x09, 0xC0, 0xC2, 0x10, 0xED, 0x39, 0x3D, 0x7C + }, + { + 0x7A, 0x20, 0x54, 0x0C, 0xC0, 0x7B, 0xF7, 0x2B, + 0x58, 0x24, 0x21, 0xFC, 0x34, 0x2E, 0x82, 0xF5, + 0x21, 0x34, 0xB6, 0x98, 0x41, 0xEC, 0x28, 0xED, + 0x18, 0x9E, 0x2E, 0xA6, 0xA2, 0x9D, 0xD2, 0xF8, + 0x2A, 0x64, 0x03, 0x52, 0xD2, 0x22, 0xB5, 0x2F, + 0x29, 0x11, 0xDC, 0x72, 0xA7, 0xDA, 0xB3, 0x1C, + 0xAA, 0xDD, 0x80, 0xC6, 0x11, 0x8F, 0x13, 0xC5, + 0x6B, 0x2A, 0x1E, 0x43, 0x73, 0xBE, 0x0E, 0xA3 + }, + { + 0x48, 0x6F, 0x02, 0xC6, 0x3E, 0x54, 0x67, 0xEA, + 0x1F, 0xDD, 0xE7, 0xE8, 0x2B, 0xFA, 0xCC, 0x2C, + 0x1B, 0xA5, 0xD6, 0x36, 0xD9, 0xF3, 0xD0, 0x8B, + 0x21, 0x0D, 0xA3, 0xF3, 0x72, 0xF7, 0x06, 0xEC, + 0x21, 0x8C, 0xC1, 0x7F, 0xF6, 0x0A, 0xEF, 0x70, + 0x3B, 0xBE, 0x0C, 0x15, 0xC3, 0x8A, 0xE5, 0x5D, + 0x28, 0x6A, 0x68, 0x4F, 0x86, 0x4C, 0x78, 0x21, + 0x1C, 0xCA, 0xB4, 0x17, 0x8C, 0x92, 0xAD, 0xBA + }, + { + 0x1C, 0x7A, 0x5C, 0x1D, 0xED, 0xCD, 0x04, 0xA9, + 0x21, 0x78, 0x8F, 0x7E, 0xB2, 0x33, 0x61, 0xCA, + 0x19, 0x53, 0xB0, 0x4B, 0x9C, 0x7A, 0xEC, 0x35, + 0xD6, 0x5E, 0xA3, 0xE4, 0x99, 0x6D, 0xB2, 0x6F, + 0x28, 0x12, 0x78, 0xEA, 0x4A, 0xE6, 0x66, 0xAD, + 0x81, 0x02, 0x7D, 0x98, 0xAF, 0x57, 0x26, 0x2C, + 0xDB, 0xFA, 0x4C, 0x08, 0x5F, 0x42, 0x10, 0x56, + 0x8C, 0x7E, 0x15, 0xEE, 0xC7, 0x80, 0x51, 0x14 + }, + { + 0x9C, 0xE3, 0xFA, 0x9A, 0x86, 0x0B, 0xDB, 0xD5, + 0x37, 0x8F, 0xD6, 0xD7, 0xB8, 0xB6, 0x71, 0xC6, + 0xCB, 0x76, 0x92, 0x91, 0x0C, 0xE8, 0xF9, 0xB6, + 0xCB, 0x41, 0x22, 0xCB, 0xCB, 0xE6, 0xAC, 0x06, + 0xCA, 0x04, 0x22, 0xCE, 0xF1, 0x22, 0x59, 0x35, + 0x05, 0x3B, 0x7D, 0x19, 0x3A, 0x81, 0xB9, 0xE9, + 0x72, 0xEB, 0x85, 0xA1, 0xD3, 0x07, 0x4F, 0x14, + 0xCB, 0xB5, 0xEC, 0x9F, 0x05, 0x73, 0x89, 0x2D + }, + { + 0xA9, 0x11, 0x87, 0xBE, 0x5C, 0x37, 0x1C, 0x42, + 0x65, 0xC1, 0x74, 0xFD, 0x46, 0x53, 0xB8, 0xAB, + 0x70, 0x85, 0x51, 0xF8, 0x3D, 0x1F, 0xEE, 0x1C, + 0xC1, 0x47, 0x95, 0x81, 0xBC, 0x00, 0x6D, 0x6F, + 0xB7, 0x8F, 0xCC, 0x9A, 0x5D, 0xEE, 0x1D, 0xB3, + 0x66, 0x6F, 0x50, 0x8F, 0x97, 0x80, 0xA3, 0x75, + 0x93, 0xEB, 0xCC, 0xCF, 0x5F, 0xBE, 0xD3, 0x96, + 0x67, 0xDC, 0x63, 0x61, 0xE9, 0x21, 0xF7, 0x79 + }, + { + 0x46, 0x25, 0x76, 0x7D, 0x7B, 0x1D, 0x3D, 0x3E, + 0xD2, 0xFB, 0xC6, 0x74, 0xAF, 0x14, 0xE0, 0x24, + 0x41, 0x52, 0xF2, 0xA4, 0x02, 0x1F, 0xCF, 0x33, + 0x11, 0x50, 0x5D, 0x89, 0xBD, 0x81, 0xE2, 0xF9, + 0xF9, 0xA5, 0x00, 0xC3, 0xB1, 0x99, 0x91, 0x4D, + 0xB4, 0x95, 0x00, 0xB3, 0xC9, 0x8D, 0x03, 0xEA, + 0x93, 0x28, 0x67, 0x51, 0xA6, 0x86, 0xA3, 0xB8, + 0x75, 0xDA, 0xAB, 0x0C, 0xCD, 0x63, 0xB4, 0x4F + }, + { + 0x43, 0xDF, 0xDF, 0xE1, 0xB0, 0x14, 0xFE, 0xD3, + 0xA2, 0xAC, 0xAB, 0xB7, 0xF3, 0xE9, 0xA1, 0x82, + 0xF2, 0xAA, 0x18, 0x01, 0x9D, 0x27, 0xE3, 0xE6, + 0xCD, 0xCF, 0x31, 0xA1, 0x5B, 0x42, 0x8E, 0x91, + 0xE7, 0xB0, 0x8C, 0xF5, 0xE5, 0xC3, 0x76, 0xFC, + 0xE2, 0xD8, 0xA2, 0x8F, 0xF8, 0x5A, 0xB0, 0xA0, + 0xA1, 0x65, 0x6E, 0xDB, 0x4A, 0x0A, 0x91, 0x53, + 0x26, 0x20, 0x09, 0x6D, 0x9A, 0x5A, 0x65, 0x2D + }, + { + 0x27, 0x9E, 0x32, 0x02, 0xBE, 0x39, 0x89, 0xBA, + 0x31, 0x12, 0x77, 0x25, 0x85, 0x17, 0x74, 0x87, + 0xE4, 0xFE, 0x3E, 0xE3, 0xEA, 0xB4, 0x9C, 0x2F, + 0x7F, 0xA7, 0xFE, 0x87, 0xCF, 0xE7, 0xB8, 0x0D, + 0x3E, 0x03, 0x55, 0xED, 0xFF, 0x6D, 0x03, 0x1E, + 0x6C, 0x96, 0xC7, 0x95, 0xDB, 0x1C, 0x6F, 0x04, + 0x18, 0x80, 0xEC, 0x38, 0x24, 0xDE, 0xFA, 0xCF, + 0x92, 0x63, 0x82, 0x0A, 0x8E, 0x73, 0x27, 0xDE + }, + { + 0xEA, 0x2D, 0x06, 0x6A, 0xC2, 0x29, 0xD4, 0xD4, + 0xB6, 0x16, 0xA8, 0xBE, 0xDE, 0xC7, 0x34, 0x32, + 0x52, 0x24, 0xE4, 0xB4, 0xE5, 0x8F, 0x1A, 0xE6, + 0xDA, 0xD7, 0xE4, 0x0C, 0x2D, 0xA2, 0x91, 0x96, + 0xC3, 0xB1, 0xEA, 0x95, 0x71, 0xDA, 0xCC, 0x81, + 0xE8, 0x73, 0x28, 0xCA, 0xA0, 0x21, 0x1E, 0x09, + 0x02, 0x7B, 0x05, 0x24, 0xAA, 0x3F, 0x4A, 0x84, + 0x99, 0x17, 0xB3, 0x58, 0x67, 0x47, 0xEB, 0xBB + }, + { + 0x49, 0xF0, 0x14, 0xF5, 0xC6, 0x18, 0x22, 0xC8, + 0x99, 0xAB, 0x5C, 0xAE, 0x51, 0xBE, 0x40, 0x44, + 0xA4, 0x49, 0x5E, 0x77, 0x7D, 0xEB, 0x7D, 0xA9, + 0xB6, 0xD8, 0x49, 0x0E, 0xFB, 0xB8, 0x75, 0x30, + 0xAD, 0xF2, 0x93, 0xDA, 0xF0, 0x79, 0xF9, 0x4C, + 0x33, 0xB7, 0x04, 0x4E, 0xF6, 0x2E, 0x2E, 0x5B, + 0xB3, 0xEB, 0x11, 0xE1, 0x73, 0x04, 0xF8, 0x45, + 0x3E, 0xE6, 0xCE, 0x24, 0xF0, 0x33, 0xDD, 0xB0 + }, + { + 0x92, 0x33, 0x49, 0x03, 0x44, 0xE5, 0xB0, 0xDC, + 0x59, 0x12, 0x67, 0x1B, 0x7A, 0xE5, 0x4C, 0xEE, + 0x77, 0x30, 0xDB, 0xE1, 0xF4, 0xC7, 0xD9, 0x2A, + 0x4D, 0x3E, 0x3A, 0xAB, 0x50, 0x57, 0x17, 0x08, + 0xDB, 0x51, 0xDC, 0xF9, 0xC2, 0x94, 0x45, 0x91, + 0xDB, 0x65, 0x1D, 0xB3, 0x2D, 0x22, 0x93, 0x5B, + 0x86, 0x94, 0x49, 0x69, 0xBE, 0x77, 0xD5, 0xB5, + 0xFE, 0xAE, 0x6C, 0x38, 0x40, 0xA8, 0xDB, 0x26 + }, + { + 0xB6, 0xE7, 0x5E, 0x6F, 0x4C, 0x7F, 0x45, 0x3B, + 0x74, 0x65, 0xD2, 0x5B, 0x5A, 0xC8, 0xC7, 0x19, + 0x69, 0x02, 0xEA, 0xA9, 0x53, 0x87, 0x52, 0x28, + 0xC8, 0x63, 0x4E, 0x16, 0xE2, 0xAE, 0x1F, 0x38, + 0xBC, 0x32, 0x75, 0x30, 0x43, 0x35, 0xF5, 0x98, + 0x9E, 0xCC, 0xC1, 0xE3, 0x41, 0x67, 0xD4, 0xE6, + 0x8D, 0x77, 0x19, 0x96, 0x8F, 0xBA, 0x8E, 0x2F, + 0xE6, 0x79, 0x47, 0xC3, 0x5C, 0x48, 0xE8, 0x06 + }, + { + 0xCC, 0x14, 0xCA, 0x66, 0x5A, 0xF1, 0x48, 0x3E, + 0xFB, 0xC3, 0xAF, 0x80, 0x08, 0x0E, 0x65, 0x0D, + 0x50, 0x46, 0xA3, 0x93, 0x2F, 0x4F, 0x51, 0xF3, + 0xFE, 0x90, 0xA0, 0x70, 0x5E, 0xC2, 0x51, 0x04, + 0xAD, 0xF0, 0x78, 0x39, 0x26, 0x5D, 0xC5, 0x1D, + 0x43, 0x40, 0x14, 0x11, 0x24, 0x6E, 0x47, 0x4F, + 0x0D, 0x5E, 0x56, 0x37, 0xAF, 0x94, 0x76, 0x72, + 0x83, 0xD5, 0x3E, 0x06, 0x17, 0xE9, 0x81, 0xF4 + }, + { + 0x23, 0x0A, 0x1C, 0x85, 0x7C, 0xB2, 0xE7, 0x85, + 0x2E, 0x41, 0xB6, 0x47, 0xE9, 0x0E, 0x45, 0x85, + 0xD2, 0xD8, 0x81, 0xE1, 0x73, 0x4D, 0xC3, 0x89, + 0x55, 0x35, 0x6E, 0x8D, 0xD7, 0xBF, 0xF3, 0x90, + 0x53, 0x09, 0x2C, 0x6B, 0x38, 0xE2, 0x36, 0xE1, + 0x89, 0x95, 0x25, 0x64, 0x70, 0x73, 0xDD, 0xDF, + 0x68, 0x95, 0xD6, 0x42, 0x06, 0x32, 0x5E, 0x76, + 0x47, 0xF2, 0x75, 0x56, 0x7B, 0x25, 0x59, 0x09 + }, + { + 0xCB, 0xB6, 0x53, 0x21, 0xAC, 0x43, 0x6E, 0x2F, + 0xFD, 0xAB, 0x29, 0x36, 0x35, 0x9C, 0xE4, 0x90, + 0x23, 0xF7, 0xDE, 0xE7, 0x61, 0x4E, 0xF2, 0x8D, + 0x17, 0x3C, 0x3D, 0x27, 0xC5, 0xD1, 0xBF, 0xFA, + 0x51, 0x55, 0x3D, 0x43, 0x3F, 0x8E, 0xE3, 0xC9, + 0xE4, 0x9C, 0x05, 0xA2, 0xB8, 0x83, 0xCC, 0xE9, + 0x54, 0xC9, 0xA8, 0x09, 0x3B, 0x80, 0x61, 0x2A, + 0x0C, 0xDD, 0x47, 0x32, 0xE0, 0x41, 0xF9, 0x95 + }, + { + 0x3E, 0x7E, 0x57, 0x00, 0x74, 0x33, 0x72, 0x75, + 0xEF, 0xB5, 0x13, 0x15, 0x58, 0x80, 0x34, 0xC3, + 0xCF, 0x0D, 0xDD, 0xCA, 0x20, 0xB4, 0x61, 0x2E, + 0x0B, 0xD5, 0xB8, 0x81, 0xE7, 0xE5, 0x47, 0x6D, + 0x31, 0x9C, 0xE4, 0xFE, 0x9F, 0x19, 0x18, 0x6E, + 0x4C, 0x08, 0x26, 0xF4, 0x4F, 0x13, 0x1E, 0xB0, + 0x48, 0xE6, 0x5B, 0xE2, 0x42, 0xB1, 0x17, 0x2C, + 0x63, 0xBA, 0xDB, 0x12, 0x3A, 0xB0, 0xCB, 0xE8 + }, + { + 0xD3, 0x2E, 0x9E, 0xC0, 0x2D, 0x38, 0xD4, 0xE1, + 0xB8, 0x24, 0x9D, 0xF8, 0xDC, 0xB0, 0x0C, 0x5B, + 0x9C, 0x68, 0xEB, 0x89, 0x22, 0x67, 0x2E, 0x35, + 0x05, 0x39, 0x3B, 0x6A, 0x21, 0x0B, 0xA5, 0x6F, + 0x94, 0x96, 0xE5, 0xEE, 0x04, 0x90, 0xEF, 0x38, + 0x7C, 0x3C, 0xDE, 0xC0, 0x61, 0xF0, 0x6B, 0xC0, + 0x38, 0x2D, 0x93, 0x04, 0xCA, 0xFB, 0xB8, 0xE0, + 0xCD, 0x33, 0xD5, 0x70, 0x29, 0xE6, 0x2D, 0xF2 + }, + { + 0x8C, 0x15, 0x12, 0x46, 0x60, 0x89, 0xF0, 0x5B, + 0x37, 0x75, 0xC2, 0x62, 0xB6, 0x2D, 0x22, 0xB8, + 0x38, 0x54, 0xA8, 0x32, 0x18, 0x13, 0x0B, 0x4E, + 0xC9, 0x1B, 0x3C, 0xCB, 0xD2, 0x93, 0xD2, 0xA5, + 0x43, 0x02, 0xCE, 0xCA, 0xAB, 0x9B, 0x10, 0x0C, + 0x68, 0xD1, 0xE6, 0xDD, 0xC8, 0xF0, 0x7C, 0xDD, + 0xBD, 0xFE, 0x6F, 0xDA, 0xAA, 0xF0, 0x99, 0xCC, + 0x09, 0xD6, 0xB7, 0x25, 0x87, 0x9C, 0x63, 0x69 + }, + { + 0x91, 0xA7, 0xF6, 0x1C, 0x97, 0xC2, 0x91, 0x1E, + 0x4C, 0x81, 0x2E, 0xF7, 0x1D, 0x78, 0x0A, 0xD8, + 0xFA, 0x78, 0x87, 0x94, 0x56, 0x1D, 0x08, 0x30, + 0x3F, 0xD1, 0xC1, 0xCB, 0x60, 0x8A, 0x46, 0xA1, + 0x25, 0x63, 0x08, 0x6E, 0xC5, 0xB3, 0x9D, 0x47, + 0x1A, 0xED, 0x94, 0xFB, 0x0F, 0x6C, 0x67, 0x8A, + 0x43, 0xB8, 0x79, 0x29, 0x32, 0xF9, 0x02, 0x8D, + 0x77, 0x2A, 0x22, 0x76, 0x8E, 0xA2, 0x3A, 0x9B + }, + { + 0x4F, 0x6B, 0xB2, 0x22, 0xA3, 0x95, 0xE8, 0xB1, + 0x8F, 0x6B, 0xA1, 0x55, 0x47, 0x7A, 0xED, 0x3F, + 0x07, 0x29, 0xAC, 0x9E, 0x83, 0xE1, 0x6D, 0x31, + 0xA2, 0xA8, 0xBC, 0x65, 0x54, 0x22, 0xB8, 0x37, + 0xC8, 0x91, 0xC6, 0x19, 0x9E, 0x6F, 0x0D, 0x75, + 0x79, 0x9E, 0x3B, 0x69, 0x15, 0x25, 0xC5, 0x81, + 0x95, 0x35, 0x17, 0xF2, 0x52, 0xC4, 0xB9, 0xE3, + 0xA2, 0x7A, 0x28, 0xFB, 0xAF, 0x49, 0x64, 0x4C + }, + { + 0x5D, 0x06, 0xC0, 0x7E, 0x7A, 0x64, 0x6C, 0x41, + 0x3A, 0x50, 0x1C, 0x3F, 0x4B, 0xB2, 0xFC, 0x38, + 0x12, 0x7D, 0xE7, 0x50, 0x9B, 0x70, 0x77, 0xC4, + 0xD9, 0xB5, 0x61, 0x32, 0x01, 0xC1, 0xAA, 0x02, + 0xFD, 0x5F, 0x79, 0xD2, 0x74, 0x59, 0x15, 0xDD, + 0x57, 0xFB, 0xCB, 0x4C, 0xE0, 0x86, 0x95, 0xF6, + 0xEF, 0xC0, 0xCB, 0x3D, 0x2D, 0x33, 0x0E, 0x19, + 0xB4, 0xB0, 0xE6, 0x00, 0x4E, 0xA6, 0x47, 0x1E + }, + { + 0xB9, 0x67, 0x56, 0xE5, 0x79, 0x09, 0x96, 0x8F, + 0x14, 0xB7, 0x96, 0xA5, 0xD3, 0x0F, 0x4C, 0x9D, + 0x67, 0x14, 0x72, 0xCF, 0x82, 0xC8, 0xCF, 0xB2, + 0xCA, 0xCA, 0x7A, 0xC7, 0xA4, 0x4C, 0xA0, 0xA1, + 0x4C, 0x98, 0x42, 0xD0, 0x0C, 0x82, 0xE3, 0x37, + 0x50, 0x2C, 0x94, 0xD5, 0x96, 0x0A, 0xCA, 0x4C, + 0x49, 0x2E, 0xA7, 0xB0, 0xDF, 0x91, 0x9D, 0xDF, + 0x1A, 0xAD, 0xA2, 0xA2, 0x75, 0xBB, 0x10, 0xD4 + }, + { + 0xFF, 0x0A, 0x01, 0x5E, 0x98, 0xDB, 0x9C, 0x99, + 0xF0, 0x39, 0x77, 0x71, 0x0A, 0xAC, 0x3E, 0x65, + 0x8C, 0x0D, 0x89, 0x6F, 0x6D, 0x71, 0xD6, 0x18, + 0xBA, 0x79, 0xDC, 0x6C, 0xF7, 0x2A, 0xC7, 0x5B, + 0x7C, 0x03, 0x8E, 0xB6, 0x86, 0x2D, 0xED, 0xE4, + 0x54, 0x3E, 0x14, 0x54, 0x13, 0xA6, 0x36, 0x8D, + 0x69, 0xF5, 0x72, 0x2C, 0x82, 0x7B, 0xA3, 0xEF, + 0x25, 0xB6, 0xAE, 0x64, 0x40, 0xD3, 0x92, 0x76 + }, + { + 0x5B, 0x21, 0xC5, 0xFD, 0x88, 0x68, 0x36, 0x76, + 0x12, 0x47, 0x4F, 0xA2, 0xE7, 0x0E, 0x9C, 0xFA, + 0x22, 0x01, 0xFF, 0xEE, 0xE8, 0xFA, 0xFA, 0xB5, + 0x79, 0x7A, 0xD5, 0x8F, 0xEF, 0xA1, 0x7C, 0x9B, + 0x5B, 0x10, 0x7D, 0xA4, 0xA3, 0xDB, 0x63, 0x20, + 0xBA, 0xAF, 0x2C, 0x86, 0x17, 0xD5, 0xA5, 0x1D, + 0xF9, 0x14, 0xAE, 0x88, 0xDA, 0x38, 0x67, 0xC2, + 0xD4, 0x1F, 0x0C, 0xC1, 0x4F, 0xA6, 0x79, 0x28 + }, +}; + + + + +static const uint8_t blake2b_keyed_kat[KAT_LENGTH][BLAKE2B_OUTBYTES] = +{ + { + 0x10, 0xEB, 0xB6, 0x77, 0x00, 0xB1, 0x86, 0x8E, + 0xFB, 0x44, 0x17, 0x98, 0x7A, 0xCF, 0x46, 0x90, + 0xAE, 0x9D, 0x97, 0x2F, 0xB7, 0xA5, 0x90, 0xC2, + 0xF0, 0x28, 0x71, 0x79, 0x9A, 0xAA, 0x47, 0x86, + 0xB5, 0xE9, 0x96, 0xE8, 0xF0, 0xF4, 0xEB, 0x98, + 0x1F, 0xC2, 0x14, 0xB0, 0x05, 0xF4, 0x2D, 0x2F, + 0xF4, 0x23, 0x34, 0x99, 0x39, 0x16, 0x53, 0xDF, + 0x7A, 0xEF, 0xCB, 0xC1, 0x3F, 0xC5, 0x15, 0x68 + }, + { + 0x96, 0x1F, 0x6D, 0xD1, 0xE4, 0xDD, 0x30, 0xF6, + 0x39, 0x01, 0x69, 0x0C, 0x51, 0x2E, 0x78, 0xE4, + 0xB4, 0x5E, 0x47, 0x42, 0xED, 0x19, 0x7C, 0x3C, + 0x5E, 0x45, 0xC5, 0x49, 0xFD, 0x25, 0xF2, 0xE4, + 0x18, 0x7B, 0x0B, 0xC9, 0xFE, 0x30, 0x49, 0x2B, + 0x16, 0xB0, 0xD0, 0xBC, 0x4E, 0xF9, 0xB0, 0xF3, + 0x4C, 0x70, 0x03, 0xFA, 0xC0, 0x9A, 0x5E, 0xF1, + 0x53, 0x2E, 0x69, 0x43, 0x02, 0x34, 0xCE, 0xBD + }, + { + 0xDA, 0x2C, 0xFB, 0xE2, 0xD8, 0x40, 0x9A, 0x0F, + 0x38, 0x02, 0x61, 0x13, 0x88, 0x4F, 0x84, 0xB5, + 0x01, 0x56, 0x37, 0x1A, 0xE3, 0x04, 0xC4, 0x43, + 0x01, 0x73, 0xD0, 0x8A, 0x99, 0xD9, 0xFB, 0x1B, + 0x98, 0x31, 0x64, 0xA3, 0x77, 0x07, 0x06, 0xD5, + 0x37, 0xF4, 0x9E, 0x0C, 0x91, 0x6D, 0x9F, 0x32, + 0xB9, 0x5C, 0xC3, 0x7A, 0x95, 0xB9, 0x9D, 0x85, + 0x74, 0x36, 0xF0, 0x23, 0x2C, 0x88, 0xA9, 0x65 + }, + { + 0x33, 0xD0, 0x82, 0x5D, 0xDD, 0xF7, 0xAD, 0xA9, + 0x9B, 0x0E, 0x7E, 0x30, 0x71, 0x04, 0xAD, 0x07, + 0xCA, 0x9C, 0xFD, 0x96, 0x92, 0x21, 0x4F, 0x15, + 0x61, 0x35, 0x63, 0x15, 0xE7, 0x84, 0xF3, 0xE5, + 0xA1, 0x7E, 0x36, 0x4A, 0xE9, 0xDB, 0xB1, 0x4C, + 0xB2, 0x03, 0x6D, 0xF9, 0x32, 0xB7, 0x7F, 0x4B, + 0x29, 0x27, 0x61, 0x36, 0x5F, 0xB3, 0x28, 0xDE, + 0x7A, 0xFD, 0xC6, 0xD8, 0x99, 0x8F, 0x5F, 0xC1 + }, + { + 0xBE, 0xAA, 0x5A, 0x3D, 0x08, 0xF3, 0x80, 0x71, + 0x43, 0xCF, 0x62, 0x1D, 0x95, 0xCD, 0x69, 0x05, + 0x14, 0xD0, 0xB4, 0x9E, 0xFF, 0xF9, 0xC9, 0x1D, + 0x24, 0xB5, 0x92, 0x41, 0xEC, 0x0E, 0xEF, 0xA5, + 0xF6, 0x01, 0x96, 0xD4, 0x07, 0x04, 0x8B, 0xBA, + 0x8D, 0x21, 0x46, 0x82, 0x8E, 0xBC, 0xB0, 0x48, + 0x8D, 0x88, 0x42, 0xFD, 0x56, 0xBB, 0x4F, 0x6D, + 0xF8, 0xE1, 0x9C, 0x4B, 0x4D, 0xAA, 0xB8, 0xAC + }, + { + 0x09, 0x80, 0x84, 0xB5, 0x1F, 0xD1, 0x3D, 0xEA, + 0xE5, 0xF4, 0x32, 0x0D, 0xE9, 0x4A, 0x68, 0x8E, + 0xE0, 0x7B, 0xAE, 0xA2, 0x80, 0x04, 0x86, 0x68, + 0x9A, 0x86, 0x36, 0x11, 0x7B, 0x46, 0xC1, 0xF4, + 0xC1, 0xF6, 0xAF, 0x7F, 0x74, 0xAE, 0x7C, 0x85, + 0x76, 0x00, 0x45, 0x6A, 0x58, 0xA3, 0xAF, 0x25, + 0x1D, 0xC4, 0x72, 0x3A, 0x64, 0xCC, 0x7C, 0x0A, + 0x5A, 0xB6, 0xD9, 0xCA, 0xC9, 0x1C, 0x20, 0xBB + }, + { + 0x60, 0x44, 0x54, 0x0D, 0x56, 0x08, 0x53, 0xEB, + 0x1C, 0x57, 0xDF, 0x00, 0x77, 0xDD, 0x38, 0x10, + 0x94, 0x78, 0x1C, 0xDB, 0x90, 0x73, 0xE5, 0xB1, + 0xB3, 0xD3, 0xF6, 0xC7, 0x82, 0x9E, 0x12, 0x06, + 0x6B, 0xBA, 0xCA, 0x96, 0xD9, 0x89, 0xA6, 0x90, + 0xDE, 0x72, 0xCA, 0x31, 0x33, 0xA8, 0x36, 0x52, + 0xBA, 0x28, 0x4A, 0x6D, 0x62, 0x94, 0x2B, 0x27, + 0x1F, 0xFA, 0x26, 0x20, 0xC9, 0xE7, 0x5B, 0x1F + }, + { + 0x7A, 0x8C, 0xFE, 0x9B, 0x90, 0xF7, 0x5F, 0x7E, + 0xCB, 0x3A, 0xCC, 0x05, 0x3A, 0xAE, 0xD6, 0x19, + 0x31, 0x12, 0xB6, 0xF6, 0xA4, 0xAE, 0xEB, 0x3F, + 0x65, 0xD3, 0xDE, 0x54, 0x19, 0x42, 0xDE, 0xB9, + 0xE2, 0x22, 0x81, 0x52, 0xA3, 0xC4, 0xBB, 0xBE, + 0x72, 0xFC, 0x3B, 0x12, 0x62, 0x95, 0x28, 0xCF, + 0xBB, 0x09, 0xFE, 0x63, 0x0F, 0x04, 0x74, 0x33, + 0x9F, 0x54, 0xAB, 0xF4, 0x53, 0xE2, 0xED, 0x52 + }, + { + 0x38, 0x0B, 0xEA, 0xF6, 0xEA, 0x7C, 0xC9, 0x36, + 0x5E, 0x27, 0x0E, 0xF0, 0xE6, 0xF3, 0xA6, 0x4F, + 0xB9, 0x02, 0xAC, 0xAE, 0x51, 0xDD, 0x55, 0x12, + 0xF8, 0x42, 0x59, 0xAD, 0x2C, 0x91, 0xF4, 0xBC, + 0x41, 0x08, 0xDB, 0x73, 0x19, 0x2A, 0x5B, 0xBF, + 0xB0, 0xCB, 0xCF, 0x71, 0xE4, 0x6C, 0x3E, 0x21, + 0xAE, 0xE1, 0xC5, 0xE8, 0x60, 0xDC, 0x96, 0xE8, + 0xEB, 0x0B, 0x7B, 0x84, 0x26, 0xE6, 0xAB, 0xE9 + }, + { + 0x60, 0xFE, 0x3C, 0x45, 0x35, 0xE1, 0xB5, 0x9D, + 0x9A, 0x61, 0xEA, 0x85, 0x00, 0xBF, 0xAC, 0x41, + 0xA6, 0x9D, 0xFF, 0xB1, 0xCE, 0xAD, 0xD9, 0xAC, + 0xA3, 0x23, 0xE9, 0xA6, 0x25, 0xB6, 0x4D, 0xA5, + 0x76, 0x3B, 0xAD, 0x72, 0x26, 0xDA, 0x02, 0xB9, + 0xC8, 0xC4, 0xF1, 0xA5, 0xDE, 0x14, 0x0A, 0xC5, + 0xA6, 0xC1, 0x12, 0x4E, 0x4F, 0x71, 0x8C, 0xE0, + 0xB2, 0x8E, 0xA4, 0x73, 0x93, 0xAA, 0x66, 0x37 + }, + { + 0x4F, 0xE1, 0x81, 0xF5, 0x4A, 0xD6, 0x3A, 0x29, + 0x83, 0xFE, 0xAA, 0xF7, 0x7D, 0x1E, 0x72, 0x35, + 0xC2, 0xBE, 0xB1, 0x7F, 0xA3, 0x28, 0xB6, 0xD9, + 0x50, 0x5B, 0xDA, 0x32, 0x7D, 0xF1, 0x9F, 0xC3, + 0x7F, 0x02, 0xC4, 0xB6, 0xF0, 0x36, 0x8C, 0xE2, + 0x31, 0x47, 0x31, 0x3A, 0x8E, 0x57, 0x38, 0xB5, + 0xFA, 0x2A, 0x95, 0xB2, 0x9D, 0xE1, 0xC7, 0xF8, + 0x26, 0x4E, 0xB7, 0x7B, 0x69, 0xF5, 0x85, 0xCD + }, + { + 0xF2, 0x28, 0x77, 0x3C, 0xE3, 0xF3, 0xA4, 0x2B, + 0x5F, 0x14, 0x4D, 0x63, 0x23, 0x7A, 0x72, 0xD9, + 0x96, 0x93, 0xAD, 0xB8, 0x83, 0x7D, 0x0E, 0x11, + 0x2A, 0x8A, 0x0F, 0x8F, 0xFF, 0xF2, 0xC3, 0x62, + 0x85, 0x7A, 0xC4, 0x9C, 0x11, 0xEC, 0x74, 0x0D, + 0x15, 0x00, 0x74, 0x9D, 0xAC, 0x9B, 0x1F, 0x45, + 0x48, 0x10, 0x8B, 0xF3, 0x15, 0x57, 0x94, 0xDC, + 0xC9, 0xE4, 0x08, 0x28, 0x49, 0xE2, 0xB8, 0x5B + }, + { + 0x96, 0x24, 0x52, 0xA8, 0x45, 0x5C, 0xC5, 0x6C, + 0x85, 0x11, 0x31, 0x7E, 0x3B, 0x1F, 0x3B, 0x2C, + 0x37, 0xDF, 0x75, 0xF5, 0x88, 0xE9, 0x43, 0x25, + 0xFD, 0xD7, 0x70, 0x70, 0x35, 0x9C, 0xF6, 0x3A, + 0x9A, 0xE6, 0xE9, 0x30, 0x93, 0x6F, 0xDF, 0x8E, + 0x1E, 0x08, 0xFF, 0xCA, 0x44, 0x0C, 0xFB, 0x72, + 0xC2, 0x8F, 0x06, 0xD8, 0x9A, 0x21, 0x51, 0xD1, + 0xC4, 0x6C, 0xD5, 0xB2, 0x68, 0xEF, 0x85, 0x63 + }, + { + 0x43, 0xD4, 0x4B, 0xFA, 0x18, 0x76, 0x8C, 0x59, + 0x89, 0x6B, 0xF7, 0xED, 0x17, 0x65, 0xCB, 0x2D, + 0x14, 0xAF, 0x8C, 0x26, 0x02, 0x66, 0x03, 0x90, + 0x99, 0xB2, 0x5A, 0x60, 0x3E, 0x4D, 0xDC, 0x50, + 0x39, 0xD6, 0xEF, 0x3A, 0x91, 0x84, 0x7D, 0x10, + 0x88, 0xD4, 0x01, 0xC0, 0xC7, 0xE8, 0x47, 0x78, + 0x1A, 0x8A, 0x59, 0x0D, 0x33, 0xA3, 0xC6, 0xCB, + 0x4D, 0xF0, 0xFA, 0xB1, 0xC2, 0xF2, 0x23, 0x55 + }, + { + 0xDC, 0xFF, 0xA9, 0xD5, 0x8C, 0x2A, 0x4C, 0xA2, + 0xCD, 0xBB, 0x0C, 0x7A, 0xA4, 0xC4, 0xC1, 0xD4, + 0x51, 0x65, 0x19, 0x00, 0x89, 0xF4, 0xE9, 0x83, + 0xBB, 0x1C, 0x2C, 0xAB, 0x4A, 0xAE, 0xFF, 0x1F, + 0xA2, 0xB5, 0xEE, 0x51, 0x6F, 0xEC, 0xD7, 0x80, + 0x54, 0x02, 0x40, 0xBF, 0x37, 0xE5, 0x6C, 0x8B, + 0xCC, 0xA7, 0xFA, 0xB9, 0x80, 0xE1, 0xE6, 0x1C, + 0x94, 0x00, 0xD8, 0xA9, 0xA5, 0xB1, 0x4A, 0xC6 + }, + { + 0x6F, 0xBF, 0x31, 0xB4, 0x5A, 0xB0, 0xC0, 0xB8, + 0xDA, 0xD1, 0xC0, 0xF5, 0xF4, 0x06, 0x13, 0x79, + 0x91, 0x2D, 0xDE, 0x5A, 0xA9, 0x22, 0x09, 0x9A, + 0x03, 0x0B, 0x72, 0x5C, 0x73, 0x34, 0x6C, 0x52, + 0x42, 0x91, 0xAD, 0xEF, 0x89, 0xD2, 0xF6, 0xFD, + 0x8D, 0xFC, 0xDA, 0x6D, 0x07, 0xDA, 0xD8, 0x11, + 0xA9, 0x31, 0x45, 0x36, 0xC2, 0x91, 0x5E, 0xD4, + 0x5D, 0xA3, 0x49, 0x47, 0xE8, 0x3D, 0xE3, 0x4E + }, + { + 0xA0, 0xC6, 0x5B, 0xDD, 0xDE, 0x8A, 0xDE, 0xF5, + 0x72, 0x82, 0xB0, 0x4B, 0x11, 0xE7, 0xBC, 0x8A, + 0xAB, 0x10, 0x5B, 0x99, 0x23, 0x1B, 0x75, 0x0C, + 0x02, 0x1F, 0x4A, 0x73, 0x5C, 0xB1, 0xBC, 0xFA, + 0xB8, 0x75, 0x53, 0xBB, 0xA3, 0xAB, 0xB0, 0xC3, + 0xE6, 0x4A, 0x0B, 0x69, 0x55, 0x28, 0x51, 0x85, + 0xA0, 0xBD, 0x35, 0xFB, 0x8C, 0xFD, 0xE5, 0x57, + 0x32, 0x9B, 0xEB, 0xB1, 0xF6, 0x29, 0xEE, 0x93 + }, + { + 0xF9, 0x9D, 0x81, 0x55, 0x50, 0x55, 0x8E, 0x81, + 0xEC, 0xA2, 0xF9, 0x67, 0x18, 0xAE, 0xD1, 0x0D, + 0x86, 0xF3, 0xF1, 0xCF, 0xB6, 0x75, 0xCC, 0xE0, + 0x6B, 0x0E, 0xFF, 0x02, 0xF6, 0x17, 0xC5, 0xA4, + 0x2C, 0x5A, 0xA7, 0x60, 0x27, 0x0F, 0x26, 0x79, + 0xDA, 0x26, 0x77, 0xC5, 0xAE, 0xB9, 0x4F, 0x11, + 0x42, 0x27, 0x7F, 0x21, 0xC7, 0xF7, 0x9F, 0x3C, + 0x4F, 0x0C, 0xCE, 0x4E, 0xD8, 0xEE, 0x62, 0xB1 + }, + { + 0x95, 0x39, 0x1D, 0xA8, 0xFC, 0x7B, 0x91, 0x7A, + 0x20, 0x44, 0xB3, 0xD6, 0xF5, 0x37, 0x4E, 0x1C, + 0xA0, 0x72, 0xB4, 0x14, 0x54, 0xD5, 0x72, 0xC7, + 0x35, 0x6C, 0x05, 0xFD, 0x4B, 0xC1, 0xE0, 0xF4, + 0x0B, 0x8B, 0xB8, 0xB4, 0xA9, 0xF6, 0xBC, 0xE9, + 0xBE, 0x2C, 0x46, 0x23, 0xC3, 0x99, 0xB0, 0xDC, + 0xA0, 0xDA, 0xB0, 0x5C, 0xB7, 0x28, 0x1B, 0x71, + 0xA2, 0x1B, 0x0E, 0xBC, 0xD9, 0xE5, 0x56, 0x70 + }, + { + 0x04, 0xB9, 0xCD, 0x3D, 0x20, 0xD2, 0x21, 0xC0, + 0x9A, 0xC8, 0x69, 0x13, 0xD3, 0xDC, 0x63, 0x04, + 0x19, 0x89, 0xA9, 0xA1, 0xE6, 0x94, 0xF1, 0xE6, + 0x39, 0xA3, 0xBA, 0x7E, 0x45, 0x18, 0x40, 0xF7, + 0x50, 0xC2, 0xFC, 0x19, 0x1D, 0x56, 0xAD, 0x61, + 0xF2, 0xE7, 0x93, 0x6B, 0xC0, 0xAC, 0x8E, 0x09, + 0x4B, 0x60, 0xCA, 0xEE, 0xD8, 0x78, 0xC1, 0x87, + 0x99, 0x04, 0x54, 0x02, 0xD6, 0x1C, 0xEA, 0xF9 + }, + { + 0xEC, 0x0E, 0x0E, 0xF7, 0x07, 0xE4, 0xED, 0x6C, + 0x0C, 0x66, 0xF9, 0xE0, 0x89, 0xE4, 0x95, 0x4B, + 0x05, 0x80, 0x30, 0xD2, 0xDD, 0x86, 0x39, 0x8F, + 0xE8, 0x40, 0x59, 0x63, 0x1F, 0x9E, 0xE5, 0x91, + 0xD9, 0xD7, 0x73, 0x75, 0x35, 0x51, 0x49, 0x17, + 0x8C, 0x0C, 0xF8, 0xF8, 0xE7, 0xC4, 0x9E, 0xD2, + 0xA5, 0xE4, 0xF9, 0x54, 0x88, 0xA2, 0x24, 0x70, + 0x67, 0xC2, 0x08, 0x51, 0x0F, 0xAD, 0xC4, 0x4C + }, + { + 0x9A, 0x37, 0xCC, 0xE2, 0x73, 0xB7, 0x9C, 0x09, + 0x91, 0x36, 0x77, 0x51, 0x0E, 0xAF, 0x76, 0x88, + 0xE8, 0x9B, 0x33, 0x14, 0xD3, 0x53, 0x2F, 0xD2, + 0x76, 0x4C, 0x39, 0xDE, 0x02, 0x2A, 0x29, 0x45, + 0xB5, 0x71, 0x0D, 0x13, 0x51, 0x7A, 0xF8, 0xDD, + 0xC0, 0x31, 0x66, 0x24, 0xE7, 0x3B, 0xEC, 0x1C, + 0xE6, 0x7D, 0xF1, 0x52, 0x28, 0x30, 0x20, 0x36, + 0xF3, 0x30, 0xAB, 0x0C, 0xB4, 0xD2, 0x18, 0xDD + }, + { + 0x4C, 0xF9, 0xBB, 0x8F, 0xB3, 0xD4, 0xDE, 0x8B, + 0x38, 0xB2, 0xF2, 0x62, 0xD3, 0xC4, 0x0F, 0x46, + 0xDF, 0xE7, 0x47, 0xE8, 0xFC, 0x0A, 0x41, 0x4C, + 0x19, 0x3D, 0x9F, 0xCF, 0x75, 0x31, 0x06, 0xCE, + 0x47, 0xA1, 0x8F, 0x17, 0x2F, 0x12, 0xE8, 0xA2, + 0xF1, 0xC2, 0x67, 0x26, 0x54, 0x53, 0x58, 0xE5, + 0xEE, 0x28, 0xC9, 0xE2, 0x21, 0x3A, 0x87, 0x87, + 0xAA, 0xFB, 0xC5, 0x16, 0xD2, 0x34, 0x31, 0x52 + }, + { + 0x64, 0xE0, 0xC6, 0x3A, 0xF9, 0xC8, 0x08, 0xFD, + 0x89, 0x31, 0x37, 0x12, 0x98, 0x67, 0xFD, 0x91, + 0x93, 0x9D, 0x53, 0xF2, 0xAF, 0x04, 0xBE, 0x4F, + 0xA2, 0x68, 0x00, 0x61, 0x00, 0x06, 0x9B, 0x2D, + 0x69, 0xDA, 0xA5, 0xC5, 0xD8, 0xED, 0x7F, 0xDD, + 0xCB, 0x2A, 0x70, 0xEE, 0xEC, 0xDF, 0x2B, 0x10, + 0x5D, 0xD4, 0x6A, 0x1E, 0x3B, 0x73, 0x11, 0x72, + 0x8F, 0x63, 0x9A, 0xB4, 0x89, 0x32, 0x6B, 0xC9 + }, + { + 0x5E, 0x9C, 0x93, 0x15, 0x8D, 0x65, 0x9B, 0x2D, + 0xEF, 0x06, 0xB0, 0xC3, 0xC7, 0x56, 0x50, 0x45, + 0x54, 0x26, 0x62, 0xD6, 0xEE, 0xE8, 0xA9, 0x6A, + 0x89, 0xB7, 0x8A, 0xDE, 0x09, 0xFE, 0x8B, 0x3D, + 0xCC, 0x09, 0x6D, 0x4F, 0xE4, 0x88, 0x15, 0xD8, + 0x8D, 0x8F, 0x82, 0x62, 0x01, 0x56, 0x60, 0x2A, + 0xF5, 0x41, 0x95, 0x5E, 0x1F, 0x6C, 0xA3, 0x0D, + 0xCE, 0x14, 0xE2, 0x54, 0xC3, 0x26, 0xB8, 0x8F + }, + { + 0x77, 0x75, 0xDF, 0xF8, 0x89, 0x45, 0x8D, 0xD1, + 0x1A, 0xEF, 0x41, 0x72, 0x76, 0x85, 0x3E, 0x21, + 0x33, 0x5E, 0xB8, 0x8E, 0x4D, 0xEC, 0x9C, 0xFB, + 0x4E, 0x9E, 0xDB, 0x49, 0x82, 0x00, 0x88, 0x55, + 0x1A, 0x2C, 0xA6, 0x03, 0x39, 0xF1, 0x20, 0x66, + 0x10, 0x11, 0x69, 0xF0, 0xDF, 0xE8, 0x4B, 0x09, + 0x8F, 0xDD, 0xB1, 0x48, 0xD9, 0xDA, 0x6B, 0x3D, + 0x61, 0x3D, 0xF2, 0x63, 0x88, 0x9A, 0xD6, 0x4B + }, + { + 0xF0, 0xD2, 0x80, 0x5A, 0xFB, 0xB9, 0x1F, 0x74, + 0x39, 0x51, 0x35, 0x1A, 0x6D, 0x02, 0x4F, 0x93, + 0x53, 0xA2, 0x3C, 0x7C, 0xE1, 0xFC, 0x2B, 0x05, + 0x1B, 0x3A, 0x8B, 0x96, 0x8C, 0x23, 0x3F, 0x46, + 0xF5, 0x0F, 0x80, 0x6E, 0xCB, 0x15, 0x68, 0xFF, + 0xAA, 0x0B, 0x60, 0x66, 0x1E, 0x33, 0x4B, 0x21, + 0xDD, 0xE0, 0x4F, 0x8F, 0xA1, 0x55, 0xAC, 0x74, + 0x0E, 0xEB, 0x42, 0xE2, 0x0B, 0x60, 0xD7, 0x64 + }, + { + 0x86, 0xA2, 0xAF, 0x31, 0x6E, 0x7D, 0x77, 0x54, + 0x20, 0x1B, 0x94, 0x2E, 0x27, 0x53, 0x64, 0xAC, + 0x12, 0xEA, 0x89, 0x62, 0xAB, 0x5B, 0xD8, 0xD7, + 0xFB, 0x27, 0x6D, 0xC5, 0xFB, 0xFF, 0xC8, 0xF9, + 0xA2, 0x8C, 0xAE, 0x4E, 0x48, 0x67, 0xDF, 0x67, + 0x80, 0xD9, 0xB7, 0x25, 0x24, 0x16, 0x09, 0x27, + 0xC8, 0x55, 0xDA, 0x5B, 0x60, 0x78, 0xE0, 0xB5, + 0x54, 0xAA, 0x91, 0xE3, 0x1C, 0xB9, 0xCA, 0x1D + }, + { + 0x10, 0xBD, 0xF0, 0xCA, 0xA0, 0x80, 0x27, 0x05, + 0xE7, 0x06, 0x36, 0x9B, 0xAF, 0x8A, 0x3F, 0x79, + 0xD7, 0x2C, 0x0A, 0x03, 0xA8, 0x06, 0x75, 0xA7, + 0xBB, 0xB0, 0x0B, 0xE3, 0xA4, 0x5E, 0x51, 0x64, + 0x24, 0xD1, 0xEE, 0x88, 0xEF, 0xB5, 0x6F, 0x6D, + 0x57, 0x77, 0x54, 0x5A, 0xE6, 0xE2, 0x77, 0x65, + 0xC3, 0xA8, 0xF5, 0xE4, 0x93, 0xFC, 0x30, 0x89, + 0x15, 0x63, 0x89, 0x33, 0xA1, 0xDF, 0xEE, 0x55 + }, + { + 0xB0, 0x17, 0x81, 0x09, 0x2B, 0x17, 0x48, 0x45, + 0x9E, 0x2E, 0x4E, 0xC1, 0x78, 0x69, 0x66, 0x27, + 0xBF, 0x4E, 0xBA, 0xFE, 0xBB, 0xA7, 0x74, 0xEC, + 0xF0, 0x18, 0xB7, 0x9A, 0x68, 0xAE, 0xB8, 0x49, + 0x17, 0xBF, 0x0B, 0x84, 0xBB, 0x79, 0xD1, 0x7B, + 0x74, 0x31, 0x51, 0x14, 0x4C, 0xD6, 0x6B, 0x7B, + 0x33, 0xA4, 0xB9, 0xE5, 0x2C, 0x76, 0xC4, 0xE1, + 0x12, 0x05, 0x0F, 0xF5, 0x38, 0x5B, 0x7F, 0x0B + }, + { + 0xC6, 0xDB, 0xC6, 0x1D, 0xEC, 0x6E, 0xAE, 0xAC, + 0x81, 0xE3, 0xD5, 0xF7, 0x55, 0x20, 0x3C, 0x8E, + 0x22, 0x05, 0x51, 0x53, 0x4A, 0x0B, 0x2F, 0xD1, + 0x05, 0xA9, 0x18, 0x89, 0x94, 0x5A, 0x63, 0x85, + 0x50, 0x20, 0x4F, 0x44, 0x09, 0x3D, 0xD9, 0x98, + 0xC0, 0x76, 0x20, 0x5D, 0xFF, 0xAD, 0x70, 0x3A, + 0x0E, 0x5C, 0xD3, 0xC7, 0xF4, 0x38, 0xA7, 0xE6, + 0x34, 0xCD, 0x59, 0xFE, 0xDE, 0xDB, 0x53, 0x9E + }, + { + 0xEB, 0xA5, 0x1A, 0xCF, 0xFB, 0x4C, 0xEA, 0x31, + 0xDB, 0x4B, 0x8D, 0x87, 0xE9, 0xBF, 0x7D, 0xD4, + 0x8F, 0xE9, 0x7B, 0x02, 0x53, 0xAE, 0x67, 0xAA, + 0x58, 0x0F, 0x9A, 0xC4, 0xA9, 0xD9, 0x41, 0xF2, + 0xBE, 0xA5, 0x18, 0xEE, 0x28, 0x68, 0x18, 0xCC, + 0x9F, 0x63, 0x3F, 0x2A, 0x3B, 0x9F, 0xB6, 0x8E, + 0x59, 0x4B, 0x48, 0xCD, 0xD6, 0xD5, 0x15, 0xBF, + 0x1D, 0x52, 0xBA, 0x6C, 0x85, 0xA2, 0x03, 0xA7 + }, + { + 0x86, 0x22, 0x1F, 0x3A, 0xDA, 0x52, 0x03, 0x7B, + 0x72, 0x22, 0x4F, 0x10, 0x5D, 0x79, 0x99, 0x23, + 0x1C, 0x5E, 0x55, 0x34, 0xD0, 0x3D, 0xA9, 0xD9, + 0xC0, 0xA1, 0x2A, 0xCB, 0x68, 0x46, 0x0C, 0xD3, + 0x75, 0xDA, 0xF8, 0xE2, 0x43, 0x86, 0x28, 0x6F, + 0x96, 0x68, 0xF7, 0x23, 0x26, 0xDB, 0xF9, 0x9B, + 0xA0, 0x94, 0x39, 0x24, 0x37, 0xD3, 0x98, 0xE9, + 0x5B, 0xB8, 0x16, 0x1D, 0x71, 0x7F, 0x89, 0x91 + }, + { + 0x55, 0x95, 0xE0, 0x5C, 0x13, 0xA7, 0xEC, 0x4D, + 0xC8, 0xF4, 0x1F, 0xB7, 0x0C, 0xB5, 0x0A, 0x71, + 0xBC, 0xE1, 0x7C, 0x02, 0x4F, 0xF6, 0xDE, 0x7A, + 0xF6, 0x18, 0xD0, 0xCC, 0x4E, 0x9C, 0x32, 0xD9, + 0x57, 0x0D, 0x6D, 0x3E, 0xA4, 0x5B, 0x86, 0x52, + 0x54, 0x91, 0x03, 0x0C, 0x0D, 0x8F, 0x2B, 0x18, + 0x36, 0xD5, 0x77, 0x8C, 0x1C, 0xE7, 0x35, 0xC1, + 0x77, 0x07, 0xDF, 0x36, 0x4D, 0x05, 0x43, 0x47 + }, + { + 0xCE, 0x0F, 0x4F, 0x6A, 0xCA, 0x89, 0x59, 0x0A, + 0x37, 0xFE, 0x03, 0x4D, 0xD7, 0x4D, 0xD5, 0xFA, + 0x65, 0xEB, 0x1C, 0xBD, 0x0A, 0x41, 0x50, 0x8A, + 0xAD, 0xDC, 0x09, 0x35, 0x1A, 0x3C, 0xEA, 0x6D, + 0x18, 0xCB, 0x21, 0x89, 0xC5, 0x4B, 0x70, 0x0C, + 0x00, 0x9F, 0x4C, 0xBF, 0x05, 0x21, 0xC7, 0xEA, + 0x01, 0xBE, 0x61, 0xC5, 0xAE, 0x09, 0xCB, 0x54, + 0xF2, 0x7B, 0xC1, 0xB4, 0x4D, 0x65, 0x8C, 0x82 + }, + { + 0x7E, 0xE8, 0x0B, 0x06, 0xA2, 0x15, 0xA3, 0xBC, + 0xA9, 0x70, 0xC7, 0x7C, 0xDA, 0x87, 0x61, 0x82, + 0x2B, 0xC1, 0x03, 0xD4, 0x4F, 0xA4, 0xB3, 0x3F, + 0x4D, 0x07, 0xDC, 0xB9, 0x97, 0xE3, 0x6D, 0x55, + 0x29, 0x8B, 0xCE, 0xAE, 0x12, 0x24, 0x1B, 0x3F, + 0xA0, 0x7F, 0xA6, 0x3B, 0xE5, 0x57, 0x60, 0x68, + 0xDA, 0x38, 0x7B, 0x8D, 0x58, 0x59, 0xAE, 0xAB, + 0x70, 0x13, 0x69, 0x84, 0x8B, 0x17, 0x6D, 0x42 + }, + { + 0x94, 0x0A, 0x84, 0xB6, 0xA8, 0x4D, 0x10, 0x9A, + 0xAB, 0x20, 0x8C, 0x02, 0x4C, 0x6C, 0xE9, 0x64, + 0x76, 0x76, 0xBA, 0x0A, 0xAA, 0x11, 0xF8, 0x6D, + 0xBB, 0x70, 0x18, 0xF9, 0xFD, 0x22, 0x20, 0xA6, + 0xD9, 0x01, 0xA9, 0x02, 0x7F, 0x9A, 0xBC, 0xF9, + 0x35, 0x37, 0x27, 0x27, 0xCB, 0xF0, 0x9E, 0xBD, + 0x61, 0xA2, 0xA2, 0xEE, 0xB8, 0x76, 0x53, 0xE8, + 0xEC, 0xAD, 0x1B, 0xAB, 0x85, 0xDC, 0x83, 0x27 + }, + { + 0x20, 0x20, 0xB7, 0x82, 0x64, 0xA8, 0x2D, 0x9F, + 0x41, 0x51, 0x14, 0x1A, 0xDB, 0xA8, 0xD4, 0x4B, + 0xF2, 0x0C, 0x5E, 0xC0, 0x62, 0xEE, 0xE9, 0xB5, + 0x95, 0xA1, 0x1F, 0x9E, 0x84, 0x90, 0x1B, 0xF1, + 0x48, 0xF2, 0x98, 0xE0, 0xC9, 0xF8, 0x77, 0x7D, + 0xCD, 0xBC, 0x7C, 0xC4, 0x67, 0x0A, 0xAC, 0x35, + 0x6C, 0xC2, 0xAD, 0x8C, 0xCB, 0x16, 0x29, 0xF1, + 0x6F, 0x6A, 0x76, 0xBC, 0xEF, 0xBE, 0xE7, 0x60 + }, + { + 0xD1, 0xB8, 0x97, 0xB0, 0xE0, 0x75, 0xBA, 0x68, + 0xAB, 0x57, 0x2A, 0xDF, 0x9D, 0x9C, 0x43, 0x66, + 0x63, 0xE4, 0x3E, 0xB3, 0xD8, 0xE6, 0x2D, 0x92, + 0xFC, 0x49, 0xC9, 0xBE, 0x21, 0x4E, 0x6F, 0x27, + 0x87, 0x3F, 0xE2, 0x15, 0xA6, 0x51, 0x70, 0xE6, + 0xBE, 0xA9, 0x02, 0x40, 0x8A, 0x25, 0xB4, 0x95, + 0x06, 0xF4, 0x7B, 0xAB, 0xD0, 0x7C, 0xEC, 0xF7, + 0x11, 0x3E, 0xC1, 0x0C, 0x5D, 0xD3, 0x12, 0x52 + }, + { + 0xB1, 0x4D, 0x0C, 0x62, 0xAB, 0xFA, 0x46, 0x9A, + 0x35, 0x71, 0x77, 0xE5, 0x94, 0xC1, 0x0C, 0x19, + 0x42, 0x43, 0xED, 0x20, 0x25, 0xAB, 0x8A, 0xA5, + 0xAD, 0x2F, 0xA4, 0x1A, 0xD3, 0x18, 0xE0, 0xFF, + 0x48, 0xCD, 0x5E, 0x60, 0xBE, 0xC0, 0x7B, 0x13, + 0x63, 0x4A, 0x71, 0x1D, 0x23, 0x26, 0xE4, 0x88, + 0xA9, 0x85, 0xF3, 0x1E, 0x31, 0x15, 0x33, 0x99, + 0xE7, 0x30, 0x88, 0xEF, 0xC8, 0x6A, 0x5C, 0x55 + }, + { + 0x41, 0x69, 0xC5, 0xCC, 0x80, 0x8D, 0x26, 0x97, + 0xDC, 0x2A, 0x82, 0x43, 0x0D, 0xC2, 0x3E, 0x3C, + 0xD3, 0x56, 0xDC, 0x70, 0xA9, 0x45, 0x66, 0x81, + 0x05, 0x02, 0xB8, 0xD6, 0x55, 0xB3, 0x9A, 0xBF, + 0x9E, 0x7F, 0x90, 0x2F, 0xE7, 0x17, 0xE0, 0x38, + 0x92, 0x19, 0x85, 0x9E, 0x19, 0x45, 0xDF, 0x1A, + 0xF6, 0xAD, 0xA4, 0x2E, 0x4C, 0xCD, 0xA5, 0x5A, + 0x19, 0x7B, 0x71, 0x00, 0xA3, 0x0C, 0x30, 0xA1 + }, + { + 0x25, 0x8A, 0x4E, 0xDB, 0x11, 0x3D, 0x66, 0xC8, + 0x39, 0xC8, 0xB1, 0xC9, 0x1F, 0x15, 0xF3, 0x5A, + 0xDE, 0x60, 0x9F, 0x11, 0xCD, 0x7F, 0x86, 0x81, + 0xA4, 0x04, 0x5B, 0x9F, 0xEF, 0x7B, 0x0B, 0x24, + 0xC8, 0x2C, 0xDA, 0x06, 0xA5, 0xF2, 0x06, 0x7B, + 0x36, 0x88, 0x25, 0xE3, 0x91, 0x4E, 0x53, 0xD6, + 0x94, 0x8E, 0xDE, 0x92, 0xEF, 0xD6, 0xE8, 0x38, + 0x7F, 0xA2, 0xE5, 0x37, 0x23, 0x9B, 0x5B, 0xEE + }, + { + 0x79, 0xD2, 0xD8, 0x69, 0x6D, 0x30, 0xF3, 0x0F, + 0xB3, 0x46, 0x57, 0x76, 0x11, 0x71, 0xA1, 0x1E, + 0x6C, 0x3F, 0x1E, 0x64, 0xCB, 0xE7, 0xBE, 0xBE, + 0xE1, 0x59, 0xCB, 0x95, 0xBF, 0xAF, 0x81, 0x2B, + 0x4F, 0x41, 0x1E, 0x2F, 0x26, 0xD9, 0xC4, 0x21, + 0xDC, 0x2C, 0x28, 0x4A, 0x33, 0x42, 0xD8, 0x23, + 0xEC, 0x29, 0x38, 0x49, 0xE4, 0x2D, 0x1E, 0x46, + 0xB0, 0xA4, 0xAC, 0x1E, 0x3C, 0x86, 0xAB, 0xAA + }, + { + 0x8B, 0x94, 0x36, 0x01, 0x0D, 0xC5, 0xDE, 0xE9, + 0x92, 0xAE, 0x38, 0xAE, 0xA9, 0x7F, 0x2C, 0xD6, + 0x3B, 0x94, 0x6D, 0x94, 0xFE, 0xDD, 0x2E, 0xC9, + 0x67, 0x1D, 0xCD, 0xE3, 0xBD, 0x4C, 0xE9, 0x56, + 0x4D, 0x55, 0x5C, 0x66, 0xC1, 0x5B, 0xB2, 0xB9, + 0x00, 0xDF, 0x72, 0xED, 0xB6, 0xB8, 0x91, 0xEB, + 0xCA, 0xDF, 0xEF, 0xF6, 0x3C, 0x9E, 0xA4, 0x03, + 0x6A, 0x99, 0x8B, 0xE7, 0x97, 0x39, 0x81, 0xE7 + }, + { + 0xC8, 0xF6, 0x8E, 0x69, 0x6E, 0xD2, 0x82, 0x42, + 0xBF, 0x99, 0x7F, 0x5B, 0x3B, 0x34, 0x95, 0x95, + 0x08, 0xE4, 0x2D, 0x61, 0x38, 0x10, 0xF1, 0xE2, + 0xA4, 0x35, 0xC9, 0x6E, 0xD2, 0xFF, 0x56, 0x0C, + 0x70, 0x22, 0xF3, 0x61, 0xA9, 0x23, 0x4B, 0x98, + 0x37, 0xFE, 0xEE, 0x90, 0xBF, 0x47, 0x92, 0x2E, + 0xE0, 0xFD, 0x5F, 0x8D, 0xDF, 0x82, 0x37, 0x18, + 0xD8, 0x6D, 0x1E, 0x16, 0xC6, 0x09, 0x00, 0x71 + }, + { + 0xB0, 0x2D, 0x3E, 0xEE, 0x48, 0x60, 0xD5, 0x86, + 0x8B, 0x2C, 0x39, 0xCE, 0x39, 0xBF, 0xE8, 0x10, + 0x11, 0x29, 0x05, 0x64, 0xDD, 0x67, 0x8C, 0x85, + 0xE8, 0x78, 0x3F, 0x29, 0x30, 0x2D, 0xFC, 0x13, + 0x99, 0xBA, 0x95, 0xB6, 0xB5, 0x3C, 0xD9, 0xEB, + 0xBF, 0x40, 0x0C, 0xCA, 0x1D, 0xB0, 0xAB, 0x67, + 0xE1, 0x9A, 0x32, 0x5F, 0x2D, 0x11, 0x58, 0x12, + 0xD2, 0x5D, 0x00, 0x97, 0x8A, 0xD1, 0xBC, 0xA4 + }, + { + 0x76, 0x93, 0xEA, 0x73, 0xAF, 0x3A, 0xC4, 0xDA, + 0xD2, 0x1C, 0xA0, 0xD8, 0xDA, 0x85, 0xB3, 0x11, + 0x8A, 0x7D, 0x1C, 0x60, 0x24, 0xCF, 0xAF, 0x55, + 0x76, 0x99, 0x86, 0x82, 0x17, 0xBC, 0x0C, 0x2F, + 0x44, 0xA1, 0x99, 0xBC, 0x6C, 0x0E, 0xDD, 0x51, + 0x97, 0x98, 0xBA, 0x05, 0xBD, 0x5B, 0x1B, 0x44, + 0x84, 0x34, 0x6A, 0x47, 0xC2, 0xCA, 0xDF, 0x6B, + 0xF3, 0x0B, 0x78, 0x5C, 0xC8, 0x8B, 0x2B, 0xAF + }, + { + 0xA0, 0xE5, 0xC1, 0xC0, 0x03, 0x1C, 0x02, 0xE4, + 0x8B, 0x7F, 0x09, 0xA5, 0xE8, 0x96, 0xEE, 0x9A, + 0xEF, 0x2F, 0x17, 0xFC, 0x9E, 0x18, 0xE9, 0x97, + 0xD7, 0xF6, 0xCA, 0xC7, 0xAE, 0x31, 0x64, 0x22, + 0xC2, 0xB1, 0xE7, 0x79, 0x84, 0xE5, 0xF3, 0xA7, + 0x3C, 0xB4, 0x5D, 0xEE, 0xD5, 0xD3, 0xF8, 0x46, + 0x00, 0x10, 0x5E, 0x6E, 0xE3, 0x8F, 0x2D, 0x09, + 0x0C, 0x7D, 0x04, 0x42, 0xEA, 0x34, 0xC4, 0x6D + }, + { + 0x41, 0xDA, 0xA6, 0xAD, 0xCF, 0xDB, 0x69, 0xF1, + 0x44, 0x0C, 0x37, 0xB5, 0x96, 0x44, 0x01, 0x65, + 0xC1, 0x5A, 0xDA, 0x59, 0x68, 0x13, 0xE2, 0xE2, + 0x2F, 0x06, 0x0F, 0xCD, 0x55, 0x1F, 0x24, 0xDE, + 0xE8, 0xE0, 0x4B, 0xA6, 0x89, 0x03, 0x87, 0x88, + 0x6C, 0xEE, 0xC4, 0xA7, 0xA0, 0xD7, 0xFC, 0x6B, + 0x44, 0x50, 0x63, 0x92, 0xEC, 0x38, 0x22, 0xC0, + 0xD8, 0xC1, 0xAC, 0xFC, 0x7D, 0x5A, 0xEB, 0xE8 + }, + { + 0x14, 0xD4, 0xD4, 0x0D, 0x59, 0x84, 0xD8, 0x4C, + 0x5C, 0xF7, 0x52, 0x3B, 0x77, 0x98, 0xB2, 0x54, + 0xE2, 0x75, 0xA3, 0xA8, 0xCC, 0x0A, 0x1B, 0xD0, + 0x6E, 0xBC, 0x0B, 0xEE, 0x72, 0x68, 0x56, 0xAC, + 0xC3, 0xCB, 0xF5, 0x16, 0xFF, 0x66, 0x7C, 0xDA, + 0x20, 0x58, 0xAD, 0x5C, 0x34, 0x12, 0x25, 0x44, + 0x60, 0xA8, 0x2C, 0x92, 0x18, 0x70, 0x41, 0x36, + 0x3C, 0xC7, 0x7A, 0x4D, 0xC2, 0x15, 0xE4, 0x87 + }, + { + 0xD0, 0xE7, 0xA1, 0xE2, 0xB9, 0xA4, 0x47, 0xFE, + 0xE8, 0x3E, 0x22, 0x77, 0xE9, 0xFF, 0x80, 0x10, + 0xC2, 0xF3, 0x75, 0xAE, 0x12, 0xFA, 0x7A, 0xAA, + 0x8C, 0xA5, 0xA6, 0x31, 0x78, 0x68, 0xA2, 0x6A, + 0x36, 0x7A, 0x0B, 0x69, 0xFB, 0xC1, 0xCF, 0x32, + 0xA5, 0x5D, 0x34, 0xEB, 0x37, 0x06, 0x63, 0x01, + 0x6F, 0x3D, 0x21, 0x10, 0x23, 0x0E, 0xBA, 0x75, + 0x40, 0x28, 0xA5, 0x6F, 0x54, 0xAC, 0xF5, 0x7C + }, + { + 0xE7, 0x71, 0xAA, 0x8D, 0xB5, 0xA3, 0xE0, 0x43, + 0xE8, 0x17, 0x8F, 0x39, 0xA0, 0x85, 0x7B, 0xA0, + 0x4A, 0x3F, 0x18, 0xE4, 0xAA, 0x05, 0x74, 0x3C, + 0xF8, 0xD2, 0x22, 0xB0, 0xB0, 0x95, 0x82, 0x53, + 0x50, 0xBA, 0x42, 0x2F, 0x63, 0x38, 0x2A, 0x23, + 0xD9, 0x2E, 0x41, 0x49, 0x07, 0x4E, 0x81, 0x6A, + 0x36, 0xC1, 0xCD, 0x28, 0x28, 0x4D, 0x14, 0x62, + 0x67, 0x94, 0x0B, 0x31, 0xF8, 0x81, 0x8E, 0xA2 + }, + { + 0xFE, 0xB4, 0xFD, 0x6F, 0x9E, 0x87, 0xA5, 0x6B, + 0xEF, 0x39, 0x8B, 0x32, 0x84, 0xD2, 0xBD, 0xA5, + 0xB5, 0xB0, 0xE1, 0x66, 0x58, 0x3A, 0x66, 0xB6, + 0x1E, 0x53, 0x84, 0x57, 0xFF, 0x05, 0x84, 0x87, + 0x2C, 0x21, 0xA3, 0x29, 0x62, 0xB9, 0x92, 0x8F, + 0xFA, 0xB5, 0x8D, 0xE4, 0xAF, 0x2E, 0xDD, 0x4E, + 0x15, 0xD8, 0xB3, 0x55, 0x70, 0x52, 0x32, 0x07, + 0xFF, 0x4E, 0x2A, 0x5A, 0xA7, 0x75, 0x4C, 0xAA + }, + { + 0x46, 0x2F, 0x17, 0xBF, 0x00, 0x5F, 0xB1, 0xC1, + 0xB9, 0xE6, 0x71, 0x77, 0x9F, 0x66, 0x52, 0x09, + 0xEC, 0x28, 0x73, 0xE3, 0xE4, 0x11, 0xF9, 0x8D, + 0xAB, 0xF2, 0x40, 0xA1, 0xD5, 0xEC, 0x3F, 0x95, + 0xCE, 0x67, 0x96, 0xB6, 0xFC, 0x23, 0xFE, 0x17, + 0x19, 0x03, 0xB5, 0x02, 0x02, 0x34, 0x67, 0xDE, + 0xC7, 0x27, 0x3F, 0xF7, 0x48, 0x79, 0xB9, 0x29, + 0x67, 0xA2, 0xA4, 0x3A, 0x5A, 0x18, 0x3D, 0x33 + }, + { + 0xD3, 0x33, 0x81, 0x93, 0xB6, 0x45, 0x53, 0xDB, + 0xD3, 0x8D, 0x14, 0x4B, 0xEA, 0x71, 0xC5, 0x91, + 0x5B, 0xB1, 0x10, 0xE2, 0xD8, 0x81, 0x80, 0xDB, + 0xC5, 0xDB, 0x36, 0x4F, 0xD6, 0x17, 0x1D, 0xF3, + 0x17, 0xFC, 0x72, 0x68, 0x83, 0x1B, 0x5A, 0xEF, + 0x75, 0xE4, 0x34, 0x2B, 0x2F, 0xAD, 0x87, 0x97, + 0xBA, 0x39, 0xED, 0xDC, 0xEF, 0x80, 0xE6, 0xEC, + 0x08, 0x15, 0x93, 0x50, 0xB1, 0xAD, 0x69, 0x6D + }, + { + 0xE1, 0x59, 0x0D, 0x58, 0x5A, 0x3D, 0x39, 0xF7, + 0xCB, 0x59, 0x9A, 0xBD, 0x47, 0x90, 0x70, 0x96, + 0x64, 0x09, 0xA6, 0x84, 0x6D, 0x43, 0x77, 0xAC, + 0xF4, 0x47, 0x1D, 0x06, 0x5D, 0x5D, 0xB9, 0x41, + 0x29, 0xCC, 0x9B, 0xE9, 0x25, 0x73, 0xB0, 0x5E, + 0xD2, 0x26, 0xBE, 0x1E, 0x9B, 0x7C, 0xB0, 0xCA, + 0xBE, 0x87, 0x91, 0x85, 0x89, 0xF8, 0x0D, 0xAD, + 0xD4, 0xEF, 0x5E, 0xF2, 0x5A, 0x93, 0xD2, 0x8E + }, + { + 0xF8, 0xF3, 0x72, 0x6A, 0xC5, 0xA2, 0x6C, 0xC8, + 0x01, 0x32, 0x49, 0x3A, 0x6F, 0xED, 0xCB, 0x0E, + 0x60, 0x76, 0x0C, 0x09, 0xCF, 0xC8, 0x4C, 0xAD, + 0x17, 0x81, 0x75, 0x98, 0x68, 0x19, 0x66, 0x5E, + 0x76, 0x84, 0x2D, 0x7B, 0x9F, 0xED, 0xF7, 0x6D, + 0xDD, 0xEB, 0xF5, 0xD3, 0xF5, 0x6F, 0xAA, 0xAD, + 0x44, 0x77, 0x58, 0x7A, 0xF2, 0x16, 0x06, 0xD3, + 0x96, 0xAE, 0x57, 0x0D, 0x8E, 0x71, 0x9A, 0xF2 + }, + { + 0x30, 0x18, 0x60, 0x55, 0xC0, 0x79, 0x49, 0x94, + 0x81, 0x83, 0xC8, 0x50, 0xE9, 0xA7, 0x56, 0xCC, + 0x09, 0x93, 0x7E, 0x24, 0x7D, 0x9D, 0x92, 0x8E, + 0x86, 0x9E, 0x20, 0xBA, 0xFC, 0x3C, 0xD9, 0x72, + 0x17, 0x19, 0xD3, 0x4E, 0x04, 0xA0, 0x89, 0x9B, + 0x92, 0xC7, 0x36, 0x08, 0x45, 0x50, 0x18, 0x68, + 0x86, 0xEF, 0xBA, 0x2E, 0x79, 0x0D, 0x8B, 0xE6, + 0xEB, 0xF0, 0x40, 0xB2, 0x09, 0xC4, 0x39, 0xA4 + }, + { + 0xF3, 0xC4, 0x27, 0x6C, 0xB8, 0x63, 0x63, 0x77, + 0x12, 0xC2, 0x41, 0xC4, 0x44, 0xC5, 0xCC, 0x1E, + 0x35, 0x54, 0xE0, 0xFD, 0xDB, 0x17, 0x4D, 0x03, + 0x58, 0x19, 0xDD, 0x83, 0xEB, 0x70, 0x0B, 0x4C, + 0xE8, 0x8D, 0xF3, 0xAB, 0x38, 0x41, 0xBA, 0x02, + 0x08, 0x5E, 0x1A, 0x99, 0xB4, 0xE1, 0x73, 0x10, + 0xC5, 0x34, 0x10, 0x75, 0xC0, 0x45, 0x8B, 0xA3, + 0x76, 0xC9, 0x5A, 0x68, 0x18, 0xFB, 0xB3, 0xE2 + }, + { + 0x0A, 0xA0, 0x07, 0xC4, 0xDD, 0x9D, 0x58, 0x32, + 0x39, 0x30, 0x40, 0xA1, 0x58, 0x3C, 0x93, 0x0B, + 0xCA, 0x7D, 0xC5, 0xE7, 0x7E, 0xA5, 0x3A, 0xDD, + 0x7E, 0x2B, 0x3F, 0x7C, 0x8E, 0x23, 0x13, 0x68, + 0x04, 0x35, 0x20, 0xD4, 0xA3, 0xEF, 0x53, 0xC9, + 0x69, 0xB6, 0xBB, 0xFD, 0x02, 0x59, 0x46, 0xF6, + 0x32, 0xBD, 0x7F, 0x76, 0x5D, 0x53, 0xC2, 0x10, + 0x03, 0xB8, 0xF9, 0x83, 0xF7, 0x5E, 0x2A, 0x6A + }, + { + 0x08, 0xE9, 0x46, 0x47, 0x20, 0x53, 0x3B, 0x23, + 0xA0, 0x4E, 0xC2, 0x4F, 0x7A, 0xE8, 0xC1, 0x03, + 0x14, 0x5F, 0x76, 0x53, 0x87, 0xD7, 0x38, 0x77, + 0x7D, 0x3D, 0x34, 0x34, 0x77, 0xFD, 0x1C, 0x58, + 0xDB, 0x05, 0x21, 0x42, 0xCA, 0xB7, 0x54, 0xEA, + 0x67, 0x43, 0x78, 0xE1, 0x87, 0x66, 0xC5, 0x35, + 0x42, 0xF7, 0x19, 0x70, 0x17, 0x1C, 0xC4, 0xF8, + 0x16, 0x94, 0x24, 0x6B, 0x71, 0x7D, 0x75, 0x64 + }, + { + 0xD3, 0x7F, 0xF7, 0xAD, 0x29, 0x79, 0x93, 0xE7, + 0xEC, 0x21, 0xE0, 0xF1, 0xB4, 0xB5, 0xAE, 0x71, + 0x9C, 0xDC, 0x83, 0xC5, 0xDB, 0x68, 0x75, 0x27, + 0xF2, 0x75, 0x16, 0xCB, 0xFF, 0xA8, 0x22, 0x88, + 0x8A, 0x68, 0x10, 0xEE, 0x5C, 0x1C, 0xA7, 0xBF, + 0xE3, 0x32, 0x11, 0x19, 0xBE, 0x1A, 0xB7, 0xBF, + 0xA0, 0xA5, 0x02, 0x67, 0x1C, 0x83, 0x29, 0x49, + 0x4D, 0xF7, 0xAD, 0x6F, 0x52, 0x2D, 0x44, 0x0F + }, + { + 0xDD, 0x90, 0x42, 0xF6, 0xE4, 0x64, 0xDC, 0xF8, + 0x6B, 0x12, 0x62, 0xF6, 0xAC, 0xCF, 0xAF, 0xBD, + 0x8C, 0xFD, 0x90, 0x2E, 0xD3, 0xED, 0x89, 0xAB, + 0xF7, 0x8F, 0xFA, 0x48, 0x2D, 0xBD, 0xEE, 0xB6, + 0x96, 0x98, 0x42, 0x39, 0x4C, 0x9A, 0x11, 0x68, + 0xAE, 0x3D, 0x48, 0x1A, 0x01, 0x78, 0x42, 0xF6, + 0x60, 0x00, 0x2D, 0x42, 0x44, 0x7C, 0x6B, 0x22, + 0xF7, 0xB7, 0x2F, 0x21, 0xAA, 0xE0, 0x21, 0xC9 + }, + { + 0xBD, 0x96, 0x5B, 0xF3, 0x1E, 0x87, 0xD7, 0x03, + 0x27, 0x53, 0x6F, 0x2A, 0x34, 0x1C, 0xEB, 0xC4, + 0x76, 0x8E, 0xCA, 0x27, 0x5F, 0xA0, 0x5E, 0xF9, + 0x8F, 0x7F, 0x1B, 0x71, 0xA0, 0x35, 0x12, 0x98, + 0xDE, 0x00, 0x6F, 0xBA, 0x73, 0xFE, 0x67, 0x33, + 0xED, 0x01, 0xD7, 0x58, 0x01, 0xB4, 0xA9, 0x28, + 0xE5, 0x42, 0x31, 0xB3, 0x8E, 0x38, 0xC5, 0x62, + 0xB2, 0xE3, 0x3E, 0xA1, 0x28, 0x49, 0x92, 0xFA + }, + { + 0x65, 0x67, 0x6D, 0x80, 0x06, 0x17, 0x97, 0x2F, + 0xBD, 0x87, 0xE4, 0xB9, 0x51, 0x4E, 0x1C, 0x67, + 0x40, 0x2B, 0x7A, 0x33, 0x10, 0x96, 0xD3, 0xBF, + 0xAC, 0x22, 0xF1, 0xAB, 0xB9, 0x53, 0x74, 0xAB, + 0xC9, 0x42, 0xF1, 0x6E, 0x9A, 0xB0, 0xEA, 0xD3, + 0x3B, 0x87, 0xC9, 0x19, 0x68, 0xA6, 0xE5, 0x09, + 0xE1, 0x19, 0xFF, 0x07, 0x78, 0x7B, 0x3E, 0xF4, + 0x83, 0xE1, 0xDC, 0xDC, 0xCF, 0x6E, 0x30, 0x22 + }, + { + 0x93, 0x9F, 0xA1, 0x89, 0x69, 0x9C, 0x5D, 0x2C, + 0x81, 0xDD, 0xD1, 0xFF, 0xC1, 0xFA, 0x20, 0x7C, + 0x97, 0x0B, 0x6A, 0x36, 0x85, 0xBB, 0x29, 0xCE, + 0x1D, 0x3E, 0x99, 0xD4, 0x2F, 0x2F, 0x74, 0x42, + 0xDA, 0x53, 0xE9, 0x5A, 0x72, 0x90, 0x73, 0x14, + 0xF4, 0x58, 0x83, 0x99, 0xA3, 0xFF, 0x5B, 0x0A, + 0x92, 0xBE, 0xB3, 0xF6, 0xBE, 0x26, 0x94, 0xF9, + 0xF8, 0x6E, 0xCF, 0x29, 0x52, 0xD5, 0xB4, 0x1C + }, + { + 0xC5, 0x16, 0x54, 0x17, 0x01, 0x86, 0x3F, 0x91, + 0x00, 0x5F, 0x31, 0x41, 0x08, 0xCE, 0xEC, 0xE3, + 0xC6, 0x43, 0xE0, 0x4F, 0xC8, 0xC4, 0x2F, 0xD2, + 0xFF, 0x55, 0x62, 0x20, 0xE6, 0x16, 0xAA, 0xA6, + 0xA4, 0x8A, 0xEB, 0x97, 0xA8, 0x4B, 0xAD, 0x74, + 0x78, 0x2E, 0x8D, 0xFF, 0x96, 0xA1, 0xA2, 0xFA, + 0x94, 0x93, 0x39, 0xD7, 0x22, 0xED, 0xCA, 0xA3, + 0x2B, 0x57, 0x06, 0x70, 0x41, 0xDF, 0x88, 0xCC + }, + { + 0x98, 0x7F, 0xD6, 0xE0, 0xD6, 0x85, 0x7C, 0x55, + 0x3E, 0xAE, 0xBB, 0x3D, 0x34, 0x97, 0x0A, 0x2C, + 0x2F, 0x6E, 0x89, 0xA3, 0x54, 0x8F, 0x49, 0x25, + 0x21, 0x72, 0x2B, 0x80, 0xA1, 0xC2, 0x1A, 0x15, + 0x38, 0x92, 0x34, 0x6D, 0x2C, 0xBA, 0x64, 0x44, + 0x21, 0x2D, 0x56, 0xDA, 0x9A, 0x26, 0xE3, 0x24, + 0xDC, 0xCB, 0xC0, 0xDC, 0xDE, 0x85, 0xD4, 0xD2, + 0xEE, 0x43, 0x99, 0xEE, 0xC5, 0xA6, 0x4E, 0x8F + }, + { + 0xAE, 0x56, 0xDE, 0xB1, 0xC2, 0x32, 0x8D, 0x9C, + 0x40, 0x17, 0x70, 0x6B, 0xCE, 0x6E, 0x99, 0xD4, + 0x13, 0x49, 0x05, 0x3B, 0xA9, 0xD3, 0x36, 0xD6, + 0x77, 0xC4, 0xC2, 0x7D, 0x9F, 0xD5, 0x0A, 0xE6, + 0xAE, 0xE1, 0x7E, 0x85, 0x31, 0x54, 0xE1, 0xF4, + 0xFE, 0x76, 0x72, 0x34, 0x6D, 0xA2, 0xEA, 0xA3, + 0x1E, 0xEA, 0x53, 0xFC, 0xF2, 0x4A, 0x22, 0x80, + 0x4F, 0x11, 0xD0, 0x3D, 0xA6, 0xAB, 0xFC, 0x2B + }, + { + 0x49, 0xD6, 0xA6, 0x08, 0xC9, 0xBD, 0xE4, 0x49, + 0x18, 0x70, 0x49, 0x85, 0x72, 0xAC, 0x31, 0xAA, + 0xC3, 0xFA, 0x40, 0x93, 0x8B, 0x38, 0xA7, 0x81, + 0x8F, 0x72, 0x38, 0x3E, 0xB0, 0x40, 0xAD, 0x39, + 0x53, 0x2B, 0xC0, 0x65, 0x71, 0xE1, 0x3D, 0x76, + 0x7E, 0x69, 0x45, 0xAB, 0x77, 0xC0, 0xBD, 0xC3, + 0xB0, 0x28, 0x42, 0x53, 0x34, 0x3F, 0x9F, 0x6C, + 0x12, 0x44, 0xEB, 0xF2, 0xFF, 0x0D, 0xF8, 0x66 + }, + { + 0xDA, 0x58, 0x2A, 0xD8, 0xC5, 0x37, 0x0B, 0x44, + 0x69, 0xAF, 0x86, 0x2A, 0xA6, 0x46, 0x7A, 0x22, + 0x93, 0xB2, 0xB2, 0x8B, 0xD8, 0x0A, 0xE0, 0xE9, + 0x1F, 0x42, 0x5A, 0xD3, 0xD4, 0x72, 0x49, 0xFD, + 0xF9, 0x88, 0x25, 0xCC, 0x86, 0xF1, 0x40, 0x28, + 0xC3, 0x30, 0x8C, 0x98, 0x04, 0xC7, 0x8B, 0xFE, + 0xEE, 0xEE, 0x46, 0x14, 0x44, 0xCE, 0x24, 0x36, + 0x87, 0xE1, 0xA5, 0x05, 0x22, 0x45, 0x6A, 0x1D + }, + { + 0xD5, 0x26, 0x6A, 0xA3, 0x33, 0x11, 0x94, 0xAE, + 0xF8, 0x52, 0xEE, 0xD8, 0x6D, 0x7B, 0x5B, 0x26, + 0x33, 0xA0, 0xAF, 0x1C, 0x73, 0x59, 0x06, 0xF2, + 0xE1, 0x32, 0x79, 0xF1, 0x49, 0x31, 0xA9, 0xFC, + 0x3B, 0x0E, 0xAC, 0x5C, 0xE9, 0x24, 0x52, 0x73, + 0xBD, 0x1A, 0xA9, 0x29, 0x05, 0xAB, 0xE1, 0x62, + 0x78, 0xEF, 0x7E, 0xFD, 0x47, 0x69, 0x47, 0x89, + 0xA7, 0x28, 0x3B, 0x77, 0xDA, 0x3C, 0x70, 0xF8 + }, + { + 0x29, 0x62, 0x73, 0x4C, 0x28, 0x25, 0x21, 0x86, + 0xA9, 0xA1, 0x11, 0x1C, 0x73, 0x2A, 0xD4, 0xDE, + 0x45, 0x06, 0xD4, 0xB4, 0x48, 0x09, 0x16, 0x30, + 0x3E, 0xB7, 0x99, 0x1D, 0x65, 0x9C, 0xCD, 0xA0, + 0x7A, 0x99, 0x11, 0x91, 0x4B, 0xC7, 0x5C, 0x41, + 0x8A, 0xB7, 0xA4, 0x54, 0x17, 0x57, 0xAD, 0x05, + 0x47, 0x96, 0xE2, 0x67, 0x97, 0xFE, 0xAF, 0x36, + 0xE9, 0xF6, 0xAD, 0x43, 0xF1, 0x4B, 0x35, 0xA4 + }, + { + 0xE8, 0xB7, 0x9E, 0xC5, 0xD0, 0x6E, 0x11, 0x1B, + 0xDF, 0xAF, 0xD7, 0x1E, 0x9F, 0x57, 0x60, 0xF0, + 0x0A, 0xC8, 0xAC, 0x5D, 0x8B, 0xF7, 0x68, 0xF9, + 0xFF, 0x6F, 0x08, 0xB8, 0xF0, 0x26, 0x09, 0x6B, + 0x1C, 0xC3, 0xA4, 0xC9, 0x73, 0x33, 0x30, 0x19, + 0xF1, 0xE3, 0x55, 0x3E, 0x77, 0xDA, 0x3F, 0x98, + 0xCB, 0x9F, 0x54, 0x2E, 0x0A, 0x90, 0xE5, 0xF8, + 0xA9, 0x40, 0xCC, 0x58, 0xE5, 0x98, 0x44, 0xB3 + }, + { + 0xDF, 0xB3, 0x20, 0xC4, 0x4F, 0x9D, 0x41, 0xD1, + 0xEF, 0xDC, 0xC0, 0x15, 0xF0, 0x8D, 0xD5, 0x53, + 0x9E, 0x52, 0x6E, 0x39, 0xC8, 0x7D, 0x50, 0x9A, + 0xE6, 0x81, 0x2A, 0x96, 0x9E, 0x54, 0x31, 0xBF, + 0x4F, 0xA7, 0xD9, 0x1F, 0xFD, 0x03, 0xB9, 0x81, + 0xE0, 0xD5, 0x44, 0xCF, 0x72, 0xD7, 0xB1, 0xC0, + 0x37, 0x4F, 0x88, 0x01, 0x48, 0x2E, 0x6D, 0xEA, + 0x2E, 0xF9, 0x03, 0x87, 0x7E, 0xBA, 0x67, 0x5E + }, + { + 0xD8, 0x86, 0x75, 0x11, 0x8F, 0xDB, 0x55, 0xA5, + 0xFB, 0x36, 0x5A, 0xC2, 0xAF, 0x1D, 0x21, 0x7B, + 0xF5, 0x26, 0xCE, 0x1E, 0xE9, 0xC9, 0x4B, 0x2F, + 0x00, 0x90, 0xB2, 0xC5, 0x8A, 0x06, 0xCA, 0x58, + 0x18, 0x7D, 0x7F, 0xE5, 0x7C, 0x7B, 0xED, 0x9D, + 0x26, 0xFC, 0xA0, 0x67, 0xB4, 0x11, 0x0E, 0xEF, + 0xCD, 0x9A, 0x0A, 0x34, 0x5D, 0xE8, 0x72, 0xAB, + 0xE2, 0x0D, 0xE3, 0x68, 0x00, 0x1B, 0x07, 0x45 + }, + { + 0xB8, 0x93, 0xF2, 0xFC, 0x41, 0xF7, 0xB0, 0xDD, + 0x6E, 0x2F, 0x6A, 0xA2, 0xE0, 0x37, 0x0C, 0x0C, + 0xFF, 0x7D, 0xF0, 0x9E, 0x3A, 0xCF, 0xCC, 0x0E, + 0x92, 0x0B, 0x6E, 0x6F, 0xAD, 0x0E, 0xF7, 0x47, + 0xC4, 0x06, 0x68, 0x41, 0x7D, 0x34, 0x2B, 0x80, + 0xD2, 0x35, 0x1E, 0x8C, 0x17, 0x5F, 0x20, 0x89, + 0x7A, 0x06, 0x2E, 0x97, 0x65, 0xE6, 0xC6, 0x7B, + 0x53, 0x9B, 0x6B, 0xA8, 0xB9, 0x17, 0x05, 0x45 + }, + { + 0x6C, 0x67, 0xEC, 0x56, 0x97, 0xAC, 0xCD, 0x23, + 0x5C, 0x59, 0xB4, 0x86, 0xD7, 0xB7, 0x0B, 0xAE, + 0xED, 0xCB, 0xD4, 0xAA, 0x64, 0xEB, 0xD4, 0xEE, + 0xF3, 0xC7, 0xEA, 0xC1, 0x89, 0x56, 0x1A, 0x72, + 0x62, 0x50, 0xAE, 0xC4, 0xD4, 0x8C, 0xAD, 0xCA, + 0xFB, 0xBE, 0x2C, 0xE3, 0xC1, 0x6C, 0xE2, 0xD6, + 0x91, 0xA8, 0xCC, 0xE0, 0x6E, 0x88, 0x79, 0x55, + 0x6D, 0x44, 0x83, 0xED, 0x71, 0x65, 0xC0, 0x63 + }, + { + 0xF1, 0xAA, 0x2B, 0x04, 0x4F, 0x8F, 0x0C, 0x63, + 0x8A, 0x3F, 0x36, 0x2E, 0x67, 0x7B, 0x5D, 0x89, + 0x1D, 0x6F, 0xD2, 0xAB, 0x07, 0x65, 0xF6, 0xEE, + 0x1E, 0x49, 0x87, 0xDE, 0x05, 0x7E, 0xAD, 0x35, + 0x78, 0x83, 0xD9, 0xB4, 0x05, 0xB9, 0xD6, 0x09, + 0xEE, 0xA1, 0xB8, 0x69, 0xD9, 0x7F, 0xB1, 0x6D, + 0x9B, 0x51, 0x01, 0x7C, 0x55, 0x3F, 0x3B, 0x93, + 0xC0, 0xA1, 0xE0, 0xF1, 0x29, 0x6F, 0xED, 0xCD + }, + { + 0xCB, 0xAA, 0x25, 0x95, 0x72, 0xD4, 0xAE, 0xBF, + 0xC1, 0x91, 0x7A, 0xCD, 0xDC, 0x58, 0x2B, 0x9F, + 0x8D, 0xFA, 0xA9, 0x28, 0xA1, 0x98, 0xCA, 0x7A, + 0xCD, 0x0F, 0x2A, 0xA7, 0x6A, 0x13, 0x4A, 0x90, + 0x25, 0x2E, 0x62, 0x98, 0xA6, 0x5B, 0x08, 0x18, + 0x6A, 0x35, 0x0D, 0x5B, 0x76, 0x26, 0x69, 0x9F, + 0x8C, 0xB7, 0x21, 0xA3, 0xEA, 0x59, 0x21, 0xB7, + 0x53, 0xAE, 0x3A, 0x2D, 0xCE, 0x24, 0xBA, 0x3A + }, + { + 0xFA, 0x15, 0x49, 0xC9, 0x79, 0x6C, 0xD4, 0xD3, + 0x03, 0xDC, 0xF4, 0x52, 0xC1, 0xFB, 0xD5, 0x74, + 0x4F, 0xD9, 0xB9, 0xB4, 0x70, 0x03, 0xD9, 0x20, + 0xB9, 0x2D, 0xE3, 0x48, 0x39, 0xD0, 0x7E, 0xF2, + 0xA2, 0x9D, 0xED, 0x68, 0xF6, 0xFC, 0x9E, 0x6C, + 0x45, 0xE0, 0x71, 0xA2, 0xE4, 0x8B, 0xD5, 0x0C, + 0x50, 0x84, 0xE9, 0x6B, 0x65, 0x7D, 0xD0, 0x40, + 0x40, 0x45, 0xA1, 0xDD, 0xEF, 0xE2, 0x82, 0xED + }, + { + 0x5C, 0xF2, 0xAC, 0x89, 0x7A, 0xB4, 0x44, 0xDC, + 0xB5, 0xC8, 0xD8, 0x7C, 0x49, 0x5D, 0xBD, 0xB3, + 0x4E, 0x18, 0x38, 0xB6, 0xB6, 0x29, 0x42, 0x7C, + 0xAA, 0x51, 0x70, 0x2A, 0xD0, 0xF9, 0x68, 0x85, + 0x25, 0xF1, 0x3B, 0xEC, 0x50, 0x3A, 0x3C, 0x3A, + 0x2C, 0x80, 0xA6, 0x5E, 0x0B, 0x57, 0x15, 0xE8, + 0xAF, 0xAB, 0x00, 0xFF, 0xA5, 0x6E, 0xC4, 0x55, + 0xA4, 0x9A, 0x1A, 0xD3, 0x0A, 0xA2, 0x4F, 0xCD + }, + { + 0x9A, 0xAF, 0x80, 0x20, 0x7B, 0xAC, 0xE1, 0x7B, + 0xB7, 0xAB, 0x14, 0x57, 0x57, 0xD5, 0x69, 0x6B, + 0xDE, 0x32, 0x40, 0x6E, 0xF2, 0x2B, 0x44, 0x29, + 0x2E, 0xF6, 0x5D, 0x45, 0x19, 0xC3, 0xBB, 0x2A, + 0xD4, 0x1A, 0x59, 0xB6, 0x2C, 0xC3, 0xE9, 0x4B, + 0x6F, 0xA9, 0x6D, 0x32, 0xA7, 0xFA, 0xAD, 0xAE, + 0x28, 0xAF, 0x7D, 0x35, 0x09, 0x72, 0x19, 0xAA, + 0x3F, 0xD8, 0xCD, 0xA3, 0x1E, 0x40, 0xC2, 0x75 + }, + { + 0xAF, 0x88, 0xB1, 0x63, 0x40, 0x2C, 0x86, 0x74, + 0x5C, 0xB6, 0x50, 0xC2, 0x98, 0x8F, 0xB9, 0x52, + 0x11, 0xB9, 0x4B, 0x03, 0xEF, 0x29, 0x0E, 0xED, + 0x96, 0x62, 0x03, 0x42, 0x41, 0xFD, 0x51, 0xCF, + 0x39, 0x8F, 0x80, 0x73, 0xE3, 0x69, 0x35, 0x4C, + 0x43, 0xEA, 0xE1, 0x05, 0x2F, 0x9B, 0x63, 0xB0, + 0x81, 0x91, 0xCA, 0xA1, 0x38, 0xAA, 0x54, 0xFE, + 0xA8, 0x89, 0xCC, 0x70, 0x24, 0x23, 0x68, 0x97 + }, + { + 0x48, 0xFA, 0x7D, 0x64, 0xE1, 0xCE, 0xEE, 0x27, + 0xB9, 0x86, 0x4D, 0xB5, 0xAD, 0xA4, 0xB5, 0x3D, + 0x00, 0xC9, 0xBC, 0x76, 0x26, 0x55, 0x58, 0x13, + 0xD3, 0xCD, 0x67, 0x30, 0xAB, 0x3C, 0xC0, 0x6F, + 0xF3, 0x42, 0xD7, 0x27, 0x90, 0x5E, 0x33, 0x17, + 0x1B, 0xDE, 0x6E, 0x84, 0x76, 0xE7, 0x7F, 0xB1, + 0x72, 0x08, 0x61, 0xE9, 0x4B, 0x73, 0xA2, 0xC5, + 0x38, 0xD2, 0x54, 0x74, 0x62, 0x85, 0xF4, 0x30 + }, + { + 0x0E, 0x6F, 0xD9, 0x7A, 0x85, 0xE9, 0x04, 0xF8, + 0x7B, 0xFE, 0x85, 0xBB, 0xEB, 0x34, 0xF6, 0x9E, + 0x1F, 0x18, 0x10, 0x5C, 0xF4, 0xED, 0x4F, 0x87, + 0xAE, 0xC3, 0x6C, 0x6E, 0x8B, 0x5F, 0x68, 0xBD, + 0x2A, 0x6F, 0x3D, 0xC8, 0xA9, 0xEC, 0xB2, 0xB6, + 0x1D, 0xB4, 0xEE, 0xDB, 0x6B, 0x2E, 0xA1, 0x0B, + 0xF9, 0xCB, 0x02, 0x51, 0xFB, 0x0F, 0x8B, 0x34, + 0x4A, 0xBF, 0x7F, 0x36, 0x6B, 0x6D, 0xE5, 0xAB + }, + { + 0x06, 0x62, 0x2D, 0xA5, 0x78, 0x71, 0x76, 0x28, + 0x7F, 0xDC, 0x8F, 0xED, 0x44, 0x0B, 0xAD, 0x18, + 0x7D, 0x83, 0x00, 0x99, 0xC9, 0x4E, 0x6D, 0x04, + 0xC8, 0xE9, 0xC9, 0x54, 0xCD, 0xA7, 0x0C, 0x8B, + 0xB9, 0xE1, 0xFC, 0x4A, 0x6D, 0x0B, 0xAA, 0x83, + 0x1B, 0x9B, 0x78, 0xEF, 0x66, 0x48, 0x68, 0x1A, + 0x48, 0x67, 0xA1, 0x1D, 0xA9, 0x3E, 0xE3, 0x6E, + 0x5E, 0x6A, 0x37, 0xD8, 0x7F, 0xC6, 0x3F, 0x6F + }, + { + 0x1D, 0xA6, 0x77, 0x2B, 0x58, 0xFA, 0xBF, 0x9C, + 0x61, 0xF6, 0x8D, 0x41, 0x2C, 0x82, 0xF1, 0x82, + 0xC0, 0x23, 0x6D, 0x7D, 0x57, 0x5E, 0xF0, 0xB5, + 0x8D, 0xD2, 0x24, 0x58, 0xD6, 0x43, 0xCD, 0x1D, + 0xFC, 0x93, 0xB0, 0x38, 0x71, 0xC3, 0x16, 0xD8, + 0x43, 0x0D, 0x31, 0x29, 0x95, 0xD4, 0x19, 0x7F, + 0x08, 0x74, 0xC9, 0x91, 0x72, 0xBA, 0x00, 0x4A, + 0x01, 0xEE, 0x29, 0x5A, 0xBA, 0xC2, 0x4E, 0x46 + }, + { + 0x3C, 0xD2, 0xD9, 0x32, 0x0B, 0x7B, 0x1D, 0x5F, + 0xB9, 0xAA, 0xB9, 0x51, 0xA7, 0x60, 0x23, 0xFA, + 0x66, 0x7B, 0xE1, 0x4A, 0x91, 0x24, 0xE3, 0x94, + 0x51, 0x39, 0x18, 0xA3, 0xF4, 0x40, 0x96, 0xAE, + 0x49, 0x04, 0xBA, 0x0F, 0xFC, 0x15, 0x0B, 0x63, + 0xBC, 0x7A, 0xB1, 0xEE, 0xB9, 0xA6, 0xE2, 0x57, + 0xE5, 0xC8, 0xF0, 0x00, 0xA7, 0x03, 0x94, 0xA5, + 0xAF, 0xD8, 0x42, 0x71, 0x5D, 0xE1, 0x5F, 0x29 + }, + { + 0x04, 0xCD, 0xC1, 0x4F, 0x74, 0x34, 0xE0, 0xB4, + 0xBE, 0x70, 0xCB, 0x41, 0xDB, 0x4C, 0x77, 0x9A, + 0x88, 0xEA, 0xEF, 0x6A, 0xCC, 0xEB, 0xCB, 0x41, + 0xF2, 0xD4, 0x2F, 0xFF, 0xE7, 0xF3, 0x2A, 0x8E, + 0x28, 0x1B, 0x5C, 0x10, 0x3A, 0x27, 0x02, 0x1D, + 0x0D, 0x08, 0x36, 0x22, 0x50, 0x75, 0x3C, 0xDF, + 0x70, 0x29, 0x21, 0x95, 0xA5, 0x3A, 0x48, 0x72, + 0x8C, 0xEB, 0x58, 0x44, 0xC2, 0xD9, 0x8B, 0xAB + }, + { + 0x90, 0x71, 0xB7, 0xA8, 0xA0, 0x75, 0xD0, 0x09, + 0x5B, 0x8F, 0xB3, 0xAE, 0x51, 0x13, 0x78, 0x57, + 0x35, 0xAB, 0x98, 0xE2, 0xB5, 0x2F, 0xAF, 0x91, + 0xD5, 0xB8, 0x9E, 0x44, 0xAA, 0xC5, 0xB5, 0xD4, + 0xEB, 0xBF, 0x91, 0x22, 0x3B, 0x0F, 0xF4, 0xC7, + 0x19, 0x05, 0xDA, 0x55, 0x34, 0x2E, 0x64, 0x65, + 0x5D, 0x6E, 0xF8, 0xC8, 0x9A, 0x47, 0x68, 0xC3, + 0xF9, 0x3A, 0x6D, 0xC0, 0x36, 0x6B, 0x5B, 0xC8 + }, + { + 0xEB, 0xB3, 0x02, 0x40, 0xDD, 0x96, 0xC7, 0xBC, + 0x8D, 0x0A, 0xBE, 0x49, 0xAA, 0x4E, 0xDC, 0xBB, + 0x4A, 0xFD, 0xC5, 0x1F, 0xF9, 0xAA, 0xF7, 0x20, + 0xD3, 0xF9, 0xE7, 0xFB, 0xB0, 0xF9, 0xC6, 0xD6, + 0x57, 0x13, 0x50, 0x50, 0x17, 0x69, 0xFC, 0x4E, + 0xBD, 0x0B, 0x21, 0x41, 0x24, 0x7F, 0xF4, 0x00, + 0xD4, 0xFD, 0x4B, 0xE4, 0x14, 0xED, 0xF3, 0x77, + 0x57, 0xBB, 0x90, 0xA3, 0x2A, 0xC5, 0xC6, 0x5A + }, + { + 0x85, 0x32, 0xC5, 0x8B, 0xF3, 0xC8, 0x01, 0x5D, + 0x9D, 0x1C, 0xBE, 0x00, 0xEE, 0xF1, 0xF5, 0x08, + 0x2F, 0x8F, 0x36, 0x32, 0xFB, 0xE9, 0xF1, 0xED, + 0x4F, 0x9D, 0xFB, 0x1F, 0xA7, 0x9E, 0x82, 0x83, + 0x06, 0x6D, 0x77, 0xC4, 0x4C, 0x4A, 0xF9, 0x43, + 0xD7, 0x6B, 0x30, 0x03, 0x64, 0xAE, 0xCB, 0xD0, + 0x64, 0x8C, 0x8A, 0x89, 0x39, 0xBD, 0x20, 0x41, + 0x23, 0xF4, 0xB5, 0x62, 0x60, 0x42, 0x2D, 0xEC + }, + { + 0xFE, 0x98, 0x46, 0xD6, 0x4F, 0x7C, 0x77, 0x08, + 0x69, 0x6F, 0x84, 0x0E, 0x2D, 0x76, 0xCB, 0x44, + 0x08, 0xB6, 0x59, 0x5C, 0x2F, 0x81, 0xEC, 0x6A, + 0x28, 0xA7, 0xF2, 0xF2, 0x0C, 0xB8, 0x8C, 0xFE, + 0x6A, 0xC0, 0xB9, 0xE9, 0xB8, 0x24, 0x4F, 0x08, + 0xBD, 0x70, 0x95, 0xC3, 0x50, 0xC1, 0xD0, 0x84, + 0x2F, 0x64, 0xFB, 0x01, 0xBB, 0x7F, 0x53, 0x2D, + 0xFC, 0xD4, 0x73, 0x71, 0xB0, 0xAE, 0xEB, 0x79 + }, + { + 0x28, 0xF1, 0x7E, 0xA6, 0xFB, 0x6C, 0x42, 0x09, + 0x2D, 0xC2, 0x64, 0x25, 0x7E, 0x29, 0x74, 0x63, + 0x21, 0xFB, 0x5B, 0xDA, 0xEA, 0x98, 0x73, 0xC2, + 0xA7, 0xFA, 0x9D, 0x8F, 0x53, 0x81, 0x8E, 0x89, + 0x9E, 0x16, 0x1B, 0xC7, 0x7D, 0xFE, 0x80, 0x90, + 0xAF, 0xD8, 0x2B, 0xF2, 0x26, 0x6C, 0x5C, 0x1B, + 0xC9, 0x30, 0xA8, 0xD1, 0x54, 0x76, 0x24, 0x43, + 0x9E, 0x66, 0x2E, 0xF6, 0x95, 0xF2, 0x6F, 0x24 + }, + { + 0xEC, 0x6B, 0x7D, 0x7F, 0x03, 0x0D, 0x48, 0x50, + 0xAC, 0xAE, 0x3C, 0xB6, 0x15, 0xC2, 0x1D, 0xD2, + 0x52, 0x06, 0xD6, 0x3E, 0x84, 0xD1, 0xDB, 0x8D, + 0x95, 0x73, 0x70, 0x73, 0x7B, 0xA0, 0xE9, 0x84, + 0x67, 0xEA, 0x0C, 0xE2, 0x74, 0xC6, 0x61, 0x99, + 0x90, 0x1E, 0xAE, 0xC1, 0x8A, 0x08, 0x52, 0x57, + 0x15, 0xF5, 0x3B, 0xFD, 0xB0, 0xAA, 0xCB, 0x61, + 0x3D, 0x34, 0x2E, 0xBD, 0xCE, 0xED, 0xDC, 0x3B + }, + { + 0xB4, 0x03, 0xD3, 0x69, 0x1C, 0x03, 0xB0, 0xD3, + 0x41, 0x8D, 0xF3, 0x27, 0xD5, 0x86, 0x0D, 0x34, + 0xBB, 0xFC, 0xC4, 0x51, 0x9B, 0xFB, 0xCE, 0x36, + 0xBF, 0x33, 0xB2, 0x08, 0x38, 0x5F, 0xAD, 0xB9, + 0x18, 0x6B, 0xC7, 0x8A, 0x76, 0xC4, 0x89, 0xD8, + 0x9F, 0xD5, 0x7E, 0x7D, 0xC7, 0x54, 0x12, 0xD2, + 0x3B, 0xCD, 0x1D, 0xAE, 0x84, 0x70, 0xCE, 0x92, + 0x74, 0x75, 0x4B, 0xB8, 0x58, 0x5B, 0x13, 0xC5 + }, + { + 0x31, 0xFC, 0x79, 0x73, 0x8B, 0x87, 0x72, 0xB3, + 0xF5, 0x5C, 0xD8, 0x17, 0x88, 0x13, 0xB3, 0xB5, + 0x2D, 0x0D, 0xB5, 0xA4, 0x19, 0xD3, 0x0B, 0xA9, + 0x49, 0x5C, 0x4B, 0x9D, 0xA0, 0x21, 0x9F, 0xAC, + 0x6D, 0xF8, 0xE7, 0xC2, 0x3A, 0x81, 0x15, 0x51, + 0xA6, 0x2B, 0x82, 0x7F, 0x25, 0x6E, 0xCD, 0xB8, + 0x12, 0x4A, 0xC8, 0xA6, 0x79, 0x2C, 0xCF, 0xEC, + 0xC3, 0xB3, 0x01, 0x27, 0x22, 0xE9, 0x44, 0x63 + }, + { + 0xBB, 0x20, 0x39, 0xEC, 0x28, 0x70, 0x91, 0xBC, + 0xC9, 0x64, 0x2F, 0xC9, 0x00, 0x49, 0xE7, 0x37, + 0x32, 0xE0, 0x2E, 0x57, 0x7E, 0x28, 0x62, 0xB3, + 0x22, 0x16, 0xAE, 0x9B, 0xED, 0xCD, 0x73, 0x0C, + 0x4C, 0x28, 0x4E, 0xF3, 0x96, 0x8C, 0x36, 0x8B, + 0x7D, 0x37, 0x58, 0x4F, 0x97, 0xBD, 0x4B, 0x4D, + 0xC6, 0xEF, 0x61, 0x27, 0xAC, 0xFE, 0x2E, 0x6A, + 0xE2, 0x50, 0x91, 0x24, 0xE6, 0x6C, 0x8A, 0xF4 + }, + { + 0xF5, 0x3D, 0x68, 0xD1, 0x3F, 0x45, 0xED, 0xFC, + 0xB9, 0xBD, 0x41, 0x5E, 0x28, 0x31, 0xE9, 0x38, + 0x35, 0x0D, 0x53, 0x80, 0xD3, 0x43, 0x22, 0x78, + 0xFC, 0x1C, 0x0C, 0x38, 0x1F, 0xCB, 0x7C, 0x65, + 0xC8, 0x2D, 0xAF, 0xE0, 0x51, 0xD8, 0xC8, 0xB0, + 0xD4, 0x4E, 0x09, 0x74, 0xA0, 0xE5, 0x9E, 0xC7, + 0xBF, 0x7E, 0xD0, 0x45, 0x9F, 0x86, 0xE9, 0x6F, + 0x32, 0x9F, 0xC7, 0x97, 0x52, 0x51, 0x0F, 0xD3 + }, + { + 0x8D, 0x56, 0x8C, 0x79, 0x84, 0xF0, 0xEC, 0xDF, + 0x76, 0x40, 0xFB, 0xC4, 0x83, 0xB5, 0xD8, 0xC9, + 0xF8, 0x66, 0x34, 0xF6, 0xF4, 0x32, 0x91, 0x84, + 0x1B, 0x30, 0x9A, 0x35, 0x0A, 0xB9, 0xC1, 0x13, + 0x7D, 0x24, 0x06, 0x6B, 0x09, 0xDA, 0x99, 0x44, + 0xBA, 0xC5, 0x4D, 0x5B, 0xB6, 0x58, 0x0D, 0x83, + 0x60, 0x47, 0xAA, 0xC7, 0x4A, 0xB7, 0x24, 0xB8, + 0x87, 0xEB, 0xF9, 0x3D, 0x4B, 0x32, 0xEC, 0xA9 + }, + { + 0xC0, 0xB6, 0x5C, 0xE5, 0xA9, 0x6F, 0xF7, 0x74, + 0xC4, 0x56, 0xCA, 0xC3, 0xB5, 0xF2, 0xC4, 0xCD, + 0x35, 0x9B, 0x4F, 0xF5, 0x3E, 0xF9, 0x3A, 0x3D, + 0xA0, 0x77, 0x8B, 0xE4, 0x90, 0x0D, 0x1E, 0x8D, + 0xA1, 0x60, 0x1E, 0x76, 0x9E, 0x8F, 0x1B, 0x02, + 0xD2, 0xA2, 0xF8, 0xC5, 0xB9, 0xFA, 0x10, 0xB4, + 0x4F, 0x1C, 0x18, 0x69, 0x85, 0x46, 0x8F, 0xEE, + 0xB0, 0x08, 0x73, 0x02, 0x83, 0xA6, 0x65, 0x7D + }, + { + 0x49, 0x00, 0xBB, 0xA6, 0xF5, 0xFB, 0x10, 0x3E, + 0xCE, 0x8E, 0xC9, 0x6A, 0xDA, 0x13, 0xA5, 0xC3, + 0xC8, 0x54, 0x88, 0xE0, 0x55, 0x51, 0xDA, 0x6B, + 0x6B, 0x33, 0xD9, 0x88, 0xE6, 0x11, 0xEC, 0x0F, + 0xE2, 0xE3, 0xC2, 0xAA, 0x48, 0xEA, 0x6A, 0xE8, + 0x98, 0x6A, 0x3A, 0x23, 0x1B, 0x22, 0x3C, 0x5D, + 0x27, 0xCE, 0xC2, 0xEA, 0xDD, 0xE9, 0x1C, 0xE0, + 0x79, 0x81, 0xEE, 0x65, 0x28, 0x62, 0xD1, 0xE4 + }, + { + 0xC7, 0xF5, 0xC3, 0x7C, 0x72, 0x85, 0xF9, 0x27, + 0xF7, 0x64, 0x43, 0x41, 0x4D, 0x43, 0x57, 0xFF, + 0x78, 0x96, 0x47, 0xD7, 0xA0, 0x05, 0xA5, 0xA7, + 0x87, 0xE0, 0x3C, 0x34, 0x6B, 0x57, 0xF4, 0x9F, + 0x21, 0xB6, 0x4F, 0xA9, 0xCF, 0x4B, 0x7E, 0x45, + 0x57, 0x3E, 0x23, 0x04, 0x90, 0x17, 0x56, 0x71, + 0x21, 0xA9, 0xC3, 0xD4, 0xB2, 0xB7, 0x3E, 0xC5, + 0xE9, 0x41, 0x35, 0x77, 0x52, 0x5D, 0xB4, 0x5A + }, + { + 0xEC, 0x70, 0x96, 0x33, 0x07, 0x36, 0xFD, 0xB2, + 0xD6, 0x4B, 0x56, 0x53, 0xE7, 0x47, 0x5D, 0xA7, + 0x46, 0xC2, 0x3A, 0x46, 0x13, 0xA8, 0x26, 0x87, + 0xA2, 0x80, 0x62, 0xD3, 0x23, 0x63, 0x64, 0x28, + 0x4A, 0xC0, 0x17, 0x20, 0xFF, 0xB4, 0x06, 0xCF, + 0xE2, 0x65, 0xC0, 0xDF, 0x62, 0x6A, 0x18, 0x8C, + 0x9E, 0x59, 0x63, 0xAC, 0xE5, 0xD3, 0xD5, 0xBB, + 0x36, 0x3E, 0x32, 0xC3, 0x8C, 0x21, 0x90, 0xA6 + }, + { + 0x82, 0xE7, 0x44, 0xC7, 0x5F, 0x46, 0x49, 0xEC, + 0x52, 0xB8, 0x07, 0x71, 0xA7, 0x7D, 0x47, 0x5A, + 0x3B, 0xC0, 0x91, 0x98, 0x95, 0x56, 0x96, 0x0E, + 0x27, 0x6A, 0x5F, 0x9E, 0xAD, 0x92, 0xA0, 0x3F, + 0x71, 0x87, 0x42, 0xCD, 0xCF, 0xEA, 0xEE, 0x5C, + 0xB8, 0x5C, 0x44, 0xAF, 0x19, 0x8A, 0xDC, 0x43, + 0xA4, 0xA4, 0x28, 0xF5, 0xF0, 0xC2, 0xDD, 0xB0, + 0xBE, 0x36, 0x05, 0x9F, 0x06, 0xD7, 0xDF, 0x73 + }, + { + 0x28, 0x34, 0xB7, 0xA7, 0x17, 0x0F, 0x1F, 0x5B, + 0x68, 0x55, 0x9A, 0xB7, 0x8C, 0x10, 0x50, 0xEC, + 0x21, 0xC9, 0x19, 0x74, 0x0B, 0x78, 0x4A, 0x90, + 0x72, 0xF6, 0xE5, 0xD6, 0x9F, 0x82, 0x8D, 0x70, + 0xC9, 0x19, 0xC5, 0x03, 0x9F, 0xB1, 0x48, 0xE3, + 0x9E, 0x2C, 0x8A, 0x52, 0x11, 0x83, 0x78, 0xB0, + 0x64, 0xCA, 0x8D, 0x50, 0x01, 0xCD, 0x10, 0xA5, + 0x47, 0x83, 0x87, 0xB9, 0x66, 0x71, 0x5E, 0xD6 + }, + { + 0x16, 0xB4, 0xAD, 0xA8, 0x83, 0xF7, 0x2F, 0x85, + 0x3B, 0xB7, 0xEF, 0x25, 0x3E, 0xFC, 0xAB, 0x0C, + 0x3E, 0x21, 0x61, 0x68, 0x7A, 0xD6, 0x15, 0x43, + 0xA0, 0xD2, 0x82, 0x4F, 0x91, 0xC1, 0xF8, 0x13, + 0x47, 0xD8, 0x6B, 0xE7, 0x09, 0xB1, 0x69, 0x96, + 0xE1, 0x7F, 0x2D, 0xD4, 0x86, 0x92, 0x7B, 0x02, + 0x88, 0xAD, 0x38, 0xD1, 0x30, 0x63, 0xC4, 0xA9, + 0x67, 0x2C, 0x39, 0x39, 0x7D, 0x37, 0x89, 0xB6 + }, + { + 0x78, 0xD0, 0x48, 0xF3, 0xA6, 0x9D, 0x8B, 0x54, + 0xAE, 0x0E, 0xD6, 0x3A, 0x57, 0x3A, 0xE3, 0x50, + 0xD8, 0x9F, 0x7C, 0x6C, 0xF1, 0xF3, 0x68, 0x89, + 0x30, 0xDE, 0x89, 0x9A, 0xFA, 0x03, 0x76, 0x97, + 0x62, 0x9B, 0x31, 0x4E, 0x5C, 0xD3, 0x03, 0xAA, + 0x62, 0xFE, 0xEA, 0x72, 0xA2, 0x5B, 0xF4, 0x2B, + 0x30, 0x4B, 0x6C, 0x6B, 0xCB, 0x27, 0xFA, 0xE2, + 0x1C, 0x16, 0xD9, 0x25, 0xE1, 0xFB, 0xDA, 0xC3 + }, + { + 0x0F, 0x74, 0x6A, 0x48, 0x74, 0x92, 0x87, 0xAD, + 0xA7, 0x7A, 0x82, 0x96, 0x1F, 0x05, 0xA4, 0xDA, + 0x4A, 0xBD, 0xB7, 0xD7, 0x7B, 0x12, 0x20, 0xF8, + 0x36, 0xD0, 0x9E, 0xC8, 0x14, 0x35, 0x9C, 0x0E, + 0xC0, 0x23, 0x9B, 0x8C, 0x7B, 0x9F, 0xF9, 0xE0, + 0x2F, 0x56, 0x9D, 0x1B, 0x30, 0x1E, 0xF6, 0x7C, + 0x46, 0x12, 0xD1, 0xDE, 0x4F, 0x73, 0x0F, 0x81, + 0xC1, 0x2C, 0x40, 0xCC, 0x06, 0x3C, 0x5C, 0xAA + }, + { + 0xF0, 0xFC, 0x85, 0x9D, 0x3B, 0xD1, 0x95, 0xFB, + 0xDC, 0x2D, 0x59, 0x1E, 0x4C, 0xDA, 0xC1, 0x51, + 0x79, 0xEC, 0x0F, 0x1D, 0xC8, 0x21, 0xC1, 0x1D, + 0xF1, 0xF0, 0xC1, 0xD2, 0x6E, 0x62, 0x60, 0xAA, + 0xA6, 0x5B, 0x79, 0xFA, 0xFA, 0xCA, 0xFD, 0x7D, + 0x3A, 0xD6, 0x1E, 0x60, 0x0F, 0x25, 0x09, 0x05, + 0xF5, 0x87, 0x8C, 0x87, 0x45, 0x28, 0x97, 0x64, + 0x7A, 0x35, 0xB9, 0x95, 0xBC, 0xAD, 0xC3, 0xA3 + }, + { + 0x26, 0x20, 0xF6, 0x87, 0xE8, 0x62, 0x5F, 0x6A, + 0x41, 0x24, 0x60, 0xB4, 0x2E, 0x2C, 0xEF, 0x67, + 0x63, 0x42, 0x08, 0xCE, 0x10, 0xA0, 0xCB, 0xD4, + 0xDF, 0xF7, 0x04, 0x4A, 0x41, 0xB7, 0x88, 0x00, + 0x77, 0xE9, 0xF8, 0xDC, 0x3B, 0x8D, 0x12, 0x16, + 0xD3, 0x37, 0x6A, 0x21, 0xE0, 0x15, 0xB5, 0x8F, + 0xB2, 0x79, 0xB5, 0x21, 0xD8, 0x3F, 0x93, 0x88, + 0xC7, 0x38, 0x2C, 0x85, 0x05, 0x59, 0x0B, 0x9B + }, + { + 0x22, 0x7E, 0x3A, 0xED, 0x8D, 0x2C, 0xB1, 0x0B, + 0x91, 0x8F, 0xCB, 0x04, 0xF9, 0xDE, 0x3E, 0x6D, + 0x0A, 0x57, 0xE0, 0x84, 0x76, 0xD9, 0x37, 0x59, + 0xCD, 0x7B, 0x2E, 0xD5, 0x4A, 0x1C, 0xBF, 0x02, + 0x39, 0xC5, 0x28, 0xFB, 0x04, 0xBB, 0xF2, 0x88, + 0x25, 0x3E, 0x60, 0x1D, 0x3B, 0xC3, 0x8B, 0x21, + 0x79, 0x4A, 0xFE, 0xF9, 0x0B, 0x17, 0x09, 0x4A, + 0x18, 0x2C, 0xAC, 0x55, 0x77, 0x45, 0xE7, 0x5F + }, + { + 0x1A, 0x92, 0x99, 0x01, 0xB0, 0x9C, 0x25, 0xF2, + 0x7D, 0x6B, 0x35, 0xBE, 0x7B, 0x2F, 0x1C, 0x47, + 0x45, 0x13, 0x1F, 0xDE, 0xBC, 0xA7, 0xF3, 0xE2, + 0x45, 0x19, 0x26, 0x72, 0x04, 0x34, 0xE0, 0xDB, + 0x6E, 0x74, 0xFD, 0x69, 0x3A, 0xD2, 0x9B, 0x77, + 0x7D, 0xC3, 0x35, 0x5C, 0x59, 0x2A, 0x36, 0x1C, + 0x48, 0x73, 0xB0, 0x11, 0x33, 0xA5, 0x7C, 0x2E, + 0x3B, 0x70, 0x75, 0xCB, 0xDB, 0x86, 0xF4, 0xFC + }, + { + 0x5F, 0xD7, 0x96, 0x8B, 0xC2, 0xFE, 0x34, 0xF2, + 0x20, 0xB5, 0xE3, 0xDC, 0x5A, 0xF9, 0x57, 0x17, + 0x42, 0xD7, 0x3B, 0x7D, 0x60, 0x81, 0x9F, 0x28, + 0x88, 0xB6, 0x29, 0x07, 0x2B, 0x96, 0xA9, 0xD8, + 0xAB, 0x2D, 0x91, 0xB8, 0x2D, 0x0A, 0x9A, 0xAB, + 0xA6, 0x1B, 0xBD, 0x39, 0x95, 0x81, 0x32, 0xFC, + 0xC4, 0x25, 0x70, 0x23, 0xD1, 0xEC, 0xA5, 0x91, + 0xB3, 0x05, 0x4E, 0x2D, 0xC8, 0x1C, 0x82, 0x00 + }, + { + 0xDF, 0xCC, 0xE8, 0xCF, 0x32, 0x87, 0x0C, 0xC6, + 0xA5, 0x03, 0xEA, 0xDA, 0xFC, 0x87, 0xFD, 0x6F, + 0x78, 0x91, 0x8B, 0x9B, 0x4D, 0x07, 0x37, 0xDB, + 0x68, 0x10, 0xBE, 0x99, 0x6B, 0x54, 0x97, 0xE7, + 0xE5, 0xCC, 0x80, 0xE3, 0x12, 0xF6, 0x1E, 0x71, + 0xFF, 0x3E, 0x96, 0x24, 0x43, 0x60, 0x73, 0x15, + 0x64, 0x03, 0xF7, 0x35, 0xF5, 0x6B, 0x0B, 0x01, + 0x84, 0x5C, 0x18, 0xF6, 0xCA, 0xF7, 0x72, 0xE6 + }, + { + 0x02, 0xF7, 0xEF, 0x3A, 0x9C, 0xE0, 0xFF, 0xF9, + 0x60, 0xF6, 0x70, 0x32, 0xB2, 0x96, 0xEF, 0xCA, + 0x30, 0x61, 0xF4, 0x93, 0x4D, 0x69, 0x07, 0x49, + 0xF2, 0xD0, 0x1C, 0x35, 0xC8, 0x1C, 0x14, 0xF3, + 0x9A, 0x67, 0xFA, 0x35, 0x0B, 0xC8, 0xA0, 0x35, + 0x9B, 0xF1, 0x72, 0x4B, 0xFF, 0xC3, 0xBC, 0xA6, + 0xD7, 0xC7, 0xBB, 0xA4, 0x79, 0x1F, 0xD5, 0x22, + 0xA3, 0xAD, 0x35, 0x3C, 0x02, 0xEC, 0x5A, 0xA8 + }, + { + 0x64, 0xBE, 0x5C, 0x6A, 0xBA, 0x65, 0xD5, 0x94, + 0x84, 0x4A, 0xE7, 0x8B, 0xB0, 0x22, 0xE5, 0xBE, + 0xBE, 0x12, 0x7F, 0xD6, 0xB6, 0xFF, 0xA5, 0xA1, + 0x37, 0x03, 0x85, 0x5A, 0xB6, 0x3B, 0x62, 0x4D, + 0xCD, 0x1A, 0x36, 0x3F, 0x99, 0x20, 0x3F, 0x63, + 0x2E, 0xC3, 0x86, 0xF3, 0xEA, 0x76, 0x7F, 0xC9, + 0x92, 0xE8, 0xED, 0x96, 0x86, 0x58, 0x6A, 0xA2, + 0x75, 0x55, 0xA8, 0x59, 0x9D, 0x5B, 0x80, 0x8F + }, + { + 0xF7, 0x85, 0x85, 0x50, 0x5C, 0x4E, 0xAA, 0x54, + 0xA8, 0xB5, 0xBE, 0x70, 0xA6, 0x1E, 0x73, 0x5E, + 0x0F, 0xF9, 0x7A, 0xF9, 0x44, 0xDD, 0xB3, 0x00, + 0x1E, 0x35, 0xD8, 0x6C, 0x4E, 0x21, 0x99, 0xD9, + 0x76, 0x10, 0x4B, 0x6A, 0xE3, 0x17, 0x50, 0xA3, + 0x6A, 0x72, 0x6E, 0xD2, 0x85, 0x06, 0x4F, 0x59, + 0x81, 0xB5, 0x03, 0x88, 0x9F, 0xEF, 0x82, 0x2F, + 0xCD, 0xC2, 0x89, 0x8D, 0xDD, 0xB7, 0x88, 0x9A + }, + { + 0xE4, 0xB5, 0x56, 0x60, 0x33, 0x86, 0x95, 0x72, + 0xED, 0xFD, 0x87, 0x47, 0x9A, 0x5B, 0xB7, 0x3C, + 0x80, 0xE8, 0x75, 0x9B, 0x91, 0x23, 0x28, 0x79, + 0xD9, 0x6B, 0x1D, 0xDA, 0x36, 0xC0, 0x12, 0x07, + 0x6E, 0xE5, 0xA2, 0xED, 0x7A, 0xE2, 0xDE, 0x63, + 0xEF, 0x84, 0x06, 0xA0, 0x6A, 0xEA, 0x82, 0xC1, + 0x88, 0x03, 0x1B, 0x56, 0x0B, 0xEA, 0xFB, 0x58, + 0x3F, 0xB3, 0xDE, 0x9E, 0x57, 0x95, 0x2A, 0x7E + }, + { + 0xE1, 0xB3, 0xE7, 0xED, 0x86, 0x7F, 0x6C, 0x94, + 0x84, 0xA2, 0xA9, 0x7F, 0x77, 0x15, 0xF2, 0x5E, + 0x25, 0x29, 0x4E, 0x99, 0x2E, 0x41, 0xF6, 0xA7, + 0xC1, 0x61, 0xFF, 0xC2, 0xAD, 0xC6, 0xDA, 0xAE, + 0xB7, 0x11, 0x31, 0x02, 0xD5, 0xE6, 0x09, 0x02, + 0x87, 0xFE, 0x6A, 0xD9, 0x4C, 0xE5, 0xD6, 0xB7, + 0x39, 0xC6, 0xCA, 0x24, 0x0B, 0x05, 0xC7, 0x6F, + 0xB7, 0x3F, 0x25, 0xDD, 0x02, 0x4B, 0xF9, 0x35 + }, + { + 0x85, 0xFD, 0x08, 0x5F, 0xDC, 0x12, 0xA0, 0x80, + 0x98, 0x3D, 0xF0, 0x7B, 0xD7, 0x01, 0x2B, 0x0D, + 0x40, 0x2A, 0x0F, 0x40, 0x43, 0xFC, 0xB2, 0x77, + 0x5A, 0xDF, 0x0B, 0xAD, 0x17, 0x4F, 0x9B, 0x08, + 0xD1, 0x67, 0x6E, 0x47, 0x69, 0x85, 0x78, 0x5C, + 0x0A, 0x5D, 0xCC, 0x41, 0xDB, 0xFF, 0x6D, 0x95, + 0xEF, 0x4D, 0x66, 0xA3, 0xFB, 0xDC, 0x4A, 0x74, + 0xB8, 0x2B, 0xA5, 0x2D, 0xA0, 0x51, 0x2B, 0x74 + }, + { + 0xAE, 0xD8, 0xFA, 0x76, 0x4B, 0x0F, 0xBF, 0xF8, + 0x21, 0xE0, 0x52, 0x33, 0xD2, 0xF7, 0xB0, 0x90, + 0x0E, 0xC4, 0x4D, 0x82, 0x6F, 0x95, 0xE9, 0x3C, + 0x34, 0x3C, 0x1B, 0xC3, 0xBA, 0x5A, 0x24, 0x37, + 0x4B, 0x1D, 0x61, 0x6E, 0x7E, 0x7A, 0xBA, 0x45, + 0x3A, 0x0A, 0xDA, 0x5E, 0x4F, 0xAB, 0x53, 0x82, + 0x40, 0x9E, 0x0D, 0x42, 0xCE, 0x9C, 0x2B, 0xC7, + 0xFB, 0x39, 0xA9, 0x9C, 0x34, 0x0C, 0x20, 0xF0 + }, + { + 0x7B, 0xA3, 0xB2, 0xE2, 0x97, 0x23, 0x35, 0x22, + 0xEE, 0xB3, 0x43, 0xBD, 0x3E, 0xBC, 0xFD, 0x83, + 0x5A, 0x04, 0x00, 0x77, 0x35, 0xE8, 0x7F, 0x0C, + 0xA3, 0x00, 0xCB, 0xEE, 0x6D, 0x41, 0x65, 0x65, + 0x16, 0x21, 0x71, 0x58, 0x1E, 0x40, 0x20, 0xFF, + 0x4C, 0xF1, 0x76, 0x45, 0x0F, 0x12, 0x91, 0xEA, + 0x22, 0x85, 0xCB, 0x9E, 0xBF, 0xFE, 0x4C, 0x56, + 0x66, 0x06, 0x27, 0x68, 0x51, 0x45, 0x05, 0x1C + }, + { + 0xDE, 0x74, 0x8B, 0xCF, 0x89, 0xEC, 0x88, 0x08, + 0x47, 0x21, 0xE1, 0x6B, 0x85, 0xF3, 0x0A, 0xDB, + 0x1A, 0x61, 0x34, 0xD6, 0x64, 0xB5, 0x84, 0x35, + 0x69, 0xBA, 0xBC, 0x5B, 0xBD, 0x1A, 0x15, 0xCA, + 0x9B, 0x61, 0x80, 0x3C, 0x90, 0x1A, 0x4F, 0xEF, + 0x32, 0x96, 0x5A, 0x17, 0x49, 0xC9, 0xF3, 0xA4, + 0xE2, 0x43, 0xE1, 0x73, 0x93, 0x9D, 0xC5, 0xA8, + 0xDC, 0x49, 0x5C, 0x67, 0x1A, 0xB5, 0x21, 0x45 + }, + { + 0xAA, 0xF4, 0xD2, 0xBD, 0xF2, 0x00, 0xA9, 0x19, + 0x70, 0x6D, 0x98, 0x42, 0xDC, 0xE1, 0x6C, 0x98, + 0x14, 0x0D, 0x34, 0xBC, 0x43, 0x3D, 0xF3, 0x20, + 0xAB, 0xA9, 0xBD, 0x42, 0x9E, 0x54, 0x9A, 0xA7, + 0xA3, 0x39, 0x76, 0x52, 0xA4, 0xD7, 0x68, 0x27, + 0x77, 0x86, 0xCF, 0x99, 0x3C, 0xDE, 0x23, 0x38, + 0x67, 0x3E, 0xD2, 0xE6, 0xB6, 0x6C, 0x96, 0x1F, + 0xEF, 0xB8, 0x2C, 0xD2, 0x0C, 0x93, 0x33, 0x8F + }, + { + 0xC4, 0x08, 0x21, 0x89, 0x68, 0xB7, 0x88, 0xBF, + 0x86, 0x4F, 0x09, 0x97, 0xE6, 0xBC, 0x4C, 0x3D, + 0xBA, 0x68, 0xB2, 0x76, 0xE2, 0x12, 0x5A, 0x48, + 0x43, 0x29, 0x60, 0x52, 0xFF, 0x93, 0xBF, 0x57, + 0x67, 0xB8, 0xCD, 0xCE, 0x71, 0x31, 0xF0, 0x87, + 0x64, 0x30, 0xC1, 0x16, 0x5F, 0xEC, 0x6C, 0x4F, + 0x47, 0xAD, 0xAA, 0x4F, 0xD8, 0xBC, 0xFA, 0xCE, + 0xF4, 0x63, 0xB5, 0xD3, 0xD0, 0xFA, 0x61, 0xA0 + }, + { + 0x76, 0xD2, 0xD8, 0x19, 0xC9, 0x2B, 0xCE, 0x55, + 0xFA, 0x8E, 0x09, 0x2A, 0xB1, 0xBF, 0x9B, 0x9E, + 0xAB, 0x23, 0x7A, 0x25, 0x26, 0x79, 0x86, 0xCA, + 0xCF, 0x2B, 0x8E, 0xE1, 0x4D, 0x21, 0x4D, 0x73, + 0x0D, 0xC9, 0xA5, 0xAA, 0x2D, 0x7B, 0x59, 0x6E, + 0x86, 0xA1, 0xFD, 0x8F, 0xA0, 0x80, 0x4C, 0x77, + 0x40, 0x2D, 0x2F, 0xCD, 0x45, 0x08, 0x36, 0x88, + 0xB2, 0x18, 0xB1, 0xCD, 0xFA, 0x0D, 0xCB, 0xCB + }, + { + 0x72, 0x06, 0x5E, 0xE4, 0xDD, 0x91, 0xC2, 0xD8, + 0x50, 0x9F, 0xA1, 0xFC, 0x28, 0xA3, 0x7C, 0x7F, + 0xC9, 0xFA, 0x7D, 0x5B, 0x3F, 0x8A, 0xD3, 0xD0, + 0xD7, 0xA2, 0x56, 0x26, 0xB5, 0x7B, 0x1B, 0x44, + 0x78, 0x8D, 0x4C, 0xAF, 0x80, 0x62, 0x90, 0x42, + 0x5F, 0x98, 0x90, 0xA3, 0xA2, 0xA3, 0x5A, 0x90, + 0x5A, 0xB4, 0xB3, 0x7A, 0xCF, 0xD0, 0xDA, 0x6E, + 0x45, 0x17, 0xB2, 0x52, 0x5C, 0x96, 0x51, 0xE4 + }, + { + 0x64, 0x47, 0x5D, 0xFE, 0x76, 0x00, 0xD7, 0x17, + 0x1B, 0xEA, 0x0B, 0x39, 0x4E, 0x27, 0xC9, 0xB0, + 0x0D, 0x8E, 0x74, 0xDD, 0x1E, 0x41, 0x6A, 0x79, + 0x47, 0x36, 0x82, 0xAD, 0x3D, 0xFD, 0xBB, 0x70, + 0x66, 0x31, 0x55, 0x80, 0x55, 0xCF, 0xC8, 0xA4, + 0x0E, 0x07, 0xBD, 0x01, 0x5A, 0x45, 0x40, 0xDC, + 0xDE, 0xA1, 0x58, 0x83, 0xCB, 0xBF, 0x31, 0x41, + 0x2D, 0xF1, 0xDE, 0x1C, 0xD4, 0x15, 0x2B, 0x91 + }, + { + 0x12, 0xCD, 0x16, 0x74, 0xA4, 0x48, 0x8A, 0x5D, + 0x7C, 0x2B, 0x31, 0x60, 0xD2, 0xE2, 0xC4, 0xB5, + 0x83, 0x71, 0xBE, 0xDA, 0xD7, 0x93, 0x41, 0x8D, + 0x6F, 0x19, 0xC6, 0xEE, 0x38, 0x5D, 0x70, 0xB3, + 0xE0, 0x67, 0x39, 0x36, 0x9D, 0x4D, 0xF9, 0x10, + 0xED, 0xB0, 0xB0, 0xA5, 0x4C, 0xBF, 0xF4, 0x3D, + 0x54, 0x54, 0x4C, 0xD3, 0x7A, 0xB3, 0xA0, 0x6C, + 0xFA, 0x0A, 0x3D, 0xDA, 0xC8, 0xB6, 0x6C, 0x89 + }, + { + 0x60, 0x75, 0x69, 0x66, 0x47, 0x9D, 0xED, 0xC6, + 0xDD, 0x4B, 0xCF, 0xF8, 0xEA, 0x7D, 0x1D, 0x4C, + 0xE4, 0xD4, 0xAF, 0x2E, 0x7B, 0x09, 0x7E, 0x32, + 0xE3, 0x76, 0x35, 0x18, 0x44, 0x11, 0x47, 0xCC, + 0x12, 0xB3, 0xC0, 0xEE, 0x6D, 0x2E, 0xCA, 0xBF, + 0x11, 0x98, 0xCE, 0xC9, 0x2E, 0x86, 0xA3, 0x61, + 0x6F, 0xBA, 0x4F, 0x4E, 0x87, 0x2F, 0x58, 0x25, + 0x33, 0x0A, 0xDB, 0xB4, 0xC1, 0xDE, 0xE4, 0x44 + }, + { + 0xA7, 0x80, 0x3B, 0xCB, 0x71, 0xBC, 0x1D, 0x0F, + 0x43, 0x83, 0xDD, 0xE1, 0xE0, 0x61, 0x2E, 0x04, + 0xF8, 0x72, 0xB7, 0x15, 0xAD, 0x30, 0x81, 0x5C, + 0x22, 0x49, 0xCF, 0x34, 0xAB, 0xB8, 0xB0, 0x24, + 0x91, 0x5C, 0xB2, 0xFC, 0x9F, 0x4E, 0x7C, 0xC4, + 0xC8, 0xCF, 0xD4, 0x5B, 0xE2, 0xD5, 0xA9, 0x1E, + 0xAB, 0x09, 0x41, 0xC7, 0xD2, 0x70, 0xE2, 0xDA, + 0x4C, 0xA4, 0xA9, 0xF7, 0xAC, 0x68, 0x66, 0x3A + }, + { + 0xB8, 0x4E, 0xF6, 0xA7, 0x22, 0x9A, 0x34, 0xA7, + 0x50, 0xD9, 0xA9, 0x8E, 0xE2, 0x52, 0x98, 0x71, + 0x81, 0x6B, 0x87, 0xFB, 0xE3, 0xBC, 0x45, 0xB4, + 0x5F, 0xA5, 0xAE, 0x82, 0xD5, 0x14, 0x15, 0x40, + 0x21, 0x11, 0x65, 0xC3, 0xC5, 0xD7, 0xA7, 0x47, + 0x6B, 0xA5, 0xA4, 0xAA, 0x06, 0xD6, 0x64, 0x76, + 0xF0, 0xD9, 0xDC, 0x49, 0xA3, 0xF1, 0xEE, 0x72, + 0xC3, 0xAC, 0xAB, 0xD4, 0x98, 0x96, 0x74, 0x14 + }, + { + 0xFA, 0xE4, 0xB6, 0xD8, 0xEF, 0xC3, 0xF8, 0xC8, + 0xE6, 0x4D, 0x00, 0x1D, 0xAB, 0xEC, 0x3A, 0x21, + 0xF5, 0x44, 0xE8, 0x27, 0x14, 0x74, 0x52, 0x51, + 0xB2, 0xB4, 0xB3, 0x93, 0xF2, 0xF4, 0x3E, 0x0D, + 0xA3, 0xD4, 0x03, 0xC6, 0x4D, 0xB9, 0x5A, 0x2C, + 0xB6, 0xE2, 0x3E, 0xBB, 0x7B, 0x9E, 0x94, 0xCD, + 0xD5, 0xDD, 0xAC, 0x54, 0xF0, 0x7C, 0x4A, 0x61, + 0xBD, 0x3C, 0xB1, 0x0A, 0xA6, 0xF9, 0x3B, 0x49 + }, + { + 0x34, 0xF7, 0x28, 0x66, 0x05, 0xA1, 0x22, 0x36, + 0x95, 0x40, 0x14, 0x1D, 0xED, 0x79, 0xB8, 0x95, + 0x72, 0x55, 0xDA, 0x2D, 0x41, 0x55, 0xAB, 0xBF, + 0x5A, 0x8D, 0xBB, 0x89, 0xC8, 0xEB, 0x7E, 0xDE, + 0x8E, 0xEE, 0xF1, 0xDA, 0xA4, 0x6D, 0xC2, 0x9D, + 0x75, 0x1D, 0x04, 0x5D, 0xC3, 0xB1, 0xD6, 0x58, + 0xBB, 0x64, 0xB8, 0x0F, 0xF8, 0x58, 0x9E, 0xDD, + 0xB3, 0x82, 0x4B, 0x13, 0xDA, 0x23, 0x5A, 0x6B + }, + { + 0x3B, 0x3B, 0x48, 0x43, 0x4B, 0xE2, 0x7B, 0x9E, + 0xAB, 0xAB, 0xBA, 0x43, 0xBF, 0x6B, 0x35, 0xF1, + 0x4B, 0x30, 0xF6, 0xA8, 0x8D, 0xC2, 0xE7, 0x50, + 0xC3, 0x58, 0x47, 0x0D, 0x6B, 0x3A, 0xA3, 0xC1, + 0x8E, 0x47, 0xDB, 0x40, 0x17, 0xFA, 0x55, 0x10, + 0x6D, 0x82, 0x52, 0xF0, 0x16, 0x37, 0x1A, 0x00, + 0xF5, 0xF8, 0xB0, 0x70, 0xB7, 0x4B, 0xA5, 0xF2, + 0x3C, 0xFF, 0xC5, 0x51, 0x1C, 0x9F, 0x09, 0xF0 + }, + { + 0xBA, 0x28, 0x9E, 0xBD, 0x65, 0x62, 0xC4, 0x8C, + 0x3E, 0x10, 0xA8, 0xAD, 0x6C, 0xE0, 0x2E, 0x73, + 0x43, 0x3D, 0x1E, 0x93, 0xD7, 0xC9, 0x27, 0x9D, + 0x4D, 0x60, 0xA7, 0xE8, 0x79, 0xEE, 0x11, 0xF4, + 0x41, 0xA0, 0x00, 0xF4, 0x8E, 0xD9, 0xF7, 0xC4, + 0xED, 0x87, 0xA4, 0x51, 0x36, 0xD7, 0xDC, 0xCD, + 0xCA, 0x48, 0x21, 0x09, 0xC7, 0x8A, 0x51, 0x06, + 0x2B, 0x3B, 0xA4, 0x04, 0x4A, 0xDA, 0x24, 0x69 + }, + { + 0x02, 0x29, 0x39, 0xE2, 0x38, 0x6C, 0x5A, 0x37, + 0x04, 0x98, 0x56, 0xC8, 0x50, 0xA2, 0xBB, 0x10, + 0xA1, 0x3D, 0xFE, 0xA4, 0x21, 0x2B, 0x4C, 0x73, + 0x2A, 0x88, 0x40, 0xA9, 0xFF, 0xA5, 0xFA, 0xF5, + 0x48, 0x75, 0xC5, 0x44, 0x88, 0x16, 0xB2, 0x78, + 0x5A, 0x00, 0x7D, 0xA8, 0xA8, 0xD2, 0xBC, 0x7D, + 0x71, 0xA5, 0x4E, 0x4E, 0x65, 0x71, 0xF1, 0x0B, + 0x60, 0x0C, 0xBD, 0xB2, 0x5D, 0x13, 0xED, 0xE3 + }, + { + 0xE6, 0xFE, 0xC1, 0x9D, 0x89, 0xCE, 0x87, 0x17, + 0xB1, 0xA0, 0x87, 0x02, 0x46, 0x70, 0xFE, 0x02, + 0x6F, 0x6C, 0x7C, 0xBD, 0xA1, 0x1C, 0xAE, 0xF9, + 0x59, 0xBB, 0x2D, 0x35, 0x1B, 0xF8, 0x56, 0xF8, + 0x05, 0x5D, 0x1C, 0x0E, 0xBD, 0xAA, 0xA9, 0xD1, + 0xB1, 0x78, 0x86, 0xFC, 0x2C, 0x56, 0x2B, 0x5E, + 0x99, 0x64, 0x2F, 0xC0, 0x64, 0x71, 0x0C, 0x0D, + 0x34, 0x88, 0xA0, 0x2B, 0x5E, 0xD7, 0xF6, 0xFD + }, + { + 0x94, 0xC9, 0x6F, 0x02, 0xA8, 0xF5, 0x76, 0xAC, + 0xA3, 0x2B, 0xA6, 0x1C, 0x2B, 0x20, 0x6F, 0x90, + 0x72, 0x85, 0xD9, 0x29, 0x9B, 0x83, 0xAC, 0x17, + 0x5C, 0x20, 0x9A, 0x8D, 0x43, 0xD5, 0x3B, 0xFE, + 0x68, 0x3D, 0xD1, 0xD8, 0x3E, 0x75, 0x49, 0xCB, + 0x90, 0x6C, 0x28, 0xF5, 0x9A, 0xB7, 0xC4, 0x6F, + 0x87, 0x51, 0x36, 0x6A, 0x28, 0xC3, 0x9D, 0xD5, + 0xFE, 0x26, 0x93, 0xC9, 0x01, 0x96, 0x66, 0xC8 + }, + { + 0x31, 0xA0, 0xCD, 0x21, 0x5E, 0xBD, 0x2C, 0xB6, + 0x1D, 0xE5, 0xB9, 0xED, 0xC9, 0x1E, 0x61, 0x95, + 0xE3, 0x1C, 0x59, 0xA5, 0x64, 0x8D, 0x5C, 0x9F, + 0x73, 0x7E, 0x12, 0x5B, 0x26, 0x05, 0x70, 0x8F, + 0x2E, 0x32, 0x5A, 0xB3, 0x38, 0x1C, 0x8D, 0xCE, + 0x1A, 0x3E, 0x95, 0x88, 0x86, 0xF1, 0xEC, 0xDC, + 0x60, 0x31, 0x8F, 0x88, 0x2C, 0xFE, 0x20, 0xA2, + 0x41, 0x91, 0x35, 0x2E, 0x61, 0x7B, 0x0F, 0x21 + }, + { + 0x91, 0xAB, 0x50, 0x4A, 0x52, 0x2D, 0xCE, 0x78, + 0x77, 0x9F, 0x4C, 0x6C, 0x6B, 0xA2, 0xE6, 0xB6, + 0xDB, 0x55, 0x65, 0xC7, 0x6D, 0x3E, 0x7E, 0x7C, + 0x92, 0x0C, 0xAF, 0x7F, 0x75, 0x7E, 0xF9, 0xDB, + 0x7C, 0x8F, 0xCF, 0x10, 0xE5, 0x7F, 0x03, 0x37, + 0x9E, 0xA9, 0xBF, 0x75, 0xEB, 0x59, 0x89, 0x5D, + 0x96, 0xE1, 0x49, 0x80, 0x0B, 0x6A, 0xAE, 0x01, + 0xDB, 0x77, 0x8B, 0xB9, 0x0A, 0xFB, 0xC9, 0x89 + }, + { + 0xD8, 0x5C, 0xAB, 0xC6, 0xBD, 0x5B, 0x1A, 0x01, + 0xA5, 0xAF, 0xD8, 0xC6, 0x73, 0x47, 0x40, 0xDA, + 0x9F, 0xD1, 0xC1, 0xAC, 0xC6, 0xDB, 0x29, 0xBF, + 0xC8, 0xA2, 0xE5, 0xB6, 0x68, 0xB0, 0x28, 0xB6, + 0xB3, 0x15, 0x4B, 0xFB, 0x87, 0x03, 0xFA, 0x31, + 0x80, 0x25, 0x1D, 0x58, 0x9A, 0xD3, 0x80, 0x40, + 0xCE, 0xB7, 0x07, 0xC4, 0xBA, 0xD1, 0xB5, 0x34, + 0x3C, 0xB4, 0x26, 0xB6, 0x1E, 0xAA, 0x49, 0xC1 + }, + { + 0xD6, 0x2E, 0xFB, 0xEC, 0x2C, 0xA9, 0xC1, 0xF8, + 0xBD, 0x66, 0xCE, 0x8B, 0x3F, 0x6A, 0x89, 0x8C, + 0xB3, 0xF7, 0x56, 0x6B, 0xA6, 0x56, 0x8C, 0x61, + 0x8A, 0xD1, 0xFE, 0xB2, 0xB6, 0x5B, 0x76, 0xC3, + 0xCE, 0x1D, 0xD2, 0x0F, 0x73, 0x95, 0x37, 0x2F, + 0xAF, 0x28, 0x42, 0x7F, 0x61, 0xC9, 0x27, 0x80, + 0x49, 0xCF, 0x01, 0x40, 0xDF, 0x43, 0x4F, 0x56, + 0x33, 0x04, 0x8C, 0x86, 0xB8, 0x1E, 0x03, 0x99 + }, + { + 0x7C, 0x8F, 0xDC, 0x61, 0x75, 0x43, 0x9E, 0x2C, + 0x3D, 0xB1, 0x5B, 0xAF, 0xA7, 0xFB, 0x06, 0x14, + 0x3A, 0x6A, 0x23, 0xBC, 0x90, 0xF4, 0x49, 0xE7, + 0x9D, 0xEE, 0xF7, 0x3C, 0x3D, 0x49, 0x2A, 0x67, + 0x17, 0x15, 0xC1, 0x93, 0xB6, 0xFE, 0xA9, 0xF0, + 0x36, 0x05, 0x0B, 0x94, 0x60, 0x69, 0x85, 0x6B, + 0x89, 0x7E, 0x08, 0xC0, 0x07, 0x68, 0xF5, 0xEE, + 0x5D, 0xDC, 0xF7, 0x0B, 0x7C, 0xD6, 0xD0, 0xE0 + }, + { + 0x58, 0x60, 0x2E, 0xE7, 0x46, 0x8E, 0x6B, 0xC9, + 0xDF, 0x21, 0xBD, 0x51, 0xB2, 0x3C, 0x00, 0x5F, + 0x72, 0xD6, 0xCB, 0x01, 0x3F, 0x0A, 0x1B, 0x48, + 0xCB, 0xEC, 0x5E, 0xCA, 0x29, 0x92, 0x99, 0xF9, + 0x7F, 0x09, 0xF5, 0x4A, 0x9A, 0x01, 0x48, 0x3E, + 0xAE, 0xB3, 0x15, 0xA6, 0x47, 0x8B, 0xAD, 0x37, + 0xBA, 0x47, 0xCA, 0x13, 0x47, 0xC7, 0xC8, 0xFC, + 0x9E, 0x66, 0x95, 0x59, 0x2C, 0x91, 0xD7, 0x23 + }, + { + 0x27, 0xF5, 0xB7, 0x9E, 0xD2, 0x56, 0xB0, 0x50, + 0x99, 0x3D, 0x79, 0x34, 0x96, 0xED, 0xF4, 0x80, + 0x7C, 0x1D, 0x85, 0xA7, 0xB0, 0xA6, 0x7C, 0x9C, + 0x4F, 0xA9, 0x98, 0x60, 0x75, 0x0B, 0x0A, 0xE6, + 0x69, 0x89, 0x67, 0x0A, 0x8F, 0xFD, 0x78, 0x56, + 0xD7, 0xCE, 0x41, 0x15, 0x99, 0xE5, 0x8C, 0x4D, + 0x77, 0xB2, 0x32, 0xA6, 0x2B, 0xEF, 0x64, 0xD1, + 0x52, 0x75, 0xBE, 0x46, 0xA6, 0x82, 0x35, 0xFF + }, + { + 0x39, 0x57, 0xA9, 0x76, 0xB9, 0xF1, 0x88, 0x7B, + 0xF0, 0x04, 0xA8, 0xDC, 0xA9, 0x42, 0xC9, 0x2D, + 0x2B, 0x37, 0xEA, 0x52, 0x60, 0x0F, 0x25, 0xE0, + 0xC9, 0xBC, 0x57, 0x07, 0xD0, 0x27, 0x9C, 0x00, + 0xC6, 0xE8, 0x5A, 0x83, 0x9B, 0x0D, 0x2D, 0x8E, + 0xB5, 0x9C, 0x51, 0xD9, 0x47, 0x88, 0xEB, 0xE6, + 0x24, 0x74, 0xA7, 0x91, 0xCA, 0xDF, 0x52, 0xCC, + 0xCF, 0x20, 0xF5, 0x07, 0x0B, 0x65, 0x73, 0xFC + }, + { + 0xEA, 0xA2, 0x37, 0x6D, 0x55, 0x38, 0x0B, 0xF7, + 0x72, 0xEC, 0xCA, 0x9C, 0xB0, 0xAA, 0x46, 0x68, + 0xC9, 0x5C, 0x70, 0x71, 0x62, 0xFA, 0x86, 0xD5, + 0x18, 0xC8, 0xCE, 0x0C, 0xA9, 0xBF, 0x73, 0x62, + 0xB9, 0xF2, 0xA0, 0xAD, 0xC3, 0xFF, 0x59, 0x92, + 0x2D, 0xF9, 0x21, 0xB9, 0x45, 0x67, 0xE8, 0x1E, + 0x45, 0x2F, 0x6C, 0x1A, 0x07, 0xFC, 0x81, 0x7C, + 0xEB, 0xE9, 0x96, 0x04, 0xB3, 0x50, 0x5D, 0x38 + }, + { + 0xC1, 0xE2, 0xC7, 0x8B, 0x6B, 0x27, 0x34, 0xE2, + 0x48, 0x0E, 0xC5, 0x50, 0x43, 0x4C, 0xB5, 0xD6, + 0x13, 0x11, 0x1A, 0xDC, 0xC2, 0x1D, 0x47, 0x55, + 0x45, 0xC3, 0xB1, 0xB7, 0xE6, 0xFF, 0x12, 0x44, + 0x44, 0x76, 0xE5, 0xC0, 0x55, 0x13, 0x2E, 0x22, + 0x29, 0xDC, 0x0F, 0x80, 0x70, 0x44, 0xBB, 0x91, + 0x9B, 0x1A, 0x56, 0x62, 0xDD, 0x38, 0xA9, 0xEE, + 0x65, 0xE2, 0x43, 0xA3, 0x91, 0x1A, 0xED, 0x1A + }, + { + 0x8A, 0xB4, 0x87, 0x13, 0x38, 0x9D, 0xD0, 0xFC, + 0xF9, 0xF9, 0x65, 0xD3, 0xCE, 0x66, 0xB1, 0xE5, + 0x59, 0xA1, 0xF8, 0xC5, 0x87, 0x41, 0xD6, 0x76, + 0x83, 0xCD, 0x97, 0x13, 0x54, 0xF4, 0x52, 0xE6, + 0x2D, 0x02, 0x07, 0xA6, 0x5E, 0x43, 0x6C, 0x5D, + 0x5D, 0x8F, 0x8E, 0xE7, 0x1C, 0x6A, 0xBF, 0xE5, + 0x0E, 0x66, 0x90, 0x04, 0xC3, 0x02, 0xB3, 0x1A, + 0x7E, 0xA8, 0x31, 0x1D, 0x4A, 0x91, 0x60, 0x51 + }, + { + 0x24, 0xCE, 0x0A, 0xDD, 0xAA, 0x4C, 0x65, 0x03, + 0x8B, 0xD1, 0xB1, 0xC0, 0xF1, 0x45, 0x2A, 0x0B, + 0x12, 0x87, 0x77, 0xAA, 0xBC, 0x94, 0xA2, 0x9D, + 0xF2, 0xFD, 0x6C, 0x7E, 0x2F, 0x85, 0xF8, 0xAB, + 0x9A, 0xC7, 0xEF, 0xF5, 0x16, 0xB0, 0xE0, 0xA8, + 0x25, 0xC8, 0x4A, 0x24, 0xCF, 0xE4, 0x92, 0xEA, + 0xAD, 0x0A, 0x63, 0x08, 0xE4, 0x6D, 0xD4, 0x2F, + 0xE8, 0x33, 0x3A, 0xB9, 0x71, 0xBB, 0x30, 0xCA + }, + { + 0x51, 0x54, 0xF9, 0x29, 0xEE, 0x03, 0x04, 0x5B, + 0x6B, 0x0C, 0x00, 0x04, 0xFA, 0x77, 0x8E, 0xDE, + 0xE1, 0xD1, 0x39, 0x89, 0x32, 0x67, 0xCC, 0x84, + 0x82, 0x5A, 0xD7, 0xB3, 0x6C, 0x63, 0xDE, 0x32, + 0x79, 0x8E, 0x4A, 0x16, 0x6D, 0x24, 0x68, 0x65, + 0x61, 0x35, 0x4F, 0x63, 0xB0, 0x07, 0x09, 0xA1, + 0x36, 0x4B, 0x3C, 0x24, 0x1D, 0xE3, 0xFE, 0xBF, + 0x07, 0x54, 0x04, 0x58, 0x97, 0x46, 0x7C, 0xD4 + }, + { + 0xE7, 0x4E, 0x90, 0x79, 0x20, 0xFD, 0x87, 0xBD, + 0x5A, 0xD6, 0x36, 0xDD, 0x11, 0x08, 0x5E, 0x50, + 0xEE, 0x70, 0x45, 0x9C, 0x44, 0x3E, 0x1C, 0xE5, + 0x80, 0x9A, 0xF2, 0xBC, 0x2E, 0xBA, 0x39, 0xF9, + 0xE6, 0xD7, 0x12, 0x8E, 0x0E, 0x37, 0x12, 0xC3, + 0x16, 0xDA, 0x06, 0xF4, 0x70, 0x5D, 0x78, 0xA4, + 0x83, 0x8E, 0x28, 0x12, 0x1D, 0x43, 0x44, 0xA2, + 0xC7, 0x9C, 0x5E, 0x0D, 0xB3, 0x07, 0xA6, 0x77 + }, + { + 0xBF, 0x91, 0xA2, 0x23, 0x34, 0xBA, 0xC2, 0x0F, + 0x3F, 0xD8, 0x06, 0x63, 0xB3, 0xCD, 0x06, 0xC4, + 0xE8, 0x80, 0x2F, 0x30, 0xE6, 0xB5, 0x9F, 0x90, + 0xD3, 0x03, 0x5C, 0xC9, 0x79, 0x8A, 0x21, 0x7E, + 0xD5, 0xA3, 0x1A, 0xBB, 0xDA, 0x7F, 0xA6, 0x84, + 0x28, 0x27, 0xBD, 0xF2, 0xA7, 0xA1, 0xC2, 0x1F, + 0x6F, 0xCF, 0xCC, 0xBB, 0x54, 0xC6, 0xC5, 0x29, + 0x26, 0xF3, 0x2D, 0xA8, 0x16, 0x26, 0x9B, 0xE1 + }, + { + 0xD9, 0xD5, 0xC7, 0x4B, 0xE5, 0x12, 0x1B, 0x0B, + 0xD7, 0x42, 0xF2, 0x6B, 0xFF, 0xB8, 0xC8, 0x9F, + 0x89, 0x17, 0x1F, 0x3F, 0x93, 0x49, 0x13, 0x49, + 0x2B, 0x09, 0x03, 0xC2, 0x71, 0xBB, 0xE2, 0xB3, + 0x39, 0x5E, 0xF2, 0x59, 0x66, 0x9B, 0xEF, 0x43, + 0xB5, 0x7F, 0x7F, 0xCC, 0x30, 0x27, 0xDB, 0x01, + 0x82, 0x3F, 0x6B, 0xAE, 0xE6, 0x6E, 0x4F, 0x9F, + 0xEA, 0xD4, 0xD6, 0x72, 0x6C, 0x74, 0x1F, 0xCE + }, + { + 0x50, 0xC8, 0xB8, 0xCF, 0x34, 0xCD, 0x87, 0x9F, + 0x80, 0xE2, 0xFA, 0xAB, 0x32, 0x30, 0xB0, 0xC0, + 0xE1, 0xCC, 0x3E, 0x9D, 0xCA, 0xDE, 0xB1, 0xB9, + 0xD9, 0x7A, 0xB9, 0x23, 0x41, 0x5D, 0xD9, 0xA1, + 0xFE, 0x38, 0xAD, 0xDD, 0x5C, 0x11, 0x75, 0x6C, + 0x67, 0x99, 0x0B, 0x25, 0x6E, 0x95, 0xAD, 0x6D, + 0x8F, 0x9F, 0xED, 0xCE, 0x10, 0xBF, 0x1C, 0x90, + 0x67, 0x9C, 0xDE, 0x0E, 0xCF, 0x1B, 0xE3, 0x47 + }, + { + 0x0A, 0x38, 0x6E, 0x7C, 0xD5, 0xDD, 0x9B, 0x77, + 0xA0, 0x35, 0xE0, 0x9F, 0xE6, 0xFE, 0xE2, 0xC8, + 0xCE, 0x61, 0xB5, 0x38, 0x3C, 0x87, 0xEA, 0x43, + 0x20, 0x50, 0x59, 0xC5, 0xE4, 0xCD, 0x4F, 0x44, + 0x08, 0x31, 0x9B, 0xB0, 0xA8, 0x23, 0x60, 0xF6, + 0xA5, 0x8E, 0x6C, 0x9C, 0xE3, 0xF4, 0x87, 0xC4, + 0x46, 0x06, 0x3B, 0xF8, 0x13, 0xBC, 0x6B, 0xA5, + 0x35, 0xE1, 0x7F, 0xC1, 0x82, 0x6C, 0xFC, 0x91 + }, + { + 0x1F, 0x14, 0x59, 0xCB, 0x6B, 0x61, 0xCB, 0xAC, + 0x5F, 0x0E, 0xFE, 0x8F, 0xC4, 0x87, 0x53, 0x8F, + 0x42, 0x54, 0x89, 0x87, 0xFC, 0xD5, 0x62, 0x21, + 0xCF, 0xA7, 0xBE, 0xB2, 0x25, 0x04, 0x76, 0x9E, + 0x79, 0x2C, 0x45, 0xAD, 0xFB, 0x1D, 0x6B, 0x3D, + 0x60, 0xD7, 0xB7, 0x49, 0xC8, 0xA7, 0x5B, 0x0B, + 0xDF, 0x14, 0xE8, 0xEA, 0x72, 0x1B, 0x95, 0xDC, + 0xA5, 0x38, 0xCA, 0x6E, 0x25, 0x71, 0x12, 0x09 + }, + { + 0xE5, 0x8B, 0x38, 0x36, 0xB7, 0xD8, 0xFE, 0xDB, + 0xB5, 0x0C, 0xA5, 0x72, 0x5C, 0x65, 0x71, 0xE7, + 0x4C, 0x07, 0x85, 0xE9, 0x78, 0x21, 0xDA, 0xB8, + 0xB6, 0x29, 0x8C, 0x10, 0xE4, 0xC0, 0x79, 0xD4, + 0xA6, 0xCD, 0xF2, 0x2F, 0x0F, 0xED, 0xB5, 0x50, + 0x32, 0x92, 0x5C, 0x16, 0x74, 0x81, 0x15, 0xF0, + 0x1A, 0x10, 0x5E, 0x77, 0xE0, 0x0C, 0xEE, 0x3D, + 0x07, 0x92, 0x4D, 0xC0, 0xD8, 0xF9, 0x06, 0x59 + }, + { + 0xB9, 0x29, 0xCC, 0x65, 0x05, 0xF0, 0x20, 0x15, + 0x86, 0x72, 0xDE, 0xDA, 0x56, 0xD0, 0xDB, 0x08, + 0x1A, 0x2E, 0xE3, 0x4C, 0x00, 0xC1, 0x10, 0x00, + 0x29, 0xBD, 0xF8, 0xEA, 0x98, 0x03, 0x4F, 0xA4, + 0xBF, 0x3E, 0x86, 0x55, 0xEC, 0x69, 0x7F, 0xE3, + 0x6F, 0x40, 0x55, 0x3C, 0x5B, 0xB4, 0x68, 0x01, + 0x64, 0x4A, 0x62, 0x7D, 0x33, 0x42, 0xF4, 0xFC, + 0x92, 0xB6, 0x1F, 0x03, 0x29, 0x0F, 0xB3, 0x81 + }, + { + 0x72, 0xD3, 0x53, 0x99, 0x4B, 0x49, 0xD3, 0xE0, + 0x31, 0x53, 0x92, 0x9A, 0x1E, 0x4D, 0x4F, 0x18, + 0x8E, 0xE5, 0x8A, 0xB9, 0xE7, 0x2E, 0xE8, 0xE5, + 0x12, 0xF2, 0x9B, 0xC7, 0x73, 0x91, 0x38, 0x19, + 0xCE, 0x05, 0x7D, 0xDD, 0x70, 0x02, 0xC0, 0x43, + 0x3E, 0xE0, 0xA1, 0x61, 0x14, 0xE3, 0xD1, 0x56, + 0xDD, 0x2C, 0x4A, 0x7E, 0x80, 0xEE, 0x53, 0x37, + 0x8B, 0x86, 0x70, 0xF2, 0x3E, 0x33, 0xEF, 0x56 + }, + { + 0xC7, 0x0E, 0xF9, 0xBF, 0xD7, 0x75, 0xD4, 0x08, + 0x17, 0x67, 0x37, 0xA0, 0x73, 0x6D, 0x68, 0x51, + 0x7C, 0xE1, 0xAA, 0xAD, 0x7E, 0x81, 0xA9, 0x3C, + 0x8C, 0x1E, 0xD9, 0x67, 0xEA, 0x21, 0x4F, 0x56, + 0xC8, 0xA3, 0x77, 0xB1, 0x76, 0x3E, 0x67, 0x66, + 0x15, 0xB6, 0x0F, 0x39, 0x88, 0x24, 0x1E, 0xAE, + 0x6E, 0xAB, 0x96, 0x85, 0xA5, 0x12, 0x49, 0x29, + 0xD2, 0x81, 0x88, 0xF2, 0x9E, 0xAB, 0x06, 0xF7 + }, + { + 0xC2, 0x30, 0xF0, 0x80, 0x26, 0x79, 0xCB, 0x33, + 0x82, 0x2E, 0xF8, 0xB3, 0xB2, 0x1B, 0xF7, 0xA9, + 0xA2, 0x89, 0x42, 0x09, 0x29, 0x01, 0xD7, 0xDA, + 0xC3, 0x76, 0x03, 0x00, 0x83, 0x10, 0x26, 0xCF, + 0x35, 0x4C, 0x92, 0x32, 0xDF, 0x3E, 0x08, 0x4D, + 0x99, 0x03, 0x13, 0x0C, 0x60, 0x1F, 0x63, 0xC1, + 0xF4, 0xA4, 0xA4, 0xB8, 0x10, 0x6E, 0x46, 0x8C, + 0xD4, 0x43, 0xBB, 0xE5, 0xA7, 0x34, 0xF4, 0x5F + }, + { + 0x6F, 0x43, 0x09, 0x4C, 0xAF, 0xB5, 0xEB, 0xF1, + 0xF7, 0xA4, 0x93, 0x7E, 0xC5, 0x0F, 0x56, 0xA4, + 0xC9, 0xDA, 0x30, 0x3C, 0xBB, 0x55, 0xAC, 0x1F, + 0x27, 0xF1, 0xF1, 0x97, 0x6C, 0xD9, 0x6B, 0xED, + 0xA9, 0x46, 0x4F, 0x0E, 0x7B, 0x9C, 0x54, 0x62, + 0x0B, 0x8A, 0x9F, 0xBA, 0x98, 0x31, 0x64, 0xB8, + 0xBE, 0x35, 0x78, 0x42, 0x5A, 0x02, 0x4F, 0x5F, + 0xE1, 0x99, 0xC3, 0x63, 0x56, 0xB8, 0x89, 0x72 + }, + { + 0x37, 0x45, 0x27, 0x3F, 0x4C, 0x38, 0x22, 0x5D, + 0xB2, 0x33, 0x73, 0x81, 0x87, 0x1A, 0x0C, 0x6A, + 0xAF, 0xD3, 0xAF, 0x9B, 0x01, 0x8C, 0x88, 0xAA, + 0x02, 0x02, 0x58, 0x50, 0xA5, 0xDC, 0x3A, 0x42, + 0xA1, 0xA3, 0xE0, 0x3E, 0x56, 0xCB, 0xF1, 0xB0, + 0x87, 0x6D, 0x63, 0xA4, 0x41, 0xF1, 0xD2, 0x85, + 0x6A, 0x39, 0xB8, 0x80, 0x1E, 0xB5, 0xAF, 0x32, + 0x52, 0x01, 0xC4, 0x15, 0xD6, 0x5E, 0x97, 0xFE + }, + { + 0xC5, 0x0C, 0x44, 0xCC, 0xA3, 0xEC, 0x3E, 0xDA, + 0xAE, 0x77, 0x9A, 0x7E, 0x17, 0x94, 0x50, 0xEB, + 0xDD, 0xA2, 0xF9, 0x70, 0x67, 0xC6, 0x90, 0xAA, + 0x6C, 0x5A, 0x4A, 0xC7, 0xC3, 0x01, 0x39, 0xBB, + 0x27, 0xC0, 0xDF, 0x4D, 0xB3, 0x22, 0x0E, 0x63, + 0xCB, 0x11, 0x0D, 0x64, 0xF3, 0x7F, 0xFE, 0x07, + 0x8D, 0xB7, 0x26, 0x53, 0xE2, 0xDA, 0xAC, 0xF9, + 0x3A, 0xE3, 0xF0, 0xA2, 0xD1, 0xA7, 0xEB, 0x2E + }, + { + 0x8A, 0xEF, 0x26, 0x3E, 0x38, 0x5C, 0xBC, 0x61, + 0xE1, 0x9B, 0x28, 0x91, 0x42, 0x43, 0x26, 0x2A, + 0xF5, 0xAF, 0xE8, 0x72, 0x6A, 0xF3, 0xCE, 0x39, + 0xA7, 0x9C, 0x27, 0x02, 0x8C, 0xF3, 0xEC, 0xD3, + 0xF8, 0xD2, 0xDF, 0xD9, 0xCF, 0xC9, 0xAD, 0x91, + 0xB5, 0x8F, 0x6F, 0x20, 0x77, 0x8F, 0xD5, 0xF0, + 0x28, 0x94, 0xA3, 0xD9, 0x1C, 0x7D, 0x57, 0xD1, + 0xE4, 0xB8, 0x66, 0xA7, 0xF3, 0x64, 0xB6, 0xBE + }, + { + 0x28, 0x69, 0x61, 0x41, 0xDE, 0x6E, 0x2D, 0x9B, + 0xCB, 0x32, 0x35, 0x57, 0x8A, 0x66, 0x16, 0x6C, + 0x14, 0x48, 0xD3, 0xE9, 0x05, 0xA1, 0xB4, 0x82, + 0xD4, 0x23, 0xBE, 0x4B, 0xC5, 0x36, 0x9B, 0xC8, + 0xC7, 0x4D, 0xAE, 0x0A, 0xCC, 0x9C, 0xC1, 0x23, + 0xE1, 0xD8, 0xDD, 0xCE, 0x9F, 0x97, 0x91, 0x7E, + 0x8C, 0x01, 0x9C, 0x55, 0x2D, 0xA3, 0x2D, 0x39, + 0xD2, 0x21, 0x9B, 0x9A, 0xBF, 0x0F, 0xA8, 0xC8 + }, + { + 0x2F, 0xB9, 0xEB, 0x20, 0x85, 0x83, 0x01, 0x81, + 0x90, 0x3A, 0x9D, 0xAF, 0xE3, 0xDB, 0x42, 0x8E, + 0xE1, 0x5B, 0xE7, 0x66, 0x22, 0x24, 0xEF, 0xD6, + 0x43, 0x37, 0x1F, 0xB2, 0x56, 0x46, 0xAE, 0xE7, + 0x16, 0xE5, 0x31, 0xEC, 0xA6, 0x9B, 0x2B, 0xDC, + 0x82, 0x33, 0xF1, 0xA8, 0x08, 0x1F, 0xA4, 0x3D, + 0xA1, 0x50, 0x03, 0x02, 0x97, 0x5A, 0x77, 0xF4, + 0x2F, 0xA5, 0x92, 0x13, 0x67, 0x10, 0xE9, 0xDC + }, + { + 0x66, 0xF9, 0xA7, 0x14, 0x3F, 0x7A, 0x33, 0x14, + 0xA6, 0x69, 0xBF, 0x2E, 0x24, 0xBB, 0xB3, 0x50, + 0x14, 0x26, 0x1D, 0x63, 0x9F, 0x49, 0x5B, 0x6C, + 0x9C, 0x1F, 0x10, 0x4F, 0xE8, 0xE3, 0x20, 0xAC, + 0xA6, 0x0D, 0x45, 0x50, 0xD6, 0x9D, 0x52, 0xED, + 0xBD, 0x5A, 0x3C, 0xDE, 0xB4, 0x01, 0x4A, 0xE6, + 0x5B, 0x1D, 0x87, 0xAA, 0x77, 0x0B, 0x69, 0xAE, + 0x5C, 0x15, 0xF4, 0x33, 0x0B, 0x0B, 0x0A, 0xD8 + }, + { + 0xF4, 0xC4, 0xDD, 0x1D, 0x59, 0x4C, 0x35, 0x65, + 0xE3, 0xE2, 0x5C, 0xA4, 0x3D, 0xAD, 0x82, 0xF6, + 0x2A, 0xBE, 0xA4, 0x83, 0x5E, 0xD4, 0xCD, 0x81, + 0x1B, 0xCD, 0x97, 0x5E, 0x46, 0x27, 0x98, 0x28, + 0xD4, 0x4D, 0x4C, 0x62, 0xC3, 0x67, 0x9F, 0x1B, + 0x7F, 0x7B, 0x9D, 0xD4, 0x57, 0x1D, 0x7B, 0x49, + 0x55, 0x73, 0x47, 0xB8, 0xC5, 0x46, 0x0C, 0xBD, + 0xC1, 0xBE, 0xF6, 0x90, 0xFB, 0x2A, 0x08, 0xC0 + }, + { + 0x8F, 0x1D, 0xC9, 0x64, 0x9C, 0x3A, 0x84, 0x55, + 0x1F, 0x8F, 0x6E, 0x91, 0xCA, 0xC6, 0x82, 0x42, + 0xA4, 0x3B, 0x1F, 0x8F, 0x32, 0x8E, 0xE9, 0x22, + 0x80, 0x25, 0x73, 0x87, 0xFA, 0x75, 0x59, 0xAA, + 0x6D, 0xB1, 0x2E, 0x4A, 0xEA, 0xDC, 0x2D, 0x26, + 0x09, 0x91, 0x78, 0x74, 0x9C, 0x68, 0x64, 0xB3, + 0x57, 0xF3, 0xF8, 0x3B, 0x2F, 0xB3, 0xEF, 0xA8, + 0xD2, 0xA8, 0xDB, 0x05, 0x6B, 0xED, 0x6B, 0xCC + }, + { + 0x31, 0x39, 0xC1, 0xA7, 0xF9, 0x7A, 0xFD, 0x16, + 0x75, 0xD4, 0x60, 0xEB, 0xBC, 0x07, 0xF2, 0x72, + 0x8A, 0xA1, 0x50, 0xDF, 0x84, 0x96, 0x24, 0x51, + 0x1E, 0xE0, 0x4B, 0x74, 0x3B, 0xA0, 0xA8, 0x33, + 0x09, 0x2F, 0x18, 0xC1, 0x2D, 0xC9, 0x1B, 0x4D, + 0xD2, 0x43, 0xF3, 0x33, 0x40, 0x2F, 0x59, 0xFE, + 0x28, 0xAB, 0xDB, 0xBB, 0xAE, 0x30, 0x1E, 0x7B, + 0x65, 0x9C, 0x7A, 0x26, 0xD5, 0xC0, 0xF9, 0x79 + }, + { + 0x06, 0xF9, 0x4A, 0x29, 0x96, 0x15, 0x8A, 0x81, + 0x9F, 0xE3, 0x4C, 0x40, 0xDE, 0x3C, 0xF0, 0x37, + 0x9F, 0xD9, 0xFB, 0x85, 0xB3, 0xE3, 0x63, 0xBA, + 0x39, 0x26, 0xA0, 0xE7, 0xD9, 0x60, 0xE3, 0xF4, + 0xC2, 0xE0, 0xC7, 0x0C, 0x7C, 0xE0, 0xCC, 0xB2, + 0xA6, 0x4F, 0xC2, 0x98, 0x69, 0xF6, 0xE7, 0xAB, + 0x12, 0xBD, 0x4D, 0x3F, 0x14, 0xFC, 0xE9, 0x43, + 0x27, 0x90, 0x27, 0xE7, 0x85, 0xFB, 0x5C, 0x29 + }, + { + 0xC2, 0x9C, 0x39, 0x9E, 0xF3, 0xEE, 0xE8, 0x96, + 0x1E, 0x87, 0x56, 0x5C, 0x1C, 0xE2, 0x63, 0x92, + 0x5F, 0xC3, 0xD0, 0xCE, 0x26, 0x7D, 0x13, 0xE4, + 0x8D, 0xD9, 0xE7, 0x32, 0xEE, 0x67, 0xB0, 0xF6, + 0x9F, 0xAD, 0x56, 0x40, 0x1B, 0x0F, 0x10, 0xFC, + 0xAA, 0xC1, 0x19, 0x20, 0x10, 0x46, 0xCC, 0xA2, + 0x8C, 0x5B, 0x14, 0xAB, 0xDE, 0xA3, 0x21, 0x2A, + 0xE6, 0x55, 0x62, 0xF7, 0xF1, 0x38, 0xDB, 0x3D + }, + { + 0x4C, 0xEC, 0x4C, 0x9D, 0xF5, 0x2E, 0xEF, 0x05, + 0xC3, 0xF6, 0xFA, 0xAA, 0x97, 0x91, 0xBC, 0x74, + 0x45, 0x93, 0x71, 0x83, 0x22, 0x4E, 0xCC, 0x37, + 0xA1, 0xE5, 0x8D, 0x01, 0x32, 0xD3, 0x56, 0x17, + 0x53, 0x1D, 0x7E, 0x79, 0x5F, 0x52, 0xAF, 0x7B, + 0x1E, 0xB9, 0xD1, 0x47, 0xDE, 0x12, 0x92, 0xD3, + 0x45, 0xFE, 0x34, 0x18, 0x23, 0xF8, 0xE6, 0xBC, + 0x1E, 0x5B, 0xAD, 0xCA, 0x5C, 0x65, 0x61, 0x08 + }, + { + 0x89, 0x8B, 0xFB, 0xAE, 0x93, 0xB3, 0xE1, 0x8D, + 0x00, 0x69, 0x7E, 0xAB, 0x7D, 0x97, 0x04, 0xFA, + 0x36, 0xEC, 0x33, 0x9D, 0x07, 0x61, 0x31, 0xCE, + 0xFD, 0xF3, 0x0E, 0xDB, 0xE8, 0xD9, 0xCC, 0x81, + 0xC3, 0xA8, 0x0B, 0x12, 0x96, 0x59, 0xB1, 0x63, + 0xA3, 0x23, 0xBA, 0xB9, 0x79, 0x3D, 0x4F, 0xEE, + 0xD9, 0x2D, 0x54, 0xDA, 0xE9, 0x66, 0xC7, 0x75, + 0x29, 0x76, 0x4A, 0x09, 0xBE, 0x88, 0xDB, 0x45 + }, + { + 0xEE, 0x9B, 0xD0, 0x46, 0x9D, 0x3A, 0xAF, 0x4F, + 0x14, 0x03, 0x5B, 0xE4, 0x8A, 0x2C, 0x3B, 0x84, + 0xD9, 0xB4, 0xB1, 0xFF, 0xF1, 0xD9, 0x45, 0xE1, + 0xF1, 0xC1, 0xD3, 0x89, 0x80, 0xA9, 0x51, 0xBE, + 0x19, 0x7B, 0x25, 0xFE, 0x22, 0xC7, 0x31, 0xF2, + 0x0A, 0xEA, 0xCC, 0x93, 0x0B, 0xA9, 0xC4, 0xA1, + 0xF4, 0x76, 0x22, 0x27, 0x61, 0x7A, 0xD3, 0x50, + 0xFD, 0xAB, 0xB4, 0xE8, 0x02, 0x73, 0xA0, 0xF4 + }, + { + 0x3D, 0x4D, 0x31, 0x13, 0x30, 0x05, 0x81, 0xCD, + 0x96, 0xAC, 0xBF, 0x09, 0x1C, 0x3D, 0x0F, 0x3C, + 0x31, 0x01, 0x38, 0xCD, 0x69, 0x79, 0xE6, 0x02, + 0x6C, 0xDE, 0x62, 0x3E, 0x2D, 0xD1, 0xB2, 0x4D, + 0x4A, 0x86, 0x38, 0xBE, 0xD1, 0x07, 0x33, 0x44, + 0x78, 0x3A, 0xD0, 0x64, 0x9C, 0xC6, 0x30, 0x5C, + 0xCE, 0xC0, 0x4B, 0xEB, 0x49, 0xF3, 0x1C, 0x63, + 0x30, 0x88, 0xA9, 0x9B, 0x65, 0x13, 0x02, 0x67 + }, + { + 0x95, 0xC0, 0x59, 0x1A, 0xD9, 0x1F, 0x92, 0x1A, + 0xC7, 0xBE, 0x6D, 0x9C, 0xE3, 0x7E, 0x06, 0x63, + 0xED, 0x80, 0x11, 0xC1, 0xCF, 0xD6, 0xD0, 0x16, + 0x2A, 0x55, 0x72, 0xE9, 0x43, 0x68, 0xBA, 0xC0, + 0x20, 0x24, 0x48, 0x5E, 0x6A, 0x39, 0x85, 0x4A, + 0xA4, 0x6F, 0xE3, 0x8E, 0x97, 0xD6, 0xC6, 0xB1, + 0x94, 0x7C, 0xD2, 0x72, 0xD8, 0x6B, 0x06, 0xBB, + 0x5B, 0x2F, 0x78, 0xB9, 0xB6, 0x8D, 0x55, 0x9D + }, + { + 0x22, 0x7B, 0x79, 0xDE, 0xD3, 0x68, 0x15, 0x3B, + 0xF4, 0x6C, 0x0A, 0x3C, 0xA9, 0x78, 0xBF, 0xDB, + 0xEF, 0x31, 0xF3, 0x02, 0x4A, 0x56, 0x65, 0x84, + 0x24, 0x68, 0x49, 0x0B, 0x0F, 0xF7, 0x48, 0xAE, + 0x04, 0xE7, 0x83, 0x2E, 0xD4, 0xC9, 0xF4, 0x9D, + 0xE9, 0xB1, 0x70, 0x67, 0x09, 0xD6, 0x23, 0xE5, + 0xC8, 0xC1, 0x5E, 0x3C, 0xAE, 0xCA, 0xE8, 0xD5, + 0xE4, 0x33, 0x43, 0x0F, 0xF7, 0x2F, 0x20, 0xEB + }, + { + 0x5D, 0x34, 0xF3, 0x95, 0x2F, 0x01, 0x05, 0xEE, + 0xF8, 0x8A, 0xE8, 0xB6, 0x4C, 0x6C, 0xE9, 0x5E, + 0xBF, 0xAD, 0xE0, 0xE0, 0x2C, 0x69, 0xB0, 0x87, + 0x62, 0xA8, 0x71, 0x2D, 0x2E, 0x49, 0x11, 0xAD, + 0x3F, 0x94, 0x1F, 0xC4, 0x03, 0x4D, 0xC9, 0xB2, + 0xE4, 0x79, 0xFD, 0xBC, 0xD2, 0x79, 0xB9, 0x02, + 0xFA, 0xF5, 0xD8, 0x38, 0xBB, 0x2E, 0x0C, 0x64, + 0x95, 0xD3, 0x72, 0xB5, 0xB7, 0x02, 0x98, 0x13 + }, + { + 0x7F, 0x93, 0x9B, 0xF8, 0x35, 0x3A, 0xBC, 0xE4, + 0x9E, 0x77, 0xF1, 0x4F, 0x37, 0x50, 0xAF, 0x20, + 0xB7, 0xB0, 0x39, 0x02, 0xE1, 0xA1, 0xE7, 0xFB, + 0x6A, 0xAF, 0x76, 0xD0, 0x25, 0x9C, 0xD4, 0x01, + 0xA8, 0x31, 0x90, 0xF1, 0x56, 0x40, 0xE7, 0x4F, + 0x3E, 0x6C, 0x5A, 0x90, 0xE8, 0x39, 0xC7, 0x82, + 0x1F, 0x64, 0x74, 0x75, 0x7F, 0x75, 0xC7, 0xBF, + 0x90, 0x02, 0x08, 0x4D, 0xDC, 0x7A, 0x62, 0xDC + }, + { + 0x06, 0x2B, 0x61, 0xA2, 0xF9, 0xA3, 0x3A, 0x71, + 0xD7, 0xD0, 0xA0, 0x61, 0x19, 0x64, 0x4C, 0x70, + 0xB0, 0x71, 0x6A, 0x50, 0x4D, 0xE7, 0xE5, 0xE1, + 0xBE, 0x49, 0xBD, 0x7B, 0x86, 0xE7, 0xED, 0x68, + 0x17, 0x71, 0x4F, 0x9F, 0x0F, 0xC3, 0x13, 0xD0, + 0x61, 0x29, 0x59, 0x7E, 0x9A, 0x22, 0x35, 0xEC, + 0x85, 0x21, 0xDE, 0x36, 0xF7, 0x29, 0x0A, 0x90, + 0xCC, 0xFC, 0x1F, 0xFA, 0x6D, 0x0A, 0xEE, 0x29 + }, + { + 0xF2, 0x9E, 0x01, 0xEE, 0xAE, 0x64, 0x31, 0x1E, + 0xB7, 0xF1, 0xC6, 0x42, 0x2F, 0x94, 0x6B, 0xF7, + 0xBE, 0xA3, 0x63, 0x79, 0x52, 0x3E, 0x7B, 0x2B, + 0xBA, 0xBA, 0x7D, 0x1D, 0x34, 0xA2, 0x2D, 0x5E, + 0xA5, 0xF1, 0xC5, 0xA0, 0x9D, 0x5C, 0xE1, 0xFE, + 0x68, 0x2C, 0xCE, 0xD9, 0xA4, 0x79, 0x8D, 0x1A, + 0x05, 0xB4, 0x6C, 0xD7, 0x2D, 0xFF, 0x5C, 0x1B, + 0x35, 0x54, 0x40, 0xB2, 0xA2, 0xD4, 0x76, 0xBC + }, + { + 0xEC, 0x38, 0xCD, 0x3B, 0xBA, 0xB3, 0xEF, 0x35, + 0xD7, 0xCB, 0x6D, 0x5C, 0x91, 0x42, 0x98, 0x35, + 0x1D, 0x8A, 0x9D, 0xC9, 0x7F, 0xCE, 0xE0, 0x51, + 0xA8, 0xA0, 0x2F, 0x58, 0xE3, 0xED, 0x61, 0x84, + 0xD0, 0xB7, 0x81, 0x0A, 0x56, 0x15, 0x41, 0x1A, + 0xB1, 0xB9, 0x52, 0x09, 0xC3, 0xC8, 0x10, 0x11, + 0x4F, 0xDE, 0xB2, 0x24, 0x52, 0x08, 0x4E, 0x77, + 0xF3, 0xF8, 0x47, 0xC6, 0xDB, 0xAA, 0xFE, 0x16 + }, + { + 0xC2, 0xAE, 0xF5, 0xE0, 0xCA, 0x43, 0xE8, 0x26, + 0x41, 0x56, 0x5B, 0x8C, 0xB9, 0x43, 0xAA, 0x8B, + 0xA5, 0x35, 0x50, 0xCA, 0xEF, 0x79, 0x3B, 0x65, + 0x32, 0xFA, 0xFA, 0xD9, 0x4B, 0x81, 0x60, 0x82, + 0xF0, 0x11, 0x3A, 0x3E, 0xA2, 0xF6, 0x36, 0x08, + 0xAB, 0x40, 0x43, 0x7E, 0xCC, 0x0F, 0x02, 0x29, + 0xCB, 0x8F, 0xA2, 0x24, 0xDC, 0xF1, 0xC4, 0x78, + 0xA6, 0x7D, 0x9B, 0x64, 0x16, 0x2B, 0x92, 0xD1 + }, + { + 0x15, 0xF5, 0x34, 0xEF, 0xFF, 0x71, 0x05, 0xCD, + 0x1C, 0x25, 0x4D, 0x07, 0x4E, 0x27, 0xD5, 0x89, + 0x8B, 0x89, 0x31, 0x3B, 0x7D, 0x36, 0x6D, 0xC2, + 0xD7, 0xD8, 0x71, 0x13, 0xFA, 0x7D, 0x53, 0xAA, + 0xE1, 0x3F, 0x6D, 0xBA, 0x48, 0x7A, 0xD8, 0x10, + 0x3D, 0x5E, 0x85, 0x4C, 0x91, 0xFD, 0xB6, 0xE1, + 0xE7, 0x4B, 0x2E, 0xF6, 0xD1, 0x43, 0x17, 0x69, + 0xC3, 0x07, 0x67, 0xDD, 0xE0, 0x67, 0xA3, 0x5C + }, + { + 0x89, 0xAC, 0xBC, 0xA0, 0xB1, 0x69, 0x89, 0x7A, + 0x0A, 0x27, 0x14, 0xC2, 0xDF, 0x8C, 0x95, 0xB5, + 0xB7, 0x9C, 0xB6, 0x93, 0x90, 0x14, 0x2B, 0x7D, + 0x60, 0x18, 0xBB, 0x3E, 0x30, 0x76, 0xB0, 0x99, + 0xB7, 0x9A, 0x96, 0x41, 0x52, 0xA9, 0xD9, 0x12, + 0xB1, 0xB8, 0x64, 0x12, 0xB7, 0xE3, 0x72, 0xE9, + 0xCE, 0xCA, 0xD7, 0xF2, 0x5D, 0x4C, 0xBA, 0xB8, + 0xA3, 0x17, 0xBE, 0x36, 0x49, 0x2A, 0x67, 0xD7 + }, + { + 0xE3, 0xC0, 0x73, 0x91, 0x90, 0xED, 0x84, 0x9C, + 0x9C, 0x96, 0x2F, 0xD9, 0xDB, 0xB5, 0x5E, 0x20, + 0x7E, 0x62, 0x4F, 0xCA, 0xC1, 0xEB, 0x41, 0x76, + 0x91, 0x51, 0x54, 0x99, 0xEE, 0xA8, 0xD8, 0x26, + 0x7B, 0x7E, 0x8F, 0x12, 0x87, 0xA6, 0x36, 0x33, + 0xAF, 0x50, 0x11, 0xFD, 0xE8, 0xC4, 0xDD, 0xF5, + 0x5B, 0xFD, 0xF7, 0x22, 0xED, 0xF8, 0x88, 0x31, + 0x41, 0x4F, 0x2C, 0xFA, 0xED, 0x59, 0xCB, 0x9A + }, + { + 0x8D, 0x6C, 0xF8, 0x7C, 0x08, 0x38, 0x0D, 0x2D, + 0x15, 0x06, 0xEE, 0xE4, 0x6F, 0xD4, 0x22, 0x2D, + 0x21, 0xD8, 0xC0, 0x4E, 0x58, 0x5F, 0xBF, 0xD0, + 0x82, 0x69, 0xC9, 0x8F, 0x70, 0x28, 0x33, 0xA1, + 0x56, 0x32, 0x6A, 0x07, 0x24, 0x65, 0x64, 0x00, + 0xEE, 0x09, 0x35, 0x1D, 0x57, 0xB4, 0x40, 0x17, + 0x5E, 0x2A, 0x5D, 0xE9, 0x3C, 0xC5, 0xF8, 0x0D, + 0xB6, 0xDA, 0xF8, 0x35, 0x76, 0xCF, 0x75, 0xFA + }, + { + 0xDA, 0x24, 0xBE, 0xDE, 0x38, 0x36, 0x66, 0xD5, + 0x63, 0xEE, 0xED, 0x37, 0xF6, 0x31, 0x9B, 0xAF, + 0x20, 0xD5, 0xC7, 0x5D, 0x16, 0x35, 0xA6, 0xBA, + 0x5E, 0xF4, 0xCF, 0xA1, 0xAC, 0x95, 0x48, 0x7E, + 0x96, 0xF8, 0xC0, 0x8A, 0xF6, 0x00, 0xAA, 0xB8, + 0x7C, 0x98, 0x6E, 0xBA, 0xD4, 0x9F, 0xC7, 0x0A, + 0x58, 0xB4, 0x89, 0x0B, 0x9C, 0x87, 0x6E, 0x09, + 0x10, 0x16, 0xDA, 0xF4, 0x9E, 0x1D, 0x32, 0x2E + }, + { + 0xF9, 0xD1, 0xD1, 0xB1, 0xE8, 0x7E, 0xA7, 0xAE, + 0x75, 0x3A, 0x02, 0x97, 0x50, 0xCC, 0x1C, 0xF3, + 0xD0, 0x15, 0x7D, 0x41, 0x80, 0x5E, 0x24, 0x5C, + 0x56, 0x17, 0xBB, 0x93, 0x4E, 0x73, 0x2F, 0x0A, + 0xE3, 0x18, 0x0B, 0x78, 0xE0, 0x5B, 0xFE, 0x76, + 0xC7, 0xC3, 0x05, 0x1E, 0x3E, 0x3A, 0xC7, 0x8B, + 0x9B, 0x50, 0xC0, 0x51, 0x42, 0x65, 0x7E, 0x1E, + 0x03, 0x21, 0x5D, 0x6E, 0xC7, 0xBF, 0xD0, 0xFC + }, + { + 0x11, 0xB7, 0xBC, 0x16, 0x68, 0x03, 0x20, 0x48, + 0xAA, 0x43, 0x34, 0x3D, 0xE4, 0x76, 0x39, 0x5E, + 0x81, 0x4B, 0xBB, 0xC2, 0x23, 0x67, 0x8D, 0xB9, + 0x51, 0xA1, 0xB0, 0x3A, 0x02, 0x1E, 0xFA, 0xC9, + 0x48, 0xCF, 0xBE, 0x21, 0x5F, 0x97, 0xFE, 0x9A, + 0x72, 0xA2, 0xF6, 0xBC, 0x03, 0x9E, 0x39, 0x56, + 0xBF, 0xA4, 0x17, 0xC1, 0xA9, 0xF1, 0x0D, 0x6D, + 0x7B, 0xA5, 0xD3, 0xD3, 0x2F, 0xF3, 0x23, 0xE5 + }, + { + 0xB8, 0xD9, 0x00, 0x0E, 0x4F, 0xC2, 0xB0, 0x66, + 0xED, 0xB9, 0x1A, 0xFE, 0xE8, 0xE7, 0xEB, 0x0F, + 0x24, 0xE3, 0xA2, 0x01, 0xDB, 0x8B, 0x67, 0x93, + 0xC0, 0x60, 0x85, 0x81, 0xE6, 0x28, 0xED, 0x0B, + 0xCC, 0x4E, 0x5A, 0xA6, 0x78, 0x79, 0x92, 0xA4, + 0xBC, 0xC4, 0x4E, 0x28, 0x80, 0x93, 0xE6, 0x3E, + 0xE8, 0x3A, 0xBD, 0x0B, 0xC3, 0xEC, 0x6D, 0x09, + 0x34, 0xA6, 0x74, 0xA4, 0xDA, 0x13, 0x83, 0x8A + }, + { + 0xCE, 0x32, 0x5E, 0x29, 0x4F, 0x9B, 0x67, 0x19, + 0xD6, 0xB6, 0x12, 0x78, 0x27, 0x6A, 0xE0, 0x6A, + 0x25, 0x64, 0xC0, 0x3B, 0xB0, 0xB7, 0x83, 0xFA, + 0xFE, 0x78, 0x5B, 0xDF, 0x89, 0xC7, 0xD5, 0xAC, + 0xD8, 0x3E, 0x78, 0x75, 0x6D, 0x30, 0x1B, 0x44, + 0x56, 0x99, 0x02, 0x4E, 0xAE, 0xB7, 0x7B, 0x54, + 0xD4, 0x77, 0x33, 0x6E, 0xC2, 0xA4, 0xF3, 0x32, + 0xF2, 0xB3, 0xF8, 0x87, 0x65, 0xDD, 0xB0, 0xC3 + }, + { + 0x29, 0xAC, 0xC3, 0x0E, 0x96, 0x03, 0xAE, 0x2F, + 0xCC, 0xF9, 0x0B, 0xF9, 0x7E, 0x6C, 0xC4, 0x63, + 0xEB, 0xE2, 0x8C, 0x1B, 0x2F, 0x9B, 0x4B, 0x76, + 0x5E, 0x70, 0x53, 0x7C, 0x25, 0xC7, 0x02, 0xA2, + 0x9D, 0xCB, 0xFB, 0xF1, 0x4C, 0x99, 0xC5, 0x43, + 0x45, 0xBA, 0x2B, 0x51, 0xF1, 0x7B, 0x77, 0xB5, + 0xF1, 0x5D, 0xB9, 0x2B, 0xBA, 0xD8, 0xFA, 0x95, + 0xC4, 0x71, 0xF5, 0xD0, 0x70, 0xA1, 0x37, 0xCC + }, + { + 0x33, 0x79, 0xCB, 0xAA, 0xE5, 0x62, 0xA8, 0x7B, + 0x4C, 0x04, 0x25, 0x55, 0x0F, 0xFD, 0xD6, 0xBF, + 0xE1, 0x20, 0x3F, 0x0D, 0x66, 0x6C, 0xC7, 0xEA, + 0x09, 0x5B, 0xE4, 0x07, 0xA5, 0xDF, 0xE6, 0x1E, + 0xE9, 0x14, 0x41, 0xCD, 0x51, 0x54, 0xB3, 0xE5, + 0x3B, 0x4F, 0x5F, 0xB3, 0x1A, 0xD4, 0xC7, 0xA9, + 0xAD, 0x5C, 0x7A, 0xF4, 0xAE, 0x67, 0x9A, 0xA5, + 0x1A, 0x54, 0x00, 0x3A, 0x54, 0xCA, 0x6B, 0x2D + }, + { + 0x30, 0x95, 0xA3, 0x49, 0xD2, 0x45, 0x70, 0x8C, + 0x7C, 0xF5, 0x50, 0x11, 0x87, 0x03, 0xD7, 0x30, + 0x2C, 0x27, 0xB6, 0x0A, 0xF5, 0xD4, 0xE6, 0x7F, + 0xC9, 0x78, 0xF8, 0xA4, 0xE6, 0x09, 0x53, 0xC7, + 0xA0, 0x4F, 0x92, 0xFC, 0xF4, 0x1A, 0xEE, 0x64, + 0x32, 0x1C, 0xCB, 0x70, 0x7A, 0x89, 0x58, 0x51, + 0x55, 0x2B, 0x1E, 0x37, 0xB0, 0x0B, 0xC5, 0xE6, + 0xB7, 0x2F, 0xA5, 0xBC, 0xEF, 0x9E, 0x3F, 0xFF + }, + { + 0x07, 0x26, 0x2D, 0x73, 0x8B, 0x09, 0x32, 0x1F, + 0x4D, 0xBC, 0xCE, 0xC4, 0xBB, 0x26, 0xF4, 0x8C, + 0xB0, 0xF0, 0xED, 0x24, 0x6C, 0xE0, 0xB3, 0x1B, + 0x9A, 0x6E, 0x7B, 0xC6, 0x83, 0x04, 0x9F, 0x1F, + 0x3E, 0x55, 0x45, 0xF2, 0x8C, 0xE9, 0x32, 0xDD, + 0x98, 0x5C, 0x5A, 0xB0, 0xF4, 0x3B, 0xD6, 0xDE, + 0x07, 0x70, 0x56, 0x0A, 0xF3, 0x29, 0x06, 0x5E, + 0xD2, 0xE4, 0x9D, 0x34, 0x62, 0x4C, 0x2C, 0xBB + }, + { + 0xB6, 0x40, 0x5E, 0xCA, 0x8E, 0xE3, 0x31, 0x6C, + 0x87, 0x06, 0x1C, 0xC6, 0xEC, 0x18, 0xDB, 0xA5, + 0x3E, 0x6C, 0x25, 0x0C, 0x63, 0xBA, 0x1F, 0x3B, + 0xAE, 0x9E, 0x55, 0xDD, 0x34, 0x98, 0x03, 0x6A, + 0xF0, 0x8C, 0xD2, 0x72, 0xAA, 0x24, 0xD7, 0x13, + 0xC6, 0x02, 0x0D, 0x77, 0xAB, 0x2F, 0x39, 0x19, + 0xAF, 0x1A, 0x32, 0xF3, 0x07, 0x42, 0x06, 0x18, + 0xAB, 0x97, 0xE7, 0x39, 0x53, 0x99, 0x4F, 0xB4 + }, + { + 0x7E, 0xE6, 0x82, 0xF6, 0x31, 0x48, 0xEE, 0x45, + 0xF6, 0xE5, 0x31, 0x5D, 0xA8, 0x1E, 0x5C, 0x6E, + 0x55, 0x7C, 0x2C, 0x34, 0x64, 0x1F, 0xC5, 0x09, + 0xC7, 0xA5, 0x70, 0x10, 0x88, 0xC3, 0x8A, 0x74, + 0x75, 0x61, 0x68, 0xE2, 0xCD, 0x8D, 0x35, 0x1E, + 0x88, 0xFD, 0x1A, 0x45, 0x1F, 0x36, 0x0A, 0x01, + 0xF5, 0xB2, 0x58, 0x0F, 0x9B, 0x5A, 0x2E, 0x8C, + 0xFC, 0x13, 0x8F, 0x3D, 0xD5, 0x9A, 0x3F, 0xFC + }, + { + 0x1D, 0x26, 0x3C, 0x17, 0x9D, 0x6B, 0x26, 0x8F, + 0x6F, 0xA0, 0x16, 0xF3, 0xA4, 0xF2, 0x9E, 0x94, + 0x38, 0x91, 0x12, 0x5E, 0xD8, 0x59, 0x3C, 0x81, + 0x25, 0x60, 0x59, 0xF5, 0xA7, 0xB4, 0x4A, 0xF2, + 0xDC, 0xB2, 0x03, 0x0D, 0x17, 0x5C, 0x00, 0xE6, + 0x2E, 0xCA, 0xF7, 0xEE, 0x96, 0x68, 0x2A, 0xA0, + 0x7A, 0xB2, 0x0A, 0x61, 0x10, 0x24, 0xA2, 0x85, + 0x32, 0xB1, 0xC2, 0x5B, 0x86, 0x65, 0x79, 0x02 + }, + { + 0x10, 0x6D, 0x13, 0x2C, 0xBD, 0xB4, 0xCD, 0x25, + 0x97, 0x81, 0x28, 0x46, 0xE2, 0xBC, 0x1B, 0xF7, + 0x32, 0xFE, 0xC5, 0xF0, 0xA5, 0xF6, 0x5D, 0xBB, + 0x39, 0xEC, 0x4E, 0x6D, 0xC6, 0x4A, 0xB2, 0xCE, + 0x6D, 0x24, 0x63, 0x0D, 0x0F, 0x15, 0xA8, 0x05, + 0xC3, 0x54, 0x00, 0x25, 0xD8, 0x4A, 0xFA, 0x98, + 0xE3, 0x67, 0x03, 0xC3, 0xDB, 0xEE, 0x71, 0x3E, + 0x72, 0xDD, 0xE8, 0x46, 0x5B, 0xC1, 0xBE, 0x7E + }, + { + 0x0E, 0x79, 0x96, 0x82, 0x26, 0x65, 0x06, 0x67, + 0xA8, 0xD8, 0x62, 0xEA, 0x8D, 0xA4, 0x89, 0x1A, + 0xF5, 0x6A, 0x4E, 0x3A, 0x8B, 0x6D, 0x17, 0x50, + 0xE3, 0x94, 0xF0, 0xDE, 0xA7, 0x6D, 0x64, 0x0D, + 0x85, 0x07, 0x7B, 0xCE, 0xC2, 0xCC, 0x86, 0x88, + 0x6E, 0x50, 0x67, 0x51, 0xB4, 0xF6, 0xA5, 0x83, + 0x8F, 0x7F, 0x0B, 0x5F, 0xEF, 0x76, 0x5D, 0x9D, + 0xC9, 0x0D, 0xCD, 0xCB, 0xAF, 0x07, 0x9F, 0x08 + }, + { + 0x52, 0x11, 0x56, 0xA8, 0x2A, 0xB0, 0xC4, 0xE5, + 0x66, 0xE5, 0x84, 0x4D, 0x5E, 0x31, 0xAD, 0x9A, + 0xAF, 0x14, 0x4B, 0xBD, 0x5A, 0x46, 0x4F, 0xDC, + 0xA3, 0x4D, 0xBD, 0x57, 0x17, 0xE8, 0xFF, 0x71, + 0x1D, 0x3F, 0xFE, 0xBB, 0xFA, 0x08, 0x5D, 0x67, + 0xFE, 0x99, 0x6A, 0x34, 0xF6, 0xD3, 0xE4, 0xE6, + 0x0B, 0x13, 0x96, 0xBF, 0x4B, 0x16, 0x10, 0xC2, + 0x63, 0xBD, 0xBB, 0x83, 0x4D, 0x56, 0x08, 0x16 + }, + { + 0x1A, 0xBA, 0x88, 0xBE, 0xFC, 0x55, 0xBC, 0x25, + 0xEF, 0xBC, 0xE0, 0x2D, 0xB8, 0xB9, 0x93, 0x3E, + 0x46, 0xF5, 0x76, 0x61, 0xBA, 0xEA, 0xBE, 0xB2, + 0x1C, 0xC2, 0x57, 0x4D, 0x2A, 0x51, 0x8A, 0x3C, + 0xBA, 0x5D, 0xC5, 0xA3, 0x8E, 0x49, 0x71, 0x34, + 0x40, 0xB2, 0x5F, 0x9C, 0x74, 0x4E, 0x75, 0xF6, + 0xB8, 0x5C, 0x9D, 0x8F, 0x46, 0x81, 0xF6, 0x76, + 0x16, 0x0F, 0x61, 0x05, 0x35, 0x7B, 0x84, 0x06 + }, + { + 0x5A, 0x99, 0x49, 0xFC, 0xB2, 0xC4, 0x73, 0xCD, + 0xA9, 0x68, 0xAC, 0x1B, 0x5D, 0x08, 0x56, 0x6D, + 0xC2, 0xD8, 0x16, 0xD9, 0x60, 0xF5, 0x7E, 0x63, + 0xB8, 0x98, 0xFA, 0x70, 0x1C, 0xF8, 0xEB, 0xD3, + 0xF5, 0x9B, 0x12, 0x4D, 0x95, 0xBF, 0xBB, 0xED, + 0xC5, 0xF1, 0xCF, 0x0E, 0x17, 0xD5, 0xEA, 0xED, + 0x0C, 0x02, 0xC5, 0x0B, 0x69, 0xD8, 0xA4, 0x02, + 0xCA, 0xBC, 0xCA, 0x44, 0x33, 0xB5, 0x1F, 0xD4 + }, + { + 0xB0, 0xCE, 0xAD, 0x09, 0x80, 0x7C, 0x67, 0x2A, + 0xF2, 0xEB, 0x2B, 0x0F, 0x06, 0xDD, 0xE4, 0x6C, + 0xF5, 0x37, 0x0E, 0x15, 0xA4, 0x09, 0x6B, 0x1A, + 0x7D, 0x7C, 0xBB, 0x36, 0xEC, 0x31, 0xC2, 0x05, + 0xFB, 0xEF, 0xCA, 0x00, 0xB7, 0xA4, 0x16, 0x2F, + 0xA8, 0x9F, 0xB4, 0xFB, 0x3E, 0xB7, 0x8D, 0x79, + 0x77, 0x0C, 0x23, 0xF4, 0x4E, 0x72, 0x06, 0x66, + 0x4C, 0xE3, 0xCD, 0x93, 0x1C, 0x29, 0x1E, 0x5D + }, + { + 0xBB, 0x66, 0x64, 0x93, 0x1E, 0xC9, 0x70, 0x44, + 0xE4, 0x5B, 0x2A, 0xE4, 0x20, 0xAE, 0x1C, 0x55, + 0x1A, 0x88, 0x74, 0xBC, 0x93, 0x7D, 0x08, 0xE9, + 0x69, 0x39, 0x9C, 0x39, 0x64, 0xEB, 0xDB, 0xA8, + 0x34, 0x6C, 0xDD, 0x5D, 0x09, 0xCA, 0xAF, 0xE4, + 0xC2, 0x8B, 0xA7, 0xEC, 0x78, 0x81, 0x91, 0xCE, + 0xCA, 0x65, 0xDD, 0xD6, 0xF9, 0x5F, 0x18, 0x58, + 0x3E, 0x04, 0x0D, 0x0F, 0x30, 0xD0, 0x36, 0x4D + }, + { + 0x65, 0xBC, 0x77, 0x0A, 0x5F, 0xAA, 0x37, 0x92, + 0x36, 0x98, 0x03, 0x68, 0x3E, 0x84, 0x4B, 0x0B, + 0xE7, 0xEE, 0x96, 0xF2, 0x9F, 0x6D, 0x6A, 0x35, + 0x56, 0x80, 0x06, 0xBD, 0x55, 0x90, 0xF9, 0xA4, + 0xEF, 0x63, 0x9B, 0x7A, 0x80, 0x61, 0xC7, 0xB0, + 0x42, 0x4B, 0x66, 0xB6, 0x0A, 0xC3, 0x4A, 0xF3, + 0x11, 0x99, 0x05, 0xF3, 0x3A, 0x9D, 0x8C, 0x3A, + 0xE1, 0x83, 0x82, 0xCA, 0x9B, 0x68, 0x99, 0x00 + }, + { + 0xEA, 0x9B, 0x4D, 0xCA, 0x33, 0x33, 0x36, 0xAA, + 0xF8, 0x39, 0xA4, 0x5C, 0x6E, 0xAA, 0x48, 0xB8, + 0xCB, 0x4C, 0x7D, 0xDA, 0xBF, 0xFE, 0xA4, 0xF6, + 0x43, 0xD6, 0x35, 0x7E, 0xA6, 0x62, 0x8A, 0x48, + 0x0A, 0x5B, 0x45, 0xF2, 0xB0, 0x52, 0xC1, 0xB0, + 0x7D, 0x1F, 0xED, 0xCA, 0x91, 0x8B, 0x6F, 0x11, + 0x39, 0xD8, 0x0F, 0x74, 0xC2, 0x45, 0x10, 0xDC, + 0xBA, 0xA4, 0xBE, 0x70, 0xEA, 0xCC, 0x1B, 0x06 + }, + { + 0xE6, 0x34, 0x2F, 0xB4, 0xA7, 0x80, 0xAD, 0x97, + 0x5D, 0x0E, 0x24, 0xBC, 0xE1, 0x49, 0x98, 0x9B, + 0x91, 0xD3, 0x60, 0x55, 0x7E, 0x87, 0x99, 0x4F, + 0x6B, 0x45, 0x7B, 0x89, 0x55, 0x75, 0xCC, 0x02, + 0xD0, 0xC1, 0x5B, 0xAD, 0x3C, 0xE7, 0x57, 0x7F, + 0x4C, 0x63, 0x92, 0x7F, 0xF1, 0x3F, 0x3E, 0x38, + 0x1F, 0xF7, 0xE7, 0x2B, 0xDB, 0xE7, 0x45, 0x32, + 0x48, 0x44, 0xA9, 0xD2, 0x7E, 0x3F, 0x1C, 0x01 + }, + { + 0x3E, 0x20, 0x9C, 0x9B, 0x33, 0xE8, 0xE4, 0x61, + 0x17, 0x8A, 0xB4, 0x6B, 0x1C, 0x64, 0xB4, 0x9A, + 0x07, 0xFB, 0x74, 0x5F, 0x1C, 0x8B, 0xC9, 0x5F, + 0xBF, 0xB9, 0x4C, 0x6B, 0x87, 0xC6, 0x95, 0x16, + 0x65, 0x1B, 0x26, 0x4E, 0xF9, 0x80, 0x93, 0x7F, + 0xAD, 0x41, 0x23, 0x8B, 0x91, 0xDD, 0xC0, 0x11, + 0xA5, 0xDD, 0x77, 0x7C, 0x7E, 0xFD, 0x44, 0x94, + 0xB4, 0xB6, 0xEC, 0xD3, 0xA9, 0xC2, 0x2A, 0xC0 + }, + { + 0xFD, 0x6A, 0x3D, 0x5B, 0x18, 0x75, 0xD8, 0x04, + 0x86, 0xD6, 0xE6, 0x96, 0x94, 0xA5, 0x6D, 0xBB, + 0x04, 0xA9, 0x9A, 0x4D, 0x05, 0x1F, 0x15, 0xDB, + 0x26, 0x89, 0x77, 0x6B, 0xA1, 0xC4, 0x88, 0x2E, + 0x6D, 0x46, 0x2A, 0x60, 0x3B, 0x70, 0x15, 0xDC, + 0x9F, 0x4B, 0x74, 0x50, 0xF0, 0x53, 0x94, 0x30, + 0x3B, 0x86, 0x52, 0xCF, 0xB4, 0x04, 0xA2, 0x66, + 0x96, 0x2C, 0x41, 0xBA, 0xE6, 0xE1, 0x8A, 0x94 + }, + { + 0x95, 0x1E, 0x27, 0x51, 0x7E, 0x6B, 0xAD, 0x9E, + 0x41, 0x95, 0xFC, 0x86, 0x71, 0xDE, 0xE3, 0xE7, + 0xE9, 0xBE, 0x69, 0xCE, 0xE1, 0x42, 0x2C, 0xB9, + 0xFE, 0xCF, 0xCE, 0x0D, 0xBA, 0x87, 0x5F, 0x7B, + 0x31, 0x0B, 0x93, 0xEE, 0x3A, 0x3D, 0x55, 0x8F, + 0x94, 0x1F, 0x63, 0x5F, 0x66, 0x8F, 0xF8, 0x32, + 0xD2, 0xC1, 0xD0, 0x33, 0xC5, 0xE2, 0xF0, 0x99, + 0x7E, 0x4C, 0x66, 0xF1, 0x47, 0x34, 0x4E, 0x02 + }, + { + 0x8E, 0xBA, 0x2F, 0x87, 0x4F, 0x1A, 0xE8, 0x40, + 0x41, 0x90, 0x3C, 0x7C, 0x42, 0x53, 0xC8, 0x22, + 0x92, 0x53, 0x0F, 0xC8, 0x50, 0x95, 0x50, 0xBF, + 0xDC, 0x34, 0xC9, 0x5C, 0x7E, 0x28, 0x89, 0xD5, + 0x65, 0x0B, 0x0A, 0xD8, 0xCB, 0x98, 0x8E, 0x5C, + 0x48, 0x94, 0xCB, 0x87, 0xFB, 0xFB, 0xB1, 0x96, + 0x12, 0xEA, 0x93, 0xCC, 0xC4, 0xC5, 0xCA, 0xD1, + 0x71, 0x58, 0xB9, 0x76, 0x34, 0x64, 0xB4, 0x92 + }, + { + 0x16, 0xF7, 0x12, 0xEA, 0xA1, 0xB7, 0xC6, 0x35, + 0x47, 0x19, 0xA8, 0xE7, 0xDB, 0xDF, 0xAF, 0x55, + 0xE4, 0x06, 0x3A, 0x4D, 0x27, 0x7D, 0x94, 0x75, + 0x50, 0x01, 0x9B, 0x38, 0xDF, 0xB5, 0x64, 0x83, + 0x09, 0x11, 0x05, 0x7D, 0x50, 0x50, 0x61, 0x36, + 0xE2, 0x39, 0x4C, 0x3B, 0x28, 0x94, 0x5C, 0xC9, + 0x64, 0x96, 0x7D, 0x54, 0xE3, 0x00, 0x0C, 0x21, + 0x81, 0x62, 0x6C, 0xFB, 0x9B, 0x73, 0xEF, 0xD2 + }, + { + 0xC3, 0x96, 0x39, 0xE7, 0xD5, 0xC7, 0xFB, 0x8C, + 0xDD, 0x0F, 0xD3, 0xE6, 0xA5, 0x20, 0x96, 0x03, + 0x94, 0x37, 0x12, 0x2F, 0x21, 0xC7, 0x8F, 0x16, + 0x79, 0xCE, 0xA9, 0xD7, 0x8A, 0x73, 0x4C, 0x56, + 0xEC, 0xBE, 0xB2, 0x86, 0x54, 0xB4, 0xF1, 0x8E, + 0x34, 0x2C, 0x33, 0x1F, 0x6F, 0x72, 0x29, 0xEC, + 0x4B, 0x4B, 0xC2, 0x81, 0xB2, 0xD8, 0x0A, 0x6E, + 0xB5, 0x00, 0x43, 0xF3, 0x17, 0x96, 0xC8, 0x8C + }, + { + 0x72, 0xD0, 0x81, 0xAF, 0x99, 0xF8, 0xA1, 0x73, + 0xDC, 0xC9, 0xA0, 0xAC, 0x4E, 0xB3, 0x55, 0x74, + 0x05, 0x63, 0x9A, 0x29, 0x08, 0x4B, 0x54, 0xA4, + 0x01, 0x72, 0x91, 0x2A, 0x2F, 0x8A, 0x39, 0x51, + 0x29, 0xD5, 0x53, 0x6F, 0x09, 0x18, 0xE9, 0x02, + 0xF9, 0xE8, 0xFA, 0x60, 0x00, 0x99, 0x5F, 0x41, + 0x68, 0xDD, 0xC5, 0xF8, 0x93, 0x01, 0x1B, 0xE6, + 0xA0, 0xDB, 0xC9, 0xB8, 0xA1, 0xA3, 0xF5, 0xBB + }, + { + 0xC1, 0x1A, 0xA8, 0x1E, 0x5E, 0xFD, 0x24, 0xD5, + 0xFC, 0x27, 0xEE, 0x58, 0x6C, 0xFD, 0x88, 0x47, + 0xFB, 0xB0, 0xE2, 0x76, 0x01, 0xCC, 0xEC, 0xE5, + 0xEC, 0xCA, 0x01, 0x98, 0xE3, 0xC7, 0x76, 0x53, + 0x93, 0xBB, 0x74, 0x45, 0x7C, 0x7E, 0x7A, 0x27, + 0xEB, 0x91, 0x70, 0x35, 0x0E, 0x1F, 0xB5, 0x38, + 0x57, 0x17, 0x75, 0x06, 0xBE, 0x3E, 0x76, 0x2C, + 0xC0, 0xF1, 0x4D, 0x8C, 0x3A, 0xFE, 0x90, 0x77 + }, + { + 0xC2, 0x8F, 0x21, 0x50, 0xB4, 0x52, 0xE6, 0xC0, + 0xC4, 0x24, 0xBC, 0xDE, 0x6F, 0x8D, 0x72, 0x00, + 0x7F, 0x93, 0x10, 0xFE, 0xD7, 0xF2, 0xF8, 0x7D, + 0xE0, 0xDB, 0xB6, 0x4F, 0x44, 0x79, 0xD6, 0xC1, + 0x44, 0x1B, 0xA6, 0x6F, 0x44, 0xB2, 0xAC, 0xCE, + 0xE6, 0x16, 0x09, 0x17, 0x7E, 0xD3, 0x40, 0x12, + 0x8B, 0x40, 0x7E, 0xCE, 0xC7, 0xC6, 0x4B, 0xBE, + 0x50, 0xD6, 0x3D, 0x22, 0xD8, 0x62, 0x77, 0x27 + }, + { + 0xF6, 0x3D, 0x88, 0x12, 0x28, 0x77, 0xEC, 0x30, + 0xB8, 0xC8, 0xB0, 0x0D, 0x22, 0xE8, 0x90, 0x00, + 0xA9, 0x66, 0x42, 0x61, 0x12, 0xBD, 0x44, 0x16, + 0x6E, 0x2F, 0x52, 0x5B, 0x76, 0x9C, 0xCB, 0xE9, + 0xB2, 0x86, 0xD4, 0x37, 0xA0, 0x12, 0x91, 0x30, + 0xDD, 0xE1, 0xA8, 0x6C, 0x43, 0xE0, 0x4B, 0xED, + 0xB5, 0x94, 0xE6, 0x71, 0xD9, 0x82, 0x83, 0xAF, + 0xE6, 0x4C, 0xE3, 0x31, 0xDE, 0x98, 0x28, 0xFD + }, + { + 0x34, 0x8B, 0x05, 0x32, 0x88, 0x0B, 0x88, 0xA6, + 0x61, 0x4A, 0x8D, 0x74, 0x08, 0xC3, 0xF9, 0x13, + 0x35, 0x7F, 0xBB, 0x60, 0xE9, 0x95, 0xC6, 0x02, + 0x05, 0xBE, 0x91, 0x39, 0xE7, 0x49, 0x98, 0xAE, + 0xDE, 0x7F, 0x45, 0x81, 0xE4, 0x2F, 0x6B, 0x52, + 0x69, 0x8F, 0x7F, 0xA1, 0x21, 0x97, 0x08, 0xC1, + 0x44, 0x98, 0x06, 0x7F, 0xD1, 0xE0, 0x95, 0x02, + 0xDE, 0x83, 0xA7, 0x7D, 0xD2, 0x81, 0x15, 0x0C + }, + { + 0x51, 0x33, 0xDC, 0x8B, 0xEF, 0x72, 0x53, 0x59, + 0xDF, 0xF5, 0x97, 0x92, 0xD8, 0x5E, 0xAF, 0x75, + 0xB7, 0xE1, 0xDC, 0xD1, 0x97, 0x8B, 0x01, 0xC3, + 0x5B, 0x1B, 0x85, 0xFC, 0xEB, 0xC6, 0x33, 0x88, + 0xAD, 0x99, 0xA1, 0x7B, 0x63, 0x46, 0xA2, 0x17, + 0xDC, 0x1A, 0x96, 0x22, 0xEB, 0xD1, 0x22, 0xEC, + 0xF6, 0x91, 0x3C, 0x4D, 0x31, 0xA6, 0xB5, 0x2A, + 0x69, 0x5B, 0x86, 0xAF, 0x00, 0xD7, 0x41, 0xA0 + }, + { + 0x27, 0x53, 0xC4, 0xC0, 0xE9, 0x8E, 0xCA, 0xD8, + 0x06, 0xE8, 0x87, 0x80, 0xEC, 0x27, 0xFC, 0xCD, + 0x0F, 0x5C, 0x1A, 0xB5, 0x47, 0xF9, 0xE4, 0xBF, + 0x16, 0x59, 0xD1, 0x92, 0xC2, 0x3A, 0xA2, 0xCC, + 0x97, 0x1B, 0x58, 0xB6, 0x80, 0x25, 0x80, 0xBA, + 0xEF, 0x8A, 0xDC, 0x3B, 0x77, 0x6E, 0xF7, 0x08, + 0x6B, 0x25, 0x45, 0xC2, 0x98, 0x7F, 0x34, 0x8E, + 0xE3, 0x71, 0x9C, 0xDE, 0xF2, 0x58, 0xC4, 0x03 + }, + { + 0xB1, 0x66, 0x35, 0x73, 0xCE, 0x4B, 0x9D, 0x8C, + 0xAE, 0xFC, 0x86, 0x50, 0x12, 0xF3, 0xE3, 0x97, + 0x14, 0xB9, 0x89, 0x8A, 0x5D, 0xA6, 0xCE, 0x17, + 0xC2, 0x5A, 0x6A, 0x47, 0x93, 0x1A, 0x9D, 0xDB, + 0x9B, 0xBE, 0x98, 0xAD, 0xAA, 0x55, 0x3B, 0xEE, + 0xD4, 0x36, 0xE8, 0x95, 0x78, 0x45, 0x54, 0x16, + 0xC2, 0xA5, 0x2A, 0x52, 0x5C, 0xF2, 0x86, 0x2B, + 0x8D, 0x1D, 0x49, 0xA2, 0x53, 0x1B, 0x73, 0x91 + }, + { + 0x64, 0xF5, 0x8B, 0xD6, 0xBF, 0xC8, 0x56, 0xF5, + 0xE8, 0x73, 0xB2, 0xA2, 0x95, 0x6E, 0xA0, 0xED, + 0xA0, 0xD6, 0xDB, 0x0D, 0xA3, 0x9C, 0x8C, 0x7F, + 0xC6, 0x7C, 0x9F, 0x9F, 0xEE, 0xFC, 0xFF, 0x30, + 0x72, 0xCD, 0xF9, 0xE6, 0xEA, 0x37, 0xF6, 0x9A, + 0x44, 0xF0, 0xC6, 0x1A, 0xA0, 0xDA, 0x36, 0x93, + 0xC2, 0xDB, 0x5B, 0x54, 0x96, 0x0C, 0x02, 0x81, + 0xA0, 0x88, 0x15, 0x1D, 0xB4, 0x2B, 0x11, 0xE8 + }, + { + 0x07, 0x64, 0xC7, 0xBE, 0x28, 0x12, 0x5D, 0x90, + 0x65, 0xC4, 0xB9, 0x8A, 0x69, 0xD6, 0x0A, 0xED, + 0xE7, 0x03, 0x54, 0x7C, 0x66, 0xA1, 0x2E, 0x17, + 0xE1, 0xC6, 0x18, 0x99, 0x41, 0x32, 0xF5, 0xEF, + 0x82, 0x48, 0x2C, 0x1E, 0x3F, 0xE3, 0x14, 0x6C, + 0xC6, 0x53, 0x76, 0xCC, 0x10, 0x9F, 0x01, 0x38, + 0xED, 0x9A, 0x80, 0xE4, 0x9F, 0x1F, 0x3C, 0x7D, + 0x61, 0x0D, 0x2F, 0x24, 0x32, 0xF2, 0x06, 0x05 + }, + { + 0xF7, 0x48, 0x78, 0x43, 0x98, 0xA2, 0xFF, 0x03, + 0xEB, 0xEB, 0x07, 0xE1, 0x55, 0xE6, 0x61, 0x16, + 0xA8, 0x39, 0x74, 0x1A, 0x33, 0x6E, 0x32, 0xDA, + 0x71, 0xEC, 0x69, 0x60, 0x01, 0xF0, 0xAD, 0x1B, + 0x25, 0xCD, 0x48, 0xC6, 0x9C, 0xFC, 0xA7, 0x26, + 0x5E, 0xCA, 0x1D, 0xD7, 0x19, 0x04, 0xA0, 0xCE, + 0x74, 0x8A, 0xC4, 0x12, 0x4F, 0x35, 0x71, 0x07, + 0x6D, 0xFA, 0x71, 0x16, 0xA9, 0xCF, 0x00, 0xE9 + }, + { + 0x3F, 0x0D, 0xBC, 0x01, 0x86, 0xBC, 0xEB, 0x6B, + 0x78, 0x5B, 0xA7, 0x8D, 0x2A, 0x2A, 0x01, 0x3C, + 0x91, 0x0B, 0xE1, 0x57, 0xBD, 0xAF, 0xFA, 0xE8, + 0x1B, 0xB6, 0x66, 0x3B, 0x1A, 0x73, 0x72, 0x2F, + 0x7F, 0x12, 0x28, 0x79, 0x5F, 0x3E, 0xCA, 0xDA, + 0x87, 0xCF, 0x6E, 0xF0, 0x07, 0x84, 0x74, 0xAF, + 0x73, 0xF3, 0x1E, 0xCA, 0x0C, 0xC2, 0x00, 0xED, + 0x97, 0x5B, 0x68, 0x93, 0xF7, 0x61, 0xCB, 0x6D + }, + { + 0xD4, 0x76, 0x2C, 0xD4, 0x59, 0x98, 0x76, 0xCA, + 0x75, 0xB2, 0xB8, 0xFE, 0x24, 0x99, 0x44, 0xDB, + 0xD2, 0x7A, 0xCE, 0x74, 0x1F, 0xDA, 0xB9, 0x36, + 0x16, 0xCB, 0xC6, 0xE4, 0x25, 0x46, 0x0F, 0xEB, + 0x51, 0xD4, 0xE7, 0xAD, 0xCC, 0x38, 0x18, 0x0E, + 0x7F, 0xC4, 0x7C, 0x89, 0x02, 0x4A, 0x7F, 0x56, + 0x19, 0x1A, 0xDB, 0x87, 0x8D, 0xFD, 0xE4, 0xEA, + 0xD6, 0x22, 0x23, 0xF5, 0xA2, 0x61, 0x0E, 0xFE + }, + { + 0xCD, 0x36, 0xB3, 0xD5, 0xB4, 0xC9, 0x1B, 0x90, + 0xFC, 0xBB, 0xA7, 0x95, 0x13, 0xCF, 0xEE, 0x19, + 0x07, 0xD8, 0x64, 0x5A, 0x16, 0x2A, 0xFD, 0x0C, + 0xD4, 0xCF, 0x41, 0x92, 0xD4, 0xA5, 0xF4, 0xC8, + 0x92, 0x18, 0x3A, 0x8E, 0xAC, 0xDB, 0x2B, 0x6B, + 0x6A, 0x9D, 0x9A, 0xA8, 0xC1, 0x1A, 0xC1, 0xB2, + 0x61, 0xB3, 0x80, 0xDB, 0xEE, 0x24, 0xCA, 0x46, + 0x8F, 0x1B, 0xFD, 0x04, 0x3C, 0x58, 0xEE, 0xFE + }, + { + 0x98, 0x59, 0x34, 0x52, 0x28, 0x16, 0x61, 0xA5, + 0x3C, 0x48, 0xA9, 0xD8, 0xCD, 0x79, 0x08, 0x26, + 0xC1, 0xA1, 0xCE, 0x56, 0x77, 0x38, 0x05, 0x3D, + 0x0B, 0xEE, 0x4A, 0x91, 0xA3, 0xD5, 0xBD, 0x92, + 0xEE, 0xFD, 0xBA, 0xBE, 0xBE, 0x32, 0x04, 0xF2, + 0x03, 0x1C, 0xA5, 0xF7, 0x81, 0xBD, 0xA9, 0x9E, + 0xF5, 0xD8, 0xAE, 0x56, 0xE5, 0xB0, 0x4A, 0x9E, + 0x1E, 0xCD, 0x21, 0xB0, 0xEB, 0x05, 0xD3, 0xE1 + }, + { + 0x77, 0x1F, 0x57, 0xDD, 0x27, 0x75, 0xCC, 0xDA, + 0xB5, 0x59, 0x21, 0xD3, 0xE8, 0xE3, 0x0C, 0xCF, + 0x48, 0x4D, 0x61, 0xFE, 0x1C, 0x1B, 0x9C, 0x2A, + 0xE8, 0x19, 0xD0, 0xFB, 0x2A, 0x12, 0xFA, 0xB9, + 0xBE, 0x70, 0xC4, 0xA7, 0xA1, 0x38, 0xDA, 0x84, + 0xE8, 0x28, 0x04, 0x35, 0xDA, 0xAD, 0xE5, 0xBB, + 0xE6, 0x6A, 0xF0, 0x83, 0x6A, 0x15, 0x4F, 0x81, + 0x7F, 0xB1, 0x7F, 0x33, 0x97, 0xE7, 0x25, 0xA3 + }, + { + 0xC6, 0x08, 0x97, 0xC6, 0xF8, 0x28, 0xE2, 0x1F, + 0x16, 0xFB, 0xB5, 0xF1, 0x5B, 0x32, 0x3F, 0x87, + 0xB6, 0xC8, 0x95, 0x5E, 0xAB, 0xF1, 0xD3, 0x80, + 0x61, 0xF7, 0x07, 0xF6, 0x08, 0xAB, 0xDD, 0x99, + 0x3F, 0xAC, 0x30, 0x70, 0x63, 0x3E, 0x28, 0x6C, + 0xF8, 0x33, 0x9C, 0xE2, 0x95, 0xDD, 0x35, 0x2D, + 0xF4, 0xB4, 0xB4, 0x0B, 0x2F, 0x29, 0xDA, 0x1D, + 0xD5, 0x0B, 0x3A, 0x05, 0xD0, 0x79, 0xE6, 0xBB + }, + { + 0x82, 0x10, 0xCD, 0x2C, 0x2D, 0x3B, 0x13, 0x5C, + 0x2C, 0xF0, 0x7F, 0xA0, 0xD1, 0x43, 0x3C, 0xD7, + 0x71, 0xF3, 0x25, 0xD0, 0x75, 0xC6, 0x46, 0x9D, + 0x9C, 0x7F, 0x1B, 0xA0, 0x94, 0x3C, 0xD4, 0xAB, + 0x09, 0x80, 0x8C, 0xAB, 0xF4, 0xAC, 0xB9, 0xCE, + 0x5B, 0xB8, 0x8B, 0x49, 0x89, 0x29, 0xB4, 0xB8, + 0x47, 0xF6, 0x81, 0xAD, 0x2C, 0x49, 0x0D, 0x04, + 0x2D, 0xB2, 0xAE, 0xC9, 0x42, 0x14, 0xB0, 0x6B + }, + { + 0x1D, 0x4E, 0xDF, 0xFF, 0xD8, 0xFD, 0x80, 0xF7, + 0xE4, 0x10, 0x78, 0x40, 0xFA, 0x3A, 0xA3, 0x1E, + 0x32, 0x59, 0x84, 0x91, 0xE4, 0xAF, 0x70, 0x13, + 0xC1, 0x97, 0xA6, 0x5B, 0x7F, 0x36, 0xDD, 0x3A, + 0xC4, 0xB4, 0x78, 0x45, 0x61, 0x11, 0xCD, 0x43, + 0x09, 0xD9, 0x24, 0x35, 0x10, 0x78, 0x2F, 0xA3, + 0x1B, 0x7C, 0x4C, 0x95, 0xFA, 0x95, 0x15, 0x20, + 0xD0, 0x20, 0xEB, 0x7E, 0x5C, 0x36, 0xE4, 0xEF + }, + { + 0xAF, 0x8E, 0x6E, 0x91, 0xFA, 0xB4, 0x6C, 0xE4, + 0x87, 0x3E, 0x1A, 0x50, 0xA8, 0xEF, 0x44, 0x8C, + 0xC2, 0x91, 0x21, 0xF7, 0xF7, 0x4D, 0xEE, 0xF3, + 0x4A, 0x71, 0xEF, 0x89, 0xCC, 0x00, 0xD9, 0x27, + 0x4B, 0xC6, 0xC2, 0x45, 0x4B, 0xBB, 0x32, 0x30, + 0xD8, 0xB2, 0xEC, 0x94, 0xC6, 0x2B, 0x1D, 0xEC, + 0x85, 0xF3, 0x59, 0x3B, 0xFA, 0x30, 0xEA, 0x6F, + 0x7A, 0x44, 0xD7, 0xC0, 0x94, 0x65, 0xA2, 0x53 + }, + { + 0x29, 0xFD, 0x38, 0x4E, 0xD4, 0x90, 0x6F, 0x2D, + 0x13, 0xAA, 0x9F, 0xE7, 0xAF, 0x90, 0x59, 0x90, + 0x93, 0x8B, 0xED, 0x80, 0x7F, 0x18, 0x32, 0x45, + 0x4A, 0x37, 0x2A, 0xB4, 0x12, 0xEE, 0xA1, 0xF5, + 0x62, 0x5A, 0x1F, 0xCC, 0x9A, 0xC8, 0x34, 0x3B, + 0x7C, 0x67, 0xC5, 0xAB, 0xA6, 0xE0, 0xB1, 0xCC, + 0x46, 0x44, 0x65, 0x49, 0x13, 0x69, 0x2C, 0x6B, + 0x39, 0xEB, 0x91, 0x87, 0xCE, 0xAC, 0xD3, 0xEC + }, + { + 0xA2, 0x68, 0xC7, 0x88, 0x5D, 0x98, 0x74, 0xA5, + 0x1C, 0x44, 0xDF, 0xFE, 0xD8, 0xEA, 0x53, 0xE9, + 0x4F, 0x78, 0x45, 0x6E, 0x0B, 0x2E, 0xD9, 0x9F, + 0xF5, 0xA3, 0x92, 0x47, 0x60, 0x81, 0x38, 0x26, + 0xD9, 0x60, 0xA1, 0x5E, 0xDB, 0xED, 0xBB, 0x5D, + 0xE5, 0x22, 0x6B, 0xA4, 0xB0, 0x74, 0xE7, 0x1B, + 0x05, 0xC5, 0x5B, 0x97, 0x56, 0xBB, 0x79, 0xE5, + 0x5C, 0x02, 0x75, 0x4C, 0x2C, 0x7B, 0x6C, 0x8A + }, + { + 0x0C, 0xF8, 0x54, 0x54, 0x88, 0xD5, 0x6A, 0x86, + 0x81, 0x7C, 0xD7, 0xEC, 0xB1, 0x0F, 0x71, 0x16, + 0xB7, 0xEA, 0x53, 0x0A, 0x45, 0xB6, 0xEA, 0x49, + 0x7B, 0x6C, 0x72, 0xC9, 0x97, 0xE0, 0x9E, 0x3D, + 0x0D, 0xA8, 0x69, 0x8F, 0x46, 0xBB, 0x00, 0x6F, + 0xC9, 0x77, 0xC2, 0xCD, 0x3D, 0x11, 0x77, 0x46, + 0x3A, 0xC9, 0x05, 0x7F, 0xDD, 0x16, 0x62, 0xC8, + 0x5D, 0x0C, 0x12, 0x64, 0x43, 0xC1, 0x04, 0x73 + }, + { + 0xB3, 0x96, 0x14, 0x26, 0x8F, 0xDD, 0x87, 0x81, + 0x51, 0x5E, 0x2C, 0xFE, 0xBF, 0x89, 0xB4, 0xD5, + 0x40, 0x2B, 0xAB, 0x10, 0xC2, 0x26, 0xE6, 0x34, + 0x4E, 0x6B, 0x9A, 0xE0, 0x00, 0xFB, 0x0D, 0x6C, + 0x79, 0xCB, 0x2F, 0x3E, 0xC8, 0x0E, 0x80, 0xEA, + 0xEB, 0x19, 0x80, 0xD2, 0xF8, 0x69, 0x89, 0x16, + 0xBD, 0x2E, 0x9F, 0x74, 0x72, 0x36, 0x65, 0x51, + 0x16, 0x64, 0x9C, 0xD3, 0xCA, 0x23, 0xA8, 0x37 + }, + { + 0x74, 0xBE, 0xF0, 0x92, 0xFC, 0x6F, 0x1E, 0x5D, + 0xBA, 0x36, 0x63, 0xA3, 0xFB, 0x00, 0x3B, 0x2A, + 0x5B, 0xA2, 0x57, 0x49, 0x65, 0x36, 0xD9, 0x9F, + 0x62, 0xB9, 0xD7, 0x3F, 0x8F, 0x9E, 0xB3, 0xCE, + 0x9F, 0xF3, 0xEE, 0xC7, 0x09, 0xEB, 0x88, 0x36, + 0x55, 0xEC, 0x9E, 0xB8, 0x96, 0xB9, 0x12, 0x8F, + 0x2A, 0xFC, 0x89, 0xCF, 0x7D, 0x1A, 0xB5, 0x8A, + 0x72, 0xF4, 0xA3, 0xBF, 0x03, 0x4D, 0x2B, 0x4A + }, + { + 0x3A, 0x98, 0x8D, 0x38, 0xD7, 0x56, 0x11, 0xF3, + 0xEF, 0x38, 0xB8, 0x77, 0x49, 0x80, 0xB3, 0x3E, + 0x57, 0x3B, 0x6C, 0x57, 0xBE, 0xE0, 0x46, 0x9B, + 0xA5, 0xEE, 0xD9, 0xB4, 0x4F, 0x29, 0x94, 0x5E, + 0x73, 0x47, 0x96, 0x7F, 0xBA, 0x2C, 0x16, 0x2E, + 0x1C, 0x3B, 0xE7, 0xF3, 0x10, 0xF2, 0xF7, 0x5E, + 0xE2, 0x38, 0x1E, 0x7B, 0xFD, 0x6B, 0x3F, 0x0B, + 0xAE, 0xA8, 0xD9, 0x5D, 0xFB, 0x1D, 0xAF, 0xB1 + }, + { + 0x58, 0xAE, 0xDF, 0xCE, 0x6F, 0x67, 0xDD, 0xC8, + 0x5A, 0x28, 0xC9, 0x92, 0xF1, 0xC0, 0xBD, 0x09, + 0x69, 0xF0, 0x41, 0xE6, 0x6F, 0x1E, 0xE8, 0x80, + 0x20, 0xA1, 0x25, 0xCB, 0xFC, 0xFE, 0xBC, 0xD6, + 0x17, 0x09, 0xC9, 0xC4, 0xEB, 0xA1, 0x92, 0xC1, + 0x5E, 0x69, 0xF0, 0x20, 0xD4, 0x62, 0x48, 0x60, + 0x19, 0xFA, 0x8D, 0xEA, 0x0C, 0xD7, 0xA4, 0x29, + 0x21, 0xA1, 0x9D, 0x2F, 0xE5, 0x46, 0xD4, 0x3D + }, + { + 0x93, 0x47, 0xBD, 0x29, 0x14, 0x73, 0xE6, 0xB4, + 0xE3, 0x68, 0x43, 0x7B, 0x8E, 0x56, 0x1E, 0x06, + 0x5F, 0x64, 0x9A, 0x6D, 0x8A, 0xDA, 0x47, 0x9A, + 0xD0, 0x9B, 0x19, 0x99, 0xA8, 0xF2, 0x6B, 0x91, + 0xCF, 0x61, 0x20, 0xFD, 0x3B, 0xFE, 0x01, 0x4E, + 0x83, 0xF2, 0x3A, 0xCF, 0xA4, 0xC0, 0xAD, 0x7B, + 0x37, 0x12, 0xB2, 0xC3, 0xC0, 0x73, 0x32, 0x70, + 0x66, 0x31, 0x12, 0xCC, 0xD9, 0x28, 0x5C, 0xD9 + }, + { + 0xB3, 0x21, 0x63, 0xE7, 0xC5, 0xDB, 0xB5, 0xF5, + 0x1F, 0xDC, 0x11, 0xD2, 0xEA, 0xC8, 0x75, 0xEF, + 0xBB, 0xCB, 0x7E, 0x76, 0x99, 0x09, 0x0A, 0x7E, + 0x7F, 0xF8, 0xA8, 0xD5, 0x07, 0x95, 0xAF, 0x5D, + 0x74, 0xD9, 0xFF, 0x98, 0x54, 0x3E, 0xF8, 0xCD, + 0xF8, 0x9A, 0xC1, 0x3D, 0x04, 0x85, 0x27, 0x87, + 0x56, 0xE0, 0xEF, 0x00, 0xC8, 0x17, 0x74, 0x56, + 0x61, 0xE1, 0xD5, 0x9F, 0xE3, 0x8E, 0x75, 0x37 + }, + { + 0x10, 0x85, 0xD7, 0x83, 0x07, 0xB1, 0xC4, 0xB0, + 0x08, 0xC5, 0x7A, 0x2E, 0x7E, 0x5B, 0x23, 0x46, + 0x58, 0xA0, 0xA8, 0x2E, 0x4F, 0xF1, 0xE4, 0xAA, + 0xAC, 0x72, 0xB3, 0x12, 0xFD, 0xA0, 0xFE, 0x27, + 0xD2, 0x33, 0xBC, 0x5B, 0x10, 0xE9, 0xCC, 0x17, + 0xFD, 0xC7, 0x69, 0x7B, 0x54, 0x0C, 0x7D, 0x95, + 0xEB, 0x21, 0x5A, 0x19, 0xA1, 0xA0, 0xE2, 0x0E, + 0x1A, 0xBF, 0xA1, 0x26, 0xEF, 0xD5, 0x68, 0xC7 + }, + { + 0x4E, 0x5C, 0x73, 0x4C, 0x7D, 0xDE, 0x01, 0x1D, + 0x83, 0xEA, 0xC2, 0xB7, 0x34, 0x7B, 0x37, 0x35, + 0x94, 0xF9, 0x2D, 0x70, 0x91, 0xB9, 0xCA, 0x34, + 0xCB, 0x9C, 0x6F, 0x39, 0xBD, 0xF5, 0xA8, 0xD2, + 0xF1, 0x34, 0x37, 0x9E, 0x16, 0xD8, 0x22, 0xF6, + 0x52, 0x21, 0x70, 0xCC, 0xF2, 0xDD, 0xD5, 0x5C, + 0x84, 0xB9, 0xE6, 0xC6, 0x4F, 0xC9, 0x27, 0xAC, + 0x4C, 0xF8, 0xDF, 0xB2, 0xA1, 0x77, 0x01, 0xF2 + }, + { + 0x69, 0x5D, 0x83, 0xBD, 0x99, 0x0A, 0x11, 0x17, + 0xB3, 0xD0, 0xCE, 0x06, 0xCC, 0x88, 0x80, 0x27, + 0xD1, 0x2A, 0x05, 0x4C, 0x26, 0x77, 0xFD, 0x82, + 0xF0, 0xD4, 0xFB, 0xFC, 0x93, 0x57, 0x55, 0x23, + 0xE7, 0x99, 0x1A, 0x5E, 0x35, 0xA3, 0x75, 0x2E, + 0x9B, 0x70, 0xCE, 0x62, 0x99, 0x2E, 0x26, 0x8A, + 0x87, 0x77, 0x44, 0xCD, 0xD4, 0x35, 0xF5, 0xF1, + 0x30, 0x86, 0x9C, 0x9A, 0x20, 0x74, 0xB3, 0x38 + }, + { + 0xA6, 0x21, 0x37, 0x43, 0x56, 0x8E, 0x3B, 0x31, + 0x58, 0xB9, 0x18, 0x43, 0x01, 0xF3, 0x69, 0x08, + 0x47, 0x55, 0x4C, 0x68, 0x45, 0x7C, 0xB4, 0x0F, + 0xC9, 0xA4, 0xB8, 0xCF, 0xD8, 0xD4, 0xA1, 0x18, + 0xC3, 0x01, 0xA0, 0x77, 0x37, 0xAE, 0xDA, 0x0F, + 0x92, 0x9C, 0x68, 0x91, 0x3C, 0x5F, 0x51, 0xC8, + 0x03, 0x94, 0xF5, 0x3B, 0xFF, 0x1C, 0x3E, 0x83, + 0xB2, 0xE4, 0x0C, 0xA9, 0x7E, 0xBA, 0x9E, 0x15 + }, + { + 0xD4, 0x44, 0xBF, 0xA2, 0x36, 0x2A, 0x96, 0xDF, + 0x21, 0x3D, 0x07, 0x0E, 0x33, 0xFA, 0x84, 0x1F, + 0x51, 0x33, 0x4E, 0x4E, 0x76, 0x86, 0x6B, 0x81, + 0x39, 0xE8, 0xAF, 0x3B, 0xB3, 0x39, 0x8B, 0xE2, + 0xDF, 0xAD, 0xDC, 0xBC, 0x56, 0xB9, 0x14, 0x6D, + 0xE9, 0xF6, 0x81, 0x18, 0xDC, 0x58, 0x29, 0xE7, + 0x4B, 0x0C, 0x28, 0xD7, 0x71, 0x19, 0x07, 0xB1, + 0x21, 0xF9, 0x16, 0x1C, 0xB9, 0x2B, 0x69, 0xA9 + }, + { + 0x14, 0x27, 0x09, 0xD6, 0x2E, 0x28, 0xFC, 0xCC, + 0xD0, 0xAF, 0x97, 0xFA, 0xD0, 0xF8, 0x46, 0x5B, + 0x97, 0x1E, 0x82, 0x20, 0x1D, 0xC5, 0x10, 0x70, + 0xFA, 0xA0, 0x37, 0x2A, 0xA4, 0x3E, 0x92, 0x48, + 0x4B, 0xE1, 0xC1, 0xE7, 0x3B, 0xA1, 0x09, 0x06, + 0xD5, 0xD1, 0x85, 0x3D, 0xB6, 0xA4, 0x10, 0x6E, + 0x0A, 0x7B, 0xF9, 0x80, 0x0D, 0x37, 0x3D, 0x6D, + 0xEE, 0x2D, 0x46, 0xD6, 0x2E, 0xF2, 0xA4, 0x61 + }, +}; + + + + +static const uint8_t blake2sp_kat[KAT_LENGTH][BLAKE2S_OUTBYTES] = +{ + { + 0xDD, 0x0E, 0x89, 0x17, 0x76, 0x93, 0x3F, 0x43, + 0xC7, 0xD0, 0x32, 0xB0, 0x8A, 0x91, 0x7E, 0x25, + 0x74, 0x1F, 0x8A, 0xA9, 0xA1, 0x2C, 0x12, 0xE1, + 0xCA, 0xC8, 0x80, 0x15, 0x00, 0xF2, 0xCA, 0x4F + }, + { + 0xA6, 0xB9, 0xEE, 0xCC, 0x25, 0x22, 0x7A, 0xD7, + 0x88, 0xC9, 0x9D, 0x3F, 0x23, 0x6D, 0xEB, 0xC8, + 0xDA, 0x40, 0x88, 0x49, 0xE9, 0xA5, 0x17, 0x89, + 0x78, 0x72, 0x7A, 0x81, 0x45, 0x7F, 0x72, 0x39 + }, + { + 0xDA, 0xCA, 0xDE, 0xCE, 0x7A, 0x8E, 0x6B, 0xF3, + 0xAB, 0xFE, 0x32, 0x4C, 0xA6, 0x95, 0x43, 0x69, + 0x84, 0xB8, 0x19, 0x5D, 0x29, 0xF6, 0xBB, 0xD8, + 0x96, 0xE4, 0x1E, 0x18, 0xE2, 0x1C, 0x91, 0x45 + }, + { + 0xED, 0x14, 0x41, 0x3B, 0x40, 0xDA, 0x68, 0x9F, + 0x1F, 0x7F, 0xED, 0x2B, 0x08, 0xDF, 0xF4, 0x5B, + 0x80, 0x92, 0xDB, 0x5E, 0xC2, 0xC3, 0x61, 0x0E, + 0x02, 0x72, 0x4D, 0x20, 0x2F, 0x42, 0x3C, 0x46 + }, + { + 0x9B, 0x8A, 0x52, 0x7B, 0x52, 0x72, 0x25, 0x0A, + 0x1E, 0xC3, 0x97, 0x38, 0x8F, 0x04, 0x09, 0x14, + 0x95, 0x48, 0x06, 0xE7, 0x94, 0xDB, 0x04, 0xB7, + 0x0A, 0x46, 0x11, 0xBC, 0x59, 0x58, 0x6A, 0x83 + }, + { + 0x2B, 0xB6, 0x33, 0x37, 0x29, 0x00, 0x0B, 0xE3, + 0xD5, 0xA2, 0x1B, 0x98, 0xF8, 0xE7, 0xEA, 0xD0, + 0x77, 0xF1, 0x51, 0xA5, 0x39, 0x39, 0x19, 0xEB, + 0x67, 0xC8, 0x76, 0xEE, 0x00, 0xBB, 0xBB, 0x04 + }, + { + 0x63, 0xC0, 0x14, 0x08, 0x15, 0x4A, 0xD1, 0x9D, + 0x7F, 0xB7, 0x39, 0xF3, 0x11, 0x78, 0x17, 0x80, + 0x46, 0x2C, 0xF2, 0xEE, 0xCC, 0xE6, 0x0F, 0x06, + 0x4E, 0x85, 0x34, 0x87, 0xC2, 0x72, 0xE3, 0xEB + }, + { + 0x3D, 0x05, 0x1A, 0x11, 0x76, 0x01, 0x9C, 0xA3, + 0x7B, 0xF3, 0x3D, 0x60, 0x42, 0x7F, 0x8D, 0x9D, + 0x1C, 0x3A, 0xBD, 0x59, 0x82, 0x97, 0xCF, 0xB4, + 0x23, 0x5F, 0x74, 0x7D, 0x7C, 0x7C, 0x7F, 0xEC + }, + { + 0x39, 0x1E, 0xA9, 0x12, 0xDF, 0x4D, 0x4D, 0x79, + 0xA4, 0x64, 0x6D, 0x9D, 0xA2, 0x54, 0x9A, 0x44, + 0x6D, 0x22, 0x40, 0xF6, 0x24, 0x15, 0xD0, 0x70, + 0xA2, 0xE0, 0x93, 0x99, 0x2B, 0x47, 0x1F, 0xBA + }, + { + 0x32, 0x46, 0x40, 0x44, 0x0E, 0xA5, 0xC3, 0x08, + 0x2D, 0xDC, 0x30, 0x9E, 0x78, 0x09, 0xD7, 0x41, + 0xD6, 0xCC, 0x1B, 0x2D, 0x49, 0x0F, 0xF8, 0xC0, + 0x52, 0x12, 0x8A, 0x6E, 0xEB, 0x40, 0x9D, 0x62 + }, + { + 0xAB, 0x85, 0x5E, 0x6F, 0xA3, 0x9A, 0x5E, 0x8F, + 0xC9, 0x0E, 0xAC, 0xB9, 0x99, 0xC7, 0xF7, 0x8A, + 0xE7, 0x1E, 0x59, 0xC3, 0xD9, 0x7D, 0x60, 0xAF, + 0xE5, 0x17, 0xD5, 0x87, 0x92, 0x3B, 0x77, 0x11 + }, + { + 0x2A, 0x39, 0xDA, 0x45, 0x86, 0xEF, 0xC4, 0x77, + 0x85, 0xA7, 0xA8, 0xDA, 0x85, 0x68, 0x3A, 0x51, + 0x72, 0x4C, 0xDE, 0xF5, 0x41, 0x3B, 0x35, 0x6D, + 0xC4, 0xFB, 0x50, 0x05, 0x13, 0xF8, 0xFA, 0x2E + }, + { + 0x8A, 0x00, 0x57, 0xC1, 0xF7, 0x8A, 0xD6, 0x21, + 0x45, 0x55, 0xC0, 0x67, 0x07, 0x33, 0xE2, 0x9A, + 0x4C, 0x7E, 0x95, 0x62, 0x27, 0x66, 0x0E, 0xFE, + 0xB1, 0xD7, 0xFC, 0x79, 0xF5, 0x8E, 0xC6, 0xF2 + }, + { + 0x07, 0x64, 0xB0, 0x01, 0x7F, 0x5B, 0xD9, 0x51, + 0xF0, 0x1D, 0x9F, 0xDF, 0x95, 0xC0, 0xCB, 0x41, + 0x38, 0x98, 0x5D, 0x84, 0x79, 0x9C, 0xD4, 0x29, + 0x84, 0xE2, 0x5B, 0x51, 0x28, 0x00, 0xE7, 0x3C + }, + { + 0xCC, 0x02, 0x49, 0x56, 0x93, 0xC8, 0xE1, 0x84, + 0xAD, 0x2E, 0xD0, 0x9D, 0x53, 0x3D, 0xC3, 0x3B, + 0x76, 0xA7, 0x78, 0x3D, 0x62, 0x07, 0xFC, 0xAC, + 0xCB, 0x64, 0xF3, 0xED, 0x2C, 0x6D, 0x66, 0xE0 + }, + { + 0xC0, 0xDF, 0x49, 0xC2, 0x06, 0xA3, 0x42, 0x88, + 0x14, 0x32, 0x16, 0x84, 0x7D, 0xF3, 0x34, 0xD4, + 0x56, 0x9D, 0xAD, 0x73, 0xC2, 0xB1, 0xFF, 0x62, + 0x84, 0x88, 0x4F, 0xD3, 0x89, 0x41, 0xFB, 0x95 + }, + { + 0xB9, 0x19, 0x45, 0x19, 0xE4, 0x97, 0x8A, 0x9D, + 0xC8, 0x93, 0xB2, 0x8B, 0xD8, 0x08, 0xCD, 0xFA, + 0xBB, 0x1B, 0xD5, 0x10, 0xD8, 0x62, 0xB3, 0x17, + 0x1F, 0xF6, 0xE0, 0x17, 0xA4, 0x1B, 0x80, 0x4C + }, + { + 0xBB, 0xA9, 0x27, 0xAC, 0xF1, 0x1B, 0xEB, 0xD3, + 0x62, 0xA3, 0xA3, 0xEB, 0x78, 0xC4, 0xBB, 0x65, + 0xE6, 0x02, 0xA8, 0x70, 0x9F, 0xCE, 0xF3, 0x8D, + 0xC6, 0xC8, 0xB7, 0xBD, 0xA6, 0x64, 0xC3, 0x2C + }, + { + 0xEC, 0xB4, 0x90, 0x0A, 0x63, 0x92, 0x4E, 0x72, + 0x0D, 0x40, 0xF2, 0xD2, 0xB1, 0x4D, 0x1B, 0xB3, + 0x9C, 0x37, 0x01, 0xAD, 0x73, 0x46, 0xBD, 0x0B, + 0x67, 0x23, 0x42, 0x70, 0xBF, 0xBE, 0x7E, 0x70 + }, + { + 0xF8, 0x31, 0x5A, 0x21, 0xB2, 0x5E, 0x6B, 0xA8, + 0xBF, 0x59, 0xB1, 0x7B, 0x05, 0x91, 0x3B, 0x8C, + 0xA4, 0x65, 0x9F, 0x1C, 0xD8, 0x38, 0xFC, 0xC7, + 0x73, 0xC9, 0xEB, 0x12, 0xE7, 0x00, 0x4E, 0x09 + }, + { + 0x4B, 0x77, 0xAF, 0x67, 0xA9, 0x23, 0x2B, 0xF1, + 0x18, 0x4E, 0x57, 0x81, 0x82, 0x94, 0x03, 0x1E, + 0x55, 0xF1, 0xF8, 0x53, 0xC9, 0x4D, 0xBA, 0xB5, + 0x57, 0x75, 0x47, 0x33, 0x0D, 0x65, 0xAA, 0x61 + }, + { + 0x76, 0x85, 0x68, 0x39, 0x0F, 0xD2, 0xB8, 0x70, + 0x94, 0x11, 0x4E, 0xD4, 0xCF, 0x72, 0x3E, 0xA3, + 0x20, 0xFE, 0x97, 0x7B, 0x53, 0x18, 0x03, 0x05, + 0xC3, 0x84, 0x33, 0x54, 0x79, 0xF0, 0xB5, 0x9B + }, + { + 0xA4, 0x31, 0xCB, 0x27, 0x0F, 0x3E, 0x2C, 0x9B, + 0x7A, 0x95, 0x93, 0xB1, 0x55, 0xCC, 0xEC, 0xFF, + 0x5B, 0x5C, 0x4A, 0x2D, 0xCD, 0x5D, 0x6B, 0xB1, + 0xC4, 0x85, 0xAA, 0x28, 0x69, 0x97, 0xF9, 0x15 + }, + { + 0xD6, 0x91, 0xFA, 0x6A, 0x79, 0x0B, 0x1A, 0x51, + 0x79, 0x80, 0x08, 0x7F, 0x50, 0xB0, 0x3D, 0xED, + 0x8C, 0x6E, 0xD4, 0x86, 0xD0, 0x84, 0x22, 0x1C, + 0x82, 0x7D, 0x9B, 0xD9, 0x22, 0xBE, 0xB8, 0xC0 + }, + { + 0x8F, 0x97, 0x8A, 0x49, 0x32, 0xF4, 0x45, 0x98, + 0x13, 0xE8, 0xFE, 0x15, 0x68, 0x6E, 0x4E, 0xFA, + 0x25, 0xC2, 0xC5, 0xFF, 0x5A, 0x3A, 0x4F, 0x8C, + 0x9B, 0x14, 0x96, 0x5D, 0x2F, 0x0B, 0xE4, 0x61 + }, + { + 0x1E, 0xFB, 0xD0, 0xC1, 0x31, 0x44, 0x91, 0x42, + 0xF2, 0x29, 0x5F, 0x2D, 0x42, 0x41, 0x1D, 0xFE, + 0x0F, 0x48, 0xD4, 0xAC, 0xAE, 0x76, 0x2D, 0x8D, + 0xF6, 0x7A, 0x57, 0x0B, 0xF7, 0xB1, 0xDC, 0xD5 + }, + { + 0xD5, 0x3B, 0xA9, 0x33, 0x46, 0x14, 0x3A, 0xB8, + 0xE0, 0xD3, 0xD1, 0xBF, 0x27, 0x27, 0x06, 0xD1, + 0x69, 0xE6, 0x6C, 0x69, 0xC7, 0xB8, 0xF4, 0xA5, + 0xE8, 0x2F, 0xEF, 0x44, 0x07, 0x02, 0xBC, 0xF2 + }, + { + 0xF7, 0x1A, 0x3E, 0xC0, 0x1A, 0xA3, 0x82, 0xEA, + 0x76, 0x99, 0x2B, 0x43, 0x0A, 0x7F, 0x42, 0xC7, + 0xAD, 0x2A, 0x86, 0xAE, 0xA9, 0xC1, 0x9E, 0x76, + 0xCD, 0x17, 0x32, 0xEC, 0x68, 0x30, 0xDE, 0x6F + }, + { + 0x80, 0xA6, 0xAB, 0x7B, 0x71, 0x04, 0x64, 0xF9, + 0x3E, 0x6C, 0xBA, 0x96, 0x86, 0x4A, 0xA6, 0x40, + 0x9B, 0xCA, 0xFC, 0x1B, 0xF4, 0xB3, 0x2A, 0x30, + 0x93, 0x72, 0xE8, 0x57, 0xE8, 0x04, 0x06, 0x8C + }, + { + 0xDB, 0xDE, 0x81, 0xE5, 0x1A, 0x52, 0x17, 0x4B, + 0x10, 0x14, 0x90, 0x1B, 0x53, 0xBE, 0xF8, 0x8D, + 0xE9, 0x3B, 0x29, 0xE2, 0x74, 0x34, 0x7E, 0x8E, + 0x9A, 0x7B, 0x03, 0x74, 0x56, 0x62, 0x9F, 0x35 + }, + { + 0x75, 0xF2, 0x74, 0x46, 0x6B, 0x1A, 0x2D, 0x0F, + 0xD8, 0x45, 0xBB, 0xB5, 0x7C, 0x38, 0xC9, 0x89, + 0x51, 0x6E, 0x15, 0x68, 0x32, 0x0A, 0xB5, 0x17, + 0xB1, 0x63, 0xEA, 0xF7, 0x09, 0x23, 0x4C, 0xC7 + }, + { + 0xAF, 0xE1, 0xA0, 0x59, 0x1C, 0x49, 0x1D, 0x41, + 0x6E, 0xB6, 0x4F, 0x62, 0x86, 0xF3, 0xBA, 0x29, + 0xD4, 0xC9, 0x99, 0x82, 0x14, 0xA3, 0x83, 0x1C, + 0x39, 0x01, 0x4A, 0xC0, 0x30, 0x55, 0x79, 0x45 + }, + { + 0x67, 0xFF, 0x6A, 0xCD, 0xBE, 0x8A, 0x99, 0xA1, + 0x66, 0xA5, 0xD9, 0xCF, 0x32, 0x13, 0x65, 0x06, + 0xB5, 0x48, 0xD6, 0xC9, 0x47, 0xC2, 0x4C, 0x69, + 0x9C, 0xEA, 0x3A, 0xFD, 0x92, 0xAD, 0xFA, 0xCA + }, + { + 0xBF, 0xB4, 0xD0, 0xC7, 0x11, 0x20, 0x75, 0x26, + 0x2C, 0x2D, 0xD2, 0x48, 0xF3, 0x34, 0xB2, 0xEF, + 0x15, 0x40, 0x08, 0x7E, 0xCC, 0x73, 0x82, 0xBC, + 0x2A, 0x27, 0x25, 0x75, 0xC5, 0x00, 0x9F, 0x70 + }, + { + 0x17, 0xC9, 0x4B, 0x9C, 0x53, 0x72, 0x43, 0xF2, + 0x33, 0x5B, 0x86, 0x39, 0x49, 0xB2, 0xB9, 0x1C, + 0x98, 0xA6, 0x95, 0x6D, 0x7C, 0x10, 0xAA, 0x98, + 0x99, 0x59, 0xA8, 0x0F, 0x91, 0x0C, 0x25, 0x22 + }, + { + 0xF6, 0x33, 0x8F, 0x43, 0x4D, 0x31, 0x94, 0x10, + 0x19, 0x6D, 0x95, 0x19, 0xAB, 0xCA, 0xEF, 0xF7, + 0xD5, 0x54, 0x39, 0xFD, 0x2A, 0xA5, 0xBA, 0xBF, + 0x7A, 0x7E, 0x79, 0x13, 0xB2, 0x94, 0xED, 0x4D + }, + { + 0x08, 0xEF, 0x7D, 0x65, 0xF9, 0xBB, 0xF3, 0xDA, + 0x1F, 0x78, 0x84, 0xAE, 0x9B, 0x75, 0x90, 0x1F, + 0xD8, 0x52, 0x95, 0x66, 0x2A, 0x6E, 0xA7, 0x1D, + 0xE0, 0x8B, 0xEE, 0x38, 0x34, 0x57, 0x62, 0x78 + }, + { + 0x16, 0x47, 0xEC, 0xC2, 0xBA, 0x13, 0xF8, 0xB9, + 0x3B, 0x2F, 0xBC, 0xDC, 0x4E, 0x8F, 0x1D, 0xFA, + 0x47, 0xFE, 0x3B, 0xE1, 0x2A, 0xAA, 0x0E, 0x45, + 0x9B, 0x0E, 0x5A, 0x87, 0xF3, 0xA6, 0x9B, 0xB0 + }, + { + 0xFF, 0x92, 0x7A, 0x71, 0x78, 0x81, 0xF6, 0xFD, + 0x8E, 0xD8, 0xBF, 0x5D, 0x5E, 0x35, 0xBD, 0x80, + 0x16, 0x15, 0x73, 0xE5, 0x82, 0x94, 0x04, 0xC3, + 0x2D, 0x2A, 0x27, 0x6A, 0x01, 0xF4, 0xB9, 0x06 + }, + { + 0xC8, 0xCA, 0xF1, 0x36, 0xFF, 0x20, 0x9C, 0x82, + 0xE0, 0x24, 0x0C, 0x1E, 0x62, 0xA3, 0xBC, 0x7E, + 0x9C, 0xAC, 0x87, 0x3B, 0x01, 0x1C, 0xF7, 0xC5, + 0xE6, 0x7E, 0xC1, 0x87, 0xA5, 0xFB, 0xCD, 0x96 + }, + { + 0xD9, 0xAC, 0xC7, 0x3E, 0x3F, 0x42, 0x1E, 0x18, + 0x83, 0xB5, 0xED, 0x53, 0xD8, 0x2A, 0x9A, 0xEC, + 0x8F, 0x5D, 0xC9, 0x80, 0xC4, 0x2B, 0xCA, 0xEB, + 0x0E, 0x7D, 0x89, 0x76, 0xA3, 0x38, 0xEF, 0x51 + }, + { + 0x9F, 0x17, 0x3F, 0xCF, 0x08, 0xA5, 0x36, 0x21, + 0x93, 0xF3, 0x52, 0xC8, 0x25, 0x6A, 0xE5, 0x34, + 0xAE, 0x9C, 0xE7, 0xBF, 0xA4, 0xBC, 0x09, 0xFA, + 0xC9, 0x00, 0x98, 0xF9, 0x8A, 0x71, 0x62, 0x94 + }, + { + 0x0A, 0x72, 0x45, 0x79, 0xDC, 0x80, 0xBC, 0x0C, + 0x90, 0x04, 0xE5, 0x1B, 0xE7, 0xEF, 0xF3, 0xAF, + 0xA5, 0x30, 0x75, 0xAB, 0x4A, 0x32, 0x55, 0x77, + 0x33, 0x58, 0x6E, 0x82, 0x0F, 0xD3, 0x64, 0x23 + }, + { + 0x38, 0xF7, 0xC3, 0x40, 0xF4, 0xB1, 0x59, 0xB1, + 0xE5, 0x94, 0xF6, 0xEB, 0x83, 0x28, 0x49, 0x17, + 0xB7, 0xAA, 0x19, 0xC7, 0x4F, 0x57, 0x11, 0x7A, + 0x4E, 0x08, 0xCF, 0x7C, 0x4E, 0x32, 0xA2, 0x3C + }, + { + 0x1C, 0x67, 0x4B, 0xE2, 0x57, 0xE9, 0xB3, 0x31, + 0x34, 0xD4, 0x16, 0x8F, 0x15, 0x2F, 0x8B, 0x63, + 0xDF, 0xD7, 0x80, 0xC9, 0x7D, 0xC4, 0xDC, 0x37, + 0xAC, 0x26, 0xCC, 0x0A, 0xEF, 0xB7, 0x9C, 0x1A + }, + { + 0x2F, 0x0C, 0x59, 0x76, 0x16, 0xD5, 0x75, 0x17, + 0x14, 0xA5, 0xFB, 0x4E, 0xBF, 0x3C, 0x48, 0x1A, + 0x96, 0xC3, 0xAD, 0x14, 0x5E, 0xBD, 0xE0, 0x65, + 0x09, 0xF3, 0xA2, 0xE5, 0xF2, 0xC1, 0x3F, 0xC8 + }, + { + 0xFD, 0xDC, 0x69, 0xE0, 0xC9, 0x83, 0xCD, 0x82, + 0x83, 0xED, 0x81, 0x88, 0xBE, 0xC4, 0xE5, 0xF4, + 0x1D, 0xEA, 0x3D, 0x01, 0xB9, 0xE7, 0x4C, 0x4B, + 0xAF, 0x73, 0x41, 0xD8, 0xB4, 0xBF, 0x55, 0x3D + }, + { + 0x24, 0xD0, 0x83, 0xCB, 0xA0, 0x38, 0xC8, 0x7E, + 0x9A, 0xCB, 0x86, 0x81, 0x82, 0x02, 0x08, 0xB7, + 0x5C, 0xB3, 0x29, 0x3A, 0x96, 0xC9, 0xEF, 0xA7, + 0x5D, 0x2C, 0x63, 0xF1, 0x6B, 0x85, 0xFE, 0x1E + }, + { + 0x7F, 0x6A, 0x64, 0x9C, 0xCA, 0x89, 0xB2, 0x53, + 0xFF, 0xBD, 0x20, 0xC0, 0x16, 0x98, 0x01, 0x00, + 0xA8, 0x7C, 0x16, 0x81, 0x09, 0x62, 0x8F, 0xCC, + 0x66, 0x52, 0x5D, 0x8B, 0xAA, 0xFE, 0x50, 0x5F + }, + { + 0x6D, 0xA3, 0x73, 0xB4, 0xC1, 0x87, 0x92, 0xB3, + 0x20, 0x9A, 0xDD, 0x15, 0xA5, 0x07, 0x4A, 0x1D, + 0x70, 0xC1, 0x0B, 0xB3, 0x94, 0x80, 0xCA, 0x3F, + 0xE5, 0xC4, 0x39, 0xD9, 0x5F, 0xC2, 0x86, 0xCA + }, + { + 0x27, 0x0A, 0xFF, 0xA6, 0x42, 0x6F, 0x1A, 0x51, + 0x5C, 0x9B, 0x76, 0xDF, 0xC2, 0x7D, 0x18, 0x1F, + 0xC2, 0xFD, 0x57, 0xD0, 0x82, 0xA3, 0xBA, 0x2C, + 0x1E, 0xEF, 0x07, 0x15, 0x33, 0xA6, 0xDF, 0xB7 + }, + { + 0xC2, 0x2E, 0x15, 0xCF, 0xC5, 0xA3, 0xD1, 0x4B, + 0x64, 0xD1, 0x31, 0xF3, 0x5F, 0xB3, 0x5D, 0xD5, + 0xE6, 0xC5, 0x7D, 0xC4, 0xAF, 0xC5, 0x52, 0x27, + 0x75, 0x01, 0xEC, 0xA7, 0x64, 0xDA, 0x74, 0xBF + }, + { + 0xAD, 0x68, 0x3E, 0x96, 0xB8, 0xAC, 0x65, 0x8C, + 0x4F, 0x3F, 0x10, 0xAD, 0x22, 0xD9, 0x9B, 0x07, + 0xCB, 0x5E, 0xF9, 0xE3, 0x1C, 0xBE, 0x11, 0xE7, + 0xF7, 0xDC, 0x29, 0xF2, 0xAE, 0xE5, 0x02, 0x4C + }, + { + 0x78, 0xD3, 0xCE, 0xDA, 0x1C, 0xE0, 0x52, 0x93, + 0xF4, 0x30, 0xF6, 0x16, 0x7B, 0x33, 0xC9, 0x9F, + 0x0B, 0x1D, 0x6D, 0xAD, 0xE5, 0x21, 0x43, 0xC2, + 0x92, 0x55, 0x77, 0xC0, 0xBA, 0x82, 0x53, 0xEB + }, + { + 0xE0, 0x06, 0x45, 0x63, 0x44, 0xF9, 0x0F, 0x50, + 0x1C, 0x25, 0x81, 0x3F, 0x9B, 0xE2, 0xA3, 0xF4, + 0x0B, 0x98, 0x74, 0xFA, 0x05, 0x63, 0x98, 0x1C, + 0xD4, 0x56, 0xEE, 0x8D, 0x44, 0x80, 0x7C, 0x93 + }, + { + 0x39, 0x08, 0xE8, 0xD5, 0x47, 0xC0, 0xAF, 0xB1, + 0x13, 0x49, 0x49, 0x46, 0x63, 0x04, 0xA1, 0x45, + 0x02, 0x7E, 0x6B, 0xB7, 0xA7, 0x4D, 0xD1, 0xC1, + 0x62, 0xCD, 0xF0, 0xBC, 0xF7, 0x72, 0x37, 0xE8 + }, + { + 0x1B, 0x6C, 0x87, 0xA3, 0x48, 0x38, 0xC7, 0xCD, + 0x5F, 0xD0, 0x89, 0x14, 0x22, 0x4E, 0x90, 0xC2, + 0x2A, 0xBF, 0x5A, 0x97, 0xB1, 0x06, 0x46, 0xD9, + 0x8C, 0x49, 0x16, 0xD3, 0xA8, 0x93, 0x9E, 0x62 + }, + { + 0xB0, 0xD3, 0x8F, 0x82, 0xF2, 0x48, 0x91, 0x69, + 0x52, 0xB3, 0x16, 0xB6, 0xD3, 0x6D, 0x9E, 0x02, + 0x2D, 0xF6, 0xEE, 0xCC, 0x26, 0xC7, 0x62, 0xA6, + 0x55, 0xCF, 0x5F, 0x0A, 0xE6, 0x49, 0xE2, 0xBD + }, + { + 0x8D, 0x66, 0xFC, 0x9C, 0xED, 0xA5, 0xED, 0xDF, + 0xB1, 0xE0, 0x4D, 0x09, 0x6C, 0xA7, 0x0E, 0xF5, + 0x06, 0x50, 0xFB, 0x87, 0xCC, 0x6A, 0x9F, 0xFB, + 0xB3, 0xD2, 0x0B, 0xCE, 0x7B, 0x5A, 0x60, 0x74 + }, + { + 0x06, 0x43, 0x54, 0xE8, 0xE1, 0x1C, 0xF7, 0x13, + 0xB2, 0xC7, 0x2B, 0xA6, 0x7A, 0xC7, 0xD7, 0x6E, + 0x41, 0xBA, 0x61, 0xDB, 0x9C, 0x2D, 0xEA, 0x52, + 0x2E, 0x0B, 0xDA, 0x17, 0xCB, 0xA5, 0xE3, 0x92 + }, + { + 0xC8, 0xEF, 0x5F, 0x49, 0x8B, 0xD1, 0xBC, 0x70, + 0x7F, 0xBC, 0x7B, 0x5C, 0xBC, 0x2D, 0xFF, 0x04, + 0x93, 0x14, 0x4A, 0xC5, 0x27, 0x86, 0xDB, 0x3C, + 0x79, 0x3E, 0xF4, 0xAE, 0x8A, 0x83, 0x88, 0x47 + }, + { + 0x8A, 0x23, 0x97, 0xDF, 0x31, 0xE7, 0xF0, 0xCC, + 0x29, 0x0D, 0xA9, 0xA8, 0xBB, 0xE4, 0xF5, 0xF7, + 0xA3, 0xA1, 0x37, 0x50, 0x73, 0x0D, 0xB6, 0x2D, + 0xC2, 0x54, 0x0F, 0xDB, 0xD6, 0x18, 0x85, 0x89 + }, + { + 0xF1, 0x2D, 0x0B, 0x13, 0xC6, 0xAD, 0xFB, 0x3B, + 0xE5, 0x0A, 0x51, 0xEB, 0x6B, 0xAF, 0x65, 0xAB, + 0xFB, 0x17, 0x00, 0xBA, 0xA8, 0x7E, 0x52, 0x7D, + 0xBE, 0x3E, 0x67, 0x5A, 0x7A, 0x99, 0x46, 0x61 + }, + { + 0x10, 0x24, 0xC9, 0x40, 0xBE, 0x73, 0x41, 0x44, + 0x9B, 0x50, 0x10, 0x52, 0x2B, 0x50, 0x9F, 0x65, + 0xBB, 0xDC, 0x12, 0x87, 0xB4, 0x55, 0xC2, 0xBB, + 0x7F, 0x72, 0xB2, 0xC9, 0x2F, 0xD0, 0xD1, 0x89 + }, + { + 0x52, 0x60, 0x3B, 0x6C, 0xBF, 0xAD, 0x49, 0x66, + 0xCB, 0x04, 0x4C, 0xB2, 0x67, 0x56, 0x83, 0x85, + 0xCF, 0x35, 0xF2, 0x1E, 0x6C, 0x45, 0xCF, 0x30, + 0xAE, 0xD1, 0x98, 0x32, 0xCB, 0x51, 0xE9, 0xF5 + }, + { + 0xFF, 0xF2, 0x4D, 0x3C, 0xC7, 0x29, 0xD3, 0x95, + 0xDA, 0xF9, 0x78, 0xB0, 0x15, 0x73, 0x06, 0xCB, + 0x49, 0x57, 0x97, 0xE6, 0xC8, 0xDC, 0xA1, 0x73, + 0x1D, 0x2F, 0x6F, 0x81, 0xB8, 0x49, 0xBA, 0xAE + }, + { + 0x41, 0xEE, 0xE9, 0x0D, 0x47, 0xEC, 0x27, 0x72, + 0xCD, 0x35, 0x2D, 0xFD, 0x67, 0xE0, 0x60, 0x5F, + 0xBD, 0xFC, 0x5F, 0xD6, 0xD8, 0x26, 0x45, 0x1E, + 0x3D, 0x06, 0x4D, 0x38, 0x28, 0xBD, 0x3B, 0xAE + }, + { + 0x30, 0x0B, 0x6B, 0x36, 0xE5, 0x9F, 0x85, 0x1D, + 0xDD, 0xC2, 0x9B, 0xFA, 0x93, 0x08, 0x25, 0x20, + 0xCD, 0x77, 0xC5, 0x1E, 0x00, 0x7E, 0x00, 0xD2, + 0xD7, 0x8B, 0x26, 0xF4, 0xAF, 0x96, 0x15, 0x32 + }, + { + 0x9E, 0xF3, 0x03, 0x14, 0x83, 0x4E, 0x40, 0x1C, + 0x87, 0x1A, 0x20, 0x04, 0xE3, 0x8D, 0x5C, 0xE3, + 0x2E, 0xD2, 0x8E, 0x11, 0x37, 0xF1, 0x97, 0x0F, + 0x4F, 0x43, 0x78, 0xC7, 0x37, 0x06, 0x76, 0x3D + }, + { + 0x3F, 0xBD, 0xCD, 0xE7, 0xB6, 0x43, 0x04, 0x02, + 0x5E, 0xC0, 0x58, 0x26, 0x09, 0x03, 0x1E, 0xC2, + 0x66, 0xD5, 0x0F, 0x56, 0x83, 0x5A, 0xE0, 0xCB, + 0x72, 0xD8, 0xCD, 0xB4, 0xCF, 0xAF, 0x44, 0x19 + }, + { + 0xE9, 0x0E, 0xAD, 0x3B, 0x98, 0x2B, 0x43, 0x5B, + 0x66, 0x36, 0x6A, 0x49, 0x6C, 0x3F, 0x8A, 0xE6, + 0x5B, 0x17, 0x61, 0x37, 0x00, 0xF5, 0x47, 0x67, + 0x3F, 0x62, 0x15, 0x35, 0x41, 0x91, 0x28, 0x64 + }, + { + 0xAB, 0xE3, 0x54, 0x7B, 0x33, 0x6D, 0x6E, 0x24, + 0x0D, 0x7F, 0xE6, 0x82, 0xD7, 0x4B, 0x9C, 0xC7, + 0xE8, 0xD7, 0xF9, 0xB5, 0x66, 0x48, 0x58, 0xB9, + 0x4D, 0xF5, 0x9E, 0x9F, 0xC3, 0x30, 0xD9, 0xE5 + }, + { + 0xB2, 0x99, 0x64, 0x20, 0x95, 0xB8, 0x28, 0x6C, + 0x52, 0x1C, 0xDB, 0x21, 0xED, 0x0F, 0xE0, 0x57, + 0x27, 0x80, 0x21, 0xBB, 0x40, 0x38, 0xEB, 0x5A, + 0x3D, 0x79, 0x54, 0x2F, 0x5D, 0x75, 0x1F, 0x54 + }, + { + 0xE4, 0xD7, 0x58, 0x35, 0x9F, 0x08, 0x67, 0x93, + 0xA8, 0x37, 0x54, 0xAC, 0xA6, 0x96, 0x8C, 0x3E, + 0x9F, 0xD9, 0x4B, 0x40, 0x49, 0x7F, 0x2E, 0xC2, + 0x24, 0xA2, 0x91, 0x60, 0x63, 0xA2, 0x14, 0xA3 + }, + { + 0x59, 0xA3, 0x04, 0xFC, 0x03, 0xAB, 0x75, 0xD5, + 0x57, 0xDB, 0x04, 0xEB, 0xD0, 0x2D, 0xD4, 0xC6, + 0xB8, 0x10, 0xA1, 0x38, 0xBB, 0xFE, 0xEA, 0x5D, + 0xFC, 0xEE, 0xAA, 0x2B, 0x75, 0xB0, 0x64, 0x91 + }, + { + 0x39, 0x95, 0x10, 0x22, 0x15, 0xF5, 0xFE, 0x92, + 0x10, 0xEB, 0x30, 0xD9, 0x52, 0xD8, 0xC9, 0x19, + 0x58, 0x9E, 0x71, 0x45, 0xFC, 0xD4, 0x95, 0xEA, + 0x78, 0xD0, 0x2B, 0x9C, 0x14, 0x8F, 0xAF, 0x09 + }, + { + 0x47, 0x2E, 0xE7, 0x11, 0x56, 0x35, 0x06, 0xA5, + 0xF0, 0x08, 0x3F, 0xE8, 0x2B, 0x08, 0xB9, 0x92, + 0x3C, 0xF6, 0xC8, 0x40, 0x4D, 0x0C, 0xBA, 0xCB, + 0xF8, 0x48, 0x64, 0xF6, 0x48, 0x54, 0x2A, 0xC0 + }, + { + 0x68, 0xFD, 0xB8, 0x2A, 0xDA, 0xE7, 0x9B, 0xEF, + 0x59, 0x0A, 0xBA, 0x62, 0xD7, 0xAC, 0x55, 0x32, + 0x12, 0x06, 0x1C, 0x36, 0xE3, 0x6F, 0x12, 0xC0, + 0xEF, 0xA2, 0x9A, 0x17, 0x62, 0xDE, 0x3B, 0x6A + }, + { + 0x75, 0x85, 0xC0, 0x77, 0x33, 0x83, 0xF1, 0x74, + 0xFD, 0x66, 0x65, 0x49, 0xA8, 0x35, 0x2B, 0x30, + 0x5B, 0xF6, 0x85, 0x5B, 0xC9, 0x8B, 0xEA, 0x28, + 0xC3, 0x91, 0xB3, 0xC0, 0x34, 0xDA, 0x5A, 0x5A + }, + { + 0xAC, 0xC5, 0x75, 0xFE, 0x2C, 0xD7, 0xBA, 0x2A, + 0x31, 0xFC, 0x7D, 0x67, 0x0A, 0x92, 0x34, 0xAF, + 0x68, 0x50, 0x33, 0x86, 0xE9, 0x59, 0x07, 0x3D, + 0x16, 0xA8, 0x1B, 0x33, 0xB9, 0x22, 0xB5, 0x0E + }, + { + 0x9E, 0xC7, 0xD2, 0x99, 0x59, 0x43, 0xD3, 0x9D, + 0x6B, 0x97, 0x14, 0x93, 0xB8, 0x97, 0xA0, 0xEE, + 0x2D, 0x33, 0x92, 0xA7, 0x2D, 0xB8, 0x75, 0xC2, + 0x40, 0x5D, 0x35, 0x71, 0x78, 0xFB, 0x69, 0x11 + }, + { + 0x2D, 0x7E, 0xF1, 0x94, 0x01, 0x42, 0x5A, 0xBA, + 0x45, 0x0E, 0x82, 0xD3, 0x6D, 0x0F, 0xE7, 0xB2, + 0x08, 0x5E, 0xA0, 0xAF, 0x60, 0x45, 0xA5, 0x99, + 0x4C, 0xF4, 0x31, 0xEA, 0x59, 0x93, 0x9C, 0xC9 + }, + { + 0xF3, 0x2F, 0xD8, 0x55, 0xF0, 0x11, 0xC7, 0x18, + 0x02, 0x7F, 0x2E, 0xBE, 0x37, 0x7D, 0x69, 0x39, + 0xF1, 0x23, 0x70, 0xCA, 0xFF, 0x15, 0x1C, 0x1E, + 0x5A, 0xCE, 0x43, 0x8D, 0x70, 0x3C, 0x6D, 0x9F + }, + { + 0xB2, 0xBD, 0x83, 0xD2, 0x31, 0x0D, 0x3D, 0x7B, + 0x1D, 0x2D, 0x5A, 0xAF, 0x43, 0x59, 0xFA, 0xE2, + 0x86, 0x12, 0x96, 0x27, 0x19, 0xFD, 0xDE, 0x4D, + 0xDA, 0xF6, 0x9E, 0x78, 0x20, 0xF3, 0x3F, 0x61 + }, + { + 0x1A, 0x7A, 0x9D, 0x0F, 0x44, 0xDD, 0xFA, 0x7F, + 0xC2, 0xF4, 0x77, 0x0C, 0xAD, 0x74, 0x22, 0xFA, + 0x6C, 0x4E, 0x37, 0xE6, 0xCB, 0x03, 0x6D, 0x89, + 0x9E, 0x10, 0x27, 0x50, 0xE5, 0x94, 0xFF, 0xCD + }, + { + 0xDC, 0x69, 0xF6, 0x14, 0x1C, 0x8E, 0x10, 0x3F, + 0xF6, 0x1F, 0x62, 0x98, 0xA2, 0xC4, 0x4F, 0x52, + 0xD1, 0x47, 0x36, 0x6D, 0xDB, 0xD9, 0xC7, 0x9C, + 0xC3, 0x08, 0xFE, 0x84, 0x33, 0x6A, 0x95, 0x64 + }, + { + 0xE3, 0x4E, 0xD4, 0x17, 0xB0, 0x79, 0x1D, 0x9A, + 0x77, 0xEE, 0x1E, 0x50, 0xCC, 0x2C, 0x20, 0x7E, + 0x54, 0x0C, 0x77, 0x14, 0x04, 0x21, 0xC4, 0x6C, + 0xE0, 0x86, 0x28, 0x78, 0xAA, 0xEB, 0x27, 0x09 + }, + { + 0x21, 0x74, 0x42, 0x5C, 0x8C, 0xCA, 0xE3, 0x98, + 0xC4, 0xFF, 0x06, 0xF8, 0x48, 0x99, 0x1C, 0x5E, + 0x9B, 0xC0, 0xF3, 0x46, 0x11, 0x11, 0x70, 0x6F, + 0xB9, 0x5D, 0x0B, 0xE1, 0xC6, 0x8E, 0x47, 0x60 + }, + { + 0x18, 0x94, 0x58, 0x2A, 0x8A, 0x25, 0xFE, 0x8F, + 0x84, 0x7A, 0x4A, 0x03, 0x25, 0x74, 0xB7, 0x7B, + 0x8B, 0x36, 0xBF, 0x19, 0x99, 0x75, 0x26, 0xBB, + 0x4B, 0xC8, 0x5F, 0x38, 0x24, 0x53, 0x7F, 0xEB + }, + { + 0x17, 0xED, 0x18, 0x8A, 0xE3, 0xC9, 0x53, 0xD6, + 0x55, 0x44, 0x59, 0x83, 0xB8, 0x32, 0x5B, 0xAF, + 0xFF, 0x32, 0xE2, 0x22, 0xB2, 0xDF, 0xEB, 0x16, + 0xE8, 0x61, 0x7A, 0xBF, 0x86, 0xEE, 0x7C, 0xC5 + }, + { + 0xF1, 0x48, 0x9A, 0xD1, 0xC3, 0x54, 0xCD, 0xE9, + 0x78, 0x92, 0x37, 0xEA, 0x6D, 0xBF, 0x67, 0xFC, + 0x1E, 0x44, 0xD1, 0xAC, 0xC8, 0xDC, 0x66, 0xAD, + 0x83, 0x87, 0x27, 0xF4, 0x7D, 0x9A, 0x91, 0xFE + }, + { + 0x36, 0x7F, 0x22, 0x16, 0x5B, 0x8B, 0x66, 0xE9, + 0x7F, 0x66, 0x70, 0xF3, 0x4E, 0xBA, 0x27, 0x49, + 0xD2, 0x64, 0x3B, 0x21, 0xBE, 0xAD, 0xAD, 0xFE, + 0xFE, 0xA2, 0x57, 0x4B, 0x7C, 0x9B, 0x21, 0x96 + }, + { + 0x3D, 0x8D, 0xFE, 0xA1, 0x7E, 0xEA, 0x5D, 0x64, + 0x5A, 0xC1, 0xD4, 0x1A, 0x5B, 0x59, 0x22, 0x6C, + 0x48, 0x6C, 0x36, 0xBD, 0x77, 0xED, 0x44, 0xBB, + 0x34, 0x91, 0x70, 0xD0, 0x80, 0xE3, 0x0E, 0x68 + }, + { + 0x41, 0x15, 0xF8, 0x9E, 0x0B, 0x3B, 0x5C, 0x8F, + 0x61, 0x22, 0xC0, 0x25, 0x00, 0x17, 0x1D, 0xCF, + 0xFB, 0xCE, 0xA4, 0x66, 0x2A, 0x8C, 0x5F, 0x8C, + 0x1C, 0x01, 0xA9, 0xCA, 0x7B, 0x10, 0x27, 0xBB + }, + { + 0xED, 0x6E, 0x91, 0x0B, 0x96, 0x02, 0x55, 0xD7, + 0xD7, 0x92, 0xEB, 0xE6, 0x7F, 0x26, 0x0A, 0x14, + 0x3C, 0xFA, 0xC1, 0x05, 0x1D, 0xFC, 0x05, 0x90, + 0x25, 0xEE, 0x0C, 0x1B, 0xFC, 0xBC, 0x56, 0x81 + }, + { + 0x55, 0x8F, 0xA8, 0xAF, 0xA1, 0x2B, 0xBE, 0xE5, + 0x4A, 0xF7, 0x8F, 0x6B, 0x74, 0x45, 0xF9, 0x96, + 0x65, 0xD4, 0xE3, 0x56, 0xBC, 0x07, 0xD3, 0xEF, + 0xFD, 0x8F, 0xD6, 0x5A, 0xB9, 0xC7, 0x47, 0x16 + }, + { + 0x5B, 0x60, 0x12, 0x76, 0x20, 0x53, 0xB8, 0x73, + 0x4A, 0xF0, 0xE5, 0x55, 0xE6, 0xA2, 0xBB, 0x4F, + 0xD4, 0x84, 0x0A, 0xF3, 0xB0, 0x4F, 0xCF, 0x63, + 0x50, 0xA2, 0xB8, 0xA5, 0x1B, 0x67, 0x96, 0xAD + }, + { + 0xAB, 0x7A, 0xCC, 0xA5, 0xD7, 0x77, 0x10, 0xBA, + 0xD3, 0x7B, 0xA0, 0xFF, 0x4C, 0xEA, 0xE2, 0x7E, + 0x84, 0x71, 0x79, 0xF7, 0xFD, 0x7A, 0xEC, 0x88, + 0x69, 0xC6, 0x49, 0xB3, 0x3F, 0x8D, 0x25, 0x77 + }, + { + 0xFF, 0x77, 0x30, 0xB4, 0x74, 0xEC, 0x21, 0x45, + 0xA9, 0x2D, 0xD1, 0xCF, 0xFE, 0x45, 0xC3, 0x42, + 0xC6, 0xFD, 0x6B, 0xAC, 0x58, 0x0F, 0xF9, 0x5A, + 0x75, 0xED, 0xA3, 0xBF, 0x90, 0xEB, 0x4F, 0x01 + }, + { + 0xD1, 0x0F, 0x06, 0x1D, 0x5B, 0x9C, 0xB4, 0x4E, + 0xE0, 0x78, 0xA9, 0x6B, 0x33, 0x18, 0x57, 0x9E, + 0x5E, 0xF5, 0x0A, 0xEF, 0x3E, 0xD9, 0x6E, 0x4F, + 0x62, 0x14, 0x9B, 0x2E, 0x9F, 0x7C, 0x66, 0x0C + }, + { + 0x67, 0xD2, 0x2B, 0x8E, 0xDF, 0x20, 0x01, 0xD8, + 0x64, 0x22, 0x13, 0x6A, 0xC6, 0x51, 0x6C, 0xF3, + 0x9F, 0x7F, 0xC6, 0xA7, 0x02, 0x98, 0x92, 0xFD, + 0x75, 0xC9, 0x87, 0x90, 0x96, 0x4A, 0x72, 0x0B + }, + { + 0x7A, 0x5E, 0xC5, 0xBA, 0x76, 0x25, 0x9B, 0x07, + 0xB4, 0xDA, 0x03, 0xF3, 0x81, 0xFE, 0x7B, 0xEA, + 0x48, 0x65, 0xC8, 0x6C, 0x42, 0x4A, 0xBA, 0xA0, + 0xDD, 0x1E, 0xCF, 0x74, 0xF8, 0x7D, 0x2A, 0xC0 + }, + { + 0xE0, 0xFF, 0x60, 0xD6, 0x90, 0x29, 0xE6, 0xBD, + 0x1C, 0x15, 0x95, 0x3E, 0x91, 0x50, 0x9C, 0x0C, + 0x59, 0xED, 0x5D, 0xA5, 0x00, 0x01, 0x99, 0xF2, + 0x16, 0xD2, 0x9F, 0x96, 0x07, 0x9C, 0x2F, 0xEF + }, + { + 0xFC, 0x13, 0xEA, 0xD8, 0x41, 0x01, 0x8F, 0x59, + 0x90, 0x3B, 0x40, 0xF2, 0x02, 0x0C, 0x66, 0x38, + 0xA6, 0x6A, 0x54, 0xC3, 0xA3, 0x38, 0x41, 0x4D, + 0x97, 0xA5, 0xC3, 0x94, 0xF3, 0x26, 0x6F, 0x33 + }, + { + 0x0C, 0x2F, 0x62, 0xB8, 0x98, 0xFB, 0x2F, 0x63, + 0x61, 0x7E, 0x78, 0x73, 0x45, 0x26, 0x3C, 0xB9, + 0xCF, 0x60, 0x65, 0x4B, 0x55, 0x3B, 0x20, 0x3E, + 0xE4, 0x9D, 0xCB, 0xB8, 0xF2, 0xA6, 0xAF, 0xAC + }, + { + 0xD7, 0xD6, 0xCB, 0x55, 0x2A, 0xEB, 0x36, 0xEB, + 0x96, 0xB1, 0xD5, 0xE0, 0x52, 0xF8, 0xD9, 0x21, + 0xC3, 0x24, 0x5A, 0x97, 0x0D, 0x0B, 0xC8, 0x41, + 0x0C, 0xD6, 0x5E, 0xA1, 0x04, 0xC8, 0xE7, 0x79 + }, + { + 0xB7, 0x14, 0x1F, 0x30, 0x5E, 0xFD, 0xFE, 0xE5, + 0x56, 0xBD, 0x13, 0xE0, 0x40, 0x0D, 0x1E, 0x8C, + 0xFD, 0x65, 0x48, 0xBF, 0x81, 0xEE, 0x5D, 0x15, + 0x32, 0x7E, 0x49, 0x95, 0xCA, 0x8A, 0xD6, 0xFD + }, + { + 0xB6, 0xB6, 0x38, 0xD2, 0x2B, 0x7A, 0x12, 0x82, + 0x53, 0x74, 0xF7, 0x03, 0x48, 0xD7, 0x44, 0x8D, + 0x4E, 0x7D, 0x90, 0x8C, 0xF6, 0xE7, 0xBB, 0xEF, + 0x8C, 0x93, 0xEF, 0x67, 0x9B, 0x2A, 0x54, 0x78 + }, + { + 0x0D, 0xF4, 0x58, 0x56, 0x41, 0xFA, 0x09, 0xF6, + 0xCB, 0xA4, 0xCC, 0x16, 0x5A, 0x10, 0xAD, 0xDE, + 0x34, 0xF8, 0x0D, 0x42, 0x5A, 0x70, 0xDB, 0x67, + 0xE2, 0xFD, 0x23, 0x7B, 0x62, 0x7F, 0x43, 0x8A + }, + { + 0x10, 0x6B, 0x2B, 0x35, 0x4D, 0x95, 0xAC, 0xEC, + 0xD0, 0xD9, 0x58, 0x8F, 0xBC, 0x23, 0x1F, 0x8B, + 0xEA, 0x2E, 0x94, 0xEA, 0x66, 0x2D, 0xDD, 0x3F, + 0x13, 0x9E, 0x1B, 0x67, 0x87, 0x46, 0x1E, 0xED + }, + { + 0xAE, 0x5C, 0x69, 0xEE, 0xFE, 0x90, 0x89, 0xB2, + 0x9C, 0x6C, 0x1A, 0x23, 0x70, 0xD2, 0x05, 0x52, + 0xBA, 0x40, 0xC3, 0xD5, 0xE3, 0x71, 0x3C, 0x12, + 0xDE, 0xFC, 0xAE, 0x99, 0x7F, 0x43, 0x3E, 0xCD + }, + { + 0x1A, 0xAE, 0xF5, 0x5D, 0x4F, 0xA8, 0x92, 0xB6, + 0x35, 0xFB, 0x2A, 0x7A, 0x25, 0xF9, 0xA8, 0xE0, + 0x3B, 0x9F, 0xFB, 0x08, 0x2A, 0xE9, 0xC0, 0x7C, + 0x20, 0x42, 0xA0, 0x49, 0xC6, 0x51, 0x5E, 0x45 + }, + { + 0x29, 0x7D, 0xAA, 0xC4, 0xD5, 0x4D, 0xC4, 0x1C, + 0x83, 0xE3, 0x23, 0x94, 0x59, 0x9F, 0x17, 0x1C, + 0xDA, 0xA9, 0xDD, 0xB7, 0x17, 0x26, 0xDA, 0x4E, + 0xCE, 0x3C, 0xCF, 0x95, 0xC1, 0x1F, 0x56, 0xDF + }, + { + 0x2C, 0x45, 0xAC, 0xF4, 0x91, 0xEC, 0x2F, 0x4B, + 0x7E, 0x30, 0x9E, 0x7E, 0xDD, 0x81, 0x5B, 0xE5, + 0xA5, 0x4C, 0x44, 0x58, 0xD1, 0xA5, 0x7C, 0x4F, + 0x9B, 0x76, 0x3B, 0x0C, 0x67, 0x18, 0xD4, 0x3E + }, + { + 0x2F, 0x92, 0xF9, 0x01, 0x70, 0xD3, 0xAE, 0x95, + 0xAB, 0xFA, 0xC3, 0xA6, 0x98, 0x9A, 0x2A, 0x60, + 0xCB, 0x28, 0xB8, 0x58, 0x78, 0x2B, 0xE7, 0xEA, + 0x17, 0x9B, 0x48, 0xA7, 0x27, 0x6D, 0xD8, 0x60 + }, + { + 0xB4, 0x01, 0xE8, 0x4B, 0x15, 0xAC, 0xC4, 0x70, + 0x93, 0x6D, 0x6E, 0x37, 0xF7, 0x88, 0x83, 0x33, + 0x09, 0x27, 0x31, 0x13, 0x3B, 0x25, 0x1B, 0xEA, + 0x22, 0x16, 0x58, 0xCA, 0x19, 0xA7, 0x56, 0x69 + }, + { + 0xF8, 0xB3, 0x40, 0xD2, 0xB9, 0xB3, 0x3D, 0x43, + 0xA0, 0xA6, 0x6F, 0x34, 0x97, 0x82, 0x0A, 0xFA, + 0xAE, 0xE4, 0x34, 0xC4, 0xE3, 0xC0, 0xC1, 0x7E, + 0x89, 0x8B, 0x83, 0x01, 0xC5, 0x7A, 0x26, 0xBD + }, + { + 0x56, 0x6D, 0xA2, 0x83, 0x99, 0x03, 0x89, 0x13, + 0x8A, 0xA6, 0xF2, 0xAA, 0xA3, 0xB9, 0xE4, 0x0C, + 0xBF, 0x90, 0x84, 0x0E, 0xC7, 0x62, 0xBD, 0x96, + 0xB7, 0xE3, 0x3A, 0x31, 0x13, 0xB1, 0x01, 0x08 + }, + { + 0x34, 0x06, 0x72, 0xB7, 0x04, 0x67, 0x60, 0x42, + 0xC9, 0xBF, 0x3F, 0x33, 0x7B, 0xA7, 0x9F, 0x11, + 0x33, 0x6A, 0xEB, 0xB5, 0xEC, 0x5D, 0x31, 0xDF, + 0x54, 0xEB, 0x6A, 0xD3, 0xB0, 0x43, 0x04, 0x42 + }, + { + 0x50, 0x50, 0xB7, 0x3B, 0x93, 0x16, 0xEE, 0xA2, + 0xF1, 0x49, 0xBF, 0xFD, 0x22, 0xAE, 0xE3, 0x84, + 0xDC, 0x54, 0x03, 0xB1, 0x8E, 0x16, 0xFA, 0x88, + 0x82, 0x5E, 0x18, 0x16, 0x09, 0x49, 0x6F, 0xD2 + }, + { + 0x13, 0x65, 0xCC, 0x6F, 0xB9, 0x26, 0x0E, 0x86, + 0x88, 0x9B, 0x3A, 0xFB, 0xD1, 0xC8, 0xBC, 0x12, + 0x92, 0x31, 0x97, 0x71, 0x5D, 0xB2, 0x66, 0xCC, + 0x7A, 0x01, 0xCA, 0x57, 0x15, 0x9F, 0x75, 0x96 + }, + { + 0x29, 0x46, 0x6F, 0x51, 0xC0, 0x11, 0xFD, 0x10, + 0x18, 0x14, 0x94, 0xA9, 0x37, 0x9B, 0x61, 0x59, + 0xB8, 0x08, 0xAE, 0x0F, 0xCB, 0x01, 0x61, 0xF8, + 0xF0, 0x79, 0x09, 0xFF, 0x04, 0x1B, 0x19, 0x65 + }, + { + 0x65, 0x91, 0xA3, 0xC3, 0xC7, 0x67, 0xB3, 0x8D, + 0x80, 0x5E, 0xD3, 0xF7, 0xEB, 0x67, 0x63, 0xE8, + 0xB3, 0xD2, 0xD6, 0x42, 0xE7, 0x30, 0x77, 0x45, + 0xCD, 0x34, 0x18, 0xEF, 0xF6, 0x9A, 0x19, 0xED + }, + { + 0x1D, 0x84, 0xB0, 0x4B, 0x13, 0x38, 0xB0, 0xD2, + 0xE3, 0xC9, 0x8F, 0x7A, 0xEA, 0x3E, 0x98, 0xEF, + 0xFC, 0x53, 0x0A, 0x50, 0x44, 0xB9, 0x3B, 0x96, + 0xC6, 0x7E, 0xE3, 0x79, 0xD6, 0x2E, 0x81, 0x5F + }, + { + 0x6F, 0xA2, 0x95, 0x27, 0x25, 0x32, 0xE9, 0x83, + 0xE1, 0x66, 0xB1, 0x2E, 0x49, 0x99, 0xC0, 0x52, + 0xF8, 0x9D, 0x9F, 0x30, 0xAE, 0x14, 0x81, 0xF3, + 0xD6, 0x0E, 0xAE, 0x85, 0xF8, 0xEE, 0x17, 0x8A + }, + { + 0x4E, 0xD8, 0xCA, 0xA9, 0x8E, 0xC3, 0x9F, 0x6A, + 0x62, 0x9F, 0x9A, 0x65, 0x4A, 0x44, 0x7E, 0x7E, + 0x3E, 0x4F, 0xAE, 0xEC, 0xF3, 0x4D, 0xCF, 0x65, + 0x8D, 0x2D, 0x4B, 0x98, 0xB7, 0xA2, 0xEC, 0x1A + }, + { + 0xCF, 0xAB, 0x82, 0x99, 0xA0, 0xDA, 0x0C, 0x2A, + 0x7E, 0x8F, 0xF5, 0x4D, 0x0A, 0x67, 0x6D, 0x14, + 0x1A, 0xB2, 0x6B, 0xC0, 0x01, 0x2E, 0x5F, 0x66, + 0x8E, 0x85, 0xD8, 0x14, 0xBC, 0x98, 0x88, 0xB0 + }, + { + 0xA6, 0x26, 0x54, 0x3C, 0x27, 0x1F, 0xCC, 0xC3, + 0xE4, 0x45, 0x0B, 0x48, 0xD6, 0x6B, 0xC9, 0xCB, + 0xDE, 0xB2, 0x5E, 0x5D, 0x07, 0x7A, 0x62, 0x13, + 0xCD, 0x90, 0xCB, 0xBD, 0x0F, 0xD2, 0x20, 0x76 + }, + { + 0x05, 0xCF, 0x3A, 0x90, 0x04, 0x91, 0x16, 0xDC, + 0x60, 0xEF, 0xC3, 0x15, 0x36, 0xAA, 0xA3, 0xD1, + 0x67, 0x76, 0x29, 0x94, 0x89, 0x28, 0x76, 0xDC, + 0xB7, 0xEF, 0x3F, 0xBE, 0xCD, 0x74, 0x49, 0xC0 + }, + { + 0xCC, 0xD6, 0x1C, 0x92, 0x6C, 0xC1, 0xE5, 0xE9, + 0x12, 0x8C, 0x02, 0x1C, 0x0C, 0x6E, 0x92, 0xAE, + 0xFC, 0x4F, 0xFB, 0xDE, 0x39, 0x4D, 0xD6, 0xF3, + 0xB7, 0xD8, 0x7A, 0x8C, 0xED, 0x89, 0x60, 0x14 + }, + { + 0x3F, 0xFA, 0x4F, 0x6D, 0xAF, 0xA5, 0x7F, 0x1C, + 0x50, 0xF1, 0xAF, 0xA4, 0xF8, 0x12, 0x92, 0xAE, + 0x71, 0xA0, 0x6F, 0xE4, 0xF8, 0xFF, 0x46, 0xC5, + 0x1D, 0x32, 0xFF, 0x26, 0x13, 0x48, 0x9F, 0x2B + }, + { + 0x19, 0xD3, 0x92, 0x1C, 0xFC, 0x0F, 0x1A, 0x2B, + 0xB8, 0x13, 0xB3, 0xDF, 0xA9, 0x6D, 0xF9, 0x0E, + 0x2C, 0x6B, 0x87, 0xD7, 0x8E, 0x92, 0x38, 0xF8, + 0x5B, 0xBC, 0x77, 0xAE, 0x9A, 0x73, 0xF9, 0x8F + }, + { + 0xF5, 0xC9, 0x16, 0xFF, 0x2B, 0xAD, 0xDE, 0x3E, + 0x29, 0xA5, 0xF9, 0x40, 0x23, 0x3E, 0xA3, 0x40, + 0x07, 0xD8, 0xF1, 0x82, 0xA4, 0x8A, 0x80, 0x8B, + 0x46, 0xBB, 0x80, 0x58, 0x00, 0x3F, 0x19, 0x03 + }, + { + 0x6B, 0xA0, 0x7A, 0x1A, 0xF7, 0x58, 0xE6, 0x82, + 0xD3, 0xE0, 0x9A, 0xDD, 0x2D, 0x3D, 0xCD, 0xF3, + 0x5D, 0x95, 0x53, 0xF6, 0x79, 0x98, 0x54, 0xA2, + 0x7E, 0x53, 0x60, 0x63, 0xC5, 0x7F, 0x81, 0xA5 + }, + { + 0xB7, 0x83, 0x78, 0xFB, 0x44, 0x6C, 0x54, 0x4B, + 0x04, 0xD4, 0xA1, 0x52, 0xAC, 0x49, 0x57, 0x31, + 0x61, 0xB3, 0xDD, 0xEB, 0xF6, 0x93, 0x86, 0x77, + 0x0A, 0x55, 0xA7, 0xD4, 0x7B, 0x88, 0x0E, 0x5D + }, + { + 0xB5, 0x19, 0x53, 0x8F, 0xE1, 0x62, 0x6F, 0x0C, + 0x59, 0x59, 0x45, 0xAD, 0xA5, 0x8A, 0x34, 0x4F, + 0xAA, 0xC0, 0x06, 0x17, 0x61, 0xCC, 0x9D, 0x4A, + 0x84, 0x14, 0x19, 0xBD, 0x32, 0xEE, 0xC0, 0xD9 + }, + { + 0x96, 0xE4, 0x88, 0xB0, 0x27, 0x89, 0x64, 0x13, + 0xF4, 0x03, 0x4B, 0x03, 0x54, 0xF4, 0x84, 0x84, + 0xF6, 0xCF, 0xC1, 0x0F, 0x8E, 0xC5, 0x7B, 0x02, + 0x6F, 0xD2, 0x1A, 0x3B, 0x88, 0x36, 0x1A, 0x74 + }, + { + 0x77, 0x0C, 0x8A, 0x5F, 0x47, 0xBF, 0xD7, 0x69, + 0xCE, 0xD3, 0x5A, 0x71, 0xAF, 0xC3, 0xCA, 0x1F, + 0xF4, 0xC1, 0xF1, 0xE7, 0xCC, 0x3D, 0x23, 0x56, + 0xDE, 0x94, 0x50, 0x04, 0x36, 0x8D, 0x81, 0x45 + }, + { + 0x6D, 0xF9, 0xD8, 0xD0, 0xD3, 0xA8, 0xD9, 0x8C, + 0x83, 0x50, 0xD7, 0x16, 0x2B, 0xD1, 0x55, 0x79, + 0xD5, 0x70, 0x7A, 0xDD, 0x76, 0x11, 0xA0, 0x0E, + 0xEB, 0x6C, 0xA5, 0x74, 0x3E, 0xD7, 0x8C, 0xB7 + }, + { + 0x4F, 0x0F, 0xE8, 0xFC, 0x17, 0x90, 0x15, 0x91, + 0xCF, 0x34, 0x87, 0x30, 0xE1, 0x87, 0xDE, 0x52, + 0x3D, 0x6D, 0x75, 0x68, 0xC1, 0xFB, 0xD8, 0x24, + 0x85, 0x91, 0x39, 0x85, 0xEB, 0x67, 0x97, 0x1C + }, + { + 0x0E, 0xF3, 0xBB, 0x35, 0xCF, 0x37, 0x2B, 0xD9, + 0x4E, 0x3F, 0x80, 0xEE, 0xCE, 0xBD, 0x50, 0xEF, + 0x0D, 0x03, 0x08, 0xE0, 0x1E, 0x0E, 0xD6, 0xDE, + 0x0F, 0x5A, 0x8A, 0x8C, 0x81, 0x8A, 0x00, 0x74 + }, + { + 0xC0, 0x38, 0xD3, 0xE8, 0x09, 0xA5, 0xE3, 0xA5, + 0x8D, 0xB2, 0xF9, 0x1C, 0x15, 0xAE, 0x12, 0x43, + 0x95, 0x78, 0xF7, 0x54, 0x85, 0xCD, 0x84, 0xF5, + 0x56, 0xC6, 0x97, 0x1E, 0x8E, 0x25, 0x06, 0x20 + }, + { + 0xCE, 0x39, 0x9A, 0x0F, 0x08, 0x27, 0x7D, 0x8D, + 0x48, 0x16, 0x09, 0x50, 0x60, 0xEB, 0xBF, 0x33, + 0xDA, 0x01, 0x6F, 0xB4, 0x3A, 0x6C, 0x35, 0x6D, + 0x5A, 0x3F, 0xE4, 0xBB, 0x57, 0x4C, 0x5E, 0x7B + }, + { + 0x86, 0x9F, 0x7E, 0x31, 0x6B, 0x19, 0x4F, 0x95, + 0x31, 0xBC, 0xAF, 0x33, 0xF7, 0x91, 0x3F, 0x1B, + 0x9C, 0xFC, 0x6B, 0xB5, 0xDC, 0xF8, 0x6B, 0x69, + 0x2B, 0xF8, 0xCA, 0xB2, 0x9B, 0x8A, 0xA9, 0x6F + }, + { + 0x32, 0x7D, 0xFA, 0x46, 0x44, 0x59, 0xD9, 0xE4, + 0x8F, 0x5E, 0x55, 0xC7, 0xF5, 0xBA, 0xA6, 0x8F, + 0xC4, 0xA2, 0x5A, 0xD6, 0x22, 0xBC, 0x7B, 0xF0, + 0x1A, 0xCA, 0x82, 0xFD, 0x5E, 0x72, 0x31, 0x4C + }, + { + 0xE0, 0x0D, 0xAD, 0x31, 0x51, 0xB9, 0x08, 0x5E, + 0xAE, 0x78, 0x69, 0x84, 0xFE, 0x20, 0x73, 0x52, + 0x32, 0xB7, 0xFF, 0x7F, 0x1B, 0x1D, 0xB7, 0x96, + 0x1F, 0xD0, 0xD0, 0xE0, 0xF6, 0x05, 0xDB, 0x9A + }, + { + 0x07, 0x6F, 0x64, 0x45, 0x20, 0xD0, 0xB4, 0x73, + 0x2D, 0x6C, 0x53, 0x1C, 0x93, 0x49, 0x08, 0x90, + 0x26, 0x93, 0x6D, 0x99, 0x82, 0x04, 0x61, 0xDA, + 0x87, 0x74, 0x9A, 0x52, 0x0F, 0xBE, 0x90, 0xCE + }, + { + 0xB4, 0x41, 0x4C, 0xA1, 0x37, 0x3B, 0xE4, 0x6F, + 0x15, 0xCE, 0xA6, 0xB1, 0x25, 0x5A, 0x7D, 0x18, + 0x86, 0xC6, 0xFD, 0xB0, 0x8E, 0xD5, 0xAF, 0x96, + 0x57, 0xD5, 0xAA, 0xC3, 0x17, 0xDE, 0x3A, 0x29 + }, + { + 0x8D, 0x1A, 0xB0, 0x26, 0x3D, 0xAB, 0x7B, 0x86, + 0xEC, 0xEE, 0x21, 0x91, 0x62, 0xD9, 0x99, 0xA0, + 0x12, 0x45, 0x57, 0x22, 0x69, 0xDE, 0x31, 0x10, + 0x0E, 0x5D, 0x88, 0xFC, 0x1B, 0x1E, 0xAA, 0x69 + }, + { + 0xB4, 0x8D, 0x1C, 0x1F, 0x83, 0x92, 0x4A, 0x02, + 0xA2, 0x3E, 0x5E, 0x0F, 0x97, 0x1E, 0x16, 0xE8, + 0x7F, 0xC4, 0x88, 0x48, 0x53, 0x83, 0x34, 0x85, + 0x19, 0x1A, 0x2B, 0x60, 0x72, 0x2F, 0xE2, 0x69 + }, + { + 0xF2, 0xED, 0xD5, 0xF7, 0x50, 0xA2, 0x0A, 0x54, + 0x1D, 0x3F, 0x6B, 0xD5, 0xDF, 0x80, 0x83, 0x8F, + 0x11, 0x82, 0x5B, 0x25, 0xA9, 0x8F, 0x3D, 0xA5, + 0xE1, 0x52, 0x3B, 0xFF, 0x81, 0x3B, 0xB5, 0x60 + }, + { + 0x07, 0x16, 0x60, 0x04, 0xEF, 0x88, 0xE1, 0x61, + 0x4E, 0xBD, 0xC8, 0x87, 0xDF, 0xC7, 0xDA, 0x42, + 0xEB, 0xCD, 0xA0, 0x2D, 0x92, 0xC1, 0x2F, 0x18, + 0xD1, 0x18, 0x6C, 0xE3, 0xC9, 0x87, 0x10, 0xE4 + }, + { + 0x69, 0xF8, 0x3A, 0xA1, 0x01, 0xD6, 0x9B, 0x8F, + 0x12, 0x20, 0xDC, 0x1C, 0x53, 0x8D, 0x89, 0x34, + 0x45, 0x84, 0x20, 0xBE, 0x33, 0x5F, 0xEB, 0x46, + 0xFF, 0xC4, 0x7A, 0x2C, 0x8E, 0x2E, 0x6A, 0x8A + }, + { + 0xE1, 0x46, 0x9F, 0x16, 0xC6, 0xFC, 0xA1, 0x51, + 0x19, 0xA2, 0x72, 0xE5, 0x85, 0xC7, 0xF5, 0x04, + 0x21, 0xBC, 0x8A, 0x41, 0x4C, 0x86, 0x4F, 0xC7, + 0x6B, 0x01, 0x04, 0x8D, 0x4C, 0x6F, 0xC5, 0xD2 + }, + { + 0x67, 0x63, 0x34, 0x3A, 0x1C, 0x80, 0xF1, 0x92, + 0x83, 0xA8, 0x0A, 0xF8, 0x54, 0xE7, 0xE9, 0x06, + 0x5C, 0x2A, 0x83, 0x49, 0xEF, 0x11, 0xF1, 0x1B, + 0xFB, 0x76, 0xBA, 0x9F, 0x97, 0x04, 0x85, 0x39 + }, + { + 0x1A, 0xE3, 0xA0, 0xB8, 0xB2, 0xC7, 0x88, 0x5B, + 0xA3, 0x18, 0xAD, 0x6F, 0xD4, 0x49, 0xFC, 0x4D, + 0x7F, 0x84, 0x04, 0xB5, 0x9C, 0xF3, 0x27, 0x5F, + 0xCD, 0xEA, 0x13, 0x56, 0x34, 0x25, 0x77, 0x2D + }, + { + 0x3A, 0x71, 0x18, 0x4C, 0xBE, 0x8E, 0xB5, 0x8E, + 0x68, 0x12, 0xBA, 0x7A, 0x7A, 0x1D, 0xCA, 0x0C, + 0xA2, 0x8E, 0xEC, 0x63, 0x78, 0x2F, 0x2E, 0x6E, + 0x3C, 0x0B, 0x87, 0x07, 0x3F, 0x53, 0x3F, 0xFD + }, + { + 0x18, 0x4C, 0xCF, 0x2A, 0x52, 0xF3, 0x88, 0xC9, + 0xF8, 0x97, 0xA8, 0x57, 0xFE, 0x7C, 0xCE, 0xC2, + 0x95, 0x99, 0x11, 0xA8, 0xD1, 0xE0, 0x9E, 0xE8, + 0x80, 0x4D, 0x8D, 0x5D, 0x50, 0x8D, 0xD9, 0x18 + }, + { + 0xA6, 0x6D, 0x40, 0x9A, 0xF7, 0xAF, 0xD7, 0x5B, + 0xE8, 0x31, 0xDD, 0x49, 0x8C, 0x19, 0x6E, 0xF1, + 0x2C, 0x73, 0xC3, 0x11, 0x29, 0xEC, 0x02, 0xD5, + 0xF1, 0x2A, 0xB0, 0x2A, 0x2C, 0x63, 0xA2, 0x5E + }, + { + 0x58, 0xB3, 0x74, 0x97, 0xFC, 0xF0, 0xBE, 0x0E, + 0x0C, 0xF1, 0x73, 0x40, 0x45, 0xC2, 0x95, 0xB2, + 0x86, 0xC7, 0x6A, 0x7C, 0x04, 0x8E, 0x87, 0xC5, + 0x40, 0x28, 0xED, 0x36, 0x91, 0x5B, 0x5D, 0xF3 + }, + { + 0x2C, 0x73, 0x33, 0x54, 0x0A, 0x83, 0x2D, 0x64, + 0x45, 0x6E, 0x43, 0x05, 0x8C, 0x50, 0xD9, 0x3C, + 0x93, 0x2A, 0xD9, 0xB1, 0x8B, 0x3F, 0xC3, 0xA0, + 0x59, 0x92, 0x07, 0xCD, 0xA3, 0xB3, 0xC7, 0xA6 + }, + { + 0x3D, 0xC0, 0x62, 0xFF, 0xB5, 0x7D, 0x83, 0x5F, + 0xE3, 0xAA, 0x40, 0x94, 0x66, 0x82, 0x2F, 0x91, + 0x86, 0x91, 0x84, 0x23, 0x94, 0x75, 0x05, 0x16, + 0x5F, 0xDC, 0xDF, 0xB7, 0x30, 0x6F, 0x72, 0x59 + }, + { + 0x89, 0x20, 0x48, 0x44, 0xAC, 0xB9, 0x2F, 0x35, + 0x3B, 0xFC, 0x89, 0xA3, 0xCE, 0x8A, 0x98, 0x17, + 0x21, 0x9C, 0x10, 0x13, 0x85, 0xC5, 0x93, 0xCF, + 0x60, 0xE0, 0xBE, 0xFA, 0x96, 0x38, 0xE1, 0x4E + }, + { + 0x78, 0x2B, 0xA9, 0x02, 0xE9, 0x12, 0x32, 0x94, + 0x1C, 0x78, 0xC4, 0x9C, 0xD9, 0x77, 0x1A, 0x5D, + 0x99, 0x92, 0xF9, 0xB0, 0x7D, 0x9C, 0x0A, 0x2D, + 0xF8, 0x2D, 0x38, 0x5D, 0x15, 0xC4, 0x2B, 0xB3 + }, + { + 0x0D, 0xC3, 0xFF, 0x7D, 0xF0, 0xDF, 0xC0, 0x23, + 0x76, 0x3D, 0x76, 0x34, 0xE1, 0x8D, 0xA2, 0x73, + 0x93, 0xFC, 0x9F, 0xDB, 0x1C, 0x15, 0x46, 0x46, + 0x86, 0x10, 0x75, 0xF0, 0xA8, 0x7D, 0x0E, 0x90 + }, + { + 0xB9, 0x5C, 0x65, 0xFB, 0x6F, 0x25, 0x4E, 0xDB, + 0xDE, 0x8C, 0x03, 0x7D, 0x5C, 0x8B, 0x20, 0x39, + 0x34, 0x0F, 0x4A, 0xC2, 0xB0, 0x23, 0xA6, 0xAA, + 0x28, 0xA8, 0xFC, 0xD2, 0xD2, 0x68, 0x9C, 0xF4 + }, + { + 0x87, 0xE8, 0xF5, 0x15, 0x72, 0xA5, 0xD6, 0xA2, + 0x39, 0xF8, 0x5B, 0xC5, 0x3E, 0x11, 0x74, 0xE1, + 0x5B, 0xE1, 0x2F, 0xCD, 0xF1, 0x51, 0xA0, 0xB9, + 0xA2, 0xB4, 0x36, 0x40, 0xCA, 0xF7, 0x4C, 0x1D + }, + { + 0x2A, 0x6F, 0x3E, 0x46, 0x2C, 0x40, 0x5C, 0x35, + 0x4F, 0xE8, 0x0F, 0xCC, 0xCE, 0xD1, 0xC9, 0xBE, + 0x44, 0x32, 0x5D, 0x29, 0xE0, 0x7D, 0xA3, 0x09, + 0x60, 0xB6, 0x25, 0xA7, 0x6E, 0xA4, 0x2F, 0x83 + }, + { + 0x20, 0xB4, 0x6C, 0x8F, 0xBF, 0xCA, 0x97, 0x45, + 0x32, 0x62, 0x46, 0x0F, 0x84, 0x98, 0xA7, 0xE2, + 0xAF, 0x15, 0xAC, 0x79, 0xB5, 0x9D, 0xDF, 0xB0, + 0x27, 0xBB, 0x52, 0xF2, 0xD6, 0x8E, 0x8F, 0x51 + }, + { + 0x31, 0xB0, 0x76, 0x3C, 0xB9, 0xBA, 0x92, 0x40, + 0x3D, 0xCA, 0x1A, 0xBD, 0xD7, 0x34, 0x2D, 0x7D, + 0xE9, 0x4C, 0x58, 0x1E, 0x76, 0xF7, 0xC9, 0xA6, + 0x1E, 0x51, 0x59, 0x28, 0xE1, 0x0B, 0x4E, 0x77 + }, + { + 0xE1, 0x91, 0xE1, 0x17, 0x06, 0x3C, 0xFA, 0xC9, + 0x64, 0x2C, 0xD9, 0x3C, 0xB4, 0x2B, 0x39, 0xED, + 0xDD, 0x9E, 0x4A, 0xB6, 0x5F, 0x1D, 0x03, 0x97, + 0xE3, 0xE1, 0x7D, 0xD0, 0x4C, 0xAB, 0x11, 0x80 + }, + { + 0x22, 0x5A, 0x20, 0x21, 0x07, 0xA7, 0x47, 0x03, + 0xE0, 0x41, 0xC6, 0xCC, 0xA4, 0xEA, 0xCF, 0x4F, + 0x21, 0xEE, 0xA6, 0xF2, 0x2A, 0x14, 0x6D, 0x8D, + 0xA2, 0xAB, 0x8C, 0xF6, 0x19, 0x72, 0x29, 0xA5 + }, + { + 0xEF, 0xC4, 0x83, 0x6B, 0xE4, 0xAC, 0x3E, 0x97, + 0x91, 0xD2, 0xEC, 0x62, 0x22, 0x6E, 0x7D, 0xF6, + 0x41, 0x18, 0xF4, 0x56, 0x5C, 0x19, 0xE6, 0xC9, + 0xE8, 0x40, 0x63, 0xF5, 0x66, 0x1C, 0x7B, 0x2F + }, + { + 0x3A, 0x76, 0xB0, 0x15, 0x2C, 0x0E, 0x1D, 0x1F, + 0xD7, 0xAC, 0x9D, 0x91, 0xA2, 0x8A, 0x18, 0xE1, + 0xA4, 0xC0, 0x60, 0x80, 0xF2, 0xB7, 0xEC, 0xEF, + 0xB6, 0xEF, 0xFE, 0x28, 0xB8, 0xCF, 0xC7, 0x65 + }, + { + 0x0D, 0x46, 0xAD, 0x03, 0x90, 0x70, 0x11, 0x58, + 0x28, 0xF9, 0x4E, 0xB6, 0xB7, 0x29, 0x63, 0xE6, + 0x0A, 0x7D, 0x2D, 0xB7, 0xCA, 0x89, 0x91, 0xD2, + 0x25, 0xC3, 0x87, 0x7B, 0x14, 0x9B, 0x0A, 0x8A + }, + { + 0xE4, 0x4C, 0xFC, 0x42, 0x11, 0x8F, 0x09, 0x6B, + 0xFC, 0x51, 0x52, 0x1C, 0xB1, 0x8D, 0x5D, 0x65, + 0x25, 0x58, 0x6B, 0x98, 0x9F, 0x4E, 0xE2, 0xB8, + 0x28, 0xC5, 0x19, 0x9F, 0xEA, 0xB9, 0x4B, 0x82 + }, + { + 0x6D, 0x4B, 0xD2, 0xE0, 0x73, 0xEC, 0x49, 0x66, + 0x84, 0x7F, 0x5C, 0xBE, 0x88, 0xDD, 0xFA, 0xBA, + 0x2B, 0xE4, 0xCA, 0xF2, 0xF3, 0x33, 0x55, 0x2B, + 0x85, 0x53, 0xDA, 0x53, 0x34, 0x87, 0xC2, 0x5B + }, + { + 0xBB, 0xC4, 0x6D, 0xB4, 0x37, 0xD1, 0x07, 0xC9, + 0x67, 0xCA, 0x6D, 0x91, 0x45, 0x5B, 0xBD, 0xFE, + 0x05, 0x21, 0x18, 0xAB, 0xD1, 0xD0, 0x69, 0xF0, + 0x43, 0x59, 0x48, 0x7E, 0x13, 0xAE, 0xA0, 0xE1 + }, + { + 0xB9, 0x74, 0xC1, 0x4D, 0xB7, 0xD3, 0x17, 0x4D, + 0xD0, 0x60, 0x84, 0xBB, 0x30, 0x31, 0x08, 0xB2, + 0xF0, 0xDA, 0xF5, 0x0E, 0xCC, 0xC3, 0x29, 0x35, + 0x43, 0x79, 0x5C, 0x96, 0x36, 0xC6, 0x24, 0x82 + }, + { + 0x0E, 0xEE, 0x23, 0x5B, 0x06, 0x93, 0x6A, 0xED, + 0x71, 0x73, 0xC8, 0xC1, 0x9A, 0xA7, 0xC2, 0x17, + 0xB9, 0xEE, 0xDA, 0xEB, 0x1A, 0x88, 0xF3, 0x05, + 0x52, 0xE9, 0x22, 0x51, 0x45, 0x14, 0x9E, 0x82 + }, + { + 0x36, 0xD0, 0x89, 0xE0, 0x25, 0xB5, 0x68, 0x69, + 0x37, 0x74, 0x28, 0x25, 0xE6, 0xEE, 0x3D, 0x83, + 0xE7, 0xD7, 0xA5, 0x0C, 0x82, 0x3C, 0x82, 0x88, + 0x34, 0x60, 0xF3, 0x85, 0x14, 0x7D, 0xC1, 0x7B + }, + { + 0x77, 0xEE, 0x4F, 0xFC, 0x9F, 0x5D, 0xD6, 0x05, + 0x47, 0x0D, 0xC0, 0xE7, 0x4D, 0x6B, 0x17, 0xC5, + 0x13, 0x0D, 0x8B, 0x73, 0x91, 0x3F, 0x36, 0xD5, + 0xF8, 0x78, 0x7E, 0x61, 0x9A, 0x94, 0x7C, 0xA0 + }, + { + 0x0F, 0xE6, 0xC2, 0xAB, 0x75, 0x42, 0x33, 0x36, + 0x0D, 0x68, 0xB9, 0xAC, 0x80, 0xCD, 0x61, 0x18, + 0x4B, 0xFA, 0xA7, 0xD3, 0x56, 0x29, 0x41, 0x80, + 0x02, 0x5F, 0xE4, 0x06, 0x39, 0xC7, 0x6C, 0x36 + }, + { + 0x99, 0x60, 0x88, 0xC7, 0x94, 0x56, 0xEC, 0xDD, + 0xA1, 0xFB, 0xC0, 0x2E, 0xE1, 0xBA, 0x42, 0xD9, + 0x1D, 0x85, 0x8C, 0x31, 0x0A, 0x5A, 0x8B, 0x46, + 0x74, 0xFE, 0x6A, 0x7C, 0x14, 0x44, 0x14, 0xA1 + }, + { + 0x9E, 0x33, 0x8A, 0xED, 0x0B, 0xC7, 0x1C, 0x0C, + 0x97, 0xF1, 0x98, 0x55, 0xBF, 0x49, 0x17, 0x4F, + 0x70, 0xA9, 0xD7, 0x70, 0x14, 0x87, 0x36, 0x63, + 0x21, 0x34, 0x27, 0x50, 0x2B, 0xD8, 0x5D, 0x9F + }, + { + 0x4A, 0x84, 0x3D, 0x26, 0xAD, 0xEC, 0x52, 0x0E, + 0x4B, 0x5D, 0xBF, 0x01, 0x45, 0xCC, 0x4F, 0x50, + 0x24, 0xFA, 0xFC, 0xDC, 0x20, 0x25, 0x82, 0x4A, + 0x8C, 0x64, 0x65, 0x06, 0x17, 0x68, 0x7E, 0xE7 + }, + { + 0xC9, 0x16, 0x78, 0xC4, 0xA6, 0x4E, 0x2F, 0xA4, + 0xB7, 0x4D, 0xE6, 0x1A, 0xD0, 0xC0, 0x6F, 0xF0, + 0x6B, 0x5D, 0x67, 0x2F, 0xA7, 0xC6, 0x87, 0x7A, + 0x40, 0x14, 0xCE, 0x9E, 0x91, 0xBE, 0x38, 0xD7 + }, + { + 0xFF, 0x77, 0x77, 0x40, 0x5D, 0x32, 0x7A, 0xDB, + 0x58, 0x30, 0x1C, 0x71, 0x1E, 0xCD, 0xC2, 0xBC, + 0xE1, 0xBF, 0xA8, 0x29, 0xFF, 0xC9, 0xB1, 0x17, + 0xF2, 0x1A, 0x2B, 0x19, 0x8D, 0x0D, 0x68, 0x84 + }, + { + 0x0A, 0x8D, 0xDA, 0xF1, 0x72, 0x8C, 0x5C, 0xD9, + 0x3A, 0x25, 0x5D, 0x56, 0x23, 0xC3, 0xDA, 0xDA, + 0x2D, 0x3D, 0x05, 0x71, 0xBF, 0x14, 0x38, 0xAD, + 0xC8, 0xC9, 0x64, 0xA9, 0xAA, 0xD1, 0x18, 0xCB + }, + { + 0xC1, 0x33, 0xAB, 0xBD, 0x0D, 0x2D, 0x80, 0x8A, + 0x67, 0xB6, 0x74, 0x5B, 0x4B, 0x36, 0x50, 0xB4, + 0xA6, 0x4D, 0xC2, 0x76, 0xCF, 0x98, 0xE3, 0x03, + 0x57, 0xB6, 0xAB, 0xD5, 0xC1, 0xD2, 0x2A, 0x9B + }, + { + 0xC5, 0x9E, 0xE5, 0xC1, 0x96, 0xBA, 0x3C, 0xFE, + 0xF9, 0x40, 0x87, 0x79, 0x82, 0x07, 0xBD, 0xCE, + 0xF1, 0x39, 0xCE, 0x2C, 0xF7, 0x8D, 0xCE, 0xD6, + 0x19, 0x8F, 0x0F, 0xA3, 0xA4, 0x09, 0x13, 0x1C + }, + { + 0xC7, 0xFD, 0xAD, 0xE5, 0x9C, 0x46, 0x99, 0x38, + 0x5E, 0xBA, 0x59, 0xE7, 0x56, 0xC2, 0xB1, 0x71, + 0xB0, 0x23, 0xDE, 0xAE, 0x08, 0x2E, 0x5A, 0x6E, + 0x3B, 0xFB, 0xDC, 0x10, 0x73, 0xA3, 0x20, 0x03 + }, + { + 0x97, 0x53, 0x27, 0xC5, 0xF4, 0xDE, 0xC6, 0x41, + 0x4B, 0x6E, 0x00, 0xCB, 0x04, 0x23, 0x37, 0xB8, + 0xD2, 0xA6, 0x56, 0x46, 0x37, 0xA7, 0x44, 0x2A, + 0xEC, 0x7B, 0xE8, 0xF8, 0xC8, 0x9A, 0x2F, 0x1C + }, + { + 0xA2, 0xF7, 0x24, 0x6D, 0xF4, 0xA2, 0x4E, 0xFB, + 0xAC, 0xD3, 0xFD, 0x60, 0x68, 0x3A, 0xBC, 0x86, + 0x8B, 0xEF, 0x25, 0x32, 0x70, 0x52, 0xCF, 0x2F, + 0x1D, 0x93, 0xEC, 0xE4, 0xFF, 0xCD, 0x73, 0xC6 + }, + { + 0x49, 0x7F, 0xB2, 0xAC, 0xAC, 0xF1, 0x23, 0xF3, + 0x59, 0x5E, 0x40, 0xFC, 0x51, 0xA7, 0xBD, 0x24, + 0x45, 0x8B, 0xBC, 0xBA, 0x4A, 0x29, 0x40, 0xA5, + 0xCB, 0x03, 0xD6, 0x08, 0xFB, 0xDF, 0x28, 0x25 + }, + { + 0x0E, 0x97, 0xD2, 0x27, 0x93, 0xCE, 0x6F, 0x28, + 0x3D, 0x5C, 0x74, 0x0D, 0x30, 0x8A, 0x27, 0xAD, + 0x7C, 0x3B, 0x0D, 0x9A, 0xFC, 0xD3, 0xD9, 0xE9, + 0xB9, 0xCA, 0xC5, 0x6B, 0x10, 0x29, 0x0C, 0x8F + }, + { + 0x66, 0x30, 0xB3, 0x56, 0x18, 0xE7, 0x00, 0xD9, + 0x10, 0x68, 0x38, 0x93, 0x79, 0x5E, 0xF7, 0x0B, + 0xF0, 0x7E, 0xB1, 0x56, 0xF5, 0x5F, 0xFE, 0x3B, + 0x69, 0xAD, 0x88, 0xA4, 0xB8, 0xB0, 0xBF, 0xA1 + }, + { + 0x02, 0xF7, 0x42, 0xC6, 0xE9, 0x52, 0x78, 0x12, + 0x1A, 0x05, 0xE4, 0x42, 0x05, 0x44, 0x4F, 0xC5, + 0xEA, 0x6A, 0xF5, 0xE7, 0x41, 0xC5, 0x35, 0xBC, + 0x2C, 0xBC, 0x3B, 0x23, 0x5A, 0x2E, 0xA2, 0xB0 + }, + { + 0x46, 0x22, 0xF3, 0x6E, 0xB8, 0x98, 0x38, 0x3F, + 0x60, 0xD5, 0xBE, 0xD8, 0x09, 0xAC, 0x5C, 0x47, + 0x45, 0xC5, 0xD6, 0xAB, 0x84, 0xBC, 0xAD, 0xF7, + 0x9C, 0xF2, 0xA9, 0x6D, 0x4E, 0xC8, 0x88, 0x18 + }, + { + 0xCC, 0xD1, 0x1F, 0xAA, 0xA0, 0x58, 0x1E, 0xC3, + 0x2C, 0x3A, 0x40, 0x3F, 0x92, 0xEF, 0x43, 0xD5, + 0xDC, 0xF1, 0x95, 0xC1, 0xA1, 0x01, 0xDB, 0xFD, + 0x49, 0x5D, 0xBB, 0x4D, 0xCE, 0x80, 0x69, 0xE0 + }, + { + 0x06, 0x02, 0x4D, 0x6B, 0x07, 0xE0, 0x00, 0xBC, + 0xE6, 0x13, 0x47, 0x0A, 0x28, 0x80, 0x51, 0x9B, + 0x8B, 0xE4, 0xA3, 0x6B, 0xF3, 0x3C, 0x99, 0xC9, + 0x17, 0x89, 0x3E, 0xC7, 0x5D, 0xD9, 0x0F, 0xE3 + }, + { + 0xD9, 0x3A, 0xF9, 0x47, 0xB1, 0x46, 0x3A, 0x81, + 0x7D, 0xB4, 0x41, 0xA4, 0x74, 0x58, 0x8D, 0x6F, + 0x99, 0x6D, 0x24, 0x39, 0x83, 0xE8, 0x3C, 0x7E, + 0xEE, 0x90, 0xE1, 0xEF, 0xA4, 0x40, 0xD9, 0xBA + }, + { + 0x94, 0x89, 0x89, 0x45, 0xA7, 0xDB, 0x25, 0x9E, + 0x1B, 0x2E, 0x7C, 0xBE, 0xA4, 0x8A, 0xA0, 0xC6, + 0xD6, 0x57, 0x0D, 0x18, 0x17, 0x9F, 0x06, 0x18, + 0x47, 0x1C, 0x88, 0xF3, 0xEC, 0x3B, 0x0F, 0xC3 + }, + { + 0x4C, 0x2D, 0x93, 0x52, 0x56, 0x39, 0x2A, 0xA2, + 0xBE, 0x6E, 0x10, 0x78, 0xC0, 0x59, 0x38, 0x15, + 0xAB, 0xEF, 0x46, 0x9D, 0xE9, 0x69, 0xB5, 0x7B, + 0x88, 0x1B, 0x93, 0xAF, 0x55, 0x84, 0x65, 0xFA + }, + { + 0xAA, 0xC7, 0xBE, 0x16, 0xE5, 0x2F, 0x79, 0x0E, + 0x4F, 0xF7, 0x0B, 0x24, 0x01, 0x5C, 0xB1, 0x1B, + 0x40, 0x61, 0x6E, 0x94, 0xDB, 0x13, 0x88, 0x2B, + 0x41, 0xD3, 0xDD, 0x8C, 0x8C, 0x19, 0x52, 0xB7 + }, + { + 0x04, 0x34, 0xB4, 0x7C, 0x0E, 0xE7, 0xE6, 0xF5, + 0x39, 0x06, 0x79, 0x9A, 0x43, 0x20, 0x9D, 0x3F, + 0xC3, 0x7D, 0x3F, 0xD1, 0xF7, 0x45, 0x55, 0xDE, + 0x67, 0xAB, 0xAC, 0xB9, 0x51, 0xB0, 0x06, 0xF4 + }, + { + 0x04, 0x42, 0xFB, 0xDD, 0x5B, 0x58, 0x49, 0x6E, + 0xC7, 0x81, 0x59, 0xCC, 0xAA, 0x88, 0x7C, 0x88, + 0xA8, 0x61, 0xFC, 0xCA, 0x70, 0xE7, 0xAB, 0xC9, + 0x76, 0xF2, 0x4C, 0x11, 0x58, 0x8B, 0xE6, 0xEE + }, + { + 0xA7, 0x3E, 0x68, 0xBB, 0x18, 0xB0, 0x07, 0x64, + 0x8E, 0x76, 0xB5, 0x52, 0x8D, 0x1E, 0x50, 0xE7, + 0xFA, 0x65, 0x4D, 0xA3, 0x97, 0x0E, 0xC3, 0x49, + 0xBF, 0x59, 0x1A, 0x30, 0xD9, 0x32, 0xC8, 0xF6 + }, + { + 0x84, 0x9C, 0xF8, 0x73, 0x16, 0x2B, 0xA7, 0x2C, + 0x4B, 0x80, 0x08, 0xE6, 0x8F, 0x93, 0x2F, 0xB3, + 0xA0, 0x15, 0xA7, 0x4F, 0xCF, 0x95, 0x71, 0x98, + 0xD5, 0x6A, 0x0D, 0xC4, 0x62, 0x5A, 0x74, 0xF5 + }, + { + 0xA6, 0xDE, 0xC6, 0xFC, 0x89, 0x49, 0x34, 0x9C, + 0x4E, 0x9A, 0x9C, 0x62, 0x36, 0x87, 0xFB, 0xA4, + 0xC9, 0xB2, 0x75, 0xBD, 0xB2, 0x30, 0x50, 0x9B, + 0x72, 0xE3, 0xD6, 0x71, 0x19, 0x14, 0xE2, 0xD8 + }, + { + 0x58, 0xAF, 0xC2, 0xB2, 0x4A, 0x19, 0xFD, 0xBF, + 0x76, 0xA0, 0x9B, 0x70, 0xB1, 0xE3, 0xB7, 0x7F, + 0xCB, 0xD4, 0x06, 0x50, 0x01, 0xD9, 0x63, 0x66, + 0x40, 0xEB, 0x5A, 0x26, 0x28, 0xF4, 0x42, 0xCC + }, + { + 0x47, 0x3A, 0x43, 0xAA, 0x1D, 0x6A, 0x02, 0x87, + 0x67, 0x43, 0x2A, 0x83, 0x0A, 0xD1, 0x22, 0x1E, + 0x02, 0x9C, 0x58, 0x9A, 0xF9, 0xFD, 0x4D, 0x68, + 0xD5, 0x6C, 0x4F, 0xB8, 0x20, 0x25, 0x93, 0x52 + }, + { + 0xA0, 0xAE, 0xB4, 0xA5, 0xAD, 0x89, 0x9A, 0xF2, + 0xE2, 0x91, 0xB2, 0xE7, 0x9D, 0xBB, 0x6B, 0x0B, + 0xF5, 0x6B, 0x58, 0x44, 0x67, 0x6B, 0x95, 0x5D, + 0x94, 0x5B, 0x6C, 0x4A, 0xE1, 0xC0, 0x1E, 0xED + }, + { + 0xCF, 0xC3, 0x02, 0x9A, 0x9E, 0xEB, 0x15, 0x22, + 0x22, 0xD9, 0x66, 0x53, 0x49, 0x2E, 0x46, 0xCA, + 0x64, 0xCA, 0x4F, 0x0D, 0x64, 0x68, 0x30, 0x28, + 0xD3, 0xAE, 0xE5, 0xA4, 0x9C, 0xB4, 0x71, 0x63 + }, + { + 0x74, 0x67, 0xCF, 0x77, 0x61, 0xCD, 0x9F, 0x55, + 0x61, 0x8D, 0x30, 0xC9, 0xD8, 0xC5, 0xB4, 0x1E, + 0x47, 0x01, 0x51, 0x0C, 0x7D, 0x16, 0xAB, 0x4E, + 0x5D, 0x89, 0xA5, 0xD7, 0x71, 0x46, 0xB0, 0x92 + }, + { + 0xC0, 0x16, 0xD8, 0x42, 0x4E, 0x53, 0x1E, 0xFC, + 0x57, 0x37, 0xC0, 0x3F, 0xC9, 0x0A, 0x5E, 0xFC, + 0x9F, 0x90, 0x22, 0xE4, 0xD5, 0xBA, 0x3B, 0x06, + 0x95, 0xF7, 0xAE, 0x53, 0x82, 0x60, 0xC2, 0xEE + }, + { + 0x5D, 0x38, 0x11, 0x89, 0xE6, 0x00, 0x0F, 0xC1, + 0x17, 0xC7, 0x1F, 0x59, 0xF7, 0x86, 0xFB, 0x4B, + 0x79, 0xFD, 0xD4, 0xEC, 0x5D, 0x4C, 0xD3, 0x0A, + 0xAC, 0x21, 0x57, 0xF7, 0x5D, 0xEA, 0xD7, 0x78 + }, + { + 0x7C, 0x9C, 0xDD, 0x15, 0xC4, 0xC9, 0xAB, 0xCA, + 0xCB, 0xFE, 0x6F, 0x66, 0x4A, 0x7F, 0x5F, 0x8B, + 0x2E, 0x25, 0x91, 0x83, 0x29, 0x1A, 0xE5, 0xCC, + 0x91, 0x30, 0xA0, 0xB2, 0x41, 0xE5, 0x73, 0x7F + }, + { + 0xB8, 0x81, 0x31, 0x72, 0xF5, 0x21, 0x8A, 0xC3, + 0xEB, 0x68, 0x7B, 0xC4, 0xAF, 0xAF, 0xF8, 0x3F, + 0xBC, 0xA4, 0xE9, 0xC1, 0xA4, 0x62, 0x96, 0x33, + 0x01, 0xDD, 0x44, 0x59, 0x85, 0x01, 0x50, 0xA2 + }, + { + 0xE3, 0xD1, 0x30, 0xE3, 0x6A, 0x02, 0x8E, 0xA8, + 0x0C, 0x57, 0xA2, 0xAA, 0x48, 0x19, 0xFD, 0x34, + 0xE4, 0xDB, 0xBE, 0xB1, 0x4A, 0x49, 0x58, 0x94, + 0xB1, 0x5A, 0x87, 0x87, 0xDB, 0x1A, 0x9F, 0x9C + }, + { + 0xFF, 0xF1, 0xB4, 0x40, 0x0F, 0x48, 0x9E, 0x07, + 0xD2, 0x23, 0x51, 0xC1, 0xF0, 0x95, 0x65, 0xE2, + 0x65, 0xB6, 0x8A, 0xD2, 0x9F, 0x63, 0x29, 0x87, + 0x9E, 0x6B, 0x5F, 0x7F, 0x6B, 0x41, 0x93, 0x50 + }, + { + 0x55, 0x9E, 0xD5, 0xBB, 0x3E, 0x5F, 0x39, 0x85, + 0xFB, 0x57, 0x82, 0x28, 0xBF, 0x8C, 0x0F, 0x0B, + 0x17, 0x3F, 0x8D, 0x11, 0x53, 0xFA, 0xEB, 0x9F, + 0xEC, 0x75, 0x6F, 0xFD, 0x18, 0xA8, 0x72, 0x38 + }, + { + 0x88, 0x13, 0x12, 0x53, 0x01, 0x4D, 0x23, 0xC5, + 0xE3, 0x8E, 0x78, 0xBD, 0xA1, 0x94, 0x55, 0xD8, + 0xA0, 0x23, 0xBD, 0x7A, 0x7E, 0x72, 0x74, 0x57, + 0xA1, 0x52, 0xA8, 0x1D, 0x0B, 0x17, 0x18, 0xA7 + }, + { + 0xF4, 0xD3, 0xFA, 0xE7, 0xCD, 0xE6, 0xBB, 0x66, + 0x71, 0x5A, 0x19, 0x8F, 0xA4, 0x8D, 0x21, 0x0C, + 0x10, 0xF8, 0xDF, 0x32, 0x04, 0xAE, 0x5E, 0x33, + 0xA6, 0x02, 0x46, 0x7F, 0x1B, 0x62, 0x26, 0x85 + }, + { + 0xE6, 0x2B, 0x62, 0x2A, 0xC8, 0xA2, 0x13, 0x66, + 0xBF, 0x2D, 0xED, 0x30, 0xF4, 0x08, 0x2A, 0x53, + 0xE7, 0x7A, 0x9A, 0xA6, 0x96, 0xB1, 0xF3, 0xEE, + 0x8C, 0xFE, 0x99, 0xC5, 0x93, 0x12, 0xD9, 0xC7 + }, + { + 0x3D, 0x39, 0xFF, 0xA8, 0x55, 0x12, 0xC3, 0xC8, + 0x89, 0x0D, 0x4B, 0xDF, 0x31, 0x88, 0x9C, 0xA6, + 0x6E, 0x5C, 0xEC, 0xB6, 0x3C, 0xFE, 0xED, 0x57, + 0xB9, 0x26, 0x37, 0x08, 0xE7, 0x4C, 0x55, 0x0B + }, + { + 0xB1, 0x70, 0x3B, 0x8A, 0x00, 0xE2, 0x61, 0x24, + 0x97, 0xD1, 0x1C, 0x64, 0x9D, 0x15, 0x0A, 0x6C, + 0x96, 0x3B, 0xF4, 0xFD, 0x38, 0xFE, 0xB1, 0xC3, + 0x81, 0xFE, 0x0D, 0x9B, 0x04, 0xC0, 0x2B, 0x22 + }, + { + 0x12, 0xFB, 0xAD, 0x9D, 0x37, 0x82, 0x81, 0x2D, + 0x71, 0x17, 0x9A, 0x50, 0xFB, 0xD9, 0xB4, 0x56, + 0x6C, 0x7B, 0x06, 0xF5, 0xD7, 0x7C, 0x6F, 0x32, + 0x97, 0x17, 0xFB, 0x4A, 0xE2, 0xC5, 0xB4, 0xEC + }, + { + 0x76, 0x8B, 0x65, 0x9A, 0x82, 0x4B, 0x43, 0xF9, + 0xCA, 0x56, 0x60, 0xB9, 0xDD, 0xF0, 0x5F, 0x8B, + 0xA2, 0xBC, 0x49, 0x93, 0x86, 0x6B, 0x7C, 0x9B, + 0xE6, 0x87, 0x91, 0xF5, 0xB2, 0x46, 0x44, 0xB3 + }, + { + 0xC0, 0x20, 0x4E, 0x23, 0xCA, 0x86, 0xBE, 0x20, + 0x5E, 0xED, 0x0C, 0xC3, 0xDD, 0x72, 0x25, 0xCE, + 0x5F, 0xFE, 0x1E, 0xE1, 0x2D, 0xAC, 0xB9, 0x3C, + 0x5D, 0x06, 0x29, 0xB7, 0x69, 0x9C, 0xD7, 0x33 + }, + { + 0xF4, 0x32, 0x96, 0x96, 0x1F, 0x8E, 0xAE, 0xCC, + 0xD8, 0x54, 0x41, 0x3D, 0xC5, 0xAD, 0xDA, 0x62, + 0x39, 0x3A, 0x34, 0x46, 0x27, 0xE8, 0x6C, 0x06, + 0x6E, 0x79, 0x07, 0x55, 0x00, 0x40, 0x74, 0x4F + }, + { + 0x82, 0xF4, 0x46, 0x9E, 0x80, 0x78, 0x90, 0x21, + 0xC6, 0x1D, 0xB7, 0xE3, 0x2F, 0x36, 0xAC, 0xBE, + 0x59, 0x1A, 0x64, 0xF2, 0x60, 0x59, 0x26, 0x57, + 0x70, 0xAE, 0x65, 0x8D, 0x62, 0xBD, 0xE7, 0xEF + }, + { + 0x2A, 0x85, 0x67, 0x1A, 0x55, 0xC8, 0x9F, 0xA1, + 0x56, 0xE2, 0x96, 0xF7, 0x5D, 0xF1, 0xC7, 0xDB, + 0xAB, 0x17, 0x8E, 0xBB, 0xA6, 0x52, 0x04, 0xA7, + 0xE8, 0x17, 0x8C, 0x91, 0x6A, 0xD0, 0x87, 0xF8 + }, + { + 0x33, 0xE2, 0x45, 0x00, 0x28, 0x08, 0xF6, 0x93, + 0x4B, 0x9B, 0xE3, 0xA6, 0xFA, 0x8E, 0x86, 0x70, + 0xC9, 0x0B, 0xAA, 0x62, 0x57, 0x17, 0xB9, 0x20, + 0x1E, 0xB9, 0xB9, 0xDD, 0x91, 0x2F, 0x5C, 0xE2 + }, + { + 0x58, 0xEE, 0x5E, 0x79, 0x91, 0x84, 0xAD, 0x9D, + 0xA9, 0xA1, 0x7C, 0x5B, 0x46, 0xA4, 0x81, 0x0E, + 0x28, 0xBD, 0xD0, 0x8C, 0x35, 0x81, 0x63, 0x4C, + 0x83, 0x50, 0x30, 0x53, 0x9B, 0x79, 0x54, 0x4D + }, + { + 0x26, 0xD8, 0xFA, 0x08, 0xDB, 0x30, 0x8E, 0xDF, + 0x2F, 0x96, 0xF8, 0x2A, 0xF6, 0xB6, 0x0C, 0x17, + 0xD8, 0xF1, 0xFF, 0x85, 0x8C, 0x52, 0xF2, 0xD0, + 0xF3, 0x83, 0x10, 0x78, 0x12, 0x75, 0x26, 0xA3 + }, + { + 0x25, 0xA5, 0x8D, 0xF4, 0x03, 0x92, 0x47, 0xA2, + 0x2F, 0x68, 0xFF, 0x2B, 0x71, 0x76, 0x6B, 0x7B, + 0x56, 0x00, 0xDD, 0xF4, 0x01, 0xD9, 0x9F, 0xF2, + 0xC1, 0x95, 0x5A, 0xE7, 0xBB, 0x43, 0xE5, 0x6A + }, + { + 0xBE, 0x43, 0xE8, 0x68, 0x61, 0x60, 0xE9, 0x07, + 0xBA, 0x54, 0x7D, 0x5A, 0x87, 0x9D, 0x10, 0xF7, + 0x88, 0xAF, 0xC8, 0x42, 0xB8, 0xEB, 0xB9, 0xF3, + 0xF7, 0x88, 0x53, 0x25, 0x15, 0x91, 0x2A, 0xE4 + }, + { + 0xAA, 0x4A, 0xCB, 0x95, 0xD8, 0x79, 0x19, 0x2A, + 0x69, 0x08, 0xE8, 0x8A, 0xE3, 0xD6, 0x58, 0x9F, + 0x4E, 0x3E, 0xB3, 0xD4, 0xE0, 0x3A, 0x80, 0x6C, + 0xCD, 0xB9, 0xB5, 0xD6, 0xA9, 0x58, 0x6F, 0xDF + }, + { + 0x84, 0x66, 0xD5, 0xE4, 0x4C, 0xE9, 0x5B, 0x4F, + 0xA1, 0x79, 0x99, 0x24, 0x44, 0xB8, 0xC2, 0x48, + 0x5B, 0x88, 0x64, 0x48, 0xA6, 0xDC, 0xCF, 0xCF, + 0x0B, 0xC3, 0x0B, 0xC5, 0xF0, 0xF5, 0x6B, 0x01 + }, + { + 0x00, 0x56, 0xD7, 0xE0, 0xAC, 0x33, 0x35, 0x57, + 0x83, 0x65, 0x9B, 0x38, 0xEC, 0x8B, 0xEC, 0xCB, + 0xF7, 0x83, 0x93, 0x99, 0x67, 0xFE, 0x37, 0xAE, + 0xAC, 0xF3, 0x69, 0xDD, 0xB6, 0x70, 0xAD, 0xA0 + }, + { + 0x90, 0x4F, 0x42, 0xF3, 0x45, 0x53, 0x0A, 0xC8, + 0xA3, 0x52, 0xD0, 0x9B, 0x68, 0x72, 0xC5, 0xBC, + 0xA3, 0x66, 0x1A, 0xBC, 0xA6, 0xCA, 0x64, 0xC8, + 0x09, 0x9F, 0x2F, 0xB6, 0x86, 0x7C, 0x30, 0xFE + }, + { + 0xA8, 0xC3, 0xBF, 0x46, 0xF0, 0xB8, 0x8B, 0xBD, + 0x16, 0xFD, 0xA4, 0xA8, 0xB5, 0xCA, 0x81, 0xF5, + 0x24, 0x35, 0x20, 0xC3, 0x85, 0xD3, 0x8C, 0x0B, + 0x4D, 0x23, 0x52, 0xAB, 0x34, 0xEA, 0x35, 0xE6 + }, + { + 0x8D, 0x33, 0x17, 0xFC, 0x60, 0x6E, 0x56, 0x6D, + 0x30, 0x2E, 0xDA, 0xB5, 0x5E, 0x80, 0x16, 0x11, + 0xD8, 0xC1, 0x3F, 0x4A, 0x9A, 0x19, 0xD1, 0x85, + 0x97, 0x8D, 0xEF, 0x72, 0x83, 0x9C, 0xDA, 0xA3 + }, + { + 0x97, 0x38, 0x80, 0x11, 0xF5, 0x7A, 0x49, 0x86, + 0x90, 0xEC, 0x79, 0x88, 0xEF, 0xF9, 0x03, 0xFF, + 0x9B, 0x23, 0x58, 0xF5, 0xB6, 0x1B, 0xAA, 0x20, + 0xF7, 0x32, 0x90, 0xD6, 0x29, 0x6C, 0x1C, 0x0B + }, + { + 0xCF, 0xB8, 0x0C, 0xAB, 0x89, 0x90, 0x95, 0x08, + 0x09, 0x12, 0x3F, 0xBF, 0x85, 0xE9, 0x76, 0x45, + 0x47, 0x08, 0xE0, 0xAF, 0xED, 0x69, 0x8E, 0x33, + 0x52, 0xA3, 0x16, 0x35, 0x90, 0x9D, 0xB3, 0xE5 + }, + { + 0x0D, 0xAA, 0xCA, 0x55, 0x13, 0x2A, 0x23, 0x5B, + 0x83, 0x1A, 0x5E, 0xFF, 0x4E, 0xA4, 0x67, 0xCD, + 0x10, 0xAF, 0x44, 0x20, 0x08, 0x47, 0x73, 0x5A, + 0x1F, 0xFD, 0x51, 0xFA, 0x37, 0xEA, 0xA2, 0xA2 + }, + { + 0x69, 0xB2, 0x14, 0x97, 0xEB, 0xB8, 0x24, 0xBA, + 0x66, 0x53, 0x68, 0x18, 0x88, 0x25, 0xE6, 0xF6, + 0xF1, 0x4C, 0xF2, 0xC3, 0xF7, 0xB5, 0x53, 0x0B, + 0xB3, 0x4F, 0xA6, 0x58, 0xEE, 0xD9, 0xA7, 0x39 + }, + { + 0xB9, 0xA1, 0x9F, 0x50, 0x9B, 0xE0, 0x3F, 0xBC, + 0x40, 0xE2, 0x43, 0xA5, 0x8A, 0x3D, 0xED, 0x11, + 0xF0, 0xD5, 0x1F, 0x80, 0xE3, 0xE2, 0x9A, 0x50, + 0x56, 0x44, 0xCC, 0x05, 0x74, 0x38, 0x14, 0xEC + }, + { + 0xC4, 0xBC, 0xB2, 0x00, 0x25, 0x55, 0xD5, 0x44, + 0xFD, 0x0B, 0x02, 0x77, 0x06, 0x23, 0x89, 0x1E, + 0x70, 0xEE, 0xEC, 0x77, 0x44, 0x86, 0x5D, 0xD6, + 0x45, 0x5A, 0xD6, 0x65, 0xCC, 0x82, 0xE8, 0x61 + }, + { + 0x91, 0x2D, 0x24, 0xDC, 0x3D, 0x69, 0x23, 0xA4, + 0x83, 0xC2, 0x63, 0xEB, 0xA8, 0x1B, 0x7A, 0x87, + 0x97, 0xF2, 0x3C, 0xBF, 0x2F, 0x78, 0xB5, 0x1E, + 0x22, 0x26, 0x63, 0x9F, 0x84, 0xA5, 0x90, 0x47 + }, + { + 0x56, 0x82, 0x7A, 0x18, 0x88, 0x3A, 0xFD, 0xF9, + 0xCE, 0xEC, 0x56, 0x2B, 0x20, 0x66, 0xD8, 0xAC, + 0xB2, 0xC1, 0x95, 0x05, 0xEC, 0xE6, 0xF7, 0xA8, + 0x3E, 0x9F, 0x33, 0x46, 0xCB, 0xB8, 0x28, 0xC9 + }, + { + 0x25, 0x1D, 0x8D, 0x09, 0xFC, 0x48, 0xDD, 0x1D, + 0x6A, 0xF8, 0xFF, 0xDF, 0x39, 0x50, 0x91, 0xA4, + 0x6E, 0x05, 0xB8, 0xB7, 0xC5, 0xEC, 0x0C, 0x79, + 0xB6, 0x8A, 0x89, 0x04, 0xC8, 0x27, 0xBD, 0xEA + }, + { + 0xC2, 0xD1, 0x4D, 0x69, 0xFD, 0x0B, 0xBD, 0x1C, + 0x0F, 0xE8, 0xC8, 0x45, 0xD5, 0xFD, 0x6A, 0x8F, + 0x74, 0x01, 0x51, 0xB1, 0xD8, 0xEB, 0x4D, 0x26, + 0x36, 0x4B, 0xB0, 0x2D, 0xAE, 0x0C, 0x13, 0xBC + }, + { + 0x2E, 0x5F, 0xE2, 0x1F, 0x8F, 0x1B, 0x63, 0x97, + 0xA3, 0x8A, 0x60, 0x3D, 0x60, 0xB6, 0xF5, 0x3C, + 0x3B, 0x5D, 0xB2, 0x0A, 0xA5, 0x6C, 0x6D, 0x44, + 0xBE, 0xBD, 0x48, 0x28, 0xCE, 0x28, 0xF9, 0x0F + }, + { + 0x25, 0x05, 0x9F, 0x10, 0x60, 0x5E, 0x67, 0xAD, + 0xFE, 0x68, 0x13, 0x50, 0x66, 0x6E, 0x15, 0xAE, + 0x97, 0x6A, 0x5A, 0x57, 0x1C, 0x13, 0xCF, 0x5B, + 0xC8, 0x05, 0x3F, 0x43, 0x0E, 0x12, 0x0A, 0x52 + }, +}; + + + + +static const uint8_t blake2sp_keyed_kat[KAT_LENGTH][BLAKE2S_OUTBYTES] = +{ + { + 0x71, 0x5C, 0xB1, 0x38, 0x95, 0xAE, 0xB6, 0x78, + 0xF6, 0x12, 0x41, 0x60, 0xBF, 0xF2, 0x14, 0x65, + 0xB3, 0x0F, 0x4F, 0x68, 0x74, 0x19, 0x3F, 0xC8, + 0x51, 0xB4, 0x62, 0x10, 0x43, 0xF0, 0x9C, 0xC6 + }, + { + 0x40, 0x57, 0x8F, 0xFA, 0x52, 0xBF, 0x51, 0xAE, + 0x18, 0x66, 0xF4, 0x28, 0x4D, 0x3A, 0x15, 0x7F, + 0xC1, 0xBC, 0xD3, 0x6A, 0xC1, 0x3C, 0xBD, 0xCB, + 0x03, 0x77, 0xE4, 0xD0, 0xCD, 0x0B, 0x66, 0x03 + }, + { + 0x67, 0xE3, 0x09, 0x75, 0x45, 0xBA, 0xD7, 0xE8, + 0x52, 0xD7, 0x4D, 0x4E, 0xB5, 0x48, 0xEC, 0xA7, + 0xC2, 0x19, 0xC2, 0x02, 0xA7, 0xD0, 0x88, 0xDB, + 0x0E, 0xFE, 0xAC, 0x0E, 0xAC, 0x30, 0x42, 0x49 + }, + { + 0x8D, 0xBC, 0xC0, 0x58, 0x9A, 0x3D, 0x17, 0x29, + 0x6A, 0x7A, 0x58, 0xE2, 0xF1, 0xEF, 0xF0, 0xE2, + 0xAA, 0x42, 0x10, 0xB5, 0x8D, 0x1F, 0x88, 0xB8, + 0x6D, 0x7B, 0xA5, 0xF2, 0x9D, 0xD3, 0xB5, 0x83 + }, + { + 0xA9, 0xA9, 0x65, 0x2C, 0x8C, 0x67, 0x75, 0x94, + 0xC8, 0x72, 0x12, 0xD8, 0x9D, 0x5A, 0x75, 0xFB, + 0x31, 0xEF, 0x4F, 0x47, 0xC6, 0x58, 0x2C, 0xDE, + 0x5F, 0x1E, 0xF6, 0x6B, 0xD4, 0x94, 0x53, 0x3A + }, + { + 0x05, 0xA7, 0x18, 0x0E, 0x59, 0x50, 0x54, 0x73, + 0x99, 0x48, 0xC5, 0xE3, 0x38, 0xC9, 0x5F, 0xE0, + 0xB7, 0xFC, 0x61, 0xAC, 0x58, 0xA7, 0x35, 0x74, + 0x74, 0x56, 0x33, 0xBB, 0xC1, 0xF7, 0x70, 0x31 + }, + { + 0x81, 0x4D, 0xE8, 0x31, 0x53, 0xB8, 0xD7, 0x5D, + 0xFA, 0xDE, 0x29, 0xFD, 0x39, 0xAC, 0x72, 0xDD, + 0x09, 0xCA, 0x0F, 0x9B, 0xC8, 0xB7, 0xAB, 0x6A, + 0x06, 0xBA, 0xEE, 0x7D, 0xD0, 0xF9, 0xF0, 0x83 + }, + { + 0xDF, 0xD4, 0x19, 0x44, 0x91, 0x29, 0xFF, 0x60, + 0x4F, 0x0A, 0x14, 0x8B, 0x4C, 0x7D, 0x68, 0xF1, + 0x17, 0x4F, 0x7D, 0x0F, 0x8C, 0x8D, 0x2C, 0xE7, + 0x7F, 0x44, 0x8F, 0xD3, 0x41, 0x9C, 0x6F, 0xB0 + }, + { + 0xB9, 0xED, 0x22, 0xE7, 0xDD, 0x8D, 0xD1, 0x4E, + 0xE8, 0xC9, 0x5B, 0x20, 0xE7, 0x63, 0x2E, 0x85, + 0x53, 0xA2, 0x68, 0xD9, 0xFF, 0x86, 0x33, 0xED, + 0x3C, 0x21, 0xD1, 0xB8, 0xC9, 0xA7, 0x0B, 0xE1 + }, + { + 0x95, 0xF0, 0x31, 0x67, 0x1A, 0x4E, 0x3C, 0x54, + 0x44, 0x1C, 0xEE, 0x9D, 0xBE, 0xF4, 0xB7, 0xAC, + 0xA4, 0x46, 0x18, 0xA3, 0xA3, 0x33, 0xAD, 0x74, + 0x06, 0xD1, 0x97, 0xAC, 0x5B, 0xA0, 0x79, 0x1A + }, + { + 0xE2, 0x92, 0x5B, 0x9D, 0x5C, 0xA0, 0xFF, 0x62, + 0x88, 0xC5, 0xEA, 0x1A, 0xF2, 0xD2, 0x2B, 0x0A, + 0x6B, 0x79, 0xE2, 0xDA, 0xE0, 0x8B, 0xFD, 0x36, + 0xC3, 0xBE, 0x10, 0xBB, 0x8D, 0x71, 0xD8, 0x39 + }, + { + 0x16, 0x24, 0x9C, 0x74, 0x4E, 0x49, 0x51, 0x45, + 0x1D, 0x4C, 0x89, 0x4F, 0xB5, 0x9A, 0x3E, 0xCB, + 0x3F, 0xBF, 0xB7, 0xA4, 0x5F, 0x96, 0xF8, 0x5D, + 0x15, 0x80, 0xAC, 0x0B, 0x84, 0x2D, 0x96, 0xDA + }, + { + 0x43, 0x2B, 0xC9, 0x1C, 0x52, 0xAC, 0xEB, 0x9D, + 0xAE, 0xD8, 0x83, 0x28, 0x81, 0x64, 0x86, 0x50, + 0xC1, 0xB8, 0x1D, 0x11, 0x7A, 0xBD, 0x68, 0xE0, + 0x84, 0x51, 0x50, 0x8A, 0x63, 0xBE, 0x00, 0x81 + }, + { + 0xCD, 0xE8, 0x20, 0x2B, 0xCF, 0xA3, 0xF3, 0xE9, + 0x5D, 0x79, 0xBA, 0xCC, 0x16, 0x5D, 0x52, 0x70, + 0x0E, 0xF7, 0x1D, 0x87, 0x4A, 0x3C, 0x63, 0x7E, + 0x63, 0x4F, 0x64, 0x44, 0x73, 0x72, 0x0D, 0x6B + }, + { + 0x16, 0x21, 0x62, 0x1F, 0x5C, 0x3E, 0xE4, 0x46, + 0x89, 0x9D, 0x3C, 0x8A, 0xAE, 0x49, 0x17, 0xB1, + 0xE6, 0xDB, 0x4A, 0x0E, 0xD0, 0x42, 0x31, 0x5F, + 0xB2, 0xC1, 0x74, 0x82, 0x5E, 0x0A, 0x18, 0x19 + }, + { + 0x33, 0x6E, 0x8E, 0xBC, 0x71, 0xE2, 0x09, 0x5C, + 0x27, 0xF8, 0x64, 0xA3, 0x12, 0x1E, 0xFD, 0x0F, + 0xAA, 0x7A, 0x41, 0x28, 0x57, 0x25, 0xA5, 0x92, + 0xF6, 0x1B, 0xED, 0xED, 0x9D, 0xDE, 0x86, 0xED + }, + { + 0x07, 0x9B, 0xE0, 0x41, 0x0E, 0x78, 0x9B, 0x36, + 0xEE, 0x7F, 0x55, 0xC1, 0x9F, 0xAA, 0xC6, 0x91, + 0x65, 0x6E, 0xB0, 0x52, 0x1F, 0x42, 0x94, 0x9B, + 0x84, 0xEE, 0x29, 0xFE, 0x2A, 0x0E, 0x7F, 0x36 + }, + { + 0x17, 0x27, 0x0C, 0x4F, 0x34, 0x88, 0x08, 0x2D, + 0x9F, 0xF9, 0x93, 0x7E, 0xAB, 0x3C, 0xA9, 0x9C, + 0x97, 0xC5, 0xB4, 0x59, 0x61, 0x47, 0x37, 0x2D, + 0xD4, 0xE9, 0x8A, 0xCF, 0x13, 0xDB, 0x28, 0x10 + }, + { + 0x18, 0x3C, 0x38, 0x75, 0x4D, 0x03, 0x41, 0xCE, + 0x07, 0xC1, 0x7A, 0x6C, 0xB6, 0xC2, 0xFD, 0x8B, + 0xBC, 0xC1, 0x40, 0x4F, 0xDD, 0x01, 0x41, 0x99, + 0xC7, 0x8B, 0xE1, 0xA9, 0x75, 0x59, 0xA9, 0x28 + }, + { + 0x6E, 0x52, 0xD7, 0x28, 0xA4, 0x05, 0xA6, 0xE1, + 0xF8, 0x75, 0x87, 0xBB, 0xC2, 0xAC, 0x91, 0xC5, + 0xC0, 0x9B, 0x2D, 0x82, 0x8A, 0xC8, 0x1E, 0x5C, + 0x4A, 0x81, 0xD0, 0x3D, 0xD4, 0xAA, 0x8D, 0x5C + }, + { + 0xF4, 0xE0, 0x8E, 0x05, 0x9B, 0x74, 0x14, 0x4B, + 0xF9, 0x48, 0x14, 0x6D, 0x14, 0xA2, 0xC8, 0x1E, + 0x46, 0xDC, 0x15, 0xFF, 0x26, 0xEB, 0x52, 0x34, + 0x4C, 0xDD, 0x47, 0x4A, 0xBE, 0xA1, 0x4B, 0xC0 + }, + { + 0x0F, 0x2E, 0x0A, 0x10, 0x0E, 0xD8, 0xA1, 0x17, + 0x85, 0x96, 0x2A, 0xD4, 0x59, 0x6A, 0xF9, 0x55, + 0xE3, 0x0B, 0x9A, 0xEF, 0x93, 0x0A, 0x24, 0x8D, + 0xA9, 0x32, 0x2B, 0x70, 0x2D, 0x4B, 0x68, 0x72 + }, + { + 0x51, 0x90, 0xFC, 0xC7, 0x32, 0xF4, 0x04, 0xAA, + 0xD4, 0x36, 0x4A, 0xC7, 0x96, 0x0C, 0xFD, 0x5B, + 0x4E, 0x34, 0x86, 0x29, 0xC3, 0x72, 0xEE, 0xB3, + 0x25, 0xB5, 0xC6, 0xC7, 0xCB, 0xCE, 0x59, 0xAB + }, + { + 0xC0, 0xC4, 0xCB, 0x86, 0xEA, 0x25, 0xEA, 0x95, + 0x7E, 0xEC, 0x5B, 0x22, 0xD2, 0x55, 0x0A, 0x16, + 0x49, 0xE6, 0xDF, 0xFA, 0x31, 0x6B, 0xB8, 0xF4, + 0xC9, 0x1B, 0x8F, 0xF7, 0xA2, 0x4B, 0x25, 0x31 + }, + { + 0x2C, 0x9E, 0xDA, 0x13, 0x5A, 0x30, 0xAE, 0xCA, + 0xF3, 0xAC, 0xB3, 0xD2, 0x3A, 0x30, 0x35, 0xFB, + 0xAB, 0xBA, 0x98, 0x33, 0x31, 0x65, 0xD8, 0x7F, + 0xCB, 0xF8, 0xFE, 0x10, 0x33, 0x6E, 0xCF, 0x20 + }, + { + 0x3C, 0xD6, 0x69, 0xE8, 0xD5, 0x62, 0x62, 0xA2, + 0x37, 0x13, 0x67, 0x22, 0x4D, 0xAE, 0x6D, 0x75, + 0x9E, 0xE1, 0x52, 0xC3, 0x15, 0x33, 0xB2, 0x63, + 0xFA, 0x2E, 0x64, 0x92, 0x08, 0x77, 0xB2, 0xA7 + }, + { + 0x18, 0xA9, 0xA0, 0xC2, 0xD0, 0xEA, 0x6C, 0x3B, + 0xB3, 0x32, 0x83, 0x0F, 0x89, 0x18, 0xB0, 0x68, + 0x4F, 0x5D, 0x39, 0x94, 0xDF, 0x48, 0x67, 0x46, + 0x2D, 0xD0, 0x6E, 0xF0, 0x86, 0x24, 0x24, 0xCC + }, + { + 0x73, 0x90, 0xEA, 0x41, 0x04, 0xA9, 0xF4, 0xEE, + 0xA9, 0x0F, 0x81, 0xE2, 0x6A, 0x12, 0x9D, 0xCF, + 0x9F, 0x4A, 0xF3, 0x83, 0x52, 0xD9, 0xCB, 0x6A, + 0x81, 0x2C, 0xC8, 0x05, 0x69, 0x09, 0x05, 0x0E + }, + { + 0xE4, 0x9E, 0x01, 0x14, 0xC6, 0x29, 0xB4, 0x94, + 0xB1, 0x1E, 0xA9, 0x8E, 0xCD, 0x40, 0x32, 0x73, + 0x1F, 0x15, 0x3B, 0x46, 0x50, 0xAC, 0xAC, 0xD7, + 0xE0, 0xF6, 0xE7, 0xDE, 0x3D, 0xF0, 0x19, 0x77 + }, + { + 0x27, 0xC5, 0x70, 0x2B, 0xE1, 0x04, 0xB3, 0xA9, + 0x4F, 0xC4, 0x34, 0x23, 0xAE, 0xEE, 0x83, 0xAC, + 0x3C, 0xA7, 0x3B, 0x7F, 0x87, 0x83, 0x9A, 0x6B, + 0x2E, 0x29, 0x60, 0x79, 0x03, 0xB7, 0xF2, 0x87 + }, + { + 0x81, 0xD2, 0xE1, 0x2E, 0xB2, 0xF4, 0x27, 0x60, + 0xC6, 0xE3, 0xBA, 0xA7, 0x8F, 0x84, 0x07, 0x3A, + 0xE6, 0xF5, 0x61, 0x60, 0x70, 0xFE, 0x25, 0xBE, + 0xDE, 0x7C, 0x7C, 0x82, 0x48, 0xAB, 0x1F, 0xBA + }, + { + 0xFA, 0xB2, 0x35, 0xD5, 0x93, 0x48, 0xAB, 0x8C, + 0xE4, 0x9B, 0xEC, 0x77, 0xC0, 0xF1, 0x93, 0x28, + 0xFD, 0x04, 0x5D, 0xFD, 0x60, 0x8A, 0x53, 0x03, + 0x36, 0xDF, 0x4F, 0x94, 0xE1, 0x72, 0xA5, 0xC8 + }, + { + 0x8A, 0xAA, 0x8D, 0x80, 0x5C, 0x58, 0x88, 0x1F, + 0xF3, 0x79, 0xFB, 0xD4, 0x2C, 0x6B, 0xF6, 0xF1, + 0x4C, 0x6C, 0x73, 0xDF, 0x80, 0x71, 0xB3, 0xB2, + 0x28, 0x98, 0x11, 0x09, 0xCC, 0xC0, 0x15, 0xF9 + }, + { + 0x91, 0xFD, 0xD2, 0x62, 0x20, 0x39, 0x16, 0x39, + 0x47, 0x40, 0x95, 0x2B, 0xCE, 0x72, 0xB6, 0x4B, + 0xAB, 0xB6, 0xF7, 0x21, 0x34, 0x4D, 0xEE, 0x82, + 0x50, 0xBF, 0x0E, 0x46, 0xF1, 0xBA, 0x18, 0x8F + }, + { + 0xF7, 0xE5, 0x7B, 0x8F, 0x85, 0xF4, 0x7D, 0x59, + 0x03, 0xAD, 0x4C, 0xCB, 0x8A, 0xF6, 0x2A, 0x3E, + 0x85, 0x8A, 0xAB, 0x2B, 0x8C, 0xC2, 0x26, 0x49, + 0x4F, 0x7B, 0x00, 0xBE, 0xDB, 0xF5, 0xB0, 0xD0 + }, + { + 0xF7, 0x6F, 0x21, 0xAD, 0xDA, 0xE9, 0x6A, 0x96, + 0x46, 0xFC, 0x06, 0xF9, 0xBF, 0x52, 0xAE, 0x08, + 0x48, 0xF1, 0x8C, 0x35, 0x26, 0xB1, 0x29, 0xE1, + 0x5B, 0x2C, 0x35, 0x5E, 0x2E, 0x79, 0xE5, 0xDA + }, + { + 0x8A, 0xEB, 0x1C, 0x79, 0x5F, 0x34, 0x90, 0x01, + 0x5E, 0xF4, 0xCD, 0x61, 0xA2, 0x80, 0x7B, 0x23, + 0x0E, 0xFD, 0xC8, 0x46, 0x01, 0x73, 0xDA, 0xD0, + 0x26, 0xA4, 0xA0, 0xFC, 0xC2, 0xFB, 0xF2, 0x2A + }, + { + 0xC5, 0x64, 0xFF, 0xC6, 0x23, 0x07, 0x77, 0x65, + 0xBB, 0x97, 0x87, 0x58, 0x56, 0x54, 0xCE, 0x74, + 0x5D, 0xBD, 0x10, 0x8C, 0xEF, 0x24, 0x8A, 0xB0, + 0x0A, 0xD1, 0xA2, 0x64, 0x7D, 0x99, 0x03, 0x87 + }, + { + 0xFE, 0x89, 0x42, 0xA3, 0xE5, 0xF5, 0xE8, 0xCD, + 0x70, 0x51, 0x04, 0xF8, 0x82, 0x10, 0x72, 0x6E, + 0x53, 0xDD, 0x7E, 0xB3, 0xF9, 0xA2, 0x02, 0xBF, + 0x93, 0x14, 0xB3, 0xB9, 0x06, 0x5E, 0xB7, 0x12 + }, + { + 0xDC, 0x29, 0x53, 0x59, 0xD4, 0x36, 0xEE, 0xA7, + 0x80, 0x84, 0xE7, 0xB0, 0x77, 0xFE, 0x09, 0xB1, + 0x9C, 0x5B, 0xF3, 0xD2, 0xA7, 0x96, 0xDA, 0xB0, + 0x19, 0xE4, 0x20, 0x05, 0x99, 0xFD, 0x82, 0x02 + }, + { + 0x70, 0xB3, 0xF7, 0x2F, 0x74, 0x90, 0x32, 0xE2, + 0x5E, 0x38, 0x3B, 0x96, 0x43, 0x78, 0xEA, 0x1C, + 0x54, 0x3E, 0x9C, 0x15, 0xDE, 0x3A, 0x27, 0xD8, + 0x6D, 0x2A, 0x9D, 0x22, 0x31, 0xEF, 0xF4, 0x8A + }, + { + 0x79, 0x82, 0xB5, 0x4C, 0x08, 0xDB, 0x2B, 0xFB, + 0x6F, 0x45, 0xF3, 0x5B, 0xC3, 0x23, 0xBC, 0x09, + 0x37, 0x79, 0xB6, 0xBB, 0x0E, 0x3E, 0xEA, 0x3E, + 0x8C, 0x98, 0xB1, 0xDE, 0x99, 0xD3, 0xC5, 0x5E + }, + { + 0x75, 0xE4, 0x16, 0x22, 0x57, 0x01, 0x4B, 0xED, + 0xCC, 0x05, 0xC2, 0x94, 0x4D, 0xCE, 0x0D, 0xF0, + 0xC3, 0x5E, 0xBA, 0x13, 0x19, 0x54, 0x06, 0x4F, + 0x6E, 0x4E, 0x09, 0x5F, 0xD0, 0x84, 0x45, 0xEE + }, + { + 0x4A, 0x12, 0x9E, 0xA6, 0xCD, 0xBA, 0xBC, 0x2D, + 0x39, 0x24, 0x79, 0x37, 0x2F, 0x97, 0x5B, 0x9C, + 0xF5, 0xA1, 0xB7, 0xDE, 0xB6, 0x9A, 0x32, 0x66, + 0xF0, 0x3E, 0xBC, 0x6D, 0x11, 0x13, 0x93, 0xC4 + }, + { + 0x8F, 0xED, 0x70, 0xF2, 0x79, 0x55, 0xDC, 0x8A, + 0xD9, 0xF1, 0xB7, 0xB3, 0xF6, 0xF5, 0xDF, 0xBD, + 0x96, 0x2A, 0x33, 0x59, 0x2B, 0x42, 0xDE, 0x85, + 0x6D, 0x42, 0x1E, 0x29, 0x12, 0xBA, 0xB8, 0x6B + }, + { + 0xE2, 0xF2, 0x06, 0x60, 0x37, 0x6F, 0x2B, 0x18, + 0x39, 0x66, 0x7C, 0xBF, 0xE5, 0xE1, 0x6E, 0xF0, + 0x75, 0xAC, 0x39, 0x43, 0x64, 0x4F, 0x35, 0x32, + 0x28, 0x2F, 0x8B, 0xB0, 0x72, 0x3B, 0x99, 0x86 + }, + { + 0xAB, 0xF8, 0x4C, 0x91, 0x3A, 0x83, 0xDF, 0x98, + 0xC7, 0x00, 0x29, 0x81, 0x9C, 0x06, 0x5F, 0x6D, + 0x6D, 0xE4, 0xF6, 0xD4, 0x3A, 0xBF, 0x60, 0x0D, + 0xAD, 0xE0, 0x35, 0xB2, 0x3B, 0xED, 0x7B, 0xAA + }, + { + 0x45, 0x9C, 0x15, 0xD4, 0x85, 0x6C, 0x7E, 0xCF, + 0x82, 0x62, 0x03, 0x51, 0xC3, 0xC1, 0xC7, 0x6C, + 0x40, 0x3F, 0x3E, 0x97, 0x07, 0x74, 0x13, 0x87, + 0xE2, 0x99, 0x07, 0x3F, 0xB1, 0x70, 0x4B, 0x2B + }, + { + 0x9A, 0xB9, 0x12, 0xED, 0xA0, 0x76, 0x8A, 0xBD, + 0xF8, 0x26, 0xB6, 0xE0, 0x5D, 0x0D, 0x73, 0x58, + 0x39, 0xE6, 0xA5, 0xF0, 0x2E, 0x04, 0xC4, 0xCC, + 0x75, 0x65, 0x0B, 0x2C, 0x8C, 0xAB, 0x67, 0x49 + }, + { + 0x47, 0x40, 0xEB, 0xEC, 0xAC, 0x90, 0x03, 0x1B, + 0xB7, 0xE6, 0x8E, 0x51, 0xC5, 0x53, 0x91, 0xAF, + 0xB1, 0x89, 0xB3, 0x17, 0xF2, 0xDE, 0x55, 0x87, + 0x66, 0xF7, 0x8F, 0x5C, 0xB7, 0x1F, 0x81, 0xB6 + }, + { + 0x3C, 0xC4, 0x7F, 0x0E, 0xF6, 0x48, 0x21, 0x58, + 0x7C, 0x93, 0x7C, 0xDD, 0xBA, 0x85, 0xC9, 0x93, + 0xD3, 0xCE, 0x2D, 0xD0, 0xCE, 0xD4, 0x0D, 0x3B, + 0xE3, 0x3C, 0xB7, 0xDC, 0x7E, 0xDA, 0xBC, 0xF1 + }, + { + 0x9F, 0x47, 0x6A, 0x22, 0xDB, 0x54, 0xD6, 0xBB, + 0x9B, 0xEF, 0xDB, 0x26, 0x0C, 0x66, 0x57, 0x8A, + 0xE1, 0xD8, 0xA5, 0xF8, 0x7D, 0x3D, 0x8C, 0x01, + 0x7F, 0xDB, 0x74, 0x75, 0x08, 0x0F, 0xA8, 0xE1 + }, + { + 0x8B, 0x68, 0xC6, 0xFB, 0x07, 0x06, 0xA7, 0x95, + 0xF3, 0xA8, 0x39, 0xD6, 0xFE, 0x25, 0xFD, 0x4A, + 0xA7, 0xF9, 0x2E, 0x66, 0x4F, 0x76, 0x2D, 0x61, + 0x53, 0x81, 0xBC, 0x85, 0x9A, 0xFA, 0x29, 0x2C + }, + { + 0xF6, 0x40, 0xD2, 0x25, 0xA6, 0xBC, 0xD2, 0xFC, + 0x8A, 0xCC, 0xAF, 0xBE, 0xD5, 0xA8, 0x4B, 0x5B, + 0xBB, 0x5D, 0x8A, 0xE5, 0xDB, 0x06, 0xA1, 0x0B, + 0x6D, 0x9D, 0x93, 0x16, 0x0B, 0x39, 0x2E, 0xE0 + }, + { + 0x70, 0x48, 0x60, 0xA7, 0xF5, 0xBA, 0x68, 0xDB, + 0x27, 0x03, 0x1C, 0x15, 0xF2, 0x25, 0x50, 0x0D, + 0x69, 0x2A, 0xB2, 0x47, 0x53, 0x42, 0x81, 0xC4, + 0xF6, 0x84, 0xF6, 0xC6, 0xC8, 0xCD, 0x88, 0xC7 + }, + { + 0xC1, 0xA7, 0x5B, 0xDD, 0xA1, 0x2B, 0x8B, 0x2A, + 0xB1, 0xB9, 0x24, 0x84, 0x38, 0x58, 0x18, 0x3A, + 0x09, 0xD2, 0x02, 0x42, 0x1F, 0xDB, 0xCD, 0xF0, + 0xE6, 0x3E, 0xAE, 0x46, 0xF3, 0x7D, 0x91, 0xED + }, + { + 0x9A, 0x8C, 0xAB, 0x7A, 0x5F, 0x2E, 0x57, 0x62, + 0x21, 0xA6, 0xA8, 0x5E, 0x5F, 0xDD, 0xEE, 0x75, + 0x67, 0x8E, 0x06, 0x53, 0x24, 0xA6, 0x1D, 0xB0, + 0x3A, 0x39, 0x26, 0x1D, 0xDF, 0x75, 0xE3, 0xF4 + }, + { + 0x05, 0xC2, 0xB2, 0x6B, 0x03, 0xCE, 0x6C, 0xA5, + 0x87, 0x1B, 0xE0, 0xDE, 0x84, 0xEE, 0x27, 0x86, + 0xA7, 0x9B, 0xCD, 0x9F, 0x30, 0x03, 0x3E, 0x81, + 0x9B, 0x4A, 0x87, 0xCC, 0xA2, 0x7A, 0xFC, 0x6A + }, + { + 0xB0, 0xB0, 0x99, 0x3C, 0x6D, 0x0C, 0x6E, 0xD5, + 0xC3, 0x59, 0x04, 0x80, 0xF8, 0x65, 0xF4, 0x67, + 0xF4, 0x33, 0x1A, 0x58, 0xDD, 0x8E, 0x47, 0xBD, + 0x98, 0xEB, 0xBC, 0xDB, 0x8E, 0xB4, 0xF9, 0x4D + }, + { + 0xE5, 0x7C, 0x10, 0x3C, 0xF7, 0xB6, 0xBB, 0xEB, + 0x8A, 0x0D, 0xC8, 0xF0, 0x48, 0x62, 0x5C, 0x3F, + 0x4C, 0xE4, 0xF1, 0xA5, 0xAD, 0x4D, 0x07, 0x9C, + 0x11, 0x87, 0xBF, 0xE9, 0xEE, 0x3B, 0x8A, 0x5F + }, + { + 0xF1, 0x00, 0x23, 0xE1, 0x5F, 0x3B, 0x72, 0xB7, + 0x38, 0xAD, 0x61, 0xAE, 0x65, 0xAB, 0x9A, 0x07, + 0xE7, 0x77, 0x4E, 0x2D, 0x7A, 0xB0, 0x2D, 0xBA, + 0x4E, 0x0C, 0xAF, 0x56, 0x02, 0xC8, 0x01, 0x78 + }, + { + 0x9A, 0x8F, 0xB3, 0xB5, 0x38, 0xC1, 0xD6, 0xC4, + 0x50, 0x51, 0xFA, 0x9E, 0xD9, 0xB0, 0x7D, 0x3E, + 0x89, 0xB4, 0x43, 0x03, 0x30, 0x01, 0x4A, 0x1E, + 0xFA, 0x28, 0x23, 0xC0, 0x82, 0x3C, 0xF2, 0x37 + }, + { + 0x30, 0x75, 0xC5, 0xBC, 0x7C, 0x3A, 0xD7, 0xE3, + 0x92, 0x01, 0x01, 0xBC, 0x68, 0x99, 0xC5, 0x8E, + 0xA7, 0x01, 0x67, 0xA7, 0x77, 0x2C, 0xA2, 0x8E, + 0x38, 0xE2, 0xC1, 0xB0, 0xD3, 0x25, 0xE5, 0xA0 + }, + { + 0xE8, 0x55, 0x94, 0x70, 0x0E, 0x39, 0x22, 0xA1, + 0xE8, 0xE4, 0x1E, 0xB8, 0xB0, 0x64, 0xE7, 0xAC, + 0x6D, 0x94, 0x9D, 0x13, 0xB5, 0xA3, 0x45, 0x23, + 0xE5, 0xA6, 0xBE, 0xAC, 0x03, 0xC8, 0xAB, 0x29 + }, + { + 0x1D, 0x37, 0x01, 0xA5, 0x66, 0x1B, 0xD3, 0x1A, + 0xB2, 0x05, 0x62, 0xBD, 0x07, 0xB7, 0x4D, 0xD1, + 0x9A, 0xC8, 0xF3, 0x52, 0x4B, 0x73, 0xCE, 0x7B, + 0xC9, 0x96, 0xB7, 0x88, 0xAF, 0xD2, 0xF3, 0x17 + }, + { + 0x87, 0x4E, 0x19, 0x38, 0x03, 0x3D, 0x7D, 0x38, + 0x35, 0x97, 0xA2, 0xA6, 0x5F, 0x58, 0xB5, 0x54, + 0xE4, 0x11, 0x06, 0xF6, 0xD1, 0xD5, 0x0E, 0x9B, + 0xA0, 0xEB, 0x68, 0x5F, 0x6B, 0x6D, 0xA0, 0x71 + }, + { + 0x93, 0xF2, 0xF3, 0xD6, 0x9B, 0x2D, 0x36, 0x52, + 0x95, 0x56, 0xEC, 0xCA, 0xF9, 0xF9, 0x9A, 0xDB, + 0xE8, 0x95, 0xE1, 0x57, 0x22, 0x31, 0xE6, 0x49, + 0xB5, 0x05, 0x84, 0xB5, 0xD7, 0xD0, 0x8A, 0xF8 + }, + { + 0x06, 0xE0, 0x6D, 0x61, 0x0F, 0x2E, 0xEB, 0xBA, + 0x36, 0x76, 0x82, 0x3E, 0x77, 0x44, 0xD7, 0x51, + 0xAF, 0xF7, 0x30, 0x76, 0xED, 0x65, 0xF3, 0xCF, + 0xF5, 0xE7, 0x2F, 0xD2, 0x27, 0x99, 0x9C, 0x77 + }, + { + 0x8D, 0xF7, 0x57, 0xB3, 0xA1, 0xE0, 0xF4, 0x80, + 0xFA, 0x76, 0xC7, 0xF3, 0x58, 0xED, 0x03, 0x98, + 0xBE, 0x3F, 0x2A, 0x8F, 0x7B, 0x90, 0xEA, 0x8C, + 0x80, 0x75, 0x99, 0xDE, 0xDA, 0x1D, 0x05, 0x34 + }, + { + 0xEE, 0xC9, 0xC5, 0xC6, 0x3C, 0xC5, 0x16, 0x9D, + 0x96, 0x7B, 0xB1, 0x62, 0x4E, 0x9E, 0xE5, 0xCE, + 0xD9, 0x28, 0x97, 0x73, 0x6E, 0xFB, 0xD1, 0x57, + 0x54, 0x8D, 0x82, 0xE8, 0x7C, 0xC7, 0x2F, 0x25 + }, + { + 0xCC, 0x2B, 0x58, 0x32, 0xAD, 0x27, 0x2C, 0xC5, + 0x5C, 0x10, 0xD4, 0xF8, 0xC7, 0xF8, 0xBB, 0x38, + 0xE6, 0xE4, 0xEB, 0x92, 0x2F, 0x93, 0x86, 0x83, + 0x0F, 0x90, 0xB1, 0xE3, 0xDA, 0x39, 0x37, 0xD5 + }, + { + 0x36, 0x89, 0x85, 0xD5, 0x38, 0x7C, 0x0B, 0xFC, + 0x92, 0x8A, 0xC2, 0x54, 0xFA, 0x6D, 0x16, 0x67, + 0x3E, 0x70, 0x94, 0x75, 0x66, 0x96, 0x1B, 0x5F, + 0xB3, 0x32, 0x5A, 0x58, 0x8A, 0xB3, 0x17, 0x3A + }, + { + 0xF1, 0xE4, 0x42, 0xAF, 0xB8, 0x72, 0x15, 0x1F, + 0x81, 0x34, 0x95, 0x6C, 0x54, 0x8A, 0xE3, 0x24, + 0x0D, 0x07, 0xE6, 0xE3, 0x38, 0xD4, 0xA7, 0xA6, + 0xAF, 0x8D, 0xA4, 0x11, 0x9A, 0xB0, 0xE2, 0xB0 + }, + { + 0xB0, 0x12, 0xC7, 0x54, 0x6A, 0x39, 0xC4, 0x0C, + 0xAD, 0xEC, 0xE4, 0xE0, 0x4E, 0x7F, 0x33, 0xC5, + 0x93, 0xAD, 0x18, 0x2E, 0xBC, 0x5A, 0x46, 0xD2, + 0xDB, 0xF4, 0xAD, 0x1A, 0x92, 0xF5, 0x9E, 0x7B + }, + { + 0x6C, 0x60, 0x97, 0xCD, 0x20, 0x33, 0x09, 0x6B, + 0x4D, 0xF3, 0x17, 0xDE, 0x8A, 0x90, 0x8B, 0x7D, + 0x0C, 0x72, 0x94, 0x39, 0x0C, 0x5A, 0x39, 0x9C, + 0x30, 0x1B, 0xF2, 0xA2, 0x65, 0x2E, 0x82, 0x62 + }, + { + 0xBA, 0x83, 0xFE, 0xB5, 0x10, 0xB4, 0x9A, 0xDE, + 0x4F, 0xAE, 0xFB, 0xE9, 0x42, 0x78, 0x1E, 0xAF, + 0xD4, 0x1A, 0xD5, 0xD4, 0x36, 0x88, 0x85, 0x31, + 0xB6, 0x88, 0x59, 0xF2, 0x2C, 0x2D, 0x16, 0x4A + }, + { + 0x5A, 0x06, 0x9E, 0x43, 0x92, 0x19, 0x5A, 0xC9, + 0xD2, 0x84, 0xA4, 0x7F, 0x3B, 0xD8, 0x54, 0xAF, + 0x8F, 0xD0, 0xD7, 0xFD, 0xC3, 0x48, 0x3D, 0x2C, + 0x5F, 0x34, 0x24, 0xCC, 0xFD, 0xA1, 0x5C, 0x8E + }, + { + 0x7E, 0x88, 0xD6, 0x4B, 0xBB, 0xE2, 0x02, 0x4F, + 0x44, 0x54, 0xBA, 0x13, 0x98, 0xB3, 0xD8, 0x65, + 0x2D, 0xCE, 0xC8, 0x20, 0xB1, 0x4C, 0x3B, 0x0A, + 0xBF, 0xBF, 0x0F, 0x4F, 0x33, 0x06, 0xBB, 0x5E + }, + { + 0xF8, 0x74, 0x2F, 0xF4, 0x6D, 0xFD, 0xF3, 0xEC, + 0x82, 0x64, 0xF9, 0x94, 0x5B, 0x20, 0x41, 0x94, + 0x62, 0xF0, 0x69, 0xE8, 0x33, 0xC5, 0x94, 0xEC, + 0x80, 0xFF, 0xAC, 0x5E, 0x7E, 0x51, 0x34, 0xF9 + }, + { + 0xD3, 0xE0, 0xB7, 0x38, 0xD2, 0xE9, 0x2F, 0x3C, + 0x47, 0xC7, 0x94, 0x66, 0x66, 0x09, 0xC0, 0xF5, + 0x50, 0x4F, 0x67, 0xEC, 0x4E, 0x76, 0x0E, 0xEE, + 0xCC, 0xF8, 0x64, 0x4E, 0x68, 0x33, 0x34, 0x11 + }, + { + 0x0C, 0x90, 0xCE, 0x10, 0xED, 0xF0, 0xCE, 0x1D, + 0x47, 0xEE, 0xB5, 0x0B, 0x5B, 0x7A, 0xFF, 0x8E, + 0xE8, 0xA4, 0x3B, 0x64, 0xA8, 0x89, 0xC1, 0xC6, + 0xC6, 0xB8, 0xE3, 0x1A, 0x3C, 0xFC, 0x45, 0xEE + }, + { + 0x83, 0x91, 0x7A, 0xC1, 0xCD, 0xAD, 0xE8, 0xF0, + 0xE3, 0xBF, 0x42, 0x6F, 0xEA, 0xC1, 0x38, 0x8B, + 0x3F, 0xCB, 0xE3, 0xE1, 0xBF, 0x98, 0x79, 0x8C, + 0x81, 0x58, 0xBF, 0x75, 0x8E, 0x8D, 0x5D, 0x4E + }, + { + 0xDC, 0x8E, 0xB0, 0xC0, 0x13, 0xFA, 0x9D, 0x06, + 0x4E, 0xE3, 0x76, 0x23, 0x36, 0x9F, 0xB3, 0x94, + 0xAF, 0x97, 0x4B, 0x1A, 0xAC, 0x82, 0x40, 0x5B, + 0x88, 0x97, 0x6C, 0xD8, 0xFC, 0xA1, 0x25, 0x30 + }, + { + 0x9A, 0xF4, 0xFC, 0x92, 0xEA, 0x8D, 0x6B, 0x5F, + 0xE7, 0x99, 0x0E, 0x3A, 0x02, 0x70, 0x1E, 0xC2, + 0x2B, 0x2D, 0xFD, 0x71, 0x00, 0xB9, 0x0D, 0x05, + 0x51, 0x86, 0x94, 0x17, 0x95, 0x5E, 0x44, 0xC8 + }, + { + 0xC7, 0x22, 0xCE, 0xC1, 0x31, 0xBA, 0xA1, 0x63, + 0xF4, 0x7E, 0x4B, 0x33, 0x9E, 0x1F, 0xB9, 0xB4, + 0xAC, 0xA2, 0x48, 0xC4, 0x75, 0x93, 0x45, 0xEA, + 0xDB, 0xD6, 0xC6, 0xA7, 0xDD, 0xB5, 0x04, 0x77 + }, + { + 0x18, 0x37, 0xB1, 0x20, 0xD4, 0xE4, 0x04, 0x6C, + 0x6D, 0xE8, 0xCC, 0xAF, 0x09, 0xF1, 0xCA, 0xF3, + 0x02, 0xAD, 0x56, 0x23, 0x4E, 0x6B, 0x42, 0x2C, + 0xE9, 0x0A, 0x61, 0xBF, 0x06, 0xAE, 0xE4, 0x3D + }, + { + 0x87, 0xAC, 0x9D, 0x0F, 0x8A, 0x0B, 0x11, 0xBF, + 0xED, 0xD6, 0x99, 0x1A, 0x6D, 0xAF, 0x34, 0xC8, + 0xAA, 0x5D, 0x7E, 0x8A, 0xE1, 0xB9, 0xDF, 0x4A, + 0xF7, 0x38, 0x00, 0x5F, 0xE7, 0x8C, 0xE9, 0x3C + }, + { + 0xE2, 0x1F, 0xB6, 0x68, 0xEB, 0xB8, 0xBF, 0x2D, + 0x82, 0x08, 0x6D, 0xED, 0xCB, 0x3A, 0x53, 0x71, + 0xC2, 0xC4, 0x6F, 0xA1, 0xAC, 0x11, 0xD2, 0xE2, + 0xC5, 0x66, 0xD1, 0x4A, 0xD3, 0xC3, 0x65, 0x3F + }, + { + 0x5A, 0x9A, 0x69, 0x81, 0x5E, 0x4D, 0x3E, 0xB7, + 0x72, 0xED, 0x90, 0x8F, 0xE6, 0x58, 0xCE, 0x50, + 0x87, 0x31, 0x0E, 0xC1, 0xD5, 0x0C, 0xB9, 0x4F, + 0x56, 0x28, 0x33, 0x9A, 0x61, 0xDC, 0xD9, 0xEE + }, + { + 0xAA, 0xC2, 0x85, 0xF1, 0x20, 0x8F, 0x70, 0xA6, + 0x47, 0x97, 0xD0, 0xA9, 0x40, 0x0D, 0xA6, 0x46, + 0x53, 0x30, 0x18, 0x38, 0xFE, 0xF6, 0x69, 0x0B, + 0x87, 0xCD, 0xA9, 0x15, 0x9E, 0xE0, 0x7E, 0xF4 + }, + { + 0x05, 0x64, 0x3C, 0x1C, 0x6F, 0x26, 0x59, 0x25, + 0xA6, 0x50, 0x93, 0xF9, 0xDE, 0x8A, 0x19, 0x1C, + 0x4F, 0x6F, 0xD1, 0x41, 0x8F, 0xBF, 0x66, 0xBE, + 0x80, 0x59, 0xA9, 0x1B, 0xA8, 0xDC, 0xDA, 0x61 + }, + { + 0x1C, 0x6C, 0xDE, 0x5B, 0x78, 0x10, 0x3C, 0x9E, + 0x6F, 0x04, 0x6D, 0xFE, 0x30, 0xF5, 0x12, 0x1C, + 0xF9, 0xD4, 0x03, 0x9E, 0xFE, 0x22, 0x25, 0x40, + 0xA4, 0x1B, 0xBC, 0x06, 0xE4, 0x69, 0xFE, 0xB6 + }, + { + 0xB4, 0x9B, 0xB4, 0x6D, 0x1B, 0x19, 0x3B, 0x04, + 0x5E, 0x74, 0x12, 0x05, 0x9F, 0xE7, 0x2D, 0x55, + 0x25, 0x52, 0xA8, 0xFB, 0x6C, 0x36, 0x41, 0x07, + 0x23, 0xDC, 0x7D, 0x05, 0xFC, 0xCE, 0xDE, 0xD3 + }, + { + 0xB6, 0x12, 0xD3, 0xD2, 0x1F, 0xC4, 0xDE, 0x3C, + 0x79, 0x1A, 0xF7, 0x35, 0xE5, 0x9F, 0xB7, 0x17, + 0xD8, 0x39, 0x72, 0x3B, 0x42, 0x50, 0x8E, 0x9E, + 0xBF, 0x78, 0x06, 0xD9, 0x3E, 0x9C, 0x83, 0x7F + }, + { + 0x7C, 0x33, 0x90, 0xA3, 0xE5, 0xCB, 0x27, 0xD1, + 0x86, 0x8B, 0xA4, 0x55, 0xCF, 0xEB, 0x32, 0x22, + 0xFD, 0xE2, 0x7B, 0xCD, 0xA4, 0xBF, 0x24, 0x8E, + 0x3D, 0x29, 0xCF, 0x1F, 0x34, 0x32, 0x9F, 0x25 + }, + { + 0xBD, 0x42, 0xEE, 0xA7, 0xB3, 0x54, 0x86, 0xCD, + 0xD0, 0x90, 0x7C, 0xB4, 0x71, 0x2E, 0xDE, 0x2F, + 0x4D, 0xEE, 0xCC, 0xBC, 0xA1, 0x91, 0x60, 0x38, + 0x65, 0xA1, 0xCC, 0x80, 0x9F, 0x12, 0xB4, 0x46 + }, + { + 0xD1, 0xDD, 0x62, 0x01, 0x74, 0x0C, 0xFA, 0xAD, + 0x53, 0xCE, 0xCC, 0xB7, 0x56, 0xB1, 0x10, 0xF3, + 0xD5, 0x0F, 0x81, 0x7B, 0x43, 0xD7, 0x55, 0x95, + 0x57, 0xE5, 0x7A, 0xAD, 0x14, 0x3A, 0x85, 0xD9 + }, + { + 0x58, 0x29, 0x64, 0x3C, 0x1B, 0x10, 0xE1, 0xC8, + 0xCC, 0xF2, 0x0C, 0x9B, 0x4A, 0xF8, 0x21, 0xEA, + 0x05, 0x2D, 0x7F, 0x0F, 0x7C, 0x22, 0xF7, 0x38, + 0x0B, 0xBB, 0xCF, 0xAF, 0xB9, 0x77, 0xE2, 0x1F + }, + { + 0xFC, 0x4C, 0xF2, 0xA7, 0xFB, 0xE0, 0xB1, 0xE8, + 0xAE, 0xFB, 0xE4, 0xB4, 0xB7, 0x9E, 0xD8, 0x4E, + 0xC9, 0x7B, 0x03, 0x4F, 0x51, 0xB4, 0xE9, 0x7F, + 0x76, 0x0B, 0x20, 0x63, 0x97, 0x65, 0xB9, 0x33 + }, + { + 0x4D, 0x7C, 0x3B, 0x34, 0x38, 0xA0, 0xBD, 0xA2, + 0x8E, 0x7A, 0x96, 0xE4, 0x20, 0x27, 0xD8, 0x13, + 0xE8, 0x8A, 0xE6, 0x28, 0x85, 0x49, 0x98, 0x33, + 0xD3, 0xC5, 0xF6, 0x35, 0x9E, 0xF7, 0xED, 0xBC + }, + { + 0x34, 0xCB, 0xD3, 0x20, 0x68, 0xEF, 0x7E, 0x82, + 0x09, 0x9E, 0x58, 0x0B, 0xF9, 0xE2, 0x64, 0x23, + 0xE9, 0x81, 0xE3, 0x1B, 0x1B, 0xBC, 0xE6, 0x1A, + 0xEA, 0xB1, 0x4C, 0x32, 0xA2, 0x73, 0xE4, 0xCB + }, + { + 0xA0, 0x5D, 0xDA, 0x7D, 0x0D, 0xA9, 0xE0, 0x94, + 0xAE, 0x22, 0x53, 0x3F, 0x79, 0xE7, 0xDC, 0xCD, + 0x26, 0xB1, 0x75, 0x7C, 0xEF, 0xB9, 0x5B, 0xCF, + 0x62, 0xC4, 0xFF, 0x9C, 0x26, 0x92, 0xE1, 0xC0 + }, + { + 0x22, 0x4C, 0xCF, 0xFA, 0x7C, 0xCA, 0x4C, 0xE3, + 0x4A, 0xFD, 0x47, 0xF6, 0x2A, 0xDE, 0x53, 0xC5, + 0xE8, 0x48, 0x9B, 0x04, 0xAC, 0x9C, 0x41, 0xF7, + 0xFA, 0xD0, 0xC8, 0xED, 0xEB, 0x89, 0xE9, 0x41 + }, + { + 0x6B, 0xC6, 0x07, 0x64, 0x83, 0xAA, 0x11, 0xC0, + 0x7F, 0xBA, 0x55, 0xC0, 0xF9, 0xA1, 0xB5, 0xDA, + 0x87, 0xEC, 0xBF, 0xFE, 0xA7, 0x55, 0x98, 0xCC, + 0x31, 0x8A, 0x51, 0x4C, 0xEC, 0x7B, 0x3B, 0x6A + }, + { + 0x9A, 0x03, 0x60, 0xE2, 0x3A, 0x22, 0xF4, 0xF7, + 0x6C, 0x0E, 0x95, 0x28, 0xDA, 0xFD, 0x12, 0x9B, + 0xB4, 0x67, 0x5F, 0xB8, 0x8D, 0x44, 0xEA, 0xF8, + 0x57, 0x77, 0x30, 0x0C, 0xEC, 0x9B, 0xCC, 0x79 + }, + { + 0x79, 0x01, 0x99, 0xB4, 0xCA, 0x90, 0xDE, 0xDC, + 0xCF, 0xE3, 0x24, 0x74, 0xE8, 0x5B, 0x17, 0x4F, + 0x06, 0x9E, 0x35, 0x42, 0xBE, 0x31, 0x04, 0xC1, + 0x12, 0x5C, 0x2F, 0xDB, 0xD6, 0x9D, 0x32, 0xC7 + }, + { + 0x55, 0x83, 0x99, 0x25, 0x83, 0x4C, 0xA3, 0xE8, + 0x25, 0xE9, 0x92, 0x41, 0x87, 0x4D, 0x16, 0xD6, + 0xC2, 0x62, 0x36, 0x29, 0xC4, 0xC2, 0xAD, 0xDD, + 0xF0, 0xDB, 0xA0, 0x1E, 0x6C, 0xE8, 0xA0, 0xDC + }, + { + 0x61, 0x5F, 0xF8, 0x46, 0xD9, 0x93, 0x00, 0x7D, + 0x38, 0xDE, 0x1A, 0xEC, 0xB3, 0x17, 0x82, 0x89, + 0xDE, 0xD0, 0x9E, 0x6B, 0xB5, 0xCB, 0xD6, 0x0F, + 0x69, 0xC6, 0xAA, 0x36, 0x38, 0x30, 0x20, 0xF7 + }, + { + 0xF0, 0xE4, 0x0B, 0x4E, 0xD4, 0x0D, 0x34, 0x85, + 0x1E, 0x72, 0xB4, 0xEE, 0x4D, 0x00, 0xEA, 0x6A, + 0x40, 0xEA, 0x1C, 0x1B, 0xF9, 0xE5, 0xC2, 0x69, + 0x71, 0x0C, 0x9D, 0x51, 0xCB, 0xB8, 0xA3, 0xC9 + }, + { + 0x0B, 0x07, 0xB2, 0x33, 0x3B, 0x08, 0xD0, 0x8C, + 0x11, 0xCA, 0x34, 0xAB, 0x44, 0x9B, 0x71, 0xD2, + 0x9A, 0x0F, 0x43, 0xE1, 0xF7, 0x78, 0xE0, 0x73, + 0xE7, 0x90, 0x06, 0xCC, 0xB7, 0x30, 0xED, 0x62 + }, + { + 0xD1, 0xF4, 0xC2, 0x9D, 0x9F, 0x23, 0xEA, 0x35, + 0xEC, 0x40, 0x35, 0xB3, 0x77, 0xD5, 0x06, 0x53, + 0x8E, 0x72, 0x8B, 0xC7, 0x39, 0xC1, 0x45, 0x96, + 0x80, 0xCF, 0x1C, 0xC6, 0x94, 0x24, 0x92, 0x4D + }, + { + 0x12, 0x79, 0xCF, 0x6F, 0x66, 0x9F, 0x92, 0xF6, + 0xBF, 0xC2, 0x5D, 0x60, 0x5B, 0x94, 0x40, 0xC7, + 0xDC, 0xCB, 0xD2, 0x5D, 0xF2, 0x8D, 0xC7, 0x35, + 0x3A, 0xBC, 0x1C, 0x05, 0x30, 0x40, 0x5D, 0xC4 + }, + { + 0x1F, 0xA0, 0xAF, 0x00, 0x77, 0x5D, 0xC2, 0xCE, + 0x76, 0x50, 0x6D, 0x32, 0x80, 0xF4, 0x72, 0xD2, + 0xF6, 0xFF, 0x97, 0xA2, 0x15, 0x1F, 0xAA, 0x82, + 0x79, 0x42, 0xFE, 0xA4, 0x4A, 0xD0, 0xBA, 0x1F + }, + { + 0x3E, 0x1A, 0xD5, 0x4A, 0x5F, 0x83, 0x5B, 0x98, + 0x3B, 0xD2, 0xAA, 0xB0, 0xED, 0x2A, 0x4C, 0x0B, + 0xDD, 0x72, 0x16, 0x20, 0x9C, 0x36, 0xA7, 0x9E, + 0x9E, 0x2A, 0xAB, 0xB9, 0x9F, 0xAF, 0x35, 0x12 + }, + { + 0xC6, 0xED, 0x39, 0xE2, 0xD8, 0xB6, 0x36, 0xEC, + 0xCB, 0xA2, 0x45, 0xEF, 0x4E, 0x88, 0x64, 0xF4, + 0xCD, 0x94, 0x6B, 0xE2, 0x16, 0xB9, 0xBE, 0x48, + 0x30, 0x3E, 0x08, 0xB9, 0x2D, 0xD0, 0x94, 0x34 + }, + { + 0xE2, 0x47, 0x36, 0xC1, 0x3E, 0xCB, 0x9F, 0x36, + 0xA0, 0xD8, 0x29, 0xD4, 0x79, 0x8D, 0x76, 0x99, + 0xC1, 0x4C, 0xC6, 0x5B, 0x6D, 0xC4, 0x4E, 0xD6, + 0xF1, 0x0C, 0xD4, 0x85, 0x3D, 0x6E, 0x07, 0x57 + }, + { + 0x38, 0x9B, 0xE8, 0x80, 0x52, 0xA3, 0x81, 0x27, + 0x2C, 0x6D, 0xF7, 0x41, 0xA8, 0x8A, 0xD3, 0x49, + 0xB7, 0x12, 0x71, 0x84, 0x35, 0x48, 0x0A, 0x81, + 0x90, 0xB7, 0x04, 0x77, 0x1D, 0x2D, 0xE6, 0x37 + }, + { + 0x88, 0x9F, 0x2D, 0x57, 0x8A, 0x5D, 0xAE, 0xFD, + 0x34, 0x1C, 0x21, 0x09, 0x84, 0xE1, 0x26, 0xD1, + 0xD9, 0x6D, 0xA2, 0xDE, 0xE3, 0xC8, 0x1F, 0x7A, + 0x60, 0x80, 0xBF, 0x84, 0x56, 0x9B, 0x31, 0x14 + }, + { + 0xE9, 0x36, 0x09, 0x5B, 0x9B, 0x98, 0x2F, 0xFC, + 0x85, 0x6D, 0x2F, 0x52, 0x76, 0xA4, 0xE5, 0x29, + 0xEC, 0x73, 0x95, 0xDA, 0x31, 0x6D, 0x62, 0x87, + 0x02, 0xFB, 0x28, 0x1A, 0xDA, 0x6F, 0x38, 0x99 + }, + { + 0xEF, 0x89, 0xCE, 0x1D, 0x6F, 0x8B, 0x48, 0xEA, + 0x5C, 0xD6, 0xAE, 0xAB, 0x6A, 0x83, 0xD0, 0xCC, + 0x98, 0xC9, 0xA3, 0xA2, 0x07, 0xA1, 0x08, 0x57, + 0x32, 0xF0, 0x47, 0xD9, 0x40, 0x38, 0xC2, 0x88 + }, + { + 0xF9, 0x25, 0x01, 0x6D, 0x79, 0xF2, 0xAC, 0xA8, + 0xC4, 0x9E, 0xDF, 0xCD, 0x66, 0x21, 0xD5, 0xBE, + 0x3C, 0x8C, 0xEC, 0x61, 0xBD, 0x58, 0x71, 0xD8, + 0xC1, 0xD3, 0xA5, 0x65, 0xF3, 0x5E, 0x0C, 0x9F + }, + { + 0x63, 0xE8, 0x63, 0x4B, 0x75, 0x7A, 0x38, 0xF9, + 0x2B, 0x92, 0xFD, 0x23, 0x89, 0x3B, 0xA2, 0x99, + 0x85, 0x3A, 0x86, 0x13, 0x67, 0x9F, 0xDF, 0x7E, + 0x05, 0x11, 0x09, 0x5C, 0x0F, 0x04, 0x7B, 0xCA + }, + { + 0xCF, 0x2C, 0xCA, 0x07, 0x72, 0xB7, 0x05, 0xEB, + 0x57, 0xD2, 0x89, 0x43, 0xF8, 0x3D, 0x35, 0x3F, + 0xE2, 0x91, 0xE5, 0xB3, 0x77, 0x78, 0x0B, 0x37, + 0x4C, 0x8B, 0xA4, 0x66, 0x58, 0x30, 0xBE, 0x87 + }, + { + 0x46, 0xDF, 0x5B, 0x87, 0xC8, 0x0E, 0x7E, 0x40, + 0x74, 0xAE, 0xE6, 0x85, 0x59, 0x42, 0x47, 0x42, + 0x84, 0x5B, 0x9B, 0x35, 0x0F, 0x51, 0xBA, 0x55, + 0xB0, 0x74, 0xBB, 0xAE, 0x4C, 0x62, 0x6A, 0xAB + }, + { + 0x65, 0x8A, 0xA4, 0xF9, 0xD2, 0xBC, 0xBD, 0x4F, + 0x7F, 0x8E, 0xB6, 0x3E, 0x68, 0xF5, 0x36, 0x7E, + 0xDB, 0xC5, 0x00, 0xA0, 0xB1, 0xFB, 0xB4, 0x1E, + 0x9D, 0xF1, 0x41, 0xBC, 0xBA, 0x8F, 0xCD, 0x53 + }, + { + 0xEE, 0x80, 0x55, 0x50, 0x08, 0xA7, 0x16, 0x55, + 0xE0, 0x81, 0x09, 0x2B, 0xBA, 0x6F, 0x67, 0x0E, + 0xD9, 0x8A, 0xF9, 0xA0, 0x9F, 0xB5, 0xAF, 0xB9, + 0x4C, 0xBC, 0x5C, 0x75, 0x48, 0x14, 0xDB, 0x4F + }, + { + 0x2C, 0x5F, 0x9D, 0x04, 0x82, 0x20, 0xB0, 0x41, + 0xB6, 0xD4, 0x52, 0x4B, 0x44, 0x90, 0xCF, 0x8C, + 0x66, 0xFC, 0xB8, 0xE1, 0x4B, 0x0D, 0x64, 0x88, + 0x7A, 0xA1, 0xE4, 0x76, 0x1A, 0x60, 0x2B, 0x39 + }, + { + 0x44, 0xCB, 0x63, 0x11, 0xD0, 0x75, 0x0B, 0x7E, + 0x33, 0xF7, 0x33, 0x3A, 0xA7, 0x8A, 0xAC, 0xA9, + 0xC3, 0x4A, 0xD5, 0xF7, 0x9C, 0x1B, 0x15, 0x91, + 0xEC, 0x33, 0x95, 0x1E, 0x69, 0xC4, 0xC4, 0x61 + }, + { + 0x0C, 0x6C, 0xE3, 0x2A, 0x3E, 0xA0, 0x56, 0x12, + 0xC5, 0xF8, 0x09, 0x0F, 0x6A, 0x7E, 0x87, 0xF5, + 0xAB, 0x30, 0xE4, 0x1B, 0x70, 0x7D, 0xCB, 0xE5, + 0x41, 0x55, 0x62, 0x0A, 0xD7, 0x70, 0xA3, 0x40 + }, + { + 0xC6, 0x59, 0x38, 0xDD, 0x3A, 0x05, 0x3C, 0x72, + 0x9C, 0xF5, 0xB7, 0xC8, 0x9F, 0x39, 0x0B, 0xFE, + 0xBB, 0x51, 0x12, 0x76, 0x6B, 0xB0, 0x0A, 0xA5, + 0xFA, 0x31, 0x64, 0xDF, 0xDF, 0x3B, 0x56, 0x47 + }, + { + 0x7D, 0xE7, 0xF0, 0xD5, 0x9A, 0x90, 0x39, 0xAF, + 0xF3, 0xAA, 0xF3, 0x2C, 0x3E, 0xE5, 0x2E, 0x79, + 0x17, 0x53, 0x57, 0x29, 0x06, 0x21, 0x68, 0xD2, + 0x49, 0x0B, 0x6B, 0x6C, 0xE2, 0x44, 0xB3, 0x80 + }, + { + 0x89, 0x58, 0x98, 0xF5, 0x3A, 0x8F, 0x39, 0xE4, + 0x24, 0x10, 0xDA, 0x77, 0xB6, 0xC4, 0x81, 0x5B, + 0x0B, 0xB2, 0x39, 0x5E, 0x39, 0x22, 0xF5, 0xBE, + 0xD0, 0xE1, 0xFB, 0xF2, 0xA4, 0xC6, 0xDF, 0xEB + }, + { + 0xC9, 0x05, 0xA8, 0x49, 0x84, 0x34, 0x8A, 0x64, + 0xDB, 0x1F, 0x54, 0x20, 0x83, 0x74, 0x8A, 0xD9, + 0x0A, 0x4B, 0xAD, 0x98, 0x33, 0xCB, 0x6D, 0xA3, + 0x87, 0x29, 0x34, 0x31, 0xF1, 0x9E, 0x7C, 0x9C + }, + { + 0xED, 0x37, 0xD1, 0xA4, 0xD0, 0x6C, 0x90, 0xD1, + 0x95, 0x78, 0x48, 0x66, 0x7E, 0x95, 0x48, 0xFE, + 0xBB, 0x5D, 0x42, 0x3E, 0xAB, 0x4F, 0x56, 0x78, + 0x5C, 0xC4, 0xB5, 0x41, 0x6B, 0x78, 0x00, 0x08 + }, + { + 0x0B, 0xC6, 0x5D, 0x99, 0x97, 0xFB, 0x73, 0x4A, + 0x56, 0x1F, 0xB1, 0xE9, 0xF8, 0xC0, 0x95, 0x8A, + 0x02, 0xC7, 0xA4, 0xDB, 0xD0, 0x96, 0xEB, 0xEF, + 0x1A, 0x17, 0x51, 0xAE, 0xD9, 0x59, 0xEE, 0xD7 + }, + { + 0x7C, 0x5F, 0x43, 0x2E, 0xB8, 0xB7, 0x35, 0x2A, + 0x94, 0x94, 0xDE, 0xA4, 0xD5, 0x3C, 0x21, 0x38, + 0x70, 0x31, 0xCE, 0x70, 0xE8, 0x5D, 0x94, 0x08, + 0xFC, 0x6F, 0x8C, 0xD9, 0x8A, 0x6A, 0xAA, 0x1E + }, + { + 0xB8, 0xBF, 0x8E, 0x2C, 0x34, 0xE0, 0x33, 0x98, + 0x36, 0x39, 0x90, 0x9E, 0xAA, 0x37, 0x64, 0x0D, + 0x87, 0x7B, 0x04, 0x8F, 0xE2, 0x99, 0xB4, 0x70, + 0xAF, 0x2D, 0x0B, 0xA8, 0x2A, 0x5F, 0x14, 0xC0 + }, + { + 0x88, 0xA9, 0xDD, 0x13, 0xD5, 0xDA, 0xDB, 0xDE, + 0xE6, 0xBF, 0xF7, 0xEE, 0x1E, 0xF8, 0xC7, 0x1C, + 0xC1, 0x93, 0xAA, 0x4B, 0xF3, 0xE8, 0x4F, 0x8F, + 0xE8, 0x0C, 0xB0, 0x75, 0x68, 0x3C, 0x07, 0x79 + }, + { + 0x9A, 0xED, 0xB8, 0x87, 0x6D, 0xD2, 0x1C, 0x8C, + 0x84, 0xD2, 0xE7, 0x02, 0xA1, 0x36, 0x25, 0x98, + 0x04, 0x62, 0xF6, 0x8B, 0xF0, 0xA1, 0xB7, 0x25, + 0x4A, 0xD8, 0x06, 0xC3, 0x84, 0x03, 0xC9, 0xDE + }, + { + 0xD0, 0x97, 0x57, 0x3D, 0xF2, 0xD6, 0xB2, 0x48, + 0x9A, 0x47, 0x94, 0x84, 0x86, 0x98, 0x00, 0xA1, + 0xF8, 0x33, 0xEA, 0x16, 0x9E, 0xFF, 0x32, 0xAE, + 0x3C, 0xE6, 0x3A, 0x20, 0x79, 0x54, 0x8D, 0x78 + }, + { + 0xD1, 0x8F, 0x27, 0xA3, 0xE5, 0x55, 0xD7, 0xF9, + 0x1A, 0x00, 0x7C, 0x67, 0xAC, 0xEE, 0xDE, 0x39, + 0x1F, 0x75, 0xA6, 0x1F, 0xA4, 0x2A, 0x0B, 0x45, + 0x66, 0xEB, 0x58, 0x2C, 0xA0, 0x5E, 0xBC, 0xE7 + }, + { + 0xDF, 0x1D, 0xAA, 0x90, 0xB1, 0x70, 0x23, 0x13, + 0xE6, 0xA5, 0x90, 0x1C, 0x7A, 0xFC, 0x5E, 0xD9, + 0x65, 0x77, 0x17, 0xA7, 0x15, 0xFA, 0x53, 0xA4, + 0x18, 0x9E, 0xC1, 0xE5, 0xDF, 0x29, 0x3A, 0x68 + }, + { + 0x04, 0xE3, 0xA4, 0x96, 0xB6, 0x69, 0x96, 0xC6, + 0x6E, 0x32, 0x91, 0x9E, 0xD1, 0xF9, 0x4C, 0x36, + 0xEE, 0xBB, 0xF2, 0x40, 0x63, 0x3A, 0x2F, 0x73, + 0x98, 0x45, 0xF0, 0x29, 0x5D, 0x34, 0xAF, 0xBA + }, + { + 0x8C, 0x45, 0xD8, 0x8C, 0x4E, 0x9C, 0x9D, 0x0C, + 0x8C, 0x67, 0x7F, 0xE4, 0x8F, 0xA5, 0x44, 0x9B, + 0xA3, 0x01, 0x78, 0xD4, 0x0A, 0xF0, 0xF0, 0x21, + 0x79, 0x21, 0xC6, 0x2E, 0x4B, 0x60, 0xCD, 0xD3 + }, + { + 0xE1, 0x49, 0xA6, 0xB1, 0x3B, 0xDE, 0xDE, 0xA2, + 0xEE, 0xEE, 0x00, 0x9C, 0xE9, 0x44, 0x5E, 0x8D, + 0xCF, 0x76, 0xB7, 0x6E, 0x55, 0xA5, 0x01, 0xD8, + 0xF5, 0xB4, 0x3F, 0xF8, 0x96, 0x79, 0x6A, 0xD1 + }, + { + 0xA8, 0x37, 0xC4, 0xC7, 0xC6, 0xF5, 0xCF, 0xB9, + 0x9E, 0x10, 0x85, 0xFD, 0x43, 0x28, 0x7A, 0x41, + 0x05, 0xCB, 0x28, 0xB7, 0x6F, 0xC3, 0x8B, 0x60, + 0x55, 0xC5, 0xDC, 0xFF, 0x78, 0xB8, 0x25, 0x65 + }, + { + 0x42, 0x41, 0x1F, 0x28, 0x78, 0x0B, 0x4F, 0x16, + 0x38, 0x54, 0x0B, 0x87, 0x05, 0x21, 0xEC, 0x45, + 0xBC, 0xEB, 0x1E, 0x0C, 0x71, 0x31, 0xF7, 0xE1, + 0xC4, 0x67, 0x2E, 0x43, 0x6C, 0x88, 0xC8, 0xE9 + }, + { + 0x34, 0xB4, 0xE8, 0x76, 0x76, 0x94, 0x71, 0xDF, + 0x55, 0x2E, 0x55, 0x22, 0xCE, 0xA7, 0x84, 0xFA, + 0x53, 0xAC, 0x61, 0xBE, 0xDE, 0x8C, 0xFE, 0x29, + 0x14, 0x09, 0xE6, 0x8B, 0x69, 0xE8, 0x77, 0x6F + }, + { + 0x8F, 0x31, 0xD6, 0x37, 0xA9, 0x1D, 0xBD, 0x0E, + 0xCB, 0x0B, 0xA0, 0xE6, 0x94, 0xBE, 0xC1, 0x44, + 0x76, 0x58, 0xCE, 0x6C, 0x27, 0xEA, 0x9B, 0x95, + 0xFF, 0x36, 0x70, 0x1C, 0xAF, 0x36, 0xF0, 0x01 + }, + { + 0xB5, 0xC8, 0x95, 0xEB, 0x07, 0x1E, 0x3D, 0x38, + 0x52, 0x8D, 0x47, 0x5D, 0x3B, 0xB0, 0xBA, 0x88, + 0xB7, 0x17, 0x95, 0xE4, 0x0A, 0x98, 0x2E, 0x2A, + 0xC2, 0xD8, 0x44, 0x22, 0xA0, 0xF2, 0x68, 0x5D + }, + { + 0xE9, 0x06, 0x25, 0x7C, 0x41, 0x9D, 0x94, 0x1E, + 0xD2, 0xB8, 0xA9, 0xC1, 0x27, 0x81, 0xDB, 0x97, + 0x59, 0xA3, 0xFC, 0xF3, 0xDC, 0x7C, 0xDB, 0x03, + 0x15, 0x99, 0xE1, 0x08, 0x6B, 0x67, 0x2F, 0x10 + }, + { + 0x98, 0xAD, 0x24, 0x39, 0x7C, 0x6E, 0xAE, 0x4C, + 0xF7, 0x3E, 0xA8, 0xBB, 0xEF, 0x5A, 0x0B, 0x74, + 0xD2, 0x1A, 0xD1, 0x5F, 0x33, 0x92, 0x0F, 0x44, + 0x07, 0x0A, 0x98, 0xBD, 0xF5, 0x3D, 0x0B, 0x3A + }, + { + 0xDD, 0x51, 0x0C, 0xA5, 0x5B, 0x11, 0x70, 0xF9, + 0xCE, 0xFD, 0xBB, 0x16, 0xFC, 0x14, 0x52, 0x62, + 0xAA, 0x36, 0x3A, 0x87, 0x0A, 0x01, 0xE1, 0xBC, + 0x4F, 0xBE, 0x40, 0x23, 0x4B, 0x4B, 0x6F, 0x2F + }, + { + 0xF2, 0xD8, 0xD9, 0x31, 0xB9, 0x2E, 0x1C, 0xB6, + 0x98, 0xE5, 0x6E, 0xD0, 0x28, 0x19, 0xEA, 0x11, + 0xD2, 0x66, 0x19, 0xB8, 0x3A, 0x62, 0x09, 0xAD, + 0x67, 0x22, 0x53, 0x68, 0xFE, 0x11, 0x95, 0x71 + }, + { + 0xE4, 0x63, 0x70, 0x55, 0xDB, 0x91, 0xF9, 0x43, + 0x7C, 0xF4, 0x60, 0xEF, 0x40, 0xB5, 0x14, 0x5F, + 0x69, 0x98, 0x26, 0x6A, 0x5E, 0x74, 0xE9, 0x6A, + 0x00, 0x78, 0x2C, 0x62, 0xCF, 0x30, 0xCF, 0x1C + }, + { + 0x35, 0x63, 0x53, 0x0A, 0x89, 0xD3, 0x2B, 0x75, + 0xF7, 0x8D, 0x83, 0xE9, 0x87, 0x2A, 0xD4, 0xC5, + 0x75, 0xF5, 0x20, 0x39, 0x9D, 0x65, 0x03, 0x5D, + 0xED, 0x99, 0xE5, 0xEE, 0xC5, 0x80, 0x71, 0x50 + }, + { + 0x8E, 0x79, 0xF9, 0x2C, 0x86, 0x5B, 0xEB, 0x3E, + 0x1C, 0xDB, 0xF0, 0x8F, 0x75, 0x4A, 0x26, 0x06, + 0xE8, 0x53, 0x49, 0x05, 0x3D, 0x66, 0xD6, 0x16, + 0x02, 0x4A, 0x81, 0x3F, 0xCA, 0x54, 0x1A, 0x4D + }, + { + 0x86, 0x42, 0x26, 0xF2, 0x83, 0x9C, 0x76, 0xB1, + 0xD5, 0xF7, 0xC1, 0x3D, 0x98, 0xC2, 0xA5, 0x15, + 0x8C, 0x2A, 0xBB, 0x71, 0xD9, 0xD8, 0xF0, 0xFA, + 0x1F, 0x7C, 0x3F, 0x74, 0x68, 0x00, 0x16, 0x03 + }, + { + 0xD3, 0xE3, 0xF5, 0xB8, 0xCE, 0xEB, 0xB1, 0x11, + 0x84, 0x80, 0x35, 0x35, 0x90, 0x0B, 0x6E, 0xED, + 0xDA, 0x60, 0x6E, 0xEB, 0x36, 0x97, 0x51, 0xA7, + 0xCD, 0xA3, 0x6C, 0xA3, 0x02, 0x29, 0xFB, 0x02 + }, + { + 0x8C, 0x7D, 0x6B, 0x98, 0x72, 0x69, 0x16, 0x90, + 0x31, 0xF7, 0x1F, 0xD7, 0xE4, 0xC4, 0x45, 0x01, + 0x2D, 0x3E, 0x6A, 0x3C, 0x88, 0x09, 0xF6, 0x47, + 0x9B, 0xD6, 0x67, 0xCF, 0x31, 0x1E, 0x27, 0x6E + }, + { + 0xB9, 0x04, 0xB5, 0x71, 0x1B, 0xF1, 0x9E, 0x85, + 0x32, 0xF7, 0xAD, 0x64, 0x27, 0x41, 0x0A, 0x62, + 0xA1, 0xF7, 0x7F, 0x77, 0xB9, 0xB6, 0xD7, 0x1D, + 0x2F, 0xC4, 0x3B, 0xC9, 0x0F, 0x73, 0x23, 0x5A + }, + { + 0x45, 0x36, 0x63, 0x43, 0x15, 0xC8, 0x67, 0x28, + 0xF5, 0xAB, 0x74, 0x49, 0xEB, 0x2D, 0x04, 0x02, + 0x0E, 0x9E, 0xAE, 0x8D, 0xD6, 0x79, 0x55, 0x00, + 0xE9, 0xEC, 0x9A, 0x00, 0x66, 0x38, 0x6E, 0x69 + }, + { + 0xFD, 0x5E, 0x49, 0xFE, 0xD4, 0x9D, 0xC4, 0x4B, + 0xDE, 0x89, 0xF4, 0x60, 0xA9, 0x50, 0x19, 0x1E, + 0xBB, 0x06, 0x7C, 0x69, 0x8A, 0x3F, 0x21, 0xEA, + 0x14, 0x30, 0x8C, 0x74, 0x13, 0xB9, 0x16, 0x81 + }, + { + 0x31, 0xF0, 0x1D, 0x03, 0x0B, 0x9B, 0x22, 0xD0, + 0x0A, 0x0F, 0x71, 0xED, 0x2C, 0xEB, 0x5D, 0x2D, + 0xC8, 0x1A, 0xF2, 0xC2, 0x4B, 0xF5, 0x67, 0x0F, + 0xDE, 0x19, 0xA6, 0x85, 0xE8, 0xD1, 0x39, 0x2E + }, + { + 0x5F, 0x84, 0xD9, 0xDE, 0x28, 0x4B, 0x1E, 0x4F, + 0x67, 0x8E, 0x31, 0xAB, 0x6A, 0x76, 0xF5, 0x66, + 0x1B, 0x5A, 0xEA, 0xA7, 0x68, 0x53, 0x93, 0x84, + 0xAA, 0x38, 0xF9, 0xE4, 0x9C, 0xCE, 0x6E, 0x6E + }, + { + 0xB2, 0x07, 0x9E, 0x59, 0x97, 0xA4, 0xEA, 0xD3, + 0xA7, 0x1F, 0xEF, 0xC0, 0x2F, 0x90, 0xA7, 0x48, + 0x3A, 0x10, 0xFD, 0x2E, 0x6F, 0x31, 0xBD, 0xA9, + 0xD2, 0x08, 0x44, 0x85, 0xCC, 0x01, 0x6B, 0xBD + }, + { + 0xE0, 0xF8, 0x4D, 0x7F, 0x52, 0x5B, 0x6F, 0xED, + 0x79, 0x1F, 0x77, 0x28, 0x9A, 0xE5, 0x8F, 0x7D, + 0x50, 0xA2, 0x94, 0x32, 0xD4, 0x2C, 0x25, 0xC1, + 0xE8, 0x39, 0x29, 0xB8, 0x38, 0x89, 0x1D, 0x79 + }, + { + 0x70, 0x46, 0x96, 0x90, 0x95, 0x6D, 0x79, 0x18, + 0xAC, 0xE7, 0xBA, 0x5F, 0x41, 0x30, 0x2D, 0xA1, + 0x38, 0xC9, 0xB5, 0x6E, 0xCD, 0x41, 0x55, 0x44, + 0xFA, 0xCE, 0x8D, 0x99, 0x8C, 0x21, 0xAB, 0xEB + }, + { + 0x45, 0xC9, 0x1A, 0x62, 0x24, 0x9B, 0x39, 0xCD, + 0xA9, 0x4E, 0x50, 0x82, 0x95, 0xBE, 0xC7, 0x66, + 0x71, 0x19, 0x44, 0x77, 0x65, 0xEF, 0x80, 0xEF, + 0xA8, 0x2D, 0x1E, 0x92, 0xD5, 0x70, 0x67, 0xD8 + }, + { + 0x1D, 0x9E, 0x00, 0x73, 0xEE, 0xD0, 0x73, 0x15, + 0x54, 0xC3, 0xBE, 0xAA, 0x47, 0x46, 0x0D, 0x51, + 0x1A, 0xD2, 0x61, 0xDD, 0x4D, 0x4A, 0x3B, 0xED, + 0x9D, 0x8D, 0x20, 0x2F, 0x22, 0xF2, 0x15, 0x89 + }, + { + 0x40, 0x82, 0x62, 0x73, 0x6D, 0x8A, 0xEC, 0x0B, + 0x84, 0x7D, 0xBA, 0x25, 0x02, 0x58, 0x60, 0x8A, + 0x43, 0x45, 0xA6, 0x3A, 0x1E, 0xB1, 0x95, 0xE5, + 0xC7, 0xAE, 0x2E, 0xE8, 0x74, 0xC3, 0x4D, 0xA8 + }, + { + 0x23, 0xD2, 0xB7, 0x04, 0x39, 0x46, 0x99, 0x49, + 0x98, 0x23, 0x90, 0x53, 0x8D, 0x7E, 0x5A, 0xDE, + 0x9F, 0x18, 0xC8, 0xE3, 0xBB, 0xF6, 0x60, 0x5A, + 0xFC, 0xF4, 0x9B, 0x00, 0xC0, 0x61, 0xE8, 0x37 + }, + { + 0x23, 0x2F, 0xB1, 0x87, 0xD2, 0x71, 0xBE, 0xA9, + 0x12, 0xEF, 0xD4, 0x07, 0xFF, 0xE0, 0x80, 0x56, + 0xD6, 0xA4, 0x2E, 0x53, 0x21, 0xEC, 0x79, 0x2D, + 0xF3, 0xD5, 0x84, 0xA9, 0x4F, 0x63, 0x0A, 0xB2 + }, + { + 0x13, 0x8E, 0x19, 0x44, 0xE4, 0xB5, 0x4D, 0xE8, + 0x68, 0x1D, 0x7E, 0x48, 0xC4, 0xF0, 0x81, 0x48, + 0xE4, 0x0A, 0x56, 0x7E, 0x5C, 0xAD, 0x94, 0x6A, + 0x6A, 0xF4, 0xE8, 0xD5, 0xD2, 0x6F, 0x75, 0xC7 + }, + { + 0x80, 0xC1, 0x51, 0x32, 0x5F, 0xBF, 0xC6, 0x78, + 0xB7, 0xBE, 0x4E, 0x40, 0xB3, 0x0F, 0x29, 0xFE, + 0x31, 0xCD, 0xBE, 0x1C, 0x84, 0x12, 0x6E, 0x00, + 0x6D, 0xF3, 0xC1, 0x85, 0x24, 0xBD, 0x2D, 0x6C + }, + { + 0xA6, 0x42, 0x26, 0x73, 0x01, 0x66, 0x9D, 0xF2, + 0x61, 0xB8, 0x39, 0xF8, 0x73, 0x65, 0x76, 0x29, + 0x05, 0xFF, 0x32, 0x0A, 0x0A, 0x2F, 0xC4, 0xBD, + 0xC4, 0x8E, 0x5A, 0x8E, 0x15, 0xD1, 0x32, 0x33 + }, + { + 0x0F, 0x8B, 0x10, 0x99, 0x38, 0x60, 0x93, 0x7A, + 0x74, 0xCC, 0x2D, 0xE4, 0x0A, 0x27, 0x31, 0xDD, + 0x99, 0x54, 0xB6, 0x54, 0xBB, 0x94, 0xC3, 0x4E, + 0x87, 0x66, 0x52, 0xE9, 0x8D, 0x4B, 0xBD, 0x16 + }, + { + 0xE6, 0x34, 0xA5, 0x85, 0x12, 0x49, 0x32, 0x73, + 0x26, 0x0F, 0x10, 0xD4, 0x49, 0x53, 0xCD, 0x99, + 0x8E, 0x34, 0xCB, 0x82, 0x81, 0xC4, 0x1B, 0xF4, + 0x2E, 0x0A, 0xE2, 0xF2, 0x5C, 0xBD, 0x1F, 0x75 + }, + { + 0xBD, 0xE6, 0xAF, 0x9B, 0xAF, 0x3C, 0x07, 0xE9, + 0x54, 0x23, 0xCA, 0xB5, 0x04, 0xDE, 0xE7, 0x0E, + 0xDC, 0xC3, 0x31, 0x8B, 0x22, 0xDD, 0x1E, 0xB6, + 0xFD, 0x85, 0xBE, 0x44, 0x7A, 0xC9, 0xF2, 0x09 + }, + { + 0x91, 0x4B, 0x37, 0xAB, 0x5B, 0x8C, 0xFD, 0xE6, + 0xA4, 0x80, 0x46, 0x6A, 0x0D, 0x82, 0x43, 0x2C, + 0x7D, 0x76, 0x32, 0x8E, 0x9A, 0x88, 0xEF, 0x5B, + 0x4F, 0x52, 0x42, 0x9F, 0x7A, 0x3F, 0xFC, 0x7D + }, + { + 0x55, 0xBE, 0x66, 0xE9, 0xA5, 0xAA, 0x67, 0x1A, + 0x23, 0x88, 0x2E, 0xF3, 0xE7, 0xD9, 0xD3, 0x6E, + 0xA9, 0x54, 0x87, 0xDC, 0x71, 0xB7, 0x25, 0xA5, + 0xAD, 0x4B, 0x79, 0x8A, 0x87, 0x91, 0x43, 0xD0 + }, + { + 0x3F, 0xD0, 0x45, 0x89, 0x4B, 0x83, 0x6E, 0x44, + 0xE9, 0xCA, 0x75, 0xFB, 0xE3, 0xEA, 0xDC, 0x48, + 0x6C, 0xBB, 0xD0, 0xD8, 0xCE, 0xE1, 0xB3, 0xCF, + 0x14, 0xF7, 0x6E, 0x7F, 0x1E, 0x77, 0xAE, 0xF3 + }, + { + 0xCE, 0x60, 0x34, 0x3D, 0xC4, 0x87, 0x4B, 0x66, + 0x04, 0xE1, 0xFB, 0x23, 0x1E, 0x37, 0xEC, 0x1E, + 0xEC, 0x3F, 0x06, 0x56, 0x6E, 0x42, 0x8A, 0xE7, + 0x64, 0xEF, 0xFF, 0xA2, 0x30, 0xAD, 0xD4, 0x85 + }, + { + 0xE3, 0x8C, 0x9D, 0xF0, 0x24, 0xDE, 0x21, 0x53, + 0xD2, 0x26, 0x73, 0x8A, 0x0E, 0x5B, 0xA9, 0xB8, + 0xC6, 0x78, 0x4D, 0xAC, 0xA6, 0x5C, 0x22, 0xA7, + 0x62, 0x8E, 0xB5, 0x8E, 0xA0, 0xD4, 0x95, 0xA7 + }, + { + 0x8D, 0xFE, 0xC0, 0xD4, 0xF3, 0x65, 0x8A, 0x20, + 0xA0, 0xBA, 0xD6, 0x6F, 0x21, 0x60, 0x83, 0x2B, + 0x16, 0x4E, 0x70, 0x0A, 0x21, 0xEC, 0x5A, 0x01, + 0x65, 0xC3, 0x67, 0x72, 0xB2, 0x08, 0x61, 0x11 + }, + { + 0x44, 0x01, 0xB5, 0x0E, 0x09, 0x86, 0x5F, 0x42, + 0x38, 0x24, 0x3B, 0x82, 0x25, 0xCA, 0x40, 0xA0, + 0x8D, 0xBB, 0x46, 0x85, 0xF5, 0xF8, 0x62, 0xFB, + 0xDD, 0x72, 0x98, 0x04, 0x31, 0xA8, 0x5D, 0x3F + }, + { + 0x86, 0x68, 0x94, 0x27, 0x88, 0xC4, 0xCE, 0x8A, + 0x33, 0x19, 0x0F, 0xFC, 0xFA, 0xD1, 0xC6, 0x78, + 0xC4, 0xFA, 0x41, 0xE9, 0x94, 0x17, 0x09, 0x4E, + 0x24, 0x0F, 0x4A, 0x43, 0xF3, 0x87, 0xA3, 0xB6 + }, + { + 0xA7, 0x28, 0x8D, 0x5E, 0x09, 0x80, 0x9B, 0x69, + 0x69, 0x84, 0xEC, 0xD5, 0x32, 0x6C, 0xDD, 0x84, + 0xFB, 0xE3, 0x5F, 0xCF, 0x67, 0x23, 0x5D, 0x81, + 0x1C, 0x82, 0x00, 0x25, 0x36, 0xA3, 0xC5, 0xE1 + }, + { + 0x8E, 0x92, 0x5C, 0x3C, 0x14, 0x6B, 0xAC, 0xF3, + 0x35, 0x1E, 0xC5, 0x32, 0x41, 0xAC, 0xE5, 0xF7, + 0x3E, 0x8F, 0xC9, 0xBD, 0x8C, 0x61, 0xCA, 0xD9, + 0x7F, 0xD7, 0x72, 0xB0, 0x7E, 0x1B, 0x83, 0x73 + }, + { + 0xC7, 0xEB, 0x9E, 0x6D, 0xED, 0x2F, 0x99, 0x3D, + 0x48, 0xB0, 0x17, 0x0D, 0xA2, 0x7C, 0x5B, 0x75, + 0x3B, 0x12, 0x17, 0x6B, 0xE1, 0x26, 0xC7, 0xBA, + 0x2D, 0x6A, 0xF8, 0x5F, 0x85, 0x93, 0xB7, 0x52 + }, + { + 0xCA, 0x27, 0xF1, 0x6F, 0x94, 0xE4, 0xEC, 0x0E, + 0x62, 0x8E, 0x7F, 0x8A, 0xEF, 0xC6, 0x65, 0x7B, + 0xED, 0xC9, 0x37, 0x42, 0x96, 0x59, 0x40, 0xAE, + 0x78, 0x6A, 0x73, 0xB5, 0xFD, 0x59, 0x3B, 0x97 + }, + { + 0x8C, 0x21, 0xE6, 0x56, 0x8B, 0xC6, 0xDC, 0x00, + 0xE3, 0xD6, 0xEB, 0xC0, 0x9E, 0xA9, 0xC2, 0xCE, + 0x00, 0x6C, 0xD3, 0x11, 0xD3, 0xB3, 0xE9, 0xCC, + 0x9D, 0x8D, 0xDB, 0xFB, 0x3C, 0x5A, 0x77, 0x76 + }, + { + 0x52, 0x56, 0x66, 0x96, 0x8B, 0x3B, 0x7D, 0x00, + 0x7B, 0xB9, 0x26, 0xB6, 0xEF, 0xDC, 0x7E, 0x21, + 0x2A, 0x31, 0x15, 0x4C, 0x9A, 0xE1, 0x8D, 0x43, + 0xEE, 0x0E, 0xB7, 0xE6, 0xB1, 0xA9, 0x38, 0xD3 + }, + { + 0xE0, 0x9A, 0x4F, 0xA5, 0xC2, 0x8B, 0xDC, 0xD7, + 0xC8, 0x39, 0x84, 0x0E, 0x0A, 0x38, 0x3E, 0x4F, + 0x7A, 0x10, 0x2D, 0x0B, 0x1B, 0xC8, 0x49, 0xC9, + 0x49, 0x62, 0x7C, 0x41, 0x00, 0xC1, 0x7D, 0xD3 + }, + { + 0xC1, 0x9F, 0x3E, 0x29, 0x5D, 0xB2, 0xFC, 0x0E, + 0x74, 0x81, 0xC4, 0xF1, 0x6A, 0xF0, 0x11, 0x55, + 0xDD, 0xB0, 0xD7, 0xD1, 0x38, 0x3D, 0x4A, 0x1F, + 0xF1, 0x69, 0x9D, 0xB7, 0x11, 0x77, 0x34, 0x0C + }, + { + 0x76, 0x9E, 0x67, 0x8C, 0x0A, 0x09, 0x09, 0xA2, + 0x02, 0x1C, 0x4D, 0xC2, 0x6B, 0x1A, 0x3C, 0x9B, + 0xC5, 0x57, 0xAD, 0xB2, 0x1A, 0x50, 0x83, 0x4C, + 0xDC, 0x5C, 0x92, 0x93, 0xF7, 0x53, 0x65, 0xF8 + }, + { + 0xB6, 0x48, 0x74, 0xAD, 0xAB, 0x6B, 0xCB, 0x85, + 0xB9, 0x4B, 0xD9, 0xA6, 0xC5, 0x65, 0xD0, 0xD2, + 0xBC, 0x35, 0x44, 0x5D, 0x75, 0x28, 0xBC, 0x85, + 0xB4, 0x1F, 0xDC, 0x79, 0xDC, 0x76, 0xE3, 0x4F + }, + { + 0xFA, 0xF2, 0x50, 0xDE, 0x15, 0x82, 0x0F, 0x7F, + 0xC6, 0x10, 0xDD, 0x53, 0xEE, 0xAE, 0x44, 0x60, + 0x1C, 0x3E, 0xFF, 0xA3, 0xAC, 0xCD, 0x08, 0x8E, + 0xB6, 0x69, 0x05, 0xBB, 0x26, 0x53, 0xBE, 0x8C + }, + { + 0x1E, 0x20, 0x38, 0x73, 0x9B, 0x2C, 0x01, 0x8B, + 0x0E, 0x9E, 0x0E, 0x1E, 0x52, 0x2F, 0xD9, 0x65, + 0x12, 0x87, 0xEE, 0x6E, 0x36, 0x65, 0x91, 0x9B, + 0x24, 0xC2, 0x12, 0x4F, 0x0C, 0x1A, 0x3F, 0x3A + }, + { + 0x5F, 0xEC, 0x3A, 0xA0, 0x08, 0x61, 0xDE, 0x1A, + 0xC5, 0xDA, 0xB3, 0xC1, 0x37, 0x06, 0x5D, 0x1E, + 0x01, 0xBB, 0x03, 0xF6, 0x9D, 0xCC, 0x7D, 0x1C, + 0xF7, 0xCA, 0x4F, 0x43, 0x56, 0xAE, 0xC9, 0xA3 + }, + { + 0x44, 0x51, 0xFE, 0x6B, 0xBE, 0xF3, 0x93, 0x43, + 0x91, 0x92, 0x44, 0xC5, 0x1D, 0xAE, 0x1E, 0xA9, + 0xA9, 0x54, 0xCF, 0x2C, 0x09, 0x66, 0xAB, 0x04, + 0x5B, 0x15, 0x52, 0x1E, 0xCF, 0x35, 0x00, 0x81 + }, + { + 0x8C, 0x62, 0x2F, 0xA2, 0x16, 0x0E, 0x8E, 0x99, + 0x18, 0x13, 0xF1, 0x80, 0xBF, 0xEC, 0x0B, 0x43, + 0x1C, 0x6D, 0xBF, 0xA2, 0x95, 0x6D, 0x91, 0x75, + 0x81, 0x6A, 0x23, 0xC3, 0x82, 0xC4, 0xF2, 0x00 + }, + { + 0x81, 0x7D, 0x5C, 0x8F, 0x92, 0xE7, 0xB5, 0xCA, + 0x57, 0xF5, 0xE1, 0x63, 0x90, 0x16, 0xAD, 0x57, + 0x60, 0xE4, 0x46, 0xD6, 0xE9, 0xCA, 0xA7, 0x49, + 0x84, 0x14, 0xAC, 0xE8, 0x22, 0x80, 0xB5, 0xCD + }, + { + 0xA6, 0xA1, 0xAD, 0x58, 0xCE, 0xE5, 0x4E, 0x69, + 0xCB, 0xBC, 0xAA, 0x87, 0xDF, 0x07, 0xA6, 0x70, + 0x7E, 0xB2, 0x24, 0x73, 0x9C, 0x21, 0x76, 0x13, + 0x46, 0x0A, 0xB4, 0x54, 0xB4, 0x59, 0xCA, 0x9C + }, + { + 0x63, 0xB8, 0x47, 0x27, 0x52, 0x26, 0x60, 0x5B, + 0xE6, 0x76, 0x81, 0x25, 0x8F, 0x7D, 0x00, 0xBB, + 0xB3, 0x07, 0xC6, 0x6F, 0x19, 0x59, 0xBF, 0x2E, + 0x46, 0x7A, 0x41, 0xAE, 0xE7, 0x14, 0xE5, 0x5C + }, + { + 0xFE, 0x52, 0xEB, 0xE5, 0xCF, 0xCF, 0xE6, 0xA2, + 0x29, 0x7B, 0x53, 0x9F, 0xA3, 0xDA, 0xDB, 0xD6, + 0xEB, 0xD2, 0x01, 0xAA, 0x2C, 0xA1, 0x35, 0x63, + 0xE3, 0xD7, 0xF1, 0x4D, 0x15, 0xAB, 0xFF, 0x63 + }, + { + 0xB7, 0xBE, 0xF9, 0xFA, 0x5A, 0x3D, 0x10, 0x42, + 0x62, 0x46, 0xB5, 0xF6, 0x58, 0xC0, 0x8F, 0xDF, + 0x80, 0x66, 0xEA, 0xA3, 0xE5, 0x5A, 0x2F, 0x7D, + 0xA1, 0x59, 0x1E, 0x05, 0xC8, 0x7D, 0xF8, 0xC7 + }, + { + 0xDE, 0xD1, 0xD6, 0xCA, 0xA9, 0xF8, 0xF3, 0xBD, + 0xA9, 0x2C, 0xEA, 0x7F, 0x65, 0x49, 0xB1, 0xFB, + 0x86, 0xA2, 0x21, 0x14, 0x78, 0xC4, 0xEC, 0x28, + 0x9B, 0x83, 0x7E, 0xFC, 0x2B, 0x5C, 0x27, 0xD7 + }, + { + 0x9F, 0x30, 0x00, 0x8A, 0x2E, 0xB0, 0x50, 0xF1, + 0x8E, 0x56, 0xA7, 0x6B, 0xE9, 0x20, 0x91, 0xB2, + 0xFD, 0xC1, 0x64, 0xD5, 0x6E, 0x32, 0xC8, 0x7D, + 0xD6, 0x4C, 0x9E, 0x3A, 0x61, 0x10, 0x41, 0xB1 + }, + { + 0x01, 0x0B, 0x6A, 0x3B, 0x11, 0x86, 0x00, 0x88, + 0xF0, 0xAB, 0xC8, 0x0A, 0x89, 0x72, 0xCB, 0xBC, + 0x32, 0x9D, 0x52, 0x75, 0x34, 0x29, 0x50, 0xEB, + 0x9A, 0x04, 0x5A, 0xFD, 0xC8, 0xBB, 0xED, 0x24 + }, + { + 0x0C, 0xD2, 0x10, 0xAA, 0xC1, 0x1F, 0x1C, 0x1C, + 0xED, 0x49, 0x7F, 0x67, 0x3E, 0x53, 0xDB, 0x68, + 0xC3, 0xEC, 0x36, 0x07, 0xF0, 0xC5, 0x78, 0x7D, + 0xDC, 0x60, 0xA3, 0x55, 0xDF, 0xE5, 0x6C, 0x25 + }, + { + 0x0E, 0x56, 0xFD, 0x01, 0xDA, 0x3B, 0x4F, 0x8B, + 0xE2, 0xC9, 0x90, 0x55, 0x2A, 0xAC, 0x8D, 0x1E, + 0x8D, 0xA2, 0x09, 0xBC, 0xF4, 0xAA, 0xD4, 0xFF, + 0xB5, 0x42, 0x7F, 0xD6, 0x31, 0x72, 0x46, 0x3E + }, + { + 0xD6, 0xD5, 0xCD, 0xB1, 0x14, 0x40, 0xE3, 0x4A, + 0xCA, 0x3A, 0x2F, 0xCF, 0x30, 0xF5, 0x9E, 0x08, + 0xB1, 0x1A, 0x2A, 0x3D, 0xE5, 0x39, 0xE3, 0xE6, + 0x51, 0x3E, 0xD7, 0x8A, 0x4F, 0xEE, 0x51, 0x3B + }, + { + 0xAA, 0x35, 0xAC, 0x90, 0x68, 0x06, 0x70, 0xC7, + 0x32, 0xED, 0x1E, 0xF3, 0x7E, 0x8C, 0xBA, 0xAE, + 0x49, 0xA4, 0xD8, 0x8E, 0xCF, 0x4D, 0xF2, 0xB6, + 0x89, 0xA0, 0xF1, 0x01, 0xB7, 0x56, 0xAE, 0x47 + }, + { + 0x27, 0x8E, 0x56, 0x12, 0x88, 0x72, 0x26, 0x30, + 0xE2, 0x6A, 0x5F, 0xC9, 0x54, 0xBF, 0x2D, 0xCD, + 0x6A, 0x65, 0x81, 0x67, 0x39, 0xAB, 0xEE, 0x7B, + 0xE1, 0x43, 0x07, 0xA9, 0x61, 0x74, 0xE5, 0xB0 + }, + { + 0xAB, 0x4B, 0x2C, 0xA1, 0xA2, 0xB3, 0x49, 0x98, + 0x15, 0x24, 0xB6, 0x15, 0x54, 0x62, 0xF0, 0xFF, + 0x10, 0x60, 0xBF, 0x9B, 0xFA, 0x07, 0xFB, 0x9E, + 0xC6, 0x9C, 0xA4, 0x71, 0x64, 0x5B, 0x6A, 0x18 + }, + { + 0x18, 0xA9, 0xBB, 0xEC, 0x3C, 0x8E, 0x1F, 0x8E, + 0xE9, 0x57, 0x12, 0x97, 0xA9, 0x34, 0x36, 0xDE, + 0x42, 0x7C, 0xD2, 0x70, 0xEC, 0x69, 0xDF, 0xE8, + 0x88, 0xDB, 0x7D, 0xBF, 0x10, 0xB6, 0x49, 0x93 + }, + { + 0xBA, 0xFC, 0x7E, 0x43, 0xD2, 0x65, 0xA1, 0x73, + 0x02, 0x1A, 0x9D, 0x9E, 0x58, 0x3D, 0x60, 0xED, + 0x42, 0xA8, 0x03, 0xFA, 0xCD, 0x6B, 0x83, 0x60, + 0xDE, 0x1F, 0x91, 0x68, 0x35, 0x38, 0x9B, 0xF0 + }, + { + 0xA5, 0xB6, 0x7B, 0xE9, 0x50, 0xFB, 0xC2, 0xF0, + 0xDD, 0x32, 0x3A, 0x79, 0xA1, 0x9E, 0x3E, 0xD1, + 0xF4, 0xAE, 0x4B, 0xA7, 0x89, 0x4F, 0x93, 0x0E, + 0xA5, 0xEF, 0x73, 0x4D, 0xE7, 0xDB, 0x83, 0xAE + }, + { + 0xBF, 0x1E, 0x65, 0xF3, 0xCD, 0x84, 0x98, 0x88, + 0x4D, 0x9D, 0x5C, 0x19, 0xEB, 0xF7, 0xB9, 0x16, + 0x06, 0x76, 0x37, 0x60, 0x4E, 0x26, 0xDB, 0xE2, + 0xB7, 0x28, 0x8E, 0xCB, 0x11, 0x42, 0x60, 0x68 + }, + { + 0xC3, 0x34, 0x2C, 0xF9, 0xCB, 0xBF, 0x29, 0xD4, + 0x06, 0xD7, 0x89, 0x5D, 0xD4, 0xD9, 0x54, 0x8D, + 0x4A, 0xC7, 0x8B, 0x4D, 0x00, 0xE9, 0xB6, 0x3E, + 0x20, 0x3E, 0x5E, 0x19, 0xE9, 0x97, 0x46, 0x20 + }, + { + 0x1C, 0x0B, 0xE6, 0x02, 0x77, 0x43, 0x4B, 0x0E, + 0x00, 0x4B, 0x7B, 0x38, 0x8A, 0x37, 0x55, 0x9F, + 0x84, 0xB3, 0x0C, 0x6C, 0xF8, 0x60, 0x0F, 0x52, + 0x8B, 0xFC, 0xD3, 0x3C, 0xAF, 0x52, 0xCB, 0x1E + }, + { + 0x73, 0x95, 0x45, 0x30, 0xD0, 0x3F, 0x10, 0xBE, + 0xF5, 0x2A, 0xD5, 0xBC, 0x7F, 0xB4, 0xC0, 0x76, + 0xF8, 0x3F, 0x63, 0x31, 0xC8, 0xBD, 0x1E, 0xEE, + 0xC3, 0x88, 0x7F, 0x4A, 0xA2, 0x06, 0x92, 0x40 + }, + { + 0x69, 0xC1, 0x1E, 0xE0, 0x49, 0x44, 0xDE, 0xA9, + 0x85, 0xAC, 0x9F, 0x13, 0x96, 0x0E, 0x73, 0x98, + 0x0E, 0x1B, 0xB0, 0xE3, 0x09, 0xF4, 0x38, 0x4A, + 0x16, 0x76, 0xF8, 0xEF, 0xAB, 0x38, 0x42, 0x88 + }, + { + 0x36, 0xFB, 0x8F, 0xDE, 0x0E, 0xC2, 0x8C, 0xE8, + 0x53, 0xFB, 0x71, 0x75, 0xC1, 0xB7, 0x9D, 0xA3, + 0xB5, 0xE8, 0xC3, 0x91, 0x86, 0xE7, 0x8A, 0xAE, + 0xCE, 0x54, 0x64, 0xDB, 0xD9, 0xFE, 0x2A, 0xA2 + }, + { + 0x6B, 0xB2, 0xA0, 0x9D, 0xFC, 0xAF, 0x96, 0x96, + 0x2D, 0xE0, 0x0C, 0x8A, 0x08, 0x2D, 0x6D, 0xF9, + 0x32, 0x2B, 0x49, 0x66, 0xAE, 0x8D, 0x2E, 0xCF, + 0x73, 0x24, 0x11, 0xA7, 0x6A, 0x1A, 0x0E, 0xE6 + }, + { + 0x74, 0x12, 0xE7, 0xDD, 0x1B, 0xF1, 0xAA, 0x93, + 0x97, 0x41, 0x1B, 0xBA, 0x4D, 0x3E, 0x02, 0x76, + 0xD2, 0xE7, 0xA1, 0xA2, 0x9A, 0x24, 0x77, 0x15, + 0x7A, 0xD6, 0x03, 0x60, 0xD3, 0x3D, 0x4E, 0x76 + }, + { + 0xDD, 0xDE, 0xAF, 0xCF, 0xC7, 0x23, 0x21, 0xC8, + 0x49, 0xFB, 0x25, 0x94, 0x7A, 0xB4, 0x2C, 0x1A, + 0xF2, 0xA5, 0xE4, 0x3F, 0xEF, 0x68, 0x1B, 0xE4, + 0x2C, 0x7E, 0xAF, 0x36, 0x60, 0x08, 0x0A, 0xD3 + }, + { + 0x9D, 0xEF, 0xEB, 0xAD, 0xBD, 0xCB, 0x0A, 0x0E, + 0x7F, 0xF9, 0x92, 0xF9, 0x47, 0xCE, 0xD3, 0xD0, + 0xA4, 0xC8, 0x99, 0xE6, 0x4F, 0xE7, 0x73, 0x60, + 0xE8, 0x1E, 0x1F, 0x0E, 0x97, 0xF8, 0xC1, 0xA2 + }, + { + 0x84, 0x4C, 0x59, 0xFB, 0xE6, 0x47, 0x6F, 0xD1, + 0x89, 0x23, 0x99, 0x54, 0xF1, 0x7E, 0x36, 0xE1, + 0xF6, 0x9E, 0x24, 0xAA, 0xED, 0x5D, 0x5C, 0x8B, + 0x84, 0x05, 0xEF, 0x2A, 0x83, 0x0C, 0xC2, 0xA0 + }, + { + 0xFF, 0x3F, 0xAF, 0xB6, 0x77, 0x86, 0xE0, 0x1A, + 0x0C, 0x38, 0xEA, 0xDF, 0x99, 0xC4, 0xCA, 0xE8, + 0x02, 0x9D, 0xA8, 0xCF, 0x29, 0x87, 0x5F, 0xC4, + 0x19, 0xBF, 0x68, 0x00, 0x09, 0xB3, 0xBD, 0xB3 + }, + { + 0xCA, 0x67, 0x60, 0xF3, 0x45, 0x67, 0x8F, 0x30, + 0xA2, 0x8D, 0x62, 0x82, 0x94, 0x27, 0x2A, 0x19, + 0xE3, 0x07, 0x2E, 0xBC, 0x61, 0xB1, 0x9F, 0xF1, + 0x3B, 0x31, 0x89, 0x73, 0xE9, 0x7C, 0x27, 0x38 + }, + { + 0xC0, 0x8E, 0x1A, 0x90, 0x47, 0xC5, 0x05, 0x26, + 0x4A, 0x16, 0x44, 0x7C, 0x9E, 0xD9, 0x81, 0xA7, + 0x19, 0xD3, 0x81, 0xF2, 0x8E, 0x60, 0x5F, 0xD7, + 0xCA, 0xA9, 0xE8, 0xBD, 0xBB, 0x42, 0x99, 0x6A + }, + { + 0xF1, 0x73, 0xBA, 0x9D, 0x45, 0x84, 0xCD, 0x12, + 0x60, 0x50, 0xC6, 0x9F, 0xC2, 0x19, 0xA9, 0x19, + 0x0A, 0x0B, 0xF0, 0xAE, 0xCE, 0xCB, 0xE6, 0x11, + 0xBE, 0xED, 0x19, 0x3D, 0xA6, 0xCA, 0x4D, 0xE7 + }, + { + 0xB1, 0x84, 0x87, 0x65, 0x20, 0xDE, 0xD8, 0xBD, + 0x7D, 0xE2, 0x5E, 0xAE, 0xFB, 0xD3, 0xE0, 0x36, + 0x88, 0xC3, 0xBE, 0x39, 0xC1, 0x9F, 0xB7, 0x3E, + 0x1F, 0x0E, 0xCC, 0xAC, 0x7C, 0xC0, 0xF0, 0x14 + }, + { + 0x90, 0x25, 0xDB, 0x07, 0x58, 0xBD, 0xFB, 0x48, + 0xF0, 0x66, 0x7E, 0xBD, 0x7E, 0x12, 0x02, 0x46, + 0x59, 0x8F, 0xED, 0x01, 0xC2, 0x58, 0x76, 0x4F, + 0xA0, 0xFA, 0xE3, 0x34, 0xA2, 0xA0, 0x0A, 0x97 + }, + { + 0xE8, 0x3D, 0x80, 0x86, 0xFA, 0xBC, 0x46, 0x0D, + 0x5E, 0xFC, 0x45, 0x9F, 0x95, 0xA2, 0x68, 0xF5, + 0xDC, 0x4A, 0xC2, 0x84, 0x09, 0x3C, 0x24, 0x7C, + 0xA6, 0xEC, 0x84, 0x1A, 0xD6, 0x18, 0x3F, 0xE1 + }, + { + 0xCC, 0x9D, 0xF4, 0x1D, 0x35, 0xAA, 0x75, 0x92, + 0x8C, 0x18, 0x5F, 0x73, 0x93, 0x66, 0x61, 0x10, + 0xB8, 0x0F, 0x09, 0x86, 0xA2, 0x21, 0xC3, 0x70, + 0xF4, 0x5C, 0x2E, 0xB9, 0x01, 0x6C, 0x9A, 0x3B + }, + { + 0x92, 0xF9, 0xA5, 0x94, 0x95, 0x45, 0x90, 0xFA, + 0x81, 0x98, 0x17, 0xE5, 0xD1, 0xC2, 0x8A, 0xAB, + 0x2B, 0x1C, 0xC5, 0x04, 0xD8, 0x6D, 0xBA, 0x44, + 0x36, 0x76, 0xBD, 0xF8, 0x66, 0x79, 0x68, 0x11 + }, + { + 0x72, 0x95, 0x62, 0xA1, 0xE0, 0x7B, 0x0E, 0x26, + 0x05, 0x49, 0x48, 0x09, 0xBD, 0x48, 0x0F, 0x15, + 0x37, 0xCE, 0xA1, 0x0D, 0xCA, 0xD4, 0x3E, 0xF9, + 0xF6, 0x8C, 0x66, 0xE8, 0x25, 0xDC, 0x46, 0xB1 + }, + { + 0x26, 0xF1, 0x60, 0xAB, 0x96, 0xF5, 0x58, 0x20, + 0x45, 0x14, 0x6E, 0xAF, 0xF2, 0xE2, 0xA8, 0xD4, + 0xDA, 0xB2, 0x98, 0xB4, 0xC5, 0x7E, 0x11, 0x7C, + 0xDF, 0xC5, 0xD0, 0x25, 0xC9, 0x2A, 0x22, 0x68 + }, + { + 0x87, 0xEB, 0xE7, 0x21, 0x38, 0x38, 0x73, 0xD2, + 0x47, 0xF8, 0x61, 0x82, 0xE3, 0xF5, 0x99, 0xA7, + 0x63, 0x4F, 0xCA, 0xEC, 0x5E, 0x07, 0xB1, 0xE8, + 0x3E, 0xBB, 0x79, 0x62, 0x5B, 0xA3, 0x54, 0xE6 + }, + { + 0xE0, 0x8D, 0x38, 0x9F, 0x75, 0x69, 0x4A, 0xDC, + 0x99, 0x6C, 0x22, 0xF5, 0x5D, 0x4F, 0x85, 0x9F, + 0xFD, 0x0C, 0x13, 0x19, 0xFF, 0x9C, 0xED, 0xF7, + 0x8C, 0x31, 0xBE, 0x84, 0xB6, 0xF2, 0x1A, 0xBC + }, + { + 0x13, 0x63, 0xE2, 0x29, 0x13, 0xC6, 0xE1, 0x8E, + 0x7A, 0xA6, 0x5B, 0x83, 0xE7, 0x51, 0xC8, 0xA2, + 0xC6, 0x1B, 0x0F, 0x30, 0x71, 0x55, 0x86, 0x5A, + 0x57, 0xDB, 0xA5, 0x69, 0xA9, 0x9C, 0x7B, 0x0E + }, + { + 0x88, 0x78, 0x08, 0x8E, 0xB2, 0xD1, 0xF6, 0xD0, + 0xBB, 0x48, 0x1B, 0x4B, 0xB1, 0x87, 0xDA, 0x04, + 0xBC, 0xD8, 0xC2, 0xC6, 0x39, 0xF0, 0x05, 0xB0, + 0x80, 0x54, 0xCC, 0x41, 0x75, 0x39, 0x05, 0xFB + }, + { + 0x04, 0x18, 0xD6, 0x0D, 0x05, 0xB4, 0xE1, 0x24, + 0x64, 0x6E, 0xE5, 0x0E, 0x77, 0x49, 0xA1, 0xD2, + 0x09, 0x45, 0x7B, 0xC5, 0x43, 0xE3, 0xCC, 0x11, + 0x30, 0x27, 0x4A, 0xEA, 0x0F, 0x7B, 0xF3, 0xC1 + }, + { + 0x7A, 0x39, 0x7E, 0x50, 0x3F, 0x29, 0x3B, 0xC4, + 0x2D, 0x5F, 0x7E, 0xF5, 0xEC, 0x37, 0x87, 0x24, + 0x60, 0xA4, 0xF5, 0xB5, 0xCC, 0xDE, 0x77, 0xFB, + 0x4D, 0x47, 0xAC, 0x06, 0x81, 0xE5, 0xA0, 0x49 + }, + { + 0x5C, 0x0D, 0x29, 0x83, 0xE7, 0x2A, 0x6D, 0xD4, + 0xE6, 0x52, 0xD7, 0x23, 0xC1, 0xDF, 0xC1, 0x2B, + 0x41, 0x4C, 0x87, 0x3D, 0x4A, 0xB4, 0xA0, 0xA1, + 0x50, 0x40, 0x8E, 0xB3, 0x43, 0x47, 0xE9, 0x95 + }, + { + 0x56, 0x23, 0x36, 0x54, 0x53, 0xC0, 0x49, 0x89, + 0xC7, 0xCF, 0x33, 0x63, 0x5E, 0x0F, 0xC4, 0xCD, + 0xDD, 0x68, 0x6F, 0xC9, 0x5A, 0x33, 0xDF, 0xED, + 0xCF, 0x33, 0x35, 0x79, 0x4C, 0x7D, 0xC3, 0x44 + }, + { + 0x11, 0xF6, 0xDA, 0xD1, 0x88, 0x02, 0x8F, 0xDF, + 0x13, 0x78, 0xA2, 0x56, 0xE4, 0x57, 0x0E, 0x90, + 0x63, 0x10, 0x7B, 0x8F, 0x79, 0xDC, 0x66, 0x3F, + 0xA5, 0x55, 0x6F, 0x56, 0xFD, 0x44, 0xA0, 0xF0 + }, + { + 0x0E, 0xD8, 0x16, 0x17, 0x97, 0xEC, 0xEE, 0x88, + 0x1E, 0x7D, 0x0E, 0x3F, 0x4C, 0x5F, 0xB8, 0x39, + 0xC8, 0x4E, 0xB7, 0xA9, 0x24, 0x26, 0x57, 0xCC, + 0x48, 0x30, 0x68, 0x07, 0xB3, 0x2B, 0xEF, 0xDE + }, + { + 0x73, 0x66, 0x67, 0xC9, 0x36, 0x4C, 0xE1, 0x2D, + 0xB8, 0xF6, 0xB1, 0x43, 0xC6, 0xC1, 0x78, 0xCD, + 0xEF, 0x1E, 0x14, 0x45, 0xBC, 0x5A, 0x2F, 0x26, + 0x34, 0xF0, 0x8E, 0x99, 0x32, 0x27, 0x3C, 0xAA + }, + { + 0xE1, 0x5F, 0x36, 0x8B, 0x44, 0x06, 0xC1, 0xF6, + 0x55, 0x57, 0xC8, 0x35, 0x5C, 0xBE, 0x69, 0x4B, + 0x63, 0x3E, 0x26, 0xF1, 0x55, 0xF5, 0x2B, 0x7D, + 0xA9, 0x4C, 0xFB, 0x23, 0xFD, 0x4A, 0x5D, 0x96 + }, + { + 0x43, 0x7A, 0xB2, 0xD7, 0x4F, 0x50, 0xCA, 0x86, + 0xCC, 0x3D, 0xE9, 0xBE, 0x70, 0xE4, 0x55, 0x48, + 0x25, 0xE3, 0x3D, 0x82, 0x4B, 0x3A, 0x49, 0x23, + 0x62, 0xE2, 0xE9, 0xD6, 0x11, 0xBC, 0x57, 0x9D + }, + { + 0x2B, 0x91, 0x58, 0xC7, 0x22, 0x89, 0x8E, 0x52, + 0x6D, 0x2C, 0xDD, 0x3F, 0xC0, 0x88, 0xE9, 0xFF, + 0xA7, 0x9A, 0x9B, 0x73, 0xB7, 0xD2, 0xD2, 0x4B, + 0xC4, 0x78, 0xE2, 0x1C, 0xDB, 0x3B, 0x67, 0x63 + }, + { + 0x0C, 0x8A, 0x36, 0x59, 0x7D, 0x74, 0x61, 0xC6, + 0x3A, 0x94, 0x73, 0x28, 0x21, 0xC9, 0x41, 0x85, + 0x6C, 0x66, 0x83, 0x76, 0x60, 0x6C, 0x86, 0xA5, + 0x2D, 0xE0, 0xEE, 0x41, 0x04, 0xC6, 0x15, 0xDB + }, +}; + + + + +static const uint8_t blake2bp_kat[KAT_LENGTH][BLAKE2B_OUTBYTES] = +{ + { + 0xB5, 0xEF, 0x81, 0x1A, 0x80, 0x38, 0xF7, 0x0B, + 0x62, 0x8F, 0xA8, 0xB2, 0x94, 0xDA, 0xAE, 0x74, + 0x92, 0xB1, 0xEB, 0xE3, 0x43, 0xA8, 0x0E, 0xAA, + 0xBB, 0xF1, 0xF6, 0xAE, 0x66, 0x4D, 0xD6, 0x7B, + 0x9D, 0x90, 0xB0, 0x12, 0x07, 0x91, 0xEA, 0xB8, + 0x1D, 0xC9, 0x69, 0x85, 0xF2, 0x88, 0x49, 0xF6, + 0xA3, 0x05, 0x18, 0x6A, 0x85, 0x50, 0x1B, 0x40, + 0x51, 0x14, 0xBF, 0xA6, 0x78, 0xDF, 0x93, 0x80 + }, + { + 0xA1, 0x39, 0x28, 0x0E, 0x72, 0x75, 0x7B, 0x72, + 0x3E, 0x64, 0x73, 0xD5, 0xBE, 0x59, 0xF3, 0x6E, + 0x9D, 0x50, 0xFC, 0x5C, 0xD7, 0xD4, 0x58, 0x5C, + 0xBC, 0x09, 0x80, 0x48, 0x95, 0xA3, 0x6C, 0x52, + 0x12, 0x42, 0xFB, 0x27, 0x89, 0xF8, 0x5C, 0xB9, + 0xE3, 0x54, 0x91, 0xF3, 0x1D, 0x4A, 0x69, 0x52, + 0xF9, 0xD8, 0xE0, 0x97, 0xAE, 0xF9, 0x4F, 0xA1, + 0xCA, 0x0B, 0x12, 0x52, 0x57, 0x21, 0xF0, 0x3D + }, + { + 0xEF, 0x8C, 0xDA, 0x96, 0x35, 0xD5, 0x06, 0x3A, + 0xF8, 0x11, 0x15, 0xDA, 0x3C, 0x52, 0x32, 0x5A, + 0x86, 0xE8, 0x40, 0x74, 0xF9, 0xF7, 0x24, 0xB7, + 0xCB, 0xD0, 0xB0, 0x85, 0x6F, 0xF0, 0x01, 0x77, + 0xCD, 0xD2, 0x83, 0xC2, 0x98, 0x32, 0x6C, 0xD0, + 0x91, 0x77, 0x54, 0xC5, 0x24, 0x1F, 0x14, 0x80, + 0xFB, 0x50, 0x9C, 0xF2, 0xD2, 0xC4, 0x49, 0x81, + 0x80, 0x77, 0xAE, 0x35, 0xFC, 0x33, 0x07, 0x37 + }, + { + 0x8C, 0xF9, 0x33, 0xA2, 0xD3, 0x61, 0xA3, 0xE6, + 0xA1, 0x36, 0xDB, 0xE4, 0xA0, 0x1E, 0x79, 0x03, + 0x79, 0x7A, 0xD6, 0xCE, 0x76, 0x6E, 0x2B, 0x91, + 0xB9, 0xB4, 0xA4, 0x03, 0x51, 0x27, 0xD6, 0x5F, + 0x4B, 0xE8, 0x65, 0x50, 0x11, 0x94, 0x18, 0xE2, + 0x2D, 0xA0, 0x0F, 0xD0, 0x6B, 0xF2, 0xB2, 0x75, + 0x96, 0xB3, 0x7F, 0x06, 0xBE, 0x0A, 0x15, 0x4A, + 0xAF, 0x7E, 0xCA, 0x54, 0xC4, 0x52, 0x0B, 0x97 + }, + { + 0x24, 0xDC, 0x1E, 0x6D, 0xC4, 0xE5, 0x1A, 0x3A, + 0x3C, 0x8D, 0xA6, 0x7A, 0xAC, 0xB4, 0xC5, 0x41, + 0xE4, 0x18, 0x18, 0xD1, 0x80, 0xE5, 0xBB, 0x69, + 0x75, 0x3D, 0xBB, 0xFF, 0x2F, 0x44, 0xD0, 0xE7, + 0xDA, 0x83, 0x03, 0x86, 0xBF, 0xC8, 0x3B, 0x27, + 0xA5, 0x9D, 0xBB, 0x62, 0xB9, 0x64, 0xFC, 0x8E, + 0xA6, 0xCB, 0xDF, 0x30, 0x49, 0xBF, 0xF8, 0x1F, + 0x24, 0xF3, 0x48, 0xDB, 0x4E, 0xFD, 0x0D, 0x07 + }, + { + 0xBC, 0x23, 0xF5, 0xAB, 0xDF, 0xFD, 0x6A, 0x32, + 0xA5, 0xD4, 0x08, 0x11, 0x26, 0x2E, 0xD4, 0x47, + 0x9E, 0xF7, 0x0B, 0x42, 0x33, 0xCA, 0x20, 0x5B, + 0xC5, 0xB9, 0xBF, 0x85, 0x96, 0x73, 0x19, 0x82, + 0xD0, 0x41, 0x69, 0xA9, 0x04, 0xDD, 0x43, 0xB0, + 0xE0, 0xF9, 0x48, 0x99, 0xF7, 0x33, 0x02, 0x2D, + 0x24, 0xD8, 0x4F, 0xAD, 0x0A, 0x99, 0x16, 0x00, + 0xF1, 0x97, 0x9B, 0x27, 0x2A, 0xD6, 0x20, 0x73 + }, + { + 0xEF, 0x10, 0x7F, 0xCD, 0x0D, 0x92, 0xD8, 0x4E, + 0xF5, 0xEF, 0x94, 0x63, 0xE6, 0xE9, 0x62, 0x41, + 0x25, 0x45, 0x29, 0xD2, 0xB9, 0x7F, 0xDB, 0xE5, + 0x64, 0x19, 0x07, 0x0A, 0xDB, 0xC7, 0xD5, 0x70, + 0x6F, 0xEB, 0x8F, 0x44, 0x95, 0x79, 0x81, 0x9E, + 0xD4, 0xBE, 0x61, 0x97, 0x85, 0xFF, 0xFA, 0xAF, + 0x0D, 0x97, 0x89, 0xCF, 0xE7, 0x26, 0x24, 0x9A, + 0xB0, 0x8C, 0x94, 0x68, 0xCB, 0x5F, 0xDE, 0x22 + }, + { + 0x23, 0x1F, 0xBF, 0xB7, 0xA1, 0xDD, 0xC5, 0xB7, + 0x49, 0x33, 0xA2, 0x85, 0xA4, 0x22, 0x4C, 0x04, + 0x9C, 0xBA, 0x14, 0x85, 0xCE, 0x35, 0x64, 0x0D, + 0x9C, 0x51, 0x6E, 0xD7, 0x8E, 0xAA, 0x22, 0x6D, + 0x36, 0xF6, 0x5B, 0x25, 0x89, 0xB8, 0x26, 0xC4, + 0x59, 0xFA, 0x6A, 0x91, 0xC4, 0x26, 0xFD, 0x2A, + 0x8A, 0xB4, 0x61, 0xC9, 0x76, 0x7E, 0x7B, 0xDD, + 0x99, 0x6B, 0xEF, 0x5A, 0x78, 0xF4, 0x81, 0xB7 + }, + { + 0x3A, 0x83, 0x1F, 0x2D, 0xA9, 0x69, 0xB9, 0xB7, + 0x36, 0x0E, 0x74, 0xEE, 0x53, 0xB5, 0x18, 0x98, + 0x0A, 0x5E, 0xBC, 0xDF, 0xD4, 0xEE, 0x23, 0xED, + 0x80, 0x5C, 0x26, 0x39, 0x4D, 0x18, 0x24, 0x20, + 0x8D, 0x7E, 0x8F, 0x63, 0x27, 0xD4, 0xEC, 0x87, + 0x97, 0x9C, 0xE4, 0xAF, 0x8A, 0xB0, 0x97, 0xD6, + 0x9E, 0x26, 0x1C, 0xA3, 0x2D, 0xB0, 0xEE, 0xFD, + 0xBC, 0x18, 0xD1, 0x63, 0x77, 0xA6, 0xBD, 0x20 + }, + { + 0x83, 0x49, 0xA2, 0x0F, 0xDD, 0xBA, 0xE1, 0xD8, + 0x47, 0x2B, 0x67, 0xF0, 0x34, 0x7A, 0xA0, 0xFD, + 0x40, 0x4D, 0x65, 0xC6, 0xFA, 0x14, 0x72, 0xB3, + 0x10, 0x39, 0x0D, 0x75, 0x65, 0xBA, 0x6B, 0xC1, + 0x02, 0x60, 0xD3, 0xDC, 0xE6, 0xA1, 0x4F, 0x4D, + 0xD9, 0xB8, 0xB3, 0xE0, 0xA0, 0xC4, 0x7F, 0x6D, + 0xB7, 0xE7, 0x10, 0x0A, 0x7A, 0x9B, 0x64, 0xA8, + 0x44, 0xF0, 0x10, 0x64, 0xD0, 0x79, 0x05, 0xC5 + }, + { + 0x23, 0x9A, 0xE3, 0xD6, 0x85, 0x9C, 0x7C, 0x97, + 0x2A, 0x5D, 0xC8, 0xB9, 0xC5, 0x5A, 0xEB, 0x93, + 0x85, 0x90, 0xCF, 0xB8, 0x55, 0x2A, 0xA3, 0x05, + 0xA6, 0xF6, 0xF3, 0x1F, 0xFA, 0x95, 0xA8, 0x40, + 0xF4, 0xEC, 0x36, 0xF6, 0xFB, 0x8F, 0x83, 0xB6, + 0x9C, 0x1D, 0xA9, 0x81, 0xFC, 0x9B, 0xA1, 0x63, + 0x60, 0xDB, 0x0F, 0x4F, 0x7C, 0x68, 0xEB, 0x54, + 0x3E, 0xD5, 0x8B, 0x28, 0x75, 0x6A, 0x1E, 0x0D + }, + { + 0x7C, 0x56, 0x73, 0x28, 0x63, 0x08, 0x40, 0x8F, + 0xBC, 0x62, 0x24, 0x0E, 0x07, 0x47, 0x28, 0xB2, + 0x7A, 0x57, 0x5C, 0xAD, 0x2A, 0x15, 0x6E, 0x00, + 0xB5, 0xC0, 0x8B, 0x21, 0x8D, 0x88, 0x87, 0x79, + 0x1E, 0x47, 0xBF, 0x10, 0xB0, 0xBC, 0x61, 0xA5, + 0x82, 0x54, 0x5A, 0x24, 0x69, 0x63, 0x9C, 0xE6, + 0x28, 0xC4, 0x0F, 0x20, 0xEA, 0x8B, 0x84, 0x9C, + 0xD0, 0x05, 0x44, 0x5F, 0x29, 0xA0, 0x8C, 0xCE + }, + { + 0xDD, 0x07, 0x7E, 0x76, 0x9E, 0x0D, 0xEF, 0x78, + 0xDD, 0x7A, 0xAD, 0xD5, 0x7D, 0x58, 0x42, 0x1B, + 0xDA, 0x3A, 0x1A, 0x4E, 0x69, 0x72, 0x05, 0x9F, + 0x8E, 0x64, 0x9C, 0xD6, 0xBC, 0xA4, 0x4A, 0x13, + 0xAB, 0x71, 0xEB, 0x53, 0x5D, 0x24, 0x49, 0x22, + 0x94, 0x84, 0x65, 0xD7, 0x3B, 0xD6, 0x4E, 0xFB, + 0x09, 0x10, 0x46, 0x94, 0x90, 0x66, 0x65, 0x36, + 0x03, 0x57, 0x5A, 0x2E, 0x89, 0x1E, 0xBD, 0x54 + }, + { + 0xB3, 0x6C, 0xEF, 0x28, 0x53, 0x2B, 0x40, 0xD8, + 0x17, 0x86, 0x28, 0xF0, 0xFA, 0xB5, 0xE5, 0xB4, + 0xA1, 0xDE, 0xC0, 0xC0, 0xE9, 0x11, 0xD7, 0x27, + 0xBF, 0x09, 0x49, 0x0F, 0x5E, 0x8D, 0x9F, 0xAC, + 0x57, 0x21, 0x3F, 0xD2, 0xA2, 0xD1, 0x2E, 0xD3, + 0xD7, 0x7A, 0x41, 0xF5, 0xE2, 0xFE, 0xCC, 0x40, + 0xE4, 0xEE, 0xCA, 0x16, 0x12, 0xF5, 0x1C, 0x45, + 0x23, 0x31, 0xAE, 0x93, 0x96, 0x62, 0x35, 0xBC + }, + { + 0xDE, 0x73, 0x7D, 0xBC, 0x61, 0x2E, 0xBD, 0x31, + 0xBC, 0x49, 0xA2, 0xD7, 0xC6, 0x44, 0xD4, 0xB1, + 0x37, 0x81, 0x74, 0x19, 0x42, 0x1C, 0x32, 0xF4, + 0xE7, 0x51, 0x14, 0xD8, 0x99, 0xE3, 0x13, 0x1D, + 0x45, 0xCA, 0x54, 0x51, 0x24, 0x8F, 0x24, 0x16, + 0x9F, 0xBF, 0x17, 0xEE, 0x60, 0xA9, 0xB7, 0x07, + 0x98, 0xA4, 0xB9, 0x37, 0xCE, 0xA6, 0x27, 0x95, + 0x28, 0x96, 0x39, 0xD1, 0x8F, 0xCD, 0x89, 0xE4 + }, + { + 0xB4, 0xC1, 0xBB, 0xCB, 0xBC, 0xCD, 0xFC, 0xE4, + 0xD2, 0xBE, 0x9D, 0xCD, 0xB9, 0x83, 0xC1, 0xB0, + 0x20, 0xC5, 0xF7, 0x20, 0xDA, 0x5B, 0xEC, 0xF4, + 0xCB, 0x2A, 0x9A, 0x3D, 0x1B, 0x8D, 0x23, 0xCE, + 0xA7, 0xA9, 0xF5, 0xFD, 0x70, 0xD3, 0x74, 0x0E, + 0xCD, 0x67, 0xCE, 0x7D, 0x1E, 0x9C, 0x5E, 0x31, + 0xA3, 0x30, 0x2D, 0xF6, 0x6A, 0x9B, 0x5D, 0x54, + 0x30, 0x44, 0x90, 0xFB, 0xE1, 0xC4, 0xA8, 0xB9 + }, + { + 0xB1, 0xD6, 0x5E, 0x70, 0xC6, 0x9B, 0xA7, 0xE3, + 0xA7, 0x28, 0xE8, 0xB6, 0x44, 0x94, 0x93, 0xF2, + 0x37, 0x51, 0x0B, 0x23, 0xB6, 0xE7, 0x7D, 0x95, + 0x84, 0xD0, 0x5F, 0xF4, 0xD3, 0xF0, 0x87, 0x80, + 0x92, 0x9D, 0x74, 0xFA, 0x5B, 0xED, 0x9B, 0x75, + 0xD4, 0xD6, 0xD1, 0xCA, 0x91, 0xAB, 0x8D, 0x26, + 0x37, 0xDC, 0x2E, 0x79, 0xBA, 0x0F, 0xE0, 0x59, + 0x4A, 0xCD, 0x68, 0xFB, 0x3C, 0xC6, 0x60, 0xB9 + }, + { + 0xDA, 0x79, 0xF7, 0x29, 0xEA, 0xB9, 0x8C, 0x04, + 0xF3, 0x7F, 0xCC, 0x85, 0x4B, 0x69, 0xA8, 0x4E, + 0x46, 0x7D, 0xEA, 0x1E, 0x77, 0x82, 0xE7, 0xAF, + 0x02, 0xCB, 0x44, 0xA4, 0x9D, 0x21, 0x0D, 0x25, + 0x23, 0x68, 0x3D, 0x42, 0x0A, 0xC1, 0xDE, 0xC8, + 0xAD, 0x1F, 0xB4, 0x0E, 0x65, 0xAB, 0x3F, 0xE2, + 0x51, 0xA8, 0x51, 0xE2, 0x83, 0xD8, 0x58, 0x38, + 0x08, 0x42, 0x61, 0x30, 0x1E, 0xCD, 0x08, 0x9B + }, + { + 0x71, 0x40, 0x40, 0x40, 0x39, 0x21, 0xAE, 0x55, + 0x48, 0xA2, 0x03, 0x39, 0xD6, 0x9E, 0x09, 0x3F, + 0x60, 0x9A, 0xA9, 0x9C, 0x22, 0xDB, 0x72, 0x59, + 0x1D, 0x1E, 0xF4, 0xFC, 0xB0, 0xAF, 0x01, 0x61, + 0x73, 0xE5, 0x77, 0xD8, 0xC1, 0xA3, 0x06, 0x3B, + 0x44, 0x3A, 0x0E, 0x48, 0xF3, 0x13, 0xCF, 0x2E, + 0x0F, 0x9B, 0x0C, 0x2E, 0xF9, 0x6A, 0x96, 0xC4, + 0x24, 0x32, 0x2C, 0xCC, 0x0C, 0xD5, 0x30, 0x4C + }, + { + 0x8B, 0x2E, 0x8C, 0x3F, 0x0E, 0x3C, 0x31, 0x9B, + 0xA6, 0x7E, 0x86, 0x01, 0x4B, 0xDA, 0x68, 0x3E, + 0x53, 0x57, 0xA0, 0x40, 0x37, 0xB4, 0x56, 0x32, + 0x86, 0xAC, 0x89, 0xCD, 0xDB, 0x7E, 0xE0, 0x4C, + 0xF6, 0x67, 0x5F, 0x9A, 0xB6, 0x1F, 0xC8, 0x33, + 0x2D, 0x21, 0x8D, 0x2B, 0xCA, 0x97, 0x15, 0xE7, + 0xDB, 0xE5, 0x83, 0x72, 0xD1, 0xEE, 0xBF, 0x6B, + 0xC2, 0x94, 0x84, 0x71, 0xCF, 0xCE, 0xBB, 0x77 + }, + { + 0x32, 0xEE, 0x95, 0x49, 0xD4, 0xE3, 0x2F, 0x4B, + 0xE9, 0xC5, 0x00, 0xBD, 0x85, 0x43, 0xAF, 0xD0, + 0xB6, 0x97, 0x82, 0xD0, 0xB3, 0xFF, 0x7E, 0xD4, + 0x7A, 0x88, 0x1A, 0x0E, 0x49, 0x1F, 0x37, 0x65, + 0x0A, 0x21, 0xB2, 0x6C, 0x3F, 0x5D, 0x0A, 0x64, + 0xE0, 0x90, 0x58, 0xB3, 0x00, 0x4A, 0x23, 0x68, + 0xB9, 0x50, 0xE4, 0x72, 0x30, 0xC2, 0x29, 0x66, + 0xD3, 0xF7, 0x9D, 0xA7, 0xBA, 0xA0, 0xB8, 0x7F + }, + { + 0xCA, 0xE7, 0xF2, 0x92, 0x71, 0x37, 0x82, 0xC4, + 0x71, 0xFE, 0x31, 0x78, 0xA9, 0x42, 0x0C, 0xD4, + 0xC1, 0x1F, 0xCD, 0x3F, 0x6D, 0xBE, 0x5D, 0x15, + 0xC8, 0x4A, 0xB7, 0x35, 0x3C, 0x73, 0x9E, 0xF0, + 0x64, 0x16, 0x39, 0xA2, 0xF9, 0x2A, 0xED, 0x31, + 0xC5, 0x6A, 0x20, 0x21, 0xCC, 0x5E, 0x58, 0xCB, + 0xEA, 0xD3, 0x74, 0xE2, 0xDC, 0x8A, 0x0D, 0xBC, + 0xE5, 0x45, 0x0F, 0xE7, 0xA0, 0x18, 0xCF, 0xA4 + }, + { + 0xF1, 0x7F, 0xEF, 0xAE, 0xAE, 0x7D, 0x40, 0xCD, + 0x88, 0x5D, 0xAC, 0x0B, 0xC3, 0x50, 0xC0, 0x27, + 0x36, 0x68, 0xEA, 0x02, 0x22, 0xDF, 0x5C, 0x75, + 0x69, 0x4F, 0x5C, 0xB3, 0xA3, 0x21, 0x51, 0x9F, + 0x6E, 0x0E, 0xC4, 0x3B, 0xA0, 0xC8, 0x59, 0x3D, + 0xC7, 0x34, 0x13, 0x41, 0xE5, 0x19, 0x48, 0x8F, + 0x20, 0xAB, 0xD5, 0xB8, 0x12, 0x4D, 0xFA, 0xCE, + 0xA5, 0xCD, 0xE0, 0x96, 0x5B, 0x69, 0x70, 0xF9 + }, + { + 0xE2, 0xCF, 0x86, 0xDD, 0xC8, 0x42, 0x4E, 0xE5, + 0x47, 0xEB, 0x72, 0x45, 0xB7, 0x32, 0x5E, 0x02, + 0xF2, 0xE3, 0xAC, 0x01, 0x3C, 0x8D, 0x38, 0x6B, + 0x3D, 0x2E, 0x09, 0x20, 0x8A, 0x9B, 0xCC, 0x0B, + 0x44, 0xC4, 0xC4, 0x38, 0xEA, 0xAF, 0x52, 0xD2, + 0x07, 0x7E, 0x91, 0x77, 0xEB, 0x8E, 0xE1, 0xD5, + 0x90, 0x75, 0xB5, 0x25, 0x92, 0x20, 0x20, 0x62, + 0x22, 0x93, 0x54, 0xBF, 0x23, 0xC9, 0x62, 0x39 + }, + { + 0x38, 0xF2, 0x6A, 0x11, 0x02, 0xCB, 0x16, 0x2D, + 0x35, 0x1F, 0x84, 0x3B, 0x3C, 0x49, 0xF6, 0xFF, + 0x85, 0x44, 0x16, 0x33, 0xB6, 0x70, 0x4A, 0x28, + 0x6A, 0xF8, 0x1C, 0xCB, 0xAE, 0x5A, 0x67, 0xD3, + 0x01, 0x5C, 0xC0, 0xEF, 0xAF, 0xB7, 0x05, 0x7D, + 0xC2, 0xB2, 0x8D, 0x67, 0x66, 0xE8, 0x2A, 0x06, + 0x8A, 0x4C, 0x0B, 0x52, 0x4B, 0x66, 0xD0, 0xA6, + 0x32, 0x77, 0x5D, 0x93, 0x06, 0x15, 0x75, 0xF9 + }, + { + 0xA2, 0xC4, 0x30, 0x2D, 0xAC, 0xA7, 0xA7, 0xC6, + 0x32, 0xF6, 0x76, 0x30, 0x4E, 0x62, 0x75, 0xC1, + 0xC1, 0xF0, 0xDB, 0xFE, 0x38, 0xDC, 0x57, 0x1C, + 0xB2, 0x3E, 0x1F, 0x7B, 0xA5, 0xDC, 0x18, 0x18, + 0x0F, 0xC4, 0x8A, 0x01, 0x5F, 0x92, 0x7C, 0x89, + 0x96, 0x7C, 0x1E, 0x10, 0x4E, 0x66, 0xF5, 0xEA, + 0x5B, 0x2D, 0xD3, 0x1D, 0x78, 0x1C, 0x38, 0x49, + 0xBF, 0xC6, 0x49, 0x22, 0x0C, 0x38, 0x5C, 0x82 + }, + { + 0xC1, 0x9C, 0x6B, 0x3F, 0xB5, 0x35, 0x2B, 0xB3, + 0x94, 0xC2, 0x68, 0x46, 0x52, 0x3C, 0x25, 0xE8, + 0x26, 0x5D, 0x50, 0x5F, 0x50, 0x1F, 0x96, 0x03, + 0xA4, 0xF8, 0xBD, 0x55, 0x38, 0x6C, 0xF4, 0xCC, + 0x9F, 0x4D, 0x71, 0xF3, 0x8F, 0xF4, 0x45, 0xF4, + 0xEF, 0xC8, 0x30, 0x98, 0xD4, 0x79, 0x69, 0x33, + 0x4E, 0x79, 0xA2, 0xBC, 0xB4, 0x02, 0x6B, 0xC6, + 0x3B, 0x79, 0x59, 0xDE, 0xDB, 0x62, 0xB7, 0xBD + }, + { + 0x1F, 0x4A, 0xB9, 0x84, 0x0A, 0x1C, 0xFA, 0x8F, + 0xE6, 0xC5, 0x62, 0x2D, 0x9B, 0x53, 0x8B, 0xEC, + 0xB8, 0x80, 0x7A, 0x87, 0x78, 0xB6, 0x9D, 0x93, + 0x05, 0xF9, 0x08, 0x57, 0x65, 0x73, 0xB2, 0x0C, + 0xA3, 0x70, 0x4E, 0x89, 0x12, 0x97, 0x26, 0xD5, + 0x02, 0xE1, 0x98, 0x58, 0x8D, 0x07, 0x26, 0x68, + 0xBF, 0x03, 0x63, 0x0B, 0x5B, 0x5A, 0x92, 0x32, + 0xFF, 0x39, 0x25, 0x27, 0x24, 0x9D, 0xF9, 0x9B + }, + { + 0xFE, 0x03, 0x17, 0x7B, 0x58, 0xB4, 0x88, 0x83, + 0xA8, 0x6D, 0x42, 0x68, 0x33, 0x4B, 0x95, 0x91, + 0xD9, 0xFB, 0xD8, 0xBF, 0x7C, 0xC2, 0xAA, 0xCC, + 0x50, 0x25, 0xEF, 0x47, 0x6B, 0x45, 0x33, 0xBA, + 0x7B, 0xD7, 0x81, 0xDF, 0x01, 0x11, 0x47, 0xB3, + 0xCF, 0x51, 0x1D, 0x8B, 0x3D, 0xCD, 0x8C, 0x78, + 0x0D, 0x30, 0xD7, 0xDA, 0x71, 0x8C, 0x22, 0x44, + 0x23, 0x19, 0x81, 0x7B, 0xE3, 0x18, 0x6B, 0xC5 + }, + { + 0xF4, 0xC3, 0xB0, 0x59, 0x10, 0x5B, 0x6A, 0xA5, + 0xFE, 0x78, 0x84, 0x3A, 0x07, 0xD9, 0x4F, 0x71, + 0x20, 0x62, 0xCB, 0x5A, 0x4D, 0xD6, 0x05, 0x9F, + 0x97, 0x90, 0x4D, 0x0C, 0x57, 0x97, 0x3B, 0xA8, + 0xDF, 0x71, 0xD1, 0x5A, 0x51, 0x1A, 0x06, 0x68, + 0x64, 0xFE, 0x45, 0x5E, 0xDC, 0x9E, 0x5F, 0x16, + 0x52, 0x4C, 0xEC, 0x7E, 0xE2, 0x48, 0xEE, 0x3E, + 0xC9, 0x29, 0x06, 0x3B, 0xD1, 0x07, 0x98, 0xDA + }, + { + 0x57, 0xA1, 0x6F, 0x96, 0x4B, 0x18, 0x1B, 0x12, + 0x03, 0xA5, 0x80, 0x3B, 0x73, 0x81, 0x7D, 0x77, + 0x44, 0x83, 0x82, 0x6C, 0xEA, 0x11, 0x3B, 0x9C, + 0xCF, 0xCF, 0x0E, 0xB8, 0x7C, 0xB2, 0x30, 0x64, + 0x28, 0x49, 0x62, 0xD8, 0x47, 0xBB, 0x1F, 0xAE, + 0x8C, 0xBF, 0x5C, 0xC6, 0x3B, 0x3C, 0xEA, 0xA1, + 0x24, 0x1E, 0xA4, 0x2C, 0x63, 0xF8, 0x98, 0x01, + 0x1F, 0xC4, 0xDB, 0xCA, 0xE6, 0xF5, 0xE8, 0xC5 + }, + { + 0x79, 0x52, 0xFC, 0x83, 0xAC, 0xF1, 0x3A, 0x95, + 0xCA, 0x9C, 0x27, 0xA2, 0x15, 0x6D, 0x9C, 0x1B, + 0x63, 0x00, 0xB0, 0xEF, 0x79, 0x0F, 0x57, 0x2B, + 0xC3, 0x94, 0xC6, 0x77, 0xF7, 0xC1, 0x46, 0x29, + 0xEB, 0xD8, 0xE7, 0xD5, 0xD7, 0xC7, 0xF1, 0xA5, + 0xEB, 0xBD, 0xC3, 0x90, 0xCC, 0x08, 0xCD, 0x58, + 0xC2, 0x00, 0x89, 0x00, 0xCB, 0x55, 0xEB, 0x05, + 0xE4, 0x44, 0xA6, 0x8C, 0x3B, 0x39, 0x3E, 0x60 + }, + { + 0x2C, 0x22, 0x40, 0xD6, 0xB5, 0x41, 0xF4, 0x29, + 0x4F, 0xF9, 0x76, 0x79, 0x1D, 0x35, 0xE6, 0xA2, + 0xD4, 0x92, 0xF5, 0x7A, 0x91, 0x5F, 0xBA, 0xC5, + 0x83, 0x26, 0x60, 0xC1, 0x0E, 0x9C, 0x96, 0x46, + 0x5C, 0x7B, 0xD5, 0xFC, 0xA7, 0x51, 0xBF, 0x68, + 0xE2, 0x67, 0x3A, 0x63, 0x8E, 0x3A, 0xF7, 0x35, + 0xB0, 0x20, 0x91, 0xD7, 0x5D, 0x1A, 0x7F, 0x89, + 0xE3, 0xF7, 0x61, 0xC5, 0xDF, 0x82, 0x1A, 0x6B + }, + { + 0x59, 0xDC, 0x84, 0x6D, 0x34, 0x05, 0xCC, 0xD8, + 0x06, 0xF8, 0xFA, 0x20, 0xC8, 0x96, 0x9E, 0xF6, + 0x8A, 0x43, 0x85, 0xEF, 0x6C, 0x27, 0x4E, 0xEE, + 0x6D, 0xC0, 0x69, 0x2C, 0x3E, 0xCF, 0xB1, 0xA8, + 0x34, 0xCE, 0x64, 0x43, 0x76, 0xC5, 0x2B, 0x80, + 0x42, 0x1B, 0xAE, 0x94, 0xD6, 0xC7, 0xFD, 0xCC, + 0xA5, 0xA8, 0xF1, 0x85, 0x9C, 0x45, 0xA1, 0x0C, + 0x4E, 0xB2, 0x74, 0x82, 0x6F, 0x1F, 0x08, 0x9F + }, + { + 0xB7, 0x52, 0x96, 0x27, 0x07, 0xA1, 0x7B, 0x66, + 0x4F, 0xAE, 0xB3, 0x13, 0xE2, 0xB9, 0x52, 0xDC, + 0x03, 0xE7, 0x4A, 0x7E, 0x94, 0x47, 0x09, 0x8A, + 0xA6, 0xD4, 0xEA, 0x5B, 0xD2, 0x87, 0xD0, 0x7A, + 0x12, 0x25, 0xEC, 0xED, 0xA9, 0x81, 0x15, 0x70, + 0x58, 0x0A, 0x51, 0x2B, 0x2B, 0x20, 0xB3, 0xFC, + 0xFC, 0xA7, 0x0B, 0x44, 0xF6, 0x45, 0x4E, 0xF3, + 0xC3, 0x52, 0x4C, 0xCA, 0x6B, 0x69, 0x47, 0x5B + }, + { + 0xDA, 0x0D, 0x8E, 0x54, 0x61, 0xF8, 0x10, 0x24, + 0xEF, 0xFE, 0xED, 0x5D, 0x70, 0x76, 0xA0, 0x4F, + 0xED, 0xED, 0xAC, 0x57, 0xE7, 0xC9, 0x8A, 0x59, + 0x45, 0xBF, 0xDE, 0x66, 0x75, 0x58, 0x18, 0x85, + 0x1B, 0xE1, 0x13, 0x6B, 0x71, 0xF4, 0x33, 0xA5, + 0x6B, 0xDA, 0x18, 0x41, 0xAE, 0x71, 0x39, 0x2C, + 0x4B, 0x82, 0x90, 0x82, 0x63, 0x59, 0xF5, 0x87, + 0x22, 0x3C, 0x3E, 0xF7, 0x37, 0xFF, 0x73, 0x2A + }, + { + 0xED, 0xB8, 0x6A, 0x23, 0x7C, 0x6F, 0x13, 0x7D, + 0xFB, 0xB3, 0x47, 0x01, 0x1E, 0xDB, 0x4C, 0x6E, + 0x86, 0x1F, 0x4D, 0x58, 0x14, 0x60, 0x85, 0x46, + 0x34, 0x41, 0x04, 0x2F, 0xA3, 0x63, 0x16, 0xF1, + 0xFA, 0xF8, 0x87, 0x11, 0xBB, 0x0F, 0x18, 0x11, + 0xDF, 0xBB, 0xBF, 0xA7, 0xB5, 0x1F, 0x9C, 0xE2, + 0xD4, 0x96, 0x05, 0x24, 0x3E, 0xD0, 0x16, 0xCB, + 0xAD, 0x68, 0x85, 0xEA, 0xE2, 0x03, 0x67, 0x4F + }, + { + 0xE6, 0xD8, 0xE0, 0xFB, 0xAA, 0x29, 0xDB, 0xEB, + 0x60, 0xF3, 0xC7, 0xF9, 0x85, 0xBA, 0xD7, 0x54, + 0xD7, 0x21, 0xAA, 0xC6, 0x3D, 0xA6, 0xF4, 0x49, + 0x0C, 0x9D, 0x7E, 0xA2, 0x31, 0xD2, 0x62, 0x2F, + 0xDF, 0xDE, 0xF1, 0x48, 0xD0, 0xCA, 0x44, 0x2B, + 0x8D, 0x59, 0xCF, 0x3E, 0x4F, 0x98, 0x35, 0xCB, + 0xC2, 0x40, 0xAF, 0x40, 0xFB, 0xA6, 0x3A, 0x2E, + 0xA5, 0xA2, 0x35, 0xD4, 0x6E, 0xEA, 0x6E, 0xAC + }, + { + 0xD4, 0xE4, 0x63, 0xC4, 0x88, 0x29, 0x87, 0xEB, + 0x44, 0xA5, 0xED, 0x0C, 0x82, 0x1D, 0x68, 0xB0, + 0xFE, 0xF9, 0x9D, 0x6F, 0x53, 0xA5, 0x7B, 0xF3, + 0x19, 0xBD, 0xAC, 0x25, 0xAC, 0x38, 0xEB, 0x0B, + 0x23, 0xE1, 0x13, 0x8C, 0x00, 0x12, 0xF5, 0xF3, + 0x83, 0x46, 0xA1, 0xDE, 0x9D, 0x4A, 0x99, 0x2A, + 0x64, 0xB9, 0x42, 0x83, 0x4A, 0x85, 0x6E, 0xFB, + 0xAA, 0x06, 0x20, 0xBD, 0xA2, 0x9F, 0x6A, 0x86 + }, + { + 0x42, 0xD8, 0x10, 0xD0, 0x1C, 0x2D, 0xA2, 0x47, + 0x35, 0xF0, 0x4A, 0x5E, 0x90, 0x13, 0x38, 0xFD, + 0xFC, 0x2D, 0xE1, 0x71, 0x5F, 0xF6, 0x64, 0x3A, + 0x37, 0x2F, 0x88, 0x0E, 0x6C, 0x5C, 0x6C, 0x13, + 0xD2, 0xB3, 0xAD, 0x70, 0x77, 0x46, 0x9D, 0x64, + 0x33, 0x54, 0x05, 0x4D, 0x32, 0xDD, 0x80, 0x49, + 0xEA, 0x63, 0x73, 0x2B, 0x57, 0x45, 0xBD, 0xB2, + 0x3B, 0xE2, 0xB5, 0x8E, 0x48, 0xC1, 0x01, 0x3A + }, + { + 0xCF, 0xBF, 0x54, 0x30, 0x07, 0x6F, 0x82, 0x5A, + 0x3B, 0xBB, 0x88, 0xC1, 0xBC, 0x0A, 0xEF, 0x61, + 0x25, 0x9E, 0x8F, 0x4D, 0x5F, 0xA3, 0x3C, 0x39, + 0x82, 0x50, 0x62, 0xF1, 0x5D, 0x19, 0xFD, 0x4A, + 0x01, 0x82, 0xCD, 0x97, 0x36, 0xD2, 0xAE, 0xC9, + 0x74, 0x9C, 0xCF, 0x83, 0x18, 0x6C, 0x35, 0x74, + 0xAB, 0x94, 0x42, 0x65, 0x40, 0x66, 0x0A, 0x9D, + 0xB8, 0xC3, 0xAA, 0xBB, 0xCB, 0xDD, 0x9D, 0x0F + }, + { + 0x6C, 0x24, 0x34, 0xA1, 0xAF, 0xA1, 0x57, 0xAC, + 0xCC, 0x34, 0xA5, 0xC4, 0x87, 0x2D, 0xFF, 0x69, + 0xFE, 0x7F, 0x31, 0x96, 0xCB, 0x1A, 0x75, 0x0C, + 0x54, 0x1D, 0x8B, 0x73, 0x92, 0x28, 0x88, 0xBA, + 0xBE, 0x89, 0xB1, 0xC3, 0x82, 0x02, 0x21, 0x86, + 0x20, 0xD8, 0x8D, 0x77, 0xDA, 0xD9, 0xDF, 0xBA, + 0xB3, 0xFB, 0xF7, 0x40, 0xB2, 0xD1, 0xD8, 0xF3, + 0x7E, 0xAD, 0x25, 0x8E, 0x2E, 0xF1, 0x06, 0x52 + }, + { + 0x48, 0xB7, 0x26, 0x8A, 0xA4, 0x34, 0x2F, 0xAB, + 0x02, 0x1D, 0x14, 0x72, 0xE9, 0x25, 0x7F, 0x76, + 0x58, 0x5C, 0xC5, 0x68, 0x10, 0xC8, 0xF2, 0xA6, + 0xE1, 0xD4, 0xA8, 0x94, 0x6B, 0x77, 0x71, 0x42, + 0xD4, 0x4A, 0xE5, 0x13, 0xA8, 0x80, 0x9F, 0x2D, + 0x6D, 0xC7, 0x26, 0x30, 0x5F, 0x79, 0x44, 0x60, + 0x4D, 0x95, 0x2D, 0x4A, 0x9F, 0x08, 0x5C, 0x5C, + 0x10, 0x50, 0xBA, 0xFD, 0xD2, 0x1D, 0x1E, 0x60 + }, + { + 0xCE, 0xCF, 0xCE, 0x4B, 0x12, 0xC6, 0xCF, 0x53, + 0xD1, 0xB1, 0xB2, 0xD4, 0x18, 0xA4, 0x93, 0xE3, + 0xF4, 0x29, 0x17, 0x03, 0x21, 0xE8, 0x1A, 0xA2, + 0x52, 0x63, 0xAA, 0xA7, 0x15, 0xD5, 0xCA, 0x38, + 0x9F, 0x65, 0xC3, 0xAC, 0xF9, 0x9B, 0x18, 0x0E, + 0x44, 0x6B, 0x50, 0xE6, 0x01, 0xFC, 0xBF, 0x44, + 0x61, 0xD0, 0x42, 0x6A, 0x85, 0x92, 0xA0, 0x77, + 0x42, 0x20, 0x18, 0x57, 0x12, 0x5F, 0x71, 0xEE + }, + { + 0x38, 0x5A, 0x75, 0x22, 0x42, 0xEB, 0x9E, 0xD5, + 0x6B, 0x07, 0x4B, 0x70, 0x2C, 0x91, 0xE7, 0x5A, + 0xEC, 0x0B, 0xE9, 0x06, 0x4B, 0xD9, 0xCF, 0x88, + 0x03, 0x04, 0xC2, 0x13, 0x27, 0x0C, 0xB2, 0xEA, + 0xE8, 0xE2, 0x1D, 0x9A, 0xE8, 0xC6, 0x08, 0x15, + 0x19, 0xF7, 0x5D, 0xFA, 0xBB, 0x00, 0x3B, 0x24, + 0x32, 0xB0, 0x47, 0x55, 0xB8, 0xC3, 0x2C, 0x97, + 0xAC, 0x29, 0x14, 0xE8, 0xBF, 0x45, 0xB2, 0x34 + }, + { + 0xD8, 0x9A, 0x12, 0x4A, 0x9B, 0x95, 0x8B, 0xA2, + 0x3D, 0x09, 0x20, 0x7A, 0xCF, 0xA6, 0x2A, 0x33, + 0xB8, 0x70, 0x89, 0xB2, 0x86, 0xE8, 0x43, 0x8B, + 0xDC, 0x01, 0xE2, 0x33, 0xAB, 0x2A, 0x86, 0x30, + 0xA1, 0xEE, 0xB6, 0xB2, 0xB9, 0xBA, 0x6B, 0x7D, + 0x21, 0x00, 0x10, 0x77, 0x33, 0xDE, 0xAF, 0x4C, + 0x20, 0x47, 0x8C, 0x26, 0xF2, 0x49, 0xC6, 0x89, + 0xC5, 0x26, 0x84, 0x73, 0xE2, 0xE9, 0xFA, 0x60 + }, + { + 0x43, 0xDE, 0x10, 0x92, 0xFF, 0x9F, 0xF5, 0x28, + 0x20, 0x6C, 0x6F, 0xCF, 0x81, 0x32, 0x2E, 0xAD, + 0x3D, 0x22, 0xEA, 0xA4, 0xC8, 0x54, 0x52, 0x15, + 0x77, 0xDF, 0x33, 0x62, 0x47, 0x49, 0x5C, 0xE1, + 0x72, 0xFC, 0x87, 0x39, 0x95, 0x30, 0x0B, 0x21, + 0xB9, 0x46, 0x10, 0xC9, 0xD2, 0xF6, 0x33, 0xB5, + 0x33, 0xBD, 0xE4, 0x56, 0x8C, 0xA0, 0x9C, 0x38, + 0x0E, 0x84, 0x68, 0xFE, 0x6A, 0xD8, 0xD8, 0x1D + }, + { + 0x86, 0x8B, 0x60, 0x11, 0x99, 0xEF, 0x00, 0x0B, + 0x70, 0x5C, 0xD6, 0x4D, 0x39, 0x30, 0x26, 0x2A, + 0x5A, 0xB9, 0x10, 0xE3, 0x4E, 0x2D, 0x78, 0xE8, + 0x58, 0x7B, 0x4E, 0x01, 0x0D, 0x37, 0x6D, 0xD4, + 0xA0, 0x0D, 0xE4, 0x48, 0x67, 0xD0, 0xE9, 0x33, + 0xEE, 0x39, 0xA1, 0xFA, 0x91, 0x47, 0xD4, 0x99, + 0xD1, 0x84, 0xF3, 0xA9, 0xCF, 0x35, 0x4F, 0x2D, + 0x3C, 0x51, 0x14, 0x6F, 0xF7, 0x15, 0x2D, 0x68 + }, + { + 0x15, 0x17, 0xF8, 0xF0, 0x44, 0x2F, 0x0D, 0x50, + 0xBB, 0xC0, 0xAA, 0xB6, 0x84, 0x6F, 0xDC, 0xE3, + 0xB7, 0x0F, 0xAE, 0xA4, 0xBB, 0x51, 0x13, 0xAC, + 0xB2, 0x3A, 0xBE, 0x10, 0x1D, 0x99, 0xA4, 0x0A, + 0x1B, 0x76, 0xC1, 0xE8, 0xDC, 0x2E, 0xA1, 0x93, + 0x62, 0x94, 0x82, 0x3A, 0xD8, 0x35, 0x4C, 0x11, + 0xE2, 0xE9, 0x6C, 0x67, 0x12, 0xBE, 0x4C, 0xF7, + 0x7C, 0x58, 0x3F, 0xD0, 0x6B, 0x5E, 0x5C, 0x55 + }, + { + 0xAF, 0x4C, 0x6C, 0x67, 0xC5, 0xCA, 0x38, 0x38, + 0x73, 0x48, 0xCA, 0x3E, 0xC2, 0xBE, 0xD7, 0xFB, + 0xA8, 0xC2, 0xB3, 0xD2, 0x2D, 0xE1, 0x48, 0xD0, + 0x8A, 0x61, 0x8C, 0x29, 0x70, 0x23, 0xFB, 0x7B, + 0x6D, 0x2C, 0x15, 0x3D, 0x5E, 0xFC, 0xD1, 0x68, + 0x89, 0x99, 0x91, 0x0B, 0x20, 0xE1, 0xEA, 0xC7, + 0xC1, 0x00, 0xA2, 0xC5, 0xA6, 0xC1, 0xAC, 0xF5, + 0xE9, 0x8F, 0x14, 0x3B, 0x41, 0xDC, 0x8A, 0x12 + }, + { + 0xA2, 0xAD, 0x94, 0x24, 0x3B, 0x8E, 0xEA, 0x68, + 0xF5, 0xFA, 0xDD, 0x69, 0x08, 0xAD, 0xB0, 0xDA, + 0xCD, 0xAA, 0x6A, 0x6D, 0x24, 0xC2, 0x50, 0xD3, + 0x39, 0x40, 0x3D, 0xBA, 0x82, 0x31, 0xBD, 0x51, + 0xE8, 0x87, 0xCB, 0x5B, 0x1B, 0x7B, 0xDE, 0x27, + 0x74, 0xC6, 0xB0, 0x8A, 0xCC, 0xE0, 0xF7, 0x49, + 0x56, 0x48, 0xDA, 0x3B, 0xEB, 0xC7, 0xB1, 0xC2, + 0x82, 0x15, 0x08, 0xC4, 0xD3, 0x82, 0xF7, 0x30 + }, + { + 0x28, 0xF8, 0x8C, 0xDB, 0xE9, 0x03, 0xAD, 0x63, + 0xA0, 0x23, 0x31, 0xDE, 0x1A, 0x32, 0xAF, 0x6D, + 0xBB, 0xA8, 0x2D, 0x7F, 0xC0, 0x79, 0x87, 0x02, + 0x72, 0x49, 0x33, 0xDA, 0x77, 0x38, 0x07, 0xBC, + 0x80, 0x42, 0x78, 0x13, 0x47, 0x81, 0xF1, 0x26, + 0x23, 0x32, 0x20, 0xE3, 0x07, 0x92, 0x81, 0x31, + 0xB2, 0x47, 0x10, 0xB4, 0x67, 0x4E, 0xD7, 0x05, + 0x11, 0x2F, 0x95, 0xD1, 0xAA, 0x37, 0xA2, 0xDC + }, + { + 0x5B, 0xB2, 0x92, 0x65, 0xE2, 0x46, 0xB8, 0x84, + 0xFF, 0x40, 0x91, 0x4F, 0xFA, 0x93, 0xD9, 0xA1, + 0x2E, 0xDC, 0x19, 0xEE, 0xE9, 0xCC, 0x8A, 0x83, + 0x63, 0x1D, 0x68, 0xBD, 0x46, 0xAA, 0xD3, 0x35, + 0x4B, 0xA6, 0x67, 0x4B, 0x91, 0x3F, 0x4F, 0x82, + 0x3E, 0x79, 0x1F, 0x0C, 0xB1, 0x9E, 0xA6, 0xA6, + 0x7C, 0x6E, 0x32, 0xE9, 0xBE, 0x0D, 0x0F, 0xF5, + 0x76, 0x0F, 0x16, 0xDD, 0x75, 0xA8, 0x7B, 0x5D + }, + { + 0xBF, 0x3C, 0x06, 0xDC, 0x6D, 0x94, 0xE3, 0x85, + 0x9A, 0x4D, 0xAA, 0x50, 0xEC, 0xA1, 0xAF, 0x53, + 0x57, 0xE3, 0x45, 0x79, 0xE5, 0x99, 0xF8, 0x20, + 0x49, 0xE1, 0xCC, 0xA7, 0xA7, 0xD4, 0xF3, 0x3F, + 0xEA, 0x44, 0x3B, 0x44, 0x69, 0x1B, 0xD4, 0x36, + 0x88, 0xF5, 0x55, 0x05, 0x31, 0xCF, 0x22, 0xB7, + 0x12, 0x77, 0x89, 0x0B, 0xFF, 0xAE, 0x1E, 0xCE, + 0x78, 0x3F, 0x56, 0x63, 0xA1, 0xC4, 0xD7, 0x1A + }, + { + 0xC9, 0x0D, 0xF5, 0x32, 0xF2, 0xF1, 0x49, 0x3A, + 0x11, 0x55, 0xBE, 0x8C, 0x2A, 0x44, 0x00, 0x92, + 0x20, 0x49, 0x97, 0x4E, 0x7D, 0x4F, 0x4B, 0x54, + 0xF8, 0x20, 0xC2, 0x26, 0x9D, 0x3B, 0x16, 0x1B, + 0x6E, 0x88, 0xEB, 0x77, 0x6B, 0x85, 0x9B, 0x89, + 0xB8, 0x56, 0x7F, 0xBC, 0x55, 0x0C, 0x4F, 0x54, + 0xAA, 0xD2, 0x7A, 0x16, 0x10, 0x65, 0x6D, 0x62, + 0x5C, 0x32, 0x7F, 0x66, 0x5D, 0xCA, 0x70, 0x7C + }, + { + 0x3D, 0x39, 0xEE, 0xCC, 0x9E, 0x90, 0x42, 0x36, + 0xDC, 0x85, 0x7B, 0xA4, 0x9D, 0x55, 0xD3, 0xBA, + 0xD7, 0x65, 0x72, 0xA9, 0x1A, 0x75, 0x95, 0x03, + 0x37, 0x6B, 0x77, 0x08, 0xD6, 0x2D, 0x5A, 0x78, + 0x5C, 0x23, 0x06, 0x80, 0x59, 0xCF, 0x68, 0x89, + 0x7F, 0x23, 0xEE, 0xC5, 0x07, 0x21, 0x9B, 0x0A, + 0x02, 0xED, 0xA2, 0xD8, 0xBC, 0x94, 0xFA, 0x69, + 0x89, 0xA5, 0x14, 0x82, 0x22, 0x03, 0xC8, 0xD1 + }, + { + 0xE0, 0x8C, 0x54, 0xD9, 0x98, 0xF9, 0x2B, 0x7A, + 0x54, 0xA2, 0x4C, 0xA6, 0xAE, 0xB1, 0x53, 0xA6, + 0x4F, 0x9C, 0x9F, 0x1F, 0xC3, 0x36, 0x58, 0xB3, + 0xED, 0xAC, 0x2C, 0x4B, 0xB5, 0x26, 0x31, 0x58, + 0xDA, 0xDF, 0x00, 0xD3, 0x51, 0x9A, 0x11, 0x9A, + 0x56, 0x14, 0xC7, 0xF3, 0x79, 0x40, 0xE5, 0x5D, + 0x13, 0xCC, 0xE4, 0x66, 0xCB, 0x71, 0xA4, 0x07, + 0xC3, 0x9F, 0xC5, 0x1E, 0x1E, 0xFE, 0x18, 0xDA + }, + { + 0x74, 0x76, 0x76, 0x07, 0x04, 0x1D, 0xD4, 0xB7, + 0xC5, 0x6B, 0x18, 0x9E, 0xE8, 0xF2, 0x77, 0x31, + 0xA5, 0x16, 0x72, 0x23, 0xEB, 0x7A, 0xF9, 0xB9, + 0x39, 0xE1, 0x18, 0xF8, 0x7D, 0x80, 0xB4, 0x9E, + 0xA8, 0xD0, 0xD0, 0x1F, 0x74, 0xF3, 0x98, 0xB1, + 0x72, 0xA8, 0xAD, 0x0D, 0xBF, 0x99, 0x41, 0x4F, + 0x08, 0xD2, 0xB7, 0xD8, 0xD7, 0x52, 0x16, 0xA1, + 0x82, 0x25, 0x27, 0x3D, 0x8D, 0x7F, 0xD0, 0x5D + }, + { + 0xFE, 0xE8, 0x9A, 0x92, 0xCC, 0xF9, 0xF1, 0xEB, + 0x08, 0x4A, 0xAB, 0xA9, 0x54, 0x97, 0xEF, 0x0F, + 0x30, 0x13, 0x4C, 0x19, 0x1C, 0xF9, 0x0A, 0x49, + 0xD2, 0x2C, 0x7D, 0x2F, 0x66, 0x14, 0x99, 0x3C, + 0xBE, 0x1A, 0x4B, 0x65, 0x13, 0xED, 0xC1, 0x53, + 0x86, 0x8A, 0x3D, 0x56, 0x2B, 0x5B, 0x02, 0x26, + 0xBA, 0x8E, 0x1B, 0x0D, 0xCB, 0x69, 0xED, 0x45, + 0xAF, 0x47, 0xCE, 0x4F, 0x86, 0xBA, 0x47, 0x4A + }, + { + 0xCD, 0xAE, 0x94, 0xB6, 0xD1, 0xD8, 0x35, 0xF6, + 0xC7, 0x4C, 0x76, 0xEC, 0x3A, 0x2D, 0xB6, 0x5B, + 0xBD, 0xFA, 0xE1, 0x9D, 0x7B, 0x05, 0x0D, 0xC9, + 0x5D, 0x65, 0x87, 0x33, 0xB8, 0xB2, 0x2C, 0x6F, + 0x9E, 0x0B, 0x63, 0xCC, 0x90, 0x5A, 0x29, 0xEA, + 0x88, 0x78, 0xCA, 0x39, 0x45, 0x56, 0xB3, 0x67, + 0x3C, 0x62, 0x79, 0x15, 0x46, 0xA9, 0xA1, 0xF0, + 0xD1, 0x56, 0x5F, 0xAD, 0xC5, 0x35, 0x36, 0xC1 + }, + { + 0xC7, 0x22, 0x8B, 0x6F, 0x00, 0x00, 0x17, 0xD2, + 0xBE, 0x4B, 0xF2, 0xAE, 0x48, 0xAD, 0xDB, 0x78, + 0x5E, 0x27, 0x35, 0xBF, 0x3C, 0x61, 0x4D, 0x3C, + 0x34, 0x23, 0x1F, 0x1D, 0x0C, 0x88, 0x7D, 0x3A, + 0x8E, 0x88, 0x88, 0x0B, 0x67, 0xAD, 0x3B, 0x2F, + 0x65, 0x23, 0xDD, 0x67, 0x19, 0x34, 0x2C, 0xD4, + 0xF0, 0x59, 0x35, 0xD2, 0xE5, 0x26, 0x7F, 0x36, + 0x80, 0xE7, 0x73, 0xBD, 0x5E, 0xAD, 0xFE, 0x1D + }, + { + 0x12, 0x27, 0x44, 0xFE, 0x3F, 0xFF, 0x9A, 0x05, + 0x5F, 0x0F, 0x3B, 0xDE, 0x01, 0xEB, 0x2F, 0x44, + 0x6B, 0x0C, 0xDA, 0xF3, 0xAE, 0xD7, 0x2C, 0xAA, + 0x29, 0x40, 0x74, 0x19, 0x20, 0x12, 0x0A, 0x96, + 0x4F, 0xCF, 0xF8, 0x70, 0x99, 0xB0, 0x8E, 0xF3, + 0x34, 0x96, 0xE3, 0x99, 0x03, 0x2A, 0x82, 0xDA, + 0xAD, 0x4F, 0xED, 0x30, 0x31, 0x17, 0x2F, 0x77, + 0x47, 0x92, 0x58, 0xFA, 0x39, 0xDB, 0x92, 0xFD + }, + { + 0x1F, 0xB4, 0xE3, 0x67, 0xEA, 0xB6, 0x42, 0xB7, + 0x2E, 0x43, 0xAD, 0x4A, 0xBD, 0xFC, 0xAD, 0x74, + 0x62, 0x0C, 0x3F, 0x6C, 0x63, 0xA8, 0x91, 0x31, + 0x28, 0xD2, 0x22, 0x6E, 0xB1, 0x92, 0xF9, 0x99, + 0x2E, 0xB9, 0xC8, 0xF7, 0x6A, 0xE2, 0x06, 0xD3, + 0xF5, 0xDE, 0xC7, 0x26, 0xA5, 0xA6, 0x86, 0xB4, + 0xAE, 0x37, 0xB5, 0x57, 0xAB, 0x57, 0xF9, 0x56, + 0x48, 0x53, 0x34, 0xF7, 0x3D, 0xCE, 0x02, 0xE0 + }, + { + 0x04, 0x25, 0xCA, 0xAA, 0x92, 0x3B, 0x47, 0xB3, + 0x50, 0x45, 0xEB, 0x50, 0x82, 0x9C, 0x04, 0x8B, + 0xC8, 0x90, 0x44, 0x4A, 0xFE, 0xEF, 0xC0, 0xAF, + 0xC9, 0xD1, 0x87, 0x7B, 0x82, 0x1E, 0x04, 0x3C, + 0x9C, 0x7B, 0x9D, 0x6D, 0xC3, 0x3F, 0xBB, 0xDF, + 0xA5, 0x37, 0xC1, 0xEC, 0xE3, 0x11, 0x96, 0x5B, + 0x2F, 0xEE, 0x89, 0x82, 0xBC, 0x46, 0xA2, 0xA7, + 0x50, 0xBF, 0xC7, 0x1D, 0x79, 0xDB, 0xEA, 0x04 + }, + { + 0x6B, 0x9D, 0x86, 0xF1, 0x5C, 0x09, 0x0A, 0x00, + 0xFC, 0x3D, 0x90, 0x7F, 0x90, 0x6C, 0x5E, 0xB7, + 0x92, 0x65, 0xE5, 0x8B, 0x88, 0xEB, 0x64, 0x29, + 0x4B, 0x4C, 0xC4, 0xE2, 0xB8, 0x9B, 0x1A, 0x7C, + 0x5E, 0xE3, 0x12, 0x7E, 0xD2, 0x1B, 0x45, 0x68, + 0x62, 0xDE, 0x6B, 0x2A, 0xBD, 0xA5, 0x9E, 0xAA, + 0xCF, 0x2D, 0xCB, 0xE9, 0x22, 0xCA, 0x75, 0x5E, + 0x40, 0x73, 0x5B, 0xE8, 0x1D, 0x9C, 0x88, 0xA5 + }, + { + 0x14, 0x6A, 0x18, 0x7A, 0x99, 0xE8, 0xA2, 0xD2, + 0x33, 0xE0, 0xEB, 0x37, 0x3D, 0x43, 0x7B, 0x02, + 0xBF, 0xA8, 0xD6, 0x51, 0x5B, 0x3C, 0xA1, 0xDE, + 0x48, 0xA6, 0xB6, 0xAC, 0xF7, 0x43, 0x7E, 0xB7, + 0xE7, 0xAC, 0x3F, 0x2D, 0x19, 0xEF, 0x3B, 0xB9, + 0xB8, 0x33, 0xCC, 0x57, 0x61, 0xDB, 0xA2, 0x2D, + 0x1A, 0xD0, 0x60, 0xBE, 0x76, 0xCD, 0xCB, 0x81, + 0x2D, 0x64, 0xD5, 0x78, 0xE9, 0x89, 0xA5, 0xA4 + }, + { + 0x25, 0x75, 0x4C, 0xA6, 0x66, 0x9C, 0x48, 0x70, + 0x84, 0x03, 0x88, 0xEA, 0x64, 0xE9, 0x5B, 0xD2, + 0xE0, 0x81, 0x0D, 0x36, 0x3C, 0x4C, 0xF6, 0xA1, + 0x6E, 0xA1, 0xBD, 0x06, 0x68, 0x6A, 0x93, 0xC8, + 0xA1, 0x25, 0xF2, 0x30, 0x22, 0x9D, 0x94, 0x84, + 0x85, 0xE1, 0xA8, 0x2D, 0xE4, 0x82, 0x00, 0x35, + 0x8F, 0x3E, 0x02, 0xB5, 0x05, 0xDA, 0xBC, 0x4F, + 0x13, 0x9C, 0x03, 0x79, 0xDC, 0x2B, 0x30, 0x80 + }, + { + 0x0E, 0x26, 0xCB, 0xC7, 0x8D, 0xC7, 0x54, 0xEC, + 0xA0, 0x6C, 0xF8, 0xCB, 0x31, 0xFC, 0xBA, 0xBB, + 0x18, 0x88, 0x92, 0xC1, 0x04, 0x50, 0x89, 0x05, + 0x49, 0xB2, 0xD4, 0x03, 0xA2, 0xA3, 0xC4, 0x57, + 0x70, 0x01, 0xF7, 0x4A, 0x76, 0xBD, 0x38, 0x99, + 0x0D, 0x75, 0x5B, 0xAE, 0x05, 0x26, 0x64, 0x83, + 0x29, 0xF6, 0x35, 0x45, 0xED, 0x16, 0x99, 0x5C, + 0xB1, 0xE6, 0x34, 0x3F, 0x18, 0x9F, 0x8E, 0x6F + }, + { + 0x58, 0xE7, 0x98, 0x0B, 0x8B, 0x1A, 0x0B, 0x88, + 0xDA, 0x9D, 0xA8, 0x64, 0x0F, 0x2B, 0x96, 0xE3, + 0xE0, 0x48, 0x36, 0x61, 0x30, 0xC2, 0x66, 0x21, + 0x7D, 0xDC, 0x79, 0x53, 0x50, 0x8F, 0x4A, 0x40, + 0xD1, 0x67, 0x4D, 0xAB, 0xD3, 0x92, 0x89, 0xE3, + 0xF1, 0x0C, 0x61, 0x19, 0x68, 0xCC, 0xD1, 0xE9, + 0xCC, 0xC1, 0x8C, 0xAD, 0xC7, 0x77, 0x4A, 0x99, + 0x7D, 0xD1, 0xFA, 0x94, 0xE8, 0x35, 0x47, 0x07 + }, + { + 0x69, 0x6F, 0xB8, 0x47, 0x63, 0xE0, 0x23, 0x58, + 0x4B, 0x35, 0x90, 0x7A, 0x8B, 0x8A, 0xAA, 0x9E, + 0x0E, 0x78, 0x6F, 0x2C, 0xA5, 0x91, 0x45, 0x41, + 0x91, 0x58, 0x48, 0xFB, 0x6D, 0xDA, 0xB8, 0xD3, + 0xD2, 0xEA, 0xB6, 0x00, 0xC1, 0x38, 0xCE, 0x67, + 0x17, 0xB0, 0xC7, 0x02, 0x59, 0xD3, 0x19, 0x3E, + 0xA1, 0x56, 0x95, 0xC8, 0x50, 0x53, 0x7F, 0x2C, + 0x70, 0x6C, 0xA4, 0xAF, 0x15, 0x8E, 0x95, 0x7E + }, + { + 0x23, 0xDE, 0x6E, 0x73, 0x07, 0x9C, 0x8C, 0x20, + 0x47, 0xA7, 0x84, 0x6A, 0x83, 0xCC, 0xAC, 0xAB, + 0xD3, 0x71, 0x16, 0x3B, 0x7B, 0x6D, 0x54, 0xEB, + 0x03, 0x2B, 0xC4, 0x9B, 0x66, 0x97, 0x42, 0xBE, + 0x71, 0x7B, 0x99, 0xDA, 0x12, 0xC6, 0x46, 0xAD, + 0x52, 0x57, 0x06, 0xF2, 0x22, 0xE1, 0xDF, 0x4A, + 0x91, 0xDD, 0x0C, 0xC6, 0x4D, 0xF1, 0x82, 0xDA, + 0x00, 0x73, 0x1D, 0x43, 0x9C, 0x46, 0xF8, 0xD2 + }, + { + 0xBB, 0x74, 0xF3, 0x6A, 0x9D, 0xB6, 0x96, 0xC9, + 0x33, 0x35, 0xE6, 0xC4, 0x6A, 0xAB, 0x58, 0xDB, + 0x10, 0xCB, 0x07, 0xEA, 0x4F, 0x1B, 0x71, 0x93, + 0x63, 0x05, 0x22, 0x83, 0x90, 0x95, 0x94, 0x78, + 0xF8, 0x73, 0x4E, 0x21, 0x54, 0x90, 0xE9, 0xAE, + 0x2A, 0x3E, 0xC8, 0xF7, 0xF7, 0x67, 0x33, 0xAE, + 0x3F, 0x8B, 0x9A, 0x3F, 0xD7, 0xC4, 0x06, 0xC6, + 0xCA, 0xC7, 0x09, 0x97, 0x5C, 0x40, 0xF8, 0x56 + }, + { + 0xEC, 0x63, 0x04, 0xD3, 0x8E, 0x23, 0x2C, 0x09, + 0x6A, 0xB5, 0x86, 0xCA, 0xDF, 0x27, 0x02, 0x6D, + 0xC5, 0xE5, 0x32, 0x17, 0xD0, 0xE8, 0xB0, 0xC6, + 0x0A, 0xDA, 0xAE, 0x22, 0xF4, 0xE8, 0xC2, 0x2D, + 0x30, 0xBC, 0x51, 0x77, 0xF1, 0xC8, 0x3A, 0xCD, + 0x92, 0x5E, 0x02, 0xA2, 0xDA, 0x89, 0x59, 0x5F, + 0xC1, 0x06, 0x09, 0x0E, 0x2E, 0x53, 0xED, 0xB3, + 0x1C, 0xDB, 0x76, 0xFF, 0x37, 0xEB, 0x61, 0x80 + }, + { + 0x92, 0xF9, 0xFC, 0x6B, 0xC5, 0x9A, 0x54, 0x3F, + 0x0D, 0xC9, 0xA1, 0x79, 0x8F, 0xB1, 0xE5, 0xD5, + 0x23, 0x47, 0x4E, 0x48, 0xFF, 0x3E, 0x29, 0x49, + 0x7F, 0x72, 0x80, 0xD1, 0xC4, 0x08, 0xC8, 0x66, + 0x33, 0x48, 0xFE, 0x2A, 0xF7, 0x8F, 0x6C, 0x4E, + 0x5E, 0xF5, 0xC0, 0xA0, 0x17, 0xF3, 0xD3, 0xF2, + 0x15, 0xEC, 0xDD, 0x7A, 0x40, 0x0A, 0xC5, 0x77, + 0x3B, 0x9E, 0x25, 0x60, 0x68, 0x84, 0x5A, 0x92 + }, + { + 0x4A, 0x25, 0xB5, 0x62, 0xF2, 0xFA, 0x01, 0xDD, + 0xEE, 0x7E, 0xA2, 0xE9, 0xFB, 0xF5, 0x2F, 0x8C, + 0x75, 0x6D, 0x28, 0xDB, 0x4A, 0x8B, 0xF7, 0x0E, + 0x74, 0x0E, 0x90, 0x27, 0x42, 0x6E, 0x51, 0x63, + 0x9D, 0xF8, 0x78, 0x8D, 0x13, 0x38, 0x56, 0x85, + 0x8D, 0x01, 0xFD, 0xDB, 0xDD, 0x5B, 0x98, 0x79, + 0x44, 0xC3, 0x00, 0xDC, 0x7F, 0x82, 0x41, 0xFB, + 0xCE, 0xFA, 0x4F, 0x12, 0x94, 0x8A, 0xFE, 0xAE + }, + { + 0x34, 0x21, 0x2D, 0xD9, 0xF0, 0x65, 0x1F, 0x81, + 0x80, 0x9A, 0x14, 0xED, 0xBC, 0xF7, 0xF3, 0xAC, + 0xDE, 0xDE, 0x78, 0x72, 0xC7, 0xA4, 0x84, 0x7B, + 0xEA, 0x9F, 0x7A, 0xB7, 0x59, 0x73, 0x82, 0x47, + 0x7A, 0x4C, 0xB8, 0x47, 0x9A, 0x27, 0x63, 0x21, + 0x23, 0x5E, 0x90, 0x21, 0x57, 0x94, 0x46, 0xA4, + 0x38, 0x8A, 0x99, 0xE5, 0x60, 0xA3, 0x90, 0x7A, + 0xEE, 0xF2, 0xB4, 0x38, 0xFE, 0x6B, 0x90, 0xC4 + }, + { + 0xD6, 0x2C, 0xF7, 0xAB, 0xBC, 0x7D, 0x7B, 0xCD, + 0x5B, 0xEB, 0x1E, 0xE4, 0x8C, 0x43, 0xB8, 0x04, + 0xFD, 0x0D, 0xB4, 0x55, 0xE7, 0xF4, 0xFE, 0xBB, + 0xCF, 0xF1, 0x4B, 0x05, 0xBE, 0x90, 0x47, 0xE2, + 0x7E, 0x51, 0x8D, 0x6D, 0x3A, 0x6A, 0xDA, 0x4D, + 0x58, 0x63, 0xB7, 0xEC, 0x7F, 0x84, 0x92, 0x45, + 0x89, 0x40, 0xAC, 0x6B, 0xDD, 0xB5, 0x06, 0x59, + 0x2C, 0xCB, 0xC8, 0x96, 0xAF, 0xBB, 0x77, 0xA3 + }, + { + 0x33, 0xA3, 0xA2, 0x63, 0x6F, 0x91, 0x98, 0xD3, + 0x7A, 0x5F, 0xF1, 0xBF, 0xF9, 0xEB, 0x10, 0x02, + 0x4B, 0x28, 0x46, 0x80, 0x39, 0xF4, 0x91, 0x40, + 0x2D, 0x39, 0xB7, 0x08, 0xC5, 0x5D, 0x27, 0xE5, + 0xE8, 0xDF, 0x5E, 0x3E, 0x19, 0x49, 0x95, 0x82, + 0x35, 0xCA, 0xD9, 0x80, 0x74, 0x20, 0x96, 0xF2, + 0x77, 0x9A, 0x1D, 0x71, 0xDA, 0xD5, 0x8F, 0xAF, + 0xA3, 0xCD, 0x02, 0xCB, 0x5E, 0xAA, 0x98, 0xC5 + }, + { + 0xB7, 0xA3, 0x89, 0x90, 0xE6, 0xF4, 0x56, 0x4A, + 0xA3, 0xD9, 0x3A, 0x79, 0x37, 0x10, 0x0C, 0x29, + 0xF9, 0x40, 0xAF, 0xF7, 0xCB, 0x20, 0x86, 0x5A, + 0x1C, 0x21, 0x89, 0x81, 0xA5, 0x42, 0x04, 0x86, + 0x08, 0x17, 0x81, 0xF8, 0xD5, 0x0C, 0x86, 0x62, + 0x5C, 0xC5, 0xD7, 0x6D, 0x0F, 0x5C, 0xCC, 0x4E, + 0xB6, 0x5D, 0x43, 0x66, 0x09, 0x62, 0x4F, 0x21, + 0xD0, 0x53, 0x39, 0xAB, 0x0C, 0xF7, 0x9F, 0x4C + }, + { + 0x9D, 0x66, 0x5A, 0x3F, 0xDD, 0x10, 0x45, 0x9E, + 0x77, 0xF0, 0x3A, 0xC8, 0xC0, 0xE2, 0x39, 0x01, + 0x94, 0x89, 0x69, 0x3C, 0xC9, 0x31, 0x5A, 0xA3, + 0xFF, 0x11, 0x29, 0x11, 0xD2, 0xAC, 0xF0, 0xB7, + 0xD2, 0x76, 0xAC, 0x76, 0x9B, 0xED, 0xFD, 0x85, + 0x2D, 0x28, 0x89, 0xDD, 0x12, 0xDB, 0x91, 0x39, + 0x8B, 0x01, 0xC4, 0xF4, 0xA5, 0xDA, 0x27, 0x80, + 0xB1, 0xDE, 0xFE, 0x0D, 0x95, 0xB6, 0x32, 0x70 + }, + { + 0x70, 0xFB, 0x9E, 0xFD, 0x5B, 0xCA, 0x7F, 0x19, + 0xB6, 0xE3, 0x1D, 0x64, 0x0D, 0xCF, 0x88, 0xD7, + 0x7E, 0x76, 0x8A, 0xE2, 0x27, 0xEC, 0xB3, 0xFD, + 0x6B, 0x47, 0x13, 0x78, 0x94, 0xF5, 0x49, 0xBF, + 0x1C, 0xF0, 0x6E, 0x5D, 0xB4, 0x54, 0x60, 0x44, + 0xDD, 0x9F, 0x46, 0x5C, 0x9C, 0x85, 0xF7, 0x28, + 0x4F, 0xE5, 0x4D, 0x2B, 0x71, 0x52, 0x69, 0x9B, + 0xE4, 0xBD, 0x55, 0x5A, 0x90, 0x9A, 0x88, 0xA9 + }, + { + 0x7A, 0xFD, 0xB0, 0x19, 0x30, 0x87, 0xE0, 0xC9, + 0xF8, 0xB4, 0xDD, 0x8B, 0x48, 0xD9, 0xF2, 0x0A, + 0xCE, 0x27, 0x13, 0xAF, 0xC7, 0x1B, 0xCC, 0x93, + 0x82, 0xB5, 0x42, 0x90, 0xAE, 0xBF, 0xFE, 0xB2, + 0xD1, 0x38, 0xF4, 0xDC, 0xF0, 0x28, 0xF9, 0xC4, + 0x3C, 0xC1, 0x80, 0x89, 0x84, 0x77, 0xA3, 0x9E, + 0x3F, 0x53, 0xA8, 0xD1, 0xBF, 0x67, 0xCE, 0xB6, + 0x08, 0x26, 0x1F, 0xAE, 0x6D, 0xDB, 0x1A, 0xBC + }, + { + 0x05, 0x99, 0x0D, 0x7D, 0x7D, 0xF1, 0xD4, 0x84, + 0xF5, 0xB1, 0xCA, 0xE9, 0xEE, 0x5D, 0xFC, 0xB4, + 0x3F, 0x2C, 0xBE, 0x18, 0x6C, 0x1A, 0x5B, 0x18, + 0x1A, 0x37, 0x31, 0xD4, 0xB1, 0x54, 0x8E, 0xBF, + 0xF5, 0xBF, 0x61, 0xCB, 0x0F, 0x6D, 0x9F, 0xC2, + 0x30, 0xF2, 0x5E, 0x86, 0x78, 0xB7, 0x99, 0xE0, + 0xE8, 0x30, 0x26, 0xA0, 0x86, 0x6B, 0xF0, 0xAC, + 0xAB, 0x08, 0x9E, 0x10, 0x2E, 0x67, 0xAB, 0x6B + }, + { + 0x1A, 0xF7, 0xA5, 0xCE, 0x58, 0x7C, 0x8D, 0x87, + 0xC7, 0xB7, 0x9F, 0xA3, 0xE7, 0x23, 0xD7, 0x4C, + 0xE0, 0x26, 0xB5, 0x28, 0x67, 0x52, 0xFD, 0x0C, + 0x37, 0x42, 0xC6, 0xF0, 0x41, 0x8E, 0xD7, 0x85, + 0x99, 0x0D, 0x21, 0xF2, 0x8D, 0xA8, 0x39, 0xCE, + 0x82, 0x12, 0xED, 0x55, 0x0C, 0x37, 0x3E, 0x6D, + 0x3A, 0x75, 0xD5, 0x5C, 0x31, 0x77, 0x04, 0x41, + 0xEE, 0xAF, 0xF2, 0xD5, 0x0F, 0x6E, 0x61, 0xB6 + }, + { + 0xDD, 0xEE, 0x0C, 0x76, 0xC9, 0xBD, 0xD3, 0x2D, + 0x70, 0x49, 0x35, 0x4C, 0xFC, 0x85, 0xDC, 0x68, + 0x67, 0xE2, 0x49, 0x2E, 0x47, 0xFE, 0xB0, 0x8E, + 0x39, 0x83, 0xD0, 0xB6, 0x78, 0x84, 0x5D, 0x7E, + 0xC6, 0xC9, 0x79, 0x3C, 0x33, 0x26, 0xBF, 0xDC, + 0x1E, 0x11, 0x32, 0x76, 0xD1, 0x77, 0xFE, 0x38, + 0x82, 0x52, 0x04, 0xDD, 0x00, 0x07, 0x39, 0x89, + 0xC0, 0x81, 0xCC, 0x3B, 0x71, 0xC6, 0x8D, 0x5F + }, + { + 0xDE, 0x07, 0x06, 0x48, 0xB3, 0x7C, 0x47, 0xDC, + 0x9F, 0x2F, 0x6D, 0x2A, 0xB2, 0x07, 0x73, 0xCD, + 0x82, 0xFA, 0x57, 0x25, 0xA6, 0x90, 0x0E, 0xB7, + 0x1C, 0xDD, 0xB0, 0xC9, 0xF3, 0x9B, 0x31, 0xDF, + 0x6D, 0x07, 0x73, 0x24, 0x6E, 0x8E, 0xF9, 0x03, + 0x49, 0x67, 0x75, 0x2D, 0xB7, 0xED, 0x22, 0x73, + 0x3F, 0x43, 0x79, 0x94, 0x8D, 0xC3, 0x96, 0xDC, + 0x35, 0xAD, 0xBB, 0xE9, 0xF6, 0x53, 0x77, 0x40 + }, + { + 0xA6, 0x45, 0x6F, 0xBC, 0xFF, 0x9E, 0x3D, 0x5B, + 0x11, 0x6A, 0x0E, 0x33, 0x1A, 0x1F, 0x97, 0x4F, + 0x07, 0x0E, 0x95, 0x56, 0x09, 0x78, 0x1F, 0xA5, + 0x99, 0xD6, 0x08, 0xA3, 0x1D, 0xA7, 0x6A, 0xD8, + 0xAB, 0xFE, 0x34, 0x66, 0x17, 0xC2, 0x57, 0x86, + 0x51, 0x3B, 0x2C, 0x44, 0xBF, 0xE2, 0xCB, 0x45, + 0x7C, 0x43, 0xFA, 0x6F, 0x45, 0x36, 0x1C, 0xA9, + 0xC6, 0x34, 0x13, 0x11, 0xB7, 0xDD, 0xFB, 0xD5 + }, + { + 0x5C, 0x95, 0xD3, 0x82, 0x02, 0x18, 0x91, 0x04, + 0x8B, 0x5E, 0xC8, 0x1C, 0xC8, 0x8E, 0x66, 0xB1, + 0xB4, 0xD8, 0x0A, 0x00, 0xB5, 0xEE, 0x66, 0xB3, + 0xC0, 0x30, 0x77, 0x49, 0xE6, 0xF2, 0x4D, 0x17, + 0x0D, 0x23, 0xFA, 0xCC, 0x8E, 0xB2, 0x53, 0xB3, + 0x56, 0x2B, 0xF8, 0xA4, 0x5C, 0x37, 0x99, 0x0C, + 0xD2, 0xD3, 0xE4, 0x43, 0xB1, 0x8C, 0x68, 0xBB, + 0xCC, 0x6C, 0x83, 0x1D, 0xFD, 0xE2, 0xF8, 0xE5 + }, + { + 0xE3, 0x74, 0x00, 0xDB, 0xD9, 0x21, 0x0F, 0x31, + 0x37, 0xAC, 0xAF, 0x49, 0x24, 0x2F, 0xA1, 0x23, + 0xA0, 0x52, 0x95, 0x8A, 0x4C, 0x0D, 0x98, 0x90, + 0x62, 0x47, 0xD5, 0x35, 0xA3, 0x51, 0xFD, 0x52, + 0x29, 0x6E, 0x70, 0x10, 0x32, 0x5B, 0xDA, 0x84, + 0x1F, 0xA2, 0xAA, 0xB4, 0x47, 0x63, 0x76, 0x3C, + 0x55, 0x04, 0xD7, 0xB3, 0x0C, 0x6D, 0x79, 0xFC, + 0x1D, 0xC8, 0xCF, 0x10, 0x24, 0x46, 0x6D, 0xB0 + }, + { + 0x52, 0x73, 0xA3, 0xA1, 0x3C, 0xF0, 0xEC, 0x72, + 0x00, 0x44, 0x2C, 0xBD, 0x7B, 0x37, 0x44, 0x66, + 0xA7, 0x19, 0x0D, 0xDC, 0xA1, 0x31, 0xD9, 0x63, + 0xF8, 0xF8, 0x39, 0x65, 0xAE, 0xD3, 0xDD, 0x86, + 0xE9, 0xD4, 0x5A, 0xB4, 0x89, 0xB9, 0xC5, 0x62, + 0x47, 0xC9, 0xF2, 0xAA, 0x69, 0xFD, 0x7E, 0x31, + 0x87, 0xB8, 0xFA, 0x0D, 0xAC, 0x77, 0xC4, 0x7C, + 0xB2, 0x95, 0xBA, 0x62, 0x96, 0x78, 0x43, 0x94 + }, + { + 0x2A, 0xDB, 0x93, 0x49, 0xA9, 0xEC, 0x37, 0xFF, + 0x49, 0x62, 0xF4, 0x21, 0x7E, 0x80, 0xEB, 0xDC, + 0xD3, 0x60, 0x96, 0x7B, 0x51, 0x3D, 0x12, 0x02, + 0xD9, 0x98, 0x28, 0x31, 0x15, 0x5D, 0x2F, 0x43, + 0xEB, 0x9A, 0xDD, 0x63, 0xB5, 0xEC, 0x10, 0xD3, + 0xD0, 0x43, 0x0D, 0xC9, 0xCF, 0x76, 0x48, 0x11, + 0x7F, 0xC6, 0x0B, 0xAB, 0xBF, 0x8E, 0xBF, 0x19, + 0xFA, 0xCE, 0xE5, 0x50, 0x45, 0x5B, 0x60, 0xC9 + }, + { + 0xAC, 0xAA, 0xDA, 0x3E, 0x47, 0x37, 0xC6, 0x63, + 0xEB, 0xF0, 0x3C, 0x02, 0x49, 0xCC, 0xA6, 0xF3, + 0x17, 0x9A, 0x03, 0x84, 0xEA, 0x2A, 0xB1, 0x35, + 0xD4, 0xD7, 0xA2, 0xBB, 0x8A, 0x2F, 0x40, 0x53, + 0x9C, 0xDC, 0xE8, 0xA3, 0x76, 0x0F, 0xD1, 0x3D, + 0xEE, 0xEC, 0xD1, 0x60, 0x61, 0x7F, 0x72, 0xDE, + 0x63, 0x75, 0x4E, 0x21, 0x57, 0xCA, 0xDC, 0xF0, + 0x67, 0x32, 0x9C, 0x2A, 0x51, 0x98, 0xF8, 0xE0 + }, + { + 0xEF, 0x15, 0xE6, 0xDB, 0x96, 0xE6, 0xD0, 0xC1, + 0x8C, 0x70, 0xAD, 0xC3, 0xCD, 0xB3, 0x2B, 0x28, + 0x67, 0x74, 0x02, 0xE8, 0xEA, 0x44, 0x11, 0xEA, + 0x2F, 0x34, 0x68, 0xED, 0x93, 0x82, 0xE1, 0x9B, + 0xFE, 0xCA, 0xF5, 0xAC, 0xB8, 0x28, 0xA5, 0x2B, + 0xE1, 0x6B, 0x98, 0x1E, 0x48, 0x7E, 0x5B, 0xB4, + 0xA1, 0x43, 0x08, 0x65, 0x35, 0x8E, 0x97, 0x9F, + 0xB1, 0x07, 0x1F, 0xB9, 0x51, 0x14, 0xFF, 0xDD + }, + { + 0x05, 0x7E, 0xAB, 0x8F, 0xA6, 0x1C, 0x23, 0x09, + 0x67, 0xD9, 0x5D, 0xFB, 0x75, 0x45, 0x57, 0x0E, + 0x34, 0x1A, 0xE3, 0xC6, 0x73, 0x7C, 0x7D, 0xB2, + 0xA2, 0x27, 0xD9, 0x0F, 0xF3, 0x15, 0xD0, 0x98, + 0xD4, 0x76, 0xF7, 0x15, 0x77, 0x9E, 0x67, 0x72, + 0xB4, 0xED, 0x37, 0x54, 0x82, 0x66, 0xE6, 0x59, + 0x8C, 0x6F, 0x09, 0x69, 0x13, 0xC2, 0xFD, 0xD8, + 0xD6, 0xE4, 0x4F, 0xE2, 0xB5, 0x4D, 0x97, 0x80 + }, + { + 0xED, 0xE6, 0x8D, 0x1B, 0x13, 0xE7, 0xEF, 0x78, + 0xD9, 0xC4, 0xEE, 0x10, 0xEC, 0xEB, 0x1D, 0x2A, + 0xEE, 0xC3, 0xB8, 0x15, 0x7F, 0xDB, 0x91, 0x41, + 0x8C, 0x22, 0x19, 0xF6, 0x41, 0x49, 0x74, 0x70, + 0x17, 0xAC, 0xA7, 0xD4, 0x65, 0xB8, 0xB4, 0x7F, + 0xFA, 0x53, 0x64, 0x4B, 0x8B, 0xC6, 0xDA, 0x12, + 0xDD, 0x45, 0xD1, 0x05, 0x5E, 0x47, 0xB4, 0xD8, + 0x39, 0x0E, 0xB2, 0xBD, 0x60, 0x2B, 0xA0, 0x30 + }, + { + 0x27, 0xF8, 0x56, 0xE6, 0x3E, 0xB9, 0x4D, 0x08, + 0xFB, 0xBE, 0x50, 0x22, 0xB0, 0xED, 0xDB, 0xC7, + 0xD8, 0xDB, 0x86, 0x5E, 0xF4, 0xFE, 0xC2, 0x05, + 0x86, 0xDF, 0x3D, 0xD9, 0x02, 0xA0, 0x5B, 0x26, + 0x35, 0x9E, 0x26, 0x7C, 0x78, 0x8D, 0x7C, 0x88, + 0x03, 0x2E, 0x76, 0x6B, 0x11, 0x87, 0x40, 0x20, + 0x0F, 0x49, 0xCB, 0x4D, 0x6E, 0xDB, 0x15, 0x61, + 0xB2, 0xDE, 0x7D, 0xC6, 0x5E, 0xE6, 0x42, 0x3B + }, + { + 0xE9, 0xE9, 0x8D, 0x6D, 0xE0, 0xEF, 0x53, 0xFD, + 0x24, 0x27, 0x66, 0x1E, 0x1A, 0xCF, 0x10, 0x3D, + 0x4C, 0xAA, 0x4D, 0xC6, 0x10, 0x03, 0x62, 0x09, + 0xEC, 0x99, 0x74, 0x19, 0xC1, 0x20, 0x63, 0x1C, + 0x2C, 0x09, 0x4A, 0x8E, 0xE7, 0x82, 0x2D, 0x43, + 0xF8, 0x77, 0x80, 0x11, 0xC6, 0x03, 0x11, 0x1F, + 0x26, 0x28, 0xF8, 0x97, 0xC9, 0xB4, 0x31, 0x31, + 0x54, 0x77, 0x75, 0x6B, 0x03, 0x2E, 0x1F, 0x8D + }, + { + 0x52, 0xEB, 0x1E, 0x6C, 0x8A, 0x54, 0x49, 0x2C, + 0xA7, 0x60, 0xB5, 0x6C, 0xA8, 0x7D, 0xA3, 0xE1, + 0xA9, 0xA6, 0xD8, 0xA4, 0x21, 0x92, 0x19, 0x35, + 0x1D, 0x18, 0x71, 0x5A, 0x9A, 0x2C, 0x26, 0x70, + 0x8B, 0xB7, 0x12, 0xCD, 0xAC, 0x04, 0x34, 0x48, + 0x2E, 0x55, 0x1C, 0xB0, 0x9E, 0x3F, 0x16, 0x33, + 0x8D, 0xE2, 0x9B, 0xE2, 0xC6, 0x67, 0x40, 0xC3, + 0x44, 0xDF, 0x54, 0x88, 0xC5, 0xC2, 0xBB, 0x26 + }, + { + 0x47, 0x3F, 0xA6, 0xC5, 0x1A, 0x48, 0x10, 0x5F, + 0x72, 0x1C, 0x5C, 0xB8, 0xDB, 0xA6, 0x1C, 0x64, + 0xA1, 0xE3, 0xDD, 0xCC, 0xC3, 0x25, 0x0E, 0x68, + 0x22, 0x62, 0xF2, 0x12, 0xC0, 0x1A, 0xB4, 0x87, + 0x4A, 0xFF, 0x68, 0x8F, 0xEA, 0x96, 0x37, 0x73, + 0x9E, 0x2A, 0x25, 0xD2, 0xEE, 0x88, 0xDB, 0xDC, + 0xC4, 0xF0, 0x4D, 0x01, 0x47, 0x9B, 0x30, 0x17, + 0x17, 0x53, 0x3A, 0x64, 0x32, 0xB8, 0x50, 0xCD + }, + { + 0x6B, 0x76, 0x60, 0xD4, 0x10, 0xEA, 0xE5, 0xF3, + 0x5A, 0xD0, 0xAE, 0x85, 0xE6, 0x3D, 0xA4, 0x53, + 0xEB, 0xB0, 0x57, 0xE4, 0x3F, 0x42, 0xE8, 0x42, + 0xCB, 0xF6, 0x25, 0x0D, 0xA6, 0x78, 0x66, 0xB4, + 0x24, 0x0D, 0x57, 0xC8, 0x3B, 0x77, 0x1B, 0x0F, + 0x70, 0x66, 0x3E, 0x17, 0xFB, 0xD9, 0x08, 0x7F, + 0x76, 0xB4, 0xCE, 0x6B, 0xCD, 0x0B, 0x50, 0x2E, + 0x33, 0x74, 0xB1, 0x50, 0x9B, 0xBA, 0x55, 0xA8 + }, + { + 0xA4, 0xD0, 0x8A, 0xCA, 0x7A, 0x9E, 0xA6, 0x43, + 0x99, 0x99, 0xEA, 0x21, 0xE4, 0xCF, 0xE9, 0x86, + 0x9B, 0xB9, 0x0E, 0x3A, 0x01, 0x48, 0x71, 0xAD, + 0x88, 0xED, 0x3A, 0x97, 0xAA, 0x89, 0x15, 0x95, + 0x1C, 0x3F, 0xD0, 0xB3, 0x93, 0x3A, 0x50, 0x85, + 0x88, 0x93, 0x8A, 0xF7, 0x54, 0x49, 0x44, 0xEF, + 0x43, 0xC4, 0x40, 0xAA, 0x8F, 0xF1, 0xE5, 0xA8, + 0x18, 0xA4, 0x66, 0x43, 0x5D, 0xE7, 0x0F, 0xA8 + }, + { + 0x85, 0xE0, 0xE9, 0xB5, 0x0D, 0x2D, 0xB0, 0x22, + 0xC2, 0x39, 0xD7, 0x23, 0x2A, 0xE4, 0x7C, 0x02, + 0x59, 0x22, 0xE4, 0xF0, 0x7E, 0x2A, 0xFC, 0x65, + 0x6C, 0xDC, 0x55, 0x53, 0xA2, 0x7D, 0x95, 0xBF, + 0xA5, 0x8A, 0x57, 0x4D, 0x4E, 0xC3, 0xA9, 0x73, + 0x28, 0x1A, 0x8F, 0x4E, 0x46, 0xA7, 0x1A, 0xB0, + 0x34, 0x1C, 0x25, 0x77, 0x28, 0x74, 0x63, 0xE2, + 0x51, 0x04, 0x4D, 0xB2, 0x39, 0x8D, 0x55, 0xE2 + }, + { + 0x81, 0xA0, 0xD0, 0x24, 0x42, 0x90, 0x51, 0x91, + 0x16, 0x33, 0x70, 0xAE, 0x29, 0xC7, 0xF8, 0x9C, + 0x0F, 0x48, 0xBC, 0x1A, 0x1E, 0xB2, 0x94, 0x70, + 0x47, 0xDA, 0x1C, 0x62, 0x2B, 0x86, 0x77, 0xE9, + 0xEA, 0x9B, 0xEC, 0xED, 0x55, 0xD3, 0x3A, 0xDB, + 0x15, 0x53, 0xBD, 0x58, 0x4A, 0xD2, 0xF8, 0x6A, + 0x62, 0x07, 0xE8, 0x4E, 0x40, 0xE4, 0x60, 0x7E, + 0x11, 0x65, 0x0E, 0xE2, 0x87, 0x9F, 0x4E, 0x0B + }, + { + 0x87, 0x79, 0x0D, 0xF6, 0xCF, 0x73, 0x94, 0x45, + 0x1B, 0xCC, 0x73, 0x0E, 0x53, 0xFC, 0x57, 0xBE, + 0x56, 0x45, 0x22, 0x77, 0x1E, 0x14, 0x43, 0x2A, + 0x80, 0xAB, 0x0B, 0x06, 0xB7, 0xB1, 0xD2, 0x09, + 0xAD, 0x69, 0x89, 0x95, 0x12, 0x53, 0x85, 0xDB, + 0x8B, 0x3C, 0x09, 0x59, 0xB8, 0xA5, 0x33, 0x9E, + 0xDA, 0x0A, 0xE6, 0x78, 0x59, 0xD8, 0x47, 0xF4, + 0x4C, 0x81, 0x59, 0x72, 0x72, 0xCB, 0xF1, 0x95 + }, + { + 0xCC, 0x06, 0x4E, 0xA8, 0x53, 0xDC, 0x01, 0x52, + 0xCC, 0x03, 0xFE, 0xB5, 0xFB, 0x5D, 0xE7, 0x8B, + 0x9B, 0x88, 0xE9, 0x61, 0x55, 0xD5, 0x35, 0x8B, + 0xCE, 0x84, 0xA5, 0x4C, 0x0E, 0x0C, 0x42, 0xFB, + 0xDA, 0x09, 0x2F, 0x22, 0xD0, 0x56, 0xDF, 0x99, + 0x93, 0x26, 0x2E, 0x2B, 0xA4, 0x4A, 0x5B, 0x2D, + 0x53, 0xC3, 0x75, 0x9D, 0x09, 0x45, 0xFE, 0xBA, + 0xA6, 0xFD, 0x51, 0xB8, 0xFF, 0x38, 0xD8, 0x39 + }, + { + 0x7E, 0x51, 0x7F, 0xC3, 0x83, 0xEE, 0x8C, 0x9F, + 0x0A, 0x01, 0x68, 0x1D, 0x39, 0xE7, 0x3B, 0xEB, + 0xA5, 0x96, 0x95, 0x95, 0xCE, 0x77, 0x92, 0x7F, + 0x91, 0x69, 0x1F, 0x33, 0xBB, 0x3E, 0x13, 0x07, + 0xEE, 0x03, 0x61, 0x6C, 0x27, 0xE6, 0x79, 0x51, + 0x86, 0xF6, 0x94, 0x0F, 0xED, 0xD9, 0xD5, 0xC7, + 0xF2, 0x1B, 0x6D, 0x2A, 0xAF, 0x70, 0x29, 0x9C, + 0xDD, 0x83, 0x51, 0x25, 0x05, 0x0A, 0x8B, 0x3C + }, + { + 0x84, 0x5F, 0xCF, 0xA6, 0x7F, 0x6E, 0x06, 0x55, + 0x10, 0xD2, 0x62, 0xF1, 0xDD, 0x69, 0x39, 0xEA, + 0x4C, 0x0A, 0x4A, 0x59, 0xC8, 0xEE, 0x39, 0x77, + 0xDB, 0x70, 0x05, 0xE1, 0xAE, 0xE4, 0x20, 0xBD, + 0x3F, 0x38, 0x26, 0xEC, 0xFE, 0x59, 0x01, 0x5B, + 0x4D, 0xFA, 0x0B, 0xD5, 0xBB, 0xF8, 0xD8, 0xA4, + 0x34, 0x48, 0x5D, 0xC1, 0x1C, 0xB9, 0xCC, 0x85, + 0x97, 0xCB, 0x8C, 0x95, 0x66, 0x11, 0x5F, 0x31 + }, + { + 0x17, 0xCF, 0x2C, 0x23, 0x21, 0x5B, 0xCD, 0xFC, + 0x24, 0x3D, 0x8A, 0x94, 0x5F, 0x3C, 0x5C, 0x25, + 0x1D, 0x27, 0x18, 0xA3, 0xF7, 0x5F, 0xED, 0x6F, + 0x33, 0x20, 0xBC, 0xC6, 0xFD, 0x92, 0x73, 0x86, + 0xD5, 0x6F, 0x87, 0x19, 0xCC, 0xA0, 0x2E, 0xC5, + 0xE9, 0x9C, 0xDA, 0xC4, 0xEA, 0x10, 0x95, 0xB4, + 0x65, 0xBA, 0x9A, 0x29, 0x8B, 0x1D, 0x23, 0x8E, + 0x38, 0xB3, 0xFA, 0x15, 0xE8, 0xB1, 0x4E, 0xE4 + }, + { + 0xD7, 0x89, 0xCE, 0xC7, 0xD7, 0x52, 0x0F, 0x10, + 0xE8, 0xB8, 0xB6, 0xC8, 0x40, 0x95, 0x89, 0xDF, + 0x57, 0xB8, 0x56, 0xB8, 0x24, 0x55, 0x68, 0xF6, + 0x4E, 0x2D, 0x21, 0x83, 0xE3, 0x59, 0xA7, 0x84, + 0xC8, 0xD2, 0x6C, 0xF9, 0xB7, 0x20, 0xF5, 0xDF, + 0x56, 0x7B, 0x01, 0xF3, 0xF4, 0x8D, 0xE6, 0x4D, + 0x4F, 0x0D, 0xB1, 0x56, 0xBE, 0x52, 0x5D, 0x7C, + 0x7A, 0x66, 0x5A, 0xAD, 0xC5, 0x91, 0xF0, 0xB6 + }, + { + 0xB5, 0xE2, 0x46, 0xA9, 0x02, 0x77, 0x10, 0xC0, + 0xB0, 0x55, 0xC7, 0x1F, 0x11, 0x67, 0xE0, 0xEE, + 0x36, 0xEB, 0xC4, 0x32, 0xCF, 0x5D, 0x14, 0x27, + 0x75, 0xA7, 0xAE, 0xCC, 0xCE, 0xA7, 0x83, 0x25, + 0xED, 0x8C, 0x12, 0xF5, 0x0F, 0xBE, 0x64, 0x8A, + 0xDD, 0xF0, 0x59, 0xB8, 0xC0, 0x2A, 0x61, 0x49, + 0x2F, 0x83, 0x57, 0xBE, 0xE1, 0x42, 0xE7, 0xF7, + 0xDE, 0x04, 0x33, 0x78, 0xDB, 0xCF, 0x2D, 0x33 + }, + { + 0xB5, 0x23, 0xFD, 0x77, 0xAB, 0x9E, 0xEE, 0x42, + 0x48, 0x72, 0xBC, 0x2E, 0x83, 0xFC, 0x0A, 0x77, + 0xFF, 0x8A, 0x90, 0xC9, 0xA0, 0xCE, 0x9E, 0x8C, + 0x87, 0x68, 0x0A, 0x0F, 0x62, 0x86, 0x33, 0x1F, + 0x15, 0xC9, 0x3A, 0x2A, 0xFE, 0xCF, 0x75, 0x66, + 0x65, 0x3F, 0x24, 0xD9, 0x30, 0xC3, 0x23, 0x19, + 0x2D, 0x30, 0x43, 0xB9, 0x05, 0x72, 0x1C, 0xBD, + 0xB6, 0x31, 0x11, 0xCA, 0x42, 0xF2, 0x8F, 0x4E + }, + { + 0x43, 0x59, 0xA4, 0x58, 0x76, 0xBF, 0x6A, 0xCC, + 0x0A, 0xEC, 0xE7, 0xB9, 0xB4, 0xB4, 0xA8, 0x38, + 0xB9, 0xDB, 0xA5, 0x77, 0x6A, 0x3B, 0x14, 0xDA, + 0x2F, 0xBA, 0x91, 0x02, 0xE7, 0x8B, 0xF6, 0x48, + 0xFF, 0xB4, 0xD8, 0x67, 0xBA, 0xE8, 0x5F, 0xD9, + 0xB7, 0x13, 0x12, 0xDC, 0x46, 0x02, 0xD0, 0xD4, + 0x9C, 0x90, 0x7B, 0xB9, 0x28, 0x9B, 0x22, 0x95, + 0x96, 0x1E, 0x54, 0x13, 0x81, 0x23, 0xF5, 0x4A + }, + { + 0xD3, 0xF2, 0xC8, 0xE7, 0x4F, 0x34, 0x3A, 0x4E, + 0x71, 0x90, 0xD4, 0x75, 0xCF, 0x9A, 0xF7, 0x54, + 0xEE, 0xD5, 0x57, 0x72, 0x62, 0xB3, 0x5B, 0xD9, + 0xA9, 0xC4, 0x2B, 0x58, 0xCE, 0x88, 0x26, 0x2E, + 0x31, 0x14, 0x91, 0x7F, 0xB9, 0xE6, 0x83, 0xC6, + 0x2D, 0x9F, 0x89, 0x47, 0xB5, 0x8A, 0x29, 0x4D, + 0xA5, 0x06, 0xFB, 0x86, 0xB3, 0xED, 0xF2, 0x5C, + 0xB9, 0xE2, 0xD2, 0xDF, 0x61, 0x1C, 0xD4, 0x48 + }, + { + 0x41, 0xB8, 0x90, 0xF8, 0xE8, 0x45, 0x0D, 0xAD, + 0xB6, 0x95, 0x9A, 0xCC, 0xBA, 0x19, 0x49, 0x17, + 0xE0, 0x2F, 0x30, 0x67, 0x82, 0x1D, 0x4E, 0x99, + 0x5A, 0x37, 0xAC, 0x18, 0xBA, 0x3E, 0x47, 0xC7, + 0x50, 0x6E, 0x7A, 0x3D, 0xD1, 0xE1, 0x12, 0xE6, + 0xEC, 0x41, 0xBE, 0xF5, 0x30, 0x85, 0x11, 0x20, + 0x89, 0x4A, 0x7B, 0x34, 0xB3, 0xDB, 0xCD, 0xAE, + 0x40, 0x73, 0x27, 0xF0, 0xC5, 0x73, 0x6E, 0xDF + }, + { + 0x19, 0xD7, 0x14, 0x4F, 0x0C, 0x85, 0x1E, 0xB8, + 0xB0, 0x53, 0xA3, 0xA4, 0x35, 0x86, 0x52, 0x6D, + 0xC5, 0xC7, 0x73, 0xE4, 0x97, 0x97, 0x51, 0x64, + 0xD1, 0x11, 0x51, 0x36, 0x43, 0x68, 0xDF, 0x24, + 0xBC, 0x44, 0xD5, 0x36, 0x07, 0x23, 0x04, 0xD7, + 0x06, 0x31, 0xA8, 0x40, 0xB6, 0x36, 0xB9, 0x66, + 0xFD, 0x02, 0x8F, 0x61, 0x06, 0x2B, 0xFC, 0x52, + 0x85, 0x67, 0x01, 0x53, 0xA6, 0x36, 0x3A, 0x0A + }, + { + 0xC2, 0x18, 0x4C, 0x1A, 0x81, 0xE9, 0x83, 0xBE, + 0x2C, 0x96, 0xE4, 0xCF, 0xD6, 0x5A, 0xFB, 0xDA, + 0x1A, 0xC6, 0xEF, 0x35, 0x26, 0x6E, 0xE4, 0xB3, + 0xAB, 0x1F, 0xB0, 0x3A, 0xBA, 0xDD, 0xFD, 0xD4, + 0x03, 0xFF, 0xFC, 0xAF, 0xB4, 0xAD, 0xE0, 0xE9, + 0x2D, 0xA3, 0x82, 0xDA, 0x8C, 0x40, 0x22, 0x2E, + 0x10, 0xE9, 0xFD, 0xE8, 0x56, 0xC5, 0x1B, 0xDA, + 0xCD, 0xE7, 0x41, 0xA6, 0x49, 0xF7, 0x33, 0x5D + }, + { + 0x48, 0x8C, 0x0D, 0x65, 0x2E, 0x42, 0xFD, 0x78, + 0xAB, 0x3A, 0x2D, 0xC2, 0x8C, 0xF3, 0xEB, 0x35, + 0xFC, 0xDD, 0xC8, 0xDE, 0xF7, 0xEA, 0xD4, 0x81, + 0x7B, 0xFF, 0xB6, 0x4C, 0x1A, 0xE0, 0xF2, 0x08, + 0xF7, 0x8C, 0xF4, 0x09, 0x76, 0xF7, 0xE2, 0xA2, + 0xCB, 0x2D, 0xD3, 0x0F, 0x1C, 0x99, 0x13, 0x02, + 0x08, 0xCE, 0xB6, 0x92, 0xC6, 0x68, 0x80, 0xD9, + 0x52, 0x8C, 0xD6, 0xD3, 0x8A, 0xD2, 0x9D, 0xB2 + }, + { + 0x51, 0x5B, 0x65, 0xBF, 0x65, 0x68, 0x83, 0x99, + 0x57, 0x5F, 0x0E, 0x06, 0x77, 0xBB, 0x6A, 0x91, + 0x9B, 0x66, 0x33, 0x55, 0x46, 0xD6, 0xCA, 0xE3, + 0x36, 0xF5, 0xC6, 0xFE, 0xAE, 0x5E, 0x2B, 0xF7, + 0x45, 0xE3, 0xA7, 0xB1, 0x3C, 0x32, 0x05, 0xDD, + 0x8B, 0x5B, 0x92, 0xCF, 0x05, 0x3B, 0xE9, 0x69, + 0xDF, 0x71, 0x20, 0xFC, 0xEF, 0x77, 0xE3, 0x89, + 0x5F, 0x56, 0x0F, 0xD2, 0x32, 0xFB, 0x89, 0x50 + }, + { + 0x3F, 0xDB, 0xC7, 0xD6, 0x9F, 0x4B, 0x53, 0xC2, + 0x25, 0x66, 0x3D, 0xA3, 0x0D, 0x80, 0xF7, 0x2E, + 0x54, 0x28, 0x10, 0x44, 0xA2, 0x2B, 0x98, 0x82, + 0xC6, 0x63, 0x8F, 0x55, 0x26, 0x83, 0x4B, 0xD3, + 0x16, 0x01, 0xCA, 0x5E, 0xB2, 0xCC, 0xA4, 0xF5, + 0xFF, 0xCF, 0x67, 0x5D, 0xCB, 0xCF, 0xCA, 0x60, + 0xC8, 0xA3, 0x61, 0x2D, 0x1A, 0xA9, 0xDA, 0xB6, + 0x93, 0xB2, 0x35, 0x60, 0x69, 0x60, 0x3A, 0x0E + }, + { + 0x4F, 0xF6, 0xC3, 0x1A, 0x8F, 0xC0, 0x01, 0xAC, + 0x3B, 0x7A, 0xE0, 0x20, 0xC5, 0xF7, 0xC4, 0x5E, + 0xFB, 0x62, 0x71, 0xA2, 0xD7, 0xCC, 0xAB, 0x87, + 0x13, 0xE5, 0x48, 0xB7, 0x29, 0xF0, 0xFF, 0xF9, + 0xC8, 0x2F, 0xD4, 0xDB, 0x5C, 0xF6, 0x56, 0x43, + 0xD4, 0x07, 0x6A, 0x3F, 0xB1, 0x7B, 0x3E, 0x89, + 0x3C, 0x30, 0x2D, 0xC7, 0x5B, 0x61, 0x22, 0xFF, + 0x86, 0x81, 0xD0, 0x37, 0x12, 0x0E, 0x27, 0x6A + }, + { + 0x43, 0xDF, 0xF2, 0x60, 0xDF, 0xEF, 0x1C, 0xB2, + 0xD6, 0x16, 0x00, 0xE2, 0x40, 0xAA, 0xD6, 0xB7, + 0x20, 0xE5, 0xF4, 0xF8, 0x30, 0x86, 0xE2, 0x6A, + 0x49, 0xA0, 0xCE, 0x3E, 0x0C, 0xA4, 0x4B, 0x9A, + 0x60, 0xFC, 0xF4, 0x6A, 0x8C, 0x3F, 0x1B, 0xB1, + 0xA6, 0xF5, 0x76, 0x2B, 0x66, 0x51, 0x3F, 0xE3, + 0xF7, 0xC5, 0xB0, 0xBC, 0x15, 0x0C, 0x08, 0x49, + 0x1A, 0xCB, 0xC4, 0x36, 0x1C, 0xAB, 0xCF, 0xDF + }, + { + 0xB4, 0xDE, 0xA9, 0x4C, 0x9D, 0x36, 0x75, 0xBE, + 0x05, 0x12, 0xEF, 0xDE, 0xA8, 0x16, 0x38, 0x70, + 0xFE, 0x34, 0x25, 0xDC, 0xD7, 0x61, 0xF3, 0x63, + 0xC4, 0x3A, 0x0C, 0xA5, 0x71, 0x6B, 0x76, 0x54, + 0x06, 0x63, 0xFB, 0x2B, 0xE4, 0x9E, 0x2D, 0xB1, + 0x06, 0x48, 0x5C, 0x9C, 0xDD, 0x3C, 0x16, 0x48, + 0x98, 0xA9, 0x54, 0xB5, 0x87, 0x48, 0xC4, 0x2F, + 0xEA, 0x16, 0xA4, 0x0F, 0xC4, 0x53, 0xD2, 0x10 + }, + { + 0xE5, 0x27, 0x7B, 0x6F, 0x93, 0xEA, 0x1D, 0xE3, + 0xE2, 0xD9, 0xFC, 0xD8, 0xC6, 0x79, 0x79, 0x3C, + 0x6C, 0xCB, 0x8A, 0x3B, 0xE2, 0x6E, 0x8E, 0x31, + 0x14, 0xF3, 0x5D, 0xA4, 0xF2, 0xAC, 0x01, 0x4F, + 0x55, 0xC2, 0xF1, 0x5E, 0x09, 0xE9, 0x4A, 0xA0, + 0x71, 0x29, 0x81, 0x67, 0xA2, 0xFB, 0x9B, 0xE3, + 0x11, 0x70, 0x1F, 0xFB, 0xA9, 0xD3, 0xEE, 0xFF, + 0x8F, 0xFC, 0x79, 0x93, 0xA3, 0xCE, 0xCE, 0x18 + }, + { + 0xF0, 0x95, 0xA7, 0xC6, 0xE2, 0xB9, 0x16, 0x64, + 0x73, 0x4F, 0x3E, 0x23, 0xF1, 0x8E, 0xB2, 0xBA, + 0x9B, 0x00, 0xE7, 0x1F, 0xBF, 0xCB, 0x99, 0x31, + 0xC0, 0xA6, 0x14, 0x79, 0x2A, 0x9D, 0x86, 0x75, + 0x62, 0x2A, 0x87, 0x4C, 0x1B, 0xF5, 0x24, 0x1A, + 0x2A, 0x87, 0x41, 0xED, 0x1C, 0x89, 0x3B, 0xDF, + 0xA8, 0xE2, 0x8C, 0x2E, 0x20, 0xBB, 0x1C, 0x58, + 0xEB, 0x4D, 0xE7, 0xD8, 0x01, 0x11, 0x6C, 0x78 + }, + { + 0xDF, 0xA1, 0xFD, 0x80, 0x3A, 0x1D, 0x4A, 0x3E, + 0x66, 0x1D, 0xF0, 0x1F, 0x49, 0x43, 0xEA, 0x66, + 0x26, 0x0A, 0x18, 0xFE, 0xCE, 0x13, 0x4D, 0x62, + 0xF9, 0x7D, 0xAC, 0xDB, 0x8B, 0x3B, 0xF9, 0xC8, + 0x00, 0xAF, 0xE5, 0x79, 0xCF, 0xD1, 0x3F, 0xC0, + 0x14, 0x8B, 0xDE, 0xFB, 0xFF, 0x4E, 0x76, 0x83, + 0x56, 0x1C, 0x06, 0xA6, 0xF7, 0x22, 0x5E, 0x47, + 0x81, 0x99, 0x3B, 0x4F, 0x4F, 0x2B, 0xCB, 0xFA + }, + { + 0x2B, 0x86, 0xCE, 0xB2, 0x70, 0xF6, 0x90, 0x8D, + 0x8B, 0x16, 0x00, 0x75, 0xEA, 0x7F, 0x57, 0x16, + 0x3A, 0xF5, 0xD5, 0xC6, 0xF8, 0xAA, 0xC5, 0x20, + 0x40, 0xCC, 0x68, 0x7C, 0x17, 0xAB, 0xF3, 0xC7, + 0x78, 0xC1, 0x39, 0x06, 0xE0, 0xE6, 0xF2, 0x9A, + 0x6A, 0xB1, 0x23, 0xDE, 0xEB, 0xCE, 0x39, 0x1F, + 0x90, 0x7D, 0x75, 0xD3, 0xA2, 0xCE, 0xFA, 0x0E, + 0xFC, 0xB8, 0x80, 0xA0, 0xE7, 0x0D, 0x71, 0x96 + }, + { + 0x32, 0x46, 0x6B, 0xCB, 0xDE, 0xD5, 0x38, 0xE5, + 0x68, 0x79, 0x54, 0x30, 0x35, 0x25, 0x36, 0xFE, + 0xB9, 0x19, 0xBF, 0x4D, 0x97, 0xCC, 0x44, 0xAB, + 0x1D, 0x80, 0x50, 0x40, 0xF4, 0xBC, 0x4C, 0x2E, + 0x79, 0x52, 0x72, 0x10, 0x18, 0x95, 0x8B, 0x4E, + 0xE7, 0x83, 0x03, 0x59, 0x0E, 0xF6, 0xAC, 0x45, + 0x0D, 0xF9, 0x2E, 0xC7, 0x7F, 0x47, 0x70, 0x54, + 0xBF, 0xF8, 0x67, 0xB8, 0x89, 0x71, 0xD4, 0x21 + }, + { + 0xEA, 0x64, 0xB0, 0x03, 0xA1, 0x35, 0x76, 0x61, + 0x21, 0xCF, 0xBC, 0xCB, 0xDC, 0x08, 0xDC, 0xA2, + 0x40, 0x29, 0x26, 0xBE, 0x78, 0xCE, 0xA3, 0xD0, + 0xA7, 0x25, 0x3D, 0x9E, 0xC9, 0xE6, 0x3B, 0x8A, + 0xCD, 0xD9, 0x94, 0x55, 0x99, 0x17, 0xE0, 0xE0, + 0x3B, 0x5E, 0x15, 0x5F, 0x94, 0x4D, 0x71, 0x98, + 0xD9, 0x92, 0x45, 0xA7, 0x94, 0xCE, 0x19, 0xC9, + 0xB4, 0xDF, 0x4D, 0xA4, 0xA3, 0x39, 0x93, 0x34 + }, + { + 0x05, 0xAD, 0x0F, 0x27, 0x1F, 0xAF, 0x7E, 0x36, + 0x13, 0x20, 0x51, 0x84, 0x52, 0x81, 0x3F, 0xF9, + 0xFB, 0x99, 0x76, 0xAC, 0x37, 0x80, 0x50, 0xB6, + 0xEE, 0xFB, 0x05, 0xF7, 0x86, 0x7B, 0x57, 0x7B, + 0x8F, 0x14, 0x47, 0x57, 0x94, 0xCF, 0xF6, 0x1B, + 0x2B, 0xC0, 0x62, 0xD3, 0x46, 0xA7, 0xC6, 0x5C, + 0x6E, 0x00, 0x67, 0xC6, 0x0A, 0x37, 0x4A, 0xF7, + 0x94, 0x0F, 0x10, 0xAA, 0x44, 0x9D, 0x5F, 0xB9 + }, + { + 0xB5, 0x45, 0x88, 0x02, 0x94, 0xAF, 0xA1, 0x53, + 0xF8, 0xB9, 0xF4, 0x9C, 0x73, 0xD9, 0x52, 0xB5, + 0xD1, 0x22, 0x8F, 0x1A, 0x1A, 0xB5, 0xEB, 0xCB, + 0x05, 0xFF, 0x79, 0xE5, 0x60, 0xC0, 0x30, 0xF7, + 0x50, 0x0F, 0xE2, 0x56, 0xA4, 0x0B, 0x6A, 0x0E, + 0x6C, 0xB3, 0xD4, 0x2A, 0xCD, 0x4B, 0x98, 0x59, + 0x5C, 0x5B, 0x51, 0xEA, 0xEC, 0x5A, 0xD6, 0x9C, + 0xD4, 0x0F, 0x1F, 0xC1, 0x6D, 0x2D, 0x5F, 0x50 + }, + { + 0xBB, 0xFB, 0x94, 0x77, 0xEC, 0x6A, 0x9F, 0x0C, + 0x25, 0x40, 0x5A, 0xCD, 0x8A, 0x30, 0xD5, 0xDD, + 0x7C, 0x73, 0x57, 0x1F, 0x1D, 0x1A, 0x6E, 0x8C, + 0xE7, 0x2F, 0x8B, 0x9C, 0x94, 0x1C, 0xF7, 0x79, + 0xB7, 0x64, 0x03, 0xAC, 0x7F, 0x04, 0x50, 0x05, + 0x25, 0x84, 0x39, 0x0A, 0x14, 0xEA, 0xA3, 0x7C, + 0x20, 0xB5, 0xBD, 0xB0, 0x38, 0x10, 0x54, 0xA9, + 0xA4, 0x95, 0x34, 0xF8, 0x14, 0x66, 0xBA, 0x9D + }, + { + 0xC8, 0x28, 0x7E, 0x93, 0x3D, 0x95, 0x04, 0xBF, + 0xFD, 0x7B, 0xE2, 0xAC, 0x02, 0x2B, 0x32, 0xF3, + 0xF4, 0x6D, 0x87, 0xA7, 0xA0, 0xE7, 0x9B, 0xB2, + 0xA1, 0xCB, 0xAA, 0xCC, 0x2E, 0x84, 0xCD, 0x70, + 0x84, 0x5D, 0x0D, 0x42, 0x78, 0x48, 0xA6, 0xD7, + 0x88, 0xD3, 0x96, 0x22, 0xE1, 0x0F, 0x43, 0x42, + 0x23, 0x7E, 0xEF, 0xA6, 0xD3, 0xC0, 0x12, 0xDA, + 0xE9, 0x6C, 0xC8, 0xA6, 0x50, 0xCC, 0x2E, 0x30 + }, + { + 0xC4, 0x59, 0x6F, 0xCB, 0x0A, 0x28, 0xD2, 0x4A, + 0xAD, 0x70, 0xCF, 0x18, 0x53, 0xEC, 0x29, 0xDA, + 0xC0, 0xFB, 0x20, 0x2D, 0x8E, 0xC1, 0x40, 0xDA, + 0x30, 0x00, 0x88, 0xBB, 0x85, 0xB9, 0x2C, 0x30, + 0x29, 0x19, 0x46, 0xAD, 0x30, 0x7C, 0x09, 0x6E, + 0x3B, 0x28, 0x66, 0x33, 0x5C, 0x93, 0x17, 0xAF, + 0xE2, 0x8C, 0xAD, 0xAB, 0x5D, 0x62, 0xC3, 0x54, + 0x32, 0x9C, 0x98, 0xD9, 0x93, 0xC5, 0xBE, 0x1C + }, + { + 0xE8, 0x8C, 0x38, 0xE6, 0x7E, 0x8D, 0x19, 0x83, + 0x58, 0x08, 0x85, 0x46, 0x70, 0x77, 0x9E, 0xCA, + 0x60, 0xBA, 0xD8, 0x54, 0xC5, 0x77, 0x87, 0x90, + 0xA0, 0x72, 0x54, 0xA3, 0x0A, 0x14, 0xAE, 0x82, + 0xB6, 0x1B, 0xB1, 0x69, 0x11, 0xFE, 0x57, 0x77, + 0x1D, 0x19, 0xE9, 0xB7, 0xF5, 0x02, 0x3C, 0x0D, + 0x4E, 0x8A, 0x8D, 0x37, 0x2E, 0x3D, 0x85, 0xE4, + 0x3B, 0x03, 0xE5, 0xE0, 0x0E, 0x6E, 0xBA, 0x4B + }, + { + 0x2D, 0x66, 0x3E, 0x03, 0xE6, 0xF3, 0x55, 0x2C, + 0xCD, 0xFB, 0xA4, 0x96, 0xA1, 0x4C, 0xC6, 0x22, + 0x4C, 0xEB, 0x1E, 0xB6, 0x1A, 0xA2, 0x65, 0xE6, + 0xA7, 0xD4, 0xA2, 0x6E, 0x54, 0x10, 0x61, 0x04, + 0xA9, 0x6E, 0x33, 0x09, 0x59, 0xF9, 0x71, 0x3B, + 0x34, 0x87, 0xC1, 0xB9, 0x49, 0x7C, 0xCF, 0x82, + 0x61, 0x1D, 0xBF, 0xA3, 0x4F, 0xF1, 0x1D, 0x31, + 0x33, 0xB5, 0xB5, 0xD1, 0xF1, 0xE4, 0xF8, 0xD0 + }, + { + 0x70, 0x7D, 0x6A, 0x58, 0x42, 0x1B, 0x8F, 0x7E, + 0x44, 0xFF, 0x1F, 0x83, 0x62, 0xBC, 0x70, 0x0F, + 0x71, 0xEF, 0x7C, 0x39, 0x35, 0xE0, 0x76, 0x4B, + 0xD1, 0x4D, 0x39, 0x0C, 0x1C, 0x72, 0x79, 0x2A, + 0xF9, 0xC2, 0xC0, 0x2F, 0xB7, 0x2A, 0x2B, 0x9D, + 0x9A, 0x07, 0x29, 0xCB, 0x3E, 0x99, 0x62, 0x6C, + 0xF0, 0x34, 0xDF, 0x54, 0xB5, 0x06, 0xB5, 0xB1, + 0x64, 0x64, 0xF4, 0x75, 0x86, 0x4F, 0x25, 0x90 + }, + { + 0x9D, 0x88, 0xF8, 0xBA, 0xA4, 0xEB, 0x0F, 0x9A, + 0xB2, 0x29, 0x2E, 0x49, 0x82, 0xAC, 0x80, 0x44, + 0x53, 0x58, 0x22, 0x7D, 0x7F, 0x9C, 0xE7, 0xA4, + 0xA6, 0x29, 0xF1, 0x80, 0xF7, 0x14, 0x1E, 0x08, + 0xFE, 0x63, 0x55, 0xC6, 0x45, 0x21, 0xA6, 0x9B, + 0xA2, 0xBF, 0xBD, 0x1C, 0x4A, 0x3E, 0xA0, 0x48, + 0xD0, 0xBC, 0x8A, 0xB3, 0x70, 0x1F, 0x30, 0xEA, + 0x83, 0xFB, 0xE0, 0x24, 0x74, 0xD8, 0x92, 0xBF + }, + { + 0x65, 0xEA, 0x4D, 0xB0, 0x4A, 0x75, 0x81, 0xC1, + 0x81, 0x94, 0xA8, 0x92, 0x1A, 0xFD, 0xFA, 0x4F, + 0x8D, 0x9A, 0xF6, 0x29, 0xDE, 0xD2, 0x77, 0x2C, + 0x65, 0x8E, 0x08, 0x48, 0x5F, 0x67, 0xAD, 0x2C, + 0xE2, 0x1A, 0x98, 0xCD, 0x29, 0x3F, 0xF2, 0x8D, + 0x4D, 0xFC, 0xDF, 0x65, 0x8C, 0xDC, 0x7A, 0xE6, + 0x70, 0x27, 0x84, 0x8E, 0x71, 0xCC, 0xC1, 0x15, + 0xA3, 0xFF, 0xBA, 0xC4, 0xFA, 0x61, 0xBB, 0x73 + }, + { + 0x0B, 0x4A, 0x68, 0x92, 0x9E, 0x7F, 0x15, 0xCA, + 0x91, 0xBB, 0x44, 0x39, 0xF2, 0x40, 0x37, 0x02, + 0x03, 0x4C, 0xD4, 0x74, 0x8E, 0x46, 0x92, 0x7A, + 0xBA, 0x95, 0xCB, 0xEF, 0x80, 0x04, 0x8B, 0x25, + 0xA6, 0x75, 0x97, 0x0F, 0xAC, 0x33, 0xC8, 0x74, + 0xAB, 0xD3, 0xD8, 0x3A, 0xA0, 0xF3, 0x7B, 0xE2, + 0x30, 0x83, 0x10, 0xE8, 0xDD, 0x79, 0x4F, 0x81, + 0x92, 0x93, 0x0E, 0xD5, 0x6E, 0x70, 0xA8, 0xE4 + }, + { + 0xC1, 0xC5, 0xD8, 0xAC, 0xFE, 0x3F, 0xDE, 0x67, + 0x4E, 0xDD, 0x36, 0x20, 0x15, 0x7A, 0x8B, 0x6B, + 0x4C, 0x8E, 0x67, 0xC6, 0xA7, 0xA9, 0x72, 0x67, + 0x41, 0xD9, 0xC3, 0x05, 0xE2, 0xA5, 0x2A, 0x87, + 0x97, 0xFD, 0xA0, 0xB2, 0xF1, 0x3A, 0xC7, 0x87, + 0x34, 0xDB, 0x2F, 0x4F, 0xC8, 0x3E, 0xF3, 0x24, + 0x14, 0xD9, 0x31, 0xEB, 0xAE, 0xAE, 0xCD, 0x82, + 0x6D, 0x7C, 0x2B, 0xE2, 0x03, 0xBD, 0xC2, 0xD1 + }, + { + 0x2D, 0xAD, 0xC8, 0xC9, 0xF7, 0x42, 0x5A, 0x01, + 0x14, 0x49, 0x12, 0x87, 0xBD, 0xC6, 0x8E, 0xAE, + 0x4F, 0xB6, 0x19, 0x4D, 0x1A, 0x10, 0x9D, 0xB9, + 0xB6, 0xE8, 0xA2, 0xAC, 0x94, 0xD4, 0xE4, 0x40, + 0x90, 0x99, 0x85, 0xC4, 0x29, 0x1F, 0xE8, 0x9F, + 0xD8, 0x28, 0x1F, 0x8F, 0xCE, 0xF6, 0xF6, 0xBC, + 0x32, 0x55, 0x0E, 0x53, 0xCB, 0x7A, 0x49, 0x42, + 0x89, 0x81, 0xE8, 0xD5, 0x3C, 0xF5, 0xA2, 0x12 + }, + { + 0xE5, 0x55, 0xF2, 0xA5, 0x8A, 0xCA, 0xC5, 0x50, + 0x3F, 0x9E, 0x2D, 0x97, 0xB2, 0x46, 0x87, 0x2B, + 0x4C, 0xA7, 0x8B, 0xD5, 0x6D, 0x47, 0xB7, 0x65, + 0xF0, 0x52, 0xAA, 0xB3, 0xDC, 0x77, 0xDB, 0xE9, + 0x93, 0x93, 0x6F, 0x22, 0x52, 0xF0, 0xAB, 0x2E, + 0x01, 0xFB, 0x08, 0x74, 0x72, 0xCC, 0xB5, 0xA1, + 0x21, 0xDD, 0xFF, 0xDE, 0x53, 0x1D, 0x3D, 0xC4, + 0x02, 0x2A, 0x7D, 0x19, 0x56, 0xCE, 0x0E, 0x20 + }, + { + 0x9B, 0x4E, 0xAE, 0x12, 0x95, 0x00, 0x0A, 0xEA, + 0x79, 0x83, 0xEC, 0x3B, 0xCB, 0x48, 0x57, 0xCC, + 0x71, 0x25, 0xFD, 0x73, 0x06, 0x78, 0x7C, 0x63, + 0x13, 0x24, 0x73, 0xCF, 0xE8, 0xF4, 0xEB, 0x45, + 0x31, 0x8A, 0x60, 0xDA, 0xAD, 0x64, 0x6D, 0x63, + 0xA2, 0x7C, 0x4B, 0x9D, 0x1F, 0x50, 0x73, 0x70, + 0x0A, 0x30, 0x57, 0xDE, 0x22, 0xA7, 0xFD, 0xF0, + 0x9A, 0x87, 0xAA, 0xC6, 0x6E, 0xBE, 0x47, 0x58 + }, + { + 0x96, 0x64, 0xAC, 0xC2, 0xDC, 0x72, 0x98, 0xB9, + 0x86, 0x8D, 0xB4, 0x95, 0xEE, 0xBC, 0x6B, 0x59, + 0x65, 0x7D, 0x13, 0x9A, 0x6A, 0xF0, 0x60, 0xA7, + 0x2F, 0xB6, 0x91, 0x24, 0xBD, 0xD3, 0xA6, 0x59, + 0x18, 0x88, 0xF0, 0x35, 0x4F, 0x70, 0x2B, 0x1B, + 0x88, 0x86, 0x84, 0x41, 0x10, 0x58, 0xA3, 0x75, + 0x9F, 0x7F, 0xD3, 0x7F, 0x06, 0xEA, 0xFB, 0x3B, + 0x58, 0xEC, 0xF2, 0x6F, 0x45, 0x53, 0xBE, 0x27 + }, + { + 0xFC, 0x16, 0xE0, 0x92, 0x5A, 0x35, 0xAA, 0xD4, + 0x7A, 0xD6, 0x95, 0x54, 0xB2, 0x57, 0x96, 0xFC, + 0xF9, 0x26, 0x0C, 0xB5, 0x0E, 0x6C, 0xC3, 0x74, + 0x75, 0x35, 0x55, 0x9E, 0x99, 0xC8, 0x58, 0x81, + 0xC7, 0x58, 0x89, 0xAC, 0x79, 0x3A, 0xB7, 0x8B, + 0x88, 0xB0, 0x5F, 0xB1, 0x60, 0x89, 0x56, 0x55, + 0xE4, 0xD6, 0x63, 0xA2, 0xA0, 0x9B, 0xA9, 0xFA, + 0x61, 0x4A, 0x10, 0xC2, 0x29, 0x47, 0x21, 0x0D + }, + { + 0x22, 0x5E, 0x73, 0x41, 0xF8, 0x57, 0x52, 0x4F, + 0x78, 0x90, 0x37, 0x6C, 0x50, 0xE6, 0x35, 0x4B, + 0x16, 0xC1, 0xCD, 0xFB, 0xF5, 0x8F, 0xE5, 0xF3, + 0xA4, 0x03, 0x94, 0x93, 0xB5, 0xDD, 0x40, 0x8D, + 0x79, 0xD4, 0x8C, 0x56, 0xE1, 0xF8, 0x9B, 0x68, + 0x7F, 0xBE, 0x33, 0x62, 0xA7, 0x7F, 0xA7, 0x5A, + 0x54, 0x37, 0x4B, 0x7A, 0x48, 0x5E, 0x91, 0xB1, + 0x89, 0xAF, 0x2E, 0x2F, 0x74, 0x9E, 0x2A, 0xDB + }, + { + 0xA0, 0x7A, 0x4C, 0x02, 0x3A, 0xC7, 0x04, 0xCE, + 0x7C, 0x09, 0xDD, 0x6C, 0x92, 0xC6, 0xF1, 0x84, + 0xF5, 0x3E, 0x8D, 0xD9, 0x6F, 0xE3, 0xBE, 0x9E, + 0x93, 0xC3, 0x9C, 0x53, 0x44, 0x85, 0xB6, 0x4B, + 0x39, 0xD5, 0xBE, 0x7F, 0x7B, 0x71, 0x70, 0x60, + 0x4D, 0xE7, 0x7C, 0xE5, 0xA4, 0x37, 0xA9, 0x8E, + 0x71, 0x2C, 0xC4, 0x4F, 0x19, 0xE2, 0x1D, 0x41, + 0xF0, 0xE6, 0xE3, 0xEC, 0x1E, 0x00, 0xAC, 0x55 + }, + { + 0x62, 0x85, 0x84, 0x63, 0x58, 0x2D, 0x22, 0xE6, + 0x8E, 0x52, 0x27, 0xBF, 0xBA, 0xB5, 0x40, 0x04, + 0x8F, 0x65, 0xED, 0xD6, 0xA6, 0x75, 0x5F, 0x6F, + 0xAB, 0x53, 0xC0, 0x25, 0xB6, 0x63, 0xCA, 0x37, + 0x7A, 0x0E, 0xD5, 0xEF, 0xD6, 0xAF, 0x16, 0x6C, + 0xA5, 0x5A, 0x9C, 0x73, 0x3F, 0xCA, 0x80, 0x5A, + 0xC4, 0xE4, 0x09, 0xCA, 0x56, 0x17, 0x7A, 0xA7, + 0x49, 0x40, 0xDB, 0x9F, 0x40, 0xC3, 0xB9, 0xFF + }, + { + 0xA1, 0xAC, 0x53, 0x9D, 0x1A, 0xBB, 0xC2, 0xB0, + 0x96, 0xFF, 0xAB, 0x81, 0x3B, 0x64, 0x45, 0x7F, + 0xE6, 0xEB, 0x3B, 0x50, 0xFC, 0xD8, 0x89, 0x53, + 0xD0, 0xCD, 0x9F, 0x65, 0x02, 0xF6, 0x89, 0x62, + 0x0A, 0xD4, 0x42, 0xB5, 0x51, 0x70, 0x90, 0xB5, + 0x0C, 0xFF, 0xB9, 0x58, 0x86, 0x6D, 0x7C, 0x16, + 0x1D, 0x8A, 0x7D, 0x75, 0x60, 0xC8, 0x93, 0xE1, + 0xDE, 0xF6, 0xAE, 0xC4, 0x37, 0xAD, 0x6D, 0x06 + }, + { + 0xB5, 0x86, 0xB7, 0x5D, 0xA7, 0x0F, 0x6C, 0xC0, + 0x62, 0x7E, 0xF3, 0xCF, 0x12, 0x37, 0xC9, 0x4B, + 0x12, 0xD0, 0xF7, 0x4D, 0xCB, 0xA2, 0x6A, 0x9E, + 0x7C, 0x7B, 0xC6, 0xC2, 0x1A, 0x33, 0x53, 0x37, + 0xBF, 0x9F, 0x5B, 0x83, 0x0C, 0x63, 0x24, 0xAF, + 0xA6, 0xEF, 0x64, 0x9E, 0x95, 0xAF, 0x87, 0x90, + 0x87, 0x52, 0x34, 0xC6, 0xE6, 0x61, 0xD3, 0xF5, + 0xE9, 0x8C, 0xA0, 0x12, 0xAE, 0x81, 0x48, 0x8A + }, + { + 0x56, 0x68, 0xA2, 0x98, 0x21, 0x37, 0xCB, 0xC6, + 0x22, 0xEF, 0x8D, 0x06, 0xCF, 0x4E, 0x86, 0x16, + 0x8C, 0xDD, 0x4A, 0x89, 0x9C, 0xD4, 0x46, 0x2A, + 0xF6, 0xC3, 0xD4, 0x15, 0x42, 0x61, 0x56, 0xA5, + 0xD8, 0xDD, 0x67, 0xC9, 0x60, 0x4F, 0x31, 0xB5, + 0x7D, 0x6C, 0x9D, 0x59, 0x72, 0x50, 0x45, 0x7E, + 0x4A, 0xB5, 0x2A, 0x58, 0x11, 0x55, 0x42, 0xAC, + 0xF2, 0x7F, 0x92, 0x59, 0x30, 0xF6, 0xA1, 0x12 + }, + { + 0xF2, 0xB1, 0xBD, 0x16, 0xD8, 0x8E, 0x37, 0xF3, + 0xA5, 0x18, 0xD1, 0x93, 0xED, 0x06, 0x1A, 0x1D, + 0xF7, 0xB4, 0x43, 0xA1, 0x8C, 0xE9, 0xF8, 0x44, + 0x45, 0xEF, 0x86, 0xEF, 0xFB, 0xDF, 0xF1, 0x60, + 0x55, 0x02, 0x3C, 0xD4, 0xE7, 0x8D, 0x03, 0x4D, + 0xE4, 0x03, 0x2A, 0x77, 0xDD, 0xC1, 0xD3, 0x43, + 0x52, 0xFE, 0x61, 0x7F, 0x82, 0x56, 0x24, 0x45, + 0x9B, 0xC3, 0x26, 0x9F, 0x70, 0x4F, 0x34, 0x5B + }, + { + 0xF0, 0x85, 0xF3, 0xD8, 0xBD, 0x13, 0x8E, 0x05, + 0x69, 0x24, 0x3F, 0x74, 0x52, 0x3E, 0x87, 0xFF, + 0x37, 0x6F, 0x04, 0xEA, 0xBD, 0x5A, 0x2F, 0x6E, + 0x53, 0xDF, 0x38, 0x99, 0x00, 0x0E, 0x2E, 0x94, + 0xAF, 0x0D, 0x2B, 0xC7, 0x1C, 0x3F, 0x71, 0x10, + 0x25, 0xC5, 0x38, 0xA6, 0xC8, 0xB1, 0x0B, 0x09, + 0x04, 0xDF, 0xC3, 0x46, 0xAD, 0xAD, 0x7E, 0xF3, + 0x6B, 0x1A, 0xE8, 0x8A, 0x6C, 0xFE, 0xAB, 0xBD + }, + { + 0x82, 0x91, 0xA4, 0xAF, 0xD2, 0xE4, 0xB7, 0x16, + 0x61, 0x77, 0x3A, 0x46, 0xB3, 0xD4, 0x45, 0x5A, + 0x8D, 0x33, 0xA7, 0x26, 0xD9, 0xD3, 0x87, 0x30, + 0x83, 0xAB, 0x33, 0x70, 0x20, 0xC2, 0x7B, 0x4D, + 0xD6, 0x43, 0xE2, 0x8C, 0x2F, 0xE4, 0x7A, 0xB2, + 0xFB, 0xF5, 0xD1, 0x40, 0x81, 0xA3, 0xFC, 0x1C, + 0x83, 0x9B, 0x12, 0xEA, 0x31, 0xD1, 0x3C, 0xF4, + 0x9E, 0xEE, 0x97, 0xEF, 0x2E, 0xD7, 0xFA, 0x3E + }, + { + 0xB1, 0x26, 0xAE, 0x46, 0xA7, 0xA4, 0x59, 0x5E, + 0x31, 0x60, 0x7E, 0xF8, 0x07, 0xA5, 0x60, 0x1F, + 0x4E, 0xCD, 0x9E, 0x7D, 0x66, 0xC8, 0x2D, 0xAE, + 0xB9, 0x71, 0x5F, 0x8D, 0xA1, 0xC1, 0x7D, 0x7D, + 0x71, 0xC3, 0xE6, 0x82, 0x50, 0xC9, 0xDC, 0x01, + 0xAC, 0x40, 0xA3, 0x6D, 0x2E, 0x63, 0x8B, 0xEF, + 0x3D, 0x7B, 0xC7, 0x0E, 0xA2, 0xD0, 0xE3, 0x31, + 0xE3, 0xD3, 0x3E, 0x17, 0x04, 0xEB, 0xA9, 0x2D + }, + { + 0x63, 0xB1, 0x4D, 0x8E, 0xD2, 0x47, 0x9C, 0xAA, + 0x17, 0xC3, 0xE4, 0xCF, 0x20, 0x3B, 0x23, 0x3A, + 0x7E, 0x37, 0x3E, 0xDB, 0x0C, 0x2F, 0x19, 0x71, + 0x29, 0xA9, 0xA3, 0x6C, 0x5B, 0x3E, 0x1F, 0x38, + 0x38, 0xF2, 0xE8, 0x2A, 0xC2, 0xC2, 0xAD, 0x9D, + 0x52, 0xB3, 0x35, 0x79, 0x0B, 0xFF, 0x57, 0x73, + 0x04, 0xA3, 0x78, 0xE3, 0x8E, 0xB6, 0xBB, 0x41, + 0x62, 0x03, 0x0C, 0xE2, 0xA8, 0xBA, 0x29, 0x3C + }, + { + 0x34, 0x42, 0x2A, 0x32, 0x29, 0x66, 0x99, 0x28, + 0xC4, 0x90, 0xF5, 0x7B, 0x8E, 0x76, 0x88, 0x52, + 0xE5, 0xB7, 0xC0, 0x0D, 0xCA, 0xD6, 0x0B, 0x01, + 0x2A, 0x5D, 0xB3, 0x9A, 0x2D, 0x59, 0x7C, 0x3D, + 0x0A, 0x63, 0xBE, 0x6A, 0x26, 0x3E, 0xA5, 0x36, + 0x08, 0xB7, 0x06, 0x92, 0xD7, 0x8E, 0x1B, 0x42, + 0x7E, 0xAC, 0xEC, 0x01, 0xF4, 0xBE, 0xE0, 0xBD, + 0xBB, 0x8F, 0x08, 0x81, 0x48, 0x8E, 0xFC, 0x28 + }, + { + 0xE2, 0x6B, 0x7E, 0xD6, 0xB9, 0x07, 0xB5, 0x4C, + 0xA2, 0x65, 0x67, 0xF1, 0x1E, 0xE5, 0xBB, 0x6D, + 0x73, 0x9A, 0x00, 0x08, 0xA5, 0x34, 0x37, 0xAD, + 0x75, 0x90, 0xA3, 0x13, 0x4C, 0xEB, 0x95, 0x19, + 0x6E, 0x49, 0xB3, 0x44, 0x3F, 0x32, 0x49, 0x22, + 0x51, 0x75, 0x23, 0xC0, 0xCD, 0x5A, 0x00, 0xD7, + 0x7E, 0x4C, 0x4D, 0xE7, 0xA0, 0xDE, 0x96, 0x8A, + 0x84, 0xFB, 0x1B, 0x3B, 0xE7, 0xB3, 0xB9, 0x63 + }, + { + 0x26, 0x01, 0x97, 0xCA, 0xFB, 0xF4, 0x56, 0xB4, + 0x11, 0xFA, 0x26, 0xD3, 0x83, 0xD6, 0x4D, 0x61, + 0xE8, 0x1E, 0x5E, 0x52, 0xF8, 0x4C, 0xD9, 0xD5, + 0x73, 0x86, 0xC7, 0x76, 0x23, 0x0C, 0x65, 0xA2, + 0x68, 0x1C, 0xD2, 0xFD, 0xFD, 0x28, 0x67, 0x9F, + 0x67, 0xFE, 0x1B, 0xD7, 0x46, 0x9C, 0xF7, 0x26, + 0x95, 0x85, 0xFC, 0xCB, 0xAE, 0xCC, 0x22, 0xF5, + 0x03, 0xD6, 0xE3, 0xFC, 0x39, 0x30, 0x14, 0x36 + }, + { + 0xCB, 0xD5, 0xAB, 0xE3, 0x7B, 0xCC, 0x4F, 0x9A, + 0x12, 0x70, 0xAD, 0xD0, 0xA5, 0x27, 0x0F, 0x42, + 0x83, 0x9C, 0x7D, 0x24, 0x93, 0x20, 0xD1, 0xF1, + 0xD8, 0x85, 0x53, 0xD0, 0x5F, 0xAF, 0x9A, 0x26, + 0x79, 0xF4, 0x9B, 0x49, 0xC9, 0xE2, 0x0C, 0x1C, + 0x85, 0xC6, 0x29, 0xAA, 0x0F, 0x09, 0x0C, 0xAE, + 0x8F, 0x6E, 0x32, 0xC6, 0xCA, 0xD7, 0x17, 0x21, + 0xFD, 0x06, 0x23, 0xE4, 0xED, 0x25, 0xB2, 0x56 + }, + { + 0x78, 0x0E, 0x31, 0x4F, 0xD6, 0x97, 0xD2, 0xA9, + 0x7D, 0x22, 0x1A, 0x22, 0xC3, 0x90, 0x11, 0xE2, + 0x50, 0x69, 0x16, 0x3C, 0xD0, 0x8F, 0x00, 0x70, + 0xD0, 0x67, 0xE8, 0xCD, 0xB0, 0xBC, 0x86, 0x73, + 0xFD, 0xB0, 0xEC, 0x4F, 0x46, 0xE3, 0x1D, 0x74, + 0x8C, 0xD3, 0xBB, 0x3D, 0x61, 0xB9, 0x01, 0x0A, + 0x66, 0x12, 0xF3, 0x41, 0xD4, 0x71, 0xD9, 0xC5, + 0xA2, 0xDE, 0x6B, 0x6D, 0xD5, 0x38, 0xA6, 0xB5 + }, + { + 0x40, 0x8F, 0x16, 0xCE, 0x86, 0xF8, 0x01, 0xD0, + 0x8B, 0xD0, 0x51, 0x36, 0x4B, 0x3E, 0xCD, 0x9A, + 0x39, 0x45, 0x71, 0x58, 0x88, 0xDF, 0x46, 0x63, + 0x21, 0x9A, 0x19, 0x0B, 0x35, 0x04, 0xE4, 0x61, + 0x8E, 0x7B, 0xF5, 0x51, 0x71, 0x17, 0x8B, 0x04, + 0x00, 0xFB, 0xEB, 0xFA, 0xA0, 0x1F, 0x6E, 0xEA, + 0xB5, 0x4F, 0xF5, 0xE3, 0x1E, 0x6D, 0x7A, 0x55, + 0xB8, 0x4A, 0xDB, 0x9E, 0x03, 0xDF, 0x48, 0x36 + }, + { + 0x0B, 0xF9, 0x88, 0x69, 0xEC, 0x05, 0x80, 0x19, + 0x9C, 0xA3, 0x70, 0x8E, 0xC9, 0xC4, 0x2C, 0x37, + 0x6C, 0x5C, 0x36, 0xE0, 0xFB, 0x74, 0x92, 0x42, + 0x57, 0x23, 0x98, 0xA0, 0xDA, 0x57, 0xF9, 0x8D, + 0x1C, 0x4C, 0xD2, 0x96, 0x3B, 0x37, 0xC3, 0xC6, + 0x5A, 0x10, 0xF1, 0x06, 0xB5, 0x6D, 0xCB, 0x96, + 0xDC, 0xDD, 0x32, 0x57, 0x96, 0x29, 0x7A, 0xDB, + 0xF6, 0xEE, 0x62, 0x70, 0xED, 0xD4, 0x59, 0x2A + }, + { + 0x05, 0x2C, 0x32, 0x98, 0x43, 0x87, 0xB1, 0x93, + 0x0D, 0x3A, 0x96, 0xBE, 0x72, 0x36, 0x85, 0x35, + 0x44, 0x4F, 0x13, 0x07, 0x57, 0xBF, 0x87, 0xE0, + 0x76, 0x2D, 0x8B, 0x1C, 0x4F, 0x65, 0x70, 0xF4, + 0xDC, 0x67, 0x4C, 0x4E, 0x6F, 0x5E, 0x21, 0xAB, + 0xD0, 0xB3, 0x5E, 0x1C, 0xA1, 0x9D, 0xB8, 0x40, + 0x68, 0x8D, 0x1B, 0x6E, 0x9E, 0xC9, 0x1F, 0x37, + 0x30, 0xE8, 0xB2, 0x88, 0x0E, 0xC2, 0xC3, 0xDF + }, + { + 0x4B, 0xB7, 0x14, 0x09, 0xC1, 0x5A, 0x0D, 0x39, + 0x32, 0xC5, 0x99, 0xEF, 0x0F, 0xF3, 0xEF, 0xF5, + 0xC7, 0x60, 0x2D, 0x70, 0x00, 0xCD, 0xA9, 0x74, + 0x08, 0x2C, 0x4A, 0x46, 0x82, 0x24, 0x9A, 0x19, + 0xD4, 0x3A, 0x5C, 0x14, 0xE0, 0xAE, 0xEF, 0x89, + 0x78, 0x21, 0x05, 0x63, 0x80, 0xAF, 0xF2, 0x75, + 0x20, 0x1D, 0x74, 0x59, 0x14, 0x84, 0x96, 0xEA, + 0xE9, 0x42, 0x0E, 0x71, 0x82, 0x88, 0xB4, 0x14 + }, + { + 0x47, 0x95, 0xB2, 0x51, 0xCC, 0x7B, 0x35, 0xE6, + 0x96, 0x92, 0xDB, 0x7F, 0xB4, 0x0E, 0xFD, 0x34, + 0xF2, 0x94, 0xF5, 0x1A, 0xEC, 0x15, 0xD6, 0xC8, + 0x67, 0x3E, 0x59, 0xF2, 0x04, 0xBE, 0xCF, 0x4C, + 0xF9, 0xDF, 0x84, 0x95, 0x23, 0xF1, 0xDB, 0x73, + 0xBE, 0x2A, 0x66, 0xC8, 0x39, 0xD8, 0x01, 0x97, + 0x4D, 0x43, 0x3B, 0x47, 0x80, 0x67, 0x01, 0xA1, + 0x63, 0xA7, 0x94, 0xB2, 0x6A, 0x84, 0x6B, 0x06 + }, + { + 0xDD, 0x50, 0xF9, 0x65, 0xB6, 0x0B, 0xAF, 0x16, + 0x8F, 0x5E, 0xA0, 0x5A, 0xC2, 0x0B, 0x8A, 0x78, + 0xF4, 0x47, 0x5C, 0x18, 0x61, 0x0B, 0x9D, 0x9F, + 0xC2, 0xB7, 0xC3, 0xAD, 0x5C, 0x6F, 0x97, 0xA4, + 0xCF, 0x5E, 0xA4, 0x8E, 0xE4, 0x0A, 0x3C, 0xA2, + 0x29, 0x3C, 0xC4, 0x21, 0x40, 0x82, 0xCF, 0x0F, + 0x8E, 0xC8, 0x95, 0x55, 0x32, 0x69, 0xE1, 0x4D, + 0xA9, 0xBD, 0x1A, 0x19, 0x65, 0x62, 0xCA, 0x59 + }, + { + 0xE0, 0xB5, 0x4B, 0x61, 0x7F, 0x44, 0x92, 0x2C, + 0x7F, 0x61, 0xC6, 0xA5, 0x4C, 0x98, 0xC6, 0x1E, + 0x93, 0x2D, 0xED, 0x1F, 0xA9, 0x34, 0x02, 0x66, + 0xEE, 0xA2, 0x5F, 0x01, 0xE8, 0x18, 0x0D, 0x1D, + 0xDC, 0x6A, 0xD8, 0xDD, 0x6A, 0x0B, 0x8F, 0xAB, + 0x8C, 0x73, 0xAE, 0xBB, 0x97, 0x73, 0x17, 0x1B, + 0xBA, 0x04, 0xA7, 0x81, 0xB1, 0x13, 0x14, 0xD5, + 0xA3, 0x0A, 0x9D, 0x1C, 0x28, 0x12, 0xCA, 0x7C + }, + { + 0x2D, 0xC4, 0xAD, 0x06, 0x89, 0xA4, 0x46, 0x0B, + 0x5B, 0x39, 0x9E, 0x91, 0x1B, 0xDB, 0x41, 0x58, + 0x6A, 0xC8, 0xAD, 0x36, 0x7B, 0x7A, 0xA3, 0x9E, + 0x3E, 0xAE, 0xC8, 0x89, 0x9A, 0x2D, 0x3C, 0xE3, + 0x8E, 0x34, 0xAB, 0x46, 0x08, 0x23, 0x4D, 0x75, + 0xEB, 0x67, 0x37, 0xFE, 0x21, 0x58, 0x24, 0xC2, + 0xA9, 0x78, 0x83, 0x59, 0x6F, 0x6F, 0x18, 0xDD, + 0xEB, 0xBF, 0x16, 0x27, 0xDE, 0xD9, 0x1D, 0x84 + }, + { + 0xF5, 0x6A, 0x11, 0xCB, 0xBF, 0x8A, 0x99, 0x7E, + 0x14, 0x77, 0xEC, 0x76, 0xE5, 0x3C, 0x89, 0x4B, + 0x14, 0x8D, 0x69, 0x25, 0xA4, 0x33, 0x6F, 0x0C, + 0xB7, 0xAA, 0xB9, 0xD8, 0x02, 0xAC, 0x9B, 0x45, + 0x36, 0xF4, 0x80, 0x10, 0x1F, 0x3F, 0x9A, 0x77, + 0xEE, 0xCD, 0xCB, 0xAE, 0x7A, 0xA6, 0xEA, 0x44, + 0x7A, 0x85, 0xDA, 0x90, 0xB5, 0x01, 0xF7, 0xDB, + 0x2E, 0xF8, 0xDD, 0xF5, 0xDE, 0x17, 0x33, 0x63 + }, + { + 0x6E, 0x17, 0x1D, 0x19, 0x6D, 0x0F, 0xC8, 0x2F, + 0xB4, 0x73, 0xE2, 0x9D, 0xA8, 0xF4, 0x0F, 0x37, + 0xEE, 0x97, 0x41, 0xAC, 0x3E, 0xAF, 0x17, 0x5D, + 0xD4, 0x9F, 0xDB, 0x56, 0x53, 0x0D, 0xB5, 0x98, + 0x98, 0xBA, 0xF3, 0xCE, 0xE7, 0x2E, 0xEF, 0x5E, + 0x77, 0x27, 0x6C, 0xAD, 0xAB, 0xCD, 0x75, 0x2C, + 0xA3, 0xA1, 0xB8, 0x64, 0xC1, 0x0A, 0xD2, 0x8D, + 0x27, 0xEA, 0xAD, 0x86, 0xE3, 0xF2, 0x1D, 0x33 + }, + { + 0x95, 0x20, 0x12, 0x33, 0x0D, 0x92, 0xBB, 0x9C, + 0x18, 0x92, 0xF2, 0x5B, 0x7B, 0x5A, 0xA0, 0xFE, + 0xD3, 0xC0, 0x39, 0x8A, 0x17, 0x08, 0x50, 0x9A, + 0x66, 0x14, 0x74, 0xA3, 0xF5, 0xE5, 0x11, 0xD0, + 0x9F, 0x21, 0xC3, 0x00, 0x08, 0x00, 0x2F, 0x10, + 0x42, 0xD8, 0x3D, 0x2F, 0x7B, 0x11, 0x33, 0x6B, + 0x8C, 0x2F, 0xE1, 0xD9, 0x79, 0xC1, 0xE3, 0x86, + 0xE0, 0x20, 0x97, 0x48, 0x9B, 0x2D, 0xFC, 0xF5 + }, + { + 0x2D, 0xCE, 0x47, 0xC3, 0x3A, 0x7E, 0x7F, 0x21, + 0x5D, 0x34, 0xA5, 0x47, 0x1B, 0xCD, 0x11, 0x10, + 0x60, 0x6C, 0x77, 0x13, 0x8F, 0x19, 0xD4, 0x17, + 0x41, 0xED, 0x5D, 0x1B, 0x89, 0xE8, 0xF7, 0xC7, + 0x74, 0xEE, 0xC4, 0xBB, 0xC1, 0x02, 0x76, 0x6E, + 0xA1, 0x53, 0x2F, 0x2E, 0x43, 0x13, 0x4A, 0xD3, + 0x66, 0xBD, 0xCC, 0x27, 0xD1, 0xA0, 0xCC, 0x95, + 0x9E, 0x16, 0x48, 0x65, 0x9E, 0x44, 0xCB, 0xBE + }, + { + 0x7F, 0x06, 0x59, 0x59, 0x7E, 0x7A, 0xD1, 0x22, + 0xD1, 0xC9, 0xED, 0x91, 0x93, 0x0B, 0x07, 0xDE, + 0x40, 0xE2, 0x55, 0x20, 0x1A, 0x33, 0xEB, 0x2B, + 0x31, 0x81, 0x37, 0x6E, 0x36, 0x8D, 0xF7, 0x76, + 0x4C, 0x0C, 0x14, 0xBF, 0x79, 0x9F, 0x16, 0x1B, + 0x9B, 0x00, 0x79, 0x57, 0x8B, 0x47, 0x09, 0x71, + 0x3E, 0x24, 0xE4, 0x2F, 0xE7, 0xDD, 0x71, 0xB5, + 0x09, 0x43, 0xF4, 0x40, 0xE2, 0x3C, 0xD1, 0xBE + }, + { + 0x1E, 0x66, 0xF7, 0xB3, 0x58, 0x80, 0x5D, 0xDD, + 0xFF, 0xC5, 0x82, 0x68, 0x3E, 0x0B, 0xAD, 0x81, + 0x8C, 0x87, 0x34, 0x03, 0xD4, 0xBA, 0x15, 0x06, + 0xB9, 0x2F, 0xB3, 0x20, 0xCA, 0x8C, 0xF9, 0xCE, + 0xE8, 0x15, 0x47, 0x15, 0xD6, 0xDB, 0x6F, 0x04, + 0x09, 0x3D, 0x4B, 0x3F, 0xD8, 0xA6, 0xFC, 0x8E, + 0x7E, 0xDD, 0xEA, 0xF2, 0x79, 0x5B, 0x3D, 0x22, + 0xDE, 0x7C, 0x75, 0xEC, 0xFF, 0x6F, 0x92, 0xAF + }, + { + 0x1F, 0x60, 0xC1, 0x8D, 0xB1, 0x68, 0xD9, 0x0D, + 0x2B, 0x46, 0x60, 0xE7, 0x58, 0xA3, 0xCD, 0x28, + 0x02, 0x3D, 0x4C, 0x0B, 0x84, 0x8B, 0x5E, 0x33, + 0xEA, 0x5C, 0xC1, 0x56, 0x29, 0xFD, 0x35, 0x2E, + 0xAC, 0xB1, 0x4F, 0x05, 0xFD, 0xEC, 0x07, 0xAC, + 0x23, 0xDA, 0x92, 0x04, 0x74, 0x5F, 0xA9, 0x73, + 0xC3, 0x29, 0x55, 0x13, 0x5F, 0x8E, 0xC7, 0x41, + 0x0A, 0x1C, 0xB5, 0x3B, 0xC7, 0x58, 0x06, 0x84 + }, + { + 0xB9, 0xDF, 0x57, 0xB3, 0x45, 0xEE, 0x6F, 0x87, + 0x0E, 0xE0, 0xE6, 0x3C, 0x55, 0x8B, 0x81, 0xC1, + 0xBC, 0x38, 0x42, 0x97, 0x6F, 0xD3, 0xCF, 0xB1, + 0xB5, 0x3B, 0x76, 0x6B, 0xF4, 0x36, 0xD1, 0xD1, + 0x75, 0xF4, 0xD4, 0xC5, 0xF1, 0xBD, 0x8D, 0x7A, + 0xF6, 0x5B, 0x5D, 0x18, 0xA7, 0x2F, 0x95, 0x71, + 0xF2, 0x34, 0x70, 0x19, 0x32, 0xAF, 0xB7, 0xC3, + 0xC9, 0x4A, 0x8C, 0x8F, 0xA0, 0x23, 0xDB, 0x4F + }, + { + 0xD8, 0xC8, 0x24, 0x95, 0xA2, 0xB5, 0xF6, 0x64, + 0x51, 0xF8, 0xC5, 0xB2, 0xE8, 0xA1, 0x73, 0x33, + 0xC2, 0xBE, 0x32, 0x20, 0xCE, 0x06, 0xA8, 0x14, + 0xC2, 0xCE, 0xA9, 0x5C, 0xC8, 0x65, 0x92, 0xAA, + 0x02, 0x15, 0xBF, 0x29, 0x46, 0x14, 0xA3, 0x28, + 0xCF, 0x07, 0x22, 0x2B, 0x73, 0xF9, 0x3F, 0x24, + 0x2A, 0x94, 0x8B, 0xCA, 0xE9, 0x56, 0x5F, 0xC9, + 0x70, 0x57, 0xB5, 0x2E, 0x02, 0x80, 0xEB, 0x82 + }, + { + 0x81, 0x34, 0xCE, 0x66, 0xD9, 0x5C, 0x40, 0x88, + 0xA5, 0x66, 0xD4, 0xE4, 0x35, 0x99, 0x06, 0x9A, + 0xD0, 0x45, 0x53, 0xB0, 0xFE, 0xA3, 0xD7, 0x48, + 0x19, 0xA6, 0xFD, 0x76, 0x6F, 0x43, 0x67, 0x42, + 0xF6, 0xB6, 0xEC, 0xC8, 0x27, 0x93, 0x98, 0x60, + 0x9F, 0x60, 0xB4, 0xE4, 0xBB, 0x44, 0xFD, 0x72, + 0xCD, 0xFB, 0xFF, 0x18, 0xD8, 0x03, 0x8A, 0xA7, + 0x12, 0x30, 0x83, 0x8B, 0x12, 0x6B, 0xC3, 0x00 + }, + { + 0x3D, 0xA8, 0x9F, 0x5C, 0x52, 0xB0, 0x52, 0xE0, + 0x42, 0xE5, 0x11, 0x7B, 0x96, 0x80, 0x6E, 0xDB, + 0x1C, 0x55, 0x22, 0x7E, 0x85, 0x14, 0xB3, 0x9E, + 0x8B, 0x22, 0xBE, 0xA4, 0xC9, 0x53, 0x30, 0x80, + 0xA4, 0xD7, 0xA9, 0x24, 0x92, 0xB7, 0x51, 0x76, + 0x9B, 0x0E, 0x11, 0x9E, 0xF4, 0xDB, 0x2B, 0xB8, + 0x8D, 0x5C, 0x1E, 0x75, 0xB4, 0x03, 0x10, 0x74, + 0xD7, 0xF2, 0x1A, 0x78, 0x01, 0x4A, 0x1F, 0x96 + }, + { + 0x9B, 0xDC, 0xB4, 0x69, 0xC2, 0x66, 0x5D, 0xD8, + 0x46, 0x83, 0xE5, 0x81, 0x01, 0xFD, 0xAE, 0x5C, + 0x88, 0x29, 0x2A, 0x4E, 0x05, 0xC4, 0x00, 0xCA, + 0x08, 0x26, 0xDA, 0x79, 0x38, 0x2B, 0x8A, 0x28, + 0x26, 0xFF, 0x24, 0xFC, 0xD5, 0x56, 0xC9, 0xD5, + 0xB5, 0xAA, 0x89, 0x2F, 0x02, 0xB1, 0x67, 0x04, + 0x77, 0x27, 0x9B, 0xD7, 0x5F, 0x1B, 0x2B, 0x7B, + 0x67, 0x5E, 0xFA, 0xC3, 0x80, 0x60, 0x70, 0x36 + }, + { + 0x6C, 0x77, 0x85, 0x7B, 0x38, 0x53, 0x3E, 0x41, + 0x4A, 0xF7, 0x38, 0x7C, 0x98, 0x56, 0x8D, 0x71, + 0xC8, 0xF0, 0xE3, 0x5E, 0x22, 0xB0, 0x2E, 0x2A, + 0x1C, 0x0D, 0xC6, 0xD5, 0x7E, 0x37, 0xD8, 0x68, + 0x72, 0x5A, 0xD8, 0x23, 0x58, 0x6A, 0x0B, 0xEE, + 0xF3, 0x98, 0x89, 0xCC, 0x31, 0xF1, 0xF7, 0xFA, + 0xD0, 0x96, 0x0A, 0x12, 0x5E, 0x29, 0xDF, 0xEA, + 0x74, 0x55, 0x12, 0xD1, 0x79, 0xE5, 0xF5, 0x89 + }, + { + 0x88, 0xC9, 0x83, 0x3A, 0x6D, 0x44, 0xFC, 0x25, + 0xBB, 0x64, 0xF3, 0xE9, 0x8E, 0x83, 0x8F, 0xB4, + 0xFF, 0x56, 0x48, 0x96, 0xDC, 0xD3, 0x58, 0x3A, + 0x8B, 0x57, 0xC9, 0x46, 0x6E, 0x74, 0x0C, 0x62, + 0x8B, 0x2D, 0x26, 0xEA, 0x14, 0x7C, 0xB3, 0x11, + 0x10, 0xFB, 0xAD, 0xCF, 0x9D, 0x01, 0x08, 0xAC, + 0xCE, 0xBE, 0x04, 0x31, 0x7D, 0x19, 0xFC, 0x03, + 0x66, 0xDE, 0x0C, 0x28, 0xA1, 0xA4, 0x5E, 0x2A + }, + { + 0x0A, 0xAB, 0xB3, 0xA1, 0x78, 0x46, 0x4A, 0x01, + 0x47, 0x64, 0x5F, 0x05, 0x71, 0x2A, 0x0A, 0x15, + 0x55, 0xC5, 0xB9, 0xA3, 0xE9, 0x99, 0xAB, 0x25, + 0x5A, 0xCA, 0x35, 0xC5, 0x03, 0x81, 0xF4, 0x90, + 0x55, 0x1A, 0x40, 0x89, 0x31, 0xAA, 0x6B, 0xE9, + 0xA4, 0xEF, 0x49, 0x7A, 0x16, 0x5B, 0x36, 0x66, + 0x3B, 0x1E, 0x1F, 0x05, 0x13, 0x48, 0x02, 0xB1, + 0x78, 0xB7, 0xC7, 0x04, 0x68, 0xCB, 0x98, 0xE8 + }, + { + 0x58, 0x50, 0xD8, 0x93, 0x70, 0x6B, 0x3B, 0xC2, + 0xDB, 0xBA, 0x9C, 0xFA, 0xB0, 0x28, 0xBE, 0xD8, + 0x19, 0xA2, 0x83, 0x11, 0xD2, 0xD6, 0xF0, 0xCD, + 0x8E, 0x27, 0x2E, 0xE6, 0x77, 0xBC, 0x87, 0x8A, + 0x0C, 0xED, 0x6C, 0x0D, 0xEA, 0x9E, 0x5C, 0xC9, + 0x4B, 0x2B, 0x4F, 0x59, 0x1A, 0x40, 0xEC, 0x9F, + 0xB1, 0x82, 0x22, 0xD6, 0xDE, 0xAC, 0xE1, 0xF9, + 0xC0, 0x83, 0xDC, 0x05, 0xDE, 0x11, 0x7A, 0x53 + }, + { + 0xBE, 0xE6, 0x96, 0xA4, 0x76, 0x4F, 0x94, 0x25, + 0xD9, 0x1B, 0x14, 0x17, 0x38, 0x62, 0x5A, 0x04, + 0x47, 0xA8, 0x22, 0xBB, 0xA7, 0xA8, 0x47, 0x78, + 0xCC, 0x3A, 0x77, 0xA3, 0x86, 0xCB, 0x18, 0x24, + 0x87, 0xDB, 0x51, 0x3B, 0xB8, 0xF3, 0x6F, 0xC2, + 0xF7, 0xE6, 0xD2, 0x89, 0x6E, 0x44, 0x56, 0xA5, + 0x23, 0x46, 0xC4, 0x94, 0x8E, 0x3E, 0xC6, 0x34, + 0xCB, 0xF1, 0x8F, 0x39, 0xC4, 0x46, 0xCB, 0xAB + }, + { + 0x3D, 0x9F, 0x75, 0xD3, 0xE5, 0x0D, 0x9B, 0xA3, + 0xBC, 0xAC, 0x4A, 0x4E, 0x11, 0x6B, 0x9B, 0x30, + 0x8D, 0xC6, 0x45, 0x99, 0xA3, 0x86, 0x4A, 0x9D, + 0xAF, 0xD7, 0x5C, 0xB7, 0x1F, 0x2D, 0xE3, 0x10, + 0x9F, 0x79, 0x56, 0xA7, 0xD2, 0xDD, 0x37, 0x4F, + 0x84, 0x06, 0xD7, 0x7F, 0x79, 0x63, 0x11, 0xE3, + 0xD3, 0x00, 0x89, 0xE5, 0x4D, 0xD6, 0xCE, 0x8A, + 0xBB, 0x02, 0xA8, 0x5A, 0x85, 0xAE, 0x92, 0xE4 + }, + { + 0xEF, 0x39, 0x51, 0x47, 0x5A, 0x16, 0xDF, 0x64, + 0x98, 0x32, 0x24, 0x04, 0x65, 0x30, 0xDC, 0x7C, + 0xB0, 0x53, 0xD2, 0x93, 0x94, 0x75, 0x39, 0x11, + 0xC4, 0x94, 0x99, 0x50, 0xF2, 0x3E, 0x8A, 0x92, + 0xC7, 0x09, 0xF4, 0x63, 0x69, 0xB2, 0x3A, 0x0D, + 0x70, 0x3A, 0x6F, 0x36, 0x49, 0x0F, 0x75, 0xBE, + 0x1E, 0x3E, 0x81, 0x29, 0xA8, 0x29, 0xF3, 0xDC, + 0xD7, 0x2D, 0x0E, 0x55, 0x49, 0x7B, 0x81, 0x33 + }, + { + 0xD4, 0x19, 0x7D, 0x2A, 0x68, 0x5B, 0xCA, 0x6B, + 0xFB, 0xDD, 0x0E, 0x3D, 0x84, 0xC7, 0x48, 0x01, + 0x35, 0x48, 0xBC, 0x84, 0x9F, 0xE6, 0x49, 0xDA, + 0xE7, 0xC4, 0xA2, 0x77, 0xFC, 0xBD, 0x8F, 0x81, + 0x8A, 0x9E, 0xDF, 0xA6, 0xCA, 0x14, 0xD7, 0xFE, + 0xEA, 0x72, 0x6B, 0x23, 0xB4, 0xA3, 0x3A, 0xA8, + 0xA3, 0xF5, 0xA6, 0x61, 0x67, 0x21, 0x5C, 0x61, + 0x48, 0xC0, 0x6B, 0x94, 0xCD, 0x8B, 0xFE, 0x37 + }, + { + 0x7A, 0x24, 0x40, 0x33, 0x35, 0xB8, 0x64, 0x10, + 0xD8, 0xD6, 0x93, 0xF1, 0x63, 0xD6, 0x19, 0x8A, + 0x68, 0x0F, 0x7E, 0x3A, 0xC0, 0x25, 0xEC, 0x44, + 0x74, 0x24, 0x9B, 0x01, 0x16, 0x77, 0xFE, 0x1C, + 0x86, 0x6A, 0xAF, 0x45, 0x3D, 0xB0, 0xE8, 0xF6, + 0x54, 0x33, 0x51, 0x50, 0x86, 0x3A, 0xCE, 0x57, + 0x66, 0x50, 0x80, 0x31, 0x91, 0x27, 0x8E, 0x9D, + 0x4B, 0x54, 0x7A, 0x43, 0x4C, 0x56, 0x54, 0xE2 + }, + { + 0xAF, 0x07, 0xC6, 0x7D, 0x58, 0x74, 0x3A, 0xEB, + 0x18, 0x50, 0xEB, 0x53, 0xB2, 0xDA, 0x78, 0xEC, + 0xF7, 0x09, 0x58, 0x18, 0x32, 0x5B, 0xEB, 0x86, + 0x6F, 0xF3, 0x13, 0xE3, 0x94, 0xC0, 0x07, 0xE0, + 0xC0, 0xB5, 0xA1, 0xCD, 0x7A, 0xE6, 0xBB, 0x37, + 0xCD, 0x27, 0x81, 0xB5, 0x2D, 0x15, 0x4D, 0x18, + 0x86, 0x5D, 0x5E, 0x37, 0xDB, 0xAA, 0x5F, 0x96, + 0x73, 0x9B, 0xF7, 0x69, 0x59, 0x96, 0xAE, 0x30 + }, + { + 0x28, 0xB3, 0xC2, 0x60, 0xFA, 0x7F, 0x23, 0xB9, + 0xCC, 0xAD, 0xD6, 0x15, 0xA1, 0x14, 0x69, 0x49, + 0x8A, 0xDB, 0x18, 0xD7, 0xA9, 0xF6, 0x84, 0xFD, + 0xE4, 0x35, 0xC0, 0x65, 0x33, 0xF5, 0xF5, 0x08, + 0xB2, 0x9B, 0x5E, 0xCD, 0x0E, 0xCD, 0x57, 0x36, + 0x9F, 0x22, 0xF1, 0xC5, 0x4E, 0x61, 0xBE, 0x6C, + 0xD1, 0x04, 0xC8, 0xF7, 0xD3, 0xE1, 0x84, 0x7A, + 0xAD, 0x67, 0x07, 0x3A, 0x47, 0x86, 0xE1, 0xDB + }, + { + 0xD6, 0x43, 0x23, 0x33, 0x25, 0x23, 0x9E, 0x2E, + 0xBD, 0x41, 0x1F, 0x0E, 0x00, 0x23, 0x30, 0x56, + 0x2E, 0xB1, 0xBB, 0x08, 0xE6, 0x88, 0x24, 0xB7, + 0x1B, 0x98, 0x19, 0x9C, 0x76, 0xD5, 0x31, 0x58, + 0xD9, 0x1D, 0xDD, 0x6F, 0x4F, 0x82, 0x61, 0xEC, + 0x1D, 0x72, 0xFC, 0x77, 0xC2, 0xCC, 0x23, 0x7E, + 0xDA, 0x15, 0xF0, 0x25, 0x7C, 0xF0, 0x7B, 0x84, + 0xCF, 0x1F, 0xBD, 0x1D, 0xBA, 0xFA, 0x1D, 0xFC + }, + { + 0x3D, 0x7B, 0x44, 0xCC, 0x82, 0xEF, 0xCA, 0xFC, + 0xAB, 0xA6, 0xB1, 0x91, 0x05, 0x48, 0x95, 0x8C, + 0x18, 0x0A, 0x0E, 0x8D, 0x84, 0xBC, 0x66, 0x3E, + 0x8E, 0xF9, 0x53, 0x3B, 0xD8, 0x0C, 0x4B, 0xBA, + 0xAA, 0x25, 0x5B, 0x19, 0x81, 0xF7, 0x56, 0xEB, + 0x10, 0x79, 0xAD, 0x0F, 0x34, 0x71, 0xA1, 0xFC, + 0x9D, 0x7A, 0x43, 0x23, 0x39, 0x30, 0x3A, 0x57, + 0x81, 0xA3, 0x45, 0x35, 0x30, 0x9E, 0x5A, 0x24 + }, + { + 0xEB, 0x08, 0x12, 0xC9, 0x67, 0x06, 0x46, 0xD5, + 0x63, 0x19, 0x8B, 0x11, 0x7A, 0xAF, 0xC5, 0x6F, + 0xA1, 0xB6, 0x56, 0x0F, 0x88, 0xB5, 0x75, 0x4E, + 0xBF, 0xC3, 0x1B, 0x35, 0x52, 0x16, 0xD8, 0xD7, + 0x4D, 0x34, 0x1E, 0x35, 0xB2, 0x43, 0xBC, 0x93, + 0x8C, 0xF5, 0x46, 0xAF, 0x1F, 0x73, 0xC1, 0xB0, + 0x04, 0x55, 0xDC, 0x06, 0xB2, 0xC6, 0xC5, 0x35, + 0x27, 0x9E, 0x87, 0x67, 0x49, 0x8F, 0x14, 0xE6 + }, + { + 0x7B, 0xBA, 0x7D, 0x73, 0x04, 0x02, 0x1C, 0x75, + 0xB5, 0xD6, 0xCE, 0x66, 0xB4, 0xEF, 0xA5, 0x50, + 0x19, 0xD9, 0x42, 0xD2, 0x08, 0xAF, 0xAC, 0x82, + 0x11, 0xAA, 0x7E, 0x5E, 0x11, 0x1E, 0x27, 0x69, + 0x76, 0x70, 0xE4, 0xEC, 0x91, 0xBA, 0x30, 0x8E, + 0xBD, 0xFB, 0x19, 0x15, 0x4C, 0x3B, 0xAD, 0x05, + 0x26, 0xA6, 0x25, 0x41, 0xAE, 0x5D, 0x43, 0xD0, + 0xF5, 0x47, 0xB9, 0xD9, 0x8E, 0x07, 0x36, 0x60 + }, + { + 0xA8, 0xE2, 0xA9, 0x46, 0x8D, 0xA3, 0xE3, 0x54, + 0x3A, 0x23, 0xA5, 0x78, 0x78, 0x0E, 0x25, 0x62, + 0xC7, 0xCE, 0x57, 0xFD, 0x11, 0x20, 0xE1, 0xC0, + 0x24, 0xD7, 0xEA, 0x32, 0x90, 0x31, 0x70, 0x46, + 0x61, 0x6E, 0x14, 0xCD, 0x0F, 0x15, 0xA8, 0x6B, + 0x99, 0x39, 0x54, 0x9B, 0x14, 0x76, 0x11, 0xB6, + 0xA5, 0x5D, 0x85, 0xAB, 0xC2, 0x5F, 0x63, 0x95, + 0x46, 0xB8, 0x9D, 0xD2, 0x3D, 0x39, 0xA9, 0x85 + }, + { + 0xCE, 0x87, 0x4C, 0xD6, 0xE1, 0x95, 0x8B, 0x9D, + 0x7F, 0x11, 0xFF, 0x44, 0xAB, 0x08, 0x32, 0xE8, + 0x48, 0x70, 0x2C, 0x8F, 0x26, 0x65, 0x6B, 0xA1, + 0x0B, 0xF5, 0x72, 0x0A, 0x7C, 0xAA, 0x1F, 0x59, + 0x08, 0xC9, 0x9A, 0x96, 0x03, 0xA9, 0x8B, 0x41, + 0x6C, 0x57, 0x22, 0x8C, 0x81, 0x9C, 0xEA, 0xF8, + 0x27, 0x01, 0x3B, 0x2E, 0x6D, 0x6B, 0x2D, 0xAE, + 0x59, 0xDF, 0xF1, 0x04, 0xB9, 0x02, 0xC3, 0x1B + }, + { + 0x30, 0xFF, 0xFE, 0x37, 0x21, 0x8D, 0xB1, 0x94, + 0xB2, 0x32, 0x73, 0x49, 0x8F, 0x45, 0x44, 0xD3, + 0x84, 0x14, 0xBE, 0xE4, 0x1B, 0x17, 0x55, 0xA0, + 0xC6, 0xC2, 0xDB, 0xCB, 0x41, 0x19, 0x42, 0xD5, + 0xEC, 0xB9, 0xD4, 0x52, 0x3F, 0xB4, 0x79, 0x4B, + 0xA3, 0x6E, 0x57, 0x9A, 0xF2, 0xF8, 0xDD, 0x85, + 0x19, 0x99, 0x23, 0x31, 0x83, 0xFA, 0xB2, 0x7B, + 0x47, 0xAD, 0xD8, 0x7D, 0xF3, 0x59, 0x14, 0xBB + }, + { + 0xCE, 0xF4, 0x43, 0x1D, 0xCE, 0x9F, 0xF5, 0x5A, + 0x00, 0x30, 0x0E, 0xC8, 0x64, 0x9E, 0x27, 0x58, + 0x36, 0x18, 0x22, 0x43, 0x69, 0xF6, 0x0A, 0x5C, + 0x89, 0x6B, 0x2A, 0x31, 0x10, 0xB0, 0x32, 0xB8, + 0x7C, 0x9E, 0xE4, 0xF2, 0x6C, 0x5F, 0x0B, 0xDB, + 0x50, 0x3E, 0xA7, 0x44, 0x7A, 0x5D, 0xB3, 0xF7, + 0x07, 0xFE, 0x34, 0x10, 0xDA, 0xCD, 0xD7, 0x57, + 0x22, 0x19, 0xBD, 0xEA, 0x8E, 0x17, 0xDC, 0x04 + }, + { + 0x8F, 0xF0, 0xBC, 0xB7, 0x5F, 0x00, 0x61, 0xB5, + 0xF9, 0x09, 0x29, 0x8F, 0x56, 0x9E, 0x45, 0xC7, + 0x5E, 0xD2, 0xD6, 0x4A, 0x81, 0x89, 0xCE, 0xBD, + 0x4E, 0x02, 0x56, 0x6E, 0x1A, 0x1B, 0x8B, 0xE5, + 0x3A, 0x78, 0x32, 0x28, 0x55, 0x8E, 0x28, 0xB5, + 0xF8, 0x7C, 0xCC, 0x2F, 0x42, 0x8F, 0x7F, 0x87, + 0x97, 0x44, 0xB5, 0x25, 0xB2, 0x49, 0x62, 0xB3, + 0x60, 0x4B, 0x12, 0x0F, 0x06, 0x77, 0x9F, 0x2E + }, + { + 0x7F, 0x8D, 0xDF, 0xFB, 0x4D, 0xC1, 0x51, 0x91, + 0xDE, 0x3D, 0xDB, 0xE4, 0xA0, 0xF8, 0x8B, 0x7A, + 0xB0, 0x2D, 0x48, 0xE2, 0x5C, 0xFC, 0x1F, 0xE9, + 0x1D, 0xA5, 0x57, 0xE8, 0x85, 0xD0, 0x12, 0xB8, + 0xF6, 0x55, 0x26, 0xC5, 0xB7, 0xB1, 0x01, 0x3F, + 0xC8, 0x16, 0x58, 0x50, 0x43, 0xA3, 0x45, 0x60, + 0x5A, 0x39, 0xD8, 0xDA, 0xD7, 0x0D, 0x8A, 0x64, + 0x48, 0x51, 0x32, 0x50, 0xAA, 0xC4, 0xF3, 0xD5 + }, + { + 0xB1, 0xFE, 0x8C, 0x68, 0xAE, 0xF6, 0xB4, 0xD4, + 0xB2, 0x33, 0x54, 0xEB, 0x8C, 0x1D, 0x8F, 0x5A, + 0x56, 0xE3, 0x2E, 0x76, 0xB9, 0x6A, 0xC8, 0x44, + 0x3B, 0x2A, 0xB8, 0x35, 0xE4, 0xC8, 0xB6, 0x74, + 0xB3, 0x3E, 0x4C, 0x6C, 0x6D, 0xC1, 0x21, 0xD7, + 0xC2, 0xD3, 0x4B, 0x59, 0xB3, 0x7A, 0x56, 0x8A, + 0x1C, 0x98, 0xD5, 0x00, 0x32, 0x4E, 0x53, 0x08, + 0x87, 0x85, 0xB6, 0xB0, 0x80, 0x63, 0x47, 0xD1 + }, + { + 0x8E, 0x87, 0x34, 0xFC, 0xF9, 0x25, 0x9E, 0xE3, + 0x7F, 0xE9, 0xC6, 0xCD, 0xA2, 0x82, 0xC2, 0xD5, + 0xEB, 0x83, 0xD0, 0xCF, 0x43, 0x9C, 0x86, 0x19, + 0xD4, 0xB0, 0x42, 0xFF, 0x69, 0x96, 0x6B, 0x03, + 0x56, 0x5B, 0xE4, 0xDF, 0x96, 0x39, 0x3F, 0xE6, + 0xBF, 0x35, 0xAF, 0xA1, 0x6E, 0x02, 0x73, 0xB6, + 0xD3, 0x39, 0xC0, 0x09, 0x95, 0xBF, 0x6F, 0x60, + 0xA7, 0x14, 0xEF, 0x18, 0x0E, 0xBB, 0x93, 0x15 + }, + { + 0xAE, 0x15, 0x6D, 0x43, 0xA7, 0x2C, 0x04, 0x29, + 0x42, 0x59, 0x58, 0x78, 0xA7, 0x83, 0x07, 0x97, + 0x60, 0xF5, 0x21, 0xED, 0xB8, 0xB2, 0xC3, 0xD4, + 0x1A, 0x56, 0x6B, 0x7C, 0xF7, 0x4A, 0x4A, 0x08, + 0xEA, 0x0F, 0x11, 0x9D, 0x24, 0x0A, 0x62, 0xEC, + 0x73, 0xB9, 0x50, 0x97, 0x88, 0xFA, 0x3A, 0xED, + 0xF1, 0x20, 0xEE, 0x88, 0xCB, 0x95, 0x1B, 0x69, + 0x3F, 0x8F, 0x7C, 0xAF, 0x8C, 0xBA, 0x37, 0x7F + }, + { + 0x93, 0x30, 0xAA, 0xCA, 0x8C, 0x08, 0x84, 0x46, + 0x58, 0xC2, 0x95, 0x06, 0xB1, 0xC3, 0x42, 0x72, + 0xE2, 0xB3, 0xC7, 0xB4, 0xE7, 0x5E, 0x6F, 0xE9, + 0x9A, 0x01, 0x07, 0xEC, 0x5D, 0xA4, 0x53, 0x0F, + 0xB1, 0xC8, 0x8C, 0xAA, 0x66, 0xDD, 0x9C, 0x47, + 0x1E, 0x01, 0xCA, 0x21, 0xA1, 0x3A, 0x5D, 0x6F, + 0x82, 0x15, 0xDE, 0xD3, 0x14, 0x7E, 0x94, 0xDE, + 0x20, 0x88, 0x57, 0x1F, 0xD1, 0xBF, 0x23, 0xB6 + }, + { + 0xC1, 0x29, 0xF2, 0x2C, 0x50, 0xF5, 0x99, 0x72, + 0x32, 0xE2, 0xB9, 0xF9, 0x3D, 0xFA, 0xA0, 0x0A, + 0xD8, 0xA5, 0x34, 0x29, 0xF9, 0xD1, 0x5B, 0x98, + 0x42, 0xE3, 0xAE, 0x08, 0xD8, 0x49, 0xEB, 0xDD, + 0x45, 0x23, 0x8C, 0x85, 0xF9, 0x2C, 0x6F, 0x91, + 0x7E, 0x0F, 0x8F, 0x6F, 0x94, 0xE2, 0x34, 0xBE, + 0x07, 0x61, 0x68, 0xE0, 0xDF, 0x43, 0xD0, 0x28, + 0x45, 0x52, 0x79, 0xA6, 0xFF, 0x65, 0xDC, 0x84 + }, + { + 0x0E, 0x2B, 0x4B, 0xC2, 0xF6, 0xA7, 0x5B, 0xE4, + 0xB7, 0xC9, 0xD4, 0xB5, 0x3D, 0x10, 0x4D, 0xA0, + 0x65, 0x85, 0x8D, 0x38, 0x7B, 0x34, 0x0B, 0xC1, + 0x63, 0x4F, 0x3A, 0x83, 0x32, 0xD5, 0x4C, 0xAA, + 0x94, 0x30, 0x24, 0xB2, 0x13, 0xDC, 0x8D, 0x4F, + 0x21, 0x9E, 0xC8, 0xE1, 0xDE, 0xCA, 0xC7, 0xD5, + 0xC6, 0xAE, 0x69, 0xC9, 0xEF, 0xD8, 0x81, 0x49, + 0x36, 0x78, 0x38, 0x20, 0x5D, 0x0D, 0xC7, 0xC0 + }, + { + 0x83, 0xB5, 0x43, 0x85, 0x3B, 0x81, 0x42, 0xA8, + 0x3B, 0xEF, 0xF0, 0x73, 0x5F, 0x20, 0x18, 0x91, + 0xE7, 0xFF, 0xC6, 0x7D, 0xBD, 0xCD, 0x21, 0xA4, + 0x22, 0xBB, 0x33, 0x6D, 0xE3, 0x29, 0x72, 0xAE, + 0x03, 0x92, 0x64, 0x6F, 0x68, 0x27, 0xD8, 0x0C, + 0xDA, 0x65, 0x4F, 0xD3, 0xA0, 0x77, 0x4C, 0xD2, + 0xF9, 0x95, 0x51, 0x7C, 0xF0, 0x64, 0xC6, 0x17, + 0xF2, 0x1A, 0x54, 0x27, 0x5F, 0xE5, 0x0C, 0x8D + }, + { + 0x09, 0xBE, 0x15, 0xEB, 0x6A, 0x5C, 0x22, 0x6F, + 0x6D, 0x95, 0x08, 0xCB, 0xA4, 0xA2, 0x51, 0x9F, + 0xBA, 0x17, 0x2A, 0xF8, 0x37, 0x58, 0x27, 0xD7, + 0x54, 0xA7, 0xA1, 0xBC, 0x19, 0x25, 0xD1, 0x3F, + 0x5E, 0x63, 0x43, 0xF3, 0xE1, 0x4D, 0x08, 0xA0, + 0x6E, 0x8D, 0x37, 0xF8, 0xEC, 0x56, 0xFB, 0x43, + 0x8E, 0x62, 0x36, 0x66, 0xB6, 0xFB, 0x0E, 0x23, + 0xFB, 0x50, 0x47, 0x7D, 0x41, 0x1B, 0x0C, 0x3A + }, + { + 0xC3, 0x57, 0x97, 0xE9, 0x83, 0x2D, 0x3E, 0x23, + 0x23, 0x33, 0x5B, 0x8C, 0x19, 0xC5, 0xFA, 0x74, + 0x91, 0x60, 0x2D, 0xBF, 0x6B, 0xEA, 0x77, 0xFA, + 0xEE, 0xC9, 0x51, 0x0B, 0xC2, 0xE8, 0x91, 0xC8, + 0xC3, 0x46, 0x21, 0x99, 0xF6, 0x04, 0x18, 0xD2, + 0xE0, 0xAB, 0xFF, 0xE3, 0x1B, 0x61, 0x3B, 0xB9, + 0x80, 0xEA, 0x32, 0xB7, 0x6C, 0x82, 0x43, 0x8D, + 0x02, 0x5F, 0x67, 0x8C, 0xAF, 0x48, 0x24, 0xA4 + }, + { + 0xCF, 0xC0, 0x57, 0xFD, 0xA7, 0x8A, 0x50, 0x31, + 0x8F, 0x49, 0x78, 0xFF, 0xFF, 0xAF, 0x77, 0x17, + 0x98, 0xE1, 0x2C, 0x3E, 0xA8, 0xC7, 0x98, 0x19, + 0x5B, 0xC5, 0xB4, 0xE6, 0x89, 0x1E, 0x61, 0xAA, + 0x25, 0xF7, 0xAF, 0x4A, 0xA7, 0x28, 0x6A, 0xC8, + 0x50, 0x76, 0x62, 0xC9, 0x07, 0xED, 0x91, 0x3E, + 0xDA, 0x65, 0x8F, 0x63, 0xFC, 0x47, 0x99, 0x7C, + 0x59, 0xB8, 0x59, 0x70, 0xF8, 0x78, 0xCA, 0x18 + }, + { + 0xD8, 0xEB, 0xE0, 0xE6, 0x38, 0xFC, 0x53, 0x5B, + 0x52, 0xCB, 0x0A, 0xFC, 0xE0, 0xF8, 0x2D, 0xDE, + 0x28, 0x57, 0x01, 0xAF, 0xF3, 0x29, 0xA5, 0x4B, + 0xA0, 0x6D, 0xFD, 0x3D, 0x1B, 0x4B, 0x31, 0xF9, + 0xF4, 0xB2, 0x4D, 0x9D, 0x68, 0x36, 0xF1, 0x22, + 0x3D, 0x6D, 0xE6, 0x6B, 0xAE, 0x78, 0x88, 0xFE, + 0xBC, 0x20, 0x40, 0xCF, 0xE9, 0x30, 0xE6, 0x9C, + 0xED, 0x59, 0xDA, 0x6D, 0xA8, 0xA0, 0xA6, 0xA6 + }, + { + 0x16, 0xB8, 0xC5, 0x5C, 0xF2, 0xF1, 0x35, 0xA4, + 0x32, 0x59, 0x0D, 0x2D, 0x4C, 0xFA, 0x38, 0x59, + 0x2F, 0x59, 0x35, 0xF8, 0xE7, 0x1C, 0xE0, 0x8A, + 0x02, 0x06, 0xA0, 0xE5, 0xAB, 0xEA, 0x90, 0xB2, + 0xE1, 0x07, 0xEB, 0x86, 0xB9, 0x18, 0x82, 0x3B, + 0xDD, 0x3B, 0xD2, 0x66, 0x07, 0x22, 0xC8, 0xDB, + 0xFA, 0x66, 0xAB, 0xB9, 0xF8, 0x63, 0x8E, 0x46, + 0x34, 0x02, 0xF6, 0x57, 0xA1, 0x68, 0x64, 0x0A + }, + { + 0x6A, 0x6E, 0x89, 0x38, 0x4F, 0x53, 0x5F, 0x02, + 0x17, 0x6C, 0x48, 0xA9, 0x93, 0xD3, 0x68, 0x7B, + 0x38, 0x9B, 0xFC, 0x03, 0x05, 0x0C, 0x77, 0x70, + 0x86, 0x35, 0x5C, 0x1A, 0x55, 0x59, 0x77, 0x42, + 0xF0, 0xB7, 0x48, 0x34, 0xA7, 0x1D, 0x05, 0x2A, + 0xE8, 0xA8, 0x3D, 0xC3, 0x4A, 0x8F, 0xD7, 0xBA, + 0x5A, 0xA6, 0x9D, 0xBD, 0x61, 0x2A, 0x4C, 0x22, + 0xDF, 0x4F, 0x74, 0xE2, 0x52, 0x8F, 0xB7, 0xA3 + }, + { + 0x1E, 0x40, 0x38, 0xCF, 0xA5, 0x0D, 0x8B, 0x13, + 0xEF, 0x68, 0xBE, 0xC3, 0xB0, 0xFF, 0xD5, 0x62, + 0xA0, 0x7A, 0xD6, 0x34, 0xB5, 0x82, 0x82, 0x57, + 0xDB, 0xA8, 0x73, 0x04, 0xF8, 0x23, 0xA9, 0x00, + 0x49, 0x2A, 0x31, 0x37, 0x19, 0x8B, 0x60, 0x5C, + 0xC7, 0xF7, 0x7C, 0x33, 0xB8, 0xCA, 0x3D, 0x94, + 0x0F, 0xD9, 0xB3, 0x38, 0xCF, 0x6B, 0x7B, 0x36, + 0xE7, 0xD9, 0xD9, 0x27, 0x20, 0x97, 0x93, 0xD0 + }, + { + 0x5B, 0xA6, 0xCD, 0x98, 0x8F, 0xF9, 0xA4, 0x81, + 0x91, 0x42, 0x21, 0x7E, 0xD6, 0x5D, 0x43, 0x7B, + 0x41, 0x3B, 0xA5, 0x02, 0x6B, 0x55, 0x4D, 0x8D, + 0x94, 0xEA, 0x27, 0x02, 0xC0, 0x96, 0xD1, 0x01, + 0x47, 0x75, 0xDB, 0xA2, 0xCA, 0xE9, 0x6F, 0x1E, + 0x2E, 0x72, 0x29, 0xC3, 0x78, 0xF2, 0x0B, 0x03, + 0x89, 0xE1, 0x19, 0x54, 0x7F, 0xDD, 0x35, 0x22, + 0x4A, 0x61, 0x7F, 0xCD, 0xCD, 0x0C, 0xB3, 0xAF + }, + { + 0x2D, 0x20, 0x96, 0x12, 0x30, 0xE2, 0x50, 0xF8, + 0x1D, 0xDC, 0xD2, 0xD2, 0xAB, 0x3E, 0xF0, 0xDA, + 0xCF, 0x96, 0x85, 0x1E, 0xBA, 0xE5, 0x96, 0x34, + 0x47, 0x19, 0x2C, 0xDB, 0x89, 0xE4, 0x8E, 0x84, + 0xF3, 0x96, 0xEC, 0x9A, 0x09, 0x25, 0x27, 0x84, + 0xE1, 0x73, 0xAD, 0xA5, 0x2A, 0x9C, 0x81, 0xAC, + 0xDA, 0xB3, 0xD8, 0xD6, 0x83, 0x80, 0x24, 0x7A, + 0xE9, 0x75, 0x23, 0x9B, 0x01, 0x7D, 0xC1, 0xCE + }, + { + 0x35, 0x38, 0x3E, 0xA7, 0x76, 0x2B, 0x55, 0x31, + 0x0A, 0x7D, 0x57, 0xFB, 0xD5, 0xA5, 0x49, 0x97, + 0x57, 0x9B, 0x0B, 0xA3, 0x9A, 0x4E, 0xB8, 0x87, + 0x94, 0x2B, 0xD1, 0x4F, 0xD8, 0x48, 0x31, 0x88, + 0xE5, 0x00, 0x48, 0x83, 0x8D, 0x6C, 0x02, 0xDC, + 0x75, 0x89, 0x59, 0xA9, 0xF7, 0x4D, 0x83, 0x37, + 0x27, 0x43, 0xE8, 0x64, 0xC6, 0x01, 0xED, 0x70, + 0x40, 0xA9, 0xE8, 0x71, 0x52, 0xD4, 0xCF, 0xFB + }, + { + 0x0B, 0x22, 0x3B, 0x6A, 0x1C, 0x2D, 0x3A, 0xB3, + 0xF9, 0x07, 0x7A, 0x31, 0x7B, 0x7F, 0xE3, 0x2F, + 0x6F, 0x95, 0x7B, 0x7B, 0x17, 0x41, 0xF2, 0x71, + 0x77, 0x71, 0x83, 0x4D, 0x37, 0x96, 0xA1, 0x9B, + 0xA3, 0x62, 0x73, 0xC9, 0xEE, 0xD6, 0x4C, 0x07, + 0xFA, 0x4E, 0x9A, 0xF7, 0xA9, 0x8A, 0xCE, 0x9C, + 0x78, 0x9A, 0x79, 0xA5, 0xA0, 0xF9, 0x4D, 0x04, + 0x05, 0xAA, 0xF0, 0x4A, 0xF3, 0x1E, 0xD7, 0x97 + }, + { + 0x5A, 0x00, 0x7F, 0x58, 0x95, 0x52, 0x4A, 0x5E, + 0x80, 0x37, 0x03, 0x6E, 0x0F, 0x26, 0x39, 0xFD, + 0xA8, 0xC5, 0xC1, 0x51, 0x2D, 0x76, 0xE9, 0xD1, + 0x9B, 0x3D, 0xD2, 0xD5, 0xBA, 0x43, 0xF5, 0x07, + 0x97, 0x41, 0xA4, 0x58, 0x31, 0x3C, 0x5E, 0x02, + 0x40, 0x0C, 0xE0, 0x2C, 0xB6, 0x56, 0x80, 0xBE, + 0x28, 0x2E, 0xAC, 0xD9, 0xA2, 0x54, 0xEF, 0x1C, + 0xDD, 0xEE, 0xBD, 0xCE, 0xE8, 0x5D, 0x41, 0x87 + }, + { + 0xBE, 0x4D, 0xD1, 0xCC, 0xBD, 0xE1, 0x67, 0x00, + 0x04, 0xD0, 0xEF, 0xAB, 0x65, 0x43, 0xE9, 0x1C, + 0x4E, 0x46, 0x64, 0xE5, 0xA2, 0xA8, 0x8B, 0xAC, + 0x6D, 0xD2, 0x7D, 0x27, 0x64, 0x8D, 0x30, 0x2A, + 0x06, 0x5B, 0xE6, 0x07, 0x8B, 0x22, 0xE4, 0xC4, + 0xAB, 0x4F, 0x7F, 0x7C, 0xBF, 0xAF, 0xC1, 0xAD, + 0x86, 0xEC, 0x2A, 0x50, 0x4F, 0xE5, 0x85, 0x17, + 0x66, 0xF7, 0xA3, 0x24, 0x47, 0x57, 0xCB, 0x6F + }, + { + 0x0F, 0xB4, 0x48, 0x3F, 0x96, 0x59, 0x29, 0x6C, + 0xB9, 0x24, 0x5B, 0x57, 0x79, 0x2A, 0x1E, 0x6A, + 0x99, 0xF2, 0x87, 0x90, 0x07, 0x72, 0x87, 0x96, + 0x8A, 0xB3, 0xEF, 0x35, 0x89, 0xE6, 0x90, 0x24, + 0x06, 0xF1, 0xF3, 0x9D, 0xCC, 0xE0, 0x06, 0x1D, + 0xEA, 0x94, 0x0F, 0xC8, 0xC1, 0xC4, 0x9F, 0x4B, + 0x54, 0x5E, 0xED, 0x59, 0xE9, 0x6D, 0xDA, 0xE9, + 0x6A, 0x6C, 0x35, 0xB5, 0x59, 0x3C, 0x29, 0x77 + }, + { + 0x41, 0xD1, 0xFA, 0xDC, 0x60, 0xA4, 0x6C, 0x9A, + 0xD0, 0x12, 0x0A, 0x3F, 0x54, 0xD0, 0x05, 0xF5, + 0xA1, 0x07, 0x5E, 0x2F, 0x71, 0xEE, 0x0D, 0xA6, + 0x18, 0xBA, 0xC1, 0x46, 0x1E, 0xFA, 0xE9, 0x69, + 0xEC, 0xCD, 0x7A, 0xA5, 0x75, 0xC4, 0xCD, 0xAE, + 0x97, 0x1D, 0xED, 0x13, 0xAE, 0x13, 0xC5, 0x06, + 0x87, 0x2C, 0xEC, 0xB5, 0xB2, 0x08, 0xFA, 0x72, + 0xA9, 0x48, 0x40, 0x02, 0x3E, 0xDB, 0x3E, 0xFE + }, + { + 0x2F, 0x7F, 0xDC, 0x1D, 0xA4, 0x4B, 0x6E, 0x5D, + 0x2D, 0xEC, 0xDE, 0x82, 0x1A, 0xAF, 0x4B, 0x49, + 0x16, 0x8C, 0x02, 0xE8, 0xD5, 0xF2, 0x5D, 0x5C, + 0x69, 0x98, 0x71, 0x08, 0x3A, 0xEB, 0xD9, 0x28, + 0xB7, 0x4D, 0xC2, 0x2D, 0xCB, 0xED, 0xFA, 0xBA, + 0x93, 0x16, 0xAE, 0xFC, 0xA8, 0x48, 0xD1, 0x5F, + 0x05, 0x17, 0x32, 0x99, 0x03, 0xD3, 0x4B, 0x83, + 0x70, 0xDD, 0xF9, 0xBD, 0x58, 0xC6, 0xD0, 0xCD + }, + { + 0x88, 0x55, 0x8A, 0x46, 0x4E, 0xE1, 0xA8, 0x80, + 0x3B, 0x23, 0x95, 0xAF, 0x6A, 0x64, 0x90, 0x84, + 0x2B, 0x5C, 0xD4, 0x3D, 0x41, 0xF6, 0xC0, 0x7C, + 0xD6, 0xC5, 0xF8, 0x5F, 0x82, 0xF5, 0x84, 0x32, + 0xA0, 0xB1, 0x62, 0xB4, 0x38, 0xBF, 0x0C, 0xB7, + 0x08, 0x2A, 0x76, 0x73, 0xE2, 0x87, 0xD6, 0xB9, + 0x0F, 0x8D, 0x0D, 0xC8, 0xAA, 0x5C, 0xEB, 0xA3, + 0x6B, 0xFA, 0x77, 0xB1, 0x5B, 0xA0, 0x69, 0x16 + }, + { + 0xEC, 0xC1, 0x49, 0x91, 0x7B, 0x26, 0x63, 0x98, + 0xB6, 0xF3, 0x29, 0x7E, 0x96, 0x96, 0x73, 0xB1, + 0x4E, 0xAE, 0x69, 0xCE, 0x43, 0x67, 0x1F, 0xD3, + 0xC6, 0xC2, 0x15, 0xC7, 0xCF, 0x42, 0xDE, 0xA1, + 0x02, 0xFC, 0x6B, 0xD9, 0x0C, 0x87, 0xDB, 0xD4, + 0x29, 0x02, 0x51, 0x12, 0x9C, 0xC1, 0x9B, 0x38, + 0xCC, 0xF0, 0x0C, 0xBD, 0xB1, 0x6D, 0xD8, 0xDE, + 0x51, 0x58, 0x60, 0x1A, 0x41, 0x6B, 0x1F, 0x00 + }, + { + 0xED, 0x30, 0x12, 0xF8, 0x9D, 0x71, 0xED, 0x13, + 0xBB, 0x82, 0x72, 0xEC, 0xDC, 0x3D, 0x0F, 0x51, + 0xE1, 0x4A, 0x37, 0xC1, 0xEF, 0x77, 0x57, 0x77, + 0x7A, 0xDA, 0x67, 0x12, 0x78, 0x4B, 0xE1, 0x6E, + 0xCF, 0xD3, 0xE6, 0x40, 0x58, 0x30, 0xF5, 0x1D, + 0xB3, 0x3D, 0xCB, 0x85, 0x52, 0x92, 0x93, 0xE2, + 0x3E, 0x47, 0x3A, 0xBF, 0x8C, 0x5C, 0x76, 0x55, + 0xD0, 0xC4, 0xF1, 0x52, 0xD0, 0x48, 0xBA, 0xB2 + }, + { + 0x09, 0x7A, 0x81, 0x19, 0x1E, 0x10, 0x05, 0x67, + 0x6D, 0x6E, 0x22, 0xA9, 0x63, 0x48, 0xFA, 0x4A, + 0x7C, 0x95, 0x61, 0xFD, 0x4D, 0x22, 0x8E, 0xB2, + 0x5F, 0x29, 0x47, 0x56, 0xBB, 0x87, 0xA2, 0xBA, + 0x88, 0x47, 0x5B, 0x03, 0x6F, 0x79, 0xFE, 0x37, + 0x3D, 0x75, 0x40, 0x87, 0x05, 0x52, 0x00, 0x1D, + 0x54, 0x79, 0x5F, 0x25, 0x92, 0x39, 0xBE, 0x6D, + 0x32, 0xC4, 0x87, 0xD1, 0x94, 0x4F, 0x1F, 0xE7 + }, + { + 0x3F, 0xC7, 0x98, 0xE4, 0x69, 0xD3, 0x90, 0x86, + 0xBA, 0x0B, 0xB4, 0x06, 0x3E, 0x80, 0x5F, 0xDF, + 0xB2, 0x20, 0x8D, 0xE4, 0x99, 0x18, 0x41, 0x73, + 0xF9, 0xA2, 0x36, 0x4D, 0x56, 0xBC, 0xD5, 0x63, + 0xED, 0x61, 0x9B, 0xB6, 0x87, 0x32, 0x24, 0x25, + 0x01, 0x4A, 0x1A, 0xAD, 0x3B, 0xCF, 0x50, 0xD2, + 0x2D, 0x83, 0xA9, 0x9D, 0x09, 0x73, 0x0A, 0x92, + 0xEC, 0x65, 0x46, 0xB3, 0xFC, 0x40, 0xA2, 0xC6 + }, + { + 0x69, 0x12, 0xB4, 0xB3, 0x41, 0xC7, 0xDD, 0x70, + 0x68, 0x37, 0x38, 0xBA, 0x0E, 0x7D, 0xEB, 0xBA, + 0xBF, 0xCA, 0x5F, 0x4F, 0xB0, 0x76, 0x0C, 0x84, + 0x97, 0x76, 0xE9, 0x20, 0x75, 0x0B, 0xF1, 0x37, + 0x89, 0xA6, 0x99, 0x97, 0x96, 0x23, 0x4E, 0x9E, + 0x24, 0x07, 0x15, 0xB2, 0x67, 0x67, 0x78, 0x2B, + 0x85, 0xA6, 0x4D, 0x68, 0x0C, 0x6D, 0x4C, 0xD4, + 0x26, 0xAD, 0x72, 0xB2, 0xFC, 0xE0, 0x81, 0xE8 + }, + { + 0xCE, 0xCD, 0x14, 0x01, 0x50, 0x15, 0x7D, 0xC9, + 0x06, 0xC0, 0xFF, 0x7F, 0x87, 0xC0, 0x08, 0x8F, + 0x31, 0x64, 0x80, 0x78, 0x3B, 0x4F, 0xE0, 0xA5, + 0x94, 0x45, 0x10, 0xC6, 0x4A, 0x87, 0xE3, 0xED, + 0x06, 0x67, 0x97, 0xA2, 0x7C, 0xE9, 0xD0, 0xF2, + 0x84, 0xDC, 0xA5, 0x18, 0x44, 0x18, 0x08, 0xAC, + 0x18, 0x29, 0x0A, 0xFD, 0xC0, 0x31, 0x29, 0x4B, + 0x31, 0xAA, 0x8B, 0x4A, 0x9F, 0xCD, 0x78, 0xF8 + }, + { + 0x2A, 0x2B, 0xED, 0x5D, 0x6A, 0xC0, 0x89, 0x28, + 0x11, 0xA4, 0x09, 0xD9, 0xF1, 0xFF, 0x63, 0x03, + 0xCC, 0xF9, 0x55, 0x44, 0x57, 0x46, 0x99, 0xCD, + 0xA7, 0xF7, 0x35, 0x03, 0x01, 0xF6, 0xD0, 0xC4, + 0xE8, 0x6E, 0x63, 0x5C, 0x80, 0x87, 0x56, 0x66, + 0xE2, 0xBB, 0x39, 0x07, 0x51, 0x0D, 0x0E, 0x72, + 0x12, 0x0F, 0x04, 0x86, 0x5E, 0xDC, 0x4C, 0x6C, + 0xEE, 0xCB, 0x44, 0x62, 0xD6, 0xAF, 0x60, 0xFB + }, + { + 0x03, 0x85, 0xAE, 0x9B, 0x73, 0x5D, 0xC5, 0x9F, + 0x30, 0x4D, 0x41, 0x4C, 0xA0, 0x43, 0x74, 0x9A, + 0xB5, 0x1A, 0xB6, 0x65, 0xEE, 0x01, 0xBE, 0x5E, + 0x52, 0xDC, 0xF7, 0x25, 0xEE, 0x7D, 0xFE, 0xFE, + 0xA6, 0xAD, 0x73, 0xF3, 0x35, 0xEE, 0xCF, 0x2A, + 0x51, 0x02, 0xE8, 0x88, 0x07, 0xFD, 0xC7, 0x5A, + 0xE6, 0xDC, 0x49, 0x0D, 0x7B, 0x8B, 0x5F, 0x11, + 0x63, 0x03, 0xEF, 0x60, 0xA5, 0xF1, 0x7C, 0x06 + }, + { + 0x0C, 0xA3, 0xFF, 0x03, 0x89, 0x65, 0xC0, 0x3B, + 0xC6, 0x5B, 0xBE, 0x2D, 0x86, 0x6C, 0xE9, 0xE0, + 0xE4, 0xE7, 0xD0, 0x3D, 0xC7, 0xF8, 0x6B, 0xA5, + 0x65, 0x0F, 0x82, 0xDD, 0xB3, 0xA9, 0xAA, 0x84, + 0x6B, 0x2B, 0x1F, 0x55, 0x3B, 0xD8, 0x9F, 0xB4, + 0xF9, 0xB6, 0x2E, 0x3C, 0x7F, 0xAF, 0x9E, 0xC3, + 0x10, 0x9F, 0xA9, 0x0E, 0xE5, 0x6C, 0x24, 0x63, + 0xE6, 0xEF, 0xD1, 0xAB, 0xAD, 0x8E, 0x28, 0xE6 + }, + { + 0x6D, 0xFD, 0x4F, 0x22, 0x18, 0x4E, 0xD0, 0x91, + 0xFD, 0x5A, 0xBA, 0x03, 0x9F, 0xCD, 0x3D, 0xB9, + 0x22, 0xF5, 0xE5, 0x9B, 0xF8, 0x38, 0xC0, 0x37, + 0x35, 0x7F, 0xAD, 0x93, 0x4B, 0x45, 0x10, 0x60, + 0x3F, 0x43, 0xA7, 0x31, 0x9F, 0xFF, 0xA6, 0x23, + 0x86, 0xF8, 0x78, 0x8F, 0xDF, 0x9D, 0xED, 0x40, + 0xC6, 0x66, 0xB4, 0xBD, 0xCA, 0x86, 0xD9, 0x32, + 0x8F, 0xE5, 0x5A, 0xD8, 0x6B, 0x37, 0x2F, 0xC8 + }, + { + 0xA3, 0x18, 0x97, 0x61, 0x02, 0x74, 0x7D, 0x80, + 0x0F, 0x58, 0x4D, 0xF6, 0x5B, 0xFB, 0x44, 0x3B, + 0x85, 0x6F, 0x00, 0x9E, 0x74, 0xF7, 0x29, 0x46, + 0xD0, 0x07, 0x6C, 0xED, 0xAC, 0x04, 0x37, 0x6F, + 0xAB, 0x97, 0x34, 0x53, 0xAD, 0xAD, 0xC3, 0x10, + 0xF7, 0x20, 0x81, 0xCB, 0xBA, 0x96, 0x26, 0x4F, + 0xFE, 0x2B, 0x21, 0xA3, 0xB1, 0x8B, 0xE9, 0xD8, + 0x8C, 0x42, 0x46, 0xCB, 0xA6, 0xD3, 0x09, 0x01 + }, + { + 0xB5, 0xE6, 0xE4, 0xFC, 0xA0, 0xCF, 0x98, 0x48, + 0xA0, 0x05, 0x89, 0xC6, 0x54, 0x57, 0xDB, 0x68, + 0xB3, 0x25, 0x3A, 0x6E, 0x17, 0x78, 0x85, 0x41, + 0x47, 0x2E, 0x1F, 0xB9, 0x48, 0x17, 0xF8, 0x04, + 0x05, 0x4D, 0x07, 0xA5, 0xD3, 0x2D, 0xFA, 0x0C, + 0xDB, 0x6F, 0xB4, 0x4E, 0xED, 0x50, 0xD2, 0x0E, + 0x5F, 0x22, 0x64, 0x36, 0x11, 0x32, 0xFA, 0x5F, + 0xCF, 0xD6, 0xE1, 0xB3, 0x67, 0xC1, 0xBE, 0x28 + }, + { + 0x2E, 0xA4, 0x57, 0x38, 0x29, 0x25, 0xE0, 0x3C, + 0xF8, 0x11, 0x10, 0x05, 0x0E, 0x63, 0x6A, 0xD6, + 0x78, 0xE0, 0xAA, 0x3C, 0xBC, 0x69, 0x00, 0xBD, + 0xEF, 0x27, 0x8A, 0xAA, 0x18, 0xF2, 0x35, 0xE2, + 0x51, 0x60, 0xA2, 0x0E, 0x23, 0xFE, 0x0E, 0x62, + 0xA8, 0x51, 0x1B, 0x5D, 0xD0, 0x59, 0x2F, 0x79, + 0xCB, 0xC8, 0xEB, 0x7D, 0xEA, 0x64, 0xAC, 0x86, + 0x67, 0x49, 0x43, 0x45, 0xC6, 0x89, 0x2D, 0xD4 + }, + { + 0x96, 0xB3, 0x49, 0x8B, 0xCC, 0xD7, 0x8B, 0x5A, + 0x40, 0x1B, 0x27, 0x38, 0x78, 0x7D, 0x28, 0xA9, + 0x8A, 0x0E, 0xDF, 0xDC, 0x7C, 0x0B, 0x5F, 0xF9, + 0x43, 0xCF, 0xE1, 0xB1, 0x4E, 0x9C, 0xF5, 0xD9, + 0xED, 0x43, 0x10, 0x7D, 0xFB, 0xDD, 0x9E, 0x97, + 0x28, 0xD5, 0xFD, 0xD6, 0xF7, 0x1F, 0xBC, 0x77, + 0x0E, 0xAD, 0xDC, 0x4F, 0x2E, 0x40, 0x9A, 0xBE, + 0x71, 0x92, 0x7B, 0xAE, 0x1F, 0x8F, 0x73, 0xD1 + }, + { + 0xCE, 0x1B, 0xFB, 0x9A, 0xFE, 0xD2, 0x8A, 0xF4, + 0xDC, 0x75, 0x35, 0xAD, 0xEF, 0x71, 0xB8, 0xF1, + 0xB8, 0x0A, 0x8D, 0x72, 0x94, 0xB4, 0x11, 0xFD, + 0x1E, 0xD3, 0x93, 0xCF, 0x23, 0x2D, 0x3A, 0x5C, + 0x5D, 0xF2, 0x3D, 0xBB, 0x1D, 0xB2, 0x6D, 0xDD, + 0xF6, 0xF7, 0x45, 0xF8, 0xBC, 0x24, 0xC3, 0x78, + 0x1F, 0x2D, 0xBB, 0xC8, 0x18, 0xA0, 0x0A, 0xE1, + 0xFB, 0x9D, 0x64, 0x63, 0xE9, 0x5F, 0x29, 0x86 + }, + { + 0xE6, 0x4D, 0x37, 0x35, 0x6B, 0x29, 0x6B, 0x36, + 0x93, 0x0E, 0xAB, 0xE4, 0x54, 0xDB, 0x11, 0xB2, + 0x09, 0x7B, 0x0C, 0x04, 0x0B, 0xED, 0x57, 0x98, + 0x87, 0x8D, 0x38, 0xA8, 0xC4, 0xD1, 0xC6, 0xF3, + 0x26, 0x1F, 0x36, 0xBF, 0xF7, 0x64, 0xE3, 0xB4, + 0xD6, 0x06, 0xB3, 0x17, 0xE5, 0xFF, 0x50, 0x04, + 0x18, 0x45, 0x92, 0xB0, 0xB7, 0xDD, 0xFB, 0x8C, + 0x2F, 0xD8, 0x35, 0x23, 0x26, 0xCD, 0xDD, 0xB1 + }, + { + 0x85, 0xE6, 0xFE, 0x54, 0xE1, 0xE7, 0x60, 0x46, + 0xAF, 0x68, 0xF5, 0xC6, 0x04, 0x4C, 0x1E, 0x3F, + 0xFF, 0x3B, 0xFC, 0xA0, 0xBA, 0xEC, 0xAE, 0xF6, + 0xA1, 0xDF, 0x90, 0x35, 0x0D, 0xF2, 0xB0, 0xBE, + 0xC6, 0xA4, 0x20, 0xEE, 0x8F, 0x49, 0xAD, 0x44, + 0x64, 0xEC, 0x4C, 0x1E, 0x7D, 0x71, 0xF6, 0x67, + 0x61, 0x4A, 0xCE, 0xBD, 0xAD, 0xA3, 0xDF, 0x32, + 0x07, 0x79, 0x07, 0x83, 0x23, 0xF6, 0xA8, 0xAF + }, + { + 0xB1, 0x2F, 0xF1, 0xEB, 0x3B, 0xAB, 0x32, 0x0D, + 0x78, 0x55, 0xB5, 0x49, 0xD7, 0x2B, 0x72, 0x47, + 0x59, 0x91, 0x68, 0x11, 0xCB, 0xCF, 0x3E, 0x1A, + 0x12, 0x82, 0x3F, 0x98, 0xB6, 0x4A, 0xB5, 0xC4, + 0x59, 0x41, 0x61, 0x0F, 0x6B, 0x47, 0x1E, 0x35, + 0xFF, 0x79, 0x28, 0x29, 0xDD, 0x5A, 0xDE, 0x51, + 0x79, 0x12, 0x57, 0x38, 0xF3, 0xF2, 0x37, 0x28, + 0x63, 0x0F, 0x1E, 0xEC, 0x57, 0x77, 0x5A, 0x19 + }, + { + 0xB4, 0xDB, 0xE7, 0x2A, 0x1E, 0x21, 0x69, 0x7A, + 0x47, 0x44, 0xBE, 0x65, 0x00, 0x0C, 0xB1, 0xBA, + 0xD3, 0x7C, 0xE2, 0x14, 0x16, 0xEE, 0x6F, 0xCE, + 0xA8, 0x4E, 0xBA, 0xF1, 0x2A, 0x59, 0xC1, 0x1D, + 0x7C, 0x08, 0x0D, 0xF9, 0x2F, 0xB2, 0xAA, 0x8F, + 0x1C, 0x4E, 0xE8, 0xE2, 0xA2, 0x2D, 0x30, 0xBE, + 0x49, 0x85, 0x82, 0xD7, 0xC5, 0xFB, 0xBA, 0x16, + 0x5A, 0x47, 0x26, 0x89, 0xAF, 0xF6, 0x01, 0xB6 + }, + { + 0x34, 0x82, 0x18, 0xBE, 0x4D, 0xE0, 0x8D, 0xFB, + 0x24, 0x5B, 0xF2, 0x52, 0x86, 0xE3, 0x66, 0x18, + 0x63, 0x1D, 0x3B, 0xDB, 0x58, 0x27, 0xD9, 0xF7, + 0x4F, 0xA0, 0x43, 0x01, 0x66, 0x11, 0x31, 0xA4, + 0xD5, 0x5C, 0x76, 0x09, 0xB1, 0xA6, 0xA0, 0x3B, + 0x85, 0x3F, 0x07, 0x33, 0xE0, 0xAE, 0xC0, 0x26, + 0x16, 0xA0, 0xA4, 0x0E, 0x84, 0x91, 0xF4, 0x94, + 0xD7, 0x6C, 0x15, 0x43, 0xCF, 0xC6, 0x82, 0x14 + }, + { + 0x42, 0x87, 0xE1, 0x9B, 0xAB, 0x1D, 0x4F, 0x75, + 0xE1, 0xD1, 0x97, 0xCB, 0xB4, 0x3F, 0x11, 0x33, + 0x13, 0x07, 0xF2, 0xF7, 0x5B, 0x8D, 0x0D, 0x50, + 0x27, 0x8E, 0xEC, 0x54, 0x09, 0x99, 0xA0, 0x09, + 0xC0, 0x33, 0x73, 0x52, 0x96, 0x07, 0xFD, 0xA6, + 0x05, 0xAA, 0x0F, 0x07, 0x39, 0xE2, 0x0B, 0xD1, + 0xFD, 0xAA, 0x27, 0xD7, 0xC0, 0xCD, 0xC8, 0x28, + 0x4D, 0x98, 0xE6, 0xC7, 0x55, 0xA7, 0x56, 0x2E + }, + { + 0x08, 0x56, 0x0C, 0x99, 0x88, 0xC8, 0xCE, 0x5A, + 0x88, 0x76, 0xA6, 0x00, 0xB6, 0xE5, 0x12, 0xB4, + 0xE2, 0x43, 0xA4, 0xA4, 0x30, 0x0A, 0xD5, 0xAB, + 0x2F, 0xF0, 0x63, 0x7C, 0xC5, 0x6A, 0x04, 0x41, + 0x64, 0x5B, 0x3D, 0xEB, 0x16, 0x84, 0x06, 0x4E, + 0xA4, 0x3B, 0xAE, 0x1C, 0xB6, 0x2D, 0x3B, 0xC4, + 0x15, 0x37, 0xFE, 0x8D, 0x7D, 0xEC, 0xA7, 0x17, + 0x29, 0x37, 0x77, 0x6B, 0xBE, 0xD7, 0x93, 0xA9 + }, + { + 0xB5, 0x36, 0x16, 0x23, 0x94, 0x77, 0x6F, 0xA7, + 0xDD, 0x5E, 0x9F, 0xDD, 0x01, 0x53, 0x0F, 0xDA, + 0x52, 0xBE, 0x1D, 0x39, 0xBD, 0x60, 0x9B, 0x3F, + 0x3B, 0xD0, 0x47, 0x6B, 0x81, 0x60, 0xAA, 0x18, + 0xAB, 0x2D, 0x37, 0xD2, 0x99, 0x16, 0x28, 0xBE, + 0x2F, 0xCC, 0x12, 0x56, 0xCD, 0x48, 0x55, 0x25, + 0xD1, 0xFA, 0x35, 0x6B, 0x04, 0xD3, 0x0E, 0x4A, + 0x0F, 0x9F, 0xFF, 0xC9, 0x93, 0x5C, 0xF4, 0x32 + }, + { + 0x02, 0xAB, 0xC9, 0x71, 0x75, 0xED, 0xB4, 0x7A, + 0x4C, 0xB4, 0xBD, 0x38, 0xD8, 0x2F, 0x86, 0xAA, + 0x09, 0x9C, 0x8B, 0x8F, 0xA8, 0xAB, 0x3F, 0xE1, + 0xCE, 0x10, 0x5A, 0x22, 0xBD, 0x61, 0x65, 0x78, + 0xC6, 0xDD, 0x15, 0x15, 0xDF, 0xB0, 0x39, 0x7E, + 0x1D, 0x9D, 0x06, 0x71, 0x91, 0x6D, 0xE4, 0xB5, + 0x22, 0xE7, 0x4E, 0x63, 0x75, 0x23, 0x68, 0x93, + 0xC8, 0xFD, 0xA6, 0xD2, 0x36, 0xBC, 0x8D, 0xA1 + }, + { + 0x21, 0xE1, 0xEB, 0x73, 0x12, 0x76, 0xA8, 0x35, + 0xA6, 0xDD, 0xEA, 0x71, 0x78, 0xB2, 0x3E, 0xBC, + 0x9A, 0xEC, 0xAA, 0xBC, 0x7C, 0xCD, 0x70, 0x65, + 0x87, 0xD7, 0x1B, 0x85, 0x44, 0x97, 0x93, 0xB0, + 0x7E, 0x7B, 0x17, 0x9A, 0x3D, 0xA7, 0xA5, 0x71, + 0x98, 0x29, 0x97, 0xE8, 0xF5, 0xA6, 0x7F, 0x8C, + 0x93, 0xDA, 0xF1, 0x1A, 0xAA, 0x23, 0xF0, 0x7E, + 0x4D, 0xF7, 0xA1, 0x31, 0x05, 0xA5, 0x42, 0x09 + }, + { + 0x1C, 0xC5, 0x37, 0xD3, 0xE5, 0x0E, 0xD9, 0xFD, + 0xCD, 0xC4, 0xF3, 0xCC, 0xB4, 0x81, 0x93, 0x75, + 0x41, 0x53, 0x04, 0xD8, 0xE5, 0xA6, 0xC0, 0x58, + 0x05, 0xB6, 0xB5, 0xD9, 0xE1, 0xFC, 0x18, 0x25, + 0x68, 0x64, 0xF1, 0x0C, 0xD8, 0x12, 0xF8, 0x48, + 0x01, 0xB8, 0x61, 0x6A, 0x92, 0xB4, 0x07, 0x95, + 0xA1, 0x55, 0x93, 0x24, 0x64, 0xF6, 0x2D, 0xBF, + 0x6E, 0xBD, 0x2F, 0x9A, 0xC3, 0xEE, 0x28, 0x16 + }, + { + 0x6F, 0x6C, 0xD2, 0x60, 0x05, 0xC8, 0xA5, 0x61, + 0xCF, 0xF5, 0x1E, 0x30, 0x1D, 0x1A, 0x06, 0x8F, + 0xC2, 0x8B, 0x9B, 0x65, 0x0D, 0xDD, 0x27, 0xAE, + 0x97, 0xB5, 0x22, 0xDA, 0xE9, 0x63, 0x91, 0x34, + 0xD5, 0xA1, 0x50, 0x58, 0x7B, 0x0A, 0x90, 0x1F, + 0x3B, 0x9A, 0xAB, 0xC7, 0xE3, 0x97, 0x84, 0x98, + 0x4C, 0xC5, 0x85, 0x23, 0x5D, 0x8E, 0x17, 0xCE, + 0x9E, 0x3B, 0x42, 0x10, 0x5B, 0xF9, 0x03, 0x4C + }, + { + 0x69, 0xC1, 0x7C, 0x28, 0x64, 0xC3, 0x37, 0x9F, + 0xAF, 0xB7, 0x14, 0xC0, 0x47, 0x5E, 0x00, 0xCF, + 0x7C, 0x9B, 0x37, 0x7D, 0x57, 0xA8, 0xBC, 0x96, + 0x98, 0xB4, 0xD3, 0x4A, 0x54, 0x85, 0x41, 0x76, + 0xA2, 0xF8, 0xD1, 0x5A, 0xFB, 0x54, 0x77, 0x56, + 0x04, 0x78, 0x73, 0x90, 0xD6, 0x00, 0x74, 0xCD, + 0x4B, 0xCA, 0x69, 0x02, 0xEA, 0x23, 0xD3, 0xAE, + 0x1A, 0xC0, 0x83, 0x40, 0x9F, 0xE3, 0x8A, 0x4D + }, + { + 0x86, 0x69, 0xB0, 0xAD, 0x35, 0x82, 0x9E, 0xDC, + 0x2A, 0x8A, 0x09, 0x85, 0x2B, 0x0E, 0xE9, 0xB3, + 0x90, 0x3B, 0xF6, 0xC1, 0xF8, 0x2F, 0x90, 0xA3, + 0xF0, 0xED, 0x95, 0x24, 0x19, 0x2F, 0x10, 0x91, + 0xFD, 0x64, 0x84, 0xE0, 0x4C, 0x3F, 0xEA, 0x8B, + 0x02, 0x2F, 0x4A, 0x89, 0x50, 0xDB, 0x17, 0xD4, + 0x73, 0x41, 0x45, 0xC0, 0xCE, 0xC5, 0xDC, 0x38, + 0x74, 0x55, 0xC1, 0x26, 0x90, 0x3F, 0x77, 0x66 + }, + { + 0x3F, 0x35, 0xC4, 0x5D, 0x24, 0xFC, 0xFB, 0x4A, + 0xCC, 0xA6, 0x51, 0x07, 0x6C, 0x08, 0x00, 0x0E, + 0x27, 0x9E, 0xBB, 0xFF, 0x37, 0xA1, 0x33, 0x3C, + 0xE1, 0x9F, 0xD5, 0x77, 0x20, 0x2D, 0xBD, 0x24, + 0xB5, 0x8C, 0x51, 0x4E, 0x36, 0xDD, 0x9B, 0xA6, + 0x4A, 0xF4, 0xD7, 0x8E, 0xEA, 0x4E, 0x2D, 0xD1, + 0x3B, 0xC1, 0x8D, 0x79, 0x88, 0x87, 0xDD, 0x97, + 0x13, 0x76, 0xBC, 0xAE, 0x00, 0x87, 0xE1, 0x7E + }, +}; + + + + +static const uint8_t blake2bp_keyed_kat[KAT_LENGTH][BLAKE2B_OUTBYTES] = +{ + { + 0x9D, 0x94, 0x61, 0x07, 0x3E, 0x4E, 0xB6, 0x40, + 0xA2, 0x55, 0x35, 0x7B, 0x83, 0x9F, 0x39, 0x4B, + 0x83, 0x8C, 0x6F, 0xF5, 0x7C, 0x9B, 0x68, 0x6A, + 0x3F, 0x76, 0x10, 0x7C, 0x10, 0x66, 0x72, 0x8F, + 0x3C, 0x99, 0x56, 0xBD, 0x78, 0x5C, 0xBC, 0x3B, + 0xF7, 0x9D, 0xC2, 0xAB, 0x57, 0x8C, 0x5A, 0x0C, + 0x06, 0x3B, 0x9D, 0x9C, 0x40, 0x58, 0x48, 0xDE, + 0x1D, 0xBE, 0x82, 0x1C, 0xD0, 0x5C, 0x94, 0x0A + }, + { + 0xFF, 0x8E, 0x90, 0xA3, 0x7B, 0x94, 0x62, 0x39, + 0x32, 0xC5, 0x9F, 0x75, 0x59, 0xF2, 0x60, 0x35, + 0x02, 0x9C, 0x37, 0x67, 0x32, 0xCB, 0x14, 0xD4, + 0x16, 0x02, 0x00, 0x1C, 0xBB, 0x73, 0xAD, 0xB7, + 0x92, 0x93, 0xA2, 0xDB, 0xDA, 0x5F, 0x60, 0x70, + 0x30, 0x25, 0x14, 0x4D, 0x15, 0x8E, 0x27, 0x35, + 0x52, 0x95, 0x96, 0x25, 0x1C, 0x73, 0xC0, 0x34, + 0x5C, 0xA6, 0xFC, 0xCB, 0x1F, 0xB1, 0xE9, 0x7E + }, + { + 0xD6, 0x22, 0x0C, 0xA1, 0x95, 0xA0, 0xF3, 0x56, + 0xA4, 0x79, 0x5E, 0x07, 0x1C, 0xEE, 0x1F, 0x54, + 0x12, 0xEC, 0xD9, 0x5D, 0x8A, 0x5E, 0x01, 0xD7, + 0xC2, 0xB8, 0x67, 0x50, 0xCA, 0x53, 0xD7, 0xF6, + 0x4C, 0x29, 0xCB, 0xB3, 0xD2, 0x89, 0xC6, 0xF4, + 0xEC, 0xC6, 0xC0, 0x1E, 0x3C, 0xA9, 0x33, 0x89, + 0x71, 0x17, 0x03, 0x88, 0xE3, 0xE4, 0x02, 0x28, + 0x47, 0x90, 0x06, 0xD1, 0xBB, 0xEB, 0xAD, 0x51 + }, + { + 0x30, 0x30, 0x2C, 0x3F, 0xC9, 0x99, 0x06, 0x5D, + 0x10, 0xDC, 0x98, 0x2C, 0x8F, 0xEE, 0xF4, 0x1B, + 0xBB, 0x66, 0x42, 0x71, 0x8F, 0x62, 0x4A, 0xF6, + 0xE3, 0xEA, 0xBE, 0xA0, 0x83, 0xE7, 0xFE, 0x78, + 0x53, 0x40, 0xDB, 0x4B, 0x08, 0x97, 0xEF, 0xFF, + 0x39, 0xCE, 0xE1, 0xDC, 0x1E, 0xB7, 0x37, 0xCD, + 0x1E, 0xEA, 0x0F, 0xE7, 0x53, 0x84, 0x98, 0x4E, + 0x7D, 0x8F, 0x44, 0x6F, 0xAA, 0x68, 0x3B, 0x80 + }, + { + 0x32, 0xF3, 0x98, 0xA6, 0x0C, 0x1E, 0x53, 0xF1, + 0xF8, 0x1D, 0x6D, 0x8D, 0xA2, 0xEC, 0x11, 0x75, + 0x42, 0x2D, 0x6B, 0x2C, 0xFA, 0x0C, 0x0E, 0x66, + 0xD8, 0xC4, 0xE7, 0x30, 0xB2, 0x96, 0xA4, 0xB5, + 0x3E, 0x39, 0x2E, 0x39, 0x85, 0x98, 0x22, 0xA1, + 0x45, 0xAE, 0x5F, 0x1A, 0x24, 0xC2, 0x7F, 0x55, + 0x33, 0x9E, 0x2B, 0x4B, 0x44, 0x58, 0xE8, 0xC5, + 0xEB, 0x19, 0xAA, 0x14, 0x20, 0x64, 0x27, 0xAA + }, + { + 0x23, 0x6D, 0xB9, 0x33, 0xF1, 0x8A, 0x9D, 0xBD, + 0x4E, 0x50, 0xB7, 0x29, 0x53, 0x90, 0x65, 0xBD, + 0xA4, 0x20, 0xDF, 0x97, 0xAC, 0x78, 0x0B, 0xE4, + 0x3F, 0x59, 0x10, 0x3C, 0x47, 0x2E, 0x0B, 0xCC, + 0xA6, 0xD4, 0x97, 0x38, 0x97, 0x86, 0xAF, 0x22, + 0xBA, 0x94, 0x30, 0xB7, 0x4D, 0x6F, 0x74, 0xB1, + 0x3F, 0x6F, 0x94, 0x9E, 0x25, 0x6A, 0x14, 0x0A, + 0xA3, 0x4B, 0x47, 0x70, 0x0B, 0x10, 0x03, 0x43 + }, + { + 0x23, 0x8C, 0x9D, 0x08, 0x02, 0x85, 0xE3, 0x54, + 0x35, 0xCB, 0x53, 0x15, 0x5D, 0x9F, 0x79, 0x2C, + 0xA1, 0xBB, 0x27, 0xDE, 0x4F, 0x9B, 0x6C, 0x87, + 0x26, 0xE1, 0x1C, 0x02, 0x8E, 0x7B, 0x87, 0x87, + 0x33, 0x54, 0x91, 0x12, 0xA3, 0x28, 0xB5, 0x0E, + 0x8C, 0xD8, 0xBA, 0x27, 0x87, 0x21, 0x7E, 0x46, + 0xB8, 0x16, 0x8D, 0x57, 0x11, 0x3D, 0xD4, 0x04, + 0xD9, 0x14, 0xE2, 0x9A, 0x6A, 0x54, 0x70, 0xE6 + }, + { + 0x9A, 0x02, 0x1E, 0xBD, 0x50, 0x4A, 0x97, 0x59, + 0x6D, 0x0E, 0x85, 0x04, 0x8A, 0xE1, 0xDA, 0x89, + 0x99, 0xE3, 0xA0, 0x47, 0x01, 0x6F, 0x17, 0xC6, + 0xC5, 0x55, 0x6C, 0x27, 0x31, 0xE9, 0xB1, 0x39, + 0x26, 0x1F, 0x84, 0x3F, 0xAD, 0x6B, 0xD4, 0x3F, + 0x7C, 0x7C, 0x58, 0x7F, 0x69, 0x8D, 0x69, 0xB6, + 0x82, 0xE5, 0x68, 0xB4, 0x42, 0xAC, 0x45, 0x88, + 0x98, 0x57, 0xB7, 0x69, 0x07, 0x34, 0xCD, 0xBB + }, + { + 0x3A, 0xBA, 0x07, 0xAE, 0x98, 0x0E, 0x33, 0x86, + 0x37, 0x47, 0x9D, 0xCA, 0x1E, 0x35, 0x28, 0x00, + 0xF4, 0x58, 0x8E, 0x62, 0xD8, 0x23, 0x36, 0x5A, + 0xA6, 0x9C, 0x5B, 0x25, 0xFC, 0xE1, 0x29, 0x68, + 0xD2, 0x6C, 0x9B, 0xDB, 0xEE, 0x9A, 0x32, 0xBF, + 0xFD, 0x42, 0xE6, 0xB2, 0x2C, 0x81, 0x38, 0xA6, + 0x1C, 0x1F, 0xCE, 0x49, 0xFF, 0xBC, 0x19, 0x0E, + 0x1E, 0x15, 0x16, 0x01, 0x53, 0xCC, 0xB6, 0xB4 + }, + { + 0x77, 0x4C, 0xDF, 0x9A, 0xBB, 0x50, 0x81, 0xFE, + 0x07, 0xEB, 0x57, 0x25, 0xE6, 0x06, 0x9B, 0x8D, + 0x6C, 0x7E, 0x60, 0x04, 0xA2, 0x4D, 0x70, 0xF7, + 0xDF, 0xAB, 0xFC, 0x03, 0x82, 0x5B, 0xBC, 0x3B, + 0x30, 0xE6, 0x20, 0xB6, 0x04, 0x1F, 0x3C, 0xC2, + 0x89, 0x6B, 0x14, 0xAB, 0x66, 0x0A, 0xF7, 0x2E, + 0x24, 0x95, 0x10, 0xAC, 0x2F, 0xE8, 0x10, 0xCC, + 0x77, 0x63, 0xA2, 0xE5, 0xC3, 0xFC, 0xA7, 0xFC + }, + { + 0x9E, 0x08, 0x9F, 0x51, 0x65, 0x7B, 0x29, 0xC2, + 0x66, 0x8E, 0x28, 0x50, 0x52, 0x4E, 0x53, 0xAE, + 0xAA, 0xA7, 0x30, 0x6F, 0x2A, 0xD5, 0xA2, 0x32, + 0xB5, 0xF0, 0x7F, 0x68, 0x8D, 0x8A, 0xB2, 0xB4, + 0x25, 0xDF, 0x7E, 0xA5, 0xBD, 0x3E, 0x9F, 0xFD, + 0x61, 0x68, 0x38, 0x90, 0x15, 0x1D, 0x78, 0xBB, + 0x94, 0x03, 0x11, 0x85, 0xAC, 0xA4, 0x81, 0xE2, + 0x14, 0x0F, 0xE3, 0x79, 0x85, 0x36, 0x76, 0x43 + }, + { + 0xB3, 0x5B, 0xD5, 0x4E, 0x4F, 0x81, 0x69, 0x6B, + 0x4F, 0x22, 0x31, 0x6A, 0x1E, 0x33, 0x7D, 0x98, + 0xD1, 0xC6, 0xB0, 0x61, 0x10, 0x99, 0x87, 0x63, + 0xB5, 0x91, 0x33, 0x35, 0x92, 0x3A, 0x40, 0x76, + 0xCB, 0x80, 0xD6, 0xD8, 0xA5, 0x18, 0x62, 0x91, + 0x13, 0x47, 0x7B, 0x30, 0xA1, 0x32, 0xA6, 0xB2, + 0x7F, 0xC1, 0xEE, 0x79, 0xF6, 0xB2, 0xE0, 0xD3, + 0x5D, 0x5B, 0xC2, 0x97, 0x27, 0x46, 0x3D, 0xB5 + }, + { + 0x12, 0x39, 0x30, 0xD5, 0xA4, 0xB7, 0x3B, 0x49, + 0x1F, 0x50, 0xE5, 0x6E, 0x2B, 0x73, 0x97, 0xA4, + 0x3D, 0x2E, 0x47, 0x87, 0x23, 0x76, 0x02, 0xB6, + 0x6F, 0xE0, 0xA8, 0x47, 0xBD, 0x13, 0xCB, 0xE8, + 0xB3, 0x7D, 0xC7, 0x03, 0xD7, 0xB2, 0xB4, 0xEA, + 0xA8, 0xBF, 0xB9, 0xA5, 0x8A, 0x7D, 0x71, 0x9C, + 0x90, 0x8F, 0x19, 0x66, 0xA2, 0xF1, 0x9F, 0xE6, + 0xEB, 0x1A, 0x78, 0x96, 0x2A, 0xFA, 0x5B, 0xF9 + }, + { + 0x08, 0x9C, 0xBC, 0x7E, 0xE1, 0xB1, 0x2C, 0x0C, + 0xC9, 0xC8, 0x3F, 0xF6, 0x66, 0xFE, 0xC8, 0x02, + 0x6B, 0xB7, 0x1B, 0x90, 0x84, 0x97, 0x9B, 0x0E, + 0xA8, 0xB7, 0x23, 0xBB, 0xBE, 0x8B, 0x00, 0xD4, + 0x10, 0x08, 0xB6, 0x04, 0x99, 0xF2, 0x4F, 0x24, + 0x1B, 0x63, 0x28, 0x1F, 0xE5, 0xB4, 0xD8, 0x89, + 0x66, 0x30, 0x9C, 0x0D, 0x7E, 0x64, 0x66, 0x91, + 0x05, 0xE5, 0x1E, 0x69, 0xD7, 0xAF, 0x8C, 0xE5 + }, + { + 0x6B, 0x3C, 0x67, 0x89, 0x47, 0xF6, 0x12, 0x52, + 0x65, 0x7C, 0x35, 0x49, 0x78, 0xC1, 0x01, 0xB2, + 0xFD, 0xD2, 0x72, 0x9E, 0xC3, 0x49, 0x27, 0xDD, + 0x5E, 0xFF, 0x0A, 0x7C, 0x0A, 0x86, 0x58, 0x26, + 0xE8, 0x33, 0xC3, 0x63, 0x23, 0x21, 0x31, 0xB1, + 0x05, 0x93, 0xBE, 0x1C, 0xCF, 0x6B, 0xA5, 0x4E, + 0xCC, 0x14, 0x31, 0x2F, 0x45, 0xBF, 0xFC, 0x24, + 0x04, 0x62, 0x9F, 0xF8, 0x02, 0x67, 0xF0, 0x94 + }, + { + 0xAA, 0x0C, 0x23, 0xEA, 0x1C, 0x6F, 0xE2, 0xE9, + 0x0A, 0x77, 0x18, 0xEF, 0x4A, 0xA4, 0x75, 0x1F, + 0xF6, 0xBE, 0xB9, 0xD4, 0x61, 0x63, 0x59, 0x5B, + 0x5D, 0x4F, 0xB8, 0x96, 0x00, 0x52, 0x5C, 0x5B, + 0x6C, 0xF1, 0x9E, 0xCD, 0xB2, 0x47, 0x78, 0x72, + 0xA7, 0xA1, 0x2D, 0x40, 0xE5, 0x06, 0x36, 0x08, + 0xE5, 0xF0, 0x00, 0x8E, 0x79, 0x72, 0xA9, 0xC0, + 0x1A, 0x4B, 0xE2, 0xAF, 0xE9, 0x53, 0x2F, 0x9C + }, + { + 0x63, 0x34, 0x7A, 0xB4, 0xCB, 0xB6, 0xF2, 0x89, + 0x52, 0x99, 0x2C, 0x07, 0x9D, 0x18, 0xD4, 0x20, + 0x01, 0xB7, 0xF3, 0xA9, 0xD0, 0xFD, 0x90, 0xB0, + 0xA4, 0x77, 0x1F, 0x69, 0x72, 0xF0, 0xC5, 0x32, + 0x89, 0xC8, 0xAE, 0xE1, 0x43, 0x29, 0x4B, 0x50, + 0xC6, 0x34, 0x12, 0x58, 0x5C, 0xDC, 0xE4, 0xFF, + 0x7B, 0xED, 0x11, 0x2C, 0xD0, 0x3C, 0x9B, 0x1D, + 0xF3, 0xDE, 0xF0, 0xCC, 0x32, 0x0D, 0x6B, 0x70 + }, + { + 0x23, 0x96, 0xC0, 0xCB, 0x9E, 0xDA, 0xAC, 0xA9, + 0xD8, 0xB1, 0x04, 0x65, 0x2C, 0xB7, 0xF1, 0x25, + 0xF1, 0x93, 0x55, 0x1A, 0xE5, 0xD7, 0xBC, 0x94, + 0x63, 0x30, 0x7C, 0x9E, 0x69, 0xCA, 0x7D, 0xA2, + 0x3A, 0x9F, 0xBC, 0xBC, 0xB8, 0x66, 0x69, 0xD5, + 0xBA, 0x63, 0x43, 0x85, 0x93, 0xE1, 0x32, 0xF9, + 0x92, 0xB5, 0x7C, 0x00, 0x17, 0xC8, 0x6D, 0xDB, + 0x9B, 0x47, 0x28, 0x6E, 0xF5, 0xB6, 0x87, 0x18 + }, + { + 0xA9, 0x4B, 0x80, 0x22, 0x57, 0xFD, 0x03, 0x1E, + 0xE6, 0x0F, 0x1B, 0xE1, 0x84, 0x38, 0x3A, 0x76, + 0x32, 0x85, 0x39, 0xF9, 0xD8, 0x06, 0x08, 0x72, + 0xEF, 0x35, 0x73, 0xBE, 0xB6, 0xF2, 0x73, 0x68, + 0x08, 0x95, 0x90, 0xED, 0xBB, 0x21, 0xF4, 0xD8, + 0xF1, 0x81, 0xBA, 0x66, 0x20, 0x75, 0xF9, 0x19, + 0x05, 0x97, 0x4B, 0xEE, 0xEF, 0x1F, 0xC5, 0xCB, + 0x9B, 0xCF, 0xB2, 0x8A, 0xAE, 0x1E, 0x4D, 0xE3 + }, + { + 0x52, 0xC7, 0xD3, 0x39, 0x9A, 0x03, 0x80, 0x04, + 0xBE, 0xA5, 0x2D, 0x3E, 0xA9, 0xE9, 0x1E, 0x25, + 0x44, 0xC8, 0x65, 0x2A, 0xB8, 0xF5, 0x28, 0x5C, + 0x9D, 0x32, 0x18, 0x63, 0x7A, 0x6D, 0x9F, 0xCA, + 0xF0, 0xD9, 0x65, 0xB3, 0x58, 0x8E, 0xE6, 0xD7, + 0x3F, 0xA5, 0x99, 0xDE, 0xCA, 0x1F, 0x41, 0xDE, + 0xD8, 0x02, 0x5B, 0xF7, 0x76, 0x8E, 0x0E, 0x20, + 0x0E, 0x8C, 0xD3, 0xFF, 0x86, 0x8C, 0x38, 0x00 + }, + { + 0xB6, 0x29, 0xF5, 0x71, 0x62, 0x87, 0x6A, 0xDB, + 0x8F, 0xA9, 0x57, 0x2E, 0xBA, 0x4E, 0x1E, 0xCD, + 0x75, 0xA6, 0x56, 0x73, 0x08, 0xDE, 0x90, 0xDB, + 0xB8, 0xFF, 0xDE, 0x77, 0xDE, 0x82, 0x13, 0xA4, + 0xD7, 0xF7, 0xCB, 0x85, 0xAE, 0x1B, 0x71, 0xE6, + 0x45, 0x7B, 0xC4, 0xE8, 0x9C, 0x0D, 0x9D, 0xE2, + 0x41, 0xB6, 0xB9, 0xF3, 0x74, 0xB7, 0x34, 0x19, + 0x4D, 0xB2, 0xB2, 0x67, 0x02, 0xD7, 0xCB, 0x7C + }, + { + 0x72, 0x28, 0x46, 0xDD, 0xAC, 0xAA, 0x94, 0xFD, + 0xE6, 0x63, 0x2A, 0x2D, 0xC7, 0xDC, 0x70, 0x8B, + 0xDF, 0x98, 0x31, 0x1C, 0x9F, 0xB6, 0x3C, 0x61, + 0xE5, 0x25, 0xFD, 0x4B, 0x0D, 0x87, 0xB6, 0x38, + 0x8B, 0x5A, 0xF7, 0x04, 0x20, 0x18, 0xDD, 0xCA, + 0x06, 0x5E, 0x8A, 0x55, 0xBB, 0xFD, 0x68, 0xEE, + 0x61, 0xFC, 0xD3, 0xC6, 0x87, 0x8F, 0x5B, 0x09, + 0xBC, 0xC2, 0x7B, 0xED, 0x61, 0xDD, 0x93, 0xED + }, + { + 0x1C, 0xED, 0x6A, 0x0C, 0x78, 0x9D, 0xDB, 0x29, + 0x56, 0x78, 0xAD, 0x43, 0xA3, 0x22, 0xD8, 0x96, + 0x61, 0x7F, 0xDE, 0x27, 0x5F, 0x13, 0x8C, 0xCC, + 0xFB, 0x13, 0x26, 0xCD, 0x3F, 0x76, 0x09, 0xC2, + 0xAA, 0xA5, 0xEC, 0x10, 0x26, 0x97, 0x17, 0x3E, + 0x12, 0x1A, 0xE1, 0x63, 0x02, 0x4F, 0x42, 0x8C, + 0x98, 0x28, 0x35, 0xB4, 0xFA, 0x6D, 0xA6, 0xD6, + 0x78, 0xAE, 0xB9, 0xEE, 0x10, 0x6A, 0x3F, 0x6C + }, + { + 0xE8, 0x69, 0x14, 0x8C, 0x05, 0x45, 0xB3, 0x58, + 0x0E, 0x39, 0x5A, 0xFD, 0xC7, 0x45, 0xCD, 0x24, + 0x3B, 0x6B, 0x5F, 0xE3, 0xB6, 0x7E, 0x29, 0x43, + 0xF6, 0xF8, 0xD9, 0xF2, 0x4F, 0xFA, 0x40, 0xE8, + 0x81, 0x75, 0x6E, 0x1C, 0x18, 0xD9, 0x2F, 0x3E, + 0xBE, 0x84, 0x55, 0x9B, 0x57, 0xE2, 0xEE, 0x3A, + 0x65, 0xD9, 0xEC, 0xE0, 0x49, 0x72, 0xB3, 0x5D, + 0x4C, 0x4E, 0xBE, 0x78, 0x6C, 0x88, 0xDA, 0x62 + }, + { + 0xDA, 0xDA, 0x15, 0x5E, 0x55, 0x42, 0x32, 0xB1, + 0x6E, 0xCA, 0xD9, 0x31, 0xCB, 0x42, 0xE3, 0x25, + 0xB5, 0x86, 0xDB, 0xF1, 0xCB, 0xD0, 0xCE, 0x38, + 0x14, 0x45, 0x16, 0x6B, 0xD1, 0xBF, 0xA3, 0x32, + 0x49, 0x85, 0xE7, 0x7C, 0x6F, 0x0D, 0x51, 0x2A, + 0x02, 0x6E, 0x09, 0xD4, 0x86, 0x1C, 0x3B, 0xB8, + 0x52, 0x9D, 0x72, 0x02, 0xEA, 0xC1, 0xC0, 0x44, + 0x27, 0x44, 0xD3, 0x7C, 0x7F, 0x5A, 0xB8, 0xAF + }, + { + 0x2D, 0x14, 0x8C, 0x8E, 0x8F, 0x76, 0xFA, 0xAC, + 0x6F, 0x7F, 0x01, 0xF2, 0x03, 0x9E, 0xA0, 0x2A, + 0x42, 0xD9, 0x32, 0x57, 0x94, 0xC2, 0xC7, 0xA0, + 0x0F, 0x83, 0xF4, 0xA7, 0x79, 0x8A, 0xFB, 0xA9, + 0x93, 0xFF, 0x94, 0x91, 0x1E, 0x09, 0x8B, 0x00, + 0x1A, 0x0B, 0xDF, 0xF4, 0xC8, 0x5A, 0x2A, 0x61, + 0x31, 0xE0, 0xCF, 0xE7, 0x0F, 0x1D, 0x2E, 0x07, + 0xAF, 0x02, 0x09, 0xDA, 0x77, 0x96, 0x09, 0x1F + }, + { + 0x99, 0x98, 0x3A, 0x75, 0x9C, 0xCF, 0x9C, 0xAC, + 0xAE, 0x70, 0x2D, 0xCB, 0xFC, 0xDF, 0x72, 0x04, + 0xDD, 0xF0, 0x33, 0x4B, 0xC6, 0x5D, 0xAD, 0x84, + 0x6F, 0x83, 0x1F, 0x9F, 0x9D, 0x8A, 0x45, 0x3F, + 0x0D, 0x24, 0x93, 0x5C, 0x4C, 0x65, 0x7F, 0xFF, + 0x2E, 0xBB, 0xDB, 0xAF, 0x7B, 0xCE, 0x6A, 0xAC, + 0xDB, 0xB8, 0x87, 0x6F, 0x16, 0x04, 0x59, 0xB1, + 0xA4, 0xAA, 0xC9, 0x56, 0x97, 0xE0, 0x0D, 0x98 + }, + { + 0x7E, 0x4A, 0x02, 0x12, 0x6D, 0x75, 0x52, 0xF4, + 0xC9, 0xB9, 0x4D, 0x80, 0xE3, 0xCF, 0x7B, 0x89, + 0x7E, 0x09, 0x84, 0xE4, 0x06, 0xF0, 0x78, 0x13, + 0x5C, 0xF4, 0x56, 0xC0, 0xD5, 0x1E, 0x13, 0x91, + 0xFF, 0x18, 0xA8, 0x8F, 0x93, 0x12, 0x2C, 0x83, + 0x2C, 0xAC, 0x7D, 0x79, 0x6A, 0x6B, 0x42, 0x51, + 0x9B, 0x1D, 0xB4, 0xEA, 0xD8, 0xF4, 0x98, 0x40, + 0xCE, 0xB5, 0x52, 0x33, 0x6B, 0x29, 0xDE, 0x44 + }, + { + 0xD7, 0xE1, 0x6F, 0xD1, 0x59, 0x65, 0x8A, 0xD7, + 0xEE, 0x25, 0x1E, 0x51, 0x7D, 0xCE, 0x5A, 0x29, + 0xF4, 0x6F, 0xD4, 0xB8, 0xD3, 0x19, 0xDB, 0x80, + 0x5F, 0xC2, 0x5A, 0xA6, 0x20, 0x35, 0x0F, 0xF4, + 0x23, 0xAD, 0x8D, 0x05, 0x37, 0xCD, 0x20, 0x69, + 0x43, 0x2E, 0xBF, 0xF2, 0x92, 0x36, 0xF8, 0xC2, + 0xA8, 0xA0, 0x4D, 0x04, 0xB3, 0xB4, 0x8C, 0x59, + 0xA3, 0x55, 0xFC, 0xC6, 0x2D, 0x27, 0xF8, 0xEE + }, + { + 0x0D, 0x45, 0x17, 0xD4, 0xF1, 0xD0, 0x47, 0x30, + 0xC6, 0x91, 0x69, 0x18, 0xA0, 0x4C, 0x9E, 0x90, + 0xCC, 0xA3, 0xAC, 0x1C, 0x63, 0xD6, 0x45, 0x97, + 0x8A, 0x7F, 0x07, 0x03, 0x9F, 0x92, 0x20, 0x64, + 0x7C, 0x25, 0xC0, 0x4E, 0x85, 0xF6, 0xE2, 0x28, + 0x6D, 0x2E, 0x35, 0x46, 0x0D, 0x0B, 0x2C, 0x1E, + 0x25, 0xAF, 0x9D, 0x35, 0x37, 0xEF, 0x33, 0xFD, + 0x7F, 0xE5, 0x1E, 0x2B, 0xA8, 0x76, 0x4B, 0x36 + }, + { + 0x56, 0xB7, 0x2E, 0x51, 0x37, 0xC6, 0x89, 0xB2, + 0x73, 0x66, 0xFB, 0x22, 0xC7, 0xC6, 0x75, 0x44, + 0xF6, 0xBC, 0xE5, 0x76, 0x19, 0x41, 0x31, 0xC5, + 0xBF, 0xAB, 0x1C, 0xF9, 0x3C, 0x2B, 0x51, 0xAA, + 0xA3, 0x03, 0x36, 0x8A, 0xA8, 0x44, 0xD5, 0x8D, + 0xF0, 0xEE, 0x5D, 0x4E, 0x31, 0x9F, 0xCD, 0x8E, + 0xFF, 0xC6, 0x02, 0xCE, 0xE4, 0x35, 0x1B, 0xD2, + 0xF5, 0x51, 0x43, 0x0B, 0x92, 0x11, 0xE7, 0x3C + }, + { + 0xF3, 0x35, 0xCC, 0x22, 0xFF, 0xEA, 0x5A, 0xA5, + 0x9C, 0xDF, 0xC8, 0xF5, 0x02, 0x89, 0xCC, 0x92, + 0x31, 0x9B, 0x8B, 0x14, 0x40, 0x8D, 0x7A, 0x5A, + 0xA1, 0x23, 0x2A, 0xE2, 0x3A, 0xA1, 0xEA, 0x7F, + 0x77, 0x48, 0xCF, 0xEF, 0x03, 0x20, 0x10, 0xF8, + 0x62, 0x6D, 0x93, 0x18, 0xED, 0xBA, 0x98, 0xD4, + 0x16, 0x62, 0x03, 0x35, 0xC9, 0x01, 0xED, 0x02, + 0xEA, 0xBD, 0x27, 0x6A, 0x1B, 0x82, 0x9C, 0x9D + }, + { + 0xA9, 0x9A, 0x3D, 0x10, 0xF9, 0x5B, 0x44, 0x2F, + 0xFF, 0xF7, 0xC4, 0x18, 0xFA, 0x94, 0x9D, 0x48, + 0x30, 0x86, 0x9B, 0x0E, 0x60, 0xEC, 0x8B, 0x97, + 0x2C, 0x30, 0xA3, 0x16, 0x9C, 0x27, 0xBE, 0xB5, + 0xCF, 0x33, 0x05, 0x94, 0xF0, 0x14, 0xB6, 0x6B, + 0x22, 0x00, 0xA7, 0xF0, 0x86, 0xD2, 0xC2, 0xF3, + 0xF9, 0xFD, 0x85, 0x32, 0xA5, 0x71, 0x88, 0x76, + 0xDF, 0xCA, 0x66, 0x1B, 0xA0, 0xF7, 0xB3, 0x6D + }, + { + 0x15, 0x8E, 0x25, 0x70, 0xD0, 0x84, 0xA4, 0x86, + 0x9D, 0x96, 0x93, 0x43, 0xC0, 0x10, 0x86, 0x07, + 0x17, 0xFF, 0x74, 0x11, 0x61, 0x88, 0x17, 0x5F, + 0x2E, 0xD7, 0x4C, 0xD5, 0x78, 0xFA, 0x0D, 0x80, + 0x91, 0xB0, 0x3F, 0xAD, 0x0C, 0x65, 0xCF, 0x59, + 0xAB, 0x91, 0xDD, 0x73, 0xB3, 0x7F, 0xE3, 0xF5, + 0x8A, 0x58, 0xE7, 0xB4, 0x47, 0x9C, 0x87, 0x5A, + 0xCD, 0x63, 0xEC, 0x52, 0x58, 0x12, 0x35, 0x3F + }, + { + 0x7C, 0x49, 0x50, 0x1C, 0x58, 0x08, 0xB1, 0x5C, + 0x0D, 0x31, 0xBD, 0xD5, 0xBB, 0x56, 0x31, 0xD5, + 0x3A, 0xE0, 0x0D, 0xF4, 0x31, 0x02, 0x5F, 0xEA, + 0x51, 0xEB, 0x47, 0x62, 0x54, 0x4E, 0xFD, 0xEE, + 0x97, 0x8A, 0x83, 0x50, 0x8D, 0xEA, 0x6B, 0xFD, + 0x3B, 0x93, 0x1A, 0x0E, 0x95, 0x83, 0xCC, 0xFC, + 0x04, 0x9E, 0xA8, 0x46, 0x44, 0x70, 0x5D, 0x31, + 0x9F, 0xDC, 0x5C, 0x16, 0x3B, 0xF4, 0x82, 0x24 + }, + { + 0xFE, 0xF4, 0x36, 0xB3, 0x5F, 0x71, 0x7D, 0x59, + 0xAC, 0xA1, 0x7E, 0x9B, 0xF5, 0xFF, 0xDA, 0x28, + 0xF5, 0xF4, 0x01, 0x94, 0x3E, 0xFE, 0x93, 0xEB, + 0x58, 0x0F, 0xFB, 0x98, 0xF1, 0x3B, 0xEA, 0x80, + 0x94, 0x69, 0xA3, 0x44, 0xE7, 0x82, 0xA4, 0x43, + 0xC6, 0x4E, 0xB2, 0x5A, 0xD0, 0x9D, 0x8D, 0xE2, + 0x05, 0xFE, 0xE7, 0xD5, 0x63, 0x96, 0x86, 0xA1, + 0x9E, 0x7C, 0x42, 0xB4, 0x0F, 0x70, 0x6A, 0x08 + }, + { + 0x4D, 0x47, 0xA6, 0x7A, 0x5F, 0x8E, 0x17, 0xB7, + 0x22, 0xDF, 0x98, 0x58, 0xAE, 0xB6, 0x7B, 0x99, + 0x56, 0xB4, 0x59, 0x62, 0xEC, 0x35, 0x3D, 0xC2, + 0xE2, 0x7F, 0x0F, 0x50, 0x1C, 0x39, 0x8E, 0x34, + 0x39, 0x7B, 0xEB, 0xE0, 0x2B, 0x54, 0x92, 0x7E, + 0x2D, 0x31, 0xF1, 0x2E, 0xCF, 0x55, 0xE8, 0x82, + 0x69, 0xFA, 0xB5, 0x37, 0x0E, 0x7F, 0xA5, 0x70, + 0x35, 0x26, 0x6F, 0x89, 0xD5, 0xC2, 0x64, 0x41 + }, + { + 0x1B, 0x58, 0xDC, 0x7A, 0xAC, 0x36, 0x3B, 0x00, + 0x44, 0x6E, 0xA8, 0x03, 0xBC, 0xD7, 0x49, 0xC3, + 0xF5, 0xCA, 0xBE, 0xAA, 0xF2, 0x23, 0x99, 0x4C, + 0x0C, 0x3E, 0xCC, 0x1B, 0x28, 0x47, 0x73, 0x44, + 0xD7, 0xBF, 0x97, 0xC0, 0x8A, 0x95, 0x9D, 0x1A, + 0xC2, 0x06, 0x0B, 0x47, 0x27, 0x89, 0x86, 0x92, + 0x91, 0x88, 0xAD, 0x73, 0xDE, 0x67, 0x07, 0x8B, + 0xA6, 0x80, 0x96, 0x3B, 0x9D, 0x3B, 0x12, 0xA4 + }, + { + 0x3C, 0x52, 0x2C, 0x84, 0x3E, 0x69, 0x74, 0xEC, + 0x75, 0x0D, 0xF2, 0x20, 0xD4, 0x1A, 0x00, 0x4A, + 0xC2, 0xAD, 0xF0, 0x94, 0x56, 0xFA, 0x78, 0x7F, + 0x7C, 0x65, 0x43, 0xAB, 0x17, 0x97, 0x9C, 0x77, + 0x7B, 0x3E, 0x79, 0xD1, 0x78, 0x7D, 0xA5, 0xA8, + 0x3F, 0x17, 0x8D, 0xA9, 0xF0, 0x4C, 0xF6, 0xF5, + 0xB2, 0x55, 0xDD, 0xCB, 0x18, 0x74, 0x84, 0x1B, + 0xBF, 0x70, 0x16, 0xE6, 0x13, 0x2B, 0x99, 0x8A + }, + { + 0x5A, 0x4F, 0xEB, 0x8F, 0x70, 0x75, 0xB4, 0xDC, + 0x9C, 0xA1, 0x6C, 0x6F, 0x05, 0xCD, 0x6B, 0x70, + 0x27, 0x48, 0x5F, 0xFE, 0xD9, 0x15, 0x7D, 0x82, + 0x4D, 0x9D, 0x1A, 0x17, 0x20, 0xEE, 0xEE, 0xEA, + 0x3F, 0x6C, 0x12, 0x5F, 0xDA, 0x4B, 0xA4, 0x40, + 0x9D, 0x79, 0x80, 0x49, 0xFD, 0x18, 0x82, 0xC6, + 0x90, 0x28, 0x8F, 0x33, 0x54, 0x7A, 0x3D, 0x8D, + 0x62, 0x60, 0xB6, 0x54, 0x54, 0x88, 0x53, 0xD7 + }, + { + 0xBC, 0xAA, 0x79, 0x36, 0x32, 0x56, 0x9E, 0x2F, + 0x84, 0x17, 0xCC, 0x60, 0x32, 0x53, 0x53, 0x5B, + 0xD7, 0xD8, 0x5F, 0x38, 0x53, 0x19, 0x92, 0x59, + 0x1E, 0x56, 0xC1, 0xA4, 0xB6, 0xF5, 0x8E, 0xE7, + 0xF8, 0x18, 0xFA, 0xE0, 0x27, 0x88, 0x8A, 0x86, + 0x28, 0x43, 0x05, 0x10, 0x1E, 0xC0, 0x46, 0x61, + 0xF5, 0x99, 0x53, 0x47, 0xA4, 0x67, 0xED, 0x8B, + 0x92, 0x79, 0xF1, 0xAC, 0xC2, 0xB4, 0xBB, 0x1F + }, + { + 0x34, 0xAF, 0x91, 0xCC, 0x22, 0xA6, 0x9B, 0xCB, + 0x55, 0xDD, 0xBF, 0x7F, 0x0F, 0x43, 0xEC, 0x56, + 0x48, 0x40, 0x43, 0x32, 0x13, 0xEA, 0x55, 0xD9, + 0xF8, 0x1A, 0xC4, 0x75, 0x20, 0x8D, 0x74, 0x85, + 0x1D, 0xB7, 0x0F, 0xE4, 0x96, 0xAF, 0x9D, 0xA1, + 0xD3, 0x93, 0xEC, 0xF8, 0x78, 0x69, 0x5D, 0xD3, + 0x3F, 0xD5, 0x43, 0x49, 0xA6, 0xF8, 0x24, 0xAE, + 0xED, 0x18, 0x3C, 0xB1, 0xB0, 0x8C, 0x54, 0x85 + }, + { + 0xB8, 0xB7, 0xAD, 0x2E, 0xA2, 0xB6, 0xFA, 0x06, + 0xD0, 0x0B, 0xCD, 0x59, 0x9C, 0x99, 0x71, 0xC5, + 0xB4, 0xE1, 0x65, 0x58, 0xE1, 0x52, 0x12, 0xC9, + 0xBF, 0xD3, 0x73, 0xE4, 0xBC, 0x79, 0x17, 0x05, + 0x26, 0x01, 0xFF, 0xDB, 0x68, 0x01, 0xBE, 0x80, + 0xBA, 0x50, 0x9D, 0xB8, 0x2A, 0x0B, 0x71, 0x95, + 0x92, 0x91, 0x33, 0xAD, 0x53, 0x99, 0x56, 0x06, + 0x52, 0x33, 0xF4, 0x9D, 0x07, 0x1C, 0x84, 0xE4 + }, + { + 0xDC, 0xEE, 0x9C, 0x45, 0xBC, 0x5D, 0x1F, 0xE6, + 0x30, 0xB1, 0x8B, 0x06, 0x3C, 0xE8, 0x2C, 0x38, + 0x57, 0xE3, 0x0D, 0x20, 0xC6, 0x4B, 0x5C, 0xC2, + 0x58, 0x84, 0x94, 0x3E, 0x7A, 0xE9, 0x4E, 0xDF, + 0xF8, 0x50, 0xEB, 0x0E, 0x82, 0x44, 0x02, 0x3D, + 0x3D, 0x07, 0xA8, 0xA0, 0x07, 0x06, 0xF0, 0x58, + 0x2C, 0xC1, 0x02, 0xB6, 0x6C, 0x6D, 0xDA, 0x86, + 0xE8, 0xF2, 0xDF, 0x32, 0x56, 0x59, 0x88, 0x6F + }, + { + 0x04, 0xF6, 0xE8, 0x22, 0xF1, 0x7C, 0xC7, 0xA5, + 0x94, 0x6D, 0xF8, 0x0D, 0x95, 0x8A, 0xEF, 0x06, + 0x5D, 0x87, 0x49, 0x16, 0xE1, 0x03, 0xA6, 0x83, + 0x0C, 0x6E, 0x46, 0xB6, 0x05, 0x59, 0x18, 0x18, + 0x0D, 0x14, 0x52, 0x29, 0x3C, 0x58, 0xA9, 0x74, + 0x9C, 0xBC, 0x8F, 0x0A, 0xC4, 0x08, 0xA9, 0xCA, + 0x89, 0x57, 0x61, 0xCF, 0xC4, 0x51, 0x16, 0x46, + 0x41, 0xA1, 0x79, 0xFB, 0x5C, 0xD8, 0xFE, 0xBC + }, + { + 0x51, 0x1F, 0xDB, 0x7C, 0x88, 0x26, 0x85, 0x35, + 0xE9, 0x7E, 0x4E, 0xD8, 0x92, 0xF3, 0xC0, 0x65, + 0x83, 0x2B, 0x26, 0x59, 0x14, 0xFC, 0x61, 0x07, + 0xA1, 0xD2, 0x7D, 0xBB, 0x7D, 0x51, 0xC3, 0x7E, + 0x95, 0x98, 0x15, 0x06, 0xC1, 0x14, 0x72, 0x44, + 0xD5, 0xBA, 0xE9, 0x0E, 0xE9, 0x0D, 0x08, 0x49, + 0x84, 0xBA, 0xA7, 0x58, 0x7F, 0x41, 0xFF, 0x6F, + 0x4B, 0xA7, 0x22, 0xC8, 0xB9, 0x2A, 0xEB, 0x99 + }, + { + 0x2B, 0xA2, 0xBD, 0x17, 0xE9, 0x26, 0x27, 0x5B, + 0x06, 0x83, 0xB2, 0x36, 0xBF, 0xE3, 0x76, 0x30, + 0x26, 0x6E, 0x37, 0xF4, 0x18, 0x2F, 0x53, 0xA9, + 0x82, 0x34, 0xE9, 0x15, 0xAB, 0x64, 0xC9, 0x59, + 0x96, 0xC6, 0xCB, 0x7A, 0xE8, 0x80, 0xC3, 0xDF, + 0xCB, 0x47, 0xD0, 0x5A, 0xAD, 0xD2, 0x1A, 0xBF, + 0x8E, 0x40, 0xB7, 0x3F, 0x40, 0xF3, 0x98, 0xDC, + 0x5B, 0x02, 0x14, 0x14, 0x57, 0x45, 0x6A, 0x09 + }, + { + 0x9B, 0x66, 0x8D, 0x9B, 0x44, 0x47, 0xE3, 0x76, + 0xF6, 0xC6, 0xCF, 0xA6, 0x8D, 0xBC, 0x79, 0x19, + 0x83, 0x81, 0xAB, 0x60, 0x5F, 0x55, 0xD5, 0xA7, + 0xEF, 0x68, 0x3B, 0xCE, 0xD4, 0x6F, 0x9A, 0xFD, + 0x36, 0x85, 0x41, 0x1A, 0x66, 0xE2, 0x34, 0x6F, + 0x96, 0x07, 0x77, 0xD0, 0xC9, 0x22, 0x71, 0x24, + 0x30, 0xE0, 0x18, 0xBF, 0xAE, 0x86, 0x53, 0x01, + 0x7E, 0xA2, 0x0E, 0xCD, 0x5F, 0x1F, 0x95, 0x6C + }, + { + 0x56, 0x81, 0x02, 0x4F, 0x53, 0x85, 0x88, 0xA0, + 0x1B, 0x2C, 0x83, 0x94, 0xCA, 0xE8, 0x73, 0xC6, + 0xD8, 0x5D, 0x6A, 0xA0, 0x6E, 0xDD, 0xB3, 0xA5, + 0x02, 0x09, 0x6F, 0xC0, 0x82, 0xBB, 0x89, 0xCB, + 0x24, 0x15, 0x31, 0xB3, 0x15, 0x75, 0x0D, 0x31, + 0xBB, 0x0B, 0x63, 0x01, 0x28, 0xD1, 0x9D, 0x11, + 0x39, 0x2B, 0xCF, 0x4B, 0x34, 0x78, 0xD5, 0x23, + 0xD7, 0xD2, 0x13, 0xE4, 0x75, 0x0F, 0x55, 0x92 + }, + { + 0x2A, 0xA9, 0x1B, 0xA6, 0xDE, 0x60, 0x17, 0xF1, + 0x93, 0x0F, 0xC7, 0xD9, 0x6D, 0xCC, 0xD6, 0x70, + 0x74, 0x8B, 0x7E, 0xB1, 0xD0, 0x94, 0xDF, 0xB4, + 0xB3, 0xB1, 0x47, 0x8A, 0x61, 0x2E, 0xBF, 0x03, + 0xDD, 0xD7, 0x21, 0x27, 0x9A, 0x26, 0x6D, 0xE3, + 0x88, 0x45, 0xE6, 0x12, 0xC9, 0x30, 0x98, 0xC2, + 0xEF, 0xFF, 0x34, 0xFE, 0x50, 0x06, 0x17, 0x20, + 0x5B, 0x1D, 0xE2, 0xFE, 0xA1, 0xD8, 0x02, 0x46 + }, + { + 0x82, 0x4D, 0x89, 0xC0, 0x63, 0x7C, 0xE1, 0x78, + 0xB6, 0x30, 0x68, 0x4C, 0x72, 0x9E, 0x26, 0x65, + 0x3F, 0x34, 0xEA, 0xC7, 0xE9, 0x04, 0x12, 0xE9, + 0x63, 0xD3, 0xF1, 0x9D, 0x64, 0x51, 0xE8, 0x25, + 0x85, 0x21, 0x67, 0xC4, 0x8D, 0xF7, 0xCC, 0x55, + 0xB2, 0x57, 0xB2, 0x50, 0xA7, 0x0C, 0x7B, 0xCC, + 0xFA, 0x9A, 0xA1, 0x5C, 0x18, 0x8A, 0xC4, 0x63, + 0x7A, 0x52, 0x22, 0x89, 0xC0, 0x87, 0x6A, 0xD4 + }, + { + 0x87, 0xE4, 0xAE, 0x11, 0xDA, 0x1A, 0x2C, 0xA8, + 0x82, 0x2A, 0xE3, 0x30, 0xDC, 0x97, 0xAB, 0x2E, + 0x47, 0xFF, 0x62, 0x32, 0x30, 0x93, 0xC2, 0xB7, + 0xA6, 0xC0, 0xE2, 0xC1, 0x68, 0x21, 0xCD, 0x7C, + 0xEC, 0x92, 0x18, 0x4D, 0xF4, 0xBB, 0x6E, 0x2B, + 0x62, 0x6A, 0x44, 0x78, 0x03, 0x90, 0x63, 0xAF, + 0xEE, 0xB0, 0xD2, 0x87, 0xF2, 0x42, 0x19, 0x20, + 0x78, 0x98, 0xCC, 0xE7, 0xAD, 0xE0, 0x63, 0x9C + }, + { + 0xDD, 0x7F, 0x2F, 0x44, 0xA4, 0x02, 0xA0, 0x1E, + 0x82, 0x16, 0xB1, 0x03, 0xA4, 0xE7, 0x23, 0x5C, + 0x28, 0x30, 0x31, 0x9D, 0x56, 0xAF, 0x63, 0x9F, + 0x23, 0xC4, 0x8C, 0x27, 0x59, 0xAB, 0xA6, 0xEB, + 0x5E, 0xEE, 0xE3, 0x8C, 0x29, 0x8E, 0xBE, 0x41, + 0x98, 0x26, 0x7A, 0x00, 0xEB, 0x2A, 0x08, 0xD9, + 0x3A, 0x50, 0x37, 0x03, 0x17, 0x1C, 0x77, 0x33, + 0x38, 0x62, 0x10, 0x10, 0x55, 0xBD, 0x7A, 0xD2 + }, + { + 0x4C, 0xB8, 0x46, 0x59, 0x61, 0x93, 0xF7, 0xF2, + 0x78, 0xAA, 0xAA, 0xC5, 0xCC, 0xFF, 0xD5, 0x35, + 0x7A, 0xB0, 0xD1, 0x24, 0x5F, 0x69, 0x79, 0xD1, + 0x41, 0xA4, 0x71, 0xBD, 0xAB, 0x55, 0xE2, 0x38, + 0xB1, 0xAE, 0xD6, 0x7B, 0x73, 0x39, 0x95, 0x04, + 0xB9, 0x7D, 0xF1, 0xA2, 0x5E, 0xB6, 0xFE, 0x27, + 0x2B, 0x5C, 0xD4, 0x96, 0xA7, 0xC8, 0xA0, 0x60, + 0x92, 0x6E, 0x74, 0x04, 0xFD, 0xA0, 0x79, 0x0D + }, + { + 0x6F, 0x44, 0xEC, 0xDA, 0xE1, 0x4E, 0x3B, 0x81, + 0xA1, 0x91, 0x22, 0x03, 0x01, 0x5F, 0x59, 0x18, + 0xEA, 0xC6, 0xFB, 0xF4, 0x96, 0x60, 0x10, 0xF4, + 0x9D, 0x2B, 0xC2, 0xBC, 0xEF, 0xE7, 0xB1, 0xDF, + 0xEC, 0x5C, 0x83, 0x5D, 0x7D, 0x87, 0xA4, 0x43, + 0x71, 0xF1, 0x5A, 0x6C, 0x08, 0x42, 0x52, 0xB9, + 0x34, 0x65, 0x26, 0x42, 0x72, 0xA4, 0x10, 0xD5, + 0x0F, 0x89, 0xA1, 0x17, 0xF3, 0x1A, 0xF4, 0x63 + }, + { + 0x1F, 0x70, 0x5F, 0x6E, 0x9F, 0x07, 0x0D, 0x87, + 0xFD, 0xE8, 0xE2, 0x77, 0x46, 0x74, 0xFA, 0x9B, + 0xF1, 0x20, 0xD2, 0x88, 0xEB, 0x0B, 0xE7, 0xAA, + 0x12, 0x8D, 0xFB, 0x5D, 0x10, 0x11, 0xCE, 0x1F, + 0xDA, 0x99, 0xB2, 0x55, 0x22, 0x66, 0x65, 0xD8, + 0x3F, 0x63, 0x4E, 0x8F, 0xCA, 0xBD, 0xA9, 0xA2, + 0x3C, 0x03, 0x51, 0x5E, 0x9C, 0xFE, 0xCE, 0x6E, + 0x94, 0xA8, 0xEC, 0x92, 0xE4, 0xED, 0xEC, 0xB7 + }, + { + 0x2D, 0x96, 0xC5, 0xB0, 0x15, 0x74, 0x72, 0x2B, + 0x81, 0x7F, 0xEB, 0x48, 0x6C, 0x5F, 0xC9, 0x8F, + 0x5F, 0x84, 0x61, 0xF4, 0xCE, 0xE9, 0x90, 0x5A, + 0xF2, 0x06, 0xD4, 0x72, 0x33, 0x86, 0xD1, 0xC4, + 0xC7, 0xCA, 0xC5, 0x84, 0x00, 0x28, 0xD7, 0xAF, + 0xED, 0x0E, 0x38, 0xAD, 0x13, 0x96, 0x28, 0xEB, + 0x6A, 0xF9, 0x2B, 0x4B, 0x88, 0xEB, 0xF0, 0x9B, + 0x1F, 0xA0, 0x47, 0xFB, 0xE1, 0x0B, 0xC3, 0x1D + }, + { + 0x65, 0xDA, 0x78, 0x0A, 0x0A, 0x37, 0x47, 0x9D, + 0xD8, 0xF4, 0xD6, 0x55, 0x64, 0xF9, 0xA7, 0x08, + 0x9E, 0x42, 0x07, 0xEB, 0x16, 0xAC, 0xA3, 0xF6, + 0x55, 0x31, 0xCF, 0xEE, 0x76, 0x25, 0xBA, 0x13, + 0x80, 0xA4, 0x97, 0xB6, 0x24, 0x72, 0xFC, 0x7E, + 0x00, 0x07, 0xA6, 0xB0, 0x35, 0x61, 0x04, 0x16, + 0xA5, 0xF8, 0x2C, 0x10, 0x82, 0xFA, 0x06, 0x5C, + 0x46, 0xDD, 0xEE, 0x49, 0x40, 0xD1, 0xFC, 0x46 + }, + { + 0x1C, 0x09, 0xA3, 0xB3, 0x80, 0xB8, 0xA7, 0xFC, + 0x33, 0x3F, 0xD2, 0x71, 0x4D, 0xF7, 0x12, 0x9B, + 0x44, 0xA4, 0x67, 0x68, 0xBA, 0xCF, 0x0A, 0x67, + 0xA3, 0x8A, 0x47, 0xB3, 0xAB, 0x31, 0xF5, 0x1B, + 0x05, 0x33, 0xC2, 0xAA, 0x2B, 0x4B, 0x7B, 0xBB, + 0x6A, 0xE5, 0xED, 0xF3, 0xDC, 0xB0, 0xEC, 0xC1, + 0xA2, 0x83, 0xE8, 0x43, 0xF2, 0x90, 0x7B, 0x34, + 0x1F, 0x17, 0x9A, 0xFD, 0x8B, 0x67, 0xDA, 0x90 + }, + { + 0x67, 0x88, 0x8B, 0x83, 0xFA, 0xAF, 0xBB, 0x62, + 0x29, 0x34, 0xB8, 0xD5, 0x59, 0x63, 0xE1, 0x86, + 0x15, 0x3E, 0x59, 0x51, 0x88, 0x7C, 0x7F, 0x4A, + 0x76, 0x35, 0xC7, 0x98, 0xD9, 0xA5, 0x82, 0x94, + 0xBE, 0x26, 0xA3, 0xC5, 0x49, 0xC9, 0xFD, 0x59, + 0x86, 0xAB, 0xD1, 0x9F, 0x40, 0x1E, 0xE2, 0x4E, + 0xDA, 0x36, 0x02, 0x04, 0x2A, 0xD3, 0x83, 0x35, + 0x7A, 0x31, 0x7D, 0x38, 0x07, 0x3B, 0x38, 0xCE + }, + { + 0xB4, 0xF7, 0x99, 0x63, 0xCA, 0x31, 0xBB, 0x62, + 0x26, 0x5D, 0xD9, 0x29, 0xAF, 0x7D, 0x51, 0x27, + 0x2F, 0xA6, 0x63, 0x1D, 0xE7, 0xFA, 0x35, 0xF7, + 0xA6, 0xB0, 0x3F, 0x9F, 0xCF, 0xDB, 0x8E, 0x3B, + 0x5B, 0xAC, 0xE3, 0x35, 0x91, 0xB7, 0xEC, 0x2C, + 0xFA, 0xB4, 0x9C, 0x91, 0xA6, 0xDB, 0x1F, 0xF8, + 0xF6, 0x78, 0x6D, 0x08, 0xF4, 0x4E, 0x80, 0x62, + 0xD2, 0xFF, 0x69, 0x6A, 0x7D, 0x98, 0x41, 0x42 + }, + { + 0x40, 0x84, 0x83, 0x69, 0x7B, 0xB6, 0xF9, 0xD0, + 0x11, 0xA1, 0xF2, 0x9A, 0x23, 0xC2, 0x78, 0xA8, + 0x1D, 0x37, 0x57, 0x8D, 0xCC, 0xCF, 0x42, 0x3B, + 0xDF, 0x48, 0x93, 0x37, 0xF1, 0x82, 0xEA, 0xB7, + 0x9A, 0x50, 0xB0, 0x5F, 0x3D, 0x2C, 0xCC, 0x49, + 0x13, 0x37, 0xC7, 0xE4, 0x1F, 0x30, 0x79, 0x3B, + 0xD2, 0x7D, 0x76, 0x61, 0xC2, 0xE3, 0x04, 0xC9, + 0x46, 0xA5, 0xA4, 0x01, 0xAF, 0x8D, 0x94, 0x6F + }, + { + 0xEE, 0xB5, 0xAD, 0xE1, 0xAB, 0x97, 0xE7, 0x15, + 0x43, 0x43, 0xA4, 0x6E, 0xB4, 0xCD, 0xD2, 0xA7, + 0x73, 0xF3, 0x63, 0x01, 0xED, 0xC6, 0xA1, 0xBC, + 0x1D, 0xD6, 0x48, 0x0E, 0x08, 0xF5, 0x87, 0x65, + 0xCB, 0x93, 0x87, 0x82, 0x92, 0x3B, 0xC0, 0x1F, + 0x8E, 0x0C, 0x61, 0xC6, 0xBE, 0x0D, 0xD1, 0xAB, + 0x4C, 0x18, 0xCB, 0x15, 0xED, 0x52, 0x10, 0x11, + 0x24, 0x05, 0xF1, 0xEA, 0x8F, 0x2E, 0x8C, 0x4E + }, + { + 0x71, 0x4A, 0xD1, 0x85, 0xF1, 0xEE, 0xC4, 0x3F, + 0x46, 0xB6, 0x7E, 0x99, 0x2D, 0x2D, 0x38, 0xBC, + 0x31, 0x49, 0xE3, 0x7D, 0xA7, 0xB4, 0x47, 0x48, + 0xD4, 0xD1, 0x4C, 0x16, 0x1E, 0x08, 0x78, 0x02, + 0x04, 0x42, 0x14, 0x95, 0x79, 0xA8, 0x65, 0xD8, + 0x04, 0xB0, 0x49, 0xCD, 0x01, 0x55, 0xBA, 0x98, + 0x33, 0x78, 0x75, 0x7A, 0x13, 0x88, 0x30, 0x1B, + 0xDC, 0x0F, 0xAE, 0x2C, 0xEA, 0xEA, 0x07, 0xDD + }, + { + 0x22, 0xB8, 0x24, 0x9E, 0xAF, 0x72, 0x29, 0x64, + 0xCE, 0x42, 0x4F, 0x71, 0xA7, 0x4D, 0x03, 0x8F, + 0xF9, 0xB6, 0x15, 0xFB, 0xA5, 0xC7, 0xC2, 0x2C, + 0xB6, 0x27, 0x97, 0xF5, 0x39, 0x82, 0x24, 0xC3, + 0xF0, 0x72, 0xEB, 0xC1, 0xDA, 0xCB, 0xA3, 0x2F, + 0xC6, 0xF6, 0x63, 0x60, 0xB3, 0xE1, 0x65, 0x8D, + 0x0F, 0xA0, 0xDA, 0x1E, 0xD1, 0xC1, 0xDA, 0x66, + 0x2A, 0x20, 0x37, 0xDA, 0x82, 0x3A, 0x33, 0x83 + }, + { + 0xB8, 0xE9, 0x03, 0xE6, 0x91, 0xB9, 0x92, 0x78, + 0x25, 0x28, 0xF8, 0xDB, 0x96, 0x4D, 0x08, 0xE3, + 0xBA, 0xAF, 0xBD, 0x08, 0xBA, 0x60, 0xC7, 0x2A, + 0xEC, 0x0C, 0x28, 0xEC, 0x6B, 0xFE, 0xCA, 0x4B, + 0x2E, 0xC4, 0xC4, 0x6F, 0x22, 0xBF, 0x62, 0x1A, + 0x5D, 0x74, 0xF7, 0x5C, 0x0D, 0x29, 0x69, 0x3E, + 0x56, 0xC5, 0xC5, 0x84, 0xF4, 0x39, 0x9E, 0x94, + 0x2F, 0x3B, 0xD8, 0xD3, 0x86, 0x13, 0xE6, 0x39 + }, + { + 0xD5, 0xB4, 0x66, 0xFF, 0x1F, 0xD6, 0x8C, 0xFA, + 0x8E, 0xDF, 0x0B, 0x68, 0x02, 0x44, 0x8F, 0x30, + 0x2D, 0xCC, 0xDA, 0xF5, 0x66, 0x28, 0x78, 0x6B, + 0x9D, 0xA0, 0xF6, 0x62, 0xFD, 0xA6, 0x90, 0x26, + 0x6B, 0xD4, 0x0A, 0xB6, 0xF0, 0xBE, 0xC0, 0x43, + 0xF1, 0x01, 0x28, 0xB3, 0x3D, 0x05, 0xDB, 0x82, + 0xD4, 0xAB, 0x26, 0x8A, 0x4F, 0x91, 0xAC, 0x42, + 0x86, 0x79, 0x5F, 0xC0, 0xF7, 0xCB, 0x48, 0x5C + }, + { + 0x0A, 0x1E, 0x8C, 0x0A, 0x8C, 0x48, 0xB8, 0x4B, + 0x71, 0xBA, 0x0F, 0xE5, 0x6F, 0xA0, 0x56, 0x09, + 0x8C, 0xA6, 0x92, 0xE9, 0x2F, 0x27, 0x6E, 0x85, + 0xB3, 0x38, 0x26, 0xCD, 0x78, 0x75, 0xFC, 0xF8, + 0x83, 0x85, 0x13, 0x1B, 0x43, 0xDF, 0x74, 0x53, + 0x2E, 0xAA, 0x86, 0xCF, 0x17, 0x1F, 0x50, 0x76, + 0xE6, 0xD1, 0x7B, 0x1C, 0x75, 0xFB, 0xA1, 0xDB, + 0x00, 0x1B, 0x6E, 0x66, 0x97, 0x7C, 0xB8, 0xD7 + }, + { + 0x65, 0xAA, 0x17, 0x99, 0x14, 0x36, 0x93, 0xAB, + 0xD9, 0xCB, 0x21, 0x8D, 0x9B, 0x5E, 0xC6, 0x0C, + 0x0E, 0xDD, 0xB0, 0x67, 0xE6, 0xA3, 0x2F, 0x76, + 0x79, 0x60, 0x10, 0xAC, 0xB1, 0x1A, 0xD0, 0x13, + 0x6C, 0xE4, 0x9F, 0x97, 0x6E, 0x74, 0xF8, 0x95, + 0x04, 0x2F, 0x7C, 0xBF, 0x13, 0xFB, 0x73, 0xD1, + 0x9D, 0xC8, 0x89, 0xD7, 0xE9, 0x03, 0x46, 0x9D, + 0xEB, 0x33, 0x73, 0x1F, 0x24, 0x06, 0xB6, 0x63 + }, + { + 0xDE, 0xB7, 0x12, 0xB9, 0xCC, 0x64, 0xF5, 0x88, + 0x14, 0x86, 0x0B, 0x51, 0xFA, 0x89, 0xAD, 0x8A, + 0x92, 0x6A, 0x69, 0x08, 0xC7, 0x96, 0xDE, 0x55, + 0x7F, 0x90, 0xCF, 0xAD, 0xB0, 0xC6, 0x2C, 0x07, + 0x87, 0x2F, 0x33, 0xFE, 0x18, 0x4E, 0x5E, 0x21, + 0x2A, 0x3C, 0x5C, 0x37, 0x31, 0x74, 0x18, 0x44, + 0x6E, 0xFD, 0x95, 0x61, 0x3F, 0x61, 0x8A, 0x35, + 0xF7, 0xD2, 0x78, 0x9E, 0xFE, 0x0D, 0x96, 0x60 + }, + { + 0xB4, 0x2F, 0x4A, 0x40, 0xB3, 0xC8, 0x8B, 0xCE, + 0xCF, 0xE3, 0x28, 0xC8, 0x46, 0xBF, 0x06, 0x48, + 0xA1, 0x69, 0x90, 0xCA, 0x53, 0x91, 0x95, 0xC0, + 0xC1, 0xDC, 0x8D, 0x70, 0x30, 0x80, 0x67, 0x68, + 0x5A, 0xF6, 0x77, 0xAD, 0x65, 0xAC, 0x0C, 0x7A, + 0x9B, 0xCF, 0xA8, 0xF7, 0xAC, 0xC0, 0xAA, 0xCF, + 0x45, 0xCA, 0x18, 0xAC, 0x83, 0x1F, 0xED, 0x64, + 0x4E, 0xC3, 0xD9, 0x28, 0x31, 0x01, 0xFF, 0xEF + }, + { + 0xED, 0xCF, 0x6C, 0x81, 0xCC, 0xF1, 0x6E, 0x11, + 0xDD, 0xF7, 0x19, 0xA3, 0x3D, 0xD0, 0xE5, 0x34, + 0x9C, 0xAB, 0xAC, 0x5C, 0xFA, 0xE5, 0x97, 0x00, + 0x98, 0x40, 0xE1, 0xC3, 0x93, 0x62, 0xC0, 0xF1, + 0x19, 0x82, 0xFE, 0x2C, 0x27, 0x65, 0x85, 0x9A, + 0x94, 0x26, 0x2D, 0xA2, 0x8D, 0xD3, 0x37, 0x3D, + 0x52, 0x26, 0x93, 0x89, 0x75, 0x11, 0xEB, 0xA5, + 0xE0, 0x7B, 0x8B, 0xC6, 0xB6, 0x06, 0x4D, 0xC0 + }, + { + 0x46, 0xB9, 0x62, 0xD2, 0x28, 0x36, 0x94, 0xD2, + 0x79, 0x75, 0xDC, 0xBF, 0x32, 0x56, 0x4C, 0x9B, + 0x04, 0x03, 0x2B, 0x30, 0xA9, 0x3E, 0x05, 0x8F, + 0xB7, 0x7B, 0x2B, 0x71, 0x8B, 0x4A, 0xD5, 0xFB, + 0x78, 0x9A, 0xB7, 0xD7, 0xAA, 0x90, 0x85, 0x2D, + 0xA2, 0xBF, 0xB6, 0xB3, 0x93, 0xB0, 0x9F, 0x98, + 0xE8, 0x69, 0xB1, 0x6E, 0x41, 0x0E, 0x7D, 0xE2, + 0x30, 0xB1, 0x79, 0xF6, 0x2E, 0xB5, 0x74, 0x71 + }, + { + 0x29, 0x03, 0x6C, 0x3F, 0x53, 0x82, 0xE3, 0x5D, + 0xE7, 0xA6, 0x9F, 0xA7, 0xA6, 0x3E, 0xC7, 0xBD, + 0xCB, 0xC4, 0xE0, 0xCC, 0x5A, 0x7B, 0x64, 0x14, + 0xCF, 0x44, 0xBF, 0x9A, 0x83, 0x83, 0xEF, 0xB5, + 0x97, 0x23, 0x50, 0x6F, 0x0D, 0x51, 0xAD, 0x50, + 0xAC, 0x1E, 0xAC, 0xF7, 0x04, 0x30, 0x8E, 0x8A, + 0xEC, 0xB9, 0x66, 0xF6, 0xAC, 0x94, 0x1D, 0xB1, + 0xCD, 0xE4, 0xB5, 0x9E, 0x84, 0xC1, 0xEB, 0xBA + }, + { + 0x17, 0x3F, 0x8A, 0xB8, 0x93, 0x3E, 0xB0, 0x7C, + 0xC5, 0xFD, 0x6E, 0x4B, 0xCE, 0xBA, 0xE1, 0xFF, + 0x35, 0xC7, 0x87, 0x9B, 0x93, 0x8A, 0x5A, 0x15, + 0x79, 0xEA, 0x02, 0xF3, 0x83, 0x32, 0x48, 0x86, + 0xC7, 0x0E, 0xD9, 0x10, 0x9D, 0xE1, 0x69, 0x0B, + 0x8E, 0xE8, 0x01, 0xBC, 0x95, 0x9B, 0x21, 0xD3, + 0x81, 0x17, 0xEB, 0xB8, 0x4A, 0xB5, 0x6F, 0x88, + 0xF8, 0xA3, 0x72, 0x62, 0x00, 0x2D, 0xD9, 0x8E + }, + { + 0xC6, 0xAF, 0xA6, 0xA1, 0x91, 0x93, 0x1F, 0xD4, + 0x5C, 0x3B, 0xAD, 0xBA, 0x72, 0x6E, 0x68, 0xA9, + 0xBC, 0x73, 0x88, 0xC8, 0xCF, 0x37, 0xAD, 0xEC, + 0x7C, 0x64, 0x56, 0x1C, 0xF4, 0x81, 0xFD, 0x25, + 0x9A, 0x64, 0x6C, 0x8B, 0xD8, 0x43, 0xE7, 0x70, + 0x9E, 0x11, 0xE6, 0x4D, 0xCF, 0xD5, 0xDF, 0xFF, + 0xED, 0x79, 0x23, 0x5C, 0x68, 0x9B, 0x42, 0x00, + 0xFE, 0x7A, 0xC8, 0xDF, 0xDA, 0xDD, 0xEC, 0xE0 + }, + { + 0xA6, 0xDC, 0xCD, 0x8C, 0x19, 0x26, 0x64, 0x88, + 0xBF, 0x77, 0xB9, 0xF2, 0x4B, 0x91, 0x43, 0xDE, + 0xF1, 0xFE, 0xD6, 0x1D, 0x0C, 0x60, 0xB5, 0x00, + 0x0A, 0x52, 0x3F, 0x45, 0x0D, 0xA2, 0x3D, 0x74, + 0xE4, 0xE3, 0xF6, 0xEF, 0x04, 0x09, 0x0D, 0x10, + 0x66, 0xB6, 0xAC, 0xE8, 0x5A, 0xBC, 0x0F, 0x03, + 0x01, 0x73, 0xF5, 0x28, 0x17, 0x72, 0x7C, 0x4E, + 0x40, 0x43, 0x2D, 0xD3, 0x4C, 0x6E, 0xF9, 0xF0 + }, + { + 0xAA, 0xF8, 0x90, 0x8D, 0x54, 0x6E, 0x4F, 0x1E, + 0x31, 0x4C, 0x00, 0xE9, 0xD2, 0xE8, 0x85, 0x5C, + 0xB2, 0x56, 0x44, 0x5A, 0xAE, 0x3E, 0xCA, 0x44, + 0x23, 0x83, 0x22, 0xAE, 0xC7, 0x40, 0x34, 0xA1, + 0x45, 0x8A, 0x29, 0x36, 0x75, 0xDA, 0xD9, 0x49, + 0x40, 0x8D, 0xE5, 0x55, 0x4F, 0x22, 0xD7, 0x34, + 0x54, 0xF3, 0xF0, 0x70, 0x9C, 0xBC, 0xCC, 0x85, + 0xCB, 0x05, 0x3A, 0x6F, 0x50, 0x38, 0x91, 0xA1 + }, + { + 0x52, 0x5F, 0x4A, 0xAB, 0x9C, 0x32, 0x7D, 0x2A, + 0x6A, 0x3C, 0x9D, 0xF8, 0x1F, 0xB7, 0xBE, 0x97, + 0xEE, 0x03, 0xE3, 0xF7, 0xCE, 0x33, 0x21, 0x1C, + 0x47, 0x78, 0x8A, 0xCD, 0x13, 0x46, 0x40, 0xDD, + 0x90, 0xAD, 0x74, 0x99, 0x2D, 0x3D, 0xD6, 0xAC, + 0x80, 0x63, 0x50, 0xF3, 0xBA, 0xBC, 0x7F, 0xE1, + 0x98, 0xA6, 0x1D, 0xB3, 0x2D, 0x4A, 0xD1, 0xD6, + 0x56, 0x9A, 0xE8, 0x41, 0x31, 0x04, 0xDE, 0xA4 + }, + { + 0x2D, 0xAC, 0xCD, 0x88, 0x71, 0x9D, 0x0A, 0x00, + 0xB5, 0x2C, 0x6E, 0xB7, 0x9E, 0x1C, 0xA8, 0xB4, + 0xA1, 0xB4, 0xB4, 0x4F, 0xFA, 0x20, 0x88, 0x9F, + 0x23, 0x63, 0xEF, 0x5C, 0x0D, 0x73, 0x7F, 0x1F, + 0x81, 0xF5, 0x0D, 0xA1, 0xCA, 0xAC, 0x23, 0x1D, + 0x6F, 0xCB, 0x48, 0x89, 0x5E, 0x72, 0x99, 0xB7, + 0x7A, 0xF8, 0x1F, 0x0A, 0xA4, 0xA7, 0x61, 0x8A, + 0xD2, 0x4B, 0x7A, 0xAF, 0xC8, 0xE3, 0xA2, 0xBE + }, + { + 0x7D, 0x28, 0x6F, 0x1F, 0x72, 0x1E, 0xC2, 0xD2, + 0x11, 0x5E, 0xF4, 0xCC, 0xD8, 0x28, 0x58, 0xA4, + 0xD5, 0x12, 0x21, 0x13, 0x55, 0xD4, 0xFC, 0x58, + 0xE5, 0x34, 0xBF, 0xA5, 0x9C, 0x2E, 0x1B, 0xF5, + 0x52, 0xA9, 0x6D, 0xC4, 0xB3, 0xE4, 0x6B, 0x01, + 0x28, 0x65, 0xDA, 0x88, 0x13, 0x4C, 0xF0, 0x4E, + 0x73, 0x1B, 0x19, 0x30, 0x75, 0x9E, 0x15, 0x8F, + 0xF6, 0x20, 0xB6, 0xEC, 0x5A, 0xAF, 0xD0, 0x12 + }, + { + 0x21, 0x82, 0x6B, 0x95, 0x29, 0xC4, 0xBC, 0x51, + 0x91, 0x47, 0xF5, 0xF9, 0xFE, 0x6D, 0xB8, 0x78, + 0x34, 0x52, 0x15, 0xE5, 0x09, 0x4F, 0x4E, 0x99, + 0xB1, 0x31, 0xED, 0x54, 0xE2, 0x49, 0x53, 0xCE, + 0xE9, 0xAD, 0xB7, 0x18, 0xD1, 0x74, 0x3E, 0x6C, + 0x27, 0xFC, 0x94, 0x51, 0x6A, 0x99, 0x22, 0xFB, + 0x97, 0x5A, 0x78, 0x16, 0xB8, 0xAA, 0xB0, 0x21, + 0x12, 0x60, 0x8C, 0x03, 0x2B, 0xF1, 0x38, 0xE3 + }, + { + 0xC1, 0x68, 0x9C, 0x69, 0x8A, 0xB0, 0x65, 0xF6, + 0x2E, 0xEE, 0x65, 0xDD, 0xCA, 0x67, 0x6B, 0xAA, + 0x45, 0xB5, 0x2F, 0x30, 0x8A, 0xFA, 0x80, 0x4A, + 0xB4, 0xAA, 0x6A, 0xB8, 0x4B, 0x7A, 0xC1, 0xAA, + 0x1D, 0xFF, 0x07, 0x17, 0x56, 0x10, 0xB1, 0x2A, + 0xE1, 0x1F, 0x27, 0xB7, 0xC4, 0x30, 0xAF, 0xD5, + 0x75, 0x56, 0xBD, 0x18, 0x1D, 0x02, 0x83, 0x2C, + 0xD8, 0xD0, 0xA5, 0xFD, 0xC3, 0x02, 0x01, 0x24 + }, + { + 0xA1, 0xA6, 0x28, 0x17, 0x47, 0xE3, 0x4D, 0x3E, + 0xDE, 0x5E, 0x93, 0x34, 0x01, 0x74, 0x7C, 0xA7, + 0xF7, 0x66, 0x28, 0xB6, 0x14, 0xC8, 0xA3, 0x94, + 0xF5, 0x02, 0x56, 0x2B, 0xFE, 0xE0, 0xB9, 0x94, + 0xEC, 0xB6, 0x5F, 0xBF, 0xE1, 0xFF, 0x70, 0x67, + 0xDC, 0xB0, 0x1D, 0x02, 0xA9, 0x2B, 0xA4, 0x62, + 0x20, 0x75, 0x87, 0xCE, 0xF7, 0xDC, 0x2C, 0xFD, + 0xB4, 0x58, 0x48, 0x48, 0xAD, 0x55, 0x91, 0x4A + }, + { + 0x00, 0x70, 0xA0, 0x19, 0x0A, 0xA6, 0x96, 0x57, + 0x2D, 0x85, 0x3F, 0x1D, 0x24, 0xAB, 0x63, 0x08, + 0x48, 0xAC, 0x56, 0xAD, 0x5C, 0x2E, 0xBF, 0xCF, + 0xDE, 0x27, 0xD1, 0x11, 0xCD, 0x55, 0x93, 0x9C, + 0x1E, 0x4D, 0x07, 0x87, 0x2D, 0xDE, 0x7C, 0xE7, + 0x8B, 0x53, 0x4B, 0x53, 0x0F, 0x0A, 0x39, 0x6E, + 0x86, 0xAF, 0x9D, 0x57, 0x53, 0x54, 0xB5, 0xD7, + 0xE3, 0x4A, 0xCD, 0xE1, 0x8C, 0xC7, 0x67, 0xAE + }, + { + 0x51, 0xB9, 0xB5, 0xED, 0x19, 0x3F, 0xD4, 0xB1, + 0xA3, 0xA9, 0x2B, 0x46, 0xBD, 0x4B, 0xD1, 0xF6, + 0xEC, 0x6B, 0x38, 0xA6, 0x0F, 0x2D, 0x02, 0x61, + 0xD7, 0x2A, 0xBF, 0xD1, 0x64, 0x36, 0x12, 0x8D, + 0xCB, 0xF2, 0x2C, 0x25, 0xE3, 0xE3, 0xC4, 0x3F, + 0xE4, 0xD2, 0x9D, 0xB9, 0x12, 0x4D, 0x03, 0x33, + 0x30, 0x18, 0x45, 0x92, 0xD2, 0x0C, 0x5B, 0x08, + 0x2C, 0x23, 0x20, 0x64, 0x54, 0xCB, 0x3D, 0xD7 + }, + { + 0x57, 0x8F, 0x24, 0x27, 0x46, 0x91, 0x4E, 0x36, + 0xD0, 0xD9, 0xD4, 0x80, 0x96, 0x89, 0x57, 0x12, + 0x16, 0xA4, 0x3E, 0x47, 0x33, 0x32, 0x39, 0x51, + 0x62, 0x0F, 0x5E, 0xE7, 0x8C, 0xCF, 0xEE, 0x91, + 0x9B, 0xF5, 0x5F, 0x28, 0x7B, 0x45, 0xA7, 0x3D, + 0x44, 0x85, 0xAC, 0x74, 0x22, 0x87, 0x92, 0x39, + 0x65, 0x3B, 0x05, 0x91, 0xC3, 0x6C, 0x86, 0x69, + 0x41, 0xF8, 0xAF, 0xFE, 0x4A, 0xE5, 0x6E, 0x9E + }, + { + 0x94, 0x71, 0x30, 0xEF, 0x0B, 0x94, 0x8E, 0xE0, + 0x45, 0x81, 0xAB, 0xA3, 0xE2, 0xCC, 0x4C, 0xEF, + 0xC3, 0x8C, 0xCE, 0xDC, 0x86, 0x17, 0x92, 0xB7, + 0xB5, 0xDC, 0xD9, 0xD9, 0x36, 0x1C, 0x72, 0x4A, + 0x12, 0x20, 0x03, 0xBF, 0x79, 0x6C, 0xE0, 0x97, + 0x98, 0x00, 0xAD, 0xAB, 0xC7, 0x45, 0x6F, 0x17, + 0x3A, 0xE5, 0x26, 0x93, 0x15, 0xAF, 0xC0, 0x1B, + 0x60, 0x6D, 0xB2, 0x9C, 0x75, 0x50, 0xE8, 0xCA + }, + { + 0xC8, 0x52, 0xE6, 0x77, 0xF7, 0x7B, 0x14, 0xB5, + 0x85, 0xBD, 0x10, 0x2A, 0x0F, 0x14, 0x42, 0x43, + 0x05, 0x9D, 0xAB, 0xEC, 0x7C, 0xB0, 0x1F, 0xFA, + 0x61, 0xDF, 0x19, 0xFC, 0xE8, 0xAB, 0x43, 0x6B, + 0xF5, 0xE2, 0xD5, 0xC7, 0x9A, 0xA2, 0xD7, 0xB6, + 0x77, 0xF6, 0xC3, 0x75, 0xE9, 0x34, 0x3D, 0x34, + 0x2E, 0x4F, 0xF4, 0xE3, 0xAB, 0x00, 0x1B, 0xC7, + 0x98, 0x8C, 0x3C, 0x7A, 0x83, 0xCC, 0xB6, 0x9F + }, + { + 0x01, 0x19, 0x75, 0x26, 0x91, 0x7A, 0xC2, 0xC7, + 0xBC, 0x53, 0x95, 0x19, 0xE6, 0x8B, 0xB2, 0x79, + 0x81, 0x35, 0xF6, 0x03, 0x3E, 0xD5, 0x8F, 0x5C, + 0x45, 0x1E, 0x0C, 0xE9, 0x46, 0xAF, 0xF0, 0xF9, + 0x8D, 0xFD, 0xD1, 0x51, 0x01, 0x73, 0x1A, 0xC1, + 0x66, 0x12, 0x6E, 0xAF, 0xB5, 0xE7, 0xCB, 0xE2, + 0xE2, 0x72, 0xEE, 0x23, 0x3F, 0x34, 0xE5, 0xF3, + 0xF8, 0xEA, 0x3D, 0x2D, 0x12, 0x24, 0x82, 0xFB + }, + { + 0x05, 0x9C, 0x90, 0x85, 0x89, 0x5E, 0xB7, 0x18, + 0x30, 0x4E, 0x2D, 0xDA, 0x78, 0x68, 0x6B, 0xD9, + 0x57, 0x49, 0x81, 0x5A, 0x5E, 0xE9, 0x02, 0x51, + 0x0B, 0x00, 0x9A, 0xF6, 0x92, 0x48, 0xB6, 0xA7, + 0xA7, 0x2F, 0xF8, 0xA6, 0x28, 0xD8, 0x17, 0x73, + 0xE1, 0x1D, 0x5A, 0x1E, 0x7F, 0x69, 0x7A, 0x44, + 0x9B, 0x7A, 0x1E, 0x27, 0x12, 0xD5, 0xCF, 0xAE, + 0x7A, 0xB2, 0x65, 0x07, 0xD1, 0x11, 0x29, 0x18 + }, + { + 0x29, 0x52, 0x43, 0xBD, 0x75, 0x8C, 0xF2, 0x1C, + 0x80, 0x31, 0x25, 0xFC, 0xF3, 0x21, 0xDE, 0x5F, + 0x97, 0x98, 0x7C, 0x8D, 0xB3, 0xBB, 0x3C, 0xB5, + 0x1F, 0xF9, 0x7C, 0x4C, 0xDA, 0xC9, 0xD3, 0xBF, + 0x0A, 0x67, 0xCE, 0xE7, 0xED, 0x35, 0x0A, 0x41, + 0xFD, 0xE6, 0xAB, 0xCC, 0x25, 0x4F, 0xBC, 0x9F, + 0x8E, 0x6B, 0x3E, 0x3C, 0xCE, 0xCB, 0xD0, 0xE4, + 0xA6, 0x40, 0xA2, 0x0F, 0x36, 0x2B, 0xA3, 0xA0 + }, + { + 0xDD, 0x82, 0x32, 0xD2, 0x41, 0x2C, 0xCE, 0xEC, + 0xB5, 0x12, 0x31, 0x91, 0xF6, 0xE9, 0x22, 0x1E, + 0x85, 0x1E, 0xCC, 0xE0, 0xFA, 0xEB, 0xF0, 0x50, + 0x5F, 0x2A, 0xEE, 0xFF, 0x8A, 0x8C, 0x92, 0xD4, + 0x1D, 0xAC, 0xF1, 0x77, 0xBD, 0xAE, 0x27, 0x76, + 0x3E, 0xA4, 0xA8, 0x62, 0x05, 0xEF, 0x76, 0x34, + 0xF7, 0xA6, 0x87, 0xCC, 0x44, 0xBB, 0xBB, 0xDE, + 0xEE, 0x5E, 0x11, 0xE6, 0x5F, 0x9F, 0xBD, 0x69 + }, + { + 0xB0, 0x46, 0xB6, 0x83, 0x71, 0x6D, 0x31, 0xC9, + 0x14, 0xC7, 0x0B, 0x10, 0xF7, 0x64, 0x6D, 0xA3, + 0x1E, 0xFA, 0xB2, 0x23, 0x63, 0x47, 0x45, 0x9C, + 0xF8, 0xFA, 0x2C, 0x09, 0x12, 0x34, 0x31, 0xF7, + 0x28, 0x07, 0xF1, 0x1D, 0x86, 0x7C, 0x37, 0x70, + 0xB1, 0xF0, 0x61, 0xD5, 0x6C, 0xA0, 0xE5, 0xB1, + 0xE8, 0x8A, 0x6B, 0x44, 0xA3, 0x3C, 0xF9, 0x3E, + 0x18, 0xBC, 0xC9, 0xCE, 0xBB, 0xA5, 0xAD, 0xE7 + }, + { + 0x20, 0xE5, 0xA2, 0x55, 0x05, 0x8B, 0xE5, 0x1E, + 0x1A, 0x62, 0x9B, 0x4E, 0xBF, 0x81, 0xE5, 0xCB, + 0xE0, 0x78, 0x1C, 0xB6, 0x7C, 0xA4, 0xE5, 0x7B, + 0xA8, 0x6B, 0x30, 0x88, 0x96, 0xBC, 0xE7, 0x38, + 0x20, 0xEB, 0x08, 0x43, 0x1C, 0xE8, 0xC9, 0xBC, + 0x58, 0x10, 0xCC, 0x8D, 0x8B, 0x9C, 0x9D, 0x6F, + 0xCF, 0x83, 0x4E, 0x42, 0xEA, 0x33, 0xEF, 0x73, + 0xCE, 0xC4, 0x7D, 0x71, 0x3B, 0x6D, 0x8D, 0xFD + }, + { + 0x1E, 0x48, 0x04, 0xF9, 0xC0, 0xB1, 0xE8, 0x2B, + 0x9E, 0xD3, 0x63, 0xBD, 0xE4, 0x47, 0x28, 0xAC, + 0xF7, 0xD0, 0x90, 0xA1, 0xBF, 0xE2, 0xDD, 0xF8, + 0x81, 0x9D, 0x65, 0x92, 0xEF, 0x45, 0x3B, 0x83, + 0x5B, 0xD2, 0xEF, 0xE8, 0xB0, 0x20, 0x6E, 0x29, + 0x25, 0x5B, 0x07, 0xFB, 0x90, 0xC7, 0xD3, 0x0D, + 0x2C, 0x11, 0x48, 0x00, 0xB8, 0x6C, 0xB0, 0xE3, + 0xE0, 0x7D, 0x38, 0x7E, 0x98, 0xCE, 0x95, 0x37 + }, + { + 0x41, 0xC9, 0x53, 0xD8, 0xD2, 0x2A, 0x86, 0xC3, + 0x63, 0x4D, 0xF4, 0x22, 0xB6, 0xDE, 0x4A, 0x4F, + 0x14, 0x96, 0x66, 0xBE, 0x8C, 0x4F, 0x58, 0x1B, + 0x26, 0x23, 0xEE, 0x65, 0xC3, 0x92, 0xA5, 0xC3, + 0x28, 0x36, 0x63, 0x9E, 0xF5, 0x6B, 0x93, 0x68, + 0x62, 0x20, 0xF4, 0x5C, 0xE6, 0x5B, 0x4F, 0xA8, + 0x58, 0x9C, 0x91, 0x25, 0x64, 0x17, 0x90, 0xB6, + 0x92, 0x5F, 0xAA, 0xD9, 0x48, 0xB8, 0xBE, 0x04 + }, + { + 0x8B, 0xFC, 0xA4, 0xC8, 0xDF, 0xE3, 0xFD, 0xE4, + 0x25, 0x7B, 0x75, 0xC3, 0xDB, 0x01, 0x86, 0x2E, + 0xD3, 0x11, 0x67, 0xDE, 0x66, 0xC2, 0xE0, 0x3A, + 0x25, 0x56, 0xC4, 0xF4, 0x6C, 0x9D, 0xFF, 0xC1, + 0xAC, 0x45, 0xF7, 0xBC, 0x59, 0xA6, 0x7A, 0xB9, + 0x36, 0x24, 0xBE, 0xB8, 0x6D, 0xDD, 0x0D, 0x02, + 0x60, 0x3F, 0x0D, 0xCD, 0x03, 0x64, 0xF0, 0xF8, + 0x08, 0x81, 0x9B, 0xE9, 0x6C, 0xD8, 0xD3, 0xB6 + }, + { + 0xF6, 0xBF, 0x59, 0xD8, 0xD4, 0x5A, 0x55, 0x71, + 0x11, 0xA2, 0x36, 0xCB, 0xBA, 0x52, 0x61, 0x9A, + 0xE3, 0xDF, 0xCC, 0x43, 0x16, 0x94, 0x38, 0x43, + 0xAF, 0xD1, 0x28, 0x1B, 0x28, 0x21, 0x4A, 0x4A, + 0x5E, 0x85, 0x1E, 0xF8, 0xC5, 0x4F, 0x50, 0x5E, + 0x3C, 0x4B, 0x60, 0x0E, 0xFF, 0xBE, 0xBB, 0x3E, + 0xAC, 0x17, 0x08, 0x7F, 0x22, 0x27, 0x58, 0x12, + 0x63, 0xF1, 0x7D, 0x7E, 0x5F, 0x68, 0xEA, 0x83 + }, + { + 0x1B, 0xC9, 0xED, 0xE4, 0xD4, 0x1A, 0x4D, 0xF6, + 0xE8, 0xE6, 0xF4, 0x7C, 0x2F, 0x4A, 0xD8, 0x73, + 0x37, 0xB6, 0x9B, 0x19, 0xF7, 0x10, 0xF7, 0x66, + 0xE1, 0xFA, 0xF5, 0xAA, 0x05, 0xA4, 0x3B, 0x66, + 0x45, 0x39, 0x6E, 0x7F, 0xBE, 0xF4, 0x3B, 0xB7, + 0x79, 0x5D, 0x39, 0x40, 0x7B, 0x58, 0x15, 0xB9, + 0x2E, 0xCC, 0x23, 0xA6, 0xC1, 0x24, 0x14, 0x21, + 0x15, 0x3A, 0x55, 0xD5, 0x1F, 0x12, 0xBF, 0xD8 + }, + { + 0x76, 0xB3, 0x8B, 0x36, 0x31, 0x55, 0x5D, 0xBC, + 0xFB, 0x21, 0x21, 0x8F, 0xF9, 0xE4, 0x12, 0xA2, + 0x29, 0x88, 0x9E, 0xF2, 0xCE, 0x8A, 0xD7, 0x05, + 0xE9, 0x0F, 0x96, 0xAA, 0xBB, 0xD5, 0xBE, 0x7E, + 0x53, 0x29, 0xA4, 0x26, 0x53, 0x4C, 0x81, 0x5A, + 0x56, 0x53, 0x77, 0x13, 0x18, 0x72, 0x66, 0x41, + 0x42, 0x4E, 0x3B, 0x88, 0x29, 0x2F, 0xB1, 0xD8, + 0x95, 0x44, 0x40, 0x6A, 0xDE, 0x9B, 0xCC, 0xB5 + }, + { + 0xE5, 0x3F, 0x60, 0x07, 0x40, 0x22, 0x4E, 0x4D, + 0x10, 0xD3, 0x1D, 0x24, 0x38, 0x00, 0x31, 0x43, + 0xAF, 0xDB, 0x43, 0x6E, 0xB1, 0x79, 0x1B, 0x15, + 0x0D, 0xE3, 0x56, 0x76, 0xF0, 0xE3, 0x2F, 0x80, + 0xB0, 0xB6, 0x5F, 0x0A, 0xCF, 0x48, 0x1A, 0x5F, + 0xBF, 0x95, 0x96, 0xC0, 0xCB, 0x0A, 0x27, 0xC7, + 0xAF, 0xC1, 0x1D, 0x1E, 0x2C, 0x4D, 0x54, 0x02, + 0x47, 0x5E, 0x4F, 0xFC, 0xC1, 0xCD, 0xA8, 0x11 + }, + { + 0x62, 0x06, 0xB9, 0x1F, 0xC0, 0xB6, 0xF1, 0x21, + 0x1E, 0x9F, 0xDE, 0xCD, 0xC9, 0xD5, 0x1A, 0x6F, + 0x1E, 0xEE, 0x65, 0x54, 0xB1, 0x38, 0xAD, 0xCD, + 0x4A, 0x82, 0x3D, 0xF0, 0x0D, 0xDE, 0xF6, 0x75, + 0x9A, 0x9B, 0xFD, 0x7A, 0x4E, 0x98, 0x1E, 0x04, + 0x52, 0x36, 0x83, 0x8F, 0x4A, 0xF6, 0x93, 0xF6, + 0x93, 0x77, 0x93, 0x14, 0x84, 0xB3, 0xE8, 0x1E, + 0x3E, 0x3B, 0xC2, 0xCB, 0x7E, 0xF7, 0x9F, 0xE9 + }, + { + 0x76, 0xFD, 0x02, 0xDA, 0xDD, 0x96, 0x3B, 0xC0, + 0x35, 0x39, 0x91, 0x46, 0xCE, 0x42, 0x98, 0x8C, + 0xC0, 0x99, 0xD3, 0xCF, 0x4D, 0x32, 0xDF, 0x5C, + 0x0B, 0xBF, 0x64, 0x10, 0x12, 0x46, 0xB1, 0xC7, + 0x08, 0xD1, 0x67, 0xE2, 0x95, 0x95, 0xD1, 0x1D, + 0x09, 0xB3, 0xF6, 0x34, 0x86, 0xB4, 0x05, 0x26, + 0xAC, 0x1D, 0xFE, 0x31, 0xBC, 0x22, 0xDE, 0xC7, + 0x0B, 0x74, 0x5E, 0x90, 0xE2, 0xEA, 0xAF, 0x5A + }, + { + 0xF0, 0xA1, 0xFB, 0xE3, 0x11, 0x63, 0xE4, 0x21, + 0x01, 0x50, 0x72, 0x18, 0x3D, 0x68, 0xEE, 0x51, + 0x91, 0xA9, 0x9C, 0xFD, 0xA1, 0x69, 0xBA, 0x5A, + 0x19, 0x54, 0xC9, 0xF3, 0x10, 0x7D, 0x4E, 0xCA, + 0x06, 0x3E, 0x13, 0x7A, 0x71, 0x14, 0xD3, 0x97, + 0xC9, 0xDB, 0x67, 0x2B, 0x9F, 0x47, 0x8D, 0x41, + 0xC3, 0x4E, 0x99, 0x1B, 0x06, 0x69, 0xA9, 0x51, + 0x53, 0x92, 0x90, 0xC8, 0xED, 0x65, 0xE4, 0x6A + }, + { + 0x13, 0xC7, 0x2A, 0x6A, 0xA5, 0x71, 0xB1, 0x43, + 0xDC, 0xCF, 0x45, 0xAD, 0xCD, 0x98, 0xEA, 0xE6, + 0x99, 0xA1, 0x54, 0xB1, 0x10, 0xF2, 0x5E, 0x7E, + 0x9E, 0x82, 0xB7, 0x65, 0xB9, 0xA0, 0x89, 0x23, + 0x68, 0x8E, 0x8E, 0x0F, 0xF3, 0x11, 0xA6, 0x8A, + 0x77, 0x1E, 0x14, 0x50, 0x96, 0xD6, 0x07, 0x76, + 0xC6, 0xD6, 0xEE, 0x70, 0xAD, 0x6F, 0x69, 0xFA, + 0x2B, 0x76, 0x77, 0x63, 0x40, 0x55, 0xA0, 0x0E + }, + { + 0x0E, 0x06, 0x2B, 0xFE, 0x81, 0x8E, 0xE1, 0x0F, + 0x33, 0x48, 0x1D, 0xEA, 0x43, 0x02, 0x8B, 0x2C, + 0xFB, 0xB4, 0x9E, 0xC9, 0x5E, 0x0F, 0x75, 0xA9, + 0xE1, 0x6D, 0x40, 0x4B, 0xC5, 0x19, 0xB9, 0xAD, + 0x50, 0xB4, 0xA7, 0x33, 0x69, 0x2C, 0xA5, 0x4E, + 0xFB, 0x68, 0x04, 0x69, 0xED, 0x83, 0xDD, 0xEF, + 0xBD, 0xDD, 0xB1, 0x39, 0x04, 0x2E, 0x0E, 0x1C, + 0x09, 0xC3, 0xEB, 0x79, 0x03, 0xFA, 0x08, 0xDF + }, + { + 0x45, 0x3B, 0xE4, 0xAA, 0xB9, 0xF4, 0x23, 0xB3, + 0x36, 0x52, 0xA0, 0xB5, 0xD0, 0x2A, 0x9A, 0xF8, + 0x55, 0xDD, 0x0D, 0x42, 0xDD, 0x83, 0x11, 0x0B, + 0xA3, 0xBC, 0x4B, 0x39, 0x94, 0xEA, 0x3F, 0x88, + 0x5A, 0x71, 0x30, 0x89, 0x75, 0x08, 0x9B, 0x49, + 0x03, 0xE2, 0xE4, 0xD6, 0xBA, 0x6D, 0xC2, 0xE8, + 0x40, 0x31, 0xFF, 0xE9, 0xC8, 0x56, 0x39, 0x75, + 0xC8, 0x61, 0x6A, 0xCA, 0x07, 0x42, 0xE8, 0x29 + }, + { + 0x53, 0x61, 0xE3, 0xE8, 0x93, 0xDD, 0x36, 0x0B, + 0xCB, 0xF5, 0x1C, 0x79, 0x3E, 0xC0, 0x92, 0xA6, + 0xB0, 0x52, 0x05, 0x4F, 0x5F, 0x00, 0x0B, 0x9F, + 0xCE, 0x50, 0x7B, 0x66, 0x45, 0xF8, 0xD4, 0x70, + 0x13, 0xA8, 0x70, 0x6A, 0x58, 0xD4, 0xB1, 0x06, + 0x29, 0xCC, 0x82, 0xB8, 0xD2, 0xD7, 0x96, 0xFD, + 0xD3, 0x7B, 0x60, 0x8A, 0x58, 0x79, 0x52, 0xD6, + 0x55, 0x3E, 0x01, 0xD1, 0xAF, 0x0E, 0x04, 0xB8 + }, + { + 0x74, 0xB5, 0x67, 0x39, 0xF0, 0x1F, 0x82, 0x09, + 0xA4, 0x04, 0x44, 0xDF, 0x4C, 0xCD, 0xEE, 0xEA, + 0x8F, 0x97, 0xE8, 0xE7, 0x6E, 0xFA, 0x3C, 0x04, + 0x33, 0x7F, 0x69, 0x94, 0x5C, 0x4D, 0x44, 0xC0, + 0x85, 0xF1, 0xF4, 0x78, 0x96, 0x96, 0x36, 0x1E, + 0x3C, 0x97, 0x77, 0x4A, 0x93, 0x5F, 0x86, 0x0D, + 0x67, 0x46, 0x86, 0xDC, 0xBA, 0x3D, 0x45, 0xEC, + 0xD8, 0x63, 0x9A, 0x64, 0xAE, 0xA0, 0x62, 0x1B + }, + { + 0xB4, 0xD3, 0x15, 0x87, 0xB9, 0x2B, 0x53, 0x61, + 0xCD, 0xC2, 0xD3, 0xC4, 0x10, 0x86, 0xC1, 0x55, + 0x3E, 0x7B, 0x55, 0xA1, 0xF6, 0x1E, 0x94, 0xD2, + 0xBC, 0x30, 0xBC, 0x25, 0x1D, 0xAF, 0x8A, 0x5E, + 0xBF, 0xC5, 0x07, 0x09, 0xCC, 0x04, 0xCB, 0xAF, + 0x4B, 0x3B, 0x4D, 0xA2, 0xD2, 0x6B, 0x81, 0x23, + 0x8F, 0xBA, 0x71, 0x8F, 0xA9, 0x17, 0x59, 0xB8, + 0x0B, 0xD3, 0x10, 0x3A, 0xEC, 0x11, 0xE0, 0x6F + }, + { + 0xAA, 0xF6, 0x12, 0x7F, 0x00, 0xA0, 0x3D, 0x96, + 0x40, 0x6B, 0x9F, 0xB4, 0xAC, 0x70, 0x16, 0x0D, + 0xB5, 0x22, 0x42, 0x9B, 0x5C, 0xD9, 0x4E, 0x7F, + 0xA0, 0x30, 0x3A, 0x74, 0x94, 0x78, 0xFE, 0x31, + 0x89, 0xC8, 0xEA, 0x23, 0x93, 0x0A, 0x66, 0x25, + 0x2A, 0x80, 0x26, 0x74, 0xDC, 0xAF, 0x77, 0x00, + 0x46, 0x82, 0x0D, 0xD9, 0x64, 0xC6, 0x6F, 0x0F, + 0x54, 0x75, 0x1A, 0x72, 0xF9, 0x7D, 0x9C, 0x35 + }, + { + 0x2C, 0x30, 0xD4, 0x8D, 0xF9, 0x98, 0x4E, 0x02, + 0xF7, 0x5A, 0x94, 0x54, 0x92, 0x17, 0x18, 0x4D, + 0xD0, 0x2A, 0xAD, 0x3B, 0x57, 0x68, 0x3D, 0x09, + 0xB5, 0xA8, 0xC2, 0xEF, 0x53, 0xA9, 0x6A, 0xFB, + 0x73, 0xFE, 0xB6, 0xF9, 0x14, 0xE2, 0xD8, 0x15, + 0xBB, 0x3B, 0x08, 0x65, 0x43, 0x32, 0xFC, 0xFE, + 0x79, 0xF8, 0x0E, 0xC5, 0xF0, 0x51, 0xDA, 0x10, + 0xD7, 0x21, 0x41, 0x3D, 0xDD, 0xE8, 0xFA, 0x60 + }, + { + 0x92, 0xE2, 0xC5, 0xF7, 0x5D, 0x0C, 0xEA, 0xFC, + 0x81, 0x8F, 0xA7, 0x93, 0x59, 0x39, 0xE4, 0x8B, + 0x91, 0x59, 0x41, 0xEF, 0x73, 0x4D, 0x75, 0x27, + 0x0E, 0xB3, 0x21, 0xBA, 0x20, 0x80, 0xEF, 0x6D, + 0x25, 0x5E, 0x90, 0xEF, 0x96, 0xC6, 0x4C, 0xFF, + 0x1D, 0x8C, 0x18, 0xF3, 0x3C, 0x2E, 0xAB, 0x10, + 0x7F, 0xEF, 0x53, 0xE0, 0xD8, 0xBB, 0x16, 0x05, + 0x16, 0x80, 0x74, 0x80, 0xFC, 0xBA, 0x53, 0x73 + }, + { + 0x6E, 0x03, 0xA9, 0x1E, 0x20, 0x44, 0x46, 0x27, + 0xE3, 0xD2, 0xE2, 0x22, 0x26, 0xCF, 0x47, 0x00, + 0x26, 0x69, 0x44, 0x34, 0xED, 0x64, 0x79, 0x82, + 0x8C, 0xB6, 0xDC, 0x8F, 0x27, 0x96, 0x0A, 0xEE, + 0xE2, 0xF4, 0xAB, 0x87, 0x2A, 0x5C, 0xA2, 0xF7, + 0xF6, 0x52, 0xF7, 0xDC, 0x77, 0xD5, 0xF9, 0x6D, + 0x85, 0x82, 0x8B, 0x8F, 0x9C, 0x2D, 0x6C, 0x23, + 0x9E, 0x79, 0x77, 0x24, 0xA1, 0x31, 0x31, 0xB1 + }, + { + 0xBA, 0x43, 0x2D, 0xB0, 0xA3, 0x31, 0xBB, 0x8C, + 0x39, 0xB1, 0x7B, 0xEE, 0x34, 0x46, 0x2B, 0x26, + 0xDD, 0xB7, 0xAD, 0x91, 0xB6, 0xC7, 0x5A, 0xEC, + 0x27, 0x65, 0xFB, 0xAE, 0x3A, 0x0E, 0x60, 0xEC, + 0x54, 0x6D, 0x45, 0xF8, 0xE5, 0x84, 0x37, 0xB9, + 0xD7, 0x7C, 0x3D, 0x2E, 0x8D, 0x7C, 0xE0, 0x69, + 0x73, 0x15, 0x66, 0x51, 0xD4, 0x08, 0x22, 0x2A, + 0xA2, 0x90, 0xCB, 0x58, 0xCA, 0xBC, 0x0A, 0xE5 + }, + { + 0x83, 0xA0, 0x1E, 0x23, 0xAB, 0x27, 0x7B, 0x1F, + 0xC2, 0x8C, 0xD8, 0xBB, 0x8D, 0xA7, 0xE9, 0x4C, + 0x70, 0xF1, 0xDE, 0xE3, 0x2D, 0x19, 0x55, 0xCE, + 0xE2, 0x50, 0xEE, 0x58, 0x41, 0x9A, 0x1F, 0xEE, + 0x10, 0xA8, 0x99, 0x17, 0x97, 0xCE, 0x3D, 0x20, + 0x93, 0x80, 0xCA, 0x9F, 0x98, 0x93, 0x39, 0xE2, + 0xD8, 0xA8, 0x1C, 0x67, 0xD7, 0x37, 0xD8, 0x28, + 0x8C, 0x7F, 0xAE, 0x46, 0x02, 0x83, 0x4A, 0x8B + }, + { + 0x0E, 0xA3, 0x21, 0x72, 0xCC, 0x19, 0x1D, 0xFC, + 0x13, 0x1C, 0xD8, 0x8A, 0xA0, 0x3F, 0xF4, 0x18, + 0x5C, 0x0B, 0xFA, 0x7B, 0x19, 0x11, 0x12, 0x19, + 0xEE, 0xCB, 0x45, 0xB0, 0xFF, 0x60, 0x4D, 0x3E, + 0xDB, 0x00, 0x55, 0x0A, 0xBB, 0xA1, 0x11, 0x52, + 0x2B, 0x77, 0xAE, 0x61, 0xC9, 0xA8, 0xD6, 0xE9, + 0x4F, 0xCA, 0x9D, 0x96, 0xC3, 0x8D, 0x6B, 0x7C, + 0xCE, 0x27, 0x52, 0xF0, 0xD0, 0xC3, 0x7E, 0x78 + }, + { + 0x54, 0xAD, 0xD6, 0x55, 0x2B, 0x08, 0x85, 0x8B, + 0x23, 0xD6, 0x64, 0x5F, 0x6C, 0xE7, 0x9E, 0x92, + 0xF3, 0x8B, 0x66, 0xAE, 0x91, 0x86, 0x77, 0xE6, + 0xD9, 0x1F, 0x71, 0x87, 0xC4, 0x16, 0x05, 0x24, + 0xDF, 0xA8, 0xD0, 0x1F, 0x00, 0xEA, 0x93, 0xDD, + 0x29, 0x9F, 0x3C, 0xC4, 0x09, 0x01, 0xBD, 0x33, + 0x27, 0xA0, 0xF1, 0x8C, 0xCD, 0x7B, 0x6B, 0x8E, + 0x4E, 0x47, 0xCD, 0x28, 0xCF, 0x83, 0x8F, 0xAB + }, + { + 0xEF, 0x84, 0x74, 0x6D, 0xC2, 0x01, 0x56, 0xB6, + 0x6B, 0xA5, 0xC7, 0x8A, 0x50, 0x83, 0x0A, 0xBD, + 0x2A, 0xEF, 0x90, 0xE6, 0x67, 0xB9, 0x7E, 0xB5, + 0x22, 0x91, 0xBC, 0x86, 0x9D, 0x8A, 0xA2, 0x45, + 0x59, 0xA1, 0x42, 0xC6, 0x8F, 0xEA, 0x2E, 0xF3, + 0x2A, 0xF2, 0x2D, 0xFC, 0xEA, 0x4C, 0x90, 0xB3, + 0xD4, 0x90, 0x8C, 0xC9, 0xEA, 0x5C, 0xFC, 0x4E, + 0x91, 0xBF, 0x11, 0xCE, 0x6A, 0x7E, 0x57, 0x61 + }, + { + 0x5A, 0x1B, 0xF3, 0x81, 0xA0, 0x41, 0x19, 0xF9, + 0x42, 0xE4, 0x63, 0xAB, 0xA2, 0xB1, 0x64, 0x38, + 0x82, 0x46, 0x8A, 0xEC, 0xC1, 0xB1, 0xAA, 0x1E, + 0x7B, 0xCA, 0xAB, 0x3B, 0x47, 0x8F, 0xC5, 0xF0, + 0x56, 0xF1, 0x0D, 0xA9, 0x03, 0x7D, 0x40, 0xFA, + 0x7F, 0x55, 0x70, 0x8E, 0x10, 0x3B, 0xDA, 0x96, + 0x5E, 0x92, 0x0C, 0xF6, 0x7C, 0xE3, 0xAD, 0xF7, + 0xE2, 0x00, 0xE8, 0x61, 0x01, 0x4D, 0xEC, 0xC6 + }, + { + 0xAC, 0xF7, 0x8A, 0xA3, 0x28, 0x45, 0x96, 0xF3, + 0x30, 0xB7, 0xE8, 0x47, 0x51, 0xB9, 0x4C, 0x31, + 0x4C, 0xD8, 0x36, 0x36, 0x27, 0xBA, 0x99, 0x78, + 0x81, 0x30, 0x85, 0x78, 0x87, 0x37, 0x59, 0x89, + 0x5D, 0x13, 0xDF, 0xFF, 0xA5, 0xE5, 0x74, 0x50, + 0x13, 0x61, 0xF0, 0x43, 0xC7, 0x4F, 0x57, 0xD2, + 0xD0, 0xF1, 0x5C, 0x7A, 0x41, 0xC7, 0xC4, 0x5E, + 0x3C, 0x09, 0xAD, 0x89, 0xD6, 0x99, 0xA9, 0x77 + }, + { + 0x18, 0xB3, 0xE9, 0x04, 0x38, 0x44, 0xD4, 0xF3, + 0xA2, 0xD0, 0x21, 0xF5, 0x4C, 0x38, 0xFA, 0xCC, + 0x36, 0x4F, 0x84, 0xBA, 0x10, 0x58, 0xF2, 0x10, + 0x09, 0xFC, 0x37, 0x1D, 0x2E, 0x4F, 0x38, 0xC7, + 0x27, 0x51, 0x8A, 0xAB, 0xA6, 0xA2, 0x9E, 0x0F, + 0xDA, 0xE6, 0xE7, 0x60, 0xA4, 0xF1, 0xA6, 0xD7, + 0x58, 0xEB, 0xE4, 0x2C, 0x2A, 0xFC, 0x9D, 0x2C, + 0xDC, 0x6D, 0xD5, 0x80, 0x77, 0x8C, 0x4B, 0x32 + }, + { + 0x18, 0x96, 0xB2, 0x31, 0x70, 0x33, 0xCF, 0x31, + 0x04, 0x68, 0x73, 0xD8, 0x7F, 0x26, 0xE6, 0xA4, + 0x2A, 0x9D, 0x77, 0x0B, 0xBA, 0xF6, 0xE0, 0x62, + 0xDF, 0x11, 0xF9, 0xB4, 0xA0, 0xEA, 0xB2, 0x75, + 0xAA, 0xB1, 0x2C, 0xAA, 0xC2, 0xD3, 0xF5, 0x29, + 0xEB, 0x20, 0xD0, 0x70, 0xFD, 0x84, 0x4D, 0x86, + 0xD0, 0xA5, 0x71, 0xCD, 0xF6, 0x28, 0x5F, 0x80, + 0xE2, 0x30, 0x8B, 0xB8, 0x2C, 0x6C, 0x5B, 0x3B + }, + { + 0x8C, 0x3D, 0xC4, 0x01, 0x94, 0xAA, 0x02, 0x1F, + 0x3C, 0x4A, 0x1F, 0x9A, 0x05, 0x5E, 0x4D, 0x41, + 0x9E, 0xB3, 0xA2, 0x6D, 0x4C, 0x2F, 0x1A, 0x8C, + 0x7E, 0x18, 0x8B, 0x73, 0x48, 0x13, 0x40, 0x80, + 0xB6, 0x3F, 0x6E, 0x57, 0x0A, 0xD1, 0x1C, 0x28, + 0x78, 0x66, 0x53, 0x55, 0x41, 0x9C, 0x10, 0x20, + 0xDE, 0x4B, 0x65, 0x5E, 0x7A, 0x6C, 0x2C, 0xCD, + 0xE9, 0x07, 0x2C, 0xD4, 0x27, 0xFE, 0x8C, 0x4E + }, + { + 0x70, 0xAE, 0x04, 0x30, 0xD5, 0x45, 0xEC, 0x42, + 0x7F, 0x85, 0x41, 0x21, 0x1D, 0x4F, 0xE0, 0x42, + 0xB9, 0x82, 0x3A, 0xCE, 0xC0, 0x4B, 0x15, 0xC9, + 0x0B, 0x7F, 0x4B, 0x8B, 0xDD, 0x3D, 0xC7, 0x85, + 0x19, 0x90, 0xF3, 0x70, 0xE7, 0x14, 0x16, 0x75, + 0x10, 0x66, 0x49, 0xD3, 0x91, 0x51, 0x09, 0x03, + 0x18, 0x23, 0x1E, 0x4D, 0xED, 0x51, 0x22, 0x5D, + 0x9A, 0x6F, 0xA6, 0xC4, 0x24, 0x69, 0x5D, 0xE2 + }, + { + 0x07, 0x33, 0x6C, 0x42, 0xBD, 0x51, 0x49, 0x0E, + 0xF8, 0x4D, 0xFB, 0xDF, 0xAB, 0x74, 0x66, 0xF6, + 0xB6, 0x39, 0x99, 0xA5, 0xC0, 0x88, 0x72, 0xDF, + 0xED, 0xA0, 0x20, 0x6F, 0xDA, 0x80, 0xB9, 0xA6, + 0x2D, 0xE7, 0x28, 0xE3, 0xE3, 0xC3, 0xFD, 0x6B, + 0x7D, 0x21, 0xA4, 0x38, 0xAA, 0xD1, 0xB8, 0xDD, + 0x22, 0x38, 0x63, 0xC0, 0xD2, 0x6A, 0xCA, 0x27, + 0x79, 0x01, 0x74, 0xD9, 0xD4, 0x42, 0xA6, 0x4C + }, + { + 0x79, 0x26, 0x70, 0x88, 0x59, 0xE6, 0xE2, 0xAB, + 0x68, 0xF6, 0x04, 0xDA, 0x69, 0xA9, 0xFB, 0x50, + 0x87, 0xBB, 0x33, 0xF4, 0xE8, 0xD8, 0x95, 0x73, + 0x0E, 0x30, 0x1A, 0xB2, 0xD7, 0xDF, 0x74, 0x8B, + 0x67, 0xDF, 0x0B, 0x6B, 0x86, 0x22, 0xE5, 0x2D, + 0xD5, 0x7D, 0x8D, 0x3A, 0xD8, 0x7D, 0x58, 0x20, + 0xD4, 0xEC, 0xFD, 0x24, 0x17, 0x8B, 0x2D, 0x2B, + 0x78, 0xD6, 0x4F, 0x4F, 0xBD, 0x38, 0x75, 0x82 + }, + { + 0x92, 0x80, 0xF4, 0xD1, 0x15, 0x70, 0x32, 0xAB, + 0x31, 0x5C, 0x10, 0x0D, 0x63, 0x62, 0x83, 0xFB, + 0xF4, 0xFB, 0xA2, 0xFB, 0xAD, 0x0F, 0x8B, 0xC0, + 0x20, 0x72, 0x1D, 0x76, 0xBC, 0x1C, 0x89, 0x73, + 0xCE, 0xD2, 0x88, 0x71, 0xCC, 0x90, 0x7D, 0xAB, + 0x60, 0xE5, 0x97, 0x56, 0x98, 0x7B, 0x0E, 0x0F, + 0x86, 0x7F, 0xA2, 0xFE, 0x9D, 0x90, 0x41, 0xF2, + 0xC9, 0x61, 0x80, 0x74, 0xE4, 0x4F, 0xE5, 0xE9 + }, + { + 0x55, 0x30, 0xC2, 0xD5, 0x9F, 0x14, 0x48, 0x72, + 0xE9, 0x87, 0xE4, 0xE2, 0x58, 0xA7, 0xD8, 0xC3, + 0x8C, 0xE8, 0x44, 0xE2, 0xCC, 0x2E, 0xED, 0x94, + 0x0F, 0xFC, 0x68, 0x3B, 0x49, 0x88, 0x15, 0xE5, + 0x3A, 0xDB, 0x1F, 0xAA, 0xF5, 0x68, 0x94, 0x61, + 0x22, 0x80, 0x5A, 0xC3, 0xB8, 0xE2, 0xFE, 0xD4, + 0x35, 0xFE, 0xD6, 0x16, 0x2E, 0x76, 0xF5, 0x64, + 0xE5, 0x86, 0xBA, 0x46, 0x44, 0x24, 0xE8, 0x85 + }, + { + 0xDA, 0x85, 0x0A, 0x2F, 0x54, 0xE9, 0x44, 0x89, + 0x17, 0xD0, 0xDC, 0xAA, 0x63, 0x93, 0x7B, 0x95, + 0xA4, 0xDA, 0x1E, 0xAC, 0x8A, 0xF4, 0xDD, 0xF2, + 0x11, 0x3E, 0x5C, 0x8B, 0x0D, 0x4D, 0xB2, 0x66, + 0x9A, 0xF3, 0xC2, 0xAC, 0xB0, 0x80, 0x3D, 0x05, + 0x32, 0x3F, 0x3E, 0xC5, 0x5A, 0xBD, 0x33, 0xBD, + 0xF9, 0xB2, 0xBE, 0x89, 0x0E, 0xE7, 0x9E, 0x7F, + 0x3F, 0xCE, 0x4E, 0x19, 0x86, 0x96, 0xA7, 0xA3 + }, + { + 0xF1, 0x60, 0x95, 0xDD, 0x9F, 0x1E, 0xEB, 0x77, + 0xD5, 0xB9, 0x2F, 0x4B, 0x1F, 0xAC, 0x3A, 0x2C, + 0x5D, 0xA6, 0xAE, 0x5D, 0x0A, 0xB3, 0xF2, 0x54, + 0xE2, 0xA7, 0xFE, 0x52, 0x67, 0x24, 0x11, 0xD0, + 0x1C, 0xFA, 0x6A, 0xC0, 0x5B, 0xF3, 0x9E, 0xF6, + 0x5F, 0x4B, 0x22, 0x26, 0x4B, 0x41, 0xC3, 0xF3, + 0x63, 0x56, 0x3A, 0xBF, 0x0E, 0x92, 0x42, 0x90, + 0xC1, 0xC6, 0x80, 0xB1, 0x8A, 0xA6, 0x5B, 0x44 + }, + { + 0x76, 0xD0, 0x0A, 0x09, 0xC5, 0xBD, 0xD3, 0x9E, + 0xD3, 0x28, 0x71, 0x72, 0x2C, 0xFA, 0x00, 0x47, + 0x67, 0x4B, 0xEC, 0x8D, 0x35, 0x17, 0x5A, 0xF9, + 0x0D, 0x7A, 0xE9, 0x10, 0x74, 0x40, 0xA2, 0xA0, + 0x63, 0x88, 0x56, 0xD8, 0x38, 0x4C, 0x81, 0x7D, + 0x77, 0x2A, 0x4A, 0x59, 0x7A, 0x89, 0x55, 0x49, + 0xC8, 0x48, 0x66, 0x37, 0x56, 0x31, 0xCB, 0xA0, + 0x42, 0xF0, 0xEF, 0x6F, 0xFE, 0xB8, 0x9D, 0x44 + }, + { + 0xA6, 0x51, 0x13, 0x7B, 0x2C, 0x47, 0xFB, 0x79, + 0x51, 0xE7, 0xBD, 0xA7, 0x15, 0x43, 0xA6, 0xEB, + 0xC6, 0x24, 0x2A, 0xCA, 0xB4, 0x34, 0x7D, 0x38, + 0x8B, 0xE8, 0x35, 0x0F, 0x0C, 0x3F, 0xA3, 0xDF, + 0x8D, 0x95, 0x2C, 0x7C, 0x8A, 0x3D, 0xAF, 0x01, + 0xE0, 0x6C, 0x1D, 0xA6, 0x94, 0x96, 0xBB, 0xA8, + 0xDE, 0x62, 0xD8, 0x6B, 0x50, 0x93, 0x25, 0x6F, + 0x77, 0xA1, 0x87, 0xB5, 0x3D, 0xB0, 0x39, 0x88 + }, + { + 0xF3, 0x2F, 0x15, 0x0C, 0x2D, 0x67, 0xC0, 0xC4, + 0x37, 0x40, 0x1B, 0x70, 0xF6, 0x0B, 0x38, 0xF0, + 0xA3, 0xA4, 0x70, 0x59, 0x03, 0x3E, 0x75, 0x05, + 0xE6, 0x9A, 0x1D, 0x30, 0x12, 0x96, 0x03, 0x0B, + 0xC9, 0xB2, 0x95, 0x19, 0xC7, 0xF8, 0xB7, 0xD5, + 0x9A, 0x71, 0xFA, 0xB9, 0x05, 0x57, 0xDC, 0x3D, + 0xC8, 0x23, 0xFA, 0xC9, 0x5B, 0x9E, 0x85, 0xE6, + 0x52, 0x52, 0x8C, 0xBF, 0xB0, 0x1B, 0x11, 0x78 + }, + { + 0x27, 0x02, 0x56, 0x61, 0x36, 0xC4, 0x92, 0xF4, + 0x10, 0x89, 0xB0, 0x60, 0x10, 0x84, 0x60, 0xFA, + 0x30, 0x22, 0xC9, 0xC2, 0x5D, 0x34, 0x3B, 0xCB, + 0xD8, 0xAF, 0x2A, 0xF1, 0x9C, 0x17, 0xEF, 0x4C, + 0xA9, 0xF2, 0x22, 0x4F, 0xE7, 0xC4, 0x70, 0x0A, + 0x10, 0x19, 0x8E, 0xE5, 0x24, 0x8F, 0x30, 0x0B, + 0x54, 0x8E, 0xBF, 0x5C, 0x8E, 0x71, 0x16, 0x32, + 0x0C, 0xC8, 0x93, 0xFF, 0x7E, 0x23, 0x1F, 0xFB + }, + { + 0xFF, 0xE6, 0x87, 0x9F, 0x46, 0xB6, 0x29, 0x2B, + 0x21, 0x96, 0x97, 0x2E, 0x3F, 0xDF, 0x4F, 0xE9, + 0xEA, 0x4A, 0x81, 0x6D, 0x18, 0x07, 0xA3, 0x1C, + 0xAE, 0xAD, 0x6A, 0xAC, 0x5F, 0x06, 0x3C, 0x8F, + 0xE8, 0x77, 0x79, 0x75, 0x59, 0xA7, 0x59, 0xA0, + 0x0F, 0x8B, 0xA8, 0xF6, 0x68, 0xD8, 0x96, 0x8F, + 0xB3, 0x1D, 0x8A, 0x3B, 0x84, 0x57, 0x35, 0x90, + 0x2C, 0x5E, 0x42, 0xE2, 0x89, 0xEE, 0x0B, 0x62 + }, + { + 0x14, 0x48, 0x84, 0x28, 0x68, 0x22, 0xC2, 0x51, + 0x2D, 0x61, 0xB0, 0x46, 0xE6, 0x74, 0xD8, 0x6B, + 0x26, 0x4E, 0x9C, 0xC6, 0x89, 0x3E, 0xFF, 0x36, + 0x73, 0x11, 0x24, 0xF5, 0x9D, 0x1A, 0x82, 0x00, + 0x1E, 0x63, 0xF3, 0xE8, 0x05, 0x1C, 0xFE, 0x52, + 0xE7, 0x59, 0x7E, 0x28, 0x73, 0x8E, 0x3C, 0x3A, + 0x70, 0xF1, 0xBE, 0xD9, 0x68, 0x0E, 0x2C, 0x0E, + 0xF3, 0x72, 0x8B, 0x10, 0xA5, 0x6E, 0xD9, 0x87 + }, + { + 0x17, 0xC3, 0xF1, 0x46, 0xEE, 0x8D, 0xEC, 0x3B, + 0xAF, 0xCB, 0x51, 0xC0, 0xDA, 0x37, 0xF1, 0x78, + 0x71, 0xF2, 0x34, 0xC4, 0xA0, 0xFB, 0x7F, 0xA6, + 0xD0, 0x70, 0x7A, 0x54, 0x3E, 0x3C, 0xBF, 0x3A, + 0xDB, 0x81, 0xE3, 0x0C, 0x1E, 0x0A, 0xE9, 0xE1, + 0xAC, 0xE7, 0x22, 0x3B, 0xDA, 0x99, 0xBD, 0x59, + 0x19, 0xA3, 0xCF, 0xCC, 0x92, 0xC6, 0xA7, 0x55, + 0xE4, 0x56, 0xF0, 0x93, 0x82, 0x3B, 0xD3, 0x3E + }, + { + 0x1B, 0x83, 0x7A, 0xF2, 0x33, 0xA8, 0xA6, 0x8B, + 0xE7, 0x09, 0x52, 0xF7, 0x83, 0xC4, 0x96, 0x1A, + 0x81, 0x52, 0xD1, 0xE0, 0xB0, 0xFA, 0x32, 0x5F, + 0xF0, 0x86, 0xEA, 0x5B, 0x5F, 0x13, 0x12, 0xB8, + 0x9C, 0x42, 0xE0, 0x1B, 0x8C, 0x3A, 0x47, 0x7C, + 0xB5, 0x40, 0xC0, 0x6B, 0x2F, 0x37, 0xEE, 0x0E, + 0x39, 0x24, 0xD7, 0x45, 0xB4, 0xFF, 0x5C, 0x6A, + 0xF7, 0xD6, 0x1E, 0x0E, 0x37, 0xAC, 0x19, 0x31 + }, + { + 0x78, 0x97, 0x88, 0x0C, 0x1E, 0xB0, 0x0F, 0xD2, + 0x56, 0x7A, 0xE8, 0xA5, 0x9E, 0x64, 0x82, 0xAF, + 0xE1, 0x73, 0x49, 0xCF, 0x93, 0x92, 0x4A, 0x91, + 0x5F, 0x8C, 0x59, 0x26, 0x93, 0xD4, 0x52, 0x07, + 0x55, 0x19, 0x68, 0x9D, 0xFC, 0xD2, 0x93, 0xE3, + 0x76, 0x89, 0x7B, 0x3B, 0x0E, 0x03, 0x6F, 0x11, + 0x4F, 0xE8, 0x1E, 0xBC, 0xB3, 0x15, 0x36, 0x71, + 0xBD, 0x23, 0xBC, 0x2B, 0xED, 0x46, 0xF9, 0xC2 + }, + { + 0xCA, 0x7B, 0x6C, 0x77, 0x5D, 0x20, 0x1E, 0x5B, + 0x5A, 0x77, 0x22, 0x61, 0xDE, 0x52, 0x8E, 0x47, + 0x5F, 0x4B, 0xDE, 0x51, 0x76, 0x60, 0x52, 0x9F, + 0x41, 0xBE, 0xEB, 0x15, 0x78, 0xB2, 0x4B, 0xCB, + 0x94, 0xB9, 0x41, 0x0F, 0x9B, 0xF3, 0x36, 0xC1, + 0x09, 0xF9, 0xD4, 0x70, 0x93, 0xA1, 0x0B, 0xA6, + 0xDE, 0xBE, 0x50, 0x43, 0x80, 0xD9, 0xD1, 0x50, + 0x73, 0xBD, 0xD1, 0x11, 0xC8, 0xD1, 0x29, 0xFA + }, + { + 0x57, 0x18, 0xE0, 0xD4, 0x5D, 0xEB, 0xC3, 0x00, + 0x2D, 0x52, 0xB2, 0x2C, 0x52, 0x73, 0x29, 0xAE, + 0x5E, 0xBF, 0x27, 0xE8, 0xFA, 0x9C, 0x8F, 0xEA, + 0xB4, 0x6C, 0x40, 0xBC, 0x64, 0x22, 0xCA, 0x03, + 0x35, 0x30, 0x4C, 0xF9, 0xE7, 0xF1, 0x41, 0xDE, + 0x7F, 0xA6, 0xAD, 0xB6, 0x78, 0x9B, 0xDB, 0xF3, + 0x8D, 0x14, 0xDA, 0xBA, 0x3E, 0x62, 0x97, 0xD2, + 0x5B, 0xF1, 0x7D, 0xE1, 0x70, 0xD6, 0xE3, 0xC8 + }, + { + 0x48, 0xD0, 0xED, 0x24, 0x9F, 0x90, 0x28, 0x41, + 0x99, 0x7C, 0x25, 0x5D, 0xAF, 0x99, 0x08, 0x9C, + 0x9A, 0x31, 0x24, 0x69, 0x8B, 0x16, 0x4A, 0x30, + 0x28, 0x33, 0x0F, 0xDD, 0x4C, 0xEE, 0x41, 0xE1, + 0x68, 0x3F, 0xA4, 0xD9, 0xDC, 0x66, 0xB2, 0xA7, + 0x9C, 0x8A, 0xA4, 0xC8, 0x28, 0x4E, 0x27, 0xBE, + 0xE2, 0xA4, 0x28, 0xA6, 0x71, 0x9D, 0x6E, 0xC6, + 0x55, 0xED, 0x76, 0x9D, 0xCB, 0x62, 0x4E, 0x24 + }, + { + 0x79, 0x4E, 0x0B, 0x64, 0xAC, 0xE1, 0xFE, 0x5A, + 0xE3, 0x79, 0x93, 0x70, 0x68, 0xD8, 0x2D, 0xF0, + 0x48, 0x68, 0x61, 0x6C, 0xAE, 0x0C, 0x17, 0xD3, + 0x05, 0x72, 0xC2, 0x02, 0x4E, 0x77, 0x48, 0x94, + 0xE0, 0x66, 0x8C, 0x47, 0x2D, 0x62, 0x3C, 0x90, + 0x3C, 0xC5, 0x88, 0x5F, 0x17, 0x84, 0x94, 0x51, + 0x10, 0x32, 0x9E, 0xB4, 0x98, 0xA8, 0x95, 0xA9, + 0xE5, 0x9A, 0x75, 0xE5, 0x27, 0x15, 0x8A, 0x5C + }, + { + 0x21, 0x79, 0xAA, 0x82, 0x0E, 0x03, 0xFA, 0x33, + 0xD9, 0xBD, 0xE5, 0x56, 0x8C, 0x26, 0x2E, 0x2D, + 0x34, 0x17, 0xA4, 0x02, 0xE0, 0x7A, 0x59, 0x1F, + 0x9D, 0x55, 0x70, 0x68, 0x2D, 0xB5, 0xF9, 0xBB, + 0xA4, 0xBB, 0x9D, 0x5A, 0x82, 0xEE, 0x5E, 0xFD, + 0xB4, 0xF6, 0x5B, 0xBB, 0xFE, 0xEE, 0x2F, 0x4A, + 0xB9, 0xE4, 0x6C, 0xF2, 0xCE, 0x7E, 0x3B, 0x05, + 0x43, 0x27, 0xA7, 0x18, 0xD3, 0xF1, 0x08, 0x06 + }, + { + 0xB0, 0xA4, 0x8C, 0x6A, 0xDA, 0x54, 0x87, 0x25, + 0x79, 0x9B, 0x59, 0x86, 0xBA, 0xB4, 0x32, 0x69, + 0x79, 0x60, 0x92, 0x24, 0xD8, 0x97, 0x18, 0x4B, + 0x89, 0x97, 0x10, 0x4E, 0x0C, 0x6A, 0x24, 0xB3, + 0xAB, 0xE5, 0x62, 0x16, 0x54, 0x22, 0xA4, 0x5D, + 0x8A, 0xC8, 0x19, 0xB9, 0x9D, 0x37, 0x56, 0xEB, + 0xBB, 0x64, 0xF8, 0x43, 0xE3, 0xE0, 0x93, 0x4D, + 0xEC, 0x48, 0x7A, 0xED, 0x12, 0x13, 0x72, 0x79 + }, + { + 0x84, 0x8D, 0x7F, 0x2E, 0xAD, 0x41, 0x29, 0x1D, + 0x05, 0x38, 0x68, 0x0C, 0x64, 0x9D, 0x07, 0x89, + 0x7E, 0x45, 0xC7, 0x0A, 0x0A, 0xA4, 0xF9, 0x35, + 0x3F, 0x82, 0xC3, 0xF6, 0xFB, 0xB8, 0xE8, 0x48, + 0x9C, 0x75, 0x3E, 0x90, 0xDB, 0xE8, 0x89, 0x00, + 0x41, 0xA1, 0xAE, 0xEF, 0x84, 0xCD, 0x31, 0x36, + 0x43, 0x4F, 0x53, 0x0E, 0x9D, 0xD9, 0xC2, 0x3F, + 0xA5, 0x4F, 0xE1, 0x24, 0xEA, 0xFB, 0x72, 0xAD + }, + { + 0x0E, 0xD1, 0x46, 0x26, 0xEE, 0x6D, 0x0C, 0x8E, + 0xD3, 0xF0, 0xC2, 0x00, 0xC1, 0x29, 0x85, 0x0F, + 0xFF, 0x76, 0x31, 0x8F, 0xFF, 0xA1, 0xDD, 0xD7, + 0xDD, 0x56, 0x3A, 0x01, 0xB7, 0x77, 0x97, 0x06, + 0x86, 0x2B, 0x23, 0x99, 0x59, 0xB6, 0x15, 0xAE, + 0x2E, 0xBE, 0x27, 0xC4, 0x50, 0x37, 0xE6, 0xFF, + 0xAF, 0x99, 0x14, 0xDA, 0x8F, 0xF2, 0x77, 0x2B, + 0xA5, 0xEE, 0x08, 0x11, 0xCD, 0x9E, 0xD5, 0x32 + }, + { + 0x52, 0x03, 0xC0, 0x76, 0x38, 0xC4, 0xB6, 0x5F, + 0x78, 0x43, 0x1E, 0x8B, 0x02, 0xE2, 0x0F, 0x6D, + 0x68, 0x3F, 0x19, 0xFA, 0x8F, 0x83, 0xB5, 0x13, + 0x4C, 0xD0, 0xF4, 0xE4, 0x68, 0xC9, 0x7E, 0xAC, + 0xB5, 0x26, 0x7C, 0x7D, 0x3E, 0xAB, 0x58, 0x3C, + 0xCA, 0xAC, 0xD0, 0xDB, 0xA4, 0xD5, 0x8A, 0xCE, + 0x52, 0x19, 0x3A, 0x51, 0x78, 0xA7, 0xB1, 0x2D, + 0x27, 0x95, 0xF5, 0xFD, 0xE8, 0xA3, 0x7B, 0xB9 + }, + { + 0x48, 0xBE, 0x43, 0xD5, 0xE0, 0x04, 0x36, 0x88, + 0xDF, 0x35, 0x32, 0xF7, 0x12, 0x1A, 0xFF, 0xFA, + 0x16, 0x7D, 0xAB, 0xE4, 0xA4, 0x84, 0xFB, 0x75, + 0xA0, 0x3A, 0xF3, 0x04, 0xA5, 0xC6, 0xF8, 0x25, + 0xF3, 0x6C, 0xEC, 0xCB, 0xBB, 0xC0, 0x75, 0xEE, + 0xF3, 0x20, 0xC4, 0xCD, 0x8D, 0x7E, 0xF8, 0xCB, + 0x49, 0xE6, 0xDD, 0x59, 0x73, 0x37, 0x9E, 0xEC, + 0x4C, 0x23, 0x3C, 0x45, 0x43, 0xD1, 0x32, 0xCE + }, + { + 0xB5, 0x46, 0x4E, 0x6A, 0xBA, 0xF5, 0xD3, 0xD4, + 0x08, 0x3D, 0x1D, 0x7D, 0x2A, 0x8B, 0x0B, 0xAB, + 0x78, 0xB6, 0x17, 0x09, 0x50, 0x0B, 0xBF, 0x77, + 0x82, 0x3F, 0x60, 0x2D, 0x57, 0xD5, 0x13, 0xCA, + 0x9E, 0x9F, 0xFF, 0x65, 0xEF, 0xAA, 0x89, 0x9C, + 0xFE, 0x7B, 0xF8, 0x8A, 0x01, 0x88, 0x82, 0x9C, + 0x24, 0xE4, 0x98, 0xAD, 0x00, 0x23, 0x5A, 0xBE, + 0x8E, 0xEF, 0xA7, 0x19, 0xFA, 0x6A, 0xE6, 0xF6 + }, + { + 0xAF, 0xE5, 0xE5, 0xE8, 0x3F, 0x19, 0xAD, 0xAD, + 0x9E, 0x95, 0x90, 0x3E, 0xA9, 0xB2, 0x98, 0x10, + 0x7D, 0x37, 0xDD, 0x38, 0x63, 0x2C, 0x95, 0x90, + 0xBB, 0xFF, 0xC6, 0x24, 0xD4, 0xDE, 0x95, 0x8C, + 0xB6, 0xB6, 0x1A, 0xF0, 0x80, 0xF0, 0x37, 0xAD, + 0x17, 0xD0, 0x35, 0xB6, 0xBF, 0x58, 0xF7, 0x80, + 0xFA, 0xDF, 0x70, 0xF3, 0xC9, 0x59, 0x66, 0x8A, + 0x1B, 0x47, 0x21, 0x98, 0xA5, 0x9A, 0x8A, 0x00 + }, + { + 0xEF, 0xA2, 0xC7, 0xC8, 0x02, 0xE2, 0x10, 0xD2, + 0xD8, 0x0F, 0xB3, 0x50, 0xB3, 0xC2, 0xCB, 0x31, + 0x56, 0x13, 0x18, 0x11, 0xE7, 0x18, 0xEE, 0xE5, + 0xC9, 0xC6, 0x64, 0x0F, 0x87, 0x68, 0x2A, 0x55, + 0x81, 0x2B, 0x10, 0xF4, 0x03, 0x10, 0xBA, 0xA7, + 0xB8, 0x2B, 0x27, 0x3E, 0xF3, 0xAC, 0xC5, 0x5F, + 0xED, 0xE0, 0xB5, 0xF1, 0x94, 0x9D, 0xE4, 0x29, + 0x3D, 0x91, 0xB5, 0x89, 0xA2, 0x17, 0x5F, 0xF7 + }, + { + 0xD6, 0xC6, 0x2A, 0x61, 0x82, 0x71, 0xF3, 0xBC, + 0xBE, 0x00, 0x79, 0x24, 0xA0, 0xC9, 0x81, 0x2F, + 0x83, 0x17, 0x44, 0x5F, 0xB6, 0xFB, 0x19, 0xEB, + 0x58, 0x9A, 0x62, 0x9F, 0x51, 0x2F, 0xB3, 0x8A, + 0x0B, 0x4E, 0x24, 0x7D, 0xEA, 0x88, 0xC5, 0x6A, + 0x1B, 0xAF, 0x17, 0x88, 0x33, 0x65, 0xB4, 0x36, + 0xF2, 0x84, 0x46, 0xFF, 0x66, 0xEA, 0x43, 0x18, + 0x0B, 0xD0, 0x1E, 0xB5, 0xA6, 0x50, 0x9B, 0xD5 + }, + { + 0x0B, 0x41, 0x16, 0x6B, 0xE6, 0x2F, 0x65, 0xE1, + 0x93, 0xB3, 0xB8, 0x65, 0xE6, 0xC4, 0x7A, 0xAD, + 0x26, 0x0A, 0xF5, 0xFC, 0xEE, 0xC9, 0xAB, 0x44, + 0xAB, 0xAA, 0x46, 0x0A, 0x0C, 0x02, 0x46, 0xB6, + 0xC6, 0x9B, 0x67, 0xD7, 0x1D, 0x3A, 0xDF, 0xEC, + 0x60, 0xDC, 0x8E, 0x77, 0x37, 0x2F, 0x09, 0x49, + 0x52, 0x34, 0x4F, 0xE1, 0x0C, 0x0D, 0x59, 0xEF, + 0xEC, 0x0E, 0x11, 0xC4, 0xA5, 0x16, 0x93, 0x6D + }, + { + 0x79, 0xD5, 0xF9, 0xFF, 0xC0, 0x5E, 0xCF, 0x33, + 0x7D, 0xE9, 0xF1, 0xE0, 0xF1, 0xD8, 0x9B, 0x30, + 0xAC, 0xFE, 0xBB, 0xB8, 0x8A, 0x69, 0x35, 0x86, + 0x78, 0x18, 0xCD, 0x8D, 0x45, 0xDA, 0x3D, 0x25, + 0x18, 0xDE, 0x61, 0xA7, 0xFE, 0x28, 0x75, 0x1B, + 0x61, 0x8F, 0x7A, 0x87, 0x5E, 0x11, 0x89, 0x8F, + 0xFF, 0x74, 0x15, 0x7A, 0xB9, 0x06, 0x81, 0xBD, + 0x53, 0xFA, 0x69, 0x62, 0x67, 0x1E, 0xD9, 0x9D + }, + { + 0xBE, 0xA9, 0x83, 0xD7, 0x6F, 0x24, 0xB1, 0xEE, + 0xDE, 0x1D, 0x06, 0x71, 0x48, 0x05, 0x76, 0x8F, + 0xAA, 0xAD, 0x47, 0x08, 0xC9, 0xA4, 0xFF, 0x9C, + 0xD2, 0x42, 0x2F, 0x70, 0x6B, 0x6F, 0x0C, 0x30, + 0x6D, 0x8B, 0x67, 0xF3, 0x40, 0x89, 0xC6, 0x5E, + 0xD3, 0x88, 0x0C, 0x75, 0xF6, 0x7B, 0xBC, 0x4D, + 0x89, 0xAD, 0x87, 0x12, 0x0A, 0x77, 0xD0, 0xFF, + 0xE4, 0x36, 0xFB, 0x7B, 0x58, 0xB2, 0xCA, 0x41 + }, + { + 0x46, 0x6F, 0xD9, 0x15, 0xEF, 0xD9, 0x50, 0xBC, + 0x96, 0x65, 0x78, 0xCD, 0x92, 0xC6, 0x85, 0x92, + 0x9D, 0x7B, 0x51, 0xA6, 0x3D, 0xB1, 0x42, 0xC7, + 0xB9, 0xA9, 0x3D, 0x16, 0x52, 0x04, 0x95, 0x31, + 0x9B, 0x87, 0xF6, 0x58, 0xE6, 0xAF, 0xDA, 0x1B, + 0x42, 0x77, 0x3E, 0x2D, 0x49, 0xDA, 0x81, 0x45, + 0x94, 0xA5, 0x54, 0x90, 0x89, 0xEF, 0xB1, 0xF3, + 0xAB, 0x5F, 0x15, 0x90, 0xCA, 0x0A, 0x02, 0xAF + }, + { + 0xF6, 0x46, 0x11, 0x13, 0x7A, 0xD2, 0x95, 0x46, + 0x70, 0xEA, 0xEC, 0xD6, 0x26, 0xD2, 0x12, 0xCF, + 0xC5, 0xB9, 0xF6, 0xBB, 0x41, 0xAA, 0xEB, 0xB1, + 0xD7, 0x1E, 0x89, 0x79, 0x2E, 0xB1, 0x31, 0x7A, + 0xED, 0xC6, 0x38, 0x13, 0xFE, 0x63, 0xDE, 0x40, + 0x17, 0x98, 0xDF, 0x75, 0x6C, 0xA1, 0xF2, 0x20, + 0x35, 0xA0, 0xFA, 0xBD, 0x37, 0xFB, 0x11, 0x03, + 0x43, 0x7F, 0x89, 0x1E, 0xAD, 0x5E, 0x64, 0x29 + }, + { + 0x32, 0xE1, 0xF9, 0x38, 0xA2, 0x7F, 0xAA, 0xD8, + 0xAC, 0x4A, 0x13, 0xFD, 0x4F, 0x6A, 0x8B, 0xF3, + 0xDA, 0xBE, 0x4B, 0xC7, 0x2A, 0xF1, 0x1C, 0x8F, + 0x0E, 0x1A, 0x06, 0x56, 0x7E, 0xD7, 0x04, 0xB8, + 0xE7, 0x8E, 0x11, 0x40, 0xA0, 0xC7, 0x72, 0x4E, + 0x3E, 0xFB, 0x70, 0xD2, 0x38, 0x07, 0xCF, 0x38, + 0xE6, 0x27, 0xE3, 0x26, 0xAF, 0xC1, 0x64, 0xCD, + 0xED, 0x52, 0xB4, 0x41, 0x39, 0xFF, 0xB3, 0xF3 + }, + { + 0x48, 0x33, 0xAC, 0x92, 0xE3, 0x02, 0xAC, 0x2B, + 0x67, 0xB0, 0x2B, 0x88, 0x27, 0x14, 0x3B, 0xAD, + 0xA1, 0x5C, 0xED, 0x22, 0x0E, 0x1D, 0x1F, 0x5B, + 0x71, 0x12, 0x0C, 0x51, 0xEE, 0x54, 0xC1, 0x9D, + 0x30, 0x1F, 0x29, 0x60, 0xBD, 0xB5, 0xA2, 0xCE, + 0x27, 0xD4, 0x41, 0xD1, 0x4A, 0xF0, 0x80, 0xCB, + 0x01, 0x0A, 0x8A, 0x23, 0xEE, 0xFF, 0x58, 0x11, + 0xDF, 0xA4, 0x4D, 0x1D, 0x7B, 0x35, 0x8B, 0x48 + }, + { + 0x9A, 0x03, 0x88, 0xCE, 0xE1, 0xAD, 0x01, 0x46, + 0x17, 0x7C, 0x48, 0xB5, 0xA0, 0x8A, 0x2D, 0xB3, + 0xC4, 0x89, 0xE8, 0x4C, 0xE2, 0xAB, 0xA8, 0xC6, + 0x45, 0x11, 0x2A, 0x02, 0x1E, 0x41, 0x1C, 0xF8, + 0x29, 0x12, 0x7F, 0xA2, 0xF1, 0xD1, 0xAE, 0x1B, + 0xAF, 0x3A, 0x33, 0xEA, 0x53, 0x09, 0x84, 0x77, + 0xA7, 0xD1, 0x2B, 0xA7, 0x48, 0xD2, 0xAF, 0x24, + 0xD1, 0x66, 0x02, 0xE9, 0x19, 0x07, 0x76, 0x23 + }, + { + 0xE3, 0xDF, 0x00, 0x74, 0xA9, 0x37, 0x35, 0x13, + 0x0D, 0x99, 0x22, 0xD2, 0xBE, 0x91, 0x6F, 0x35, + 0x34, 0x3D, 0x98, 0x8C, 0xE5, 0x9D, 0x76, 0x97, + 0x15, 0xA9, 0x83, 0xB4, 0xBA, 0x80, 0x7C, 0xE1, + 0xEE, 0x70, 0xA3, 0x13, 0xE5, 0x92, 0x31, 0x58, + 0x4F, 0x55, 0x6E, 0xBB, 0xA1, 0xB9, 0x0B, 0x1B, + 0xB6, 0xA6, 0xC5, 0x81, 0xA4, 0xB4, 0x7C, 0x3F, + 0xF5, 0x21, 0x89, 0x65, 0x2A, 0xAB, 0x36, 0xF5 + }, + { + 0x91, 0x91, 0xCF, 0x46, 0x1B, 0x69, 0x59, 0xBE, + 0xC9, 0x3E, 0xAE, 0x7F, 0xB1, 0xC6, 0xE3, 0x70, + 0x73, 0xD1, 0xA6, 0x15, 0x27, 0xAD, 0x75, 0xD1, + 0x0B, 0x7F, 0x89, 0x49, 0xD9, 0xB8, 0xAF, 0x70, + 0xA2, 0x3A, 0xD1, 0x31, 0x2E, 0xD5, 0x1F, 0x70, + 0xF0, 0xE9, 0xDF, 0x60, 0x1D, 0xDA, 0xE2, 0x38, + 0x90, 0x6C, 0x0F, 0xE3, 0xF7, 0x66, 0xB1, 0x4F, + 0x11, 0x3B, 0x26, 0xBC, 0x85, 0x42, 0xD1, 0xD2 + }, + { + 0x2A, 0x8B, 0xAD, 0xE2, 0x72, 0xEE, 0x7A, 0xC6, + 0x43, 0xC5, 0xE3, 0x71, 0x47, 0xFA, 0xAC, 0x92, + 0xC3, 0x97, 0x0B, 0xD3, 0x86, 0x2F, 0x53, 0x1E, + 0x5D, 0xCE, 0xA5, 0xCE, 0xAC, 0xD1, 0x83, 0x74, + 0x53, 0xAA, 0x49, 0x8D, 0x78, 0x5B, 0x4D, 0x1F, + 0x89, 0xE1, 0xB2, 0xA7, 0x39, 0xCA, 0x4A, 0x38, + 0x49, 0x87, 0x30, 0x27, 0x46, 0xB4, 0xF1, 0x13, + 0x42, 0x43, 0x02, 0xC4, 0xA1, 0xE0, 0xF9, 0xDF + }, + { + 0x32, 0x3E, 0x67, 0x93, 0xC7, 0xDD, 0x9B, 0x4D, + 0x7B, 0xB7, 0xFB, 0xF2, 0x15, 0x31, 0xD3, 0x7F, + 0x72, 0x64, 0x53, 0x2C, 0x58, 0xF1, 0x22, 0x55, + 0x48, 0xD0, 0x6E, 0x69, 0x40, 0xC6, 0x3E, 0x91, + 0x27, 0x09, 0x90, 0xE7, 0xF5, 0x64, 0x32, 0x03, + 0xC9, 0x87, 0x64, 0x7E, 0x5C, 0xF6, 0x61, 0x03, + 0xE7, 0x9B, 0x71, 0x4C, 0x58, 0x1B, 0xD8, 0x77, + 0x2E, 0x19, 0xD0, 0xF0, 0x05, 0xDC, 0x86, 0x33 + }, + { + 0xF9, 0x22, 0x07, 0x6D, 0x29, 0x5D, 0x23, 0xE2, + 0x98, 0x58, 0x30, 0xAA, 0xD2, 0xF2, 0x3F, 0x65, + 0x2F, 0x7F, 0x4D, 0xB4, 0x2C, 0x11, 0x9E, 0xD2, + 0x20, 0xA5, 0x45, 0x14, 0x88, 0xA4, 0x53, 0xF5, + 0x9F, 0xA8, 0xA2, 0xDE, 0x23, 0x03, 0x00, 0x0D, + 0x6B, 0xFD, 0x8C, 0x48, 0x23, 0xA8, 0x5F, 0xAD, + 0xB4, 0xFB, 0x8E, 0x7E, 0xAC, 0x12, 0x2B, 0xF0, + 0x12, 0x47, 0xD7, 0x6F, 0x65, 0x24, 0x7D, 0x45 + }, + { + 0xDC, 0x40, 0x00, 0x95, 0x60, 0x95, 0x92, 0x91, + 0x55, 0x8E, 0xBE, 0x07, 0x20, 0x64, 0xCE, 0x67, + 0x12, 0xC9, 0x21, 0xB5, 0x40, 0x9B, 0x44, 0xE0, + 0x4F, 0x9A, 0x56, 0x5E, 0xEA, 0xDD, 0x39, 0xA7, + 0x71, 0x6E, 0x21, 0xB4, 0x6D, 0xD8, 0x61, 0x65, + 0x17, 0xA2, 0x1A, 0x0C, 0x03, 0x41, 0x9E, 0x94, + 0xDB, 0x82, 0x0A, 0x35, 0x3F, 0x15, 0x2D, 0x10, + 0x83, 0x84, 0xBE, 0x94, 0x70, 0x09, 0x3F, 0x89 + }, + { + 0x7F, 0xA4, 0xBE, 0x91, 0xCA, 0x52, 0x07, 0xFF, + 0x08, 0x7D, 0xE9, 0x2F, 0x1D, 0xB0, 0x9B, 0xF7, + 0x1A, 0x67, 0x87, 0x8B, 0xED, 0x19, 0x3A, 0x5C, + 0x2C, 0xC4, 0xE3, 0x53, 0x23, 0xB8, 0xDF, 0x99, + 0xA2, 0x6E, 0xCB, 0x98, 0x88, 0xD7, 0xB3, 0x4A, + 0x73, 0x9D, 0x64, 0x1A, 0x0E, 0xCD, 0x0A, 0x66, + 0x47, 0xA6, 0xA0, 0x64, 0x26, 0xF3, 0xCC, 0x1F, + 0xEF, 0xDF, 0x90, 0x69, 0x92, 0x2F, 0xAE, 0x4C + }, + { + 0xBA, 0xD3, 0xCD, 0x75, 0x90, 0x5D, 0x7B, 0xFD, + 0xA3, 0x32, 0x2B, 0x44, 0xA7, 0xD3, 0x58, 0x87, + 0x14, 0xD3, 0x33, 0xEE, 0x86, 0x85, 0x5A, 0x87, + 0x27, 0x47, 0xE7, 0x04, 0xF6, 0x11, 0x94, 0x84, + 0xBD, 0xB7, 0xD0, 0x77, 0xFA, 0x08, 0xED, 0xC4, + 0xA7, 0x9D, 0xE0, 0xF4, 0x3F, 0xCA, 0x8D, 0x43, + 0x6E, 0x8A, 0x10, 0x08, 0x57, 0xF5, 0x9B, 0xC7, + 0xB0, 0x55, 0xB9, 0x87, 0xF9, 0x7A, 0xC6, 0xB9 + }, + { + 0xB7, 0xDE, 0xE8, 0xE8, 0x33, 0x9D, 0xB2, 0x97, + 0xFD, 0xAA, 0x3C, 0xA5, 0xC1, 0xDC, 0x19, 0x88, + 0xD9, 0x7F, 0x5F, 0xB6, 0x20, 0x8C, 0x64, 0xDE, + 0xA9, 0x5E, 0x1C, 0x78, 0xF3, 0x37, 0xCE, 0x20, + 0xA2, 0xB4, 0xDF, 0x17, 0xA7, 0xB8, 0x23, 0x6A, + 0x90, 0xD6, 0x28, 0x67, 0x33, 0x16, 0x35, 0x72, + 0xC8, 0x67, 0xD9, 0x3D, 0xE8, 0x9E, 0xF6, 0x2F, + 0xA0, 0x5D, 0xAB, 0x70, 0x7E, 0xC3, 0xA7, 0x70 + }, + { + 0xA0, 0xF7, 0xE9, 0x3C, 0xF3, 0x25, 0x02, 0xB9, + 0xFD, 0x79, 0xEC, 0x20, 0x54, 0x62, 0x07, 0xF3, + 0x31, 0xC5, 0x29, 0x9E, 0xCE, 0xF3, 0x50, 0xD6, + 0x6E, 0xA8, 0x55, 0xC8, 0x7F, 0xBD, 0xDF, 0x18, + 0xE6, 0x91, 0xC2, 0x0D, 0x04, 0x5A, 0x30, 0x8F, + 0x83, 0xF6, 0xCB, 0x8F, 0xCA, 0x69, 0xD7, 0xE2, + 0xB3, 0x9B, 0x34, 0xD2, 0xF8, 0x77, 0x27, 0x6C, + 0x19, 0x6B, 0xF5, 0x14, 0xBA, 0xC6, 0x02, 0x70 + }, + { + 0x6F, 0x50, 0x93, 0xCF, 0xC8, 0x83, 0x00, 0xBF, + 0x68, 0x8E, 0x88, 0x4B, 0x4C, 0x5E, 0xC2, 0xC3, + 0x1A, 0x8C, 0xC2, 0x8D, 0x63, 0x31, 0xAD, 0x7C, + 0xA7, 0x1D, 0x97, 0x60, 0x21, 0x64, 0x82, 0x05, + 0x28, 0x15, 0xD4, 0x4F, 0xC6, 0x9E, 0x18, 0xA8, + 0xDC, 0x8B, 0xD7, 0x1B, 0x31, 0xF2, 0xB5, 0x89, + 0xA7, 0xC0, 0x78, 0x0B, 0x61, 0x99, 0x38, 0x5F, + 0x8D, 0xAE, 0x6C, 0x9B, 0x79, 0x74, 0xC4, 0xCB + }, + { + 0x3C, 0xFF, 0x46, 0xAC, 0x35, 0x46, 0xF6, 0x5A, + 0xD7, 0xA7, 0x20, 0x87, 0x1A, 0xFA, 0x20, 0xA9, + 0x21, 0x6D, 0xDA, 0x5C, 0x45, 0x18, 0x81, 0x56, + 0xA5, 0xBB, 0xED, 0xF2, 0x15, 0x46, 0xD4, 0xBB, + 0x39, 0x40, 0xB2, 0x1A, 0x41, 0xA3, 0x94, 0x03, + 0xE3, 0xCF, 0xD5, 0xE7, 0xA0, 0xE7, 0x90, 0x4D, + 0xA9, 0x5F, 0x4D, 0x8E, 0x0C, 0x5B, 0xF5, 0xB7, + 0x0E, 0xB0, 0x29, 0x55, 0x6E, 0xFD, 0x49, 0x7E + }, + { + 0xAF, 0x66, 0x8A, 0x80, 0x5E, 0x6D, 0x70, 0x4B, + 0x1E, 0x58, 0x1F, 0x1E, 0x8E, 0x3C, 0x00, 0xCF, + 0x4C, 0xF3, 0xE5, 0x46, 0x14, 0x7C, 0x40, 0x6D, + 0x17, 0xCA, 0x97, 0x4D, 0x19, 0xA0, 0x14, 0xC7, + 0x8B, 0x44, 0xE7, 0x2D, 0xDE, 0xEB, 0x65, 0x26, + 0x07, 0xE8, 0x6D, 0x69, 0x02, 0x59, 0xDC, 0xAB, + 0x0D, 0xDA, 0x81, 0xC7, 0x7C, 0x7E, 0xE2, 0x72, + 0x1E, 0x82, 0xBB, 0xB1, 0x39, 0x43, 0x07, 0x1D + }, + { + 0x79, 0xDD, 0xEB, 0x5C, 0x54, 0xDE, 0xD1, 0xE4, + 0x48, 0x40, 0x71, 0xC4, 0x6B, 0xB4, 0x28, 0x02, + 0xD2, 0x3B, 0x3A, 0x08, 0xC1, 0x23, 0x11, 0xBE, + 0x36, 0x3C, 0x7C, 0x7A, 0x02, 0x5A, 0x17, 0x64, + 0xC8, 0xD8, 0x50, 0x69, 0xFD, 0xA8, 0xD5, 0x17, + 0x77, 0x7D, 0x8D, 0xD8, 0x09, 0xE3, 0xD4, 0xA9, + 0x56, 0x04, 0x1A, 0x70, 0x79, 0xF9, 0x16, 0x7B, + 0x0F, 0xE9, 0x71, 0x2E, 0x5F, 0x12, 0x29, 0xF5 + }, + { + 0x99, 0x8E, 0x82, 0xF4, 0x26, 0x3D, 0x53, 0xAE, + 0xDA, 0xC9, 0x39, 0xEB, 0xB6, 0xEB, 0x8B, 0x19, + 0x69, 0x74, 0x6C, 0xB8, 0x15, 0xBD, 0x72, 0x1F, + 0x17, 0xA4, 0x8B, 0xEE, 0x9E, 0xCF, 0xF2, 0xFE, + 0x59, 0x8C, 0x53, 0x9C, 0x41, 0x9A, 0x60, 0xE0, + 0xD5, 0xA0, 0x4F, 0x1C, 0xB5, 0x23, 0xA2, 0xFD, + 0x05, 0x38, 0xBB, 0x17, 0x8E, 0x44, 0x75, 0x8D, + 0x31, 0x59, 0xAB, 0x9E, 0x02, 0x84, 0x01, 0xA3 + }, + { + 0x33, 0x96, 0xCF, 0xD5, 0xCD, 0xE1, 0x4A, 0xEC, + 0x1A, 0xAE, 0xD3, 0xE1, 0x22, 0x52, 0xCF, 0xD6, + 0xE3, 0x42, 0xED, 0x25, 0x5E, 0x8E, 0x9E, 0x1B, + 0xE1, 0x0F, 0x1F, 0x27, 0x38, 0x77, 0xF3, 0x63, + 0x33, 0x81, 0xE3, 0xC9, 0x61, 0xE6, 0x7E, 0xC4, + 0x1E, 0x8F, 0x9E, 0x16, 0x11, 0x0F, 0xC0, 0x3D, + 0xDE, 0x88, 0xBF, 0xC0, 0x96, 0xFC, 0x15, 0x14, + 0x46, 0x1D, 0x70, 0xD0, 0xBE, 0xCE, 0x0A, 0xF6 + }, + { + 0x77, 0x7D, 0x9D, 0xC5, 0x5A, 0x2F, 0x57, 0xA4, + 0x6E, 0xA0, 0x6A, 0x2F, 0x4C, 0xB9, 0x76, 0x0D, + 0x00, 0xD7, 0xA8, 0x62, 0xD0, 0xA2, 0xAA, 0x19, + 0x46, 0x7B, 0x57, 0x0F, 0x7C, 0x7D, 0x5E, 0xA7, + 0x62, 0x9A, 0x95, 0xEB, 0x20, 0x0E, 0x1F, 0x9D, + 0xB0, 0x66, 0x10, 0xCF, 0x8E, 0x30, 0xD5, 0xE6, + 0xAD, 0x0A, 0x7B, 0x63, 0x29, 0x77, 0xFC, 0x21, + 0xBB, 0x17, 0x89, 0x67, 0xF3, 0xB0, 0xE0, 0x9B + }, + { + 0x32, 0xEE, 0x35, 0x7F, 0xC9, 0x16, 0x36, 0xA8, + 0x55, 0xBA, 0x01, 0xA0, 0xB8, 0xDA, 0x6F, 0x35, + 0x53, 0xB1, 0xD5, 0x20, 0xAD, 0xCF, 0xE8, 0xFE, + 0x9D, 0xEB, 0xCC, 0xB2, 0x6C, 0x5C, 0x4C, 0xE8, + 0x50, 0x5B, 0xB1, 0xEF, 0xB5, 0xED, 0x5B, 0xAA, + 0x4C, 0x52, 0x45, 0xB5, 0x0D, 0x74, 0x46, 0x3F, + 0x07, 0x67, 0xB2, 0xC7, 0x83, 0xC4, 0x7A, 0x93, + 0xB0, 0xFD, 0xA6, 0x68, 0x95, 0x69, 0x3C, 0xE6 + }, + { + 0x34, 0x0C, 0x0A, 0x7C, 0xE4, 0x96, 0xFE, 0xBD, + 0xA1, 0x3F, 0xA2, 0x40, 0x7A, 0x21, 0xDC, 0x19, + 0x83, 0x9B, 0xED, 0xAE, 0x1A, 0x08, 0x6A, 0xD0, + 0xFE, 0xD3, 0x91, 0x7D, 0xF9, 0xBF, 0x40, 0x94, + 0x4A, 0x78, 0x7F, 0x64, 0x1E, 0x90, 0xDD, 0xBA, + 0xE0, 0x3A, 0x93, 0x37, 0x72, 0x3E, 0x51, 0x66, + 0x8F, 0xB8, 0x93, 0x77, 0x2C, 0x0F, 0xBD, 0xB3, + 0xEB, 0x7E, 0xF7, 0x90, 0xDF, 0xCB, 0xB9, 0xAB + }, + { + 0xD8, 0x6A, 0x5B, 0xAA, 0x33, 0x65, 0xAB, 0xD8, + 0xF4, 0x42, 0xCD, 0x6E, 0xBB, 0x93, 0x11, 0x38, + 0x19, 0xF0, 0xB4, 0x60, 0x61, 0xE1, 0x34, 0x04, + 0xEF, 0xAA, 0x1A, 0x58, 0xE1, 0xFF, 0x27, 0x2A, + 0xD4, 0xBF, 0xD3, 0x08, 0x15, 0xAD, 0xD8, 0x8A, + 0xD9, 0x8F, 0xCE, 0x9A, 0xF0, 0x18, 0x37, 0x4C, + 0xA6, 0x0D, 0x89, 0x79, 0x0F, 0x71, 0xA6, 0x07, + 0x5F, 0x3D, 0x68, 0xD3, 0x20, 0x21, 0xA9, 0xEB + }, + { + 0xA6, 0x7E, 0x6E, 0xC6, 0x57, 0xC9, 0x5E, 0xAB, + 0x3C, 0x3C, 0x32, 0xE4, 0x1F, 0xBF, 0x39, 0xCF, + 0x20, 0x33, 0xAB, 0x4B, 0xE2, 0xE2, 0xB8, 0x21, + 0x10, 0x4A, 0xDB, 0xE6, 0x9D, 0x16, 0xE9, 0x48, + 0xDC, 0xE4, 0xC4, 0xC6, 0xA3, 0xCF, 0x22, 0x76, + 0x90, 0x1F, 0x7D, 0x4F, 0xFD, 0x69, 0x65, 0x46, + 0x49, 0x88, 0x2C, 0x01, 0x4D, 0x2C, 0x10, 0xA1, + 0x30, 0x2B, 0x79, 0xC6, 0x15, 0x69, 0xCD, 0x36 + }, + { + 0x55, 0xCE, 0x19, 0x2A, 0xE4, 0xB3, 0xEA, 0xF8, + 0x55, 0x59, 0x0E, 0x2D, 0x44, 0xE6, 0x25, 0xD9, + 0xBA, 0x14, 0x6E, 0xB7, 0x50, 0x48, 0xE6, 0xB5, + 0x6E, 0x02, 0x50, 0x31, 0xEF, 0xBA, 0x0B, 0xDA, + 0x8A, 0xAA, 0xFA, 0x04, 0x70, 0xB7, 0xAC, 0x3D, + 0x40, 0x6E, 0x5A, 0xBA, 0x3E, 0x83, 0x2F, 0x27, + 0xA5, 0x07, 0x24, 0x6D, 0x1B, 0x5F, 0x33, 0xDE, + 0xA1, 0xF7, 0x24, 0xE2, 0xB8, 0x1B, 0x0C, 0x98 + }, + { + 0xB3, 0xA2, 0x0C, 0x1F, 0xB0, 0xB4, 0xF0, 0xD3, + 0x77, 0x26, 0xC2, 0x3B, 0x58, 0x77, 0xDD, 0x8E, + 0x72, 0xF6, 0x98, 0x86, 0xE0, 0x9A, 0x8C, 0x68, + 0xCF, 0xC3, 0x01, 0xD2, 0xA3, 0xF2, 0xF9, 0x5C, + 0xEF, 0xCF, 0xAB, 0xB8, 0x88, 0x99, 0x03, 0xC7, + 0x32, 0xF4, 0xE8, 0x14, 0x32, 0xD3, 0xF6, 0x78, + 0xCC, 0xDF, 0xC3, 0x98, 0xAC, 0xD8, 0xA2, 0xF0, + 0x66, 0x41, 0x10, 0x04, 0x50, 0xD8, 0x9F, 0x32 + }, + { + 0xF7, 0x27, 0x2D, 0x93, 0xC7, 0x01, 0x2D, 0x38, + 0xB2, 0x7F, 0x0C, 0x9A, 0xE2, 0x01, 0x79, 0x58, + 0xBB, 0xA6, 0x66, 0xA9, 0xDE, 0x1E, 0x88, 0x12, + 0xE9, 0x74, 0x37, 0xAE, 0xB2, 0xE0, 0x3C, 0x99, + 0x94, 0x38, 0xF0, 0xBE, 0x33, 0x3D, 0x09, 0xAD, + 0xDB, 0xCF, 0xAA, 0xC7, 0xAA, 0x73, 0xF7, 0xB6, + 0xCC, 0xEC, 0x67, 0xDC, 0x07, 0x79, 0x98, 0xDE, + 0xDB, 0x8C, 0x13, 0x32, 0xBA, 0xC0, 0xFB, 0xA8 + }, + { + 0x1F, 0xE7, 0xB3, 0xDE, 0x34, 0xC0, 0x47, 0x9C, + 0xA8, 0x40, 0x5F, 0x3C, 0xBC, 0xD2, 0xDB, 0x64, + 0xBB, 0x18, 0xDB, 0xB2, 0x91, 0xA5, 0xFE, 0xAA, + 0x16, 0xC5, 0x22, 0x8C, 0x93, 0xEE, 0x21, 0xC7, + 0x11, 0xD6, 0x8A, 0x01, 0x0C, 0x2A, 0xE8, 0x80, + 0x05, 0xEB, 0xAC, 0x95, 0x9E, 0x3A, 0x32, 0x24, + 0x52, 0xF8, 0x62, 0xDD, 0xE9, 0x4B, 0xB9, 0x41, + 0x81, 0x3E, 0x52, 0x4D, 0x23, 0x47, 0xFE, 0xEE + }, + { + 0x4E, 0xE1, 0xD3, 0x88, 0x05, 0xC3, 0x22, 0x84, + 0xEC, 0xEB, 0xE9, 0x2E, 0x3D, 0xF6, 0xCD, 0x98, + 0xC7, 0xD6, 0x68, 0x0E, 0xAB, 0x0D, 0x68, 0x66, + 0x4F, 0x96, 0x70, 0x6C, 0x45, 0x63, 0x3B, 0x1E, + 0x26, 0x82, 0x22, 0xAA, 0x5A, 0x52, 0x79, 0xEF, + 0x01, 0xFC, 0x28, 0x54, 0x32, 0xAB, 0xEE, 0xD7, + 0x4B, 0xA3, 0xDF, 0x18, 0x9F, 0x50, 0xA9, 0x89, + 0xD5, 0x8E, 0x71, 0x30, 0x62, 0x2D, 0xAA, 0x59 + }, + { + 0x0E, 0x14, 0x05, 0x87, 0x1C, 0x87, 0xA5, 0xEA, + 0x40, 0x83, 0x42, 0xF3, 0x9D, 0x34, 0x94, 0xF9, + 0x39, 0xF7, 0x3C, 0x22, 0x60, 0xC2, 0xA4, 0x3A, + 0x5C, 0x9F, 0x1B, 0x57, 0x33, 0x0C, 0xCA, 0x40, + 0x93, 0xFC, 0x1F, 0x42, 0xF9, 0x6D, 0x83, 0x00, + 0x56, 0x77, 0x03, 0x7D, 0xB5, 0x1A, 0xEF, 0x26, + 0xF0, 0x54, 0x38, 0x05, 0x7A, 0xE7, 0x9E, 0xD1, + 0x44, 0x64, 0xFD, 0x8E, 0x57, 0xD1, 0x55, 0x86 + }, + { + 0x17, 0xC5, 0xCA, 0xB4, 0x09, 0x10, 0x73, 0x62, + 0x1B, 0x5C, 0x24, 0xC3, 0x36, 0x31, 0x6D, 0x0C, + 0xF6, 0x49, 0xBA, 0x1E, 0xFF, 0xEB, 0xFC, 0x87, + 0xE0, 0x43, 0x9C, 0xDF, 0x57, 0x88, 0x87, 0xB2, + 0x21, 0x65, 0x6D, 0x33, 0x9A, 0x6F, 0xD1, 0x98, + 0xAB, 0xAE, 0xE6, 0x7E, 0xA1, 0x88, 0xDD, 0x66, + 0x56, 0x78, 0x23, 0xFC, 0x22, 0x0C, 0x52, 0xB5, + 0x74, 0x90, 0x25, 0x14, 0x69, 0xD2, 0x5D, 0x8C + }, + { + 0x57, 0xDC, 0x27, 0x97, 0xD1, 0x42, 0x68, 0x1C, + 0x94, 0xFE, 0x48, 0x86, 0x26, 0x98, 0x6E, 0xD4, + 0xB2, 0x67, 0x03, 0xCB, 0xF6, 0xBF, 0xE5, 0x93, + 0x91, 0x64, 0x36, 0x57, 0x06, 0x5B, 0x2D, 0x46, + 0xE4, 0xB1, 0xDD, 0xB3, 0xAA, 0x83, 0x2C, 0x9B, + 0xD4, 0x49, 0x75, 0x5A, 0xC8, 0xB1, 0xBF, 0x93, + 0x68, 0x97, 0xFB, 0xC6, 0xAD, 0xE3, 0x78, 0xF2, + 0xBD, 0x64, 0x93, 0xE4, 0x86, 0xF4, 0x20, 0x29 + }, + { + 0x44, 0x12, 0xDD, 0x6B, 0xED, 0x6D, 0xB2, 0xA8, + 0x03, 0xC2, 0xE0, 0xDF, 0x8F, 0x58, 0x29, 0xE7, + 0xA4, 0xB0, 0x41, 0x78, 0x89, 0x51, 0x0D, 0xF7, + 0xDF, 0xEE, 0x49, 0x57, 0x4A, 0x71, 0xEC, 0x0D, + 0x9E, 0x0D, 0x46, 0x06, 0x50, 0x17, 0xC7, 0x2D, + 0xD9, 0x74, 0x39, 0x33, 0xCA, 0x83, 0x9A, 0x76, + 0x8D, 0xD1, 0x5A, 0xB0, 0xB7, 0xC1, 0x4C, 0x62, + 0x6A, 0x35, 0x41, 0x09, 0x69, 0x01, 0x96, 0xAE + }, + { + 0xD0, 0xEB, 0xC7, 0x71, 0x03, 0x1B, 0x7C, 0x16, + 0x00, 0x21, 0xC9, 0xB6, 0xFB, 0xB2, 0xB6, 0x70, + 0xE3, 0xB4, 0x02, 0x70, 0x02, 0x69, 0x07, 0xA3, + 0x91, 0x63, 0xDB, 0x18, 0x73, 0xEC, 0xC3, 0xB8, + 0x00, 0x11, 0x1D, 0xD7, 0xBF, 0x13, 0x8F, 0x83, + 0xA6, 0x10, 0xDC, 0x04, 0x6D, 0xA2, 0x68, 0xB7, + 0x2B, 0x8C, 0x90, 0x86, 0x92, 0x23, 0x77, 0xDB, + 0xED, 0x73, 0x94, 0x82, 0x43, 0xCA, 0x1E, 0x14 + }, + { + 0x10, 0xC4, 0xBA, 0x31, 0x55, 0x91, 0x69, 0x8D, + 0xFB, 0x91, 0xA5, 0x73, 0x37, 0x63, 0x18, 0x84, + 0xB4, 0x73, 0x8D, 0x9F, 0x59, 0x80, 0x78, 0x51, + 0xA6, 0x79, 0x84, 0x0C, 0xC2, 0x87, 0xAC, 0xE3, + 0x01, 0x1C, 0xCD, 0xC8, 0xF4, 0xA4, 0x85, 0xBB, + 0x19, 0x73, 0x40, 0x4E, 0xF9, 0xEE, 0x9B, 0x9C, + 0xF1, 0xEA, 0xDB, 0xC5, 0x40, 0x74, 0xC6, 0xD1, + 0x13, 0xDE, 0x8F, 0xC9, 0x1D, 0x07, 0x97, 0xEB + }, + { + 0x14, 0x64, 0x34, 0x7B, 0xE3, 0x2C, 0x79, 0x59, + 0x17, 0x2B, 0x74, 0x72, 0xD1, 0x1F, 0xE0, 0x78, + 0x44, 0xA5, 0x2E, 0x2D, 0x3B, 0x2D, 0x05, 0x8C, + 0xC6, 0xBC, 0xC0, 0xA8, 0xA2, 0x75, 0xD6, 0xB8, + 0x2B, 0x2D, 0x62, 0x63, 0x75, 0x5E, 0xAF, 0x2A, + 0x65, 0x88, 0xB6, 0xA1, 0xEB, 0x79, 0x9A, 0xF8, + 0x3A, 0x4C, 0xE7, 0x53, 0xF8, 0xC7, 0x5A, 0x22, + 0x84, 0xD0, 0x28, 0x5B, 0xAB, 0x5F, 0x7C, 0x1C + }, + { + 0xF4, 0x09, 0x23, 0x1E, 0xD1, 0x87, 0xF5, 0xC4, + 0xE8, 0x33, 0xFA, 0x9E, 0x30, 0x42, 0xAC, 0xA6, + 0xC8, 0x58, 0xB0, 0x8B, 0x49, 0x6B, 0x25, 0x31, + 0xF8, 0x4F, 0xD5, 0xCE, 0xA9, 0x3E, 0xCD, 0x06, + 0xDA, 0xFE, 0x0A, 0x10, 0xC3, 0xFF, 0x23, 0x76, + 0xC7, 0x4D, 0xC8, 0x0D, 0xA0, 0x7D, 0xA0, 0x18, + 0x64, 0xFB, 0xF2, 0x68, 0x59, 0x60, 0xB5, 0x40, + 0xB3, 0xA2, 0xE9, 0x42, 0xCB, 0x8D, 0x90, 0x9F + }, + { + 0x39, 0x51, 0x32, 0xC5, 0x80, 0xC3, 0x55, 0xB5, + 0xB0, 0xE2, 0x35, 0x33, 0x6C, 0x8D, 0xC1, 0x08, + 0x5E, 0x59, 0x59, 0x64, 0x04, 0x3D, 0x38, 0x9E, + 0x08, 0x1E, 0xFE, 0x48, 0x5B, 0xA4, 0xC6, 0x37, + 0x72, 0xDB, 0x8D, 0x7E, 0x0F, 0x18, 0x6C, 0x50, + 0x98, 0x2E, 0x12, 0x23, 0xEA, 0x78, 0x5A, 0xDC, + 0x74, 0x0B, 0x0C, 0xF2, 0x18, 0x70, 0x74, 0x58, + 0xB8, 0xB8, 0x03, 0x40, 0x42, 0xF9, 0x23, 0xC2 + }, + { + 0xF9, 0x2A, 0xBA, 0xCA, 0x21, 0x32, 0x29, 0x66, + 0x06, 0x49, 0xEF, 0x2D, 0x8F, 0x88, 0x11, 0x5B, + 0x5B, 0xED, 0x8A, 0xB5, 0xB9, 0xBC, 0xA9, 0xA1, + 0xB4, 0xC5, 0x24, 0x57, 0x03, 0x53, 0x10, 0xC4, + 0x1A, 0x6B, 0xEA, 0x2B, 0x23, 0xB7, 0x91, 0x8B, + 0x5B, 0x8B, 0xF3, 0x8B, 0x52, 0xEA, 0xC6, 0xFF, + 0x3B, 0x62, 0x13, 0xA5, 0x22, 0xF3, 0x81, 0xBE, + 0x7F, 0xF0, 0x90, 0x6D, 0xBA, 0x7B, 0xD0, 0x0C + }, + { + 0xCB, 0xAD, 0xE7, 0xAD, 0x3B, 0x5D, 0xEE, 0x0F, + 0xF1, 0xA4, 0x6B, 0x08, 0x2C, 0xF4, 0xE1, 0xE1, + 0xDC, 0x21, 0x62, 0x0D, 0xD2, 0xCC, 0x0E, 0xDC, + 0x2C, 0x70, 0x7A, 0x21, 0x62, 0xD2, 0x14, 0x99, + 0x69, 0xAB, 0xBB, 0x29, 0xC5, 0x72, 0x0B, 0x04, + 0xBD, 0x15, 0x68, 0xA9, 0x55, 0x61, 0x95, 0xE6, + 0x7F, 0x24, 0x32, 0x2D, 0xD9, 0xAA, 0x4E, 0x83, + 0x65, 0x19, 0x1A, 0xA5, 0xB6, 0xC4, 0x45, 0x79 + }, + { + 0xF5, 0x1B, 0x4A, 0xE4, 0xD4, 0xC5, 0x4A, 0x29, + 0xCF, 0x71, 0x35, 0xA8, 0xFE, 0x1E, 0xAB, 0xD5, + 0xE1, 0xBC, 0xBF, 0x82, 0x08, 0x96, 0x96, 0x7D, + 0xC4, 0x1E, 0x38, 0x49, 0xDA, 0xC2, 0x25, 0x07, + 0x69, 0x42, 0x10, 0xCA, 0x11, 0xC4, 0xEB, 0xF1, + 0xC2, 0x9A, 0x8D, 0x4F, 0x71, 0xB3, 0x0F, 0x76, + 0xC9, 0xB6, 0x01, 0x0A, 0xD9, 0x5B, 0xDF, 0xB0, + 0xDE, 0x83, 0x79, 0x25, 0xF0, 0x61, 0x25, 0x97 + }, + { + 0xCE, 0x38, 0x72, 0x11, 0x5D, 0x83, 0x3B, 0x34, + 0x56, 0xCA, 0x94, 0x2E, 0x6E, 0x38, 0x5F, 0x28, + 0xA9, 0x03, 0xBE, 0xAB, 0xFB, 0x75, 0x3F, 0x8A, + 0xFC, 0xCC, 0x12, 0xF2, 0x58, 0x2C, 0xE1, 0xF3, + 0x62, 0x12, 0xBD, 0x05, 0xE0, 0x5A, 0x46, 0xFC, + 0x88, 0xD3, 0x19, 0x50, 0xB4, 0x91, 0x1A, 0xE5, + 0xDC, 0xD8, 0xFF, 0x7A, 0x0B, 0x50, 0x47, 0x4C, + 0xB4, 0x88, 0xCC, 0xF2, 0xA8, 0x9C, 0xD0, 0xEB + }, + { + 0x9B, 0xB7, 0x4C, 0xBD, 0x47, 0xA6, 0x24, 0xCB, + 0xEA, 0xFC, 0xC1, 0x6D, 0x46, 0x29, 0x47, 0xBB, + 0xEA, 0x13, 0x70, 0xB8, 0x5C, 0x96, 0x1A, 0x40, + 0x7D, 0xF9, 0x86, 0x3E, 0x54, 0xE6, 0xD9, 0xE6, + 0xA8, 0xD2, 0xEF, 0x0C, 0x64, 0x97, 0x20, 0x5E, + 0x5E, 0xB7, 0xC3, 0xE5, 0x9E, 0x69, 0x8D, 0x99, + 0x24, 0x63, 0xCA, 0x9D, 0xD4, 0xCF, 0x28, 0xCF, + 0x9A, 0x2D, 0x4E, 0x30, 0xC1, 0x33, 0xE8, 0x55 + }, + { + 0x72, 0x96, 0x33, 0x82, 0x0B, 0xF0, 0x13, 0xD9, + 0xD2, 0xBD, 0x37, 0x3C, 0xCA, 0xC7, 0xBC, 0x9F, + 0x37, 0x16, 0xF6, 0x9E, 0x16, 0xA4, 0x4E, 0x94, + 0x9C, 0x7A, 0x9A, 0x93, 0xDC, 0xA1, 0x26, 0xBB, + 0x1A, 0xA5, 0x4E, 0x5E, 0x70, 0x40, 0x70, 0x7F, + 0x02, 0x87, 0x6A, 0xFD, 0x02, 0x0A, 0xF4, 0x72, + 0x63, 0x9D, 0x49, 0xF5, 0x42, 0x0D, 0x29, 0x4C, + 0x3A, 0xA3, 0x1D, 0x06, 0x7E, 0x3E, 0x85, 0x75 + }, + { + 0x06, 0x86, 0x1D, 0xB3, 0x07, 0xC6, 0x78, 0x08, + 0x6E, 0x8B, 0x2A, 0xEC, 0xDF, 0x18, 0x29, 0xD2, + 0x88, 0x3D, 0x28, 0xB7, 0x31, 0xAB, 0xD0, 0xF1, + 0xE7, 0x2F, 0x1C, 0xED, 0x6C, 0x7A, 0xD4, 0x17, + 0x2E, 0xCA, 0x63, 0x22, 0xA8, 0x3F, 0xB6, 0xA6, + 0x5A, 0xFA, 0x37, 0xE9, 0x4A, 0x3E, 0x2B, 0xA2, + 0x05, 0xB8, 0x7B, 0xF3, 0x82, 0xD9, 0x15, 0x88, + 0x49, 0x7A, 0x46, 0x50, 0x88, 0x3B, 0xD8, 0x75 + }, + { + 0x35, 0x6E, 0xCE, 0xAF, 0x17, 0x02, 0xB3, 0x70, + 0xF4, 0xAA, 0xB8, 0xEA, 0x82, 0x84, 0x86, 0xF3, + 0x30, 0x13, 0xF7, 0x44, 0xB3, 0x9E, 0x7E, 0xA2, + 0x6C, 0x69, 0x18, 0xD6, 0x0E, 0x1A, 0xBC, 0xF4, + 0x4F, 0xB1, 0x6E, 0xDC, 0xA7, 0x72, 0x0A, 0xCF, + 0xC6, 0xA7, 0x01, 0xBF, 0x1E, 0x2C, 0x35, 0xDD, + 0xBD, 0x69, 0x5A, 0x8D, 0x40, 0x8E, 0x8C, 0x96, + 0x32, 0xE8, 0xCD, 0x27, 0x23, 0x0C, 0xAD, 0x8D + }, + { + 0x48, 0x9A, 0x39, 0xD0, 0xFC, 0x3C, 0xDE, 0xAF, + 0x42, 0x89, 0x2E, 0xD8, 0x03, 0x85, 0xC1, 0x1C, + 0xE2, 0x93, 0xC9, 0x32, 0x21, 0x5B, 0xB2, 0x31, + 0x88, 0x69, 0x2A, 0x86, 0xE6, 0x1B, 0xCA, 0xD9, + 0x2C, 0x2A, 0x1D, 0x11, 0x42, 0x60, 0x1B, 0x1B, + 0xDF, 0x09, 0x82, 0xD1, 0xCD, 0x1E, 0x05, 0xC0, + 0x52, 0xDE, 0x81, 0x9E, 0x64, 0xF2, 0x47, 0xDB, + 0x35, 0x91, 0x5D, 0xD1, 0xDB, 0x79, 0xA3, 0xB5 + }, + { + 0xC0, 0x2F, 0x46, 0x4B, 0x4D, 0xD1, 0x81, 0x17, + 0xE3, 0x0A, 0x8D, 0xB8, 0xEF, 0x1D, 0xA0, 0x67, + 0x13, 0x4B, 0x60, 0x4E, 0xFA, 0x19, 0x51, 0x76, + 0x7E, 0xE6, 0x32, 0xDC, 0x02, 0x4D, 0x64, 0xC0, + 0x0F, 0x24, 0x49, 0xF0, 0x42, 0xDB, 0x3A, 0xEA, + 0x01, 0x74, 0xEB, 0xCD, 0xBB, 0x4F, 0xF5, 0x9D, + 0xAE, 0x75, 0x4F, 0x72, 0x39, 0x46, 0xF1, 0xB9, + 0x0A, 0x77, 0xFD, 0x95, 0x23, 0x69, 0x0B, 0x7B + }, + { + 0xFB, 0x31, 0xE6, 0xDD, 0xB8, 0x6D, 0xBF, 0xF3, + 0x72, 0x64, 0x6D, 0x1E, 0x3A, 0x3F, 0x31, 0xDD, + 0x61, 0x15, 0x9F, 0xC3, 0x93, 0x65, 0x8C, 0x2E, + 0xE9, 0x57, 0x10, 0x3B, 0xF2, 0x11, 0x6B, 0xDE, + 0xF8, 0x2C, 0x33, 0xE8, 0x69, 0xF3, 0xC8, 0x3A, + 0xC3, 0xC2, 0xF6, 0x38, 0x0C, 0xF6, 0x92, 0xF7, + 0xB1, 0xDC, 0xBA, 0xE0, 0xBB, 0x22, 0x7A, 0xD3, + 0x47, 0xE7, 0x54, 0x13, 0x74, 0x66, 0xC6, 0x9F + }, + { + 0x00, 0x60, 0x62, 0xAB, 0xE1, 0x6C, 0x2F, 0xE7, + 0x9A, 0xF8, 0x80, 0x85, 0xE0, 0xB5, 0x82, 0xB1, + 0x06, 0xE7, 0xF7, 0x9F, 0x01, 0xA4, 0x39, 0x46, + 0xC7, 0x8B, 0x19, 0xF9, 0xBD, 0xD7, 0x25, 0x99, + 0x76, 0x36, 0xA3, 0x32, 0xEB, 0x9A, 0x3A, 0xAA, + 0x6D, 0xE0, 0xD4, 0xA8, 0xE9, 0xE2, 0x8E, 0x8C, + 0x77, 0x87, 0x74, 0x22, 0x4C, 0x66, 0x5B, 0xF7, + 0xBC, 0x36, 0x44, 0xFC, 0xE4, 0x11, 0x22, 0x8C + }, + { + 0xD4, 0x4A, 0x6D, 0xB3, 0xDE, 0x9F, 0xD4, 0xE4, + 0xA7, 0xEF, 0x15, 0x5A, 0x01, 0xBC, 0xCB, 0x91, + 0xC1, 0xBC, 0xF1, 0xCB, 0x53, 0x22, 0x56, 0x89, + 0xA7, 0x7A, 0x0D, 0x23, 0xB4, 0xD3, 0x9A, 0x89, + 0xA1, 0x89, 0xF2, 0x89, 0x80, 0xF9, 0x1C, 0x56, + 0xEA, 0xC5, 0x87, 0x9E, 0xAE, 0x93, 0x3C, 0xED, + 0x7F, 0x26, 0x7E, 0x2F, 0x70, 0x40, 0xEB, 0x38, + 0x0F, 0xDB, 0xBF, 0x34, 0xA6, 0xB7, 0xB6, 0x15 + }, + { + 0x5A, 0xFB, 0xFE, 0xA1, 0xDE, 0xDA, 0x5A, 0xEA, + 0xB9, 0x2E, 0x4D, 0x0C, 0x31, 0xD1, 0x6A, 0x9A, + 0x86, 0xBF, 0x7C, 0x75, 0x23, 0x27, 0x4A, 0x05, + 0xC5, 0x05, 0x29, 0xF5, 0xC1, 0x39, 0xDB, 0x10, + 0x93, 0x3A, 0x52, 0xC6, 0x22, 0x9C, 0xD3, 0x11, + 0x08, 0xF0, 0x83, 0xFB, 0x0C, 0x85, 0xCF, 0x52, + 0x83, 0x1B, 0x5A, 0x05, 0xF2, 0x55, 0x0A, 0x77, + 0xB5, 0x70, 0x3C, 0xC6, 0x68, 0x91, 0x2D, 0xBC + }, + { + 0xD1, 0x7F, 0xCA, 0xD4, 0xE0, 0xD8, 0xBD, 0xE2, + 0xED, 0xFD, 0xA1, 0x68, 0xBA, 0x47, 0x10, 0x4B, + 0xBC, 0xA4, 0xD2, 0x6D, 0xA2, 0xD3, 0x1A, 0x07, + 0x0B, 0x0F, 0xBA, 0x0B, 0x26, 0xEE, 0xDD, 0x95, + 0xEE, 0xC1, 0xFC, 0x34, 0xD7, 0x6C, 0xD4, 0xA1, + 0xCB, 0x15, 0xF2, 0x62, 0x16, 0x88, 0xA9, 0xCC, + 0x0E, 0x96, 0x35, 0x8D, 0xE9, 0x93, 0x22, 0x2B, + 0xB3, 0xE3, 0xCD, 0x0B, 0xFD, 0xCB, 0x74, 0x6C + }, + { + 0xBD, 0x6A, 0x59, 0x21, 0x63, 0x37, 0xB4, 0x5D, + 0x6B, 0x71, 0xAE, 0xAC, 0x01, 0x36, 0x6B, 0xFE, + 0x96, 0x60, 0xE0, 0xFB, 0xC2, 0x95, 0x9A, 0xDB, + 0xB6, 0x8D, 0x52, 0x6C, 0x43, 0xD4, 0x8F, 0xFF, + 0xFE, 0x2F, 0xFC, 0x43, 0x05, 0x88, 0xE7, 0x8E, + 0x66, 0x54, 0x6A, 0x3C, 0x70, 0x9B, 0x0A, 0xCE, + 0xA1, 0x7C, 0xBC, 0x5A, 0x21, 0x8C, 0x53, 0xCD, + 0x47, 0xAA, 0x48, 0x71, 0xC1, 0xDD, 0x98, 0x4A + }, + { + 0x83, 0xEA, 0x5A, 0xE1, 0x89, 0x11, 0x45, 0xC4, + 0x1A, 0x7C, 0x6C, 0x87, 0xFE, 0x92, 0x24, 0x87, + 0xF5, 0xD2, 0x82, 0x93, 0x35, 0x69, 0xB7, 0xAE, + 0x0E, 0x34, 0x56, 0x53, 0x38, 0x1E, 0xDE, 0x6D, + 0x4B, 0x16, 0xE1, 0x44, 0xD1, 0xC3, 0xE8, 0xF0, + 0x60, 0x5D, 0xAA, 0x0D, 0xB5, 0x96, 0x5A, 0x7B, + 0x79, 0xD9, 0x1A, 0x8A, 0xFE, 0x11, 0xF1, 0xE0, + 0xBC, 0x54, 0x9A, 0xC0, 0x74, 0xA0, 0x1A, 0xB7 + }, + { + 0x37, 0x50, 0x50, 0xCF, 0x2E, 0x43, 0x0D, 0x0E, + 0x29, 0x87, 0x58, 0x35, 0x20, 0x8E, 0x89, 0x06, + 0xD7, 0x05, 0x2E, 0x47, 0x29, 0x2C, 0x5A, 0x38, + 0xA6, 0x30, 0x82, 0x87, 0x3D, 0x31, 0xD5, 0x83, + 0x13, 0x5C, 0x07, 0xA2, 0x0C, 0x52, 0xD9, 0x5B, + 0x2D, 0x5D, 0xC3, 0xEA, 0xDE, 0x6B, 0xE1, 0x43, + 0xCA, 0x34, 0x38, 0xF4, 0x4D, 0x02, 0x0A, 0xAE, + 0x16, 0x0E, 0xD7, 0x7A, 0xB9, 0x88, 0x4F, 0x7D + }, + { + 0x30, 0x28, 0xB0, 0xE8, 0x24, 0x95, 0x7F, 0xF3, + 0xB3, 0x05, 0xE9, 0x7F, 0xF5, 0x92, 0xAA, 0x8E, + 0xF2, 0x9B, 0x3B, 0xEC, 0x1D, 0xC4, 0x7B, 0x76, + 0x13, 0x3D, 0x10, 0x3F, 0xFE, 0x38, 0x71, 0xBF, + 0x05, 0x12, 0xA2, 0x31, 0xAF, 0xCB, 0x1D, 0xF8, + 0x65, 0x97, 0xEC, 0x5E, 0x46, 0xE9, 0x23, 0xC8, + 0xB9, 0x85, 0xC2, 0x85, 0x08, 0x57, 0xC6, 0x40, + 0x01, 0xB2, 0xC5, 0x51, 0xEA, 0x83, 0x3D, 0x0E + }, + { + 0x08, 0x7C, 0xCB, 0x1E, 0x5B, 0xD1, 0x72, 0x22, + 0xB8, 0xAF, 0x20, 0x6D, 0xD6, 0x39, 0x08, 0xF8, + 0x91, 0x72, 0x97, 0x62, 0x1A, 0x8C, 0xB9, 0x33, + 0x0A, 0xE0, 0xBA, 0x4A, 0xF3, 0xE9, 0xD6, 0x0C, + 0x98, 0xFC, 0xF1, 0xEF, 0xFC, 0xEC, 0x20, 0x13, + 0x6B, 0x4F, 0x91, 0x88, 0x12, 0x6D, 0xFA, 0x04, + 0x4E, 0x1C, 0x1C, 0xCD, 0xA3, 0xCE, 0xD8, 0x73, + 0x73, 0xD9, 0x37, 0x9C, 0xCB, 0xED, 0xBD, 0xB3 + }, + { + 0x7F, 0x17, 0x06, 0x24, 0x98, 0xBF, 0xA2, 0xBB, + 0x58, 0x56, 0xCD, 0x0A, 0x62, 0xC5, 0x68, 0xC5, + 0xC6, 0xB8, 0x97, 0x43, 0x24, 0x74, 0xEF, 0xB2, + 0xE6, 0xA2, 0xEE, 0x18, 0xCA, 0xFF, 0xD2, 0x1E, + 0x1E, 0xF3, 0x0D, 0x06, 0x47, 0x23, 0x85, 0x0F, + 0x79, 0x90, 0xD2, 0x1B, 0xA3, 0x4E, 0x8F, 0x2B, + 0x3B, 0xB0, 0x67, 0x02, 0x3A, 0x77, 0x27, 0x82, + 0x15, 0x8A, 0x27, 0xC6, 0xC4, 0x67, 0xC9, 0x28 + }, + { + 0x6B, 0xA9, 0x86, 0xA9, 0x42, 0x49, 0x7F, 0xD3, + 0x84, 0x62, 0x97, 0x2F, 0x50, 0xA6, 0x19, 0x68, + 0xC0, 0x65, 0x2D, 0xAC, 0x56, 0xCE, 0x9B, 0x9A, + 0xC1, 0xBC, 0x06, 0x1A, 0xB6, 0x34, 0xFE, 0x5A, + 0x77, 0xAC, 0xD0, 0x27, 0x5F, 0x83, 0x96, 0xE3, + 0xC0, 0xBE, 0xF0, 0x12, 0xAE, 0x93, 0xB7, 0x27, + 0x58, 0xB8, 0xD7, 0x67, 0x9C, 0x87, 0xE8, 0x47, + 0xE6, 0x30, 0x17, 0xB5, 0x5A, 0x69, 0xC5, 0xC6 + }, + { + 0x96, 0x7C, 0x81, 0xF5, 0x61, 0x95, 0x18, 0x33, + 0xFA, 0x56, 0x6F, 0x6B, 0x36, 0x07, 0x7E, 0xAD, + 0xB2, 0xA6, 0x15, 0xCC, 0x15, 0xF0, 0xED, 0xBB, + 0xAE, 0x4F, 0x84, 0x4D, 0xDC, 0x8E, 0x9C, 0x1F, + 0xB8, 0x3D, 0x31, 0xA9, 0x3F, 0xCB, 0x17, 0x74, + 0xD7, 0x40, 0xD6, 0x92, 0x08, 0xCA, 0x59, 0x30, + 0xBC, 0xFA, 0xC4, 0xA1, 0xF9, 0x44, 0x46, 0x9F, + 0xEF, 0xD1, 0x9B, 0x6E, 0x93, 0x75, 0xE0, 0xB5 + }, + { + 0xE8, 0xAE, 0xF1, 0x78, 0xE6, 0xDA, 0x3E, 0xF5, + 0xCA, 0xED, 0x65, 0x30, 0xF7, 0xEB, 0x25, 0x60, + 0x82, 0x56, 0xC2, 0x37, 0x7C, 0x4C, 0xF9, 0x6B, + 0x0C, 0xFD, 0x0D, 0x76, 0xEE, 0xB4, 0xBB, 0x86, + 0xEE, 0xFF, 0x7B, 0x7D, 0xF1, 0x58, 0x5C, 0x8D, + 0x7A, 0x20, 0xC0, 0x63, 0x3A, 0x67, 0x90, 0x7F, + 0x6D, 0x28, 0x67, 0xC3, 0x26, 0x4A, 0x91, 0xC0, + 0x51, 0xAB, 0xAE, 0x6E, 0xEA, 0x5A, 0x91, 0xD8 + }, + { + 0x64, 0x81, 0xDC, 0xC8, 0x15, 0x7A, 0xE6, 0x28, + 0xB5, 0xCD, 0x52, 0x6B, 0xAC, 0x8F, 0x93, 0x31, + 0x56, 0xDE, 0xDA, 0xC9, 0x56, 0xA2, 0xB2, 0x2A, + 0x97, 0x4B, 0xF5, 0xF7, 0xEC, 0x2D, 0xB5, 0x80, + 0x6F, 0x53, 0xDD, 0x0E, 0x2D, 0xD5, 0x3D, 0xB8, + 0x7C, 0xD8, 0xF5, 0x8A, 0x58, 0x6F, 0x9B, 0x3C, + 0x5C, 0x52, 0x23, 0x31, 0xA3, 0x11, 0x74, 0xC4, + 0xE7, 0xB9, 0xB6, 0xF7, 0xF0, 0x57, 0xC2, 0x8F + }, + { + 0xA7, 0x1E, 0xA4, 0x5C, 0xE6, 0x61, 0x6A, 0x3D, + 0x2F, 0x0A, 0x59, 0x2D, 0x5D, 0x02, 0x86, 0x93, + 0x2D, 0xA6, 0x3C, 0x6D, 0xB1, 0x1D, 0x59, 0xC6, + 0x69, 0x1C, 0x35, 0xA5, 0x6F, 0x7E, 0xE4, 0xF8, + 0x0B, 0x6F, 0xC3, 0x40, 0xB4, 0xDB, 0xC1, 0x84, + 0x4C, 0x50, 0x40, 0xE6, 0x68, 0xD2, 0x89, 0x2F, + 0x4A, 0x4A, 0xE8, 0x53, 0x3F, 0x1B, 0x67, 0x71, + 0xBC, 0xFC, 0xE7, 0xC3, 0xA2, 0x3E, 0x0D, 0x97 + }, + { + 0x96, 0x93, 0x44, 0x87, 0x70, 0xFE, 0xAE, 0x42, + 0x17, 0x26, 0xEB, 0x20, 0x3B, 0x01, 0xC7, 0x08, + 0x23, 0xD5, 0xF4, 0x4C, 0xC5, 0x21, 0x3E, 0x6A, + 0x68, 0x28, 0x47, 0x29, 0xBD, 0x11, 0x7D, 0x9B, + 0xD1, 0x8F, 0xEC, 0x4A, 0x0A, 0x82, 0x4A, 0x24, + 0x08, 0x0F, 0x29, 0x8B, 0xAC, 0xD2, 0x96, 0xD7, + 0xB4, 0x97, 0x83, 0x8F, 0xBD, 0x7B, 0x0D, 0x57, + 0x5C, 0x52, 0x49, 0x2B, 0x3E, 0x6F, 0x92, 0x6B + }, + { + 0x37, 0xA1, 0x50, 0x66, 0xF2, 0xB9, 0xF9, 0x4C, + 0x24, 0x61, 0x1B, 0xC4, 0x53, 0xED, 0x02, 0x74, + 0x07, 0x8D, 0x1F, 0x70, 0xB2, 0xD3, 0x4C, 0x8B, + 0x96, 0x36, 0x08, 0x48, 0x9D, 0xCB, 0xE8, 0xDF, + 0x44, 0x8E, 0xDD, 0x9C, 0x73, 0x36, 0x2B, 0xB2, + 0xB6, 0x6B, 0xEE, 0xF6, 0x1F, 0xCE, 0x60, 0x10, + 0x6F, 0x70, 0x19, 0xED, 0x37, 0x3C, 0x69, 0x22, + 0x59, 0xD9, 0x55, 0x6A, 0x94, 0x0B, 0x1A, 0x06 + }, + { + 0xBD, 0x44, 0xE7, 0x39, 0xE1, 0xF9, 0xDB, 0x1C, + 0x6B, 0xAF, 0x42, 0xCA, 0x4A, 0x12, 0xAC, 0x09, + 0x9B, 0x96, 0xF6, 0xB3, 0x6C, 0x4B, 0xCB, 0x1B, + 0x72, 0xEE, 0xFF, 0x08, 0xA6, 0x49, 0x68, 0x35, + 0xEC, 0x65, 0x15, 0x0B, 0xE8, 0xFE, 0x16, 0xCB, + 0xE3, 0x27, 0x07, 0xE3, 0x47, 0x54, 0x7D, 0xC5, + 0xA5, 0x83, 0xD2, 0x65, 0x74, 0x6F, 0xA5, 0x95, + 0xC5, 0xE7, 0x73, 0x0F, 0xCF, 0x24, 0x58, 0x1E + }, + { + 0xFA, 0xB2, 0x03, 0x8E, 0x94, 0x98, 0xA1, 0xC3, + 0x9E, 0x05, 0x78, 0xA0, 0xA5, 0xEA, 0x6B, 0x44, + 0xF3, 0xC1, 0xB4, 0x1A, 0xE5, 0x67, 0xF9, 0x91, + 0x4A, 0x95, 0xB1, 0x31, 0xC4, 0x8D, 0x12, 0x1E, + 0xCA, 0xCE, 0xA8, 0x95, 0xA0, 0x9B, 0x1D, 0x4E, + 0x04, 0x42, 0xBE, 0xC9, 0xC5, 0x0C, 0x50, 0xE0, + 0x0A, 0x9F, 0xAF, 0xEF, 0xFA, 0xE0, 0x70, 0x88, + 0x4C, 0x26, 0x25, 0xA8, 0xB1, 0xA2, 0x17, 0x26 + }, + { + 0x05, 0xA1, 0xB7, 0x6B, 0x2F, 0xD5, 0x62, 0x11, + 0xE0, 0xF2, 0xD7, 0x5A, 0x25, 0x16, 0x54, 0xA7, + 0x72, 0xF5, 0x5E, 0x18, 0xCA, 0x02, 0x2A, 0xF5, + 0x2C, 0xB3, 0x30, 0x19, 0x1E, 0x98, 0xA3, 0xB8, + 0xEB, 0x87, 0xE5, 0x11, 0x7B, 0xAE, 0x58, 0x04, + 0x4D, 0x94, 0x4C, 0x1F, 0x18, 0x85, 0x45, 0x12, + 0x25, 0x41, 0x77, 0x35, 0xFC, 0x72, 0xF7, 0x39, + 0x36, 0x69, 0x3C, 0xFF, 0x45, 0x46, 0x9F, 0x8C + }, + { + 0x2A, 0x30, 0xC9, 0x6B, 0xDA, 0xC7, 0x8A, 0x39, + 0x94, 0xEE, 0xCA, 0xA5, 0xA5, 0x3F, 0x82, 0x7F, + 0x58, 0xE1, 0x32, 0x31, 0xA0, 0xD1, 0x13, 0x08, + 0x6C, 0x06, 0xB1, 0xBD, 0xAB, 0xDA, 0x38, 0xD0, + 0x8F, 0x1A, 0xE2, 0x7D, 0xE2, 0x5F, 0xD2, 0x2E, + 0xEA, 0x70, 0xC0, 0x5F, 0x01, 0x32, 0xBF, 0x7A, + 0x50, 0x1C, 0x82, 0xAE, 0x62, 0x15, 0xBF, 0xEF, + 0x3C, 0x01, 0x63, 0x98, 0xBA, 0xF2, 0xCB, 0x62 + }, + { + 0x48, 0xDB, 0x53, 0x76, 0x5B, 0x82, 0xBD, 0x6F, + 0x25, 0x33, 0xEA, 0xE1, 0x7F, 0x67, 0x69, 0xD7, + 0xA4, 0xE3, 0xB2, 0x43, 0x74, 0x60, 0x1C, 0xDD, + 0x8E, 0xC0, 0xCA, 0x3A, 0xAB, 0x30, 0x93, 0xFD, + 0x2B, 0x99, 0x24, 0x38, 0x46, 0x0B, 0xAF, 0x8D, + 0xA5, 0x8F, 0xB9, 0xA8, 0x9B, 0x2C, 0x58, 0xF9, + 0x68, 0xE6, 0x36, 0x17, 0xCB, 0xEB, 0x18, 0x44, + 0xB0, 0x2D, 0x6A, 0x27, 0xC5, 0xB4, 0xAD, 0x41 + }, + { + 0x5C, 0x8B, 0x2E, 0x0E, 0x1B, 0x5C, 0x8F, 0x45, + 0x7D, 0x7F, 0x7B, 0xD9, 0xF0, 0x5A, 0x97, 0xE5, + 0x8D, 0xDA, 0x1D, 0x28, 0xDB, 0x9F, 0x34, 0xD1, + 0xCE, 0x73, 0x25, 0x28, 0xF9, 0x68, 0xBE, 0xDD, + 0x9E, 0x1C, 0xC9, 0x35, 0x2D, 0x0A, 0x5D, 0xF6, + 0x67, 0x29, 0x28, 0xBD, 0xD3, 0xEA, 0x6F, 0x5C, + 0xB0, 0x60, 0x77, 0xCF, 0x3A, 0xD3, 0xA7, 0x6E, + 0x29, 0xB2, 0x2E, 0x82, 0xBA, 0xC6, 0x7B, 0x61 + }, + { + 0x5B, 0x73, 0x91, 0xAA, 0x52, 0xF2, 0x76, 0xFA, + 0xB9, 0xC1, 0x38, 0x77, 0xF1, 0x22, 0x32, 0x70, + 0x84, 0x97, 0xFC, 0x02, 0x8F, 0xAA, 0x17, 0x32, + 0xA5, 0xDB, 0x07, 0x9E, 0x7F, 0xE0, 0x73, 0xED, + 0x0C, 0xC9, 0x52, 0x9C, 0xFC, 0x86, 0x3A, 0x4E, + 0xCB, 0xA4, 0xDC, 0x2F, 0x1E, 0xA9, 0xF6, 0xBD, + 0x69, 0x04, 0xF3, 0xA0, 0xC1, 0x07, 0x19, 0x3C, + 0x5E, 0x71, 0x1C, 0xB9, 0x11, 0xF3, 0x80, 0x25 + }, + { + 0x1D, 0x5A, 0xF7, 0x0F, 0x09, 0xA5, 0xFC, 0x69, + 0x16, 0xEF, 0x59, 0xA3, 0x8A, 0x86, 0x92, 0x6D, + 0xCA, 0xAE, 0x39, 0xA8, 0x95, 0x4D, 0x73, 0xFC, + 0x80, 0xA3, 0x50, 0x75, 0x1A, 0xDD, 0xA3, 0x8C, + 0x9D, 0x59, 0x75, 0x06, 0xDC, 0x05, 0xE1, 0xED, + 0x37, 0xBD, 0x2D, 0xB1, 0x59, 0x0F, 0x99, 0xAA, + 0x29, 0x6A, 0xEA, 0x13, 0xAB, 0x84, 0x43, 0xD5, + 0xA9, 0x23, 0x47, 0xFB, 0x85, 0xFC, 0x81, 0x6D + }, + { + 0x80, 0xE3, 0x70, 0x92, 0x97, 0xD4, 0x41, 0x14, + 0xB9, 0xFB, 0xDF, 0x55, 0x67, 0xF0, 0x5F, 0x33, + 0x00, 0x94, 0xCF, 0x09, 0xF4, 0xC0, 0xEF, 0xCF, + 0xAC, 0x05, 0x09, 0x5C, 0x36, 0x08, 0x10, 0x77, + 0x30, 0xC1, 0xAA, 0x07, 0xFF, 0x23, 0x00, 0x25, + 0x62, 0xC7, 0xE8, 0x41, 0xA9, 0xF5, 0x66, 0x24, + 0xFF, 0xE2, 0xAB, 0xEC, 0x61, 0x1E, 0xB9, 0xE7, + 0x3E, 0x1C, 0xCB, 0xD8, 0xF6, 0x2B, 0x11, 0x49 + }, + { + 0xF9, 0x94, 0x5C, 0x19, 0x06, 0x77, 0x84, 0x61, + 0x94, 0x13, 0x2B, 0x49, 0x6E, 0xC6, 0x01, 0x2C, + 0x08, 0x75, 0x0E, 0x02, 0x5F, 0xD5, 0x52, 0xED, + 0x32, 0x4D, 0x3A, 0x49, 0xD8, 0x63, 0x66, 0xC0, + 0x3D, 0xCC, 0xDE, 0x8D, 0x5B, 0x5A, 0xC9, 0xA4, + 0xBC, 0xB7, 0x19, 0x5E, 0x63, 0xBC, 0xAA, 0x93, + 0x9E, 0x8E, 0xDA, 0x18, 0xF1, 0x16, 0x94, 0xB6, + 0xFA, 0x69, 0x37, 0x39, 0x3B, 0xFF, 0xDB, 0xF4 + }, + { + 0x8D, 0x8F, 0x2E, 0xD9, 0xAE, 0x39, 0x80, 0x9A, + 0xAC, 0xAD, 0x2F, 0xCE, 0xDB, 0xD2, 0xDC, 0xA7, + 0x30, 0xC7, 0x83, 0xE6, 0x2F, 0xF7, 0x0B, 0x8D, + 0x3C, 0x53, 0x62, 0xF0, 0x73, 0xF8, 0x34, 0x67, + 0x19, 0x7D, 0x37, 0x56, 0xB4, 0x45, 0x19, 0x5F, + 0xE7, 0x52, 0x11, 0x73, 0x64, 0xD9, 0x2C, 0xF4, + 0x2C, 0x02, 0x6E, 0x40, 0x9D, 0x5F, 0xF7, 0xA9, + 0x53, 0x3E, 0xAB, 0x78, 0xF1, 0x75, 0x4A, 0x2D + }, + { + 0x3A, 0xC9, 0x9A, 0xC5, 0x3A, 0xC4, 0x9A, 0x56, + 0xFA, 0xA1, 0x86, 0x46, 0xB8, 0xE0, 0x8A, 0x2D, + 0x35, 0xBE, 0x80, 0xDF, 0x3E, 0xFB, 0xBB, 0xA6, + 0xBD, 0xA4, 0xAE, 0x90, 0x2B, 0x8D, 0x3E, 0x17, + 0x0A, 0x7B, 0xE8, 0x60, 0x5C, 0x34, 0xA4, 0xDC, + 0x9A, 0x73, 0x62, 0xB1, 0xC2, 0x01, 0xD7, 0x02, + 0x39, 0x1B, 0xD7, 0xD5, 0x20, 0x7F, 0x95, 0xFA, + 0x39, 0x0C, 0xE3, 0x3C, 0x43, 0x14, 0xD4, 0x11 + }, + { + 0xE4, 0x69, 0x4B, 0xDB, 0x31, 0x01, 0x6F, 0x25, + 0x53, 0x2C, 0x04, 0x3C, 0x5C, 0x63, 0x08, 0xCC, + 0x61, 0x9B, 0x0F, 0x87, 0x16, 0xF0, 0xC2, 0x9E, + 0xEB, 0x9F, 0x34, 0x0F, 0x47, 0xB0, 0x7B, 0x4A, + 0x4C, 0xE0, 0x98, 0x4C, 0x47, 0x24, 0xB1, 0x2A, + 0xB3, 0xD3, 0x2A, 0xF5, 0x16, 0xAD, 0xA2, 0x64, + 0x4C, 0xA6, 0x55, 0x8C, 0x1C, 0xB5, 0x81, 0x5C, + 0x12, 0x12, 0xA9, 0xB5, 0xFA, 0x83, 0x44, 0x12 + }, + { + 0xC6, 0x3C, 0x70, 0x3E, 0x62, 0x10, 0x8A, 0xA0, + 0xED, 0xC6, 0x83, 0xF3, 0x67, 0x8A, 0x00, 0x78, + 0x8F, 0xB1, 0x00, 0xC0, 0x96, 0x0B, 0x4E, 0x98, + 0xB7, 0x6A, 0x48, 0xE4, 0xE5, 0x92, 0x3D, 0x34, + 0x13, 0x44, 0x8D, 0xB8, 0x87, 0x5E, 0x3B, 0xCE, + 0xA7, 0xB6, 0xB8, 0x5D, 0x9E, 0x3E, 0xEA, 0xB7, + 0x2C, 0xD1, 0x50, 0x96, 0xFB, 0xBB, 0x2C, 0xC4, + 0x27, 0x03, 0x17, 0xFC, 0x34, 0xD4, 0x04, 0x71 + }, + { + 0x90, 0x80, 0xB7, 0xE8, 0x41, 0xEF, 0x51, 0x9C, + 0x54, 0x17, 0xE6, 0x90, 0xAA, 0xF4, 0x32, 0x79, + 0x07, 0xA8, 0x3D, 0xBC, 0xB7, 0x38, 0xD0, 0xF7, + 0x30, 0x8B, 0x1D, 0x61, 0x1D, 0xEF, 0x16, 0x9A, + 0x4F, 0x47, 0x42, 0x3E, 0x69, 0x0F, 0x27, 0xA7, + 0xE2, 0x74, 0x1A, 0xE7, 0x86, 0x5D, 0xA2, 0x3C, + 0x5D, 0x3F, 0x13, 0xC3, 0x16, 0x06, 0x3C, 0x7A, + 0xA1, 0xA9, 0x58, 0xE5, 0xBE, 0x83, 0x8F, 0x04 + }, + { + 0x29, 0x8D, 0xF6, 0x46, 0x91, 0x5F, 0x04, 0xD6, + 0x65, 0xE9, 0x67, 0x5E, 0x6A, 0x10, 0x31, 0x87, + 0x0D, 0x28, 0xEB, 0x7A, 0x04, 0x05, 0x66, 0x3E, + 0xAC, 0x3B, 0x10, 0xD1, 0xB4, 0xFA, 0x2E, 0x86, + 0x8E, 0x63, 0x73, 0xA5, 0x86, 0xCD, 0x73, 0xE0, + 0x6D, 0x8E, 0x7A, 0xD7, 0x71, 0xB4, 0xFB, 0x0A, + 0x8B, 0x4F, 0xC2, 0xDC, 0x6C, 0xE0, 0x9C, 0x64, + 0x2E, 0xE8, 0x99, 0x26, 0xFD, 0xC6, 0x52, 0x60 + }, + { + 0x4F, 0x2D, 0xE9, 0xC4, 0xF4, 0x34, 0x8B, 0xDB, + 0x32, 0x3A, 0x66, 0x83, 0x72, 0xE7, 0x71, 0x42, + 0x99, 0xC7, 0x76, 0xF9, 0x60, 0x2F, 0x3A, 0xF8, + 0xFB, 0x77, 0x46, 0xF1, 0x76, 0x86, 0x8D, 0xF3, + 0x54, 0x2B, 0x2F, 0xA6, 0x9E, 0xAE, 0x38, 0xB6, + 0xA2, 0x6A, 0x06, 0xCA, 0x89, 0x42, 0xF8, 0x82, + 0x78, 0xC6, 0x4E, 0x3D, 0x01, 0x7F, 0xEE, 0x67, + 0xA9, 0x4E, 0xA0, 0x23, 0xB2, 0xB5, 0xBE, 0x5F + }, + { + 0x40, 0x18, 0xC5, 0xEE, 0x90, 0x93, 0xA6, 0x81, + 0x11, 0x2F, 0x4C, 0xE1, 0x93, 0xA1, 0xD6, 0x5E, + 0x05, 0x48, 0x72, 0x5F, 0x96, 0xAE, 0x31, 0x53, + 0x87, 0xCD, 0x76, 0x5C, 0x2B, 0x9C, 0x30, 0x68, + 0xAE, 0x4C, 0xBE, 0x5C, 0xD5, 0x40, 0x2C, 0x11, + 0xC5, 0x5A, 0x9D, 0x78, 0x5F, 0xFD, 0xFC, 0x2B, + 0xDE, 0x6E, 0x7A, 0xCF, 0x19, 0x61, 0x74, 0x75, + 0xDA, 0xE0, 0xEB, 0x01, 0x44, 0x56, 0xCE, 0x45 + }, + { + 0x6F, 0xCE, 0x66, 0x75, 0xE8, 0x6D, 0x7E, 0x85, + 0x70, 0x4C, 0x96, 0xC2, 0x95, 0x70, 0x3C, 0xD9, + 0x54, 0x98, 0x59, 0x0E, 0x50, 0x76, 0x4D, 0x23, + 0xD7, 0xA7, 0xA3, 0xA3, 0x22, 0x68, 0xA0, 0xB3, + 0xC9, 0x91, 0xE8, 0xF7, 0x84, 0x87, 0x69, 0x9A, + 0x55, 0x4B, 0x58, 0x1E, 0x33, 0x9C, 0x09, 0xAE, + 0xC9, 0x82, 0xE0, 0xBA, 0xA4, 0x31, 0x87, 0x93, + 0x62, 0x06, 0x35, 0xE1, 0xE2, 0xC8, 0xD9, 0xF2 + }, + { + 0xEB, 0xA9, 0x37, 0x85, 0x91, 0x97, 0xC7, 0xFD, + 0x41, 0x2D, 0xBC, 0x9A, 0xFC, 0x0D, 0x67, 0xCC, + 0x19, 0x81, 0x60, 0xB5, 0xA9, 0xCC, 0xEE, 0x87, + 0xC4, 0x1A, 0x86, 0x64, 0x85, 0x9F, 0x3E, 0xFD, + 0x96, 0x13, 0x66, 0xA8, 0x09, 0xC7, 0xC6, 0xBC, + 0x6F, 0xA8, 0x44, 0x92, 0x68, 0x14, 0xE0, 0xB4, + 0xEF, 0xA3, 0x7E, 0xDE, 0x2C, 0x88, 0x44, 0x26, + 0x8D, 0x7F, 0x35, 0x56, 0xE4, 0x46, 0x58, 0x1D + }, + { + 0x83, 0xF4, 0x33, 0xE4, 0xF1, 0xC5, 0x07, 0x97, + 0x49, 0x3C, 0x58, 0xC2, 0x64, 0xCF, 0xFA, 0x70, + 0xC4, 0xA7, 0xA2, 0x4C, 0x33, 0x4D, 0xBA, 0xA3, + 0xC5, 0x74, 0x89, 0xD9, 0x70, 0xD4, 0x9D, 0x69, + 0x49, 0xFE, 0x45, 0xB7, 0x04, 0xF2, 0x65, 0xEF, + 0xD2, 0xAE, 0xE1, 0xAC, 0x1B, 0x46, 0xF4, 0xAA, + 0x3E, 0x4F, 0xAD, 0x68, 0xB3, 0x79, 0x61, 0xD2, + 0xC7, 0x28, 0x0A, 0xE1, 0x96, 0x72, 0xC8, 0x50 + }, + { + 0xB5, 0x57, 0xEC, 0xE1, 0x22, 0x72, 0x49, 0x3D, + 0xC2, 0x7E, 0x88, 0xA0, 0x5A, 0xDC, 0xD8, 0x61, + 0x87, 0x5A, 0x0C, 0xD0, 0x0B, 0xD6, 0x8A, 0xDC, + 0x3A, 0x30, 0x1D, 0x26, 0x3A, 0x9C, 0xD9, 0x93, + 0xA9, 0x6A, 0xE1, 0x4C, 0xFC, 0xDD, 0xCB, 0x99, + 0x7C, 0xC9, 0x86, 0x23, 0x93, 0x50, 0x50, 0xEA, + 0x43, 0x55, 0x2A, 0x34, 0x11, 0x07, 0x18, 0x7D, + 0xE7, 0x5C, 0x4E, 0xDE, 0xD7, 0xC7, 0x86, 0xBD + }, + { + 0x95, 0x89, 0xC0, 0x81, 0x3B, 0x73, 0x93, 0xDB, + 0xAA, 0xAF, 0xE4, 0x7A, 0xF5, 0xB4, 0x08, 0xB2, + 0x3C, 0x8A, 0x8C, 0x8B, 0xAC, 0x62, 0x55, 0x4B, + 0x8F, 0xA1, 0x32, 0xA3, 0x58, 0xCE, 0x30, 0x83, + 0xB1, 0xD4, 0xE3, 0x97, 0x07, 0xCD, 0x54, 0xA5, + 0x5F, 0x67, 0x3D, 0x48, 0x11, 0x6E, 0xB1, 0xF9, + 0xED, 0x8D, 0xE9, 0xC9, 0x43, 0xCD, 0x2D, 0xE4, + 0x60, 0xA6, 0x8B, 0xDD, 0xF7, 0x1E, 0x98, 0x03 + }, + { + 0xAE, 0x4C, 0xCF, 0x27, 0xAB, 0x00, 0xA4, 0x0C, + 0x36, 0x37, 0xD3, 0xD2, 0xCE, 0x51, 0xA8, 0x3E, + 0xFB, 0xA6, 0x2D, 0x4A, 0x6F, 0xDA, 0xD6, 0x95, + 0x06, 0x3F, 0xBC, 0x60, 0xA2, 0xD8, 0x2E, 0xC5, + 0xA5, 0x4A, 0xCB, 0xE0, 0x9B, 0xA9, 0x38, 0x8F, + 0x49, 0xAA, 0xC2, 0x7C, 0x99, 0x2D, 0x84, 0x63, + 0x20, 0x36, 0xE1, 0xBD, 0xD4, 0xC5, 0x29, 0xBB, + 0xF1, 0x85, 0x1E, 0xAE, 0x0C, 0x6E, 0xA9, 0x02 + }, + { + 0xA3, 0x94, 0x4B, 0x2C, 0x31, 0xCB, 0x49, 0x40, + 0x80, 0xB7, 0xEE, 0x1D, 0xB0, 0x81, 0x68, 0x53, + 0xE4, 0x25, 0xB5, 0x4C, 0x48, 0xD6, 0x31, 0x44, + 0x7E, 0xA5, 0x2C, 0x1D, 0x29, 0x52, 0x07, 0x9B, + 0xD8, 0x8F, 0xAB, 0x9E, 0xD0, 0xB7, 0xD8, 0xC0, + 0xBA, 0xAF, 0x0C, 0x4E, 0xCA, 0x19, 0x10, 0xDB, + 0x6F, 0x98, 0x53, 0x4F, 0x0D, 0x42, 0xE5, 0xEB, + 0xB6, 0xC0, 0xA7, 0x5E, 0xF0, 0xD8, 0xB2, 0xC0 + }, + { + 0xCF, 0xA1, 0xA2, 0x24, 0x68, 0x5A, 0x5F, 0xB2, + 0x01, 0x04, 0x58, 0x20, 0x1C, 0xEB, 0x0C, 0xDA, + 0x21, 0xC8, 0x2B, 0x16, 0x02, 0xDC, 0x41, 0x35, + 0x85, 0xFB, 0xCE, 0x80, 0x97, 0x6F, 0x06, 0x1C, + 0x23, 0x5B, 0x13, 0x67, 0x71, 0x24, 0x98, 0x14, + 0x4A, 0xC1, 0x6A, 0x98, 0x54, 0xF6, 0xFB, 0x32, + 0x3C, 0xBE, 0xB6, 0x23, 0x69, 0xCF, 0x9B, 0x75, + 0x2B, 0x92, 0x52, 0xA2, 0xA7, 0xAC, 0xE1, 0xFD + }, + { + 0xFA, 0x62, 0xC6, 0xCF, 0xC8, 0xF0, 0x79, 0xE5, + 0x8F, 0x3D, 0x3F, 0xEF, 0xD7, 0xC2, 0x24, 0xE7, + 0x1E, 0xBC, 0x69, 0xA9, 0x5B, 0x18, 0x35, 0xCC, + 0xC3, 0x2F, 0x35, 0x07, 0x77, 0x05, 0x11, 0x02, + 0x61, 0x54, 0x92, 0xD6, 0x7F, 0xB6, 0xDE, 0x62, + 0xCF, 0x2A, 0xD5, 0xB1, 0x84, 0x67, 0xFE, 0x87, + 0x15, 0x74, 0x88, 0x82, 0xDB, 0x89, 0xFF, 0x86, + 0xEF, 0xDF, 0x2F, 0x96, 0xF8, 0x13, 0x5E, 0xD2 + }, + { + 0xCC, 0x63, 0x3F, 0xD4, 0xEA, 0x6A, 0xC4, 0x08, + 0xC3, 0x87, 0x57, 0x56, 0xB9, 0x01, 0x28, 0x8A, + 0x1D, 0xE1, 0x91, 0x89, 0x28, 0x32, 0xBE, 0x2E, + 0x90, 0x26, 0xDC, 0x65, 0xC2, 0xFF, 0x00, 0x00, + 0x9F, 0x14, 0x36, 0xDD, 0xFF, 0x42, 0x06, 0x26, + 0x0A, 0x3D, 0x66, 0xEF, 0x61, 0x92, 0x14, 0x3E, + 0x57, 0x2F, 0x1E, 0x4B, 0xB8, 0xE5, 0xA7, 0x4B, + 0x12, 0x05, 0x5E, 0x42, 0x41, 0x1C, 0x18, 0xBC + }, + { + 0x44, 0xD2, 0xBF, 0x7F, 0x36, 0x96, 0xB8, 0x93, + 0x3F, 0x25, 0x5B, 0x9B, 0xE1, 0xA4, 0xA6, 0xAE, + 0x33, 0x16, 0xC2, 0x5D, 0x03, 0x95, 0xF5, 0x90, + 0xB9, 0xB9, 0x89, 0x8F, 0x12, 0x7E, 0x40, 0xD3, + 0xF4, 0x12, 0x4D, 0x7B, 0xDB, 0xC8, 0x72, 0x5F, + 0x00, 0xB0, 0xD2, 0x81, 0x50, 0xFF, 0x05, 0xB4, + 0xA7, 0x9E, 0x5E, 0x04, 0xE3, 0x4A, 0x47, 0xE9, + 0x08, 0x7B, 0x3F, 0x79, 0xD4, 0x13, 0xAB, 0x7F + }, + { + 0x96, 0xFB, 0xCB, 0xB6, 0x0B, 0xD3, 0x13, 0xB8, + 0x84, 0x50, 0x33, 0xE5, 0xBC, 0x05, 0x8A, 0x38, + 0x02, 0x74, 0x38, 0x57, 0x2D, 0x7E, 0x79, 0x57, + 0xF3, 0x68, 0x4F, 0x62, 0x68, 0xAA, 0xDD, 0x3A, + 0xD0, 0x8D, 0x21, 0x76, 0x7E, 0xD6, 0x87, 0x86, + 0x85, 0x33, 0x1B, 0xA9, 0x85, 0x71, 0x48, 0x7E, + 0x12, 0x47, 0x0A, 0xAD, 0x66, 0x93, 0x26, 0x71, + 0x6E, 0x46, 0x66, 0x7F, 0x69, 0xF8, 0xD7, 0xE8 + }, +}; + + + + +#endif + + + diff --git a/Modules/_blake2/impl/blake2.h b/Modules/_blake2/impl/blake2.h index 1a9fdf4302bc..5ca17f610742 100644 --- a/Modules/_blake2/impl/blake2.h +++ b/Modules/_blake2/impl/blake2.h @@ -1,16 +1,14 @@ /* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + BLAKE2 reference source code package - optimized C implementations + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2_H__ @@ -19,16 +17,36 @@ #include #include -#ifdef BLAKE2_NO_INLINE -#define BLAKE2_LOCAL_INLINE(type) static type +#if defined(_WIN32) || defined(__CYGWIN__) + #define BLAKE2_DLL_IMPORT __declspec(dllimport) + #define BLAKE2_DLL_EXPORT __declspec(dllexport) + #define BLAKE2_DLL_PRIVATE +#elif __GNUC__ >= 4 + #define BLAKE2_DLL_IMPORT __attribute__ ((visibility ("default"))) + #define BLAKE2_DLL_EXPORT __attribute__ ((visibility ("default"))) + #define BLAKE2_DLL_PRIVATE __attribute__ ((visibility ("hidden"))) +#else + #define BLAKE2_DLL_IMPORT + #define BLAKE2_DLL_EXPORT + #define BLAKE2_DLL_PRIVATE #endif -#ifndef BLAKE2_LOCAL_INLINE -#define BLAKE2_LOCAL_INLINE(type) static inline type +#if defined(BLAKE2_DLL) + #if defined(BLAKE2_DLL_EXPORTS) // defined if we are building the DLL + #define BLAKE2_API BLAKE2_DLL_EXPORT + #else + #define BLAKE2_API BLAKE2_DLL_IMPORT + #endif + #define BLAKE2_PRIVATE BLAKE2_DLL_PRIVATE // must only be used by hidden logic +#else + #define BLAKE2_API + #define BLAKE2_PRIVATE #endif #if defined(__cplusplus) extern "C" { +#elif defined(_MSC_VER) && !defined(inline) +#define inline __inline #endif enum blake2s_constant @@ -49,23 +67,56 @@ extern "C" { BLAKE2B_PERSONALBYTES = 16 }; +#pragma pack(push, 1) + typedef struct __blake2s_param + { + uint8_t digest_length; // 1 + uint8_t key_length; // 2 + uint8_t fanout; // 3 + uint8_t depth; // 4 + uint32_t leaf_length; // 8 + uint8_t node_offset[6];// 14 + uint8_t node_depth; // 15 + uint8_t inner_length; // 16 + // uint8_t reserved[0]; + uint8_t salt[BLAKE2S_SALTBYTES]; // 24 + uint8_t personal[BLAKE2S_PERSONALBYTES]; // 32 + } blake2s_param; + typedef struct __blake2s_state { uint32_t h[8]; uint32_t t[2]; uint32_t f[2]; uint8_t buf[2 * BLAKE2S_BLOCKBYTES]; - size_t buflen; + uint32_t buflen; + uint8_t outlen; uint8_t last_node; } blake2s_state; + typedef struct __blake2b_param + { + uint8_t digest_length; // 1 + uint8_t key_length; // 2 + uint8_t fanout; // 3 + uint8_t depth; // 4 + uint32_t leaf_length; // 8 + uint64_t node_offset; // 16 + uint8_t node_depth; // 17 + uint8_t inner_length; // 18 + uint8_t reserved[14]; // 32 + uint8_t salt[BLAKE2B_SALTBYTES]; // 48 + uint8_t personal[BLAKE2B_PERSONALBYTES]; // 64 + } blake2b_param; + typedef struct __blake2b_state { uint64_t h[8]; uint64_t t[2]; uint64_t f[2]; uint8_t buf[2 * BLAKE2B_BLOCKBYTES]; - size_t buflen; + uint32_t buflen; + uint8_t outlen; uint8_t last_node; } blake2b_state; @@ -73,82 +124,52 @@ extern "C" { { blake2s_state S[8][1]; blake2s_state R[1]; - uint8_t buf[8 * BLAKE2S_BLOCKBYTES]; - size_t buflen; + uint8_t buf[8 * BLAKE2S_BLOCKBYTES]; + uint32_t buflen; + uint8_t outlen; } blake2sp_state; typedef struct __blake2bp_state { blake2b_state S[4][1]; blake2b_state R[1]; - uint8_t buf[4 * BLAKE2B_BLOCKBYTES]; - size_t buflen; + uint8_t buf[4 * BLAKE2B_BLOCKBYTES]; + uint32_t buflen; + uint8_t outlen; } blake2bp_state; - - -#pragma pack(push, 1) - typedef struct __blake2s_param - { - uint8_t digest_length; /* 1 */ - uint8_t key_length; /* 2 */ - uint8_t fanout; /* 3 */ - uint8_t depth; /* 4 */ - uint32_t leaf_length; /* 8 */ - uint8_t node_offset[6];// 14 - uint8_t node_depth; /* 15 */ - uint8_t inner_length; /* 16 */ - /* uint8_t reserved[0]; */ - uint8_t salt[BLAKE2S_SALTBYTES]; /* 24 */ - uint8_t personal[BLAKE2S_PERSONALBYTES]; /* 32 */ - } blake2s_param; - - typedef struct __blake2b_param - { - uint8_t digest_length; /* 1 */ - uint8_t key_length; /* 2 */ - uint8_t fanout; /* 3 */ - uint8_t depth; /* 4 */ - uint32_t leaf_length; /* 8 */ - uint64_t node_offset; /* 16 */ - uint8_t node_depth; /* 17 */ - uint8_t inner_length; /* 18 */ - uint8_t reserved[14]; /* 32 */ - uint8_t salt[BLAKE2B_SALTBYTES]; /* 48 */ - uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ - } blake2b_param; #pragma pack(pop) - /* Streaming API */ - int blake2s_init( blake2s_state *S, const uint8_t outlen ); - int blake2s_init_key( blake2s_state *S, const uint8_t outlen, const void *key, const uint8_t keylen ); - int blake2s_init_param( blake2s_state *S, const blake2s_param *P ); - int blake2s_update( blake2s_state *S, const uint8_t *in, uint64_t inlen ); - int blake2s_final( blake2s_state *S, uint8_t *out, uint8_t outlen ); - - int blake2b_init( blake2b_state *S, const uint8_t outlen ); - int blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, const uint8_t keylen ); - int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); - int blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen ); - int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen ); - - int blake2sp_init( blake2sp_state *S, const uint8_t outlen ); - int blake2sp_init_key( blake2sp_state *S, const uint8_t outlen, const void *key, const uint8_t keylen ); - int blake2sp_update( blake2sp_state *S, const uint8_t *in, uint64_t inlen ); - int blake2sp_final( blake2sp_state *S, uint8_t *out, uint8_t outlen ); - - int blake2bp_init( blake2bp_state *S, const uint8_t outlen ); - int blake2bp_init_key( blake2bp_state *S, const uint8_t outlen, const void *key, const uint8_t keylen ); - int blake2bp_update( blake2bp_state *S, const uint8_t *in, uint64_t inlen ); - int blake2bp_final( blake2bp_state *S, uint8_t *out, uint8_t outlen ); - - /* Simple API */ - int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen ); - int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen ); - - int blake2sp( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen ); - int blake2bp( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen ); - - static inline int blake2( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen ) + // Streaming API + BLAKE2_API int blake2s_init( blake2s_state *S, size_t outlen ); + BLAKE2_API int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + BLAKE2_API int blake2s_init_param( blake2s_state *S, const blake2s_param *P ); + BLAKE2_API int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen ); + BLAKE2_API int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen ); + + BLAKE2_API int blake2b_init( blake2b_state *S, size_t outlen ); + BLAKE2_API int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + BLAKE2_API int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); + BLAKE2_API int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen ); + BLAKE2_API int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen ); + + BLAKE2_API int blake2sp_init( blake2sp_state *S, size_t outlen ); + BLAKE2_API int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ); + BLAKE2_API int blake2sp_update( blake2sp_state *S, const uint8_t *in, size_t inlen ); + BLAKE2_API int blake2sp_final( blake2sp_state *S, uint8_t *out, size_t outlen ); + + BLAKE2_API int blake2bp_init( blake2bp_state *S, size_t outlen ); + BLAKE2_API int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ); + BLAKE2_API int blake2bp_update( blake2bp_state *S, const uint8_t *in, size_t inlen ); + BLAKE2_API int blake2bp_final( blake2bp_state *S, uint8_t *out, size_t outlen ); + + // Simple API + BLAKE2_API int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + BLAKE2_API int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + BLAKE2_API int blake2sp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + BLAKE2_API int blake2bp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); + + static inline int blake2( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) { return blake2b( out, in, key, outlen, inlen, keylen ); } diff --git a/Modules/_blake2/impl/blake2b-load-sse2.h b/Modules/_blake2/impl/blake2b-load-sse2.h index 0004a9856487..1ba153c87d73 100644 --- a/Modules/_blake2/impl/blake2b-load-sse2.h +++ b/Modules/_blake2/impl/blake2b-load-sse2.h @@ -1,16 +1,14 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2B_LOAD_SSE2_H__ diff --git a/Modules/_blake2/impl/blake2b-load-sse41.h b/Modules/_blake2/impl/blake2b-load-sse41.h index 42a13493512a..f6c1bc8393f1 100644 --- a/Modules/_blake2/impl/blake2b-load-sse41.h +++ b/Modules/_blake2/impl/blake2b-load-sse41.h @@ -1,16 +1,14 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2B_LOAD_SSE41_H__ diff --git a/Modules/_blake2/impl/blake2b-ref.c b/Modules/_blake2/impl/blake2b-ref.c index ab375a499cba..699f1a1da1de 100644 --- a/Modules/_blake2/impl/blake2b-ref.c +++ b/Modules/_blake2/impl/blake2b-ref.c @@ -1,16 +1,14 @@ /* BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #include @@ -45,41 +43,36 @@ static const uint8_t blake2b_sigma[12][16] = }; -BLAKE2_LOCAL_INLINE(int) blake2b_set_lastnode( blake2b_state *S ) +static inline int blake2b_set_lastnode( blake2b_state *S ) { - S->f[1] = -1; + S->f[1] = ~0ULL; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_clear_lastnode( blake2b_state *S ) +static inline int blake2b_clear_lastnode( blake2b_state *S ) { - S->f[1] = 0; + S->f[1] = 0ULL; return 0; } /* Some helper functions, not necessarily useful */ -BLAKE2_LOCAL_INLINE(int) blake2b_is_lastblock( const blake2b_state *S ) -{ - return S->f[0] != 0; -} - -BLAKE2_LOCAL_INLINE(int) blake2b_set_lastblock( blake2b_state *S ) +static inline int blake2b_set_lastblock( blake2b_state *S ) { if( S->last_node ) blake2b_set_lastnode( S ); - S->f[0] = -1; + S->f[0] = ~0ULL; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_clear_lastblock( blake2b_state *S ) +static inline int blake2b_clear_lastblock( blake2b_state *S ) { if( S->last_node ) blake2b_clear_lastnode( S ); - S->f[0] = 0; + S->f[0] = 0ULL; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) +static inline int blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) { S->t[0] += inc; S->t[1] += ( S->t[0] < inc ); @@ -88,95 +81,106 @@ BLAKE2_LOCAL_INLINE(int) blake2b_increment_counter( blake2b_state *S, const uint -/* Parameter-related functions */ -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_digest_length( blake2b_param *P, const uint8_t digest_length ) +// Parameter-related functions +static inline int blake2b_param_set_digest_length( blake2b_param *P, const uint8_t digest_length ) { P->digest_length = digest_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_fanout( blake2b_param *P, const uint8_t fanout ) +static inline int blake2b_param_set_fanout( blake2b_param *P, const uint8_t fanout ) { P->fanout = fanout; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_max_depth( blake2b_param *P, const uint8_t depth ) +static inline int blake2b_param_set_max_depth( blake2b_param *P, const uint8_t depth ) { P->depth = depth; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_leaf_length( blake2b_param *P, const uint32_t leaf_length ) +static inline int blake2b_param_set_leaf_length( blake2b_param *P, const uint32_t leaf_length ) { store32( &P->leaf_length, leaf_length ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_node_offset( blake2b_param *P, const uint64_t node_offset ) +static inline int blake2b_param_set_node_offset( blake2b_param *P, const uint64_t node_offset ) { store64( &P->node_offset, node_offset ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_node_depth( blake2b_param *P, const uint8_t node_depth ) +static inline int blake2b_param_set_node_depth( blake2b_param *P, const uint8_t node_depth ) { P->node_depth = node_depth; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_inner_length( blake2b_param *P, const uint8_t inner_length ) +static inline int blake2b_param_set_inner_length( blake2b_param *P, const uint8_t inner_length ) { P->inner_length = inner_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_salt( blake2b_param *P, const uint8_t salt[BLAKE2B_SALTBYTES] ) +static inline int blake2b_param_set_salt( blake2b_param *P, const uint8_t salt[BLAKE2B_SALTBYTES] ) { memcpy( P->salt, salt, BLAKE2B_SALTBYTES ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_personal( blake2b_param *P, const uint8_t personal[BLAKE2B_PERSONALBYTES] ) +static inline int blake2b_param_set_personal( blake2b_param *P, const uint8_t personal[BLAKE2B_PERSONALBYTES] ) { memcpy( P->personal, personal, BLAKE2B_PERSONALBYTES ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_init0( blake2b_state *S ) +static inline int blake2b_init0( blake2b_state *S ) { - int i; memset( S, 0, sizeof( blake2b_state ) ); - for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i]; + for( int i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i]; return 0; } +#if defined(__cplusplus) +extern "C" { +#endif + int blake2b_init( blake2b_state *S, size_t outlen ); + int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); + int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen ); + int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen ); + int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); +#if defined(__cplusplus) +} +#endif + /* init xors IV with input parameter block */ int blake2b_init_param( blake2b_state *S, const blake2b_param *P ) { - const uint8_t *p = ( const uint8_t * )( P ); - size_t i; - blake2b_init0( S ); + uint8_t *p = ( uint8_t * )( P ); /* IV XOR ParamBlock */ - for( i = 0; i < 8; ++i ) + for( size_t i = 0; i < 8; ++i ) S->h[i] ^= load64( p + sizeof( S->h[i] ) * i ); + S->outlen = P->digest_length; return 0; } -int blake2b_init( blake2b_state *S, const uint8_t outlen ) +int blake2b_init( blake2b_state *S, size_t outlen ) { blake2b_param P[1]; if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; - P->digest_length = outlen; + P->digest_length = ( uint8_t ) outlen; P->key_length = 0; P->fanout = 1; P->depth = 1; @@ -191,7 +195,7 @@ int blake2b_init( blake2b_state *S, const uint8_t outlen ) } -int blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, const uint8_t keylen ) +int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) { blake2b_param P[1]; @@ -199,8 +203,8 @@ int blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, c if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; - P->digest_length = outlen; - P->key_length = keylen; + P->digest_length = ( uint8_t ) outlen; + P->key_length = ( uint8_t ) keylen; P->fanout = 1; P->depth = 1; store32( &P->leaf_length, 0 ); @@ -227,7 +231,7 @@ static int blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCK { uint64_t m[16]; uint64_t v[16]; - int i; + size_t i; for( i = 0; i < 16; ++i ) m[i] = load64( block + i * sizeof( m[i] ) ); @@ -286,29 +290,29 @@ static int blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCK return 0; } -/* inlen now in bytes */ -int blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen ) + +int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen ) { while( inlen > 0 ) { - size_t left = S->buflen; - size_t fill = 2 * BLAKE2B_BLOCKBYTES - left; + uint32_t left = S->buflen; + uint32_t fill = 2 * BLAKE2B_BLOCKBYTES - left; if( inlen > fill ) { - memcpy( S->buf + left, in, fill ); /* Fill buffer */ + memcpy( S->buf + left, in, fill ); // Fill buffer S->buflen += fill; blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); - blake2b_compress( S, S->buf ); /* Compress */ - memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ + blake2b_compress( S, S->buf ); // Compress + memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); // Shift buffer left S->buflen -= BLAKE2B_BLOCKBYTES; in += fill; inlen -= fill; } - else /* inlen <= fill */ + else // inlen <= fill { - memcpy( S->buf + left, in, (size_t)inlen ); - S->buflen += (size_t)inlen; /* Be lazy, do not compress */ + memcpy( S->buf + left, in, inlen ); + S->buflen += ( uint32_t ) inlen; // Be lazy, do not compress in += inlen; inlen -= inlen; } @@ -317,24 +321,19 @@ int blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen ) return 0; } -/* Is this correct? */ -int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen ) +int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen ) { - uint8_t buffer[BLAKE2B_OUTBYTES] = {0}; - int i; - - if( out == NULL || outlen == 0 || outlen > BLAKE2B_OUTBYTES ) - return -1; + uint8_t buffer[BLAKE2B_OUTBYTES]; + size_t i; - if( blake2b_is_lastblock( S ) ) - return -1; + if(S->outlen != outlen) return -1; if( S->buflen > BLAKE2B_BLOCKBYTES ) { blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); blake2b_compress( S, S->buf ); S->buflen -= BLAKE2B_BLOCKBYTES; - memmove( S->buf, S->buf + BLAKE2B_BLOCKBYTES, S->buflen ); + memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, S->buflen ); } blake2b_increment_counter( S, S->buflen ); @@ -349,8 +348,7 @@ int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen ) return 0; } -/* inlen, at least, should be uint64_t. Others can be size_t. */ -int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen ) +int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) { blake2b_state S[1]; @@ -374,47 +372,8 @@ int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen if( blake2b_init( S, outlen ) < 0 ) return -1; } - blake2b_update( S, ( const uint8_t * )in, inlen ); - blake2b_final( S, out, outlen ); - return 0; + if( blake2b_update( S, ( uint8_t * )in, inlen ) < 0 ) return -1; + return blake2b_final( S, out, outlen ); } -#if defined(SUPERCOP) -int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) -{ - return blake2b( out, in, NULL, BLAKE2B_OUTBYTES, inlen, 0 ); -} -#endif - -#if defined(BLAKE2B_SELFTEST) -#include -#include "blake2-kat.h" -int main( int argc, char **argv ) -{ - uint8_t key[BLAKE2B_KEYBYTES]; - uint8_t buf[KAT_LENGTH]; - size_t i; - - for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - for( i = 0; i < KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2b( hash, buf, key, BLAKE2B_OUTBYTES, i, BLAKE2B_KEYBYTES ); - - if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) ) - { - puts( "error" ); - return -1; - } - } - - puts( "ok" ); - return 0; -} -#endif diff --git a/Modules/_blake2/impl/blake2b-round.h b/Modules/_blake2/impl/blake2b-round.h index 4ce225540964..cebc22550da4 100644 --- a/Modules/_blake2/impl/blake2b-round.h +++ b/Modules/_blake2/impl/blake2b-round.h @@ -1,22 +1,23 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2B_ROUND_H__ #define __BLAKE2B_ROUND_H__ -#define LOADU(p) _mm_loadu_si128( (const __m128i *)(p) ) +#define LOAD(p) _mm_load_si128( (__m128i *)(p) ) +#define STORE(p,r) _mm_store_si128((__m128i *)(p), r) + +#define LOADU(p) _mm_loadu_si128( (__m128i *)(p) ) #define STOREU(p,r) _mm_storeu_si128((__m128i *)(p), r) #define TOF(reg) _mm_castsi128_ps((reg)) @@ -137,7 +138,7 @@ #endif -#if defined(HAVE_SSE41) +#if defined(HAVE_SSE4_1) #include "blake2b-load-sse41.h" #else #include "blake2b-load-sse2.h" diff --git a/Modules/_blake2/impl/blake2b-test.c b/Modules/_blake2/impl/blake2b-test.c new file mode 100644 index 000000000000..9310a273a517 --- /dev/null +++ b/Modules/_blake2/impl/blake2b-test.c @@ -0,0 +1,43 @@ +/* + BLAKE2 reference source code package - optimized C implementations + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . +*/ +#include +#include +#include "blake2.h" +#include "blake2-kat.h" +int main( int argc, char **argv ) +{ + uint8_t key[BLAKE2B_KEYBYTES]; + uint8_t buf[KAT_LENGTH]; + + for( size_t i = 0; i < BLAKE2B_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( size_t i = 0; i < KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + for( size_t i = 0; i < KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2B_OUTBYTES]; + + if( blake2b( hash, buf, key, BLAKE2B_OUTBYTES, i, BLAKE2B_KEYBYTES ) < 0 || + 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) ) + { + puts( "error" ); + return -1; + } + } + + puts( "ok" ); + return 0; +} + diff --git a/Modules/_blake2/impl/blake2b.c b/Modules/_blake2/impl/blake2b.c index ebb65bb139af..ca1504622354 100644 --- a/Modules/_blake2/impl/blake2b.c +++ b/Modules/_blake2/impl/blake2b.c @@ -1,16 +1,14 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #include @@ -22,23 +20,36 @@ #include "blake2-config.h" -#ifdef _MSC_VER -#include /* for _mm_set_epi64x */ +#if defined(_MSC_VER) +#include #endif + +#if defined(HAVE_SSE2) #include +// MSVC only defines _mm_set_epi64x for x86_64... +#if defined(_MSC_VER) && !defined(_M_X64) +static inline __m128i _mm_set_epi64x( const uint64_t u1, const uint64_t u0 ) +{ + return _mm_set_epi32( u1 >> 32, u1, u0 >> 32, u0 ); +} +#endif +#endif + #if defined(HAVE_SSSE3) #include #endif -#if defined(HAVE_SSE41) +#if defined(HAVE_SSE4_1) #include #endif #if defined(HAVE_AVX) #include #endif -#if defined(HAVE_XOP) +#if defined(HAVE_XOP) && !defined(_MSC_VER) #include #endif + + #include "blake2b-round.h" static const uint64_t blake2b_IV[8] = @@ -67,44 +78,39 @@ static const uint8_t blake2b_sigma[12][16] = /* Some helper functions, not necessarily useful */ -BLAKE2_LOCAL_INLINE(int) blake2b_set_lastnode( blake2b_state *S ) +static inline int blake2b_set_lastnode( blake2b_state *S ) { - S->f[1] = -1; + S->f[1] = ~0ULL; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_clear_lastnode( blake2b_state *S ) +static inline int blake2b_clear_lastnode( blake2b_state *S ) { - S->f[1] = 0; + S->f[1] = 0ULL; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_is_lastblock( const blake2b_state *S ) -{ - return S->f[0] != 0; -} - -BLAKE2_LOCAL_INLINE(int) blake2b_set_lastblock( blake2b_state *S ) +static inline int blake2b_set_lastblock( blake2b_state *S ) { if( S->last_node ) blake2b_set_lastnode( S ); - S->f[0] = -1; + S->f[0] = ~0ULL; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_clear_lastblock( blake2b_state *S ) +static inline int blake2b_clear_lastblock( blake2b_state *S ) { if( S->last_node ) blake2b_clear_lastnode( S ); - S->f[0] = 0; + S->f[0] = 0ULL; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) +static inline int blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) { -#if __x86_64__ - /* ADD/ADC chain */ +#if defined(__x86_64__) && (defined(__GNUC__) || defined(__clang__)) + // ADD/ADC chain __uint128_t t = ( ( __uint128_t )S->t[1] << 64 ) | S->t[0]; t += inc; S->t[0] = ( uint64_t )( t >> 0 ); @@ -117,94 +123,119 @@ BLAKE2_LOCAL_INLINE(int) blake2b_increment_counter( blake2b_state *S, const uint } -/* Parameter-related functions */ -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_digest_length( blake2b_param *P, const uint8_t digest_length ) +// Parameter-related functions +static inline int blake2b_param_set_digest_length( blake2b_param *P, const uint8_t digest_length ) { P->digest_length = digest_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_fanout( blake2b_param *P, const uint8_t fanout ) +static inline int blake2b_param_set_fanout( blake2b_param *P, const uint8_t fanout ) { P->fanout = fanout; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_max_depth( blake2b_param *P, const uint8_t depth ) +static inline int blake2b_param_set_max_depth( blake2b_param *P, const uint8_t depth ) { P->depth = depth; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_leaf_length( blake2b_param *P, const uint32_t leaf_length ) +static inline int blake2b_param_set_leaf_length( blake2b_param *P, const uint32_t leaf_length ) { P->leaf_length = leaf_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_node_offset( blake2b_param *P, const uint64_t node_offset ) +static inline int blake2b_param_set_node_offset( blake2b_param *P, const uint64_t node_offset ) { P->node_offset = node_offset; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_node_depth( blake2b_param *P, const uint8_t node_depth ) +static inline int blake2b_param_set_node_depth( blake2b_param *P, const uint8_t node_depth ) { P->node_depth = node_depth; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_inner_length( blake2b_param *P, const uint8_t inner_length ) +static inline int blake2b_param_set_inner_length( blake2b_param *P, const uint8_t inner_length ) { P->inner_length = inner_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_salt( blake2b_param *P, const uint8_t salt[BLAKE2B_SALTBYTES] ) +static inline int blake2b_param_set_salt( blake2b_param *P, const uint8_t salt[BLAKE2B_SALTBYTES] ) { memcpy( P->salt, salt, BLAKE2B_SALTBYTES ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_param_set_personal( blake2b_param *P, const uint8_t personal[BLAKE2B_PERSONALBYTES] ) +static inline int blake2b_param_set_personal( blake2b_param *P, const uint8_t personal[BLAKE2B_PERSONALBYTES] ) { memcpy( P->personal, personal, BLAKE2B_PERSONALBYTES ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_init0( blake2b_state *S ) +static inline int blake2b_init0( blake2b_state *S ) { - int i; memset( S, 0, sizeof( blake2b_state ) ); - for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i]; + for( int i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i]; return 0; } + + +#define blake2b_init BLAKE2_IMPL_NAME(blake2b_init) +#define blake2b_init_param BLAKE2_IMPL_NAME(blake2b_init_param) +#define blake2b_init_key BLAKE2_IMPL_NAME(blake2b_init_key) +#define blake2b_update BLAKE2_IMPL_NAME(blake2b_update) +#define blake2b_final BLAKE2_IMPL_NAME(blake2b_final) +#define blake2b BLAKE2_IMPL_NAME(blake2b) + +#if defined(__cplusplus) +extern "C" { +#endif + int blake2b_init( blake2b_state *S, size_t outlen ); + int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); + int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen ); + int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen ); + int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); +#if defined(__cplusplus) +} +#endif + /* init xors IV with input parameter block */ int blake2b_init_param( blake2b_state *S, const blake2b_param *P ) { - /*blake2b_init0( S ); */ - const uint8_t * v = ( const uint8_t * )( blake2b_IV ); - const uint8_t * p = ( const uint8_t * )( P ); - uint8_t * h = ( uint8_t * )( S->h ); - int i; + uint8_t *p, *h, *v; + //blake2b_init0( S ); + v = ( uint8_t * )( blake2b_IV ); + h = ( uint8_t * )( S->h ); + p = ( uint8_t * )( P ); /* IV XOR ParamBlock */ memset( S, 0, sizeof( blake2b_state ) ); - for( i = 0; i < BLAKE2B_OUTBYTES; ++i ) h[i] = v[i] ^ p[i]; + for( int i = 0; i < BLAKE2B_OUTBYTES; ++i ) h[i] = v[i] ^ p[i]; + S->outlen = P->digest_length; return 0; } /* Some sort of default parameter block initialization, for sequential blake2b */ -int blake2b_init( blake2b_state *S, const uint8_t outlen ) + +int blake2b_init( blake2b_state *S, size_t outlen ) { + if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; + const blake2b_param P = { - outlen, + ( uint8_t ) outlen, 0, 1, 1, @@ -216,18 +247,19 @@ int blake2b_init( blake2b_state *S, const uint8_t outlen ) {0}, {0} }; - - if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; - return blake2b_init_param( S, &P ); } -int blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, const uint8_t keylen ) +int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) { + if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; + + if ( ( !keylen ) || keylen > BLAKE2B_KEYBYTES ) return -1; + const blake2b_param P = { - outlen, - keylen, + ( uint8_t ) outlen, + ( uint8_t ) keylen, 1, 1, 0, @@ -239,10 +271,6 @@ int blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, c {0} }; - if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; - - if ( ( !keylen ) || keylen > BLAKE2B_KEYBYTES ) return -1; - if( blake2b_init_param( S, &P ) < 0 ) return 0; @@ -256,7 +284,7 @@ int blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, c return 0; } -BLAKE2_LOCAL_INLINE(int) blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] ) +static inline int blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] ) { __m128i row1l, row1h; __m128i row2l, row2h; @@ -268,7 +296,7 @@ BLAKE2_LOCAL_INLINE(int) blake2b_compress( blake2b_state *S, const uint8_t block const __m128i r16 = _mm_setr_epi8( 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9 ); const __m128i r24 = _mm_setr_epi8( 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10 ); #endif -#if defined(HAVE_SSE41) +#if defined(HAVE_SSE4_1) const __m128i m0 = LOADU( block + 00 ); const __m128i m1 = LOADU( block + 16 ); const __m128i m2 = LOADU( block + 32 ); @@ -327,28 +355,28 @@ BLAKE2_LOCAL_INLINE(int) blake2b_compress( blake2b_state *S, const uint8_t block } -int blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen ) +int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen ) { while( inlen > 0 ) { - size_t left = S->buflen; - size_t fill = 2 * BLAKE2B_BLOCKBYTES - left; + uint32_t left = S->buflen; + uint32_t fill = 2 * BLAKE2B_BLOCKBYTES - left; if( inlen > fill ) { - memcpy( S->buf + left, in, fill ); /* Fill buffer */ + memcpy( S->buf + left, in, fill ); // Fill buffer S->buflen += fill; blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); - blake2b_compress( S, S->buf ); /* Compress */ - memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ + blake2b_compress( S, S->buf ); // Compress + memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); // Shift buffer left S->buflen -= BLAKE2B_BLOCKBYTES; in += fill; inlen -= fill; } - else /* inlen <= fill */ + else // inlen <= fill { memcpy( S->buf + left, in, inlen ); - S->buflen += inlen; /* Be lazy, do not compress */ + S->buflen += ( uint32_t ) inlen; // Be lazy, do not compress in += inlen; inlen -= inlen; } @@ -358,20 +386,16 @@ int blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen ) } -int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen ) +int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen ) { - if( outlen > BLAKE2B_OUTBYTES ) - return -1; - - if( blake2b_is_lastblock( S ) ) - return -1; + if(S->outlen != outlen) return -1; if( S->buflen > BLAKE2B_BLOCKBYTES ) { blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); blake2b_compress( S, S->buf ); S->buflen -= BLAKE2B_BLOCKBYTES; - memmove( S->buf, S->buf + BLAKE2B_BLOCKBYTES, S->buflen ); + memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, S->buflen ); } blake2b_increment_counter( S, S->buflen ); @@ -383,7 +407,7 @@ int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen ) } -int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen ) +int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) { blake2b_state S[1]; @@ -407,9 +431,8 @@ int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen if( blake2b_init( S, outlen ) < 0 ) return -1; } - blake2b_update( S, ( const uint8_t * )in, inlen ); - blake2b_final( S, out, outlen ); - return 0; + if( blake2b_update( S, ( uint8_t * )in, inlen ) < 0) return -1; + return blake2b_final( S, out, outlen ); } #if defined(SUPERCOP) @@ -418,36 +441,3 @@ int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen return blake2b( out, in, NULL, BLAKE2B_OUTBYTES, inlen, 0 ); } #endif - -#if defined(BLAKE2B_SELFTEST) -#include -#include "blake2-kat.h" -int main( int argc, char **argv ) -{ - uint8_t key[BLAKE2B_KEYBYTES]; - uint8_t buf[KAT_LENGTH]; - size_t i; - - for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - for( i = 0; i < KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2b( hash, buf, key, BLAKE2B_OUTBYTES, i, BLAKE2B_KEYBYTES ); - - if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) ) - { - puts( "error" ); - return -1; - } - } - - puts( "ok" ); - return 0; -} -#endif - diff --git a/Modules/_blake2/impl/blake2bp-test.c b/Modules/_blake2/impl/blake2bp-test.c new file mode 100644 index 000000000000..849666cc1d5e --- /dev/null +++ b/Modules/_blake2/impl/blake2bp-test.c @@ -0,0 +1,44 @@ +/* + BLAKE2 reference source code package - optimized C implementations + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . +*/ +#include +#include +#include "blake2.h" +#include "blake2-kat.h" + +int main( int argc, char **argv ) +{ + uint8_t key[BLAKE2B_KEYBYTES]; + uint8_t buf[KAT_LENGTH]; + + for( size_t i = 0; i < BLAKE2B_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( size_t i = 0; i < KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + for( size_t i = 0; i < KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2B_OUTBYTES]; + + if( blake2bp( hash, buf, key, BLAKE2B_OUTBYTES, i, BLAKE2B_KEYBYTES ) < 0 || + 0 != memcmp( hash, blake2bp_keyed_kat[i], BLAKE2B_OUTBYTES ) ) + { + puts( "error" ); + return -1; + } + } + + puts( "ok" ); + return 0; +} + diff --git a/Modules/_blake2/impl/blake2bp.c b/Modules/_blake2/impl/blake2bp.c new file mode 100644 index 000000000000..452216117101 --- /dev/null +++ b/Modules/_blake2/impl/blake2bp.c @@ -0,0 +1,274 @@ +/* + BLAKE2 reference source code package - optimized C implementations + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . +*/ + +#include +#include +#include +#include + +#if defined(_OPENMP) +#include +#endif + +#include "blake2.h" +#include "blake2-impl.h" + +#define PARALLELISM_DEGREE 4 + +static int blake2bp_init_leaf( blake2b_state *S, uint8_t outlen, uint8_t keylen, uint64_t offset ) +{ + blake2b_param P[1]; + P->digest_length = outlen; + P->key_length = keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + store32(&P->leaf_length, 0); + store64(&P->node_offset, offset); + P->node_depth = 0; + P->inner_length = BLAKE2B_OUTBYTES; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + blake2b_init_param( S, P ); + S->outlen = P->inner_length; + return 0; +} + +static int blake2bp_init_root( blake2b_state *S, uint8_t outlen, uint8_t keylen ) +{ + blake2b_param P[1]; + P->digest_length = outlen; + P->key_length = keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + store32(&P->leaf_length, 0); + store64(&P->node_offset, 0); + P->node_depth = 1; + P->inner_length = BLAKE2B_OUTBYTES; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + blake2b_init_param( S, P ); + S->outlen = P->digest_length; + return 0; +} + + +int blake2bp_init( blake2bp_state *S, size_t outlen ) +{ + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + + if( blake2bp_init_root( S->R, ( uint8_t ) outlen, 0 ) < 0 ) + return -1; + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2bp_init_leaf( S->S[i], ( uint8_t ) outlen, 0, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + S->outlen = ( uint8_t ) outlen; + return 0; +} + +int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ) +{ + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + if( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + + if( blake2bp_init_root( S->R, ( uint8_t ) outlen, ( uint8_t ) keylen ) < 0 ) + return -1; + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2bp_init_leaf( S->S[i], ( uint8_t ) outlen, ( uint8_t ) keylen, i ) < 0 ) + return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + S->outlen = ( uint8_t ) outlen; + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset( block, 0, BLAKE2B_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S->S[i], block, BLAKE2B_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + + +int blake2bp_update( blake2bp_state *S, const uint8_t *in, size_t inlen ) +{ + size_t left = S->buflen; + size_t fill = sizeof( S->buf ) - left; + + if( left && inlen >= fill ) + { + memcpy( S->buf + left, in, fill ); + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); + + in += fill; + inlen -= fill; + left = 0; + } + +#if defined(_OPENMP) + omp_set_num_threads(PARALLELISM_DEGREE); + #pragma omp parallel shared(S) +#else + for( size_t id__ = 0; id__ < PARALLELISM_DEGREE; ++id__ ) +#endif + { +#if defined(_OPENMP) + size_t id__ = ( size_t ) omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const uint8_t *in__ = ( const uint8_t * )in; + in__ += id__ * BLAKE2B_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) + { + blake2b_update( S->S[id__], in__, BLAKE2B_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + } + } + + in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ); + inlen %= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + + if( inlen > 0 ) + memcpy( S->buf + left, in, inlen ); + + S->buflen = ( uint32_t ) left + ( uint32_t ) inlen; + return 0; +} + + + +int blake2bp_final( blake2bp_state *S, uint8_t *out, size_t outlen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; + + if(S->outlen != outlen) return -1; + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + { + if( S->buflen > i * BLAKE2B_BLOCKBYTES ) + { + size_t left = S->buflen - i * BLAKE2B_BLOCKBYTES; + + if( left > BLAKE2B_BLOCKBYTES ) left = BLAKE2B_BLOCKBYTES; + + blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, left ); + } + + blake2b_final( S->S[i], hash[i], BLAKE2B_OUTBYTES ); + } + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S->R, hash[i], BLAKE2B_OUTBYTES ); + + return blake2b_final( S->R, out, outlen ); +} + +int blake2bp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; + blake2b_state S[PARALLELISM_DEGREE][1]; + blake2b_state FS[1]; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if ( NULL == key && keylen > 0) return -1; + + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + if( keylen > BLAKE2B_KEYBYTES ) return -1; + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2bp_init_leaf( S[i], ( uint8_t ) outlen, ( uint8_t ) keylen, i ) < 0 ) + return -1; + + S[PARALLELISM_DEGREE - 1]->last_node = 1; // mark last node + + if( keylen > 0 ) + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset( block, 0, BLAKE2B_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S[i], block, BLAKE2B_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ + } + +#if defined(_OPENMP) + omp_set_num_threads(PARALLELISM_DEGREE); + #pragma omp parallel shared(S,hash) +#else + for( size_t id__ = 0; id__ < PARALLELISM_DEGREE; ++id__ ) +#endif + { +#if defined(_OPENMP) + size_t id__ = ( size_t ) omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const uint8_t *in__ = ( const uint8_t * )in; + in__ += id__ * BLAKE2B_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) + { + blake2b_update( S[id__], in__, BLAKE2B_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + } + + if( inlen__ > id__ * BLAKE2B_BLOCKBYTES ) + { + const size_t left = inlen__ - id__ * BLAKE2B_BLOCKBYTES; + const size_t len = left <= BLAKE2B_BLOCKBYTES ? left : BLAKE2B_BLOCKBYTES; + blake2b_update( S[id__], in__, len ); + } + + blake2b_final( S[id__], hash[id__], BLAKE2B_OUTBYTES ); + } + + if( blake2bp_init_root( FS, ( uint8_t ) outlen, ( uint8_t ) keylen ) < 0 ) + return -1; + + FS->last_node = 1; // Mark as last node + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( FS, hash[i], BLAKE2B_OUTBYTES ); + + return blake2b_final( FS, out, outlen ); +} + + + diff --git a/Modules/_blake2/impl/blake2s-load-sse2.h b/Modules/_blake2/impl/blake2s-load-sse2.h index eadefa7a5280..b24483cf931c 100644 --- a/Modules/_blake2/impl/blake2s-load-sse2.h +++ b/Modules/_blake2/impl/blake2s-load-sse2.h @@ -1,16 +1,14 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2S_LOAD_SSE2_H__ diff --git a/Modules/_blake2/impl/blake2s-load-sse41.h b/Modules/_blake2/impl/blake2s-load-sse41.h index 54bf0cdd6143..3ac12eb6f5d0 100644 --- a/Modules/_blake2/impl/blake2s-load-sse41.h +++ b/Modules/_blake2/impl/blake2s-load-sse41.h @@ -1,16 +1,14 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2S_LOAD_SSE41_H__ diff --git a/Modules/_blake2/impl/blake2s-load-xop.h b/Modules/_blake2/impl/blake2s-load-xop.h index 2797722b37b1..ac591a77d191 100644 --- a/Modules/_blake2/impl/blake2s-load-xop.h +++ b/Modules/_blake2/impl/blake2s-load-xop.h @@ -1,35 +1,31 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2S_LOAD_XOP_H__ #define __BLAKE2S_LOAD_XOP_H__ -#define TOB(x) ((x)*4*0x01010101 + 0x03020100) /* ..or not TOB */ +#define TOB(x) ((x)*4*0x01010101 + 0x03020100) // ..or not TOB -#if 0 /* Basic VPPERM emulation, for testing purposes */ -static __m128i _mm_perm_epi8(const __m128i src1, const __m128i src2, const __m128i sel) +/*static __m128i _mm_perm_epi8(const __m128i src1, const __m128i src2, const __m128i sel) { const __m128i sixteen = _mm_set1_epi8(16); const __m128i t0 = _mm_shuffle_epi8(src1, sel); const __m128i s1 = _mm_shuffle_epi8(src2, _mm_sub_epi8(sel, sixteen)); const __m128i mask = _mm_or_si128(_mm_cmpeq_epi8(sel, sixteen), - _mm_cmpgt_epi8(sel, sixteen)); /* (>=16) = 0xff : 00 */ + _mm_cmpgt_epi8(sel, sixteen)); // (>=16) = 0xff : 00 return _mm_blendv_epi8(t0, s1, mask); -} -#endif +}*/ #define LOAD_MSG_0_1(buf) \ buf = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(6),TOB(4),TOB(2),TOB(0)) ); diff --git a/Modules/_blake2/impl/blake2s-ref.c b/Modules/_blake2/impl/blake2s-ref.c index 6636753bf49d..baf0b58351ae 100644 --- a/Modules/_blake2/impl/blake2s-ref.c +++ b/Modules/_blake2/impl/blake2s-ref.c @@ -1,16 +1,14 @@ /* BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #include @@ -40,137 +38,143 @@ static const uint8_t blake2s_sigma[10][16] = { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , }; -BLAKE2_LOCAL_INLINE(int) blake2s_set_lastnode( blake2s_state *S ) +static inline int blake2s_set_lastnode( blake2s_state *S ) { - S->f[1] = -1; + S->f[1] = ~0U; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_clear_lastnode( blake2s_state *S ) +static inline int blake2s_clear_lastnode( blake2s_state *S ) { - S->f[1] = 0; + S->f[1] = 0U; return 0; } /* Some helper functions, not necessarily useful */ -BLAKE2_LOCAL_INLINE(int) blake2s_is_lastblock( const blake2s_state *S ) -{ - return S->f[0] != 0; -} - -BLAKE2_LOCAL_INLINE(int) blake2s_set_lastblock( blake2s_state *S ) +static inline int blake2s_set_lastblock( blake2s_state *S ) { if( S->last_node ) blake2s_set_lastnode( S ); - S->f[0] = -1; + S->f[0] = ~0U; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_clear_lastblock( blake2s_state *S ) +static inline int blake2s_clear_lastblock( blake2s_state *S ) { if( S->last_node ) blake2s_clear_lastnode( S ); - S->f[0] = 0; + S->f[0] = 0U; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_increment_counter( blake2s_state *S, const uint32_t inc ) +static inline int blake2s_increment_counter( blake2s_state *S, const uint32_t inc ) { S->t[0] += inc; S->t[1] += ( S->t[0] < inc ); return 0; } -/* Parameter-related functions */ -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_digest_length( blake2s_param *P, const uint8_t digest_length ) +// Parameter-related functions +static inline int blake2s_param_set_digest_length( blake2s_param *P, const uint8_t digest_length ) { P->digest_length = digest_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_fanout( blake2s_param *P, const uint8_t fanout ) +static inline int blake2s_param_set_fanout( blake2s_param *P, const uint8_t fanout ) { P->fanout = fanout; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_max_depth( blake2s_param *P, const uint8_t depth ) +static inline int blake2s_param_set_max_depth( blake2s_param *P, const uint8_t depth ) { P->depth = depth; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_leaf_length( blake2s_param *P, const uint32_t leaf_length ) +static inline int blake2s_param_set_leaf_length( blake2s_param *P, const uint32_t leaf_length ) { store32( &P->leaf_length, leaf_length ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_node_offset( blake2s_param *P, const uint64_t node_offset ) +static inline int blake2s_param_set_node_offset( blake2s_param *P, const uint64_t node_offset ) { store48( P->node_offset, node_offset ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_node_depth( blake2s_param *P, const uint8_t node_depth ) +static inline int blake2s_param_set_node_depth( blake2s_param *P, const uint8_t node_depth ) { P->node_depth = node_depth; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_inner_length( blake2s_param *P, const uint8_t inner_length ) +static inline int blake2s_param_set_inner_length( blake2s_param *P, const uint8_t inner_length ) { P->inner_length = inner_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_salt( blake2s_param *P, const uint8_t salt[BLAKE2S_SALTBYTES] ) +static inline int blake2s_param_set_salt( blake2s_param *P, const uint8_t salt[BLAKE2S_SALTBYTES] ) { memcpy( P->salt, salt, BLAKE2S_SALTBYTES ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_personal( blake2s_param *P, const uint8_t personal[BLAKE2S_PERSONALBYTES] ) +static inline int blake2s_param_set_personal( blake2s_param *P, const uint8_t personal[BLAKE2S_PERSONALBYTES] ) { memcpy( P->personal, personal, BLAKE2S_PERSONALBYTES ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_init0( blake2s_state *S ) +static inline int blake2s_init0( blake2s_state *S ) { - int i; memset( S, 0, sizeof( blake2s_state ) ); - for( i = 0; i < 8; ++i ) S->h[i] = blake2s_IV[i]; + for( int i = 0; i < 8; ++i ) S->h[i] = blake2s_IV[i]; return 0; } +#if defined(__cplusplus) +extern "C" { +#endif + int blake2s_init( blake2s_state *S, size_t outlen ); + int blake2s_init_param( blake2s_state *S, const blake2s_param *P ); + int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen ); + int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen ); + int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); +#if defined(__cplusplus) +} +#endif + /* init2 xors IV with input parameter block */ int blake2s_init_param( blake2s_state *S, const blake2s_param *P ) { - const uint32_t *p = ( const uint32_t * )( P ); - size_t i; - blake2s_init0( S ); + uint32_t *p = ( uint32_t * )( P ); /* IV XOR ParamBlock */ - for( i = 0; i < 8; ++i ) + for( size_t i = 0; i < 8; ++i ) S->h[i] ^= load32( &p[i] ); + S->outlen = P->digest_length; return 0; } -/* Sequential blake2s initialization */ -int blake2s_init( blake2s_state *S, const uint8_t outlen ) +// Sequential blake2s initialization +int blake2s_init( blake2s_state *S, size_t outlen ) { blake2s_param P[1]; /* Move interval verification here? */ if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; - P->digest_length = outlen; + P->digest_length = ( uint8_t) outlen; P->key_length = 0; P->fanout = 1; P->depth = 1; @@ -178,13 +182,13 @@ int blake2s_init( blake2s_state *S, const uint8_t outlen ) store48( &P->node_offset, 0 ); P->node_depth = 0; P->inner_length = 0; - /* memset(P->reserved, 0, sizeof(P->reserved) ); */ + // memset(P->reserved, 0, sizeof(P->reserved) ); memset( P->salt, 0, sizeof( P->salt ) ); memset( P->personal, 0, sizeof( P->personal ) ); return blake2s_init_param( S, P ); } -int blake2s_init_key( blake2s_state *S, const uint8_t outlen, const void *key, const uint8_t keylen ) +int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ) { blake2s_param P[1]; @@ -192,15 +196,15 @@ int blake2s_init_key( blake2s_state *S, const uint8_t outlen, const void *key, c if ( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1; - P->digest_length = outlen; - P->key_length = keylen; + P->digest_length = ( uint8_t ) outlen; + P->key_length = ( uint8_t ) keylen; P->fanout = 1; P->depth = 1; store32( &P->leaf_length, 0 ); store48( &P->node_offset, 0 ); P->node_depth = 0; P->inner_length = 0; - /* memset(P->reserved, 0, sizeof(P->reserved) ); */ + // memset(P->reserved, 0, sizeof(P->reserved) ); memset( P->salt, 0, sizeof( P->salt ) ); memset( P->personal, 0, sizeof( P->personal ) ); @@ -220,12 +224,11 @@ static int blake2s_compress( blake2s_state *S, const uint8_t block[BLAKE2S_BLOCK { uint32_t m[16]; uint32_t v[16]; - size_t i; - for( i = 0; i < 16; ++i ) + for( size_t i = 0; i < 16; ++i ) m[i] = load32( block + i * sizeof( m[i] ) ); - for( i = 0; i < 8; ++i ) + for( size_t i = 0; i < 8; ++i ) v[i] = S->h[i]; v[ 8] = blake2s_IV[0]; @@ -269,7 +272,7 @@ static int blake2s_compress( blake2s_state *S, const uint8_t block[BLAKE2S_BLOCK ROUND( 8 ); ROUND( 9 ); - for( i = 0; i < 8; ++i ) + for( size_t i = 0; i < 8; ++i ) S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; #undef G @@ -278,28 +281,28 @@ static int blake2s_compress( blake2s_state *S, const uint8_t block[BLAKE2S_BLOCK } -int blake2s_update( blake2s_state *S, const uint8_t *in, uint64_t inlen ) +int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen ) { while( inlen > 0 ) { - size_t left = S->buflen; - size_t fill = 2 * BLAKE2S_BLOCKBYTES - left; + uint32_t left = S->buflen; + uint32_t fill = 2 * BLAKE2S_BLOCKBYTES - left; if( inlen > fill ) { - memcpy( S->buf + left, in, fill ); /* Fill buffer */ + memcpy( S->buf + left, in, fill ); // Fill buffer S->buflen += fill; blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); - blake2s_compress( S, S->buf ); /* Compress */ - memcpy( S->buf, S->buf + BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); /* Shift buffer left */ + blake2s_compress( S, S->buf ); // Compress + memcpy( S->buf, S->buf + BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); // Shift buffer left S->buflen -= BLAKE2S_BLOCKBYTES; in += fill; inlen -= fill; } - else /* inlen <= fill */ + else // inlen <= fill { - memcpy( S->buf + left, in, (size_t)inlen ); - S->buflen += (size_t)inlen; /* Be lazy, do not compress */ + memcpy( S->buf + left, in, inlen ); + S->buflen += ( uint32_t ) inlen; // Be lazy, do not compress in += inlen; inlen -= inlen; } @@ -308,24 +311,19 @@ int blake2s_update( blake2s_state *S, const uint8_t *in, uint64_t inlen ) return 0; } -int blake2s_final( blake2s_state *S, uint8_t *out, uint8_t outlen ) +int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen ) { - uint8_t buffer[BLAKE2S_OUTBYTES] = {0}; - int i; - - if( out == NULL || outlen == 0 || outlen > BLAKE2S_OUTBYTES ) - return -1; - - if( blake2s_is_lastblock( S ) ) - return -1; + uint8_t buffer[BLAKE2S_OUTBYTES]; + size_t i; + if(S->outlen != outlen) return -1; if( S->buflen > BLAKE2S_BLOCKBYTES ) { blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); blake2s_compress( S, S->buf ); S->buflen -= BLAKE2S_BLOCKBYTES; - memmove( S->buf, S->buf + BLAKE2S_BLOCKBYTES, S->buflen ); + memcpy( S->buf, S->buf + BLAKE2S_BLOCKBYTES, S->buflen ); } blake2s_increment_counter( S, ( uint32_t )S->buflen ); @@ -335,12 +333,12 @@ int blake2s_final( blake2s_state *S, uint8_t *out, uint8_t outlen ) for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ store32( buffer + sizeof( S->h[i] ) * i, S->h[i] ); - + memcpy( out, buffer, outlen ); return 0; } -int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen ) +int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) { blake2s_state S[1]; @@ -349,7 +347,7 @@ int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen if ( NULL == out ) return -1; - if ( NULL == key && keylen > 0) return -1; + if ( NULL == key && keylen > 0 ) return -1; if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; @@ -364,48 +362,7 @@ int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen if( blake2s_init( S, outlen ) < 0 ) return -1; } - blake2s_update( S, ( const uint8_t * )in, inlen ); - blake2s_final( S, out, outlen ); - return 0; + if( blake2s_update( S, ( uint8_t * )in, inlen ) < 0) return -1; + return blake2s_final( S, out, outlen ); } -#if defined(SUPERCOP) -int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) -{ - return blake2s( out, in, NULL, BLAKE2S_OUTBYTES, inlen, 0 ); -} -#endif - -#if defined(BLAKE2S_SELFTEST) -#include -#include "blake2-kat.h" -int main( int argc, char **argv ) -{ - uint8_t key[BLAKE2S_KEYBYTES]; - uint8_t buf[KAT_LENGTH]; - size_t i; - - for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - for( i = 0; i < KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2S_OUTBYTES]; - blake2s( hash, buf, key, BLAKE2S_OUTBYTES, i, BLAKE2S_KEYBYTES ); - - if( 0 != memcmp( hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES ) ) - { - puts( "error" ); - return -1; - } - } - - puts( "ok" ); - return 0; -} -#endif - - diff --git a/Modules/_blake2/impl/blake2s-round.h b/Modules/_blake2/impl/blake2s-round.h index 7470d928a215..1e2f2b7f59bd 100644 --- a/Modules/_blake2/impl/blake2s-round.h +++ b/Modules/_blake2/impl/blake2s-round.h @@ -1,22 +1,23 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #pragma once #ifndef __BLAKE2S_ROUND_H__ #define __BLAKE2S_ROUND_H__ -#define LOADU(p) _mm_loadu_si128( (const __m128i *)(p) ) +#define LOAD(p) _mm_load_si128( (__m128i *)(p) ) +#define STORE(p,r) _mm_store_si128((__m128i *)(p), r) + +#define LOADU(p) _mm_loadu_si128( (__m128i *)(p) ) #define STOREU(p,r) _mm_storeu_si128((__m128i *)(p), r) #define TOF(reg) _mm_castsi128_ps((reg)) @@ -68,7 +69,7 @@ #if defined(HAVE_XOP) #include "blake2s-load-xop.h" -#elif defined(HAVE_SSE41) +#elif defined(HAVE_SSE4_1) #include "blake2s-load-sse41.h" #else #include "blake2s-load-sse2.h" diff --git a/Modules/_blake2/impl/blake2s-test.c b/Modules/_blake2/impl/blake2s-test.c new file mode 100644 index 000000000000..5c3f1f189d79 --- /dev/null +++ b/Modules/_blake2/impl/blake2s-test.c @@ -0,0 +1,43 @@ +/* + BLAKE2 reference source code package - optimized C implementations + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . +*/ +#include +#include +#include "blake2.h" +#include "blake2-kat.h" +int main( int argc, char **argv ) +{ + uint8_t key[BLAKE2S_KEYBYTES]; + uint8_t buf[KAT_LENGTH]; + + for( size_t i = 0; i < BLAKE2S_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( size_t i = 0; i < KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + for( size_t i = 0; i < KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2S_OUTBYTES]; + + if( blake2s( hash, buf, key, BLAKE2S_OUTBYTES, i, BLAKE2S_KEYBYTES ) < 0 || + 0 != memcmp( hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES ) ) + { + puts( "error" ); + return -1; + } + } + + puts( "ok" ); + return 0; +} + diff --git a/Modules/_blake2/impl/blake2s.c b/Modules/_blake2/impl/blake2s.c index 69385dcc38ca..0c3636ef6fc5 100644 --- a/Modules/_blake2/impl/blake2s.c +++ b/Modules/_blake2/impl/blake2s.c @@ -1,16 +1,14 @@ /* BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . */ #include @@ -22,18 +20,32 @@ #include "blake2-config.h" +#if defined(_MSC_VER) +#include +#endif +#if defined(HAVE_SSE2) #include +// MSVC only defines _mm_set_epi64x for x86_64... +#if defined(_MSC_VER) && !defined(_M_X64) +static inline __m128i _mm_set_epi64x( const uint64_t u1, const uint64_t u0 ) +{ + return _mm_set_epi32( u1 >> 32, u1, u0 >> 32, u0 ); +} +#endif +#endif + + #if defined(HAVE_SSSE3) #include #endif -#if defined(HAVE_SSE41) +#if defined(HAVE_SSE4_1) #include #endif #if defined(HAVE_AVX) #include #endif -#if defined(HAVE_XOP) +#if defined(HAVE_XOP) && !defined(_MSC_VER) #include #endif @@ -61,40 +73,35 @@ static const uint8_t blake2s_sigma[10][16] = /* Some helper functions, not necessarily useful */ -BLAKE2_LOCAL_INLINE(int) blake2s_set_lastnode( blake2s_state *S ) +static inline int blake2s_set_lastnode( blake2s_state *S ) { - S->f[1] = -1; + S->f[1] = ~0U; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_clear_lastnode( blake2s_state *S ) +static inline int blake2s_clear_lastnode( blake2s_state *S ) { - S->f[1] = 0; + S->f[1] = 0U; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_is_lastblock( const blake2s_state *S ) -{ - return S->f[0] != 0; -} - -BLAKE2_LOCAL_INLINE(int) blake2s_set_lastblock( blake2s_state *S ) +static inline int blake2s_set_lastblock( blake2s_state *S ) { if( S->last_node ) blake2s_set_lastnode( S ); - S->f[0] = -1; + S->f[0] = ~0U; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_clear_lastblock( blake2s_state *S ) +static inline int blake2s_clear_lastblock( blake2s_state *S ) { if( S->last_node ) blake2s_clear_lastnode( S ); - S->f[0] = 0; + S->f[0] = 0U; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_increment_counter( blake2s_state *S, const uint32_t inc ) +static inline int blake2s_increment_counter( blake2s_state *S, const uint32_t inc ) { uint64_t t = ( ( uint64_t )S->t[1] << 32 ) | S->t[0]; t += inc; @@ -104,91 +111,114 @@ BLAKE2_LOCAL_INLINE(int) blake2s_increment_counter( blake2s_state *S, const uint } -/* Parameter-related functions */ -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_digest_length( blake2s_param *P, const uint8_t digest_length ) +// Parameter-related functions +static inline int blake2s_param_set_digest_length( blake2s_param *P, const uint8_t digest_length ) { P->digest_length = digest_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_fanout( blake2s_param *P, const uint8_t fanout ) +static inline int blake2s_param_set_fanout( blake2s_param *P, const uint8_t fanout ) { P->fanout = fanout; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_max_depth( blake2s_param *P, const uint8_t depth ) +static inline int blake2s_param_set_max_depth( blake2s_param *P, const uint8_t depth ) { P->depth = depth; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_leaf_length( blake2s_param *P, const uint32_t leaf_length ) +static inline int blake2s_param_set_leaf_length( blake2s_param *P, const uint32_t leaf_length ) { P->leaf_length = leaf_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_node_offset( blake2s_param *P, const uint64_t node_offset ) +static inline int blake2s_param_set_node_offset( blake2s_param *P, const uint64_t node_offset ) { store48( P->node_offset, node_offset ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_node_depth( blake2s_param *P, const uint8_t node_depth ) +static inline int blake2s_param_set_node_depth( blake2s_param *P, const uint8_t node_depth ) { P->node_depth = node_depth; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_inner_length( blake2s_param *P, const uint8_t inner_length ) +static inline int blake2s_param_set_inner_length( blake2s_param *P, const uint8_t inner_length ) { P->inner_length = inner_length; return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_salt( blake2s_param *P, const uint8_t salt[BLAKE2S_SALTBYTES] ) +static inline int blake2s_param_set_salt( blake2s_param *P, const uint8_t salt[BLAKE2S_SALTBYTES] ) { memcpy( P->salt, salt, BLAKE2S_SALTBYTES ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_param_set_personal( blake2s_param *P, const uint8_t personal[BLAKE2S_PERSONALBYTES] ) +static inline int blake2s_param_set_personal( blake2s_param *P, const uint8_t personal[BLAKE2S_PERSONALBYTES] ) { memcpy( P->personal, personal, BLAKE2S_PERSONALBYTES ); return 0; } -BLAKE2_LOCAL_INLINE(int) blake2s_init0( blake2s_state *S ) +static inline int blake2s_init0( blake2s_state *S ) { - int i; memset( S, 0, sizeof( blake2s_state ) ); - for( i = 0; i < 8; ++i ) S->h[i] = blake2s_IV[i]; + for( int i = 0; i < 8; ++i ) S->h[i] = blake2s_IV[i]; return 0; } +#define blake2s_init BLAKE2_IMPL_NAME(blake2s_init) +#define blake2s_init_param BLAKE2_IMPL_NAME(blake2s_init_param) +#define blake2s_init_key BLAKE2_IMPL_NAME(blake2s_init_key) +#define blake2s_update BLAKE2_IMPL_NAME(blake2s_update) +#define blake2s_final BLAKE2_IMPL_NAME(blake2s_final) +#define blake2s BLAKE2_IMPL_NAME(blake2s) + +#if defined(__cplusplus) +extern "C" { +#endif + int blake2s_init( blake2s_state *S, size_t outlen ); + int blake2s_init_param( blake2s_state *S, const blake2s_param *P ); + int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen ); + int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen ); + int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); +#if defined(__cplusplus) +} +#endif + + /* init2 xors IV with input parameter block */ int blake2s_init_param( blake2s_state *S, const blake2s_param *P ) { - /*blake2s_init0( S ); */ - const uint8_t * v = ( const uint8_t * )( blake2s_IV ); - const uint8_t * p = ( const uint8_t * )( P ); - uint8_t * h = ( uint8_t * )( S->h ); - int i; + uint8_t *p, *h, *v; + //blake2s_init0( S ); + v = ( uint8_t * )( blake2s_IV ); + h = ( uint8_t * )( S->h ); + p = ( uint8_t * )( P ); /* IV XOR ParamBlock */ memset( S, 0, sizeof( blake2s_state ) ); - for( i = 0; i < BLAKE2S_OUTBYTES; ++i ) h[i] = v[i] ^ p[i]; + for( int i = 0; i < BLAKE2S_OUTBYTES; ++i ) h[i] = v[i] ^ p[i]; + S->outlen = P->digest_length; return 0; } /* Some sort of default parameter block initialization, for sequential blake2s */ -int blake2s_init( blake2s_state *S, const uint8_t outlen ) +int blake2s_init( blake2s_state *S, size_t outlen ) { + if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; + const blake2s_param P = { outlen, @@ -202,14 +232,16 @@ int blake2s_init( blake2s_state *S, const uint8_t outlen ) {0}, {0} }; - /* Move interval verification here? */ - if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; return blake2s_init_param( S, &P ); } -int blake2s_init_key( blake2s_state *S, const uint8_t outlen, const void *key, const uint8_t keylen ) +int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ) { + if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; + + if ( ( !key ) || ( !keylen ) || keylen > BLAKE2S_KEYBYTES ) return -1; + const blake2s_param P = { outlen, @@ -224,11 +256,6 @@ int blake2s_init_key( blake2s_state *S, const uint8_t outlen, const void *key, c {0} }; - /* Move interval verification here? */ - if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; - - if ( ( !key ) || ( !keylen ) || keylen > BLAKE2S_KEYBYTES ) return -1; - if( blake2s_init_param( S, &P ) < 0 ) return -1; @@ -243,11 +270,11 @@ int blake2s_init_key( blake2s_state *S, const uint8_t outlen, const void *key, c } -BLAKE2_LOCAL_INLINE(int) blake2s_compress( blake2s_state *S, const uint8_t block[BLAKE2S_BLOCKBYTES] ) +static inline int blake2s_compress( blake2s_state *S, const uint8_t block[BLAKE2S_BLOCKBYTES] ) { __m128i row1, row2, row3, row4; __m128i buf1, buf2, buf3, buf4; -#if defined(HAVE_SSE41) +#if defined(HAVE_SSE4_1) __m128i t0, t1; #if !defined(HAVE_XOP) __m128i t2; @@ -258,7 +285,7 @@ BLAKE2_LOCAL_INLINE(int) blake2s_compress( blake2s_state *S, const uint8_t block const __m128i r8 = _mm_set_epi8( 12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1 ); const __m128i r16 = _mm_set_epi8( 13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2 ); #endif -#if defined(HAVE_SSE41) +#if defined(HAVE_SSE4_1) const __m128i m0 = LOADU( block + 00 ); const __m128i m1 = LOADU( block + 16 ); const __m128i m2 = LOADU( block + 32 ); @@ -300,8 +327,8 @@ BLAKE2_LOCAL_INLINE(int) blake2s_compress( blake2s_state *S, const uint8_t block return 0; } -/* inlen now in bytes */ -int blake2s_update( blake2s_state *S, const uint8_t *in, uint64_t inlen ) + +int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen ) { while( inlen > 0 ) { @@ -310,11 +337,11 @@ int blake2s_update( blake2s_state *S, const uint8_t *in, uint64_t inlen ) if( inlen > fill ) { - memcpy( S->buf + left, in, fill ); /* Fill buffer */ + memcpy( S->buf + left, in, fill ); // Fill buffer S->buflen += fill; blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); - blake2s_compress( S, S->buf ); /* Compress */ - memcpy( S->buf, S->buf + BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); /* Shift buffer left */ + blake2s_compress( S, S->buf ); // Compress + memcpy( S->buf, S->buf + BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); // Shift buffer left S->buflen -= BLAKE2S_BLOCKBYTES; in += fill; inlen -= fill; @@ -322,7 +349,7 @@ int blake2s_update( blake2s_state *S, const uint8_t *in, uint64_t inlen ) else /* inlen <= fill */ { memcpy( S->buf + left, in, inlen ); - S->buflen += inlen; /* Be lazy, do not compress */ + S->buflen += inlen; // Be lazy, do not compress in += inlen; inlen -= inlen; } @@ -331,24 +358,19 @@ int blake2s_update( blake2s_state *S, const uint8_t *in, uint64_t inlen ) return 0; } -/* Is this correct? */ -int blake2s_final( blake2s_state *S, uint8_t *out, uint8_t outlen ) -{ - uint8_t buffer[BLAKE2S_OUTBYTES] = {0}; - int i; - if( outlen > BLAKE2S_OUTBYTES ) - return -1; +int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen ) +{ + uint8_t buffer[BLAKE2S_OUTBYTES]; - if( blake2s_is_lastblock( S ) ) - return -1; + if(outlen != S->outlen ) return -1; if( S->buflen > BLAKE2S_BLOCKBYTES ) { blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); blake2s_compress( S, S->buf ); S->buflen -= BLAKE2S_BLOCKBYTES; - memmove( S->buf, S->buf + BLAKE2S_BLOCKBYTES, S->buflen ); + memcpy( S->buf, S->buf + BLAKE2S_BLOCKBYTES, S->buflen ); } blake2s_increment_counter( S, ( uint32_t )S->buflen ); @@ -356,15 +378,14 @@ int blake2s_final( blake2s_state *S, uint8_t *out, uint8_t outlen ) memset( S->buf + S->buflen, 0, 2 * BLAKE2S_BLOCKBYTES - S->buflen ); /* Padding */ blake2s_compress( S, S->buf ); - for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ + for( int i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ store32( buffer + sizeof( S->h[i] ) * i, S->h[i] ); memcpy( out, buffer, outlen ); return 0; } -/* inlen, at least, should be uint64_t. Others can be size_t. */ -int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen ) +int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) { blake2s_state S[1]; @@ -388,48 +409,14 @@ int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen if( blake2s_init( S, outlen ) < 0 ) return -1; } - blake2s_update( S, ( const uint8_t * )in, inlen ); - blake2s_final( S, out, outlen ); - return 0; + if( blake2s_update( S, ( uint8_t * )in, inlen ) < 0) return -1; + return blake2s_final( S, out, outlen ); } #if defined(SUPERCOP) int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) { - return blake2s( out, in, NULL, BLAKE2S_OUTBYTES, inlen, 0 ); -} -#endif - -#if defined(BLAKE2S_SELFTEST) -#include -#include "blake2-kat.h" -int main( int argc, char **argv ) -{ - uint8_t key[BLAKE2S_KEYBYTES]; - uint8_t buf[KAT_LENGTH]; - size_t i; - - for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - for( i = 0; i < KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2S_OUTBYTES]; - - if( blake2s( hash, buf, key, BLAKE2S_OUTBYTES, i, BLAKE2S_KEYBYTES ) < 0 || - 0 != memcmp( hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES ) ) - { - puts( "error" ); - return -1; - } - } - - puts( "ok" ); - return 0; + return blake2s( out, in, NULL, BLAKE2S_OUTBYTES, (size_t)inlen, 0 ); } #endif - diff --git a/Modules/_blake2/impl/blake2sp-test.c b/Modules/_blake2/impl/blake2sp-test.c new file mode 100644 index 000000000000..621e3506cfbd --- /dev/null +++ b/Modules/_blake2/impl/blake2sp-test.c @@ -0,0 +1,43 @@ +/* + BLAKE2 reference source code package - optimized C implementations + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . +*/ +#include +#include +#include "blake2.h" +#include "blake2-kat.h" + +int main( int argc, char **argv ) +{ + uint8_t key[BLAKE2S_KEYBYTES]; + uint8_t buf[KAT_LENGTH]; + + for( size_t i = 0; i < BLAKE2S_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( size_t i = 0; i < KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + for( size_t i = 0; i < KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2S_OUTBYTES]; + if( blake2sp( hash, buf, key, BLAKE2S_OUTBYTES, i, BLAKE2S_KEYBYTES ) < 0 || + 0 != memcmp( hash, blake2sp_keyed_kat[i], BLAKE2S_OUTBYTES ) ) + { + puts( "error" ); + return -1; + } + } + + puts( "ok" ); + return 0; +} + diff --git a/Modules/_blake2/impl/blake2sp.c b/Modules/_blake2/impl/blake2sp.c new file mode 100644 index 000000000000..2f32bf3a226b --- /dev/null +++ b/Modules/_blake2/impl/blake2sp.c @@ -0,0 +1,274 @@ +/* + BLAKE2 reference source code package - optimized C implementations + + Written in 2012 by Samuel Neves + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . +*/ + +#include +#include +#include + +#if defined(_OPENMP) +#include +#endif + +#include "blake2.h" +#include "blake2-impl.h" + +#define PARALLELISM_DEGREE 8 + +static int blake2sp_init_leaf( blake2s_state *S, uint8_t outlen, uint8_t keylen, uint64_t offset ) +{ + blake2s_param P[1]; + P->digest_length = outlen; + P->key_length = keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + P->leaf_length = 0; + store48( P->node_offset, offset ); + P->node_depth = 0; + P->inner_length = BLAKE2S_OUTBYTES; + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + blake2s_init_param( S, P ); + S->outlen = P->inner_length; + return 0; +} + +static int blake2sp_init_root( blake2s_state *S, uint8_t outlen, uint8_t keylen ) +{ + blake2s_param P[1]; + P->digest_length = outlen; + P->key_length = keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + P->leaf_length = 0; + store48( P->node_offset, 0ULL ); + P->node_depth = 1; + P->inner_length = BLAKE2S_OUTBYTES; + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + blake2s_init_param( S, P ); + S->outlen = P->digest_length; + return 0; +} + + +int blake2sp_init( blake2sp_state *S, size_t outlen ) +{ + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + + if( blake2sp_init_root( S->R, ( uint8_t ) outlen, 0 ) < 0 ) + return -1; + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2sp_init_leaf( S->S[i], ( uint8_t ) outlen, 0, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + S->outlen = ( uint8_t ) outlen; + return 0; +} + +int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ) +{ + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + if( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + + if( blake2sp_init_root( S->R, ( uint8_t ) outlen, ( uint8_t ) keylen ) < 0 ) + return -1; + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2sp_init_leaf( S->S[i], ( uint8_t ) outlen, ( uint8_t ) keylen, i ) < 0 ) + return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + S->outlen = ( uint8_t ) outlen; + { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset( block, 0, BLAKE2S_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S->S[i], block, BLAKE2S_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + + +int blake2sp_update( blake2sp_state *S, const uint8_t *in, size_t inlen ) +{ + size_t left = S->buflen; + size_t fill = sizeof( S->buf ) - left; + + if( left && inlen >= fill ) + { + memcpy( S->buf + left, in, fill ); + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); + + in += fill; + inlen -= fill; + left = 0; + } + +#if defined(_OPENMP) + omp_set_num_threads(PARALLELISM_DEGREE); + #pragma omp parallel shared(S) +#else + for( size_t id__ = 0; id__ < PARALLELISM_DEGREE; ++id__ ) +#endif + { +#if defined(_OPENMP) + size_t id__ = ( size_t ) omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const uint8_t *in__ = ( const uint8_t * )in; + in__ += id__ * BLAKE2S_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) + { + blake2s_update( S->S[id__], in__, BLAKE2S_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + } + } + + in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ); + inlen %= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + + if( inlen > 0 ) + memcpy( S->buf + left, in, inlen ); + + S->buflen = ( uint32_t ) left + ( uint32_t ) inlen; + return 0; +} + + +int blake2sp_final( blake2sp_state *S, uint8_t *out, size_t outlen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; + + if(S->outlen != outlen) return -1; + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + { + if( S->buflen > i * BLAKE2S_BLOCKBYTES ) + { + size_t left = S->buflen - i * BLAKE2S_BLOCKBYTES; + + if( left > BLAKE2S_BLOCKBYTES ) left = BLAKE2S_BLOCKBYTES; + + blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, left ); + } + + blake2s_final( S->S[i], hash[i], BLAKE2S_OUTBYTES ); + } + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S->R, hash[i], BLAKE2S_OUTBYTES ); + + blake2s_final( S->R, out, outlen ); + return 0; +} + + +int blake2sp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; + blake2s_state S[PARALLELISM_DEGREE][1]; + blake2s_state FS[1]; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if ( NULL == key && keylen > 0 ) return -1; + + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + if( keylen > BLAKE2S_KEYBYTES ) return -1; + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2sp_init_leaf( S[i], ( uint8_t ) outlen, ( uint8_t ) keylen, i ) < 0 ) + return -1; + + S[PARALLELISM_DEGREE - 1]->last_node = 1; // mark last node + + if( keylen > 0 ) + { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset( block, 0, BLAKE2S_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S[i], block, BLAKE2S_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ + } + +#if defined(_OPENMP) + omp_set_num_threads(PARALLELISM_DEGREE); + #pragma omp parallel shared(S,hash) +#else + + for( size_t id__ = 0; id__ < PARALLELISM_DEGREE; ++id__ ) +#endif + { +#if defined(_OPENMP) + size_t id__ = ( size_t ) omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const uint8_t *in__ = ( const uint8_t * )in; + in__ += id__ * BLAKE2S_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) + { + blake2s_update( S[id__], in__, BLAKE2S_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + } + + if( inlen__ > id__ * BLAKE2S_BLOCKBYTES ) + { + const size_t left = inlen__ - id__ * BLAKE2S_BLOCKBYTES; + const size_t len = left <= BLAKE2S_BLOCKBYTES ? left : BLAKE2S_BLOCKBYTES; + blake2s_update( S[id__], in__, len ); + } + + blake2s_final( S[id__], hash[id__], BLAKE2S_OUTBYTES ); + } + + if( blake2sp_init_root( FS, ( uint8_t ) outlen, ( uint8_t ) keylen ) < 0 ) + return -1; + + FS->last_node = 1; + + for( size_t i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( FS, hash[i], BLAKE2S_OUTBYTES ); + + return blake2s_final( FS, out, outlen ); +} + + + + diff --git a/aclocal.m4 b/aclocal.m4 index 85f00dd5fac7..038bd4e2cea2 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -55,7 +55,7 @@ dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], -[m4_define([PKG_MACROS_VERSION], [0.29.1]) +[m4_define([PKG_MACROS_VERSION], [0.29.2]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ @@ -156,7 +156,7 @@ AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no -AC_MSG_CHECKING([for $1]) +AC_MSG_CHECKING([for $2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) @@ -166,11 +166,11 @@ and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else + else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs @@ -187,7 +187,7 @@ installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full diff --git a/configure b/configure index 72889b9d2efc..9f2007fed325 100755 --- a/configure +++ b/configure @@ -11462,14 +11462,14 @@ fi # checks for library functions for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ - clock confstr ctermid dup3 execv faccessat fchmod fchmodat fchown fchownat \ + clock confstr ctermid dup3 execv explicit_bzero explicit_memset faccessat fchmod fchmodat fchown fchownat \ fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \ futimens futimes gai_strerror getentropy \ getgrgid_r getgrnam_r \ getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \ if_nameindex \ - initgroups kill killpg lchown lockf linkat lstat lutimes mmap \ + initgroups kill killpg lchmod lchown lockf linkat lstat lutimes mmap \ memrchr mbrtowc mkdirat mkfifo \ mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ diff --git a/configure.ac b/configure.ac index f548d644327a..0baf0d6660aa 100644 --- a/configure.ac +++ b/configure.ac @@ -3519,15 +3519,13 @@ fi # checks for library functions AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ - clock confstr ctermid dup3 execv faccessat fchmod fchmodat fchown fchownat \ + clock confstr ctermid dup3 execv explicit_bzero explicit_memset faccessat fchmod fchmodat fchown fchownat \ fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \ futimens futimes gai_strerror getentropy \ getgrgid_r getgrnam_r \ getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \ if_nameindex \ - initgroups kill killpg lchown lockf linkat lstat lutimes mmap \ - memrchr mbrtowc mkdirat mkfifo \ mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ diff --git a/pyconfig.h.in b/pyconfig.h.in index 1cafb9ae42dd..dd5f2e393be0 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -302,6 +302,12 @@ /* Define to 1 if you have the `execv' function. */ #undef HAVE_EXECV +/* Define to 1 if you have the `explicit_bzero' function. */ +#undef HAVE_EXPLICIT_BZERO + +/* Define to 1 if you have the `explicit_memset' function. */ +#undef HAVE_EXPLICIT_MEMSET + /* Define to 1 if you have the `expm1' function. */ #undef HAVE_EXPM1 @@ -664,6 +670,9 @@ /* Define to 1 if you have the `memrchr' function. */ #undef HAVE_MEMRCHR +/* Define to 1 if you have the `memset_s' function. */ +#undef HAVE_MEMSET_S + /* Define to 1 if you have the `mkdirat' function. */ #undef HAVE_MKDIRAT From webhook-mailer at python.org Thu May 23 06:03:38 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 May 2019 10:03:38 -0000 Subject: [Python-checkins] bpo-37008: make mock_open handle able to honor next() (GH-13492) Message-ID: https://github.com/python/cpython/commit/394119afc6611f17bac96f5ec6fefa00000ae795 commit: 394119afc6611f17bac96f5ec6fefa00000ae795 branch: master author: Damien Nad? committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-23T03:03:25-07:00 summary: bpo-37008: make mock_open handle able to honor next() (GH-13492) I've reported the issue on https://bugs.python.org/issue37008 and now I'm trying to bring a solution to this minor issue. I think it could be trivially backported to 3.7 branch. https://bugs.python.org/issue37008 files: A Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py M Lib/unittest/test/testmock/testwith.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 654462cbf7e7..b14bf01b28fd 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2680,6 +2680,11 @@ def _iter_side_effect(): for line in _state[0]: yield line + def _next_side_effect(): + if handle.readline.return_value is not None: + return handle.readline.return_value + return next(_state[0]) + global file_spec if file_spec is None: import _io @@ -2701,6 +2706,7 @@ def _iter_side_effect(): handle.readline.side_effect = _state[1] handle.readlines.side_effect = _readlines_side_effect handle.__iter__.side_effect = _iter_side_effect + handle.__next__.side_effect = _next_side_effect def reset_data(*args, **kwargs): _state[0] = _to_stream(read_data) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 307b8b7657af..0f30bccc9cf0 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1702,6 +1702,19 @@ def test_mock_open_dunder_iter_issue(self): self.assertEqual(lines[1], 'Norwegian Blue') self.assertEqual(list(f1), []) + def test_mock_open_using_next(self): + mocked_open = mock.mock_open(read_data='1st line\n2nd line\n3rd line') + f1 = mocked_open('a-name') + line1 = next(f1) + line2 = f1.__next__() + lines = [line for line in f1] + self.assertEqual(line1, '1st line\n') + self.assertEqual(line2, '2nd line\n') + self.assertEqual(lines[0], '3rd line') + self.assertEqual(list(f1), []) + with self.assertRaises(StopIteration): + next(f1) + def test_mock_open_write(self): # Test exception in file writing write() mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV')) diff --git a/Lib/unittest/test/testmock/testwith.py b/Lib/unittest/test/testmock/testwith.py index 5172c222d97a..42ebf3898c89 100644 --- a/Lib/unittest/test/testmock/testwith.py +++ b/Lib/unittest/test/testmock/testwith.py @@ -230,7 +230,22 @@ def test_dunder_iter_data(self): self.assertEqual(lines[1], 'bar\n') self.assertEqual(lines[2], 'baz\n') self.assertEqual(h.readline(), '') + with self.assertRaises(StopIteration): + next(h) + def test_next_data(self): + # Check that next will correctly return the next available + # line and plays well with the dunder_iter part. + mock = mock_open(read_data='foo\nbar\nbaz\n') + with patch('%s.open' % __name__, mock, create=True): + h = open('bar') + line1 = next(h) + line2 = next(h) + lines = [l for l in h] + self.assertEqual(line1, 'foo\n') + self.assertEqual(line2, 'bar\n') + self.assertEqual(lines[0], 'baz\n') + self.assertEqual(h.readline(), '') def test_readlines_data(self): # Test that emulating a file that ends in a newline character works diff --git a/Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst b/Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst new file mode 100644 index 000000000000..42747aead49a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst @@ -0,0 +1,2 @@ +Add support for calling :func:`next` with the mock resulting from +:func:`unittest.mock.mock_open` From webhook-mailer at python.org Thu May 23 06:21:15 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 May 2019 10:21:15 -0000 Subject: [Python-checkins] bpo-37008: make mock_open handle able to honor next() (GH-13492) Message-ID: https://github.com/python/cpython/commit/7cc47e9c19b7d67c8f08df15a413d14cf69f45da commit: 7cc47e9c19b7d67c8f08df15a413d14cf69f45da branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-23T03:21:11-07:00 summary: bpo-37008: make mock_open handle able to honor next() (GH-13492) I've reported the issue on https://bugs.python.org/issue37008 and now I'm trying to bring a solution to this minor issue. I think it could be trivially backported to 3.7 branch. https://bugs.python.org/issue37008 (cherry picked from commit 394119afc6611f17bac96f5ec6fefa00000ae795) Co-authored-by: Damien Nad? files: A Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py M Lib/unittest/test/testmock/testwith.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index f71f1a6fbed4..1e577dff2f41 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2377,6 +2377,11 @@ def _iter_side_effect(): for line in _state[0]: yield line + def _next_side_effect(): + if handle.readline.return_value is not None: + return handle.readline.return_value + return next(_state[0]) + global file_spec if file_spec is None: import _io @@ -2398,6 +2403,7 @@ def _iter_side_effect(): handle.readline.side_effect = _state[1] handle.readlines.side_effect = _readlines_side_effect handle.__iter__.side_effect = _iter_side_effect + handle.__next__.side_effect = _next_side_effect def reset_data(*args, **kwargs): _state[0] = _to_stream(read_data) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index dab17651e057..76a648e57f12 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1650,6 +1650,19 @@ def test_mock_open_dunder_iter_issue(self): self.assertEqual(lines[1], 'Norwegian Blue') self.assertEqual(list(f1), []) + def test_mock_open_using_next(self): + mocked_open = mock.mock_open(read_data='1st line\n2nd line\n3rd line') + f1 = mocked_open('a-name') + line1 = next(f1) + line2 = f1.__next__() + lines = [line for line in f1] + self.assertEqual(line1, '1st line\n') + self.assertEqual(line2, '2nd line\n') + self.assertEqual(lines[0], '3rd line') + self.assertEqual(list(f1), []) + with self.assertRaises(StopIteration): + next(f1) + def test_mock_open_write(self): # Test exception in file writing write() mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV')) diff --git a/Lib/unittest/test/testmock/testwith.py b/Lib/unittest/test/testmock/testwith.py index 0fa42e18eca6..0dda459e8d0d 100644 --- a/Lib/unittest/test/testmock/testwith.py +++ b/Lib/unittest/test/testmock/testwith.py @@ -233,7 +233,22 @@ def test_dunder_iter_data(self): self.assertEqual(lines[1], 'bar\n') self.assertEqual(lines[2], 'baz\n') self.assertEqual(h.readline(), '') + with self.assertRaises(StopIteration): + next(h) + def test_next_data(self): + # Check that next will correctly return the next available + # line and plays well with the dunder_iter part. + mock = mock_open(read_data='foo\nbar\nbaz\n') + with patch('%s.open' % __name__, mock, create=True): + h = open('bar') + line1 = next(h) + line2 = next(h) + lines = [l for l in h] + self.assertEqual(line1, 'foo\n') + self.assertEqual(line2, 'bar\n') + self.assertEqual(lines[0], 'baz\n') + self.assertEqual(h.readline(), '') def test_readlines_data(self): # Test that emulating a file that ends in a newline character works diff --git a/Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst b/Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst new file mode 100644 index 000000000000..42747aead49a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst @@ -0,0 +1,2 @@ +Add support for calling :func:`next` with the mock resulting from +:func:`unittest.mock.mock_open` From webhook-mailer at python.org Thu May 23 10:07:01 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Thu, 23 May 2019 14:07:01 -0000 Subject: [Python-checkins] bpo-36797: Reduce levels of indirection in outdated distutils docs (#13462) Message-ID: https://github.com/python/cpython/commit/e788057a9188ff37e232729815dfda2529079420 commit: e788057a9188ff37e232729815dfda2529079420 branch: master author: Nick Coghlan committer: GitHub date: 2019-05-24T00:06:39+10:00 summary: bpo-36797: Reduce levels of indirection in outdated distutils docs (#13462) files: M Doc/distributing/index.rst M Doc/distutils/index.rst M Doc/distutils/packageindex.rst M Doc/distutils/uploading.rst diff --git a/Doc/distributing/index.rst b/Doc/distributing/index.rst index 5dd14b1f7a60..2e46c7ac8635 100644 --- a/Doc/distributing/index.rst +++ b/Doc/distributing/index.rst @@ -113,11 +113,17 @@ recommended tools`_. .. _currently recommended tools: https://packaging.python.org/guides/tool-recommendations/#packaging-tool-recommendations -Reading the guide -================= +.. index:: + single: Python Package Index (PyPI) + single: PyPI; (see Python Package Index (PyPI)) + +.. _publishing-python-packages: + +Reading the Python Packaging User Guide +======================================= The Python Packaging User Guide covers the various key steps and elements -involved in creating a project: +involved in creating and publishing a project: * `Project structure`_ * `Building and packaging the project`_ diff --git a/Doc/distutils/index.rst b/Doc/distutils/index.rst index c56fafd68d8f..1f72a2554249 100644 --- a/Doc/distutils/index.rst +++ b/Doc/distutils/index.rst @@ -36,7 +36,6 @@ and extensions readily available to a wider audience. configfile.rst sourcedist.rst builtdist.rst - packageindex.rst examples.rst extending.rst commandref.rst diff --git a/Doc/distutils/packageindex.rst b/Doc/distutils/packageindex.rst index f74c4396e545..ccb9a598b2b7 100644 --- a/Doc/distutils/packageindex.rst +++ b/Doc/distutils/packageindex.rst @@ -1,6 +1,4 @@ -.. index:: - single: Python Package Index (PyPI) - single: PyPI; (see Python Package Index (PyPI)) +:orphan: .. _package-index: @@ -12,6 +10,7 @@ The `Python Package Index (PyPI)`_ stores metadata describing distributions packaged with distutils and other publishing tools, as well the distribution archives themselves. -Detailed instructions on using PyPI at :ref:`distributing-index`. +References to up to date PyPI documentation can be found at +:ref:`publishing-python-packages`. .. _Python Package Index (PyPI): https://pypi.org diff --git a/Doc/distutils/uploading.rst b/Doc/distutils/uploading.rst index 4bce6997f9f8..4c391cab072e 100644 --- a/Doc/distutils/uploading.rst +++ b/Doc/distutils/uploading.rst @@ -4,4 +4,5 @@ Uploading Packages to the Package Index *************************************** -The contents of this page have moved to the section :ref:`package-index`. +References to up to date PyPI documentation can be found at +:ref:`publishing-python-packages`. From webhook-mailer at python.org Thu May 23 10:19:46 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 May 2019 14:19:46 -0000 Subject: [Python-checkins] bpo-36797: Reduce levels of indirection in outdated distutils docs (GH-13462) Message-ID: https://github.com/python/cpython/commit/a3488e5902f5c26e5cc289aec2518e7b5058e5d1 commit: a3488e5902f5c26e5cc289aec2518e7b5058e5d1 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-23T07:19:41-07:00 summary: bpo-36797: Reduce levels of indirection in outdated distutils docs (GH-13462) (cherry picked from commit e788057a9188ff37e232729815dfda2529079420) Co-authored-by: Nick Coghlan files: M Doc/distributing/index.rst M Doc/distutils/index.rst M Doc/distutils/packageindex.rst M Doc/distutils/uploading.rst diff --git a/Doc/distributing/index.rst b/Doc/distributing/index.rst index 5dd14b1f7a60..2e46c7ac8635 100644 --- a/Doc/distributing/index.rst +++ b/Doc/distributing/index.rst @@ -113,11 +113,17 @@ recommended tools`_. .. _currently recommended tools: https://packaging.python.org/guides/tool-recommendations/#packaging-tool-recommendations -Reading the guide -================= +.. index:: + single: Python Package Index (PyPI) + single: PyPI; (see Python Package Index (PyPI)) + +.. _publishing-python-packages: + +Reading the Python Packaging User Guide +======================================= The Python Packaging User Guide covers the various key steps and elements -involved in creating a project: +involved in creating and publishing a project: * `Project structure`_ * `Building and packaging the project`_ diff --git a/Doc/distutils/index.rst b/Doc/distutils/index.rst index d6f7640fcb68..aaf4536dfa54 100644 --- a/Doc/distutils/index.rst +++ b/Doc/distutils/index.rst @@ -34,7 +34,6 @@ very little overhead for build/release/install mechanics. configfile.rst sourcedist.rst builtdist.rst - packageindex.rst examples.rst extending.rst commandref.rst diff --git a/Doc/distutils/packageindex.rst b/Doc/distutils/packageindex.rst index f74c4396e545..ccb9a598b2b7 100644 --- a/Doc/distutils/packageindex.rst +++ b/Doc/distutils/packageindex.rst @@ -1,6 +1,4 @@ -.. index:: - single: Python Package Index (PyPI) - single: PyPI; (see Python Package Index (PyPI)) +:orphan: .. _package-index: @@ -12,6 +10,7 @@ The `Python Package Index (PyPI)`_ stores metadata describing distributions packaged with distutils and other publishing tools, as well the distribution archives themselves. -Detailed instructions on using PyPI at :ref:`distributing-index`. +References to up to date PyPI documentation can be found at +:ref:`publishing-python-packages`. .. _Python Package Index (PyPI): https://pypi.org diff --git a/Doc/distutils/uploading.rst b/Doc/distutils/uploading.rst index 4bce6997f9f8..4c391cab072e 100644 --- a/Doc/distutils/uploading.rst +++ b/Doc/distutils/uploading.rst @@ -4,4 +4,5 @@ Uploading Packages to the Package Index *************************************** -The contents of this page have moved to the section :ref:`package-index`. +References to up to date PyPI documentation can be found at +:ref:`publishing-python-packages`. From webhook-mailer at python.org Thu May 23 10:42:55 2019 From: webhook-mailer at python.org (Ezio Melotti) Date: Thu, 23 May 2019 14:42:55 -0000 Subject: [Python-checkins] bpo-36713: Rename duplicated method in test_unicode. (#13525) Message-ID: https://github.com/python/cpython/commit/25d8404c358f3b1cc8321cdc74049d45dcb8d014 commit: 25d8404c358f3b1cc8321cdc74049d45dcb8d014 branch: 2.7 author: Michele Angrisano committer: Ezio Melotti date: 2019-05-23T16:42:50+02:00 summary: bpo-36713: Rename duplicated method in test_unicode. (#13525) modified: Lib/ctypes/test/test_unicode.py modified: Misc/ACKS new file: Misc/NEWS.d/next/Library/2019-05-23-15-57-36.bpo-36713.sjPhnf.rst files: A Misc/NEWS.d/next/Library/2019-05-23-15-57-36.bpo-36713.sjPhnf.rst M Lib/ctypes/test/test_unicode.py M Misc/ACKS diff --git a/Lib/ctypes/test/test_unicode.py b/Lib/ctypes/test/test_unicode.py index 1da5a25f25d3..ec5663a5001b 100644 --- a/Lib/ctypes/test/test_unicode.py +++ b/Lib/ctypes/test/test_unicode.py @@ -93,7 +93,7 @@ def tearDown(self): func.argtypes = None func.restype = ctypes.c_int - def test_ascii_replace(self): + def test_ascii_strict(self): func = self.func ctypes.set_conversion_mode("ascii", "strict") self.assertEqual(func("abc"), "abc") diff --git a/Misc/ACKS b/Misc/ACKS index 3e71016a7ec4..eba64ae02586 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -47,6 +47,7 @@ Juancarlo A?ez Chris Angelico J?r?my Anger Jon Anglin +Michele Angrisano Ankur Ankan Heidi Annexstad Ramchandra Apte diff --git a/Misc/NEWS.d/next/Library/2019-05-23-15-57-36.bpo-36713.sjPhnf.rst b/Misc/NEWS.d/next/Library/2019-05-23-15-57-36.bpo-36713.sjPhnf.rst new file mode 100644 index 000000000000..cc52bff701e6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-23-15-57-36.bpo-36713.sjPhnf.rst @@ -0,0 +1 @@ +Rename the :meth:`test_ascii_replace` to :meth:`test_ascii_strict`. From webhook-mailer at python.org Thu May 23 11:45:46 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 23 May 2019 15:45:46 -0000 Subject: [Python-checkins] bpo-36842: Implement PEP 578 (GH-12613) Message-ID: https://github.com/python/cpython/commit/b82e17e626f7b1cd98aada0b1ebb65cb9f8fb184 commit: b82e17e626f7b1cd98aada0b1ebb65cb9f8fb184 branch: master author: Steve Dower committer: GitHub date: 2019-05-23T08:45:22-07:00 summary: bpo-36842: Implement PEP 578 (GH-12613) Adds sys.audit, sys.addaudithook, io.open_code, and associated C APIs. files: A Include/cpython/fileobject.h A Include/cpython/sysmodule.h A Lib/test/test_audit.py A Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst M Doc/c-api/code.rst M Doc/c-api/file.rst M Doc/c-api/sys.rst M Doc/howto/instrumentation.rst M Doc/library/array.rst M Doc/library/ctypes.rst M Doc/library/functions.rst M Doc/library/io.rst M Doc/library/mmap.rst M Doc/library/os.rst M Doc/library/pickle.rst M Doc/library/socket.rst M Doc/library/sys.rst M Doc/library/urllib.request.rst M Doc/tools/extensions/pyspecific.py M Include/fileobject.h M Include/internal/pycore_pystate.h M Include/pydtrace.d M Include/pydtrace.h M Include/sysmodule.h M Lib/_pyio.py M Lib/importlib/_bootstrap_external.py M Lib/io.py M Lib/pickle.py M Lib/test/libregrtest/setup.py M Lib/test/test_embed.py M Lib/test/test_fileio.py M Lib/test/test_io.py M Lib/urllib/request.py M Lib/zipimport.py M Makefile.pre.in M Modules/_ctypes/_ctypes.c M Modules/_ctypes/callproc.c M Modules/_io/_iomodule.c M Modules/_io/clinic/_iomodule.c.h M Modules/_io/fileio.c M Modules/_pickle.c M Modules/_winapi.c M Modules/arraymodule.c M Modules/mmapmodule.c M Modules/posixmodule.c M Modules/socketmodule.c M Objects/codeobject.c M Objects/descrobject.c M Objects/fileobject.c M Objects/funcobject.c M Objects/object.c M Objects/typeobject.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Parser/asdl_c.py M Parser/parsetok.c M Programs/_testembed.c M Python/Python-ast.c M Python/bltinmodule.c M Python/ceval.c M Python/clinic/sysmodule.c.h M Python/fileutils.c M Python/import.c M Python/importdl.c M Python/importlib_external.h M Python/importlib_zipimport.h M Python/pylifecycle.c M Python/pystate.c M Python/pythonrun.c M Python/sysmodule.c diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 27d3f76d7a3d..fd3f6919d6d7 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -40,6 +40,7 @@ bound into a function. :c:func:`PyCode_New` directly can bind you to a precise Python version since the definition of the bytecode changes often. + .. audit-event:: code.__new__ "code filename name argcount kwonlyargcount nlocals stacksize flags" .. c:function:: PyCodeObject* PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst index defc859dd5c4..543dc60b9f55 100644 --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -60,6 +60,32 @@ the :mod:`io` APIs instead. raised if the end of the file is reached immediately. +.. c:function:: int PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction handler) + + Overrides the normal behavior of :func:`io.open_code` to pass its parameter + through the provided handler. + + The handler is a function of type :c:type:`PyObject *(\*)(PyObject *path, + void *userData)`, where *path* is guaranteed to be :c:type:`PyUnicodeObject`. + + The *userData* pointer is passed into the hook function. Since hook + functions may be called from different runtimes, this pointer should not + refer directly to Python state. + + As this hook is intentionally used during import, avoid importing new modules + during its execution unless they are known to be frozen or available in + ``sys.modules``. + + Once a hook has been set, it cannot be removed or replaced, and later calls to + :c:func:`PyFile_SetOpenCodeHook` will fail. On failure, the function returns + -1 and sets an exception if the interpreter has been initialized. + + This function is safe to call before :c:func:`Py_Initialize`. + + .. versionadded:: 3.8 + + + .. c:function:: int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags) .. index:: single: Py_PRINT_RAW diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 04e169a00dc6..2091da6af0be 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -289,6 +289,56 @@ accessible to C code. They all work with the current interpreter thread's .. versionadded:: 3.2 +.. c:function:: int PySys_Audit(const char *event, const char *format, ...) + + .. index:: single: audit events + + Raises an auditing event with any active hooks. Returns zero for success + and non-zero with an exception set on failure. + + If any hooks have been added, *format* and other arguments will be used + to construct a tuple to pass. Apart from ``N``, the same format characters + as used in :c:func:`Py_BuildValue` are available. If the built value is not + a tuple, it will be added into a single-element tuple. (The ``N`` format + option consumes a reference, but since there is no way to know whether + arguments to this function will be consumed, using it may cause reference + leaks.) + + :func:`sys.audit` performs the same function from Python code. + + .. versionadded:: 3.8 + + +.. c:function:: int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) + + .. index:: single: audit events + + Adds to the collection of active auditing hooks. Returns zero for success + and non-zero on failure. If the runtime has been initialized, also sets an + error on failure. Hooks added through this API are called for all + interpreters created by the runtime. + + This function is safe to call before :c:func:`Py_Initialize`. When called + after runtime initialization, existing audit hooks are notified and may + silently abort the operation by raising an error subclassed from + :class:`Exception` (other errors will not be silenced). + + The hook function is of type :c:type:`int (*)(const char *event, PyObject + *args, void *userData)`, where *args* is guaranteed to be a + :c:type:`PyTupleObject`. The hook function is always called with the GIL + held by the Python interpreter that raised the event. + + The *userData* pointer is passed into the hook function. Since hook + functions may be called from different runtimes, this pointer should not + refer directly to Python state. + + See :pep:`578` for a detailed decription of auditing. Functions in the + runtime and standard library that raise events include the details in each + function's documentation. + + .. versionadded:: 3.8 + + .. _processcontrol: Process Control diff --git a/Doc/howto/instrumentation.rst b/Doc/howto/instrumentation.rst index 50cde3595034..909deb5fed33 100644 --- a/Doc/howto/instrumentation.rst +++ b/Doc/howto/instrumentation.rst @@ -332,6 +332,15 @@ Available static markers .. versionadded:: 3.7 +.. c:function:: audit(str event, void *tuple) + + Fires when :func:`sys.audit` or :c:func:`PySys_Audit` is called. + ``arg0`` is the event name as C string, ``arg1`` is a :c:type:`PyObject` + pointer to a tuple object. + + .. versionadded:: 3.8 + + SystemTap Tapsets ----------------- diff --git a/Doc/library/array.rst b/Doc/library/array.rst index 4ac7bb5391a7..1f95dd61b9fc 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -83,6 +83,7 @@ The module defines the following type: to add initial items to the array. Otherwise, the iterable initializer is passed to the :meth:`extend` method. + .. audit-event:: array.__new__ "typecode initializer" .. data:: typecodes diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 1c60b4bbda13..97172c588ae9 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1509,6 +1509,17 @@ object is available: :c:type:`int`, which is of course not always the truth, so you have to assign the correct :attr:`restype` attribute to use these functions. +.. audit-event:: ctypes.dlopen name + + Loading a library through any of these objects raises an + :ref:`auditing event ` ``ctypes.dlopen`` with string argument + ``name``, the name used to load the library. + +.. audit-event:: ctypes.dlsym "library name" + + Accessing a function on a loaded library raises an auditing event + ``ctypes.dlsym`` with arguments ``library`` (the library object) and ``name`` + (the symbol's name as a string or integer). .. _ctypes-foreign-functions: @@ -2032,6 +2043,12 @@ Data types This method returns a ctypes type instance using the memory specified by *address* which must be an integer. + .. audit-event:: ctypes.cdata address + + This method, and others that indirectly call this method, raises an + :func:`auditing event ` ``ctypes.cdata`` with argument + ``address``. + .. method:: from_param(obj) This method adapts *obj* to a ctypes type. It is called with the actual diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 1a9a8b5beeee..7170a7817205 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -275,6 +275,12 @@ are always available. They are listed here in alphabetical order. If you want to parse Python code into its AST representation, see :func:`ast.parse`. + .. audit-event:: compile "source filename" + + Raises an :func:`auditing event ` ``compile`` with arguments + ``source`` and ``filename``. This event may also be raised by implicit + compilation. + .. note:: When compiling a string with multi-line code in ``'single'`` or @@ -473,6 +479,11 @@ are always available. They are listed here in alphabetical order. See :func:`ast.literal_eval` for a function that can safely evaluate strings with expressions containing only literals. + .. audit-event:: exec code_object + + Raises an :func:`auditing event ` ``exec`` with the code object as + the argument. Code compilation events may also be raised. + .. index:: builtin: exec .. function:: exec(object[, globals[, locals]]) @@ -502,6 +513,11 @@ are always available. They are listed here in alphabetical order. builtins are available to the executed code by inserting your own ``__builtins__`` dictionary into *globals* before passing it to :func:`exec`. + .. audit-event:: exec code_object + + Raises an :func:`auditing event ` ``exec`` with the code object as + the argument. Code compilation events may also be raised. + .. note:: The built-in functions :func:`globals` and :func:`locals` return the current @@ -747,6 +763,16 @@ are always available. They are listed here in alphabetical order. If the :mod:`readline` module was loaded, then :func:`input` will use it to provide elaborate line editing and history features. + .. audit-event:: builtins.input prompt + + Raises an :func:`auditing event ` ``builtins.input`` with + argument ``prompt`` before reading input + + .. audit-event:: builtins.input/result result + + Raises an auditing event ``builtins.input/result`` with the result after + successfully reading input. + .. class:: int([x]) int(x, base=10) @@ -1176,6 +1202,11 @@ are always available. They are listed here in alphabetical order. (where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`, and :mod:`shutil`. + .. audit-event:: open "file mode flags" + + The ``mode`` and ``flags`` arguments may have been modified or inferred from + the original call. + .. versionchanged:: 3.3 diff --git a/Doc/library/io.rst b/Doc/library/io.rst index 0f1251687aeb..2fb27c3aad78 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -120,6 +120,27 @@ High-level Module Interface This is an alias for the builtin :func:`open` function. + .. audit-event:: open "path mode flags" + + This function raises an :func:`auditing event ` ``open`` with + arguments ``path``, ``mode`` and ``flags``. The ``mode`` and ``flags`` + arguments may have been modified or inferred from the original call. + + +.. function:: open_code(path) + + Opens the provided file with mode ``'rb'``. This function should be used + when the intent is to treat the contents as executable code. + + ``path`` should be an absolute path. + + The behavior of this function may be overridden by an earlier call to the + :c:func:`PyFile_SetOpenCodeHook`, however, it should always be considered + interchangeable with ``open(path, 'rb')``. Overriding the behavior is + intended for additional validation or preprocessing of the file. + + .. versionadded:: 3.8 + .. exception:: BlockingIOError diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index 0f895d76b83f..a82caf86e801 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -67,6 +67,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length will be relative to the offset from the beginning of the file. *offset* defaults to 0. *offset* must be a multiple of the :const:`ALLOCATIONGRANULARITY`. + .. audit-event:: mmap.__new__ "fileno length access offset" .. class:: mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset]) :noindex: @@ -155,6 +156,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length mm.close() + .. audit-event:: mmap.__new__ "fileno length access offset" Memory-mapped file objects support the following methods: diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 0bbfce97c54b..6df2b49c5325 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -651,7 +651,7 @@ process and user. File Object Creation -------------------- -This function creates new :term:`file objects `. (See also +These functions create new :term:`file objects `. (See also :func:`~os.open` for opening file descriptors.) @@ -829,11 +829,14 @@ as internal buffering of data. most *length* bytes in size. As of Python 3.3, this is equivalent to ``os.truncate(fd, length)``. + .. audit-event:: os.truncate "fd length" + .. availability:: Unix, Windows. .. versionchanged:: 3.5 Added support for Windows + .. function:: get_blocking(fd) Get the blocking mode of the file descriptor: ``False`` if the @@ -845,6 +848,7 @@ as internal buffering of data. .. versionadded:: 3.5 + .. function:: isatty(fd) Return ``True`` if the file descriptor *fd* is open and connected to a @@ -912,6 +916,8 @@ as internal buffering of data. This function can support :ref:`paths relative to directory descriptors ` with the *dir_fd* parameter. + .. audit-event:: open "path mode flags" + .. versionchanged:: 3.4 The new file descriptor is now non-inheritable. @@ -2756,6 +2762,8 @@ features: This function can support :ref:`specifying a file descriptor `. + .. audit-event:: os.truncate "path length" + .. availability:: Unix, Windows. .. versionadded:: 3.3 @@ -3715,6 +3723,8 @@ written in Python, such as a mail server's external command delivery program. to using this function. See the :ref:`subprocess-replacements` section in the :mod:`subprocess` documentation for some helpful recipes. + .. audit-event:: os.system command + .. availability:: Unix, Windows. diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index 27721e698826..f4c41ac68d2f 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -427,6 +427,7 @@ The :mod:`pickle` module exports two classes, :class:`Pickler` and how they can be loaded, potentially reducing security risks. Refer to :ref:`pickle-restrict` for details. + .. audit-event:: pickle.find_class "module name" .. _pickle-picklable: diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 379633a3b605..e23a4f5380bd 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -526,6 +526,8 @@ The following functions all create :ref:`socket objects `. The newly created socket is :ref:`non-inheritable `. + .. audit-event:: socket.__new__ "self family type protocol" + .. versionchanged:: 3.3 The AF_CAN family was added. The AF_RDS family was added. @@ -718,6 +720,8 @@ The :mod:`socket` module also offers various network-related services: :const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect` method. + .. audit-event:: socket.getaddrinfo "host port family type protocol" + The following example fetches address information for a hypothetical TCP connection to ``example.org`` on port 80 (results may differ on your system if IPv6 isn't enabled):: @@ -753,6 +757,8 @@ The :mod:`socket` module also offers various network-related services: interface. :func:`gethostbyname` does not support IPv6 name resolution, and :func:`getaddrinfo` should be used instead for IPv4/v6 dual stack support. + .. audit-event:: socket.gethostbyname hostname + .. function:: gethostbyname_ex(hostname) @@ -765,12 +771,16 @@ The :mod:`socket` module also offers various network-related services: resolution, and :func:`getaddrinfo` should be used instead for IPv4/v6 dual stack support. + .. audit-event:: socket.gethostbyname hostname + .. function:: gethostname() Return a string containing the hostname of the machine where the Python interpreter is currently executing. + .. audit-event:: socket.gethostname + Note: :func:`gethostname` doesn't always return the fully qualified domain name; use :func:`getfqdn` for that. @@ -785,6 +795,8 @@ The :mod:`socket` module also offers various network-related services: domain name, use the function :func:`getfqdn`. :func:`gethostbyaddr` supports both IPv4 and IPv6. + .. audit-event:: socket.gethostbyaddr ip_address + .. function:: getnameinfo(sockaddr, flags) @@ -798,6 +810,8 @@ The :mod:`socket` module also offers various network-related services: For more information about *flags* you can consult :manpage:`getnameinfo(3)`. + .. audit-event:: socket.getnameinfo sockaddr + .. function:: getprotobyname(protocolname) Translate an Internet protocol name (for example, ``'icmp'``) to a constant @@ -813,6 +827,8 @@ The :mod:`socket` module also offers various network-related services: service. The optional protocol name, if given, should be ``'tcp'`` or ``'udp'``, otherwise any protocol will match. + .. audit-event:: socket.getservbyname "servicename protocolname" + .. function:: getservbyport(port[, protocolname]) @@ -820,6 +836,8 @@ The :mod:`socket` module also offers various network-related services: service. The optional protocol name, if given, should be ``'tcp'`` or ``'udp'``, otherwise any protocol will match. + .. audit-event:: socket.getservbyport "port protocolname" + .. function:: ntohl(x) @@ -1003,6 +1021,8 @@ The :mod:`socket` module also offers various network-related services: Set the machine's hostname to *name*. This will raise an :exc:`OSError` if you don't have enough rights. + .. audit-event:: socket.sethostname name + .. availability:: Unix. .. versionadded:: 3.3 @@ -1078,6 +1098,7 @@ to sockets. Bind the socket to *address*. The socket must not already be bound. (The format of *address* depends on the address family --- see above.) + .. audit-event:: socket.bind "self address" .. method:: socket.close() @@ -1115,6 +1136,8 @@ to sockets. :exc:`InterruptedError` exception if the connection is interrupted by a signal (or the exception raised by the signal handler). + .. audit-event:: socket.connect "self address" + .. versionchanged:: 3.5 The method now waits until the connection completes instead of raising an :exc:`InterruptedError` exception if the connection is interrupted by a @@ -1131,6 +1154,7 @@ to sockets. :c:data:`errno` variable. This is useful to support, for example, asynchronous connects. + .. audit-event:: socket.connect "self address" .. method:: socket.detach() @@ -1472,6 +1496,8 @@ to sockets. bytes sent. (The format of *address* depends on the address family --- see above.) + .. audit-event:: socket.sendto "self address" + .. versionchanged:: 3.5 If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising @@ -1511,6 +1537,8 @@ to sockets. .. availability:: most Unix platforms, possibly others. + .. audit-event:: socket.sendmsg "self address" + .. versionadded:: 3.3 .. versionchanged:: 3.5 diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 3b754bd4e276..0294f74368c0 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -19,6 +19,30 @@ always available. .. versionadded:: 3.2 +.. function:: addaudithook(hook) + + Adds the callable *hook* to the collection of active auditing hooks for the + current interpreter. + + When an auditing event is raised through the :func:`sys.audit` function, each + hook will be called in the order it was added with the event name and the + tuple of arguments. Native hooks added by :c:func:`PySys_AddAuditHook` are + called first, followed by hooks added in the current interpreter. + + Calling this function will trigger an event for all existing hooks, and if + any raise an exception derived from :class:`Exception`, the add will be + silently ignored. As a result, callers cannot assume that their hook has been + added unless they control all existing hooks. + + .. versionadded:: 3.8 + + .. impl-detail:: + + When tracing is enabled, Python hooks are only traced if the callable has + a ``__cantrace__`` member that is set to a true value. Otherwise, trace + functions will not see the hook. + + .. data:: argv The list of command line arguments passed to a Python script. ``argv[0]`` is the @@ -37,6 +61,30 @@ always available. ``[os.fsencode(arg) for arg in sys.argv]``. +.. _auditing: + +.. function:: audit(event, *args) + + .. index:: single: auditing + + Raises an auditing event with any active hooks. The event name is a string + identifying the event and its associated schema, which is the number and + types of arguments. The schema for a given event is considered public and + stable API and should not be modified between releases. + + This function will raise the first exception raised by any hook. In general, + these errors should not be handled and should terminate the process as + quickly as possible. + + Hooks are added using the :func:`sys.addaudithook` or + :c:func:`PySys_AddAuditHook` functions. + + The native equivalent of this function is :c:func:`PySys_Audit`. Using the + native function is preferred when possible. + + .. versionadded:: 3.8 + + .. data:: base_exec_prefix Set during Python startup, before ``site.py`` is run, to the same value as @@ -114,6 +162,8 @@ always available. This function should be used for internal and specialized purposes only. + .. audit-event:: sys._current_frames + .. function:: breakpointhook() @@ -617,6 +667,8 @@ always available. that is deeper than the call stack, :exc:`ValueError` is raised. The default for *depth* is zero, returning the frame at the top of the call stack. + .. audit-event:: sys._getframe + .. impl-detail:: This function should be used for internal and specialized purposes only. @@ -1146,6 +1198,8 @@ always available. ``'return'``, ``'c_call'``, ``'c_return'``, or ``'c_exception'``. *arg* depends on the event type. + .. audit-event:: sys.setprofile + The events have the following meaning: ``'call'`` @@ -1266,6 +1320,8 @@ always available. For more information on code and frame objects, refer to :ref:`types`. + .. audit-event:: sys.settrace + .. impl-detail:: The :func:`settrace` function is intended only for implementing debuggers, @@ -1286,6 +1342,13 @@ always available. first time. The *finalizer* will be called when an asynchronous generator is about to be garbage collected. + .. audit-event:: sys.set_asyncgen_hooks_firstiter + + .. audit-event:: sys.set_asyncgen_hooks_finalizer + + Two auditing events are raised because the underlying API consists of two + calls, each of which must raise its own event. + .. versionadded:: 3.6 See :pep:`525` for more details, and for a reference example of a *finalizer* method see the implementation of diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 14fa27bb08af..1895ae74b4f5 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -95,6 +95,12 @@ The :mod:`urllib.request` module defines the following functions: parameter to ``urllib.urlopen``, can be obtained by using :class:`ProxyHandler` objects. + .. audit-event:: urllib.request "fullurl data headers method" + + The default opener raises an :func:`auditing event ` + ``urllib.request`` with arguments ``fullurl``, ``data``, ``headers``, + ``method`` taken from the request object. + .. versionchanged:: 3.2 *cafile* and *capath* were added. @@ -118,6 +124,7 @@ The :mod:`urllib.request` module defines the following functions: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. function:: install_opener(opener) Install an :class:`OpenerDirector` instance as the default global opener. diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index e097c13eab5f..f79b25048a5a 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -151,6 +151,45 @@ def run(self): return [pnode] +# Support for documenting audit event + +class AuditEvent(Directive): + + has_content = True + required_arguments = 1 + optional_arguments = 1 + final_argument_whitespace = True + + _label = [ + "Raises an :ref:`auditing event ` {name} with no arguments.", + "Raises an :ref:`auditing event ` {name} with argument {args}.", + "Raises an :ref:`auditing event ` {name} with arguments {args}.", + ] + + def run(self): + if len(self.arguments) >= 2 and self.arguments[1]: + args = [ + "``{}``".format(a.strip()) + for a in self.arguments[1].strip("'\"").split() + if a.strip() + ] + else: + args = [] + + label = translators['sphinx'].gettext(self._label[min(2, len(args))]) + text = label.format(name="``{}``".format(self.arguments[0]), + args=", ".join(args)) + + pnode = nodes.paragraph(text, classes=["audit-hook"]) + if self.content: + self.state.nested_parse(self.content, self.content_offset, pnode) + else: + n, m = self.state.inline_text(text, self.lineno) + pnode.extend(n + m) + + return [pnode] + + # Support for documenting decorators class PyDecoratorMixin(object): @@ -424,6 +463,7 @@ def setup(app): app.add_role('source', source_role) app.add_directive('impl-detail', ImplementationDetail) app.add_directive('availability', Availability) + app.add_directive('audit-event', AuditEvent) app.add_directive('deprecated-removed', DeprecatedRemoved) app.add_builder(PydocTopicsBuilder) app.add_builder(suspicious.CheckSuspiciousMarkupBuilder) diff --git a/Include/cpython/fileobject.h b/Include/cpython/fileobject.h new file mode 100644 index 000000000000..57eac13c064c --- /dev/null +++ b/Include/cpython/fileobject.h @@ -0,0 +1,32 @@ +#ifndef Py_CPYTHON_FILEOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +PyAPI_DATA(int) Py_UTF8Mode; +#endif + +/* The std printer acts as a preliminary sys.stderr until the new io + infrastructure is in place. */ +PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int); +PyAPI_DATA(PyTypeObject) PyStdPrinter_Type; + +typedef PyObject * (*Py_OpenCodeHookFunction)(PyObject *, void *); + +PyAPI_FUNC(PyObject *) PyFile_OpenCode(const char *utf8path); +PyAPI_FUNC(PyObject *) PyFile_OpenCodeObject(PyObject *path); +PyAPI_FUNC(int) PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction hook, void *userData); + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/sysmodule.h b/Include/cpython/sysmodule.h new file mode 100644 index 000000000000..72d8ffed29fd --- /dev/null +++ b/Include/cpython/sysmodule.h @@ -0,0 +1,21 @@ +#ifndef Py_CPYTHON_SYSMODULE_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key); +PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *); + +PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *); + +typedef int(*Py_AuditHookFunction)(const char *, PyObject *, void *); + +PyAPI_FUNC(int) PySys_Audit(const char*, const char *, ...); +PyAPI_FUNC(int) PySys_AddAuditHook(Py_AuditHookFunction, void*); + +#ifdef __cplusplus +} +#endif diff --git a/Include/fileobject.h b/Include/fileobject.h index 89e8dd6a2850..456887ef9d04 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -15,32 +15,13 @@ PyAPI_FUNC(PyObject *) PyFile_GetLine(PyObject *, int); PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int); PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *); PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); -#endif /* The default encoding used by the platform file system APIs If non-NULL, this is different than the default encoding for strings */ PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 -PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; -#endif PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding; -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 -PyAPI_DATA(int) Py_UTF8Mode; -#endif - -/* Internal API - - The std printer acts as a preliminary sys.stderr until the new io - infrastructure is in place. */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int); -PyAPI_DATA(PyTypeObject) PyStdPrinter_Type; -#endif /* Py_LIMITED_API */ - /* A routine to check if a file descriptor can be select()-ed. */ #ifdef _MSC_VER /* On Windows, any socket fd can be select()-ed, no matter how high */ @@ -49,6 +30,12 @@ PyAPI_DATA(PyTypeObject) PyStdPrinter_Type; #define _PyIsSelectable_fd(FD) ((unsigned int)(FD) < (unsigned int)FD_SETSIZE) #endif +#ifndef Py_LIMITED_API +# define Py_CPYTHON_FILEOBJECT_H +# include "cpython/fileobject.h" +# undef Py_CPYTHON_FILEOBJECT_H +#endif + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 1561328e6079..ef1d8a061f17 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -9,8 +9,10 @@ extern "C" { #endif #include "cpython/coreconfig.h" +#include "fileobject.h" #include "pystate.h" #include "pythread.h" +#include "sysmodule.h" #include "pycore_gil.h" /* _gil_runtime_state */ #include "pycore_pathconfig.h" @@ -131,6 +133,8 @@ struct _is { uint64_t tstate_next_unique_id; struct _warnings_runtime_state warnings; + + PyObject *audit_hooks; }; PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T); @@ -154,6 +158,13 @@ struct _xidregitem { struct _xidregitem *next; }; +/* runtime audit hook state */ + +typedef struct _Py_AuditHookEntry { + struct _Py_AuditHookEntry *next; + Py_AuditHookFunction hookCFunction; + void *userData; +} _Py_AuditHookEntry; /* GIL state */ @@ -224,6 +235,11 @@ typedef struct pyruntimestate { struct _gilstate_runtime_state gilstate; _PyPreConfig preconfig; + + Py_OpenCodeHookFunction open_code_hook; + void *open_code_userdata; + _Py_AuditHookEntry *audit_hook_head; + // XXX Consolidate globals found via the check-c-globals script. } _PyRuntimeState; diff --git a/Include/pydtrace.d b/Include/pydtrace.d index a6a5e7ec224f..5e6a626b01b8 100644 --- a/Include/pydtrace.d +++ b/Include/pydtrace.d @@ -12,6 +12,7 @@ provider python { probe gc__done(long); probe import__find__load__start(const char *); probe import__find__load__done(const char *, int); + probe audit(const char *, void *); }; #pragma D attributes Evolving/Evolving/Common provider python provider diff --git a/Include/pydtrace.h b/Include/pydtrace.h index 7a04278166b0..75f8e7f70979 100644 --- a/Include/pydtrace.h +++ b/Include/pydtrace.h @@ -36,6 +36,7 @@ static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) {} static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) {} static inline void PyDTrace_IMPORT_FIND_LOAD_START(const char *arg0) {} static inline void PyDTrace_IMPORT_FIND_LOAD_DONE(const char *arg0, int arg1) {} +static inline void PyDTrace_AUDIT(const char *arg0, void *arg1) {} static inline int PyDTrace_LINE_ENABLED(void) { return 0; } static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { return 0; } @@ -48,6 +49,7 @@ static inline int PyDTrace_INSTANCE_DELETE_START_ENABLED(void) { return 0; } static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { return 0; } static inline int PyDTrace_IMPORT_FIND_LOAD_START_ENABLED(void) { return 0; } static inline int PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_AUDIT_ENABLED(void) { return 0; } #endif /* !WITH_DTRACE */ diff --git a/Include/sysmodule.h b/Include/sysmodule.h index c5547ff6742e..670e5d283f77 100644 --- a/Include/sysmodule.h +++ b/Include/sysmodule.h @@ -9,10 +9,6 @@ extern "C" { PyAPI_FUNC(PyObject *) PySys_GetObject(const char *); PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key); -PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *); -#endif PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **); PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int); @@ -34,7 +30,9 @@ PyAPI_FUNC(void) PySys_AddXOption(const wchar_t *); PyAPI_FUNC(PyObject *) PySys_GetXOptions(void); #ifndef Py_LIMITED_API -PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *); +# define Py_CPYTHON_SYSMODULE_H +# include "cpython/sysmodule.h" +# undef Py_CPYTHON_SYSMODULE_H #endif #ifdef __cplusplus diff --git a/Lib/_pyio.py b/Lib/_pyio.py index be5e4266daff..5baca4df82ff 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -254,6 +254,29 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None, result.close() raise +# Define a default pure-Python implementation for open_code() +# that does not allow hooks. Warn on first use. Defined for tests. +def _open_code_with_warning(path): + """Opens the provided file with mode ``'rb'``. This function + should be used when the intent is to treat the contents as + executable code. + + ``path`` should be an absolute path. + + When supported by the runtime, this function can be hooked + in order to allow embedders more control over code files. + This functionality is not supported on the current runtime. + """ + import warnings + warnings.warn("_pyio.open_code() may not be using hooks", + RuntimeWarning, 2) + return open(path, "rb") + +try: + open_code = io.open_code +except AttributeError: + open_code = _open_code_with_warning + class DocDescriptor: """Helper for builtins.open.__doc__ diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index f8ff5f4f2c5c..7da0cd0f1965 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -963,8 +963,12 @@ def get_filename(self, fullname): def get_data(self, path): """Return the data from path as raw bytes.""" - with _io.FileIO(path, 'r') as file: - return file.read() + if isinstance(self, (SourceLoader, ExtensionFileLoader)): + with _io.open_code(str(path)) as file: + return file.read() + else: + with _io.FileIO(path, 'r') as file: + return file.read() # ResourceReader ABC API. diff --git a/Lib/io.py b/Lib/io.py index 968ee5073df1..fbce6efc010c 100644 --- a/Lib/io.py +++ b/Lib/io.py @@ -41,8 +41,8 @@ "Amaury Forgeot d'Arc , " "Benjamin Peterson ") -__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO", - "BytesIO", "StringIO", "BufferedIOBase", +__all__ = ["BlockingIOError", "open", "open_code", "IOBase", "RawIOBase", + "FileIO", "BytesIO", "StringIO", "BufferedIOBase", "BufferedReader", "BufferedWriter", "BufferedRWPair", "BufferedRandom", "TextIOBase", "TextIOWrapper", "UnsupportedOperation", "SEEK_SET", "SEEK_CUR", "SEEK_END"] @@ -52,7 +52,7 @@ import abc from _io import (DEFAULT_BUFFER_SIZE, BlockingIOError, UnsupportedOperation, - open, FileIO, BytesIO, StringIO, BufferedReader, + open, open_code, FileIO, BytesIO, StringIO, BufferedReader, BufferedWriter, BufferedRWPair, BufferedRandom, IncrementalNewlineDecoder, TextIOWrapper) diff --git a/Lib/pickle.py b/Lib/pickle.py index 595beda4765a..be8e3811947b 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -1436,6 +1436,7 @@ def get_extension(self, code): def find_class(self, module, name): # Subclasses may override this. + sys.audit('pickle.find_class', module, name) if self.proto < 3 and self.fix_imports: if (module, name) in _compat_pickle.NAME_MAPPING: module, name = _compat_pickle.NAME_MAPPING[(module, name)] diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 9a6585af9d0d..84931140b102 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -107,6 +107,12 @@ def setup_tests(ns): support.use_resources = ns.use_resources + if hasattr(sys, 'addaudithook'): + # Add an auditing hook for all tests to ensure PySys_Audit is tested + def _test_audit_hook(name, args): + pass + sys.addaudithook(_test_audit_hook) + def replace_stdout(): """Set stdout encoder error handler to backslashreplace (as stderr error diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py new file mode 100644 index 000000000000..5b33d978f99d --- /dev/null +++ b/Lib/test/test_audit.py @@ -0,0 +1,260 @@ +"""Tests for sys.audit and sys.addaudithook +""" + +import os +import subprocess +import sys +import unittest +from test import support + +if not hasattr(sys, "addaudithook") or not hasattr(sys, "audit"): + raise unittest.SkipTest("test only relevant when sys.audit is available") + + +class TestHook: + """Used in standard hook tests to collect any logged events. + + Should be used in a with block to ensure that it has no impact + after the test completes. Audit hooks cannot be removed, so the + best we can do for the test run is disable it by calling close(). + """ + + def __init__(self, raise_on_events=None, exc_type=RuntimeError): + self.raise_on_events = raise_on_events or () + self.exc_type = exc_type + self.seen = [] + self.closed = False + + def __enter__(self, *a): + sys.addaudithook(self) + return self + + def __exit__(self, *a): + self.close() + + def close(self): + self.closed = True + + @property + def seen_events(self): + return [i[0] for i in self.seen] + + def __call__(self, event, args): + if self.closed: + return + self.seen.append((event, args)) + if event in self.raise_on_events: + raise self.exc_type("saw event " + event) + + +class TestFinalizeHook: + """Used in the test_finalize_hooks function to ensure that hooks + are correctly cleaned up, that they are notified about the cleanup, + and are unable to prevent it. + """ + + def __init__(self): + print("Created", id(self), file=sys.stderr, flush=True) + + def __call__(self, event, args): + # Avoid recursion when we call id() below + if event == "builtins.id": + return + + print(event, id(self), file=sys.stderr, flush=True) + + if event == "cpython._PySys_ClearAuditHooks": + raise RuntimeError("Should be ignored") + elif event == "cpython.PyInterpreterState_Clear": + raise RuntimeError("Should be ignored") + + +def run_finalize_test(): + """Called by test_finalize_hooks in a subprocess.""" + sys.addaudithook(TestFinalizeHook()) + + +class AuditTest(unittest.TestCase): + def test_basic(self): + with TestHook() as hook: + sys.audit("test_event", 1, 2, 3) + self.assertEqual(hook.seen[0][0], "test_event") + self.assertEqual(hook.seen[0][1], (1, 2, 3)) + + def test_block_add_hook(self): + # Raising an exception should prevent a new hook from being added, + # but will not propagate out. + with TestHook(raise_on_events="sys.addaudithook") as hook1: + with TestHook() as hook2: + sys.audit("test_event") + self.assertIn("test_event", hook1.seen_events) + self.assertNotIn("test_event", hook2.seen_events) + + def test_block_add_hook_baseexception(self): + # Raising BaseException will propagate out when adding a hook + with self.assertRaises(BaseException): + with TestHook( + raise_on_events="sys.addaudithook", exc_type=BaseException + ) as hook1: + # Adding this next hook should raise BaseException + with TestHook() as hook2: + pass + + def test_finalize_hooks(self): + events = [] + with subprocess.Popen( + [ + sys.executable, + "-c", + "import test.test_audit; test.test_audit.run_finalize_test()", + ], + encoding="utf-8", + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) as p: + p.wait() + for line in p.stderr: + events.append(line.strip().partition(" ")) + firstId = events[0][2] + self.assertSequenceEqual( + [ + ("Created", " ", firstId), + ("cpython._PySys_ClearAuditHooks", " ", firstId), + ], + events, + ) + + def test_pickle(self): + pickle = support.import_module("pickle") + + class PicklePrint: + def __reduce_ex__(self, p): + return str, ("Pwned!",) + + payload_1 = pickle.dumps(PicklePrint()) + payload_2 = pickle.dumps(("a", "b", "c", 1, 2, 3)) + + # Before we add the hook, ensure our malicious pickle loads + self.assertEqual("Pwned!", pickle.loads(payload_1)) + + with TestHook(raise_on_events="pickle.find_class") as hook: + with self.assertRaises(RuntimeError): + # With the hook enabled, loading globals is not allowed + pickle.loads(payload_1) + # pickles with no globals are okay + pickle.loads(payload_2) + + def test_monkeypatch(self): + class A: + pass + + class B: + pass + + class C(A): + pass + + a = A() + + with TestHook() as hook: + # Catch name changes + C.__name__ = "X" + # Catch type changes + C.__bases__ = (B,) + # Ensure bypassing __setattr__ is still caught + type.__dict__["__bases__"].__set__(C, (B,)) + # Catch attribute replacement + C.__init__ = B.__init__ + # Catch attribute addition + C.new_attr = 123 + # Catch class changes + a.__class__ = B + + actual = [(a[0], a[1]) for e, a in hook.seen if e == "object.__setattr__"] + self.assertSequenceEqual( + [(C, "__name__"), (C, "__bases__"), (C, "__bases__"), (a, "__class__")], + actual, + ) + + def test_open(self): + # SSLContext.load_dh_params uses _Py_fopen_obj rather than normal open() + try: + import ssl + + load_dh_params = ssl.create_default_context().load_dh_params + except ImportError: + load_dh_params = None + + # Try a range of "open" functions. + # All of them should fail + with TestHook(raise_on_events={"open"}) as hook: + for fn, *args in [ + (open, support.TESTFN, "r"), + (open, sys.executable, "rb"), + (open, 3, "wb"), + (open, support.TESTFN, "w", -1, None, None, None, False, lambda *a: 1), + (load_dh_params, support.TESTFN), + ]: + if not fn: + continue + self.assertRaises(RuntimeError, fn, *args) + + actual_mode = [(a[0], a[1]) for e, a in hook.seen if e == "open" and a[1]] + actual_flag = [(a[0], a[2]) for e, a in hook.seen if e == "open" and not a[1]] + self.assertSequenceEqual( + [ + i + for i in [ + (support.TESTFN, "r"), + (sys.executable, "r"), + (3, "w"), + (support.TESTFN, "w"), + (support.TESTFN, "rb") if load_dh_params else None, + ] + if i is not None + ], + actual_mode, + ) + self.assertSequenceEqual([], actual_flag) + + def test_cantrace(self): + traced = [] + + def trace(frame, event, *args): + if frame.f_code == TestHook.__call__.__code__: + traced.append(event) + + old = sys.settrace(trace) + try: + with TestHook() as hook: + # No traced call + eval("1") + + # No traced call + hook.__cantrace__ = False + eval("2") + + # One traced call + hook.__cantrace__ = True + eval("3") + + # Two traced calls (writing to private member, eval) + hook.__cantrace__ = 1 + eval("4") + + # One traced call (writing to private member) + hook.__cantrace__ = 0 + finally: + sys.settrace(old) + + self.assertSequenceEqual(["call"] * 4, traced) + + +if __name__ == "__main__": + if len(sys.argv) >= 2 and sys.argv[1] == "spython_test": + # Doesn't matter what we add - it will be blocked + sys.addaudithook(None) + + sys.exit(0) + + unittest.main() diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 32aabe30a5c8..87e90f74bb13 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -927,5 +927,16 @@ def test_init_dont_parse_argv(self): api=API_PYTHON) +class AuditingTests(EmbeddingTestsMixin, unittest.TestCase): + def test_open_code_hook(self): + self.run_embedded_interpreter("test_open_code_hook") + + def test_audit(self): + self.run_embedded_interpreter("test_audit") + + def test_audit_subinterpreter(self): + self.run_embedded_interpreter("test_audit_subinterpreter") + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index 57a02656206f..26e4500ae8cf 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -565,6 +565,7 @@ def __setattr__(self, name, value): self.assertRaises(MyException, MyFileIO, fd) os.close(fd) # should not raise OSError(EBADF) + class COtherFileTests(OtherFileTests, unittest.TestCase): FileIO = _io.FileIO modulename = '_io' @@ -576,10 +577,32 @@ def testInvalidFd_overflow(self): self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MAX + 1) self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MIN - 1) + def test_open_code(self): + # Check that the default behaviour of open_code matches + # open("rb") + with self.FileIO(__file__, "rb") as f: + expected = f.read() + with _io.open_code(__file__) as f: + actual = f.read() + self.assertEqual(expected, actual) + + class PyOtherFileTests(OtherFileTests, unittest.TestCase): FileIO = _pyio.FileIO modulename = '_pyio' + def test_open_code(self): + # Check that the default behaviour of open_code matches + # open("rb") + with self.FileIO(__file__, "rb") as f: + expected = f.read() + with check_warnings(quiet=True) as w: + # Always test _open_code_with_warning + with _pyio._open_code_with_warning(__file__) as f: + actual = f.read() + self.assertEqual(expected, actual) + self.assertNotEqual(w.warnings, []) + def test_main(): # Historically, these tests have been sloppy about removing TESTFN. diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 2c3bf8906679..6f22b35a9ab9 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3861,7 +3861,7 @@ def test___all__(self): for name in self.io.__all__: obj = getattr(self.io, name, None) self.assertIsNotNone(obj, name) - if name == "open": + if name in ("open", "open_code"): continue elif "error" in name.lower() or name == "UnsupportedOperation": self.assertTrue(issubclass(obj, Exception), name) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 9b21afb74e6e..afce8eb1a1b1 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -521,6 +521,7 @@ def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): meth = getattr(processor, meth_name) req = meth(req) + sys.audit('urllib.Request', req.full_url, req.data, req.headers, req.get_method()) response = self._open(req, data) # post-process response diff --git a/Lib/zipimport.py b/Lib/zipimport.py index f430abd6a77c..fd917c16b015 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -351,7 +351,7 @@ def _get_module_info(self, fullname): # data_size and file_offset are 0. def _read_directory(archive): try: - fp = _io.open(archive, 'rb') + fp = _io.open_code(archive) except OSError: raise ZipImportError(f"can't open Zip file: {archive!r}", path=archive) @@ -533,7 +533,7 @@ def _get_data(archive, toc_entry): if data_size < 0: raise ZipImportError('negative data size') - with _io.open(archive, 'rb') as fp: + with _io.open_code(archive) as fp: # Check to make sure the local file header is correct try: fp.seek(file_offset) diff --git a/Makefile.pre.in b/Makefile.pre.in index d006a73c38be..12891e938236 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1052,6 +1052,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/abstract.h \ $(srcdir)/Include/cpython/coreconfig.h \ $(srcdir)/Include/cpython/dictobject.h \ + $(srcdir)/Include/cpython/fileobject.h \ $(srcdir)/Include/cpython/interpreteridobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ @@ -1059,6 +1060,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/pylifecycle.h \ $(srcdir)/Include/cpython/pymem.h \ $(srcdir)/Include/cpython/pystate.h \ + $(srcdir)/Include/cpython/sysmodule.h \ $(srcdir)/Include/cpython/traceback.h \ $(srcdir)/Include/cpython/tupleobject.h \ $(srcdir)/Include/cpython/unicodeobject.h \ diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst new file mode 100644 index 000000000000..5e23d31a2485 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst @@ -0,0 +1 @@ +Implement PEP 578, adding sys.audit, io.open_code and related APIs. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 7b5115359ed7..f4eb53657dd4 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2920,6 +2920,10 @@ PyCData_AtAddress(PyObject *type, void *buf) CDataObject *pd; StgDictObject *dict; + if (PySys_Audit("ctypes.cdata", "n", (Py_ssize_t)buf) < 0) { + return NULL; + } + assert(PyType_Check(type)); dict = PyType_stgdict(type); if (!dict) { @@ -3455,6 +3459,18 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } +#ifdef MS_WIN32 + if (PySys_Audit("ctypes.dlsym", + ((uintptr_t)name & ~0xFFFF) ? "Os" : "On", + dll, name) < 0) { + return NULL; + } +#else + if (PySys_Audit("ctypes.dlsym", "Os", dll, name) < 0) { + return NULL; + } +#endif + obj = PyObject_GetAttrString(dll, "_handle"); if (!obj) { Py_DECREF(ftuple); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index a8ba84be4a76..8682d5487220 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1277,6 +1277,10 @@ static PyObject *load_library(PyObject *self, PyObject *args) if (!name) return NULL; + if (PySys_Audit("ctypes.dlopen", "O", nameobj) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS /* bpo-36085: Limit DLL search directories to avoid pre-loading * attacks and enable use of the AddDllDirectory function. @@ -1382,6 +1386,9 @@ static PyObject *py_dl_open(PyObject *self, PyObject *args) name_str = NULL; name2 = NULL; } + if (PySys_Audit("ctypes.dlopen", "s", name_str) < 0) { + return NULL; + } handle = ctypes_dlopen(name_str, mode); Py_XDECREF(name2); if (!handle) { diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index 590d6ce9f1e5..ba8f0018043f 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -503,6 +503,25 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, Py_XDECREF(modeobj); return NULL; } + +/*[clinic input] +_io.open_code + + path : unicode + +Opens the provided file with the intent to import the contents. + +This may perform extra validation beyond open(), but is otherwise interchangeable +with calling open(path, 'rb'). + +[clinic start generated code]*/ + +static PyObject * +_io_open_code_impl(PyObject *module, PyObject *path) +/*[clinic end generated code: output=2fe4ecbd6f3d6844 input=f5c18e23f4b2ed9f]*/ +{ + return PyFile_OpenCodeObject(path); +} /* * Private helpers for the io module. @@ -630,6 +649,7 @@ iomodule_free(PyObject *mod) { static PyMethodDef module_methods[] = { _IO_OPEN_METHODDEF + _IO_OPEN_CODE_METHODDEF {NULL, NULL} }; diff --git a/Modules/_io/clinic/_iomodule.c.h b/Modules/_io/clinic/_iomodule.c.h index 990c81c35574..00ad616b41fe 100644 --- a/Modules/_io/clinic/_iomodule.c.h +++ b/Modules/_io/clinic/_iomodule.c.h @@ -281,4 +281,46 @@ _io_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw exit: return return_value; } -/*[clinic end generated code: output=19fc9b69a5166f63 input=a9049054013a1b77]*/ + +PyDoc_STRVAR(_io_open_code__doc__, +"open_code($module, /, path)\n" +"--\n" +"\n" +"Opens the provided file with the intent to import the contents.\n" +"\n" +"This may perform extra validation beyond open(), but is otherwise interchangeable\n" +"with calling open(path, \'rb\')."); + +#define _IO_OPEN_CODE_METHODDEF \ + {"open_code", (PyCFunction)(void(*)(void))_io_open_code, METH_FASTCALL|METH_KEYWORDS, _io_open_code__doc__}, + +static PyObject * +_io_open_code_impl(PyObject *module, PyObject *path); + +static PyObject * +_io_open_code(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"path", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "open_code", 0}; + PyObject *argsbuf[1]; + PyObject *path; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("open_code", 1, "str", args[0]); + goto exit; + } + if (PyUnicode_READY(args[0]) == -1) { + goto exit; + } + path = args[0]; + return_value = _io_open_code_impl(module, path); + +exit: + return return_value; +} +/*[clinic end generated code: output=d479285078750d68 input=a9049054013a1b77]*/ diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index c502c430134e..52a6f49e1d32 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -358,6 +358,10 @@ _io_FileIO___init___impl(fileio *self, PyObject *nameobj, const char *mode, flags |= O_CLOEXEC; #endif + if (PySys_Audit("open", "Osi", nameobj, mode, flags) < 0) { + goto error; + } + if (fd >= 0) { self->fd = fd; self->closefd = closefd; diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 87f3cf7b614a..24a5d2277012 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -6659,6 +6659,11 @@ _pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *global; PyObject *module; + if (PySys_Audit("pickle.find_class", "OO", + module_name, global_name) < 0) { + return NULL; + } + /* Try to map the old names used in Python 2.x to the new ones used in Python 3.x. We do this only with old pickle protocols and when the user has not disabled the feature. */ diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 8873519e6ce5..1317fc9a172c 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -461,6 +461,12 @@ _winapi_CreateFile_impl(PyObject *module, LPCTSTR file_name, { HANDLE handle; + if (PySys_Audit("_winapi.CreateFile", "uIIII", + file_name, desired_access, share_mode, + creation_disposition, flags_and_attributes) < 0) { + return INVALID_HANDLE_VALUE; + } + Py_BEGIN_ALLOW_THREADS handle = CreateFile(file_name, desired_access, share_mode, security_attributes, @@ -542,6 +548,10 @@ _winapi_CreateJunction_impl(PyObject *module, LPWSTR src_path, if (wcsncmp(src_path, L"\\??\\", prefix_len) == 0) return PyErr_SetFromWindowsErr(ERROR_INVALID_PARAMETER); + if (PySys_Audit("_winapi.CreateJunction", "uu", src_path, dst_path) < 0) { + return NULL; + } + /* Adjust privileges to allow rewriting directory entry as a junction point. */ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) @@ -670,6 +680,11 @@ _winapi_CreateNamedPipe_impl(PyObject *module, LPCTSTR name, DWORD open_mode, { HANDLE handle; + if (PySys_Audit("_winapi.CreateNamedPipe", "uII", + name, open_mode, pipe_mode) < 0) { + return INVALID_HANDLE_VALUE; + } + Py_BEGIN_ALLOW_THREADS handle = CreateNamedPipe(name, open_mode, pipe_mode, max_instances, out_buffer_size, @@ -704,6 +719,10 @@ _winapi_CreatePipe_impl(PyObject *module, PyObject *pipe_attrs, DWORD size) HANDLE write_pipe; BOOL result; + if (PySys_Audit("_winapi.CreatePipe", NULL) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS result = CreatePipe(&read_pipe, &write_pipe, NULL, size); Py_END_ALLOW_THREADS @@ -1055,6 +1074,11 @@ _winapi_CreateProcess_impl(PyObject *module, wchar_t *command_line_copy = NULL; AttributeList attribute_list = {0}; + if (PySys_Audit("_winapi.CreateProcess", "uuu", application_name, + command_line, current_directory) < 0) { + return NULL; + } + ZeroMemory(&si, sizeof(si)); si.StartupInfo.cb = sizeof(si); @@ -1270,8 +1294,10 @@ _winapi_GetModuleFileName_impl(PyObject *module, HMODULE module_handle) BOOL result; WCHAR filename[MAX_PATH]; + Py_BEGIN_ALLOW_THREADS result = GetModuleFileNameW(module_handle, filename, MAX_PATH); filename[MAX_PATH-1] = '\0'; + Py_END_ALLOW_THREADS if (! result) return PyErr_SetFromWindowsErr(GetLastError()); @@ -1402,9 +1428,16 @@ _winapi_OpenProcess_impl(PyObject *module, DWORD desired_access, { HANDLE handle; + if (PySys_Audit("_winapi.OpenProcess", "II", + process_id, desired_access) < 0) { + return INVALID_HANDLE_VALUE; + } + + Py_BEGIN_ALLOW_THREADS handle = OpenProcess(desired_access, inherit_handle, process_id); + Py_END_ALLOW_THREADS if (handle == NULL) { - PyErr_SetFromWindowsErr(0); + PyErr_SetFromWindowsErr(GetLastError()); handle = INVALID_HANDLE_VALUE; } @@ -1539,6 +1572,7 @@ _winapi_SetNamedPipeHandleState_impl(PyObject *module, HANDLE named_pipe, PyObject *oArgs[3] = {mode, max_collection_count, collect_data_timeout}; DWORD dwArgs[3], *pArgs[3] = {NULL, NULL, NULL}; int i; + BOOL b; for (i = 0 ; i < 3 ; i++) { if (oArgs[i] != Py_None) { @@ -1549,7 +1583,11 @@ _winapi_SetNamedPipeHandleState_impl(PyObject *module, HANDLE named_pipe, } } - if (!SetNamedPipeHandleState(named_pipe, pArgs[0], pArgs[1], pArgs[2])) + Py_BEGIN_ALLOW_THREADS + b = SetNamedPipeHandleState(named_pipe, pArgs[0], pArgs[1], pArgs[2]); + Py_END_ALLOW_THREADS + + if (!b) return PyErr_SetFromWindowsErr(0); Py_RETURN_NONE; @@ -1573,6 +1611,11 @@ _winapi_TerminateProcess_impl(PyObject *module, HANDLE handle, { BOOL result; + if (PySys_Audit("_winapi.TerminateProcess", "nI", + (Py_ssize_t)handle, exit_code) < 0) { + return NULL; + } + result = TerminateProcess(handle, exit_code); if (! result) diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 523afb99e8ae..423cac9910a2 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2635,6 +2635,11 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial)) return NULL; + if (PySys_Audit("array.__new__", "CO", + c, initial ? initial : Py_None) < 0) { + return NULL; + } + if (initial && c != 'u') { if (PyUnicode_Check(initial)) { PyErr_Format(PyExc_TypeError, "cannot use a str to initialize " diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 917c6362c11d..fdd60bbb6eef 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -1110,6 +1110,11 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) "mmap invalid access parameter."); } + if (PySys_Audit("mmap.__new__", "ini" _Py_PARSE_OFF_T, + fileno, map_size, access, offset) < 0) { + return NULL; + } + #ifdef __APPLE__ /* Issue #11277: fsync(2) is not enough on OS X - a special, OS X specific fcntl(2) is necessary to force DISKSYNC and get around mmap(2) bug */ @@ -1240,6 +1245,11 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) return NULL; } + if (PySys_Audit("mmap.__new__", "iniL", + fileno, map_size, access, offset) < 0) { + return NULL; + } + switch((access_mode)access) { case ACCESS_READ: flProtect = PAGE_READONLY; diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 9f15866d9d3d..8ebe3a0be053 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -4264,6 +4264,11 @@ os_system_impl(PyObject *module, const Py_UNICODE *command) /*[clinic end generated code: output=5b7c3599c068ca42 input=303f5ce97df606b0]*/ { long result; + + if (PySys_Audit("system", "(u)", command) < 0) { + return -1; + } + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH result = _wsystem(command); @@ -4286,6 +4291,11 @@ os_system_impl(PyObject *module, PyObject *command) { long result; const char *bytes = PyBytes_AsString(command); + + if (PySys_Audit("system", "(O)", command) < 0) { + return -1; + } + Py_BEGIN_ALLOW_THREADS result = system(bytes); Py_END_ALLOW_THREADS @@ -8279,6 +8289,10 @@ os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd) flags |= O_CLOEXEC; #endif + if (PySys_Audit("open", "OOi", path->object, Py_None, flags) < 0) { + return -1; + } + _Py_BEGIN_SUPPRESS_IPH do { Py_BEGIN_ALLOW_THREADS @@ -9598,6 +9612,10 @@ os_ftruncate_impl(PyObject *module, int fd, Py_off_t length) int result; int async_err = 0; + if (PySys_Audit("os.truncate", "in", fd, length) < 0) { + return NULL; + } + do { Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH @@ -9641,6 +9659,10 @@ os_truncate_impl(PyObject *module, path_t *path, Py_off_t length) if (path->fd != -1) return os_ftruncate_impl(module, path->fd, length); + if (PySys_Audit("os.truncate", "On", path->object, length) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH #ifdef MS_WINDOWS diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index c024542fe709..74cdc0f2f6ca 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3053,6 +3053,11 @@ sock_bind(PySocketSockObject *s, PyObject *addro) if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) { return NULL; } + + if (PySys_Audit("socket.bind", "OO", s, addro) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen); Py_END_ALLOW_THREADS @@ -3219,6 +3224,10 @@ sock_connect(PySocketSockObject *s, PyObject *addro) return NULL; } + if (PySys_Audit("socket.connect", "OO", s, addro) < 0) { + return NULL; + } + res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1); if (res < 0) return NULL; @@ -3246,6 +3255,10 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro) return NULL; } + if (PySys_Audit("socket.connect", "OO", s, addro) < 0) { + return NULL; + } + res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0); if (res < 0) return NULL; @@ -4248,6 +4261,10 @@ sock_sendto(PySocketSockObject *s, PyObject *args) return NULL; } + if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) { + return NULL; + } + ctx.buf = pbuf.buf; ctx.len = pbuf.len; ctx.flags = flags; @@ -4379,8 +4396,15 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args) { goto finally; } + if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) { + return NULL; + } msg.msg_name = &addrbuf; msg.msg_namelen = addrlen; + } else { + if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) { + return NULL; + } } /* Fill in an iovec for each message part, and save the Py_buffer @@ -5030,6 +5054,17 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds) &family, &type, &proto, &fdobj)) return -1; +#ifdef MS_WINDOWS + /* In this case, we don't use the family, type and proto args */ + if (fdobj != NULL && fdobj != Py_None) +#endif + { + if (PySys_Audit("socket.__new__", "Oiii", + s, family, type, proto) < 0) { + return -1; + } + } + if (fdobj != NULL && fdobj != Py_None) { #ifdef MS_WINDOWS /* recreate a socket that was duplicated */ @@ -5042,6 +5077,12 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds) return -1; } memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info)); + + if (PySys_Audit("socket()", "iii", info.iAddressFamily, + info.iSocketType, info.iProtocol) < 0) { + return -1; + } + Py_BEGIN_ALLOW_THREADS fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED); @@ -5284,6 +5325,10 @@ static PyTypeObject sock_type = { static PyObject * socket_gethostname(PyObject *self, PyObject *unused) { + if (PySys_Audit("socket.gethostname", NULL) < 0) { + return NULL; + } + #ifdef MS_WINDOWS /* Don't use winsock's gethostname, as this returns the ANSI version of the hostname, whereas we need a Unicode string. @@ -5362,6 +5407,11 @@ extern int sethostname(const char *, size_t); return NULL; flag = 1; } + + if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) { + return NULL; + } + res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE); if (!res) { res = sethostname(buf.buf, buf.len); @@ -5387,6 +5437,9 @@ socket_gethostbyname(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name)) return NULL; + if (PySys_Audit("socket.gethostbyname", "O", args) < 0) { + goto finally; + } if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0) goto finally; ret = make_ipv4_addr(&addrbuf); @@ -5571,6 +5624,9 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name)) return NULL; + if (PySys_Audit("socket.gethostbyname", "O", args) < 0) { + goto finally; + } if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0) goto finally; Py_BEGIN_ALLOW_THREADS @@ -5649,6 +5705,9 @@ socket_gethostbyaddr(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num)) return NULL; + if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) { + goto finally; + } af = AF_UNSPEC; if (setipaddr(ip_num, sa, sizeof(addr), af) < 0) goto finally; @@ -5720,6 +5779,11 @@ socket_getservbyname(PyObject *self, PyObject *args) struct servent *sp; if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto)) return NULL; + + if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS sp = getservbyname(name, proto); Py_END_ALLOW_THREADS @@ -5757,6 +5821,11 @@ socket_getservbyport(PyObject *self, PyObject *args) "getservbyport: port must be 0-65535."); return NULL; } + + if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS sp = getservbyport(htons((short)port), proto); Py_END_ALLOW_THREADS @@ -6392,6 +6461,12 @@ socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs) pptr = "00"; } #endif + + if (PySys_Audit("socket.getaddrinfo", "OOiii", + hobj, pobj, family, socktype, protocol) < 0) { + return NULL; + } + memset(&hints, 0, sizeof(hints)); hints.ai_family = family; hints.ai_socktype = socktype; @@ -6483,6 +6558,11 @@ socket_getnameinfo(PyObject *self, PyObject *args) "getnameinfo(): flowinfo must be 0-1048575."); return NULL; } + + if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) { + return NULL; + } + PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port); memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 62d7c5d329f0..f4e48a9757e5 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -380,6 +380,12 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw) &PyTuple_Type, &cellvars)) return NULL; + if (PySys_Audit("code.__new__", "OOOiiiii", + code, filename, name, argcount, kwonlyargcount, + nlocals, stacksize, flags) < 0) { + goto cleanup; + } + if (argcount < 0) { PyErr_SetString( PyExc_ValueError, diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 8f1a823768f3..0db8057334fd 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -144,6 +144,14 @@ member_get(PyMemberDescrObject *descr, PyObject *obj, PyObject *type) if (descr_check((PyDescrObject *)descr, obj, &res)) return res; + + if (descr->d_member->flags & READ_RESTRICTED) { + if (PySys_Audit("object.__getattr__", "Os", + obj ? obj : Py_None, descr->d_member->name) < 0) { + return NULL; + } + } + return PyMember_GetOne((char *)obj, descr->d_member); } diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 39c7c109979a..3b026335d3f8 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -2,6 +2,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_pystate.h" #if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER) /* clang MemorySanitizer doesn't yet understand getc_unlocked. */ @@ -33,7 +34,8 @@ PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const c PyObject *io, *stream; _Py_IDENTIFIER(open); - io = PyImport_ImportModule("io"); + /* import _io in case we are being used to open io.py */ + io = PyImport_ImportModule("_io"); if (io == NULL) return NULL; stream = _PyObject_CallMethodId(io, &PyId_open, "isisssi", fd, mode, @@ -514,6 +516,72 @@ PyTypeObject PyStdPrinter_Type = { }; +/* ************************** open_code hook *************************** + * The open_code hook allows embedders to override the method used to + * open files that are going to be used by the runtime to execute code + */ + +int +PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction hook, void *userData) { + if (Py_IsInitialized() && + PySys_Audit("setopencodehook", NULL) < 0) { + return -1; + } + + if (_PyRuntime.open_code_hook) { + if (Py_IsInitialized()) { + PyErr_SetString(PyExc_SystemError, + "failed to change existing open_code hook"); + } + return -1; + } + + _PyRuntime.open_code_hook = hook; + _PyRuntime.open_code_userdata = userData; + return 0; +} + +PyObject * +PyFile_OpenCodeObject(PyObject *path) +{ + PyObject *iomod, *f = NULL; + _Py_IDENTIFIER(open); + + if (!PyUnicode_Check(path)) { + PyErr_Format(PyExc_TypeError, "'path' must be 'str', not '%.200s'", + Py_TYPE(path)->tp_name); + return NULL; + } + + Py_OpenCodeHookFunction hook = _PyRuntime.open_code_hook; + if (hook) { + f = hook(path, _PyRuntime.open_code_userdata); + } else { + iomod = PyImport_ImportModule("_io"); + if (iomod) { + f = _PyObject_CallMethodId(iomod, &PyId_open, "Os", + path, "rb"); + Py_DECREF(iomod); + } + } + + return f; +} + +PyObject * +PyFile_OpenCode(const char *utf8path) +{ + PyObject *pathobj = PyUnicode_FromString(utf8path); + PyObject *f; + if (!pathobj) { + return NULL; + } + f = PyFile_OpenCodeObject(pathobj); + Py_DECREF(pathobj); + return f; +} + + #ifdef __cplusplus } #endif diff --git a/Objects/funcobject.c b/Objects/funcobject.c index e8e2d2e15cca..09b94c264236 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -250,6 +250,10 @@ static PyMemberDef func_memberlist[] = { static PyObject * func_get_code(PyFunctionObject *op, void *Py_UNUSED(ignored)) { + if (PySys_Audit("object.__getattr__", "Os", op, "__code__") < 0) { + return NULL; + } + Py_INCREF(op->func_code); return op->func_code; } @@ -266,6 +270,12 @@ func_set_code(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored)) "__code__ must be set to a code object"); return -1; } + + if (PySys_Audit("object.__setattr__", "OsO", + op, "__code__", value) < 0) { + return -1; + } + nfree = PyCode_GetNumFree((PyCodeObject *)value); nclosure = (op->func_closure == NULL ? 0 : PyTuple_GET_SIZE(op->func_closure)); @@ -329,6 +339,9 @@ func_set_qualname(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored static PyObject * func_get_defaults(PyFunctionObject *op, void *Py_UNUSED(ignored)) { + if (PySys_Audit("object.__getattr__", "Os", op, "__defaults__") < 0) { + return NULL; + } if (op->func_defaults == NULL) { Py_RETURN_NONE; } @@ -348,6 +361,16 @@ func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored "__defaults__ must be set to a tuple object"); return -1; } + if (value) { + if (PySys_Audit("object.__setattr__", "OsO", + op, "__defaults__", value) < 0) { + return -1; + } + } else if (PySys_Audit("object.__delattr__", "Os", + op, "__defaults__") < 0) { + return -1; + } + Py_XINCREF(value); Py_XSETREF(op->func_defaults, value); return 0; @@ -356,6 +379,10 @@ func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored static PyObject * func_get_kwdefaults(PyFunctionObject *op, void *Py_UNUSED(ignored)) { + if (PySys_Audit("object.__getattr__", "Os", + op, "__kwdefaults__") < 0) { + return NULL; + } if (op->func_kwdefaults == NULL) { Py_RETURN_NONE; } @@ -375,6 +402,16 @@ func_set_kwdefaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignor "__kwdefaults__ must be set to a dict object"); return -1; } + if (value) { + if (PySys_Audit("object.__setattr__", "OsO", + op, "__kwdefaults__", value) < 0) { + return -1; + } + } else if (PySys_Audit("object.__delattr__", "Os", + op, "__kwdefaults__") < 0) { + return -1; + } + Py_XINCREF(value); Py_XSETREF(op->func_kwdefaults, value); return 0; @@ -507,6 +544,9 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals, } } } + if (PySys_Audit("function.__new__", "O", code) < 0) { + return NULL; + } newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code, globals); diff --git a/Objects/object.c b/Objects/object.c index 604f5e0d4882..f842ab388967 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1366,6 +1366,14 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, } } + /* XXX [Steve Dower] These are really noisy - worth it? */ + /*if (PyType_Check(obj) || PyModule_Check(obj)) { + if (value && PySys_Audit("object.__setattr__", "OOO", obj, name, value) < 0) + return -1; + if (!value && PySys_Audit("object.__delattr__", "OO", obj, name) < 0) + return -1; + }*/ + if (dict == NULL) { dictptr = _PyObject_GetDictPtr(obj); if (dictptr == NULL) { diff --git a/Objects/typeobject.c b/Objects/typeobject.c index c086f182aa95..49b45b8518cc 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -392,6 +392,12 @@ check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *nam "can't delete %s.%s", type->tp_name, name); return 0; } + + if (PySys_Audit("object.__setattr__", "OsO", + type, name, value) < 0) { + return 0; + } + return 1; } @@ -3956,6 +3962,11 @@ object_set_class(PyObject *self, PyObject *value, void *closure) Py_TYPE(value)->tp_name); return -1; } + if (PySys_Audit("object.__setattr__", "OsO", + self, "__class__", value) < 0) { + return -1; + } + newto = (PyTypeObject *)value; /* In versions of CPython prior to 3.5, the code in compatible_for_assignment was not set up to correctly check for memory diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index df57adcfd605..681c4db65df0 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -129,12 +129,14 @@ + + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 5515d9bedeb1..32964c008aa2 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -90,6 +90,9 @@ Include + + Include + Include @@ -108,6 +111,9 @@ Include + + Include + Include diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index cb0e6d7f9df2..d84c1b13cf10 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1201,6 +1201,10 @@ class PartingShots(StaticVisitor): char *req_name[] = {"Module", "Expression", "Interactive"}; int isinstance; + if (PySys_Audit("compile", "OO", ast, Py_None) < 0) { + return NULL; + } + req_type[0] = (PyObject*)Module_type; req_type[1] = (PyObject*)Expression_type; req_type[2] = (PyObject*)Interactive_type; diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 55fd7f7db3da..a5d78974b871 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -94,6 +94,11 @@ PyParser_ParseStringObject(const char *s, PyObject *filename, if (initerr(err_ret, filename) < 0) return NULL; + if (PySys_Audit("compile", "yO", s, err_ret->filename) < 0) { + err_ret->error = E_ERROR; + return NULL; + } + if (*flags & PyPARSE_IGNORE_COOKIE) tok = PyTokenizer_FromUTF8(s, exec_input); else @@ -165,6 +170,10 @@ PyParser_ParseFileObject(FILE *fp, PyObject *filename, if (initerr(err_ret, filename) < 0) return NULL; + if (PySys_Audit("compile", "OO", Py_None, err_ret->filename) < 0) { + return NULL; + } + if ((tok = PyTokenizer_FromFile(fp, enc, ps1, ps2)) == NULL) { err_ret->error = E_NOMEM; return NULL; diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 6bd55deab401..21d3b445d775 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1091,6 +1091,164 @@ static int test_init_dev_mode(void) return 0; } +static PyObject *_open_code_hook(PyObject *path, void *data) +{ + if (PyUnicode_CompareWithASCIIString(path, "$$test-filename") == 0) { + return PyLong_FromVoidPtr(data); + } + PyObject *io = PyImport_ImportModule("_io"); + if (!io) { + return NULL; + } + return PyObject_CallMethod(io, "open", "Os", path, "rb"); +} + +static int test_open_code_hook(void) +{ + int result = 0; + + /* Provide a hook */ + result = PyFile_SetOpenCodeHook(_open_code_hook, &result); + if (result) { + printf("Failed to set hook\n"); + return 1; + } + /* A second hook should fail */ + result = PyFile_SetOpenCodeHook(_open_code_hook, &result); + if (!result) { + printf("Should have failed to set second hook\n"); + return 2; + } + + Py_IgnoreEnvironmentFlag = 0; + _testembed_Py_Initialize(); + result = 0; + + PyObject *r = PyFile_OpenCode("$$test-filename"); + if (!r) { + PyErr_Print(); + result = 3; + } else { + void *cmp = PyLong_AsVoidPtr(r); + Py_DECREF(r); + if (cmp != &result) { + printf("Did not get expected result from hook\n"); + result = 4; + } + } + + if (!result) { + PyObject *io = PyImport_ImportModule("_io"); + PyObject *r = io + ? PyObject_CallMethod(io, "open_code", "s", "$$test-filename") + : NULL; + if (!r) { + PyErr_Print(); + result = 5; + } else { + void *cmp = PyLong_AsVoidPtr(r); + Py_DECREF(r); + if (cmp != &result) { + printf("Did not get expected result from hook\n"); + result = 6; + } + } + Py_XDECREF(io); + } + + Py_Finalize(); + return result; +} + +static int _audit_hook(const char *event, PyObject *args, void *userdata) +{ + if (strcmp(event, "_testembed.raise") == 0) { + PyErr_SetString(PyExc_RuntimeError, "Intentional error"); + return -1; + } else if (strcmp(event, "_testembed.set") == 0) { + if (!PyArg_ParseTuple(args, "n", userdata)) { + return -1; + } + return 0; + } + return 0; +} + +static int _test_audit(Py_ssize_t setValue) +{ + Py_ssize_t sawSet = 0; + + Py_IgnoreEnvironmentFlag = 0; + PySys_AddAuditHook(_audit_hook, &sawSet); + _testembed_Py_Initialize(); + + if (PySys_Audit("_testembed.raise", NULL) == 0) { + printf("No error raised"); + return 1; + } + if (PySys_Audit("_testembed.nop", NULL) != 0) { + printf("Nop event failed"); + /* Exception from above may still remain */ + PyErr_Clear(); + return 2; + } + if (!PyErr_Occurred()) { + printf("Exception not preserved"); + return 3; + } + PyErr_Clear(); + + if (PySys_Audit("_testembed.set", "n", setValue) != 0) { + PyErr_Print(); + printf("Set event failed"); + return 4; + } + + if (sawSet != 42) { + printf("Failed to see *userData change\n"); + return 5; + } + return 0; +} + +static int test_audit(void) +{ + int result = _test_audit(42); + Py_Finalize(); + return result; +} + +static volatile int _audit_subinterpreter_interpreter_count = 0; + +static int _audit_subinterpreter_hook(const char *event, PyObject *args, void *userdata) +{ + printf("%s\n", event); + if (strcmp(event, "cpython.PyInterpreterState_New") == 0) { + _audit_subinterpreter_interpreter_count += 1; + } + return 0; +} + +static int test_audit_subinterpreter(void) +{ + PyThreadState *ts; + + Py_IgnoreEnvironmentFlag = 0; + PySys_AddAuditHook(_audit_subinterpreter_hook, NULL); + _testembed_Py_Initialize(); + + ts = Py_NewInterpreter(); + ts = Py_NewInterpreter(); + ts = Py_NewInterpreter(); + + Py_Finalize(); + + switch (_audit_subinterpreter_interpreter_count) { + case 3: return 0; + case 0: return -1; + default: return _audit_subinterpreter_interpreter_count; + } +} static int test_init_read_set(void) { @@ -1299,6 +1457,9 @@ static struct TestCase TestCases[] = { {"test_init_run_main", test_init_run_main}, {"test_init_main", test_init_main}, {"test_run_main", test_run_main}, + {"test_open_code_hook", test_open_code_hook}, + {"test_audit", test_audit}, + {"test_audit_subinterpreter", test_audit_subinterpreter}, {NULL, NULL} }; diff --git a/Python/Python-ast.c b/Python/Python-ast.c index e84a7586a707..39a40eedca32 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -9024,6 +9024,10 @@ mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_ver char *req_name[] = {"Module", "Expression", "Interactive"}; int isinstance; + if (PySys_Audit("compile", "OO", ast, Py_None) < 0) { + return NULL; + } + req_type[0] = (PyObject*)Module_type; req_type[1] = (PyObject*)Expression_type; req_type[2] = (PyObject*)Interactive_type; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 047cca057b41..ff5a51216939 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -977,9 +977,13 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals, } if (PyCode_Check(source)) { + if (PySys_Audit("exec", "O", source) < 0) { + return NULL; + } + if (PyCode_GetNumFree((PyCodeObject *)source) > 0) { PyErr_SetString(PyExc_TypeError, - "code object passed to eval() may not contain free variables"); + "code object passed to eval() may not contain free variables"); return NULL; } return PyEval_EvalCode(source, globals, locals); @@ -1061,6 +1065,10 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, } if (PyCode_Check(source)) { + if (PySys_Audit("exec", "O", source) < 0) { + return NULL; + } + if (PyCode_GetNumFree((PyCodeObject *)source) > 0) { PyErr_SetString(PyExc_TypeError, "code object passed to exec() may not " @@ -1207,7 +1215,14 @@ static PyObject * builtin_id(PyModuleDef *self, PyObject *v) /*[clinic end generated code: output=0aa640785f697f65 input=5a534136419631f4]*/ { - return PyLong_FromVoidPtr(v); + PyObject *id = PyLong_FromVoidPtr(v); + + if (id && PySys_Audit("builtins.id", "O", id) < 0) { + Py_DECREF(id); + return NULL; + } + + return id; } @@ -1986,6 +2001,10 @@ builtin_input_impl(PyObject *module, PyObject *prompt) return NULL; } + if (PySys_Audit("builtins.input", "O", prompt ? prompt : Py_None) < 0) { + return NULL; + } + /* First of all, flush stderr */ tmp = _PyObject_CallMethodId(ferr, &PyId_flush, NULL); if (tmp == NULL) @@ -2116,6 +2135,13 @@ builtin_input_impl(PyObject *module, PyObject *prompt) Py_DECREF(stdin_errors); Py_XDECREF(po); PyMem_FREE(s); + + if (result != NULL) { + if (PySys_Audit("builtins.input/result", "O", result) < 0) { + return NULL; + } + } + return result; _readline_errors: diff --git a/Python/ceval.c b/Python/ceval.c index 1bb4704572b4..781b10dfac9a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4555,6 +4555,10 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj, void PyEval_SetProfile(Py_tracefunc func, PyObject *arg) { + if (PySys_Audit("sys.setprofile", NULL) < 0) { + return; + } + PyThreadState *tstate = _PyThreadState_GET(); PyObject *temp = tstate->c_profileobj; Py_XINCREF(arg); @@ -4572,6 +4576,10 @@ PyEval_SetProfile(Py_tracefunc func, PyObject *arg) void PyEval_SetTrace(Py_tracefunc func, PyObject *arg) { + if (PySys_Audit("sys.settrace", NULL) < 0) { + return; + } + _PyRuntimeState *runtime = &_PyRuntime; PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); PyObject *temp = tstate->c_traceobj; @@ -4608,6 +4616,11 @@ void _PyEval_SetCoroutineWrapper(PyObject *wrapper) { PyThreadState *tstate = _PyThreadState_GET(); + + if (PySys_Audit("sys.set_coroutine_wrapper", NULL) < 0) { + return; + } + Py_XINCREF(wrapper); Py_XSETREF(tstate->coroutine_wrapper, wrapper); } @@ -4623,6 +4636,11 @@ void _PyEval_SetAsyncGenFirstiter(PyObject *firstiter) { PyThreadState *tstate = _PyThreadState_GET(); + + if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) { + return; + } + Py_XINCREF(firstiter); Py_XSETREF(tstate->async_gen_firstiter, firstiter); } @@ -4638,6 +4656,11 @@ void _PyEval_SetAsyncGenFinalizer(PyObject *finalizer) { PyThreadState *tstate = _PyThreadState_GET(); + + if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) { + return; + } + Py_XINCREF(finalizer); Py_XSETREF(tstate->async_gen_finalizer, finalizer); } diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index aede60ac85b5..2a4ec72b0dc3 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -2,6 +2,38 @@ preserve [clinic start generated code]*/ +PyDoc_STRVAR(sys_addaudithook__doc__, +"addaudithook($module, /, hook)\n" +"--\n" +"\n" +"Adds a new audit hook callback."); + +#define SYS_ADDAUDITHOOK_METHODDEF \ + {"addaudithook", (PyCFunction)(void(*)(void))sys_addaudithook, METH_FASTCALL|METH_KEYWORDS, sys_addaudithook__doc__}, + +static PyObject * +sys_addaudithook_impl(PyObject *module, PyObject *hook); + +static PyObject * +sys_addaudithook(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"hook", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "addaudithook", 0}; + PyObject *argsbuf[1]; + PyObject *hook; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + hook = args[0]; + return_value = sys_addaudithook_impl(module, hook); + +exit: + return return_value; +} + PyDoc_STRVAR(sys_displayhook__doc__, "displayhook($module, object, /)\n" "--\n" @@ -1076,4 +1108,4 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=603e4d5a453dc769 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3c32bc91ec659509 input=a9049054013a1b77]*/ diff --git a/Python/fileutils.c b/Python/fileutils.c index dfad48edb81a..178e2f1268f8 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1262,6 +1262,10 @@ _Py_open_impl(const char *pathname, int flags, int gil_held) #endif if (gil_held) { + if (PySys_Audit("open", "sOi", pathname, Py_None, flags) < 0) { + return -1; + } + do { Py_BEGIN_ALLOW_THREADS fd = open(pathname, flags); @@ -1331,6 +1335,9 @@ FILE * _Py_wfopen(const wchar_t *path, const wchar_t *mode) { FILE *f; + if (PySys_Audit("open", "uui", path, mode, 0) < 0) { + return NULL; + } #ifndef MS_WINDOWS char *cpath; char cmode[10]; @@ -1366,6 +1373,10 @@ _Py_wfopen(const wchar_t *path, const wchar_t *mode) FILE* _Py_fopen(const char *pathname, const char *mode) { + if (PySys_Audit("open", "ssi", pathname, mode, 0) < 0) { + return NULL; + } + FILE *f = fopen(pathname, mode); if (f == NULL) return NULL; @@ -1401,6 +1412,9 @@ _Py_fopen_obj(PyObject *path, const char *mode) assert(PyGILState_Check()); + if (PySys_Audit("open", "Osi", path, mode, 0) < 0) { + return NULL; + } if (!PyUnicode_Check(path)) { PyErr_Format(PyExc_TypeError, "str file path expected under Windows, got %R", @@ -1434,6 +1448,10 @@ _Py_fopen_obj(PyObject *path, const char *mode) return NULL; path_bytes = PyBytes_AS_STRING(bytes); + if (PySys_Audit("open", "Osi", path, mode, 0) < 0) { + return NULL; + } + do { Py_BEGIN_ALLOW_THREADS f = fopen(path_bytes, mode); diff --git a/Python/import.c b/Python/import.c index c634edb4c7fc..ec172b29f739 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1661,6 +1661,17 @@ import_find_and_load(PyObject *abs_name) _PyTime_t t1 = 0, accumulated_copy = accumulated; + PyObject *sys_path = PySys_GetObject("path"); + PyObject *sys_meta_path = PySys_GetObject("meta_path"); + PyObject *sys_path_hooks = PySys_GetObject("path_hooks"); + if (PySys_Audit("import", "OOOOO", + abs_name, Py_None, sys_path ? sys_path : Py_None, + sys_meta_path ? sys_meta_path : Py_None, + sys_path_hooks ? sys_path_hooks : Py_None) < 0) { + return NULL; + } + + /* XOptions is initialized after first some imports. * So we can't have negative cache before completed initialization. * Anyway, importlib._find_and_load is much slower than diff --git a/Python/importdl.c b/Python/importdl.c index 50231ff28848..1d0d32a2371f 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -119,6 +119,11 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp) if (path == NULL) goto error; + if (PySys_Audit("import", "OOOOO", name_unicode, path, + Py_None, Py_None, Py_None) < 0) { + return NULL; + } + #ifdef MS_WINDOWS exportfunc = _PyImport_FindSharedFuncptrWindows(hook_prefix, name_buf, path, fp); diff --git a/Python/importlib_external.h b/Python/importlib_external.h index b5b4df228057..36b95d99b237 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1460,1235 +1460,1241 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,0,0,115,2,0,0,0,0,3,122,23,70,105,108,101, 76,111,97,100,101,114,46,103,101,116,95,102,105,108,101,110, 97,109,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,10,0,0,0,67,0,0,0,115,44,0,0, - 0,116,0,160,1,124,1,100,1,161,2,143,22,125,2,124, - 2,160,2,161,0,87,0,2,0,53,0,81,0,82,0,163, - 0,83,0,81,0,82,0,88,0,100,2,83,0,41,3,122, - 39,82,101,116,117,114,110,32,116,104,101,32,100,97,116,97, - 32,102,114,111,109,32,112,97,116,104,32,97,115,32,114,97, - 119,32,98,121,116,101,115,46,218,1,114,78,41,3,114,64, - 0,0,0,114,65,0,0,0,90,4,114,101,97,100,41,3, - 114,119,0,0,0,114,44,0,0,0,114,68,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,227, - 0,0,0,196,3,0,0,115,4,0,0,0,0,2,14,1, - 122,19,70,105,108,101,76,111,97,100,101,114,46,103,101,116, - 95,100,97,116,97,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,18, - 0,0,0,124,0,160,0,124,1,161,1,114,14,124,0,83, - 0,100,0,83,0,114,110,0,0,0,41,1,114,182,0,0, - 0,169,2,114,119,0,0,0,114,216,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,19,103,101, - 116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101, - 114,203,3,0,0,115,6,0,0,0,0,2,10,1,4,1, - 122,30,70,105,108,101,76,111,97,100,101,114,46,103,101,116, + 3,0,0,0,10,0,0,0,67,0,0,0,115,102,0,0, + 0,116,0,124,0,116,1,116,2,102,2,131,2,114,58,116, + 3,160,4,116,5,124,1,131,1,161,1,143,22,125,2,124, + 2,160,6,161,0,87,0,2,0,53,0,81,0,82,0,163, + 0,83,0,81,0,82,0,88,0,110,40,116,3,160,7,124, + 1,100,1,161,2,143,22,125,2,124,2,160,6,161,0,87, + 0,2,0,53,0,81,0,82,0,163,0,83,0,81,0,82, + 0,88,0,100,2,83,0,41,3,122,39,82,101,116,117,114, + 110,32,116,104,101,32,100,97,116,97,32,102,114,111,109,32, + 112,97,116,104,32,97,115,32,114,97,119,32,98,121,116,101, + 115,46,218,1,114,78,41,8,114,161,0,0,0,114,221,0, + 0,0,218,19,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,114,64,0,0,0,90,9,111,112, + 101,110,95,99,111,100,101,114,85,0,0,0,90,4,114,101, + 97,100,114,65,0,0,0,41,3,114,119,0,0,0,114,44, + 0,0,0,114,68,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,227,0,0,0,196,3,0,0, + 115,10,0,0,0,0,2,14,1,16,1,28,2,14,1,122, + 19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, + 100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,18,0, + 0,0,124,0,160,0,124,1,161,1,114,14,124,0,83,0, + 100,0,83,0,114,110,0,0,0,41,1,114,182,0,0,0, + 169,2,114,119,0,0,0,114,216,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,19,103,101,116, 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, + 207,3,0,0,115,6,0,0,0,0,2,10,1,4,1,122, + 30,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, + 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 4,0,0,0,67,0,0,0,115,32,0,0,0,116,0,116, + 1,124,0,106,2,131,1,100,1,25,0,124,1,131,2,125, + 2,116,3,160,4,124,2,100,2,161,2,83,0,41,3,78, + 114,73,0,0,0,114,251,0,0,0,41,5,114,38,0,0, + 0,114,47,0,0,0,114,44,0,0,0,114,64,0,0,0, + 114,65,0,0,0,169,3,114,119,0,0,0,90,8,114,101, + 115,111,117,114,99,101,114,44,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,13,111,112,101,110, + 95,114,101,115,111,117,114,99,101,213,3,0,0,115,4,0, + 0,0,0,1,20,1,122,24,70,105,108,101,76,111,97,100, + 101,114,46,111,112,101,110,95,114,101,115,111,117,114,99,101, 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,4,0,0,0,67,0,0,0,115,32,0,0,0,116,0, - 116,1,124,0,106,2,131,1,100,1,25,0,124,1,131,2, - 125,2,116,3,160,4,124,2,100,2,161,2,83,0,41,3, - 78,114,73,0,0,0,114,251,0,0,0,41,5,114,38,0, - 0,0,114,47,0,0,0,114,44,0,0,0,114,64,0,0, - 0,114,65,0,0,0,169,3,114,119,0,0,0,90,8,114, - 101,115,111,117,114,99,101,114,44,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,13,111,112,101, - 110,95,114,101,115,111,117,114,99,101,209,3,0,0,115,4, - 0,0,0,0,1,20,1,122,24,70,105,108,101,76,111,97, - 100,101,114,46,111,112,101,110,95,114,101,115,111,117,114,99, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,124, - 0,160,0,124,1,161,1,115,14,116,1,130,1,116,2,116, - 3,124,0,106,4,131,1,100,1,25,0,124,1,131,2,125, - 2,124,2,83,0,169,2,78,114,73,0,0,0,41,5,218, - 11,105,115,95,114,101,115,111,117,114,99,101,218,17,70,105, - 108,101,78,111,116,70,111,117,110,100,69,114,114,111,114,114, - 38,0,0,0,114,47,0,0,0,114,44,0,0,0,114,254, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,13,114,101,115,111,117,114,99,101,95,112,97,116, - 104,213,3,0,0,115,8,0,0,0,0,1,10,1,4,1, - 20,1,122,24,70,105,108,101,76,111,97,100,101,114,46,114, - 101,115,111,117,114,99,101,95,112,97,116,104,99,2,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, - 0,67,0,0,0,115,40,0,0,0,116,0,124,1,107,6, - 114,12,100,1,83,0,116,1,116,2,124,0,106,3,131,1, - 100,2,25,0,124,1,131,2,125,2,116,4,124,2,131,1, - 83,0,41,3,78,70,114,73,0,0,0,41,5,114,35,0, - 0,0,114,38,0,0,0,114,47,0,0,0,114,44,0,0, - 0,114,54,0,0,0,169,3,114,119,0,0,0,114,117,0, - 0,0,114,44,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,1,1,0,0,219,3,0,0,115, - 8,0,0,0,0,1,8,1,4,1,20,1,122,22,70,105, - 108,101,76,111,97,100,101,114,46,105,115,95,114,101,115,111, - 117,114,99,101,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,5,0,0,0,67,0,0,0,115,24,0, - 0,0,116,0,116,1,160,2,116,3,124,0,106,4,131,1, - 100,1,25,0,161,1,131,1,83,0,114,0,1,0,0,41, - 5,218,4,105,116,101,114,114,2,0,0,0,218,7,108,105, - 115,116,100,105,114,114,47,0,0,0,114,44,0,0,0,114, - 246,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,8,99,111,110,116,101,110,116,115,225,3,0, - 0,115,2,0,0,0,0,1,122,19,70,105,108,101,76,111, - 97,100,101,114,46,99,111,110,116,101,110,116,115,41,17,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, - 0,0,0,114,209,0,0,0,114,243,0,0,0,114,247,0, - 0,0,114,136,0,0,0,114,220,0,0,0,114,179,0,0, - 0,114,227,0,0,0,114,253,0,0,0,114,255,0,0,0, - 114,3,1,0,0,114,1,1,0,0,114,7,1,0,0,90, - 13,95,95,99,108,97,115,115,99,101,108,108,95,95,114,3, - 0,0,0,114,3,0,0,0,114,249,0,0,0,114,6,0, - 0,0,114,239,0,0,0,161,3,0,0,115,30,0,0,0, - 8,2,4,3,8,6,8,4,8,3,2,1,14,11,2,1, - 10,4,8,7,2,1,10,5,8,4,8,6,8,6,114,239, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,64,0,0,0,115,46,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, - 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100, - 7,156,1,100,8,100,9,132,2,90,6,100,10,83,0,41, - 11,218,16,83,111,117,114,99,101,70,105,108,101,76,111,97, - 100,101,114,122,62,67,111,110,99,114,101,116,101,32,105,109, - 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32, - 83,111,117,114,99,101,76,111,97,100,101,114,32,117,115,105, - 110,103,32,116,104,101,32,102,105,108,101,32,115,121,115,116, - 101,109,46,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,22,0,0, - 0,116,0,124,1,131,1,125,2,124,2,106,1,124,2,106, - 2,100,1,156,2,83,0,41,2,122,33,82,101,116,117,114, - 110,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102, - 111,114,32,116,104,101,32,112,97,116,104,46,41,2,114,169, - 0,0,0,114,234,0,0,0,41,3,114,49,0,0,0,218, - 8,115,116,95,109,116,105,109,101,90,7,115,116,95,115,105, - 122,101,41,3,114,119,0,0,0,114,44,0,0,0,114,238, + 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, + 160,0,124,1,161,1,115,14,116,1,130,1,116,2,116,3, + 124,0,106,4,131,1,100,1,25,0,124,1,131,2,125,2, + 124,2,83,0,169,2,78,114,73,0,0,0,41,5,218,11, + 105,115,95,114,101,115,111,117,114,99,101,218,17,70,105,108, + 101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,38, + 0,0,0,114,47,0,0,0,114,44,0,0,0,114,255,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,13,114,101,115,111,117,114,99,101,95,112,97,116,104, + 217,3,0,0,115,8,0,0,0,0,1,10,1,4,1,20, + 1,122,24,70,105,108,101,76,111,97,100,101,114,46,114,101, + 115,111,117,114,99,101,95,112,97,116,104,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,40,0,0,0,116,0,124,1,107,6,114, + 12,100,1,83,0,116,1,116,2,124,0,106,3,131,1,100, + 2,25,0,124,1,131,2,125,2,116,4,124,2,131,1,83, + 0,41,3,78,70,114,73,0,0,0,41,5,114,35,0,0, + 0,114,38,0,0,0,114,47,0,0,0,114,44,0,0,0, + 114,54,0,0,0,169,3,114,119,0,0,0,114,117,0,0, + 0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,2,1,0,0,223,3,0,0,115,8, + 0,0,0,0,1,8,1,4,1,20,1,122,22,70,105,108, + 101,76,111,97,100,101,114,46,105,115,95,114,101,115,111,117, + 114,99,101,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,5,0,0,0,67,0,0,0,115,24,0,0, + 0,116,0,116,1,160,2,116,3,124,0,106,4,131,1,100, + 1,25,0,161,1,131,1,83,0,114,1,1,0,0,41,5, + 218,4,105,116,101,114,114,2,0,0,0,218,7,108,105,115, + 116,100,105,114,114,47,0,0,0,114,44,0,0,0,114,246, 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,224,0,0,0,233,3,0,0,115,4,0,0,0, - 0,2,8,1,122,27,83,111,117,114,99,101,70,105,108,101, - 76,111,97,100,101,114,46,112,97,116,104,95,115,116,97,116, - 115,99,4,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,24,0,0,0,116, - 0,124,1,131,1,125,4,124,0,106,1,124,2,124,3,124, - 4,100,1,141,3,83,0,41,2,78,169,1,218,5,95,109, - 111,100,101,41,2,114,115,0,0,0,114,225,0,0,0,41, - 5,114,119,0,0,0,114,108,0,0,0,114,107,0,0,0, - 114,26,0,0,0,114,52,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,226,0,0,0,238,3, - 0,0,115,4,0,0,0,0,2,8,1,122,32,83,111,117, - 114,99,101,70,105,108,101,76,111,97,100,101,114,46,95,99, - 97,99,104,101,95,98,121,116,101,99,111,100,101,114,60,0, - 0,0,114,10,1,0,0,99,3,0,0,0,0,0,0,0, - 1,0,0,0,9,0,0,0,11,0,0,0,67,0,0,0, - 115,0,1,0,0,116,0,124,1,131,1,92,2,125,4,125, - 5,103,0,125,6,124,4,114,52,116,1,124,4,131,1,115, - 52,116,0,124,4,131,1,92,2,125,4,125,7,124,6,160, - 2,124,7,161,1,1,0,113,16,116,3,124,6,131,1,68, - 0,93,112,125,7,116,4,124,4,124,7,131,2,125,4,122, - 14,116,5,160,6,124,4,161,1,1,0,87,0,110,82,4, - 0,116,7,107,10,114,112,1,0,1,0,1,0,89,0,113, - 60,89,0,110,60,4,0,116,8,107,10,114,170,1,0,125, - 8,1,0,122,30,116,9,160,10,100,1,124,4,124,8,161, - 3,1,0,87,0,89,0,162,10,1,0,100,2,83,0,87, - 0,53,0,100,2,125,8,126,8,88,0,89,0,110,2,88, - 0,113,60,122,28,116,11,124,1,124,2,124,3,131,3,1, - 0,116,9,160,10,100,3,124,1,161,2,1,0,87,0,110, - 48,4,0,116,8,107,10,114,250,1,0,125,8,1,0,122, - 18,116,9,160,10,100,1,124,1,124,8,161,3,1,0,87, - 0,53,0,100,2,125,8,126,8,88,0,89,0,110,2,88, - 0,100,2,83,0,41,4,122,27,87,114,105,116,101,32,98, - 121,116,101,115,32,100,97,116,97,32,116,111,32,97,32,102, - 105,108,101,46,122,27,99,111,117,108,100,32,110,111,116,32, - 99,114,101,97,116,101,32,123,33,114,125,58,32,123,33,114, - 125,78,122,12,99,114,101,97,116,101,100,32,123,33,114,125, - 41,12,114,47,0,0,0,114,56,0,0,0,114,186,0,0, - 0,114,42,0,0,0,114,38,0,0,0,114,2,0,0,0, - 90,5,109,107,100,105,114,218,15,70,105,108,101,69,120,105, - 115,116,115,69,114,114,111,114,114,50,0,0,0,114,134,0, - 0,0,114,149,0,0,0,114,69,0,0,0,41,9,114,119, - 0,0,0,114,44,0,0,0,114,26,0,0,0,114,11,1, - 0,0,218,6,112,97,114,101,110,116,114,97,0,0,0,114, - 37,0,0,0,114,33,0,0,0,114,228,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,225,0, - 0,0,243,3,0,0,115,48,0,0,0,0,2,12,1,4, - 2,12,1,12,1,12,2,12,1,10,1,2,1,14,1,14, - 2,8,1,16,3,6,1,2,0,2,255,4,2,32,1,2, - 1,12,1,16,1,16,2,8,1,2,255,122,25,83,111,117, - 114,99,101,70,105,108,101,76,111,97,100,101,114,46,115,101, - 116,95,100,97,116,97,78,41,7,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,127,0,0,0,114,224,0, - 0,0,114,226,0,0,0,114,225,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,8,1,0,0,229,3,0,0,115,8,0,0,0,8,2, - 4,2,8,5,8,5,114,8,1,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 64,0,0,0,115,32,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, - 5,132,0,90,5,100,6,83,0,41,7,218,20,83,111,117, - 114,99,101,108,101,115,115,70,105,108,101,76,111,97,100,101, - 114,122,45,76,111,97,100,101,114,32,119,104,105,99,104,32, - 104,97,110,100,108,101,115,32,115,111,117,114,99,101,108,101, - 115,115,32,102,105,108,101,32,105,109,112,111,114,116,115,46, - 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,5,0,0,0,67,0,0,0,115,68,0,0,0,124,0, - 160,0,124,1,161,1,125,2,124,0,160,1,124,2,161,1, - 125,3,124,1,124,2,100,1,156,2,125,4,116,2,124,3, - 124,1,124,4,131,3,1,0,116,3,116,4,124,3,131,1, - 100,2,100,0,133,2,25,0,124,1,124,2,100,3,141,3, - 83,0,41,4,78,114,159,0,0,0,114,145,0,0,0,41, - 2,114,117,0,0,0,114,107,0,0,0,41,5,114,179,0, - 0,0,114,227,0,0,0,114,152,0,0,0,114,165,0,0, - 0,114,235,0,0,0,41,5,114,119,0,0,0,114,139,0, - 0,0,114,44,0,0,0,114,26,0,0,0,114,151,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,213,0,0,0,22,4,0,0,115,22,0,0,0,0,1, - 10,1,10,4,2,1,2,254,6,4,12,1,2,1,14,1, - 2,1,2,253,122,29,83,111,117,114,99,101,108,101,115,115, - 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,99, - 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,122,39,82,101,116,117,114,110,32, - 78,111,110,101,32,97,115,32,116,104,101,114,101,32,105,115, - 32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,46, - 78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,38, - 4,0,0,115,2,0,0,0,0,2,122,31,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 46,103,101,116,95,115,111,117,114,99,101,78,41,6,114,125, + 0,0,218,8,99,111,110,116,101,110,116,115,229,3,0,0, + 115,2,0,0,0,0,1,122,19,70,105,108,101,76,111,97, + 100,101,114,46,99,111,110,116,101,110,116,115,41,17,114,125, 0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,0, - 0,0,114,213,0,0,0,114,229,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,14,1,0,0,18,4,0,0,115,6,0,0,0,8,2, - 4,2,8,16,114,14,1,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, - 0,0,115,92,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, - 0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132, - 0,90,7,100,10,100,11,132,0,90,8,100,12,100,13,132, - 0,90,9,100,14,100,15,132,0,90,10,100,16,100,17,132, - 0,90,11,101,12,100,18,100,19,132,0,131,1,90,13,100, - 20,83,0,41,21,218,19,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,122,93,76,111,97,100, - 101,114,32,102,111,114,32,101,120,116,101,110,115,105,111,110, - 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,84, - 104,101,32,99,111,110,115,116,114,117,99,116,111,114,32,105, - 115,32,100,101,115,105,103,110,101,100,32,116,111,32,119,111, - 114,107,32,119,105,116,104,32,70,105,108,101,70,105,110,100, - 101,114,46,10,10,32,32,32,32,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,0, - 0,0,115,16,0,0,0,124,1,124,0,95,0,124,2,124, - 0,95,1,100,0,83,0,114,110,0,0,0,114,159,0,0, - 0,114,4,1,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,209,0,0,0,55,4,0,0,115,4, - 0,0,0,0,1,6,1,122,28,69,120,116,101,110,115,105, - 111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,105, - 110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24, - 0,0,0,124,0,106,0,124,1,106,0,107,2,111,22,124, - 0,106,1,124,1,106,1,107,2,83,0,114,110,0,0,0, - 114,240,0,0,0,114,242,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,243,0,0,0,59,4, - 0,0,115,6,0,0,0,0,1,12,1,10,255,122,26,69, - 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, - 101,114,46,95,95,101,113,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,20,0,0,0,116,0,124,0,106,1,131,1,116, - 0,124,0,106,2,131,1,65,0,83,0,114,110,0,0,0, - 114,244,0,0,0,114,246,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,247,0,0,0,63,4, - 0,0,115,2,0,0,0,0,1,122,28,69,120,116,101,110, - 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,95, - 95,104,97,115,104,95,95,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,5,0,0,0,67,0,0,0, - 115,36,0,0,0,116,0,160,1,116,2,106,3,124,1,161, - 2,125,2,116,0,160,4,100,1,124,1,106,5,124,0,106, - 6,161,3,1,0,124,2,83,0,41,2,122,38,67,114,101, - 97,116,101,32,97,110,32,117,110,105,116,105,97,108,105,122, - 101,100,32,101,120,116,101,110,115,105,111,110,32,109,111,100, - 117,108,101,122,38,101,120,116,101,110,115,105,111,110,32,109, - 111,100,117,108,101,32,123,33,114,125,32,108,111,97,100,101, - 100,32,102,114,111,109,32,123,33,114,125,41,7,114,134,0, - 0,0,114,214,0,0,0,114,163,0,0,0,90,14,99,114, - 101,97,116,101,95,100,121,110,97,109,105,99,114,149,0,0, - 0,114,117,0,0,0,114,44,0,0,0,41,3,114,119,0, - 0,0,114,187,0,0,0,114,216,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,212,0,0,0, - 66,4,0,0,115,18,0,0,0,0,2,4,1,4,0,2, - 255,4,2,6,1,4,0,4,255,4,2,122,33,69,120,116, - 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, - 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,5, - 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, - 116,2,106,3,124,1,161,2,1,0,116,0,160,4,100,1, - 124,0,106,5,124,0,106,6,161,3,1,0,100,2,83,0, - 41,3,122,30,73,110,105,116,105,97,108,105,122,101,32,97, - 110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,122,40,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,32,123,33,114,125,32,101,120,101,99,117,116, - 101,100,32,102,114,111,109,32,123,33,114,125,78,41,7,114, - 134,0,0,0,114,214,0,0,0,114,163,0,0,0,90,12, - 101,120,101,99,95,100,121,110,97,109,105,99,114,149,0,0, - 0,114,117,0,0,0,114,44,0,0,0,114,252,0,0,0, + 0,0,114,209,0,0,0,114,243,0,0,0,114,247,0,0, + 0,114,136,0,0,0,114,220,0,0,0,114,179,0,0,0, + 114,227,0,0,0,114,254,0,0,0,114,0,1,0,0,114, + 4,1,0,0,114,2,1,0,0,114,8,1,0,0,90,13, + 95,95,99,108,97,115,115,99,101,108,108,95,95,114,3,0, + 0,0,114,3,0,0,0,114,249,0,0,0,114,6,0,0, + 0,114,239,0,0,0,161,3,0,0,115,30,0,0,0,8, + 2,4,3,8,6,8,4,8,3,2,1,14,11,2,1,10, + 4,8,11,2,1,10,5,8,4,8,6,8,6,114,239,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,64,0,0,0,115,46,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, + 156,1,100,8,100,9,132,2,90,6,100,10,83,0,41,11, + 218,16,83,111,117,114,99,101,70,105,108,101,76,111,97,100, + 101,114,122,62,67,111,110,99,114,101,116,101,32,105,109,112, + 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,83, + 111,117,114,99,101,76,111,97,100,101,114,32,117,115,105,110, + 103,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101, + 109,46,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,67,0,0,0,115,22,0,0,0, + 116,0,124,1,131,1,125,2,124,2,106,1,124,2,106,2, + 100,1,156,2,83,0,41,2,122,33,82,101,116,117,114,110, + 32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,111, + 114,32,116,104,101,32,112,97,116,104,46,41,2,114,169,0, + 0,0,114,234,0,0,0,41,3,114,49,0,0,0,218,8, + 115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,122, + 101,41,3,114,119,0,0,0,114,44,0,0,0,114,238,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,224,0,0,0,237,3,0,0,115,4,0,0,0,0, + 2,8,1,122,27,83,111,117,114,99,101,70,105,108,101,76, + 111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,115, + 99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0, + 124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4, + 100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111, + 100,101,41,2,114,115,0,0,0,114,225,0,0,0,41,5, + 114,119,0,0,0,114,108,0,0,0,114,107,0,0,0,114, + 26,0,0,0,114,52,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,226,0,0,0,242,3,0, + 0,115,4,0,0,0,0,2,8,1,122,32,83,111,117,114, + 99,101,70,105,108,101,76,111,97,100,101,114,46,95,99,97, + 99,104,101,95,98,121,116,101,99,111,100,101,114,60,0,0, + 0,114,11,1,0,0,99,3,0,0,0,0,0,0,0,1, + 0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,115, + 0,1,0,0,116,0,124,1,131,1,92,2,125,4,125,5, + 103,0,125,6,124,4,114,52,116,1,124,4,131,1,115,52, + 116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,2, + 124,7,161,1,1,0,113,16,116,3,124,6,131,1,68,0, + 93,112,125,7,116,4,124,4,124,7,131,2,125,4,122,14, + 116,5,160,6,124,4,161,1,1,0,87,0,110,82,4,0, + 116,7,107,10,114,112,1,0,1,0,1,0,89,0,113,60, + 89,0,110,60,4,0,116,8,107,10,114,170,1,0,125,8, + 1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3, + 1,0,87,0,89,0,162,10,1,0,100,2,83,0,87,0, + 53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0, + 113,60,122,28,116,11,124,1,124,2,124,3,131,3,1,0, + 116,9,160,10,100,3,124,1,161,2,1,0,87,0,110,48, + 4,0,116,8,107,10,114,250,1,0,125,8,1,0,122,18, + 116,9,160,10,100,1,124,1,124,8,161,3,1,0,87,0, + 53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0, + 100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,121, + 116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105, + 108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99, + 114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125, + 78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41, + 12,114,47,0,0,0,114,56,0,0,0,114,186,0,0,0, + 114,42,0,0,0,114,38,0,0,0,114,2,0,0,0,90, + 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, + 116,115,69,114,114,111,114,114,50,0,0,0,114,134,0,0, + 0,114,149,0,0,0,114,69,0,0,0,41,9,114,119,0, + 0,0,114,44,0,0,0,114,26,0,0,0,114,12,1,0, + 0,218,6,112,97,114,101,110,116,114,97,0,0,0,114,37, + 0,0,0,114,33,0,0,0,114,228,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,0, + 0,247,3,0,0,115,48,0,0,0,0,2,12,1,4,2, + 12,1,12,1,12,2,12,1,10,1,2,1,14,1,14,2, + 8,1,16,3,6,1,2,0,2,255,4,2,32,1,2,1, + 12,1,16,1,16,2,8,1,2,255,122,25,83,111,117,114, + 99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,116, + 95,100,97,116,97,78,41,7,114,125,0,0,0,114,124,0, + 0,0,114,126,0,0,0,114,127,0,0,0,114,224,0,0, + 0,114,226,0,0,0,114,225,0,0,0,114,3,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 217,0,0,0,74,4,0,0,115,10,0,0,0,0,2,14, - 1,6,1,4,0,4,255,122,31,69,120,116,101,110,115,105, - 111,110,70,105,108,101,76,111,97,100,101,114,46,101,120,101, - 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,3,0,0, - 0,115,36,0,0,0,116,0,124,0,106,1,131,1,100,1, - 25,0,137,0,116,2,135,0,102,1,100,2,100,3,132,8, - 116,3,68,0,131,1,131,1,83,0,41,4,122,49,82,101, - 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, - 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,114, - 39,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,51,0,0,0,115,26,0, - 0,0,124,0,93,18,125,1,136,0,100,0,124,1,23,0, - 107,2,86,0,1,0,113,2,100,1,83,0,41,2,114,209, - 0,0,0,78,114,3,0,0,0,169,2,114,32,0,0,0, - 218,6,115,117,102,102,105,120,169,1,90,9,102,105,108,101, - 95,110,97,109,101,114,3,0,0,0,114,6,0,0,0,218, - 9,60,103,101,110,101,120,112,114,62,83,4,0,0,115,4, - 0,0,0,4,1,2,255,122,49,69,120,116,101,110,115,105, - 111,110,70,105,108,101,76,111,97,100,101,114,46,105,115,95, - 112,97,99,107,97,103,101,46,60,108,111,99,97,108,115,62, - 46,60,103,101,110,101,120,112,114,62,41,4,114,47,0,0, - 0,114,44,0,0,0,218,3,97,110,121,218,18,69,88,84, - 69,78,83,73,79,78,95,83,85,70,70,73,88,69,83,114, - 219,0,0,0,114,3,0,0,0,114,18,1,0,0,114,6, - 0,0,0,114,182,0,0,0,80,4,0,0,115,8,0,0, - 0,0,2,14,1,12,1,2,255,122,30,69,120,116,101,110, - 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105, - 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,63,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,97,110, + 9,1,0,0,233,3,0,0,115,8,0,0,0,8,2,4, + 2,8,5,8,5,114,9,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, + 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, + 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, + 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, + 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, + 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, + 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, + 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, + 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, + 0,41,4,78,114,159,0,0,0,114,145,0,0,0,41,2, + 114,117,0,0,0,114,107,0,0,0,41,5,114,179,0,0, + 0,114,227,0,0,0,114,152,0,0,0,114,165,0,0,0, + 114,235,0,0,0,41,5,114,119,0,0,0,114,139,0,0, + 0,114,44,0,0,0,114,26,0,0,0,114,151,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 213,0,0,0,26,4,0,0,115,22,0,0,0,0,1,10, + 1,10,4,2,1,2,254,6,4,12,1,2,1,14,1,2, + 1,2,253,122,29,83,111,117,114,99,101,108,101,115,115,70, + 105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111, + 100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78, + 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, + 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, + 114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,229,0,0,0,42,4, + 0,0,115,2,0,0,0,0,2,122,31,83,111,117,114,99, + 101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,46, + 103,101,116,95,115,111,117,114,99,101,78,41,6,114,125,0, + 0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,0, + 0,114,213,0,0,0,114,229,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 15,1,0,0,22,4,0,0,115,6,0,0,0,8,2,4, + 2,8,16,114,15,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, + 90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0, + 90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0, + 90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,20, + 83,0,41,21,114,252,0,0,0,122,93,76,111,97,100,101, + 114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,104, + 101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,115, + 32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,114, + 107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,101, + 114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0, + 95,1,100,0,83,0,114,110,0,0,0,114,159,0,0,0, + 114,5,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,209,0,0,0,59,4,0,0,115,4,0, + 0,0,0,1,6,1,122,28,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,110, + 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,2,0,0,0,67,0,0,0,115,24,0, + 0,0,124,0,106,0,124,1,106,0,107,2,111,22,124,0, + 106,1,124,1,106,1,107,2,83,0,114,110,0,0,0,114, + 240,0,0,0,114,242,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,243,0,0,0,63,4,0, + 0,115,6,0,0,0,0,1,12,1,10,255,122,26,69,120, + 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, + 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0, + 124,0,106,2,131,1,65,0,83,0,114,110,0,0,0,114, + 244,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,247,0,0,0,67,4,0, + 0,115,2,0,0,0,0,1,122,28,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, + 104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, + 36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2, + 125,2,116,0,160,4,100,1,124,1,106,5,124,0,106,6, + 161,3,1,0,124,2,83,0,41,2,122,38,67,114,101,97, + 116,101,32,97,110,32,117,110,105,116,105,97,108,105,122,101, + 100,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,122,38,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,32,123,33,114,125,32,108,111,97,100,101,100, + 32,102,114,111,109,32,123,33,114,125,41,7,114,134,0,0, + 0,114,214,0,0,0,114,163,0,0,0,90,14,99,114,101, + 97,116,101,95,100,121,110,97,109,105,99,114,149,0,0,0, + 114,117,0,0,0,114,44,0,0,0,41,3,114,119,0,0, + 0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,70, + 4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,255, + 4,2,6,1,4,0,4,255,4,2,122,33,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0, + 0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,116, + 2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,124, + 0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,41, + 3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,110, 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,32,99,97,110,110,111,116,32,99,114,101,97,116,101,32, - 97,32,99,111,100,101,32,111,98,106,101,99,116,46,78,114, - 3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,213,0,0,0,86,4,0, - 0,115,2,0,0,0,0,2,122,28,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,99,111,100,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,53,82,101,116,117, - 114,110,32,78,111,110,101,32,97,115,32,101,120,116,101,110, - 115,105,111,110,32,109,111,100,117,108,101,115,32,104,97,118, - 101,32,110,111,32,115,111,117,114,99,101,32,99,111,100,101, - 46,78,114,3,0,0,0,114,219,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,229,0,0,0, - 90,4,0,0,115,2,0,0,0,0,2,122,30,69,120,116, - 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, - 46,103,101,116,95,115,111,117,114,99,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,114, - 250,0,0,0,114,48,0,0,0,114,219,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,179,0, - 0,0,94,4,0,0,115,2,0,0,0,0,3,122,32,69, - 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, - 101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,78, - 41,14,114,125,0,0,0,114,124,0,0,0,114,126,0,0, - 0,114,127,0,0,0,114,209,0,0,0,114,243,0,0,0, - 114,247,0,0,0,114,212,0,0,0,114,217,0,0,0,114, - 182,0,0,0,114,213,0,0,0,114,229,0,0,0,114,136, - 0,0,0,114,179,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,15,1,0, - 0,47,4,0,0,115,22,0,0,0,8,2,4,6,8,4, - 8,4,8,3,8,8,8,6,8,6,8,4,8,4,2,1, - 114,15,1,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,104, - 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, - 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,100, - 6,100,7,132,0,90,6,100,8,100,9,132,0,90,7,100, - 10,100,11,132,0,90,8,100,12,100,13,132,0,90,9,100, - 14,100,15,132,0,90,10,100,16,100,17,132,0,90,11,100, - 18,100,19,132,0,90,12,100,20,100,21,132,0,90,13,100, - 22,100,23,132,0,90,14,100,24,83,0,41,25,218,14,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,97,38,1, - 0,0,82,101,112,114,101,115,101,110,116,115,32,97,32,110, - 97,109,101,115,112,97,99,101,32,112,97,99,107,97,103,101, - 39,115,32,112,97,116,104,46,32,32,73,116,32,117,115,101, - 115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109, - 101,10,32,32,32,32,116,111,32,102,105,110,100,32,105,116, - 115,32,112,97,114,101,110,116,32,109,111,100,117,108,101,44, - 32,97,110,100,32,102,114,111,109,32,116,104,101,114,101,32, - 105,116,32,108,111,111,107,115,32,117,112,32,116,104,101,32, - 112,97,114,101,110,116,39,115,10,32,32,32,32,95,95,112, - 97,116,104,95,95,46,32,32,87,104,101,110,32,116,104,105, - 115,32,99,104,97,110,103,101,115,44,32,116,104,101,32,109, - 111,100,117,108,101,39,115,32,111,119,110,32,112,97,116,104, - 32,105,115,32,114,101,99,111,109,112,117,116,101,100,44,10, - 32,32,32,32,117,115,105,110,103,32,112,97,116,104,95,102, - 105,110,100,101,114,46,32,32,70,111,114,32,116,111,112,45, - 108,101,118,101,108,32,109,111,100,117,108,101,115,44,32,116, - 104,101,32,112,97,114,101,110,116,32,109,111,100,117,108,101, - 39,115,32,112,97,116,104,10,32,32,32,32,105,115,32,115, - 121,115,46,112,97,116,104,46,99,4,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,3,0,0,0,67,0,0, - 0,115,36,0,0,0,124,1,124,0,95,0,124,2,124,0, - 95,1,116,2,124,0,160,3,161,0,131,1,124,0,95,4, - 124,3,124,0,95,5,100,0,83,0,114,110,0,0,0,41, - 6,218,5,95,110,97,109,101,218,5,95,112,97,116,104,114, - 112,0,0,0,218,16,95,103,101,116,95,112,97,114,101,110, - 116,95,112,97,116,104,218,17,95,108,97,115,116,95,112,97, - 114,101,110,116,95,112,97,116,104,218,12,95,112,97,116,104, - 95,102,105,110,100,101,114,169,4,114,119,0,0,0,114,117, - 0,0,0,114,44,0,0,0,90,11,112,97,116,104,95,102, - 105,110,100,101,114,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,209,0,0,0,107,4,0,0,115,8,0, - 0,0,0,1,6,1,6,1,14,1,122,23,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,46,95,95,105,110,105, - 116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, - 0,124,0,106,0,160,1,100,1,161,1,92,3,125,1,125, - 2,125,3,124,2,100,2,107,2,114,30,100,3,83,0,124, - 1,100,4,102,2,83,0,41,5,122,62,82,101,116,117,114, - 110,115,32,97,32,116,117,112,108,101,32,111,102,32,40,112, - 97,114,101,110,116,45,109,111,100,117,108,101,45,110,97,109, - 101,44,32,112,97,114,101,110,116,45,112,97,116,104,45,97, - 116,116,114,45,110,97,109,101,41,114,71,0,0,0,114,40, - 0,0,0,41,2,114,8,0,0,0,114,44,0,0,0,90, - 8,95,95,112,97,116,104,95,95,41,2,114,23,1,0,0, - 114,41,0,0,0,41,4,114,119,0,0,0,114,13,1,0, - 0,218,3,100,111,116,90,2,109,101,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,23,95,102,105,110,100, - 95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109, - 101,115,113,4,0,0,115,8,0,0,0,0,2,18,1,8, - 2,4,3,122,38,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,46,95,102,105,110,100,95,112,97,114,101,110,116, - 95,112,97,116,104,95,110,97,109,101,115,99,1,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,28,0,0,0,124,0,160,0,161,0,92, - 2,125,1,125,2,116,1,116,2,106,3,124,1,25,0,124, - 2,131,2,83,0,114,110,0,0,0,41,4,114,30,1,0, - 0,114,130,0,0,0,114,8,0,0,0,218,7,109,111,100, - 117,108,101,115,41,3,114,119,0,0,0,90,18,112,97,114, - 101,110,116,95,109,111,100,117,108,101,95,110,97,109,101,90, - 14,112,97,116,104,95,97,116,116,114,95,110,97,109,101,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,25, - 1,0,0,123,4,0,0,115,4,0,0,0,0,1,12,1, - 122,31,95,78,97,109,101,115,112,97,99,101,80,97,116,104, - 46,95,103,101,116,95,112,97,114,101,110,116,95,112,97,116, - 104,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,4,0,0,0,67,0,0,0,115,80,0,0,0,116, - 0,124,0,160,1,161,0,131,1,125,1,124,1,124,0,106, - 2,107,3,114,74,124,0,160,3,124,0,106,4,124,1,161, - 2,125,2,124,2,100,0,107,9,114,68,124,2,106,5,100, - 0,107,8,114,68,124,2,106,6,114,68,124,2,106,6,124, - 0,95,7,124,1,124,0,95,2,124,0,106,7,83,0,114, - 110,0,0,0,41,8,114,112,0,0,0,114,25,1,0,0, - 114,26,1,0,0,114,27,1,0,0,114,23,1,0,0,114, - 140,0,0,0,114,178,0,0,0,114,24,1,0,0,41,3, - 114,119,0,0,0,90,11,112,97,114,101,110,116,95,112,97, - 116,104,114,187,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,12,95,114,101,99,97,108,99,117, - 108,97,116,101,127,4,0,0,115,16,0,0,0,0,2,12, - 1,10,1,14,3,18,1,6,1,8,1,6,1,122,27,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,114, - 101,99,97,108,99,117,108,97,116,101,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,12,0,0,0,116,0,124,0,160,1,161,0, - 131,1,83,0,114,110,0,0,0,41,2,114,5,1,0,0, - 114,32,1,0,0,114,246,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,8,95,95,105,116,101, - 114,95,95,140,4,0,0,115,2,0,0,0,0,1,122,23, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, - 95,105,116,101,114,95,95,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, - 115,12,0,0,0,124,0,160,0,161,0,124,1,25,0,83, - 0,114,110,0,0,0,169,1,114,32,1,0,0,41,2,114, - 119,0,0,0,218,5,105,110,100,101,120,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,11,95,95,103,101, - 116,105,116,101,109,95,95,143,4,0,0,115,2,0,0,0, - 0,1,122,26,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,95,95,103,101,116,105,116,101,109,95,95,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, - 0,0,0,67,0,0,0,115,14,0,0,0,124,2,124,0, - 106,0,124,1,60,0,100,0,83,0,114,110,0,0,0,41, - 1,114,24,1,0,0,41,3,114,119,0,0,0,114,35,1, - 0,0,114,44,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,11,95,95,115,101,116,105,116,101, - 109,95,95,146,4,0,0,115,2,0,0,0,0,1,122,26, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, - 95,115,101,116,105,116,101,109,95,95,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,12,0,0,0,116,0,124,0,160,1,161,0, - 131,1,83,0,114,110,0,0,0,41,2,114,22,0,0,0, - 114,32,1,0,0,114,246,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,7,95,95,108,101,110, - 95,95,149,4,0,0,115,2,0,0,0,0,1,122,22,95, + 101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,100, + 117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,101, + 100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,134, + 0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,101, + 120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,0, + 114,117,0,0,0,114,44,0,0,0,114,253,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,217, + 0,0,0,78,4,0,0,115,10,0,0,0,0,2,14,1, + 6,1,4,0,4,255,122,31,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99, + 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, + 115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25, + 0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116, + 3,68,0,131,1,131,1,83,0,41,4,122,49,82,101,116, + 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, + 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, + 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,39, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0, + 0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107, + 2,86,0,1,0,113,2,100,1,83,0,41,2,114,209,0, + 0,0,78,114,3,0,0,0,169,2,114,32,0,0,0,218, + 6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95, + 110,97,109,101,114,3,0,0,0,114,6,0,0,0,218,9, + 60,103,101,110,101,120,112,114,62,87,4,0,0,115,4,0, + 0,0,4,1,2,255,122,49,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112, + 97,99,107,97,103,101,46,60,108,111,99,97,108,115,62,46, + 60,103,101,110,101,120,112,114,62,41,4,114,47,0,0,0, + 114,44,0,0,0,218,3,97,110,121,218,18,69,88,84,69, + 78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,219, + 0,0,0,114,3,0,0,0,114,18,1,0,0,114,6,0, + 0,0,114,182,0,0,0,84,4,0,0,115,8,0,0,0, + 0,2,14,1,12,1,2,255,122,30,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115, + 95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, + 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, + 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, + 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,3, + 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,213,0,0,0,90,4,0,0, + 115,2,0,0,0,0,2,122,28,69,120,116,101,110,115,105, + 111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116, + 95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,122,53,82,101,116,117,114, + 110,32,78,111,110,101,32,97,115,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,115,32,104,97,118,101, + 32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,46, + 78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,94, + 4,0,0,115,2,0,0,0,0,2,122,30,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,6,0,0,0,124,0,106,0,83,0,114,250, + 0,0,0,114,48,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0, + 0,98,4,0,0,115,2,0,0,0,0,3,122,32,69,120, + 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, + 114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41, + 14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,114, + 247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,182, + 0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,0, + 0,0,114,179,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,252,0,0,0, + 51,4,0,0,115,22,0,0,0,8,2,4,6,8,4,8, + 4,8,3,8,8,8,6,8,6,8,4,8,4,2,1,114, + 252,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, + 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, + 100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14, + 100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18, + 100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22, + 100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0, + 0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97, + 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39, + 115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115, + 32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101, + 10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115, + 32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32, + 97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105, + 116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112, + 97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97, + 116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115, + 32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111, + 100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32, + 105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32, + 32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105, + 110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108, + 101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104, + 101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39, + 115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121, + 115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, + 115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95, + 1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124, + 3,124,0,95,5,100,0,83,0,114,110,0,0,0,41,6, + 218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,112, + 0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,116, + 95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,114, + 101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,95, + 102,105,110,100,101,114,169,4,114,119,0,0,0,114,117,0, + 0,0,114,44,0,0,0,90,11,112,97,116,104,95,102,105, + 110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,209,0,0,0,111,4,0,0,115,8,0,0, + 0,0,1,6,1,6,1,14,1,122,23,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2, + 125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,1, + 100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,110, + 115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97, + 114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101, + 44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116, + 116,114,45,110,97,109,101,41,114,71,0,0,0,114,40,0, + 0,0,41,2,114,8,0,0,0,114,44,0,0,0,90,8, + 95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,114, + 41,0,0,0,41,4,114,119,0,0,0,114,14,1,0,0, + 218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95, + 112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101, + 115,117,4,0,0,115,8,0,0,0,0,2,18,1,8,2, + 4,3,122,38,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,95, + 112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,2, + 125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,2, + 131,2,83,0,114,110,0,0,0,41,4,114,30,1,0,0, + 114,130,0,0,0,114,8,0,0,0,218,7,109,111,100,117, + 108,101,115,41,3,114,119,0,0,0,90,18,112,97,114,101, + 110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14, + 112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,1, + 0,0,127,4,0,0,115,4,0,0,0,0,1,12,1,122, + 31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, + 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,80,0,0,0,116,0, + 124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,2, + 107,3,114,74,124,0,160,3,124,0,106,4,124,1,161,2, + 125,2,124,2,100,0,107,9,114,68,124,2,106,5,100,0, + 107,8,114,68,124,2,106,6,114,68,124,2,106,6,124,0, + 95,7,124,1,124,0,95,2,124,0,106,7,83,0,114,110, + 0,0,0,41,8,114,112,0,0,0,114,25,1,0,0,114, + 26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,140, + 0,0,0,114,178,0,0,0,114,24,1,0,0,41,3,114, + 119,0,0,0,90,11,112,97,114,101,110,116,95,112,97,116, + 104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,108, + 97,116,101,131,4,0,0,115,16,0,0,0,0,2,12,1, + 10,1,14,3,18,1,6,1,8,1,6,1,122,27,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,101, + 99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, + 1,83,0,114,110,0,0,0,41,2,114,6,1,0,0,114, + 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,114, + 95,95,144,4,0,0,115,2,0,0,0,0,1,122,23,95, 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 108,101,110,95,95,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41, - 2,78,122,20,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,40,123,33,114,125,41,41,2,114,62,0,0,0,114, - 24,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,95,95,114,101,112,114, - 95,95,152,4,0,0,115,2,0,0,0,0,1,122,23,95, + 105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, + 12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,0, + 114,110,0,0,0,169,1,114,32,1,0,0,41,2,114,119, + 0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,116, + 105,116,101,109,95,95,147,4,0,0,115,2,0,0,0,0, + 1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,95,95,103,101,116,105,116,101,109,95,95,99,3,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,14,0,0,0,124,2,124,0,106, + 0,124,1,60,0,100,0,83,0,114,110,0,0,0,41,1, + 114,24,1,0,0,41,3,114,119,0,0,0,114,35,1,0, + 0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,109, + 95,95,150,4,0,0,115,2,0,0,0,0,1,122,26,95, 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 114,101,112,114,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 12,0,0,0,124,1,124,0,160,0,161,0,107,6,83,0, - 114,110,0,0,0,114,34,1,0,0,169,2,114,119,0,0, - 0,218,4,105,116,101,109,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,12,95,95,99,111,110,116,97,105, - 110,115,95,95,155,4,0,0,115,2,0,0,0,0,1,122, - 27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,95,99,111,110,116,97,105,110,115,95,95,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, - 0,67,0,0,0,115,16,0,0,0,124,0,106,0,160,1, - 124,1,161,1,1,0,100,0,83,0,114,110,0,0,0,41, - 2,114,24,1,0,0,114,186,0,0,0,114,40,1,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 186,0,0,0,158,4,0,0,115,2,0,0,0,0,1,122, - 21,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 97,112,112,101,110,100,78,41,15,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,127,0,0,0,114,209,0, - 0,0,114,30,1,0,0,114,25,1,0,0,114,32,1,0, - 0,114,33,1,0,0,114,36,1,0,0,114,37,1,0,0, - 114,38,1,0,0,114,39,1,0,0,114,42,1,0,0,114, - 186,0,0,0,114,3,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,22,1,0,0,100,4,0, - 0,115,24,0,0,0,8,1,4,6,8,6,8,10,8,4, - 8,13,8,3,8,3,8,3,8,3,8,3,8,3,114,22, - 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,64,0,0,0,115,80,0,0, - 0,101,0,90,1,100,0,90,2,100,1,100,2,132,0,90, - 3,101,4,100,3,100,4,132,0,131,1,90,5,100,5,100, - 6,132,0,90,6,100,7,100,8,132,0,90,7,100,9,100, - 10,132,0,90,8,100,11,100,12,132,0,90,9,100,13,100, - 14,132,0,90,10,100,15,100,16,132,0,90,11,100,17,83, - 0,41,18,218,16,95,78,97,109,101,115,112,97,99,101,76, - 111,97,100,101,114,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,18, - 0,0,0,116,0,124,1,124,2,124,3,131,3,124,0,95, - 1,100,0,83,0,114,110,0,0,0,41,2,114,22,1,0, - 0,114,24,1,0,0,114,28,1,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,209,0,0,0,164, - 4,0,0,115,2,0,0,0,0,1,122,25,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,95,95,105, - 110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,0, + 115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, + 1,83,0,114,110,0,0,0,41,2,114,22,0,0,0,114, + 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95, + 95,153,4,0,0,115,2,0,0,0,0,1,122,22,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,108, + 101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, + 0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2, + 78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,40,123,33,114,125,41,41,2,114,62,0,0,0,114,24, + 1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,95, + 95,156,4,0,0,115,2,0,0,0,0,1,122,23,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,114, + 101,112,114,95,95,99,2,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,100,1,160,0,124,1,106,1,161,1,83,0,41, - 2,122,115,82,101,116,117,114,110,32,114,101,112,114,32,102, - 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, - 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, - 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, - 32,32,32,32,32,32,122,25,60,109,111,100,117,108,101,32, - 123,33,114,125,32,40,110,97,109,101,115,112,97,99,101,41, - 62,41,2,114,62,0,0,0,114,125,0,0,0,41,2,114, - 193,0,0,0,114,216,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,11,109,111,100,117,108,101, - 95,114,101,112,114,167,4,0,0,115,2,0,0,0,0,7, - 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, - 101,114,46,109,111,100,117,108,101,95,114,101,112,114,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,78,84,114,3,0,0,0,114,219,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,182,0, - 0,0,176,4,0,0,115,2,0,0,0,0,1,122,27,95, - 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, - 105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,78,114, - 40,0,0,0,114,3,0,0,0,114,219,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,229,0, - 0,0,179,4,0,0,115,2,0,0,0,0,1,122,27,95, - 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67, - 0,0,0,115,16,0,0,0,116,0,100,1,100,2,100,3, - 100,4,100,5,141,4,83,0,41,6,78,114,40,0,0,0, - 122,8,60,115,116,114,105,110,103,62,114,215,0,0,0,84, - 41,1,114,231,0,0,0,41,1,114,232,0,0,0,114,219, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,213,0,0,0,182,4,0,0,115,2,0,0,0, - 0,1,122,25,95,78,97,109,101,115,112,97,99,101,76,111, - 97,100,101,114,46,103,101,116,95,99,111,100,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,114, - 210,0,0,0,114,3,0,0,0,114,211,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,212,0, - 0,0,185,4,0,0,115,2,0,0,0,0,1,122,30,95, - 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, - 99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0, + 0,0,0,124,1,124,0,160,0,161,0,107,6,83,0,114, + 110,0,0,0,114,34,1,0,0,169,2,114,119,0,0,0, + 218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,110, + 115,95,95,159,4,0,0,115,2,0,0,0,0,1,122,27, + 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, + 95,99,111,110,116,97,105,110,115,95,95,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, + 1,161,1,1,0,100,0,83,0,114,110,0,0,0,41,2, + 114,24,1,0,0,114,186,0,0,0,114,40,1,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,186, + 0,0,0,162,4,0,0,115,2,0,0,0,0,1,122,21, + 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97, + 112,112,101,110,100,78,41,15,114,125,0,0,0,114,124,0, + 0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0, + 0,114,30,1,0,0,114,25,1,0,0,114,32,1,0,0, + 114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,114, + 38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,186, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,22,1,0,0,104,4,0,0, + 115,24,0,0,0,8,1,4,6,8,6,8,10,8,4,8, + 13,8,3,8,3,8,3,8,3,8,3,8,3,114,22,1, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,0, + 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3, + 101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6, + 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10, + 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14, + 132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,0, + 41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,111, + 97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,0, + 0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,1, + 100,0,83,0,114,110,0,0,0,41,2,114,22,1,0,0, + 114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,209,0,0,0,168,4, + 0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101, + 115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,110, + 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0, + 0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,2, + 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, + 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, + 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, + 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, + 32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,123, + 33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,62, + 41,2,114,62,0,0,0,114,125,0,0,0,41,2,114,193, + 0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,95, + 114,101,112,114,171,4,0,0,115,2,0,0,0,0,7,122, + 28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,0,83,0,114, - 110,0,0,0,114,3,0,0,0,114,252,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,217,0, - 0,0,188,4,0,0,115,2,0,0,0,0,1,122,28,95, - 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, - 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 67,0,0,0,115,26,0,0,0,116,0,160,1,100,1,124, - 0,106,2,161,2,1,0,116,0,160,3,124,0,124,1,161, - 2,83,0,41,2,122,98,76,111,97,100,32,97,32,110,97, - 109,101,115,112,97,99,101,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,101,120,101,99,95,109,111, - 100,117,108,101,40,41,32,105,110,115,116,101,97,100,46,10, - 10,32,32,32,32,32,32,32,32,122,38,110,97,109,101,115, - 112,97,99,101,32,109,111,100,117,108,101,32,108,111,97,100, - 101,100,32,119,105,116,104,32,112,97,116,104,32,123,33,114, - 125,41,4,114,134,0,0,0,114,149,0,0,0,114,24,1, - 0,0,114,218,0,0,0,114,219,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,220,0,0,0, - 191,4,0,0,115,8,0,0,0,0,7,6,1,4,255,4, - 2,122,28,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,78, - 41,12,114,125,0,0,0,114,124,0,0,0,114,126,0,0, - 0,114,209,0,0,0,114,207,0,0,0,114,44,1,0,0, - 114,182,0,0,0,114,229,0,0,0,114,213,0,0,0,114, - 212,0,0,0,114,217,0,0,0,114,220,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,43,1,0,0,163,4,0,0,115,18,0,0,0, - 8,1,8,3,2,1,10,8,8,3,8,3,8,3,8,3, - 8,3,114,43,1,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,64,0,0,0, - 115,106,0,0,0,101,0,90,1,100,0,90,2,100,1,90, - 3,101,4,100,2,100,3,132,0,131,1,90,5,101,4,100, - 4,100,5,132,0,131,1,90,6,101,4,100,6,100,7,132, - 0,131,1,90,7,101,4,100,8,100,9,132,0,131,1,90, - 8,101,4,100,17,100,11,100,12,132,1,131,1,90,9,101, - 4,100,18,100,13,100,14,132,1,131,1,90,10,101,4,100, - 19,100,15,100,16,132,1,131,1,90,11,100,10,83,0,41, - 20,218,10,80,97,116,104,70,105,110,100,101,114,122,62,77, - 101,116,97,32,112,97,116,104,32,102,105,110,100,101,114,32, - 102,111,114,32,115,121,115,46,112,97,116,104,32,97,110,100, - 32,112,97,99,107,97,103,101,32,95,95,112,97,116,104,95, - 95,32,97,116,116,114,105,98,117,116,101,115,46,99,1,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,64,0,0,0,116,0,116,1,106, - 2,160,3,161,0,131,1,68,0,93,44,92,2,125,1,125, - 2,124,2,100,1,107,8,114,40,116,1,106,2,124,1,61, - 0,113,14,116,4,124,2,100,2,131,2,114,14,124,2,160, - 5,161,0,1,0,113,14,100,1,83,0,41,3,122,125,67, - 97,108,108,32,116,104,101,32,105,110,118,97,108,105,100,97, - 116,101,95,99,97,99,104,101,115,40,41,32,109,101,116,104, - 111,100,32,111,110,32,97,108,108,32,112,97,116,104,32,101, - 110,116,114,121,32,102,105,110,100,101,114,115,10,32,32,32, - 32,32,32,32,32,115,116,111,114,101,100,32,105,110,32,115, - 121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114, - 95,99,97,99,104,101,115,32,40,119,104,101,114,101,32,105, - 109,112,108,101,109,101,110,116,101,100,41,46,78,218,17,105, - 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115, - 41,6,218,4,108,105,115,116,114,8,0,0,0,218,19,112, - 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, - 104,101,218,5,105,116,101,109,115,114,128,0,0,0,114,46, - 1,0,0,41,3,114,193,0,0,0,114,117,0,0,0,218, - 6,102,105,110,100,101,114,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,46,1,0,0,209,4,0,0,115, - 10,0,0,0,0,4,22,1,8,1,10,1,10,1,122,28, - 80,97,116,104,70,105,110,100,101,114,46,105,110,118,97,108, - 105,100,97,116,101,95,99,97,99,104,101,115,99,2,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,9,0,0, - 0,67,0,0,0,115,84,0,0,0,116,0,106,1,100,1, - 107,9,114,28,116,0,106,1,115,28,116,2,160,3,100,2, - 116,4,161,2,1,0,116,0,106,1,68,0,93,44,125,2, - 122,14,124,2,124,1,131,1,87,0,2,0,1,0,83,0, - 4,0,116,5,107,10,114,76,1,0,1,0,1,0,89,0, - 113,34,89,0,113,34,88,0,113,34,100,1,83,0,41,3, - 122,46,83,101,97,114,99,104,32,115,121,115,46,112,97,116, - 104,95,104,111,111,107,115,32,102,111,114,32,97,32,102,105, - 110,100,101,114,32,102,111,114,32,39,112,97,116,104,39,46, - 78,122,23,115,121,115,46,112,97,116,104,95,104,111,111,107, - 115,32,105,115,32,101,109,112,116,121,41,6,114,8,0,0, - 0,218,10,112,97,116,104,95,104,111,111,107,115,114,75,0, - 0,0,114,76,0,0,0,114,138,0,0,0,114,118,0,0, - 0,41,3,114,193,0,0,0,114,44,0,0,0,90,4,104, - 111,111,107,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,11,95,112,97,116,104,95,104,111,111,107,115,219, - 4,0,0,115,16,0,0,0,0,3,16,1,12,1,10,1, - 2,1,14,1,14,1,12,2,122,22,80,97,116,104,70,105, - 110,100,101,114,46,95,112,97,116,104,95,104,111,111,107,115, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,104,0,0,0,124,1, - 100,1,107,2,114,44,122,12,116,0,160,1,161,0,125,1, - 87,0,110,22,4,0,116,2,107,10,114,42,1,0,1,0, - 1,0,89,0,100,2,83,0,88,0,122,14,116,3,106,4, - 124,1,25,0,125,2,87,0,110,40,4,0,116,5,107,10, - 114,98,1,0,1,0,1,0,124,0,160,6,124,1,161,1, - 125,2,124,2,116,3,106,4,124,1,60,0,89,0,110,2, - 88,0,124,2,83,0,41,3,122,210,71,101,116,32,116,104, - 101,32,102,105,110,100,101,114,32,102,111,114,32,116,104,101, - 32,112,97,116,104,32,101,110,116,114,121,32,102,114,111,109, - 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, - 101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,32, - 32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,101, - 110,116,114,121,32,105,115,32,110,111,116,32,105,110,32,116, - 104,101,32,99,97,99,104,101,44,32,102,105,110,100,32,116, - 104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,102, - 105,110,100,101,114,10,32,32,32,32,32,32,32,32,97,110, - 100,32,99,97,99,104,101,32,105,116,46,32,73,102,32,110, - 111,32,102,105,110,100,101,114,32,105,115,32,97,118,97,105, - 108,97,98,108,101,44,32,115,116,111,114,101,32,78,111,110, - 101,46,10,10,32,32,32,32,32,32,32,32,114,40,0,0, - 0,78,41,7,114,2,0,0,0,114,55,0,0,0,114,2, - 1,0,0,114,8,0,0,0,114,48,1,0,0,218,8,75, - 101,121,69,114,114,111,114,114,52,1,0,0,41,3,114,193, - 0,0,0,114,44,0,0,0,114,50,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,20,95,112, - 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, - 104,101,232,4,0,0,115,22,0,0,0,0,8,8,1,2, - 1,12,1,14,3,8,1,2,1,14,1,14,1,10,1,16, - 1,122,31,80,97,116,104,70,105,110,100,101,114,46,95,112, - 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, - 104,101,99,3,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,4,0,0,0,67,0,0,0,115,82,0,0,0, - 116,0,124,2,100,1,131,2,114,26,124,2,160,1,124,1, - 161,1,92,2,125,3,125,4,110,14,124,2,160,2,124,1, - 161,1,125,3,103,0,125,4,124,3,100,0,107,9,114,60, - 116,3,160,4,124,1,124,3,161,2,83,0,116,3,160,5, - 124,1,100,0,161,2,125,5,124,4,124,5,95,6,124,5, - 83,0,41,2,78,114,137,0,0,0,41,7,114,128,0,0, - 0,114,137,0,0,0,114,206,0,0,0,114,134,0,0,0, - 114,201,0,0,0,114,183,0,0,0,114,178,0,0,0,41, - 6,114,193,0,0,0,114,139,0,0,0,114,50,1,0,0, - 114,140,0,0,0,114,141,0,0,0,114,187,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,16, - 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, - 254,4,0,0,115,18,0,0,0,0,4,10,1,16,2,10, - 1,4,1,8,1,12,1,12,1,6,1,122,27,80,97,116, - 104,70,105,110,100,101,114,46,95,108,101,103,97,99,121,95, - 103,101,116,95,115,112,101,99,78,99,4,0,0,0,0,0, - 0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,0, - 0,0,115,166,0,0,0,103,0,125,4,124,2,68,0,93, - 134,125,5,116,0,124,5,116,1,116,2,102,2,131,2,115, - 28,113,8,124,0,160,3,124,5,161,1,125,6,124,6,100, - 1,107,9,114,8,116,4,124,6,100,2,131,2,114,70,124, - 6,160,5,124,1,124,3,161,2,125,7,110,12,124,0,160, - 6,124,1,124,6,161,2,125,7,124,7,100,1,107,8,114, - 92,113,8,124,7,106,7,100,1,107,9,114,110,124,7,2, - 0,1,0,83,0,124,7,106,8,125,8,124,8,100,1,107, - 8,114,132,116,9,100,3,131,1,130,1,124,4,160,10,124, - 8,161,1,1,0,113,8,116,11,160,12,124,1,100,1,161, - 2,125,7,124,4,124,7,95,8,124,7,83,0,41,4,122, - 63,70,105,110,100,32,116,104,101,32,108,111,97,100,101,114, - 32,111,114,32,110,97,109,101,115,112,97,99,101,95,112,97, - 116,104,32,102,111,114,32,116,104,105,115,32,109,111,100,117, - 108,101,47,112,97,99,107,97,103,101,32,110,97,109,101,46, - 78,114,203,0,0,0,122,19,115,112,101,99,32,109,105,115, - 115,105,110,103,32,108,111,97,100,101,114,41,13,114,161,0, - 0,0,114,85,0,0,0,218,5,98,121,116,101,115,114,54, - 1,0,0,114,128,0,0,0,114,203,0,0,0,114,55,1, - 0,0,114,140,0,0,0,114,178,0,0,0,114,118,0,0, - 0,114,167,0,0,0,114,134,0,0,0,114,183,0,0,0, - 41,9,114,193,0,0,0,114,139,0,0,0,114,44,0,0, - 0,114,202,0,0,0,218,14,110,97,109,101,115,112,97,99, - 101,95,112,97,116,104,90,5,101,110,116,114,121,114,50,1, - 0,0,114,187,0,0,0,114,141,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,9,95,103,101, - 116,95,115,112,101,99,13,5,0,0,115,40,0,0,0,0, - 5,4,1,8,1,14,1,2,1,10,1,8,1,10,1,14, - 2,12,1,8,1,2,1,10,1,8,1,6,1,8,1,8, - 5,12,2,12,1,6,1,122,20,80,97,116,104,70,105,110, - 100,101,114,46,95,103,101,116,95,115,112,101,99,99,4,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0, - 0,0,67,0,0,0,115,100,0,0,0,124,2,100,1,107, - 8,114,14,116,0,106,1,125,2,124,0,160,2,124,1,124, - 2,124,3,161,3,125,4,124,4,100,1,107,8,114,40,100, - 1,83,0,124,4,106,3,100,1,107,8,114,92,124,4,106, - 4,125,5,124,5,114,86,100,1,124,4,95,5,116,6,124, - 1,124,5,124,0,106,2,131,3,124,4,95,4,124,4,83, - 0,100,1,83,0,110,4,124,4,83,0,100,1,83,0,41, - 2,122,141,84,114,121,32,116,111,32,102,105,110,100,32,97, - 32,115,112,101,99,32,102,111,114,32,39,102,117,108,108,110, - 97,109,101,39,32,111,110,32,115,121,115,46,112,97,116,104, - 32,111,114,32,39,112,97,116,104,39,46,10,10,32,32,32, - 32,32,32,32,32,84,104,101,32,115,101,97,114,99,104,32, - 105,115,32,98,97,115,101,100,32,111,110,32,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,97,110,100,32,115, - 121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114, - 95,99,97,99,104,101,46,10,32,32,32,32,32,32,32,32, - 78,41,7,114,8,0,0,0,114,44,0,0,0,114,58,1, - 0,0,114,140,0,0,0,114,178,0,0,0,114,181,0,0, - 0,114,22,1,0,0,41,6,114,193,0,0,0,114,139,0, - 0,0,114,44,0,0,0,114,202,0,0,0,114,187,0,0, - 0,114,57,1,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,203,0,0,0,45,5,0,0,115,26, - 0,0,0,0,6,8,1,6,1,14,1,8,1,4,1,10, - 1,6,1,4,3,6,1,16,1,4,2,6,2,122,20,80, - 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,115, - 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,30,0,0, - 0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100, - 1,107,8,114,24,100,1,83,0,124,3,106,1,83,0,41, - 2,122,170,102,105,110,100,32,116,104,101,32,109,111,100,117, - 108,101,32,111,110,32,115,121,115,46,112,97,116,104,32,111, - 114,32,39,112,97,116,104,39,32,98,97,115,101,100,32,111, - 110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115, - 32,97,110,100,10,32,32,32,32,32,32,32,32,115,121,115, - 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, - 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,114,204, - 0,0,0,114,205,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,206,0,0,0,69,5,0,0, - 115,8,0,0,0,0,8,12,1,8,1,4,1,122,22,80, - 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,109, - 111,100,117,108,101,41,1,78,41,2,78,78,41,1,78,41, - 12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,207,0,0,0,114,46,1,0,0,114, - 52,1,0,0,114,54,1,0,0,114,55,1,0,0,114,58, - 1,0,0,114,203,0,0,0,114,206,0,0,0,114,3,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,78,84,114,3,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, + 0,180,4,0,0,115,2,0,0,0,0,1,122,27,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105, + 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,40, + 0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0, + 0,183,4,0,0,115,2,0,0,0,0,1,122,27,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103, + 101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0, + 0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,100, + 4,100,5,141,4,83,0,41,6,78,114,40,0,0,0,122, + 8,60,115,116,114,105,110,103,62,114,215,0,0,0,84,41, + 1,114,231,0,0,0,41,1,114,232,0,0,0,114,219,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,45,1,0,0,205,4,0,0,115,30,0,0,0,8, - 2,4,2,2,1,10,9,2,1,10,12,2,1,10,21,2, - 1,10,14,2,1,12,31,2,1,12,23,2,1,114,45,1, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,90,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,101,6,90,7, - 100,6,100,7,132,0,90,8,100,8,100,9,132,0,90,9, - 100,19,100,11,100,12,132,1,90,10,100,13,100,14,132,0, - 90,11,101,12,100,15,100,16,132,0,131,1,90,13,100,17, - 100,18,132,0,90,14,100,10,83,0,41,20,218,10,70,105, - 108,101,70,105,110,100,101,114,122,172,70,105,108,101,45,98, - 97,115,101,100,32,102,105,110,100,101,114,46,10,10,32,32, - 32,32,73,110,116,101,114,97,99,116,105,111,110,115,32,119, - 105,116,104,32,116,104,101,32,102,105,108,101,32,115,121,115, - 116,101,109,32,97,114,101,32,99,97,99,104,101,100,32,102, - 111,114,32,112,101,114,102,111,114,109,97,110,99,101,44,32, - 98,101,105,110,103,10,32,32,32,32,114,101,102,114,101,115, - 104,101,100,32,119,104,101,110,32,116,104,101,32,100,105,114, - 101,99,116,111,114,121,32,116,104,101,32,102,105,110,100,101, - 114,32,105,115,32,104,97,110,100,108,105,110,103,32,104,97, - 115,32,98,101,101,110,32,109,111,100,105,102,105,101,100,46, - 10,10,32,32,32,32,99,2,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,115, - 84,0,0,0,103,0,125,3,124,2,68,0,93,32,92,2, - 137,0,125,4,124,3,160,0,135,0,102,1,100,1,100,2, - 132,8,124,4,68,0,131,1,161,1,1,0,113,8,124,3, - 124,0,95,1,124,1,112,54,100,3,124,0,95,2,100,4, - 124,0,95,3,116,4,131,0,124,0,95,5,116,4,131,0, - 124,0,95,6,100,5,83,0,41,6,122,154,73,110,105,116, - 105,97,108,105,122,101,32,119,105,116,104,32,116,104,101,32, - 112,97,116,104,32,116,111,32,115,101,97,114,99,104,32,111, - 110,32,97,110,100,32,97,32,118,97,114,105,97,98,108,101, - 32,110,117,109,98,101,114,32,111,102,10,32,32,32,32,32, - 32,32,32,50,45,116,117,112,108,101,115,32,99,111,110,116, - 97,105,110,105,110,103,32,116,104,101,32,108,111,97,100,101, - 114,32,97,110,100,32,116,104,101,32,102,105,108,101,32,115, - 117,102,102,105,120,101,115,32,116,104,101,32,108,111,97,100, - 101,114,10,32,32,32,32,32,32,32,32,114,101,99,111,103, - 110,105,122,101,115,46,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,51,0,0,0,115, - 22,0,0,0,124,0,93,14,125,1,124,1,136,0,102,2, - 86,0,1,0,113,2,100,0,83,0,114,110,0,0,0,114, - 3,0,0,0,114,16,1,0,0,169,1,114,140,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,19,1,0,0,98, - 5,0,0,115,4,0,0,0,4,0,2,0,122,38,70,105, - 108,101,70,105,110,100,101,114,46,95,95,105,110,105,116,95, - 95,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101, - 120,112,114,62,114,71,0,0,0,114,105,0,0,0,78,41, - 7,114,167,0,0,0,218,8,95,108,111,97,100,101,114,115, - 114,44,0,0,0,218,11,95,112,97,116,104,95,109,116,105, - 109,101,218,3,115,101,116,218,11,95,112,97,116,104,95,99, - 97,99,104,101,218,19,95,114,101,108,97,120,101,100,95,112, - 97,116,104,95,99,97,99,104,101,41,5,114,119,0,0,0, - 114,44,0,0,0,218,14,108,111,97,100,101,114,95,100,101, - 116,97,105,108,115,90,7,108,111,97,100,101,114,115,114,189, - 0,0,0,114,3,0,0,0,114,60,1,0,0,114,6,0, - 0,0,114,209,0,0,0,92,5,0,0,115,16,0,0,0, - 0,4,4,1,12,1,26,1,6,2,10,1,6,1,8,1, - 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,105, - 110,105,116,95,95,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,10, - 0,0,0,100,1,124,0,95,0,100,2,83,0,41,3,122, - 31,73,110,118,97,108,105,100,97,116,101,32,116,104,101,32, - 100,105,114,101,99,116,111,114,121,32,109,116,105,109,101,46, - 114,105,0,0,0,78,41,1,114,62,1,0,0,114,246,0, + 0,114,213,0,0,0,186,4,0,0,115,2,0,0,0,0, + 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97, + 100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,210, + 0,0,0,114,3,0,0,0,114,211,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,0, + 0,189,4,0,0,115,2,0,0,0,0,1,122,30,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99, + 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,110, + 0,0,0,114,3,0,0,0,114,253,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, + 0,192,4,0,0,115,2,0,0,0,0,1,122,28,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, + 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, + 83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109, + 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, + 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, + 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, + 41,4,114,134,0,0,0,114,149,0,0,0,114,24,1,0, + 0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,195, + 4,0,0,115,8,0,0,0,0,7,6,1,4,255,4,2, + 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,108,111,97,100,95,109,111,100,117,108,101,78,41, + 12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,209,0,0,0,114,207,0,0,0,114,44,1,0,0,114, + 182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,212, + 0,0,0,114,217,0,0,0,114,220,0,0,0,114,3,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,46,1,0,0,106,5,0,0,115,2,0,0,0,0, - 2,122,28,70,105,108,101,70,105,110,100,101,114,46,105,110, - 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,99, + 0,114,43,1,0,0,167,4,0,0,115,18,0,0,0,8, + 1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,8, + 3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, + 106,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, + 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, + 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, + 101,4,100,17,100,11,100,12,132,1,131,1,90,9,101,4, + 100,18,100,13,100,14,132,1,131,1,90,10,101,4,100,19, + 100,15,100,16,132,1,131,1,90,11,100,10,83,0,41,20, + 218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,101, + 116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102, + 111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,32, + 112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,95, + 32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, + 0,67,0,0,0,115,64,0,0,0,116,0,116,1,106,2, + 160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,2, + 124,2,100,1,107,8,114,40,116,1,106,2,124,1,61,0, + 113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,5, + 161,0,1,0,113,14,100,1,83,0,41,3,122,125,67,97, + 108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,116, + 101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,111, + 100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,110, + 116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,32, + 32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,121, + 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,109, + 112,108,101,109,101,110,116,101,100,41,46,78,218,17,105,110, + 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,41, + 6,218,4,108,105,115,116,114,8,0,0,0,218,19,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,218,5,105,116,101,109,115,114,128,0,0,0,114,46,1, + 0,0,41,3,114,193,0,0,0,114,117,0,0,0,218,6, + 102,105,110,100,101,114,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,46,1,0,0,213,4,0,0,115,10, + 0,0,0,0,4,22,1,8,1,10,1,10,1,122,28,80, + 97,116,104,70,105,110,100,101,114,46,105,110,118,97,108,105, + 100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,9,0,0,0, + 67,0,0,0,115,84,0,0,0,116,0,106,1,100,1,107, + 9,114,28,116,0,106,1,115,28,116,2,160,3,100,2,116, + 4,161,2,1,0,116,0,106,1,68,0,93,44,125,2,122, + 14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,4, + 0,116,5,107,10,114,76,1,0,1,0,1,0,89,0,113, + 34,89,0,113,34,88,0,113,34,100,1,83,0,41,3,122, + 46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,104, + 95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,110, + 100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,78, + 122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,115, + 32,105,115,32,101,109,112,116,121,41,6,114,8,0,0,0, + 218,10,112,97,116,104,95,104,111,111,107,115,114,75,0,0, + 0,114,76,0,0,0,114,138,0,0,0,114,118,0,0,0, + 41,3,114,193,0,0,0,114,44,0,0,0,90,4,104,111, + 111,107,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,11,95,112,97,116,104,95,104,111,111,107,115,223,4, + 0,0,115,16,0,0,0,0,3,16,1,12,1,10,1,2, + 1,14,1,14,1,12,2,122,22,80,97,116,104,70,105,110, + 100,101,114,46,95,112,97,116,104,95,104,111,111,107,115,99, 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,42,0,0,0,124,0,160, - 0,124,1,161,1,125,2,124,2,100,1,107,8,114,26,100, - 1,103,0,102,2,83,0,124,2,106,1,124,2,106,2,112, - 38,103,0,102,2,83,0,41,2,122,197,84,114,121,32,116, - 111,32,102,105,110,100,32,97,32,108,111,97,100,101,114,32, - 102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101, - 100,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101, - 32,110,97,109,101,115,112,97,99,101,10,32,32,32,32,32, - 32,32,32,112,97,99,107,97,103,101,32,112,111,114,116,105, - 111,110,115,46,32,82,101,116,117,114,110,115,32,40,108,111, - 97,100,101,114,44,32,108,105,115,116,45,111,102,45,112,111, - 114,116,105,111,110,115,41,46,10,10,32,32,32,32,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, - 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 78,41,3,114,203,0,0,0,114,140,0,0,0,114,178,0, - 0,0,41,3,114,119,0,0,0,114,139,0,0,0,114,187, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,137,0,0,0,112,5,0,0,115,8,0,0,0, - 0,7,10,1,8,1,8,1,122,22,70,105,108,101,70,105, - 110,100,101,114,46,102,105,110,100,95,108,111,97,100,101,114, - 99,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0, - 0,6,0,0,0,67,0,0,0,115,26,0,0,0,124,1, - 124,2,124,3,131,2,125,6,116,0,124,2,124,3,124,6, - 124,4,100,1,141,4,83,0,41,2,78,114,177,0,0,0, - 41,1,114,190,0,0,0,41,7,114,119,0,0,0,114,188, - 0,0,0,114,139,0,0,0,114,44,0,0,0,90,4,115, - 109,115,108,114,202,0,0,0,114,140,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,58,1,0, - 0,124,5,0,0,115,8,0,0,0,0,1,10,1,8,1, - 2,255,122,20,70,105,108,101,70,105,110,100,101,114,46,95, - 103,101,116,95,115,112,101,99,78,99,3,0,0,0,0,0, - 0,0,0,0,0,0,14,0,0,0,8,0,0,0,67,0, - 0,0,115,102,1,0,0,100,1,125,3,124,1,160,0,100, - 2,161,1,100,3,25,0,125,4,122,24,116,1,124,0,106, - 2,112,34,116,3,160,4,161,0,131,1,106,5,125,5,87, - 0,110,24,4,0,116,6,107,10,114,66,1,0,1,0,1, - 0,100,4,125,5,89,0,110,2,88,0,124,5,124,0,106, - 7,107,3,114,92,124,0,160,8,161,0,1,0,124,5,124, - 0,95,7,116,9,131,0,114,114,124,0,106,10,125,6,124, - 4,160,11,161,0,125,7,110,10,124,0,106,12,125,6,124, - 4,125,7,124,7,124,6,107,6,114,218,116,13,124,0,106, - 2,124,4,131,2,125,8,124,0,106,14,68,0,93,58,92, - 2,125,9,125,10,100,5,124,9,23,0,125,11,116,13,124, - 8,124,11,131,2,125,12,116,15,124,12,131,1,114,208,124, - 0,160,16,124,10,124,1,124,12,124,8,103,1,124,2,161, - 5,2,0,1,0,83,0,113,150,116,17,124,8,131,1,125, - 3,124,0,106,14,68,0,93,86,92,2,125,9,125,10,116, - 13,124,0,106,2,124,4,124,9,23,0,131,2,125,12,116, - 18,106,19,100,6,124,12,100,3,100,7,141,3,1,0,124, - 7,124,9,23,0,124,6,107,6,144,1,114,54,116,15,124, - 12,131,1,144,1,114,54,124,0,160,16,124,10,124,1,124, - 12,100,8,124,2,161,5,2,0,1,0,83,0,113,224,124, - 3,144,1,114,98,116,18,160,19,100,9,124,8,161,2,1, - 0,116,18,160,20,124,1,100,8,161,2,125,13,124,8,103, - 1,124,13,95,21,124,13,83,0,100,8,83,0,41,10,122, - 111,84,114,121,32,116,111,32,102,105,110,100,32,97,32,115, - 112,101,99,32,102,111,114,32,116,104,101,32,115,112,101,99, - 105,102,105,101,100,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,115,32,116, - 104,101,32,109,97,116,99,104,105,110,103,32,115,112,101,99, - 44,32,111,114,32,78,111,110,101,32,105,102,32,110,111,116, - 32,102,111,117,110,100,46,10,32,32,32,32,32,32,32,32, - 70,114,71,0,0,0,114,28,0,0,0,114,105,0,0,0, - 114,209,0,0,0,122,9,116,114,121,105,110,103,32,123,125, - 41,1,90,9,118,101,114,98,111,115,105,116,121,78,122,25, - 112,111,115,115,105,98,108,101,32,110,97,109,101,115,112,97, - 99,101,32,102,111,114,32,123,125,41,22,114,41,0,0,0, - 114,49,0,0,0,114,44,0,0,0,114,2,0,0,0,114, - 55,0,0,0,114,9,1,0,0,114,50,0,0,0,114,62, - 1,0,0,218,11,95,102,105,108,108,95,99,97,99,104,101, - 114,7,0,0,0,114,65,1,0,0,114,106,0,0,0,114, - 64,1,0,0,114,38,0,0,0,114,61,1,0,0,114,54, - 0,0,0,114,58,1,0,0,114,56,0,0,0,114,134,0, - 0,0,114,149,0,0,0,114,183,0,0,0,114,178,0,0, - 0,41,14,114,119,0,0,0,114,139,0,0,0,114,202,0, - 0,0,90,12,105,115,95,110,97,109,101,115,112,97,99,101, - 90,11,116,97,105,108,95,109,111,100,117,108,101,114,169,0, - 0,0,90,5,99,97,99,104,101,90,12,99,97,99,104,101, - 95,109,111,100,117,108,101,90,9,98,97,115,101,95,112,97, - 116,104,114,17,1,0,0,114,188,0,0,0,90,13,105,110, - 105,116,95,102,105,108,101,110,97,109,101,90,9,102,117,108, - 108,95,112,97,116,104,114,187,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,203,0,0,0,129, - 5,0,0,115,74,0,0,0,0,5,4,1,14,1,2,1, - 24,1,14,1,10,1,10,1,8,1,6,2,6,1,6,1, - 10,2,6,1,4,2,8,1,12,1,14,1,8,1,10,1, - 8,1,26,4,8,2,14,1,16,1,16,1,14,1,10,1, - 10,1,2,0,2,255,10,2,6,1,12,1,12,1,8,1, - 4,1,122,20,70,105,108,101,70,105,110,100,101,114,46,102, - 105,110,100,95,115,112,101,99,99,1,0,0,0,0,0,0, - 0,0,0,0,0,9,0,0,0,10,0,0,0,67,0,0, - 0,115,190,0,0,0,124,0,106,0,125,1,122,22,116,1, - 160,2,124,1,112,22,116,1,160,3,161,0,161,1,125,2, - 87,0,110,30,4,0,116,4,116,5,116,6,102,3,107,10, - 114,58,1,0,1,0,1,0,103,0,125,2,89,0,110,2, - 88,0,116,7,106,8,160,9,100,1,161,1,115,84,116,10, - 124,2,131,1,124,0,95,11,110,74,116,10,131,0,125,3, - 124,2,68,0,93,56,125,4,124,4,160,12,100,2,161,1, - 92,3,125,5,125,6,125,7,124,6,114,136,100,3,160,13, - 124,5,124,7,160,14,161,0,161,2,125,8,110,4,124,5, - 125,8,124,3,160,15,124,8,161,1,1,0,113,94,124,3, - 124,0,95,11,116,7,106,8,160,9,116,16,161,1,114,186, - 100,4,100,5,132,0,124,2,68,0,131,1,124,0,95,17, - 100,6,83,0,41,7,122,68,70,105,108,108,32,116,104,101, - 32,99,97,99,104,101,32,111,102,32,112,111,116,101,110,116, - 105,97,108,32,109,111,100,117,108,101,115,32,97,110,100,32, - 112,97,99,107,97,103,101,115,32,102,111,114,32,116,104,105, - 115,32,100,105,114,101,99,116,111,114,121,46,114,0,0,0, - 0,114,71,0,0,0,114,61,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 83,0,0,0,115,20,0,0,0,104,0,124,0,93,12,125, - 1,124,1,160,0,161,0,146,2,113,4,83,0,114,3,0, - 0,0,41,1,114,106,0,0,0,41,2,114,32,0,0,0, - 90,2,102,110,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,9,60,115,101,116,99,111,109,112,62,206,5, - 0,0,115,4,0,0,0,6,0,2,0,122,41,70,105,108, - 101,70,105,110,100,101,114,46,95,102,105,108,108,95,99,97, - 99,104,101,46,60,108,111,99,97,108,115,62,46,60,115,101, - 116,99,111,109,112,62,78,41,18,114,44,0,0,0,114,2, - 0,0,0,114,6,1,0,0,114,55,0,0,0,114,2,1, - 0,0,218,15,80,101,114,109,105,115,115,105,111,110,69,114, - 114,111,114,218,18,78,111,116,65,68,105,114,101,99,116,111, - 114,121,69,114,114,111,114,114,8,0,0,0,114,9,0,0, - 0,114,10,0,0,0,114,63,1,0,0,114,64,1,0,0, - 114,101,0,0,0,114,62,0,0,0,114,106,0,0,0,218, - 3,97,100,100,114,11,0,0,0,114,65,1,0,0,41,9, - 114,119,0,0,0,114,44,0,0,0,114,7,1,0,0,90, - 21,108,111,119,101,114,95,115,117,102,102,105,120,95,99,111, - 110,116,101,110,116,115,114,41,1,0,0,114,117,0,0,0, - 114,29,1,0,0,114,17,1,0,0,90,8,110,101,119,95, - 110,97,109,101,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,67,1,0,0,177,5,0,0,115,34,0,0, - 0,0,2,6,1,2,1,22,1,20,3,10,3,12,1,12, - 7,6,1,8,1,16,1,4,1,18,2,4,1,12,1,6, - 1,12,1,122,22,70,105,108,101,70,105,110,100,101,114,46, - 95,102,105,108,108,95,99,97,99,104,101,99,1,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 7,0,0,0,115,18,0,0,0,135,0,135,1,102,2,100, - 1,100,2,132,8,125,2,124,2,83,0,41,3,97,20,1, - 0,0,65,32,99,108,97,115,115,32,109,101,116,104,111,100, - 32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,97, - 32,99,108,111,115,117,114,101,32,116,111,32,117,115,101,32, - 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, - 10,32,32,32,32,32,32,32,32,119,104,105,99,104,32,119, - 105,108,108,32,114,101,116,117,114,110,32,97,110,32,105,110, - 115,116,97,110,99,101,32,117,115,105,110,103,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,32,108,111,97,100,101, - 114,115,32,97,110,100,32,116,104,101,32,112,97,116,104,10, - 32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,111, - 110,32,116,104,101,32,99,108,111,115,117,114,101,46,10,10, - 32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112, - 97,116,104,32,99,97,108,108,101,100,32,111,110,32,116,104, - 101,32,99,108,111,115,117,114,101,32,105,115,32,110,111,116, - 32,97,32,100,105,114,101,99,116,111,114,121,44,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,115,10,32,32,32, - 32,32,32,32,32,114,97,105,115,101,100,46,10,10,32,32, - 32,32,32,32,32,32,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,4,0,0,0,19,0,0,0,115, - 34,0,0,0,116,0,124,0,131,1,115,20,116,1,100,1, - 124,0,100,2,141,2,130,1,136,0,124,0,102,1,136,1, - 158,2,142,0,83,0,41,3,122,45,80,97,116,104,32,104, - 111,111,107,32,102,111,114,32,105,109,112,111,114,116,108,105, - 98,46,109,97,99,104,105,110,101,114,121,46,70,105,108,101, - 70,105,110,100,101,114,46,122,30,111,110,108,121,32,100,105, - 114,101,99,116,111,114,105,101,115,32,97,114,101,32,115,117, - 112,112,111,114,116,101,100,114,48,0,0,0,41,2,114,56, - 0,0,0,114,118,0,0,0,114,48,0,0,0,169,2,114, - 193,0,0,0,114,66,1,0,0,114,3,0,0,0,114,6, - 0,0,0,218,24,112,97,116,104,95,104,111,111,107,95,102, - 111,114,95,70,105,108,101,70,105,110,100,101,114,218,5,0, - 0,115,6,0,0,0,0,2,8,1,12,1,122,54,70,105, - 108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111, - 111,107,46,60,108,111,99,97,108,115,62,46,112,97,116,104, - 95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105, - 110,100,101,114,114,3,0,0,0,41,3,114,193,0,0,0, - 114,66,1,0,0,114,73,1,0,0,114,3,0,0,0,114, - 72,1,0,0,114,6,0,0,0,218,9,112,97,116,104,95, - 104,111,111,107,208,5,0,0,115,4,0,0,0,0,10,14, - 6,122,20,70,105,108,101,70,105,110,100,101,114,46,112,97, - 116,104,95,104,111,111,107,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,100,1,160,0,124,0,106,1,161,1,83, - 0,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114, - 40,123,33,114,125,41,41,2,114,62,0,0,0,114,44,0, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,39,1,0,0,226,5,0,0,115, - 2,0,0,0,0,1,122,19,70,105,108,101,70,105,110,100, - 101,114,46,95,95,114,101,112,114,95,95,41,1,78,41,15, + 8,0,0,0,67,0,0,0,115,104,0,0,0,124,1,100, + 1,107,2,114,44,122,12,116,0,160,1,161,0,125,1,87, + 0,110,22,4,0,116,2,107,10,114,42,1,0,1,0,1, + 0,89,0,100,2,83,0,88,0,122,14,116,3,106,4,124, + 1,25,0,125,2,87,0,110,40,4,0,116,5,107,10,114, + 98,1,0,1,0,1,0,124,0,160,6,124,1,161,1,125, + 2,124,2,116,3,106,4,124,1,60,0,89,0,110,2,88, + 0,124,2,83,0,41,3,122,210,71,101,116,32,116,104,101, + 32,102,105,110,100,101,114,32,102,111,114,32,116,104,101,32, + 112,97,116,104,32,101,110,116,114,121,32,102,114,111,109,32, + 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, + 114,95,99,97,99,104,101,46,10,10,32,32,32,32,32,32, + 32,32,73,102,32,116,104,101,32,112,97,116,104,32,101,110, + 116,114,121,32,105,115,32,110,111,116,32,105,110,32,116,104, + 101,32,99,97,99,104,101,44,32,102,105,110,100,32,116,104, + 101,32,97,112,112,114,111,112,114,105,97,116,101,32,102,105, + 110,100,101,114,10,32,32,32,32,32,32,32,32,97,110,100, + 32,99,97,99,104,101,32,105,116,46,32,73,102,32,110,111, + 32,102,105,110,100,101,114,32,105,115,32,97,118,97,105,108, + 97,98,108,101,44,32,115,116,111,114,101,32,78,111,110,101, + 46,10,10,32,32,32,32,32,32,32,32,114,40,0,0,0, + 78,41,7,114,2,0,0,0,114,55,0,0,0,114,3,1, + 0,0,114,8,0,0,0,114,48,1,0,0,218,8,75,101, + 121,69,114,114,111,114,114,52,1,0,0,41,3,114,193,0, + 0,0,114,44,0,0,0,114,50,1,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,20,95,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,236,4,0,0,115,22,0,0,0,0,8,8,1,2,1, + 12,1,14,3,8,1,2,1,14,1,14,1,10,1,16,1, + 122,31,80,97,116,104,70,105,110,100,101,114,46,95,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,99,3,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,4,0,0,0,67,0,0,0,115,82,0,0,0,116, + 0,124,2,100,1,131,2,114,26,124,2,160,1,124,1,161, + 1,92,2,125,3,125,4,110,14,124,2,160,2,124,1,161, + 1,125,3,103,0,125,4,124,3,100,0,107,9,114,60,116, + 3,160,4,124,1,124,3,161,2,83,0,116,3,160,5,124, + 1,100,0,161,2,125,5,124,4,124,5,95,6,124,5,83, + 0,41,2,78,114,137,0,0,0,41,7,114,128,0,0,0, + 114,137,0,0,0,114,206,0,0,0,114,134,0,0,0,114, + 201,0,0,0,114,183,0,0,0,114,178,0,0,0,41,6, + 114,193,0,0,0,114,139,0,0,0,114,50,1,0,0,114, + 140,0,0,0,114,141,0,0,0,114,187,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,95, + 108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,2, + 5,0,0,115,18,0,0,0,0,4,10,1,16,2,10,1, + 4,1,8,1,12,1,12,1,6,1,122,27,80,97,116,104, + 70,105,110,100,101,114,46,95,108,101,103,97,99,121,95,103, + 101,116,95,115,112,101,99,78,99,4,0,0,0,0,0,0, + 0,0,0,0,0,9,0,0,0,5,0,0,0,67,0,0, + 0,115,166,0,0,0,103,0,125,4,124,2,68,0,93,134, + 125,5,116,0,124,5,116,1,116,2,102,2,131,2,115,28, + 113,8,124,0,160,3,124,5,161,1,125,6,124,6,100,1, + 107,9,114,8,116,4,124,6,100,2,131,2,114,70,124,6, + 160,5,124,1,124,3,161,2,125,7,110,12,124,0,160,6, + 124,1,124,6,161,2,125,7,124,7,100,1,107,8,114,92, + 113,8,124,7,106,7,100,1,107,9,114,110,124,7,2,0, + 1,0,83,0,124,7,106,8,125,8,124,8,100,1,107,8, + 114,132,116,9,100,3,131,1,130,1,124,4,160,10,124,8, + 161,1,1,0,113,8,116,11,160,12,124,1,100,1,161,2, + 125,7,124,4,124,7,95,8,124,7,83,0,41,4,122,63, + 70,105,110,100,32,116,104,101,32,108,111,97,100,101,114,32, + 111,114,32,110,97,109,101,115,112,97,99,101,95,112,97,116, + 104,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108, + 101,47,112,97,99,107,97,103,101,32,110,97,109,101,46,78, + 114,203,0,0,0,122,19,115,112,101,99,32,109,105,115,115, + 105,110,103,32,108,111,97,100,101,114,41,13,114,161,0,0, + 0,114,85,0,0,0,218,5,98,121,116,101,115,114,54,1, + 0,0,114,128,0,0,0,114,203,0,0,0,114,55,1,0, + 0,114,140,0,0,0,114,178,0,0,0,114,118,0,0,0, + 114,167,0,0,0,114,134,0,0,0,114,183,0,0,0,41, + 9,114,193,0,0,0,114,139,0,0,0,114,44,0,0,0, + 114,202,0,0,0,218,14,110,97,109,101,115,112,97,99,101, + 95,112,97,116,104,90,5,101,110,116,114,121,114,50,1,0, + 0,114,187,0,0,0,114,141,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,9,95,103,101,116, + 95,115,112,101,99,17,5,0,0,115,40,0,0,0,0,5, + 4,1,8,1,14,1,2,1,10,1,8,1,10,1,14,2, + 12,1,8,1,2,1,10,1,8,1,6,1,8,1,8,5, + 12,2,12,1,6,1,122,20,80,97,116,104,70,105,110,100, + 101,114,46,95,103,101,116,95,115,112,101,99,99,4,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0, + 0,67,0,0,0,115,100,0,0,0,124,2,100,1,107,8, + 114,14,116,0,106,1,125,2,124,0,160,2,124,1,124,2, + 124,3,161,3,125,4,124,4,100,1,107,8,114,40,100,1, + 83,0,124,4,106,3,100,1,107,8,114,92,124,4,106,4, + 125,5,124,5,114,86,100,1,124,4,95,5,116,6,124,1, + 124,5,124,0,106,2,131,3,124,4,95,4,124,4,83,0, + 100,1,83,0,110,4,124,4,83,0,100,1,83,0,41,2, + 122,141,84,114,121,32,116,111,32,102,105,110,100,32,97,32, + 115,112,101,99,32,102,111,114,32,39,102,117,108,108,110,97, + 109,101,39,32,111,110,32,115,121,115,46,112,97,116,104,32, + 111,114,32,39,112,97,116,104,39,46,10,10,32,32,32,32, + 32,32,32,32,84,104,101,32,115,101,97,114,99,104,32,105, + 115,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112, + 97,116,104,95,104,111,111,107,115,32,97,110,100,32,115,121, + 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,46,10,32,32,32,32,32,32,32,32,78, + 41,7,114,8,0,0,0,114,44,0,0,0,114,58,1,0, + 0,114,140,0,0,0,114,178,0,0,0,114,181,0,0,0, + 114,22,1,0,0,41,6,114,193,0,0,0,114,139,0,0, + 0,114,44,0,0,0,114,202,0,0,0,114,187,0,0,0, + 114,57,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,203,0,0,0,49,5,0,0,115,26,0, + 0,0,0,6,8,1,6,1,14,1,8,1,4,1,10,1, + 6,1,4,3,6,1,16,1,4,2,6,2,122,20,80,97, + 116,104,70,105,110,100,101,114,46,102,105,110,100,95,115,112, + 101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,67,0,0,0,115,30,0,0,0, + 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,1, + 107,8,114,24,100,1,83,0,124,3,106,1,83,0,41,2, + 122,170,102,105,110,100,32,116,104,101,32,109,111,100,117,108, + 101,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114, + 32,39,112,97,116,104,39,32,98,97,115,101,100,32,111,110, + 32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, + 97,110,100,10,32,32,32,32,32,32,32,32,115,121,115,46, + 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, + 99,104,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,105, + 110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,78,114,204,0, + 0,0,114,205,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,206,0,0,0,73,5,0,0,115, + 8,0,0,0,0,8,12,1,8,1,4,1,122,22,80,97, + 116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,111, + 100,117,108,101,41,1,78,41,2,78,78,41,1,78,41,12, 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,209,0,0,0,114,46,1,0,0,114,143, - 0,0,0,114,206,0,0,0,114,137,0,0,0,114,58,1, - 0,0,114,203,0,0,0,114,67,1,0,0,114,207,0,0, - 0,114,74,1,0,0,114,39,1,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 59,1,0,0,83,5,0,0,115,22,0,0,0,8,2,4, - 7,8,14,8,4,4,2,8,12,8,5,10,48,8,31,2, - 1,10,17,114,59,1,0,0,99,4,0,0,0,0,0,0, - 0,0,0,0,0,6,0,0,0,8,0,0,0,67,0,0, - 0,115,146,0,0,0,124,0,160,0,100,1,161,1,125,4, - 124,0,160,0,100,2,161,1,125,5,124,4,115,66,124,5, - 114,36,124,5,106,1,125,4,110,30,124,2,124,3,107,2, - 114,56,116,2,124,1,124,2,131,2,125,4,110,10,116,3, - 124,1,124,2,131,2,125,4,124,5,115,84,116,4,124,1, - 124,2,124,4,100,3,141,3,125,5,122,36,124,5,124,0, - 100,2,60,0,124,4,124,0,100,1,60,0,124,2,124,0, - 100,4,60,0,124,3,124,0,100,5,60,0,87,0,110,20, - 4,0,116,5,107,10,114,140,1,0,1,0,1,0,89,0, - 110,2,88,0,100,0,83,0,41,6,78,218,10,95,95,108, - 111,97,100,101,114,95,95,218,8,95,95,115,112,101,99,95, - 95,114,60,1,0,0,90,8,95,95,102,105,108,101,95,95, - 90,10,95,95,99,97,99,104,101,100,95,95,41,6,218,3, - 103,101,116,114,140,0,0,0,114,14,1,0,0,114,8,1, - 0,0,114,190,0,0,0,218,9,69,120,99,101,112,116,105, - 111,110,41,6,90,2,110,115,114,117,0,0,0,90,8,112, - 97,116,104,110,97,109,101,90,9,99,112,97,116,104,110,97, - 109,101,114,140,0,0,0,114,187,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,14,95,102,105, - 120,95,117,112,95,109,111,100,117,108,101,232,5,0,0,115, - 34,0,0,0,0,2,10,1,10,1,4,1,4,1,8,1, - 8,1,12,2,10,1,4,1,14,1,2,1,8,1,8,1, - 8,1,12,1,14,2,114,79,1,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,38,0,0,0,116,0,116,1,160,2,161, - 0,102,2,125,0,116,3,116,4,102,2,125,1,116,5,116, - 6,102,2,125,2,124,0,124,1,124,2,103,3,83,0,41, - 1,122,95,82,101,116,117,114,110,115,32,97,32,108,105,115, - 116,32,111,102,32,102,105,108,101,45,98,97,115,101,100,32, - 109,111,100,117,108,101,32,108,111,97,100,101,114,115,46,10, - 10,32,32,32,32,69,97,99,104,32,105,116,101,109,32,105, - 115,32,97,32,116,117,112,108,101,32,40,108,111,97,100,101, - 114,44,32,115,117,102,102,105,120,101,115,41,46,10,32,32, - 32,32,41,7,114,15,1,0,0,114,163,0,0,0,218,18, - 101,120,116,101,110,115,105,111,110,95,115,117,102,102,105,120, - 101,115,114,8,1,0,0,114,102,0,0,0,114,14,1,0, - 0,114,89,0,0,0,41,3,90,10,101,120,116,101,110,115, - 105,111,110,115,90,6,115,111,117,114,99,101,90,8,98,121, - 116,101,99,111,100,101,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,184,0,0,0,255,5,0,0,115,8, - 0,0,0,0,5,12,1,8,1,8,1,114,184,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,12,0,0, - 0,9,0,0,0,67,0,0,0,115,178,1,0,0,124,0, - 97,0,116,0,106,1,97,1,116,0,106,2,97,2,116,1, - 106,3,116,4,25,0,125,1,100,1,68,0,93,48,125,2, - 124,2,116,1,106,3,107,7,114,56,116,0,160,5,124,2, - 161,1,125,3,110,10,116,1,106,3,124,2,25,0,125,3, - 116,6,124,1,124,2,124,3,131,3,1,0,113,30,100,2, - 100,3,103,1,102,2,100,4,100,5,100,3,103,2,102,2, - 102,2,125,4,124,4,68,0,93,110,92,2,125,5,125,6, - 116,7,100,6,100,7,132,0,124,6,68,0,131,1,131,1, - 115,136,116,8,130,1,124,6,100,8,25,0,125,7,124,5, - 116,1,106,3,107,6,114,170,116,1,106,3,124,5,25,0, - 125,8,1,0,113,226,113,106,122,20,116,0,160,5,124,5, - 161,1,125,8,87,0,1,0,113,226,87,0,113,106,4,0, - 116,9,107,10,114,214,1,0,1,0,1,0,89,0,113,106, - 89,0,113,106,88,0,113,106,116,9,100,9,131,1,130,1, - 116,6,124,1,100,10,124,8,131,3,1,0,116,6,124,1, - 100,11,124,7,131,3,1,0,116,6,124,1,100,12,100,13, - 160,10,124,6,161,1,131,3,1,0,116,6,124,1,100,14, - 100,15,100,16,132,0,124,6,68,0,131,1,131,3,1,0, - 116,0,160,5,100,17,161,1,125,9,116,6,124,1,100,17, - 124,9,131,3,1,0,116,0,160,5,100,18,161,1,125,10, - 116,6,124,1,100,18,124,10,131,3,1,0,124,5,100,4, - 107,2,144,1,114,110,116,0,160,5,100,19,161,1,125,11, - 116,6,124,1,100,20,124,11,131,3,1,0,116,6,124,1, - 100,21,116,11,131,0,131,3,1,0,116,12,160,13,116,2, - 160,14,161,0,161,1,1,0,124,5,100,4,107,2,144,1, - 114,174,116,15,160,16,100,22,161,1,1,0,100,23,116,12, - 107,6,144,1,114,174,100,24,116,17,95,18,100,25,83,0, - 41,26,122,205,83,101,116,117,112,32,116,104,101,32,112,97, - 116,104,45,98,97,115,101,100,32,105,109,112,111,114,116,101, - 114,115,32,102,111,114,32,105,109,112,111,114,116,108,105,98, - 32,98,121,32,105,109,112,111,114,116,105,110,103,32,110,101, - 101,100,101,100,10,32,32,32,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,115,32,97,110,100,32,105,110, - 106,101,99,116,105,110,103,32,116,104,101,109,32,105,110,116, - 111,32,116,104,101,32,103,108,111,98,97,108,32,110,97,109, - 101,115,112,97,99,101,46,10,10,32,32,32,32,79,116,104, - 101,114,32,99,111,109,112,111,110,101,110,116,115,32,97,114, - 101,32,101,120,116,114,97,99,116,101,100,32,102,114,111,109, - 32,116,104,101,32,99,111,114,101,32,98,111,111,116,115,116, - 114,97,112,32,109,111,100,117,108,101,46,10,10,32,32,32, - 32,41,4,114,64,0,0,0,114,75,0,0,0,218,8,98, - 117,105,108,116,105,110,115,114,160,0,0,0,90,5,112,111, - 115,105,120,250,1,47,90,2,110,116,250,1,92,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,115,0,0,0,115,26,0,0,0,124,0,93,18,125, - 1,116,0,124,1,131,1,100,0,107,2,86,0,1,0,113, - 2,100,1,83,0,41,2,114,39,0,0,0,78,41,1,114, - 22,0,0,0,41,2,114,32,0,0,0,114,95,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 19,1,0,0,35,6,0,0,115,4,0,0,0,4,0,2, - 0,122,25,95,115,101,116,117,112,46,60,108,111,99,97,108, - 115,62,46,60,103,101,110,101,120,112,114,62,114,73,0,0, - 0,122,30,105,109,112,111,114,116,108,105,98,32,114,101,113, - 117,105,114,101,115,32,112,111,115,105,120,32,111,114,32,110, - 116,114,2,0,0,0,114,35,0,0,0,114,31,0,0,0, - 114,40,0,0,0,114,58,0,0,0,99,1,0,0,0,0, + 127,0,0,0,114,207,0,0,0,114,46,1,0,0,114,52, + 1,0,0,114,54,1,0,0,114,55,1,0,0,114,58,1, + 0,0,114,203,0,0,0,114,206,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,45,1,0,0,209,4,0,0,115,30,0,0,0,8,2, + 4,2,2,1,10,9,2,1,10,12,2,1,10,21,2,1, + 10,14,2,1,12,31,2,1,12,23,2,1,114,45,1,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, + 0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,100, + 6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,100, + 19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,90, + 11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,100, + 18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,108, + 101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,97, + 115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,32, + 32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,105, + 116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116, + 101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,111, + 114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98, + 101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,104, + 101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,101, + 99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,114, + 32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,115, + 32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,10, + 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,84, + 0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,137, + 0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,132, + 8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,124, + 0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,124, + 0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,124, + 0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,105, + 97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,112, + 97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,110, + 32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,32, + 110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,32, + 32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,97, + 105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,114, + 32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,117, + 102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,101, + 114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,110, + 105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,22, + 0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,86, + 0,1,0,113,2,100,0,83,0,114,110,0,0,0,114,3, + 0,0,0,114,16,1,0,0,169,1,114,140,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,19,1,0,0,102,5, + 0,0,115,4,0,0,0,4,0,2,0,122,38,70,105,108, + 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, + 46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,120, + 112,114,62,114,71,0,0,0,114,105,0,0,0,78,41,7, + 114,167,0,0,0,218,8,95,108,111,97,100,101,114,115,114, + 44,0,0,0,218,11,95,112,97,116,104,95,109,116,105,109, + 101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,97, + 99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,97, + 116,104,95,99,97,99,104,101,41,5,114,119,0,0,0,114, + 44,0,0,0,218,14,108,111,97,100,101,114,95,100,101,116, + 97,105,108,115,90,7,108,111,97,100,101,114,115,114,189,0, + 0,0,114,3,0,0,0,114,60,1,0,0,114,6,0,0, + 0,114,209,0,0,0,96,5,0,0,115,16,0,0,0,0, + 4,4,1,12,1,26,1,6,2,10,1,6,1,8,1,122, + 19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,110, + 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,2,0,0,0,67,0,0,0,115,10,0, + 0,0,100,1,124,0,95,0,100,2,83,0,41,3,122,31, + 73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,100, + 105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,114, + 105,0,0,0,78,41,1,114,62,1,0,0,114,246,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,46,1,0,0,110,5,0,0,115,2,0,0,0,0,2, + 122,28,70,105,108,101,70,105,110,100,101,114,46,105,110,118, + 97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, + 0,0,0,67,0,0,0,115,42,0,0,0,124,0,160,0, + 124,1,161,1,125,2,124,2,100,1,107,8,114,26,100,1, + 103,0,102,2,83,0,124,2,106,1,124,2,106,2,112,38, + 103,0,102,2,83,0,41,2,122,197,84,114,121,32,116,111, + 32,102,105,110,100,32,97,32,108,111,97,100,101,114,32,102, + 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, + 32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32, + 110,97,109,101,115,112,97,99,101,10,32,32,32,32,32,32, + 32,32,112,97,99,107,97,103,101,32,112,111,114,116,105,111, + 110,115,46,32,82,101,116,117,114,110,115,32,40,108,111,97, + 100,101,114,44,32,108,105,115,116,45,111,102,45,112,111,114, + 116,105,111,110,115,41,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 41,3,114,203,0,0,0,114,140,0,0,0,114,178,0,0, + 0,41,3,114,119,0,0,0,114,139,0,0,0,114,187,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,137,0,0,0,116,5,0,0,115,8,0,0,0,0, + 7,10,1,8,1,8,1,122,22,70,105,108,101,70,105,110, + 100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, + 6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, + 6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,124, + 2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,124, + 4,100,1,141,4,83,0,41,2,78,114,177,0,0,0,41, + 1,114,190,0,0,0,41,7,114,119,0,0,0,114,188,0, + 0,0,114,139,0,0,0,114,44,0,0,0,90,4,115,109, + 115,108,114,202,0,0,0,114,140,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,58,1,0,0, + 128,5,0,0,115,8,0,0,0,0,1,10,1,8,1,2, + 255,122,20,70,105,108,101,70,105,110,100,101,114,46,95,103, + 101,116,95,115,112,101,99,78,99,3,0,0,0,0,0,0, + 0,0,0,0,0,14,0,0,0,8,0,0,0,67,0,0, + 0,115,102,1,0,0,100,1,125,3,124,1,160,0,100,2, + 161,1,100,3,25,0,125,4,122,24,116,1,124,0,106,2, + 112,34,116,3,160,4,161,0,131,1,106,5,125,5,87,0, + 110,24,4,0,116,6,107,10,114,66,1,0,1,0,1,0, + 100,4,125,5,89,0,110,2,88,0,124,5,124,0,106,7, + 107,3,114,92,124,0,160,8,161,0,1,0,124,5,124,0, + 95,7,116,9,131,0,114,114,124,0,106,10,125,6,124,4, + 160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4, + 125,7,124,7,124,6,107,6,114,218,116,13,124,0,106,2, + 124,4,131,2,125,8,124,0,106,14,68,0,93,58,92,2, + 125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8, + 124,11,131,2,125,12,116,15,124,12,131,1,114,208,124,0, + 160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5, + 2,0,1,0,83,0,113,150,116,17,124,8,131,1,125,3, + 124,0,106,14,68,0,93,86,92,2,125,9,125,10,116,13, + 124,0,106,2,124,4,124,9,23,0,131,2,125,12,116,18, + 106,19,100,6,124,12,100,3,100,7,141,3,1,0,124,7, + 124,9,23,0,124,6,107,6,144,1,114,54,116,15,124,12, + 131,1,144,1,114,54,124,0,160,16,124,10,124,1,124,12, + 100,8,124,2,161,5,2,0,1,0,83,0,113,224,124,3, + 144,1,114,98,116,18,160,19,100,9,124,8,161,2,1,0, + 116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,1, + 124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,111, + 84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112, + 101,99,32,102,111,114,32,116,104,101,32,115,112,101,99,105, + 102,105,101,100,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,104, + 101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,44, + 32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,70, + 114,71,0,0,0,114,28,0,0,0,114,105,0,0,0,114, + 209,0,0,0,122,9,116,114,121,105,110,103,32,123,125,41, + 1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,112, + 111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,99, + 101,32,102,111,114,32,123,125,41,22,114,41,0,0,0,114, + 49,0,0,0,114,44,0,0,0,114,2,0,0,0,114,55, + 0,0,0,114,10,1,0,0,114,50,0,0,0,114,62,1, + 0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,114, + 7,0,0,0,114,65,1,0,0,114,106,0,0,0,114,64, + 1,0,0,114,38,0,0,0,114,61,1,0,0,114,54,0, + 0,0,114,58,1,0,0,114,56,0,0,0,114,134,0,0, + 0,114,149,0,0,0,114,183,0,0,0,114,178,0,0,0, + 41,14,114,119,0,0,0,114,139,0,0,0,114,202,0,0, + 0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90, + 11,116,97,105,108,95,109,111,100,117,108,101,114,169,0,0, + 0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95, + 109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116, + 104,114,17,1,0,0,114,188,0,0,0,90,13,105,110,105, + 116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108, + 95,112,97,116,104,114,187,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,203,0,0,0,133,5, + 0,0,115,74,0,0,0,0,5,4,1,14,1,2,1,24, + 1,14,1,10,1,10,1,8,1,6,2,6,1,6,1,10, + 2,6,1,4,2,8,1,12,1,14,1,8,1,10,1,8, + 1,26,4,8,2,14,1,16,1,16,1,14,1,10,1,10, + 1,2,0,2,255,10,2,6,1,12,1,12,1,8,1,4, + 1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0, + 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0, + 115,190,0,0,0,124,0,106,0,125,1,122,22,116,1,160, + 2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,87, + 0,110,30,4,0,116,4,116,5,116,6,102,3,107,10,114, + 58,1,0,1,0,1,0,103,0,125,2,89,0,110,2,88, + 0,116,7,106,8,160,9,100,1,161,1,115,84,116,10,124, + 2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,124, + 2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,92, + 3,125,5,125,6,125,7,124,6,114,136,100,3,160,13,124, + 5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,125, + 8,124,3,160,15,124,8,161,1,1,0,113,94,124,3,124, + 0,95,11,116,7,106,8,160,9,116,16,161,1,114,186,100, + 4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,100, + 6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,32, + 99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105, + 97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112, + 97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115, + 32,100,105,114,101,99,116,111,114,121,46,114,0,0,0,0, + 114,71,0,0,0,114,61,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,83, - 0,0,0,115,22,0,0,0,104,0,124,0,93,14,125,1, - 100,0,124,1,155,0,157,2,146,2,113,4,83,0,41,1, - 114,74,0,0,0,114,3,0,0,0,41,2,114,32,0,0, - 0,218,1,115,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,68,1,0,0,51,6,0,0,115,4,0,0, - 0,6,0,2,0,122,25,95,115,101,116,117,112,46,60,108, - 111,99,97,108,115,62,46,60,115,101,116,99,111,109,112,62, - 90,7,95,116,104,114,101,97,100,90,8,95,119,101,97,107, - 114,101,102,90,6,119,105,110,114,101,103,114,192,0,0,0, - 114,7,0,0,0,122,4,46,112,121,119,122,6,95,100,46, - 112,121,100,84,78,41,19,114,134,0,0,0,114,8,0,0, - 0,114,163,0,0,0,114,31,1,0,0,114,125,0,0,0, - 90,18,95,98,117,105,108,116,105,110,95,102,114,111,109,95, - 110,97,109,101,114,129,0,0,0,218,3,97,108,108,114,23, - 0,0,0,114,118,0,0,0,114,36,0,0,0,114,13,0, - 0,0,114,21,1,0,0,114,167,0,0,0,114,80,1,0, - 0,114,102,0,0,0,114,186,0,0,0,114,191,0,0,0, - 114,195,0,0,0,41,12,218,17,95,98,111,111,116,115,116, - 114,97,112,95,109,111,100,117,108,101,90,11,115,101,108,102, - 95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110, - 95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109, - 111,100,117,108,101,90,10,111,115,95,100,101,116,97,105,108, - 115,90,10,98,117,105,108,116,105,110,95,111,115,114,31,0, - 0,0,114,35,0,0,0,90,9,111,115,95,109,111,100,117, - 108,101,90,13,116,104,114,101,97,100,95,109,111,100,117,108, - 101,90,14,119,101,97,107,114,101,102,95,109,111,100,117,108, - 101,90,13,119,105,110,114,101,103,95,109,111,100,117,108,101, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 6,95,115,101,116,117,112,10,6,0,0,115,78,0,0,0, - 0,8,4,1,6,1,6,3,10,1,8,1,10,1,12,2, - 10,1,14,3,22,1,12,2,22,1,8,1,10,1,10,1, - 6,2,2,1,10,1,10,1,14,1,12,2,8,1,12,1, - 12,1,18,1,22,3,10,1,12,3,10,1,12,3,10,1, - 10,1,12,3,14,1,14,1,10,1,10,1,10,1,114,87, - 1,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0, - 0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116, - 2,106,3,160,4,116,5,106,6,124,1,142,0,103,1,161, - 1,1,0,116,2,106,7,160,8,116,9,161,1,1,0,100, - 1,83,0,41,2,122,41,73,110,115,116,97,108,108,32,116, - 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109, - 112,111,114,116,32,99,111,109,112,111,110,101,110,116,115,46, - 78,41,10,114,87,1,0,0,114,184,0,0,0,114,8,0, - 0,0,114,51,1,0,0,114,167,0,0,0,114,59,1,0, - 0,114,74,1,0,0,218,9,109,101,116,97,95,112,97,116, - 104,114,186,0,0,0,114,45,1,0,0,41,2,114,86,1, - 0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111, - 97,100,101,114,115,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,8,95,105,110,115,116,97,108,108,75,6, - 0,0,115,8,0,0,0,0,2,8,1,6,1,20,1,114, - 89,1,0,0,41,63,114,127,0,0,0,114,12,0,0,0, - 90,37,95,67,65,83,69,95,73,78,83,69,78,83,73,84, - 73,86,69,95,80,76,65,84,70,79,82,77,83,95,66,89, - 84,69,83,95,75,69,89,114,11,0,0,0,114,13,0,0, - 0,114,20,0,0,0,114,27,0,0,0,114,29,0,0,0, - 114,38,0,0,0,114,47,0,0,0,114,49,0,0,0,114, - 53,0,0,0,114,54,0,0,0,114,56,0,0,0,114,59, - 0,0,0,114,69,0,0,0,218,4,116,121,112,101,218,8, - 95,95,99,111,100,101,95,95,114,162,0,0,0,114,18,0, - 0,0,114,148,0,0,0,114,17,0,0,0,114,24,0,0, - 0,114,236,0,0,0,114,92,0,0,0,114,88,0,0,0, - 114,102,0,0,0,114,89,0,0,0,90,23,68,69,66,85, - 71,95,66,89,84,69,67,79,68,69,95,83,85,70,70,73, - 88,69,83,90,27,79,80,84,73,77,73,90,69,68,95,66, - 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83, - 114,98,0,0,0,114,103,0,0,0,114,109,0,0,0,114, - 113,0,0,0,114,115,0,0,0,114,136,0,0,0,114,143, - 0,0,0,114,152,0,0,0,114,156,0,0,0,114,158,0, - 0,0,114,165,0,0,0,114,170,0,0,0,114,171,0,0, - 0,114,176,0,0,0,218,6,111,98,106,101,99,116,114,185, - 0,0,0,114,190,0,0,0,114,191,0,0,0,114,208,0, - 0,0,114,221,0,0,0,114,239,0,0,0,114,8,1,0, - 0,114,14,1,0,0,114,21,1,0,0,114,15,1,0,0, - 114,22,1,0,0,114,43,1,0,0,114,45,1,0,0,114, - 59,1,0,0,114,79,1,0,0,114,184,0,0,0,114,87, - 1,0,0,114,89,1,0,0,114,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,8,60,109, - 111,100,117,108,101,62,1,0,0,0,115,126,0,0,0,4, - 22,4,1,4,1,2,1,2,255,4,4,8,17,8,5,8, - 5,8,6,8,6,8,12,8,10,8,9,8,5,8,7,8, - 9,12,22,10,127,0,8,16,1,12,2,4,1,4,2,6, - 2,6,2,8,2,18,71,8,40,8,19,8,12,8,12,8, - 28,8,17,8,33,8,28,8,24,16,13,14,10,12,11,8, - 14,6,3,6,1,2,255,12,68,14,64,14,29,16,127,0, - 17,14,68,18,45,18,26,4,3,18,53,14,63,14,42,14, - 127,0,7,14,127,0,22,12,23,8,11,8,65, + 0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,1, + 124,1,160,0,161,0,146,2,113,4,83,0,114,3,0,0, + 0,41,1,114,106,0,0,0,41,2,114,32,0,0,0,90, + 2,102,110,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,9,60,115,101,116,99,111,109,112,62,210,5,0, + 0,115,4,0,0,0,6,0,2,0,122,41,70,105,108,101, + 70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,99, + 104,101,46,60,108,111,99,97,108,115,62,46,60,115,101,116, + 99,111,109,112,62,78,41,18,114,44,0,0,0,114,2,0, + 0,0,114,7,1,0,0,114,55,0,0,0,114,3,1,0, + 0,218,15,80,101,114,109,105,115,115,105,111,110,69,114,114, + 111,114,218,18,78,111,116,65,68,105,114,101,99,116,111,114, + 121,69,114,114,111,114,114,8,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,63,1,0,0,114,64,1,0,0,114, + 101,0,0,0,114,62,0,0,0,114,106,0,0,0,218,3, + 97,100,100,114,11,0,0,0,114,65,1,0,0,41,9,114, + 119,0,0,0,114,44,0,0,0,114,8,1,0,0,90,21, + 108,111,119,101,114,95,115,117,102,102,105,120,95,99,111,110, + 116,101,110,116,115,114,41,1,0,0,114,117,0,0,0,114, + 29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,110, + 97,109,101,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,67,1,0,0,181,5,0,0,115,34,0,0,0, + 0,2,6,1,2,1,22,1,20,3,10,3,12,1,12,7, + 6,1,8,1,16,1,4,1,18,2,4,1,12,1,6,1, + 12,1,122,22,70,105,108,101,70,105,110,100,101,114,46,95, + 102,105,108,108,95,99,97,99,104,101,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,7, + 0,0,0,115,18,0,0,0,135,0,135,1,102,2,100,1, + 100,2,132,8,125,2,124,2,83,0,41,3,97,20,1,0, + 0,65,32,99,108,97,115,115,32,109,101,116,104,111,100,32, + 119,104,105,99,104,32,114,101,116,117,114,110,115,32,97,32, + 99,108,111,115,117,114,101,32,116,111,32,117,115,101,32,111, + 110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,10, + 32,32,32,32,32,32,32,32,119,104,105,99,104,32,119,105, + 108,108,32,114,101,116,117,114,110,32,97,110,32,105,110,115, + 116,97,110,99,101,32,117,115,105,110,103,32,116,104,101,32, + 115,112,101,99,105,102,105,101,100,32,108,111,97,100,101,114, + 115,32,97,110,100,32,116,104,101,32,112,97,116,104,10,32, + 32,32,32,32,32,32,32,99,97,108,108,101,100,32,111,110, + 32,116,104,101,32,99,108,111,115,117,114,101,46,10,10,32, + 32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97, + 116,104,32,99,97,108,108,101,100,32,111,110,32,116,104,101, + 32,99,108,111,115,117,114,101,32,105,115,32,110,111,116,32, + 97,32,100,105,114,101,99,116,111,114,121,44,32,73,109,112, + 111,114,116,69,114,114,111,114,32,105,115,10,32,32,32,32, + 32,32,32,32,114,97,105,115,101,100,46,10,10,32,32,32, + 32,32,32,32,32,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,19,0,0,0,115,34, + 0,0,0,116,0,124,0,131,1,115,20,116,1,100,1,124, + 0,100,2,141,2,130,1,136,0,124,0,102,1,136,1,158, + 2,142,0,83,0,41,3,122,45,80,97,116,104,32,104,111, + 111,107,32,102,111,114,32,105,109,112,111,114,116,108,105,98, + 46,109,97,99,104,105,110,101,114,121,46,70,105,108,101,70, + 105,110,100,101,114,46,122,30,111,110,108,121,32,100,105,114, + 101,99,116,111,114,105,101,115,32,97,114,101,32,115,117,112, + 112,111,114,116,101,100,114,48,0,0,0,41,2,114,56,0, + 0,0,114,118,0,0,0,114,48,0,0,0,169,2,114,193, + 0,0,0,114,66,1,0,0,114,3,0,0,0,114,6,0, + 0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,111, + 114,95,70,105,108,101,70,105,110,100,101,114,222,5,0,0, + 115,6,0,0,0,0,2,8,1,12,1,122,54,70,105,108, + 101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,111, + 107,46,60,108,111,99,97,108,115,62,46,112,97,116,104,95, + 104,111,111,107,95,102,111,114,95,70,105,108,101,70,105,110, + 100,101,114,114,3,0,0,0,41,3,114,193,0,0,0,114, + 66,1,0,0,114,73,1,0,0,114,3,0,0,0,114,72, + 1,0,0,114,6,0,0,0,218,9,112,97,116,104,95,104, + 111,111,107,212,5,0,0,115,4,0,0,0,0,10,14,6, + 122,20,70,105,108,101,70,105,110,100,101,114,46,112,97,116, + 104,95,104,111,111,107,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 12,0,0,0,100,1,160,0,124,0,106,1,161,1,83,0, + 41,2,78,122,16,70,105,108,101,70,105,110,100,101,114,40, + 123,33,114,125,41,41,2,114,62,0,0,0,114,44,0,0, + 0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,39,1,0,0,230,5,0,0,115,2, + 0,0,0,0,1,122,19,70,105,108,101,70,105,110,100,101, + 114,46,95,95,114,101,112,114,95,95,41,1,78,41,15,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, + 0,0,0,114,209,0,0,0,114,46,1,0,0,114,143,0, + 0,0,114,206,0,0,0,114,137,0,0,0,114,58,1,0, + 0,114,203,0,0,0,114,67,1,0,0,114,207,0,0,0, + 114,74,1,0,0,114,39,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,59, + 1,0,0,87,5,0,0,115,22,0,0,0,8,2,4,7, + 8,14,8,4,4,2,8,12,8,5,10,48,8,31,2,1, + 10,17,114,59,1,0,0,99,4,0,0,0,0,0,0,0, + 0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,0, + 115,146,0,0,0,124,0,160,0,100,1,161,1,125,4,124, + 0,160,0,100,2,161,1,125,5,124,4,115,66,124,5,114, + 36,124,5,106,1,125,4,110,30,124,2,124,3,107,2,114, + 56,116,2,124,1,124,2,131,2,125,4,110,10,116,3,124, + 1,124,2,131,2,125,4,124,5,115,84,116,4,124,1,124, + 2,124,4,100,3,141,3,125,5,122,36,124,5,124,0,100, + 2,60,0,124,4,124,0,100,1,60,0,124,2,124,0,100, + 4,60,0,124,3,124,0,100,5,60,0,87,0,110,20,4, + 0,116,5,107,10,114,140,1,0,1,0,1,0,89,0,110, + 2,88,0,100,0,83,0,41,6,78,218,10,95,95,108,111, + 97,100,101,114,95,95,218,8,95,95,115,112,101,99,95,95, + 114,60,1,0,0,90,8,95,95,102,105,108,101,95,95,90, + 10,95,95,99,97,99,104,101,100,95,95,41,6,218,3,103, + 101,116,114,140,0,0,0,114,15,1,0,0,114,9,1,0, + 0,114,190,0,0,0,218,9,69,120,99,101,112,116,105,111, + 110,41,6,90,2,110,115,114,117,0,0,0,90,8,112,97, + 116,104,110,97,109,101,90,9,99,112,97,116,104,110,97,109, + 101,114,140,0,0,0,114,187,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120, + 95,117,112,95,109,111,100,117,108,101,236,5,0,0,115,34, + 0,0,0,0,2,10,1,10,1,4,1,4,1,8,1,8, + 1,12,2,10,1,4,1,14,1,2,1,8,1,8,1,8, + 1,12,1,14,2,114,79,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,0, + 102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,6, + 102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,1, + 122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116, + 32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109, + 111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10, + 32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115, + 32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114, + 44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32, + 32,41,7,114,252,0,0,0,114,163,0,0,0,218,18,101, + 120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101, + 115,114,9,1,0,0,114,102,0,0,0,114,15,1,0,0, + 114,89,0,0,0,41,3,90,10,101,120,116,101,110,115,105, + 111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116, + 101,99,111,100,101,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,184,0,0,0,3,6,0,0,115,8,0, + 0,0,0,5,12,1,8,1,8,1,114,184,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0, + 9,0,0,0,67,0,0,0,115,178,1,0,0,124,0,97, + 0,116,0,106,1,97,1,116,0,106,2,97,2,116,1,106, + 3,116,4,25,0,125,1,100,1,68,0,93,48,125,2,124, + 2,116,1,106,3,107,7,114,56,116,0,160,5,124,2,161, + 1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116, + 6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100, + 3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102, + 2,125,4,124,4,68,0,93,110,92,2,125,5,125,6,116, + 7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115, + 136,116,8,130,1,124,6,100,8,25,0,125,7,124,5,116, + 1,106,3,107,6,114,170,116,1,106,3,124,5,25,0,125, + 8,1,0,113,226,113,106,122,20,116,0,160,5,124,5,161, + 1,125,8,87,0,1,0,113,226,87,0,113,106,4,0,116, + 9,107,10,114,214,1,0,1,0,1,0,89,0,113,106,89, + 0,113,106,88,0,113,106,116,9,100,9,131,1,130,1,116, + 6,124,1,100,10,124,8,131,3,1,0,116,6,124,1,100, + 11,124,7,131,3,1,0,116,6,124,1,100,12,100,13,160, + 10,124,6,161,1,131,3,1,0,116,6,124,1,100,14,100, + 15,100,16,132,0,124,6,68,0,131,1,131,3,1,0,116, + 0,160,5,100,17,161,1,125,9,116,6,124,1,100,17,124, + 9,131,3,1,0,116,0,160,5,100,18,161,1,125,10,116, + 6,124,1,100,18,124,10,131,3,1,0,124,5,100,4,107, + 2,144,1,114,110,116,0,160,5,100,19,161,1,125,11,116, + 6,124,1,100,20,124,11,131,3,1,0,116,6,124,1,100, + 21,116,11,131,0,131,3,1,0,116,12,160,13,116,2,160, + 14,161,0,161,1,1,0,124,5,100,4,107,2,144,1,114, + 174,116,15,160,16,100,22,161,1,1,0,100,23,116,12,107, + 6,144,1,114,174,100,24,116,17,95,18,100,25,83,0,41, + 26,122,205,83,101,116,117,112,32,116,104,101,32,112,97,116, + 104,45,98,97,115,101,100,32,105,109,112,111,114,116,101,114, + 115,32,102,111,114,32,105,109,112,111,114,116,108,105,98,32, + 98,121,32,105,109,112,111,114,116,105,110,103,32,110,101,101, + 100,101,100,10,32,32,32,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,115,32,97,110,100,32,105,110,106, + 101,99,116,105,110,103,32,116,104,101,109,32,105,110,116,111, + 32,116,104,101,32,103,108,111,98,97,108,32,110,97,109,101, + 115,112,97,99,101,46,10,10,32,32,32,32,79,116,104,101, + 114,32,99,111,109,112,111,110,101,110,116,115,32,97,114,101, + 32,101,120,116,114,97,99,116,101,100,32,102,114,111,109,32, + 116,104,101,32,99,111,114,101,32,98,111,111,116,115,116,114, + 97,112,32,109,111,100,117,108,101,46,10,10,32,32,32,32, + 41,4,114,64,0,0,0,114,75,0,0,0,218,8,98,117, + 105,108,116,105,110,115,114,160,0,0,0,90,5,112,111,115, + 105,120,250,1,47,90,2,110,116,250,1,92,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,115,0,0,0,115,26,0,0,0,124,0,93,18,125,1, + 116,0,124,1,131,1,100,0,107,2,86,0,1,0,113,2, + 100,1,83,0,41,2,114,39,0,0,0,78,41,1,114,22, + 0,0,0,41,2,114,32,0,0,0,114,95,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,19, + 1,0,0,39,6,0,0,115,4,0,0,0,4,0,2,0, + 122,25,95,115,101,116,117,112,46,60,108,111,99,97,108,115, + 62,46,60,103,101,110,101,120,112,114,62,114,73,0,0,0, + 122,30,105,109,112,111,114,116,108,105,98,32,114,101,113,117, + 105,114,101,115,32,112,111,115,105,120,32,111,114,32,110,116, + 114,2,0,0,0,114,35,0,0,0,114,31,0,0,0,114, + 40,0,0,0,114,58,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,83,0, + 0,0,115,22,0,0,0,104,0,124,0,93,14,125,1,100, + 0,124,1,155,0,157,2,146,2,113,4,83,0,41,1,114, + 74,0,0,0,114,3,0,0,0,41,2,114,32,0,0,0, + 218,1,115,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,68,1,0,0,55,6,0,0,115,4,0,0,0, + 6,0,2,0,122,25,95,115,101,116,117,112,46,60,108,111, + 99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,90, + 7,95,116,104,114,101,97,100,90,8,95,119,101,97,107,114, + 101,102,90,6,119,105,110,114,101,103,114,192,0,0,0,114, + 7,0,0,0,122,4,46,112,121,119,122,6,95,100,46,112, + 121,100,84,78,41,19,114,134,0,0,0,114,8,0,0,0, + 114,163,0,0,0,114,31,1,0,0,114,125,0,0,0,90, + 18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,110, + 97,109,101,114,129,0,0,0,218,3,97,108,108,114,23,0, + 0,0,114,118,0,0,0,114,36,0,0,0,114,13,0,0, + 0,114,21,1,0,0,114,167,0,0,0,114,80,1,0,0, + 114,102,0,0,0,114,186,0,0,0,114,191,0,0,0,114, + 195,0,0,0,41,12,218,17,95,98,111,111,116,115,116,114, + 97,112,95,109,111,100,117,108,101,90,11,115,101,108,102,95, + 109,111,100,117,108,101,90,12,98,117,105,108,116,105,110,95, + 110,97,109,101,90,14,98,117,105,108,116,105,110,95,109,111, + 100,117,108,101,90,10,111,115,95,100,101,116,97,105,108,115, + 90,10,98,117,105,108,116,105,110,95,111,115,114,31,0,0, + 0,114,35,0,0,0,90,9,111,115,95,109,111,100,117,108, + 101,90,13,116,104,114,101,97,100,95,109,111,100,117,108,101, + 90,14,119,101,97,107,114,101,102,95,109,111,100,117,108,101, + 90,13,119,105,110,114,101,103,95,109,111,100,117,108,101,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,6, + 95,115,101,116,117,112,14,6,0,0,115,78,0,0,0,0, + 8,4,1,6,1,6,3,10,1,8,1,10,1,12,2,10, + 1,14,3,22,1,12,2,22,1,8,1,10,1,10,1,6, + 2,2,1,10,1,10,1,14,1,12,2,8,1,12,1,12, + 1,18,1,22,3,10,1,12,3,10,1,12,3,10,1,10, + 1,12,3,14,1,14,1,10,1,10,1,10,1,114,87,1, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,0, + 116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,2, + 106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,1, + 1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,1, + 83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,104, + 101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, + 111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,78, + 41,10,114,87,1,0,0,114,184,0,0,0,114,8,0,0, + 0,114,51,1,0,0,114,167,0,0,0,114,59,1,0,0, + 114,74,1,0,0,218,9,109,101,116,97,95,112,97,116,104, + 114,186,0,0,0,114,45,1,0,0,41,2,114,86,1,0, + 0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,97, + 100,101,114,115,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,8,95,105,110,115,116,97,108,108,79,6,0, + 0,115,8,0,0,0,0,2,8,1,6,1,20,1,114,89, + 1,0,0,41,63,114,127,0,0,0,114,12,0,0,0,90, + 37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, + 86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84, + 69,83,95,75,69,89,114,11,0,0,0,114,13,0,0,0, + 114,20,0,0,0,114,27,0,0,0,114,29,0,0,0,114, + 38,0,0,0,114,47,0,0,0,114,49,0,0,0,114,53, + 0,0,0,114,54,0,0,0,114,56,0,0,0,114,59,0, + 0,0,114,69,0,0,0,218,4,116,121,112,101,218,8,95, + 95,99,111,100,101,95,95,114,162,0,0,0,114,18,0,0, + 0,114,148,0,0,0,114,17,0,0,0,114,24,0,0,0, + 114,236,0,0,0,114,92,0,0,0,114,88,0,0,0,114, + 102,0,0,0,114,89,0,0,0,90,23,68,69,66,85,71, + 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, + 69,83,90,27,79,80,84,73,77,73,90,69,68,95,66,89, + 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,114, + 98,0,0,0,114,103,0,0,0,114,109,0,0,0,114,113, + 0,0,0,114,115,0,0,0,114,136,0,0,0,114,143,0, + 0,0,114,152,0,0,0,114,156,0,0,0,114,158,0,0, + 0,114,165,0,0,0,114,170,0,0,0,114,171,0,0,0, + 114,176,0,0,0,218,6,111,98,106,101,99,116,114,185,0, + 0,0,114,190,0,0,0,114,191,0,0,0,114,208,0,0, + 0,114,221,0,0,0,114,239,0,0,0,114,9,1,0,0, + 114,15,1,0,0,114,21,1,0,0,114,252,0,0,0,114, + 22,1,0,0,114,43,1,0,0,114,45,1,0,0,114,59, + 1,0,0,114,79,1,0,0,114,184,0,0,0,114,87,1, + 0,0,114,89,1,0,0,114,3,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,8,60,109,111, + 100,117,108,101,62,1,0,0,0,115,126,0,0,0,4,22, + 4,1,4,1,2,1,2,255,4,4,8,17,8,5,8,5, + 8,6,8,6,8,12,8,10,8,9,8,5,8,7,8,9, + 12,22,10,127,0,8,16,1,12,2,4,1,4,2,6,2, + 6,2,8,2,18,71,8,40,8,19,8,12,8,12,8,28, + 8,17,8,33,8,28,8,24,16,13,14,10,12,11,8,14, + 6,3,6,1,2,255,12,68,14,64,14,29,16,127,0,17, + 14,72,18,45,18,26,4,3,18,53,14,63,14,42,14,127, + 0,7,14,127,0,22,12,23,8,11,8,65, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index b79689449935..cbb3d909a10b 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -522,563 +522,562 @@ const unsigned char _Py_M__zipimport[] = { 0,0,0,114,35,0,0,0,65,1,0,0,115,12,0,0, 0,0,1,10,1,14,1,8,1,10,1,10,1,114,35,0, 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,26, - 0,0,0,9,0,0,0,67,0,0,0,115,254,4,0,0, - 122,16,116,0,160,1,124,0,100,1,161,2,125,1,87,0, - 110,38,4,0,116,2,107,10,114,54,1,0,1,0,1,0, - 116,3,100,2,124,0,155,2,157,2,124,0,100,3,141,2, - 130,1,89,0,110,2,88,0,124,1,144,4,143,168,1,0, - 122,36,124,1,160,4,116,5,11,0,100,4,161,2,1,0, - 124,1,160,6,161,0,125,2,124,1,160,7,116,5,161,1, - 125,3,87,0,110,38,4,0,116,2,107,10,114,138,1,0, - 1,0,1,0,116,3,100,5,124,0,155,2,157,2,124,0, - 100,3,141,2,130,1,89,0,110,2,88,0,116,8,124,3, - 131,1,116,5,107,3,114,170,116,3,100,5,124,0,155,2, - 157,2,124,0,100,3,141,2,130,1,124,3,100,0,100,6, - 133,2,25,0,116,9,107,3,144,1,114,180,122,24,124,1, - 160,4,100,7,100,4,161,2,1,0,124,1,160,6,161,0, - 125,4,87,0,110,38,4,0,116,2,107,10,114,250,1,0, - 1,0,1,0,116,3,100,5,124,0,155,2,157,2,124,0, - 100,3,141,2,130,1,89,0,110,2,88,0,116,10,124,4, - 116,11,24,0,116,5,24,0,100,7,131,2,125,5,122,22, - 124,1,160,4,124,5,161,1,1,0,124,1,160,7,161,0, - 125,6,87,0,110,40,4,0,116,2,107,10,144,1,114,76, - 1,0,1,0,1,0,116,3,100,5,124,0,155,2,157,2, - 124,0,100,3,141,2,130,1,89,0,110,2,88,0,124,6, - 160,12,116,9,161,1,125,7,124,7,100,7,107,0,144,1, - 114,116,116,3,100,8,124,0,155,2,157,2,124,0,100,3, - 141,2,130,1,124,6,124,7,124,7,116,5,23,0,133,2, - 25,0,125,3,116,8,124,3,131,1,116,5,107,3,144,1, - 114,164,116,3,100,9,124,0,155,2,157,2,124,0,100,3, - 141,2,130,1,124,4,116,8,124,6,131,1,24,0,124,7, - 23,0,125,2,116,13,124,3,100,10,100,11,133,2,25,0, - 131,1,125,8,116,13,124,3,100,11,100,12,133,2,25,0, - 131,1,125,9,124,2,124,8,107,0,144,1,114,240,116,3, - 100,13,124,0,155,2,157,2,124,0,100,3,141,2,130,1, - 124,2,124,9,107,0,144,2,114,12,116,3,100,14,124,0, - 155,2,157,2,124,0,100,3,141,2,130,1,124,2,124,8, - 56,0,125,2,124,2,124,9,24,0,125,10,124,10,100,7, - 107,0,144,2,114,56,116,3,100,15,124,0,155,2,157,2, - 124,0,100,3,141,2,130,1,105,0,125,11,100,7,125,12, - 122,14,124,1,160,4,124,2,161,1,1,0,87,0,110,40, - 4,0,116,2,107,10,144,2,114,118,1,0,1,0,1,0, - 116,3,100,5,124,0,155,2,157,2,124,0,100,3,141,2, - 130,1,89,0,110,2,88,0,124,1,160,7,100,16,161,1, - 125,3,116,8,124,3,131,1,100,6,107,0,144,2,114,152, - 116,14,100,17,131,1,130,1,124,3,100,0,100,6,133,2, - 25,0,100,18,107,3,144,2,114,174,144,4,113,226,116,8, - 124,3,131,1,100,16,107,3,144,2,114,196,116,14,100,17, - 131,1,130,1,116,15,124,3,100,19,100,20,133,2,25,0, - 131,1,125,13,116,15,124,3,100,20,100,10,133,2,25,0, - 131,1,125,14,116,15,124,3,100,10,100,21,133,2,25,0, - 131,1,125,15,116,15,124,3,100,21,100,11,133,2,25,0, - 131,1,125,16,116,13,124,3,100,11,100,12,133,2,25,0, - 131,1,125,17,116,13,124,3,100,12,100,22,133,2,25,0, - 131,1,125,18,116,13,124,3,100,22,100,23,133,2,25,0, - 131,1,125,4,116,15,124,3,100,23,100,24,133,2,25,0, - 131,1,125,19,116,15,124,3,100,24,100,25,133,2,25,0, - 131,1,125,20,116,15,124,3,100,25,100,26,133,2,25,0, - 131,1,125,21,116,13,124,3,100,27,100,16,133,2,25,0, - 131,1,125,22,124,19,124,20,23,0,124,21,23,0,125,8, - 124,22,124,9,107,4,144,3,114,156,116,3,100,28,124,0, - 155,2,157,2,124,0,100,3,141,2,130,1,124,22,124,10, - 55,0,125,22,122,14,124,1,160,7,124,19,161,1,125,23, - 87,0,110,40,4,0,116,2,107,10,144,3,114,218,1,0, - 1,0,1,0,116,3,100,5,124,0,155,2,157,2,124,0, - 100,3,141,2,130,1,89,0,110,2,88,0,116,8,124,23, - 131,1,124,19,107,3,144,3,114,252,116,3,100,5,124,0, - 155,2,157,2,124,0,100,3,141,2,130,1,122,50,116,8, - 124,1,160,7,124,8,124,19,24,0,161,1,131,1,124,8, - 124,19,24,0,107,3,144,4,114,44,116,3,100,5,124,0, - 155,2,157,2,124,0,100,3,141,2,130,1,87,0,110,40, - 4,0,116,2,107,10,144,4,114,86,1,0,1,0,1,0, - 116,3,100,5,124,0,155,2,157,2,124,0,100,3,141,2, - 130,1,89,0,110,2,88,0,124,13,100,29,64,0,144,4, - 114,108,124,23,160,16,161,0,125,23,110,54,122,14,124,23, - 160,16,100,30,161,1,125,23,87,0,110,38,4,0,116,17, - 107,10,144,4,114,160,1,0,1,0,1,0,124,23,160,16, - 100,31,161,1,160,18,116,19,161,1,125,23,89,0,110,2, - 88,0,124,23,160,20,100,32,116,21,161,2,125,23,116,22, - 160,23,124,0,124,23,161,2,125,24,124,24,124,14,124,18, - 124,4,124,22,124,15,124,16,124,17,102,8,125,25,124,25, - 124,11,124,23,60,0,124,12,100,33,55,0,125,12,144,2, - 113,120,87,0,53,0,81,0,82,0,88,0,116,24,160,25, - 100,34,124,12,124,0,161,3,1,0,124,11,83,0,41,35, - 78,218,2,114,98,122,21,99,97,110,39,116,32,111,112,101, - 110,32,90,105,112,32,102,105,108,101,58,32,114,12,0,0, - 0,114,86,0,0,0,250,21,99,97,110,39,116,32,114,101, - 97,100,32,90,105,112,32,102,105,108,101,58,32,233,4,0, - 0,0,114,0,0,0,0,122,16,110,111,116,32,97,32,90, - 105,112,32,102,105,108,101,58,32,122,18,99,111,114,114,117, - 112,116,32,90,105,112,32,102,105,108,101,58,32,233,12,0, - 0,0,233,16,0,0,0,233,20,0,0,0,122,28,98,97, - 100,32,99,101,110,116,114,97,108,32,100,105,114,101,99,116, - 111,114,121,32,115,105,122,101,58,32,122,30,98,97,100,32, - 99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114, - 121,32,111,102,102,115,101,116,58,32,122,38,98,97,100,32, - 99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114, - 121,32,115,105,122,101,32,111,114,32,111,102,102,115,101,116, - 58,32,233,46,0,0,0,250,27,69,79,70,32,114,101,97, - 100,32,119,104,101,114,101,32,110,111,116,32,101,120,112,101, - 99,116,101,100,115,4,0,0,0,80,75,1,2,233,8,0, - 0,0,233,10,0,0,0,233,14,0,0,0,233,24,0,0, - 0,233,28,0,0,0,233,30,0,0,0,233,32,0,0,0, - 233,34,0,0,0,233,42,0,0,0,122,25,98,97,100,32, - 108,111,99,97,108,32,104,101,97,100,101,114,32,111,102,102, - 115,101,116,58,32,105,0,8,0,0,218,5,97,115,99,105, - 105,90,6,108,97,116,105,110,49,250,1,47,114,5,0,0, - 0,122,33,122,105,112,105,109,112,111,114,116,58,32,102,111, - 117,110,100,32,123,125,32,110,97,109,101,115,32,105,110,32, - 123,33,114,125,41,26,218,3,95,105,111,218,4,111,112,101, - 110,114,22,0,0,0,114,3,0,0,0,218,4,115,101,101, - 107,218,20,69,78,68,95,67,69,78,84,82,65,76,95,68, - 73,82,95,83,73,90,69,90,4,116,101,108,108,218,4,114, - 101,97,100,114,51,0,0,0,218,18,83,84,82,73,78,71, - 95,69,78,68,95,65,82,67,72,73,86,69,218,3,109,97, - 120,218,15,77,65,88,95,67,79,77,77,69,78,84,95,76, - 69,78,218,5,114,102,105,110,100,114,2,0,0,0,218,8, - 69,79,70,69,114,114,111,114,114,1,0,0,0,114,62,0, - 0,0,218,18,85,110,105,99,111,100,101,68,101,99,111,100, - 101,69,114,114,111,114,218,9,116,114,97,110,115,108,97,116, - 101,218,11,99,112,52,51,55,95,116,97,98,108,101,114,19, - 0,0,0,114,20,0,0,0,114,21,0,0,0,114,30,0, - 0,0,114,76,0,0,0,114,77,0,0,0,41,26,114,29, - 0,0,0,218,2,102,112,90,15,104,101,97,100,101,114,95, - 112,111,115,105,116,105,111,110,218,6,98,117,102,102,101,114, - 218,9,102,105,108,101,95,115,105,122,101,90,17,109,97,120, - 95,99,111,109,109,101,110,116,95,115,116,97,114,116,218,4, - 100,97,116,97,90,3,112,111,115,218,11,104,101,97,100,101, - 114,95,115,105,122,101,90,13,104,101,97,100,101,114,95,111, - 102,102,115,101,116,90,10,97,114,99,95,111,102,102,115,101, - 116,114,33,0,0,0,218,5,99,111,117,110,116,218,5,102, - 108,97,103,115,218,8,99,111,109,112,114,101,115,115,218,4, - 116,105,109,101,218,4,100,97,116,101,218,3,99,114,99,218, - 9,100,97,116,97,95,115,105,122,101,218,9,110,97,109,101, - 95,115,105,122,101,218,10,101,120,116,114,97,95,115,105,122, - 101,90,12,99,111,109,109,101,110,116,95,115,105,122,101,218, - 11,102,105,108,101,95,111,102,102,115,101,116,114,59,0,0, - 0,114,13,0,0,0,218,1,116,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,27,0,0,0,96,1,0, - 0,115,212,0,0,0,0,1,2,1,16,1,14,1,24,2, - 8,1,2,1,14,1,8,1,14,1,14,1,24,1,12,1, - 18,1,18,3,2,1,12,1,12,1,14,1,10,1,2,255, - 12,2,8,1,2,255,2,1,2,255,4,2,2,1,10,1, - 12,1,16,1,10,1,2,255,12,2,10,1,10,1,10,1, - 2,255,6,2,16,1,14,1,10,1,2,255,6,2,16,2, - 16,1,16,1,10,1,18,1,10,1,18,1,8,1,8,1, - 10,1,18,2,4,2,4,1,2,1,14,1,16,1,24,2, - 10,1,14,1,8,2,18,1,4,1,14,1,8,1,16,1, - 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, - 16,1,16,1,12,1,10,1,18,1,8,2,2,1,14,1, - 16,1,24,1,14,1,18,4,2,1,28,1,22,1,16,1, - 24,2,10,2,10,3,2,1,14,1,16,1,22,2,12,1, - 12,1,20,1,8,1,22,1,14,1,114,27,0,0,0,117, - 190,1,0,0,0,1,2,3,4,5,6,7,8,9,10,11, - 12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, - 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43, - 44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59, - 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75, - 76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91, - 92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107, - 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123, - 124,125,126,127,195,135,195,188,195,169,195,162,195,164,195,160, - 195,165,195,167,195,170,195,171,195,168,195,175,195,174,195,172, - 195,132,195,133,195,137,195,166,195,134,195,180,195,182,195,178, - 195,187,195,185,195,191,195,150,195,156,194,162,194,163,194,165, - 226,130,167,198,146,195,161,195,173,195,179,195,186,195,177,195, - 145,194,170,194,186,194,191,226,140,144,194,172,194,189,194,188, - 194,161,194,171,194,187,226,150,145,226,150,146,226,150,147,226, - 148,130,226,148,164,226,149,161,226,149,162,226,149,150,226,149, - 149,226,149,163,226,149,145,226,149,151,226,149,157,226,149,156, - 226,149,155,226,148,144,226,148,148,226,148,180,226,148,172,226, - 148,156,226,148,128,226,148,188,226,149,158,226,149,159,226,149, - 154,226,149,148,226,149,169,226,149,166,226,149,160,226,149,144, - 226,149,172,226,149,167,226,149,168,226,149,164,226,149,165,226, - 149,153,226,149,152,226,149,146,226,149,147,226,149,171,226,149, - 170,226,148,152,226,148,140,226,150,136,226,150,132,226,150,140, - 226,150,144,226,150,128,206,177,195,159,206,147,207,128,206,163, - 207,131,194,181,207,132,206,166,206,152,206,169,206,180,226,136, - 158,207,134,206,181,226,136,169,226,137,161,194,177,226,137,165, - 226,137,164,226,140,160,226,140,161,195,183,226,137,136,194,176, - 226,136,153,194,183,226,136,154,226,129,191,194,178,226,150,160, - 194,160,99,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,8,0,0,0,67,0,0,0,115,108,0,0,0, - 116,0,114,22,116,1,160,2,100,1,161,1,1,0,116,3, - 100,2,131,1,130,1,100,3,97,0,122,60,122,16,100,4, - 100,5,108,4,109,5,125,0,1,0,87,0,110,38,4,0, - 116,6,107,10,114,82,1,0,1,0,1,0,116,1,160,2, - 100,1,161,1,1,0,116,3,100,2,131,1,130,1,89,0, - 110,2,88,0,87,0,53,0,100,6,97,0,88,0,116,1, - 160,2,100,7,161,1,1,0,124,0,83,0,41,8,78,122, - 27,122,105,112,105,109,112,111,114,116,58,32,122,108,105,98, - 32,85,78,65,86,65,73,76,65,66,76,69,250,41,99,97, - 110,39,116,32,100,101,99,111,109,112,114,101,115,115,32,100, - 97,116,97,59,32,122,108,105,98,32,110,111,116,32,97,118, - 97,105,108,97,98,108,101,84,114,0,0,0,0,169,1,218, - 10,100,101,99,111,109,112,114,101,115,115,70,122,25,122,105, - 112,105,109,112,111,114,116,58,32,122,108,105,98,32,97,118, - 97,105,108,97,98,108,101,41,7,218,15,95,105,109,112,111, - 114,116,105,110,103,95,122,108,105,98,114,76,0,0,0,114, - 77,0,0,0,114,3,0,0,0,90,4,122,108,105,98,114, - 142,0,0,0,218,9,69,120,99,101,112,116,105,111,110,114, - 141,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,20,95,103,101,116,95,100,101,99,111,109,112, - 114,101,115,115,95,102,117,110,99,254,1,0,0,115,24,0, - 0,0,0,2,4,3,10,1,8,2,4,1,4,1,16,1, - 14,1,10,1,18,2,6,2,10,1,114,145,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0, - 9,0,0,0,67,0,0,0,115,130,1,0,0,124,1,92, - 8,125,2,125,3,125,4,125,5,125,6,125,7,125,8,125, - 9,124,4,100,1,107,0,114,36,116,0,100,2,131,1,130, - 1,116,1,160,2,124,0,100,3,161,2,144,1,143,8,125, - 10,122,14,124,10,160,3,124,6,161,1,1,0,87,0,110, - 38,4,0,116,4,107,10,114,104,1,0,1,0,1,0,116, - 0,100,4,124,0,155,2,157,2,124,0,100,5,141,2,130, - 1,89,0,110,2,88,0,124,10,160,5,100,6,161,1,125, - 11,116,6,124,11,131,1,100,6,107,3,114,136,116,7,100, - 7,131,1,130,1,124,11,100,0,100,8,133,2,25,0,100, - 9,107,3,114,170,116,0,100,10,124,0,155,2,157,2,124, - 0,100,5,141,2,130,1,116,8,124,11,100,11,100,12,133, - 2,25,0,131,1,125,12,116,8,124,11,100,12,100,6,133, - 2,25,0,131,1,125,13,100,6,124,12,23,0,124,13,23, - 0,125,14,124,6,124,14,55,0,125,6,122,14,124,10,160, - 3,124,6,161,1,1,0,87,0,110,40,4,0,116,4,107, - 10,144,1,114,20,1,0,1,0,1,0,116,0,100,4,124, - 0,155,2,157,2,124,0,100,5,141,2,130,1,89,0,110, - 2,88,0,124,10,160,5,124,4,161,1,125,15,116,6,124, - 15,131,1,124,4,107,3,144,1,114,54,116,4,100,13,131, - 1,130,1,87,0,53,0,81,0,82,0,88,0,124,3,100, - 1,107,2,144,1,114,78,124,15,83,0,122,10,116,9,131, - 0,125,16,87,0,110,30,4,0,116,10,107,10,144,1,114, - 118,1,0,1,0,1,0,116,0,100,14,131,1,130,1,89, - 0,110,2,88,0,124,16,124,15,100,15,131,2,83,0,41, - 16,78,114,0,0,0,0,122,18,110,101,103,97,116,105,118, - 101,32,100,97,116,97,32,115,105,122,101,114,92,0,0,0, - 114,93,0,0,0,114,12,0,0,0,114,105,0,0,0,114, - 99,0,0,0,114,94,0,0,0,115,4,0,0,0,80,75, - 3,4,122,23,98,97,100,32,108,111,99,97,108,32,102,105, - 108,101,32,104,101,97,100,101,114,58,32,233,26,0,0,0, - 114,104,0,0,0,122,26,122,105,112,105,109,112,111,114,116, - 58,32,99,97,110,39,116,32,114,101,97,100,32,100,97,116, - 97,114,140,0,0,0,105,241,255,255,255,41,11,114,3,0, - 0,0,114,111,0,0,0,114,112,0,0,0,114,113,0,0, - 0,114,22,0,0,0,114,115,0,0,0,114,51,0,0,0, - 114,120,0,0,0,114,1,0,0,0,114,145,0,0,0,114, - 144,0,0,0,41,17,114,29,0,0,0,114,54,0,0,0, - 90,8,100,97,116,97,112,97,116,104,114,131,0,0,0,114, - 135,0,0,0,114,126,0,0,0,114,138,0,0,0,114,132, - 0,0,0,114,133,0,0,0,114,134,0,0,0,114,124,0, - 0,0,114,125,0,0,0,114,136,0,0,0,114,137,0,0, - 0,114,128,0,0,0,90,8,114,97,119,95,100,97,116,97, - 114,142,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,52,0,0,0,19,2,0,0,115,62,0, - 0,0,0,1,20,1,8,1,8,2,16,2,2,1,14,1, - 14,1,24,1,10,1,12,1,8,2,16,2,18,2,16,1, - 16,1,12,1,8,1,2,1,14,1,16,1,24,1,10,1, - 14,1,18,2,10,2,4,3,2,1,10,1,16,1,14,1, - 114,52,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,16, - 0,0,0,116,0,124,0,124,1,24,0,131,1,100,1,107, - 1,83,0,41,2,78,114,5,0,0,0,41,1,218,3,97, - 98,115,41,2,90,2,116,49,90,2,116,50,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,9,95,101,113, - 95,109,116,105,109,101,65,2,0,0,115,2,0,0,0,0, - 2,114,148,0,0,0,99,5,0,0,0,0,0,0,0,0, - 0,0,0,14,0,0,0,8,0,0,0,67,0,0,0,115, - 68,1,0,0,124,3,124,2,100,1,156,2,125,5,122,18, - 116,0,160,1,124,4,124,3,124,5,161,3,125,6,87,0, - 110,26,4,0,116,2,107,10,114,54,1,0,1,0,1,0, - 89,0,100,0,83,0,89,0,110,2,88,0,124,6,100,2, - 64,0,100,3,107,3,125,7,124,7,114,190,124,6,100,4, - 64,0,100,3,107,3,125,8,116,3,106,4,100,5,107,3, - 114,188,124,8,115,108,116,3,106,4,100,6,107,2,114,188, - 116,5,124,0,124,2,131,2,125,9,124,9,100,0,107,9, - 114,188,116,3,160,6,116,0,106,7,124,9,161,2,125,10, - 122,20,116,8,160,9,124,4,124,10,124,3,124,5,161,4, - 1,0,87,0,110,26,4,0,116,2,107,10,114,186,1,0, - 1,0,1,0,89,0,100,0,83,0,89,0,110,2,88,0, - 110,84,116,10,124,0,124,2,131,2,92,2,125,11,125,12, - 124,11,144,1,114,18,116,11,116,12,124,4,100,7,100,8, - 133,2,25,0,131,1,124,11,131,2,114,254,116,12,124,4, - 100,8,100,9,133,2,25,0,131,1,124,12,107,3,144,1, - 114,18,116,13,160,14,100,10,124,3,155,2,157,2,161,1, - 1,0,100,0,83,0,116,15,160,16,124,4,100,9,100,0, - 133,2,25,0,161,1,125,13,116,17,124,13,116,18,131,2, - 144,1,115,64,116,19,100,11,124,1,155,2,100,12,157,3, - 131,1,130,1,124,13,83,0,41,13,78,41,2,114,59,0, - 0,0,114,13,0,0,0,114,5,0,0,0,114,0,0,0, - 0,114,86,0,0,0,90,5,110,101,118,101,114,90,6,97, - 108,119,97,121,115,114,100,0,0,0,114,95,0,0,0,114, - 96,0,0,0,122,22,98,121,116,101,99,111,100,101,32,105, - 115,32,115,116,97,108,101,32,102,111,114,32,122,16,99,111, - 109,112,105,108,101,100,32,109,111,100,117,108,101,32,122,21, - 32,105,115,32,110,111,116,32,97,32,99,111,100,101,32,111, - 98,106,101,99,116,41,20,114,21,0,0,0,90,13,95,99, - 108,97,115,115,105,102,121,95,112,121,99,114,75,0,0,0, - 218,4,95,105,109,112,90,21,99,104,101,99,107,95,104,97, - 115,104,95,98,97,115,101,100,95,112,121,99,115,218,15,95, - 103,101,116,95,112,121,99,95,115,111,117,114,99,101,218,11, - 115,111,117,114,99,101,95,104,97,115,104,90,17,95,82,65, - 87,95,77,65,71,73,67,95,78,85,77,66,69,82,90,18, - 95,98,111,111,115,116,114,97,112,95,101,120,116,101,114,110, - 97,108,90,18,95,118,97,108,105,100,97,116,101,95,104,97, - 115,104,95,112,121,99,218,29,95,103,101,116,95,109,116,105, - 109,101,95,97,110,100,95,115,105,122,101,95,111,102,95,115, - 111,117,114,99,101,114,148,0,0,0,114,2,0,0,0,114, - 76,0,0,0,114,77,0,0,0,218,7,109,97,114,115,104, - 97,108,90,5,108,111,97,100,115,114,15,0,0,0,218,10, - 95,99,111,100,101,95,116,121,112,101,218,9,84,121,112,101, - 69,114,114,111,114,41,14,114,32,0,0,0,114,53,0,0, - 0,114,63,0,0,0,114,38,0,0,0,114,127,0,0,0, - 90,11,101,120,99,95,100,101,116,97,105,108,115,114,130,0, - 0,0,90,10,104,97,115,104,95,98,97,115,101,100,90,12, - 99,104,101,99,107,95,115,111,117,114,99,101,90,12,115,111, - 117,114,99,101,95,98,121,116,101,115,114,151,0,0,0,90, - 12,115,111,117,114,99,101,95,109,116,105,109,101,90,11,115, - 111,117,114,99,101,95,115,105,122,101,114,46,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,15, - 95,117,110,109,97,114,115,104,97,108,95,99,111,100,101,75, - 2,0,0,115,88,0,0,0,0,2,2,1,2,254,6,5, - 2,1,18,1,14,1,12,2,12,1,4,1,12,1,10,1, - 2,255,2,1,8,255,2,2,10,1,8,1,4,1,4,1, - 2,254,4,5,2,1,4,1,2,0,2,0,2,0,2,255, - 8,2,14,1,14,3,8,255,6,3,6,3,22,1,18,255, - 4,2,4,1,8,255,4,2,4,2,18,1,12,1,16,1, - 114,156,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,28, - 0,0,0,124,0,160,0,100,1,100,2,161,2,125,0,124, - 0,160,0,100,3,100,2,161,2,125,0,124,0,83,0,41, - 4,78,115,2,0,0,0,13,10,243,1,0,0,0,10,243, - 1,0,0,0,13,41,1,114,19,0,0,0,41,1,218,6, - 115,111,117,114,99,101,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,23,95,110,111,114,109,97,108,105,122, - 101,95,108,105,110,101,95,101,110,100,105,110,103,115,126,2, - 0,0,115,6,0,0,0,0,1,12,1,12,1,114,160,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,6,0,0,0,67,0,0,0,115,24,0,0,0, - 116,0,124,1,131,1,125,1,116,1,124,1,124,0,100,1, - 100,2,100,3,141,4,83,0,41,4,78,114,74,0,0,0, - 84,41,1,90,12,100,111,110,116,95,105,110,104,101,114,105, - 116,41,2,114,160,0,0,0,218,7,99,111,109,112,105,108, - 101,41,2,114,53,0,0,0,114,159,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,99, - 111,109,112,105,108,101,95,115,111,117,114,99,101,133,2,0, - 0,115,4,0,0,0,0,1,8,1,114,162,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 11,0,0,0,67,0,0,0,115,68,0,0,0,116,0,160, - 1,124,0,100,1,63,0,100,2,23,0,124,0,100,3,63, - 0,100,4,64,0,124,0,100,5,64,0,124,1,100,6,63, - 0,124,1,100,3,63,0,100,7,64,0,124,1,100,5,64, - 0,100,8,20,0,100,9,100,9,100,9,102,9,161,1,83, - 0,41,10,78,233,9,0,0,0,105,188,7,0,0,233,5, - 0,0,0,233,15,0,0,0,233,31,0,0,0,233,11,0, - 0,0,233,63,0,0,0,114,86,0,0,0,114,14,0,0, - 0,41,2,114,132,0,0,0,90,6,109,107,116,105,109,101, - 41,2,218,1,100,114,139,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,14,95,112,97,114,115, - 101,95,100,111,115,116,105,109,101,139,2,0,0,115,22,0, - 0,0,0,1,4,1,10,1,10,1,6,1,6,1,10,1, - 10,1,2,0,2,0,2,249,114,170,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,10,0, - 0,0,67,0,0,0,115,116,0,0,0,122,82,124,1,100, - 1,100,0,133,2,25,0,100,2,107,6,115,22,116,0,130, - 1,124,1,100,0,100,1,133,2,25,0,125,1,124,0,106, - 1,124,1,25,0,125,2,124,2,100,3,25,0,125,3,124, - 2,100,4,25,0,125,4,124,2,100,5,25,0,125,5,116, - 2,124,4,124,3,131,2,124,5,102,2,87,0,83,0,4, - 0,116,3,116,4,116,5,102,3,107,10,114,110,1,0,1, - 0,1,0,89,0,100,6,83,0,88,0,100,0,83,0,41, - 7,78,114,14,0,0,0,169,2,218,1,99,218,1,111,114, - 164,0,0,0,233,6,0,0,0,233,3,0,0,0,41,2, - 114,0,0,0,0,114,0,0,0,0,41,6,218,14,65,115, - 115,101,114,116,105,111,110,69,114,114,111,114,114,28,0,0, - 0,114,170,0,0,0,114,26,0,0,0,218,10,73,110,100, - 101,120,69,114,114,111,114,114,155,0,0,0,41,6,114,32, - 0,0,0,114,13,0,0,0,114,54,0,0,0,114,132,0, - 0,0,114,133,0,0,0,90,17,117,110,99,111,109,112,114, - 101,115,115,101,100,95,115,105,122,101,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,152,0,0,0,152,2, - 0,0,115,20,0,0,0,0,1,2,2,20,1,12,1,10, - 3,8,1,8,1,8,1,16,1,20,1,114,152,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,86,0,0,0,124,1, - 100,1,100,0,133,2,25,0,100,2,107,6,115,20,116,0, - 130,1,124,1,100,0,100,1,133,2,25,0,125,1,122,14, - 124,0,106,1,124,1,25,0,125,2,87,0,110,22,4,0, - 116,2,107,10,114,68,1,0,1,0,1,0,89,0,100,0, - 83,0,88,0,116,3,124,0,106,4,124,2,131,2,83,0, - 100,0,83,0,41,3,78,114,14,0,0,0,114,171,0,0, - 0,41,5,114,176,0,0,0,114,28,0,0,0,114,26,0, - 0,0,114,52,0,0,0,114,29,0,0,0,41,3,114,32, - 0,0,0,114,13,0,0,0,114,54,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,150,0,0, - 0,171,2,0,0,115,14,0,0,0,0,2,20,1,12,2, - 2,1,14,1,14,1,8,2,114,150,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,11,0,0,0,9,0, - 0,0,67,0,0,0,115,198,0,0,0,116,0,124,0,124, - 1,131,2,125,2,116,1,68,0,93,160,92,3,125,3,125, - 4,125,5,124,2,124,3,23,0,125,6,116,2,106,3,100, - 1,124,0,106,4,116,5,124,6,100,2,100,3,141,5,1, - 0,122,14,124,0,106,6,124,6,25,0,125,7,87,0,110, - 20,4,0,116,7,107,10,114,88,1,0,1,0,1,0,89, - 0,113,14,88,0,124,7,100,4,25,0,125,8,116,8,124, - 0,106,4,124,7,131,2,125,9,124,4,114,132,116,9,124, - 0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116, - 10,124,8,124,9,131,2,125,10,124,10,100,0,107,8,114, - 152,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124, - 8,102,3,2,0,1,0,83,0,113,14,116,11,100,5,124, - 1,155,2,157,2,124,1,100,6,141,2,130,1,100,0,83, - 0,41,7,78,122,13,116,114,121,105,110,103,32,123,125,123, - 125,123,125,114,86,0,0,0,41,1,90,9,118,101,114,98, - 111,115,105,116,121,114,0,0,0,0,114,57,0,0,0,114, - 58,0,0,0,41,12,114,36,0,0,0,114,89,0,0,0, - 114,76,0,0,0,114,77,0,0,0,114,29,0,0,0,114, - 20,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, - 0,0,0,114,156,0,0,0,114,162,0,0,0,114,3,0, - 0,0,41,11,114,32,0,0,0,114,38,0,0,0,114,13, - 0,0,0,114,90,0,0,0,114,91,0,0,0,114,47,0, - 0,0,114,63,0,0,0,114,54,0,0,0,114,40,0,0, - 0,114,127,0,0,0,114,46,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,44,0,0,0,186, - 2,0,0,115,36,0,0,0,0,1,10,1,14,1,8,1, - 22,1,2,1,14,1,14,1,6,2,8,1,12,1,4,1, - 18,2,10,1,8,3,2,1,8,1,16,2,114,44,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,64,0,0,0,115,60,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100, - 3,100,4,132,0,90,5,100,5,100,6,132,0,90,6,100, - 7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,100, - 11,100,12,132,0,90,9,100,13,83,0,41,14,114,80,0, - 0,0,122,165,80,114,105,118,97,116,101,32,99,108,97,115, - 115,32,117,115,101,100,32,116,111,32,115,117,112,112,111,114, - 116,32,90,105,112,73,109,112,111,114,116,46,103,101,116,95, - 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,40, - 41,46,10,10,32,32,32,32,84,104,105,115,32,99,108,97, - 115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111, - 32,114,101,102,101,114,101,110,99,101,32,97,108,108,32,116, - 104,101,32,105,110,110,97,114,100,115,32,97,110,100,32,112, - 114,105,118,97,116,101,32,112,97,114,116,115,32,111,102,10, - 32,32,32,32,116,104,101,32,122,105,112,105,109,112,111,114, - 116,101,114,46,10,32,32,32,32,70,99,3,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67, - 0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2, - 124,0,95,1,100,0,83,0,114,88,0,0,0,41,2,114, - 4,0,0,0,114,38,0,0,0,41,3,114,32,0,0,0, - 114,4,0,0,0,114,38,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,34,0,0,0,220,2, - 0,0,115,4,0,0,0,0,1,6,1,122,33,95,90,105, - 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, - 101,97,100,101,114,46,95,95,105,110,105,116,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8, - 0,0,0,67,0,0,0,115,92,0,0,0,124,0,106,0, - 160,1,100,1,100,2,161,2,125,2,124,2,155,0,100,2, - 124,1,155,0,157,3,125,3,100,3,100,4,108,2,109,3, - 125,4,1,0,122,18,124,4,124,0,106,4,160,5,124,3, - 161,1,131,1,87,0,83,0,4,0,116,6,107,10,114,86, - 1,0,1,0,1,0,116,7,124,3,131,1,130,1,89,0, - 110,2,88,0,100,0,83,0,41,5,78,114,85,0,0,0, - 114,110,0,0,0,114,0,0,0,0,41,1,218,7,66,121, - 116,101,115,73,79,41,8,114,38,0,0,0,114,19,0,0, - 0,90,2,105,111,114,178,0,0,0,114,4,0,0,0,114, - 55,0,0,0,114,22,0,0,0,218,17,70,105,108,101,78, - 111,116,70,111,117,110,100,69,114,114,111,114,41,5,114,32, - 0,0,0,218,8,114,101,115,111,117,114,99,101,218,16,102, - 117,108,108,110,97,109,101,95,97,115,95,112,97,116,104,114, - 13,0,0,0,114,178,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,13,111,112,101,110,95,114, - 101,115,111,117,114,99,101,224,2,0,0,115,14,0,0,0, - 0,1,14,1,14,1,12,1,2,1,18,1,14,1,122,38, - 95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114, - 99,101,82,101,97,100,101,114,46,111,112,101,110,95,114,101, - 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 8,0,0,0,116,0,130,1,100,0,83,0,114,88,0,0, - 0,41,1,114,179,0,0,0,41,2,114,32,0,0,0,114, - 180,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97, - 116,104,233,2,0,0,115,2,0,0,0,0,4,122,38,95, - 90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,99, - 101,82,101,97,100,101,114,46,114,101,115,111,117,114,99,101, - 95,112,97,116,104,99,2,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,72, - 0,0,0,124,0,106,0,160,1,100,1,100,2,161,2,125, - 2,124,2,155,0,100,2,124,1,155,0,157,3,125,3,122, - 16,124,0,106,2,160,3,124,3,161,1,1,0,87,0,110, - 22,4,0,116,4,107,10,114,66,1,0,1,0,1,0,89, - 0,100,3,83,0,88,0,100,4,83,0,41,5,78,114,85, - 0,0,0,114,110,0,0,0,70,84,41,5,114,38,0,0, - 0,114,19,0,0,0,114,4,0,0,0,114,55,0,0,0, - 114,22,0,0,0,41,4,114,32,0,0,0,114,59,0,0, - 0,114,181,0,0,0,114,13,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,11,105,115,95,114, - 101,115,111,117,114,99,101,239,2,0,0,115,14,0,0,0, - 0,3,14,1,14,1,2,1,16,1,14,1,8,1,122,36, - 95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114, - 99,101,82,101,97,100,101,114,46,105,115,95,114,101,115,111, - 117,114,99,101,99,1,0,0,0,0,0,0,0,0,0,0, - 0,9,0,0,0,9,0,0,0,99,0,0,0,115,186,0, - 0,0,100,1,100,2,108,0,109,1,125,1,1,0,124,1, - 124,0,106,2,160,3,124,0,106,4,161,1,131,1,125,2, - 124,2,160,5,124,0,106,2,106,6,161,1,125,3,124,3, - 106,7,100,3,107,2,115,58,116,8,130,1,124,3,106,9, - 125,4,116,10,131,0,125,5,124,0,106,2,106,11,68,0, - 93,102,125,6,122,18,124,1,124,6,131,1,160,5,124,4, - 161,1,125,7,87,0,110,24,4,0,116,12,107,10,114,124, - 1,0,1,0,1,0,89,0,113,78,89,0,110,2,88,0, - 124,7,106,9,106,7,125,8,116,13,124,8,131,1,100,1, - 107,2,114,156,124,7,106,7,86,0,1,0,113,78,124,8, - 124,5,107,7,114,78,124,5,160,14,124,8,161,1,1,0, - 124,8,86,0,1,0,113,78,100,0,83,0,41,4,78,114, - 0,0,0,0,41,1,218,4,80,97,116,104,114,60,0,0, - 0,41,15,90,7,112,97,116,104,108,105,98,114,185,0,0, - 0,114,4,0,0,0,114,56,0,0,0,114,38,0,0,0, - 90,11,114,101,108,97,116,105,118,101,95,116,111,114,29,0, - 0,0,114,59,0,0,0,114,176,0,0,0,90,6,112,97, - 114,101,110,116,218,3,115,101,116,114,28,0,0,0,114,23, - 0,0,0,114,51,0,0,0,218,3,97,100,100,41,9,114, - 32,0,0,0,114,185,0,0,0,90,13,102,117,108,108,110, - 97,109,101,95,112,97,116,104,90,13,114,101,108,97,116,105, - 118,101,95,112,97,116,104,90,12,112,97,99,107,97,103,101, - 95,112,97,116,104,90,12,115,117,98,100,105,114,115,95,115, - 101,101,110,218,8,102,105,108,101,110,97,109,101,90,8,114, - 101,108,97,116,105,118,101,90,11,112,97,114,101,110,116,95, - 110,97,109,101,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,8,99,111,110,116,101,110,116,115,250,2,0, - 0,115,34,0,0,0,0,8,12,1,18,1,14,3,14,1, - 6,1,6,1,12,1,2,1,18,1,14,1,10,5,8,1, - 12,1,10,1,8,1,10,1,122,33,95,90,105,112,73,109, - 112,111,114,116,82,101,115,111,117,114,99,101,82,101,97,100, - 101,114,46,99,111,110,116,101,110,116,115,78,41,10,114,6, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,0, - 0,0,114,81,0,0,0,114,34,0,0,0,114,182,0,0, - 0,114,183,0,0,0,114,184,0,0,0,114,189,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,80,0,0,0,212,2,0,0,115,14,0, - 0,0,8,1,4,5,4,2,8,4,8,9,8,6,8,11, - 114,80,0,0,0,41,45,114,84,0,0,0,90,26,95,102, - 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95, - 101,120,116,101,114,110,97,108,114,21,0,0,0,114,1,0, - 0,0,114,2,0,0,0,90,17,95,102,114,111,122,101,110, - 95,105,109,112,111,114,116,108,105,98,114,76,0,0,0,114, - 149,0,0,0,114,111,0,0,0,114,153,0,0,0,114,67, - 0,0,0,114,132,0,0,0,90,7,95,95,97,108,108,95, - 95,114,20,0,0,0,90,15,112,97,116,104,95,115,101,112, - 97,114,97,116,111,114,115,114,18,0,0,0,114,75,0,0, - 0,114,3,0,0,0,114,25,0,0,0,218,4,116,121,112, - 101,114,70,0,0,0,114,114,0,0,0,114,116,0,0,0, - 114,118,0,0,0,114,4,0,0,0,114,89,0,0,0,114, - 36,0,0,0,114,37,0,0,0,114,35,0,0,0,114,27, - 0,0,0,114,123,0,0,0,114,143,0,0,0,114,145,0, - 0,0,114,52,0,0,0,114,148,0,0,0,114,156,0,0, - 0,218,8,95,95,99,111,100,101,95,95,114,154,0,0,0, - 114,160,0,0,0,114,162,0,0,0,114,170,0,0,0,114, - 152,0,0,0,114,150,0,0,0,114,44,0,0,0,114,80, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,8,60,109,111,100,117,108,101, - 62,1,0,0,0,115,88,0,0,0,4,16,8,1,16,1, - 8,1,8,1,8,1,8,1,8,1,8,2,8,3,6,1, - 14,3,16,4,4,2,8,2,4,1,4,1,4,2,14,127, - 0,127,0,1,12,1,12,1,2,1,2,252,4,9,8,4, - 8,9,8,31,8,126,2,254,2,29,4,5,8,21,8,46, - 8,10,8,46,10,5,8,7,8,6,8,13,8,19,8,15, - 8,26, + 0,0,0,9,0,0,0,67,0,0,0,115,252,4,0,0, + 122,14,116,0,160,1,124,0,161,1,125,1,87,0,110,38, + 4,0,116,2,107,10,114,52,1,0,1,0,1,0,116,3, + 100,1,124,0,155,2,157,2,124,0,100,2,141,2,130,1, + 89,0,110,2,88,0,124,1,144,4,143,168,1,0,122,36, + 124,1,160,4,116,5,11,0,100,3,161,2,1,0,124,1, + 160,6,161,0,125,2,124,1,160,7,116,5,161,1,125,3, + 87,0,110,38,4,0,116,2,107,10,114,136,1,0,1,0, + 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,89,0,110,2,88,0,116,8,124,3,131,1, + 116,5,107,3,114,168,116,3,100,4,124,0,155,2,157,2, + 124,0,100,2,141,2,130,1,124,3,100,0,100,5,133,2, + 25,0,116,9,107,3,144,1,114,178,122,24,124,1,160,4, + 100,6,100,3,161,2,1,0,124,1,160,6,161,0,125,4, + 87,0,110,38,4,0,116,2,107,10,114,248,1,0,1,0, + 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,89,0,110,2,88,0,116,10,124,4,116,11, + 24,0,116,5,24,0,100,6,131,2,125,5,122,22,124,1, + 160,4,124,5,161,1,1,0,124,1,160,7,161,0,125,6, + 87,0,110,40,4,0,116,2,107,10,144,1,114,74,1,0, + 1,0,1,0,116,3,100,4,124,0,155,2,157,2,124,0, + 100,2,141,2,130,1,89,0,110,2,88,0,124,6,160,12, + 116,9,161,1,125,7,124,7,100,6,107,0,144,1,114,114, + 116,3,100,7,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,124,6,124,7,124,7,116,5,23,0,133,2,25,0, + 125,3,116,8,124,3,131,1,116,5,107,3,144,1,114,162, + 116,3,100,8,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,124,4,116,8,124,6,131,1,24,0,124,7,23,0, + 125,2,116,13,124,3,100,9,100,10,133,2,25,0,131,1, + 125,8,116,13,124,3,100,10,100,11,133,2,25,0,131,1, + 125,9,124,2,124,8,107,0,144,1,114,238,116,3,100,12, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,2, + 124,9,107,0,144,2,114,10,116,3,100,13,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,124,2,124,8,56,0, + 125,2,124,2,124,9,24,0,125,10,124,10,100,6,107,0, + 144,2,114,54,116,3,100,14,124,0,155,2,157,2,124,0, + 100,2,141,2,130,1,105,0,125,11,100,6,125,12,122,14, + 124,1,160,4,124,2,161,1,1,0,87,0,110,40,4,0, + 116,2,107,10,144,2,114,116,1,0,1,0,1,0,116,3, + 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, + 89,0,110,2,88,0,124,1,160,7,100,15,161,1,125,3, + 116,8,124,3,131,1,100,5,107,0,144,2,114,150,116,14, + 100,16,131,1,130,1,124,3,100,0,100,5,133,2,25,0, + 100,17,107,3,144,2,114,172,144,4,113,224,116,8,124,3, + 131,1,100,15,107,3,144,2,114,194,116,14,100,16,131,1, + 130,1,116,15,124,3,100,18,100,19,133,2,25,0,131,1, + 125,13,116,15,124,3,100,19,100,9,133,2,25,0,131,1, + 125,14,116,15,124,3,100,9,100,20,133,2,25,0,131,1, + 125,15,116,15,124,3,100,20,100,10,133,2,25,0,131,1, + 125,16,116,13,124,3,100,10,100,11,133,2,25,0,131,1, + 125,17,116,13,124,3,100,11,100,21,133,2,25,0,131,1, + 125,18,116,13,124,3,100,21,100,22,133,2,25,0,131,1, + 125,4,116,15,124,3,100,22,100,23,133,2,25,0,131,1, + 125,19,116,15,124,3,100,23,100,24,133,2,25,0,131,1, + 125,20,116,15,124,3,100,24,100,25,133,2,25,0,131,1, + 125,21,116,13,124,3,100,26,100,15,133,2,25,0,131,1, + 125,22,124,19,124,20,23,0,124,21,23,0,125,8,124,22, + 124,9,107,4,144,3,114,154,116,3,100,27,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,124,22,124,10,55,0, + 125,22,122,14,124,1,160,7,124,19,161,1,125,23,87,0, + 110,40,4,0,116,2,107,10,144,3,114,216,1,0,1,0, + 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,89,0,110,2,88,0,116,8,124,23,131,1, + 124,19,107,3,144,3,114,250,116,3,100,4,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,122,50,116,8,124,1, + 160,7,124,8,124,19,24,0,161,1,131,1,124,8,124,19, + 24,0,107,3,144,4,114,42,116,3,100,4,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,87,0,110,40,4,0, + 116,2,107,10,144,4,114,84,1,0,1,0,1,0,116,3, + 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, + 89,0,110,2,88,0,124,13,100,28,64,0,144,4,114,106, + 124,23,160,16,161,0,125,23,110,54,122,14,124,23,160,16, + 100,29,161,1,125,23,87,0,110,38,4,0,116,17,107,10, + 144,4,114,158,1,0,1,0,1,0,124,23,160,16,100,30, + 161,1,160,18,116,19,161,1,125,23,89,0,110,2,88,0, + 124,23,160,20,100,31,116,21,161,2,125,23,116,22,160,23, + 124,0,124,23,161,2,125,24,124,24,124,14,124,18,124,4, + 124,22,124,15,124,16,124,17,102,8,125,25,124,25,124,11, + 124,23,60,0,124,12,100,32,55,0,125,12,144,2,113,118, + 87,0,53,0,81,0,82,0,88,0,116,24,160,25,100,33, + 124,12,124,0,161,3,1,0,124,11,83,0,41,34,78,122, + 21,99,97,110,39,116,32,111,112,101,110,32,90,105,112,32, + 102,105,108,101,58,32,114,12,0,0,0,114,86,0,0,0, + 250,21,99,97,110,39,116,32,114,101,97,100,32,90,105,112, + 32,102,105,108,101,58,32,233,4,0,0,0,114,0,0,0, + 0,122,16,110,111,116,32,97,32,90,105,112,32,102,105,108, + 101,58,32,122,18,99,111,114,114,117,112,116,32,90,105,112, + 32,102,105,108,101,58,32,233,12,0,0,0,233,16,0,0, + 0,233,20,0,0,0,122,28,98,97,100,32,99,101,110,116, + 114,97,108,32,100,105,114,101,99,116,111,114,121,32,115,105, + 122,101,58,32,122,30,98,97,100,32,99,101,110,116,114,97, + 108,32,100,105,114,101,99,116,111,114,121,32,111,102,102,115, + 101,116,58,32,122,38,98,97,100,32,99,101,110,116,114,97, + 108,32,100,105,114,101,99,116,111,114,121,32,115,105,122,101, + 32,111,114,32,111,102,102,115,101,116,58,32,233,46,0,0, + 0,250,27,69,79,70,32,114,101,97,100,32,119,104,101,114, + 101,32,110,111,116,32,101,120,112,101,99,116,101,100,115,4, + 0,0,0,80,75,1,2,233,8,0,0,0,233,10,0,0, + 0,233,14,0,0,0,233,24,0,0,0,233,28,0,0,0, + 233,30,0,0,0,233,32,0,0,0,233,34,0,0,0,233, + 42,0,0,0,122,25,98,97,100,32,108,111,99,97,108,32, + 104,101,97,100,101,114,32,111,102,102,115,101,116,58,32,105, + 0,8,0,0,218,5,97,115,99,105,105,90,6,108,97,116, + 105,110,49,250,1,47,114,5,0,0,0,122,33,122,105,112, + 105,109,112,111,114,116,58,32,102,111,117,110,100,32,123,125, + 32,110,97,109,101,115,32,105,110,32,123,33,114,125,41,26, + 218,3,95,105,111,218,9,111,112,101,110,95,99,111,100,101, + 114,22,0,0,0,114,3,0,0,0,218,4,115,101,101,107, + 218,20,69,78,68,95,67,69,78,84,82,65,76,95,68,73, + 82,95,83,73,90,69,90,4,116,101,108,108,218,4,114,101, + 97,100,114,51,0,0,0,218,18,83,84,82,73,78,71,95, + 69,78,68,95,65,82,67,72,73,86,69,218,3,109,97,120, + 218,15,77,65,88,95,67,79,77,77,69,78,84,95,76,69, + 78,218,5,114,102,105,110,100,114,2,0,0,0,218,8,69, + 79,70,69,114,114,111,114,114,1,0,0,0,114,62,0,0, + 0,218,18,85,110,105,99,111,100,101,68,101,99,111,100,101, + 69,114,114,111,114,218,9,116,114,97,110,115,108,97,116,101, + 218,11,99,112,52,51,55,95,116,97,98,108,101,114,19,0, + 0,0,114,20,0,0,0,114,21,0,0,0,114,30,0,0, + 0,114,76,0,0,0,114,77,0,0,0,41,26,114,29,0, + 0,0,218,2,102,112,90,15,104,101,97,100,101,114,95,112, + 111,115,105,116,105,111,110,218,6,98,117,102,102,101,114,218, + 9,102,105,108,101,95,115,105,122,101,90,17,109,97,120,95, + 99,111,109,109,101,110,116,95,115,116,97,114,116,218,4,100, + 97,116,97,90,3,112,111,115,218,11,104,101,97,100,101,114, + 95,115,105,122,101,90,13,104,101,97,100,101,114,95,111,102, + 102,115,101,116,90,10,97,114,99,95,111,102,102,115,101,116, + 114,33,0,0,0,218,5,99,111,117,110,116,218,5,102,108, + 97,103,115,218,8,99,111,109,112,114,101,115,115,218,4,116, + 105,109,101,218,4,100,97,116,101,218,3,99,114,99,218,9, + 100,97,116,97,95,115,105,122,101,218,9,110,97,109,101,95, + 115,105,122,101,218,10,101,120,116,114,97,95,115,105,122,101, + 90,12,99,111,109,109,101,110,116,95,115,105,122,101,218,11, + 102,105,108,101,95,111,102,102,115,101,116,114,59,0,0,0, + 114,13,0,0,0,218,1,116,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,27,0,0,0,96,1,0,0, + 115,212,0,0,0,0,1,2,1,14,1,14,1,24,2,8, + 1,2,1,14,1,8,1,14,1,14,1,24,1,12,1,18, + 1,18,3,2,1,12,1,12,1,14,1,10,1,2,255,12, + 2,8,1,2,255,2,1,2,255,4,2,2,1,10,1,12, + 1,16,1,10,1,2,255,12,2,10,1,10,1,10,1,2, + 255,6,2,16,1,14,1,10,1,2,255,6,2,16,2,16, + 1,16,1,10,1,18,1,10,1,18,1,8,1,8,1,10, + 1,18,2,4,2,4,1,2,1,14,1,16,1,24,2,10, + 1,14,1,8,2,18,1,4,1,14,1,8,1,16,1,16, + 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16, + 1,16,1,12,1,10,1,18,1,8,2,2,1,14,1,16, + 1,24,1,14,1,18,4,2,1,28,1,22,1,16,1,24, + 2,10,2,10,3,2,1,14,1,16,1,22,2,12,1,12, + 1,20,1,8,1,22,1,14,1,114,27,0,0,0,117,190, + 1,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12, + 13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28, + 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44, + 45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60, + 61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76, + 77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92, + 93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108, + 109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124, + 125,126,127,195,135,195,188,195,169,195,162,195,164,195,160,195, + 165,195,167,195,170,195,171,195,168,195,175,195,174,195,172,195, + 132,195,133,195,137,195,166,195,134,195,180,195,182,195,178,195, + 187,195,185,195,191,195,150,195,156,194,162,194,163,194,165,226, + 130,167,198,146,195,161,195,173,195,179,195,186,195,177,195,145, + 194,170,194,186,194,191,226,140,144,194,172,194,189,194,188,194, + 161,194,171,194,187,226,150,145,226,150,146,226,150,147,226,148, + 130,226,148,164,226,149,161,226,149,162,226,149,150,226,149,149, + 226,149,163,226,149,145,226,149,151,226,149,157,226,149,156,226, + 149,155,226,148,144,226,148,148,226,148,180,226,148,172,226,148, + 156,226,148,128,226,148,188,226,149,158,226,149,159,226,149,154, + 226,149,148,226,149,169,226,149,166,226,149,160,226,149,144,226, + 149,172,226,149,167,226,149,168,226,149,164,226,149,165,226,149, + 153,226,149,152,226,149,146,226,149,147,226,149,171,226,149,170, + 226,148,152,226,148,140,226,150,136,226,150,132,226,150,140,226, + 150,144,226,150,128,206,177,195,159,206,147,207,128,206,163,207, + 131,194,181,207,132,206,166,206,152,206,169,206,180,226,136,158, + 207,134,206,181,226,136,169,226,137,161,194,177,226,137,165,226, + 137,164,226,140,160,226,140,161,195,183,226,137,136,194,176,226, + 136,153,194,183,226,136,154,226,129,191,194,178,226,150,160,194, + 160,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,8,0,0,0,67,0,0,0,115,108,0,0,0,116, + 0,114,22,116,1,160,2,100,1,161,1,1,0,116,3,100, + 2,131,1,130,1,100,3,97,0,122,60,122,16,100,4,100, + 5,108,4,109,5,125,0,1,0,87,0,110,38,4,0,116, + 6,107,10,114,82,1,0,1,0,1,0,116,1,160,2,100, + 1,161,1,1,0,116,3,100,2,131,1,130,1,89,0,110, + 2,88,0,87,0,53,0,100,6,97,0,88,0,116,1,160, + 2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,27, + 122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,32, + 85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,110, + 39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,97, + 116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,97, + 105,108,97,98,108,101,84,114,0,0,0,0,169,1,218,10, + 100,101,99,111,109,112,114,101,115,115,70,122,25,122,105,112, + 105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,97, + 105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,114, + 116,105,110,103,95,122,108,105,98,114,76,0,0,0,114,77, + 0,0,0,114,3,0,0,0,90,4,122,108,105,98,114,141, + 0,0,0,218,9,69,120,99,101,112,116,105,111,110,114,140, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,20,95,103,101,116,95,100,101,99,111,109,112,114, + 101,115,115,95,102,117,110,99,254,1,0,0,115,24,0,0, + 0,0,2,4,3,10,1,8,2,4,1,4,1,16,1,14, + 1,10,1,18,2,6,2,10,1,114,144,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,9, + 0,0,0,67,0,0,0,115,128,1,0,0,124,1,92,8, + 125,2,125,3,125,4,125,5,125,6,125,7,125,8,125,9, + 124,4,100,1,107,0,114,36,116,0,100,2,131,1,130,1, + 116,1,160,2,124,0,161,1,144,1,143,8,125,10,122,14, + 124,10,160,3,124,6,161,1,1,0,87,0,110,38,4,0, + 116,4,107,10,114,102,1,0,1,0,1,0,116,0,100,3, + 124,0,155,2,157,2,124,0,100,4,141,2,130,1,89,0, + 110,2,88,0,124,10,160,5,100,5,161,1,125,11,116,6, + 124,11,131,1,100,5,107,3,114,134,116,7,100,6,131,1, + 130,1,124,11,100,0,100,7,133,2,25,0,100,8,107,3, + 114,168,116,0,100,9,124,0,155,2,157,2,124,0,100,4, + 141,2,130,1,116,8,124,11,100,10,100,11,133,2,25,0, + 131,1,125,12,116,8,124,11,100,11,100,5,133,2,25,0, + 131,1,125,13,100,5,124,12,23,0,124,13,23,0,125,14, + 124,6,124,14,55,0,125,6,122,14,124,10,160,3,124,6, + 161,1,1,0,87,0,110,40,4,0,116,4,107,10,144,1, + 114,18,1,0,1,0,1,0,116,0,100,3,124,0,155,2, + 157,2,124,0,100,4,141,2,130,1,89,0,110,2,88,0, + 124,10,160,5,124,4,161,1,125,15,116,6,124,15,131,1, + 124,4,107,3,144,1,114,52,116,4,100,12,131,1,130,1, + 87,0,53,0,81,0,82,0,88,0,124,3,100,1,107,2, + 144,1,114,76,124,15,83,0,122,10,116,9,131,0,125,16, + 87,0,110,30,4,0,116,10,107,10,144,1,114,116,1,0, + 1,0,1,0,116,0,100,13,131,1,130,1,89,0,110,2, + 88,0,124,16,124,15,100,14,131,2,83,0,41,15,78,114, + 0,0,0,0,122,18,110,101,103,97,116,105,118,101,32,100, + 97,116,97,32,115,105,122,101,114,92,0,0,0,114,12,0, + 0,0,114,104,0,0,0,114,98,0,0,0,114,93,0,0, + 0,115,4,0,0,0,80,75,3,4,122,23,98,97,100,32, + 108,111,99,97,108,32,102,105,108,101,32,104,101,97,100,101, + 114,58,32,233,26,0,0,0,114,103,0,0,0,122,26,122, + 105,112,105,109,112,111,114,116,58,32,99,97,110,39,116,32, + 114,101,97,100,32,100,97,116,97,114,139,0,0,0,105,241, + 255,255,255,41,11,114,3,0,0,0,114,110,0,0,0,114, + 111,0,0,0,114,112,0,0,0,114,22,0,0,0,114,114, + 0,0,0,114,51,0,0,0,114,119,0,0,0,114,1,0, + 0,0,114,144,0,0,0,114,143,0,0,0,41,17,114,29, + 0,0,0,114,54,0,0,0,90,8,100,97,116,97,112,97, + 116,104,114,130,0,0,0,114,134,0,0,0,114,125,0,0, + 0,114,137,0,0,0,114,131,0,0,0,114,132,0,0,0, + 114,133,0,0,0,114,123,0,0,0,114,124,0,0,0,114, + 135,0,0,0,114,136,0,0,0,114,127,0,0,0,90,8, + 114,97,119,95,100,97,116,97,114,141,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,52,0,0, + 0,19,2,0,0,115,62,0,0,0,0,1,20,1,8,1, + 8,2,14,2,2,1,14,1,14,1,24,1,10,1,12,1, + 8,2,16,2,18,2,16,1,16,1,12,1,8,1,2,1, + 14,1,16,1,24,1,10,1,14,1,18,2,10,2,4,3, + 2,1,10,1,16,1,14,1,114,52,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,16,0,0,0,116,0,124,0,124, + 1,24,0,131,1,100,1,107,1,83,0,41,2,78,114,5, + 0,0,0,41,1,218,3,97,98,115,41,2,90,2,116,49, + 90,2,116,50,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,9,95,101,113,95,109,116,105,109,101,65,2, + 0,0,115,2,0,0,0,0,2,114,147,0,0,0,99,5, + 0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,8, + 0,0,0,67,0,0,0,115,68,1,0,0,124,3,124,2, + 100,1,156,2,125,5,122,18,116,0,160,1,124,4,124,3, + 124,5,161,3,125,6,87,0,110,26,4,0,116,2,107,10, + 114,54,1,0,1,0,1,0,89,0,100,0,83,0,89,0, + 110,2,88,0,124,6,100,2,64,0,100,3,107,3,125,7, + 124,7,114,190,124,6,100,4,64,0,100,3,107,3,125,8, + 116,3,106,4,100,5,107,3,114,188,124,8,115,108,116,3, + 106,4,100,6,107,2,114,188,116,5,124,0,124,2,131,2, + 125,9,124,9,100,0,107,9,114,188,116,3,160,6,116,0, + 106,7,124,9,161,2,125,10,122,20,116,8,160,9,124,4, + 124,10,124,3,124,5,161,4,1,0,87,0,110,26,4,0, + 116,2,107,10,114,186,1,0,1,0,1,0,89,0,100,0, + 83,0,89,0,110,2,88,0,110,84,116,10,124,0,124,2, + 131,2,92,2,125,11,125,12,124,11,144,1,114,18,116,11, + 116,12,124,4,100,7,100,8,133,2,25,0,131,1,124,11, + 131,2,114,254,116,12,124,4,100,8,100,9,133,2,25,0, + 131,1,124,12,107,3,144,1,114,18,116,13,160,14,100,10, + 124,3,155,2,157,2,161,1,1,0,100,0,83,0,116,15, + 160,16,124,4,100,9,100,0,133,2,25,0,161,1,125,13, + 116,17,124,13,116,18,131,2,144,1,115,64,116,19,100,11, + 124,1,155,2,100,12,157,3,131,1,130,1,124,13,83,0, + 41,13,78,41,2,114,59,0,0,0,114,13,0,0,0,114, + 5,0,0,0,114,0,0,0,0,114,86,0,0,0,90,5, + 110,101,118,101,114,90,6,97,108,119,97,121,115,114,99,0, + 0,0,114,94,0,0,0,114,95,0,0,0,122,22,98,121, + 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32, + 102,111,114,32,122,16,99,111,109,112,105,108,101,100,32,109, + 111,100,117,108,101,32,122,21,32,105,115,32,110,111,116,32, + 97,32,99,111,100,101,32,111,98,106,101,99,116,41,20,114, + 21,0,0,0,90,13,95,99,108,97,115,115,105,102,121,95, + 112,121,99,114,75,0,0,0,218,4,95,105,109,112,90,21, + 99,104,101,99,107,95,104,97,115,104,95,98,97,115,101,100, + 95,112,121,99,115,218,15,95,103,101,116,95,112,121,99,95, + 115,111,117,114,99,101,218,11,115,111,117,114,99,101,95,104, + 97,115,104,90,17,95,82,65,87,95,77,65,71,73,67,95, + 78,85,77,66,69,82,90,18,95,98,111,111,115,116,114,97, + 112,95,101,120,116,101,114,110,97,108,90,18,95,118,97,108, + 105,100,97,116,101,95,104,97,115,104,95,112,121,99,218,29, + 95,103,101,116,95,109,116,105,109,101,95,97,110,100,95,115, + 105,122,101,95,111,102,95,115,111,117,114,99,101,114,147,0, + 0,0,114,2,0,0,0,114,76,0,0,0,114,77,0,0, + 0,218,7,109,97,114,115,104,97,108,90,5,108,111,97,100, + 115,114,15,0,0,0,218,10,95,99,111,100,101,95,116,121, + 112,101,218,9,84,121,112,101,69,114,114,111,114,41,14,114, + 32,0,0,0,114,53,0,0,0,114,63,0,0,0,114,38, + 0,0,0,114,126,0,0,0,90,11,101,120,99,95,100,101, + 116,97,105,108,115,114,129,0,0,0,90,10,104,97,115,104, + 95,98,97,115,101,100,90,12,99,104,101,99,107,95,115,111, + 117,114,99,101,90,12,115,111,117,114,99,101,95,98,121,116, + 101,115,114,150,0,0,0,90,12,115,111,117,114,99,101,95, + 109,116,105,109,101,90,11,115,111,117,114,99,101,95,115,105, + 122,101,114,46,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,15,95,117,110,109,97,114,115,104, + 97,108,95,99,111,100,101,75,2,0,0,115,88,0,0,0, + 0,2,2,1,2,254,6,5,2,1,18,1,14,1,12,2, + 12,1,4,1,12,1,10,1,2,255,2,1,8,255,2,2, + 10,1,8,1,4,1,4,1,2,254,4,5,2,1,4,1, + 2,0,2,0,2,0,2,255,8,2,14,1,14,3,8,255, + 6,3,6,3,22,1,18,255,4,2,4,1,8,255,4,2, + 4,2,18,1,12,1,16,1,114,155,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,67,0,0,0,115,28,0,0,0,124,0,160,0,100, + 1,100,2,161,2,125,0,124,0,160,0,100,3,100,2,161, + 2,125,0,124,0,83,0,41,4,78,115,2,0,0,0,13, + 10,243,1,0,0,0,10,243,1,0,0,0,13,41,1,114, + 19,0,0,0,41,1,218,6,115,111,117,114,99,101,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,23,95, + 110,111,114,109,97,108,105,122,101,95,108,105,110,101,95,101, + 110,100,105,110,103,115,126,2,0,0,115,6,0,0,0,0, + 1,12,1,12,1,114,159,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67, + 0,0,0,115,24,0,0,0,116,0,124,1,131,1,125,1, + 116,1,124,1,124,0,100,1,100,2,100,3,141,4,83,0, + 41,4,78,114,74,0,0,0,84,41,1,90,12,100,111,110, + 116,95,105,110,104,101,114,105,116,41,2,114,159,0,0,0, + 218,7,99,111,109,112,105,108,101,41,2,114,53,0,0,0, + 114,158,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,15,95,99,111,109,112,105,108,101,95,115, + 111,117,114,99,101,133,2,0,0,115,4,0,0,0,0,1, + 8,1,114,161,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,11,0,0,0,67,0,0,0, + 115,68,0,0,0,116,0,160,1,124,0,100,1,63,0,100, + 2,23,0,124,0,100,3,63,0,100,4,64,0,124,0,100, + 5,64,0,124,1,100,6,63,0,124,1,100,3,63,0,100, + 7,64,0,124,1,100,5,64,0,100,8,20,0,100,9,100, + 9,100,9,102,9,161,1,83,0,41,10,78,233,9,0,0, + 0,105,188,7,0,0,233,5,0,0,0,233,15,0,0,0, + 233,31,0,0,0,233,11,0,0,0,233,63,0,0,0,114, + 86,0,0,0,114,14,0,0,0,41,2,114,131,0,0,0, + 90,6,109,107,116,105,109,101,41,2,218,1,100,114,138,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,14,95,112,97,114,115,101,95,100,111,115,116,105,109, + 101,139,2,0,0,115,22,0,0,0,0,1,4,1,10,1, + 10,1,6,1,6,1,10,1,10,1,2,0,2,0,2,249, + 114,169,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,10,0,0,0,67,0,0,0,115,116, + 0,0,0,122,82,124,1,100,1,100,0,133,2,25,0,100, + 2,107,6,115,22,116,0,130,1,124,1,100,0,100,1,133, + 2,25,0,125,1,124,0,106,1,124,1,25,0,125,2,124, + 2,100,3,25,0,125,3,124,2,100,4,25,0,125,4,124, + 2,100,5,25,0,125,5,116,2,124,4,124,3,131,2,124, + 5,102,2,87,0,83,0,4,0,116,3,116,4,116,5,102, + 3,107,10,114,110,1,0,1,0,1,0,89,0,100,6,83, + 0,88,0,100,0,83,0,41,7,78,114,14,0,0,0,169, + 2,218,1,99,218,1,111,114,163,0,0,0,233,6,0,0, + 0,233,3,0,0,0,41,2,114,0,0,0,0,114,0,0, + 0,0,41,6,218,14,65,115,115,101,114,116,105,111,110,69, + 114,114,111,114,114,28,0,0,0,114,169,0,0,0,114,26, + 0,0,0,218,10,73,110,100,101,120,69,114,114,111,114,114, + 154,0,0,0,41,6,114,32,0,0,0,114,13,0,0,0, + 114,54,0,0,0,114,131,0,0,0,114,132,0,0,0,90, + 17,117,110,99,111,109,112,114,101,115,115,101,100,95,115,105, + 122,101,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,151,0,0,0,152,2,0,0,115,20,0,0,0,0, + 1,2,2,20,1,12,1,10,3,8,1,8,1,8,1,16, + 1,20,1,114,151,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, + 0,115,86,0,0,0,124,1,100,1,100,0,133,2,25,0, + 100,2,107,6,115,20,116,0,130,1,124,1,100,0,100,1, + 133,2,25,0,125,1,122,14,124,0,106,1,124,1,25,0, + 125,2,87,0,110,22,4,0,116,2,107,10,114,68,1,0, + 1,0,1,0,89,0,100,0,83,0,88,0,116,3,124,0, + 106,4,124,2,131,2,83,0,100,0,83,0,41,3,78,114, + 14,0,0,0,114,170,0,0,0,41,5,114,175,0,0,0, + 114,28,0,0,0,114,26,0,0,0,114,52,0,0,0,114, + 29,0,0,0,41,3,114,32,0,0,0,114,13,0,0,0, + 114,54,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,149,0,0,0,171,2,0,0,115,14,0, + 0,0,0,2,20,1,12,2,2,1,14,1,14,1,8,2, + 114,149,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,11,0,0,0,9,0,0,0,67,0,0,0,115,198, + 0,0,0,116,0,124,0,124,1,131,2,125,2,116,1,68, + 0,93,160,92,3,125,3,125,4,125,5,124,2,124,3,23, + 0,125,6,116,2,106,3,100,1,124,0,106,4,116,5,124, + 6,100,2,100,3,141,5,1,0,122,14,124,0,106,6,124, + 6,25,0,125,7,87,0,110,20,4,0,116,7,107,10,114, + 88,1,0,1,0,1,0,89,0,113,14,88,0,124,7,100, + 4,25,0,125,8,116,8,124,0,106,4,124,7,131,2,125, + 9,124,4,114,132,116,9,124,0,124,8,124,6,124,1,124, + 9,131,5,125,10,110,10,116,10,124,8,124,9,131,2,125, + 10,124,10,100,0,107,8,114,152,113,14,124,7,100,4,25, + 0,125,8,124,10,124,5,124,8,102,3,2,0,1,0,83, + 0,113,14,116,11,100,5,124,1,155,2,157,2,124,1,100, + 6,141,2,130,1,100,0,83,0,41,7,78,122,13,116,114, + 121,105,110,103,32,123,125,123,125,123,125,114,86,0,0,0, + 41,1,90,9,118,101,114,98,111,115,105,116,121,114,0,0, + 0,0,114,57,0,0,0,114,58,0,0,0,41,12,114,36, + 0,0,0,114,89,0,0,0,114,76,0,0,0,114,77,0, + 0,0,114,29,0,0,0,114,20,0,0,0,114,28,0,0, + 0,114,26,0,0,0,114,52,0,0,0,114,155,0,0,0, + 114,161,0,0,0,114,3,0,0,0,41,11,114,32,0,0, + 0,114,38,0,0,0,114,13,0,0,0,114,90,0,0,0, + 114,91,0,0,0,114,47,0,0,0,114,63,0,0,0,114, + 54,0,0,0,114,40,0,0,0,114,126,0,0,0,114,46, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,44,0,0,0,186,2,0,0,115,36,0,0,0, + 0,1,10,1,14,1,8,1,22,1,2,1,14,1,14,1, + 6,2,8,1,12,1,4,1,18,2,10,1,8,3,2,1, + 8,1,16,2,114,44,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0, + 0,0,115,60,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,90,4,100,3,100,4,132,0,90,5,100, + 5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,100, + 9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,100, + 13,83,0,41,14,114,80,0,0,0,122,165,80,114,105,118, + 97,116,101,32,99,108,97,115,115,32,117,115,101,100,32,116, + 111,32,115,117,112,112,111,114,116,32,90,105,112,73,109,112, + 111,114,116,46,103,101,116,95,114,101,115,111,117,114,99,101, + 95,114,101,97,100,101,114,40,41,46,10,10,32,32,32,32, + 84,104,105,115,32,99,108,97,115,115,32,105,115,32,97,108, + 108,111,119,101,100,32,116,111,32,114,101,102,101,114,101,110, + 99,101,32,97,108,108,32,116,104,101,32,105,110,110,97,114, + 100,115,32,97,110,100,32,112,114,105,118,97,116,101,32,112, + 97,114,116,115,32,111,102,10,32,32,32,32,116,104,101,32, + 122,105,112,105,109,112,111,114,116,101,114,46,10,32,32,32, + 32,70,99,3,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, + 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0, + 114,88,0,0,0,41,2,114,4,0,0,0,114,38,0,0, + 0,41,3,114,32,0,0,0,114,4,0,0,0,114,38,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,34,0,0,0,220,2,0,0,115,4,0,0,0,0, + 1,6,1,122,33,95,90,105,112,73,109,112,111,114,116,82, + 101,115,111,117,114,99,101,82,101,97,100,101,114,46,95,95, + 105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115, + 92,0,0,0,124,0,106,0,160,1,100,1,100,2,161,2, + 125,2,124,2,155,0,100,2,124,1,155,0,157,3,125,3, + 100,3,100,4,108,2,109,3,125,4,1,0,122,18,124,4, + 124,0,106,4,160,5,124,3,161,1,131,1,87,0,83,0, + 4,0,116,6,107,10,114,86,1,0,1,0,1,0,116,7, + 124,3,131,1,130,1,89,0,110,2,88,0,100,0,83,0, + 41,5,78,114,85,0,0,0,114,109,0,0,0,114,0,0, + 0,0,41,1,218,7,66,121,116,101,115,73,79,41,8,114, + 38,0,0,0,114,19,0,0,0,90,2,105,111,114,177,0, + 0,0,114,4,0,0,0,114,55,0,0,0,114,22,0,0, + 0,218,17,70,105,108,101,78,111,116,70,111,117,110,100,69, + 114,114,111,114,41,5,114,32,0,0,0,218,8,114,101,115, + 111,117,114,99,101,218,16,102,117,108,108,110,97,109,101,95, + 97,115,95,112,97,116,104,114,13,0,0,0,114,177,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,13,111,112,101,110,95,114,101,115,111,117,114,99,101,224, + 2,0,0,115,14,0,0,0,0,1,14,1,14,1,12,1, + 2,1,18,1,14,1,122,38,95,90,105,112,73,109,112,111, + 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, + 46,111,112,101,110,95,114,101,115,111,117,114,99,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,8,0,0,0,116,0,130,1, + 100,0,83,0,114,88,0,0,0,41,1,114,178,0,0,0, + 41,2,114,32,0,0,0,114,179,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,13,114,101,115, + 111,117,114,99,101,95,112,97,116,104,233,2,0,0,115,2, + 0,0,0,0,4,122,38,95,90,105,112,73,109,112,111,114, + 116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,46, + 114,101,115,111,117,114,99,101,95,112,97,116,104,99,2,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0, + 0,0,67,0,0,0,115,72,0,0,0,124,0,106,0,160, + 1,100,1,100,2,161,2,125,2,124,2,155,0,100,2,124, + 1,155,0,157,3,125,3,122,16,124,0,106,2,160,3,124, + 3,161,1,1,0,87,0,110,22,4,0,116,4,107,10,114, + 66,1,0,1,0,1,0,89,0,100,3,83,0,88,0,100, + 4,83,0,41,5,78,114,85,0,0,0,114,109,0,0,0, + 70,84,41,5,114,38,0,0,0,114,19,0,0,0,114,4, + 0,0,0,114,55,0,0,0,114,22,0,0,0,41,4,114, + 32,0,0,0,114,59,0,0,0,114,180,0,0,0,114,13, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,11,105,115,95,114,101,115,111,117,114,99,101,239, + 2,0,0,115,14,0,0,0,0,3,14,1,14,1,2,1, + 16,1,14,1,8,1,122,36,95,90,105,112,73,109,112,111, + 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, + 46,105,115,95,114,101,115,111,117,114,99,101,99,1,0,0, + 0,0,0,0,0,0,0,0,0,9,0,0,0,9,0,0, + 0,99,0,0,0,115,186,0,0,0,100,1,100,2,108,0, + 109,1,125,1,1,0,124,1,124,0,106,2,160,3,124,0, + 106,4,161,1,131,1,125,2,124,2,160,5,124,0,106,2, + 106,6,161,1,125,3,124,3,106,7,100,3,107,2,115,58, + 116,8,130,1,124,3,106,9,125,4,116,10,131,0,125,5, + 124,0,106,2,106,11,68,0,93,102,125,6,122,18,124,1, + 124,6,131,1,160,5,124,4,161,1,125,7,87,0,110,24, + 4,0,116,12,107,10,114,124,1,0,1,0,1,0,89,0, + 113,78,89,0,110,2,88,0,124,7,106,9,106,7,125,8, + 116,13,124,8,131,1,100,1,107,2,114,156,124,7,106,7, + 86,0,1,0,113,78,124,8,124,5,107,7,114,78,124,5, + 160,14,124,8,161,1,1,0,124,8,86,0,1,0,113,78, + 100,0,83,0,41,4,78,114,0,0,0,0,41,1,218,4, + 80,97,116,104,114,60,0,0,0,41,15,90,7,112,97,116, + 104,108,105,98,114,184,0,0,0,114,4,0,0,0,114,56, + 0,0,0,114,38,0,0,0,90,11,114,101,108,97,116,105, + 118,101,95,116,111,114,29,0,0,0,114,59,0,0,0,114, + 175,0,0,0,90,6,112,97,114,101,110,116,218,3,115,101, + 116,114,28,0,0,0,114,23,0,0,0,114,51,0,0,0, + 218,3,97,100,100,41,9,114,32,0,0,0,114,184,0,0, + 0,90,13,102,117,108,108,110,97,109,101,95,112,97,116,104, + 90,13,114,101,108,97,116,105,118,101,95,112,97,116,104,90, + 12,112,97,99,107,97,103,101,95,112,97,116,104,90,12,115, + 117,98,100,105,114,115,95,115,101,101,110,218,8,102,105,108, + 101,110,97,109,101,90,8,114,101,108,97,116,105,118,101,90, + 11,112,97,114,101,110,116,95,110,97,109,101,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,8,99,111,110, + 116,101,110,116,115,250,2,0,0,115,34,0,0,0,0,8, + 12,1,18,1,14,3,14,1,6,1,6,1,12,1,2,1, + 18,1,14,1,10,5,8,1,12,1,10,1,8,1,10,1, + 122,33,95,90,105,112,73,109,112,111,114,116,82,101,115,111, + 117,114,99,101,82,101,97,100,101,114,46,99,111,110,116,101, + 110,116,115,78,41,10,114,6,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,84,0,0,0,114,81,0,0,0,114, + 34,0,0,0,114,181,0,0,0,114,182,0,0,0,114,183, + 0,0,0,114,188,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,80,0,0, + 0,212,2,0,0,115,14,0,0,0,8,1,4,5,4,2, + 8,4,8,9,8,6,8,11,114,80,0,0,0,41,45,114, + 84,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109, + 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, + 114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90, + 17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, + 105,98,114,76,0,0,0,114,148,0,0,0,114,110,0,0, + 0,114,152,0,0,0,114,67,0,0,0,114,131,0,0,0, + 90,7,95,95,97,108,108,95,95,114,20,0,0,0,90,15, + 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,114, + 18,0,0,0,114,75,0,0,0,114,3,0,0,0,114,25, + 0,0,0,218,4,116,121,112,101,114,70,0,0,0,114,113, + 0,0,0,114,115,0,0,0,114,117,0,0,0,114,4,0, + 0,0,114,89,0,0,0,114,36,0,0,0,114,37,0,0, + 0,114,35,0,0,0,114,27,0,0,0,114,122,0,0,0, + 114,142,0,0,0,114,144,0,0,0,114,52,0,0,0,114, + 147,0,0,0,114,155,0,0,0,218,8,95,95,99,111,100, + 101,95,95,114,153,0,0,0,114,159,0,0,0,114,161,0, + 0,0,114,169,0,0,0,114,151,0,0,0,114,149,0,0, + 0,114,44,0,0,0,114,80,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 8,60,109,111,100,117,108,101,62,1,0,0,0,115,88,0, + 0,0,4,16,8,1,16,1,8,1,8,1,8,1,8,1, + 8,1,8,2,8,3,6,1,14,3,16,4,4,2,8,2, + 4,1,4,1,4,2,14,127,0,127,0,1,12,1,12,1, + 2,1,2,252,4,9,8,4,8,9,8,31,8,126,2,254, + 2,29,4,5,8,21,8,46,8,10,8,46,10,5,8,7, + 8,6,8,13,8,19,8,15,8,26, }; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 1084def9ce03..9880c0d624d5 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1250,6 +1250,13 @@ Py_FinalizeEx(void) /* nothing */; #endif + /* Clear all loghooks */ + /* We want minimal exposure of this function, so define the extern + * here. The linker should discover the correct function without + * exporting a symbol. */ + extern void _PySys_ClearAuditHooks(void); + _PySys_ClearAuditHooks(); + /* Destroy all modules */ PyImport_Cleanup(); diff --git a/Python/pystate.c b/Python/pystate.c index 879a5a91f8a3..41c66223390d 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -45,8 +45,19 @@ static void _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstat static _PyInitError _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) { + /* We preserve the hook across init, because there is + currently no public API to set it between runtime + initialization and interpreter initialization. */ + void *open_code_hook = runtime->open_code_hook; + void *open_code_userdata = runtime->open_code_userdata; + _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head; + memset(runtime, 0, sizeof(*runtime)); + runtime->open_code_hook = open_code_hook; + runtime->open_code_userdata = open_code_userdata; + runtime->audit_hook_head = audit_hook_head; + _PyGC_Initialize(&runtime->gc); _PyEval_Initialize(&runtime->ceval); _PyPreConfig_InitPythonConfig(&runtime->preconfig); @@ -181,6 +192,10 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime) PyInterpreterState * PyInterpreterState_New(void) { + if (PySys_Audit("cpython.PyInterpreterState_New", NULL) < 0) { + return NULL; + } + PyInterpreterState *interp = PyMem_RawMalloc(sizeof(PyInterpreterState)); if (interp == NULL) { return NULL; @@ -233,6 +248,8 @@ PyInterpreterState_New(void) interp->tstate_next_unique_id = 0; + interp->audit_hooks = NULL; + return interp; } @@ -240,11 +257,18 @@ PyInterpreterState_New(void) static void _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) { + if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) { + PyErr_Clear(); + } + HEAD_LOCK(runtime); for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) { PyThreadState_Clear(p); } HEAD_UNLOCK(runtime); + + Py_CLEAR(interp->audit_hooks); + _PyCoreConfig_Clear(&interp->core_config); Py_CLEAR(interp->codec_search_path); Py_CLEAR(interp->codec_search_cache); @@ -1057,6 +1081,10 @@ _PyThread_CurrentFrames(void) PyObject *result; PyInterpreterState *i; + if (PySys_Audit("sys._current_frames", NULL) < 0) { + return NULL; + } + result = PyDict_New(); if (result == NULL) return NULL; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index d2b27615903f..7219f548fd25 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1091,6 +1091,12 @@ run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals, co = PyAST_CompileObject(mod, filename, flags, -1, arena); if (co == NULL) return NULL; + + if (PySys_Audit("exec", "O", co) < 0) { + Py_DECREF(co); + return NULL; + } + v = run_eval_code_obj(co, globals, locals); Py_DECREF(co); return v; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 1735b90b33b9..5ebeacf0b7f3 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -22,7 +22,9 @@ Data members: #include "pycore_pymem.h" #include "pycore_pathconfig.h" #include "pycore_pystate.h" +#include "pycore_tupleobject.h" #include "pythread.h" +#include "pydtrace.h" #include "osdefs.h" #include @@ -111,6 +113,308 @@ PySys_SetObject(const char *name, PyObject *v) } } +static int +should_audit(void) +{ + PyThreadState *ts = _PyThreadState_GET(); + if (!ts) { + return 0; + } + PyInterpreterState *is = ts ? ts->interp : NULL; + return _PyRuntime.audit_hook_head + || (is && is->audit_hooks) + || PyDTrace_AUDIT_ENABLED(); +} + +int +PySys_Audit(const char *event, const char *argFormat, ...) +{ + PyObject *eventName = NULL; + PyObject *eventArgs = NULL; + PyObject *hooks = NULL; + PyObject *hook = NULL; + int res = -1; + + /* N format is inappropriate, because you do not know + whether the reference is consumed by the call. + Assert rather than exception for perf reasons */ + assert(!argFormat || !strchr(argFormat, 'N')); + + /* Early exit when no hooks are registered */ + if (!should_audit()) { + return 0; + } + + _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head; + PyThreadState *ts = _PyThreadState_GET(); + PyInterpreterState *is = ts ? ts->interp : NULL; + int dtrace = PyDTrace_AUDIT_ENABLED(); + + PyObject *exc_type, *exc_value, *exc_tb; + if (ts) { + PyErr_Fetch(&exc_type, &exc_value, &exc_tb); + } + + /* Initialize event args now */ + if (argFormat && argFormat[0]) { + va_list args; + va_start(args, argFormat); + eventArgs = Py_VaBuildValue(argFormat, args); + if (eventArgs && !PyTuple_Check(eventArgs)) { + PyObject *argTuple = PyTuple_Pack(1, eventArgs); + Py_DECREF(eventArgs); + eventArgs = argTuple; + } + } else { + eventArgs = PyTuple_New(0); + } + if (!eventArgs) { + goto exit; + } + + /* Call global hooks */ + for (; e; e = e->next) { + if (e->hookCFunction(event, eventArgs, e->userData) < 0) { + goto exit; + } + } + + /* Dtrace USDT point */ + if (dtrace) { + PyDTrace_AUDIT(event, (void *)eventArgs); + } + + /* Call interpreter hooks */ + if (is && is->audit_hooks) { + eventName = PyUnicode_FromString(event); + if (!eventName) { + goto exit; + } + + hooks = PyObject_GetIter(is->audit_hooks); + if (!hooks) { + goto exit; + } + + /* Disallow tracing in hooks unless explicitly enabled */ + ts->tracing++; + ts->use_tracing = 0; + while ((hook = PyIter_Next(hooks)) != NULL) { + PyObject *o; + int canTrace = -1; + o = PyObject_GetAttrString(hook, "__cantrace__"); + if (o) { + canTrace = PyObject_IsTrue(o); + Py_DECREF(o); + } else if (PyErr_Occurred() && + PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + canTrace = 0; + } + if (canTrace < 0) { + break; + } + if (canTrace) { + ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc); + ts->tracing--; + } + o = PyObject_CallFunctionObjArgs(hook, eventName, + eventArgs, NULL); + if (canTrace) { + ts->tracing++; + ts->use_tracing = 0; + } + if (!o) { + break; + } + Py_DECREF(o); + Py_CLEAR(hook); + } + ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc); + ts->tracing--; + if (PyErr_Occurred()) { + goto exit; + } + } + + res = 0; + +exit: + Py_XDECREF(hook); + Py_XDECREF(hooks); + Py_XDECREF(eventName); + Py_XDECREF(eventArgs); + + if (ts) { + if (!res) { + PyErr_Restore(exc_type, exc_value, exc_tb); + } else { + assert(PyErr_Occurred()); + Py_XDECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); + } + } + + return res; +} + +/* We expose this function primarily for our own cleanup during + * finalization. In general, it should not need to be called, + * and as such it is not defined in any header files. + */ +void _PySys_ClearAuditHooks(void) { + /* Must be finalizing to clear hooks */ + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *ts = _PyRuntimeState_GetThreadState(runtime); + assert(!ts || _Py_CURRENTLY_FINALIZING(runtime, ts)); + if (!ts || !_Py_CURRENTLY_FINALIZING(runtime, ts)) + return; + + if (Py_VerboseFlag) { + PySys_WriteStderr("# clear sys.audit hooks\n"); + } + + /* Hooks can abort later hooks for this event, but cannot + abort the clear operation itself. */ + PySys_Audit("cpython._PySys_ClearAuditHooks", NULL); + PyErr_Clear(); + + _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n; + _PyRuntime.audit_hook_head = NULL; + while (e) { + n = e->next; + PyMem_RawFree(e); + e = n; + } +} + +int +PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) +{ + /* Invoke existing audit hooks to allow them an opportunity to abort. */ + /* Cannot invoke hooks until we are initialized */ + if (Py_IsInitialized()) { + if (PySys_Audit("sys.addaudithook", NULL) < 0) { + if (PyErr_ExceptionMatches(PyExc_Exception)) { + /* We do not report errors derived from Exception */ + PyErr_Clear(); + return 0; + } + return -1; + } + } + + _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head; + if (!e) { + e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry)); + _PyRuntime.audit_hook_head = e; + } else { + while (e->next) + e = e->next; + e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc( + sizeof(_Py_AuditHookEntry)); + } + + if (!e) { + if (Py_IsInitialized()) + PyErr_NoMemory(); + return -1; + } + + e->next = NULL; + e->hookCFunction = (Py_AuditHookFunction)hook; + e->userData = userData; + + return 0; +} + +/*[clinic input] +sys.addaudithook + + hook: object + +Adds a new audit hook callback. +[clinic start generated code]*/ + +static PyObject * +sys_addaudithook_impl(PyObject *module, PyObject *hook) +/*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/ +{ + /* Invoke existing audit hooks to allow them an opportunity to abort. */ + if (PySys_Audit("sys.addaudithook", NULL) < 0) { + if (PyErr_ExceptionMatches(PyExc_Exception)) { + /* We do not report errors derived from Exception */ + PyErr_Clear(); + Py_RETURN_NONE; + } + return NULL; + } + + PyInterpreterState *is = _PyInterpreterState_Get(); + + if (is->audit_hooks == NULL) { + is->audit_hooks = PyList_New(0); + if (is->audit_hooks == NULL) { + return NULL; + } + } + + if (PyList_Append(is->audit_hooks, hook) < 0) { + return NULL; + } + + Py_RETURN_NONE; +} + +PyDoc_STRVAR(audit_doc, +"audit(event, *args)\n\ +\n\ +Passes the event to any audit hooks that are attached."); + +static PyObject * +sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) +{ + if (argc == 0) { + PyErr_SetString(PyExc_TypeError, "audit() missing 1 required positional argument: 'event'"); + return NULL; + } + + if (!should_audit()) { + Py_RETURN_NONE; + } + + PyObject *auditEvent = args[0]; + if (!auditEvent) { + PyErr_SetString(PyExc_TypeError, "expected str for argument 'event'"); + return NULL; + } + if (!PyUnicode_Check(auditEvent)) { + PyErr_Format(PyExc_TypeError, "expected str for argument 'event', not %.200s", + Py_TYPE(auditEvent)->tp_name); + return NULL; + } + const char *event = PyUnicode_AsUTF8(auditEvent); + if (!event) { + return NULL; + } + + PyObject *auditArgs = _PyTuple_FromArray(args + 1, argc - 1); + if (!auditArgs) { + return NULL; + } + + int res = PySys_Audit(event, "O", auditArgs); + Py_DECREF(auditArgs); + + if (res < 0) { + return NULL; + } + + Py_RETURN_NONE; +} + + static PyObject * sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords) { @@ -1469,6 +1773,10 @@ sys__getframe_impl(PyObject *module, int depth) { PyFrameObject *f = _PyThreadState_GET()->frame; + if (PySys_Audit("sys._getframe", "O", f) < 0) { + return NULL; + } + while (depth > 0 && f != NULL) { f = f->f_back; --depth; @@ -1642,8 +1950,11 @@ sys_getandroidapilevel_impl(PyObject *module) #endif /* ANDROID_API_LEVEL */ + static PyMethodDef sys_methods[] = { /* Might as well keep this in alphabetic order */ + SYS_ADDAUDITHOOK_METHODDEF + {"audit", (PyCFunction)(void(*)(void))sys_audit, METH_FASTCALL, audit_doc }, {"breakpointhook", (PyCFunction)(void(*)(void))sys_breakpointhook, METH_FASTCALL | METH_KEYWORDS, breakpointhook_doc}, SYS_CALLSTATS_METHODDEF From webhook-mailer at python.org Thu May 23 16:30:05 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Thu, 23 May 2019 20:30:05 -0000 Subject: [Python-checkins] bpo-23395: Fix PyErr_SetInterrupt if the SIGINT signal is ignored or not handled (GH-7778) Message-ID: https://github.com/python/cpython/commit/608876b6b1eb59538e6c29671a733033fb8b5be7 commit: 608876b6b1eb59538e6c29671a733033fb8b5be7 branch: master author: Mat?j Cepl committer: Antoine Pitrou date: 2019-05-23T22:30:00+02:00 summary: bpo-23395: Fix PyErr_SetInterrupt if the SIGINT signal is ignored or not handled (GH-7778) ``_thread.interrupt_main()`` now avoids setting the Python error status if the ``SIGINT`` signal is ignored or not handled by Python. files: A Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst M Doc/c-api/exceptions.rst M Doc/library/_thread.rst M Lib/test/test_threading.py M Misc/ACKS M Modules/signalmodule.c diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 18ff697a2325..d3f6daa8347e 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -519,13 +519,13 @@ Signal Handling single: SIGINT single: KeyboardInterrupt (built-in exception) - This function simulates the effect of a :const:`SIGINT` signal arriving --- the - next time :c:func:`PyErr_CheckSignals` is called, :exc:`KeyboardInterrupt` will - be raised. It may be called without holding the interpreter lock. - - .. % XXX This was described as obsolete, but is used in - .. % _thread.interrupt_main() (used from IDLE), so it's still needed. + Simulate the effect of a :const:`SIGINT` signal arriving. The next time + :c:func:`PyErr_CheckSignals` is called, the Python signal handler for + :const:`SIGINT` will be called. + If :const:`SIGINT` isn't handled by Python (it was set to + :data:`signal.SIG_DFL` or :data:`signal.SIG_IGN`), this function does + nothing. .. c:function:: int PySignal_SetWakeupFd(int fd) diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index d7814f218b50..a6ce945c7205 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -53,8 +53,12 @@ This module defines the following constants and functions: .. function:: interrupt_main() - Raise a :exc:`KeyboardInterrupt` exception in the main thread. A subthread can - use this function to interrupt the main thread. + Simulate the effect of a :data:`signal.SIGINT` signal arriving in the main + thread. A thread can use this function to interrupt the main thread. + + If :data:`signal.SIGINT` isn't handled by Python (it was set to + :data:`signal.SIG_DFL` or :data:`signal.SIG_IGN`), this function does + nothing. .. function:: exit() diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 33a25f3b9d23..3bfd6fa474ed 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -16,6 +16,7 @@ import weakref import os import subprocess +import signal from test import lock_tests from test import support @@ -1168,6 +1169,7 @@ class BoundedSemaphoreTests(lock_tests.BoundedSemaphoreTests): class BarrierTests(lock_tests.BarrierTests): barriertype = staticmethod(threading.Barrier) + class MiscTestCase(unittest.TestCase): def test__all__(self): extra = {"ThreadError"} @@ -1175,5 +1177,38 @@ def test__all__(self): support.check__all__(self, threading, ('threading', '_thread'), extra=extra, blacklist=blacklist) + +class InterruptMainTests(unittest.TestCase): + def test_interrupt_main_subthread(self): + # Calling start_new_thread with a function that executes interrupt_main + # should raise KeyboardInterrupt upon completion. + def call_interrupt(): + _thread.interrupt_main() + t = threading.Thread(target=call_interrupt) + with self.assertRaises(KeyboardInterrupt): + t.start() + t.join() + t.join() + + def test_interrupt_main_mainthread(self): + # Make sure that if interrupt_main is called in main thread that + # KeyboardInterrupt is raised instantly. + with self.assertRaises(KeyboardInterrupt): + _thread.interrupt_main() + + def test_interrupt_main_noerror(self): + handler = signal.getsignal(signal.SIGINT) + try: + # No exception should arise. + signal.signal(signal.SIGINT, signal.SIG_IGN) + _thread.interrupt_main() + + signal.signal(signal.SIGINT, signal.SIG_DFL) + _thread.interrupt_main() + finally: + # Restore original handler + signal.signal(signal.SIGINT, handler) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/ACKS b/Misc/ACKS index fbed14684b31..5c23df8c5899 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -261,7 +261,7 @@ Donn Cave Charles Cazabon Jes?s Cea Avi?n Per Cederqvist -Matej Cepl +Mat?j Cepl Carl Cerecke Octavian Cerna Michael Cetrulo diff --git a/Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst b/Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst new file mode 100644 index 000000000000..ec95320ab411 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst @@ -0,0 +1,2 @@ +``_thread.interrupt_main()`` now avoids setting the Python error status +if the ``SIGINT`` signal is ignored or not handled by Python. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index b5e6250b1b40..221b74fac65e 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1683,13 +1683,18 @@ _PyErr_CheckSignals(void) } -/* Replacements for intrcheck.c functionality - * Declared in pyerrors.h - */ +/* Simulate the effect of a signal.SIGINT signal arriving. The next time + PyErr_CheckSignals is called, the Python SIGINT signal handler will be + raised. + + Missing signal handler for the SIGINT signal is silently ignored. */ void PyErr_SetInterrupt(void) { - trip_signal(SIGINT); + if ((Handlers[SIGINT].func != IgnoreHandler) && + (Handlers[SIGINT].func != DefaultHandler)) { + trip_signal(SIGINT); + } } void From webhook-mailer at python.org Thu May 23 19:53:26 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 23 May 2019 23:53:26 -0000 Subject: [Python-checkins] Fix warning in _testembed.c (GH-13533) Message-ID: https://github.com/python/cpython/commit/cccc11b38e5409861f4db345a4dd45dcc9ba470c commit: cccc11b38e5409861f4db345a4dd45dcc9ba470c branch: master author: Pablo Galindo committer: GitHub date: 2019-05-24T00:53:21+01:00 summary: Fix warning in _testembed.c (GH-13533) files: M Programs/_testembed.c diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 21d3b445d775..de1c5877f0f5 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1231,15 +1231,13 @@ static int _audit_subinterpreter_hook(const char *event, PyObject *args, void *u static int test_audit_subinterpreter(void) { - PyThreadState *ts; - Py_IgnoreEnvironmentFlag = 0; PySys_AddAuditHook(_audit_subinterpreter_hook, NULL); _testembed_Py_Initialize(); - ts = Py_NewInterpreter(); - ts = Py_NewInterpreter(); - ts = Py_NewInterpreter(); + Py_NewInterpreter(); + Py_NewInterpreter(); + Py_NewInterpreter(); Py_Finalize(); From webhook-mailer at python.org Fri May 24 05:19:48 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Fri, 24 May 2019 09:19:48 -0000 Subject: [Python-checkins] bpo-34626: Document creating heap types from the C-API (GH-9154) Message-ID: https://github.com/python/cpython/commit/f1e17e9f97d9a4e97a5d99574775ee343a3a74fb commit: f1e17e9f97d9a4e97a5d99574775ee343a3a74fb branch: master author: Petr Viktorin committer: GitHub date: 2019-05-24T11:19:42+02:00 summary: bpo-34626: Document creating heap types from the C-API (GH-9154) bpo-34626: Document creating heap types from the C-API Add missing descriptions of PEP384's PyType_Spec and PyType_Slot, along with some introductory prose. files: M Doc/c-api/type.rst M Doc/c-api/typeobj.rst diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 2474df2c90ba..8f8367ab77c8 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -95,18 +95,6 @@ Type Objects from a type's base class. Return ``0`` on success, or return ``-1`` and sets an exception on error. -.. c:function:: PyObject* PyType_FromSpec(PyType_Spec *spec) - - Creates and returns a heap type object from the *spec* passed to the function. - -.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) - - Creates and returns a heap type object from the *spec*. In addition to that, - the created heap type contains all types contained by the *bases* tuple as base - types. This allows the caller to reference other heap types as base types. - - .. versionadded:: 3.3 - .. c:function:: void* PyType_GetSlot(PyTypeObject *type, int slot) Return the function pointer stored in the given slot. If the @@ -115,4 +103,107 @@ Type Objects Callers will typically cast the result pointer into the appropriate function type. + See :c:member:`PyType_Slot.slot` for possible values of the *slot* argument. + + An exception is raised if *type* is not a heap type. + .. versionadded:: 3.4 + + +Creating Heap-Allocated Types +............................. + +The following functions and structs are used to create +:ref:`heap types `. + +.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) + + Creates and returns a heap type object from the *spec*. + + If *bases* is a tuple, the created heap type contains all types contained + in it as base types. + + If *bases* is *NULL*, the *Py_tp_base* slot is used instead. + If that also is *NULL*, the new type derives from :class:`object`. + + This function calls :c:func:`PyType_Ready` on the new type. + + .. versionadded:: 3.3 + +.. c:function:: PyObject* PyType_FromSpec(PyType_Spec *spec) + + Equivalent to ``PyType_FromSpecWithBases(spec, NULL)``. + +.. c:type:: PyType_Spec + + Structure defining a type's behavior. + + .. c:member:: const char* PyType_Spec.name + + Name of the type, used to set :c:member:`PyTypeObject.tp_name`. + + .. c:member:: const char* PyType_Spec.doc + + Type docstring, used to set :c:member:`PyTypeObject.tp_doc`. + + .. c:member:: int PyType_Spec.basicsize + .. c:member:: int PyType_Spec.itemsize + + Size of the instance in bytes, used to set + :c:member:`PyTypeObject.tp_basicsize` and + :c:member:`PyTypeObject.tp_itemsize`. + + .. c:member:: int PyType_Spec.flags + + Type flags, used to set :c:member:`PyTypeObject.tp_flags`. + + If the ``Py_TPFLAGS_HEAPTYPE`` flag is not set, + :c:func:`PyType_FromSpecWithBases` sets it automatically. + + .. c:member:: PyType_Slot *PyType_Spec.slots + + Array of :c:type:`PyType_Slot` structures. + Terminated by the special slot value ``{0, NULL}``. + +.. c:type:: PyType_Slot + + Structure defining optional functionality of a type, containing a slot ID + and a value pointer. + + .. c:member:: int PyType_Slot.slot + + A slot ID. + + Slot IDs are named like the field names of the structures + :c:type:`PyTypeObject`, :c:type:`PyNumberMethods`, + :c:type:`PySequenceMethods`, :c:type:`PyMappingMethods` and + :c:type:`PyAsyncMethods` with an added ``Py_`` prefix. + For example, use: + + * ``Py_tp_dealloc`` to set :c:member:`PyTypeObject.tp_dealloc` + * ``Py_nb_add`` to set :c:member:`PyNumberMethods.nb_add` + * ``Py_sq_length`` to set :c:member:`PySequenceMethods.sq_length` + + The following fields cannot be set using *PyType_Spec* and *PyType_Slot*: + + * :c:member:`~PyTypeObject.tp_dict` + * :c:member:`~PyTypeObject.tp_mro` + * :c:member:`~PyTypeObject.tp_cache` + * :c:member:`~PyTypeObject.tp_subclasses` + * :c:member:`~PyTypeObject.tp_weaklist` + * :c:member:`~PyTypeObject.tp_print` + * :c:member:`~PyTypeObject.tp_weaklistoffset` + * :c:member:`~PyTypeObject.tp_dictoffset` + * :c:member:`~PyBufferProcs.bf_getbuffer` + * :c:member:`~PyBufferProcs.bf_releasebuffer` + + Setting :c:data:`Py_tp_bases` may be problematic on some platforms. + To avoid issues, use the *bases* argument of + :py:func:`PyType_FromSpecWithBases` instead. + + .. c:member:: void *PyType_Slot.pfunc + + The desired value of the slot. In most cases, this is a pointer + to a function. + + May not be *NULL*. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index b1d96db7f53d..e0ea9b9b5f96 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1822,16 +1822,35 @@ objects on the thread which called tp_dealloc will not violate any assumptions of the library. +.. _heap-types: + Heap Types ---------- -In addition to defining Python types statically, you can define them -dynamically (i.e. to the heap) using :c:func:`PyType_FromSpec` and -:c:func:`PyType_FromSpecWithBases`. +Traditionally, types defined in C code are *static*, that is, +a static :c:type:`PyTypeObject` structure is defined directly in code +and initialized using :c:func:`PyType_Ready`. + +This results in types that are limited relative to types defined in Python: -.. XXX Explain how to use PyType_FromSpec(). +* Static types are limited to one base, i.e. they cannot use multiple + inheritance. +* Static type objects (but not necessarily their instances) are immutable. + It is not possible to add or modify the type object's attributes from Python. +* Static type objects are shared across + :ref:`sub-interpreters `, so they should not + include any subinterpreter-specific state. -.. XXX Document PyType_Spec. +Also, since *PyTypeObject* is not part of the :ref:`stable ABI `, +any extension modules using static types must be compiled for a specific +Python minor version. + +An alternative to static types is *heap-allocated types*, or *heap types* +for short, which correspond closely to classes created by Python's +``class`` statement. + +This is done by filling a :c:type:`PyType_Spec` structure and calling +:c:func:`PyType_FromSpecWithBases`. .. _number-structs: From webhook-mailer at python.org Fri May 24 05:22:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 24 May 2019 09:22:43 -0000 Subject: [Python-checkins] bpo-23395: Fix PyErr_SetInterrupt if the SIGINT signal is ignored or not handled (GH-7778) Message-ID: https://github.com/python/cpython/commit/310f414bbd4d6ed1d8813f724c91ce9b4129c0ba commit: 310f414bbd4d6ed1d8813f724c91ce9b4129c0ba branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-24T02:22:38-07:00 summary: bpo-23395: Fix PyErr_SetInterrupt if the SIGINT signal is ignored or not handled (GH-7778) ``_thread.interrupt_main()`` now avoids setting the Python error status if the ``SIGINT`` signal is ignored or not handled by Python. (cherry picked from commit 608876b6b1eb59538e6c29671a733033fb8b5be7) Co-authored-by: Mat?j Cepl files: A Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst M Doc/c-api/exceptions.rst M Doc/library/_thread.rst M Lib/test/test_threading.py M Misc/ACKS M Modules/signalmodule.c diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 79e6f97a44c7..13e00b544818 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -516,13 +516,13 @@ Signal Handling single: SIGINT single: KeyboardInterrupt (built-in exception) - This function simulates the effect of a :const:`SIGINT` signal arriving --- the - next time :c:func:`PyErr_CheckSignals` is called, :exc:`KeyboardInterrupt` will - be raised. It may be called without holding the interpreter lock. - - .. % XXX This was described as obsolete, but is used in - .. % _thread.interrupt_main() (used from IDLE), so it's still needed. + Simulate the effect of a :const:`SIGINT` signal arriving. The next time + :c:func:`PyErr_CheckSignals` is called, the Python signal handler for + :const:`SIGINT` will be called. + If :const:`SIGINT` isn't handled by Python (it was set to + :data:`signal.SIG_DFL` or :data:`signal.SIG_IGN`), this function does + nothing. .. c:function:: int PySignal_SetWakeupFd(int fd) diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index acffabf24bad..d1c28f479e94 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -53,8 +53,12 @@ This module defines the following constants and functions: .. function:: interrupt_main() - Raise a :exc:`KeyboardInterrupt` exception in the main thread. A subthread can - use this function to interrupt the main thread. + Simulate the effect of a :data:`signal.SIGINT` signal arriving in the main + thread. A thread can use this function to interrupt the main thread. + + If :data:`signal.SIGINT` isn't handled by Python (it was set to + :data:`signal.SIG_DFL` or :data:`signal.SIG_IGN`), this function does + nothing. .. function:: exit() diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 27f328dbe63c..aa810bda1c2a 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -16,6 +16,7 @@ import weakref import os import subprocess +import signal from test import lock_tests from test import support @@ -1165,6 +1166,7 @@ class BoundedSemaphoreTests(lock_tests.BoundedSemaphoreTests): class BarrierTests(lock_tests.BarrierTests): barriertype = staticmethod(threading.Barrier) + class MiscTestCase(unittest.TestCase): def test__all__(self): extra = {"ThreadError"} @@ -1172,5 +1174,38 @@ def test__all__(self): support.check__all__(self, threading, ('threading', '_thread'), extra=extra, blacklist=blacklist) + +class InterruptMainTests(unittest.TestCase): + def test_interrupt_main_subthread(self): + # Calling start_new_thread with a function that executes interrupt_main + # should raise KeyboardInterrupt upon completion. + def call_interrupt(): + _thread.interrupt_main() + t = threading.Thread(target=call_interrupt) + with self.assertRaises(KeyboardInterrupt): + t.start() + t.join() + t.join() + + def test_interrupt_main_mainthread(self): + # Make sure that if interrupt_main is called in main thread that + # KeyboardInterrupt is raised instantly. + with self.assertRaises(KeyboardInterrupt): + _thread.interrupt_main() + + def test_interrupt_main_noerror(self): + handler = signal.getsignal(signal.SIGINT) + try: + # No exception should arise. + signal.signal(signal.SIGINT, signal.SIG_IGN) + _thread.interrupt_main() + + signal.signal(signal.SIGINT, signal.SIG_DFL) + _thread.interrupt_main() + finally: + # Restore original handler + signal.signal(signal.SIGINT, handler) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/ACKS b/Misc/ACKS index 6664f711f63e..40e799088645 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -257,7 +257,7 @@ Donn Cave Charles Cazabon Jes?s Cea Avi?n Per Cederqvist -Matej Cepl +Mat?j Cepl Carl Cerecke Octavian Cerna Michael Cetrulo diff --git a/Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst b/Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst new file mode 100644 index 000000000000..ec95320ab411 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst @@ -0,0 +1,2 @@ +``_thread.interrupt_main()`` now avoids setting the Python error status +if the ``SIGINT`` signal is ignored or not handled by Python. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index e70c6fc3969a..a0722b731c87 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1562,13 +1562,18 @@ PyErr_CheckSignals(void) } -/* Replacements for intrcheck.c functionality - * Declared in pyerrors.h - */ +/* Simulate the effect of a signal.SIGINT signal arriving. The next time + PyErr_CheckSignals is called, the Python SIGINT signal handler will be + raised. + + Missing signal handler for the SIGINT signal is silently ignored. */ void PyErr_SetInterrupt(void) { - trip_signal(SIGINT); + if ((Handlers[SIGINT].func != IgnoreHandler) && + (Handlers[SIGINT].func != DefaultHandler)) { + trip_signal(SIGINT); + } } void From webhook-mailer at python.org Fri May 24 06:43:35 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 24 May 2019 10:43:35 -0000 Subject: [Python-checkins] bpo-20285: Improve help docs for object (GH-4759) Message-ID: https://github.com/python/cpython/commit/c95c93d4eb0519beaa06e6b6e0ecca7c2a58f69c commit: c95c93d4eb0519beaa06e6b6e0ecca7c2a58f69c branch: master author: Cheryl Sabella committer: GitHub date: 2019-05-24T06:43:29-04:00 summary: bpo-20285: Improve help docs for object (GH-4759) files: A Misc/NEWS.d/next/Documentation/2017-12-08-20-30-37.bpo-20285.cfnp0J.rst M Lib/pydoc.py M Objects/typeobject.c diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 86ccfe041f66..679a596821f4 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -867,7 +867,7 @@ def spilldata(msg, attrs, predicate): thisclass = attrs[0][2] attrs, inherited = _split_list(attrs, lambda t: t[2] is thisclass) - if thisclass is builtins.object: + if object is not builtins.object and thisclass is builtins.object: attrs = inherited continue elif thisclass is object: @@ -1327,7 +1327,7 @@ def spilldata(msg, attrs, predicate): thisclass = attrs[0][2] attrs, inherited = _split_list(attrs, lambda t: t[2] is thisclass) - if thisclass is builtins.object: + if object is not builtins.object and thisclass is builtins.object: attrs = inherited continue elif thisclass is object: diff --git a/Misc/NEWS.d/next/Documentation/2017-12-08-20-30-37.bpo-20285.cfnp0J.rst b/Misc/NEWS.d/next/Documentation/2017-12-08-20-30-37.bpo-20285.cfnp0J.rst new file mode 100644 index 000000000000..ebe0c3f95e45 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2017-12-08-20-30-37.bpo-20285.cfnp0J.rst @@ -0,0 +1,3 @@ +Expand object.__doc__ (docstring) to make it clearer. +Modify pydoc.py so that help(object) lists object methods +(for other classes, help omits methods of the object base class.) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 49b45b8518cc..339f7285292c 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4750,6 +4750,11 @@ static PyMethodDef object_methods[] = { {0} }; +PyDoc_STRVAR(object_doc, +"object()\n--\n\n" +"The base class of the class hierarchy.\n\n" +"When called, it accepts no arguments and returns a new featureless\n" +"instance that has no instance attributes and cannot be given any.\n"); PyTypeObject PyBaseObject_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) @@ -4772,7 +4777,7 @@ PyTypeObject PyBaseObject_Type = { PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - PyDoc_STR("object()\n--\n\nThe most base type"), /* tp_doc */ + object_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ object_richcompare, /* tp_richcompare */ From webhook-mailer at python.org Fri May 24 07:17:54 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 24 May 2019 11:17:54 -0000 Subject: [Python-checkins] Fix typo: decription -> description (GH-13543) Message-ID: https://github.com/python/cpython/commit/cf7d5ef49b1d28f35af137d23ec1a94f3eae090d commit: cf7d5ef49b1d28f35af137d23ec1a94f3eae090d branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-24T04:17:47-07:00 summary: Fix typo: decription -> description (GH-13543) files: M Doc/c-api/sys.rst diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 2091da6af0be..7d870a8d4e4a 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -332,7 +332,7 @@ accessible to C code. They all work with the current interpreter thread's functions may be called from different runtimes, this pointer should not refer directly to Python state. - See :pep:`578` for a detailed decription of auditing. Functions in the + See :pep:`578` for a detailed description of auditing. Functions in the runtime and standard library that raise events include the details in each function's documentation. From webhook-mailer at python.org Fri May 24 07:38:15 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 24 May 2019 11:38:15 -0000 Subject: [Python-checkins] bpo-36045: builtins.help() now prefixes `async` for async functions (GH-12010) Message-ID: https://github.com/python/cpython/commit/2a37f8f55b543589cc77a67b5cd17cbd9d0311c9 commit: 2a37f8f55b543589cc77a67b5cd17cbd9d0311c9 branch: master author: Dan Rose committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-24T04:38:01-07:00 summary: bpo-36045: builtins.help() now prefixes `async` for async functions (GH-12010) Previously, it was hard to tell whether a function should be awaited. It was also incorrect (per PEP 484) to put this in the type hint for coroutine functions. Added this info to the output of builtins.help and pydoc. https://bugs.python.org/issue36045 files: A Misc/NEWS.d/next/Core and Builtins/2019-02-24-12-44-46.bpo-36045.RO20OV.rst M Lib/pydoc.py M Lib/test/test_pydoc.py diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 679a596821f4..9a22e56686f6 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -951,6 +951,12 @@ def docroutine(self, object, name=None, mod=None, else: note = ' unbound %s method' % self.classlink(imclass,mod) + if (inspect.iscoroutinefunction(object) or + inspect.isasyncgenfunction(object)): + asyncqualifier = 'async ' + else: + asyncqualifier = '' + if name == realname: title = '%s' % (anchor, realname) else: @@ -979,8 +985,8 @@ def docroutine(self, object, name=None, mod=None, if not argspec: argspec = '(...)' - decl = title + self.escape(argspec) + (note and self.grey( - '%s' % note)) + decl = asyncqualifier + title + self.escape(argspec) + (note and + self.grey('%s' % note)) if skipdocs: return '
    %s
    \n' % decl @@ -1382,6 +1388,12 @@ def docroutine(self, object, name=None, mod=None, cl=None): else: note = ' unbound %s method' % classname(imclass,mod) + if (inspect.iscoroutinefunction(object) or + inspect.isasyncgenfunction(object)): + asyncqualifier = 'async ' + else: + asyncqualifier = '' + if name == realname: title = self.bold(realname) else: @@ -1405,7 +1417,7 @@ def docroutine(self, object, name=None, mod=None, cl=None): argspec = argspec[1:-1] # remove parentheses if not argspec: argspec = '(...)' - decl = title + argspec + note + decl = asyncqualifier + title + argspec + note if skipdocs: return decl + '\n' diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 67c6c5d42d48..6efdeb047c21 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -1288,6 +1288,29 @@ class X: Custom descriptor """) + def test_async_annotation(self): + async def coro_function(ign) -> int: + return 1 + + text = pydoc.plain(pydoc.plaintext.document(coro_function)) + self.assertIn('async coro_function', text) + + html = pydoc.HTMLDoc().document(coro_function) + self.assertIn( + 'async coro_function', + html) + + def test_async_generator_annotation(self): + async def an_async_generator(): + yield 1 + + text = pydoc.plain(pydoc.plaintext.document(an_async_generator)) + self.assertIn('async an_async_generator', text) + + html = pydoc.HTMLDoc().document(an_async_generator) + self.assertIn( + 'async an_async_generator', + html) class PydocServerTest(unittest.TestCase): """Tests for pydoc._start_server""" diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-24-12-44-46.bpo-36045.RO20OV.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-24-12-44-46.bpo-36045.RO20OV.rst new file mode 100644 index 000000000000..7cab3ea8409d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-24-12-44-46.bpo-36045.RO20OV.rst @@ -0,0 +1 @@ +builtins.help() now prefixes `async` for async functions From webhook-mailer at python.org Fri May 24 07:44:00 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 11:44:00 -0000 Subject: [Python-checkins] bpo-37031: Reuse _PyRuntime.main_thread in signalmodule.c (GH-13538) Message-ID: https://github.com/python/cpython/commit/d8613dc86f4c7acd3e2598095c466fe9dc0ad27c commit: d8613dc86f4c7acd3e2598095c466fe9dc0ad27c branch: master author: Victor Stinner committer: GitHub date: 2019-05-24T13:43:55+02:00 summary: bpo-37031: Reuse _PyRuntime.main_thread in signalmodule.c (GH-13538) Remove main_thread and main_interp variables from signalmodule.c: reuse _PyRuntime which already track the main thread and the main interpreter. * Remove #include which became useless: getpid() call has been removed. * Add runtime argument to is_main() * is_main() now gets the interpreter from runtime. files: M Modules/signalmodule.c diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 221b74fac65e..ed3852d444e8 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -99,10 +99,7 @@ class sigset_t_converter(CConverter): may not be the thread that received the signal. */ -#include /* For pid_t */ #include "pythread.h" -static unsigned long main_thread; -static PyInterpreterState *main_interp; static volatile struct { _Py_atomic_int tripped; @@ -190,10 +187,12 @@ itimer_retval(struct itimerval *iv) #endif static int -is_main(void) +is_main(_PyRuntimeState *runtime) { - return PyThread_get_thread_ident() == main_thread && - _PyInterpreterState_Get() == main_interp; + unsigned long thread = PyThread_get_thread_ident(); + PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; + return (thread == runtime->main_thread + && interp == runtime->interpreters.main); } static PyObject * @@ -474,7 +473,9 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler) return NULL; } #endif - if (!is_main()) { + + _PyRuntimeState *runtime = &_PyRuntime; + if (!is_main(runtime)) { PyErr_SetString(PyExc_ValueError, "signal only works in main thread"); return NULL; @@ -691,7 +692,8 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds) return NULL; #endif - if (!is_main()) { + _PyRuntimeState *runtime = &_PyRuntime; + if (!is_main(runtime)) { PyErr_SetString(PyExc_ValueError, "set_wakeup_fd only works in main thread"); return NULL; @@ -1329,9 +1331,6 @@ PyInit__signal(void) PyObject *m, *d, *x; int i; - main_thread = PyThread_get_thread_ident(); - main_interp = _PyInterpreterState_Get(); - /* Create the module and add the functions */ m = PyModule_Create(&signalmodule); if (m == NULL) @@ -1622,7 +1621,8 @@ finisignal(void) int PyErr_CheckSignals(void) { - if (!is_main()) { + _PyRuntimeState *runtime = &_PyRuntime; + if (!is_main(runtime)) { return 0; } @@ -1716,7 +1716,8 @@ int PyOS_InterruptOccurred(void) { if (_Py_atomic_load_relaxed(&Handlers[SIGINT].tripped)) { - if (!is_main()) { + _PyRuntimeState *runtime = &_PyRuntime; + if (!is_main(runtime)) { return 0; } _Py_atomic_store_relaxed(&Handlers[SIGINT].tripped, 0); @@ -1744,14 +1745,13 @@ _PySignal_AfterFork(void) * in both processes if they came in just before the fork() but before * the interpreter had an opportunity to call the handlers. issue9535. */ _clear_pending_signals(); - main_thread = PyThread_get_thread_ident(); - main_interp = _PyInterpreterState_Get(); } int _PyOS_IsMainThread(void) { - return is_main(); + _PyRuntimeState *runtime = &_PyRuntime; + return is_main(runtime); } #ifdef MS_WINDOWS From webhook-mailer at python.org Fri May 24 07:44:27 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 11:44:27 -0000 Subject: [Python-checkins] bpo-36710: Add tstate parameter in errors.c (GH-13540) Message-ID: https://github.com/python/cpython/commit/b4bdecd0fc9112b60a81fec171bc78bc13f2f59c commit: b4bdecd0fc9112b60a81fec171bc78bc13f2f59c branch: master author: Victor Stinner committer: GitHub date: 2019-05-24T13:44:24+02:00 summary: bpo-36710: Add tstate parameter in errors.c (GH-13540) Add 'PyThreadState *tstate' parameter to errors.c functions to avoid relying on global variables (indirectly on _PyRuntime). files: M Python/errors.c diff --git a/Python/errors.c b/Python/errors.c index 1b8b7eeb0e74..d9b69d9dc6ca 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -27,10 +27,16 @@ _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(stderr); -void -PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback) +/* Forward declaration */ +static void _PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, + PyObject **p_value, PyObject **p_traceback); +static void _PyErr_Clear(PyThreadState *tstate); + + +static void +_PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value, + PyObject *traceback) { - PyThreadState *tstate = _PyThreadState_GET(); PyObject *oldtype, *oldvalue, *oldtraceback; if (traceback != NULL && !PyTraceBack_Check(traceback)) { @@ -55,6 +61,14 @@ PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback) Py_XDECREF(oldtraceback); } +void +PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback) +{ + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_Restore(tstate, type, value, traceback); +} + + _PyErr_StackItem * _PyErr_GetTopmostException(PyThreadState *tstate) { @@ -81,10 +95,9 @@ _PyErr_CreateException(PyObject *exception, PyObject *value) } } -void -PyErr_SetObject(PyObject *exception, PyObject *value) +static void +_PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value) { - PyThreadState *tstate = _PyThreadState_GET(); PyObject *exc_value; PyObject *tb = NULL; @@ -107,7 +120,7 @@ PyErr_SetObject(PyObject *exception, PyObject *value) /* Issue #23571: functions must not be called with an exception set */ - PyErr_Clear(); + _PyErr_Clear(tstate); fixed_value = _PyErr_CreateException(exception, value); Py_XDECREF(value); @@ -142,7 +155,14 @@ PyErr_SetObject(PyObject *exception, PyObject *value) if (value != NULL && PyExceptionInstance_Check(value)) tb = PyException_GetTraceback(value); Py_XINCREF(exception); - PyErr_Restore(exception, value, tb); + _PyErr_Restore(tstate, exception, value, tb); +} + +void +PyErr_SetObject(PyObject *exception, PyObject *value) +{ + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_SetObject(tstate, exception, value); } /* Set a key error with the specified argument, wrapping it in a @@ -151,34 +171,60 @@ PyErr_SetObject(PyObject *exception, PyObject *value) void _PyErr_SetKeyError(PyObject *arg) { - PyObject *tup; - tup = PyTuple_Pack(1, arg); - if (!tup) - return; /* caller will expect error to be set anyway */ - PyErr_SetObject(PyExc_KeyError, tup); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *tup = PyTuple_Pack(1, arg); + if (!tup) { + /* caller will expect error to be set anyway */ + return; + } + _PyErr_SetObject(tstate, PyExc_KeyError, tup); Py_DECREF(tup); } +static void +_PyErr_SetNone(PyThreadState *tstate, PyObject *exception) +{ + _PyErr_SetObject(tstate, exception, (PyObject *)NULL); +} + + void PyErr_SetNone(PyObject *exception) { - PyErr_SetObject(exception, (PyObject *)NULL); + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_SetNone(tstate, exception); } -void -PyErr_SetString(PyObject *exception, const char *string) + +static void +_PyErr_SetString(PyThreadState *tstate, PyObject *exception, + const char *string) { PyObject *value = PyUnicode_FromString(string); - PyErr_SetObject(exception, value); + _PyErr_SetObject(tstate, exception, value); Py_XDECREF(value); } +void +PyErr_SetString(PyObject *exception, const char *string) +{ + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_SetString(tstate, exception, string); +} + + +static PyObject* +_PyErr_Occurred(PyThreadState *tstate) +{ + return tstate == NULL ? NULL : tstate->curexc_type; +} + PyObject* _Py_HOT_FUNCTION PyErr_Occurred(void) { PyThreadState *tstate = _PyThreadState_GET(); - return tstate == NULL ? NULL : tstate->curexc_type; + return _PyErr_Occurred(tstate); } @@ -217,7 +263,8 @@ PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc) int PyErr_ExceptionMatches(PyObject *exc) { - return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc); + PyThreadState *tstate = _PyThreadState_GET(); + return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc); } @@ -231,8 +278,9 @@ PyErr_ExceptionMatches(PyObject *exc) XXX: should PyErr_NormalizeException() also call PyException_SetTraceback() with the resulting value and tb? */ -void -PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) +static void +_PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc, + PyObject **val, PyObject **tb) { int recursion_depth = 0; PyObject *type, *value, *initial_tb; @@ -299,15 +347,16 @@ PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) Py_DECREF(value); recursion_depth++; if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) { - PyErr_SetString(PyExc_RecursionError, "maximum recursion depth " - "exceeded while normalizing an exception"); + _PyErr_SetString(tstate, PyExc_RecursionError, + "maximum recursion depth exceeded " + "while normalizing an exception"); } /* If the new exception doesn't set a traceback and the old exception had a traceback, use the old traceback for the new exception. It's better than nothing. */ initial_tb = *tb; - PyErr_Fetch(exc, val, tb); + _PyErr_Fetch(tstate, exc, val, tb); assert(*exc != NULL); if (initial_tb != NULL) { if (*tb == NULL) @@ -334,10 +383,17 @@ PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) void -PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) { PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_NormalizeException(tstate, exc, val, tb); +} + +static void +_PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value, + PyObject **p_traceback) +{ *p_type = tstate->curexc_type; *p_value = tstate->curexc_value; *p_traceback = tstate->curexc_traceback; @@ -347,12 +403,30 @@ PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) tstate->curexc_traceback = NULL; } + +void +PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +{ + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_Fetch(tstate, p_type, p_value, p_traceback); +} + + +static void +_PyErr_Clear(PyThreadState *tstate) +{ + _PyErr_Restore(tstate, NULL, NULL, NULL); +} + + void PyErr_Clear(void) { - PyErr_Restore(NULL, NULL, NULL); + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_Clear(tstate); } + void PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) { @@ -397,47 +471,49 @@ _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) if (exc == NULL) return; - if (PyErr_Occurred()) { + PyThreadState *tstate = _PyThreadState_GET(); + if (_PyErr_Occurred(tstate)) { PyObject *exc2, *val2, *tb2; - PyErr_Fetch(&exc2, &val2, &tb2); - PyErr_NormalizeException(&exc, &val, &tb); + _PyErr_Fetch(tstate, &exc2, &val2, &tb2); + _PyErr_NormalizeException(tstate, &exc, &val, &tb); if (tb != NULL) { PyException_SetTraceback(val, tb); Py_DECREF(tb); } Py_DECREF(exc); - PyErr_NormalizeException(&exc2, &val2, &tb2); + _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2); PyException_SetContext(val2, val); - PyErr_Restore(exc2, val2, tb2); + _PyErr_Restore(tstate, exc2, val2, tb2); } else { - PyErr_Restore(exc, val, tb); + _PyErr_Restore(tstate, exc, val, tb); } } static PyObject * -_PyErr_FormatVFromCause(PyObject *exception, const char *format, va_list vargs) +_PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception, + const char *format, va_list vargs) { PyObject *exc, *val, *val2, *tb; - assert(PyErr_Occurred()); - PyErr_Fetch(&exc, &val, &tb); - PyErr_NormalizeException(&exc, &val, &tb); + assert(_PyErr_Occurred(tstate)); + _PyErr_Fetch(tstate, &exc, &val, &tb); + _PyErr_NormalizeException(tstate, &exc, &val, &tb); if (tb != NULL) { PyException_SetTraceback(val, tb); Py_DECREF(tb); } Py_DECREF(exc); - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); PyErr_FormatV(exception, format, vargs); - PyErr_Fetch(&exc, &val2, &tb); - PyErr_NormalizeException(&exc, &val2, &tb); + _PyErr_Fetch(tstate, &exc, &val2, &tb); + _PyErr_NormalizeException(tstate, &exc, &val2, &tb); Py_INCREF(val); PyException_SetCause(val2, val); PyException_SetContext(val2, val); - PyErr_Restore(exc, val2, tb); + _PyErr_Restore(tstate, exc, val2, tb); return NULL; } @@ -445,13 +521,14 @@ _PyErr_FormatVFromCause(PyObject *exception, const char *format, va_list vargs) PyObject * _PyErr_FormatFromCause(PyObject *exception, const char *format, ...) { + PyThreadState *tstate = _PyThreadState_GET(); va_list vargs; #ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); #else va_start(vargs); #endif - _PyErr_FormatVFromCause(exception, format, vargs); + _PyErr_FormatVFromCause(tstate, exception, format, vargs); va_end(vargs); return NULL; } @@ -461,21 +538,23 @@ _PyErr_FormatFromCause(PyObject *exception, const char *format, ...) int PyErr_BadArgument(void) { - PyErr_SetString(PyExc_TypeError, - "bad argument type for built-in operation"); + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_SetString(tstate, PyExc_TypeError, + "bad argument type for built-in operation"); return 0; } PyObject * PyErr_NoMemory(void) { + PyThreadState *tstate = _PyThreadState_GET(); if (Py_TYPE(PyExc_MemoryError) == NULL) { /* PyErr_NoMemory() has been called before PyExc_MemoryError has been initialized by _PyExc_Init() */ Py_FatalError("Out of memory and PyExc_MemoryError is not " "initialized yet"); } - PyErr_SetNone(PyExc_MemoryError); + _PyErr_SetNone(tstate, PyExc_MemoryError); return NULL; } @@ -488,6 +567,7 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) PyObject * PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *message; PyObject *v, *args; int i = errno; @@ -573,7 +653,7 @@ PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, P v = PyObject_Call(exc, args, NULL); Py_DECREF(args); if (v != NULL) { - PyErr_SetObject((PyObject *) Py_TYPE(v), v); + _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v); Py_DECREF(v); } } @@ -626,12 +706,17 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects( PyObject *filenameObject, PyObject *filenameObject2) { + PyThreadState *tstate = _PyThreadState_GET(); int len; WCHAR *s_buf = NULL; /* Free via LocalFree */ PyObject *message; PyObject *args, *v; + DWORD err = (DWORD)ierr; - if (err==0) err = GetLastError(); + if (err==0) { + err = GetLastError(); + } + len = FormatMessageW( /* Error API error */ FORMAT_MESSAGE_ALLOCATE_BUFFER | @@ -676,7 +761,7 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects( v = PyObject_Call(exc, args, NULL); Py_DECREF(args); if (v != NULL) { - PyErr_SetObject((PyObject *) Py_TYPE(v), v); + _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v); Py_DECREF(v); } } @@ -752,6 +837,7 @@ PyObject * PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path) { + PyThreadState *tstate = _PyThreadState_GET(); int issubclass; PyObject *kwargs, *error; @@ -760,12 +846,14 @@ PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, return NULL; } else if (!issubclass) { - PyErr_SetString(PyExc_TypeError, "expected a subclass of ImportError"); + _PyErr_SetString(tstate, PyExc_TypeError, + "expected a subclass of ImportError"); return NULL; } if (msg == NULL) { - PyErr_SetString(PyExc_TypeError, "expected a message argument"); + _PyErr_SetString(tstate, PyExc_TypeError, + "expected a message argument"); return NULL; } @@ -789,7 +877,7 @@ PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, error = _PyObject_FastCallDict(exception, &msg, 1, kwargs); if (error != NULL) { - PyErr_SetObject((PyObject *)Py_TYPE(error), error); + _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error); Py_DECREF(error); } @@ -828,15 +916,16 @@ PyErr_BadInternalCall(void) PyObject * PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject* string; /* Issue #23571: PyUnicode_FromFormatV() must not be called with an exception set, it calls arbitrary Python code like PyObject_Repr() */ - PyErr_Clear(); + _PyErr_Clear(tstate); string = PyUnicode_FromFormatV(format, vargs); - PyErr_SetObject(exception, string); + _PyErr_SetObject(tstate, exception, string); Py_XDECREF(string); return NULL; } @@ -860,28 +949,31 @@ PyErr_Format(PyObject *exception, const char *format, ...) PyObject * PyErr_NewException(const char *name, PyObject *base, PyObject *dict) { + PyThreadState *tstate = _PyThreadState_GET(); _Py_IDENTIFIER(__module__); - const char *dot; PyObject *modulename = NULL; PyObject *classname = NULL; PyObject *mydict = NULL; PyObject *bases = NULL; PyObject *result = NULL; - dot = strrchr(name, '.'); + + const char *dot = strrchr(name, '.'); if (dot == NULL) { - PyErr_SetString(PyExc_SystemError, - "PyErr_NewException: name must be module.class"); + _PyErr_SetString(tstate, PyExc_SystemError, + "PyErr_NewException: name must be module.class"); return NULL; } - if (base == NULL) + if (base == NULL) { base = PyExc_Exception; + } if (dict == NULL) { dict = mydict = PyDict_New(); if (dict == NULL) goto failure; } + if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) { - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { goto failure; } modulename = PyUnicode_FromStringAndSize(name, @@ -983,8 +1075,8 @@ _PyErr_Init(void) static PyObject * -make_unraisable_hook_args(PyObject *exc_type, PyObject *exc_value, - PyObject *exc_tb, PyObject *obj) +make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type, + PyObject *exc_value, PyObject *exc_tb, PyObject *obj) { PyObject *args = PyStructSequence_New(&UnraisableHookArgsType); if (args == NULL) { @@ -1008,7 +1100,7 @@ make_unraisable_hook_args(PyObject *exc_type, PyObject *exc_value, ADD_ITEM(obj); #undef ADD_ITEM - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_DECREF(args); return NULL; } @@ -1023,8 +1115,9 @@ make_unraisable_hook_args(PyObject *exc_type, PyObject *exc_value, Do nothing if sys.stderr attribute doesn't exist or is set to None. */ static int -write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, - PyObject *exc_tb, PyObject *obj, PyObject *file) +write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, + PyObject *exc_value, PyObject *exc_tb, + PyObject *obj, PyObject *file) { if (obj != NULL && obj != Py_None) { if (PyFile_WriteString("Exception ignored in: ", file) < 0) { @@ -1032,7 +1125,7 @@ write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, } if (PyFile_WriteObject(obj, file, 0) < 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); if (PyFile_WriteString("", file) < 0) { return -1; } @@ -1045,7 +1138,7 @@ write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, if (exc_tb != NULL && exc_tb != Py_None) { if (PyTraceBack_Print(exc_tb, file) < 0) { /* continue even if writing the traceback failed */ - PyErr_Clear(); + _PyErr_Clear(tstate); } } @@ -1065,7 +1158,7 @@ write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__); if (moduleName == NULL || !PyUnicode_Check(moduleName)) { Py_XDECREF(moduleName); - PyErr_Clear(); + _PyErr_Clear(tstate); if (PyFile_WriteString("", file) < 0) { return -1; } @@ -1101,7 +1194,7 @@ write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, return -1; } if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); if (PyFile_WriteString("", file) < 0) { return -1; } @@ -1116,8 +1209,8 @@ write_unraisable_exc_file(PyObject *exc_type, PyObject *exc_value, static int -write_unraisable_exc(PyObject *exc_type, PyObject *exc_value, - PyObject *exc_tb, PyObject *obj) +write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type, + PyObject *exc_value, PyObject *exc_tb, PyObject *obj) { PyObject *file = _PySys_GetObjectId(&PyId_stderr); if (file == NULL || file == Py_None) { @@ -1127,7 +1220,7 @@ write_unraisable_exc(PyObject *exc_type, PyObject *exc_value, /* Hold a strong reference to ensure that sys.stderr doesn't go away while we use it */ Py_INCREF(file); - int res = write_unraisable_exc_file(exc_type, exc_value, exc_tb, + int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb, obj, file); Py_DECREF(file); @@ -1138,10 +1231,12 @@ write_unraisable_exc(PyObject *exc_type, PyObject *exc_value, PyObject* _PyErr_WriteUnraisableDefaultHook(PyObject *args) { + PyThreadState *tstate = _PyThreadState_GET(); + if (Py_TYPE(args) != &UnraisableHookArgsType) { - PyErr_SetString(PyExc_TypeError, - "sys.unraisablehook argument type " - "must be UnraisableHookArgs"); + _PyErr_SetString(tstate, PyExc_TypeError, + "sys.unraisablehook argument type " + "must be UnraisableHookArgs"); return NULL; } @@ -1151,7 +1246,7 @@ _PyErr_WriteUnraisableDefaultHook(PyObject *args) PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2); PyObject *obj = PyStructSequence_GET_ITEM(args, 3); - if (write_unraisable_exc(exc_type, exc_value, exc_tb, obj) < 0) { + if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, obj) < 0) { return NULL; } Py_RETURN_NONE; @@ -1168,9 +1263,11 @@ _PyErr_WriteUnraisableDefaultHook(PyObject *args) void PyErr_WriteUnraisable(PyObject *obj) { - PyObject *exc_type, *exc_value, *exc_tb; + PyThreadState *tstate = _PyThreadState_GET(); + assert(tstate != NULL); - PyErr_Fetch(&exc_type, &exc_value, &exc_tb); + PyObject *exc_type, *exc_value, *exc_tb; + _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); assert(exc_type != NULL); @@ -1180,20 +1277,20 @@ PyErr_WriteUnraisable(PyObject *obj) } if (exc_tb == NULL) { - struct _frame *frame = _PyThreadState_GET()->frame; + struct _frame *frame = tstate->frame; if (frame != NULL) { exc_tb = _PyTraceBack_FromFrame(NULL, frame); if (exc_tb == NULL) { - PyErr_Clear(); + _PyErr_Clear(tstate); } } } - PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb); + _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb); if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) { if (PyException_SetTraceback(exc_value, exc_tb) < 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); } } @@ -1202,7 +1299,8 @@ PyErr_WriteUnraisable(PyObject *obj) if (hook != NULL && hook != Py_None) { PyObject *hook_args; - hook_args = make_unraisable_hook_args(exc_type, exc_value, exc_tb, obj); + hook_args = make_unraisable_hook_args(tstate, exc_type, exc_value, + exc_tb, obj); if (hook_args != NULL) { PyObject *args[1] = {hook_args}; PyObject *res = _PyObject_FastCall(hook, args, 1); @@ -1217,20 +1315,20 @@ PyErr_WriteUnraisable(PyObject *obj) Py_XDECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); - PyErr_Fetch(&exc_type, &exc_value, &exc_tb); + _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); obj = hook; } default_hook: /* Call the default unraisable hook (ignore failure) */ - (void)write_unraisable_exc(exc_type, exc_value, exc_tb, obj); + (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, obj); done: Py_XDECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); - PyErr_Clear(); /* Just in case */ + _PyErr_Clear(tstate); /* Just in case */ } extern PyObject *PyModule_GetWarningsModule(void); @@ -1257,37 +1355,43 @@ PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) _Py_IDENTIFIER(offset); _Py_IDENTIFIER(print_file_and_line); _Py_IDENTIFIER(text); + PyThreadState *tstate = _PyThreadState_GET(); /* add attributes for the line number and filename for the error */ - PyErr_Fetch(&exc, &v, &tb); - PyErr_NormalizeException(&exc, &v, &tb); + _PyErr_Fetch(tstate, &exc, &v, &tb); + _PyErr_NormalizeException(tstate, &exc, &v, &tb); /* XXX check that it is, indeed, a syntax error. It might not * be, though. */ tmp = PyLong_FromLong(lineno); if (tmp == NULL) - PyErr_Clear(); + _PyErr_Clear(tstate); else { - if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) - PyErr_Clear(); + if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) { + _PyErr_Clear(tstate); + } Py_DECREF(tmp); } tmp = NULL; if (col_offset >= 0) { tmp = PyLong_FromLong(col_offset); - if (tmp == NULL) - PyErr_Clear(); + if (tmp == NULL) { + _PyErr_Clear(tstate); + } + } + if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) { + _PyErr_Clear(tstate); } - if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None)) - PyErr_Clear(); Py_XDECREF(tmp); if (filename != NULL) { - if (_PyObject_SetAttrId(v, &PyId_filename, filename)) - PyErr_Clear(); + if (_PyObject_SetAttrId(v, &PyId_filename, filename)) { + _PyErr_Clear(tstate); + } tmp = PyErr_ProgramTextObject(filename, lineno); if (tmp) { - if (_PyObject_SetAttrId(v, &PyId_text, tmp)) - PyErr_Clear(); + if (_PyObject_SetAttrId(v, &PyId_text, tmp)) { + _PyErr_Clear(tstate); + } Py_DECREF(tmp); } } @@ -1295,33 +1399,39 @@ PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) if (!_PyObject_HasAttrId(v, &PyId_msg)) { tmp = PyObject_Str(v); if (tmp) { - if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) - PyErr_Clear(); + if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) { + _PyErr_Clear(tstate); + } Py_DECREF(tmp); - } else { - PyErr_Clear(); + } + else { + _PyErr_Clear(tstate); } } if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) { if (_PyObject_SetAttrId(v, &PyId_print_file_and_line, - Py_None)) - PyErr_Clear(); + Py_None)) { + _PyErr_Clear(tstate); + } } } - PyErr_Restore(exc, v, tb); + _PyErr_Restore(tstate, exc, v, tb); } void PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *fileobj; if (filename != NULL) { fileobj = PyUnicode_DecodeFSDefault(filename); - if (fileobj == NULL) - PyErr_Clear(); + if (fileobj == NULL) { + _PyErr_Clear(tstate); + } } - else + else { fileobj = NULL; + } PyErr_SyntaxLocationObject(fileobj, lineno, col_offset); Py_XDECREF(fileobj); } @@ -1333,7 +1443,7 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) functionality in tb_displayline() in traceback.c. */ static PyObject * -err_programtext(FILE *fp, int lineno) +err_programtext(PyThreadState *tstate, FILE *fp, int lineno) { int i; char linebuf[1000]; @@ -1359,7 +1469,7 @@ err_programtext(FILE *fp, int lineno) PyObject *res; res = PyUnicode_FromString(linebuf); if (res == NULL) - PyErr_Clear(); + _PyErr_Clear(tstate); return res; } return NULL; @@ -1369,24 +1479,28 @@ PyObject * PyErr_ProgramText(const char *filename, int lineno) { FILE *fp; - if (filename == NULL || *filename == '\0' || lineno <= 0) + if (filename == NULL || *filename == '\0' || lineno <= 0) { return NULL; + } + PyThreadState *tstate = _PyThreadState_GET(); fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE); - return err_programtext(fp, lineno); + return err_programtext(tstate, fp, lineno); } PyObject * PyErr_ProgramTextObject(PyObject *filename, int lineno) { - FILE *fp; - if (filename == NULL || lineno <= 0) + if (filename == NULL || lineno <= 0) { return NULL; - fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE); + } + + PyThreadState *tstate = _PyThreadState_GET(); + FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE); if (fp == NULL) { - PyErr_Clear(); + _PyErr_Clear(tstate); return NULL; } - return err_programtext(fp, lineno); + return err_programtext(tstate, fp, lineno); } #ifdef __cplusplus From webhook-mailer at python.org Fri May 24 09:16:15 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 13:16:15 -0000 Subject: [Python-checkins] Support Py_UNUSED() on clang (GH-13544) Message-ID: https://github.com/python/cpython/commit/b3a9843cd19039808a812ca11206881c94c64e3b commit: b3a9843cd19039808a812ca11206881c94c64e3b branch: master author: Victor Stinner committer: GitHub date: 2019-05-24T15:16:08+02:00 summary: Support Py_UNUSED() on clang (GH-13544) files: M Doc/c-api/intro.rst M Include/pymacro.h diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index b003bbaeff2f..672936a458f4 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -156,7 +156,7 @@ complete listing. .. c:macro:: Py_UNUSED(arg) Use this for unused arguments in a function definition to silence compiler - warnings, e.g. ``PyObject* func(PyObject *Py_UNUSED(ignored))``. + warnings. Example: ``int func(int a, int Py_UNUSED(b)) { return a; }``. .. versionadded:: 3.4 diff --git a/Include/pymacro.h b/Include/pymacro.h index 546f9c6e7020..1890619099a3 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -89,10 +89,15 @@ /* Check if pointer "p" is aligned to "a"-bytes boundary. */ #define _Py_IS_ALIGNED(p, a) (!((uintptr_t)(p) & (uintptr_t)((a) - 1))) -#ifdef __GNUC__ -#define Py_UNUSED(name) _unused_ ## name __attribute__((unused)) +/* Use this for unused arguments in a function definition to silence compiler + * warnings. Example: + * + * int func(int a, int Py_UNUSED(b)) { return a; } + */ +#if defined(__GNUC__) || defined(__clang__) +# define Py_UNUSED(name) _unused_ ## name __attribute__((unused)) #else -#define Py_UNUSED(name) _unused_ ## name +# define Py_UNUSED(name) _unused_ ## name #endif #define Py_UNREACHABLE() abort() From webhook-mailer at python.org Fri May 24 09:20:28 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 13:20:28 -0000 Subject: [Python-checkins] bpo-37031: Fix PyOS_AfterFork_Child() (GH-13537) Message-ID: https://github.com/python/cpython/commit/b49858b4b7b4c9d85ef6946ad020f83e4fa1caa7 commit: b49858b4b7b4c9d85ef6946ad020f83e4fa1caa7 branch: master author: Victor Stinner committer: GitHub date: 2019-05-24T15:20:23+02:00 summary: bpo-37031: Fix PyOS_AfterFork_Child() (GH-13537) PyOS_AfterFork_Child(): _PyInterpreterState_DeleteExceptMain() must be called after _PyRuntimeState_ReInitThreads(). _PyRuntimeState_ReInitThreads() resets interpreters mutex after fork, mutex used by _PyInterpreterState_DeleteExceptMain(). files: M Modules/posixmodule.c diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 8ebe3a0be053..cd5b5ce082ec 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -448,11 +448,11 @@ PyOS_AfterFork_Child(void) { _PyRuntimeState *runtime = &_PyRuntime; _PyGILState_Reinit(runtime); - _PyInterpreterState_DeleteExceptMain(runtime); _PyEval_ReInitThreads(runtime); _PyImport_ReInitLock(); _PySignal_AfterFork(); _PyRuntimeState_ReInitThreads(runtime); + _PyInterpreterState_DeleteExceptMain(runtime); run_at_forkers(_PyInterpreterState_Get()->after_forkers_child, 0); } From webhook-mailer at python.org Fri May 24 09:50:51 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 24 May 2019 13:50:51 -0000 Subject: [Python-checkins] Fix typos in Doc/library/email.generator.rst documentation (GH-13539) Message-ID: https://github.com/python/cpython/commit/13d4e6a4a090031f8214e058ed3c8fd47767e05f commit: 13d4e6a4a090031f8214e058ed3c8fd47767e05f branch: master author: Nick Sung committer: Cheryl Sabella date: 2019-05-24T09:50:35-04:00 summary: Fix typos in Doc/library/email.generator.rst documentation (GH-13539) files: M Doc/library/email.generator.rst diff --git a/Doc/library/email.generator.rst b/Doc/library/email.generator.rst index c09ae8cbc604..2d9bae6a7ee5 100644 --- a/Doc/library/email.generator.rst +++ b/Doc/library/email.generator.rst @@ -36,7 +36,7 @@ something that contains only ASCII characters, using the standard email RFC Content Transfer Encoding techniques for encoding email messages for transport over channels that are not "8 bit clean". -To accomodate reproducible processing of SMIME-signed messages +To accommodate reproducible processing of SMIME-signed messages :class:`Generator` disables header folding for message parts of type ``multipart/signed`` and all subparts. From webhook-mailer at python.org Fri May 24 11:02:04 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 15:02:04 -0000 Subject: [Python-checkins] bpo-36710: Add tstate parameter in ceval.c (GH-13547) Message-ID: https://github.com/python/cpython/commit/438a12dd9d85f463c0bb7bf1505cd87b98b98170 commit: 438a12dd9d85f463c0bb7bf1505cd87b98b98170 branch: master author: Victor Stinner committer: GitHub date: 2019-05-24T17:01:38+02:00 summary: bpo-36710: Add tstate parameter in ceval.c (GH-13547) * Fix a possible reference leak in _PyErr_Print() if exception is NULL. * PyErr_BadInternalCall(): replace PyErr_Format() with _PyErr_SetString(). * Add pycore_pyerrors.h header file. * New functions: * _PyErr_Clear() * _PyErr_Fetch() * _PyErr_Print() * _PyErr_Restore() * _PyErr_SetObject() * _PyErr_SetString() * Add 'tstate' parameter to _PyEval_AddPendingCall(). files: A Include/internal/pycore_pyerrors.h M Include/internal/pycore_ceval.h M Include/internal/pycore_pylifecycle.h M Include/internal/pycore_pymem.h M Makefile.pre.in M Modules/signalmodule.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Python/ceval.c M Python/errors.c M Python/pythonrun.c diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 7a3166e86dab..37170ed438f8 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -19,6 +19,7 @@ PyAPI_FUNC(void) _PyEval_FiniThreads( PyAPI_FUNC(void) _PyEval_SignalReceived( struct _ceval_runtime_state *ceval); PyAPI_FUNC(int) _PyEval_AddPendingCall( + PyThreadState *tstate, struct _ceval_runtime_state *ceval, int (*func)(void *), void *arg); diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h new file mode 100644 index 000000000000..23327ef78397 --- /dev/null +++ b/Include/internal/pycore_pyerrors.h @@ -0,0 +1,62 @@ +#ifndef Py_INTERNAL_PYERRORS_H +#define Py_INTERNAL_PYERRORS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +static inline PyObject* _PyErr_Occurred(PyThreadState *tstate) +{ + return tstate == NULL ? NULL : tstate->curexc_type; +} + + +PyAPI_FUNC(void) _PyErr_Fetch( + PyThreadState *tstate, + PyObject **type, + PyObject **value, + PyObject **traceback); + +PyAPI_FUNC(int) _PyErr_ExceptionMatches( + PyThreadState *tstate, + PyObject *exc); + +PyAPI_FUNC(void) _PyErr_Restore( + PyThreadState *tstate, + PyObject *type, + PyObject *value, + PyObject *traceback); + +PyAPI_FUNC(void) _PyErr_SetObject( + PyThreadState *tstate, + PyObject *type, + PyObject *value); + +PyAPI_FUNC(void) _PyErr_Clear(PyThreadState *tstate); + +PyAPI_FUNC(void) _PyErr_SetNone(PyThreadState *tstate, PyObject *exception); + +PyAPI_FUNC(void) _PyErr_SetString( + PyThreadState *tstate, + PyObject *exception, + const char *string); + +PyAPI_FUNC(PyObject *) _PyErr_Format( + PyThreadState *tstate, + PyObject *exception, + const char *format, + ...); + +PyAPI_FUNC(void) _PyErr_NormalizeException( + PyThreadState *tstate, + PyObject **exc, + PyObject **val, + PyObject **tb); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_PYERRORS_H */ diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 07cf815363b7..13a31c262da8 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -106,6 +106,8 @@ PyAPI_FUNC(int) _Py_HandleSystemExit(int *exitcode_p); PyAPI_FUNC(PyObject*) _PyErr_WriteUnraisableDefaultHook(PyObject *unraisable); +PyAPI_FUNC(void) _PyErr_Print(PyThreadState *tstate); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index dcc492af0170..22677d373855 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -1,5 +1,5 @@ -#ifndef Py_INTERNAL_MEM_H -#define Py_INTERNAL_MEM_H +#ifndef Py_INTERNAL_PYMEM_H +#define Py_INTERNAL_PYMEM_H #ifdef __cplusplus extern "C" { #endif @@ -191,4 +191,4 @@ PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator); #ifdef __cplusplus } #endif -#endif /* !Py_INTERNAL_MEM_H */ +#endif /* !Py_INTERNAL_PYMEM_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 12891e938236..a149fdec4dcf 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1077,6 +1077,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_hamt.h \ $(srcdir)/Include/internal/pycore_object.h \ $(srcdir)/Include/internal/pycore_pathconfig.h \ + $(srcdir)/Include/internal/pycore_pyerrors.h \ $(srcdir)/Include/internal/pycore_pyhash.h \ $(srcdir)/Include/internal/pycore_pylifecycle.h \ $(srcdir)/Include/internal/pycore_pymem.h \ diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index ed3852d444e8..7698984ff3af 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -258,6 +258,7 @@ trip_signal(int sig_num) /* Notify ceval.c */ _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); _PyEval_SignalReceived(&runtime->ceval); /* And then write to the wakeup fd *after* setting all the globals and @@ -298,7 +299,7 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(&runtime->ceval, + _PyEval_AddPendingCall(tstate, &runtime->ceval, report_wakeup_send_error, (void *)(intptr_t) last_error); } @@ -317,7 +318,7 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(&runtime->ceval, + _PyEval_AddPendingCall(tstate, &runtime->ceval, report_wakeup_write_error, (void *)(intptr_t)errno); } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 681c4db65df0..10f51dd431b7 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -168,6 +168,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 32964c008aa2..396d146513d7 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -207,6 +207,9 @@ Include + + Include + Include diff --git a/Python/ceval.c b/Python/ceval.c index 781b10dfac9a..cb5a4beb2a66 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -12,6 +12,8 @@ #include "Python.h" #include "pycore_ceval.h" #include "pycore_object.h" +#include "pycore_pyerrors.h" +#include "pycore_pylifecycle.h" #include "pycore_pystate.h" #include "pycore_tupleobject.h" @@ -50,7 +52,7 @@ static PyObject * do_call_core( #ifdef LLTRACE static int lltrace; -static int prtrace(PyObject *, const char *); +static int prtrace(PyThreadState *, PyObject *, const char *); #endif static int call_trace(Py_tracefunc, PyObject *, PyThreadState *, PyFrameObject *, @@ -67,19 +69,19 @@ static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *); static void dtrace_function_entry(PyFrameObject *); static void dtrace_function_return(PyFrameObject *); -static PyObject * cmp_outcome(int, PyObject *, PyObject *); -static PyObject * import_name(PyFrameObject *, PyObject *, PyObject *, - PyObject *); -static PyObject * import_from(PyObject *, PyObject *); -static int import_all_from(PyObject *, PyObject *); -static void format_exc_check_arg(PyObject *, const char *, PyObject *); -static void format_exc_unbound(PyCodeObject *co, int oparg); -static PyObject * unicode_concatenate(PyObject *, PyObject *, +static PyObject * cmp_outcome(PyThreadState *, int, PyObject *, PyObject *); +static PyObject * import_name(PyThreadState *, PyFrameObject *, + PyObject *, PyObject *, PyObject *); +static PyObject * import_from(PyThreadState *, PyObject *, PyObject *); +static int import_all_from(PyThreadState *, PyObject *, PyObject *); +static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *); +static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg); +static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *, PyFrameObject *, const _Py_CODEUNIT *); -static PyObject * special_lookup(PyObject *, _Py_Identifier *); -static int check_args_iterable(PyObject *func, PyObject *vararg); -static void format_kwargs_error(PyObject *func, PyObject *kwargs); -static void format_awaitable_error(PyTypeObject *, int); +static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *); +static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg); +static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs); +static void format_awaitable_error(PyThreadState *, PyTypeObject *, int); #define NAME_ERROR_MSG \ "name '%.200s' is not defined" @@ -420,7 +422,8 @@ _pop_pending_call(struct _pending_calls *pending, */ int -_PyEval_AddPendingCall(struct _ceval_runtime_state *ceval, +_PyEval_AddPendingCall(PyThreadState *tstate, + struct _ceval_runtime_state *ceval, int (*func)(void *), void *arg) { struct _pending_calls *pending = &ceval->pending; @@ -430,12 +433,12 @@ _PyEval_AddPendingCall(struct _ceval_runtime_state *ceval, PyThread_release_lock(pending->lock); PyObject *exc, *val, *tb; - PyErr_Fetch(&exc, &val, &tb); - PyErr_SetString(PyExc_SystemError, + _PyErr_Fetch(tstate, &exc, &val, &tb); + _PyErr_SetString(tstate, PyExc_SystemError, "Py_AddPendingCall: cannot add pending calls " "(Python shutting down)"); - PyErr_Print(); - PyErr_Restore(exc, val, tb); + _PyErr_Print(tstate); + _PyErr_Restore(tstate, exc, val, tb); return -1; } int result = _push_pending_call(pending, func, arg); @@ -449,7 +452,9 @@ _PyEval_AddPendingCall(struct _ceval_runtime_state *ceval, int Py_AddPendingCall(int (*func)(void *), void *arg) { - return _PyEval_AddPendingCall(&_PyRuntime.ceval, func, arg); + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg); } static int @@ -535,6 +540,7 @@ _Py_FinishPendingCalls(_PyRuntimeState *runtime) { assert(PyGILState_Check()); + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); struct _pending_calls *pending = &runtime->ceval.pending; PyThread_acquire_lock(pending->lock, WAIT_LOCK); @@ -547,10 +553,10 @@ _Py_FinishPendingCalls(_PyRuntimeState *runtime) if (make_pending_calls(runtime) < 0) { PyObject *exc, *val, *tb; - PyErr_Fetch(&exc, &val, &tb); + _PyErr_Fetch(tstate, &exc, &val, &tb); PyErr_BadInternalCall(); _PyErr_ChainExceptions(exc, val, tb); - PyErr_Print(); + _PyErr_Print(tstate); } } @@ -623,7 +629,7 @@ _Py_CheckRecursiveCall(const char *where) tstate->stackcheck_counter = 0; if (PyOS_CheckStack()) { --tstate->recursion_depth; - PyErr_SetString(PyExc_MemoryError, "Stack overflow"); + _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow"); return -1; } /* Needed for ABI backwards-compatibility (see bpo-31857) */ @@ -642,16 +648,16 @@ _Py_CheckRecursiveCall(const char *where) if (tstate->recursion_depth > recursion_limit) { --tstate->recursion_depth; tstate->overflowed = 1; - PyErr_Format(PyExc_RecursionError, - "maximum recursion depth exceeded%s", - where); + _PyErr_Format(tstate, PyExc_RecursionError, + "maximum recursion depth exceeded%s", + where); return -1; } return 0; } static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause); -static int unpack_iterable(PyObject *, int, int, PyObject **); +static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **); #define _Py_TracingPossible(ceval) ((ceval)->tracing_possible) @@ -908,24 +914,24 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #ifdef LLTRACE #define PUSH(v) { (void)(BASIC_PUSH(v), \ - lltrace && prtrace(TOP(), "push")); \ + lltrace && prtrace(tstate, TOP(), "push")); \ assert(STACK_LEVEL() <= co->co_stacksize); } -#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), \ +#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \ BASIC_POP()) #define STACK_GROW(n) do { \ assert(n >= 0); \ (void)(BASIC_STACKADJ(n), \ - lltrace && prtrace(TOP(), "stackadj")); \ + lltrace && prtrace(tstate, TOP(), "stackadj")); \ assert(STACK_LEVEL() <= co->co_stacksize); \ } while (0) #define STACK_SHRINK(n) do { \ assert(n >= 0); \ - (void)(lltrace && prtrace(TOP(), "stackadj")); \ + (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \ (void)(BASIC_STACKADJ(-n)); \ assert(STACK_LEVEL() <= co->co_stacksize); \ } while (0) #define EXT_POP(STACK_POINTER) ((void)(lltrace && \ - prtrace((STACK_POINTER)[-1], "ext_pop")), \ + prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \ *--(STACK_POINTER)) #else #define PUSH(v) BASIC_PUSH(v) @@ -1070,14 +1076,14 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* PyEval_EvalFrameEx() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); #endif main_loop: for (;;) { assert(stack_pointer >= f->f_valuestack); /* else underflow */ assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); /* Do periodic things. Doing this every time through the loop would add too much overhead, so we do it @@ -1146,7 +1152,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *exc = tstate->async_exc; tstate->async_exc = NULL; UNSIGNAL_ASYNC_EXC(ceval); - PyErr_SetNone(exc); + _PyErr_SetNone(tstate, exc); Py_DECREF(exc); goto error; } @@ -1222,7 +1228,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) case TARGET(LOAD_FAST): { PyObject *value = GETLOCAL(oparg); if (value == NULL) { - format_exc_check_arg(PyExc_UnboundLocalError, + format_exc_check_arg(tstate, PyExc_UnboundLocalError, UNBOUNDLOCAL_ERROR_MSG, PyTuple_GetItem(co->co_varnames, oparg)); goto error; @@ -1441,7 +1447,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) speedup on microbenchmarks. */ if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) { - sum = unicode_concatenate(left, right, f, next_instr); + sum = unicode_concatenate(tstate, left, right, f, next_instr); /* unicode_concatenate consumed the ref to left */ } else { @@ -1640,7 +1646,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *left = TOP(); PyObject *sum; if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) { - sum = unicode_concatenate(left, right, f, next_instr); + sum = unicode_concatenate(tstate, left, right, f, next_instr); /* unicode_concatenate consumed the ref to left */ } else { @@ -1762,8 +1768,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *hook = _PySys_GetObjectId(&PyId_displayhook); PyObject *res; if (hook == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "lost sys.displayhook"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "lost sys.displayhook"); Py_DECREF(value); goto error; } @@ -1790,8 +1796,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } break; default: - PyErr_SetString(PyExc_SystemError, - "bad RAISE_VARARGS oparg"); + _PyErr_SetString(tstate, PyExc_SystemError, + "bad RAISE_VARARGS oparg"); break; } goto error; @@ -1823,11 +1829,10 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } else { SET_TOP(NULL); - PyErr_Format( - PyExc_TypeError, - "'async for' requires an object with " - "__aiter__ method, got %.100s", - type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'async for' requires an object with " + "__aiter__ method, got %.100s", + type->tp_name); Py_DECREF(obj); goto error; } @@ -1836,11 +1841,10 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) Py_TYPE(iter)->tp_as_async->am_anext == NULL) { SET_TOP(NULL); - PyErr_Format( - PyExc_TypeError, - "'async for' received an object from __aiter__ " - "that does not implement __anext__: %.100s", - Py_TYPE(iter)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'async for' received an object from __aiter__ " + "that does not implement __anext__: %.100s", + Py_TYPE(iter)->tp_name); Py_DECREF(iter); goto error; } @@ -1873,11 +1877,10 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } } else { - PyErr_Format( - PyExc_TypeError, - "'async for' requires an iterator with " - "__anext__ method, got %.100s", - type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'async for' requires an iterator with " + "__anext__ method, got %.100s", + type->tp_name); goto error; } @@ -1907,7 +1910,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *iter = _PyCoro_GetAwaitableIter(iterable); if (iter == NULL) { - format_awaitable_error(Py_TYPE(iterable), + format_awaitable_error(tstate, Py_TYPE(iterable), _Py_OPCODE(next_instr[-2])); } @@ -1921,9 +1924,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) being awaited on. */ Py_DECREF(yf); Py_CLEAR(iter); - PyErr_SetString( - PyExc_RuntimeError, - "coroutine is being awaited already"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "coroutine is being awaited already"); /* The code below jumps to `error` if `iter` is NULL. */ } } @@ -1955,7 +1957,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (retval == NULL) { PyObject *val; if (tstate->c_tracefunc != NULL - && PyErr_ExceptionMatches(PyExc_StopIteration)) + && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f); err = _PyGen_FetchStopIterationValue(&val); if (err < 0) @@ -1994,8 +1996,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) _PyErr_StackItem *exc_info; PyTryBlock *b = PyFrame_BlockPop(f); if (b->b_type != EXCEPT_HANDLER) { - PyErr_SetString(PyExc_SystemError, - "popped block is not an except handler"); + _PyErr_SetString(tstate, PyExc_SystemError, + "popped block is not an except handler"); goto error; } assert(STACK_LEVEL() >= (b)->b_level + 3 && @@ -2047,8 +2049,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) _PyErr_StackItem *exc_info; PyTryBlock *b = PyFrame_BlockPop(f); if (b->b_type != EXCEPT_HANDLER) { - PyErr_SetString(PyExc_SystemError, - "popped block is not an except handler"); + _PyErr_SetString(tstate, PyExc_SystemError, + "popped block is not an except handler"); Py_XDECREF(res); goto error; } @@ -2104,7 +2106,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) else if (PyLong_CheckExact(exc)) { int ret = _PyLong_AsInt(exc); Py_DECREF(exc); - if (ret == -1 && PyErr_Occurred()) { + if (ret == -1 && _PyErr_Occurred(tstate)) { goto error; } JUMPTO(ret); @@ -2114,7 +2116,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) assert(PyExceptionClass_Check(exc)); PyObject *val = POP(); PyObject *tb = POP(); - PyErr_Restore(exc, val, tb); + _PyErr_Restore(tstate, exc, val, tb); goto exception_unwind; } } @@ -2134,7 +2136,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) else { PyObject *val = POP(); PyObject *tb = POP(); - PyErr_Restore(exc, val, tb); + _PyErr_Restore(tstate, exc, val, tb); goto exception_unwind; } } @@ -2146,9 +2148,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (PyDict_CheckExact(f->f_builtins)) { bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__); if (bc == NULL) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_NameError, - "__build_class__ not found"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_NameError, + "__build_class__ not found"); } goto error; } @@ -2160,9 +2162,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) goto error; bc = PyObject_GetItem(f->f_builtins, build_class_str); if (bc == NULL) { - if (PyErr_ExceptionMatches(PyExc_KeyError)) - PyErr_SetString(PyExc_NameError, - "__build_class__ not found"); + if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) + _PyErr_SetString(tstate, PyExc_NameError, + "__build_class__ not found"); goto error; } } @@ -2176,8 +2178,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *ns = f->f_locals; int err; if (ns == NULL) { - PyErr_Format(PyExc_SystemError, - "no locals found when storing %R", name); + _PyErr_Format(tstate, PyExc_SystemError, + "no locals found when storing %R", name); Py_DECREF(v); goto error; } @@ -2196,13 +2198,13 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *ns = f->f_locals; int err; if (ns == NULL) { - PyErr_Format(PyExc_SystemError, - "no locals when deleting %R", name); + _PyErr_Format(tstate, PyExc_SystemError, + "no locals when deleting %R", name); goto error; } err = PyObject_DelItem(ns, name); if (err != 0) { - format_exc_check_arg(PyExc_NameError, + format_exc_check_arg(tstate, PyExc_NameError, NAME_ERROR_MSG, name); goto error; @@ -2229,7 +2231,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) Py_INCREF(item); PUSH(item); } - } else if (unpack_iterable(seq, oparg, -1, + } else if (unpack_iterable(tstate, seq, oparg, -1, stack_pointer + oparg)) { STACK_GROW(oparg); } else { @@ -2245,7 +2247,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); PyObject *seq = POP(); - if (unpack_iterable(seq, oparg & 0xFF, oparg >> 8, + if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8, stack_pointer + totalargs)) { stack_pointer += totalargs; } else { @@ -2297,9 +2299,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) int err; err = PyDict_DelItem(f->f_globals, name); if (err != 0) { - if (PyErr_ExceptionMatches(PyExc_KeyError)) { - format_exc_check_arg( - PyExc_NameError, NAME_ERROR_MSG, name); + if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + format_exc_check_arg(tstate, PyExc_NameError, + NAME_ERROR_MSG, name); } goto error; } @@ -2311,8 +2313,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *locals = f->f_locals; PyObject *v; if (locals == NULL) { - PyErr_Format(PyExc_SystemError, - "no locals when loading %R", name); + _PyErr_Format(tstate, PyExc_SystemError, + "no locals when loading %R", name); goto error; } if (PyDict_CheckExact(locals)) { @@ -2320,16 +2322,16 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (v != NULL) { Py_INCREF(v); } - else if (PyErr_Occurred()) { + else if (_PyErr_Occurred(tstate)) { goto error; } } else { v = PyObject_GetItem(locals, name); if (v == NULL) { - if (!PyErr_ExceptionMatches(PyExc_KeyError)) + if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) goto error; - PyErr_Clear(); + _PyErr_Clear(tstate); } } if (v == NULL) { @@ -2337,16 +2339,16 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (v != NULL) { Py_INCREF(v); } - else if (PyErr_Occurred()) { + else if (_PyErr_Occurred(tstate)) { goto error; } else { if (PyDict_CheckExact(f->f_builtins)) { v = PyDict_GetItemWithError(f->f_builtins, name); if (v == NULL) { - if (!PyErr_Occurred()) { + if (!_PyErr_Occurred(tstate)) { format_exc_check_arg( - PyExc_NameError, + tstate, PyExc_NameError, NAME_ERROR_MSG, name); } goto error; @@ -2356,10 +2358,11 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) else { v = PyObject_GetItem(f->f_builtins, name); if (v == NULL) { - if (PyErr_ExceptionMatches(PyExc_KeyError)) + if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { format_exc_check_arg( - PyExc_NameError, + tstate, PyExc_NameError, NAME_ERROR_MSG, name); + } goto error; } } @@ -2382,7 +2385,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (!_PyErr_OCCURRED()) { /* _PyDict_LoadGlobal() returns NULL without raising * an exception if the key doesn't exist */ - format_exc_check_arg(PyExc_NameError, + format_exc_check_arg(tstate, PyExc_NameError, NAME_ERROR_MSG, name); } goto error; @@ -2395,17 +2398,19 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* namespace 1: globals */ v = PyObject_GetItem(f->f_globals, name); if (v == NULL) { - if (!PyErr_ExceptionMatches(PyExc_KeyError)) + if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { goto error; - PyErr_Clear(); + } + _PyErr_Clear(tstate); /* namespace 2: builtins */ v = PyObject_GetItem(f->f_builtins, name); if (v == NULL) { - if (PyErr_ExceptionMatches(PyExc_KeyError)) + if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { format_exc_check_arg( - PyExc_NameError, + tstate, PyExc_NameError, NAME_ERROR_MSG, name); + } goto error; } } @@ -2421,7 +2426,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } format_exc_check_arg( - PyExc_UnboundLocalError, + tstate, PyExc_UnboundLocalError, UNBOUNDLOCAL_ERROR_MSG, PyTuple_GetItem(co->co_varnames, oparg) ); @@ -2436,7 +2441,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) Py_DECREF(oldobj); DISPATCH(); } - format_exc_unbound(co, oparg); + format_exc_unbound(tstate, co, oparg); goto error; } @@ -2460,23 +2465,24 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (value != NULL) { Py_INCREF(value); } - else if (PyErr_Occurred()) { + else if (_PyErr_Occurred(tstate)) { goto error; } } else { value = PyObject_GetItem(locals, name); if (value == NULL) { - if (!PyErr_ExceptionMatches(PyExc_KeyError)) + if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { goto error; - PyErr_Clear(); + } + _PyErr_Clear(tstate); } } if (!value) { PyObject *cell = freevars[oparg]; value = PyCell_GET(cell); if (value == NULL) { - format_exc_unbound(co, oparg); + format_exc_unbound(tstate, co, oparg); goto error; } Py_INCREF(value); @@ -2489,7 +2495,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *cell = freevars[oparg]; PyObject *value = PyCell_GET(cell); if (value == NULL) { - format_exc_unbound(co, oparg); + format_exc_unbound(tstate, co, oparg); goto error; } Py_INCREF(value); @@ -2565,9 +2571,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) none_val = _PyList_Extend((PyListObject *)sum, PEEK(i)); if (none_val == NULL) { if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL && - PyErr_ExceptionMatches(PyExc_TypeError)) + _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) { - check_args_iterable(PEEK(1 + oparg), PEEK(i)); + check_args_iterable(tstate, PEEK(1 + oparg), PEEK(i)); } Py_DECREF(sum); goto error; @@ -2660,8 +2666,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) int err; PyObject *ann_dict; if (f->f_locals == NULL) { - PyErr_Format(PyExc_SystemError, - "no locals found when setting up annotations"); + _PyErr_Format(tstate, PyExc_SystemError, + "no locals found when setting up annotations"); goto error; } /* check if __annotations__ in locals()... */ @@ -2669,7 +2675,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) ann_dict = _PyDict_GetItemIdWithError(f->f_locals, &PyId___annotations__); if (ann_dict == NULL) { - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { goto error; } /* ...if not, create a new one */ @@ -2693,10 +2699,10 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } ann_dict = PyObject_GetItem(f->f_locals, ann_str); if (ann_dict == NULL) { - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { goto error; } - PyErr_Clear(); + _PyErr_Clear(tstate); ann_dict = PyDict_New(); if (ann_dict == NULL) { goto error; @@ -2720,8 +2726,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *keys = TOP(); if (!PyTuple_CheckExact(keys) || PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) { - PyErr_SetString(PyExc_SystemError, - "bad BUILD_CONST_KEY_MAP keys argument"); + _PyErr_SetString(tstate, PyExc_SystemError, + "bad BUILD_CONST_KEY_MAP keys argument"); goto error; } map = _PyDict_NewPresized((Py_ssize_t)oparg); @@ -2756,10 +2762,10 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) for (i = oparg; i > 0; i--) { PyObject *arg = PEEK(i); if (PyDict_Update(sum, arg) < 0) { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Format(PyExc_TypeError, - "'%.200s' object is not a mapping", - arg->ob_type->tp_name); + if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object is not a mapping", + arg->ob_type->tp_name); } Py_DECREF(sum); goto error; @@ -2782,7 +2788,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *arg = PEEK(i); if (_PyDict_MergeEx(sum, arg, 2) < 0) { Py_DECREF(sum); - format_kwargs_error(PEEK(2 + oparg), arg); + format_kwargs_error(tstate, PEEK(2 + oparg), arg); goto error; } } @@ -2824,7 +2830,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) case TARGET(COMPARE_OP): { PyObject *right = POP(); PyObject *left = TOP(); - PyObject *res = cmp_outcome(oparg, left, right); + PyObject *res = cmp_outcome(tstate, oparg, left, right); Py_DECREF(left); Py_DECREF(right); SET_TOP(res); @@ -2840,7 +2846,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *fromlist = POP(); PyObject *level = TOP(); PyObject *res; - res = import_name(f, name, fromlist, level); + res = import_name(tstate, f, name, fromlist, level); Py_DECREF(level); Py_DECREF(fromlist); SET_TOP(res); @@ -2859,12 +2865,12 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) locals = f->f_locals; if (locals == NULL) { - PyErr_SetString(PyExc_SystemError, - "no locals found during 'import *'"); + _PyErr_SetString(tstate, PyExc_SystemError, + "no locals found during 'import *'"); Py_DECREF(from); goto error; } - err = import_all_from(locals, from); + err = import_all_from(tstate, locals, from); PyFrame_LocalsToFast(f, 0); Py_DECREF(from); if (err != 0) @@ -2876,7 +2882,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *name = GETITEM(names, oparg); PyObject *from = TOP(); PyObject *res; - res = import_from(from, name); + res = import_from(tstate, from, name); PUSH(res); if (res == NULL) goto error; @@ -3027,9 +3033,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) regular generator. */ Py_DECREF(iterable); SET_TOP(NULL); - PyErr_SetString(PyExc_TypeError, - "cannot 'yield from' a coroutine object " - "in a non-coroutine generator"); + _PyErr_SetString(tstate, PyExc_TypeError, + "cannot 'yield from' a coroutine object " + "in a non-coroutine generator"); goto error; } } @@ -3056,12 +3062,14 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PREDICT(UNPACK_SEQUENCE); DISPATCH(); } - if (PyErr_Occurred()) { - if (!PyErr_ExceptionMatches(PyExc_StopIteration)) + if (_PyErr_Occurred(tstate)) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) { goto error; - else if (tstate->c_tracefunc != NULL) + } + else if (tstate->c_tracefunc != NULL) { call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f); - PyErr_Clear(); + } + _PyErr_Clear(tstate); } /* iterator ended normally */ STACK_SHRINK(1); @@ -3087,13 +3095,13 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) _Py_IDENTIFIER(__aenter__); PyObject *mgr = TOP(); - PyObject *exit = special_lookup(mgr, &PyId___aexit__), + PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__), *enter; PyObject *res; if (exit == NULL) goto error; SET_TOP(exit); - enter = special_lookup(mgr, &PyId___aenter__); + enter = special_lookup(tstate, mgr, &PyId___aenter__); Py_DECREF(mgr); if (enter == NULL) goto error; @@ -3120,11 +3128,12 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) _Py_IDENTIFIER(__exit__); _Py_IDENTIFIER(__enter__); PyObject *mgr = TOP(); - PyObject *enter = special_lookup(mgr, &PyId___enter__), *exit; + PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__); PyObject *res; - if (enter == NULL) + if (enter == NULL) { goto error; - exit = special_lookup(mgr, &PyId___exit__); + } + PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__); if (exit == NULL) { Py_DECREF(enter); goto error; @@ -3380,7 +3389,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) goto error; if (_PyDict_MergeEx(d, kwargs, 2) < 0) { Py_DECREF(d); - format_kwargs_error(SECOND(), kwargs); + format_kwargs_error(tstate, SECOND(), kwargs); Py_DECREF(kwargs); goto error; } @@ -3392,7 +3401,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) callargs = POP(); func = TOP(); if (!PyTuple_CheckExact(callargs)) { - if (check_args_iterable(func, callargs) < 0) { + if (check_args_iterable(tstate, func, callargs) < 0) { Py_DECREF(callargs); goto error; } @@ -3485,9 +3494,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) case FVC_REPR: conv_fn = PyObject_Repr; break; case FVC_ASCII: conv_fn = PyObject_ASCII; break; default: - PyErr_Format(PyExc_SystemError, - "unexpected conversion flag %d", - which_conversion); + _PyErr_Format(tstate, PyExc_SystemError, + "unexpected conversion flag %d", + which_conversion); goto error; } @@ -3542,7 +3551,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) "XXX lineno: %d, opcode: %d\n", PyFrame_GetLineNumber(f), opcode); - PyErr_SetString(PyExc_SystemError, "unknown opcode"); + _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode"); goto error; } /* switch */ @@ -3554,11 +3563,12 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) error: /* Double-check exception status. */ #ifdef NDEBUG - if (!PyErr_Occurred()) - PyErr_SetString(PyExc_SystemError, - "error return without exception set"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_SystemError, + "error return without exception set"); + } #else - assert(PyErr_Occurred()); + assert(_PyErr_Occurred(tstate)); #endif /* Log traceback info. */ @@ -3594,13 +3604,12 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) Py_INCREF(Py_None); PUSH(Py_None); } - PyErr_Fetch(&exc, &val, &tb); + _PyErr_Fetch(tstate, &exc, &val, &tb); /* Make the raw exception data available to the handler, so a program can emulate the Python main loop. */ - PyErr_NormalizeException( - &exc, &val, &tb); + _PyErr_NormalizeException(tstate, &exc, &val, &tb); if (tb != NULL) PyException_SetTraceback(val, tb); else @@ -3627,7 +3636,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } /* main loop */ assert(retval == NULL); - assert(PyErr_Occurred()); + assert(_PyErr_Occurred(tstate)); exit_returning: @@ -3665,7 +3674,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } static void -format_missing(const char *kind, PyCodeObject *co, PyObject *names) +format_missing(PyThreadState *tstate, const char *kind, + PyCodeObject *co, PyObject *names) { int err; Py_ssize_t len = PyList_GET_SIZE(names); @@ -3716,18 +3726,19 @@ format_missing(const char *kind, PyCodeObject *co, PyObject *names) } if (name_str == NULL) return; - PyErr_Format(PyExc_TypeError, - "%U() missing %i required %s argument%s: %U", - co->co_name, - len, - kind, - len == 1 ? "" : "s", - name_str); + _PyErr_Format(tstate, PyExc_TypeError, + "%U() missing %i required %s argument%s: %U", + co->co_name, + len, + kind, + len == 1 ? "" : "s", + name_str); Py_DECREF(name_str); } static void -missing_arguments(PyCodeObject *co, Py_ssize_t missing, Py_ssize_t defcount, +missing_arguments(PyThreadState *tstate, PyCodeObject *co, + Py_ssize_t missing, Py_ssize_t defcount, PyObject **fastlocals) { Py_ssize_t i, j = 0; @@ -3760,12 +3771,13 @@ missing_arguments(PyCodeObject *co, Py_ssize_t missing, Py_ssize_t defcount, } } assert(j == missing); - format_missing(kind, co, missing_names); + format_missing(tstate, kind, co, missing_names); Py_DECREF(missing_names); } static void -too_many_positional(PyCodeObject *co, Py_ssize_t given, Py_ssize_t defcount, +too_many_positional(PyThreadState *tstate, PyCodeObject *co, + Py_ssize_t given, Py_ssize_t defcount, PyObject **fastlocals) { int plural; @@ -3810,21 +3822,21 @@ too_many_positional(PyCodeObject *co, Py_ssize_t given, Py_ssize_t defcount, kwonly_sig = PyUnicode_FromString(""); assert(kwonly_sig != NULL); } - PyErr_Format(PyExc_TypeError, - "%U() takes %U positional argument%s but %zd%U %s given", - co->co_name, - sig, - plural ? "s" : "", - given, - kwonly_sig, - given == 1 && !kwonly_given ? "was" : "were"); + _PyErr_Format(tstate, PyExc_TypeError, + "%U() takes %U positional argument%s but %zd%U %s given", + co->co_name, + sig, + plural ? "s" : "", + given, + kwonly_sig, + given == 1 && !kwonly_given ? "was" : "were"); Py_DECREF(sig); Py_DECREF(kwonly_sig); } static int -positional_only_passed_as_keyword(PyCodeObject *co, Py_ssize_t kwcount, - PyObject* const* kwnames) +positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co, + Py_ssize_t kwcount, PyObject* const* kwnames) { int posonly_conflicts = 0; PyObject* posonly_names = PyList_New(0); @@ -3866,10 +3878,10 @@ positional_only_passed_as_keyword(PyCodeObject *co, Py_ssize_t kwcount, if (error_names == NULL) { goto fail; } - PyErr_Format(PyExc_TypeError, - "%U() got some positional-only arguments passed" - " as keyword arguments: '%U'", - co->co_name, error_names); + _PyErr_Format(tstate, PyExc_TypeError, + "%U() got some positional-only arguments passed" + " as keyword arguments: '%U'", + co->co_name, error_names); Py_DECREF(error_names); goto fail; } @@ -3905,15 +3917,16 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, Py_ssize_t i, j, n; PyObject *kwdict; + PyThreadState *tstate = _PyThreadState_GET(); + assert(tstate != NULL); + if (globals == NULL) { - PyErr_SetString(PyExc_SystemError, - "PyEval_EvalCodeEx: NULL globals"); + _PyErr_SetString(tstate, PyExc_SystemError, + "PyEval_EvalCodeEx: NULL globals"); return NULL; } /* Create the frame */ - PyThreadState *tstate = _PyThreadState_GET(); - assert(tstate != NULL); f = _PyFrame_New_NoTrack(tstate, co, globals, locals); if (f == NULL) { return NULL; @@ -3981,9 +3994,9 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, Py_ssize_t j; if (keyword == NULL || !PyUnicode_Check(keyword)) { - PyErr_Format(PyExc_TypeError, - "%U() keywords must be strings", - co->co_name); + _PyErr_Format(tstate, PyExc_TypeError, + "%U() keywords must be strings", + co->co_name); goto fail; } @@ -4012,13 +4025,16 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, assert(j >= total_args); if (kwdict == NULL) { - if (co->co_posonlyargcount && positional_only_passed_as_keyword(co, kwcount, kwnames)) { + if (co->co_posonlyargcount + && positional_only_passed_as_keyword(tstate, co, + kwcount, kwnames)) + { goto fail; } - PyErr_Format(PyExc_TypeError, - "%U() got an unexpected keyword argument '%S'", - co->co_name, keyword); + _PyErr_Format(tstate, PyExc_TypeError, + "%U() got an unexpected keyword argument '%S'", + co->co_name, keyword); goto fail; } @@ -4029,9 +4045,9 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, kw_found: if (GETLOCAL(j) != NULL) { - PyErr_Format(PyExc_TypeError, - "%U() got multiple values for argument '%S'", - co->co_name, keyword); + _PyErr_Format(tstate, PyExc_TypeError, + "%U() got multiple values for argument '%S'", + co->co_name, keyword); goto fail; } Py_INCREF(value); @@ -4040,7 +4056,7 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, /* Check the number of positional arguments */ if ((argcount > co->co_argcount + co->co_posonlyargcount) && !(co->co_flags & CO_VARARGS)) { - too_many_positional(co, argcount, defcount, fastlocals); + too_many_positional(tstate, co, argcount, defcount, fastlocals); goto fail; } @@ -4054,7 +4070,7 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, } } if (missing) { - missing_arguments(co, missing, defcount, fastlocals); + missing_arguments(tstate, co, missing, defcount, fastlocals); goto fail; } if (n > m) @@ -4085,14 +4101,14 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, SETLOCAL(i, def); continue; } - else if (PyErr_Occurred()) { + else if (_PyErr_Occurred(tstate)) { goto fail; } } missing++; } if (missing) { - missing_arguments(co, missing, -1, fastlocals); + missing_arguments(tstate, co, missing, -1, fastlocals); goto fail; } } @@ -4132,11 +4148,11 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, if (is_coro && tstate->in_coroutine_wrapper) { assert(coro_wrapper != NULL); - PyErr_Format(PyExc_RuntimeError, - "coroutine wrapper %.200R attempted " - "to recursively wrap %.200R", - coro_wrapper, - co); + _PyErr_Format(tstate, PyExc_RuntimeError, + "coroutine wrapper %.200R attempted " + "to recursively wrap %.200R", + coro_wrapper, + co); goto fail; } @@ -4209,12 +4225,12 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, } static PyObject * -special_lookup(PyObject *o, _Py_Identifier *id) +special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id) { PyObject *res; res = _PyObject_LookupSpecial(o, id); - if (res == NULL && !PyErr_Occurred()) { - PyErr_SetObject(PyExc_AttributeError, id->object); + if (res == NULL && !_PyErr_Occurred(tstate)) { + _PyErr_SetObject(tstate, PyExc_AttributeError, id->object); return NULL; } return res; @@ -4236,14 +4252,14 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) value = exc_info->exc_value; tb = exc_info->exc_traceback; if (type == Py_None || type == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "No active exception to reraise"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "No active exception to reraise"); return 0; } Py_XINCREF(type); Py_XINCREF(value); Py_XINCREF(tb); - PyErr_Restore(type, value, tb); + _PyErr_Restore(tstate, type, value, tb); return 1; } @@ -4258,11 +4274,11 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) if (value == NULL) goto raise_error; if (!PyExceptionInstance_Check(value)) { - PyErr_Format(PyExc_TypeError, - "calling %R should have returned an instance of " - "BaseException, not %R", - type, Py_TYPE(value)); - goto raise_error; + _PyErr_Format(tstate, PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto raise_error; } } else if (PyExceptionInstance_Check(exc)) { @@ -4274,8 +4290,8 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) /* Not something you can raise. You get an exception anyway, just not what you specified :-) */ Py_DECREF(exc); - PyErr_SetString(PyExc_TypeError, - "exceptions must derive from BaseException"); + _PyErr_SetString(tstate, PyExc_TypeError, + "exceptions must derive from BaseException"); goto raise_error; } @@ -4298,15 +4314,15 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) fixed_cause = NULL; } else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); + _PyErr_SetString(tstate, PyExc_TypeError, + "exception causes must derive from " + "BaseException"); goto raise_error; } PyException_SetCause(value, fixed_cause); } - PyErr_SetObject(type, value); + _PyErr_SetObject(tstate, type, value); /* PyErr_SetObject incref's its arguments */ Py_DECREF(value); Py_DECREF(type); @@ -4327,7 +4343,8 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) */ static int -unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp) +unpack_iterable(PyThreadState *tstate, PyObject *v, + int argcnt, int argcntafter, PyObject **sp) { int i = 0, j = 0; Py_ssize_t ll = 0; @@ -4339,12 +4356,12 @@ unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp) it = PyObject_GetIter(v); if (it == NULL) { - if (PyErr_ExceptionMatches(PyExc_TypeError) && + if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && v->ob_type->tp_iter == NULL && !PySequence_Check(v)) { - PyErr_Format(PyExc_TypeError, - "cannot unpack non-iterable %.200s object", - v->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "cannot unpack non-iterable %.200s object", + v->ob_type->tp_name); } return 0; } @@ -4353,17 +4370,18 @@ unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp) w = PyIter_Next(it); if (w == NULL) { /* Iterator done, via error or exhaustion. */ - if (!PyErr_Occurred()) { + if (!_PyErr_Occurred(tstate)) { if (argcntafter == -1) { - PyErr_Format(PyExc_ValueError, - "not enough values to unpack (expected %d, got %d)", - argcnt, i); + _PyErr_Format(tstate, PyExc_ValueError, + "not enough values to unpack " + "(expected %d, got %d)", + argcnt, i); } else { - PyErr_Format(PyExc_ValueError, - "not enough values to unpack " - "(expected at least %d, got %d)", - argcnt + argcntafter, i); + _PyErr_Format(tstate, PyExc_ValueError, + "not enough values to unpack " + "(expected at least %d, got %d)", + argcnt + argcntafter, i); } } goto Error; @@ -4375,15 +4393,15 @@ unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp) /* We better have exhausted the iterator now. */ w = PyIter_Next(it); if (w == NULL) { - if (PyErr_Occurred()) + if (_PyErr_Occurred(tstate)) goto Error; Py_DECREF(it); return 1; } Py_DECREF(w); - PyErr_Format(PyExc_ValueError, - "too many values to unpack (expected %d)", - argcnt); + _PyErr_Format(tstate, PyExc_ValueError, + "too many values to unpack (expected %d)", + argcnt); goto Error; } @@ -4395,7 +4413,7 @@ unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp) ll = PyList_GET_SIZE(l); if (ll < argcntafter) { - PyErr_Format(PyExc_ValueError, + _PyErr_Format(tstate, PyExc_ValueError, "not enough values to unpack (expected at least %d, got %zd)", argcnt + argcntafter, argcnt + ll); goto Error; @@ -4420,11 +4438,13 @@ unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp) #ifdef LLTRACE static int -prtrace(PyObject *v, const char *str) +prtrace(PyThreadState *tstate, PyObject *v, const char *str) { printf("%s ", str); - if (PyObject_Print(v, stdout, 0) != 0) - PyErr_Clear(); /* Don't know what else to do */ + if (PyObject_Print(v, stdout, 0) != 0) { + /* Don't know what else to do */ + _PyErr_Clear(tstate); + } printf("\n"); return 1; } @@ -4436,22 +4456,23 @@ call_exc_trace(Py_tracefunc func, PyObject *self, { PyObject *type, *value, *traceback, *orig_traceback, *arg; int err; - PyErr_Fetch(&type, &value, &orig_traceback); + _PyErr_Fetch(tstate, &type, &value, &orig_traceback); if (value == NULL) { value = Py_None; Py_INCREF(value); } - PyErr_NormalizeException(&type, &value, &orig_traceback); + _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback); traceback = (orig_traceback != NULL) ? orig_traceback : Py_None; arg = PyTuple_Pack(3, type, value, traceback); if (arg == NULL) { - PyErr_Restore(type, value, orig_traceback); + _PyErr_Restore(tstate, type, value, orig_traceback); return; } err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg); Py_DECREF(arg); - if (err == 0) - PyErr_Restore(type, value, orig_traceback); + if (err == 0) { + _PyErr_Restore(tstate, type, value, orig_traceback); + } else { Py_XDECREF(type); Py_XDECREF(value); @@ -4466,11 +4487,11 @@ call_trace_protected(Py_tracefunc func, PyObject *obj, { PyObject *type, *value, *traceback; int err; - PyErr_Fetch(&type, &value, &traceback); + _PyErr_Fetch(tstate, &type, &value, &traceback); err = call_trace(func, obj, tstate, frame, what, arg); if (err == 0) { - PyErr_Restore(type, value, traceback); + _PyErr_Restore(tstate, type, value, traceback); return 0; } else { @@ -4672,12 +4693,26 @@ _PyEval_GetAsyncGenFinalizer(void) return tstate->async_gen_finalizer; } +static PyFrameObject * +_PyEval_GetFrame(PyThreadState *tstate) +{ + return _PyRuntime.gilstate.getframe(tstate); +} + +PyFrameObject * +PyEval_GetFrame(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyEval_GetFrame(tstate); +} + PyObject * PyEval_GetBuiltins(void) { - PyFrameObject *current_frame = PyEval_GetFrame(); + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *current_frame = _PyEval_GetFrame(tstate); if (current_frame == NULL) - return _PyInterpreterState_GET_UNSAFE()->builtins; + return tstate->interp->builtins; else return current_frame->f_builtins; } @@ -4686,12 +4721,13 @@ PyEval_GetBuiltins(void) PyObject * _PyEval_GetBuiltinId(_Py_Identifier *name) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name); if (attr) { Py_INCREF(attr); } - else if (!PyErr_Occurred()) { - PyErr_SetObject(PyExc_AttributeError, _PyUnicode_FromId(name)); + else if (!_PyErr_Occurred(tstate)) { + _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name)); } return attr; } @@ -4699,14 +4735,16 @@ _PyEval_GetBuiltinId(_Py_Identifier *name) PyObject * PyEval_GetLocals(void) { - PyFrameObject *current_frame = PyEval_GetFrame(); + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *current_frame = _PyEval_GetFrame(tstate); if (current_frame == NULL) { - PyErr_SetString(PyExc_SystemError, "frame does not exist"); + _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist"); return NULL; } - if (PyFrame_FastToLocalsWithError(current_frame) < 0) + if (PyFrame_FastToLocalsWithError(current_frame) < 0) { return NULL; + } assert(current_frame->f_locals != NULL); return current_frame->f_locals; @@ -4715,26 +4753,21 @@ PyEval_GetLocals(void) PyObject * PyEval_GetGlobals(void) { - PyFrameObject *current_frame = PyEval_GetFrame(); - if (current_frame == NULL) + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *current_frame = _PyEval_GetFrame(tstate); + if (current_frame == NULL) { return NULL; + } assert(current_frame->f_globals != NULL); return current_frame->f_globals; } -PyFrameObject * -PyEval_GetFrame(void) -{ - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - return runtime->gilstate.getframe(tstate); -} - int PyEval_MergeCompilerFlags(PyCompilerFlags *cf) { - PyFrameObject *current_frame = PyEval_GetFrame(); + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *current_frame = _PyEval_GetFrame(tstate); int result = cf->cf_flags != 0; if (current_frame != NULL) { @@ -4883,7 +4916,7 @@ call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyO Py_DECREF(func); } - assert((x != NULL) ^ (PyErr_Occurred() != NULL)); + assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); /* Clear the stack of the function object. */ while ((*pp_stack) > pfunc) { @@ -4939,17 +4972,18 @@ do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject int _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) { + PyThreadState *tstate = _PyThreadState_GET(); if (v != Py_None) { Py_ssize_t x; if (PyIndex_Check(v)) { x = PyNumber_AsSsize_t(v, NULL); - if (x == -1 && PyErr_Occurred()) + if (x == -1 && _PyErr_Occurred(tstate)) return 0; } else { - PyErr_SetString(PyExc_TypeError, - "slice indices must be integers or " - "None or have an __index__ method"); + _PyErr_SetString(tstate, PyExc_TypeError, + "slice indices must be integers or " + "None or have an __index__ method"); return 0; } *pi = x; @@ -4960,16 +4994,17 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) int _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t x; if (PyIndex_Check(v)) { x = PyNumber_AsSsize_t(v, NULL); - if (x == -1 && PyErr_Occurred()) + if (x == -1 && _PyErr_Occurred(tstate)) return 0; } else { - PyErr_SetString(PyExc_TypeError, - "slice indices must be integers or " - "have an __index__ method"); + _PyErr_SetString(tstate, PyExc_TypeError, + "slice indices must be integers or " + "have an __index__ method"); return 0; } *pi = x; @@ -4981,7 +5016,7 @@ _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) "BaseException is not allowed" static PyObject * -cmp_outcome(int op, PyObject *v, PyObject *w) +cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w) { int res = 0; switch (op) { @@ -5009,16 +5044,16 @@ cmp_outcome(int op, PyObject *v, PyObject *w) for (i = 0; i < length; i += 1) { PyObject *exc = PyTuple_GET_ITEM(w, i); if (!PyExceptionClass_Check(exc)) { - PyErr_SetString(PyExc_TypeError, - CANNOT_CATCH_MSG); + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); return NULL; } } } else { if (!PyExceptionClass_Check(w)) { - PyErr_SetString(PyExc_TypeError, - CANNOT_CATCH_MSG); + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); return NULL; } } @@ -5033,7 +5068,8 @@ cmp_outcome(int op, PyObject *v, PyObject *w) } static PyObject * -import_name(PyFrameObject *f, PyObject *name, PyObject *fromlist, PyObject *level) +import_name(PyThreadState *tstate, PyFrameObject *f, + PyObject *name, PyObject *fromlist, PyObject *level) { _Py_IDENTIFIER(__import__); PyObject *import_func, *res; @@ -5041,16 +5077,16 @@ import_name(PyFrameObject *f, PyObject *name, PyObject *fromlist, PyObject *leve import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__); if (import_func == NULL) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "__import__ not found"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found"); } return NULL; } /* Fast path for not overloaded __import__. */ - if (import_func == _PyInterpreterState_GET_UNSAFE()->import_func) { + if (import_func == tstate->interp->import_func) { int ilevel = _PyLong_AsInt(level); - if (ilevel == -1 && PyErr_Occurred()) { + if (ilevel == -1 && _PyErr_Occurred(tstate)) { return NULL; } res = PyImport_ImportModuleLevelObject( @@ -5075,7 +5111,7 @@ import_name(PyFrameObject *f, PyObject *name, PyObject *fromlist, PyObject *leve } static PyObject * -import_from(PyObject *v, PyObject *name) +import_from(PyThreadState *tstate, PyObject *v, PyObject *name) { PyObject *x; _Py_IDENTIFIER(__name__); @@ -5102,7 +5138,7 @@ import_from(PyObject *v, PyObject *name) } x = PyImport_GetModule(fullmodname); Py_DECREF(fullmodname); - if (x == NULL && !PyErr_Occurred()) { + if (x == NULL && !_PyErr_Occurred(tstate)) { goto error; } Py_DECREF(pkgname); @@ -5120,7 +5156,7 @@ import_from(PyObject *v, PyObject *name) } if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) { - PyErr_Clear(); + _PyErr_Clear(tstate); errmsg = PyUnicode_FromFormat( "cannot import name %R from %R (unknown location)", name, pkgname_or_unknown @@ -5144,7 +5180,7 @@ import_from(PyObject *v, PyObject *name) } static int -import_all_from(PyObject *locals, PyObject *v) +import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v) { _Py_IDENTIFIER(__all__); _Py_IDENTIFIER(__dict__); @@ -5161,7 +5197,7 @@ import_all_from(PyObject *locals, PyObject *v) return -1; } if (dict == NULL) { - PyErr_SetString(PyExc_ImportError, + _PyErr_SetString(tstate, PyExc_ImportError, "from-import-* object has no __dict__ and no __all__"); return -1; } @@ -5175,10 +5211,12 @@ import_all_from(PyObject *locals, PyObject *v) for (pos = 0, err = 0; ; pos++) { name = PySequence_GetItem(all, pos); if (name == NULL) { - if (!PyErr_ExceptionMatches(PyExc_IndexError)) + if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) { err = -1; - else - PyErr_Clear(); + } + else { + _PyErr_Clear(tstate); + } break; } if (!PyUnicode_Check(name)) { @@ -5189,17 +5227,17 @@ import_all_from(PyObject *locals, PyObject *v) break; } if (!PyUnicode_Check(modname)) { - PyErr_Format(PyExc_TypeError, - "module __name__ must be a string, not %.100s", - Py_TYPE(modname)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "module __name__ must be a string, not %.100s", + Py_TYPE(modname)->tp_name); } else { - PyErr_Format(PyExc_TypeError, - "%s in %U.%s must be str, not %.100s", - skip_leading_underscores ? "Key" : "Item", - modname, - skip_leading_underscores ? "__dict__" : "__all__", - Py_TYPE(name)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "%s in %U.%s must be str, not %.100s", + skip_leading_underscores ? "Key" : "Item", + modname, + skip_leading_underscores ? "__dict__" : "__all__", + Py_TYPE(name)->tp_name); } Py_DECREF(modname); Py_DECREF(name); @@ -5234,22 +5272,22 @@ import_all_from(PyObject *locals, PyObject *v) } static int -check_args_iterable(PyObject *func, PyObject *args) +check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args) { if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) { - PyErr_Format(PyExc_TypeError, - "%.200s%.200s argument after * " - "must be an iterable, not %.200s", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - args->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "%.200s%.200s argument after * " + "must be an iterable, not %.200s", + PyEval_GetFuncName(func), + PyEval_GetFuncDesc(func), + args->ob_type->tp_name); return -1; } return 0; } static void -format_kwargs_error(PyObject *func, PyObject *kwargs) +format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs) { /* _PyDict_MergeEx raises attribute * error (percolated from an attempt @@ -5257,44 +5295,46 @@ format_kwargs_error(PyObject *func, PyObject *kwargs) * a type error if its second argument * is not a mapping. */ - if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Format(PyExc_TypeError, - "%.200s%.200s argument after ** " - "must be a mapping, not %.200s", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - kwargs->ob_type->tp_name); - } - else if (PyErr_ExceptionMatches(PyExc_KeyError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { + _PyErr_Format(tstate, PyExc_TypeError, + "%.200s%.200s argument after ** " + "must be a mapping, not %.200s", + PyEval_GetFuncName(func), + PyEval_GetFuncDesc(func), + kwargs->ob_type->tp_name); + } + else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { PyObject *exc, *val, *tb; - PyErr_Fetch(&exc, &val, &tb); + _PyErr_Fetch(tstate, &exc, &val, &tb); if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) { PyObject *key = PyTuple_GET_ITEM(val, 0); if (!PyUnicode_Check(key)) { - PyErr_Format(PyExc_TypeError, - "%.200s%.200s keywords must be strings", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func)); - } else { - PyErr_Format(PyExc_TypeError, - "%.200s%.200s got multiple " - "values for keyword argument '%U'", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - key); + _PyErr_Format(tstate, PyExc_TypeError, + "%.200s%.200s keywords must be strings", + PyEval_GetFuncName(func), + PyEval_GetFuncDesc(func)); + } + else { + _PyErr_Format(tstate, PyExc_TypeError, + "%.200s%.200s got multiple " + "values for keyword argument '%U'", + PyEval_GetFuncName(func), + PyEval_GetFuncDesc(func), + key); } Py_XDECREF(exc); Py_XDECREF(val); Py_XDECREF(tb); } else { - PyErr_Restore(exc, val, tb); + _PyErr_Restore(tstate, exc, val, tb); } } } static void -format_exc_check_arg(PyObject *exc, const char *format_str, PyObject *obj) +format_exc_check_arg(PyThreadState *tstate, PyObject *exc, + const char *format_str, PyObject *obj) { const char *obj_str; @@ -5305,52 +5345,52 @@ format_exc_check_arg(PyObject *exc, const char *format_str, PyObject *obj) if (!obj_str) return; - PyErr_Format(exc, format_str, obj_str); + _PyErr_Format(tstate, exc, format_str, obj_str); } static void -format_exc_unbound(PyCodeObject *co, int oparg) +format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg) { PyObject *name; /* Don't stomp existing exception */ - if (PyErr_Occurred()) + if (_PyErr_Occurred(tstate)) return; if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) { name = PyTuple_GET_ITEM(co->co_cellvars, oparg); - format_exc_check_arg( + format_exc_check_arg(tstate, PyExc_UnboundLocalError, UNBOUNDLOCAL_ERROR_MSG, name); } else { name = PyTuple_GET_ITEM(co->co_freevars, oparg - PyTuple_GET_SIZE(co->co_cellvars)); - format_exc_check_arg(PyExc_NameError, + format_exc_check_arg(tstate, PyExc_NameError, UNBOUNDFREE_ERROR_MSG, name); } } static void -format_awaitable_error(PyTypeObject *type, int prevopcode) +format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode) { if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) { if (prevopcode == BEFORE_ASYNC_WITH) { - PyErr_Format(PyExc_TypeError, - "'async with' received an object from __aenter__ " - "that does not implement __await__: %.100s", - type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'async with' received an object from __aenter__ " + "that does not implement __await__: %.100s", + type->tp_name); } else if (prevopcode == WITH_CLEANUP_START) { - PyErr_Format(PyExc_TypeError, - "'async with' received an object from __aexit__ " - "that does not implement __await__: %.100s", - type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'async with' received an object from __aexit__ " + "that does not implement __await__: %.100s", + type->tp_name); } } } static PyObject * -unicode_concatenate(PyObject *v, PyObject *w, +unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w, PyFrameObject *f, const _Py_CODEUNIT *next_instr) { PyObject *res; @@ -5390,7 +5430,7 @@ unicode_concatenate(PyObject *v, PyObject *w, if (locals && PyDict_CheckExact(locals)) { PyObject *w = PyDict_GetItemWithError(locals, name); if ((w == v && PyDict_DelItem(locals, name) != 0) || - (w == NULL && PyErr_Occurred())) + (w == NULL && _PyErr_Occurred(tstate))) { Py_DECREF(v); return NULL; diff --git a/Python/errors.c b/Python/errors.c index d9b69d9dc6ca..e721f1915da4 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -3,6 +3,7 @@ #include "Python.h" #include "pycore_coreconfig.h" +#include "pycore_pyerrors.h" #include "pycore_pystate.h" #include "pycore_traceback.h" @@ -27,13 +28,13 @@ _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(stderr); -/* Forward declaration */ -static void _PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, - PyObject **p_value, PyObject **p_traceback); -static void _PyErr_Clear(PyThreadState *tstate); +/* Forward declarations */ +static PyObject * +_PyErr_FormatV(PyThreadState *tstate, PyObject *exception, + const char *format, va_list vargs); -static void +void _PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *traceback) { @@ -95,7 +96,7 @@ _PyErr_CreateException(PyObject *exception, PyObject *value) } } -static void +void _PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value) { PyObject *exc_value; @@ -103,9 +104,9 @@ _PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value) if (exception != NULL && !PyExceptionClass_Check(exception)) { - PyErr_Format(PyExc_SystemError, - "exception %R not a BaseException subclass", - exception); + _PyErr_Format(tstate, PyExc_SystemError, + "exception %R not a BaseException subclass", + exception); return; } @@ -181,7 +182,7 @@ _PyErr_SetKeyError(PyObject *arg) Py_DECREF(tup); } -static void +void _PyErr_SetNone(PyThreadState *tstate, PyObject *exception) { _PyErr_SetObject(tstate, exception, (PyObject *)NULL); @@ -196,7 +197,7 @@ PyErr_SetNone(PyObject *exception) } -static void +void _PyErr_SetString(PyThreadState *tstate, PyObject *exception, const char *string) { @@ -213,13 +214,6 @@ PyErr_SetString(PyObject *exception, const char *string) } -static PyObject* -_PyErr_Occurred(PyThreadState *tstate) -{ - return tstate == NULL ? NULL : tstate->curexc_type; -} - - PyObject* _Py_HOT_FUNCTION PyErr_Occurred(void) { @@ -260,11 +254,18 @@ PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc) } +int +_PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc) +{ + return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc); +} + + int PyErr_ExceptionMatches(PyObject *exc) { PyThreadState *tstate = _PyThreadState_GET(); - return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc); + return _PyErr_ExceptionMatches(tstate, exc); } @@ -278,7 +279,7 @@ PyErr_ExceptionMatches(PyObject *exc) XXX: should PyErr_NormalizeException() also call PyException_SetTraceback() with the resulting value and tb? */ -static void +void _PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc, PyObject **val, PyObject **tb) { @@ -390,7 +391,7 @@ PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) } -static void +void _PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value, PyObject **p_traceback) { @@ -412,7 +413,7 @@ PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) } -static void +void _PyErr_Clear(PyThreadState *tstate) { _PyErr_Restore(tstate, NULL, NULL, NULL); @@ -506,7 +507,7 @@ _PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception, Py_DECREF(exc); assert(!_PyErr_Occurred(tstate)); - PyErr_FormatV(exception, format, vargs); + _PyErr_FormatV(tstate, exception, format, vargs); _PyErr_Fetch(tstate, &exc, &val2, &tb); _PyErr_NormalizeException(tstate, &exc, &val2, &tb); @@ -895,9 +896,10 @@ PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) void _PyErr_BadInternalCall(const char *filename, int lineno) { - PyErr_Format(PyExc_SystemError, - "%s:%d: bad argument to internal function", - filename, lineno); + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_Format(tstate, PyExc_SystemError, + "%s:%d: bad argument to internal function", + filename, lineno); } /* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can @@ -907,16 +909,17 @@ void PyErr_BadInternalCall(void) { assert(0 && "bad argument to internal function"); - PyErr_Format(PyExc_SystemError, - "bad argument to internal function"); + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_SetString(tstate, PyExc_SystemError, + "bad argument to internal function"); } #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) -PyObject * -PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) +static PyObject * +_PyErr_FormatV(PyThreadState *tstate, PyObject *exception, + const char *format, va_list vargs) { - PyThreadState *tstate = _PyThreadState_GET(); PyObject* string; /* Issue #23571: PyUnicode_FromFormatV() must not be called with an @@ -931,16 +934,41 @@ PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) } +PyObject * +PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyErr_FormatV(tstate, exception, format, vargs); +} + + +PyObject * +_PyErr_Format(PyThreadState *tstate, PyObject *exception, + const char *format, ...) +{ + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + _PyErr_FormatV(tstate, exception, format, vargs); + va_end(vargs); + return NULL; +} + + PyObject * PyErr_Format(PyObject *exception, const char *format, ...) { + PyThreadState *tstate = _PyThreadState_GET(); va_list vargs; #ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); #else va_start(vargs); #endif - PyErr_FormatV(exception, format, vargs); + _PyErr_FormatV(tstate, exception, format, vargs); va_end(vargs); return NULL; } diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 7219f548fd25..26cb02aad5f1 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -12,6 +12,7 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ +#include "pycore_pyerrors.h" #include "pycore_pylifecycle.h" #include "pycore_pystate.h" #include "grammar.h" @@ -542,12 +543,6 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, return 0; } -void -PyErr_Print(void) -{ - PyErr_PrintEx(1); -} - static void print_error_text(PyObject *f, int offset, PyObject *text_obj) { @@ -667,34 +662,38 @@ handle_system_exit(void) } -void -PyErr_PrintEx(int set_sys_last_vars) +static void +_PyErr_PrintEx(PyThreadState *tstate, int set_sys_last_vars) { PyObject *exception, *v, *tb, *hook; handle_system_exit(); - PyErr_Fetch(&exception, &v, &tb); - if (exception == NULL) - return; - PyErr_NormalizeException(&exception, &v, &tb); + _PyErr_Fetch(tstate, &exception, &v, &tb); + if (exception == NULL) { + goto done; + } + + _PyErr_NormalizeException(tstate, &exception, &v, &tb); if (tb == NULL) { tb = Py_None; Py_INCREF(tb); } PyException_SetTraceback(v, tb); - if (exception == NULL) - return; + if (exception == NULL) { + goto done; + } + /* Now we know v != NULL too */ if (set_sys_last_vars) { if (_PySys_SetObjectId(&PyId_last_type, exception) < 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); } if (_PySys_SetObjectId(&PyId_last_value, v) < 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); } if (_PySys_SetObjectId(&PyId_last_traceback, tb) < 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); } } hook = _PySys_GetObjectId(&PyId_excepthook); @@ -710,8 +709,8 @@ PyErr_PrintEx(int set_sys_last_vars) handle_system_exit(); PyObject *exception2, *v2, *tb2; - PyErr_Fetch(&exception2, &v2, &tb2); - PyErr_NormalizeException(&exception2, &v2, &tb2); + _PyErr_Fetch(tstate, &exception2, &v2, &tb2); + _PyErr_NormalizeException(tstate, &exception2, &v2, &tb2); /* It should not be possible for exception2 or v2 to be NULL. However PyErr_Display() can't tolerate NULLs, so just be safe. */ @@ -733,15 +732,37 @@ PyErr_PrintEx(int set_sys_last_vars) Py_XDECREF(tb2); } Py_XDECREF(result); - } else { + } + else { PySys_WriteStderr("sys.excepthook is missing\n"); PyErr_Display(exception, v, tb); } + +done: Py_XDECREF(exception); Py_XDECREF(v); Py_XDECREF(tb); } +void +_PyErr_Print(PyThreadState *tstate) +{ + _PyErr_PrintEx(tstate, 1); +} + +void +PyErr_PrintEx(int set_sys_last_vars) +{ + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_PrintEx(tstate, set_sys_last_vars); +} + +void +PyErr_Print(void) +{ + PyErr_PrintEx(1); +} + static void print_exception(PyObject *f, PyObject *value) { From webhook-mailer at python.org Fri May 24 11:33:55 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 15:33:55 -0000 Subject: [Python-checkins] bpo-21536: On Cygwin, C extensions must be linked with libpython (GH-13549) Message-ID: https://github.com/python/cpython/commit/c994c8fc196a167c57c8850e8abdee170d366eec commit: c994c8fc196a167c57c8850e8abdee170d366eec branch: master author: E. M. Bray committer: Victor Stinner date: 2019-05-24T17:33:47+02:00 summary: bpo-21536: On Cygwin, C extensions must be linked with libpython (GH-13549) It is also possible to link against a library or executable with a statically linked libpython, but not both with the same DLL. In fact building a statically linked python is currently broken on Cygwin for other (related) reasons. The same problem applies to other POSIX-like layers over Windows (MinGW, MSYS) but Python's build system does not seem to attempt to support those platforms at the moment. files: M Doc/distutils/apiref.rst M Doc/whatsnew/3.8.rst M Lib/distutils/command/build_ext.py M Misc/NEWS.d/3.8.0a4.rst M configure M configure.ac diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst index cbeedab5bb12..2601d30f63eb 100644 --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -290,7 +290,7 @@ the full reference. .. versionchanged:: 3.8 On Unix, C extensions are no longer linked to libpython except on - Android. + Android and Cygwin. .. class:: Distribution diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index b91f7bca63c9..b5d70b5a2ec4 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -138,7 +138,8 @@ environment variable, can be set using the new ``./configure --with-trace-refs`` build option. (Contributed by Victor Stinner in :issue:`36465`.) -On Unix, C extensions are no longer linked to libpython except on Android. +On Unix, C extensions are no longer linked to libpython except on Android +and Cygwin. It is now possible for a statically linked Python to load a C extension built using a shared library Python. @@ -163,8 +164,8 @@ previous command fails (replace ``X.Y`` with the Python version). On the other hand, ``pkg-config python3.8 --libs`` no longer contains ``-lpython3.8``. C extensions must not be linked to libpython (except on -Android, case handled by the script); this change is backward incompatible on -purpose. +Android and Cygwin, whose cases are handled by the script); +this change is backward incompatible on purpose. (Contributed by Victor Stinner in :issue:`36721`.) f-strings now support = for quick and easy debugging @@ -1061,12 +1062,12 @@ Changes in the C API instead. (Contributed by Victor Stinner in :issue:`36728`.) -* On Unix, C extensions are no longer linked to libpython except on - Android. When Python is embedded, ``libpython`` must not be loaded with +* On Unix, C extensions are no longer linked to libpython except on Android + and Cygwin. When Python is embedded, ``libpython`` must not be loaded with ``RTLD_LOCAL``, but ``RTLD_GLOBAL`` instead. Previously, using - ``RTLD_LOCAL``, it was already not possible to load C extensions which were - not linked to ``libpython``, like C extensions of the standard library built - by the ``*shared*`` section of ``Modules/Setup``. + ``RTLD_LOCAL``, it was already not possible to load C extensions which + were not linked to ``libpython``, like C extensions of the standard + library built by the ``*shared*`` section of ``Modules/Setup``. * Use of ``#`` variants of formats in parsing or building value (e.g. :c:func:`PyArg_ParseTuple`, :c:func:`Py_BuildValue`, :c:func:`PyObject_CallFunction`, diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index c3b9602461f9..2d7cdf063f01 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -714,20 +714,32 @@ def get_libraries(self, ext): # don't extend ext.libraries, it may be shared with other # extensions, it is a reference to the original list return ext.libraries + [pythonlib] - # On Android only the main executable and LD_PRELOADs are considered - # to be RTLD_GLOBAL, all the dependencies of the main executable - # remain RTLD_LOCAL and so the shared libraries must be linked with - # libpython when python is built with a shared python library (issue - # bpo-21536). else: + # On Android only the main executable and LD_PRELOADs are considered + # to be RTLD_GLOBAL, all the dependencies of the main executable + # remain RTLD_LOCAL and so the shared libraries must be linked with + # libpython when python is built with a shared python library (issue + # bpo-21536). + # On Cygwin (and if required, other POSIX-like platforms based on + # Windows like MinGW) it is simply necessary that all symbols in + # shared libraries are resolved at link time. from distutils.sysconfig import get_config_var + link_libpython = False if get_config_var('Py_ENABLE_SHARED'): - # Either a native build on an Android device or the - # cross-compilation of Python. - if (hasattr(sys, 'getandroidapilevel') or - ('_PYTHON_HOST_PLATFORM' in os.environ and - get_config_var('ANDROID_API_LEVEL') != 0)): - ldversion = get_config_var('LDVERSION') - return ext.libraries + ['python' + ldversion] + # A native build on an Android device or on Cygwin + if hasattr(sys, 'getandroidapilevel'): + link_libpython = True + elif sys.platform == 'cygwin': + link_libpython = True + elif '_PYTHON_HOST_PLATFORM' in os.environ: + # We are cross-compiling for one of the relevant platforms + if get_config_var('ANDROID_API_LEVEL') != 0: + link_libpython = True + elif get_config_var('MACHDEP') == 'cygwin': + link_libpython = True + + if link_libpython: + ldversion = get_config_var('LDVERSION') + return ext.libraries + ['python' + ldversion] return ext.libraries diff --git a/Misc/NEWS.d/3.8.0a4.rst b/Misc/NEWS.d/3.8.0a4.rst index b92e60a92691..80e01d97a043 100644 --- a/Misc/NEWS.d/3.8.0a4.rst +++ b/Misc/NEWS.d/3.8.0a4.rst @@ -1052,7 +1052,8 @@ Remove the stale scriptsinstall Makefile target. .. nonce: ACQkiC .. section: Build -On Unix, C extensions are no longer linked to libpython except on Android. +On Unix, C extensions are no longer linked to libpython except on Android +and Cygwin. It is now possible for a statically linked Python to load a C extension built using a shared library Python. diff --git a/configure b/configure index 9f2007fed325..c76eb7affe54 100755 --- a/configure +++ b/configure @@ -15129,9 +15129,9 @@ LDVERSION='$(VERSION)$(ABIFLAGS)' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDVERSION" >&5 $as_echo "$LDVERSION" >&6; } -# On Android the shared libraries must be linked with libpython. +# On Android and Cygwin the shared libraries must be linked with libpython. -if test -z "$ANDROID_API_LEVEL"; then +if test -z "$ANDROID_API_LEVEL" -o "$MACHDEP" != "cygwin"; then LIBPYTHON='' else LIBPYTHON="-lpython${VERSION}${ABIFLAGS}" diff --git a/configure.ac b/configure.ac index 0baf0d6660aa..99d99ae55c17 100644 --- a/configure.ac +++ b/configure.ac @@ -4620,9 +4620,9 @@ AC_MSG_CHECKING(LDVERSION) LDVERSION='$(VERSION)$(ABIFLAGS)' AC_MSG_RESULT($LDVERSION) -# On Android the shared libraries must be linked with libpython. +# On Android and Cygwin the shared libraries must be linked with libpython. AC_SUBST(LIBPYTHON) -if test -z "$ANDROID_API_LEVEL"; then +if test -z "$ANDROID_API_LEVEL" -o "$MACHDEP" != "cygwin"; then LIBPYTHON='' else LIBPYTHON="-lpython${VERSION}${ABIFLAGS}" From webhook-mailer at python.org Fri May 24 12:15:43 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 24 May 2019 16:15:43 -0000 Subject: [Python-checkins] bpo-36511: Ensure error code propagates out of batch files (GH-13529) Message-ID: https://github.com/python/cpython/commit/51394b8c3d42e6e6d368251ff6f0612495724fc0 commit: 51394b8c3d42e6e6d368251ff6f0612495724fc0 branch: master author: Paul Monson committer: Steve Dower date: 2019-05-24T09:15:39-07:00 summary: bpo-36511: Ensure error code propagates out of batch files (GH-13529) files: M Tools/buildbot/test.bat diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index b84e8e255672..f430680f3d80 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -21,7 +21,7 @@ echo on if "%arm32_ssh%"=="true" goto :Arm32Ssh call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% -exit /b 0 +exit /b %ERRORLEVEL% :Arm32Ssh set dashU=-unetwork,decimal,subprocess,urlfetch,tzdata @@ -42,7 +42,7 @@ scp -r "%PYTHON_SOURCE%Lib" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Lib" set rt_args=%rt_opts% %dashU% -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% %TEMP_ARGS% ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% -exit /b 0 +exit /b %ERRORLEVEL% :Arm32SshHelp echo SSH_SERVER environment variable must be set to administrator@[ip address] From webhook-mailer at python.org Fri May 24 12:27:17 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 16:27:17 -0000 Subject: [Python-checkins] bpo-36721: Fix pkg-config symbolic links on "make install" (GH-13551) Message-ID: https://github.com/python/cpython/commit/bc66faccb8a6140e7e07b5e67843b7f21152c144 commit: bc66faccb8a6140e7e07b5e67843b7f21152c144 branch: master author: Victor Stinner committer: GitHub date: 2019-05-24T18:27:13+02:00 summary: bpo-36721: Fix pkg-config symbolic links on "make install" (GH-13551) files: M Makefile.pre.in diff --git a/Makefile.pre.in b/Makefile.pre.in index a149fdec4dcf..466cd763c98d 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1261,8 +1261,8 @@ bininstall: altbininstall (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(LDVERSION)-config python$(VERSION)-config); \ rm -f $(DESTDIR)$(LIBPC)/python-$(LDVERSION).pc; \ (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python-$(LDVERSION).pc); \ - rm -f $(DESTDIR)$(LIBPC)/python-embed-$(LDVERSION).pc; \ - (cd $(DESTDIR)$(LIBPC); $(LN) -s python-embed-$(VERSION).pc python-embed-$(LDVERSION).pc); \ + rm -f $(DESTDIR)$(LIBPC)/python-$(LDVERSION)-embed.pc; \ + (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)-embed.pc python-$(LDVERSION)-embed.pc); \ fi -rm -f $(DESTDIR)$(BINDIR)/python3-config (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python3-config) From webhook-mailer at python.org Fri May 24 12:39:43 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 16:39:43 -0000 Subject: [Python-checkins] bpo-21536: Fix configure.ac for LIBPYTHON on Android/Cygwin (GH-13552) Message-ID: https://github.com/python/cpython/commit/b1fc41784136a2eb9737a7f0c821db52ab8d4dee commit: b1fc41784136a2eb9737a7f0c821db52ab8d4dee branch: master author: E. M. Bray committer: Victor Stinner date: 2019-05-24T18:39:38+02:00 summary: bpo-21536: Fix configure.ac for LIBPYTHON on Android/Cygwin (GH-13552) Add also missing AC_MSG_RESULT for AC_MSG_CHECKING(MACHDEP). files: M configure M configure.ac diff --git a/configure b/configure index c76eb7affe54..bc276ac58362 100755 --- a/configure +++ b/configure @@ -3292,6 +3292,8 @@ then '') MACHDEP="unknown";; esac fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$MACHDEP\"" >&5 +$as_echo "\"$MACHDEP\"" >&6; } if test "$cross_compiling" = yes; then @@ -15131,10 +15133,10 @@ $as_echo "$LDVERSION" >&6; } # On Android and Cygwin the shared libraries must be linked with libpython. -if test -z "$ANDROID_API_LEVEL" -o "$MACHDEP" != "cygwin"; then - LIBPYTHON='' -else +if test -n "$ANDROID_API_LEVEL" -o "$MACHDEP" = "cygwin"; then LIBPYTHON="-lpython${VERSION}${ABIFLAGS}" +else + LIBPYTHON='' fi diff --git a/configure.ac b/configure.ac index 99d99ae55c17..5e565191f27d 100644 --- a/configure.ac +++ b/configure.ac @@ -411,6 +411,7 @@ then '') MACHDEP="unknown";; esac fi +AC_MSG_RESULT("$MACHDEP") AC_SUBST(_PYTHON_HOST_PLATFORM) if test "$cross_compiling" = yes; then @@ -4622,10 +4623,10 @@ AC_MSG_RESULT($LDVERSION) # On Android and Cygwin the shared libraries must be linked with libpython. AC_SUBST(LIBPYTHON) -if test -z "$ANDROID_API_LEVEL" -o "$MACHDEP" != "cygwin"; then - LIBPYTHON='' -else +if test -n "$ANDROID_API_LEVEL" -o "$MACHDEP" = "cygwin"; then LIBPYTHON="-lpython${VERSION}${ABIFLAGS}" +else + LIBPYTHON='' fi dnl define LIBPL after ABIFLAGS and LDVERSION is defined. From webhook-mailer at python.org Fri May 24 13:24:47 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Fri, 24 May 2019 17:24:47 -0000 Subject: [Python-checkins] bpo-8138: Initialize wsgiref's SimpleServer as single-threaded (GH-12977) Message-ID: https://github.com/python/cpython/commit/14738ff83d852c95a0cf33e5c90a85860a9c5620 commit: 14738ff83d852c95a0cf33e5c90a85860a9c5620 branch: master author: Berker Peksag committer: GitHub date: 2019-05-24T20:24:42+03:00 summary: bpo-8138: Initialize wsgiref's SimpleServer as single-threaded (GH-12977) files: A Misc/NEWS.d/next/Library/2019-04-27-02-54-23.bpo-8138.osBRGI.rst M Lib/wsgiref/simple_server.py diff --git a/Lib/wsgiref/simple_server.py b/Lib/wsgiref/simple_server.py index f71563a5ae08..93d01a863adf 100644 --- a/Lib/wsgiref/simple_server.py +++ b/Lib/wsgiref/simple_server.py @@ -127,7 +127,8 @@ def handle(self): return handler = ServerHandler( - self.rfile, self.wfile, self.get_stderr(), self.get_environ() + self.rfile, self.wfile, self.get_stderr(), self.get_environ(), + multithread=False, ) handler.request_handler = self # backpointer for logging handler.run(self.server.get_app()) diff --git a/Misc/NEWS.d/next/Library/2019-04-27-02-54-23.bpo-8138.osBRGI.rst b/Misc/NEWS.d/next/Library/2019-04-27-02-54-23.bpo-8138.osBRGI.rst new file mode 100644 index 000000000000..e94d0a68d465 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-27-02-54-23.bpo-8138.osBRGI.rst @@ -0,0 +1,2 @@ +Don't mark ``wsgiref.simple_server.SimpleServer`` as multi-threaded since +``wsgiref.simple_server.WSGIServer`` is single-threaded. From webhook-mailer at python.org Fri May 24 16:00:12 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 24 May 2019 20:00:12 -0000 Subject: [Python-checkins] bpo-37023: Skip test_gdb under PGO (GH-13555) Message-ID: https://github.com/python/cpython/commit/6de4574c6393b9cf8d7dfb0dc6ce53ee5b9ea841 commit: 6de4574c6393b9cf8d7dfb0dc6ce53ee5b9ea841 branch: master author: Steve Dower committer: GitHub date: 2019-05-24T13:00:04-07:00 summary: bpo-37023: Skip test_gdb under PGO (GH-13555) files: M Lib/test/test_gdb.py diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index 4d1ce4ed96c0..dbcb5983e9ba 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -52,6 +52,10 @@ def get_gdb_version(): raise unittest.SkipTest("test_gdb doesn't work correctly when python is" " built with LLVM clang") +if ((sysconfig.get_config_var('PGO_PROF_USE_FLAG') or 'xxx') in + (sysconfig.get_config_var('PY_CORE_CFLAGS') or '')): + raise unittest.SkipTest("test_gdb is not reliable on PGO builds") + # Location of custom hooks file in a repository checkout. checkout_hook_path = os.path.join(os.path.dirname(sys.executable), 'python-gdb.py') @@ -272,7 +276,7 @@ def get_gdb_repr(self, source, # gdb can insert additional '\n' and space characters in various places # in its output, depending on the width of the terminal it's connected # to (using its "wrap_here" function) - m = re.match(r'.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+\S*Python/bltinmodule.c.*', + m = re.match(r'.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)?\)\s+at\s+\S*Python/bltinmodule.c.*', gdb_output, re.DOTALL) if not m: self.fail('Unexpected gdb output: %r\n%s' % (gdb_output, gdb_output)) From webhook-mailer at python.org Fri May 24 16:06:38 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 20:06:38 -0000 Subject: [Python-checkins] bpo-35907: Clarify the NEWS entry (GH-13523) Message-ID: https://github.com/python/cpython/commit/deffee57749cf29ba17f50f11fb2a8cbc3e3752d commit: deffee57749cf29ba17f50f11fb2a8cbc3e3752d branch: master author: Victor Stinner committer: GitHub date: 2019-05-24T22:06:32+02:00 summary: bpo-35907: Clarify the NEWS entry (GH-13523) files: M Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst diff --git a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst index 42aca0bbd1b7..9628c8797572 100644 --- a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst +++ b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst @@ -1,2 +1,3 @@ -CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in -``URLopener().open()`` ``URLopener().retrieve()`` of :mod:`urllib.request`. +CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and +``local_file://`` URL schemes in ``URLopener().open()`` +``URLopener().retrieve()`` of :mod:`urllib.request`. From webhook-mailer at python.org Fri May 24 16:44:35 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 24 May 2019 20:44:35 -0000 Subject: [Python-checkins] bpo-36969: Make PDB args command display positional only arguments (GH-13459) Message-ID: https://github.com/python/cpython/commit/458560347f5c28e162bb288adfa0cfe5aad79557 commit: 458560347f5c28e162bb288adfa0cfe5aad79557 branch: master author: R?mi Lapeyre committer: Pablo Galindo date: 2019-05-24T21:44:31+01:00 summary: bpo-36969: Make PDB args command display positional only arguments (GH-13459) files: A Misc/NEWS.d/next/Library/2019-05-21-12-31-21.bpo-36969.u7cxu7.rst M Lib/pdb.py M Lib/test/test_pdb.py diff --git a/Lib/pdb.py b/Lib/pdb.py index 0e7609e43d4e..13068ce27bd1 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1132,7 +1132,7 @@ def do_args(self, arg): """ co = self.curframe.f_code dict = self.curframe_locals - n = co.co_argcount + co.co_kwonlyargcount + n = co.co_argcount + co.co_posonlyargcount + co.co_kwonlyargcount if co.co_flags & inspect.CO_VARARGS: n = n+1 if co.co_flags & inspect.CO_VARKEYWORDS: n = n+1 for i in range(n): diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index a33494d6d878..d03f1b284300 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -80,10 +80,14 @@ def test_pdb_basic_commands(): >>> def test_function3(arg=None, *, kwonly=None): ... pass + >>> def test_function4(a, b, c, /): + ... pass + >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... ret = test_function_2('baz') ... test_function3(kwonly=True) + ... test_function4(1, 2, 3) ... print(ret) >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE @@ -104,10 +108,14 @@ def test_pdb_basic_commands(): ... 'next', # step to test_function3() ... 'step', # stepping into test_function3() ... 'args', # display function args + ... 'return', # return out of function + ... 'next', # step to test_function4() + ... 'step', # stepping to test_function4() + ... 'args', # display function args ... 'continue', ... ]): ... test_function() - > (3)test_function() + > (3)test_function() -> ret = test_function_2('baz') (Pdb) step --Call-- @@ -130,14 +138,14 @@ def test_pdb_basic_commands(): [EOF] (Pdb) bt ... - (21)() + (25)() -> test_function() - (3)test_function() + (3)test_function() -> ret = test_function_2('baz') > (1)test_function_2() -> def test_function_2(foo, bar='default'): (Pdb) up - > (3)test_function() + > (3)test_function() -> ret = test_function_2('baz') (Pdb) down > (1)test_function_2() @@ -176,7 +184,7 @@ def test_pdb_basic_commands(): (Pdb) retval 'BAZ' (Pdb) next - > (4)test_function() + > (4)test_function() -> test_function3(kwonly=True) (Pdb) step --Call-- @@ -185,6 +193,21 @@ def test_pdb_basic_commands(): (Pdb) args arg = None kwonly = True + (Pdb) return + --Return-- + > (2)test_function3()->None + -> pass + (Pdb) next + > (5)test_function() + -> test_function4(1, 2, 3) + (Pdb) step + --Call-- + > (1)test_function4() + -> def test_function4(a, b, c, /): + (Pdb) args + a = 1 + b = 2 + c = 3 (Pdb) continue BAZ """ diff --git a/Misc/NEWS.d/next/Library/2019-05-21-12-31-21.bpo-36969.u7cxu7.rst b/Misc/NEWS.d/next/Library/2019-05-21-12-31-21.bpo-36969.u7cxu7.rst new file mode 100644 index 000000000000..1823a4dcc249 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-21-12-31-21.bpo-36969.u7cxu7.rst @@ -0,0 +1,2 @@ +PDB command `args` now display positional only arguments. Patch contributed +by R?mi Lapeyre. From webhook-mailer at python.org Fri May 24 17:06:29 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 21:06:29 -0000 Subject: [Python-checkins] bpo-35907: Fix typo in the NEWS entry (GH-13559) Message-ID: https://github.com/python/cpython/commit/1c9debd2366a21525769aaa99ce334092033a963 commit: 1c9debd2366a21525769aaa99ce334092033a963 branch: master author: Victor Stinner committer: GitHub date: 2019-05-24T23:06:25+02:00 summary: bpo-35907: Fix typo in the NEWS entry (GH-13559) files: M Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst diff --git a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst index 9628c8797572..37b567a5b6f9 100644 --- a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst +++ b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst @@ -1,3 +1,3 @@ CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and -``local_file://`` URL schemes in ``URLopener().open()`` +``local_file://`` URL schemes in ``URLopener().open()`` and ``URLopener().retrieve()`` of :mod:`urllib.request`. From webhook-mailer at python.org Fri May 24 17:09:27 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 24 May 2019 21:09:27 -0000 Subject: [Python-checkins] bpo-37021: Port _randommodule to the argument clinic (GH-13532) Message-ID: https://github.com/python/cpython/commit/561612d8456cfab5672c9b445521113b847bd6b3 commit: 561612d8456cfab5672c9b445521113b847bd6b3 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-24T22:09:23+01:00 summary: bpo-37021: Port _randommodule to the argument clinic (GH-13532) files: A Modules/clinic/_randommodule.c.h M Modules/_randommodule.c diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 6a48689204c5..85f6e4029299 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -89,6 +89,13 @@ static PyTypeObject Random_Type; #define RandomObject_Check(v) (Py_TYPE(v) == &Random_Type) +#include "clinic/_randommodule.c.h" + +/*[clinic input] +module _random +class _random.Random "RandomObject *" "&Random_Type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f79898ae7847c321]*/ /* Random methods */ @@ -137,8 +144,18 @@ genrand_int32(RandomObject *self) * lower 26 bits of the 53-bit numerator. * The original code credited Isaku Wada for this algorithm, 2002/01/09. */ + +/*[clinic input] +_random.Random.random + + self: self(type="RandomObject *") + +random() -> x in the interval [0, 1). +[clinic start generated code]*/ + static PyObject * -random_random(RandomObject *self, PyObject *Py_UNUSED(ignored)) +_random_Random_random_impl(RandomObject *self) +/*[clinic end generated code: output=117ff99ee53d755c input=afb2a59cbbb00349]*/ { uint32_t a=genrand_int32(self)>>5, b=genrand_int32(self)>>6; return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0)); @@ -232,20 +249,16 @@ random_seed_time_pid(RandomObject *self) } static PyObject * -random_seed(RandomObject *self, PyObject *args) +random_seed(RandomObject *self, PyObject *arg) { PyObject *result = NULL; /* guilty until proved innocent */ PyObject *n = NULL; uint32_t *key = NULL; size_t bits, keyused; int res; - PyObject *arg = NULL; - - if (!PyArg_UnpackTuple(args, "seed", 0, 1, &arg)) - return NULL; - if (arg == NULL || arg == Py_None) { - if (random_seed_urandom(self) < 0) { + if (arg == NULL || arg == Py_None) { + if (random_seed_urandom(self) < 0) { PyErr_Clear(); /* Reading system entropy failed, fall back on the worst entropy: @@ -317,8 +330,37 @@ random_seed(RandomObject *self, PyObject *args) return result; } +/*[clinic input] +_random.Random.seed + + self: self(type="RandomObject *") + n: object = None + / + +seed([n]) -> None. + +Defaults to use urandom and falls back to a combination +of the current time and the process identifier. +[clinic start generated code]*/ + +static PyObject * +_random_Random_seed_impl(RandomObject *self, PyObject *n) +/*[clinic end generated code: output=0fad1e16ba883681 input=78d6ef0d52532a54]*/ +{ + return random_seed(self, n); +} + +/*[clinic input] +_random.Random.getstate + + self: self(type="RandomObject *") + +getstate() -> tuple containing the current state. +[clinic start generated code]*/ + static PyObject * -random_getstate(RandomObject *self, PyObject *Py_UNUSED(ignored)) +_random_Random_getstate_impl(RandomObject *self) +/*[clinic end generated code: output=bf6cef0c092c7180 input=b937a487928c0e89]*/ { PyObject *state; PyObject *element; @@ -344,8 +386,20 @@ random_getstate(RandomObject *self, PyObject *Py_UNUSED(ignored)) return NULL; } + +/*[clinic input] +_random.Random.setstate + + self: self(type="RandomObject *") + state: object + / + +setstate(state) -> None. Restores generator state. +[clinic start generated code]*/ + static PyObject * -random_setstate(RandomObject *self, PyObject *state) +_random_Random_setstate(RandomObject *self, PyObject *state) +/*[clinic end generated code: output=fd1c3cd0037b6681 input=b3b4efbb1bc66af8]*/ { int i; unsigned long element; @@ -384,17 +438,26 @@ random_setstate(RandomObject *self, PyObject *state) Py_RETURN_NONE; } +/*[clinic input] + +_random.Random.getrandbits + + self: self(type="RandomObject *") + k: int + / + +getrandbits(k) -> x. Generates an int with k random bits. +[clinic start generated code]*/ + static PyObject * -random_getrandbits(RandomObject *self, PyObject *args) +_random_Random_getrandbits_impl(RandomObject *self, int k) +/*[clinic end generated code: output=b402f82a2158887f input=8c0e6396dd176fc0]*/ { - int k, i, words; + int i, words; uint32_t r; uint32_t *wordarray; PyObject *result; - if (!PyArg_ParseTuple(args, "i:getrandbits", &k)) - return NULL; - if (k <= 0) { PyErr_SetString(PyExc_ValueError, "number of bits must be greater than zero"); @@ -453,17 +516,11 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } static PyMethodDef random_methods[] = { - {"random", (PyCFunction)random_random, METH_NOARGS, - PyDoc_STR("random() -> x in the interval [0, 1).")}, - {"seed", (PyCFunction)random_seed, METH_VARARGS, - PyDoc_STR("seed([n]) -> None. Defaults to current time.")}, - {"getstate", (PyCFunction)random_getstate, METH_NOARGS, - PyDoc_STR("getstate() -> tuple containing the current state.")}, - {"setstate", (PyCFunction)random_setstate, METH_O, - PyDoc_STR("setstate(state) -> None. Restores generator state.")}, - {"getrandbits", (PyCFunction)random_getrandbits, METH_VARARGS, - PyDoc_STR("getrandbits(k) -> x. Generates an int with " - "k random bits.")}, + _RANDOM_RANDOM_RANDOM_METHODDEF + _RANDOM_RANDOM_SEED_METHODDEF + _RANDOM_RANDOM_GETSTATE_METHODDEF + _RANDOM_RANDOM_SETSTATE_METHODDEF + _RANDOM_RANDOM_GETRANDBITS_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/clinic/_randommodule.c.h b/Modules/clinic/_randommodule.c.h new file mode 100644 index 000000000000..a467811d93b2 --- /dev/null +++ b/Modules/clinic/_randommodule.c.h @@ -0,0 +1,117 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_random_Random_random__doc__, +"random($self, /)\n" +"--\n" +"\n" +"random() -> x in the interval [0, 1)."); + +#define _RANDOM_RANDOM_RANDOM_METHODDEF \ + {"random", (PyCFunction)_random_Random_random, METH_NOARGS, _random_Random_random__doc__}, + +static PyObject * +_random_Random_random_impl(RandomObject *self); + +static PyObject * +_random_Random_random(RandomObject *self, PyObject *Py_UNUSED(ignored)) +{ + return _random_Random_random_impl(self); +} + +PyDoc_STRVAR(_random_Random_seed__doc__, +"seed($self, n=None, /)\n" +"--\n" +"\n" +"seed([n]) -> None.\n" +"\n" +"Defaults to use urandom and falls back to a combination\n" +"of the current time and the process identifier."); + +#define _RANDOM_RANDOM_SEED_METHODDEF \ + {"seed", (PyCFunction)(void(*)(void))_random_Random_seed, METH_FASTCALL, _random_Random_seed__doc__}, + +static PyObject * +_random_Random_seed_impl(RandomObject *self, PyObject *n); + +static PyObject * +_random_Random_seed(RandomObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *n = Py_None; + + if (!_PyArg_CheckPositional("seed", nargs, 0, 1)) { + goto exit; + } + if (nargs < 1) { + goto skip_optional; + } + n = args[0]; +skip_optional: + return_value = _random_Random_seed_impl(self, n); + +exit: + return return_value; +} + +PyDoc_STRVAR(_random_Random_getstate__doc__, +"getstate($self, /)\n" +"--\n" +"\n" +"getstate() -> tuple containing the current state."); + +#define _RANDOM_RANDOM_GETSTATE_METHODDEF \ + {"getstate", (PyCFunction)_random_Random_getstate, METH_NOARGS, _random_Random_getstate__doc__}, + +static PyObject * +_random_Random_getstate_impl(RandomObject *self); + +static PyObject * +_random_Random_getstate(RandomObject *self, PyObject *Py_UNUSED(ignored)) +{ + return _random_Random_getstate_impl(self); +} + +PyDoc_STRVAR(_random_Random_setstate__doc__, +"setstate($self, state, /)\n" +"--\n" +"\n" +"setstate(state) -> None. Restores generator state."); + +#define _RANDOM_RANDOM_SETSTATE_METHODDEF \ + {"setstate", (PyCFunction)_random_Random_setstate, METH_O, _random_Random_setstate__doc__}, + +PyDoc_STRVAR(_random_Random_getrandbits__doc__, +"getrandbits($self, k, /)\n" +"--\n" +"\n" +"getrandbits(k) -> x. Generates an int with k random bits."); + +#define _RANDOM_RANDOM_GETRANDBITS_METHODDEF \ + {"getrandbits", (PyCFunction)_random_Random_getrandbits, METH_O, _random_Random_getrandbits__doc__}, + +static PyObject * +_random_Random_getrandbits_impl(RandomObject *self, int k); + +static PyObject * +_random_Random_getrandbits(RandomObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + int k; + + if (PyFloat_Check(arg)) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + k = _PyLong_AsInt(arg); + if (k == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = _random_Random_getrandbits_impl(self, k); + +exit: + return return_value; +} +/*[clinic end generated code: output=a7feb0c9c8d1b627 input=a9049054013a1b77]*/ From webhook-mailer at python.org Fri May 24 17:29:00 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 21:29:00 -0000 Subject: [Python-checkins] bpo-35907: Clarify the NEWS entry (GH-13557) Message-ID: https://github.com/python/cpython/commit/d9d1045837e5356331b6d5e24cbd1286acb62b5d commit: d9d1045837e5356331b6d5e24cbd1286acb62b5d branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-05-24T23:28:56+02:00 summary: bpo-35907: Clarify the NEWS entry (GH-13557) files: A Misc/NEWS.d/next/Security/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst D Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst diff --git a/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst b/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst deleted file mode 100644 index 6a448ce6261c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst +++ /dev/null @@ -1,3 +0,0 @@ -CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in -:func:`urllib.urlopen`, :meth:`urllib.URLopener.open` and -:meth:`urllib.URLopener.retrieve`. diff --git a/Misc/NEWS.d/next/Security/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst b/Misc/NEWS.d/next/Security/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst new file mode 100644 index 000000000000..a42a386022fa --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-02-13-17-21-10.bpo-35907.ckk2zg.rst @@ -0,0 +1,3 @@ +CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and +``local_file://`` URL schemes in :func:`urllib.urlopen`, +:meth:`urllib.URLopener.open` and :meth:`urllib.URLopener.retrieve`. From webhook-mailer at python.org Fri May 24 17:29:14 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 21:29:14 -0000 Subject: [Python-checkins] bpo-35907: Clarify the NEWS entry (GH-13558) Message-ID: https://github.com/python/cpython/commit/cee4ac8135fe9cf99de4ceca52d1f53e14b69dba commit: cee4ac8135fe9cf99de4ceca52d1f53e14b69dba branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-05-24T23:29:10+02:00 summary: bpo-35907: Clarify the NEWS entry (GH-13558) files: M Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst diff --git a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst index 16adc7a94e2f..37b567a5b6f9 100644 --- a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst +++ b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst @@ -1,2 +1,3 @@ -CVE-2019-9948: Avoid file reading as disallowing the unnecessary URL scheme in -``URLopener().open()`` and ``URLopener().retrieve()`` of :mod:`urllib.request`. +CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and +``local_file://`` URL schemes in ``URLopener().open()`` and +``URLopener().retrieve()`` of :mod:`urllib.request`. From webhook-mailer at python.org Fri May 24 17:57:27 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 21:57:27 -0000 Subject: [Python-checkins] bpo-37032: Add CodeType.replace() method (GH-13542) Message-ID: https://github.com/python/cpython/commit/a9f05d69ccbf3c75cdd604c25094282697789a62 commit: a9f05d69ccbf3c75cdd604c25094282697789a62 branch: master author: Victor Stinner committer: GitHub date: 2019-05-24T23:57:23+02:00 summary: bpo-37032: Add CodeType.replace() method (GH-13542) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-24-12-38-40.bpo-37032.T8rSH8.rst A Objects/clinic/codeobject.c.h M Doc/whatsnew/3.8.rst M Lib/modulefinder.py M Lib/test/test_code.py M Lib/test/test_import/__init__.py M Lib/types.py M Objects/codeobject.c diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index b5d70b5a2ec4..a94aba6b2c98 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -240,6 +240,9 @@ Other Language Changes and Windows use this to properly terminate scripts in interactive sessions. (Contributed by Google via Gregory P. Smith in :issue:`1054041`.) +* Added new ``replace()`` method to the code type (:class:`types.CodeType`). + (Contributed by Victor Stinner in :issue:`37032`.) + New Modules =========== @@ -1051,7 +1054,8 @@ Changes in the Python API * :class:`types.CodeType` has a new parameter in the second position of the constructor (*posonlyargcount*) to support positional-only arguments defined - in :pep:`570`. + in :pep:`570`. A new ``replace()`` method of :class:`types.CodeType` can be + used to make the code future-proof. Changes in the C API diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py index a36f1b6d58c4..e0d29984f862 100644 --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -619,13 +619,7 @@ def replace_paths_in_code(self, co): if isinstance(consts[i], type(co)): consts[i] = self.replace_paths_in_code(consts[i]) - return types.CodeType(co.co_argcount, co.co_posonlyargcount, - co.co_kwonlyargcount, co.co_nlocals, - co.co_stacksize, co.co_flags, - co.co_code, tuple(consts), co.co_names, - co.co_varnames, new_filename, co.co_name, - co.co_firstlineno, co.co_lnotab, co.co_freevars, - co.co_cellvars) + return co.replace(co_consts=tuple(consts), co_filename=new_filename) def test(): diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 9bf290d8d5a1..91008c04f7fd 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -174,18 +174,14 @@ def test_newempty(self): @cpython_only def test_closure_injection(self): # From https://bugs.python.org/issue32176 - from types import FunctionType, CodeType + from types import FunctionType def create_closure(__class__): return (lambda: __class__).__closure__ def new_code(c): '''A new code object with a __class__ cell added to freevars''' - return CodeType( - c.co_argcount, c.co_posonlyargcount, c.co_kwonlyargcount, c.co_nlocals, - c.co_stacksize, c.co_flags, c.co_code, c.co_consts, c.co_names, - c.co_varnames, c.co_filename, c.co_name, c.co_firstlineno, - c.co_lnotab, c.co_freevars + ('__class__',), c.co_cellvars) + return c.replace(co_freevars=c.co_freevars + ('__class__',)) def add_foreign_method(cls, name, f): code = new_code(f.__code__) @@ -212,6 +208,64 @@ class List(list): obj = List([1, 2, 3]) self.assertEqual(obj[0], "Foreign getitem: 1") + def test_constructor(self): + def func(): pass + co = func.__code__ + CodeType = type(co) + + # test code constructor + return CodeType(co.co_argcount, + co.co_posonlyargcount, + co.co_kwonlyargcount, + co.co_nlocals, + co.co_stacksize, + co.co_flags, + co.co_code, + co.co_consts, + co.co_names, + co.co_varnames, + co.co_filename, + co.co_name, + co.co_firstlineno, + co.co_lnotab, + co.co_freevars, + co.co_cellvars) + + def test_replace(self): + def func(): + x = 1 + return x + code = func.__code__ + + # different co_name, co_varnames, co_consts + def func2(): + y = 2 + return y + code2 = func.__code__ + + for attr, value in ( + ("co_argcount", 0), + ("co_posonlyargcount", 0), + ("co_kwonlyargcount", 0), + ("co_nlocals", 0), + ("co_stacksize", 0), + ("co_flags", code.co_flags | inspect.CO_COROUTINE), + ("co_firstlineno", 100), + ("co_code", code2.co_code), + ("co_consts", code2.co_consts), + ("co_names", ("myname",)), + ("co_varnames", code2.co_varnames), + ("co_freevars", ("freevar",)), + ("co_cellvars", ("cellvar",)), + ("co_filename", "newfilename"), + ("co_name", "newname"), + ("co_lnotab", code2.co_lnotab), + ): + with self.subTest(attr=attr, value=value): + new_code = code.replace(**{attr: value}) + self.assertEqual(getattr(new_code, attr), value) + + def isinterned(s): return s is sys.intern(('_' + s + '_')[1:-1]) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 109b01413b2d..84cd0da94b36 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -674,13 +674,7 @@ def test_foreign_code(self): foreign_code = importlib.import_module.__code__ pos = constants.index(1) constants[pos] = foreign_code - code = type(code)(code.co_argcount, code.co_posonlyargcount, - code.co_kwonlyargcount, - code.co_nlocals, code.co_stacksize, - code.co_flags, code.co_code, tuple(constants), - code.co_names, code.co_varnames, code.co_filename, - code.co_name, code.co_firstlineno, code.co_lnotab, - code.co_freevars, code.co_cellvars) + code = code.replace(co_consts=tuple(constants)) with open(self.compiled_name, "wb") as f: f.write(header) marshal.dump(code, f) diff --git a/Lib/types.py b/Lib/types.py index 37ba4bb1f42e..ea3c0b29d5d4 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -262,14 +262,8 @@ def coroutine(func): if co_flags & 0x20: # TODO: Implement this in C. co = func.__code__ - func.__code__ = CodeType( - co.co_argcount, co.co_posonlyargcount, co.co_kwonlyargcount, co.co_nlocals, - co.co_stacksize, - co.co_flags | 0x100, # 0x100 == CO_ITERABLE_COROUTINE - co.co_code, - co.co_consts, co.co_names, co.co_varnames, co.co_filename, - co.co_name, co.co_firstlineno, co.co_lnotab, co.co_freevars, - co.co_cellvars) + # 0x100 == CO_ITERABLE_COROUTINE + func.__code__ = co.replace(co_flags=co.co_flags | 0x100) return func # The following code is primarily to support functions that diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-24-12-38-40.bpo-37032.T8rSH8.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-24-12-38-40.bpo-37032.T8rSH8.rst new file mode 100644 index 000000000000..7e31a84eb468 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-24-12-38-40.bpo-37032.T8rSH8.rst @@ -0,0 +1 @@ +Added new ``replace()`` method to the code type (:class:`types.CodeType`). diff --git a/Objects/clinic/codeobject.c.h b/Objects/clinic/codeobject.c.h new file mode 100644 index 000000000000..ec127ce17189 --- /dev/null +++ b/Objects/clinic/codeobject.c.h @@ -0,0 +1,256 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(code_replace__doc__, +"replace($self, /, *, co_argcount=-1, co_posonlyargcount=-1,\n" +" co_kwonlyargcount=-1, co_nlocals=-1, co_stacksize=-1,\n" +" co_flags=-1, co_firstlineno=-1, co_code=None, co_consts=None,\n" +" co_names=None, co_varnames=None, co_freevars=None,\n" +" co_cellvars=None, co_filename=None, co_name=None,\n" +" co_lnotab=None)\n" +"--\n" +"\n" +"Return a new code object with new specified fields."); + +#define CODE_REPLACE_METHODDEF \ + {"replace", (PyCFunction)(void(*)(void))code_replace, METH_FASTCALL|METH_KEYWORDS, code_replace__doc__}, + +static PyObject * +code_replace_impl(PyCodeObject *self, int co_argcount, + int co_posonlyargcount, int co_kwonlyargcount, + int co_nlocals, int co_stacksize, int co_flags, + int co_firstlineno, PyBytesObject *co_code, + PyObject *co_consts, PyObject *co_names, + PyObject *co_varnames, PyObject *co_freevars, + PyObject *co_cellvars, PyObject *co_filename, + PyObject *co_name, PyBytesObject *co_lnotab); + +static PyObject * +code_replace(PyCodeObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"co_argcount", "co_posonlyargcount", "co_kwonlyargcount", "co_nlocals", "co_stacksize", "co_flags", "co_firstlineno", "co_code", "co_consts", "co_names", "co_varnames", "co_freevars", "co_cellvars", "co_filename", "co_name", "co_lnotab", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "replace", 0}; + PyObject *argsbuf[16]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + int co_argcount = self->co_argcount; + int co_posonlyargcount = self->co_posonlyargcount; + int co_kwonlyargcount = self->co_kwonlyargcount; + int co_nlocals = self->co_nlocals; + int co_stacksize = self->co_stacksize; + int co_flags = self->co_flags; + int co_firstlineno = self->co_firstlineno; + PyBytesObject *co_code = (PyBytesObject *)self->co_code; + PyObject *co_consts = self->co_consts; + PyObject *co_names = self->co_names; + PyObject *co_varnames = self->co_varnames; + PyObject *co_freevars = self->co_freevars; + PyObject *co_cellvars = self->co_cellvars; + PyObject *co_filename = self->co_filename; + PyObject *co_name = self->co_name; + PyBytesObject *co_lnotab = (PyBytesObject *)self->co_lnotab; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[0]) { + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + co_argcount = _PyLong_AsInt(args[0]); + if (co_argcount == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + co_posonlyargcount = _PyLong_AsInt(args[1]); + if (co_posonlyargcount == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + co_kwonlyargcount = _PyLong_AsInt(args[2]); + if (co_kwonlyargcount == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[3]) { + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + co_nlocals = _PyLong_AsInt(args[3]); + if (co_nlocals == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[4]) { + if (PyFloat_Check(args[4])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + co_stacksize = _PyLong_AsInt(args[4]); + if (co_stacksize == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[5]) { + if (PyFloat_Check(args[5])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + co_flags = _PyLong_AsInt(args[5]); + if (co_flags == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[6]) { + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + co_firstlineno = _PyLong_AsInt(args[6]); + if (co_firstlineno == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[7]) { + if (!PyBytes_Check(args[7])) { + _PyArg_BadArgument("replace", 8, "bytes", args[7]); + goto exit; + } + co_code = (PyBytesObject *)args[7]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[8]) { + if (!PyTuple_Check(args[8])) { + _PyArg_BadArgument("replace", 9, "tuple", args[8]); + goto exit; + } + co_consts = args[8]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[9]) { + if (!PyTuple_Check(args[9])) { + _PyArg_BadArgument("replace", 10, "tuple", args[9]); + goto exit; + } + co_names = args[9]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[10]) { + if (!PyTuple_Check(args[10])) { + _PyArg_BadArgument("replace", 11, "tuple", args[10]); + goto exit; + } + co_varnames = args[10]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[11]) { + if (!PyTuple_Check(args[11])) { + _PyArg_BadArgument("replace", 12, "tuple", args[11]); + goto exit; + } + co_freevars = args[11]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[12]) { + if (!PyTuple_Check(args[12])) { + _PyArg_BadArgument("replace", 13, "tuple", args[12]); + goto exit; + } + co_cellvars = args[12]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[13]) { + if (!PyUnicode_Check(args[13])) { + _PyArg_BadArgument("replace", 14, "str", args[13]); + goto exit; + } + if (PyUnicode_READY(args[13]) == -1) { + goto exit; + } + co_filename = args[13]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[14]) { + if (!PyUnicode_Check(args[14])) { + _PyArg_BadArgument("replace", 15, "str", args[14]); + goto exit; + } + if (PyUnicode_READY(args[14]) == -1) { + goto exit; + } + co_name = args[14]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (!PyBytes_Check(args[15])) { + _PyArg_BadArgument("replace", 16, "bytes", args[15]); + goto exit; + } + co_lnotab = (PyBytesObject *)args[15]; +skip_optional_kwonly: + return_value = code_replace_impl(self, co_argcount, co_posonlyargcount, co_kwonlyargcount, co_nlocals, co_stacksize, co_flags, co_firstlineno, co_code, co_consts, co_names, co_varnames, co_freevars, co_cellvars, co_filename, co_name, co_lnotab); + +exit: + return return_value; +} +/*[clinic end generated code: output=624ab6f2ea8f0ea4 input=a9049054013a1b77]*/ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index f4e48a9757e5..1e76f26d98fe 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -5,6 +5,7 @@ #include "structmember.h" #include "pycore_pystate.h" #include "pycore_tupleobject.h" +#include "clinic/codeobject.c.h" /* Holder for co_extra information */ typedef struct { @@ -12,6 +13,11 @@ typedef struct { void *ce_extras[1]; } _PyCodeObjectExtra; +/*[clinic input] +class code "PyCodeObject *" "&PyCode_Type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=78aa5d576683bb4b]*/ + /* all_name_chars(s): true iff s matches [a-zA-Z0-9_]* */ static int all_name_chars(PyObject *o) @@ -109,7 +115,8 @@ PyCode_New(int argcount, int posonlyargcount, int kwonlyargcount, /* Check argument types */ if (argcount < 0 || posonlyargcount < 0 || kwonlyargcount < 0 || - nlocals < 0 || code == NULL || !PyBytes_Check(code) || + nlocals < 0 || stacksize < 0 || flags < 0 || + code == NULL || !PyBytes_Check(code) || consts == NULL || !PyTuple_Check(consts) || names == NULL || !PyTuple_Check(names) || varnames == NULL || !PyTuple_Check(varnames) || @@ -122,9 +129,13 @@ PyCode_New(int argcount, int posonlyargcount, int kwonlyargcount, return NULL; } - /* Ensure that the filename is a ready Unicode string */ - if (PyUnicode_READY(filename) < 0) + /* Ensure that strings are ready Unicode string */ + if (PyUnicode_READY(name) < 0) { + return NULL; + } + if (PyUnicode_READY(filename) < 0) { return NULL; + } intern_strings(names); intern_strings(varnames); @@ -482,7 +493,7 @@ code_dealloc(PyCodeObject *co) } static PyObject * -code_sizeof(PyCodeObject *co, void *unused) +code_sizeof(PyCodeObject *co, PyObject *Py_UNUSED(args)) { Py_ssize_t res = _PyObject_SIZE(Py_TYPE(co)); _PyCodeObjectExtra *co_extra = (_PyCodeObjectExtra*) co->co_extra; @@ -497,6 +508,65 @@ code_sizeof(PyCodeObject *co, void *unused) return PyLong_FromSsize_t(res); } +/*[clinic input] +code.replace + + * + co_argcount: int(c_default="self->co_argcount") = -1 + co_posonlyargcount: int(c_default="self->co_posonlyargcount") = -1 + co_kwonlyargcount: int(c_default="self->co_kwonlyargcount") = -1 + co_nlocals: int(c_default="self->co_nlocals") = -1 + co_stacksize: int(c_default="self->co_stacksize") = -1 + co_flags: int(c_default="self->co_flags") = -1 + co_firstlineno: int(c_default="self->co_firstlineno") = -1 + co_code: PyBytesObject(c_default="(PyBytesObject *)self->co_code") = None + co_consts: object(subclass_of="&PyTuple_Type", c_default="self->co_consts") = None + co_names: object(subclass_of="&PyTuple_Type", c_default="self->co_names") = None + co_varnames: object(subclass_of="&PyTuple_Type", c_default="self->co_varnames") = None + co_freevars: object(subclass_of="&PyTuple_Type", c_default="self->co_freevars") = None + co_cellvars: object(subclass_of="&PyTuple_Type", c_default="self->co_cellvars") = None + co_filename: unicode(c_default="self->co_filename") = None + co_name: unicode(c_default="self->co_name") = None + co_lnotab: PyBytesObject(c_default="(PyBytesObject *)self->co_lnotab") = None + +Return a new code object with new specified fields. +[clinic start generated code]*/ + +static PyObject * +code_replace_impl(PyCodeObject *self, int co_argcount, + int co_posonlyargcount, int co_kwonlyargcount, + int co_nlocals, int co_stacksize, int co_flags, + int co_firstlineno, PyBytesObject *co_code, + PyObject *co_consts, PyObject *co_names, + PyObject *co_varnames, PyObject *co_freevars, + PyObject *co_cellvars, PyObject *co_filename, + PyObject *co_name, PyBytesObject *co_lnotab) +/*[clinic end generated code: output=25c8e303913bcace input=77189e46579ec426]*/ +{ +#define CHECK_INT_ARG(ARG) \ + if (ARG < 0) { \ + PyErr_SetString(PyExc_ValueError, \ + #ARG " must be a positive integer"); \ + return NULL; \ + } + + CHECK_INT_ARG(co_argcount); + CHECK_INT_ARG(co_posonlyargcount); + CHECK_INT_ARG(co_kwonlyargcount); + CHECK_INT_ARG(co_nlocals); + CHECK_INT_ARG(co_stacksize); + CHECK_INT_ARG(co_flags); + CHECK_INT_ARG(co_firstlineno); + +#undef CHECK_INT_ARG + + return (PyObject *)PyCode_New( + co_argcount, co_posonlyargcount, co_kwonlyargcount, co_nlocals, + co_stacksize, co_flags, (PyObject*)co_code, co_consts, co_names, + co_varnames, co_freevars, co_cellvars, co_filename, co_name, + co_firstlineno, (PyObject*)co_lnotab); +} + static PyObject * code_repr(PyCodeObject *co) { @@ -751,6 +821,7 @@ code_hash(PyCodeObject *co) static struct PyMethodDef code_methods[] = { {"__sizeof__", (PyCFunction)code_sizeof, METH_NOARGS}, + CODE_REPLACE_METHODDEF {NULL, NULL} /* sentinel */ }; From webhook-mailer at python.org Fri May 24 18:09:44 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 May 2019 22:09:44 -0000 Subject: [Python-checkins] bpo-36829: Document test.support.catch_unraisable_exception() (GH-13554) Message-ID: https://github.com/python/cpython/commit/6dbbe748e101a173b4cff8aada41e9313e287e0f commit: 6dbbe748e101a173b4cff8aada41e9313e287e0f branch: master author: Victor Stinner committer: GitHub date: 2019-05-25T00:09:38+02:00 summary: bpo-36829: Document test.support.catch_unraisable_exception() (GH-13554) catch_unraisable_exception() now also removes its 'unraisable' attribute at the context manager exit. files: M Doc/library/test.rst M Lib/test/support/__init__.py M Lib/test/test_io.py diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 054521dcc5d3..b7a2595708d0 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1081,6 +1081,26 @@ The :mod:`test.support` module defines the following functions: :exc:`PermissionError` is raised. +.. function:: catch_unraisable_exception() + + Context manager catching unraisable exception using + :func:`sys.unraisablehook`. + + Usage:: + + with support.catch_unraisable_exception() as cm: + # code creating an "unraisable exception" + ... + + # check the unraisable exception: use cm.unraisable + ... + + # cm.unraisable attribute no longer exists at this point + # (to break a reference cycle) + + .. versionadded:: 3.8 + + .. function:: find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM) Returns an unused port that should be suitable for binding. This is diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 2fe9d9dc8099..d6ed2215f383 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3043,12 +3043,14 @@ class catch_unraisable_exception: Usage: with support.catch_unraisable_exception() as cm: + # code creating an "unraisable exception" ... - # check the expected unraisable exception: use cm.unraisable + # check the unraisable exception: use cm.unraisable ... - # cm.unraisable is None here (to break a reference cycle) + # cm.unraisable attribute no longer exists at this point + # (to break a reference cycle) """ def __init__(self): @@ -3065,5 +3067,5 @@ def __enter__(self): def __exit__(self, *exc_info): # Clear the unraisable exception to explicitly break a reference cycle - self.unraisable = None + del self.unraisable sys.unraisablehook = self._old_hook diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 6f22b35a9ab9..3a1f5ba5b666 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1098,18 +1098,14 @@ def test_error_through_destructor(self): # Test that the exception state is not modified by a destructor, # even if close() fails. rawio = self.CloseFailureIO() - try: - with support.catch_unraisable_exception() as cm: - with self.assertRaises(AttributeError): - self.tp(rawio).xyzzy + with support.catch_unraisable_exception() as cm: + with self.assertRaises(AttributeError): + self.tp(rawio).xyzzy if not IOBASE_EMITS_UNRAISABLE: self.assertIsNone(cm.unraisable) elif cm.unraisable is not None: self.assertEqual(cm.unraisable.exc_type, OSError) - finally: - # Explicitly break reference cycle - cm = None def test_repr(self): raw = self.MockRawIO() @@ -2854,18 +2850,14 @@ def test_error_through_destructor(self): # Test that the exception state is not modified by a destructor, # even if close() fails. rawio = self.CloseFailureIO() - try: - with support.catch_unraisable_exception() as cm: - with self.assertRaises(AttributeError): - self.TextIOWrapper(rawio).xyzzy + with support.catch_unraisable_exception() as cm: + with self.assertRaises(AttributeError): + self.TextIOWrapper(rawio).xyzzy if not IOBASE_EMITS_UNRAISABLE: self.assertIsNone(cm.unraisable) elif cm.unraisable is not None: self.assertEqual(cm.unraisable.exc_type, OSError) - finally: - # Explicitly break reference cycle - cm = None # Systematic tests of the text I/O API From webhook-mailer at python.org Fri May 24 19:59:11 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Fri, 24 May 2019 23:59:11 -0000 Subject: [Python-checkins] bpo-34632: Add importlib.metadata (GH-12547) Message-ID: https://github.com/python/cpython/commit/1bbf7b661f0ac8aac12d5531928d9a85c98ec1a9 commit: 1bbf7b661f0ac8aac12d5531928d9a85c98ec1a9 branch: master author: Jason R. Coombs committer: Barry Warsaw date: 2019-05-24T16:59:01-07:00 summary: bpo-34632: Add importlib.metadata (GH-12547) Add importlib.metadata module as forward port of the standalone importlib_metadata. files: A Doc/library/importlib.metadata.rst A Lib/importlib/metadata/__init__.py A Lib/test/test_importlib/data/__init__.py A Lib/test/test_importlib/data/example-21.12-py3-none-any.whl A Lib/test/test_importlib/data/example-21.12-py3.6.egg A Lib/test/test_importlib/fixtures.py A Lib/test/test_importlib/test_main.py A Lib/test/test_importlib/test_metadata_api.py A Lib/test/test_importlib/test_zip.py A Misc/NEWS.d/next/Library/2019-05-11-02-30-45.bpo-34632.8MXa7T.rst A Python.framework/Resources M Doc/library/modules.rst M Doc/tools/susp-ignored.csv M Lib/importlib/_bootstrap_external.py M Python/importlib_external.h diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst new file mode 100644 index 000000000000..3d10b5aeabfd --- /dev/null +++ b/Doc/library/importlib.metadata.rst @@ -0,0 +1,257 @@ +.. _using: + +========================== + Using importlib.metadata +========================== + +.. note:: + This functionality is provisional and may deviate from the usual + version semantics of the standard library. + +``importlib.metadata`` is a library that provides for access to installed +package metadata. Built in part on Python's import system, this library +intends to replace similar functionality in the `entry point +API`_ and `metadata API`_ of ``pkg_resources``. Along with +``importlib.resources`` in `Python 3.7 +and newer`_ (backported as `importlib_resources`_ for older versions of +Python), this can eliminate the need to use the older and less efficient +``pkg_resources`` package. + +By "installed package" we generally mean a third-party package installed into +Python's ``site-packages`` directory via tools such as `pip +`_. Specifically, +it means a package with either a discoverable ``dist-info`` or ``egg-info`` +directory, and metadata defined by `PEP 566`_ or its older specifications. +By default, package metadata can live on the file system or in zip archives on +``sys.path``. Through an extension mechanism, the metadata can live almost +anywhere. + + +Overview +======== + +Let's say you wanted to get the version string for a package you've installed +using ``pip``. We start by creating a virtual environment and installing +something into it:: + +.. highlight:: none + + $ python3 -m venv example + $ source example/bin/activate + (example) $ pip install wheel + +You can get the version string for ``wheel`` by running the following:: + +.. highlight:: none + + (example) $ python + >>> from importlib.metadata import version # doctest: +SKIP + >>> version('wheel') # doctest: +SKIP + '0.32.3' + +You can also get the set of entry points keyed by group, such as +``console_scripts``, ``distutils.commands`` and others. Each group contains a +sequence of :ref:`EntryPoint ` objects. + +You can get the :ref:`metadata for a distribution `:: + + >>> list(metadata('wheel')) # doctest: +SKIP + ['Metadata-Version', 'Name', 'Version', 'Summary', 'Home-page', 'Author', 'Author-email', 'Maintainer', 'Maintainer-email', 'License', 'Project-URL', 'Project-URL', 'Project-URL', 'Keywords', 'Platform', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Requires-Python', 'Provides-Extra', 'Requires-Dist', 'Requires-Dist'] + +You can also get a :ref:`distribution's version number `, list its +:ref:`constituent files `, and get a list of the distribution's +:ref:`requirements`. + + +Functional API +============== + +This package provides the following functionality via its public API. + + +.. _entry-points: + +Entry points +------------ + +The ``entry_points()`` function returns a dictionary of all entry points, +keyed by group. Entry points are represented by ``EntryPoint`` instances; +each ``EntryPoint`` has a ``.name``, ``.group``, and ``.value`` attributes and +a ``.load()`` method to resolve the value. + + >>> eps = entry_points() # doctest: +SKIP + >>> list(eps) # doctest: +SKIP + ['console_scripts', 'distutils.commands', 'distutils.setup_keywords', 'egg_info.writers', 'setuptools.installation'] + >>> scripts = eps['console_scripts'] # doctest: +SKIP + >>> wheel = [ep for ep in scripts if ep.name == 'wheel'][0] # doctest: +SKIP + >>> wheel # doctest: +SKIP + EntryPoint(name='wheel', value='wheel.cli:main', group='console_scripts') + >>> main = wheel.load() # doctest: +SKIP + >>> main # doctest: +SKIP + + +The ``group`` and ``name`` are arbitrary values defined by the package author +and usually a client will wish to resolve all entry points for a particular +group. Read `the setuptools docs +`_ +for more information on entrypoints, their definition, and usage. + + +.. _metadata: + +Distribution metadata +--------------------- + +Every distribution includes some metadata, which you can extract using the +``metadata()`` function:: + + >>> wheel_metadata = metadata('wheel') # doctest: +SKIP + +The keys of the returned data structure [#f1]_ name the metadata keywords, and +their values are returned unparsed from the distribution metadata:: + + >>> wheel_metadata['Requires-Python'] # doctest: +SKIP + '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' + + +.. _version: + +Distribution versions +--------------------- + +The ``version()`` function is the quickest way to get a distribution's version +number, as a string:: + + >>> version('wheel') # doctest: +SKIP + '0.32.3' + + +.. _files: + +Distribution files +------------------ + +You can also get the full set of files contained within a distribution. The +``files()`` function takes a distribution package name and returns all of the +files installed by this distribution. Each file object returned is a +``PackagePath``, a `pathlib.Path`_ derived object with additional ``dist``, +``size``, and ``hash`` properties as indicated by the metadata. For example:: + + >>> util = [p for p in files('wheel') if 'util.py' in str(p)][0] # doctest: +SKIP + >>> util # doctest: +SKIP + PackagePath('wheel/util.py') + >>> util.size # doctest: +SKIP + 859 + >>> util.dist # doctest: +SKIP + + >>> util.hash # doctest: +SKIP + + +Once you have the file, you can also read its contents:: + + >>> print(util.read_text()) # doctest: +SKIP + import base64 + import sys + ... + def as_bytes(s): + if isinstance(s, text_type): + return s.encode('utf-8') + return s + + +.. _requirements: + +Distribution requirements +------------------------- + +To get the full set of requirements for a distribution, use the ``requires()`` +function. Note that this returns an iterator:: + + >>> list(requires('wheel')) # doctest: +SKIP + ["pytest (>=3.0.0) ; extra == 'test'"] + + +Distributions +============= + +While the above API is the most common and convenient usage, you can get all +of that information from the ``Distribution`` class. A ``Distribution`` is an +abstract object that represents the metadata for a Python package. You can +get the ``Distribution`` instance:: + + >>> from importlib.metadata import distribution # doctest: +SKIP + >>> dist = distribution('wheel') # doctest: +SKIP + +Thus, an alternative way to get the version number is through the +``Distribution`` instance:: + + >>> dist.version # doctest: +SKIP + '0.32.3' + +There are all kinds of additional metadata available on the ``Distribution`` +instance:: + + >>> d.metadata['Requires-Python'] # doctest: +SKIP + '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' + >>> d.metadata['License'] # doctest: +SKIP + 'MIT' + +The full set of available metadata is not described here. See `PEP 566 +`_ for additional details. + + +Extending the search algorithm +============================== + +Because package metadata is not available through ``sys.path`` searches, or +package loaders directly, the metadata for a package is found through import +system `finders`_. To find a distribution package's metadata, +``importlib.metadata`` queries the list of `meta path finders`_ on +`sys.meta_path`_. + +By default ``importlib.metadata`` installs a finder for distribution packages +found on the file system. This finder doesn't actually find any *packages*, +but it can find the packages' metadata. + +The abstract class :py:class:`importlib.abc.MetaPathFinder` defines the +interface expected of finders by Python's import system. +``importlib.metadata`` extends this protocol by looking for an optional +``find_distributions`` callable on the finders from +``sys.meta_path``. If the finder has this method, it must return +an iterator over instances of the ``Distribution`` abstract class. This +method must have the signature:: + + def find_distributions(name=None, path=None): + """Return an iterable of all Distribution instances capable of + loading the metadata for packages matching the name + (or all names if not supplied) along the paths in the list + of directories ``path`` (defaults to sys.path). + """ + +What this means in practice is that to support finding distribution package +metadata in locations other than the file system, you should derive from +``Distribution`` and implement the ``load_metadata()`` method. This takes a +single argument which is the name of the package whose metadata is being +found. This instance of the ``Distribution`` base abstract class is what your +finder's ``find_distributions()`` method should return. + + +.. _`entry point API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points +.. _`metadata API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api +.. _`Python 3.7 and newer`: https://docs.python.org/3/library/importlib.html#module-importlib.resources +.. _`importlib_resources`: https://importlib-resources.readthedocs.io/en/latest/index.html +.. _`PEP 566`: https://www.python.org/dev/peps/pep-0566/ +.. _`finders`: https://docs.python.org/3/reference/import.html#finders-and-loaders +.. _`meta path finders`: https://docs.python.org/3/glossary.html#term-meta-path-finder +.. _`sys.meta_path`: https://docs.python.org/3/library/sys.html#sys.meta_path +.. _`pathlib.Path`: https://docs.python.org/3/library/pathlib.html#pathlib.Path + + +.. rubric:: Footnotes + +.. [#f1] Technically, the returned distribution metadata object is an + `email.message.Message + `_ + instance, but this is an implementation detail, and not part of the + stable API. You should only use dictionary-like methods and syntax + to access the metadata contents. diff --git a/Doc/library/modules.rst b/Doc/library/modules.rst index 6b2a40a1b714..565ce0525c2c 100644 --- a/Doc/library/modules.rst +++ b/Doc/library/modules.rst @@ -17,3 +17,4 @@ The full list of modules described in this chapter is: modulefinder.rst runpy.rst importlib.rst + importlib.metadata.rst diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 31b22665eca4..85ff9d02aeb2 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -350,3 +350,6 @@ whatsnew/3.7,,::,error::BytesWarning whatsnew/changelog,,::,error::BytesWarning whatsnew/changelog,,::,default::BytesWarning whatsnew/changelog,,::,default::DeprecationWarning +library/importlib.metadata,,.. highlight:,.. highlight:: none +library/importlib.metadata,,:main,"EntryPoint(name='wheel', value='wheel.cli:main', group='console_scripts')" +library/importlib.metadata,,`,of directories ``path`` (defaults to sys.path). diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 7da0cd0f1965..9b5db81a3d7b 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -1363,6 +1363,58 @@ def find_module(cls, fullname, path=None): return None return spec.loader + search_template = r'(?:{pattern}(-.*)?\.(dist|egg)-info|EGG-INFO)' + + @classmethod + def find_distributions(cls, name=None, path=None): + """ + Find distributions. + + Return an iterable of all Distribution instances capable of + loading the metadata for packages matching the ``name`` + (or all names if not supplied) along the paths in the list + of directories ``path`` (defaults to sys.path). + """ + import re + from importlib.metadata import PathDistribution + if path is None: + path = sys.path + pattern = '.*' if name is None else re.escape(name) + found = cls._search_paths(pattern, path) + return map(PathDistribution, found) + + @classmethod + def _search_paths(cls, pattern, paths): + """Find metadata directories in paths heuristically.""" + import itertools + return itertools.chain.from_iterable( + cls._search_path(path, pattern) + for path in map(cls._switch_path, paths) + ) + + @staticmethod + def _switch_path(path): + from contextlib import suppress + import zipfile + from pathlib import Path + with suppress(Exception): + return zipfile.Path(path) + return Path(path) + + @classmethod + def _predicate(cls, pattern, root, item): + import re + return re.match(pattern, str(item.name), flags=re.IGNORECASE) + + @classmethod + def _search_path(cls, root, pattern): + if not root.is_dir(): + return () + normalized = pattern.replace('-', '_') + matcher = cls.search_template.format(pattern=normalized) + return (item for item in root.iterdir() + if cls._predicate(matcher, root, item)) + class FileFinder: diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py new file mode 100644 index 000000000000..24d45d2caad0 --- /dev/null +++ b/Lib/importlib/metadata/__init__.py @@ -0,0 +1,394 @@ +import io +import re +import abc +import csv +import sys +import email +import pathlib +import operator +import functools +import itertools +import collections + +from configparser import ConfigParser +from contextlib import suppress +from importlib import import_module +from importlib.abc import MetaPathFinder +from itertools import starmap + + +__all__ = [ + 'Distribution', + 'PackageNotFoundError', + 'distribution', + 'distributions', + 'entry_points', + 'files', + 'metadata', + 'requires', + 'version', + ] + + +class PackageNotFoundError(ModuleNotFoundError): + """The package was not found.""" + + +class EntryPoint(collections.namedtuple('EntryPointBase', 'name value group')): + """An entry point as defined by Python packaging conventions. + + See `the packaging docs on entry points + `_ + for more information. + """ + + pattern = re.compile( + r'(?P[\w.]+)\s*' + r'(:\s*(?P[\w.]+))?\s*' + r'(?P\[.*\])?\s*$' + ) + """ + A regular expression describing the syntax for an entry point, + which might look like: + + - module + - package.module + - package.module:attribute + - package.module:object.attribute + - package.module:attr [extra1, extra2] + + Other combinations are possible as well. + + The expression is lenient about whitespace around the ':', + following the attr, and following any extras. + """ + + def load(self): + """Load the entry point from its definition. If only a module + is indicated by the value, return that module. Otherwise, + return the named object. + """ + match = self.pattern.match(self.value) + module = import_module(match.group('module')) + attrs = filter(None, (match.group('attr') or '').split('.')) + return functools.reduce(getattr, attrs, module) + + @property + def extras(self): + match = self.pattern.match(self.value) + return list(re.finditer(r'\w+', match.group('extras') or '')) + + @classmethod + def _from_config(cls, config): + return [ + cls(name, value, group) + for group in config.sections() + for name, value in config.items(group) + ] + + @classmethod + def _from_text(cls, text): + config = ConfigParser() + try: + config.read_string(text) + except AttributeError: # pragma: nocover + # Python 2 has no read_string + config.readfp(io.StringIO(text)) + return EntryPoint._from_config(config) + + def __iter__(self): + """ + Supply iter so one may construct dicts of EntryPoints easily. + """ + return iter((self.name, self)) + + +class PackagePath(pathlib.PurePosixPath): + """A reference to a path in a package""" + + def read_text(self, encoding='utf-8'): + with self.locate().open(encoding=encoding) as stream: + return stream.read() + + def read_binary(self): + with self.locate().open('rb') as stream: + return stream.read() + + def locate(self): + """Return a path-like object for this path""" + return self.dist.locate_file(self) + + +class FileHash: + def __init__(self, spec): + self.mode, _, self.value = spec.partition('=') + + def __repr__(self): + return ''.format(self.mode, self.value) + + +class Distribution: + """A Python distribution package.""" + + @abc.abstractmethod + def read_text(self, filename): + """Attempt to load metadata file given by the name. + + :param filename: The name of the file in the distribution info. + :return: The text if found, otherwise None. + """ + + @abc.abstractmethod + def locate_file(self, path): + """ + Given a path to a file in this distribution, return a path + to it. + """ + + @classmethod + def from_name(cls, name): + """Return the Distribution for the given package name. + + :param name: The name of the distribution package to search for. + :return: The Distribution instance (or subclass thereof) for the named + package, if found. + :raises PackageNotFoundError: When the named package's distribution + metadata cannot be found. + """ + for resolver in cls._discover_resolvers(): + dists = resolver(name) + dist = next(dists, None) + if dist is not None: + return dist + else: + raise PackageNotFoundError(name) + + @classmethod + def discover(cls): + """Return an iterable of Distribution objects for all packages. + + :return: Iterable of Distribution objects for all packages. + """ + return itertools.chain.from_iterable( + resolver() + for resolver in cls._discover_resolvers() + ) + + @staticmethod + def _discover_resolvers(): + """Search the meta_path for resolvers.""" + declared = ( + getattr(finder, 'find_distributions', None) + for finder in sys.meta_path + ) + return filter(None, declared) + + @property + def metadata(self): + """Return the parsed metadata for this Distribution. + + The returned object will have keys that name the various bits of + metadata. See PEP 566 for details. + """ + text = ( + self.read_text('METADATA') + or self.read_text('PKG-INFO') + # This last clause is here to support old egg-info files. Its + # effect is to just end up using the PathDistribution's self._path + # (which points to the egg-info file) attribute unchanged. + or self.read_text('') + ) + return email.message_from_string(text) + + @property + def version(self): + """Return the 'Version' metadata for the distribution package.""" + return self.metadata['Version'] + + @property + def entry_points(self): + return EntryPoint._from_text(self.read_text('entry_points.txt')) + + @property + def files(self): + file_lines = self._read_files_distinfo() or self._read_files_egginfo() + + def make_file(name, hash=None, size_str=None): + result = PackagePath(name) + result.hash = FileHash(hash) if hash else None + result.size = int(size_str) if size_str else None + result.dist = self + return result + + return file_lines and starmap(make_file, csv.reader(file_lines)) + + def _read_files_distinfo(self): + """ + Read the lines of RECORD + """ + text = self.read_text('RECORD') + return text and text.splitlines() + + def _read_files_egginfo(self): + """ + SOURCES.txt might contain literal commas, so wrap each line + in quotes. + """ + text = self.read_text('SOURCES.txt') + return text and map('"{}"'.format, text.splitlines()) + + @property + def requires(self): + """Generated requirements specified for this Distribution""" + return self._read_dist_info_reqs() or self._read_egg_info_reqs() + + def _read_dist_info_reqs(self): + spec = self.metadata['Requires-Dist'] + return spec and filter(None, spec.splitlines()) + + def _read_egg_info_reqs(self): + source = self.read_text('requires.txt') + return source and self._deps_from_requires_text(source) + + @classmethod + def _deps_from_requires_text(cls, source): + section_pairs = cls._read_sections(source.splitlines()) + sections = { + section: list(map(operator.itemgetter('line'), results)) + for section, results in + itertools.groupby(section_pairs, operator.itemgetter('section')) + } + return cls._convert_egg_info_reqs_to_simple_reqs(sections) + + @staticmethod + def _read_sections(lines): + section = None + for line in filter(None, lines): + section_match = re.match(r'\[(.*)\]$', line) + if section_match: + section = section_match.group(1) + continue + yield locals() + + @staticmethod + def _convert_egg_info_reqs_to_simple_reqs(sections): + """ + Historically, setuptools would solicit and store 'extra' + requirements, including those with environment markers, + in separate sections. More modern tools expect each + dependency to be defined separately, with any relevant + extras and environment markers attached directly to that + requirement. This method converts the former to the + latter. See _test_deps_from_requires_text for an example. + """ + def make_condition(name): + return name and 'extra == "{name}"'.format(name=name) + + def parse_condition(section): + section = section or '' + extra, sep, markers = section.partition(':') + if extra and markers: + markers = '({markers})'.format(markers=markers) + conditions = list(filter(None, [markers, make_condition(extra)])) + return '; ' + ' and '.join(conditions) if conditions else '' + + for section, deps in sections.items(): + for dep in deps: + yield dep + parse_condition(section) + + +class DistributionFinder(MetaPathFinder): + """ + A MetaPathFinder capable of discovering installed distributions. + """ + + @abc.abstractmethod + def find_distributions(self, name=None, path=None): + """ + Find distributions. + + Return an iterable of all Distribution instances capable of + loading the metadata for packages matching the ``name`` + (or all names if not supplied) along the paths in the list + of directories ``path`` (defaults to sys.path). + """ + + +class PathDistribution(Distribution): + def __init__(self, path): + """Construct a distribution from a path to the metadata directory.""" + self._path = path + + def read_text(self, filename): + with suppress(FileNotFoundError, NotADirectoryError, KeyError): + return self._path.joinpath(filename).read_text(encoding='utf-8') + read_text.__doc__ = Distribution.read_text.__doc__ + + def locate_file(self, path): + return self._path.parent / path + + +def distribution(package): + """Get the ``Distribution`` instance for the given package. + + :param package: The name of the package as a string. + :return: A ``Distribution`` instance (or subclass thereof). + """ + return Distribution.from_name(package) + + +def distributions(): + """Get all ``Distribution`` instances in the current environment. + + :return: An iterable of ``Distribution`` instances. + """ + return Distribution.discover() + + +def metadata(package): + """Get the metadata for the package. + + :param package: The name of the distribution package to query. + :return: An email.Message containing the parsed metadata. + """ + return Distribution.from_name(package).metadata + + +def version(package): + """Get the version string for the named package. + + :param package: The name of the distribution package to query. + :return: The version string for the package as defined in the package's + "Version" metadata key. + """ + return distribution(package).version + + +def entry_points(): + """Return EntryPoint objects for all installed packages. + + :return: EntryPoint objects for all installed packages. + """ + eps = itertools.chain.from_iterable( + dist.entry_points for dist in distributions()) + by_group = operator.attrgetter('group') + ordered = sorted(eps, key=by_group) + grouped = itertools.groupby(ordered, by_group) + return { + group: tuple(eps) + for group, eps in grouped + } + + +def files(package): + return distribution(package).files + + +def requires(package): + """ + Return a list of requirements for the indicated distribution. + + :return: An iterator of requirements, suitable for + packaging.requirement.Requirement. + """ + return distribution(package).requires diff --git a/Lib/test/test_importlib/data/__init__.py b/Lib/test/test_importlib/data/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl b/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl new file mode 100644 index 000000000000..f92f7716e3e6 Binary files /dev/null and b/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl differ diff --git a/Lib/test/test_importlib/data/example-21.12-py3.6.egg b/Lib/test/test_importlib/data/example-21.12-py3.6.egg new file mode 100644 index 000000000000..1d3f998f41b8 Binary files /dev/null and b/Lib/test/test_importlib/data/example-21.12-py3.6.egg differ diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py new file mode 100644 index 000000000000..3b926ba26df7 --- /dev/null +++ b/Lib/test/test_importlib/fixtures.py @@ -0,0 +1,199 @@ +from __future__ import unicode_literals + +import os +import sys +import shutil +import tempfile +import textwrap +import contextlib + +try: + from contextlib import ExitStack +except ImportError: + from contextlib2 import ExitStack + +try: + import pathlib +except ImportError: + import pathlib2 as pathlib + + +__metaclass__ = type + + + at contextlib.contextmanager +def tempdir(): + tmpdir = tempfile.mkdtemp() + try: + yield pathlib.Path(tmpdir) + finally: + shutil.rmtree(tmpdir) + + + at contextlib.contextmanager +def save_cwd(): + orig = os.getcwd() + try: + yield + finally: + os.chdir(orig) + + + at contextlib.contextmanager +def tempdir_as_cwd(): + with tempdir() as tmp: + with save_cwd(): + os.chdir(str(tmp)) + yield tmp + + +class SiteDir: + def setUp(self): + self.fixtures = ExitStack() + self.addCleanup(self.fixtures.close) + self.site_dir = self.fixtures.enter_context(tempdir()) + + +class OnSysPath: + @staticmethod + @contextlib.contextmanager + def add_sys_path(dir): + sys.path[:0] = [str(dir)] + try: + yield + finally: + sys.path.remove(str(dir)) + + def setUp(self): + super(OnSysPath, self).setUp() + self.fixtures.enter_context(self.add_sys_path(self.site_dir)) + + +class DistInfoPkg(OnSysPath, SiteDir): + files = { + "distinfo_pkg-1.0.0.dist-info": { + "METADATA": """ + Name: distinfo-pkg + Author: Steven Ma + Version: 1.0.0 + Requires-Dist: wheel >= 1.0 + Requires-Dist: pytest; extra == 'test' + """, + "RECORD": "mod.py,sha256=abc,20\n", + "entry_points.txt": """ + [entries] + main = mod:main + """ + }, + "mod.py": """ + def main(): + print("hello world") + """, + } + + def setUp(self): + super(DistInfoPkg, self).setUp() + build_files(DistInfoPkg.files, self.site_dir) + + +class DistInfoPkgOffPath(SiteDir): + def setUp(self): + super(DistInfoPkgOffPath, self).setUp() + build_files(DistInfoPkg.files, self.site_dir) + + +class EggInfoPkg(OnSysPath, SiteDir): + files = { + "egginfo_pkg.egg-info": { + "PKG-INFO": """ + Name: egginfo-pkg + Author: Steven Ma + License: Unknown + Version: 1.0.0 + Classifier: Intended Audience :: Developers + Classifier: Topic :: Software Development :: Libraries + """, + "SOURCES.txt": """ + mod.py + egginfo_pkg.egg-info/top_level.txt + """, + "entry_points.txt": """ + [entries] + main = mod:main + """, + "requires.txt": """ + wheel >= 1.0; python_version >= "2.7" + [test] + pytest + """, + "top_level.txt": "mod\n" + }, + "mod.py": """ + def main(): + print("hello world") + """, + } + + def setUp(self): + super(EggInfoPkg, self).setUp() + build_files(EggInfoPkg.files, prefix=self.site_dir) + + +class EggInfoFile(OnSysPath, SiteDir): + files = { + "egginfo_file.egg-info": """ + Metadata-Version: 1.0 + Name: egginfo_file + Version: 0.1 + Summary: An example package + Home-page: www.example.com + Author: Eric Haffa-Vee + Author-email: eric at example.coms + License: UNKNOWN + Description: UNKNOWN + Platform: UNKNOWN + """, + } + + def setUp(self): + super(EggInfoFile, self).setUp() + build_files(EggInfoFile.files, prefix=self.site_dir) + + +def build_files(file_defs, prefix=pathlib.Path()): + """Build a set of files/directories, as described by the + + file_defs dictionary. Each key/value pair in the dictionary is + interpreted as a filename/contents pair. If the contents value is a + dictionary, a directory is created, and the dictionary interpreted + as the files within it, recursively. + + For example: + + {"README.txt": "A README file", + "foo": { + "__init__.py": "", + "bar": { + "__init__.py": "", + }, + "baz.py": "# Some code", + } + } + """ + for name, contents in file_defs.items(): + full_name = prefix / name + if isinstance(contents, dict): + full_name.mkdir() + build_files(contents, prefix=full_name) + else: + if isinstance(contents, bytes): + with full_name.open('wb') as f: + f.write(contents) + else: + with full_name.open('w') as f: + f.write(DALS(contents)) + + +def DALS(str): + "Dedent and left-strip" + return textwrap.dedent(str).lstrip() diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py new file mode 100644 index 000000000000..b70f9440f697 --- /dev/null +++ b/Lib/test/test_importlib/test_main.py @@ -0,0 +1,158 @@ +# coding: utf-8 + +import re +import textwrap +import unittest +import importlib.metadata + +from . import fixtures +from importlib.metadata import ( + Distribution, EntryPoint, + PackageNotFoundError, distributions, + entry_points, metadata, version, + ) + + +class BasicTests(fixtures.DistInfoPkg, unittest.TestCase): + version_pattern = r'\d+\.\d+(\.\d)?' + + def test_retrieves_version_of_self(self): + dist = Distribution.from_name('distinfo-pkg') + assert isinstance(dist.version, str) + assert re.match(self.version_pattern, dist.version) + + def test_for_name_does_not_exist(self): + with self.assertRaises(PackageNotFoundError): + Distribution.from_name('does-not-exist') + + def test_new_style_classes(self): + self.assertIsInstance(Distribution, type) + + +class ImportTests(fixtures.DistInfoPkg, unittest.TestCase): + def test_import_nonexistent_module(self): + # Ensure that the MetadataPathFinder does not crash an import of a + # non-existant module. + with self.assertRaises(ImportError): + importlib.import_module('does_not_exist') + + def test_resolve(self): + entries = dict(entry_points()['entries']) + ep = entries['main'] + self.assertEqual(ep.load().__name__, "main") + + def test_resolve_without_attr(self): + ep = EntryPoint( + name='ep', + value='importlib.metadata', + group='grp', + ) + assert ep.load() is importlib.metadata + + +class NameNormalizationTests( + fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase): + @staticmethod + def pkg_with_dashes(site_dir): + """ + Create minimal metadata for a package with dashes + in the name (and thus underscores in the filename). + """ + metadata_dir = site_dir / 'my_pkg.dist-info' + metadata_dir.mkdir() + metadata = metadata_dir / 'METADATA' + with metadata.open('w') as strm: + strm.write('Version: 1.0\n') + return 'my-pkg' + + def test_dashes_in_dist_name_found_as_underscores(self): + """ + For a package with a dash in the name, the dist-info metadata + uses underscores in the name. Ensure the metadata loads. + """ + pkg_name = self.pkg_with_dashes(self.site_dir) + assert version(pkg_name) == '1.0' + + @staticmethod + def pkg_with_mixed_case(site_dir): + """ + Create minimal metadata for a package with mixed case + in the name. + """ + metadata_dir = site_dir / 'CherryPy.dist-info' + metadata_dir.mkdir() + metadata = metadata_dir / 'METADATA' + with metadata.open('w') as strm: + strm.write('Version: 1.0\n') + return 'CherryPy' + + def test_dist_name_found_as_any_case(self): + """ + Ensure the metadata loads when queried with any case. + """ + pkg_name = self.pkg_with_mixed_case(self.site_dir) + assert version(pkg_name) == '1.0' + assert version(pkg_name.lower()) == '1.0' + assert version(pkg_name.upper()) == '1.0' + + +class NonASCIITests(fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase): + @staticmethod + def pkg_with_non_ascii_description(site_dir): + """ + Create minimal metadata for a package with non-ASCII in + the description. + """ + metadata_dir = site_dir / 'portend.dist-info' + metadata_dir.mkdir() + metadata = metadata_dir / 'METADATA' + with metadata.open('w', encoding='utf-8') as fp: + fp.write('Description: p?r?tend\n') + return 'portend' + + @staticmethod + def pkg_with_non_ascii_description_egg_info(site_dir): + """ + Create minimal metadata for an egg-info package with + non-ASCII in the description. + """ + metadata_dir = site_dir / 'portend.dist-info' + metadata_dir.mkdir() + metadata = metadata_dir / 'METADATA' + with metadata.open('w', encoding='utf-8') as fp: + fp.write(textwrap.dedent(""" + Name: portend + + p?r?tend + """).lstrip()) + return 'portend' + + def test_metadata_loads(self): + pkg_name = self.pkg_with_non_ascii_description(self.site_dir) + meta = metadata(pkg_name) + assert meta['Description'] == 'p?r?tend' + + def test_metadata_loads_egg_info(self): + pkg_name = self.pkg_with_non_ascii_description_egg_info(self.site_dir) + meta = metadata(pkg_name) + assert meta.get_payload() == 'p?r?tend\n' + + +class DiscoveryTests(fixtures.EggInfoPkg, + fixtures.DistInfoPkg, + unittest.TestCase): + + def test_package_discovery(self): + dists = list(distributions()) + assert all( + isinstance(dist, Distribution) + for dist in dists + ) + assert any( + dist.metadata['Name'] == 'egginfo-pkg' + for dist in dists + ) + assert any( + dist.metadata['Name'] == 'distinfo-pkg' + for dist in dists + ) diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py new file mode 100644 index 000000000000..899777f4b1ad --- /dev/null +++ b/Lib/test/test_importlib/test_metadata_api.py @@ -0,0 +1,151 @@ +import re +import textwrap +import unittest +import itertools + +from collections.abc import Iterator + +from . import fixtures +from importlib.metadata import ( + Distribution, PackageNotFoundError, distribution, + entry_points, files, metadata, requires, version, + ) + + +class APITests( + fixtures.EggInfoPkg, + fixtures.DistInfoPkg, + fixtures.EggInfoFile, + unittest.TestCase): + + version_pattern = r'\d+\.\d+(\.\d)?' + + def test_retrieves_version_of_self(self): + pkg_version = version('egginfo-pkg') + assert isinstance(pkg_version, str) + assert re.match(self.version_pattern, pkg_version) + + def test_retrieves_version_of_distinfo_pkg(self): + pkg_version = version('distinfo-pkg') + assert isinstance(pkg_version, str) + assert re.match(self.version_pattern, pkg_version) + + def test_for_name_does_not_exist(self): + with self.assertRaises(PackageNotFoundError): + distribution('does-not-exist') + + def test_for_top_level(self): + self.assertEqual( + distribution('egginfo-pkg').read_text('top_level.txt').strip(), + 'mod') + + def test_read_text(self): + top_level = [ + path for path in files('egginfo-pkg') + if path.name == 'top_level.txt' + ][0] + self.assertEqual(top_level.read_text(), 'mod\n') + + def test_entry_points(self): + entries = dict(entry_points()['entries']) + ep = entries['main'] + self.assertEqual(ep.value, 'mod:main') + self.assertEqual(ep.extras, []) + + def test_metadata_for_this_package(self): + md = metadata('egginfo-pkg') + assert md['author'] == 'Steven Ma' + assert md['LICENSE'] == 'Unknown' + assert md['Name'] == 'egginfo-pkg' + classifiers = md.get_all('Classifier') + assert 'Topic :: Software Development :: Libraries' in classifiers + + @staticmethod + def _test_files(files_iter): + assert isinstance(files_iter, Iterator), files_iter + files = list(files_iter) + root = files[0].root + for file in files: + assert file.root == root + assert not file.hash or file.hash.value + assert not file.hash or file.hash.mode == 'sha256' + assert not file.size or file.size >= 0 + assert file.locate().exists() + assert isinstance(file.read_binary(), bytes) + if file.name.endswith('.py'): + file.read_text() + + def test_file_hash_repr(self): + assertRegex = self.assertRegex + + util = [ + p for p in files('distinfo-pkg') + if p.name == 'mod.py' + ][0] + assertRegex( + repr(util.hash), + '') + + def test_files_dist_info(self): + self._test_files(files('distinfo-pkg')) + + def test_files_egg_info(self): + self._test_files(files('egginfo-pkg')) + + def test_version_egg_info_file(self): + self.assertEqual(version('egginfo-file'), '0.1') + + def test_requires_egg_info_file(self): + requirements = requires('egginfo-file') + self.assertIsNone(requirements) + + def test_requires(self): + deps = requires('egginfo-pkg') + assert any( + dep == 'wheel >= 1.0; python_version >= "2.7"' + for dep in deps + ) + + def test_requires_dist_info(self): + deps = list(requires('distinfo-pkg')) + assert deps and all(deps) + + def test_more_complex_deps_requires_text(self): + requires = textwrap.dedent(""" + dep1 + dep2 + + [:python_version < "3"] + dep3 + + [extra1] + dep4 + + [extra2:python_version < "3"] + dep5 + """) + deps = sorted(Distribution._deps_from_requires_text(requires)) + expected = [ + 'dep1', + 'dep2', + 'dep3; python_version < "3"', + 'dep4; extra == "extra1"', + 'dep5; (python_version < "3") and extra == "extra2"', + ] + # It's important that the environment marker expression be + # wrapped in parentheses to avoid the following 'and' binding more + # tightly than some other part of the environment expression. + + assert deps == expected + + +class OffSysPathTests(fixtures.DistInfoPkgOffPath, unittest.TestCase): + def test_find_distributions_specified_path(self): + dists = itertools.chain.from_iterable( + resolver(path=[str(self.site_dir)]) + for resolver in Distribution._discover_resolvers() + ) + assert any( + dist.metadata['Name'] == 'distinfo-pkg' + for dist in dists + ) diff --git a/Lib/test/test_importlib/test_zip.py b/Lib/test/test_importlib/test_zip.py new file mode 100644 index 000000000000..db39e190ea7a --- /dev/null +++ b/Lib/test/test_importlib/test_zip.py @@ -0,0 +1,56 @@ +import sys +import unittest + +from contextlib import ExitStack +from importlib.metadata import distribution, entry_points, files, version +from importlib.resources import path + + +class TestZip(unittest.TestCase): + root = 'test.test_importlib.data' + + def setUp(self): + # Find the path to the example-*.whl so we can add it to the front of + # sys.path, where we'll then try to find the metadata thereof. + self.resources = ExitStack() + self.addCleanup(self.resources.close) + wheel = self.resources.enter_context( + path(self.root, 'example-21.12-py3-none-any.whl')) + sys.path.insert(0, str(wheel)) + self.resources.callback(sys.path.pop, 0) + + def test_zip_version(self): + self.assertEqual(version('example'), '21.12') + + def test_zip_entry_points(self): + scripts = dict(entry_points()['console_scripts']) + entry_point = scripts['example'] + self.assertEqual(entry_point.value, 'example:main') + + def test_missing_metadata(self): + self.assertIsNone(distribution('example').read_text('does not exist')) + + def test_case_insensitive(self): + self.assertEqual(version('Example'), '21.12') + + def test_files(self): + for file in files('example'): + path = str(file.dist.locate_file(file)) + assert '.whl/' in path, path + + +class TestEgg(TestZip): + def setUp(self): + # Find the path to the example-*.egg so we can add it to the front of + # sys.path, where we'll then try to find the metadata thereof. + self.resources = ExitStack() + self.addCleanup(self.resources.close) + egg = self.resources.enter_context( + path(self.root, 'example-21.12-py3.6.egg')) + sys.path.insert(0, str(egg)) + self.resources.callback(sys.path.pop, 0) + + def test_files(self): + for file in files('example'): + path = str(file.dist.locate_file(file)) + assert '.egg/' in path, path diff --git a/Misc/NEWS.d/next/Library/2019-05-11-02-30-45.bpo-34632.8MXa7T.rst b/Misc/NEWS.d/next/Library/2019-05-11-02-30-45.bpo-34632.8MXa7T.rst new file mode 100644 index 000000000000..ab4433846d4f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-11-02-30-45.bpo-34632.8MXa7T.rst @@ -0,0 +1 @@ +Introduce the ``importlib.metadata`` module with (provisional) support for reading metadata from third-party packages. \ No newline at end of file diff --git a/Python.framework/Resources b/Python.framework/Resources new file mode 120000 index 000000000000..953ee36f3bb7 --- /dev/null +++ b/Python.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 36b95d99b237..e724560d67a1 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -2051,650 +2051,787 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,8, 3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 106,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 172,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, - 101,4,100,17,100,11,100,12,132,1,131,1,90,9,101,4, - 100,18,100,13,100,14,132,1,131,1,90,10,101,4,100,19, - 100,15,100,16,132,1,131,1,90,11,100,10,83,0,41,20, - 218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,101, - 116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102, - 111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,32, - 112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,95, - 32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, - 0,67,0,0,0,115,64,0,0,0,116,0,116,1,106,2, - 160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,2, - 124,2,100,1,107,8,114,40,116,1,106,2,124,1,61,0, - 113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,5, - 161,0,1,0,113,14,100,1,83,0,41,3,122,125,67,97, - 108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,116, - 101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,111, - 100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,110, - 116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,32, - 32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,121, - 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,109, - 112,108,101,109,101,110,116,101,100,41,46,78,218,17,105,110, - 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,41, - 6,218,4,108,105,115,116,114,8,0,0,0,218,19,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,218,5,105,116,101,109,115,114,128,0,0,0,114,46,1, - 0,0,41,3,114,193,0,0,0,114,117,0,0,0,218,6, - 102,105,110,100,101,114,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,46,1,0,0,213,4,0,0,115,10, - 0,0,0,0,4,22,1,8,1,10,1,10,1,122,28,80, - 97,116,104,70,105,110,100,101,114,46,105,110,118,97,108,105, - 100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,9,0,0,0, - 67,0,0,0,115,84,0,0,0,116,0,106,1,100,1,107, - 9,114,28,116,0,106,1,115,28,116,2,160,3,100,2,116, - 4,161,2,1,0,116,0,106,1,68,0,93,44,125,2,122, - 14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,4, - 0,116,5,107,10,114,76,1,0,1,0,1,0,89,0,113, - 34,89,0,113,34,88,0,113,34,100,1,83,0,41,3,122, - 46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,104, - 95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,110, - 100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,78, - 122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,115, - 32,105,115,32,101,109,112,116,121,41,6,114,8,0,0,0, - 218,10,112,97,116,104,95,104,111,111,107,115,114,75,0,0, - 0,114,76,0,0,0,114,138,0,0,0,114,118,0,0,0, - 41,3,114,193,0,0,0,114,44,0,0,0,90,4,104,111, - 111,107,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,11,95,112,97,116,104,95,104,111,111,107,115,223,4, - 0,0,115,16,0,0,0,0,3,16,1,12,1,10,1,2, - 1,14,1,14,1,12,2,122,22,80,97,116,104,70,105,110, - 100,101,114,46,95,112,97,116,104,95,104,111,111,107,115,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 8,0,0,0,67,0,0,0,115,104,0,0,0,124,1,100, - 1,107,2,114,44,122,12,116,0,160,1,161,0,125,1,87, - 0,110,22,4,0,116,2,107,10,114,42,1,0,1,0,1, - 0,89,0,100,2,83,0,88,0,122,14,116,3,106,4,124, - 1,25,0,125,2,87,0,110,40,4,0,116,5,107,10,114, - 98,1,0,1,0,1,0,124,0,160,6,124,1,161,1,125, - 2,124,2,116,3,106,4,124,1,60,0,89,0,110,2,88, - 0,124,2,83,0,41,3,122,210,71,101,116,32,116,104,101, - 32,102,105,110,100,101,114,32,102,111,114,32,116,104,101,32, - 112,97,116,104,32,101,110,116,114,121,32,102,114,111,109,32, + 101,4,100,28,100,11,100,12,132,1,131,1,90,9,101,4, + 100,29,100,13,100,14,132,1,131,1,90,10,101,4,100,30, + 100,15,100,16,132,1,131,1,90,11,100,17,90,12,101,4, + 100,31,100,18,100,19,132,1,131,1,90,13,101,4,100,20, + 100,21,132,0,131,1,90,14,101,15,100,22,100,23,132,0, + 131,1,90,16,101,4,100,24,100,25,132,0,131,1,90,17, + 101,4,100,26,100,27,132,0,131,1,90,18,100,10,83,0, + 41,32,218,10,80,97,116,104,70,105,110,100,101,114,122,62, + 77,101,116,97,32,112,97,116,104,32,102,105,110,100,101,114, + 32,102,111,114,32,115,121,115,46,112,97,116,104,32,97,110, + 100,32,112,97,99,107,97,103,101,32,95,95,112,97,116,104, + 95,95,32,97,116,116,114,105,98,117,116,101,115,46,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, + 0,0,0,67,0,0,0,115,64,0,0,0,116,0,116,1, + 106,2,160,3,161,0,131,1,68,0,93,44,92,2,125,1, + 125,2,124,2,100,1,107,8,114,40,116,1,106,2,124,1, + 61,0,113,14,116,4,124,2,100,2,131,2,114,14,124,2, + 160,5,161,0,1,0,113,14,100,1,83,0,41,3,122,125, + 67,97,108,108,32,116,104,101,32,105,110,118,97,108,105,100, + 97,116,101,95,99,97,99,104,101,115,40,41,32,109,101,116, + 104,111,100,32,111,110,32,97,108,108,32,112,97,116,104,32, + 101,110,116,114,121,32,102,105,110,100,101,114,115,10,32,32, + 32,32,32,32,32,32,115,116,111,114,101,100,32,105,110,32, 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,46,10,10,32,32,32,32,32,32, - 32,32,73,102,32,116,104,101,32,112,97,116,104,32,101,110, - 116,114,121,32,105,115,32,110,111,116,32,105,110,32,116,104, - 101,32,99,97,99,104,101,44,32,102,105,110,100,32,116,104, - 101,32,97,112,112,114,111,112,114,105,97,116,101,32,102,105, - 110,100,101,114,10,32,32,32,32,32,32,32,32,97,110,100, - 32,99,97,99,104,101,32,105,116,46,32,73,102,32,110,111, - 32,102,105,110,100,101,114,32,105,115,32,97,118,97,105,108, - 97,98,108,101,44,32,115,116,111,114,101,32,78,111,110,101, - 46,10,10,32,32,32,32,32,32,32,32,114,40,0,0,0, - 78,41,7,114,2,0,0,0,114,55,0,0,0,114,3,1, - 0,0,114,8,0,0,0,114,48,1,0,0,218,8,75,101, - 121,69,114,114,111,114,114,52,1,0,0,41,3,114,193,0, - 0,0,114,44,0,0,0,114,50,1,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,20,95,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,236,4,0,0,115,22,0,0,0,0,8,8,1,2,1, - 12,1,14,3,8,1,2,1,14,1,14,1,10,1,16,1, - 122,31,80,97,116,104,70,105,110,100,101,114,46,95,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,99,3,0,0,0,0,0,0,0,0,0,0,0,6,0, - 0,0,4,0,0,0,67,0,0,0,115,82,0,0,0,116, - 0,124,2,100,1,131,2,114,26,124,2,160,1,124,1,161, - 1,92,2,125,3,125,4,110,14,124,2,160,2,124,1,161, - 1,125,3,103,0,125,4,124,3,100,0,107,9,114,60,116, - 3,160,4,124,1,124,3,161,2,83,0,116,3,160,5,124, - 1,100,0,161,2,125,5,124,4,124,5,95,6,124,5,83, - 0,41,2,78,114,137,0,0,0,41,7,114,128,0,0,0, - 114,137,0,0,0,114,206,0,0,0,114,134,0,0,0,114, - 201,0,0,0,114,183,0,0,0,114,178,0,0,0,41,6, - 114,193,0,0,0,114,139,0,0,0,114,50,1,0,0,114, - 140,0,0,0,114,141,0,0,0,114,187,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,95, - 108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,2, - 5,0,0,115,18,0,0,0,0,4,10,1,16,2,10,1, - 4,1,8,1,12,1,12,1,6,1,122,27,80,97,116,104, - 70,105,110,100,101,114,46,95,108,101,103,97,99,121,95,103, - 101,116,95,115,112,101,99,78,99,4,0,0,0,0,0,0, - 0,0,0,0,0,9,0,0,0,5,0,0,0,67,0,0, - 0,115,166,0,0,0,103,0,125,4,124,2,68,0,93,134, - 125,5,116,0,124,5,116,1,116,2,102,2,131,2,115,28, - 113,8,124,0,160,3,124,5,161,1,125,6,124,6,100,1, - 107,9,114,8,116,4,124,6,100,2,131,2,114,70,124,6, - 160,5,124,1,124,3,161,2,125,7,110,12,124,0,160,6, - 124,1,124,6,161,2,125,7,124,7,100,1,107,8,114,92, - 113,8,124,7,106,7,100,1,107,9,114,110,124,7,2,0, - 1,0,83,0,124,7,106,8,125,8,124,8,100,1,107,8, - 114,132,116,9,100,3,131,1,130,1,124,4,160,10,124,8, - 161,1,1,0,113,8,116,11,160,12,124,1,100,1,161,2, - 125,7,124,4,124,7,95,8,124,7,83,0,41,4,122,63, - 70,105,110,100,32,116,104,101,32,108,111,97,100,101,114,32, - 111,114,32,110,97,109,101,115,112,97,99,101,95,112,97,116, - 104,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108, - 101,47,112,97,99,107,97,103,101,32,110,97,109,101,46,78, - 114,203,0,0,0,122,19,115,112,101,99,32,109,105,115,115, - 105,110,103,32,108,111,97,100,101,114,41,13,114,161,0,0, - 0,114,85,0,0,0,218,5,98,121,116,101,115,114,54,1, - 0,0,114,128,0,0,0,114,203,0,0,0,114,55,1,0, - 0,114,140,0,0,0,114,178,0,0,0,114,118,0,0,0, - 114,167,0,0,0,114,134,0,0,0,114,183,0,0,0,41, - 9,114,193,0,0,0,114,139,0,0,0,114,44,0,0,0, - 114,202,0,0,0,218,14,110,97,109,101,115,112,97,99,101, - 95,112,97,116,104,90,5,101,110,116,114,121,114,50,1,0, - 0,114,187,0,0,0,114,141,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,9,95,103,101,116, - 95,115,112,101,99,17,5,0,0,115,40,0,0,0,0,5, - 4,1,8,1,14,1,2,1,10,1,8,1,10,1,14,2, - 12,1,8,1,2,1,10,1,8,1,6,1,8,1,8,5, - 12,2,12,1,6,1,122,20,80,97,116,104,70,105,110,100, - 101,114,46,95,103,101,116,95,115,112,101,99,99,4,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0, - 0,67,0,0,0,115,100,0,0,0,124,2,100,1,107,8, - 114,14,116,0,106,1,125,2,124,0,160,2,124,1,124,2, - 124,3,161,3,125,4,124,4,100,1,107,8,114,40,100,1, - 83,0,124,4,106,3,100,1,107,8,114,92,124,4,106,4, - 125,5,124,5,114,86,100,1,124,4,95,5,116,6,124,1, - 124,5,124,0,106,2,131,3,124,4,95,4,124,4,83,0, - 100,1,83,0,110,4,124,4,83,0,100,1,83,0,41,2, - 122,141,84,114,121,32,116,111,32,102,105,110,100,32,97,32, - 115,112,101,99,32,102,111,114,32,39,102,117,108,108,110,97, - 109,101,39,32,111,110,32,115,121,115,46,112,97,116,104,32, - 111,114,32,39,112,97,116,104,39,46,10,10,32,32,32,32, - 32,32,32,32,84,104,101,32,115,101,97,114,99,104,32,105, - 115,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112, - 97,116,104,95,104,111,111,107,115,32,97,110,100,32,115,121, - 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,46,10,32,32,32,32,32,32,32,32,78, - 41,7,114,8,0,0,0,114,44,0,0,0,114,58,1,0, - 0,114,140,0,0,0,114,178,0,0,0,114,181,0,0,0, - 114,22,1,0,0,41,6,114,193,0,0,0,114,139,0,0, - 0,114,44,0,0,0,114,202,0,0,0,114,187,0,0,0, - 114,57,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,203,0,0,0,49,5,0,0,115,26,0, - 0,0,0,6,8,1,6,1,14,1,8,1,4,1,10,1, - 6,1,4,3,6,1,16,1,4,2,6,2,122,20,80,97, - 116,104,70,105,110,100,101,114,46,102,105,110,100,95,115,112, - 101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,4,0,0,0,67,0,0,0,115,30,0,0,0, - 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,1, - 107,8,114,24,100,1,83,0,124,3,106,1,83,0,41,2, - 122,170,102,105,110,100,32,116,104,101,32,109,111,100,117,108, - 101,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114, - 32,39,112,97,116,104,39,32,98,97,115,101,100,32,111,110, - 32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, - 97,110,100,10,32,32,32,32,32,32,32,32,115,121,115,46, + 114,95,99,97,99,104,101,115,32,40,119,104,101,114,101,32, + 105,109,112,108,101,109,101,110,116,101,100,41,46,78,218,17, + 105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101, + 115,41,6,218,4,108,105,115,116,114,8,0,0,0,218,19, 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, - 99,104,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,105, - 110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97, - 100,46,10,10,32,32,32,32,32,32,32,32,78,114,204,0, - 0,0,114,205,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,206,0,0,0,73,5,0,0,115, - 8,0,0,0,0,8,12,1,8,1,4,1,122,22,80,97, - 116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,111, - 100,117,108,101,41,1,78,41,2,78,78,41,1,78,41,12, - 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,207,0,0,0,114,46,1,0,0,114,52, - 1,0,0,114,54,1,0,0,114,55,1,0,0,114,58,1, - 0,0,114,203,0,0,0,114,206,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,45,1,0,0,209,4,0,0,115,30,0,0,0,8,2, - 4,2,2,1,10,9,2,1,10,12,2,1,10,21,2,1, - 10,14,2,1,12,31,2,1,12,23,2,1,114,45,1,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, - 0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,100, - 6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,100, - 19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,90, - 11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,100, - 18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,108, - 101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,97, - 115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,32, - 32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,105, - 116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116, - 101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,111, - 114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98, - 101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,104, - 101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,101, - 99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,114, - 32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,115, - 32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,10, - 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,84, - 0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,137, - 0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,132, - 8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,124, - 0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,124, - 0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,124, - 0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,105, - 97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,112, - 97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,110, - 32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,32, - 110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,32, - 32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,97, - 105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,114, - 32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,117, - 102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,101, - 114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,110, - 105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,22, - 0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,86, - 0,1,0,113,2,100,0,83,0,114,110,0,0,0,114,3, - 0,0,0,114,16,1,0,0,169,1,114,140,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,19,1,0,0,102,5, - 0,0,115,4,0,0,0,4,0,2,0,122,38,70,105,108, + 99,104,101,218,5,105,116,101,109,115,114,128,0,0,0,114, + 46,1,0,0,41,3,114,193,0,0,0,114,117,0,0,0, + 218,6,102,105,110,100,101,114,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,46,1,0,0,213,4,0,0, + 115,10,0,0,0,0,4,22,1,8,1,10,1,10,1,122, + 28,80,97,116,104,70,105,110,100,101,114,46,105,110,118,97, + 108,105,100,97,116,101,95,99,97,99,104,101,115,99,2,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,9,0, + 0,0,67,0,0,0,115,84,0,0,0,116,0,106,1,100, + 1,107,9,114,28,116,0,106,1,115,28,116,2,160,3,100, + 2,116,4,161,2,1,0,116,0,106,1,68,0,93,44,125, + 2,122,14,124,2,124,1,131,1,87,0,2,0,1,0,83, + 0,4,0,116,5,107,10,114,76,1,0,1,0,1,0,89, + 0,113,34,89,0,113,34,88,0,113,34,100,1,83,0,41, + 3,122,46,83,101,97,114,99,104,32,115,121,115,46,112,97, + 116,104,95,104,111,111,107,115,32,102,111,114,32,97,32,102, + 105,110,100,101,114,32,102,111,114,32,39,112,97,116,104,39, + 46,78,122,23,115,121,115,46,112,97,116,104,95,104,111,111, + 107,115,32,105,115,32,101,109,112,116,121,41,6,114,8,0, + 0,0,218,10,112,97,116,104,95,104,111,111,107,115,114,75, + 0,0,0,114,76,0,0,0,114,138,0,0,0,114,118,0, + 0,0,41,3,114,193,0,0,0,114,44,0,0,0,90,4, + 104,111,111,107,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,11,95,112,97,116,104,95,104,111,111,107,115, + 223,4,0,0,115,16,0,0,0,0,3,16,1,12,1,10, + 1,2,1,14,1,14,1,12,2,122,22,80,97,116,104,70, + 105,110,100,101,114,46,95,112,97,116,104,95,104,111,111,107, + 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,8,0,0,0,67,0,0,0,115,104,0,0,0,124, + 1,100,1,107,2,114,44,122,12,116,0,160,1,161,0,125, + 1,87,0,110,22,4,0,116,2,107,10,114,42,1,0,1, + 0,1,0,89,0,100,2,83,0,88,0,122,14,116,3,106, + 4,124,1,25,0,125,2,87,0,110,40,4,0,116,5,107, + 10,114,98,1,0,1,0,1,0,124,0,160,6,124,1,161, + 1,125,2,124,2,116,3,106,4,124,1,60,0,89,0,110, + 2,88,0,124,2,83,0,41,3,122,210,71,101,116,32,116, + 104,101,32,102,105,110,100,101,114,32,102,111,114,32,116,104, + 101,32,112,97,116,104,32,101,110,116,114,121,32,102,114,111, + 109,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, + 116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,32, + 32,32,32,32,73,102,32,116,104,101,32,112,97,116,104,32, + 101,110,116,114,121,32,105,115,32,110,111,116,32,105,110,32, + 116,104,101,32,99,97,99,104,101,44,32,102,105,110,100,32, + 116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32, + 102,105,110,100,101,114,10,32,32,32,32,32,32,32,32,97, + 110,100,32,99,97,99,104,101,32,105,116,46,32,73,102,32, + 110,111,32,102,105,110,100,101,114,32,105,115,32,97,118,97, + 105,108,97,98,108,101,44,32,115,116,111,114,101,32,78,111, + 110,101,46,10,10,32,32,32,32,32,32,32,32,114,40,0, + 0,0,78,41,7,114,2,0,0,0,114,55,0,0,0,114, + 3,1,0,0,114,8,0,0,0,114,48,1,0,0,218,8, + 75,101,121,69,114,114,111,114,114,52,1,0,0,41,3,114, + 193,0,0,0,114,44,0,0,0,114,50,1,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,20,95, + 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, + 99,104,101,236,4,0,0,115,22,0,0,0,0,8,8,1, + 2,1,12,1,14,3,8,1,2,1,14,1,14,1,10,1, + 16,1,122,31,80,97,116,104,70,105,110,100,101,114,46,95, + 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, + 99,104,101,99,3,0,0,0,0,0,0,0,0,0,0,0, + 6,0,0,0,4,0,0,0,67,0,0,0,115,82,0,0, + 0,116,0,124,2,100,1,131,2,114,26,124,2,160,1,124, + 1,161,1,92,2,125,3,125,4,110,14,124,2,160,2,124, + 1,161,1,125,3,103,0,125,4,124,3,100,0,107,9,114, + 60,116,3,160,4,124,1,124,3,161,2,83,0,116,3,160, + 5,124,1,100,0,161,2,125,5,124,4,124,5,95,6,124, + 5,83,0,41,2,78,114,137,0,0,0,41,7,114,128,0, + 0,0,114,137,0,0,0,114,206,0,0,0,114,134,0,0, + 0,114,201,0,0,0,114,183,0,0,0,114,178,0,0,0, + 41,6,114,193,0,0,0,114,139,0,0,0,114,50,1,0, + 0,114,140,0,0,0,114,141,0,0,0,114,187,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 16,95,108,101,103,97,99,121,95,103,101,116,95,115,112,101, + 99,2,5,0,0,115,18,0,0,0,0,4,10,1,16,2, + 10,1,4,1,8,1,12,1,12,1,6,1,122,27,80,97, + 116,104,70,105,110,100,101,114,46,95,108,101,103,97,99,121, + 95,103,101,116,95,115,112,101,99,78,99,4,0,0,0,0, + 0,0,0,0,0,0,0,9,0,0,0,5,0,0,0,67, + 0,0,0,115,166,0,0,0,103,0,125,4,124,2,68,0, + 93,134,125,5,116,0,124,5,116,1,116,2,102,2,131,2, + 115,28,113,8,124,0,160,3,124,5,161,1,125,6,124,6, + 100,1,107,9,114,8,116,4,124,6,100,2,131,2,114,70, + 124,6,160,5,124,1,124,3,161,2,125,7,110,12,124,0, + 160,6,124,1,124,6,161,2,125,7,124,7,100,1,107,8, + 114,92,113,8,124,7,106,7,100,1,107,9,114,110,124,7, + 2,0,1,0,83,0,124,7,106,8,125,8,124,8,100,1, + 107,8,114,132,116,9,100,3,131,1,130,1,124,4,160,10, + 124,8,161,1,1,0,113,8,116,11,160,12,124,1,100,1, + 161,2,125,7,124,4,124,7,95,8,124,7,83,0,41,4, + 122,63,70,105,110,100,32,116,104,101,32,108,111,97,100,101, + 114,32,111,114,32,110,97,109,101,115,112,97,99,101,95,112, + 97,116,104,32,102,111,114,32,116,104,105,115,32,109,111,100, + 117,108,101,47,112,97,99,107,97,103,101,32,110,97,109,101, + 46,78,114,203,0,0,0,122,19,115,112,101,99,32,109,105, + 115,115,105,110,103,32,108,111,97,100,101,114,41,13,114,161, + 0,0,0,114,85,0,0,0,218,5,98,121,116,101,115,114, + 54,1,0,0,114,128,0,0,0,114,203,0,0,0,114,55, + 1,0,0,114,140,0,0,0,114,178,0,0,0,114,118,0, + 0,0,114,167,0,0,0,114,134,0,0,0,114,183,0,0, + 0,41,9,114,193,0,0,0,114,139,0,0,0,114,44,0, + 0,0,114,202,0,0,0,218,14,110,97,109,101,115,112,97, + 99,101,95,112,97,116,104,90,5,101,110,116,114,121,114,50, + 1,0,0,114,187,0,0,0,114,141,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,9,95,103, + 101,116,95,115,112,101,99,17,5,0,0,115,40,0,0,0, + 0,5,4,1,8,1,14,1,2,1,10,1,8,1,10,1, + 14,2,12,1,8,1,2,1,10,1,8,1,6,1,8,1, + 8,5,12,2,12,1,6,1,122,20,80,97,116,104,70,105, + 110,100,101,114,46,95,103,101,116,95,115,112,101,99,99,4, + 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5, + 0,0,0,67,0,0,0,115,100,0,0,0,124,2,100,1, + 107,8,114,14,116,0,106,1,125,2,124,0,160,2,124,1, + 124,2,124,3,161,3,125,4,124,4,100,1,107,8,114,40, + 100,1,83,0,124,4,106,3,100,1,107,8,114,92,124,4, + 106,4,125,5,124,5,114,86,100,1,124,4,95,5,116,6, + 124,1,124,5,124,0,106,2,131,3,124,4,95,4,124,4, + 83,0,100,1,83,0,110,4,124,4,83,0,100,1,83,0, + 41,2,122,141,84,114,121,32,116,111,32,102,105,110,100,32, + 97,32,115,112,101,99,32,102,111,114,32,39,102,117,108,108, + 110,97,109,101,39,32,111,110,32,115,121,115,46,112,97,116, + 104,32,111,114,32,39,112,97,116,104,39,46,10,10,32,32, + 32,32,32,32,32,32,84,104,101,32,115,101,97,114,99,104, + 32,105,115,32,98,97,115,101,100,32,111,110,32,115,121,115, + 46,112,97,116,104,95,104,111,111,107,115,32,97,110,100,32, + 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, + 114,95,99,97,99,104,101,46,10,32,32,32,32,32,32,32, + 32,78,41,7,114,8,0,0,0,114,44,0,0,0,114,58, + 1,0,0,114,140,0,0,0,114,178,0,0,0,114,181,0, + 0,0,114,22,1,0,0,41,6,114,193,0,0,0,114,139, + 0,0,0,114,44,0,0,0,114,202,0,0,0,114,187,0, + 0,0,114,57,1,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,203,0,0,0,49,5,0,0,115, + 26,0,0,0,0,6,8,1,6,1,14,1,8,1,4,1, + 10,1,6,1,4,3,6,1,16,1,4,2,6,2,122,20, + 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, + 115,112,101,99,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,67,0,0,0,115,30,0, + 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, + 100,1,107,8,114,24,100,1,83,0,124,3,106,1,83,0, + 41,2,122,170,102,105,110,100,32,116,104,101,32,109,111,100, + 117,108,101,32,111,110,32,115,121,115,46,112,97,116,104,32, + 111,114,32,39,112,97,116,104,39,32,98,97,115,101,100,32, + 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, + 115,32,97,110,100,10,32,32,32,32,32,32,32,32,115,121, + 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, + 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,114, + 204,0,0,0,114,205,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,206,0,0,0,73,5,0, + 0,115,8,0,0,0,0,8,12,1,8,1,4,1,122,22, + 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, + 109,111,100,117,108,101,122,45,40,63,58,123,112,97,116,116, + 101,114,110,125,40,45,46,42,41,63,92,46,40,100,105,115, + 116,124,101,103,103,41,45,105,110,102,111,124,69,71,71,45, + 73,78,70,79,41,99,3,0,0,0,0,0,0,0,0,0, + 0,0,7,0,0,0,4,0,0,0,67,0,0,0,115,78, + 0,0,0,100,1,100,2,108,0,125,3,100,1,100,3,108, + 1,109,2,125,4,1,0,124,2,100,2,107,8,114,34,116, + 3,106,4,125,2,124,1,100,2,107,8,114,46,100,4,110, + 8,124,3,160,5,124,1,161,1,125,5,124,0,160,6,124, + 5,124,2,161,2,125,6,116,7,124,4,124,6,131,2,83, + 0,41,5,97,37,1,0,0,10,32,32,32,32,32,32,32, + 32,70,105,110,100,32,100,105,115,116,114,105,98,117,116,105, + 111,110,115,46,10,10,32,32,32,32,32,32,32,32,82,101, + 116,117,114,110,32,97,110,32,105,116,101,114,97,98,108,101, + 32,111,102,32,97,108,108,32,68,105,115,116,114,105,98,117, + 116,105,111,110,32,105,110,115,116,97,110,99,101,115,32,99, + 97,112,97,98,108,101,32,111,102,10,32,32,32,32,32,32, + 32,32,108,111,97,100,105,110,103,32,116,104,101,32,109,101, + 116,97,100,97,116,97,32,102,111,114,32,112,97,99,107,97, + 103,101,115,32,109,97,116,99,104,105,110,103,32,116,104,101, + 32,96,96,110,97,109,101,96,96,10,32,32,32,32,32,32, + 32,32,40,111,114,32,97,108,108,32,110,97,109,101,115,32, + 105,102,32,110,111,116,32,115,117,112,112,108,105,101,100,41, + 32,97,108,111,110,103,32,116,104,101,32,112,97,116,104,115, + 32,105,110,32,116,104,101,32,108,105,115,116,10,32,32,32, + 32,32,32,32,32,111,102,32,100,105,114,101,99,116,111,114, + 105,101,115,32,96,96,112,97,116,104,96,96,32,40,100,101, + 102,97,117,108,116,115,32,116,111,32,115,121,115,46,112,97, + 116,104,41,46,10,32,32,32,32,32,32,32,32,114,73,0, + 0,0,78,41,1,218,16,80,97,116,104,68,105,115,116,114, + 105,98,117,116,105,111,110,122,2,46,42,41,8,218,2,114, + 101,90,18,105,109,112,111,114,116,108,105,98,46,109,101,116, + 97,100,97,116,97,114,59,1,0,0,114,8,0,0,0,114, + 44,0,0,0,90,6,101,115,99,97,112,101,218,13,95,115, + 101,97,114,99,104,95,112,97,116,104,115,218,3,109,97,112, + 41,7,114,193,0,0,0,114,117,0,0,0,114,44,0,0, + 0,114,60,1,0,0,114,59,1,0,0,218,7,112,97,116, + 116,101,114,110,90,5,102,111,117,110,100,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,18,102,105,110,100, + 95,100,105,115,116,114,105,98,117,116,105,111,110,115,88,5, + 0,0,115,14,0,0,0,0,10,8,1,12,1,8,1,6, + 1,22,1,12,1,122,29,80,97,116,104,70,105,110,100,101, + 114,46,102,105,110,100,95,100,105,115,116,114,105,98,117,116, + 105,111,110,115,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,6,0,0,0,3,0,0,0,115,44,0, + 0,0,100,1,100,2,108,0,125,3,124,3,106,1,160,2, + 135,0,135,1,102,2,100,3,100,4,132,8,116,3,136,0, + 106,4,124,2,131,2,68,0,131,1,161,1,83,0,41,5, + 122,49,70,105,110,100,32,109,101,116,97,100,97,116,97,32, + 100,105,114,101,99,116,111,114,105,101,115,32,105,110,32,112, + 97,116,104,115,32,104,101,117,114,105,115,116,105,99,97,108, + 108,121,46,114,73,0,0,0,78,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,5,0,0,0,51,0, + 0,0,115,26,0,0,0,124,0,93,18,125,1,136,0,160, + 0,124,1,136,1,161,2,86,0,1,0,113,2,100,0,83, + 0,114,110,0,0,0,41,1,218,12,95,115,101,97,114,99, + 104,95,112,97,116,104,41,2,114,32,0,0,0,114,44,0, + 0,0,169,2,114,193,0,0,0,114,63,1,0,0,114,3, + 0,0,0,114,6,0,0,0,114,19,1,0,0,110,5,0, + 0,115,4,0,0,0,4,2,2,255,122,43,80,97,116,104, + 70,105,110,100,101,114,46,95,115,101,97,114,99,104,95,112, + 97,116,104,115,46,60,108,111,99,97,108,115,62,46,60,103, + 101,110,101,120,112,114,62,41,5,218,9,105,116,101,114,116, + 111,111,108,115,90,5,99,104,97,105,110,90,13,102,114,111, + 109,95,105,116,101,114,97,98,108,101,114,62,1,0,0,218, + 12,95,115,119,105,116,99,104,95,112,97,116,104,41,4,114, + 193,0,0,0,114,63,1,0,0,90,5,112,97,116,104,115, + 114,67,1,0,0,114,3,0,0,0,114,66,1,0,0,114, + 6,0,0,0,114,61,1,0,0,106,5,0,0,115,8,0, + 0,0,0,3,8,1,18,2,10,254,122,24,80,97,116,104, + 70,105,110,100,101,114,46,95,115,101,97,114,99,104,95,112, + 97,116,104,115,99,1,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,10,0,0,0,67,0,0,0,115,78,0, + 0,0,100,1,100,2,108,0,109,1,125,1,1,0,100,1, + 100,0,108,2,125,2,100,1,100,3,108,3,109,4,125,3, + 1,0,124,1,116,5,131,1,143,24,1,0,124,2,160,4, + 124,0,161,1,87,0,2,0,53,0,81,0,82,0,163,0, + 83,0,81,0,82,0,88,0,124,3,124,0,131,1,83,0, + 41,4,78,114,73,0,0,0,41,1,218,8,115,117,112,112, + 114,101,115,115,41,1,218,4,80,97,116,104,41,6,90,10, + 99,111,110,116,101,120,116,108,105,98,114,69,1,0,0,218, + 7,122,105,112,102,105,108,101,90,7,112,97,116,104,108,105, + 98,114,70,1,0,0,218,9,69,120,99,101,112,116,105,111, + 110,41,4,114,44,0,0,0,114,69,1,0,0,114,71,1, + 0,0,114,70,1,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,68,1,0,0,115,5,0,0,115, + 12,0,0,0,0,2,12,1,8,1,12,1,10,1,28,1, + 122,23,80,97,116,104,70,105,110,100,101,114,46,95,115,119, + 105,116,99,104,95,112,97,116,104,99,4,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, + 0,0,115,32,0,0,0,100,1,100,0,108,0,125,4,124, + 4,106,1,124,1,116,2,124,3,106,3,131,1,124,4,106, + 4,100,2,141,3,83,0,41,3,78,114,73,0,0,0,41, + 1,114,83,0,0,0,41,5,114,60,1,0,0,90,5,109, + 97,116,99,104,114,85,0,0,0,114,117,0,0,0,90,10, + 73,71,78,79,82,69,67,65,83,69,41,5,114,193,0,0, + 0,114,63,1,0,0,218,4,114,111,111,116,114,41,1,0, + 0,114,60,1,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,10,95,112,114,101,100,105,99,97,116, + 101,124,5,0,0,115,4,0,0,0,0,2,8,1,122,21, + 80,97,116,104,70,105,110,100,101,114,46,95,112,114,101,100, + 105,99,97,116,101,99,3,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,4,0,0,0,3,0,0,0,115,64, + 0,0,0,136,2,160,0,161,0,115,12,100,1,83,0,124, + 2,160,1,100,2,100,3,161,2,125,3,136,0,106,2,106, + 3,124,3,100,4,141,1,137,1,135,0,135,1,135,2,102, + 3,100,5,100,6,132,8,136,2,160,4,161,0,68,0,131, + 1,83,0,41,7,78,114,3,0,0,0,250,1,45,114,45, + 0,0,0,41,1,114,63,1,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,51, + 0,0,0,115,32,0,0,0,124,0,93,24,125,1,136,0, + 160,0,136,1,136,2,124,1,161,3,114,26,124,1,86,0, + 1,0,113,2,100,0,83,0,114,110,0,0,0,41,1,114, + 74,1,0,0,41,2,114,32,0,0,0,114,41,1,0,0, + 169,3,114,193,0,0,0,90,7,109,97,116,99,104,101,114, + 114,73,1,0,0,114,3,0,0,0,114,6,0,0,0,114, + 19,1,0,0,135,5,0,0,115,6,0,0,0,4,0,2, + 1,14,255,122,42,80,97,116,104,70,105,110,100,101,114,46, + 95,115,101,97,114,99,104,95,112,97,116,104,46,60,108,111, + 99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,41, + 5,90,6,105,115,95,100,105,114,114,67,0,0,0,218,15, + 115,101,97,114,99,104,95,116,101,109,112,108,97,116,101,114, + 62,0,0,0,90,7,105,116,101,114,100,105,114,41,4,114, + 193,0,0,0,114,73,1,0,0,114,63,1,0,0,90,10, + 110,111,114,109,97,108,105,122,101,100,114,3,0,0,0,114, + 76,1,0,0,114,6,0,0,0,114,65,1,0,0,129,5, + 0,0,115,10,0,0,0,0,2,8,1,4,1,12,1,14, + 1,122,23,80,97,116,104,70,105,110,100,101,114,46,95,115, + 101,97,114,99,104,95,112,97,116,104,41,1,78,41,2,78, + 78,41,1,78,41,2,78,78,41,19,114,125,0,0,0,114, + 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,207, + 0,0,0,114,46,1,0,0,114,52,1,0,0,114,54,1, + 0,0,114,55,1,0,0,114,58,1,0,0,114,203,0,0, + 0,114,206,0,0,0,114,77,1,0,0,114,64,1,0,0, + 114,61,1,0,0,218,12,115,116,97,116,105,99,109,101,116, + 104,111,100,114,68,1,0,0,114,74,1,0,0,114,65,1, + 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,45,1,0,0,209,4,0,0,115, + 52,0,0,0,8,2,4,2,2,1,10,9,2,1,10,12, + 2,1,10,21,2,1,10,14,2,1,12,31,2,1,12,23, + 2,1,12,12,4,2,2,1,12,17,2,1,10,8,2,1, + 10,8,2,1,10,4,2,1,114,45,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,64,0,0,0,115,90,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,101,6,90,7,100,6,100,7,132, + 0,90,8,100,8,100,9,132,0,90,9,100,19,100,11,100, + 12,132,1,90,10,100,13,100,14,132,0,90,11,101,12,100, + 15,100,16,132,0,131,1,90,13,100,17,100,18,132,0,90, + 14,100,10,83,0,41,20,218,10,70,105,108,101,70,105,110, + 100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,32, + 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116, + 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116, + 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97, + 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101, + 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103, + 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119, + 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114, + 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32, + 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101, + 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32, + 32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,6,0,0,0,7,0,0,0,115,84,0,0,0,103, + 0,125,3,124,2,68,0,93,32,92,2,137,0,125,4,124, + 3,160,0,135,0,102,1,100,1,100,2,132,8,124,4,68, + 0,131,1,161,1,1,0,113,8,124,3,124,0,95,1,124, + 1,112,54,100,3,124,0,95,2,100,4,124,0,95,3,116, + 4,131,0,124,0,95,5,116,4,131,0,124,0,95,6,100, + 5,83,0,41,6,122,154,73,110,105,116,105,97,108,105,122, + 101,32,119,105,116,104,32,116,104,101,32,112,97,116,104,32, + 116,111,32,115,101,97,114,99,104,32,111,110,32,97,110,100, + 32,97,32,118,97,114,105,97,98,108,101,32,110,117,109,98, + 101,114,32,111,102,10,32,32,32,32,32,32,32,32,50,45, + 116,117,112,108,101,115,32,99,111,110,116,97,105,110,105,110, + 103,32,116,104,101,32,108,111,97,100,101,114,32,97,110,100, + 32,116,104,101,32,102,105,108,101,32,115,117,102,102,105,120, + 101,115,32,116,104,101,32,108,111,97,100,101,114,10,32,32, + 32,32,32,32,32,32,114,101,99,111,103,110,105,122,101,115, + 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,51,0,0,0,115,22,0,0,0,124, + 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, + 2,100,0,83,0,114,110,0,0,0,114,3,0,0,0,114, + 16,1,0,0,169,1,114,140,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,19,1,0,0,154,5,0,0,115,4, + 0,0,0,4,0,2,0,122,38,70,105,108,101,70,105,110, + 100,101,114,46,95,95,105,110,105,116,95,95,46,60,108,111, + 99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,114, + 71,0,0,0,114,105,0,0,0,78,41,7,114,167,0,0, + 0,218,8,95,108,111,97,100,101,114,115,114,44,0,0,0, + 218,11,95,112,97,116,104,95,109,116,105,109,101,218,3,115, + 101,116,218,11,95,112,97,116,104,95,99,97,99,104,101,218, + 19,95,114,101,108,97,120,101,100,95,112,97,116,104,95,99, + 97,99,104,101,41,5,114,119,0,0,0,114,44,0,0,0, + 218,14,108,111,97,100,101,114,95,100,101,116,97,105,108,115, + 90,7,108,111,97,100,101,114,115,114,189,0,0,0,114,3, + 0,0,0,114,80,1,0,0,114,6,0,0,0,114,209,0, + 0,0,148,5,0,0,115,16,0,0,0,0,4,4,1,12, + 1,26,1,6,2,10,1,6,1,8,1,122,19,70,105,108, 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, - 46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,120, - 112,114,62,114,71,0,0,0,114,105,0,0,0,78,41,7, - 114,167,0,0,0,218,8,95,108,111,97,100,101,114,115,114, - 44,0,0,0,218,11,95,112,97,116,104,95,109,116,105,109, - 101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,97, - 99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,97, - 116,104,95,99,97,99,104,101,41,5,114,119,0,0,0,114, - 44,0,0,0,218,14,108,111,97,100,101,114,95,100,101,116, - 97,105,108,115,90,7,108,111,97,100,101,114,115,114,189,0, - 0,0,114,3,0,0,0,114,60,1,0,0,114,6,0,0, - 0,114,209,0,0,0,96,5,0,0,115,16,0,0,0,0, - 4,4,1,12,1,26,1,6,2,10,1,6,1,8,1,122, - 19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,110, - 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,2,0,0,0,67,0,0,0,115,10,0, - 0,0,100,1,124,0,95,0,100,2,83,0,41,3,122,31, - 73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,100, - 105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,114, - 105,0,0,0,78,41,1,114,62,1,0,0,114,246,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,46,1,0,0,110,5,0,0,115,2,0,0,0,0,2, - 122,28,70,105,108,101,70,105,110,100,101,114,46,105,110,118, - 97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, - 0,0,0,67,0,0,0,115,42,0,0,0,124,0,160,0, - 124,1,161,1,125,2,124,2,100,1,107,8,114,26,100,1, - 103,0,102,2,83,0,124,2,106,1,124,2,106,2,112,38, - 103,0,102,2,83,0,41,2,122,197,84,114,121,32,116,111, - 32,102,105,110,100,32,97,32,108,111,97,100,101,114,32,102, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,2,0,0,0,67,0,0,0,115,10,0,0,0,100,1, + 124,0,95,0,100,2,83,0,41,3,122,31,73,110,118,97, + 108,105,100,97,116,101,32,116,104,101,32,100,105,114,101,99, + 116,111,114,121,32,109,116,105,109,101,46,114,105,0,0,0, + 78,41,1,114,82,1,0,0,114,246,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,46,1,0, + 0,162,5,0,0,115,2,0,0,0,0,2,122,28,70,105, + 108,101,70,105,110,100,101,114,46,105,110,118,97,108,105,100, + 97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,42,0,0,0,124,0,160,0,124,1,161,1, + 125,2,124,2,100,1,107,8,114,26,100,1,103,0,102,2, + 83,0,124,2,106,1,124,2,106,2,112,38,103,0,102,2, + 83,0,41,2,122,197,84,114,121,32,116,111,32,102,105,110, + 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, + 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, + 117,108,101,44,32,111,114,32,116,104,101,32,110,97,109,101, + 115,112,97,99,101,10,32,32,32,32,32,32,32,32,112,97, + 99,107,97,103,101,32,112,111,114,116,105,111,110,115,46,32, + 82,101,116,117,114,110,115,32,40,108,111,97,100,101,114,44, + 32,108,105,115,116,45,111,102,45,112,111,114,116,105,111,110, + 115,41,46,10,10,32,32,32,32,32,32,32,32,84,104,105, + 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,110, + 100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,100, + 46,10,10,32,32,32,32,32,32,32,32,78,41,3,114,203, + 0,0,0,114,140,0,0,0,114,178,0,0,0,41,3,114, + 119,0,0,0,114,139,0,0,0,114,187,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,137,0, + 0,0,168,5,0,0,115,8,0,0,0,0,7,10,1,8, + 1,8,1,122,22,70,105,108,101,70,105,110,100,101,114,46, + 102,105,110,100,95,108,111,97,100,101,114,99,6,0,0,0, + 0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0, + 67,0,0,0,115,26,0,0,0,124,1,124,2,124,3,131, + 2,125,6,116,0,124,2,124,3,124,6,124,4,100,1,141, + 4,83,0,41,2,78,114,177,0,0,0,41,1,114,190,0, + 0,0,41,7,114,119,0,0,0,114,188,0,0,0,114,139, + 0,0,0,114,44,0,0,0,90,4,115,109,115,108,114,202, + 0,0,0,114,140,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,58,1,0,0,180,5,0,0, + 115,8,0,0,0,0,1,10,1,8,1,2,255,122,20,70, + 105,108,101,70,105,110,100,101,114,46,95,103,101,116,95,115, + 112,101,99,78,99,3,0,0,0,0,0,0,0,0,0,0, + 0,14,0,0,0,8,0,0,0,67,0,0,0,115,102,1, + 0,0,100,1,125,3,124,1,160,0,100,2,161,1,100,3, + 25,0,125,4,122,24,116,1,124,0,106,2,112,34,116,3, + 160,4,161,0,131,1,106,5,125,5,87,0,110,24,4,0, + 116,6,107,10,114,66,1,0,1,0,1,0,100,4,125,5, + 89,0,110,2,88,0,124,5,124,0,106,7,107,3,114,92, + 124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,9, + 131,0,114,114,124,0,106,10,125,6,124,4,160,11,161,0, + 125,7,110,10,124,0,106,12,125,6,124,4,125,7,124,7, + 124,6,107,6,114,218,116,13,124,0,106,2,124,4,131,2, + 125,8,124,0,106,14,68,0,93,58,92,2,125,9,125,10, + 100,5,124,9,23,0,125,11,116,13,124,8,124,11,131,2, + 125,12,116,15,124,12,131,1,114,208,124,0,160,16,124,10, + 124,1,124,12,124,8,103,1,124,2,161,5,2,0,1,0, + 83,0,113,150,116,17,124,8,131,1,125,3,124,0,106,14, + 68,0,93,86,92,2,125,9,125,10,116,13,124,0,106,2, + 124,4,124,9,23,0,131,2,125,12,116,18,106,19,100,6, + 124,12,100,3,100,7,141,3,1,0,124,7,124,9,23,0, + 124,6,107,6,144,1,114,54,116,15,124,12,131,1,144,1, + 114,54,124,0,160,16,124,10,124,1,124,12,100,8,124,2, + 161,5,2,0,1,0,83,0,113,224,124,3,144,1,114,98, + 116,18,160,19,100,9,124,8,161,2,1,0,116,18,160,20, + 124,1,100,8,161,2,125,13,124,8,103,1,124,13,95,21, + 124,13,83,0,100,8,83,0,41,10,122,111,84,114,121,32, + 116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,102, 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32, - 110,97,109,101,115,112,97,99,101,10,32,32,32,32,32,32, - 32,32,112,97,99,107,97,103,101,32,112,111,114,116,105,111, - 110,115,46,32,82,101,116,117,114,110,115,32,40,108,111,97, - 100,101,114,44,32,108,105,115,116,45,111,102,45,112,111,114, - 116,105,111,110,115,41,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 41,3,114,203,0,0,0,114,140,0,0,0,114,178,0,0, - 0,41,3,114,119,0,0,0,114,139,0,0,0,114,187,0, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, + 32,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97, + 116,99,104,105,110,103,32,115,112,101,99,44,32,111,114,32, + 78,111,110,101,32,105,102,32,110,111,116,32,102,111,117,110, + 100,46,10,32,32,32,32,32,32,32,32,70,114,71,0,0, + 0,114,28,0,0,0,114,105,0,0,0,114,209,0,0,0, + 122,9,116,114,121,105,110,103,32,123,125,41,1,90,9,118, + 101,114,98,111,115,105,116,121,78,122,25,112,111,115,115,105, + 98,108,101,32,110,97,109,101,115,112,97,99,101,32,102,111, + 114,32,123,125,41,22,114,41,0,0,0,114,49,0,0,0, + 114,44,0,0,0,114,2,0,0,0,114,55,0,0,0,114, + 10,1,0,0,114,50,0,0,0,114,82,1,0,0,218,11, + 95,102,105,108,108,95,99,97,99,104,101,114,7,0,0,0, + 114,85,1,0,0,114,106,0,0,0,114,84,1,0,0,114, + 38,0,0,0,114,81,1,0,0,114,54,0,0,0,114,58, + 1,0,0,114,56,0,0,0,114,134,0,0,0,114,149,0, + 0,0,114,183,0,0,0,114,178,0,0,0,41,14,114,119, + 0,0,0,114,139,0,0,0,114,202,0,0,0,90,12,105, + 115,95,110,97,109,101,115,112,97,99,101,90,11,116,97,105, + 108,95,109,111,100,117,108,101,114,169,0,0,0,90,5,99, + 97,99,104,101,90,12,99,97,99,104,101,95,109,111,100,117, + 108,101,90,9,98,97,115,101,95,112,97,116,104,114,17,1, + 0,0,114,188,0,0,0,90,13,105,110,105,116,95,102,105, + 108,101,110,97,109,101,90,9,102,117,108,108,95,112,97,116, + 104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,203,0,0,0,185,5,0,0,115,74, + 0,0,0,0,5,4,1,14,1,2,1,24,1,14,1,10, + 1,10,1,8,1,6,2,6,1,6,1,10,2,6,1,4, + 2,8,1,12,1,14,1,8,1,10,1,8,1,26,4,8, + 2,14,1,16,1,16,1,14,1,10,1,10,1,2,0,2, + 255,10,2,6,1,12,1,12,1,8,1,4,1,122,20,70, + 105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,115, + 112,101,99,99,1,0,0,0,0,0,0,0,0,0,0,0, + 9,0,0,0,10,0,0,0,67,0,0,0,115,190,0,0, + 0,124,0,106,0,125,1,122,22,116,1,160,2,124,1,112, + 22,116,1,160,3,161,0,161,1,125,2,87,0,110,30,4, + 0,116,4,116,5,116,6,102,3,107,10,114,58,1,0,1, + 0,1,0,103,0,125,2,89,0,110,2,88,0,116,7,106, + 8,160,9,100,1,161,1,115,84,116,10,124,2,131,1,124, + 0,95,11,110,74,116,10,131,0,125,3,124,2,68,0,93, + 56,125,4,124,4,160,12,100,2,161,1,92,3,125,5,125, + 6,125,7,124,6,114,136,100,3,160,13,124,5,124,7,160, + 14,161,0,161,2,125,8,110,4,124,5,125,8,124,3,160, + 15,124,8,161,1,1,0,113,94,124,3,124,0,95,11,116, + 7,106,8,160,9,116,16,161,1,114,186,100,4,100,5,132, + 0,124,2,68,0,131,1,124,0,95,17,100,6,83,0,41, + 7,122,68,70,105,108,108,32,116,104,101,32,99,97,99,104, + 101,32,111,102,32,112,111,116,101,110,116,105,97,108,32,109, + 111,100,117,108,101,115,32,97,110,100,32,112,97,99,107,97, + 103,101,115,32,102,111,114,32,116,104,105,115,32,100,105,114, + 101,99,116,111,114,121,46,114,0,0,0,0,114,71,0,0, + 0,114,61,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,83,0,0,0,115, + 20,0,0,0,104,0,124,0,93,12,125,1,124,1,160,0, + 161,0,146,2,113,4,83,0,114,3,0,0,0,41,1,114, + 106,0,0,0,41,2,114,32,0,0,0,90,2,102,110,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,9, + 60,115,101,116,99,111,109,112,62,6,6,0,0,115,4,0, + 0,0,6,0,2,0,122,41,70,105,108,101,70,105,110,100, + 101,114,46,95,102,105,108,108,95,99,97,99,104,101,46,60, + 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, + 62,78,41,18,114,44,0,0,0,114,2,0,0,0,114,7, + 1,0,0,114,55,0,0,0,114,3,1,0,0,218,15,80, + 101,114,109,105,115,115,105,111,110,69,114,114,111,114,218,18, + 78,111,116,65,68,105,114,101,99,116,111,114,121,69,114,114, + 111,114,114,8,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,83,1,0,0,114,84,1,0,0,114,101,0,0,0, + 114,62,0,0,0,114,106,0,0,0,218,3,97,100,100,114, + 11,0,0,0,114,85,1,0,0,41,9,114,119,0,0,0, + 114,44,0,0,0,114,8,1,0,0,90,21,108,111,119,101, + 114,95,115,117,102,102,105,120,95,99,111,110,116,101,110,116, + 115,114,41,1,0,0,114,117,0,0,0,114,29,1,0,0, + 114,17,1,0,0,90,8,110,101,119,95,110,97,109,101,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,87, + 1,0,0,233,5,0,0,115,34,0,0,0,0,2,6,1, + 2,1,22,1,20,3,10,3,12,1,12,7,6,1,8,1, + 16,1,4,1,18,2,4,1,12,1,6,1,12,1,122,22, + 70,105,108,101,70,105,110,100,101,114,46,95,102,105,108,108, + 95,99,97,99,104,101,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,3,0,0,0,7,0,0,0,115, + 18,0,0,0,135,0,135,1,102,2,100,1,100,2,132,8, + 125,2,124,2,83,0,41,3,97,20,1,0,0,65,32,99, + 108,97,115,115,32,109,101,116,104,111,100,32,119,104,105,99, + 104,32,114,101,116,117,114,110,115,32,97,32,99,108,111,115, + 117,114,101,32,116,111,32,117,115,101,32,111,110,32,115,121, + 115,46,112,97,116,104,95,104,111,111,107,10,32,32,32,32, + 32,32,32,32,119,104,105,99,104,32,119,105,108,108,32,114, + 101,116,117,114,110,32,97,110,32,105,110,115,116,97,110,99, + 101,32,117,115,105,110,103,32,116,104,101,32,115,112,101,99, + 105,102,105,101,100,32,108,111,97,100,101,114,115,32,97,110, + 100,32,116,104,101,32,112,97,116,104,10,32,32,32,32,32, + 32,32,32,99,97,108,108,101,100,32,111,110,32,116,104,101, + 32,99,108,111,115,117,114,101,46,10,10,32,32,32,32,32, + 32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,99, + 97,108,108,101,100,32,111,110,32,116,104,101,32,99,108,111, + 115,117,114,101,32,105,115,32,110,111,116,32,97,32,100,105, + 114,101,99,116,111,114,121,44,32,73,109,112,111,114,116,69, + 114,114,111,114,32,105,115,10,32,32,32,32,32,32,32,32, + 114,97,105,115,101,100,46,10,10,32,32,32,32,32,32,32, + 32,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,4,0,0,0,19,0,0,0,115,34,0,0,0,116, + 0,124,0,131,1,115,20,116,1,100,1,124,0,100,2,141, + 2,130,1,136,0,124,0,102,1,136,1,158,2,142,0,83, + 0,41,3,122,45,80,97,116,104,32,104,111,111,107,32,102, + 111,114,32,105,109,112,111,114,116,108,105,98,46,109,97,99, + 104,105,110,101,114,121,46,70,105,108,101,70,105,110,100,101, + 114,46,122,30,111,110,108,121,32,100,105,114,101,99,116,111, + 114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,116, + 101,100,114,48,0,0,0,41,2,114,56,0,0,0,114,118, + 0,0,0,114,48,0,0,0,169,2,114,193,0,0,0,114, + 86,1,0,0,114,3,0,0,0,114,6,0,0,0,218,24, + 112,97,116,104,95,104,111,111,107,95,102,111,114,95,70,105, + 108,101,70,105,110,100,101,114,18,6,0,0,115,6,0,0, + 0,0,2,8,1,12,1,122,54,70,105,108,101,70,105,110, + 100,101,114,46,112,97,116,104,95,104,111,111,107,46,60,108, + 111,99,97,108,115,62,46,112,97,116,104,95,104,111,111,107, + 95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,114, + 3,0,0,0,41,3,114,193,0,0,0,114,86,1,0,0, + 114,93,1,0,0,114,3,0,0,0,114,92,1,0,0,114, + 6,0,0,0,218,9,112,97,116,104,95,104,111,111,107,8, + 6,0,0,115,4,0,0,0,0,10,14,6,122,20,70,105, + 108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111, + 111,107,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, + 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, + 16,70,105,108,101,70,105,110,100,101,114,40,123,33,114,125, + 41,41,2,114,62,0,0,0,114,44,0,0,0,114,246,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,137,0,0,0,116,5,0,0,115,8,0,0,0,0, - 7,10,1,8,1,8,1,122,22,70,105,108,101,70,105,110, - 100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, - 6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, - 6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,124, - 2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,124, - 4,100,1,141,4,83,0,41,2,78,114,177,0,0,0,41, - 1,114,190,0,0,0,41,7,114,119,0,0,0,114,188,0, - 0,0,114,139,0,0,0,114,44,0,0,0,90,4,115,109, - 115,108,114,202,0,0,0,114,140,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,58,1,0,0, - 128,5,0,0,115,8,0,0,0,0,1,10,1,8,1,2, - 255,122,20,70,105,108,101,70,105,110,100,101,114,46,95,103, - 101,116,95,115,112,101,99,78,99,3,0,0,0,0,0,0, - 0,0,0,0,0,14,0,0,0,8,0,0,0,67,0,0, - 0,115,102,1,0,0,100,1,125,3,124,1,160,0,100,2, - 161,1,100,3,25,0,125,4,122,24,116,1,124,0,106,2, - 112,34,116,3,160,4,161,0,131,1,106,5,125,5,87,0, - 110,24,4,0,116,6,107,10,114,66,1,0,1,0,1,0, - 100,4,125,5,89,0,110,2,88,0,124,5,124,0,106,7, - 107,3,114,92,124,0,160,8,161,0,1,0,124,5,124,0, - 95,7,116,9,131,0,114,114,124,0,106,10,125,6,124,4, - 160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4, - 125,7,124,7,124,6,107,6,114,218,116,13,124,0,106,2, - 124,4,131,2,125,8,124,0,106,14,68,0,93,58,92,2, - 125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8, - 124,11,131,2,125,12,116,15,124,12,131,1,114,208,124,0, - 160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5, - 2,0,1,0,83,0,113,150,116,17,124,8,131,1,125,3, - 124,0,106,14,68,0,93,86,92,2,125,9,125,10,116,13, - 124,0,106,2,124,4,124,9,23,0,131,2,125,12,116,18, - 106,19,100,6,124,12,100,3,100,7,141,3,1,0,124,7, - 124,9,23,0,124,6,107,6,144,1,114,54,116,15,124,12, - 131,1,144,1,114,54,124,0,160,16,124,10,124,1,124,12, - 100,8,124,2,161,5,2,0,1,0,83,0,113,224,124,3, - 144,1,114,98,116,18,160,19,100,9,124,8,161,2,1,0, - 116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,1, - 124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,111, - 84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112, - 101,99,32,102,111,114,32,116,104,101,32,115,112,101,99,105, - 102,105,101,100,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,104, - 101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,44, - 32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,32, - 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,70, - 114,71,0,0,0,114,28,0,0,0,114,105,0,0,0,114, - 209,0,0,0,122,9,116,114,121,105,110,103,32,123,125,41, - 1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,112, - 111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,99, - 101,32,102,111,114,32,123,125,41,22,114,41,0,0,0,114, - 49,0,0,0,114,44,0,0,0,114,2,0,0,0,114,55, - 0,0,0,114,10,1,0,0,114,50,0,0,0,114,62,1, - 0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,114, - 7,0,0,0,114,65,1,0,0,114,106,0,0,0,114,64, - 1,0,0,114,38,0,0,0,114,61,1,0,0,114,54,0, - 0,0,114,58,1,0,0,114,56,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,183,0,0,0,114,178,0,0,0, - 41,14,114,119,0,0,0,114,139,0,0,0,114,202,0,0, - 0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90, - 11,116,97,105,108,95,109,111,100,117,108,101,114,169,0,0, - 0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95, - 109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116, - 104,114,17,1,0,0,114,188,0,0,0,90,13,105,110,105, - 116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108, - 95,112,97,116,104,114,187,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,203,0,0,0,133,5, - 0,0,115,74,0,0,0,0,5,4,1,14,1,2,1,24, - 1,14,1,10,1,10,1,8,1,6,2,6,1,6,1,10, - 2,6,1,4,2,8,1,12,1,14,1,8,1,10,1,8, - 1,26,4,8,2,14,1,16,1,16,1,14,1,10,1,10, - 1,2,0,2,255,10,2,6,1,12,1,12,1,8,1,4, - 1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105, - 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0, - 115,190,0,0,0,124,0,106,0,125,1,122,22,116,1,160, - 2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,87, - 0,110,30,4,0,116,4,116,5,116,6,102,3,107,10,114, - 58,1,0,1,0,1,0,103,0,125,2,89,0,110,2,88, - 0,116,7,106,8,160,9,100,1,161,1,115,84,116,10,124, - 2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,124, - 2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,92, - 3,125,5,125,6,125,7,124,6,114,136,100,3,160,13,124, - 5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,125, - 8,124,3,160,15,124,8,161,1,1,0,113,94,124,3,124, - 0,95,11,116,7,106,8,160,9,116,16,161,1,114,186,100, - 4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,100, - 6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,32, - 99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105, - 97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112, - 97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115, - 32,100,105,114,101,99,116,111,114,121,46,114,0,0,0,0, - 114,71,0,0,0,114,61,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,83, - 0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,1, - 124,1,160,0,161,0,146,2,113,4,83,0,114,3,0,0, - 0,41,1,114,106,0,0,0,41,2,114,32,0,0,0,90, - 2,102,110,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,9,60,115,101,116,99,111,109,112,62,210,5,0, - 0,115,4,0,0,0,6,0,2,0,122,41,70,105,108,101, - 70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,99, - 104,101,46,60,108,111,99,97,108,115,62,46,60,115,101,116, - 99,111,109,112,62,78,41,18,114,44,0,0,0,114,2,0, - 0,0,114,7,1,0,0,114,55,0,0,0,114,3,1,0, - 0,218,15,80,101,114,109,105,115,115,105,111,110,69,114,114, - 111,114,218,18,78,111,116,65,68,105,114,101,99,116,111,114, - 121,69,114,114,111,114,114,8,0,0,0,114,9,0,0,0, - 114,10,0,0,0,114,63,1,0,0,114,64,1,0,0,114, - 101,0,0,0,114,62,0,0,0,114,106,0,0,0,218,3, - 97,100,100,114,11,0,0,0,114,65,1,0,0,41,9,114, - 119,0,0,0,114,44,0,0,0,114,8,1,0,0,90,21, - 108,111,119,101,114,95,115,117,102,102,105,120,95,99,111,110, - 116,101,110,116,115,114,41,1,0,0,114,117,0,0,0,114, - 29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,110, - 97,109,101,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,67,1,0,0,181,5,0,0,115,34,0,0,0, - 0,2,6,1,2,1,22,1,20,3,10,3,12,1,12,7, - 6,1,8,1,16,1,4,1,18,2,4,1,12,1,6,1, - 12,1,122,22,70,105,108,101,70,105,110,100,101,114,46,95, - 102,105,108,108,95,99,97,99,104,101,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,7, - 0,0,0,115,18,0,0,0,135,0,135,1,102,2,100,1, - 100,2,132,8,125,2,124,2,83,0,41,3,97,20,1,0, - 0,65,32,99,108,97,115,115,32,109,101,116,104,111,100,32, - 119,104,105,99,104,32,114,101,116,117,114,110,115,32,97,32, - 99,108,111,115,117,114,101,32,116,111,32,117,115,101,32,111, - 110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,10, - 32,32,32,32,32,32,32,32,119,104,105,99,104,32,119,105, - 108,108,32,114,101,116,117,114,110,32,97,110,32,105,110,115, - 116,97,110,99,101,32,117,115,105,110,103,32,116,104,101,32, - 115,112,101,99,105,102,105,101,100,32,108,111,97,100,101,114, - 115,32,97,110,100,32,116,104,101,32,112,97,116,104,10,32, - 32,32,32,32,32,32,32,99,97,108,108,101,100,32,111,110, - 32,116,104,101,32,99,108,111,115,117,114,101,46,10,10,32, - 32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97, - 116,104,32,99,97,108,108,101,100,32,111,110,32,116,104,101, - 32,99,108,111,115,117,114,101,32,105,115,32,110,111,116,32, - 97,32,100,105,114,101,99,116,111,114,121,44,32,73,109,112, - 111,114,116,69,114,114,111,114,32,105,115,10,32,32,32,32, - 32,32,32,32,114,97,105,115,101,100,46,10,10,32,32,32, - 32,32,32,32,32,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,4,0,0,0,19,0,0,0,115,34, - 0,0,0,116,0,124,0,131,1,115,20,116,1,100,1,124, - 0,100,2,141,2,130,1,136,0,124,0,102,1,136,1,158, - 2,142,0,83,0,41,3,122,45,80,97,116,104,32,104,111, - 111,107,32,102,111,114,32,105,109,112,111,114,116,108,105,98, - 46,109,97,99,104,105,110,101,114,121,46,70,105,108,101,70, - 105,110,100,101,114,46,122,30,111,110,108,121,32,100,105,114, - 101,99,116,111,114,105,101,115,32,97,114,101,32,115,117,112, - 112,111,114,116,101,100,114,48,0,0,0,41,2,114,56,0, - 0,0,114,118,0,0,0,114,48,0,0,0,169,2,114,193, - 0,0,0,114,66,1,0,0,114,3,0,0,0,114,6,0, - 0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,111, - 114,95,70,105,108,101,70,105,110,100,101,114,222,5,0,0, - 115,6,0,0,0,0,2,8,1,12,1,122,54,70,105,108, - 101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,111, - 107,46,60,108,111,99,97,108,115,62,46,112,97,116,104,95, - 104,111,111,107,95,102,111,114,95,70,105,108,101,70,105,110, - 100,101,114,114,3,0,0,0,41,3,114,193,0,0,0,114, - 66,1,0,0,114,73,1,0,0,114,3,0,0,0,114,72, - 1,0,0,114,6,0,0,0,218,9,112,97,116,104,95,104, - 111,111,107,212,5,0,0,115,4,0,0,0,0,10,14,6, - 122,20,70,105,108,101,70,105,110,100,101,114,46,112,97,116, - 104,95,104,111,111,107,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 12,0,0,0,100,1,160,0,124,0,106,1,161,1,83,0, - 41,2,78,122,16,70,105,108,101,70,105,110,100,101,114,40, - 123,33,114,125,41,41,2,114,62,0,0,0,114,44,0,0, - 0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,39,1,0,0,230,5,0,0,115,2, - 0,0,0,0,1,122,19,70,105,108,101,70,105,110,100,101, - 114,46,95,95,114,101,112,114,95,95,41,1,78,41,15,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, - 0,0,0,114,209,0,0,0,114,46,1,0,0,114,143,0, - 0,0,114,206,0,0,0,114,137,0,0,0,114,58,1,0, - 0,114,203,0,0,0,114,67,1,0,0,114,207,0,0,0, - 114,74,1,0,0,114,39,1,0,0,114,3,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,59, - 1,0,0,87,5,0,0,115,22,0,0,0,8,2,4,7, - 8,14,8,4,4,2,8,12,8,5,10,48,8,31,2,1, - 10,17,114,59,1,0,0,99,4,0,0,0,0,0,0,0, - 0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,0, - 115,146,0,0,0,124,0,160,0,100,1,161,1,125,4,124, - 0,160,0,100,2,161,1,125,5,124,4,115,66,124,5,114, - 36,124,5,106,1,125,4,110,30,124,2,124,3,107,2,114, - 56,116,2,124,1,124,2,131,2,125,4,110,10,116,3,124, - 1,124,2,131,2,125,4,124,5,115,84,116,4,124,1,124, - 2,124,4,100,3,141,3,125,5,122,36,124,5,124,0,100, - 2,60,0,124,4,124,0,100,1,60,0,124,2,124,0,100, - 4,60,0,124,3,124,0,100,5,60,0,87,0,110,20,4, - 0,116,5,107,10,114,140,1,0,1,0,1,0,89,0,110, - 2,88,0,100,0,83,0,41,6,78,218,10,95,95,108,111, - 97,100,101,114,95,95,218,8,95,95,115,112,101,99,95,95, - 114,60,1,0,0,90,8,95,95,102,105,108,101,95,95,90, - 10,95,95,99,97,99,104,101,100,95,95,41,6,218,3,103, - 101,116,114,140,0,0,0,114,15,1,0,0,114,9,1,0, - 0,114,190,0,0,0,218,9,69,120,99,101,112,116,105,111, - 110,41,6,90,2,110,115,114,117,0,0,0,90,8,112,97, - 116,104,110,97,109,101,90,9,99,112,97,116,104,110,97,109, - 101,114,140,0,0,0,114,187,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120, - 95,117,112,95,109,111,100,117,108,101,236,5,0,0,115,34, - 0,0,0,0,2,10,1,10,1,4,1,4,1,8,1,8, - 1,12,2,10,1,4,1,14,1,2,1,8,1,8,1,8, - 1,12,1,14,2,114,79,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,0, - 102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,6, - 102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,1, - 122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116, - 32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109, - 111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10, - 32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115, - 32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114, - 44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32, - 32,41,7,114,252,0,0,0,114,163,0,0,0,218,18,101, - 120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101, - 115,114,9,1,0,0,114,102,0,0,0,114,15,1,0,0, - 114,89,0,0,0,41,3,90,10,101,120,116,101,110,115,105, - 111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116, - 101,99,111,100,101,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,184,0,0,0,3,6,0,0,115,8,0, - 0,0,0,5,12,1,8,1,8,1,114,184,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0, - 9,0,0,0,67,0,0,0,115,178,1,0,0,124,0,97, - 0,116,0,106,1,97,1,116,0,106,2,97,2,116,1,106, - 3,116,4,25,0,125,1,100,1,68,0,93,48,125,2,124, - 2,116,1,106,3,107,7,114,56,116,0,160,5,124,2,161, - 1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116, - 6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100, - 3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102, - 2,125,4,124,4,68,0,93,110,92,2,125,5,125,6,116, - 7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115, - 136,116,8,130,1,124,6,100,8,25,0,125,7,124,5,116, - 1,106,3,107,6,114,170,116,1,106,3,124,5,25,0,125, - 8,1,0,113,226,113,106,122,20,116,0,160,5,124,5,161, - 1,125,8,87,0,1,0,113,226,87,0,113,106,4,0,116, - 9,107,10,114,214,1,0,1,0,1,0,89,0,113,106,89, - 0,113,106,88,0,113,106,116,9,100,9,131,1,130,1,116, - 6,124,1,100,10,124,8,131,3,1,0,116,6,124,1,100, - 11,124,7,131,3,1,0,116,6,124,1,100,12,100,13,160, - 10,124,6,161,1,131,3,1,0,116,6,124,1,100,14,100, - 15,100,16,132,0,124,6,68,0,131,1,131,3,1,0,116, - 0,160,5,100,17,161,1,125,9,116,6,124,1,100,17,124, - 9,131,3,1,0,116,0,160,5,100,18,161,1,125,10,116, - 6,124,1,100,18,124,10,131,3,1,0,124,5,100,4,107, - 2,144,1,114,110,116,0,160,5,100,19,161,1,125,11,116, - 6,124,1,100,20,124,11,131,3,1,0,116,6,124,1,100, - 21,116,11,131,0,131,3,1,0,116,12,160,13,116,2,160, - 14,161,0,161,1,1,0,124,5,100,4,107,2,144,1,114, - 174,116,15,160,16,100,22,161,1,1,0,100,23,116,12,107, - 6,144,1,114,174,100,24,116,17,95,18,100,25,83,0,41, - 26,122,205,83,101,116,117,112,32,116,104,101,32,112,97,116, - 104,45,98,97,115,101,100,32,105,109,112,111,114,116,101,114, - 115,32,102,111,114,32,105,109,112,111,114,116,108,105,98,32, - 98,121,32,105,109,112,111,114,116,105,110,103,32,110,101,101, - 100,101,100,10,32,32,32,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,115,32,97,110,100,32,105,110,106, - 101,99,116,105,110,103,32,116,104,101,109,32,105,110,116,111, - 32,116,104,101,32,103,108,111,98,97,108,32,110,97,109,101, - 115,112,97,99,101,46,10,10,32,32,32,32,79,116,104,101, - 114,32,99,111,109,112,111,110,101,110,116,115,32,97,114,101, - 32,101,120,116,114,97,99,116,101,100,32,102,114,111,109,32, - 116,104,101,32,99,111,114,101,32,98,111,111,116,115,116,114, - 97,112,32,109,111,100,117,108,101,46,10,10,32,32,32,32, - 41,4,114,64,0,0,0,114,75,0,0,0,218,8,98,117, - 105,108,116,105,110,115,114,160,0,0,0,90,5,112,111,115, - 105,120,250,1,47,90,2,110,116,250,1,92,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, - 0,115,0,0,0,115,26,0,0,0,124,0,93,18,125,1, - 116,0,124,1,131,1,100,0,107,2,86,0,1,0,113,2, - 100,1,83,0,41,2,114,39,0,0,0,78,41,1,114,22, - 0,0,0,41,2,114,32,0,0,0,114,95,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,19, - 1,0,0,39,6,0,0,115,4,0,0,0,4,0,2,0, - 122,25,95,115,101,116,117,112,46,60,108,111,99,97,108,115, - 62,46,60,103,101,110,101,120,112,114,62,114,73,0,0,0, - 122,30,105,109,112,111,114,116,108,105,98,32,114,101,113,117, - 105,114,101,115,32,112,111,115,105,120,32,111,114,32,110,116, - 114,2,0,0,0,114,35,0,0,0,114,31,0,0,0,114, - 40,0,0,0,114,58,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,4,0,0,0,83,0, - 0,0,115,22,0,0,0,104,0,124,0,93,14,125,1,100, - 0,124,1,155,0,157,2,146,2,113,4,83,0,41,1,114, - 74,0,0,0,114,3,0,0,0,41,2,114,32,0,0,0, - 218,1,115,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,68,1,0,0,55,6,0,0,115,4,0,0,0, - 6,0,2,0,122,25,95,115,101,116,117,112,46,60,108,111, - 99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,90, - 7,95,116,104,114,101,97,100,90,8,95,119,101,97,107,114, - 101,102,90,6,119,105,110,114,101,103,114,192,0,0,0,114, - 7,0,0,0,122,4,46,112,121,119,122,6,95,100,46,112, - 121,100,84,78,41,19,114,134,0,0,0,114,8,0,0,0, - 114,163,0,0,0,114,31,1,0,0,114,125,0,0,0,90, - 18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,110, - 97,109,101,114,129,0,0,0,218,3,97,108,108,114,23,0, - 0,0,114,118,0,0,0,114,36,0,0,0,114,13,0,0, - 0,114,21,1,0,0,114,167,0,0,0,114,80,1,0,0, - 114,102,0,0,0,114,186,0,0,0,114,191,0,0,0,114, - 195,0,0,0,41,12,218,17,95,98,111,111,116,115,116,114, - 97,112,95,109,111,100,117,108,101,90,11,115,101,108,102,95, - 109,111,100,117,108,101,90,12,98,117,105,108,116,105,110,95, - 110,97,109,101,90,14,98,117,105,108,116,105,110,95,109,111, - 100,117,108,101,90,10,111,115,95,100,101,116,97,105,108,115, - 90,10,98,117,105,108,116,105,110,95,111,115,114,31,0,0, - 0,114,35,0,0,0,90,9,111,115,95,109,111,100,117,108, - 101,90,13,116,104,114,101,97,100,95,109,111,100,117,108,101, - 90,14,119,101,97,107,114,101,102,95,109,111,100,117,108,101, - 90,13,119,105,110,114,101,103,95,109,111,100,117,108,101,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,6, - 95,115,101,116,117,112,14,6,0,0,115,78,0,0,0,0, - 8,4,1,6,1,6,3,10,1,8,1,10,1,12,2,10, - 1,14,3,22,1,12,2,22,1,8,1,10,1,10,1,6, - 2,2,1,10,1,10,1,14,1,12,2,8,1,12,1,12, - 1,18,1,22,3,10,1,12,3,10,1,12,3,10,1,10, - 1,12,3,14,1,14,1,10,1,10,1,10,1,114,87,1, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,0, - 116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,2, - 106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,1, - 1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,1, - 83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,104, - 101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, - 111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,78, - 41,10,114,87,1,0,0,114,184,0,0,0,114,8,0,0, - 0,114,51,1,0,0,114,167,0,0,0,114,59,1,0,0, - 114,74,1,0,0,218,9,109,101,116,97,95,112,97,116,104, - 114,186,0,0,0,114,45,1,0,0,41,2,114,86,1,0, - 0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,97, - 100,101,114,115,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,8,95,105,110,115,116,97,108,108,79,6,0, - 0,115,8,0,0,0,0,2,8,1,6,1,20,1,114,89, - 1,0,0,41,63,114,127,0,0,0,114,12,0,0,0,90, - 37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, - 86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84, - 69,83,95,75,69,89,114,11,0,0,0,114,13,0,0,0, - 114,20,0,0,0,114,27,0,0,0,114,29,0,0,0,114, - 38,0,0,0,114,47,0,0,0,114,49,0,0,0,114,53, - 0,0,0,114,54,0,0,0,114,56,0,0,0,114,59,0, - 0,0,114,69,0,0,0,218,4,116,121,112,101,218,8,95, - 95,99,111,100,101,95,95,114,162,0,0,0,114,18,0,0, - 0,114,148,0,0,0,114,17,0,0,0,114,24,0,0,0, - 114,236,0,0,0,114,92,0,0,0,114,88,0,0,0,114, - 102,0,0,0,114,89,0,0,0,90,23,68,69,66,85,71, - 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, - 69,83,90,27,79,80,84,73,77,73,90,69,68,95,66,89, - 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,114, - 98,0,0,0,114,103,0,0,0,114,109,0,0,0,114,113, - 0,0,0,114,115,0,0,0,114,136,0,0,0,114,143,0, - 0,0,114,152,0,0,0,114,156,0,0,0,114,158,0,0, - 0,114,165,0,0,0,114,170,0,0,0,114,171,0,0,0, - 114,176,0,0,0,218,6,111,98,106,101,99,116,114,185,0, - 0,0,114,190,0,0,0,114,191,0,0,0,114,208,0,0, - 0,114,221,0,0,0,114,239,0,0,0,114,9,1,0,0, - 114,15,1,0,0,114,21,1,0,0,114,252,0,0,0,114, - 22,1,0,0,114,43,1,0,0,114,45,1,0,0,114,59, - 1,0,0,114,79,1,0,0,114,184,0,0,0,114,87,1, - 0,0,114,89,1,0,0,114,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,8,60,109,111, - 100,117,108,101,62,1,0,0,0,115,126,0,0,0,4,22, - 4,1,4,1,2,1,2,255,4,4,8,17,8,5,8,5, - 8,6,8,6,8,12,8,10,8,9,8,5,8,7,8,9, - 12,22,10,127,0,8,16,1,12,2,4,1,4,2,6,2, - 6,2,8,2,18,71,8,40,8,19,8,12,8,12,8,28, - 8,17,8,33,8,28,8,24,16,13,14,10,12,11,8,14, - 6,3,6,1,2,255,12,68,14,64,14,29,16,127,0,17, - 14,72,18,45,18,26,4,3,18,53,14,63,14,42,14,127, - 0,7,14,127,0,22,12,23,8,11,8,65, + 0,114,39,1,0,0,26,6,0,0,115,2,0,0,0,0, + 1,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, + 114,101,112,114,95,95,41,1,78,41,15,114,125,0,0,0, + 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 209,0,0,0,114,46,1,0,0,114,143,0,0,0,114,206, + 0,0,0,114,137,0,0,0,114,58,1,0,0,114,203,0, + 0,0,114,87,1,0,0,114,207,0,0,0,114,94,1,0, + 0,114,39,1,0,0,114,3,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,79,1,0,0,139, + 5,0,0,115,22,0,0,0,8,2,4,7,8,14,8,4, + 4,2,8,12,8,5,10,48,8,31,2,1,10,17,114,79, + 1,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, + 6,0,0,0,8,0,0,0,67,0,0,0,115,146,0,0, + 0,124,0,160,0,100,1,161,1,125,4,124,0,160,0,100, + 2,161,1,125,5,124,4,115,66,124,5,114,36,124,5,106, + 1,125,4,110,30,124,2,124,3,107,2,114,56,116,2,124, + 1,124,2,131,2,125,4,110,10,116,3,124,1,124,2,131, + 2,125,4,124,5,115,84,116,4,124,1,124,2,124,4,100, + 3,141,3,125,5,122,36,124,5,124,0,100,2,60,0,124, + 4,124,0,100,1,60,0,124,2,124,0,100,4,60,0,124, + 3,124,0,100,5,60,0,87,0,110,20,4,0,116,5,107, + 10,114,140,1,0,1,0,1,0,89,0,110,2,88,0,100, + 0,83,0,41,6,78,218,10,95,95,108,111,97,100,101,114, + 95,95,218,8,95,95,115,112,101,99,95,95,114,80,1,0, + 0,90,8,95,95,102,105,108,101,95,95,90,10,95,95,99, + 97,99,104,101,100,95,95,41,6,218,3,103,101,116,114,140, + 0,0,0,114,15,1,0,0,114,9,1,0,0,114,190,0, + 0,0,114,72,1,0,0,41,6,90,2,110,115,114,117,0, + 0,0,90,8,112,97,116,104,110,97,109,101,90,9,99,112, + 97,116,104,110,97,109,101,114,140,0,0,0,114,187,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,14,95,102,105,120,95,117,112,95,109,111,100,117,108,101, + 32,6,0,0,115,34,0,0,0,0,2,10,1,10,1,4, + 1,4,1,8,1,8,1,12,2,10,1,4,1,14,1,2, + 1,8,1,8,1,8,1,12,1,14,2,114,98,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, + 116,1,160,2,161,0,102,2,125,0,116,3,116,4,102,2, + 125,1,116,5,116,6,102,2,125,2,124,0,124,1,124,2, + 103,3,83,0,41,1,122,95,82,101,116,117,114,110,115,32, + 97,32,108,105,115,116,32,111,102,32,102,105,108,101,45,98, + 97,115,101,100,32,109,111,100,117,108,101,32,108,111,97,100, + 101,114,115,46,10,10,32,32,32,32,69,97,99,104,32,105, + 116,101,109,32,105,115,32,97,32,116,117,112,108,101,32,40, + 108,111,97,100,101,114,44,32,115,117,102,102,105,120,101,115, + 41,46,10,32,32,32,32,41,7,114,252,0,0,0,114,163, + 0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,115, + 117,102,102,105,120,101,115,114,9,1,0,0,114,102,0,0, + 0,114,15,1,0,0,114,89,0,0,0,41,3,90,10,101, + 120,116,101,110,115,105,111,110,115,90,6,115,111,117,114,99, + 101,90,8,98,121,116,101,99,111,100,101,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,184,0,0,0,55, + 6,0,0,115,8,0,0,0,0,5,12,1,8,1,8,1, + 114,184,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,12,0,0,0,9,0,0,0,67,0,0,0,115,178, + 1,0,0,124,0,97,0,116,0,106,1,97,1,116,0,106, + 2,97,2,116,1,106,3,116,4,25,0,125,1,100,1,68, + 0,93,48,125,2,124,2,116,1,106,3,107,7,114,56,116, + 0,160,5,124,2,161,1,125,3,110,10,116,1,106,3,124, + 2,25,0,125,3,116,6,124,1,124,2,124,3,131,3,1, + 0,113,30,100,2,100,3,103,1,102,2,100,4,100,5,100, + 3,103,2,102,2,102,2,125,4,124,4,68,0,93,110,92, + 2,125,5,125,6,116,7,100,6,100,7,132,0,124,6,68, + 0,131,1,131,1,115,136,116,8,130,1,124,6,100,8,25, + 0,125,7,124,5,116,1,106,3,107,6,114,170,116,1,106, + 3,124,5,25,0,125,8,1,0,113,226,113,106,122,20,116, + 0,160,5,124,5,161,1,125,8,87,0,1,0,113,226,87, + 0,113,106,4,0,116,9,107,10,114,214,1,0,1,0,1, + 0,89,0,113,106,89,0,113,106,88,0,113,106,116,9,100, + 9,131,1,130,1,116,6,124,1,100,10,124,8,131,3,1, + 0,116,6,124,1,100,11,124,7,131,3,1,0,116,6,124, + 1,100,12,100,13,160,10,124,6,161,1,131,3,1,0,116, + 6,124,1,100,14,100,15,100,16,132,0,124,6,68,0,131, + 1,131,3,1,0,116,0,160,5,100,17,161,1,125,9,116, + 6,124,1,100,17,124,9,131,3,1,0,116,0,160,5,100, + 18,161,1,125,10,116,6,124,1,100,18,124,10,131,3,1, + 0,124,5,100,4,107,2,144,1,114,110,116,0,160,5,100, + 19,161,1,125,11,116,6,124,1,100,20,124,11,131,3,1, + 0,116,6,124,1,100,21,116,11,131,0,131,3,1,0,116, + 12,160,13,116,2,160,14,161,0,161,1,1,0,124,5,100, + 4,107,2,144,1,114,174,116,15,160,16,100,22,161,1,1, + 0,100,23,116,12,107,6,144,1,114,174,100,24,116,17,95, + 18,100,25,83,0,41,26,122,205,83,101,116,117,112,32,116, + 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109, + 112,111,114,116,101,114,115,32,102,111,114,32,105,109,112,111, + 114,116,108,105,98,32,98,121,32,105,109,112,111,114,116,105, + 110,103,32,110,101,101,100,101,100,10,32,32,32,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, + 110,100,32,105,110,106,101,99,116,105,110,103,32,116,104,101, + 109,32,105,110,116,111,32,116,104,101,32,103,108,111,98,97, + 108,32,110,97,109,101,115,112,97,99,101,46,10,10,32,32, + 32,32,79,116,104,101,114,32,99,111,109,112,111,110,101,110, + 116,115,32,97,114,101,32,101,120,116,114,97,99,116,101,100, + 32,102,114,111,109,32,116,104,101,32,99,111,114,101,32,98, + 111,111,116,115,116,114,97,112,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,41,4,114,64,0,0,0,114,75,0, + 0,0,218,8,98,117,105,108,116,105,110,115,114,160,0,0, + 0,90,5,112,111,115,105,120,250,1,47,90,2,110,116,250, + 1,92,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,115,0,0,0,115,26,0,0,0, + 124,0,93,18,125,1,116,0,124,1,131,1,100,0,107,2, + 86,0,1,0,113,2,100,1,83,0,41,2,114,39,0,0, + 0,78,41,1,114,22,0,0,0,41,2,114,32,0,0,0, + 114,95,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,19,1,0,0,91,6,0,0,115,4,0, + 0,0,4,0,2,0,122,25,95,115,101,116,117,112,46,60, + 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114, + 62,114,73,0,0,0,122,30,105,109,112,111,114,116,108,105, + 98,32,114,101,113,117,105,114,101,115,32,112,111,115,105,120, + 32,111,114,32,110,116,114,2,0,0,0,114,35,0,0,0, + 114,31,0,0,0,114,40,0,0,0,114,58,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,83,0,0,0,115,22,0,0,0,104,0,124, + 0,93,14,125,1,100,0,124,1,155,0,157,2,146,2,113, + 4,83,0,41,1,114,74,0,0,0,114,3,0,0,0,41, + 2,114,32,0,0,0,218,1,115,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,88,1,0,0,107,6,0, + 0,115,4,0,0,0,6,0,2,0,122,25,95,115,101,116, + 117,112,46,60,108,111,99,97,108,115,62,46,60,115,101,116, + 99,111,109,112,62,90,7,95,116,104,114,101,97,100,90,8, + 95,119,101,97,107,114,101,102,90,6,119,105,110,114,101,103, + 114,192,0,0,0,114,7,0,0,0,122,4,46,112,121,119, + 122,6,95,100,46,112,121,100,84,78,41,19,114,134,0,0, + 0,114,8,0,0,0,114,163,0,0,0,114,31,1,0,0, + 114,125,0,0,0,90,18,95,98,117,105,108,116,105,110,95, + 102,114,111,109,95,110,97,109,101,114,129,0,0,0,218,3, + 97,108,108,114,23,0,0,0,114,118,0,0,0,114,36,0, + 0,0,114,13,0,0,0,114,21,1,0,0,114,167,0,0, + 0,114,99,1,0,0,114,102,0,0,0,114,186,0,0,0, + 114,191,0,0,0,114,195,0,0,0,41,12,218,17,95,98, + 111,111,116,115,116,114,97,112,95,109,111,100,117,108,101,90, + 11,115,101,108,102,95,109,111,100,117,108,101,90,12,98,117, + 105,108,116,105,110,95,110,97,109,101,90,14,98,117,105,108, + 116,105,110,95,109,111,100,117,108,101,90,10,111,115,95,100, + 101,116,97,105,108,115,90,10,98,117,105,108,116,105,110,95, + 111,115,114,31,0,0,0,114,35,0,0,0,90,9,111,115, + 95,109,111,100,117,108,101,90,13,116,104,114,101,97,100,95, + 109,111,100,117,108,101,90,14,119,101,97,107,114,101,102,95, + 109,111,100,117,108,101,90,13,119,105,110,114,101,103,95,109, + 111,100,117,108,101,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,6,95,115,101,116,117,112,66,6,0,0, + 115,78,0,0,0,0,8,4,1,6,1,6,3,10,1,8, + 1,10,1,12,2,10,1,14,3,22,1,12,2,22,1,8, + 1,10,1,10,1,6,2,2,1,10,1,10,1,14,1,12, + 2,8,1,12,1,12,1,18,1,22,3,10,1,12,3,10, + 1,12,3,10,1,10,1,12,3,14,1,14,1,10,1,10, + 1,10,1,114,106,1,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, + 0,115,50,0,0,0,116,0,124,0,131,1,1,0,116,1, + 131,0,125,1,116,2,106,3,160,4,116,5,106,6,124,1, + 142,0,103,1,161,1,1,0,116,2,106,7,160,8,116,9, + 161,1,1,0,100,1,83,0,41,2,122,41,73,110,115,116, + 97,108,108,32,116,104,101,32,112,97,116,104,45,98,97,115, + 101,100,32,105,109,112,111,114,116,32,99,111,109,112,111,110, + 101,110,116,115,46,78,41,10,114,106,1,0,0,114,184,0, + 0,0,114,8,0,0,0,114,51,1,0,0,114,167,0,0, + 0,114,79,1,0,0,114,94,1,0,0,218,9,109,101,116, + 97,95,112,97,116,104,114,186,0,0,0,114,45,1,0,0, + 41,2,114,105,1,0,0,90,17,115,117,112,112,111,114,116, + 101,100,95,108,111,97,100,101,114,115,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,8,95,105,110,115,116, + 97,108,108,131,6,0,0,115,8,0,0,0,0,2,8,1, + 6,1,20,1,114,108,1,0,0,41,63,114,127,0,0,0, + 114,12,0,0,0,90,37,95,67,65,83,69,95,73,78,83, + 69,78,83,73,84,73,86,69,95,80,76,65,84,70,79,82, + 77,83,95,66,89,84,69,83,95,75,69,89,114,11,0,0, + 0,114,13,0,0,0,114,20,0,0,0,114,27,0,0,0, + 114,29,0,0,0,114,38,0,0,0,114,47,0,0,0,114, + 49,0,0,0,114,53,0,0,0,114,54,0,0,0,114,56, + 0,0,0,114,59,0,0,0,114,69,0,0,0,218,4,116, + 121,112,101,218,8,95,95,99,111,100,101,95,95,114,162,0, + 0,0,114,18,0,0,0,114,148,0,0,0,114,17,0,0, + 0,114,24,0,0,0,114,236,0,0,0,114,92,0,0,0, + 114,88,0,0,0,114,102,0,0,0,114,89,0,0,0,90, + 23,68,69,66,85,71,95,66,89,84,69,67,79,68,69,95, + 83,85,70,70,73,88,69,83,90,27,79,80,84,73,77,73, + 90,69,68,95,66,89,84,69,67,79,68,69,95,83,85,70, + 70,73,88,69,83,114,98,0,0,0,114,103,0,0,0,114, + 109,0,0,0,114,113,0,0,0,114,115,0,0,0,114,136, + 0,0,0,114,143,0,0,0,114,152,0,0,0,114,156,0, + 0,0,114,158,0,0,0,114,165,0,0,0,114,170,0,0, + 0,114,171,0,0,0,114,176,0,0,0,218,6,111,98,106, + 101,99,116,114,185,0,0,0,114,190,0,0,0,114,191,0, + 0,0,114,208,0,0,0,114,221,0,0,0,114,239,0,0, + 0,114,9,1,0,0,114,15,1,0,0,114,21,1,0,0, + 114,252,0,0,0,114,22,1,0,0,114,43,1,0,0,114, + 45,1,0,0,114,79,1,0,0,114,98,1,0,0,114,184, + 0,0,0,114,106,1,0,0,114,108,1,0,0,114,3,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,8,60,109,111,100,117,108,101,62,1,0,0,0,115, + 126,0,0,0,4,22,4,1,4,1,2,1,2,255,4,4, + 8,17,8,5,8,5,8,6,8,6,8,12,8,10,8,9, + 8,5,8,7,8,9,12,22,10,127,0,8,16,1,12,2, + 4,1,4,2,6,2,6,2,8,2,18,71,8,40,8,19, + 8,12,8,12,8,28,8,17,8,33,8,28,8,24,16,13, + 14,10,12,11,8,14,6,3,6,1,2,255,12,68,14,64, + 14,29,16,127,0,17,14,72,18,45,18,26,4,3,18,53, + 14,63,14,42,14,127,0,59,14,127,0,22,12,23,8,11, + 8,65, }; From webhook-mailer at python.org Fri May 24 21:59:57 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sat, 25 May 2019 01:59:57 -0000 Subject: [Python-checkins] bpo-37038: Make idlelib.run runnable; add test clause (GH-13560) Message-ID: https://github.com/python/cpython/commit/81bb97df6138c755e229dcdac9bed747e31b61b3 commit: 81bb97df6138c755e229dcdac9bed747e31b61b3 branch: master author: Terry Jan Reedy committer: GitHub date: 2019-05-24T21:59:53-04:00 summary: bpo-37038: Make idlelib.run runnable; add test clause (GH-13560) files: A Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/run.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 3f19ce737396..e1bc009ae933 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2019-10-20? ====================================== +bpo-37038: Make idlelib.run runnable; add test clause. + bpo-36958: Print any argument other than None or int passed to SystemExit or sys.exit(). diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index b4a2b54a33c8..4075deec51d8 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -1,3 +1,9 @@ +""" idlelib.run + +Simplified, pyshell.ModifiedInterpreter spawns a subprocess with +f'''{sys.executable} -c "__import__('idlelib.run').run.main()"''' +'.run' is needed because __import__ returns idlelib, not idlelib.run. +""" import io import linecache import queue @@ -8,8 +14,6 @@ import threading import warnings -import tkinter # Tcl, deletions, messagebox if startup fails - from idlelib import autocomplete # AutoComplete, fetch_encodings from idlelib import calltip # Calltip from idlelib import debugger_r # start_debugger @@ -19,11 +23,16 @@ from idlelib import stackviewer # StackTreeItem import __main__ -for mod in ('simpledialog', 'messagebox', 'font', - 'dialog', 'filedialog', 'commondialog', - 'ttk'): - delattr(tkinter, mod) - del sys.modules['tkinter.' + mod] +import tkinter # Use tcl and, if startup fails, messagebox. +if not hasattr(sys.modules['idlelib.run'], 'firstrun'): + # Undo modifications of tkinter by idlelib imports; see bpo-25507. + for mod in ('simpledialog', 'messagebox', 'font', + 'dialog', 'filedialog', 'commondialog', + 'ttk'): + delattr(tkinter, mod) + del sys.modules['tkinter.' + mod] + # Avoid AttributeError if run again; see bpo-37038. + sys.modules['idlelib.run'].firstrun = False LOCALHOST = '127.0.0.1' @@ -523,4 +532,9 @@ def stackviewer(self, flist_oid=None): item = stackviewer.StackTreeItem(flist, tb) return debugobj_r.remote_object_tree_item(item) -capture_warnings(False) # Make sure turned off; see issue 18081 + +if __name__ == '__main__': + from unittest import main + main('idlelib.idle_test.test_run', verbosity=2) + +capture_warnings(False) # Make sure turned off; see bpo-18081. diff --git a/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst b/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst new file mode 100644 index 000000000000..762e9f1e4374 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst @@ -0,0 +1 @@ +Make idlelib.run runnable; add test clause. From webhook-mailer at python.org Sat May 25 01:10:14 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 25 May 2019 05:10:14 -0000 Subject: [Python-checkins] bpo-37038: Make idlelib.run runnable; add test clause (GH-13560) Message-ID: https://github.com/python/cpython/commit/c70ab1cca0f43dbf3bad4acacd06a792cdbe03c8 commit: c70ab1cca0f43dbf3bad4acacd06a792cdbe03c8 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-24T22:10:09-07:00 summary: bpo-37038: Make idlelib.run runnable; add test clause (GH-13560) (cherry picked from commit 81bb97df6138c755e229dcdac9bed747e31b61b3) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/run.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 512ee8b32f54..7b5a13a21524 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2019-06-24? ====================================== +bpo-37038: Make idlelib.run runnable; add test clause. + bpo-36958: Print any argument other than None or int passed to SystemExit or sys.exit(). diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index b4a2b54a33c8..4075deec51d8 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -1,3 +1,9 @@ +""" idlelib.run + +Simplified, pyshell.ModifiedInterpreter spawns a subprocess with +f'''{sys.executable} -c "__import__('idlelib.run').run.main()"''' +'.run' is needed because __import__ returns idlelib, not idlelib.run. +""" import io import linecache import queue @@ -8,8 +14,6 @@ import threading import warnings -import tkinter # Tcl, deletions, messagebox if startup fails - from idlelib import autocomplete # AutoComplete, fetch_encodings from idlelib import calltip # Calltip from idlelib import debugger_r # start_debugger @@ -19,11 +23,16 @@ from idlelib import stackviewer # StackTreeItem import __main__ -for mod in ('simpledialog', 'messagebox', 'font', - 'dialog', 'filedialog', 'commondialog', - 'ttk'): - delattr(tkinter, mod) - del sys.modules['tkinter.' + mod] +import tkinter # Use tcl and, if startup fails, messagebox. +if not hasattr(sys.modules['idlelib.run'], 'firstrun'): + # Undo modifications of tkinter by idlelib imports; see bpo-25507. + for mod in ('simpledialog', 'messagebox', 'font', + 'dialog', 'filedialog', 'commondialog', + 'ttk'): + delattr(tkinter, mod) + del sys.modules['tkinter.' + mod] + # Avoid AttributeError if run again; see bpo-37038. + sys.modules['idlelib.run'].firstrun = False LOCALHOST = '127.0.0.1' @@ -523,4 +532,9 @@ def stackviewer(self, flist_oid=None): item = stackviewer.StackTreeItem(flist, tb) return debugobj_r.remote_object_tree_item(item) -capture_warnings(False) # Make sure turned off; see issue 18081 + +if __name__ == '__main__': + from unittest import main + main('idlelib.idle_test.test_run', verbosity=2) + +capture_warnings(False) # Make sure turned off; see bpo-18081. diff --git a/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst b/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst new file mode 100644 index 000000000000..762e9f1e4374 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst @@ -0,0 +1 @@ +Make idlelib.run runnable; add test clause. From webhook-mailer at python.org Sat May 25 04:09:45 2019 From: webhook-mailer at python.org (Jason R. Coombs) Date: Sat, 25 May 2019 08:09:45 -0000 Subject: [Python-checkins] bpo-34632: fix installation of importlib.metadata (#13563) Message-ID: https://github.com/python/cpython/commit/c3738cfe63b1f2c1dc4a28d0ff9adb4e9e3aae1f commit: c3738cfe63b1f2c1dc4a28d0ff9adb4e9e3aae1f branch: master author: Chih-Hsuan Yen committer: Jason R. Coombs date: 2019-05-25T04:09:34-04:00 summary: bpo-34632: fix installation of importlib.metadata (#13563) files: M Makefile.pre.in diff --git a/Makefile.pre.in b/Makefile.pre.in index 466cd763c98d..925d52f7894e 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1320,6 +1320,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ test/test_import/data/package \ test/test_import/data/package2 \ importlib \ + importlib/metadata \ test/test_importlib \ test/test_importlib/builtin \ test/test_importlib/data01 \ From webhook-mailer at python.org Sat May 25 06:03:51 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sat, 25 May 2019 10:03:51 -0000 Subject: [Python-checkins] =?utf-8?q?=F0=9F=93=9D_Add_a_GitHub-specific_s?= =?utf-8?q?ecurity_page_=28GH-13526=29?= Message-ID: https://github.com/python/cpython/commit/af570745fe3852a9ded0e723a7232e4cc0451e95 commit: af570745fe3852a9ded0e723a7232e4cc0451e95 branch: master author: Sviatoslav Sydorenko committer: Andrew Svetlov date: 2019-05-25T13:03:45+03:00 summary: ? Add a GitHub-specific security page (GH-13526) * ? Add a GitHub-specific security page It will show up @ https://github.com/python/cpython/security/policy allowing to navigate users who get there from "Security" tab in the GitHub repo to the full article explaining the security vulnerability reporting practices. Co-Authored-By: Hugo files: A .github/SECURITY.md diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 000000000000..23976fda4a7e --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,18 @@ +# Security Policy + +## Supported Versions + +The Python team applies security fixes according to the table in +in [the devguide]( +https://devguide.python.org/#status-of-python-branches +). + +## Reporting a Vulnerability + +Please read the guidelines on reporting security issues [on the +official website]( +https://www.python.org/news/security/#reporting-security-issues-in-python +) for instructions on how to report a security-related problem to +the Python team responsibly. + +To reach the response team, email `security at python dot org`. From webhook-mailer at python.org Sat May 25 08:13:37 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sat, 25 May 2019 12:13:37 -0000 Subject: [Python-checkins] bpo-27987: align PyGC_Head to alignof(long double) (GH-13335) Message-ID: https://github.com/python/cpython/commit/ea2b76bdc5f97f49701213d105b8ec2387ea2fa5 commit: ea2b76bdc5f97f49701213d105b8ec2387ea2fa5 branch: 3.7 author: Inada Naoki committer: GitHub date: 2019-05-25T21:13:33+09:00 summary: bpo-27987: align PyGC_Head to alignof(long double) (GH-13335) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst M Include/objimpl.h diff --git a/Include/objimpl.h b/Include/objimpl.h index 057bb50cbda9..0436ba7899d9 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -255,7 +255,11 @@ typedef union _gc_head { union _gc_head *gc_prev; Py_ssize_t gc_refs; } gc; - double dummy; /* force worst-case alignment */ + long double dummy; /* force worst-case alignment */ + // malloc returns memory block aligned for any built-in types and + // long double is the largest standard C type. + // On amd64 linux, long double requires 16 byte alignment. + // See bpo-27987 for more discussion. } PyGC_Head; extern PyGC_Head *_PyGC_generation0; diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst new file mode 100644 index 000000000000..97ca37b262a1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst @@ -0,0 +1,2 @@ +``PyGC_Head`` structure is aligned to ``long double``. This is needed to +GC-ed objects are aligned properly. Patch by Inada Naoki. From webhook-mailer at python.org Sat May 25 10:00:29 2019 From: webhook-mailer at python.org (Jason R. Coombs) Date: Sat, 25 May 2019 14:00:29 -0000 Subject: [Python-checkins] bpo-34632 fix buildbots and remove artifact (GH-13566) Message-ID: https://github.com/python/cpython/commit/f7fba6cfb62edfc22e9b2e12a00ebaf5f348398e commit: f7fba6cfb62edfc22e9b2e12a00ebaf5f348398e branch: master author: Jason R. Coombs committer: GitHub date: 2019-05-25T10:00:21-04:00 summary: bpo-34632 fix buildbots and remove artifact (GH-13566) * bpo-34632: Also include the test data directory. * bpo-34632: remove the framework resources artifacts, accidentally added in 1bbf7b661f (ccbccce) files: D Python.framework/Resources M Makefile.pre.in diff --git a/Makefile.pre.in b/Makefile.pre.in index 925d52f7894e..ee94ad54a272 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1323,6 +1323,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ importlib/metadata \ test/test_importlib \ test/test_importlib/builtin \ + test/test_importlib/data \ test/test_importlib/data01 \ test/test_importlib/data01/subdirectory \ test/test_importlib/data02 \ diff --git a/Python.framework/Resources b/Python.framework/Resources deleted file mode 120000 index 953ee36f3bb7..000000000000 --- a/Python.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file From webhook-mailer at python.org Sat May 25 14:02:36 2019 From: webhook-mailer at python.org (Julien Palard) Date: Sat, 25 May 2019 18:02:36 -0000 Subject: [Python-checkins] Docs: FIX broken links. (GH-13491) Message-ID: https://github.com/python/cpython/commit/7114c6504a60365b8b0cd718da0ec8a737599fb9 commit: 7114c6504a60365b8b0cd718da0ec8a737599fb9 branch: master author: Julien Palard committer: GitHub date: 2019-05-25T20:02:24+02:00 summary: Docs: FIX broken links. (GH-13491) files: M Doc/faq/gui.rst M Doc/library/readline.rst M Doc/library/tkinter.rst M Doc/using/mac.rst M Doc/using/windows.rst M Doc/whatsnew/2.6.rst M Doc/whatsnew/3.2.rst diff --git a/Doc/faq/gui.rst b/Doc/faq/gui.rst index 4f9979bf55ed..781da467d180 100644 --- a/Doc/faq/gui.rst +++ b/Doc/faq/gui.rst @@ -104,7 +104,7 @@ What platform-specific GUI toolkits exist for Python? ======================================================== By installing the `PyObjc Objective-C bridge -`_, Python programs can use Mac OS X's +`_, Python programs can use Mac OS X's Cocoa libraries. :ref:`Pythonwin ` by Mark Hammond includes an interface to the diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index 16c28cf7d02f..eae0a6df45f3 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -19,7 +19,7 @@ function. Readline keybindings may be configured via an initialization file, typically ``.inputrc`` in your home directory. See `Readline Init File -`_ +`_ in the GNU Readline manual for information about the format and allowable constructs of that file, and the capabilities of the Readline library in general. diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 60cf892e0888..640fb2ec61d3 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -55,7 +55,7 @@ installed, so you can read the Tcl/Tk documentation specific to that version. `Tcl/Tk recent man pages `_ Recent Tcl/Tk manuals on www.tcl.tk. - `ActiveState Tcl Home Page `_ + `ActiveState Tcl Home Page `_ The Tk/Tcl development is largely taking place at ActiveState. `Tcl and the Tk Toolkit `_ diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index a386728eaee3..bc022fa58c04 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -141,7 +141,7 @@ There are several options for building GUI applications on the Mac with Python. *PyObjC* is a Python binding to Apple's Objective-C/Cocoa framework, which is the foundation of most modern Mac development. Information on PyObjC is -available from https://pythonhosted.org/pyobjc/. +available from https://pypi.org/project/pyobjc/. The standard Python GUI toolkit is :mod:`tkinter`, based on the cross-platform Tk toolkit (https://www.tcl.tk). An Aqua-native version of Tk is bundled with OS diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 44b646fddfc4..a1b25ffd25f0 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -1043,7 +1043,9 @@ The `PyWin32 `_ module by Mark Hammond is a collection of modules for advanced Windows-specific support. This includes utilities for: -* `Component Object Model `_ (COM) +* `Component Object Model + `_ + (COM) * Win32 API calls * Registry * Event log @@ -1109,8 +1111,7 @@ For extension modules, consult :ref:`building-on-windows`. MinGW gcc under Windows" or "Installing Python extension with distutils and without Microsoft Visual C++" by S?bastien Sauvage, 2003 - `MingW -- Python extensions `_ - by Trent Apted et al, 2007 + `MingW -- Python extensions `_ Other Platforms diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index 512b8edb357a..b6174a19a178 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -227,7 +227,7 @@ the Python community. Sphinx is a standalone package that can be used for writing, and almost two dozen other projects -(`listed on the Sphinx web site `__) +(`listed on the Sphinx web site `__) have adopted Sphinx as their documentation tool. .. seealso:: diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 2d740006a370..ca3eda05c515 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -50,7 +50,9 @@ This article explains the new features in Python 3.2 as compared to 3.1. It focuses on a few highlights and gives a few examples. For full details, see the -`Misc/NEWS `_ file. +`Misc/NEWS +`_ +file. .. seealso:: @@ -969,10 +971,10 @@ sites do not finish before midnight, the barrier times-out and the ballots are sealed and deposited in a queue for later handling. See `Barrier Synchronization Patterns -`_ for -more examples of how barriers can be used in parallel computing. Also, there is +`_ +for more examples of how barriers can be used in parallel computing. Also, there is a simple but thorough explanation of barriers in `The Little Book of Semaphores -`_, *section 3.6*. +`_, *section 3.6*. (Contributed by Kristj?n Valur J?nsson with an API review by Jeffrey Yasskin in :issue:`8777`.) @@ -2512,9 +2514,9 @@ repository. This distributed version control system should make it easier for members of the community to create and share external changesets. See :pep:`385` for details. -To learn to use the new version control system, see the `tutorial by Joel -Spolsky `_ or the `Guide to Mercurial Workflows -`_. +To learn to use the new version control system, see the `Quick Start +`_ or the `Guide to +Mercurial Workflows `_. Build and C API Changes From webhook-mailer at python.org Sat May 25 14:23:04 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Sat, 25 May 2019 18:23:04 -0000 Subject: [Python-checkins] [3.7] Revert "align PyGC_Head to alignof(long double) (GH-13335)" (GH-13569) Message-ID: https://github.com/python/cpython/commit/2156fec1f7a8f9972e90cdbaf404e3fd9eaccb35 commit: 2156fec1f7a8f9972e90cdbaf404e3fd9eaccb35 branch: 3.7 author: Gregory P. Smith committer: GitHub date: 2019-05-25T10:05:01-07:00 summary: [3.7] Revert "align PyGC_Head to alignof(long double) (GH-13335)" (GH-13569) This reverts commit ea2b76bdc5f97f49701213d105b8ec2387ea2fa5. See the bug for discussion. https://bugs.python.org/issue27987 files: D Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst M Include/objimpl.h diff --git a/Include/objimpl.h b/Include/objimpl.h index 0436ba7899d9..057bb50cbda9 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -255,11 +255,7 @@ typedef union _gc_head { union _gc_head *gc_prev; Py_ssize_t gc_refs; } gc; - long double dummy; /* force worst-case alignment */ - // malloc returns memory block aligned for any built-in types and - // long double is the largest standard C type. - // On amd64 linux, long double requires 16 byte alignment. - // See bpo-27987 for more discussion. + double dummy; /* force worst-case alignment */ } PyGC_Head; extern PyGC_Head *_PyGC_generation0; diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst deleted file mode 100644 index 97ca37b262a1..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst +++ /dev/null @@ -1,2 +0,0 @@ -``PyGC_Head`` structure is aligned to ``long double``. This is needed to -GC-ed objects are aligned properly. Patch by Inada Naoki. From webhook-mailer at python.org Sat May 25 14:23:05 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 25 May 2019 18:23:05 -0000 Subject: [Python-checkins] bpo-27987: pymalloc: align by 16bytes on 64bit platform (GH-12850) Message-ID: https://github.com/python/cpython/commit/1b85f4ec45a5d63188ee3866bd55eb29fdec7fbf commit: 1b85f4ec45a5d63188ee3866bd55eb29fdec7fbf branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-25T10:18:34-07:00 summary: bpo-27987: pymalloc: align by 16bytes on 64bit platform (GH-12850) (cherry picked from commit f0be4bbb9b3cee876249c23f2ae6f38f43fa7495) Co-authored-by: Inada Naoki files: A Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst M Objects/obmalloc.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst new file mode 100644 index 000000000000..b0f32a5c6c3f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst @@ -0,0 +1,3 @@ +pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on +64-bit platforms to conform x86-64 ABI. Recent compilers assume this alignment +more often. Patch by Inada Naoki. diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 46e84270b26e..885ad537ad95 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -788,8 +788,14 @@ static int running_on_valgrind = -1; * * You shouldn't change this unless you know what you are doing. */ + +#if SIZEOF_VOID_P > 4 +#define ALIGNMENT 16 /* must be 2^N */ +#define ALIGNMENT_SHIFT 4 +#else #define ALIGNMENT 8 /* must be 2^N */ #define ALIGNMENT_SHIFT 3 +#endif /* Return the number of bytes in size class I, as a uint. */ #define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT) From webhook-mailer at python.org Sun May 26 03:23:48 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sun, 26 May 2019 07:23:48 -0000 Subject: [Python-checkins] bpo-37017: PyObject_CallMethodObjArgs uses LOAD_METHOD optimization (GH-13516) Message-ID: https://github.com/python/cpython/commit/47dd2f9fd86c32a79e77fef1fbb1ce25dc929de6 commit: 47dd2f9fd86c32a79e77fef1fbb1ce25dc929de6 branch: master author: Michael J. Sullivan committer: Inada Naoki date: 2019-05-26T16:23:33+09:00 summary: bpo-37017: PyObject_CallMethodObjArgs uses LOAD_METHOD optimization (GH-13516) Update PyObject_CallMethodObjArgs and _PyObject_CallMethodIdObjArgs to use _PyObject_GetMethod to avoid creating a bound method object in many cases. On a microbenchmark of PyObject_CallMethodObjArgs calling a method on an interpreted Python class, this optimization resulted in a 1.7x speedup. files: A Misc/NEWS.d/next/C API/2019-05-22-17-33-52.bpo-37107.8BVPR-.rst M Objects/call.c diff --git a/Misc/NEWS.d/next/C API/2019-05-22-17-33-52.bpo-37107.8BVPR-.rst b/Misc/NEWS.d/next/C API/2019-05-22-17-33-52.bpo-37107.8BVPR-.rst new file mode 100644 index 000000000000..4a9e58f71554 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-05-22-17-33-52.bpo-37107.8BVPR-.rst @@ -0,0 +1,4 @@ +Update :c:func:`PyObject_CallMethodObjArgs` and ``_PyObject_CallMethodIdObjArgs`` +to use ``_PyObject_GetMethod`` to avoid creating a bound method object in many +cases. +Patch by Michael J. Sullivan. diff --git a/Objects/call.c b/Objects/call.c index cb9ccd9c2cae..b608492dd6be 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -1159,7 +1159,7 @@ _PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name, /* --- Call with "..." arguments ---------------------------------- */ static PyObject * -object_vacall(PyObject *callable, va_list vargs) +object_vacall(PyObject *base, PyObject *callable, va_list vargs) { PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; @@ -1174,7 +1174,7 @@ object_vacall(PyObject *callable, va_list vargs) /* Count the number of arguments */ va_copy(countva, vargs); - nargs = 0; + nargs = base ? 1 : 0; while (1) { PyObject *arg = va_arg(countva, PyObject *); if (arg == NULL) { @@ -1196,7 +1196,12 @@ object_vacall(PyObject *callable, va_list vargs) } } - for (i = 0; i < nargs; ++i) { + i = 0; + if (base) { + stack[i++] = base; + } + + for (; i < nargs; ++i) { stack[i] = va_arg(vargs, PyObject *); } @@ -1210,23 +1215,26 @@ object_vacall(PyObject *callable, va_list vargs) } +/* Private API for the LOAD_METHOD opcode. */ +extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **); + PyObject * -PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...) +PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) { - va_list vargs; - PyObject *result; - - if (callable == NULL || name == NULL) { + if (obj == NULL || name == NULL) { return null_error(); } - callable = PyObject_GetAttr(callable, name); + PyObject *callable = NULL; + int is_method = _PyObject_GetMethod(obj, name, &callable); if (callable == NULL) { return NULL; } + obj = is_method ? obj : NULL; + va_list vargs; va_start(vargs, name); - result = object_vacall(callable, vargs); + PyObject *result = object_vacall(obj, callable, vargs); va_end(vargs); Py_DECREF(callable); @@ -1238,20 +1246,25 @@ PyObject * _PyObject_CallMethodIdObjArgs(PyObject *obj, struct _Py_Identifier *name, ...) { - va_list vargs; - PyObject *callable, *result; - if (obj == NULL || name == NULL) { return null_error(); } - callable = _PyObject_GetAttrId(obj, name); + PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ + if (!oname) { + return NULL; + } + + PyObject *callable = NULL; + int is_method = _PyObject_GetMethod(obj, oname, &callable); if (callable == NULL) { return NULL; } + obj = is_method ? obj : NULL; + va_list vargs; va_start(vargs, name); - result = object_vacall(callable, vargs); + PyObject *result = object_vacall(obj, callable, vargs); va_end(vargs); Py_DECREF(callable); @@ -1266,7 +1279,7 @@ PyObject_CallFunctionObjArgs(PyObject *callable, ...) PyObject *result; va_start(vargs, callable); - result = object_vacall(callable, vargs); + result = object_vacall(NULL, callable, vargs); va_end(vargs); return result; From webhook-mailer at python.org Sun May 26 04:37:21 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Sun, 26 May 2019 08:37:21 -0000 Subject: [Python-checkins] bpo-37045: PEP 591: Add final qualifiers to typing module (GH-13571) Message-ID: https://github.com/python/cpython/commit/f367242d10ef36db38133a39ab7627f63099cba4 commit: f367242d10ef36db38133a39ab7627f63099cba4 branch: master author: Ivan Levkivskyi committer: GitHub date: 2019-05-26T09:37:07+01:00 summary: bpo-37045: PEP 591: Add final qualifiers to typing module (GH-13571) The implementation is straightforward, it just mimics `ClassVar` (since the latter is also a name/access qualifier, not really a type). Also it is essentially copied from `typing_extensions`. files: A Misc/NEWS.d/next/Library/2019-05-25-18-36-50.bpo-37045.suHdVJ.rst M Doc/library/typing.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 86a3db8467ec..8362f1d8e6b7 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -940,6 +940,31 @@ The module defines the following classes, functions and decorators: See :pep:`484` for details and comparison with other typing semantics. +.. decorator:: final + + A decorator to indicate to type checkers that the decorated method + cannot be overridden, and the decorated class cannot be subclassed. + For example:: + + class Base: + @final + def done(self) -> None: + ... + class Sub(Base): + def done(self) -> None: # Error reported by type checker + ... + + @final + class Leaf: + ... + class Other(Leaf): # Error reported by type checker + ... + + There is no runtime checking of these properties. See :pep:`591` for + more details. + + .. versionadded:: 3.8 + .. decorator:: no_type_check Decorator to indicate that annotations are not type hints. @@ -1104,6 +1129,25 @@ The module defines the following classes, functions and decorators: .. versionadded:: 3.5.3 +.. data:: Final + + A special typing construct to indicate to type checkers that a name + cannot be re-assigned or overridden in a subclass. For example:: + + MAX_SIZE: Final = 9000 + MAX_SIZE += 1 # Error reported by type checker + + class Connection: + TIMEOUT: Final[int] = 10 + + class FastConnector(Connection): + TIMEOUT = 1 # Error reported by type checker + + There is no runtime checking of these properties. See :pep:`591` for + more details. + + .. versionadded:: 3.8 + .. data:: AnyStr ``AnyStr`` is a type variable defined as diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index c9bfd0c7ed72..3d93eb396ce7 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -12,7 +12,7 @@ from typing import Union, Optional from typing import Tuple, List, MutableMapping from typing import Callable -from typing import Generic, ClassVar +from typing import Generic, ClassVar, Final, final from typing import cast from typing import get_type_hints from typing import no_type_check, no_type_check_decorator @@ -1438,6 +1438,53 @@ def test_no_isinstance(self): issubclass(int, ClassVar) +class FinalTests(BaseTestCase): + + def test_basics(self): + Final[int] # OK + with self.assertRaises(TypeError): + Final[1] + with self.assertRaises(TypeError): + Final[int, str] + with self.assertRaises(TypeError): + Final[int][str] + with self.assertRaises(TypeError): + Optional[Final[int]] + + def test_repr(self): + self.assertEqual(repr(Final), 'typing.Final') + cv = Final[int] + self.assertEqual(repr(cv), 'typing.Final[int]') + cv = Final[Employee] + self.assertEqual(repr(cv), 'typing.Final[%s.Employee]' % __name__) + + def test_cannot_subclass(self): + with self.assertRaises(TypeError): + class C(type(Final)): + pass + with self.assertRaises(TypeError): + class C(type(Final[int])): + pass + + def test_cannot_init(self): + with self.assertRaises(TypeError): + Final() + with self.assertRaises(TypeError): + type(Final)() + with self.assertRaises(TypeError): + type(Final[Optional[int]])() + + def test_no_isinstance(self): + with self.assertRaises(TypeError): + isinstance(1, Final[int]) + with self.assertRaises(TypeError): + issubclass(int, Final) + + def test_final_unmodified(self): + def func(x): ... + self.assertIs(func, final(func)) + + class CastTests(BaseTestCase): def test_basics(self): diff --git a/Lib/typing.py b/Lib/typing.py index 7aab1628a319..06a7eb0dff84 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -35,6 +35,7 @@ 'Any', 'Callable', 'ClassVar', + 'Final', 'Generic', 'Optional', 'Tuple', @@ -92,6 +93,7 @@ # One-off things. 'AnyStr', 'cast', + 'final', 'get_type_hints', 'NewType', 'no_type_check', @@ -121,7 +123,7 @@ def _type_check(arg, msg, is_argument=True): """ invalid_generic_forms = (Generic, _Protocol) if is_argument: - invalid_generic_forms = invalid_generic_forms + (ClassVar, ) + invalid_generic_forms = invalid_generic_forms + (ClassVar, Final) if arg is None: return type(None) @@ -336,8 +338,8 @@ def __subclasscheck__(self, cls): @_tp_cache def __getitem__(self, parameters): - if self._name == 'ClassVar': - item = _type_check(parameters, 'ClassVar accepts only single type.') + if self._name in ('ClassVar', 'Final'): + item = _type_check(parameters, f'{self._name} accepts only single type.') return _GenericAlias(self, (item,)) if self._name == 'Union': if parameters == (): @@ -398,6 +400,24 @@ class Starship: be used with isinstance() or issubclass(). """) +Final = _SpecialForm('Final', doc= + """Special typing construct to indicate final names to type checkers. + + A final name cannot be re-assigned or overridden in a subclass. + For example: + + MAX_SIZE: Final = 9000 + MAX_SIZE += 1 # Error reported by type checker + + class Connection: + TIMEOUT: Final[int] = 10 + + class FastConnector(Connection): + TIMEOUT = 1 # Error reported by type checker + + There is no runtime checking of these properties. + """) + Union = _SpecialForm('Union', doc= """Union type; Union[X, Y] means either X or Y. @@ -1085,6 +1105,32 @@ def utf8(value): return _overload_dummy +def final(f): + """A decorator to indicate final methods and final classes. + + Use this decorator to indicate to type checkers that the decorated + method cannot be overridden, and decorated class cannot be subclassed. + For example: + + class Base: + @final + def done(self) -> None: + ... + class Sub(Base): + def done(self) -> None: # Error reported by type checker + ... + + @final + class Leaf: + ... + class Other(Leaf): # Error reported by type checker + ... + + There is no runtime checking of these properties. + """ + return f + + class _ProtocolMeta(type): """Internal metaclass for _Protocol. diff --git a/Misc/NEWS.d/next/Library/2019-05-25-18-36-50.bpo-37045.suHdVJ.rst b/Misc/NEWS.d/next/Library/2019-05-25-18-36-50.bpo-37045.suHdVJ.rst new file mode 100644 index 000000000000..001529ed6db4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-25-18-36-50.bpo-37045.suHdVJ.rst @@ -0,0 +1 @@ +PEP 591: Add ``Final`` qualifier and ``@final`` decorator to the ``typing`` module. \ No newline at end of file From webhook-mailer at python.org Sun May 26 04:37:52 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Sun, 26 May 2019 08:37:52 -0000 Subject: [Python-checkins] bpo-37046: PEP 586: Add Literal to typing module (#13572) Message-ID: https://github.com/python/cpython/commit/b891c465bb7d38a597c5c2ad547d7b19194f4dad commit: b891c465bb7d38a597c5c2ad547d7b19194f4dad branch: master author: Ivan Levkivskyi committer: GitHub date: 2019-05-26T09:37:48+01:00 summary: bpo-37046: PEP 586: Add Literal to typing module (#13572) The implementation is straightforward and essentially is just copied from `typing_extensions`. files: A Misc/NEWS.d/next/Library/2019-05-25-19-12-53.bpo-37046.iuhQQj.rst M Doc/library/typing.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 8362f1d8e6b7..e64fecb8544b 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1103,6 +1103,28 @@ The module defines the following classes, functions and decorators: ``Callable[..., Any]``, and in turn to :class:`collections.abc.Callable`. +.. data:: Literal + + A type that can be used to indicate to type checkers that the + corresponding variable or function parameter has a value equivalent to + the provided literal (or one of several literals). For example:: + + def validate_simple(data: Any) -> Literal[True]: # always returns True + ... + + MODE = Literal['r', 'rb', 'w', 'wb'] + def open_helper(file: str, mode: MODE) -> str: + ... + + open_helper('/some/path', 'r') # Passes type check + open_helper('/other/path', 'typo') # Error in type checker + + ``Literal[...]`` cannot be subclassed. At runtime, an arbitrary value + is allowed as type argument to ``Literal[...]``, but type checkers may + impose restrictions. See :pep:`586` for more details about literal types. + + .. versionadded:: 3.8 + .. data:: ClassVar Special type construct to mark class variables. diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 3d93eb396ce7..eb618936d97b 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -9,7 +9,7 @@ from typing import Any, NoReturn from typing import TypeVar, AnyStr from typing import T, KT, VT # Not in __all__. -from typing import Union, Optional +from typing import Union, Optional, Literal from typing import Tuple, List, MutableMapping from typing import Callable from typing import Generic, ClassVar, Final, final @@ -489,6 +489,68 @@ def test_ellipsis_in_generic(self): typing.List[Callable[..., str]] +class LiteralTests(BaseTestCase): + def test_basics(self): + # All of these are allowed. + Literal[1] + Literal[1, 2, 3] + Literal["x", "y", "z"] + Literal[None] + Literal[True] + Literal[1, "2", False] + Literal[Literal[1, 2], Literal[4, 5]] + Literal[b"foo", u"bar"] + + def test_illegal_parameters_do_not_raise_runtime_errors(self): + # Type checkers should reject these types, but we do not + # raise errors at runtime to maintain maximium flexibility. + Literal[int] + Literal[3j + 2, ..., ()] + Literal[{"foo": 3, "bar": 4}] + Literal[T] + + def test_literals_inside_other_types(self): + List[Literal[1, 2, 3]] + List[Literal[("foo", "bar", "baz")]] + + def test_repr(self): + self.assertEqual(repr(Literal[1]), "typing.Literal[1]") + self.assertEqual(repr(Literal[1, True, "foo"]), "typing.Literal[1, True, 'foo']") + self.assertEqual(repr(Literal[int]), "typing.Literal[int]") + self.assertEqual(repr(Literal), "typing.Literal") + self.assertEqual(repr(Literal[None]), "typing.Literal[None]") + + def test_cannot_init(self): + with self.assertRaises(TypeError): + Literal() + with self.assertRaises(TypeError): + Literal[1]() + with self.assertRaises(TypeError): + type(Literal)() + with self.assertRaises(TypeError): + type(Literal[1])() + + def test_no_isinstance_or_issubclass(self): + with self.assertRaises(TypeError): + isinstance(1, Literal[1]) + with self.assertRaises(TypeError): + isinstance(int, Literal[1]) + with self.assertRaises(TypeError): + issubclass(1, Literal[1]) + with self.assertRaises(TypeError): + issubclass(int, Literal[1]) + + def test_no_subclassing(self): + with self.assertRaises(TypeError): + class Foo(Literal[1]): pass + with self.assertRaises(TypeError): + class Bar(Literal): pass + + def test_no_multiple_subscripts(self): + with self.assertRaises(TypeError): + Literal[1][1] + + XK = TypeVar('XK', str, bytes) XV = TypeVar('XV') diff --git a/Lib/typing.py b/Lib/typing.py index 06a7eb0dff84..1044cc409f41 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -37,6 +37,7 @@ 'ClassVar', 'Final', 'Generic', + 'Literal', 'Optional', 'Tuple', 'Type', @@ -355,6 +356,10 @@ def __getitem__(self, parameters): if self._name == 'Optional': arg = _type_check(parameters, "Optional[t] requires a single type.") return Union[arg, type(None)] + if self._name == 'Literal': + # There is no '_type_check' call because arguments to Literal[...] are + # values, not types. + return _GenericAlias(self, parameters) raise TypeError(f"{self} is not subscriptable") @@ -451,6 +456,28 @@ class FastConnector(Connection): Optional[X] is equivalent to Union[X, None]. """) +Literal = _SpecialForm('Literal', doc= + """Special typing form to define literal types (a.k.a. value types). + + This form can be used to indicate to type checkers that the corresponding + variable or function parameter has a value equivalent to the provided + literal (or one of several literals): + + def validate_simple(data: Any) -> Literal[True]: # always returns True + ... + + MODE = Literal['r', 'rb', 'w', 'wb'] + def open_helper(file: str, mode: MODE) -> str: + ... + + open_helper('/some/path', 'r') # Passes type check + open_helper('/other/path', 'typo') # Error in type checker + + Literal[...] cannot be subclassed. At runtime, an arbitrary value + is allowed as type argument to Literal[...], but type checkers may + impose restrictions. + """) + class ForwardRef(_Final, _root=True): """Internal wrapper to hold a forward reference.""" diff --git a/Misc/NEWS.d/next/Library/2019-05-25-19-12-53.bpo-37046.iuhQQj.rst b/Misc/NEWS.d/next/Library/2019-05-25-19-12-53.bpo-37046.iuhQQj.rst new file mode 100644 index 000000000000..9ec333b2d980 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-25-19-12-53.bpo-37046.iuhQQj.rst @@ -0,0 +1 @@ +PEP 586: Add ``Literal`` to the ``typing`` module. \ No newline at end of file From webhook-mailer at python.org Sun May 26 04:39:29 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Sun, 26 May 2019 08:39:29 -0000 Subject: [Python-checkins] bpo-37049: PEP 589: Add TypedDict to typing module (GH-13573) Message-ID: https://github.com/python/cpython/commit/135c6a56e55d2f4f8718b3b9f03ce3c692b15f0f commit: 135c6a56e55d2f4f8718b3b9f03ce3c692b15f0f branch: master author: Ivan Levkivskyi committer: GitHub date: 2019-05-26T09:39:24+01:00 summary: bpo-37049: PEP 589: Add TypedDict to typing module (GH-13573) The implementation is straightforward and essentially is just copied from `typing_extensions`. files: A Misc/NEWS.d/next/Library/2019-05-25-19-48-42.bpo-37049.an2LXJ.rst M Doc/library/typing.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index e64fecb8544b..27787fc2cb86 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -878,6 +878,39 @@ The module defines the following classes, functions and decorators: The ``_field_types`` and ``__annotations__`` attributes are now regular dictionaries instead of instances of ``OrderedDict``. +.. class:: TypedDict(dict) + + A simple typed namespace. At runtime it is equivalent to + a plain :class:`dict`. + + ``TypedDict`` creates a dictionary type that expects all of its + instances to have a certain set of keys, where each key is + associated with a value of a consistent type. This expectation + is not checked at runtime but is only enforced by type checkers. + Usage:: + + class Point2D(TypedDict): + x: int + y: int + label: str + + a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK + b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check + + assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + + The type info for introspection can be accessed via ``Point2D.__annotations__`` + and ``Point2D.__total__``. To allow using this feature with older versions + of Python that do not support :pep:`526`, ``TypedDict`` supports two additional + equivalent syntactic forms:: + + Point2D = TypedDict('Point2D', x=int, y=int, label=str) + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + + See :pep:`589` for more examples and detailed rules of using ``TypedDict`` + with type checkers. + + .. versionadded:: 3.8 .. function:: NewType(typ) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index eb618936d97b..088db9c01206 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -18,7 +18,7 @@ from typing import no_type_check, no_type_check_decorator from typing import Type from typing import NewType -from typing import NamedTuple +from typing import NamedTuple, TypedDict from typing import IO, TextIO, BinaryIO from typing import Pattern, Match import abc @@ -1883,6 +1883,18 @@ def __str__(self): def __add__(self, other): return 0 +Label = TypedDict('Label', [('label', str)]) + +class Point2D(TypedDict): + x: int + y: int + +class LabelPoint2D(Point2D, Label): ... + +class Options(TypedDict, total=False): + log_level: int + log_path: str + class HasForeignBaseClass(mod_generics_cache.A): some_xrepr: 'XRepr' other_a: 'mod_generics_cache.A' @@ -2658,6 +2670,97 @@ def test_pickle(self): self.assertEqual(jane2, jane) +class TypedDictTests(BaseTestCase): + def test_basics_functional_syntax(self): + Emp = TypedDict('Emp', {'name': str, 'id': int}) + self.assertIsSubclass(Emp, dict) + self.assertIsSubclass(Emp, typing.MutableMapping) + self.assertNotIsSubclass(Emp, collections.abc.Sequence) + jim = Emp(name='Jim', id=1) + self.assertIs(type(jim), dict) + self.assertEqual(jim['name'], 'Jim') + self.assertEqual(jim['id'], 1) + self.assertEqual(Emp.__name__, 'Emp') + self.assertEqual(Emp.__module__, __name__) + self.assertEqual(Emp.__bases__, (dict,)) + self.assertEqual(Emp.__annotations__, {'name': str, 'id': int}) + self.assertEqual(Emp.__total__, True) + + def test_basics_keywords_syntax(self): + Emp = TypedDict('Emp', name=str, id=int) + self.assertIsSubclass(Emp, dict) + self.assertIsSubclass(Emp, typing.MutableMapping) + self.assertNotIsSubclass(Emp, collections.abc.Sequence) + jim = Emp(name='Jim', id=1) + self.assertIs(type(jim), dict) + self.assertEqual(jim['name'], 'Jim') + self.assertEqual(jim['id'], 1) + self.assertEqual(Emp.__name__, 'Emp') + self.assertEqual(Emp.__module__, __name__) + self.assertEqual(Emp.__bases__, (dict,)) + self.assertEqual(Emp.__annotations__, {'name': str, 'id': int}) + self.assertEqual(Emp.__total__, True) + + def test_typeddict_errors(self): + Emp = TypedDict('Emp', {'name': str, 'id': int}) + self.assertEqual(TypedDict.__module__, 'typing') + jim = Emp(name='Jim', id=1) + with self.assertRaises(TypeError): + isinstance({}, Emp) + with self.assertRaises(TypeError): + isinstance(jim, Emp) + with self.assertRaises(TypeError): + issubclass(dict, Emp) + with self.assertRaises(TypeError): + TypedDict('Hi', x=1) + with self.assertRaises(TypeError): + TypedDict('Hi', [('x', int), ('y', 1)]) + with self.assertRaises(TypeError): + TypedDict('Hi', [('x', int)], y=int) + + def test_py36_class_syntax_usage(self): + self.assertEqual(LabelPoint2D.__name__, 'LabelPoint2D') + self.assertEqual(LabelPoint2D.__module__, __name__) + self.assertEqual(LabelPoint2D.__annotations__, {'x': int, 'y': int, 'label': str}) + self.assertEqual(LabelPoint2D.__bases__, (dict,)) + self.assertEqual(LabelPoint2D.__total__, True) + self.assertNotIsSubclass(LabelPoint2D, typing.Sequence) + not_origin = Point2D(x=0, y=1) + self.assertEqual(not_origin['x'], 0) + self.assertEqual(not_origin['y'], 1) + other = LabelPoint2D(x=0, y=1, label='hi') + self.assertEqual(other['label'], 'hi') + + def test_pickle(self): + global EmpD # pickle wants to reference the class by name + EmpD = TypedDict('EmpD', name=str, id=int) + jane = EmpD({'name': 'jane', 'id': 37}) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + z = pickle.dumps(jane, proto) + jane2 = pickle.loads(z) + self.assertEqual(jane2, jane) + self.assertEqual(jane2, {'name': 'jane', 'id': 37}) + ZZ = pickle.dumps(EmpD, proto) + EmpDnew = pickle.loads(ZZ) + self.assertEqual(EmpDnew({'name': 'jane', 'id': 37}), jane) + + def test_optional(self): + EmpD = TypedDict('EmpD', name=str, id=int) + + self.assertEqual(typing.Optional[EmpD], typing.Union[None, EmpD]) + self.assertNotEqual(typing.List[EmpD], typing.Tuple[EmpD]) + + def test_total(self): + D = TypedDict('D', {'x': int}, total=False) + self.assertEqual(D(), {}) + self.assertEqual(D(x=1), {'x': 1}) + self.assertEqual(D.__total__, False) + + self.assertEqual(Options(), {}) + self.assertEqual(Options(log_level=2), {'log_level': 2}) + self.assertEqual(Options.__total__, False) + + class IOTests(BaseTestCase): def test_io(self): diff --git a/Lib/typing.py b/Lib/typing.py index 1044cc409f41..d3e84cd64abe 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -89,6 +89,7 @@ 'Set', 'FrozenSet', 'NamedTuple', # Not really a type. + 'TypedDict', # Not really a type. 'Generator', # One-off things. @@ -1490,6 +1491,89 @@ def __new__(self, typename, fields=None, **kwargs): return _make_nmtuple(typename, fields) +def _dict_new(cls, *args, **kwargs): + return dict(*args, **kwargs) + + +def _typeddict_new(cls, _typename, _fields=None, **kwargs): + total = kwargs.pop('total', True) + if _fields is None: + _fields = kwargs + elif kwargs: + raise TypeError("TypedDict takes either a dict or keyword arguments," + " but not both") + + ns = {'__annotations__': dict(_fields), '__total__': total} + try: + # Setting correct module is necessary to make typed dict classes pickleable. + ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + + return _TypedDictMeta(_typename, (), ns) + + +def _check_fails(cls, other): + # Typed dicts are only for static structural subtyping. + raise TypeError('TypedDict does not support instance and class checks') + + +class _TypedDictMeta(type): + def __new__(cls, name, bases, ns, total=True): + """Create new typed dict class object. + + This method is called directly when TypedDict is subclassed, + or via _typeddict_new when TypedDict is instantiated. This way + TypedDict supports all three syntax forms described in its docstring. + Subclasses and instances of TypedDict return actual dictionaries + via _dict_new. + """ + ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new + tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns) + + anns = ns.get('__annotations__', {}) + msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" + anns = {n: _type_check(tp, msg) for n, tp in anns.items()} + for base in bases: + anns.update(base.__dict__.get('__annotations__', {})) + tp_dict.__annotations__ = anns + if not hasattr(tp_dict, '__total__'): + tp_dict.__total__ = total + return tp_dict + + __instancecheck__ = __subclasscheck__ = _check_fails + + +class TypedDict(dict, metaclass=_TypedDictMeta): + """A simple typed namespace. At runtime it is equivalent to a plain dict. + + TypedDict creates a dictionary type that expects all of its + instances to have a certain set of keys, where each key is + associated with a value of a consistent type. This expectation + is not checked at runtime but is only enforced by type checkers. + Usage:: + + class Point2D(TypedDict): + x: int + y: int + label: str + + a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK + b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check + + assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + + The type info can be accessed via Point2D.__annotations__. TypedDict + supports two additional equivalent forms:: + + Point2D = TypedDict('Point2D', x=int, y=int, label=str) + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + + The class syntax is only supported in Python 3.6+, while two other + syntax forms work for Python 2.7 and 3.2+ + """ + + def NewType(name, tp): """NewType creates simple unique types with almost zero runtime overhead. NewType(name, tp) is considered a subtype of tp diff --git a/Misc/NEWS.d/next/Library/2019-05-25-19-48-42.bpo-37049.an2LXJ.rst b/Misc/NEWS.d/next/Library/2019-05-25-19-48-42.bpo-37049.an2LXJ.rst new file mode 100644 index 000000000000..e0ce4a708d9e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-25-19-48-42.bpo-37049.an2LXJ.rst @@ -0,0 +1 @@ +PEP 589: Add ``TypedDict`` to the ``typing`` module. \ No newline at end of file From webhook-mailer at python.org Sun May 26 10:25:53 2019 From: webhook-mailer at python.org (Mark Shannon) Date: Sun, 26 May 2019 14:25:53 -0000 Subject: [Python-checkins] bpo-28866: No type cache for types with specialized mro, invalidation is hard. (#13157) Message-ID: https://github.com/python/cpython/commit/180dc1b0f4a57c3f66351568ae8488fa8576d7f0 commit: 180dc1b0f4a57c3f66351568ae8488fa8576d7f0 branch: master author: Julien Palard committer: Mark Shannon date: 2019-05-26T15:25:47+01:00 summary: bpo-28866: No type cache for types with specialized mro, invalidation is hard. (#13157) * No type cache for types with specialized mro, invalidation is hard. * FIX: Don't disable method cache custom types that do not implement mro(). * fixing implem. * Avoid storing error flags, also decref. * news entry * Clear as soon as we're getting an error. * FIX: Reference leak. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst M Objects/typeobject.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst new file mode 100644 index 000000000000..69017293649c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst @@ -0,0 +1,2 @@ +Avoid caching attributes of classes which type defines mro() to avoid a hard +cache invalidation problem. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 339f7285292c..fc809d36e10b 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -78,6 +78,9 @@ slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void clear_slotdefs(void); +static PyObject * +lookup_maybe_method(PyObject *self, _Py_Identifier *attrid, int *unbound); + /* * finds the beginning of the docstring's introspection signature. * if present, returns a pointer pointing to the first '('. @@ -287,17 +290,35 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { Unset HAVE_VERSION_TAG and VALID_VERSION_TAG if the type has a custom MRO that includes a type which is not officially - super type. + super type, or if the type implements its own mro() method. Called from mro_internal, which will subsequently be called on each subclass when their mro is recursively updated. */ Py_ssize_t i, n; - int clear = 0; + int custom = (Py_TYPE(type) != &PyType_Type); + int unbound; + PyObject *mro_meth = NULL; + PyObject *type_mro_meth = NULL; if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) return; + if (custom) { + _Py_IDENTIFIER(mro); + mro_meth = lookup_maybe_method( + (PyObject *)type, &PyId_mro, &unbound); + if (mro_meth == NULL) + goto clear; + type_mro_meth = lookup_maybe_method( + (PyObject *)&PyType_Type, &PyId_mro, &unbound); + if (type_mro_meth == NULL) + goto clear; + if (mro_meth != type_mro_meth) + goto clear; + Py_XDECREF(mro_meth); + Py_XDECREF(type_mro_meth); + } n = PyTuple_GET_SIZE(bases); for (i = 0; i < n; i++) { PyObject *b = PyTuple_GET_ITEM(bases, i); @@ -308,14 +329,15 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { if (!PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) || !PyType_IsSubtype(type, cls)) { - clear = 1; - break; + goto clear; } } - - if (clear) - type->tp_flags &= ~(Py_TPFLAGS_HAVE_VERSION_TAG| - Py_TPFLAGS_VALID_VERSION_TAG); + return; + clear: + Py_XDECREF(mro_meth); + Py_XDECREF(type_mro_meth); + type->tp_flags &= ~(Py_TPFLAGS_HAVE_VERSION_TAG| + Py_TPFLAGS_VALID_VERSION_TAG); } static int From webhook-mailer at python.org Sun May 26 10:28:14 2019 From: webhook-mailer at python.org (Mark Shannon) Date: Sun, 26 May 2019 14:28:14 -0000 Subject: [Python-checkins] BPO-27639: Correct return type for UserList slicing operation (#13203) Message-ID: https://github.com/python/cpython/commit/f3d909428c7c61ea32e8fbb9c8b48344e7904a53 commit: f3d909428c7c61ea32e8fbb9c8b48344e7904a53 branch: 3.7 author: Michael Blahay committer: Mark Shannon date: 2019-05-26T15:28:09+01:00 summary: BPO-27639: Correct return type for UserList slicing operation (#13203) Added logic to __getitem__ magic method for UserList to ensure that the return type matches that of self. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst M Lib/collections/__init__.py M Lib/test/test_userlist.py diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index b4592f983921..64bbee8faba8 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1091,7 +1091,11 @@ def __cast(self, other): return other.data if isinstance(other, UserList) else other def __contains__(self, item): return item in self.data def __len__(self): return len(self.data) - def __getitem__(self, i): return self.data[i] + def __getitem__(self, i): + if isinstance(i, slice): + return self.__class__(self.data[i]) + else: + return self.data[i] def __setitem__(self, i, item): self.data[i] = item def __delitem__(self, i): del self.data[i] def __add__(self, other): diff --git a/Lib/test/test_userlist.py b/Lib/test/test_userlist.py index 8de6c14e392f..1ed67dac8059 100644 --- a/Lib/test/test_userlist.py +++ b/Lib/test/test_userlist.py @@ -17,6 +17,12 @@ def test_getslice(self): for j in range(-3, 6): self.assertEqual(u[i:j], l[i:j]) + def test_slice_type(self): + l = [0, 1, 2, 3, 4] + u = UserList(l) + self.assertIsInstance(u[:], u.__class__) + self.assertEqual(u[:],u) + def test_add_specials(self): u = UserList("spam") u2 = u + "eggs" diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst new file mode 100644 index 000000000000..ae5b915969d3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst @@ -0,0 +1,2 @@ +Correct return type for UserList slicing operations. Patch by Michael Blahay, +Erick Cervantes, and vaultah From webhook-mailer at python.org Sun May 26 10:30:56 2019 From: webhook-mailer at python.org (Jason R. Coombs) Date: Sun, 26 May 2019 14:30:56 -0000 Subject: [Python-checkins] Fix highlighting in importlib.metadata docs (GH-13575) Message-ID: https://github.com/python/cpython/commit/22ccb0b4902137275960c008ef77b88fa82729ce commit: 22ccb0b4902137275960c008ef77b88fa82729ce branch: master author: Anthony Sottile committer: Jason R. Coombs date: 2019-05-26T10:30:52-04:00 summary: Fix highlighting in importlib.metadata docs (GH-13575) files: M Doc/library/importlib.metadata.rst M Doc/tools/susp-ignored.csv diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index 3d10b5aeabfd..2126498e728c 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -32,17 +32,17 @@ Overview Let's say you wanted to get the version string for a package you've installed using ``pip``. We start by creating a virtual environment and installing -something into it:: +something into it: -.. highlight:: none +.. code-block:: shell-session $ python3 -m venv example $ source example/bin/activate (example) $ pip install wheel -You can get the version string for ``wheel`` by running the following:: +You can get the version string for ``wheel`` by running the following: -.. highlight:: none +.. code-block:: pycon (example) $ python >>> from importlib.metadata import version # doctest: +SKIP diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 85ff9d02aeb2..a34524bb673e 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -350,6 +350,5 @@ whatsnew/3.7,,::,error::BytesWarning whatsnew/changelog,,::,error::BytesWarning whatsnew/changelog,,::,default::BytesWarning whatsnew/changelog,,::,default::DeprecationWarning -library/importlib.metadata,,.. highlight:,.. highlight:: none library/importlib.metadata,,:main,"EntryPoint(name='wheel', value='wheel.cli:main', group='console_scripts')" library/importlib.metadata,,`,of directories ``path`` (defaults to sys.path). From webhook-mailer at python.org Sun May 26 11:10:15 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Sun, 26 May 2019 15:10:15 -0000 Subject: [Python-checkins] bpo-36785: PEP 574 implementation (GH-7076) Message-ID: https://github.com/python/cpython/commit/91f4380cedbae32b49adbea2518014a5624c6523 commit: 91f4380cedbae32b49adbea2518014a5624c6523 branch: master author: Antoine Pitrou committer: GitHub date: 2019-05-26T17:10:09+02:00 summary: bpo-36785: PEP 574 implementation (GH-7076) files: A Include/picklebufobject.h A Lib/test/test_picklebuffer.py A Misc/NEWS.d/next/Library/2019-05-03-20-47-55.bpo-36785.PQLnPq.rst A Objects/picklebufobject.c M Doc/library/pickle.rst M Include/Python.h M Lib/pickle.py M Lib/pickletools.py M Lib/test/pickletester.py M Lib/test/test_inspect.py M Lib/test/test_pickle.py M Lib/test/test_pickletools.py M Lib/test/test_pyclbr.py M Makefile.pre.in M Modules/_pickle.c M Modules/clinic/_pickle.c.h M Objects/object.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index f4c41ac68d2f..6aa30492c706 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -195,34 +195,29 @@ The :mod:`pickle` module provides the following constants: The :mod:`pickle` module provides the following functions to make the pickling process more convenient: -.. function:: dump(obj, file, protocol=None, \*, fix_imports=True) +.. function:: dump(obj, file, protocol=None, \*, fix_imports=True, buffer_callback=None) Write a pickled representation of *obj* to the open :term:`file object` *file*. This is equivalent to ``Pickler(file, protocol).dump(obj)``. - The optional *protocol* argument, an integer, tells the pickler to use - the given protocol; supported protocols are 0 to :data:`HIGHEST_PROTOCOL`. - If not specified, the default is :data:`DEFAULT_PROTOCOL`. If a negative - number is specified, :data:`HIGHEST_PROTOCOL` is selected. + Arguments *file*, *protocol*, *fix_imports* and *buffer_callback* have + the same meaning as in the :class:`Pickler` constructor. - The *file* argument must have a write() method that accepts a single bytes - argument. It can thus be an on-disk file opened for binary writing, an - :class:`io.BytesIO` instance, or any other custom object that meets this - interface. - - If *fix_imports* is true and *protocol* is less than 3, pickle will try to - map the new Python 3 names to the old module names used in Python 2, so - that the pickle data stream is readable with Python 2. + .. versionchanged:: 3.8 + The *buffer_callback* argument was added. -.. function:: dumps(obj, protocol=None, \*, fix_imports=True) +.. function:: dumps(obj, protocol=None, \*, fix_imports=True, buffer_callback=None) Return the pickled representation of the object as a :class:`bytes` object, instead of writing it to a file. - Arguments *protocol* and *fix_imports* have the same meaning as in - :func:`dump`. + Arguments *protocol*, *fix_imports* and *buffer_callback* have the same + meaning as in the :class:`Pickler` constructor. + + .. versionchanged:: 3.8 + The *buffer_callback* argument was added. -.. function:: load(file, \*, fix_imports=True, encoding="ASCII", errors="strict") +.. function:: load(file, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) Read a pickled object representation from the open :term:`file object` *file* and return the reconstituted object hierarchy specified therein. @@ -232,24 +227,13 @@ process more convenient: protocol argument is needed. Bytes past the pickled object's representation are ignored. - The argument *file* must have two methods, a read() method that takes an - integer argument, and a readline() method that requires no arguments. Both - methods should return bytes. Thus *file* can be an on-disk file opened for - binary reading, an :class:`io.BytesIO` object, or any other custom object - that meets this interface. - - Optional keyword arguments are *fix_imports*, *encoding* and *errors*, - which are used to control compatibility support for pickle stream generated - by Python 2. If *fix_imports* is true, pickle will try to map the old - Python 2 names to the new names used in Python 3. The *encoding* and - *errors* tell pickle how to decode 8-bit string instances pickled by Python - 2; these default to 'ASCII' and 'strict', respectively. The *encoding* can - be 'bytes' to read these 8-bit string instances as bytes objects. - Using ``encoding='latin1'`` is required for unpickling NumPy arrays and - instances of :class:`~datetime.datetime`, :class:`~datetime.date` and - :class:`~datetime.time` pickled by Python 2. + Arguments *file*, *fix_imports*, *encoding*, *errors*, *strict* and *buffers* + have the same meaning as in the :class:`Unpickler` constructor. -.. function:: loads(bytes_object, \*, fix_imports=True, encoding="ASCII", errors="strict") + .. versionchanged:: 3.8 + The *buffers* argument was added. + +.. function:: loads(bytes_object, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) Read a pickled object hierarchy from a :class:`bytes` object and return the reconstituted object hierarchy specified therein. @@ -258,16 +242,11 @@ process more convenient: protocol argument is needed. Bytes past the pickled object's representation are ignored. - Optional keyword arguments are *fix_imports*, *encoding* and *errors*, - which are used to control compatibility support for pickle stream generated - by Python 2. If *fix_imports* is true, pickle will try to map the old - Python 2 names to the new names used in Python 3. The *encoding* and - *errors* tell pickle how to decode 8-bit string instances pickled by Python - 2; these default to 'ASCII' and 'strict', respectively. The *encoding* can - be 'bytes' to read these 8-bit string instances as bytes objects. - Using ``encoding='latin1'`` is required for unpickling NumPy arrays and - instances of :class:`~datetime.datetime`, :class:`~datetime.date` and - :class:`~datetime.time` pickled by Python 2. + Arguments *file*, *fix_imports*, *encoding*, *errors*, *strict* and *buffers* + have the same meaning as in the :class:`Unpickler` constructor. + + .. versionchanged:: 3.8 + The *buffers* argument was added. The :mod:`pickle` module defines three exceptions: @@ -295,10 +274,10 @@ The :mod:`pickle` module defines three exceptions: IndexError. -The :mod:`pickle` module exports two classes, :class:`Pickler` and -:class:`Unpickler`: +The :mod:`pickle` module exports three classes, :class:`Pickler`, +:class:`Unpickler` and :class:`PickleBuffer`: -.. class:: Pickler(file, protocol=None, \*, fix_imports=True) +.. class:: Pickler(file, protocol=None, \*, fix_imports=True, buffer_callback=None) This takes a binary file for writing a pickle data stream. @@ -316,6 +295,20 @@ The :mod:`pickle` module exports two classes, :class:`Pickler` and map the new Python 3 names to the old module names used in Python 2, so that the pickle data stream is readable with Python 2. + If *buffer_callback* is None (the default), buffer views are + serialized into *file* as part of the pickle stream. + + If *buffer_callback* is not None, then it can be called any number + of times with a buffer view. If the callback returns a false value + (such as None), the given buffer is :ref:`out-of-band `; + otherwise the buffer is serialized in-band, i.e. inside the pickle stream. + + It is an error if *buffer_callback* is not None and *protocol* is + None or smaller than 5. + + .. versionchanged:: 3.8 + The *buffer_callback* argument was added. + .. method:: dump(obj) Write a pickled representation of *obj* to the open file object given in @@ -379,26 +372,43 @@ The :mod:`pickle` module exports two classes, :class:`Pickler` and Use :func:`pickletools.optimize` if you need more compact pickles. -.. class:: Unpickler(file, \*, fix_imports=True, encoding="ASCII", errors="strict") +.. class:: Unpickler(file, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) This takes a binary file for reading a pickle data stream. The protocol version of the pickle is detected automatically, so no protocol argument is needed. - The argument *file* must have two methods, a read() method that takes an - integer argument, and a readline() method that requires no arguments. Both - methods should return bytes. Thus *file* can be an on-disk file object + The argument *file* must have three methods, a read() method that takes an + integer argument, a readinto() method that takes a buffer argument + and a readline() method that requires no arguments, as in the + :class:`io.BufferedIOBase` interface. Thus *file* can be an on-disk file opened for binary reading, an :class:`io.BytesIO` object, or any other custom object that meets this interface. - Optional keyword arguments are *fix_imports*, *encoding* and *errors*, - which are used to control compatibility support for pickle stream generated - by Python 2. If *fix_imports* is true, pickle will try to map the old - Python 2 names to the new names used in Python 3. The *encoding* and - *errors* tell pickle how to decode 8-bit string instances pickled by Python - 2; these default to 'ASCII' and 'strict', respectively. The *encoding* can + The optional arguments *fix_imports*, *encoding* and *errors* are used + to control compatibility support for pickle stream generated by Python 2. + If *fix_imports* is true, pickle will try to map the old Python 2 names + to the new names used in Python 3. The *encoding* and *errors* tell + pickle how to decode 8-bit string instances pickled by Python 2; + these default to 'ASCII' and 'strict', respectively. The *encoding* can be 'bytes' to read these 8-bit string instances as bytes objects. + Using ``encoding='latin1'`` is required for unpickling NumPy arrays and + instances of :class:`~datetime.datetime`, :class:`~datetime.date` and + :class:`~datetime.time` pickled by Python 2. + + If *buffers* is None (the default), then all data necessary for + deserialization must be contained in the pickle stream. This means + that the *buffer_callback* argument was None when a :class:`Pickler` + was instantiated (or when :func:`dump` or :func:`dumps` was called). + + If *buffers* is not None, it should be an iterable of buffer-enabled + objects that is consumed each time the pickle stream references + an :ref:`out-of-band ` buffer view. Such buffers have been + given in order to the *buffer_callback* of a Pickler object. + + .. versionchanged:: 3.8 + The *buffers* argument was added. .. method:: load() @@ -429,6 +439,34 @@ The :mod:`pickle` module exports two classes, :class:`Pickler` and .. audit-event:: pickle.find_class "module name" +.. class:: PickleBuffer(buffer) + + A wrapper for a buffer representing picklable data. *buffer* must be a + :ref:`buffer-providing ` object, such as a + :term:`bytes-like object` or a N-dimensional array. + + :class:`PickleBuffer` is itself a buffer provider, therefore it is + possible to pass it to other APIs expecting a buffer-providing object, + such as :class:`memoryview`. + + :class:`PickleBuffer` objects can only be serialized using pickle + protocol 5 or higher. They are eligible for + :ref:`out-of-band serialization `. + + .. versionadded:: 3.8 + + .. method:: raw() + + Return a :class:`memoryview` of the memory area underlying this buffer. + The returned object is a one-dimensional, C-contiguous memoryview + with format ``B`` (unsigned bytes). :exc:`BufferError` is raised if + the buffer is neither C- nor Fortran-contiguous. + + .. method:: release() + + Release the underlying buffer exposed by the PickleBuffer object. + + .. _pickle-picklable: What can be pickled and unpickled? @@ -864,6 +902,125 @@ a given class:: assert unpickled_class.my_attribute == 1 +.. _pickle-oob: + +Out-of-band Buffers +------------------- + +.. versionadded:: 3.8 + +In some contexts, the :mod:`pickle` module is used to transfer massive amounts +of data. Therefore, it can be important to minimize the number of memory +copies, to preserve performance and resource consumption. However, normal +operation of the :mod:`pickle` module, as it transforms a graph-like structure +of objects into a sequential stream of bytes, intrinsically involves copying +data to and from the pickle stream. + +This constraint can be eschewed if both the *provider* (the implementation +of the object types to be transferred) and the *consumer* (the implementation +of the communications system) support the out-of-band transfer facilities +provided by pickle protocol 5 and higher. + +Provider API +^^^^^^^^^^^^ + +The large data objects to be pickled must implement a :meth:`__reduce_ex__` +method specialized for protocol 5 and higher, which returns a +:class:`PickleBuffer` instance (instead of e.g. a :class:`bytes` object) +for any large data. + +A :class:`PickleBuffer` object *signals* that the underlying buffer is +eligible for out-of-band data transfer. Those objects remain compatible +with normal usage of the :mod:`pickle` module. However, consumers can also +opt-in to tell :mod:`pickle` that they will handle those buffers by +themselves. + +Consumer API +^^^^^^^^^^^^ + +A communications system can enable custom handling of the :class:`PickleBuffer` +objects generated when serializing an object graph. + +On the sending side, it needs to pass a *buffer_callback* argument to +:class:`Pickler` (or to the :func:`dump` or :func:`dumps` function), which +will be called with each :class:`PickleBuffer` generated while pickling +the object graph. Buffers accumulated by the *buffer_callback* will not +see their data copied into the pickle stream, only a cheap marker will be +inserted. + +On the receiving side, it needs to pass a *buffers* argument to +:class:`Unpickler` (or to the :func:`load` or :func:`loads` function), +which is an iterable of the buffers which were passed to *buffer_callback*. +That iterable should produce buffers in the same order as they were passed +to *buffer_callback*. Those buffers will provide the data expected by the +reconstructors of the objects whose pickling produced the original +:class:`PickleBuffer` objects. + +Between the sending side and the receiving side, the communications system +is free to implement its own transfer mechanism for out-of-band buffers. +Potential optimizations include the use of shared memory or datatype-dependent +compression. + +Example +^^^^^^^ + +Here is a trivial example where we implement a :class:`bytearray` subclass +able to participate in out-of-band buffer pickling:: + + class ZeroCopyByteArray(bytearray): + + def __reduce_ex__(self, protocol): + if protocol >= 5: + return type(self)._reconstruct, (PickleBuffer(self),), None + else: + # PickleBuffer is forbidden with pickle protocols <= 4. + return type(self)._reconstruct, (bytearray(self),) + + @classmethod + def _reconstruct(cls, obj): + with memoryview(obj) as m: + # Get a handle over the original buffer object + obj = m.obj + if type(obj) is cls: + # Original buffer object is a ZeroCopyByteArray, return it + # as-is. + return obj + else: + return cls(obj) + +The reconstructor (the ``_reconstruct`` class method) returns the buffer's +providing object if it has the right type. This is an easy way to simulate +zero-copy behaviour on this toy example. + +On the consumer side, we can pickle those objects the usual way, which +when unserialized will give us a copy of the original object:: + + b = ZeroCopyByteArray(b"abc") + data = pickle.dumps(b, protocol=5) + new_b = pickle.loads(data) + print(b == new_b) # True + print(b is new_b) # False: a copy was made + +But if we pass a *buffer_callback* and then give back the accumulated +buffers when unserializing, we are able to get back the original object:: + + b = ZeroCopyByteArray(b"abc") + buffers = [] + data = pickle.dumps(b, protocol=5, buffer_callback=buffers.append) + new_b = pickle.loads(data, buffers=buffers) + print(b == new_b) # True + print(b is new_b) # True: no copy was made + +This example is limited by the fact that :class:`bytearray` allocates its +own memory: you cannot create a :class:`bytearray` instance that is backed +by another object's memory. However, third-party datatypes such as NumPy +arrays do not have this limitation, and allow use of zero-copy pickling +(or making as few copies as possible) when transferring between distinct +processes or systems. + +.. seealso:: :pep:`574` -- Pickle protocol 5 with out-of-band data + + .. _pickle-restrict: Restricting Globals diff --git a/Include/Python.h b/Include/Python.h index 55b06aeea984..17ad5b3071d4 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -124,6 +124,7 @@ #include "weakrefobject.h" #include "structseq.h" #include "namespaceobject.h" +#include "picklebufobject.h" #include "codecs.h" #include "pyerrors.h" diff --git a/Include/picklebufobject.h b/Include/picklebufobject.h new file mode 100644 index 000000000000..f07e900bf26d --- /dev/null +++ b/Include/picklebufobject.h @@ -0,0 +1,31 @@ +/* PickleBuffer object. This is built-in for ease of use from third-party + * C extensions. + */ + +#ifndef Py_PICKLEBUFOBJECT_H +#define Py_PICKLEBUFOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API + +PyAPI_DATA(PyTypeObject) PyPickleBuffer_Type; + +#define PyPickleBuffer_Check(op) (Py_TYPE(op) == &PyPickleBuffer_Type) + +/* Create a PickleBuffer redirecting to the given buffer-enabled object */ +PyAPI_FUNC(PyObject *) PyPickleBuffer_FromObject(PyObject *); +/* Get the PickleBuffer's underlying view to the original object + * (NULL if released) + */ +PyAPI_FUNC(const Py_buffer *) PyPickleBuffer_GetBuffer(PyObject *); +/* Release the PickleBuffer. Returns 0 on success, -1 on error. */ +PyAPI_FUNC(int) PyPickleBuffer_Release(PyObject *); + +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PICKLEBUFOBJECT_H */ diff --git a/Lib/pickle.py b/Lib/pickle.py index be8e3811947b..cb768b28586a 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -36,8 +36,10 @@ import codecs import _compat_pickle +from _pickle import PickleBuffer + __all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler", - "Unpickler", "dump", "dumps", "load", "loads"] + "Unpickler", "dump", "dumps", "load", "loads", "PickleBuffer"] # Shortcut for use in isinstance testing bytes_types = (bytes, bytearray) @@ -51,10 +53,11 @@ "2.0", # Protocol 2 "3.0", # Protocol 3 "4.0", # Protocol 4 + "5.0", # Protocol 5 ] # Old format versions we can read # This is the highest protocol number we know how to read. -HIGHEST_PROTOCOL = 4 +HIGHEST_PROTOCOL = 5 # The protocol we write by default. May be less than HIGHEST_PROTOCOL. # Only bump this if the oldest still supported version of Python already @@ -167,6 +170,7 @@ def __init__(self, value): SHORT_BINBYTES = b'C' # " " ; " " " " < 256 bytes # Protocol 4 + SHORT_BINUNICODE = b'\x8c' # push short string; UTF-8 length < 256 bytes BINUNICODE8 = b'\x8d' # push very long string BINBYTES8 = b'\x8e' # push very long bytes string @@ -178,6 +182,12 @@ def __init__(self, value): MEMOIZE = b'\x94' # store top of the stack in memo FRAME = b'\x95' # indicate the beginning of a new frame +# Protocol 5 + +BYTEARRAY8 = b'\x96' # push bytearray +NEXT_BUFFER = b'\x97' # push next out-of-band buffer +READONLY_BUFFER = b'\x98' # make top of stack readonly + __all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$", x)]) @@ -251,6 +261,23 @@ def __init__(self, file_read, file_readline, file_tell=None): self.file_readline = file_readline self.current_frame = None + def readinto(self, buf): + if self.current_frame: + n = self.current_frame.readinto(buf) + if n == 0 and len(buf) != 0: + self.current_frame = None + n = len(buf) + buf[:] = self.file_read(n) + return n + if n < len(buf): + raise UnpicklingError( + "pickle exhausted before end of frame") + return n + else: + n = len(buf) + buf[:] = self.file_read(n) + return n + def read(self, n): if self.current_frame: data = self.current_frame.read(n) @@ -371,7 +398,8 @@ def decode_long(data): class _Pickler: - def __init__(self, file, protocol=None, *, fix_imports=True): + def __init__(self, file, protocol=None, *, fix_imports=True, + buffer_callback=None): """This takes a binary file for writing a pickle data stream. The optional *protocol* argument tells the pickler to use the @@ -393,6 +421,17 @@ def __init__(self, file, protocol=None, *, fix_imports=True): will try to map the new Python 3 names to the old module names used in Python 2, so that the pickle data stream is readable with Python 2. + + If *buffer_callback* is None (the default), buffer views are + serialized into *file* as part of the pickle stream. + + If *buffer_callback* is not None, then it can be called any number + of times with a buffer view. If the callback returns a false value + (such as None), the given buffer is out-of-band; otherwise the + buffer is serialized in-band, i.e. inside the pickle stream. + + It is an error if *buffer_callback* is not None and *protocol* + is None or smaller than 5. """ if protocol is None: protocol = DEFAULT_PROTOCOL @@ -400,6 +439,9 @@ def __init__(self, file, protocol=None, *, fix_imports=True): protocol = HIGHEST_PROTOCOL elif not 0 <= protocol <= HIGHEST_PROTOCOL: raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL) + if buffer_callback is not None and protocol < 5: + raise ValueError("buffer_callback needs protocol >= 5") + self._buffer_callback = buffer_callback try: self._file_write = file.write except AttributeError: @@ -756,6 +798,46 @@ def save_bytes(self, obj): self.memoize(obj) dispatch[bytes] = save_bytes + def save_bytearray(self, obj): + if self.proto < 5: + if not obj: # bytearray is empty + self.save_reduce(bytearray, (), obj=obj) + else: + self.save_reduce(bytearray, (bytes(obj),), obj=obj) + return + n = len(obj) + if n >= self.framer._FRAME_SIZE_TARGET: + self._write_large_bytes(BYTEARRAY8 + pack("= 5") + with obj.raw() as m: + if not m.contiguous: + raise PicklingError("PickleBuffer can not be pickled when " + "pointing to a non-contiguous buffer") + in_band = True + if self._buffer_callback is not None: + in_band = bool(self._buffer_callback(obj)) + if in_band: + # Write data in-band + # XXX The C implementation avoids a copy here + if m.readonly: + self.save_bytes(m.tobytes()) + else: + self.save_bytearray(m.tobytes()) + else: + # Write data out-of-band + self.write(NEXT_BUFFER) + if m.readonly: + self.write(READONLY_BUFFER) + + dispatch[PickleBuffer] = save_picklebuffer + def save_str(self, obj): if self.bin: encoded = obj.encode('utf-8', 'surrogatepass') @@ -1042,7 +1124,7 @@ def save_type(self, obj): class _Unpickler: def __init__(self, file, *, fix_imports=True, - encoding="ASCII", errors="strict"): + encoding="ASCII", errors="strict", buffers=None): """This takes a binary file for reading a pickle data stream. The protocol version of the pickle is detected automatically, so @@ -1061,7 +1143,17 @@ def __init__(self, file, *, fix_imports=True, reading, a BytesIO object, or any other custom object that meets this interface. - Optional keyword arguments are *fix_imports*, *encoding* and + If *buffers* is not None, it should be an iterable of buffer-enabled + objects that is consumed each time the pickle stream references + an out-of-band buffer view. Such buffers have been given in order + to the *buffer_callback* of a Pickler object. + + If *buffers* is None (the default), then the buffers are taken + from the pickle stream, assuming they are serialized there. + It is an error for *buffers* to be None if the pickle stream + was produced with a non-None *buffer_callback*. + + Other optional arguments are *fix_imports*, *encoding* and *errors*, which are used to control compatibility support for pickle stream generated by Python 2. If *fix_imports* is True, pickle will try to map the old Python 2 names to the new names @@ -1070,6 +1162,7 @@ def __init__(self, file, *, fix_imports=True, default to 'ASCII' and 'strict', respectively. *encoding* can be 'bytes' to read theses 8-bit string instances as bytes objects. """ + self._buffers = iter(buffers) if buffers is not None else None self._file_readline = file.readline self._file_read = file.read self.memo = {} @@ -1090,6 +1183,7 @@ def load(self): "%s.__init__()" % (self.__class__.__name__,)) self._unframer = _Unframer(self._file_read, self._file_readline) self.read = self._unframer.read + self.readinto = self._unframer.readinto self.readline = self._unframer.readline self.metastack = [] self.stack = [] @@ -1276,6 +1370,34 @@ def load_binbytes8(self): self.append(self.read(len)) dispatch[BINBYTES8[0]] = load_binbytes8 + def load_bytearray8(self): + len, = unpack(' maxsize: + raise UnpicklingError("BYTEARRAY8 exceeds system's maximum size " + "of %d bytes" % maxsize) + b = bytearray(len) + self.readinto(b) + self.append(b) + dispatch[BYTEARRAY8[0]] = load_bytearray8 + + def load_next_buffer(self): + if self._buffers is None: + raise UnpicklingError("pickle stream refers to out-of-band data " + "but no *buffers* argument was given") + try: + buf = next(self._buffers) + except StopIteration: + raise UnpicklingError("not enough out-of-band buffers") + self.append(buf) + dispatch[NEXT_BUFFER[0]] = load_next_buffer + + def load_readonly_buffer(self): + buf = self.stack[-1] + with memoryview(buf) as m: + if not m.readonly: + self.stack[-1] = m.toreadonly() + dispatch[READONLY_BUFFER[0]] = load_readonly_buffer + def load_short_binstring(self): len = self.read(1)[0] data = self.read(len) @@ -1600,25 +1722,29 @@ def load_stop(self): # Shorthands -def _dump(obj, file, protocol=None, *, fix_imports=True): - _Pickler(file, protocol, fix_imports=fix_imports).dump(obj) +def _dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None): + _Pickler(file, protocol, fix_imports=fix_imports, + buffer_callback=buffer_callback).dump(obj) -def _dumps(obj, protocol=None, *, fix_imports=True): +def _dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None): f = io.BytesIO() - _Pickler(f, protocol, fix_imports=fix_imports).dump(obj) + _Pickler(f, protocol, fix_imports=fix_imports, + buffer_callback=buffer_callback).dump(obj) res = f.getvalue() assert isinstance(res, bytes_types) return res -def _load(file, *, fix_imports=True, encoding="ASCII", errors="strict"): - return _Unpickler(file, fix_imports=fix_imports, +def _load(file, *, fix_imports=True, encoding="ASCII", errors="strict", + buffers=None): + return _Unpickler(file, fix_imports=fix_imports, buffers=buffers, encoding=encoding, errors=errors).load() -def _loads(s, *, fix_imports=True, encoding="ASCII", errors="strict"): +def _loads(s, *, fix_imports=True, encoding="ASCII", errors="strict", + buffers=None): if isinstance(s, str): raise TypeError("Can't load pickle from unicode string") file = io.BytesIO(s) - return _Unpickler(file, fix_imports=fix_imports, + return _Unpickler(file, fix_imports=fix_imports, buffers=buffers, encoding=encoding, errors=errors).load() # Use the faster _pickle if possible diff --git a/Lib/pickletools.py b/Lib/pickletools.py index ed8bee36e8c5..95706e746c98 100644 --- a/Lib/pickletools.py +++ b/Lib/pickletools.py @@ -565,6 +565,41 @@ def read_bytes8(f): the number of bytes, and the second argument is that many bytes. """) + +def read_bytearray8(f): + r""" + >>> import io, struct, sys + >>> read_bytearray8(io.BytesIO(b"\x00\x00\x00\x00\x00\x00\x00\x00abc")) + bytearray(b'') + >>> read_bytearray8(io.BytesIO(b"\x03\x00\x00\x00\x00\x00\x00\x00abcdef")) + bytearray(b'abc') + >>> bigsize8 = struct.pack(">> read_bytearray8(io.BytesIO(bigsize8 + b"abcdef")) #doctest: +ELLIPSIS + Traceback (most recent call last): + ... + ValueError: expected ... bytes in a bytearray8, but only 6 remain + """ + + n = read_uint8(f) + assert n >= 0 + if n > sys.maxsize: + raise ValueError("bytearray8 byte count > sys.maxsize: %d" % n) + data = f.read(n) + if len(data) == n: + return bytearray(data) + raise ValueError("expected %d bytes in a bytearray8, but only %d remain" % + (n, len(data))) + +bytearray8 = ArgumentDescriptor( + name="bytearray8", + n=TAKEN_FROM_ARGUMENT8U, + reader=read_bytearray8, + doc="""A counted bytearray. + + The first argument is an 8-byte little-endian unsigned int giving + the number of bytes, and the second argument is that many bytes. + """) + def read_unicodestringnl(f): r""" >>> import io @@ -970,6 +1005,11 @@ def __repr__(self): obtype=bytes, doc="A Python bytes object.") +pybytearray = StackObject( + name='bytearray', + obtype=bytearray, + doc="A Python bytearray object.") + pyunicode = StackObject( name='str', obtype=str, @@ -1005,6 +1045,11 @@ def __repr__(self): obtype=set, doc="A Python frozenset object.") +pybuffer = StackObject( + name='buffer', + obtype=object, + doc="A Python buffer-like object.") + anyobject = StackObject( name='any', obtype=object, @@ -1265,7 +1310,7 @@ def __init__(self, name, code, arg, object instead. """), - # Bytes (protocol 3 only; older protocols don't support bytes at all) + # Bytes (protocol 3 and higher) I(name='BINBYTES', code='B', @@ -1306,6 +1351,39 @@ def __init__(self, name, code, arg, which are taken literally as the string content. """), + # Bytearray (protocol 5 and higher) + + I(name='BYTEARRAY8', + code='\x96', + arg=bytearray8, + stack_before=[], + stack_after=[pybytearray], + proto=5, + doc="""Push a Python bytearray object. + + There are two arguments: the first is an 8-byte unsigned int giving + the number of bytes in the bytearray, and the second is that many bytes, + which are taken literally as the bytearray content. + """), + + # Out-of-band buffer (protocol 5 and higher) + + I(name='NEXT_BUFFER', + code='\x97', + arg=None, + stack_before=[], + stack_after=[pybuffer], + proto=5, + doc="Push an out-of-band buffer object."), + + I(name='READONLY_BUFFER', + code='\x98', + arg=None, + stack_before=[pybuffer], + stack_after=[pybuffer], + proto=5, + doc="Make an out-of-band buffer object read-only."), + # Ways to spell None. I(name='NONE', diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index 4f8c2942df93..f6fda9ee6d83 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -16,6 +16,16 @@ from textwrap import dedent from http.cookies import SimpleCookie +try: + import _testbuffer +except ImportError: + _testbuffer = None + +try: + import numpy as np +except ImportError: + np = None + from test import support from test.support import ( TestFailed, TESTFN, run_with_locale, no_tracing, @@ -162,6 +172,139 @@ def create_dynamic_class(name, bases): result.reduce_args = (name, bases) return result + +class ZeroCopyBytes(bytes): + readonly = True + c_contiguous = True + f_contiguous = True + zero_copy_reconstruct = True + + def __reduce_ex__(self, protocol): + if protocol >= 5: + return type(self)._reconstruct, (pickle.PickleBuffer(self),), None + else: + return type(self)._reconstruct, (bytes(self),) + + def __repr__(self): + return "{}({!r})".format(self.__class__.__name__, bytes(self)) + + __str__ = __repr__ + + @classmethod + def _reconstruct(cls, obj): + with memoryview(obj) as m: + obj = m.obj + if type(obj) is cls: + # Zero-copy + return obj + else: + return cls(obj) + + +class ZeroCopyBytearray(bytearray): + readonly = False + c_contiguous = True + f_contiguous = True + zero_copy_reconstruct = True + + def __reduce_ex__(self, protocol): + if protocol >= 5: + return type(self)._reconstruct, (pickle.PickleBuffer(self),), None + else: + return type(self)._reconstruct, (bytes(self),) + + def __repr__(self): + return "{}({!r})".format(self.__class__.__name__, bytes(self)) + + __str__ = __repr__ + + @classmethod + def _reconstruct(cls, obj): + with memoryview(obj) as m: + obj = m.obj + if type(obj) is cls: + # Zero-copy + return obj + else: + return cls(obj) + + +if _testbuffer is not None: + + class PicklableNDArray: + # A not-really-zero-copy picklable ndarray, as the ndarray() + # constructor doesn't allow for it + + zero_copy_reconstruct = False + + def __init__(self, *args, **kwargs): + self.array = _testbuffer.ndarray(*args, **kwargs) + + def __getitem__(self, idx): + cls = type(self) + new = cls.__new__(cls) + new.array = self.array[idx] + return new + + @property + def readonly(self): + return self.array.readonly + + @property + def c_contiguous(self): + return self.array.c_contiguous + + @property + def f_contiguous(self): + return self.array.f_contiguous + + def __eq__(self, other): + if not isinstance(other, PicklableNDArray): + return NotImplemented + return (other.array.format == self.array.format and + other.array.shape == self.array.shape and + other.array.strides == self.array.strides and + other.array.readonly == self.array.readonly and + other.array.tobytes() == self.array.tobytes()) + + def __ne__(self, other): + if not isinstance(other, PicklableNDArray): + return NotImplemented + return not (self == other) + + def __repr__(self): + return (f"{type(self)}(shape={self.array.shape}," + f"strides={self.array.strides}, " + f"bytes={self.array.tobytes()})") + + def __reduce_ex__(self, protocol): + if not self.array.contiguous: + raise NotImplementedError("Reconstructing a non-contiguous " + "ndarray does not seem possible") + ndarray_kwargs = {"shape": self.array.shape, + "strides": self.array.strides, + "format": self.array.format, + "flags": (0 if self.readonly + else _testbuffer.ND_WRITABLE)} + pb = pickle.PickleBuffer(self.array) + if protocol >= 5: + return (type(self)._reconstruct, + (pb, ndarray_kwargs)) + else: + # Need to serialize the bytes in physical order + with pb.raw() as m: + return (type(self)._reconstruct, + (m.tobytes(), ndarray_kwargs)) + + @classmethod + def _reconstruct(cls, obj, kwargs): + with memoryview(obj) as m: + # For some reason, ndarray() wants a list of integers... + # XXX This only works if format == 'B' + items = list(m.tobytes()) + return cls(items, **kwargs) + + # DATA0 .. DATA4 are the pickles we expect under the various protocols, for # the object returned by create_data(). @@ -888,12 +1031,22 @@ def test_binunicode8(self): dumped = b'\x80\x04\x8d\4\0\0\0\0\0\0\0\xe2\x82\xac\x00.' self.assertEqual(self.loads(dumped), '\u20ac\x00') + def test_bytearray8(self): + dumped = b'\x80\x05\x96\x03\x00\x00\x00\x00\x00\x00\x00xxx.' + self.assertEqual(self.loads(dumped), bytearray(b'xxx')) + @requires_32b def test_large_32b_binbytes8(self): dumped = b'\x80\x04\x8e\4\0\0\0\1\0\0\0\xe2\x82\xac\x00.' self.check_unpickling_error((pickle.UnpicklingError, OverflowError), dumped) + @requires_32b + def test_large_32b_bytearray8(self): + dumped = b'\x80\x05\x96\4\0\0\0\1\0\0\0\xe2\x82\xac\x00.' + self.check_unpickling_error((pickle.UnpicklingError, OverflowError), + dumped) + @requires_32b def test_large_32b_binunicode8(self): dumped = b'\x80\x04\x8d\4\0\0\0\1\0\0\0\xe2\x82\xac\x00.' @@ -1171,6 +1324,10 @@ def test_truncated_data(self): b'\x8e\x03\x00\x00\x00\x00\x00\x00', b'\x8e\x03\x00\x00\x00\x00\x00\x00\x00', b'\x8e\x03\x00\x00\x00\x00\x00\x00\x00ab', + b'\x96', # BYTEARRAY8 + b'\x96\x03\x00\x00\x00\x00\x00\x00', + b'\x96\x03\x00\x00\x00\x00\x00\x00\x00', + b'\x96\x03\x00\x00\x00\x00\x00\x00\x00ab', b'\x95', # FRAME b'\x95\x02\x00\x00\x00\x00\x00\x00', b'\x95\x02\x00\x00\x00\x00\x00\x00\x00', @@ -1482,6 +1639,25 @@ def test_bytes(self): p = self.dumps(s, proto) self.assert_is_copy(s, self.loads(p)) + def test_bytearray(self): + for proto in protocols: + for s in b'', b'xyz', b'xyz'*100: + b = bytearray(s) + p = self.dumps(b, proto) + bb = self.loads(p) + self.assertIsNot(bb, b) + self.assert_is_copy(b, bb) + if proto <= 3: + # bytearray is serialized using a global reference + self.assertIn(b'bytearray', p) + self.assertTrue(opcode_in_pickle(pickle.GLOBAL, p)) + elif proto == 4: + self.assertIn(b'bytearray', p) + self.assertTrue(opcode_in_pickle(pickle.STACK_GLOBAL, p)) + elif proto == 5: + self.assertNotIn(b'bytearray', p) + self.assertTrue(opcode_in_pickle(pickle.BYTEARRAY8, p)) + def test_ints(self): for proto in protocols: n = sys.maxsize @@ -2114,7 +2290,8 @@ def check_frame_opcodes(self, pickled): the following consistency check. """ frame_end = frameless_start = None - frameless_opcodes = {'BINBYTES', 'BINUNICODE', 'BINBYTES8', 'BINUNICODE8'} + frameless_opcodes = {'BINBYTES', 'BINUNICODE', 'BINBYTES8', + 'BINUNICODE8', 'BYTEARRAY8'} for op, arg, pos in pickletools.genops(pickled): if frame_end is not None: self.assertLessEqual(pos, frame_end) @@ -2225,19 +2402,20 @@ def remove_frames(pickled, keep_frame=None): num_frames = 20 # Large byte objects (dict values) intermittent with small objects # (dict keys) - obj = {i: bytes([i]) * frame_size for i in range(num_frames)} + for bytes_type in (bytes, bytearray): + obj = {i: bytes_type([i]) * frame_size for i in range(num_frames)} - for proto in range(4, pickle.HIGHEST_PROTOCOL + 1): - pickled = self.dumps(obj, proto) + for proto in range(4, pickle.HIGHEST_PROTOCOL + 1): + pickled = self.dumps(obj, proto) - frameless_pickle = remove_frames(pickled) - self.assertEqual(count_opcode(pickle.FRAME, frameless_pickle), 0) - self.assertEqual(obj, self.loads(frameless_pickle)) + frameless_pickle = remove_frames(pickled) + self.assertEqual(count_opcode(pickle.FRAME, frameless_pickle), 0) + self.assertEqual(obj, self.loads(frameless_pickle)) - some_frames_pickle = remove_frames(pickled, lambda i: i % 2) - self.assertLess(count_opcode(pickle.FRAME, some_frames_pickle), - count_opcode(pickle.FRAME, pickled)) - self.assertEqual(obj, self.loads(some_frames_pickle)) + some_frames_pickle = remove_frames(pickled, lambda i: i % 2) + self.assertLess(count_opcode(pickle.FRAME, some_frames_pickle), + count_opcode(pickle.FRAME, pickled)) + self.assertEqual(obj, self.loads(some_frames_pickle)) def test_framed_write_sizes_with_delayed_writer(self): class ChunkAccumulator: @@ -2452,6 +2630,186 @@ def f(): with self.assertRaises((AttributeError, pickle.PicklingError)): pickletools.dis(self.dumps(f, proto)) + # + # PEP 574 tests below + # + + def buffer_like_objects(self): + # Yield buffer-like objects with the bytestring "abcdef" in them + bytestring = b"abcdefgh" + yield ZeroCopyBytes(bytestring) + yield ZeroCopyBytearray(bytestring) + if _testbuffer is not None: + items = list(bytestring) + value = int.from_bytes(bytestring, byteorder='little') + for flags in (0, _testbuffer.ND_WRITABLE): + # 1-D, contiguous + yield PicklableNDArray(items, format='B', shape=(8,), + flags=flags) + # 2-D, C-contiguous + yield PicklableNDArray(items, format='B', shape=(4, 2), + strides=(2, 1), flags=flags) + # 2-D, Fortran-contiguous + yield PicklableNDArray(items, format='B', + shape=(4, 2), strides=(1, 4), + flags=flags) + + def test_in_band_buffers(self): + # Test in-band buffers (PEP 574) + for obj in self.buffer_like_objects(): + for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): + data = self.dumps(obj, proto) + if obj.c_contiguous and proto >= 5: + # The raw memory bytes are serialized in physical order + self.assertIn(b"abcdefgh", data) + self.assertEqual(count_opcode(pickle.NEXT_BUFFER, data), 0) + if proto >= 5: + self.assertEqual(count_opcode(pickle.SHORT_BINBYTES, data), + 1 if obj.readonly else 0) + self.assertEqual(count_opcode(pickle.BYTEARRAY8, data), + 0 if obj.readonly else 1) + # Return a true value from buffer_callback should have + # the same effect + def buffer_callback(obj): + return True + data2 = self.dumps(obj, proto, + buffer_callback=buffer_callback) + self.assertEqual(data2, data) + + new = self.loads(data) + # It's a copy + self.assertIsNot(new, obj) + self.assertIs(type(new), type(obj)) + self.assertEqual(new, obj) + + # XXX Unfortunately cannot test non-contiguous array + # (see comment in PicklableNDArray.__reduce_ex__) + + def test_oob_buffers(self): + # Test out-of-band buffers (PEP 574) + for obj in self.buffer_like_objects(): + for proto in range(0, 5): + # Need protocol >= 5 for buffer_callback + with self.assertRaises(ValueError): + self.dumps(obj, proto, + buffer_callback=[].append) + for proto in range(5, pickle.HIGHEST_PROTOCOL + 1): + buffers = [] + buffer_callback = lambda pb: buffers.append(pb.raw()) + data = self.dumps(obj, proto, + buffer_callback=buffer_callback) + self.assertNotIn(b"abcdefgh", data) + self.assertEqual(count_opcode(pickle.SHORT_BINBYTES, data), 0) + self.assertEqual(count_opcode(pickle.BYTEARRAY8, data), 0) + self.assertEqual(count_opcode(pickle.NEXT_BUFFER, data), 1) + self.assertEqual(count_opcode(pickle.READONLY_BUFFER, data), + 1 if obj.readonly else 0) + + if obj.c_contiguous: + self.assertEqual(bytes(buffers[0]), b"abcdefgh") + # Need buffers argument to unpickle properly + with self.assertRaises(pickle.UnpicklingError): + self.loads(data) + + new = self.loads(data, buffers=buffers) + if obj.zero_copy_reconstruct: + # Zero-copy achieved + self.assertIs(new, obj) + else: + self.assertIs(type(new), type(obj)) + self.assertEqual(new, obj) + # Non-sequence buffers accepted too + new = self.loads(data, buffers=iter(buffers)) + if obj.zero_copy_reconstruct: + # Zero-copy achieved + self.assertIs(new, obj) + else: + self.assertIs(type(new), type(obj)) + self.assertEqual(new, obj) + + def test_oob_buffers_writable_to_readonly(self): + # Test reconstructing readonly object from writable buffer + obj = ZeroCopyBytes(b"foobar") + for proto in range(5, pickle.HIGHEST_PROTOCOL + 1): + buffers = [] + buffer_callback = buffers.append + data = self.dumps(obj, proto, buffer_callback=buffer_callback) + + buffers = map(bytearray, buffers) + new = self.loads(data, buffers=buffers) + self.assertIs(type(new), type(obj)) + self.assertEqual(new, obj) + + def test_picklebuffer_error(self): + # PickleBuffer forbidden with protocol < 5 + pb = pickle.PickleBuffer(b"foobar") + for proto in range(0, 5): + with self.assertRaises(pickle.PickleError): + self.dumps(pb, proto) + + def test_buffer_callback_error(self): + def buffer_callback(buffers): + 1/0 + pb = pickle.PickleBuffer(b"foobar") + with self.assertRaises(ZeroDivisionError): + self.dumps(pb, 5, buffer_callback=buffer_callback) + + def test_buffers_error(self): + pb = pickle.PickleBuffer(b"foobar") + for proto in range(5, pickle.HIGHEST_PROTOCOL + 1): + data = self.dumps(pb, proto, buffer_callback=[].append) + # Non iterable buffers + with self.assertRaises(TypeError): + self.loads(data, buffers=object()) + # Buffer iterable exhausts too early + with self.assertRaises(pickle.UnpicklingError): + self.loads(data, buffers=[]) + + @unittest.skipIf(np is None, "Test needs Numpy") + def test_buffers_numpy(self): + def check_no_copy(x, y): + np.testing.assert_equal(x, y) + self.assertEqual(x.ctypes.data, y.ctypes.data) + + def check_copy(x, y): + np.testing.assert_equal(x, y) + self.assertNotEqual(x.ctypes.data, y.ctypes.data) + + def check_array(arr): + # In-band + for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): + data = self.dumps(arr, proto) + new = self.loads(data) + check_copy(arr, new) + for proto in range(5, pickle.HIGHEST_PROTOCOL + 1): + buffer_callback = lambda _: True + data = self.dumps(arr, proto, buffer_callback=buffer_callback) + new = self.loads(data) + check_copy(arr, new) + # Out-of-band + for proto in range(5, pickle.HIGHEST_PROTOCOL + 1): + buffers = [] + buffer_callback = buffers.append + data = self.dumps(arr, proto, buffer_callback=buffer_callback) + new = self.loads(data, buffers=buffers) + if arr.flags.c_contiguous or arr.flags.f_contiguous: + check_no_copy(arr, new) + else: + check_copy(arr, new) + + # 1-D + arr = np.arange(6) + check_array(arr) + # 1-D, non-contiguous + check_array(arr[::2]) + # 2-D, C-contiguous + arr = np.arange(12).reshape((3, 4)) + check_array(arr) + # 2-D, F-contiguous + check_array(arr.T) + # 2-D, non-contiguous + check_array(arr[::2]) + class BigmemPickleTests(unittest.TestCase): @@ -2736,7 +3094,7 @@ def test_load_from_and_dump_to_file(self): def test_highest_protocol(self): # Of course this needs to be changed when HIGHEST_PROTOCOL changes. - self.assertEqual(pickle.HIGHEST_PROTOCOL, 4) + self.assertEqual(pickle.HIGHEST_PROTOCOL, 5) def test_callapi(self): f = io.BytesIO() @@ -2760,6 +3118,47 @@ def __init__(self): pass self.assertRaises(pickle.PicklingError, BadPickler().dump, 0) self.assertRaises(pickle.UnpicklingError, BadUnpickler().load) + def check_dumps_loads_oob_buffers(self, dumps, loads): + # No need to do the full gamut of tests here, just enough to + # check that dumps() and loads() redirect their arguments + # to the underlying Pickler and Unpickler, respectively. + obj = ZeroCopyBytes(b"foo") + + for proto in range(0, 5): + # Need protocol >= 5 for buffer_callback + with self.assertRaises(ValueError): + dumps(obj, protocol=proto, + buffer_callback=[].append) + for proto in range(5, pickle.HIGHEST_PROTOCOL + 1): + buffers = [] + buffer_callback = buffers.append + data = dumps(obj, protocol=proto, + buffer_callback=buffer_callback) + self.assertNotIn(b"foo", data) + self.assertEqual(bytes(buffers[0]), b"foo") + # Need buffers argument to unpickle properly + with self.assertRaises(pickle.UnpicklingError): + loads(data) + new = loads(data, buffers=buffers) + self.assertIs(new, obj) + + def test_dumps_loads_oob_buffers(self): + # Test out-of-band buffers (PEP 574) with top-level dumps() and loads() + self.check_dumps_loads_oob_buffers(self.dumps, self.loads) + + def test_dump_load_oob_buffers(self): + # Test out-of-band buffers (PEP 574) with top-level dump() and load() + def dumps(obj, **kwargs): + f = io.BytesIO() + self.dump(obj, f, **kwargs) + return f.getvalue() + + def loads(data, **kwargs): + f = io.BytesIO(data) + return self.load(f, **kwargs) + + self.check_dumps_loads_oob_buffers(dumps, loads) + class AbstractPersistentPicklerTests(unittest.TestCase): diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index be52b389e62d..b3aae3a18ecf 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -2894,16 +2894,15 @@ class D(C): pass @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings") def test_signature_on_builtin_class(self): - self.assertEqual(str(inspect.signature(_pickle.Pickler)), - '(file, protocol=None, fix_imports=True)') + expected = ('(file, protocol=None, fix_imports=True, ' + 'buffer_callback=None)') + self.assertEqual(str(inspect.signature(_pickle.Pickler)), expected) class P(_pickle.Pickler): pass class EmptyTrait: pass class P2(EmptyTrait, P): pass - self.assertEqual(str(inspect.signature(P)), - '(file, protocol=None, fix_imports=True)') - self.assertEqual(str(inspect.signature(P2)), - '(file, protocol=None, fix_imports=True)') + self.assertEqual(str(inspect.signature(P)), expected) + self.assertEqual(str(inspect.signature(P2)), expected) class P3(P2): def __init__(self, spam): diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py index 435c248802d3..5f7a879b935d 100644 --- a/Lib/test/test_pickle.py +++ b/Lib/test/test_pickle.py @@ -57,9 +57,9 @@ class PyPicklerTests(AbstractPickleTests): pickler = pickle._Pickler unpickler = pickle._Unpickler - def dumps(self, arg, proto=None): + def dumps(self, arg, proto=None, **kwargs): f = io.BytesIO() - p = self.pickler(f, proto) + p = self.pickler(f, proto, **kwargs) p.dump(arg) f.seek(0) return bytes(f.read()) @@ -78,8 +78,8 @@ class InMemoryPickleTests(AbstractPickleTests, AbstractUnpickleTests, AttributeError, ValueError, struct.error, IndexError, ImportError) - def dumps(self, arg, protocol=None): - return pickle.dumps(arg, protocol) + def dumps(self, arg, protocol=None, **kwargs): + return pickle.dumps(arg, protocol, **kwargs) def loads(self, buf, **kwds): return pickle.loads(buf, **kwds) @@ -271,7 +271,7 @@ class SizeofTests(unittest.TestCase): check_sizeof = support.check_sizeof def test_pickler(self): - basesize = support.calcobjsize('6P2n3i2n3i2P') + basesize = support.calcobjsize('7P2n3i2n3i2P') p = _pickle.Pickler(io.BytesIO()) self.assertEqual(object.__sizeof__(p), basesize) MT_size = struct.calcsize('3nP0n') @@ -288,7 +288,7 @@ def test_pickler(self): 0) # Write buffer is cleared after every dump(). def test_unpickler(self): - basesize = support.calcobjsize('2P2n2P 2P2n2i5P 2P3n6P2n2i') + basesize = support.calcobjsize('2P2n2P 2P2n2i5P 2P3n8P2n2i') unpickler = _pickle.Unpickler P = struct.calcsize('P') # Size of memo table entry. n = struct.calcsize('n') # Size of mark table entry. diff --git a/Lib/test/test_picklebuffer.py b/Lib/test/test_picklebuffer.py new file mode 100644 index 000000000000..7e72157fd022 --- /dev/null +++ b/Lib/test/test_picklebuffer.py @@ -0,0 +1,154 @@ +"""Unit tests for the PickleBuffer object. + +Pickling tests themselves are in pickletester.py. +""" + +import gc +from pickle import PickleBuffer +import sys +import weakref +import unittest + +from test import support + + +class B(bytes): + pass + + +class PickleBufferTest(unittest.TestCase): + + def check_memoryview(self, pb, equiv): + with memoryview(pb) as m: + with memoryview(equiv) as expected: + self.assertEqual(m.nbytes, expected.nbytes) + self.assertEqual(m.readonly, expected.readonly) + self.assertEqual(m.itemsize, expected.itemsize) + self.assertEqual(m.shape, expected.shape) + self.assertEqual(m.strides, expected.strides) + self.assertEqual(m.c_contiguous, expected.c_contiguous) + self.assertEqual(m.f_contiguous, expected.f_contiguous) + self.assertEqual(m.format, expected.format) + self.assertEqual(m.tobytes(), expected.tobytes()) + + def test_constructor_failure(self): + with self.assertRaises(TypeError): + PickleBuffer() + with self.assertRaises(TypeError): + PickleBuffer("foo") + # Released memoryview fails taking a buffer + m = memoryview(b"foo") + m.release() + with self.assertRaises(ValueError): + PickleBuffer(m) + + def test_basics(self): + pb = PickleBuffer(b"foo") + self.assertEqual(b"foo", bytes(pb)) + with memoryview(pb) as m: + self.assertTrue(m.readonly) + + pb = PickleBuffer(bytearray(b"foo")) + self.assertEqual(b"foo", bytes(pb)) + with memoryview(pb) as m: + self.assertFalse(m.readonly) + m[0] = 48 + self.assertEqual(b"0oo", bytes(pb)) + + def test_release(self): + pb = PickleBuffer(b"foo") + pb.release() + with self.assertRaises(ValueError) as raises: + memoryview(pb) + self.assertIn("operation forbidden on released PickleBuffer object", + str(raises.exception)) + # Idempotency + pb.release() + + def test_cycle(self): + b = B(b"foo") + pb = PickleBuffer(b) + b.cycle = pb + wpb = weakref.ref(pb) + del b, pb + gc.collect() + self.assertIsNone(wpb()) + + def test_ndarray_2d(self): + # C-contiguous + ndarray = support.import_module("_testbuffer").ndarray + arr = ndarray(list(range(12)), shape=(4, 3), format='pers_func = NULL; self->dispatch_table = NULL; + self->buffer_callback = NULL; self->write = NULL; self->proto = 0; self->bin = 0; @@ -1174,6 +1183,23 @@ _Pickler_SetOutputStream(PicklerObject *self, PyObject *file) return 0; } +static int +_Pickler_SetBufferCallback(PicklerObject *self, PyObject *buffer_callback) +{ + if (buffer_callback == Py_None) { + buffer_callback = NULL; + } + if (buffer_callback != NULL && self->proto < 5) { + PyErr_SetString(PyExc_ValueError, + "buffer_callback needs protocol >= 5"); + return -1; + } + + Py_XINCREF(buffer_callback); + self->buffer_callback = buffer_callback; + return 0; +} + /* Returns the size of the input on success, -1 on failure. This takes its own reference to `input`. */ static Py_ssize_t @@ -1198,6 +1224,7 @@ bad_readline(void) return -1; } +/* Skip any consumed data that was only prefetched using peek() */ static int _Unpickler_SkipConsumed(UnpicklerObject *self) { @@ -1305,6 +1332,7 @@ _Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n) if (!self->read) return bad_readline(); + /* Extend the buffer to satisfy desired size */ num_read = _Unpickler_ReadFromFile(self, n); if (num_read < 0) return -1; @@ -1315,6 +1343,66 @@ _Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n) return n; } +/* Read `n` bytes from the unpickler's data source, storing the result in `buf`. + * + * This should only be used for non-small data reads where potentially + * avoiding a copy is beneficial. This method does not try to prefetch + * more data into the input buffer. + * + * _Unpickler_Read() is recommended in most cases. + */ +static Py_ssize_t +_Unpickler_ReadInto(UnpicklerObject *self, char *buf, Py_ssize_t n) +{ + assert(n != READ_WHOLE_LINE); + + /* Read from available buffer data, if any */ + Py_ssize_t in_buffer = self->input_len - self->next_read_idx; + if (in_buffer > 0) { + Py_ssize_t to_read = Py_MIN(in_buffer, n); + memcpy(buf, self->input_buffer + self->next_read_idx, to_read); + self->next_read_idx += to_read; + buf += to_read; + n -= to_read; + if (n == 0) { + /* Entire read was satisfied from buffer */ + return n; + } + } + + /* Read from file */ + if (!self->readinto) { + return bad_readline(); + } + if (_Unpickler_SkipConsumed(self) < 0) { + return -1; + } + + /* Call readinto() into user buffer */ + PyObject *buf_obj = PyMemoryView_FromMemory(buf, n, PyBUF_WRITE); + if (buf_obj == NULL) { + return -1; + } + PyObject *read_size_obj = _Pickle_FastCall(self->readinto, buf_obj); + if (read_size_obj == NULL) { + return -1; + } + Py_ssize_t read_size = PyLong_AsSsize_t(read_size_obj); + Py_DECREF(read_size_obj); + + if (read_size < 0) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ValueError, + "readinto() returned negative size"); + } + return -1; + } + if (read_size < n) { + return bad_readline(); + } + return n; +} + /* Read `n` bytes from the unpickler's data source, storing the result in `*s`. This should be used for all data reads, rather than accessing the unpickler's @@ -1482,8 +1570,10 @@ _Unpickler_New(void) self->next_read_idx = 0; self->prefetched_idx = 0; self->read = NULL; + self->readinto = NULL; self->readline = NULL; self->peek = NULL; + self->buffers = NULL; self->encoding = NULL; self->errors = NULL; self->marks = NULL; @@ -1507,25 +1597,29 @@ _Unpickler_New(void) } /* Returns -1 (with an exception set) on failure, 0 on success. This may - be called once on a freshly created Pickler. */ + be called once on a freshly created Unpickler. */ static int _Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file) { _Py_IDENTIFIER(peek); _Py_IDENTIFIER(read); + _Py_IDENTIFIER(readinto); _Py_IDENTIFIER(readline); if (_PyObject_LookupAttrId(file, &PyId_peek, &self->peek) < 0) { return -1; } (void)_PyObject_LookupAttrId(file, &PyId_read, &self->read); + (void)_PyObject_LookupAttrId(file, &PyId_readinto, &self->readinto); (void)_PyObject_LookupAttrId(file, &PyId_readline, &self->readline); - if (self->readline == NULL || self->read == NULL) { + if (!self->readline || !self->readinto || !self->read) { if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, - "file must have 'read' and 'readline' attributes"); + "file must have 'read', 'readinto' and " + "'readline' attributes"); } Py_CLEAR(self->read); + Py_CLEAR(self->readinto); Py_CLEAR(self->readline); Py_CLEAR(self->peek); return -1; @@ -1534,7 +1628,7 @@ _Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file) } /* Returns -1 (with an exception set) on failure, 0 on success. This may - be called once on a freshly created Pickler. */ + be called once on a freshly created Unpickler. */ static int _Unpickler_SetInputEncoding(UnpicklerObject *self, const char *encoding, @@ -1554,6 +1648,23 @@ _Unpickler_SetInputEncoding(UnpicklerObject *self, return 0; } +/* Returns -1 (with an exception set) on failure, 0 on success. This may + be called once on a freshly created Unpickler. */ +static int +_Unpickler_SetBuffers(UnpicklerObject *self, PyObject *buffers) +{ + if (buffers == NULL) { + self->buffers = NULL; + } + else { + self->buffers = PyObject_GetIter(buffers); + if (self->buffers == NULL) { + return -1; + } + } + return 0; +} + /* Generate a GET opcode for an object stored in the memo. */ static int memo_get(PicklerObject *self, PyObject *key) @@ -2209,6 +2320,54 @@ _Pickler_write_bytes(PicklerObject *self, return 0; } +static int +_save_bytes_data(PicklerObject *self, PyObject *obj, const char *data, + Py_ssize_t size) +{ + assert(self->proto >= 3); + + char header[9]; + Py_ssize_t len; + + if (size < 0) + return -1; + + if (size <= 0xff) { + header[0] = SHORT_BINBYTES; + header[1] = (unsigned char)size; + len = 2; + } + else if ((size_t)size <= 0xffffffffUL) { + header[0] = BINBYTES; + header[1] = (unsigned char)(size & 0xff); + header[2] = (unsigned char)((size >> 8) & 0xff); + header[3] = (unsigned char)((size >> 16) & 0xff); + header[4] = (unsigned char)((size >> 24) & 0xff); + len = 5; + } + else if (self->proto >= 4) { + header[0] = BINBYTES8; + _write_size64(header + 1, size); + len = 9; + } + else { + PyErr_SetString(PyExc_OverflowError, + "serializing a bytes object larger than 4 GiB " + "requires pickle protocol 4 or higher"); + return -1; + } + + if (_Pickler_write_bytes(self, header, len, data, size, obj) < 0) { + return -1; + } + + if (memo_put(self, obj) < 0) { + return -1; + } + + return 0; +} + static int save_bytes(PicklerObject *self, PyObject *obj) { @@ -2255,49 +2414,132 @@ save_bytes(PicklerObject *self, PyObject *obj) return status; } else { - Py_ssize_t size; - char header[9]; - Py_ssize_t len; + return _save_bytes_data(self, obj, PyBytes_AS_STRING(obj), + PyBytes_GET_SIZE(obj)); + } +} - size = PyBytes_GET_SIZE(obj); - if (size < 0) +static int +_save_bytearray_data(PicklerObject *self, PyObject *obj, const char *data, + Py_ssize_t size) +{ + assert(self->proto >= 5); + + char header[9]; + Py_ssize_t len; + + if (size < 0) + return -1; + + header[0] = BYTEARRAY8; + _write_size64(header + 1, size); + len = 9; + + if (_Pickler_write_bytes(self, header, len, data, size, obj) < 0) { + return -1; + } + + if (memo_put(self, obj) < 0) { + return -1; + } + + return 0; +} + +static int +save_bytearray(PicklerObject *self, PyObject *obj) +{ + if (self->proto < 5) { + /* Older pickle protocols do not have an opcode for pickling + * bytearrays. */ + PyObject *reduce_value = NULL; + int status; + + if (PyByteArray_GET_SIZE(obj) == 0) { + reduce_value = Py_BuildValue("(O())", + (PyObject *) &PyByteArray_Type); + } + else { + PyObject *bytes_obj = PyBytes_FromObject(obj); + if (bytes_obj != NULL) { + reduce_value = Py_BuildValue("(O(O))", + (PyObject *) &PyByteArray_Type, + bytes_obj); + Py_DECREF(bytes_obj); + } + } + if (reduce_value == NULL) return -1; - if (size <= 0xff) { - header[0] = SHORT_BINBYTES; - header[1] = (unsigned char)size; - len = 2; + /* save_reduce() will memoize the object automatically. */ + status = save_reduce(self, reduce_value, obj); + Py_DECREF(reduce_value); + return status; + } + else { + return _save_bytearray_data(self, obj, PyByteArray_AS_STRING(obj), + PyByteArray_GET_SIZE(obj)); + } +} + +static int +save_picklebuffer(PicklerObject *self, PyObject *obj) +{ + if (self->proto < 5) { + PickleState *st = _Pickle_GetGlobalState(); + PyErr_SetString(st->PicklingError, + "PickleBuffer can only pickled with protocol >= 5"); + return -1; + } + const Py_buffer* view = PyPickleBuffer_GetBuffer(obj); + if (view == NULL) { + return -1; + } + if (view->suboffsets != NULL || !PyBuffer_IsContiguous(view, 'A')) { + PickleState *st = _Pickle_GetGlobalState(); + PyErr_SetString(st->PicklingError, + "PickleBuffer can not be pickled when " + "pointing to a non-contiguous buffer"); + return -1; + } + int in_band = 1; + if (self->buffer_callback != NULL) { + PyObject *ret = PyObject_CallFunctionObjArgs(self->buffer_callback, + obj, NULL); + if (ret == NULL) { + return -1; } - else if ((size_t)size <= 0xffffffffUL) { - header[0] = BINBYTES; - header[1] = (unsigned char)(size & 0xff); - header[2] = (unsigned char)((size >> 8) & 0xff); - header[3] = (unsigned char)((size >> 16) & 0xff); - header[4] = (unsigned char)((size >> 24) & 0xff); - len = 5; + in_band = PyObject_IsTrue(ret); + Py_DECREF(ret); + if (in_band == -1) { + return -1; } - else if (self->proto >= 4) { - header[0] = BINBYTES8; - _write_size64(header + 1, size); - len = 9; + } + if (in_band) { + /* Write data in-band */ + if (view->readonly) { + return _save_bytes_data(self, obj, (const char*) view->buf, + view->len); } else { - PyErr_SetString(PyExc_OverflowError, - "cannot serialize a bytes object larger than 4 GiB"); - return -1; /* string too large */ + return _save_bytearray_data(self, obj, (const char*) view->buf, + view->len); } - - if (_Pickler_write_bytes(self, header, len, - PyBytes_AS_STRING(obj), size, obj) < 0) - { + } + else { + /* Write data out-of-band */ + const char next_buffer_op = NEXT_BUFFER; + if (_Pickler_Write(self, &next_buffer_op, 1) < 0) { return -1; } - - if (memo_put(self, obj) < 0) - return -1; - - return 0; + if (view->readonly) { + const char readonly_buffer_op = READONLY_BUFFER; + if (_Pickler_Write(self, &readonly_buffer_op, 1) < 0) { + return -1; + } + } } + return 0; } /* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates @@ -2417,7 +2659,8 @@ write_unicode_binary(PicklerObject *self, PyObject *obj) } else { PyErr_SetString(PyExc_OverflowError, - "cannot serialize a string larger than 4GiB"); + "serializing a string larger than 4 GiB " + "requires pickle protocol 4 or higher"); Py_XDECREF(encoded); return -1; } @@ -4062,6 +4305,14 @@ save(PicklerObject *self, PyObject *obj, int pers_save) status = save_tuple(self, obj); goto done; } + else if (type == &PyByteArray_Type) { + status = save_bytearray(self, obj); + goto done; + } + else if (type == &PyPickleBuffer_Type) { + status = save_picklebuffer(self, obj); + goto done; + } /* Now, check reducer_override. If it returns NotImplemented, * fallback to save_type or save_global, and then perhaps to the @@ -4342,6 +4593,7 @@ Pickler_dealloc(PicklerObject *self) Py_XDECREF(self->dispatch_table); Py_XDECREF(self->fast_memo); Py_XDECREF(self->reducer_override); + Py_XDECREF(self->buffer_callback); PyMemoTable_Del(self->memo); @@ -4356,6 +4608,7 @@ Pickler_traverse(PicklerObject *self, visitproc visit, void *arg) Py_VISIT(self->dispatch_table); Py_VISIT(self->fast_memo); Py_VISIT(self->reducer_override); + Py_VISIT(self->buffer_callback); return 0; } @@ -4368,6 +4621,7 @@ Pickler_clear(PicklerObject *self) Py_CLEAR(self->dispatch_table); Py_CLEAR(self->fast_memo); Py_CLEAR(self->reducer_override); + Py_CLEAR(self->buffer_callback); if (self->memo != NULL) { PyMemoTable *memo = self->memo; @@ -4385,6 +4639,7 @@ _pickle.Pickler.__init__ file: object protocol: object = NULL fix_imports: bool = True + buffer_callback: object = NULL This takes a binary file for writing a pickle data stream. @@ -4404,12 +4659,25 @@ this interface. If *fix_imports* is True and protocol is less than 3, pickle will try to map the new Python 3 names to the old module names used in Python 2, so that the pickle data stream is readable with Python 2. + +If *buffer_callback* is None (the default), buffer views are +serialized into *file* as part of the pickle stream. + +If *buffer_callback* is not None, then it can be called any number +of times with a buffer view. If the callback returns a false value +(such as None), the given buffer is out-of-band; otherwise the +buffer is serialized in-band, i.e. inside the pickle stream. + +It is an error if *buffer_callback* is not None and *protocol* +is None or smaller than 5. + [clinic start generated code]*/ static int _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, - PyObject *protocol, int fix_imports) -/*[clinic end generated code: output=b5f31078dab17fb0 input=4faabdbc763c2389]*/ + PyObject *protocol, int fix_imports, + PyObject *buffer_callback) +/*[clinic end generated code: output=0abedc50590d259b input=9a43a1c50ab91652]*/ { _Py_IDENTIFIER(persistent_id); _Py_IDENTIFIER(dispatch_table); @@ -4424,6 +4692,9 @@ _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, if (_Pickler_SetOutputStream(self, file) < 0) return -1; + if (_Pickler_SetBufferCallback(self, buffer_callback) < 0) + return -1; + /* memo and output_buffer may have already been created in _Pickler_New */ if (self->memo == NULL) { self->memo = PyMemoTable_New(); @@ -5212,17 +5483,100 @@ load_counted_binbytes(UnpicklerObject *self, int nbytes) return -1; } - if (_Unpickler_Read(self, &s, size) < 0) - return -1; - - bytes = PyBytes_FromStringAndSize(s, size); + bytes = PyBytes_FromStringAndSize(NULL, size); if (bytes == NULL) return -1; + if (_Unpickler_ReadInto(self, PyBytes_AS_STRING(bytes), size) < 0) { + Py_DECREF(bytes); + return -1; + } PDATA_PUSH(self->stack, bytes, -1); return 0; } +static int +load_counted_bytearray(UnpicklerObject *self) +{ + PyObject *bytearray; + Py_ssize_t size; + char *s; + + if (_Unpickler_Read(self, &s, 8) < 0) { + return -1; + } + + size = calc_binsize(s, 8); + if (size < 0) { + PyErr_Format(PyExc_OverflowError, + "BYTEARRAY8 exceeds system's maximum size of %zd bytes", + PY_SSIZE_T_MAX); + return -1; + } + + bytearray = PyByteArray_FromStringAndSize(NULL, size); + if (bytearray == NULL) { + return -1; + } + if (_Unpickler_ReadInto(self, PyByteArray_AS_STRING(bytearray), size) < 0) { + Py_DECREF(bytearray); + return -1; + } + + PDATA_PUSH(self->stack, bytearray, -1); + return 0; +} + +static int +load_next_buffer(UnpicklerObject *self) +{ + if (self->buffers == NULL) { + PickleState *st = _Pickle_GetGlobalState(); + PyErr_SetString(st->UnpicklingError, + "pickle stream refers to out-of-band data " + "but no *buffers* argument was given"); + return -1; + } + PyObject *buf = PyIter_Next(self->buffers); + if (buf == NULL) { + if (!PyErr_Occurred()) { + PickleState *st = _Pickle_GetGlobalState(); + PyErr_SetString(st->UnpicklingError, + "not enough out-of-band buffers"); + } + return -1; + } + + PDATA_PUSH(self->stack, buf, -1); + return 0; +} + +static int +load_readonly_buffer(UnpicklerObject *self) +{ + Py_ssize_t len = Py_SIZE(self->stack); + if (len <= self->stack->fence) { + return Pdata_stack_underflow(self->stack); + } + + PyObject *obj = self->stack->data[len - 1]; + PyObject *view = PyMemoryView_FromObject(obj); + if (view == NULL) { + return -1; + } + if (!PyMemoryView_GET_BUFFER(view)->readonly) { + /* Original object is writable */ + PyMemoryView_GET_BUFFER(view)->readonly = 1; + self->stack->data[len - 1] = view; + Py_DECREF(obj); + } + else { + /* Original object is read-only, no need to replace it */ + Py_DECREF(view); + } + return 0; +} + static int load_unicode(UnpicklerObject *self) { @@ -6511,6 +6865,9 @@ load(UnpicklerObject *self) OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1) OP_ARG(BINBYTES, load_counted_binbytes, 4) OP_ARG(BINBYTES8, load_counted_binbytes, 8) + OP(BYTEARRAY8, load_counted_bytearray) + OP(NEXT_BUFFER, load_next_buffer) + OP(READONLY_BUFFER, load_readonly_buffer) OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1) OP_ARG(BINSTRING, load_counted_binstring, 4) OP(STRING, load_string) @@ -6771,10 +7128,12 @@ Unpickler_dealloc(UnpicklerObject *self) { PyObject_GC_UnTrack((PyObject *)self); Py_XDECREF(self->readline); + Py_XDECREF(self->readinto); Py_XDECREF(self->read); Py_XDECREF(self->peek); Py_XDECREF(self->stack); Py_XDECREF(self->pers_func); + Py_XDECREF(self->buffers); if (self->buffer.buf != NULL) { PyBuffer_Release(&self->buffer); self->buffer.buf = NULL; @@ -6793,10 +7152,12 @@ static int Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg) { Py_VISIT(self->readline); + Py_VISIT(self->readinto); Py_VISIT(self->read); Py_VISIT(self->peek); Py_VISIT(self->stack); Py_VISIT(self->pers_func); + Py_VISIT(self->buffers); return 0; } @@ -6804,10 +7165,12 @@ static int Unpickler_clear(UnpicklerObject *self) { Py_CLEAR(self->readline); + Py_CLEAR(self->readinto); Py_CLEAR(self->read); Py_CLEAR(self->peek); Py_CLEAR(self->stack); Py_CLEAR(self->pers_func); + Py_CLEAR(self->buffers); if (self->buffer.buf != NULL) { PyBuffer_Release(&self->buffer); self->buffer.buf = NULL; @@ -6835,6 +7198,7 @@ _pickle.Unpickler.__init__ fix_imports: bool = True encoding: str = 'ASCII' errors: str = 'strict' + buffers: object = NULL This takes a binary file for reading a pickle data stream. @@ -6861,8 +7225,8 @@ string instances as bytes objects. static int _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, - const char *errors) -/*[clinic end generated code: output=e2c8ce748edc57b0 input=f9b7da04f5f4f335]*/ + const char *errors, PyObject *buffers) +/*[clinic end generated code: output=09f0192649ea3f85 input=da4b62d9edb68700]*/ { _Py_IDENTIFIER(persistent_load); @@ -6876,6 +7240,9 @@ _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0) return -1; + if (_Unpickler_SetBuffers(self, buffers) < 0) + return -1; + self->fix_imports = fix_imports; if (init_method_ref((PyObject *)self, &PyId_persistent_load, @@ -7254,6 +7621,7 @@ _pickle.dump protocol: object = NULL * fix_imports: bool = True + buffer_callback: object = NULL Write a pickled representation of obj to the open file object file. @@ -7277,12 +7645,18 @@ this interface. If *fix_imports* is True and protocol is less than 3, pickle will try to map the new Python 3 names to the old module names used in Python 2, so that the pickle data stream is readable with Python 2. + +If *buffer_callback* is None (the default), buffer views are serialized +into *file* as part of the pickle stream. It is an error if +*buffer_callback* is not None and *protocol* is None or smaller than 5. + [clinic start generated code]*/ static PyObject * _pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file, - PyObject *protocol, int fix_imports) -/*[clinic end generated code: output=a4774d5fde7d34de input=93f1408489a87472]*/ + PyObject *protocol, int fix_imports, + PyObject *buffer_callback) +/*[clinic end generated code: output=706186dba996490c input=2f035f02cc0f9547]*/ { PicklerObject *pickler = _Pickler_New(); @@ -7295,6 +7669,9 @@ _pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file, if (_Pickler_SetOutputStream(pickler, file) < 0) goto error; + if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0) + goto error; + if (dump(pickler, obj) < 0) goto error; @@ -7317,6 +7694,7 @@ _pickle.dumps protocol: object = NULL * fix_imports: bool = True + buffer_callback: object = NULL Return the pickled representation of the object as a bytes object. @@ -7332,12 +7710,17 @@ version of Python needed to read the pickle produced. If *fix_imports* is True and *protocol* is less than 3, pickle will try to map the new Python 3 names to the old module names used in Python 2, so that the pickle data stream is readable with Python 2. + +If *buffer_callback* is None (the default), buffer views are serialized +into *file* as part of the pickle stream. It is an error if +*buffer_callback* is not None and *protocol* is None or smaller than 5. + [clinic start generated code]*/ static PyObject * _pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol, - int fix_imports) -/*[clinic end generated code: output=d75d5cda456fd261 input=b6efb45a7d19b5ab]*/ + int fix_imports, PyObject *buffer_callback) +/*[clinic end generated code: output=fbab0093a5580fdf input=001f167df711b9f1]*/ { PyObject *result; PicklerObject *pickler = _Pickler_New(); @@ -7348,6 +7731,9 @@ _pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol, if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0) goto error; + if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0) + goto error; + if (dump(pickler, obj) < 0) goto error; @@ -7369,6 +7755,7 @@ _pickle.load fix_imports: bool = True encoding: str = 'ASCII' errors: str = 'strict' + buffers: object = NULL Read and return an object from the pickle data stored in a file. @@ -7397,8 +7784,9 @@ string instances as bytes objects. static PyObject * _pickle_load_impl(PyObject *module, PyObject *file, int fix_imports, - const char *encoding, const char *errors) -/*[clinic end generated code: output=69e298160285199e input=01b44dd3fc07afa7]*/ + const char *encoding, const char *errors, + PyObject *buffers) +/*[clinic end generated code: output=250452d141c23e76 input=29fae982fe778156]*/ { PyObject *result; UnpicklerObject *unpickler = _Unpickler_New(); @@ -7412,6 +7800,9 @@ _pickle_load_impl(PyObject *module, PyObject *file, int fix_imports, if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0) goto error; + if (_Unpickler_SetBuffers(unpickler, buffers) < 0) + goto error; + unpickler->fix_imports = fix_imports; result = load(unpickler); @@ -7432,6 +7823,7 @@ _pickle.loads fix_imports: bool = True encoding: str = 'ASCII' errors: str = 'strict' + buffers: object = NULL Read and return an object from the given pickle data. @@ -7451,8 +7843,9 @@ string instances as bytes objects. static PyObject * _pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports, - const char *encoding, const char *errors) -/*[clinic end generated code: output=1e7cb2343f2c440f input=70605948a719feb9]*/ + const char *encoding, const char *errors, + PyObject *buffers) +/*[clinic end generated code: output=82ac1e6b588e6d02 input=c6004393f8276867]*/ { PyObject *result; UnpicklerObject *unpickler = _Unpickler_New(); @@ -7466,6 +7859,9 @@ _pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports, if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0) goto error; + if (_Unpickler_SetBuffers(unpickler, buffers) < 0) + goto error; + unpickler->fix_imports = fix_imports; result = load(unpickler); @@ -7558,12 +7954,17 @@ PyInit__pickle(void) if (m == NULL) return NULL; + /* Add types */ Py_INCREF(&Pickler_Type); if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0) return NULL; Py_INCREF(&Unpickler_Type); if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0) return NULL; + Py_INCREF(&PyPickleBuffer_Type); + if (PyModule_AddObject(m, "PickleBuffer", + (PyObject *)&PyPickleBuffer_Type) < 0) + return NULL; st = _Pickle_GetState(m); diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h index 1da2f936be43..8ac723fd43a6 100644 --- a/Modules/clinic/_pickle.c.h +++ b/Modules/clinic/_pickle.c.h @@ -63,7 +63,7 @@ _pickle_Pickler___sizeof__(PicklerObject *self, PyObject *Py_UNUSED(ignored)) } PyDoc_STRVAR(_pickle_Pickler___init____doc__, -"Pickler(file, protocol=None, fix_imports=True)\n" +"Pickler(file, protocol=None, fix_imports=True, buffer_callback=None)\n" "--\n" "\n" "This takes a binary file for writing a pickle data stream.\n" @@ -83,27 +83,40 @@ PyDoc_STRVAR(_pickle_Pickler___init____doc__, "\n" "If *fix_imports* is True and protocol is less than 3, pickle will try\n" "to map the new Python 3 names to the old module names used in Python\n" -"2, so that the pickle data stream is readable with Python 2."); +"2, so that the pickle data stream is readable with Python 2.\n" +"\n" +"If *buffer_callback* is None (the default), buffer views are\n" +"serialized into *file* as part of the pickle stream.\n" +"\n" +"If *buffer_callback* is not None, then it can be called any number\n" +"of times with a buffer view. If the callback returns a false value\n" +"(such as None), the given buffer is out-of-band; otherwise the\n" +"buffer is serialized in-band, i.e. inside the pickle stream.\n" +"\n" +"It is an error if *buffer_callback* is not None and *protocol*\n" +"is None or smaller than 5."); static int _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, - PyObject *protocol, int fix_imports); + PyObject *protocol, int fix_imports, + PyObject *buffer_callback); static int _pickle_Pickler___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; - static const char * const _keywords[] = {"file", "protocol", "fix_imports", NULL}; + static const char * const _keywords[] = {"file", "protocol", "fix_imports", "buffer_callback", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "Pickler", 0}; - PyObject *argsbuf[3]; + PyObject *argsbuf[4]; PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *file; PyObject *protocol = NULL; int fix_imports = 1; + PyObject *buffer_callback = NULL; - fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 3, 0, argsbuf); + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 4, 0, argsbuf); if (!fastargs) { goto exit; } @@ -117,12 +130,18 @@ _pickle_Pickler___init__(PyObject *self, PyObject *args, PyObject *kwargs) goto skip_optional_pos; } } - fix_imports = PyObject_IsTrue(fastargs[2]); - if (fix_imports < 0) { - goto exit; + if (fastargs[2]) { + fix_imports = PyObject_IsTrue(fastargs[2]); + if (fix_imports < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } } + buffer_callback = fastargs[3]; skip_optional_pos: - return_value = _pickle_Pickler___init___impl((PicklerObject *)self, file, protocol, fix_imports); + return_value = _pickle_Pickler___init___impl((PicklerObject *)self, file, protocol, fix_imports, buffer_callback); exit: return return_value; @@ -272,7 +291,8 @@ _pickle_Unpickler___sizeof__(UnpicklerObject *self, PyObject *Py_UNUSED(ignored) } PyDoc_STRVAR(_pickle_Unpickler___init____doc__, -"Unpickler(file, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n" +"Unpickler(file, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\',\n" +" buffers=None)\n" "--\n" "\n" "This takes a binary file for reading a pickle data stream.\n" @@ -299,15 +319,15 @@ PyDoc_STRVAR(_pickle_Unpickler___init____doc__, static int _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, - const char *errors); + const char *errors, PyObject *buffers); static int _pickle_Unpickler___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; - static const char * const _keywords[] = {"file", "fix_imports", "encoding", "errors", NULL}; + static const char * const _keywords[] = {"file", "fix_imports", "encoding", "errors", "buffers", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "Unpickler", 0}; - PyObject *argsbuf[4]; + PyObject *argsbuf[5]; PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; @@ -315,6 +335,7 @@ _pickle_Unpickler___init__(PyObject *self, PyObject *args, PyObject *kwargs) int fix_imports = 1; const char *encoding = "ASCII"; const char *errors = "strict"; + PyObject *buffers = NULL; fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf); if (!fastargs) { @@ -351,21 +372,27 @@ _pickle_Unpickler___init__(PyObject *self, PyObject *args, PyObject *kwargs) goto skip_optional_kwonly; } } - if (!PyUnicode_Check(fastargs[3])) { - _PyArg_BadArgument("Unpickler", 4, "str", fastargs[3]); - goto exit; - } - Py_ssize_t errors_length; - errors = PyUnicode_AsUTF8AndSize(fastargs[3], &errors_length); - if (errors == NULL) { - goto exit; - } - if (strlen(errors) != (size_t)errors_length) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto exit; + if (fastargs[3]) { + if (!PyUnicode_Check(fastargs[3])) { + _PyArg_BadArgument("Unpickler", 4, "str", fastargs[3]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(fastargs[3], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } } + buffers = fastargs[4]; skip_optional_kwonly: - return_value = _pickle_Unpickler___init___impl((UnpicklerObject *)self, file, fix_imports, encoding, errors); + return_value = _pickle_Unpickler___init___impl((UnpicklerObject *)self, file, fix_imports, encoding, errors, buffers); exit: return return_value; @@ -426,7 +453,8 @@ _pickle_UnpicklerMemoProxy___reduce__(UnpicklerMemoProxyObject *self, PyObject * } PyDoc_STRVAR(_pickle_dump__doc__, -"dump($module, /, obj, file, protocol=None, *, fix_imports=True)\n" +"dump($module, /, obj, file, protocol=None, *, fix_imports=True,\n" +" buffer_callback=None)\n" "--\n" "\n" "Write a pickled representation of obj to the open file object file.\n" @@ -450,27 +478,33 @@ PyDoc_STRVAR(_pickle_dump__doc__, "\n" "If *fix_imports* is True and protocol is less than 3, pickle will try\n" "to map the new Python 3 names to the old module names used in Python\n" -"2, so that the pickle data stream is readable with Python 2."); +"2, so that the pickle data stream is readable with Python 2.\n" +"\n" +"If *buffer_callback* is None (the default), buffer views are serialized\n" +"into *file* as part of the pickle stream. It is an error if\n" +"*buffer_callback* is not None and *protocol* is None or smaller than 5."); #define _PICKLE_DUMP_METHODDEF \ {"dump", (PyCFunction)(void(*)(void))_pickle_dump, METH_FASTCALL|METH_KEYWORDS, _pickle_dump__doc__}, static PyObject * _pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file, - PyObject *protocol, int fix_imports); + PyObject *protocol, int fix_imports, + PyObject *buffer_callback); static PyObject * _pickle_dump(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"obj", "file", "protocol", "fix_imports", NULL}; + static const char * const _keywords[] = {"obj", "file", "protocol", "fix_imports", "buffer_callback", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "dump", 0}; - PyObject *argsbuf[4]; + PyObject *argsbuf[5]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *obj; PyObject *file; PyObject *protocol = NULL; int fix_imports = 1; + PyObject *buffer_callback = NULL; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); if (!args) { @@ -491,19 +525,26 @@ _pickle_dump(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject if (!noptargs) { goto skip_optional_kwonly; } - fix_imports = PyObject_IsTrue(args[3]); - if (fix_imports < 0) { - goto exit; + if (args[3]) { + fix_imports = PyObject_IsTrue(args[3]); + if (fix_imports < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } } + buffer_callback = args[4]; skip_optional_kwonly: - return_value = _pickle_dump_impl(module, obj, file, protocol, fix_imports); + return_value = _pickle_dump_impl(module, obj, file, protocol, fix_imports, buffer_callback); exit: return return_value; } PyDoc_STRVAR(_pickle_dumps__doc__, -"dumps($module, /, obj, protocol=None, *, fix_imports=True)\n" +"dumps($module, /, obj, protocol=None, *, fix_imports=True,\n" +" buffer_callback=None)\n" "--\n" "\n" "Return the pickled representation of the object as a bytes object.\n" @@ -519,26 +560,31 @@ PyDoc_STRVAR(_pickle_dumps__doc__, "\n" "If *fix_imports* is True and *protocol* is less than 3, pickle will\n" "try to map the new Python 3 names to the old module names used in\n" -"Python 2, so that the pickle data stream is readable with Python 2."); +"Python 2, so that the pickle data stream is readable with Python 2.\n" +"\n" +"If *buffer_callback* is None (the default), buffer views are serialized\n" +"into *file* as part of the pickle stream. It is an error if\n" +"*buffer_callback* is not None and *protocol* is None or smaller than 5."); #define _PICKLE_DUMPS_METHODDEF \ {"dumps", (PyCFunction)(void(*)(void))_pickle_dumps, METH_FASTCALL|METH_KEYWORDS, _pickle_dumps__doc__}, static PyObject * _pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol, - int fix_imports); + int fix_imports, PyObject *buffer_callback); static PyObject * _pickle_dumps(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"obj", "protocol", "fix_imports", NULL}; + static const char * const _keywords[] = {"obj", "protocol", "fix_imports", "buffer_callback", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "dumps", 0}; - PyObject *argsbuf[3]; + PyObject *argsbuf[4]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *obj; PyObject *protocol = NULL; int fix_imports = 1; + PyObject *buffer_callback = NULL; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); if (!args) { @@ -558,12 +604,18 @@ _pickle_dumps(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec if (!noptargs) { goto skip_optional_kwonly; } - fix_imports = PyObject_IsTrue(args[2]); - if (fix_imports < 0) { - goto exit; + if (args[2]) { + fix_imports = PyObject_IsTrue(args[2]); + if (fix_imports < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } } + buffer_callback = args[3]; skip_optional_kwonly: - return_value = _pickle_dumps_impl(module, obj, protocol, fix_imports); + return_value = _pickle_dumps_impl(module, obj, protocol, fix_imports, buffer_callback); exit: return return_value; @@ -571,7 +623,7 @@ _pickle_dumps(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec PyDoc_STRVAR(_pickle_load__doc__, "load($module, /, file, *, fix_imports=True, encoding=\'ASCII\',\n" -" errors=\'strict\')\n" +" errors=\'strict\', buffers=None)\n" "--\n" "\n" "Read and return an object from the pickle data stored in a file.\n" @@ -603,20 +655,22 @@ PyDoc_STRVAR(_pickle_load__doc__, static PyObject * _pickle_load_impl(PyObject *module, PyObject *file, int fix_imports, - const char *encoding, const char *errors); + const char *encoding, const char *errors, + PyObject *buffers); static PyObject * _pickle_load(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"file", "fix_imports", "encoding", "errors", NULL}; + static const char * const _keywords[] = {"file", "fix_imports", "encoding", "errors", "buffers", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "load", 0}; - PyObject *argsbuf[4]; + PyObject *argsbuf[5]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *file; int fix_imports = 1; const char *encoding = "ASCII"; const char *errors = "strict"; + PyObject *buffers = NULL; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); if (!args) { @@ -653,21 +707,27 @@ _pickle_load(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject goto skip_optional_kwonly; } } - if (!PyUnicode_Check(args[3])) { - _PyArg_BadArgument("load", 4, "str", args[3]); - goto exit; - } - Py_ssize_t errors_length; - errors = PyUnicode_AsUTF8AndSize(args[3], &errors_length); - if (errors == NULL) { - goto exit; - } - if (strlen(errors) != (size_t)errors_length) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto exit; + if (args[3]) { + if (!PyUnicode_Check(args[3])) { + _PyArg_BadArgument("load", 4, "str", args[3]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[3], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } } + buffers = args[4]; skip_optional_kwonly: - return_value = _pickle_load_impl(module, file, fix_imports, encoding, errors); + return_value = _pickle_load_impl(module, file, fix_imports, encoding, errors, buffers); exit: return return_value; @@ -675,7 +735,7 @@ _pickle_load(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject PyDoc_STRVAR(_pickle_loads__doc__, "loads($module, /, data, *, fix_imports=True, encoding=\'ASCII\',\n" -" errors=\'strict\')\n" +" errors=\'strict\', buffers=None)\n" "--\n" "\n" "Read and return an object from the given pickle data.\n" @@ -698,20 +758,22 @@ PyDoc_STRVAR(_pickle_loads__doc__, static PyObject * _pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports, - const char *encoding, const char *errors); + const char *encoding, const char *errors, + PyObject *buffers); static PyObject * _pickle_loads(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"data", "fix_imports", "encoding", "errors", NULL}; + static const char * const _keywords[] = {"data", "fix_imports", "encoding", "errors", "buffers", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "loads", 0}; - PyObject *argsbuf[4]; + PyObject *argsbuf[5]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *data; int fix_imports = 1; const char *encoding = "ASCII"; const char *errors = "strict"; + PyObject *buffers = NULL; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); if (!args) { @@ -748,23 +810,29 @@ _pickle_loads(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec goto skip_optional_kwonly; } } - if (!PyUnicode_Check(args[3])) { - _PyArg_BadArgument("loads", 4, "str", args[3]); - goto exit; - } - Py_ssize_t errors_length; - errors = PyUnicode_AsUTF8AndSize(args[3], &errors_length); - if (errors == NULL) { - goto exit; - } - if (strlen(errors) != (size_t)errors_length) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto exit; + if (args[3]) { + if (!PyUnicode_Check(args[3])) { + _PyArg_BadArgument("loads", 4, "str", args[3]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[3], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } } + buffers = args[4]; skip_optional_kwonly: - return_value = _pickle_loads_impl(module, data, fix_imports, encoding, errors); + return_value = _pickle_loads_impl(module, data, fix_imports, encoding, errors, buffers); exit: return return_value; } -/*[clinic end generated code: output=8f972562c8f71e2b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8dc0e862f96c4afe input=a9049054013a1b77]*/ diff --git a/Objects/object.c b/Objects/object.c index f842ab388967..6d79165683e1 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1839,6 +1839,7 @@ _PyTypes_Init(void) INIT_TYPE(&PyMethodDescr_Type, "method descr"); INIT_TYPE(&PyCallIter_Type, "call iter"); INIT_TYPE(&PySeqIter_Type, "sequence iterator"); + INIT_TYPE(&PyPickleBuffer_Type, "pickle.PickleBuffer"); INIT_TYPE(&PyCoro_Type, "coroutine"); INIT_TYPE(&_PyCoroWrapper_Type, "coroutine wrapper"); INIT_TYPE(&_PyInterpreterID_Type, "interpreter ID"); diff --git a/Objects/picklebufobject.c b/Objects/picklebufobject.c new file mode 100644 index 000000000000..a135e5575e28 --- /dev/null +++ b/Objects/picklebufobject.c @@ -0,0 +1,219 @@ +/* PickleBuffer object implementation */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#include + +typedef struct { + PyObject_HEAD + /* The view exported by the original object */ + Py_buffer view; + PyObject *weakreflist; +} PyPickleBufferObject; + +/* C API */ + +PyObject * +PyPickleBuffer_FromObject(PyObject *base) +{ + PyTypeObject *type = &PyPickleBuffer_Type; + PyPickleBufferObject *self; + + self = (PyPickleBufferObject *) type->tp_alloc(type, 0); + if (self == NULL) { + return NULL; + } + self->view.obj = NULL; + self->weakreflist = NULL; + if (PyObject_GetBuffer(base, &self->view, PyBUF_FULL_RO) < 0) { + Py_DECREF(self); + return NULL; + } + return (PyObject *) self; +} + +const Py_buffer * +PyPickleBuffer_GetBuffer(PyObject *obj) +{ + PyPickleBufferObject *self = (PyPickleBufferObject *) obj; + + if (!PyPickleBuffer_Check(obj)) { + PyErr_Format(PyExc_TypeError, + "expected PickleBuffer, %.200s found", + Py_TYPE(obj)->tp_name); + return NULL; + } + if (self->view.obj == NULL) { + PyErr_SetString(PyExc_ValueError, + "operation forbidden on released PickleBuffer object"); + return NULL; + } + return &self->view; +} + +int +PyPickleBuffer_Release(PyObject *obj) +{ + PyPickleBufferObject *self = (PyPickleBufferObject *) obj; + + if (!PyPickleBuffer_Check(obj)) { + PyErr_Format(PyExc_TypeError, + "expected PickleBuffer, %.200s found", + Py_TYPE(obj)->tp_name); + return -1; + } + PyBuffer_Release(&self->view); + return 0; +} + +static PyObject * +picklebuf_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyPickleBufferObject *self; + PyObject *base; + char *keywords[] = {"", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:PickleBuffer", + keywords, &base)) { + return NULL; + } + + self = (PyPickleBufferObject *) type->tp_alloc(type, 0); + if (self == NULL) { + return NULL; + } + self->view.obj = NULL; + self->weakreflist = NULL; + if (PyObject_GetBuffer(base, &self->view, PyBUF_FULL_RO) < 0) { + Py_DECREF(self); + return NULL; + } + return (PyObject *) self; +} + +static int +picklebuf_traverse(PyPickleBufferObject *self, visitproc visit, void *arg) +{ + Py_VISIT(self->view.obj); + return 0; +} + +static int +picklebuf_clear(PyPickleBufferObject *self) +{ + PyBuffer_Release(&self->view); + return 0; +} + +static void +picklebuf_dealloc(PyPickleBufferObject *self) +{ + PyObject_GC_UnTrack(self); + if (self->weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *) self); + PyBuffer_Release(&self->view); + Py_TYPE(self)->tp_free((PyObject *) self); +} + +/* Buffer API */ + +static int +picklebuf_getbuf(PyPickleBufferObject *self, Py_buffer *view, int flags) +{ + if (self->view.obj == NULL) { + PyErr_SetString(PyExc_ValueError, + "operation forbidden on released PickleBuffer object"); + return -1; + } + return PyObject_GetBuffer(self->view.obj, view, flags); +} + +static void +picklebuf_releasebuf(PyPickleBufferObject *self, Py_buffer *view) +{ + /* Since our bf_getbuffer redirects to the original object, this + * implementation is never called. It only exists to signal that + * buffers exported by PickleBuffer have non-trivial releasing + * behaviour (see check in Python/getargs.c). + */ +} + +static PyBufferProcs picklebuf_as_buffer = { + .bf_getbuffer = (getbufferproc) picklebuf_getbuf, + .bf_releasebuffer = (releasebufferproc) picklebuf_releasebuf, +}; + +/* Methods */ + +static PyObject * +picklebuf_raw(PyPickleBufferObject *self, PyObject *Py_UNUSED(ignored)) +{ + if (self->view.obj == NULL) { + PyErr_SetString(PyExc_ValueError, + "operation forbidden on released PickleBuffer object"); + return NULL; + } + if (self->view.suboffsets != NULL + || !PyBuffer_IsContiguous(&self->view, 'A')) { + PyErr_SetString(PyExc_BufferError, + "cannot extract raw buffer from non-contiguous buffer"); + return NULL; + } + PyObject *m = PyMemoryView_FromObject((PyObject *) self); + if (m == NULL) { + return NULL; + } + PyMemoryViewObject *mv = (PyMemoryViewObject *) m; + assert(mv->view.suboffsets == NULL); + /* Mutate memoryview instance to make it a "raw" memoryview */ + mv->view.format = "B"; + mv->view.ndim = 1; + mv->view.itemsize = 1; + /* shape = (length,) */ + mv->view.shape = &mv->view.len; + /* strides = (1,) */ + mv->view.strides = &mv->view.itemsize; + /* Fix memoryview state flags */ + /* XXX Expose memoryobject.c's init_flags() instead? */ + mv->flags = _Py_MEMORYVIEW_C | _Py_MEMORYVIEW_FORTRAN; + return m; +} + +PyDoc_STRVAR(picklebuf_raw_doc, +"raw($self, /)\n--\n\ +\n\ +Return a memoryview of the raw memory underlying this buffer.\n\ +Will raise BufferError is the buffer isn't contiguous."); + +static PyObject * +picklebuf_release(PyPickleBufferObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyBuffer_Release(&self->view); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(picklebuf_release_doc, +"release($self, /)\n--\n\ +\n\ +Release the underlying buffer exposed by the PickleBuffer object."); + +static PyMethodDef picklebuf_methods[] = { + {"raw", (PyCFunction) picklebuf_raw, METH_NOARGS, picklebuf_raw_doc}, + {"release", (PyCFunction) picklebuf_release, METH_NOARGS, picklebuf_release_doc}, + {NULL, NULL} +}; + +PyTypeObject PyPickleBuffer_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "pickle.PickleBuffer", + .tp_doc = "Wrapper for potentially out-of-band buffers", + .tp_basicsize = sizeof(PyPickleBufferObject), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .tp_new = picklebuf_new, + .tp_dealloc = (destructor) picklebuf_dealloc, + .tp_traverse = (traverseproc) picklebuf_traverse, + .tp_clear = (inquiry) picklebuf_clear, + .tp_weaklistoffset = offsetof(PyPickleBufferObject, weakreflist), + .tp_as_buffer = &picklebuf_as_buffer, + .tp_methods = picklebuf_methods, +}; diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 10f51dd431b7..db691cd39c8b 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -197,6 +197,7 @@ + @@ -383,6 +384,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 396d146513d7..dba47e9aa2d1 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -285,6 +285,9 @@ Include + + Include + Include @@ -818,6 +821,9 @@ Objects + + Objects + Objects From webhook-mailer at python.org Sun May 26 13:08:24 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 26 May 2019 17:08:24 -0000 Subject: [Python-checkins] bpo-37053: handle strings like u"bar" correctly in Tools/parser/unparse.py (GH-13583) Message-ID: https://github.com/python/cpython/commit/aaf47caf35984e614d93bd8bea5227df55e0e3e6 commit: aaf47caf35984e614d93bd8bea5227df55e0e3e6 branch: master author: Chih-Hsuan Yen committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-26T10:08:19-07:00 summary: bpo-37053: handle strings like u"bar" correctly in Tools/parser/unparse.py (GH-13583) Constant.kind is added in https://bugs.python.org/issue36280. Current possible values for Constant.kind are "u" or None. For r'bar' and b'bar', Constant.kind value is None, so there's no need for special handling. https://bugs.python.org/issue37053 files: A Misc/NEWS.d/next/Tools-Demos/2019-05-26-16-47-06.bpo-37053.-EYRuz.rst M Lib/test/test_tools/test_unparse.py M Tools/parser/unparse.py diff --git a/Lib/test/test_tools/test_unparse.py b/Lib/test/test_tools/test_unparse.py index f3386f5e31a2..a958ebb51cc3 100644 --- a/Lib/test/test_tools/test_unparse.py +++ b/Lib/test/test_tools/test_unparse.py @@ -139,6 +139,11 @@ def test_fstrings(self): self.check_roundtrip(r"""f'{f"{0}"*3}'""") self.check_roundtrip(r"""f'{f"{y}"*3}'""") + def test_strings(self): + self.check_roundtrip("u'foo'") + self.check_roundtrip("r'foo'") + self.check_roundtrip("b'foo'") + def test_del_statement(self): self.check_roundtrip("del x, y, z") diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-05-26-16-47-06.bpo-37053.-EYRuz.rst b/Misc/NEWS.d/next/Tools-Demos/2019-05-26-16-47-06.bpo-37053.-EYRuz.rst new file mode 100644 index 000000000000..5320dc51f750 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2019-05-26-16-47-06.bpo-37053.-EYRuz.rst @@ -0,0 +1 @@ +Handle strings like u"bar" correctly in Tools/parser/unparse.py. Patch by Chih-Hsuan Yen. \ No newline at end of file diff --git a/Tools/parser/unparse.py b/Tools/parser/unparse.py index 385902ef4bc5..a5cc000676b0 100644 --- a/Tools/parser/unparse.py +++ b/Tools/parser/unparse.py @@ -399,6 +399,8 @@ def _Constant(self, t): elif value is ...: self.write("...") else: + if t.kind == "u": + self.write("u") self._write_constant(t.value) def _List(self, t): From webhook-mailer at python.org Sun May 26 14:27:46 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sun, 26 May 2019 18:27:46 -0000 Subject: [Python-checkins] bpo-36772 Allow lru_cache to be used as decorator without making a function call (GH-13048) Message-ID: https://github.com/python/cpython/commit/b821868e6d909f4805499db519ebc2cdc01cf611 commit: b821868e6d909f4805499db519ebc2cdc01cf611 branch: master author: Raymond Hettinger committer: GitHub date: 2019-05-26T11:27:35-07:00 summary: bpo-36772 Allow lru_cache to be used as decorator without making a function call (GH-13048) files: A Misc/NEWS.d/next/Library/2019-05-01-20-41-53.bpo-36772.fV2K0F.rst M Doc/library/functools.rst M Doc/whatsnew/3.8.rst M Lib/functools.py M Lib/test/test_functools.py diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 16a779fa8368..8b8b1f80a622 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -76,7 +76,8 @@ The :mod:`functools` module defines the following functions: .. versionadded:: 3.2 -.. decorator:: lru_cache(maxsize=128, typed=False) +.. decorator:: lru_cache(user_function) + lru_cache(maxsize=128, typed=False) Decorator to wrap a function with a memoizing callable that saves up to the *maxsize* most recent calls. It can save time when an expensive or I/O bound @@ -90,6 +91,15 @@ The :mod:`functools` module defines the following functions: differ in their keyword argument order and may have two separate cache entries. + If *user_function* is specified, it must be a callable. This allows the + *lru_cache* decorator to be applied directly to a user function, leaving + the *maxsize* at its default value of 128:: + + @lru_cache + def count_vowels(sentence): + sentence = sentence.casefold() + return sum(sentence.count(vowel) for vowel in 'aeiou') + If *maxsize* is set to ``None``, the LRU feature is disabled and the cache can grow without bound. The LRU feature performs best when *maxsize* is a power-of-two. @@ -165,6 +175,9 @@ The :mod:`functools` module defines the following functions: .. versionchanged:: 3.3 Added the *typed* option. + .. versionchanged:: 3.8 + Added the *user_function* option. + .. decorator:: total_ordering Given a class defining one or more rich comparison ordering methods, this diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index a94aba6b2c98..1180469ff28f 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -291,6 +291,23 @@ where the DLL is stored (if a full or partial path is used to load the initial DLL) and paths added by :func:`~os.add_dll_directory`. +functools +--------- + +:func:`functools.lru_cache` can now be used as a straight decorator rather +than as a function returning a decorator. So both of these are now supported:: + + @lru_cache + def f(x): + ... + + @lru_cache(maxsize=256) + def f(x): + ... + +(Contributed by Raymond Hettinger in :issue:`36772`.) + + datetime -------- diff --git a/Lib/functools.py b/Lib/functools.py index c863341eec5f..30964a6fe3d8 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -518,14 +518,18 @@ def lru_cache(maxsize=128, typed=False): # The internals of the lru_cache are encapsulated for thread safety and # to allow the implementation to change (including a possible C version). - # Early detection of an erroneous call to @lru_cache without any arguments - # resulting in the inner function being passed to maxsize instead of an - # integer or None. Negative maxsize is treated as 0. if isinstance(maxsize, int): + # Negative maxsize is treated as 0 if maxsize < 0: maxsize = 0 + elif callable(maxsize) and isinstance(typed, bool): + # The user_function was passed in directly via the maxsize argument + user_function, maxsize = maxsize, 128 + wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) + return update_wrapper(wrapper, user_function) elif maxsize is not None: - raise TypeError('Expected maxsize to be an integer or None') + raise TypeError( + 'Expected first argument to be an integer, a callable, or None') def decorating_function(user_function): wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index b89d77967a0d..8fee1c6afdd4 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -1251,6 +1251,18 @@ def f(x): self.assertEqual(misses, 4) self.assertEqual(currsize, 2) + def test_lru_no_args(self): + @self.module.lru_cache + def square(x): + return x ** 2 + + self.assertEqual(list(map(square, [10, 20, 10])), + [100, 400, 100]) + self.assertEqual(square.cache_info().hits, 1) + self.assertEqual(square.cache_info().misses, 2) + self.assertEqual(square.cache_info().maxsize, 128) + self.assertEqual(square.cache_info().currsize, 2) + def test_lru_bug_35780(self): # C version of the lru_cache was not checking to see if # the user function call has already modified the cache @@ -1582,13 +1594,6 @@ def __eq__(self, other): self.assertEqual(test_func(DoubleEq(2)), # Trigger a re-entrant __eq__ call DoubleEq(2)) # Verify the correct return value - def test_early_detection_of_bad_call(self): - # Issue #22184 - with self.assertRaises(TypeError): - @functools.lru_cache - def f(): - pass - def test_lru_method(self): class X(int): f_cnt = 0 diff --git a/Misc/NEWS.d/next/Library/2019-05-01-20-41-53.bpo-36772.fV2K0F.rst b/Misc/NEWS.d/next/Library/2019-05-01-20-41-53.bpo-36772.fV2K0F.rst new file mode 100644 index 000000000000..00b8a684f9a7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-01-20-41-53.bpo-36772.fV2K0F.rst @@ -0,0 +1,2 @@ +functools.lru_cache() can now be used as a straight decorator in +addition to its existing usage as a function that returns a decorator. From webhook-mailer at python.org Sun May 26 18:14:39 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 26 May 2019 22:14:39 -0000 Subject: [Python-checkins] [3.7] bpo-28866: No type cache for types with specialized mro, invalidation is hard. (GH-13157) (GH-13589) Message-ID: https://github.com/python/cpython/commit/bfd0b7720196b9ff647cc33dafbd31a04496402c commit: bfd0b7720196b9ff647cc33dafbd31a04496402c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-26T15:14:23-07:00 summary: [3.7] bpo-28866: No type cache for types with specialized mro, invalidation is hard. (GH-13157) (GH-13589) * No type cache for types with specialized mro, invalidation is hard. * FIX: Don't disable method cache custom types that do not implement mro(). * fixing implem. * Avoid storing error flags, also decref. * news entry * Clear as soon as we're getting an error. * FIX: Reference leak. (cherry picked from commit 180dc1b0f4a57c3f66351568ae8488fa8576d7f0) Co-authored-by: Julien Palard https://bugs.python.org/issue28866 files: A Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst M Objects/typeobject.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst new file mode 100644 index 000000000000..69017293649c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst @@ -0,0 +1,2 @@ +Avoid caching attributes of classes which type defines mro() to avoid a hard +cache invalidation problem. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 8adae49a7f27..9dba45ac6f7b 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -77,6 +77,9 @@ slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void clear_slotdefs(void); +static PyObject * +lookup_maybe_method(PyObject *self, _Py_Identifier *attrid, int *unbound); + /* * finds the beginning of the docstring's introspection signature. * if present, returns a pointer pointing to the first '('. @@ -281,17 +284,35 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { Unset HAVE_VERSION_TAG and VALID_VERSION_TAG if the type has a custom MRO that includes a type which is not officially - super type. + super type, or if the type implements its own mro() method. Called from mro_internal, which will subsequently be called on each subclass when their mro is recursively updated. */ Py_ssize_t i, n; - int clear = 0; + int custom = (Py_TYPE(type) != &PyType_Type); + int unbound; + PyObject *mro_meth = NULL; + PyObject *type_mro_meth = NULL; if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) return; + if (custom) { + _Py_IDENTIFIER(mro); + mro_meth = lookup_maybe_method( + (PyObject *)type, &PyId_mro, &unbound); + if (mro_meth == NULL) + goto clear; + type_mro_meth = lookup_maybe_method( + (PyObject *)&PyType_Type, &PyId_mro, &unbound); + if (type_mro_meth == NULL) + goto clear; + if (mro_meth != type_mro_meth) + goto clear; + Py_XDECREF(mro_meth); + Py_XDECREF(type_mro_meth); + } n = PyTuple_GET_SIZE(bases); for (i = 0; i < n; i++) { PyObject *b = PyTuple_GET_ITEM(bases, i); @@ -302,14 +323,15 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { if (!PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) || !PyType_IsSubtype(type, cls)) { - clear = 1; - break; + goto clear; } } - - if (clear) - type->tp_flags &= ~(Py_TPFLAGS_HAVE_VERSION_TAG| - Py_TPFLAGS_VALID_VERSION_TAG); + return; + clear: + Py_XDECREF(mro_meth); + Py_XDECREF(type_mro_meth); + type->tp_flags &= ~(Py_TPFLAGS_HAVE_VERSION_TAG| + Py_TPFLAGS_VALID_VERSION_TAG); } static int From webhook-mailer at python.org Sun May 26 19:54:17 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Sun, 26 May 2019 23:54:17 -0000 Subject: [Python-checkins] Add one more test for typing.Final (GH-13588) Message-ID: https://github.com/python/cpython/commit/2f0bfd27a5e3a9a7cbeb2ddd45ce50c3d4bdb4e9 commit: 2f0bfd27a5e3a9a7cbeb2ddd45ce50c3d4bdb4e9 branch: master author: Ivan Levkivskyi committer: GitHub date: 2019-05-27T00:54:13+01:00 summary: Add one more test for typing.Final (GH-13588) files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 088db9c01206..46b7621182d6 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -1772,6 +1772,11 @@ def test_default_globals(self): hints = get_type_hints(ns['C'].foo) self.assertEqual(hints, {'a': ns['C'], 'return': ns['D']}) + def test_final_forward_ref(self): + self.assertEqual(gth(Loop, globals())['attr'], Final[Loop]) + self.assertNotEqual(gth(Loop, globals())['attr'], Final[int]) + self.assertNotEqual(gth(Loop, globals())['attr'], Final) + class OverloadTests(BaseTestCase): @@ -1858,6 +1863,9 @@ class CSub(B): class G(Generic[T]): lst: ClassVar[List[T]] = [] +class Loop: + attr: Final['Loop'] + class NoneAndForward: parent: 'NoneAndForward' meaning: None From webhook-mailer at python.org Mon May 27 02:57:21 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 27 May 2019 06:57:21 -0000 Subject: [Python-checkins] bpo-36829: Add _PyErr_WriteUnraisableMsg() (GH-13488) Message-ID: https://github.com/python/cpython/commit/71c52e3048dd07567f0c690eab4e5d57be66f534 commit: 71c52e3048dd07567f0c690eab4e5d57be66f534 branch: master author: Victor Stinner committer: GitHub date: 2019-05-27T08:57:14+02:00 summary: bpo-36829: Add _PyErr_WriteUnraisableMsg() (GH-13488) * sys.unraisablehook: add 'err_msg' field to UnraisableHookArgs. * Use _PyErr_WriteUnraisableMsg() in _ctypes _DictRemover_call() and gc delete_garbage(). files: M Doc/library/sys.rst M Include/cpython/pyerrors.h M Lib/test/test_sys.py M Modules/_ctypes/_ctypes.c M Modules/_testcapimodule.c M Modules/gcmodule.c M Python/clinic/sysmodule.c.h M Python/errors.c M Python/sysmodule.c diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 0294f74368c0..51a208ee6040 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1566,11 +1566,16 @@ always available. * *exc_type*: Exception type. * *exc_value*: Exception value, can be ``None``. * *exc_traceback*: Exception traceback, can be ``None``. + * *err_msg*: Error message, can be ``None``. * *object*: Object causing the exception, can be ``None``. :func:`sys.unraisablehook` can be overridden to control how unraisable exceptions are handled. + The default hook formats *err_msg* and *object* as: + ``f'{err_msg}: {object!r}'``; use "Exception ignored in" error message + if *err_msg* is ``None``. + See also :func:`excepthook` which handles uncaught exceptions. .. versionadded:: 3.8 diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index de6548dc9c0b..6b0ccedac52d 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -171,6 +171,9 @@ PyAPI_FUNC(PyObject *) _PyUnicodeTranslateError_Create( const char *reason /* UTF-8 encoded string */ ); +PyAPI_FUNC(void) _PyErr_WriteUnraisableMsg( + const char *err_msg, + PyObject *obj); #ifdef __cplusplus } diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 1e5f168f30bd..dfe63b1aade2 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -878,31 +878,38 @@ def test__enablelegacywindowsfsencoding(self): @test.support.cpython_only class UnraisableHookTest(unittest.TestCase): - def write_unraisable_exc(self, exc, obj): + def write_unraisable_exc(self, exc, err_msg, obj): import _testcapi import types + err_msg2 = f"Exception ignored {err_msg}" try: - _testcapi.write_unraisable_exc(exc, obj) + _testcapi.write_unraisable_exc(exc, err_msg, obj) return types.SimpleNamespace(exc_type=type(exc), exc_value=exc, exc_traceback=exc.__traceback__, + err_msg=err_msg2, object=obj) finally: # Explicitly break any reference cycle exc = None def test_original_unraisablehook(self): - obj = "an object" - - with test.support.captured_output("stderr") as stderr: - with test.support.swap_attr(sys, 'unraisablehook', - sys.__unraisablehook__): - self.write_unraisable_exc(ValueError(42), obj) - - err = stderr.getvalue() - self.assertIn(f'Exception ignored in: {obj!r}\n', err) - self.assertIn('Traceback (most recent call last):\n', err) - self.assertIn('ValueError: 42\n', err) + for err_msg in (None, "original hook"): + with self.subTest(err_msg=err_msg): + obj = "an object" + + with test.support.captured_output("stderr") as stderr: + with test.support.swap_attr(sys, 'unraisablehook', + sys.__unraisablehook__): + self.write_unraisable_exc(ValueError(42), err_msg, obj) + + err = stderr.getvalue() + if err_msg is not None: + self.assertIn(f'Exception ignored {err_msg}: {obj!r}\n', err) + else: + self.assertIn(f'Exception ignored in: {obj!r}\n', err) + self.assertIn('Traceback (most recent call last):\n', err) + self.assertIn('ValueError: 42\n', err) def test_original_unraisablehook_err(self): # bpo-22836: PyErr_WriteUnraisable() should give sensible reports @@ -962,8 +969,9 @@ def hook_func(args): obj = object() try: with test.support.swap_attr(sys, 'unraisablehook', hook_func): - expected = self.write_unraisable_exc(ValueError(42), obj) - for attr in "exc_type exc_value exc_traceback object".split(): + expected = self.write_unraisable_exc(ValueError(42), + "custom hook", obj) + for attr in "exc_type exc_value exc_traceback err_msg object".split(): self.assertEqual(getattr(hook_args, attr), getattr(expected, attr), (hook_args, expected)) @@ -978,10 +986,12 @@ def hook_func(*args): with test.support.captured_output("stderr") as stderr: with test.support.swap_attr(sys, 'unraisablehook', hook_func): - self.write_unraisable_exc(ValueError(42), None) + self.write_unraisable_exc(ValueError(42), + "custom hook fail", None) err = stderr.getvalue() - self.assertIn(f'Exception ignored in: {hook_func!r}\n', + self.assertIn(f'Exception ignored in sys.unraisablehook: ' + f'{hook_func!r}\n', err) self.assertIn('Traceback (most recent call last):\n', err) self.assertIn('Exception: hook_func failed\n', err) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index f4eb53657dd4..21b08f8e332d 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -150,9 +150,9 @@ _DictRemover_call(PyObject *myself, PyObject *args, PyObject *kw) { DictRemoverObject *self = (DictRemoverObject *)myself; if (self->key && self->dict) { - if (-1 == PyDict_DelItem(self->dict, self->key)) - /* XXX Error context */ - PyErr_WriteUnraisable(Py_None); + if (-1 == PyDict_DelItem(self->dict, self->key)) { + _PyErr_WriteUnraisableMsg("on calling _ctypes.DictRemover", NULL); + } Py_CLEAR(self->key); Py_CLEAR(self->dict); } diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 7945f498f9e2..51e5d80d1f51 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4985,13 +4985,24 @@ negative_refcount(PyObject *self, PyObject *Py_UNUSED(args)) static PyObject* test_write_unraisable_exc(PyObject *self, PyObject *args) { - PyObject *exc, *obj; - if (!PyArg_ParseTuple(args, "OO", &exc, &obj)) { + PyObject *exc, *err_msg, *obj; + if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) { return NULL; } + const char *err_msg_utf8; + if (err_msg != Py_None) { + err_msg_utf8 = PyUnicode_AsUTF8(err_msg); + if (err_msg_utf8 == NULL) { + return NULL; + } + } + else { + err_msg_utf8 = NULL; + } + PyErr_SetObject((PyObject *)Py_TYPE(exc), exc); - PyErr_WriteUnraisable(obj); + _PyErr_WriteUnraisableMsg(err_msg_utf8, obj); Py_RETURN_NONE; } diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index be9b73a84460..3b15c7ba5b62 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -929,9 +929,8 @@ delete_garbage(struct _gc_runtime_state *state, Py_INCREF(op); (void) clear(op); if (PyErr_Occurred()) { - PySys_WriteStderr("Exception ignored in tp_clear of " - "%.50s\n", Py_TYPE(op)->tp_name); - PyErr_WriteUnraisable(NULL); + _PyErr_WriteUnraisableMsg("in tp_clear of", + (PyObject*)Py_TYPE(op)); } Py_DECREF(op); } diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index 2a4ec72b0dc3..5df8af1a1172 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -106,9 +106,10 @@ PyDoc_STRVAR(sys_unraisablehook__doc__, "The unraisable argument has the following attributes:\n" "\n" "* exc_type: Exception type.\n" -"* exc_value: Exception value.\n" -"* exc_tb: Exception traceback, can be None.\n" -"* obj: Object causing the exception, can be None."); +"* exc_value: Exception value, can be None.\n" +"* exc_traceback: Exception traceback, can be None.\n" +"* err_msg: Error message, can be None.\n" +"* object: Object causing the exception, can be None."); #define SYS_UNRAISABLEHOOK_METHODDEF \ {"unraisablehook", (PyCFunction)sys_unraisablehook, METH_O, sys_unraisablehook__doc__}, @@ -1108,4 +1109,4 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=3c32bc91ec659509 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=03da2eb03135d9f2 input=a9049054013a1b77]*/ diff --git a/Python/errors.c b/Python/errors.c index e721f1915da4..831f111eead2 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1077,6 +1077,7 @@ static PyStructSequence_Field UnraisableHookArgs_fields[] = { {"exc_type", "Exception type"}, {"exc_value", "Exception value"}, {"exc_traceback", "Exception traceback"}, + {"err_msg", "Error message"}, {"object", "Object causing the exception"}, {0} }; @@ -1085,7 +1086,7 @@ static PyStructSequence_Desc UnraisableHookArgs_desc = { .name = "UnraisableHookArgs", .doc = UnraisableHookArgs__doc__, .fields = UnraisableHookArgs_fields, - .n_in_sequence = 4 + .n_in_sequence = 5 }; @@ -1104,7 +1105,8 @@ _PyErr_Init(void) static PyObject * make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type, - PyObject *exc_value, PyObject *exc_tb, PyObject *obj) + PyObject *exc_value, PyObject *exc_tb, + PyObject *err_msg, PyObject *obj) { PyObject *args = PyStructSequence_New(&UnraisableHookArgsType); if (args == NULL) { @@ -1125,6 +1127,7 @@ make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type, ADD_ITEM(exc_type); ADD_ITEM(exc_value); ADD_ITEM(exc_tb); + ADD_ITEM(err_msg); ADD_ITEM(obj); #undef ADD_ITEM @@ -1145,11 +1148,21 @@ make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type, static int write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, PyObject *exc_value, PyObject *exc_tb, - PyObject *obj, PyObject *file) + PyObject *err_msg, PyObject *obj, PyObject *file) { if (obj != NULL && obj != Py_None) { - if (PyFile_WriteString("Exception ignored in: ", file) < 0) { - return -1; + if (err_msg != NULL && err_msg != Py_None) { + if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) { + return -1; + } + if (PyFile_WriteString(": ", file) < 0) { + return -1; + } + } + else { + if (PyFile_WriteString("Exception ignored in: ", file) < 0) { + return -1; + } } if (PyFile_WriteObject(obj, file, 0) < 0) { @@ -1162,6 +1175,14 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, return -1; } } + else if (err_msg != NULL && err_msg != Py_None) { + if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) { + return -1; + } + if (PyFile_WriteString(":\n", file) < 0) { + return -1; + } + } if (exc_tb != NULL && exc_tb != Py_None) { if (PyTraceBack_Print(exc_tb, file) < 0) { @@ -1178,8 +1199,9 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, const char *className = PyExceptionClass_Name(exc_type); if (className != NULL) { const char *dot = strrchr(className, '.'); - if (dot != NULL) + if (dot != NULL) { className = dot+1; + } } _Py_IDENTIFIER(__module__); @@ -1238,7 +1260,8 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, static int write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type, - PyObject *exc_value, PyObject *exc_tb, PyObject *obj) + PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg, + PyObject *obj) { PyObject *file = _PySys_GetObjectId(&PyId_stderr); if (file == NULL || file == Py_None) { @@ -1249,7 +1272,7 @@ write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type, while we use it */ Py_INCREF(file); int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb, - obj, file); + err_msg, obj, file); Py_DECREF(file); return res; @@ -1272,9 +1295,10 @@ _PyErr_WriteUnraisableDefaultHook(PyObject *args) PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0); PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1); PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2); - PyObject *obj = PyStructSequence_GET_ITEM(args, 3); + PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3); + PyObject *obj = PyStructSequence_GET_ITEM(args, 4); - if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, obj) < 0) { + if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) { return NULL; } Py_RETURN_NONE; @@ -1287,13 +1311,18 @@ _PyErr_WriteUnraisableDefaultHook(PyObject *args) for Python to handle it. For example, when a destructor raises an exception or during garbage collection (gc.collect()). + If err_msg_str is non-NULL, the error message is formatted as: + "Exception ignored %s" % err_msg_str. Otherwise, use "Exception ignored in" + error message. + An exception must be set when calling this function. */ void -PyErr_WriteUnraisable(PyObject *obj) +_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) { PyThreadState *tstate = _PyThreadState_GET(); assert(tstate != NULL); + PyObject *err_msg = NULL; PyObject *exc_type, *exc_value, *exc_tb; _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); @@ -1322,13 +1351,20 @@ PyErr_WriteUnraisable(PyObject *obj) } } + if (err_msg_str != NULL) { + err_msg = PyUnicode_FromFormat("Exception ignored %s", err_msg_str); + if (err_msg == NULL) { + PyErr_Clear(); + } + } + _Py_IDENTIFIER(unraisablehook); PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook); if (hook != NULL && hook != Py_None) { PyObject *hook_args; hook_args = make_unraisable_hook_args(tstate, exc_type, exc_value, - exc_tb, obj); + exc_tb, err_msg, obj); if (hook_args != NULL) { PyObject *args[1] = {hook_args}; PyObject *res = _PyObject_FastCall(hook, args, 1); @@ -1337,6 +1373,18 @@ PyErr_WriteUnraisable(PyObject *obj) Py_DECREF(res); goto done; } + + err_msg_str = "Exception ignored in sys.unraisablehook"; + } + else { + err_msg_str = ("Exception ignored on building " + "sys.unraisablehook arguments"); + } + + Py_XDECREF(err_msg); + err_msg = PyUnicode_FromString(err_msg_str); + if (err_msg == NULL) { + PyErr_Clear(); } /* sys.unraisablehook failed: log its error using default hook */ @@ -1350,15 +1398,25 @@ PyErr_WriteUnraisable(PyObject *obj) default_hook: /* Call the default unraisable hook (ignore failure) */ - (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, obj); + (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, + err_msg, obj); done: Py_XDECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); + Py_XDECREF(err_msg); _PyErr_Clear(tstate); /* Just in case */ } + +void +PyErr_WriteUnraisable(PyObject *obj) +{ + _PyErr_WriteUnraisableMsg(NULL, obj); +} + + extern PyObject *PyModule_GetWarningsModule(void); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 5ebeacf0b7f3..08a1a2995e00 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -689,14 +689,15 @@ Handle an unraisable exception. The unraisable argument has the following attributes: * exc_type: Exception type. -* exc_value: Exception value. -* exc_tb: Exception traceback, can be None. -* obj: Object causing the exception, can be None. +* exc_value: Exception value, can be None. +* exc_traceback: Exception traceback, can be None. +* err_msg: Error message, can be None. +* object: Object causing the exception, can be None. [clinic start generated code]*/ static PyObject * sys_unraisablehook(PyObject *module, PyObject *unraisable) -/*[clinic end generated code: output=bb92838b32abaa14 input=fdbdb47fdd0bee06]*/ +/*[clinic end generated code: output=bb92838b32abaa14 input=ec3af148294af8d3]*/ { return _PyErr_WriteUnraisableDefaultHook(unraisable); } From webhook-mailer at python.org Mon May 27 07:42:46 2019 From: webhook-mailer at python.org (Yury Selivanov) Date: Mon, 27 May 2019 11:42:46 -0000 Subject: [Python-checkins] bpo-37028: asyncio REPL; activated via 'python -m asyncio'. (GH-13472) Message-ID: https://github.com/python/cpython/commit/16cefb0bc7b05c08caf08525398ff178c35dece4 commit: 16cefb0bc7b05c08caf08525398ff178c35dece4 branch: master author: Yury Selivanov committer: GitHub date: 2019-05-27T13:42:29+02:00 summary: bpo-37028: asyncio REPL; activated via 'python -m asyncio'. (GH-13472) This makes it easy to play with asyncio APIs with simply using async/await in the REPL. files: A Lib/asyncio/__main__.py A Misc/NEWS.d/next/Library/2019-05-23-18-57-34.bpo-37028.Vse6Pj.rst diff --git a/Lib/asyncio/__main__.py b/Lib/asyncio/__main__.py new file mode 100644 index 000000000000..18bb87a5bc4f --- /dev/null +++ b/Lib/asyncio/__main__.py @@ -0,0 +1,125 @@ +import ast +import asyncio +import code +import concurrent.futures +import inspect +import sys +import threading +import types +import warnings + +from . import futures + + +class AsyncIOInteractiveConsole(code.InteractiveConsole): + + def __init__(self, locals, loop): + super().__init__(locals) + self.compile.compiler.flags |= ast.PyCF_ALLOW_TOP_LEVEL_AWAIT + + self.loop = loop + + def runcode(self, code): + future = concurrent.futures.Future() + + def callback(): + global repl_future + global repl_future_interrupted + + repl_future = None + repl_future_interrupted = False + + func = types.FunctionType(code, self.locals) + try: + coro = func() + except SystemExit: + raise + except KeyboardInterrupt as ex: + repl_future_interrupted = True + future.set_exception(ex) + return + except BaseException as ex: + future.set_exception(ex) + return + + if not inspect.iscoroutine(coro): + future.set_result(coro) + return + + try: + repl_future = self.loop.create_task(coro) + futures._chain_future(repl_future, future) + except BaseException as exc: + future.set_exception(exc) + + loop.call_soon_threadsafe(callback) + + try: + return future.result() + except SystemExit: + raise + except BaseException: + if repl_future_interrupted: + self.write("\nKeyboardInterrupt\n") + else: + self.showtraceback() + + +class REPLThread(threading.Thread): + + def run(self): + try: + banner = ( + f'asyncio REPL {sys.version} on {sys.platform}\n' + f'Use "await" directly instead of "asyncio.run()".\n' + f'Type "help", "copyright", "credits" or "license" ' + f'for more information.\n' + f'{getattr(sys, "ps1", ">>> ")}import asyncio' + ) + + console.interact( + banner=banner, + exitmsg='exiting asyncio REPL...') + finally: + warnings.filterwarnings( + 'ignore', + message=r'^coroutine .* was never awaited$', + category=RuntimeWarning) + + loop.call_soon_threadsafe(loop.stop) + + +if __name__ == '__main__': + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + repl_locals = {'asyncio': asyncio} + for key in {'__name__', '__package__', + '__loader__', '__spec__', + '__builtins__', '__file__'}: + repl_locals[key] = locals()[key] + + console = AsyncIOInteractiveConsole(repl_locals, loop) + + repl_future = None + repl_future_interrupted = False + + try: + import readline # NoQA + except ImportError: + pass + + repl_thread = REPLThread() + repl_thread.daemon = True + repl_thread.start() + + while True: + try: + loop.run_forever() + except KeyboardInterrupt: + if repl_future and not repl_future.done(): + repl_future.cancel() + repl_future_interrupted = True + continue + else: + break diff --git a/Misc/NEWS.d/next/Library/2019-05-23-18-57-34.bpo-37028.Vse6Pj.rst b/Misc/NEWS.d/next/Library/2019-05-23-18-57-34.bpo-37028.Vse6Pj.rst new file mode 100644 index 000000000000..d9db21fb6f3c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-23-18-57-34.bpo-37028.Vse6Pj.rst @@ -0,0 +1 @@ +Implement asyncio REPL From webhook-mailer at python.org Mon May 27 08:45:16 2019 From: webhook-mailer at python.org (Yury Selivanov) Date: Mon, 27 May 2019 12:45:16 -0000 Subject: [Python-checkins] bpo-32528: Make asyncio.CancelledError a BaseException. (GH-13528) Message-ID: https://github.com/python/cpython/commit/431b540bf79f0982559b1b0e420b1b085f667bb7 commit: 431b540bf79f0982559b1b0e420b1b085f667bb7 branch: master author: Yury Selivanov committer: GitHub date: 2019-05-27T14:45:12+02:00 summary: bpo-32528: Make asyncio.CancelledError a BaseException. (GH-13528) This will address the common mistake many asyncio users make: an "except Exception" clause breaking Tasks cancellation. In addition to this change, we stop inheriting asyncio.TimeoutError and asyncio.InvalidStateError from their concurrent.futures.* counterparts. There's no point for these exceptions to share the inheritance chain. In 3.9 we'll focus on implementing supervisors and cancel scopes, which should allow better handling of all exceptions, including SystemExit and KeyboardInterrupt files: A Misc/NEWS.d/next/Library/2019-05-23-17-37-22.bpo-32528.sGnkcl.rst M Lib/asyncio/base_events.py M Lib/asyncio/base_subprocess.py M Lib/asyncio/events.py M Lib/asyncio/exceptions.py M Lib/asyncio/proactor_events.py M Lib/asyncio/selector_events.py M Lib/asyncio/sslproto.py M Lib/asyncio/staggered.py M Lib/asyncio/tasks.py M Lib/asyncio/transports.py M Lib/asyncio/unix_events.py M Lib/asyncio/windows_events.py M Lib/test/test_asyncio/test_base_events.py M Lib/test/test_asyncio/test_tasks.py M Modules/_asynciomodule.c diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index de9fa4f4f7f3..63b072b851e3 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -186,7 +186,7 @@ def _interleave_addrinfos(addrinfos, first_address_family_count=1): def _run_until_complete_cb(fut): if not fut.cancelled(): exc = fut.exception() - if isinstance(exc, BaseException) and not isinstance(exc, Exception): + if isinstance(exc, (SystemExit, KeyboardInterrupt)): # Issue #22429: run_forever() already finished, no need to # stop it. return @@ -1196,7 +1196,7 @@ def _check_sendfile_params(self, sock, file, offset, count): try: await waiter - except Exception: + except BaseException: transport.close() conmade_cb.cancel() resume_cb.cancel() @@ -1710,7 +1710,9 @@ def call_exception_handler(self, context): if self._exception_handler is None: try: self.default_exception_handler(context) - except Exception: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException: # Second protection layer for unexpected errors # in the default implementation, as well as for subclassed # event loops with overloaded "default_exception_handler". @@ -1719,7 +1721,9 @@ def call_exception_handler(self, context): else: try: self._exception_handler(self, context) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: # Exception in the user set custom exception handler. try: # Let's try default handler. @@ -1728,7 +1732,9 @@ def call_exception_handler(self, context): 'exception': exc, 'context': context, }) - except Exception: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException: # Guard 'default_exception_handler' in case it is # overloaded. logger.error('Exception in default exception handler ' diff --git a/Lib/asyncio/base_subprocess.py b/Lib/asyncio/base_subprocess.py index f503f78fdda3..14d505192288 100644 --- a/Lib/asyncio/base_subprocess.py +++ b/Lib/asyncio/base_subprocess.py @@ -182,7 +182,9 @@ def kill(self): for callback, data in self._pending_calls: loop.call_soon(callback, *data) self._pending_calls = None - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: if waiter is not None and not waiter.cancelled(): waiter.set_exception(exc) else: diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 9a923514db09..d381b1c59623 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -79,7 +79,9 @@ def cancelled(self): def _run(self): try: self._context.run(self._callback, *self._args) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: cb = format_helpers._format_callback_source( self._callback, self._args) msg = f'Exception in callback {cb}' diff --git a/Lib/asyncio/exceptions.py b/Lib/asyncio/exceptions.py index cac31a54d253..e03602ef5762 100644 --- a/Lib/asyncio/exceptions.py +++ b/Lib/asyncio/exceptions.py @@ -5,19 +5,16 @@ 'IncompleteReadError', 'LimitOverrunError', 'SendfileNotAvailableError') -import concurrent.futures -from . import base_futures - -class CancelledError(concurrent.futures.CancelledError): +class CancelledError(BaseException): """The Future or Task was cancelled.""" -class TimeoutError(concurrent.futures.TimeoutError): +class TimeoutError(Exception): """The operation exceeded the given deadline.""" -class InvalidStateError(concurrent.futures.InvalidStateError): +class InvalidStateError(Exception): """The operation is not allowed in this state.""" diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index a849be1cc147..7dfe29579a0d 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -212,7 +212,9 @@ def _eof_received(self): try: keep_open = self._protocol.eof_received() - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error( exc, 'Fatal error: protocol.eof_received() call failed.') return @@ -235,7 +237,9 @@ def _data_received(self, data): if isinstance(self._protocol, protocols.BufferedProtocol): try: protocols._feed_data_to_buffered_proto(self._protocol, data) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error(exc, 'Fatal error: protocol.buffer_updated() ' 'call failed.') @@ -625,7 +629,9 @@ def _loop_self_reading(self, f=None): except exceptions.CancelledError: # _close_self_pipe() has been called, stop waiting for data return - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self.call_exception_handler({ 'message': 'Error on reading from the event loop self pipe', 'exception': exc, diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 6461d3077633..f5f43a9bfef3 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -208,12 +208,14 @@ def _accept_connection( try: await waiter - except: + except BaseException: transport.close() raise + # It's now up to the protocol to handle the connection. - # It's now up to the protocol to handle the connection. - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: if self._debug: context = { 'message': @@ -370,7 +372,9 @@ def _sock_recv(self, fut, sock, n): data = sock.recv(n) except (BlockingIOError, InterruptedError): return # try again next time - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: fut.set_exception(exc) else: fut.set_result(data) @@ -404,7 +408,9 @@ def _sock_recv_into(self, fut, sock, buf): nbytes = sock.recv_into(buf) except (BlockingIOError, InterruptedError): return # try again next time - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: fut.set_exception(exc) else: fut.set_result(nbytes) @@ -447,7 +453,9 @@ def _sock_sendall(self, fut, sock, view, pos): n = sock.send(view[start:]) except (BlockingIOError, InterruptedError): return - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: fut.set_exception(exc) return @@ -487,7 +495,9 @@ def _sock_connect(self, fut, sock, address): fut.add_done_callback( functools.partial(self._sock_write_done, fd)) self.add_writer(fd, self._sock_connect_cb, fut, sock, address) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: fut.set_exception(exc) else: fut.set_result(None) @@ -507,7 +517,9 @@ def _sock_connect_cb(self, fut, sock, address): except (BlockingIOError, InterruptedError): # socket is still registered, the callback will be retried later pass - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: fut.set_exception(exc) else: fut.set_result(None) @@ -537,7 +549,9 @@ def _sock_accept(self, fut, registered, sock): conn.setblocking(False) except (BlockingIOError, InterruptedError): self.add_reader(fd, self._sock_accept, fut, True, sock) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: fut.set_exception(exc) else: fut.set_result((conn, address)) @@ -785,7 +799,9 @@ def _read_ready__get_buffer(self): buf = self._protocol.get_buffer(-1) if not len(buf): raise RuntimeError('get_buffer() returned an empty buffer') - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error( exc, 'Fatal error: protocol.get_buffer() call failed.') return @@ -794,7 +810,9 @@ def _read_ready__get_buffer(self): nbytes = self._sock.recv_into(buf) except (BlockingIOError, InterruptedError): return - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error(exc, 'Fatal read error on socket transport') return @@ -804,7 +822,9 @@ def _read_ready__get_buffer(self): try: self._protocol.buffer_updated(nbytes) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error( exc, 'Fatal error: protocol.buffer_updated() call failed.') @@ -815,7 +835,9 @@ def _read_ready__data_received(self): data = self._sock.recv(self.max_size) except (BlockingIOError, InterruptedError): return - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error(exc, 'Fatal read error on socket transport') return @@ -825,7 +847,9 @@ def _read_ready__data_received(self): try: self._protocol.data_received(data) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error( exc, 'Fatal error: protocol.data_received() call failed.') @@ -835,7 +859,9 @@ def _read_ready__on_eof(self): try: keep_open = self._protocol.eof_received() - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error( exc, 'Fatal error: protocol.eof_received() call failed.') return @@ -871,7 +897,9 @@ def write(self, data): n = self._sock.send(data) except (BlockingIOError, InterruptedError): pass - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error(exc, 'Fatal write error on socket transport') return else: @@ -894,7 +922,9 @@ def _write_ready(self): n = self._sock.send(self._buffer) except (BlockingIOError, InterruptedError): pass - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._loop._remove_writer(self._sock_fd) self._buffer.clear() self._fatal_error(exc, 'Fatal write error on socket transport') @@ -970,7 +1000,9 @@ def _read_ready(self): pass except OSError as exc: self._protocol.error_received(exc) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error(exc, 'Fatal read error on datagram transport') else: self._protocol.datagram_received(data, addr) @@ -1007,7 +1039,9 @@ def sendto(self, data, addr=None): except OSError as exc: self._protocol.error_received(exc) return - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error( exc, 'Fatal write error on datagram transport') return @@ -1030,7 +1064,9 @@ def _sendto_ready(self): except OSError as exc: self._protocol.error_received(exc) return - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._fatal_error( exc, 'Fatal write error on datagram transport') return diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 97a6fc66a927..8546985fe63f 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -527,7 +527,9 @@ def data_received(self, data): try: ssldata, appdata = self._sslpipe.feed_ssldata(data) - except Exception as e: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as e: self._fatal_error(e, 'SSL error in data received') return @@ -542,7 +544,9 @@ def data_received(self, data): self._app_protocol, chunk) else: self._app_protocol.data_received(chunk) - except Exception as ex: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as ex: self._fatal_error( ex, 'application protocol failed to receive SSL data') return @@ -628,7 +632,9 @@ def _on_handshake_complete(self, handshake_exc): raise handshake_exc peercert = sslobj.getpeercert() - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: if isinstance(exc, ssl.CertificateError): msg = 'SSL handshake failed on verifying the certificate' else: @@ -691,7 +697,9 @@ def _process_write_backlog(self): # delete it and reduce the outstanding buffer size. del self._write_backlog[0] self._write_buffer_size -= len(data) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: if self._in_handshake: # Exceptions will be re-raised in _on_handshake_complete. self._on_handshake_complete(exc) diff --git a/Lib/asyncio/staggered.py b/Lib/asyncio/staggered.py index feec681b4371..27c665a9910a 100644 --- a/Lib/asyncio/staggered.py +++ b/Lib/asyncio/staggered.py @@ -105,7 +105,9 @@ try: result = await coro_fn() - except Exception as e: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as e: exceptions[this_index] = e this_failed.set() # Kickstart the next coroutine else: diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 1dc595298c55..78e76003b3ac 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -260,11 +260,11 @@ def __step(self, exc=None): super().set_result(exc.value) except exceptions.CancelledError: super().cancel() # I.e., Future.cancel(self). - except Exception as exc: + except (KeyboardInterrupt, SystemExit) as exc: super().set_exception(exc) + raise except BaseException as exc: super().set_exception(exc) - raise else: blocking = getattr(result, '_asyncio_future_blocking', None) if blocking is not None: @@ -318,7 +318,7 @@ def __step(self, exc=None): def __wakeup(self, future): try: future.result() - except Exception as exc: + except BaseException as exc: # This may also be a cancellation. self.__step(exc) else: @@ -858,7 +858,9 @@ def run_coroutine_threadsafe(coro, loop): def callback(): try: futures._chain_future(ensure_future(coro, loop=loop), future) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: if future.set_running_or_notify_cancel(): future.set_exception(exc) raise diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py index 233bbb53cb6a..47b37fa9b7f0 100644 --- a/Lib/asyncio/transports.py +++ b/Lib/asyncio/transports.py @@ -262,7 +262,9 @@ def _maybe_pause_protocol(self): self._protocol_paused = True try: self._protocol.pause_writing() - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._loop.call_exception_handler({ 'message': 'protocol.pause_writing() failed', 'exception': exc, @@ -276,7 +278,9 @@ def _maybe_resume_protocol(self): self._protocol_paused = False try: self._protocol.resume_writing() - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._loop.call_exception_handler({ 'message': 'protocol.resume_writing() failed', 'exception': exc, diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 1aa3b396086c..81d10b190cc6 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -194,7 +194,9 @@ def _make_write_pipe_transport(self, pipe, protocol, waiter=None, self._child_watcher_callback, transp) try: await waiter - except Exception: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException: transp.close() await transp._wait() raise @@ -390,7 +392,9 @@ def _sock_sendfile_native_impl(self, fut, registered_fd, sock, fileno, else: self._sock_sendfile_update_filepos(fileno, offset, total_sent) fut.set_exception(exc) - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._sock_sendfile_update_filepos(fileno, offset, total_sent) fut.set_exception(exc) else: @@ -641,7 +645,9 @@ def write(self, data): n = os.write(self._fileno, data) except (BlockingIOError, InterruptedError): n = 0 - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._conn_lost += 1 self._fatal_error(exc, 'Fatal write error on pipe transport') return @@ -661,7 +667,9 @@ def _write_ready(self): n = os.write(self._fileno, self._buffer) except (BlockingIOError, InterruptedError): pass - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: self._buffer.clear() self._conn_lost += 1 # Remove writer here, _fatal_error() doesn't it @@ -879,7 +887,9 @@ def attach_loop(self, loop): def _sig_chld(self): try: self._do_waitpid_all() - except Exception as exc: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException as exc: # self._loop should always be available here # as '_sig_chld' is added as a signal handler # in 'attach_loop' diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index 29750f18d80c..b5b2e24c5ba4 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -388,7 +388,9 @@ def loop_accept_pipe(f=None): **kwargs) try: await waiter - except Exception: + except (SystemExit, KeyboardInterrupt): + raise + except BaseException: transp.close() await transp._wait() raise diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index f068fc781f5d..31018c5c5636 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -476,7 +476,7 @@ def test_run_until_complete_loop(self): other_loop.run_until_complete, task) def test_run_until_complete_loop_orphan_future_close_loop(self): - class ShowStopper(BaseException): + class ShowStopper(SystemExit): pass async def foo(delay): @@ -487,10 +487,8 @@ def throw(): self.loop._process_events = mock.Mock() self.loop.call_soon(throw) - try: + with self.assertRaises(ShowStopper): self.loop.run_until_complete(foo(0.1)) - except ShowStopper: - pass # This call fails if run_until_complete does not clean up # done-callback for the previous future. diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 1c1f912ff8af..114dd76687cd 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1527,7 +1527,7 @@ def gen(): async def sleeper(): await asyncio.sleep(10) - base_exc = BaseException() + base_exc = SystemExit() async def notmutch(): try: @@ -1541,7 +1541,7 @@ def gen(): task.cancel() self.assertFalse(task.done()) - self.assertRaises(BaseException, test_utils.run_briefly, loop) + self.assertRaises(SystemExit, test_utils.run_briefly, loop) self.assertTrue(task.done()) self.assertFalse(task.cancelled()) diff --git a/Misc/NEWS.d/next/Library/2019-05-23-17-37-22.bpo-32528.sGnkcl.rst b/Misc/NEWS.d/next/Library/2019-05-23-17-37-22.bpo-32528.sGnkcl.rst new file mode 100644 index 000000000000..375f426025d3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-23-17-37-22.bpo-32528.sGnkcl.rst @@ -0,0 +1,8 @@ +Make asyncio.CancelledError a BaseException. + +This will address the common mistake many asyncio users make: an "except +Exception" clause breaking Tasks cancellation. + +In addition to this change, we stop inheriting asyncio.TimeoutError and +asyncio.InvalidStateError from their concurrent.futures.* counterparts. +There's no point for these exceptions to share the inheritance chain. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index f9037c279ac9..ac15d0169b81 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -2672,8 +2672,10 @@ task_step_impl(TaskObj *task, PyObject *exc) assert(o == Py_None); Py_DECREF(o); - if (!PyErr_GivenExceptionMatches(et, PyExc_Exception)) { - /* We've got a BaseException; re-raise it */ + if (PyErr_GivenExceptionMatches(et, PyExc_KeyboardInterrupt) || + PyErr_GivenExceptionMatches(et, PyExc_SystemExit)) + { + /* We've got a KeyboardInterrupt or a SystemError; re-raise it */ PyErr_Restore(et, ev, tb); goto fail; } @@ -2950,11 +2952,6 @@ task_wakeup(TaskObj *task, PyObject *o) } PyErr_Fetch(&et, &ev, &tb); - if (!PyErr_GivenExceptionMatches(et, PyExc_Exception)) { - /* We've got a BaseException; re-raise it */ - PyErr_Restore(et, ev, tb); - return NULL; - } if (!ev || !PyObject_TypeCheck(ev, (PyTypeObject *) et)) { PyErr_NormalizeException(&et, &ev, &tb); } From webhook-mailer at python.org Mon May 27 08:56:30 2019 From: webhook-mailer at python.org (Yury Selivanov) Date: Mon, 27 May 2019 12:56:30 -0000 Subject: [Python-checkins] bpo-37047: Refactor AsyncMock setup logic for autospeccing (GH-13574) Message-ID: https://github.com/python/cpython/commit/ff6b2e66b19a26b4c2ab57e62e1ab9f3d94dd76a commit: ff6b2e66b19a26b4c2ab57e62e1ab9f3d94dd76a branch: master author: Xtreak committer: Yury Selivanov date: 2019-05-27T14:56:23+02:00 summary: bpo-37047: Refactor AsyncMock setup logic for autospeccing (GH-13574) Handle late binding and attribute access in unittest.mock.AsyncMock setup for autospeccing. files: A Misc/NEWS.d/next/Library/2019-05-26-01-20-06.bpo-37047.K9epi8.rst M Doc/library/unittest.mock.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testasync.py diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 163da9aecdbb..36ac24afa2bc 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1945,7 +1945,7 @@ The full list of supported magic methods is: * Container methods: ``__getitem__``, ``__setitem__``, ``__delitem__``, ``__contains__``, ``__len__``, ``__iter__``, ``__reversed__`` and ``__missing__`` -* Context manager: ``__enter__`` and ``__exit__`` +* Context manager: ``__enter__``, ``__exit__``, ``__aenter`` and ``__aexit__`` * Unary numeric methods: ``__neg__``, ``__pos__`` and ``__invert__`` * The numeric methods (including right hand and in-place variants): ``__add__``, ``__sub__``, ``__mul__``, ``__matmul__``, ``__div__``, ``__truediv__``, @@ -1957,10 +1957,14 @@ The full list of supported magic methods is: * Pickling: ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``, ``__getnewargs__``, ``__getstate__`` and ``__setstate__`` * File system path representation: ``__fspath__`` +* Asynchronous iteration methods: ``__aiter__`` and ``__anext__`` .. versionchanged:: 3.8 Added support for :func:`os.PathLike.__fspath__`. +.. versionchanged:: 3.8 + Added support for ``__aenter__``, ``__aexit__``, ``__aiter__`` and ``__anext__``. + The following methods exist but are *not* supported as they are either in use by mock, can't be set dynamically, or can cause problems: diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index b14bf01b28fd..b91afd88dd13 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -51,6 +51,13 @@ def _is_async_obj(obj): return False +def _is_async_func(func): + if getattr(func, '__code__', None): + return asyncio.iscoroutinefunction(func) + else: + return False + + def _is_instance_mock(obj): # can't use isinstance on Mock objects because they override __class__ # The base class for all mocks is NonCallableMock @@ -225,6 +232,34 @@ def reset_mock(): mock._mock_delegate = funcopy +def _setup_async_mock(mock): + mock._is_coroutine = asyncio.coroutines._is_coroutine + mock.await_count = 0 + mock.await_args = None + mock.await_args_list = _CallList() + mock.awaited = _AwaitEvent(mock) + + # Mock is not configured yet so the attributes are set + # to a function and then the corresponding mock helper function + # is called when the helper is accessed similar to _setup_func. + def wrapper(attr, *args, **kwargs): + return getattr(mock.mock, attr)(*args, **kwargs) + + for attribute in ('assert_awaited', + 'assert_awaited_once', + 'assert_awaited_with', + 'assert_awaited_once_with', + 'assert_any_await', + 'assert_has_awaits', + 'assert_not_awaited'): + + # setattr(mock, attribute, wrapper) causes late binding + # hence attribute will always be the last value in the loop + # Use partial(wrapper, attribute) to ensure the attribute is bound + # correctly. + setattr(mock, attribute, partial(wrapper, attribute)) + + def _is_magic(name): return '__%s__' % name[2:-2] == name @@ -2151,7 +2186,7 @@ def assert_not_awaited(_mock_self): """ self = _mock_self if self.await_count != 0: - msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once." + msg = (f"Expected {self._mock_name or 'mock'} to not have been awaited." f" Awaited {self.await_count} times.") raise AssertionError(msg) @@ -2457,10 +2492,7 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, spec = type(spec) is_type = isinstance(spec, type) - if getattr(spec, '__code__', None): - is_async_func = asyncio.iscoroutinefunction(spec) - else: - is_async_func = False + is_async_func = _is_async_func(spec) _kwargs = {'spec': spec} if spec_set: _kwargs = {'spec_set': spec} @@ -2498,26 +2530,11 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, name=_name, **_kwargs) if isinstance(spec, FunctionTypes): - wrapped_mock = mock # should only happen at the top level because we don't # recurse for functions mock = _set_signature(mock, spec) if is_async_func: - mock._is_coroutine = asyncio.coroutines._is_coroutine - mock.await_count = 0 - mock.await_args = None - mock.await_args_list = _CallList() - - for a in ('assert_awaited', - 'assert_awaited_once', - 'assert_awaited_with', - 'assert_awaited_once_with', - 'assert_any_await', - 'assert_has_awaits', - 'assert_not_awaited'): - def f(*args, **kwargs): - return getattr(wrapped_mock, a)(*args, **kwargs) - setattr(mock, a, f) + _setup_async_mock(mock) else: _check_signature(spec, mock, is_type, instance) diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index a9aa1434b963..0519d59696f6 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -2,7 +2,8 @@ import inspect import unittest -from unittest.mock import call, AsyncMock, patch, MagicMock, create_autospec +from unittest.mock import (call, AsyncMock, patch, MagicMock, create_autospec, + _AwaitEvent) def tearDownModule(): @@ -20,6 +21,9 @@ def normal_method(self): async def async_func(): pass +async def async_func_args(a, b, *, c): + pass + def normal_func(): pass @@ -141,8 +145,63 @@ def test_create_autospec_instance(self): create_autospec(async_func, instance=True) def test_create_autospec(self): - spec = create_autospec(async_func) + spec = create_autospec(async_func_args) + awaitable = spec(1, 2, c=3) + async def main(): + await awaitable + + self.assertEqual(spec.await_count, 0) + self.assertIsNone(spec.await_args) + self.assertEqual(spec.await_args_list, []) + self.assertIsInstance(spec.awaited, _AwaitEvent) + spec.assert_not_awaited() + + asyncio.run(main()) + self.assertTrue(asyncio.iscoroutinefunction(spec)) + self.assertTrue(asyncio.iscoroutine(awaitable)) + self.assertEqual(spec.await_count, 1) + self.assertEqual(spec.await_args, call(1, 2, c=3)) + self.assertEqual(spec.await_args_list, [call(1, 2, c=3)]) + spec.assert_awaited_once() + spec.assert_awaited_once_with(1, 2, c=3) + spec.assert_awaited_with(1, 2, c=3) + spec.assert_awaited() + + def test_patch_with_autospec(self): + + async def test_async(): + with patch(f"{__name__}.async_func_args", autospec=True) as mock_method: + awaitable = mock_method(1, 2, c=3) + self.assertIsInstance(mock_method.mock, AsyncMock) + + self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(asyncio.iscoroutine(awaitable)) + self.assertTrue(inspect.isawaitable(awaitable)) + + # Verify the default values during mock setup + self.assertEqual(mock_method.await_count, 0) + self.assertEqual(mock_method.await_args_list, []) + self.assertIsNone(mock_method.await_args) + self.assertIsInstance(mock_method.awaited, _AwaitEvent) + mock_method.assert_not_awaited() + + await awaitable + + self.assertEqual(mock_method.await_count, 1) + self.assertEqual(mock_method.await_args, call(1, 2, c=3)) + self.assertEqual(mock_method.await_args_list, [call(1, 2, c=3)]) + mock_method.assert_awaited_once() + mock_method.assert_awaited_once_with(1, 2, c=3) + mock_method.assert_awaited_with(1, 2, c=3) + mock_method.assert_awaited() + + mock_method.reset_mock() + self.assertEqual(mock_method.await_count, 0) + self.assertIsNone(mock_method.await_args) + self.assertEqual(mock_method.await_args_list, []) + + asyncio.run(test_async()) class AsyncSpecTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2019-05-26-01-20-06.bpo-37047.K9epi8.rst b/Misc/NEWS.d/next/Library/2019-05-26-01-20-06.bpo-37047.K9epi8.rst new file mode 100644 index 000000000000..ace5a3a44178 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-26-01-20-06.bpo-37047.K9epi8.rst @@ -0,0 +1,3 @@ +Handle late binding and attribute access in :class:`unittest.mock.AsyncMock` +setup for autospeccing. Document newly implemented async methods in +:class:`unittest.mock.MagicMock`. From webhook-mailer at python.org Mon May 27 09:28:38 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 May 2019 13:28:38 -0000 Subject: [Python-checkins] bpo-37035: Don't log OSError (GH-13548) Message-ID: https://github.com/python/cpython/commit/1f39c28e489cca0397fc4c3675d13569318122ac commit: 1f39c28e489cca0397fc4c3675d13569318122ac branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-27T06:28:34-07:00 summary: bpo-37035: Don't log OSError (GH-13548) https://bugs.python.org/issue37035 files: A Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst M Lib/asyncio/base_events.py M Lib/asyncio/proactor_events.py M Lib/asyncio/selector_events.py M Lib/asyncio/sslproto.py M Lib/asyncio/unix_events.py M Lib/test/test_asyncio/test_selector_events.py M Lib/test/test_asyncio/test_unix_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 63b072b851e3..ce4f1904f950 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -59,13 +59,6 @@ # before cleanup of cancelled handles is performed. _MIN_CANCELLED_TIMER_HANDLES_FRACTION = 0.5 -# Exceptions which must not call the exception handler in fatal error -# methods (_fatal_error()) -_FATAL_ERROR_IGNORE = (BrokenPipeError, - ConnectionResetError, ConnectionAbortedError) - -if ssl is not None: - _FATAL_ERROR_IGNORE = _FATAL_ERROR_IGNORE + (ssl.SSLCertVerificationError,) _HAS_IPv6 = hasattr(socket, 'AF_INET6') diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 7dfe29579a0d..710f768718b4 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -96,7 +96,7 @@ def __del__(self, _warn=warnings.warn): def _fatal_error(self, exc, message='Fatal error on pipe transport'): try: - if isinstance(exc, base_events._FATAL_ERROR_IGNORE): + if isinstance(exc, OSError): if self._loop.get_debug(): logger.debug("%r: %s", self, message, exc_info=True) else: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index f5f43a9bfef3..44c380ae62db 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -685,7 +685,7 @@ def __del__(self, _warn=warnings.warn): def _fatal_error(self, exc, message='Fatal error on transport'): # Should be called from exception handler only. - if isinstance(exc, base_events._FATAL_ERROR_IGNORE): + if isinstance(exc, OSError): if self._loop.get_debug(): logger.debug("%r: %s", self, message, exc_info=True) else: diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 8546985fe63f..3eca6b4a3912 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -707,7 +707,7 @@ def _process_write_backlog(self): self._fatal_error(exc, 'Fatal error on SSL transport') def _fatal_error(self, exc, message='Fatal error on transport'): - if isinstance(exc, base_events._FATAL_ERROR_IGNORE): + if isinstance(exc, OSError): if self._loop.get_debug(): logger.debug("%r: %s", self, message, exc_info=True) else: diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 81d10b190cc6..28128d2977df 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -724,7 +724,7 @@ def abort(self): def _fatal_error(self, exc, message='Fatal error on pipe transport'): # should be called by exception handler only - if isinstance(exc, base_events._FATAL_ERROR_IGNORE): + if isinstance(exc, OSError): if self._loop.get_debug(): logger.debug("%r: %s", self, message, exc_info=True) else: diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index bf721b0005b0..2e52e9df5c3b 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -448,10 +448,23 @@ def test_fatal_error(self, m_exc): tr._force_close = mock.Mock() tr._fatal_error(exc) + m_exc.assert_not_called() + + tr._force_close.assert_called_with(exc) + + @mock.patch('asyncio.log.logger.error') + def test_fatal_error_custom_exception(self, m_exc): + class MyError(Exception): + pass + exc = MyError() + tr = self.create_transport() + tr._force_close = mock.Mock() + tr._fatal_error(exc) + m_exc.assert_called_with( test_utils.MockPattern( 'Fatal error on transport\nprotocol:.*\ntransport:.*'), - exc_info=(OSError, MOCK_ANY, MOCK_ANY)) + exc_info=(MyError, MOCK_ANY, MOCK_ANY)) tr._force_close.assert_called_with(exc) @@ -1338,10 +1351,20 @@ def test_fatal_error_connected(self, m_exc): err = ConnectionRefusedError() transport._fatal_error(err) self.assertFalse(self.protocol.error_received.called) + m_exc.assert_not_called() + + @mock.patch('asyncio.base_events.logger.error') + def test_fatal_error_connected_custom_error(self, m_exc): + class MyException(Exception): + pass + transport = self.datagram_transport(address=('0.0.0.0', 1)) + err = MyException() + transport._fatal_error(err) + self.assertFalse(self.protocol.error_received.called) m_exc.assert_called_with( test_utils.MockPattern( 'Fatal error on transport\nprotocol:.*\ntransport:.*'), - exc_info=(ConnectionRefusedError, MOCK_ANY, MOCK_ANY)) + exc_info=(MyException, MOCK_ANY, MOCK_ANY)) if __name__ == '__main__': diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index 31e710037f76..ac84304ec99d 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -977,11 +977,7 @@ def test__write_ready_err(self, m_write, m_logexc): self.assertFalse(self.loop.readers) self.assertEqual(bytearray(), tr._buffer) self.assertTrue(tr.is_closing()) - m_logexc.assert_called_with( - test_utils.MockPattern( - 'Fatal write error on pipe transport' - '\nprotocol:.*\ntransport:.*'), - exc_info=(OSError, MOCK_ANY, MOCK_ANY)) + m_logexc.assert_not_called() self.assertEqual(1, tr._conn_lost) test_utils.run_briefly(self.loop) self.protocol.connection_lost.assert_called_with(err) diff --git a/Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst b/Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst new file mode 100644 index 000000000000..004ec2d13714 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst @@ -0,0 +1,5 @@ +Don't log OSError based exceptions if a fatal error has occurred in asyncio +transport. Peer can generate almost any OSError, user cannot avoid these exceptions +by fixing own code. +Errors are still propagated to user code, it's just logging them +is pointless and pollute asyncio logs. From webhook-mailer at python.org Mon May 27 09:43:49 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Mon, 27 May 2019 13:43:49 -0000 Subject: [Python-checkins] bpo-35397: Remove deprecation and document urllib.parse.unwrap (GH-11481) Message-ID: https://github.com/python/cpython/commit/674ee1260025ff36f27e5d70ff6b66e3aab880bf commit: 674ee1260025ff36f27e5d70ff6b66e3aab880bf branch: master author: R?mi Lapeyre committer: Cheryl Sabella date: 2019-05-27T09:43:45-04:00 summary: bpo-35397: Remove deprecation and document urllib.parse.unwrap (GH-11481) files: A Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst M Doc/library/urllib.parse.rst M Doc/tools/susp-ignored.csv M Lib/test/test_urlparse.py M Lib/urllib/parse.py M Lib/urllib/request.py diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index f9936288fd42..49276daa7ff4 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -370,6 +370,13 @@ or on combining URL components into a URL string. .. versionchanged:: 3.2 Result is a structured object rather than a simple 2-tuple. +.. function:: unwrap(url) + + Extract the url from a wrapped URL (that is, a string formatted as + ````, ````, ``URL:scheme://host/path`` + or ``scheme://host/path``). If *url* is not a wrapped URL, it is returned + without changes. + .. _parsing-ascii-encoded-bytes: Parsing ASCII Encoded Bytes diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index a34524bb673e..a0e7868a037a 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -236,6 +236,8 @@ library/urllib.request,,:close,Connection:close library/urllib.request,,:port,:port library/urllib.request,,:lang,"xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">\n\n\n" library/urllib.request,,:password,"""joe:password at python.org""" +library/urllib.parse,,:scheme, +library/urllib.parse,,:scheme,URL:scheme://host/path library/uuid,,:uuid,urn:uuid:12345678-1234-5678-1234-567812345678 library/venv,,:param,":param nodist: If True, setuptools and pip are not installed into the" library/venv,,:param,":param progress: If setuptools or pip are installed, the progress of the" diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index d0365ecab72c..434476563764 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1169,8 +1169,10 @@ def test_to_bytes(self): 'http://www.python.org/medi\u00e6val') def test_unwrap(self): - url = urllib.parse._unwrap('') - self.assertEqual(url, 'type://host/path') + for wrapped_url in ('', '', + 'URL:scheme://host/path', 'scheme://host/path'): + url = urllib.parse.unwrap(wrapped_url) + self.assertEqual(url, 'scheme://host/path') class DeprecationTest(unittest.TestCase): @@ -1251,12 +1253,6 @@ def test_to_bytes_deprecation(self): self.assertEqual(str(cm.warning), 'urllib.parse.to_bytes() is deprecated as of 3.8') - def test_unwrap(self): - with self.assertWarns(DeprecationWarning) as cm: - urllib.parse.unwrap('') - self.assertEqual(str(cm.warning), - 'urllib.parse.unwrap() is deprecated as of 3.8') - if __name__ == "__main__": unittest.main() diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index dfba704144e9..daefb2025b14 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -979,17 +979,15 @@ def _to_bytes(url): def unwrap(url): - warnings.warn("urllib.parse.unwrap() is deprecated as of 3.8", - DeprecationWarning, stacklevel=2) - return _unwrap(url) - + """Transform a string like '' into 'scheme://host/path'. -def _unwrap(url): - """unwrap('') --> 'type://host/path'.""" + The string is returned unchanged if it's not a wrapped URL. + """ url = str(url).strip() if url[:1] == '<' and url[-1:] == '>': url = url[1:-1].strip() - if url[:4] == 'URL:': url = url[4:].strip() + if url[:4] == 'URL:': + url = url[4:].strip() return url diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index afce8eb1a1b1..f6ce9cb6d586 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -101,7 +101,7 @@ from urllib.error import URLError, HTTPError, ContentTooShortError from urllib.parse import ( - urlparse, urlsplit, urljoin, _unwrap, quote, unquote, + urlparse, urlsplit, urljoin, unwrap, quote, unquote, _splittype, _splithost, _splitport, _splituser, _splitpasswd, _splitattr, _splitquery, _splitvalue, _splittag, _to_bytes, unquote_to_bytes, urlunparse) @@ -349,7 +349,7 @@ def full_url(self): @full_url.setter def full_url(self, url): # unwrap('') --> 'type://host/path' - self._full_url = _unwrap(url) + self._full_url = unwrap(url) self._full_url, self.fragment = _splittag(self._full_url) self._parse() @@ -1727,7 +1727,7 @@ def addheader(self, *args): # External interface def open(self, fullurl, data=None): """Use URLopener().open(file) instead of open(file, 'r').""" - fullurl = _unwrap(_to_bytes(fullurl)) + fullurl = unwrap(_to_bytes(fullurl)) fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]|") if self.tempcache and fullurl in self.tempcache: filename, headers = self.tempcache[fullurl] @@ -1775,7 +1775,7 @@ def open_unknown_proxy(self, proxy, fullurl, data=None): def retrieve(self, url, filename=None, reporthook=None, data=None): """retrieve(url) returns (filename, headers) for a local object or (tempfilename, headers) for a remote object.""" - url = _unwrap(_to_bytes(url)) + url = unwrap(_to_bytes(url)) if self.tempcache and url in self.tempcache: return self.tempcache[url] type, url1 = _splittype(url) diff --git a/Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst b/Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst new file mode 100644 index 000000000000..6dc7d3aebb1a --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst @@ -0,0 +1,2 @@ +Remove deprecation and document urllib.parse.unwrap(). Patch contributed by +R?mi Lapeyre. From webhook-mailer at python.org Mon May 27 09:57:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 May 2019 13:57:28 -0000 Subject: [Python-checkins] bpo-37027: Return a proxy socket object from transp.get_extra_info('socket') (GH-13530) Message-ID: https://github.com/python/cpython/commit/8cd5165ba05ff57cfdbbc71c393bddad1ce1ab87 commit: 8cd5165ba05ff57cfdbbc71c393bddad1ce1ab87 branch: master author: Yury Selivanov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-27T06:57:19-07:00 summary: bpo-37027: Return a proxy socket object from transp.get_extra_info('socket') (GH-13530) Return a safe to use proxy socket object from `transport.get_extra_info('socket')` https://bugs.python.org/issue37027 files: A Lib/asyncio/trsock.py A Misc/NEWS.d/next/Library/2019-05-23-18-46-56.bpo-37027.iH4eut.rst M Lib/asyncio/base_events.py M Lib/asyncio/proactor_events.py M Lib/asyncio/selector_events.py M Lib/test/test_asyncio/test_events.py M Lib/test/test_asyncio/test_server.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index ce4f1904f950..e5cd14b59af5 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -45,6 +45,7 @@ from . import staggered from . import tasks from . import transports +from . import trsock from .log import logger @@ -319,8 +320,8 @@ def is_serving(self): @property def sockets(self): if self._sockets is None: - return [] - return list(self._sockets) + return () + return tuple(trsock.TransportSocket(s) for s in self._sockets) def close(self): sockets = self._sockets diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 710f768718b4..6a53b2edaac1 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -19,6 +19,7 @@ from . import protocols from . import sslproto from . import transports +from . import trsock from .log import logger @@ -454,7 +455,7 @@ def __init__(self, loop, sock, protocol, waiter=None, base_events._set_nodelay(sock) def _set_extra(self, sock): - self._extra['socket'] = sock + self._extra['socket'] = trsock.TransportSocket(sock) try: self._extra['sockname'] = sock.getsockname() @@ -679,7 +680,7 @@ def loop(f=None): self.call_exception_handler({ 'message': 'Accept failed on a socket', 'exception': exc, - 'socket': sock, + 'socket': trsock.TransportSocket(sock), }) sock.close() elif self._debug: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 44c380ae62db..00e3244bfb29 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -25,6 +25,7 @@ from . import protocols from . import sslproto from . import transports +from . import trsock from .log import logger @@ -171,7 +172,7 @@ def _accept_connection( self.call_exception_handler({ 'message': 'socket.accept() out of system resource', 'exception': exc, - 'socket': sock, + 'socket': trsock.TransportSocket(sock), }) self._remove_reader(sock.fileno()) self.call_later(constants.ACCEPT_RETRY_DELAY, @@ -603,7 +604,7 @@ class _SelectorTransport(transports._FlowControlMixin, def __init__(self, loop, sock, protocol, extra=None, server=None): super().__init__(extra, loop) - self._extra['socket'] = sock + self._extra['socket'] = trsock.TransportSocket(sock) try: self._extra['sockname'] = sock.getsockname() except OSError: diff --git a/Lib/asyncio/trsock.py b/Lib/asyncio/trsock.py new file mode 100644 index 000000000000..e9ebcc326142 --- /dev/null +++ b/Lib/asyncio/trsock.py @@ -0,0 +1,206 @@ +import socket +import warnings + + +class TransportSocket: + + """A socket-like wrapper for exposing real transport sockets. + + These objects can be safely returned by APIs like + `transport.get_extra_info('socket')`. All potentially disruptive + operations (like "socket.close()") are banned. + """ + + __slots__ = ('_sock',) + + def __init__(self, sock: socket.socket): + self._sock = sock + + def _na(self, what): + warnings.warn( + f"Using {what} on sockets returned from get_extra_info('socket') " + f"will be prohibited in asyncio 3.9. Please report your use case " + f"to bugs.python.org.", + DeprecationWarning, source=self) + + @property + def family(self): + return self._sock.family + + @property + def type(self): + return self._sock.type + + @property + def proto(self): + return self._sock.proto + + def __repr__(self): + s = ( + f"" + + def __getstate__(self): + raise TypeError("Cannot serialize asyncio.TransportSocket object") + + def fileno(self): + return self._sock.fileno() + + def dup(self): + return self._sock.dup() + + def get_inheritable(self): + return self._sock.get_inheritable() + + def shutdown(self, how): + # asyncio doesn't currently provide a high-level transport API + # to shutdown the connection. + self._sock.shutdown(how) + + def getsockopt(self, *args, **kwargs): + return self._sock.getsockopt(*args, **kwargs) + + def setsockopt(self, *args, **kwargs): + self._sock.setsockopt(*args, **kwargs) + + def getpeername(self): + return self._sock.getpeername() + + def getsockname(self): + return self._sock.getsockname() + + def getsockbyname(self): + return self._sock.getsockbyname() + + def accept(self): + self._na('accept() method') + return self._sock.accept() + + def connect(self, *args, **kwargs): + self._na('connect() method') + return self._sock.connect(*args, **kwargs) + + def connect_ex(self, *args, **kwargs): + self._na('connect_ex() method') + return self._sock.connect_ex(*args, **kwargs) + + def bind(self, *args, **kwargs): + self._na('bind() method') + return self._sock.bind(*args, **kwargs) + + def ioctl(self, *args, **kwargs): + self._na('ioctl() method') + return self._sock.ioctl(*args, **kwargs) + + def listen(self, *args, **kwargs): + self._na('listen() method') + return self._sock.listen(*args, **kwargs) + + def makefile(self): + self._na('makefile() method') + return self._sock.makefile() + + def sendfile(self, *args, **kwargs): + self._na('sendfile() method') + return self._sock.sendfile(*args, **kwargs) + + def close(self): + self._na('close() method') + return self._sock.close() + + def detach(self): + self._na('detach() method') + return self._sock.detach() + + def sendmsg_afalg(self, *args, **kwargs): + self._na('sendmsg_afalg() method') + return self._sock.sendmsg_afalg(*args, **kwargs) + + def sendmsg(self, *args, **kwargs): + self._na('sendmsg() method') + return self._sock.sendmsg(*args, **kwargs) + + def sendto(self, *args, **kwargs): + self._na('sendto() method') + return self._sock.sendto(*args, **kwargs) + + def send(self, *args, **kwargs): + self._na('send() method') + return self._sock.send(*args, **kwargs) + + def sendall(self, *args, **kwargs): + self._na('sendall() method') + return self._sock.sendall(*args, **kwargs) + + def set_inheritable(self, *args, **kwargs): + self._na('set_inheritable() method') + return self._sock.set_inheritable(*args, **kwargs) + + def share(self, process_id): + self._na('share() method') + return self._sock.share(process_id) + + def recv_into(self, *args, **kwargs): + self._na('recv_into() method') + return self._sock.recv_into(*args, **kwargs) + + def recvfrom_into(self, *args, **kwargs): + self._na('recvfrom_into() method') + return self._sock.recvfrom_into(*args, **kwargs) + + def recvmsg_into(self, *args, **kwargs): + self._na('recvmsg_into() method') + return self._sock.recvmsg_into(*args, **kwargs) + + def recvmsg(self, *args, **kwargs): + self._na('recvmsg() method') + return self._sock.recvmsg(*args, **kwargs) + + def recvfrom(self, *args, **kwargs): + self._na('recvfrom() method') + return self._sock.recvfrom(*args, **kwargs) + + def recv(self, *args, **kwargs): + self._na('recv() method') + return self._sock.recv(*args, **kwargs) + + def settimeout(self, value): + if value == 0: + return + raise ValueError( + 'settimeout(): only 0 timeout is allowed on transport sockets') + + def gettimeout(self): + return 0 + + def setblocking(self, flag): + if not flag: + return + raise ValueError( + 'setblocking(): transport sockets cannot be blocking') + + def __enter__(self): + self._na('context manager protocol') + return self._sock.__enter__() + + def __exit__(self, *err): + self._na('context manager protocol') + return self._sock.__exit__(*err) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 0ae6eab1e1e4..e89db99df312 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1118,7 +1118,7 @@ def connection_made(self, transport): f = self.loop.create_server(TestMyProto, sock=sock_ob) server = self.loop.run_until_complete(f) sock = server.sockets[0] - self.assertIs(sock, sock_ob) + self.assertEqual(sock.fileno(), sock_ob.fileno()) host, port = sock.getsockname() self.assertEqual(host, '0.0.0.0') diff --git a/Lib/test/test_asyncio/test_server.py b/Lib/test/test_asyncio/test_server.py index ab7f3debbc15..4e758ad12e60 100644 --- a/Lib/test/test_asyncio/test_server.py +++ b/Lib/test/test_asyncio/test_server.py @@ -58,7 +58,7 @@ def client(sock, addr): with self.tcp_client(lambda sock: client(sock, addr)): self.loop.run_until_complete(main_task) - self.assertEqual(srv.sockets, []) + self.assertEqual(srv.sockets, ()) self.assertIsNone(srv._sockets) self.assertIsNone(srv._waiters) @@ -111,7 +111,7 @@ def client(sock, addr): with self.unix_client(lambda sock: client(sock, addr)): self.loop.run_until_complete(main_task) - self.assertEqual(srv.sockets, []) + self.assertEqual(srv.sockets, ()) self.assertIsNone(srv._sockets) self.assertIsNone(srv._waiters) diff --git a/Misc/NEWS.d/next/Library/2019-05-23-18-46-56.bpo-37027.iH4eut.rst b/Misc/NEWS.d/next/Library/2019-05-23-18-46-56.bpo-37027.iH4eut.rst new file mode 100644 index 000000000000..60b513d6ea3a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-23-18-46-56.bpo-37027.iH4eut.rst @@ -0,0 +1,2 @@ +Return safe to use proxy socket object from +transport.get_extra_info('socket') From webhook-mailer at python.org Mon May 27 10:39:29 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 27 May 2019 14:39:29 -0000 Subject: [Python-checkins] bpo-36763: Implement the PEP 587 (GH-13592) Message-ID: https://github.com/python/cpython/commit/331a6a56e9a9c72f3e4605987fabdaec72677702 commit: 331a6a56e9a9c72f3e4605987fabdaec72677702 branch: master author: Victor Stinner committer: GitHub date: 2019-05-27T16:39:22+02:00 summary: bpo-36763: Implement the PEP 587 (GH-13592) * Add a whole new documentation page: "Python Initialization Configuration" * PyWideStringList_Append() return type is now PyStatus, instead of int * PyInterpreterState_New() now calls PyConfig_Clear() if PyConfig_InitPythonConfig() fails. * Rename files: * Python/coreconfig.c => Python/initconfig.c * Include/cpython/coreconfig.h => Include/cpython/initconfig.h * Include/internal/: pycore_coreconfig.h => pycore_initconfig.h * Rename structures * _PyCoreConfig => PyConfig * _PyPreConfig => PyPreConfig * _PyInitError => PyStatus * _PyWstrList => PyWideStringList * Rename PyConfig fields: * use_module_search_paths => module_search_paths_set * module_search_path_env => pythonpath_env * Rename PyStatus field: _func => func * PyInterpreterState: rename core_config field to config * Rename macros and functions: * _PyCoreConfig_SetArgv() => PyConfig_SetBytesArgv() * _PyCoreConfig_SetWideArgv() => PyConfig_SetArgv() * _PyCoreConfig_DecodeLocale() => PyConfig_SetBytesString() * _PyInitError_Failed() => PyStatus_Exception() * _Py_INIT_ERROR_TYPE_xxx enums => _PyStatus_TYPE_xxx * _Py_UnixMain() => Py_BytesMain() * _Py_ExitInitError() => Py_ExitStatusException() * _Py_PreInitializeFromArgs() => Py_PreInitializeFromBytesArgs() * _Py_PreInitializeFromWideArgs() => Py_PreInitializeFromArgs() * _Py_PreInitialize() => Py_PreInitialize() * _Py_RunMain() => Py_RunMain() * _Py_InitializeFromConfig() => Py_InitializeFromConfig() * _Py_INIT_XXX() => _PyStatus_XXX() * _Py_INIT_FAILED() => _PyStatus_EXCEPTION() * Rename 'err' PyStatus variables to 'status' * Convert RUN_CODE() macro to config_run_code() static inline function * Remove functions: * _Py_InitializeFromArgs() * _Py_InitializeFromWideArgs() * _PyInterpreterState_GetCoreConfig() files: A Doc/c-api/init_config.rst A Include/cpython/initconfig.h A Include/internal/pycore_initconfig.h A Misc/NEWS.d/next/C API/2019-05-27-12-25-25.bpo-36763.bHCA9j.rst A Python/initconfig.c D Include/cpython/coreconfig.h D Include/internal/pycore_coreconfig.h D Python/coreconfig.c M Doc/c-api/index.rst M Doc/c-api/veryhigh.rst M Doc/whatsnew/3.8.rst M Include/Python.h M Include/cpython/pylifecycle.h M Include/cpython/pystate.h M Include/internal/pycore_pathconfig.h M Include/internal/pycore_pylifecycle.h M Include/internal/pycore_pystate.h M Lib/test/test_embed.py M Makefile.pre.in M Modules/_io/_iomodule.c M Modules/_io/iobase.c M Modules/_testinternalcapi.c M Modules/faulthandler.c M Modules/getpath.c M Modules/main.c M Objects/bytearrayobject.c M Objects/bytesobject.c M Objects/exceptions.c M Objects/listobject.c M Objects/moduleobject.c M Objects/object.c M Objects/tupleobject.c M Objects/unicodeobject.c M PC/getpathp.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Programs/_freeze_importlib.c M Programs/_testembed.c M Programs/python.c M Python/bltinmodule.c M Python/bootstrap_hash.c M Python/compile.c M Python/dynload_hpux.c M Python/errors.c M Python/frozenmain.c M Python/import.c M Python/pathconfig.c M Python/preconfig.c M Python/pylifecycle.c M Python/pystate.c M Python/pythonrun.c M Python/sysmodule.c diff --git a/Doc/c-api/index.rst b/Doc/c-api/index.rst index 3bfbaf4eedde..9a8f1507b3f4 100644 --- a/Doc/c-api/index.rst +++ b/Doc/c-api/index.rst @@ -21,6 +21,7 @@ document the API functions in detail. abstract.rst concrete.rst init.rst + init_config.rst memory.rst objimpl.rst apiabiversion.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst new file mode 100644 index 000000000000..0d94e6b8f27b --- /dev/null +++ b/Doc/c-api/init_config.rst @@ -0,0 +1,1018 @@ +.. highlight:: c + +.. _init-config: + +*********************************** +Python Initialization Configuration +*********************************** + +.. versionadded:: 3.8 + +Structures: + +* :c:type:`PyConfig` +* :c:type:`PyPreConfig` +* :c:type:`PyStatus` +* :c:type:`PyWideStringList` + +Functions: + +* :c:func:`PyConfig_Clear` +* :c:func:`PyConfig_InitIsolatedConfig` +* :c:func:`PyConfig_InitPythonConfig` +* :c:func:`PyConfig_Read` +* :c:func:`PyConfig_SetArgv` +* :c:func:`PyConfig_SetBytesArgv` +* :c:func:`PyConfig_SetBytesString` +* :c:func:`PyConfig_SetString` +* :c:func:`PyPreConfig_InitIsolatedConfig` +* :c:func:`PyPreConfig_InitPythonConfig` +* :c:func:`PyStatus_Error` +* :c:func:`PyStatus_Exception` +* :c:func:`PyStatus_Exit` +* :c:func:`PyStatus_IsError` +* :c:func:`PyStatus_IsExit` +* :c:func:`PyStatus_NoMemory` +* :c:func:`PyStatus_Ok` +* :c:func:`PyWideStringList_Append` +* :c:func:`PyWideStringList_Insert` +* :c:func:`Py_ExitStatusException` +* :c:func:`Py_InitializeFromConfig` +* :c:func:`Py_PreInitialize` +* :c:func:`Py_PreInitializeFromArgs` +* :c:func:`Py_PreInitializeFromBytesArgs` +* :c:func:`Py_RunMain` + +The preconfiguration (``PyPreConfig`` type) is stored in +``_PyRuntime.preconfig`` and the configuration (``PyConfig`` type) is stored in +``PyInterpreterState.config``. + +.. seealso:: + :pep:`587` "Python Initialization Configuration". + + +PyWideStringList +---------------- + +.. c:type:: PyWideStringList + + List of ``wchar_t*`` strings. + + If *length* is non-zero, *items* must be non-NULL and all strings must be + non-NULL. + + Methods: + + .. c:function:: PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item) + + Append *item* to *list*. + + Python must be preinitialized to call this function. + + .. c:function:: PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item) + + Insert *item* into *list* at *index*. If *index* is greater than *list* + length, just append *item* to *list*. + + Python must be preinitialized to call this function. + + Structure fields: + + .. c:member:: Py_ssize_t length + + List length. + + .. c:member:: wchar_t** items + + List items. + +PyStatus +-------- + +.. c:type:: PyStatus + + Structure to store an initialization function status: success, error + or exit. + + For an error, it can store the C function name which created the error. + + Structure fields: + + .. c:member:: int exitcode + + Exit code. Argument passed to ``exit()``. + + .. c:member:: const char *err_msg + + Error message. + + .. c:member:: const char *func + + Name of the function which created an error, can be ``NULL``. + + Functions to create a status: + + .. c:function:: PyStatus PyStatus_Ok(void) + + Success. + + .. c:function:: PyStatus PyStatus_Error(const char *err_msg) + + Initialization error with a message. + + .. c:function:: PyStatus PyStatus_NoMemory(void) + + Memory allocation failure (out of memory). + + .. c:function:: PyStatus PyStatus_Exit(int exitcode) + + Exit Python with the specified exit code. + + Functions to handle a status: + + .. c:function:: int PyStatus_Exception(PyStatus status) + + Is the status an error or an exit? If true, the exception must be + handled; by calling :c:func:`Py_ExitStatusException` for example. + + .. c:function:: int PyStatus_IsError(PyStatus status) + + Is the result an error? + + .. c:function:: int PyStatus_IsExit(PyStatus status) + + Is the result an exit? + + .. c:function:: void Py_ExitStatusException(PyStatus status) + + Call ``exit(exitcode)`` if *status* is an exit. Print the error + message and exit with a non-zero exit code if *status* is an error. Must + only be called if ``PyStatus_Exception(status)`` is non-zero. + +.. note:: + Internally, Python uses macros which set ``PyStatus.func``, + whereas functions to create a status set ``func`` to ``NULL``. + +Example:: + + PyStatus alloc(void **ptr, size_t size) + { + *ptr = PyMem_RawMalloc(size); + if (*ptr == NULL) { + return PyStatus_NoMemory(); + } + return PyStatus_Ok(); + } + + int main(int argc, char **argv) + { + void *ptr; + PyStatus status = alloc(&ptr, 16); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); + } + PyMem_Free(ptr); + return 0; + } + + +PyPreConfig +----------- + +.. c:type:: PyPreConfig + + Structure used to preinitialize Python: + + * Set the Python memory allocator + * Configure the LC_CTYPE locale + * Set the UTF-8 mode + + Function to initialize a preconfiguration: + + .. c:function:: void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig) + + Initialize the preconfiguration with :ref:`Python Configuration + `. + + .. c:function:: void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig) + + Initialize the preconfiguration with :ref:`Isolated Configuration + `. + + Structure fields: + + .. c:member:: int allocator + + Name of the memory allocator: + + * ``PYMEM_ALLOCATOR_NOT_SET`` (``0``): don't change memory allocators + (use defaults) + * ``PYMEM_ALLOCATOR_DEFAULT`` (``1``): default memory allocators + * ``PYMEM_ALLOCATOR_DEBUG`` (``2``): default memory allocators with + debug hooks + * ``PYMEM_ALLOCATOR_MALLOC`` (``3``): force usage of ``malloc()`` + * ``PYMEM_ALLOCATOR_MALLOC_DEBUG`` (``4``): force usage of + ``malloc()`` with debug hooks + * ``PYMEM_ALLOCATOR_PYMALLOC`` (``5``): :ref:`Python pymalloc memory + allocator ` + * ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` (``6``): :ref:`Python pymalloc + memory allocator ` with debug hooks + + ``PYMEM_ALLOCATOR_PYMALLOC`` and ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` + are not supported if Python is configured using ``--without-pymalloc`` + + See :ref:`Memory Management `. + + .. c:member:: int configure_locale + + Set the LC_CTYPE locale to the user preferred locale? If equals to 0, set + :c:member:`coerce_c_locale` and :c:member:`coerce_c_locale_warn` to 0. + + .. c:member:: int coerce_c_locale + + If equals to 2, coerce the C locale; if equals to 1, read the LC_CTYPE + locale to decide if it should be coerced. + + .. c:member:: int coerce_c_locale_warn + If non-zero, emit a warning if the C locale is coerced. + + .. c:member:: int dev_mode + + See :c:member:`PyConfig.dev_mode`. + + .. c:member:: int isolated + + See :c:member:`PyConfig.isolated`. + + .. c:member:: int legacy_windows_fs_encoding (Windows only) + + If non-zero, disable UTF-8 Mode, set the Python filesystem encoding to + ``mbcs``, set the filesystem error handler to ``replace``. + + Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for + Windows specific code. + + .. c:member:: int parse_argv + + If non-zero, :c:func:`Py_PreInitializeFromArgs` and + :c:func:`Py_PreInitializeFromBytesArgs` parse their ``argv`` argument the + same way the regular Python parses command line arguments: see + :ref:`Command Line Arguments `. + + .. c:member:: int use_environment + + See :c:member:`PyConfig.use_environment`. + + .. c:member:: int utf8_mode + + If non-zero, enable the UTF-8 mode. + +Preinitialization with PyPreConfig +---------------------------------- + +Functions to preinitialize Python: + +.. c:function:: PyStatus Py_PreInitialize(const PyPreConfig *preconfig) + + Preinitialize Python from *preconfig* preconfiguration. + +.. c:function:: PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char * const *argv) + + Preinitialize Python from *preconfig* preconfiguration and command line + arguments (bytes strings). + +.. c:function:: PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t * const * argv) + + Preinitialize Python from *preconfig* preconfiguration and command line + arguments (wide strings). + +The caller is responsible to handle exceptions (error or exit) using +:c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`. + +For :ref:`Python Configuration ` +(:c:func:`PyPreConfig_InitPythonConfig`), if Python is initialized with +command line arguments, the command line arguments must also be passed to +preinitialize Python, since they have an effect on the pre-configuration +like encodings. For example, the :option:`-X` ``utf8`` command line option +enables the UTF-8 Mode. + +``PyMem_SetAllocator()`` can be called after :c:func:`Py_PreInitialize` and +before :c:func:`Py_InitializeFromConfig` to install a custom memory allocator. +It can be called before :c:func:`Py_PreInitialize` if +:c:member:`PyPreConfig.allocator` is set to ``PYMEM_ALLOCATOR_NOT_SET``. + +Python memory allocation functions like :c:func:`PyMem_RawMalloc` must not be +used before Python preinitialization, whereas calling directly ``malloc()`` and +``free()`` is always safe. :c:func:`Py_DecodeLocale` must not be called before +the preinitialization. + +Example using the preinitialization to enable the UTF-8 Mode:: + + PyPreConfig preconfig; + PyPreConfig_InitPythonConfig(&preconfig); + + preconfig.utf8_mode = 1; + + PyStatus status = Py_PreInitialize(&preconfig); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); + } + + /* at this point, Python will speak UTF-8 */ + + Py_Initialize(); + /* ... use Python API here ... */ + Py_Finalize(); + + +PyConfig +-------- + +.. c:type:: PyConfig + + Structure containing most parameters to configure Python. + + Structure methods: + + .. c:function:: PyStatus PyConfig_InitPythonConfig(PyConfig *config) + + Initialize configuration with :ref:`Python Configuration + `. + + .. c:function:: PyStatus PyConfig_InitIsolatedConfig(PyConfig *config) + + Initialize configuration with :ref:`Isolated Configuration + `. + + .. c:function:: PyStatus PyConfig_SetString(PyConfig *config, wchar_t * const *config_str, const wchar_t *str) + + Copy the wide character string *str* into ``*config_str``. + + Preinitialize Python if needed. + + .. c:function:: PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t * const *config_str, const char *str) + + Decode *str* using ``Py_DecodeLocale()`` and set the result into ``*config_str``. + + Preinitialize Python if needed. + + .. c:function:: PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t * const *argv) + + Set command line arguments from wide character strings. + + Preinitialize Python if needed. + + .. c:function:: PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char * const *argv) + + Set command line arguments: decode bytes using :c:func:`Py_DecodeLocale`. + + Preinitialize Python if needed. + + .. c:function:: PyStatus PyConfig_Read(PyConfig *config) + + Read all Python configuration. + + Fields which are already initialized are left unchanged. + + Preinitialize Python if needed. + + .. c:function:: void PyConfig_Clear(PyConfig *config) + + Release configuration memory. + + Most ``PyConfig`` methods preinitialize Python if needed. In that case, the + Python preinitialization configuration in based on the :c:type:`PyConfig`. + If configuration fields which are in common with :c:type:`PyPreConfig` are + tuned, they must be set before calling a :c:type:`PyConfig` method: + + * :c:member:`~PyConfig.dev_mode` + * :c:member:`~PyConfig.isolated` + * :c:member:`~PyConfig.parse_argv` + * :c:member:`~PyConfig.use_environment` + + Moreover, if :c:func:`PyConfig_SetArgv` or :c:func:`PyConfig_SetBytesArgv` + is used, this method must be called first, before other methods, since the + preinitialization configuration depends on command line arguments (if + :c:member:`parse_argv` is non-zero). + + The caller of these methods is responsible to handle exceptions (error or + exit) using ``PyStatus_Exception()`` and ``Py_ExitStatusException()``. + + Structure fields: + + .. c:member:: PyWideStringList argv + + Command line arguments, :data:`sys.argv`. See + :c:member:`~PyConfig.parse_argv` to parse :c:member:`~PyConfig.argv` the + same way the regular Python parses Python command line arguments. If + :c:member:`~PyConfig.argv` is empty, an empty string is added to ensure + that :data:`sys.argv` always exists and is never empty. + + .. c:member:: wchar_t* base_exec_prefix + + :data:`sys.base_exec_prefix`. + + .. c:member:: wchar_t* base_prefix + + :data:`sys.base_prefix`. + + .. c:member:: int buffered_stdio + + If equals to 0, enable unbuffered mode, making the stdout and stderr + streams unbuffered. + + stdin is always opened in buffered mode. + + .. c:member:: int bytes_warning + + If equals to 1, issue a warning when comparing :class:`bytes` or + :class:`bytearray` with :class:`str`, or comparing :class:`bytes` with + :class:`int`. If equal or greater to 2, raise a :exc:`BytesWarning` + exception. + + .. c:member:: wchar_t* check_hash_pycs_mode + + Control the validation behavior of hash-based ``.pyc`` files (see + :pep:`552`): :option:`--check-hash-based-pycs` command line option value. + + Valid values: ``always``, ``never`` and ``default``. + + The default value is: ``default``. + + .. c:member:: int configure_c_stdio + + If non-zero, configure C standard streams (``stdio``, ``stdout``, + ``stdout``). For example, set their mode to ``O_BINARY`` on Windows. + + .. c:member:: int dev_mode + + Development mode: see :option:`-X` ``dev``. + + .. c:member:: int dump_refs + + If non-zero, dump all objects which are still alive at exit. + + Require a debug build of Python (``Py_REF_DEBUG`` macro must be defined). + + .. c:member:: wchar_t* exec_prefix + + :data:`sys.exec_prefix`. + + .. c:member:: wchar_t* executable + + :data:`sys.executable`. + + .. c:member:: int faulthandler + + If non-zero, call :func:`faulthandler.enable`. + + .. c:member:: wchar_t* filesystem_encoding + + Filesystem encoding, :func:`sys.getfilesystemencoding`. + + .. c:member:: wchar_t* filesystem_errors + + Filesystem encoding errors, :func:`sys.getfilesystemencodeerrors`. + + .. c:member:: unsigned long hash_seed + .. c:member:: int use_hash_seed + + Randomized hash function seed. + + If :c:member:`~PyConfig.use_hash_seed` is zero, a seed is chosen randomly + at Pythonstartup, and :c:member:`~PyConfig.hash_seed` is ignored. + + .. c:member:: wchar_t* home + + Python home directory. + + .. c:member:: int import_time + + If non-zero, profile import time. + + .. c:member:: int inspect + + Enter interactive mode after executing a script or a command. + + .. c:member:: int install_signal_handlers + + Install signal handlers? + + .. c:member:: int interactive + + Interactive mode. + + .. c:member:: int isolated + + If greater than 0, enable isolated mode: + + * :data:`sys.path` contains neither the script's directory (computed from + ``argv[0]`` or the current directory) nor the user's site-packages + directory. + * Python REPL doesn't import :mod:`readline` nor enable default readline + configuration on interactive prompts. + * Set :c:member:`~PyConfig.use_environment` and + :c:member:`~PyConfig.user_site_directory` to 0. + + .. c:member:: int legacy_windows_stdio + + If non-zero, use :class:`io.FileIO` instead of + :class:`io.WindowsConsoleIO` for :data:`sys.stdin`, :data:`sys.stdout` + and :data:`sys.stderr`. + + Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for + Windows specific code. + + .. c:member:: int malloc_stats + + If non-zero, dump statistics on :ref:`Python pymalloc memory allocator + ` at exit. + + The option is ignored if Python is built using ``--without-pymalloc``. + + .. c:member:: wchar_t* pythonpath_env + + Module search paths as a string separated by ``DELIM`` + (:data:`os.path.pathsep`). + + Initialized from :envvar:`PYTHONPATH` environment variable value by + default. + + .. c:member:: PyWideStringList module_search_paths + .. c:member:: int module_search_paths_set + + :data:`sys.path`. If :c:member:`~PyConfig.module_search_paths_set` is + equal to 0, the :c:member:`~PyConfig.module_search_paths` is overridden + by the function computing the :ref:`Path Configuration + `. + + .. c:member:: int optimization_level + + Compilation optimization level: + + * 0: Peephole optimizer (and ``__debug__`` is set to ``True``) + * 1: Remove assertions, set ``__debug__`` to ``False`` + * 2: Strip docstrings + + .. c:member:: int parse_argv + + If non-zero, parse :c:member:`~PyConfig.argv` the same way the regular + Python command line arguments, and strip Python arguments from + :c:member:`~PyConfig.argv`: see :ref:`Command Line Arguments + `. + + .. c:member:: int parser_debug + + If non-zero, turn on parser debugging output (for expert only, depending + on compilation options). + + .. c:member:: int pathconfig_warnings + + If equal to 0, suppress warnings when computing the path configuration + (Unix only, Windows does not log any warning). Otherwise, warnings are + written into ``stderr``. + + .. c:member:: wchar_t* prefix + + :data:`sys.prefix`. + + .. c:member:: wchar_t* program_name + + Program name. + + .. c:member:: wchar_t* pycache_prefix + + ``.pyc`` cache prefix. + + .. c:member:: int quiet + + Quiet mode. For example, don't display the copyright and version messages + even in interactive mode. + + .. c:member:: wchar_t* run_command + + ``python3 -c COMMAND`` argument. + + .. c:member:: wchar_t* run_filename + + ``python3 FILENAME`` argument. + + .. c:member:: wchar_t* run_module + + ``python3 -m MODULE`` argument. + + .. c:member:: int show_alloc_count + + Show allocation counts at exit? + + Need a special Python build with ``COUNT_ALLOCS`` macro defined. + + .. c:member:: int show_ref_count + + Show total reference count at exit? + + Need a debug build of Python (``Py_REF_DEBUG`` macro must be defined). + + .. c:member:: int site_import + + Import the :mod:`site` module at startup? + + .. c:member:: int skip_source_first_line + + Skip the first line of the source? + + .. c:member:: wchar_t* stdio_encoding + .. c:member:: wchar_t* stdio_errors + + Encoding and encoding errors of :data:`sys.stdin`, :data:`sys.stdout` and + :data:`sys.stderr`. + + .. c:member:: int tracemalloc + + If non-zero, call :func:`tracemalloc.start`. + + .. c:member:: int use_environment + + If greater than 0, use :ref:`environment variables `. + + .. c:member:: int user_site_directory + + If non-zero, add user site directory to :data:`sys.path`. + + .. c:member:: int verbose + + If non-zero, enable verbose mode. + + .. c:member:: PyWideStringList warnoptions + + Options of the :mod:`warnings` module to build warnings filters. + + .. c:member:: int write_bytecode + + If non-zero, write ``.pyc`` files. + + .. c:member:: PyWideStringList xoptions + + :data:`sys._xoptions`. + +If ``parse_argv`` is non-zero, ``argv`` arguments are parsed the same +way the regular Python parses command line arguments, and Python +arguments are stripped from ``argv``: see :ref:`Command Line Arguments +`. + +The ``xoptions`` options are parsed to set other options: see :option:`-X` +option. + + +Initialization with PyConfig +---------------------------- + +Function to initialize Python: + +.. c:function:: PyStatus Py_InitializeFromConfig(const PyConfig *config) + + Initialize Python from *config* configuration. + +The caller is responsible to handle exceptions (error or exit) using +:c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`. + +``PyImport_FrozenModules``, ``PyImport_AppendInittab()`` or +``PyImport_ExtendInittab()`` is used: they must be set or called after Python +preinitialization and before the Python initialization. + +Example setting the program name:: + + void init_python(void) + { + PyStatus status; + PyConfig config; + + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + goto fail; + } + + /* Set the program name. Implicitly preinitialize Python. */ + status = PyConfig_SetString(&config, &config.program_name, + L"/path/to/my_program"); + if (PyStatus_Exception(status)) { + goto fail; + } + + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + goto fail; + } + PyConfig_Clear(&config); + return; + + fail: + PyConfig_Clear(&config); + Py_ExitStatusException(status); + } + +More complete example modifying the default configuration, read the +configuration, and then override some parameters:: + + PyStatus init_python(const char *program_name) + { + PyStatus status; + PyConfig config; + + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + goto done; + } + + /* Set the program name before reading the configuraton + (decode byte string from the locale encoding). + + Implicitly preinitialize Python. */ + status = PyConfig_SetBytesString(&config, &config.program_name, + program_name); + if (PyStatus_Exception(status)) { + goto done; + } + + /* Read all configuration at once */ + status = PyConfig_Read(&config); + if (PyStatus_Exception(status)) { + goto done; + } + + /* Append our custom search path to sys.path */ + status = PyWideStringList_Append(&config.module_search_paths, + L"/path/to/more/modules"); + if (PyStatus_Exception(status)) { + goto done; + } + + /* Override executable computed by PyConfig_Read() */ + status = PyConfig_SetString(&config, &config.executable, + L"/path/to/my_executable"); + if (PyStatus_Exception(status)) { + goto done; + } + + status = Py_InitializeFromConfig(&config); + + done: + PyConfig_Clear(&config); + return status; + } + + +.. _init-isolated-conf: + +Isolated Configuration +---------------------- + +:c:func:`PyPreConfig_InitIsolatedConfig` and +:c:func:`PyConfig_InitIsolatedConfig` functions create a configuration to +isolate Python from the system. For example, to embed Python into an +application. + +This configuration ignores global configuration variables, environments +variables and command line arguments (:c:member:`PyConfig.argv` is not parsed). +The C standard streams (ex: ``stdout``) and the LC_CTYPE locale are left +unchanged by default. + +Configuration files are still used with this configuration. Set the +:ref:`Path Configuration ` ("output fields") to ignore these +configuration files and avoid the function computing the default path +configuration. + + +.. _init-python-config: + +Python Configuration +-------------------- + +:c:func:`PyPreConfig_InitPythonConfig` and :c:func:`PyConfig_InitPythonConfig` +functions create a configuration to build a customized Python which behaves as +the regular Python. + +Environments variables and command line arguments are used to configure +Python, whereas global configuration variables are ignored. + +This function enables C locale coercion (:pep:`538`) and UTF-8 Mode +(:pep:`540`) depending on the LC_CTYPE locale, :envvar:`PYTHONUTF8` and +:envvar:`PYTHONCOERCECLOCALE` environment variables. + +Example of customized Python always running in isolated mode:: + + int main(int argc, char **argv) + { + PyConfig config; + PyStatus status; + + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + goto fail; + } + + config.isolated = 1; + + /* Decode command line arguments. + Implicitly preinitialize Python (in isolated mode). */ + status = PyConfig_SetBytesArgv(&config, argc, argv); + if (PyStatus_Exception(status)) { + goto fail; + } + + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + goto fail; + } + PyConfig_Clear(&config); + + return Py_RunMain(); + + fail: + PyConfig_Clear(&config); + if (PyStatus_IsExit(status)) { + return status.exitcode; + } + /* Display the error message and exit the process with + non-zero exit code */ + Py_ExitStatusException(status); + } + + +.. _init-path-config: + +Path Configuration +------------------ + +:c:type:`PyConfig` contains multiple fields for the path configuration: + +* Path configuration input fields: + + * :c:member:`PyConfig.home` + * :c:member:`PyConfig.pythonpath_env` + * :c:member:`PyConfig.pathconfig_warnings` + +* Path configuration output fields: + + * :c:member:`PyConfig.exec_prefix` + * :c:member:`PyConfig.executable` + * :c:member:`PyConfig.prefix` + * :c:member:`PyConfig.module_search_paths_set`, + :c:member:`PyConfig.module_search_paths` + +If at least one "output field" is not set, Python computes the path +configuration to fill unset fields. If +:c:member:`~PyConfig.module_search_paths_set` is equal to 0, +:c:member:`~PyConfig.module_search_paths` is overriden and +:c:member:`~PyConfig.module_search_paths_set` is set to 1. + +It is possible to completely ignore the function computing the default +path configuration by setting explicitly all path configuration output +fields listed above. A string is considered as set even if it is non-empty. +``module_search_paths`` is considered as set if +``module_search_paths_set`` is set to 1. In this case, path +configuration input fields are ignored as well. + +Set :c:member:`~PyConfig.pathconfig_warnings` to 0 to suppress warnings when +computing the path configuration (Unix only, Windows does not log any warning). + +If :c:member:`~PyConfig.base_prefix` or :c:member:`~PyConfig.base_exec_prefix` +fields are not set, they inherit their value from :c:member:`~PyConfig.prefix` +and :c:member:`~PyConfig.exec_prefix` respectively. + +:c:func:`Py_RunMain` and :c:func:`Py_Main` modify :data:`sys.path`: + +* If :c:member:`~PyConfig.run_filename` is set and is a directory which contains a + ``__main__.py`` script, prepend :c:member:`~PyConfig.run_filename` to + :data:`sys.path`. +* If :c:member:`~PyConfig.isolated` is zero: + + * If :c:member:`~PyConfig.run_module` is set, prepend the current directory + to :data:`sys.path`. Do nothing if the current directory cannot be read. + * If :c:member:`~PyConfig.run_filename` is set, prepend the directory of the + filename to :data:`sys.path`. + * Otherwise, prepend an empty string to :data:`sys.path`. + +If :c:member:`~PyConfig.site_import` is non-zero, :data:`sys.path` can be +modified by the :mod:`site` module. If +:c:member:`~PyConfig.user_site_directory` is non-zero and the user's +site-package directory exists, the :mod:`site` module appends the user's +site-package directory to :data:`sys.path`. + +The following configuration files are used by the path configuration: + +* ``pyvenv.cfg`` +* ``python._pth`` (Windows only) +* ``pybuilddir.txt`` (Unix only) + + +Py_RunMain() +------------ + +.. c:function:: int Py_RunMain(void) + + Execute the command (:c:member:`PyConfig.run_command`), the script + (:c:member:`PyConfig.run_filename`) or the module + (:c:member:`PyConfig.run_module`) specified on the command line or in the + configuration. + + By default and when if :option:`-i` option is used, run the REPL. + + Finally, finalizes Python and returns an exit status that can be passed to + the ``exit()`` function. + +See :ref:`Python Configuration ` for an example of +customized Python always running in isolated mode using +:c:func:`Py_RunMain`. + + +Multi-Phase Initialization Private Provisional API +-------------------------------------------------- + +This section is a private provisional API introducing multi-phase +initialization, the core feature of the :pep:`432`: + +* "Core" initialization phase, "bare minimum Python": + + * Builtin types; + * Builtin exceptions; + * Builtin and frozen modules; + * The :mod:`sys` module is only partially initialized + (ex: :data:`sys.path` doesn't exist yet); + +* "Main" initialization phase, Python is fully initialized: + + * Install and configure :mod:`importlib`; + * Apply the :ref:`Path Configuration `; + * Install signal handlers; + * Finish :mod:`sys` module initialization (ex: create :data:`sys.stdout` + and :data:`sys.path`); + * Enable optional features like :mod:`faulthandler` and :mod:`tracemalloc`; + * Import the :mod:`site` module; + * etc. + +Private provisional API: + +* :c:member:`PyConfig._init_main`: if set to 0, + :c:func:`Py_InitializeFromConfig` stops at the "Core" initialization phase. + +.. c:function:: PyStatus _Py_InitializeMain(void) + + Move to the "Main" initialization phase, finish the Python initialization. + +No module is imported during the "Core" phase and the ``importlib`` module is +not configured: the :ref:`Path Configuration ` is only +applied during the "Main" phase. It may allow to customize Python in Python to +override or tune the :ref:`Path Configuration `, maybe +install a custom sys.meta_path importer or an import hook, etc. + +It may become possible to compute the :ref:`Path Configuration +` in Python, after the Core phase and before the Main phase, +which is one of the :pep:`432` motivation. + +The "Core" phase is not properly defined: what should be and what should +not be available at this phase is not specified yet. The API is marked +as private and provisional: the API can be modified or even be removed +anytime until a proper public API is designed. + +Example running Python code between "Core" and "Main" initialization +phases:: + + void init_python(void) + { + PyStatus status; + PyConfig config; + + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); + } + + config._init_main = 0; + + /* ... customize 'config' configuration ... */ + + status = Py_InitializeFromConfig(&config); + PyConfig_Clear(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); + } + + /* Use sys.stderr because sys.stdout is only created + by _Py_InitializeMain() */ + int res = PyRun_SimpleString( + "import sys; " + "print('Run Python code before _Py_InitializeMain', " + "file=sys.stderr)"); + if (res < 0) { + exit(1); + } + + /* ... put more configuration code here ... */ + + status = _Py_InitializeMain(); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); + } + } diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index a7ff08cfb6bd..3fe0ae47aac3 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -42,6 +42,13 @@ the same library that the Python runtime is using. ``Py_InspectFlag`` is not set. +.. c:function:: int Py_BytesMain(int argc, char **argv) + + Similar to :c:func:`Py_Main` but *argv* is an array of bytes strings. + + .. versionadded:: 3.8 + + .. c:function:: int PyRun_AnyFile(FILE *fp, const char *filename) This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, leaving diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 1180469ff28f..6102d8c357ca 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -182,6 +182,61 @@ Would print ``x*9 + 15=42``. (Contributed by Eric V. Smith and Larry Hastings in :issue:`36817`.) +PEP 587: Python Initialization Configuration +-------------------------------------------- + +The :pep:`587` adds a new C API to configure the Python Initialization +providing finer control on the whole configuration and better error reporting. + +New structures: + +* :c:type:`PyConfig` +* :c:type:`PyPreConfig` +* :c:type:`PyStatus` +* :c:type:`PyWideStringList` + +New functions: + +* :c:func:`PyConfig_Clear` +* :c:func:`PyConfig_InitIsolatedConfig` +* :c:func:`PyConfig_InitPythonConfig` +* :c:func:`PyConfig_Read` +* :c:func:`PyConfig_SetArgv` +* :c:func:`PyConfig_SetBytesArgv` +* :c:func:`PyConfig_SetBytesString` +* :c:func:`PyConfig_SetString` +* :c:func:`PyPreConfig_InitIsolatedConfig` +* :c:func:`PyPreConfig_InitPythonConfig` +* :c:func:`PyStatus_Error` +* :c:func:`PyStatus_Exception` +* :c:func:`PyStatus_Exit` +* :c:func:`PyStatus_IsError` +* :c:func:`PyStatus_IsExit` +* :c:func:`PyStatus_NoMemory` +* :c:func:`PyStatus_Ok` +* :c:func:`PyWideStringList_Append` +* :c:func:`PyWideStringList_Insert` +* :c:func:`Py_BytesMain` +* :c:func:`Py_ExitStatusException` +* :c:func:`Py_InitializeFromConfig` +* :c:func:`Py_PreInitialize` +* :c:func:`Py_PreInitializeFromArgs` +* :c:func:`Py_PreInitializeFromBytesArgs` +* :c:func:`Py_RunMain` + +This PEP also adds ``_PyRuntimeState.preconfig`` (:c:type:`PyPreConfig` type) +and ``PyInterpreterState.config`` (:c:type:`PyConfig` type) fields to these +internal structures. ``PyInterpreterState.config`` becomes the new +reference configuration, replacing global configuration variables and +other private variables. + +See :ref:`Python Initialization Configuration ` for the +documentation. + +See :pep:`587` for a full description. + +(Contributed by Victor Stinner in :issue:`36763`.) + Other Language Changes ====================== diff --git a/Include/Python.h b/Include/Python.h index 17ad5b3071d4..d6e5b139ac67 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -129,7 +129,7 @@ #include "codecs.h" #include "pyerrors.h" -#include "cpython/coreconfig.h" +#include "cpython/initconfig.h" #include "pystate.h" #include "context.h" diff --git a/Include/cpython/coreconfig.h b/Include/cpython/initconfig.h similarity index 84% rename from Include/cpython/coreconfig.h rename to Include/cpython/initconfig.h index ef5fde20e88d..a98b91a86943 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/initconfig.h @@ -5,56 +5,49 @@ extern "C" { #endif -/* --- _PyInitError ----------------------------------------------- */ +/* --- PyStatus ----------------------------------------------- */ typedef struct { enum { - _Py_INIT_ERR_TYPE_OK=0, - _Py_INIT_ERR_TYPE_ERROR=1, - _Py_INIT_ERR_TYPE_EXIT=2 + _PyStatus_TYPE_OK=0, + _PyStatus_TYPE_ERROR=1, + _PyStatus_TYPE_EXIT=2 } _type; - const char *_func; + const char *func; const char *err_msg; int exitcode; -} _PyInitError; +} PyStatus; -PyAPI_FUNC(_PyInitError) _PyInitError_Ok(void); -PyAPI_FUNC(_PyInitError) _PyInitError_Error(const char *err_msg); -PyAPI_FUNC(_PyInitError) _PyInitError_NoMemory(void); -PyAPI_FUNC(_PyInitError) _PyInitError_Exit(int exitcode); -PyAPI_FUNC(int) _PyInitError_IsError(_PyInitError err); -PyAPI_FUNC(int) _PyInitError_IsExit(_PyInitError err); -PyAPI_FUNC(int) _PyInitError_Failed(_PyInitError err); +PyAPI_FUNC(PyStatus) PyStatus_Ok(void); +PyAPI_FUNC(PyStatus) PyStatus_Error(const char *err_msg); +PyAPI_FUNC(PyStatus) PyStatus_NoMemory(void); +PyAPI_FUNC(PyStatus) PyStatus_Exit(int exitcode); +PyAPI_FUNC(int) PyStatus_IsError(PyStatus err); +PyAPI_FUNC(int) PyStatus_IsExit(PyStatus err); +PyAPI_FUNC(int) PyStatus_Exception(PyStatus err); -/* --- _PyWstrList ------------------------------------------------ */ +/* --- PyWideStringList ------------------------------------------------ */ typedef struct { /* If length is greater than zero, items must be non-NULL and all items strings must be non-NULL */ Py_ssize_t length; wchar_t **items; -} _PyWstrList; +} PyWideStringList; +PyAPI_FUNC(PyStatus) PyWideStringList_Append(PyWideStringList *list, + const wchar_t *item); -/* --- _PyPreConfig ----------------------------------------------- */ - -#define _Py_CONFIG_VERSION 1 - -typedef enum { - /* Py_Initialize() API: backward compatibility with Python 3.6 and 3.7 */ - _PyConfig_INIT_COMPAT = 1, - _PyConfig_INIT_PYTHON = 2, - _PyConfig_INIT_ISOLATED = 3 -} _PyConfigInitEnum; +/* --- PyPreConfig ----------------------------------------------- */ typedef struct { int _config_version; /* Internal configuration version, used for ABI compatibility */ int _config_init; /* _PyConfigInitEnum value */ - /* Parse _Py_PreInitializeFromArgs() arguments? - See _PyCoreConfig.parse_argv */ + /* Parse Py_PreInitializeFromBytesArgs() arguments? + See PyConfig.parse_argv */ int parse_argv; /* If greater than 0, enable isolated mode: sys.path contains @@ -124,22 +117,22 @@ typedef struct { /* Memory allocator: PYTHONMALLOC env var. See PyMemAllocatorName for valid values. */ int allocator; -} _PyPreConfig; +} PyPreConfig; -PyAPI_FUNC(void) _PyPreConfig_InitPythonConfig(_PyPreConfig *config); -PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config); +PyAPI_FUNC(void) PyPreConfig_InitPythonConfig(PyPreConfig *config); +PyAPI_FUNC(void) PyPreConfig_InitIsolatedConfig(PyPreConfig *config); -/* --- _PyCoreConfig ---------------------------------------------- */ +/* --- PyConfig ---------------------------------------------- */ typedef struct { int _config_version; /* Internal configuration version, used for ABI compatibility */ int _config_init; /* _PyConfigInitEnum value */ - int isolated; /* Isolated mode? see _PyPreConfig.isolated */ - int use_environment; /* Use environment variables? see _PyPreConfig.use_environment */ - int dev_mode; /* Development mode? See _PyPreConfig.dev_mode */ + int isolated; /* Isolated mode? see PyPreConfig.isolated */ + int use_environment; /* Use environment variables? see PyPreConfig.use_environment */ + int dev_mode; /* Development mode? See PyPreConfig.dev_mode */ /* Install signal handlers? Yes by default. */ int install_signal_handlers; @@ -207,7 +200,7 @@ typedef struct { If argv is empty, an empty string is added to ensure that sys.argv always exists and is never empty. */ - _PyWstrList argv; + PyWideStringList argv; /* Program name: @@ -219,8 +212,8 @@ typedef struct { - Use "python" on Windows, or "python3 on other platforms. */ wchar_t *program_name; - _PyWstrList xoptions; /* Command line -X options */ - _PyWstrList warnoptions; /* Warnings options */ + PyWideStringList xoptions; /* Command line -X options */ + PyWideStringList warnoptions; /* Warnings options */ /* If equal to zero, disable the import of the module site and the site-dependent manipulations of sys.path that it entails. Also disable @@ -347,17 +340,37 @@ typedef struct { int legacy_windows_stdio; #endif + /* Value of the --check-hash-based-pycs command line option: + + - "default" means the 'check_source' flag in hash-based pycs + determines invalidation + - "always" causes the interpreter to hash the source file for + invalidation regardless of value of 'check_source' bit + - "never" causes the interpreter to always assume hash-based pycs are + valid + + The default value is "default". + + See PEP 552 "Deterministic pycs" for more details. */ + wchar_t *check_hash_pycs_mode; + /* --- Path configuration inputs ------------ */ - wchar_t *module_search_path_env; /* PYTHONPATH environment variable */ + /* If greater than 0, suppress _PyPathConfig_Calculate() warnings on Unix. + The parameter has no effect on Windows. + + If set to -1 (default), inherit !Py_FrozenFlag value. */ + int pathconfig_warnings; + + wchar_t *pythonpath_env; /* PYTHONPATH environment variable */ wchar_t *home; /* PYTHONHOME environment variable, see also Py_SetPythonHome(). */ /* --- Path configuration outputs ----------- */ - int use_module_search_paths; /* If non-zero, use module_search_paths */ - _PyWstrList module_search_paths; /* sys.path paths. Computed if - use_module_search_paths is equal + int module_search_paths_set; /* If non-zero, use module_search_paths */ + PyWideStringList module_search_paths; /* sys.path paths. Computed if + module_search_paths_set is equal to zero. */ wchar_t *executable; /* sys.executable */ @@ -384,48 +397,28 @@ typedef struct { Needed by freeze_importlib. */ int _install_importlib; - /* Value of the --check-hash-based-pycs command line option: - - - "default" means the 'check_source' flag in hash-based pycs - determines invalidation - - "always" causes the interpreter to hash the source file for - invalidation regardless of value of 'check_source' bit - - "never" causes the interpreter to always assume hash-based pycs are - valid - - The default value is "default". - - See PEP 552 "Deterministic pycs" for more details. */ - wchar_t *check_hash_pycs_mode; - - /* If greater than 0, suppress _PyPathConfig_Calculate() warnings on Unix. - The parameter has no effect on Windows. - - If set to -1 (default), inherit !Py_FrozenFlag value. */ - int pathconfig_warnings; - /* If equal to 0, stop Python initialization before the "main" phase */ int _init_main; -} _PyCoreConfig; +} PyConfig; -PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config); -PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetString( - _PyCoreConfig *config, +PyAPI_FUNC(PyStatus) PyConfig_InitPythonConfig(PyConfig *config); +PyAPI_FUNC(PyStatus) PyConfig_InitIsolatedConfig(PyConfig *config); +PyAPI_FUNC(void) PyConfig_Clear(PyConfig *); +PyAPI_FUNC(PyStatus) PyConfig_SetString( + PyConfig *config, wchar_t **config_str, const wchar_t *str); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_DecodeLocale( - _PyCoreConfig *config, +PyAPI_FUNC(PyStatus) PyConfig_SetBytesString( + PyConfig *config, wchar_t **config_str, const char *str); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetArgv( - _PyCoreConfig *config, +PyAPI_FUNC(PyStatus) PyConfig_Read(PyConfig *config); +PyAPI_FUNC(PyStatus) PyConfig_SetBytesArgv( + PyConfig *config, Py_ssize_t argc, char * const *argv); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideArgv(_PyCoreConfig *config, +PyAPI_FUNC(PyStatus) PyConfig_SetArgv(PyConfig *config, Py_ssize_t argc, wchar_t * const *argv); diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index ba5666465d7e..2f3a0dbdfe64 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -14,14 +14,14 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, /* PEP 432 Multi-phase initialization API (Private while provisional!) */ -PyAPI_FUNC(_PyInitError) _Py_PreInitialize( - const _PyPreConfig *src_config); -PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromArgs( - const _PyPreConfig *src_config, +PyAPI_FUNC(PyStatus) Py_PreInitialize( + const PyPreConfig *src_config); +PyAPI_FUNC(PyStatus) Py_PreInitializeFromBytesArgs( + const PyPreConfig *src_config, Py_ssize_t argc, char **argv); -PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromWideArgs( - const _PyPreConfig *src_config, +PyAPI_FUNC(PyStatus) Py_PreInitializeFromArgs( + const PyPreConfig *src_config, Py_ssize_t argc, wchar_t **argv); @@ -30,22 +30,22 @@ PyAPI_FUNC(int) _Py_IsCoreInitialized(void); /* Initialization and finalization */ -PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig( - const _PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _Py_InitializeFromArgs( - const _PyCoreConfig *config, +PyAPI_FUNC(PyStatus) Py_InitializeFromConfig( + const PyConfig *config); +PyAPI_FUNC(PyStatus) _Py_InitializeFromArgs( + const PyConfig *config, Py_ssize_t argc, char * const *argv); -PyAPI_FUNC(_PyInitError) _Py_InitializeFromWideArgs( - const _PyCoreConfig *config, +PyAPI_FUNC(PyStatus) _Py_InitializeFromWideArgs( + const PyConfig *config, Py_ssize_t argc, wchar_t * const *argv); -PyAPI_FUNC(_PyInitError) _Py_InitializeMain(void); +PyAPI_FUNC(PyStatus) _Py_InitializeMain(void); -PyAPI_FUNC(int) _Py_RunMain(void); +PyAPI_FUNC(int) Py_RunMain(void); -PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err); +PyAPI_FUNC(void) _Py_NO_RETURN Py_ExitStatusException(PyStatus err); /* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level * exit functions. diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 94331f35e1bd..6b7663fe3315 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -6,13 +6,11 @@ extern "C" { #endif -#include "cpython/coreconfig.h" +#include "cpython/initconfig.h" PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *); PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int); -PyAPI_FUNC(_PyCoreConfig *) _PyInterpreterState_GetCoreConfig(PyInterpreterState *); - PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *); /* State unique per thread */ diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h deleted file mode 100644 index b17737a90ba3..000000000000 --- a/Include/internal/pycore_coreconfig.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef Py_INTERNAL_CORECONFIG_H -#define Py_INTERNAL_CORECONFIG_H -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_BUILD_CORE -# error "this header requires Py_BUILD_CORE define" -#endif - -#include "pycore_pystate.h" /* _PyRuntimeState */ - -/* --- _PyInitError ----------------------------------------------- */ - -/* Almost all errors causing Python initialization to fail */ -#ifdef _MSC_VER - /* Visual Studio 2015 doesn't implement C99 __func__ in C */ -# define _Py_INIT_GET_FUNC() __FUNCTION__ -#else -# define _Py_INIT_GET_FUNC() __func__ -#endif - -#define _Py_INIT_OK() \ - (_PyInitError){._type = _Py_INIT_ERR_TYPE_OK,} - /* other fields are set to 0 */ -#define _Py_INIT_ERR(ERR_MSG) \ - (_PyInitError){ \ - ._type = _Py_INIT_ERR_TYPE_ERROR, \ - ._func = _Py_INIT_GET_FUNC(), \ - .err_msg = (ERR_MSG)} - /* other fields are set to 0 */ -#define _Py_INIT_NO_MEMORY() _Py_INIT_ERR("memory allocation failed") -#define _Py_INIT_EXIT(EXITCODE) \ - (_PyInitError){ \ - ._type = _Py_INIT_ERR_TYPE_EXIT, \ - .exitcode = (EXITCODE)} -#define _Py_INIT_IS_ERROR(err) \ - (err._type == _Py_INIT_ERR_TYPE_ERROR) -#define _Py_INIT_IS_EXIT(err) \ - (err._type == _Py_INIT_ERR_TYPE_EXIT) -#define _Py_INIT_FAILED(err) \ - (err._type != _Py_INIT_ERR_TYPE_OK) - -/* --- _PyWstrList ------------------------------------------------ */ - -#define _PyWstrList_INIT (_PyWstrList){.length = 0, .items = NULL} - -#ifndef NDEBUG -PyAPI_FUNC(int) _PyWstrList_CheckConsistency(const _PyWstrList *list); -#endif -PyAPI_FUNC(void) _PyWstrList_Clear(_PyWstrList *list); -PyAPI_FUNC(int) _PyWstrList_Copy(_PyWstrList *list, - const _PyWstrList *list2); -PyAPI_FUNC(int) _PyWstrList_Append(_PyWstrList *list, - const wchar_t *item); -PyAPI_FUNC(PyObject*) _PyWstrList_AsList(const _PyWstrList *list); -PyAPI_FUNC(int) _PyWstrList_Extend(_PyWstrList *list, - const _PyWstrList *list2); - - -/* --- _PyArgv ---------------------------------------------------- */ - -typedef struct { - Py_ssize_t argc; - int use_bytes_argv; - char * const *bytes_argv; - wchar_t * const *wchar_argv; -} _PyArgv; - -PyAPI_FUNC(_PyInitError) _PyArgv_AsWstrList(const _PyArgv *args, - _PyWstrList *list); - - -/* --- Helper functions ------------------------------------------- */ - -PyAPI_FUNC(int) _Py_str_to_int( - const char *str, - int *result); -PyAPI_FUNC(const wchar_t*) _Py_get_xoption( - const _PyWstrList *xoptions, - const wchar_t *name); -PyAPI_FUNC(const char*) _Py_GetEnv( - int use_environment, - const char *name); -PyAPI_FUNC(void) _Py_get_env_flag( - int use_environment, - int *flag, - const char *name); - -/* Py_GetArgcArgv() helper */ -PyAPI_FUNC(void) _Py_ClearArgcArgv(void); - - -/* --- _PyPreCmdline ------------------------------------------------- */ - -typedef struct { - _PyWstrList argv; - _PyWstrList xoptions; /* "-X value" option */ - int isolated; /* -I option */ - int use_environment; /* -E option */ - int dev_mode; /* -X dev and PYTHONDEVMODE */ -} _PyPreCmdline; - -#define _PyPreCmdline_INIT \ - (_PyPreCmdline){ \ - .use_environment = -1, \ - .isolated = -1, \ - .dev_mode = -1} -/* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ - -PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline); -PyAPI_FUNC(_PyInitError) _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, - const _PyArgv *args); -PyAPI_FUNC(int) _PyPreCmdline_SetCoreConfig( - const _PyPreCmdline *cmdline, - _PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, - const _PyPreConfig *preconfig); - - -/* --- _PyPreConfig ----------------------------------------------- */ - -PyAPI_FUNC(void) _PyPreConfig_InitCompatConfig(_PyPreConfig *config); -PyAPI_FUNC(void) _PyPreConfig_InitFromCoreConfig( - _PyPreConfig *config, - const _PyCoreConfig *coreconfig); -PyAPI_FUNC(void) _PyPreConfig_InitFromPreConfig( - _PyPreConfig *config, - const _PyPreConfig *config2); -PyAPI_FUNC(void) _PyPreConfig_Copy(_PyPreConfig *config, - const _PyPreConfig *config2); -PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); -PyAPI_FUNC(void) _PyPreConfig_GetCoreConfig(_PyPreConfig *config, - const _PyCoreConfig *core_config); -PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config, - const _PyArgv *args); -PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(const _PyPreConfig *config); - - -/* --- _PyCoreConfig ---------------------------------------------- */ - -PyAPI_FUNC(void) _PyCoreConfig_InitCompatConfig(_PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_Copy( - _PyCoreConfig *config, - const _PyCoreConfig *config2); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPathConfig(_PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPathConfig( - const _PyCoreConfig *config); -PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config, - _PyRuntimeState *runtime); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPyArgv( - _PyCoreConfig *config, - const _PyArgv *args); - - -/* --- Function used for testing ---------------------------------- */ - -PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void); - -#ifdef __cplusplus -} -#endif -#endif /* !Py_INTERNAL_CORECONFIG_H */ diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h new file mode 100644 index 000000000000..c0b3d957827a --- /dev/null +++ b/Include/internal/pycore_initconfig.h @@ -0,0 +1,168 @@ +#ifndef Py_INTERNAL_CORECONFIG_H +#define Py_INTERNAL_CORECONFIG_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_pystate.h" /* _PyRuntimeState */ + +/* --- PyStatus ----------------------------------------------- */ + +/* Almost all errors causing Python initialization to fail */ +#ifdef _MSC_VER + /* Visual Studio 2015 doesn't implement C99 __func__ in C */ +# define _PyStatus_GET_FUNC() __FUNCTION__ +#else +# define _PyStatus_GET_FUNC() __func__ +#endif + +#define _PyStatus_OK() \ + (PyStatus){._type = _PyStatus_TYPE_OK,} + /* other fields are set to 0 */ +#define _PyStatus_ERR(ERR_MSG) \ + (PyStatus){ \ + ._type = _PyStatus_TYPE_ERROR, \ + .func = _PyStatus_GET_FUNC(), \ + .err_msg = (ERR_MSG)} + /* other fields are set to 0 */ +#define _PyStatus_NO_MEMORY() _PyStatus_ERR("memory allocation failed") +#define _PyStatus_EXIT(EXITCODE) \ + (PyStatus){ \ + ._type = _PyStatus_TYPE_EXIT, \ + .exitcode = (EXITCODE)} +#define _PyStatus_IS_ERROR(err) \ + (err._type == _PyStatus_TYPE_ERROR) +#define _PyStatus_IS_EXIT(err) \ + (err._type == _PyStatus_TYPE_EXIT) +#define _PyStatus_EXCEPTION(err) \ + (err._type != _PyStatus_TYPE_OK) + +/* --- PyWideStringList ------------------------------------------------ */ + +#define PyWideStringList_INIT (PyWideStringList){.length = 0, .items = NULL} + +#ifndef NDEBUG +PyAPI_FUNC(int) _PyWideStringList_CheckConsistency(const PyWideStringList *list); +#endif +PyAPI_FUNC(void) _PyWideStringList_Clear(PyWideStringList *list); +PyAPI_FUNC(int) _PyWideStringList_Copy(PyWideStringList *list, + const PyWideStringList *list2); +PyAPI_FUNC(PyStatus) _PyWideStringList_Extend(PyWideStringList *list, + const PyWideStringList *list2); +PyAPI_FUNC(PyObject*) _PyWideStringList_AsList(const PyWideStringList *list); + + +/* --- _PyArgv ---------------------------------------------------- */ + +typedef struct { + Py_ssize_t argc; + int use_bytes_argv; + char * const *bytes_argv; + wchar_t * const *wchar_argv; +} _PyArgv; + +PyAPI_FUNC(PyStatus) _PyArgv_AsWstrList(const _PyArgv *args, + PyWideStringList *list); + + +/* --- Helper functions ------------------------------------------- */ + +PyAPI_FUNC(int) _Py_str_to_int( + const char *str, + int *result); +PyAPI_FUNC(const wchar_t*) _Py_get_xoption( + const PyWideStringList *xoptions, + const wchar_t *name); +PyAPI_FUNC(const char*) _Py_GetEnv( + int use_environment, + const char *name); +PyAPI_FUNC(void) _Py_get_env_flag( + int use_environment, + int *flag, + const char *name); + +/* Py_GetArgcArgv() helper */ +PyAPI_FUNC(void) _Py_ClearArgcArgv(void); + + +/* --- _PyPreCmdline ------------------------------------------------- */ + +typedef struct { + PyWideStringList argv; + PyWideStringList xoptions; /* "-X value" option */ + int isolated; /* -I option */ + int use_environment; /* -E option */ + int dev_mode; /* -X dev and PYTHONDEVMODE */ +} _PyPreCmdline; + +#define _PyPreCmdline_INIT \ + (_PyPreCmdline){ \ + .use_environment = -1, \ + .isolated = -1, \ + .dev_mode = -1} +/* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ + +extern void _PyPreCmdline_Clear(_PyPreCmdline *cmdline); +extern PyStatus _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, + const _PyArgv *args); +extern PyStatus _PyPreCmdline_SetConfig( + const _PyPreCmdline *cmdline, + PyConfig *config); +extern PyStatus _PyPreCmdline_Read(_PyPreCmdline *cmdline, + const PyPreConfig *preconfig); + + +/* --- PyPreConfig ----------------------------------------------- */ + +PyAPI_FUNC(void) _PyPreConfig_InitCompatConfig(PyPreConfig *preconfig); +extern void _PyPreConfig_InitFromConfig( + PyPreConfig *preconfig, + const PyConfig *config); +extern void _PyPreConfig_InitFromPreConfig( + PyPreConfig *preconfig, + const PyPreConfig *config2); +extern PyObject* _PyPreConfig_AsDict(const PyPreConfig *preconfig); +extern void _PyPreConfig_GetConfig(PyPreConfig *preconfig, + const PyConfig *config); +extern PyStatus _PyPreConfig_Read(PyPreConfig *preconfig, + const _PyArgv *args); +extern PyStatus _PyPreConfig_Write(const PyPreConfig *preconfig); + + +/* --- PyConfig ---------------------------------------------- */ + +#define _Py_CONFIG_VERSION 1 + +typedef enum { + /* Py_Initialize() API: backward compatibility with Python 3.6 and 3.7 */ + _PyConfig_INIT_COMPAT = 1, + _PyConfig_INIT_PYTHON = 2, + _PyConfig_INIT_ISOLATED = 3 +} _PyConfigInitEnum; + +PyAPI_FUNC(void) _PyConfig_InitCompatConfig(PyConfig *config); +extern PyStatus _PyConfig_Copy( + PyConfig *config, + const PyConfig *config2); +extern PyStatus _PyConfig_InitPathConfig(PyConfig *config); +extern PyStatus _PyConfig_SetPathConfig( + const PyConfig *config); +extern void _PyConfig_Write(const PyConfig *config, + _PyRuntimeState *runtime); +extern PyStatus _PyConfig_SetPyArgv( + PyConfig *config, + const _PyArgv *args); + + +/* --- Function used for testing ---------------------------------- */ + +PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CORECONFIG_H */ diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index bee391187cc9..be12c6f5cf32 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -37,17 +37,17 @@ typedef struct _PyPathConfig { PyAPI_DATA(_PyPathConfig) _Py_path_config; -PyAPI_FUNC(void) _PyPathConfig_ClearGlobal(void); -PyAPI_FUNC(_PyInitError) _PyPathConfig_SetGlobal( - const struct _PyPathConfig *config); - -PyAPI_FUNC(_PyInitError) _PyPathConfig_Calculate_impl( - _PyPathConfig *config, - const _PyCoreConfig *core_config); -PyAPI_FUNC(int) _PyPathConfig_ComputeSysPath0( - const _PyWstrList *argv, +extern void _PyPathConfig_ClearGlobal(void); +extern PyStatus _PyPathConfig_SetGlobal( + const struct _PyPathConfig *pathconfig); + +extern PyStatus _PyPathConfig_Calculate( + _PyPathConfig *pathconfig, + const PyConfig *config); +extern int _PyPathConfig_ComputeSysPath0( + const PyWideStringList *argv, PyObject **path0); -PyAPI_FUNC(int) _Py_FindEnvConfigValue( +extern int _Py_FindEnvConfigValue( FILE *env_file, const wchar_t *key, wchar_t *value, diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 13a31c262da8..69761cef9822 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -8,20 +8,20 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_coreconfig.h" /* _PyArgv */ +#include "pycore_initconfig.h" /* _PyArgv */ #include "pycore_pystate.h" /* _PyRuntimeState */ /* True if the main interpreter thread exited due to an unhandled * KeyboardInterrupt exception, suggesting the user pressed ^C. */ PyAPI_DATA(int) _Py_UnhandledKeyboardInterrupt; -PyAPI_FUNC(int) _Py_UnixMain(int argc, char **argv); +PyAPI_FUNC(int) Py_BytesMain(int argc, char **argv); extern int _Py_SetFileSystemEncoding( const char *encoding, const char *errors); extern void _Py_ClearFileSystemEncoding(void); -extern _PyInitError _PyUnicode_InitEncodings(PyInterpreterState *interp); +extern PyStatus _PyUnicode_InitEncodings(PyInterpreterState *interp); #ifdef MS_WINDOWS extern int _PyUnicode_EnableLegacyWindowsFSEncoding(void); #endif @@ -32,30 +32,30 @@ PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc); /* Various one-time initializers */ -extern _PyInitError _PyUnicode_Init(void); +extern PyStatus _PyUnicode_Init(void); extern int _PyStructSequence_Init(void); extern int _PyLong_Init(void); -extern _PyInitError _PyFaulthandler_Init(int enable); +extern PyStatus _PyFaulthandler_Init(int enable); extern int _PyTraceMalloc_Init(int enable); extern PyObject * _PyBuiltin_Init(void); -extern _PyInitError _PySys_Create( +extern PyStatus _PySys_Create( _PyRuntimeState *runtime, PyInterpreterState *interp, PyObject **sysmod_p); -extern _PyInitError _PySys_SetPreliminaryStderr(PyObject *sysdict); +extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict); extern int _PySys_InitMain( _PyRuntimeState *runtime, PyInterpreterState *interp); -extern _PyInitError _PyImport_Init(PyInterpreterState *interp); -extern _PyInitError _PyExc_Init(void); -extern _PyInitError _PyErr_Init(void); -extern _PyInitError _PyBuiltins_AddExceptions(PyObject * bltinmod); -extern _PyInitError _PyImportHooks_Init(void); +extern PyStatus _PyImport_Init(PyInterpreterState *interp); +extern PyStatus _PyExc_Init(void); +extern PyStatus _PyErr_Init(void); +extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod); +extern PyStatus _PyImportHooks_Init(void); extern int _PyFloat_Init(void); -extern _PyInitError _Py_HashRandomization_Init(const _PyCoreConfig *); +extern PyStatus _Py_HashRandomization_Init(const PyConfig *); -extern _PyInitError _PyTypes_Init(void); -extern _PyInitError _PyImportZip_Init(PyInterpreterState *interp); +extern PyStatus _PyTypes_Init(void); +extern PyStatus _PyImportZip_Init(PyInterpreterState *interp); /* Various internal finalizers */ @@ -94,11 +94,11 @@ extern void _PyGILState_Fini(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyGC_DumpShutdownStats(_PyRuntimeState *runtime); -PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPyArgv( - const _PyPreConfig *src_config, +PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv( + const PyPreConfig *src_config, const _PyArgv *args); -PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromCoreConfig( - const _PyCoreConfig *coreconfig, +PyAPI_FUNC(PyStatus) _Py_PreInitializeFromConfig( + const PyConfig *config, const _PyArgv *args); diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index ef1d8a061f17..3ab4009770c9 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -8,7 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "cpython/coreconfig.h" +#include "cpython/initconfig.h" #include "fileobject.h" #include "pystate.h" #include "pythread.h" @@ -106,7 +106,7 @@ struct _is { _Py_error_handler error_handler; } fs_codec; - _PyCoreConfig core_config; + PyConfig config; #ifdef HAVE_DLOPEN int dlopenflags; #endif @@ -193,7 +193,7 @@ struct _gilstate_runtime_state { /* Full Python runtime state */ typedef struct pyruntimestate { - /* Is Python pre-initialized? Set to 1 by _Py_PreInitialize() */ + /* Is Python pre-initialized? Set to 1 by Py_PreInitialize() */ int pre_initialized; /* Is Python core initialized? Set to 1 by _Py_InitializeCore() */ @@ -234,7 +234,7 @@ typedef struct pyruntimestate { struct _ceval_runtime_state ceval; struct _gilstate_runtime_state gilstate; - _PyPreConfig preconfig; + PyPreConfig preconfig; Py_OpenCodeHookFunction open_code_hook; void *open_code_userdata; @@ -248,13 +248,13 @@ typedef struct pyruntimestate { /* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ PyAPI_DATA(_PyRuntimeState) _PyRuntime; -PyAPI_FUNC(_PyInitError) _PyRuntimeState_Init(_PyRuntimeState *runtime); +PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); /* Initialize _PyRuntimeState. Return NULL on success, or return an error message on failure. */ -PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void); +PyAPI_FUNC(PyStatus) _PyRuntime_Initialize(void); PyAPI_FUNC(void) _PyRuntime_Finalize(void); @@ -307,7 +307,7 @@ PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap( struct _gilstate_runtime_state *gilstate, PyThreadState *newts); -PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *runtime); +PyAPI_FUNC(PyStatus) _PyInterpreterState_Enable(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyGILState_Reinit(_PyRuntimeState *runtime); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 87e90f74bb13..a39ef2babbdb 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -272,7 +272,7 @@ def test_initialize_pymain(self): def test_run_main(self): out, err = self.run_embedded_interpreter("test_run_main") - self.assertEqual(out.rstrip(), "_Py_RunMain(): sys.argv=['-c', 'arg2']") + self.assertEqual(out.rstrip(), "Py_RunMain(): sys.argv=['-c', 'arg2']") self.assertEqual(err, '') @@ -321,7 +321,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'use_environment', ] - CORE_CONFIG_COMPAT = { + CONFIG_COMPAT = { '_config_init': API_COMPAT, 'isolated': 0, 'use_environment': 1, @@ -349,7 +349,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'xoptions': [], 'warnoptions': [], - 'module_search_path_env': None, + 'pythonpath_env': None, 'home': None, 'executable': GET_DEFAULT_CONFIG, @@ -386,16 +386,16 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_init_main': 1, } if MS_WINDOWS: - CORE_CONFIG_COMPAT.update({ + CONFIG_COMPAT.update({ 'legacy_windows_stdio': 0, }) - CORE_CONFIG_PYTHON = dict(CORE_CONFIG_COMPAT, + CONFIG_PYTHON = dict(CONFIG_COMPAT, _config_init=API_PYTHON, configure_c_stdio=1, parse_argv=1, ) - CORE_CONFIG_ISOLATED = dict(CORE_CONFIG_COMPAT, + CONFIG_ISOLATED = dict(CONFIG_COMPAT, _config_init=API_ISOLATED, isolated=1, use_environment=0, @@ -408,7 +408,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): pathconfig_warnings=0, ) if MS_WINDOWS: - CORE_CONFIG_ISOLATED['legacy_windows_stdio'] = 0 + CONFIG_ISOLATED['legacy_windows_stdio'] = 0 # global config DEFAULT_GLOBAL_CONFIG = { @@ -535,12 +535,12 @@ def get_expected_config(self, expected_preconfig, expected, env, api, if expected['program_name'] is self.GET_DEFAULT_CONFIG: expected['program_name'] = './_testembed' - core_config = configs['core_config'] + config = configs['config'] for key, value in expected.items(): if value is self.GET_DEFAULT_CONFIG: - expected[key] = core_config[key] + expected[key] = config[key] - prepend_path = expected['module_search_path_env'] + prepend_path = expected['pythonpath_env'] if prepend_path is not None: expected['module_search_paths'] = [prepend_path, *expected['module_search_paths']] if add_path is not None: @@ -550,34 +550,34 @@ def get_expected_config(self, expected_preconfig, expected, env, api, if key not in expected_preconfig: expected_preconfig[key] = expected[key] - def check_pre_config(self, config, expected): - pre_config = dict(config['pre_config']) + def check_pre_config(self, configs, expected): + pre_config = dict(configs['pre_config']) for key, value in list(expected.items()): if value is self.IGNORE_CONFIG: del pre_config[key] del expected[key] self.assertEqual(pre_config, expected) - def check_core_config(self, config, expected): - core_config = dict(config['core_config']) + def check_config(self, configs, expected): + config = dict(configs['config']) for key, value in list(expected.items()): if value is self.IGNORE_CONFIG: - del core_config[key] + del config[key] del expected[key] - self.assertEqual(core_config, expected) + self.assertEqual(config, expected) - def check_global_config(self, config): - pre_config = config['pre_config'] - core_config = config['core_config'] + def check_global_config(self, configs): + pre_config = configs['pre_config'] + config = configs['config'] expected = dict(self.DEFAULT_GLOBAL_CONFIG) for item in self.COPY_GLOBAL_CONFIG: if len(item) == 3: global_key, core_key, opposite = item - expected[global_key] = 0 if core_config[core_key] else 1 + expected[global_key] = 0 if config[core_key] else 1 else: global_key, core_key = item - expected[global_key] = core_config[core_key] + expected[global_key] = config[core_key] for item in self.COPY_GLOBAL_PRE_CONFIG: if len(item) == 3: global_key, core_key, opposite = item @@ -586,9 +586,9 @@ def check_global_config(self, config): global_key, core_key = item expected[global_key] = pre_config[core_key] - self.assertEqual(config['global_config'], expected) + self.assertEqual(configs['global_config'], expected) - def check_config(self, testname, expected_config=None, + def check_all_configs(self, testname, expected_config=None, expected_preconfig=None, add_path=None, stderr=None, *, api): env = dict(os.environ) @@ -610,11 +610,11 @@ def check_config(self, testname, expected_config=None, expected_config = {} if api == API_PYTHON: - default_config = self.CORE_CONFIG_PYTHON + default_config = self.CONFIG_PYTHON elif api == API_ISOLATED: - default_config = self.CORE_CONFIG_ISOLATED + default_config = self.CONFIG_ISOLATED else: - default_config = self.CORE_CONFIG_COMPAT + default_config = self.CONFIG_COMPAT expected_config = dict(default_config, **expected_config) self.get_expected_config(expected_preconfig, @@ -627,22 +627,22 @@ def check_config(self, testname, expected_config=None, if stderr is not None: self.assertEqual(err.rstrip(), stderr) try: - config = json.loads(out) + configs = json.loads(out) except json.JSONDecodeError: self.fail(f"fail to decode stdout: {out!r}") - self.check_pre_config(config, expected_preconfig) - self.check_core_config(config, expected_config) - self.check_global_config(config) + self.check_pre_config(configs, expected_preconfig) + self.check_config(configs, expected_config) + self.check_global_config(configs) def test_init_default_config(self): - self.check_config("test_init_initialize_config", api=API_COMPAT) + self.check_all_configs("test_init_initialize_config", api=API_COMPAT) def test_preinit_compat_config(self): - self.check_config("test_preinit_compat_config", api=API_COMPAT) + self.check_all_configs("test_preinit_compat_config", api=API_COMPAT) def test_init_compat_config(self): - self.check_config("test_init_compat_config", api=API_COMPAT) + self.check_all_configs("test_init_compat_config", api=API_COMPAT) def test_init_global_config(self): preconfig = { @@ -664,8 +664,8 @@ def test_init_global_config(self): 'user_site_directory': 0, 'pathconfig_warnings': 0, } - self.check_config("test_init_global_config", config, preconfig, - api=API_COMPAT) + self.check_all_configs("test_init_global_config", config, preconfig, + api=API_COMPAT) def test_init_from_config(self): preconfig = { @@ -689,7 +689,7 @@ def test_init_from_config(self): 'program_name': './conf_program_name', 'argv': ['-c', 'arg2'], 'parse_argv': 1, - 'xoptions': ['core_xoption1=3', 'core_xoption2=', 'core_xoption3'], + 'xoptions': ['xoption1=3', 'xoption2=', 'xoption3'], 'warnoptions': ['error::ResourceWarning', 'default::BytesWarning'], 'run_command': 'pass\n', @@ -709,8 +709,8 @@ def test_init_from_config(self): 'check_hash_pycs_mode': 'always', 'pathconfig_warnings': 0, } - self.check_config("test_init_from_config", config, preconfig, - api=API_COMPAT) + self.check_all_configs("test_init_from_config", config, preconfig, + api=API_COMPAT) def test_init_compat_env(self): preconfig = { @@ -724,7 +724,7 @@ def test_init_compat_env(self): 'malloc_stats': 1, 'inspect': 1, 'optimization_level': 2, - 'module_search_path_env': '/my/path', + 'pythonpath_env': '/my/path', 'pycache_prefix': 'env_pycache_prefix', 'write_bytecode': 0, 'verbose': 1, @@ -735,8 +735,8 @@ def test_init_compat_env(self): 'faulthandler': 1, 'warnoptions': ['EnvVar'], } - self.check_config("test_init_compat_env", config, preconfig, - api=API_COMPAT) + self.check_all_configs("test_init_compat_env", config, preconfig, + api=API_COMPAT) def test_init_python_env(self): preconfig = { @@ -751,7 +751,7 @@ def test_init_python_env(self): 'malloc_stats': 1, 'inspect': 1, 'optimization_level': 2, - 'module_search_path_env': '/my/path', + 'pythonpath_env': '/my/path', 'pycache_prefix': 'env_pycache_prefix', 'write_bytecode': 0, 'verbose': 1, @@ -762,24 +762,24 @@ def test_init_python_env(self): 'faulthandler': 1, 'warnoptions': ['EnvVar'], } - self.check_config("test_init_python_env", config, preconfig, - api=API_PYTHON) + self.check_all_configs("test_init_python_env", config, preconfig, + api=API_PYTHON) def test_init_env_dev_mode(self): preconfig = dict(allocator=PYMEM_ALLOCATOR_DEBUG) config = dict(dev_mode=1, faulthandler=1, warnoptions=['default']) - self.check_config("test_init_env_dev_mode", config, preconfig, - api=API_COMPAT) + self.check_all_configs("test_init_env_dev_mode", config, preconfig, + api=API_COMPAT) def test_init_env_dev_mode_alloc(self): preconfig = dict(allocator=PYMEM_ALLOCATOR_MALLOC) config = dict(dev_mode=1, faulthandler=1, warnoptions=['default']) - self.check_config("test_init_env_dev_mode_alloc", config, preconfig, - api=API_COMPAT) + self.check_all_configs("test_init_env_dev_mode_alloc", config, preconfig, + api=API_COMPAT) def test_init_dev_mode(self): preconfig = { @@ -790,8 +790,8 @@ def test_init_dev_mode(self): 'dev_mode': 1, 'warnoptions': ['default'], } - self.check_config("test_init_dev_mode", config, preconfig, - api=API_PYTHON) + self.check_all_configs("test_init_dev_mode", config, preconfig, + api=API_PYTHON) def test_preinit_parse_argv(self): # Pre-initialize implicitly using argv: make sure that -X dev @@ -807,8 +807,8 @@ def test_preinit_parse_argv(self): 'warnoptions': ['default'], 'xoptions': ['dev'], } - self.check_config("test_preinit_parse_argv", config, preconfig, - api=API_PYTHON) + self.check_all_configs("test_preinit_parse_argv", config, preconfig, + api=API_PYTHON) def test_preinit_dont_parse_argv(self): # -X dev must be ignored by isolated preconfiguration @@ -820,8 +820,8 @@ def test_preinit_dont_parse_argv(self): "-X", "dev", "-X", "utf8", "script.py"], 'isolated': 0, } - self.check_config("test_preinit_dont_parse_argv", config, preconfig, - api=API_ISOLATED) + self.check_all_configs("test_preinit_dont_parse_argv", config, preconfig, + api=API_ISOLATED) def test_init_isolated_flag(self): config = { @@ -829,7 +829,7 @@ def test_init_isolated_flag(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("test_init_isolated_flag", config, api=API_PYTHON) + self.check_all_configs("test_init_isolated_flag", config, api=API_PYTHON) def test_preinit_isolated1(self): # _PyPreConfig.isolated=1, _PyCoreConfig.isolated not set @@ -838,7 +838,7 @@ def test_preinit_isolated1(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("test_preinit_isolated1", config, api=API_COMPAT) + self.check_all_configs("test_preinit_isolated1", config, api=API_COMPAT) def test_preinit_isolated2(self): # _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 @@ -847,19 +847,19 @@ def test_preinit_isolated2(self): 'use_environment': 0, 'user_site_directory': 0, } - self.check_config("test_preinit_isolated2", config, api=API_COMPAT) + self.check_all_configs("test_preinit_isolated2", config, api=API_COMPAT) def test_preinit_isolated_config(self): - self.check_config("test_preinit_isolated_config", api=API_ISOLATED) + self.check_all_configs("test_preinit_isolated_config", api=API_ISOLATED) def test_init_isolated_config(self): - self.check_config("test_init_isolated_config", api=API_ISOLATED) + self.check_all_configs("test_init_isolated_config", api=API_ISOLATED) def test_preinit_python_config(self): - self.check_config("test_preinit_python_config", api=API_PYTHON) + self.check_all_configs("test_preinit_python_config", api=API_PYTHON) def test_init_python_config(self): - self.check_config("test_init_python_config", api=API_PYTHON) + self.check_all_configs("test_init_python_config", api=API_PYTHON) def test_init_dont_configure_locale(self): # _PyPreConfig.configure_locale=0 @@ -867,64 +867,64 @@ def test_init_dont_configure_locale(self): 'configure_locale': 0, 'coerce_c_locale': 0, } - self.check_config("test_init_dont_configure_locale", {}, preconfig, - api=API_PYTHON) + self.check_all_configs("test_init_dont_configure_locale", {}, preconfig, + api=API_PYTHON) def test_init_read_set(self): - core_config = { + config = { 'program_name': './init_read_set', 'executable': 'my_executable', } - self.check_config("test_init_read_set", core_config, - api=API_PYTHON, - add_path="init_read_set_path") + self.check_all_configs("test_init_read_set", config, + api=API_PYTHON, + add_path="init_read_set_path") def test_init_run_main(self): code = ('import _testinternalcapi, json; ' 'print(json.dumps(_testinternalcapi.get_configs()))') - core_config = { + config = { 'argv': ['-c', 'arg2'], 'program_name': './python3', 'run_command': code + '\n', 'parse_argv': 1, } - self.check_config("test_init_run_main", core_config, api=API_PYTHON) + self.check_all_configs("test_init_run_main", config, api=API_PYTHON) def test_init_main(self): code = ('import _testinternalcapi, json; ' 'print(json.dumps(_testinternalcapi.get_configs()))') - core_config = { + config = { 'argv': ['-c', 'arg2'], 'program_name': './python3', 'run_command': code + '\n', 'parse_argv': 1, '_init_main': 0, } - self.check_config("test_init_main", core_config, - api=API_PYTHON, - stderr="Run Python code before _Py_InitializeMain") + self.check_all_configs("test_init_main", config, + api=API_PYTHON, + stderr="Run Python code before _Py_InitializeMain") def test_init_parse_argv(self): - core_config = { + config = { 'parse_argv': 1, 'argv': ['-c', 'arg1', '-v', 'arg3'], 'program_name': './argv0', 'run_command': 'pass\n', 'use_environment': 0, } - self.check_config("test_init_parse_argv", core_config, api=API_PYTHON) + self.check_all_configs("test_init_parse_argv", config, api=API_PYTHON) def test_init_dont_parse_argv(self): pre_config = { 'parse_argv': 0, } - core_config = { + config = { 'parse_argv': 0, 'argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], 'program_name': './argv0', } - self.check_config("test_init_dont_parse_argv", core_config, pre_config, - api=API_PYTHON) + self.check_all_configs("test_init_dont_parse_argv", config, pre_config, + api=API_PYTHON) class AuditingTests(EmbeddingTestsMixin, unittest.TestCase): diff --git a/Makefile.pre.in b/Makefile.pre.in index 8071a94dd6ff..0bf5df4b68e5 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -322,7 +322,7 @@ PYTHON_OBJS= \ Python/ceval.o \ Python/codecs.o \ Python/compile.o \ - Python/coreconfig.o \ + Python/context.o \ Python/dynamic_annotations.o \ Python/errors.o \ Python/frozenmain.o \ @@ -333,8 +333,10 @@ PYTHON_OBJS= \ Python/getplatform.o \ Python/getversion.o \ Python/graminit.o \ + Python/hamt.o \ Python/import.o \ Python/importdl.o \ + Python/initconfig.o \ Python/marshal.o \ Python/modsupport.o \ Python/mysnprintf.o \ @@ -349,8 +351,6 @@ PYTHON_OBJS= \ Python/pylifecycle.o \ Python/pymath.o \ Python/pystate.o \ - Python/context.o \ - Python/hamt.o \ Python/pythonrun.o \ Python/pytime.o \ Python/bootstrap_hash.o \ @@ -1052,9 +1052,9 @@ PYTHON_HEADERS= \ $(srcdir)/Include/Python-ast.h \ \ $(srcdir)/Include/cpython/abstract.h \ - $(srcdir)/Include/cpython/coreconfig.h \ $(srcdir)/Include/cpython/dictobject.h \ $(srcdir)/Include/cpython/fileobject.h \ + $(srcdir)/Include/cpython/initconfig.h \ $(srcdir)/Include/cpython/interpreteridobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ @@ -1072,11 +1072,11 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_ceval.h \ $(srcdir)/Include/internal/pycore_condvar.h \ $(srcdir)/Include/internal/pycore_context.h \ - $(srcdir)/Include/internal/pycore_coreconfig.h \ $(srcdir)/Include/internal/pycore_fileutils.h \ $(srcdir)/Include/internal/pycore_getopt.h \ $(srcdir)/Include/internal/pycore_gil.h \ $(srcdir)/Include/internal/pycore_hamt.h \ + $(srcdir)/Include/internal/pycore_initconfig.h \ $(srcdir)/Include/internal/pycore_object.h \ $(srcdir)/Include/internal/pycore_pathconfig.h \ $(srcdir)/Include/internal/pycore_pyerrors.h \ diff --git a/Misc/NEWS.d/next/C API/2019-05-27-12-25-25.bpo-36763.bHCA9j.rst b/Misc/NEWS.d/next/C API/2019-05-27-12-25-25.bpo-36763.bHCA9j.rst new file mode 100644 index 000000000000..fc5a48107cfd --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-05-27-12-25-25.bpo-36763.bHCA9j.rst @@ -0,0 +1 @@ +Implement the :pep:`587` "Python Initialization Configuration". diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index ba8f0018043f..5c2f019e840b 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -377,7 +377,7 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, { PyObject *RawIO_class = (PyObject *)&PyFileIO_Type; #ifdef MS_WINDOWS - _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (!config->legacy_windows_stdio && _PyIO_get_console_type(path_or_fd) != '\0') { RawIO_class = (PyObject *)&PyWindowsConsoleIO_Type; encoding = "utf-8"; diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 6a0d9bec5af3..a5727b8deed3 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -288,7 +288,7 @@ iobase_finalize(PyObject *self) shutdown issues). */ if (res == NULL) { #ifndef Py_DEBUG - const _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + const PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (config->dev_mode) { PyErr_WriteUnraisable(self); } diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 3a43ec16850f..3ea77e6934db 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -9,7 +9,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" static PyObject * diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index aa466c46ccff..f2b5a503f4ee 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_traceback.h" #include "pythread.h" #include @@ -1315,7 +1315,7 @@ faulthandler_init_enable(void) return 0; } -_PyInitError +PyStatus _PyFaulthandler_Init(int enable) { #ifdef HAVE_SIGALTSTACK @@ -1340,17 +1340,17 @@ _PyFaulthandler_Init(int enable) thread.cancel_event = PyThread_allocate_lock(); thread.running = PyThread_allocate_lock(); if (!thread.cancel_event || !thread.running) { - return _Py_INIT_ERR("failed to allocate locks for faulthandler"); + return _PyStatus_ERR("failed to allocate locks for faulthandler"); } PyThread_acquire_lock(thread.cancel_event, 1); #endif if (enable) { if (faulthandler_init_enable() < 0) { - return _Py_INIT_ERR("failed to enable faulthandler"); + return _PyStatus_ERR("failed to enable faulthandler"); } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } void _PyFaulthandler_Fini(void) diff --git a/Modules/getpath.c b/Modules/getpath.c index 3dcfcef7bd78..5f8073818802 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -1,7 +1,7 @@ /* Return the initial module search path. */ #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "osdefs.h" #include "pycore_fileutils.h" #include "pycore_pathconfig.h" @@ -115,10 +115,10 @@ extern "C" { #define DECODE_LOCALE_ERR(NAME, LEN) \ ((LEN) == (size_t)-2) \ - ? _Py_INIT_ERR("cannot decode " NAME) \ - : _Py_INIT_NO_MEMORY() + ? _PyStatus_ERR("cannot decode " NAME) \ + : _PyStatus_NO_MEMORY() -#define PATHLEN_ERR() _Py_INIT_ERR("path configuration: path too long") +#define PATHLEN_ERR() _PyStatus_ERR("path configuration: path too long") typedef struct { wchar_t *path_env; /* PATH environment variable */ @@ -236,7 +236,7 @@ isdir(wchar_t *filename) /* Add a path component, by appending stuff to buffer. buflen: 'buffer' length in characters including trailing NUL. */ -static _PyInitError +static PyStatus joinpath(wchar_t *buffer, const wchar_t *stuff, size_t buflen) { size_t n, k; @@ -261,7 +261,7 @@ joinpath(wchar_t *buffer, const wchar_t *stuff, size_t buflen) wcsncpy(buffer+n, stuff, k); buffer[n+k] = '\0'; - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -280,7 +280,7 @@ safe_wcscpy(wchar_t *dst, const wchar_t *src, size_t n) /* copy_absolute requires that path be allocated at least 'pathlen' characters (including trailing NUL). */ -static _PyInitError +static PyStatus copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen) { if (p[0] == SEP) { @@ -294,38 +294,38 @@ copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen) if (safe_wcscpy(path, p, pathlen) < 0) { return PATHLEN_ERR(); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } if (p[0] == '.' && p[1] == SEP) { p += 2; } - _PyInitError err = joinpath(path, p, pathlen); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = joinpath(path, p, pathlen); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* path_len: path length in characters including trailing NUL */ -static _PyInitError +static PyStatus absolutize(wchar_t *path, size_t path_len) { if (path[0] == SEP) { - return _Py_INIT_OK(); + return _PyStatus_OK(); } wchar_t abs_path[MAXPATHLEN+1]; - _PyInitError err = copy_absolute(abs_path, path, Py_ARRAY_LENGTH(abs_path)); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = copy_absolute(abs_path, path, Py_ARRAY_LENGTH(abs_path)); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (safe_wcscpy(path, abs_path, path_len) < 0) { return PATHLEN_ERR(); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -335,14 +335,14 @@ absolutize(wchar_t *path, size_t path_len) #endif /* pathlen: 'path' length in characters including trailing NUL */ -static _PyInitError +static PyStatus add_exe_suffix(wchar_t *progpath, size_t progpathlen) { /* Check for already have an executable suffix */ size_t n = wcslen(progpath); size_t s = wcslen(EXE_SUFFIX); if (wcsncasecmp(EXE_SUFFIX, progpath + n - s, s) == 0) { - return _Py_INIT_OK(); + return _PyStatus_OK(); } if (n + s >= progpathlen) { @@ -356,7 +356,7 @@ add_exe_suffix(wchar_t *progpath, size_t progpathlen) progpath[n] = '\0'; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } #endif @@ -364,43 +364,43 @@ add_exe_suffix(wchar_t *progpath, size_t progpathlen) /* search_for_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ -static _PyInitError -search_for_prefix(const _PyCoreConfig *core_config, PyCalculatePath *calculate, +static PyStatus +search_for_prefix(const PyConfig *config, PyCalculatePath *calculate, wchar_t *prefix, size_t prefix_len, int *found) { - _PyInitError err; + PyStatus status; size_t n; wchar_t *vpath; /* If PYTHONHOME is set, we believe it unconditionally */ - if (core_config->home) { - if (safe_wcscpy(prefix, core_config->home, prefix_len) < 0) { + if (config->home) { + if (safe_wcscpy(prefix, config->home, prefix_len) < 0) { return PATHLEN_ERR(); } wchar_t *delim = wcschr(prefix, DELIM); if (delim) { *delim = L'\0'; } - err = joinpath(prefix, calculate->lib_python, prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, calculate->lib_python, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = joinpath(prefix, LANDMARK, prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, LANDMARK, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } *found = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Check to see if argv[0] is in the build directory */ if (safe_wcscpy(prefix, calculate->argv0_path, prefix_len) < 0) { return PATHLEN_ERR(); } - err = joinpath(prefix, L"Modules/Setup.local", prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, L"Modules/Setup.local", prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (isfile(prefix)) { @@ -410,48 +410,48 @@ search_for_prefix(const _PyCoreConfig *core_config, PyCalculatePath *calculate, if (safe_wcscpy(prefix, calculate->argv0_path, prefix_len) < 0) { return PATHLEN_ERR(); } - err = joinpath(prefix, vpath, prefix_len); + status = joinpath(prefix, vpath, prefix_len); PyMem_RawFree(vpath); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = joinpath(prefix, L"Lib", prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, L"Lib", prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = joinpath(prefix, LANDMARK, prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, LANDMARK, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (ismodule(prefix, prefix_len)) { *found = -1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } } } /* Search from argv0_path, until root is found */ - err = copy_absolute(prefix, calculate->argv0_path, prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = copy_absolute(prefix, calculate->argv0_path, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } do { n = wcslen(prefix); - err = joinpath(prefix, calculate->lib_python, prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, calculate->lib_python, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = joinpath(prefix, LANDMARK, prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, LANDMARK, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (ismodule(prefix, prefix_len)) { *found = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } prefix[n] = L'\0'; reduce(prefix); @@ -461,59 +461,59 @@ search_for_prefix(const _PyCoreConfig *core_config, PyCalculatePath *calculate, if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { return PATHLEN_ERR(); } - err = joinpath(prefix, calculate->lib_python, prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, calculate->lib_python, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = joinpath(prefix, LANDMARK, prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, LANDMARK, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (ismodule(prefix, prefix_len)) { *found = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Fail */ *found = 0; - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -calculate_prefix(const _PyCoreConfig *core_config, +static PyStatus +calculate_prefix(const PyConfig *config, PyCalculatePath *calculate, wchar_t *prefix, size_t prefix_len) { - _PyInitError err; + PyStatus status; - err = search_for_prefix(core_config, calculate, prefix, prefix_len, + status = search_for_prefix(config, calculate, prefix, prefix_len, &calculate->prefix_found); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } if (!calculate->prefix_found) { - if (core_config->pathconfig_warnings) { + if (config->pathconfig_warnings) { fprintf(stderr, "Could not find platform independent libraries \n"); } if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { return PATHLEN_ERR(); } - err = joinpath(prefix, calculate->lib_python, prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(prefix, calculate->lib_python, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } } else { reduce(prefix); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus calculate_reduce_prefix(PyCalculatePath *calculate, wchar_t *prefix, size_t prefix_len) { @@ -536,45 +536,45 @@ calculate_reduce_prefix(PyCalculatePath *calculate, return PATHLEN_ERR(); } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* search_for_exec_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ -static _PyInitError -search_for_exec_prefix(const _PyCoreConfig *core_config, +static PyStatus +search_for_exec_prefix(const PyConfig *config, PyCalculatePath *calculate, wchar_t *exec_prefix, size_t exec_prefix_len, int *found) { - _PyInitError err; + PyStatus status; size_t n; /* If PYTHONHOME is set, we believe it unconditionally */ - if (core_config->home) { - wchar_t *delim = wcschr(core_config->home, DELIM); + if (config->home) { + wchar_t *delim = wcschr(config->home, DELIM); if (delim) { if (safe_wcscpy(exec_prefix, delim+1, exec_prefix_len) < 0) { return PATHLEN_ERR(); } } else { - if (safe_wcscpy(exec_prefix, core_config->home, exec_prefix_len) < 0) { + if (safe_wcscpy(exec_prefix, config->home, exec_prefix_len) < 0) { return PATHLEN_ERR(); } } - err = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } *found = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" @@ -583,9 +583,9 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, if (safe_wcscpy(exec_prefix, calculate->argv0_path, exec_prefix_len) < 0) { return PATHLEN_ERR(); } - err = joinpath(exec_prefix, L"pybuilddir.txt", exec_prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(exec_prefix, L"pybuilddir.txt", exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (isfile(exec_prefix)) { @@ -609,36 +609,36 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, if (safe_wcscpy(exec_prefix, calculate->argv0_path, exec_prefix_len) < 0) { return PATHLEN_ERR(); } - err = joinpath(exec_prefix, pybuilddir, exec_prefix_len); + status = joinpath(exec_prefix, pybuilddir, exec_prefix_len); PyMem_RawFree(pybuilddir ); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } *found = -1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } } /* Search from argv0_path, until root is found */ - err = copy_absolute(exec_prefix, calculate->argv0_path, exec_prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = copy_absolute(exec_prefix, calculate->argv0_path, exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } do { n = wcslen(exec_prefix); - err = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (isdir(exec_prefix)) { *found = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } exec_prefix[n] = L'\0'; reduce(exec_prefix); @@ -648,58 +648,58 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { return PATHLEN_ERR(); } - err = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (isdir(exec_prefix)) { *found = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Fail */ *found = 0; - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -calculate_exec_prefix(const _PyCoreConfig *core_config, +static PyStatus +calculate_exec_prefix(const PyConfig *config, PyCalculatePath *calculate, wchar_t *exec_prefix, size_t exec_prefix_len) { - _PyInitError err; + PyStatus status; - err = search_for_exec_prefix(core_config, calculate, + status = search_for_exec_prefix(config, calculate, exec_prefix, exec_prefix_len, &calculate->exec_prefix_found); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } if (!calculate->exec_prefix_found) { - if (core_config->pathconfig_warnings) { + if (config->pathconfig_warnings) { fprintf(stderr, "Could not find platform dependent libraries \n"); } if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { return PATHLEN_ERR(); } - err = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } } /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus calculate_reduce_exec_prefix(PyCalculatePath *calculate, wchar_t *exec_prefix, size_t exec_prefix_len) { @@ -716,15 +716,15 @@ calculate_reduce_exec_prefix(PyCalculatePath *calculate, return PATHLEN_ERR(); } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -calculate_program_full_path(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, _PyPathConfig *config) +static PyStatus +calculate_program_full_path(const PyConfig *config, + PyCalculatePath *calculate, _PyPathConfig *pathconfig) { - _PyInitError err; + PyStatus status; wchar_t program_full_path[MAXPATHLEN + 1]; const size_t program_full_path_len = Py_ARRAY_LENGTH(program_full_path); memset(program_full_path, 0, sizeof(program_full_path)); @@ -743,8 +743,8 @@ calculate_program_full_path(const _PyCoreConfig *core_config, * other way to find a directory to start the search from. If * $PATH isn't exported, you lose. */ - if (wcschr(core_config->program_name, SEP)) { - if (safe_wcscpy(program_full_path, core_config->program_name, + if (wcschr(config->program_name, SEP)) { + if (safe_wcscpy(program_full_path, config->program_name, program_full_path_len) < 0) { return PATHLEN_ERR(); } @@ -795,10 +795,10 @@ calculate_program_full_path(const _PyCoreConfig *core_config, } } - err = joinpath(program_full_path, core_config->program_name, + status = joinpath(program_full_path, config->program_name, program_full_path_len); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } if (isxfile(program_full_path)) { @@ -816,9 +816,9 @@ calculate_program_full_path(const _PyCoreConfig *core_config, program_full_path[0] = '\0'; } if (program_full_path[0] != SEP && program_full_path[0] != '\0') { - err = absolutize(program_full_path, program_full_path_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = absolutize(program_full_path, program_full_path_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } } #if defined(__CYGWIN__) || defined(__MINGW32__) @@ -828,22 +828,22 @@ calculate_program_full_path(const _PyCoreConfig *core_config, * path (bpo-28441). */ if (program_full_path[0] != '\0') { - err = add_exe_suffix(program_full_path, program_full_path_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = add_exe_suffix(program_full_path, program_full_path_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } } #endif - config->program_full_path = _PyMem_RawWcsdup(program_full_path); - if (config->program_full_path == NULL) { - return _Py_INIT_NO_MEMORY(); + pathconfig->program_full_path = _PyMem_RawWcsdup(program_full_path); + if (pathconfig->program_full_path == NULL) { + return _PyStatus_NO_MEMORY(); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_path) { const size_t argv0_path_len = Py_ARRAY_LENGTH(calculate->argv0_path); @@ -871,7 +871,7 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat ** be running the interpreter in the build directory, so we use the ** build-directory-specific logic to find Lib and such. */ - _PyInitError err; + PyStatus status; size_t len; wchar_t* wbuf = Py_DecodeLocale(modPath, &len); if (wbuf == NULL) { @@ -882,15 +882,15 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat return PATHLEN_ERR(); } reduce(calculate->argv0_path); - err = joinpath(calculate->argv0_path, calculate->lib_python, argv0_path_len); - if (_Py_INIT_FAILED(err)) { + status = joinpath(calculate->argv0_path, calculate->lib_python, argv0_path_len); + if (_PyStatus_EXCEPTION(status)) { PyMem_RawFree(wbuf); - return err; + return status; } - err = joinpath(calculate->argv0_path, LANDMARK, argv0_path_len); - if (_Py_INIT_FAILED(err)) { + status = joinpath(calculate->argv0_path, LANDMARK, argv0_path_len); + if (_PyStatus_EXCEPTION(status)) { PyMem_RawFree(wbuf); - return err; + return status; } if (!ismodule(calculate->argv0_path, Py_ARRAY_LENGTH(calculate->argv0_path))) { @@ -925,11 +925,11 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat } else { /* Interpret relative to program_full_path */ - _PyInitError err; + PyStatus status; reduce(calculate->argv0_path); - err = joinpath(calculate->argv0_path, tmpbuffer, argv0_path_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(calculate->argv0_path, tmpbuffer, argv0_path_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } } linklen = _Py_wreadlink(calculate->argv0_path, tmpbuffer, buflen); @@ -939,7 +939,7 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat reduce(calculate->argv0_path); /* At this point, argv0_path is guaranteed to be less than MAXPATHLEN bytes long. */ - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -947,10 +947,10 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat executable's directory and then in the parent directory. If found, open it for use when searching for prefixes. */ -static _PyInitError +static PyStatus calculate_read_pyenv(PyCalculatePath *calculate) { - _PyInitError err; + PyStatus status; wchar_t tmpbuffer[MAXPATHLEN+1]; const size_t buflen = Py_ARRAY_LENGTH(tmpbuffer); wchar_t *env_cfg = L"pyvenv.cfg"; @@ -960,9 +960,9 @@ calculate_read_pyenv(PyCalculatePath *calculate) return PATHLEN_ERR(); } - err = joinpath(tmpbuffer, env_cfg, buflen); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(tmpbuffer, env_cfg, buflen); + if (_PyStatus_EXCEPTION(status)) { + return status; } env_file = _Py_wfopen(tmpbuffer, L"r"); if (env_file == NULL) { @@ -970,9 +970,9 @@ calculate_read_pyenv(PyCalculatePath *calculate) reduce(tmpbuffer); reduce(tmpbuffer); - err = joinpath(tmpbuffer, env_cfg, buflen); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(tmpbuffer, env_cfg, buflen); + if (_PyStatus_EXCEPTION(status)) { + return status; } env_file = _Py_wfopen(tmpbuffer, L"r"); @@ -982,7 +982,7 @@ calculate_read_pyenv(PyCalculatePath *calculate) } if (env_file == NULL) { - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Look for a 'home' variable and set argv0_path to it, if found */ @@ -993,14 +993,14 @@ calculate_read_pyenv(PyCalculatePath *calculate) } } fclose(env_file); - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix) { - _PyInitError err; + PyStatus status; const size_t zip_path_len = Py_ARRAY_LENGTH(calculate->zip_path); if (safe_wcscpy(calculate->zip_path, prefix, zip_path_len) < 0) { return PATHLEN_ERR(); @@ -1016,29 +1016,29 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix) return PATHLEN_ERR(); } } - err = joinpath(calculate->zip_path, L"lib/python00.zip", zip_path_len); - if (_Py_INIT_FAILED(err)) { - return err; + status = joinpath(calculate->zip_path, L"lib/python00.zip", zip_path_len); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* Replace "00" with version */ size_t bufsz = wcslen(calculate->zip_path); calculate->zip_path[bufsz - 6] = VERSION[0]; calculate->zip_path[bufsz - 5] = VERSION[2]; - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -calculate_module_search_path(const _PyCoreConfig *core_config, +static PyStatus +calculate_module_search_path(const PyConfig *config, PyCalculatePath *calculate, const wchar_t *prefix, const wchar_t *exec_prefix, - _PyPathConfig *config) + _PyPathConfig *pathconfig) { /* Calculate size of return buffer */ size_t bufsz = 0; - if (core_config->module_search_path_env != NULL) { - bufsz += wcslen(core_config->module_search_path_env) + 1; + if (config->pythonpath_env != NULL) { + bufsz += wcslen(config->pythonpath_env) + 1; } wchar_t *defpath = calculate->pythonpath; @@ -1067,13 +1067,13 @@ calculate_module_search_path(const _PyCoreConfig *core_config, /* Allocate the buffer */ wchar_t *buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t)); if (buf == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } buf[0] = '\0'; /* Run-time value of $PYTHONPATH goes first */ - if (core_config->module_search_path_env) { - wcscpy(buf, core_config->module_search_path_env); + if (config->pythonpath_env) { + wcscpy(buf, config->pythonpath_env); wcscat(buf, delimiter); } @@ -1115,14 +1115,14 @@ calculate_module_search_path(const _PyCoreConfig *core_config, /* Finally, on goes the directory for dynamic-load modules */ wcscat(buf, exec_prefix); - config->module_search_path = buf; - return _Py_INIT_OK(); + pathconfig->module_search_path = buf; + return _PyStatus_OK(); } -static _PyInitError +static PyStatus calculate_init(PyCalculatePath *calculate, - const _PyCoreConfig *core_config) + const PyConfig *config) { size_t len; const char *path = getenv("PATH"); @@ -1149,7 +1149,7 @@ calculate_init(PyCalculatePath *calculate, if (!calculate->lib_python) { return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -1164,108 +1164,108 @@ calculate_free(PyCalculatePath *calculate) } -static _PyInitError -calculate_path_impl(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, _PyPathConfig *config) +static PyStatus +calculate_path_impl(const PyConfig *config, + PyCalculatePath *calculate, _PyPathConfig *pathconfig) { - _PyInitError err; + PyStatus status; - err = calculate_program_full_path(core_config, calculate, config); - if (_Py_INIT_FAILED(err)) { - return err; + status = calculate_program_full_path(config, calculate, pathconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = calculate_argv0_path(calculate, config->program_full_path); - if (_Py_INIT_FAILED(err)) { - return err; + status = calculate_argv0_path(calculate, pathconfig->program_full_path); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = calculate_read_pyenv(calculate); - if (_Py_INIT_FAILED(err)) { - return err; + status = calculate_read_pyenv(calculate); + if (_PyStatus_EXCEPTION(status)) { + return status; } wchar_t prefix[MAXPATHLEN+1]; memset(prefix, 0, sizeof(prefix)); - err = calculate_prefix(core_config, calculate, + status = calculate_prefix(config, calculate, prefix, Py_ARRAY_LENGTH(prefix)); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = calculate_zip_path(calculate, prefix); - if (_Py_INIT_FAILED(err)) { - return err; + status = calculate_zip_path(calculate, prefix); + if (_PyStatus_EXCEPTION(status)) { + return status; } wchar_t exec_prefix[MAXPATHLEN+1]; memset(exec_prefix, 0, sizeof(exec_prefix)); - err = calculate_exec_prefix(core_config, calculate, + status = calculate_exec_prefix(config, calculate, exec_prefix, Py_ARRAY_LENGTH(exec_prefix)); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } if ((!calculate->prefix_found || !calculate->exec_prefix_found) && - core_config->pathconfig_warnings) + config->pathconfig_warnings) { fprintf(stderr, "Consider setting $PYTHONHOME to [:]\n"); } - err = calculate_module_search_path(core_config, calculate, - prefix, exec_prefix, config); - if (_Py_INIT_FAILED(err)) { - return err; + status = calculate_module_search_path(config, calculate, + prefix, exec_prefix, pathconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = calculate_reduce_prefix(calculate, prefix, Py_ARRAY_LENGTH(prefix)); - if (_Py_INIT_FAILED(err)) { - return err; + status = calculate_reduce_prefix(calculate, prefix, Py_ARRAY_LENGTH(prefix)); + if (_PyStatus_EXCEPTION(status)) { + return status; } - config->prefix = _PyMem_RawWcsdup(prefix); - if (config->prefix == NULL) { - return _Py_INIT_NO_MEMORY(); + pathconfig->prefix = _PyMem_RawWcsdup(prefix); + if (pathconfig->prefix == NULL) { + return _PyStatus_NO_MEMORY(); } - err = calculate_reduce_exec_prefix(calculate, + status = calculate_reduce_exec_prefix(calculate, exec_prefix, Py_ARRAY_LENGTH(exec_prefix)); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } - config->exec_prefix = _PyMem_RawWcsdup(exec_prefix); - if (config->exec_prefix == NULL) { - return _Py_INIT_NO_MEMORY(); + pathconfig->exec_prefix = _PyMem_RawWcsdup(exec_prefix); + if (pathconfig->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -_PyInitError -_PyPathConfig_Calculate_impl(_PyPathConfig *config, const _PyCoreConfig *core_config) +PyStatus +_PyPathConfig_Calculate(_PyPathConfig *pathconfig, const PyConfig *config) { - _PyInitError err; + PyStatus status; PyCalculatePath calculate; memset(&calculate, 0, sizeof(calculate)); - err = calculate_init(&calculate, core_config); - if (_Py_INIT_FAILED(err)) { + status = calculate_init(&calculate, config); + if (_PyStatus_EXCEPTION(status)) { goto done; } - err = calculate_path_impl(core_config, &calculate, config); - if (_Py_INIT_FAILED(err)) { + status = calculate_path_impl(config, &calculate, pathconfig); + if (_PyStatus_EXCEPTION(status)) { goto done; } - err = _Py_INIT_OK(); + status = _PyStatus_OK(); done: calculate_free(&calculate); - return err; + return status; } #ifdef __cplusplus diff --git a/Modules/main.c b/Modules/main.c index 08fb0e0417d0..6b9406f78666 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -1,7 +1,7 @@ /* Python interpreter main program */ #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_pylifecycle.h" #include "pycore_pymem.h" #include "pycore_pystate.h" @@ -33,14 +33,14 @@ extern "C" { /* --- pymain_init() ---------------------------------------------- */ -static _PyInitError +static PyStatus pymain_init(const _PyArgv *args) { - _PyInitError err; + PyStatus status; - err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyRuntime_Initialize(); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* 754 requires that FP exceptions run in "no stop" mode by default, @@ -52,29 +52,36 @@ pymain_init(const _PyArgv *args) fedisableexcept(FE_OVERFLOW); #endif - _PyPreConfig preconfig; - _PyPreConfig_InitPythonConfig(&preconfig); - err = _Py_PreInitializeFromPyArgv(&preconfig, args); - if (_Py_INIT_FAILED(err)) { - return err; + PyPreConfig preconfig; + PyPreConfig_InitPythonConfig(&preconfig); + status = _Py_PreInitializeFromPyArgv(&preconfig, args); + if (_PyStatus_EXCEPTION(status)) { + return status; } - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_Py_INIT_FAILED(err)) { - return err; + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* pass NULL as the config: config is read from command line arguments, environment variables, configuration files */ if (args->use_bytes_argv) { - return _Py_InitializeFromArgs(&config, - args->argc, args->bytes_argv); + status = PyConfig_SetBytesArgv(&config, args->argc, args->bytes_argv); } else { - return _Py_InitializeFromWideArgs(&config, - args->argc, args->wchar_argv); + status = PyConfig_SetArgv(&config, args->argc, args->wchar_argv); } + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + status = Py_InitializeFromConfig(&config); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + return _PyStatus_OK(); } @@ -82,13 +89,17 @@ pymain_init(const _PyArgv *args) /* Non-zero if filename, command (-c) or module (-m) is set on the command line */ -#define RUN_CODE(config) \ - (config->run_command != NULL || config->run_filename != NULL \ - || config->run_module != NULL) +static inline int config_run_code(const PyConfig *config) +{ + return (config->run_command != NULL + || config->run_filename != NULL + || config->run_module != NULL); +} + /* Return non-zero is stdin is a TTY or if -i command line option is used */ static int -stdin_is_interactive(const _PyCoreConfig *config) +stdin_is_interactive(const PyConfig *config) { return (isatty(fileno(stdin)) || config->interactive); } @@ -181,13 +192,13 @@ pymain_sys_path_add_path0(PyInterpreterState *interp, PyObject *path0) static void -pymain_header(const _PyCoreConfig *config) +pymain_header(const PyConfig *config) { if (config->quiet) { return; } - if (!config->verbose && (RUN_CODE(config) || !stdin_is_interactive(config))) { + if (!config->verbose && (config_run_code(config) || !stdin_is_interactive(config))) { return; } @@ -199,12 +210,12 @@ pymain_header(const _PyCoreConfig *config) static void -pymain_import_readline(const _PyCoreConfig *config) +pymain_import_readline(const PyConfig *config) { if (config->isolated) { return; } - if (!config->inspect && RUN_CODE(config)) { + if (!config->inspect && config_run_code(config)) { return; } if (!isatty(fileno(stdin))) { @@ -293,7 +304,7 @@ pymain_run_module(const wchar_t *modname, int set_argv0) static int -pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) +pymain_run_file(PyConfig *config, PyCompilerFlags *cf) { const wchar_t *filename = config->run_filename; FILE *fp = _Py_wfopen(filename, L"rb"); @@ -362,7 +373,7 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) static int -pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) +pymain_run_startup(PyConfig *config, PyCompilerFlags *cf, int *exitcode) { const char *startup = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP"); if (startup == NULL) { @@ -421,7 +432,7 @@ pymain_run_interactive_hook(int *exitcode) static int -pymain_run_stdin(_PyCoreConfig *config, PyCompilerFlags *cf) +pymain_run_stdin(PyConfig *config, PyCompilerFlags *cf) { if (stdin_is_interactive(config)) { config->inspect = 0; @@ -448,7 +459,7 @@ pymain_run_stdin(_PyCoreConfig *config, PyCompilerFlags *cf) static void -pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) +pymain_repl(PyConfig *config, PyCompilerFlags *cf, int *exitcode) { /* Check this environment variable at the end, to give programs the opportunity to set it from Python. */ @@ -457,7 +468,7 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) Py_InspectFlag = 1; } - if (!(config->inspect && stdin_is_interactive(config) && RUN_CODE(config))) { + if (!(config->inspect && stdin_is_interactive(config) && config_run_code(config))) { return; } @@ -477,7 +488,7 @@ pymain_run_python(int *exitcode) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); /* pymain_run_stdin() modify the config */ - _PyCoreConfig *config = &interp->core_config; + PyConfig *config = &interp->config; PyObject *main_importer_path = NULL; if (config->run_filename != NULL) { @@ -590,20 +601,20 @@ exit_sigint(void) static void _Py_NO_RETURN -pymain_exit_error(_PyInitError err) +pymain_exit_error(PyStatus status) { - if (_Py_INIT_IS_EXIT(err)) { + if (_PyStatus_IS_EXIT(status)) { /* If it's an error rather than a regular exit, leave Python runtime - alive: _Py_ExitInitError() uses the current exception and use + alive: Py_ExitStatusException() uses the current exception and use sys.stdout in this case. */ pymain_free(); } - _Py_ExitInitError(err); + Py_ExitStatusException(status); } int -_Py_RunMain(void) +Py_RunMain(void) { int exitcode = 0; @@ -628,16 +639,16 @@ _Py_RunMain(void) static int pymain_main(_PyArgv *args) { - _PyInitError err = pymain_init(args); - if (_Py_INIT_IS_EXIT(err)) { + PyStatus status = pymain_init(args); + if (_PyStatus_IS_EXIT(status)) { pymain_free(); - return err.exitcode; + return status.exitcode; } - if (_Py_INIT_FAILED(err)) { - pymain_exit_error(err); + if (_PyStatus_EXCEPTION(status)) { + pymain_exit_error(status); } - return _Py_RunMain(); + return Py_RunMain(); } @@ -654,7 +665,7 @@ Py_Main(int argc, wchar_t **argv) int -_Py_UnixMain(int argc, char **argv) +Py_BytesMain(int argc, char **argv) { _PyArgv args = { .argc = argc, diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 8d5ba540120f..c7c28312b005 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -999,7 +999,7 @@ bytearray_repr(PyByteArrayObject *self) static PyObject * bytearray_str(PyObject *op) { - _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (config->bytes_warning) { if (PyErr_WarnEx(PyExc_BytesWarning, "str() on a bytearray instance", 1)) { @@ -1025,7 +1025,7 @@ bytearray_richcompare(PyObject *self, PyObject *other, int op) if (rc < 0) return NULL; if (rc) { - _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (config->bytes_warning && (op == Py_EQ || op == Py_NE)) { if (PyErr_WarnEx(PyExc_BytesWarning, "Comparison between bytearray and string", 1)) diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 41453b2d14e9..0a3ed8691a22 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1421,7 +1421,7 @@ bytes_repr(PyObject *op) static PyObject * bytes_str(PyObject *op) { - _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (config->bytes_warning) { if (PyErr_WarnEx(PyExc_BytesWarning, "str() on a bytes instance", 1)) { @@ -1579,7 +1579,7 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) /* Make sure both arguments are strings. */ if (!(PyBytes_Check(a) && PyBytes_Check(b))) { - _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (config->bytes_warning && (op == Py_EQ || op == Py_NE)) { rc = PyObject_IsInstance((PyObject*)a, (PyObject*)&PyUnicode_Type); diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 4dad0b24cee8..8456a8f18286 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -6,7 +6,7 @@ #define PY_SSIZE_T_CLEAN #include -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_object.h" #include "pycore_pymem.h" #include "pycore_pystate.h" @@ -2499,13 +2499,13 @@ SimpleExtendsException(PyExc_Warning, ResourceWarning, #endif #endif /* MS_WINDOWS */ -_PyInitError +PyStatus _PyExc_Init(void) { #define PRE_INIT(TYPE) \ if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \ if (PyType_Ready(&_PyExc_ ## TYPE) < 0) { \ - return _Py_INIT_ERR("exceptions bootstrapping error."); \ + return _PyStatus_ERR("exceptions bootstrapping error."); \ } \ Py_INCREF(PyExc_ ## TYPE); \ } @@ -2515,7 +2515,7 @@ _PyExc_Init(void) PyObject *_code = PyLong_FromLong(CODE); \ assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \ if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \ - return _Py_INIT_ERR("errmap insertion problem."); \ + return _PyStatus_ERR("errmap insertion problem."); \ Py_DECREF(_code); \ } while (0) @@ -2589,14 +2589,14 @@ _PyExc_Init(void) PRE_INIT(TimeoutError); if (preallocate_memerrors() < 0) { - return _Py_INIT_ERR("Could not preallocate MemoryError object"); + return _PyStatus_ERR("Could not preallocate MemoryError object"); } /* Add exceptions to errnomap */ if (!errnomap) { errnomap = PyDict_New(); if (!errnomap) { - return _Py_INIT_ERR("Cannot allocate map from errnos to OSError subclasses"); + return _PyStatus_ERR("Cannot allocate map from errnos to OSError subclasses"); } } @@ -2622,7 +2622,7 @@ _PyExc_Init(void) ADD_ERRNO(ProcessLookupError, ESRCH); ADD_ERRNO(TimeoutError, ETIMEDOUT); - return _Py_INIT_OK(); + return _PyStatus_OK(); #undef PRE_INIT #undef ADD_ERRNO @@ -2630,12 +2630,12 @@ _PyExc_Init(void) /* Add exception types to the builtins module */ -_PyInitError +PyStatus _PyBuiltins_AddExceptions(PyObject *bltinmod) { #define POST_INIT(TYPE) \ if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) { \ - return _Py_INIT_ERR("Module dictionary insertion problem."); \ + return _PyStatus_ERR("Module dictionary insertion problem."); \ } #define INIT_ALIAS(NAME, TYPE) \ @@ -2644,7 +2644,7 @@ _PyBuiltins_AddExceptions(PyObject *bltinmod) Py_XDECREF(PyExc_ ## NAME); \ PyExc_ ## NAME = PyExc_ ## TYPE; \ if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) { \ - return _Py_INIT_ERR("Module dictionary insertion problem."); \ + return _PyStatus_ERR("Module dictionary insertion problem."); \ } \ } while (0) @@ -2652,7 +2652,7 @@ _PyBuiltins_AddExceptions(PyObject *bltinmod) bdict = PyModule_GetDict(bltinmod); if (bdict == NULL) { - return _Py_INIT_ERR("exceptions bootstrapping error."); + return _PyStatus_ERR("exceptions bootstrapping error."); } POST_INIT(BaseException); @@ -2729,7 +2729,7 @@ _PyBuiltins_AddExceptions(PyObject *bltinmod) POST_INIT(ProcessLookupError); POST_INIT(TimeoutError); - return _Py_INIT_OK(); + return _PyStatus_OK(); #undef POST_INIT #undef INIT_ALIAS diff --git a/Objects/listobject.c b/Objects/listobject.c index 3185957453d7..b210c005da13 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -104,7 +104,7 @@ static void show_alloc(void) { PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->core_config.show_alloc_count) { + if (!interp->config.show_alloc_count) { return; } diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index e570107cedfb..20e7d44ab5e1 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -590,7 +590,7 @@ _PyModule_ClearDict(PyObject *d) Py_ssize_t pos; PyObject *key, *value; - int verbose = _PyInterpreterState_GET_UNSAFE()->core_config.verbose; + int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose; /* First, clear only names starting with a single underscore */ pos = 0; @@ -677,7 +677,7 @@ module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc) static void module_dealloc(PyModuleObject *m) { - int verbose = _PyInterpreterState_GET_UNSAFE()->core_config.verbose; + int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose; PyObject_GC_UnTrack(m); if (verbose && m->md_name) { diff --git a/Objects/object.c b/Objects/object.c index 6d79165683e1..270716f397c9 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2,7 +2,7 @@ /* Generic object operations; and implementation of None */ #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_object.h" #include "pycore_pystate.h" #include "pycore_context.h" @@ -124,7 +124,7 @@ void _Py_dump_counts(FILE* f) { PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->core_config.show_alloc_count) { + if (!interp->config.show_alloc_count) { return; } @@ -1767,13 +1767,13 @@ PyObject _Py_NotImplementedStruct = { 1, &_PyNotImplemented_Type }; -_PyInitError +PyStatus _PyTypes_Init(void) { #define INIT_TYPE(TYPE, NAME) \ do { \ if (PyType_Ready(TYPE) < 0) { \ - return _Py_INIT_ERR("Can't initialize " NAME " type"); \ + return _PyStatus_ERR("Can't initialize " NAME " type"); \ } \ } while (0) @@ -1843,7 +1843,7 @@ _PyTypes_Init(void) INIT_TYPE(&PyCoro_Type, "coroutine"); INIT_TYPE(&_PyCoroWrapper_Type, "coroutine wrapper"); INIT_TYPE(&_PyInterpreterID_Type, "interpreter ID"); - return _Py_INIT_OK(); + return _PyStatus_OK(); #undef INIT_TYPE } diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index dc1d0e5ad0d4..72556adb6207 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -46,7 +46,7 @@ static void show_track(void) { PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->core_config.show_alloc_count) { + if (!interp->config.show_alloc_count) { return; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 0aa5e4ad18dd..0fe7b5658bef 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -40,7 +40,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_fileutils.h" #include "pycore_object.h" #include "pycore_pylifecycle.h" @@ -3549,9 +3549,9 @@ PyUnicode_EncodeFSDefault(PyObject *unicode) interp->fs_codec.errors); } else { - const _PyCoreConfig *config = &interp->core_config; + const wchar_t *filesystem_errors = interp->config.filesystem_errors; _Py_error_handler errors; - errors = get_error_handler_wide(config->filesystem_errors); + errors = get_error_handler_wide(filesystem_errors); assert(errors != _Py_ERROR_UNKNOWN); return unicode_encode_utf8(unicode, errors, NULL); } @@ -3567,9 +3567,9 @@ PyUnicode_EncodeFSDefault(PyObject *unicode) interp->fs_codec.errors); } else { - const _PyCoreConfig *config = &interp->core_config; + const wchar_t *filesystem_errors = interp->config.filesystem_errors; _Py_error_handler errors; - errors = get_error_handler_wide(config->filesystem_errors); + errors = get_error_handler_wide(filesystem_errors); assert(errors != _Py_ERROR_UNKNOWN); return unicode_encode_locale(unicode, errors, 0); } @@ -3787,9 +3787,9 @@ PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) NULL); } else { - const _PyCoreConfig *config = &interp->core_config; + const wchar_t *filesystem_errors = interp->config.filesystem_errors; _Py_error_handler errors; - errors = get_error_handler_wide(config->filesystem_errors); + errors = get_error_handler_wide(filesystem_errors); assert(errors != _Py_ERROR_UNKNOWN); return unicode_decode_utf8(s, size, errors, NULL, NULL); } @@ -3805,9 +3805,9 @@ PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) interp->fs_codec.errors); } else { - const _PyCoreConfig *config = &interp->core_config; + const wchar_t *filesystem_errors = interp->config.filesystem_errors; _Py_error_handler errors; - errors = get_error_handler_wide(config->filesystem_errors); + errors = get_error_handler_wide(filesystem_errors); return unicode_decode_locale(s, size, errors, 0); } #endif @@ -15200,7 +15200,7 @@ PyTypeObject PyUnicode_Type = { /* Initialize the Unicode implementation */ -_PyInitError +PyStatus _PyUnicode_Init(void) { /* XXX - move this array to unicodectype.c ? */ @@ -15218,12 +15218,12 @@ _PyUnicode_Init(void) /* Init the implementation */ _Py_INCREF_UNICODE_EMPTY(); if (!unicode_empty) { - return _Py_INIT_ERR("Can't create empty string"); + return _PyStatus_ERR("Can't create empty string"); } Py_DECREF(unicode_empty); if (PyType_Ready(&PyUnicode_Type) < 0) { - return _Py_INIT_ERR("Can't initialize unicode type"); + return _PyStatus_ERR("Can't initialize unicode type"); } /* initialize the linebreak bloom filter */ @@ -15232,15 +15232,15 @@ _PyUnicode_Init(void) Py_ARRAY_LENGTH(linebreak)); if (PyType_Ready(&EncodingMapType) < 0) { - return _Py_INIT_ERR("Can't initialize encoding map type"); + return _PyStatus_ERR("Can't initialize encoding map type"); } if (PyType_Ready(&PyFieldNameIter_Type) < 0) { - return _Py_INIT_ERR("Can't initialize field name iterator type"); + return _PyStatus_ERR("Can't initialize field name iterator type"); } if (PyType_Ready(&PyFormatterIter_Type) < 0) { - return _Py_INIT_ERR("Can't initialize formatter iter type"); + return _PyStatus_ERR("Can't initialize formatter iter type"); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Finalize the Unicode implementation */ @@ -15718,23 +15718,23 @@ config_get_codec_name(wchar_t **config_encoding) } -static _PyInitError +static PyStatus init_stdio_encoding(PyInterpreterState *interp) { /* Update the stdio encoding to the normalized Python codec name. */ - _PyCoreConfig *config = &interp->core_config; + PyConfig *config = &interp->config; if (config_get_codec_name(&config->stdio_encoding) < 0) { - return _Py_INIT_ERR("failed to get the Python codec name " + return _PyStatus_ERR("failed to get the Python codec name " "of the stdio encoding"); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } static int init_fs_codec(PyInterpreterState *interp) { - _PyCoreConfig *config = &interp->core_config; + PyConfig *config = &interp->config; _Py_error_handler error_handler; error_handler = get_error_handler_wide(config->filesystem_errors); @@ -15778,31 +15778,31 @@ init_fs_codec(PyInterpreterState *interp) } -static _PyInitError +static PyStatus init_fs_encoding(PyInterpreterState *interp) { /* Update the filesystem encoding to the normalized Python codec name. For example, replace "ANSI_X3.4-1968" (locale encoding) with "ascii" (Python codec name). */ - _PyCoreConfig *config = &interp->core_config; + PyConfig *config = &interp->config; if (config_get_codec_name(&config->filesystem_encoding) < 0) { - return _Py_INIT_ERR("failed to get the Python codec " + return _PyStatus_ERR("failed to get the Python codec " "of the filesystem encoding"); } if (init_fs_codec(interp) < 0) { - return _Py_INIT_ERR("cannot initialize filesystem codec"); + return _PyStatus_ERR("cannot initialize filesystem codec"); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -_PyInitError +PyStatus _PyUnicode_InitEncodings(PyInterpreterState *interp) { - _PyInitError err = init_fs_encoding(interp); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = init_fs_encoding(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } return init_stdio_encoding(interp); @@ -15814,7 +15814,7 @@ int _PyUnicode_EnableLegacyWindowsFSEncoding(void) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - _PyCoreConfig *config = &interp->core_config; + PyConfig *config = &interp->config; /* Set the filesystem encoding to mbcs/replace (PEP 529) */ wchar_t *encoding = _PyMem_RawWcsdup(L"mbcs"); diff --git a/PC/getpathp.c b/PC/getpathp.c index 62c42ecefe9e..e86cf13a4910 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -80,7 +80,7 @@ #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_pystate.h" #include "osdefs.h" #include @@ -272,10 +272,10 @@ typedef HRESULT(__stdcall *PPathCchCanonicalizeEx) (PWSTR pszPathOut, size_t cch PCWSTR pszPathIn, unsigned long dwFlags); static PPathCchCanonicalizeEx _PathCchCanonicalizeEx; -static _PyInitError canonicalize(wchar_t *buffer, const wchar_t *path) +static PyStatus canonicalize(wchar_t *buffer, const wchar_t *path) { if (buffer == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } if (_PathCchCanonicalizeEx_Initialized == 0) { @@ -291,15 +291,15 @@ static _PyInitError canonicalize(wchar_t *buffer, const wchar_t *path) if (_PathCchCanonicalizeEx) { if (FAILED(_PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { - return _Py_INIT_ERR("buffer overflow in getpathp.c's canonicalize()"); + return _PyStatus_ERR("buffer overflow in getpathp.c's canonicalize()"); } } else { if (!PathCanonicalizeW(buffer, path)) { - return _Py_INIT_ERR("buffer overflow in getpathp.c's canonicalize()"); + return _PyStatus_ERR("buffer overflow in getpathp.c's canonicalize()"); } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -529,9 +529,9 @@ _Py_GetDLLPath(void) } -static _PyInitError -get_program_full_path(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, _PyPathConfig *config) +static PyStatus +get_program_full_path(const PyConfig *config, + PyCalculatePath *calculate, _PyPathConfig *pathconfig) { const wchar_t *pyvenv_launcher; wchar_t program_full_path[MAXPATHLEN+1]; @@ -544,19 +544,19 @@ get_program_full_path(const _PyCoreConfig *core_config, wcscpy_s(program_full_path, MAXPATHLEN+1, pyvenv_launcher); } else if (!GetModuleFileNameW(NULL, program_full_path, MAXPATHLEN)) { /* GetModuleFileName should never fail when passed NULL */ - return _Py_INIT_ERR("Cannot determine program path"); + return _PyStatus_ERR("Cannot determine program path"); } - config->program_full_path = PyMem_RawMalloc( + pathconfig->program_full_path = PyMem_RawMalloc( sizeof(wchar_t) * (MAXPATHLEN + 1)); - return canonicalize(config->program_full_path, + return canonicalize(pathconfig->program_full_path, program_full_path); } static int -read_pth_file(_PyPathConfig *config, wchar_t *prefix, const wchar_t *path) +read_pth_file(_PyPathConfig *pathconfig, wchar_t *prefix, const wchar_t *path) { FILE *sp_file = _Py_wfopen(path, L"r"); if (sp_file == NULL) { @@ -565,8 +565,8 @@ read_pth_file(_PyPathConfig *config, wchar_t *prefix, const wchar_t *path) wcscpy_s(prefix, MAXPATHLEN+1, path); reduce(prefix); - config->isolated = 1; - config->site_import = 0; + pathconfig->isolated = 1; + pathconfig->site_import = 0; size_t bufsiz = MAXPATHLEN; size_t prefixlen = wcslen(prefix); @@ -594,7 +594,7 @@ read_pth_file(_PyPathConfig *config, wchar_t *prefix, const wchar_t *path) } if (strcmp(line, "import site") == 0) { - config->site_import = 1; + pathconfig->site_import = 1; continue; } else if (strncmp(line, "import ", 7) == 0) { @@ -642,7 +642,7 @@ read_pth_file(_PyPathConfig *config, wchar_t *prefix, const wchar_t *path) } fclose(sp_file); - config->module_search_path = buf; + pathconfig->module_search_path = buf; return 1; error: @@ -654,25 +654,25 @@ read_pth_file(_PyPathConfig *config, wchar_t *prefix, const wchar_t *path) static void calculate_init(PyCalculatePath *calculate, - const _PyCoreConfig *core_config) + const PyConfig *config) { - calculate->home = core_config->home; + calculate->home = config->home; calculate->path_env = _wgetenv(L"PATH"); } static int -get_pth_filename(wchar_t *spbuffer, _PyPathConfig *config) +get_pth_filename(wchar_t *spbuffer, _PyPathConfig *pathconfig) { - if (config->dll_path[0]) { - if (!change_ext(spbuffer, config->dll_path, L"._pth") && + if (pathconfig->dll_path[0]) { + if (!change_ext(spbuffer, pathconfig->dll_path, L"._pth") && exists(spbuffer)) { return 1; } } - if (config->program_full_path[0]) { - if (!change_ext(spbuffer, config->program_full_path, L"._pth") && + if (pathconfig->program_full_path[0]) { + if (!change_ext(spbuffer, pathconfig->program_full_path, L"._pth") && exists(spbuffer)) { return 1; @@ -683,15 +683,15 @@ get_pth_filename(wchar_t *spbuffer, _PyPathConfig *config) static int -calculate_pth_file(_PyPathConfig *config, wchar_t *prefix) +calculate_pth_file(_PyPathConfig *pathconfig, wchar_t *prefix) { wchar_t spbuffer[MAXPATHLEN+1]; - if (!get_pth_filename(spbuffer, config)) { + if (!get_pth_filename(spbuffer, pathconfig)) { return 0; } - return read_pth_file(config, prefix, spbuffer); + return read_pth_file(pathconfig, prefix, spbuffer); } @@ -735,7 +735,7 @@ calculate_pyvenv_file(PyCalculatePath *calculate) } -#define INIT_ERR_BUFFER_OVERFLOW() _Py_INIT_ERR("buffer overflow") +#define INIT_ERR_BUFFER_OVERFLOW() _PyStatus_ERR("buffer overflow") static void @@ -760,9 +760,9 @@ calculate_home_prefix(PyCalculatePath *calculate, wchar_t *prefix) } -static _PyInitError -calculate_module_search_path(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, _PyPathConfig *config, +static PyStatus +calculate_module_search_path(const PyConfig *config, + PyCalculatePath *calculate, _PyPathConfig *pathconfig, wchar_t *prefix) { int skiphome = calculate->home==NULL ? 0 : 1; @@ -772,7 +772,7 @@ calculate_module_search_path(const _PyCoreConfig *core_config, #endif /* We only use the default relative PYTHONPATH if we haven't anything better to use! */ - int skipdefault = (core_config->module_search_path_env != NULL || + int skipdefault = (config->pythonpath_env != NULL || calculate->home != NULL || calculate->machine_path != NULL || calculate->user_path != NULL); @@ -811,8 +811,8 @@ calculate_module_search_path(const _PyCoreConfig *core_config, bufsz += wcslen(calculate->machine_path) + 1; } bufsz += wcslen(calculate->zip_path) + 1; - if (core_config->module_search_path_env != NULL) { - bufsz += wcslen(core_config->module_search_path_env) + 1; + if (config->pythonpath_env != NULL) { + bufsz += wcslen(config->pythonpath_env) + 1; } wchar_t *buf, *start_buf; @@ -820,21 +820,21 @@ calculate_module_search_path(const _PyCoreConfig *core_config, if (buf == NULL) { /* We can't exit, so print a warning and limp along */ fprintf(stderr, "Can't malloc dynamic PYTHONPATH.\n"); - if (core_config->module_search_path_env) { + if (config->pythonpath_env) { fprintf(stderr, "Using environment $PYTHONPATH.\n"); - config->module_search_path = core_config->module_search_path_env; + pathconfig->module_search_path = config->pythonpath_env; } else { fprintf(stderr, "Using default static path.\n"); - config->module_search_path = PYTHONPATH; + pathconfig->module_search_path = PYTHONPATH; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } start_buf = buf; - if (core_config->module_search_path_env) { + if (config->pythonpath_env) { if (wcscpy_s(buf, bufsz - (buf - start_buf), - core_config->module_search_path_env)) { + config->pythonpath_env)) { return INIT_ERR_BUFFER_OVERFLOW(); } buf = wcschr(buf, L'\0'); @@ -941,38 +941,38 @@ calculate_module_search_path(const _PyCoreConfig *core_config, } } - config->module_search_path = start_buf; - return _Py_INIT_OK(); + pathconfig->module_search_path = start_buf; + return _PyStatus_OK(); } -static _PyInitError -calculate_path_impl(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, _PyPathConfig *config) +static PyStatus +calculate_path_impl(const PyConfig *config, + PyCalculatePath *calculate, _PyPathConfig *pathconfig) { - _PyInitError err; + PyStatus status; - assert(config->dll_path == NULL); + assert(pathconfig->dll_path == NULL); - config->dll_path = _Py_GetDLLPath(); - if (config->dll_path == NULL) { - return _Py_INIT_NO_MEMORY(); + pathconfig->dll_path = _Py_GetDLLPath(); + if (pathconfig->dll_path == NULL) { + return _PyStatus_NO_MEMORY(); } - err = get_program_full_path(core_config, calculate, config); - if (_Py_INIT_FAILED(err)) { - return err; + status = get_program_full_path(config, calculate, pathconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* program_full_path guaranteed \0 terminated in MAXPATH+1 bytes. */ - wcscpy_s(calculate->argv0_path, MAXPATHLEN+1, config->program_full_path); + wcscpy_s(calculate->argv0_path, MAXPATHLEN+1, pathconfig->program_full_path); reduce(calculate->argv0_path); wchar_t prefix[MAXPATHLEN+1]; memset(prefix, 0, sizeof(prefix)); /* Search for a sys.path file */ - if (calculate_pth_file(config, prefix)) { + if (calculate_pth_file(pathconfig, prefix)) { goto done; } @@ -980,27 +980,27 @@ calculate_path_impl(const _PyCoreConfig *core_config, /* Calculate zip archive path from DLL or exe path */ change_ext(calculate->zip_path, - config->dll_path[0] ? config->dll_path : config->program_full_path, + pathconfig->dll_path[0] ? pathconfig->dll_path : pathconfig->program_full_path, L".zip"); calculate_home_prefix(calculate, prefix); - err = calculate_module_search_path(core_config, calculate, config, prefix); - if (_Py_INIT_FAILED(err)) { - return err; + status = calculate_module_search_path(config, calculate, pathconfig, prefix); + if (_PyStatus_EXCEPTION(status)) { + return status; } done: - config->prefix = _PyMem_RawWcsdup(prefix); - if (config->prefix == NULL) { - return _Py_INIT_NO_MEMORY(); + pathconfig->prefix = _PyMem_RawWcsdup(prefix); + if (pathconfig->prefix == NULL) { + return _PyStatus_NO_MEMORY(); } - config->exec_prefix = _PyMem_RawWcsdup(prefix); - if (config->exec_prefix == NULL) { - return _Py_INIT_NO_MEMORY(); + pathconfig->exec_prefix = _PyMem_RawWcsdup(prefix); + if (pathconfig->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -1012,24 +1012,24 @@ calculate_free(PyCalculatePath *calculate) } -_PyInitError -_PyPathConfig_Calculate_impl(_PyPathConfig *config, const _PyCoreConfig *core_config) +PyStatus +_PyPathConfig_Calculate(_PyPathConfig *pathconfig, const PyConfig *config) { PyCalculatePath calculate; memset(&calculate, 0, sizeof(calculate)); - calculate_init(&calculate, core_config); + calculate_init(&calculate, config); - _PyInitError err = calculate_path_impl(core_config, &calculate, config); - if (_Py_INIT_FAILED(err)) { + PyStatus status = calculate_path_impl(config, &calculate, pathconfig); + if (_PyStatus_EXCEPTION(status)) { goto done; } - err = _Py_INIT_OK(); + status = _PyStatus_OK(); done: calculate_free(&calculate); - return err; + return status; } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index db691cd39c8b..329f9feb2bdf 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -127,9 +127,9 @@ - + @@ -161,11 +161,11 @@ - + @@ -420,7 +420,6 @@ - @@ -438,6 +437,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index dba47e9aa2d1..d80d05fb15a0 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -84,15 +84,15 @@ Include - - Include - Include Include + + Include + Include @@ -186,9 +186,6 @@ Include - - Include - Include @@ -201,6 +198,9 @@ Include + + Include + Include @@ -920,9 +920,6 @@ Python - - Python - Python @@ -977,6 +974,9 @@ Python + + Python + Python diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 8cf44d33bc02..13375b0a3819 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -36,7 +36,7 @@ main(int argc, char *argv[]) const char *name, *inpath, *outpath; char buf[100]; FILE *infile = NULL, *outfile = NULL; - struct _Py_stat_struct status; + struct _Py_stat_struct stat; size_t text_size, data_size, i, n; char *text = NULL; unsigned char *data; @@ -56,11 +56,11 @@ main(int argc, char *argv[]) fprintf(stderr, "cannot open '%s' for reading\n", inpath); goto error; } - if (_Py_fstat_noraise(fileno(infile), &status)) { + if (_Py_fstat_noraise(fileno(infile), &stat)) { fprintf(stderr, "cannot fstat '%s'\n", inpath); goto error; } - text_size = (size_t)status.st_size; + text_size = (size_t)stat.st_size; text = (char *) malloc(text_size + 1); if (text == NULL) { fprintf(stderr, "could not allocate %ld bytes\n", (long) text_size); @@ -76,32 +76,32 @@ main(int argc, char *argv[]) } text[text_size] = '\0'; - _PyInitError err; - _PyCoreConfig config; + PyStatus status; + PyConfig config; - err = _PyCoreConfig_InitIsolatedConfig(&config); - if (_PyInitError_Failed(err)) { - _PyCoreConfig_Clear(&config); - _Py_ExitInitError(err); + status = PyConfig_InitIsolatedConfig(&config); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); } config.site_import = 0; - err = _PyCoreConfig_SetString(&config, &config.program_name, + status = PyConfig_SetString(&config, &config.program_name, L"./_freeze_importlib"); - if (_PyInitError_Failed(err)) { - _PyCoreConfig_Clear(&config); - _Py_ExitInitError(err); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); } /* Don't install importlib, since it could execute outdated bytecode. */ config._install_importlib = 0; config._init_main = 0; - err = _Py_InitializeFromConfig(&config); - _PyCoreConfig_Clear(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + PyConfig_Clear(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } sprintf(buf, "", name); diff --git a/Programs/_testembed.c b/Programs/_testembed.c index de1c5877f0f5..3e1210e04d82 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -4,7 +4,7 @@ #endif #include -#include "pycore_coreconfig.h" /* FIXME: PEP 587 makes these functions public */ +#include "pycore_initconfig.h" /* FIXME: PEP 587 makes these functions public */ #include #include "pythread.h" #include @@ -328,25 +328,25 @@ static int test_init_initialize_config(void) static int check_init_compat_config(int preinit) { - _PyInitError err; + PyStatus status; if (preinit) { - _PyPreConfig preconfig; + PyPreConfig preconfig; _PyPreConfig_InitCompatConfig(&preconfig); - err = _Py_PreInitialize(&preconfig); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_PreInitialize(&preconfig); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } } - _PyCoreConfig config; - _PyCoreConfig_InitCompatConfig(&config); + PyConfig config; + _PyConfig_InitCompatConfig(&config); config.program_name = L"./_testembed"; - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); @@ -418,9 +418,9 @@ static int test_init_global_config(void) static int test_init_from_config(void) { - _PyInitError err; + PyStatus status; - _PyPreConfig preconfig; + PyPreConfig preconfig; _PyPreConfig_InitCompatConfig(&preconfig); putenv("PYTHONMALLOC=malloc_debug"); @@ -430,14 +430,14 @@ static int test_init_from_config(void) Py_UTF8Mode = 0; preconfig.utf8_mode = 1; - err = _Py_PreInitialize(&preconfig); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_PreInitialize(&preconfig); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } - /* Test _Py_InitializeFromConfig() */ - _PyCoreConfig config; - _PyCoreConfig_InitCompatConfig(&config); + /* Test Py_InitializeFromConfig() */ + PyConfig config; + _PyConfig_InitCompatConfig(&config); config.install_signal_handlers = 0; /* FIXME: test use_environment */ @@ -481,9 +481,9 @@ static int test_init_from_config(void) config.parse_argv = 1; static wchar_t* xoptions[3] = { - L"core_xoption1=3", - L"core_xoption2=", - L"core_xoption3", + L"xoption1=3", + L"xoption2=", + L"xoption3", }; config.xoptions.length = Py_ARRAY_LENGTH(xoptions); config.xoptions.items = xoptions; @@ -494,7 +494,7 @@ static int test_init_from_config(void) config.warnoptions.length = Py_ARRAY_LENGTH(warnoptions); config.warnoptions.items = warnoptions; - /* FIXME: test module_search_path_env */ + /* FIXME: test pythonpath_env */ /* FIXME: test home */ /* FIXME: test path config: module_search_path .. dll_path */ @@ -553,9 +553,9 @@ static int test_init_from_config(void) Py_FrozenFlag = 0; config.pathconfig_warnings = 0; - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); Py_Finalize(); @@ -565,12 +565,12 @@ static int test_init_from_config(void) static int check_init_parse_argv(int parse_argv) { - _PyInitError err; + PyStatus status; - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } static wchar_t* argv[] = { @@ -587,9 +587,9 @@ static int check_init_parse_argv(int parse_argv) config.argv.items = argv; config.parse_argv = parse_argv; - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); Py_Finalize(); @@ -652,20 +652,20 @@ static int test_init_compat_env(void) static int test_init_python_env(void) { - _PyInitError err; + PyStatus status; set_all_env_vars(); - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } config.program_name = L"./_testembed"; - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); Py_Finalize(); @@ -708,13 +708,13 @@ static int test_init_env_dev_mode_alloc(void) static int test_init_isolated_flag(void) { - _PyInitError err; + PyStatus status; - /* Test _PyCoreConfig.isolated=1 */ - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + /* Test PyConfig.isolated=1 */ + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } Py_IsolatedFlag = 0; @@ -724,9 +724,9 @@ static int test_init_isolated_flag(void) config.program_name = L"./_testembed"; set_all_env_vars(); - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); Py_Finalize(); @@ -734,28 +734,28 @@ static int test_init_isolated_flag(void) } -/* _PyPreConfig.isolated=1, _PyCoreConfig.isolated=0 */ +/* PyPreConfig.isolated=1, PyConfig.isolated=0 */ static int test_preinit_isolated1(void) { - _PyInitError err; + PyStatus status; - _PyPreConfig preconfig; + PyPreConfig preconfig; _PyPreConfig_InitCompatConfig(&preconfig); preconfig.isolated = 1; - err = _Py_PreInitialize(&preconfig); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_PreInitialize(&preconfig); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } - _PyCoreConfig config; - _PyCoreConfig_InitCompatConfig(&config); + PyConfig config; + _PyConfig_InitCompatConfig(&config); config.program_name = L"./_testembed"; set_all_env_vars(); - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); Py_Finalize(); @@ -763,23 +763,23 @@ static int test_preinit_isolated1(void) } -/* _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 */ +/* PyPreConfig.isolated=0, PyConfig.isolated=1 */ static int test_preinit_isolated2(void) { - _PyInitError err; + PyStatus status; - _PyPreConfig preconfig; + PyPreConfig preconfig; _PyPreConfig_InitCompatConfig(&preconfig); preconfig.isolated = 0; - err = _Py_PreInitialize(&preconfig); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_PreInitialize(&preconfig); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } - /* Test _PyCoreConfig.isolated=1 */ - _PyCoreConfig config; - _PyCoreConfig_InitCompatConfig(&config); + /* Test PyConfig.isolated=1 */ + PyConfig config; + _PyConfig_InitCompatConfig(&config); Py_IsolatedFlag = 0; config.isolated = 1; @@ -788,9 +788,9 @@ static int test_preinit_isolated2(void) config.program_name = L"./_testembed"; set_all_env_vars(); - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); Py_Finalize(); @@ -800,10 +800,10 @@ static int test_preinit_isolated2(void) static int test_preinit_dont_parse_argv(void) { - _PyInitError err; + PyStatus status; - _PyPreConfig preconfig; - _PyPreConfig_InitIsolatedConfig(&preconfig); + PyPreConfig preconfig; + PyPreConfig_InitIsolatedConfig(&preconfig); preconfig.isolated = 0; @@ -814,15 +814,15 @@ static int test_preinit_dont_parse_argv(void) L"-X", L"dev", L"-X", L"utf8", L"script.py"}; - err = _Py_PreInitializeFromWideArgs(&preconfig, Py_ARRAY_LENGTH(argv), argv); - if (_PyInitError_Failed(err)) { + status = Py_PreInitializeFromArgs(&preconfig, Py_ARRAY_LENGTH(argv), argv); + if (PyStatus_Exception(status)) { goto failed; } - _PyCoreConfig config; + PyConfig config; - err = _PyCoreConfig_InitIsolatedConfig(&config); - if (_PyInitError_Failed(err)) { + status = PyConfig_InitIsolatedConfig(&config); + if (PyStatus_Exception(status)) { goto failed; } @@ -830,70 +830,70 @@ static int test_preinit_dont_parse_argv(void) /* Pre-initialize implicitly using argv: make sure that -X dev is used to configure the allocation in preinitialization */ - err = _PyCoreConfig_SetWideArgv(&config, Py_ARRAY_LENGTH(argv), argv); - if (_PyInitError_Failed(err)) { + status = PyConfig_SetArgv(&config, Py_ARRAY_LENGTH(argv), argv); + if (PyStatus_Exception(status)) { goto failed; } - err = _PyCoreConfig_SetString(&config, &config.program_name, + status = PyConfig_SetString(&config, &config.program_name, L"./_testembed"); - if (_PyInitError_Failed(err)) { + if (PyStatus_Exception(status)) { goto failed; } - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { goto failed; } - _PyCoreConfig_Clear(&config); + PyConfig_Clear(&config); dump_config(); Py_Finalize(); return 0; failed: - _PyCoreConfig_Clear(&config); - _Py_ExitInitError(err); + PyConfig_Clear(&config); + Py_ExitStatusException(status); } static int test_preinit_parse_argv(void) { - _PyInitError err; - _PyCoreConfig config; + PyStatus status; + PyConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { goto failed; } /* Pre-initialize implicitly using argv: make sure that -X dev is used to configure the allocation in preinitialization */ wchar_t *argv[] = {L"python3", L"-X", L"dev", L"script.py"}; - err = _PyCoreConfig_SetWideArgv(&config, Py_ARRAY_LENGTH(argv), argv); - if (_PyInitError_Failed(err)) { + status = PyConfig_SetArgv(&config, Py_ARRAY_LENGTH(argv), argv); + if (PyStatus_Exception(status)) { goto failed; } - err = _PyCoreConfig_SetString(&config, &config.program_name, + status = PyConfig_SetString(&config, &config.program_name, L"./_testembed"); - if (_PyInitError_Failed(err)) { + if (PyStatus_Exception(status)) { goto failed; } - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { goto failed; } - _PyCoreConfig_Clear(&config); + PyConfig_Clear(&config); dump_config(); Py_Finalize(); return 0; failed: - _PyCoreConfig_Clear(&config); - _Py_ExitInitError(err); + PyConfig_Clear(&config); + Py_ExitStatusException(status); } @@ -923,8 +923,8 @@ static void set_all_global_config_variables(void) static int check_preinit_isolated_config(int preinit) { - _PyInitError err; - _PyPreConfig *rt_preconfig; + PyStatus status; + PyPreConfig *rt_preconfig; /* environment variables must be ignored */ set_all_env_vars(); @@ -933,12 +933,12 @@ static int check_preinit_isolated_config(int preinit) set_all_global_config_variables(); if (preinit) { - _PyPreConfig preconfig; - _PyPreConfig_InitIsolatedConfig(&preconfig); + PyPreConfig preconfig; + PyPreConfig_InitIsolatedConfig(&preconfig); - err = _Py_PreInitialize(&preconfig); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_PreInitialize(&preconfig); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } rt_preconfig = &_PyRuntime.preconfig; @@ -946,18 +946,18 @@ static int check_preinit_isolated_config(int preinit) assert(rt_preconfig->use_environment == 0); } - _PyCoreConfig config; - err = _PyCoreConfig_InitIsolatedConfig(&config); - if (_PyInitError_Failed(err)) { - _PyCoreConfig_Clear(&config); - _Py_ExitInitError(err); + PyConfig config; + status = PyConfig_InitIsolatedConfig(&config); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); } config.program_name = L"./_testembed"; - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _PyCoreConfig_Clear(&config); - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); } rt_preconfig = &_PyRuntime.preconfig; @@ -984,7 +984,7 @@ static int test_init_isolated_config(void) static int check_init_python_config(int preinit) { - _PyInitError err; + PyStatus status; /* global configuration variables must be ignored */ set_all_global_config_variables(); @@ -1000,25 +1000,25 @@ static int check_init_python_config(int preinit) #endif if (preinit) { - _PyPreConfig preconfig; - _PyPreConfig_InitPythonConfig(&preconfig); + PyPreConfig preconfig; + PyPreConfig_InitPythonConfig(&preconfig); - err = _Py_PreInitialize(&preconfig); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_PreInitialize(&preconfig); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } } - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } config.program_name = L"./_testembed"; - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); Py_Finalize(); @@ -1040,28 +1040,28 @@ static int test_init_python_config(void) static int test_init_dont_configure_locale(void) { - _PyInitError err; + PyStatus status; - _PyPreConfig preconfig; - _PyPreConfig_InitPythonConfig(&preconfig); + PyPreConfig preconfig; + PyPreConfig_InitPythonConfig(&preconfig); preconfig.configure_locale = 0; preconfig.coerce_c_locale = 1; preconfig.coerce_c_locale_warn = 1; - err = _Py_PreInitialize(&preconfig); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_PreInitialize(&preconfig); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } config.program_name = L"./_testembed"; - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); @@ -1072,19 +1072,19 @@ static int test_init_dont_configure_locale(void) static int test_init_dev_mode(void) { - _PyInitError err; - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + PyStatus status; + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } putenv("PYTHONFAULTHANDLER="); putenv("PYTHONMALLOC="); config.dev_mode = 1; config.program_name = L"./_testembed"; - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } dump_config(); Py_Finalize(); @@ -1250,39 +1250,39 @@ static int test_audit_subinterpreter(void) static int test_init_read_set(void) { - _PyInitError err; - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + PyStatus status; + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } - err = _PyCoreConfig_DecodeLocale(&config, &config.program_name, + status = PyConfig_SetBytesString(&config, &config.program_name, "./init_read_set"); - if (_PyInitError_Failed(err)) { + if (PyStatus_Exception(status)) { goto fail; } - err = _PyCoreConfig_Read(&config); - if (_PyInitError_Failed(err)) { + status = PyConfig_Read(&config); + if (PyStatus_Exception(status)) { goto fail; } - if (_PyWstrList_Append(&config.module_search_paths, - L"init_read_set_path") < 0) { - err = _PyInitError_NoMemory(); + status = PyWideStringList_Append(&config.module_search_paths, + L"init_read_set_path"); + if (PyStatus_Exception(status)) { goto fail; } - /* override executable computed by _PyCoreConfig_Read() */ - err = _PyCoreConfig_SetString(&config, &config.executable, L"my_executable"); - if (_PyInitError_Failed(err)) { + /* override executable computed by PyConfig_Read() */ + status = PyConfig_SetString(&config, &config.executable, L"my_executable"); + if (PyStatus_Exception(status)) { goto fail; } - err = _Py_InitializeFromConfig(&config); - _PyCoreConfig_Clear(&config); - if (_PyInitError_Failed(err)) { + status = Py_InitializeFromConfig(&config); + PyConfig_Clear(&config); + if (PyStatus_Exception(status)) { goto fail; } dump_config(); @@ -1290,7 +1290,7 @@ static int test_init_read_set(void) return 0; fail: - _Py_ExitInitError(err); + Py_ExitStatusException(status); } @@ -1301,7 +1301,7 @@ wchar_t *init_main_argv[] = { L"arg2"}; -static void configure_init_main(_PyCoreConfig *config) +static void configure_init_main(PyConfig *config) { config->argv.length = Py_ARRAY_LENGTH(init_main_argv); config->argv.items = init_main_argv; @@ -1312,38 +1312,38 @@ static void configure_init_main(_PyCoreConfig *config) static int test_init_run_main(void) { - _PyInitError err; - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + PyStatus status; + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } configure_init_main(&config); - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } - return _Py_RunMain(); + return Py_RunMain(); } static int test_init_main(void) { - _PyInitError err; - _PyCoreConfig config; + PyStatus status; + PyConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } configure_init_main(&config); config._init_main = 0; - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } /* sys.stdout don't exist yet: it is created by _Py_InitializeMain() */ @@ -1355,51 +1355,51 @@ static int test_init_main(void) exit(1); } - err = _Py_InitializeMain(); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = _Py_InitializeMain(); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } - return _Py_RunMain(); + return Py_RunMain(); } static int test_run_main(void) { - _PyInitError err; - _PyCoreConfig config; + PyStatus status; + PyConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { goto failed; } wchar_t *argv[] = {L"python3", L"-c", (L"import sys; " - L"print(f'_Py_RunMain(): sys.argv={sys.argv}')"), + L"print(f'Py_RunMain(): sys.argv={sys.argv}')"), L"arg2"}; - err = _PyCoreConfig_SetWideArgv(&config, Py_ARRAY_LENGTH(argv), argv); - if (_PyInitError_Failed(err)) { + status = PyConfig_SetArgv(&config, Py_ARRAY_LENGTH(argv), argv); + if (PyStatus_Exception(status)) { goto failed; } - err = _PyCoreConfig_SetString(&config, &config.program_name, + status = PyConfig_SetString(&config, &config.program_name, L"./python3"); - if (_PyInitError_Failed(err)) { + if (PyStatus_Exception(status)) { goto failed; } - err = _Py_InitializeFromConfig(&config); - if (_PyInitError_Failed(err)) { + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { goto failed; } - _PyCoreConfig_Clear(&config); + PyConfig_Clear(&config); - return _Py_RunMain(); + return Py_RunMain(); failed: - _PyCoreConfig_Clear(&config); - _Py_ExitInitError(err); + PyConfig_Clear(&config); + Py_ExitStatusException(status); } diff --git a/Programs/python.c b/Programs/python.c index 4c12d38c53b9..1cc3c42cfcbf 100644 --- a/Programs/python.c +++ b/Programs/python.c @@ -13,6 +13,6 @@ wmain(int argc, wchar_t **argv) int main(int argc, char **argv) { - return _Py_UnixMain(argc, argv); + return Py_BytesMain(argc, argv); } #endif diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index ff5a51216939..5d5808530e11 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2824,7 +2824,7 @@ _PyBuiltin_Init(void) { PyObject *mod, *dict, *debug; - const _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + const PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (PyType_Ready(&PyFilter_Type) < 0 || PyType_Ready(&PyMap_Type) < 0 || diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c index fe71cc388a07..43f5264d8625 100644 --- a/Python/bootstrap_hash.c +++ b/Python/bootstrap_hash.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #ifdef MS_WINDOWS # include /* All sample MSDN wincrypt programs include the header below. It is at least @@ -547,14 +547,14 @@ _PyOS_URandomNonblock(void *buffer, Py_ssize_t size) } -_PyInitError -_Py_HashRandomization_Init(const _PyCoreConfig *config) +PyStatus +_Py_HashRandomization_Init(const PyConfig *config) { void *secret = &_Py_HashSecret; Py_ssize_t secret_size = sizeof(_Py_HashSecret_t); if (_Py_HashSecret_Initialized) { - return _Py_INIT_OK(); + return _PyStatus_OK(); } _Py_HashSecret_Initialized = 1; @@ -579,11 +579,11 @@ _Py_HashRandomization_Init(const _PyCoreConfig *config) pyurandom() is non-blocking mode (blocking=0): see the PEP 524. */ res = pyurandom(secret, secret_size, 0, 0); if (res < 0) { - return _Py_INIT_ERR("failed to get random numbers " + return _PyStatus_ERR("failed to get random numbers " "to initialize Python"); } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } diff --git a/Python/compile.c b/Python/compile.c index 734e8401ff02..425d0d68ac4a 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -311,7 +311,7 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, PyCodeObject *co = NULL; PyCompilerFlags local_flags; int merged; - _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; + PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (!__doc__) { __doc__ = PyUnicode_InternFromString("__doc__"); @@ -4782,7 +4782,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) return compiler_error(c, "'await' outside function"); } - if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION && + if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION && c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){ return compiler_error(c, "'await' outside async function"); } diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c index f275e534588a..da9baa4b9989 100644 --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -20,7 +20,7 @@ dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix, const char *pathname, FILE *fp) { int flags = BIND_FIRST | BIND_DEFERRED; - int verbose = _PyInterpreterState_GET_UNSAFE()->core_config.verbose; + int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose; if (verbose) { flags = BIND_FIRST | BIND_IMMEDIATE | BIND_NONFATAL | BIND_VERBOSE; diff --git a/Python/errors.c b/Python/errors.c index 831f111eead2..bd33d4d340f6 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -2,7 +2,7 @@ /* Error handling */ #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_pyerrors.h" #include "pycore_pystate.h" #include "pycore_traceback.h" @@ -1090,16 +1090,16 @@ static PyStructSequence_Desc UnraisableHookArgs_desc = { }; -_PyInitError +PyStatus _PyErr_Init(void) { if (UnraisableHookArgsType.tp_name == NULL) { if (PyStructSequence_InitType2(&UnraisableHookArgsType, &UnraisableHookArgs_desc) < 0) { - return _Py_INIT_ERR("failed to initialize UnraisableHookArgs type"); + return _PyStatus_ERR("failed to initialize UnraisableHookArgs type"); } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } diff --git a/Python/frozenmain.c b/Python/frozenmain.c index c3af080401e9..c56938ab4899 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -16,9 +16,9 @@ extern int PyInitFrozenExtensions(void); int Py_FrozenMain(int argc, char **argv) { - _PyInitError err = _PyRuntime_Initialize(); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + PyStatus status = _PyRuntime_Initialize(); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } const char *p; @@ -39,11 +39,11 @@ Py_FrozenMain(int argc, char **argv) } } - _PyCoreConfig config; - err = _PyCoreConfig_InitPythonConfig(&config); - if (_PyInitError_Failed(err)) { - _PyCoreConfig_Clear(&config); - _Py_ExitInitError(err); + PyConfig config; + status = PyConfig_InitPythonConfig(&config); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); } config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */ @@ -85,10 +85,10 @@ Py_FrozenMain(int argc, char **argv) if (argc >= 1) Py_SetProgramName(argv_copy[0]); - err = _Py_InitializeFromConfig(&config); - _PyCoreConfig_Clear(&config); - if (_PyInitError_Failed(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + PyConfig_Clear(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); } #ifdef MS_WINDOWS diff --git a/Python/import.c b/Python/import.c index ec172b29f739..41a5c01cadf3 100644 --- a/Python/import.c +++ b/Python/import.c @@ -43,17 +43,17 @@ module _imp /* Initialize things */ -_PyInitError +PyStatus _PyImport_Init(PyInterpreterState *interp) { interp->builtins_copy = PyDict_Copy(interp->builtins); if (interp->builtins_copy == NULL) { - return _Py_INIT_ERR("Can't backup builtins dict"); + return _PyStatus_ERR("Can't backup builtins dict"); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -_PyInitError +PyStatus _PyImportHooks_Init(void) { PyObject *v, *path_hooks = NULL; @@ -82,15 +82,15 @@ _PyImportHooks_Init(void) goto error; } Py_DECREF(path_hooks); - return _Py_INIT_OK(); + return _PyStatus_OK(); error: PyErr_Print(); - return _Py_INIT_ERR("initializing sys.meta_path, sys.path_hooks, " + return _PyStatus_ERR("initializing sys.meta_path, sys.path_hooks, " "or path_importer_cache failed"); } -_PyInitError +PyStatus _PyImportZip_Init(PyInterpreterState *interp) { PyObject *path_hooks, *zipimport; @@ -102,7 +102,7 @@ _PyImportZip_Init(PyInterpreterState *interp) goto error; } - int verbose = interp->core_config.verbose; + int verbose = interp->config.verbose; if (verbose) { PySys_WriteStderr("# installing zipimport hook\n"); } @@ -138,11 +138,11 @@ _PyImportZip_Init(PyInterpreterState *interp) } } - return _Py_INIT_OK(); + return _PyStatus_OK(); error: PyErr_Print(); - return _Py_INIT_ERR("initializing zipimport failed"); + return _PyStatus_ERR("initializing zipimport failed"); } /* Locking primitives to prevent parallel imports of the same module @@ -418,7 +418,7 @@ PyImport_Cleanup(void) /* XXX Perhaps these precautions are obsolete. Who knows? */ - int verbose = interp->core_config.verbose; + int verbose = interp->config.verbose; if (verbose) { PySys_WriteStderr("# clear builtins._\n"); } @@ -766,7 +766,7 @@ _PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename, PyMapping_DelItem(modules, name); return NULL; } - int verbose = _PyInterpreterState_Get()->core_config.verbose; + int verbose = _PyInterpreterState_Get()->config.verbose; if (verbose) { PySys_FormatStderr("import %U # previously loaded (%R)\n", name, filename); @@ -1455,7 +1455,7 @@ remove_importlib_frames(PyInterpreterState *interp) which end with a call to "_call_with_frames_removed". */ PyErr_Fetch(&exception, &value, &base_tb); - if (!exception || interp->core_config.verbose) { + if (!exception || interp->config.verbose) { goto done; } @@ -1655,7 +1655,7 @@ import_find_and_load(PyObject *abs_name) _Py_IDENTIFIER(_find_and_load); PyObject *mod = NULL; PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - int import_time = interp->core_config.import_time; + int import_time = interp->config.import_time; static int import_level; static _PyTime_t accumulated; @@ -2338,7 +2338,7 @@ PyInit__imp(void) goto failure; } - const wchar_t *mode = _PyInterpreterState_Get()->core_config.check_hash_pycs_mode; + const wchar_t *mode = _PyInterpreterState_Get()->config.check_hash_pycs_mode; PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1); if (pyc_mode == NULL) { goto failure; diff --git a/Python/coreconfig.c b/Python/initconfig.c similarity index 71% rename from Python/coreconfig.c rename to Python/initconfig.c index 89ccff4c9b76..66b1b305a560 100644 --- a/Python/coreconfig.c +++ b/Python/initconfig.c @@ -1,6 +1,6 @@ #include "Python.h" #include "osdefs.h" /* DELIM */ -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_fileutils.h" #include "pycore_getopt.h" #include "pycore_pylifecycle.h" @@ -202,39 +202,39 @@ _Py_GetGlobalVariablesAsDict(void) } -/* --- _PyInitError ----------------------------------------------- */ +/* --- PyStatus ----------------------------------------------- */ -_PyInitError _PyInitError_Ok(void) -{ return _Py_INIT_OK(); } +PyStatus PyStatus_Ok(void) +{ return _PyStatus_OK(); } -_PyInitError _PyInitError_Error(const char *err_msg) +PyStatus PyStatus_Error(const char *err_msg) { - return (_PyInitError){._type = _Py_INIT_ERR_TYPE_ERROR, + return (PyStatus){._type = _PyStatus_TYPE_ERROR, .err_msg = err_msg}; } -_PyInitError _PyInitError_NoMemory(void) -{ return _PyInitError_Error("memory allocation failed"); } +PyStatus PyStatus_NoMemory(void) +{ return PyStatus_Error("memory allocation failed"); } -_PyInitError _PyInitError_Exit(int exitcode) -{ return _Py_INIT_EXIT(exitcode); } +PyStatus PyStatus_Exit(int exitcode) +{ return _PyStatus_EXIT(exitcode); } -int _PyInitError_IsError(_PyInitError err) -{ return _Py_INIT_IS_ERROR(err); } +int PyStatus_IsError(PyStatus status) +{ return _PyStatus_IS_ERROR(status); } -int _PyInitError_IsExit(_PyInitError err) -{ return _Py_INIT_IS_EXIT(err); } +int PyStatus_IsExit(PyStatus status) +{ return _PyStatus_IS_EXIT(status); } -int _PyInitError_Failed(_PyInitError err) -{ return _Py_INIT_FAILED(err); } +int PyStatus_Exception(PyStatus status) +{ return _PyStatus_EXCEPTION(status); } -/* --- _PyWstrList ------------------------------------------------ */ +/* --- PyWideStringList ------------------------------------------------ */ #ifndef NDEBUG int -_PyWstrList_CheckConsistency(const _PyWstrList *list) +_PyWideStringList_CheckConsistency(const PyWideStringList *list) { assert(list->length >= 0); if (list->length != 0) { @@ -249,9 +249,9 @@ _PyWstrList_CheckConsistency(const _PyWstrList *list) void -_PyWstrList_Clear(_PyWstrList *list) +_PyWideStringList_Clear(PyWideStringList *list) { - assert(_PyWstrList_CheckConsistency(list)); + assert(_PyWideStringList_CheckConsistency(list)); for (Py_ssize_t i=0; i < list->length; i++) { PyMem_RawFree(list->items[i]); } @@ -262,17 +262,17 @@ _PyWstrList_Clear(_PyWstrList *list) int -_PyWstrList_Copy(_PyWstrList *list, const _PyWstrList *list2) +_PyWideStringList_Copy(PyWideStringList *list, const PyWideStringList *list2) { - assert(_PyWstrList_CheckConsistency(list)); - assert(_PyWstrList_CheckConsistency(list2)); + assert(_PyWideStringList_CheckConsistency(list)); + assert(_PyWideStringList_CheckConsistency(list2)); if (list2->length == 0) { - _PyWstrList_Clear(list); + _PyWideStringList_Clear(list); return 0; } - _PyWstrList copy = _PyWstrList_INIT; + PyWideStringList copy = PyWideStringList_INIT; size_t size = list2->length * sizeof(list2->items[0]); copy.items = PyMem_RawMalloc(size); @@ -283,60 +283,61 @@ _PyWstrList_Copy(_PyWstrList *list, const _PyWstrList *list2) for (Py_ssize_t i=0; i < list2->length; i++) { wchar_t *item = _PyMem_RawWcsdup(list2->items[i]); if (item == NULL) { - _PyWstrList_Clear(©); + _PyWideStringList_Clear(©); return -1; } copy.items[i] = item; copy.length = i + 1; } - _PyWstrList_Clear(list); + _PyWideStringList_Clear(list); *list = copy; return 0; } -int -_PyWstrList_Append(_PyWstrList *list, const wchar_t *item) +PyStatus +PyWideStringList_Append(PyWideStringList *list, const wchar_t *item) { if (list->length == PY_SSIZE_T_MAX) { /* lenght+1 would overflow */ - return -1; + return _PyStatus_NO_MEMORY(); } wchar_t *item2 = _PyMem_RawWcsdup(item); if (item2 == NULL) { - return -1; + return _PyStatus_NO_MEMORY(); } size_t size = (list->length + 1) * sizeof(list->items[0]); wchar_t **items2 = (wchar_t **)PyMem_RawRealloc(list->items, size); if (items2 == NULL) { PyMem_RawFree(item2); - return -1; + return _PyStatus_NO_MEMORY(); } items2[list->length] = item2; list->items = items2; list->length++; - return 0; + return _PyStatus_OK(); } -int -_PyWstrList_Extend(_PyWstrList *list, const _PyWstrList *list2) +PyStatus +_PyWideStringList_Extend(PyWideStringList *list, const PyWideStringList *list2) { for (Py_ssize_t i = 0; i < list2->length; i++) { - if (_PyWstrList_Append(list, list2->items[i])) { - return -1; + PyStatus status = PyWideStringList_Append(list, list2->items[i]); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return 0; + return _PyStatus_OK(); } static int -_PyWstrList_Find(_PyWstrList *list, const wchar_t *item) +_PyWideStringList_Find(PyWideStringList *list, const wchar_t *item) { for (Py_ssize_t i = 0; i < list->length; i++) { if (wcscmp(list->items[i], item) == 0) { @@ -348,9 +349,9 @@ _PyWstrList_Find(_PyWstrList *list, const wchar_t *item) PyObject* -_PyWstrList_AsList(const _PyWstrList *list) +_PyWideStringList_AsList(const PyWideStringList *list) { - assert(_PyWstrList_CheckConsistency(list)); + assert(_PyWideStringList_CheckConsistency(list)); PyObject *pylist = PyList_New(list->length); if (pylist == NULL) { @@ -457,7 +458,7 @@ _Py_ClearStandardStreamEncoding(void) /* --- Py_GetArgcArgv() ------------------------------------------- */ /* For Py_GetArgcArgv(); set by _Py_SetArgcArgv() */ -static _PyWstrList orig_argv = {.length = 0, .items = NULL}; +static PyWideStringList orig_argv = {.length = 0, .items = NULL}; void @@ -466,7 +467,7 @@ _Py_ClearArgcArgv(void) PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyWstrList_Clear(&orig_argv); + _PyWideStringList_Clear(&orig_argv); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } @@ -475,13 +476,13 @@ _Py_ClearArgcArgv(void) static int _Py_SetArgcArgv(Py_ssize_t argc, wchar_t * const *argv) { - const _PyWstrList argv_list = {.length = argc, .items = (wchar_t **)argv}; + const PyWideStringList argv_list = {.length = argc, .items = (wchar_t **)argv}; int res; PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - res = _PyWstrList_Copy(&orig_argv, &argv_list); + res = _PyWideStringList_Copy(&orig_argv, &argv_list); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); return res; @@ -498,16 +499,16 @@ Py_GetArgcArgv(int *argc, wchar_t ***argv) } -/* --- _PyCoreConfig ---------------------------------------------- */ +/* --- PyConfig ---------------------------------------------- */ #define DECODE_LOCALE_ERR(NAME, LEN) \ (((LEN) == -2) \ - ? _Py_INIT_ERR("cannot decode " NAME) \ - : _Py_INIT_NO_MEMORY()) + ? _PyStatus_ERR("cannot decode " NAME) \ + : _PyStatus_NO_MEMORY()) /* Free memory allocated in config, but don't clear all attributes */ void -_PyCoreConfig_Clear(_PyCoreConfig *config) +PyConfig_Clear(PyConfig *config) { #define CLEAR(ATTR) \ do { \ @@ -516,15 +517,15 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) } while (0) CLEAR(config->pycache_prefix); - CLEAR(config->module_search_path_env); + CLEAR(config->pythonpath_env); CLEAR(config->home); CLEAR(config->program_name); - _PyWstrList_Clear(&config->argv); - _PyWstrList_Clear(&config->warnoptions); - _PyWstrList_Clear(&config->xoptions); - _PyWstrList_Clear(&config->module_search_paths); - config->use_module_search_paths = 0; + _PyWideStringList_Clear(&config->argv); + _PyWideStringList_Clear(&config->warnoptions); + _PyWideStringList_Clear(&config->xoptions); + _PyWideStringList_Clear(&config->module_search_paths); + config->module_search_paths_set = 0; CLEAR(config->executable); CLEAR(config->prefix); @@ -545,7 +546,7 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) void -_PyCoreConfig_InitCompatConfig(_PyCoreConfig *config) +_PyConfig_InitCompatConfig(PyConfig *config) { memset(config, 0, sizeof(*config)); @@ -558,7 +559,7 @@ _PyCoreConfig_InitCompatConfig(_PyCoreConfig *config) config->use_hash_seed = -1; config->faulthandler = -1; config->tracemalloc = -1; - config->use_module_search_paths = 0; + config->module_search_paths_set = 0; config->parse_argv = 0; config->site_import = -1; config->bytes_warning = -1; @@ -583,9 +584,9 @@ _PyCoreConfig_InitCompatConfig(_PyCoreConfig *config) static void -_PyCoreConfig_InitDefaults(_PyCoreConfig *config) +config_init_defaults(PyConfig *config) { - _PyCoreConfig_InitCompatConfig(config); + _PyConfig_InitCompatConfig(config); config->isolated = 0; config->use_environment = 1; @@ -607,23 +608,23 @@ _PyCoreConfig_InitDefaults(_PyCoreConfig *config) } -_PyInitError -_PyCoreConfig_InitPythonConfig(_PyCoreConfig *config) +PyStatus +PyConfig_InitPythonConfig(PyConfig *config) { - _PyCoreConfig_InitDefaults(config); + config_init_defaults(config); config->_config_init = (int)_PyConfig_INIT_PYTHON; config->configure_c_stdio = 1; config->parse_argv = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } -_PyInitError -_PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config) +PyStatus +PyConfig_InitIsolatedConfig(PyConfig *config) { - _PyCoreConfig_InitDefaults(config); + config_init_defaults(config); config->_config_init = (int)_PyConfig_INIT_ISOLATED; config->isolated = 1; @@ -639,25 +640,24 @@ _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config) config->legacy_windows_stdio = 0; #endif - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Copy str into *config_str (duplicate the string) */ -_PyInitError -_PyCoreConfig_SetString(_PyCoreConfig *config, wchar_t **config_str, - const wchar_t *str) +PyStatus +PyConfig_SetString(PyConfig *config, wchar_t **config_str, const wchar_t *str) { - _PyInitError err = _Py_PreInitializeFromCoreConfig(config, NULL); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _Py_PreInitializeFromConfig(config, NULL); + if (_PyStatus_EXCEPTION(status)) { + return status; } wchar_t *str2; if (str != NULL) { str2 = _PyMem_RawWcsdup(str); if (str2 == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } } else { @@ -665,17 +665,17 @@ _PyCoreConfig_SetString(_PyCoreConfig *config, wchar_t **config_str, } PyMem_RawFree(*config_str); *config_str = str2; - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -_PyCoreConfig_DecodeLocaleErr(_PyCoreConfig *config, wchar_t **config_str, - const char *str, const char *decode_err_msg) +static PyStatus +config_set_bytes_string(PyConfig *config, wchar_t **config_str, + const char *str, const char *decode_err_msg) { - _PyInitError err = _Py_PreInitializeFromCoreConfig(config, NULL); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _Py_PreInitializeFromConfig(config, NULL); + if (_PyStatus_EXCEPTION(status)) { + return status; } wchar_t *str2; @@ -684,10 +684,10 @@ _PyCoreConfig_DecodeLocaleErr(_PyCoreConfig *config, wchar_t **config_str, str2 = Py_DecodeLocale(str, &len); if (str2 == NULL) { if (len == (size_t)-2) { - return _Py_INIT_ERR(decode_err_msg); + return _PyStatus_ERR(decode_err_msg); } else { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } } } @@ -696,43 +696,43 @@ _PyCoreConfig_DecodeLocaleErr(_PyCoreConfig *config, wchar_t **config_str, } PyMem_RawFree(*config_str); *config_str = str2; - return _Py_INIT_OK(); + return _PyStatus_OK(); } -#define CONFIG_DECODE_LOCALE(config, config_str, str, NAME) \ - _PyCoreConfig_DecodeLocaleErr(config, config_str, str, "cannot decode " NAME) +#define CONFIG_SET_BYTES_STR(config, config_str, str, NAME) \ + config_set_bytes_string(config, config_str, str, "cannot decode " NAME) /* Decode str using Py_DecodeLocale() and set the result into *config_str. Pre-initialize Python if needed to ensure that encodings are properly configured. */ -_PyInitError -_PyCoreConfig_DecodeLocale(_PyCoreConfig *config, wchar_t **config_str, +PyStatus +PyConfig_SetBytesString(PyConfig *config, wchar_t **config_str, const char *str) { - return CONFIG_DECODE_LOCALE(config, config_str, str, "string"); + return CONFIG_SET_BYTES_STR(config, config_str, str, "string"); } -_PyInitError -_PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) +PyStatus +_PyConfig_Copy(PyConfig *config, const PyConfig *config2) { - _PyInitError err; - _PyCoreConfig_Clear(config); + PyStatus status; + PyConfig_Clear(config); #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR #define COPY_WSTR_ATTR(ATTR) \ do { \ - err = _PyCoreConfig_SetString(config, &config->ATTR, config2->ATTR); \ - if (_Py_INIT_FAILED(err)) { \ - return err; \ + status = PyConfig_SetString(config, &config->ATTR, config2->ATTR); \ + if (_PyStatus_EXCEPTION(status)) { \ + return status; \ } \ } while (0) #define COPY_WSTRLIST(LIST) \ do { \ - if (_PyWstrList_Copy(&config->LIST, &config2->LIST) < 0 ) { \ - return _Py_INIT_NO_MEMORY(); \ + if (_PyWideStringList_Copy(&config->LIST, &config2->LIST) < 0 ) { \ + return _PyStatus_NO_MEMORY(); \ } \ } while (0) @@ -753,7 +753,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_ATTR(malloc_stats); COPY_WSTR_ATTR(pycache_prefix); - COPY_WSTR_ATTR(module_search_path_env); + COPY_WSTR_ATTR(pythonpath_env); COPY_WSTR_ATTR(home); COPY_WSTR_ATTR(program_name); @@ -762,7 +762,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_WSTRLIST(warnoptions); COPY_WSTRLIST(xoptions); COPY_WSTRLIST(module_search_paths); - COPY_ATTR(use_module_search_paths); + COPY_ATTR(module_search_paths_set); COPY_WSTR_ATTR(executable); COPY_WSTR_ATTR(prefix); @@ -800,12 +800,12 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) #undef COPY_ATTR #undef COPY_WSTR_ATTR #undef COPY_WSTRLIST - return _Py_INIT_OK(); + return _PyStatus_OK(); } static PyObject * -_PyCoreConfig_AsDict(const _PyCoreConfig *config) +config_as_dict(const PyConfig *config) { PyObject *dict; @@ -837,7 +837,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) #define SET_ITEM_WSTR(ATTR) \ SET_ITEM(#ATTR, FROM_WSTRING(config->ATTR)) #define SET_ITEM_WSTRLIST(LIST) \ - SET_ITEM(#LIST, _PyWstrList_AsList(&config->LIST)) + SET_ITEM(#LIST, _PyWideStringList_AsList(&config->LIST)) SET_ITEM_INT(_config_init); SET_ITEM_INT(isolated); @@ -861,7 +861,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_WSTRLIST(argv); SET_ITEM_WSTRLIST(xoptions); SET_ITEM_WSTRLIST(warnoptions); - SET_ITEM_WSTR(module_search_path_env); + SET_ITEM_WSTR(pythonpath_env); SET_ITEM_WSTR(home); SET_ITEM_WSTRLIST(module_search_paths); SET_ITEM_WSTR(executable); @@ -911,7 +911,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) static const char* -_PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) +config_get_env(const PyConfig *config, const char *name) { return _Py_GetEnv(config->use_environment, name); } @@ -920,46 +920,46 @@ _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) /* Get a copy of the environment variable as wchar_t*. Return 0 on success, but *dest can be NULL. Return -1 on memory allocation failure. Return -2 on decoding error. */ -static _PyInitError -_PyCoreConfig_GetEnvDup(_PyCoreConfig *config, - wchar_t **dest, - wchar_t *wname, char *name, - const char *decode_err_msg) +static PyStatus +config_get_env_dup(PyConfig *config, + wchar_t **dest, + wchar_t *wname, char *name, + const char *decode_err_msg) { assert(*dest == NULL); assert(config->use_environment >= 0); if (!config->use_environment) { *dest = NULL; - return _Py_INIT_OK(); + return _PyStatus_OK(); } #ifdef MS_WINDOWS const wchar_t *var = _wgetenv(wname); if (!var || var[0] == '\0') { *dest = NULL; - return _Py_INIT_OK(); + return _PyStatus_OK(); } - return _PyCoreConfig_SetString(config, dest, var); + return PyConfig_SetString(config, dest, var); #else const char *var = getenv(name); if (!var || var[0] == '\0') { *dest = NULL; - return _Py_INIT_OK(); + return _PyStatus_OK(); } - return _PyCoreConfig_DecodeLocaleErr(config, dest, var, decode_err_msg); + return config_set_bytes_string(config, dest, var, decode_err_msg); #endif } #define CONFIG_GET_ENV_DUP(CONFIG, DEST, WNAME, NAME) \ - _PyCoreConfig_GetEnvDup(CONFIG, DEST, WNAME, NAME, "cannot decode " NAME) + config_get_env_dup(CONFIG, DEST, WNAME, NAME, "cannot decode " NAME) static void -_PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) +config_get_global_vars(PyConfig *config) { if (config->_config_init != _PyConfig_INIT_COMPAT) { /* Python and Isolated configuration ignore global variables */ @@ -1001,7 +1001,7 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) /* Set Py_xxx global configuration variables from 'config' configuration. */ static void -_PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) +config_set_global_vars(const PyConfig *config) { #define COPY_FLAG(ATTR, VAR) \ if (config->ATTR != -1) { \ @@ -1042,19 +1042,19 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) /* Get the program name: use PYTHONEXECUTABLE and __PYVENV_LAUNCHER__ environment variables on macOS if available. */ -static _PyInitError -config_init_program_name(_PyCoreConfig *config) +static PyStatus +config_init_program_name(PyConfig *config) { - _PyInitError err; + PyStatus status; /* If Py_SetProgramName() was called, use its value */ const wchar_t *program_name = _Py_path_config.program_name; if (program_name != NULL) { config->program_name = _PyMem_RawWcsdup(program_name); if (config->program_name == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } #ifdef __APPLE__ @@ -1067,14 +1067,14 @@ config_init_program_name(_PyCoreConfig *config) so the actual executable path is passed in an environment variable. See Lib/plat-mac/bundlebuiler.py for details about the bootstrap script. */ - const char *p = _PyCoreConfig_GetEnv(config, "PYTHONEXECUTABLE"); + const char *p = config_get_env(config, "PYTHONEXECUTABLE"); if (p != NULL) { - err = CONFIG_DECODE_LOCALE(config, &config->program_name, p, - "PYTHONEXECUTABLE environment variable"); - if (_Py_INIT_FAILED(err)) { - return err; + status = CONFIG_SET_BYTES_STR(config, &config->program_name, p, + "PYTHONEXECUTABLE environment variable"); + if (_PyStatus_EXCEPTION(status)) { + return status; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } #ifdef WITH_NEXT_FRAMEWORK else { @@ -1083,26 +1083,27 @@ config_init_program_name(_PyCoreConfig *config) /* Used by Mac/Tools/pythonw.c to forward * the argv0 of the stub executable */ - err = CONFIG_DECODE_LOCALE(config, - &config->program_name, pyvenv_launcher, - "__PYVENV_LAUNCHER__ environment variable"); - if (_Py_INIT_FAILED(err)) { - return err; + status = CONFIG_SET_BYTES_STR(config, + &config->program_name, + pyvenv_launcher, + "__PYVENV_LAUNCHER__ environment variable"); + if (_PyStatus_EXCEPTION(status)) { + return status; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } } #endif /* WITH_NEXT_FRAMEWORK */ #endif /* __APPLE__ */ /* Use argv[0] if available and non-empty */ - const _PyWstrList *argv = &config->argv; + const PyWideStringList *argv = &config->argv; if (argv->length >= 1 && argv->items[0][0] != L'\0') { config->program_name = _PyMem_RawWcsdup(argv->items[0]); if (config->program_name == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Last fall back: hardcoded name */ @@ -1111,54 +1112,54 @@ config_init_program_name(_PyCoreConfig *config) #else const wchar_t *default_program_name = L"python3"; #endif - err = _PyCoreConfig_SetString(config, &config->program_name, - default_program_name); - if (_Py_INIT_FAILED(err)) { - return err; + status = PyConfig_SetString(config, &config->program_name, + default_program_name); + if (_PyStatus_EXCEPTION(status)) { + return status; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -config_init_executable(_PyCoreConfig *config) +static PyStatus +config_init_executable(PyConfig *config) { assert(config->executable == NULL); /* If Py_SetProgramFullPath() was called, use its value */ const wchar_t *program_full_path = _Py_path_config.program_full_path; if (program_full_path != NULL) { - _PyInitError err = _PyCoreConfig_SetString(config, - &config->executable, - program_full_path); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = PyConfig_SetString(config, + &config->executable, + program_full_path); + if (_PyStatus_EXCEPTION(status)) { + return status; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } static const wchar_t* -config_get_xoption(const _PyCoreConfig *config, wchar_t *name) +config_get_xoption(const PyConfig *config, wchar_t *name) { return _Py_get_xoption(&config->xoptions, name); } -static _PyInitError -config_init_home(_PyCoreConfig *config) +static PyStatus +config_init_home(PyConfig *config) { assert(config->home == NULL); /* If Py_SetPythonHome() was called, use its value */ wchar_t *home = _Py_path_config.home; if (home) { - _PyInitError err = _PyCoreConfig_SetString(config, &config->home, home); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = PyConfig_SetString(config, &config->home, home); + if (_PyStatus_EXCEPTION(status)) { + return status; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } return CONFIG_GET_ENV_DUP(config, &config->home, @@ -1166,10 +1167,10 @@ config_init_home(_PyCoreConfig *config) } -static _PyInitError -config_init_hash_seed(_PyCoreConfig *config) +static PyStatus +config_init_hash_seed(PyConfig *config) { - const char *seed_text = _PyCoreConfig_GetEnv(config, "PYTHONHASHSEED"); + const char *seed_text = config_get_env(config, "PYTHONHASHSEED"); Py_BUILD_ASSERT(sizeof(_Py_HashSecret_t) == sizeof(_Py_HashSecret.uc)); /* Convert a text seed to a numeric one */ @@ -1182,7 +1183,7 @@ config_init_hash_seed(_PyCoreConfig *config) || seed > 4294967295UL || (errno == ERANGE && seed == ULONG_MAX)) { - return _Py_INIT_ERR("PYTHONHASHSEED must be \"random\" " + return _PyStatus_ERR("PYTHONHASHSEED must be \"random\" " "or an integer in range [0; 4294967295]"); } /* Use a specific hash */ @@ -1194,7 +1195,7 @@ config_init_hash_seed(_PyCoreConfig *config) config->use_hash_seed = 0; config->hash_seed = 0; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -1216,10 +1217,10 @@ config_wstr_to_int(const wchar_t *wstr, int *result) } -static _PyInitError -config_read_env_vars(_PyCoreConfig *config) +static PyStatus +config_read_env_vars(PyConfig *config) { - _PyInitError err; + PyStatus status; int use_env = config->use_environment; /* Get environment variables */ @@ -1251,39 +1252,39 @@ config_read_env_vars(_PyCoreConfig *config) "PYTHONLEGACYWINDOWSSTDIO"); #endif - if (_PyCoreConfig_GetEnv(config, "PYTHONDUMPREFS")) { + if (config_get_env(config, "PYTHONDUMPREFS")) { config->dump_refs = 1; } - if (_PyCoreConfig_GetEnv(config, "PYTHONMALLOCSTATS")) { + if (config_get_env(config, "PYTHONMALLOCSTATS")) { config->malloc_stats = 1; } - if (config->module_search_path_env == NULL) { - err = CONFIG_GET_ENV_DUP(config, &config->module_search_path_env, - L"PYTHONPATH", "PYTHONPATH"); - if (_Py_INIT_FAILED(err)) { - return err; + if (config->pythonpath_env == NULL) { + status = CONFIG_GET_ENV_DUP(config, &config->pythonpath_env, + L"PYTHONPATH", "PYTHONPATH"); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->use_hash_seed < 0) { - err = config_init_hash_seed(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_init_hash_seed(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -config_init_tracemalloc(_PyCoreConfig *config) +static PyStatus +config_init_tracemalloc(PyConfig *config) { int nframe; int valid; - const char *env = _PyCoreConfig_GetEnv(config, "PYTHONTRACEMALLOC"); + const char *env = config_get_env(config, "PYTHONTRACEMALLOC"); if (env) { if (!_Py_str_to_int(env, &nframe)) { valid = (nframe >= 0); @@ -1292,7 +1293,7 @@ config_init_tracemalloc(_PyCoreConfig *config) valid = 0; } if (!valid) { - return _Py_INIT_ERR("PYTHONTRACEMALLOC: invalid number of frames"); + return _PyStatus_ERR("PYTHONTRACEMALLOC: invalid number of frames"); } config->tracemalloc = nframe; } @@ -1308,8 +1309,8 @@ config_init_tracemalloc(_PyCoreConfig *config) valid = 0; } if (!valid) { - return _Py_INIT_ERR("-X tracemalloc=NFRAME: " - "invalid number of frames"); + return _PyStatus_ERR("-X tracemalloc=NFRAME: " + "invalid number of frames"); } } else { @@ -1318,12 +1319,12 @@ config_init_tracemalloc(_PyCoreConfig *config) } config->tracemalloc = nframe; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -config_init_pycache_prefix(_PyCoreConfig *config) +static PyStatus +config_init_pycache_prefix(PyConfig *config) { assert(config->pycache_prefix == NULL); @@ -1333,7 +1334,7 @@ config_init_pycache_prefix(_PyCoreConfig *config) if (sep && wcslen(sep) > 1) { config->pycache_prefix = _PyMem_RawWcsdup(sep + 1); if (config->pycache_prefix == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } } else { @@ -1341,7 +1342,7 @@ config_init_pycache_prefix(_PyCoreConfig *config) // if "-X pycache_prefix=" option is used config->pycache_prefix = NULL; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } return CONFIG_GET_ENV_DUP(config, &config->pycache_prefix, @@ -1350,41 +1351,41 @@ config_init_pycache_prefix(_PyCoreConfig *config) } -static _PyInitError -config_read_complex_options(_PyCoreConfig *config) +static PyStatus +config_read_complex_options(PyConfig *config) { /* More complex options configured by env var and -X option */ if (config->faulthandler < 0) { - if (_PyCoreConfig_GetEnv(config, "PYTHONFAULTHANDLER") + if (config_get_env(config, "PYTHONFAULTHANDLER") || config_get_xoption(config, L"faulthandler")) { config->faulthandler = 1; } } - if (_PyCoreConfig_GetEnv(config, "PYTHONPROFILEIMPORTTIME") + if (config_get_env(config, "PYTHONPROFILEIMPORTTIME") || config_get_xoption(config, L"importtime")) { config->import_time = 1; } - _PyInitError err; + PyStatus status; if (config->tracemalloc < 0) { - err = config_init_tracemalloc(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_init_tracemalloc(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->pycache_prefix == NULL) { - err = config_init_pycache_prefix(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_init_pycache_prefix(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } static const wchar_t * -config_get_stdio_errors(const _PyCoreConfig *config) +config_get_stdio_errors(const PyConfig *config) { #ifndef MS_WINDOWS const char *loc = setlocale(LC_CTYPE, NULL); @@ -1410,65 +1411,65 @@ config_get_stdio_errors(const _PyCoreConfig *config) } -static _PyInitError -config_get_locale_encoding(_PyCoreConfig *config, wchar_t **locale_encoding) +static PyStatus +config_get_locale_encoding(PyConfig *config, wchar_t **locale_encoding) { #ifdef MS_WINDOWS char encoding[20]; PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); - return _PyCoreConfig_DecodeLocale(config, locale_encoding, encoding); + return PyConfig_SetBytesString(config, locale_encoding, encoding); #elif defined(_Py_FORCE_UTF8_LOCALE) - return _PyCoreConfig_SetString(config, locale_encoding, L"utf-8"); + return PyConfig_SetString(config, locale_encoding, L"utf-8"); #else const char *encoding = nl_langinfo(CODESET); if (!encoding || encoding[0] == '\0') { - return _Py_INIT_ERR("failed to get the locale encoding: " - "nl_langinfo(CODESET) failed"); + return _PyStatus_ERR("failed to get the locale encoding: " + "nl_langinfo(CODESET) failed"); } /* nl_langinfo(CODESET) is decoded by Py_DecodeLocale() */ - return CONFIG_DECODE_LOCALE(config, + return CONFIG_SET_BYTES_STR(config, locale_encoding, encoding, "nl_langinfo(CODESET)"); #endif } -static _PyInitError -config_init_stdio_encoding(_PyCoreConfig *config, - const _PyPreConfig *preconfig) +static PyStatus +config_init_stdio_encoding(PyConfig *config, + const PyPreConfig *preconfig) { - _PyInitError err; + PyStatus status; /* If Py_SetStandardStreamEncoding() have been called, use these parameters. */ if (config->stdio_encoding == NULL && _Py_StandardStreamEncoding != NULL) { - err = CONFIG_DECODE_LOCALE(config, &config->stdio_encoding, - _Py_StandardStreamEncoding, - "_Py_StandardStreamEncoding"); - if (_Py_INIT_FAILED(err)) { - return err; + status = CONFIG_SET_BYTES_STR(config, &config->stdio_encoding, + _Py_StandardStreamEncoding, + "_Py_StandardStreamEncoding"); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->stdio_errors == NULL && _Py_StandardStreamErrors != NULL) { - err = CONFIG_DECODE_LOCALE(config, &config->stdio_errors, - _Py_StandardStreamErrors, - "_Py_StandardStreamErrors"); - if (_Py_INIT_FAILED(err)) { - return err; + status = CONFIG_SET_BYTES_STR(config, &config->stdio_errors, + _Py_StandardStreamErrors, + "_Py_StandardStreamErrors"); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->stdio_encoding != NULL && config->stdio_errors != NULL) { - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* PYTHONIOENCODING environment variable */ - const char *opt = _PyCoreConfig_GetEnv(config, "PYTHONIOENCODING"); + const char *opt = config_get_env(config, "PYTHONIOENCODING"); if (opt) { char *pythonioencoding = _PyMem_RawStrdup(opt); if (pythonioencoding == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } char *errors = strchr(pythonioencoding, ':'); @@ -1483,12 +1484,12 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* Does PYTHONIOENCODING contain an encoding? */ if (pythonioencoding[0]) { if (config->stdio_encoding == NULL) { - err = CONFIG_DECODE_LOCALE(config, &config->stdio_encoding, - pythonioencoding, - "PYTHONIOENCODING environment variable"); - if (_Py_INIT_FAILED(err)) { + status = CONFIG_SET_BYTES_STR(config, &config->stdio_encoding, + pythonioencoding, + "PYTHONIOENCODING environment variable"); + if (_PyStatus_EXCEPTION(status)) { PyMem_RawFree(pythonioencoding); - return err; + return status; } } @@ -1502,12 +1503,12 @@ config_init_stdio_encoding(_PyCoreConfig *config, } if (config->stdio_errors == NULL && errors != NULL) { - err = CONFIG_DECODE_LOCALE(config, &config->stdio_errors, - errors, - "PYTHONIOENCODING environment variable"); - if (_Py_INIT_FAILED(err)) { + status = CONFIG_SET_BYTES_STR(config, &config->stdio_errors, + errors, + "PYTHONIOENCODING environment variable"); + if (_PyStatus_EXCEPTION(status)) { PyMem_RawFree(pythonioencoding); - return err; + return status; } } @@ -1517,83 +1518,84 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* UTF-8 Mode uses UTF-8/surrogateescape */ if (preconfig->utf8_mode) { if (config->stdio_encoding == NULL) { - err = _PyCoreConfig_SetString(config, &config->stdio_encoding, L"utf-8"); - if (_Py_INIT_FAILED(err)) { - return err; + status = PyConfig_SetString(config, &config->stdio_encoding, + L"utf-8"); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->stdio_errors == NULL) { - err = _PyCoreConfig_SetString(config, &config->stdio_errors, - L"surrogateescape"); - if (_Py_INIT_FAILED(err)) { - return err; + status = PyConfig_SetString(config, &config->stdio_errors, + L"surrogateescape"); + if (_PyStatus_EXCEPTION(status)) { + return status; } } } /* Choose the default error handler based on the current locale. */ if (config->stdio_encoding == NULL) { - err = config_get_locale_encoding(config, &config->stdio_encoding); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_get_locale_encoding(config, &config->stdio_encoding); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->stdio_errors == NULL) { const wchar_t *errors = config_get_stdio_errors(config); assert(errors != NULL); - err = _PyCoreConfig_SetString(config, &config->stdio_errors, errors); - if (_Py_INIT_FAILED(err)) { - return err; + status = PyConfig_SetString(config, &config->stdio_errors, errors); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) +static PyStatus +config_init_fs_encoding(PyConfig *config, const PyPreConfig *preconfig) { - _PyInitError err; + PyStatus status; if (config->filesystem_encoding == NULL) { #ifdef _Py_FORCE_UTF8_FS_ENCODING - err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, L"utf-8"); + status = PyConfig_SetString(config, &config->filesystem_encoding, L"utf-8"); #else #ifdef MS_WINDOWS if (preconfig->legacy_windows_fs_encoding) { /* Legacy Windows filesystem encoding: mbcs/replace */ - err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, - L"mbcs"); + status = PyConfig_SetString(config, &config->filesystem_encoding, + L"mbcs"); } else #endif if (preconfig->utf8_mode) { - err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, - L"utf-8"); + status = PyConfig_SetString(config, &config->filesystem_encoding, + L"utf-8"); } #ifndef MS_WINDOWS else if (_Py_GetForceASCII()) { - err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, - L"ascii"); + status = PyConfig_SetString(config, &config->filesystem_encoding, + L"ascii"); } #endif else { #ifdef MS_WINDOWS /* Windows defaults to utf-8/surrogatepass (PEP 529). */ - err = _PyCoreConfig_SetString(config, &config->filesystem_encoding, - L"utf-8"); + status = PyConfig_SetString(config, &config->filesystem_encoding, + L"utf-8"); #else - err = config_get_locale_encoding(config, - &config->filesystem_encoding); + status = config_get_locale_encoding(config, + &config->filesystem_encoding); #endif } #endif /* !_Py_FORCE_UTF8_FS_ENCODING */ - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } } @@ -1609,25 +1611,25 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) #else errors = L"surrogateescape"; #endif - err = _PyCoreConfig_SetString(config, &config->filesystem_errors, errors); - if (_Py_INIT_FAILED(err)) { - return err; + status = PyConfig_SetString(config, &config->filesystem_errors, errors); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -config_read(_PyCoreConfig *config) +static PyStatus +config_read(PyConfig *config) { - _PyInitError err; - const _PyPreConfig *preconfig = &_PyRuntime.preconfig; + PyStatus status; + const PyPreConfig *preconfig = &_PyRuntime.preconfig; if (config->use_environment) { - err = config_read_env_vars(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_read_env_vars(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } @@ -1639,29 +1641,29 @@ config_read(_PyCoreConfig *config) config->show_alloc_count = 1; } - err = config_read_complex_options(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_read_complex_options(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (config->home == NULL) { - err = config_init_home(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_init_home(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->executable == NULL) { - err = config_init_executable(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_init_executable(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->_install_importlib) { - err = _PyCoreConfig_InitPathConfig(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyConfig_InitPathConfig(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } @@ -1683,29 +1685,30 @@ config_read(_PyCoreConfig *config) } if (config->filesystem_encoding == NULL || config->filesystem_errors == NULL) { - err = config_init_fs_encoding(config, preconfig); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_init_fs_encoding(config, preconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - err = config_init_stdio_encoding(config, preconfig); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_init_stdio_encoding(config, preconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (config->argv.length < 1) { /* Ensure at least one (empty) argument is seen */ - if (_PyWstrList_Append(&config->argv, L"") < 0) { - return _Py_INIT_NO_MEMORY(); + status = PyWideStringList_Append(&config->argv, L""); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->check_hash_pycs_mode == NULL) { - err = _PyCoreConfig_SetString(config, &config->check_hash_pycs_mode, - L"default"); - if (_Py_INIT_FAILED(err)) { - return err; + status = PyConfig_SetString(config, &config->check_hash_pycs_mode, + L"default"); + if (_PyStatus_EXCEPTION(status)) { + return status; } } @@ -1713,12 +1716,12 @@ config_read(_PyCoreConfig *config) config->configure_c_stdio = 1; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } static void -config_init_stdio(const _PyCoreConfig *config) +config_init_stdio(const PyConfig *config) { #if defined(MS_WINDOWS) || defined(__CYGWIN__) /* don't translate newlines (\r\n <=> \n) */ @@ -1759,23 +1762,23 @@ config_init_stdio(const _PyCoreConfig *config) - set Py_xxx global configuration variables - initialize C standard streams (stdin, stdout, stderr) */ void -_PyCoreConfig_Write(const _PyCoreConfig *config, _PyRuntimeState *runtime) +_PyConfig_Write(const PyConfig *config, _PyRuntimeState *runtime) { - _PyCoreConfig_SetGlobalConfig(config); + config_set_global_vars(config); if (config->configure_c_stdio) { config_init_stdio(config); } /* Write the new pre-configuration into _PyRuntime */ - _PyPreConfig *preconfig = &runtime->preconfig; + PyPreConfig *preconfig = &runtime->preconfig; preconfig->isolated = config->isolated; preconfig->use_environment = config->use_environment; preconfig->dev_mode = config->dev_mode; } -/* --- _PyCoreConfig command line parser -------------------------- */ +/* --- PyConfig command line parser -------------------------- */ static void config_usage(int error, const wchar_t* program) @@ -1797,12 +1800,12 @@ config_usage(int error, const wchar_t* program) /* Parse the command line arguments */ -static _PyInitError -config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, +static PyStatus +config_parse_cmdline(PyConfig *config, PyWideStringList *warnoptions, Py_ssize_t *opt_index) { - _PyInitError err; - const _PyWstrList *argv = &config->argv; + PyStatus status; + const PyWideStringList *argv = &config->argv; int print_version = 0; const wchar_t* program = config->program_name; @@ -1822,7 +1825,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, size_t len = wcslen(_PyOS_optarg) + 1 + 1; wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len); if (command == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t)); command[len - 2] = '\n'; @@ -1839,7 +1842,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, if (config->run_module == NULL) { config->run_module = _PyMem_RawWcsdup(_PyOS_optarg); if (config->run_module == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } } break; @@ -1853,16 +1856,16 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, || wcscmp(_PyOS_optarg, L"never") == 0 || wcscmp(_PyOS_optarg, L"default") == 0) { - err = _PyCoreConfig_SetString(config, &config->check_hash_pycs_mode, - _PyOS_optarg); - if (_Py_INIT_FAILED(err)) { - return err; + status = PyConfig_SetString(config, &config->check_hash_pycs_mode, + _PyOS_optarg); + if (_PyStatus_EXCEPTION(status)) { + return status; } } else { fprintf(stderr, "--check-hash-based-pycs must be one of " "'default', 'always', or 'never'\n"); config_usage(1, program); - return _Py_INIT_EXIT(2); + return _PyStatus_EXIT(2); } break; @@ -1922,15 +1925,16 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, case 'h': case '?': config_usage(0, program); - return _Py_INIT_EXIT(0); + return _PyStatus_EXIT(0); case 'V': print_version++; break; case 'W': - if (_PyWstrList_Append(warnoptions, _PyOS_optarg) < 0) { - return _Py_INIT_NO_MEMORY(); + status = PyWideStringList_Append(warnoptions, _PyOS_optarg); + if (_PyStatus_EXCEPTION(status)) { + return status; } break; @@ -1947,14 +1951,14 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, default: /* unknown argument: parsing failed */ config_usage(1, program); - return _Py_INIT_EXIT(2); + return _PyStatus_EXIT(2); } } while (1); if (print_version) { printf("Python %s\n", (print_version >= 2) ? Py_GetVersion() : PY_VERSION); - return _Py_INIT_EXIT(0); + return _PyStatus_EXIT(0); } if (config->run_command == NULL && config->run_module == NULL @@ -1964,7 +1968,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, { config->run_filename = _PyMem_RawWcsdup(argv->items[_PyOS_optind]); if (config->run_filename == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } } @@ -1975,7 +1979,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, *opt_index = _PyOS_optind; - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -1986,21 +1990,21 @@ config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions, #endif /* Get warning options from PYTHONWARNINGS environment variable. */ -static _PyInitError -config_init_env_warnoptions(_PyCoreConfig *config, _PyWstrList *warnoptions) +static PyStatus +config_init_env_warnoptions(PyConfig *config, PyWideStringList *warnoptions) { - _PyInitError err; + PyStatus status; /* CONFIG_GET_ENV_DUP requires dest to be initialized to NULL */ wchar_t *env = NULL; - err = CONFIG_GET_ENV_DUP(config, &env, + status = CONFIG_GET_ENV_DUP(config, &env, L"PYTHONWARNINGS", "PYTHONWARNINGS"); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyStatus_EXCEPTION(status)) { + return status; } /* env var is not set or is empty */ if (env == NULL) { - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -2009,35 +2013,35 @@ config_init_env_warnoptions(_PyCoreConfig *config, _PyWstrList *warnoptions) warning != NULL; warning = WCSTOK(NULL, L",", &context)) { - if (_PyWstrList_Append(warnoptions, warning) < 0) { + status = PyWideStringList_Append(warnoptions, warning); + if (_PyStatus_EXCEPTION(status)) { PyMem_RawFree(env); - return _Py_INIT_NO_MEMORY(); + return status; } } PyMem_RawFree(env); - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static int -config_add_warnoption(_PyCoreConfig *config, const wchar_t *option) +static PyStatus +config_add_warnoption(PyConfig *config, const wchar_t *option) { - if (_PyWstrList_Find(&config->warnoptions, option)) { + if (_PyWideStringList_Find(&config->warnoptions, option)) { /* Already present: do nothing */ - return 0; - } - if (_PyWstrList_Append(&config->warnoptions, option)) { - return -1; + return _PyStatus_OK(); } - return 0; + return PyWideStringList_Append(&config->warnoptions, option); } -static _PyInitError -config_init_warnoptions(_PyCoreConfig *config, - const _PyWstrList *cmdline_warnoptions, - const _PyWstrList *env_warnoptions) +static PyStatus +config_init_warnoptions(PyConfig *config, + const PyWideStringList *cmdline_warnoptions, + const PyWideStringList *env_warnoptions) { + PyStatus status; + /* The priority order for warnings configuration is (highest precedence * first): * @@ -2054,25 +2058,28 @@ config_init_warnoptions(_PyCoreConfig *config, */ if (config->dev_mode) { - if (config_add_warnoption(config, L"default") < 0) { - return _Py_INIT_NO_MEMORY(); + status = config_add_warnoption(config, L"default"); + if (_PyStatus_EXCEPTION(status)) { + return status; } } Py_ssize_t i; - const _PyWstrList *options; + const PyWideStringList *options; options = env_warnoptions; for (i = 0; i < options->length; i++) { - if (config_add_warnoption(config, options->items[i]) < 0) { - return _Py_INIT_NO_MEMORY(); + status = config_add_warnoption(config, options->items[i]); + if (_PyStatus_EXCEPTION(status)) { + return status; } } options = cmdline_warnoptions; for (i = 0; i < options->length; i++) { - if (config_add_warnoption(config, options->items[i]) < 0) { - return _Py_INIT_NO_MEMORY(); + status = config_add_warnoption(config, options->items[i]); + if (_PyStatus_EXCEPTION(status)) { + return status; } } @@ -2088,33 +2095,35 @@ config_init_warnoptions(_PyCoreConfig *config, else { filter = L"default::BytesWarning"; } - if (config_add_warnoption(config, filter) < 0) { - return _Py_INIT_NO_MEMORY(); + status = config_add_warnoption(config, filter); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -config_update_argv(_PyCoreConfig *config, Py_ssize_t opt_index) +static PyStatus +config_update_argv(PyConfig *config, Py_ssize_t opt_index) { - const _PyWstrList *cmdline_argv = &config->argv; - _PyWstrList config_argv = _PyWstrList_INIT; + const PyWideStringList *cmdline_argv = &config->argv; + PyWideStringList config_argv = PyWideStringList_INIT; /* Copy argv to be able to modify it (to force -c/-m) */ if (cmdline_argv->length <= opt_index) { /* Ensure at least one (empty) argument is seen */ - if (_PyWstrList_Append(&config_argv, L"") < 0) { - return _Py_INIT_NO_MEMORY(); + PyStatus status = PyWideStringList_Append(&config_argv, L""); + if (_PyStatus_EXCEPTION(status)) { + return status; } } else { - _PyWstrList slice; + PyWideStringList slice; slice.length = cmdline_argv->length - opt_index; slice.items = &cmdline_argv->items[opt_index]; - if (_PyWstrList_Copy(&config_argv, &slice) < 0) { - return _Py_INIT_NO_MEMORY(); + if (_PyWideStringList_Copy(&config_argv, &slice) < 0) { + return _PyStatus_NO_MEMORY(); } } assert(config_argv.length >= 1); @@ -2131,109 +2140,108 @@ config_update_argv(_PyCoreConfig *config, Py_ssize_t opt_index) if (arg0 != NULL) { arg0 = _PyMem_RawWcsdup(arg0); if (arg0 == NULL) { - _PyWstrList_Clear(&config_argv); - return _Py_INIT_NO_MEMORY(); + _PyWideStringList_Clear(&config_argv); + return _PyStatus_NO_MEMORY(); } PyMem_RawFree(config_argv.items[0]); config_argv.items[0] = arg0; } - _PyWstrList_Clear(&config->argv); + _PyWideStringList_Clear(&config->argv); config->argv = config_argv; - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -core_read_precmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) +static PyStatus +core_read_precmdline(PyConfig *config, _PyPreCmdline *precmdline) { - _PyInitError err; + PyStatus status; if (config->parse_argv) { - if (_PyWstrList_Copy(&precmdline->argv, &config->argv) < 0) { - return _Py_INIT_NO_MEMORY(); + if (_PyWideStringList_Copy(&precmdline->argv, &config->argv) < 0) { + return _PyStatus_NO_MEMORY(); } } - _PyPreConfig preconfig; + PyPreConfig preconfig; _PyPreConfig_InitFromPreConfig(&preconfig, &_PyRuntime.preconfig); - _PyPreConfig_GetCoreConfig(&preconfig, config); + _PyPreConfig_GetConfig(&preconfig, config); - err = _PyPreCmdline_Read(precmdline, &preconfig); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyPreCmdline_Read(precmdline, &preconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } - if (_PyPreCmdline_SetCoreConfig(precmdline, config) < 0) { - err = _Py_INIT_NO_MEMORY(); - return err; + status = _PyPreCmdline_SetConfig(precmdline, config); + if (_PyStatus_EXCEPTION(status)) { + return status; } - - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -config_read_cmdline(_PyCoreConfig *config) +static PyStatus +config_read_cmdline(PyConfig *config) { - _PyInitError err; - _PyWstrList cmdline_warnoptions = _PyWstrList_INIT; - _PyWstrList env_warnoptions = _PyWstrList_INIT; + PyStatus status; + PyWideStringList cmdline_warnoptions = PyWideStringList_INIT; + PyWideStringList env_warnoptions = PyWideStringList_INIT; if (config->parse_argv < 0) { config->parse_argv = 1; } if (config->program_name == NULL) { - err = config_init_program_name(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = config_init_program_name(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->parse_argv) { Py_ssize_t opt_index; - err = config_parse_cmdline(config, &cmdline_warnoptions, &opt_index); - if (_Py_INIT_FAILED(err)) { + status = config_parse_cmdline(config, &cmdline_warnoptions, &opt_index); + if (_PyStatus_EXCEPTION(status)) { goto done; } - err = config_update_argv(config, opt_index); - if (_Py_INIT_FAILED(err)) { + status = config_update_argv(config, opt_index); + if (_PyStatus_EXCEPTION(status)) { goto done; } } if (config->use_environment) { - err = config_init_env_warnoptions(config, &env_warnoptions); - if (_Py_INIT_FAILED(err)) { + status = config_init_env_warnoptions(config, &env_warnoptions); + if (_PyStatus_EXCEPTION(status)) { goto done; } } - err = config_init_warnoptions(config, + status = config_init_warnoptions(config, &cmdline_warnoptions, &env_warnoptions); - if (_Py_INIT_FAILED(err)) { + if (_PyStatus_EXCEPTION(status)) { goto done; } - err = _Py_INIT_OK(); + status = _PyStatus_OK(); done: - _PyWstrList_Clear(&cmdline_warnoptions); - _PyWstrList_Clear(&env_warnoptions); - return err; + _PyWideStringList_Clear(&cmdline_warnoptions); + _PyWideStringList_Clear(&env_warnoptions); + return status; } -_PyInitError -_PyCoreConfig_SetPyArgv(_PyCoreConfig *config, const _PyArgv *args) +PyStatus +_PyConfig_SetPyArgv(PyConfig *config, const _PyArgv *args) { - _PyInitError err = _Py_PreInitializeFromCoreConfig(config, args); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _Py_PreInitializeFromConfig(config, args); + if (_PyStatus_EXCEPTION(status)) { + return status; } return _PyArgv_AsWstrList(args, &config->argv); @@ -2242,57 +2250,57 @@ _PyCoreConfig_SetPyArgv(_PyCoreConfig *config, const _PyArgv *args) /* Set config.argv: decode argv using Py_DecodeLocale(). Pre-initialize Python if needed to ensure that encodings are properly configured. */ -_PyInitError -_PyCoreConfig_SetArgv(_PyCoreConfig *config, Py_ssize_t argc, char * const *argv) +PyStatus +PyConfig_SetBytesArgv(PyConfig *config, Py_ssize_t argc, char * const *argv) { _PyArgv args = { .argc = argc, .use_bytes_argv = 1, .bytes_argv = argv, .wchar_argv = NULL}; - return _PyCoreConfig_SetPyArgv(config, &args); + return _PyConfig_SetPyArgv(config, &args); } -_PyInitError -_PyCoreConfig_SetWideArgv(_PyCoreConfig *config, Py_ssize_t argc, wchar_t * const *argv) +PyStatus +PyConfig_SetArgv(PyConfig *config, Py_ssize_t argc, wchar_t * const *argv) { _PyArgv args = { .argc = argc, .use_bytes_argv = 0, .bytes_argv = NULL, .wchar_argv = argv}; - return _PyCoreConfig_SetPyArgv(config, &args); + return _PyConfig_SetPyArgv(config, &args); } -/* Read the configuration into _PyCoreConfig from: +/* Read the configuration into PyConfig from: * Command line arguments * Environment variables * Py_xxx global configuration variables The only side effects are to modify config and to call _Py_SetArgcArgv(). */ -_PyInitError -_PyCoreConfig_Read(_PyCoreConfig *config) +PyStatus +PyConfig_Read(PyConfig *config) { - _PyInitError err; - _PyWstrList orig_argv = _PyWstrList_INIT; + PyStatus status; + PyWideStringList orig_argv = PyWideStringList_INIT; - err = _Py_PreInitializeFromCoreConfig(config, NULL); - if (_Py_INIT_FAILED(err)) { - return err; + status = _Py_PreInitializeFromConfig(config, NULL); + if (_PyStatus_EXCEPTION(status)) { + return status; } - _PyCoreConfig_GetGlobalConfig(config); + config_get_global_vars(config); - if (_PyWstrList_Copy(&orig_argv, &config->argv) < 0) { - return _Py_INIT_NO_MEMORY(); + if (_PyWideStringList_Copy(&orig_argv, &config->argv) < 0) { + return _PyStatus_NO_MEMORY(); } _PyPreCmdline precmdline = _PyPreCmdline_INIT; - err = core_read_precmdline(config, &precmdline); - if (_Py_INIT_FAILED(err)) { + status = core_read_precmdline(config, &precmdline); + if (_PyStatus_EXCEPTION(status)) { goto done; } @@ -2302,18 +2310,18 @@ _PyCoreConfig_Read(_PyCoreConfig *config) config->user_site_directory = 0; } - err = config_read_cmdline(config); - if (_Py_INIT_FAILED(err)) { + status = config_read_cmdline(config); + if (_PyStatus_EXCEPTION(status)) { goto done; } - err = config_read(config); - if (_Py_INIT_FAILED(err)) { + status = config_read(config); + if (_PyStatus_EXCEPTION(status)) { goto done; } if (_Py_SetArgcArgv(orig_argv.length, orig_argv.items) < 0) { - err = _Py_INIT_NO_MEMORY(); + status = _PyStatus_NO_MEMORY(); goto done; } @@ -2339,14 +2347,14 @@ _PyCoreConfig_Read(_PyCoreConfig *config) assert(config->configure_c_stdio >= 0); assert(config->buffered_stdio >= 0); assert(config->program_name != NULL); - assert(_PyWstrList_CheckConsistency(&config->argv)); + assert(_PyWideStringList_CheckConsistency(&config->argv)); /* sys.argv must be non-empty: empty argv is replaced with [''] */ assert(config->argv.length >= 1); - assert(_PyWstrList_CheckConsistency(&config->xoptions)); - assert(_PyWstrList_CheckConsistency(&config->warnoptions)); - assert(_PyWstrList_CheckConsistency(&config->module_search_paths)); + assert(_PyWideStringList_CheckConsistency(&config->xoptions)); + assert(_PyWideStringList_CheckConsistency(&config->warnoptions)); + assert(_PyWideStringList_CheckConsistency(&config->module_search_paths)); if (config->_install_importlib) { - assert(config->use_module_search_paths != 0); + assert(config->module_search_paths_set != 0); /* don't check config->module_search_paths */ assert(config->executable != NULL); assert(config->prefix != NULL); @@ -2367,63 +2375,63 @@ _PyCoreConfig_Read(_PyCoreConfig *config) assert(config->_install_importlib >= 0); assert(config->pathconfig_warnings >= 0); - err = _Py_INIT_OK(); + status = _PyStatus_OK(); done: - _PyWstrList_Clear(&orig_argv); + _PyWideStringList_Clear(&orig_argv); _PyPreCmdline_Clear(&precmdline); - return err; + return status; } PyObject* _Py_GetConfigsAsDict(void) { - PyObject *config = NULL; + PyObject *result = NULL; PyObject *dict = NULL; - config = PyDict_New(); - if (config == NULL) { + result = PyDict_New(); + if (result == NULL) { goto error; } - /* global config */ + /* global result */ dict = _Py_GetGlobalVariablesAsDict(); if (dict == NULL) { goto error; } - if (PyDict_SetItemString(config, "global_config", dict) < 0) { + if (PyDict_SetItemString(result, "global_config", dict) < 0) { goto error; } Py_CLEAR(dict); /* pre config */ PyInterpreterState *interp = _PyInterpreterState_Get(); - const _PyPreConfig *pre_config = &_PyRuntime.preconfig; + const PyPreConfig *pre_config = &_PyRuntime.preconfig; dict = _PyPreConfig_AsDict(pre_config); if (dict == NULL) { goto error; } - if (PyDict_SetItemString(config, "pre_config", dict) < 0) { + if (PyDict_SetItemString(result, "pre_config", dict) < 0) { goto error; } Py_CLEAR(dict); /* core config */ - const _PyCoreConfig *core_config = _PyInterpreterState_GetCoreConfig(interp); - dict = _PyCoreConfig_AsDict(core_config); + const PyConfig *config = &interp->config; + dict = config_as_dict(config); if (dict == NULL) { goto error; } - if (PyDict_SetItemString(config, "core_config", dict) < 0) { + if (PyDict_SetItemString(result, "config", dict) < 0) { goto error; } Py_CLEAR(dict); - return config; + return result; error: - Py_XDECREF(config); + Py_XDECREF(result); Py_XDECREF(dict); return NULL; } diff --git a/Python/pathconfig.c b/Python/pathconfig.c index bbf29b2fa598..ec67405a28d0 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -2,7 +2,7 @@ #include "Python.h" #include "osdefs.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_fileutils.h" #include "pycore_pathconfig.h" #include "pycore_pymem.h" @@ -34,7 +34,7 @@ copy_wstr(wchar_t **dst, const wchar_t *src) static void -_PyPathConfig_Clear(_PyPathConfig *config) +pathconfig_clear(_PyPathConfig *config) { /* _PyMem_SetDefaultAllocator() is needed to get a known memory allocator, since Py_SetPath(), Py_SetPythonHome() and Py_SetProgramName() can be @@ -63,12 +63,11 @@ _PyPathConfig_Clear(_PyPathConfig *config) } -/* Calculate the path configuration: initialize path_config from core_config */ -static _PyInitError -_PyPathConfig_Calculate(_PyPathConfig *path_config, - const _PyCoreConfig *core_config) +/* Calculate the path configuration: initialize pathconfig from config */ +static PyStatus +pathconfig_calculate(_PyPathConfig *pathconfig, const PyConfig *config) { - _PyInitError err; + PyStatus status; _PyPathConfig new_config = _PyPathConfig_INIT; PyMemAllocatorEx old_alloc; @@ -76,40 +75,40 @@ _PyPathConfig_Calculate(_PyPathConfig *path_config, /* Calculate program_full_path, prefix, exec_prefix, dll_path (Windows), and module_search_path */ - err = _PyPathConfig_Calculate_impl(&new_config, core_config); - if (_Py_INIT_FAILED(err)) { - goto err; + status = _PyPathConfig_Calculate(&new_config, config); + if (_PyStatus_EXCEPTION(status)) { + goto error; } - /* Copy home and program_name from core_config */ - if (copy_wstr(&new_config.home, core_config->home) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto err; + /* Copy home and program_name from config */ + if (copy_wstr(&new_config.home, config->home) < 0) { + status = _PyStatus_NO_MEMORY(); + goto error; } - if (copy_wstr(&new_config.program_name, core_config->program_name) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto err; + if (copy_wstr(&new_config.program_name, config->program_name) < 0) { + status = _PyStatus_NO_MEMORY(); + goto error; } - _PyPathConfig_Clear(path_config); - *path_config = new_config; + pathconfig_clear(pathconfig); + *pathconfig = new_config; - err = _Py_INIT_OK(); + status = _PyStatus_OK(); goto done; -err: - _PyPathConfig_Clear(&new_config); +error: + pathconfig_clear(&new_config); done: PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - return err; + return status; } -_PyInitError +PyStatus _PyPathConfig_SetGlobal(const _PyPathConfig *config) { - _PyInitError err; + PyStatus status; _PyPathConfig new_config = _PyPathConfig_INIT; PyMemAllocatorEx old_alloc; @@ -118,8 +117,8 @@ _PyPathConfig_SetGlobal(const _PyPathConfig *config) #define COPY_ATTR(ATTR) \ do { \ if (copy_wstr(&new_config.ATTR, config->ATTR) < 0) { \ - _PyPathConfig_Clear(&new_config); \ - err = _Py_INIT_NO_MEMORY(); \ + pathconfig_clear(&new_config); \ + status = _PyStatus_NO_MEMORY(); \ goto done; \ } \ } while (0) @@ -134,15 +133,15 @@ _PyPathConfig_SetGlobal(const _PyPathConfig *config) COPY_ATTR(program_name); COPY_ATTR(home); - _PyPathConfig_Clear(&_Py_path_config); + pathconfig_clear(&_Py_path_config); /* Steal new_config strings; don't clear new_config */ _Py_path_config = new_config; - err = _Py_INIT_OK(); + status = _PyStatus_OK(); done: PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - return err; + return status; } @@ -152,14 +151,14 @@ _PyPathConfig_ClearGlobal(void) PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyPathConfig_Clear(&_Py_path_config); + pathconfig_clear(&_Py_path_config); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } static wchar_t* -_PyWstrList_Join(const _PyWstrList *list, wchar_t sep) +_PyWideStringList_Join(const PyWideStringList *list, wchar_t sep) { size_t len = 1; /* NUL terminator */ for (Py_ssize_t i=0; i < list->length; i++) { @@ -189,70 +188,69 @@ _PyWstrList_Join(const _PyWstrList *list, wchar_t sep) } -/* Set the global path configuration from core_config. */ -_PyInitError -_PyCoreConfig_SetPathConfig(const _PyCoreConfig *core_config) +/* Set the global path configuration from config. */ +PyStatus +_PyConfig_SetPathConfig(const PyConfig *config) { PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyInitError err; - _PyPathConfig path_config = _PyPathConfig_INIT; + PyStatus status; + _PyPathConfig pathconfig = _PyPathConfig_INIT; - path_config.module_search_path = _PyWstrList_Join(&core_config->module_search_paths, DELIM); - if (path_config.module_search_path == NULL) { + pathconfig.module_search_path = _PyWideStringList_Join(&config->module_search_paths, DELIM); + if (pathconfig.module_search_path == NULL) { goto no_memory; } - if (copy_wstr(&path_config.program_full_path, core_config->executable) < 0) { + if (copy_wstr(&pathconfig.program_full_path, config->executable) < 0) { goto no_memory; } - if (copy_wstr(&path_config.prefix, core_config->prefix) < 0) { + if (copy_wstr(&pathconfig.prefix, config->prefix) < 0) { goto no_memory; } - if (copy_wstr(&path_config.exec_prefix, core_config->exec_prefix) < 0) { + if (copy_wstr(&pathconfig.exec_prefix, config->exec_prefix) < 0) { goto no_memory; } #ifdef MS_WINDOWS - path_config.dll_path = _Py_GetDLLPath(); - if (path_config.dll_path == NULL) { + pathconfig.dll_path = _Py_GetDLLPath(); + if (pathconfig.dll_path == NULL) { goto no_memory; } #endif - if (copy_wstr(&path_config.program_name, core_config->program_name) < 0) { + if (copy_wstr(&pathconfig.program_name, config->program_name) < 0) { goto no_memory; } - if (copy_wstr(&path_config.home, core_config->home) < 0) { + if (copy_wstr(&pathconfig.home, config->home) < 0) { goto no_memory; } - err = _PyPathConfig_SetGlobal(&path_config); - if (_Py_INIT_FAILED(err)) { + status = _PyPathConfig_SetGlobal(&pathconfig); + if (_PyStatus_EXCEPTION(status)) { goto done; } - err = _Py_INIT_OK(); + status = _PyStatus_OK(); goto done; no_memory: - err = _Py_INIT_NO_MEMORY(); + status = _PyStatus_NO_MEMORY(); done: - _PyPathConfig_Clear(&path_config); + pathconfig_clear(&pathconfig); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - return err; + return status; } -static _PyInitError -core_config_init_module_search_paths(_PyCoreConfig *config, - _PyPathConfig *path_config) +static PyStatus +config_init_module_search_paths(PyConfig *config, _PyPathConfig *pathconfig) { - assert(!config->use_module_search_paths); + assert(!config->module_search_paths_set); - _PyWstrList_Clear(&config->module_search_paths); + _PyWideStringList_Clear(&config->module_search_paths); - const wchar_t *sys_path = path_config->module_search_path; + const wchar_t *sys_path = pathconfig->module_search_path; const wchar_t delim = DELIM; const wchar_t *p = sys_path; while (1) { @@ -264,15 +262,15 @@ core_config_init_module_search_paths(_PyCoreConfig *config, size_t path_len = (p - sys_path); wchar_t *path = PyMem_RawMalloc((path_len + 1) * sizeof(wchar_t)); if (path == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } memcpy(path, sys_path, path_len * sizeof(wchar_t)); path[path_len] = L'\0'; - int res = _PyWstrList_Append(&config->module_search_paths, path); + PyStatus status = PyWideStringList_Append(&config->module_search_paths, path); PyMem_RawFree(path); - if (res < 0) { - return _Py_INIT_NO_MEMORY(); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (*p == '\0') { @@ -280,96 +278,96 @@ core_config_init_module_search_paths(_PyCoreConfig *config, } sys_path = p + 1; } - config->use_module_search_paths = 1; - return _Py_INIT_OK(); + config->module_search_paths_set = 1; + return _PyStatus_OK(); } -static _PyInitError -_PyCoreConfig_CalculatePathConfig(_PyCoreConfig *config) +static PyStatus +config_calculate_pathconfig(PyConfig *config) { - _PyPathConfig path_config = _PyPathConfig_INIT; - _PyInitError err; + _PyPathConfig pathconfig = _PyPathConfig_INIT; + PyStatus status; - err = _PyPathConfig_Calculate(&path_config, config); - if (_Py_INIT_FAILED(err)) { + status = pathconfig_calculate(&pathconfig, config); + if (_PyStatus_EXCEPTION(status)) { goto error; } - if (!config->use_module_search_paths) { - err = core_config_init_module_search_paths(config, &path_config); - if (_Py_INIT_FAILED(err)) { + if (!config->module_search_paths_set) { + status = config_init_module_search_paths(config, &pathconfig); + if (_PyStatus_EXCEPTION(status)) { goto error; } } if (config->executable == NULL) { if (copy_wstr(&config->executable, - path_config.program_full_path) < 0) { + pathconfig.program_full_path) < 0) { goto no_memory; } } if (config->prefix == NULL) { - if (copy_wstr(&config->prefix, path_config.prefix) < 0) { + if (copy_wstr(&config->prefix, pathconfig.prefix) < 0) { goto no_memory; } } if (config->exec_prefix == NULL) { if (copy_wstr(&config->exec_prefix, - path_config.exec_prefix) < 0) { + pathconfig.exec_prefix) < 0) { goto no_memory; } } - if (path_config.isolated != -1) { - config->isolated = path_config.isolated; + if (pathconfig.isolated != -1) { + config->isolated = pathconfig.isolated; } - if (path_config.site_import != -1) { - config->site_import = path_config.site_import; + if (pathconfig.site_import != -1) { + config->site_import = pathconfig.site_import; } - _PyPathConfig_Clear(&path_config); - return _Py_INIT_OK(); + pathconfig_clear(&pathconfig); + return _PyStatus_OK(); no_memory: - err = _Py_INIT_NO_MEMORY(); + status = _PyStatus_NO_MEMORY(); error: - _PyPathConfig_Clear(&path_config); - return err; + pathconfig_clear(&pathconfig); + return status; } -_PyInitError -_PyCoreConfig_InitPathConfig(_PyCoreConfig *config) +PyStatus +_PyConfig_InitPathConfig(PyConfig *config) { /* Do we need to calculate the path? */ - if (!config->use_module_search_paths + if (!config->module_search_paths_set || (config->executable == NULL) || (config->prefix == NULL) || (config->exec_prefix == NULL)) { - _PyInitError err = _PyCoreConfig_CalculatePathConfig(config); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = config_calculate_pathconfig(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } if (config->base_prefix == NULL) { if (copy_wstr(&config->base_prefix, config->prefix) < 0) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } } if (config->base_exec_prefix == NULL) { if (copy_wstr(&config->base_exec_prefix, config->exec_prefix) < 0) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -381,26 +379,26 @@ pathconfig_global_init(void) return; } - _PyInitError err; - _PyCoreConfig config; - _PyCoreConfig_InitCompatConfig(&config); + PyStatus status; + PyConfig config; + _PyConfig_InitCompatConfig(&config); - err = _PyCoreConfig_Read(&config); - if (_Py_INIT_FAILED(err)) { + status = PyConfig_Read(&config); + if (_PyStatus_EXCEPTION(status)) { goto error; } - err = _PyCoreConfig_SetPathConfig(&config); - if (_Py_INIT_FAILED(err)) { + status = _PyConfig_SetPathConfig(&config); + if (_PyStatus_EXCEPTION(status)) { goto error; } - _PyCoreConfig_Clear(&config); + PyConfig_Clear(&config); return; error: - _PyCoreConfig_Clear(&config); - _Py_ExitInitError(err); + PyConfig_Clear(&config); + Py_ExitStatusException(status); } @@ -410,7 +408,7 @@ void Py_SetPath(const wchar_t *path) { if (path == NULL) { - _PyPathConfig_Clear(&_Py_path_config); + pathconfig_clear(&_Py_path_config); return; } @@ -437,7 +435,7 @@ Py_SetPath(const wchar_t *path) new_config.program_name = _Py_path_config.program_name; _Py_path_config.program_name = NULL; - _PyPathConfig_Clear(&_Py_path_config); + pathconfig_clear(&_Py_path_config); _Py_path_config = new_config; PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); @@ -569,9 +567,9 @@ Py_GetProgramName(void) Raise an exception and return -1 on error. */ int -_PyPathConfig_ComputeSysPath0(const _PyWstrList *argv, PyObject **path0_p) +_PyPathConfig_ComputeSysPath0(const PyWideStringList *argv, PyObject **path0_p) { - assert(_PyWstrList_CheckConsistency(argv)); + assert(_PyWideStringList_CheckConsistency(argv)); if (argv->length == 0) { /* Leave sys.path unchanged if sys.argv is empty */ diff --git a/Python/preconfig.c b/Python/preconfig.c index a6d1346eb4e1..8be6533eace0 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_getopt.h" #include "pycore_pystate.h" /* _PyRuntime_Initialize() */ #include /* setlocale() */ @@ -7,8 +7,13 @@ #define DECODE_LOCALE_ERR(NAME, LEN) \ (((LEN) == -2) \ - ? _Py_INIT_ERR("cannot decode " NAME) \ - : _Py_INIT_NO_MEMORY()) + ? _PyStatus_ERR("cannot decode " NAME) \ + : _PyStatus_NO_MEMORY()) + + +/* Forward declarations */ +static void +preconfig_copy(PyPreConfig *config, const PyPreConfig *config2); /* --- File system encoding/errors -------------------------------- */ @@ -67,22 +72,22 @@ _Py_SetFileSystemEncoding(const char *encoding, const char *errors) /* --- _PyArgv ---------------------------------------------------- */ /* Decode bytes_argv using Py_DecodeLocale() */ -_PyInitError -_PyArgv_AsWstrList(const _PyArgv *args, _PyWstrList *list) +PyStatus +_PyArgv_AsWstrList(const _PyArgv *args, PyWideStringList *list) { - _PyWstrList wargv = _PyWstrList_INIT; + PyWideStringList wargv = PyWideStringList_INIT; if (args->use_bytes_argv) { size_t size = sizeof(wchar_t*) * args->argc; wargv.items = (wchar_t **)PyMem_RawMalloc(size); if (wargv.items == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } for (Py_ssize_t i = 0; i < args->argc; i++) { size_t len; wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len); if (arg == NULL) { - _PyWstrList_Clear(&wargv); + _PyWideStringList_Clear(&wargv); return DECODE_LOCALE_ERR("command line arguments", (Py_ssize_t)len); } @@ -90,17 +95,17 @@ _PyArgv_AsWstrList(const _PyArgv *args, _PyWstrList *list) wargv.length++; } - _PyWstrList_Clear(list); + _PyWideStringList_Clear(list); *list = wargv; } else { wargv.length = args->argc; wargv.items = (wchar_t **)args->wchar_argv; - if (_PyWstrList_Copy(list, &wargv) < 0) { - return _Py_INIT_NO_MEMORY(); + if (_PyWideStringList_Copy(list, &wargv) < 0) { + return _PyStatus_NO_MEMORY(); } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -109,12 +114,12 @@ _PyArgv_AsWstrList(const _PyArgv *args, _PyWstrList *list) void _PyPreCmdline_Clear(_PyPreCmdline *cmdline) { - _PyWstrList_Clear(&cmdline->argv); - _PyWstrList_Clear(&cmdline->xoptions); + _PyWideStringList_Clear(&cmdline->argv); + _PyWideStringList_Clear(&cmdline->xoptions); } -_PyInitError +PyStatus _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args) { return _PyArgv_AsWstrList(args, &cmdline->argv); @@ -122,7 +127,7 @@ _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args) static void -_PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config) +precmdline_get_preconfig(_PyPreCmdline *cmdline, const PyPreConfig *config) { #define COPY_ATTR(ATTR) \ if (config->ATTR != -1) { \ @@ -138,7 +143,7 @@ _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config) static void -_PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config) +precmdline_set_preconfig(const _PyPreCmdline *cmdline, PyPreConfig *config) { #define COPY_ATTR(ATTR) \ config->ATTR = cmdline->ATTR @@ -151,33 +156,34 @@ _PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config) } -int -_PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config) +PyStatus +_PyPreCmdline_SetConfig(const _PyPreCmdline *cmdline, PyConfig *config) { #define COPY_ATTR(ATTR) \ config->ATTR = cmdline->ATTR - if (_PyWstrList_Extend(&config->xoptions, &cmdline->xoptions) < 0) { - return -1; + PyStatus status = _PyWideStringList_Extend(&config->xoptions, &cmdline->xoptions); + if (_PyStatus_EXCEPTION(status)) { + return status; } COPY_ATTR(isolated); COPY_ATTR(use_environment); COPY_ATTR(dev_mode); - return 0; + return _PyStatus_OK(); #undef COPY_ATTR } /* Parse the command line arguments */ -static _PyInitError +static PyStatus precmdline_parse_cmdline(_PyPreCmdline *cmdline) { - const _PyWstrList *argv = &cmdline->argv; + const PyWideStringList *argv = &cmdline->argv; _PyOS_ResetGetOpt(); - /* Don't log parsing errors into stderr here: _PyCoreConfig_Read() + /* Don't log parsing errors into stderr here: PyConfig_Read() is responsible for that */ _PyOS_opterr = 0; do { @@ -199,32 +205,34 @@ precmdline_parse_cmdline(_PyPreCmdline *cmdline) case 'X': { - if (_PyWstrList_Append(&cmdline->xoptions, _PyOS_optarg) < 0) { - return _Py_INIT_NO_MEMORY(); + PyStatus status = PyWideStringList_Append(&cmdline->xoptions, + _PyOS_optarg); + if (_PyStatus_EXCEPTION(status)) { + return status; } break; } default: /* ignore other argument: - handled by _PyCoreConfig_Read() */ + handled by PyConfig_Read() */ break; } } while (1); - return _Py_INIT_OK(); + return _PyStatus_OK(); } -_PyInitError -_PyPreCmdline_Read(_PyPreCmdline *cmdline, const _PyPreConfig *preconfig) +PyStatus +_PyPreCmdline_Read(_PyPreCmdline *cmdline, const PyPreConfig *preconfig) { - _PyPreCmdline_GetPreConfig(cmdline, preconfig); + precmdline_get_preconfig(cmdline, preconfig); if (preconfig->parse_argv) { - _PyInitError err = precmdline_parse_cmdline(cmdline); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = precmdline_parse_cmdline(cmdline); + if (_PyStatus_EXCEPTION(status)) { + return status; } } @@ -254,15 +262,15 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline, const _PyPreConfig *preconfig) assert(cmdline->isolated >= 0); assert(cmdline->dev_mode >= 0); - return _Py_INIT_OK(); + return _PyStatus_OK(); } -/* --- _PyPreConfig ----------------------------------------------- */ +/* --- PyPreConfig ----------------------------------------------- */ void -_PyPreConfig_InitCompatConfig(_PyPreConfig *config) +_PyPreConfig_InitCompatConfig(PyPreConfig *config) { memset(config, 0, sizeof(*config)); @@ -291,7 +299,7 @@ _PyPreConfig_InitCompatConfig(_PyPreConfig *config) void -_PyPreConfig_InitPythonConfig(_PyPreConfig *config) +PyPreConfig_InitPythonConfig(PyPreConfig *config) { _PyPreConfig_InitCompatConfig(config); @@ -312,7 +320,7 @@ _PyPreConfig_InitPythonConfig(_PyPreConfig *config) void -_PyPreConfig_InitIsolatedConfig(_PyPreConfig *config) +PyPreConfig_InitIsolatedConfig(PyPreConfig *config) { _PyPreConfig_InitCompatConfig(config); @@ -329,37 +337,37 @@ _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config) void -_PyPreConfig_InitFromPreConfig(_PyPreConfig *config, - const _PyPreConfig *config2) +_PyPreConfig_InitFromPreConfig(PyPreConfig *config, + const PyPreConfig *config2) { - _PyPreConfig_InitCompatConfig(config); - _PyPreConfig_Copy(config, config2); + PyPreConfig_InitPythonConfig(config); + preconfig_copy(config, config2); } void -_PyPreConfig_InitFromCoreConfig(_PyPreConfig *config, - const _PyCoreConfig *coreconfig) +_PyPreConfig_InitFromConfig(PyPreConfig *preconfig, const PyConfig *config) { - _PyConfigInitEnum config_init = (_PyConfigInitEnum)coreconfig->_config_init; + _PyConfigInitEnum config_init = (_PyConfigInitEnum)config->_config_init; switch (config_init) { case _PyConfig_INIT_PYTHON: - _PyPreConfig_InitPythonConfig(config); + PyPreConfig_InitPythonConfig(preconfig); break; case _PyConfig_INIT_ISOLATED: - _PyPreConfig_InitIsolatedConfig(config); + PyPreConfig_InitIsolatedConfig(preconfig); break; case _PyConfig_INIT_COMPAT: default: - _PyPreConfig_InitCompatConfig(config); + _PyPreConfig_InitCompatConfig(preconfig); } - _PyPreConfig_GetCoreConfig(config, coreconfig); + _PyPreConfig_GetConfig(preconfig, config); } -void -_PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) +static void +preconfig_copy(PyPreConfig *config, const PyPreConfig *config2) { + assert(config2->_config_version == _Py_CONFIG_VERSION); #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR COPY_ATTR(_config_init); @@ -381,7 +389,7 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) PyObject* -_PyPreConfig_AsDict(const _PyPreConfig *config) +_PyPreConfig_AsDict(const PyPreConfig *config) { PyObject *dict; @@ -427,12 +435,11 @@ _PyPreConfig_AsDict(const _PyPreConfig *config) void -_PyPreConfig_GetCoreConfig(_PyPreConfig *config, - const _PyCoreConfig *core_config) +_PyPreConfig_GetConfig(PyPreConfig *preconfig, const PyConfig *config) { #define COPY_ATTR(ATTR) \ - if (core_config->ATTR != -1) { \ - config->ATTR = core_config->ATTR; \ + if (config->ATTR != -1) { \ + preconfig->ATTR = config->ATTR; \ } COPY_ATTR(parse_argv); @@ -445,7 +452,7 @@ _PyPreConfig_GetCoreConfig(_PyPreConfig *config, static void -_PyPreConfig_GetGlobalConfig(_PyPreConfig *config) +preconfig_get_global_vars(PyPreConfig *config) { if (config->_config_init != _PyConfig_INIT_COMPAT) { /* Python and Isolated configuration ignore global variables */ @@ -476,7 +483,7 @@ _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) static void -_PyPreConfig_SetGlobalConfig(const _PyPreConfig *config) +preconfig_set_global_vars(const PyPreConfig *config) { #define COPY_FLAG(ATTR, VAR) \ if (config->ATTR >= 0) { \ @@ -555,7 +562,7 @@ _Py_get_env_flag(int use_environment, int *flag, const char *name) const wchar_t* -_Py_get_xoption(const _PyWstrList *xoptions, const wchar_t *name) +_Py_get_xoption(const PyWideStringList *xoptions, const wchar_t *name) { for (Py_ssize_t i=0; i < xoptions->length; i++) { const wchar_t *option = xoptions->items[i]; @@ -575,8 +582,8 @@ _Py_get_xoption(const _PyWstrList *xoptions, const wchar_t *name) } -static _PyInitError -preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) +static PyStatus +preconfig_init_utf8_mode(PyPreConfig *config, const _PyPreCmdline *cmdline) { #ifdef MS_WINDOWS if (config->legacy_windows_fs_encoding) { @@ -585,7 +592,7 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) #endif if (config->utf8_mode >= 0) { - return _Py_INIT_OK(); + return _PyStatus_OK(); } const wchar_t *xopt; @@ -601,13 +608,13 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) config->utf8_mode = 0; } else { - return _Py_INIT_ERR("invalid -X utf8 option value"); + return _PyStatus_ERR("invalid -X utf8 option value"); } } else { config->utf8_mode = 1; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } const char *opt = _Py_GetEnv(config->use_environment, "PYTHONUTF8"); @@ -619,10 +626,10 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) config->utf8_mode = 0; } else { - return _Py_INIT_ERR("invalid PYTHONUTF8 environment " + return _PyStatus_ERR("invalid PYTHONUTF8 environment " "variable value"); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -642,12 +649,12 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) if (config->utf8_mode < 0) { config->utf8_mode = 0; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } static void -preconfig_init_coerce_c_locale(_PyPreConfig *config) +preconfig_init_coerce_c_locale(PyPreConfig *config) { if (!config->configure_locale) { config->coerce_c_locale = 0; @@ -693,8 +700,8 @@ preconfig_init_coerce_c_locale(_PyPreConfig *config) } -static _PyInitError -preconfig_init_allocator(_PyPreConfig *config) +static PyStatus +preconfig_init_allocator(PyPreConfig *config) { if (config->allocator == PYMEM_ALLOCATOR_NOT_SET) { /* bpo-34247. The PYTHONMALLOC environment variable has the priority @@ -705,7 +712,7 @@ preconfig_init_allocator(_PyPreConfig *config) if (envvar) { PyMemAllocatorName name; if (_PyMem_GetAllocatorName(envvar, &name) < 0) { - return _Py_INIT_ERR("PYTHONMALLOC: unknown allocator"); + return _PyStatus_ERR("PYTHONMALLOC: unknown allocator"); } config->allocator = (int)name; } @@ -714,21 +721,21 @@ preconfig_init_allocator(_PyPreConfig *config) if (config->dev_mode && config->allocator == PYMEM_ALLOCATOR_NOT_SET) { config->allocator = PYMEM_ALLOCATOR_DEBUG; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) +static PyStatus +preconfig_read(PyPreConfig *config, _PyPreCmdline *cmdline) { - _PyInitError err; + PyStatus status; - err = _PyPreCmdline_Read(cmdline, config); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyPreCmdline_Read(cmdline, config); + if (_PyStatus_EXCEPTION(status)) { + return status; } - _PyPreCmdline_SetPreConfig(cmdline, config); + precmdline_set_preconfig(cmdline, config); /* legacy_windows_fs_encoding, coerce_c_locale, utf8_mode */ #ifdef MS_WINDOWS @@ -739,15 +746,15 @@ preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) preconfig_init_coerce_c_locale(config); - err = preconfig_init_utf8_mode(config, cmdline); - if (_Py_INIT_FAILED(err)) { - return err; + status = preconfig_init_utf8_mode(config, cmdline); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* allocator */ - err = preconfig_init_allocator(config); - if (_Py_INIT_FAILED(err)) { - return err; + status = preconfig_init_allocator(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } assert(config->coerce_c_locale >= 0); @@ -760,7 +767,7 @@ preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) assert(config->use_environment >= 0); assert(config->dev_mode >= 0); - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -770,30 +777,30 @@ preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) - environment variables - Py_xxx global configuration variables - the LC_CTYPE locale */ -_PyInitError -_PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) +PyStatus +_PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args) { - _PyInitError err; + PyStatus status; - err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyRuntime_Initialize(); + if (_PyStatus_EXCEPTION(status)) { + return status; } - _PyPreConfig_GetGlobalConfig(config); + preconfig_get_global_vars(config); /* Copy LC_CTYPE locale, since it's modified later */ const char *loc = setlocale(LC_CTYPE, NULL); if (loc == NULL) { - return _Py_INIT_ERR("failed to LC_CTYPE locale"); + return _PyStatus_ERR("failed to LC_CTYPE locale"); } char *init_ctype_locale = _PyMem_RawStrdup(loc); if (init_ctype_locale == NULL) { - return _Py_INIT_NO_MEMORY(); + return _PyStatus_NO_MEMORY(); } /* Save the config to be able to restore it if encodings change */ - _PyPreConfig save_config; + PyPreConfig save_config; _PyPreConfig_InitFromPreConfig(&save_config, config); /* Set LC_CTYPE to the user preferred locale */ @@ -808,8 +815,8 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) #endif if (args) { - err = _PyPreCmdline_SetArgv(&cmdline, args); - if (_Py_INIT_FAILED(err)) { + status = _PyPreCmdline_SetArgv(&cmdline, args); + if (_PyStatus_EXCEPTION(status)) { goto done; } } @@ -823,7 +830,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) /* Watchdog to prevent an infinite loop */ loops++; if (loops == 3) { - err = _Py_INIT_ERR("Encoding changed twice while " + status = _PyStatus_ERR("Encoding changed twice while " "reading the configuration"); goto done; } @@ -835,8 +842,8 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; #endif - err = preconfig_read(config, &cmdline); - if (_Py_INIT_FAILED(err)) { + status = preconfig_read(config, &cmdline); + if (_PyStatus_EXCEPTION(status)) { goto done; } @@ -877,14 +884,14 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) just keep UTF-8 Mode value. */ int new_utf8_mode = config->utf8_mode; int new_coerce_c_locale = config->coerce_c_locale; - _PyPreConfig_Copy(config, &save_config); + preconfig_copy(config, &save_config); config->utf8_mode = new_utf8_mode; config->coerce_c_locale = new_coerce_c_locale; /* The encoding changed: read again the configuration with the new encoding */ } - err = _Py_INIT_OK(); + status = _PyStatus_OK(); done: if (init_ctype_locale != NULL) { @@ -896,7 +903,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; #endif _PyPreCmdline_Clear(&cmdline); - return err; + return status; } @@ -912,26 +919,26 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) Do nothing if called after Py_Initialize(): ignore the new pre-configuration. */ -_PyInitError -_PyPreConfig_Write(const _PyPreConfig *src_config) +PyStatus +_PyPreConfig_Write(const PyPreConfig *src_config) { - _PyPreConfig config; + PyPreConfig config; _PyPreConfig_InitFromPreConfig(&config, src_config); if (_PyRuntime.core_initialized) { /* bpo-34008: Calling this functions after Py_Initialize() ignores the new configuration. */ - return _Py_INIT_OK(); + return _PyStatus_OK(); } PyMemAllocatorName name = (PyMemAllocatorName)config.allocator; if (name != PYMEM_ALLOCATOR_NOT_SET) { if (_PyMem_SetupAllocators(name) < 0) { - return _Py_INIT_ERR("Unknown PYTHONMALLOC allocator"); + return _PyStatus_ERR("Unknown PYTHONMALLOC allocator"); } } - _PyPreConfig_SetGlobalConfig(&config); + preconfig_set_global_vars(&config); if (config.configure_locale) { if (config.coerce_c_locale) { @@ -946,7 +953,7 @@ _PyPreConfig_Write(const _PyPreConfig *src_config) } /* Write the new pre-configuration into _PyRuntime */ - _PyPreConfig_Copy(&_PyRuntime.preconfig, &config); + preconfig_copy(&_PyRuntime.preconfig, &config); - return _Py_INIT_OK(); + return _PyStatus_OK(); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 9880c0d624d5..10a28813faa8 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -6,7 +6,7 @@ #undef Yield /* undefine macro conflicting with */ #include "pycore_ceval.h" #include "pycore_context.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_fileutils.h" #include "pycore_hamt.h" #include "pycore_pathconfig.h" @@ -60,10 +60,10 @@ extern "C" { extern grammar _PyParser_Grammar; /* From graminit.c */ /* Forward */ -static _PyInitError add_main_module(PyInterpreterState *interp); -static _PyInitError init_import_size(void); -static _PyInitError init_sys_streams(PyInterpreterState *interp); -static _PyInitError init_signals(void); +static PyStatus add_main_module(PyInterpreterState *interp); +static PyStatus init_import_size(void); +static PyStatus init_sys_streams(PyInterpreterState *interp); +static PyStatus init_signals(void); static void call_py_exitfuncs(PyInterpreterState *); static void wait_for_thread_shutdown(void); static void call_ll_exitfuncs(_PyRuntimeState *runtime); @@ -72,7 +72,7 @@ int _Py_UnhandledKeyboardInterrupt = 0; _PyRuntimeState _PyRuntime = _PyRuntimeState_INIT; static int runtime_initialized = 0; -_PyInitError +PyStatus _PyRuntime_Initialize(void) { /* XXX We only initialize once in the process, which aligns with @@ -82,7 +82,7 @@ _PyRuntime_Initialize(void) This is because the runtime state is not properly finalized currently. */ if (runtime_initialized) { - return _Py_INIT_OK(); + return _PyStatus_OK(); } runtime_initialized = 1; @@ -145,58 +145,58 @@ Py_IsInitialized(void) */ -static _PyInitError +static PyStatus init_importlib(PyInterpreterState *interp, PyObject *sysmod) { PyObject *importlib; PyObject *impmod; PyObject *value; - int verbose = interp->core_config.verbose; + int verbose = interp->config.verbose; /* Import _importlib through its frozen version, _frozen_importlib. */ if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) { - return _Py_INIT_ERR("can't import _frozen_importlib"); + return _PyStatus_ERR("can't import _frozen_importlib"); } else if (verbose) { PySys_FormatStderr("import _frozen_importlib # frozen\n"); } importlib = PyImport_AddModule("_frozen_importlib"); if (importlib == NULL) { - return _Py_INIT_ERR("couldn't get _frozen_importlib from sys.modules"); + return _PyStatus_ERR("couldn't get _frozen_importlib from sys.modules"); } interp->importlib = importlib; Py_INCREF(interp->importlib); interp->import_func = PyDict_GetItemString(interp->builtins, "__import__"); if (interp->import_func == NULL) - return _Py_INIT_ERR("__import__ not found"); + return _PyStatus_ERR("__import__ not found"); Py_INCREF(interp->import_func); /* Import the _imp module */ impmod = PyInit__imp(); if (impmod == NULL) { - return _Py_INIT_ERR("can't import _imp"); + return _PyStatus_ERR("can't import _imp"); } else if (verbose) { PySys_FormatStderr("import _imp # builtin\n"); } if (_PyImport_SetModuleString("_imp", impmod) < 0) { - return _Py_INIT_ERR("can't save _imp to sys.modules"); + return _PyStatus_ERR("can't save _imp to sys.modules"); } /* Install importlib as the implementation of import */ value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod); if (value == NULL) { PyErr_Print(); - return _Py_INIT_ERR("importlib install failed"); + return _PyStatus_ERR("importlib install failed"); } Py_DECREF(value); Py_DECREF(impmod); - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus init_importlib_external(PyInterpreterState *interp) { PyObject *value; @@ -204,7 +204,7 @@ init_importlib_external(PyInterpreterState *interp) "_install_external_importers", ""); if (value == NULL) { PyErr_Print(); - return _Py_INIT_ERR("external importer setup failed"); + return _PyStatus_ERR("external importer setup failed"); } Py_DECREF(value); return _PyImportZip_Init(interp); @@ -265,7 +265,7 @@ static const char *_C_LOCALE_WARNING = static void emit_stderr_warning_for_legacy_locale(_PyRuntimeState *runtime) { - const _PyPreConfig *preconfig = &runtime->preconfig; + const PyPreConfig *preconfig = &runtime->preconfig; if (preconfig->coerce_c_locale_warn && _Py_LegacyLocaleDetected(1)) { PySys_FormatStderr("%s", _C_LOCALE_WARNING); } @@ -437,7 +437,7 @@ _Py_SetLocaleFromEnv(int category) /* Global initializations. Can be undone by Py_Finalize(). Don't call this twice without an intervening Py_Finalize() call. - Every call to _Py_InitializeFromConfig, Py_Initialize or Py_InitializeEx + Every call to Py_InitializeFromConfig, Py_Initialize or Py_InitializeEx must have a corresponding call to Py_Finalize. Locking: you must hold the interpreter lock while calling these APIs. @@ -446,50 +446,50 @@ _Py_SetLocaleFromEnv(int category) */ -static _PyInitError +static PyStatus pyinit_core_reconfigure(_PyRuntimeState *runtime, PyInterpreterState **interp_p, - const _PyCoreConfig *core_config) + const PyConfig *config) { - _PyInitError err; + PyStatus status; PyThreadState *tstate = _PyThreadState_GET(); if (!tstate) { - return _Py_INIT_ERR("failed to read thread state"); + return _PyStatus_ERR("failed to read thread state"); } PyInterpreterState *interp = tstate->interp; if (interp == NULL) { - return _Py_INIT_ERR("can't make main interpreter"); + return _PyStatus_ERR("can't make main interpreter"); } *interp_p = interp; - _PyCoreConfig_Write(core_config, runtime); + _PyConfig_Write(config, runtime); - err = _PyCoreConfig_Copy(&interp->core_config, core_config); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyConfig_Copy(&interp->config, config); + if (_PyStatus_EXCEPTION(status)) { + return status; } - core_config = &interp->core_config; + config = &interp->config; - if (core_config->_install_importlib) { - err = _PyCoreConfig_SetPathConfig(core_config); - if (_Py_INIT_FAILED(err)) { - return err; + if (config->_install_importlib) { + status = _PyConfig_SetPathConfig(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus pycore_init_runtime(_PyRuntimeState *runtime, - const _PyCoreConfig *core_config) + const PyConfig *config) { if (runtime->initialized) { - return _Py_INIT_ERR("main interpreter already initialized"); + return _PyStatus_ERR("main interpreter already initialized"); } - _PyCoreConfig_Write(core_config, runtime); + _PyConfig_Write(config, runtime); /* Py_Finalize leaves _Py_Finalizing set in order to help daemon * threads behave a little more gracefully at interpreter shutdown. @@ -502,39 +502,39 @@ pycore_init_runtime(_PyRuntimeState *runtime, */ runtime->finalizing = NULL; - _PyInitError err = _Py_HashRandomization_Init(core_config); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _Py_HashRandomization_Init(config); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PyInterpreterState_Enable(runtime); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyInterpreterState_Enable(runtime); + if (_PyStatus_EXCEPTION(status)) { + return status; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus pycore_create_interpreter(_PyRuntimeState *runtime, - const _PyCoreConfig *core_config, + const PyConfig *config, PyInterpreterState **interp_p) { PyInterpreterState *interp = PyInterpreterState_New(); if (interp == NULL) { - return _Py_INIT_ERR("can't make main interpreter"); + return _PyStatus_ERR("can't make main interpreter"); } *interp_p = interp; - _PyInitError err = _PyCoreConfig_Copy(&interp->core_config, core_config); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _PyConfig_Copy(&interp->config, config); + if (_PyStatus_EXCEPTION(status)) { + return status; } - core_config = &interp->core_config; + config = &interp->config; PyThreadState *tstate = PyThreadState_New(interp); if (tstate == NULL) - return _Py_INIT_ERR("can't make first thread"); + return _PyStatus_ERR("can't make first thread"); (void) PyThreadState_Swap(tstate); /* We can't call _PyEval_FiniThreads() in Py_FinalizeEx because @@ -550,249 +550,249 @@ pycore_create_interpreter(_PyRuntimeState *runtime, /* Create the GIL */ PyEval_InitThreads(); - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus pycore_init_types(void) { - _PyInitError err = _PyTypes_Init(); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _PyTypes_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PyUnicode_Init(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyUnicode_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (_PyStructSequence_Init() < 0) { - return _Py_INIT_ERR("can't initialize structseq"); + return _PyStatus_ERR("can't initialize structseq"); } if (!_PyLong_Init()) { - return _Py_INIT_ERR("can't init longs"); + return _PyStatus_ERR("can't init longs"); } - err = _PyExc_Init(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyExc_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; } if (!_PyFloat_Init()) { - return _Py_INIT_ERR("can't init float"); + return _PyStatus_ERR("can't init float"); } if (!_PyContext_Init()) { - return _Py_INIT_ERR("can't init context"); + return _PyStatus_ERR("can't init context"); } - err = _PyErr_Init(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyErr_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus pycore_init_builtins(PyInterpreterState *interp) { PyObject *bimod = _PyBuiltin_Init(); if (bimod == NULL) { - return _Py_INIT_ERR("can't initialize builtins modules"); + return _PyStatus_ERR("can't initialize builtins modules"); } _PyImport_FixupBuiltin(bimod, "builtins", interp->modules); interp->builtins = PyModule_GetDict(bimod); if (interp->builtins == NULL) { - return _Py_INIT_ERR("can't initialize builtins dict"); + return _PyStatus_ERR("can't initialize builtins dict"); } Py_INCREF(interp->builtins); - _PyInitError err = _PyBuiltins_AddExceptions(bimod); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _PyBuiltins_AddExceptions(bimod); + if (_PyStatus_EXCEPTION(status)) { + return status; } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError +static PyStatus pycore_init_import_warnings(PyInterpreterState *interp, PyObject *sysmod) { - _PyInitError err = _PyImport_Init(interp); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _PyImport_Init(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PyImportHooks_Init(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyImportHooks_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* Initialize _warnings. */ if (_PyWarnings_Init() == NULL) { - return _Py_INIT_ERR("can't initialize warnings"); + return _PyStatus_ERR("can't initialize warnings"); } - if (interp->core_config._install_importlib) { - err = _PyCoreConfig_SetPathConfig(&interp->core_config); - if (_Py_INIT_FAILED(err)) { - return err; + if (interp->config._install_importlib) { + status = _PyConfig_SetPathConfig(&interp->config); + if (_PyStatus_EXCEPTION(status)) { + return status; } } /* This call sets up builtin and frozen import support */ - if (interp->core_config._install_importlib) { - err = init_importlib(interp, sysmod); - if (_Py_INIT_FAILED(err)) { - return err; + if (interp->config._install_importlib) { + status = init_importlib(interp, sysmod); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } -static _PyInitError -pyinit_core_config(_PyRuntimeState *runtime, - PyInterpreterState **interp_p, - const _PyCoreConfig *core_config) +static PyStatus +pyinit_config(_PyRuntimeState *runtime, + PyInterpreterState **interp_p, + const PyConfig *config) { PyInterpreterState *interp; - _PyCoreConfig_Write(core_config, runtime); + _PyConfig_Write(config, runtime); - _PyInitError err = pycore_init_runtime(runtime, core_config); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = pycore_init_runtime(runtime, config); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = pycore_create_interpreter(runtime, core_config, &interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = pycore_create_interpreter(runtime, config, &interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - core_config = &interp->core_config; + config = &interp->config; *interp_p = interp; - err = pycore_init_types(); - if (_Py_INIT_FAILED(err)) { - return err; + status = pycore_init_types(); + if (_PyStatus_EXCEPTION(status)) { + return status; } PyObject *sysmod; - err = _PySys_Create(runtime, interp, &sysmod); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PySys_Create(runtime, interp, &sysmod); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = pycore_init_builtins(interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = pycore_init_builtins(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = pycore_init_import_warnings(interp, sysmod); - if (_Py_INIT_FAILED(err)) { - return err; + status = pycore_init_import_warnings(interp, sysmod); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* Only when we get here is the runtime core fully initialized */ runtime->core_initialized = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } -_PyInitError -_Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args) +PyStatus +_Py_PreInitializeFromPyArgv(const PyPreConfig *src_config, const _PyArgv *args) { - _PyInitError err; + PyStatus status; if (src_config == NULL) { - return _Py_INIT_ERR("preinitialization config is NULL"); + return _PyStatus_ERR("preinitialization config is NULL"); } - err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyRuntime_Initialize(); + if (_PyStatus_EXCEPTION(status)) { + return status; } _PyRuntimeState *runtime = &_PyRuntime; if (runtime->pre_initialized) { /* If it's already configured: ignored the new configuration */ - return _Py_INIT_OK(); + return _PyStatus_OK(); } - _PyPreConfig config; + PyPreConfig config; _PyPreConfig_InitFromPreConfig(&config, src_config); - err = _PyPreConfig_Read(&config, args); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyPreConfig_Read(&config, args); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PyPreConfig_Write(&config); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyPreConfig_Write(&config); + if (_PyStatus_EXCEPTION(status)) { + return status; } runtime->pre_initialized = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } -_PyInitError -_Py_PreInitializeFromArgs(const _PyPreConfig *src_config, Py_ssize_t argc, char **argv) +PyStatus +Py_PreInitializeFromBytesArgs(const PyPreConfig *src_config, Py_ssize_t argc, char **argv) { _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv}; return _Py_PreInitializeFromPyArgv(src_config, &args); } -_PyInitError -_Py_PreInitializeFromWideArgs(const _PyPreConfig *src_config, Py_ssize_t argc, wchar_t **argv) +PyStatus +Py_PreInitializeFromArgs(const PyPreConfig *src_config, Py_ssize_t argc, wchar_t **argv) { _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv}; return _Py_PreInitializeFromPyArgv(src_config, &args); } -_PyInitError -_Py_PreInitialize(const _PyPreConfig *src_config) +PyStatus +Py_PreInitialize(const PyPreConfig *src_config) { return _Py_PreInitializeFromPyArgv(src_config, NULL); } -_PyInitError -_Py_PreInitializeFromCoreConfig(const _PyCoreConfig *coreconfig, - const _PyArgv *args) +PyStatus +_Py_PreInitializeFromConfig(const PyConfig *config, + const _PyArgv *args) { - assert(coreconfig != NULL); + assert(config != NULL); - _PyInitError err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _PyRuntime_Initialize(); + if (_PyStatus_EXCEPTION(status)) { + return status; } _PyRuntimeState *runtime = &_PyRuntime; if (runtime->pre_initialized) { /* Already initialized: do nothing */ - return _Py_INIT_OK(); + return _PyStatus_OK(); } - _PyPreConfig preconfig; - _PyPreConfig_InitFromCoreConfig(&preconfig, coreconfig); + PyPreConfig preconfig; + _PyPreConfig_InitFromConfig(&preconfig, config); - if (!coreconfig->parse_argv) { - return _Py_PreInitialize(&preconfig); + if (!config->parse_argv) { + return Py_PreInitialize(&preconfig); } else if (args == NULL) { _PyArgv config_args = { .use_bytes_argv = 0, - .argc = coreconfig->argv.length, - .wchar_argv = coreconfig->argv.items}; + .argc = config->argv.length, + .wchar_argv = config->argv.items}; return _Py_PreInitializeFromPyArgv(&preconfig, &config_args); } else { @@ -818,74 +818,66 @@ _Py_PreInitializeFromCoreConfig(const _PyCoreConfig *coreconfig, * to the Python C API (unless the API is explicitly listed as being * safe to call without calling Py_Initialize first) */ -static _PyInitError +static PyStatus pyinit_core(_PyRuntimeState *runtime, - const _PyCoreConfig *src_config, - const _PyArgv *args, + const PyConfig *src_config, PyInterpreterState **interp_p) { - _PyInitError err; + PyStatus status; - err = _Py_PreInitializeFromCoreConfig(src_config, args); - if (_Py_INIT_FAILED(err)) { - return err; + status = _Py_PreInitializeFromConfig(src_config, NULL); + if (_PyStatus_EXCEPTION(status)) { + return status; } - _PyCoreConfig config; - _PyCoreConfig_InitCompatConfig(&config); + PyConfig config; + _PyConfig_InitCompatConfig(&config); - err = _PyCoreConfig_Copy(&config, src_config); - if (_Py_INIT_FAILED(err)) { + status = _PyConfig_Copy(&config, src_config); + if (_PyStatus_EXCEPTION(status)) { goto done; } - if (args) { - err = _PyCoreConfig_SetPyArgv(&config, args); - if (_Py_INIT_FAILED(err)) { - goto done; - } - } - - err = _PyCoreConfig_Read(&config); - if (_Py_INIT_FAILED(err)) { + status = PyConfig_Read(&config); + if (_PyStatus_EXCEPTION(status)) { goto done; } if (!runtime->core_initialized) { - err = pyinit_core_config(runtime, interp_p, &config); + status = pyinit_config(runtime, interp_p, &config); } else { - err = pyinit_core_reconfigure(runtime, interp_p, &config); + status = pyinit_core_reconfigure(runtime, interp_p, &config); } - if (_Py_INIT_FAILED(err)) { + if (_PyStatus_EXCEPTION(status)) { goto done; } done: - _PyCoreConfig_Clear(&config); - return err; + PyConfig_Clear(&config); + return status; } /* Py_Initialize() has already been called: update the main interpreter configuration. Example of bpo-34008: Py_Main() called after Py_Initialize(). */ -static _PyInitError +static PyStatus _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) { - _PyCoreConfig *core_config = &interp->core_config; + PyConfig *config = &interp->config; - PyObject *argv = _PyWstrList_AsList(&core_config->argv); + PyObject *argv = _PyWideStringList_AsList(&config->argv); if (argv == NULL) { - return _Py_INIT_NO_MEMORY(); \ + return _PyStatus_NO_MEMORY(); \ } int res = PyDict_SetItemString(interp->sysdict, "argv", argv); Py_DECREF(argv); if (res < 0) { - return _Py_INIT_ERR("fail to set sys.argv"); + return _PyStatus_ERR("fail to set sys.argv"); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Update interpreter state based on supplied configuration settings @@ -899,73 +891,73 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) * Other errors should be reported as normal Python exceptions with a * non-zero return code. */ -static _PyInitError +static PyStatus pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) { if (!runtime->core_initialized) { - return _Py_INIT_ERR("runtime core not initialized"); + return _PyStatus_ERR("runtime core not initialized"); } /* Configure the main interpreter */ - _PyCoreConfig *core_config = &interp->core_config; + PyConfig *config = &interp->config; if (runtime->initialized) { return _Py_ReconfigureMainInterpreter(interp); } - if (!core_config->_install_importlib) { + if (!config->_install_importlib) { /* Special mode for freeze_importlib: run with no import system * * This means anything which needs support from extension modules * or pure Python code in the standard library won't work. */ runtime->initialized = 1; - return _Py_INIT_OK(); + return _PyStatus_OK(); } if (_PyTime_Init() < 0) { - return _Py_INIT_ERR("can't initialize time"); + return _PyStatus_ERR("can't initialize time"); } if (_PySys_InitMain(runtime, interp) < 0) { - return _Py_INIT_ERR("can't finish initializing sys"); + return _PyStatus_ERR("can't finish initializing sys"); } - _PyInitError err = init_importlib_external(interp); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = init_importlib_external(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* initialize the faulthandler module */ - err = _PyFaulthandler_Init(core_config->faulthandler); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyFaulthandler_Init(config->faulthandler); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PyUnicode_InitEncodings(interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyUnicode_InitEncodings(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - if (core_config->install_signal_handlers) { - err = init_signals(); - if (_Py_INIT_FAILED(err)) { - return err; + if (config->install_signal_handlers) { + status = init_signals(); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - if (_PyTraceMalloc_Init(core_config->tracemalloc) < 0) { - return _Py_INIT_ERR("can't initialize tracemalloc"); + if (_PyTraceMalloc_Init(config->tracemalloc) < 0) { + return _PyStatus_ERR("can't initialize tracemalloc"); } - err = add_main_module(interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = add_main_module(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = init_sys_streams(interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = init_sys_streams(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* Initialize warnings. */ @@ -982,10 +974,10 @@ pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) runtime->initialized = 1; - if (core_config->site_import) { - err = init_import_size(); /* Module site */ - if (_Py_INIT_FAILED(err)) { - return err; + if (config->site_import) { + status = init_import_size(); /* Module site */ + if (_PyStatus_EXCEPTION(status)) { + return status; } } @@ -993,16 +985,16 @@ pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) emit_stderr_warning_for_legacy_locale(runtime); #endif - return _Py_INIT_OK(); + return _PyStatus_OK(); } -_PyInitError +PyStatus _Py_InitializeMain(void) { - _PyInitError err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _PyRuntime_Initialize(); + if (_PyStatus_EXCEPTION(status)) { + return status; } _PyRuntimeState *runtime = &_PyRuntime; PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; @@ -1011,74 +1003,47 @@ _Py_InitializeMain(void) } -#undef _INIT_DEBUG_PRINT - -static _PyInitError -pyinit_python(const _PyCoreConfig *config, const _PyArgv *args) +PyStatus +Py_InitializeFromConfig(const PyConfig *config) { if (config == NULL) { - return _Py_INIT_ERR("initialization config is NULL"); + return _PyStatus_ERR("initialization config is NULL"); } - _PyInitError err; + PyStatus status; - err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyRuntime_Initialize(); + if (_PyStatus_EXCEPTION(status)) { + return status; } _PyRuntimeState *runtime = &_PyRuntime; PyInterpreterState *interp = NULL; - err = pyinit_core(runtime, config, args, &interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = pyinit_core(runtime, config, &interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - config = &interp->core_config; + config = &interp->config; if (config->_init_main) { - err = pyinit_main(runtime, interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = pyinit_main(runtime, interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } } - return _Py_INIT_OK(); -} - - -_PyInitError -_Py_InitializeFromArgs(const _PyCoreConfig *config, - Py_ssize_t argc, char * const *argv) -{ - _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv}; - return pyinit_python(config, &args); -} - - -_PyInitError -_Py_InitializeFromWideArgs(const _PyCoreConfig *config, - Py_ssize_t argc, wchar_t * const *argv) -{ - _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv}; - return pyinit_python(config, &args); -} - - -_PyInitError -_Py_InitializeFromConfig(const _PyCoreConfig *config) -{ - return pyinit_python(config, NULL); + return _PyStatus_OK(); } void Py_InitializeEx(int install_sigs) { - _PyInitError err; + PyStatus status; - err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - _Py_ExitInitError(err); + status = _PyRuntime_Initialize(); + if (_PyStatus_EXCEPTION(status)) { + Py_ExitStatusException(status); } _PyRuntimeState *runtime = &_PyRuntime; @@ -1087,13 +1052,13 @@ Py_InitializeEx(int install_sigs) return; } - _PyCoreConfig config; - _PyCoreConfig_InitCompatConfig(&config); + PyConfig config; + _PyConfig_InitCompatConfig(&config); config.install_signal_handlers = install_sigs; - err = _Py_InitializeFromConfig(&config); - if (_Py_INIT_FAILED(err)) { - _Py_ExitInitError(err); + status = Py_InitializeFromConfig(&config); + if (_PyStatus_EXCEPTION(status)) { + Py_ExitStatusException(status); } } @@ -1206,13 +1171,13 @@ Py_FinalizeEx(void) /* Copy the core config, PyInterpreterState_Delete() free the core config memory */ #ifdef Py_REF_DEBUG - int show_ref_count = interp->core_config.show_ref_count; + int show_ref_count = interp->config.show_ref_count; #endif #ifdef Py_TRACE_REFS - int dump_refs = interp->core_config.dump_refs; + int dump_refs = interp->config.dump_refs; #endif #ifdef WITH_PYMALLOC - int malloc_stats = interp->core_config.malloc_stats; + int malloc_stats = interp->config.malloc_stats; #endif /* Remaining threads (e.g. daemon threads) will automatically exit @@ -1412,19 +1377,19 @@ Py_Finalize(void) */ -static _PyInitError +static PyStatus new_interpreter(PyThreadState **tstate_p) { - _PyInitError err; + PyStatus status; - err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyRuntime_Initialize(); + if (_PyStatus_EXCEPTION(status)) { + return status; } _PyRuntimeState *runtime = &_PyRuntime; if (!runtime->initialized) { - return _Py_INIT_ERR("Py_Initialize must be called first"); + return _PyStatus_ERR("Py_Initialize must be called first"); } /* Issue #10915, #15751: The GIL API doesn't work with multiple @@ -1434,49 +1399,49 @@ new_interpreter(PyThreadState **tstate_p) PyInterpreterState *interp = PyInterpreterState_New(); if (interp == NULL) { *tstate_p = NULL; - return _Py_INIT_OK(); + return _PyStatus_OK(); } PyThreadState *tstate = PyThreadState_New(interp); if (tstate == NULL) { PyInterpreterState_Delete(interp); *tstate_p = NULL; - return _Py_INIT_OK(); + return _PyStatus_OK(); } PyThreadState *save_tstate = PyThreadState_Swap(tstate); /* Copy the current interpreter config into the new interpreter */ - _PyCoreConfig *core_config; + PyConfig *config; if (save_tstate != NULL) { - core_config = &save_tstate->interp->core_config; + config = &save_tstate->interp->config; } else { /* No current thread state, copy from the main interpreter */ PyInterpreterState *main_interp = PyInterpreterState_Main(); - core_config = &main_interp->core_config; + config = &main_interp->config; } - err = _PyCoreConfig_Copy(&interp->core_config, core_config); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyConfig_Copy(&interp->config, config); + if (_PyStatus_EXCEPTION(status)) { + return status; } - core_config = &interp->core_config; + config = &interp->config; - err = _PyExc_Init(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyExc_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PyErr_Init(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyErr_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; } /* XXX The following is lax in error checking */ PyObject *modules = PyDict_New(); if (modules == NULL) { - return _Py_INIT_ERR("can't make modules dictionary"); + return _PyStatus_ERR("can't make modules dictionary"); } interp->modules = modules; @@ -1489,7 +1454,7 @@ new_interpreter(PyThreadState **tstate_p) Py_INCREF(interp->sysdict); PyDict_SetItemString(interp->sysdict, "modules", modules); if (_PySys_InitMain(runtime, interp) < 0) { - return _Py_INIT_ERR("can't finish initializing sys"); + return _PyStatus_ERR("can't finish initializing sys"); } } else if (PyErr_Occurred()) { @@ -1508,50 +1473,50 @@ new_interpreter(PyThreadState **tstate_p) } if (bimod != NULL && sysmod != NULL) { - err = _PyBuiltins_AddExceptions(bimod); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyBuiltins_AddExceptions(bimod); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PySys_SetPreliminaryStderr(interp->sysdict); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PySys_SetPreliminaryStderr(interp->sysdict); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PyImportHooks_Init(); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyImportHooks_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = init_importlib(interp, sysmod); - if (_Py_INIT_FAILED(err)) { - return err; + status = init_importlib(interp, sysmod); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = init_importlib_external(interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = init_importlib_external(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PyUnicode_InitEncodings(interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PyUnicode_InitEncodings(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = init_sys_streams(interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = init_sys_streams(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = add_main_module(interp); - if (_Py_INIT_FAILED(err)) { - return err; + status = add_main_module(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; } - if (core_config->site_import) { - err = init_import_size(); - if (_Py_INIT_FAILED(err)) { - return err; + if (config->site_import) { + status = init_import_size(); + if (_PyStatus_EXCEPTION(status)) { + return status; } } } @@ -1561,7 +1526,7 @@ new_interpreter(PyThreadState **tstate_p) } *tstate_p = tstate; - return _Py_INIT_OK(); + return _PyStatus_OK(); handle_error: /* Oops, it didn't work. Undo it all. */ @@ -1573,16 +1538,16 @@ new_interpreter(PyThreadState **tstate_p) PyInterpreterState_Delete(interp); *tstate_p = NULL; - return _Py_INIT_OK(); + return _PyStatus_OK(); } PyThreadState * Py_NewInterpreter(void) { PyThreadState *tstate = NULL; - _PyInitError err = new_interpreter(&tstate); - if (_Py_INIT_FAILED(err)) { - _Py_ExitInitError(err); + PyStatus status = new_interpreter(&tstate); + if (_PyStatus_EXCEPTION(status)) { + Py_ExitStatusException(status); } return tstate; @@ -1627,29 +1592,29 @@ Py_EndInterpreter(PyThreadState *tstate) /* Add the __main__ module */ -static _PyInitError +static PyStatus add_main_module(PyInterpreterState *interp) { PyObject *m, *d, *loader, *ann_dict; m = PyImport_AddModule("__main__"); if (m == NULL) - return _Py_INIT_ERR("can't create __main__ module"); + return _PyStatus_ERR("can't create __main__ module"); d = PyModule_GetDict(m); ann_dict = PyDict_New(); if ((ann_dict == NULL) || (PyDict_SetItemString(d, "__annotations__", ann_dict) < 0)) { - return _Py_INIT_ERR("Failed to initialize __main__.__annotations__"); + return _PyStatus_ERR("Failed to initialize __main__.__annotations__"); } Py_DECREF(ann_dict); if (PyDict_GetItemString(d, "__builtins__") == NULL) { PyObject *bimod = PyImport_ImportModule("builtins"); if (bimod == NULL) { - return _Py_INIT_ERR("Failed to retrieve builtins module"); + return _PyStatus_ERR("Failed to retrieve builtins module"); } if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) { - return _Py_INIT_ERR("Failed to initialize __main__.__builtins__"); + return _PyStatus_ERR("Failed to initialize __main__.__builtins__"); } Py_DECREF(bimod); } @@ -1665,28 +1630,28 @@ add_main_module(PyInterpreterState *interp) PyObject *loader = PyObject_GetAttrString(interp->importlib, "BuiltinImporter"); if (loader == NULL) { - return _Py_INIT_ERR("Failed to retrieve BuiltinImporter"); + return _PyStatus_ERR("Failed to retrieve BuiltinImporter"); } if (PyDict_SetItemString(d, "__loader__", loader) < 0) { - return _Py_INIT_ERR("Failed to initialize __main__.__loader__"); + return _PyStatus_ERR("Failed to initialize __main__.__loader__"); } Py_DECREF(loader); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Import the site module (not into __main__ though) */ -static _PyInitError +static PyStatus init_import_size(void) { PyObject *m; m = PyImport_ImportModule("site"); if (m == NULL) { - return _Py_INIT_ERR("Failed to import the site module"); + return _PyStatus_ERR("Failed to import the site module"); } Py_DECREF(m); - return _Py_INIT_OK(); + return _PyStatus_OK(); } /* Check if a file descriptor is valid or not. @@ -1727,7 +1692,7 @@ is_valid_fd(int fd) /* returns Py_None if the fd is not valid */ static PyObject* -create_stdio(const _PyCoreConfig *config, PyObject* io, +create_stdio(const PyConfig *config, PyObject* io, int fd, int write_mode, const char* name, const wchar_t* encoding, const wchar_t* errors) { @@ -1864,7 +1829,7 @@ create_stdio(const _PyCoreConfig *config, PyObject* io, } /* Initialize sys.stdin, stdout, stderr and builtins.open */ -static _PyInitError +static PyStatus init_sys_streams(PyInterpreterState *interp) { PyObject *iomod = NULL, *wrapper; @@ -1873,8 +1838,8 @@ init_sys_streams(PyInterpreterState *interp) PyObject *std = NULL; int fd; PyObject * encoding_attr; - _PyInitError res = _Py_INIT_OK(); - _PyCoreConfig *config = &interp->core_config; + PyStatus res = _PyStatus_OK(); + PyConfig *config = &interp->config; /* Check that stdin is not a directory Using shell redirection, you can redirect stdin to a directory, @@ -1885,7 +1850,7 @@ init_sys_streams(PyInterpreterState *interp) struct _Py_stat_struct sb; if (_Py_fstat_noraise(fileno(stdin), &sb) == 0 && S_ISDIR(sb.st_mode)) { - return _Py_INIT_ERR(" is a directory, cannot continue"); + return _PyStatus_ERR(" is a directory, cannot continue"); } #endif @@ -1981,7 +1946,7 @@ init_sys_streams(PyInterpreterState *interp) goto done; error: - res = _Py_INIT_ERR("can't initialize sys standard streams"); + res = _PyStatus_ERR("can't initialize sys standard streams"); done: _Py_ClearStandardStreamEncoding(); @@ -2183,16 +2148,16 @@ Py_FatalError(const char *msg) } void _Py_NO_RETURN -_Py_ExitInitError(_PyInitError err) +Py_ExitStatusException(PyStatus status) { - if (_Py_INIT_IS_EXIT(err)) { - exit(err.exitcode); + if (_PyStatus_IS_EXIT(status)) { + exit(status.exitcode); } - else if (_Py_INIT_IS_ERROR(err)) { - fatal_error(err._func, err.err_msg, 1); + else if (_PyStatus_IS_ERROR(status)) { + fatal_error(status.func, status.err_msg, 1); } else { - Py_FatalError("_Py_ExitInitError() must not be called on success"); + Py_FatalError("Py_ExitStatusException() must not be called on success"); } } @@ -2284,7 +2249,7 @@ Py_Exit(int sts) exit(sts); } -static _PyInitError +static PyStatus init_signals(void) { #ifdef SIGPIPE @@ -2298,9 +2263,9 @@ init_signals(void) #endif PyOS_InitInterrupts(); /* May imply initsignal() */ if (PyErr_Occurred()) { - return _Py_INIT_ERR("can't import signal"); + return _PyStatus_ERR("can't import signal"); } - return _Py_INIT_OK(); + return _PyStatus_OK(); } diff --git a/Python/pystate.c b/Python/pystate.c index 41c66223390d..d1a8d2472470 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -3,7 +3,7 @@ #include "Python.h" #include "pycore_ceval.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_pymem.h" #include "pycore_pystate.h" #include "pycore_pylifecycle.h" @@ -42,7 +42,7 @@ static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_st static void _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate); -static _PyInitError +static PyStatus _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) { /* We preserve the hook across init, because there is @@ -60,7 +60,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) _PyGC_Initialize(&runtime->gc); _PyEval_Initialize(&runtime->ceval); - _PyPreConfig_InitPythonConfig(&runtime->preconfig); + PyPreConfig_InitPythonConfig(&runtime->preconfig); runtime->gilstate.check_enabled = 1; @@ -71,22 +71,22 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) runtime->interpreters.mutex = PyThread_allocate_lock(); if (runtime->interpreters.mutex == NULL) { - return _Py_INIT_ERR("Can't initialize threads for interpreter"); + return _PyStatus_ERR("Can't initialize threads for interpreter"); } runtime->interpreters.next_id = -1; runtime->xidregistry.mutex = PyThread_allocate_lock(); if (runtime->xidregistry.mutex == NULL) { - return _Py_INIT_ERR("Can't initialize threads for cross-interpreter data registry"); + return _PyStatus_ERR("Can't initialize threads for cross-interpreter data registry"); } // Set it to the ID of the main thread of the main interpreter. runtime->main_thread = PyThread_get_thread_ident(); - return _Py_INIT_OK(); + return _PyStatus_OK(); } -_PyInitError +PyStatus _PyRuntimeState_Init(_PyRuntimeState *runtime) { /* Force default allocator, since _PyRuntimeState_Fini() must @@ -94,10 +94,10 @@ _PyRuntimeState_Init(_PyRuntimeState *runtime) PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyInitError err = _PyRuntimeState_Init_impl(runtime); + PyStatus status = _PyRuntimeState_Init_impl(runtime); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - return err; + return status; } void @@ -163,7 +163,7 @@ _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime) static void _PyGILState_NoteThreadState( struct _gilstate_runtime_state *gilstate, PyThreadState* tstate); -_PyInitError +PyStatus _PyInterpreterState_Enable(_PyRuntimeState *runtime) { struct pyinterpreters *interpreters = &runtime->interpreters; @@ -182,11 +182,11 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); if (interpreters->mutex == NULL) { - return _Py_INIT_ERR("Can't initialize threads for interpreter"); + return _PyStatus_ERR("Can't initialize threads for interpreter"); } } - return _Py_INIT_OK(); + return _PyStatus_OK(); } PyInterpreterState * @@ -205,8 +205,11 @@ PyInterpreterState_New(void) interp->id_refcount = -1; interp->check_interval = 100; - _PyInitError err = _PyCoreConfig_InitPythonConfig(&interp->core_config); - if (_Py_INIT_FAILED(err)) { + PyStatus status = PyConfig_InitPythonConfig(&interp->config); + if (_PyStatus_EXCEPTION(status)) { + /* Don't report status to caller: PyConfig_InitPythonConfig() + can only fail with a memory allocation error. */ + PyConfig_Clear(&interp->config); PyMem_RawFree(interp); return NULL; } @@ -269,7 +272,7 @@ _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) Py_CLEAR(interp->audit_hooks); - _PyCoreConfig_Clear(&interp->core_config); + PyConfig_Clear(&interp->config); Py_CLEAR(interp->codec_search_path); Py_CLEAR(interp->codec_search_cache); Py_CLEAR(interp->codec_error_registry); @@ -523,12 +526,6 @@ _PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required) interp->requires_idref = required ? 1 : 0; } -_PyCoreConfig * -_PyInterpreterState_GetCoreConfig(PyInterpreterState *interp) -{ - return &interp->core_config; -} - PyObject * _PyInterpreterState_GetMainModule(PyInterpreterState *interp) { @@ -775,7 +772,7 @@ _PyState_ClearModules(void) void PyThreadState_Clear(PyThreadState *tstate) { - int verbose = tstate->interp->core_config.verbose; + int verbose = tstate->interp->config.verbose; if (verbose && tstate->frame != NULL) fprintf(stderr, diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 26cb02aad5f1..665c9c9586e1 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -94,7 +94,7 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * PyCompilerFlags local_flags; int nomem_count = 0; #ifdef Py_REF_DEBUG - int show_ref_count = _PyInterpreterState_Get()->core_config.show_ref_count; + int show_ref_count = _PyInterpreterState_Get()->config.show_ref_count; #endif filename = PyUnicode_DecodeFSDefault(filename_str); @@ -584,7 +584,7 @@ print_error_text(PyObject *f, int offset, PyObject *text_obj) int _Py_HandleSystemExit(int *exitcode_p) { - int inspect = _PyInterpreterState_GET_UNSAFE()->core_config.inspect; + int inspect = _PyInterpreterState_GET_UNSAFE()->config.inspect; if (inspect) { /* Don't exit if -i flag was given. This flag is set to 0 * when entering interactive mode for inspecting. */ diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 08a1a2995e00..24018e25fa57 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -17,7 +17,7 @@ Data members: #include "Python.h" #include "code.h" #include "frameobject.h" -#include "pycore_coreconfig.h" +#include "pycore_initconfig.h" #include "pycore_pylifecycle.h" #include "pycore_pymem.h" #include "pycore_pathconfig.h" @@ -752,7 +752,7 @@ sys_getfilesystemencoding_impl(PyObject *module) /*[clinic end generated code: output=1dc4bdbe9be44aa7 input=8475f8649b8c7d8c]*/ { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const _PyCoreConfig *config = &interp->core_config; + const PyConfig *config = &interp->config; return PyUnicode_FromWideChar(config->filesystem_encoding, -1); } @@ -767,7 +767,7 @@ sys_getfilesystemencodeerrors_impl(PyObject *module) /*[clinic end generated code: output=ba77b36bbf7c96f5 input=22a1e8365566f1e5]*/ { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const _PyCoreConfig *config = &interp->core_config; + const PyConfig *config = &interp->config; return PyUnicode_FromWideChar(config->filesystem_errors, -1); } @@ -2475,8 +2475,8 @@ make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp) { int pos = 0; PyObject *seq; - const _PyPreConfig *preconfig = &runtime->preconfig; - const _PyCoreConfig *config = &interp->core_config; + const PyPreConfig *preconfig = &runtime->preconfig; + const PyConfig *config = &interp->config; seq = PyStructSequence_New(&FlagsType); if (seq == NULL) @@ -2690,7 +2690,7 @@ static struct PyModuleDef sysmodule = { } \ } while (0) -static _PyInitError +static PyStatus _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, PyObject *sysdict) { @@ -2827,13 +2827,13 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, if (PyErr_Occurred()) { goto err_occurred; } - return _Py_INIT_OK(); + return _PyStatus_OK(); type_init_failed: - return _Py_INIT_ERR("failed to initialize a type"); + return _PyStatus_ERR("failed to initialize a type"); err_occurred: - return _Py_INIT_ERR("can't initialize sys module"); + return _PyStatus_ERR("can't initialize sys module"); } #undef SET_SYS_FROM_STRING @@ -2885,7 +2885,7 @@ sys_add_xoption(PyObject *opts, const wchar_t *s) static PyObject* -sys_create_xoptions_dict(const _PyCoreConfig *config) +sys_create_xoptions_dict(const PyConfig *config) { Py_ssize_t nxoption = config->xoptions.length; wchar_t * const * xoptions = config->xoptions.items; @@ -2910,12 +2910,12 @@ int _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) { PyObject *sysdict = interp->sysdict; - const _PyCoreConfig *config = &interp->core_config; + const PyConfig *config = &interp->config; int res; #define COPY_LIST(KEY, VALUE) \ do { \ - PyObject *list = _PyWstrList_AsList(&(VALUE)); \ + PyObject *list = _PyWideStringList_AsList(&(VALUE)); \ if (list == NULL) { \ return -1; \ } \ @@ -3003,7 +3003,7 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) infrastructure for the io module in place. Use UTF-8/surrogateescape and ignore EAGAIN errors. */ -_PyInitError +PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict) { PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr)); @@ -3017,56 +3017,56 @@ _PySys_SetPreliminaryStderr(PyObject *sysdict) goto error; } Py_DECREF(pstderr); - return _Py_INIT_OK(); + return _PyStatus_OK(); error: Py_XDECREF(pstderr); - return _Py_INIT_ERR("can't set preliminary stderr"); + return _PyStatus_ERR("can't set preliminary stderr"); } /* Create sys module without all attributes: _PySys_InitMain() should be called later to add remaining attributes. */ -_PyInitError +PyStatus _PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, PyObject **sysmod_p) { PyObject *modules = PyDict_New(); if (modules == NULL) { - return _Py_INIT_ERR("can't make modules dictionary"); + return _PyStatus_ERR("can't make modules dictionary"); } interp->modules = modules; PyObject *sysmod = _PyModule_CreateInitialized(&sysmodule, PYTHON_API_VERSION); if (sysmod == NULL) { - return _Py_INIT_ERR("failed to create a module object"); + return _PyStatus_ERR("failed to create a module object"); } PyObject *sysdict = PyModule_GetDict(sysmod); if (sysdict == NULL) { - return _Py_INIT_ERR("can't initialize sys dict"); + return _PyStatus_ERR("can't initialize sys dict"); } Py_INCREF(sysdict); interp->sysdict = sysdict; if (PyDict_SetItemString(sysdict, "modules", interp->modules) < 0) { - return _Py_INIT_ERR("can't initialize sys module"); + return _PyStatus_ERR("can't initialize sys module"); } - _PyInitError err = _PySys_SetPreliminaryStderr(sysdict); - if (_Py_INIT_FAILED(err)) { - return err; + PyStatus status = _PySys_SetPreliminaryStderr(sysdict); + if (_PyStatus_EXCEPTION(status)) { + return status; } - err = _PySys_InitCore(runtime, interp, sysdict); - if (_Py_INIT_FAILED(err)) { - return err; + status = _PySys_InitCore(runtime, interp, sysdict); + if (_PyStatus_EXCEPTION(status)) { + return status; } _PyImport_FixupBuiltin(sysmod, "sys", interp->modules); *sysmod_p = sysmod; - return _Py_INIT_OK(); + return _PyStatus_OK(); } @@ -3156,7 +3156,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) if (updatepath) { /* If argv[0] is not '-c' nor '-m', prepend argv[0] to sys.path. If argv[0] is a symlink, use the real path. */ - const _PyWstrList argv_list = {.length = argc, .items = argv}; + const PyWideStringList argv_list = {.length = argc, .items = argv}; PyObject *path0 = NULL; if (_PyPathConfig_ComputeSysPath0(&argv_list, &path0)) { if (path0 == NULL) { From webhook-mailer at python.org Mon May 27 11:52:08 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Mon, 27 May 2019 15:52:08 -0000 Subject: [Python-checkins] [3.7] bpo-37035: Don't log OSError (GH-13548) (#13594) Message-ID: https://github.com/python/cpython/commit/a79b6c578fcd2ea8be29440fdd8a998e5527200f commit: a79b6c578fcd2ea8be29440fdd8a998e5527200f branch: 3.7 author: Andrew Svetlov committer: GitHub date: 2019-05-27T18:52:05+03:00 summary: [3.7] bpo-37035: Don't log OSError (GH-13548) (#13594) https://bugs.python.org/issue37035. (cherry picked from commit 1f39c28e489cca0397fc4c3675d13569318122ac) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst M Lib/asyncio/base_events.py M Lib/asyncio/proactor_events.py M Lib/asyncio/selector_events.py M Lib/asyncio/sslproto.py M Lib/asyncio/unix_events.py M Lib/test/test_asyncio/test_selector_events.py M Lib/test/test_asyncio/test_unix_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 7bd20bbf006b..a736d01d6f37 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -56,11 +56,6 @@ # before cleanup of cancelled handles is performed. _MIN_CANCELLED_TIMER_HANDLES_FRACTION = 0.5 -# Exceptions which must not call the exception handler in fatal error -# methods (_fatal_error()) -_FATAL_ERROR_IGNORE = (BrokenPipeError, - ConnectionResetError, ConnectionAbortedError) - _HAS_IPv6 = hasattr(socket, 'AF_INET6') # Maximum timeout passed to select to avoid OS limitations diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index a638cceda5e4..0296e0f7621d 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -96,7 +96,7 @@ def __del__(self): def _fatal_error(self, exc, message='Fatal error on pipe transport'): try: - if isinstance(exc, base_events._FATAL_ERROR_IGNORE): + if isinstance(exc, OSError): if self._loop.get_debug(): logger.debug("%r: %s", self, message, exc_info=True) else: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index fa27b3bc23af..23bd8ad8492f 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -660,7 +660,7 @@ def __del__(self): def _fatal_error(self, exc, message='Fatal error on transport'): # Should be called from exception handler only. - if isinstance(exc, base_events._FATAL_ERROR_IGNORE): + if isinstance(exc, OSError): if self._loop.get_debug(): logger.debug("%r: %s", self, message, exc_info=True) else: diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 15eb9c78443a..02d29738e468 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -700,7 +700,7 @@ def _process_write_backlog(self): self._fatal_error(exc, 'Fatal error on SSL transport') def _fatal_error(self, exc, message='Fatal error on transport'): - if isinstance(exc, base_events._FATAL_ERROR_IGNORE): + if isinstance(exc, OSError): if self._loop.get_debug(): logger.debug("%r: %s", self, message, exc_info=True) else: diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index a05ebfd51ba2..a0fc996d23a0 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -717,7 +717,7 @@ def abort(self): def _fatal_error(self, exc, message='Fatal error on pipe transport'): # should be called by exception handler only - if isinstance(exc, base_events._FATAL_ERROR_IGNORE): + if isinstance(exc, OSError): if self._loop.get_debug(): logger.debug("%r: %s", self, message, exc_info=True) else: diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index 2205ee204249..a9fb61ae99de 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -850,10 +850,23 @@ def test_fatal_error(self, m_exc): tr._force_close = mock.Mock() tr._fatal_error(exc) + m_exc.assert_not_called() + + tr._force_close.assert_called_with(exc) + + @mock.patch('asyncio.log.logger.error') + def test_fatal_error_custom_exception(self, m_exc): + class MyError(Exception): + pass + exc = MyError() + tr = self.create_transport() + tr._force_close = mock.Mock() + tr._fatal_error(exc) + m_exc.assert_called_with( test_utils.MockPattern( 'Fatal error on transport\nprotocol:.*\ntransport:.*'), - exc_info=(OSError, MOCK_ANY, MOCK_ANY)) + exc_info=(MyError, MOCK_ANY, MOCK_ANY)) tr._force_close.assert_called_with(exc) @@ -1740,10 +1753,20 @@ def test_fatal_error_connected(self, m_exc): err = ConnectionRefusedError() transport._fatal_error(err) self.assertFalse(self.protocol.error_received.called) + m_exc.assert_not_called() + + @mock.patch('asyncio.base_events.logger.error') + def test_fatal_error_connected_custom_error(self, m_exc): + class MyException(Exception): + pass + transport = self.datagram_transport(address=('0.0.0.0', 1)) + err = MyException() + transport._fatal_error(err) + self.assertFalse(self.protocol.error_received.called) m_exc.assert_called_with( test_utils.MockPattern( 'Fatal error on transport\nprotocol:.*\ntransport:.*'), - exc_info=(ConnectionRefusedError, MOCK_ANY, MOCK_ANY)) + exc_info=(MyException, MOCK_ANY, MOCK_ANY)) if __name__ == '__main__': diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index 5d16b95456f0..ec171fa83da3 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -961,11 +961,7 @@ def test__write_ready_err(self, m_write, m_logexc): self.assertFalse(self.loop.readers) self.assertEqual(bytearray(), tr._buffer) self.assertTrue(tr.is_closing()) - m_logexc.assert_called_with( - test_utils.MockPattern( - 'Fatal write error on pipe transport' - '\nprotocol:.*\ntransport:.*'), - exc_info=(OSError, MOCK_ANY, MOCK_ANY)) + m_logexc.assert_not_called() self.assertEqual(1, tr._conn_lost) test_utils.run_briefly(self.loop) self.protocol.connection_lost.assert_called_with(err) diff --git a/Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst b/Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst new file mode 100644 index 000000000000..004ec2d13714 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst @@ -0,0 +1,5 @@ +Don't log OSError based exceptions if a fatal error has occurred in asyncio +transport. Peer can generate almost any OSError, user cannot avoid these exceptions +by fixing own code. +Errors are still propagated to user code, it's just logging them +is pointless and pollute asyncio logs. From webhook-mailer at python.org Mon May 27 12:48:20 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Mon, 27 May 2019 16:48:20 -0000 Subject: [Python-checkins] bpo-32941: Add madvise() for mmap objects (GH-6172) Message-ID: https://github.com/python/cpython/commit/02db696732c031d9a0265dc9bbf4f5b1fad042b3 commit: 02db696732c031d9a0265dc9bbf4f5b1fad042b3 branch: master author: Zackery Spytz committer: Antoine Pitrou date: 2019-05-27T18:48:16+02:00 summary: bpo-32941: Add madvise() for mmap objects (GH-6172) Allow mmap objects to access the madvise() system call. files: A Misc/NEWS.d/next/Library/2018-03-20-20-57-00.bpo-32941.9FU0gL.rst M Doc/library/mmap.rst M Doc/whatsnew/3.8.rst M Lib/test/test_mmap.py M Modules/mmapmodule.c M configure M configure.ac M pyconfig.h.in diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index a82caf86e801..c7a13abad888 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -203,6 +203,20 @@ To map anonymous memory, -1 should be passed as the fileno along with the length exception was raised on error under Unix. + .. method:: madvise(option[, start[, length]]) + + Send advice *option* to the kernel about the memory region beginning at + *start* and extending *length* bytes. *option* must be one of the + :ref:`MADV_* constants ` available on the system. If + *start* and *length* are omitted, the entire mapping is spanned. On + some systems (including Linux), *start* must be a multiple of the + :const:`PAGESIZE`. + + Availability: Systems with the ``madvise()`` system call. + + .. versionadded:: 3.8 + + .. method:: move(dest, src, count) Copy the *count* bytes starting at offset *src* to the destination index @@ -292,3 +306,38 @@ To map anonymous memory, -1 should be passed as the fileno along with the length position of the file pointer; the file position is advanced by ``1``. If the mmap was created with :const:`ACCESS_READ`, then writing to it will raise a :exc:`TypeError` exception. + +.. _madvise-constants: + +MADV_* Constants +++++++++++++++++ + +.. data:: MADV_NORMAL + MADV_RANDOM + MADV_SEQUENTIAL + MADV_WILLNEED + MADV_DONTNEED + MADV_REMOVE + MADV_DONTFORK + MADV_DOFORK + MADV_HWPOISON + MADV_MERGEABLE + MADV_UNMERGEABLE + MADV_SOFT_OFFLINE + MADV_HUGEPAGE + MADV_NOHUGEPAGE + MADV_DONTDUMP + MADV_DODUMP + MADV_FREE + MADV_NOSYNC + MADV_AUTOSYNC + MADV_NOCORE + MADV_CORE + MADV_PROTECT + + These options can be passed to :meth:`mmap.madvise`. Not every option will + be present on every system. + + Availability: Systems with the madvise() system call. + + .. versionadded:: 3.8 diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 6102d8c357ca..fd5e6496ba2e 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -460,6 +460,15 @@ numbers. (Contributed by Pablo Galindo in :issue:`35606`) Added new function :func:`math.isqrt` for computing integer square roots. (Contributed by Mark Dickinson in :issue:`36887`.) + +mmap +---- + +The :class:`mmap.mmap` class now has an :meth:`~mmap.mmap.madvise` method to +access the ``madvise()`` system call. +(Contributed by Zackery Spytz in :issue:`32941`.) + + os -- diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 495d24ad8077..7b2b100dce01 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -739,6 +739,25 @@ def test_flush_return_value(self): # See bpo-34754 for details. self.assertRaises(OSError, mm.flush, 1, len(b'python')) + @unittest.skipUnless(hasattr(mmap.mmap, 'madvise'), 'needs madvise') + def test_madvise(self): + size = 8192 + m = mmap.mmap(-1, size) + + with self.assertRaisesRegex(ValueError, "madvise start out of bounds"): + m.madvise(mmap.MADV_NORMAL, size) + with self.assertRaisesRegex(ValueError, "madvise start out of bounds"): + m.madvise(mmap.MADV_NORMAL, -1) + with self.assertRaisesRegex(ValueError, "madvise length invalid"): + m.madvise(mmap.MADV_NORMAL, 0, -1) + with self.assertRaisesRegex(OverflowError, "madvise length too large"): + m.madvise(mmap.MADV_NORMAL, PAGESIZE, sys.maxsize) + self.assertEqual(m.madvise(mmap.MADV_NORMAL), None) + self.assertEqual(m.madvise(mmap.MADV_NORMAL, PAGESIZE), None) + self.assertEqual(m.madvise(mmap.MADV_NORMAL, PAGESIZE, size), None) + self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, 2), None) + self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, size), None) + class LargeMmapTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2018-03-20-20-57-00.bpo-32941.9FU0gL.rst b/Misc/NEWS.d/next/Library/2018-03-20-20-57-00.bpo-32941.9FU0gL.rst new file mode 100644 index 000000000000..f7668aecda6b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-20-20-57-00.bpo-32941.9FU0gL.rst @@ -0,0 +1,2 @@ +Allow :class:`mmap.mmap` objects to access the madvise() system call +(through :meth:`mmap.mmap.madvise`). diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index fdd60bbb6eef..36cbaf9fb8b2 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -708,11 +708,54 @@ mmap__sizeof__method(mmap_object *self, void *unused) } #endif +#ifdef HAVE_MADVISE +static PyObject * +mmap_madvise_method(mmap_object *self, PyObject *args) +{ + int option; + Py_ssize_t start = 0, length; + + CHECK_VALID(NULL); + length = self->size; + + if (!PyArg_ParseTuple(args, "i|nn:madvise", &option, &start, &length)) { + return NULL; + } + + if (start < 0 || start >= self->size) { + PyErr_SetString(PyExc_ValueError, "madvise start out of bounds"); + return NULL; + } + if (length < 0) { + PyErr_SetString(PyExc_ValueError, "madvise length invalid"); + return NULL; + } + if (PY_SSIZE_T_MAX - start < length) { + PyErr_SetString(PyExc_OverflowError, "madvise length too large"); + return NULL; + } + + if (start + length > self->size) { + length = self->size - start; + } + + if (madvise(self->data + start, length, option) != 0) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + + Py_RETURN_NONE; +} +#endif // HAVE_MADVISE + static struct PyMethodDef mmap_object_methods[] = { {"close", (PyCFunction) mmap_close_method, METH_NOARGS}, {"find", (PyCFunction) mmap_find_method, METH_VARARGS}, {"rfind", (PyCFunction) mmap_rfind_method, METH_VARARGS}, {"flush", (PyCFunction) mmap_flush_method, METH_VARARGS}, +#ifdef HAVE_MADVISE + {"madvise", (PyCFunction) mmap_madvise_method, METH_VARARGS}, +#endif {"move", (PyCFunction) mmap_move_method, METH_VARARGS}, {"read", (PyCFunction) mmap_read_method, METH_VARARGS}, {"read_byte", (PyCFunction) mmap_read_byte_method, METH_NOARGS}, @@ -1494,5 +1537,80 @@ PyInit_mmap(void) setint(dict, "ACCESS_READ", ACCESS_READ); setint(dict, "ACCESS_WRITE", ACCESS_WRITE); setint(dict, "ACCESS_COPY", ACCESS_COPY); + +#ifdef HAVE_MADVISE + // Conventional advice values +#ifdef MADV_NORMAL + setint(dict, "MADV_NORMAL", MADV_NORMAL); +#endif +#ifdef MADV_RANDOM + setint(dict, "MADV_RANDOM", MADV_RANDOM); +#endif +#ifdef MADV_SEQUENTIAL + setint(dict, "MADV_SEQUENTIAL", MADV_SEQUENTIAL); +#endif +#ifdef MADV_WILLNEED + setint(dict, "MADV_WILLNEED", MADV_WILLNEED); +#endif +#ifdef MADV_DONTNEED + setint(dict, "MADV_DONTNEED", MADV_DONTNEED); +#endif + + // Linux-specific advice values +#ifdef MADV_REMOVE + setint(dict, "MADV_REMOVE", MADV_REMOVE); +#endif +#ifdef MADV_DONTFORK + setint(dict, "MADV_DONTFORK", MADV_DONTFORK); +#endif +#ifdef MADV_DOFORK + setint(dict, "MADV_DOFORK", MADV_DOFORK); +#endif +#ifdef MADV_HWPOISON + setint(dict, "MADV_HWPOISON", MADV_HWPOISON); +#endif +#ifdef MADV_MERGEABLE + setint(dict, "MADV_MERGEABLE", MADV_MERGEABLE); +#endif +#ifdef MADV_UNMERGEABLE + setint(dict, "MADV_UNMERGEABLE", MADV_UNMERGEABLE); +#endif +#ifdef MADV_SOFT_OFFLINE + setint(dict, "MADV_SOFT_OFFLINE", MADV_SOFT_OFFLINE); +#endif +#ifdef MADV_HUGEPAGE + setint(dict, "MADV_HUGEPAGE", MADV_HUGEPAGE); +#endif +#ifdef MADV_NOHUGEPAGE + setint(dict, "MADV_NOHUGEPAGE", MADV_NOHUGEPAGE); +#endif +#ifdef MADV_DONTDUMP + setint(dict, "MADV_DONTDUMP", MADV_DONTDUMP); +#endif +#ifdef MADV_DODUMP + setint(dict, "MADV_DODUMP", MADV_DODUMP); +#endif +#ifdef MADV_FREE // (Also present on FreeBSD and macOS.) + setint(dict, "MADV_FREE", MADV_FREE); +#endif + + // FreeBSD-specific +#ifdef MADV_NOSYNC + setint(dict, "MADV_NOSYNC", MADV_NOSYNC); +#endif +#ifdef MADV_AUTOSYNC + setint(dict, "MADV_AUTOSYNC", MADV_AUTOSYNC); +#endif +#ifdef MADV_NOCORE + setint(dict, "MADV_NOCORE", MADV_NOCORE); +#endif +#ifdef MADV_CORE + setint(dict, "MADV_CORE", MADV_CORE); +#endif +#ifdef MADV_PROTECT + setint(dict, "MADV_PROTECT", MADV_PROTECT); +#endif +#endif // HAVE_MADVISE + return module; } diff --git a/configure b/configure index bc276ac58362..e8cbfeb154a5 100755 --- a/configure +++ b/configure @@ -11471,7 +11471,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \ if_nameindex \ - initgroups kill killpg lchmod lchown lockf linkat lstat lutimes mmap \ + initgroups kill killpg lchmod lchown lockf linkat lstat lutimes madvise mmap \ memrchr mbrtowc mkdirat mkfifo \ mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ diff --git a/configure.ac b/configure.ac index 5e565191f27d..c743edfdeb18 100644 --- a/configure.ac +++ b/configure.ac @@ -3527,7 +3527,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \ if_nameindex \ - mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ + madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ diff --git a/pyconfig.h.in b/pyconfig.h.in index dd5f2e393be0..cc6435541646 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -658,6 +658,9 @@ /* Define to 1 if you have the `lutimes' function. */ #undef HAVE_LUTIMES +/* Define to 1 if you have the `madvise' function. */ +#undef HAVE_MADVISE + /* Define this if you have the makedev macro. */ #undef HAVE_MAKEDEV From webhook-mailer at python.org Mon May 27 13:21:57 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 27 May 2019 17:21:57 -0000 Subject: [Python-checkins] bpo-37051: Refine note on what objects are hashable (GH-13587) Message-ID: https://github.com/python/cpython/commit/cc1c582f6fe450ce1c7de849137039e9b5fab8eb commit: cc1c582f6fe450ce1c7de849137039e9b5fab8eb branch: master author: Raymond Hettinger committer: GitHub date: 2019-05-27T10:21:31-07:00 summary: bpo-37051: Refine note on what objects are hashable (GH-13587) files: M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index d3ce36525519..177df54ef215 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -512,8 +512,10 @@ Glossary Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally. - All of Python's immutable built-in objects are hashable; mutable - containers (such as lists or dictionaries) are not. Objects which are + Most of Python's immutable built-in objects are hashable; mutable + containers (such as lists or dictionaries) are not; immutable + containers (such as tuples and frozensets) are only hashable if + their elements are hashable. Objects which are instances of user-defined classes are hashable by default. They all compare unequal (except with themselves), and their hash value is derived from their :func:`id`. From webhook-mailer at python.org Mon May 27 13:43:26 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 27 May 2019 17:43:26 -0000 Subject: [Python-checkins] bpo-37051: Refine note on what objects are hashable (GH-13587) (GH-13595) Message-ID: https://github.com/python/cpython/commit/e8318f31f35dc851684c094b268e4a85d7f357c9 commit: e8318f31f35dc851684c094b268e4a85d7f357c9 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2019-05-27T10:43:18-07:00 summary: bpo-37051: Refine note on what objects are hashable (GH-13587) (GH-13595) (cherry picked from commit cc1c582f6fe450ce1c7de849137039e9b5fab8eb) Co-authored-by: Raymond Hettinger files: M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index b6ab28617d14..f7f35cbb67d2 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -508,8 +508,10 @@ Glossary Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally. - All of Python's immutable built-in objects are hashable; mutable - containers (such as lists or dictionaries) are not. Objects which are + Most of Python's immutable built-in objects are hashable; mutable + containers (such as lists or dictionaries) are not; immutable + containers (such as tuples and frozensets) are only hashable if + their elements are hashable. Objects which are instances of user-defined classes are hashable by default. They all compare unequal (except with themselves), and their hash value is derived from their :func:`id`. From webhook-mailer at python.org Mon May 27 13:45:35 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 May 2019 17:45:35 -0000 Subject: [Python-checkins] Fix a typo in SECURITY.md (GH-13568) Message-ID: https://github.com/python/cpython/commit/a8e814db96ebfeb1f58bc471edffde2176c0ae05 commit: a8e814db96ebfeb1f58bc471edffde2176c0ae05 branch: master author: Philippe Gagnon <12717218+pgagnon at users.noreply.github.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-27T10:45:24-07:00 summary: Fix a typo in SECURITY.md (GH-13568) There is a duplicated "in" in the Supported Versions text. files: M .github/SECURITY.md diff --git a/.github/SECURITY.md b/.github/SECURITY.md index 23976fda4a7e..28aea946623c 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -2,7 +2,7 @@ ## Supported Versions -The Python team applies security fixes according to the table in +The Python team applies security fixes according to the table in [the devguide]( https://devguide.python.org/#status-of-python-branches ). From webhook-mailer at python.org Mon May 27 13:57:27 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 May 2019 17:57:27 -0000 Subject: [Python-checkins] bpo-32941: Fix test_madvise failure when page size >= 8kiB (GH-13596) Message-ID: https://github.com/python/cpython/commit/695b1dd8cbf3a48fdb30ab96918a49b20b7ec3e7 commit: 695b1dd8cbf3a48fdb30ab96918a49b20b7ec3e7 branch: master author: Antoine Pitrou committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-27T10:57:23-07:00 summary: bpo-32941: Fix test_madvise failure when page size >= 8kiB (GH-13596) https://bugs.python.org/issue32941 files: M Lib/test/test_mmap.py diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 7b2b100dce01..88c501d81a07 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -13,6 +13,7 @@ PAGESIZE = mmap.PAGESIZE + class MmapTests(unittest.TestCase): def setUp(self): @@ -741,7 +742,7 @@ def test_flush_return_value(self): @unittest.skipUnless(hasattr(mmap.mmap, 'madvise'), 'needs madvise') def test_madvise(self): - size = 8192 + size = 2 * PAGESIZE m = mmap.mmap(-1, size) with self.assertRaisesRegex(ValueError, "madvise start out of bounds"): From webhook-mailer at python.org Mon May 27 15:32:08 2019 From: webhook-mailer at python.org (Eric V. Smith) Date: Mon, 27 May 2019 19:32:08 -0000 Subject: [Python-checkins] bpo-37050: Remove expr_text from FormattedValue ast node, use Constant node instead (GH-13597) Message-ID: https://github.com/python/cpython/commit/6f6ff8a56518a80da406aad6ac8364c046cc7f18 commit: 6f6ff8a56518a80da406aad6ac8364c046cc7f18 branch: master author: Eric V. Smith committer: GitHub date: 2019-05-27T15:31:52-04:00 summary: bpo-37050: Remove expr_text from FormattedValue ast node, use Constant node instead (GH-13597) When using the "=" debug functionality of f-strings, use another Constant node (or a merged constant node) instead of adding expr_text to the FormattedValue node. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-27-14-46-24.bpo-37050.7MyZGg.rst M Include/Python-ast.h M Lib/test/test_fstring.py M Lib/test/test_future.py M Parser/Python.asdl M Python/Python-ast.c M Python/ast.c M Python/ast_unparse.c M Python/compile.c diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 2fc50e3f53a2..490d3b0846ab 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -330,7 +330,6 @@ struct _expr { expr_ty value; int conversion; expr_ty format_spec; - string expr_text; } FormattedValue; struct { @@ -639,10 +638,10 @@ expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, expr_ty _Py_Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7, a8) +#define FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7) _Py_FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7) expr_ty _Py_FormattedValue(expr_ty value, int conversion, expr_ty format_spec, - string expr_text, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); + int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); #define JoinedStr(a0, a1, a2, a3, a4, a5) _Py_JoinedStr(a0, a1, a2, a3, a4, a5) expr_ty _Py_JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 3484fcecf1c5..c9e6e7de5afd 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1150,6 +1150,24 @@ def __repr__(self): self.assertRaises(SyntaxError, eval, "f'{C=]'") + # Make sure leading and following text works. + x = 'foo' + self.assertEqual(f'X{x=}Y', 'Xx='+repr(x)+'Y') + + # Make sure whitespace around the = works. + self.assertEqual(f'X{x =}Y', 'Xx ='+repr(x)+'Y') + self.assertEqual(f'X{x= }Y', 'Xx= '+repr(x)+'Y') + self.assertEqual(f'X{x = }Y', 'Xx = '+repr(x)+'Y') + + # These next lines contains tabs. Backslash escapes don't + # work in f-strings. + # patchcheck doens't like these tabs. So the only way to test + # this will be to dynamically created and exec the f-strings. But + # that's such a hassle I'll save it for another day. For now, convert + # the tabs to spaces just to shut up patchcheck. + #self.assertEqual(f'X{x =}Y', 'Xx\t='+repr(x)+'Y') + #self.assertEqual(f'X{x = }Y', 'Xx\t=\t'+repr(x)+'Y') + def test_walrus(self): x = 20 # This isn't an assignment expression, it's 'x', with a format diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py index dd148b629562..303c5f7fbed6 100644 --- a/Lib/test/test_future.py +++ b/Lib/test/test_future.py @@ -270,12 +270,6 @@ def test_annotations(self): eq("f'{x}'") eq("f'{x!r}'") eq("f'{x!a}'") - eq("f'{x=!r}'") - eq("f'{x=:}'") - eq("f'{x=:.2f}'") - eq("f'{x=!r}'") - eq("f'{x=!a}'") - eq("f'{x=!s:*^20}'") eq('(yield from outside_of_generator)') eq('(yield)') eq('(yield a + b)') @@ -290,6 +284,15 @@ def test_annotations(self): eq("(x:=10)") eq("f'{(x:=10):=10}'") + # f-strings with '=' don't round trip very well, so set the expected + # result explicitely. + self.assertAnnotationEqual("f'{x=!r}'", expected="f'x={x!r}'") + self.assertAnnotationEqual("f'{x=:}'", expected="f'x={x:}'") + self.assertAnnotationEqual("f'{x=:.2f}'", expected="f'x={x:.2f}'") + self.assertAnnotationEqual("f'{x=!r}'", expected="f'x={x!r}'") + self.assertAnnotationEqual("f'{x=!a}'", expected="f'x={x!a}'") + self.assertAnnotationEqual("f'{x=!s:*^20}'", expected="f'x={x!s:*^20}'") + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-27-14-46-24.bpo-37050.7MyZGg.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-14-46-24.bpo-37050.7MyZGg.rst new file mode 100644 index 000000000000..0667c8ebd148 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-14-46-24.bpo-37050.7MyZGg.rst @@ -0,0 +1,4 @@ +Improve the AST for "debug" f-strings, which use '=' to print out the source +of the expression being evaluated. Delete expr_text from the FormattedValue +node, and instead use a Constant string node (possibly merged with adjacent +constant expressions inside the f-string). diff --git a/Parser/Python.asdl b/Parser/Python.asdl index 882f5d1eba35..0c00d398b461 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -76,7 +76,7 @@ module Python -- x < 4 < 3 and (x < 4) < 3 | Compare(expr left, cmpop* ops, expr* comparators) | Call(expr func, expr* args, keyword* keywords) - | FormattedValue(expr value, int? conversion, expr? format_spec, string? expr_text) + | FormattedValue(expr value, int? conversion, expr? format_spec) | JoinedStr(expr* values) | Constant(constant value, string? kind) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 39a40eedca32..7c8e438658f7 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -314,12 +314,10 @@ static char *Call_fields[]={ static PyTypeObject *FormattedValue_type; _Py_IDENTIFIER(conversion); _Py_IDENTIFIER(format_spec); -_Py_IDENTIFIER(expr_text); static char *FormattedValue_fields[]={ "value", "conversion", "format_spec", - "expr_text", }; static PyTypeObject *JoinedStr_type; static char *JoinedStr_fields[]={ @@ -954,7 +952,7 @@ static int init_types(void) Call_type = make_type("Call", expr_type, Call_fields, 3); if (!Call_type) return 0; FormattedValue_type = make_type("FormattedValue", expr_type, - FormattedValue_fields, 4); + FormattedValue_fields, 3); if (!FormattedValue_type) return 0; JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1); if (!JoinedStr_type) return 0; @@ -2253,9 +2251,9 @@ Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int } expr_ty -FormattedValue(expr_ty value, int conversion, expr_ty format_spec, string - expr_text, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena) +FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno, + int col_offset, int end_lineno, int end_col_offset, PyArena + *arena) { expr_ty p; if (!value) { @@ -2270,7 +2268,6 @@ FormattedValue(expr_ty value, int conversion, expr_ty format_spec, string p->v.FormattedValue.value = value; p->v.FormattedValue.conversion = conversion; p->v.FormattedValue.format_spec = format_spec; - p->v.FormattedValue.expr_text = expr_text; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -3507,11 +3504,6 @@ ast2obj_expr(void* _o) if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.FormattedValue.expr_text); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_expr_text, value) == -1) - goto failed; - Py_DECREF(value); break; case JoinedStr_kind: result = PyType_GenericNew(JoinedStr_type, NULL, NULL); @@ -7169,7 +7161,6 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty value; int conversion; expr_ty format_spec; - string expr_text; if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { return 1; @@ -7210,22 +7201,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_expr_text, &tmp) < 0) { - return 1; - } - if (tmp == NULL || tmp == Py_None) { - Py_CLEAR(tmp); - expr_text = NULL; - } - else { - int res; - res = obj2ast_string(tmp, &expr_text, arena); - if (res != 0) goto failed; - Py_CLEAR(tmp); - } - *out = FormattedValue(value, conversion, format_spec, expr_text, - lineno, col_offset, end_lineno, end_col_offset, - arena); + *out = FormattedValue(value, conversion, format_spec, lineno, + col_offset, end_lineno, end_col_offset, arena); if (*out == NULL) goto failed; return 0; } diff --git a/Python/ast.c b/Python/ast.c index 625982735775..7ffdf4a2a037 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -5006,10 +5006,16 @@ fstring_parse(const char **str, const char *end, int raw, int recurse_lvl, closing brace doesn't match an opening paren, for example. It doesn't need to error on all invalid expressions, just correctly find the end of all valid ones. Any errors inside the expression - will be caught when we parse it later. */ + will be caught when we parse it later. + + *expression is set to the expression. For an '=' "debug" expression, + *expr_text is set to the debug text (the original text of the expression, + *including the '=' and any whitespace around it, as a string object). If + *not a debug expression, *expr_text set to NULL. */ static int fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, - expr_ty *expression, struct compiling *c, const node *n) + PyObject **expr_text, expr_ty *expression, + struct compiling *c, const node *n) { /* Return -1 on error, else 0. */ @@ -5020,9 +5026,6 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, int conversion = -1; /* The conversion char. Use default if not specified, or !r if using = and no format spec. */ - int equal_flag = 0; /* Are we using the = feature? */ - PyObject *expr_text = NULL; /* The text of the expression, used for =. */ - const char *expr_text_end; /* 0 if we're not in a string, else the quote char we're trying to match (single or double quote). */ @@ -5198,7 +5201,6 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, expr_text. */ if (**str == '=') { *str += 1; - equal_flag = 1; /* Skip over ASCII whitespace. No need to test for end of string here, since we know there's at least a trailing quote somewhere @@ -5206,7 +5208,14 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, while (Py_ISSPACE(**str)) { *str += 1; } - expr_text_end = *str; + + /* Set *expr_text to the text of the expression. */ + *expr_text = PyUnicode_FromStringAndSize(expr_start, *str-expr_start); + if (!*expr_text) { + goto error; + } + } else { + *expr_text = NULL; } /* Check for a conversion char, if present. */ @@ -5227,17 +5236,6 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, } } - if (equal_flag) { - Py_ssize_t len = expr_text_end - expr_start; - expr_text = PyUnicode_FromStringAndSize(expr_start, len); - if (!expr_text) { - goto error; - } - if (PyArena_AddPyObject(c->c_arena, expr_text) < 0) { - Py_DECREF(expr_text); - goto error; - } - } /* Check for the format spec, if present. */ if (*str >= end) @@ -5261,16 +5259,16 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, assert(**str == '}'); *str += 1; - /* If we're in = mode, and have no format spec and no explict conversion, - set the conversion to 'r'. */ - if (equal_flag && format_spec == NULL && conversion == -1) { + /* If we're in = mode (detected by non-NULL expr_text), and have no format + spec and no explict conversion, set the conversion to 'r'. */ + if (*expr_text && format_spec == NULL && conversion == -1) { conversion = 'r'; } /* And now create the FormattedValue node that represents this entire expression with the conversion and format spec. */ *expression = FormattedValue(simple_expression, conversion, - format_spec, expr_text, LINENO(n), + format_spec, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); if (!*expression) @@ -5313,7 +5311,7 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, static int fstring_find_literal_and_expr(const char **str, const char *end, int raw, int recurse_lvl, PyObject **literal, - expr_ty *expression, + PyObject **expr_text, expr_ty *expression, struct compiling *c, const node *n) { int result; @@ -5341,7 +5339,8 @@ fstring_find_literal_and_expr(const char **str, const char *end, int raw, /* We must now be the start of an expression, on a '{'. */ assert(**str == '{'); - if (fstring_find_expr(str, end, raw, recurse_lvl, expression, c, n) < 0) + if (fstring_find_expr(str, end, raw, recurse_lvl, expr_text, + expression, c, n) < 0) goto error; return 0; @@ -5604,7 +5603,7 @@ FstringParser_ConcatFstring(FstringParser *state, const char **str, /* Parse the f-string. */ while (1) { - PyObject *literal = NULL; + PyObject *literal[2] = {NULL, NULL}; expr_ty expression = NULL; /* If there's a zero length literal in front of the @@ -5612,31 +5611,34 @@ FstringParser_ConcatFstring(FstringParser *state, const char **str, the f-string, expression will be NULL (unless result == 1, see below). */ int result = fstring_find_literal_and_expr(str, end, raw, recurse_lvl, - &literal, &expression, - c, n); + &literal[0], &literal[1], + &expression, c, n); if (result < 0) return -1; - /* Add the literal, if any. */ - if (!literal) { - /* Do nothing. Just leave last_str alone (and possibly - NULL). */ - } else if (!state->last_str) { - /* Note that the literal can be zero length, if the - input string is "\\\n" or "\\\r", among others. */ - state->last_str = literal; - literal = NULL; - } else { - /* We have a literal, concatenate it. */ - assert(PyUnicode_GET_LENGTH(literal) != 0); - if (FstringParser_ConcatAndDel(state, literal) < 0) - return -1; - literal = NULL; + /* Add the literals, if any. */ + for (int i = 0; i < 2; i++) { + if (!literal[i]) { + /* Do nothing. Just leave last_str alone (and possibly + NULL). */ + } else if (!state->last_str) { + /* Note that the literal can be zero length, if the + input string is "\\\n" or "\\\r", among others. */ + state->last_str = literal[i]; + literal[i] = NULL; + } else { + /* We have a literal, concatenate it. */ + assert(PyUnicode_GET_LENGTH(literal[i]) != 0); + if (FstringParser_ConcatAndDel(state, literal[i]) < 0) + return -1; + literal[i] = NULL; + } } - /* We've dealt with the literal now. It can't be leaked on further + /* We've dealt with the literals now. They can't be leaked on further errors. */ - assert(literal == NULL); + assert(literal[0] == NULL); + assert(literal[1] == NULL); /* See if we should just loop around to get the next literal and expression, while ignoring the expression this diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index f1b991a7c387..f376e86ddc4c 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -665,11 +665,6 @@ append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) } Py_DECREF(temp_fv_str); - if (e->v.FormattedValue.expr_text) { - /* Use the = for debug text expansion. */ - APPEND_STR("="); - } - if (e->v.FormattedValue.conversion > 0) { switch (e->v.FormattedValue.conversion) { case 'a': diff --git a/Python/compile.c b/Python/compile.c index 425d0d68ac4a..f1c97bdfe47f 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3963,12 +3963,6 @@ compiler_formatted_value(struct compiler *c, expr_ty e) int conversion = e->v.FormattedValue.conversion; int oparg; - if (e->v.FormattedValue.expr_text) { - /* Push the text of the expression (which already has the '=' in - it. */ - ADDOP_LOAD_CONST(c, e->v.FormattedValue.expr_text); - } - /* The expression to be formatted. */ VISIT(c, expr, e->v.FormattedValue.value); @@ -3991,11 +3985,6 @@ compiler_formatted_value(struct compiler *c, expr_ty e) /* And push our opcode and oparg */ ADDOP_I(c, FORMAT_VALUE, oparg); - /* If we have expr_text, join the 2 strings on the stack. */ - if (e->v.FormattedValue.expr_text) { - ADDOP_I(c, BUILD_STRING, 2); - } - return 1; } From webhook-mailer at python.org Mon May 27 15:56:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 May 2019 19:56:28 -0000 Subject: [Python-checkins] bpo-36889: Merge asyncio streams (GH-13251) Message-ID: https://github.com/python/cpython/commit/23b4b697e5b6cc897696f9c0288c187d2d24bff2 commit: 23b4b697e5b6cc897696f9c0288c187d2d24bff2 branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-27T12:56:22-07:00 summary: bpo-36889: Merge asyncio streams (GH-13251) https://bugs.python.org/issue36889 files: A Misc/NEWS.d/next/Library/2019-05-14-12-25-44.bpo-36889.MChPqP.rst M Lib/asyncio/__init__.py M Lib/asyncio/streams.py M Lib/asyncio/subprocess.py M Lib/asyncio/windows_events.py M Lib/test/test___all__.py M Lib/test/test_asyncio/test_base_events.py M Lib/test/test_asyncio/test_buffered_proto.py M Lib/test/test_asyncio/test_pep492.py M Lib/test/test_asyncio/test_server.py M Lib/test/test_asyncio/test_sslproto.py M Lib/test/test_asyncio/test_streams.py M Lib/test/test_asyncio/test_windows_events.py diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py index 28c2e2c429f3..a6a29dbfecd5 100644 --- a/Lib/asyncio/__init__.py +++ b/Lib/asyncio/__init__.py @@ -3,6 +3,7 @@ # flake8: noqa import sys +import warnings # This relies on each of the submodules having an __all__ variable. from .base_events import * @@ -43,3 +44,40 @@ else: from .unix_events import * # pragma: no cover __all__ += unix_events.__all__ + + +__all__ += ('StreamReader', 'StreamWriter', 'StreamReaderProtocol') # deprecated + + +def __getattr__(name): + global StreamReader, StreamWriter, StreamReaderProtocol + if name == 'StreamReader': + warnings.warn("StreamReader is deprecated since Python 3.8 " + "in favor of Stream, and scheduled for removal " + "in Python 3.10", + DeprecationWarning, + stacklevel=2) + from .streams import StreamReader as sr + StreamReader = sr + return StreamReader + if name == 'StreamWriter': + warnings.warn("StreamWriter is deprecated since Python 3.8 " + "in favor of Stream, and scheduled for removal " + "in Python 3.10", + DeprecationWarning, + stacklevel=2) + from .streams import StreamWriter as sw + StreamWriter = sw + return StreamWriter + if name == 'StreamReaderProtocol': + warnings.warn("Using asyncio internal class StreamReaderProtocol " + "is deprecated since Python 3.8 " + " and scheduled for removal " + "in Python 3.10", + DeprecationWarning, + stacklevel=2) + from .streams import StreamReaderProtocol as srp + StreamReaderProtocol = srp + return StreamReaderProtocol + + raise AttributeError(f"module {__name__} has no attribute {name}") diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 2f0cbfdbe852..480f1a3fdd74 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -1,14 +1,19 @@ __all__ = ( - 'StreamReader', 'StreamWriter', 'StreamReaderProtocol', - 'open_connection', 'start_server') + 'Stream', 'StreamMode', + 'open_connection', 'start_server', + 'connect', 'connect_read_pipe', 'connect_write_pipe', + 'StreamServer') +import enum import socket import sys import warnings import weakref if hasattr(socket, 'AF_UNIX'): - __all__ += ('open_unix_connection', 'start_unix_server') + __all__ += ('open_unix_connection', 'start_unix_server', + 'connect_unix', + 'UnixStreamServer') from . import coroutines from . import events @@ -16,12 +21,134 @@ from . import format_helpers from . import protocols from .log import logger -from .tasks import sleep +from . import tasks _DEFAULT_LIMIT = 2 ** 16 # 64 KiB +class StreamMode(enum.Flag): + READ = enum.auto() + WRITE = enum.auto() + READWRITE = READ | WRITE + + +def _ensure_can_read(mode): + if not mode & StreamMode.READ: + raise RuntimeError("The stream is write-only") + + +def _ensure_can_write(mode): + if not mode & StreamMode.WRITE: + raise RuntimeError("The stream is read-only") + + +class _ContextManagerHelper: + __slots__ = ('_awaitable', '_result') + + def __init__(self, awaitable): + self._awaitable = awaitable + self._result = None + + def __await__(self): + return self._awaitable.__await__() + + async def __aenter__(self): + ret = await self._awaitable + result = await ret.__aenter__() + self._result = result + return result + + async def __aexit__(self, exc_type, exc_val, exc_tb): + return await self._result.__aexit__(exc_type, exc_val, exc_tb) + + +def connect(host=None, port=None, *, + limit=_DEFAULT_LIMIT, + ssl=None, family=0, proto=0, + flags=0, sock=None, local_addr=None, + server_hostname=None, + ssl_handshake_timeout=None, + happy_eyeballs_delay=None, interleave=None): + # Design note: + # Don't use decorator approach but exilicit non-async + # function to fail fast and explicitly + # if passed arguments don't match the function signature + return _ContextManagerHelper(_connect(host, port, limit, + ssl, family, proto, + flags, sock, local_addr, + server_hostname, + ssl_handshake_timeout, + happy_eyeballs_delay, + interleave)) + + +async def _connect(host, port, + limit, + ssl, family, proto, + flags, sock, local_addr, + server_hostname, + ssl_handshake_timeout, + happy_eyeballs_delay, interleave): + loop = events.get_running_loop() + stream = Stream(mode=StreamMode.READWRITE, + limit=limit, + loop=loop, + _asyncio_internal=True) + await loop.create_connection( + lambda: _StreamProtocol(stream, loop=loop, + _asyncio_internal=True), + host, port, + ssl=ssl, family=family, proto=proto, + flags=flags, sock=sock, local_addr=local_addr, + server_hostname=server_hostname, + ssl_handshake_timeout=ssl_handshake_timeout, + happy_eyeballs_delay=happy_eyeballs_delay, interleave=interleave) + return stream + + +def connect_read_pipe(pipe, *, limit=_DEFAULT_LIMIT): + # Design note: + # Don't use decorator approach but explicit non-async + # function to fail fast and explicitly + # if passed arguments don't match the function signature + return _ContextManagerHelper(_connect_read_pipe(pipe, limit)) + + +async def _connect_read_pipe(pipe, limit): + loop = events.get_running_loop() + stream = Stream(mode=StreamMode.READ, + limit=limit, + loop=loop, + _asyncio_internal=True) + await loop.connect_read_pipe( + lambda: _StreamProtocol(stream, loop=loop, + _asyncio_internal=True), + pipe) + return stream + + +def connect_write_pipe(pipe, *, limit=_DEFAULT_LIMIT): + # Design note: + # Don't use decorator approach but explicit non-async + # function to fail fast and explicitly + # if passed arguments don't match the function signature + return _ContextManagerHelper(_connect_write_pipe(pipe, limit)) + + +async def _connect_write_pipe(pipe, limit): + loop = events.get_running_loop() + stream = Stream(mode=StreamMode.WRITE, + limit=limit, + loop=loop, + _asyncio_internal=True) + await loop.connect_write_pipe( + lambda: _StreamProtocol(stream, loop=loop, + _asyncio_internal=True), + pipe) + return stream + + async def open_connection(host=None, port=None, *, loop=None, limit=_DEFAULT_LIMIT, **kwds): """A wrapper for create_connection() returning a (reader, writer) pair. @@ -41,16 +168,18 @@ StreamReaderProtocol classes, just copy the code -- there's really nothing special here except some convenience.) """ + warnings.warn("open_connection() is deprecated since Python 3.8 " + "in favor of connect(), and scheduled for removal " + "in Python 3.10", + DeprecationWarning, + stacklevel=2) if loop is None: loop = events.get_event_loop() - reader = StreamReader(limit=limit, loop=loop, - _asyncio_internal=True) - protocol = StreamReaderProtocol(reader, loop=loop, - _asyncio_internal=True) + reader = StreamReader(limit=limit, loop=loop) + protocol = StreamReaderProtocol(reader, loop=loop, _asyncio_internal=True) transport, _ = await loop.create_connection( lambda: protocol, host, port, **kwds) - writer = StreamWriter(transport, protocol, reader, loop, - _asyncio_internal=True) + writer = StreamWriter(transport, protocol, reader, loop) return reader, writer @@ -77,12 +206,16 @@ The return value is the same as loop.create_server(), i.e. a Server object which can be used to stop the service. """ + warnings.warn("start_server() is deprecated since Python 3.8 " + "in favor of StreamServer(), and scheduled for removal " + "in Python 3.10", + DeprecationWarning, + stacklevel=2) if loop is None: loop = events.get_event_loop() def factory(): - reader = StreamReader(limit=limit, loop=loop, - _asyncio_internal=True) + reader = StreamReader(limit=limit, loop=loop) protocol = StreamReaderProtocol(reader, client_connected_cb, loop=loop, _asyncio_internal=True) @@ -91,33 +224,258 @@ def factory(): return await loop.create_server(factory, host, port, **kwds) +class _BaseStreamServer: + # Design notes. + # StreamServer and UnixStreamServer are exposed as FINAL classes, + # not function factories. + # async with serve(host, port) as server: + # server.start_serving() + # looks ugly. + # The class doesn't provide API for enumerating connected streams + # It can be a subject for improvements in Python 3.9 + + _server_impl = None + + def __init__(self, client_connected_cb, + /, + limit=_DEFAULT_LIMIT, + shutdown_timeout=60, + _asyncio_internal=False): + if not _asyncio_internal: + raise RuntimeError("_ServerStream is a private asyncio class") + self._client_connected_cb = client_connected_cb + self._limit = limit + self._loop = events.get_running_loop() + self._streams = {} + self._shutdown_timeout = shutdown_timeout + + def __init_subclass__(cls): + if not cls.__module__.startswith('asyncio.'): + raise TypeError(f"asyncio.{cls.__name__} " + "class cannot be inherited from") + + async def bind(self): + if self._server_impl is not None: + return + self._server_impl = await self._bind() + + def is_bound(self): + return self._server_impl is not None + + @property + def sockets(self): + # multiple value for socket bound to both IPv4 and IPv6 families + if self._server_impl is None: + return () + return self._server_impl.sockets + + def is_serving(self): + if self._server_impl is None: + return False + return self._server_impl.is_serving() + + async def start_serving(self): + await self.bind() + await self._server_impl.start_serving() + + async def serve_forever(self): + await self.start_serving() + await self._server_impl.serve_forever() + + async def close(self): + if self._server_impl is None: + return + self._server_impl.close() + streams = list(self._streams.keys()) + active_tasks = list(self._streams.values()) + if streams: + await tasks.wait([stream.close() for stream in streams]) + await self._server_impl.wait_closed() + self._server_impl = None + await self._shutdown_active_tasks(active_tasks) + + async def abort(self): + if self._server_impl is None: + return + self._server_impl.close() + streams = list(self._streams.keys()) + active_tasks = list(self._streams.values()) + if streams: + await tasks.wait([stream.abort() for stream in streams]) + await self._server_impl.wait_closed() + self._server_impl = None + await self._shutdown_active_tasks(active_tasks) + + async def __aenter__(self): + await self.bind() + return self + + async def __aexit__(self, exc_type, exc_value, exc_tb): + await self.close() + + def _attach(self, stream, task): + self._streams[stream] = task + + def _detach(self, stream, task): + del self._streams[stream] + + async def _shutdown_active_tasks(self, active_tasks): + if not active_tasks: + return + # NOTE: tasks finished with exception are reported + # by the Task.__del__() method. + done, pending = await tasks.wait(active_tasks, + timeout=self._shutdown_timeout) + if not pending: + return + for task in pending: + task.cancel() + done, pending = await tasks.wait(pending, + timeout=self._shutdown_timeout) + for task in pending: + self._loop.call_exception_handler({ + "message": (f'{task!r} ignored cancellation request ' + f'from a closing {self!r}'), + "stream_server": self + }) + + def __repr__(self): + ret = [f'{self.__class__.__name__}'] + if self.is_serving(): + ret.append('serving') + if self.sockets: + ret.append(f'sockets={self.sockets!r}') + return '<' + ' '.join(ret) + '>' + + def __del__(self, _warn=warnings.warn): + if self._server_impl is not None: + _warn(f"unclosed stream server {self!r}", + ResourceWarning, source=self) + self._server_impl.close() + + +class StreamServer(_BaseStreamServer): + + def __init__(self, client_connected_cb, /, host=None, port=None, *, + limit=_DEFAULT_LIMIT, + family=socket.AF_UNSPEC, + flags=socket.AI_PASSIVE, sock=None, backlog=100, + ssl=None, reuse_address=None, reuse_port=None, + ssl_handshake_timeout=None, + shutdown_timeout=60): + super().__init__(client_connected_cb, + limit=limit, + shutdown_timeout=shutdown_timeout, + _asyncio_internal=True) + self._host = host + self._port = port + self._family = family + self._flags = flags + self._sock = sock + self._backlog = backlog + self._ssl = ssl + self._reuse_address = reuse_address + self._reuse_port = reuse_port + self._ssl_handshake_timeout = ssl_handshake_timeout + + async def _bind(self): + def factory(): + protocol = _ServerStreamProtocol(self, + self._limit, + self._client_connected_cb, + loop=self._loop, + _asyncio_internal=True) + return protocol + return await self._loop.create_server( + factory, + self._host, + self._port, + start_serving=False, + family=self._family, + flags=self._flags, + sock=self._sock, + backlog=self._backlog, + ssl=self._ssl, + reuse_address=self._reuse_address, + reuse_port=self._reuse_port, + ssl_handshake_timeout=self._ssl_handshake_timeout) + + if hasattr(socket, 'AF_UNIX'): # UNIX Domain Sockets are supported on this platform async def open_unix_connection(path=None, *, loop=None, limit=_DEFAULT_LIMIT, **kwds): """Similar to `open_connection` but works with UNIX Domain Sockets.""" + warnings.warn("open_unix_connection() is deprecated since Python 3.8 " + "in favor of connect_unix(), and scheduled for removal " + "in Python 3.10", + DeprecationWarning, + stacklevel=2) if loop is None: loop = events.get_event_loop() - reader = StreamReader(limit=limit, loop=loop, - _asyncio_internal=True) + reader = StreamReader(limit=limit, loop=loop) protocol = StreamReaderProtocol(reader, loop=loop, _asyncio_internal=True) transport, _ = await loop.create_unix_connection( lambda: protocol, path, **kwds) - writer = StreamWriter(transport, protocol, reader, loop, - _asyncio_internal=True) + writer = StreamWriter(transport, protocol, reader, loop) return reader, writer + + def connect_unix(path=None, *, + limit=_DEFAULT_LIMIT, + ssl=None, sock=None, + server_hostname=None, + ssl_handshake_timeout=None): + """Similar to `connect()` but works with UNIX Domain Sockets.""" + # Design note: + # Don't use decorator approach but exilicit non-async + # function to fail fast and explicitly + # if passed arguments don't match the function signature + return _ContextManagerHelper(_connect_unix(path, + limit, + ssl, sock, + server_hostname, + ssl_handshake_timeout)) + + + async def _connect_unix(path, + limit, + ssl, sock, + server_hostname, + ssl_handshake_timeout): + """Similar to `connect()` but works with UNIX Domain Sockets.""" + loop = events.get_running_loop() + stream = Stream(mode=StreamMode.READWRITE, + limit=limit, + loop=loop, + _asyncio_internal=True) + await loop.create_unix_connection( + lambda: _StreamProtocol(stream, + loop=loop, + _asyncio_internal=True), + path, + ssl=ssl, + sock=sock, + server_hostname=server_hostname, + ssl_handshake_timeout=ssl_handshake_timeout) + return stream + + async def start_unix_server(client_connected_cb, path=None, *, loop=None, limit=_DEFAULT_LIMIT, **kwds): """Similar to `start_server` but works with UNIX Domain Sockets.""" + warnings.warn("start_unix_server() is deprecated since Python 3.8 " + "in favor of UnixStreamServer(), and scheduled " + "for removal in Python 3.10", + DeprecationWarning, + stacklevel=2) if loop is None: loop = events.get_event_loop() def factory(): - reader = StreamReader(limit=limit, loop=loop, - _asyncio_internal=True) + reader = StreamReader(limit=limit, loop=loop) protocol = StreamReaderProtocol(reader, client_connected_cb, loop=loop, _asyncio_internal=True) @@ -125,6 +483,42 @@ def factory(): return await loop.create_unix_server(factory, path, **kwds) + class UnixStreamServer(_BaseStreamServer): + + def __init__(self, client_connected_cb, /, path=None, *, + limit=_DEFAULT_LIMIT, + sock=None, + backlog=100, + ssl=None, + ssl_handshake_timeout=None, + shutdown_timeout=60): + super().__init__(client_connected_cb, + limit=limit, + shutdown_timeout=shutdown_timeout, + _asyncio_internal=True) + self._path = path + self._sock = sock + self._backlog = backlog + self._ssl = ssl + self._ssl_handshake_timeout = ssl_handshake_timeout + + async def _bind(self): + def factory(): + protocol = _ServerStreamProtocol(self, + self._limit, + self._client_connected_cb, + loop=self._loop, + _asyncio_internal=True) + return protocol + return await self._loop.create_unix_server( + factory, + self._path, + start_serving=False, + sock=self._sock, + backlog=self._backlog, + ssl=self._ssl, + ssl_handshake_timeout=self._ssl_handshake_timeout) + class FlowControlMixin(protocols.Protocol): """Reusable flow control logic for StreamWriter.drain(). @@ -203,6 +597,8 @@ def _get_close_waiter(self, stream): raise NotImplementedError +# begin legacy stream APIs + class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): """Helper class to adapt between Protocol and StreamReader. @@ -212,105 +608,47 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): call inappropriate methods of the protocol.) """ - _source_traceback = None - def __init__(self, stream_reader, client_connected_cb=None, loop=None, *, _asyncio_internal=False): super().__init__(loop=loop, _asyncio_internal=_asyncio_internal) - if stream_reader is not None: - self._stream_reader_wr = weakref.ref(stream_reader, - self._on_reader_gc) - self._source_traceback = stream_reader._source_traceback - else: - self._stream_reader_wr = None - if client_connected_cb is not None: - # This is a stream created by the `create_server()` function. - # Keep a strong reference to the reader until a connection - # is established. - self._strong_reader = stream_reader - self._reject_connection = False + self._stream_reader = stream_reader self._stream_writer = None - self._transport = None self._client_connected_cb = client_connected_cb self._over_ssl = False self._closed = self._loop.create_future() - def _on_reader_gc(self, wr): - transport = self._transport - if transport is not None: - # connection_made was called - context = { - 'message': ('An open stream object is being garbage ' - 'collected; call "stream.close()" explicitly.') - } - if self._source_traceback: - context['source_traceback'] = self._source_traceback - self._loop.call_exception_handler(context) - transport.abort() - else: - self._reject_connection = True - self._stream_reader_wr = None - - @property - def _stream_reader(self): - if self._stream_reader_wr is None: - return None - return self._stream_reader_wr() - def connection_made(self, transport): - if self._reject_connection: - context = { - 'message': ('An open stream was garbage collected prior to ' - 'establishing network connection; ' - 'call "stream.close()" explicitly.') - } - if self._source_traceback: - context['source_traceback'] = self._source_traceback - self._loop.call_exception_handler(context) - transport.abort() - return - self._transport = transport - reader = self._stream_reader - if reader is not None: - reader.set_transport(transport) + self._stream_reader.set_transport(transport) self._over_ssl = transport.get_extra_info('sslcontext') is not None if self._client_connected_cb is not None: self._stream_writer = StreamWriter(transport, self, - reader, - self._loop, - _asyncio_internal=True) - res = self._client_connected_cb(reader, + self._stream_reader, + self._loop) + res = self._client_connected_cb(self._stream_reader, self._stream_writer) if coroutines.iscoroutine(res): self._loop.create_task(res) - self._strong_reader = None def connection_lost(self, exc): - reader = self._stream_reader - if reader is not None: + if self._stream_reader is not None: if exc is None: - reader.feed_eof() + self._stream_reader.feed_eof() else: - reader.set_exception(exc) + self._stream_reader.set_exception(exc) if not self._closed.done(): if exc is None: self._closed.set_result(None) else: self._closed.set_exception(exc) super().connection_lost(exc) - self._stream_reader_wr = None + self._stream_reader = None self._stream_writer = None - self._transport = None def data_received(self, data): - reader = self._stream_reader - if reader is not None: - reader.feed_data(data) + self._stream_reader.feed_data(data) def eof_received(self): - reader = self._stream_reader - if reader is not None: - reader.feed_eof() + self._stream_reader.feed_eof() if self._over_ssl: # Prevent a warning in SSLProtocol.eof_received: # "returning true from eof_received() @@ -318,9 +656,6 @@ def eof_received(self): return False return True - def _get_close_waiter(self, stream): - return self._closed - def __del__(self): # Prevent reports about unhandled exceptions. # Better than self._closed._log_traceback = False hack @@ -329,13 +664,6 @@ def __del__(self): closed.exception() -def _swallow_unhandled_exception(task): - # Do a trick to suppress unhandled exception - # if stream.write() was used without await and - # stream.drain() was paused and resumed with an exception - task.exception() - - class StreamWriter: """Wraps a Transport. @@ -346,21 +674,13 @@ class StreamWriter: directly. """ - def __init__(self, transport, protocol, reader, loop, - *, _asyncio_internal=False): - if not _asyncio_internal: - warnings.warn(f"{self.__class__} should be instaniated " - "by asyncio internals only, " - "please avoid its creation from user code", - DeprecationWarning) + def __init__(self, transport, protocol, reader, loop): self._transport = transport self._protocol = protocol # drain() expects that the reader has an exception() method assert reader is None or isinstance(reader, StreamReader) self._reader = reader self._loop = loop - self._complete_fut = self._loop.create_future() - self._complete_fut.set_result(None) def __repr__(self): info = [self.__class__.__name__, f'transport={self._transport!r}'] @@ -374,35 +694,9 @@ def transport(self): def write(self, data): self._transport.write(data) - return self._fast_drain() def writelines(self, data): self._transport.writelines(data) - return self._fast_drain() - - def _fast_drain(self): - # The helper tries to use fast-path to return already existing complete future - # object if underlying transport is not paused and actual waiting for writing - # resume is not needed - if self._reader is not None: - # this branch will be simplified after merging reader with writer - exc = self._reader.exception() - if exc is not None: - fut = self._loop.create_future() - fut.set_exception(exc) - return fut - if not self._transport.is_closing(): - if self._protocol._connection_lost: - fut = self._loop.create_future() - fut.set_exception(ConnectionResetError('Connection lost')) - return fut - if not self._protocol._paused: - # fast path, the stream is not paused - # no need to wait for resume signal - return self._complete_fut - ret = self._loop.create_task(self.drain()) - ret.add_done_callback(_swallow_unhandled_exception) - return ret def write_eof(self): return self._transport.write_eof() @@ -411,14 +705,13 @@ def can_write_eof(self): return self._transport.can_write_eof() def close(self): - self._transport.close() - return self._protocol._get_close_waiter(self) + return self._transport.close() def is_closing(self): return self._transport.is_closing() async def wait_closed(self): - await self._protocol._get_close_waiter(self) + await self._protocol._closed def get_extra_info(self, name, default=None): return self._transport.get_extra_info(name, default) @@ -436,25 +729,19 @@ def get_extra_info(self, name, default=None): if exc is not None: raise exc if self._transport.is_closing(): - # Wait for protocol.connection_lost() call - # Raise connection closing error if any, - # ConnectionResetError otherwise - await sleep(0) + # Yield to the event loop so connection_lost() may be + # called. Without this, _drain_helper() would return + # immediately, and code that calls + # write(...); await drain() + # in a loop would never call connection_lost(), so it + # would not see an error when the socket is closed. + await tasks.sleep(0, loop=self._loop) await self._protocol._drain_helper() class StreamReader: - _source_traceback = None - - def __init__(self, limit=_DEFAULT_LIMIT, loop=None, - *, _asyncio_internal=False): - if not _asyncio_internal: - warnings.warn(f"{self.__class__} should be instaniated " - "by asyncio internals only, " - "please avoid its creation from user code", - DeprecationWarning) - + def __init__(self, limit=_DEFAULT_LIMIT, loop=None): # The line length limit is a security feature; # it also doubles as half the buffer limit. @@ -472,9 +759,6 @@ def __init__(self, limit=_DEFAULT_LIMIT, loop=None, self._exception = None self._transport = None self._paused = False - if self._loop.get_debug(): - self._source_traceback = format_helpers.extract_stack( - sys._getframe(1)) def __repr__(self): info = ['StreamReader'] @@ -802,3 +1086,671 @@ def __aiter__(self): if val == b'': raise StopAsyncIteration return val + + +# end legacy stream APIs + + +class _BaseStreamProtocol(FlowControlMixin, protocols.Protocol): + """Helper class to adapt between Protocol and StreamReader. + + (This is a helper class instead of making StreamReader itself a + Protocol subclass, because the StreamReader has other potential + uses, and to prevent the user of the StreamReader to accidentally + call inappropriate methods of the protocol.) + """ + + _stream = None # initialized in derived classes + + def __init__(self, loop=None, + *, _asyncio_internal=False): + super().__init__(loop=loop, _asyncio_internal=_asyncio_internal) + self._transport = None + self._over_ssl = False + self._closed = self._loop.create_future() + + def connection_made(self, transport): + self._transport = transport + self._over_ssl = transport.get_extra_info('sslcontext') is not None + + def connection_lost(self, exc): + stream = self._stream + if stream is not None: + if exc is None: + stream.feed_eof() + else: + stream.set_exception(exc) + if not self._closed.done(): + if exc is None: + self._closed.set_result(None) + else: + self._closed.set_exception(exc) + super().connection_lost(exc) + self._transport = None + + def data_received(self, data): + stream = self._stream + if stream is not None: + stream.feed_data(data) + + def eof_received(self): + stream = self._stream + if stream is not None: + stream.feed_eof() + if self._over_ssl: + # Prevent a warning in SSLProtocol.eof_received: + # "returning true from eof_received() + # has no effect when using ssl" + return False + return True + + def _get_close_waiter(self, stream): + return self._closed + + def __del__(self): + # Prevent reports about unhandled exceptions. + # Better than self._closed._log_traceback = False hack + closed = self._get_close_waiter(self._stream) + if closed.done() and not closed.cancelled(): + closed.exception() + + +class _StreamProtocol(_BaseStreamProtocol): + _source_traceback = None + + def __init__(self, stream, loop=None, + *, _asyncio_internal=False): + super().__init__(loop=loop, _asyncio_internal=_asyncio_internal) + self._source_traceback = stream._source_traceback + self._stream_wr = weakref.ref(stream, self._on_gc) + self._reject_connection = False + + def _on_gc(self, wr): + transport = self._transport + if transport is not None: + # connection_made was called + context = { + 'message': ('An open stream object is being garbage ' + 'collected; call "stream.close()" explicitly.') + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + transport.abort() + else: + self._reject_connection = True + self._stream_wr = None + + @property + def _stream(self): + if self._stream_wr is None: + return None + return self._stream_wr() + + def connection_made(self, transport): + if self._reject_connection: + context = { + 'message': ('An open stream was garbage collected prior to ' + 'establishing network connection; ' + 'call "stream.close()" explicitly.') + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + transport.abort() + return + super().connection_made(transport) + stream = self._stream + if stream is None: + return + stream.set_transport(transport) + stream._protocol = self + + def connection_lost(self, exc): + super().connection_lost(exc) + self._stream_wr = None + + +class _ServerStreamProtocol(_BaseStreamProtocol): + def __init__(self, server, limit, client_connected_cb, loop=None, + *, _asyncio_internal=False): + super().__init__(loop=loop, _asyncio_internal=_asyncio_internal) + assert self._closed + self._client_connected_cb = client_connected_cb + self._limit = limit + self._server = server + self._task = None + + def connection_made(self, transport): + super().connection_made(transport) + stream = Stream(mode=StreamMode.READWRITE, + transport=transport, + protocol=self, + limit=self._limit, + loop=self._loop, + is_server_side=True, + _asyncio_internal=True) + self._stream = stream + # If self._client_connected_cb(self._stream) fails + # the exception is logged by transport + self._task = self._loop.create_task( + self._client_connected_cb(self._stream)) + self._server._attach(stream, self._task) + + def connection_lost(self, exc): + super().connection_lost(exc) + self._server._detach(self._stream, self._task) + self._stream = None + + +class _OptionalAwait: + # The class doesn't create a coroutine + # if not awaited + # It prevents "coroutine is never awaited" message + + __slots___ = ('_method',) + + def __init__(self, method): + self._method = method + + def __await__(self): + return self._method().__await__() + + +class Stream: + """Wraps a Transport. + + This exposes write(), writelines(), [can_]write_eof(), + get_extra_info() and close(). It adds drain() which returns an + optional Future on which you can wait for flow control. It also + adds a transport property which references the Transport + directly. + """ + + _source_traceback = None + + def __init__(self, mode, *, + transport=None, + protocol=None, + loop=None, + limit=_DEFAULT_LIMIT, + is_server_side=False, + _asyncio_internal=False): + if not _asyncio_internal: + warnings.warn(f"{self.__class__} should be instaniated " + "by asyncio internals only, " + "please avoid its creation from user code", + DeprecationWarning) + self._mode = mode + self._transport = transport + self._protocol = protocol + self._is_server_side = is_server_side + + # The line length limit is a security feature; + # it also doubles as half the buffer limit. + + if limit <= 0: + raise ValueError('Limit cannot be <= 0') + + self._limit = limit + if loop is None: + self._loop = events.get_event_loop() + else: + self._loop = loop + self._buffer = bytearray() + self._eof = False # Whether we're done. + self._waiter = None # A future used by _wait_for_data() + self._exception = None + self._paused = False + self._complete_fut = self._loop.create_future() + self._complete_fut.set_result(None) + + if self._loop.get_debug(): + self._source_traceback = format_helpers.extract_stack( + sys._getframe(1)) + + def __repr__(self): + info = [self.__class__.__name__] + info.append(f'mode={self._mode}') + if self._buffer: + info.append(f'{len(self._buffer)} bytes') + if self._eof: + info.append('eof') + if self._limit != _DEFAULT_LIMIT: + info.append(f'limit={self._limit}') + if self._waiter: + info.append(f'waiter={self._waiter!r}') + if self._exception: + info.append(f'exception={self._exception!r}') + if self._transport: + info.append(f'transport={self._transport!r}') + if self._paused: + info.append('paused') + return '<{}>'.format(' '.join(info)) + + @property + def mode(self): + return self._mode + + def is_server_side(self): + return self._is_server_side + + @property + def transport(self): + return self._transport + + def write(self, data): + _ensure_can_write(self._mode) + self._transport.write(data) + return self._fast_drain() + + def writelines(self, data): + _ensure_can_write(self._mode) + self._transport.writelines(data) + return self._fast_drain() + + def _fast_drain(self): + # The helper tries to use fast-path to return already existing + # complete future object if underlying transport is not paused + #and actual waiting for writing resume is not needed + exc = self.exception() + if exc is not None: + fut = self._loop.create_future() + fut.set_exception(exc) + return fut + if not self._transport.is_closing(): + if self._protocol._connection_lost: + fut = self._loop.create_future() + fut.set_exception(ConnectionResetError('Connection lost')) + return fut + if not self._protocol._paused: + # fast path, the stream is not paused + # no need to wait for resume signal + return self._complete_fut + return _OptionalAwait(self.drain) + + def write_eof(self): + _ensure_can_write(self._mode) + return self._transport.write_eof() + + def can_write_eof(self): + if not self._mode.is_write(): + return False + return self._transport.can_write_eof() + + def close(self): + self._transport.close() + return _OptionalAwait(self.wait_closed) + + def is_closing(self): + return self._transport.is_closing() + + async def abort(self): + self._transport.abort() + await self.wait_closed() + + async def wait_closed(self): + await self._protocol._get_close_waiter(self) + + def get_extra_info(self, name, default=None): + return self._transport.get_extra_info(name, default) + + async def drain(self): + """Flush the write buffer. + + The intended use is to write + + w.write(data) + await w.drain() + """ + _ensure_can_write(self._mode) + exc = self.exception() + if exc is not None: + raise exc + if self._transport.is_closing(): + # Wait for protocol.connection_lost() call + # Raise connection closing error if any, + # ConnectionResetError otherwise + await tasks.sleep(0) + await self._protocol._drain_helper() + + async def sendfile(self, file, offset=0, count=None, *, fallback=True): + await self.drain() # check for stream mode and exceptions + return await self._loop.sendfile(self._transport, file, + offset, count, fallback=fallback) + + async def start_tls(self, sslcontext, *, + server_hostname=None, + ssl_handshake_timeout=None): + await self.drain() # check for stream mode and exceptions + transport = await self._loop.start_tls( + self._transport, self._protocol, sslcontext, + server_side=self._is_server_side, + server_hostname=server_hostname, + ssl_handshake_timeout=ssl_handshake_timeout) + self._transport = transport + self._protocol._transport = transport + self._protocol._over_ssl = True + + def exception(self): + return self._exception + + def set_exception(self, exc): + self._exception = exc + + waiter = self._waiter + if waiter is not None: + self._waiter = None + if not waiter.cancelled(): + waiter.set_exception(exc) + + def _wakeup_waiter(self): + """Wakeup read*() functions waiting for data or EOF.""" + waiter = self._waiter + if waiter is not None: + self._waiter = None + if not waiter.cancelled(): + waiter.set_result(None) + + def set_transport(self, transport): + if transport is self._transport: + return + assert self._transport is None, 'Transport already set' + self._transport = transport + + def _maybe_resume_transport(self): + if self._paused and len(self._buffer) <= self._limit: + self._paused = False + self._transport.resume_reading() + + def feed_eof(self): + self._eof = True + self._wakeup_waiter() + + def at_eof(self): + """Return True if the buffer is empty and 'feed_eof' was called.""" + return self._eof and not self._buffer + + def feed_data(self, data): + _ensure_can_read(self._mode) + assert not self._eof, 'feed_data after feed_eof' + + if not data: + return + + self._buffer.extend(data) + self._wakeup_waiter() + + if (self._transport is not None and + not self._paused and + len(self._buffer) > 2 * self._limit): + try: + self._transport.pause_reading() + except NotImplementedError: + # The transport can't be paused. + # We'll just have to buffer all data. + # Forget the transport so we don't keep trying. + self._transport = None + else: + self._paused = True + + async def _wait_for_data(self, func_name): + """Wait until feed_data() or feed_eof() is called. + + If stream was paused, automatically resume it. + """ + # StreamReader uses a future to link the protocol feed_data() method + # to a read coroutine. Running two read coroutines at the same time + # would have an unexpected behaviour. It would not possible to know + # which coroutine would get the next data. + if self._waiter is not None: + raise RuntimeError( + f'{func_name}() called while another coroutine is ' + f'already waiting for incoming data') + + assert not self._eof, '_wait_for_data after EOF' + + # Waiting for data while paused will make deadlock, so prevent it. + # This is essential for readexactly(n) for case when n > self._limit. + if self._paused: + self._paused = False + self._transport.resume_reading() + + self._waiter = self._loop.create_future() + try: + await self._waiter + finally: + self._waiter = None + + async def readline(self): + """Read chunk of data from the stream until newline (b'\n') is found. + + On success, return chunk that ends with newline. If only partial + line can be read due to EOF, return incomplete line without + terminating newline. When EOF was reached while no bytes read, empty + bytes object is returned. + + If limit is reached, ValueError will be raised. In that case, if + newline was found, complete line including newline will be removed + from internal buffer. Else, internal buffer will be cleared. Limit is + compared against part of the line without newline. + + If stream was paused, this function will automatically resume it if + needed. + """ + _ensure_can_read(self._mode) + sep = b'\n' + seplen = len(sep) + try: + line = await self.readuntil(sep) + except exceptions.IncompleteReadError as e: + return e.partial + except exceptions.LimitOverrunError as e: + if self._buffer.startswith(sep, e.consumed): + del self._buffer[:e.consumed + seplen] + else: + self._buffer.clear() + self._maybe_resume_transport() + raise ValueError(e.args[0]) + return line + + async def readuntil(self, separator=b'\n'): + """Read data from the stream until ``separator`` is found. + + On success, the data and separator will be removed from the + internal buffer (consumed). Returned data will include the + separator at the end. + + Configured stream limit is used to check result. Limit sets the + maximal length of data that can be returned, not counting the + separator. + + If an EOF occurs and the complete separator is still not found, + an IncompleteReadError exception will be raised, and the internal + buffer will be reset. The IncompleteReadError.partial attribute + may contain the separator partially. + + If the data cannot be read because of over limit, a + LimitOverrunError exception will be raised, and the data + will be left in the internal buffer, so it can be read again. + """ + _ensure_can_read(self._mode) + seplen = len(separator) + if seplen == 0: + raise ValueError('Separator should be at least one-byte string') + + if self._exception is not None: + raise self._exception + + # Consume whole buffer except last bytes, which length is + # one less than seplen. Let's check corner cases with + # separator='SEPARATOR': + # * we have received almost complete separator (without last + # byte). i.e buffer='some textSEPARATO'. In this case we + # can safely consume len(separator) - 1 bytes. + # * last byte of buffer is first byte of separator, i.e. + # buffer='abcdefghijklmnopqrS'. We may safely consume + # everything except that last byte, but this require to + # analyze bytes of buffer that match partial separator. + # This is slow and/or require FSM. For this case our + # implementation is not optimal, since require rescanning + # of data that is known to not belong to separator. In + # real world, separator will not be so long to notice + # performance problems. Even when reading MIME-encoded + # messages :) + + # `offset` is the number of bytes from the beginning of the buffer + # where there is no occurrence of `separator`. + offset = 0 + + # Loop until we find `separator` in the buffer, exceed the buffer size, + # or an EOF has happened. + while True: + buflen = len(self._buffer) + + # Check if we now have enough data in the buffer for `separator` to + # fit. + if buflen - offset >= seplen: + isep = self._buffer.find(separator, offset) + + if isep != -1: + # `separator` is in the buffer. `isep` will be used later + # to retrieve the data. + break + + # see upper comment for explanation. + offset = buflen + 1 - seplen + if offset > self._limit: + raise exceptions.LimitOverrunError( + 'Separator is not found, and chunk exceed the limit', + offset) + + # Complete message (with full separator) may be present in buffer + # even when EOF flag is set. This may happen when the last chunk + # adds data which makes separator be found. That's why we check for + # EOF *ater* inspecting the buffer. + if self._eof: + chunk = bytes(self._buffer) + self._buffer.clear() + raise exceptions.IncompleteReadError(chunk, None) + + # _wait_for_data() will resume reading if stream was paused. + await self._wait_for_data('readuntil') + + if isep > self._limit: + raise exceptions.LimitOverrunError( + 'Separator is found, but chunk is longer than limit', isep) + + chunk = self._buffer[:isep + seplen] + del self._buffer[:isep + seplen] + self._maybe_resume_transport() + return bytes(chunk) + + async def read(self, n=-1): + """Read up to `n` bytes from the stream. + + If n is not provided, or set to -1, read until EOF and return all read + bytes. If the EOF was received and the internal buffer is empty, return + an empty bytes object. + + If n is zero, return empty bytes object immediately. + + If n is positive, this function try to read `n` bytes, and may return + less or equal bytes than requested, but at least one byte. If EOF was + received before any byte is read, this function returns empty byte + object. + + Returned value is not limited with limit, configured at stream + creation. + + If stream was paused, this function will automatically resume it if + needed. + """ + _ensure_can_read(self._mode) + + if self._exception is not None: + raise self._exception + + if n == 0: + return b'' + + if n < 0: + # This used to just loop creating a new waiter hoping to + # collect everything in self._buffer, but that would + # deadlock if the subprocess sends more than self.limit + # bytes. So just call self.read(self._limit) until EOF. + blocks = [] + while True: + block = await self.read(self._limit) + if not block: + break + blocks.append(block) + return b''.join(blocks) + + if not self._buffer and not self._eof: + await self._wait_for_data('read') + + # This will work right even if buffer is less than n bytes + data = bytes(self._buffer[:n]) + del self._buffer[:n] + + self._maybe_resume_transport() + return data + + async def readexactly(self, n): + """Read exactly `n` bytes. + + Raise an IncompleteReadError if EOF is reached before `n` bytes can be + read. The IncompleteReadError.partial attribute of the exception will + contain the partial read bytes. + + if n is zero, return empty bytes object. + + Returned value is not limited with limit, configured at stream + creation. + + If stream was paused, this function will automatically resume it if + needed. + """ + _ensure_can_read(self._mode) + if n < 0: + raise ValueError('readexactly size can not be less than zero') + + if self._exception is not None: + raise self._exception + + if n == 0: + return b'' + + while len(self._buffer) < n: + if self._eof: + incomplete = bytes(self._buffer) + self._buffer.clear() + raise exceptions.IncompleteReadError(incomplete, n) + + await self._wait_for_data('readexactly') + + if len(self._buffer) == n: + data = bytes(self._buffer) + self._buffer.clear() + else: + data = bytes(self._buffer[:n]) + del self._buffer[:n] + self._maybe_resume_transport() + return data + + def __aiter__(self): + _ensure_can_read(self._mode) + return self + + async def __anext__(self): + val = await self.readline() + if val == b'': + raise StopAsyncIteration + return val + + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + await self.close() diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index d34b6118fdcf..e6bec71d6c7d 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -27,6 +27,8 @@ def __init__(self, limit, loop, *, _asyncio_internal=False): self._process_exited = False self._pipe_fds = [] self._stdin_closed = self._loop.create_future() + self._stdout_closed = self._loop.create_future() + self._stderr_closed = self._loop.create_future() def __repr__(self): info = [self.__class__.__name__] @@ -40,30 +42,35 @@ def __repr__(self): def connection_made(self, transport): self._transport = transport - stdout_transport = transport.get_pipe_transport(1) if stdout_transport is not None: - self.stdout = streams.StreamReader(limit=self._limit, - loop=self._loop, - _asyncio_internal=True) + self.stdout = streams.Stream(mode=streams.StreamMode.READ, + transport=stdout_transport, + protocol=self, + limit=self._limit, + loop=self._loop, + _asyncio_internal=True) self.stdout.set_transport(stdout_transport) self._pipe_fds.append(1) stderr_transport = transport.get_pipe_transport(2) if stderr_transport is not None: - self.stderr = streams.StreamReader(limit=self._limit, - loop=self._loop, - _asyncio_internal=True) + self.stderr = streams.Stream(mode=streams.StreamMode.READ, + transport=stderr_transport, + protocol=self, + limit=self._limit, + loop=self._loop, + _asyncio_internal=True) self.stderr.set_transport(stderr_transport) self._pipe_fds.append(2) stdin_transport = transport.get_pipe_transport(0) if stdin_transport is not None: - self.stdin = streams.StreamWriter(stdin_transport, - protocol=self, - reader=None, - loop=self._loop, - _asyncio_internal=True) + self.stdin = streams.Stream(mode=streams.StreamMode.WRITE, + transport=stdin_transport, + protocol=self, + loop=self._loop, + _asyncio_internal=True) def pipe_data_received(self, fd, data): if fd == 1: @@ -114,6 +121,10 @@ def _maybe_close_transport(self): def _get_close_waiter(self, stream): if stream is self.stdin: return self._stdin_closed + elif stream is self.stdout: + return self._stdout_closed + elif stream is self.stderr: + return self._stderr_closed class Process: diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index b5b2e24c5ba4..61b40ba52a64 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -607,7 +607,7 @@ def finish_accept_pipe(trans, key, ov): # ConnectPipe() failed with ERROR_PIPE_BUSY: retry later delay = min(delay * 2, CONNECT_PIPE_MAX_DELAY) - await tasks.sleep(delay, loop=self._loop) + await tasks.sleep(delay) return windows_utils.PipeHandle(handle) diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py index f6e82eb64ab0..c077881511b8 100644 --- a/Lib/test/test___all__.py +++ b/Lib/test/test___all__.py @@ -30,21 +30,27 @@ def check_all(self, modname): raise NoAll(modname) names = {} with self.subTest(module=modname): - try: - exec("from %s import *" % modname, names) - except Exception as e: - # Include the module name in the exception string - self.fail("__all__ failure in {}: {}: {}".format( - modname, e.__class__.__name__, e)) - if "__builtins__" in names: - del names["__builtins__"] - if '__annotations__' in names: - del names['__annotations__'] - keys = set(names) - all_list = sys.modules[modname].__all__ - all_set = set(all_list) - self.assertCountEqual(all_set, all_list, "in module {}".format(modname)) - self.assertEqual(keys, all_set, "in module {}".format(modname)) + with support.check_warnings( + ("", DeprecationWarning), + ("", ResourceWarning), + quiet=True): + try: + exec("from %s import *" % modname, names) + except Exception as e: + # Include the module name in the exception string + self.fail("__all__ failure in {}: {}: {}".format( + modname, e.__class__.__name__, e)) + if "__builtins__" in names: + del names["__builtins__"] + if '__annotations__' in names: + del names['__annotations__'] + if "__warningregistry__" in names: + del names["__warningregistry__"] + keys = set(names) + all_list = sys.modules[modname].__all__ + all_set = set(all_list) + self.assertCountEqual(all_set, all_list, "in module {}".format(modname)) + self.assertEqual(keys, all_set, "in module {}".format(modname)) def walk_modules(self, basedir, modpath): for fn in sorted(os.listdir(basedir)): diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 31018c5c5636..02a97c60ac1a 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1152,8 +1152,9 @@ def test_create_server_stream_bittype(self): @unittest.skipUnless(hasattr(socket, 'AF_INET6'), 'no IPv6 support') def test_create_server_ipv6(self): async def main(): - srv = await asyncio.start_server( - lambda: None, '::1', 0, loop=self.loop) + with self.assertWarns(DeprecationWarning): + srv = await asyncio.start_server( + lambda: None, '::1', 0, loop=self.loop) try: self.assertGreater(len(srv.sockets), 0) finally: diff --git a/Lib/test/test_asyncio/test_buffered_proto.py b/Lib/test/test_asyncio/test_buffered_proto.py index f24e363ebfcf..b1531fb9343f 100644 --- a/Lib/test/test_asyncio/test_buffered_proto.py +++ b/Lib/test/test_asyncio/test_buffered_proto.py @@ -58,9 +58,10 @@ def on_buf(buf): writer.close() await writer.wait_closed() - srv = self.loop.run_until_complete( - asyncio.start_server( - on_server_client, '127.0.0.1', 0)) + with self.assertWarns(DeprecationWarning): + srv = self.loop.run_until_complete( + asyncio.start_server( + on_server_client, '127.0.0.1', 0)) addr = srv.sockets[0].getsockname() self.loop.run_until_complete( diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py index 297a3b3901d6..11c0ce495d52 100644 --- a/Lib/test/test_asyncio/test_pep492.py +++ b/Lib/test/test_asyncio/test_pep492.py @@ -94,7 +94,9 @@ class StreamReaderTests(BaseTest): def test_readline(self): DATA = b'line1\nline2\nline3' - stream = asyncio.StreamReader(loop=self.loop, _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(DATA) stream.feed_eof() diff --git a/Lib/test/test_asyncio/test_server.py b/Lib/test/test_asyncio/test_server.py index 4e758ad12e60..0e38e6c8ecd4 100644 --- a/Lib/test/test_asyncio/test_server.py +++ b/Lib/test/test_asyncio/test_server.py @@ -46,8 +46,9 @@ def client(sock, addr): async with srv: await srv.serve_forever() - srv = self.loop.run_until_complete(asyncio.start_server( - serve, support.HOSTv4, 0, loop=self.loop, start_serving=False)) + with self.assertWarns(DeprecationWarning): + srv = self.loop.run_until_complete(asyncio.start_server( + serve, support.HOSTv4, 0, loop=self.loop, start_serving=False)) self.assertFalse(srv.is_serving()) @@ -102,8 +103,9 @@ def client(sock, addr): await srv.serve_forever() with test_utils.unix_socket_path() as addr: - srv = self.loop.run_until_complete(asyncio.start_unix_server( - serve, addr, loop=self.loop, start_serving=False)) + with self.assertWarns(DeprecationWarning): + srv = self.loop.run_until_complete(asyncio.start_unix_server( + serve, addr, loop=self.loop, start_serving=False)) main_task = self.loop.create_task(main(srv)) diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 079b25585566..4215abf5d863 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -649,12 +649,13 @@ def server(sock): sock.close() async def client(addr): - reader, writer = await asyncio.open_connection( - *addr, - ssl=client_sslctx, - server_hostname='', - loop=self.loop, - ssl_handshake_timeout=1.0) + with self.assertWarns(DeprecationWarning): + reader, writer = await asyncio.open_connection( + *addr, + ssl=client_sslctx, + server_hostname='', + loop=self.loop, + ssl_handshake_timeout=1.0) with self.tcp_server(server, max_clients=1, @@ -688,12 +689,13 @@ def server(sock): sock.close() async def client(addr): - reader, writer = await asyncio.open_connection( - *addr, - ssl=client_sslctx, - server_hostname='', - loop=self.loop, - ssl_handshake_timeout=1.0) + with self.assertWarns(DeprecationWarning): + reader, writer = await asyncio.open_connection( + *addr, + ssl=client_sslctx, + server_hostname='', + loop=self.loop, + ssl_handshake_timeout=1.0) with self.tcp_server(server, max_clients=1, @@ -724,11 +726,12 @@ def server(sock): sock.close() async def client(addr): - reader, writer = await asyncio.open_connection( - *addr, - ssl=client_sslctx, - server_hostname='', - loop=self.loop) + with self.assertWarns(DeprecationWarning): + reader, writer = await asyncio.open_connection( + *addr, + ssl=client_sslctx, + server_hostname='', + loop=self.loop) self.assertEqual(await reader.readline(), b'A\n') writer.write(b'B') diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index fed609816dac..df3d7e7dfa45 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -1,6 +1,8 @@ """Tests for streams.py.""" +import contextlib import gc +import io import os import queue import pickle @@ -16,6 +18,7 @@ ssl = None import asyncio +from asyncio.streams import _StreamProtocol, _ensure_can_read, _ensure_can_write from test.test_asyncio import utils as test_utils @@ -23,6 +26,24 @@ def tearDownModule(): asyncio.set_event_loop_policy(None) +class StreamModeTests(unittest.TestCase): + def test__ensure_can_read_ok(self): + self.assertIsNone(_ensure_can_read(asyncio.StreamMode.READ)) + self.assertIsNone(_ensure_can_read(asyncio.StreamMode.READWRITE)) + + def test__ensure_can_read_fail(self): + with self.assertRaisesRegex(RuntimeError, "The stream is write-only"): + _ensure_can_read(asyncio.StreamMode.WRITE) + + def test__ensure_can_write_ok(self): + self.assertIsNone(_ensure_can_write(asyncio.StreamMode.WRITE)) + self.assertIsNone(_ensure_can_write(asyncio.StreamMode.READWRITE)) + + def test__ensure_can_write_fail(self): + with self.assertRaisesRegex(RuntimeError, "The stream is read-only"): + _ensure_can_write(asyncio.StreamMode.READ) + + class StreamTests(test_utils.TestCase): DATA = b'line1\nline2\nline3\n' @@ -42,13 +63,15 @@ def tearDown(self): @mock.patch('asyncio.streams.events') def test_ctor_global_loop(self, m_events): - stream = asyncio.StreamReader(_asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + _asyncio_internal=True) self.assertIs(stream._loop, m_events.get_event_loop.return_value) def _basetest_open_connection(self, open_connection_fut): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - reader, writer = self.loop.run_until_complete(open_connection_fut) + with self.assertWarns(DeprecationWarning): + reader, writer = self.loop.run_until_complete(open_connection_fut) writer.write(b'GET / HTTP/1.0\r\n\r\n') f = reader.readline() data = self.loop.run_until_complete(f) @@ -76,7 +99,9 @@ def _basetest_open_connection_no_loop_ssl(self, open_connection_fut): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) try: - reader, writer = self.loop.run_until_complete(open_connection_fut) + with self.assertWarns(DeprecationWarning): + reader, writer = self.loop.run_until_complete( + open_connection_fut) finally: asyncio.set_event_loop(None) writer.write(b'GET / HTTP/1.0\r\n\r\n') @@ -112,7 +137,8 @@ def test_open_unix_connection_no_loop_ssl(self): def _basetest_open_connection_error(self, open_connection_fut): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - reader, writer = self.loop.run_until_complete(open_connection_fut) + with self.assertWarns(DeprecationWarning): + reader, writer = self.loop.run_until_complete(open_connection_fut) writer._protocol.connection_lost(ZeroDivisionError()) f = reader.read() with self.assertRaises(ZeroDivisionError): @@ -135,23 +161,26 @@ def test_open_unix_connection_error(self): self._basetest_open_connection_error(conn_fut) def test_feed_empty_data(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'') self.assertEqual(b'', stream._buffer) def test_feed_nonempty_data(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA) self.assertEqual(self.DATA, stream._buffer) def test_read_zero(self): # Read zero bytes. - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA) data = self.loop.run_until_complete(stream.read(0)) @@ -160,8 +189,9 @@ def test_read_zero(self): def test_read(self): # Read bytes. - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) read_task = asyncio.Task(stream.read(30), loop=self.loop) def cb(): @@ -174,8 +204,9 @@ def cb(): def test_read_line_breaks(self): # Read bytes without line breaks. - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'line1') stream.feed_data(b'line2') @@ -186,8 +217,9 @@ def test_read_line_breaks(self): def test_read_eof(self): # Read bytes, stop at eof. - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) read_task = asyncio.Task(stream.read(1024), loop=self.loop) def cb(): @@ -200,8 +232,9 @@ def cb(): def test_read_until_eof(self): # Read all bytes until eof. - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) read_task = asyncio.Task(stream.read(-1), loop=self.loop) def cb(): @@ -216,8 +249,9 @@ def cb(): self.assertEqual(b'', stream._buffer) def test_read_exception(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'line\n') data = self.loop.run_until_complete(stream.read(2)) @@ -229,16 +263,19 @@ def test_read_exception(self): def test_invalid_limit(self): with self.assertRaisesRegex(ValueError, 'imit'): - asyncio.StreamReader(limit=0, loop=self.loop, - _asyncio_internal=True) + asyncio.Stream(mode=asyncio.StreamMode.READ, + limit=0, loop=self.loop, + _asyncio_internal=True) with self.assertRaisesRegex(ValueError, 'imit'): - asyncio.StreamReader(limit=-1, loop=self.loop, - _asyncio_internal=True) + asyncio.Stream(mode=asyncio.StreamMode.READ, + limit=-1, loop=self.loop, + _asyncio_internal=True) def test_read_limit(self): - stream = asyncio.StreamReader(limit=3, loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + limit=3, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'chunk') data = self.loop.run_until_complete(stream.read(5)) self.assertEqual(b'chunk', data) @@ -247,8 +284,9 @@ def test_read_limit(self): def test_readline(self): # Read one line. 'readline' will need to wait for the data # to come from 'cb' - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'chunk1 ') read_task = asyncio.Task(stream.readline(), loop=self.loop) @@ -263,11 +301,12 @@ def cb(): self.assertEqual(b' chunk4', stream._buffer) def test_readline_limit_with_existing_data(self): - # Read one line. The data is in StreamReader's buffer + # Read one line. The data is in Stream's buffer # before the event loop is run. - stream = asyncio.StreamReader(limit=3, loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + limit=3, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'li') stream.feed_data(b'ne1\nline2\n') @@ -276,8 +315,9 @@ def test_readline_limit_with_existing_data(self): # The buffer should contain the remaining data after exception self.assertEqual(b'line2\n', stream._buffer) - stream = asyncio.StreamReader(limit=3, loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + limit=3, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'li') stream.feed_data(b'ne1') stream.feed_data(b'li') @@ -292,8 +332,9 @@ def test_readline_limit_with_existing_data(self): self.assertEqual(b'', stream._buffer) def test_at_eof(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) self.assertFalse(stream.at_eof()) stream.feed_data(b'some data\n') @@ -308,11 +349,12 @@ def test_at_eof(self): self.assertTrue(stream.at_eof()) def test_readline_limit(self): - # Read one line. StreamReaders are fed with data after + # Read one line. Streams are fed with data after # their 'readline' methods are called. - stream = asyncio.StreamReader(limit=7, loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + limit=7, loop=self.loop, + _asyncio_internal=True) def cb(): stream.feed_data(b'chunk1') stream.feed_data(b'chunk2') @@ -326,8 +368,9 @@ def cb(): # a ValueError it should be empty. self.assertEqual(b'', stream._buffer) - stream = asyncio.StreamReader(limit=7, loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + limit=7, loop=self.loop, + _asyncio_internal=True) def cb(): stream.feed_data(b'chunk1') stream.feed_data(b'chunk2\n') @@ -340,8 +383,9 @@ def cb(): self.assertEqual(b'chunk3\n', stream._buffer) # check strictness of the limit - stream = asyncio.StreamReader(limit=7, loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + limit=7, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'1234567\n') line = self.loop.run_until_complete(stream.readline()) self.assertEqual(b'1234567\n', line) @@ -360,8 +404,9 @@ def cb(): def test_readline_nolimit_nowait(self): # All needed data for the first 'readline' call will be # in the buffer. - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA[:6]) stream.feed_data(self.DATA[6:]) @@ -371,8 +416,9 @@ def test_readline_nolimit_nowait(self): self.assertEqual(b'line2\nline3\n', stream._buffer) def test_readline_eof(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'some data') stream.feed_eof() @@ -380,16 +426,18 @@ def test_readline_eof(self): self.assertEqual(b'some data', line) def test_readline_empty_eof(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_eof() line = self.loop.run_until_complete(stream.readline()) self.assertEqual(b'', line) def test_readline_read_byte_count(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA) self.loop.run_until_complete(stream.readline()) @@ -400,8 +448,9 @@ def test_readline_read_byte_count(self): self.assertEqual(b'ine3\n', stream._buffer) def test_readline_exception(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'line\n') data = self.loop.run_until_complete(stream.readline()) @@ -413,14 +462,16 @@ def test_readline_exception(self): self.assertEqual(b'', stream._buffer) def test_readuntil_separator(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) with self.assertRaisesRegex(ValueError, 'Separator should be'): self.loop.run_until_complete(stream.readuntil(separator=b'')) def test_readuntil_multi_chunks(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'lineAAA') data = self.loop.run_until_complete(stream.readuntil(separator=b'AAA')) @@ -438,8 +489,9 @@ def test_readuntil_multi_chunks(self): self.assertEqual(b'xxx', stream._buffer) def test_readuntil_multi_chunks_1(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'QWEaa') stream.feed_data(b'XYaa') @@ -474,8 +526,9 @@ def test_readuntil_multi_chunks_1(self): self.assertEqual(b'', stream._buffer) def test_readuntil_eof(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'some dataAA') stream.feed_eof() @@ -486,8 +539,9 @@ def test_readuntil_eof(self): self.assertEqual(b'', stream._buffer) def test_readuntil_limit_found_sep(self): - stream = asyncio.StreamReader(loop=self.loop, limit=3, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, limit=3, + _asyncio_internal=True) stream.feed_data(b'some dataAA') with self.assertRaisesRegex(asyncio.LimitOverrunError, @@ -505,8 +559,9 @@ def test_readuntil_limit_found_sep(self): def test_readexactly_zero_or_less(self): # Read exact number of bytes (zero or less). - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(self.DATA) data = self.loop.run_until_complete(stream.readexactly(0)) @@ -519,8 +574,9 @@ def test_readexactly_zero_or_less(self): def test_readexactly(self): # Read exact number of bytes. - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) n = 2 * len(self.DATA) read_task = asyncio.Task(stream.readexactly(n), loop=self.loop) @@ -536,8 +592,9 @@ def cb(): self.assertEqual(self.DATA, stream._buffer) def test_readexactly_limit(self): - stream = asyncio.StreamReader(limit=3, loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + limit=3, loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'chunk') data = self.loop.run_until_complete(stream.readexactly(5)) self.assertEqual(b'chunk', data) @@ -545,8 +602,9 @@ def test_readexactly_limit(self): def test_readexactly_eof(self): # Read exact number of bytes (eof). - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) n = 2 * len(self.DATA) read_task = asyncio.Task(stream.readexactly(n), loop=self.loop) @@ -564,8 +622,9 @@ def cb(): self.assertEqual(b'', stream._buffer) def test_readexactly_exception(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'line\n') data = self.loop.run_until_complete(stream.readexactly(2)) @@ -576,8 +635,9 @@ def test_readexactly_exception(self): ValueError, self.loop.run_until_complete, stream.readexactly(2)) def test_exception(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) self.assertIsNone(stream.exception()) exc = ValueError() @@ -585,8 +645,9 @@ def test_exception(self): self.assertIs(stream.exception(), exc) def test_exception_waiter(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) async def set_err(): stream.set_exception(ValueError()) @@ -599,8 +660,9 @@ def test_exception_waiter(self): self.assertRaises(ValueError, t1.result) def test_exception_cancel(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) t = asyncio.Task(stream.readline(), loop=self.loop) test_utils.run_briefly(self.loop) @@ -655,8 +717,9 @@ def stop(self): self.server = None async def client(addr): - reader, writer = await asyncio.open_connection( - *addr, loop=self.loop) + with self.assertWarns(DeprecationWarning): + reader, writer = await asyncio.open_connection( + *addr, loop=self.loop) # send a line writer.write(b"hello world!\n") # read it back @@ -670,7 +733,8 @@ def stop(self): # test the server variant with a coroutine as client handler server = MyServer(self.loop) - addr = server.start() + with self.assertWarns(DeprecationWarning): + addr = server.start() msg = self.loop.run_until_complete(asyncio.Task(client(addr), loop=self.loop)) server.stop() @@ -678,7 +742,8 @@ def stop(self): # test the server variant with a callback as client handler server = MyServer(self.loop) - addr = server.start_callback() + with self.assertWarns(DeprecationWarning): + addr = server.start_callback() msg = self.loop.run_until_complete(asyncio.Task(client(addr), loop=self.loop)) server.stop() @@ -726,8 +791,9 @@ def stop(self): self.server = None async def client(path): - reader, writer = await asyncio.open_unix_connection( - path, loop=self.loop) + with self.assertWarns(DeprecationWarning): + reader, writer = await asyncio.open_unix_connection( + path, loop=self.loop) # send a line writer.write(b"hello world!\n") # read it back @@ -742,7 +808,8 @@ def stop(self): # test the server variant with a coroutine as client handler with test_utils.unix_socket_path() as path: server = MyServer(self.loop, path) - server.start() + with self.assertWarns(DeprecationWarning): + server.start() msg = self.loop.run_until_complete(asyncio.Task(client(path), loop=self.loop)) server.stop() @@ -751,7 +818,8 @@ def stop(self): # test the server variant with a callback as client handler with test_utils.unix_socket_path() as path: server = MyServer(self.loop, path) - server.start_callback() + with self.assertWarns(DeprecationWarning): + server.start_callback() msg = self.loop.run_until_complete(asyncio.Task(client(path), loop=self.loop)) server.stop() @@ -763,7 +831,7 @@ def stop(self): def test_read_all_from_pipe_reader(self): # See asyncio issue 168. This test is derived from the example # subprocess_attach_read_pipe.py, but we configure the - # StreamReader's limit so that twice it is less than the size + # Stream's limit so that twice it is less than the size # of the data writter. Also we must explicitly attach a child # watcher to the event loop. @@ -777,10 +845,11 @@ def test_read_all_from_pipe_reader(self): args = [sys.executable, '-c', code, str(wfd)] pipe = open(rfd, 'rb', 0) - reader = asyncio.StreamReader(loop=self.loop, limit=1, - _asyncio_internal=True) - protocol = asyncio.StreamReaderProtocol(reader, loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, limit=1, + _asyncio_internal=True) + protocol = _StreamProtocol(stream, loop=self.loop, + _asyncio_internal=True) transport, _ = self.loop.run_until_complete( self.loop.connect_read_pipe(lambda: protocol, pipe)) @@ -797,29 +866,30 @@ def test_read_all_from_pipe_reader(self): asyncio.set_child_watcher(None) os.close(wfd) - data = self.loop.run_until_complete(reader.read(-1)) + data = self.loop.run_until_complete(stream.read(-1)) self.assertEqual(data, b'data') def test_streamreader_constructor(self): self.addCleanup(asyncio.set_event_loop, None) asyncio.set_event_loop(self.loop) - # asyncio issue #184: Ensure that StreamReaderProtocol constructor + # asyncio issue #184: Ensure that _StreamProtocol constructor # retrieves the current loop if the loop parameter is not set - reader = asyncio.StreamReader(_asyncio_internal=True) + reader = asyncio.Stream(mode=asyncio.StreamMode.READ, + _asyncio_internal=True) self.assertIs(reader._loop, self.loop) def test_streamreaderprotocol_constructor(self): self.addCleanup(asyncio.set_event_loop, None) asyncio.set_event_loop(self.loop) - # asyncio issue #184: Ensure that StreamReaderProtocol constructor + # asyncio issue #184: Ensure that _StreamProtocol constructor # retrieves the current loop if the loop parameter is not set - reader = mock.Mock() - protocol = asyncio.StreamReaderProtocol(reader, _asyncio_internal=True) + stream = mock.Mock() + protocol = _StreamProtocol(stream, _asyncio_internal=True) self.assertIs(protocol._loop, self.loop) - def test_drain_raises(self): + def test_drain_raises_deprecated(self): # See http://bugs.python.org/issue25441 # This test should not use asyncio for the mock server; the @@ -833,15 +903,16 @@ def test_drain_raises(self): def server(): # Runs in a separate thread. - with socket.create_server(('localhost', 0)) as sock: + with socket.create_server(('127.0.0.1', 0)) as sock: addr = sock.getsockname() q.put(addr) clt, _ = sock.accept() clt.close() async def client(host, port): - reader, writer = await asyncio.open_connection( - host, port, loop=self.loop) + with self.assertWarns(DeprecationWarning): + reader, writer = await asyncio.open_connection( + host, port, loop=self.loop) while True: writer.write(b"foo\n") @@ -863,55 +934,106 @@ def server(): thread.join() self.assertEqual([], messages) + def test_drain_raises(self): + # See http://bugs.python.org/issue25441 + + # This test should not use asyncio for the mock server; the + # whole point of the test is to test for a bug in drain() + # where it never gives up the event loop but the socket is + # closed on the server side. + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + q = queue.Queue() + + def server(): + # Runs in a separate thread. + with socket.create_server(('localhost', 0)) as sock: + addr = sock.getsockname() + q.put(addr) + clt, _ = sock.accept() + clt.close() + + async def client(host, port): + stream = await asyncio.connect(host, port) + + while True: + stream.write(b"foo\n") + await stream.drain() + + # Start the server thread and wait for it to be listening. + thread = threading.Thread(target=server) + thread.setDaemon(True) + thread.start() + addr = q.get() + + # Should not be stuck in an infinite loop. + with self.assertRaises((ConnectionResetError, ConnectionAbortedError, + BrokenPipeError)): + self.loop.run_until_complete(client(*addr)) + + # Clean up the thread. (Only on success; on failure, it may + # be stuck in accept().) + thread.join() + self.assertEqual([], messages) + def test___repr__(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) - self.assertEqual("", repr(stream)) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) + self.assertEqual("", repr(stream)) def test___repr__nondefault_limit(self): - stream = asyncio.StreamReader(loop=self.loop, limit=123, - _asyncio_internal=True) - self.assertEqual("", repr(stream)) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, limit=123, + _asyncio_internal=True) + self.assertEqual("", repr(stream)) def test___repr__eof(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_eof() - self.assertEqual("", repr(stream)) + self.assertEqual("", repr(stream)) def test___repr__data(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream.feed_data(b'data') - self.assertEqual("", repr(stream)) + self.assertEqual("", repr(stream)) def test___repr__exception(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) exc = RuntimeError() stream.set_exception(exc) - self.assertEqual("", + self.assertEqual("", repr(stream)) def test___repr__waiter(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream._waiter = asyncio.Future(loop=self.loop) self.assertRegex( repr(stream), - r">") + r">") stream._waiter.set_result(None) self.loop.run_until_complete(stream._waiter) stream._waiter = None - self.assertEqual("", repr(stream)) + self.assertEqual("", repr(stream)) def test___repr__transport(self): - stream = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) stream._transport = mock.Mock() stream._transport.__repr__ = mock.Mock() stream._transport.__repr__.return_value = "" - self.assertEqual(">", repr(stream)) + self.assertEqual(">", + repr(stream)) def test_IncompleteReadError_pickleable(self): e = asyncio.IncompleteReadError(b'abc', 10) @@ -930,10 +1052,11 @@ def test_LimitOverrunError_pickleable(self): self.assertEqual(str(e), str(e2)) self.assertEqual(e.consumed, e2.consumed) - def test_wait_closed_on_close(self): + def test_wait_closed_on_close_deprecated(self): with test_utils.run_test_server() as httpd: - rd, wr = self.loop.run_until_complete( - asyncio.open_connection(*httpd.address, loop=self.loop)) + with self.assertWarns(DeprecationWarning): + rd, wr = self.loop.run_until_complete( + asyncio.open_connection(*httpd.address, loop=self.loop)) wr.write(b'GET / HTTP/1.0\r\n\r\n') f = rd.readline() @@ -947,10 +1070,28 @@ def test_wait_closed_on_close(self): self.assertTrue(wr.is_closing()) self.loop.run_until_complete(wr.wait_closed()) - def test_wait_closed_on_close_with_unread_data(self): + def test_wait_closed_on_close(self): with test_utils.run_test_server() as httpd: - rd, wr = self.loop.run_until_complete( - asyncio.open_connection(*httpd.address, loop=self.loop)) + stream = self.loop.run_until_complete( + asyncio.connect(*httpd.address)) + + stream.write(b'GET / HTTP/1.0\r\n\r\n') + f = stream.readline() + data = self.loop.run_until_complete(f) + self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') + f = stream.read() + data = self.loop.run_until_complete(f) + self.assertTrue(data.endswith(b'\r\n\r\nTest message')) + self.assertFalse(stream.is_closing()) + stream.close() + self.assertTrue(stream.is_closing()) + self.loop.run_until_complete(stream.wait_closed()) + + def test_wait_closed_on_close_with_unread_data_deprecated(self): + with test_utils.run_test_server() as httpd: + with self.assertWarns(DeprecationWarning): + rd, wr = self.loop.run_until_complete( + asyncio.open_connection(*httpd.address, loop=self.loop)) wr.write(b'GET / HTTP/1.0\r\n\r\n') f = rd.readline() @@ -959,32 +1100,44 @@ def test_wait_closed_on_close_with_unread_data(self): wr.close() self.loop.run_until_complete(wr.wait_closed()) + def test_wait_closed_on_close_with_unread_data(self): + with test_utils.run_test_server() as httpd: + stream = self.loop.run_until_complete( + asyncio.connect(*httpd.address)) + + stream.write(b'GET / HTTP/1.0\r\n\r\n') + f = stream.readline() + data = self.loop.run_until_complete(f) + self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') + stream.close() + self.loop.run_until_complete(stream.wait_closed()) + def test_del_stream_before_sock_closing(self): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - with test_utils.run_test_server() as httpd: - rd, wr = self.loop.run_until_complete( - asyncio.open_connection(*httpd.address, loop=self.loop)) - sock = wr.get_extra_info('socket') - self.assertNotEqual(sock.fileno(), -1) + async def test(): - wr.write(b'GET / HTTP/1.0\r\n\r\n') - f = rd.readline() - data = self.loop.run_until_complete(f) - self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') + with test_utils.run_test_server() as httpd: + stream = await asyncio.connect(*httpd.address) + sock = stream.get_extra_info('socket') + self.assertNotEqual(sock.fileno(), -1) - # drop refs to reader/writer - del rd - del wr - gc.collect() - # make a chance to close the socket - test_utils.run_briefly(self.loop) + await stream.write(b'GET / HTTP/1.0\r\n\r\n') + data = await stream.readline() + self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') - self.assertEqual(1, len(messages)) - self.assertEqual(sock.fileno(), -1) + # drop refs to reader/writer + del stream + gc.collect() + # make a chance to close the socket + await asyncio.sleep(0) - self.assertEqual(1, len(messages)) + self.assertEqual(1, len(messages), messages) + self.assertEqual(sock.fileno(), -1) + + self.loop.run_until_complete(test()) + self.assertEqual(1, len(messages), messages) self.assertEqual('An open stream object is being garbage ' 'collected; call "stream.close()" explicitly.', messages[0]['message']) @@ -994,11 +1147,12 @@ def test_del_stream_before_connection_made(self): self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: - rd = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) - pr = asyncio.StreamReaderProtocol(rd, loop=self.loop, - _asyncio_internal=True) - del rd + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, + _asyncio_internal=True) + pr = _StreamProtocol(stream, loop=self.loop, + _asyncio_internal=True) + del stream gc.collect() tr, _ = self.loop.run_until_complete( self.loop.create_connection( @@ -1015,14 +1169,14 @@ def test_del_stream_before_connection_made(self): def test_async_writer_api(self): async def inner(httpd): - rd, wr = await asyncio.open_connection(*httpd.address) + stream = await asyncio.connect(*httpd.address) - await wr.write(b'GET / HTTP/1.0\r\n\r\n') - data = await rd.readline() + await stream.write(b'GET / HTTP/1.0\r\n\r\n') + data = await stream.readline() self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') - data = await rd.read() + data = await stream.read() self.assertTrue(data.endswith(b'\r\n\r\nTest message')) - await wr.close() + await stream.close() messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) @@ -1032,18 +1186,18 @@ def test_async_writer_api(self): self.assertEqual(messages, []) - def test_async_writer_api(self): + def test_async_writer_api_exception_after_close(self): async def inner(httpd): - rd, wr = await asyncio.open_connection(*httpd.address) + stream = await asyncio.connect(*httpd.address) - await wr.write(b'GET / HTTP/1.0\r\n\r\n') - data = await rd.readline() + await stream.write(b'GET / HTTP/1.0\r\n\r\n') + data = await stream.readline() self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') - data = await rd.read() + data = await stream.read() self.assertTrue(data.endswith(b'\r\n\r\nTest message')) - wr.close() + stream.close() with self.assertRaises(ConnectionResetError): - await wr.write(b'data') + await stream.write(b'data') messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) @@ -1059,11 +1213,13 @@ def test_eof_feed_when_closing_writer(self): self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: - rd, wr = self.loop.run_until_complete( - asyncio.open_connection(*httpd.address, - loop=self.loop)) + with self.assertWarns(DeprecationWarning): + rd, wr = self.loop.run_until_complete( + asyncio.open_connection(*httpd.address, + loop=self.loop)) - f = wr.close() + wr.close() + f = wr.wait_closed() self.loop.run_until_complete(f) assert rd.at_eof() f = rd.read() @@ -1074,22 +1230,514 @@ def test_eof_feed_when_closing_writer(self): def test_stream_reader_create_warning(self): with self.assertWarns(DeprecationWarning): - asyncio.StreamReader(loop=self.loop) - - def test_stream_reader_protocol_create_warning(self): - reader = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) - with self.assertWarns(DeprecationWarning): - asyncio.StreamReaderProtocol(reader, loop=self.loop) + asyncio.StreamReader def test_stream_writer_create_warning(self): - reader = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) - proto = asyncio.StreamReaderProtocol(reader, loop=self.loop, - _asyncio_internal=True) with self.assertWarns(DeprecationWarning): - asyncio.StreamWriter('transport', proto, reader, self.loop) + asyncio.StreamWriter + + def test_stream_reader_forbidden_ops(self): + async def inner(): + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + _asyncio_internal=True) + with self.assertRaisesRegex(RuntimeError, "The stream is read-only"): + await stream.write(b'data') + with self.assertRaisesRegex(RuntimeError, "The stream is read-only"): + await stream.writelines([b'data', b'other']) + with self.assertRaisesRegex(RuntimeError, "The stream is read-only"): + stream.write_eof() + with self.assertRaisesRegex(RuntimeError, "The stream is read-only"): + await stream.drain() + + self.loop.run_until_complete(inner()) + + def test_stream_writer_forbidden_ops(self): + async def inner(): + stream = asyncio.Stream(mode=asyncio.StreamMode.WRITE, + _asyncio_internal=True) + with self.assertRaisesRegex(RuntimeError, "The stream is write-only"): + stream.feed_data(b'data') + with self.assertRaisesRegex(RuntimeError, "The stream is write-only"): + await stream.readline() + with self.assertRaisesRegex(RuntimeError, "The stream is write-only"): + await stream.readuntil() + with self.assertRaisesRegex(RuntimeError, "The stream is write-only"): + await stream.read() + with self.assertRaisesRegex(RuntimeError, "The stream is write-only"): + await stream.readexactly(10) + with self.assertRaisesRegex(RuntimeError, "The stream is write-only"): + async for chunk in stream: + pass + + self.loop.run_until_complete(inner()) + + def _basetest_connect(self, stream): + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + + stream.write(b'GET / HTTP/1.0\r\n\r\n') + f = stream.readline() + data = self.loop.run_until_complete(f) + self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') + f = stream.read() + data = self.loop.run_until_complete(f) + self.assertTrue(data.endswith(b'\r\n\r\nTest message')) + stream.close() + self.loop.run_until_complete(stream.wait_closed()) + + self.assertEqual([], messages) + + def test_connect(self): + with test_utils.run_test_server() as httpd: + stream = self.loop.run_until_complete( + asyncio.connect(*httpd.address)) + self.assertFalse(stream.is_server_side()) + self._basetest_connect(stream) + + @support.skip_unless_bind_unix_socket + def test_connect_unix(self): + with test_utils.run_test_unix_server() as httpd: + stream = self.loop.run_until_complete( + asyncio.connect_unix(httpd.address)) + self._basetest_connect(stream) + + def test_stream_async_context_manager(self): + async def test(httpd): + stream = await asyncio.connect(*httpd.address) + async with stream: + await stream.write(b'GET / HTTP/1.0\r\n\r\n') + data = await stream.readline() + self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') + data = await stream.read() + self.assertTrue(data.endswith(b'\r\n\r\nTest message')) + self.assertTrue(stream.is_closing()) + + with test_utils.run_test_server() as httpd: + self.loop.run_until_complete(test(httpd)) + + def test_connect_async_context_manager(self): + async def test(httpd): + async with asyncio.connect(*httpd.address) as stream: + await stream.write(b'GET / HTTP/1.0\r\n\r\n') + data = await stream.readline() + self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') + data = await stream.read() + self.assertTrue(data.endswith(b'\r\n\r\nTest message')) + self.assertTrue(stream.is_closing()) + + with test_utils.run_test_server() as httpd: + self.loop.run_until_complete(test(httpd)) + + @support.skip_unless_bind_unix_socket + def test_connect_unix_async_context_manager(self): + async def test(httpd): + async with asyncio.connect_unix(httpd.address) as stream: + await stream.write(b'GET / HTTP/1.0\r\n\r\n') + data = await stream.readline() + self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') + data = await stream.read() + self.assertTrue(data.endswith(b'\r\n\r\nTest message')) + self.assertTrue(stream.is_closing()) + + with test_utils.run_test_unix_server() as httpd: + self.loop.run_until_complete(test(httpd)) + + def test_stream_server(self): + + async def handle_client(stream): + self.assertTrue(stream.is_server_side()) + data = await stream.readline() + await stream.write(data) + await stream.close() + + async def client(srv): + addr = srv.sockets[0].getsockname() + stream = await asyncio.connect(*addr) + # send a line + await stream.write(b"hello world!\n") + # read it back + msgback = await stream.readline() + await stream.close() + self.assertEqual(msgback, b"hello world!\n") + await srv.close() + + async def test(): + async with asyncio.StreamServer(handle_client, '127.0.0.1', 0) as server: + await server.start_serving() + task = asyncio.create_task(client(server)) + with contextlib.suppress(asyncio.CancelledError): + await server.serve_forever() + await task + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + self.loop.run_until_complete(test()) + self.assertEqual(messages, []) + + @support.skip_unless_bind_unix_socket + def test_unix_stream_server(self): + + async def handle_client(stream): + data = await stream.readline() + await stream.write(data) + await stream.close() + + async def client(srv): + addr = srv.sockets[0].getsockname() + stream = await asyncio.connect_unix(addr) + # send a line + await stream.write(b"hello world!\n") + # read it back + msgback = await stream.readline() + await stream.close() + self.assertEqual(msgback, b"hello world!\n") + await srv.close() + + async def test(): + with test_utils.unix_socket_path() as path: + async with asyncio.UnixStreamServer(handle_client, path) as server: + await server.start_serving() + task = asyncio.create_task(client(server)) + with contextlib.suppress(asyncio.CancelledError): + await server.serve_forever() + await task + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + self.loop.run_until_complete(test()) + self.assertEqual(messages, []) + + def test_stream_server_inheritance_forbidden(self): + with self.assertRaises(TypeError): + class MyServer(asyncio.StreamServer): + pass + + @support.skip_unless_bind_unix_socket + def test_unix_stream_server_inheritance_forbidden(self): + with self.assertRaises(TypeError): + class MyServer(asyncio.UnixStreamServer): + pass + + def test_stream_server_bind(self): + async def handle_client(stream): + await stream.close() + + async def test(): + srv = asyncio.StreamServer(handle_client, '127.0.0.1', 0) + self.assertFalse(srv.is_bound()) + self.assertEqual(0, len(srv.sockets)) + await srv.bind() + self.assertTrue(srv.is_bound()) + self.assertEqual(1, len(srv.sockets)) + await srv.close() + self.assertFalse(srv.is_bound()) + self.assertEqual(0, len(srv.sockets)) + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + self.loop.run_until_complete(test()) + self.assertEqual(messages, []) + + def test_stream_server_bind_async_with(self): + async def handle_client(stream): + await stream.close() + + async def test(): + async with asyncio.StreamServer(handle_client, '127.0.0.1', 0) as srv: + self.assertTrue(srv.is_bound()) + self.assertEqual(1, len(srv.sockets)) + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + self.loop.run_until_complete(test()) + self.assertEqual(messages, []) + + def test_stream_server_start_serving(self): + async def handle_client(stream): + await stream.close() + + async def test(): + async with asyncio.StreamServer(handle_client, '127.0.0.1', 0) as srv: + self.assertFalse(srv.is_serving()) + await srv.start_serving() + self.assertTrue(srv.is_serving()) + await srv.close() + self.assertFalse(srv.is_serving()) + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + self.loop.run_until_complete(test()) + self.assertEqual(messages, []) + + def test_stream_server_close(self): + server_stream_aborted = False + fut = self.loop.create_future() + + async def handle_client(stream): + await fut + self.assertEqual(b'', await stream.readline()) + nonlocal server_stream_aborted + server_stream_aborted = True + + async def client(srv): + addr = srv.sockets[0].getsockname() + stream = await asyncio.connect(*addr) + fut.set_result(None) + self.assertEqual(b'', await stream.readline()) + await stream.close() + + async def test(): + async with asyncio.StreamServer(handle_client, '127.0.0.1', 0) as server: + await server.start_serving() + task = asyncio.create_task(client(server)) + await fut + await server.close() + await task + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + self.loop.run_until_complete(test()) + self.assertEqual(messages, []) + self.assertTrue(fut.done()) + self.assertTrue(server_stream_aborted) + + def test_stream_server_abort(self): + server_stream_aborted = False + fut = self.loop.create_future() + + async def handle_client(stream): + await fut + self.assertEqual(b'', await stream.readline()) + nonlocal server_stream_aborted + server_stream_aborted = True + + async def client(srv): + addr = srv.sockets[0].getsockname() + stream = await asyncio.connect(*addr) + fut.set_result(None) + self.assertEqual(b'', await stream.readline()) + await stream.close() + + async def test(): + async with asyncio.StreamServer(handle_client, '127.0.0.1', 0) as server: + await server.start_serving() + task = asyncio.create_task(client(server)) + await fut + await server.abort() + await task + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + self.loop.run_until_complete(test()) + self.assertEqual(messages, []) + self.assertTrue(fut.done()) + self.assertTrue(server_stream_aborted) + + def test_stream_shutdown_hung_task(self): + fut1 = self.loop.create_future() + fut2 = self.loop.create_future() + + async def handle_client(stream): + while True: + await asyncio.sleep(0.01) + + async def client(srv): + addr = srv.sockets[0].getsockname() + stream = await asyncio.connect(*addr) + fut1.set_result(None) + await fut2 + self.assertEqual(b'', await stream.readline()) + await stream.close() + + async def test(): + async with asyncio.StreamServer(handle_client, + '127.0.0.1', + 0, + shutdown_timeout=0.3) as server: + await server.start_serving() + task = asyncio.create_task(client(server)) + await fut1 + await server.close() + fut2.set_result(None) + await task + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + self.loop.run_until_complete(test()) + self.assertEqual(messages, []) + self.assertTrue(fut1.done()) + self.assertTrue(fut2.done()) + + def test_stream_shutdown_hung_task_prevents_cancellation(self): + fut1 = self.loop.create_future() + fut2 = self.loop.create_future() + do_handle_client = True + + async def handle_client(stream): + while do_handle_client: + with contextlib.suppress(asyncio.CancelledError): + await asyncio.sleep(0.01) + + async def client(srv): + addr = srv.sockets[0].getsockname() + stream = await asyncio.connect(*addr) + fut1.set_result(None) + await fut2 + self.assertEqual(b'', await stream.readline()) + await stream.close() + + async def test(): + async with asyncio.StreamServer(handle_client, + '127.0.0.1', + 0, + shutdown_timeout=0.3) as server: + await server.start_serving() + task = asyncio.create_task(client(server)) + await fut1 + await server.close() + nonlocal do_handle_client + do_handle_client = False + fut2.set_result(None) + await task + + messages = [] + self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) + self.loop.run_until_complete(test()) + self.assertEqual(1, len(messages)) + self.assertRegex(messages[0]['message'], + "', repr(srv)) + await srv.close() + + self.loop.run_until_complete(test()) + + def test_repr_bound(self): + async def serve(stream): + pass + + async def test(): + srv = asyncio.StreamServer(serve, '127.0.0.1', 0) + await srv.bind() + self.assertRegex(repr(srv), r'') + await srv.close() + + self.loop.run_until_complete(test()) + + def test_repr_serving(self): + async def serve(stream): + pass + + async def test(): + srv = asyncio.StreamServer(serve, '127.0.0.1', 0) + await srv.start_serving() + self.assertRegex(repr(srv), r'') + await srv.close() + + self.loop.run_until_complete(test()) + + + @unittest.skipUnless(sys.platform != 'win32', + "Don't support pipes for Windows") + def test_read_pipe(self): + async def test(): + rpipe, wpipe = os.pipe() + pipeobj = io.open(rpipe, 'rb', 1024) + + async with asyncio.connect_read_pipe(pipeobj) as stream: + self.assertEqual(stream.mode, asyncio.StreamMode.READ) + + os.write(wpipe, b'1') + data = await stream.readexactly(1) + self.assertEqual(data, b'1') + + os.write(wpipe, b'2345') + data = await stream.readexactly(4) + self.assertEqual(data, b'2345') + os.close(wpipe) + + self.loop.run_until_complete(test()) + + @unittest.skipUnless(sys.platform != 'win32', + "Don't support pipes for Windows") + def test_write_pipe(self): + async def test(): + rpipe, wpipe = os.pipe() + pipeobj = io.open(wpipe, 'wb', 1024) + + async with asyncio.connect_write_pipe(pipeobj) as stream: + self.assertEqual(stream.mode, asyncio.StreamMode.WRITE) + + await stream.write(b'1') + data = os.read(rpipe, 1024) + self.assertEqual(data, b'1') + + await stream.write(b'2345') + data = os.read(rpipe, 1024) + self.assertEqual(data, b'2345') + + os.close(rpipe) + self.loop.run_until_complete(test()) if __name__ == '__main__': diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py index e201a0696796..13aef7cf1f77 100644 --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -17,6 +17,7 @@ import asyncio from asyncio import windows_events +from asyncio.streams import _StreamProtocol from test.test_asyncio import utils as test_utils from test.support.script_helper import spawn_python @@ -100,16 +101,16 @@ def test_pipe(self): clients = [] for i in range(5): - stream_reader = asyncio.StreamReader(loop=self.loop, - _asyncio_internal=True) - protocol = asyncio.StreamReaderProtocol(stream_reader, - loop=self.loop, - _asyncio_internal=True) + stream = asyncio.Stream(mode=asyncio.StreamMode.READ, + loop=self.loop, _asyncio_internal=True) + protocol = _StreamProtocol(stream, + loop=self.loop, + _asyncio_internal=True) trans, proto = await self.loop.create_pipe_connection( lambda: protocol, ADDRESS) self.assertIsInstance(trans, asyncio.Transport) self.assertEqual(protocol, proto) - clients.append((stream_reader, trans)) + clients.append((stream, trans)) for i, (r, w) in enumerate(clients): w.write('lower-{}\n'.format(i).encode()) @@ -118,6 +119,7 @@ def test_pipe(self): response = await r.readline() self.assertEqual(response, 'LOWER-{}\n'.format(i).encode()) w.close() + await r.close() server.close() diff --git a/Misc/NEWS.d/next/Library/2019-05-14-12-25-44.bpo-36889.MChPqP.rst b/Misc/NEWS.d/next/Library/2019-05-14-12-25-44.bpo-36889.MChPqP.rst new file mode 100644 index 000000000000..d08c0e287edf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-14-12-25-44.bpo-36889.MChPqP.rst @@ -0,0 +1,6 @@ +Introduce :class:`asyncio.Stream` class that merges :class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter` functionality. +:class:`asyncio.Stream` can work in readonly, writeonly and readwrite modes. +Provide :func:`asyncio.connect`, :func:`asyncio.connect_unix`, :func:`asyncio.connect_read_pipe` and :func:`asyncio.connect_write_pipe` factories to open :class:`asyncio.Stream` connections. Provide :class:`asyncio.StreamServer` and :class:`UnixStreamServer` to serve servers with asyncio.Stream API. +Modify :func:`asyncio.create_subprocess_shell` and :func:`asyncio.create_subprocess_exec` to use :class:`asyncio.Stream` instead of deprecated :class:`StreamReader` and :class:`StreamWriter`. +Deprecate :class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter`. +Deprecate usage of private classes, e.g. :class:`asyncio.FlowControlMixing` and :class:`asyncio.StreamReaderProtocol` outside of asyncio package. From webhook-mailer at python.org Mon May 27 18:39:55 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 27 May 2019 22:39:55 -0000 Subject: [Python-checkins] bpo-1230540: Add threading.excepthook() (GH-13515) Message-ID: https://github.com/python/cpython/commit/cd590a7cede156a4244e7cac61e4504e5344d842 commit: cd590a7cede156a4244e7cac61e4504e5344d842 branch: master author: Victor Stinner committer: GitHub date: 2019-05-28T00:39:52+02:00 summary: bpo-1230540: Add threading.excepthook() (GH-13515) Add a new threading.excepthook() function which handles uncaught Thread.run() exception. It can be overridden to control how uncaught exceptions are handled. threading.ExceptHookArgs is not documented on purpose: it should not be used directly. * threading.excepthook() and threading.ExceptHookArgs. * Add _PyErr_Display(): similar to PyErr_Display(), but accept a 'file' parameter. * Add _thread._excepthook(): C implementation of the exception hook calling _PyErr_Display(). * Add _thread._ExceptHookArgs: structseq type. * Add threading._invoke_excepthook_wrapper() which handles the gory details to ensure that everything remains alive during Python shutdown. * Add unit tests. files: A Misc/NEWS.d/next/Library/2019-05-23-01-48-39.bpo-1230540.oKTNEQ.rst M Doc/library/sys.rst M Doc/library/threading.rst M Doc/whatsnew/3.8.rst M Include/internal/pycore_pylifecycle.h M Lib/test/test_threading.py M Lib/threading.py M Modules/_threadmodule.c M Python/pythonrun.c diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 51a208ee6040..74aa2711dd01 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -298,7 +298,11 @@ always available. before the program exits. The handling of such top-level exceptions can be customized by assigning another three-argument function to ``sys.excepthook``. - See also :func:`unraisablehook` which handles unraisable exceptions. + .. seealso:: + + The :func:`sys.unraisablehook` function handles unraisable exceptions + and the :func:`threading.excepthook` function handles exception raised + by :func:`threading.Thread.run`. .. data:: __breakpointhook__ diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 1df512f1d632..ffe6d04258aa 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -38,6 +38,32 @@ This module defines the following functions: returned. +.. function:: excepthook(args, /) + + Handle uncaught exception raised by :func:`Thread.run`. + + The *args* argument has the following attributes: + + * *exc_type*: Exception type. + * *exc_value*: Exception value, can be ``None``. + * *exc_traceback*: Exception traceback, can be ``None``. + * *thread*: Thread which raised the exception, can be ``None``. + + If *exc_type* is :exc:`SystemExit`, the exception is silently ignored. + Otherwise, the exception is printed out on :data:`sys.stderr`. + + If this function raises an exception, :func:`sys.excepthook` is called to + handle it. + + :func:`threading.excepthook` can be overridden to control how uncaught + exceptions raised by :func:`Thread.run` are handled. + + .. seealso:: + :func:`sys.excepthook` handles uncaught exceptions. + + .. versionadded:: 3.8 + + .. function:: get_ident() Return the 'thread identifier' of the current thread. This is a nonzero @@ -191,6 +217,10 @@ called is terminated. A thread has a name. The name can be passed to the constructor, and read or changed through the :attr:`~Thread.name` attribute. +If the :meth:`~Thread.run` method raises an exception, +:func:`threading.excepthook` is called to handle it. By default, +:func:`threading.excepthook` ignores silently :exc:`SystemExit`. + A thread can be flagged as a "daemon thread". The significance of this flag is that the entire Python program exits when only daemon threads are left. The initial value is inherited from the creating thread. The flag can be set diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index fd5e6496ba2e..125cefe11133 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -623,6 +623,15 @@ in a standardized and extensible format, and offers several other benefits. (Contributed by C.A.M. Gerlach in :issue:`36268`.) +threading +--------- + +Add a new :func:`threading.excepthook` function which handles uncaught +:meth:`threading.Thread.run` exception. It can be overridden to control how +uncaught :meth:`threading.Thread.run` exceptions are handled. +(Contributed by Victor Stinner in :issue:`1230540`.) + + tokenize -------- diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 69761cef9822..8a692ea16495 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -107,6 +107,8 @@ PyAPI_FUNC(int) _Py_HandleSystemExit(int *exitcode_p); PyAPI_FUNC(PyObject*) _PyErr_WriteUnraisableDefaultHook(PyObject *unraisable); PyAPI_FUNC(void) _PyErr_Print(PyThreadState *tstate); +PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, + PyObject *value, PyObject *tb); #ifdef __cplusplus } diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 3bfd6fa474ed..8c8cc128b051 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1112,6 +1112,98 @@ def run(self): # explicitly break the reference cycle to not leak a dangling thread thread.exc = None + +class ThreadRunFail(threading.Thread): + def run(self): + raise ValueError("run failed") + + +class ExceptHookTests(BaseTestCase): + def test_excepthook(self): + with support.captured_output("stderr") as stderr: + thread = ThreadRunFail(name="excepthook thread") + thread.start() + thread.join() + + stderr = stderr.getvalue().strip() + self.assertIn(f'Exception in thread {thread.name}:\n', stderr) + self.assertIn('Traceback (most recent call last):\n', stderr) + self.assertIn(' raise ValueError("run failed")', stderr) + self.assertIn('ValueError: run failed', stderr) + + @support.cpython_only + def test_excepthook_thread_None(self): + # threading.excepthook called with thread=None: log the thread + # identifier in this case. + with support.captured_output("stderr") as stderr: + try: + raise ValueError("bug") + except Exception as exc: + args = threading.ExceptHookArgs([*sys.exc_info(), None]) + threading.excepthook(args) + + stderr = stderr.getvalue().strip() + self.assertIn(f'Exception in thread {threading.get_ident()}:\n', stderr) + self.assertIn('Traceback (most recent call last):\n', stderr) + self.assertIn(' raise ValueError("bug")', stderr) + self.assertIn('ValueError: bug', stderr) + + def test_system_exit(self): + class ThreadExit(threading.Thread): + def run(self): + sys.exit(1) + + # threading.excepthook() silently ignores SystemExit + with support.captured_output("stderr") as stderr: + thread = ThreadExit() + thread.start() + thread.join() + + self.assertEqual(stderr.getvalue(), '') + + def test_custom_excepthook(self): + args = None + + def hook(hook_args): + nonlocal args + args = hook_args + + try: + with support.swap_attr(threading, 'excepthook', hook): + thread = ThreadRunFail() + thread.start() + thread.join() + + self.assertEqual(args.exc_type, ValueError) + self.assertEqual(str(args.exc_value), 'run failed') + self.assertEqual(args.exc_traceback, args.exc_value.__traceback__) + self.assertIs(args.thread, thread) + finally: + # Break reference cycle + args = None + + def test_custom_excepthook_fail(self): + def threading_hook(args): + raise ValueError("threading_hook failed") + + err_str = None + + def sys_hook(exc_type, exc_value, exc_traceback): + nonlocal err_str + err_str = str(exc_value) + + with support.swap_attr(threading, 'excepthook', threading_hook), \ + support.swap_attr(sys, 'excepthook', sys_hook), \ + support.captured_output('stderr') as stderr: + thread = ThreadRunFail() + thread.start() + thread.join() + + self.assertEqual(stderr.getvalue(), + 'Exception in threading.excepthook:\n') + self.assertEqual(err_str, 'threading_hook failed') + + class TimerTests(BaseTestCase): def setUp(self): diff --git a/Lib/threading.py b/Lib/threading.py index 77a2baec2acc..3d197eed6a72 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -5,7 +5,6 @@ import _thread from time import monotonic as _time -from traceback import format_exc as _format_exc from _weakrefset import WeakSet from itertools import islice as _islice, count as _count try: @@ -27,7 +26,8 @@ 'enumerate', 'main_thread', 'TIMEOUT_MAX', 'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError', - 'setprofile', 'settrace', 'local', 'stack_size'] + 'setprofile', 'settrace', 'local', 'stack_size', + 'excepthook', 'ExceptHookArgs'] # Rename some stuff so "from threading import *" is safe _start_new_thread = _thread.start_new_thread @@ -752,14 +752,6 @@ class Thread: """ _initialized = False - # Need to store a reference to sys.exc_info for printing - # out exceptions when a thread tries to use a global var. during interp. - # shutdown and thus raises an exception about trying to perform some - # operation on/with a NoneType - _exc_info = _sys.exc_info - # Keep sys.exc_clear too to clear the exception just before - # allowing .join() to return. - #XXX __exc_clear = _sys.exc_clear def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None): @@ -802,9 +794,9 @@ class is implemented. self._started = Event() self._is_stopped = False self._initialized = True - # sys.stderr is not stored in the class like - # sys.exc_info since it can be changed between instances + # Copy of sys.stderr used by self._invoke_excepthook() self._stderr = _sys.stderr + self._invoke_excepthook = _make_invoke_excepthook() # For debugging and _after_fork() _dangling.add(self) @@ -929,47 +921,8 @@ def _bootstrap_inner(self): try: self.run() - except SystemExit: - pass except: - # If sys.stderr is no more (most likely from interpreter - # shutdown) use self._stderr. Otherwise still use sys (as in - # _sys) in case sys.stderr was redefined since the creation of - # self. - if _sys and _sys.stderr is not None: - print("Exception in thread %s:\n%s" % - (self.name, _format_exc()), file=_sys.stderr) - elif self._stderr is not None: - # Do the best job possible w/o a huge amt. of code to - # approximate a traceback (code ideas from - # Lib/traceback.py) - exc_type, exc_value, exc_tb = self._exc_info() - try: - print(( - "Exception in thread " + self.name + - " (most likely raised during interpreter shutdown):"), file=self._stderr) - print(( - "Traceback (most recent call last):"), file=self._stderr) - while exc_tb: - print(( - ' File "%s", line %s, in %s' % - (exc_tb.tb_frame.f_code.co_filename, - exc_tb.tb_lineno, - exc_tb.tb_frame.f_code.co_name)), file=self._stderr) - exc_tb = exc_tb.tb_next - print(("%s: %s" % (exc_type, exc_value)), file=self._stderr) - self._stderr.flush() - # Make sure that exc_tb gets deleted since it is a memory - # hog; deleting everything else is just for thoroughness - finally: - del exc_type, exc_value, exc_tb - finally: - # Prevent a race in - # test_threading.test_no_refcycle_through_target when - # the exception keeps the target alive past when we - # assert that it's dead. - #XXX self._exc_clear() - pass + self._invoke_excepthook(self) finally: with _active_limbo_lock: try: @@ -1163,6 +1116,104 @@ def getName(self): def setName(self, name): self.name = name + +try: + from _thread import (_excepthook as excepthook, + _ExceptHookArgs as ExceptHookArgs) +except ImportError: + # Simple Python implementation if _thread._excepthook() is not available + from traceback import print_exception as _print_exception + from collections import namedtuple + + _ExceptHookArgs = namedtuple( + 'ExceptHookArgs', + 'exc_type exc_value exc_traceback thread') + + def ExceptHookArgs(args): + return _ExceptHookArgs(*args) + + def excepthook(args, /): + """ + Handle uncaught Thread.run() exception. + """ + if args.exc_type == SystemExit: + # silently ignore SystemExit + return + + if _sys is not None and _sys.stderr is not None: + stderr = _sys.stderr + elif args.thread is not None: + stderr = args.thread._stderr + if stderr is None: + # do nothing if sys.stderr is None and sys.stderr was None + # when the thread was created + return + else: + # do nothing if sys.stderr is None and args.thread is None + return + + if args.thread is not None: + name = args.thread.name + else: + name = get_ident() + print(f"Exception in thread {name}:", + file=stderr, flush=True) + _print_exception(args.exc_type, args.exc_value, args.exc_traceback, + file=stderr) + stderr.flush() + + +def _make_invoke_excepthook(): + # Create a local namespace to ensure that variables remain alive + # when _invoke_excepthook() is called, even if it is called late during + # Python shutdown. It is mostly needed for daemon threads. + + old_excepthook = excepthook + old_sys_excepthook = _sys.excepthook + if old_excepthook is None: + raise RuntimeError("threading.excepthook is None") + if old_sys_excepthook is None: + raise RuntimeError("sys.excepthook is None") + + sys_exc_info = _sys.exc_info + local_print = print + local_sys = _sys + + def invoke_excepthook(thread): + global excepthook + try: + hook = excepthook + if hook is None: + hook = old_excepthook + + args = ExceptHookArgs([*sys_exc_info(), thread]) + + hook(args) + except Exception as exc: + exc.__suppress_context__ = True + del exc + + if local_sys is not None and local_sys.stderr is not None: + stderr = local_sys.stderr + else: + stderr = thread._stderr + + local_print("Exception in threading.excepthook:", + file=stderr, flush=True) + + if local_sys is not None and local_sys.excepthook is not None: + sys_excepthook = local_sys.excepthook + else: + sys_excepthook = old_sys_excepthook + + sys_excepthook(*sys_exc_info()) + finally: + # Break reference cycle (exception stored in a variable) + args = None + + return invoke_excepthook + + # The timer class was contributed by Itamar Shtull-Trauring class Timer(Thread): diff --git a/Misc/NEWS.d/next/Library/2019-05-23-01-48-39.bpo-1230540.oKTNEQ.rst b/Misc/NEWS.d/next/Library/2019-05-23-01-48-39.bpo-1230540.oKTNEQ.rst new file mode 100644 index 000000000000..250a64237d18 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-23-01-48-39.bpo-1230540.oKTNEQ.rst @@ -0,0 +1,3 @@ +Add a new :func:`threading.excepthook` function which handles uncaught +:meth:`threading.Thread.run` exception. It can be overridden to control how +uncaught :meth:`threading.Thread.run` exceptions are handled. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index fee25abe283a..680e8ca7108c 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -3,6 +3,7 @@ /* Interface to Sjoerd's portable C thread library */ #include "Python.h" +#include "pycore_pylifecycle.h" #include "pycore_pystate.h" #include "structmember.h" /* offsetof */ #include "pythread.h" @@ -11,6 +12,7 @@ static PyObject *ThreadError; static PyObject *str_dict; _Py_IDENTIFIER(stderr); +_Py_IDENTIFIER(flush); /* Lock objects */ @@ -1309,6 +1311,147 @@ requiring allocation in multiples of the system memory page size\n\ (4 KiB pages are common; using multiples of 4096 for the stack size is\n\ the suggested approach in the absence of more specific information)."); +static int +thread_excepthook_file(PyObject *file, PyObject *exc_type, PyObject *exc_value, + PyObject *exc_traceback, PyObject *thread) +{ + /* print(f"Exception in thread {thread.name}:", file=file) */ + if (PyFile_WriteString("Exception in thread ", file) < 0) { + return -1; + } + + PyObject *name = NULL; + if (thread != Py_None) { + name = PyObject_GetAttrString(thread, "name"); + } + if (name != NULL) { + if (PyFile_WriteObject(name, file, Py_PRINT_RAW) < 0) { + Py_DECREF(name); + return -1; + } + Py_DECREF(name); + } + else { + PyErr_Clear(); + + unsigned long ident = PyThread_get_thread_ident(); + PyObject *str = PyUnicode_FromFormat("%lu", ident); + if (str != NULL) { + if (PyFile_WriteObject(str, file, Py_PRINT_RAW) < 0) { + Py_DECREF(str); + return -1; + } + Py_DECREF(str); + } + else { + PyErr_Clear(); + + if (PyFile_WriteString("", file) < 0) { + return -1; + } + } + } + + if (PyFile_WriteString(":\n", file) < 0) { + return -1; + } + + /* Display the traceback */ + _PyErr_Display(file, exc_type, exc_value, exc_traceback); + + /* Call file.flush() */ + PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + if (!res) { + return -1; + } + Py_DECREF(res); + + return 0; +} + + +PyDoc_STRVAR(ExceptHookArgs__doc__, +"ExceptHookArgs\n\ +\n\ +Type used to pass arguments to threading.excepthook."); + +static PyTypeObject ExceptHookArgsType; + +static PyStructSequence_Field ExceptHookArgs_fields[] = { + {"exc_type", "Exception type"}, + {"exc_value", "Exception value"}, + {"exc_traceback", "Exception traceback"}, + {"thread", "Thread"}, + {0} +}; + +static PyStructSequence_Desc ExceptHookArgs_desc = { + .name = "_thread.ExceptHookArgs", + .doc = ExceptHookArgs__doc__, + .fields = ExceptHookArgs_fields, + .n_in_sequence = 4 +}; + + +static PyObject * +thread_excepthook(PyObject *self, PyObject *args) +{ + if (Py_TYPE(args) != &ExceptHookArgsType) { + PyErr_SetString(PyExc_TypeError, + "_thread.excepthook argument type " + "must be ExceptHookArgs"); + return NULL; + } + + /* Borrowed reference */ + PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0); + if (exc_type == PyExc_SystemExit) { + /* silently ignore SystemExit */ + Py_RETURN_NONE; + } + + /* Borrowed references */ + PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1); + PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2); + PyObject *thread = PyStructSequence_GET_ITEM(args, 3); + + PyObject *file = _PySys_GetObjectId(&PyId_stderr); + if (file == NULL || file == Py_None) { + if (thread == Py_None) { + /* do nothing if sys.stderr is None and thread is None */ + Py_RETURN_NONE; + } + + file = PyObject_GetAttrString(thread, "_stderr"); + if (file == NULL) { + return NULL; + } + if (file == Py_None) { + Py_DECREF(file); + /* do nothing if sys.stderr is None and sys.stderr was None + when the thread was created */ + Py_RETURN_NONE; + } + } + else { + Py_INCREF(file); + } + + int res = thread_excepthook_file(file, exc_type, exc_value, exc_tb, + thread); + Py_DECREF(file); + if (res < 0) { + return NULL; + } + + Py_RETURN_NONE; +} + +PyDoc_STRVAR(excepthook_doc, +"excepthook(exc_type, exc_value, exc_traceback, thread)\n\ +\n\ +Handle uncaught Thread.run() exception."); + static PyMethodDef thread_methods[] = { {"start_new_thread", (PyCFunction)thread_PyThread_start_new_thread, METH_VARARGS, start_new_doc}, @@ -1336,6 +1479,8 @@ static PyMethodDef thread_methods[] = { METH_VARARGS, stack_size_doc}, {"_set_sentinel", thread__set_sentinel, METH_NOARGS, _set_sentinel_doc}, + {"_excepthook", thread_excepthook, + METH_O, excepthook_doc}, {NULL, NULL} /* sentinel */ }; @@ -1388,6 +1533,12 @@ PyInit__thread(void) return NULL; if (PyType_Ready(&RLocktype) < 0) return NULL; + if (ExceptHookArgsType.tp_name == NULL) { + if (PyStructSequence_InitType2(&ExceptHookArgsType, + &ExceptHookArgs_desc) < 0) { + return NULL; + } + } /* Create the module and add the functions */ m = PyModule_Create(&threadmodule); @@ -1424,6 +1575,11 @@ PyInit__thread(void) if (PyModule_AddObject(m, "_local", (PyObject *)&localtype) < 0) return NULL; + Py_INCREF(&ExceptHookArgsType); + if (PyModule_AddObject(m, "_ExceptHookArgs", + (PyObject *)&ExceptHookArgsType) < 0) + return NULL; + interp->num_threads = 0; str_dict = PyUnicode_InternFromString("__dict__"); diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 665c9c9586e1..ba1d1cf02f25 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -953,10 +953,11 @@ print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen) } void -PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) +_PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *tb) { + assert(file != NULL && file != Py_None); + PyObject *seen; - PyObject *f = _PySys_GetObjectId(&PyId_stderr); if (PyExceptionInstance_Check(value) && tb != NULL && PyTraceBack_Check(tb)) { /* Put the traceback on the exception, otherwise it won't get @@ -967,23 +968,32 @@ PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) else Py_DECREF(cur_tb); } - if (f == Py_None) { - /* pass */ + + /* We choose to ignore seen being possibly NULL, and report + at least the main exception (it could be a MemoryError). + */ + seen = PySet_New(NULL); + if (seen == NULL) { + PyErr_Clear(); } - else if (f == NULL) { + print_exception_recursive(file, value, seen); + Py_XDECREF(seen); +} + +void +PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) +{ + PyObject *file = _PySys_GetObjectId(&PyId_stderr); + if (file == NULL) { _PyObject_Dump(value); fprintf(stderr, "lost sys.stderr\n"); + return; } - else { - /* We choose to ignore seen being possibly NULL, and report - at least the main exception (it could be a MemoryError). - */ - seen = PySet_New(NULL); - if (seen == NULL) - PyErr_Clear(); - print_exception_recursive(f, value, seen); - Py_XDECREF(seen); + if (file == Py_None) { + return; } + + _PyErr_Display(file, exception, value, tb); } PyObject * From webhook-mailer at python.org Mon May 27 19:16:50 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 27 May 2019 23:16:50 -0000 Subject: [Python-checkins] bpo-37039: IDLE - zoomheight fixes (GH-13576) Message-ID: https://github.com/python/cpython/commit/df9b032f47e4edaf306d95449370e565ee470018 commit: df9b032f47e4edaf306d95449370e565ee470018 branch: master author: Terry Jan Reedy committer: GitHub date: 2019-05-27T19:16:46-04:00 summary: bpo-37039: IDLE - zoomheight fixes (GH-13576) Move doc entry to match menu and refactor zoom function. A followup patch will include a blurb. files: M Doc/library/idle.rst M Lib/idlelib/help.html M Lib/idlelib/zoomheight.py diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index c51cf19e97bd..bd24695c7282 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -281,16 +281,16 @@ Configure IDLE menu. For more, see :ref:`Setting preferences ` under Help and preferences. -Zoom/Restore Height - Toggles the window between normal size and maximum height. The initial size - defaults to 40 lines by 80 chars unless changed on the General tab of the - Configure IDLE dialog. - Show/Hide Code Context (Editor Window only) Open a pane at the top of the edit window which shows the block context of the code which has scrolled above the top of the window. See :ref:`Code Context ` in the Editing and Navigation section below. +Zoom/Restore Height + Toggles the window between normal size and maximum height. The initial size + defaults to 40 lines by 80 chars unless changed on the General tab of the + Configure IDLE dialog. + Window menu (Shell and Editor) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index bc287d637ab7..228b3195cf92 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -313,14 +313,14 @@

    Options menu (Shell and Editor)Setting preferences under Help and preferences. -
    Zoom/Restore Height
    -
    Toggles the window between normal size and maximum height. The initial size -defaults to 40 lines by 80 chars unless changed on the General tab of the -Configure IDLE dialog.
    Show/Hide Code Context (Editor Window only)
    Open a pane at the top of the edit window which shows the block context of the code which has scrolled above the top of the window. See Code Context in the Editing and Navigation section below.
    +
    Zoom/Restore Height
    +
    Toggles the window between normal size and maximum height. The initial size +defaults to 40 lines by 80 chars unless changed on the General tab of the +Configure IDLE dialog.
    @@ -943,7 +943,7 @@

    Navigation



    - Last updated on May 19, 2019. + Last updated on May 25, 2019. Found a bug?
    diff --git a/Lib/idlelib/zoomheight.py b/Lib/idlelib/zoomheight.py index 35e285f0ba41..523f5d51e02f 100644 --- a/Lib/idlelib/zoomheight.py +++ b/Lib/idlelib/zoomheight.py @@ -28,26 +28,14 @@ def zoom_height(top): return width, height, x, y = map(int, m.groups()) newheight = top.winfo_screenheight() - if sys.platform == 'win32': - newy = 0 - newheight = newheight - 72 - - elif macosx.isAquaTk(): - # The '88' below is a magic number that avoids placing the bottom - # of the window below the panel on my machine. I don't know how - # to calculate the correct value for this with tkinter. - newy = 22 - newheight = newheight - newy - 88 - - else: - #newy = 24 - newy = 0 - #newheight = newheight - 96 - newheight = newheight - 88 - if height >= newheight: - newgeom = "" - else: - newgeom = "%dx%d+%d+%d" % (width, newheight, x, newy) + + # The constants below for Windows and Mac Aqua are visually determined + # to avoid taskbar or menubar and app icons. + newy, bot_y = ((0, 72) if sys.platform == 'win32' else + (22, 88) if macosx.isAquaTk() else + (0, 88) ) # Guess for anything else. + newheight = newheight - newy - bot_y + newgeom = '' if height >= newheight else f"{width}x{newheight}+{x}+{newy}" top.wm_geometry(newgeom) return newgeom != "" From webhook-mailer at python.org Mon May 27 19:44:25 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 27 May 2019 23:44:25 -0000 Subject: [Python-checkins] bpo-37054, _pyio: Fix BytesIO and TextIOWrapper __del__() (GH-13601) Message-ID: https://github.com/python/cpython/commit/a3568417c49f36860393075b21c93996a5f6799b commit: a3568417c49f36860393075b21c93996a5f6799b branch: master author: Victor Stinner committer: GitHub date: 2019-05-28T01:44:21+02:00 summary: bpo-37054, _pyio: Fix BytesIO and TextIOWrapper __del__() (GH-13601) Fix destructor _pyio.BytesIO and _pyio.TextIOWrapper: initialize their _buffer attribute as soon as possible (in the class body), because it's used by __del__() which calls close(). files: A Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst M Lib/_pyio.py diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 5baca4df82ff..43c24342ad61 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -873,6 +873,10 @@ class BytesIO(BufferedIOBase): """Buffered I/O implementation using an in-memory bytes buffer.""" + # Initialize _buffer as soon as possible since it's used by __del__() + # which calls close() + _buffer = None + def __init__(self, initial_bytes=None): buf = bytearray() if initial_bytes is not None: @@ -900,7 +904,8 @@ def getbuffer(self): return memoryview(self._buffer) def close(self): - self._buffer.clear() + if self._buffer is not None: + self._buffer.clear() super().close() def read(self, size=-1): @@ -1970,6 +1975,10 @@ class TextIOWrapper(TextIOBase): _CHUNK_SIZE = 2048 + # Initialize _buffer as soon as possible since it's used by __del__() + # which calls close() + _buffer = None + # The write_through argument has no effect here since this # implementation always writes through. The argument is present only # so that the signature can match the signature of the C version. diff --git a/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst b/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst new file mode 100644 index 000000000000..9a2433abd0d0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst @@ -0,0 +1,3 @@ +Fix destructor :class:`_pyio.BytesIO` and :class:`_pyio.TextIOWrapper`: +initialize their ``_buffer`` attribute as soon as possible (in the class +body), because it's used by ``__del__()`` which calls ``close()``. From webhook-mailer at python.org Mon May 27 19:48:09 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 May 2019 23:48:09 -0000 Subject: [Python-checkins] bpo-37039: IDLE - zoomheight fixes (GH-13576) Message-ID: https://github.com/python/cpython/commit/abdda3ae2a19326bb10bb6e54400c5d3a904b742 commit: abdda3ae2a19326bb10bb6e54400c5d3a904b742 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-27T16:48:04-07:00 summary: bpo-37039: IDLE - zoomheight fixes (GH-13576) Move doc entry to match menu and refactor zoom function. A followup patch will include a blurb. (cherry picked from commit df9b032f47e4edaf306d95449370e565ee470018) Co-authored-by: Terry Jan Reedy files: M Doc/library/idle.rst M Lib/idlelib/help.html M Lib/idlelib/zoomheight.py diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index c51cf19e97bd..bd24695c7282 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -281,16 +281,16 @@ Configure IDLE menu. For more, see :ref:`Setting preferences ` under Help and preferences. -Zoom/Restore Height - Toggles the window between normal size and maximum height. The initial size - defaults to 40 lines by 80 chars unless changed on the General tab of the - Configure IDLE dialog. - Show/Hide Code Context (Editor Window only) Open a pane at the top of the edit window which shows the block context of the code which has scrolled above the top of the window. See :ref:`Code Context ` in the Editing and Navigation section below. +Zoom/Restore Height + Toggles the window between normal size and maximum height. The initial size + defaults to 40 lines by 80 chars unless changed on the General tab of the + Configure IDLE dialog. + Window menu (Shell and Editor) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index bc287d637ab7..228b3195cf92 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -313,14 +313,14 @@

    Options menu (Shell and Editor)Setting preferences under Help and preferences. -
    Zoom/Restore Height
    -
    Toggles the window between normal size and maximum height. The initial size -defaults to 40 lines by 80 chars unless changed on the General tab of the -Configure IDLE dialog.
    Show/Hide Code Context (Editor Window only)
    Open a pane at the top of the edit window which shows the block context of the code which has scrolled above the top of the window. See Code Context in the Editing and Navigation section below.
    +
    Zoom/Restore Height
    +
    Toggles the window between normal size and maximum height. The initial size +defaults to 40 lines by 80 chars unless changed on the General tab of the +Configure IDLE dialog.

    @@ -943,7 +943,7 @@

    Navigation



    - Last updated on May 19, 2019. + Last updated on May 25, 2019. Found a bug?
    diff --git a/Lib/idlelib/zoomheight.py b/Lib/idlelib/zoomheight.py index 35e285f0ba41..523f5d51e02f 100644 --- a/Lib/idlelib/zoomheight.py +++ b/Lib/idlelib/zoomheight.py @@ -28,26 +28,14 @@ def zoom_height(top): return width, height, x, y = map(int, m.groups()) newheight = top.winfo_screenheight() - if sys.platform == 'win32': - newy = 0 - newheight = newheight - 72 - - elif macosx.isAquaTk(): - # The '88' below is a magic number that avoids placing the bottom - # of the window below the panel on my machine. I don't know how - # to calculate the correct value for this with tkinter. - newy = 22 - newheight = newheight - newy - 88 - - else: - #newy = 24 - newy = 0 - #newheight = newheight - 96 - newheight = newheight - 88 - if height >= newheight: - newgeom = "" - else: - newgeom = "%dx%d+%d+%d" % (width, newheight, x, newy) + + # The constants below for Windows and Mac Aqua are visually determined + # to avoid taskbar or menubar and app icons. + newy, bot_y = ((0, 72) if sys.platform == 'win32' else + (22, 88) if macosx.isAquaTk() else + (0, 88) ) # Guess for anything else. + newheight = newheight - newy - bot_y + newgeom = '' if height >= newheight else f"{width}x{newheight}+{x}+{newy}" top.wm_geometry(newgeom) return newgeom != "" From webhook-mailer at python.org Mon May 27 19:51:23 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 May 2019 23:51:23 -0000 Subject: [Python-checkins] bpo-36686: Improve the documentation of the std* params in loop.subprocess_exec (GH-13586) Message-ID: https://github.com/python/cpython/commit/f0d4c64019ecf8a5f362aa5a478786241613e5c3 commit: f0d4c64019ecf8a5f362aa5a478786241613e5c3 branch: master author: sbstp committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-27T16:51:19-07:00 summary: bpo-36686: Improve the documentation of the std* params in loop.subprocess_exec (GH-13586) https://bugs.python.org/issue36686 files: A Misc/NEWS.d/next/Documentation/2019-05-27-17-28-58.bpo-36686.Zot4sx.rst M Doc/library/asyncio-eventloop.rst M Lib/asyncio/base_events.py M Lib/test/test_asyncio/test_subprocess.py diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 06f673be7902..4acd23f59465 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -1217,32 +1217,52 @@ async/await code consider using the high-level Other parameters: - * *stdin*: either a file-like object representing a pipe to be - connected to the subprocess's standard input stream using - :meth:`~loop.connect_write_pipe`, or the - :const:`subprocess.PIPE` constant (default). By default a new - pipe will be created and connected. - - * *stdout*: either a file-like object representing the pipe to be - connected to the subprocess's standard output stream using - :meth:`~loop.connect_read_pipe`, or the - :const:`subprocess.PIPE` constant (default). By default a new pipe - will be created and connected. - - * *stderr*: either a file-like object representing the pipe to be - connected to the subprocess's standard error stream using - :meth:`~loop.connect_read_pipe`, or one of - :const:`subprocess.PIPE` (default) or :const:`subprocess.STDOUT` - constants. - - By default a new pipe will be created and connected. When - :const:`subprocess.STDOUT` is specified, the subprocess' standard - error stream will be connected to the same pipe as the standard - output stream. + * *stdin* can be any of these: + + * a file-like object representing a pipe to be connected to the + subprocess's standard input stream using + :meth:`~loop.connect_write_pipe` + * the :const:`subprocess.PIPE` constant (default) which will create a new + pipe and connect it, + * the value ``None`` which will make the subprocess inherit the file + descriptor from this process + * the :const:`subprocess.DEVNULL` constant which indicates that the + special :data:`os.devnull` file will be used + + * *stdout* can be any of these: + + * a file-like object representing a pipe to be connected to the + subprocess's standard output stream using + :meth:`~loop.connect_write_pipe` + * the :const:`subprocess.PIPE` constant (default) which will create a new + pipe and connect it, + * the value ``None`` which will make the subprocess inherit the file + descriptor from this process + * the :const:`subprocess.DEVNULL` constant which indicates that the + special :data:`os.devnull` file will be used + + * *stderr* can be any of these: + + * a file-like object representing a pipe to be connected to the + subprocess's standard error stream using + :meth:`~loop.connect_write_pipe` + * the :const:`subprocess.PIPE` constant (default) which will create a new + pipe and connect it, + * the value ``None`` which will make the subprocess inherit the file + descriptor from this process + * the :const:`subprocess.DEVNULL` constant which indicates that the + special :data:`os.devnull` file will be used + * the :const:`subprocess.STDOUT` constant which will connect the standard + error stream to the process' standard output stream * All other keyword arguments are passed to :class:`subprocess.Popen` - without interpretation, except for *bufsize*, *universal_newlines* - and *shell*, which should not be specified at all. + without interpretation, except for *bufsize*, *universal_newlines*, + *shell*, *text*, *encoding* and *errors*, which should not be specified + at all. + + The ``asyncio`` subprocess API does not support decoding the streams + as text. :func:`bytes.decode` can be used to convert the bytes returned + from the stream to text. See the constructor of the :class:`subprocess.Popen` class for documentation on other arguments. diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index e5cd14b59af5..68105eec8132 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1555,6 +1555,7 @@ def _log_subprocess(self, msg, stdin, stdout, stderr): stderr=subprocess.PIPE, universal_newlines=False, shell=True, bufsize=0, + encoding=None, errors=None, text=None, **kwargs): if not isinstance(cmd, (bytes, str)): raise ValueError("cmd must be a string") @@ -1564,6 +1565,13 @@ def _log_subprocess(self, msg, stdin, stdout, stderr): raise ValueError("shell must be True") if bufsize != 0: raise ValueError("bufsize must be 0") + if text: + raise ValueError("text must be False") + if encoding is not None: + raise ValueError("encoding must be None") + if errors is not None: + raise ValueError("errors must be None") + protocol = protocol_factory() debug_log = None if self._debug: @@ -1580,13 +1588,22 @@ def _log_subprocess(self, msg, stdin, stdout, stderr): async def subprocess_exec(self, protocol_factory, program, *args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=False, - shell=False, bufsize=0, **kwargs): + shell=False, bufsize=0, + encoding=None, errors=None, text=None, + **kwargs): if universal_newlines: raise ValueError("universal_newlines must be False") if shell: raise ValueError("shell must be False") if bufsize != 0: raise ValueError("bufsize must be 0") + if text: + raise ValueError("text must be False") + if encoding is not None: + raise ValueError("encoding must be None") + if errors is not None: + raise ValueError("errors must be None") + popen_args = (program,) + args for arg in popen_args: if not isinstance(arg, (str, bytes)): diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 551974a1806a..f1ab039ad663 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -335,6 +335,63 @@ def test_empty_input(self): self.assertEqual(output.rstrip(), b'0') self.assertEqual(exitcode, 0) + def test_devnull_input(self): + + async def empty_input(): + code = 'import sys; data = sys.stdin.read(); print(len(data))' + proc = await asyncio.create_subprocess_exec( + sys.executable, '-c', code, + stdin=asyncio.subprocess.DEVNULL, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + close_fds=False, + loop=self.loop) + stdout, stderr = await proc.communicate() + exitcode = await proc.wait() + return (stdout, exitcode) + + output, exitcode = self.loop.run_until_complete(empty_input()) + self.assertEqual(output.rstrip(), b'0') + self.assertEqual(exitcode, 0) + + def test_devnull_output(self): + + async def empty_output(): + code = 'import sys; data = sys.stdin.read(); print(len(data))' + proc = await asyncio.create_subprocess_exec( + sys.executable, '-c', code, + stdin=asyncio.subprocess.PIPE, + stdout=asyncio.subprocess.DEVNULL, + stderr=asyncio.subprocess.PIPE, + close_fds=False, + loop=self.loop) + stdout, stderr = await proc.communicate(b"abc") + exitcode = await proc.wait() + return (stdout, exitcode) + + output, exitcode = self.loop.run_until_complete(empty_output()) + self.assertEqual(output, None) + self.assertEqual(exitcode, 0) + + def test_devnull_error(self): + + async def empty_error(): + code = 'import sys; data = sys.stdin.read(); print(len(data))' + proc = await asyncio.create_subprocess_exec( + sys.executable, '-c', code, + stdin=asyncio.subprocess.PIPE, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.DEVNULL, + close_fds=False, + loop=self.loop) + stdout, stderr = await proc.communicate(b"abc") + exitcode = await proc.wait() + return (stderr, exitcode) + + output, exitcode = self.loop.run_until_complete(empty_error()) + self.assertEqual(output, None) + self.assertEqual(exitcode, 0) + def test_cancel_process_wait(self): # Issue #23140: cancel Process.wait() @@ -531,6 +588,39 @@ def test_process_create_warning(self): with self.assertWarns(DeprecationWarning): subprocess.Process(transp, proto, loop=self.loop) + def test_create_subprocess_exec_text_mode_fails(self): + async def execute(): + with self.assertRaises(ValueError): + await subprocess.create_subprocess_exec(sys.executable, + text=True) + + with self.assertRaises(ValueError): + await subprocess.create_subprocess_exec(sys.executable, + encoding="utf-8") + + with self.assertRaises(ValueError): + await subprocess.create_subprocess_exec(sys.executable, + errors="strict") + + self.loop.run_until_complete(execute()) + + def test_create_subprocess_shell_text_mode_fails(self): + + async def execute(): + with self.assertRaises(ValueError): + await subprocess.create_subprocess_shell(sys.executable, + text=True) + + with self.assertRaises(ValueError): + await subprocess.create_subprocess_shell(sys.executable, + encoding="utf-8") + + with self.assertRaises(ValueError): + await subprocess.create_subprocess_shell(sys.executable, + errors="strict") + + self.loop.run_until_complete(execute()) + if sys.platform != 'win32': # Unix diff --git a/Misc/NEWS.d/next/Documentation/2019-05-27-17-28-58.bpo-36686.Zot4sx.rst b/Misc/NEWS.d/next/Documentation/2019-05-27-17-28-58.bpo-36686.Zot4sx.rst new file mode 100644 index 000000000000..2ea42adf1317 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-27-17-28-58.bpo-36686.Zot4sx.rst @@ -0,0 +1,6 @@ +Improve documentation of the stdin, stdout, and stderr arguments of of the +``asyncio.subprocess_exec`` function to specficy which values are supported. +Also mention that decoding as text is not supported. + +Add a few tests to verify that the various values passed to the std* +arguments actually work. From webhook-mailer at python.org Mon May 27 20:05:53 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 00:05:53 -0000 Subject: [Python-checkins] bpo-37054, _pyio: Fix BytesIO and TextIOWrapper __del__() (GH-13601) Message-ID: https://github.com/python/cpython/commit/0f352d44e7c14c1c93e3999402c85512b9d5a6ca commit: 0f352d44e7c14c1c93e3999402c85512b9d5a6ca branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-27T17:05:49-07:00 summary: bpo-37054, _pyio: Fix BytesIO and TextIOWrapper __del__() (GH-13601) Fix destructor _pyio.BytesIO and _pyio.TextIOWrapper: initialize their _buffer attribute as soon as possible (in the class body), because it's used by __del__() which calls close(). (cherry picked from commit a3568417c49f36860393075b21c93996a5f6799b) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst M Lib/_pyio.py diff --git a/Lib/_pyio.py b/Lib/_pyio.py index afbd48e0005d..e81cc5128881 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -839,6 +839,10 @@ class BytesIO(BufferedIOBase): """Buffered I/O implementation using an in-memory bytes buffer.""" + # Initialize _buffer as soon as possible since it's used by __del__() + # which calls close() + _buffer = None + def __init__(self, initial_bytes=None): buf = bytearray() if initial_bytes is not None: @@ -866,7 +870,8 @@ def getbuffer(self): return memoryview(self._buffer) def close(self): - self._buffer.clear() + if self._buffer is not None: + self._buffer.clear() super().close() def read(self, size=-1): @@ -1936,6 +1941,10 @@ class TextIOWrapper(TextIOBase): _CHUNK_SIZE = 2048 + # Initialize _buffer as soon as possible since it's used by __del__() + # which calls close() + _buffer = None + # The write_through argument has no effect here since this # implementation always writes through. The argument is present only # so that the signature can match the signature of the C version. diff --git a/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst b/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst new file mode 100644 index 000000000000..9a2433abd0d0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst @@ -0,0 +1,3 @@ +Fix destructor :class:`_pyio.BytesIO` and :class:`_pyio.TextIOWrapper`: +initialize their ``_buffer`` attribute as soon as possible (in the class +body), because it's used by ``__del__()`` which calls ``close()``. From webhook-mailer at python.org Mon May 27 20:14:25 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 00:14:25 -0000 Subject: [Python-checkins] bpo-36856: Handle possible overflow in faulthandler_stack_overflow (GH-13205) Message-ID: https://github.com/python/cpython/commit/1062cf71faa14b90185cf159877083910df10f27 commit: 1062cf71faa14b90185cf159877083910df10f27 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-27T17:14:21-07:00 summary: bpo-36856: Handle possible overflow in faulthandler_stack_overflow (GH-13205) (cherry picked from commit 6236c9823ef3e8e2229b0598d3d8189adf5e00f2) Co-authored-by: Xi Ruoyao files: M Modules/faulthandler.c diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index ec5192832ce0..0dbd5a3342b0 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1120,13 +1120,26 @@ faulthandler_stack_overflow(PyObject *self) { size_t depth, size; uintptr_t sp = (uintptr_t)&depth; - uintptr_t stop; + uintptr_t stop, lower_limit, upper_limit; faulthandler_suppress_crash_report(); depth = 0; - stop = stack_overflow(sp - STACK_OVERFLOW_MAX_SIZE, - sp + STACK_OVERFLOW_MAX_SIZE, - &depth); + + if (STACK_OVERFLOW_MAX_SIZE <= sp) { + lower_limit = sp - STACK_OVERFLOW_MAX_SIZE; + } + else { + lower_limit = 0; + } + + if (UINTPTR_MAX - STACK_OVERFLOW_MAX_SIZE >= sp) { + upper_limit = sp + STACK_OVERFLOW_MAX_SIZE; + } + else { + upper_limit = UINTPTR_MAX; + } + + stop = stack_overflow(lower_limit, upper_limit, &depth); if (sp < stop) size = stop - sp; else From webhook-mailer at python.org Tue May 28 00:16:07 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 04:16:07 -0000 Subject: [Python-checkins] Add @maxking to CODEOWNERS file (GH-13599) Message-ID: https://github.com/python/cpython/commit/71dc7c5fbd856df83202f39c1f41ccd07c6eceb7 commit: 71dc7c5fbd856df83202f39c1f41ccd07c6eceb7 branch: master author: Abhilash Raj committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-27T21:15:48-07:00 summary: Add @maxking to CODEOWNERS file (GH-13599) files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index fae513843566..1638a8b4b443 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -37,7 +37,7 @@ Objects/dict* @methane Python/bootstrap_hash.c @python/crypto-team # Email and related -**/*mail* @python/email-team +**/*mail* @python/email-team @maxking **/*smtp* @python/email-team **/*mime* @python/email-team **/*imap* @python/email-team From webhook-mailer at python.org Tue May 28 00:22:29 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 04:22:29 -0000 Subject: [Python-checkins] Fix broken :ref: in asyncio docs (GH-11805) Message-ID: https://github.com/python/cpython/commit/d57bb1c2f7288b77bcef05d83ef8b3b8a95be1e3 commit: d57bb1c2f7288b77bcef05d83ef8b3b8a95be1e3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-27T21:22:25-07:00 summary: Fix broken :ref: in asyncio docs (GH-11805) (cherry picked from commit 5033e315d28d54a41bcd987d04e6e6453d5b275f) Co-authored-by: Pablo Galindo files: M Doc/library/asyncio-protocol.rst diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index f54dece05f3a..d8d7947c030a 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -73,7 +73,7 @@ Transports are classes provided by :mod:`asyncio` in order to abstract various kinds of communication channels. Transport objects are always instantiated by an -ref:`asyncio event loop `. +:ref:`asyncio event loop `. asyncio implements transports for TCP, UDP, SSL, and subprocess pipes. The methods available on a transport depend on the transport's kind. From webhook-mailer at python.org Tue May 28 03:07:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 07:07:56 -0000 Subject: [Python-checkins] bpo-36996: Handle async functions when mock.patch is used as a decorator (GH-13562) Message-ID: https://github.com/python/cpython/commit/436c2b0d67da68465e709a96daac7340af3a5238 commit: 436c2b0d67da68465e709a96daac7340af3a5238 branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T00:07:38-07:00 summary: bpo-36996: Handle async functions when mock.patch is used as a decorator (GH-13562) Return a coroutine while patching async functions with a decorator. Co-authored-by: Andrew Svetlov https://bugs.python.org/issue36996 files: A Misc/NEWS.d/next/Library/2019-05-22-22-55-18.bpo-36996.XQx08d.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testasync.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index b91afd88dd13..fac4535747c4 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -26,6 +26,7 @@ __version__ = '1.0' import asyncio +import contextlib import io import inspect import pprint @@ -1220,6 +1221,8 @@ def copy(self): def __call__(self, func): if isinstance(func, type): return self.decorate_class(func) + if inspect.iscoroutinefunction(func): + return self.decorate_async_callable(func) return self.decorate_callable(func) @@ -1237,41 +1240,68 @@ def decorate_class(self, klass): return klass + @contextlib.contextmanager + def decoration_helper(self, patched, args, keywargs): + extra_args = [] + entered_patchers = [] + patching = None + + exc_info = tuple() + try: + for patching in patched.patchings: + arg = patching.__enter__() + entered_patchers.append(patching) + if patching.attribute_name is not None: + keywargs.update(arg) + elif patching.new is DEFAULT: + extra_args.append(arg) + + args += tuple(extra_args) + yield (args, keywargs) + except: + if (patching not in entered_patchers and + _is_started(patching)): + # the patcher may have been started, but an exception + # raised whilst entering one of its additional_patchers + entered_patchers.append(patching) + # Pass the exception to __exit__ + exc_info = sys.exc_info() + # re-raise the exception + raise + finally: + for patching in reversed(entered_patchers): + patching.__exit__(*exc_info) + + def decorate_callable(self, func): + # NB. Keep the method in sync with decorate_async_callable() if hasattr(func, 'patchings'): func.patchings.append(self) return func @wraps(func) def patched(*args, **keywargs): - extra_args = [] - entered_patchers = [] + with self.decoration_helper(patched, + args, + keywargs) as (newargs, newkeywargs): + return func(*newargs, **newkeywargs) - exc_info = tuple() - try: - for patching in patched.patchings: - arg = patching.__enter__() - entered_patchers.append(patching) - if patching.attribute_name is not None: - keywargs.update(arg) - elif patching.new is DEFAULT: - extra_args.append(arg) - - args += tuple(extra_args) - return func(*args, **keywargs) - except: - if (patching not in entered_patchers and - _is_started(patching)): - # the patcher may have been started, but an exception - # raised whilst entering one of its additional_patchers - entered_patchers.append(patching) - # Pass the exception to __exit__ - exc_info = sys.exc_info() - # re-raise the exception - raise - finally: - for patching in reversed(entered_patchers): - patching.__exit__(*exc_info) + patched.patchings = [self] + return patched + + + def decorate_async_callable(self, func): + # NB. Keep the method in sync with decorate_callable() + if hasattr(func, 'patchings'): + func.patchings.append(self) + return func + + @wraps(func) + async def patched(*args, **keywargs): + with self.decoration_helper(patched, + args, + keywargs) as (newargs, newkeywargs): + return await func(*newargs, **newkeywargs) patched.patchings = [self] return patched diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 0519d59696f6..ccea4fe242dc 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -66,6 +66,14 @@ def test_async(mock_method): test_async() + def test_async_def_patch(self): + @patch(f"{__name__}.async_func", AsyncMock()) + async def test_async(): + self.assertIsInstance(async_func, AsyncMock) + + asyncio.run(test_async()) + self.assertTrue(inspect.iscoroutinefunction(async_func)) + class AsyncPatchCMTest(unittest.TestCase): def test_is_async_function_cm(self): @@ -91,6 +99,14 @@ def test_async(): test_async() + def test_async_def_cm(self): + async def test_async(): + with patch(f"{__name__}.async_func", AsyncMock()): + self.assertIsInstance(async_func, AsyncMock) + self.assertTrue(inspect.iscoroutinefunction(async_func)) + + asyncio.run(test_async()) + class AsyncMockTest(unittest.TestCase): def test_iscoroutinefunction_default(self): diff --git a/Misc/NEWS.d/next/Library/2019-05-22-22-55-18.bpo-36996.XQx08d.rst b/Misc/NEWS.d/next/Library/2019-05-22-22-55-18.bpo-36996.XQx08d.rst new file mode 100644 index 000000000000..69d18d9713b4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-22-22-55-18.bpo-36996.XQx08d.rst @@ -0,0 +1 @@ +Handle :func:`unittest.mock.patch` used as a decorator on async functions. From webhook-mailer at python.org Tue May 28 03:11:06 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 07:11:06 -0000 Subject: [Python-checkins] bpo-36933: Remove sys.set_coroutine_wrapper (marked for removal in 3.8) (GH-13577) Message-ID: https://github.com/python/cpython/commit/3880f263d2994fb1eba25835dddccb0cf696fdf0 commit: 3880f263d2994fb1eba25835dddccb0cf696fdf0 branch: master author: Matthias Bussonnier committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T00:10:59-07:00 summary: bpo-36933: Remove sys.set_coroutine_wrapper (marked for removal in 3.8) (GH-13577) It has been documented as deprecated and to be removed in 3.8; >From a comment on another thread ? which I can't find ; leave get_coro_wrapper() for now, but always return `None`. https://bugs.python.org/issue36933 files: A Misc/NEWS.d/next/Library/2019-05-26-10-16-55.bpo-36933.4w3eP9.rst M Doc/library/sys.rst M Doc/tools/susp-ignored.csv M Doc/whatsnew/3.8.rst M Include/ceval.h M Include/cpython/pystate.h M Lib/test/test_coroutines.py M Python/ceval.c M Python/clinic/sysmodule.c.h M Python/pystate.c M Python/sysmodule.c diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 74aa2711dd01..5bde6870717c 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -781,22 +781,6 @@ always available. for details.) Use it only for debugging purposes. -.. function:: get_coroutine_wrapper() - - Returns ``None``, or a wrapper set by :func:`set_coroutine_wrapper`. - - .. versionadded:: 3.5 - See :pep:`492` for more details. - - .. note:: - This function has been added on a provisional basis (see :pep:`411` - for details.) Use it only for debugging purposes. - - .. deprecated:: 3.7 - The coroutine wrapper functionality has been deprecated, and - will be removed in 3.8. See :issue:`32591` for details. - - .. data:: hash_info A :term:`struct sequence` giving parameters of the numeric hash @@ -1384,49 +1368,6 @@ always available. This function has been added on a provisional basis (see :pep:`411` for details.) Use it only for debugging purposes. -.. function:: set_coroutine_wrapper(wrapper) - - Allows intercepting creation of :term:`coroutine` objects (only ones that - are created by an :keyword:`async def` function; generators decorated with - :func:`types.coroutine` or :func:`asyncio.coroutine` will not be - intercepted). - - The *wrapper* argument must be either: - - * a callable that accepts one argument (a coroutine object); - * ``None``, to reset the wrapper. - - If called twice, the new wrapper replaces the previous one. The function - is thread-specific. - - The *wrapper* callable cannot define new coroutines directly or indirectly:: - - def wrapper(coro): - async def wrap(coro): - return await coro - return wrap(coro) - sys.set_coroutine_wrapper(wrapper) - - async def foo(): - pass - - # The following line will fail with a RuntimeError, because - # ``wrapper`` creates a ``wrap(coro)`` coroutine: - foo() - - See also :func:`get_coroutine_wrapper`. - - .. versionadded:: 3.5 - See :pep:`492` for more details. - - .. note:: - This function has been added on a provisional basis (see :pep:`411` - for details.) Use it only for debugging purposes. - - .. deprecated-removed:: 3.7 3.8 - The coroutine wrapper functionality has been deprecated, and - will be removed in 3.8. See :issue:`32591` for details. - .. function:: _enablelegacywindowsfsencoding() Changes the default filesystem encoding and errors mode to 'mbcs' and diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index a0e7868a037a..85263d47c8bb 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -337,7 +337,6 @@ library/zipapp,,:main,"$ python -m zipapp myapp -m ""myapp:main""" library/zipapp,,:fn,"pkg.mod:fn" library/zipapp,,:callable,"pkg.module:callable" library/stdtypes,,::,>>> m[::2].tolist() -library/sys,,`,# ``wrapper`` creates a ``wrap(coro)`` coroutine: whatsnew/3.5,,:root,'WARNING:root:warning\n' whatsnew/3.5,,:warning,'WARNING:root:warning\n' whatsnew/3.5,,::,>>> addr6 = ipaddress.IPv6Address('::1') diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 125cefe11133..860d6cc18f11 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -973,6 +973,10 @@ The following features and APIs have been removed from Python 3.8: :func:`fileinput.FileInput` which was ignored and deprecated since Python 3.6 has been removed. :issue:`36952` (Contributed by Matthias Bussonnier) +* The function :func:`sys.set_coroutine_wrapper` deprecated in Python 3.7 has + been removed; :func:`sys.get_coroutine_wrapper` now always return ``None``. + :issue:`36933` (Contributed by Matthias Bussonnier) + Porting to Python 3.8 ===================== diff --git a/Include/ceval.h b/Include/ceval.h index 8cdf353b05fd..6fb224b28850 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -33,8 +33,6 @@ PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth(int new_depth); PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void); -PyAPI_FUNC(void) _PyEval_SetCoroutineWrapper(PyObject *); -PyAPI_FUNC(PyObject *) _PyEval_GetCoroutineWrapper(void); PyAPI_FUNC(void) _PyEval_SetAsyncGenFirstiter(PyObject *); PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void); PyAPI_FUNC(void) _PyEval_SetAsyncGenFinalizer(PyObject *); diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 6b7663fe3315..94b0809cd4f0 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -126,9 +126,6 @@ struct _ts { int coroutine_origin_tracking_depth; - PyObject *coroutine_wrapper; - int in_coroutine_wrapper; - PyObject *async_gen_firstiter; PyObject *async_gen_finalizer; diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 036f13fa50e9..0e7eb3a1af47 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -2146,99 +2146,6 @@ class CM: self.assertEqual(buffer, [1, 2, 'MyException']) -class SysSetCoroWrapperTest(unittest.TestCase): - - def test_set_wrapper_1(self): - async def foo(): - return 'spam' - - wrapped = None - def wrap(gen): - nonlocal wrapped - wrapped = gen - return gen - - with self.assertWarns(DeprecationWarning): - self.assertIsNone(sys.get_coroutine_wrapper()) - - with self.assertWarns(DeprecationWarning): - sys.set_coroutine_wrapper(wrap) - with self.assertWarns(DeprecationWarning): - self.assertIs(sys.get_coroutine_wrapper(), wrap) - try: - f = foo() - self.assertTrue(wrapped) - - self.assertEqual(run_async(f), ([], 'spam')) - finally: - with self.assertWarns(DeprecationWarning): - sys.set_coroutine_wrapper(None) - f.close() - - with self.assertWarns(DeprecationWarning): - self.assertIsNone(sys.get_coroutine_wrapper()) - - wrapped = None - coro = foo() - self.assertFalse(wrapped) - coro.close() - - def test_set_wrapper_2(self): - with self.assertWarns(DeprecationWarning): - self.assertIsNone(sys.get_coroutine_wrapper()) - with self.assertRaisesRegex(TypeError, "callable expected, got int"): - with self.assertWarns(DeprecationWarning): - sys.set_coroutine_wrapper(1) - with self.assertWarns(DeprecationWarning): - self.assertIsNone(sys.get_coroutine_wrapper()) - - def test_set_wrapper_3(self): - async def foo(): - return 'spam' - - def wrapper(coro): - async def wrap(coro): - return await coro - return wrap(coro) - - with self.assertWarns(DeprecationWarning): - sys.set_coroutine_wrapper(wrapper) - try: - with silence_coro_gc(), self.assertRaisesRegex( - RuntimeError, - r"coroutine wrapper.*\.wrapper at 0x.*attempted to " - r"recursively wrap .* wrap .*"): - - foo() - - finally: - with self.assertWarns(DeprecationWarning): - sys.set_coroutine_wrapper(None) - - def test_set_wrapper_4(self): - @types.coroutine - def foo(): - return 'spam' - - wrapped = None - def wrap(gen): - nonlocal wrapped - wrapped = gen - return gen - - with self.assertWarns(DeprecationWarning): - sys.set_coroutine_wrapper(wrap) - try: - foo() - self.assertIs( - wrapped, None, - "generator-based coroutine was wrapped via " - "sys.set_coroutine_wrapper") - finally: - with self.assertWarns(DeprecationWarning): - sys.set_coroutine_wrapper(None) - - class OriginTrackingTest(unittest.TestCase): def here(self): info = inspect.getframeinfo(inspect.currentframe().f_back) diff --git a/Misc/NEWS.d/next/Library/2019-05-26-10-16-55.bpo-36933.4w3eP9.rst b/Misc/NEWS.d/next/Library/2019-05-26-10-16-55.bpo-36933.4w3eP9.rst new file mode 100644 index 000000000000..dc2be7a140cf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-26-10-16-55.bpo-36933.4w3eP9.rst @@ -0,0 +1,2 @@ +The functions ``sys.set_coroutine_wrapper`` and ``sys.get_coroutine_wrapper`` +that were deprecated and marked for removal in 3.8 have been removed. diff --git a/Python/ceval.c b/Python/ceval.c index cb5a4beb2a66..9263df9b8fc4 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4143,19 +4143,8 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, /* Handle generator/coroutine/asynchronous generator */ if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) { PyObject *gen; - PyObject *coro_wrapper = tstate->coroutine_wrapper; int is_coro = co->co_flags & CO_COROUTINE; - if (is_coro && tstate->in_coroutine_wrapper) { - assert(coro_wrapper != NULL); - _PyErr_Format(tstate, PyExc_RuntimeError, - "coroutine wrapper %.200R attempted " - "to recursively wrap %.200R", - coro_wrapper, - co); - goto fail; - } - /* Don't need to keep the reference to f_back, it will be set * when the generator is resumed. */ Py_CLEAR(f->f_back); @@ -4175,14 +4164,6 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, _PyObject_GC_TRACK(f); - if (is_coro && coro_wrapper != NULL) { - PyObject *wrapped; - tstate->in_coroutine_wrapper = 1; - wrapped = PyObject_CallFunction(coro_wrapper, "N", gen); - tstate->in_coroutine_wrapper = 0; - return wrapped; - } - return gen; } @@ -4633,26 +4614,6 @@ _PyEval_GetCoroutineOriginTrackingDepth(void) return tstate->coroutine_origin_tracking_depth; } -void -_PyEval_SetCoroutineWrapper(PyObject *wrapper) -{ - PyThreadState *tstate = _PyThreadState_GET(); - - if (PySys_Audit("sys.set_coroutine_wrapper", NULL) < 0) { - return; - } - - Py_XINCREF(wrapper); - Py_XSETREF(tstate->coroutine_wrapper, wrapper); -} - -PyObject * -_PyEval_GetCoroutineWrapper(void) -{ - PyThreadState *tstate = _PyThreadState_GET(); - return tstate->coroutine_wrapper; -} - void _PyEval_SetAsyncGenFirstiter(PyObject *firstiter) { diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index 5df8af1a1172..6f248ff18d9d 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -510,33 +510,6 @@ sys_get_coroutine_origin_tracking_depth(PyObject *module, PyObject *Py_UNUSED(ig return return_value; } -PyDoc_STRVAR(sys_set_coroutine_wrapper__doc__, -"set_coroutine_wrapper($module, wrapper, /)\n" -"--\n" -"\n" -"Set a wrapper for coroutine objects."); - -#define SYS_SET_COROUTINE_WRAPPER_METHODDEF \ - {"set_coroutine_wrapper", (PyCFunction)sys_set_coroutine_wrapper, METH_O, sys_set_coroutine_wrapper__doc__}, - -PyDoc_STRVAR(sys_get_coroutine_wrapper__doc__, -"get_coroutine_wrapper($module, /)\n" -"--\n" -"\n" -"Return the wrapper for coroutines set by sys.set_coroutine_wrapper."); - -#define SYS_GET_COROUTINE_WRAPPER_METHODDEF \ - {"get_coroutine_wrapper", (PyCFunction)sys_get_coroutine_wrapper, METH_NOARGS, sys_get_coroutine_wrapper__doc__}, - -static PyObject * -sys_get_coroutine_wrapper_impl(PyObject *module); - -static PyObject * -sys_get_coroutine_wrapper(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return sys_get_coroutine_wrapper_impl(module); -} - PyDoc_STRVAR(sys_get_asyncgen_hooks__doc__, "get_asyncgen_hooks($module, /)\n" "--\n" @@ -1109,4 +1082,4 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=03da2eb03135d9f2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=43c4fde7b5783d8d input=a9049054013a1b77]*/ diff --git a/Python/pystate.c b/Python/pystate.c index d1a8d2472470..833e0fb30dcb 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -606,9 +606,6 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->coroutine_origin_tracking_depth = 0; - tstate->coroutine_wrapper = NULL; - tstate->in_coroutine_wrapper = 0; - tstate->async_gen_firstiter = NULL; tstate->async_gen_finalizer = NULL; @@ -802,7 +799,6 @@ PyThreadState_Clear(PyThreadState *tstate) Py_CLEAR(tstate->c_profileobj); Py_CLEAR(tstate->c_traceobj); - Py_CLEAR(tstate->coroutine_wrapper); Py_CLEAR(tstate->async_gen_firstiter); Py_CLEAR(tstate->async_gen_finalizer); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 24018e25fa57..343601ec8596 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1158,62 +1158,6 @@ sys_get_coroutine_origin_tracking_depth_impl(PyObject *module) return _PyEval_GetCoroutineOriginTrackingDepth(); } -/*[clinic input] -sys.set_coroutine_wrapper - - wrapper: object - / - -Set a wrapper for coroutine objects. -[clinic start generated code]*/ - -static PyObject * -sys_set_coroutine_wrapper(PyObject *module, PyObject *wrapper) -/*[clinic end generated code: output=9c7db52d65f6b188 input=df6ac09a06afef34]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "set_coroutine_wrapper is deprecated", 1) < 0) { - return NULL; - } - - if (wrapper != Py_None) { - if (!PyCallable_Check(wrapper)) { - PyErr_Format(PyExc_TypeError, - "callable expected, got %.50s", - Py_TYPE(wrapper)->tp_name); - return NULL; - } - _PyEval_SetCoroutineWrapper(wrapper); - } - else { - _PyEval_SetCoroutineWrapper(NULL); - } - Py_RETURN_NONE; -} - -/*[clinic input] -sys.get_coroutine_wrapper - -Return the wrapper for coroutines set by sys.set_coroutine_wrapper. -[clinic start generated code]*/ - -static PyObject * -sys_get_coroutine_wrapper_impl(PyObject *module) -/*[clinic end generated code: output=b74a7e4b14fe898e input=ef0351fb9ece0bb4]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "get_coroutine_wrapper is deprecated", 1) < 0) { - return NULL; - } - PyObject *wrapper = _PyEval_GetCoroutineWrapper(); - if (wrapper == NULL) { - wrapper = Py_None; - } - Py_INCREF(wrapper); - return wrapper; -} - - static PyTypeObject AsyncGenHooksType; PyDoc_STRVAR(asyncgen_hooks_doc, @@ -2002,8 +1946,6 @@ static PyMethodDef sys_methods[] = { SYS__DEBUGMALLOCSTATS_METHODDEF SYS_SET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF SYS_GET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF - SYS_SET_COROUTINE_WRAPPER_METHODDEF - SYS_GET_COROUTINE_WRAPPER_METHODDEF {"set_asyncgen_hooks", (PyCFunction)(void(*)(void))sys_set_asyncgen_hooks, METH_VARARGS | METH_KEYWORDS, set_asyncgen_hooks_doc}, SYS_GET_ASYNCGEN_HOOKS_METHODDEF From webhook-mailer at python.org Tue May 28 03:40:22 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Tue, 28 May 2019 07:40:22 -0000 Subject: [Python-checkins] bpo-37058: PEP 544: Add Protocol to typing module (GH-13585) Message-ID: https://github.com/python/cpython/commit/74d7f76e2c953fbfdb7ce01b7319d91d471cc5ef commit: 74d7f76e2c953fbfdb7ce01b7319d91d471cc5ef branch: master author: Ivan Levkivskyi committer: GitHub date: 2019-05-28T08:40:15+01:00 summary: bpo-37058: PEP 544: Add Protocol to typing module (GH-13585) I tried to get rid of the `_ProtocolMeta`, but unfortunately it didn'y work. My idea to return a generic alias from `@runtime_checkable` made runtime protocols unpickleable. I am not sure what is worse (a custom metaclass or having some classes unpickleable), so I decided to stick with the status quo (since there were no complains so far). So essentially this is a copy of the implementation in `typing_extensions` with two modifications: * Rename `@runtime` to `@runtime_checkable` (plus corresponding updates). * Allow protocols that extend `collections.abc.Iterable` etc. files: A Misc/NEWS.d/next/Library/2019-05-26-19-05-24.bpo-37058.jmRu_g.rst M Doc/library/typing.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 27787fc2cb86..709580ad2159 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -17,7 +17,8 @@ -------------- -This module supports type hints as specified by :pep:`484` and :pep:`526`. +This module provides runtime support for type hints as specified by +:pep:`484`, :pep:`526`, :pep:`544`, :pep:`586`, :pep:`589`, and :pep:`591`. The most fundamental support consists of the types :data:`Any`, :data:`Union`, :data:`Tuple`, :data:`Callable`, :class:`TypeVar`, and :class:`Generic`. For full specification please see :pep:`484`. For @@ -392,6 +393,48 @@ it as a return value) of a more specialized type is a type error. For example:: Use :class:`object` to indicate that a value could be any type in a typesafe manner. Use :data:`Any` to indicate that a value is dynamically typed. + +Nominal vs structural subtyping +------------------------------- + +Initially :pep:`484` defined Python static type system as using +*nominal subtyping*. This means that a class ``A`` is allowed where +a class ``B`` is expected if and only if ``A`` is a subclass of ``B``. + +This requirement previously also applied to abstract base classes, such as +:class:`Iterable`. The problem with this approach is that a class had +to be explicitly marked to support them, which is unpythonic and unlike +what one would normally do in idiomatic dynamically typed Python code. +For example, this conforms to the :pep:`484`:: + + from typing import Sized, Iterable, Iterator + + class Bucket(Sized, Iterable[int]): + ... + def __len__(self) -> int: ... + def __iter__(self) -> Iterator[int]: ... + +:pep:`544` allows to solve this problem by allowing users to write +the above code without explicit base classes in the class definition, +allowing ``Bucket`` to be implicitly considered a subtype of both ``Sized`` +and ``Iterable[int]`` by static type checkers. This is known as +*structural subtyping* (or static duck-typing):: + + from typing import Iterator, Iterable + + class Bucket: # Note: no base classes + ... + def __len__(self) -> int: ... + def __iter__(self) -> Iterator[int]: ... + + def collect(items: Iterable[int]) -> int: ... + result = collect(Bucket()) # Passes type check + +Moreover, by subclassing a special class :class:`Protocol`, a user +can define new custom protocols to fully enjoy structural subtyping +(see examples below). + + Classes, functions, and decorators ---------------------------------- @@ -459,6 +502,39 @@ The module defines the following classes, functions and decorators: except KeyError: return default +.. class:: Protocol(Generic) + + Base class for protocol classes. Protocol classes are defined like this:: + + class Proto(Protocol): + def meth(self) -> int: + ... + + Such classes are primarily used with static type checkers that recognize + structural subtyping (static duck-typing), for example:: + + class C: + def meth(self) -> int: + return 0 + + def func(x: Proto) -> int: + return x.meth() + + func(C()) # Passes static type check + + See :pep:`544` for details. Protocol classes decorated with + :func:`runtime_checkable` (described later) act as simple-minded runtime + protocols that check only the presence of given attributes, ignoring their + type signatures. + + Protocol classes can be generic, for example:: + + class GenProto(Protocol[T]): + def meth(self) -> T: + ... + + .. versionadded:: 3.8 + .. class:: Type(Generic[CT_co]) A variable annotated with ``C`` may accept a value of type ``C``. In @@ -1033,6 +1109,26 @@ The module defines the following classes, functions and decorators: Note that returning instances of private classes is not recommended. It is usually preferable to make such classes public. +.. decorator:: runtime_checkable + + Mark a protocol class as a runtime protocol. + + Such a protocol can be used with :func:`isinstance` and :func:`issubclass`. + This raises :exc:`TypeError` when applied to a non-protocol class. This + allows a simple-minded structural check, very similar to "one trick ponies" + in :mod:`collections.abc` such as :class:`Iterable`. For example:: + + @runtime_checkable + class Closable(Protocol): + def close(self): ... + + assert isinstance(open('/some/file'), Closable) + + **Warning:** this will check only the presence of the required methods, + not their type signatures! + + .. versionadded:: 3.8 + .. data:: Any Special type indicating an unconstrained type. diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 46b7621182d6..2b4b934d69f2 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -12,8 +12,8 @@ from typing import Union, Optional, Literal from typing import Tuple, List, MutableMapping from typing import Callable -from typing import Generic, ClassVar, Final, final -from typing import cast +from typing import Generic, ClassVar, Final, final, Protocol +from typing import cast, runtime_checkable from typing import get_type_hints from typing import no_type_check, no_type_check_decorator from typing import Type @@ -24,6 +24,7 @@ import abc import typing import weakref +import types from test import mod_generics_cache @@ -585,7 +586,710 @@ def get(self, key: str, default=None): return default +class Coordinate(Protocol): + x: int + y: int + + at runtime_checkable +class Point(Coordinate, Protocol): + label: str + +class MyPoint: + x: int + y: int + label: str + +class XAxis(Protocol): + x: int + +class YAxis(Protocol): + y: int + + at runtime_checkable +class Position(XAxis, YAxis, Protocol): + pass + + at runtime_checkable +class Proto(Protocol): + attr: int + def meth(self, arg: str) -> int: + ... + +class Concrete(Proto): + pass + +class Other: + attr: int = 1 + def meth(self, arg: str) -> int: + if arg == 'this': + return 1 + return 0 + +class NT(NamedTuple): + x: int + y: int + + at runtime_checkable +class HasCallProtocol(Protocol): + __call__: typing.Callable + + class ProtocolTests(BaseTestCase): + def test_basic_protocol(self): + @runtime_checkable + class P(Protocol): + def meth(self): + pass + + class C: pass + + class D: + def meth(self): + pass + + def f(): + pass + + self.assertIsSubclass(D, P) + self.assertIsInstance(D(), P) + self.assertNotIsSubclass(C, P) + self.assertNotIsInstance(C(), P) + self.assertNotIsSubclass(types.FunctionType, P) + self.assertNotIsInstance(f, P) + + def test_everything_implements_empty_protocol(self): + @runtime_checkable + class Empty(Protocol): + pass + + class C: + pass + + def f(): + pass + + for thing in (object, type, tuple, C, types.FunctionType): + self.assertIsSubclass(thing, Empty) + for thing in (object(), 1, (), typing, f): + self.assertIsInstance(thing, Empty) + + def test_function_implements_protocol(self): + def f(): + pass + + self.assertIsInstance(f, HasCallProtocol) + + def test_no_inheritance_from_nominal(self): + class C: pass + + class BP(Protocol): pass + + with self.assertRaises(TypeError): + class P(C, Protocol): + pass + with self.assertRaises(TypeError): + class P(Protocol, C): + pass + with self.assertRaises(TypeError): + class P(BP, C, Protocol): + pass + + class D(BP, C): pass + + class E(C, BP): pass + + self.assertNotIsInstance(D(), E) + self.assertNotIsInstance(E(), D) + + def test_no_instantiation(self): + class P(Protocol): pass + + with self.assertRaises(TypeError): + P() + + class C(P): pass + + self.assertIsInstance(C(), C) + T = TypeVar('T') + + class PG(Protocol[T]): pass + + with self.assertRaises(TypeError): + PG() + with self.assertRaises(TypeError): + PG[int]() + with self.assertRaises(TypeError): + PG[T]() + + class CG(PG[T]): pass + + self.assertIsInstance(CG[int](), CG) + + def test_cannot_instantiate_abstract(self): + @runtime_checkable + class P(Protocol): + @abc.abstractmethod + def ameth(self) -> int: + raise NotImplementedError + + class B(P): + pass + + class C(B): + def ameth(self) -> int: + return 26 + + with self.assertRaises(TypeError): + B() + self.assertIsInstance(C(), P) + + def test_subprotocols_extending(self): + class P1(Protocol): + def meth1(self): + pass + + @runtime_checkable + class P2(P1, Protocol): + def meth2(self): + pass + + class C: + def meth1(self): + pass + + def meth2(self): + pass + + class C1: + def meth1(self): + pass + + class C2: + def meth2(self): + pass + + self.assertNotIsInstance(C1(), P2) + self.assertNotIsInstance(C2(), P2) + self.assertNotIsSubclass(C1, P2) + self.assertNotIsSubclass(C2, P2) + self.assertIsInstance(C(), P2) + self.assertIsSubclass(C, P2) + + def test_subprotocols_merging(self): + class P1(Protocol): + def meth1(self): + pass + + class P2(Protocol): + def meth2(self): + pass + + @runtime_checkable + class P(P1, P2, Protocol): + pass + + class C: + def meth1(self): + pass + + def meth2(self): + pass + + class C1: + def meth1(self): + pass + + class C2: + def meth2(self): + pass + + self.assertNotIsInstance(C1(), P) + self.assertNotIsInstance(C2(), P) + self.assertNotIsSubclass(C1, P) + self.assertNotIsSubclass(C2, P) + self.assertIsInstance(C(), P) + self.assertIsSubclass(C, P) + + def test_protocols_issubclass(self): + T = TypeVar('T') + + @runtime_checkable + class P(Protocol): + def x(self): ... + + @runtime_checkable + class PG(Protocol[T]): + def x(self): ... + + class BadP(Protocol): + def x(self): ... + + class BadPG(Protocol[T]): + def x(self): ... + + class C: + def x(self): ... + + self.assertIsSubclass(C, P) + self.assertIsSubclass(C, PG) + self.assertIsSubclass(BadP, PG) + + with self.assertRaises(TypeError): + issubclass(C, PG[T]) + with self.assertRaises(TypeError): + issubclass(C, PG[C]) + with self.assertRaises(TypeError): + issubclass(C, BadP) + with self.assertRaises(TypeError): + issubclass(C, BadPG) + with self.assertRaises(TypeError): + issubclass(P, PG[T]) + with self.assertRaises(TypeError): + issubclass(PG, PG[int]) + + def test_protocols_issubclass_non_callable(self): + class C: + x = 1 + + @runtime_checkable + class PNonCall(Protocol): + x = 1 + + with self.assertRaises(TypeError): + issubclass(C, PNonCall) + self.assertIsInstance(C(), PNonCall) + PNonCall.register(C) + with self.assertRaises(TypeError): + issubclass(C, PNonCall) + self.assertIsInstance(C(), PNonCall) + + # check that non-protocol subclasses are not affected + class D(PNonCall): ... + + self.assertNotIsSubclass(C, D) + self.assertNotIsInstance(C(), D) + D.register(C) + self.assertIsSubclass(C, D) + self.assertIsInstance(C(), D) + with self.assertRaises(TypeError): + issubclass(D, PNonCall) + + def test_protocols_isinstance(self): + T = TypeVar('T') + + @runtime_checkable + class P(Protocol): + def meth(x): ... + + @runtime_checkable + class PG(Protocol[T]): + def meth(x): ... + + class BadP(Protocol): + def meth(x): ... + + class BadPG(Protocol[T]): + def meth(x): ... + + class C: + def meth(x): ... + + self.assertIsInstance(C(), P) + self.assertIsInstance(C(), PG) + with self.assertRaises(TypeError): + isinstance(C(), PG[T]) + with self.assertRaises(TypeError): + isinstance(C(), PG[C]) + with self.assertRaises(TypeError): + isinstance(C(), BadP) + with self.assertRaises(TypeError): + isinstance(C(), BadPG) + + def test_protocols_isinstance_py36(self): + class APoint: + def __init__(self, x, y, label): + self.x = x + self.y = y + self.label = label + + class BPoint: + label = 'B' + + def __init__(self, x, y): + self.x = x + self.y = y + + class C: + def __init__(self, attr): + self.attr = attr + + def meth(self, arg): + return 0 + + class Bad: pass + + self.assertIsInstance(APoint(1, 2, 'A'), Point) + self.assertIsInstance(BPoint(1, 2), Point) + self.assertNotIsInstance(MyPoint(), Point) + self.assertIsInstance(BPoint(1, 2), Position) + self.assertIsInstance(Other(), Proto) + self.assertIsInstance(Concrete(), Proto) + self.assertIsInstance(C(42), Proto) + self.assertNotIsInstance(Bad(), Proto) + self.assertNotIsInstance(Bad(), Point) + self.assertNotIsInstance(Bad(), Position) + self.assertNotIsInstance(Bad(), Concrete) + self.assertNotIsInstance(Other(), Concrete) + self.assertIsInstance(NT(1, 2), Position) + + def test_protocols_isinstance_init(self): + T = TypeVar('T') + + @runtime_checkable + class P(Protocol): + x = 1 + + @runtime_checkable + class PG(Protocol[T]): + x = 1 + + class C: + def __init__(self, x): + self.x = x + + self.assertIsInstance(C(1), P) + self.assertIsInstance(C(1), PG) + + def test_protocols_support_register(self): + @runtime_checkable + class P(Protocol): + x = 1 + + class PM(Protocol): + def meth(self): pass + + class D(PM): pass + + class C: pass + + D.register(C) + P.register(C) + self.assertIsInstance(C(), P) + self.assertIsInstance(C(), D) + + def test_none_on_non_callable_doesnt_block_implementation(self): + @runtime_checkable + class P(Protocol): + x = 1 + + class A: + x = 1 + + class B(A): + x = None + + class C: + def __init__(self): + self.x = None + + self.assertIsInstance(B(), P) + self.assertIsInstance(C(), P) + + def test_none_on_callable_blocks_implementation(self): + @runtime_checkable + class P(Protocol): + def x(self): ... + + class A: + def x(self): ... + + class B(A): + x = None + + class C: + def __init__(self): + self.x = None + + self.assertNotIsInstance(B(), P) + self.assertNotIsInstance(C(), P) + + def test_non_protocol_subclasses(self): + class P(Protocol): + x = 1 + + @runtime_checkable + class PR(Protocol): + def meth(self): pass + + class NonP(P): + x = 1 + + class NonPR(PR): pass + + class C: + x = 1 + + class D: + def meth(self): pass + + self.assertNotIsInstance(C(), NonP) + self.assertNotIsInstance(D(), NonPR) + self.assertNotIsSubclass(C, NonP) + self.assertNotIsSubclass(D, NonPR) + self.assertIsInstance(NonPR(), PR) + self.assertIsSubclass(NonPR, PR) + + def test_custom_subclasshook(self): + class P(Protocol): + x = 1 + + class OKClass: pass + + class BadClass: + x = 1 + + class C(P): + @classmethod + def __subclasshook__(cls, other): + return other.__name__.startswith("OK") + + self.assertIsInstance(OKClass(), C) + self.assertNotIsInstance(BadClass(), C) + self.assertIsSubclass(OKClass, C) + self.assertNotIsSubclass(BadClass, C) + + def test_issubclass_fails_correctly(self): + @runtime_checkable + class P(Protocol): + x = 1 + + class C: pass + + with self.assertRaises(TypeError): + issubclass(C(), P) + + def test_defining_generic_protocols(self): + T = TypeVar('T') + S = TypeVar('S') + + @runtime_checkable + class PR(Protocol[T, S]): + def meth(self): pass + + class P(PR[int, T], Protocol[T]): + y = 1 + + with self.assertRaises(TypeError): + PR[int] + with self.assertRaises(TypeError): + P[int, str] + with self.assertRaises(TypeError): + PR[int, 1] + with self.assertRaises(TypeError): + PR[int, ClassVar] + + class C(PR[int, T]): pass + + self.assertIsInstance(C[str](), C) + + def test_defining_generic_protocols_old_style(self): + T = TypeVar('T') + S = TypeVar('S') + + @runtime_checkable + class PR(Protocol, Generic[T, S]): + def meth(self): pass + + class P(PR[int, str], Protocol): + y = 1 + + with self.assertRaises(TypeError): + issubclass(PR[int, str], PR) + self.assertIsSubclass(P, PR) + with self.assertRaises(TypeError): + PR[int] + with self.assertRaises(TypeError): + PR[int, 1] + + class P1(Protocol, Generic[T]): + def bar(self, x: T) -> str: ... + + class P2(Generic[T], Protocol): + def bar(self, x: T) -> str: ... + + @runtime_checkable + class PSub(P1[str], Protocol): + x = 1 + + class Test: + x = 1 + + def bar(self, x: str) -> str: + return x + + self.assertIsInstance(Test(), PSub) + with self.assertRaises(TypeError): + PR[int, ClassVar] + + def test_init_called(self): + T = TypeVar('T') + + class P(Protocol[T]): pass + + class C(P[T]): + def __init__(self): + self.test = 'OK' + + self.assertEqual(C[int]().test, 'OK') + + def test_protocols_bad_subscripts(self): + T = TypeVar('T') + S = TypeVar('S') + with self.assertRaises(TypeError): + class P(Protocol[T, T]): pass + with self.assertRaises(TypeError): + class P(Protocol[int]): pass + with self.assertRaises(TypeError): + class P(Protocol[T], Protocol[S]): pass + with self.assertRaises(TypeError): + class P(typing.Mapping[T, S], Protocol[T]): pass + + def test_generic_protocols_repr(self): + T = TypeVar('T') + S = TypeVar('S') + + class P(Protocol[T, S]): pass + + self.assertTrue(repr(P[T, S]).endswith('P[~T, ~S]')) + self.assertTrue(repr(P[int, str]).endswith('P[int, str]')) + + def test_generic_protocols_eq(self): + T = TypeVar('T') + S = TypeVar('S') + + class P(Protocol[T, S]): pass + + self.assertEqual(P, P) + self.assertEqual(P[int, T], P[int, T]) + self.assertEqual(P[T, T][Tuple[T, S]][int, str], + P[Tuple[int, str], Tuple[int, str]]) + + def test_generic_protocols_special_from_generic(self): + T = TypeVar('T') + + class P(Protocol[T]): pass + + self.assertEqual(P.__parameters__, (T,)) + self.assertEqual(P[int].__parameters__, ()) + self.assertEqual(P[int].__args__, (int,)) + self.assertIs(P[int].__origin__, P) + + def test_generic_protocols_special_from_protocol(self): + @runtime_checkable + class PR(Protocol): + x = 1 + + class P(Protocol): + def meth(self): + pass + + T = TypeVar('T') + + class PG(Protocol[T]): + x = 1 + + def meth(self): + pass + + self.assertTrue(P._is_protocol) + self.assertTrue(PR._is_protocol) + self.assertTrue(PG._is_protocol) + self.assertFalse(P._is_runtime_protocol) + self.assertTrue(PR._is_runtime_protocol) + self.assertTrue(PG[int]._is_protocol) + self.assertEqual(typing._get_protocol_attrs(P), {'meth'}) + self.assertEqual(typing._get_protocol_attrs(PR), {'x'}) + self.assertEqual(frozenset(typing._get_protocol_attrs(PG)), + frozenset({'x', 'meth'})) + + def test_no_runtime_deco_on_nominal(self): + with self.assertRaises(TypeError): + @runtime_checkable + class C: pass + + class Proto(Protocol): + x = 1 + + with self.assertRaises(TypeError): + @runtime_checkable + class Concrete(Proto): + pass + + def test_none_treated_correctly(self): + @runtime_checkable + class P(Protocol): + x = None # type: int + + class B(object): pass + + self.assertNotIsInstance(B(), P) + + class C: + x = 1 + + class D: + x = None + + self.assertIsInstance(C(), P) + self.assertIsInstance(D(), P) + + class CI: + def __init__(self): + self.x = 1 + + class DI: + def __init__(self): + self.x = None + + self.assertIsInstance(C(), P) + self.assertIsInstance(D(), P) + + def test_protocols_in_unions(self): + class P(Protocol): + x = None # type: int + + Alias = typing.Union[typing.Iterable, P] + Alias2 = typing.Union[P, typing.Iterable] + self.assertEqual(Alias, Alias2) + + def test_protocols_pickleable(self): + global P, CP # pickle wants to reference the class by name + T = TypeVar('T') + + @runtime_checkable + class P(Protocol[T]): + x = 1 + + class CP(P[int]): + pass + + c = CP() + c.foo = 42 + c.bar = 'abc' + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + z = pickle.dumps(c, proto) + x = pickle.loads(z) + self.assertEqual(x.foo, 42) + self.assertEqual(x.bar, 'abc') + self.assertEqual(x.x, 1) + self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'}) + s = pickle.dumps(P) + D = pickle.loads(s) + + class E: + x = 1 + + self.assertIsInstance(E(), D) def test_supports_int(self): self.assertIsSubclass(int, typing.SupportsInt) @@ -634,9 +1338,8 @@ def test_supports_index(self): self.assertIsSubclass(int, typing.SupportsIndex) self.assertNotIsSubclass(str, typing.SupportsIndex) - def test_protocol_instance_type_error(self): - with self.assertRaises(TypeError): - isinstance(0, typing.SupportsAbs) + def test_bundled_protocol_instance_works(self): + self.assertIsInstance(0, typing.SupportsAbs) class C1(typing.SupportsInt): def __int__(self) -> int: return 42 @@ -645,6 +1348,20 @@ class C2(C1): c = C2() self.assertIsInstance(c, C1) + def test_collections_protocols_allowed(self): + @runtime_checkable + class Custom(collections.abc.Iterable, Protocol): + def close(self): ... + + class A: pass + class B: + def __iter__(self): + return [] + def close(self): + return 0 + + self.assertIsSubclass(B, Custom) + self.assertNotIsSubclass(A, Custom) class GenericTests(BaseTestCase): @@ -771,7 +1488,7 @@ def test_new_repr_complex(self): def test_new_repr_bare(self): T = TypeVar('T') self.assertEqual(repr(Generic[T]), 'typing.Generic[~T]') - self.assertEqual(repr(typing._Protocol[T]), 'typing._Protocol[~T]') + self.assertEqual(repr(typing.Protocol[T]), 'typing.Protocol[~T]') class C(typing.Dict[Any, Any]): ... # this line should just work repr(C.__mro__) @@ -1067,7 +1784,7 @@ def test_fail_with_bare_generic(self): with self.assertRaises(TypeError): Tuple[Generic[T]] with self.assertRaises(TypeError): - List[typing._Protocol] + List[typing.Protocol] def test_type_erasure_special(self): T = TypeVar('T') diff --git a/Lib/typing.py b/Lib/typing.py index d3e84cd64abe..14bd06b2b745 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -9,8 +9,7 @@ * The core of internal generics API: _GenericAlias and _VariadicGenericAlias, the latter is currently only used by Tuple and Callable. All subscripted types like X[int], Union[int, str], etc., are instances of either of these classes. -* The public counterpart of the generics API consists of two classes: Generic and Protocol - (the latter is currently private, but will be made public after PEP 544 acceptance). +* The public counterpart of the generics API consists of two classes: Generic and Protocol. * Public helper functions: get_type_hints, overload, cast, no_type_check, no_type_check_decorator. * Generic aliases for collections.abc ABCs and few additional protocols. @@ -18,7 +17,7 @@ * Wrapper submodules for re and io related types. """ -from abc import abstractmethod, abstractproperty +from abc import abstractmethod, abstractproperty, ABCMeta import collections import collections.abc import contextlib @@ -39,6 +38,7 @@ 'Generic', 'Literal', 'Optional', + 'Protocol', 'Tuple', 'Type', 'TypeVar', @@ -102,6 +102,7 @@ 'no_type_check_decorator', 'NoReturn', 'overload', + 'runtime_checkable', 'Text', 'TYPE_CHECKING', ] @@ -123,7 +124,7 @@ def _type_check(arg, msg, is_argument=True): We append the repr() of the actual value (truncated to 100 chars). """ - invalid_generic_forms = (Generic, _Protocol) + invalid_generic_forms = (Generic, Protocol) if is_argument: invalid_generic_forms = invalid_generic_forms + (ClassVar, Final) @@ -135,7 +136,7 @@ def _type_check(arg, msg, is_argument=True): arg.__origin__ in invalid_generic_forms): raise TypeError(f"{arg} is not valid as type argument") if (isinstance(arg, _SpecialForm) and arg not in (Any, NoReturn) or - arg in (Generic, _Protocol)): + arg in (Generic, Protocol)): raise TypeError(f"Plain {arg} is not valid as type argument") if isinstance(arg, (type, TypeVar, ForwardRef)): return arg @@ -665,8 +666,8 @@ def __init__(self, origin, params, *, inst=True, special=False, name=None): @_tp_cache def __getitem__(self, params): - if self.__origin__ in (Generic, _Protocol): - # Can't subscript Generic[...] or _Protocol[...]. + if self.__origin__ in (Generic, Protocol): + # Can't subscript Generic[...] or Protocol[...]. raise TypeError(f"Cannot subscript already-subscripted {self}") if not isinstance(params, tuple): params = (params,) @@ -733,6 +734,8 @@ def __mro_entries__(self, bases): res.append(Generic) return tuple(res) if self.__origin__ is Generic: + if Protocol in bases: + return () i = bases.index(self) for b in bases[i+1:]: if isinstance(b, _GenericAlias) and b is not self: @@ -850,10 +853,11 @@ def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: return default """ __slots__ = () + _is_protocol = False def __new__(cls, *args, **kwds): - if cls is Generic: - raise TypeError("Type Generic cannot be instantiated; " + if cls in (Generic, Protocol): + raise TypeError(f"Type {cls.__name__} cannot be instantiated; " "it can be used only as a base class") if super().__new__ is object.__new__ and cls.__init__ is not object.__init__: obj = super().__new__(cls) @@ -870,17 +874,14 @@ def __class_getitem__(cls, params): f"Parameter list to {cls.__qualname__}[...] cannot be empty") msg = "Parameters to generic types must be types." params = tuple(_type_check(p, msg) for p in params) - if cls is Generic: - # Generic can only be subscripted with unique type variables. + if cls in (Generic, Protocol): + # Generic and Protocol can only be subscripted with unique type variables. if not all(isinstance(p, TypeVar) for p in params): raise TypeError( - "Parameters to Generic[...] must all be type variables") + f"Parameters to {cls.__name__}[...] must all be type variables") if len(set(params)) != len(params): raise TypeError( - "Parameters to Generic[...] must all be unique") - elif cls is _Protocol: - # _Protocol is internal at the moment, just skip the check - pass + f"Parameters to {cls.__name__}[...] must all be unique") else: # Subscripting a regular Generic subclass. _check_generic(cls, params) @@ -892,7 +893,7 @@ def __init_subclass__(cls, *args, **kwargs): if '__orig_bases__' in cls.__dict__: error = Generic in cls.__orig_bases__ else: - error = Generic in cls.__bases__ and cls.__name__ != '_Protocol' + error = Generic in cls.__bases__ and cls.__name__ != 'Protocol' if error: raise TypeError("Cannot inherit from plain Generic") if '__orig_bases__' in cls.__dict__: @@ -910,9 +911,7 @@ def __init_subclass__(cls, *args, **kwargs): raise TypeError( "Cannot inherit from Generic[...] multiple types.") gvars = base.__parameters__ - if gvars is None: - gvars = tvars - else: + if gvars is not None: tvarset = set(tvars) gvarset = set(gvars) if not tvarset <= gvarset: @@ -935,6 +934,204 @@ class _TypingEllipsis: """Internal placeholder for ... (ellipsis).""" +_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__', + '_is_protocol', '_is_runtime_protocol'] + +_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__', + '__init__', '__module__', '__new__', '__slots__', + '__subclasshook__', '__weakref__'] + +# These special attributes will be not collected as protocol members. +EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker'] + + +def _get_protocol_attrs(cls): + """Collect protocol members from a protocol class objects. + + This includes names actually defined in the class dictionary, as well + as names that appear in annotations. Special names (above) are skipped. + """ + attrs = set() + for base in cls.__mro__[:-1]: # without object + if base.__name__ in ('Protocol', 'Generic'): + continue + annotations = getattr(base, '__annotations__', {}) + for attr in list(base.__dict__.keys()) + list(annotations.keys()): + if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES: + attrs.add(attr) + return attrs + + +def _is_callable_members_only(cls): + # PEP 544 prohibits using issubclass() with protocols that have non-method members. + return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls)) + + +def _no_init(self, *args, **kwargs): + if type(self)._is_protocol: + raise TypeError('Protocols cannot be instantiated') + + +def _allow_reckless_class_cheks(): + """Allow instnance and class checks for special stdlib modules. + + The abc and functools modules indiscriminately call isinstance() and + issubclass() on the whole MRO of a user class, which may contain protocols. + """ + try: + return sys._getframe(3).f_globals['__name__'] in ['abc', 'functools'] + except (AttributeError, ValueError): # For platforms without _getframe(). + return True + + +_PROTO_WHITELIST = ['Callable', 'Awaitable', + 'Iterable', 'Iterator', 'AsyncIterable', 'AsyncIterator', + 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', + 'ContextManager', 'AsyncContextManager'] + + +class _ProtocolMeta(ABCMeta): + # This metaclass is really unfortunate and exists only because of + # the lack of __instancehook__. + def __instancecheck__(cls, instance): + # We need this method for situations where attributes are + # assigned in __init__. + if ((not getattr(cls, '_is_protocol', False) or + _is_callable_members_only(cls)) and + issubclass(instance.__class__, cls)): + return True + if cls._is_protocol: + if all(hasattr(instance, attr) and + # All *methods* can be blocked by setting them to None. + (not callable(getattr(cls, attr, None)) or + getattr(instance, attr) is not None) + for attr in _get_protocol_attrs(cls)): + return True + return super().__instancecheck__(instance) + + +class Protocol(Generic, metaclass=_ProtocolMeta): + """Base class for protocol classes. + + Protocol classes are defined as:: + + class Proto(Protocol): + def meth(self) -> int: + ... + + Such classes are primarily used with static type checkers that recognize + structural subtyping (static duck-typing), for example:: + + class C: + def meth(self) -> int: + return 0 + + def func(x: Proto) -> int: + return x.meth() + + func(C()) # Passes static type check + + See PEP 544 for details. Protocol classes decorated with + @typing.runtime_checkable act as simple-minded runtime protocols that check + only the presence of given attributes, ignoring their type signatures. + Protocol classes can be generic, they are defined as:: + + class GenProto(Protocol[T]): + def meth(self) -> T: + ... + """ + __slots__ = () + _is_protocol = True + _is_runtime_protocol = False + + def __init_subclass__(cls, *args, **kwargs): + super().__init_subclass__(*args, **kwargs) + + # Determine if this is a protocol or a concrete subclass. + if not cls.__dict__.get('_is_protocol', False): + cls._is_protocol = any(b is Protocol for b in cls.__bases__) + + # Set (or override) the protocol subclass hook. + def _proto_hook(other): + if not cls.__dict__.get('_is_protocol', False): + return NotImplemented + + # First, perform various sanity checks. + if not getattr(cls, '_is_runtime_protocol', False): + if _allow_reckless_class_cheks(): + return NotImplemented + raise TypeError("Instance and class checks can only be used with" + " @runtime_checkable protocols") + if not _is_callable_members_only(cls): + if _allow_reckless_class_cheks(): + return NotImplemented + raise TypeError("Protocols with non-method members" + " don't support issubclass()") + if not isinstance(other, type): + # Same error message as for issubclass(1, int). + raise TypeError('issubclass() arg 1 must be a class') + + # Second, perform the actual structural compatibility check. + for attr in _get_protocol_attrs(cls): + for base in other.__mro__: + # Check if the members appears in the class dictionary... + if attr in base.__dict__: + if base.__dict__[attr] is None: + return NotImplemented + break + + # ...or in annotations, if it is a sub-protocol. + annotations = getattr(base, '__annotations__', {}) + if (isinstance(annotations, collections.abc.Mapping) and + attr in annotations and + issubclass(other, Generic) and other._is_protocol): + break + else: + return NotImplemented + return True + + if '__subclasshook__' not in cls.__dict__: + cls.__subclasshook__ = _proto_hook + + # We have nothing more to do for non-protocols... + if not cls._is_protocol: + return + + # ... otherwise check consistency of bases, and prohibit instantiation. + for base in cls.__bases__: + if not (base in (object, Generic) or + base.__module__ == 'collections.abc' and base.__name__ in _PROTO_WHITELIST or + issubclass(base, Generic) and base._is_protocol): + raise TypeError('Protocols can only inherit from other' + ' protocols, got %r' % base) + cls.__init__ = _no_init + + +def runtime_checkable(cls): + """Mark a protocol class as a runtime protocol. + + Such protocol can be used with isinstance() and issubclass(). + Raise TypeError if applied to a non-protocol class. + This allows a simple-minded structural check very similar to + one trick ponies in collections.abc such as Iterable. + For example:: + + @runtime_checkable + class Closable(Protocol): + def close(self): ... + + assert isinstance(open('/some/file'), Closable) + + Warning: this will check only the presence of the required methods, + not their type signatures! + """ + if not issubclass(cls, Generic) or not cls._is_protocol: + raise TypeError('@runtime_checkable can be only applied to protocol classes,' + ' got %r' % cls) + cls._is_runtime_protocol = True + return cls + + def cast(typ, val): """Cast a value to a type. @@ -1159,90 +1356,6 @@ class Other(Leaf): # Error reported by type checker return f -class _ProtocolMeta(type): - """Internal metaclass for _Protocol. - - This exists so _Protocol classes can be generic without deriving - from Generic. - """ - - def __instancecheck__(self, obj): - if _Protocol not in self.__bases__: - return super().__instancecheck__(obj) - raise TypeError("Protocols cannot be used with isinstance().") - - def __subclasscheck__(self, cls): - if not self._is_protocol: - # No structural checks since this isn't a protocol. - return NotImplemented - - if self is _Protocol: - # Every class is a subclass of the empty protocol. - return True - - # Find all attributes defined in the protocol. - attrs = self._get_protocol_attrs() - - for attr in attrs: - if not any(attr in d.__dict__ for d in cls.__mro__): - return False - return True - - def _get_protocol_attrs(self): - # Get all Protocol base classes. - protocol_bases = [] - for c in self.__mro__: - if getattr(c, '_is_protocol', False) and c.__name__ != '_Protocol': - protocol_bases.append(c) - - # Get attributes included in protocol. - attrs = set() - for base in protocol_bases: - for attr in base.__dict__.keys(): - # Include attributes not defined in any non-protocol bases. - for c in self.__mro__: - if (c is not base and attr in c.__dict__ and - not getattr(c, '_is_protocol', False)): - break - else: - if (not attr.startswith('_abc_') and - attr != '__abstractmethods__' and - attr != '__annotations__' and - attr != '__weakref__' and - attr != '_is_protocol' and - attr != '_gorg' and - attr != '__dict__' and - attr != '__args__' and - attr != '__slots__' and - attr != '_get_protocol_attrs' and - attr != '__next_in_mro__' and - attr != '__parameters__' and - attr != '__origin__' and - attr != '__orig_bases__' and - attr != '__extra__' and - attr != '__tree_hash__' and - attr != '__module__'): - attrs.add(attr) - - return attrs - - -class _Protocol(Generic, metaclass=_ProtocolMeta): - """Internal base class for protocol classes. - - This implements a simple-minded structural issubclass check - (similar but more general than the one-offs in collections.abc - such as Hashable). - """ - - __slots__ = () - - _is_protocol = True - - def __class_getitem__(cls, params): - return super().__class_getitem__(params) - - # Some unconstrained type variables. These are used by the container types. # (These are not for export.) T = TypeVar('T') # Any type. @@ -1347,7 +1460,8 @@ def new_user(user_class: Type[U]) -> U: """ -class SupportsInt(_Protocol): + at runtime_checkable +class SupportsInt(Protocol): __slots__ = () @abstractmethod @@ -1355,7 +1469,8 @@ def __int__(self) -> int: pass -class SupportsFloat(_Protocol): + at runtime_checkable +class SupportsFloat(Protocol): __slots__ = () @abstractmethod @@ -1363,7 +1478,8 @@ def __float__(self) -> float: pass -class SupportsComplex(_Protocol): + at runtime_checkable +class SupportsComplex(Protocol): __slots__ = () @abstractmethod @@ -1371,7 +1487,8 @@ def __complex__(self) -> complex: pass -class SupportsBytes(_Protocol): + at runtime_checkable +class SupportsBytes(Protocol): __slots__ = () @abstractmethod @@ -1379,7 +1496,8 @@ def __bytes__(self) -> bytes: pass -class SupportsIndex(_Protocol): + at runtime_checkable +class SupportsIndex(Protocol): __slots__ = () @abstractmethod @@ -1387,7 +1505,8 @@ def __index__(self) -> int: pass -class SupportsAbs(_Protocol[T_co]): + at runtime_checkable +class SupportsAbs(Protocol[T_co]): __slots__ = () @abstractmethod @@ -1395,7 +1514,8 @@ def __abs__(self) -> T_co: pass -class SupportsRound(_Protocol[T_co]): + at runtime_checkable +class SupportsRound(Protocol[T_co]): __slots__ = () @abstractmethod diff --git a/Misc/NEWS.d/next/Library/2019-05-26-19-05-24.bpo-37058.jmRu_g.rst b/Misc/NEWS.d/next/Library/2019-05-26-19-05-24.bpo-37058.jmRu_g.rst new file mode 100644 index 000000000000..329b82c12adf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-26-19-05-24.bpo-37058.jmRu_g.rst @@ -0,0 +1 @@ +PEP 544: Add ``Protocol`` and ``@runtime_checkable`` to the ``typing`` module. \ No newline at end of file From webhook-mailer at python.org Tue May 28 04:35:37 2019 From: webhook-mailer at python.org (Julien Palard) Date: Tue, 28 May 2019 08:35:37 -0000 Subject: [Python-checkins] DOC: Unnecessary plural. (GH-13613) Message-ID: https://github.com/python/cpython/commit/9ee2c264c37a71bd1c60f6032c50630b87e3c611 commit: 9ee2c264c37a71bd1c60f6032c50630b87e3c611 branch: master author: Julien Palard committer: GitHub date: 2019-05-28T10:35:25+02:00 summary: DOC: Unnecessary plural. (GH-13613) files: M Doc/library/gettext.rst diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst index 7f4eab5843f5..937330bb201b 100644 --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -39,7 +39,7 @@ class-based API instead. Bind the *domain* to the locale directory *localedir*. More concretely, :mod:`gettext` will look for binary :file:`.mo` files for the given domain using the path (on Unix): :file:`{localedir}/{language}/LC_MESSAGES/{domain}.mo`, where - *languages* is searched for in the environment variables :envvar:`LANGUAGE`, + *language* is searched for in the environment variables :envvar:`LANGUAGE`, :envvar:`LC_ALL`, :envvar:`LC_MESSAGES`, and :envvar:`LANG` respectively. If *localedir* is omitted or ``None``, then the current binding for *domain* is From webhook-mailer at python.org Tue May 28 05:52:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 09:52:20 -0000 Subject: [Python-checkins] bpo-29883: Asyncio proactor udp (GH-13440) Message-ID: https://github.com/python/cpython/commit/bafd4b5ac83b6cc0b7455290a04c4bfad34bdc90 commit: bafd4b5ac83b6cc0b7455290a04c4bfad34bdc90 branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T02:52:15-07:00 summary: bpo-29883: Asyncio proactor udp (GH-13440) Follow-up for #1067 https://bugs.python.org/issue29883 files: A Misc/NEWS.d/next/Windows/2018-09-15-11-36-55.bpo-29883.HErerE.rst M Doc/library/asyncio-eventloop.rst M Doc/library/asyncio-platforms.rst M Lib/asyncio/proactor_events.py M Lib/asyncio/windows_events.py M Lib/test/test_asyncio/test_events.py M Lib/test/test_asyncio/test_proactor_events.py M Modules/overlapped.c diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 4acd23f59465..8673f84e9638 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -504,8 +504,6 @@ Opening network connections transport. If specified, *local_addr* and *remote_addr* should be omitted (must be :const:`None`). - On Windows, with :class:`ProactorEventLoop`, this method is not supported. - See :ref:`UDP echo client protocol ` and :ref:`UDP echo server protocol ` examples. @@ -513,6 +511,9 @@ Opening network connections The *family*, *proto*, *flags*, *reuse_address*, *reuse_port, *allow_broadcast*, and *sock* parameters were added. + .. versionchanged:: 3.8 + Added support for Windows. + .. coroutinemethod:: loop.create_unix_connection(protocol_factory, \ path=None, \*, ssl=None, sock=None, \ server_hostname=None, ssl_handshake_timeout=None) diff --git a/Doc/library/asyncio-platforms.rst b/Doc/library/asyncio-platforms.rst index 81d840e23277..7e4a70f91c6e 100644 --- a/Doc/library/asyncio-platforms.rst +++ b/Doc/library/asyncio-platforms.rst @@ -53,9 +53,6 @@ All event loops on Windows do not support the following methods: :class:`ProactorEventLoop` has the following limitations: -* The :meth:`loop.create_datagram_endpoint` method - is not supported. - * The :meth:`loop.add_reader` and :meth:`loop.add_writer` methods are not supported. diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 6a53b2edaac1..9b8ae064a892 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -11,6 +11,7 @@ import socket import warnings import signal +import collections from . import base_events from . import constants @@ -23,6 +24,24 @@ from .log import logger +def _set_socket_extra(transport, sock): + transport._extra['socket'] = trsock.TransportSocket(sock) + + try: + transport._extra['sockname'] = sock.getsockname() + except socket.error: + if transport._loop.get_debug(): + logger.warning( + "getsockname() failed on %r", sock, exc_info=True) + + if 'peername' not in transport._extra: + try: + transport._extra['peername'] = sock.getpeername() + except socket.error: + # UDP sockets may not have a peer name + transport._extra['peername'] = None + + class _ProactorBasePipeTransport(transports._FlowControlMixin, transports.BaseTransport): """Base class for pipe and socket transports.""" @@ -430,6 +449,134 @@ def _pipe_closed(self, fut): self.close() +class _ProactorDatagramTransport(_ProactorBasePipeTransport): + max_size = 256 * 1024 + def __init__(self, loop, sock, protocol, address=None, + waiter=None, extra=None): + self._address = address + self._empty_waiter = None + # We don't need to call _protocol.connection_made() since our base + # constructor does it for us. + super().__init__(loop, sock, protocol, waiter=waiter, extra=extra) + + # The base constructor sets _buffer = None, so we set it here + self._buffer = collections.deque() + self._loop.call_soon(self._loop_reading) + + def _set_extra(self, sock): + _set_socket_extra(self, sock) + + def get_write_buffer_size(self): + return sum(len(data) for data, _ in self._buffer) + + def abort(self): + self._force_close(None) + + def sendto(self, data, addr=None): + if not isinstance(data, (bytes, bytearray, memoryview)): + raise TypeError('data argument must be bytes-like object (%r)', + type(data)) + + if not data: + return + + if self._address is not None and addr not in (None, self._address): + raise ValueError( + f'Invalid address: must be None or {self._address}') + + if self._conn_lost and self._address: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + logger.warning('socket.sendto() raised exception.') + self._conn_lost += 1 + return + + # Ensure that what we buffer is immutable. + self._buffer.append((bytes(data), addr)) + + if self._write_fut is None: + # No current write operations are active, kick one off + self._loop_writing() + # else: A write operation is already kicked off + + self._maybe_pause_protocol() + + def _loop_writing(self, fut=None): + try: + if self._conn_lost: + return + + assert fut is self._write_fut + self._write_fut = None + if fut: + # We are in a _loop_writing() done callback, get the result + fut.result() + + if not self._buffer or (self._conn_lost and self._address): + # The connection has been closed + if self._closing: + self._loop.call_soon(self._call_connection_lost, None) + return + + data, addr = self._buffer.popleft() + if self._address is not None: + self._write_fut = self._loop._proactor.send(self._sock, + data) + else: + self._write_fut = self._loop._proactor.sendto(self._sock, + data, + addr=addr) + except OSError as exc: + self._protocol.error_received(exc) + except Exception as exc: + self._fatal_error(exc, 'Fatal write error on datagram transport') + else: + self._write_fut.add_done_callback(self._loop_writing) + self._maybe_resume_protocol() + + def _loop_reading(self, fut=None): + data = None + try: + if self._conn_lost: + return + + assert self._read_fut is fut or (self._read_fut is None and + self._closing) + + self._read_fut = None + if fut is not None: + res = fut.result() + + if self._closing: + # since close() has been called we ignore any read data + data = None + return + + if self._address is not None: + data, addr = res, self._address + else: + data, addr = res + + if self._conn_lost: + return + if self._address is not None: + self._read_fut = self._loop._proactor.recv(self._sock, + self.max_size) + else: + self._read_fut = self._loop._proactor.recvfrom(self._sock, + self.max_size) + except OSError as exc: + self._protocol.error_received(exc) + except exceptions.CancelledError: + if not self._closing: + raise + else: + if self._read_fut is not None: + self._read_fut.add_done_callback(self._loop_reading) + finally: + if data: + self._protocol.datagram_received(data, addr) + + class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, _ProactorBaseWritePipeTransport, transports.Transport): @@ -455,22 +602,7 @@ def __init__(self, loop, sock, protocol, waiter=None, base_events._set_nodelay(sock) def _set_extra(self, sock): - self._extra['socket'] = trsock.TransportSocket(sock) - - try: - self._extra['sockname'] = sock.getsockname() - except (socket.error, AttributeError): - if self._loop.get_debug(): - logger.warning( - "getsockname() failed on %r", sock, exc_info=True) - - if 'peername' not in self._extra: - try: - self._extra['peername'] = sock.getpeername() - except (socket.error, AttributeError): - if self._loop.get_debug(): - logger.warning("getpeername() failed on %r", - sock, exc_info=True) + _set_socket_extra(self, sock) def can_write_eof(self): return True @@ -515,6 +647,11 @@ def _make_ssl_transport( extra=extra, server=server) return ssl_protocol._app_transport + def _make_datagram_transport(self, sock, protocol, + address=None, waiter=None, extra=None): + return _ProactorDatagramTransport(self, sock, protocol, address, + waiter, extra) + def _make_duplex_pipe_transport(self, sock, protocol, waiter=None, extra=None): return _ProactorDuplexPipeTransport(self, diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index 61b40ba52a64..ac51109ff1a8 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -483,6 +483,44 @@ def finish_recv(trans, key, ov): return self._register(ov, conn, finish_recv) + def recvfrom(self, conn, nbytes, flags=0): + self._register_with_iocp(conn) + ov = _overlapped.Overlapped(NULL) + try: + ov.WSARecvFrom(conn.fileno(), nbytes, flags) + except BrokenPipeError: + return self._result((b'', None)) + + def finish_recv(trans, key, ov): + try: + return ov.getresult() + except OSError as exc: + if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED, + _overlapped.ERROR_OPERATION_ABORTED): + raise ConnectionResetError(*exc.args) + else: + raise + + return self._register(ov, conn, finish_recv) + + def sendto(self, conn, buf, flags=0, addr=None): + self._register_with_iocp(conn) + ov = _overlapped.Overlapped(NULL) + + ov.WSASendTo(conn.fileno(), buf, flags, addr) + + def finish_send(trans, key, ov): + try: + return ov.getresult() + except OSError as exc: + if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED, + _overlapped.ERROR_OPERATION_ABORTED): + raise ConnectionResetError(*exc.args) + else: + raise + + return self._register(ov, conn, finish_send) + def send(self, conn, buf, flags=0): self._register_with_iocp(conn) ov = _overlapped.Overlapped(NULL) @@ -532,6 +570,14 @@ def finish_accept(trans, key, ov): return future def connect(self, conn, address): + if conn.type == socket.SOCK_DGRAM: + # WSAConnect will complete immediately for UDP sockets so we don't + # need to register any IOCP operation + _overlapped.WSAConnect(conn.fileno(), address) + fut = self._loop.create_future() + fut.set_result(None) + return fut + self._register_with_iocp(conn) # The socket needs to be locally bound before we call ConnectEx(). try: diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index e89db99df312..045654e87a85 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1249,11 +1249,6 @@ def datagram_received(self, data, addr): server.transport.close() def test_create_datagram_endpoint_sock(self): - if (sys.platform == 'win32' and - isinstance(self.loop, proactor_events.BaseProactorEventLoop)): - raise unittest.SkipTest( - 'UDP is not supported with proactor event loops') - sock = None local_address = ('127.0.0.1', 0) infos = self.loop.run_until_complete( @@ -2004,10 +1999,6 @@ def test_writer_callback(self): def test_writer_callback_cancel(self): raise unittest.SkipTest("IocpEventLoop does not have add_writer()") - def test_create_datagram_endpoint(self): - raise unittest.SkipTest( - "IocpEventLoop does not have create_datagram_endpoint()") - def test_remove_fds_after_closing(self): raise unittest.SkipTest("IocpEventLoop does not have add_reader()") else: diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py index 5952ccccce0e..2e9995d32807 100644 --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -4,6 +4,7 @@ import socket import unittest import sys +from collections import deque from unittest import mock import asyncio @@ -12,6 +13,7 @@ from asyncio.proactor_events import _ProactorSocketTransport from asyncio.proactor_events import _ProactorWritePipeTransport from asyncio.proactor_events import _ProactorDuplexPipeTransport +from asyncio.proactor_events import _ProactorDatagramTransport from test import support from test.test_asyncio import utils as test_utils @@ -725,6 +727,208 @@ def test_pause_resume_reading(self): self.assertFalse(tr.is_reading()) +class ProactorDatagramTransportTests(test_utils.TestCase): + + def setUp(self): + super().setUp() + self.loop = self.new_test_loop() + self.proactor = mock.Mock() + self.loop._proactor = self.proactor + self.protocol = test_utils.make_test_protocol(asyncio.DatagramProtocol) + self.sock = mock.Mock(spec_set=socket.socket) + self.sock.fileno.return_value = 7 + + def datagram_transport(self, address=None): + self.sock.getpeername.side_effect = None if address else OSError + transport = _ProactorDatagramTransport(self.loop, self.sock, + self.protocol, + address=address) + self.addCleanup(close_transport, transport) + return transport + + def test_sendto(self): + data = b'data' + transport = self.datagram_transport() + transport.sendto(data, ('0.0.0.0', 1234)) + self.assertTrue(self.proactor.sendto.called) + self.proactor.sendto.assert_called_with( + self.sock, data, addr=('0.0.0.0', 1234)) + + def test_sendto_bytearray(self): + data = bytearray(b'data') + transport = self.datagram_transport() + transport.sendto(data, ('0.0.0.0', 1234)) + self.assertTrue(self.proactor.sendto.called) + self.proactor.sendto.assert_called_with( + self.sock, b'data', addr=('0.0.0.0', 1234)) + + def test_sendto_memoryview(self): + data = memoryview(b'data') + transport = self.datagram_transport() + transport.sendto(data, ('0.0.0.0', 1234)) + self.assertTrue(self.proactor.sendto.called) + self.proactor.sendto.assert_called_with( + self.sock, b'data', addr=('0.0.0.0', 1234)) + + def test_sendto_no_data(self): + transport = self.datagram_transport() + transport._buffer.append((b'data', ('0.0.0.0', 12345))) + transport.sendto(b'', ()) + self.assertFalse(self.sock.sendto.called) + self.assertEqual( + [(b'data', ('0.0.0.0', 12345))], list(transport._buffer)) + + def test_sendto_buffer(self): + transport = self.datagram_transport() + transport._buffer.append((b'data1', ('0.0.0.0', 12345))) + transport._write_fut = object() + transport.sendto(b'data2', ('0.0.0.0', 12345)) + self.assertFalse(self.proactor.sendto.called) + self.assertEqual( + [(b'data1', ('0.0.0.0', 12345)), + (b'data2', ('0.0.0.0', 12345))], + list(transport._buffer)) + + def test_sendto_buffer_bytearray(self): + data2 = bytearray(b'data2') + transport = self.datagram_transport() + transport._buffer.append((b'data1', ('0.0.0.0', 12345))) + transport._write_fut = object() + transport.sendto(data2, ('0.0.0.0', 12345)) + self.assertFalse(self.proactor.sendto.called) + self.assertEqual( + [(b'data1', ('0.0.0.0', 12345)), + (b'data2', ('0.0.0.0', 12345))], + list(transport._buffer)) + self.assertIsInstance(transport._buffer[1][0], bytes) + + def test_sendto_buffer_memoryview(self): + data2 = memoryview(b'data2') + transport = self.datagram_transport() + transport._buffer.append((b'data1', ('0.0.0.0', 12345))) + transport._write_fut = object() + transport.sendto(data2, ('0.0.0.0', 12345)) + self.assertFalse(self.proactor.sendto.called) + self.assertEqual( + [(b'data1', ('0.0.0.0', 12345)), + (b'data2', ('0.0.0.0', 12345))], + list(transport._buffer)) + self.assertIsInstance(transport._buffer[1][0], bytes) + + @mock.patch('asyncio.proactor_events.logger') + def test_sendto_exception(self, m_log): + data = b'data' + err = self.proactor.sendto.side_effect = RuntimeError() + + transport = self.datagram_transport() + transport._fatal_error = mock.Mock() + transport.sendto(data, ()) + + self.assertTrue(transport._fatal_error.called) + transport._fatal_error.assert_called_with( + err, + 'Fatal write error on datagram transport') + transport._conn_lost = 1 + + transport._address = ('123',) + transport.sendto(data) + transport.sendto(data) + transport.sendto(data) + transport.sendto(data) + transport.sendto(data) + m_log.warning.assert_called_with('socket.sendto() raised exception.') + + def test_sendto_error_received(self): + data = b'data' + + self.sock.sendto.side_effect = ConnectionRefusedError + + transport = self.datagram_transport() + transport._fatal_error = mock.Mock() + transport.sendto(data, ()) + + self.assertEqual(transport._conn_lost, 0) + self.assertFalse(transport._fatal_error.called) + + def test_sendto_error_received_connected(self): + data = b'data' + + self.proactor.send.side_effect = ConnectionRefusedError + + transport = self.datagram_transport(address=('0.0.0.0', 1)) + transport._fatal_error = mock.Mock() + transport.sendto(data) + + self.assertFalse(transport._fatal_error.called) + self.assertTrue(self.protocol.error_received.called) + + def test_sendto_str(self): + transport = self.datagram_transport() + self.assertRaises(TypeError, transport.sendto, 'str', ()) + + def test_sendto_connected_addr(self): + transport = self.datagram_transport(address=('0.0.0.0', 1)) + self.assertRaises( + ValueError, transport.sendto, b'str', ('0.0.0.0', 2)) + + def test_sendto_closing(self): + transport = self.datagram_transport(address=(1,)) + transport.close() + self.assertEqual(transport._conn_lost, 1) + transport.sendto(b'data', (1,)) + self.assertEqual(transport._conn_lost, 2) + + def test__loop_writing_closing(self): + transport = self.datagram_transport() + transport._closing = True + transport._loop_writing() + self.assertIsNone(transport._write_fut) + test_utils.run_briefly(self.loop) + self.sock.close.assert_called_with() + self.protocol.connection_lost.assert_called_with(None) + + def test__loop_writing_exception(self): + err = self.proactor.sendto.side_effect = RuntimeError() + + transport = self.datagram_transport() + transport._fatal_error = mock.Mock() + transport._buffer.append((b'data', ())) + transport._loop_writing() + + transport._fatal_error.assert_called_with( + err, + 'Fatal write error on datagram transport') + + def test__loop_writing_error_received(self): + self.proactor.sendto.side_effect = ConnectionRefusedError + + transport = self.datagram_transport() + transport._fatal_error = mock.Mock() + transport._buffer.append((b'data', ())) + transport._loop_writing() + + self.assertFalse(transport._fatal_error.called) + + def test__loop_writing_error_received_connection(self): + self.proactor.send.side_effect = ConnectionRefusedError + + transport = self.datagram_transport(address=('0.0.0.0', 1)) + transport._fatal_error = mock.Mock() + transport._buffer.append((b'data', ())) + transport._loop_writing() + + self.assertFalse(transport._fatal_error.called) + self.assertTrue(self.protocol.error_received.called) + + @mock.patch('asyncio.base_events.logger.error') + def test_fatal_error_connected(self, m_exc): + transport = self.datagram_transport(address=('0.0.0.0', 1)) + err = ConnectionRefusedError() + transport._fatal_error(err) + self.assertFalse(self.protocol.error_received.called) + m_exc.assert_not_called() + + class BaseProactorEventLoopTests(test_utils.TestCase): def setUp(self): @@ -864,6 +1068,80 @@ def test_stop_serving(self): self.assertFalse(sock2.close.called) self.assertFalse(future2.cancel.called) + def datagram_transport(self): + self.protocol = test_utils.make_test_protocol(asyncio.DatagramProtocol) + return self.loop._make_datagram_transport(self.sock, self.protocol) + + def test_make_datagram_transport(self): + tr = self.datagram_transport() + self.assertIsInstance(tr, _ProactorDatagramTransport) + close_transport(tr) + + def test_datagram_loop_writing(self): + tr = self.datagram_transport() + tr._buffer.appendleft((b'data', ('127.0.0.1', 12068))) + tr._loop_writing() + self.loop._proactor.sendto.assert_called_with(self.sock, b'data', addr=('127.0.0.1', 12068)) + self.loop._proactor.sendto.return_value.add_done_callback.\ + assert_called_with(tr._loop_writing) + + close_transport(tr) + + def test_datagram_loop_reading(self): + tr = self.datagram_transport() + tr._loop_reading() + self.loop._proactor.recvfrom.assert_called_with(self.sock, 256 * 1024) + self.assertFalse(self.protocol.datagram_received.called) + self.assertFalse(self.protocol.error_received.called) + close_transport(tr) + + def test_datagram_loop_reading_data(self): + res = asyncio.Future(loop=self.loop) + res.set_result((b'data', ('127.0.0.1', 12068))) + + tr = self.datagram_transport() + tr._read_fut = res + tr._loop_reading(res) + self.loop._proactor.recvfrom.assert_called_with(self.sock, 256 * 1024) + self.protocol.datagram_received.assert_called_with(b'data', ('127.0.0.1', 12068)) + close_transport(tr) + + def test_datagram_loop_reading_no_data(self): + res = asyncio.Future(loop=self.loop) + res.set_result((b'', ('127.0.0.1', 12068))) + + tr = self.datagram_transport() + self.assertRaises(AssertionError, tr._loop_reading, res) + + tr.close = mock.Mock() + tr._read_fut = res + tr._loop_reading(res) + self.assertTrue(self.loop._proactor.recvfrom.called) + self.assertFalse(self.protocol.error_received.called) + self.assertFalse(tr.close.called) + close_transport(tr) + + def test_datagram_loop_reading_aborted(self): + err = self.loop._proactor.recvfrom.side_effect = ConnectionAbortedError() + + tr = self.datagram_transport() + tr._fatal_error = mock.Mock() + tr._protocol.error_received = mock.Mock() + tr._loop_reading() + tr._protocol.error_received.assert_called_with(err) + close_transport(tr) + + def test_datagram_loop_writing_aborted(self): + err = self.loop._proactor.sendto.side_effect = ConnectionAbortedError() + + tr = self.datagram_transport() + tr._fatal_error = mock.Mock() + tr._protocol.error_received = mock.Mock() + tr._buffer.appendleft((b'Hello', ('127.0.0.1', 12068))) + tr._loop_writing() + tr._protocol.error_received.assert_called_with(err) + close_transport(tr) + @unittest.skipIf(sys.platform != 'win32', 'Proactor is supported on Windows only') diff --git a/Misc/NEWS.d/next/Windows/2018-09-15-11-36-55.bpo-29883.HErerE.rst b/Misc/NEWS.d/next/Windows/2018-09-15-11-36-55.bpo-29883.HErerE.rst new file mode 100644 index 000000000000..b6d1375c7752 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2018-09-15-11-36-55.bpo-29883.HErerE.rst @@ -0,0 +1,2 @@ +Add Windows support for UDP transports for the Proactor Event Loop. Patch by +Adam Meily. diff --git a/Modules/overlapped.c b/Modules/overlapped.c index e5a209bf7582..aad531e47893 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -39,7 +39,8 @@ enum {TYPE_NONE, TYPE_NOT_STARTED, TYPE_READ, TYPE_READINTO, TYPE_WRITE, TYPE_ACCEPT, TYPE_CONNECT, TYPE_DISCONNECT, TYPE_CONNECT_NAMED_PIPE, - TYPE_WAIT_NAMED_PIPE_AND_CONNECT, TYPE_TRANSMIT_FILE}; + TYPE_WAIT_NAMED_PIPE_AND_CONNECT, TYPE_TRANSMIT_FILE, TYPE_READ_FROM, + TYPE_WRITE_TO}; typedef struct { PyObject_HEAD @@ -53,8 +54,19 @@ typedef struct { union { /* Buffer allocated by us: TYPE_READ and TYPE_ACCEPT */ PyObject *allocated_buffer; - /* Buffer passed by the user: TYPE_WRITE and TYPE_READINTO */ + /* Buffer passed by the user: TYPE_WRITE, TYPE_WRITE_TO, and TYPE_READINTO */ Py_buffer user_buffer; + + /* Data used for reading from a connectionless socket: + TYPE_READ_FROM */ + struct { + // A (buffer, (host, port)) tuple + PyObject *result; + // The actual read buffer + PyObject *allocated_buffer; + struct sockaddr_in6 address; + int address_length; + } read_from; }; } OverlappedObject; @@ -570,16 +582,32 @@ static int Overlapped_clear(OverlappedObject *self) { switch (self->type) { - case TYPE_READ: - case TYPE_ACCEPT: - Py_CLEAR(self->allocated_buffer); - break; - case TYPE_WRITE: - case TYPE_READINTO: - if (self->user_buffer.obj) { - PyBuffer_Release(&self->user_buffer); + case TYPE_READ: + case TYPE_ACCEPT: { + Py_CLEAR(self->allocated_buffer); + break; + } + case TYPE_READ_FROM: { + // An initial call to WSARecvFrom will only allocate the buffer. + // The result tuple of (message, address) is only + // allocated _after_ a message has been received. + if(self->read_from.result) { + // We've received a message, free the result tuple. + Py_CLEAR(self->read_from.result); + } + if(self->read_from.allocated_buffer) { + Py_CLEAR(self->read_from.allocated_buffer); + } + break; + } + case TYPE_WRITE: + case TYPE_WRITE_TO: + case TYPE_READINTO: { + if (self->user_buffer.obj) { + PyBuffer_Release(&self->user_buffer); + } + break; } - break; } self->type = TYPE_NOT_STARTED; return 0; @@ -627,6 +655,73 @@ Overlapped_dealloc(OverlappedObject *self) SetLastError(olderr); } + +/* Convert IPv4 sockaddr to a Python str. */ + +static PyObject * +make_ipv4_addr(const struct sockaddr_in *addr) +{ + char buf[INET_ADDRSTRLEN]; + if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + return PyUnicode_FromString(buf); +} + +#ifdef ENABLE_IPV6 +/* Convert IPv6 sockaddr to a Python str. */ + +static PyObject * +make_ipv6_addr(const struct sockaddr_in6 *addr) +{ + char buf[INET6_ADDRSTRLEN]; + if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + return PyUnicode_FromString(buf); +} +#endif + +static PyObject* +unparse_address(LPSOCKADDR Address, DWORD Length) +{ + /* The function is adopted from mocketmodule.c makesockaddr()*/ + + switch(Address->sa_family) { + case AF_INET: { + const struct sockaddr_in *a = (const struct sockaddr_in *)Address; + PyObject *addrobj = make_ipv4_addr(a); + PyObject *ret = NULL; + if (addrobj) { + ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port)); + Py_DECREF(addrobj); + } + return ret; + } +#ifdef ENABLE_IPV6 + case AF_INET6: { + const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)Address; + PyObject *addrobj = make_ipv6_addr(a); + PyObject *ret = NULL; + if (addrobj) { + ret = Py_BuildValue("OiII", + addrobj, + ntohs(a->sin6_port), + ntohl(a->sin6_flowinfo), + a->sin6_scope_id); + Py_DECREF(addrobj); + } + return ret; + } +#endif /* ENABLE_IPV6 */ + default: { + return SetFromWindowsErr(ERROR_INVALID_PARAMETER); + } + } +} + PyDoc_STRVAR( Overlapped_cancel_doc, "cancel() -> None\n\n" @@ -670,6 +765,7 @@ Overlapped_getresult(OverlappedObject *self, PyObject *args) DWORD transferred = 0; BOOL ret; DWORD err; + PyObject *addr; if (!PyArg_ParseTuple(args, "|" F_BOOL, &wait)) return NULL; @@ -695,8 +791,15 @@ Overlapped_getresult(OverlappedObject *self, PyObject *args) case ERROR_MORE_DATA: break; case ERROR_BROKEN_PIPE: - if (self->type == TYPE_READ || self->type == TYPE_READINTO) + if (self->type == TYPE_READ || self->type == TYPE_READINTO) { break; + } + else if (self->type == TYPE_READ_FROM && + (self->read_from.result != NULL || + self->read_from.allocated_buffer != NULL)) + { + break; + } /* fall through */ default: return SetFromWindowsErr(err); @@ -708,8 +811,43 @@ Overlapped_getresult(OverlappedObject *self, PyObject *args) if (transferred != PyBytes_GET_SIZE(self->allocated_buffer) && _PyBytes_Resize(&self->allocated_buffer, transferred)) return NULL; + Py_INCREF(self->allocated_buffer); return self->allocated_buffer; + case TYPE_READ_FROM: + assert(PyBytes_CheckExact(self->read_from.allocated_buffer)); + + if (transferred != PyBytes_GET_SIZE( + self->read_from.allocated_buffer) && + _PyBytes_Resize(&self->read_from.allocated_buffer, transferred)) + { + return NULL; + } + + // unparse the address + addr = unparse_address((SOCKADDR*)&self->read_from.address, + self->read_from.address_length); + + if (addr == NULL) { + return NULL; + } + + // The result is a two item tuple: (message, address) + self->read_from.result = PyTuple_New(2); + if (self->read_from.result == NULL) { + Py_CLEAR(addr); + return NULL; + } + + // first item: message + Py_INCREF(self->read_from.allocated_buffer); + PyTuple_SET_ITEM(self->read_from.result, 0, + self->read_from.allocated_buffer); + // second item: address + PyTuple_SET_ITEM(self->read_from.result, 1, addr); + + Py_INCREF(self->read_from.result); + return self->read_from.result; default: return PyLong_FromUnsignedLong((unsigned long) transferred); } @@ -1121,7 +1259,6 @@ parse_address(PyObject *obj, SOCKADDR *Address, int Length) return -1; } - PyDoc_STRVAR( Overlapped_ConnectEx_doc, "ConnectEx(client_handle, address_as_bytes) -> Overlapped[None]\n\n" @@ -1314,7 +1451,7 @@ PyDoc_STRVAR( "Connect to the pipe for asynchronous I/O (overlapped)."); static PyObject * -ConnectPipe(OverlappedObject *self, PyObject *args) +overlapped_ConnectPipe(PyObject *self, PyObject *args) { PyObject *AddressObj; wchar_t *Address; @@ -1362,15 +1499,213 @@ Overlapped_traverse(OverlappedObject *self, visitproc visit, void *arg) Py_VISIT(self->allocated_buffer); break; case TYPE_WRITE: + case TYPE_WRITE_TO: case TYPE_READINTO: if (self->user_buffer.obj) { Py_VISIT(&self->user_buffer.obj); } break; + case TYPE_READ_FROM: + if(self->read_from.result) { + Py_VISIT(self->read_from.result); + } + if(self->read_from.allocated_buffer) { + Py_VISIT(self->read_from.allocated_buffer); + } } return 0; } +// UDP functions + +PyDoc_STRVAR( + WSAConnect_doc, + "WSAConnect(client_handle, address_as_bytes) -> Overlapped[None]\n\n" + "Bind a remote address to a connectionless (UDP) socket"); + +/* + * Note: WSAConnect does not support Overlapped I/O so this function should + * _only_ be used for connectionless sockets (UDP). + */ +static PyObject * +overlapped_WSAConnect(PyObject *self, PyObject *args) +{ + SOCKET ConnectSocket; + PyObject *AddressObj; + char AddressBuf[sizeof(struct sockaddr_in6)]; + SOCKADDR *Address = (SOCKADDR*)AddressBuf; + int Length; + int err; + + if (!PyArg_ParseTuple(args, F_HANDLE "O", &ConnectSocket, &AddressObj)) { + return NULL; + } + + Length = sizeof(AddressBuf); + Length = parse_address(AddressObj, Address, Length); + if (Length < 0) { + return NULL; + } + + Py_BEGIN_ALLOW_THREADS + // WSAConnect does not support overlapped I/O so this call will + // successfully complete immediately. + err = WSAConnect(ConnectSocket, Address, Length, + NULL, NULL, NULL, NULL); + Py_END_ALLOW_THREADS + + if (err == 0) { + Py_RETURN_NONE; + } + else { + return SetFromWindowsErr(WSAGetLastError()); + } +} + +PyDoc_STRVAR( + Overlapped_WSASendTo_doc, + "WSASendTo(handle, buf, flags, address_as_bytes) -> " + "Overlapped[bytes_transferred]\n\n" + "Start overlapped sendto over a connectionless (UDP) socket"); + +static PyObject * +Overlapped_WSASendTo(OverlappedObject *self, PyObject *args) +{ + HANDLE handle; + PyObject *bufobj; + DWORD flags; + PyObject *AddressObj; + char AddressBuf[sizeof(struct sockaddr_in6)]; + SOCKADDR *Address = (SOCKADDR*)AddressBuf; + int AddressLength; + DWORD written; + WSABUF wsabuf; + int ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE "O" F_DWORD "O", + &handle, &bufobj, &flags, &AddressObj)) + { + return NULL; + } + + // Parse the "to" address + AddressLength = sizeof(AddressBuf); + AddressLength = parse_address(AddressObj, Address, AddressLength); + if (AddressLength < 0) { + return NULL; + } + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + + if (!PyArg_Parse(bufobj, "y*", &self->user_buffer)) { + return NULL; + } + +#if SIZEOF_SIZE_T > SIZEOF_LONG + if (self->user_buffer.len > (Py_ssize_t)ULONG_MAX) { + PyBuffer_Release(&self->user_buffer); + PyErr_SetString(PyExc_ValueError, "buffer too large"); + return NULL; + } +#endif + + self->type = TYPE_WRITE_TO; + self->handle = handle; + wsabuf.len = (DWORD)self->user_buffer.len; + wsabuf.buf = self->user_buffer.buf; + + Py_BEGIN_ALLOW_THREADS + ret = WSASendTo((SOCKET)handle, &wsabuf, 1, &written, flags, + Address, AddressLength, &self->overlapped, NULL); + Py_END_ALLOW_THREADS + + self->error = err = (ret == SOCKET_ERROR ? WSAGetLastError() : + ERROR_SUCCESS); + + switch(err) { + case ERROR_SUCCESS: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + + + +PyDoc_STRVAR( + Overlapped_WSARecvFrom_doc, + "RecvFile(handle, size, flags) -> Overlapped[(message, (host, port))]\n\n" + "Start overlapped receive"); + +static PyObject * +Overlapped_WSARecvFrom(OverlappedObject *self, PyObject *args) +{ + HANDLE handle; + DWORD size; + DWORD flags = 0; + DWORD nread; + PyObject *buf; + WSABUF wsabuf; + int ret; + DWORD err; + + if (!PyArg_ParseTuple(args, F_HANDLE F_DWORD "|" F_DWORD, + &handle, &size, &flags)) + { + return NULL; + } + + if (self->type != TYPE_NONE) { + PyErr_SetString(PyExc_ValueError, "operation already attempted"); + return NULL; + } + +#if SIZEOF_SIZE_T <= SIZEOF_LONG + size = Py_MIN(size, (DWORD)PY_SSIZE_T_MAX); +#endif + buf = PyBytes_FromStringAndSize(NULL, Py_MAX(size, 1)); + if (buf == NULL) { + return NULL; + } + + wsabuf.len = size; + wsabuf.buf = PyBytes_AS_STRING(buf); + + self->type = TYPE_READ_FROM; + self->handle = handle; + self->read_from.allocated_buffer = buf; + memset(&self->read_from.address, 0, sizeof(self->read_from.address)); + self->read_from.address_length = sizeof(self->read_from.address); + + Py_BEGIN_ALLOW_THREADS + ret = WSARecvFrom((SOCKET)handle, &wsabuf, 1, &nread, &flags, + (SOCKADDR*)&self->read_from.address, + &self->read_from.address_length, + &self->overlapped, NULL); + Py_END_ALLOW_THREADS + + self->error = err = (ret < 0 ? WSAGetLastError() : ERROR_SUCCESS); + + switch(err) { + case ERROR_BROKEN_PIPE: + mark_as_completed(&self->overlapped); + return SetFromWindowsErr(err); + case ERROR_SUCCESS: + case ERROR_MORE_DATA: + case ERROR_IO_PENDING: + Py_RETURN_NONE; + default: + self->type = TYPE_NOT_STARTED; + return SetFromWindowsErr(err); + } +} + static PyMethodDef Overlapped_methods[] = { {"getresult", (PyCFunction) Overlapped_getresult, @@ -1399,6 +1734,10 @@ static PyMethodDef Overlapped_methods[] = { METH_VARARGS, Overlapped_TransmitFile_doc}, {"ConnectNamedPipe", (PyCFunction) Overlapped_ConnectNamedPipe, METH_VARARGS, Overlapped_ConnectNamedPipe_doc}, + {"WSARecvFrom", (PyCFunction) Overlapped_WSARecvFrom, + METH_VARARGS, Overlapped_WSARecvFrom_doc }, + {"WSASendTo", (PyCFunction) Overlapped_WSASendTo, + METH_VARARGS, Overlapped_WSASendTo_doc }, {NULL} }; @@ -1484,9 +1823,10 @@ static PyMethodDef overlapped_functions[] = { METH_VARARGS, SetEvent_doc}, {"ResetEvent", overlapped_ResetEvent, METH_VARARGS, ResetEvent_doc}, - {"ConnectPipe", - (PyCFunction) ConnectPipe, + {"ConnectPipe", overlapped_ConnectPipe, METH_VARARGS, ConnectPipe_doc}, + {"WSAConnect", overlapped_WSAConnect, + METH_VARARGS, WSAConnect_doc}, {NULL} }; From webhook-mailer at python.org Tue May 28 06:24:05 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 28 May 2019 10:24:05 -0000 Subject: [Python-checkins] bpo-36900: Fix compilation on HP-UX (GH-13614) Message-ID: https://github.com/python/cpython/commit/9ea277a788eabec102e8fe613b7f1e27995d5918 commit: 9ea277a788eabec102e8fe613b7f1e27995d5918 branch: master author: Victor Stinner committer: GitHub date: 2019-05-28T12:24:00+02:00 summary: bpo-36900: Fix compilation on HP-UX (GH-13614) dynload_hpux.c: add #include "pycore_pystate.h" for _PyInterpreterState_GET_UNSAFE(). files: M Python/dynload_hpux.c diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c index da9baa4b9989..e59d00435ec7 100644 --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -6,6 +6,7 @@ #include "Python.h" #include "importdl.h" +#include "pycore_pystate.h" #if defined(__hp9000s300) #define FUNCNAME_PATTERN "_%.20s_%.200s" From webhook-mailer at python.org Tue May 28 06:47:38 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Tue, 28 May 2019 10:47:38 -0000 Subject: [Python-checkins] Remove outdated time.monotonic reference (GH-13264) Message-ID: https://github.com/python/cpython/commit/293e9f86b8d10fcd88d6a2015babae76e9a8bd8f commit: 293e9f86b8d10fcd88d6a2015babae76e9a8bd8f branch: master author: Brad committer: Cheryl Sabella date: 2019-05-28T06:47:24-04:00 summary: Remove outdated time.monotonic reference (GH-13264) Per ae58649, time.monotonic is always available, making the old note outdated. files: M Doc/library/sched.rst diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst index ad96dbc95b0c..fab16f52c462 100644 --- a/Doc/library/sched.rst +++ b/Doc/library/sched.rst @@ -20,8 +20,7 @@ scheduler: The :class:`scheduler` class defines a generic interface to scheduling events. It needs two functions to actually deal with the "outside world" --- *timefunc* should be callable without arguments, and return a number (the "time", in any - units whatsoever). If time.monotonic is not available, the *timefunc* default - is time.time instead. The *delayfunc* function should be callable with one + units whatsoever). The *delayfunc* function should be callable with one argument, compatible with the output of *timefunc*, and should delay that many time units. *delayfunc* will also be called with the argument ``0`` after each event is run to allow other threads an opportunity to run in multi-threaded From webhook-mailer at python.org Tue May 28 06:56:10 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 10:56:10 -0000 Subject: [Python-checkins] Remove outdated time.monotonic reference (GH-13264) Message-ID: https://github.com/python/cpython/commit/a6733fd0a26109c0b3579f46296cc2627b3347a8 commit: a6733fd0a26109c0b3579f46296cc2627b3347a8 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-28T03:56:05-07:00 summary: Remove outdated time.monotonic reference (GH-13264) Per ae58649, time.monotonic is always available, making the old note outdated. (cherry picked from commit 293e9f86b8d10fcd88d6a2015babae76e9a8bd8f) Co-authored-by: Brad files: M Doc/library/sched.rst diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst index 6094a7b87145..03753af4b2d5 100644 --- a/Doc/library/sched.rst +++ b/Doc/library/sched.rst @@ -20,8 +20,7 @@ scheduler: The :class:`scheduler` class defines a generic interface to scheduling events. It needs two functions to actually deal with the "outside world" --- *timefunc* should be callable without arguments, and return a number (the "time", in any - units whatsoever). If time.monotonic is not available, the *timefunc* default - is time.time instead. The *delayfunc* function should be callable with one + units whatsoever). The *delayfunc* function should be callable with one argument, compatible with the output of *timefunc*, and should delay that many time units. *delayfunc* will also be called with the argument ``0`` after each event is run to allow other threads an opportunity to run in multi-threaded From webhook-mailer at python.org Tue May 28 08:03:00 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 28 May 2019 12:03:00 -0000 Subject: [Python-checkins] bpo-35279: reduce default max_workers of ThreadPoolExecutor (GH-13618) Message-ID: https://github.com/python/cpython/commit/9a7e5b1b42abcedb895b1ce49d83fe067d01835c commit: 9a7e5b1b42abcedb895b1ce49d83fe067d01835c branch: master author: Inada Naoki committer: GitHub date: 2019-05-28T21:02:52+09:00 summary: bpo-35279: reduce default max_workers of ThreadPoolExecutor (GH-13618) files: A Misc/NEWS.d/next/Library/2019-05-28-19-14-29.bpo-35279.PX7yl9.rst M Doc/library/concurrent.futures.rst M Lib/concurrent/futures/thread.py M Lib/test/test_concurrent_futures.py diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index ffc29d782ec0..f2491dd24571 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -159,6 +159,15 @@ And:: .. versionchanged:: 3.7 Added the *initializer* and *initargs* arguments. + .. versionchanged:: 3.8 + Default value of *max_workers* is changed to ``min(32, os.cpu_count() + 4)``. + This default value preserves at least 5 workers for I/O bound tasks. + It utilizes at most 32 CPU cores for CPU bound tasks which release the GIL. + And it avoids using very large resources implicitly on many-core machines. + + ThreadPoolExecutor now reuses idle worker threads before starting + *max_workers* worker threads too. + .. _threadpoolexecutor-example: diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index ad6b4c20b566..2426e94de91f 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -129,9 +129,14 @@ def __init__(self, max_workers=None, thread_name_prefix='', initargs: A tuple of arguments to pass to the initializer. """ if max_workers is None: - # Use this number because ThreadPoolExecutor is often - # used to overlap I/O instead of CPU work. - max_workers = (os.cpu_count() or 1) * 5 + # ThreadPoolExecutor is often used to: + # * CPU bound task which releases GIL + # * I/O bound task (which releases GIL, of course) + # + # We use cpu_count + 4 for both types of tasks. + # But we limit it to 32 to avoid consuming surprisingly large resource + # on many core machine. + max_workers = min(32, (os.cpu_count() or 1) + 4) if max_workers <= 0: raise ValueError("max_workers must be greater than 0") diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index de6ad8f2aa12..b27ae7194822 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -755,8 +755,8 @@ def record_finished(n): def test_default_workers(self): executor = self.executor_type() - self.assertEqual(executor._max_workers, - (os.cpu_count() or 1) * 5) + expected = min(32, (os.cpu_count() or 1) + 4) + self.assertEqual(executor._max_workers, expected) def test_saturation(self): executor = self.executor_type(4) diff --git a/Misc/NEWS.d/next/Library/2019-05-28-19-14-29.bpo-35279.PX7yl9.rst b/Misc/NEWS.d/next/Library/2019-05-28-19-14-29.bpo-35279.PX7yl9.rst new file mode 100644 index 000000000000..41ee5c2fe8bf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-19-14-29.bpo-35279.PX7yl9.rst @@ -0,0 +1,3 @@ +Change default *max_workers* of ``ThreadPoolExecutor`` from ``cpu_count() * +5`` to ``min(32, cpu_count() + 4))``. Previous value was unreasonably +large on many cores machines. From webhook-mailer at python.org Tue May 28 08:04:48 2019 From: webhook-mailer at python.org (Julien Palard) Date: Tue, 28 May 2019 12:04:48 -0000 Subject: [Python-checkins] Doc: Space breaking whole definition. (GH-13615) Message-ID: https://github.com/python/cpython/commit/0811f2d81a12a3415dc2cb2744b41520c48d4db5 commit: 0811f2d81a12a3415dc2cb2744b41520c48d4db5 branch: master author: Julien Palard committer: GitHub date: 2019-05-28T14:04:42+02:00 summary: Doc: Space breaking whole definition. (GH-13615) files: M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 177df54ef215..0f2a3a1fdf05 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -225,7 +225,7 @@ Glossary statement by defining :meth:`__enter__` and :meth:`__exit__` methods. See :pep:`343`. - context variable + context variable A variable which can have different values depending on its context. This is similar to Thread-Local Storage in which each execution thread may have a different value for a variable. However, with context From webhook-mailer at python.org Tue May 28 08:28:37 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 12:28:37 -0000 Subject: [Python-checkins] Doc: Space breaking whole definition. (GH-13615) Message-ID: https://github.com/python/cpython/commit/1cfb90b69f0239ca8763725ddb01e206b74cb901 commit: 1cfb90b69f0239ca8763725ddb01e206b74cb901 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-28T05:28:34-07:00 summary: Doc: Space breaking whole definition. (GH-13615) (cherry picked from commit 0811f2d81a12a3415dc2cb2744b41520c48d4db5) Co-authored-by: Julien Palard files: M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index f7f35cbb67d2..df6f6b646295 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -221,7 +221,7 @@ Glossary statement by defining :meth:`__enter__` and :meth:`__exit__` methods. See :pep:`343`. - context variable + context variable A variable which can have different values depending on its context. This is similar to Thread-Local Storage in which each execution thread may have a different value for a variable. However, with context From webhook-mailer at python.org Tue May 28 08:43:05 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Tue, 28 May 2019 12:43:05 -0000 Subject: [Python-checkins] bpo-36922: implement PEP-590 Py_TPFLAGS_METHOD_DESCRIPTOR (GH-13338) Message-ID: https://github.com/python/cpython/commit/eb65e2443ac21739baf6d373abc7b4638b9d6927 commit: eb65e2443ac21739baf6d373abc7b4638b9d6927 branch: master author: Jeroen Demeyer committer: Petr Viktorin date: 2019-05-28T14:42:53+02:00 summary: bpo-36922: implement PEP-590 Py_TPFLAGS_METHOD_DESCRIPTOR (GH-13338) Co-authored-by: Mark Shannon files: A Misc/NEWS.d/next/C API/2019-05-15-10-46-55.bpo-36922.J3EFK_.rst M Doc/c-api/typeobj.rst M Include/object.h M Lib/test/test_capi.py M Modules/_functoolsmodule.c M Modules/_testcapimodule.c M Objects/descrobject.c M Objects/funcobject.c M Objects/object.c M Objects/typeobject.c diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index e0ea9b9b5f96..aa667846a0da 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1045,6 +1045,32 @@ and :c:type:`PyType_Type` effectively act as defaults.) ??? + + .. data:: Py_TPFLAGS_METHOD_DESCRIPTOR + + This bit indicates that objects behave like unbound methods. + + If this flag is set for ``type(meth)``, then: + + - ``meth.__get__(obj, cls)(*args, **kwds)`` (with ``obj`` not None) + must be equivalent to ``meth(obj, *args, **kwds)``. + + - ``meth.__get__(None, cls)(*args, **kwds)`` + must be equivalent to ``meth(*args, **kwds)``. + + This flag enables an optimization for typical method calls like + ``obj.meth()``: it avoids creating a temporary "bound method" object for + ``obj.meth``. + + .. versionadded:: 3.8 + + **Inheritance:** + + This flag is never inherited by heap types. + For extension types, it is inherited whenever + :c:member:`~PyTypeObject.tp_descr_get` is inherited. + + .. XXX Document more flags here? diff --git a/Include/object.h b/Include/object.h index 6464f33be491..d5d98d3bd885 100644 --- a/Include/object.h +++ b/Include/object.h @@ -307,6 +307,9 @@ given type object has a specified feature. #define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0 #endif +/* Objects behave like an unbound method */ +#define Py_TPFLAGS_METHOD_DESCRIPTOR (1UL << 17) + /* Objects support type attribute cache */ #define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18) #define Py_TPFLAGS_VALID_VERSION_TAG (1UL << 19) diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index a062a6563fa2..f3d41a20ab05 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -27,6 +27,8 @@ # Were we compiled --with-pydebug or with #define Py_DEBUG? Py_DEBUG = hasattr(sys, 'gettotalrefcount') +Py_TPFLAGS_METHOD_DESCRIPTOR = 1 << 17 + def testfunction(self): """some doc""" @@ -456,6 +458,28 @@ def test_pendingcalls_non_threaded(self): self.pendingcalls_wait(l, n) +class TestPEP590(unittest.TestCase): + + def test_method_descriptor_flag(self): + import functools + cached = functools.lru_cache(1)(testfunction) + + self.assertFalse(type(repr).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(list.append).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(list.__add__).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(testfunction).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(cached).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + + self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + + # Heap type should not inherit Py_TPFLAGS_METHOD_DESCRIPTOR + class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): + pass + self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + + class SubinterpreterTest(unittest.TestCase): def test_subinterps(self): diff --git a/Misc/NEWS.d/next/C API/2019-05-15-10-46-55.bpo-36922.J3EFK_.rst b/Misc/NEWS.d/next/C API/2019-05-15-10-46-55.bpo-36922.J3EFK_.rst new file mode 100644 index 000000000000..8eee208f905b --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-05-15-10-46-55.bpo-36922.J3EFK_.rst @@ -0,0 +1,3 @@ +Add new type flag ``Py_TPFLAGS_METHOD_DESCRIPTOR`` for objects behaving like +unbound methods. These are objects supporting the optimization given by the +``LOAD_METHOD``/``CALL_METHOD`` opcodes. See PEP 590. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index dcc9129fc6b1..13f2db939bb7 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -1333,7 +1333,8 @@ static PyTypeObject lru_cache_type = { 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ lru_cache_doc, /* tp_doc */ (traverseproc)lru_cache_tp_traverse,/* tp_traverse */ diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 51e5d80d1f51..8ba927039c27 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5787,6 +5787,46 @@ static PyTypeObject Generic_Type = { }; +/* Test PEP 590 */ + +static PyObject * +func_descr_get(PyObject *func, PyObject *obj, PyObject *type) +{ + if (obj == Py_None || obj == NULL) { + Py_INCREF(func); + return func; + } + return PyMethod_New(func, obj); +} + +static PyObject * +nop_descr_get(PyObject *func, PyObject *obj, PyObject *type) +{ + Py_INCREF(func); + return func; +} + +static PyTypeObject MethodDescriptorBase_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethodDescriptorBase", + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_METHOD_DESCRIPTOR, + .tp_descr_get = func_descr_get, +}; + +static PyTypeObject MethodDescriptorDerived_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethodDescriptorDerived", + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, +}; + +static PyTypeObject MethodDescriptorNopGet_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethodDescriptorNopGet", + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .tp_descr_get = nop_descr_get, +}; + + static struct PyModuleDef _testcapimodule = { PyModuleDef_HEAD_INIT, "_testcapi", @@ -5834,6 +5874,23 @@ PyInit__testcapi(void) Py_INCREF(&MyList_Type); PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type); + if (PyType_Ready(&MethodDescriptorBase_Type) < 0) + return NULL; + Py_INCREF(&MethodDescriptorBase_Type); + PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type); + + MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type; + if (PyType_Ready(&MethodDescriptorDerived_Type) < 0) + return NULL; + Py_INCREF(&MethodDescriptorDerived_Type); + PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type); + + MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type; + if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0) + return NULL; + Py_INCREF(&MethodDescriptorNopGet_Type); + PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type); + if (PyType_Ready(&GenericAlias_Type) < 0) return NULL; Py_INCREF(&GenericAlias_Type); diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 0db8057334fd..6c99f9b211b9 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -556,7 +556,8 @@ PyTypeObject PyMethodDescr_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ 0, /* tp_doc */ descr_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -705,7 +706,8 @@ PyTypeObject PyWrapperDescr_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ 0, /* tp_doc */ descr_traverse, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 09b94c264236..fb7abfacb2e4 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -663,7 +663,8 @@ PyTypeObject PyFunction_Type = { 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ func_new__doc__, /* tp_doc */ (traverseproc)func_traverse, /* tp_traverse */ (inquiry)func_clear, /* tp_clear */ diff --git a/Objects/object.c b/Objects/object.c index 270716f397c9..87dba9898e3a 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1155,8 +1155,7 @@ _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) descr = _PyType_Lookup(tp, name); if (descr != NULL) { Py_INCREF(descr); - if (PyFunction_Check(descr) || - (Py_TYPE(descr) == &PyMethodDescr_Type)) { + if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) { meth_found = 1; } else { f = descr->ob_type->tp_descr_get; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index fc809d36e10b..06e045bd1597 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4950,7 +4950,7 @@ static void inherit_special(PyTypeObject *type, PyTypeObject *base) { - /* Copying basicsize is connected to the GC flags */ + /* Copying tp_traverse and tp_clear is connected to the GC flags */ if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) && (base->tp_flags & Py_TPFLAGS_HAVE_GC) && (!type->tp_traverse && !type->tp_clear)) { @@ -5165,6 +5165,15 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) } { COPYSLOT(tp_descr_get); + /* Inherit Py_TPFLAGS_METHOD_DESCRIPTOR if tp_descr_get was inherited, + * but only for extension types */ + if (base->tp_descr_get && + type->tp_descr_get == base->tp_descr_get && + !(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && + (base->tp_flags & Py_TPFLAGS_METHOD_DESCRIPTOR)) + { + type->tp_flags |= Py_TPFLAGS_METHOD_DESCRIPTOR; + } COPYSLOT(tp_descr_set); COPYSLOT(tp_dictoffset); COPYSLOT(tp_init); From webhook-mailer at python.org Tue May 28 08:53:36 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Tue, 28 May 2019 12:53:36 -0000 Subject: [Python-checkins] bpo-32299: Return patched dict when using patch.dict as a context manager (GH-11062) Message-ID: https://github.com/python/cpython/commit/04530812e90e45a37ed84e83505d63db7edc1262 commit: 04530812e90e45a37ed84e83505d63db7edc1262 branch: master author: Mario Corchero committer: Cheryl Sabella date: 2019-05-28T08:53:30-04:00 summary: bpo-32299: Return patched dict when using patch.dict as a context manager (GH-11062) files: A Misc/NEWS.d/next/Library/2017-12-13-17-49-56.bpo-32299.eqAPWs.rst M Doc/library/unittest.mock.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testpatch.py diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 36ac24afa2bc..da6cdfe648b0 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1556,15 +1556,24 @@ patch.dict decorator. When used as a class decorator :func:`patch.dict` honours ``patch.TEST_PREFIX`` for choosing which methods to wrap. + .. versionchanged:: 3.8 + + :func:`patch.dict` now returns the patched dictionary when used as a context + manager. + :func:`patch.dict` can be used to add members to a dictionary, or simply let a test change a dictionary, and ensure the dictionary is restored when the test ends. >>> foo = {} - >>> with patch.dict(foo, {'newkey': 'newvalue'}): + >>> with patch.dict(foo, {'newkey': 'newvalue'}) as patched_foo: ... assert foo == {'newkey': 'newvalue'} + ... assert patched_foo == {'newkey': 'newvalue'} + ... # You can add, update or delete keys of foo (or patched_foo, it's the same dict) + ... patched_foo['spam'] = 'eggs' ... >>> assert foo == {} + >>> assert patched_foo == {} >>> import os >>> with patch.dict('os.environ', {'newkey': 'newvalue'}): diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index fac4535747c4..055fbb350ce8 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1730,6 +1730,7 @@ def decorate_class(self, klass): def __enter__(self): """Patch the dict.""" self._patch_dict() + return self.in_dict def _patch_dict(self): diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index 3295c5b2420e..27914a9d7178 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -619,6 +619,13 @@ def test(): self.assertEqual(foo.values, original) + def test_patch_dict_as_context_manager(self): + foo = {'a': 'b'} + with patch.dict(foo, a='c') as patched: + self.assertEqual(patched, {'a': 'c'}) + self.assertEqual(foo, {'a': 'b'}) + + def test_name_preserved(self): foo = {} diff --git a/Misc/NEWS.d/next/Library/2017-12-13-17-49-56.bpo-32299.eqAPWs.rst b/Misc/NEWS.d/next/Library/2017-12-13-17-49-56.bpo-32299.eqAPWs.rst new file mode 100644 index 000000000000..4e1afa9a43ea --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-12-13-17-49-56.bpo-32299.eqAPWs.rst @@ -0,0 +1,2 @@ +Changed :func:`unittest.mock.patch.dict` to return the patched +dictionary when used as context manager. Patch by Vadim Tsander. From webhook-mailer at python.org Tue May 28 08:55:37 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 28 May 2019 12:55:37 -0000 Subject: [Python-checkins] bpo-26423: Fix possible overflow in wrap_lenfunc() (GH-13606) Message-ID: https://github.com/python/cpython/commit/05f16416d99dc9fc76fef11e56f16593e7a5955e commit: 05f16416d99dc9fc76fef11e56f16593e7a5955e branch: master author: Zackery Spytz committer: Victor Stinner date: 2019-05-28T14:55:28+02:00 summary: bpo-26423: Fix possible overflow in wrap_lenfunc() (GH-13606) Fix possible overflow in wrap_lenfunc() when sizeof(long) < sizeof(Py_ssize_t) (e.g., 64-bit Windows). files: A Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst M Lib/test/test_descr.py M Objects/typeobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index e37a98417f50..6b018ccc56fa 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -389,6 +389,10 @@ def foo(self): return 1 a.setstate(100) self.assertEqual(a.getstate(), 100) + def test_wrap_lenfunc_bad_cast(self): + self.assertEqual(range(sys.maxsize).__len__(), sys.maxsize) + + class ClassPropertiesAndMethods(unittest.TestCase): def assertHasAttr(self, obj, name): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst new file mode 100644 index 000000000000..6bf2031a3384 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst @@ -0,0 +1,2 @@ +Fix possible overflow in ``wrap_lenfunc()`` when +``sizeof(long) < sizeof(Py_ssize_t)`` (e.g., 64-bit Windows). diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 06e045bd1597..c14cbad875b4 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5536,7 +5536,7 @@ wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped) res = (*func)(self); if (res == -1 && PyErr_Occurred()) return NULL; - return PyLong_FromLong((long)res); + return PyLong_FromSsize_t(res); } static PyObject * From webhook-mailer at python.org Tue May 28 09:10:31 2019 From: webhook-mailer at python.org (Julien Palard) Date: Tue, 28 May 2019 13:10:31 -0000 Subject: [Python-checkins] Doc: Add missing forward reference in the tutorial. (GH-13499) Message-ID: https://github.com/python/cpython/commit/51ddab8dae056867f3595ab3400bffc93f67c8d4 commit: 51ddab8dae056867f3595ab3400bffc93f67c8d4 branch: master author: Julien Palard committer: GitHub date: 2019-05-28T15:10:23+02:00 summary: Doc: Add missing forward reference in the tutorial. (GH-13499) files: M Doc/tutorial/controlflow.rst diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 905734539c68..cfb9645e0da1 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -482,9 +482,9 @@ When a final formal parameter of the form ``**name`` is present, it receives a dictionary (see :ref:`typesmapping`) containing all keyword arguments except for those corresponding to a formal parameter. This may be combined with a formal parameter of the form ``*name`` (described in the next subsection) which -receives a tuple containing the positional arguments beyond the formal parameter -list. (``*name`` must occur before ``**name``.) For example, if we define a -function like this:: +receives a :ref:`tuple ` containing the positional +arguments beyond the formal parameter list. (``*name`` must occur +before ``**name``.) For example, if we define a function like this:: def cheeseshop(kind, *arguments, **keywords): print("-- Do you have any", kind, "?") From webhook-mailer at python.org Tue May 28 09:17:51 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 13:17:51 -0000 Subject: [Python-checkins] bpo-26423: Fix possible overflow in wrap_lenfunc() (GH-13606) Message-ID: https://github.com/python/cpython/commit/e7ddf586ae5b7a3b975103b09c8202226d77f421 commit: e7ddf586ae5b7a3b975103b09c8202226d77f421 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-28T06:17:43-07:00 summary: bpo-26423: Fix possible overflow in wrap_lenfunc() (GH-13606) Fix possible overflow in wrap_lenfunc() when sizeof(long) < sizeof(Py_ssize_t) (e.g., 64-bit Windows). (cherry picked from commit 05f16416d99dc9fc76fef11e56f16593e7a5955e) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst M Lib/test/test_descr.py M Objects/typeobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index d9541b9133f1..675f9748e805 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -384,6 +384,10 @@ def foo(self): return 1 a.setstate(100) self.assertEqual(a.getstate(), 100) + def test_wrap_lenfunc_bad_cast(self): + self.assertEqual(range(sys.maxsize).__len__(), sys.maxsize) + + class ClassPropertiesAndMethods(unittest.TestCase): def assertHasAttr(self, obj, name): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst new file mode 100644 index 000000000000..6bf2031a3384 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst @@ -0,0 +1,2 @@ +Fix possible overflow in ``wrap_lenfunc()`` when +``sizeof(long) < sizeof(Py_ssize_t)`` (e.g., 64-bit Windows). diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 9dba45ac6f7b..3092e98f6b25 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5454,7 +5454,7 @@ wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped) res = (*func)(self); if (res == -1 && PyErr_Occurred()) return NULL; - return PyLong_FromLong((long)res); + return PyLong_FromSsize_t(res); } static PyObject * From webhook-mailer at python.org Tue May 28 09:21:24 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 13:21:24 -0000 Subject: [Python-checkins] Doc: Add missing forward reference in the tutorial. (GH-13499) Message-ID: https://github.com/python/cpython/commit/95b7706a955e2144eb54d815ec24a7eb0dff0b97 commit: 95b7706a955e2144eb54d815ec24a7eb0dff0b97 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-28T06:20:58-07:00 summary: Doc: Add missing forward reference in the tutorial. (GH-13499) (cherry picked from commit 51ddab8dae056867f3595ab3400bffc93f67c8d4) Co-authored-by: Julien Palard files: M Doc/tutorial/controlflow.rst diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index abf163d232c5..ed42e2baaf3e 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -482,9 +482,9 @@ When a final formal parameter of the form ``**name`` is present, it receives a dictionary (see :ref:`typesmapping`) containing all keyword arguments except for those corresponding to a formal parameter. This may be combined with a formal parameter of the form ``*name`` (described in the next subsection) which -receives a tuple containing the positional arguments beyond the formal parameter -list. (``*name`` must occur before ``**name``.) For example, if we define a -function like this:: +receives a :ref:`tuple ` containing the positional +arguments beyond the formal parameter list. (``*name`` must occur +before ``**name``.) For example, if we define a function like this:: def cheeseshop(kind, *arguments, **keywords): print("-- Do you have any", kind, "?") From webhook-mailer at python.org Tue May 28 10:01:24 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 28 May 2019 14:01:24 -0000 Subject: [Python-checkins] bpo-36829: sys.excepthook and sys.unraisablehook flush (GH-13620) Message-ID: https://github.com/python/cpython/commit/a85a1d337d26a65036e427341d15e3979f7e9ced commit: a85a1d337d26a65036e427341d15e3979f7e9ced branch: master author: Victor Stinner committer: GitHub date: 2019-05-28T16:01:17+02:00 summary: bpo-36829: sys.excepthook and sys.unraisablehook flush (GH-13620) sys.excepthook() and sys.unraisablehook() now explicitly flush the file (usually sys.stderr). If file.flush() fails, sys.excepthook() silently ignores the error, whereas sys.unraisablehook() logs the new exception. files: M Python/errors.c M Python/pythonrun.c diff --git a/Python/errors.c b/Python/errors.c index bd33d4d340f6..8a94afdd8c41 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -26,6 +26,7 @@ extern "C" { _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(stderr); +_Py_IDENTIFIER(flush); /* Forward declarations */ @@ -1254,6 +1255,14 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, if (PyFile_WriteString("\n", file) < 0) { return -1; } + + /* Explicitly call file.flush() */ + PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + if (!res) { + return -1; + } + Py_DECREF(res); + return 0; } diff --git a/Python/pythonrun.c b/Python/pythonrun.c index ba1d1cf02f25..ace9f2f9874e 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -978,6 +978,16 @@ _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *t } print_exception_recursive(file, value, seen); Py_XDECREF(seen); + + /* Call file.flush() */ + PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + if (!res) { + /* Silently ignore file.flush() error */ + PyErr_Clear(); + } + else { + Py_DECREF(res); + } } void From webhook-mailer at python.org Tue May 28 10:02:58 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 28 May 2019 14:02:58 -0000 Subject: [Python-checkins] bpo-33725: multiprocessing uses spawn by default on macOS (GH-13603) Message-ID: https://github.com/python/cpython/commit/17a5588740b3d126d546ad1a13bdac4e028e6d50 commit: 17a5588740b3d126d546ad1a13bdac4e028e6d50 branch: master author: Victor Stinner committer: GitHub date: 2019-05-28T16:02:50+02:00 summary: bpo-33725: multiprocessing uses spawn by default on macOS (GH-13603) On macOS, the multiprocessing module now uses the "spawn" start method by default. files: A Misc/NEWS.d/next/Library/2019-05-28-01-17-42.bpo-33725.fFZoDG.rst M Doc/library/multiprocessing.rst M Doc/whatsnew/3.8.rst M Lib/multiprocessing/context.py diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index cc6dd4e9d702..a4771d3a84cd 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -102,7 +102,7 @@ to start a process. These *start methods* are will not be inherited. Starting a process using this method is rather slow compared to using *fork* or *forkserver*. - Available on Unix and Windows. The default on Windows. + Available on Unix and Windows. The default on Windows and macOS. *fork* The parent process uses :func:`os.fork` to fork the Python @@ -124,6 +124,11 @@ to start a process. These *start methods* are Available on Unix platforms which support passing file descriptors over Unix pipes. +.. versionchanged:: 3.8 + + On macOS, *spawn* start method is now the default: *fork* start method is no + longer reliable on macOS, see :issue:`33725`. + .. versionchanged:: 3.4 *spawn* added on all unix platforms, and *forkserver* added for some unix platforms. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 860d6cc18f11..547e795d85fb 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -469,6 +469,16 @@ access the ``madvise()`` system call. (Contributed by Zackery Spytz in :issue:`32941`.) +multiprocessing +--------------- + +Added new :mod:`multiprocessing.shared_memory` module. +(Contributed Davin Potts in :issue:`35813`.) + +On macOS, the *spawn* start method is now used by default. +(Contributed by Victor Stinner in :issue:`33725`.) + + os -- diff --git a/Lib/multiprocessing/context.py b/Lib/multiprocessing/context.py index 5a4865751c22..5f8e0f0cd465 100644 --- a/Lib/multiprocessing/context.py +++ b/Lib/multiprocessing/context.py @@ -309,7 +309,12 @@ def _check_available(self): 'spawn': SpawnContext(), 'forkserver': ForkServerContext(), } - _default_context = DefaultContext(_concrete_contexts['fork']) + if sys.platform == 'darwin': + # bpo-33725: running arbitrary code after fork() is no longer reliable + # on macOS since macOS 10.14 (Mojave). Use spawn by default instead. + _default_context = DefaultContext(_concrete_contexts['spawn']) + else: + _default_context = DefaultContext(_concrete_contexts['fork']) else: diff --git a/Misc/NEWS.d/next/Library/2019-05-28-01-17-42.bpo-33725.fFZoDG.rst b/Misc/NEWS.d/next/Library/2019-05-28-01-17-42.bpo-33725.fFZoDG.rst new file mode 100644 index 000000000000..6f1665f6fab3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-01-17-42.bpo-33725.fFZoDG.rst @@ -0,0 +1,2 @@ +On macOS, the :mod:`multiprocessing` module now uses *spawn* start method by +default. From webhook-mailer at python.org Tue May 28 11:16:57 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 28 May 2019 15:16:57 -0000 Subject: [Python-checkins] bpo-33407: Implement Py_DEPRECATED() on MSVC (GH-8980) Message-ID: https://github.com/python/cpython/commit/3c8724fc60163f4f3c3b0d531c84cc7b36783f82 commit: 3c8724fc60163f4f3c3b0d531c84cc7b36783f82 branch: master author: Zackery Spytz committer: Victor Stinner date: 2019-05-28T17:16:33+02:00 summary: bpo-33407: Implement Py_DEPRECATED() on MSVC (GH-8980) files: A Misc/NEWS.d/next/Windows/2018-08-28-17-23-49.bpo-33407.ARG0W_.rst M Doc/c-api/intro.rst M Doc/whatsnew/3.8.rst M Include/abstract.h M Include/ceval.h M Include/cpython/pyerrors.h M Include/cpython/unicodeobject.h M Include/intrcheck.h M Include/longobject.h M Include/moduleobject.h M Include/pyport.h M Include/pythread.h M Include/sliceobject.h M Include/unicodeobject.h diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 672936a458f4..a1c8d34a7ea0 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -160,6 +160,18 @@ complete listing. .. versionadded:: 3.4 +.. c:macro:: Py_DEPRECATED(version) + + Use this for deprecated declarations. The macro must be placed before the + symbol name. + + Example:: + + Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void); + + .. versionchanged:: 3.8 + MSVC support was added. + .. _api-objects: diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 547e795d85fb..b32cec1edaca 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1240,6 +1240,15 @@ Changes in the C API (Contributed by Eddie Elizondo in :issue:`35810`.) +* The :c:macro:`Py_DEPRECATED()` macro has been implemented for MSVC. + The macro now must be placed before the symbol name. + + Example:: + + Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void); + + (Contributed by Zackery Spytz in :issue:`33407`.) + CPython bytecode changes ------------------------ diff --git a/Include/abstract.h b/Include/abstract.h index 79002a76a8c8..c226aab9b730 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -316,17 +316,16 @@ PyAPI_FUNC(int) PyObject_DelItem(PyObject *o, PyObject *key); Return 0 on success. buffer and buffer_len are only set in case no error occurs. Otherwise, -1 is returned and an exception set. */ +Py_DEPRECATED(3.0) PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, const char **buffer, - Py_ssize_t *buffer_len) - Py_DEPRECATED(3.0); + Py_ssize_t *buffer_len); /* Checks whether an arbitrary object supports the (character, single segment) buffer interface. Returns 1 on success, 0 on failure. */ -PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj) - Py_DEPRECATED(3.0); +Py_DEPRECATED(3.0) PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj); /* Same as PyObject_AsCharBuffer() except that this API expects (readable, single segment) buffer interface and returns a pointer to a read-only memory @@ -334,10 +333,10 @@ PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj) 0 is returned on success. buffer and buffer_len are only set in case no error occurs. Otherwise, -1 is returned and an exception set. */ +Py_DEPRECATED(3.0) PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, const void **buffer, - Py_ssize_t *buffer_len) - Py_DEPRECATED(3.0); + Py_ssize_t *buffer_len); /* Takes an arbitrary object which must support the (writable, single segment) buffer interface and returns a pointer to a writable memory location in @@ -345,10 +344,10 @@ PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, Return 0 on success. buffer and buffer_len are only set in case no error occurs. Otherwise, -1 is returned and an exception set. */ +Py_DEPRECATED(3.0) PyAPI_FUNC(int) PyObject_AsWriteBuffer(PyObject *obj, void **buffer, - Py_ssize_t *buffer_len) - Py_DEPRECATED(3.0); + Py_ssize_t *buffer_len); /* === New Buffer API ============================================ */ diff --git a/Include/ceval.h b/Include/ceval.h index 6fb224b28850..36fd014a91a7 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -189,8 +189,8 @@ PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); PyAPI_FUNC(void) PyEval_InitThreads(void); -PyAPI_FUNC(void) PyEval_AcquireLock(void) Py_DEPRECATED(3.2); -PyAPI_FUNC(void) PyEval_ReleaseLock(void) /* Py_DEPRECATED(3.2) */; +Py_DEPRECATED(3.2) PyAPI_FUNC(void) PyEval_AcquireLock(void); +/* Py_DEPRECATED(3.2) */ PyAPI_FUNC(void) PyEval_ReleaseLock(void); PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index 6b0ccedac52d..e3098b3925bd 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -88,8 +88,9 @@ PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); /* Convenience functions */ #ifdef MS_WINDOWS +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename( - PyObject *, const Py_UNICODE *) Py_DEPRECATED(3.3); + PyObject *, const Py_UNICODE *); #endif /* MS_WINDOWS */ /* Like PyErr_Format(), but saves current exception as __context__ and @@ -103,11 +104,12 @@ PyAPI_FUNC(PyObject *) _PyErr_FormatFromCause( #ifdef MS_WINDOWS /* XXX redeclare to use WSTRING */ +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename( - int, const Py_UNICODE *) Py_DEPRECATED(3.3); - + int, const Py_UNICODE *); +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename( - PyObject *,int, const Py_UNICODE *) Py_DEPRECATED(3.3); + PyObject *,int, const Py_UNICODE *); #endif /* In exceptions.c */ @@ -147,23 +149,23 @@ PyAPI_FUNC(PyObject *) PyErr_ProgramTextObject( int lineno); /* Create a UnicodeEncodeError object */ -PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( const char *encoding, /* UTF-8 encoded string */ const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason /* UTF-8 encoded string */ - ) Py_DEPRECATED(3.3); + ); /* Create a UnicodeTranslateError object */ -PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason /* UTF-8 encoded string */ - ) Py_DEPRECATED(3.3); + ); PyAPI_FUNC(PyObject *) _PyUnicodeTranslateError_Create( PyObject *object, Py_ssize_t start, diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 806c3aa7cedb..c11503d33999 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -11,7 +11,7 @@ extern "C" { With PEP 393, Py_UNICODE is deprecated and replaced with a typedef to wchar_t. */ #define PY_UNICODE_TYPE wchar_t -typedef wchar_t Py_UNICODE /* Py_DEPRECATED(3.3) */; +/* Py_DEPRECATED(3.3) */ typedef wchar_t Py_UNICODE; /* --- Internal Unicode Operations ---------------------------------------- */ @@ -257,6 +257,7 @@ typedef struct { If the Py_UNICODE representation is not available, it will be computed on request. Use PyUnicode_GET_LENGTH() for the length in code points. */ +/* Py_DEPRECATED(3.3) */ #define PyUnicode_GET_SIZE(op) \ (assert(PyUnicode_Check(op)), \ (((PyASCIIObject *)(op))->wstr) ? \ @@ -264,26 +265,25 @@ typedef struct { ((void)PyUnicode_AsUnicode(_PyObject_CAST(op)),\ assert(((PyASCIIObject *)(op))->wstr), \ PyUnicode_WSTR_LENGTH(op))) - /* Py_DEPRECATED(3.3) */ +/* Py_DEPRECATED(3.3) */ #define PyUnicode_GET_DATA_SIZE(op) \ (PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE) - /* Py_DEPRECATED(3.3) */ /* Alias for PyUnicode_AsUnicode(). This will create a wchar_t/Py_UNICODE representation on demand. Using this macro is very inefficient now, try to port your code to use the new PyUnicode_*BYTE_DATA() macros or use PyUnicode_WRITE() and PyUnicode_READ(). */ +/* Py_DEPRECATED(3.3) */ #define PyUnicode_AS_UNICODE(op) \ (assert(PyUnicode_Check(op)), \ (((PyASCIIObject *)(op))->wstr) ? (((PyASCIIObject *)(op))->wstr) : \ PyUnicode_AsUnicode(_PyObject_CAST(op))) - /* Py_DEPRECATED(3.3) */ +/* Py_DEPRECATED(3.3) */ #define PyUnicode_AS_DATA(op) \ ((const char *)(PyUnicode_AS_UNICODE(op))) - /* Py_DEPRECATED(3.3) */ /* --- Flexible String Representation Helper Macros (PEP 393) -------------- */ @@ -543,10 +543,10 @@ PyAPI_FUNC(void) _PyUnicode_FastFill( only allowed if u was set to NULL. The buffer is copied into the new object. */ -PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( +/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( const Py_UNICODE *u, /* Unicode buffer */ Py_ssize_t size /* size of buffer */ - ) /* Py_DEPRECATED(3.3) */; + ); /* Create a new string from a buffer of Py_UCS1, Py_UCS2 or Py_UCS4 characters. Scan the string to find the maximum character. */ @@ -572,9 +572,9 @@ PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar ( Py_UNICODE buffer. If the wchar_t/Py_UNICODE representation is not yet available, this function will calculate it. */ -PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( +/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( PyObject *unicode /* Unicode object */ - ) /* Py_DEPRECATED(3.3) */; + ); /* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string contains null characters. */ @@ -587,13 +587,13 @@ PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( If the wchar_t/Py_UNICODE representation is not yet available, this function will calculate it. */ -PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( +/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( PyObject *unicode, /* Unicode object */ Py_ssize_t *size /* location where to save the length */ - ) /* Py_DEPRECATED(3.3) */; + ); /* Get the maximum ordinal for a Unicode character. */ -PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void) Py_DEPRECATED(3.3); +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void); /* --- _PyUnicodeWriter API ----------------------------------------------- */ @@ -784,22 +784,22 @@ PyAPI_FUNC(const char *) PyUnicode_AsUTF8(PyObject *unicode); /* Encodes a Py_UNICODE buffer of the given size and returns a Python string object. */ -PyAPI_FUNC(PyObject*) PyUnicode_Encode( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_Encode( const Py_UNICODE *s, /* Unicode char buffer */ Py_ssize_t size, /* number of Py_UNICODE chars to encode */ const char *encoding, /* encoding */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.3); + ); /* --- UTF-7 Codecs ------------------------------------------------------- */ -PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* number of Py_UNICODE chars to encode */ int base64SetO, /* Encode RFC2152 Set O characters in base64 */ int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.3); + ); PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF7( PyObject *unicode, /* Unicode object */ @@ -814,20 +814,20 @@ PyAPI_FUNC(PyObject*) _PyUnicode_AsUTF8String( PyObject *unicode, const char *errors); -PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF8( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF8( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* number of Py_UNICODE chars to encode */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.3); + ); /* --- UTF-32 Codecs ------------------------------------------------------ */ -PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF32( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF32( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* number of Py_UNICODE chars to encode */ const char *errors, /* error handling */ int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ - ) Py_DEPRECATED(3.3); + ); PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF32( PyObject *object, /* Unicode object */ @@ -856,12 +856,12 @@ PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF32( at a later point without compromising the APIs. */ -PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF16( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF16( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* number of Py_UNICODE chars to encode */ const char *errors, /* error handling */ int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ - ) Py_DEPRECATED(3.3); + ); PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF16( PyObject* unicode, /* Unicode object */ @@ -882,17 +882,17 @@ PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscape( string. */ ); -PyAPI_FUNC(PyObject*) PyUnicode_EncodeUnicodeEscape( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeUnicodeEscape( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length /* Number of Py_UNICODE chars to encode */ - ) Py_DEPRECATED(3.3); + ); /* --- Raw-Unicode-Escape Codecs ------------------------------------------ */ -PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length /* Number of Py_UNICODE chars to encode */ - ) Py_DEPRECATED(3.3); + ); /* --- Latin-1 Codecs ----------------------------------------------------- */ @@ -900,11 +900,11 @@ PyAPI_FUNC(PyObject*) _PyUnicode_AsLatin1String( PyObject* unicode, const char* errors); -PyAPI_FUNC(PyObject*) PyUnicode_EncodeLatin1( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeLatin1( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.3); + ); /* --- ASCII Codecs ------------------------------------------------------- */ @@ -912,20 +912,20 @@ PyAPI_FUNC(PyObject*) _PyUnicode_AsASCIIString( PyObject* unicode, const char* errors); -PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.3); + ); /* --- Character Map Codecs ----------------------------------------------- */ -PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ PyObject *mapping, /* encoding mapping */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.3); + ); PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( PyObject *unicode, /* Unicode object */ @@ -945,21 +945,21 @@ PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( are copied as-is. */ -PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ PyObject *table, /* Translate table */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.3); + ); /* --- MBCS codecs for Windows -------------------------------------------- */ #ifdef MS_WINDOWS -PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* number of Py_UNICODE chars to encode */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.3); + ); #endif /* --- Decimal Encoder ---------------------------------------------------- */ @@ -986,12 +986,12 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( */ -PyAPI_FUNC(int) PyUnicode_EncodeDecimal( +/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(int) PyUnicode_EncodeDecimal( Py_UNICODE *s, /* Unicode buffer */ Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ char *output, /* Output buffer; must have size >= length */ const char *errors /* error handling */ - ) /* Py_DEPRECATED(3.3) */; + ); /* Transforms code points that have decimal digit property to the corresponding ASCII digit code points. @@ -999,10 +999,11 @@ PyAPI_FUNC(int) PyUnicode_EncodeDecimal( Returns a new Unicode string on success, NULL on failure. */ +/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(PyObject*) PyUnicode_TransformDecimalToASCII( Py_UNICODE *s, /* Unicode buffer */ Py_ssize_t length /* Number of Py_UNICODE chars to transform */ - ) /* Py_DEPRECATED(3.3) */; + ); /* Coverts a Unicode object holding a decimal value to an ASCII string for using in int, float and complex parsers. @@ -1101,17 +1102,17 @@ PyAPI_FUNC(int) _PyUnicode_IsLinebreak( const Py_UCS4 ch /* Unicode character */ ); -PyAPI_FUNC(Py_UCS4) _PyUnicode_ToLowercase( +/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UCS4) _PyUnicode_ToLowercase( Py_UCS4 ch /* Unicode character */ - ) /* Py_DEPRECATED(3.3) */; + ); -PyAPI_FUNC(Py_UCS4) _PyUnicode_ToUppercase( +/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UCS4) _PyUnicode_ToUppercase( Py_UCS4 ch /* Unicode character */ - ) /* Py_DEPRECATED(3.3) */; + ); -PyAPI_FUNC(Py_UCS4) _PyUnicode_ToTitlecase( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UCS4) _PyUnicode_ToTitlecase( Py_UCS4 ch /* Unicode character */ - ) Py_DEPRECATED(3.3); + ); PyAPI_FUNC(int) _PyUnicode_ToLowerFull( Py_UCS4 ch, /* Unicode character */ @@ -1173,42 +1174,42 @@ PyAPI_FUNC(int) _PyUnicode_IsAlpha( Py_UCS4 ch /* Unicode character */ ); -PyAPI_FUNC(size_t) Py_UNICODE_strlen( +Py_DEPRECATED(3.3) PyAPI_FUNC(size_t) Py_UNICODE_strlen( const Py_UNICODE *u - ) Py_DEPRECATED(3.3); + ); -PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcpy( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcpy( Py_UNICODE *s1, - const Py_UNICODE *s2) Py_DEPRECATED(3.3); + const Py_UNICODE *s2); -PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcat( - Py_UNICODE *s1, const Py_UNICODE *s2) Py_DEPRECATED(3.3); +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcat( + Py_UNICODE *s1, const Py_UNICODE *s2); -PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strncpy( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strncpy( Py_UNICODE *s1, const Py_UNICODE *s2, - size_t n) Py_DEPRECATED(3.3); + size_t n); -PyAPI_FUNC(int) Py_UNICODE_strcmp( +Py_DEPRECATED(3.3) PyAPI_FUNC(int) Py_UNICODE_strcmp( const Py_UNICODE *s1, const Py_UNICODE *s2 - ) Py_DEPRECATED(3.3); + ); -PyAPI_FUNC(int) Py_UNICODE_strncmp( +Py_DEPRECATED(3.3) PyAPI_FUNC(int) Py_UNICODE_strncmp( const Py_UNICODE *s1, const Py_UNICODE *s2, size_t n - ) Py_DEPRECATED(3.3); + ); -PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strchr( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strchr( const Py_UNICODE *s, Py_UNICODE c - ) Py_DEPRECATED(3.3); + ); -PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strrchr( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strrchr( const Py_UNICODE *s, Py_UNICODE c - ) Py_DEPRECATED(3.3); + ); PyAPI_FUNC(PyObject*) _PyUnicode_FormatLong(PyObject *, int, int, int); @@ -1216,9 +1217,9 @@ PyAPI_FUNC(PyObject*) _PyUnicode_FormatLong(PyObject *, int, int, int); and raise a MemoryError exception on memory allocation failure, otherwise return a new allocated buffer (use PyMem_Free() to free the buffer). */ -PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( PyObject *unicode - ) Py_DEPRECATED(3.3); + ); /* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); diff --git a/Include/intrcheck.h b/Include/intrcheck.h index 2e17336ca659..e5bf5a834e44 100644 --- a/Include/intrcheck.h +++ b/Include/intrcheck.h @@ -15,7 +15,7 @@ PyAPI_FUNC(void) PyOS_AfterFork_Child(void); #endif #endif /* Deprecated, please use PyOS_AfterFork_Child() instead */ -PyAPI_FUNC(void) PyOS_AfterFork(void) Py_DEPRECATED(3.7); +Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyOS_AfterFork(void); #ifndef Py_LIMITED_API PyAPI_FUNC(int) _PyOS_IsMainThread(void); diff --git a/Include/longobject.h b/Include/longobject.h index a24bbea3a904..1e7a58d994b8 100644 --- a/Include/longobject.h +++ b/Include/longobject.h @@ -102,7 +102,8 @@ PyAPI_FUNC(long long) PyLong_AsLongLongAndOverflow(PyObject *, int *); PyAPI_FUNC(PyObject *) PyLong_FromString(const char *, char **, int); #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int) Py_DEPRECATED(3.3); +Py_DEPRECATED(3.3) +PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int); PyAPI_FUNC(PyObject *) PyLong_FromUnicodeObject(PyObject *u, int base); PyAPI_FUNC(PyObject *) _PyLong_FromBytes(const char *, Py_ssize_t, int); #endif diff --git a/Include/moduleobject.h b/Include/moduleobject.h index 4d173808738c..e246fd2faf91 100644 --- a/Include/moduleobject.h +++ b/Include/moduleobject.h @@ -25,7 +25,7 @@ PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *); PyAPI_FUNC(PyObject *) PyModule_GetNameObject(PyObject *); #endif PyAPI_FUNC(const char *) PyModule_GetName(PyObject *); -PyAPI_FUNC(const char *) PyModule_GetFilename(PyObject *) Py_DEPRECATED(3.2); +Py_DEPRECATED(3.2) PyAPI_FUNC(const char *) PyModule_GetFilename(PyObject *); PyAPI_FUNC(PyObject *) PyModule_GetFilenameObject(PyObject *); #ifndef Py_LIMITED_API PyAPI_FUNC(void) _PyModule_Clear(PyObject *); diff --git a/Include/pyport.h b/Include/pyport.h index ab88a9ac5c52..32d98c59a7c1 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -504,14 +504,18 @@ extern "C" { /* Py_DEPRECATED(version) * Declare a variable, type, or function deprecated. + * The macro must be placed before the declaration. * Usage: - * extern int old_var Py_DEPRECATED(2.3); - * typedef int T1 Py_DEPRECATED(2.4); - * extern int x() Py_DEPRECATED(2.5); + * Py_DEPRECATED(3.3) extern int old_var; + * Py_DEPRECATED(3.4) typedef int T1; + * Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void); */ #if defined(__GNUC__) \ && ((__GNUC__ >= 4) || (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) #define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) +#elif defined(_MSC_VER) +#define Py_DEPRECATED(VERSION) __declspec(deprecated( \ + "deprecated in " #VERSION)) #else #define Py_DEPRECATED(VERSION_UNUSED) #endif diff --git a/Include/pythread.h b/Include/pythread.h index 40f12d257c14..c0f1eb9789b3 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -97,14 +97,15 @@ PyAPI_FUNC(PyObject*) PyThread_GetInfo(void); platforms, but it is not POSIX-compliant. Therefore, the new TSS API uses opaque data type to represent TSS keys to be compatible (see PEP 539). */ -PyAPI_FUNC(int) PyThread_create_key(void) Py_DEPRECATED(3.7); -PyAPI_FUNC(void) PyThread_delete_key(int key) Py_DEPRECATED(3.7); -PyAPI_FUNC(int) PyThread_set_key_value(int key, void *value) Py_DEPRECATED(3.7); -PyAPI_FUNC(void *) PyThread_get_key_value(int key) Py_DEPRECATED(3.7); -PyAPI_FUNC(void) PyThread_delete_key_value(int key) Py_DEPRECATED(3.7); +Py_DEPRECATED(3.7) PyAPI_FUNC(int) PyThread_create_key(void); +Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyThread_delete_key(int key); +Py_DEPRECATED(3.7) PyAPI_FUNC(int) PyThread_set_key_value(int key, + void *value); +Py_DEPRECATED(3.7) PyAPI_FUNC(void *) PyThread_get_key_value(int key); +Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyThread_delete_key_value(int key); /* Cleanup after a fork */ -PyAPI_FUNC(void) PyThread_ReInitTLS(void) Py_DEPRECATED(3.7); +Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyThread_ReInitTLS(void); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 diff --git a/Include/sliceobject.h b/Include/sliceobject.h index c238b099ea81..aae6f3cc7945 100644 --- a/Include/sliceobject.h +++ b/Include/sliceobject.h @@ -40,9 +40,11 @@ PyAPI_FUNC(int) _PySlice_GetLongIndices(PySliceObject *self, PyObject *length, #endif PyAPI_FUNC(int) PySlice_GetIndices(PyObject *r, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +Py_DEPRECATED(3.7) PyAPI_FUNC(int) PySlice_GetIndicesEx(PyObject *r, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, - Py_ssize_t *step, Py_ssize_t *slicelength) Py_DEPRECATED(3.7); + Py_ssize_t *step, + Py_ssize_t *slicelength); #if !defined(Py_LIMITED_API) || (Py_LIMITED_API+0 >= 0x03050400 && Py_LIMITED_API+0 < 0x03060000) || Py_LIMITED_API+0 >= 0x03060100 #define PySlice_GetIndicesEx(slice, length, start, stop, step, slicelen) ( \ diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 503aeb5d19a6..6d141b37bf89 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -174,9 +174,9 @@ PyAPI_FUNC(Py_ssize_t) PyUnicode_GetLength( /* Get the number of Py_UNICODE units in the string representation. */ -PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize( PyObject *unicode /* Unicode object */ - ) Py_DEPRECATED(3.3); + ); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 /* Read a character from the string. */ @@ -381,11 +381,11 @@ PyAPI_FUNC(PyObject*) PyUnicode_Decode( Use PyCodec_Decode() to decode with rot13 and non-standard codecs that decode from str. */ -PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedObject( +Py_DEPRECATED(3.6) PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedObject( PyObject *unicode, /* Unicode object */ const char *encoding, /* encoding */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.6); + ); /* Decode a Unicode object unicode and return the result as Unicode object. @@ -394,11 +394,11 @@ PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedObject( Use PyCodec_Decode() to decode with rot13 and non-standard codecs that decode from str to str. */ -PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedUnicode( +Py_DEPRECATED(3.6) PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedUnicode( PyObject *unicode, /* Unicode object */ const char *encoding, /* encoding */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.6); + ); /* Encodes a Unicode object and returns the result as Python object. @@ -408,11 +408,11 @@ PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedUnicode( Use PyCodec_Encode() for encoding with rot13 and non-standard codecs that encode form str to non-bytes. */ -PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedObject( +Py_DEPRECATED(3.6) PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedObject( PyObject *unicode, /* Unicode object */ const char *encoding, /* encoding */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.6); + ); /* Encodes a Unicode object and returns the result as Python string object. */ @@ -430,11 +430,11 @@ PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedString( Use PyCodec_Encode() to encode with rot13 and non-standard codecs that encode from str to str. */ -PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedUnicode( +Py_DEPRECATED(3.6) PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedUnicode( PyObject *unicode, /* Unicode object */ const char *encoding, /* encoding */ const char *errors /* error handling */ - ) Py_DEPRECATED(3.6); + ); /* Build an encoding map. */ diff --git a/Misc/NEWS.d/next/Windows/2018-08-28-17-23-49.bpo-33407.ARG0W_.rst b/Misc/NEWS.d/next/Windows/2018-08-28-17-23-49.bpo-33407.ARG0W_.rst new file mode 100644 index 000000000000..47b1e0668b18 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2018-08-28-17-23-49.bpo-33407.ARG0W_.rst @@ -0,0 +1 @@ +The :c:macro:`Py_DEPRECATED()` macro has been implemented for MSVC. From webhook-mailer at python.org Tue May 28 11:23:13 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 28 May 2019 15:23:13 -0000 Subject: [Python-checkins] bpo-26423: Fix possible overflow in wrap_lenfunc() (GH-13606) (GH-13625) Message-ID: https://github.com/python/cpython/commit/80dfe990162e7a2dd99524829beecd449a973e9e commit: 80dfe990162e7a2dd99524829beecd449a973e9e branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-05-28T17:23:07+02:00 summary: bpo-26423: Fix possible overflow in wrap_lenfunc() (GH-13606) (GH-13625) Fix possible overflow in wrap_lenfunc() when sizeof(long) < sizeof(Py_ssize_t) (e.g., 64-bit Windows). (cherry picked from commit 05f16416d99dc9fc76fef11e56f16593e7a5955e) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst M Lib/test/test_descr.py M Objects/typeobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index bbc52aa67913..9b8b8a4b33fa 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -403,6 +403,10 @@ def foo(self): return 1 a.setstate(100) self.assertEqual(a.getstate(), 100) + def test_wrap_lenfunc_bad_cast(self): + self.assertEqual(xrange(sys.maxsize).__len__(), sys.maxsize) + + class ClassPropertiesAndMethods(unittest.TestCase): def assertHasAttr(self, obj, name): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst new file mode 100644 index 000000000000..6bf2031a3384 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst @@ -0,0 +1,2 @@ +Fix possible overflow in ``wrap_lenfunc()`` when +``sizeof(long) < sizeof(Py_ssize_t)`` (e.g., 64-bit Windows). diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 56277cfc35ec..1c8958c49a3b 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4398,7 +4398,7 @@ wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped) res = (*func)(self); if (res == -1 && PyErr_Occurred()) return NULL; - return PyInt_FromLong((long)res); + return PyInt_FromSsize_t(res); } static PyObject * From webhook-mailer at python.org Tue May 28 12:15:34 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 28 May 2019 16:15:34 -0000 Subject: [Python-checkins] bpo-26423: Fix test_descr.test_wrap_lenfunc_bad_cast() on 32-bit Windows (GH-13629) Message-ID: https://github.com/python/cpython/commit/aaed2c332ae8370e5e87d09c43ef7a39c2abf68d commit: aaed2c332ae8370e5e87d09c43ef7a39c2abf68d branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-05-28T18:15:30+02:00 summary: bpo-26423: Fix test_descr.test_wrap_lenfunc_bad_cast() on 32-bit Windows (GH-13629) Skip the test if xrange(sys.maxsize) raises an OverflowError. files: M Lib/test/test_descr.py diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 9b8b8a4b33fa..dc75a215f0c9 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -404,7 +404,11 @@ def foo(self): return 1 self.assertEqual(a.getstate(), 100) def test_wrap_lenfunc_bad_cast(self): - self.assertEqual(xrange(sys.maxsize).__len__(), sys.maxsize) + try: + large_range = xrange(sys.maxsize) + except OverflowError as exc: + self.skipTest("xrange(sys.maxsize) failed with: %s" % exc) + self.assertEqual(large_range.__len__(), sys.maxsize) class ClassPropertiesAndMethods(unittest.TestCase): From webhook-mailer at python.org Tue May 28 12:29:08 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Tue, 28 May 2019 16:29:08 -0000 Subject: [Python-checkins] bpo-22640: Add silent mode to py_compile.compile() (GH-12976) Message-ID: https://github.com/python/cpython/commit/2e33ecd7c9b0cac3efc6fcbdd4547fd086b4e2d1 commit: 2e33ecd7c9b0cac3efc6fcbdd4547fd086b4e2d1 branch: master author: Joannah Nanjekye <33177550+nanjekyejoannah at users.noreply.github.com> committer: Berker Peksag date: 2019-05-28T19:29:04+03:00 summary: bpo-22640: Add silent mode to py_compile.compile() (GH-12976) files: A Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst M Doc/library/py_compile.rst M Doc/whatsnew/3.8.rst M Lib/py_compile.py M Lib/test/test_py_compile.py diff --git a/Doc/library/py_compile.rst b/Doc/library/py_compile.rst index 8cb5a4d546c8..3824353abda1 100644 --- a/Doc/library/py_compile.rst +++ b/Doc/library/py_compile.rst @@ -42,6 +42,13 @@ byte-code cache files in the directory containing the source code. is raised. This function returns the path to byte-compiled file, i.e. whatever *cfile* value was used. + The *doraise* and *quiet* arguments determine how errors are handled while + compiling file. If *quiet* is 0 or 1, and *doraise* is false, the default + behaviour is enabled: an error string is written to ``sys.stderr``, and the + function returns ``None`` instead of a path. If *doraise* is true, + a :exc:`PyCompileError` is raised instead. However if *quiet* is 2, + no message is written, and *doraise* has no effect. + If the path that *cfile* becomes (either explicitly specified or computed) is a symlink or non-regular file, :exc:`FileExistsError` will be raised. This is to act as a warning that import will turn those paths into regular @@ -82,6 +89,9 @@ byte-code cache files in the directory containing the source code. overrides the value of the *invalidation_mode* argument, and determines its default value instead. + .. versionchanged:: 3.8 + The *quiet* parameter was added. + .. class:: PycInvalidationMode diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index b32cec1edaca..aaa6ffe1abdf 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -537,6 +537,13 @@ NSKeyedArchiver-encoded binary plists. (Contributed by Jon Janzen in :issue:`26707`.) +py_compile +---------- + +:func:`py_compile.compile` now supports silent mode. +(Contributed by Joannah Nanjekye in :issue:`22640`.) + + socket ------ diff --git a/Lib/py_compile.py b/Lib/py_compile.py index 8e9dd57a5440..21736896afc2 100644 --- a/Lib/py_compile.py +++ b/Lib/py_compile.py @@ -77,7 +77,7 @@ def _get_default_invalidation_mode(): def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, - invalidation_mode=None): + invalidation_mode=None, quiet=0): """Byte-compile one Python source file to Python bytecode. :param file: The source file name. @@ -95,6 +95,8 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, are -1, 0, 1 and 2. A value of -1 means to use the optimization level of the current interpreter, as given by -O command line options. :param invalidation_mode: + :param quiet: Return full output with False or 0, errors only with 1, + and no output with 2. :return: Path to the resulting byte compiled file. @@ -143,11 +145,12 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, _optimize=optimize) except Exception as err: py_exc = PyCompileError(err.__class__, err, dfile or file) - if doraise: - raise py_exc - else: - sys.stderr.write(py_exc.msg + '\n') - return + if quiet < 2: + if doraise: + raise py_exc + else: + sys.stderr.write(py_exc.msg + '\n') + return try: dirname = os.path.dirname(cfile) if dirname: @@ -194,10 +197,12 @@ def main(args=None): compile(filename, doraise=True) except PyCompileError as error: rv = 1 - sys.stderr.write("%s\n" % error.msg) + if quiet < 2: + sys.stderr.write("%s\n" % error.msg) except OSError as error: rv = 1 - sys.stderr.write("%s\n" % error) + if quiet < 2: + sys.stderr.write("%s\n" % error) else: for filename in args: try: @@ -205,7 +210,8 @@ def main(args=None): except PyCompileError as error: # return value to indicate at least one failure rv = 1 - sys.stderr.write("%s\n" % error.msg) + if quiet < 2: + sys.stderr.write("%s\n" % error.msg) return rv if __name__ == "__main__": diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py index f86abe26f97a..d6677ab45ff5 100644 --- a/Lib/test/test_py_compile.py +++ b/Lib/test/test_py_compile.py @@ -192,6 +192,15 @@ def test_invalidation_mode(self): fp.read(), 'test', {}) self.assertEqual(flags, 0b1) + def test_quiet(self): + bad_coding = os.path.join(os.path.dirname(__file__), 'bad_coding2.py') + with support.captured_stderr() as stderr: + self.assertIsNone(py_compile.compile(bad_coding, doraise=False, quiet=2)) + self.assertIsNone(py_compile.compile(bad_coding, doraise=True, quiet=2)) + self.assertEqual(stderr.getvalue(), '') + with self.assertRaises(py_compile.PyCompileError): + py_compile.compile(bad_coding, doraise=True, quiet=1) + class PyCompileTestsWithSourceEpoch(PyCompileTestsBase, unittest.TestCase, diff --git a/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst b/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst new file mode 100644 index 000000000000..8ac6be920443 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst @@ -0,0 +1,2 @@ +:func:`py_compile.compile` now supports silent mode. +Patch by Joannah Nanjekye \ No newline at end of file From webhook-mailer at python.org Tue May 28 13:30:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 17:30:57 -0000 Subject: [Python-checkins] bpo-36933: fix what's new. (GH-13627) Message-ID: https://github.com/python/cpython/commit/382034b255935fbf0b5516708ac16a020d27af39 commit: 382034b255935fbf0b5516708ac16a020d27af39 branch: master author: Matthias Bussonnier committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T10:30:34-07:00 summary: bpo-36933: fix what's new. (GH-13627) Original Pr was reformed and news not updated. https://bugs.python.org/issue36933 files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index aaa6ffe1abdf..d1305dc1e7df 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -990,9 +990,9 @@ The following features and APIs have been removed from Python 3.8: :func:`fileinput.FileInput` which was ignored and deprecated since Python 3.6 has been removed. :issue:`36952` (Contributed by Matthias Bussonnier) -* The function :func:`sys.set_coroutine_wrapper` deprecated in Python 3.7 has - been removed; :func:`sys.get_coroutine_wrapper` now always return ``None``. - :issue:`36933` (Contributed by Matthias Bussonnier) +* The functions :func:`sys.set_coroutine_wrapper` and + :func:`sys.get_coroutine_wrapper` deprecated in Python 3.7 have been removed; + :issue:`36933` (Contributed by Matthias Bussonnier) Porting to Python 3.8 From webhook-mailer at python.org Tue May 28 14:35:34 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 18:35:34 -0000 Subject: [Python-checkins] Fix typo in docs for socket.CAN_RAW_FD_FRAMES (GH-13635) Message-ID: https://github.com/python/cpython/commit/1b05aa219041eb1c9dbcb4ec6c1fa5b20f060bf5 commit: 1b05aa219041eb1c9dbcb4ec6c1fa5b20f060bf5 branch: master author: karl ding committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T11:35:26-07:00 summary: Fix typo in docs for socket.CAN_RAW_FD_FRAMES (GH-13635) There is an extra "one" in the text description for the constant socket.CAN_RAW_FD_FRAMES files: M Doc/library/socket.rst diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index e23a4f5380bd..5be2b76113eb 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -380,7 +380,7 @@ Constants Enables CAN FD support in a CAN_RAW socket. This is disabled by default. This allows your application to send both CAN and CAN FD frames; however, - you one must accept both CAN and CAN FD frames when reading from the socket. + you must accept both CAN and CAN FD frames when reading from the socket. This constant is documented in the Linux documentation. From webhook-mailer at python.org Tue May 28 15:32:34 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 19:32:34 -0000 Subject: [Python-checkins] [3.7] Fix typo in docs for socket.CAN_RAW_FD_FRAMES (GH-13635) (GH-13637) Message-ID: https://github.com/python/cpython/commit/d6a14a14838ff2e7bd5f72633b0d9b6f6e12f20e commit: d6a14a14838ff2e7bd5f72633b0d9b6f6e12f20e branch: 3.7 author: karl ding committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T12:32:12-07:00 summary: [3.7] Fix typo in docs for socket.CAN_RAW_FD_FRAMES (GH-13635) (GH-13637) There is an extra "one" in the text description for the constant socket.CAN_RAW_FD_FRAMES (cherry picked from commit 1b05aa219041eb1c9dbcb4ec6c1fa5b20f060bf5) files: M Doc/library/socket.rst diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 37b15774012d..15c65b97d993 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -373,7 +373,7 @@ Constants Enables CAN FD support in a CAN_RAW socket. This is disabled by default. This allows your application to send both CAN and CAN FD frames; however, - you one must accept both CAN and CAN FD frames when reading from the socket. + you must accept both CAN and CAN FD frames when reading from the socket. This constant is documented in the Linux documentation. From webhook-mailer at python.org Tue May 28 15:49:46 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Tue, 28 May 2019 19:49:46 -0000 Subject: [Python-checkins] bpo-31961: Fix support of path-like executables in subprocess. (GH-5914) Message-ID: https://github.com/python/cpython/commit/9e3c4526394856d6376eed4968d27d53e1d69b7d commit: 9e3c4526394856d6376eed4968d27d53e1d69b7d branch: master author: Serhiy Storchaka committer: GitHub date: 2019-05-28T22:49:35+03:00 summary: bpo-31961: Fix support of path-like executables in subprocess. (GH-5914) files: A Misc/NEWS.d/next/Library/2018-03-27-13-28-16.bpo-31961.GjLoYu.rst M Doc/library/subprocess.rst M Lib/subprocess.py M Lib/test/test_subprocess.py diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index d840b461f98c..ede5c3c5a369 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -347,7 +347,8 @@ functions. the class uses the Windows ``CreateProcess()`` function. The arguments to :class:`Popen` are as follows. - *args* should be a sequence of program arguments or else a single string. + *args* should be a sequence of program arguments or else a single string + or :term:`path-like object`. By default, the program to execute is the first item in *args* if *args* is a sequence. If *args* is a string, the interpretation is platform-dependent and described below. See the *shell* and *executable* @@ -381,6 +382,15 @@ functions. manner described in :ref:`converting-argument-sequence`. This is because the underlying ``CreateProcess()`` operates on strings. + .. versionchanged:: 3.6 + *args* parameter accepts a :term:`path-like object` if *shell* is + ``False`` and a sequence containing path-like objects on POSIX. + + .. versionchanged:: 3.8 + *args* parameter accepts a :term:`path-like object` if *shell* is + ``False`` and a sequence containing bytes and path-like objects + on Windows. + The *shell* argument (which defaults to ``False``) specifies whether to use the shell as the program to execute. If *shell* is ``True``, it is recommended to pass *args* as a string rather than as a sequence. @@ -436,6 +446,13 @@ functions. :program:`ps`. If ``shell=True``, on POSIX the *executable* argument specifies a replacement shell for the default :file:`/bin/sh`. + .. versionchanged:: 3.6 + *executable* parameter accepts a :term:`path-like object` on POSIX. + + .. versionchanged:: 3.8 + *executable* parameter accepts a bytes and :term:`path-like object` + on Windows. + *stdin*, *stdout* and *stderr* specify the executed program's standard input, standard output and standard error file handles, respectively. Valid values are :data:`PIPE`, :data:`DEVNULL`, an existing file descriptor (a positive @@ -492,13 +509,19 @@ functions. The *pass_fds* parameter was added. If *cwd* is not ``None``, the function changes the working directory to - *cwd* before executing the child. *cwd* can be a :class:`str` and + *cwd* before executing the child. *cwd* can be a string, bytes or :term:`path-like ` object. In particular, the function looks for *executable* (or for the first item in *args*) relative to *cwd* if the executable path is a relative path. .. versionchanged:: 3.6 - *cwd* parameter accepts a :term:`path-like object`. + *cwd* parameter accepts a :term:`path-like object` on POSIX. + + .. versionchanged:: 3.7 + *cwd* parameter accepts a :term:`path-like object` on Windows. + + .. versionchanged:: 3.8 + *cwd* parameter accepts a bytes object on Windows. If *restore_signals* is true (the default) all signals that Python has set to SIG_IGN are restored to SIG_DFL in the child process before the exec. diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 6cc9eb322e28..9e36b9de6b34 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -521,7 +521,7 @@ def list2cmdline(seq): # "Parsing C++ Command-Line Arguments" result = [] needquote = False - for arg in seq: + for arg in map(os.fsdecode, seq): bs_buf = [] # Add a space to separate this argument from the others @@ -1203,9 +1203,23 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, assert not pass_fds, "pass_fds not supported on Windows." - if not isinstance(args, str): + if isinstance(args, str): + pass + elif isinstance(args, bytes): + if shell: + raise TypeError('bytes args is not allowed on Windows') + args = list2cmdline([args]) + elif isinstance(args, os.PathLike): + if shell: + raise TypeError('path-like args is not allowed when ' + 'shell is true') + args = list2cmdline([args]) + else: args = list2cmdline(args) + if executable is not None: + executable = os.fsdecode(executable) + # Process startup details if startupinfo is None: startupinfo = STARTUPINFO() @@ -1262,7 +1276,7 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, int(not close_fds), creationflags, env, - os.fspath(cwd) if cwd is not None else None, + os.fsdecode(cwd) if cwd is not None else None, startupinfo) finally: # Child is launched. Close the parent's copy of those pipe @@ -1510,6 +1524,11 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, if isinstance(args, (str, bytes)): args = [args] + elif isinstance(args, os.PathLike): + if shell: + raise TypeError('path-like args is not allowed when ' + 'shell is true') + args = [args] else: args = list(args) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index b0b6b06e9275..fca3ed62099b 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -304,6 +304,18 @@ def test_executable(self): "doesnotexist") self._assert_python([doesnotexist, "-c"], executable=sys.executable) + def test_bytes_executable(self): + doesnotexist = os.path.join(os.path.dirname(sys.executable), + "doesnotexist") + self._assert_python([doesnotexist, "-c"], + executable=os.fsencode(sys.executable)) + + def test_pathlike_executable(self): + doesnotexist = os.path.join(os.path.dirname(sys.executable), + "doesnotexist") + self._assert_python([doesnotexist, "-c"], + executable=FakePath(sys.executable)) + def test_executable_takes_precedence(self): # Check that the executable argument takes precedence over args[0]. # @@ -320,6 +332,16 @@ def test_executable_replaces_shell(self): # when shell=True. self._assert_python([], executable=sys.executable, shell=True) + @unittest.skipIf(mswindows, "executable argument replaces shell") + def test_bytes_executable_replaces_shell(self): + self._assert_python([], executable=os.fsencode(sys.executable), + shell=True) + + @unittest.skipIf(mswindows, "executable argument replaces shell") + def test_pathlike_executable_replaces_shell(self): + self._assert_python([], executable=FakePath(sys.executable), + shell=True) + # For use in the test_cwd* tests below. def _normalize_cwd(self, cwd): # Normalize an expected cwd (for Tru64 support). @@ -358,6 +380,11 @@ def test_cwd(self): temp_dir = self._normalize_cwd(temp_dir) self._assert_cwd(temp_dir, sys.executable, cwd=temp_dir) + def test_cwd_with_bytes(self): + temp_dir = tempfile.gettempdir() + temp_dir = self._normalize_cwd(temp_dir) + self._assert_cwd(temp_dir, sys.executable, cwd=os.fsencode(temp_dir)) + def test_cwd_with_pathlike(self): temp_dir = tempfile.gettempdir() temp_dir = self._normalize_cwd(temp_dir) @@ -1473,6 +1500,34 @@ def test_run_kwargs(self): env=newenv) self.assertEqual(cp.returncode, 33) + def test_run_with_pathlike_path(self): + # bpo-31961: test run(pathlike_object) + # the name of a command that can be run without + # any argumenets that exit fast + prog = 'tree.com' if mswindows else 'ls' + path = shutil.which(prog) + if path is None: + self.skipTest(f'{prog} required for this test') + path = FakePath(path) + res = subprocess.run(path, stdout=subprocess.DEVNULL) + self.assertEqual(res.returncode, 0) + with self.assertRaises(TypeError): + subprocess.run(path, stdout=subprocess.DEVNULL, shell=True) + + def test_run_with_bytes_path_and_arguments(self): + # bpo-31961: test run([bytes_object, b'additional arguments']) + path = os.fsencode(sys.executable) + args = [path, '-c', b'import sys; sys.exit(57)'] + res = subprocess.run(args) + self.assertEqual(res.returncode, 57) + + def test_run_with_pathlike_path_and_arguments(self): + # bpo-31961: test run([pathlike_object, 'additional arguments']) + path = FakePath(sys.executable) + args = [path, '-c', 'import sys; sys.exit(57)'] + res = subprocess.run(args) + self.assertEqual(res.returncode, 57) + def test_capture_output(self): cp = self.run_python(("import sys;" "sys.stdout.write('BDFL'); " diff --git a/Misc/NEWS.d/next/Library/2018-03-27-13-28-16.bpo-31961.GjLoYu.rst b/Misc/NEWS.d/next/Library/2018-03-27-13-28-16.bpo-31961.GjLoYu.rst new file mode 100644 index 000000000000..a38db6790f47 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-27-13-28-16.bpo-31961.GjLoYu.rst @@ -0,0 +1,6 @@ +Added support for bytes and path-like objects in :func:`subprocess.Popen` +on Windows. The *args* parameter now accepts a :term:`path-like object` if +*shell* is ``False`` and a sequence containing bytes and path-like objects. +The *executable* parameter now accepts a bytes and :term:`path-like object`. +The *cwd* parameter now accepts a bytes object. +Based on patch by Anders Lorentsen. From webhook-mailer at python.org Tue May 28 18:55:08 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Tue, 28 May 2019 22:55:08 -0000 Subject: [Python-checkins] Fix comments in initconfig.h (GH-13636) Message-ID: https://github.com/python/cpython/commit/33ce3f012f249782507df896824b045b34f765aa commit: 33ce3f012f249782507df896824b045b34f765aa branch: master author: MandarJKulkarni <33712629+MandarJKulkarni at users.noreply.github.com> committer: Cheryl Sabella date: 2019-05-28T18:55:05-04:00 summary: Fix comments in initconfig.h (GH-13636) files: M Include/cpython/initconfig.h diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index a98b91a86943..67f38e26505c 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -71,11 +71,11 @@ typedef struct { Set to 0 by PYTHONCOERCECLOCALE=0. Set to 1 by PYTHONCOERCECLOCALE=1. Set to 2 if the user preferred LC_CTYPE locale is "C". - If it is equal to 1, LC_CTYPE locale is read to decide it it should be + If it is equal to 1, LC_CTYPE locale is read to decide if it should be coerced or not (ex: PYTHONCOERCECLOCALE=1). Internally, it is set to 2 if the LC_CTYPE locale must be coerced. - Disable by default (set to 0). Set it to -1 to let Python decides if it + Disable by default (set to 0). Set it to -1 to let Python decide if it should be enabled or not. */ int coerce_c_locale; @@ -83,7 +83,7 @@ typedef struct { Set to 1 by PYTHONCOERCECLOCALE=warn. - Disable by default (set to 0). Set it to -1 to let Python decides if it + Disable by default (set to 0). Set it to -1 to let Python decide if it should be enabled or not. */ int coerce_c_locale_warn; From webhook-mailer at python.org Tue May 28 19:09:18 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 23:09:18 -0000 Subject: [Python-checkins] Docs: FIX broken links. (GH-13491) Message-ID: https://github.com/python/cpython/commit/218abd109c4e26f0ec677c894e59280821954237 commit: 218abd109c4e26f0ec677c894e59280821954237 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-28T16:09:14-07:00 summary: Docs: FIX broken links. (GH-13491) (cherry picked from commit 7114c6504a60365b8b0cd718da0ec8a737599fb9) Co-authored-by: Julien Palard files: M Doc/faq/gui.rst M Doc/library/readline.rst M Doc/library/tkinter.rst M Doc/using/mac.rst M Doc/using/windows.rst M Doc/whatsnew/2.6.rst M Doc/whatsnew/3.2.rst diff --git a/Doc/faq/gui.rst b/Doc/faq/gui.rst index 4f9979bf55ed..781da467d180 100644 --- a/Doc/faq/gui.rst +++ b/Doc/faq/gui.rst @@ -104,7 +104,7 @@ What platform-specific GUI toolkits exist for Python? ======================================================== By installing the `PyObjc Objective-C bridge -`_, Python programs can use Mac OS X's +`_, Python programs can use Mac OS X's Cocoa libraries. :ref:`Pythonwin ` by Mark Hammond includes an interface to the diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index 16c28cf7d02f..eae0a6df45f3 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -19,7 +19,7 @@ function. Readline keybindings may be configured via an initialization file, typically ``.inputrc`` in your home directory. See `Readline Init File -`_ +`_ in the GNU Readline manual for information about the format and allowable constructs of that file, and the capabilities of the Readline library in general. diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 60cf892e0888..640fb2ec61d3 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -55,7 +55,7 @@ installed, so you can read the Tcl/Tk documentation specific to that version. `Tcl/Tk recent man pages `_ Recent Tcl/Tk manuals on www.tcl.tk. - `ActiveState Tcl Home Page `_ + `ActiveState Tcl Home Page `_ The Tk/Tcl development is largely taking place at ActiveState. `Tcl and the Tk Toolkit `_ diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index a386728eaee3..bc022fa58c04 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -141,7 +141,7 @@ There are several options for building GUI applications on the Mac with Python. *PyObjC* is a Python binding to Apple's Objective-C/Cocoa framework, which is the foundation of most modern Mac development. Information on PyObjC is -available from https://pythonhosted.org/pyobjc/. +available from https://pypi.org/project/pyobjc/. The standard Python GUI toolkit is :mod:`tkinter`, based on the cross-platform Tk toolkit (https://www.tcl.tk). An Aqua-native version of Tk is bundled with OS diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index a966d1fe67ad..bcc618ca143b 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -1043,7 +1043,9 @@ The `PyWin32 `_ module by Mark Hammond is a collection of modules for advanced Windows-specific support. This includes utilities for: -* `Component Object Model `_ (COM) +* `Component Object Model + `_ + (COM) * Win32 API calls * Registry * Event log @@ -1109,8 +1111,7 @@ For extension modules, consult :ref:`building-on-windows`. MinGW gcc under Windows" or "Installing Python extension with distutils and without Microsoft Visual C++" by S?bastien Sauvage, 2003 - `MingW -- Python extensions `_ - by Trent Apted et al, 2007 + `MingW -- Python extensions `_ Other Platforms diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index 512b8edb357a..b6174a19a178 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -227,7 +227,7 @@ the Python community. Sphinx is a standalone package that can be used for writing, and almost two dozen other projects -(`listed on the Sphinx web site `__) +(`listed on the Sphinx web site `__) have adopted Sphinx as their documentation tool. .. seealso:: diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 2d740006a370..ca3eda05c515 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -50,7 +50,9 @@ This article explains the new features in Python 3.2 as compared to 3.1. It focuses on a few highlights and gives a few examples. For full details, see the -`Misc/NEWS `_ file. +`Misc/NEWS +`_ +file. .. seealso:: @@ -969,10 +971,10 @@ sites do not finish before midnight, the barrier times-out and the ballots are sealed and deposited in a queue for later handling. See `Barrier Synchronization Patterns -`_ for -more examples of how barriers can be used in parallel computing. Also, there is +`_ +for more examples of how barriers can be used in parallel computing. Also, there is a simple but thorough explanation of barriers in `The Little Book of Semaphores -`_, *section 3.6*. +`_, *section 3.6*. (Contributed by Kristj?n Valur J?nsson with an API review by Jeffrey Yasskin in :issue:`8777`.) @@ -2512,9 +2514,9 @@ repository. This distributed version control system should make it easier for members of the community to create and share external changesets. See :pep:`385` for details. -To learn to use the new version control system, see the `tutorial by Joel -Spolsky `_ or the `Guide to Mercurial Workflows -`_. +To learn to use the new version control system, see the `Quick Start +`_ or the `Guide to +Mercurial Workflows `_. Build and C API Changes From webhook-mailer at python.org Tue May 28 19:15:23 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Tue, 28 May 2019 23:15:23 -0000 Subject: [Python-checkins] bpo-22102: Fixes zip files with disks set to 0 (GH-5985) Message-ID: https://github.com/python/cpython/commit/ab0716ed1ea2957396054730afbb80c1825f9786 commit: ab0716ed1ea2957396054730afbb80c1825f9786 branch: master author: Francisco Facioni committer: Cheryl Sabella date: 2019-05-28T19:15:11-04:00 summary: bpo-22102: Fixes zip files with disks set to 0 (GH-5985) files: A Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst M Lib/zipfile.py diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 8f8cb863b003..5496f6eb1867 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -226,7 +226,7 @@ def _EndRecData64(fpin, offset, endrec): if sig != stringEndArchive64Locator: return endrec - if diskno != 0 or disks != 1: + if diskno != 0 or disks > 1: raise BadZipFile("zipfiles that span multiple disks are not supported") # Assume no 'zip64 extensible data' diff --git a/Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst b/Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst new file mode 100644 index 000000000000..ad690f57c523 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst @@ -0,0 +1,2 @@ +Added support for ZIP files with disks set to 0. Such files are commonly created by builtin tools on Windows when use ZIP64 extension. +Patch by Francisco Facioni. From webhook-mailer at python.org Tue May 28 19:21:22 2019 From: webhook-mailer at python.org (Dino Viehland) Date: Tue, 28 May 2019 23:21:22 -0000 Subject: [Python-checkins] bpo-37001: Makes symtable.symtable have parity with compile for input (#13483) Message-ID: https://github.com/python/cpython/commit/415406999d7c09af9f3dcacfb4578b9e97b2ce77 commit: 415406999d7c09af9f3dcacfb4578b9e97b2ce77 branch: master author: Dino Viehland committer: GitHub date: 2019-05-28T16:21:17-07:00 summary: bpo-37001: Makes symtable.symtable have parity with compile for input (#13483) * Makes symtable.symtable have parity for accepted datatypes for source code as compile() * Add NEWS blurb files: A Misc/NEWS.d/next/Library/2019-05-23-21-10-57.bpo-37001.DoLvTK.rst M Include/pythonrun.h M Lib/test/test_symtable.py M Modules/clinic/symtablemodule.c.h M Modules/symtablemodule.c M Python/bltinmodule.c M Python/pythonrun.c diff --git a/Include/pythonrun.h b/Include/pythonrun.h index e83846add981..196355cb8f40 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -119,10 +119,23 @@ PyAPI_FUNC(struct symtable *) Py_SymtableString( const char *filename, /* decoded from the filesystem encoding */ int start); #ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) _Py_SourceAsString( + PyObject *cmd, + const char *funcname, + const char *what, + PyCompilerFlags *cf, + PyObject **cmd_copy); + PyAPI_FUNC(struct symtable *) Py_SymtableStringObject( const char *str, PyObject *filename, int start); + +PyAPI_FUNC(struct symtable *) _Py_SymtableStringObjectFlags( + const char *str, + PyObject *filename, + int start, + PyCompilerFlags *flags); #endif PyAPI_FUNC(void) PyErr_Print(void); diff --git a/Lib/test/test_symtable.py b/Lib/test/test_symtable.py index 0a1cb8d5b432..bea2ce120ca9 100644 --- a/Lib/test/test_symtable.py +++ b/Lib/test/test_symtable.py @@ -215,6 +215,15 @@ def test_single(self): def test_exec(self): symbols = symtable.symtable("def f(x): return x", "?", "exec") + def test_bytes(self): + top = symtable.symtable(TEST_CODE.encode('utf8'), "?", "exec") + self.assertIsNotNone(find_block(top, "Mine")) + + code = b'# -*- coding: iso8859-15 -*-\nclass \xb4: pass\n' + + top = symtable.symtable(code, "?", "exec") + self.assertIsNotNone(find_block(top, "\u017d")) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-05-23-21-10-57.bpo-37001.DoLvTK.rst b/Misc/NEWS.d/next/Library/2019-05-23-21-10-57.bpo-37001.DoLvTK.rst new file mode 100644 index 000000000000..5bcd7a9976c5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-23-21-10-57.bpo-37001.DoLvTK.rst @@ -0,0 +1,2 @@ +:func:`symtable.symtable` now accepts the same input types for source code as the +built-in :func:`compile` function. Patch by Dino Viehland. diff --git a/Modules/clinic/symtablemodule.c.h b/Modules/clinic/symtablemodule.c.h index 73e340bd462a..7d8b0ad300c2 100644 --- a/Modules/clinic/symtablemodule.c.h +++ b/Modules/clinic/symtablemodule.c.h @@ -3,7 +3,7 @@ preserve [clinic start generated code]*/ PyDoc_STRVAR(_symtable_symtable__doc__, -"symtable($module, str, filename, startstr, /)\n" +"symtable($module, source, filename, startstr, /)\n" "--\n" "\n" "Return symbol and scope dictionaries used internally by compiler."); @@ -12,33 +12,21 @@ PyDoc_STRVAR(_symtable_symtable__doc__, {"symtable", (PyCFunction)(void(*)(void))_symtable_symtable, METH_FASTCALL, _symtable_symtable__doc__}, static PyObject * -_symtable_symtable_impl(PyObject *module, const char *str, +_symtable_symtable_impl(PyObject *module, PyObject *source, PyObject *filename, const char *startstr); static PyObject * _symtable_symtable(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; - const char *str; + PyObject *source; PyObject *filename; const char *startstr; if (!_PyArg_CheckPositional("symtable", nargs, 3, 3)) { goto exit; } - if (!PyUnicode_Check(args[0])) { - _PyArg_BadArgument("symtable", 1, "str", args[0]); - goto exit; - } - Py_ssize_t str_length; - str = PyUnicode_AsUTF8AndSize(args[0], &str_length); - if (str == NULL) { - goto exit; - } - if (strlen(str) != (size_t)str_length) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto exit; - } + source = args[0]; if (!PyUnicode_FSDecoder(args[1], &filename)) { goto exit; } @@ -55,9 +43,9 @@ _symtable_symtable(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } - return_value = _symtable_symtable_impl(module, str, filename, startstr); + return_value = _symtable_symtable_impl(module, source, filename, startstr); exit: return return_value; } -/*[clinic end generated code: output=be1cca59de019984 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=de655625eee705f4 input=a9049054013a1b77]*/ diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c index e8d2f5b582be..d66cb44f69bd 100644 --- a/Modules/symtablemodule.c +++ b/Modules/symtablemodule.c @@ -14,7 +14,7 @@ module _symtable /*[clinic input] _symtable.symtable - str: str + source: object filename: object(converter='PyUnicode_FSDecoder') startstr: str / @@ -23,13 +23,23 @@ Return symbol and scope dictionaries used internally by compiler. [clinic start generated code]*/ static PyObject * -_symtable_symtable_impl(PyObject *module, const char *str, +_symtable_symtable_impl(PyObject *module, PyObject *source, PyObject *filename, const char *startstr) -/*[clinic end generated code: output=914b369c9b785956 input=6c615e84d5f408e3]*/ +/*[clinic end generated code: output=59eb0d5fc7285ac4 input=9dd8a50c0c36a4d7]*/ { struct symtable *st; PyObject *t; int start; + PyCompilerFlags cf; + PyObject *source_copy = NULL; + + cf.cf_flags = PyCF_SOURCE_IS_UTF8; + cf.cf_feature_version = PY_MINOR_VERSION; + + const char *str = _Py_SourceAsString(source, "symtable", "string or bytes", &cf, &source_copy); + if (str == NULL) { + return NULL; + } if (strcmp(startstr, "exec") == 0) start = Py_file_input; @@ -41,12 +51,15 @@ _symtable_symtable_impl(PyObject *module, const char *str, PyErr_SetString(PyExc_ValueError, "symtable() arg 3 must be 'exec' or 'eval' or 'single'"); Py_DECREF(filename); + Py_XDECREF(source_copy); return NULL; } - st = Py_SymtableStringObject(str, filename, start); + st = _Py_SymtableStringObjectFlags(str, filename, start, &cf); Py_DECREF(filename); - if (st == NULL) + Py_XDECREF(source_copy); + if (st == NULL) { return NULL; + } t = (PyObject *)st->st_top; Py_INCREF(t); PyMem_Free((void *)st->st_future); diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 5d5808530e11..065ad95c95b1 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -687,55 +687,6 @@ builtin_chr_impl(PyObject *module, int i) } -static const char * -source_as_string(PyObject *cmd, const char *funcname, const char *what, PyCompilerFlags *cf, PyObject **cmd_copy) -{ - const char *str; - Py_ssize_t size; - Py_buffer view; - - *cmd_copy = NULL; - if (PyUnicode_Check(cmd)) { - cf->cf_flags |= PyCF_IGNORE_COOKIE; - str = PyUnicode_AsUTF8AndSize(cmd, &size); - if (str == NULL) - return NULL; - } - else if (PyBytes_Check(cmd)) { - str = PyBytes_AS_STRING(cmd); - size = PyBytes_GET_SIZE(cmd); - } - else if (PyByteArray_Check(cmd)) { - str = PyByteArray_AS_STRING(cmd); - size = PyByteArray_GET_SIZE(cmd); - } - else if (PyObject_GetBuffer(cmd, &view, PyBUF_SIMPLE) == 0) { - /* Copy to NUL-terminated buffer. */ - *cmd_copy = PyBytes_FromStringAndSize( - (const char *)view.buf, view.len); - PyBuffer_Release(&view); - if (*cmd_copy == NULL) { - return NULL; - } - str = PyBytes_AS_STRING(*cmd_copy); - size = PyBytes_GET_SIZE(*cmd_copy); - } - else { - PyErr_Format(PyExc_TypeError, - "%s() arg 1 must be a %s object", - funcname, what); - return NULL; - } - - if (strlen(str) != (size_t)size) { - PyErr_SetString(PyExc_ValueError, - "source code string cannot contain null bytes"); - Py_CLEAR(*cmd_copy); - return NULL; - } - return str; -} - /*[clinic input] compile as builtin_compile @@ -855,7 +806,7 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, goto finally; } - str = source_as_string(source, "compile", "string, bytes or AST", &cf, &source_copy); + str = _Py_SourceAsString(source, "compile", "string, bytes or AST", &cf, &source_copy); if (str == NULL) goto error; @@ -991,7 +942,7 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals, cf.cf_flags = PyCF_SOURCE_IS_UTF8; cf.cf_feature_version = PY_MINOR_VERSION; - str = source_as_string(source, "eval", "string, bytes or code", &cf, &source_copy); + str = _Py_SourceAsString(source, "eval", "string, bytes or code", &cf, &source_copy); if (str == NULL) return NULL; @@ -1083,7 +1034,7 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, PyCompilerFlags cf; cf.cf_flags = PyCF_SOURCE_IS_UTF8; cf.cf_feature_version = PY_MINOR_VERSION; - str = source_as_string(source, "exec", + str = _Py_SourceAsString(source, "exec", "string, bytes or code", &cf, &source_copy); if (str == NULL) diff --git a/Python/pythonrun.c b/Python/pythonrun.c index ace9f2f9874e..784c15bb4b22 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1231,21 +1231,77 @@ PyCompileString(const char *str, const char *filename, int start) return Py_CompileStringFlags(str, filename, start, NULL); } +const char * +_Py_SourceAsString(PyObject *cmd, const char *funcname, const char *what, PyCompilerFlags *cf, PyObject **cmd_copy) +{ + const char *str; + Py_ssize_t size; + Py_buffer view; + + *cmd_copy = NULL; + if (PyUnicode_Check(cmd)) { + cf->cf_flags |= PyCF_IGNORE_COOKIE; + str = PyUnicode_AsUTF8AndSize(cmd, &size); + if (str == NULL) + return NULL; + } + else if (PyBytes_Check(cmd)) { + str = PyBytes_AS_STRING(cmd); + size = PyBytes_GET_SIZE(cmd); + } + else if (PyByteArray_Check(cmd)) { + str = PyByteArray_AS_STRING(cmd); + size = PyByteArray_GET_SIZE(cmd); + } + else if (PyObject_GetBuffer(cmd, &view, PyBUF_SIMPLE) == 0) { + /* Copy to NUL-terminated buffer. */ + *cmd_copy = PyBytes_FromStringAndSize( + (const char *)view.buf, view.len); + PyBuffer_Release(&view); + if (*cmd_copy == NULL) { + return NULL; + } + str = PyBytes_AS_STRING(*cmd_copy); + size = PyBytes_GET_SIZE(*cmd_copy); + } + else { + PyErr_Format(PyExc_TypeError, + "%s() arg 1 must be a %s object", + funcname, what); + return NULL; + } + + if (strlen(str) != (size_t)size) { + PyErr_SetString(PyExc_ValueError, + "source code string cannot contain null bytes"); + Py_CLEAR(*cmd_copy); + return NULL; + } + return str; +} + struct symtable * Py_SymtableStringObject(const char *str, PyObject *filename, int start) +{ + PyCompilerFlags flags; + + flags.cf_flags = 0; + flags.cf_feature_version = PY_MINOR_VERSION; + return _Py_SymtableStringObjectFlags(str, filename, start, &flags); +} + +struct symtable * +_Py_SymtableStringObjectFlags(const char *str, PyObject *filename, int start, PyCompilerFlags *flags) { struct symtable *st; mod_ty mod; - PyCompilerFlags flags; PyArena *arena; arena = PyArena_New(); if (arena == NULL) return NULL; - flags.cf_flags = 0; - flags.cf_feature_version = PY_MINOR_VERSION; - mod = PyParser_ASTFromStringObject(str, filename, start, &flags, arena); + mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); if (mod == NULL) { PyArena_Free(arena); return NULL; From webhook-mailer at python.org Tue May 28 19:22:29 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 23:22:29 -0000 Subject: [Python-checkins] Fix markup and minor grammar improvements in Code_of_conduct.md (GH-13640) Message-ID: https://github.com/python/cpython/commit/44bfff2ec220f2e0291150a776d4d77af7c821ef commit: 44bfff2ec220f2e0291150a776d4d77af7c821ef branch: master author: hydrogen-mvm committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T16:22:24-07:00 summary: Fix markup and minor grammar improvements in Code_of_conduct.md (GH-13640) The old link had a > in the url which prevented the browser from jumping down to the correct section on that page. That PSF page itself has an error: There's a duplicate "the" in that paragraph that needs to be removed: "...and conform to **the the** Python Community Code of Conduct." While I was editing this file, I also fixed some grammar and bolded the 3 important keywords so that they catch the viewer's eyes. I can revert these changes if they are unwanted. Thanks. files: M CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index ed15b520548c..c5f24abe2ca6 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -2,11 +2,11 @@ Please note that all interactions on [Python Software Foundation](https://www.python.org/psf-landing/)-supported -infrastructure is [covered](https://www.python.org/psf/records/board/minutes/2014-01-06/#management-of-the-psfs-web-properties>) +infrastructure is [covered](https://www.python.org/psf/records/board/minutes/2014-01-06/#management-of-the-psfs-web-properties) by the [PSF Code of Conduct](https://www.python.org/psf/codeofconduct/), -which includes all infrastructure used in the development of Python itself +which includes all the infrastructure used in the development of Python itself (e.g. mailing lists, issue trackers, GitHub, etc.). -In general this means everyone is expected to be open, considerate, and -respectful of others no matter what their position is within the project. +In general, this means that everyone is expected to be **open**, **considerate**, and +**respectful** of others no matter what their position is within the project. From webhook-mailer at python.org Tue May 28 19:33:24 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 May 2019 23:33:24 -0000 Subject: [Python-checkins] bpo-22102: Fixes zip files with disks set to 0 (GH-5985) Message-ID: https://github.com/python/cpython/commit/0eb69990c85b6c82c677d5a43e3df28836ae845e commit: 0eb69990c85b6c82c677d5a43e3df28836ae845e branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-28T16:33:21-07:00 summary: bpo-22102: Fixes zip files with disks set to 0 (GH-5985) (cherry picked from commit ab0716ed1ea2957396054730afbb80c1825f9786) Co-authored-by: Francisco Facioni files: A Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst M Lib/zipfile.py diff --git a/Lib/zipfile.py b/Lib/zipfile.py index e83600e13d5e..955d91fd0a2b 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -224,7 +224,7 @@ def _EndRecData64(fpin, offset, endrec): if sig != stringEndArchive64Locator: return endrec - if diskno != 0 or disks != 1: + if diskno != 0 or disks > 1: raise BadZipFile("zipfiles that span multiple disks are not supported") # Assume no 'zip64 extensible data' diff --git a/Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst b/Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst new file mode 100644 index 000000000000..ad690f57c523 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst @@ -0,0 +1,2 @@ +Added support for ZIP files with disks set to 0. Such files are commonly created by builtin tools on Windows when use ZIP64 extension. +Patch by Francisco Facioni. From webhook-mailer at python.org Tue May 28 19:45:02 2019 From: webhook-mailer at python.org (Guido van Rossum) Date: Tue, 28 May 2019 23:45:02 -0000 Subject: [Python-checkins] bpo-37072: Fix crash in PyAST_FromNodeObject() when flags is NULL (#13634) Message-ID: https://github.com/python/cpython/commit/77f0ed7a42606d03ebfe48ab152caf0d796d6540 commit: 77f0ed7a42606d03ebfe48ab152caf0d796d6540 branch: master author: Guido van Rossum committer: GitHub date: 2019-05-28T16:44:58-07:00 summary: bpo-37072: Fix crash in PyAST_FromNodeObject() when flags is NULL (#13634) I'm confident that this fixes the reported crash. flags=NULL is treated as using the latest minor version. https://bugs.python.org/issue37072 files: A Misc/NEWS.d/next/Core and Builtins/2019-05-28-18-18-55.bpo-37072.1Hewl3.rst M Python/ast.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-28-18-18-55.bpo-37072.1Hewl3.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-18-18-55.bpo-37072.1Hewl3.rst new file mode 100644 index 000000000000..15bcc5ed2bb0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-18-18-55.bpo-37072.1Hewl3.rst @@ -0,0 +1 @@ +Fix crash in PyAST_FromNodeObject() when flags is NULL. \ No newline at end of file diff --git a/Python/ast.c b/Python/ast.c index 7ffdf4a2a037..12a45f9bbb00 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -786,7 +786,7 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, /* borrowed reference */ c.c_filename = filename; c.c_normalize = NULL; - c.c_feature_version = flags->cf_feature_version; + c.c_feature_version = flags ? flags->cf_feature_version : PY_MINOR_VERSION; if (TYPE(n) == encoding_decl) n = CHILD(n, 0); From webhook-mailer at python.org Tue May 28 19:45:36 2019 From: webhook-mailer at python.org (Carol Willing) Date: Tue, 28 May 2019 23:45:36 -0000 Subject: [Python-checkins] bpo-36540: Documentation for PEP570 - Python positional only arguments (#13202) Message-ID: https://github.com/python/cpython/commit/b76302ddd0896cb39ce69909349b53db6e7776e2 commit: b76302ddd0896cb39ce69909349b53db6e7776e2 branch: master author: Pablo Galindo committer: Carol Willing date: 2019-05-28T16:45:32-07:00 summary: bpo-36540: Documentation for PEP570 - Python positional only arguments (#13202) * bpo-36540: Documentation for PEP570 - Python positional only arguments * fixup! bpo-36540: Documentation for PEP570 - Python positional only arguments * Update reference for compound statements * Apply suggestions from Carol Co-Authored-By: Carol Willing * Update Doc/tutorial/controlflow.rst Co-Authored-By: Carol Willing * Add extra bullet point and minor edits files: M Doc/c-api/code.rst M Doc/data/refcounts.dat M Doc/library/inspect.rst M Doc/reference/compound_stmts.rst M Doc/tutorial/controlflow.rst diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index fd3f6919d6d7..e2b0b23335e3 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -33,7 +33,7 @@ bound into a function. Return the number of free variables in *co*. -.. c:function:: PyCodeObject* PyCode_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, PyObject *lnotab) +.. c:function:: PyCodeObject* PyCode_New(int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, PyObject *lnotab) Return a new code object. If you need a dummy code object to create a frame, use :c:func:`PyCode_NewEmpty` instead. Calling diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 213ddcb61fae..aca57a1dae9d 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -236,6 +236,7 @@ PyCode_GetNumFree:PyCodeObject*:co:0: PyCode_New:PyCodeObject*::+1: PyCode_New:int:argcount:: +PyCode_New:int:posonlyargcount:: PyCode_New:int:kwonlyargcount:: PyCode_New:int:nlocals:: PyCode_New:int:stacksize:: diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 81824ddc1e54..1cc503a8e94b 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -169,6 +169,9 @@ attributes: | | | variables (referenced via | | | | a function's closure) | +-----------+-------------------+---------------------------+ +| | co_posonlyargcount| number of positional only | +| | | arguments | ++-----------+-------------------+---------------------------+ | | co_kwonlyargcount | number of keyword only | | | | arguments (not including | | | | \*\* arg) | @@ -724,13 +727,9 @@ function. | Name | Meaning | +========================+==============================================+ | *POSITIONAL_ONLY* | Value must be supplied as a positional | - | | argument. | - | | | - | | Python has no explicit syntax for defining | - | | positional-only parameters, but many built-in| - | | and extension module functions (especially | - | | those that accept only one or two parameters)| - | | accept them. | + | | argument. Positional only parameters are | + | | those which appear before a ``/`` entry (if | + | | present) in a Python function definition. | +------------------------+----------------------------------------------+ | *POSITIONAL_OR_KEYWORD*| Value may be supplied as either a keyword or | | | positional argument (this is the standard | diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 42fa86476239..bf53cb5a48ab 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -483,8 +483,10 @@ A function definition defines a user-defined function object (see section decorators: `decorator`+ decorator: "@" `dotted_name` ["(" [`argument_list` [","]] ")"] NEWLINE dotted_name: `identifier` ("." `identifier`)* - parameter_list: `defparameter` ("," `defparameter`)* ["," [`parameter_list_starargs`]] - : | `parameter_list_starargs` + parameter_list: `defparameter` ("," `defparameter`)* ',' '/' [',' [`parameter_list_no_posonly`]] + : | `parameter_list_no_posonly` + parameter_list_no_posonly: `defparameter` ("," `defparameter`)* ["," [`parameter_list_starargs`]] + : | `parameter_list_starargs` parameter_list_starargs: "*" [`parameter`] ("," `defparameter`)* ["," ["**" `parameter` [","]]] : | "**" `parameter` [","] parameter: `identifier` [":" `expression`] diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index cfb9645e0da1..813b7ca93c72 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -519,6 +519,176 @@ and of course it would print: Note that the order in which the keyword arguments are printed is guaranteed to match the order in which they were provided in the function call. +Special parameters +------------------ + +By default, arguments may be passed to a Python function either by position +or explicitly by keyword. For readability and performance, it makes sense to +restrict the way arguments can be passed so that a developer need only look +at the function definition to determine if items are passed by position, by +position or keyword, or by keyword. + +A function definition may look like: + +.. code-block:: none + + def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): + ----------- ---------- ---------- + | | | + | Positional or keyword | + | - Keyword only + -- Positional only + +where ``/`` and ``*`` are optional. If used, these symbols indicate the kind of +parameter by how the arguments may be passed to the function: +positional-only, positional-or-keyword, and keyword-only. Keyword parameters +are also referred to as named parameters. + +------------------------------- +Positional-or-Keyword Arguments +------------------------------- + +If ``/`` and ``*`` are not present in the function definition, arguments may +be passed to a function by position or by keyword. + +-------------------------- +Positional-Only Parameters +-------------------------- + +Looking at this in a bit more detail, it is possible to mark certain parameters +as *positional-only*. If *positional-only*, the parameters' order matters, and +the parameters cannot be passed by keyword. Positional-only parameters are +placed before a ``/`` (forward-slash). The ``/`` is used to logically +separate the positional-only parameters from the rest of the parameters. +If there is no ``/`` in the function definition, there are no positional-only +parameters. + +Parameters following the ``/`` may be *positional-or-keyword* or *keyword-only*. + +---------------------- +Keyword-Only Arguments +---------------------- + +To mark parameters as *keyword-only*, indicating the parameters must be passed +by keyword argument, place an ``*`` in the arguments list just before the first +*keyword-only* parameter. + +----------------- +Function Examples +----------------- + +Consider the following example function definitions paying close attention to the +markers ``/`` and ``*``:: + + >>> def standard_arg(arg): + ... print(arg) + ... + >>> def pos_only_arg(arg, /): + ... print(arg) + ... + >>> def kwd_only_arg(*, arg): + ... print(arg) + ... + >>> def combined_example(pos_only, /, standard, *, kwd_only): + ... print(pos_only, standard, kwd_only) + + +The first function definition, ``standard_arg``, the most familiar form, +places no restrictions on the calling convention and arguments may be +passed by position or keyword:: + + >>> standard_arg(2) + 2 + + >>> standard_arg(arg=2) + 2 + +The second function ``pos_only_arg`` is restricted to only use positional +parameters as there is a ``/`` in the function definition:: + + >>> pos_only_arg(1) + 1 + + >>> pos_only_arg(arg=1) + Traceback (most recent call last): + File "", line 1, in + TypeError: pos_only_arg() got an unexpected keyword argument 'arg' + +The third function ``kwd_only_args`` only allows keyword arguments as indicated +by a ``*`` in the function definition:: + + >>> kwd_only_arg(3) + Traceback (most recent call last): + File "", line 1, in + TypeError: kwd_only_arg() takes 0 positional arguments but 1 was given + + >>> kwd_only_arg(arg=3) + 3 + +And the last uses all three calling conventions in the same function +definition:: + + >>> combined_example(1, 2, 3) + Traceback (most recent call last): + File "", line 1, in + TypeError: combined_example() takes 2 positional arguments but 3 were given + + >>> combined_example(1, 2, kwd_only=3) + 1 2 3 + + >>> combined_example(1, standard=2, kwd_only=3) + 1 2 3 + + >>> combined_example(pos_only=1, standard=2, kwd_only=3) + Traceback (most recent call last): + File "", line 1, in + TypeError: combined_example() got an unexpected keyword argument 'pos_only' + + +Finally, consider this function definition which has a potential collision between the positional argument ``name`` and ``**kwds`` which has ``name`` as a key:: + + def foo(name, **kwds): + return 'name' in kwds + +There is no possible call that will make it return ``True`` as the keyword ``'name'`` +will always to bind to the first parameter. For example:: + + >>> foo(1, **{'name': 2}) + Traceback (most recent call last): + File "", line 1, in + TypeError: foo() got multiple values for argument 'name' + >>> + +But using ``/`` (positional only arguments), it is possible since it allows ``name`` as a positional argument and ``'name'`` as a key in the keyword arguments:: + + def foo(name, /, **kwds): + return 'name' in kwds + >>> foo(1, **{'name': 2}) + True + +In other words, the names of positional-only parameters can be used in +``**kwds`` without ambiguity. + +----- +Recap +----- + +The use case will determine which parameters to use in the function definition:: + + def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): + +As guidance: + +* Use positional-only if you want the name of the parameters to not be + available to the user. This is useful when parameter names have no real + meaning, if you want to enforce the order of the arguments when the function + is called or if you need to take some positional parameters and arbitrary + keywords. +* Use keyword-only when names have meaning and the function definition is + more understandable by being explicit with names or you want to prevent + users relying on the position of the argument being passed. +* For an API, use positional-only to prevent prevent breaking API changes + if the parameter's name is modified in the future. .. _tut-arbitraryargs: From webhook-mailer at python.org Tue May 28 20:58:02 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 29 May 2019 00:58:02 -0000 Subject: [Python-checkins] bpo-37076: _thread.start_new_thread() calls _PyErr_WriteUnraisableMsg() (GH-13617) Message-ID: https://github.com/python/cpython/commit/8b09500345d998f3ff1e363a5210bc87f42ff306 commit: 8b09500345d998f3ff1e363a5210bc87f42ff306 branch: master author: Victor Stinner committer: GitHub date: 2019-05-29T02:57:56+02:00 summary: bpo-37076: _thread.start_new_thread() calls _PyErr_WriteUnraisableMsg() (GH-13617) _thread.start_new_thread() now logs uncaught exception raised by the function using sys.unraisablehook(), rather than sys.excepthook(), so the hook gets access to the function which raised the exception. files: A Misc/NEWS.d/next/Library/2019-05-28-12-17-10.bpo-37076.Bk2xOs.rst M Doc/library/_thread.rst M Lib/test/test_thread.py M Modules/_threadmodule.c diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index a6ce945c7205..48d36e85c9e5 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -43,12 +43,22 @@ This module defines the following constants and functions: .. function:: start_new_thread(function, args[, kwargs]) - Start a new thread and return its identifier. The thread executes the function - *function* with the argument list *args* (which must be a tuple). The optional - *kwargs* argument specifies a dictionary of keyword arguments. When the function - returns, the thread silently exits. When the function terminates with an - unhandled exception, a stack trace is printed and then the thread exits (but - other threads continue to run). + Start a new thread and return its identifier. The thread executes the + function *function* with the argument list *args* (which must be a tuple). + The optional *kwargs* argument specifies a dictionary of keyword arguments. + + When the function returns, the thread silently exits. + + When the function terminates with an unhandled exception, + :func:`sys.unraisablehook` is called to handle the exception. The *object* + attribute of the hook argument is *function*. By default, a stack trace is + printed and then the thread exits (but other threads continue to run). + + When the function raises a :exc:`SystemExit` exception, it is silently + ignored. + + .. versionchanged:: 3.8 + :func:`sys.unraisablehook` is now used to handle unhandled exceptions. .. function:: interrupt_main() diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index f4eb830cf6d7..f946f7bc8399 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -154,6 +154,24 @@ def mywrite(self, *args): started.acquire() self.assertIn("Traceback", stderr.getvalue()) + def test_unraisable_exception(self): + def task(): + started.release() + raise ValueError("task failed") + + started = thread.allocate_lock() + with support.catch_unraisable_exception() as cm: + with support.wait_threads_exit(): + started.acquire() + thread.start_new_thread(task, ()) + started.acquire() + + self.assertEqual(str(cm.unraisable.exc_value), "task failed") + self.assertIs(cm.unraisable.object, task) + self.assertEqual(cm.unraisable.err_msg, + "Exception ignored in thread started by") + self.assertIsNotNone(cm.unraisable.exc_traceback) + class Barrier: def __init__(self, num_threads): diff --git a/Misc/NEWS.d/next/Library/2019-05-28-12-17-10.bpo-37076.Bk2xOs.rst b/Misc/NEWS.d/next/Library/2019-05-28-12-17-10.bpo-37076.Bk2xOs.rst new file mode 100644 index 000000000000..2773675cb5ad --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-12-17-10.bpo-37076.Bk2xOs.rst @@ -0,0 +1,3 @@ +:func:`_thread.start_new_thread` now logs uncaught exception raised by the +function using :func:`sys.unraisablehook`, rather than :func:`sys.excepthook`, +so the hook gets access to the function which raised the exception. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 680e8ca7108c..2b1a98f81b1a 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1002,25 +1002,15 @@ t_bootstrap(void *boot_raw) res = PyObject_Call(boot->func, boot->args, boot->keyw); if (res == NULL) { if (PyErr_ExceptionMatches(PyExc_SystemExit)) + /* SystemExit is ignored silently */ PyErr_Clear(); else { - PyObject *file; - PyObject *exc, *value, *tb; - PySys_WriteStderr( - "Unhandled exception in thread started by "); - PyErr_Fetch(&exc, &value, &tb); - file = _PySys_GetObjectId(&PyId_stderr); - if (file != NULL && file != Py_None) - PyFile_WriteObject(boot->func, file, 0); - else - PyObject_Print(boot->func, stderr, 0); - PySys_WriteStderr("\n"); - PyErr_Restore(exc, value, tb); - PyErr_PrintEx(0); + _PyErr_WriteUnraisableMsg("in thread started by", boot->func); } } - else + else { Py_DECREF(res); + } Py_DECREF(boot->func); Py_DECREF(boot->args); Py_XDECREF(boot->keyw); From webhook-mailer at python.org Tue May 28 21:36:19 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 01:36:19 -0000 Subject: [Python-checkins] [2.7] bpo-33006 - Correct filter doc string to clarify 2nd argument can be iterable (GH-6015) Message-ID: https://github.com/python/cpython/commit/09ba83330b495afedbb6b27853506fe15a85b461 commit: 09ba83330b495afedbb6b27853506fe15a85b461 branch: 2.7 author: Tony Flury committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T18:36:04-07:00 summary: [2.7] bpo-33006 - Correct filter doc string to clarify 2nd argument can be iterable (GH-6015) https://bugs.python.org/issue33006 files: A Misc/NEWS.d/next/Core and Builtins/2018-03-07-09-10-42.bpo-33006.Bzx3LA.rst M Python/bltinmodule.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-03-07-09-10-42.bpo-33006.Bzx3LA.rst b/Misc/NEWS.d/next/Core and Builtins/2018-03-07-09-10-42.bpo-33006.Bzx3LA.rst new file mode 100644 index 000000000000..0bcc0a4b987d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-03-07-09-10-42.bpo-33006.Bzx3LA.rst @@ -0,0 +1,2 @@ +Clarified Doc string for builtin filter function. 2nd Argument can be any +iterable. Patch by Tony Flury diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 4b819da8b399..6d47de1fb20e 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -351,11 +351,12 @@ builtin_filter(PyObject *self, PyObject *args) } PyDoc_STRVAR(filter_doc, -"filter(function or None, sequence) -> list, tuple, or string\n" -"\n" -"Return those items of sequence for which function(item) is true. If\n" -"function is None, return the items that are true. If sequence is a tuple\n" -"or string, return the same type, else return a list."); +"filter(function or None, iterable) -> list, string or tuple\n\ +\n\ +Return a sequence yielding those items of iterable for which function(item)\n\ +is true. If function is None, return the items that are true.\n\ +If iterable is a string or a tuple, the result also has that type; otherwise\n\ +it is always a list."); static PyObject * builtin_format(PyObject *self, PyObject *args) From webhook-mailer at python.org Tue May 28 22:05:02 2019 From: webhook-mailer at python.org (Ned Deily) Date: Wed, 29 May 2019 02:05:02 -0000 Subject: [Python-checkins] bpo-32947: test_ssl fixes for TLS 1.3 and OpenSSL 1.1.1 (GH-11612) Message-ID: https://github.com/python/cpython/commit/3dbc43f63c7e056b80d6e28f3812125a09555456 commit: 3dbc43f63c7e056b80d6e28f3812125a09555456 branch: 3.6 author: Victor Stinner committer: Ned Deily date: 2019-05-28T22:04:54-04:00 summary: bpo-32947: test_ssl fixes for TLS 1.3 and OpenSSL 1.1.1 (GH-11612) Backport partially commit 529525fb5a8fd9b96ab4021311a598c77588b918: complete the previous partial backport (commit 2a4ee8aa01d61b6a9c8e9c65c211e61bdb471826. Co-Authored-By: Christian Heimes files: A Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst M Lib/test/test_ssl.py diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 0aeabc10f2a9..2cabfe5d0b08 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2029,6 +2029,16 @@ def run(self): sys.stdout.write(" server: read %r (%s), sending back %r (%s)...\n" % (msg, ctype, msg.lower(), ctype)) self.write(msg.lower()) + except ConnectionResetError: + # XXX: OpenSSL 1.1.1 sometimes raises ConnectionResetError + # when connection is not shut down gracefully. + if self.server.chatty and support.verbose: + sys.stdout.write( + " Connection reset by peer: {}\n".format( + self.addr) + ) + self.close() + self.running = False except OSError: if self.server.chatty: handle_error("Test server failure:\n") @@ -2108,6 +2118,11 @@ def run(self): pass except KeyboardInterrupt: self.stop() + except BaseException as e: + if support.verbose and self.chatty: + sys.stdout.write( + ' connection handling failed: ' + repr(e) + '\n') + self.sock.close() def stop(self): diff --git a/Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst b/Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst new file mode 100644 index 000000000000..f508504ea65b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst @@ -0,0 +1 @@ +test_ssl fixes for TLS 1.3 and OpenSSL 1.1.1. From webhook-mailer at python.org Tue May 28 22:08:32 2019 From: webhook-mailer at python.org (Ned Deily) Date: Wed, 29 May 2019 02:08:32 -0000 Subject: [Python-checkins] [3.6] bpo-35925: Skip SSL tests that fail due to weak external certs or old TLS (GH-13124) (GH-13252) Message-ID: https://github.com/python/cpython/commit/8ab624b17ba656e9af5a79be6af0cf2911a111ba commit: 8ab624b17ba656e9af5a79be6af0cf2911a111ba branch: 3.6 author: Gregory P. Smith committer: Ned Deily date: 2019-05-28T22:08:27-04:00 summary: [3.6] bpo-35925: Skip SSL tests that fail due to weak external certs or old TLS (GH-13124) (GH-13252) * [3.6] bpo-35925: Skip SSL tests that fail due to weak external certs. (GH-13124) Modern Linux distros such as Debian Buster have default OpenSSL system configurations that reject connections to servers with weak certificates by default. This causes our test suite run with external networking resources enabled to skip these tests when they encounter such a failure. Fixing the network servers is a separate issue.. (cherry picked from commit 2cc0223f43a1ffd59c887a73e2b0ce5202f3be90) Co-authored-by: Gregory P. Smith * Also skip ssl tests that fail when the system rejects TLSv1. * Remove the test_httplib change; server was updated. self-signed.pythontest.net was updated so the test_httplib change is no longer necessary. files: A Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst M Lib/test/test_nntplib.py M Lib/test/test_ssl.py diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index d7642bc66ab3..1d1750a5be22 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -6,6 +6,8 @@ import functools import contextlib import os.path +import re + from test import support from nntplib import NNTP, GroupInfo import nntplib @@ -22,6 +24,13 @@ TIMEOUT = 30 certfile = os.path.join(os.path.dirname(__file__), 'keycert3.pem') +if ssl is not None: + SSLError = ssl.SSLError +else: + class SSLError(Exception): + """Non-existent exception class when we lack SSL support.""" + reason = "This will never be raised." + # TODO: # - test the `file` arg to more commands # - test error conditions @@ -262,14 +271,21 @@ def is_connected(): return False return True - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: - self.assertTrue(is_connected()) - self.assertTrue(server.help()) - self.assertFalse(is_connected()) - - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: - server.quit() - self.assertFalse(is_connected()) + try: + with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + self.assertTrue(is_connected()) + self.assertTrue(server.help()) + self.assertFalse(is_connected()) + + with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + server.quit() + self.assertFalse(is_connected()) + except SSLError as ssl_err: + # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" + if re.search(r'(?i)KEY.TOO.SMALL', ssl_err.reason): + raise unittest.SkipTest(f"Got {ssl_err} connecting " + f"to {self.NNTP_HOST!r}") + raise NetworkedNNTPTestsMixin.wrap_methods() @@ -290,6 +306,12 @@ def setUpClass(cls): try: cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) + except SSLError as ssl_err: + # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" + if re.search(r'(?i)KEY.TOO.SMALL', ssl_err.reason): + raise unittest.SkipTest(f"{cls} got {ssl_err} connecting " + f"to {cls.NNTP_HOST!r}") + raise except EOFError: raise unittest.SkipTest(f"{cls} got EOF error on connecting " f"to {cls.NNTP_HOST!r}") diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 2cabfe5d0b08..74adebc0fb99 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -17,6 +17,7 @@ import asyncore import weakref import platform +import re import functools try: import ctypes @@ -145,6 +146,38 @@ def f(*args, **kwargs): else: return func +def skip_if_openssl_cnf_minprotocol_gt_tls1(func): + """Skip a test if the OpenSSL config MinProtocol is > TLSv1. + + OS distros with an /etc/ssl/openssl.cnf and MinProtocol set often do so to + require TLSv1.2 or higher (Debian Buster). Some of our tests for older + protocol versions will fail under such a config. + + Alternative workaround: Run this test in a process with + OPENSSL_CONF=/dev/null in the environment. + """ + @functools.wraps(func) + def f(*args, **kwargs): + openssl_cnf = os.environ.get("OPENSSL_CONF", "/etc/ssl/openssl.cnf") + try: + with open(openssl_cnf, "r") as config: + for line in config: + match = re.match(r"MinProtocol\s*=\s*(TLSv\d+\S*)", line) + if match: + tls_ver = match.group(1) + if tls_ver > "TLSv1": + raise unittest.SkipTest( + "%s has MinProtocol = %s which is > TLSv1." % + (openssl_cnf, tls_ver)) + except (EnvironmentError, UnicodeDecodeError) as err: + # no config file found, etc. + if support.verbose: + sys.stdout.write("\n Could not scan %s for MinProtocol: %s\n" + % (openssl_cnf, err)) + return func(*args, **kwargs) + return f + + needs_sni = unittest.skipUnless(ssl.HAS_SNI, "SNI support needed for this test") @@ -2629,6 +2662,7 @@ def test_protocol_sslv2(self): client_options=ssl.OP_NO_TLSv1) @skip_if_broken_ubuntu_ssl + @skip_if_openssl_cnf_minprotocol_gt_tls1 def test_protocol_sslv23(self): """Connecting to an SSLv23 server with various client options""" if support.verbose: @@ -2706,6 +2740,7 @@ def test_protocol_tlsv1(self): @skip_if_broken_ubuntu_ssl @unittest.skipUnless(hasattr(ssl, "PROTOCOL_TLSv1_1"), "TLS version 1.1 not supported.") + @skip_if_openssl_cnf_minprotocol_gt_tls1 def test_protocol_tlsv1_1(self): """Connecting to a TLSv1.1 server with various client options. Testing against older TLS versions.""" diff --git a/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst new file mode 100644 index 000000000000..428326cdfe5b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst @@ -0,0 +1 @@ +Skip specific nntplib and ssl networking tests when they would otherwise fail due to a modern OS or distro with a default OpenSSL policy of rejecting connections to servers with weak certificates or disabling TLS below TLSv1.2. From webhook-mailer at python.org Tue May 28 22:30:53 2019 From: webhook-mailer at python.org (Ned Deily) Date: Wed, 29 May 2019 02:30:53 -0000 Subject: [Python-checkins] bpo-35907, CVE-2019-9948: urllib rejects local_file:// scheme (GH-13513) Message-ID: https://github.com/python/cpython/commit/4f06dae5d8d4400ba38d8502da620f07d4a5696e commit: 4f06dae5d8d4400ba38d8502da620f07d4a5696e branch: 3.6 author: Victor Stinner committer: Ned Deily date: 2019-05-28T22:30:47-04:00 summary: bpo-35907, CVE-2019-9948: urllib rejects local_file:// scheme (GH-13513) CVE-2019-9948: Avoid file reading by disallowing local-file:// and local_file:// URL schemes in URLopener().open() and URLopener().retrieve() of urllib.request. Co-Authored-By: SH (cherry picked from commit 0c2b6a3943aa7b022e8eb4bfd9bffcddebf9a587) (cherry picked from commit 34bab215596671d0dec2066ae7d7450cd73f638b) files: A Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst M Lib/test/test_urllib.py M Lib/urllib/request.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 649a5b81575b..0061a5297cb3 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -16,6 +16,7 @@ ssl = None import sys import tempfile +import warnings from nturl2path import url2pathname, pathname2url from base64 import b64encode @@ -1463,6 +1464,23 @@ def open_spam(self, url): "spam://c:|windows%/:=&?~#+!$,;'@()*[]|/path/"), "//c:|windows%/:=&?~#+!$,;'@()*[]|/path/") + def test_local_file_open(self): + # bpo-35907, CVE-2019-9948: urllib must reject local_file:// scheme + class DummyURLopener(urllib.request.URLopener): + def open_local_file(self, url): + return url + + with warnings.catch_warnings(record=True): + warnings.simplefilter("ignore", DeprecationWarning) + + for url in ('local_file://example', 'local-file://example'): + self.assertRaises(OSError, urllib.request.urlopen, url) + self.assertRaises(OSError, urllib.request.URLopener().open, url) + self.assertRaises(OSError, urllib.request.URLopener().retrieve, url) + self.assertRaises(OSError, DummyURLopener().open, url) + self.assertRaises(OSError, DummyURLopener().retrieve, url) + + # Just commented them out. # Can't really tell why keep failing in windows and sparc. # Everywhere else they work ok, but on those machines, sometimes diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index d28f2f8369c7..c9945d951821 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1747,7 +1747,7 @@ def open(self, fullurl, data=None): name = 'open_' + urltype self.type = urltype name = name.replace('-', '_') - if not hasattr(self, name): + if not hasattr(self, name) or name == 'open_local_file': if proxy: return self.open_unknown_proxy(proxy, fullurl, data) else: diff --git a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst new file mode 100644 index 000000000000..37b567a5b6f9 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst @@ -0,0 +1,3 @@ +CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and +``local_file://`` URL schemes in ``URLopener().open()`` and +``URLopener().retrieve()`` of :mod:`urllib.request`. From webhook-mailer at python.org Tue May 28 23:12:48 2019 From: webhook-mailer at python.org (Ned Deily) Date: Wed, 29 May 2019 03:12:48 -0000 Subject: [Python-checkins] bpo-26903: Limit ProcessPoolExecutor to 61 workers on Windows (GH-13132) (GH-13643) Message-ID: https://github.com/python/cpython/commit/8ea0fd85bc67438f679491fae29dfe0a3961900a commit: 8ea0fd85bc67438f679491fae29dfe0a3961900a branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-05-28T23:12:30-04:00 summary: bpo-26903: Limit ProcessPoolExecutor to 61 workers on Windows (GH-13132) (GH-13643) Co-Authored-By: brianquinlan (cherry picked from commit 39889864c09741909da4ec489459d0197ea8f1fc) Co-authored-by: Brian Quinlan files: A Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst M Doc/library/concurrent.futures.rst M Lib/concurrent/futures/process.py M Lib/test/test_concurrent_futures.py diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index a57491543bf4..24d684a0123d 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -216,6 +216,10 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. given, it will default to the number of processors on the machine. If *max_workers* is lower or equal to ``0``, then a :exc:`ValueError` will be raised. + On Windows, *max_workers* must be equal or lower than ``61``. If it is not + then :exc:`ValueError` will be raised. If *max_workers* is ``None``, then + the default chosen will be at most ``61``, even if more processors are + available. *mp_context* can be a multiprocessing context or None. It will be used to launch the workers. If *mp_context* is ``None`` or not given, the default multiprocessing context is used. diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 8a0ed98b3e88..6c6905380eff 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -57,6 +57,7 @@ import weakref from functools import partial import itertools +import sys import traceback # Workers are created as daemon threads and processes. This is done to allow the @@ -109,6 +110,12 @@ def _python_exit(): EXTRA_QUEUED_CALLS = 1 +# On Windows, WaitForMultipleObjects is used to wait for processes to finish. +# It can wait on, at most, 63 objects. There is an overhead of two objects: +# - the result queue reader +# - the thread wakeup reader +_MAX_WINDOWS_WORKERS = 63 - 2 + # Hack to embed stringification of remote traceback in local traceback class _RemoteTraceback(Exception): @@ -504,9 +511,16 @@ def __init__(self, max_workers=None, mp_context=None, if max_workers is None: self._max_workers = os.cpu_count() or 1 + if sys.platform == 'win32': + self._max_workers = min(_MAX_WINDOWS_WORKERS, + self._max_workers) else: if max_workers <= 0: raise ValueError("max_workers must be greater than 0") + elif (sys.platform == 'win32' and + max_workers > _MAX_WINDOWS_WORKERS): + raise ValueError( + f"max_workers must be <= {_MAX_WINDOWS_WORKERS}") self._max_workers = max_workers diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index add2bfdd5abe..ad68909161c7 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -754,6 +754,13 @@ def test_default_workers(self): class ProcessPoolExecutorTest(ExecutorTest): + + @unittest.skipUnless(sys.platform=='win32', 'Windows-only process limit') + def test_max_workers_too_large(self): + with self.assertRaisesRegex(ValueError, + "max_workers must be <= 61"): + futures.ProcessPoolExecutor(max_workers=62) + def test_killed_child(self): # When a child process is abruptly terminated, the whole pool gets # "broken". diff --git a/Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst b/Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst new file mode 100644 index 000000000000..ec3aa05e907e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst @@ -0,0 +1 @@ +Limit `max_workers` in `ProcessPoolExecutor` to 61 to work around a WaitForMultipleObjects limitation. \ No newline at end of file From webhook-mailer at python.org Tue May 28 23:35:41 2019 From: webhook-mailer at python.org (Ned Deily) Date: Wed, 29 May 2019 03:35:41 -0000 Subject: [Python-checkins] [3.7] Fix a possible crash due to PyType_FromSpecWithBases() (GH-10304) (GH-13495) Message-ID: https://github.com/python/cpython/commit/3708316afa061dc6c1c6a1207f4998974cfa0752 commit: 3708316afa061dc6c1c6a1207f4998974cfa0752 branch: 3.7 author: Petr Viktorin committer: Ned Deily date: 2019-05-28T23:35:33-04:00 summary: [3.7] Fix a possible crash due to PyType_FromSpecWithBases() (GH-10304) (GH-13495) If the PyObject_MALLOC() call failed in PyType_FromSpecWithBases(), PyObject_Free() would be called on a static string in type_dealloc(). (cherry picked from commit 0613c1e481440aa8f54ba7f6056924c175fbcc13) Co-authored-by: Zackery Spytz files: M Objects/typeobject.c diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 3092e98f6b25..7065ee518e5c 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2960,6 +2960,7 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) size_t len = strlen(old_doc)+1; char *tp_doc = PyObject_MALLOC(len); if (tp_doc == NULL) { + type->tp_doc = NULL; PyErr_NoMemory(); goto fail; } From webhook-mailer at python.org Tue May 28 23:38:10 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 03:38:10 -0000 Subject: [Python-checkins] bpo-36739: Update controlflow.rst (GH-12983) Message-ID: https://github.com/python/cpython/commit/e1f95e77e0647aff602e0660ba3c282b71045875 commit: e1f95e77e0647aff602e0660ba3c282b71045875 branch: master author: pbhd committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T20:38:03-07:00 summary: bpo-36739: Update controlflow.rst (GH-12983) in addition to global-statement also mention nonlocal-statement (in the paragraph describing access to variables which are non local to a function files: M Doc/tutorial/controlflow.rst diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 813b7ca93c72..81a28a6e5325 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -279,9 +279,11 @@ variables of the function. More precisely, all variable assignments in a function store the value in the local symbol table; whereas variable references first look in the local symbol table, then in the local symbol tables of enclosing functions, then in the global symbol table, and finally in the table -of built-in names. Thus, global variables cannot be directly assigned a value -within a function (unless named in a :keyword:`global` statement), although they -may be referenced. +of built-in names. Thus, global variables and variables of enclosing functions +cannot be directly assigned a value within a function (unless, for global +variables, named in a :keyword:`global` statement, or, for variables of enclosing +functions, named in a :keyword:`nonlocal` statement), although they may be +referenced. The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are From webhook-mailer at python.org Tue May 28 23:48:17 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 03:48:17 -0000 Subject: [Python-checkins] bpo-36739: Update controlflow.rst (GH-12983) Message-ID: https://github.com/python/cpython/commit/cee95fe1825dfeb52d7074c8209b5884a079f06c commit: cee95fe1825dfeb52d7074c8209b5884a079f06c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-28T20:48:12-07:00 summary: bpo-36739: Update controlflow.rst (GH-12983) in addition to global-statement also mention nonlocal-statement (in the paragraph describing access to variables which are non local to a function (cherry picked from commit e1f95e77e0647aff602e0660ba3c282b71045875) Co-authored-by: pbhd files: M Doc/tutorial/controlflow.rst diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index ed42e2baaf3e..c3ce1205e52e 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -279,9 +279,11 @@ variables of the function. More precisely, all variable assignments in a function store the value in the local symbol table; whereas variable references first look in the local symbol table, then in the local symbol tables of enclosing functions, then in the global symbol table, and finally in the table -of built-in names. Thus, global variables cannot be directly assigned a value -within a function (unless named in a :keyword:`global` statement), although they -may be referenced. +of built-in names. Thus, global variables and variables of enclosing functions +cannot be directly assigned a value within a function (unless, for global +variables, named in a :keyword:`global` statement, or, for variables of enclosing +functions, named in a :keyword:`nonlocal` statement), although they may be +referenced. The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are From webhook-mailer at python.org Wed May 29 02:51:06 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 06:51:06 -0000 Subject: [Python-checkins] bpo-35246: fix support for path-like args in asyncio subprocess (GH-13628) Message-ID: https://github.com/python/cpython/commit/744c08a9c75a1a53b7a6521fcee3e7c513919ff9 commit: 744c08a9c75a1a53b7a6521fcee3e7c513919ff9 branch: master author: ?? committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-28T23:50:59-07:00 summary: bpo-35246: fix support for path-like args in asyncio subprocess (GH-13628) Drop isinstance checks from create_subprocess_exec function and let subprocess module do them. https://bugs.python.org/issue35246 https://bugs.python.org/issue35246 files: A Misc/NEWS.d/next/Library/2019-05-28-23-17-35.bpo-35246.oXT21d.rst M Lib/asyncio/base_events.py M Lib/test/test_asyncio/test_subprocess.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 68105eec8132..e0025397fa8a 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1605,11 +1605,6 @@ def _log_subprocess(self, msg, stdin, stdout, stderr): raise ValueError("errors must be None") popen_args = (program,) + args - for arg in popen_args: - if not isinstance(arg, (str, bytes)): - raise TypeError( - f"program arguments must be a bytes or text string, " - f"not {type(arg).__name__}") protocol = protocol_factory() debug_log = None if self._debug: diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index f1ab039ad663..7d72e6cde4e7 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -622,6 +622,17 @@ def test_create_subprocess_shell_text_mode_fails(self): self.loop.run_until_complete(execute()) + def test_create_subprocess_exec_with_path(self): + async def execute(): + p = await subprocess.create_subprocess_exec( + support.FakePath(sys.executable), '-c', 'pass') + await p.wait() + p = await subprocess.create_subprocess_exec( + sys.executable, '-c', 'pass', support.FakePath('.')) + await p.wait() + + self.assertIsNone(self.loop.run_until_complete(execute())) + if sys.platform != 'win32': # Unix class SubprocessWatcherMixin(SubprocessMixin): diff --git a/Misc/NEWS.d/next/Library/2019-05-28-23-17-35.bpo-35246.oXT21d.rst b/Misc/NEWS.d/next/Library/2019-05-28-23-17-35.bpo-35246.oXT21d.rst new file mode 100644 index 000000000000..39d4469cd101 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-23-17-35.bpo-35246.oXT21d.rst @@ -0,0 +1 @@ +Make :func:`asyncio.create_subprocess_exec` accept path-like arguments. From webhook-mailer at python.org Wed May 29 03:02:46 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 07:02:46 -0000 Subject: [Python-checkins] bpo-37075: Fix string concatenation in assert_has_awaits error message (GH-13616) Message-ID: https://github.com/python/cpython/commit/0ae022c6a47abffce22ec185552e319b7b93dbf4 commit: 0ae022c6a47abffce22ec185552e319b7b93dbf4 branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-29T00:02:25-07:00 summary: bpo-37075: Fix string concatenation in assert_has_awaits error message (GH-13616) * Fix the implicit string concatenation in `assert_has_awaits` error message. * Use "await" instead of "call" in `assert_awaited_with` error message. https://bugs.python.org/issue37075 files: M Doc/library/unittest.mock.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testasync.py diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index da6cdfe648b0..46e8ef38ab11 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1954,7 +1954,7 @@ The full list of supported magic methods is: * Container methods: ``__getitem__``, ``__setitem__``, ``__delitem__``, ``__contains__``, ``__len__``, ``__iter__``, ``__reversed__`` and ``__missing__`` -* Context manager: ``__enter__``, ``__exit__``, ``__aenter`` and ``__aexit__`` +* Context manager: ``__enter__``, ``__exit__``, ``__aenter__`` and ``__aexit__`` * Unary numeric methods: ``__neg__``, ``__pos__`` and ``__invert__`` * The numeric methods (including right hand and in-place variants): ``__add__``, ``__sub__``, ``__mul__``, ``__matmul__``, ``__div__``, ``__truediv__``, @@ -2036,6 +2036,7 @@ Methods and their defaults: * ``__len__``: 0 * ``__iter__``: iter([]) * ``__exit__``: False +* ``__aexit__``: False * ``__complex__``: 1j * ``__float__``: 1.0 * ``__bool__``: True diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 055fbb350ce8..be96194793ef 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -791,12 +791,12 @@ def _format_mock_call_signature(self, args, kwargs): return _format_call_signature(name, args, kwargs) - def _format_mock_failure_message(self, args, kwargs): - message = 'expected call not found.\nExpected: %s\nActual: %s' + def _format_mock_failure_message(self, args, kwargs, action='call'): + message = 'expected %s not found.\nExpected: %s\nActual: %s' expected_string = self._format_mock_call_signature(args, kwargs) call_args = self.call_args actual_string = self._format_mock_call_signature(*call_args) - return message % (expected_string, actual_string) + return message % (action, expected_string, actual_string) def _call_matcher(self, _call): @@ -2139,7 +2139,7 @@ def assert_awaited_with(_mock_self, *args, **kwargs): raise AssertionError(f'Expected await: {expected}\nNot awaited') def _error_message(): - msg = self._format_mock_failure_message(args, kwargs) + msg = self._format_mock_failure_message(args, kwargs, action='await') return msg expected = self._call_matcher((args, kwargs)) @@ -2193,7 +2193,7 @@ def assert_has_awaits(_mock_self, calls, any_order=False): if not any_order: if expected not in all_awaits: raise AssertionError( - f'Awaits not found.\nExpected: {_CallList(calls)}\n', + f'Awaits not found.\nExpected: {_CallList(calls)}\n' f'Actual: {self.await_args_list}' ) from cause return diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index ccea4fe242dc..fa906e4f7152 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -542,7 +542,8 @@ def test_assert_awaited_once(self): def test_assert_awaited_with(self): asyncio.run(self._runnable_test()) - with self.assertRaises(AssertionError): + msg = 'expected await not found' + with self.assertRaisesRegex(AssertionError, msg): self.mock.assert_awaited_with('foo') asyncio.run(self._runnable_test('foo')) @@ -580,8 +581,9 @@ def test_assert_any_wait(self): def test_assert_has_awaits_no_order(self): calls = [call('NormalFoo'), call('baz')] - with self.assertRaises(AssertionError): + with self.assertRaises(AssertionError) as cm: self.mock.assert_has_awaits(calls) + self.assertEqual(len(cm.exception.args), 1) asyncio.run(self._runnable_test('foo')) with self.assertRaises(AssertionError): From webhook-mailer at python.org Wed May 29 03:55:54 2019 From: webhook-mailer at python.org (Eric V. Smith) Date: Wed, 29 May 2019 07:55:54 -0000 Subject: [Python-checkins] bpo-37070: Cleanup fstring debug handling (GH-13607) Message-ID: https://github.com/python/cpython/commit/f83d1dbd3bfbde940117c85f5c70de00e47b7e6e commit: f83d1dbd3bfbde940117c85f5c70de00e47b7e6e branch: master author: Eric V. Smith committer: GitHub date: 2019-05-29T03:55:44-04:00 summary: bpo-37070: Cleanup fstring debug handling (GH-13607) * Clean up some comments, fix potential memory leaks, clarify literal and expr_text. files: M Lib/test/test_future.py M Python/ast.c diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py index 303c5f7fbed6..fd468b57b477 100644 --- a/Lib/test/test_future.py +++ b/Lib/test/test_future.py @@ -284,6 +284,7 @@ def test_annotations(self): eq("(x:=10)") eq("f'{(x:=10):=10}'") + def test_fstring_debug_annotations(self): # f-strings with '=' don't round trip very well, so set the expected # result explicitely. self.assertAnnotationEqual("f'{x=!r}'", expected="f'x={x!r}'") diff --git a/Python/ast.c b/Python/ast.c index 12a45f9bbb00..183b08d6ba12 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -5010,8 +5010,8 @@ fstring_parse(const char **str, const char *end, int raw, int recurse_lvl, *expression is set to the expression. For an '=' "debug" expression, *expr_text is set to the debug text (the original text of the expression, - *including the '=' and any whitespace around it, as a string object). If - *not a debug expression, *expr_text set to NULL. */ + including the '=' and any whitespace around it, as a string object). If + not a debug expression, *expr_text set to NULL. */ static int fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, PyObject **expr_text, expr_ty *expression, @@ -5039,6 +5039,8 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, Py_ssize_t nested_depth = 0; char parenstack[MAXLEVEL]; + *expr_text = NULL; + /* Can only nest one level deep. */ if (recurse_lvl >= 2) { ast_error(c, n, "f-string: expressions nested too deeply"); @@ -5214,8 +5216,6 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, if (!*expr_text) { goto error; } - } else { - *expr_text = NULL; } /* Check for a conversion char, if present. */ @@ -5281,6 +5281,7 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, /* Falls through to error. */ error: + Py_XDECREF(*expr_text); return -1; } @@ -5603,7 +5604,8 @@ FstringParser_ConcatFstring(FstringParser *state, const char **str, /* Parse the f-string. */ while (1) { - PyObject *literal[2] = {NULL, NULL}; + PyObject *literal = NULL; + PyObject *expr_text = NULL; expr_ty expression = NULL; /* If there's a zero length literal in front of the @@ -5611,34 +5613,23 @@ FstringParser_ConcatFstring(FstringParser *state, const char **str, the f-string, expression will be NULL (unless result == 1, see below). */ int result = fstring_find_literal_and_expr(str, end, raw, recurse_lvl, - &literal[0], &literal[1], + &literal, &expr_text, &expression, c, n); if (result < 0) return -1; - /* Add the literals, if any. */ - for (int i = 0; i < 2; i++) { - if (!literal[i]) { - /* Do nothing. Just leave last_str alone (and possibly - NULL). */ - } else if (!state->last_str) { - /* Note that the literal can be zero length, if the - input string is "\\\n" or "\\\r", among others. */ - state->last_str = literal[i]; - literal[i] = NULL; - } else { - /* We have a literal, concatenate it. */ - assert(PyUnicode_GET_LENGTH(literal[i]) != 0); - if (FstringParser_ConcatAndDel(state, literal[i]) < 0) - return -1; - literal[i] = NULL; - } + /* Add the literal, if any. */ + if (literal && FstringParser_ConcatAndDel(state, literal) < 0) { + Py_XDECREF(expr_text); + return -1; + } + /* Add the expr_text, if any. */ + if (expr_text && FstringParser_ConcatAndDel(state, expr_text) < 0) { + return -1; } - /* We've dealt with the literals now. They can't be leaked on further - errors. */ - assert(literal[0] == NULL); - assert(literal[1] == NULL); + /* We've dealt with the literal and expr_text, their ownership has + been transferred to the state object. Don't look at them again. */ /* See if we should just loop around to get the next literal and expression, while ignoring the expression this From webhook-mailer at python.org Wed May 29 04:06:22 2019 From: webhook-mailer at python.org (Vinay Sajip) Date: Wed, 29 May 2019 08:06:22 -0000 Subject: [Python-checkins] bpo-22454: Add shlex.join() (the opposite of shlex.split()) (GH-7605) Message-ID: https://github.com/python/cpython/commit/ca804955927dddb6ae5a846dbc0248a932be9a4e commit: ca804955927dddb6ae5a846dbc0248a932be9a4e branch: master author: Bo Bayles committer: Vinay Sajip date: 2019-05-29T09:06:11+01:00 summary: bpo-22454: Add shlex.join() (the opposite of shlex.split()) (GH-7605) files: A Misc/NEWS.d/next/Library/2018-06-10-17-48-07.bpo-22454.qeiy_X.rst M Doc/library/shlex.rst M Doc/whatsnew/3.8.rst M Lib/shlex.py M Lib/test/test_shlex.py diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst index fb335c690068..8c5b0239d1f0 100644 --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -37,6 +37,21 @@ The :mod:`shlex` module defines the following functions: standard input. +.. function:: join(split_command) + + Concatenate the tokens of the list *split_command* and return a string. + This function is the inverse of :func:`split`. + + >>> from shlex import join + >>> print(join(['echo', '-n', 'Multiple words'])) + echo -n 'Multiple words' + + The returned value is shell-escaped to protect against injection + vulnerabilities (see :func:`quote`). + + .. versionadded:: 3.8 + + .. function:: quote(s) Return a shell-escaped version of the string *s*. The returned value is a diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index d1305dc1e7df..f704b47098e6 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -552,6 +552,11 @@ convenience functions to automate the necessary tasks usually involved when creating a server socket, including accepting both IPv4 and IPv6 connections on the same socket. (Contributed by Giampaolo Rodola in :issue:`17561`.) +shlex +---------- + +The new :func:`shlex.join` function acts as the inverse of :func:`shlex.split`. +(Contributed by Bo Bayles in :issue:`32102`.) shutil ------ diff --git a/Lib/shlex.py b/Lib/shlex.py index 2c9786c517a3..fb1130d4eac2 100644 --- a/Lib/shlex.py +++ b/Lib/shlex.py @@ -14,7 +14,7 @@ from io import StringIO -__all__ = ["shlex", "split", "quote"] +__all__ = ["shlex", "split", "quote", "join"] class shlex: "A lexical analyzer class for simple shell-like syntaxes." @@ -305,6 +305,11 @@ def split(s, comments=False, posix=True): return list(lex) +def join(split_command): + """Return a shell-escaped string from *split_command*.""" + return ' '.join(quote(arg) for arg in split_command) + + _find_unsafe = re.compile(r'[^\w@%+=:,./-]', re.ASCII).search def quote(s): diff --git a/Lib/test/test_shlex.py b/Lib/test/test_shlex.py index fd35788e81b2..a432610d3af4 100644 --- a/Lib/test/test_shlex.py +++ b/Lib/test/test_shlex.py @@ -308,6 +308,26 @@ def testQuote(self): self.assertEqual(shlex.quote("test%s'name'" % u), "'test%s'\"'\"'name'\"'\"''" % u) + def testJoin(self): + for split_command, command in [ + (['a ', 'b'], "'a ' b"), + (['a', ' b'], "a ' b'"), + (['a', ' ', 'b'], "a ' ' b"), + (['"a', 'b"'], '\'"a\' \'b"\''), + ]: + with self.subTest(command=command): + joined = shlex.join(split_command) + self.assertEqual(joined, command) + + def testJoinRoundtrip(self): + all_data = self.data + self.posix_data + for command, *split_command in all_data: + with self.subTest(command=command): + joined = shlex.join(split_command) + resplit = shlex.split(joined) + self.assertEqual(split_command, resplit) + + # Allow this test to be used with old shlex.py if not getattr(shlex, "split", None): for methname in dir(ShlexTest): diff --git a/Misc/NEWS.d/next/Library/2018-06-10-17-48-07.bpo-22454.qeiy_X.rst b/Misc/NEWS.d/next/Library/2018-06-10-17-48-07.bpo-22454.qeiy_X.rst new file mode 100644 index 000000000000..2f30e5c893cf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-06-10-17-48-07.bpo-22454.qeiy_X.rst @@ -0,0 +1,2 @@ +The :mod:`shlex` module now exposes :func:`shlex.join`, the inverse of +:func:`shlex.split`. Patch by Bo Bayles. From webhook-mailer at python.org Wed May 29 04:23:33 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Wed, 29 May 2019 08:23:33 -0000 Subject: [Python-checkins] remove unnecessary tp_dealloc (GH-13647) Message-ID: https://github.com/python/cpython/commit/7d408697a96953a182328ec0b0650e9999da4116 commit: 7d408697a96953a182328ec0b0650e9999da4116 branch: master author: Inada Naoki committer: GitHub date: 2019-05-29T17:23:27+09:00 summary: remove unnecessary tp_dealloc (GH-13647) files: M Objects/bytesobject.c M Objects/complexobject.c M Objects/longobject.c M Objects/unicodeobject.c diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 0a3ed8691a22..6f34037154d6 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1077,14 +1077,6 @@ _PyBytes_FormatEx(const char *format, Py_ssize_t format_len, return NULL; } -/* =-= */ - -static void -bytes_dealloc(PyObject *op) -{ - Py_TYPE(op)->tp_free(op); -} - /* Unescape a backslash-escaped string. If unicode is non-zero, the string is a u-literal. If recode_encoding is non-zero, the string is UTF-8 encoded and should be re-encoded in the @@ -2875,7 +2867,7 @@ PyTypeObject PyBytes_Type = { "bytes", PyBytesObject_SIZE, sizeof(char), - bytes_dealloc, /* tp_dealloc */ + 0, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ diff --git a/Objects/complexobject.c b/Objects/complexobject.c index cae2bf11dc9b..6d4d8c56f701 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -343,12 +343,6 @@ PyComplex_AsCComplex(PyObject *op) } } -static void -complex_dealloc(PyObject *op) -{ - op->ob_type->tp_free(op); -} - static PyObject * complex_repr(PyComplexObject *v) { @@ -1118,7 +1112,7 @@ PyTypeObject PyComplex_Type = { "complex", sizeof(PyComplexObject), 0, - complex_dealloc, /* tp_dealloc */ + 0, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ diff --git a/Objects/longobject.c b/Objects/longobject.c index 1934328820c0..3ebbd3e7f9c9 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3053,12 +3053,6 @@ PyLong_AsDouble(PyObject *v) /* Methods */ -static void -long_dealloc(PyObject *v) -{ - Py_TYPE(v)->tp_free(v); -} - static int long_compare(PyLongObject *a, PyLongObject *b) { @@ -5628,7 +5622,7 @@ PyTypeObject PyLong_Type = { "int", /* tp_name */ offsetof(PyLongObject, ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ - long_dealloc, /* tp_dealloc */ + 0, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 0fe7b5658bef..eafda633a3e2 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8099,19 +8099,13 @@ static PyMethodDef encoding_map_methods[] = { { 0 } }; -static void -encoding_map_dealloc(PyObject* o) -{ - PyObject_FREE(o); -} - static PyTypeObject EncodingMapType = { PyVarObject_HEAD_INIT(NULL, 0) "EncodingMap", /*tp_name*/ sizeof(struct encoding_map), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ - encoding_map_dealloc, /*tp_dealloc*/ + 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ From webhook-mailer at python.org Wed May 29 05:34:07 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 09:34:07 -0000 Subject: [Python-checkins] bpo-32972: Async test case (GH-13386) Message-ID: https://github.com/python/cpython/commit/4dd3e3f9bbd320f0dd556688e04db0a6b55a7b52 commit: 4dd3e3f9bbd320f0dd556688e04db0a6b55a7b52 branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-29T02:33:59-07:00 summary: bpo-32972: Async test case (GH-13386) Add explicit `asyncSetUp` and `asyncTearDown` methods. The rest is the same as for #13228 `AsyncTestCase` create a loop instance for every test for the sake of test isolation. Sometimes a loop shared between all tests can speed up tests execution time a lot but it requires control of closed resources after every test finish. Basically, it requires nested supervisors support that was discussed with @1st1 many times. Sorry, asyncio supervisors have no chance to land on Python 3.8. The PR intentionally does not provide API for changing the used event loop or getting the test loop: use `asyncio.set_event_loop_policy()` and `asyncio.get_event_loop()` instead. The PR adds four overridable methods to base `unittest.TestCase` class: ``` def _callSetUp(self): self.setUp() def _callTestMethod(self, method): method() def _callTearDown(self): self.tearDown() def _callCleanup(self, function, /, *args, **kwargs): function(*args, **kwargs) ``` It allows using asyncio facilities with minimal influence on the unittest code. The last but not least: the PR respects contextvars. The context variable installed by `asyncSetUp` is available on test, `tearDown` and a coroutine scheduled by `addCleanup`. https://bugs.python.org/issue32972 files: A Lib/unittest/async_case.py A Lib/unittest/test/test_async_case.py A Misc/NEWS.d/next/Library/2019-05-20-14-47-55.bpo-32972.LoeUNh.rst M Lib/test/test_support.py M Lib/unittest/__init__.py M Lib/unittest/case.py diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index cb664bab1710..8f0746aed829 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -403,7 +403,7 @@ def test_check__all__(self): ("unittest.result", "unittest.case", "unittest.suite", "unittest.loader", "unittest.main", "unittest.runner", - "unittest.signals"), + "unittest.signals", "unittest.async_case"), extra=extra, blacklist=blacklist) diff --git a/Lib/unittest/__init__.py b/Lib/unittest/__init__.py index 5ff1bf37b169..ace3a6fb1dd9 100644 --- a/Lib/unittest/__init__.py +++ b/Lib/unittest/__init__.py @@ -44,7 +44,7 @@ def testMultiply(self): SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. """ -__all__ = ['TestResult', 'TestCase', 'TestSuite', +__all__ = ['TestResult', 'TestCase', 'IsolatedAsyncioTestCase', 'TestSuite', 'TextTestRunner', 'TestLoader', 'FunctionTestCase', 'main', 'defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless', 'expectedFailure', 'TextTestResult', 'installHandler', @@ -57,6 +57,7 @@ def testMultiply(self): __unittest = True from .result import TestResult +from .async_case import IsolatedAsyncioTestCase from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip, skipIf, skipUnless, expectedFailure) from .suite import BaseTestSuite, TestSuite diff --git a/Lib/unittest/async_case.py b/Lib/unittest/async_case.py new file mode 100644 index 000000000000..a3c8bfb9eca7 --- /dev/null +++ b/Lib/unittest/async_case.py @@ -0,0 +1,158 @@ +import asyncio +import inspect + +from .case import TestCase + + + +class IsolatedAsyncioTestCase(TestCase): + # Names intentionally have a long prefix + # to reduce a chance of clashing with user-defined attributes + # from inherited test case + # + # The class doesn't call loop.run_until_complete(self.setUp()) and family + # but uses a different approach: + # 1. create a long-running task that reads self.setUp() + # awaitable from queue along with a future + # 2. await the awaitable object passing in and set the result + # into the future object + # 3. Outer code puts the awaitable and the future object into a queue + # with waiting for the future + # The trick is necessary because every run_until_complete() call + # creates a new task with embedded ContextVar context. + # To share contextvars between setUp(), test and tearDown() we need to execute + # them inside the same task. + + # Note: the test case modifies event loop policy if the policy was not instantiated + # yet. + # asyncio.get_event_loop_policy() creates a default policy on demand but never + # returns None + # I believe this is not an issue in user level tests but python itself for testing + # should reset a policy in every test module + # by calling asyncio.set_event_loop_policy(None) in tearDownModule() + + def __init__(self, methodName='runTest'): + super().__init__(methodName) + self._asyncioTestLoop = None + self._asyncioCallsQueue = None + + async def asyncSetUp(self): + pass + + async def asyncTearDown(self): + pass + + def addAsyncCleanup(self, func, /, *args, **kwargs): + # A trivial trampoline to addCleanup() + # the function exists because it has a different semantics + # and signature: + # addCleanup() accepts regular functions + # but addAsyncCleanup() accepts coroutines + # + # We intentionally don't add inspect.iscoroutinefunction() check + # for func argument because there is no way + # to check for async function reliably: + # 1. It can be "async def func()" iself + # 2. Class can implement "async def __call__()" method + # 3. Regular "def func()" that returns awaitable object + self.addCleanup(*(func, *args), **kwargs) + + def _callSetUp(self): + self.setUp() + self._callAsync(self.asyncSetUp) + + def _callTestMethod(self, method): + self._callMaybeAsync(method) + + def _callTearDown(self): + self._callAsync(self.asyncTearDown) + self.tearDown() + + def _callCleanup(self, function, *args, **kwargs): + self._callMaybeAsync(function, *args, **kwargs) + + def _callAsync(self, func, /, *args, **kwargs): + assert self._asyncioTestLoop is not None + ret = func(*args, **kwargs) + assert inspect.isawaitable(ret) + fut = self._asyncioTestLoop.create_future() + self._asyncioCallsQueue.put_nowait((fut, ret)) + return self._asyncioTestLoop.run_until_complete(fut) + + def _callMaybeAsync(self, func, /, *args, **kwargs): + assert self._asyncioTestLoop is not None + ret = func(*args, **kwargs) + if inspect.isawaitable(ret): + fut = self._asyncioTestLoop.create_future() + self._asyncioCallsQueue.put_nowait((fut, ret)) + return self._asyncioTestLoop.run_until_complete(fut) + else: + return ret + + async def _asyncioLoopRunner(self): + queue = self._asyncioCallsQueue + while True: + query = await queue.get() + queue.task_done() + if query is None: + return + fut, awaitable = query + try: + ret = await awaitable + if not fut.cancelled(): + fut.set_result(ret) + except asyncio.CancelledError: + raise + except Exception as ex: + if not fut.cancelled(): + fut.set_exception(ex) + + def _setupAsyncioLoop(self): + assert self._asyncioTestLoop is None + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + loop.set_debug(True) + self._asyncioTestLoop = loop + self._asyncioCallsQueue = asyncio.Queue(loop=loop) + self._asyncioCallsTask = loop.create_task(self._asyncioLoopRunner()) + + def _tearDownAsyncioLoop(self): + assert self._asyncioTestLoop is not None + loop = self._asyncioTestLoop + self._asyncioTestLoop = None + self._asyncioCallsQueue.put_nowait(None) + loop.run_until_complete(self._asyncioCallsQueue.join()) + + try: + # cancel all tasks + to_cancel = asyncio.all_tasks(loop) + if not to_cancel: + return + + for task in to_cancel: + task.cancel() + + loop.run_until_complete( + asyncio.gather(*to_cancel, loop=loop, return_exceptions=True)) + + for task in to_cancel: + if task.cancelled(): + continue + if task.exception() is not None: + loop.call_exception_handler({ + 'message': 'unhandled exception during test shutdown', + 'exception': task.exception(), + 'task': task, + }) + # shutdown asyncgens + loop.run_until_complete(loop.shutdown_asyncgens()) + finally: + asyncio.set_event_loop(None) + loop.close() + + def run(self, result=None): + self._setupAsyncioLoop() + try: + return super().run(result) + finally: + self._tearDownAsyncioLoop() diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 8e01c3dc7bbd..7b1e86941315 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -645,6 +645,18 @@ def _addUnexpectedSuccess(self, result): else: addUnexpectedSuccess(self) + def _callSetUp(self): + self.setUp() + + def _callTestMethod(self, method): + method() + + def _callTearDown(self): + self.tearDown() + + def _callCleanup(self, function, /, *args, **kwargs): + function(*args, **kwargs) + def run(self, result=None): orig_result = result if result is None: @@ -676,14 +688,14 @@ def run(self, result=None): self._outcome = outcome with outcome.testPartExecutor(self): - self.setUp() + self._callSetUp() if outcome.success: outcome.expecting_failure = expecting_failure with outcome.testPartExecutor(self, isTest=True): - testMethod() + self._callTestMethod(testMethod) outcome.expecting_failure = False with outcome.testPartExecutor(self): - self.tearDown() + self._callTearDown() self.doCleanups() for test, reason in outcome.skipped: @@ -721,7 +733,7 @@ def doCleanups(self): while self._cleanups: function, args, kwargs = self._cleanups.pop() with outcome.testPartExecutor(self): - function(*args, **kwargs) + self._callCleanup(function, *args, **kwargs) # return this for backwards compatibility # even though we no longer use it internally diff --git a/Lib/unittest/test/test_async_case.py b/Lib/unittest/test/test_async_case.py new file mode 100644 index 000000000000..2db441da202a --- /dev/null +++ b/Lib/unittest/test/test_async_case.py @@ -0,0 +1,195 @@ +import asyncio +import unittest + + +def tearDownModule(): + asyncio.set_event_loop_policy(None) + + +class TestAsyncCase(unittest.TestCase): + def test_full_cycle(self): + events = [] + + class Test(unittest.IsolatedAsyncioTestCase): + def setUp(self): + self.assertEqual(events, []) + events.append('setUp') + + async def asyncSetUp(self): + self.assertEqual(events, ['setUp']) + events.append('asyncSetUp') + + async def test_func(self): + self.assertEqual(events, ['setUp', + 'asyncSetUp']) + events.append('test') + self.addAsyncCleanup(self.on_cleanup) + + async def asyncTearDown(self): + self.assertEqual(events, ['setUp', + 'asyncSetUp', + 'test']) + events.append('asyncTearDown') + + def tearDown(self): + self.assertEqual(events, ['setUp', + 'asyncSetUp', + 'test', + 'asyncTearDown']) + events.append('tearDown') + + async def on_cleanup(self): + self.assertEqual(events, ['setUp', + 'asyncSetUp', + 'test', + 'asyncTearDown', + 'tearDown']) + events.append('cleanup') + + test = Test("test_func") + test.run() + self.assertEqual(events, ['setUp', + 'asyncSetUp', + 'test', + 'asyncTearDown', + 'tearDown', + 'cleanup']) + + def test_exception_in_setup(self): + events = [] + + class Test(unittest.IsolatedAsyncioTestCase): + async def asyncSetUp(self): + events.append('asyncSetUp') + raise Exception() + + async def test_func(self): + events.append('test') + self.addAsyncCleanup(self.on_cleanup) + + async def asyncTearDown(self): + events.append('asyncTearDown') + + async def on_cleanup(self): + events.append('cleanup') + + + test = Test("test_func") + test.run() + self.assertEqual(events, ['asyncSetUp']) + + def test_exception_in_test(self): + events = [] + + class Test(unittest.IsolatedAsyncioTestCase): + async def asyncSetUp(self): + events.append('asyncSetUp') + + async def test_func(self): + events.append('test') + raise Exception() + self.addAsyncCleanup(self.on_cleanup) + + async def asyncTearDown(self): + events.append('asyncTearDown') + + async def on_cleanup(self): + events.append('cleanup') + + test = Test("test_func") + test.run() + self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown']) + + def test_exception_in_test_after_adding_cleanup(self): + events = [] + + class Test(unittest.IsolatedAsyncioTestCase): + async def asyncSetUp(self): + events.append('asyncSetUp') + + async def test_func(self): + events.append('test') + self.addAsyncCleanup(self.on_cleanup) + raise Exception() + + async def asyncTearDown(self): + events.append('asyncTearDown') + + async def on_cleanup(self): + events.append('cleanup') + + test = Test("test_func") + test.run() + self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup']) + + def test_exception_in_tear_down(self): + events = [] + + class Test(unittest.IsolatedAsyncioTestCase): + async def asyncSetUp(self): + events.append('asyncSetUp') + + async def test_func(self): + events.append('test') + self.addAsyncCleanup(self.on_cleanup) + + async def asyncTearDown(self): + events.append('asyncTearDown') + raise Exception() + + async def on_cleanup(self): + events.append('cleanup') + + test = Test("test_func") + test.run() + self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup']) + + + def test_exception_in_tear_clean_up(self): + events = [] + + class Test(unittest.IsolatedAsyncioTestCase): + async def asyncSetUp(self): + events.append('asyncSetUp') + + async def test_func(self): + events.append('test') + self.addAsyncCleanup(self.on_cleanup) + + async def asyncTearDown(self): + events.append('asyncTearDown') + + async def on_cleanup(self): + events.append('cleanup') + raise Exception() + + test = Test("test_func") + test.run() + self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup']) + + def test_cleanups_interleave_order(self): + events = [] + + class Test(unittest.IsolatedAsyncioTestCase): + async def test_func(self): + self.addAsyncCleanup(self.on_sync_cleanup, 1) + self.addAsyncCleanup(self.on_async_cleanup, 2) + self.addAsyncCleanup(self.on_sync_cleanup, 3) + self.addAsyncCleanup(self.on_async_cleanup, 4) + + async def on_sync_cleanup(self, val): + events.append(f'sync_cleanup {val}') + + async def on_async_cleanup(self, val): + events.append(f'async_cleanup {val}') + + test = Test("test_func") + test.run() + self.assertEqual(events, ['async_cleanup 4', + 'sync_cleanup 3', + 'async_cleanup 2', + 'sync_cleanup 1']) + + +if __name__ == "__main__": + unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-05-20-14-47-55.bpo-32972.LoeUNh.rst b/Misc/NEWS.d/next/Library/2019-05-20-14-47-55.bpo-32972.LoeUNh.rst new file mode 100644 index 000000000000..c8c47cd77635 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-20-14-47-55.bpo-32972.LoeUNh.rst @@ -0,0 +1 @@ +Implement ``unittest.AsyncTestCase`` to help testing asyncio-based code. From webhook-mailer at python.org Wed May 29 06:58:14 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Wed, 29 May 2019 10:58:14 -0000 Subject: [Python-checkins] bpo-33164: blake2 fix for HP-UX (GH-13633) Message-ID: https://github.com/python/cpython/commit/d8b755167235e0621814eb5ac39163b3db6879bb commit: d8b755167235e0621814eb5ac39163b3db6879bb branch: master author: David Carlier committer: Inada Naoki date: 2019-05-29T19:58:11+09:00 summary: bpo-33164: blake2 fix for HP-UX (GH-13633) files: M Modules/_blake2/impl/blake2-impl.h M configure.ac diff --git a/Modules/_blake2/impl/blake2-impl.h b/Modules/_blake2/impl/blake2-impl.h index 5bebd83a2b7d..9d2fbb72fc1c 100644 --- a/Modules/_blake2/impl/blake2-impl.h +++ b/Modules/_blake2/impl/blake2-impl.h @@ -140,6 +140,9 @@ static inline void secure_zero_memory(void *v, size_t n) { #if defined(_WIN32) || defined(WIN32) SecureZeroMemory(v, n); +#elif defined(__hpux) + static void *(*const volatile memset_v)(void *, int, size_t) = &memset; + memset_v(v, 0, n); #else // prioritize first the general C11 call #if defined(HAVE_MEMSET_S) diff --git a/configure.ac b/configure.ac index c743edfdeb18..864c0abcf93e 100644 --- a/configure.ac +++ b/configure.ac @@ -3527,6 +3527,8 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \ if_nameindex \ + initgroups kill killpg lchmod lchown lockf linkat lstat lutimes mmap \ + memrchr mbrtowc mkdirat mkfifo \ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ From webhook-mailer at python.org Wed May 29 11:20:53 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 29 May 2019 15:20:53 -0000 Subject: [Python-checkins] bpo-36842: Fix reference leak in tests by running out-of-proc (GH-13556) Message-ID: https://github.com/python/cpython/commit/9ddc416e9f6635376312c3615193f19480ac772a commit: 9ddc416e9f6635376312c3615193f19480ac772a branch: master author: Steve Dower committer: GitHub date: 2019-05-29T08:20:35-07:00 summary: bpo-36842: Fix reference leak in tests by running out-of-proc (GH-13556) files: A Lib/test/audit-tests.py M Lib/test/libregrtest/setup.py M Lib/test/test_audit.py diff --git a/Lib/test/audit-tests.py b/Lib/test/audit-tests.py new file mode 100644 index 000000000000..7a7725f7c212 --- /dev/null +++ b/Lib/test/audit-tests.py @@ -0,0 +1,269 @@ +"""This script contains the actual auditing tests. + +It should not be imported directly, but should be run by the test_audit +module with arguments identifying each test. + +""" + +import contextlib +import sys + + +class TestHook: + """Used in standard hook tests to collect any logged events. + + Should be used in a with block to ensure that it has no impact + after the test completes. + """ + + def __init__(self, raise_on_events=None, exc_type=RuntimeError): + self.raise_on_events = raise_on_events or () + self.exc_type = exc_type + self.seen = [] + self.closed = False + + def __enter__(self, *a): + sys.addaudithook(self) + return self + + def __exit__(self, *a): + self.close() + + def close(self): + self.closed = True + + @property + def seen_events(self): + return [i[0] for i in self.seen] + + def __call__(self, event, args): + if self.closed: + return + self.seen.append((event, args)) + if event in self.raise_on_events: + raise self.exc_type("saw event " + event) + + +class TestFinalizeHook: + """Used in the test_finalize_hooks function to ensure that hooks + are correctly cleaned up, that they are notified about the cleanup, + and are unable to prevent it. + """ + + def __init__(self): + print("Created", id(self), file=sys.stdout, flush=True) + + def __call__(self, event, args): + # Avoid recursion when we call id() below + if event == "builtins.id": + return + + print(event, id(self), file=sys.stdout, flush=True) + + if event == "cpython._PySys_ClearAuditHooks": + raise RuntimeError("Should be ignored") + elif event == "cpython.PyInterpreterState_Clear": + raise RuntimeError("Should be ignored") + + +# Simple helpers, since we are not in unittest here +def assertEqual(x, y): + if x != y: + raise AssertionError(f"{x!r} should equal {y!r}") + + +def assertIn(el, series): + if el not in series: + raise AssertionError(f"{el!r} should be in {series!r}") + + +def assertNotIn(el, series): + if el in series: + raise AssertionError(f"{el!r} should not be in {series!r}") + + +def assertSequenceEqual(x, y): + if len(x) != len(y): + raise AssertionError(f"{x!r} should equal {y!r}") + if any(ix != iy for ix, iy in zip(x, y)): + raise AssertionError(f"{x!r} should equal {y!r}") + + + at contextlib.contextmanager +def assertRaises(ex_type): + try: + yield + assert False, f"expected {ex_type}" + except BaseException as ex: + if isinstance(ex, AssertionError): + raise + assert type(ex) is ex_type, f"{ex} should be {ex_type}" + + +def test_basic(): + with TestHook() as hook: + sys.audit("test_event", 1, 2, 3) + assertEqual(hook.seen[0][0], "test_event") + assertEqual(hook.seen[0][1], (1, 2, 3)) + + +def test_block_add_hook(): + # Raising an exception should prevent a new hook from being added, + # but will not propagate out. + with TestHook(raise_on_events="sys.addaudithook") as hook1: + with TestHook() as hook2: + sys.audit("test_event") + assertIn("test_event", hook1.seen_events) + assertNotIn("test_event", hook2.seen_events) + + +def test_block_add_hook_baseexception(): + # Raising BaseException will propagate out when adding a hook + with assertRaises(BaseException): + with TestHook( + raise_on_events="sys.addaudithook", exc_type=BaseException + ) as hook1: + # Adding this next hook should raise BaseException + with TestHook() as hook2: + pass + + +def test_finalize_hooks(): + sys.addaudithook(TestFinalizeHook()) + + +def test_pickle(): + import pickle + + class PicklePrint: + def __reduce_ex__(self, p): + return str, ("Pwned!",) + + payload_1 = pickle.dumps(PicklePrint()) + payload_2 = pickle.dumps(("a", "b", "c", 1, 2, 3)) + + # Before we add the hook, ensure our malicious pickle loads + assertEqual("Pwned!", pickle.loads(payload_1)) + + with TestHook(raise_on_events="pickle.find_class") as hook: + with assertRaises(RuntimeError): + # With the hook enabled, loading globals is not allowed + pickle.loads(payload_1) + # pickles with no globals are okay + pickle.loads(payload_2) + + +def test_monkeypatch(): + class A: + pass + + class B: + pass + + class C(A): + pass + + a = A() + + with TestHook() as hook: + # Catch name changes + C.__name__ = "X" + # Catch type changes + C.__bases__ = (B,) + # Ensure bypassing __setattr__ is still caught + type.__dict__["__bases__"].__set__(C, (B,)) + # Catch attribute replacement + C.__init__ = B.__init__ + # Catch attribute addition + C.new_attr = 123 + # Catch class changes + a.__class__ = B + + actual = [(a[0], a[1]) for e, a in hook.seen if e == "object.__setattr__"] + assertSequenceEqual( + [(C, "__name__"), (C, "__bases__"), (C, "__bases__"), (a, "__class__")], actual + ) + + +def test_open(): + # SSLContext.load_dh_params uses _Py_fopen_obj rather than normal open() + try: + import ssl + + load_dh_params = ssl.create_default_context().load_dh_params + except ImportError: + load_dh_params = None + + # Try a range of "open" functions. + # All of them should fail + with TestHook(raise_on_events={"open"}) as hook: + for fn, *args in [ + (open, sys.argv[2], "r"), + (open, sys.executable, "rb"), + (open, 3, "wb"), + (open, sys.argv[2], "w", -1, None, None, None, False, lambda *a: 1), + (load_dh_params, sys.argv[2]), + ]: + if not fn: + continue + with assertRaises(RuntimeError): + fn(*args) + + actual_mode = [(a[0], a[1]) for e, a in hook.seen if e == "open" and a[1]] + actual_flag = [(a[0], a[2]) for e, a in hook.seen if e == "open" and not a[1]] + assertSequenceEqual( + [ + i + for i in [ + (sys.argv[2], "r"), + (sys.executable, "r"), + (3, "w"), + (sys.argv[2], "w"), + (sys.argv[2], "rb") if load_dh_params else None, + ] + if i is not None + ], + actual_mode, + ) + assertSequenceEqual([], actual_flag) + + +def test_cantrace(): + traced = [] + + def trace(frame, event, *args): + if frame.f_code == TestHook.__call__.__code__: + traced.append(event) + + old = sys.settrace(trace) + try: + with TestHook() as hook: + # No traced call + eval("1") + + # No traced call + hook.__cantrace__ = False + eval("2") + + # One traced call + hook.__cantrace__ = True + eval("3") + + # Two traced calls (writing to private member, eval) + hook.__cantrace__ = 1 + eval("4") + + # One traced call (writing to private member) + hook.__cantrace__ = 0 + finally: + sys.settrace(old) + + assertSequenceEqual(["call"] * 4, traced) + + +if __name__ == "__main__": + from test.libregrtest.setup import suppress_msvcrt_asserts + suppress_msvcrt_asserts(False) + + test = sys.argv[1] + globals()[test]() diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 84931140b102..fb5ac350cd08 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -83,27 +83,7 @@ def setup_tests(ns): if ns.threshold is not None: gc.set_threshold(ns.threshold) - try: - import msvcrt - except ImportError: - pass - else: - msvcrt.SetErrorMode(msvcrt.SEM_FAILCRITICALERRORS| - msvcrt.SEM_NOALIGNMENTFAULTEXCEPT| - msvcrt.SEM_NOGPFAULTERRORBOX| - msvcrt.SEM_NOOPENFILEERRORBOX) - try: - msvcrt.CrtSetReportMode - except AttributeError: - # release build - pass - else: - for m in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]: - if ns.verbose and ns.verbose >= 2: - msvcrt.CrtSetReportMode(m, msvcrt.CRTDBG_MODE_FILE) - msvcrt.CrtSetReportFile(m, msvcrt.CRTDBG_FILE_STDERR) - else: - msvcrt.CrtSetReportMode(m, 0) + suppress_msvcrt_asserts(ns.verbose and ns.verbose >= 2) support.use_resources = ns.use_resources @@ -114,6 +94,31 @@ def _test_audit_hook(name, args): sys.addaudithook(_test_audit_hook) +def suppress_msvcrt_asserts(verbose): + try: + import msvcrt + except ImportError: + return + + msvcrt.SetErrorMode(msvcrt.SEM_FAILCRITICALERRORS| + msvcrt.SEM_NOALIGNMENTFAULTEXCEPT| + msvcrt.SEM_NOGPFAULTERRORBOX| + msvcrt.SEM_NOOPENFILEERRORBOX) + try: + msvcrt.CrtSetReportMode + except AttributeError: + # release build + return + + for m in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]: + if verbose: + msvcrt.CrtSetReportMode(m, msvcrt.CRTDBG_MODE_FILE) + msvcrt.CrtSetReportFile(m, msvcrt.CRTDBG_FILE_STDERR) + else: + msvcrt.CrtSetReportMode(m, 0) + + + def replace_stdout(): """Set stdout encoder error handler to backslashreplace (as stderr error handler) to avoid UnicodeEncodeError when printing a traceback""" diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py index 5b33d978f99d..f629b7b3d073 100644 --- a/Lib/test/test_audit.py +++ b/Lib/test/test_audit.py @@ -10,111 +10,47 @@ if not hasattr(sys, "addaudithook") or not hasattr(sys, "audit"): raise unittest.SkipTest("test only relevant when sys.audit is available") - -class TestHook: - """Used in standard hook tests to collect any logged events. - - Should be used in a with block to ensure that it has no impact - after the test completes. Audit hooks cannot be removed, so the - best we can do for the test run is disable it by calling close(). - """ - - def __init__(self, raise_on_events=None, exc_type=RuntimeError): - self.raise_on_events = raise_on_events or () - self.exc_type = exc_type - self.seen = [] - self.closed = False - - def __enter__(self, *a): - sys.addaudithook(self) - return self - - def __exit__(self, *a): - self.close() - - def close(self): - self.closed = True - - @property - def seen_events(self): - return [i[0] for i in self.seen] - - def __call__(self, event, args): - if self.closed: - return - self.seen.append((event, args)) - if event in self.raise_on_events: - raise self.exc_type("saw event " + event) - - -class TestFinalizeHook: - """Used in the test_finalize_hooks function to ensure that hooks - are correctly cleaned up, that they are notified about the cleanup, - and are unable to prevent it. - """ - - def __init__(self): - print("Created", id(self), file=sys.stderr, flush=True) - - def __call__(self, event, args): - # Avoid recursion when we call id() below - if event == "builtins.id": - return - - print(event, id(self), file=sys.stderr, flush=True) - - if event == "cpython._PySys_ClearAuditHooks": - raise RuntimeError("Should be ignored") - elif event == "cpython.PyInterpreterState_Clear": - raise RuntimeError("Should be ignored") - - -def run_finalize_test(): - """Called by test_finalize_hooks in a subprocess.""" - sys.addaudithook(TestFinalizeHook()) +AUDIT_TESTS_PY = support.findfile("audit-tests.py") class AuditTest(unittest.TestCase): + def do_test(self, *args): + with subprocess.Popen( + [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args], + encoding="utf-8", + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) as p: + p.wait() + sys.stdout.writelines(p.stdout) + sys.stderr.writelines(p.stderr) + if p.returncode: + self.fail(''.join(p.stderr)) + def test_basic(self): - with TestHook() as hook: - sys.audit("test_event", 1, 2, 3) - self.assertEqual(hook.seen[0][0], "test_event") - self.assertEqual(hook.seen[0][1], (1, 2, 3)) + self.do_test("test_basic") def test_block_add_hook(self): - # Raising an exception should prevent a new hook from being added, - # but will not propagate out. - with TestHook(raise_on_events="sys.addaudithook") as hook1: - with TestHook() as hook2: - sys.audit("test_event") - self.assertIn("test_event", hook1.seen_events) - self.assertNotIn("test_event", hook2.seen_events) + self.do_test("test_block_add_hook") def test_block_add_hook_baseexception(self): - # Raising BaseException will propagate out when adding a hook - with self.assertRaises(BaseException): - with TestHook( - raise_on_events="sys.addaudithook", exc_type=BaseException - ) as hook1: - # Adding this next hook should raise BaseException - with TestHook() as hook2: - pass + self.do_test("test_block_add_hook_baseexception") def test_finalize_hooks(self): events = [] with subprocess.Popen( - [ - sys.executable, - "-c", - "import test.test_audit; test.test_audit.run_finalize_test()", - ], + [sys.executable, "-X utf8", AUDIT_TESTS_PY, "test_finalize_hooks"], encoding="utf-8", stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) as p: p.wait() - for line in p.stderr: + for line in p.stdout: events.append(line.strip().partition(" ")) + sys.stderr.writelines(p.stderr) + if p.returncode: + self.fail(''.join(p.stderr)) + firstId = events[0][2] self.assertSequenceEqual( [ @@ -125,136 +61,19 @@ def test_finalize_hooks(self): ) def test_pickle(self): - pickle = support.import_module("pickle") + support.import_module("pickle") - class PicklePrint: - def __reduce_ex__(self, p): - return str, ("Pwned!",) - - payload_1 = pickle.dumps(PicklePrint()) - payload_2 = pickle.dumps(("a", "b", "c", 1, 2, 3)) - - # Before we add the hook, ensure our malicious pickle loads - self.assertEqual("Pwned!", pickle.loads(payload_1)) - - with TestHook(raise_on_events="pickle.find_class") as hook: - with self.assertRaises(RuntimeError): - # With the hook enabled, loading globals is not allowed - pickle.loads(payload_1) - # pickles with no globals are okay - pickle.loads(payload_2) + self.do_test("test_pickle") def test_monkeypatch(self): - class A: - pass - - class B: - pass - - class C(A): - pass - - a = A() - - with TestHook() as hook: - # Catch name changes - C.__name__ = "X" - # Catch type changes - C.__bases__ = (B,) - # Ensure bypassing __setattr__ is still caught - type.__dict__["__bases__"].__set__(C, (B,)) - # Catch attribute replacement - C.__init__ = B.__init__ - # Catch attribute addition - C.new_attr = 123 - # Catch class changes - a.__class__ = B - - actual = [(a[0], a[1]) for e, a in hook.seen if e == "object.__setattr__"] - self.assertSequenceEqual( - [(C, "__name__"), (C, "__bases__"), (C, "__bases__"), (a, "__class__")], - actual, - ) + self.do_test("test_monkeypatch") def test_open(self): - # SSLContext.load_dh_params uses _Py_fopen_obj rather than normal open() - try: - import ssl - - load_dh_params = ssl.create_default_context().load_dh_params - except ImportError: - load_dh_params = None - - # Try a range of "open" functions. - # All of them should fail - with TestHook(raise_on_events={"open"}) as hook: - for fn, *args in [ - (open, support.TESTFN, "r"), - (open, sys.executable, "rb"), - (open, 3, "wb"), - (open, support.TESTFN, "w", -1, None, None, None, False, lambda *a: 1), - (load_dh_params, support.TESTFN), - ]: - if not fn: - continue - self.assertRaises(RuntimeError, fn, *args) - - actual_mode = [(a[0], a[1]) for e, a in hook.seen if e == "open" and a[1]] - actual_flag = [(a[0], a[2]) for e, a in hook.seen if e == "open" and not a[1]] - self.assertSequenceEqual( - [ - i - for i in [ - (support.TESTFN, "r"), - (sys.executable, "r"), - (3, "w"), - (support.TESTFN, "w"), - (support.TESTFN, "rb") if load_dh_params else None, - ] - if i is not None - ], - actual_mode, - ) - self.assertSequenceEqual([], actual_flag) + self.do_test("test_open", support.TESTFN) def test_cantrace(self): - traced = [] - - def trace(frame, event, *args): - if frame.f_code == TestHook.__call__.__code__: - traced.append(event) - - old = sys.settrace(trace) - try: - with TestHook() as hook: - # No traced call - eval("1") - - # No traced call - hook.__cantrace__ = False - eval("2") - - # One traced call - hook.__cantrace__ = True - eval("3") - - # Two traced calls (writing to private member, eval) - hook.__cantrace__ = 1 - eval("4") - - # One traced call (writing to private member) - hook.__cantrace__ = 0 - finally: - sys.settrace(old) - - self.assertSequenceEqual(["call"] * 4, traced) + self.do_test("test_cantrace") if __name__ == "__main__": - if len(sys.argv) >= 2 and sys.argv[1] == "spython_test": - # Doesn't matter what we add - it will be blocked - sys.addaudithook(None) - - sys.exit(0) - unittest.main() From webhook-mailer at python.org Wed May 29 11:45:25 2019 From: webhook-mailer at python.org (Christian Heimes) Date: Wed, 29 May 2019 15:45:25 -0000 Subject: [Python-checkins] Add my to code owner for more areas (#13650) Message-ID: https://github.com/python/cpython/commit/1c999262281c4a946c49614c3f8549f68049c0d9 commit: 1c999262281c4a946c49614c3f8549f68049c0d9 branch: master author: Christian Heimes committer: GitHub date: 2019-05-29T17:45:19+02:00 summary: Add my to code owner for more areas (#13650) files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1638a8b4b443..6a4ca54dd34e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -14,8 +14,14 @@ Objects/dict* @methane # Hashing -**/*hashlib* @python/crypto-team -**/*pyhash* @python/crypto-team +**/*hashlib* @python/crypto-team @tiran +**/*pyhash* @python/crypto-team @tiran +**/*sha* @python/crypto-team @tiran +**/*md5* @python/crypto-team @tiran +**/*blake* @python/crypto-team @tiran +/Modules/_blake2/** @python/crypto-team @tiran +/Modules/_sha3/** @python/crypto-team @tiran + # HTML /Lib/html/ @ezio-melotti @@ -31,10 +37,11 @@ Objects/dict* @methane # SSL -**/*ssl* @python/crypto-team +**/*ssl* @python/crypto-team @tiran +**/*.pem @python/crypto-team @tiran # CSPRNG -Python/bootstrap_hash.c @python/crypto-team +Python/bootstrap_hash.c @python/crypto-team @tiran # Email and related **/*mail* @python/email-team @maxking From webhook-mailer at python.org Wed May 29 12:34:14 2019 From: webhook-mailer at python.org (Julien Palard) Date: Wed, 29 May 2019 16:34:14 -0000 Subject: [Python-checkins] Doc: Add an optional obsolete header. (GH-13638) Message-ID: https://github.com/python/cpython/commit/46ed90dd014010703c7a3b2a61c4927644fa8210 commit: 46ed90dd014010703c7a3b2a61c4927644fa8210 branch: master author: Julien Palard committer: GitHub date: 2019-05-29T18:34:04+02:00 summary: Doc: Add an optional obsolete header. (GH-13638) files: M Doc/README.rst M Doc/tools/templates/layout.html diff --git a/Doc/README.rst b/Doc/README.rst index 31f8a8b7f593..380ea4fa9b26 100644 --- a/Doc/README.rst +++ b/Doc/README.rst @@ -113,6 +113,15 @@ Then, from the ``Doc`` directory, run :: where ```` is one of html, text, latex, or htmlhelp (for explanations see the make targets above). +Deprecation header +================== + +You can define the ``outdated`` variable in ``html_context`` to show a +red banner on each page redirecting to the "latest" version. + +The link points to the same page on ``/3/``, sadly for the moment the +language is lost during the process. + Contributing ============ diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index c39922456140..a765a5de8a2d 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -1,5 +1,15 @@ {% extends "!layout.html" %} +{% block header %} +{%- if outdated %} +
    + {% trans %}This document is for an old version of Python that is no longer supported. + You should upgrade, and read the {% endtrans %} + {% trans %} Python documentation for the last stable release {% endtrans %}. +
    +{%- endif %} +{% endblock %} + {% block rootrellink %} {{ super() }}
  • From webhook-mailer at python.org Wed May 29 13:05:33 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 17:05:33 -0000 Subject: [Python-checkins] [2.7] bpo-33071: remove outdated PyPI docs (GH-13087) (GH-13584) Message-ID: https://github.com/python/cpython/commit/103b8d9f9179089019ddb363ec0098b63816001b commit: 103b8d9f9179089019ddb363ec0098b63816001b branch: 2.7 author: Hai Shi committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-29T10:05:26-07:00 summary: [2.7] bpo-33071: remove outdated PyPI docs (GH-13087) (GH-13584) Patch by Kojo Idrissa. (cherry picked from commit 1b4abcf302ff2c8f4d4881294510d48ba5186b53) Co-authored-by: Kojo Idrissa https://bugs.python.org/issue33071 files: M Doc/distutils/packageindex.rst M Doc/distutils/setupscript.rst diff --git a/Doc/distutils/packageindex.rst b/Doc/distutils/packageindex.rst index cd11f20df802..f74c4396e545 100644 --- a/Doc/distutils/packageindex.rst +++ b/Doc/distutils/packageindex.rst @@ -8,244 +8,10 @@ The Python Package Index (PyPI) ******************************* -The `Python Package Index (PyPI)`_ stores :ref:`meta-data ` -describing distributions packaged with distutils, as well as package data like -distribution files if a package author wishes. - -Distutils provides the :command:`register` and :command:`upload` commands for -pushing meta-data and distribution files to PyPI, respectively. See -:ref:`package-commands` for information on these commands. - - -PyPI overview -============= - -PyPI lets you submit any number of versions of your distribution to the index. -If you alter the meta-data for a particular version, you can submit it again -and the index will be updated. - -PyPI holds a record for each (name, version) combination submitted. The first -user to submit information for a given name is designated the Owner of that -name. Changes can be submitted through the :command:`register` command or -through the web interface. Owners can designate other users as Owners or -Maintainers. Maintainers can edit the package information, but not designate -new Owners or Maintainers. - -By default PyPI displays only the newest version of a given package. The web -interface lets one change this default behavior and manually select which -versions to display and hide. - -For each version, PyPI displays a home page. The home page is created from -the ``long_description`` which can be submitted via the :command:`register` -command. See :ref:`package-display` for more information. - - -.. _package-commands: - -Distutils commands -================== - -Distutils exposes two commands for submitting package data to PyPI: the -:ref:`register ` command for submitting meta-data to PyPI -and the :ref:`upload ` command for submitting distribution -files. Both commands read configuration data from a special file called a -:ref:`.pypirc file `. - - -.. _package-register: - -The ``register`` command ------------------------- - -The distutils command :command:`register` is used to submit your distribution's -meta-data to an index server. It is invoked as follows:: - - python setup.py register - -Distutils will respond with the following prompt:: - - running register - We need to know who you are, so please choose either: - 1. use your existing login, - 2. register as a new user, - 3. have the server generate a new password for you (and email it to you), or - 4. quit - Your selection [default 1]: - -Note: if your username and password are saved locally, you will not see this -menu. Also, refer to :ref:`pypirc` for how to store your credentials in a -:file:`.pypirc` file. - -If you have not registered with PyPI, then you will need to do so now. You -should choose option 2, and enter your details as required. Soon after -submitting your details, you will receive an email which will be used to confirm -your registration. - -Once you are registered, you may choose option 1 from the menu. You will be -prompted for your PyPI username and password, and :command:`register` will then -submit your meta-data to the index. - -See :ref:`package-cmdoptions` for options to the :command:`register` command. - - -.. _package-upload: - -The ``upload`` command ----------------------- - -.. versionadded:: 2.5 - -The distutils command :command:`upload` pushes the distribution files to PyPI. - -The command is invoked immediately after building one or more distribution -files. For example, the command :: - - python setup.py sdist bdist_wininst upload - -will cause the source distribution and the Windows installer to be uploaded to -PyPI. Note that these will be uploaded even if they are built using an earlier -invocation of :file:`setup.py`, but that only distributions named on the command -line for the invocation including the :command:`upload` command are uploaded. - -If a :command:`register` command was previously called in the same command, -and if the password was entered in the prompt, :command:`upload` will reuse the -entered password. This is useful if you do not want to store a password in -clear text in a :file:`.pypirc` file. - -You can use the ``--sign`` option to tell :command:`upload` to sign each -uploaded file using GPG (GNU Privacy Guard). The :program:`gpg` program must -be available for execution on the system :envvar:`PATH`. You can also specify -which key to use for signing using the ``--identity=name`` option. - -See :ref:`package-cmdoptions` for additional options to the :command:`upload` -command. - - -.. _package-cmdoptions: - -Additional command options --------------------------- - -This section describes options common to both the :command:`register` and -:command:`upload` commands. - -The ``--repository`` or ``-r`` option lets you specify a PyPI server -different from the default. For example:: - - python setup.py sdist bdist_wininst upload -r https://example.com/pypi - -For convenience, a name can be used in place of the URL when the -:file:`.pypirc` file is configured to do so. For example:: - - python setup.py register -r other - -See :ref:`pypirc` for more information on defining alternate servers. - -The ``--show-response`` option displays the full response text from the PyPI -server, which is useful when debugging problems with registering and uploading. - - -.. index:: - single: .pypirc file - single: Python Package Index (PyPI); .pypirc file - -.. _pypirc: - -The ``.pypirc`` file --------------------- - -The :command:`register` and :command:`upload` commands both check for the -existence of a :file:`.pypirc` file at the location :file:`$HOME/.pypirc`. -If this file exists, the command uses the username, password, and repository -URL configured in the file. The format of a :file:`.pypirc` file is as -follows:: - - [distutils] - index-servers = - pypi - - [pypi] - repository: - username: - password: - -The *distutils* section defines an *index-servers* variable that lists the -name of all sections describing a repository. - -Each section describing a repository defines three variables: - -- *repository*, that defines the url of the PyPI server. Defaults to - ``https://www.python.org/pypi``. -- *username*, which is the registered username on the PyPI server. -- *password*, that will be used to authenticate. If omitted the user - will be prompt to type it when needed. - -If you want to define another server a new section can be created and -listed in the *index-servers* variable:: - - [distutils] - index-servers = - pypi - other - - [pypi] - repository: - username: - password: - - [other] - repository: https://example.com/pypi - username: - password: - -This allows the :command:`register` and :command:`upload` commands to be -called with the ``--repository`` option as described in -:ref:`package-cmdoptions`. - -Specifically, you might want to add the `PyPI Test Repository -`_ to your ``.pypirc`` to facilitate -testing before doing your first upload to ``PyPI`` itself. - - -.. _package-display: - -PyPI package display -==================== - -The ``long_description`` field plays a special role at PyPI. It is used by -the server to display a home page for the registered package. - -If you use the `reStructuredText `_ -syntax for this field, PyPI will parse it and display an HTML output for -the package home page. - -The ``long_description`` field can be attached to a text file located -in the package:: - - from distutils.core import setup - - with open('README.txt') as file: - long_description = file.read() - - setup(name='Distutils', - long_description=long_description) - -In that case, :file:`README.txt` is a regular reStructuredText text file located -in the root of the package besides :file:`setup.py`. - -To prevent registering broken reStructuredText content, you can use the -:program:`rst2html` program that is provided by the :mod:`docutils` package and -check the ``long_description`` from the command line: - -.. code-block:: shell-session - - $ python setup.py --long-description | rst2html.py > output.html - -:mod:`docutils` will display a warning if there's something wrong with your -syntax. Because PyPI applies additional checks (e.g. by passing ``--no-raw`` -to ``rst2html.py`` in the command above), being able to run the command above -without warnings does not guarantee that PyPI will convert the content -successfully. +The `Python Package Index (PyPI)`_ stores metadata describing distributions +packaged with distutils and other publishing tools, as well the distribution +archives themselves. +Detailed instructions on using PyPI at :ref:`distributing-index`. .. _Python Package Index (PyPI): https://pypi.org diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst index 8407206a08b5..fae570f9beb9 100644 --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -612,9 +612,8 @@ Notes: `_. (5) - The ``long_description`` field is used by PyPI when you are - :ref:`registering ` a package, to - :ref:`build its home page `. + The ``long_description`` field is used by PyPI when you publish a package, + to build its project page. (6) The ``license`` field is a text indicating the license covering the From webhook-mailer at python.org Wed May 29 13:08:21 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 17:08:21 -0000 Subject: [Python-checkins] bpo-36794: Document that Lock.acquire is fair. (GH-13082) Message-ID: https://github.com/python/cpython/commit/34f4f5efea730504216ee19f237734e0bb0104ee commit: 34f4f5efea730504216ee19f237734e0bb0104ee branch: master author: Hrvoje Nik?i? committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-29T10:08:17-07:00 summary: bpo-36794: Document that Lock.acquire is fair. (GH-13082) https://bugs.python.org/issue36794 files: M Doc/library/asyncio-sync.rst diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index e3f18ccb4341..79f6b02d85e2 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -66,6 +66,13 @@ Lock This method waits until the lock is *unlocked*, sets it to *locked* and returns ``True``. + When more than one coroutine is blocked in :meth:`acquire` + waiting for the lock to be unlocked, only one coroutine + eventually proceeds. + + Acquiring a lock is *fair*: the coroutine that proceeds will be + the first coroutine that started waiting on the lock. + .. method:: release() Release the lock. From webhook-mailer at python.org Wed May 29 14:20:01 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 18:20:01 -0000 Subject: [Python-checkins] bpo-36983: Fix typing.__all__ and add test for exported names (GH-13456) Message-ID: https://github.com/python/cpython/commit/d30da5dd9a8a965cf24a22bbaff8a5b1341c2944 commit: d30da5dd9a8a965cf24a22bbaff8a5b1341c2944 branch: master author: Anthony Sottile committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-29T11:19:37-07:00 summary: bpo-36983: Fix typing.__all__ and add test for exported names (GH-13456) https://bugs.python.org/issue36983 files: A Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 2b4b934d69f2..f9c18c84c8f9 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3605,6 +3605,30 @@ def test_all(self): self.assertIn('SupportsBytes', a) self.assertIn('SupportsComplex', a) + def test_all_exported_names(self): + import typing + + actual_all = set(typing.__all__) + computed_all = { + k for k, v in vars(typing).items() + # explicitly exported, not a thing with __module__ + if k in actual_all or ( + # avoid private names + not k.startswith('_') and + # avoid things in the io / re typing submodules + k not in typing.io.__all__ and + k not in typing.re.__all__ and + k not in {'io', 're'} and + # there's a few types and metaclasses that aren't exported + not k.endswith(('Meta', '_contra', '_co')) and + not k.upper() == k and + # but export all things that have __module__ == 'typing' + getattr(v, '__module__', None) == typing.__name__ + ) + } + self.assertSetEqual(computed_all, actual_all) + + if __name__ == '__main__': main() diff --git a/Lib/typing.py b/Lib/typing.py index 14bd06b2b745..3b4e9df0482e 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -35,6 +35,7 @@ 'Callable', 'ClassVar', 'Final', + 'ForwardRef', 'Generic', 'Literal', 'Optional', @@ -81,11 +82,13 @@ 'SupportsRound', # Concrete collection types. + 'ChainMap', 'Counter', 'Deque', 'Dict', 'DefaultDict', 'List', + 'OrderedDict', 'Set', 'FrozenSet', 'NamedTuple', # Not really a type. diff --git a/Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst b/Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst new file mode 100644 index 000000000000..bd2d91ad9234 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst @@ -0,0 +1,2 @@ +Add missing names to ``typing.__all__``: ``ChainMap``, ``ForwardRef``, +``OrderedDict`` - by Anthony Sottile. From webhook-mailer at python.org Wed May 29 14:24:41 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 18:24:41 -0000 Subject: [Python-checkins] bpo-36794: Document that Lock.acquire is fair. (GH-13082) Message-ID: https://github.com/python/cpython/commit/4e1e887203ef069bf293ecabd945f7567d6a4879 commit: 4e1e887203ef069bf293ecabd945f7567d6a4879 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-29T11:24:32-07:00 summary: bpo-36794: Document that Lock.acquire is fair. (GH-13082) https://bugs.python.org/issue36794 (cherry picked from commit 34f4f5efea730504216ee19f237734e0bb0104ee) Co-authored-by: Hrvoje Nik?i? files: M Doc/library/asyncio-sync.rst diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index 291310d71414..993bd13fb030 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -66,6 +66,13 @@ Lock This method waits until the lock is *unlocked*, sets it to *locked* and returns ``True``. + When more than one coroutine is blocked in :meth:`acquire` + waiting for the lock to be unlocked, only one coroutine + eventually proceeds. + + Acquiring a lock is *fair*: the coroutine that proceeds will be + the first coroutine that started waiting on the lock. + .. method:: release() Release the lock. From webhook-mailer at python.org Wed May 29 14:31:59 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Wed, 29 May 2019 18:31:59 -0000 Subject: [Python-checkins] bpo-36974: implement PEP 590 (GH-13185) Message-ID: https://github.com/python/cpython/commit/aacc77fbd77640a8f03638216fa09372cc21673d commit: aacc77fbd77640a8f03638216fa09372cc21673d branch: master author: Jeroen Demeyer committer: Petr Viktorin date: 2019-05-29T20:31:52+02:00 summary: bpo-36974: implement PEP 590 (GH-13185) Co-authored-by: Jeroen Demeyer Co-authored-by: Mark Shannon files: A Misc/NEWS.d/next/C API/2019-05-22-15-24-08.bpo-36974.TkySRe.rst M Include/classobject.h M Include/cpython/abstract.h M Include/cpython/object.h M Include/descrobject.h M Include/funcobject.h M Include/methodobject.h M Include/object.h M Lib/test/test_call.py M Lib/test/test_capi.py M Lib/test/test_sys.py M Modules/_asynciomodule.c M Modules/_testcapimodule.c M Objects/call.c M Objects/classobject.c M Objects/descrobject.c M Objects/funcobject.c M Objects/methodobject.c M Python/bltinmodule.c M Python/ceval.c M Python/context.c M Python/sysmodule.c diff --git a/Include/classobject.h b/Include/classobject.h index 209f0f4a2843..c83303c39005 100644 --- a/Include/classobject.h +++ b/Include/classobject.h @@ -14,6 +14,7 @@ typedef struct { PyObject *im_func; /* The callable object implementing the method */ PyObject *im_self; /* The instance it is bound to */ PyObject *im_weakreflist; /* List of weak references */ + vectorcallfunc vectorcall; } PyMethodObject; PyAPI_DATA(PyTypeObject) PyMethod_Type; diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index b8b2d449faf3..7099178f8208 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -47,7 +47,7 @@ PyAPI_FUNC(int) _PyStack_UnpackDict( /* Suggested size (number of positional arguments) for arrays of PyObject* allocated on a C stack to avoid allocating memory on the heap memory. Such array is used to pass positional arguments to call functions of the - _PyObject_FastCall() family. + _PyObject_Vectorcall() family. The size is chosen to not abuse the C stack and so limit the risk of stack overflow. The size is also chosen to allow using the small stack for most @@ -56,50 +56,103 @@ PyAPI_FUNC(int) _PyStack_UnpackDict( #define _PY_FASTCALL_SMALL_STACK 5 /* Return 1 if callable supports FASTCALL calling convention for positional - arguments: see _PyObject_FastCallDict() and _PyObject_FastCallKeywords() */ + arguments: see _PyObject_Vectorcall() and _PyObject_FastCallDict() */ PyAPI_FUNC(int) _PyObject_HasFastCall(PyObject *callable); -/* Call the callable object 'callable' with the "fast call" calling convention: - args is a C array for positional arguments (nargs is the number of - positional arguments), kwargs is a dictionary for keyword arguments. +PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *callable, + PyObject *result, + const char *where); - If nargs is equal to zero, args can be NULL. kwargs can be NULL. - nargs must be greater or equal to zero. +/* === Vectorcall protocol (PEP 590) ============================= */ - Return the result on success. Raise an exception and return NULL on - error. */ -PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( +/* Call callable using tp_call. Arguments are like _PyObject_Vectorcall() + or _PyObject_FastCallDict() (both forms are supported), + except that nargs is plainly the number of arguments without flags. */ +PyAPI_FUNC(PyObject *) _PyObject_MakeTpCall( PyObject *callable, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs); + PyObject *const *args, Py_ssize_t nargs, + PyObject *keywords); -/* Call the callable object 'callable' with the "fast call" calling convention: - args is a C array for positional arguments followed by values of - keyword arguments. Keys of keyword arguments are stored as a tuple - of strings in kwnames. nargs is the number of positional parameters at - the beginning of stack. The size of kwnames gives the number of keyword - values in the stack after positional arguments. +#define PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) - kwnames must only contains str strings, no subclass, and all keys must - be unique. +static inline Py_ssize_t +PyVectorcall_NARGS(size_t n) +{ + return n & ~PY_VECTORCALL_ARGUMENTS_OFFSET; +} + +static inline vectorcallfunc +_PyVectorcall_Function(PyObject *callable) +{ + PyTypeObject *tp = Py_TYPE(callable); + if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) { + return NULL; + } + assert(PyCallable_Check(callable)); + Py_ssize_t offset = tp->tp_vectorcall_offset; + assert(offset > 0); + vectorcallfunc *ptr = (vectorcallfunc *)(((char *)callable) + offset); + return *ptr; +} + +/* Call the callable object 'callable' with the "vectorcall" calling + convention. + + args is a C array for positional arguments. + + nargsf is the number of positional arguments plus optionally the flag + PY_VECTORCALL_ARGUMENTS_OFFSET which means that the caller is allowed to + modify args[-1]. - If nargs is equal to zero and there is no keyword argument (kwnames is - NULL or its size is zero), args can be NULL. + kwnames is a tuple of keyword names. The values of the keyword arguments + are stored in "args" after the positional arguments (note that the number + of keyword arguments does not change nargsf). kwnames can also be NULL if + there are no keyword arguments. + + keywords must only contains str strings (no subclass), and all keys must + be unique. Return the result on success. Raise an exception and return NULL on error. */ -PyAPI_FUNC(PyObject *) _PyObject_FastCallKeywords( +static inline PyObject * +_PyObject_Vectorcall(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + assert(kwnames == NULL || PyTuple_Check(kwnames)); + assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0); + vectorcallfunc func = _PyVectorcall_Function(callable); + if (func == NULL) { + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + return _PyObject_MakeTpCall(callable, args, nargs, kwnames); + } + PyObject *res = func(callable, args, nargsf, kwnames); + return _Py_CheckFunctionResult(callable, res, NULL); +} + +/* Same as _PyObject_Vectorcall except that keyword arguments are passed as + dict, which may be NULL if there are no keyword arguments. */ +PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( PyObject *callable, PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwnames); + size_t nargsf, + PyObject *kwargs); -#define _PyObject_FastCall(func, args, nargs) \ - _PyObject_FastCallDict((func), (args), (nargs), NULL) +/* Call "callable" (which must support vectorcall) with positional arguments + "tuple" and keyword arguments "dict". "dict" may also be NULL */ +PyAPI_FUNC(PyObject *) PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict); -#define _PyObject_CallNoArg(func) \ - _PyObject_FastCallDict((func), NULL, 0, NULL) +/* Same as _PyObject_Vectorcall except without keyword arguments */ +static inline PyObject * +_PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) +{ + return _PyObject_Vectorcall(func, args, (size_t)nargs, NULL); +} + +/* Call a callable without any arguments */ +static inline PyObject * +_PyObject_CallNoArg(PyObject *func) { + return _PyObject_Vectorcall(func, NULL, 0, NULL); +} PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( PyObject *callable, @@ -113,10 +166,6 @@ PyAPI_FUNC(PyObject *) _PyObject_FastCall_Prepend( PyObject *const *args, Py_ssize_t nargs); -PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *callable, - PyObject *result, - const char *where); - /* Like PyObject_CallMethod(), but expect a _Py_Identifier* as the method name. */ PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj, diff --git a/Include/cpython/object.h b/Include/cpython/object.h index ba52a4835823..a65aaf648215 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -55,6 +55,9 @@ typedef struct bufferinfo { typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); typedef void (*releasebufferproc)(PyObject *, Py_buffer *); +typedef PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + /* Maximum number of dimensions */ #define PyBUF_MAX_NDIM 64 @@ -167,12 +170,9 @@ typedef struct { releasebufferproc bf_releasebuffer; } PyBufferProcs; -/* We can't provide a full compile-time check that limited-API - users won't implement tp_print. However, not defining printfunc - and making tp_print of a different function pointer type - if Py_LIMITED_API is set should at least cause a warning - in most cases. */ -typedef int (*printfunc)(PyObject *, FILE *, int); +/* Allow printfunc in the tp_vectorcall_offset slot for + * backwards-compatibility */ +typedef Py_ssize_t printfunc; typedef struct _typeobject { PyObject_VAR_HEAD @@ -182,7 +182,7 @@ typedef struct _typeobject { /* Methods to implement standard operations */ destructor tp_dealloc; - printfunc tp_print; + Py_ssize_t tp_vectorcall_offset; getattrfunc tp_getattr; setattrfunc tp_setattr; PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2) @@ -254,6 +254,7 @@ typedef struct _typeobject { unsigned int tp_version_tag; destructor tp_finalize; + vectorcallfunc tp_vectorcall; #ifdef COUNT_ALLOCS /* these must be last and never explicitly initialized */ diff --git a/Include/descrobject.h b/Include/descrobject.h index 73bbb3fe54e5..3db09635399c 100644 --- a/Include/descrobject.h +++ b/Include/descrobject.h @@ -53,6 +53,7 @@ typedef struct { typedef struct { PyDescr_COMMON; PyMethodDef *d_method; + vectorcallfunc vectorcall; } PyMethodDescrObject; typedef struct { @@ -92,7 +93,7 @@ PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) _PyMethodDescr_FastCallKeywords( - PyObject *descrobj, PyObject *const *stack, Py_ssize_t nargs, PyObject *kwnames); + PyObject *descrobj, PyObject *const *args, size_t nargsf, PyObject *kwnames); PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, struct wrapperbase *, void *); #define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL) diff --git a/Include/funcobject.h b/Include/funcobject.h index 86674ac90a08..7ba000e1f13c 100644 --- a/Include/funcobject.h +++ b/Include/funcobject.h @@ -32,6 +32,7 @@ typedef struct { PyObject *func_module; /* The __module__ attribute, can be anything */ PyObject *func_annotations; /* Annotations, a dict or NULL */ PyObject *func_qualname; /* The qualified name */ + vectorcallfunc vectorcall; /* Invariant: * func_closure contains the bindings for func_code->co_freevars, so @@ -68,7 +69,7 @@ PyAPI_FUNC(PyObject *) _PyFunction_FastCallDict( PyAPI_FUNC(PyObject *) _PyFunction_FastCallKeywords( PyObject *func, PyObject *const *stack, - Py_ssize_t nargs, + size_t nargsf, PyObject *kwnames); #endif diff --git a/Include/methodobject.h b/Include/methodobject.h index ea35d86bcd17..5dbe2145dadc 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -49,7 +49,7 @@ PyAPI_FUNC(PyObject *) _PyCFunction_FastCallDict(PyObject *func, PyAPI_FUNC(PyObject *) _PyCFunction_FastCallKeywords(PyObject *func, PyObject *const *stack, - Py_ssize_t nargs, + size_t nargsf, PyObject *kwnames); #endif @@ -105,6 +105,7 @@ typedef struct { PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ PyObject *m_module; /* The __module__ attribute, can be anything */ PyObject *m_weakreflist; /* List of weak references */ + vectorcallfunc vectorcall; } PyCFunctionObject; PyAPI_FUNC(PyObject *) _PyMethodDef_RawFastCallDict( diff --git a/Include/object.h b/Include/object.h index d5d98d3bd885..11ba2bb8e238 100644 --- a/Include/object.h +++ b/Include/object.h @@ -291,6 +291,11 @@ given type object has a specified feature. /* Set if the type allows subclassing */ #define Py_TPFLAGS_BASETYPE (1UL << 10) +/* Set if the type implements the vectorcall protocol (PEP 590) */ +#ifndef Py_LIMITED_API +#define _Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11) +#endif + /* Set if the type is 'ready' -- fully initialized */ #define Py_TPFLAGS_READY (1UL << 12) diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index e4ab33cbc16b..9f0a75b84a03 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -402,7 +402,7 @@ def test_fastcall(self): result = _testcapi.pyobject_fastcall(func, None) self.check_result(result, expected) - def test_fastcall_dict(self): + def test_vectorcall_dict(self): # Test _PyObject_FastCallDict() for func, args, expected in self.CALLS_POSARGS: @@ -429,33 +429,33 @@ def test_fastcall_dict(self): result = _testcapi.pyobject_fastcalldict(func, args, kwargs) self.check_result(result, expected) - def test_fastcall_keywords(self): - # Test _PyObject_FastCallKeywords() + def test_vectorcall(self): + # Test _PyObject_Vectorcall() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): # kwnames=NULL - result = _testcapi.pyobject_fastcallkeywords(func, args, None) + result = _testcapi.pyobject_vectorcall(func, args, None) self.check_result(result, expected) # kwnames=() - result = _testcapi.pyobject_fastcallkeywords(func, args, ()) + result = _testcapi.pyobject_vectorcall(func, args, ()) self.check_result(result, expected) if not args: # kwnames=NULL - result = _testcapi.pyobject_fastcallkeywords(func, None, None) + result = _testcapi.pyobject_vectorcall(func, None, None) self.check_result(result, expected) # kwnames=() - result = _testcapi.pyobject_fastcallkeywords(func, None, ()) + result = _testcapi.pyobject_vectorcall(func, None, ()) self.check_result(result, expected) for func, args, kwargs, expected in self.CALLS_KWARGS: with self.subTest(func=func, args=args, kwargs=kwargs): kwnames = tuple(kwargs.keys()) args = args + tuple(kwargs.values()) - result = _testcapi.pyobject_fastcallkeywords(func, args, kwnames) + result = _testcapi.pyobject_vectorcall(func, args, kwnames) self.check_result(result, expected) def test_fastcall_clearing_dict(self): diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index f3d41a20ab05..0813abb9a697 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -34,6 +34,11 @@ def testfunction(self): """some doc""" return self +def testfunction_kw(self, *, kw): + """some doc""" + return self + + class InstanceMethod: id = _testcapi.instancemethod(id) testfunction = _testcapi.instancemethod(testfunction) @@ -479,6 +484,48 @@ class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): pass self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + def test_vectorcall(self): + # Test a bunch of different ways to call objects: + # 1. normal call + # 2. vectorcall using _PyObject_Vectorcall() + # 3. vectorcall using PyVectorcall_Call() + # 4. call as bound method + # 5. call using functools.partial + + # A list of (function, args, kwargs, result) calls to test + calls = [(len, (range(42),), {}, 42), + (list.append, ([], 0), {}, None), + ([].append, (0,), {}, None), + (sum, ([36],), {"start":6}, 42), + (testfunction, (42,), {}, 42), + (testfunction_kw, (42,), {"kw":None}, 42)] + + from _testcapi import pyobject_vectorcall, pyvectorcall_call + from types import MethodType + from functools import partial + + def vectorcall(func, args, kwargs): + args = *args, *kwargs.values() + kwnames = tuple(kwargs) + return pyobject_vectorcall(func, args, kwnames) + + for (func, args, kwargs, expected) in calls: + with self.subTest(str(func)): + args1 = args[1:] + meth = MethodType(func, args[0]) + wrapped = partial(func) + if not kwargs: + self.assertEqual(expected, func(*args)) + self.assertEqual(expected, pyobject_vectorcall(func, args, None)) + self.assertEqual(expected, pyvectorcall_call(func, args)) + self.assertEqual(expected, meth(*args1)) + self.assertEqual(expected, wrapped(*args)) + self.assertEqual(expected, func(*args, **kwargs)) + self.assertEqual(expected, vectorcall(func, args, kwargs)) + self.assertEqual(expected, pyvectorcall_call(func, args, kwargs)) + self.assertEqual(expected, meth(*args1, **kwargs)) + self.assertEqual(expected, wrapped(*args, **kwargs)) + class SubinterpreterTest(unittest.TestCase): diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index dfe63b1aade2..c558d116e6fe 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1064,7 +1064,7 @@ def test_objecttypes(self): # buffer # XXX # builtin_function_or_method - check(len, size('4P')) # XXX check layout + check(len, size('5P')) # bytearray samples = [b'', b'u'*100000] for sample in samples: @@ -1095,7 +1095,7 @@ def inner(): # complex check(complex(0,1), size('2d')) # method_descriptor (descriptor object) - check(str.lower, size('3PP')) + check(str.lower, size('3PPP')) # classmethod_descriptor (descriptor object) # XXX # member_descriptor (descriptor object) @@ -1164,7 +1164,7 @@ class C(object): pass check(x, vsize('5P2c4P3ic' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P')) # function def func(): pass - check(func, size('12P')) + check(func, size('13P')) class c(): @staticmethod def foo(): @@ -1259,7 +1259,7 @@ def delx(self): del self.__x check((1,2,3), vsize('') + 3*self.P) # type # static type: PyTypeObject - fmt = 'P2n15Pl4Pn9Pn11PIP' + fmt = 'P2nPI13Pl4Pn9Pn11PIPP' if hasattr(sys, 'getcounts'): fmt += '3n2P' s = vsize(fmt) diff --git a/Misc/NEWS.d/next/C API/2019-05-22-15-24-08.bpo-36974.TkySRe.rst b/Misc/NEWS.d/next/C API/2019-05-22-15-24-08.bpo-36974.TkySRe.rst new file mode 100644 index 000000000000..c51c2e2419d1 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-05-22-15-24-08.bpo-36974.TkySRe.rst @@ -0,0 +1,2 @@ +Implement :pep:`590`: Vectorcall: a fast calling protocol for CPython. +This is a new protocol to optimize calls of custom callable objects. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index ac15d0169b81..60136082a7ee 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -367,8 +367,7 @@ call_soon(PyObject *loop, PyObject *func, PyObject *arg, PyObject *ctx) } stack[nargs] = (PyObject *)ctx; - handle = _PyObject_FastCallKeywords( - callable, stack, nargs, context_kwname); + handle = _PyObject_Vectorcall(callable, stack, nargs, context_kwname); Py_DECREF(callable); } @@ -2805,8 +2804,7 @@ task_step_impl(TaskObj *task, PyObject *exc) PyObject *stack[2]; stack[0] = wrapper; stack[1] = (PyObject *)task->task_context; - res = _PyObject_FastCallKeywords( - add_cb, stack, 1, context_kwname); + res = _PyObject_Vectorcall(add_cb, stack, 1, context_kwname); Py_DECREF(add_cb); Py_DECREF(wrapper); if (res == NULL) { diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 8ba927039c27..f2f418c997ab 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4713,7 +4713,7 @@ test_pyobject_fastcalldict(PyObject *self, PyObject *args) static PyObject * -test_pyobject_fastcallkeywords(PyObject *self, PyObject *args) +test_pyobject_vectorcall(PyObject *self, PyObject *args) { PyObject *func, *func_args, *kwnames = NULL; PyObject **stack; @@ -4742,7 +4742,31 @@ test_pyobject_fastcallkeywords(PyObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple"); return NULL; } - return _PyObject_FastCallKeywords(func, stack, nargs, kwnames); + return _PyObject_Vectorcall(func, stack, nargs, kwnames); +} + + +static PyObject * +test_pyvectorcall_call(PyObject *self, PyObject *args) +{ + PyObject *func; + PyObject *argstuple; + PyObject *kwargs = NULL; + + if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) { + return NULL; + } + + if (!PyTuple_Check(argstuple)) { + PyErr_SetString(PyExc_TypeError, "args must be a tuple"); + return NULL; + } + if (kwargs != NULL && !PyDict_Check(kwargs)) { + PyErr_SetString(PyExc_TypeError, "kwargs must be a dict"); + return NULL; + } + + return PyVectorcall_Call(func, argstuple, kwargs); } @@ -5230,7 +5254,8 @@ static PyMethodDef TestMethods[] = { {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS}, {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS}, {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS}, - {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS}, + {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS}, + {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS}, {"stack_pointer", stack_pointer, METH_NOARGS}, #ifdef W_STOPCODE {"W_STOPCODE", py_w_stopcode, METH_VARARGS}, diff --git a/Objects/call.c b/Objects/call.c index b608492dd6be..183a5c2e5a24 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -5,6 +5,10 @@ #include "frameobject.h" +static PyObject * +cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs); + + int _PyObject_HasFastCall(PyObject *callable) { @@ -83,131 +87,132 @@ _Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where) /* --- Core PyObject call functions ------------------------------- */ PyObject * -_PyObject_FastCallDict(PyObject *callable, PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs) +_PyObject_FastCallDict(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwargs) { /* _PyObject_FastCallDict() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ assert(!PyErr_Occurred()); - assert(callable != NULL); + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); assert(nargs >= 0); assert(nargs == 0 || args != NULL); assert(kwargs == NULL || PyDict_Check(kwargs)); - if (PyFunction_Check(callable)) { - return _PyFunction_FastCallDict(callable, args, nargs, kwargs); + vectorcallfunc func = _PyVectorcall_Function(callable); + if (func == NULL) { + /* Use tp_call instead */ + return _PyObject_MakeTpCall(callable, args, nargs, kwargs); } - else if (PyCFunction_Check(callable)) { - return _PyCFunction_FastCallDict(callable, args, nargs, kwargs); + + PyObject *res; + if (kwargs == NULL) { + res = func(callable, args, nargsf, NULL); } else { - PyObject *argstuple, *result; - ternaryfunc call; - - /* Slow-path: build a temporary tuple */ - call = callable->ob_type->tp_call; - if (call == NULL) { - PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", - callable->ob_type->tp_name); - return NULL; - } - - argstuple = _PyTuple_FromArray(args, nargs); - if (argstuple == NULL) { + PyObject *kwnames; + PyObject *const *newargs; + if (_PyStack_UnpackDict(args, nargs, kwargs, &newargs, &kwnames) < 0) { return NULL; } - - if (Py_EnterRecursiveCall(" while calling a Python object")) { - Py_DECREF(argstuple); - return NULL; + res = func(callable, newargs, nargs, kwnames); + if (kwnames != NULL) { + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs; + for (i = 0; i < n; i++) { + Py_DECREF(newargs[i]); + } + PyMem_Free((PyObject **)newargs); + Py_DECREF(kwnames); } - - result = (*call)(callable, argstuple, kwargs); - - Py_LeaveRecursiveCall(); - Py_DECREF(argstuple); - - result = _Py_CheckFunctionResult(callable, result, NULL); - return result; } + return _Py_CheckFunctionResult(callable, res, NULL); } PyObject * -_PyObject_FastCallKeywords(PyObject *callable, PyObject *const *stack, Py_ssize_t nargs, - PyObject *kwnames) +_PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords) { - /* _PyObject_FastCallKeywords() must not be called with an exception set, - because it can clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); + /* Slow path: build a temporary tuple for positional arguments and a + * temporary dictionary for keyword arguments (if any) */ + ternaryfunc call = Py_TYPE(callable)->tp_call; + if (call == NULL) { + PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", + Py_TYPE(callable)->tp_name); + return NULL; + } assert(nargs >= 0); - assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); - - /* kwnames must only contains str strings, no subclass, and all keys must - be unique: these checks are implemented in Python/ceval.c and - _PyArg_ParseStackAndKeywords(). */ - - if (PyFunction_Check(callable)) { - return _PyFunction_FastCallKeywords(callable, stack, nargs, kwnames); + assert(nargs == 0 || args != NULL); + assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords)); + PyObject *argstuple = _PyTuple_FromArray(args, nargs); + if (argstuple == NULL) { + return NULL; } - if (PyCFunction_Check(callable)) { - return _PyCFunction_FastCallKeywords(callable, stack, nargs, kwnames); + + PyObject *kwdict; + if (keywords == NULL || PyDict_Check(keywords)) { + kwdict = keywords; } else { - /* Slow-path: build a temporary tuple for positional arguments and a - temporary dictionary for keyword arguments (if any) */ - - ternaryfunc call; - PyObject *argstuple; - PyObject *kwdict, *result; - Py_ssize_t nkwargs; - - nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); - assert((nargs == 0 && nkwargs == 0) || stack != NULL); - - call = callable->ob_type->tp_call; - if (call == NULL) { - PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", - callable->ob_type->tp_name); - return NULL; - } - - argstuple = _PyTuple_FromArray(stack, nargs); - if (argstuple == NULL) { - return NULL; - } - - if (nkwargs > 0) { - kwdict = _PyStack_AsDict(stack + nargs, kwnames); + if (PyTuple_GET_SIZE(keywords)) { + assert(args != NULL); + kwdict = _PyStack_AsDict(args + nargs, keywords); if (kwdict == NULL) { Py_DECREF(argstuple); return NULL; } } else { - kwdict = NULL; + keywords = kwdict = NULL; } + } - if (Py_EnterRecursiveCall(" while calling a Python object")) { - Py_DECREF(argstuple); - Py_XDECREF(kwdict); - return NULL; - } + PyObject *result = NULL; + if (Py_EnterRecursiveCall(" while calling a Python object") == 0) + { + result = call(callable, argstuple, kwdict); + Py_LeaveRecursiveCall(); + } - result = (*call)(callable, argstuple, kwdict); + Py_DECREF(argstuple); + if (kwdict != keywords) { + Py_DECREF(kwdict); + } - Py_LeaveRecursiveCall(); + result = _Py_CheckFunctionResult(callable, result, NULL); + return result; +} - Py_DECREF(argstuple); - Py_XDECREF(kwdict); - result = _Py_CheckFunctionResult(callable, result, NULL); - return result; +PyObject * +PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs) +{ + vectorcallfunc func = _PyVectorcall_Function(callable); + if (func == NULL) { + PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall", + Py_TYPE(callable)->tp_name); + return NULL; } + PyObject *const *args; + Py_ssize_t nargs = PyTuple_GET_SIZE(tuple); + PyObject *kwnames; + if (_PyStack_UnpackDict(_PyTuple_ITEMS(tuple), nargs, + kwargs, &args, &kwnames) < 0) { + return NULL; + } + PyObject *result = func(callable, args, nargs, kwnames); + if (kwnames != NULL) { + Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs; + for (i = 0; i < n; i++) { + Py_DECREF(args[i]); + } + PyMem_Free((PyObject **)args); + Py_DECREF(kwnames); + } + + return result; } @@ -224,14 +229,13 @@ PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) assert(PyTuple_Check(args)); assert(kwargs == NULL || PyDict_Check(kwargs)); - if (PyFunction_Check(callable)) { - return _PyFunction_FastCallDict(callable, - _PyTuple_ITEMS(args), - PyTuple_GET_SIZE(args), - kwargs); + if (_PyVectorcall_Function(callable) != NULL) { + return PyVectorcall_Call(callable, args, kwargs); } else if (PyCFunction_Check(callable)) { - return PyCFunction_Call(callable, args, kwargs); + /* This must be a METH_VARARGS function, otherwise we would be + * in the previous case */ + return cfunction_call_varargs(callable, args, kwargs); } else { call = callable->ob_type->tp_call; @@ -384,9 +388,10 @@ _PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs return result; } + PyObject * -_PyFunction_FastCallKeywords(PyObject *func, PyObject *const *stack, - Py_ssize_t nargs, PyObject *kwnames) +_PyFunction_FastCallKeywords(PyObject *func, PyObject* const* stack, + size_t nargsf, PyObject *kwnames) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); @@ -397,6 +402,7 @@ _PyFunction_FastCallKeywords(PyObject *func, PyObject *const *stack, Py_ssize_t nd; assert(PyFunction_Check(func)); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); assert(nargs >= 0); assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); assert((nargs == 0 && nkwargs == 0) || stack != NULL); @@ -725,13 +731,14 @@ _PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self, PyObject * _PyCFunction_FastCallKeywords(PyObject *func, - PyObject *const *args, Py_ssize_t nargs, + PyObject *const *args, size_t nargsf, PyObject *kwnames) { PyObject *result; assert(func != NULL); assert(PyCFunction_Check(func)); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); result = _PyMethodDef_RawFastCallKeywords(((PyCFunctionObject*)func)->m_ml, PyCFunction_GET_SELF(func), @@ -751,6 +758,7 @@ cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs) PyObject *self = PyCFunction_GET_SELF(func); PyObject *result; + assert(PyCFunction_GET_FLAGS(func) & METH_VARARGS); if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) { if (Py_EnterRecursiveCall(" while calling a Python object")) { return NULL; @@ -783,18 +791,12 @@ cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs) PyObject * PyCFunction_Call(PyObject *func, PyObject *args, PyObject *kwargs) { - /* first try METH_VARARGS to pass directly args tuple unchanged. - _PyMethodDef_RawFastCallDict() creates a new temporary tuple - for METH_VARARGS. */ + /* For METH_VARARGS, we cannot use vectorcall as the vectorcall pointer + * is NULL. This is intentional, since vectorcall would be slower. */ if (PyCFunction_GET_FLAGS(func) & METH_VARARGS) { return cfunction_call_varargs(func, args, kwargs); } - else { - return _PyCFunction_FastCallDict(func, - _PyTuple_ITEMS(args), - PyTuple_GET_SIZE(args), - kwargs); - } + return PyVectorcall_Call(func, args, kwargs); } diff --git a/Objects/classobject.c b/Objects/classobject.c index 1ee897847fb0..cfc24460a747 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -40,6 +40,45 @@ PyMethod_Self(PyObject *im) return ((PyMethodObject *)im)->im_self; } + +static PyObject * +method_vectorcall(PyObject *method, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + assert(Py_TYPE(method) == &PyMethod_Type); + PyObject *self, *func, *result; + self = PyMethod_GET_SELF(method); + func = PyMethod_GET_FUNCTION(method); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + + if (nargsf & PY_VECTORCALL_ARGUMENTS_OFFSET) { + /* PY_VECTORCALL_ARGUMENTS_OFFSET is set, so we are allowed to mutate the vector */ + PyObject **newargs = (PyObject**)args - 1; + nargs += 1; + PyObject *tmp = newargs[0]; + newargs[0] = self; + result = _PyObject_Vectorcall(func, newargs, nargs, kwnames); + newargs[0] = tmp; + } + else { + Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); + PyObject **newargs; + Py_ssize_t totalargs = nargs + nkwargs; + newargs = PyMem_Malloc((totalargs+1) * sizeof(PyObject *)); + if (newargs == NULL) { + PyErr_NoMemory(); + return NULL; + } + /* use borrowed references */ + newargs[0] = self; + memcpy(newargs + 1, args, totalargs * sizeof(PyObject *)); + result = _PyObject_Vectorcall(func, newargs, nargs+1, kwnames); + PyMem_Free(newargs); + } + return result; +} + + /* Method objects are used for bound instance methods returned by instancename.methodname. ClassName.methodname returns an ordinary function. @@ -69,6 +108,7 @@ PyMethod_New(PyObject *func, PyObject *self) im->im_func = func; Py_XINCREF(self); im->im_self = self; + im->vectorcall = method_vectorcall; _PyObject_GC_TRACK(im); return (PyObject *)im; } @@ -309,7 +349,7 @@ PyTypeObject PyMethod_Type = { sizeof(PyMethodObject), 0, (destructor)method_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + offsetof(PyMethodObject, vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ @@ -323,7 +363,8 @@ PyTypeObject PyMethod_Type = { method_getattro, /* tp_getattro */ PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ method_doc, /* tp_doc */ (traverseproc)method_traverse, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 6c99f9b211b9..759018503c65 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -265,13 +265,14 @@ methoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwargs) // same to methoddescr_call(), but use FASTCALL convention. PyObject * _PyMethodDescr_FastCallKeywords(PyObject *descrobj, - PyObject *const *args, Py_ssize_t nargs, + PyObject *const *args, size_t nargsf, PyObject *kwnames) { assert(Py_TYPE(descrobj) == &PyMethodDescr_Type); PyMethodDescrObject *descr = (PyMethodDescrObject *)descrobj; PyObject *self, *result; + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); /* Make sure that the first argument is acceptable as 'self' */ if (nargs < 1) { PyErr_Format(PyExc_TypeError, @@ -542,7 +543,7 @@ PyTypeObject PyMethodDescr_Type = { sizeof(PyMethodDescrObject), 0, (destructor)descr_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + offsetof(PyMethodDescrObject, vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ @@ -557,6 +558,7 @@ PyTypeObject PyMethodDescr_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + _Py_TPFLAGS_HAVE_VECTORCALL | Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ 0, /* tp_doc */ descr_traverse, /* tp_traverse */ @@ -752,8 +754,10 @@ PyDescr_NewMethod(PyTypeObject *type, PyMethodDef *method) descr = (PyMethodDescrObject *)descr_new(&PyMethodDescr_Type, type, method->ml_name); - if (descr != NULL) + if (descr != NULL) { descr->d_method = method; + descr->vectorcall = &_PyMethodDescr_FastCallKeywords; + } return (PyObject *)descr; } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index fb7abfacb2e4..2b1f42db746d 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -36,6 +36,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname op->func_defaults = NULL; /* No default arguments */ op->func_kwdefaults = NULL; /* No keyword only defaults */ op->func_closure = NULL; + op->vectorcall = _PyFunction_FastCallKeywords; consts = ((PyCodeObject *)code)->co_consts; if (PyTuple_Size(consts) >= 1) { @@ -649,7 +650,7 @@ PyTypeObject PyFunction_Type = { sizeof(PyFunctionObject), 0, (destructor)func_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + offsetof(PyFunctionObject, vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ @@ -664,6 +665,7 @@ PyTypeObject PyFunction_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + _Py_TPFLAGS_HAVE_VECTORCALL | Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ func_new__doc__, /* tp_doc */ (traverseproc)func_traverse, /* tp_traverse */ diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 9fed3fca99be..76497c93894a 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -46,6 +46,14 @@ PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) op->m_self = self; Py_XINCREF(module); op->m_module = module; + if (ml->ml_flags & METH_VARARGS) { + /* For METH_VARARGS functions, it's more efficient to use tp_call + * instead of vectorcall. */ + op->vectorcall = NULL; + } + else { + op->vectorcall = &_PyCFunction_FastCallKeywords; + } _PyObject_GC_TRACK(op); return (PyObject *)op; } @@ -264,7 +272,7 @@ PyTypeObject PyCFunction_Type = { sizeof(PyCFunctionObject), 0, (destructor)meth_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + offsetof(PyCFunctionObject, vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ @@ -278,7 +286,8 @@ PyTypeObject PyCFunction_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ 0, /* tp_doc */ (traverseproc)meth_traverse, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 065ad95c95b1..48dadcc9d496 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -483,7 +483,7 @@ builtin_breakpoint(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb return NULL; } Py_INCREF(hook); - PyObject *retval = _PyObject_FastCallKeywords(hook, args, nargs, keywords); + PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords); Py_DECREF(hook); return retval; } @@ -2231,7 +2231,7 @@ builtin_sorted(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject } assert(nargs >= 1); - v = _PyObject_FastCallKeywords(callable, args + 1, nargs - 1, kwnames); + v = _PyObject_Vectorcall(callable, args + 1, nargs - 1, kwnames); Py_DECREF(callable); if (v == NULL) { Py_DECREF(newlist); diff --git a/Python/ceval.c b/Python/ceval.c index 9263df9b8fc4..47baa4d03ed9 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4806,6 +4806,40 @@ if (tstate->use_tracing && tstate->c_profilefunc) { \ x = call; \ } + +static PyObject * +trace_call_function(PyThreadState *tstate, + PyObject *func, + PyObject **args, Py_ssize_t nargs, + PyObject *kwnames) +{ + PyObject *x; + if (PyCFunction_Check(func)) { + C_TRACE(x, _PyCFunction_FastCallKeywords(func, args, nargs, kwnames)); + return x; + } + else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) { + /* We need to create a temporary bound method as argument + for profiling. + + If nargs == 0, then this cannot work because we have no + "self". In any case, the call itself would raise + TypeError (foo needs an argument), so we just skip + profiling. */ + PyObject *self = args[0]; + func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self)); + if (func == NULL) { + return NULL; + } + C_TRACE(x, _PyCFunction_FastCallKeywords(func, + args+1, nargs-1, + kwnames)); + Py_DECREF(func); + return x; + } + return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); +} + /* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault() to reduce the stack consumption. */ Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION @@ -4818,63 +4852,11 @@ call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyO Py_ssize_t nargs = oparg - nkwargs; PyObject **stack = (*pp_stack) - nargs - nkwargs; - /* Always dispatch PyCFunction first, because these are - presumed to be the most frequent callable object. - */ - if (PyCFunction_Check(func)) { - C_TRACE(x, _PyCFunction_FastCallKeywords(func, stack, nargs, kwnames)); - } - else if (Py_TYPE(func) == &PyMethodDescr_Type) { - if (nargs > 0 && tstate->use_tracing) { - /* We need to create a temporary bound method as argument - for profiling. - - If nargs == 0, then this cannot work because we have no - "self". In any case, the call itself would raise - TypeError (foo needs an argument), so we just skip - profiling. */ - PyObject *self = stack[0]; - func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self)); - if (func != NULL) { - C_TRACE(x, _PyCFunction_FastCallKeywords(func, - stack+1, nargs-1, - kwnames)); - Py_DECREF(func); - } - else { - x = NULL; - } - } - else { - x = _PyMethodDescr_FastCallKeywords(func, stack, nargs, kwnames); - } + if (tstate->use_tracing) { + x = trace_call_function(tstate, func, stack, nargs, kwnames); } else { - if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) { - /* Optimize access to bound methods. Reuse the Python stack - to pass 'self' as the first argument, replace 'func' - with 'self'. It avoids the creation of a new temporary tuple - for arguments (to replace func with self) when the method uses - FASTCALL. */ - PyObject *self = PyMethod_GET_SELF(func); - Py_INCREF(self); - func = PyMethod_GET_FUNCTION(func); - Py_INCREF(func); - Py_SETREF(*pfunc, self); - nargs++; - stack--; - } - else { - Py_INCREF(func); - } - - if (PyFunction_Check(func)) { - x = _PyFunction_FastCallKeywords(func, stack, nargs, kwnames); - } - else { - x = _PyObject_FastCallKeywords(func, stack, nargs, kwnames); - } - Py_DECREF(func); + x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); } assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); diff --git a/Python/context.c b/Python/context.c index 9a50ea91a77e..f48c376b4ffa 100644 --- a/Python/context.c +++ b/Python/context.c @@ -631,7 +631,7 @@ context_run(PyContext *self, PyObject *const *args, return NULL; } - PyObject *call_result = _PyObject_FastCallKeywords( + PyObject *call_result = _PyObject_Vectorcall( args[0], args + 1, nargs - 1, kwnames); if (PyContext_Exit((PyObject *)self)) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 343601ec8596..12b1bd7711d5 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -481,7 +481,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb return NULL; } PyMem_RawFree(envar); - PyObject *retval = _PyObject_FastCallKeywords(hook, args, nargs, keywords); + PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords); Py_DECREF(hook); return retval; From webhook-mailer at python.org Wed May 29 14:47:05 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Wed, 29 May 2019 18:47:05 -0000 Subject: [Python-checkins] bpo-22385: Support output separators in hex methods. (#13578) Message-ID: https://github.com/python/cpython/commit/0c2f9305640f7655ba0cd5f478948b2763b376b3 commit: 0c2f9305640f7655ba0cd5f478948b2763b376b3 branch: master author: Gregory P. Smith committer: GitHub date: 2019-05-29T11:46:58-07:00 summary: bpo-22385: Support output separators in hex methods. (#13578) * bpo-22385: Support output separators in hex methods. Also in binascii.hexlify aka b2a_hex. The underlying implementation behind all hex generation in CPython uses the same pystrhex.c implementation. This adds support to bytes, bytearray, and memoryview objects. The binascii module functions exist rather than being slated for deprecation because they return bytes rather than requiring an intermediate step through a str object. This change was inspired by MicroPython which supports sep in its binascii implementation (and does not yet support the .hex methods). https://bugs.python.org/issue22385 files: A Misc/NEWS.d/next/Core and Builtins/2019-05-25-17-18-26.bpo-22385.VeVvhJ.rst A Objects/clinic/memoryobject.c.h M Doc/library/binascii.rst M Doc/library/stdtypes.rst M Include/pystrhex.h M Lib/test/test_binascii.py M Lib/test/test_bytes.py M Lib/test/test_doctest.py M Modules/binascii.c M Modules/clinic/binascii.c.h M Objects/bytearrayobject.c M Objects/bytesobject.c M Objects/clinic/bytearrayobject.c.h M Objects/clinic/bytesobject.c.h M Objects/memoryobject.c M Python/pystrhex.c diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 89ecddc7780f..98d8679fa3dc 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -145,8 +145,8 @@ The :mod:`binascii` module defines the following functions: platforms, use ``crc32(data) & 0xffffffff``. -.. function:: b2a_hex(data) - hexlify(data) +.. function:: b2a_hex(data[, sep[, bytes_per_sep=1]]) + hexlify(data[, sep[, bytes_per_sep=1]]) Return the hexadecimal representation of the binary *data*. Every byte of *data* is converted into the corresponding 2-digit hex representation. The @@ -155,6 +155,24 @@ The :mod:`binascii` module defines the following functions: Similar functionality (but returning a text string) is also conveniently accessible using the :meth:`bytes.hex` method. + If *sep* is specified, it must be a single character str or bytes object. + It will be inserted in the output after every *bytes_per_sep* input bytes. + Separator placement is counted from the right end of the output by default, + if you wish to count from the left, supply a negative *bytes_per_sep* value. + + >>> import binascii + >>> binascii.b2a_hex(b'\xb9\x01\xef') + b'b901ef' + >>> binascii.hexlify(b'\xb9\x01\xef', '-') + b'b9-01-ef' + >>> binascii.b2a_hex(b'\xb9\x01\xef', b'_', 2) + b'b9_01ef' + >>> binascii.b2a_hex(b'\xb9\x01\xef', b' ', -2) + b'b901 ef' + + .. versionchanged:: 3.8 + The *sep* and *bytes_per_sep* parameters were added. + .. function:: a2b_hex(hexstr) unhexlify(hexstr) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 293a1ab6a0d9..fcb0da74e158 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2404,8 +2404,26 @@ data and are closely related to string objects in a variety of other ways. >>> b'\xf0\xf1\xf2'.hex() 'f0f1f2' + If you want to make the hex string easier to read, you can specify a + single character separator *sep* parameter to include in the output. + By default between each byte. A second optional *bytes_per_sep* + parameter controls the spacing. Positive values calculate the + separator position from the right, negative values from the left. + + >>> value = b'\xf0\xf1\xf2' + >>> value.hex('-') + 'f0-f1-f2' + >>> value.hex('_', 2) + 'f0_f1f2' + >>> b'UUDDLRLRAB'.hex(' ', -4) + '55554444 4c524c52 4142' + .. versionadded:: 3.5 + .. versionchanged:: 3.8 + :meth:`bytes.hex` now supports optional *sep* and *bytes_per_sep* + parameters to insert separators between bytes in the hex output. + Since bytes objects are sequences of integers (akin to a tuple), for a bytes object *b*, ``b[0]`` will be an integer, while ``b[0:1]`` will be a bytes object of length 1. (This contrasts with text strings, where both indexing diff --git a/Include/pystrhex.h b/Include/pystrhex.h index 66a30e2233ce..a4f36305bac6 100644 --- a/Include/pystrhex.h +++ b/Include/pystrhex.h @@ -10,6 +10,9 @@ extern "C" { PyAPI_FUNC(PyObject*) _Py_strhex(const char* argbuf, const Py_ssize_t arglen); /* Returns a bytes() containing the ASCII hex representation of argbuf. */ PyAPI_FUNC(PyObject*) _Py_strhex_bytes(const char* argbuf, const Py_ssize_t arglen); +/* These variants include support for a separator between every N bytes: */ +PyAPI_FUNC(PyObject*) _Py_strhex_with_sep(const char* argbuf, const Py_ssize_t arglen, const PyObject* sep, const int bytes_per_group); +PyAPI_FUNC(PyObject*) _Py_strhex_bytes_with_sep(const char* argbuf, const Py_ssize_t arglen, const PyObject* sep, const int bytes_per_group); #endif /* !Py_LIMITED_API */ #ifdef __cplusplus diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 572e50c3e25e..08de5c9fc7cc 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -240,6 +240,18 @@ def test_hex(self): self.assertEqual(binascii.hexlify(self.type2test(s)), t) self.assertEqual(binascii.unhexlify(self.type2test(t)), u) + def test_hex_separator(self): + """Test that hexlify and b2a_hex are binary versions of bytes.hex.""" + # Logic of separators is tested in test_bytes.py. This checks that + # arg parsing works and exercises the direct to bytes object code + # path within pystrhex.c. + s = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000' + self.assertEqual(binascii.hexlify(self.type2test(s)), s.hex().encode('ascii')) + expected8 = s.hex('.', 8).encode('ascii') + self.assertEqual(binascii.hexlify(self.type2test(s), '.', 8), expected8) + expected1 = s.hex(':').encode('ascii') + self.assertEqual(binascii.b2a_hex(self.type2test(s), ':'), expected1) + def test_qp(self): type2test = self.type2test a2b_qp = binascii.a2b_qp diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 9502a8f974bd..bbd45c75298e 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -417,6 +417,63 @@ def test_hex(self): self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30') self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30') + def test_hex_separator_basics(self): + three_bytes = self.type2test(b'\xb9\x01\xef') + self.assertEqual(three_bytes.hex(), 'b901ef') + with self.assertRaises(ValueError): + three_bytes.hex('') + with self.assertRaises(ValueError): + three_bytes.hex('xx') + self.assertEqual(three_bytes.hex(':', 0), 'b901ef') + with self.assertRaises(TypeError): + three_bytes.hex(None, 0) + with self.assertRaises(ValueError): + three_bytes.hex('\xff') + with self.assertRaises(ValueError): + three_bytes.hex(b'\xff') + with self.assertRaises(ValueError): + three_bytes.hex(b'\x80') + with self.assertRaises(ValueError): + three_bytes.hex(chr(0x100)) + self.assertEqual(three_bytes.hex(':', 0), 'b901ef') + self.assertEqual(three_bytes.hex(b'\x00'), 'b9\x0001\x00ef') + self.assertEqual(three_bytes.hex('\x00'), 'b9\x0001\x00ef') + self.assertEqual(three_bytes.hex(b'\x7f'), 'b9\x7f01\x7fef') + self.assertEqual(three_bytes.hex('\x7f'), 'b9\x7f01\x7fef') + self.assertEqual(three_bytes.hex(':', 3), 'b901ef') + self.assertEqual(three_bytes.hex(':', 4), 'b901ef') + self.assertEqual(three_bytes.hex(':', -4), 'b901ef') + self.assertEqual(three_bytes.hex(':'), 'b9:01:ef') + self.assertEqual(three_bytes.hex(b'$'), 'b9$01$ef') + self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef') + self.assertEqual(three_bytes.hex(':', -1), 'b9:01:ef') + self.assertEqual(three_bytes.hex(':', 2), 'b9:01ef') + self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef') + self.assertEqual(three_bytes.hex('*', -2), 'b901*ef') + + value = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000' + self.assertEqual(value.hex('.', 8), '7b7305000000776f.726c646902000000.730500000068656c.6c6f690100000030') + + def test_hex_separator_five_bytes(self): + five_bytes = self.type2test(range(90,95)) + self.assertEqual(five_bytes.hex(), '5a5b5c5d5e') + + def test_hex_separator_six_bytes(self): + six_bytes = self.type2test(x*3 for x in range(1, 7)) + self.assertEqual(six_bytes.hex(), '0306090c0f12') + self.assertEqual(six_bytes.hex('.', 1), '03.06.09.0c.0f.12') + self.assertEqual(six_bytes.hex(' ', 2), '0306 090c 0f12') + self.assertEqual(six_bytes.hex('-', 3), '030609-0c0f12') + self.assertEqual(six_bytes.hex(':', 4), '0306:090c0f12') + self.assertEqual(six_bytes.hex(':', 5), '03:06090c0f12') + self.assertEqual(six_bytes.hex(':', 6), '0306090c0f12') + self.assertEqual(six_bytes.hex(':', 95), '0306090c0f12') + self.assertEqual(six_bytes.hex('_', -3), '030609_0c0f12') + self.assertEqual(six_bytes.hex(':', -4), '0306090c:0f12') + self.assertEqual(six_bytes.hex(b'@', -5), '0306090c0f at 12') + self.assertEqual(six_bytes.hex(':', -6), '0306090c0f12') + self.assertEqual(six_bytes.hex(' ', -95), '0306090c0f12') + def test_join(self): self.assertEqual(self.type2test(b"").join([]), b"") self.assertEqual(self.type2test(b"").join([b""]), b"") diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index f1013f257259..5ea18f52c4fc 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -665,11 +665,13 @@ def non_Python_modules(): r""" True >>> real_tests = [t for t in tests if len(t.examples) > 0] >>> len(real_tests) # objects that actually have doctests - 9 + 12 >>> for t in real_tests: ... print('{} {}'.format(len(t.examples), t.name)) ... 1 builtins.bin + 5 builtins.bytearray.hex + 5 builtins.bytes.hex 3 builtins.float.as_integer_ratio 2 builtins.float.fromhex 2 builtins.float.hex @@ -677,6 +679,7 @@ def non_Python_modules(): r""" 1 builtins.int 3 builtins.int.as_integer_ratio 2 builtins.int.bit_length + 5 builtins.memoryview.hex 1 builtins.oct Note here that 'bin', 'oct', and 'hex' are functions; 'float.as_integer_ratio', diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-25-17-18-26.bpo-22385.VeVvhJ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-25-17-18-26.bpo-22385.VeVvhJ.rst new file mode 100644 index 000000000000..e10690b3a560 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-25-17-18-26.bpo-22385.VeVvhJ.rst @@ -0,0 +1,4 @@ +The `bytes.hex`, `bytearray.hex`, and `memoryview.hex` methods as well as +the `binascii.hexlify` and `b2a_hex` functions now have the ability to +include an optional separator between hex bytes. This functionality was +inspired by MicroPython's hexlify implementation. diff --git a/Modules/binascii.c b/Modules/binascii.c index d22ab7b46838..1c7dc35882de 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -1159,19 +1159,33 @@ binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc) binascii.b2a_hex data: Py_buffer - / + sep: object = NULL + An optional single character or byte to separate hex bytes. + bytes_per_sep: int = 1 + How many bytes between separators. Positive values count from the + right, negative values count from the left. Hexadecimal representation of binary data. The return value is a bytes object. This function is also available as "hexlify()". + +Example: +>>> binascii.b2a_hex(b'\xb9\x01\xef') +b'b901ef' +>>> binascii.hexlify(b'\xb9\x01\xef', ':') +b'b9:01:ef' +>>> binascii.b2a_hex(b'\xb9\x01\xef', b'_', 2) +b'b9_01ef' [clinic start generated code]*/ static PyObject * -binascii_b2a_hex_impl(PyObject *module, Py_buffer *data) -/*[clinic end generated code: output=92fec1a95c9897a0 input=96423cfa299ff3b1]*/ +binascii_b2a_hex_impl(PyObject *module, Py_buffer *data, PyObject *sep, + int bytes_per_sep) +/*[clinic end generated code: output=a26937946a81d2c7 input=ec0ade6ba2e43543]*/ { - return _Py_strhex_bytes((const char *)data->buf, data->len); + return _Py_strhex_bytes_with_sep((const char *)data->buf, data->len, + sep, bytes_per_sep); } /*[clinic input] @@ -1179,14 +1193,17 @@ binascii.hexlify = binascii.b2a_hex Hexadecimal representation of binary data. -The return value is a bytes object. +The return value is a bytes object. This function is also +available as "b2a_hex()". [clinic start generated code]*/ static PyObject * -binascii_hexlify_impl(PyObject *module, Py_buffer *data) -/*[clinic end generated code: output=749e95e53c14880c input=2e3afae7f083f061]*/ +binascii_hexlify_impl(PyObject *module, Py_buffer *data, PyObject *sep, + int bytes_per_sep) +/*[clinic end generated code: output=d12aa1b001b15199 input=bc317bd4e241f76b]*/ { - return _Py_strhex_bytes((const char *)data->buf, data->len); + return _Py_strhex_bytes_with_sep((const char *)data->buf, data->len, + sep, bytes_per_sep); } /*[clinic input] diff --git a/Modules/clinic/binascii.c.h b/Modules/clinic/binascii.c.h index 4043d89d97db..d48504856902 100644 --- a/Modules/clinic/binascii.c.h +++ b/Modules/clinic/binascii.c.h @@ -432,34 +432,78 @@ binascii_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs) } PyDoc_STRVAR(binascii_b2a_hex__doc__, -"b2a_hex($module, data, /)\n" +"b2a_hex($module, /, data, sep=None, bytes_per_sep=1)\n" "--\n" "\n" "Hexadecimal representation of binary data.\n" "\n" +" sep\n" +" An optional single character or byte to separate hex bytes.\n" +" bytes_per_sep\n" +" How many bytes between separators. Positive values count from the\n" +" right, negative values count from the left.\n" +"\n" "The return value is a bytes object. This function is also\n" -"available as \"hexlify()\"."); +"available as \"hexlify()\".\n" +"\n" +"Example:\n" +">>> binascii.b2a_hex(b\'\\xb9\\x01\\xef\')\n" +"b\'b901ef\'\n" +">>> binascii.hexlify(b\'\\xb9\\x01\\xef\', \':\')\n" +"b\'b9:01:ef\'\n" +">>> binascii.b2a_hex(b\'\\xb9\\x01\\xef\', b\'_\', 2)\n" +"b\'b9_01ef\'"); #define BINASCII_B2A_HEX_METHODDEF \ - {"b2a_hex", (PyCFunction)binascii_b2a_hex, METH_O, binascii_b2a_hex__doc__}, + {"b2a_hex", (PyCFunction)(void(*)(void))binascii_b2a_hex, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_hex__doc__}, static PyObject * -binascii_b2a_hex_impl(PyObject *module, Py_buffer *data); +binascii_b2a_hex_impl(PyObject *module, Py_buffer *data, PyObject *sep, + int bytes_per_sep); static PyObject * -binascii_b2a_hex(PyObject *module, PyObject *arg) +binascii_b2a_hex(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = {"data", "sep", "bytes_per_sep", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "b2a_hex", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; + PyObject *sep = NULL; + int bytes_per_sep = 1; - if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { goto exit; } if (!PyBuffer_IsContiguous(&data, 'C')) { - _PyArg_BadArgument("b2a_hex", 0, "contiguous buffer", arg); + _PyArg_BadArgument("b2a_hex", 1, "contiguous buffer", args[0]); goto exit; } - return_value = binascii_b2a_hex_impl(module, &data); + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + sep = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + bytes_per_sep = _PyLong_AsInt(args[2]); + if (bytes_per_sep == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = binascii_b2a_hex_impl(module, &data, sep, bytes_per_sep); exit: /* Cleanup for data */ @@ -471,33 +515,70 @@ binascii_b2a_hex(PyObject *module, PyObject *arg) } PyDoc_STRVAR(binascii_hexlify__doc__, -"hexlify($module, data, /)\n" +"hexlify($module, /, data, sep=None, bytes_per_sep=1)\n" "--\n" "\n" "Hexadecimal representation of binary data.\n" "\n" -"The return value is a bytes object."); +" sep\n" +" An optional single character or byte to separate hex bytes.\n" +" bytes_per_sep\n" +" How many bytes between separators. Positive values count from the\n" +" right, negative values count from the left.\n" +"\n" +"The return value is a bytes object. This function is also\n" +"available as \"b2a_hex()\"."); #define BINASCII_HEXLIFY_METHODDEF \ - {"hexlify", (PyCFunction)binascii_hexlify, METH_O, binascii_hexlify__doc__}, + {"hexlify", (PyCFunction)(void(*)(void))binascii_hexlify, METH_FASTCALL|METH_KEYWORDS, binascii_hexlify__doc__}, static PyObject * -binascii_hexlify_impl(PyObject *module, Py_buffer *data); +binascii_hexlify_impl(PyObject *module, Py_buffer *data, PyObject *sep, + int bytes_per_sep); static PyObject * -binascii_hexlify(PyObject *module, PyObject *arg) +binascii_hexlify(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = {"data", "sep", "bytes_per_sep", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "hexlify", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; + PyObject *sep = NULL; + int bytes_per_sep = 1; - if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { goto exit; } if (!PyBuffer_IsContiguous(&data, 'C')) { - _PyArg_BadArgument("hexlify", 0, "contiguous buffer", arg); + _PyArg_BadArgument("hexlify", 1, "contiguous buffer", args[0]); goto exit; } - return_value = binascii_hexlify_impl(module, &data); + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + sep = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + bytes_per_sep = _PyLong_AsInt(args[2]); + if (bytes_per_sep == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = binascii_hexlify_impl(module, &data, sep, bytes_per_sep); exit: /* Cleanup for data */ @@ -720,4 +801,4 @@ binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj return return_value; } -/*[clinic end generated code: output=a4a38e162605aca2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f7b8049edb130c63 input=a9049054013a1b77]*/ diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index c7c28312b005..b9fcc01b7032 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2020,18 +2020,36 @@ bytearray_fromhex_impl(PyTypeObject *type, PyObject *string) return result; } -PyDoc_STRVAR(hex__doc__, -"B.hex() -> string\n\ -\n\ -Create a string of hexadecimal numbers from a bytearray object.\n\ -Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'."); +/*[clinic input] +bytearray.hex + + sep: object = NULL + An optional single character or byte to separate hex bytes. + bytes_per_sep: int = 1 + How many bytes between separators. Positive values count from the + right, negative values count from the left. + +Create a str of hexadecimal numbers from a bytearray object. + +Example: +>>> value = bytearray([0xb9, 0x01, 0xef]) +>>> value.hex() +'b901ef' +>>> value.hex(':') +'b9:01:ef' +>>> value.hex(':', 2) +'b9:01ef' +>>> value.hex(':', -2) +'b901:ef' +[clinic start generated code]*/ static PyObject * -bytearray_hex(PyBytesObject *self, PyObject *Py_UNUSED(ignored)) +bytearray_hex_impl(PyByteArrayObject *self, PyObject *sep, int bytes_per_sep) +/*[clinic end generated code: output=29c4e5ef72c565a0 input=814c15830ac8c4b5]*/ { char* argbuf = PyByteArray_AS_STRING(self); Py_ssize_t arglen = PyByteArray_GET_SIZE(self); - return _Py_strhex(argbuf, arglen); + return _Py_strhex_with_sep(argbuf, arglen, sep, bytes_per_sep); } static PyObject * @@ -2160,7 +2178,7 @@ bytearray_methods[] = { {"find", (PyCFunction)bytearray_find, METH_VARARGS, _Py_find__doc__}, BYTEARRAY_FROMHEX_METHODDEF - {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__}, + BYTEARRAY_HEX_METHODDEF {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__}, BYTEARRAY_INSERT_METHODDEF {"isalnum", stringlib_isalnum, METH_NOARGS, diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 6f34037154d6..bf7c7da423b7 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2416,18 +2416,36 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray) return NULL; } -PyDoc_STRVAR(hex__doc__, -"B.hex() -> string\n\ -\n\ -Create a string of hexadecimal numbers from a bytes object.\n\ -Example: b'\\xb9\\x01\\xef'.hex() -> 'b901ef'."); +/*[clinic input] +bytes.hex + + sep: object = NULL + An optional single character or byte to separate hex bytes. + bytes_per_sep: int = 1 + How many bytes between separators. Positive values count from the + right, negative values count from the left. + +Create a str of hexadecimal numbers from a bytes object. + +Example: +>>> value = b'\xb9\x01\xef' +>>> value.hex() +'b901ef' +>>> value.hex(':') +'b9:01:ef' +>>> value.hex(':', 2) +'b9:01ef' +>>> value.hex(':', -2) +'b901:ef' +[clinic start generated code]*/ static PyObject * -bytes_hex(PyBytesObject *self, PyObject *Py_UNUSED(ignored)) +bytes_hex_impl(PyBytesObject *self, PyObject *sep, int bytes_per_sep) +/*[clinic end generated code: output=1f134da504064139 input=f1238d3455990218]*/ { char* argbuf = PyBytes_AS_STRING(self); Py_ssize_t arglen = PyBytes_GET_SIZE(self); - return _Py_strhex(argbuf, arglen); + return _Py_strhex_with_sep(argbuf, arglen, sep, bytes_per_sep); } static PyObject * @@ -2452,7 +2470,7 @@ bytes_methods[] = { {"find", (PyCFunction)bytes_find, METH_VARARGS, _Py_find__doc__}, BYTES_FROMHEX_METHODDEF - {"hex", (PyCFunction)bytes_hex, METH_NOARGS, hex__doc__}, + BYTES_HEX_METHODDEF {"index", (PyCFunction)bytes_index, METH_VARARGS, _Py_index__doc__}, {"isalnum", stringlib_isalnum, METH_NOARGS, _Py_isalnum__doc__}, diff --git a/Objects/clinic/bytearrayobject.c.h b/Objects/clinic/bytearrayobject.c.h index da1dc6a40af0..08c6eb53f587 100644 --- a/Objects/clinic/bytearrayobject.c.h +++ b/Objects/clinic/bytearrayobject.c.h @@ -867,6 +867,75 @@ bytearray_fromhex(PyTypeObject *type, PyObject *arg) return return_value; } +PyDoc_STRVAR(bytearray_hex__doc__, +"hex($self, /, sep=None, bytes_per_sep=1)\n" +"--\n" +"\n" +"Create a str of hexadecimal numbers from a bytearray object.\n" +"\n" +" sep\n" +" An optional single character or byte to separate hex bytes.\n" +" bytes_per_sep\n" +" How many bytes between separators. Positive values count from the\n" +" right, negative values count from the left.\n" +"\n" +"Example:\n" +">>> value = bytearray([0xb9, 0x01, 0xef])\n" +">>> value.hex()\n" +"\'b901ef\'\n" +">>> value.hex(\':\')\n" +"\'b9:01:ef\'\n" +">>> value.hex(\':\', 2)\n" +"\'b9:01ef\'\n" +">>> value.hex(\':\', -2)\n" +"\'b901:ef\'"); + +#define BYTEARRAY_HEX_METHODDEF \ + {"hex", (PyCFunction)(void(*)(void))bytearray_hex, METH_FASTCALL|METH_KEYWORDS, bytearray_hex__doc__}, + +static PyObject * +bytearray_hex_impl(PyByteArrayObject *self, PyObject *sep, int bytes_per_sep); + +static PyObject * +bytearray_hex(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"sep", "bytes_per_sep", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "hex", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *sep = NULL; + int bytes_per_sep = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + sep = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + bytes_per_sep = _PyLong_AsInt(args[1]); + if (bytes_per_sep == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = bytearray_hex_impl(self, sep, bytes_per_sep); + +exit: + return return_value; +} + PyDoc_STRVAR(bytearray_reduce__doc__, "__reduce__($self, /)\n" "--\n" @@ -942,4 +1011,4 @@ bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) { return bytearray_sizeof_impl(self); } -/*[clinic end generated code: output=272fcb836b92da32 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7848247e5469ba1b input=a9049054013a1b77]*/ diff --git a/Objects/clinic/bytesobject.c.h b/Objects/clinic/bytesobject.c.h index b03078305a60..69c35063c6cf 100644 --- a/Objects/clinic/bytesobject.c.h +++ b/Objects/clinic/bytesobject.c.h @@ -686,4 +686,73 @@ bytes_fromhex(PyTypeObject *type, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=af9f51b9b185567d input=a9049054013a1b77]*/ + +PyDoc_STRVAR(bytes_hex__doc__, +"hex($self, /, sep=None, bytes_per_sep=1)\n" +"--\n" +"\n" +"Create a str of hexadecimal numbers from a bytes object.\n" +"\n" +" sep\n" +" An optional single character or byte to separate hex bytes.\n" +" bytes_per_sep\n" +" How many bytes between separators. Positive values count from the\n" +" right, negative values count from the left.\n" +"\n" +"Example:\n" +">>> value = b\'\\xb9\\x01\\xef\'\n" +">>> value.hex()\n" +"\'b901ef\'\n" +">>> value.hex(\':\')\n" +"\'b9:01:ef\'\n" +">>> value.hex(\':\', 2)\n" +"\'b9:01ef\'\n" +">>> value.hex(\':\', -2)\n" +"\'b901:ef\'"); + +#define BYTES_HEX_METHODDEF \ + {"hex", (PyCFunction)(void(*)(void))bytes_hex, METH_FASTCALL|METH_KEYWORDS, bytes_hex__doc__}, + +static PyObject * +bytes_hex_impl(PyBytesObject *self, PyObject *sep, int bytes_per_sep); + +static PyObject * +bytes_hex(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"sep", "bytes_per_sep", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "hex", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *sep = NULL; + int bytes_per_sep = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + sep = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + bytes_per_sep = _PyLong_AsInt(args[1]); + if (bytes_per_sep == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = bytes_hex_impl(self, sep, bytes_per_sep); + +exit: + return return_value; +} +/*[clinic end generated code: output=2d0a3733e13e753a input=a9049054013a1b77]*/ diff --git a/Objects/clinic/memoryobject.c.h b/Objects/clinic/memoryobject.c.h new file mode 100644 index 000000000000..64fce10acb5c --- /dev/null +++ b/Objects/clinic/memoryobject.c.h @@ -0,0 +1,74 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(memoryview_hex__doc__, +"hex($self, /, sep=None, bytes_per_sep=1)\n" +"--\n" +"\n" +"Return the data in the buffer as a str of hexadecimal numbers.\n" +"\n" +" sep\n" +" An optional single character or byte to separate hex bytes.\n" +" bytes_per_sep\n" +" How many bytes between separators. Positive values count from the\n" +" right, negative values count from the left.\n" +"\n" +"Example:\n" +">>> value = memoryview(b\'\\xb9\\x01\\xef\')\n" +">>> value.hex()\n" +"\'b901ef\'\n" +">>> value.hex(\':\')\n" +"\'b9:01:ef\'\n" +">>> value.hex(\':\', 2)\n" +"\'b9:01ef\'\n" +">>> value.hex(\':\', -2)\n" +"\'b901:ef\'"); + +#define MEMORYVIEW_HEX_METHODDEF \ + {"hex", (PyCFunction)(void(*)(void))memoryview_hex, METH_FASTCALL|METH_KEYWORDS, memoryview_hex__doc__}, + +static PyObject * +memoryview_hex_impl(PyMemoryViewObject *self, PyObject *sep, + int bytes_per_sep); + +static PyObject * +memoryview_hex(PyMemoryViewObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"sep", "bytes_per_sep", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "hex", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *sep = NULL; + int bytes_per_sep = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + sep = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + bytes_per_sep = _PyLong_AsInt(args[1]); + if (bytes_per_sep == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = memoryview_hex_impl(self, sep, bytes_per_sep); + +exit: + return return_value; +} +/*[clinic end generated code: output=5e44e2bcf01057b5 input=a9049054013a1b77]*/ diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 6bbb413c3c10..3955c58ee5d2 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -7,6 +7,12 @@ #include "pystrhex.h" #include +/*[clinic input] +class memoryview "PyMemoryViewObject *" "&PyMemoryView_Type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e2e49d2192835219]*/ + +#include "clinic/memoryobject.c.h" /****************************************************************************/ /* ManagedBuffer Object */ @@ -2160,8 +2166,33 @@ memory_tobytes(PyMemoryViewObject *self, PyObject *args, PyObject *kwds) return bytes; } +/*[clinic input] +memoryview.hex + + sep: object = NULL + An optional single character or byte to separate hex bytes. + bytes_per_sep: int = 1 + How many bytes between separators. Positive values count from the + right, negative values count from the left. + +Return the data in the buffer as a str of hexadecimal numbers. + +Example: +>>> value = memoryview(b'\xb9\x01\xef') +>>> value.hex() +'b901ef' +>>> value.hex(':') +'b9:01:ef' +>>> value.hex(':', 2) +'b9:01ef' +>>> value.hex(':', -2) +'b901:ef' +[clinic start generated code]*/ + static PyObject * -memory_hex(PyMemoryViewObject *self, PyObject *dummy) +memoryview_hex_impl(PyMemoryViewObject *self, PyObject *sep, + int bytes_per_sep) +/*[clinic end generated code: output=430ca760f94f3ca7 input=539f6a3a5fb56946]*/ { Py_buffer *src = VIEW_ADDR(self); PyObject *bytes; @@ -2170,7 +2201,7 @@ memory_hex(PyMemoryViewObject *self, PyObject *dummy) CHECK_RELEASED(self); if (MV_C_CONTIGUOUS(self->flags)) { - return _Py_strhex(src->buf, src->len); + return _Py_strhex_with_sep(src->buf, src->len, sep, bytes_per_sep); } bytes = PyBytes_FromStringAndSize(NULL, src->len); @@ -2182,7 +2213,9 @@ memory_hex(PyMemoryViewObject *self, PyObject *dummy) return NULL; } - ret = _Py_strhex(PyBytes_AS_STRING(bytes), PyBytes_GET_SIZE(bytes)); + ret = _Py_strhex_with_sep( + PyBytes_AS_STRING(bytes), PyBytes_GET_SIZE(bytes), + sep, bytes_per_sep); Py_DECREF(bytes); return ret; @@ -3090,10 +3123,6 @@ When order is 'C' or 'F', the data of the original array is converted to C or\n\ Fortran order. For contiguous views, 'A' returns an exact copy of the physical\n\ memory. In particular, in-memory Fortran order is preserved. For non-contiguous\n\ views, the data is converted to C first. order=None is the same as order='C'."); -PyDoc_STRVAR(memory_hex_doc, -"hex($self, /)\n--\n\ -\n\ -Return the data in the buffer as a string of hexadecimal numbers."); PyDoc_STRVAR(memory_tolist_doc, "tolist($self, /)\n--\n\ \n\ @@ -3110,7 +3139,7 @@ Return a readonly version of the memoryview."); static PyMethodDef memory_methods[] = { {"release", (PyCFunction)memory_release, METH_NOARGS, memory_release_doc}, {"tobytes", (PyCFunction)(void(*)(void))memory_tobytes, METH_VARARGS|METH_KEYWORDS, memory_tobytes_doc}, - {"hex", (PyCFunction)memory_hex, METH_NOARGS, memory_hex_doc}, + MEMORYVIEW_HEX_METHODDEF {"tolist", (PyCFunction)memory_tolist, METH_NOARGS, memory_tolist_doc}, {"cast", (PyCFunction)(void(*)(void))memory_cast, METH_VARARGS|METH_KEYWORDS, memory_cast_doc}, {"toreadonly", (PyCFunction)memory_toreadonly, METH_NOARGS, memory_toreadonly_doc}, diff --git a/Python/pystrhex.c b/Python/pystrhex.c index 028f187c707c..695a3c394e9b 100644 --- a/Python/pystrhex.c +++ b/Python/pystrhex.c @@ -5,40 +5,96 @@ #include "pystrhex.h" static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, - int return_bytes) + const PyObject* sep, int bytes_per_sep_group, + const int return_bytes) { PyObject *retval; Py_UCS1* retbuf; - Py_ssize_t i, j; + Py_ssize_t i, j, resultlen = 0; + Py_UCS1 sep_char; + unsigned int abs_bytes_per_sep; + + if (sep) { + Py_ssize_t seplen = PyObject_Length(sep); + if (seplen < 0) { + return NULL; + } + if (seplen != 1) { + PyErr_SetString(PyExc_ValueError, "sep must be length 1."); + return NULL; + } + if (PyUnicode_Check(sep)) { + if (PyUnicode_READY(sep)) + return NULL; + if (PyUnicode_KIND(sep) != PyUnicode_1BYTE_KIND) { + PyErr_SetString(PyExc_ValueError, "sep must be ASCII."); + return NULL; + } + sep_char = PyUnicode_READ_CHAR(sep, 0); + } else if (PyBytes_Check(sep)) { + sep_char = PyBytes_AS_STRING(sep)[0]; + } else { + PyErr_SetString(PyExc_TypeError, "sep must be str or bytes."); + return NULL; + } + if (sep_char > 127 && !return_bytes) { + PyErr_SetString(PyExc_ValueError, "sep must be ASCII."); + return NULL; + } + } else { + bytes_per_sep_group = 0; + } assert(arglen >= 0); - if (arglen > PY_SSIZE_T_MAX / 2) + abs_bytes_per_sep = abs(bytes_per_sep_group); + if (bytes_per_sep_group && arglen > 0) { + /* How many sep characters we'll be inserting. */ + resultlen = (arglen - 1) / abs_bytes_per_sep; + } + /* Bounds checking for our Py_ssize_t indices. */ + if (arglen >= PY_SSIZE_T_MAX / 2 - resultlen) { return PyErr_NoMemory(); + } + resultlen += arglen * 2; + + if (abs_bytes_per_sep >= arglen) { + bytes_per_sep_group = 0; + abs_bytes_per_sep = 0; + } if (return_bytes) { /* If _PyBytes_FromSize() were public we could avoid malloc+copy. */ - retbuf = (Py_UCS1*) PyMem_Malloc(arglen*2); + retbuf = (Py_UCS1*) PyMem_Malloc(resultlen); if (!retbuf) return PyErr_NoMemory(); retval = NULL; /* silence a compiler warning, assigned later. */ } else { - retval = PyUnicode_New(arglen*2, 127); + retval = PyUnicode_New(resultlen, 127); if (!retval) return NULL; retbuf = PyUnicode_1BYTE_DATA(retval); } - /* make hex version of string, taken from shamodule.c */ - for (i=j=0; i < arglen; i++) { + /* Hexlify */ + for (i=j=0; i < arglen; ++i) { + assert(j < resultlen); unsigned char c; c = (argbuf[i] >> 4) & 0xf; retbuf[j++] = Py_hexdigits[c]; c = argbuf[i] & 0xf; retbuf[j++] = Py_hexdigits[c]; + if (bytes_per_sep_group && i < arglen - 1) { + Py_ssize_t anchor; + anchor = (bytes_per_sep_group > 0) ? (arglen - 1 - i) : (i + 1); + if (anchor % abs_bytes_per_sep == 0) { + retbuf[j++] = sep_char; + } + } } + assert(j == resultlen); if (return_bytes) { - retval = PyBytes_FromStringAndSize((const char *)retbuf, arglen*2); + retval = PyBytes_FromStringAndSize((const char *)retbuf, resultlen); PyMem_Free(retbuf); } #ifdef Py_DEBUG @@ -52,12 +108,26 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, PyObject * _Py_strhex(const char* argbuf, const Py_ssize_t arglen) { - return _Py_strhex_impl(argbuf, arglen, 0); + return _Py_strhex_impl(argbuf, arglen, NULL, 0, 0); } /* Same as above but returns a bytes() instead of str() to avoid the * need to decode the str() when bytes are needed. */ PyObject * _Py_strhex_bytes(const char* argbuf, const Py_ssize_t arglen) { - return _Py_strhex_impl(argbuf, arglen, 1); + return _Py_strhex_impl(argbuf, arglen, NULL, 0, 1); +} + +/* These variants include support for a separator between every N bytes: */ + +PyObject * _Py_strhex_with_sep(const char* argbuf, const Py_ssize_t arglen, const PyObject* sep, const int bytes_per_group) +{ + return _Py_strhex_impl(argbuf, arglen, sep, bytes_per_group, 0); +} + +/* Same as above but returns a bytes() instead of str() to avoid the + * need to decode the str() when bytes are needed. */ +PyObject * _Py_strhex_bytes_with_sep(const char* argbuf, const Py_ssize_t arglen, const PyObject* sep, const int bytes_per_group) +{ + return _Py_strhex_impl(argbuf, arglen, sep, bytes_per_group, 1); } From webhook-mailer at python.org Wed May 29 15:57:15 2019 From: webhook-mailer at python.org (Christian Heimes) Date: Wed, 29 May 2019 19:57:15 -0000 Subject: [Python-checkins] bpo-26836: Add os.memfd_create() (#13567) Message-ID: https://github.com/python/cpython/commit/43fdbd2729cb7cdbb5afb5d16352f6604859e564 commit: 43fdbd2729cb7cdbb5afb5d16352f6604859e564 branch: master author: Zackery Spytz committer: Christian Heimes date: 2019-05-29T21:57:03+02:00 summary: bpo-26836: Add os.memfd_create() (#13567) * bpo-26836: Add os.memfd_create() * Use the glibc wrapper for memfd_create() Co-Authored-By: Christian Heimes * Fix deletions caused by autoreconf. * Use MFD_CLOEXEC as the default value for *flags*. * Add memset_s to configure.ac. * Revert memset_s changes. * Apply the requested changes. * Tweak the docs. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-25-08-18-01.bpo-26836.rplYWW.rst M Doc/library/os.rst M Doc/whatsnew/3.8.rst M Lib/test/test_os.py M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c M aclocal.m4 M configure M configure.ac M pyconfig.h.in diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 6df2b49c5325..b53fd71e65b3 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -2982,6 +2982,44 @@ features: Added support for :class:`bytes` paths. +.. function:: memfd_create(name[, flags=os.MFD_CLOEXEC]) + + Create an anonymous file and return a file descriptor that refers to it. + *flags* must be one of the ``os.MFD_*`` constants available on the system + (or a bitwise ORed combination of them). By default, the new file + descriptor is :ref:`non-inheritable `. + + .. availability:: Linux 3.17 or newer with glibc 2.27 or newer. + + .. versionadded:: 3.8 + + +.. data:: MFD_CLOEXEC + MFD_ALLOW_SEALING + MFD_HUGETLB + MFD_HUGE_SHIFT + MFD_HUGE_MASK + MFD_HUGE_64KB + MFD_HUGE_512KB + MFD_HUGE_1MB + MFD_HUGE_2MB + MFD_HUGE_8MB + MFD_HUGE_16MB + MFD_HUGE_32MB + MFD_HUGE_256MB + MFD_HUGE_512MB + MFD_HUGE_1GB + MFD_HUGE_2GB + MFD_HUGE_16GB + + These flags can be passed to :func:`memfd_create`. + + .. availability:: Linux 3.17 or newer with glibc 2.27 or newer. The + ``MFD_HUGE*`` flags are only available since Linux 4.14. + + .. versionadded:: 3.8 + + Linux extended attributes ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index f704b47098e6..b4a803091701 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -486,6 +486,10 @@ Added new function :func:`~os.add_dll_directory` on Windows for providing additional search paths for native dependencies when importing extension modules or loading DLLs using :mod:`ctypes`. +A new :func:`os.memfd_create` function was added to wrap the +``memfd_create()`` syscall. +(Contributed by Zackery Spytz and Christian Heimes in :issue:`26836`.) + os.path ------- diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 353b9a50a2b7..820c99c7a07c 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3122,6 +3122,22 @@ def test_stty_match(self): self.assertEqual(expected, actual) + at unittest.skipUnless(hasattr(os, 'memfd_create'), 'requires os.memfd_create') +class MemfdCreateTests(unittest.TestCase): + def test_memfd_create(self): + fd = os.memfd_create("Hi", os.MFD_CLOEXEC) + self.assertNotEqual(fd, -1) + self.addCleanup(os.close, fd) + self.assertFalse(os.get_inheritable(fd)) + with open(fd, "wb", closefd=False) as f: + f.write(b'memfd_create') + self.assertEqual(f.tell(), 12) + + fd2 = os.memfd_create("Hi") + self.addCleanup(os.close, fd2) + self.assertFalse(os.get_inheritable(fd2)) + + class OSErrorTests(unittest.TestCase): def setUp(self): class Str(str): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-25-08-18-01.bpo-26836.rplYWW.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-25-08-18-01.bpo-26836.rplYWW.rst new file mode 100644 index 000000000000..bbf63ec82ca6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-25-08-18-01.bpo-26836.rplYWW.rst @@ -0,0 +1 @@ +Add :func:`os.memfd_create`. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index f2745591b235..13f25460b4f6 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -7343,6 +7343,61 @@ os_urandom(PyObject *module, PyObject *arg) return return_value; } +#if defined(HAVE_MEMFD_CREATE) + +PyDoc_STRVAR(os_memfd_create__doc__, +"memfd_create($module, /, name, flags=MFD_CLOEXEC)\n" +"--\n" +"\n"); + +#define OS_MEMFD_CREATE_METHODDEF \ + {"memfd_create", (PyCFunction)(void(*)(void))os_memfd_create, METH_FASTCALL|METH_KEYWORDS, os_memfd_create__doc__}, + +static PyObject * +os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags); + +static PyObject * +os_memfd_create(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"name", "flags", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "memfd_create", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *name = NULL; + unsigned int flags = MFD_CLOEXEC; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_FSConverter(args[0], &name)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = (unsigned int)PyLong_AsUnsignedLongMask(args[1]); + if (flags == (unsigned int)-1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = os_memfd_create_impl(module, name, flags); + +exit: + /* Cleanup for name */ + Py_XDECREF(name); + + return return_value; +} + +#endif /* defined(HAVE_MEMFD_CREATE) */ + PyDoc_STRVAR(os_cpu_count__doc__, "cpu_count($module, /)\n" "--\n" @@ -8549,6 +8604,10 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #define OS_LISTXATTR_METHODDEF #endif /* !defined(OS_LISTXATTR_METHODDEF) */ +#ifndef OS_MEMFD_CREATE_METHODDEF + #define OS_MEMFD_CREATE_METHODDEF +#endif /* !defined(OS_MEMFD_CREATE_METHODDEF) */ + #ifndef OS_GET_HANDLE_INHERITABLE_METHODDEF #define OS_GET_HANDLE_INHERITABLE_METHODDEF #endif /* !defined(OS_GET_HANDLE_INHERITABLE_METHODDEF) */ @@ -8576,4 +8635,4 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=5ee9420fb2e7aa2c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=855b81aafd05beed input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index cd5b5ce082ec..a3d979c3bcd7 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -389,6 +389,19 @@ extern char *ctermid_r(char *); #define HAVE_STRUCT_STAT_ST_FSTYPE 1 #endif +/* memfd_create is either defined in sys/mman.h or sys/memfd.h + * linux/memfd.h defines additional flags + */ +#ifdef HAVE_SYS_MMAN_H +#include +#endif +#ifdef HAVE_SYS_MEMFD_H +#include +#endif +#ifdef HAVE_LINUX_MEMFD_H +#include +#endif + #ifdef _Py_MEMORY_SANITIZER # include #endif @@ -11897,6 +11910,31 @@ os_urandom_impl(PyObject *module, Py_ssize_t size) return bytes; } +#ifdef HAVE_MEMFD_CREATE +/*[clinic input] +os.memfd_create + + name: FSConverter + flags: unsigned_int(bitwise=True, c_default="MFD_CLOEXEC") = MFD_CLOEXEC + +[clinic start generated code]*/ + +static PyObject * +os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags) +/*[clinic end generated code: output=6681ede983bdb9a6 input=a42cfc199bcd56e9]*/ +{ + int fd; + const char *bytes = PyBytes_AS_STRING(name); + Py_BEGIN_ALLOW_THREADS + fd = memfd_create(bytes, flags); + Py_END_ALLOW_THREADS + if (fd == -1) { + return PyErr_SetFromErrno(PyExc_OSError); + } + return PyLong_FromLong(fd); +} +#endif + /* Terminal size querying */ static PyTypeObject* TerminalSizeType; @@ -13554,6 +13592,7 @@ static PyMethodDef posix_methods[] = { OS_SCANDIR_METHODDEF OS_FSPATH_METHODDEF OS_GETRANDOM_METHODDEF + OS_MEMFD_CREATE_METHODDEF #ifdef MS_WINDOWS OS__ADD_DLL_DIRECTORY_METHODDEF OS__REMOVE_DLL_DIRECTORY_METHODDEF @@ -14003,6 +14042,27 @@ all_ins(PyObject *m) if (PyModule_AddIntMacro(m, GRND_RANDOM)) return -1; if (PyModule_AddIntMacro(m, GRND_NONBLOCK)) return -1; #endif +#ifdef HAVE_MEMFD_CREATE + if (PyModule_AddIntMacro(m, MFD_CLOEXEC)) return -1; + if (PyModule_AddIntMacro(m, MFD_ALLOW_SEALING)) return -1; +#ifdef MFD_HUGETLB + if (PyModule_AddIntMacro(m, MFD_HUGETLB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_SHIFT)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_MASK)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_64KB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_512KB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_1MB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_2MB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_8MB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_16MB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_32MB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_256MB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_512MB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_1GB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_2GB)) return -1; + if (PyModule_AddIntMacro(m, MFD_HUGE_16GB)) return -1; +#endif +#endif #if defined(__APPLE__) if (PyModule_AddIntConstant(m, "_COPYFILE_DATA", COPYFILE_DATA)) return -1; @@ -14119,6 +14179,10 @@ static const char * const have_functions[] = { "HAVE_LUTIMES", #endif +#ifdef HAVE_MEMFD_CREATE + "HAVE_MEMFD_CREATE", +#endif + #ifdef HAVE_MKDIRAT "HAVE_MKDIRAT", #endif diff --git a/aclocal.m4 b/aclocal.m4 index 038bd4e2cea2..85f00dd5fac7 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -55,7 +55,7 @@ dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], -[m4_define([PKG_MACROS_VERSION], [0.29.2]) +[m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ @@ -156,7 +156,7 @@ AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no -AC_MSG_CHECKING([for $2]) +AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) @@ -166,11 +166,11 @@ and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else + else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs @@ -187,7 +187,7 @@ installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full diff --git a/configure b/configure index e8cbfeb154a5..cc18322d7514 100755 --- a/configure +++ b/configure @@ -785,6 +785,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -897,6 +898,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1149,6 +1151,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1286,7 +1297,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1439,6 +1450,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -7892,7 +7904,7 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \ -sys/endian.h sys/sysmacros.h +sys/endian.h sys/sysmacros.h linux/memfd.h sys/memfd.h sys/mman.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" @@ -11785,6 +11797,39 @@ $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for memfd_create" >&5 +$as_echo_n "checking for memfd_create... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_SYS_MMAN_H +#include +#endif +#ifdef HAVE_SYS_MEMFD_H +#include +#endif + +int +main () +{ +void *x=memfd_create + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_MEMFD_CREATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # On some systems (eg. FreeBSD 5), we would find a definition of the # functions ctermid_r, setgroups in the library, but no prototype # (e.g. because we use _XOPEN_SOURCE). See whether we can take their diff --git a/configure.ac b/configure.ac index 864c0abcf93e..1190b37e9f9d 100644 --- a/configure.ac +++ b/configure.ac @@ -2133,7 +2133,7 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \ -sys/endian.h sys/sysmacros.h) +sys/endian.h sys/sysmacros.h linux/memfd.h sys/memfd.h sys/mman.h) AC_HEADER_DIRENT AC_HEADER_MAJOR @@ -3626,6 +3626,20 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ [AC_MSG_RESULT(no) ]) +AC_MSG_CHECKING(for memfd_create) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_SYS_MMAN_H +#include +#endif +#ifdef HAVE_SYS_MEMFD_H +#include +#endif +]], [[void *x=memfd_create]])], + [AC_DEFINE(HAVE_MEMFD_CREATE, 1, Define if you have the 'memfd_create' function.) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) +]) + # On some systems (eg. FreeBSD 5), we would find a definition of the # functions ctermid_r, setgroups in the library, but no prototype # (e.g. because we use _XOPEN_SOURCE). See whether we can take their diff --git a/pyconfig.h.in b/pyconfig.h.in index cc6435541646..b9bb3ffa6f69 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -625,6 +625,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_CAN_RAW_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_MEMFD_H + /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_NETLINK_H @@ -667,15 +670,15 @@ /* Define to 1 if you have the `mbrtowc' function. */ #undef HAVE_MBRTOWC +/* Define if you have the 'memfd_create' function. */ +#undef HAVE_MEMFD_CREATE + /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memrchr' function. */ #undef HAVE_MEMRCHR -/* Define to 1 if you have the `memset_s' function. */ -#undef HAVE_MEMSET_S - /* Define to 1 if you have the `mkdirat' function. */ #undef HAVE_MKDIRAT @@ -1119,6 +1122,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_LOCK_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MEMFD_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MKDEV_H From webhook-mailer at python.org Wed May 29 16:12:42 2019 From: webhook-mailer at python.org (Antoine Pitrou) Date: Wed, 29 May 2019 20:12:42 -0000 Subject: [Python-checkins] bpo-32388: Remove cross-version binary compatibility requirement in tp_flags (GH-4944) Message-ID: https://github.com/python/cpython/commit/ada319bb6d0ebcc68d3e0ef2b4279ea061877ac8 commit: ada319bb6d0ebcc68d3e0ef2b4279ea061877ac8 branch: master author: Antoine Pitrou committer: GitHub date: 2019-05-29T22:12:38+02:00 summary: bpo-32388: Remove cross-version binary compatibility requirement in tp_flags (GH-4944) It is now allowed to add new fields at the end of the PyTypeObject struct without having to allocate a dedicated compatibility flag in tp_flags. This will reduce the risk of running out of bits in the 32-bit tp_flags value. files: A Misc/NEWS.d/next/Core and Builtins/2017-12-21-20-37-40.bpo-32388.6w-i5t.rst M Doc/c-api/typeobj.rst M Doc/whatsnew/3.8.rst M Include/object.h M Modules/_asynciomodule.c M Modules/_io/bufferedio.c M Modules/_io/fileio.c M Modules/_io/iobase.c M Modules/_io/textio.c M Modules/_io/winconsoleio.c M Modules/_testmultiphase.c M Modules/gcmodule.c M Modules/posixmodule.c M Modules/socketmodule.c M Modules/xxlimited.c M Objects/genobject.c M Objects/object.c M Objects/typeobject.c diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index aa667846a0da..e2f8f54be79a 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1099,6 +1099,11 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. versionadded:: 3.4 + .. deprecated:: 3.8 + This flag isn't necessary anymore, as the interpreter assumes the + :c:member:`~PyTypeObject.tp_finalize` slot is always present in the + type structure. + .. c:member:: const char* PyTypeObject.tp_doc diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index b4a803091701..5cd9a8edc793 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1265,6 +1265,15 @@ Changes in the C API (Contributed by Zackery Spytz in :issue:`33407`.) +* The interpreter does not pretend to support binary compatibility of + extension types accross feature releases, anymore. A :c:type:`PyTypeObject` + exported by a third-party extension module is supposed to have all the + slots expected in the current Python version, including + :c:member:`~PyTypeObject.tp_finalize` (:const:`Py_TPFLAGS_HAVE_FINALIZE` + is not checked anymore before reading :c:member:`~PyTypeObject.tp_finalize`). + + (Contributed by Antoine Pitrou in :issue:`32388`.) + CPython bytecode changes ------------------------ diff --git a/Include/object.h b/Include/object.h index 11ba2bb8e238..cc98d8a1def7 100644 --- a/Include/object.h +++ b/Include/object.h @@ -263,17 +263,14 @@ PyAPI_FUNC(void) Py_ReprLeave(PyObject *); #define Py_PRINT_RAW 1 /* No string quotes etc. */ /* -`Type flags (tp_flags) +Type flags (tp_flags) -These flags are used to extend the type structure in a backwards-compatible -fashion. Extensions can use the flags to indicate (and test) when a given -type structure contains a new feature. The Python core will use these when -introducing new functionality between major revisions (to avoid mid-version -changes in the PYTHON_API_VERSION). +These flags are used to change expected features and behavior for a +particular type. Arbitration of the flag bit positions will need to be coordinated among all extension writers who publicly release their extensions (this will -be fewer than you might expect!).. +be fewer than you might expect!). Most flags were removed as of Python 3.0 to make room for new flags. (Some flags are not for backwards compatibility but to indicate the presence of an @@ -302,7 +299,7 @@ given type object has a specified feature. /* Set while the type is being 'readied', to prevent recursive ready calls */ #define Py_TPFLAGS_READYING (1UL << 13) -/* Objects support garbage collection (see objimp.h) */ +/* Objects support garbage collection (see objimpl.h) */ #define Py_TPFLAGS_HAVE_GC (1UL << 14) /* These two bits are preserved for Stackless Python, next after this is 17 */ @@ -340,6 +337,11 @@ given type object has a specified feature. /* NOTE: The following flags reuse lower bits (removed as part of the * Python 3.0 transition). */ +/* The following flag is kept for compatibility. Starting with 3.8, + * binary compatibility of C extensions accross feature releases of + * Python is not supported anymore, except when using the stable ABI. + */ + /* Type structure has tp_finalize member (3.4) */ #define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0) diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-12-21-20-37-40.bpo-32388.6w-i5t.rst b/Misc/NEWS.d/next/Core and Builtins/2017-12-21-20-37-40.bpo-32388.6w-i5t.rst new file mode 100644 index 000000000000..60615d47f60d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2017-12-21-20-37-40.bpo-32388.6w-i5t.rst @@ -0,0 +1 @@ +Remove cross-version binary compatibility requirement in tp_flags. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 60136082a7ee..d8b631b7c7a2 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1430,8 +1430,7 @@ static PyTypeObject FutureType = { .tp_dealloc = FutureObj_dealloc, .tp_as_async = &FutureType_as_async, .tp_repr = (reprfunc)FutureObj_repr, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_FINALIZE, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, .tp_doc = _asyncio_Future___init____doc__, .tp_traverse = (traverseproc)FutureObj_traverse, .tp_clear = (inquiry)FutureObj_clear, @@ -2461,8 +2460,7 @@ static PyTypeObject TaskType = { .tp_dealloc = TaskObj_dealloc, .tp_as_async = &FutureType_as_async, .tp_repr = (reprfunc)FutureObj_repr, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_FINALIZE, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, .tp_doc = _asyncio_Task___init____doc__, .tp_traverse = (traverseproc)TaskObj_traverse, .tp_clear = (inquiry)TaskObj_clear, diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 6f855b9edd08..9c0eeb56860e 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2342,8 +2342,7 @@ PyTypeObject PyBufferedIOBase_Type = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ bufferediobase_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ @@ -2434,7 +2433,7 @@ PyTypeObject PyBufferedReader_Type = { 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ + | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ _io_BufferedReader___init____doc__, /* tp_doc */ (traverseproc)buffered_traverse, /* tp_traverse */ (inquiry)buffered_clear, /* tp_clear */ @@ -2520,7 +2519,7 @@ PyTypeObject PyBufferedWriter_Type = { 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ + | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ _io_BufferedWriter___init____doc__, /* tp_doc */ (traverseproc)buffered_traverse, /* tp_traverse */ (inquiry)buffered_clear, /* tp_clear */ @@ -2597,7 +2596,7 @@ PyTypeObject PyBufferedRWPair_Type = { 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */ + | Py_TPFLAGS_HAVE_GC, /* tp_flags */ _io_BufferedRWPair___init____doc__, /* tp_doc */ (traverseproc)bufferedrwpair_traverse, /* tp_traverse */ (inquiry)bufferedrwpair_clear, /* tp_clear */ @@ -2691,7 +2690,7 @@ PyTypeObject PyBufferedRandom_Type = { 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ + | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ _io_BufferedRandom___init____doc__, /* tp_doc */ (traverseproc)buffered_traverse, /* tp_traverse */ (inquiry)buffered_clear, /* tp_clear */ diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 52a6f49e1d32..582a8130f622 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -1200,12 +1200,12 @@ PyTypeObject PyFileIO_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */ + | Py_TPFLAGS_HAVE_GC, /* tp_flags */ _io_FileIO___init____doc__, /* tp_doc */ (traverseproc)fileio_traverse, /* tp_traverse */ (inquiry)fileio_clear, /* tp_clear */ 0, /* tp_richcompare */ - offsetof(fileio, weakreflist), /* tp_weaklistoffset */ + offsetof(fileio, weakreflist), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ fileio_methods, /* tp_methods */ @@ -1215,7 +1215,7 @@ PyTypeObject PyFileIO_Type = { 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ - offsetof(fileio, dict), /* tp_dictoffset */ + offsetof(fileio, dict), /* tp_dictoffset */ _io_FileIO___init__, /* tp_init */ PyType_GenericAlloc, /* tp_alloc */ fileio_new, /* tp_new */ diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index a5727b8deed3..8c8112d10f0b 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -856,7 +856,7 @@ PyTypeObject PyIOBase_Type = { 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ + | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ iobase_doc, /* tp_doc */ (traverseproc)iobase_traverse, /* tp_traverse */ (inquiry)iobase_clear, /* tp_clear */ @@ -1051,7 +1051,7 @@ PyTypeObject PyRawIOBase_Type = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ rawiobase_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index a08ab5b0e27f..3eb0dcc865ba 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -183,8 +183,7 @@ PyTypeObject PyTextIOBase_Type = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ textiobase_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ @@ -3258,7 +3257,7 @@ PyTypeObject PyTextIOWrapper_Type = { 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ + | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ _io_TextIOWrapper___init____doc__, /* tp_doc */ (traverseproc)textiowrapper_traverse, /* tp_traverse */ (inquiry)textiowrapper_clear, /* tp_clear */ diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index 70a723ed746a..7700bd5b7c0d 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -1133,7 +1133,7 @@ PyTypeObject PyWindowsConsoleIO_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */ + | Py_TPFLAGS_HAVE_GC, /* tp_flags */ _io__WindowsConsoleIO___init____doc__, /* tp_doc */ (traverseproc)winconsoleio_traverse, /* tp_traverse */ (inquiry)winconsoleio_clear, /* tp_clear */ diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index db5bb7d6b8a2..4933abbabbe3 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -98,7 +98,7 @@ static PyType_Spec Example_Type_spec = { "_testimportexec.Example", sizeof(ExampleObject), 0, - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, Example_Type_slots }; diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 3b15c7ba5b62..0cf00e839661 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -858,7 +858,6 @@ finalize_garbage(PyGC_Head *collectable) PyObject *op = FROM_GC(gc); gc_list_move(gc, &seen); if (!_PyGCHead_FINALIZED(gc) && - PyType_HasFeature(Py_TYPE(op), Py_TPFLAGS_HAVE_FINALIZE) && (finalize = Py_TYPE(op)->tp_finalize) != NULL) { _PyGCHead_SET_FINALIZED(gc); Py_INCREF(op); diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index a3d979c3bcd7..a25ff7a895c0 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -13032,8 +13032,7 @@ static PyTypeObject ScandirIteratorType = { 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT - | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ 0, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 74cdc0f2f6ca..ca4d760f8cb4 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -5286,8 +5286,7 @@ static PyTypeObject sock_type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ sock_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c index 190f9937d0de..ffc04e0310e3 100644 --- a/Modules/xxlimited.c +++ b/Modules/xxlimited.c @@ -123,7 +123,7 @@ static PyType_Spec Xxo_Type_spec = { "xxlimited.Xxo", sizeof(XxoObject), 0, - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, Xxo_Type_slots }; diff --git a/Objects/genobject.c b/Objects/genobject.c index e2def38af541..0d0a02d76ccf 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -742,8 +742,7 @@ PyTypeObject PyGen_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 0, /* tp_doc */ (traverseproc)gen_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -997,8 +996,7 @@ PyTypeObject PyCoro_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 0, /* tp_doc */ (traverseproc)gen_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -1394,8 +1392,7 @@ PyTypeObject PyAsyncGen_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 0, /* tp_doc */ (traverseproc)async_gen_traverse, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Objects/object.c b/Objects/object.c index 87dba9898e3a..f9c75b7c6a4e 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -298,10 +298,7 @@ PyObject_CallFinalizer(PyObject *self) { PyTypeObject *tp = Py_TYPE(self); - /* The former could happen on heaptypes created from the C API, e.g. - PyType_FromSpec(). */ - if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_FINALIZE) || - tp->tp_finalize == NULL) + if (tp->tp_finalize == NULL) return; /* tp_finalize should only be called once. */ if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self)) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index c14cbad875b4..071ff27d5323 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -248,8 +248,8 @@ PyType_Modified(PyTypeObject *type) Invariants: - Py_TPFLAGS_VALID_VERSION_TAG is never set if - Py_TPFLAGS_HAVE_VERSION_TAG is not set (e.g. on type - objects coming from non-recompiled extension modules) + Py_TPFLAGS_HAVE_VERSION_TAG is not set (in case of a + bizarre MRO, see type_mro_modified()). - before Py_TPFLAGS_VALID_VERSION_TAG can be set on a type, it must first be set on all super types. @@ -2571,7 +2571,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) /* Initialize tp_flags */ type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE | - Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_FINALIZE; + Py_TPFLAGS_BASETYPE; if (base->tp_flags & Py_TPFLAGS_HAVE_GC) type->tp_flags |= Py_TPFLAGS_HAVE_GC; @@ -5179,10 +5179,7 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) COPYSLOT(tp_init); COPYSLOT(tp_alloc); COPYSLOT(tp_is_gc); - if ((type->tp_flags & Py_TPFLAGS_HAVE_FINALIZE) && - (base->tp_flags & Py_TPFLAGS_HAVE_FINALIZE)) { - COPYSLOT(tp_finalize); - } + COPYSLOT(tp_finalize); if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) == (base->tp_flags & Py_TPFLAGS_HAVE_GC)) { /* They agree about gc. */ From webhook-mailer at python.org Wed May 29 16:43:55 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 May 2019 20:43:55 -0000 Subject: [Python-checkins] bpo-26836: Add ifdefs for all MFD_HUGE* constants (GH-13666) Message-ID: https://github.com/python/cpython/commit/e70bfa95e6f0c98b9906f306f24d71f8b7689f87 commit: e70bfa95e6f0c98b9906f306f24d71f8b7689f87 branch: master author: Zackery Spytz committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-29T13:43:49-07:00 summary: bpo-26836: Add ifdefs for all MFD_HUGE* constants (GH-13666) https://bugs.python.org/issue26836 files: M Modules/posixmodule.c diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index a25ff7a895c0..7588d3cde716 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -14046,19 +14046,47 @@ all_ins(PyObject *m) if (PyModule_AddIntMacro(m, MFD_ALLOW_SEALING)) return -1; #ifdef MFD_HUGETLB if (PyModule_AddIntMacro(m, MFD_HUGETLB)) return -1; +#endif +#ifdef MFD_HUGE_SHIFT if (PyModule_AddIntMacro(m, MFD_HUGE_SHIFT)) return -1; +#endif +#ifdef MFD_HUGE_MASK if (PyModule_AddIntMacro(m, MFD_HUGE_MASK)) return -1; +#endif +#ifdef MFD_HUGE_64KB if (PyModule_AddIntMacro(m, MFD_HUGE_64KB)) return -1; +#endif +#ifdef MFD_HUGE_512KB if (PyModule_AddIntMacro(m, MFD_HUGE_512KB)) return -1; +#endif +#ifdef MFD_HUGE_1MB if (PyModule_AddIntMacro(m, MFD_HUGE_1MB)) return -1; +#endif +#ifdef MFD_HUGE_2MB if (PyModule_AddIntMacro(m, MFD_HUGE_2MB)) return -1; +#endif +#ifdef MFD_HUGE_8MB if (PyModule_AddIntMacro(m, MFD_HUGE_8MB)) return -1; +#endif +#ifdef MFD_HUGE_16MB if (PyModule_AddIntMacro(m, MFD_HUGE_16MB)) return -1; +#endif +#ifdef MFD_HUGE_32MB if (PyModule_AddIntMacro(m, MFD_HUGE_32MB)) return -1; +#endif +#ifdef MFD_HUGE_256MB if (PyModule_AddIntMacro(m, MFD_HUGE_256MB)) return -1; +#endif +#ifdef MFD_HUGE_512MB if (PyModule_AddIntMacro(m, MFD_HUGE_512MB)) return -1; +#endif +#ifdef MFD_HUGE_1GB if (PyModule_AddIntMacro(m, MFD_HUGE_1GB)) return -1; +#endif +#ifdef MFD_HUGE_2GB if (PyModule_AddIntMacro(m, MFD_HUGE_2GB)) return -1; +#endif +#ifdef MFD_HUGE_16GB if (PyModule_AddIntMacro(m, MFD_HUGE_16GB)) return -1; #endif #endif From webhook-mailer at python.org Wed May 29 16:45:45 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Wed, 29 May 2019 20:45:45 -0000 Subject: [Python-checkins] bpo-36974: Fix GDB integration (GH-13665) Message-ID: https://github.com/python/cpython/commit/fecb75c1bb46c818e6579ba422cfa5d0d9d104d1 commit: fecb75c1bb46c818e6579ba422cfa5d0d9d104d1 branch: master author: Petr Viktorin committer: GitHub date: 2019-05-29T22:45:41+02:00 summary: bpo-36974: Fix GDB integration (GH-13665) As it changes the way functions are called, the PEP 590 implementation skipped the functions that the GDB integration is looking for (by name) to find function calls. Looking for the new helper `cfunction_call_varargs` hopefully fixes the tests, and thus buildbots. The changed frame nuber in test_gdb is due to there being fewer C calls when calling a built-in method. files: M Lib/test/test_gdb.py M Tools/gdb/libpython.py diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index dbcb5983e9ba..3127e69ca9ba 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -887,7 +887,7 @@ def test_pycfunction(self): breakpoint='time_gmtime', cmds_after_breakpoint=['py-bt-full'], ) - self.assertIn('#2 https://github.com/python/cpython/commit/8f96c9f8ed2a4795e34b333411451e24f28f74d2 commit: 8f96c9f8ed2a4795e34b333411451e24f28f74d2 branch: master author: Zackery Spytz committer: Steve Dower date: 2019-05-29T14:02:37-07:00 summary: bpo-37007: Implement socket.if_nametoindex(), if_indextoname() and if_nameindex() on Windows (GH-13522) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-23-04-19-13.bpo-37007.d1SOtF.rst M Doc/library/socket.rst M Doc/whatsnew/3.8.rst M Lib/test/test_socket.py M Modules/socketmodule.c M PCbuild/_socket.vcxproj diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 5be2b76113eb..e0dbbb4c0d32 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -1034,10 +1034,13 @@ The :mod:`socket` module also offers various network-related services: (index int, name string) tuples. :exc:`OSError` if the system call fails. - .. availability:: Unix. + .. availability:: Unix, Windows. .. versionadded:: 3.3 + .. versionchanged:: 3.8 + Windows support was added. + .. function:: if_nametoindex(if_name) @@ -1045,10 +1048,13 @@ The :mod:`socket` module also offers various network-related services: interface name. :exc:`OSError` if no interface with the given name exists. - .. availability:: Unix. + .. availability:: Unix, Windows. .. versionadded:: 3.3 + .. versionchanged:: 3.8 + Windows support was added. + .. function:: if_indextoname(if_index) @@ -1056,10 +1062,13 @@ The :mod:`socket` module also offers various network-related services: interface index number. :exc:`OSError` if no interface with the given index exists. - .. availability:: Unix. + .. availability:: Unix, Windows. .. versionadded:: 3.3 + .. versionchanged:: 3.8 + Windows support was added. + .. _socket-objects: diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 5cd9a8edc793..5ee9cf07ebaf 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -556,6 +556,10 @@ convenience functions to automate the necessary tasks usually involved when creating a server socket, including accepting both IPv4 and IPv6 connections on the same socket. (Contributed by Giampaolo Rodola in :issue:`17561`.) +The :func:`socket.if_nameindex()`, :func:`socket.if_nametoindex()`, and +:func:`socket.if_indextoname()` functions have been implemented on Windows. +(Contributed by Zackery Spytz in :issue:`37007`.) + shlex ---------- diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 0094cecb79cc..74662cfeb327 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -973,16 +973,18 @@ def testInterfaceNameIndex(self): self.assertIsInstance(_name, str) self.assertEqual(name, _name) - @unittest.skipUnless(hasattr(socket, 'if_nameindex'), - 'socket.if_nameindex() not available.') - def testInvalidInterfaceNameIndex(self): - # test nonexistent interface index/name + @unittest.skipUnless(hasattr(socket, 'if_indextoname'), + 'socket.if_indextoname() not available.') + def testInvalidInterfaceIndexToName(self): self.assertRaises(OSError, socket.if_indextoname, 0) - self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF') - # test with invalid values - self.assertRaises(TypeError, socket.if_nametoindex, 0) self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF') + @unittest.skipUnless(hasattr(socket, 'if_nametoindex'), + 'socket.if_nametoindex() not available.') + def testInvalidInterfaceNameToIndex(self): + self.assertRaises(TypeError, socket.if_nametoindex, 0) + self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF') + @unittest.skipUnless(hasattr(sys, 'getrefcount'), 'test needs sys.getrefcount()') def testRefCountGetNameInfo(self): @@ -1638,9 +1640,7 @@ def test_getaddrinfo_ipv6_basic(self): self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0)) @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') - @unittest.skipUnless( - hasattr(socket, 'if_nameindex'), - 'if_nameindex is not supported') + @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows') @unittest.skipIf(AIX, 'Symbolic scope id does not work') def test_getaddrinfo_ipv6_scopeid_symbolic(self): # Just pick up any network interface (Linux, Mac OS X) @@ -1672,9 +1672,7 @@ def test_getaddrinfo_ipv6_scopeid_numeric(self): self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex)) @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') - @unittest.skipUnless( - hasattr(socket, 'if_nameindex'), - 'if_nameindex is not supported') + @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows') @unittest.skipIf(AIX, 'Symbolic scope id does not work') def test_getnameinfo_ipv6_scopeid_symbolic(self): # Just pick up any network interface. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-23-04-19-13.bpo-37007.d1SOtF.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-23-04-19-13.bpo-37007.d1SOtF.rst new file mode 100644 index 000000000000..ac344a57c83d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-23-04-19-13.bpo-37007.d1SOtF.rst @@ -0,0 +1,2 @@ +Implement :func:`socket.if_nameindex()`, :func:`socket.if_nametoindex()`, and +:func:`socket.if_indextoname()` on Windows. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index ca4d760f8cb4..ac1698c6c767 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -345,6 +345,8 @@ if_indextoname(index) -- return the corresponding interface name\n\ /* Provides the IsWindows7SP1OrGreater() function */ #include +// For if_nametoindex() and if_indextoname() +#include /* remove some flags on older version Windows during run-time. https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */ @@ -6667,28 +6669,56 @@ Set the default timeout in seconds (float) for new socket objects.\n\ A value of None indicates that new socket objects have no timeout.\n\ When the socket module is first imported, the default is None."); -#ifdef HAVE_IF_NAMEINDEX +#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) /* Python API for getting interface indices and names */ static PyObject * socket_if_nameindex(PyObject *self, PyObject *arg) { - PyObject *list; + PyObject *list = PyList_New(0); + if (list == NULL) { + return NULL; + } +#ifdef MS_WINDOWS + PMIB_IF_TABLE2 tbl; + int ret; + if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) { + Py_DECREF(list); + // ret is used instead of GetLastError() + return PyErr_SetFromWindowsErr(ret); + } + for (ULONG i = 0; i < tbl->NumEntries; ++i) { + MIB_IF_ROW2 r = tbl->Table[i]; + WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; + if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, + Py_ARRAY_LENGTH(buf)))) { + Py_DECREF(list); + FreeMibTable(tbl); + // ret is used instead of GetLastError() + return PyErr_SetFromWindowsErr(ret); + } + PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf); + if (tuple == NULL || PyList_Append(list, tuple) == -1) { + Py_XDECREF(tuple); + Py_DECREF(list); + FreeMibTable(tbl); + return NULL; + } + Py_DECREF(tuple); + } + FreeMibTable(tbl); + return list; +#else int i; struct if_nameindex *ni; ni = if_nameindex(); if (ni == NULL) { + Py_DECREF(list); PyErr_SetFromErrno(PyExc_OSError); return NULL; } - list = PyList_New(0); - if (list == NULL) { - if_freenameindex(ni); - return NULL; - } - #ifdef _Py_MEMORY_SANITIZER __msan_unpoison(ni, sizeof(ni)); __msan_unpoison(&ni[0], sizeof(ni[0])); @@ -6720,6 +6750,7 @@ socket_if_nameindex(PyObject *self, PyObject *arg) if_freenameindex(ni); return list; +#endif } PyDoc_STRVAR(if_nameindex_doc, @@ -6731,8 +6762,11 @@ static PyObject * socket_if_nametoindex(PyObject *self, PyObject *args) { PyObject *oname; +#ifdef MS_WINDOWS + NET_IFINDEX index; +#else unsigned long index; - +#endif if (!PyArg_ParseTuple(args, "O&:if_nametoindex", PyUnicode_FSConverter, &oname)) return NULL; @@ -6756,7 +6790,11 @@ Returns the interface index corresponding to the interface name if_name."); static PyObject * socket_if_indextoname(PyObject *self, PyObject *arg) { +#ifdef MS_WINDOWS + NET_IFINDEX index; +#else unsigned long index; +#endif char name[IF_NAMESIZE + 1]; index = PyLong_AsUnsignedLong(arg); @@ -6776,7 +6814,7 @@ PyDoc_STRVAR(if_indextoname_doc, \n\ Returns the interface name corresponding to the interface index if_index."); -#endif /* HAVE_IF_NAMEINDEX */ +#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) #ifdef CMSG_LEN @@ -6898,7 +6936,7 @@ static PyMethodDef socket_methods[] = { METH_NOARGS, getdefaulttimeout_doc}, {"setdefaulttimeout", socket_setdefaulttimeout, METH_O, setdefaulttimeout_doc}, -#ifdef HAVE_IF_NAMEINDEX +#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) {"if_nameindex", socket_if_nameindex, METH_NOARGS, if_nameindex_doc}, {"if_nametoindex", socket_if_nametoindex, diff --git a/PCbuild/_socket.vcxproj b/PCbuild/_socket.vcxproj index 9498abf8fb5e..8fd75f90e7ee 100644 --- a/PCbuild/_socket.vcxproj +++ b/PCbuild/_socket.vcxproj @@ -93,7 +93,7 @@ - ws2_32.lib;%(AdditionalDependencies) + ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) From webhook-mailer at python.org Wed May 29 17:59:04 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Wed, 29 May 2019 21:59:04 -0000 Subject: [Python-checkins] Regenerate topics file (GH-13642) Message-ID: https://github.com/python/cpython/commit/29cb21ddb92413931e473eb799a02e2d8cdf4a45 commit: 29cb21ddb92413931e473eb799a02e2d8cdf4a45 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-29T22:59:00+01:00 summary: Regenerate topics file (GH-13642) files: M Doc/reference/compound_stmts.rst M Lib/pydoc_data/topics.py diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index bf53cb5a48ab..988eec6d254e 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -483,7 +483,7 @@ A function definition defines a user-defined function object (see section decorators: `decorator`+ decorator: "@" `dotted_name` ["(" [`argument_list` [","]] ")"] NEWLINE dotted_name: `identifier` ("." `identifier`)* - parameter_list: `defparameter` ("," `defparameter`)* ',' '/' [',' [`parameter_list_no_posonly`]] + parameter_list: `defparameter` ("," `defparameter`)* "," "/" ["," [`parameter_list_no_posonly`]] : | `parameter_list_no_posonly` parameter_list_no_posonly: `defparameter` ("," `defparameter`)* ["," [`parameter_list_starargs`]] : | `parameter_list_starargs` diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 875d6e890347..3361c6b5568a 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Mon May 6 20:27:55 2019 +# Autogenerated by Sphinx on Wed May 29 01:18:52 2019 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -2044,7 +2044,7 @@ 'exception is raised, it is as if "in" raised that ' 'exception).\n' '\n' - 'The operator "not in" is defined to have the inverse true ' + 'The operator "not in" is defined to have the inverse truth ' 'value of\n' '"in".\n' '\n' @@ -2052,13 +2052,13 @@ 'Identity comparisons\n' '====================\n' '\n' - 'The operators "is" and "is not" test for object identity: "x ' - 'is y" is\n' - 'true if and only if *x* and *y* are the same object. Object ' - 'identity\n' - 'is determined using the "id()" function. "x is not y" yields ' - 'the\n' - 'inverse truth value. [4]\n', + 'The operators "is" and "is not" test for an object?s ' + 'identity: "x is\n' + 'y" is true if and only if *x* and *y* are the same object. ' + 'An\n' + 'Object?s identity is determined using the "id()" function. ' + '"x is not\n' + 'y" yields the inverse truth value. [4]\n', 'compound': 'Compound statements\n' '*******************\n' '\n' @@ -2558,22 +2558,25 @@ '(see\n' 'section The standard type hierarchy):\n' '\n' - ' funcdef ::= [decorators] "def" funcname "(" ' + ' funcdef ::= [decorators] "def" funcname "(" ' '[parameter_list] ")"\n' ' ["->" expression] ":" suite\n' - ' decorators ::= decorator+\n' - ' decorator ::= "@" dotted_name ["(" ' + ' decorators ::= decorator+\n' + ' decorator ::= "@" dotted_name ["(" ' '[argument_list [","]] ")"] NEWLINE\n' - ' dotted_name ::= identifier ("." identifier)*\n' - ' parameter_list ::= defparameter ("," defparameter)* ' - '["," [parameter_list_starargs]]\n' - ' | parameter_list_starargs\n' - ' parameter_list_starargs ::= "*" [parameter] ("," ' + ' dotted_name ::= identifier ("." identifier)*\n' + ' parameter_list ::= defparameter ("," ' + 'defparameter)* "," "/" ["," [parameter_list_no_posonly]]\n' + ' | parameter_list_no_posonly\n' + ' parameter_list_no_posonly ::= defparameter ("," ' + 'defparameter)* ["," [parameter_list_starargs]]\n' + ' | parameter_list_starargs\n' + ' parameter_list_starargs ::= "*" [parameter] ("," ' 'defparameter)* ["," ["**" parameter [","]]]\n' ' | "**" parameter [","]\n' - ' parameter ::= identifier [":" expression]\n' - ' defparameter ::= parameter ["=" expression]\n' - ' funcname ::= identifier\n' + ' parameter ::= identifier [":" expression]\n' + ' defparameter ::= parameter ["=" expression]\n' + ' funcname ::= identifier\n' '\n' 'A function definition is an executable statement. Its execution ' 'binds\n' @@ -4363,7 +4366,7 @@ 'terminates\n' 'execution of the program, or returns to its interactive main ' 'loop. In\n' - 'either case, it prints a stack backtrace, except when the ' + 'either case, it prints a stack traceback, except when the ' 'exception is\n' '"SystemExit".\n' '\n' @@ -4684,7 +4687,7 @@ 'terminates\n' 'execution of the program, or returns to its interactive main ' 'loop. In\n' - 'either case, it prints a stack backtrace, except when the ' + 'either case, it prints a stack traceback, except when the ' 'exception is\n' '"SystemExit".\n' '\n' @@ -5078,7 +5081,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'<\'" | Forces the field to be left-aligned ' 'within the available |\n' ' | | space (this is the default for most ' @@ -5127,7 +5130,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'+\'" | indicates that a sign should be used for ' 'both positive as |\n' ' | | well as negative ' @@ -5231,7 +5234,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'s\'" | String format. This is the default type ' 'for strings and |\n' ' | | may be ' @@ -5251,7 +5254,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'b\'" | Binary format. Outputs the number in ' 'base 2. |\n' ' ' @@ -5313,7 +5316,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'e\'" | Exponent notation. Prints the number in ' 'scientific |\n' ' | | notation using the letter ?e? to indicate ' @@ -5584,22 +5587,25 @@ '(see\n' 'section The standard type hierarchy):\n' '\n' - ' funcdef ::= [decorators] "def" funcname "(" ' + ' funcdef ::= [decorators] "def" funcname "(" ' '[parameter_list] ")"\n' ' ["->" expression] ":" suite\n' - ' decorators ::= decorator+\n' - ' decorator ::= "@" dotted_name ["(" ' + ' decorators ::= decorator+\n' + ' decorator ::= "@" dotted_name ["(" ' '[argument_list [","]] ")"] NEWLINE\n' - ' dotted_name ::= identifier ("." identifier)*\n' - ' parameter_list ::= defparameter ("," defparameter)* ' - '["," [parameter_list_starargs]]\n' - ' | parameter_list_starargs\n' - ' parameter_list_starargs ::= "*" [parameter] ("," ' + ' dotted_name ::= identifier ("." identifier)*\n' + ' parameter_list ::= defparameter ("," ' + 'defparameter)* "," "/" ["," [parameter_list_no_posonly]]\n' + ' | parameter_list_no_posonly\n' + ' parameter_list_no_posonly ::= defparameter ("," ' + 'defparameter)* ["," [parameter_list_starargs]]\n' + ' | parameter_list_starargs\n' + ' parameter_list_starargs ::= "*" [parameter] ("," ' 'defparameter)* ["," ["**" parameter [","]]]\n' ' | "**" parameter [","]\n' - ' parameter ::= identifier [":" expression]\n' - ' defparameter ::= parameter ["=" expression]\n' - ' funcname ::= identifier\n' + ' parameter ::= identifier [":" expression]\n' + ' defparameter ::= parameter ["=" expression]\n' + ' funcname ::= identifier\n' '\n' 'A function definition is an executable statement. Its execution ' 'binds\n' @@ -6338,7 +6344,7 @@ 'integer indices do not raise "IndexError" exception. (If any other\n' 'exception is raised, it is as if "in" raised that exception).\n' '\n' - 'The operator "not in" is defined to have the inverse true value of\n' + 'The operator "not in" is defined to have the inverse truth value of\n' '"in".\n', 'integers': 'Integer literals\n' '****************\n' @@ -7019,7 +7025,7 @@ '+-------------------------------------------------+---------------------------------------+\n' '| Operator | ' 'Description |\n' - '+=================================================+=======================================+\n' + '|=================================================|=======================================|\n' '| "lambda" | ' 'Lambda expression |\n' '+-------------------------------------------------+---------------------------------------+\n' @@ -10263,7 +10269,7 @@ ' | Representation | ' 'Description |\n' ' ' - '+=========================+===============================+\n' + '|=========================|===============================|\n' ' | "\\n" | Line ' 'Feed |\n' ' ' @@ -10602,7 +10608,7 @@ '+-------------------+-----------------------------------+---------+\n' '| Escape Sequence | Meaning | Notes ' '|\n' - '+===================+===================================+=========+\n' + '|===================|===================================|=========|\n' '| "\\newline" | Backslash and newline ignored ' '| |\n' '+-------------------+-----------------------------------+---------+\n' @@ -10648,7 +10654,7 @@ '+-------------------+-----------------------------------+---------+\n' '| Escape Sequence | Meaning | Notes ' '|\n' - '+===================+===================================+=========+\n' + '|===================|===================================|=========|\n' '| "\\N{name}" | Character named *name* in the | ' '(4) |\n' '| | Unicode database | ' @@ -11286,7 +11292,7 @@ ' | Attribute | Meaning ' '| |\n' ' ' - '+===========================+=================================+=============+\n' + '|===========================|=================================|=============|\n' ' | "__doc__" | The function?s documentation ' '| Writable |\n' ' | | string, or "None" if ' @@ -12557,7 +12563,7 @@ '+----------------------------+----------------------------------+------------+\n' '| Operation | Result ' '| Notes |\n' - '+============================+==================================+============+\n' + '|============================|==================================|============|\n' '| "x in s" | "True" if an item of *s* is ' '| (1) |\n' '| | equal to *x*, else "False" ' @@ -12786,7 +12792,7 @@ '+--------------------------------+----------------------------------+-----------------------+\n' '| Operation | ' 'Result | Notes |\n' - '+================================+==================================+=======================+\n' + '|================================|==================================|=======================|\n' '| "s[i] = x" | item *i* of *s* is replaced ' 'by | |\n' '| | ' @@ -12872,7 +12878,7 @@ 'default\n' ' the last item is removed and returned.\n' '\n' - '3. "remove" raises "ValueError" when *x* is not found in *s*.\n' + '3. "remove()" raises "ValueError" when *x* is not found in *s*.\n' '\n' '4. The "reverse()" method modifies the sequence in place for\n' ' economy of space when reversing a large sequence. To remind ' @@ -12883,7 +12889,11 @@ '\n' '5. "clear()" and "copy()" are included for consistency with the\n' ' interfaces of mutable containers that don?t support slicing\n' - ' operations (such as "dict" and "set")\n' + ' operations (such as "dict" and "set"). "copy()" is not part ' + 'of the\n' + ' "collections.abc.MutableSequence" ABC, but most concrete ' + 'mutable\n' + ' sequence classes provide it.\n' '\n' ' New in version 3.3: "clear()" and "copy()" methods.\n' '\n' @@ -13244,7 +13254,7 @@ '| Operation | ' 'Result | Notes ' '|\n' - '+================================+==================================+=======================+\n' + '|================================|==================================|=======================|\n' '| "s[i] = x" | item *i* of *s* is ' 'replaced by | |\n' '| | ' @@ -13333,8 +13343,8 @@ 'by default\n' ' the last item is removed and returned.\n' '\n' - '3. "remove" raises "ValueError" when *x* is not found in ' - '*s*.\n' + '3. "remove()" raises "ValueError" when *x* is not found ' + 'in *s*.\n' '\n' '4. The "reverse()" method modifies the sequence in place ' 'for\n' @@ -13348,7 +13358,11 @@ 'with the\n' ' interfaces of mutable containers that don?t support ' 'slicing\n' - ' operations (such as "dict" and "set")\n' + ' operations (such as "dict" and "set"). "copy()" is ' + 'not part of the\n' + ' "collections.abc.MutableSequence" ABC, but most ' + 'concrete mutable\n' + ' sequence classes provide it.\n' '\n' ' New in version 3.3: "clear()" and "copy()" methods.\n' '\n' From webhook-mailer at python.org Wed May 29 20:13:18 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Thu, 30 May 2019 00:13:18 -0000 Subject: [Python-checkins] Don't crash if there exists an EGG-INFO directory on sys.path (#13667) Message-ID: https://github.com/python/cpython/commit/80878312316bfb4011157f13cf040f6d885f808b commit: 80878312316bfb4011157f13cf040f6d885f808b branch: master author: Anthony Sottile committer: Barry Warsaw date: 2019-05-29T17:13:11-07:00 summary: Don't crash if there exists an EGG-INFO directory on sys.path (#13667) * Don't crash if there exists an EGG-INFO directory on sys.path cross-port of https://gitlab.com/python-devs/importlib_metadata/merge_requests/72 * Also catch PermissionError for windows files: M Lib/importlib/metadata/__init__.py M Lib/test/test_importlib/test_main.py diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index 24d45d2caad0..a1abdd64815b 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -320,7 +320,8 @@ def __init__(self, path): self._path = path def read_text(self, filename): - with suppress(FileNotFoundError, NotADirectoryError, KeyError): + with suppress(FileNotFoundError, IsADirectoryError, KeyError, + NotADirectoryError, PermissionError): return self._path.joinpath(filename).read_text(encoding='utf-8') read_text.__doc__ = Distribution.read_text.__doc__ diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py index b70f9440f697..844ed26c3ec7 100644 --- a/Lib/test/test_importlib/test_main.py +++ b/Lib/test/test_importlib/test_main.py @@ -156,3 +156,11 @@ def test_package_discovery(self): dist.metadata['Name'] == 'distinfo-pkg' for dist in dists ) + + +class DirectoryTest(fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase): + def test(self): + # make an `EGG-INFO` directory that's unrelated + self.site_dir.joinpath('EGG-INFO').mkdir() + # used to crash with `IsADirectoryError` + self.assertIsNone(version('unknown-package')) From webhook-mailer at python.org Wed May 29 23:25:39 2019 From: webhook-mailer at python.org (Giampaolo Rodola) Date: Thu, 30 May 2019 03:25:39 -0000 Subject: [Python-checkins] bpo-24564: shutil.copystat(): ignore EINVAL on os.setxattr() (GH-13369) Message-ID: https://github.com/python/cpython/commit/a16387ab2d85f19665920bb6ff91a7e57f59dd2a commit: a16387ab2d85f19665920bb6ff91a7e57f59dd2a branch: master author: Ying Wang committer: Giampaolo Rodola date: 2019-05-30T11:25:31+08:00 summary: bpo-24564: shutil.copystat(): ignore EINVAL on os.setxattr() (GH-13369) files: A Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst M Lib/shutil.py diff --git a/Lib/shutil.py b/Lib/shutil.py index b2e8f5fd759b..2dfae87c9ce9 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -309,7 +309,7 @@ def _copyxattr(src, dst, *, follow_symlinks=True): try: names = os.listxattr(src, follow_symlinks=follow_symlinks) except OSError as e: - if e.errno not in (errno.ENOTSUP, errno.ENODATA): + if e.errno not in (errno.ENOTSUP, errno.ENODATA, errno.EINVAL): raise return for name in names: @@ -317,7 +317,8 @@ def _copyxattr(src, dst, *, follow_symlinks=True): value = os.getxattr(src, name, follow_symlinks=follow_symlinks) os.setxattr(dst, name, value, follow_symlinks=follow_symlinks) except OSError as e: - if e.errno not in (errno.EPERM, errno.ENOTSUP, errno.ENODATA): + if e.errno not in (errno.EPERM, errno.ENOTSUP, errno.ENODATA, + errno.EINVAL): raise else: def _copyxattr(*args, **kwargs): diff --git a/Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst b/Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst new file mode 100644 index 000000000000..27cb6178b54e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst @@ -0,0 +1,3 @@ +:func:`shutil.copystat` now ignores :const:`errno.EINVAL` on :func:`os.setxattr` which may occur when copying files on filesystems without extended attributes support. + +Original patch by Giampaolo Rodola, updated by Ying Wang. From webhook-mailer at python.org Thu May 30 00:05:39 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 04:05:39 -0000 Subject: [Python-checkins] [3.7] bpo-36983: Fix typing.__all__ and add test for exported names (GH-13456) (GH-13662) Message-ID: https://github.com/python/cpython/commit/3a98bbf7275903a0f84d1374abd0b7f3a85950a4 commit: 3a98bbf7275903a0f84d1374abd0b7f3a85950a4 branch: 3.7 author: Anthony Sottile committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-29T21:05:33-07:00 summary: [3.7] bpo-36983: Fix typing.__all__ and add test for exported names (GH-13456) (GH-13662) https://bugs.python.org/issue36983 Fixes issue 36983 files: A Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 0d66ebbd1845..ffd2007ee70d 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -2665,6 +2665,30 @@ def test_all(self): self.assertIn('SupportsBytes', a) self.assertIn('SupportsComplex', a) + def test_all_exported_names(self): + import typing + + actual_all = set(typing.__all__) + computed_all = { + k for k, v in vars(typing).items() + # explicitly exported, not a thing with __module__ + if k in actual_all or ( + # avoid private names + not k.startswith('_') and + # avoid things in the io / re typing submodules + k not in typing.io.__all__ and + k not in typing.re.__all__ and + k not in {'io', 're'} and + # there's a few types and metaclasses that aren't exported + not k.endswith(('Meta', '_contra', '_co')) and + not k.upper() == k and + # but export all things that have __module__ == 'typing' + getattr(v, '__module__', None) == typing.__name__ + ) + } + self.assertSetEqual(computed_all, actual_all) + + if __name__ == '__main__': main() diff --git a/Lib/typing.py b/Lib/typing.py index 8cf0d00bceaf..9851cb4c7ebd 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -36,6 +36,7 @@ 'Any', 'Callable', 'ClassVar', + 'ForwardRef', 'Generic', 'Optional', 'Tuple', @@ -79,11 +80,13 @@ 'SupportsRound', # Concrete collection types. + 'ChainMap', 'Counter', 'Deque', 'Dict', 'DefaultDict', 'List', + 'OrderedDict', 'Set', 'FrozenSet', 'NamedTuple', # Not really a type. diff --git a/Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst b/Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst new file mode 100644 index 000000000000..bd2d91ad9234 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst @@ -0,0 +1,2 @@ +Add missing names to ``typing.__all__``: ``ChainMap``, ``ForwardRef``, +``OrderedDict`` - by Anthony Sottile. From webhook-mailer at python.org Thu May 30 01:58:47 2019 From: webhook-mailer at python.org (Giampaolo Rodola) Date: Thu, 30 May 2019 05:58:47 -0000 Subject: [Python-checkins] bpo-24564: shutil.copystat(): ignore EINVAL on os.setxattr() (GH-13369) Message-ID: https://github.com/python/cpython/commit/f1487b323549e2360460383b4304f6592fb38e27 commit: f1487b323549e2360460383b4304f6592fb38e27 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Giampaolo Rodola date: 2019-05-30T13:58:30+08:00 summary: bpo-24564: shutil.copystat(): ignore EINVAL on os.setxattr() (GH-13369) (cherry picked from commit a16387ab2d85f19665920bb6ff91a7e57f59dd2a) Co-authored-by: Ying Wang files: A Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst M Lib/shutil.py diff --git a/Lib/shutil.py b/Lib/shutil.py index 4c6fdd7d33d4..fc6fb4edd24c 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -156,7 +156,7 @@ def _copyxattr(src, dst, *, follow_symlinks=True): try: names = os.listxattr(src, follow_symlinks=follow_symlinks) except OSError as e: - if e.errno not in (errno.ENOTSUP, errno.ENODATA): + if e.errno not in (errno.ENOTSUP, errno.ENODATA, errno.EINVAL): raise return for name in names: @@ -164,7 +164,8 @@ def _copyxattr(src, dst, *, follow_symlinks=True): value = os.getxattr(src, name, follow_symlinks=follow_symlinks) os.setxattr(dst, name, value, follow_symlinks=follow_symlinks) except OSError as e: - if e.errno not in (errno.EPERM, errno.ENOTSUP, errno.ENODATA): + if e.errno not in (errno.EPERM, errno.ENOTSUP, errno.ENODATA, + errno.EINVAL): raise else: def _copyxattr(*args, **kwargs): diff --git a/Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst b/Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst new file mode 100644 index 000000000000..27cb6178b54e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst @@ -0,0 +1,3 @@ +:func:`shutil.copystat` now ignores :const:`errno.EINVAL` on :func:`os.setxattr` which may occur when copying files on filesystems without extended attributes support. + +Original patch by Giampaolo Rodola, updated by Ying Wang. From webhook-mailer at python.org Thu May 30 02:05:53 2019 From: webhook-mailer at python.org (Giampaolo Rodola) Date: Thu, 30 May 2019 06:05:53 -0000 Subject: [Python-checkins] bpo-36610: shutil.copyfile(): use sendfile() on Linux only (GH-13675) Message-ID: https://github.com/python/cpython/commit/413d955f8ec88a7183f91d7ad8b0ff7def803de3 commit: 413d955f8ec88a7183f91d7ad8b0ff7def803de3 branch: master author: Giampaolo Rodola committer: GitHub date: 2019-05-30T14:05:41+08:00 summary: bpo-36610: shutil.copyfile(): use sendfile() on Linux only (GH-13675) ...and avoid using it on Solaris as it can raise EINVAL if offset is equal or bigger than the size of the file files: M Doc/library/shutil.rst M Doc/whatsnew/3.8.rst M Lib/shutil.py M Lib/test/test_shutil.py M Misc/NEWS.d/3.8.0a1.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 4af5a1680608..dcb2a16cff98 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -420,8 +420,7 @@ the use of userspace buffers in Python as in "``outfd.write(infd.read())``". On macOS `fcopyfile`_ is used to copy the file content (not metadata). -On Linux, Solaris and other POSIX platforms where :func:`os.sendfile` supports -copies between 2 regular file descriptors :func:`os.sendfile` is used. +On Linux :func:`os.sendfile` is used. On Windows :func:`shutil.copyfile` uses a bigger default buffer size (1 MiB instead of 64 KiB) and a :func:`memoryview`-based variant of diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 5ee9cf07ebaf..98f0c3474f26 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -772,7 +772,7 @@ Optimizations * :func:`shutil.copyfile`, :func:`shutil.copy`, :func:`shutil.copy2`, :func:`shutil.copytree` and :func:`shutil.move` use platform-specific - "fast-copy" syscalls on Linux, macOS and Solaris in order to copy the file + "fast-copy" syscalls on Linux and macOS in order to copy the file more efficiently. "fast-copy" means that the copying operation occurs within the kernel, avoiding the use of userspace buffers in Python as in diff --git a/Lib/shutil.py b/Lib/shutil.py index 2dfae87c9ce9..dae916b41605 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -50,7 +50,7 @@ import nt COPY_BUFSIZE = 1024 * 1024 if _WINDOWS else 64 * 1024 -_HAS_SENDFILE = posix and hasattr(os, "sendfile") +_USE_CP_SENDFILE = hasattr(os, "sendfile") and sys.platform.startswith("linux") _HAS_FCOPYFILE = posix and hasattr(posix, "_fcopyfile") # macOS __all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", @@ -111,7 +111,7 @@ def _fastcopy_fcopyfile(fsrc, fdst, flags): def _fastcopy_sendfile(fsrc, fdst): """Copy data from one regular mmap-like fd to another by using high-performance sendfile(2) syscall. - This should work on Linux >= 2.6.33 and Solaris only. + This should work on Linux >= 2.6.33 only. """ # Note: copyfileobj() is left alone in order to not introduce any # unexpected breakage. Possible risks by using zero-copy calls @@ -122,7 +122,7 @@ def _fastcopy_sendfile(fsrc, fdst): # GzipFile (which decompresses data), HTTPResponse (which decodes # chunks). # - possibly others (e.g. encrypted fs/partition?) - global _HAS_SENDFILE + global _USE_CP_SENDFILE try: infd = fsrc.fileno() outfd = fdst.fileno() @@ -152,7 +152,7 @@ def _fastcopy_sendfile(fsrc, fdst): # sendfile() on this platform (probably Linux < 2.6.33) # does not support copies between regular files (only # sockets). - _HAS_SENDFILE = False + _USE_CP_SENDFILE = False raise _GiveupOnFastCopy(err) if err.errno == errno.ENOSPC: # filesystem is full @@ -260,8 +260,8 @@ def copyfile(src, dst, *, follow_symlinks=True): return dst except _GiveupOnFastCopy: pass - # Linux / Solaris - elif _HAS_SENDFILE: + # Linux + elif _USE_CP_SENDFILE: try: _fastcopy_sendfile(fsrc, fdst) return dst diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index eeebb97ff692..208718bb1281 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -2315,7 +2315,7 @@ def test_file2file_not_supported(self): # Emulate a case where sendfile() only support file->socket # fds. In such a case copyfile() is supposed to skip the # fast-copy attempt from then on. - assert shutil._HAS_SENDFILE + assert shutil._USE_CP_SENDFILE try: with unittest.mock.patch( self.PATCHPOINT, @@ -2324,13 +2324,13 @@ def test_file2file_not_supported(self): with self.assertRaises(_GiveupOnFastCopy): shutil._fastcopy_sendfile(src, dst) assert m.called - assert not shutil._HAS_SENDFILE + assert not shutil._USE_CP_SENDFILE with unittest.mock.patch(self.PATCHPOINT) as m: shutil.copyfile(TESTFN, TESTFN2) assert not m.called finally: - shutil._HAS_SENDFILE = True + shutil._USE_CP_SENDFILE = True @unittest.skipIf(not MACOS, 'macOS only') diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 3d5e6336246e..f4b0a0483300 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -4450,7 +4450,7 @@ data_received() being called before connection_made(). :func:`shutil.copyfile`, :func:`shutil.copy`, :func:`shutil.copy2`, :func:`shutil.copytree` and :func:`shutil.move` use platform-specific -fast-copy syscalls on Linux, Solaris and macOS in order to copy the file +fast-copy syscalls on Linux and macOS in order to copy the file more efficiently. On Windows :func:`shutil.copyfile` uses a bigger default buffer size (1 MiB instead of 16 KiB) and a :func:`memoryview`-based variant of :func:`shutil.copyfileobj` is used. The speedup for copying a 512MiB file From webhook-mailer at python.org Thu May 30 03:35:50 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Thu, 30 May 2019 07:35:50 -0000 Subject: [Python-checkins] autoreconf (GH-13651) Message-ID: https://github.com/python/cpython/commit/bee31ce775ec70013d360b353572bd1a01d78e67 commit: bee31ce775ec70013d360b353572bd1a01d78e67 branch: master author: Inada Naoki committer: GitHub date: 2019-05-30T16:35:41+09:00 summary: autoreconf (GH-13651) files: M configure diff --git a/configure b/configure index cc18322d7514..cacf9fc41894 100755 --- a/configure +++ b/configure @@ -11483,9 +11483,9 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \ if_nameindex \ - initgroups kill killpg lchmod lchown lockf linkat lstat lutimes madvise mmap \ + initgroups kill killpg lchmod lchown lockf linkat lstat lutimes mmap \ memrchr mbrtowc mkdirat mkfifo \ - mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ + madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ From webhook-mailer at python.org Thu May 30 03:59:08 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 30 May 2019 07:59:08 -0000 Subject: [Python-checkins] bpo-36935: Remove usage of the deprecated PyErr_SetFromWindowsErrWithUnicodeFilename() (GH-13355) Message-ID: https://github.com/python/cpython/commit/eda385c0dca62f97a8ae80feb57c2a51df3c807f commit: eda385c0dca62f97a8ae80feb57c2a51df3c807f branch: master author: Zackery Spytz committer: Victor Stinner date: 2019-05-30T09:58:50+02:00 summary: bpo-36935: Remove usage of the deprecated PyErr_SetFromWindowsErrWithUnicodeFilename() (GH-13355) In e895de3e7f3cc2f7213b87621cfe9812ea4343f0, the deprecated function PyErr_SetFromWindowsErrWithUnicodeFilename() was added in two functions in Modules/_winapi.c. This function was deprecated in 3.3. files: M Modules/_winapi.c diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 1317fc9a172c..e9dcec6590b6 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -508,7 +508,9 @@ _winapi_CreateFileMapping_impl(PyObject *module, HANDLE file_handle, Py_END_ALLOW_THREADS if (handle == NULL) { - PyErr_SetFromWindowsErrWithUnicodeFilename(0, name); + PyObject *temp = PyUnicode_FromWideChar(name, -1); + PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError, 0, temp); + Py_XDECREF(temp); handle = INVALID_HANDLE_VALUE; } @@ -1405,7 +1407,9 @@ _winapi_OpenFileMapping_impl(PyObject *module, DWORD desired_access, Py_END_ALLOW_THREADS if (handle == NULL) { - PyErr_SetFromWindowsErrWithUnicodeFilename(0, name); + PyObject *temp = PyUnicode_FromWideChar(name, -1); + PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError, 0, temp); + Py_XDECREF(temp); handle = INVALID_HANDLE_VALUE; } From webhook-mailer at python.org Thu May 30 05:27:12 2019 From: webhook-mailer at python.org (Christian Heimes) Date: Thu, 30 May 2019 09:27:12 -0000 Subject: [Python-checkins] bpo-37098: Skip memfd_create test before Linux 3.17 (GH-13677) Message-ID: https://github.com/python/cpython/commit/6eb814b8ce9a4fed8773a65501fb96aad8b3ecf2 commit: 6eb814b8ce9a4fed8773a65501fb96aad8b3ecf2 branch: master author: Christian Heimes committer: GitHub date: 2019-05-30T11:27:06+02:00 summary: bpo-37098: Skip memfd_create test before Linux 3.17 (GH-13677) files: A Misc/NEWS.d/next/Tests/2019-05-30-10-57-39.bpo-37098.SfXt1M.rst M Lib/test/test_os.py diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 820c99c7a07c..f17a19a7585d 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3123,6 +3123,7 @@ def test_stty_match(self): @unittest.skipUnless(hasattr(os, 'memfd_create'), 'requires os.memfd_create') + at support.requires_linux_version(3, 17) class MemfdCreateTests(unittest.TestCase): def test_memfd_create(self): fd = os.memfd_create("Hi", os.MFD_CLOEXEC) diff --git a/Misc/NEWS.d/next/Tests/2019-05-30-10-57-39.bpo-37098.SfXt1M.rst b/Misc/NEWS.d/next/Tests/2019-05-30-10-57-39.bpo-37098.SfXt1M.rst new file mode 100644 index 000000000000..84e06e71869f --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-30-10-57-39.bpo-37098.SfXt1M.rst @@ -0,0 +1 @@ +Fix test_memfd_create on older Linux Kernels. From webhook-mailer at python.org Thu May 30 06:00:33 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 10:00:33 -0000 Subject: [Python-checkins] bpo-37015: Ensure tasks created by _accept_connection2 due to AsyncMock are completed (GH-13661) Message-ID: https://github.com/python/cpython/commit/0f39c2b1919727904f4fac2d79cb41dc6bfe41fe commit: 0f39c2b1919727904f4fac2d79cb41dc6bfe41fe branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-30T03:00:29-07:00 summary: bpo-37015: Ensure tasks created by _accept_connection2 due to AsyncMock are completed (GH-13661) >From 3.8 async functions used with mock.patch return an `AsyncMock`. `_accept_connection2` is an async function where create_task is also mocked. Don't mock `create_task` so that tasks are created out of coroutine returned by `AsyncMock` and the tasks are completed. https://bugs.python.org/issue37015 files: M Lib/test/test_asyncio/test_selector_events.py diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index 2e52e9df5c3b..68b7853b2eba 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -363,14 +363,16 @@ def test_accept_connection_multiple(self): sock.accept.return_value = (mock.Mock(), mock.Mock()) backlog = 100 # Mock the coroutine generation for a connection to prevent - # warnings related to un-awaited coroutines. + # warnings related to un-awaited coroutines. _accept_connection2 + # is an async function that is patched with AsyncMock. create_task + # creates a task out of coroutine returned by AsyncMock, so use + # asyncio.sleep(0) to ensure created tasks are complete to avoid + # task pending warnings. mock_obj = mock.patch.object with mock_obj(self.loop, '_accept_connection2') as accept2_mock: - accept2_mock.return_value = None - with mock_obj(self.loop, 'create_task') as task_mock: - task_mock.return_value = None - self.loop._accept_connection( - mock.Mock(), sock, backlog=backlog) + self.loop._accept_connection( + mock.Mock(), sock, backlog=backlog) + self.loop.run_until_complete(asyncio.sleep(0)) self.assertEqual(sock.accept.call_count, backlog) From webhook-mailer at python.org Thu May 30 06:43:34 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Thu, 30 May 2019 10:43:34 -0000 Subject: [Python-checkins] bpo-36974: inherit the vectorcall protocol (GH-13498) Message-ID: https://github.com/python/cpython/commit/735e8afa9ee942367b5d0807633a2b9f662cbdbf commit: 735e8afa9ee942367b5d0807633a2b9f662cbdbf branch: master author: Jeroen Demeyer committer: Petr Viktorin date: 2019-05-30T12:43:19+02:00 summary: bpo-36974: inherit the vectorcall protocol (GH-13498) files: M Lib/test/test_capi.py M Modules/_testcapimodule.c M Objects/typeobject.c diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 0813abb9a697..795aa78d8866 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -27,6 +27,7 @@ # Were we compiled --with-pydebug or with #define Py_DEBUG? Py_DEBUG = hasattr(sys, 'gettotalrefcount') +Py_TPFLAGS_HAVE_VECTORCALL = 1 << 11 Py_TPFLAGS_METHOD_DESCRIPTOR = 1 << 17 @@ -484,6 +485,27 @@ class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): pass self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + def test_vectorcall_flag(self): + self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + self.assertTrue(_testcapi.MethodDescriptor2.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + + # Heap type should not inherit Py_TPFLAGS_HAVE_VECTORCALL + class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): + pass + self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + + def test_vectorcall_override(self): + # Check that tp_call can correctly override vectorcall. + # MethodDescriptorNopGet implements tp_call but it inherits from + # MethodDescriptorBase, which implements vectorcall. Since + # MethodDescriptorNopGet returns the args tuple when called, we check + # additionally that no new tuple is created for this call. + args = tuple(range(5)) + f = _testcapi.MethodDescriptorNopGet() + self.assertIs(f(*args), args) + def test_vectorcall(self): # Test a bunch of different ways to call objects: # 1. normal call @@ -498,7 +520,10 @@ def test_vectorcall(self): ([].append, (0,), {}, None), (sum, ([36],), {"start":6}, 42), (testfunction, (42,), {}, 42), - (testfunction_kw, (42,), {"kw":None}, 42)] + (testfunction_kw, (42,), {"kw":None}, 42), + (_testcapi.MethodDescriptorBase(), (0,), {}, True), + (_testcapi.MethodDescriptorDerived(), (0,), {}, True), + (_testcapi.MethodDescriptor2(), (0,), {}, False)] from _testcapi import pyobject_vectorcall, pyvectorcall_call from types import MethodType diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index f2f418c997ab..a7451c66359d 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5814,6 +5814,29 @@ static PyTypeObject Generic_Type = { /* Test PEP 590 */ +typedef struct { + PyObject_HEAD + vectorcallfunc vectorcall; +} MethodDescriptorObject; + +static PyObject * +MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + /* True if using the vectorcall function in MethodDescriptorObject + * but False for MethodDescriptor2Object */ + MethodDescriptorObject *md = (MethodDescriptorObject *)callable; + return PyBool_FromLong(md->vectorcall != NULL); +} + +static PyObject * +MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw) +{ + MethodDescriptorObject *op = PyObject_New(MethodDescriptorObject, type); + op->vectorcall = MethodDescriptor_vectorcall; + return (PyObject *)op; +} + static PyObject * func_descr_get(PyObject *func, PyObject *obj, PyObject *type) { @@ -5831,10 +5854,22 @@ nop_descr_get(PyObject *func, PyObject *obj, PyObject *type) return func; } +static PyObject * +call_return_args(PyObject *self, PyObject *args, PyObject *kwargs) +{ + Py_INCREF(args); + return args; +} + static PyTypeObject MethodDescriptorBase_Type = { PyVarObject_HEAD_INIT(NULL, 0) "MethodDescriptorBase", - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_METHOD_DESCRIPTOR, + sizeof(MethodDescriptorObject), + .tp_new = MethodDescriptor_new, + .tp_call = PyVectorcall_Call, + .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_METHOD_DESCRIPTOR | _Py_TPFLAGS_HAVE_VECTORCALL, .tp_descr_get = func_descr_get, }; @@ -5848,9 +5883,34 @@ static PyTypeObject MethodDescriptorNopGet_Type = { PyVarObject_HEAD_INIT(NULL, 0) "MethodDescriptorNopGet", .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .tp_call = call_return_args, .tp_descr_get = nop_descr_get, }; +typedef struct { + MethodDescriptorObject base; + vectorcallfunc vectorcall; +} MethodDescriptor2Object; + +static PyObject * +MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw) +{ + MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type); + op->base.vectorcall = NULL; + op->vectorcall = MethodDescriptor_vectorcall; + return (PyObject *)op; +} + +static PyTypeObject MethodDescriptor2_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethodDescriptor2", + sizeof(MethodDescriptor2Object), + .tp_new = MethodDescriptor2_new, + .tp_call = PyVectorcall_Call, + .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | _Py_TPFLAGS_HAVE_VECTORCALL, +}; + static struct PyModuleDef _testcapimodule = { PyModuleDef_HEAD_INIT, @@ -5916,6 +5976,12 @@ PyInit__testcapi(void) Py_INCREF(&MethodDescriptorNopGet_Type); PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type); + MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type; + if (PyType_Ready(&MethodDescriptor2_Type) < 0) + return NULL; + Py_INCREF(&MethodDescriptor2_Type); + PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type); + if (PyType_Ready(&GenericAlias_Type) < 0) return NULL; Py_INCREF(&GenericAlias_Type); diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 071ff27d5323..ac5a68681d15 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5147,6 +5147,17 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) COPYSLOT(tp_repr); /* tp_hash see tp_richcompare */ COPYSLOT(tp_call); + /* Inherit tp_vectorcall_offset and _Py_TPFLAGS_HAVE_VECTORCALL if tp_call + * was inherited, but only for extension types */ + if ((base->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) && + !(type->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) && + !(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && + base->tp_call && + type->tp_call == base->tp_call) + { + type->tp_vectorcall_offset = base->tp_vectorcall_offset; + type->tp_flags |= _Py_TPFLAGS_HAVE_VECTORCALL; + } COPYSLOT(tp_str); { /* Copy comparison-related slots only when From webhook-mailer at python.org Thu May 30 06:44:03 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Thu, 30 May 2019 10:44:03 -0000 Subject: [Python-checkins] bpo-36974: remove _PyObject_HasFastCall (GH-13460) Message-ID: https://github.com/python/cpython/commit/c145f3bfbe80d498d40848450d4d33c14e2cf782 commit: c145f3bfbe80d498d40848450d4d33c14e2cf782 branch: master author: Jeroen Demeyer committer: Petr Viktorin date: 2019-05-30T12:43:58+02:00 summary: bpo-36974: remove _PyObject_HasFastCall (GH-13460) files: M Include/cpython/abstract.h M Modules/_functoolsmodule.c M Objects/call.c diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 7099178f8208..7ab2045923d8 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -55,10 +55,6 @@ PyAPI_FUNC(int) _PyStack_UnpackDict( 40 bytes on the stack. */ #define _PY_FASTCALL_SMALL_STACK 5 -/* Return 1 if callable supports FASTCALL calling convention for positional - arguments: see _PyObject_Vectorcall() and _PyObject_FastCallDict() */ -PyAPI_FUNC(int) _PyObject_HasFastCall(PyObject *callable); - PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where); diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 13f2db939bb7..213fb3ea336c 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -107,7 +107,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) return NULL; } - pto->use_fastcall = _PyObject_HasFastCall(func); + pto->use_fastcall = (_PyVectorcall_Function(func) != NULL); return (PyObject *)pto; } @@ -365,7 +365,7 @@ partial_setstate(partialobject *pto, PyObject *state) Py_INCREF(dict); Py_INCREF(fn); - pto->use_fastcall = _PyObject_HasFastCall(fn); + pto->use_fastcall = (_PyVectorcall_Function(fn) != NULL); Py_SETREF(pto->fn, fn); Py_SETREF(pto->args, fnargs); Py_SETREF(pto->kw, kw); diff --git a/Objects/call.c b/Objects/call.c index 183a5c2e5a24..55dfc520f1de 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -9,22 +9,6 @@ static PyObject * cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs); -int -_PyObject_HasFastCall(PyObject *callable) -{ - if (PyFunction_Check(callable)) { - return 1; - } - else if (PyCFunction_Check(callable)) { - return !(PyCFunction_GET_FLAGS(callable) & METH_VARARGS); - } - else { - assert (PyCallable_Check(callable)); - return 0; - } -} - - static PyObject * null_error(void) { From webhook-mailer at python.org Thu May 30 07:08:36 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Thu, 30 May 2019 11:08:36 -0000 Subject: [Python-checkins] bpo-20602: Do not clear sys.flags and sys.float_info during shutdown (GH-8096) Message-ID: https://github.com/python/cpython/commit/249b7d59d8038f9017fc95dc28a3ce3494aaf832 commit: 249b7d59d8038f9017fc95dc28a3ce3494aaf832 branch: master author: Zackery Spytz committer: Petr Viktorin date: 2019-05-30T13:08:24+02:00 summary: bpo-20602: Do not clear sys.flags and sys.float_info during shutdown (GH-8096) There is no need to clear these immutable objects during shutdown. files: A Misc/NEWS.d/next/Core and Builtins/2018-07-04-16-57-59.bpo-20602.sDLElw.rst M Lib/test/test_sys.py M Python/import.c diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index c558d116e6fe..49f2722d9514 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -822,6 +822,22 @@ def __del__(self): rc, stdout, stderr = assert_python_ok('-c', code) self.assertEqual(stdout.rstrip(), b'True') + @test.support.requires_type_collecting + def test_issue20602(self): + # sys.flags and sys.float_info were wiped during shutdown. + code = """if 1: + import sys + class A: + def __del__(self, sys=sys): + print(sys.flags) + print(sys.float_info) + a = A() + """ + rc, out, err = assert_python_ok('-c', code) + out = out.splitlines() + self.assertIn(b'sys.flags', out[0]) + self.assertIn(b'sys.float_info', out[1]) + @unittest.skipUnless(hasattr(sys, 'getandroidapilevel'), 'need sys.getandroidapilevel()') def test_getandroidapilevel(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-07-04-16-57-59.bpo-20602.sDLElw.rst b/Misc/NEWS.d/next/Core and Builtins/2018-07-04-16-57-59.bpo-20602.sDLElw.rst new file mode 100644 index 000000000000..ab37a020d803 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-07-04-16-57-59.bpo-20602.sDLElw.rst @@ -0,0 +1,2 @@ +Do not clear :data:`sys.flags` and :data:`sys.float_info` during shutdown. +Patch by Zackery Spytz. diff --git a/Python/import.c b/Python/import.c index 41a5c01cadf3..ab7db6bc17f6 100644 --- a/Python/import.c +++ b/Python/import.c @@ -383,8 +383,6 @@ static const char * const sys_deletes[] = { "last_type", "last_value", "last_traceback", "path_hooks", "path_importer_cache", "meta_path", "__interactivehook__", - /* misc stuff */ - "flags", "float_info", NULL }; From webhook-mailer at python.org Thu May 30 08:01:44 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 12:01:44 -0000 Subject: [Python-checkins] bpo-37099: Silence DeprecationWarning in test_inspect (GH-13679) Message-ID: https://github.com/python/cpython/commit/6d0b7470a4738a403ef48cfd50d9447e0f32f00c commit: 6d0b7470a4738a403ef48cfd50d9447e0f32f00c branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-30T05:01:39-07:00 summary: bpo-37099: Silence DeprecationWarning in test_inspect (GH-13679) Fix DeprecationWarning introduced in aee19f54f6fe45f6b3c906987941e5a8af4468e9 https://bugs.python.org/issue37099 files: M Lib/test/test_inspect.py diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index b3aae3a18ecf..83a5f7ec1f53 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -750,14 +750,16 @@ class D(B, C): pass def assertArgSpecEquals(self, routine, args_e, varargs_e=None, varkw_e=None, defaults_e=None, formatted=None): - args, varargs, varkw, defaults = inspect.getargspec(routine) + with self.assertWarns(DeprecationWarning): + args, varargs, varkw, defaults = inspect.getargspec(routine) self.assertEqual(args, args_e) self.assertEqual(varargs, varargs_e) self.assertEqual(varkw, varkw_e) self.assertEqual(defaults, defaults_e) if formatted is not None: - self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults), - formatted) + with self.assertWarns(DeprecationWarning): + self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults), + formatted) def assertFullArgSpecEquals(self, routine, args_e, varargs_e=None, varkw_e=None, defaults_e=None, @@ -774,9 +776,10 @@ def assertFullArgSpecEquals(self, routine, args_e, varargs_e=None, self.assertEqual(kwonlydefaults, kwonlydefaults_e) self.assertEqual(ann, ann_e) if formatted is not None: - self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults, - kwonlyargs, kwonlydefaults, ann), - formatted) + with self.assertWarns(DeprecationWarning): + self.assertEqual(inspect.formatargspec(args, varargs, varkw, defaults, + kwonlyargs, kwonlydefaults, ann), + formatted) def test_getargspec(self): self.assertArgSpecEquals(mod.eggs, ['x', 'y'], formatted='(x, y)') From webhook-mailer at python.org Thu May 30 09:11:44 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Thu, 30 May 2019 13:11:44 -0000 Subject: [Python-checkins] bpo-36974: rename _FastCallKeywords -> _Vectorcall (GH-13653) Message-ID: https://github.com/python/cpython/commit/37788bc23f6f1ed0362b9b3b248daf296c024849 commit: 37788bc23f6f1ed0362b9b3b248daf296c024849 branch: master author: Jeroen Demeyer committer: Petr Viktorin date: 2019-05-30T15:11:22+02:00 summary: bpo-36974: rename _FastCallKeywords -> _Vectorcall (GH-13653) files: M Include/descrobject.h M Include/funcobject.h M Include/methodobject.h M Objects/call.c M Objects/descrobject.c M Objects/funcobject.c M Objects/methodobject.c M Python/ceval.c M Tools/gdb/libpython.py diff --git a/Include/descrobject.h b/Include/descrobject.h index 3db09635399c..d7114852c1e2 100644 --- a/Include/descrobject.h +++ b/Include/descrobject.h @@ -92,7 +92,7 @@ PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, struct PyGetSetDef *); #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyMethodDescr_FastCallKeywords( +PyAPI_FUNC(PyObject *) _PyMethodDescr_Vectorcall( PyObject *descrobj, PyObject *const *args, size_t nargsf, PyObject *kwnames); PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, struct wrapperbase *, void *); diff --git a/Include/funcobject.h b/Include/funcobject.h index 7ba000e1f13c..e563a74a15b6 100644 --- a/Include/funcobject.h +++ b/Include/funcobject.h @@ -66,7 +66,7 @@ PyAPI_FUNC(PyObject *) _PyFunction_FastCallDict( Py_ssize_t nargs, PyObject *kwargs); -PyAPI_FUNC(PyObject *) _PyFunction_FastCallKeywords( +PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall( PyObject *func, PyObject *const *stack, size_t nargsf, diff --git a/Include/methodobject.h b/Include/methodobject.h index 5dbe2145dadc..e92adde7bf6b 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -47,7 +47,7 @@ PyAPI_FUNC(PyObject *) _PyCFunction_FastCallDict(PyObject *func, Py_ssize_t nargs, PyObject *kwargs); -PyAPI_FUNC(PyObject *) _PyCFunction_FastCallKeywords(PyObject *func, +PyAPI_FUNC(PyObject *) _PyCFunction_Vectorcall(PyObject *func, PyObject *const *stack, size_t nargsf, PyObject *kwnames); diff --git a/Objects/call.c b/Objects/call.c index 55dfc520f1de..acd1f26dcbb5 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -374,8 +374,8 @@ _PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs PyObject * -_PyFunction_FastCallKeywords(PyObject *func, PyObject* const* stack, - size_t nargsf, PyObject *kwnames) +_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack, + size_t nargsf, PyObject *kwnames) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); @@ -714,9 +714,9 @@ _PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self, PyObject * -_PyCFunction_FastCallKeywords(PyObject *func, - PyObject *const *args, size_t nargsf, - PyObject *kwnames) +_PyCFunction_Vectorcall(PyObject *func, + PyObject *const *args, size_t nargsf, + PyObject *kwnames) { PyObject *result; diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 759018503c65..3aaeaa6e890f 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -264,9 +264,9 @@ methoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwargs) // same to methoddescr_call(), but use FASTCALL convention. PyObject * -_PyMethodDescr_FastCallKeywords(PyObject *descrobj, - PyObject *const *args, size_t nargsf, - PyObject *kwnames) +_PyMethodDescr_Vectorcall(PyObject *descrobj, + PyObject *const *args, size_t nargsf, + PyObject *kwnames) { assert(Py_TYPE(descrobj) == &PyMethodDescr_Type); PyMethodDescrObject *descr = (PyMethodDescrObject *)descrobj; @@ -756,7 +756,7 @@ PyDescr_NewMethod(PyTypeObject *type, PyMethodDef *method) type, method->ml_name); if (descr != NULL) { descr->d_method = method; - descr->vectorcall = &_PyMethodDescr_FastCallKeywords; + descr->vectorcall = _PyMethodDescr_Vectorcall; } return (PyObject *)descr; } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 2b1f42db746d..6f5b5d223d9b 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -36,7 +36,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname op->func_defaults = NULL; /* No default arguments */ op->func_kwdefaults = NULL; /* No keyword only defaults */ op->func_closure = NULL; - op->vectorcall = _PyFunction_FastCallKeywords; + op->vectorcall = _PyFunction_Vectorcall; consts = ((PyCodeObject *)code)->co_consts; if (PyTuple_Size(consts) >= 1) { diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 76497c93894a..544baee09113 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -52,7 +52,7 @@ PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) op->vectorcall = NULL; } else { - op->vectorcall = &_PyCFunction_FastCallKeywords; + op->vectorcall = _PyCFunction_Vectorcall; } _PyObject_GC_TRACK(op); return (PyObject *)op; diff --git a/Python/ceval.c b/Python/ceval.c index 47baa4d03ed9..71e6eb8ebcfd 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4815,7 +4815,7 @@ trace_call_function(PyThreadState *tstate, { PyObject *x; if (PyCFunction_Check(func)) { - C_TRACE(x, _PyCFunction_FastCallKeywords(func, args, nargs, kwnames)); + C_TRACE(x, _PyCFunction_Vectorcall(func, args, nargs, kwnames)); return x; } else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) { @@ -4831,9 +4831,9 @@ trace_call_function(PyThreadState *tstate, if (func == NULL) { return NULL; } - C_TRACE(x, _PyCFunction_FastCallKeywords(func, - args+1, nargs-1, - kwnames)); + C_TRACE(x, _PyCFunction_Vectorcall(func, + args+1, nargs-1, + kwnames)); Py_DECREF(func); return x; } diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index d49546fa9c46..93f720ab7e2a 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1564,7 +1564,7 @@ def is_other_python_frame(self): return False if caller in ('_PyCFunction_FastCallDict', - '_PyCFunction_FastCallKeywords', + '_PyCFunction_Vectorcall', 'cfunction_call_varargs'): arg_name = 'func' # Within that frame: From webhook-mailer at python.org Thu May 30 10:59:13 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 14:59:13 -0000 Subject: [Python-checkins] Revert adding @maxking to CODEOWNERS file (GH-13660) Message-ID: https://github.com/python/cpython/commit/25ee0c3bf10820496448e2886069f9c2794be7ac commit: 25ee0c3bf10820496448e2886069f9c2794be7ac branch: master author: Brett Cannon <54418+brettcannon at users.noreply.github.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-30T07:59:01-07:00 summary: Revert adding @maxking to CODEOWNERS file (GH-13660) This reverts commit 71dc7c5fbd856df83202f39c1f41ccd07c6eceb7. Turns out you must have write access for CODEOWNERS to work. files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6a4ca54dd34e..963ab4dcff42 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -44,7 +44,7 @@ Objects/dict* @methane Python/bootstrap_hash.c @python/crypto-team @tiran # Email and related -**/*mail* @python/email-team @maxking +**/*mail* @python/email-team **/*smtp* @python/email-team **/*mime* @python/email-team **/*imap* @python/email-team From webhook-mailer at python.org Thu May 30 11:30:17 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 15:30:17 -0000 Subject: [Python-checkins] bpo-36999: Add asyncio.Task.get_coro() (GH-13680) Message-ID: https://github.com/python/cpython/commit/98ef92002ec289bf8086b0ef3d4f96c2589f4e68 commit: 98ef92002ec289bf8086b0ef3d4f96c2589f4e68 branch: master author: Alex Gr?nholm committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-30T08:30:09-07:00 summary: bpo-36999: Add asyncio.Task.get_coro() (GH-13680) https://bugs.python.org/issue36999 files: A Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst M Doc/library/asyncio-task.rst M Lib/asyncio/tasks.py M Lib/test/test_asyncio/test_tasks.py M Modules/_asynciomodule.c M Modules/clinic/_asynciomodule.c.h diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index d94fa587cd3a..1fcdcb985d88 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -842,6 +842,12 @@ Task Object The *file* argument is an I/O stream to which the output is written; by default output is written to :data:`sys.stderr`. + .. method:: get_coro() + + Return the coroutine object wrapped by the :class:`Task`. + + .. versionadded:: 3.8 + .. method:: get_name() Return the name of the Task. diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 78e76003b3ac..95e85600a2e8 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -152,6 +152,9 @@ def __del__(self): def _repr_info(self): return base_tasks._task_repr_info(self) + def get_coro(self): + return self._coro + def get_name(self): return self._name diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 114dd76687cd..74ce25908a33 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -2425,6 +2425,16 @@ def test_context_3(self): self.assertEqual(cvar.get(), -1) + def test_get_coro(self): + loop = asyncio.new_event_loop() + coro = coroutine_function() + try: + task = self.new_task(loop, coro) + loop.run_until_complete(task) + self.assertIs(task.get_coro(), coro) + finally: + loop.close() + def add_subclass_tests(cls): BaseTask = cls.Task diff --git a/Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst b/Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst new file mode 100644 index 000000000000..5c897fb4dbc7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst @@ -0,0 +1,2 @@ +Add the ``asyncio.Task.get_coro()`` method to publicly expose the tasks's +coroutine object. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index d8b631b7c7a2..281161b68611 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -2313,6 +2313,18 @@ _asyncio_Task_set_exception(TaskObj *self, PyObject *exception) return NULL; } +/*[clinic input] +_asyncio.Task.get_coro +[clinic start generated code]*/ + +static PyObject * +_asyncio_Task_get_coro_impl(TaskObj *self) +/*[clinic end generated code: output=bcac27c8cc6c8073 input=d2e8606c42a7b403]*/ +{ + Py_INCREF(self->task_coro); + return self->task_coro; +} + /*[clinic input] _asyncio.Task.get_name [clinic start generated code]*/ @@ -2439,6 +2451,7 @@ static PyMethodDef TaskType_methods[] = { _ASYNCIO_TASK__REPR_INFO_METHODDEF _ASYNCIO_TASK_GET_NAME_METHODDEF _ASYNCIO_TASK_SET_NAME_METHODDEF + _ASYNCIO_TASK_GET_CORO_METHODDEF {NULL, NULL} /* Sentinel */ }; diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h index 87669f7c9f32..b9daee6aae96 100644 --- a/Modules/clinic/_asynciomodule.c.h +++ b/Modules/clinic/_asynciomodule.c.h @@ -569,6 +569,23 @@ PyDoc_STRVAR(_asyncio_Task_set_exception__doc__, #define _ASYNCIO_TASK_SET_EXCEPTION_METHODDEF \ {"set_exception", (PyCFunction)_asyncio_Task_set_exception, METH_O, _asyncio_Task_set_exception__doc__}, +PyDoc_STRVAR(_asyncio_Task_get_coro__doc__, +"get_coro($self, /)\n" +"--\n" +"\n"); + +#define _ASYNCIO_TASK_GET_CORO_METHODDEF \ + {"get_coro", (PyCFunction)_asyncio_Task_get_coro, METH_NOARGS, _asyncio_Task_get_coro__doc__}, + +static PyObject * +_asyncio_Task_get_coro_impl(TaskObj *self); + +static PyObject * +_asyncio_Task_get_coro(TaskObj *self, PyObject *Py_UNUSED(ignored)) +{ + return _asyncio_Task_get_coro_impl(self); +} + PyDoc_STRVAR(_asyncio_Task_get_name__doc__, "get_name($self, /)\n" "--\n" @@ -815,4 +832,4 @@ _asyncio__leave_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, exit: return return_value; } -/*[clinic end generated code: output=e3b02d96da56e80c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=51c50219f6a0863a input=a9049054013a1b77]*/ From webhook-mailer at python.org Thu May 30 13:58:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 17:58:57 -0000 Subject: [Python-checkins] Fix audit event typo : urllib.request -> urllib.Request (GH-13550) Message-ID: https://github.com/python/cpython/commit/1b69c09248c4b51962933e3551f1ae6fc11369b6 commit: 1b69c09248c4b51962933e3551f1ae6fc11369b6 branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-30T10:58:27-07:00 summary: Fix audit event typo : urllib.request -> urllib.Request (GH-13550) As per the PEP and the [audit event raised](https://github.com/python/cpython/blob/13d4e6a4a090031f8214e058ed3c8fd47767e05f/Lib/urllib/request.py#L524) in urllib.request this should be `urllib.Request` cc: @zooba files: M Doc/library/urllib.request.rst diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 1895ae74b4f5..a53c969ec629 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -95,10 +95,10 @@ The :mod:`urllib.request` module defines the following functions: parameter to ``urllib.urlopen``, can be obtained by using :class:`ProxyHandler` objects. - .. audit-event:: urllib.request "fullurl data headers method" + .. audit-event:: urllib.Request "fullurl data headers method" The default opener raises an :func:`auditing event ` - ``urllib.request`` with arguments ``fullurl``, ``data``, ``headers``, + ``urllib.Request`` with arguments ``fullurl``, ``data``, ``headers``, ``method`` taken from the request object. .. versionchanged:: 3.2 From webhook-mailer at python.org Thu May 30 15:31:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 19:31:57 -0000 Subject: [Python-checkins] bpo-5028: fix doc bug for tokenize (GH-11683) Message-ID: https://github.com/python/cpython/commit/1e36f75d634383eb243aa1798c0f2405c9ceb5d4 commit: 1e36f75d634383eb243aa1798c0f2405c9ceb5d4 branch: master author: Andrew Carr committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-30T12:31:51-07:00 summary: bpo-5028: fix doc bug for tokenize (GH-11683) https://bugs.python.org/issue5028 files: M Doc/library/tokenize.rst M Lib/lib2to3/pgen2/tokenize.py M Lib/tokenize.py diff --git a/Doc/library/tokenize.rst b/Doc/library/tokenize.rst index 111289c767f3..c89d3d4b082f 100644 --- a/Doc/library/tokenize.rst +++ b/Doc/library/tokenize.rst @@ -39,7 +39,7 @@ The primary entry point is a :term:`generator`: column where the token begins in the source; a 2-tuple ``(erow, ecol)`` of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed (the last tuple item) - is the *logical* line; continuation lines are included. The 5 tuple is + is the *physical* line; continuation lines are included. The 5 tuple is returned as a :term:`named tuple` with the field names: ``type string start end line``. diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py index 279d322971da..0f9fde3fb0d5 100644 --- a/Lib/lib2to3/pgen2/tokenize.py +++ b/Lib/lib2to3/pgen2/tokenize.py @@ -346,7 +346,7 @@ def generate_tokens(readline): column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the - logical line; continuation lines are included. + physical line; continuation lines are included. """ lnum = parenlev = continued = 0 contstr, needcont = '', 0 diff --git a/Lib/tokenize.py b/Lib/tokenize.py index 0f9d5dd554d5..738fb71d188b 100644 --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -415,7 +415,7 @@ def tokenize(readline): column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the - logical line; continuation lines are included. + physical line; continuation lines are included. The first token sequence will always be an ENCODING token which tells you which encoding was used to decode the bytes stream. From webhook-mailer at python.org Thu May 30 16:19:45 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Thu, 30 May 2019 20:19:45 -0000 Subject: [Python-checkins] bpo-30969: Fix docs about the comparison in absence of __contains__ (GH-2761) Message-ID: https://github.com/python/cpython/commit/2f5b9dcc0a89cbde1499c76df81c36bfd5ef9aa8 commit: 2f5b9dcc0a89cbde1499c76df81c36bfd5ef9aa8 branch: master author: Antti Haapala committer: Cheryl Sabella date: 2019-05-30T16:19:28-04:00 summary: bpo-30969: Fix docs about the comparison in absence of __contains__ (GH-2761) files: M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 52b41929d7bc..8b7110615240 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1563,14 +1563,15 @@ y`` returns ``True`` if ``y.__contains__(x)`` returns a true value, and ``False`` otherwise. For user-defined classes which do not define :meth:`__contains__` but do define -:meth:`__iter__`, ``x in y`` is ``True`` if some value ``z`` with ``x == z`` is -produced while iterating over ``y``. If an exception is raised during the -iteration, it is as if :keyword:`in` raised that exception. +:meth:`__iter__`, ``x in y`` is ``True`` if some value ``z``, for which the +expression ``x is z or x == z`` is true, is produced while iterating over ``y``. +If an exception is raised during the iteration, it is as if :keyword:`in` raised +that exception. Lastly, the old-style iteration protocol is tried: if a class defines :meth:`__getitem__`, ``x in y`` is ``True`` if and only if there is a non-negative -integer index *i* such that ``x == y[i]``, and all lower integer indices do not -raise :exc:`IndexError` exception. (If any other exception is raised, it is as +integer index *i* such that ``x is y[i] or x == y[i]``, and no lower integer index +raises the :exc:`IndexError` exception. (If any other exception is raised, it is as if :keyword:`in` raised that exception). .. index:: From webhook-mailer at python.org Thu May 30 16:41:26 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 20:41:26 -0000 Subject: [Python-checkins] bpo-30969: Fix docs about the comparison in absence of __contains__ (GH-2761) Message-ID: https://github.com/python/cpython/commit/e8661c1dabc206bf7fe6e302e38fa426aa734dd0 commit: e8661c1dabc206bf7fe6e302e38fa426aa734dd0 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-30T13:41:06-07:00 summary: bpo-30969: Fix docs about the comparison in absence of __contains__ (GH-2761) (cherry picked from commit 2f5b9dcc0a89cbde1499c76df81c36bfd5ef9aa8) Co-authored-by: Antti Haapala files: M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 3fb27c8a8031..990600ec1888 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1568,14 +1568,15 @@ y`` returns ``True`` if ``y.__contains__(x)`` returns a true value, and ``False`` otherwise. For user-defined classes which do not define :meth:`__contains__` but do define -:meth:`__iter__`, ``x in y`` is ``True`` if some value ``z`` with ``x == z`` is -produced while iterating over ``y``. If an exception is raised during the -iteration, it is as if :keyword:`in` raised that exception. +:meth:`__iter__`, ``x in y`` is ``True`` if some value ``z``, for which the +expression ``x is z or x == z`` is true, is produced while iterating over ``y``. +If an exception is raised during the iteration, it is as if :keyword:`in` raised +that exception. Lastly, the old-style iteration protocol is tried: if a class defines :meth:`__getitem__`, ``x in y`` is ``True`` if and only if there is a non-negative -integer index *i* such that ``x == y[i]``, and all lower integer indices do not -raise :exc:`IndexError` exception. (If any other exception is raised, it is as +integer index *i* such that ``x is y[i] or x == y[i]``, and no lower integer index +raises the :exc:`IndexError` exception. (If any other exception is raised, it is as if :keyword:`in` raised that exception). .. index:: From webhook-mailer at python.org Thu May 30 17:42:36 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 21:42:36 -0000 Subject: [Python-checkins] bpo-36342: Fix test_multiprocessing in test_venv (GH-12513) Message-ID: https://github.com/python/cpython/commit/5437ccca1424e415a938c583df43d8cc74047d16 commit: 5437ccca1424e415a938c583df43d8cc74047d16 branch: master author: xdegaye committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-30T14:42:29-07:00 summary: bpo-36342: Fix test_multiprocessing in test_venv (GH-12513) when platform lacks a functioning sem_open implementation https://bugs.python.org/issue36342 files: A Misc/NEWS.d/next/Tests/2019-03-23-13-58-49.bpo-36342.q6Quiq.rst M Lib/test/test_venv.py diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 6822d567e42b..278c68699d8e 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -14,7 +14,8 @@ import sys import tempfile from test.support import (captured_stdout, captured_stderr, requires_zlib, - can_symlink, EnvironmentVarGuard, rmtree) + can_symlink, EnvironmentVarGuard, rmtree, + import_module) import threading import unittest import venv @@ -315,6 +316,10 @@ def test_multiprocessing(self): """ Test that the multiprocessing is able to spawn. """ + # Issue bpo-36342: Instanciation of a Pool object imports the + # multiprocessing.synchronize module. Skip the test if this module + # cannot be imported. + import_module('multiprocessing.synchronize') rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir) envpy = os.path.join(os.path.realpath(self.env_dir), diff --git a/Misc/NEWS.d/next/Tests/2019-03-23-13-58-49.bpo-36342.q6Quiq.rst b/Misc/NEWS.d/next/Tests/2019-03-23-13-58-49.bpo-36342.q6Quiq.rst new file mode 100644 index 000000000000..a7c92980fd77 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-23-13-58-49.bpo-36342.q6Quiq.rst @@ -0,0 +1 @@ +Fix test_multiprocessing in test_venv if platform lacks functioning sem_open. From webhook-mailer at python.org Thu May 30 17:45:53 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 21:45:53 -0000 Subject: [Python-checkins] bpo-36953: Delay removal of ABCs from collections. (GH-13409) Message-ID: https://github.com/python/cpython/commit/eea47e09394dfb64d3a59a601d947d25bb1bdc96 commit: eea47e09394dfb64d3a59a601d947d25bb1bdc96 branch: master author: Matthias Bussonnier committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-30T14:45:48-07:00 summary: bpo-36953: Delay removal of ABCs from collections. (GH-13409) Bump the removal to 3.9, indicate collections.abc available since 3.3, replace version-changed directive to deprecated-removed. https://bugs.python.org/issue36953 files: A Misc/NEWS.d/next/Library/2019-05-20-08-54-41.bpo-36952.I_glok.rst M Doc/library/collections.rst M Lib/collections/__init__.py diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index ae21db216fde..ec921d79d0c4 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -33,10 +33,10 @@ Python's general purpose built-in containers, :class:`dict`, :class:`list`, :class:`UserString` wrapper around string objects for easier string subclassing ===================== ==================================================================== -.. versionchanged:: 3.3 +.. deprecated-removed:: 3.3 3.9 Moved :ref:`collections-abstract-base-classes` to the :mod:`collections.abc` module. For backwards compatibility, they continue to be visible in this module through - Python 3.7. Subsequently, they will be removed entirely. + Python 3.8. :class:`ChainMap` objects diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index cb7f1bb1fcfe..5b740d84c275 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -47,8 +47,8 @@ def __getattr__(name): obj = getattr(_collections_abc, name) import warnings warnings.warn("Using or importing the ABCs from 'collections' instead " - "of from 'collections.abc' is deprecated, " - "and in 3.8 it will stop working", + "of from 'collections.abc' is deprecated since Python 3.3," + "and in 3.9 it will stop working", DeprecationWarning, stacklevel=2) globals()[name] = obj return obj diff --git a/Misc/NEWS.d/next/Library/2019-05-20-08-54-41.bpo-36952.I_glok.rst b/Misc/NEWS.d/next/Library/2019-05-20-08-54-41.bpo-36952.I_glok.rst new file mode 100644 index 000000000000..eeb4fd71e67b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-20-08-54-41.bpo-36952.I_glok.rst @@ -0,0 +1,5 @@ +Starting with Python 3.3, importing ABCs from :mod:`collections` is +deprecated, and import should be done from :mod:`collections.abc`. Still +being able to import from :mod:`collections` was marked for removal in 3.8, +but has been delayed to 3.9; documentation and ``DeprecationWarning`` +clarified. From webhook-mailer at python.org Thu May 30 18:06:45 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 May 2019 22:06:45 -0000 Subject: [Python-checkins] bpo-5028: Fix up rest of documentation for tokenize documenting line (GH-13686) Message-ID: https://github.com/python/cpython/commit/2a58b0636d1f620f8a85a2e4c030cc10551936a5 commit: 2a58b0636d1f620f8a85a2e4c030cc10551936a5 branch: master author: Anthony Sottile committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-30T15:06:32-07:00 summary: bpo-5028: Fix up rest of documentation for tokenize documenting line (GH-13686) https://bugs.python.org/issue5028 files: M Doc/library/tokenize.rst M Lib/lib2to3/pgen2/tokenize.py M Lib/tokenize.py diff --git a/Doc/library/tokenize.rst b/Doc/library/tokenize.rst index c89d3d4b082f..b208ba46d17d 100644 --- a/Doc/library/tokenize.rst +++ b/Doc/library/tokenize.rst @@ -39,8 +39,8 @@ The primary entry point is a :term:`generator`: column where the token begins in the source; a 2-tuple ``(erow, ecol)`` of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed (the last tuple item) - is the *physical* line; continuation lines are included. The 5 tuple is - returned as a :term:`named tuple` with the field names: + is the *physical* line. The 5 tuple is returned as a :term:`named tuple` + with the field names: ``type string start end line``. The returned :term:`named tuple` has an additional property named diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py index 0f9fde3fb0d5..7924ff3cd582 100644 --- a/Lib/lib2to3/pgen2/tokenize.py +++ b/Lib/lib2to3/pgen2/tokenize.py @@ -346,7 +346,7 @@ def generate_tokens(readline): column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the - physical line; continuation lines are included. + physical line. """ lnum = parenlev = continued = 0 contstr, needcont = '', 0 diff --git a/Lib/tokenize.py b/Lib/tokenize.py index 738fb71d188b..1aee21b5e18f 100644 --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -415,7 +415,7 @@ def tokenize(readline): column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the - physical line; continuation lines are included. + physical line. The first token sequence will always be an ENCODING token which tells you which encoding was used to decode the bytes stream. From webhook-mailer at python.org Thu May 30 19:10:16 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Thu, 30 May 2019 23:10:16 -0000 Subject: [Python-checkins] bpo-29262: Add get_origin() and get_args() introspection helpers to typing (GH-13685) Message-ID: https://github.com/python/cpython/commit/4c23aff065fb28aba789a211937a2af974842110 commit: 4c23aff065fb28aba789a211937a2af974842110 branch: master author: Ivan Levkivskyi committer: GitHub date: 2019-05-31T00:10:07+01:00 summary: bpo-29262: Add get_origin() and get_args() introspection helpers to typing (GH-13685) This is an old feature request that appears from time to time. After a year of experimenting with various introspection capabilities in `typing_inspect` on PyPI, I propose to add these two most commonly used functions: `get_origin()` and `get_args()`. These are essentially thin public wrappers around private APIs: `__origin__` and `__args__`. As discussed in the issue and on the typing tracker, exposing some public helpers instead of `__origin__` and `__args__` directly will give us more flexibility if we will decide to update the internal representation, while still maintaining backwards compatibility. The implementation is very simple an is essentially a copy from `typing_inspect` with one exception: `ClassVar` was special-cased in `typing_inspect`, but I think this special-casing doesn't really help and only makes things more complicated. files: A Misc/NEWS.d/next/Library/2019-05-30-21-25-14.bpo-29262.LdIzun.rst M Doc/library/typing.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 709580ad2159..2575a995817d 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1021,6 +1021,25 @@ The module defines the following classes, functions and decorators: a dictionary constructed by merging all the ``__annotations__`` along ``C.__mro__`` in reverse order. +.. function:: get_origin(typ) +.. function:: get_args(typ) + + Provide basic introspection for generic types and special typing forms. + + For a typing object of the form ``X[Y, Z, ...]`` these functions return + ``X`` and ``(Y, Z, ...)``. If ``X`` is a generic alias for a builtin or + :mod:`collections` class, it gets normalized to the original class. + For unsupported objects return ``None`` and ``()`` correspondingly. + Examples:: + + assert get_origin(Dict[str, int]) is dict + assert get_args(Dict[int, str]) == (int, str) + + assert get_origin(Union[int, str]) is Union + assert get_args(Union[int, str]) == (int, str) + + .. versionadded:: 3.8 + .. decorator:: overload The ``@overload`` decorator allows describing functions and methods diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index f9c18c84c8f9..a65d639fe9e1 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -15,6 +15,7 @@ from typing import Generic, ClassVar, Final, final, Protocol from typing import cast, runtime_checkable from typing import get_type_hints +from typing import get_origin, get_args from typing import no_type_check, no_type_check_decorator from typing import Type from typing import NewType @@ -2735,6 +2736,42 @@ def test_get_type_hints_ClassVar(self): self.assertEqual(gth(G), {'lst': ClassVar[List[T]]}) +class GetUtilitiesTestCase(TestCase): + def test_get_origin(self): + T = TypeVar('T') + class C(Generic[T]): pass + self.assertIs(get_origin(C[int]), C) + self.assertIs(get_origin(C[T]), C) + self.assertIs(get_origin(int), None) + self.assertIs(get_origin(ClassVar[int]), ClassVar) + self.assertIs(get_origin(Union[int, str]), Union) + self.assertIs(get_origin(Literal[42, 43]), Literal) + self.assertIs(get_origin(Final[List[int]]), Final) + self.assertIs(get_origin(Generic), Generic) + self.assertIs(get_origin(Generic[T]), Generic) + self.assertIs(get_origin(List[Tuple[T, T]][int]), list) + + def test_get_args(self): + T = TypeVar('T') + class C(Generic[T]): pass + self.assertEqual(get_args(C[int]), (int,)) + self.assertEqual(get_args(C[T]), (T,)) + self.assertEqual(get_args(int), ()) + self.assertEqual(get_args(ClassVar[int]), (int,)) + self.assertEqual(get_args(Union[int, str]), (int, str)) + self.assertEqual(get_args(Literal[42, 43]), (42, 43)) + self.assertEqual(get_args(Final[List[int]]), (List[int],)) + self.assertEqual(get_args(Union[int, Tuple[T, int]][str]), + (int, Tuple[str, int])) + self.assertEqual(get_args(typing.Dict[int, Tuple[T, T]][Optional[int]]), + (int, Tuple[Optional[int], Optional[int]])) + self.assertEqual(get_args(Callable[[], T][int]), ([], int,)) + self.assertEqual(get_args(Union[int, Callable[[Tuple[T, ...]], str]]), + (int, Callable[[Tuple[T, ...]], str])) + self.assertEqual(get_args(Tuple[int, ...]), (int, ...)) + self.assertEqual(get_args(Tuple[()]), ((),)) + + class CollectionsAbcTests(BaseTestCase): def test_hashable(self): diff --git a/Lib/typing.py b/Lib/typing.py index 3b4e9df0482e..16ccfad049f4 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -99,6 +99,8 @@ 'AnyStr', 'cast', 'final', + 'get_args', + 'get_origin', 'get_type_hints', 'NewType', 'no_type_check', @@ -1253,6 +1255,46 @@ def get_type_hints(obj, globalns=None, localns=None): return hints +def get_origin(tp): + """Get the unsubscripted version of a type. + + This supports generic types, Callable, Tuple, Union, Literal, Final and ClassVar. + Return None for unsupported types. Examples:: + + get_origin(Literal[42]) is Literal + get_origin(int) is None + get_origin(ClassVar[int]) is ClassVar + get_origin(Generic) is Generic + get_origin(Generic[T]) is Generic + get_origin(Union[T, int]) is Union + get_origin(List[Tuple[T, T]][int]) == list + """ + if isinstance(tp, _GenericAlias): + return tp.__origin__ + if tp is Generic: + return Generic + return None + + +def get_args(tp): + """Get type arguments with all substitutions performed. + + For unions, basic simplifications used by Union constructor are performed. + Examples:: + get_args(Dict[str, int]) == (str, int) + get_args(int) == () + get_args(Union[int, Union[T, int], str][int]) == (int, str) + get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) + get_args(Callable[[], T][int]) == ([], int) + """ + if isinstance(tp, _GenericAlias): + res = tp.__args__ + if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis: + res = (list(res[:-1]), res[-1]) + return res + return () + + def no_type_check(arg): """Decorator to indicate that annotations are not type hints. diff --git a/Misc/NEWS.d/next/Library/2019-05-30-21-25-14.bpo-29262.LdIzun.rst b/Misc/NEWS.d/next/Library/2019-05-30-21-25-14.bpo-29262.LdIzun.rst new file mode 100644 index 000000000000..e1154ef575a5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-30-21-25-14.bpo-29262.LdIzun.rst @@ -0,0 +1 @@ +Add ``get_origin()`` and ``get_args()`` introspection helpers to ``typing`` module. \ No newline at end of file From webhook-mailer at python.org Thu May 30 22:13:55 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Fri, 31 May 2019 02:13:55 -0000 Subject: [Python-checkins] bpo-36974: tp_print -> tp_vectorcall_offset and tp_reserved -> tp_as_async (GH-13464) Message-ID: https://github.com/python/cpython/commit/530f506ac91338b55cf2be71b1cdf50cb077512f commit: 530f506ac91338b55cf2be71b1cdf50cb077512f branch: master author: Jeroen Demeyer committer: Benjamin Peterson date: 2019-05-30T19:13:39-07:00 summary: bpo-36974: tp_print -> tp_vectorcall_offset and tp_reserved -> tp_as_async (GH-13464) Automatically replace tp_print -> tp_vectorcall_offset tp_compare -> tp_as_async tp_reserved -> tp_as_async files: M Modules/_blake2/blake2b_impl.c M Modules/_blake2/blake2s_impl.c M Modules/_bz2module.c M Modules/_collectionsmodule.c M Modules/_csv.c M Modules/_ctypes/_ctypes.c M Modules/_ctypes/callbacks.c M Modules/_ctypes/callproc.c M Modules/_ctypes/cfield.c M Modules/_ctypes/stgdict.c M Modules/_cursesmodule.c M Modules/_datetimemodule.c M Modules/_dbmmodule.c M Modules/_decimal/_decimal.c M Modules/_elementtree.c M Modules/_functoolsmodule.c M Modules/_gdbmmodule.c M Modules/_hashopenssl.c M Modules/_io/bufferedio.c M Modules/_io/bytesio.c M Modules/_io/fileio.c M Modules/_io/iobase.c M Modules/_io/stringio.c M Modules/_io/textio.c M Modules/_io/winconsoleio.c M Modules/_json.c M Modules/_lsprof.c M Modules/_lzmamodule.c M Modules/_multiprocessing/semaphore.c M Modules/_operator.c M Modules/_pickle.c M Modules/_queuemodule.c M Modules/_randommodule.c M Modules/_sha3/sha3module.c M Modules/_sqlite/cache.c M Modules/_sqlite/connection.c M Modules/_sqlite/cursor.c M Modules/_sqlite/prepare_protocol.c M Modules/_sqlite/row.c M Modules/_sqlite/statement.c M Modules/_sre.c M Modules/_ssl.c M Modules/_struct.c M Modules/_testbuffer.c M Modules/_testcapimodule.c M Modules/_threadmodule.c M Modules/_winapi.c M Modules/_xxsubinterpretersmodule.c M Modules/arraymodule.c M Modules/cjkcodecs/multibytecodec.c M Modules/itertoolsmodule.c M Modules/md5module.c M Modules/mmapmodule.c M Modules/ossaudiodev.c M Modules/overlapped.c M Modules/parsermodule.c M Modules/posixmodule.c M Modules/pyexpat.c M Modules/selectmodule.c M Modules/sha1module.c M Modules/sha256module.c M Modules/sha512module.c M Modules/socketmodule.c M Modules/unicodedata.c M Modules/xxmodule.c M Modules/xxsubtype.c M Modules/zlibmodule.c M Objects/boolobject.c M Objects/bytearrayobject.c M Objects/bytesobject.c M Objects/capsule.c M Objects/cellobject.c M Objects/classobject.c M Objects/codeobject.c M Objects/complexobject.c M Objects/descrobject.c M Objects/dictobject.c M Objects/enumobject.c M Objects/exceptions.c M Objects/fileobject.c M Objects/floatobject.c M Objects/frameobject.c M Objects/funcobject.c M Objects/genobject.c M Objects/interpreteridobject.c M Objects/iterobject.c M Objects/listobject.c M Objects/longobject.c M Objects/memoryobject.c M Objects/methodobject.c M Objects/moduleobject.c M Objects/namespaceobject.c M Objects/object.c M Objects/odictobject.c M Objects/rangeobject.c M Objects/setobject.c M Objects/sliceobject.c M Objects/stringlib/unicode_format.h M Objects/tupleobject.c M Objects/typeobject.c M Objects/unicodeobject.c M Objects/weakrefobject.c M PC/_msi.c M PC/winreg.c M Parser/asdl_c.py M Python/Python-ast.c M Python/bltinmodule.c M Python/symtable.c M Python/traceback.c diff --git a/Modules/_blake2/blake2b_impl.c b/Modules/_blake2/blake2b_impl.c index 788c15c31d8c..edab31ea222a 100644 --- a/Modules/_blake2/blake2b_impl.c +++ b/Modules/_blake2/blake2b_impl.c @@ -401,10 +401,10 @@ PyTypeObject PyBlake2_BLAKE2bType = { sizeof(BLAKE2bObject), /* tp_basicsize */ 0, /* tp_itemsize */ py_blake2b_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /*tp_vectorcall_offset*/ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_blake2/blake2s_impl.c b/Modules/_blake2/blake2s_impl.c index c8bcedeabd57..ef2f7e1980ff 100644 --- a/Modules/_blake2/blake2s_impl.c +++ b/Modules/_blake2/blake2s_impl.c @@ -401,10 +401,10 @@ PyTypeObject PyBlake2_BLAKE2sType = { sizeof(BLAKE2sObject), /* tp_basicsize */ 0, /* tp_itemsize */ py_blake2s_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /*tp_vectorcall_offset*/ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c index b5e5a79d50a5..31bbf6610411 100644 --- a/Modules/_bz2module.c +++ b/Modules/_bz2module.c @@ -349,10 +349,10 @@ static PyTypeObject BZ2Compressor_Type = { sizeof(BZ2Compressor), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)BZ2Compressor_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -690,10 +690,10 @@ static PyTypeObject BZ2Decompressor_Type = { sizeof(BZ2Decompressor), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)BZ2Decompressor_dealloc,/* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index a40b681d2835..dacea3a02439 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1620,10 +1620,10 @@ static PyTypeObject deque_type = { 0, /* tp_itemsize */ /* methods */ (destructor)deque_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ deque_repr, /* tp_repr */ &deque_as_number, /* tp_as_number */ &deque_as_sequence, /* tp_as_sequence */ @@ -1788,10 +1788,10 @@ static PyTypeObject dequeiter_type = { 0, /* tp_itemsize */ /* methods */ (destructor)dequeiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1910,10 +1910,10 @@ static PyTypeObject dequereviter_type = { 0, /* tp_itemsize */ /* methods */ (destructor)dequeiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2189,10 +2189,10 @@ static PyTypeObject defdict_type = { 0, /* tp_itemsize */ /* methods */ (destructor)defdict_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)defdict_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2464,10 +2464,10 @@ static PyTypeObject tuplegetter_type = { 0, /* tp_itemsize */ /* methods */ (destructor)tuplegetter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_csv.c b/Modules/_csv.c index e31b158c601e..7eb9d8b796dd 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -469,10 +469,10 @@ static PyTypeObject Dialect_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)Dialect_dealloc, /* tp_dealloc */ - (printfunc)0, /* tp_print */ + 0, /* tp_vectorcall_offset */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -902,10 +902,10 @@ static PyTypeObject Reader_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)Reader_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ (reprfunc)0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1332,10 +1332,10 @@ static PyTypeObject Writer_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)Writer_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ (reprfunc)0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 21b08f8e332d..f7513a3d74c4 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -165,10 +165,10 @@ static PyTypeObject DictRemover_Type = { sizeof(DictRemoverObject), /* tp_basicsize */ 0, /* tp_itemsize */ _DictRemover_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -855,10 +855,10 @@ PyTypeObject PyCStructType_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -897,10 +897,10 @@ static PyTypeObject UnionType_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -1151,10 +1151,10 @@ PyTypeObject PyCPointerType_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -1573,10 +1573,10 @@ PyTypeObject PyCArrayType_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -2267,10 +2267,10 @@ PyTypeObject PyCSimpleType_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -2503,10 +2503,10 @@ PyTypeObject PyCFuncPtrType_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -2808,10 +2808,10 @@ PyTypeObject PyCData_Type = { sizeof(CDataObject), /* tp_basicsize */ 0, /* tp_itemsize */ PyCData_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4201,10 +4201,10 @@ PyTypeObject PyCFuncPtr_Type = { sizeof(PyCFuncPtrObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)PyCFuncPtr_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)PyCFuncPtr_repr, /* tp_repr */ &PyCFuncPtr_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4355,10 +4355,10 @@ static PyTypeObject Struct_Type = { sizeof(CDataObject), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4397,10 +4397,10 @@ static PyTypeObject Union_Type = { sizeof(CDataObject), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4713,10 +4713,10 @@ PyTypeObject PyCArray_Type = { sizeof(CDataObject), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ &Array_as_sequence, /* tp_as_sequence */ @@ -4932,10 +4932,10 @@ static PyTypeObject Simple_Type = { sizeof(CDataObject), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)&Simple_repr, /* tp_repr */ &Simple_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -5315,10 +5315,10 @@ PyTypeObject PyCPointer_Type = { sizeof(CDataObject), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ &Pointer_as_number, /* tp_as_number */ &Pointer_as_sequence, /* tp_as_sequence */ @@ -5406,10 +5406,10 @@ static PyTypeObject PyComError_Type = { sizeof(PyBaseExceptionObject), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index 9f793c2771bf..97463b599bc0 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -48,10 +48,10 @@ PyTypeObject PyCThunk_Type = { sizeof(CThunkObject), /* tp_basicsize */ sizeof(ffi_type), /* tp_itemsize */ CThunkObject_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 8682d5487220..67665246414e 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -555,10 +555,10 @@ PyTypeObject PyCArg_Type = { sizeof(PyCArgObject), 0, (destructor)PyCArg_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)PyCArg_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 157c32fd9096..95367d509376 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -305,10 +305,10 @@ PyTypeObject PyCField_Type = { sizeof(CFieldObject), /* tp_basicsize */ 0, /* tp_itemsize */ PyCField_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)PyCField_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index 3f8a0316616b..235a4d79ad2c 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -132,10 +132,10 @@ PyTypeObject PyCStgDict_Type = { sizeof(StgDictObject), 0, (destructor)PyCStgDict_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 9a1d2efd256e..2435e1c12955 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -2424,10 +2424,10 @@ PyTypeObject PyCursesWindow_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 83e43a24395b..4d3562cbe64f 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1704,8 +1704,7 @@ build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag) * Miscellaneous helpers. */ -/* For various reasons, we need to use tp_richcompare instead of tp_reserved. - * The comparisons here all most naturally compute a cmp()-like result. +/* The comparisons here all most naturally compute a cmp()-like result. * This little helper turns that into a bool result for rich comparisons. */ static PyObject * @@ -2720,10 +2719,10 @@ static PyTypeObject PyDateTime_DeltaType = { sizeof(PyDateTime_Delta), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)delta_repr, /* tp_repr */ &delta_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3431,10 +3430,10 @@ static PyTypeObject PyDateTime_DateType = { sizeof(PyDateTime_Date), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)date_repr, /* tp_repr */ &date_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3681,10 +3680,10 @@ static PyTypeObject PyDateTime_TZInfoType = { sizeof(PyDateTime_TZInfo), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3920,10 +3919,10 @@ static PyTypeObject PyDateTime_TimeZoneType = { sizeof(PyDateTime_TimeZone), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)timezone_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)timezone_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4583,10 +4582,10 @@ static PyTypeObject PyDateTime_TimeType = { sizeof(PyDateTime_Time), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)time_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)time_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -6299,10 +6298,10 @@ static PyTypeObject PyDateTime_DateTimeType = { sizeof(PyDateTime_DateTime), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)datetime_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)datetime_repr, /* tp_repr */ &datetime_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 21784ae2ce4f..ea0a9d6fc957 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -390,10 +390,10 @@ static PyTypeObject Dbmtype = { sizeof(dbmobject), 0, (destructor)dbm_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ &dbm_as_sequence, /*tp_as_sequence*/ diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index d977b14f5b0c..e2ac19800315 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -672,10 +672,10 @@ static PyTypeObject PyDecSignalDictMixin_Type = sizeof(PyDecSignalDictObject), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ (getattrfunc) 0, /* tp_getattr */ (setattrfunc) 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc) signaldict_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1665,10 +1665,10 @@ static PyTypeObject PyDecContextManager_Type = sizeof(PyDecContextManagerObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) ctxmanager_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ (getattrfunc) 0, /* tp_getattr */ (setattrfunc) 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc) 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4694,10 +4694,10 @@ static PyTypeObject PyDec_Type = sizeof(PyDecObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) dec_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ (getattrfunc) 0, /* tp_getattr */ (setattrfunc) 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc) dec_repr, /* tp_repr */ &dec_number_methods, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -5380,10 +5380,10 @@ static PyTypeObject PyDecContext_Type = sizeof(PyDecContextObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) context_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ (getattrfunc) 0, /* tp_getattr */ (setattrfunc) 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc) context_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index b1fb3eeffb11..8119c8b1e2b1 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2322,10 +2322,10 @@ static PyTypeObject ElementIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)elementiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4228,10 +4228,10 @@ static PyTypeObject Element_Type = { "xml.etree.ElementTree.Element", sizeof(ElementObject), 0, /* methods */ (destructor)element_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)element_repr, /* tp_repr */ 0, /* tp_as_number */ &element_as_sequence, /* tp_as_sequence */ @@ -4280,10 +4280,10 @@ static PyTypeObject TreeBuilder_Type = { "xml.etree.ElementTree.TreeBuilder", sizeof(TreeBuilderObject), 0, /* methods */ (destructor)treebuilder_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4330,10 +4330,10 @@ static PyTypeObject XMLParser_Type = { "xml.etree.ElementTree.XMLParser", sizeof(XMLParserObject), 0, /* methods */ (destructor)xmlparser_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 213fb3ea336c..aca5bad23f58 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -386,10 +386,10 @@ static PyTypeObject partial_type = { 0, /* tp_itemsize */ /* methods */ (destructor)partial_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)partial_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -478,10 +478,10 @@ static PyTypeObject keyobject_type = { 0, /* tp_itemsize */ /* methods */ (destructor)keyobject_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -709,10 +709,10 @@ static PyTypeObject lru_list_elem_type = { 0, /* tp_itemsize */ /* methods */ (destructor)lru_list_elem_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1319,10 +1319,10 @@ static PyTypeObject lru_cache_type = { 0, /* tp_itemsize */ /* methods */ (destructor)lru_cache_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index adf2a5865bfb..77e788752506 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -520,10 +520,10 @@ static PyTypeObject Dbmtype = { sizeof(dbmobject), 0, (destructor)dbm_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ &dbm_as_sequence, /*tp_as_sequence*/ diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index e560c18b63c3..a806241897fc 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -368,10 +368,10 @@ static PyTypeObject EVPtype = { 0, /*tp_itemsize*/ /* methods */ (destructor)EVP_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ (reprfunc)EVP_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 9c0eeb56860e..44e12db6a30e 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2328,10 +2328,10 @@ PyTypeObject PyBufferedIOBase_Type = { 0, /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -2418,10 +2418,10 @@ PyTypeObject PyBufferedReader_Type = { sizeof(buffered), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)buffered_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ (reprfunc)buffered_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -2504,10 +2504,10 @@ PyTypeObject PyBufferedWriter_Type = { sizeof(buffered), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)buffered_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ (reprfunc)buffered_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -2581,10 +2581,10 @@ PyTypeObject PyBufferedRWPair_Type = { sizeof(rwpair), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)bufferedrwpair_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -2675,10 +2675,10 @@ PyTypeObject PyBufferedRandom_Type = { sizeof(buffered), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)buffered_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ (reprfunc)buffered_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index 55e34c677670..32427e44de5b 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -1002,10 +1002,10 @@ PyTypeObject PyBytesIO_Type = { sizeof(bytesio), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)bytesio_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1102,10 +1102,10 @@ PyTypeObject _PyBytesIOBuffer_Type = { sizeof(bytesiobuf), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)bytesiobuf_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 582a8130f622..7f784a34c30d 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -1185,10 +1185,10 @@ PyTypeObject PyFileIO_Type = { sizeof(fileio), 0, (destructor)fileio_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)fileio_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 8c8112d10f0b..fab450977ffa 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -841,10 +841,10 @@ PyTypeObject PyIOBase_Type = { sizeof(iobase), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)iobase_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1037,10 +1037,10 @@ PyTypeObject PyRawIOBase_Type = { 0, /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c index bb5c3736a77a..9e9724db2d33 100644 --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -1007,10 +1007,10 @@ PyTypeObject PyStringIO_Type = { sizeof(stringio), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)stringio_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 3eb0dcc865ba..73b2756afce5 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -169,10 +169,10 @@ PyTypeObject PyTextIOBase_Type = { 0, /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -3158,10 +3158,10 @@ PyTypeObject PyIncrementalNewlineDecoder_Type = { sizeof(nldecoder_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)incrementalnewlinedecoder_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -3242,10 +3242,10 @@ PyTypeObject PyTextIOWrapper_Type = { sizeof(textio), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)textiowrapper_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tps_etattr*/ - 0, /*tp_compare */ + 0, /*tp_as_async*/ (reprfunc)textiowrapper_repr,/*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index 7700bd5b7c0d..ea5d24f950a1 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -1118,10 +1118,10 @@ PyTypeObject PyWindowsConsoleIO_Type = { sizeof(winconsoleio), 0, (destructor)winconsoleio_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)winconsoleio_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_json.c b/Modules/_json.c index 4faa9cc22edf..e3aa997598fc 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1257,10 +1257,10 @@ PyTypeObject PyScannerType = { sizeof(PyScannerObject), /* tp_basicsize */ 0, /* tp_itemsize */ scanner_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1849,10 +1849,10 @@ PyTypeObject PyEncoderType = { sizeof(PyEncoderObject), /* tp_basicsize */ 0, /* tp_itemsize */ encoder_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index c4e0f52389d9..c5a6f4445872 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -754,10 +754,10 @@ static PyTypeObject PyProfiler_Type = { sizeof(ProfilerObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)profiler_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c index 18bc3dc296e0..9e68cbb78af5 100644 --- a/Modules/_lzmamodule.c +++ b/Modules/_lzmamodule.c @@ -823,10 +823,10 @@ static PyTypeObject Compressor_type = { sizeof(Compressor), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Compressor_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1251,10 +1251,10 @@ static PyTypeObject Decompressor_type = { sizeof(Decompressor), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)Decompressor_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index cbcc64cb578f..4be2deae3775 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -633,10 +633,10 @@ PyTypeObject _PyMp_SemLockType = { /* tp_basicsize */ sizeof(SemLockObject), /* tp_itemsize */ 0, /* tp_dealloc */ (destructor)semlock_dealloc, - /* tp_print */ 0, + /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, - /* tp_reserved */ 0, + /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, diff --git a/Modules/_operator.c b/Modules/_operator.c index d291ec1f920e..5aa229fa781e 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -1098,10 +1098,10 @@ static PyTypeObject itemgetter_type = { 0, /* tp_itemsize */ /* methods */ (destructor)itemgetter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)itemgetter_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1443,10 +1443,10 @@ static PyTypeObject attrgetter_type = { 0, /* tp_itemsize */ /* methods */ (destructor)attrgetter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)attrgetter_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1709,10 +1709,10 @@ static PyTypeObject methodcaller_type = { 0, /* tp_itemsize */ /* methods */ (destructor)methodcaller_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)methodcaller_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_pickle.c b/Modules/_pickle.c index a3f02ae8813d..57145beb8fff 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4867,10 +4867,10 @@ static PyTypeObject PicklerMemoProxyType = { sizeof(PicklerMemoProxyObject), /*tp_basicsize*/ 0, (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -5028,10 +5028,10 @@ static PyTypeObject Pickler_Type = { sizeof(PicklerObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)Pickler_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -7404,10 +7404,10 @@ static PyTypeObject UnpicklerMemoProxyType = { sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/ 0, (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -7575,10 +7575,10 @@ static PyTypeObject Unpickler_Type = { sizeof(UnpicklerObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)Unpickler_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index 35906f08c12b..e033da50a5ee 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -313,10 +313,10 @@ static PyTypeObject PySimpleQueueType = { 0, /*tp_itemsize*/ /* methods */ (destructor)simplequeue_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 85f6e4029299..4e9ac4073c77 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -534,10 +534,10 @@ static PyTypeObject Random_Type = { 0, /*tp_itemsize*/ /* methods */ 0, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_sha3/sha3module.c b/Modules/_sha3/sha3module.c index b737363d7172..c1fb6185e243 100644 --- a/Modules/_sha3/sha3module.c +++ b/Modules/_sha3/sha3module.c @@ -493,10 +493,10 @@ static PyGetSetDef SHA3_getseters[] = { 0, /* tp_itemsize */ \ /* methods */ \ (destructor)SHA3_dealloc, /* tp_dealloc */ \ - 0, /* tp_print */ \ + 0, /* tp_vectorcall_offset */ \ 0, /* tp_getattr */ \ 0, /* tp_setattr */ \ - 0, /* tp_reserved */ \ + 0, /* tp_as_async */ \ 0, /* tp_repr */ \ 0, /* tp_as_number */ \ 0, /* tp_as_sequence */ \ diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index 4270473ae994..4d4180421871 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -265,10 +265,10 @@ PyTypeObject pysqlite_NodeType = { sizeof(pysqlite_Node), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)pysqlite_node_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -307,10 +307,10 @@ PyTypeObject pysqlite_CacheType = { sizeof(pysqlite_Cache), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)pysqlite_cache_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index e3340bf19f7b..0d6462ef7dc2 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1838,10 +1838,10 @@ PyTypeObject pysqlite_ConnectionType = { sizeof(pysqlite_Connection), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)pysqlite_connection_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 2bc19311a81d..01b9dc44cb5d 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -922,10 +922,10 @@ PyTypeObject pysqlite_CursorType = { sizeof(pysqlite_Cursor), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)pysqlite_cursor_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c index f2c85f9af6cb..181c7edf96b4 100644 --- a/Modules/_sqlite/prepare_protocol.c +++ b/Modules/_sqlite/prepare_protocol.c @@ -39,10 +39,10 @@ PyTypeObject pysqlite_PrepareProtocolType= { sizeof(pysqlite_PrepareProtocol), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)pysqlite_prepare_protocol_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c index 3cfbeeb93bba..5c2f40082402 100644 --- a/Modules/_sqlite/row.c +++ b/Modules/_sqlite/row.c @@ -231,10 +231,10 @@ PyTypeObject pysqlite_RowType = { sizeof(pysqlite_Row), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)pysqlite_row_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 575ac69d9030..491294b0209c 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -459,10 +459,10 @@ PyTypeObject pysqlite_StatementType = { sizeof(pysqlite_Statement), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)pysqlite_statement_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sre.c b/Modules/_sre.c index 014cc546e345..d4fe588cbe27 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -2594,10 +2594,10 @@ static PyTypeObject Pattern_Type = { "re.Pattern", sizeof(PatternObject), sizeof(SRE_CODE), (destructor)pattern_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)pattern_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2672,10 +2672,10 @@ static PyTypeObject Match_Type = { "re.Match", sizeof(MatchObject), sizeof(Py_ssize_t), (destructor)match_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)match_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2716,10 +2716,10 @@ static PyTypeObject Scanner_Type = { "_" SRE_MODULE ".SRE_Scanner", sizeof(ScannerObject), 0, (destructor)scanner_dealloc,/* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 390a1af1e59d..755097256acb 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2874,10 +2874,10 @@ static PyTypeObject PySSLSocket_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)PySSL_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -4599,10 +4599,10 @@ static PyTypeObject PySSLContext_Type = { sizeof(PySSLContext), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)context_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -4824,10 +4824,10 @@ static PyTypeObject PySSLMemoryBIO_Type = { sizeof(PySSLMemoryBIO), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)memory_bio_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -5021,10 +5021,10 @@ static PyTypeObject PySSLSession_Type = { sizeof(PySSLSession), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)PySSLSession_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/_struct.c b/Modules/_struct.c index 90839b2ead75..9281c6803f3a 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -1669,10 +1669,10 @@ static PyTypeObject unpackiter_type = { sizeof(unpackiterobject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)unpackiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2029,10 +2029,10 @@ PyTypeObject PyStructType = { sizeof(PyStructObject), 0, (destructor)s_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index 9d7b3e8b0b3f..d7d3cc8d0d53 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -2646,10 +2646,10 @@ static PyTypeObject NDArray_Type = { sizeof(NDArrayObject), /* Basic object size */ 0, /* Item size for varobject */ (destructor)ndarray_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ &ndarray_as_sequence, /* tp_as_sequence */ @@ -2766,10 +2766,10 @@ static PyTypeObject StaticArray_Type = { sizeof(StaticArrayObject), /* Basic object size */ 0, /* Item size for varobject */ (destructor)staticarray_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index a7451c66359d..ca6e87b79c47 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -288,10 +288,10 @@ static PyTypeObject _HashInheritanceTester_Type = { sizeof(PyObject), /* Basic object size */ 0, /* Item size for varobject */ (destructor)PyObject_Del, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -5383,10 +5383,10 @@ static PyTypeObject test_structmembersType = { sizeof(test_structmembers), /* tp_basicsize */ 0, /* tp_itemsize */ test_structmembers_free, /* destructor tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -5486,10 +5486,10 @@ static PyTypeObject matmulType = { sizeof(matmulObject), /* tp_basicsize */ 0, /* tp_itemsize */ matmulType_dealloc, /* destructor tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ &matmulType_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -5578,7 +5578,7 @@ static PyTypeObject awaitType = { sizeof(awaitObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)awaitObject_dealloc, /* destructor tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ &awaitType_as_async, /* tp_as_async */ @@ -5623,10 +5623,10 @@ static PyTypeObject PyRecursingInfinitelyError_Type = { sizeof(PyBaseExceptionObject), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -5704,10 +5704,10 @@ static PyTypeObject MyList_Type = { sizeof(MyListObject), 0, (destructor)MyList_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 2b1a98f81b1a..d5e40ef999e3 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -232,10 +232,10 @@ static PyTypeObject Locktype = { 0, /*tp_itemsize*/ /* methods */ (destructor)lock_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ (reprfunc)lock_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -493,10 +493,10 @@ static PyTypeObject RLocktype = { 0, /*tp_itemsize*/ /* methods */ (destructor)rlock_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ (reprfunc)rlock_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -609,10 +609,10 @@ static PyTypeObject localdummytype = { /* tp_basicsize */ sizeof(localdummyobject), /* tp_itemsize */ 0, /* tp_dealloc */ (destructor)localdummy_dealloc, - /* tp_print */ 0, + /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, - /* tp_reserved */ 0, + /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, @@ -874,10 +874,10 @@ static PyTypeObject localtype = { /* tp_basicsize */ sizeof(localobject), /* tp_itemsize */ 0, /* tp_dealloc */ (destructor)local_dealloc, - /* tp_print */ 0, + /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, - /* tp_reserved */ 0, + /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, diff --git a/Modules/_winapi.c b/Modules/_winapi.c index e9dcec6590b6..647075cdb178 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -310,10 +310,10 @@ PyTypeObject OverlappedType = { /* tp_basicsize */ sizeof(OverlappedObject), /* tp_itemsize */ 0, /* tp_dealloc */ (destructor) overlapped_dealloc, - /* tp_print */ 0, + /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, - /* tp_reserved */ 0, + /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 0d8e5f3127d5..19d98fd96934 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -1740,7 +1740,7 @@ static PyTypeObject ChannelIDtype = { sizeof(channelid), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)channelid_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 423cac9910a2..26c90a8a5983 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2839,10 +2839,10 @@ static PyTypeObject Arraytype = { sizeof(arrayobject), 0, (destructor)array_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)array_repr, /* tp_repr */ 0, /* tp_as_number*/ &array_as_sequence, /* tp_as_sequence*/ @@ -2995,10 +2995,10 @@ static PyTypeObject PyArrayIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)arrayiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index f266e5f33a60..c01a0e5dfadf 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -711,10 +711,10 @@ static PyTypeObject MultibyteCodec_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)multibytecodec_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1088,10 +1088,10 @@ static PyTypeObject MultibyteIncrementalEncoder_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)mbiencoder_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1387,10 +1387,10 @@ static PyTypeObject MultibyteIncrementalDecoder_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)mbidecoder_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1734,10 +1734,10 @@ static PyTypeObject MultibyteStreamReader_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)mbstreamreader_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1980,10 +1980,10 @@ static PyTypeObject MultibyteStreamWriter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)mbstreamwriter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 103029d251e0..00e3cbb31b53 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -241,10 +241,10 @@ static PyTypeObject groupby_type = { 0, /* tp_itemsize */ /* methods */ (destructor)groupby_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -390,10 +390,10 @@ static PyTypeObject _grouper_type = { 0, /* tp_itemsize */ /* methods */ (destructor)_grouper_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -636,10 +636,10 @@ static PyTypeObject teedataobject_type = { 0, /* tp_itemsize */ /* methods */ (destructor)teedataobject_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -825,10 +825,10 @@ static PyTypeObject tee_type = { 0, /* tp_itemsize */ /* methods */ (destructor)tee_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1091,10 +1091,10 @@ static PyTypeObject cycle_type = { 0, /* tp_itemsize */ /* methods */ (destructor)cycle_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1258,10 +1258,10 @@ static PyTypeObject dropwhile_type = { 0, /* tp_itemsize */ /* methods */ (destructor)dropwhile_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1420,10 +1420,10 @@ static PyTypeObject takewhile_type = { 0, /* tp_itemsize */ /* methods */ (destructor)takewhile_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1679,10 +1679,10 @@ static PyTypeObject islice_type = { 0, /* tp_itemsize */ /* methods */ (destructor)islice_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1820,10 +1820,10 @@ static PyTypeObject starmap_type = { 0, /* tp_itemsize */ /* methods */ (destructor)starmap_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2041,10 +2041,10 @@ static PyTypeObject chain_type = { 0, /* tp_itemsize */ /* methods */ (destructor)chain_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2394,10 +2394,10 @@ static PyTypeObject product_type = { 0, /* tp_itemsize */ /* methods */ (destructor)product_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2702,10 +2702,10 @@ static PyTypeObject combinations_type = { 0, /* tp_itemsize */ /* methods */ (destructor)combinations_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3026,10 +3026,10 @@ static PyTypeObject cwr_type = { 0, /* tp_itemsize */ /* methods */ (destructor)cwr_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3412,10 +3412,10 @@ static PyTypeObject permutations_type = { 0, /* tp_itemsize */ /* methods */ (destructor)permutations_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3620,10 +3620,10 @@ static PyTypeObject accumulate_type = { 0, /* tp_itemsize */ /* methods */ (destructor)accumulate_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3787,10 +3787,10 @@ static PyTypeObject compress_type = { 0, /* tp_itemsize */ /* methods */ (destructor)compress_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3941,10 +3941,10 @@ static PyTypeObject filterfalse_type = { 0, /* tp_itemsize */ /* methods */ (destructor)filterfalse_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4191,10 +4191,10 @@ static PyTypeObject count_type = { 0, /* tp_itemsize */ /* methods */ (destructor)count_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)count_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4346,10 +4346,10 @@ static PyTypeObject repeat_type = { 0, /* tp_itemsize */ /* methods */ (destructor)repeat_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)repeat_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4623,10 +4623,10 @@ static PyTypeObject ziplongest_type = { 0, /* tp_itemsize */ /* methods */ (destructor)zip_longest_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/md5module.c b/Modules/md5module.c index d377f0bb4615..b9a351a8c1cd 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -469,10 +469,10 @@ static PyTypeObject MD5type = { 0, /*tp_itemsize*/ /* methods */ MD5_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 36cbaf9fb8b2..755f1669d8d3 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -1045,10 +1045,10 @@ static PyTypeObject mmap_object_type = { 0, /* tp_itemsize */ /* methods */ (destructor) mmap_object_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ &mmap_as_sequence, /*tp_as_sequence*/ diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index 2222148c8516..affaf1d9680b 100644 --- a/Modules/ossaudiodev.c +++ b/Modules/ossaudiodev.c @@ -965,10 +965,10 @@ static PyTypeObject OSSAudioType = { 0, /*tp_itemsize*/ /* methods */ (destructor)oss_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -999,10 +999,10 @@ static PyTypeObject OSSMixerType = { 0, /*tp_itemsize*/ /* methods */ (destructor)oss_mixer_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/overlapped.c b/Modules/overlapped.c index aad531e47893..44a0a5a83463 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -1765,10 +1765,10 @@ PyTypeObject OverlappedType = { /* tp_basicsize */ sizeof(OverlappedObject), /* tp_itemsize */ 0, /* tp_dealloc */ (destructor) Overlapped_dealloc, - /* tp_print */ 0, + /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, - /* tp_reserved */ 0, + /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 0f681622f288..36f921419153 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -224,10 +224,10 @@ PyTypeObject PyST_Type = { (int) sizeof(PyST_Object), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)parser_free, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 7588d3cde716..77a3700ab22e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -12580,10 +12580,10 @@ static PyTypeObject DirEntryType = { 0, /* tp_itemsize */ /* methods */ (destructor)DirEntry_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ (reprfunc)DirEntry_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -13018,10 +13018,10 @@ static PyTypeObject ScandirIteratorType = { 0, /* tp_itemsize */ /* methods */ (destructor)ScandirIterator_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 2e8be3706db9..45a1e684d19f 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1468,10 +1468,10 @@ static PyTypeObject Xmlparsetype = { 0, /*tp_itemsize*/ /* methods */ (destructor)xmlparse_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ (reprfunc)0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 88130a1ecda0..ed71d8b0d598 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -2219,10 +2219,10 @@ static PyTypeObject poll_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)poll_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -2265,10 +2265,10 @@ static PyTypeObject devpoll_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)devpoll_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -2317,10 +2317,10 @@ static PyTypeObject pyEpoll_Type = { sizeof(pyEpoll_Object), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)pyepoll_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2363,10 +2363,10 @@ static PyTypeObject kqueue_event_Type = { sizeof(kqueue_event_Object), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)kqueue_event_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2413,10 +2413,10 @@ static PyTypeObject kqueue_queue_Type = { sizeof(kqueue_queue_Object), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)kqueue_queue_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 998ebd437dff..ce2ad267e775 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -446,10 +446,10 @@ static PyTypeObject SHA1type = { 0, /*tp_itemsize*/ /* methods */ SHA1_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 20b5f02f5481..b8d6c4cf8006 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -533,10 +533,10 @@ static PyTypeObject SHA224type = { 0, /*tp_itemsize*/ /* methods */ SHA_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -567,10 +567,10 @@ static PyTypeObject SHA256type = { 0, /*tp_itemsize*/ /* methods */ SHA_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/sha512module.c b/Modules/sha512module.c index e070e4389f4c..98b97917f4ca 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -598,10 +598,10 @@ static PyTypeObject SHA384type = { 0, /*tp_itemsize*/ /* methods */ SHA512_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -632,10 +632,10 @@ static PyTypeObject SHA512type = { 0, /*tp_itemsize*/ /* methods */ SHA512_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index ac1698c6c767..36d13e768cd3 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -5274,10 +5274,10 @@ static PyTypeObject sock_type = { sizeof(PySocketSockObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)sock_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)sock_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 7fdbf332ee74..ae0d4e46f9a4 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1365,10 +1365,10 @@ static PyTypeObject UCD_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)PyObject_Del, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c index d546901582fb..0250031d722d 100644 --- a/Modules/xxmodule.c +++ b/Modules/xxmodule.c @@ -106,10 +106,10 @@ static PyTypeObject Xxo_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)Xxo_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)Xxo_setattr, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -224,10 +224,10 @@ static PyTypeObject Str_Type = { 0, /*tp_itemsize*/ /* methods */ 0, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -279,10 +279,10 @@ static PyTypeObject Null_Type = { 0, /*tp_itemsize*/ /* methods */ 0, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c index bacbdf153618..031005d36e20 100644 --- a/Modules/xxsubtype.c +++ b/Modules/xxsubtype.c @@ -106,10 +106,10 @@ static PyTypeObject spamlist_type = { sizeof(spamlistobject), 0, 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -197,10 +197,10 @@ static PyTypeObject spamdict_type = { sizeof(spamdictobject), 0, 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index 5778dbb715f9..a3d9ed6646de 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -1315,10 +1315,10 @@ static PyTypeObject Comptype = { sizeof(compobject), 0, (destructor)Comp_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1346,10 +1346,10 @@ static PyTypeObject Decomptype = { sizeof(compobject), 0, (destructor)Decomp_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Objects/boolobject.c b/Objects/boolobject.c index 508ea61f1800..720835b98aa6 100644 --- a/Objects/boolobject.c +++ b/Objects/boolobject.c @@ -137,10 +137,10 @@ PyTypeObject PyBool_Type = { sizeof(struct _longobject), 0, 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ bool_repr, /* tp_repr */ &bool_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index b9fcc01b7032..c684db767364 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2265,10 +2265,10 @@ PyTypeObject PyByteArray_Type = { sizeof(PyByteArrayObject), 0, (destructor)bytearray_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)bytearray_repr, /* tp_repr */ &bytearray_as_number, /* tp_as_number */ &bytearray_as_sequence, /* tp_as_sequence */ @@ -2412,10 +2412,10 @@ PyTypeObject PyByteArrayIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)bytearrayiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index bf7c7da423b7..06c87b0c62d3 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2886,10 +2886,10 @@ PyTypeObject PyBytes_Type = { PyBytesObject_SIZE, sizeof(char), 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)bytes_repr, /* tp_repr */ &bytes_as_number, /* tp_as_number */ &bytes_as_sequence, /* tp_as_sequence */ @@ -3165,10 +3165,10 @@ PyTypeObject PyBytesIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)striter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/capsule.c b/Objects/capsule.c index 4e15b440b170..599893a320db 100644 --- a/Objects/capsule.c +++ b/Objects/capsule.c @@ -303,10 +303,10 @@ PyTypeObject PyCapsule_Type = { 0, /*tp_itemsize*/ /* methods */ capsule_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ capsule_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Objects/cellobject.c b/Objects/cellobject.c index 4e359f889fdc..911cf527a434 100644 --- a/Objects/cellobject.c +++ b/Objects/cellobject.c @@ -162,10 +162,10 @@ PyTypeObject PyCell_Type = { sizeof(PyCellObject), 0, (destructor)cell_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)cell_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/classobject.c b/Objects/classobject.c index cfc24460a747..ffd3f875c0e7 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -352,7 +352,7 @@ PyTypeObject PyMethod_Type = { offsetof(PyMethodObject, vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)method_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -621,10 +621,10 @@ PyTypeObject PyInstanceMethod_Type = { sizeof(PyInstanceMethodObject), /* tp_basicsize */ 0, /* tp_itemsize */ instancemethod_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)instancemethod_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 1e76f26d98fe..886ce4194438 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -831,10 +831,10 @@ PyTypeObject PyCode_Type = { sizeof(PyCodeObject), 0, (destructor)code_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)code_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 6d4d8c56f701..a5f95186d625 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -1113,10 +1113,10 @@ PyTypeObject PyComplex_Type = { sizeof(PyComplexObject), 0, 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)complex_repr, /* tp_repr */ &complex_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 3aaeaa6e890f..6c95a8726c42 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -546,7 +546,7 @@ PyTypeObject PyMethodDescr_Type = { offsetof(PyMethodDescrObject, vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)method_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -583,10 +583,10 @@ PyTypeObject PyClassMethodDescr_Type = { sizeof(PyMethodDescrObject), 0, (destructor)descr_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)method_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -620,10 +620,10 @@ PyTypeObject PyMemberDescr_Type = { sizeof(PyMemberDescrObject), 0, (destructor)descr_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)member_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -657,10 +657,10 @@ PyTypeObject PyGetSetDescr_Type = { sizeof(PyGetSetDescrObject), 0, (destructor)descr_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)getset_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -694,10 +694,10 @@ PyTypeObject PyWrapperDescr_Type = { sizeof(PyWrapperDescrObject), 0, (destructor)descr_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)wrapperdescr_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1173,10 +1173,10 @@ PyTypeObject _PyMethodWrapper_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)wrapper_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)wrapper_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1569,10 +1569,10 @@ PyTypeObject PyDictProxy_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)mappingproxy_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)mappingproxy_repr, /* tp_repr */ 0, /* tp_as_number */ &mappingproxy_as_sequence, /* tp_as_sequence */ @@ -1611,10 +1611,10 @@ PyTypeObject PyProperty_Type = { 0, /* tp_itemsize */ /* methods */ property_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 88ac1a9dcd0f..2b04b0b67965 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -3309,10 +3309,10 @@ PyTypeObject PyDict_Type = { sizeof(PyDictObject), 0, (destructor)dict_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)dict_repr, /* tp_repr */ 0, /* tp_as_number */ &dict_as_sequence, /* tp_as_sequence */ @@ -3572,10 +3572,10 @@ PyTypeObject PyDictIterKey_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)dictiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3659,10 +3659,10 @@ PyTypeObject PyDictIterValue_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)dictiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3766,10 +3766,10 @@ PyTypeObject PyDictIterItem_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)dictiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4322,10 +4322,10 @@ PyTypeObject PyDictKeys_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)dictview_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)dictview_repr, /* tp_repr */ &dictviews_as_number, /* tp_as_number */ &dictkeys_as_sequence, /* tp_as_sequence */ @@ -4428,10 +4428,10 @@ PyTypeObject PyDictItems_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)dictview_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)dictview_repr, /* tp_repr */ &dictviews_as_number, /* tp_as_number */ &dictitems_as_sequence, /* tp_as_sequence */ @@ -4509,10 +4509,10 @@ PyTypeObject PyDictValues_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)dictview_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)dictview_repr, /* tp_repr */ 0, /* tp_as_number */ &dictvalues_as_sequence, /* tp_as_sequence */ diff --git a/Objects/enumobject.c b/Objects/enumobject.c index d993a5063fdf..4786297c41ac 100644 --- a/Objects/enumobject.c +++ b/Objects/enumobject.c @@ -211,10 +211,10 @@ PyTypeObject PyEnum_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)enum_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -408,10 +408,10 @@ PyTypeObject PyReversed_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)reversed_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 8456a8f18286..568d4959e3a0 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -369,10 +369,10 @@ static PyTypeObject _PyExc_BaseException = { sizeof(PyBaseExceptionObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)BaseException_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /* tp_reserved; */ + 0, /*tp_as_async*/ (reprfunc)BaseException_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 3b026335d3f8..3791241e5c7c 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -479,10 +479,10 @@ PyTypeObject PyStdPrinter_Type = { 0, /* tp_itemsize */ /* methods */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)stdprinter_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 4ff43bb338f9..2bf7061d4f62 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1913,10 +1913,10 @@ PyTypeObject PyFloat_Type = { sizeof(PyFloatObject), 0, (destructor)float_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)float_repr, /* tp_repr */ &float_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/frameobject.c b/Objects/frameobject.c index b668465df3da..5deb9858ce86 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -565,10 +565,10 @@ PyTypeObject PyFrame_Type = { sizeof(PyFrameObject), sizeof(PyObject *), (destructor)frame_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)frame_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 6f5b5d223d9b..df5cc2d3f570 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -653,7 +653,7 @@ PyTypeObject PyFunction_Type = { offsetof(PyFunctionObject, vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)func_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -825,10 +825,10 @@ PyTypeObject PyClassMethod_Type = { sizeof(classmethod), 0, (destructor)cm_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1005,10 +1005,10 @@ PyTypeObject PyStaticMethod_Type = { sizeof(staticmethod), 0, (destructor)sm_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/genobject.c b/Objects/genobject.c index 0d0a02d76ccf..2d9a2860a3d2 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -728,7 +728,7 @@ PyTypeObject PyGen_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)gen_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ @@ -982,7 +982,7 @@ PyTypeObject PyCoro_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)gen_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ &coro_as_async, /* tp_as_async */ @@ -1079,7 +1079,7 @@ PyTypeObject _PyCoroWrapper_Type = { sizeof(PyCoroWrapper), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)coro_wrapper_dealloc, /* destructor tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ @@ -1378,7 +1378,7 @@ PyTypeObject PyAsyncGen_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)gen_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ &async_gen_as_async, /* tp_as_async */ @@ -1609,7 +1609,7 @@ PyTypeObject _PyAsyncGenASend_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)async_gen_asend_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ &async_gen_asend_as_async, /* tp_as_async */ @@ -1706,7 +1706,7 @@ PyTypeObject _PyAsyncGenWrappedValue_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)async_gen_wrapped_val_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ @@ -1962,7 +1962,7 @@ PyTypeObject _PyAsyncGenAThrow_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)async_gen_athrow_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ &async_gen_athrow_as_async, /* tp_as_async */ diff --git a/Objects/interpreteridobject.c b/Objects/interpreteridobject.c index dd142b043d0a..0a1dfa25795f 100644 --- a/Objects/interpreteridobject.c +++ b/Objects/interpreteridobject.c @@ -236,7 +236,7 @@ PyTypeObject _PyInterpreterID_Type = { sizeof(interpid), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)interpid_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ diff --git a/Objects/iterobject.c b/Objects/iterobject.c index 5bee1e21e65e..da89298edc5c 100644 --- a/Objects/iterobject.c +++ b/Objects/iterobject.c @@ -144,10 +144,10 @@ PyTypeObject PySeqIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)iter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -264,10 +264,10 @@ PyTypeObject PyCallIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)calliter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/listobject.c b/Objects/listobject.c index b210c005da13..233f13dbab0e 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2998,10 +2998,10 @@ PyTypeObject PyList_Type = { sizeof(PyListObject), 0, (destructor)list_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)list_repr, /* tp_repr */ 0, /* tp_as_number */ &list_as_sequence, /* tp_as_sequence */ @@ -3069,10 +3069,10 @@ PyTypeObject PyListIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)listiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3217,10 +3217,10 @@ PyTypeObject PyListRevIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)listreviter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/longobject.c b/Objects/longobject.c index 3ebbd3e7f9c9..5d2b595621f3 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5623,10 +5623,10 @@ PyTypeObject PyLong_Type = { offsetof(PyLongObject, ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ long_to_decimal_string, /* tp_repr */ &long_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 3955c58ee5d2..a873ac1ec1ea 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -147,10 +147,10 @@ PyTypeObject _PyManagedBuffer_Type = { sizeof(_PyManagedBufferObject), 0, (destructor)mbuf_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3155,10 +3155,10 @@ PyTypeObject PyMemoryView_Type = { offsetof(PyMemoryViewObject, ob_array), /* tp_basicsize */ sizeof(Py_ssize_t), /* tp_itemsize */ (destructor)memory_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)memory_repr, /* tp_repr */ 0, /* tp_as_number */ &memory_as_sequence, /* tp_as_sequence */ diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 544baee09113..c3bc0184796e 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -275,7 +275,7 @@ PyTypeObject PyCFunction_Type = { offsetof(PyCFunctionObject, vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)meth_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 20e7d44ab5e1..85134c7a11c6 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -835,10 +835,10 @@ PyTypeObject PyModule_Type = { sizeof(PyModuleObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)module_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)module_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c index aba3ff7b05e9..ddad39a91076 100644 --- a/Objects/namespaceobject.c +++ b/Objects/namespaceobject.c @@ -207,10 +207,10 @@ PyTypeObject _PyNamespace_Type = { sizeof(_PyNamespaceObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)namespace_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)namespace_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/object.c b/Objects/object.c index f9c75b7c6a4e..585a9748c846 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -666,7 +666,7 @@ PyObject_Bytes(PyObject *v) /* For Python 3.0.1 and later, the old three-way comparison has been completely removed in favour of rich comparisons. PyObject_Compare() and PyObject_Cmp() are gone, and the builtin cmp function no longer exists. - The old tp_compare slot has been renamed to tp_reserved, and should no + The old tp_compare slot has been renamed to tp_as_async, and should no longer be used. Use tp_richcompare instead. See (*) below for practical amendments. @@ -1638,10 +1638,10 @@ PyTypeObject _PyNone_Type = { 0, 0, none_dealloc, /*tp_dealloc*/ /*never called*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ none_repr, /*tp_repr*/ &none_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1723,10 +1723,10 @@ PyTypeObject _PyNotImplemented_Type = { 0, 0, notimplemented_dealloc, /*tp_dealloc*/ /*never called*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ NotImplemented_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 773827d85b3a..4c9ae3bc9346 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1551,10 +1551,10 @@ PyTypeObject PyODict_Type = { sizeof(PyODictObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)odict_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)odict_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1823,10 +1823,10 @@ PyTypeObject PyODictIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)odictiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1916,10 +1916,10 @@ PyTypeObject PyODictKeys_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1983,10 +1983,10 @@ PyTypeObject PyODictItems_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2050,10 +2050,10 @@ PyTypeObject PyODictValues_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index ac868f6951c2..239ace6f4235 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -669,10 +669,10 @@ PyTypeObject PyRange_Type = { sizeof(rangeobject), /* Basic object size */ 0, /* Item size for varobject */ (destructor)range_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)range_repr, /* tp_repr */ &range_as_number, /* tp_as_number */ &range_as_sequence, /* tp_as_sequence */ @@ -805,10 +805,10 @@ PyTypeObject PyRangeIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)PyObject_Del, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1008,10 +1008,10 @@ PyTypeObject PyLongRangeIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)longrangeiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/setobject.c b/Objects/setobject.c index 82e9639d2884..bd031600c1be 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -909,10 +909,10 @@ PyTypeObject PySetIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)setiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2118,10 +2118,10 @@ PyTypeObject PySet_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)set_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)set_repr, /* tp_repr */ &set_as_number, /* tp_as_number */ &set_as_sequence, /* tp_as_sequence */ @@ -2216,10 +2216,10 @@ PyTypeObject PyFrozenSet_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)set_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)set_repr, /* tp_repr */ &frozenset_as_number, /* tp_as_number */ &set_as_sequence, /* tp_as_sequence */ @@ -2532,10 +2532,10 @@ static PyTypeObject _PySetDummy_Type = { 0, 0, dummy_dealloc, /*tp_dealloc*/ /*never called*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ dummy_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 2dcb44fdee57..7c10eb6f638d 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -53,10 +53,10 @@ PyTypeObject PyEllipsis_Type = { 0, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /*never called*/ /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ ellipsis_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -625,10 +625,10 @@ PyTypeObject PySlice_Type = { sizeof(PySliceObject), /* Basic object size */ 0, /* Item size for varobject */ (destructor)slice_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)slice_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h index baaac811a56e..0fa54eb32cd3 100644 --- a/Objects/stringlib/unicode_format.h +++ b/Objects/stringlib/unicode_format.h @@ -1066,10 +1066,10 @@ static PyTypeObject PyFormatterIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)formatteriter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1202,10 +1202,10 @@ static PyTypeObject PyFieldNameIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)fieldnameiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 72556adb6207..fc2d2742dd2c 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -830,10 +830,10 @@ PyTypeObject PyTuple_Type = { sizeof(PyTupleObject) - sizeof(PyObject *), sizeof(PyObject *), (destructor)tupledealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)tuplerepr, /* tp_repr */ 0, /* tp_as_number */ &tuple_as_sequence, /* tp_as_sequence */ @@ -1067,10 +1067,10 @@ PyTypeObject PyTupleIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)tupleiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/typeobject.c b/Objects/typeobject.c index ac5a68681d15..64c2ceab5573 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3608,10 +3608,10 @@ PyTypeObject PyType_Type = { sizeof(PyHeapTypeObject), /* tp_basicsize */ sizeof(PyMemberDef), /* tp_itemsize */ (destructor)type_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)type_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4784,10 +4784,10 @@ PyTypeObject PyBaseObject_Type = { sizeof(PyObject), /* tp_basicsize */ 0, /* tp_itemsize */ object_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ object_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -5143,7 +5143,6 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) type->tp_setattr = base->tp_setattr; type->tp_setattro = base->tp_setattro; } - /* tp_reserved is ignored */ COPYSLOT(tp_repr); /* tp_hash see tp_richcompare */ COPYSLOT(tp_call); @@ -7920,10 +7919,10 @@ PyTypeObject PySuper_Type = { 0, /* tp_itemsize */ /* methods */ super_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ super_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index eafda633a3e2..6ec4127ff385 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8106,10 +8106,10 @@ static PyTypeObject EncodingMapType = { 0, /*tp_itemsize*/ /* methods */ 0, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -15155,10 +15155,10 @@ PyTypeObject PyUnicode_Type = { 0, /* tp_itemsize */ /* Slots */ (destructor)unicode_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ unicode_repr, /* tp_repr */ &unicode_as_number, /* tp_as_number */ &unicode_as_sequence, /* tp_as_sequence */ @@ -15483,10 +15483,10 @@ PyTypeObject PyUnicodeIter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)unicodeiter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index ff6d92254f7f..8b8e71031afa 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -354,10 +354,10 @@ _PyWeakref_RefType = { sizeof(PyWeakReference), 0, weakref_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ (reprfunc)weakref_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -674,10 +674,10 @@ _PyWeakref_ProxyType = { 0, /* methods */ (destructor)proxy_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)proxy_repr, /* tp_repr */ &proxy_as_number, /* tp_as_number */ &proxy_as_sequence, /* tp_as_sequence */ @@ -708,10 +708,10 @@ _PyWeakref_CallableProxyType = { 0, /* methods */ (destructor)proxy_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (unaryfunc)proxy_repr, /* tp_repr */ &proxy_as_number, /* tp_as_number */ &proxy_as_sequence, /* tp_as_sequence */ diff --git a/PC/_msi.c b/PC/_msi.c index ae30acbc9b48..4c8df5b42b95 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -491,10 +491,10 @@ static PyTypeObject record_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)msiobj_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -677,10 +677,10 @@ static PyTypeObject summary_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)msiobj_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -826,10 +826,10 @@ static PyTypeObject msiview_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)msiobj_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -944,10 +944,10 @@ static PyTypeObject msidb_Type = { 0, /*tp_itemsize*/ /* methods */ (destructor)msiobj_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ diff --git a/PC/winreg.c b/PC/winreg.c index 5469fcba0444..5f5fc85d2250 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -355,10 +355,10 @@ PyTypeObject PyHKEY_Type = sizeof(PyHKEYObject), 0, PyHKEY_deallocFunc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ &PyHKEY_NumberMethods, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index d84c1b13cf10..582c6ca57b65 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -734,10 +734,10 @@ def visitModule(self, mod): sizeof(AST_object), 0, (destructor)ast_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 7c8e438658f7..dc2b1304f1f2 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -640,10 +640,10 @@ static PyTypeObject AST_type = { sizeof(AST_object), 0, (destructor)ast_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 48dadcc9d496..56d882d387ee 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -611,10 +611,10 @@ PyTypeObject PyFilter_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)filter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1328,10 +1328,10 @@ PyTypeObject PyMap_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)map_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2667,10 +2667,10 @@ PyTypeObject PyZip_Type = { 0, /* tp_itemsize */ /* methods */ (destructor)zip_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Python/symtable.c b/Python/symtable.c index fe6bc9aca4d0..668cc21b2df9 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -140,10 +140,10 @@ PyTypeObject PySTEntry_Type = { sizeof(PySTEntryObject), 0, (destructor)ste_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_reserved */ + 0, /* tp_as_async */ (reprfunc)ste_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Python/traceback.c b/Python/traceback.c index 04b52ad7680a..0463eb6d8c98 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -192,10 +192,10 @@ PyTypeObject PyTraceBack_Type = { sizeof(PyTracebackObject), 0, (destructor)tb_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ + 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_reserved*/ + 0, /*tp_as_async*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ From webhook-mailer at python.org Fri May 31 03:39:36 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Fri, 31 May 2019 07:39:36 -0000 Subject: [Python-checkins] bpo-339827: Do not swallow exceptions in the _ssl module. (GH-12756) Message-ID: https://github.com/python/cpython/commit/65fb2c08c0d66fcf96fb1eb06270feadec830866 commit: 65fb2c08c0d66fcf96fb1eb06270feadec830866 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-05-31T10:39:15+03:00 summary: bpo-339827: Do not swallow exceptions in the _ssl module. (GH-12756) files: M Modules/_ssl.c diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 755097256acb..4fb7dca9bb04 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -590,19 +590,18 @@ fill_and_set_sslerror(PySSLSocket *sslsock, PyObject *type, int ssl_errno, key = Py_BuildValue("ii", lib, reason); if (key == NULL) goto fail; - reason_obj = PyDict_GetItem(err_codes_to_names, key); + reason_obj = PyDict_GetItemWithError(err_codes_to_names, key); Py_DECREF(key); - if (reason_obj == NULL) { - /* XXX if reason < 100, it might reflect a library number (!!) */ - PyErr_Clear(); + if (reason_obj == NULL && PyErr_Occurred()) { + goto fail; } key = PyLong_FromLong(lib); if (key == NULL) goto fail; - lib_obj = PyDict_GetItem(lib_codes_to_names, key); + lib_obj = PyDict_GetItemWithError(lib_codes_to_names, key); Py_DECREF(key); - if (lib_obj == NULL) { - PyErr_Clear(); + if (lib_obj == NULL && PyErr_Occurred()) { + goto fail; } if (errstr == NULL) errstr = ERR_reason_error_string(errcode); @@ -3682,7 +3681,7 @@ _pwinfo_set(_PySSLPasswordInfo *pw_info, PyObject* password, Py_ssize_t size; if (PyUnicode_Check(password)) { - password_bytes = PyUnicode_AsEncodedString(password, NULL, NULL); + password_bytes = PyUnicode_AsUTF8String(password); if (!password_bytes) { goto error; } @@ -3787,13 +3786,17 @@ _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile, if (keyfile == Py_None) keyfile = NULL; if (!PyUnicode_FSConverter(certfile, &certfile_bytes)) { - PyErr_SetString(PyExc_TypeError, - "certfile should be a valid filesystem path"); + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_SetString(PyExc_TypeError, + "certfile should be a valid filesystem path"); + } return NULL; } if (keyfile && !PyUnicode_FSConverter(keyfile, &keyfile_bytes)) { - PyErr_SetString(PyExc_TypeError, - "keyfile should be a valid filesystem path"); + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_SetString(PyExc_TypeError, + "keyfile should be a valid filesystem path"); + } goto error; } if (password && password != Py_None) { @@ -3985,22 +3988,44 @@ _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self, goto error; } if (cafile && !PyUnicode_FSConverter(cafile, &cafile_bytes)) { - PyErr_SetString(PyExc_TypeError, - "cafile should be a valid filesystem path"); + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_SetString(PyExc_TypeError, + "cafile should be a valid filesystem path"); + } goto error; } if (capath && !PyUnicode_FSConverter(capath, &capath_bytes)) { - PyErr_SetString(PyExc_TypeError, - "capath should be a valid filesystem path"); + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_SetString(PyExc_TypeError, + "capath should be a valid filesystem path"); + } goto error; } /* validata cadata type and load cadata */ if (cadata) { - Py_buffer buf; - PyObject *cadata_ascii = NULL; - - if (PyObject_GetBuffer(cadata, &buf, PyBUF_SIMPLE) == 0) { + if (PyUnicode_Check(cadata)) { + PyObject *cadata_ascii = PyUnicode_AsASCIIString(cadata); + if (cadata_ascii == NULL) { + if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) { + goto invalid_cadata; + } + goto error; + } + r = _add_ca_certs(self, + PyBytes_AS_STRING(cadata_ascii), + PyBytes_GET_SIZE(cadata_ascii), + SSL_FILETYPE_PEM); + Py_DECREF(cadata_ascii); + if (r == -1) { + goto error; + } + } + else if (PyObject_CheckBuffer(cadata)) { + Py_buffer buf; + if (PyObject_GetBuffer(cadata, &buf, PyBUF_SIMPLE)) { + goto error; + } if (!PyBuffer_IsContiguous(&buf, 'C') || buf.ndim > 1) { PyBuffer_Release(&buf); PyErr_SetString(PyExc_TypeError, @@ -4013,23 +4038,13 @@ _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self, if (r == -1) { goto error; } - } else { - PyErr_Clear(); - cadata_ascii = PyUnicode_AsASCIIString(cadata); - if (cadata_ascii == NULL) { - PyErr_SetString(PyExc_TypeError, - "cadata should be an ASCII string or a " - "bytes-like object"); - goto error; - } - r = _add_ca_certs(self, - PyBytes_AS_STRING(cadata_ascii), - PyBytes_GET_SIZE(cadata_ascii), - SSL_FILETYPE_PEM); - Py_DECREF(cadata_ascii); - if (r == -1) { - goto error; - } + } + else { + invalid_cadata: + PyErr_SetString(PyExc_TypeError, + "cadata should be an ASCII string or a " + "bytes-like object"); + goto error; } } From webhook-mailer at python.org Fri May 31 03:39:54 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Fri, 31 May 2019 07:39:54 -0000 Subject: [Python-checkins] bpo-36548: Improve the repr of re flags. (GH-12715) Message-ID: https://github.com/python/cpython/commit/14a0e16c8805f7ba7c98132ead815dcfdf0e9d33 commit: 14a0e16c8805f7ba7c98132ead815dcfdf0e9d33 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-05-31T10:39:47+03:00 summary: bpo-36548: Improve the repr of re flags. (GH-12715) files: A Misc/NEWS.d/next/Library/2019-04-07-14-30-10.bpo-36548.CJQiYw.rst M Lib/re.py M Lib/test/test_re.py diff --git a/Lib/re.py b/Lib/re.py index 68d62dc2a93b..8f1d55ddf7d6 100644 --- a/Lib/re.py +++ b/Lib/re.py @@ -141,24 +141,40 @@ __version__ = "2.2.1" class RegexFlag(enum.IntFlag): - ASCII = sre_compile.SRE_FLAG_ASCII # assume ascii "locale" - IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case - LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale - UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode "locale" - MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline - DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline - VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments - A = ASCII - I = IGNORECASE - L = LOCALE - U = UNICODE - M = MULTILINE - S = DOTALL - X = VERBOSE + ASCII = A = sre_compile.SRE_FLAG_ASCII # assume ascii "locale" + IGNORECASE = I = sre_compile.SRE_FLAG_IGNORECASE # ignore case + LOCALE = L = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale + UNICODE = U = sre_compile.SRE_FLAG_UNICODE # assume unicode "locale" + MULTILINE = M = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline + DOTALL = S = sre_compile.SRE_FLAG_DOTALL # make dot match newline + VERBOSE = X = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments # sre extensions (experimental, don't rely on these) - TEMPLATE = sre_compile.SRE_FLAG_TEMPLATE # disable backtracking - T = TEMPLATE + TEMPLATE = T = sre_compile.SRE_FLAG_TEMPLATE # disable backtracking DEBUG = sre_compile.SRE_FLAG_DEBUG # dump pattern after compilation + + def __repr__(self): + if self._name_ is not None: + return f're.{self._name_}' + value = self._value_ + members = [] + negative = value < 0 + if negative: + value = ~value + for m in self.__class__: + if value & m._value_: + value &= ~m._value_ + members.append(f're.{m._name_}') + if value: + members.append(hex(value)) + res = '|'.join(members) + if negative: + if len(members) > 1: + res = f'~({res})' + else: + res = f'~{res}' + return res + __str__ = object.__str__ + globals().update(RegexFlag.__members__) # sre exception diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 137c31de59ae..4817d761a22d 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -2170,6 +2170,18 @@ def test_long_pattern(self): self.assertEqual(r[:30], "re.compile('Very long long lon") self.assertEqual(r[-16:], ", re.IGNORECASE)") + def test_flags_repr(self): + self.assertEqual(repr(re.I), "re.IGNORECASE") + self.assertEqual(repr(re.I|re.S|re.X), + "re.IGNORECASE|re.DOTALL|re.VERBOSE") + self.assertEqual(repr(re.I|re.S|re.X|(1<<20)), + "re.IGNORECASE|re.DOTALL|re.VERBOSE|0x100000") + self.assertEqual(repr(~re.I), "~re.IGNORECASE") + self.assertEqual(repr(~(re.I|re.S|re.X)), + "~(re.IGNORECASE|re.DOTALL|re.VERBOSE)") + self.assertEqual(repr(~(re.I|re.S|re.X|(1<<20))), + "~(re.IGNORECASE|re.DOTALL|re.VERBOSE|0x100000)") + class ImplementationTest(unittest.TestCase): """ diff --git a/Misc/NEWS.d/next/Library/2019-04-07-14-30-10.bpo-36548.CJQiYw.rst b/Misc/NEWS.d/next/Library/2019-04-07-14-30-10.bpo-36548.CJQiYw.rst new file mode 100644 index 000000000000..e72bb9117404 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-07-14-30-10.bpo-36548.CJQiYw.rst @@ -0,0 +1 @@ +Improved the repr of regular expression flags. From webhook-mailer at python.org Fri May 31 04:26:50 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Fri, 31 May 2019 08:26:50 -0000 Subject: [Python-checkins] IDLE - Capitalize search dialogs' 'Close' button label. (#13691) Message-ID: https://github.com/python/cpython/commit/ba0430211f5101c9d748d72b03926ca79c5252a8 commit: ba0430211f5101c9d748d72b03926ca79c5252a8 branch: master author: Terry Jan Reedy committer: GitHub date: 2019-05-31T04:26:35-04:00 summary: IDLE - Capitalize search dialogs' 'Close' button label. (#13691) It seems to be the only widget label not capitalized. files: M Lib/idlelib/idle_test/test_searchbase.py M Lib/idlelib/searchbase.py diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index 09a7fff51de1..6dd4d7933737 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -32,6 +32,7 @@ def setUpClass(cls): @classmethod def tearDownClass(cls): + cls.root.update_idletasks() cls.root.destroy() del cls.root @@ -149,7 +150,7 @@ def test_create_command_buttons(self): # Look for close button command in buttonframe closebuttoncommand = '' for child in self.dialog.buttonframe.winfo_children(): - if child['text'] == 'close': + if child['text'] == 'Close': closebuttoncommand = child['command'] self.assertIn('close', closebuttoncommand) diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index f0e3d6f14ba4..74ba8538512b 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -172,7 +172,7 @@ def create_command_buttons(self): f = self.buttonframe = Frame(self.top) f.grid(row=0,column=2,padx=2,pady=2,ipadx=2,ipady=2) - b = self.make_button("close", self.close) + b = self.make_button("Close", self.close) b.lower() From webhook-mailer at python.org Fri May 31 04:29:44 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Fri, 31 May 2019 08:29:44 -0000 Subject: [Python-checkins] bpo-31829: Make protocol 0 pickles be loadable in text mode in Python 2. (GH-11859) Message-ID: https://github.com/python/cpython/commit/38ab7d4721b422547f7b46b9d68968863fa70573 commit: 38ab7d4721b422547f7b46b9d68968863fa70573 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-05-31T11:29:39+03:00 summary: bpo-31829: Make protocol 0 pickles be loadable in text mode in Python 2. (GH-11859) Escape ``\r``, ``\0`` and ``\x1a`` (end-of-file on Windows) in Unicode strings. files: A Misc/NEWS.d/next/Library/2017-10-21-12-07-56.bpo-31829.6IhP-O.rst M Lib/pickle.py M Lib/test/pickletester.py M Modules/_pickle.c diff --git a/Lib/pickle.py b/Lib/pickle.py index cb768b28586a..a67ac7dd8b68 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -852,7 +852,10 @@ def save_str(self, obj): self.write(BINUNICODE + pack("= 256 || ch == '\\' || ch == '\n') { + else if (ch >= 256 || + ch == '\\' || ch == 0 || ch == '\n' || ch == '\r' || + ch == 0x1a) + { /* -1: subtract 1 preallocated byte */ p = _PyBytesWriter_Prepare(&writer, p, 6-1); if (p == NULL) From webhook-mailer at python.org Fri May 31 04:30:41 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Fri, 31 May 2019 08:30:41 -0000 Subject: [Python-checkins] bpo-26660, bpo-35144: Fix permission errors in TemporaryDirectory cleanup. (GH-10320) Message-ID: https://github.com/python/cpython/commit/e9b51c0ad81da1da11ae65840ac8b50a8521373c commit: e9b51c0ad81da1da11ae65840ac8b50a8521373c branch: master author: Serhiy Storchaka committer: GitHub date: 2019-05-31T11:30:37+03:00 summary: bpo-26660, bpo-35144: Fix permission errors in TemporaryDirectory cleanup. (GH-10320) TemporaryDirectory.cleanup() failed when non-writeable or non-searchable files or directories were created inside a temporary directory. files: A Misc/NEWS.d/next/Library/2018-11-04-16-39-46.bpo-26660.RdXz8a.rst M Lib/shutil.py M Lib/tempfile.py M Lib/test/test_tempfile.py diff --git a/Lib/shutil.py b/Lib/shutil.py index dae916b41605..6486cd6e5d28 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -584,11 +584,16 @@ def _rmtree_safe_fd(topfd, path, onerror): fullname = os.path.join(path, entry.name) try: is_dir = entry.is_dir(follow_symlinks=False) - if is_dir: - orig_st = entry.stat(follow_symlinks=False) - is_dir = stat.S_ISDIR(orig_st.st_mode) except OSError: is_dir = False + else: + if is_dir: + try: + orig_st = entry.stat(follow_symlinks=False) + is_dir = stat.S_ISDIR(orig_st.st_mode) + except OSError: + onerror(os.lstat, fullname, sys.exc_info()) + continue if is_dir: try: dirfd = os.open(entry.name, os.O_RDONLY, dir_fd=topfd) diff --git a/Lib/tempfile.py b/Lib/tempfile.py index a66d6f3750cb..e8b111eae223 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -777,9 +777,39 @@ def __init__(self, suffix=None, prefix=None, dir=None): self, self._cleanup, self.name, warn_message="Implicitly cleaning up {!r}".format(self)) + @classmethod + def _rmtree(cls, name): + def onerror(func, path, exc_info): + if issubclass(exc_info[0], PermissionError): + def resetperms(path): + try: + _os.chflags(path, 0) + except AttributeError: + pass + _os.chmod(path, 0o700) + + try: + if path != name: + resetperms(_os.path.dirname(path)) + resetperms(path) + + try: + _os.unlink(path) + # PermissionError is raised on FreeBSD for directories + except (IsADirectoryError, PermissionError): + cls._rmtree(path) + except FileNotFoundError: + pass + elif issubclass(exc_info[0], FileNotFoundError): + pass + else: + raise + + _shutil.rmtree(name, onerror=onerror) + @classmethod def _cleanup(cls, name, warn_message): - _shutil.rmtree(name) + cls._rmtree(name) _warnings.warn(warn_message, ResourceWarning) def __repr__(self): @@ -793,4 +823,4 @@ def __exit__(self, exc, value, tb): def cleanup(self): if self._finalizer.detach(): - _shutil.rmtree(self.name) + self._rmtree(self.name) diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 489141d6ad72..bd4db839331b 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1297,19 +1297,25 @@ def __exit__(self, *exc_info): class TestTemporaryDirectory(BaseTestCase): """Test TemporaryDirectory().""" - def do_create(self, dir=None, pre="", suf="", recurse=1): + def do_create(self, dir=None, pre="", suf="", recurse=1, dirs=1, files=1): if dir is None: dir = tempfile.gettempdir() tmp = tempfile.TemporaryDirectory(dir=dir, prefix=pre, suffix=suf) self.nameCheck(tmp.name, dir, pre, suf) - # Create a subdirectory and some files - if recurse: - d1 = self.do_create(tmp.name, pre, suf, recurse-1) - d1.name = None - with open(os.path.join(tmp.name, "test.txt"), "wb") as f: - f.write(b"Hello world!") + self.do_create2(tmp.name, recurse, dirs, files) return tmp + def do_create2(self, path, recurse=1, dirs=1, files=1): + # Create subdirectories and some files + if recurse: + for i in range(dirs): + name = os.path.join(path, "dir%d" % i) + os.mkdir(name) + self.do_create2(name, recurse-1, dirs, files) + for i in range(files): + with open(os.path.join(path, "test%d.txt" % i), "wb") as f: + f.write(b"Hello world!") + def test_mkdtemp_failure(self): # Check no additional exception if mkdtemp fails # Previously would raise AttributeError instead @@ -1349,7 +1355,7 @@ def test_cleanup_with_symlink_to_a_directory(self): "TemporaryDirectory %s exists after cleanup" % d1.name) self.assertTrue(os.path.exists(d2.name), "Directory pointed to by a symlink was deleted") - self.assertEqual(os.listdir(d2.name), ['test.txt'], + self.assertEqual(os.listdir(d2.name), ['test0.txt'], "Contents of the directory pointed to by a symlink " "were deleted") d2.cleanup() @@ -1384,7 +1390,7 @@ def test_del_on_shutdown(self): tmp2 = os.path.join(tmp.name, 'test_dir') os.mkdir(tmp2) - with open(os.path.join(tmp2, "test.txt"), "w") as f: + with open(os.path.join(tmp2, "test0.txt"), "w") as f: f.write("Hello world!") {mod}.tmp = tmp @@ -1452,6 +1458,33 @@ def test_context_manager(self): self.assertEqual(name, d.name) self.assertFalse(os.path.exists(name)) + def test_modes(self): + for mode in range(8): + mode <<= 6 + with self.subTest(mode=format(mode, '03o')): + d = self.do_create(recurse=3, dirs=2, files=2) + with d: + # Change files and directories mode recursively. + for root, dirs, files in os.walk(d.name, topdown=False): + for name in files: + os.chmod(os.path.join(root, name), mode) + os.chmod(root, mode) + d.cleanup() + self.assertFalse(os.path.exists(d.name)) + + @unittest.skipUnless(hasattr(os, 'chflags'), 'requires os.lchflags') + def test_flags(self): + flags = stat.UF_IMMUTABLE | stat.UF_NOUNLINK + d = self.do_create(recurse=3, dirs=2, files=2) + with d: + # Change files and directories flags recursively. + for root, dirs, files in os.walk(d.name, topdown=False): + for name in files: + os.chflags(os.path.join(root, name), flags) + os.chflags(root, flags) + d.cleanup() + self.assertFalse(os.path.exists(d.name)) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-11-04-16-39-46.bpo-26660.RdXz8a.rst b/Misc/NEWS.d/next/Library/2018-11-04-16-39-46.bpo-26660.RdXz8a.rst new file mode 100644 index 000000000000..4448bf6b0164 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-04-16-39-46.bpo-26660.RdXz8a.rst @@ -0,0 +1,4 @@ +Fixed permission errors in :class:`~tempfile.TemporaryDirectory` clean up. +Previously ``TemporaryDirectory.cleanup()`` failed when non-writeable or +non-searchable files or directories were created inside a temporary +directory. From webhook-mailer at python.org Fri May 31 04:44:40 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 31 May 2019 08:44:40 -0000 Subject: [Python-checkins] IDLE - Capitalize search dialogs' 'Close' button label. (GH-13691) Message-ID: https://github.com/python/cpython/commit/ee114d7795d3490a98d9a788dc11e6da221b0b9f commit: ee114d7795d3490a98d9a788dc11e6da221b0b9f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-31T01:44:29-07:00 summary: IDLE - Capitalize search dialogs' 'Close' button label. (GH-13691) It seems to be the only widget label not capitalized. (cherry picked from commit ba0430211f5101c9d748d72b03926ca79c5252a8) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/idle_test/test_searchbase.py M Lib/idlelib/searchbase.py diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index 09a7fff51de1..6dd4d7933737 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -32,6 +32,7 @@ def setUpClass(cls): @classmethod def tearDownClass(cls): + cls.root.update_idletasks() cls.root.destroy() del cls.root @@ -149,7 +150,7 @@ def test_create_command_buttons(self): # Look for close button command in buttonframe closebuttoncommand = '' for child in self.dialog.buttonframe.winfo_children(): - if child['text'] == 'close': + if child['text'] == 'Close': closebuttoncommand = child['command'] self.assertIn('close', closebuttoncommand) diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index f0e3d6f14ba4..74ba8538512b 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -172,7 +172,7 @@ def create_command_buttons(self): f = self.buttonframe = Frame(self.top) f.grid(row=0,column=2,padx=2,pady=2,ipadx=2,ipady=2) - b = self.make_button("close", self.close) + b = self.make_button("Close", self.close) b.lower() From webhook-mailer at python.org Fri May 31 05:44:09 2019 From: webhook-mailer at python.org (Christian Heimes) Date: Fri, 31 May 2019 09:44:09 -0000 Subject: [Python-checkins] bpo-34271: Add ssl debugging helpers (GH-10031) Message-ID: https://github.com/python/cpython/commit/c7f7069e77c58e83b847c0bfe4d5aadf6add2e68 commit: c7f7069e77c58e83b847c0bfe4d5aadf6add2e68 branch: master author: Christian Heimes committer: GitHub date: 2019-05-31T11:44:05+02:00 summary: bpo-34271: Add ssl debugging helpers (GH-10031) The ssl module now can dump key material to a keylog file and trace TLS protocol messages with a tracing callback. The default and stdlib contexts also support SSLKEYLOGFILE env var. The msg_callback and related enums are private members. The feature is designed for internal debugging and not for end users. Signed-off-by: Christian Heimes files: A Misc/NEWS.d/next/Library/2018-10-21-17-39-32.bpo-34271.P15VLM.rst A Modules/_ssl/debughelpers.c M Doc/library/ssl.rst M Lib/ssl.py M Lib/test/test_ssl.py M Modules/_ssl.c M setup.py diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 20f572444716..be09f38f7dfa 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -139,6 +139,10 @@ purposes. *cadata* is given) or uses :meth:`SSLContext.load_default_certs` to load default CA certificates. + When :attr:`~SSLContext.keylog_filename` is supported and the environment + variable :envvar:`SSLKEYLOGFILE` is set, :func:`create_default_context` + enables key logging. + .. note:: The protocol, options, cipher and other settings may change to more restrictive values anytime without prior deprecation. The values @@ -172,6 +176,10 @@ purposes. 3DES was dropped from the default cipher string. + .. versionchanged:: 3.8 + + Support for key logging to :envvar:`SSLKEYLOGFILE` was added. + Exceptions ^^^^^^^^^^ @@ -1056,6 +1064,7 @@ Constants SSL 3.0 to TLS 1.3. + SSL Sockets ----------- @@ -1901,6 +1910,20 @@ to speed up repeated connections from the same clients. This features requires OpenSSL 0.9.8f or newer. +.. attribute:: SSLContext.keylog_filename + + Write TLS keys to a keylog file, whenever key material is generated or + received. The keylog file is designed for debugging purposes only. The + file format is specified by NSS and used by many traffic analyzers such + as Wireshark. The log file is opened in append-only mode. Writes are + synchronized between threads, but not between processes. + + .. versionadded:: 3.8 + + .. note:: + + This features requires OpenSSL 1.1.1 or newer. + .. attribute:: SSLContext.maximum_version A :class:`TLSVersion` enum member representing the highest supported diff --git a/Lib/ssl.py b/Lib/ssl.py index 793ed496c77a..f5fa6aeec2d2 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -165,6 +165,90 @@ class TLSVersion(_IntEnum): MAXIMUM_SUPPORTED = _ssl.PROTO_MAXIMUM_SUPPORTED +class _TLSContentType(_IntEnum): + """Content types (record layer) + + See RFC 8446, section B.1 + """ + CHANGE_CIPHER_SPEC = 20 + ALERT = 21 + HANDSHAKE = 22 + APPLICATION_DATA = 23 + # pseudo content types + HEADER = 0x100 + INNER_CONTENT_TYPE = 0x101 + + +class _TLSAlertType(_IntEnum): + """Alert types for TLSContentType.ALERT messages + + See RFC 8466, section B.2 + """ + CLOSE_NOTIFY = 0 + UNEXPECTED_MESSAGE = 10 + BAD_RECORD_MAC = 20 + DECRYPTION_FAILED = 21 + RECORD_OVERFLOW = 22 + DECOMPRESSION_FAILURE = 30 + HANDSHAKE_FAILURE = 40 + NO_CERTIFICATE = 41 + BAD_CERTIFICATE = 42 + UNSUPPORTED_CERTIFICATE = 43 + CERTIFICATE_REVOKED = 44 + CERTIFICATE_EXPIRED = 45 + CERTIFICATE_UNKNOWN = 46 + ILLEGAL_PARAMETER = 47 + UNKNOWN_CA = 48 + ACCESS_DENIED = 49 + DECODE_ERROR = 50 + DECRYPT_ERROR = 51 + EXPORT_RESTRICTION = 60 + PROTOCOL_VERSION = 70 + INSUFFICIENT_SECURITY = 71 + INTERNAL_ERROR = 80 + INAPPROPRIATE_FALLBACK = 86 + USER_CANCELED = 90 + NO_RENEGOTIATION = 100 + MISSING_EXTENSION = 109 + UNSUPPORTED_EXTENSION = 110 + CERTIFICATE_UNOBTAINABLE = 111 + UNRECOGNIZED_NAME = 112 + BAD_CERTIFICATE_STATUS_RESPONSE = 113 + BAD_CERTIFICATE_HASH_VALUE = 114 + UNKNOWN_PSK_IDENTITY = 115 + CERTIFICATE_REQUIRED = 116 + NO_APPLICATION_PROTOCOL = 120 + + +class _TLSMessageType(_IntEnum): + """Message types (handshake protocol) + + See RFC 8446, section B.3 + """ + HELLO_REQUEST = 0 + CLIENT_HELLO = 1 + SERVER_HELLO = 2 + HELLO_VERIFY_REQUEST = 3 + NEWSESSION_TICKET = 4 + END_OF_EARLY_DATA = 5 + HELLO_RETRY_REQUEST = 6 + ENCRYPTED_EXTENSIONS = 8 + CERTIFICATE = 11 + SERVER_KEY_EXCHANGE = 12 + CERTIFICATE_REQUEST = 13 + SERVER_DONE = 14 + CERTIFICATE_VERIFY = 15 + CLIENT_KEY_EXCHANGE = 16 + FINISHED = 20 + CERTIFICATE_URL = 21 + CERTIFICATE_STATUS = 22 + SUPPLEMENTAL_DATA = 23 + KEY_UPDATE = 24 + NEXT_PROTO = 67 + MESSAGE_HASH = 254 + CHANGE_CIPHER_SPEC = 0x0101 + + if sys.platform == "win32": from _ssl import enum_certificates, enum_crls @@ -523,6 +607,83 @@ def hostname_checks_common_name(self, value): def hostname_checks_common_name(self): return True + @property + def _msg_callback(self): + """TLS message callback + + The message callback provides a debugging hook to analyze TLS + connections. The callback is called for any TLS protocol message + (header, handshake, alert, and more), but not for application data. + Due to technical limitations, the callback can't be used to filter + traffic or to abort a connection. Any exception raised in the + callback is delayed until the handshake, read, or write operation + has been performed. + + def msg_cb(conn, direction, version, content_type, msg_type, data): + pass + + conn + :class:`SSLSocket` or :class:`SSLObject` instance + direction + ``read`` or ``write`` + version + :class:`TLSVersion` enum member or int for unknown version. For a + frame header, it's the header version. + content_type + :class:`_TLSContentType` enum member or int for unsupported + content type. + msg_type + Either a :class:`_TLSContentType` enum number for a header + message, a :class:`_TLSAlertType` enum member for an alert + message, a :class:`_TLSMessageType` enum member for other + messages, or int for unsupported message types. + data + Raw, decrypted message content as bytes + """ + inner = super()._msg_callback + if inner is not None: + return inner.user_function + else: + return None + + @_msg_callback.setter + def _msg_callback(self, callback): + if callback is None: + super(SSLContext, SSLContext)._msg_callback.__set__(self, None) + return + + if not hasattr(callback, '__call__'): + raise TypeError(f"{callback} is not callable.") + + def inner(conn, direction, version, content_type, msg_type, data): + try: + version = TLSVersion(version) + except TypeError: + pass + + try: + content_type = _TLSContentType(content_type) + except TypeError: + pass + + if content_type == _TLSContentType.HEADER: + msg_enum = _TLSContentType + elif content_type == _TLSContentType.ALERT: + msg_enum = _TLSAlertType + else: + msg_enum = _TLSMessageType + try: + msg_type = msg_enum(msg_type) + except TypeError: + pass + + return callback(conn, direction, version, + content_type, msg_type, data) + + inner.user_function = callback + + super(SSLContext, SSLContext)._msg_callback.__set__(self, inner) + @property def protocol(self): return _SSLMethod(super().protocol) @@ -576,6 +737,11 @@ def create_default_context(purpose=Purpose.SERVER_AUTH, *, cafile=None, # CERT_OPTIONAL or CERT_REQUIRED. Let's try to load default system # root CA certificates for the given purpose. This may fail silently. context.load_default_certs(purpose) + # OpenSSL 1.1.1 keylog file + if hasattr(context, 'keylog_filename'): + keylogfile = os.environ.get('SSLKEYLOGFILE') + if keylogfile and not sys.flags.ignore_environment: + context.keylog_filename = keylogfile return context def _create_unverified_context(protocol=PROTOCOL_TLS, *, cert_reqs=CERT_NONE, @@ -617,7 +783,11 @@ def _create_unverified_context(protocol=PROTOCOL_TLS, *, cert_reqs=CERT_NONE, # CERT_OPTIONAL or CERT_REQUIRED. Let's try to load default system # root CA certificates for the given purpose. This may fail silently. context.load_default_certs(purpose) - + # OpenSSL 1.1.1 keylog file + if hasattr(context, 'keylog_filename'): + keylogfile = os.environ.get('SSLKEYLOGFILE') + if keylogfile and not sys.flags.ignore_environment: + context.keylog_filename = keylogfile return context # Used by http.client if no context is explicitly passed. diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index d48d6e5569fc..f368906c8a94 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2,6 +2,7 @@ import sys import unittest +import unittest.mock from test import support import socket import select @@ -25,6 +26,7 @@ ssl = support.import_module("ssl") +from ssl import TLSVersion, _TLSContentType, _TLSMessageType, _TLSAlertType PROTOCOLS = sorted(ssl._PROTOCOL_NAMES) HOST = support.HOST @@ -4405,6 +4407,170 @@ def test_pha_not_tls13(self): self.assertIn(b'WRONG_SSL_VERSION', s.recv(1024)) +HAS_KEYLOG = hasattr(ssl.SSLContext, 'keylog_filename') +requires_keylog = unittest.skipUnless( + HAS_KEYLOG, 'test requires OpenSSL 1.1.1 with keylog callback') + +class TestSSLDebug(unittest.TestCase): + + def keylog_lines(self, fname=support.TESTFN): + with open(fname) as f: + return len(list(f)) + + @requires_keylog + def test_keylog_defaults(self): + self.addCleanup(support.unlink, support.TESTFN) + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + self.assertEqual(ctx.keylog_filename, None) + + self.assertFalse(os.path.isfile(support.TESTFN)) + ctx.keylog_filename = support.TESTFN + self.assertEqual(ctx.keylog_filename, support.TESTFN) + self.assertTrue(os.path.isfile(support.TESTFN)) + self.assertEqual(self.keylog_lines(), 1) + + ctx.keylog_filename = None + self.assertEqual(ctx.keylog_filename, None) + + with self.assertRaises((IsADirectoryError, PermissionError)): + # Windows raises PermissionError + ctx.keylog_filename = os.path.dirname( + os.path.abspath(support.TESTFN)) + + with self.assertRaises(TypeError): + ctx.keylog_filename = 1 + + @requires_keylog + def test_keylog_filename(self): + self.addCleanup(support.unlink, support.TESTFN) + client_context, server_context, hostname = testing_context() + + client_context.keylog_filename = support.TESTFN + server = ThreadedEchoServer(context=server_context, chatty=False) + with server: + with client_context.wrap_socket(socket.socket(), + server_hostname=hostname) as s: + s.connect((HOST, server.port)) + # header, 5 lines for TLS 1.3 + self.assertEqual(self.keylog_lines(), 6) + + client_context.keylog_filename = None + server_context.keylog_filename = support.TESTFN + server = ThreadedEchoServer(context=server_context, chatty=False) + with server: + with client_context.wrap_socket(socket.socket(), + server_hostname=hostname) as s: + s.connect((HOST, server.port)) + self.assertGreaterEqual(self.keylog_lines(), 11) + + client_context.keylog_filename = support.TESTFN + server_context.keylog_filename = support.TESTFN + server = ThreadedEchoServer(context=server_context, chatty=False) + with server: + with client_context.wrap_socket(socket.socket(), + server_hostname=hostname) as s: + s.connect((HOST, server.port)) + self.assertGreaterEqual(self.keylog_lines(), 21) + + client_context.keylog_filename = None + server_context.keylog_filename = None + + @requires_keylog + @unittest.skipIf(sys.flags.ignore_environment, + "test is not compatible with ignore_environment") + def test_keylog_env(self): + self.addCleanup(support.unlink, support.TESTFN) + with unittest.mock.patch.dict(os.environ): + os.environ['SSLKEYLOGFILE'] = support.TESTFN + self.assertEqual(os.environ['SSLKEYLOGFILE'], support.TESTFN) + + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + self.assertEqual(ctx.keylog_filename, None) + + ctx = ssl.create_default_context() + self.assertEqual(ctx.keylog_filename, support.TESTFN) + + ctx = ssl._create_stdlib_context() + self.assertEqual(ctx.keylog_filename, support.TESTFN) + + def test_msg_callback(self): + client_context, server_context, hostname = testing_context() + + def msg_cb(conn, direction, version, content_type, msg_type, data): + pass + + self.assertIs(client_context._msg_callback, None) + client_context._msg_callback = msg_cb + self.assertIs(client_context._msg_callback, msg_cb) + with self.assertRaises(TypeError): + client_context._msg_callback = object() + + def test_msg_callback_tls12(self): + client_context, server_context, hostname = testing_context() + client_context.options |= ssl.OP_NO_TLSv1_3 + + msg = [] + + def msg_cb(conn, direction, version, content_type, msg_type, data): + self.assertIsInstance(conn, ssl.SSLSocket) + self.assertIsInstance(data, bytes) + self.assertIn(direction, {'read', 'write'}) + msg.append((direction, version, content_type, msg_type)) + + client_context._msg_callback = msg_cb + + server = ThreadedEchoServer(context=server_context, chatty=False) + with server: + with client_context.wrap_socket(socket.socket(), + server_hostname=hostname) as s: + s.connect((HOST, server.port)) + + self.assertEqual(msg, [ + ("write", TLSVersion.TLSv1, _TLSContentType.HEADER, + _TLSMessageType.CERTIFICATE_STATUS), + ("write", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, + _TLSMessageType.CLIENT_HELLO), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.CERTIFICATE_STATUS), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, + _TLSMessageType.SERVER_HELLO), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.CERTIFICATE_STATUS), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, + _TLSMessageType.CERTIFICATE), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.CERTIFICATE_STATUS), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, + _TLSMessageType.SERVER_KEY_EXCHANGE), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.CERTIFICATE_STATUS), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, + _TLSMessageType.SERVER_DONE), + ("write", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.CERTIFICATE_STATUS), + ("write", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, + _TLSMessageType.CLIENT_KEY_EXCHANGE), + ("write", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.FINISHED), + ("write", TLSVersion.TLSv1_2, _TLSContentType.CHANGE_CIPHER_SPEC, + _TLSMessageType.CHANGE_CIPHER_SPEC), + ("write", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.CERTIFICATE_STATUS), + ("write", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, + _TLSMessageType.FINISHED), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.CERTIFICATE_STATUS), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, + _TLSMessageType.NEWSESSION_TICKET), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.FINISHED), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, + _TLSMessageType.CERTIFICATE_STATUS), + ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, + _TLSMessageType.FINISHED), + ]) + + def test_main(verbose=False): if support.verbose: import warnings @@ -4440,7 +4606,7 @@ def test_main(verbose=False): tests = [ ContextTests, BasicSocketTests, SSLErrorTests, MemoryBIOTests, SSLObjectTests, SimpleBackgroundTests, ThreadedTests, - TestPostHandshakeAuth + TestPostHandshakeAuth, TestSSLDebug ] if support.is_resource_enabled('network'): diff --git a/Misc/NEWS.d/next/Library/2018-10-21-17-39-32.bpo-34271.P15VLM.rst b/Misc/NEWS.d/next/Library/2018-10-21-17-39-32.bpo-34271.P15VLM.rst new file mode 100644 index 000000000000..344388f7f228 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-10-21-17-39-32.bpo-34271.P15VLM.rst @@ -0,0 +1,3 @@ +Add debugging helpers to ssl module. It's now possible to dump key material +and to trace TLS protocol. The default and stdlib contexts also support +SSLKEYLOGFILE env var. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 4fb7dca9bb04..f40127d3d932 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -185,6 +185,10 @@ static void _PySSLFixErrno(void) { # define HAVE_NPN 0 #endif +#if (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER) +#define HAVE_OPENSSL_KEYLOG 1 +#endif + #ifndef INVALID_SOCKET /* MS defines this */ #define INVALID_SOCKET (-1) #endif @@ -423,6 +427,11 @@ typedef struct { int protocol; #ifdef TLS1_3_VERSION int post_handshake_auth; +#endif + PyObject *msg_cb; +#ifdef HAVE_OPENSSL_KEYLOG + PyObject *keylog_filename; + BIO *keylog_bio; #endif } PySSLContext; @@ -444,6 +453,13 @@ typedef struct { PyObject *owner; /* Python level "owner" passed to servername callback */ PyObject *server_hostname; _PySSLError err; /* last seen error from various sources */ + /* Some SSL callbacks don't have error reporting. Callback wrappers + * store exception information on the socket. The handshake, read, write, + * and shutdown methods check for chained exceptions. + */ + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_tb; } PySSLSocket; typedef struct { @@ -517,6 +533,8 @@ typedef enum { #define GET_SOCKET_TIMEOUT(sock) \ ((sock != NULL) ? (sock)->sock_timeout : 0) +#include "_ssl/debughelpers.c" + /* * SSL errors. */ @@ -703,6 +721,18 @@ fill_and_set_sslerror(PySSLSocket *sslsock, PyObject *type, int ssl_errno, Py_XDECREF(verify_obj); } +static int +PySSL_ChainExceptions(PySSLSocket *sslsock) { + if (sslsock->exc_type == NULL) + return 0; + + _PyErr_ChainExceptions(sslsock->exc_type, sslsock->exc_value, sslsock->exc_tb); + sslsock->exc_type = NULL; + sslsock->exc_value = NULL; + sslsock->exc_tb = NULL; + return -1; +} + static PyObject * PySSL_SetError(PySSLSocket *sslsock, int ret, const char *filename, int lineno) { @@ -796,6 +826,7 @@ PySSL_SetError(PySSLSocket *sslsock, int ret, const char *filename, int lineno) } fill_and_set_sslerror(sslsock, type, p, errstr, lineno, e); ERR_clear_error(); + PySSL_ChainExceptions(sslsock); return NULL; } @@ -903,6 +934,9 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, self->owner = NULL; self->server_hostname = NULL; self->err = err; + self->exc_type = NULL; + self->exc_value = NULL; + self->exc_tb = NULL; /* Make sure the SSL error state is initialized */ ERR_clear_error(); @@ -1052,11 +1086,12 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self) Py_XDECREF(sock); if (ret < 1) return PySSL_SetError(self, ret, __FILE__, __LINE__); - + if (PySSL_ChainExceptions(self) < 0) + return NULL; Py_RETURN_NONE; - error: Py_XDECREF(sock); + PySSL_ChainExceptions(self); return NULL; } @@ -2151,8 +2186,26 @@ PyDoc_STRVAR(PySSL_get_owner_doc, "The Python-level owner of this object.\ Passed as \"self\" in servername callback."); +static int +PySSL_traverse(PySSLSocket *self, visitproc visit, void *arg) +{ + Py_VISIT(self->exc_type); + Py_VISIT(self->exc_value); + Py_VISIT(self->exc_tb); + return 0; +} + +static int +PySSL_clear(PySSLSocket *self) +{ + Py_CLEAR(self->exc_type); + Py_CLEAR(self->exc_value); + Py_CLEAR(self->exc_tb); + return 0; +} -static void PySSL_dealloc(PySSLSocket *self) +static void +PySSL_dealloc(PySSLSocket *self) { if (self->ssl) SSL_free(self->ssl); @@ -2333,13 +2386,14 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b) err.ssl == SSL_ERROR_WANT_WRITE); Py_XDECREF(sock); - if (len > 0) - return PyLong_FromLong(len); - else + if (len <= 0) return PySSL_SetError(self, len, __FILE__, __LINE__); - + if (PySSL_ChainExceptions(self) < 0) + return NULL; + return PyLong_FromLong(len); error: Py_XDECREF(sock); + PySSL_ChainExceptions(self); return NULL; } @@ -2486,6 +2540,8 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1, PySSL_SetError(self, count, __FILE__, __LINE__); goto error; } + if (self->exc_type != NULL) + goto error; done: Py_XDECREF(sock); @@ -2498,6 +2554,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1, } error: + PySSL_ChainExceptions(self); Py_XDECREF(sock); if (!group_right_1) Py_XDECREF(dest); @@ -2601,11 +2658,13 @@ _ssl__SSLSocket_shutdown_impl(PySSLSocket *self) /* Retain the SSL error code */ break; } - if (ret < 0) { Py_XDECREF(sock); - return PySSL_SetError(self, ret, __FILE__, __LINE__); + PySSL_SetError(self, ret, __FILE__, __LINE__); + return NULL; } + if (self->exc_type != NULL) + goto error; if (sock) /* It's already INCREF'ed */ return (PyObject *) sock; @@ -2614,6 +2673,7 @@ _ssl__SSLSocket_shutdown_impl(PySSLSocket *self) error: Py_XDECREF(sock); + PySSL_ChainExceptions(self); return NULL; } @@ -2889,8 +2949,8 @@ static PyTypeObject PySSLSocket_Type = { 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ + (traverseproc) PySSL_traverse, /*tp_traverse*/ + (inquiry) PySSL_clear, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ @@ -3002,6 +3062,11 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version) self->ctx = ctx; self->hostflags = X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS; self->protocol = proto_version; + self->msg_cb = NULL; +#ifdef HAVE_OPENSSL_KEYLOG + self->keylog_filename = NULL; + self->keylog_bio = NULL; +#endif #if HAVE_NPN self->npn_protocols = NULL; #endif @@ -3127,6 +3192,7 @@ context_traverse(PySSLContext *self, visitproc visit, void *arg) #ifndef OPENSSL_NO_TLSEXT Py_VISIT(self->set_sni_cb); #endif + Py_VISIT(self->msg_cb); return 0; } @@ -3135,6 +3201,16 @@ context_clear(PySSLContext *self) { #ifndef OPENSSL_NO_TLSEXT Py_CLEAR(self->set_sni_cb); +#endif + Py_CLEAR(self->msg_cb); +#ifdef HAVE_OPENSSL_KEYLOG + Py_CLEAR(self->keylog_filename); + if (self->keylog_bio != NULL) { + PySSL_BEGIN_ALLOW_THREADS + BIO_free_all(self->keylog_bio); + PySSL_END_ALLOW_THREADS + self->keylog_bio = NULL; + } #endif return 0; } @@ -4570,6 +4646,12 @@ static PyGetSetDef context_getsetlist[] = { {"maximum_version", (getter) get_maximum_version, (setter) set_maximum_version, NULL}, #endif +#ifdef HAVE_OPENSSL_KEYLOG + {"keylog_filename", (getter) _PySSLContext_get_keylog_filename, + (setter) _PySSLContext_set_keylog_filename, NULL}, +#endif + {"_msg_callback", (getter) _PySSLContext_get_msg_callback, + (setter) _PySSLContext_set_msg_callback, NULL}, {"sni_callback", (getter) get_sni_callback, (setter) set_sni_callback, PySSLContext_sni_callback_doc}, {"options", (getter) get_options, diff --git a/Modules/_ssl/debughelpers.c b/Modules/_ssl/debughelpers.c new file mode 100644 index 000000000000..53b966749328 --- /dev/null +++ b/Modules/_ssl/debughelpers.c @@ -0,0 +1,213 @@ +/* Debug helpers */ + +static void +_PySSL_msg_callback(int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg) +{ + const char *cbuf = (const char *)buf; + PyGILState_STATE threadstate; + PyObject *res = NULL; + PySSLSocket *ssl_obj = NULL; /* ssl._SSLSocket, borrowed ref */ + PyObject *ssl_socket = NULL; /* ssl.SSLSocket or ssl.SSLObject */ + int msg_type; + + threadstate = PyGILState_Ensure(); + + ssl_obj = (PySSLSocket *)SSL_get_app_data(ssl); + assert(PySSLSocket_Check(ssl_obj)); + if (ssl_obj->ctx->msg_cb == NULL) { + return; + } + + if (ssl_obj->owner) + ssl_socket = PyWeakref_GetObject(ssl_obj->owner); + else if (ssl_obj->Socket) + ssl_socket = PyWeakref_GetObject(ssl_obj->Socket); + else + ssl_socket = (PyObject *)ssl_obj; + Py_INCREF(ssl_socket); + + /* assume that OpenSSL verifies all payload and buf len is of sufficient + length */ + switch(content_type) { + case SSL3_RT_CHANGE_CIPHER_SPEC: + msg_type = SSL3_MT_CHANGE_CIPHER_SPEC; + break; + case SSL3_RT_ALERT: + /* byte 0: level */ + /* byte 1: alert type */ + msg_type = (int)cbuf[1]; + break; + case SSL3_RT_HANDSHAKE: + msg_type = (int)cbuf[0]; + break; + case SSL3_RT_HEADER: + /* frame header encodes version in bytes 1..2 */ + version = cbuf[1] << 8 | cbuf[2]; + msg_type = (int)cbuf[0]; + break; +#ifdef SSL3_RT_INNER_CONTENT_TYPE + case SSL3_RT_INNER_CONTENT_TYPE: + msg_type = (int)cbuf[0]; + break; +#endif + default: + /* never SSL3_RT_APPLICATION_DATA */ + msg_type = -1; + break; + } + + res = PyObject_CallFunction( + ssl_obj->ctx->msg_cb, "Osiiiy#", + ssl_socket, write_p ? "write" : "read", + version, content_type, msg_type, + buf, len + ); + if (res == NULL) { + PyErr_Fetch(&ssl_obj->exc_type, &ssl_obj->exc_value, &ssl_obj->exc_tb); + } else { + Py_DECREF(res); + } + Py_XDECREF(ssl_socket); + + PyGILState_Release(threadstate); +} + + +static PyObject * +_PySSLContext_get_msg_callback(PySSLContext *self, void *c) { + if (self->msg_cb != NULL) { + Py_INCREF(self->msg_cb); + return self->msg_cb; + } else { + Py_RETURN_NONE; + } +} + +static int +_PySSLContext_set_msg_callback(PySSLContext *self, PyObject *arg, void *c) { + Py_CLEAR(self->msg_cb); + if (arg == Py_None) { + SSL_CTX_set_msg_callback(self->ctx, NULL); + } + else { + if (!PyCallable_Check(arg)) { + SSL_CTX_set_msg_callback(self->ctx, NULL); + PyErr_SetString(PyExc_TypeError, + "not a callable object"); + return -1; + } + Py_INCREF(arg); + self->msg_cb = arg; + SSL_CTX_set_msg_callback(self->ctx, _PySSL_msg_callback); + } + return 0; +} + +#ifdef HAVE_OPENSSL_KEYLOG + +static void +_PySSL_keylog_callback(const SSL *ssl, const char *line) +{ + PyGILState_STATE threadstate; + PySSLSocket *ssl_obj = NULL; /* ssl._SSLSocket, borrowed ref */ + int res, e; + static PyThread_type_lock *lock = NULL; + + threadstate = PyGILState_Ensure(); + + /* Allocate a static lock to synchronize writes to keylog file. + * The lock is neither released on exit nor on fork(). The lock is + * also shared between all SSLContexts although contexts may write to + * their own files. IMHO that's good enough for a non-performance + * critical debug helper. + */ + if (lock == NULL) { + lock = PyThread_allocate_lock(); + if (lock == NULL) { + PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock"); + PyErr_Fetch(&ssl_obj->exc_type, &ssl_obj->exc_value, + &ssl_obj->exc_tb); + return; + } + } + + ssl_obj = (PySSLSocket *)SSL_get_app_data(ssl); + assert(PySSLSocket_Check(ssl_obj)); + if (ssl_obj->ctx->keylog_bio == NULL) { + return; + } + + PySSL_BEGIN_ALLOW_THREADS + PyThread_acquire_lock(lock, 1); + res = BIO_printf(ssl_obj->ctx->keylog_bio, "%s\n", line); + e = errno; + (void)BIO_flush(ssl_obj->ctx->keylog_bio); + PyThread_release_lock(lock); + PySSL_END_ALLOW_THREADS + + if (res == -1) { + errno = e; + PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, + ssl_obj->ctx->keylog_filename); + PyErr_Fetch(&ssl_obj->exc_type, &ssl_obj->exc_value, &ssl_obj->exc_tb); + } + PyGILState_Release(threadstate); +} + +static PyObject * +_PySSLContext_get_keylog_filename(PySSLContext *self, void *c) { + if (self->keylog_filename != NULL) { + Py_INCREF(self->keylog_filename); + return self->keylog_filename; + } else { + Py_RETURN_NONE; + } +} + +static int +_PySSLContext_set_keylog_filename(PySSLContext *self, PyObject *arg, void *c) { + FILE *fp; + /* Reset variables and callback first */ + SSL_CTX_set_keylog_callback(self->ctx, NULL); + Py_CLEAR(self->keylog_filename); + if (self->keylog_bio != NULL) { + BIO *bio = self->keylog_bio; + self->keylog_bio = NULL; + PySSL_BEGIN_ALLOW_THREADS + BIO_free_all(bio); + PySSL_END_ALLOW_THREADS + } + + if (arg == Py_None) { + /* None disables the callback */ + return 0; + } + + /* _Py_fopen_obj() also checks that arg is of proper type. */ + fp = _Py_fopen_obj(arg, "a" PY_STDIOTEXTMODE); + if (fp == NULL) + return -1; + + self->keylog_bio = BIO_new_fp(fp, BIO_CLOSE | BIO_FP_TEXT); + if (self->keylog_bio == NULL) { + PyErr_SetString(PySSLErrorObject, + "Can't malloc memory for keylog file"); + return -1; + } + Py_INCREF(arg); + self->keylog_filename = arg; + + /* Write a header for seekable, empty files (this excludes pipes). */ + PySSL_BEGIN_ALLOW_THREADS + if (BIO_tell(self->keylog_bio) == 0) { + BIO_puts(self->keylog_bio, + "# TLS secrets log file, generated by OpenSSL / Python\n"); + (void)BIO_flush(self->keylog_bio); + } + PySSL_END_ALLOW_THREADS + SSL_CTX_set_keylog_callback(self->ctx, _PySSL_keylog_callback); + return 0; +} + +#endif \ No newline at end of file diff --git a/setup.py b/setup.py index 96a49b4e353c..7852c2dfa27e 100644 --- a/setup.py +++ b/setup.py @@ -2178,11 +2178,13 @@ def split_var(name, sep): ssl_incs.extend(krb5_h) if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"): - self.add(Extension('_ssl', ['_ssl.c'], - include_dirs=openssl_includes, - library_dirs=openssl_libdirs, - libraries=openssl_libs, - depends=['socketmodule.h'])) + self.add(Extension( + '_ssl', ['_ssl.c'], + include_dirs=openssl_includes, + library_dirs=openssl_libdirs, + libraries=openssl_libs, + depends=['socketmodule.h', '_ssl/debughelpers.c']) + ) else: self.missing.append('_ssl') From webhook-mailer at python.org Fri May 31 05:46:40 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 31 May 2019 09:46:40 -0000 Subject: [Python-checkins] bpo-36379: __ipow__ must be a ternaryfunc, not a binaryfunc (GH-13546) Message-ID: https://github.com/python/cpython/commit/c7f803b08ed5211701c75f98ba9ada85d45ac155 commit: c7f803b08ed5211701c75f98ba9ada85d45ac155 branch: master author: Zackery Spytz committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-31T02:46:36-07:00 summary: bpo-36379: __ipow__ must be a ternaryfunc, not a binaryfunc (GH-13546) If a type's __ipow__ method was implemented in C, attempting to use the *modulo* parameter would cause crashes. https://bugs.python.org/issue36379 files: A Misc/NEWS.d/next/C API/2019-05-24-07-11-08.bpo-36379.8zgoKe.rst M Lib/test/test_capi.py M Modules/_testcapimodule.c M Objects/typeobject.c diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 795aa78d8866..4dd78bb9a2fd 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -184,6 +184,13 @@ def test_c_type_with_matrix_multiplication(self): o @= m1 self.assertEqual(o, ("matmul", 42, m1)) + def test_c_type_with_ipow(self): + # When the __ipow__ method of a type was implemented in C, using the + # modulo param would cause segfaults. + o = _testcapi.ipowType() + self.assertEqual(o.__ipow__(1), (1, None)) + self.assertEqual(o.__ipow__(2, 2), (2, 2)) + def test_return_null_without_error(self): # Issue #23571: A function must not return NULL without setting an # error diff --git a/Misc/NEWS.d/next/C API/2019-05-24-07-11-08.bpo-36379.8zgoKe.rst b/Misc/NEWS.d/next/C API/2019-05-24-07-11-08.bpo-36379.8zgoKe.rst new file mode 100644 index 000000000000..6a699b2084e4 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-05-24-07-11-08.bpo-36379.8zgoKe.rst @@ -0,0 +1,2 @@ +Fix crashes when attempting to use the *modulo* parameter when ``__ipow__`` +is implemented in C. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index ca6e87b79c47..b42f41cc8d8f 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5522,6 +5522,27 @@ static PyTypeObject matmulType = { PyObject_Del, /* tp_free */ }; +typedef struct { + PyObject_HEAD +} ipowObject; + +static PyObject * +ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod) +{ + return Py_BuildValue("OO", other, mod); +} + +static PyNumberMethods ipowType_as_number = { + .nb_inplace_power = ipowType_ipow +}; + +static PyTypeObject ipowType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "ipowType", + .tp_basicsize = sizeof(ipowObject), + .tp_as_number = &ipowType_as_number, + .tp_new = PyType_GenericNew +}; typedef struct { PyObject_HEAD @@ -5947,6 +5968,11 @@ PyInit__testcapi(void) return NULL; Py_INCREF(&matmulType); PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType); + if (PyType_Ready(&ipowType) < 0) { + return NULL; + } + Py_INCREF(&ipowType); + PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType); if (PyType_Ready(&awaitType) < 0) return NULL; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 64c2ceab5573..b6d925c1442e 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -7016,7 +7016,7 @@ static slotdef slotdefs[] = { IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder, wrap_binaryfunc, "%="), IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power, - wrap_binaryfunc, "**="), + wrap_ternaryfunc, "**="), IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift, wrap_binaryfunc, "<<="), IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift, From webhook-mailer at python.org Fri May 31 07:08:00 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 31 May 2019 11:08:00 -0000 Subject: [Python-checkins] bpo-37108: Support super with methods that use positional-only arguments (GH-13695) Message-ID: https://github.com/python/cpython/commit/3a46d5c293d39995dc5218bf46a7d92b16fb2a15 commit: 3a46d5c293d39995dc5218bf46a7d92b16fb2a15 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-31T12:07:56+01:00 summary: bpo-37108: Support super with methods that use positional-only arguments (GH-13695) files: M Lib/test/test_positional_only_arg.py M Objects/typeobject.c diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index d4d259ef2693..0aaad84cb3bf 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -398,6 +398,20 @@ def f(a=1, /, b=2): gen = f() self.assertEqual(next(gen), (1, 2)) + def test_super(self): + + sentinel = object() + + class A: + def method(self): + return sentinel + + class C(A): + def method(self, /): + return super().method() + + self.assertEqual(C().method(), sentinel) + if __name__ == "__main__": unittest.main() diff --git a/Objects/typeobject.c b/Objects/typeobject.c index b6d925c1442e..da249b569ad2 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -7807,7 +7807,7 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds) "super(): no code object"); return -1; } - if (co->co_argcount == 0) { + if (co->co_posonlyargcount + co->co_argcount == 0) { PyErr_SetString(PyExc_RuntimeError, "super(): no arguments"); return -1; From webhook-mailer at python.org Fri May 31 07:13:09 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 31 May 2019 11:13:09 -0000 Subject: [Python-checkins] Update data model docs to include missing attributes for code objects (GH-13696) Message-ID: https://github.com/python/cpython/commit/ed222a74a0ada1cb89ba0fd81f64e404ac50778d commit: ed222a74a0ada1cb89ba0fd81f64e404ac50778d branch: master author: Pablo Galindo committer: GitHub date: 2019-05-31T12:13:04+01:00 summary: Update data model docs to include missing attributes for code objects (GH-13696) Include and document co_posonlyargcount and co_kwonlyargcount files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 9fc9f3a3848a..8b4d889535fb 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -890,6 +890,8 @@ Internal types .. index:: single: co_argcount (code object attribute) + single: co_posonlyargcount (code object attribute) + single: co_kwonlyargcount (code object attribute) single: co_code (code object attribute) single: co_consts (code object attribute) single: co_filename (code object attribute) @@ -906,18 +908,21 @@ Internal types Special read-only attributes: :attr:`co_name` gives the function name; :attr:`co_argcount` is the number of positional arguments (including arguments - with default values); :attr:`co_nlocals` is the number of local variables used - by the function (including arguments); :attr:`co_varnames` is a tuple containing - the names of the local variables (starting with the argument names); - :attr:`co_cellvars` is a tuple containing the names of local variables that are - referenced by nested functions; :attr:`co_freevars` is a tuple containing the - names of free variables; :attr:`co_code` is a string representing the sequence - of bytecode instructions; :attr:`co_consts` is a tuple containing the literals - used by the bytecode; :attr:`co_names` is a tuple containing the names used by - the bytecode; :attr:`co_filename` is the filename from which the code was - compiled; :attr:`co_firstlineno` is the first line number of the function; - :attr:`co_lnotab` is a string encoding the mapping from bytecode offsets to - line numbers (for details see the source code of the interpreter); + with default values); :attr:`co_posonlyargcount` is the number of + positional-only arguments (including arguments with default values); + :attr:`co_kwonlyargcount` is the number of keyword-only arguments (including + arguments with default values); :attr:`co_nlocals` is the number of local + variables used by the function (including arguments); :attr:`co_varnames` is a + tuple containing the names of the local variables (starting with the argument + names); :attr:`co_cellvars` is a tuple containing the names of local variables + that are referenced by nested functions; :attr:`co_freevars` is a tuple + containing the names of free variables; :attr:`co_code` is a string representing + the sequence of bytecode instructions; :attr:`co_consts` is a tuple containing + the literals used by the bytecode; :attr:`co_names` is a tuple containing the + names used by the bytecode; :attr:`co_filename` is the filename from which the + code was compiled; :attr:`co_firstlineno` is the first line number of the + function; :attr:`co_lnotab` is a string encoding the mapping from bytecode + offsets to line numbers (for details see the source code of the interpreter); :attr:`co_stacksize` is the required stack size (including local variables); :attr:`co_flags` is an integer encoding a number of flags for the interpreter. From webhook-mailer at python.org Fri May 31 09:09:55 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 31 May 2019 13:09:55 -0000 Subject: [Python-checkins] bpo-37112: Allow compile to work on AST with positional only arguments with defaults (GH-13697) Message-ID: https://github.com/python/cpython/commit/2f58a84104ef64f71deb71d264305bcd73e59c97 commit: 2f58a84104ef64f71deb71d264305bcd73e59c97 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-31T14:09:49+01:00 summary: bpo-37112: Allow compile to work on AST with positional only arguments with defaults (GH-13697) files: M Lib/test/test_ast.py M Python/ast.c diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 0c5bbf6752a4..e251e254afdd 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -137,6 +137,18 @@ def to_tuple(t): "@deco(a for a in b)\ndef f(): pass", # Simple assignment expression "(a := 1)", + # Positional-only arguments + "def f(a, /,): pass", + "def f(a, /, c, d, e): pass", + "def f(a, /, c, *, d, e): pass", + "def f(a, /, c, *, d, e, **kwargs): pass", + # Positional-only arguments with defaults + "def f(a=1, /,): pass", + "def f(a=1, /, b=2, c=4): pass", + "def f(a=1, /, b=2, *, c=4): pass", + "def f(a=1, /, b=2, *, c): pass", + "def f(a=1, /, b=2, *, c=4, **kwargs): pass", + "def f(a=1, /, b=2, *, c, **kwargs): pass", ] @@ -1691,6 +1703,16 @@ def main(): ('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])], []), ('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None, None)], []), ('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 12), 'c', None, None), ('arg', (1, 15), 'd', None, None), ('arg', (1, 18), 'e', None, None)], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 22))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 12), 'c', None, None)], [('arg', (1, 6), 'a', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 12), 'c', None, None)], [('arg', (1, 6), 'a', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], ('arg', (1, 26), 'kwargs', None, None), []), [('Pass', (1, 35))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 14), 'b', None, None), ('arg', (1, 19), 'c', None, None)], [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None), ('Constant', (1, 21), 4, None)]), [('Pass', (1, 25))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 14), 'b', None, None)], [('arg', (1, 6), 'a', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 28))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 14), 'b', None, None)], [('arg', (1, 6), 'a', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 26))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 14), 'b', None, None)], [('arg', (1, 6), 'a', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], ('arg', (1, 29), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 38))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 14), 'b', None, None)], [('arg', (1, 6), 'a', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], ('arg', (1, 27), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 36))], [], None, None)], []), ] single_results = [ ('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1, None), ('Add',), ('Constant', (1, 2), 2, None)))]), diff --git a/Python/ast.c b/Python/ast.c index 183b08d6ba12..b77552274d24 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -123,7 +123,7 @@ validate_arguments(arguments_ty args) && !validate_expr(args->kwarg->annotation, Load)) { return 0; } - if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) { + if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->posonlyargs) + asdl_seq_LEN(args->args)) { PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments"); return 0; } From webhook-mailer at python.org Fri May 31 10:19:55 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 31 May 2019 14:19:55 -0000 Subject: [Python-checkins] bpo-37115: Support annotations in positional-only arguments (GH-13698) Message-ID: https://github.com/python/cpython/commit/a0c01bf1364f2996bb0186ddfc41d74350e01c39 commit: a0c01bf1364f2996bb0186ddfc41d74350e01c39 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-31T15:19:50+01:00 summary: bpo-37115: Support annotations in positional-only arguments (GH-13698) files: M Lib/test/test_grammar.py M Lib/test/test_type_comments.py M Python/compile.c diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 6d7d5544ed9c..2a3b71fac4a5 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -620,14 +620,22 @@ def f(x) -> list: pass self.assertEqual(f.__annotations__, {'return': list}) def f(x: int): pass self.assertEqual(f.__annotations__, {'x': int}) + def f(x: int, /): pass + self.assertEqual(f.__annotations__, {'x': int}) + def f(x: int = 34, /): pass + self.assertEqual(f.__annotations__, {'x': int}) def f(*x: str): pass self.assertEqual(f.__annotations__, {'x': str}) def f(**x: float): pass self.assertEqual(f.__annotations__, {'x': float}) def f(x, y: 1+2): pass self.assertEqual(f.__annotations__, {'y': 3}) + def f(x, y: 1+2, /): pass + self.assertEqual(f.__annotations__, {'y': 3}) def f(a, b: 1, c: 2, d): pass self.assertEqual(f.__annotations__, {'b': 1, 'c': 2}) + def f(a, b: 1, /, c: 2, d): pass + self.assertEqual(f.__annotations__, {'b': 1, 'c': 2}) def f(a, b: 1, c: 2, d, e: 3 = 4, f=5, *g: 6): pass self.assertEqual(f.__annotations__, {'b': 1, 'c': 2, 'e': 3, 'g': 6}) @@ -636,6 +644,11 @@ def f(a, b: 1, c: 2, d, e: 3 = 4, f=5, *g: 6, h: 7, i=8, j: 9 = 10, self.assertEqual(f.__annotations__, {'b': 1, 'c': 2, 'e': 3, 'g': 6, 'h': 7, 'j': 9, 'k': 11, 'return': 12}) + def f(a, b: 1, c: 2, d, e: 3 = 4, f: int = 5, /, *g: 6, h: 7, i=8, j: 9 = 10, + **k: 11) -> 12: pass + self.assertEqual(f.__annotations__, + {'b': 1, 'c': 2, 'e': 3, 'f': int, 'g': 6, 'h': 7, 'j': 9, + 'k': 11, 'return': 12}) # Check for issue #20625 -- annotations mangling class Spam: def f(self, *, __kw: 1): diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 83d8717247aa..55b54e7f203e 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -99,12 +99,25 @@ def fa( ): pass +def fa( + a = 1, # type: A + / +): + pass + def fab( a, # type: A b, # type: B ): pass +def fab( + a, # type: A + /, + b, # type: B +): + pass + def fab( a, # type: A b # type: B @@ -149,6 +162,13 @@ def fav( ): pass +def fav( + a, # type: A + /, + *v, # type: V +): + pass + def fav( a, # type: A *v # type: V @@ -161,6 +181,13 @@ def fak( ): pass +def fak( + a, # type: A + /, + **k, # type: K +): + pass + def fak( a, # type: A **k # type: K @@ -174,6 +201,14 @@ def favk( ): pass +def favk( + a, # type: A + /, + *v, # type: V + **k, # type: K +): + pass + def favk( a, # type: A *v, # type: V @@ -290,18 +325,21 @@ def test_longargs(self): for t in tree.body: # The expected args are encoded in the function name todo = set(t.name[1:]) - self.assertEqual(len(t.args.args), + self.assertEqual(len(t.args.args) + len(t.args.posonlyargs), len(todo) - bool(t.args.vararg) - bool(t.args.kwarg)) self.assertTrue(t.name.startswith('f'), t.name) - for c in t.name[1:]: + for index, c in enumerate(t.name[1:]): todo.remove(c) if c == 'v': arg = t.args.vararg elif c == 'k': arg = t.args.kwarg else: - assert 0 <= ord(c) - ord('a') < len(t.args.args) - arg = t.args.args[ord(c) - ord('a')] + assert 0 <= ord(c) - ord('a') < len(t.args.posonlyargs + t.args.args) + if index < len(t.args.posonlyargs): + arg = t.args.posonlyargs[ord(c) - ord('a')] + else: + arg = t.args.args[ord(c) - ord('a') - len(t.args.posonlyargs)] self.assertEqual(arg.arg, c) # That's the argument name self.assertEqual(arg.type_comment, arg.arg.upper()) assert not todo diff --git a/Python/compile.c b/Python/compile.c index f1c97bdfe47f..f6ec929b3ca4 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1991,6 +1991,8 @@ compiler_visit_annotations(struct compiler *c, arguments_ty args, if (!compiler_visit_argannotations(c, args->args, names)) goto error; + if (!compiler_visit_argannotations(c, args->posonlyargs, names)) + goto error; if (args->vararg && args->vararg->annotation && !compiler_visit_argannotation(c, args->vararg->arg, args->vararg->annotation, names)) From webhook-mailer at python.org Fri May 31 12:19:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 31 May 2019 16:19:16 -0000 Subject: [Python-checkins] bpo-37094: Add example for TestCase.skipTest in unittest doc (GH-13645) Message-ID: https://github.com/python/cpython/commit/ffed76b6fc4d7dd0244b662d6e5738eb496d9def commit: ffed76b6fc4d7dd0244b662d6e5738eb496d9def branch: master author: Makdon committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-05-31T09:19:11-07:00 summary: bpo-37094: Add example for TestCase.skipTest in unittest doc (GH-13645) Also includes other minor test skipping doc improvements. https://bugs.python.org/issue37094 files: M Doc/library/unittest.rst diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 8ad2abd3d89a..54a9f2c6f735 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -510,7 +510,8 @@ that is broken and will fail, but shouldn't be counted as a failure on a :class:`TestResult`. Skipping a test is simply a matter of using the :func:`skip` :term:`decorator` -or one of its conditional variants. +or one of its conditional variants, calling :meth:`TestCase.skipTest` within a +:meth:`~TestCase.setUp` or test method, or raising :exc:`SkipTest` directly. Basic skipping looks like this:: @@ -531,16 +532,23 @@ Basic skipping looks like this:: # windows specific testing code pass + def test_maybe_skipped(self): + if not external_resource_available(): + self.skipTest("external resource not available") + # test code that depends on the external resource + pass + This is the output of running the example above in verbose mode:: test_format (__main__.MyTestCase) ... skipped 'not supported in this library version' test_nothing (__main__.MyTestCase) ... skipped 'demonstrating skipping' + test_maybe_skipped (__main__.MyTestCase) ... skipped 'external resource not available' test_windows_support (__main__.MyTestCase) ... skipped 'requires Windows' ---------------------------------------------------------------------- - Ran 3 tests in 0.005s + Ran 4 tests in 0.005s - OK (skipped=3) + OK (skipped=4) Classes can be skipped just like methods:: @@ -568,7 +576,7 @@ the test unless the passed object has a certain attribute:: return lambda func: func return unittest.skip("{!r} doesn't have {!r}".format(obj, attr)) -The following decorators implement test skipping and expected failures: +The following decorators and exception implement test skipping and expected failures: .. decorator:: skip(reason) From webhook-mailer at python.org Fri May 31 12:31:59 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 31 May 2019 16:31:59 -0000 Subject: [Python-checkins] bpo-37094: Add example for TestCase.skipTest in unittest doc (GH-13645) Message-ID: https://github.com/python/cpython/commit/8135455c840b9e169a6cd527cb1ee922cafb9109 commit: 8135455c840b9e169a6cd527cb1ee922cafb9109 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-31T09:31:53-07:00 summary: bpo-37094: Add example for TestCase.skipTest in unittest doc (GH-13645) Also includes other minor test skipping doc improvements. https://bugs.python.org/issue37094 (cherry picked from commit ffed76b6fc4d7dd0244b662d6e5738eb496d9def) Co-authored-by: Makdon files: M Doc/library/unittest.rst diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 13230daf85f0..bbe14299edfb 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -510,7 +510,8 @@ that is broken and will fail, but shouldn't be counted as a failure on a :class:`TestResult`. Skipping a test is simply a matter of using the :func:`skip` :term:`decorator` -or one of its conditional variants. +or one of its conditional variants, calling :meth:`TestCase.skipTest` within a +:meth:`~TestCase.setUp` or test method, or raising :exc:`SkipTest` directly. Basic skipping looks like this:: @@ -531,16 +532,23 @@ Basic skipping looks like this:: # windows specific testing code pass + def test_maybe_skipped(self): + if not external_resource_available(): + self.skipTest("external resource not available") + # test code that depends on the external resource + pass + This is the output of running the example above in verbose mode:: test_format (__main__.MyTestCase) ... skipped 'not supported in this library version' test_nothing (__main__.MyTestCase) ... skipped 'demonstrating skipping' + test_maybe_skipped (__main__.MyTestCase) ... skipped 'external resource not available' test_windows_support (__main__.MyTestCase) ... skipped 'requires Windows' ---------------------------------------------------------------------- - Ran 3 tests in 0.005s + Ran 4 tests in 0.005s - OK (skipped=3) + OK (skipped=4) Classes can be skipped just like methods:: @@ -568,7 +576,7 @@ the test unless the passed object has a certain attribute:: return lambda func: func return unittest.skip("{!r} doesn't have {!r}".format(obj, attr)) -The following decorators implement test skipping and expected failures: +The following decorators and exception implement test skipping and expected failures: .. decorator:: skip(reason) From webhook-mailer at python.org Fri May 31 12:32:37 2019 From: webhook-mailer at python.org (Christian Heimes) Date: Fri, 31 May 2019 16:32:37 -0000 Subject: [Python-checkins] bpo-26835: Add file sealing constants to fcntl (GH-13694) Message-ID: https://github.com/python/cpython/commit/8cbb5b6625268400d6e9092b75b06d6f90398dc9 commit: 8cbb5b6625268400d6e9092b75b06d6f90398dc9 branch: master author: Christian Heimes committer: GitHub date: 2019-05-31T18:32:33+02:00 summary: bpo-26835: Add file sealing constants to fcntl (GH-13694) Co-authored-by: nanjekyejoannah files: A Misc/NEWS.d/next/Library/2019-05-31-11-33-11.bpo-26835.xGbUX0.rst M Doc/library/fcntl.rst M Modules/fcntlmodule.c diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst index 88112f6b7e54..2db9674952d7 100644 --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -28,6 +28,10 @@ descriptor. Operations in this module used to raise an :exc:`IOError` where they now raise an :exc:`OSError`. +.. versionchanged:: 3.8 + The fcntl module now contains ``F_ADD_SEALS``, ``F_GET_SEALS``, and + ``F_SEAL_*`` constants for sealing of :func:`os.memfd_create` file + descriptors. The module defines the following functions: diff --git a/Misc/NEWS.d/next/Library/2019-05-31-11-33-11.bpo-26835.xGbUX0.rst b/Misc/NEWS.d/next/Library/2019-05-31-11-33-11.bpo-26835.xGbUX0.rst new file mode 100644 index 000000000000..1c5ed97a7d19 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-31-11-33-11.bpo-26835.xGbUX0.rst @@ -0,0 +1 @@ +The fcntl module now contains file sealing constants for sealing of memfds. diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index a938d9e88bf0..0fbf7876c3e2 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -620,7 +620,15 @@ all_ins(PyObject* m) if (PyModule_AddIntMacro(m, I_PLINK)) return -1; if (PyModule_AddIntMacro(m, I_PUNLINK)) return -1; #endif - +#ifdef F_ADD_SEALS + /* Linux: file sealing for memfd_create() */ + if (PyModule_AddIntMacro(m, F_ADD_SEALS)) return -1; + if (PyModule_AddIntMacro(m, F_GET_SEALS)) return -1; + if (PyModule_AddIntMacro(m, F_SEAL_SEAL)) return -1; + if (PyModule_AddIntMacro(m, F_SEAL_SHRINK)) return -1; + if (PyModule_AddIntMacro(m, F_SEAL_GROW)) return -1; + if (PyModule_AddIntMacro(m, F_SEAL_WRITE)) return -1; +#endif return 0; } From webhook-mailer at python.org Fri May 31 12:41:35 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 31 May 2019 16:41:35 -0000 Subject: [Python-checkins] bpo-25735: math.factorial doc should mention integer return type (GH-6420) Message-ID: https://github.com/python/cpython/commit/4612671df2742eade8ecf8003a6ce1247973c135 commit: 4612671df2742eade8ecf8003a6ce1247973c135 branch: master author: Akshay Sharma committer: Cheryl Sabella date: 2019-05-31T12:41:17-04:00 summary: bpo-25735: math.factorial doc should mention integer return type (GH-6420) files: A Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst M Doc/library/math.rst diff --git a/Doc/library/math.rst b/Doc/library/math.rst index bf660ae9defa..b51e96bc4074 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -50,7 +50,7 @@ Number-theoretic and representation functions .. function:: factorial(x) - Return *x* factorial. Raises :exc:`ValueError` if *x* is not integral or + Return *x* factorial as an integer. Raises :exc:`ValueError` if *x* is not integral or is negative. diff --git a/Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst b/Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst new file mode 100644 index 000000000000..8d22cf69e170 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst @@ -0,0 +1 @@ +Added documentation for func factorial to indicate that returns integer values From webhook-mailer at python.org Fri May 31 12:43:19 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 31 May 2019 16:43:19 -0000 Subject: [Python-checkins] bpo-12639: msilib.Directory.start_component() fails if *keyfile* is not None (GH-13688) Message-ID: https://github.com/python/cpython/commit/c8d5bf6c3fa09b43f6a5ee779d493d251dbcc53c commit: c8d5bf6c3fa09b43f6a5ee779d493d251dbcc53c branch: master author: Zackery Spytz committer: Steve Dower date: 2019-05-31T09:43:13-07:00 summary: bpo-12639: msilib.Directory.start_component() fails if *keyfile* is not None (GH-13688) msilib.Directory.start_component() was passing an extra argument to CAB.gen_id(). files: A Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst M Lib/msilib/__init__.py M Lib/test/test_msilib.py diff --git a/Lib/msilib/__init__.py b/Lib/msilib/__init__.py index 8c5251d9baf8..0bc8dd995246 100644 --- a/Lib/msilib/__init__.py +++ b/Lib/msilib/__init__.py @@ -273,7 +273,7 @@ def start_component(self, component = None, feature = None, flags = None, keyfil if AMD64: flags |= 256 if keyfile: - keyid = self.cab.gen_id(self.absolute, keyfile) + keyid = self.cab.gen_id(keyfile) self.keyfiles[keyfile] = keyid else: keyid = None diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index 4aa4753fc2a6..265eaea59b5f 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -83,6 +83,15 @@ def test_get_property_vt_empty(self): db.Close() self.addCleanup(unlink, db_path) + def test_directory_start_component_keyfile(self): + db, db_path = init_database() + self.addCleanup(db.Close) + feature = msilib.Feature(db, 0, 'Feature', 'A feature', 'Python') + cab = msilib.CAB('CAB') + dir = msilib.Directory(db, cab, None, TESTFN, 'TARGETDIR', + 'SourceDir', 0) + dir.start_component(None, feature, None, 'keyfile') + class Test_make_id(unittest.TestCase): #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx diff --git a/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst b/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst new file mode 100644 index 000000000000..aade9121b4bb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst @@ -0,0 +1,2 @@ +:meth:`msilib.Directory.start_component()` no longer fails if *keyfile* is +not ``None``. From webhook-mailer at python.org Fri May 31 12:58:31 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 31 May 2019 16:58:31 -0000 Subject: [Python-checkins] bpo-25735: math.factorial doc should mention integer return type (GH-6420) Message-ID: https://github.com/python/cpython/commit/fc3b8437c86167983cc75e5a9a3ed1dc542a1b79 commit: fc3b8437c86167983cc75e5a9a3ed1dc542a1b79 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-31T09:58:27-07:00 summary: bpo-25735: math.factorial doc should mention integer return type (GH-6420) (cherry picked from commit 4612671df2742eade8ecf8003a6ce1247973c135) Co-authored-by: Akshay Sharma files: A Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst M Doc/library/math.rst diff --git a/Doc/library/math.rst b/Doc/library/math.rst index b06b054d516a..fd96d7a95864 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -50,7 +50,7 @@ Number-theoretic and representation functions .. function:: factorial(x) - Return *x* factorial. Raises :exc:`ValueError` if *x* is not integral or + Return *x* factorial as an integer. Raises :exc:`ValueError` if *x* is not integral or is negative. diff --git a/Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst b/Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst new file mode 100644 index 000000000000..8d22cf69e170 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst @@ -0,0 +1 @@ +Added documentation for func factorial to indicate that returns integer values From webhook-mailer at python.org Fri May 31 13:22:22 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 31 May 2019 17:22:22 -0000 Subject: [Python-checkins] bpo-12639: msilib.Directory.start_component() fails if *keyfile* is not None (GH-13688) Message-ID: https://github.com/python/cpython/commit/49fc57abf5fcf60129e460046d78c9bf20a19931 commit: 49fc57abf5fcf60129e460046d78c9bf20a19931 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-31T10:22:14-07:00 summary: bpo-12639: msilib.Directory.start_component() fails if *keyfile* is not None (GH-13688) msilib.Directory.start_component() was passing an extra argument to CAB.gen_id(). (cherry picked from commit c8d5bf6c3fa09b43f6a5ee779d493d251dbcc53c) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst M Lib/msilib/__init__.py M Lib/test/test_msilib.py diff --git a/Lib/msilib/__init__.py b/Lib/msilib/__init__.py index 8c5251d9baf8..0bc8dd995246 100644 --- a/Lib/msilib/__init__.py +++ b/Lib/msilib/__init__.py @@ -273,7 +273,7 @@ def start_component(self, component = None, feature = None, flags = None, keyfil if AMD64: flags |= 256 if keyfile: - keyid = self.cab.gen_id(self.absolute, keyfile) + keyid = self.cab.gen_id(keyfile) self.keyfiles[keyfile] = keyid else: keyid = None diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index 4aa4753fc2a6..265eaea59b5f 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -83,6 +83,15 @@ def test_get_property_vt_empty(self): db.Close() self.addCleanup(unlink, db_path) + def test_directory_start_component_keyfile(self): + db, db_path = init_database() + self.addCleanup(db.Close) + feature = msilib.Feature(db, 0, 'Feature', 'A feature', 'Python') + cab = msilib.CAB('CAB') + dir = msilib.Directory(db, cab, None, TESTFN, 'TARGETDIR', + 'SourceDir', 0) + dir.start_component(None, feature, None, 'keyfile') + class Test_make_id(unittest.TestCase): #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx diff --git a/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst b/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst new file mode 100644 index 000000000000..aade9121b4bb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst @@ -0,0 +1,2 @@ +:meth:`msilib.Directory.start_component()` no longer fails if *keyfile* is +not ``None``. From webhook-mailer at python.org Fri May 31 14:34:02 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 31 May 2019 18:34:02 -0000 Subject: [Python-checkins] Document changes for PyCode_New regarding PEP570 (GH-13706) Message-ID: https://github.com/python/cpython/commit/545a3b8814dbf2a5391e830d69e796fb1a1d62ec commit: 545a3b8814dbf2a5391e830d69e796fb1a1d62ec branch: master author: Pablo Galindo committer: GitHub date: 2019-05-31T19:33:41+01:00 summary: Document changes for PyCode_New regarding PEP570 (GH-13706) files: M Doc/c-api/code.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index e2b0b23335e3..7aa91ee84d2e 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -40,6 +40,9 @@ bound into a function. :c:func:`PyCode_New` directly can bind you to a precise Python version since the definition of the bytecode changes often. + .. versionchanged:: 3.8 + An extra parameter is required (*posonlyargcount*) to support :PEP:`570`. + .. audit-event:: code.__new__ "code filename name argcount kwonlyargcount nlocals stacksize flags" .. c:function:: PyCodeObject* PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 98f0c3474f26..76d00938dbec 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1278,6 +1278,9 @@ Changes in the C API (Contributed by Antoine Pitrou in :issue:`32388`.) +* The :c:func:`PyCode_New` has a new parameter in the second position (*posonlyargcount*) + to support :pep:`570`, indicating the number of positional-only arguments. + CPython bytecode changes ------------------------ From webhook-mailer at python.org Fri May 31 14:39:53 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 31 May 2019 18:39:53 -0000 Subject: [Python-checkins] bpo-26826: Expose copy_file_range in the os module (GH-7255) Message-ID: https://github.com/python/cpython/commit/aac4d0342c3e692731c189d003dbd73a8c681a34 commit: aac4d0342c3e692731c189d003dbd73a8c681a34 branch: master author: Pablo Galindo committer: GitHub date: 2019-05-31T19:39:47+01:00 summary: bpo-26826: Expose copy_file_range in the os module (GH-7255) files: A Misc/NEWS.d/next/Core and Builtins/2018-05-30-23-43-03.bpo-26826.NkRzjb.rst M Doc/library/os.rst M Lib/test/test_os.py M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c M aclocal.m4 M configure M configure.ac M pyconfig.h.in diff --git a/Doc/library/os.rst b/Doc/library/os.rst index b53fd71e65b3..107764ba4d53 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -707,6 +707,28 @@ as internal buffering of data. pass +.. function:: copy_file_range(src, dst, count, offset_src=None, offset_dst=None) + + Copy *count* bytes from file descriptor *src*, starting from offset + *offset_src*, to file descriptor *dst*, starting from offset *offset_dst*. + If *offset_src* is None, then *src* is read from the current position; + respectively for *offset_dst*. The files pointed by *src* and *dst* + must reside in the same filesystem, otherwise an :exc:`OSError` is + raised with :attr:`~OSError.errno` set to :data:`errno.EXDEV`. + + This copy is done without the additional cost of transferring data + from the kernel to user space and then back into the kernel. Additionally, + some filesystems could implement extra optimizations. The copy is done as if + both files are opened as binary. + + The return value is the amount of bytes copied. This could be less than the + amount requested. + + .. availability:: Linux kernel >= 4.5 or glibc >= 2.27. + + .. versionadded:: 3.8 + + .. function:: device_encoding(fd) Return a string describing the encoding of the device associated with *fd* diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index f17a19a7585d..a8eae6162057 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -231,6 +231,89 @@ def test_symlink_keywords(self): except (NotImplementedError, OSError): pass # No OS support or unprivileged user + @unittest.skipUnless(hasattr(os, 'copy_file_range'), 'test needs os.copy_file_range()') + def test_copy_file_range_invalid_values(self): + with self.assertRaises(ValueError): + os.copy_file_range(0, 1, -10) + + @unittest.skipUnless(hasattr(os, 'copy_file_range'), 'test needs os.copy_file_range()') + def test_copy_file_range(self): + TESTFN2 = support.TESTFN + ".3" + data = b'0123456789' + + create_file(support.TESTFN, data) + self.addCleanup(support.unlink, support.TESTFN) + + in_file = open(support.TESTFN, 'rb') + self.addCleanup(in_file.close) + in_fd = in_file.fileno() + + out_file = open(TESTFN2, 'w+b') + self.addCleanup(support.unlink, TESTFN2) + self.addCleanup(out_file.close) + out_fd = out_file.fileno() + + try: + i = os.copy_file_range(in_fd, out_fd, 5) + except OSError as e: + # Handle the case in which Python was compiled + # in a system with the syscall but without support + # in the kernel. + if e.errno != errno.ENOSYS: + raise + self.skipTest(e) + else: + # The number of copied bytes can be less than + # the number of bytes originally requested. + self.assertIn(i, range(0, 6)); + + with open(TESTFN2, 'rb') as in_file: + self.assertEqual(in_file.read(), data[:i]) + + @unittest.skipUnless(hasattr(os, 'copy_file_range'), 'test needs os.copy_file_range()') + def test_copy_file_range_offset(self): + TESTFN4 = support.TESTFN + ".4" + data = b'0123456789' + bytes_to_copy = 6 + in_skip = 3 + out_seek = 5 + + create_file(support.TESTFN, data) + self.addCleanup(support.unlink, support.TESTFN) + + in_file = open(support.TESTFN, 'rb') + self.addCleanup(in_file.close) + in_fd = in_file.fileno() + + out_file = open(TESTFN4, 'w+b') + self.addCleanup(support.unlink, TESTFN4) + self.addCleanup(out_file.close) + out_fd = out_file.fileno() + + try: + i = os.copy_file_range(in_fd, out_fd, bytes_to_copy, + offset_src=in_skip, + offset_dst=out_seek) + except OSError as e: + # Handle the case in which Python was compiled + # in a system with the syscall but without support + # in the kernel. + if e.errno != errno.ENOSYS: + raise + self.skipTest(e) + else: + # The number of copied bytes can be less than + # the number of bytes originally requested. + self.assertIn(i, range(0, bytes_to_copy+1)); + + with open(TESTFN4, 'rb') as in_file: + read = in_file.read() + # seeked bytes (5) are zero'ed + self.assertEqual(read[:out_seek], b'\x00'*out_seek) + # 012 are skipped (in_skip) + # 345678 are copied in the file (in_skip + bytes_to_copy) + self.assertEqual(read[out_seek:], + data[in_skip:in_skip+i]) # Test attributes on return values from os.*stat* family. class StatAttributeTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-05-30-23-43-03.bpo-26826.NkRzjb.rst b/Misc/NEWS.d/next/Core and Builtins/2018-05-30-23-43-03.bpo-26826.NkRzjb.rst new file mode 100644 index 000000000000..27d7f82a672d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-05-30-23-43-03.bpo-26826.NkRzjb.rst @@ -0,0 +1 @@ +Expose :func:`copy_file_range` as a low level API in the :mod:`os` module. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 13f25460b4f6..22cb94761de5 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -5395,6 +5395,108 @@ os_pwritev(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #endif /* (defined(HAVE_PWRITEV) || defined (HAVE_PWRITEV2)) */ +#if defined(HAVE_COPY_FILE_RANGE) + +PyDoc_STRVAR(os_copy_file_range__doc__, +"copy_file_range($module, /, src, dst, count, offset_src=None,\n" +" offset_dst=None)\n" +"--\n" +"\n" +"Copy count bytes from one file descriptor to another.\n" +"\n" +" src\n" +" Source file descriptor.\n" +" dst\n" +" Destination file descriptor.\n" +" count\n" +" Number of bytes to copy.\n" +" offset_src\n" +" Starting offset in src.\n" +" offset_dst\n" +" Starting offset in dst.\n" +"\n" +"If offset_src is None, then src is read from the current position;\n" +"respectively for offset_dst."); + +#define OS_COPY_FILE_RANGE_METHODDEF \ + {"copy_file_range", (PyCFunction)(void(*)(void))os_copy_file_range, METH_FASTCALL|METH_KEYWORDS, os_copy_file_range__doc__}, + +static PyObject * +os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count, + PyObject *offset_src, PyObject *offset_dst); + +static PyObject * +os_copy_file_range(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"src", "dst", "count", "offset_src", "offset_dst", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "copy_file_range", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; + int src; + int dst; + Py_ssize_t count; + PyObject *offset_src = Py_None; + PyObject *offset_dst = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 5, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + src = _PyLong_AsInt(args[0]); + if (src == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + dst = _PyLong_AsInt(args[1]); + if (dst == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[3]) { + offset_src = args[3]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + offset_dst = args[4]; +skip_optional_pos: + return_value = os_copy_file_range_impl(module, src, dst, count, offset_src, offset_dst); + +exit: + return return_value; +} + +#endif /* defined(HAVE_COPY_FILE_RANGE) */ + #if defined(HAVE_MKFIFO) PyDoc_STRVAR(os_mkfifo__doc__, @@ -8460,6 +8562,10 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #define OS_PWRITEV_METHODDEF #endif /* !defined(OS_PWRITEV_METHODDEF) */ +#ifndef OS_COPY_FILE_RANGE_METHODDEF + #define OS_COPY_FILE_RANGE_METHODDEF +#endif /* !defined(OS_COPY_FILE_RANGE_METHODDEF) */ + #ifndef OS_MKFIFO_METHODDEF #define OS_MKFIFO_METHODDEF #endif /* !defined(OS_MKFIFO_METHODDEF) */ @@ -8635,4 +8741,4 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=855b81aafd05beed input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b3ae8afd275ea5cd input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 77a3700ab22e..8f6cffffcdfb 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -117,6 +117,10 @@ corresponding Unix manual entries for more information on calls."); #include #endif +#ifdef HAVE_COPY_FILE_RANGE +#include +#endif + #if !defined(CPU_ALLOC) && defined(HAVE_SCHED_SETAFFINITY) #undef HAVE_SCHED_SETAFFINITY #endif @@ -9455,8 +9459,74 @@ os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset, } #endif /* HAVE_PWRITEV */ +#ifdef HAVE_COPY_FILE_RANGE +/*[clinic input] + +os.copy_file_range + src: int + Source file descriptor. + dst: int + Destination file descriptor. + count: Py_ssize_t + Number of bytes to copy. + offset_src: object = None + Starting offset in src. + offset_dst: object = None + Starting offset in dst. + +Copy count bytes from one file descriptor to another. + +If offset_src is None, then src is read from the current position; +respectively for offset_dst. +[clinic start generated code]*/ + +static PyObject * +os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count, + PyObject *offset_src, PyObject *offset_dst) +/*[clinic end generated code: output=1a91713a1d99fc7a input=42fdce72681b25a9]*/ +{ + off_t offset_src_val, offset_dst_val; + off_t *p_offset_src = NULL; + off_t *p_offset_dst = NULL; + Py_ssize_t ret; + int async_err = 0; + /* The flags argument is provided to allow + * for future extensions and currently must be to 0. */ + int flags = 0; + + + if (count < 0) { + PyErr_SetString(PyExc_ValueError, "negative value for 'count' not allowed"); + return NULL; + } + + if (offset_src != Py_None) { + if (!Py_off_t_converter(offset_src, &offset_src_val)) { + return NULL; + } + p_offset_src = &offset_src_val; + } + if (offset_dst != Py_None) { + if (!Py_off_t_converter(offset_dst, &offset_dst_val)) { + return NULL; + } + p_offset_dst = &offset_dst_val; + } + do { + Py_BEGIN_ALLOW_THREADS + ret = copy_file_range(src, p_offset_src, dst, p_offset_dst, count, flags); + Py_END_ALLOW_THREADS + } while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + + if (ret < 0) { + return (!async_err) ? posix_error() : NULL; + } + + return PyLong_FromSsize_t(ret); +} +#endif /* HAVE_COPY_FILE_RANGE*/ #ifdef HAVE_MKFIFO /*[clinic input] @@ -13432,6 +13502,7 @@ static PyMethodDef posix_methods[] = { OS_POSIX_SPAWN_METHODDEF OS_POSIX_SPAWNP_METHODDEF OS_READLINK_METHODDEF + OS_COPY_FILE_RANGE_METHODDEF OS_RENAME_METHODDEF OS_REPLACE_METHODDEF OS_RMDIR_METHODDEF diff --git a/aclocal.m4 b/aclocal.m4 index 85f00dd5fac7..3d6b1a375fdc 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -12,9 +12,9 @@ # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) -dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -dnl serial 11 (pkg-config-0.29.1) -dnl +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 11 (pkg-config-0.29.1) + dnl Copyright ? 2004 Scott James Remnant . dnl Copyright ? 2012-2015 Dan Nicholson dnl @@ -288,5 +288,73 @@ AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + m4_include([m4/ax_c_float_words_bigendian.m4]) m4_include([m4/ax_check_openssl.m4]) diff --git a/configure b/configure index cacf9fc41894..b606fc808c17 100755 --- a/configure +++ b/configure @@ -785,7 +785,6 @@ infodir docdir oldincludedir includedir -runstatedir localstatedir sharedstatedir sysconfdir @@ -898,7 +897,6 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1151,15 +1149,6 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; - -runstatedir | --runstatedir | --runstatedi | --runstated \ - | --runstate | --runstat | --runsta | --runst | --runs \ - | --run | --ru | --r) - ac_prev=runstatedir ;; - -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ - | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ - | --run=* | --ru=* | --r=*) - runstatedir=$ac_optarg ;; - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1297,7 +1286,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir runstatedir + libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1450,7 +1439,6 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -11476,7 +11464,8 @@ fi # checks for library functions for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ - clock confstr ctermid dup3 execv explicit_bzero explicit_memset faccessat fchmod fchmodat fchown fchownat \ + clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \ + faccessat fchmod fchmodat fchown fchownat \ fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \ futimens futimes gai_strerror getentropy \ getgrgid_r getgrnam_r \ diff --git a/configure.ac b/configure.ac index 1190b37e9f9d..3d589ac25891 100644 --- a/configure.ac +++ b/configure.ac @@ -3520,7 +3520,8 @@ fi # checks for library functions AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ - clock confstr ctermid dup3 execv explicit_bzero explicit_memset faccessat fchmod fchmodat fchown fchownat \ + clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \ + faccessat fchmod fchmodat fchown fchownat \ fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \ futimens futimes gai_strerror getentropy \ getgrgid_r getgrnam_r \ diff --git a/pyconfig.h.in b/pyconfig.h.in index b9bb3ffa6f69..20cc901e473b 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -148,6 +148,9 @@ /* Define to 1 if you have the `copysign' function. */ #undef HAVE_COPYSIGN +/* Define to 1 if you have the `copy_file_range' function. */ +#undef HAVE_COPY_FILE_RANGE + /* Define to 1 if you have the header file. */ #undef HAVE_CRYPT_H From webhook-mailer at python.org Fri May 31 15:44:17 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Fri, 31 May 2019 19:44:17 -0000 Subject: [Python-checkins] bpo-33361: Fix bug with seeking in StreamRecoders (GH-8278) Message-ID: https://github.com/python/cpython/commit/a6ec1ce1ac05b1258931422e96eac215b6a05459 commit: a6ec1ce1ac05b1258931422e96eac215b6a05459 branch: master author: Ammar Askar committer: Berker Peksag date: 2019-05-31T22:44:00+03:00 summary: bpo-33361: Fix bug with seeking in StreamRecoders (GH-8278) files: A Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst M Lib/codecs.py M Lib/test/test_codecs.py diff --git a/Lib/codecs.py b/Lib/codecs.py index 884be0b2c02e..21c45a7d10a4 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -847,6 +847,12 @@ def reset(self): self.reader.reset() self.writer.reset() + def seek(self, offset, whence=0): + # Seeks must be propagated to both the readers and writers + # as they might need to reset their internal buffers. + self.reader.seek(offset, whence) + self.writer.seek(offset, whence) + def __getattr__(self, name, getattr=getattr): diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index f665febfc90a..47df88cedaaf 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3166,6 +3166,31 @@ def test_write(self): sr.write(text.encode('latin1')) self.assertEqual(bio.getvalue(), text.encode('utf-8')) + def test_seeking_read(self): + bio = io.BytesIO('line1\nline2\nline3\n'.encode('utf-16-le')) + sr = codecs.EncodedFile(bio, 'utf-8', 'utf-16-le') + + self.assertEqual(sr.readline(), b'line1\n') + sr.seek(0) + self.assertEqual(sr.readline(), b'line1\n') + self.assertEqual(sr.readline(), b'line2\n') + self.assertEqual(sr.readline(), b'line3\n') + self.assertEqual(sr.readline(), b'') + + def test_seeking_write(self): + bio = io.BytesIO('123456789\n'.encode('utf-16-le')) + sr = codecs.EncodedFile(bio, 'utf-8', 'utf-16-le') + + # Test that seek() only resets its internal buffer when offset + # and whence are zero. + sr.seek(2) + sr.write(b'\nabc\n') + self.assertEqual(sr.readline(), b'789\n') + sr.seek(0) + self.assertEqual(sr.readline(), b'1\n') + self.assertEqual(sr.readline(), b'abc\n') + self.assertEqual(sr.readline(), b'789\n') + @unittest.skipIf(_testcapi is None, 'need _testcapi module') class LocaleCodecTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst b/Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst new file mode 100644 index 000000000000..2b71095984a0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst @@ -0,0 +1,2 @@ +Fix a bug in :class:`codecs.StreamRecoder` where seeking might leave old data in a +buffer and break subsequent read calls. Patch by Ammar Askar. From webhook-mailer at python.org Fri May 31 16:03:29 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Fri, 31 May 2019 20:03:29 -0000 Subject: [Python-checkins] bpo-33361: Fix bug with seeking in StreamRecoders (GH-8278) Message-ID: https://github.com/python/cpython/commit/a6dc5d4e1c9ef465dc1f1ad95c382aa8e32b178f commit: a6dc5d4e1c9ef465dc1f1ad95c382aa8e32b178f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Berker Peksag date: 2019-05-31T23:03:22+03:00 summary: bpo-33361: Fix bug with seeking in StreamRecoders (GH-8278) (cherry picked from commit a6ec1ce1ac05b1258931422e96eac215b6a05459) Co-authored-by: Ammar Askar files: A Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst M Lib/codecs.py M Lib/test/test_codecs.py diff --git a/Lib/codecs.py b/Lib/codecs.py index 3cd78fc9f197..cfca5d38b079 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -847,6 +847,12 @@ def reset(self): self.reader.reset() self.writer.reset() + def seek(self, offset, whence=0): + # Seeks must be propagated to both the readers and writers + # as they might need to reset their internal buffers. + self.reader.seek(offset, whence) + self.writer.seek(offset, whence) + def __getattr__(self, name, getattr=getattr): diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index a3a2f6563a1f..248ef6fe07dd 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3318,6 +3318,31 @@ def test_write(self): sr.write(text.encode('latin1')) self.assertEqual(bio.getvalue(), text.encode('utf-8')) + def test_seeking_read(self): + bio = io.BytesIO('line1\nline2\nline3\n'.encode('utf-16-le')) + sr = codecs.EncodedFile(bio, 'utf-8', 'utf-16-le') + + self.assertEqual(sr.readline(), b'line1\n') + sr.seek(0) + self.assertEqual(sr.readline(), b'line1\n') + self.assertEqual(sr.readline(), b'line2\n') + self.assertEqual(sr.readline(), b'line3\n') + self.assertEqual(sr.readline(), b'') + + def test_seeking_write(self): + bio = io.BytesIO('123456789\n'.encode('utf-16-le')) + sr = codecs.EncodedFile(bio, 'utf-8', 'utf-16-le') + + # Test that seek() only resets its internal buffer when offset + # and whence are zero. + sr.seek(2) + sr.write(b'\nabc\n') + self.assertEqual(sr.readline(), b'789\n') + sr.seek(0) + self.assertEqual(sr.readline(), b'1\n') + self.assertEqual(sr.readline(), b'abc\n') + self.assertEqual(sr.readline(), b'789\n') + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst b/Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst new file mode 100644 index 000000000000..2b71095984a0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst @@ -0,0 +1,2 @@ +Fix a bug in :class:`codecs.StreamRecoder` where seeking might leave old data in a +buffer and break subsequent read calls. Patch by Ammar Askar. From webhook-mailer at python.org Fri May 31 16:19:02 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 31 May 2019 20:19:02 -0000 Subject: [Python-checkins] bpo-15115: Document deprecation of email.encoders in Python 3 (GH-5354) Message-ID: https://github.com/python/cpython/commit/a747c3a5edf21fa5670bc30f5e1d804de89ebf62 commit: a747c3a5edf21fa5670bc30f5e1d804de89ebf62 branch: master author: Cheryl Sabella committer: GitHub date: 2019-05-31T16:18:41-04:00 summary: bpo-15115: Document deprecation of email.encoders in Python 3 (GH-5354) files: M Doc/library/email.encoders.rst diff --git a/Doc/library/email.encoders.rst b/Doc/library/email.encoders.rst index 70bf61323c39..e4752a5edf84 100644 --- a/Doc/library/email.encoders.rst +++ b/Doc/library/email.encoders.rst @@ -12,6 +12,11 @@ This module is part of the legacy (``Compat32``) email API. In the new API the functionality is provided by the *cte* parameter of the :meth:`~email.message.EmailMessage.set_content` method. +This module is deprecated in Python 3. The functions provided here +should not be called explicitly since the :class:`~email.mime.text.MIMEText` +class sets the content type and CTE header using the *_subtype* and *_charset* +values passed during the instaniation of that class. + The remaining text in this section is the original documentation of the module. When creating :class:`~email.message.Message` objects from scratch, you often From webhook-mailer at python.org Fri May 31 16:26:10 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 31 May 2019 20:26:10 -0000 Subject: [Python-checkins] bpo-15115: Document deprecation of email.encoders in Python 3 (GH-5354) Message-ID: https://github.com/python/cpython/commit/464c1ec65af2c1c1d849d50d9726fa453804e70e commit: 464c1ec65af2c1c1d849d50d9726fa453804e70e branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-05-31T13:26:01-07:00 summary: bpo-15115: Document deprecation of email.encoders in Python 3 (GH-5354) (cherry picked from commit a747c3a5edf21fa5670bc30f5e1d804de89ebf62) Co-authored-by: Cheryl Sabella files: M Doc/library/email.encoders.rst diff --git a/Doc/library/email.encoders.rst b/Doc/library/email.encoders.rst index e24ac7b90d29..debd1c85d490 100644 --- a/Doc/library/email.encoders.rst +++ b/Doc/library/email.encoders.rst @@ -12,6 +12,11 @@ This module is part of the legacy (``Compat32``) email API. In the new API the functionality is provided by the *cte* parameter of the :meth:`~email.message.EmailMessage.set_content` method. +This module is deprecated in Python 3. The functions provided here +should not be called explicitly since the :class:`~email.mime.text.MIMEText` +class sets the content type and CTE header using the *_subtype* and *_charset* +values passed during the instaniation of that class. + The remaining text in this section is the original documentation of the module. When creating :class:`~email.message.Message` objects from scratch, you often From webhook-mailer at python.org Fri May 31 16:49:06 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Fri, 31 May 2019 20:49:06 -0000 Subject: [Python-checkins] bpo-37105: Add deprecated-remove information on stream doc (#13672) Message-ID: https://github.com/python/cpython/commit/ed9f3562b637a59b9000abbceee5ae369d35444d commit: ed9f3562b637a59b9000abbceee5ae369d35444d branch: master author: Emmanuel Arias committer: Andrew Svetlov date: 2019-05-31T23:48:57+03:00 summary: bpo-37105: Add deprecated-remove information on stream doc (#13672) * Add deprecated-remove information on stream doc According to the code on streams.py the functions: ``open_connection()``, ``start_server()``, ``open_unix_connection()``, ``start_unix_server()`` are deprecated. I infor that on documentation. files: M Doc/library/asyncio-stream.rst diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index e735b81f234d..28ca5d5f3396 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -67,6 +67,10 @@ and work with streams: The *ssl_handshake_timeout* parameter. + .. deprecated-removed:: 3.8 3.10 + + `open_connection()` is deprecated in favor of `connect()`. + .. coroutinefunction:: start_server(client_connected_cb, host=None, \ port=None, \*, loop=None, limit=None, \ family=socket.AF_UNSPEC, \ @@ -100,6 +104,10 @@ and work with streams: The *ssl_handshake_timeout* and *start_serving* parameters. + .. deprecated-removed:: 3.8 3.10 + + `start_server()` is deprecated if favor of `StreamServer()` + .. rubric:: Unix Sockets @@ -124,6 +132,10 @@ and work with streams: The *path* parameter can now be a :term:`path-like object` + .. deprecated-removed:: 3.8 3.10 + + `open_unix_connection()` is deprecated if favor of `connect_unix()`. + .. coroutinefunction:: start_unix_server(client_connected_cb, path=None, \ \*, loop=None, limit=None, sock=None, \ @@ -146,6 +158,10 @@ and work with streams: The *path* parameter can now be a :term:`path-like object`. + .. deprecated-removed:: 3.8 3.10 + + `start_unix_server()` is deprecated in favor of `UnixStreamServer()`. + --------- From webhook-mailer at python.org Fri May 31 18:39:43 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 31 May 2019 22:39:43 -0000 Subject: [Python-checkins] [2.7] bpo-12639: msilib.Directory.start_component() fails if *keyfile* is not None (GH-13688) Message-ID: https://github.com/python/cpython/commit/bfc1f605609218b9734d3cf3eab3531a2f4624e1 commit: bfc1f605609218b9734d3cf3eab3531a2f4624e1 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Steve Dower date: 2019-05-31T15:39:39-07:00 summary: [2.7] bpo-12639: msilib.Directory.start_component() fails if *keyfile* is not None (GH-13688) * bpo-12639: msilib.Directory.start_component() fails if *keyfile* is not None (GH-13688) msilib.Directory.start_component() was passing an extra argument to CAB.gen_id(). (cherry picked from commit c8d5bf6c3fa09b43f6a5ee779d493d251dbcc53c) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst M Lib/msilib/__init__.py M Lib/test/test_msilib.py diff --git a/Lib/msilib/__init__.py b/Lib/msilib/__init__.py index 0352b60c0b25..9520dfc021a0 100644 --- a/Lib/msilib/__init__.py +++ b/Lib/msilib/__init__.py @@ -276,7 +276,7 @@ def start_component(self, component = None, feature = None, flags = None, keyfil if Win64: flags |= 256 if keyfile: - keyid = self.cab.gen_id(self.absolute, keyfile) + keyid = self.cab.gen_id(keyfile) self.keyfiles[keyfile] = keyid else: keyid = None diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index a2f3943e2281..58f709d70dcd 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -43,6 +43,14 @@ def test_summaryinfo_getproperty_issue1104(self): sum_info = None unlink(db_path) + def test_directory_start_component_keyfile(self): + db, db_path = init_database() + feature = msilib.Feature(db, 0, 'Feature', 'A feature', 'Python') + cab = msilib.CAB('CAB') + dir = msilib.Directory(db, cab, None, TESTFN, 'TARGETDIR', + 'SourceDir', 0) + dir.start_component(None, feature, None, 'keyfile') + class Test_make_id(unittest.TestCase): #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx diff --git a/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst b/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst new file mode 100644 index 000000000000..aade9121b4bb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst @@ -0,0 +1,2 @@ +:meth:`msilib.Directory.start_component()` no longer fails if *keyfile* is +not ``None``. From webhook-mailer at python.org Fri May 31 20:16:31 2019 From: webhook-mailer at python.org (Berker Peksag) Date: Sat, 01 Jun 2019 00:16:31 -0000 Subject: [Python-checkins] bpo-12202: Properly check MsiSummaryInfoGetProperty() calls in msilib (GH-13711) Message-ID: https://github.com/python/cpython/commit/549e55a3086d04c13da9b6f33214f6399681292a commit: 549e55a3086d04c13da9b6f33214f6399681292a branch: master author: Zackery Spytz committer: Berker Peksag date: 2019-06-01T03:16:20+03:00 summary: bpo-12202: Properly check MsiSummaryInfoGetProperty() calls in msilib (GH-13711) files: A Misc/NEWS.d/next/Library/2019-05-31-15-53-34.bpo-12202.nobzc9.rst M Lib/test/test_msilib.py M PC/_msi.c diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index 265eaea59b5f..fa0be581613d 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -85,6 +85,7 @@ def test_get_property_vt_empty(self): def test_directory_start_component_keyfile(self): db, db_path = init_database() + self.addCleanup(unlink, db_path) self.addCleanup(db.Close) feature = msilib.Feature(db, 0, 'Feature', 'A feature', 'Python') cab = msilib.CAB('CAB') @@ -92,6 +93,14 @@ def test_directory_start_component_keyfile(self): 'SourceDir', 0) dir.start_component(None, feature, None, 'keyfile') + def test_getproperty_uninitialized_var(self): + db, db_path = init_database() + self.addCleanup(unlink, db_path) + self.addCleanup(db.Close) + si = db.GetSummaryInformation(0) + with self.assertRaises(msilib.MSIError): + si.GetProperty(-1) + class Test_make_id(unittest.TestCase): #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx diff --git a/Misc/NEWS.d/next/Library/2019-05-31-15-53-34.bpo-12202.nobzc9.rst b/Misc/NEWS.d/next/Library/2019-05-31-15-53-34.bpo-12202.nobzc9.rst new file mode 100644 index 000000000000..1e561970445f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-31-15-53-34.bpo-12202.nobzc9.rst @@ -0,0 +1,2 @@ +Fix the error handling in :meth:`msilib.SummaryInformation.GetProperty`. Patch +by Zackery Spytz. diff --git a/PC/_msi.c b/PC/_msi.c index 4c8df5b42b95..accbe7a72069 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -571,6 +571,9 @@ summary_getproperty(msiobj* si, PyObject *args) status = MsiSummaryInfoGetProperty(si->h, field, &type, &ival, &fval, sval, &ssize); } + if (status != ERROR_SUCCESS) { + return msierror(status); + } switch(type) { case VT_I2: From webhook-mailer at python.org Fri May 31 22:16:09 2019 From: webhook-mailer at python.org (Tim Peters) Date: Sat, 01 Jun 2019 02:16:09 -0000 Subject: [Python-checkins] bpo-37029: keep usable_arenas in sorted order without searching (#13612) Message-ID: https://github.com/python/cpython/commit/1c263e39c4ed28225a7dc8ca1f24953225ac48ca commit: 1c263e39c4ed28225a7dc8ca1f24953225ac48ca branch: master author: Tim Peters committer: GitHub date: 2019-05-31T21:16:04-05:00 summary: bpo-37029: keep usable_arenas in sorted order without searching (#13612) This adds a vector of "search fingers" so that usable_arenas can be kept in sorted order (by number of free pools) via constant-time operations instead of linear search. This should reduce worst-case time for reclaiming a great many objects from O(A**2) to O(A), where A is the number of arenas. See bpo-37029. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-28-17-02-46.bpo-37029.MxpgfJ.rst M Objects/obmalloc.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-28-17-02-46.bpo-37029.MxpgfJ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-17-02-46.bpo-37029.MxpgfJ.rst new file mode 100644 index 000000000000..c18f5d23eaa2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-17-02-46.bpo-37029.MxpgfJ.rst @@ -0,0 +1 @@ +Freeing a great many small objects could take time quadratic in the number of arenas, due to using linear search to keep ``obmalloc.c``'s list of usable arenas sorted by order of number of free memory pools. This is accomplished without search now, leaving the worst-case time linear in the number of arenas. For programs where this quite visibly matters (typically with more than 100 thousand small objects alive simultaneously), this can greatly reduce the time needed to release their memory. \ No newline at end of file diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index f54856dcfe71..fc7bef619946 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -918,6 +918,11 @@ static int running_on_valgrind = -1; #define POOL_SIZE SYSTEM_PAGE_SIZE /* must be 2^N */ #define POOL_SIZE_MASK SYSTEM_PAGE_SIZE_MASK +#define MAX_POOLS_IN_ARENA (ARENA_SIZE / POOL_SIZE) +#if MAX_POOLS_IN_ARENA * POOL_SIZE != ARENA_SIZE +# error "arena size not an exact multiple of pool size" +#endif + /* * -- End of tunable settings section -- */ @@ -1155,6 +1160,18 @@ usable_arenas Note that an arena_object associated with an arena all of whose pools are currently in use isn't on either list. + +Changed in Python 3.8: keeping usable_arenas sorted by number of free pools +used to be done by one-at-a-time linear search when an arena's number of +free pools changed. That could, overall, consume time quadratic in the +number of arenas. That didn't really matter when there were only a few +hundred arenas (typical!), but could be a timing disaster when there were +hundreds of thousands. See bpo-37029. + +Now we have a vector of "search fingers" to eliminate the need to search: +nfp2lasta[nfp] returns the last ("rightmost") arena in usable_arenas +with nfp free pools. This is NULL if and only if there is no arena with +nfp free pools in usable_arenas. */ /* Array of objects used to track chunks of memory (arenas). */ @@ -1172,6 +1189,9 @@ static struct arena_object* unused_arena_objects = NULL; */ static struct arena_object* usable_arenas = NULL; +/* nfp2lasta[nfp] is the last arena in usable_arenas with nfp free pools */ +static struct arena_object* nfp2lasta[MAX_POOLS_IN_ARENA + 1] = { NULL }; + /* How many arena_objects do we initially allocate? * 16 = can allocate 16 arenas = 16 * ARENA_SIZE = 4MB before growing the * `arenas` vector. @@ -1281,8 +1301,7 @@ new_arena(void) /* pool_address <- first pool-aligned address in the arena nfreepools <- number of whole pools that fit after alignment */ arenaobj->pool_address = (block*)arenaobj->address; - arenaobj->nfreepools = ARENA_SIZE / POOL_SIZE; - assert(POOL_SIZE * arenaobj->nfreepools == ARENA_SIZE); + arenaobj->nfreepools = MAX_POOLS_IN_ARENA; excess = (uint)(arenaobj->address & POOL_SIZE_MASK); if (excess != 0) { --arenaobj->nfreepools; @@ -1478,22 +1497,32 @@ pymalloc_alloc(void *ctx, void **ptr_p, size_t nbytes) } usable_arenas->nextarena = usable_arenas->prevarena = NULL; + assert(nfp2lasta[usable_arenas->nfreepools] == NULL); + nfp2lasta[usable_arenas->nfreepools] = usable_arenas; } assert(usable_arenas->address != 0); + /* This arena already had the smallest nfreepools value, so decreasing + * nfreepools doesn't change that, and we don't need to rearrange the + * usable_arenas list. However, if the arena becomes wholly allocated, + * we need to remove its arena_object from usable_arenas. + */ + assert(usable_arenas->nfreepools > 0); + if (nfp2lasta[usable_arenas->nfreepools] == usable_arenas) { + /* It's the last of this size, so there won't be any. */ + nfp2lasta[usable_arenas->nfreepools] = NULL; + } + /* If any free pools will remain, it will be the new smallest. */ + if (usable_arenas->nfreepools > 1) { + assert(nfp2lasta[usable_arenas->nfreepools - 1] == NULL); + nfp2lasta[usable_arenas->nfreepools - 1] = usable_arenas; + } + /* Try to get a cached free pool. */ pool = usable_arenas->freepools; if (pool != NULL) { /* Unlink from cached pools. */ usable_arenas->freepools = pool->nextpool; - - /* This arena already had the smallest nfreepools - * value, so decreasing nfreepools doesn't change - * that, and we don't need to rearrange the - * usable_arenas list. However, if the arena has - * become wholly allocated, we need to remove its - * arena_object from usable_arenas. - */ --usable_arenas->nfreepools; if (usable_arenas->nfreepools == 0) { /* Wholly allocated: remove. */ @@ -1501,7 +1530,6 @@ pymalloc_alloc(void *ctx, void **ptr_p, size_t nbytes) assert(usable_arenas->nextarena == NULL || usable_arenas->nextarena->prevarena == usable_arenas); - usable_arenas = usable_arenas->nextarena; if (usable_arenas != NULL) { usable_arenas->prevarena = NULL; @@ -1709,7 +1737,23 @@ pymalloc_free(void *ctx, void *p) ao = &arenas[pool->arenaindex]; pool->nextpool = ao->freepools; ao->freepools = pool; - nf = ++ao->nfreepools; + nf = ao->nfreepools; + /* If this is the rightmost arena with this number of free pools, + * nfp2lasta[nf] needs to change. Caution: if nf is 0, there + * are no arenas in usable_arenas with that value. + */ + struct arena_object* lastnf = nfp2lasta[nf]; + assert((nf == 0 && lastnf == NULL) || + (nf > 0 && + lastnf != NULL && + lastnf->nfreepools == nf && + (lastnf->nextarena == NULL || + nf < lastnf->nextarena->nfreepools))); + if (lastnf == ao) { /* it is the rightmost */ + struct arena_object* p = ao->prevarena; + nfp2lasta[nf] = (p != NULL && p->nfreepools == nf) ? p : NULL; + } + ao->nfreepools = ++nf; /* All the rest is arena management. We just freed * a pool, and there are 4 cases for arena mgmt: @@ -1777,6 +1821,9 @@ pymalloc_free(void *ctx, void *p) usable_arenas->prevarena = ao; usable_arenas = ao; assert(usable_arenas->address != 0); + if (nfp2lasta[1] == NULL) { + nfp2lasta[1] = ao; + } goto success; } @@ -1788,14 +1835,23 @@ pymalloc_free(void *ctx, void *p) * a few un-scientific tests, it seems like this * approach allowed a lot more memory to be freed. */ - if (ao->nextarena == NULL || - nf <= ao->nextarena->nfreepools) { + /* If this is the only arena with nf, record that. */ + if (nfp2lasta[nf] == NULL) { + nfp2lasta[nf] = ao; + } /* else the rightmost with nf doesn't change */ + /* If this was the rightmost of the old size, it remains in place. */ + if (ao == lastnf) { /* Case 4. Nothing to do. */ goto success; } - /* Case 3: We have to move the arena towards the end - * of the list, because it has more free pools than - * the arena to its right. + /* If ao were the only arena in the list, the last block would have + * gotten us out. + */ + assert(ao->nextarena != NULL); + + /* Case 3: We have to move the arena towards the end of the list, + * because it has more free pools than the arena to its right. It needs + * to move to follow lastnf. * First unlink ao from usable_arenas. */ if (ao->prevarena != NULL) { @@ -1809,24 +1865,13 @@ pymalloc_free(void *ctx, void *p) usable_arenas = ao->nextarena; } ao->nextarena->prevarena = ao->prevarena; - - /* Locate the new insertion point by iterating over - * the list, using our nextarena pointer. - */ - while (ao->nextarena != NULL && nf > ao->nextarena->nfreepools) { - ao->prevarena = ao->nextarena; - ao->nextarena = ao->nextarena->nextarena; - } - - /* Insert ao at this point. */ - assert(ao->nextarena == NULL || ao->prevarena == ao->nextarena->prevarena); - assert(ao->prevarena->nextarena == ao->nextarena); - - ao->prevarena->nextarena = ao; + /* And insert after lastnf. */ + ao->prevarena = lastnf; + ao->nextarena = lastnf->nextarena; if (ao->nextarena != NULL) { ao->nextarena->prevarena = ao; } - + lastnf->nextarena = ao; /* Verify that the swaps worked. */ assert(ao->nextarena == NULL || nf <= ao->nextarena->nfreepools); assert(ao->prevarena == NULL || nf > ao->prevarena->nfreepools); From webhook-mailer at python.org Fri May 31 23:16:53 2019 From: webhook-mailer at python.org (Eric Snow) Date: Sat, 01 Jun 2019 03:16:53 -0000 Subject: [Python-checkins] bpo-36818: Add PyInterpreterState.runtime field. (gh-13129) Message-ID: https://github.com/python/cpython/commit/396e0a8d9dc65453cb9d53500d0a620602656cfe commit: 396e0a8d9dc65453cb9d53500d0a620602656cfe branch: master author: Eric Snow committer: GitHub date: 2019-05-31T21:16:47-06:00 summary: bpo-36818: Add PyInterpreterState.runtime field. (gh-13129) https://bugs.python.org/issue36818 files: A Misc/NEWS.d/next/Core and Builtins/2019-05-06-14-46-48.bpo-36818.5UDDLj.rst M Include/cpython/pystate.h M Include/internal/pycore_object.h M Include/internal/pycore_pylifecycle.h M Include/internal/pycore_pystate.h M Modules/_threadmodule.c M Python/ceval.c M Python/import.c M Python/pylifecycle.c M Python/pystate.c M Python/sysmodule.c diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 94b0809cd4f0..74e7fc96bec9 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -110,9 +110,9 @@ struct _ts { * if the thread holds the last reference to the lock, decref'ing the * lock will delete the lock, and that may trigger arbitrary Python code * if there's a weakref, with a callback, to the lock. But by this time - * _PyRuntime.gilstate.tstate_current is already NULL, so only the simplest - * of C code can be allowed to run (in particular it must not be possible to - * release the GIL). + * _PyRuntimeState.gilstate.tstate_current is already NULL, so only the + * simplest of C code can be allowed to run (in particular it must not be + * possible to release the GIL). * So instead of holding the lock directly, the tstate holds a weakref to * the lock: that's the value of on_delete_data below. Decref'ing a * weakref is harmless. diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 81548f819198..1c5beb01f458 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -19,9 +19,10 @@ PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); * NB: While the object is tracked by the collector, it must be safe to call the * ob_traverse method. * - * Internal note: _PyRuntime.gc.generation0->_gc_prev doesn't have any bit flags - * because it's not object header. So we don't use _PyGCHead_PREV() and - * _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations. + * Internal note: _PyRuntimeState.gc.generation0->_gc_prev doesn't have + * any bit flags because it's not object header. So we don't use + * _PyGCHead_PREV() and _PyGCHead_SET_PREV() for it to avoid unnecessary + * bitwise operations. * * The PyObject_GC_Track() function is the public version of this macro. */ diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 8a692ea16495..e30341710c20 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -39,13 +39,10 @@ extern PyStatus _PyFaulthandler_Init(int enable); extern int _PyTraceMalloc_Init(int enable); extern PyObject * _PyBuiltin_Init(void); extern PyStatus _PySys_Create( - _PyRuntimeState *runtime, PyInterpreterState *interp, PyObject **sysmod_p); extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict); -extern int _PySys_InitMain( - _PyRuntimeState *runtime, - PyInterpreterState *interp); +extern int _PySys_InitMain(PyInterpreterState *interp); extern PyStatus _PyImport_Init(PyInterpreterState *interp); extern PyStatus _PyExc_Init(void); extern PyStatus _PyErr_Init(void); @@ -86,10 +83,7 @@ extern void _PyHash_Fini(void); extern int _PyTraceMalloc_Fini(void); extern void _PyWarnings_Fini(PyInterpreterState *interp); -extern void _PyGILState_Init( - _PyRuntimeState *runtime, - PyInterpreterState *interp, - PyThreadState *tstate); +extern void _PyGILState_Init(PyThreadState *tstate); extern void _PyGILState_Fini(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyGC_DumpShutdownStats(_PyRuntimeState *runtime); diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 3ab4009770c9..520a74b8a61f 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -19,6 +19,9 @@ extern "C" { #include "pycore_pymem.h" #include "pycore_warnings.h" +// forward +struct pyruntimestate; + /* ceval state */ @@ -68,6 +71,7 @@ struct _is { struct _is *next; struct _ts *tstate_head; + struct pyruntimestate *runtime; int64_t id; int64_t id_refcount; @@ -296,12 +300,8 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void); /* Other */ -PyAPI_FUNC(void) _PyThreadState_Init( - _PyRuntimeState *runtime, - PyThreadState *tstate); -PyAPI_FUNC(void) _PyThreadState_DeleteExcept( - _PyRuntimeState *runtime, - PyThreadState *tstate); +PyAPI_FUNC(void) _PyThreadState_Init(PyThreadState *tstate); +PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate); PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap( struct _gilstate_runtime_state *gilstate, diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-06-14-46-48.bpo-36818.5UDDLj.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-06-14-46-48.bpo-36818.5UDDLj.rst new file mode 100644 index 000000000000..bb6c56a628e9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-06-14-46-48.bpo-36818.5UDDLj.rst @@ -0,0 +1 @@ +Add PyInterpreterState.runtime (and use it). diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index d5e40ef999e3..099afd86d055 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -996,7 +996,7 @@ t_bootstrap(void *boot_raw) tstate = boot->tstate; tstate->thread_id = PyThread_get_thread_ident(); - _PyThreadState_Init(&_PyRuntime, tstate); + _PyThreadState_Init(tstate); PyEval_AcquireThread(tstate); tstate->interp->num_threads++; res = PyObject_Call(boot->func, boot->args, boot->keyw); diff --git a/Python/ceval.c b/Python/ceval.c index 71e6eb8ebcfd..f9ff4e09f17e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -217,8 +217,9 @@ _PyEval_FiniThreads(struct _ceval_runtime_state *ceval) } static inline void -exit_thread_if_finalizing(_PyRuntimeState *runtime, PyThreadState *tstate) +exit_thread_if_finalizing(PyThreadState *tstate) { + _PyRuntimeState *runtime = tstate->interp->runtime; /* _Py_Finalizing is protected by the GIL */ if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) { drop_gil(&runtime->ceval, tstate); @@ -236,7 +237,7 @@ PyEval_AcquireLock(void) Py_FatalError("PyEval_AcquireLock: current thread state is NULL"); } take_gil(ceval, tstate); - exit_thread_if_finalizing(runtime, tstate); + exit_thread_if_finalizing(tstate); } void @@ -257,14 +258,15 @@ PyEval_AcquireThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_AcquireThread: NULL new thread state"); } + assert(tstate->interp != NULL); - _PyRuntimeState *runtime = &_PyRuntime; + _PyRuntimeState *runtime = tstate->interp->runtime; struct _ceval_runtime_state *ceval = &runtime->ceval; /* Check someone has called PyEval_InitThreads() to create the lock */ assert(gil_created(&ceval->gil)); take_gil(ceval, tstate); - exit_thread_if_finalizing(runtime, tstate); + exit_thread_if_finalizing(tstate); if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("PyEval_AcquireThread: non-NULL old thread state"); } @@ -276,8 +278,9 @@ PyEval_ReleaseThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_ReleaseThread: NULL thread state"); } + assert(tstate->interp != NULL); - _PyRuntimeState *runtime = &_PyRuntime; + _PyRuntimeState *runtime = tstate->interp->runtime; PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); if (new_tstate != tstate) { Py_FatalError("PyEval_ReleaseThread: wrong thread state"); @@ -308,7 +311,7 @@ _PyEval_ReInitThreads(_PyRuntimeState *runtime) } /* Destroy all threads except the current one */ - _PyThreadState_DeleteExcept(runtime, current_tstate); + _PyThreadState_DeleteExcept(current_tstate); } /* This function is used to signal that async exceptions are waiting to be @@ -337,17 +340,18 @@ PyEval_SaveThread(void) void PyEval_RestoreThread(PyThreadState *tstate) { - _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; - if (tstate == NULL) { Py_FatalError("PyEval_RestoreThread: NULL tstate"); } + assert(tstate->interp != NULL); + + _PyRuntimeState *runtime = tstate->interp->runtime; + struct _ceval_runtime_state *ceval = &runtime->ceval; assert(gil_created(&ceval->gil)); int err = errno; take_gil(ceval, tstate); - exit_thread_if_finalizing(runtime, tstate); + exit_thread_if_finalizing(tstate); errno = err; _PyThreadState_Swap(&runtime->gilstate, tstate); @@ -1141,7 +1145,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) take_gil(ceval, tstate); /* Check if we should make a quick exit. */ - exit_thread_if_finalizing(runtime, tstate); + exit_thread_if_finalizing(tstate); if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("ceval: orphan tstate"); diff --git a/Python/import.c b/Python/import.c index ab7db6bc17f6..68d1f4003abc 100644 --- a/Python/import.c +++ b/Python/import.c @@ -541,7 +541,8 @@ PyImport_Cleanup(void) _PyGC_CollectNoFail(); /* Dump GC stats before it's too late, since it uses the warnings machinery. */ - _PyGC_DumpShutdownStats(&_PyRuntime); + _PyRuntimeState *runtime = interp->runtime; + _PyGC_DumpShutdownStats(runtime); /* Now, if there are any modules left alive, clear their globals to minimize potential leaks. All C extension modules actually end diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 10a28813faa8..6590ef8e9a27 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -545,7 +545,7 @@ pycore_create_interpreter(_PyRuntimeState *runtime, _PyEval_FiniThreads(&runtime->ceval); /* Auto-thread-state API */ - _PyGILState_Init(runtime, interp, tstate); + _PyGILState_Init(tstate); /* Create the GIL */ PyEval_InitThreads(); @@ -683,7 +683,7 @@ pyinit_config(_PyRuntimeState *runtime, } PyObject *sysmod; - status = _PySys_Create(runtime, interp, &sysmod); + status = _PySys_Create(interp, &sysmod); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -892,8 +892,9 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) * non-zero return code. */ static PyStatus -pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) +pyinit_main(PyInterpreterState *interp) { + _PyRuntimeState *runtime = interp->runtime; if (!runtime->core_initialized) { return _PyStatus_ERR("runtime core not initialized"); } @@ -919,7 +920,7 @@ pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) return _PyStatus_ERR("can't initialize time"); } - if (_PySys_InitMain(runtime, interp) < 0) { + if (_PySys_InitMain(interp) < 0) { return _PyStatus_ERR("can't finish initializing sys"); } @@ -999,7 +1000,7 @@ _Py_InitializeMain(void) _PyRuntimeState *runtime = &_PyRuntime; PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - return pyinit_main(runtime, interp); + return pyinit_main(interp); } @@ -1026,7 +1027,7 @@ Py_InitializeFromConfig(const PyConfig *config) config = &interp->config; if (config->_init_main) { - status = pyinit_main(runtime, interp); + status = pyinit_main(interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -1453,7 +1454,7 @@ new_interpreter(PyThreadState **tstate_p) } Py_INCREF(interp->sysdict); PyDict_SetItemString(interp->sysdict, "modules", modules); - if (_PySys_InitMain(runtime, interp) < 0) { + if (_PySys_InitMain(interp) < 0) { return _PyStatus_ERR("can't finish initializing sys"); } } diff --git a/Python/pystate.c b/Python/pystate.c index 833e0fb30dcb..2b7db0e48deb 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -39,7 +39,6 @@ extern "C" { /* Forward declarations */ static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate); -static void _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate); static PyStatus @@ -192,6 +191,8 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime) PyInterpreterState * PyInterpreterState_New(void) { + _PyRuntimeState *runtime = &_PyRuntime; + if (PySys_Audit("cpython.PyInterpreterState_New", NULL) < 0) { return NULL; } @@ -202,6 +203,9 @@ PyInterpreterState_New(void) } memset(interp, 0, sizeof(*interp)); + + interp->runtime = runtime; + interp->id_refcount = -1; interp->check_interval = 100; @@ -223,7 +227,6 @@ PyInterpreterState_New(void) #endif #endif - _PyRuntimeState *runtime = &_PyRuntime; struct pyinterpreters *interpreters = &runtime->interpreters; HEAD_LOCK(runtime); @@ -257,9 +260,11 @@ PyInterpreterState_New(void) } -static void -_PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) +void +PyInterpreterState_Clear(PyInterpreterState *interp) { + _PyRuntimeState *runtime = interp->runtime; + if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) { PyErr_Clear(); } @@ -297,31 +302,25 @@ _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) // objects have been cleaned up at the point. } -void -PyInterpreterState_Clear(PyInterpreterState *interp) -{ - _PyInterpreterState_Clear(&_PyRuntime, interp); -} - static void -zapthreads(_PyRuntimeState *runtime, PyInterpreterState *interp) +zapthreads(PyInterpreterState *interp) { - PyThreadState *p; + PyThreadState *ts; /* No need to lock the mutex here because this should only happen when the threads are all really dead (XXX famous last words). */ - while ((p = interp->tstate_head) != NULL) { - _PyThreadState_Delete(runtime, p); + while ((ts = interp->tstate_head) != NULL) { + PyThreadState_Delete(ts); } } -static void -_PyInterpreterState_Delete(_PyRuntimeState *runtime, - PyInterpreterState *interp) +void +PyInterpreterState_Delete(PyInterpreterState *interp) { + _PyRuntimeState *runtime = interp->runtime; struct pyinterpreters *interpreters = &runtime->interpreters; - zapthreads(runtime, interp); + zapthreads(interp); HEAD_LOCK(runtime); PyInterpreterState **p; for (p = &interpreters->head; ; p = &(*p)->next) { @@ -350,13 +349,6 @@ _PyInterpreterState_Delete(_PyRuntimeState *runtime, } -void -PyInterpreterState_Delete(PyInterpreterState *interp) -{ - _PyInterpreterState_Delete(&_PyRuntime, interp); -} - - /* * Delete all interpreter states except the main interpreter. If there * is a current interpreter state, it *must* be the main interpreter. @@ -383,8 +375,8 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime) continue; } - _PyInterpreterState_Clear(runtime, interp); // XXX must activate? - zapthreads(runtime, interp); + PyInterpreterState_Clear(interp); // XXX must activate? + zapthreads(interp); if (interp->id_mutex != NULL) { PyThread_free_lock(interp->id_mutex); } @@ -497,7 +489,8 @@ _PyInterpreterState_IDDecref(PyInterpreterState *interp) if (interp->id_mutex == NULL) { return; } - struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; + _PyRuntimeState *runtime = interp->runtime; + struct _gilstate_runtime_state *gilstate = &runtime->gilstate; PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK); assert(interp->id_refcount != 0); interp->id_refcount -= 1; @@ -559,7 +552,7 @@ threadstate_getframe(PyThreadState *self) static PyThreadState * new_threadstate(PyInterpreterState *interp, int init) { - _PyRuntimeState *runtime = &_PyRuntime; + _PyRuntimeState *runtime = interp->runtime; PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState)); if (tstate == NULL) { return NULL; @@ -615,7 +608,7 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->id = ++interp->tstate_next_unique_id; if (init) { - _PyThreadState_Init(runtime, tstate); + _PyThreadState_Init(tstate); } HEAD_LOCK(runtime); @@ -642,8 +635,9 @@ _PyThreadState_Prealloc(PyInterpreterState *interp) } void -_PyThreadState_Init(_PyRuntimeState *runtime, PyThreadState *tstate) +_PyThreadState_Init(PyThreadState *tstate) { + _PyRuntimeState *runtime = tstate->interp->runtime; _PyGILState_NoteThreadState(&runtime->gilstate, tstate); } @@ -808,7 +802,7 @@ PyThreadState_Clear(PyThreadState *tstate) /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */ static void -tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate) +tstate_delete_common(PyThreadState *tstate) { if (tstate == NULL) { Py_FatalError("PyThreadState_Delete: NULL tstate"); @@ -817,6 +811,7 @@ tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate) if (interp == NULL) { Py_FatalError("PyThreadState_Delete: NULL interp"); } + _PyRuntimeState *runtime = interp->runtime; HEAD_LOCK(runtime); if (tstate->prev) tstate->prev->next = tstate->next; @@ -832,9 +827,10 @@ tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate) } -static void -_PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate) +void +PyThreadState_Delete(PyThreadState *tstate) { + _PyRuntimeState *runtime = tstate->interp->runtime; struct _gilstate_runtime_state *gilstate = &runtime->gilstate; if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) { Py_FatalError("PyThreadState_Delete: tstate is still current"); @@ -844,14 +840,7 @@ _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate) { PyThread_tss_set(&gilstate->autoTSSkey, NULL); } - tstate_delete_common(runtime, tstate); -} - - -void -PyThreadState_Delete(PyThreadState *tstate) -{ - _PyThreadState_Delete(&_PyRuntime, tstate); + tstate_delete_common(tstate); } @@ -863,7 +852,7 @@ _PyThreadState_DeleteCurrent(_PyRuntimeState *runtime) if (tstate == NULL) Py_FatalError( "PyThreadState_DeleteCurrent: no current tstate"); - tstate_delete_common(runtime, tstate); + tstate_delete_common(tstate); if (gilstate->autoInterpreterState && PyThread_tss_get(&gilstate->autoTSSkey) == tstate) { @@ -888,9 +877,10 @@ PyThreadState_DeleteCurrent() * be kept in those other interpreteres. */ void -_PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate) +_PyThreadState_DeleteExcept(PyThreadState *tstate) { PyInterpreterState *interp = tstate->interp; + _PyRuntimeState *runtime = interp->runtime; PyThreadState *p, *next, *garbage; HEAD_LOCK(runtime); /* Remove all thread states, except tstate, from the linked list of @@ -1129,8 +1119,9 @@ _PyThread_CurrentFrames(void) static int PyThreadState_IsCurrent(PyThreadState *tstate) { + _PyRuntimeState *runtime = tstate->interp->runtime; /* Must be the tstate for this thread */ - struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; + struct _gilstate_runtime_state *gilstate = &runtime->gilstate; assert(_PyGILState_GetThisThreadState(gilstate) == tstate); return tstate == _PyRuntimeGILState_GetThreadState(gilstate); } @@ -1139,12 +1130,14 @@ PyThreadState_IsCurrent(PyThreadState *tstate) Py_Initialize/Py_FinalizeEx */ void -_PyGILState_Init(_PyRuntimeState *runtime, - PyInterpreterState *interp, PyThreadState *tstate) +_PyGILState_Init(PyThreadState *tstate) { /* must init with valid states */ - assert(interp != NULL); assert(tstate != NULL); + PyInterpreterState *interp = tstate->interp; + assert(interp != NULL); + _PyRuntimeState *runtime = interp->runtime; + assert(runtime != NULL); struct _gilstate_runtime_state *gilstate = &runtime->gilstate; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 12b1bd7711d5..97bff94d8b41 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -120,8 +120,9 @@ should_audit(void) if (!ts) { return 0; } - PyInterpreterState *is = ts ? ts->interp : NULL; - return _PyRuntime.audit_hook_head + PyInterpreterState *is = ts->interp; + _PyRuntimeState *runtime = is->runtime; + return runtime->audit_hook_head || (is && is->audit_hooks) || PyDTrace_AUDIT_ENABLED(); } @@ -280,8 +281,8 @@ void _PySys_ClearAuditHooks(void) { PySys_Audit("cpython._PySys_ClearAuditHooks", NULL); PyErr_Clear(); - _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n; - _PyRuntime.audit_hook_head = NULL; + _Py_AuditHookEntry *e = runtime->audit_hook_head, *n; + runtime->audit_hook_head = NULL; while (e) { n = e->next; PyMem_RawFree(e); @@ -292,6 +293,7 @@ void _PySys_ClearAuditHooks(void) { int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) { + _PyRuntimeState *runtime = &_PyRuntime; /* Invoke existing audit hooks to allow them an opportunity to abort. */ /* Cannot invoke hooks until we are initialized */ if (Py_IsInitialized()) { @@ -305,10 +307,10 @@ PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) } } - _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head; + _Py_AuditHookEntry *e = runtime->audit_hook_head; if (!e) { e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry)); - _PyRuntime.audit_hook_head = e; + runtime->audit_hook_head = e; } else { while (e->next) e = e->next; @@ -2413,8 +2415,9 @@ static PyStructSequence_Desc flags_desc = { }; static PyObject* -make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp) +make_flags(PyInterpreterState *interp) { + _PyRuntimeState *runtime = interp->runtime; int pos = 0; PyObject *seq; const PyPreConfig *preconfig = &runtime->preconfig; @@ -2633,8 +2636,7 @@ static struct PyModuleDef sysmodule = { } while (0) static PyStatus -_PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, - PyObject *sysdict) +_PySys_InitCore(PyInterpreterState *interp, PyObject *sysdict) { PyObject *version_info; int res; @@ -2728,7 +2730,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } /* Set flags to their default values (updated by _PySys_InitMain()) */ - SET_SYS_FROM_STRING("flags", make_flags(runtime, interp)); + SET_SYS_FROM_STRING("flags", make_flags(interp)); #if defined(MS_WINDOWS) /* getwindowsversion */ @@ -2849,7 +2851,7 @@ sys_create_xoptions_dict(const PyConfig *config) int -_PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) +_PySys_InitMain(PyInterpreterState *interp) { PyObject *sysdict = interp->sysdict; const PyConfig *config = &interp->config; @@ -2903,7 +2905,7 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) #undef SET_SYS_FROM_WSTR /* Set flags to their final values */ - SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(runtime, interp)); + SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(interp)); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; @@ -2970,8 +2972,7 @@ _PySys_SetPreliminaryStderr(PyObject *sysdict) /* Create sys module without all attributes: _PySys_InitMain() should be called later to add remaining attributes. */ PyStatus -_PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, - PyObject **sysmod_p) +_PySys_Create(PyInterpreterState *interp, PyObject **sysmod_p) { PyObject *modules = PyDict_New(); if (modules == NULL) { @@ -3000,7 +3001,7 @@ _PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, return status; } - status = _PySys_InitCore(runtime, interp, sysdict); + status = _PySys_InitCore(interp, sysdict); if (_PyStatus_EXCEPTION(status)) { return status; }
  • FormatPacked as .zipPacked as .tar.bz2